commit 70daeb214a0b15aa9acd9499e6bf5a1b4c158458 Author: Andres Resiri Date: Mon Aug 3 10:45:41 2026 -0400 Initial project commit for Coolify staging diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..363131f --- /dev/null +++ b/.dockerignore @@ -0,0 +1,8 @@ +node_modules +.next +.git +.env* +Dockerfile +.dockerignore +npm-debug.log* +*.log diff --git a/.env.development b/.env.development new file mode 100644 index 0000000..1f725a8 --- /dev/null +++ b/.env.development @@ -0,0 +1,17 @@ +# ═══════════════════════════════════════════════════════════════════════════════ +# meSEO — Development Environment +# ═══════════════════════════════════════════════════════════════════════════════ +# Safe to commit — no secrets here. +# Real secrets go in .env.local (which is gitignored). + +MESEO_ENV=development +NEXT_PUBLIC_APP_URL=http://localhost:3000 +NEXT_PUBLIC_API_URL=http://localhost:3000/api +NEXT_PUBLIC_COLLECT_ENDPOINT=/api/collect +NEXT_PUBLIC_TRACKER_SCRIPT_URL=/t.js + +# Dev feature flags — all enabled +FEATURE_AI_AVATAR=true +FEATURE_SITE_TAG=true +FEATURE_BILLING=true +DEBUG_MODE=true diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..5e833fb --- /dev/null +++ b/.env.example @@ -0,0 +1,147 @@ +# ═══════════════════════════════════════════════════════════════════════════════ +# meSEO — Environment Variables +# ═══════════════════════════════════════════════════════════════════════════════ +# +# Copy this file to .env.local and fill in your values. +# NEVER commit .env.local — it contains secrets. +# +# This .env.example is safe to commit (no real secrets). +# ═══════════════════════════════════════════════════════════════════════════════ + +# ── Environment ────────────────────────────────────────────────────────────── +# Options: development | staging | production +# If not set, auto-detected from NODE_ENV / VERCEL_ENV +MESEO_ENV=development + +# ── Database (required) ────────────────────────────────────────────────────── +# PostgreSQL connection string (Neon, Supabase, Railway, or local) +DATABASE_URL="postgresql://user:password@host:5432/dbname?sslmode=require" +# Optional direct connection used by Prisma migrations/schema checks. +DIRECT_URL="postgresql://user:password@host:5432/dbname?sslmode=require" + +# ── Auth — Clerk (required) ────────────────────────────────────────────────── +# Get these from https://dashboard.clerk.com → API Keys +NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY="pk_test_..." +CLERK_SECRET_KEY="sk_test_..." +NEXT_PUBLIC_CLERK_SIGN_IN_URL="/sign-in" +NEXT_PUBLIC_CLERK_SIGN_UP_URL="/sign-up" + +# ── App URLs ───────────────────────────────────────────────────────────────── +NEXT_PUBLIC_APP_URL="http://localhost:3000" +NEXT_PUBLIC_API_URL="http://localhost:3000/api" + +# ── meSEO Site Tag (tracking) ─────────────────────────────────────────────── +# Where the tracker script sends events. Default: /api/collect +NEXT_PUBLIC_COLLECT_ENDPOINT="/api/collect" +NEXT_PUBLIC_TRACKER_SCRIPT_URL="/t.js" + +# ── Coolify scheduled jobs ────────────────────────────────────────────────── +# Keep this secret only in Coolify. Cron endpoints require it as a Bearer token. +CRON_SECRET="replace-with-a-long-random-value" + +# ── AI Avatar (optional — Phase 2) ────────────────────────────────────────── +# AI Avatar — set ONE of these to enable real AI responses. +# If neither is set, the avatar uses smart mock responses. +# +# Option 1: Anthropic (Claude) — recommended +# Get from https://console.anthropic.com +ANTHROPIC_API_KEY="" +AI_MODEL_ID="claude-sonnet-4-20250514" +# +# Option 2: OpenAI (GPT) +# Get from https://platform.openai.com/api-keys +OPENAI_API_KEY="" +OPENAI_MODEL_ID="gpt-4o-mini" + +# ── AI Search Verification (Phase 11A) ──────────────────────────────────────── +# Perplexity AI — https://www.perplexity.ai/settings/api +PERPLEXITY_API_KEY="" +# Google Gemini — https://aistudio.google.com/app/apikey +GEMINI_API_KEY="" +# Brave Search API — https://api.search.brave.com/ +BRAVE_SEARCH_API_KEY="" +FIRECRAWL_API_KEY="" +BROWSERLESS_API_KEY="" +# Vercel Blob — add BLOB_READ_WRITE_TOKEN from Vercel project settings > Storage +BLOB_READ_WRITE_TOKEN="" + +# ── Google OAuth (for GSC, GA4, GBP) ───────────────────────────────────────── +# Create these at https://console.cloud.google.com → Credentials +GOOGLE_CLIENT_ID="" +GOOGLE_CLIENT_SECRET="" +GOOGLE_REDIRECT_URI="http://localhost:3000/api/auth/google/callback" +GOOGLE_API_KEY="" +GOOGLE_SEARCH_CX="" +GOOGLE_SEARCH_CONSOLE_KEY="" +GOOGLE_ANALYTICS_KEY="" +GOOGLE_BUSINESS_PROFILE_KEY="" + +# ── Google PageSpeed API Key (optional — works without it) ─────────────────── +GOOGLE_PAGESPEED_API_KEY="" + +# ── Bing Webmaster API Key ─────────────────────────────────────────────────── +BING_WEBMASTER_API_KEY="" + +# ── Optional image providers ──────────────────────────────────────────────── +UNSPLASH_ACCESS_KEY="" +PEXELS_API_KEY="" + +# ── DataForSEO (Rank Tracker + Keyword Research) ───────────────────────────── +# Powers daily SERP position checks, SERP feature detection (local pack, +# featured snippets, etc.), competitor positions, and keyword volume data. +# Sign up at https://app.dataforseo.com — your login is the account email. +# IMPORTANT: DATAFORSEO_PASSWORD is the API password from +# app.dataforseo.com/api-access — NOT your dashboard login password. +# When unset the rank tracker falls back to Google Custom Search (no SERP +# features, no competitor data) and keyword research falls back to AI estimates. +DATAFORSEO_LOGIN="" +DATAFORSEO_PASSWORD="" +# Soft daily cost cap for the /api/cron/rank-check job. Each Live SERP +# check is ~$0.002 — $5/day = ~2,500 keyword checks. Brands whose checks +# would push the running total past this cap are skipped for the day. +DATAFORSEO_DAILY_CAP_USD="5" + +# ── Stripe Billing (optional — Phase 2) ────────────────────────────────────── +STRIPE_SECRET_KEY="" +STRIPE_WEBHOOK_SECRET="" + +# ── Optional integrations used by server routes ───────────────────────────── +REDIS_URL="" +INTEGRATION_ENCRYPTION_KEY="" +ADMIN_SECRET="" +ADMIN_EMAILS="" +ALLOWED_EMAILS="" +SMTP_HOST="" +SMTP_PORT="587" +SMTP_USER="" +SMTP_PASS="" +SMTP_FROM="meSEO Reports " +RESEND_API_KEY="" +NANGO_SECRET_KEY="" +NEXT_PUBLIC_NANGO_PUBLIC_KEY="" +INNGEST_EVENT_KEY="" +INNGEST_SIGNING_KEY="" +TWILIO_ACCOUNT_SID="" +TWILIO_AUTH_TOKEN="" +TWILIO_PHONE_NUMBER="" +ALERT_EMAIL_RECIPIENT="" +CLIENT_SESSION_SECRET="" +BYPASS_PUBLIC_AUDIT_VERIFICATION="false" +SITE_TAG_SIDE_EFFECTS_ENABLED="true" +DEBUG_MIDDLEWARE="0" +DEBUG_CONFIDENCE="0" +PLATFORM_TELEMETRY_DISABLED="0" +COST_ALERT_TOTAL="200" +COST_ALERT_AI="50" +COST_ALERT_DB="50" +COST_ALERT_SERP="30" + +# ── Feature Flags ──────────────────────────────────────────────────────────── +# Set to "false" to disable a feature +FEATURE_AI_AVATAR=true +FEATURE_SITE_TAG=true +FEATURE_BILLING=true + +# ── Debug ──────────────────────────────────────────────────────────────────── +# Set to "true" to enable debug logging +DEBUG_MODE=false diff --git a/.env.production b/.env.production new file mode 100644 index 0000000..026d7ba --- /dev/null +++ b/.env.production @@ -0,0 +1,21 @@ +# ═══════════════════════════════════════════════════════════════════════════════ +# meSEO — Production Environment +# ═══════════════════════════════════════════════════════════════════════════════ +# Safe to commit — no secrets here. +# Real secrets are set in the hosting provider (Vercel, Railway, etc.). + +MESEO_ENV=production + +# These are overridden by the hosting provider's environment variables. +# Listed here as documentation of what's needed. + +# NEXT_PUBLIC_APP_URL=https://app.meseo.io +# NEXT_PUBLIC_API_URL=https://app.meseo.io/api +# NEXT_PUBLIC_COLLECT_ENDPOINT=https://app.meseo.io/api/collect +# NEXT_PUBLIC_TRACKER_SCRIPT_URL=https://app.meseo.io/t.js + +# Production feature flags +FEATURE_AI_AVATAR=true +FEATURE_SITE_TAG=true +FEATURE_BILLING=true +DEBUG_MODE=false diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..f1a94b0 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,41 @@ +# ci.yml +# +# Fast quality gate on every push to main and every pull request. +# Two checks: +# 1. check-raw-siteconversion — no direct SiteConversion queries +# that bypass countedConversionWhere (guards against count drift) +# 2. tsc --noEmit — no TypeScript type errors +# +# No deploy steps. Median run time: ~60 seconds. + +name: CI + +on: + push: + branches: [main] + pull_request: + branches: [main] + +jobs: + quality: + name: Quality gate + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + + - name: Install dependencies + run: npm ci + + - name: Conversion query guard + run: node scripts/check-raw-siteconversion.mjs + + - name: TypeScript typecheck + run: npx tsc --noEmit diff --git a/.github/workflows/deploy-lag-monitor.yml b/.github/workflows/deploy-lag-monitor.yml new file mode 100644 index 0000000..eff6f98 --- /dev/null +++ b/.github/workflows/deploy-lag-monitor.yml @@ -0,0 +1,174 @@ +# deploy-lag-monitor.yml +# +# Runs every hour. Compares the HEAD SHA of origin/main against the SHA +# of the current Vercel production deployment. If they differ AND the +# main HEAD commit is more than 1 hour old, opens a GitHub issue (or +# comments on an existing open one) to alert about a stalled deploy. +# +# Required repository secrets (Settings -> Secrets and variables -> Actions): +# VERCEL_TOKEN - Vercel personal access token (vercel.com -> Account Settings -> Tokens) +# VERCEL_PROJECT_ID - Vercel project ID (vercel.com -> Project Settings -> General, "Project ID" field) +# +# To test manually: Actions tab -> "Deploy Lag Monitor" -> "Run workflow" +# To silence a false alert: close the open "deploy-lag-alert" issue and +# the next run will not re-open until a new lag condition is detected. + +name: Deploy Lag Monitor + +on: + schedule: + - cron: "0 * * * *" # every hour at :00 + workflow_dispatch: # manual trigger for testing + +permissions: + issues: write + contents: read + +jobs: + check-deploy-lag: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 1 + + - name: Check deploy lag + uses: actions/github-script@v7 + env: + VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }} + VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }} + with: + script: | + const ALERT_LABEL = "deploy-lag-alert"; + const LAG_THRESHOLD_MS = 60 * 60 * 1000; // 1 hour + + // ── 1. Get HEAD SHA and commit timestamp from the checkout ────── + const { execSync } = require("child_process"); + const mainSha = execSync("git rev-parse HEAD").toString().trim(); + const mainTimestampStr = execSync("git log -1 --format=%cI HEAD").toString().trim(); + const mainCommitMsg = execSync("git log -1 --format=%s HEAD").toString().trim(); + const mainTimestamp = new Date(mainTimestampStr); + const commitAgeMs = Date.now() - mainTimestamp.getTime(); + + core.info(`main HEAD: ${mainSha} (${mainTimestampStr})`); + core.info(`Commit age: ${Math.round(commitAgeMs / 60000)} minutes`); + + // ── 2. Get current Vercel production deployment SHA ────────────── + let vercelSha = null; + let vercelDeployedAt = null; + let vercelDeployUrl = null; + + if (!process.env.VERCEL_TOKEN || !process.env.VERCEL_PROJECT_ID) { + core.warning("VERCEL_TOKEN or VERCEL_PROJECT_ID secret not set. Skipping check."); + return; + } + + try { + const res = await fetch( + `https://api.vercel.com/v6/deployments?projectId=${process.env.VERCEL_PROJECT_ID}&target=production&limit=1&state=READY`, + { headers: { Authorization: `Bearer ${process.env.VERCEL_TOKEN}` } } + ); + if (!res.ok) { + core.warning(`Vercel API returned ${res.status}. Skipping check.`); + return; + } + const data = await res.json(); + const latest = data.deployments?.[0]; + if (latest) { + vercelSha = latest.meta?.githubCommitSha ?? null; + vercelDeployedAt = latest.createdAt ? new Date(latest.createdAt).toISOString() : "unknown"; + vercelDeployUrl = latest.url ? `https://${latest.url}` : null; + } + } catch (err) { + core.warning(`Failed to fetch Vercel deployment: ${err.message}. Skipping check.`); + return; + } + + core.info(`Vercel production SHA: ${vercelSha ?? "unknown"}`); + + // ── 3. Decide if there is a lag condition ─────────────────────── + // Only alert when: + // a) SHAs differ (or Vercel SHA unknown), AND + // b) The main commit is older than LAG_THRESHOLD_MS + // (prevents noise on commits that just landed) + const shasMismatch = vercelSha !== mainSha; + const isOldEnough = commitAgeMs > LAG_THRESHOLD_MS; + + if (!shasMismatch) { + core.info("Production is up to date. No action needed."); + return; + } + if (!isOldEnough) { + const minutesOld = Math.round(commitAgeMs / 60000); + core.info(`SHA mismatch but commit is only ${minutesOld}m old. Within grace period.`); + return; + } + + core.warning(`Deploy lag detected! main=${mainSha} vercel=${vercelSha ?? "unknown"}`); + + // ── 4. Check for an existing open alert issue ─────────────────── + const { data: existingIssues } = await github.rest.issues.listForRepo({ + owner: context.repo.owner, + repo: context.repo.repo, + labels: ALERT_LABEL, + state: "open", + per_page: 1, + }); + + const hoursOld = Math.round(commitAgeMs / 3_600_000); + const body = [ + `**Production deploy lag detected.**`, + ``, + `| Field | Value |`, + `|---|---|`, + `| \`main\` HEAD SHA | \`${mainSha}\` |`, + `| Vercel production SHA | \`${vercelSha ?? "unknown"}\` |`, + `| Last commit | ${mainCommitMsg} |`, + `| Commit pushed | ${mainTimestampStr} (~${hoursOld}h ago) |`, + `| Vercel last deploy | ${vercelDeployedAt} |`, + `${vercelDeployUrl ? `| Deploy URL | ${vercelDeployUrl} |` : ""}`, + ``, + `**Next steps:**`, + `1. Open the Vercel dashboard and check for a failed or queued build.`, + `2. Check GitHub Settings -> Webhooks -> Vercel webhook -> Recent Deliveries for failures.`, + `3. If the webhook is healthy, trigger a manual redeploy from the Vercel dashboard.`, + ``, + `_Close this issue once the deploy is confirmed live._`, + ].join("\n"); + + if (existingIssues.length > 0) { + // Comment on the existing issue instead of opening a duplicate. + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: existingIssues[0].number, + body: `**Still lagging** (hourly check at ${new Date().toISOString()})\n\n${body}`, + }); + core.info(`Commented on existing alert issue #${existingIssues[0].number}`); + } else { + // Ensure the label exists before creating the issue. + try { + await github.rest.issues.getLabel({ + owner: context.repo.owner, + repo: context.repo.repo, + name: ALERT_LABEL, + }); + } catch { + await github.rest.issues.createLabel({ + owner: context.repo.owner, + repo: context.repo.repo, + name: ALERT_LABEL, + color: "e11d48", + description: "Auto-opened by deploy-lag-monitor workflow", + }); + } + const { data: newIssue } = await github.rest.issues.create({ + owner: context.repo.owner, + repo: context.repo.repo, + title: "[ALERT] Production deploy lag detected", + body, + labels: [ALERT_LABEL], + }); + core.warning(`Opened alert issue #${newIssue.number}: ${newIssue.html_url}`); + } diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..18815a8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +node_modules/ +.next/ +*.env +*.env.local +# Allow safe-to-commit env files (no secrets) +!.env.example +!.env.development +!.env.production +tsconfig.tsbuildinfo + +/src/generated/prisma +# cache bust + +meseo.zip +public/t.source.js diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 0000000..0363cb3 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1 @@ +node scripts/check-raw-siteconversion.mjs diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..521a9f7 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +legacy-peer-deps=true diff --git a/.vercel/README.txt b/.vercel/README.txt new file mode 100644 index 0000000..525d8ce --- /dev/null +++ b/.vercel/README.txt @@ -0,0 +1,11 @@ +> Why do I have a folder named ".vercel" in my project? +The ".vercel" folder is created when you link a directory to a Vercel project. + +> What does the "project.json" file contain? +The "project.json" file contains: +- The ID of the Vercel project that you linked ("projectId") +- The ID of the user or team your Vercel project is owned by ("orgId") + +> Should I commit the ".vercel" folder? +No, you should not share the ".vercel" folder with anyone. +Upon creation, it will be automatically added to your ".gitignore" file. diff --git a/.vercel/project.json b/.vercel/project.json new file mode 100644 index 0000000..df4b8e4 --- /dev/null +++ b/.vercel/project.json @@ -0,0 +1 @@ +{"projectId":"prj_jHaksMHPCD7BfGzwPc3ykcRUky8W","orgId":"team_56M1v6AbT62mYSPCZzR2LtQT","projectName":"meseo"} \ No newline at end of file diff --git a/7.6.0 b/7.6.0 new file mode 100644 index 0000000..e69de29 diff --git a/AUDIT-REPORT.md b/AUDIT-REPORT.md new file mode 100644 index 0000000..a7a4065 --- /dev/null +++ b/AUDIT-REPORT.md @@ -0,0 +1,104 @@ +# Sidebar Page Audit Report + +_Audit performed against sidebar navigation (`src/components/sidebar.tsx`) on the feature branch `claude/general-session-mMtpD`. 23 routes checked._ + +## Summary + +- **Total pages checked:** 23 +- ✅ **Working with proper empty states:** 14 +- ⚠️ **Works but missing empty state / partial gating:** 7 +- ❌ **Broken or will crash:** 0 +- 🚫 **Page file missing:** 0 +- 🪹 **Stub pages (route exists but no real content):** 2 + +--- + +## Detailed Findings + +### ✅ Working Pages (14) + +| Route | Path | Notes | +|---|---|---| +| `/brands-hub` | `src/app/brands-hub/page.tsx` | (skipped per instructions — already working) | +| `/signals` | `src/app/signals/page.tsx` | Full error handling, "No signals for this filter" empty state, task creation error feedback | +| `/website-upload` | `src/app/website-upload/page.tsx` | Form validation gates submission, orgId check, success state with next steps | +| `/site-tag` | `src/app/site-tag/page.tsx` | Excellent setup CTA empty state ("Generate meSEO Site Tag"), safe null checks, loading spinner | +| `/dashboard` | `src/app/dashboard/page.tsx` | Full state reset on brand change, per-source connection gating, 5 distinct KPI card states, "Connect GSC" / "Awaiting Data" / connected states for Search Performance | +| `/conversion-intelligence` | `src/app/conversion-intelligence/page.tsx` | State machine with 6 explicit states: loading, not_connected, awaiting_sync, connected_empty, connected, error. Retry button on error state | +| `/competitors` | `src/app/competitors/page.tsx` | Uses `hasData()` helper + SourceEmptyState, graceful filter-empty state, safe network error handling | +| `/technical-audit` | `src/app/technical-audit/page.tsx` | Robust — 3-minute polling timeout, specific 429/403/504 error messages, 3 distinct states (no audit / running / failed), limited coverage warning | +| `/site-performance-audit` | `src/app/site-performance-audit/page.tsx` | "No Audit Yet" / "Running" / "Failed" states, network error caught | +| `/dead-pages` | `src/app/dead-pages/page.tsx` | Uses `getSourceStatus("dead_pages")` integration check, comprehensive empty state, "Select row" fallback | +| `/page-studio` | `src/app/page-studio/page.tsx` | Client-side canvas builder with no API calls, onboarding flow when no blocks, toast feedback for all actions | +| `/recommendations` | `src/app/recommendations/page.tsx` | Uses `hasData()` + SourceEmptyState, "No Issues Found" success state when `counts.total === 0` | +| `/execution-hub` | `src/app/execution-hub/page.tsx` | Brand guard on useEffect, try/catch on task operations, optimistic UI with rollback, "No tasks match filters" empty state | +| `/page-launch-tracker` | `src/app/page-launch-tracker/page.tsx` | SourceEmptyState when no launches, action link to Execution Hub | +| `/settings` | `src/app/settings/page.tsx` | Static form with mock team data, Save feedback, no API dependencies | +| `/pricing` | `src/app/pricing/page.tsx` | Graceful API fallback to `FALLBACK_PLANS`, loading spinner, always renders content | + +--- + +### ⚠️ Missing Empty States / Partial Gating (7) + +| Route | Path | Issue | +|---|---|---| +| `/ai-strategist` | `src/app/ai-strategist/page.tsx` | Has rich empty state for no-analysis case, but **no pre-flight integration check** — calls `/api/analysis` unconditionally. Relies on backend to return partial data. A brand new brand with no sources connected will still see the "Generate Analysis" button but the generated analysis will be mostly empty. Recommendation: add an integration-status banner before the "Generate" CTA. | +| `/integrations` | `src/app/integrations/page.tsx` | Shows all integrations as cards regardless of state, but **no welcoming onboarding banner** when zero integrations are connected. `loadIntegrationStatus()` silently swallows errors. New users may not know where to start. Recommendation: add "Get started — connect GA4 or GSC" banner at top when `connectedCount === 0`. | +| `/content-brief` | `src/app/content-brief/page.tsx` | **Silent fallback to `MOCK_BLOCKS`** when API fails or returns empty. No visual indicator distinguishing mock content from real saved briefs. Users may edit mock data thinking it's real. Recommendation: add banner "No saved briefs yet — this is a template" or hide editor until user creates a brief. | +| `/llmo-content-brief` | `src/app/llmo-content-brief/page.tsx` | **Identical issue** to `/content-brief` — falls back to mock data silently with no indicator. | +| `/report-studio` | `src/app/report-studio/page.tsx` | **No error handling** on report builds or data source toggles. **No empty state** when zero sections selected. Disabled-source check exists on toggles but no warning when building with unconnected sources. Build button active even with 0 sections. Recommendation: disable build button until at least 1 section + 1 connected source is selected. | +| `/execution-hub` | `src/app/execution-hub/page.tsx` | Otherwise working, but **no pre-flight integration gating** — users can create tasks for a brand that has zero integrations connected. Not strictly broken since tasks are brand-agnostic, but could be confusing. (Minor — flagging for visibility.) | +| `/technical-audit` | `src/app/technical-audit/page.tsx` | Otherwise working, but **no `getSourceStatus` integration check** before fetching. Dead-pages page does this correctly and could serve as a pattern. (Minor — flagging for consistency.) | + +--- + +### ❌ Broken Pages (0) + +_None found. No page will crash, render a blank white screen, or show raw errors._ + +--- + +### 🚫 Missing Pages (0) + +_All 23 sidebar routes have a corresponding `page.tsx` file. No broken links._ + +--- + +### 🪹 Stub Pages (2) + +These pages exist but are essentially **placeholder stubs** that render `SourceEmptyState` regardless of integration status — including when the source is connected. They never display real data. + +| Route | Path | Issue | +|---|---|---| +| `/ai-visibility` | `src/app/ai-visibility/page.tsx` | Checks `if (!status \|\| status.status !== "connected")` → renders `SourceEmptyState`. **But the "connected" branch also returns the same `SourceEmptyState`** — no actual implementation. Page is a stub. | +| `/local-geo` | `src/app/local-geo/page.tsx` | **Identical stub** to `/ai-visibility`. Always renders empty state, no real content regardless of connection status. | + +**Recommendation:** Either (a) implement the actual data view for the "connected" branch, or (b) update the empty state copy to be honest ("AI Visibility tracking launches soon — we'll notify you when it's ready") so users understand this is a coming-soon feature rather than a broken page. + +--- + +## Critical Launch-Blocking Issues + +**None.** No page will crash or show a raw error. However, the following are **UX launch risks** worth addressing: + +### Priority 1 (fix before launch) +1. **`/ai-visibility` and `/local-geo` stubs** — users will click these from the sidebar and get the same empty state whether or not they have integrations. Either implement or mark as "Coming Soon". +2. **`/content-brief` and `/llmo-content-brief` mock fallback** — users may edit mock content thinking it's saved. Add a visible "Template / Not saved" indicator. +3. **`/report-studio` no-op build button** — add validation so users can't build empty reports. + +### Priority 2 (post-launch polish) +1. `/integrations` welcome banner for zero-connected state +2. `/ai-strategist` pre-flight integration check +3. `/technical-audit` and `/execution-hub` source-status gating for consistency + +--- + +## Audit Coverage + +✅ All 23 sidebar routes checked +✅ Page files existence verified +✅ Error handling traced (try/catch, null checks, response.ok) +✅ Empty state handling verified for zero-data scenarios +✅ Integration gating reviewed +✅ Import resolution confirmed +✅ New-brand scenario considered (brand with no connected sources, no audits, no tasks) diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..55b8328 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,45 @@ +FROM node:22-slim AS deps + +WORKDIR /app +ENV HUSKY=0 +RUN apt-get update \ + && apt-get install -y --no-install-recommends openssl ca-certificates \ + && rm -rf /var/lib/apt/lists/* + +COPY package.json package-lock.json ./ +COPY prisma ./prisma +RUN npm ci + +FROM node:22-slim AS build + +WORKDIR /app +RUN apt-get update \ + && apt-get install -y --no-install-recommends openssl ca-certificates \ + && rm -rf /var/lib/apt/lists/* + +COPY --from=deps /app/node_modules ./node_modules +COPY . . + +RUN npx prisma generate +RUN npm run build + +FROM node:22-slim AS runner + +WORKDIR /app +ENV NODE_ENV=production +ENV PORT=3000 +ENV HOSTNAME=0.0.0.0 + +RUN apt-get update \ + && apt-get install -y --no-install-recommends openssl ca-certificates \ + && rm -rf /var/lib/apt/lists/* + +COPY --from=build /app/public ./public +COPY --from=build /app/.next/standalone ./ +COPY --from=build /app/.next/static ./.next/static +COPY --from=build /app/prisma ./prisma +COPY --from=build /app/node_modules/.prisma ./node_modules/.prisma +COPY --from=build /app/node_modules/@prisma/client ./node_modules/@prisma/client + +EXPOSE 3000 +CMD ["node", "server.js"] diff --git a/README.md b/README.md new file mode 100644 index 0000000..d3af930 --- /dev/null +++ b/README.md @@ -0,0 +1,203 @@ +# meSEO — AI-Powered SEO & LLMO Intelligence Platform + +meSEO is a comprehensive SEO and Large Language Model Optimization (LLMO) intelligence platform with first-party cookieless tracking, universal form/booking plugin detection, and AI-powered content optimization. + +**Production:** [app.meseoapp.com](https://app.meseoapp.com) +**Admin Portal:** [admin.meseoapp.com](https://admin.meseoapp.com) + +## Tech Stack + +- **Frontend:** Next.js 14 (App Router) + TypeScript + Tailwind CSS +- **Database:** Neon PostgreSQL + Prisma ORM +- **Auth:** Clerk (organizations + role-based access) +- **AI:** Anthropic Claude + OpenAI +- **SERP Data:** DataForSEO +- **Hosting:** Vercel +- **Analytics Sources:** Google Analytics 4 (GA4), Google Search Console (GSC), First-Party Site Tag + +## Architecture + +``` +app.meseoapp.com → Main application (brand owners, agencies) +admin.meseoapp.com → Admin portal (superadmin operations center) +/api/collect → Site Tag event ingestion endpoint +/api/cron/* → Scheduled jobs (data retention, platform snapshots) +``` + +Same Vercel project, hostname-based middleware routing. + +## Core Features + +### Site Tag (First-Party Tracking) +- **Cookieless** — zero `document.cookie` usage, sessionStorage/localStorage only +- **Universal form detection** — native `
`, `[role="form"]`, container-based, standalone inputs +- **Booking plugin detection** — Amelia (Elementor Step Booking variant), Calendly, NexHealth, Acuity, JotForm, Typeform, WPForms, Gravity Forms, Contact Form 7, HubSpot +- **Chat widget detection** — DearDoc, Birdeye, Podium, Weave +- **Device + geolocation** — User-Agent parsing (device/browser/OS) + Vercel geo headers (country, city, region) stored on session start +- **21 healthcare iframe providers** detected (PatientPop, Tebra, NexHealth, MyChart, Epic, Cerner, athenahealth, Doctible, etc.) +- **gtag/dataLayer interception** — captures GA4 custom events (make_an_appointment, contact_us, etc.) with pattern-based fallback matching +- **Form & Booking Funnel** — Intent → Started → Submitted → Confirmed with per-stage drop-off +- **Conversion taxonomy** — Tier 1 (hard: appointment_booked, form_submitted, phone_call, purchase) vs Tier 2 (soft: appointment_attempted, form_started, appointment_intent) +- **30-second dedup window** with source-authority ranking and tier-upgrade +- **HIPAA-aware** — never captures form field values, strips query params in healthcare mode +- **3,400+ lines** of tracking intelligence in `public/t.js` + +### Intelligence Pages +- **Dashboard** — All Traffic / Organic toggle, KPI cards, tail cards +- **Site Tag Analytics** — Live polling, event breakdown, form funnel, detected plugins, data confidence gauge +- **AI Visibility** — LLM citation checking across ChatGPT, Gemini, Perplexity +- **Keyword Research** — SERP analysis + keyword opportunities +- **Rank Tracker** — Daily position monitoring +- **Competitor Intel** — Keyword battles, word count analysis, SERP overlap +- **Content Intel** — Content health scoring, accordion tiles +- **Backlinks** — Backlink profile analysis +- **Industry Intel** — 10-vertical regulatory map, visitor geography, seasonal correlations +- **Technical Audit** — 200-page crawl with incremental progress +- **Core Web Intelligence** — Multi-page CWV with competitor comparison +- **Schema Generator** — JSON-LD generation with validation +- **Broken Links** — Site-wide broken link detection +- **Signals Center** — Persistent dismiss with 14-day TTL, revenue impact badges + +### Content & Reports +- **SEO Content Brief** — AI-generated briefs with inline schema +- **LLMO Content Brief** — LLM optimization briefs +- **Writing Assistant** — AI-powered content rewriting +- **Page Studio** — Page creation and optimization +- **Topic Map** — Content cluster visualization +- **Report Studio** — Automated report generation + +### Settings +- **Profile** — Editable name, avatar upload via Clerk, IANA timezone dropdown, change password +- **Billing** — Real plan data, trial countdown, change plan / manage billing links +- **Notifications** — 5 email preference toggles with optimistic update +- **Team** — Per-member brand access, seat count display, role management, invite with seat limit enforcement +- **Usage** — 8 metrics with progress bars, color-coded thresholds, unlimited tier gradient bars + +### Admin Portal (admin.meseoapp.com) +- **Dashboard** — Platform KPIs with Site Tag / GA4 / GSC data source separation, brand filter, reconciliation +- **Users** — Search, role filter, detail drawer, suspend/delete/brand-grant actions +- **Brands** — Health ring, integration status dots, detail drawer with radar chart +- **Session Explorer** — Per-session interaction timeline with device/location, repeat interaction highlighting +- **AI Monitor** — Guardrail scoring, severity-colored feed, cost-by-brand breakdown +- **Platform Analytics** — Brand Strength Radar (8 dimensions), Engagement (DAU/WAU/MAU + cohort retention), Data Moat, Growth & Retention (activation funnel + churn) +- **Cost Center** — All vendor costs (Anthropic, OpenAI, Neon, Vercel, Clerk, DataForSEO, Resend) with live DataForSEO balance +- **Compliance** — GDPR Article 17 deletion, Article 15 export, data retention cron, healthcare mode +- **Data Export** — 4 due-diligence CSV exports (platform metrics, anonymized users, brands, growth time-series) +- **Health Monitor** — DB row counts, cron status, recent errors +- **Activity Feed** — Real-time 10s polling with connected timeline +- **Conversion Funnel** — 5-stage funnel (Visit → Engaged → Intent → Started → Converted) with by-source and by-entry-page breakdowns +- **Client Portal** — White-label setup, custom domain config, per-client page access controls, branded invite emails + +### Monetization +- **5 pricing tiers:** Growth ($249), Professional ($479), Agency ($1,299), Agency Pro ($2,499), Enterprise (Custom) +- **Feature gates** — `` component + `useFeatureGate` hook + server-side `requirePlanFeature` +- **Seat limits** — 2/5/10/25/unlimited per plan with enforcement at invite time +- **Upgrade modal** — Auto-opens on 403 upgrade_required via `useUpgradeAwareFetch` +- **Sidebar lock icons** — 15 protected routes mapped to feature keys +- **Superadmin bypass** — all gates skip for superadmin role + +### Security & Access Control +- **BrandMembership** — Explicit brand access grants (not implicit org-wide) +- **`verifyBrandAccess`** — Per-request brand authorization with audit logging +- **`NoBrandAccessGuard`** — Redirects users with 0 brands to /no-access +- **Superadmin** — Clerk publicMetadata.role via customized session token + +### Conversion Accuracy +- **Conversion taxonomy** — canonical types with Tier 1/2 classification +- **Conversion resolver** — 30s dedup window, source-authority ranking, tier-upgrade in-place +- **GA4 reconciliation** — overlapping-window comparison with daily rates +- **Data confidence gauge** — 6-factor weighted score (session match, conversion capture, freshness, dedup quality, event coverage, plugin detection) +- **Deduped KPIs** — COUNT(DISTINCT session+page+type), not raw row count + +## Environment Variables + +``` +# Database +DATABASE_URL= # Neon PostgreSQL pooler endpoint + +# Auth +NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY= +CLERK_SECRET_KEY= + +# AI +ANTHROPIC_API_KEY= +OPENAI_API_KEY= + +# SERP Data +DATAFORSEO_LOGIN= +DATAFORSEO_PASSWORD= + +# Google +GOOGLE_CLIENT_ID= +GOOGLE_CLIENT_SECRET= +GA4_PROPERTY_ID= + +# App +NEXT_PUBLIC_APP_URL=https://app.meseoapp.com +``` + +## Clerk Session Token + +In Clerk Dashboard → Configure → Sessions → Customize session token: + +```json +{ + "metadata": "{{user.public_metadata}}" +} +``` + +Required for superadmin role detection in middleware. + +## Cron Jobs + +| Schedule | Endpoint | Purpose | +|----------|----------|---------| +| Daily 03:00 UTC | `/api/cron/data-retention` | Purge data older than retention period (395 days default) | +| Monthly 1st 01:00 UTC | `/api/cron/platform-snapshot` | Capture platform metrics snapshot | + +## Key Architectural Decisions + +- **Same Vercel project** for app + admin, hostname-based middleware routing +- **Cookieless tracking** via sessionStorage/localStorage — no cookie consent needed +- **Conversion taxonomy** with Tier 1 (hard) vs Tier 2 (soft) — only Tier 1 counts in KPIs +- **gtag/dataLayer interception** as primary conversion source for GA4-instrumented sites +- **30-second dedup window** with tier-upgrade for conversion resolver +- **DataForSEO** never mentioned in user-facing UI — labeled "SERP & Keyword Lookups" +- **Site Tag** at 3,400+ lines with universal plugin detection (10 booking + 4 chat providers) +- **PlatformEvent + AiInteraction** telemetry with fire-and-forget pattern + +## Site Tag Detection Patterns + +The Site Tag (`public/t.js`) detects third-party plugins and integrations running on a brand's site and fires `plugin_detected` events. Detection patterns live in the unminified source file, which is gitignored: + +**Detection source:** `public/t.source.js` +Three registries: +- `BOOKING_PLUGINS` (~line 5832) -- appointment and form plugins +- `CHAT_WIDGETS` (~line 6416) -- live chat and messaging widgets +- `ANALYTICS_PLUGINS` (~line 6659) -- analytics, pixels, SEO, CMS, e-commerce, CRM, and more (~47 entries) + +**Enrichment metadata:** `src/lib/site-tag/integration-signatures.ts` +Maps each `plugin_key` to vendor name, category, and description. Consumed by the backfill route and the Integrations tab API. + +**Adding a new detection rule:** +1. Add an entry to the appropriate registry in `public/t.source.js` +2. Add a matching entry in `ENRICHMENT_REGISTRY` in `integration-signatures.ts` +3. Build the tag: `cp public/t.source.js public/t.js && npm run build:site-tag` +4. Bump `TAG_VERSION` in `public/t.js` to today's date (`YYYY.MM.DD`) + +See `docs/phase-30-site-tag-detection-expansion.md` for the full pattern guide, detection strategy examples, and performance constraints. + +## Development + +```bash +npm install +npx prisma db push +npx prisma generate +npm run dev +``` + +Local admin portal: `admin.localhost:3000` + +## License + +Proprietary — All rights reserved. diff --git a/coolify-cron.md b/coolify-cron.md new file mode 100644 index 0000000..3a842bb --- /dev/null +++ b/coolify-cron.md @@ -0,0 +1,23 @@ +# Coolify scheduled tasks + +The Vercel cron configuration in `vercel.json` is not executed automatically by Coolify. +Create one scheduled task per entry in that file. Each task must send: + +```text +Authorization: Bearer $CRON_SECRET +``` + +Use the exact route and schedule from `vercel.json`. Example command: + +```bash +curl --fail --max-time 900 \ + -H "Authorization: Bearer ${CRON_SECRET}" \ + https://app2.meseoapp.com/api/cron/data-retention +``` + +Set `CRON_SECRET` as a Coolify secret/environment variable. Do not commit its value. +Do not allow overlapping runs of the same task, especially for rollups, audits, rank checks, +and integration sync. + +Run `npm run db:push` separately and deliberately when a schema change is approved. +It is intentionally not part of `npm run build`. diff --git a/docs/architecture/CONVENTIONS.md b/docs/architecture/CONVENTIONS.md new file mode 100644 index 0000000..4f3b049 --- /dev/null +++ b/docs/architecture/CONVENTIONS.md @@ -0,0 +1,73 @@ +# Architecture Conventions + +## Deployment Conventions + +### Multi-brand testing requirement + +Any code change to shared services (audit pipeline, site-tag-analytics, +synthesizers, categorizers, conversion type registry) must be verified +against at least: + +- One medical brand (cardiology or imaging) for dense events, multi-language + data shapes, and HIPAA-relevant surfaces +- One service brand (lawn care portfolio) for high-volume events and + multi-domain reconciliation +- One B2B brand (TPAction / AiGrowth360) for low-event-volume edge cases + and lead gen flows +- One ecommerce brand if available for product schema and checkout flows + +Verification recipes must specify at least two brands of different verticals. +"Verify on cardiology" alone is insufficient. + +Single-brand verification was the root cause of the Phase 19A.16 missed +form_filled crash on Fairway Lawns (May 27, 2026). + +### Conversion type registration requirement + +Before merging any change to shared event or conversion categorization code, +run the comprehensive type discovery SQL: + +```sql +SELECT "brandId", "conversionType", COUNT(*) +FROM "SiteConversion" +WHERE timestamp >= NOW() - INTERVAL '30 days' + AND "conversionType" NOT IN ( + 'appointment_booked','form_submitted','phone_call','email_contact', + 'sms_contact','purchase','appointment_attempted','form_started', + 'appointment_intent','chat_initiated','newsletter_signup','add_to_cart', + 'checkout_started','file_download','waitlist_signup','form_filled', + 'form_submit','form_submission','phone_number_click','click_to_call', + 'calendly','booking_confirmed','booking_attempt','email_click', + 'sms_click','phone_copy','phone_input','form_iframe_present', + 'error_count_update' + ) +GROUP BY "brandId", "conversionType" +ORDER BY count DESC; +``` + +Confirm zero rows returned, or explicitly handle every type returned before +shipping. + +New types must be registered in: +1. `SITE_CONVERSION_TYPES` in `src/lib/services/site-tag-analytics.ts` + (query allowlist -- unregistered types are silently dropped) +2. `CONVERSION_TIERS` in `src/lib/conversions/tiers.ts` + (tier mapping -- unregistered types crash route.ts via undefined key lookup) + +The defensive guard at `src/app/api/site-tag/analytics/route.ts` around +the `tierTotals[cfg.tier]` access will log a warning and skip rather than +crash for any future type that slips through, but the correct fix is always +to register the type proactively. + +### Tier assignment guidelines + +| Tier | Description | isCounted | Examples | +|------|-------------|-----------|---------| +| completed | Definitive conversion action | true | form_submit, phone_call, appointment_booked, purchase | +| intent | Started a conversion flow | false | form_filled, appointment_attempted, checkout_started | +| signal | Engagement only (no conversion flow) | false | phone_copy, phone_input, form_iframe_present | + +The `DEFAULT_COUNTED_TIERS` constant controls which tiers roll up into the +headline conversion count and conversion rate. Only "completed" is counted +by default. Brand-level overrides via `BrandConversionConfig.isCounted` can +promote intent signals to counted status for specific brands. diff --git a/docs/architecture/audit-pipeline-current-state.md b/docs/architecture/audit-pipeline-current-state.md new file mode 100644 index 0000000..655e222 --- /dev/null +++ b/docs/architecture/audit-pipeline-current-state.md @@ -0,0 +1,241 @@ +# Audit Pipeline: Current State (Phase 19A.1 Discovery) + +**Date:** 2026-05-26 +**Scope:** Read-only architectural discovery of the full audit pipeline as it exists post-Phase 17. + +--- + +## 1. Three Distinct Audit Runners + +The codebase contains three independent audit runners with separate entry points, separate Prisma write targets, and separate triggering surfaces. They share no code. + +### 1.1 Main SEO Audit Runner + +**File:** `src/lib/audit/audit-runner.ts` (1594 lines) +**Export:** `runAudit(auditId: string): Promise` +**Triggered by:** `POST /api/admin/audits/trigger` via Vercel `waitUntil` +**Prisma write target:** `Audit.seoSection` (JSONB) +**Model:** central to all Phase 11A-17 dimension output + +This is the primary audit pipeline. It orchestrates all dimension data sources, the two LLM synthesis calls, and the final DB write. All output lands in a single JSONB field (`Audit.seoSection`) on the `Audit` record. + +### 1.2 Technical Audit Runner + +**File:** `src/lib/services/audit-runner.ts` +**Export:** `runTechnicalAudit(brandId: string, domain: string): Promise` +**Triggered by:** `POST /api/admin/audits/[id]/retry` and brand-health scheduler +**Prisma write targets:** `TechnicalAudit`, `TechnicalIssue` (row-per-issue table) +**Model:** independent crawler with headless fallback via Puppeteer/Chromium + +Crawls up to 100 pages, checks each for HTTP errors, broken links, redirect chains, missing meta, etc., then bulk-inserts findings as `TechnicalIssue` rows. + +### 1.3 Performance Audit Runner + +**File:** `src/lib/services/performance-audit-runner.ts` +**Export:** `runPerformanceAudit(brandId: string, domain: string): Promise` +**Triggered by:** `POST /api/performance-audit/run` +**Prisma write targets:** `PerformanceAudit`, `PerformancePageScore` (row-per-URL) +**Model:** PageSpeed Insights API calls per URL, scored per strategy (mobile/desktop) + +Reads from `GscPage` and `TrackedEvent` to pick the top pages to test, then calls PageSpeed Insights for each, writing per-URL scores to `PerformancePageScore`. + +### 1.4 Content Audit + +**API route:** `POST /api/content-audit/run` +**Prisma write targets:** `ContentAuditResult`, `AuditScoreHistory` +**Note:** Not a standalone runner file -- logic lives inline in the route handler. + +--- + +## 2. Main Audit Runner: Phase Sequence + +The `runAudit` function orchestrates work in five labeled phases plus a degraded-mode path. + +``` +Phase 1 DFS site crawl + first-party data fetch + (3rd-party) backlink fetch [parallel] +Phase 2 Firecrawl key-page content fetch + site analysis [parallel] +Phase 3 Industry classification (Haiku, ~5 s) [sequential] +Phase 4 SERP analysis + bilingual audit (3rd-party) [parallel] +Phase 5 All dimension aggregators + two LLM synthesis calls [parallel where possible] +Phase 12 Live visual annotations + competitor visual comparison [parallel, 180 s budget] +``` + +**Degraded mode** activates when the crawl returns 0 pages. It skips SERP-dependent dimensions (snippet capture) and runs a subset: Phase 12 (homepage-only), 13, and 15 in parallel using fallback data. + +--- + +## 3. industryContext: Lifecycle and Constraints + +`industryContext` is computed in Phase 3 by `classifyIndustry()` and passed through the pipeline as an in-memory value. It is **never written to Prisma**. + +**Type (as of Phase 19.0):** +```typescript +interface IndustryContext { + industry: string; // backward-compat alias for industries[0] + industries: string[]; // all applicable industries, primary first (max 3) + subVertical: string; + audienceFraming: string; + relevantFrameworks: string[]; + aiVisibilityBenchmark: string; + schemaPriorities: string[]; + suggestedQueries: string[]; // 5-7 queries; fed to Phase 4 SERP + conversionPathExpectation: string[]; +} +``` + +**Flow:** +1. Haiku classifies the brand using homepage markdown (first 1200 chars). +2. Result stored on `AuditInput.industryContext`. +3. `suggestedQueries` fed to `fetchSerpAnalysis` in Phase 4. +4. `industryContext` passed to all Phase 5 dimension aggregators that need it. +5. `inferredIndustry` (= `industries[0]`) stored in `seoSection.inferredIndustry` -- the only persisted trace of classification. + +**Models used:** +- Industry classifier: `claude-haiku-4-5-20251001` +- SEO narrative: `claude-sonnet-4-6` (with prompt caching) +- Structured synthesis: `claude-haiku-4-5-20251001` + +--- + +## 4. AuditInput: The Pipeline Accumulator + +`AuditInput` (defined in `src/lib/audit/types.ts`) is a mutable object assembled incrementally across Phases 1-5. Each phase appends its output to the relevant optional field. The synthesizer receives the fully-populated input at Phase 5. + +All `*Context` fields are optional. Absent fields signal "not available" -- dimension aggregators and the synthesizer each have fallback behavior when their input is null. + +**First-party-only fields** (absent on 3rd-party audits): +`brandContext`, `behavioralContext`, `aiAttributionContext`, `webVitalsContext`, +`crawlStatsContext`, `signalCenterContext` + +**Conditionally-present fields** (both audit types, depend on crawl success): +All remaining `*Context` fields. + +--- + +## 5. Dimension Data Sources: Pure Functions + +Every Phase 5 aggregator in `src/lib/audit/data-sources/` is a **pure function** -- no Prisma reads or writes. They receive `AuditInput` slices and return typed structs that get merged into `enrichedSeoSection` before the single final DB write. + +| Import name | File | Activates when | +|---|---|---| +| `aggregateSignalCenter` | data-sources/signal-center | signalCenterContext present | +| `aggregateBilingualAudit` | data-sources/bilingual-audit | bilingualAuditContext present | +| `aggregateCompetitorAnalysis` | data-sources/competitor-analysis | serpAnalysis present | +| `aggregateSchemaOpportunityForecast` | data-sources/schema-opportunity-forecast | industryContext present | +| `aggregateIndustryBenchmarkComparison` | data-sources/industry-benchmark-comparison | industryContext present | +| `aggregatePageStrategicPass` | data-sources/page-strategic-pass | pages available | +| `aggregateAiEnginePersonalityAnalysis` | data-sources/ai-engine-personality-analysis | always | +| `aggregateAiSourceAttributionComparison` | data-sources/ai-source-attribution-comparison | aiAttributionContext present | +| `aggregateBehavioralActionBridge` | data-sources/behavioral-action-bridge | behavioralContext present | +| `aggregateEeatAudit` | data-sources/eeat-audit | pages + industryContext | +| `runVoiceSearchEligibility` | data-sources/voice-search-eligibility | pages + contentSamples | +| `aggregateAiSnippetEligibility` | data-sources/ai-snippet-eligibility | pages present | +| `aggregateMultiTouchAiPath` | data-sources/multi-touch-ai-path | aiAttributionContext present | +| `aggregateRevenueAttribution` | data-sources/revenue-attribution | first-party data | +| `aggregatePredictiveConversionScoring` | data-sources/predictive-conversion-scoring | first-party data | +| `aggregateConversionHeatMap` | data-sources/conversion-heat-map | behavioral data | +| `aggregateAiSearchVerification` | data-sources/ai-search-verification | always (async agent) | +| `aggregateLostOpportunity` | data-sources/lost-opportunity-calculator | findings present | +| `aggregateLiveVisualAnnotations` | data-sources/live-visual-annotations | Phase 12, parallel | +| `aggregateCompetitorVisualComparison` | data-sources/competitor-visual-comparison | Phase 12, parallel | +| `aggregateBrandAuthorityScore` | data-sources/brand-authority | eeat + schema data | +| `aggregateSnippetCaptureStrategy` | data-sources/snippet-capture-strategy | serpAnalysis present | +| `aggregateMobileFirstAudit` | data-sources/mobile-first-audit | pages present | +| `aggregatePageSpeedInsights` | data-sources/page-speed-deep-dive | webVitalsContext | + +--- + +## 6. SeoSection: The Single JSONB Output + +`SeoSection` (defined in `src/lib/audit/types.ts`, ~155 lines) is the TypeScript shape of `Audit.seoSection` in Prisma. It is a wide JSON blob -- every dimension output lives as an optional field on this single object. + +**Core fields (always present on completed audits):** +``` +healthScore, narrative, keyFindings, priorityActions, quickWins, scoringBreakdown +``` + +**Additive consulting fields:** +``` +prioritizedFindings, additionalFindings, summaryThemes, inferredIndustry, displayName +``` + +**Conditional enrichments (field absent when not applicable):** +``` +aiSearchPerformance, brandEcho, dimensionScores, siteTagContext, methodology, +industryFramework, competitiveLandscape, backlinkProfile, publicAiVisibility, +organicSearchSummary, aiConversionAttribution, signalCenter, bilingualAudit, +competitorAnalysis, schemaOpportunityForecast, strategicRoadmap, +industryBenchmarkComparison, pageStrategicPass, aiEnginePersonalityAnalysis, +aiSourceAttributionComparison, behavioralActionBridge, eeatAudit, +voiceSearchEligibility, aiSnippetEligibility, multiTouchAiPath, revenueAttribution, +predictiveConversionScoring, conversionHeatMap, aiSearchVerification, +lostOpportunityCalculation, liveVisualAnnotations, competitorVisualComparison, +brandAuthorityScore, snippetCaptureStrategy, mobileFirstAudit, pageSpeedInsights, +executiveBrief, lockedFirstPartyTeaser +``` + +**Engineering-only internal field:** +``` +internal.dataSourcesUsed, internal.costLog, internal.auditType +``` +Must not be rendered by dashboard components or PDF templates. + +**Single Prisma write pattern:** +```typescript +await prisma.audit.update({ + where: { id: auditId }, + data: { seoSection: enrichedSeoSection as object }, +}); +``` +All 30+ dimension outputs are assembled in memory then written in one round trip. + +--- + +## 7. Persistence: Write Targets by Runner + +| Runner | Table(s) written | Pattern | +|---|---|---| +| Main SEO (`audit-runner.ts`) | `Audit.seoSection` (JSONB) | Single update at end of run | +| Main SEO (progress) | `Audit` (status, progress fields) | Multiple incremental updates during run | +| Technical (`services/audit-runner.ts`) | `TechnicalAudit`, `TechnicalIssue` | Create + bulk createMany | +| Performance (`performance-audit-runner.ts`) | `PerformanceAudit`, `PerformancePageScore` | Create + createMany per URL | +| Content audit (`/api/content-audit/run`) | `ContentAuditResult`, `AuditScoreHistory` | Create per run | + +**Connection-leak mitigation (two-layer):** +- Client-side: `boundedFireAndForget` uses `Promise.race` with a hard timeout so the serverless function is never blocked waiting on a Prisma query past its useful lifetime. +- Server-side: `prisma.$transaction({ timeout })` enforces a server-enforced maximum on any transaction, releasing the connection-pool slot even if the JS promise chain is abandoned. + +--- + +## 8. UI Rendering: Audit Report Surfaces + +The `seoSection` JSONB is read (never mutated) by three display surfaces: + +| Surface | Route | Notes | +|---|---|---| +| Public audit page | `src/app/audit/[id]/page.tsx` | Gated by `publicSlug`; shows subset of sections | +| Admin audit page | `src/app/admin/audits/[id]/page.tsx` | Full section visibility | +| Client portal | `src/app/client/[brandId]/audit/page.tsx` | Brand-linked first-party view | +| PDF report | `src/lib/audit/pdf/AuditPdf.tsx` | Generated via `@react-pdf/renderer`; served from `/api/admin/audits/[id]/pdf` | + +**Section rendering convention:** +Each dashboard section component checks `hasData` (or a null check on the parent object) and returns `null` when the dimension output is absent. The TOC is constructed by the page from the same boolean flags, so suppressed sections disappear from the table of contents automatically. + +**Separate performance/technical UIs:** +`/technical-audit`, `/site-performance-audit`, and `/content-audit` are independent pages that read from their respective tables (`TechnicalAudit`, `PerformanceAudit`, `ContentAuditResult`) -- they do not read `Audit.seoSection`. + +--- + +## 9. Key Architectural Constraints for Phase 19 Work + +1. **All new dimension outputs must be appended to `SeoSection` as optional fields.** There is no separate table for Phase 11A-17 dimension data. The JSONB approach means zero migrations for new dimensions. + +2. **Dimension aggregators must remain pure functions.** No Prisma reads or writes inside `src/lib/audit/data-sources/`. Data flows in via `AuditInput` slices; output is returned as a typed struct. + +3. **industryContext is ephemeral.** If a dimension needs to activate conditionally on industry (e.g., HIPAA compliance when `industries.some(i => i.startsWith('healthcare-'))`), the check must happen inside the aggregator or inside the runner at Phase 5 gate -- not via a DB lookup. + +4. **Any new DB write in Phase 19 (e.g., ComplianceAuditResult) requires both layers:** `boundedFireAndForget` at the call site and `$transaction({ timeout })` inside the write operation. The connection pool has 14 slots shared across all serverless function instances. + +5. **Model names must never appear in user-facing output.** `SeoSection.internal` is the only field where model/vendor names are permitted. All other fields, dashboard copy, and PDF copy must use generic language. + +6. **Primary industry stability.** The `industries[0]` value must equal what would have been returned in single-industry mode. Secondary industries are additive-only. Downstream gate logic checking `industryContext.industry` (backward-compat alias) remains correct without changes. diff --git a/docs/architecture/phase-16-validation.md b/docs/architecture/phase-16-validation.md new file mode 100644 index 0000000..0665b45 --- /dev/null +++ b/docs/architecture/phase-16-validation.md @@ -0,0 +1,279 @@ +# Phase 16: Validation and Auth Architecture + +## Overview + +Before Phase 16, auth and validation were duplicated inline across API routes. Each handler called `getCurrentUser()` directly, repeated the null check, re-fetched the brand, re-verified membership, and manually returned `NextResponse.json({ error: "..." }, { status: 401 })` in its own way. Zod parse errors had no standard shape. The result was inconsistent error responses and auth logic that could drift per route. + +Phase 16 centralised this into four layers: + +1. **Error types** (`src/lib/api/errors.ts`): typed exceptions with HTTP status codes attached +2. **`withErrorHandler`** (`src/lib/api/with-error-handler.ts`): catches those exceptions and converts them to uniform JSON responses +3. **Auth guards** (`src/lib/auth/require.ts`, `src/lib/admin-auth.ts`): throw the typed exceptions instead of returning responses, so they compose cleanly inside `withErrorHandler` +4. **Validation helpers** (`src/lib/validation/request.ts`): parse and throw `ValidationError` on bad input + +--- + +## Error Types + +`src/lib/api/errors.ts` + +All errors extend `APIError`, which carries a `statusCode`. Route handlers and helpers throw these; `withErrorHandler` catches them. + +| Class | Status | When to use | +|---|---|---| +| `AuthError` | 401 | User is not authenticated | +| `ForbiddenError` | 403 | User is authenticated but lacks access | +| `NotFoundError` | 404 | Resource does not exist | +| `ValidationError` | 400 | Request body or query params failed schema validation | +| `RateLimitError` | 429 | Rate limit exceeded | +| `ServerError` | 500 | Explicit internal error (prefer letting unexpected errors bubble) | + +--- + +## `withErrorHandler` + +`src/lib/api/with-error-handler.ts` + +Wraps a route handler. Catches `APIError` subclasses and `ZodError` (as a backstop) and converts them to a consistent JSON shape. Logs unhandled errors to `console.error`. + +```typescript +export const GET = withErrorHandler(async (req, ...args) => { + // throw AuthError, ForbiddenError, ValidationError, etc. freely here + return NextResponse.json({ ... }); +}); +``` + +**Response shapes on error:** + +```json +// APIError +{ "error": "message" } +{ "error": "message", "details": { ... } } // when details are present + +// ZodError (converted to ValidationError internally) +{ "error": "Invalid request body", "details": { "code": "VALIDATION_ERROR", "fieldErrors": { ... } } } +``` + +All routes that use `requireUser` or `requireUserAndBrand` must be wrapped with `withErrorHandler`. Without the wrapper, thrown `AuthError` / `ForbiddenError` instances are uncaught and produce a 500. + +--- + +## Auth Helpers + +### `requireUser` + +`src/lib/auth/require.ts` + +```typescript +async function requireUser(): Promise +``` + +Calls `getCurrentUser()` (Clerk session resolution + Prisma upsert). Throws `AuthError("Unauthorized")` if there is no active session. + +Returns the Prisma `User` record including `memberships` (with nested `organization`). + +### `requireUserAndBrand` + +```typescript +async function requireUserAndBrand( + brandId: string +): Promise<{ user: User; brand: Brand }> +``` + +Calls `requireUser`, then: +1. Calls `verifyBrandAccess(user.id, brandId)`, which checks `BrandMembership` rows and org-owner role. Throws `ForbiddenError("Forbidden")` if the user has no access. +2. Fetches the brand with `prisma.brand.findUnique`. Throws `NotFoundError("Brand not found")` if the row does not exist. + +Returns `{ user, brand }`. The caller almost never needs to use the return value since the primary purpose is the guard, but the brand object is available when the handler needs it immediately without a second query. + +```typescript +// Guard only +export const GET = withErrorHandler(async (req, ...args) => { + const { brandId } = (args[0] as { params: { brandId: string } }).params; + await requireUserAndBrand(brandId); + // ... handler logic +}); + +// Using the return value +export const POST = withErrorHandler(async (req, ...args) => { + const { brandId } = (args[0] as { params: { brandId: string } }).params; + const { brand } = await requireUserAndBrand(brandId); + // brand.domain, brand.plan, etc. available without a second query +}); +``` + +--- + +### `requireAdmin` + +`src/lib/admin-auth.ts` + +```typescript +async function requireAdmin(): Promise< + | { ok: true; user: AdminUser } + | { ok: false; status: number } +> +``` + +**Legacy helper.** Returns a discriminated union rather than throwing. Used by pre-existing `/api/admin-legacy` routes and a handful of older admin endpoints. + +Checks the `ADMIN_EMAILS` environment variable (comma-separated list). If the env var is empty, denies all requests (fail-safe default; no misconfigured deployment accidentally grants access). + +**Callers must check `ok` and return early:** + +```typescript +const auth = await requireAdmin(); +if (!auth.ok) return NextResponse.json({ error: "Forbidden" }, { status: auth.status }); +``` + +Do not use `requireAdmin` for new routes. Use `requireSuperadmin` instead. + +### `requireSuperadmin` + +```typescript +async function requireSuperadmin(): Promise +``` + +**Current admin guard.** Returns `null` when the caller is allowed to proceed, or a `NextResponse` (401/403) when denied. This is the opposite of the throwing pattern; callers return early on non-null. + +```typescript +export const GET = withErrorHandler(async (req) => { + const denied = await requireSuperadmin(); + if (denied) return denied; + // ... handler logic +}); +``` + +Checks (in order): Clerk session claims `metadata.role === "superadmin"`, `publicMetadata.role === "superadmin"`, `metadata.isSuperadmin === true`, `publicMetadata.isSuperadmin === true`, then falls back to `ADMIN_EMAILS` email match. + +Does NOT throw (it returns a response), so `withErrorHandler` is not strictly required around it, but wrapping is still preferred for consistent unhandled-error behaviour. + +### `getSuperadmin` + +```typescript +async function getSuperadmin(): Promise +``` + +Pure boolean check. Returns `{ userId, email }` when the session is a superadmin, `null` otherwise. Does not return a response. Use this when you need to branch on admin status within a route that also serves non-admin users. `requireSuperadmin` is the right choice when the entire route is admin-only. + +### `withAdminTiming` + +```typescript +async function withAdminTiming(name: string, handler: () => Promise): Promise +``` + +Wraps a block with `console.info` / `console.error` timing output tagged `[admin:name]`. Result array length is logged when the result is an array. Use in admin routes where query time is worth tracking in Vercel logs. + +```typescript +const result = await withAdminTiming("platform-metrics", async () => { + return await prisma.metricSnapshot.findMany({ ... }); +}); +``` + +--- + +## Validation Helpers + +`src/lib/validation/request.ts` + +### `validateBody` + +```typescript +async function validateBody(req: Request, schema: ZodSchema): Promise +``` + +Parses `req.json()`. Throws `ValidationError("Request body must be valid JSON")` on JSON parse failure and `ValidationError("Invalid request body")` with `fieldErrors` on schema failure. Both are caught by `withErrorHandler`. + +### `validateQuery` + +```typescript +function validateQuery(req: Request, schema: ZodSchema): T +``` + +Parses `new URL(req.url).searchParams` as a flat string object. Throws `ValidationError("Invalid query parameters")` on schema failure. Note: all values are strings from the URL; Zod coercion (`z.coerce.number()`) is required to parse numerics. + +--- + +## Full Route Example + +```typescript +import { NextResponse } from "next/server"; +import { z } from "zod"; +import { withErrorHandler } from "@/lib/api/with-error-handler"; +import { requireUserAndBrand } from "@/lib/auth/require"; +import { validateBody, validateQuery } from "@/lib/validation/request"; + +const QuerySchema = z.object({ + range: z.enum(["7d", "30d", "90d"]).default("30d"), +}); + +const BodySchema = z.object({ + name: z.string().min(1), + value: z.number().int().positive(), +}); + +export const GET = withErrorHandler(async (req, ...args) => { + const { brandId } = (args[0] as { params: { brandId: string } }).params; + await requireUserAndBrand(brandId); + const { range } = validateQuery(req, QuerySchema); + return NextResponse.json({ range }); +}); + +export const POST = withErrorHandler(async (req, ...args) => { + const { brandId } = (args[0] as { params: { brandId: string } }).params; + await requireUserAndBrand(brandId); + const body = await validateBody(req, BodySchema); + // ... use body.name, body.value + return NextResponse.json({ ok: true }); +}); +``` + +--- + +## Migration Guide + +Older routes (pre-Phase-16) do auth inline. The migration is mechanical: + +**Before:** +```typescript +export async function GET(req: Request) { + const user = await getCurrentUser(); + if (!user) return NextResponse.json({ error: "Unauthorized" }, { status: 401 }); + + const brandId = new URL(req.url).searchParams.get("brandId"); + const brand = await prisma.brand.findUnique({ + where: { id: brandId! }, + include: { organization: { include: { memberships: true } } }, + }); + if (!brand || !brand.organization.memberships.some((m) => m.userId === user.id)) { + return NextResponse.json({ error: "Access denied" }, { status: 403 }); + } + + // ... handler +} +``` + +**After:** +```typescript +export const GET = withErrorHandler(async (req, ...args) => { + const { brandId } = (args[0] as { params: { brandId: string } }).params; + await requireUserAndBrand(brandId); + // ... handler +}); +``` + +--- + +## Gotchas + +**`requireUserAndBrand` vs. manual membership check.** The manual pre-Phase-16 pattern fetched the brand and checked `memberships.some(m => m.userId === user.id)`. `requireUserAndBrand` calls `verifyBrandAccess`, which also grants access to org owners regardless of an explicit `BrandMembership` row. Converting a route to use `requireUserAndBrand` may grant access to org owners who previously could not reach that route. This is almost always the correct behaviour but worth noting. + +**`withErrorHandler` is required around throwing guards.** `requireUser` and `requireUserAndBrand` throw exceptions. If you call them inside a handler that is not wrapped with `withErrorHandler`, the exception propagates and Next.js returns a 500. Always pair them. + +**`requireSuperadmin` returns a response, not an exception.** It cannot be placed inside `withErrorHandler` and be handled automatically. The `if (denied) return denied` idiom is intentional; the return type `Response | null` makes the pattern explicit at the call site. + +**`requireAdmin` is legacy.** New admin routes use `requireSuperadmin`. Do not add more callers of `requireAdmin`. The two helpers are not interchangeable; `requireAdmin` has no Clerk role awareness. + +**Query params are always strings.** `validateQuery` uses `new URL(req.url).searchParams`, which returns strings for all values. Use `z.coerce.number()` or `z.coerce.boolean()` in the schema to parse non-string types from query strings. + +**`validateBody` is async, `validateQuery` is not.** `validateBody` must be awaited; `validateQuery` is synchronous. Mixing them up is a TypeScript error but worth being aware of when reading unfamiliar routes. diff --git a/docs/deep-audit-inventory.md b/docs/deep-audit-inventory.md new file mode 100644 index 0000000..42b5bb9 --- /dev/null +++ b/docs/deep-audit-inventory.md @@ -0,0 +1,1185 @@ +# meSEO Deep Audit Inventory + +**Date:** 2026-06-10 +**Commit:** 07e37ef (HEAD, main) +**Author:** Claude Code -- audit-only session +**Purpose:** Onboarding reference for new dev team. Grounds all claims in actual file paths, commit hashes, and code. Where something cannot be confirmed from code, it is marked UNCONFIRMED. + +--- + +## Table of Contents + +1. [Session and Phase History](#1-session-and-phase-history) +2. [Sidebar Pages](#2-sidebar-pages) +3. [Core Platform Architecture](#3-core-platform-architecture) +4. [Audit Flows](#4-audit-flows) +5. [AI Strategist](#5-ai-strategist) +6. [JSX Dashboards](#6-jsx-dashboards) +7. [Guardrails](#7-guardrails) +8. [Customer-Facing Surfaces](#8-customer-facing-surfaces) +9. [Schema and Crons](#9-schema-and-crons) +10. [Risk Register](#10-risk-register) +11. [Patent Map](#11-patent-map) + +--- + +## 1. Session and Phase History + +### Pre-git-history phases (reconstructed from code evidence) + +The visible git history begins at 2026-05-25 (phase 30B). The code itself, however, contains evidence of a complete multi-phase build predating that commit. The following phases are reconstructed from what exists in the codebase today. + +#### Phase 1-3: Foundation + +**Evidence:** `prisma/schema.prisma` multi-tenant models; `src/lib/auth/`, `src/middleware.ts`, Clerk provider in `src/app/layout.tsx`. + +- Multi-tenant architecture: `Organization`, `Brand`, `User`, `OrgMembership`, `BrandMembership` +- Clerk authentication: userId sync, organization context, `BrandMembership` role enforcement +- Brand model: `domain`, `industry`, `locations[]`, `primaryServices[]`, `secondaryServices[]`, `plan`, `billingCycle`, `planExpiresAt`, `healthScore`, `isDemo` +- Organization + subscription management +- Onboarding flow: `src/app/onboarding/page.tsx` +- Settings: `src/app/settings/page.tsx` (tabs: profile, integrations, notifications, white-label) +- Brands Hub: multi-brand switcher, `src/app/brands-hub/page.tsx` +- Pricing page: `src/app/pricing/page.tsx` + +#### Phase 4-6: Data Layer + Integrations + +**Evidence:** `src/lib/services/ga4-sync.ts`, `src/app/api/gsc/backfill/route.ts`, `src/lib/integrations/nango.ts`, `prisma/schema.prisma` BrandIntegration model. + +**Nango OAuth provider** (`src/lib/integrations/nango.ts`): +- Universal OAuth for GSC, GA4, GBP, Bing +- `getValidAccessToken(brandId, integrationId)` -- refreshes if expiring +- `getCredentials(brandId, integrationId)` -- returns stored credentials +- Credentials stored encrypted in `BrandIntegration.credentialsEnc` (AES-256-GCM) +- Token expiry tracked in `BrandIntegration.tokenExpiresAt` + +**GSC backfill** (`src/app/api/gsc/backfill/route.ts`): +- `POST /api/gsc/backfill` -- backfills 16 months of historical data +- Dimensions: `["date", "page"]` and `["date", "query"]` +- Pagination: 25,000 rows per batch; handles multi-batch responses +- `GscPage` upsert: `brandId, pageUrl, clicks, impressions, ctr, position, date` +- `GscQuery` upsert: `brandId, query, clicks, impressions, ctr, position, date` +- Pre-deletes date range to prevent duplicate rows +- Verifies connection via totals call before backfilling + +**GA4 sync** (`src/lib/services/ga4-sync.ts`): +- `storeGa4Data(brandId, rows, startDate, endDate)` -- upserts daily snapshots +- Safeguard: detects inflated key events (>3x sessions) and skips conversion writes +- `MetricSnapshot` upsert: `{ brandId, date, source: "ga4", sessions, users, pageviews, conversions, bounceRate }` +- `getGa4Summary(brandId, days)` -- summary query for dashboard/AI avatar + +**MetricSnapshot + ChannelMetric** (schema): +- `MetricSnapshot`: daily per-brand per-source (ga4|gsc|site_tag|daily|manual|seed) +- `ChannelMetric`: daily per-channel breakdown (organic|ai_search|social|gbp|direct) + +**Integrations page** (`src/app/integrations/page.tsx`): +- Connect/disconnect: GSC, GA4, GBP, Bing +- Status indicators per integration +- API: `/api/integrations/connect`, `/api/integrations/disconnect` + +#### Phase 7-9: Core Audit Runner + +**Evidence:** `src/lib/audit/audit-runner.ts` (2038 lines), 26 dimension aggregator files under `src/lib/audit/aggregators/`, 7 synthesizer files under `src/lib/audit/synthesizers/`, `src/lib/audit/types.ts` (900+ lines). + +**audit-runner.ts** -- main orchestration: +- 7-phase pipeline: (1) brand context, (2) data fetch, (3) external APIs (DataForSEO + Firecrawl), (4) dimension aggregation, (5) LLM synthesis, (6) output assembly, (7) DB write +- Cost tracking constants: `COST_PER_CRAWL_PAGE = 0.0001`, `COST_PER_SONNET_CALL = 0.05` +- Cost ceilings: $4.00 first-party, $2.00 third-party -- hard abort if exceeded +- Degraded mode: triggers when `pages.length === 0`, uses Site Tag telemetry + GSC data +- Prompt caching: `cache_control: { type: "ephemeral" }` on narrative synthesis input +- External calls: DataForSEO (`/on_page/task_post`, `/backlinks/summary/live`, `/serp/google/organic/live/advanced`), Firecrawl (5-10 key pages, markdown + metadata), Anthropic + +**AuditInput type** (`src/lib/audit/types.ts`): +40+ optional input fields including: brandId, domain, businessName, industry, locations[], primaryServices[], targetAudience, pages[], gscData, ga4Data, siteTagData, competitors[], competitorGaps[], backlinks, aiVisibility, trackedKeywords[], conversionData, adData, signalData, userEngagementData, existingAudit, analysisConfig + +**SeoSection type** (`src/lib/audit/types.ts`): +40+ optional output fields including: overallScore, headline, summary, keyFindings[], priorityActions[], competitiveLandscape, organicSearch, technicalHealth, conversionGap, eeat, aiSearchVerification, aiEnginePersonality, voiceSearch, pageSpeed, backlinks, multiTouch, revenueAttribution, executiveBrief, strategicRoadmap, implementationAppendix, industryContext, dimensionScores + +**DimensionScores**: technicalSeo, contentMetadata, aiVisibility, conversionOptimization, userEngagement + +**26 dimension aggregators** (in `src/lib/audit/aggregators/`): +Each returns a typed object fed into the LLM context. Input = slices of AuditInput. Output = dimension-specific analysis. + +| Aggregator | Domain | +|------------|--------| +| `backlinks.ts` | Domain authority, link quality, toxicity scoring | +| `brand-authority.ts` | Trust signals, E-E-A-T surface area | +| `competitor-deep-dive.ts` | Per-competitor detailed breakdown | +| `competitor-landscape.ts` | Market positioning, threat levels | +| `competitor-visual.ts` | Side-by-side metric comparison | +| `content-metadata.ts` | Title/meta/H1 coverage and quality | +| `conversion-heatmap.ts` | Conversion-weighted session data | +| `conversion-opportunity.ts` | Revenue gap vs. competitors | +| `ecommerce.ts` | Product listing, checkout funnel signals | +| `eeat.ts` | Expertise-Authority-Trust signals | +| `executive-brief.ts` | Score + business impact narrative | +| `industry-benchmark.ts` | Brand vs. vertical median KPIs | +| `key-findings.ts` | Top 5-7 prioritized findings assembly | +| `live-visual-annotations.ts` | Real-time behavioral overlay signals | +| `lost-opportunity.ts` | Revenue impact of ranking gaps | +| `multi-touch-ai.ts` | Multi-touch attribution across channels | +| `organic-search.ts` | Click/impression/position from GSC | +| `page-speed.ts` | Core Web Vitals (LCP/CLS/INP/TTFB/FCP) | +| `page-strategic-pass.ts` | Per-page content/technical recommendations | +| `predictive-conversion.ts` | ML-based conversion probability estimates | +| `priority-actions.ts` | Ranked action item assembly | +| `revenue-attribution.ts` | Per-channel revenue attribution | +| `schema-opportunity.ts` | Schema markup gap analysis | +| `signal-center.ts` | Rank/traffic/competitor signal aggregation | +| `snippet-capture.ts` | Snippet-by-snippet capture tactics | +| `strategic-roadmap.ts` | 90-day implementation roadmap | + +**7 synthesizer files** (in `src/lib/audit/synthesizers/`): +Each receives aggregated dimension data and returns narrative + structured output. + +| Synthesizer | Model | Timeout | Notes | +|------------|-------|---------|-------| +| `seo-synthesizer.ts` | Sonnet 4.6 (narrative) + Haiku 4.5 (structured) | 280s + 45s in `Promise.all` | Primary: 14K tokens. 14 industry lenses. Vendor confidentiality enforced (service names stripped). | +| `real-user-technical.ts` | -- | -- | Surfaces non-SEO issues from RealUserMetric | +| `ecommerce.ts` | -- | -- | E-commerce product/checkout funnel lens | +| `multilingual.ts` | -- | -- | hreflang and regional content gaps | +| `compliance.ts` | -- | -- | HIPAA/GDPR/legal compliance signals | +| `b2b.ts` | -- | -- | B2B SEO lens | +| `industry-classifier.ts` | -- | -- | Derives industry string[] from domain/content/integrations (commit `3fc9729`) | + +**Industry lenses** (14 categories): healthcare-medical, b2b-saas, ecommerce, local-services, professional-services, finance, legal, real-estate, nonprofit, hospitality, higher-ed, b2b, dentist, other. `industryContext` persisted to `seoSection` JSONB (commit `ce67953`). + +#### Phase 10-12: AI + Public Audit + +**Evidence:** `src/app/api/public-audit/route.ts`, `src/lib/services/ai-visibility-checker.ts` (250+ lines), `src/app/ai-strategist/page.tsx`, `src/lib/ai-strategist/artifacts.ts`. + +**Public audit flow** (`src/app/api/public-audit/route.ts`): +- No auth required +- Lead capture: firstName, lastName, email, companyName, phoneNumber, websiteUrl +- Rate limit: 3 req/IP/hour +- OTP email verification -- returning leads (matched by email) bypass OTP +- Same synthesizer pipeline as first-party audit +- `LockedFirstPartyTeaser.tsx` shows upgrade CTA to anonymous users +- `Audit.auditToken` stores the shareable audit URL + +**AI visibility checker** (`src/lib/services/ai-visibility-checker.ts`): +- Uses Anthropic API with `web_search_20250305` tool +- 7 AI sources checked: ChatGPT, Perplexity, Gemini, Claude, Copilot, Phind, You.com +- `checkAiVisibility(brandId, query)` -- returns `AiCheckResult { mentioned, position, context, sentiment, sourceUrls }` +- Results stored in `AiVisibilityCheck` + aggregate to `AiVisibilitySnapshot` +- Weekly cron at `0 0 * * 1` + +**AI Strategist** (`src/app/ai-strategist/page.tsx`, 1342 lines): +- Conversational interface +- Context: brand profile + GSC + Site Tag + AnalysisJob.result + paid media + LLMO context +- Artifacts: `` tags rendered in iframe sandbox via `ArtifactRenderer` +- Models: claude-sonnet-4-6, 12K max output tokens, 120s maxDuration +- Every call logged to `AiInteraction` (userId, brandId, feature, guardrailFlags[]) + +#### Phase 13-15: Content + Execution + Competitive + +**Evidence:** `src/app/keyword-research/page.tsx`, `src/app/rank-tracker/page.tsx`, `src/app/api/cron/rank-check/route.ts`, `src/app/backlinks/page.tsx`, `src/app/competitors/page.tsx`, `src/app/api/content-briefs/generate/route.ts`, `src/app/execution-hub/page.tsx`. + +**Keyword research** (`src/app/keyword-research/page.tsx`): +- Deep-link: `?keyword=X` from Topic Map / Execution Hub +- AI analysis output (Claude): summary, topic clusters, quick wins, gap analysis, question keywords, avoid keywords, content plan +- Each cluster: `name, keywords[], contentStrategy, priority, estimatedTrafficPotential` +- Search history: `GET /api/keyword-research/analyze?brandId=...` +- maxDuration: analyze 120s, search 60s + +**Rank tracker** (`src/app/rank-tracker/page.tsx`): +- `GET /api/cron/rank-check` (daily, 300s maxDuration) +- DataForSEO `/serp` live checks per `TrackedKeyword` +- Cost cap: soft $5 USD/day, hard 100 keywords/brand +- Summary cards: total tracked, avg position, top-3/10/20/not-ranking counts +- Distribution chart with click-to-filter, movers panel (improved/declined) +- `TrackedKeyword`: keyword, location, device, targetUrl, tags[], isActive +- `KeywordRanking`: per-day position + previousPosition + checkedAt + +**Backlinks** (`src/app/backlinks/page.tsx`): +- `Backlink`: sourceDomain, sourceUrl, targetUrl, anchorText, linkType, domainAuthority, relevanceScore, toxicityScore, qualityTier, toxicityReasons[], status (active|lost|disavowed) +- `BacklinkSnapshot`: historical totals + avgDA + toxicCount +- Features: quality distribution chart, toxic panel, gap analysis (competitor backlinks we lack), trend chart (monthly new/lost), ref domain list with DA ranking +- DataForSEO backlinks API: daily `backlink-sync` cron + +**Competitors** (`src/app/competitors/page.tsx`): +- `Competitor`: domain, name, type, isActive, lastCrawledAt, detectedCms +- `CompetitorSnapshot`: date, pageCount, newPages, movement, rankChange, aiMentions, trafficEstimate +- Features: discovery + manual add, sitemap monitoring, ranking comparison, AI strategic analysis (Claude), change timeline, content gaps +- `CompetitorDiscoveryJob`: async discovery with progress tracking + +**Content briefs** (`src/app/api/content-briefs/generate/route.ts`): +- `POST /api/content-briefs/generate` +- Types: `"seo"` (keyword-optimized editorial, H1/H2 structure, FAQ, meta) and `"llmo"` (Question-Answer-Explanation-Insight cadence for AI citation) +- Model: `callLlm()` from `@/lib/ai-avatar/llm-client` +- Humanization toggle, tone options (professional|conversational|persuasive) +- `ContentBrief`: type, status (draft|review|approved|published), primaryKeyword, sections (JSON), humanizationMode, contentScore + +**Execution Hub** (`src/app/execution-hub/page.tsx`, 73KB): +- `Task`: title, category (seo|llmo|gbp|schema|content|technical|web-dev), status (todo|in_progress|completed), priority, source, sourceId, pipelineStage, briefId, assignedTo, dueDate +- Views: Calendar, Pipeline board +- Tasks linked to audit/signal sources via sourceId + +#### Pre-git-history continuation: supporting systems + +**Email reports** (`src/lib/services/email-report-generator.ts`): +- Sections (configurable per schedule): GSC, GA4, Site Tag, Technical Audit, Rank Tracker, Conversions, Page Lifecycle, UX Signals +- Frequency: daily|weekly|biweekly|monthly +- AI enrichment: Claude analysis of snapshot data -> summary, wins, concerns, recommendation (JSON) +- Timezone support from `User.timezone` (fallback: America/New_York) +- `EmailReportSchedule`: brandId, frequency, sections[], time, lastSentAt +- `SentEmailReport`: scheduleId, recipientEmail, sentAt, contentHash + +**Alert system** (`src/lib/services/signals.ts`): +14 signal generators, all returning `Signal[]`: +- `generateTechnicalAuditSignals`, `generatePerformanceAuditSignals`, `generateDeadPageSignals` +- `generateConversionSignals`, `generateExecutionSignals`, `generateAiVisibilitySignals` +- `generateSiteTagSignals`, `generatePageLifecycleSignals`, `generateRankTrackingSignals` +- `generateCompetitorSignals`, `generateDetectedSignals`, `generateAiRecommendationSignals` +- `generateDataFreshnessSignals`, `generateAiRecommendationSignals` + +Signal shape: +```typescript +{ + id, title, description, + category: "issue"|"win"|"opportunity"|"revenue"|"ai"|"execution", + priority: "critical"|"high"|"medium"|"low", + status: "new"|"viewed"|"actioned", + timestamp, relatedPage?, relatedChannel?, + source, issueIds?, suggestedAction?, competitor?, + revenueImpact?: "high"|"medium"|"low" +} +``` +Dismissal TTL: 14 days (synthetic signals re-surface after this period). +Revenue impact derivation: rules-based on category + priority + content keywords. + +**CRM integration** (`src/lib/services/crm.ts`): +- Supported CRMs: HubSpot, Salesforce, HighLevel, manual +- `CrmDeal`: stages (lead|qualified|proposal|negotiation|closed_won|closed_lost), status (open|won|lost), value, closeDate, contactName, contactEmail, externalId +- `getDeals(brandId, range?, filters?)` -- with status/stage/source filtering +- `getPipelineSummary(brandId, range?)` -- pipeline value, win rate, by-source breakdown +- `upsertDeal()` -- create/update via externalId (sync with external CRM) +- `CrmDeal` links to `ConversionEvent` via `conversion` relation +- `RevenueAttribution` tracks conversion -> deal attribution + +**Page lifecycle** (`src/lib/services/page-lifecycle.ts`, `src/app/page-launch-tracker/page.tsx`): +- `resolveSiteFromTag(siteId, pageUrl)` -- validates TrackedSite + domain allowlist +- `toPathKey(url)` -- normalizes to canonical `/path` (strips protocol/host/query/hash) +- `buildFullUrl(brandDomain, path)` -- reconstructs absolute URLs +- `PageRecord`: url, currentStatus, firstSeenAt, lastSeenAt, redirect chains +- `PageStatusChange`: status transitions with timestamps +- `RedirectRecord`: source, target, statusCode +- `PageDailyMetric`: GSC-joined per-URL daily clicks/impressions +- Page launch detection: joins Site Tag first-seen dates with GSC baselines; tracks post-launch deltas + +**Admin overview** (`src/app/api/admin/overview/route.ts`): +- Aggregates: total orgs/brands/users, active brands (7-day), integration counts (GSC/GA4/GBP/Site Tags) +- AI usage: today/week/month + costUsd +- Event coverage: 13 categories (Core, Forms, Phone, Booking, Video, E-commerce, UX Signals, Performance, Social, Content, Competitor, Chat, Scheduling) +- Data sources: `TrackedEvent` count by eventType, `SiteEvent`, `RealUserMetric` +- In-memory 60s TTL cache + +**Dashboard** (`src/app/dashboard/page.tsx`): +- Module-scope Map (60s TTL) + localStorage (12h TTL) for cache +- 3-phase loading: Phase -1 = localStorage fallback (instant), Phase 0 = server snapshot (`/api/dashboard/summary`), Phase 1 = live fetch with 20s AbortController timeout +- 9 customizable sections: KPI Cards, Paid Media, Technical Issues, Execution Hub, Recommendations, AI Visibility, Competitors, Search Performance (lazy-loaded), Quick Actions +- Channel toggle: GA4 split All Traffic vs. Organic Search +- API: `/api/dashboard`, `/api/dashboard/summary`, `/api/dashboard/search-performance`, `/api/conversion-intelligence/attribution` + +**public/t.js** (client tracking tag, 162.8 KB minified): +- 74 tracked event types across 13 categories (full list in Section 8) +- Session stitching: `meseo_sid` + `meseo_sts` cookies; `meseo_xsid`/`meseo_xsts` for cross-subdomain +- Client session ID: random string, persisted in cookies + memory +- SPA support: `page_view` on route changes (history API + URL polling) +- Event batching: buffered, flushed on timeout or batch-full +- Collection endpoint: `POST /api/collect` + +**Collect route** (`src/app/api/collect/route.ts`): +- Batch path: `{ site_id, visitor_id?, events: [...] }` (up to 200 events) +- Single-event path (legacy): full validation + rate check +- Domain allowlist enforcement (TrackedSite.allowedDomains) +- `createMany` for batch inserts; single `create` for legacy path +- Side effects (when `SITE_TAG_SIDE_EFFECTS_ENABLED=true`): platform detection, integration detection, external conversion initiation +- Request size limit: 64 KB + +--- + +### Git log overview + +106 commits on main from 2026-05-25 to 2026-06-10. Commit-message phases (19, 19A.x, 19.5x, 20A) do not map 1:1 to roadmap numbering (13-27). Reconciliation is below. + +### Phase groups (git history) + +#### Phase 16 (docs/validation) -- 2026-05-26 +- `cadef8e` docs(phase-16): add validation and auth architecture reference +- `d9417b6` docs(phase-16): replace em dash substitutes +- Files: `docs/architecture/phase-16-validation.md`, `docs/architecture/CONVENTIONS.md` +- Shipped: Documentation only. No code changes. + +#### Phase 17 (Voice Search Eligibility) -- 2026-05-26 +- `705d2b3` feat(phase-17): voice search eligibility audit backend +- `14c639f` feat(phase-17): voice search eligibility dashboard component +- `4711328` feat(phase-17): add Voice Search Eligibility section to PDF audit report +- Shipped: Full voice search eligibility pipeline -- schema, synthesizer output, dashboard component, PDF section. + +#### Phase 19 / 19A.x (Technical Audit + Site Tag Performance) -- 2026-05-27 to 2026-05-28 +25+ commits. Sub-milestones: + +| Commit | Date | What shipped | +|--------|------|--------------| +| `545a6c7` | 05-27 | Phase 19A: technical audit page scaffold (mock data) | +| `88b8dde` | 05-27 | Wire technical audit data layer lib | +| `e976da2` | 05-27 | Wire audit trigger buttons | +| `91c41ce` | 05-27 | Wire technical audit page to real seoSection data | +| `e2b1a64` | 05-27 | Hide site tag banner when installed | +| `715e470` | 05-27 | Wire technical audit to background refresh + notifications | +| `3d1c64e` | 05-27 | Add SiteTagDailyRollup cron pre-aggregation | +| `27553b7` | 05-27 | Remove analytics block from site-tag polling route | +| `f909229` | 05-27 | t.js error dedupe + rate limit + counter-based capture | +| `7593eb8` | 05-27 | Redis caching layer for analytics (5-min TTL) | +| `959a662` | 05-28 | Phase 19A.20: loading states, tier label clarification | +| `5488ffd` | 05-28 | Phase 19.5: multilingual, compliance, ecommerce, B2B synthesizers | +| `08420cc` | 05-28 | Phase 19A.21: graceful stats degradation + audit page cache | +| `3b7228f` | 05-28 | Fix 19A.22: wire SiteTagDailyRollup fast path into getTrafficSummary | +| `0572928` | 05-28 | Fix 19A.23: register form_filled, defensive tier guard | +| `51135cf` | 05-28 | Phase 19A.25: expand SiteTagDailyRollup with conversion/event columns | +| `1db278e` | 05-28 | Fix 19A.26: use real siteTagInstalled on audit page | +| `003e7d6` | 05-28 | Fix 19A.26.1: raise first-party audit maxDuration to 800s | +| `8b1b5a8` | 05-28 | Fix 19A.26.2: fix third site-tag banner false-positive | +| `d5e5396` | 05-28 | Fix 19A.27: base maturity banner on rollup active-days | +| `321fdb2` | 05-28 | Phase 19A.28: universal siteTagInstalled in brand context | +| `4dfb003` | 05-28 | Fix 19A.28 followup: suppress banner during brand switch | +| `dd72106` | 05-28 | Fix 19A.28 switch: close banner flash during brand switch | +| `8c761f9` | 05-28 | Run crawl-independent audit sections in degraded mode | +| `1f1fe87` | 05-28 | Raise DFS polling window 240s -> 300s | +| `4f96111` | 05-28 | Fix 19A.29: rollup-ize confidence route + Redis cache + hard 30s timeout | + +#### Phase 20A.x (White-Label) -- 2026-05-28 +| Commit | What shipped | +|--------|--------------| +| `6bf61ee` | Add WhiteLabelConfig + CustomDomain + DomainStatus schema | +| `151f654` | White-label settings tab + API route | +| `c961a65` | Active-org isolation in white-label API + getEventTrends rollup fast path | + +#### Market Position Block 1 and 2 -- 2026-05-28 +| Commit | What shipped | +|--------|--------------| +| `cdb15a9` | feat(market-position-block1): 6 new Prisma models (ProbeRun, VisibilityObservation, CompetitorPanel, QueryCorpusEntry, CalibrationRun, MarketPositionSnapshot) + 2 enums | +| `c735d74` | feat(market-position-block2): canonicalization + corpus seeding | +| `c018c80` | fix(market-position-block2): conversion types, N-scan perf, stop-words | + +#### Phase 30B (Platform Detection + Plugin Version) -- 2026-05-25 to 2026-05-29 +| Commit | What shipped | +|--------|--------------| +| `1bad836` | Detect + store site platform from page_view events | +| `b2abf55` | Platform confidence as strings, tighten signals, fix regexes | +| `55fad07` | Plugin version extraction via version() on ANALYTICS_PLUGINS | +| `8f5df21` | Gate bounded-async side effects behind SITE_TAG_SIDE_EFFECTS_ENABLED | + +#### Phase 32 + 33 (Dedup + Conversion Tier Fixes) -- 2026-05-25 +| Commit | What shipped | +|--------|--------------| +| `f22100e` | Fix visitorId mismatch Path A vs Path B | +| `8abc2a0` | Propagate synthetic flag from TrackedEvent to SiteConversion | +| `b4a44b6` | Promote visitor_id to top-level collect body field | +| `2946d61` | Fix conversion tier dropdown revert from polling | +| `6282295` | Wire canonicalConversionType into BrandConversionConfig override | + +#### Session: Ecommerce + Shopify -- 2026-05-29 to 2026-06-02 +| Commit | What shipped | +|--------|--------------| +| `1c25751` | orderId column, ingest extraction, API route, UI tab | +| `6c4e8e0` | Shopify Web Pixel purchase ingest + lineItems column | +| `9eece0a` | Extend event buffer flush 10s -> 30s, flush-on-full safety valve | +| `4601e07` | Consolidate plugin_detected to single plugins[] event per page | +| `dad4b60` | Exclude ingest beacon paths from middleware matcher | +| `7b6e608` | 1%-sampled drop-reason logging on /event | +| `f677a5f` | Per-session dedup for plugin_detected, phone_number_visible, call_tracking_detected | + +#### Session: Site Audit Phase 1 -- 2026-06-04 +| Commit | What shipped | +|--------|--------------| +| `791d921` | SiteAuditRun, SiteAuditIssue, SiteAuditPage schema + renderTier on Brand | +| `62610b6` | Crawler service, API routes, cron cleanup | +| `d207a05` | Default crawl_delay 200ms, expose zero as opt-in | +| `b0881e5` | Replace BrandMembership filter with verifyBrandAccess() on all user-facing routes | +| `b62fdae` | Use waitUntil to keep Lambda alive after response | +| `3ce9c07` | Enforce 60s minimum before accepting DFS "finished" | +| `f4b4582` | Resolve canonical host before DFS submit; guard 0-page runs | +| `9ad1005` | Cheap pre-reject in /event, sweep stuck runs | + +#### Session: Connection-Pool + Cron Fixes -- 2026-06-05 +| Commit | What shipped | +|--------|--------------| +| `accf550` | Remove recomputeSessionScore from ingest hot path (stops 25P03 leaks) | +| `5990d96` | Attach submissionId token to form_submit | +| `2d1c1b9` | Unified phone_call dedup across both write paths | +| `c376913` | Restore precompute-dashboard to every 30 min, add budget guard | +| `6a69290` | Schedule site-audit-cleanup cron, per-tick cap + debounce | +| `636ac66` | Stand up Inngest infrastructure (client, serve route, ping function) | + +#### Session: Site Tag 504 Fixes -- 2026-06-08 (this session) +| Commit | What shipped | +|--------|--------------| +| `543f271` | Route 28d analytics onto SiteTagDailyRollup; bound all multi-day raw scans | +| `d6dfed4` | Bound activePagesCount to today to stay under withDeadline | +| `6c8cdae` | Add ?debugTiming=1 instrumentation to GET /api/site-tag | +| `07e37ef` | Bound all 9 getReconciliationSummary queries to 48h window | + +### Phase numbering reconciliation + +- Phases actually committed: 16, 17, 19/19A, 19.5, 20A, 30B, 32, 33 +- Phases reconstructed from code (pre-git): 1-15 (see above) +- Phases not in git or code: 18, 21-29 (not built or labelled differently) +- Market Position is labelled "block1/block2" +- Site Audit is labelled "Phase 1" internally with no roadmap number + +--- + +## 2. Sidebar Pages + +| Page | Route | File | Wiring | +|------|-------|------|--------| +| Dashboard | `/dashboard` | `src/app/dashboard/page.tsx` | Full | +| Audit | `/audit` | `src/app/audit/page.tsx` | Full | +| Technical Audit | `/technical-audit` | `src/app/technical-audit/page.tsx` | Full | +| AI Strategist | `/ai-strategist` | `src/app/ai-strategist/page.tsx` | Full | +| Site Tag | `/site-tag` | `src/app/site-tag/page.tsx` | Full | +| Site Tag Analytics | `/site-tag-analytics` | `src/app/site-tag-analytics/page.tsx` | Full | +| Conversion Intelligence | `/conversion-intelligence` | `src/app/conversion-intelligence/page.tsx` | Full | +| Rank Tracker | `/rank-tracker` | `src/app/rank-tracker/page.tsx` | Full | +| Keyword Research | `/keyword-research` | `src/app/keyword-research/page.tsx` | Full | +| Backlinks | `/backlinks` | `src/app/backlinks/page.tsx` | Full | +| Site Performance Audit | `/site-performance-audit` | `src/app/site-performance-audit/page.tsx` | Full | +| Competitors | `/competitors` | `src/app/competitors/page.tsx` | Full | +| Industry Intel | `/industry-intel` | `src/app/industry-intel/page.tsx` | Full | +| AI Visibility | `/ai-visibility` | `src/app/ai-visibility/page.tsx` | Full | +| Signals | `/signals` | `src/app/signals/page.tsx` | Full | +| Execution Hub | `/execution-hub` | `src/app/execution-hub/page.tsx` | Full | +| Page Launch Tracker | `/page-launch-tracker` | `src/app/page-launch-tracker/page.tsx` | Full | +| Content Brief | `/content-brief` | `src/app/content-brief/page.tsx` | Full | +| LLMO Content Brief | `/llmo-content-brief` | `src/app/llmo-content-brief/page.tsx` | Full | +| Schema Generator | `/schema-generator` | `src/app/schema-generator/page.tsx` | Partial (UI-driven, not auto-populated) | +| Dead Pages | `/dead-pages` | `src/app/dead-pages/page.tsx` | Full | +| Broken Links | `/broken-links` | `src/app/broken-links/page.tsx` | Full | +| Report Studio | `/report-studio` | `src/app/report-studio/page.tsx` | Full | +| Content Audit | `/content-audit` | `src/app/content-audit/page.tsx` | Full | +| Recommendations | `/recommendations` | `src/app/recommendations/page.tsx` | Full | +| Writing Assistant | `/writing-assistant` | `src/app/writing-assistant/page.tsx` | Full | +| Email Reports | `/email-reports` | `src/app/email-reports/page.tsx` | Full | +| Notifications | `/notifications` | `src/app/notifications/page.tsx` | Full | +| Integrations | `/integrations` | `src/app/integrations/page.tsx` | Full | +| Settings | `/settings` | `src/app/settings/page.tsx` | Full | +| Brands Hub | `/brands-hub` | `src/app/brands-hub/page.tsx` | Full | +| Client Portal Setup | `/client-portal-setup` | `src/app/client-portal-setup/page.tsx` | Full | +| Local GEO | `/local-geo` | `src/app/local-geo/page.tsx` | **Stubbed -- "Coming Soon"** | +| Paid Media | `/paid-media` | `src/app/paid-media/page.tsx` | Full | +| Onboarding | `/onboarding` | `src/app/onboarding/page.tsx` | Full | +| Pricing | `/pricing` | `src/app/pricing/page.tsx` | Full | +| Admin | `/admin` | `src/app/admin/page.tsx` | Full (admin-only) | + +### Key page details + +#### Dashboard (`/dashboard`) +- **Data sources:** `MetricSnapshot`, `SiteTagDailyRollup` (fast path), `ConversionEvent`, `CompetitorSnapshot`, `ChannelMetric` +- **API calls:** `/api/dashboard/summary`, `/api/dashboard/search-performance`, `/api/conversion-intelligence/attribution` +- **Cache strategy:** 60s TTL module-scope Map + 12h TTL localStorage +- **Range controls:** `1d | 7d | 28d | 90d | month | custom` + +#### Site Tag (`/site-tag`) +- **Data sources:** `TrackedSite`, `TrackedEvent` (recent 15), `SiteTagDailyRollup` (fast path), `SourceEvent`, `CanonicalEvent` +- **API:** `GET /api/site-tag?brandId=xxx` (polls every 30s) +- **Tabs:** Setup/Snippet, Domain Status, Custom Events, Plugins Detected, Reconciliation +- **Wiring notes:** 07e37ef bounded reconciliation to 48h; 543f271 uses rollup fast path for today counts; d6dfed4 bounded activePagesCount to today; 6c8cdae added `?debugTiming=1` block-level timing + +#### Site Tag Analytics (`/site-tag-analytics`) +- **Data sources:** `SiteTagDailyRollup` (primary), `TrackedEvent` (live fallback), `HeatmapEvent`, `RealUserMetric`, `SiteConversion` +- **API:** `GET /api/site-tag/analytics?brandId=xxx&range=30d` +- **Tabs:** Traffic, Conversions, UX Signals, Heatmap, Ecommerce (conditional), AI Attribution, Video +- **Deadline:** 20s `HANDLER_DEADLINE_MS`; returns `partial: true` on timeout + +#### AI Visibility (`/ai-visibility`) +- **Data sources:** `AiVisibilitySnapshot`, `AiVisibilityCheck`, `AiVisibilityQuery` +- **API:** `GET /api/ai-visibility?summary=true&range=30d`, `/api/ai-visibility/queries`, `/check` +- **Feature gate:** `ai_visibility` flag -- Professional+ plan +- **Cron:** Weekly `0 0 * * 1` via `/api/cron/ai-visibility` (maxDuration 300s) + +#### Execution Hub (`/execution-hub`) +- **Data sources:** `Task` (source, sourceId link to audit/signal/dead-page) +- **API:** Task CRUD via `/api/tasks` +- **Categories:** seo|llmo|gbp|schema|content|technical|web-dev +- **Views:** Calendar, Pipeline board + +#### Page Launch Tracker (`/page-launch-tracker`) +- **Data sources:** `PageRecord`, `PageLaunch`, `PageLaunchSnapshot`, GSC click/impression join +- **API:** `/api/page-launches` +- **Features:** lifecycle from first detection (sitemap/GSC/tag), inbound redirect tracking, daily delta chart + +#### Local GEO (`/local-geo`) +- **Status: COMING SOON -- intentionally stubbed** +- `GbpLocation`, `GbpReview`, `GbpMetric` models and daily `gbp-sync` cron are active +- Page deliberately disabled to avoid empty-state before end-to-end wiring + +**Gaps and unknowns:** `/topic-map` wiring status UNCONFIRMED (POC visualization). `issue-detail` wiring UNCONFIRMED. + +--- + +## 3. Core Platform Architecture + +### Multi-tenant model + +``` +Organization (1) -> Brand (N) -> TrackedSite (1) +Organization (1) -> OrgMembership (N) -> User +Brand (1) -> BrandMembership (N) -> User +``` + +Auth: Clerk JWT. `verifyBrandAccess()` (commit `b0881e5`) replaces raw `BrandMembership` filter on all user-facing routes. + +### Integration layer + +**Nango** (`src/lib/integrations/nango.ts`): +- Supports: GSC, GA4, GBP, Bing +- `getValidAccessToken(brandId, integration)` -- auto-refresh +- `getCredentials(brandId, integration)` -- stored in `BrandIntegration.credentialsEnc` (AES-256-GCM) +- `BrandIntegration.tokenExpiresAt` tracked; marks expired on 2+ refresh failures +- Nango token refresh cron: hourly `/api/cron/nango-sync` + +**Connection pool:** +- `DATABASE_URL` query params: `connection_limit=20, pool_timeout=30` +- Neon pooler endpoint for multiplexing +- `recomputeSessionScore` removed from ingest hot path (`accf550`) -- was causing 25P03 idle-in-transaction leaks + +### Redis cache + +**File:** `src/lib/cache/redis-cache.ts` +- Thin wrapper over `redis` npm client; resolves `REDIS_URL` env var +- Fails open (silently disabled) if `REDIS_URL` not set +- Used by: analytics endpoints (5-min TTL), confidence route (30s timeout), pulse heartbeat +- Commit: `7593eb8` (analytics), `4f96111` (confidence), `2d38e9e` (pulse) + +### Inngest + +**Status: Infrastructure only. No production functions beyond ping.** +- `src/lib/inngest/functions/ping.ts`: event `test/ping` +- Serve route registered, client configured +- Commit: `636ac66` + +### prisma-safety-check + +**File:** `scripts/prisma-safety-check.mjs` +- Blocks `prisma db push` if diff contains: `DROP COLUMN`, `DROP TABLE`, `DROP CONSTRAINT`, `DROP INDEX`, `ALTER COLUMN ... DROP` +- Protects the ~22GB `SiteEvent` table indexes (commit `ecd5a48`) +- Override: `ALLOW_SCHEMA_DROPS=true` +- Self-test: `scripts/test-safety-check.mjs` + +--- + +## 4. Audit Flows + +### First-party technical audit (authenticated brand) + +**Entry:** Brand member clicks "Run Audit" on `/technical-audit`. + +**Route chain:** +1. `POST /api/technical-audit/run` (maxDuration 800s) + - Auth: `verifyBrandAccess()` (commit `b0881e5`) + - Creates `TechnicalAudit` row (status: pending) + - Calls `runTechnicalAudit()` inside `waitUntil()` so Lambda stays alive after 200 (commit `b62fdae`) +2. `GET /api/technical-audit/[auditId]/status` -- polled every 5s + - Returns `{ status, pagesScanned, errorCount, warningCount, passedCount }` +3. `GET /api/technical-audit/history` -- historical runs + +**DataForSEO integration:** +- Task submission: `submitCrawl(domain)` inside `site-audit-runner.ts` -- POST to DFS `/v3/on_page/task_post` +- Payload: `url`, `max_crawl_pages`, `crawl_delay` (default 200ms, commit `d207a05`), `store_raw_html: false` +- Minimum 60s before accepting DFS "finished" (commit `3ce9c07`) +- Polling window: 300s (raised from 240s in `1f1fe87`) +- Results: `fetchAllCrawledPages()`, `fetchRedirectChains()`, `fetchDuplicateTitles()`, `fetchDuplicateDescriptions()` +- On DFS unconfigured: limited-mode banner (commit `4028dd2`) + +**Synthesizer pipeline** (inside `runSiteAudit()`): +- `seo-synthesizer.ts`: Sonnet 4.6 (14K tokens, 280s) + Haiku 4.5 (1.5K tokens, 45s) in `Promise.all` +- `real-user-technical.ts`, `ecommerce.ts`, `multilingual.ts`, `compliance.ts`, `b2b.ts` +- `industry-classifier.ts`: returns `string[]` for multi-industry support + +**Crawl-independent sections** (run in degraded mode when DFS crawl fails, commit `8c761f9`): +SERP competitor analysis, GSC performance, Site Tag signals, AI visibility. + +**Cron cleanup:** `/api/cron/site-audit-cleanup` -- re-kicks stuck >15 min, fails >2 hours (commit `6a69290`). + +### Third-party / public audit + +**Entry:** Anonymous visitor at public audit URL. + +**Route chain:** +1. `POST /api/public-audit/...` -- no auth, validates domain, issues OTP +2. Lead capture: firstName, lastName, email, companyName, phoneNumber, websiteUrl +3. Rate limit: 3 req/IP/hour +4. Returning leads (by email) bypass OTP +5. Same synthesizer pipeline as first-party (degraded crawl-independent sections) +6. maxDuration 800s +7. `LockedFirstPartyTeaser.tsx` CTA for anonymous users + +### Audit runner internals (pre-git, audit-runner.ts) + +**7-phase orchestration** (`src/lib/audit/audit-runner.ts`, 2038 lines): +1. Brand context assembly (BrandProfile, integrations, plan) +2. Data fetch (GSC/GA4/Site Tag/competitors in parallel) +3. External APIs: DataForSEO SERP + backlinks + on-page, Firecrawl 5-10 key pages (markdown + metadata) +4. 26 dimension aggregators (run in parallel batches) +5. LLM synthesis (Sonnet 4.6 narrative + Haiku 4.5 structured) +6. Output assembly (SeoSection object, 40+ fields) +7. DB write (AnalysisJob upsert, score history) + +**Cost controls:** +- `COST_PER_CRAWL_PAGE = 0.0001`, `COST_PER_SONNET_CALL = 0.05` +- Hard abort at $4.00 (first-party), $2.00 (third-party) +- Prompt caching: `cache_control: { type: "ephemeral" }` on synthesis input + +**Degraded mode:** `pages.length === 0` triggers Site Tag telemetry fallback. + +--- + +## 5. AI Strategist + +**Page:** `src/app/ai-strategist/page.tsx` (1342 lines) +**API:** `POST /api/ai-strategist/chat` (maxDuration 120s) + +### Context sources + +Assembled by `getEnrichmentContext()` and `buildEnrichmentPrompt()`: +- Brand profile: name, industry, locations[], primaryServices[] +- DashboardData: SEO score, AI visibility, crawl health, monthly traffic +- GSC metrics: searches, impressions, CTR, avg position +- Site Tag metrics: sessions, conversions, top pages (SiteTagDailyRollup or live) +- AnalysisJob.result: full JSON grounding for recommendations +- Paid media: ad spend, ROAS (if AdPlatformIntegration configured) +- LLMO context: AI visibility snapshot if feature enabled + +### Models + logging + +- claude-sonnet-4-6, 12K max output tokens (`ARTIFACT_MAX_TOKENS`) +- Every call logged to `AiInteraction` (userId, brandId, feature, userPrompt 4KB cap, aiResponse 16KB cap, guardrailFlags[], flagSeverity) +- `trackEvent()` -> `PlatformEvent` +- Admin surface: `/admin/ai-monitor` + +### Artifacts + +- `` tags in response extracted by `parseArtifacts()` from `src/lib/ai-strategist/artifacts.ts` +- Rendered in iframe sandbox via `ArtifactRenderer` -- supports JSX dashboards, markdown, structured reports +- Session persistence: `StrategistSession`, `StrategistMessage` + +**Gaps and unknowns:** Token budget enforcement beyond max_tokens UNCONFIRMED. PII guardrail detection logic in `guardrailFlags` was not read from code. + +--- + +## 6. JSX Dashboards + +### Audit dashboard components (46 files) + +Location: `src/components/audit/dashboard/` + +Each receives a slice of the `Analysis` object from `AnalysisJob.result`. + +| Component | Renders | +|-----------|---------| +| `AIConversionGapChart.tsx` | AI-driven conversion gap analysis | +| `AiEnginePersonalitySection.tsx` | LLM engine personality for brand | +| `AiSearchVerificationSection.tsx` | AI search mention rates | +| `AiSnippetEligibilitySection.tsx` | Featured snippet capture readiness | +| `AiSourceAttributionComparisonSection.tsx` | First-party vs third-party attribution | +| `AuditHero.tsx` | Report hero with brand + score | +| `AuditTOC.tsx` | Table of contents with section links | +| `BacklinkProfileSection.tsx` | Backlink quality, toxicity, domain authority | +| `BehavioralActionBridgeSection.tsx` | Site Tag behavioral signals -> actions | +| `BilingualContentSection.tsx` | Multi-language content gaps | +| `BrandAuthorityScoreSection.tsx` | Domain authority + trust signals | +| `CompetitiveLandscapeSection.tsx` | Top competitors, overlap, threat level | +| `CompetitorDeepDiveSection.tsx` | Per-competitor detailed analysis | +| `CompetitorVisualComparisonSection.tsx` | Side-by-side competitor metrics | +| `ConversionHeatMapSection.tsx` | Conversion-weighted heatmap overlays | +| `EeatAuditSection.tsx` | E-E-A-T signals | +| `ExecutiveBriefSection.tsx` | Executive summary prose | +| `ExecutiveSummaryCard.tsx` | Summary card with score breakdown | +| `ImplementationAppendixSection.tsx` | Implementation roadmap table | +| `IndustryBenchmarkSection.tsx` | Brand vs industry median | +| `KeyFindingsSection.tsx` | Top 5-7 prioritized findings | +| `LockedFirstPartyTeaser.tsx` | Upgrade CTA for anonymous audits | +| `LostOpportunityCalculatorSection.tsx` | Revenue impact of ranking gaps | +| `LiveVisualAnnotationsSection.tsx` | Real-time behavioral annotations | +| `MethodologySection.tsx` | Audit methodology explanation | +| `MultiTouchAiPathSection.tsx` | Multi-touch attribution AI path | +| `OrganicSearchSection.tsx` | Organic traffic, clicks, impressions | +| `PageSpeedInsightsDeepDiveSection.tsx` | Core Web Vitals deep dive | +| `PageStrategicPassSection.tsx` | Per-page strategic recommendations | +| `PredictiveConversionScoringSection.tsx` | ML-based conversion probability | +| `PriorityActionsSection.tsx` | Ranked action items | +| `QuickWinsGrid.tsx` | Fast-ROI action grid | +| `RevenueAttributionSection.tsx` | Revenue per channel | +| `SchemaOpportunityForecastSection.tsx` | Schema markup gap analysis | +| `ScoreBreakdown.tsx` | Score sub-component breakdown | +| `ScoreProjection.tsx` | Score trend projection | +| `SignalCenterSection.tsx` | Signal aggregation | +| `SnippetCaptureStrategySection.tsx` | Snippet capture tactics | +| `StrategicRoadmapSection.tsx` | 90-day implementation roadmap | +| `TechnicalHealthSection.tsx` | Technical crawl health summary | +| `ThirdVsFirstPartyComparison.tsx` | GA4/GSC vs Site Tag comparison | +| `VoiceSearchEligibilitySection.tsx` | Voice search schema + NLP readiness | +| `index.ts` | Barrel export | + +### Other component directories + +- `src/components/ai-strategist/artifact-renderer.tsx` -- iframe sandbox renderer +- `src/components/execution-hub/calendar-view/` -- task calendar +- `src/components/execution-hub/pipeline-board/` -- kanban board +- `src/lib/audit/pdf/` -- `@react-pdf/renderer`: `AuditPdf.tsx`, `ExecutiveAuditPdf.tsx`, `pages/`, `styles.ts` + +--- + +## 7. Guardrails + +### Deadline wrappers + +**`withDeadline`** (`src/app/api/site-tag/analytics/route.ts` lines 46-51): +```typescript +async function withDeadline(promise: Promise, ms: number): Promise> { + return Promise.race([ + promise.then((data) => ({ winner: "ok", data })), + new Promise>((resolve) => setTimeout(() => resolve({ winner: "deadline" }), ms)), + ]); +} +``` +- `HANDLER_DEADLINE_MS = 20_000` (20s) +- On deadline: returns `{ partial: true, analytics: null }` with `eventsToday: 0` from spread defaults + +**`maxDuration` settings:** +| Route | maxDuration | +|-------|-------------| +| `/api/site-audit/run` | 800s | +| `/api/technical-audit/run` | 800s | +| `/api/cron/site-tag-rollup` | 300s | +| `/api/cron/ai-visibility` | 300s | +| `/api/cron/rank-check` | 300s | +| `/api/cron/ai-citation-check` | 300s | +| `/api/ai-strategist/chat` | 120s | +| `/api/keyword-research/analyze` | 120s | +| `/api/keyword-research/search` | 60s | +| `/api/performance-audit/run` | 60s | + +**`waitUntil` usage:** `/api/site-audit/run` keeps Lambda alive after 200 (commit `b62fdae`). + +### Rate limits + +**Site Tag ingest** (`src/lib/services/site-tag-cache.ts`): +- 100 events/min per siteId +- In-memory token bucket, resets every 60s +- Returns 200 on drop (not 429) to prevent client console flood + +**t.js error rate limit** (commit `f909229`): +- Counter-based per-session dedup for JS errors + +**Public audit** (`src/app/api/public-audit/route.ts`): +- 3 req/IP/hour + +### Rollup fast paths + +**`SiteTagDailyRollup` fast path** (`src/lib/services/site-tag-analytics.ts`): +- `_getTrafficSummaryUncached`, `_getConversionSummaryUncached`, `getOutboundClickSummary` +- Guard: `range === "30d" || range === "28d" || range === "7d"` (extended to 28d in commit `543f271`) +- Threshold: `rollupRows.length >= expectedDays - 1` +- Turns 1M+ row `TrackedEvent` group-by into a 30-row indexed lookup on `(brandId, date)` + +**Rollup cron** (`/api/cron/site-tag-rollup`, hourly `0 * * * *`, maxDuration 300s): +- Force-recomputes today + yesterday on every run +- Backfills last 30 days if row missing or `conversionsByType IS NULL` +- UTC midnight date key: `new Date(Date.UTC(y, m, d))` + +**Today rollup fast path (setup page)** (`src/app/api/site-tag/route.ts`): +- `siteTagDailyRollup.findFirst` for `eventsToday`, `eventBreakdown`, `sessionsToday` +- Falls back to live `TrackedEvent` only if row absent or `eventCountsByType` is null + +**activePagesCount bound** (commit `d6dfed4`): +- `COUNT(DISTINCT CASE ...)` bounded to `timestamp >= todayStart` (was 7 days) +- CASE expression cannot use an index regardless of window; the bound limits rows scanned + +### Dedup and dedup resolvers + +**`submissionId` token** (commit `5990d96`): +- `sessionStorage`-keyed token attached to `form_submit` +- 30-second fixed-from-first window prevents re-fire duplicates + +**Rapid-fire dedup query** (`/api/collect/route.ts`): +- `WHERE brandId = ? AND sessionId = ? AND pageUrl = ? AND conversionType = ? AND timestamp >= NOW() - 30s` +- Index: `@@index([brandId, sessionId, pageUrl, conversionType, timestamp])` + +**Phone call dedup** (commit `2d1c1b9`): +- Unified across Path A (`/api/collect`) and Path B (`/api/site-tag/conversion`) + +**Multi-source dedup (CanonicalEvent system)** (`src/lib/services/site-tag-reconciliation.ts`): +- `ingestSourceEvent()`: matches existing CanonicalEvent within +-5 min by eventType + pageUrl +- `reconcileTrackedEvents()`: fire-and-forget, max 500 TrackedEvents per call, NO date filter (R1) +- `getReconciliationSummary()`: all 9 queries bounded to 48h (commit `07e37ef`) + +**Deterministic dedup clustering** (`src/lib/conversions/dedup.ts`): +- SHA1-based `computeDedupKey()` for form/phone events +- Survivor selection: method priority -> touchpoint richness -> earliest timestamp +- `isDuplicateOf` pointer written; never hard-delete + +**Cron dedup** (`/api/cron/dedup-conversions`, daily): +- Processes unresolved conversions (`isDuplicateOf IS NULL`) +- Backfills `classifiedChannel` after dedup + +### Connection pool protection + +- `DATABASE_URL`: `connection_limit=20, pool_timeout=30` +- `SITE_TAG_SIDE_EFFECTS_ENABLED` flag (`src/app/api/collect/route.ts` line 43): gates all bounded-async side effects in ingest hot path (commit `8f5df21`) + +### Middleware exclusions + +Ingest beacon paths excluded from Next.js middleware matcher (commit `dad4b60`) to eliminate per-request middleware overhead. + +--- + +## 8. Customer-Facing Surfaces + +### Actions a customer can run + +| Surface | Action | Route | +|---------|--------|-------| +| Audit page | Trigger full site audit | `POST /api/site-audit/run` | +| Technical audit | Run Lighthouse + schema crawl | `POST /api/technical-audit/run` | +| AI Strategist | Send message | `POST /api/ai-strategist/chat` | +| AI Strategist | Load/save session | `StrategistSession` CRUD | +| Site Tag | Install snippet | `GET /api/site-tag/script/[name]` | +| Site Tag | Add/remove domain | `PATCH /api/site-tag` action=add_domain / remove_domain | +| Site Tag | Toggle active | `PATCH /api/site-tag` action=toggle_status | +| Site Tag | Regenerate key | `PATCH /api/site-tag` action=regenerate_key | +| Conversion config | Set per-type tier | `POST /api/brands/[id]/conversion-config` | +| Keyword Research | Search keywords | `POST /api/keyword-research/search` | +| Keyword Research | Analyze gap | `POST /api/keyword-research/analyze` | +| Keyword Research | Send to tracker | `POST /api/keyword-research/send-to-tracker` | +| Content Brief | Generate brief | `POST /api/content-briefs/generate` | +| Schema Generator | Generate JSON-LD | `POST /api/schema/generate-for-brief` | +| Execution Hub | Create/update/complete task | `POST/PATCH /api/tasks` | +| Integrations | Connect/disconnect | `/api/integrations/connect`, `/disconnect` | +| Email Reports | Create/edit schedule | `POST /api/email-reports` | +| Alert Rules | Create/edit alert | Alert CRUD endpoints | +| White-label | Configure portal | `PUT /api/white-label` | +| Client Portal | Invite client user | `POST /api/client-portal/users/invite` | +| AI Visibility | Add/manage queries | `/api/ai-visibility/queries` CRUD | +| AI Visibility | Trigger check | `POST /api/ai-visibility/check` | +| Competitors | Discover / add | `/api/competitors/discover` | +| Page Launch Tracker | Mark as launched | `POST /api/page-launches` | +| GSC | Backfill history | `POST /api/gsc/backfill` | + +### Downloadable reports + +| Report | Format(s) | Route | +|--------|-----------|-------| +| Full audit report | PDF (comprehensive 40-50pp + executive 6pp) | `GET /api/admin/audits/[id]/pdf?mode=comprehensive` | +| Report Studio custom | PDF, DOCX, Markdown, JSON | `POST /api/report-studio/export` | +| Report Studio PPTX | PPTX | `POST /api/report-studio/export/pptx` | +| Compliance export | JSON | `GET /api/admin/compliance/events` (admin-only) | +| Platform metrics | CSV/JSON | `GET /api/admin/export/platform-metrics` | + +### Site Tag event types (74 total) + +| Category | Events | +|----------|--------| +| Core | `page_view`, `session_start` | +| Forms | `form_start`, `form_submit` | +| Phone | `click_to_call`, `sms_click`, `phone_number_visible`, `call_tracking_detected` | +| Booking | `booking_submit` | +| Video | `video_play` | +| E-commerce | `purchase` (Shopify Web Pixel + standard) | +| Engagement | `outbound_click`, `file_download`, `pdf_opened`, `content_engagement` | +| Competitors | `competitor_visit`, `competitor_referral`, `competitive_journey` | +| UX Signals | `rage_click`, `dead_click`, `scroll_bounce` (via SiteEvent) | +| Performance | `web_vitals`, `slow_interaction`, `js_error`, `resource_error` | +| Custom | `plugin_detected`, `custom_event` | + +--- + +## 9. Schema and Crons + +### Prisma models (129 models, 268 indexes) + +**Core: Users and Orgs** +- `User` -- Clerk-synced, email, timezone, emailPrefs (JSON) +- `Organization` -- name, slug, plan +- `OrgMembership` -- userId + orgId unique +- `BrandMembership` -- per-brand role (owner|admin|member|viewer) + +**Brands** +- `Brand` -- domain, industry, locations[], primaryServices[], renderTier, isDemo, healthScore +- `BrandIntegration` -- integrationId, credentialsEnc (AES-256-GCM), tokenExpiresAt, status +- `BrandConversionConfig` -- per-type isCounted + tierOverride + displayLabel +- `BrandProfile` -- logoUrl, brandColors[], brandVoice, extractedAt +- `BrandAsset` -- filename, url, type, fileSize, dimensions + +**Analytics + Metrics** +- `MetricSnapshot` -- daily per-brand per-source (ga4|gsc|site_tag|daily|manual|seed) +- `ChannelMetric` -- daily per-channel (organic|ai_search|social|gbp|direct) +- `ConversionEvent` -- type, channel, value, landingPage + +**Site Tag (Real-Time)** +- `TrackedSite` -- siteId (`ms_` prefix), trackingKey (secret), allowedDomains[], customEvents (JSON), detectedPlatform (JSON: name/version/confidence/category/hosting) +- `TrackedSession` -- sessionId (unique), device, browser, country, city, channelGroup, predictedConversionScore +- `TrackedEvent` -- eventType, pageUrl, timestamp, synthetic, metadata (JSON) + - Indexes: `(trackedSiteId, eventType, timestamp)`, `(trackedSiteId, pageUrl, timestamp)`, `(trackedSiteId, timestamp)`, `(timestamp)` +- `SiteConversion` -- conversionType, visitorId, sessionId, pageUrl, formProvider, phoneNumber, touchpoints (JSON), conversionValue, orderId, lineItems (JSON), isDuplicateOf, invalidatedReason, classifiedChannel, submissionId + - Indexes: `(brandId, timestamp)`, `(brandId, isDuplicateOf)`, `(brandId, sessionId, pageUrl, conversionType, timestamp)` +- `HeatmapEvent` -- visitorId, sessionId, pageUrl, eventType, maxScrollPercent, sectionTimes (JSON), pageWidth/Height +- `RealUserMetric` -- lcp, cls, inp, ttfb, fcp, device, connection +- `SiteEvent` -- eventType (rage_click|dead_click|hesitation|exit_intent|js_error|outbound_click|...), eventData (JSON) + - Indexes: `(trackedSiteId, eventType, timestamp)`, `(sessionId, timestamp)` (commit `ecd5a48`) +- `SiteTagDailyRollup` -- brandId, date, pageViews, sessions, conversions, topPages (JSON), byReferrer (JSON), conversionsByType (JSON), conversionsByTier (JSON), eventCountsByType (JSON), outboundClickCount + - Unique: `(brandId, date)` +- `PageRecord`, `PageDailyMetric`, `NavSnapshot`, `PageSEOSnapshot` + +**Conversions + Dedup** +- `CanonicalEvent` -- eventType, pageUrl, timestamp, confidence (0-100), status (verified|inferred|unmatched) +- `SourceEvent` -- source (site_tag|ga4|gtm|gsc|crm), isDuplicate, rawData (JSON) + +**Audit + Analysis** +- `Audit` -- auditToken, sections (JSON), completedAt +- `AuditScoreHistory` -- healthScore, errorCount, warningCount +- `SiteAuditRun` -- status, taskId (DataForSEO), pagesProcessed, crawlError +- `SiteAuditPage` -- url, title, h1, wordCount, statusCode, crawlHealth +- `SiteAuditIssue` -- type, severity (error|warning|notice), affectedUrls (JSON), evidence (JSON), status +- `TechnicalAudit`, `TechnicalIssue`, `PerformanceAudit`, `PerformancePageScore` + +**AI Visibility + Market Position** +- `AiVisibilityCheck`, `AiVisibilityQuery`, `AiVisibilitySnapshot` +- `ProbeRun` -- vertical, locale, engine, status (enum ProbeRunStatus: PENDING|RUNNING|COMPLETED|FAILED), sampleCount +- `VisibilityObservation` -- probeRunId, query, engine, brandKey, mentioned, position, cited, sentiment, sourceUrls[], sampleIndex +- `CompetitorPanel` -- vertical, locale, members[]; unique `(vertical, locale)` +- `QueryCorpusEntry` -- vertical, locale, query, source (enum QuerySource: FRAGMENT_SEEDED|CATEGORY_COVERAGE|CURATED), conversionWeight +- `CalibrationRun` -- vertical, version, coefficients (JSON), fittedAt, sampleSize +- `MarketPositionSnapshot` -- brandId, vertical, locale, calibratedScore, conversionWeightedSov, rawSov, rankInPanel, panelSize, divergence, stabilityBand, computedAt + +**Execution + Content** +- `Task` -- title, category, status, priority, source, sourceId, dueDate, pipelineStage, briefId, assignedTo +- `ContentBrief` -- type (seo|llmo), status, primaryKeyword, sections (JSON), humanizationMode, contentScore +- `SchemaMarkup` -- type, markup (JSON-LD), appliedPages (JSON) + +**Page Lifecycle** +- `PageLaunch`, `PageLaunchSnapshot` -- baseline vs current GSC metrics +- `DeadPage`, `DeadPageSource` -- 404 detection + redirect suggestions + +**Competitors** +- `Competitor`, `CompetitorSnapshot`, `CompetitorRanking`, `CompetitorPage`, `CompetitorDiscoveryJob` + +**Backlinks** +- `Backlink` -- sourceDomain, anchorText, linkType, toxicityScore, qualityTier, status (active|lost|disavowed) +- `BacklinkSnapshot` -- totals, avgDA, toxicCount + +**GSC + GBP** +- `GscQuery`, `GscPage` -- daily click/impression/position +- `GbpLocation`, `GbpReview`, `GbpMetric` + +**Rank Tracking** +- `TrackedKeyword` -- keyword, location, device, isActive +- `KeywordRanking` -- position, previousPosition, serpFeatures[], source + +**CRM + Revenue** +- `CrmDeal`, `RevenueAttribution`, `UserJourney` + +**Email + Notifications** +- `EmailReportSchedule`, `SentEmailReport`, `AlertRule`, `Notification` + +**White-Label + Portal** +- `WhiteLabelConfig` -- orgId (unique), customDomain, logoUrl, primaryColor, removeMeseoBranding +- `CustomDomain` -- hostname (unique), status (enum DomainStatus: PENDING|VERIFIED|FAILED), verificationToken +- `ClientPortal` -- brandId (unique), allowedPages[], hideSourceBranding +- `ClientUser` -- email, role, status, accessToken + +**AI Strategist** +- `AnalysisJob` -- type, status, prompt, result (JSON), shareToken, clientVersion (JSON), hiddenSections (JSON) +- `StrategistSession`, `StrategistMessage` + +**Logging + Telemetry** +- `AiUsageLog` -- provider, model, feature, inputTokens, outputTokens, estimatedCost +- `AiInteraction` -- userId, brandId, feature, userPrompt (4KB), aiResponse (16KB), guardrailFlags[], flagSeverity +- `PlatformEvent`, `PlatformLog`, `ComplianceEvent` + +**Predictions + Other** +- `Prediction`, `DashboardSnapshot`, `IndustryBenchmark`, `AdCampaignData`, `AdClickEvent`, `AdPlatformIntegration` + +### Cron jobs (34 routes under `/api/cron/`) + +| Route | Schedule | maxDuration | Key models | Notes | +|-------|----------|-------------|------------|-------| +| `site-tag-rollup` | Hourly `0 * * * *` | 300s | TrackedEvent, SiteTagDailyRollup | Pre-aggregates last 30 days. Force-recomputes today+yesterday. Commit `3d1c64e`. | +| `site-audit-cleanup` | Every 5 min | -- | SiteAuditRun | Re-kicks stuck >15 min; fails >2 hours. Commit `6a69290`. | +| `rank-check` | Daily | 300s | TrackedKeyword, KeywordRanking | DataForSEO live SERP. Soft cap $5/day, hard cap 100 keywords/brand. | +| `ai-visibility` | Weekly `0 0 * * 1` | 300s | AiVisibilityQuery, AiVisibilitySnapshot | 7-source mention checks. | +| `signal-detection` | Hourly | -- | MetricSnapshot, ConversionEvent | Anomaly detection -> AlertRule -> Notification. | +| `dedup-conversions` | Daily | -- | SiteConversion | Deterministic cluster dedup + classifiedChannel backfill. | +| `ai-citation-check` | Weekly | 300s | AiCitation | Citation verification. | +| `backlink-sync` | Daily | -- | Backlink, BacklinkSnapshot | DataForSEO new/lost + toxicity scoring. | +| `gbp-sync` | Daily | -- | GbpLocation, GbpReview, GbpMetric | Google Business Profile sync. | +| `email-reports` | Per schedule (nextSendAt) | -- | EmailReportSchedule, SentEmailReport | Assemble + send scheduled reports. | +| `industry-intel` | Daily | -- | IndustryBriefing | External event correlation. | +| `competitor-crawl` | Weekly | -- | Competitor, CompetitorSnapshot | Sitemap monitoring, threat scoring. | +| `paid-media-rebuild` | Daily | -- | AdCampaignData | Ad spend + conversion reconciliation. | +| `track-outcomes` | Daily | -- | Task, RecommendationOutcome | ROI scoring for completed recommendations. | +| `ai-strategy-recommendations` | Weekly | -- | AnalysisJob | Re-generate AI recs for all brands. | +| `data-retention` | Daily | -- | TrackedEvent, SiteConversion, SiteEvent | Delete rows older than `brand.dataRetentionDays` (default 395 days). | +| `nango-sync` | Hourly | -- | BrandIntegration (Nango) | OAuth token refresh. | +| `refresh-tokens` | Daily | -- | BrandIntegration (Google) | Google OAuth refresh. | +| `check-alerts` | Every 5 min | -- | AlertRule, Notification | Evaluate rules, fire notifications. | +| `compute-benchmarks` | Weekly | -- | IndustryBenchmark | Platform-wide industry median aggregation. | +| `brand-health` | Daily | -- | Brand (healthScore) | Synthetic health score + email on decline. | +| `platform-snapshot` | 1st of month | -- | PlatformSnapshot | Monthly MAU/DAU/churn/feature-adoption archive. | +| `cleanup-stale-audits` | Daily | -- | Audit, TechnicalAudit | Delete stale >90 days. | +| `precompute-dashboard` | Every 30 min | -- | MetricSnapshot | Pre-aggregate KPIs with budget guard. Commit `c376913`. | +| `integration-sync` | Hourly | -- | BrandIntegration, GSC/GA4/GBP | Sync search data from connected integrations. | +| `signals-competitor-regional` | Hourly | -- | Competitor, CompetitorSnapshot | Regional threat detection. | +| `signals-site-tag-ai` | Hourly | -- | SiteConversion, TrackedSession | AI signal detection from behavioral data. | + +**Gaps and unknowns:** Schedule values are from comments in each route file; vercel.json was not read. `competitor-discovery-queue` and `brand-sitemap-crawl` exist but their schedules and enabled status were not confirmed. + +--- + +## 10. Risk Register + +Items not yet fully converted to rollup/bounded paths. + +### Active risks + +**R1 -- `reconcileTrackedEvents` is unbounded (fire-and-forget, pool risk)** +- File: `src/lib/services/site-tag-reconciliation.ts` lines 152-188 +- Fetches up to 500 `TrackedEvent` rows with NO date filter. For a high-volume brand, the oldest 500 rows are weeks/months old; each unmatched event fires 1 `findFirst` + 1-2 `create` = up to ~1500 serial round-trips. +- Status: Fire-and-forget (`void`) so it does not block HTTP response, but holds DB connections. +- Fix: Add `timestamp: { gte: window48h }` to the `findMany`. + +**R2 -- `SourceEvent` lacks a composite `(trackedSiteId, timestamp)` index** +- File: `prisma/schema.prisma` +- `SourceEvent` only has `@@index([trackedSiteId, source])` and `@@index([trackedSiteId, isDuplicate])`. The 48h bound (`07e37ef`) filters on `timestamp` but without a `(trackedSiteId, timestamp)` index, Postgres must post-filter. +- Risk level: Medium (48h bound still dramatically reduces scan; not as fast as it could be). +- Fix: Add `@@index([trackedSiteId, timestamp])` to `SourceEvent`. + +**R3 -- `hourlySample` findMany on TrackedEvent (setup page)** +- File: `src/app/api/site-tag/route.ts` +- `prisma.trackedEvent.findMany({ where: { trackedSiteId, timestamp >= todayStart }, take: 1000 })`. Runs on every 30s poll. +- `(trackedSiteId, timestamp)` index exists so this should be fast, but for very high volume brands the today-bounded scan still reads a large index range before the `take: 1000` stops it. +- Risk level: Low. Monitor via `?debugTiming=1`. + +**R4 -- customEventsList fallback: 90-day `TrackedEvent.groupBy`** +- File: `src/app/api/site-tag/route.ts` +- If `SiteTagDailyRollup` has no rows (new brand, cron lag), falls back to `trackedEvent.groupBy` over 90 days. +- Risk level: Low for established brands. High for new brands if cron is delayed. + +**R5 -- `domainStatus` per-domain count queries** +- File: `src/app/api/site-tag/route.ts` +- For each allowed domain: 2 parallel queries (`count` + `findFirst`). With `startsWith` (sargable on `(trackedSiteId, pageUrl, timestamp)` index) and `Promise.all`, this is acceptable for 1-3 domains. +- Risk level: Low for 1-3 domains. Medium for brands with 10+ allowed domains. + +**R6 -- Live `TrackedEvent` aggregate fallback when rollup missing** +- File: `src/lib/services/site-tag-analytics.ts` +- If `rollupRows.length < expectedDays - 1`, falls back to full-range `TrackedEvent` group-by scans. +- Risk level: Low for steady-state brands. Medium for brands recovering from cron failures. + +**R7 -- `getEventTrends` always runs live (intentional revert)** +- Commit: `40990aa revert(getEventTrends): remove rollup early-return, always run live query` +- 30-day `TrackedEvent.groupBy` per call. +- Risk level: Medium -- depends on call frequency and brand volume. + +**R8 -- `getSiteTagInstalledAt` and `getSiteTagMaturity` internals not confirmed** +- Called in `Promise.all` at end of setup page handler (outside `withDeadline`). +- Risk level: UNCONFIRMED. + +**R9 -- `site-tag-rollup` cron processes ALL brands serially** +- File: `src/app/api/cron/site-tag-rollup/route.ts` +- Outer loop: `for site of sites`, inner loop: `for date of datesToProcess`. 9 DB round-trips per iteration. At 100 brands x 30 days = 2700 iterations x 9 = 24,300 DB calls within 300s maxDuration. +- Risk level: Medium at scale. Would fail silently (partial rollup) if maxDuration hit. + +### Resolved risks (this session and prior) + +- `activePagesCount` 7-day unbounded CASE expression -- resolved `d6dfed4` +- `getReconciliationSummary` 9 unbounded full-table scans -- resolved `07e37ef` +- `recomputeSessionScore` in ingest hot path -- resolved `accf550` + +--- + +## 11. Patent Map + +### Site Tag ID system +**Status: WORKING IMPLEMENTATION** +- `public/t.js` + source `public/t.source.js` -- served from `/api/site-tag/script/[name]` +- Session stitching: `TrackedSession` with `predictedConversionScore` ML field +- Dedup: submissionId token, rapid-fire query, SHA1 clustering, `isDuplicateOf` pointer +- Attribution: `touchpoints JSON`, `firstTouchChannel`, `lastTouchChannel`, `classifiedChannel` +- Platform detection: `detectedPlatform` JSON on `TrackedSite` (name, version, confidence, category, hosting) +- Plugin detection: `plugin_detected` events with `plugins[]` payload + +### Multi-source dedup + CanonicalEvent +**Status: WORKING IMPLEMENTATION** +- `CanonicalEvent` + `SourceEvent` models; 5-source reconciliation (site_tag|ga4|gtm|gsc|crm) +- `ingestSourceEvent()`: +-5 min match window, confidence boosting (75 + sourceCount*8, max 100) +- `computeDedupKey()`: SHA1 hash, deterministic survivor selection +- Daily `dedup-conversions` cron for backfill +- Note: `reconcileTrackedEvents` still has unbounded oldest-first scan (R1) + +### Conversion funnel (multi-tier) +**Status: WORKING IMPLEMENTATION** +- `CONVERSION_TIERS` in `src/lib/conversions/tiers.ts`: 41 conversion types across 3 tiers (completed|intent|signal) +- `BrandConversionConfig`: per-type override (isCounted, tierOverride, displayLabel) +- `SiteConversion`: full funnel data including touchpoints, value, orderId, lineItems (JSON) +- Configure Conversions modal in Site Tag Analytics UI + +### AI Strategist +**Status: WORKING IMPLEMENTATION** +- `POST /api/ai-strategist/chat` (120s, claude-sonnet-4-6) +- Context: brand profile + GSC + Site Tag + AnalysisJob.result + paid media + LLMO +- Artifact renderer: JSX dashboard generation in iframe sandbox +- Session persistence + guardrail logging + +### AI Visibility / LLMO attribution +**Status: WORKING IMPLEMENTATION (base), PARTIAL (market position calibration)** +- `AiVisibilityCheck`, `AiVisibilityQuery`, `AiVisibilitySnapshot` -- fully wired +- Weekly cron, 7-source visibility checker using Anthropic `web_search_20250305` tool +- Market Position Block 1+2: schema + corpus seeding implemented (`cdb15a9`, `c735d74`) +- Calibration runner producing `MarketPositionSnapshot.calibratedScore`: **schema-only, no runner service confirmed** + +### Heatmap +**Status: WORKING IMPLEMENTATION** +- `HeatmapEvent` model, `POST /api/site-tag/heatmap`, `GET /api/site-tag/analytics/heatmap` +- UI tab on Site Tag Analytics + +### Execution Hub +**Status: WORKING IMPLEMENTATION** +- `Task` model: 7 categories, pipeline stage, briefId, assignedTo +- Calendar view + pipeline board +- AI explanations per task + +### Audit Runner (7-phase pipeline) +**Status: WORKING IMPLEMENTATION** +- 2038-line orchestration, 26 dimension aggregators, 7 synthesizers +- $4/$2 cost ceilings; prompt caching; degraded mode +- 14-industry lens, vendor confidentiality enforced + +### Report Studio +**Status: WORKING IMPLEMENTATION** +- Section reordering, custom assembly +- PDF, DOCX, Markdown, JSON, PPTX exports +- `@react-pdf/renderer` for audit PDFs (comprehensive + executive modes) + +### Multi-tenant / White-label +**Status: WORKING IMPLEMENTATION** +- `WhiteLabelConfig`: per-org logo, colors, domain, removeMeseoBranding +- `CustomDomain`: PENDING|VERIFIED|FAILED with Vercel domain integration +- `ClientPortal`: allowedPages[], hideSourceBranding, per-user roles + +### Local GEO +**Status: SCHEMA + CRON READY, UI STUBBED** +- `GbpLocation`, `GbpReview`, `GbpMetric` + daily `gbp-sync` cron active +- `/local-geo` intentionally shows "Coming Soon" +- Local ranking and AI search citation at location level: ABSENT + +**Gaps and unknowns:** +- Market Position calibration runner: Block 3+ (models + seeding exist, runner not found) +- `PageLaunchSnapshot` data population mechanism (GSC direct vs MetricSnapshot): UNCONFIRMED +- Inngest: infrastructure only, no production functions beyond ping +- Voice search synthesizer call path not fully traced from audit-runner.ts + +--- + +*End of inventory. All code paths confirmed via file reads or agent exploration unless marked UNCONFIRMED or ABSENT. Commit hashes reference dmazzei-star/meseo main branch as of 2026-06-10 HEAD 07e37ef.* diff --git a/docs/phase-30-site-tag-detection-expansion.md b/docs/phase-30-site-tag-detection-expansion.md new file mode 100644 index 0000000..ab87f61 --- /dev/null +++ b/docs/phase-30-site-tag-detection-expansion.md @@ -0,0 +1,219 @@ +# Phase 30: Site Tag Detection Registry Expansion + +**Status:** Session 2 complete (commit in progress) +**Effort:** 6 hours across 3 sessions (3h + 2h + 1h) +**Risk:** Medium. Touches Site Tag JavaScript running on every client site. + +> Full spec content lives in Claude conversation dated May 22-25, 2026. +> This file is a structured summary derived from that conversation. + +--- + +## Problem Statement + +The meSEO Site Tag detected approximately 20 plugins across two categories +(booking widgets and chat widgets). A modern WordPress or CMS site typically +has 15-30 trackable integrations. Coverage was roughly 25% of what is +actually present on a typical brand site. + +Confirmed via production data on May 22, 2026: +- modernheartandvascular.com (cardiology): 4 plugins detected out of ~15-25 present +- lifeimagingfla.com (imaging): 1 plugin detected out of ~8-15 present + +After Phase 30 Session 1: cardiology brand shows 11 detected plugins. + +--- + +## Goal + +1. Site Tag detects 50-80 known plugins, widgets, pixels, and integrations +2. Each detection fires a `plugin_detected` event with consistent metadata + including `category`, `tag_v`, and `confidence` +3. Integrations tab on Site Tag Analytics shows comprehensive per-brand inventories +4. Adding new detection patterns is a small registry edit + +--- + +## Architecture + +Detection happens entirely in `public/t.js` (served from Next.js static directory). +The unminified source lives at `public/t.source.js` (gitignored). + +**Edit workflow:** +```bash +cp public/t.source.js public/t.js # copy source to served file +# edit public/t.js +npm run build:site-tag # minifies in place, backs up to t.source.js +``` + +**Three registries in `public/t.source.js`:** + +| Registry | Location | Category | Count | Event shape | +|---|---|---|---|---| +| `BOOKING_PLUGINS` | ~line 5832 | booking, forms, crm | 15 entries | `{plugin, plugin_key, category, tag_v, confidence}` | +| `CHAT_WIDGETS` | ~line 6416 | chat | 15 entries | `{plugin, plugin_key: "chat_"+key, category: "chat", tag_v, confidence}` | +| `ANALYTICS_PLUGINS` | ~line 6659 | analytics, pixel, seo, page_builder, ecommerce, crm, reviews, cache, security, booking, lead_gen | ~47 entries after Session 2 | `{plugin, plugin_key, category, tag_v, confidence}` | + +**Event metadata shape (all registries after Phase 30 Session 1 fix):** +```js +sendEvent('plugin_detected', { + plugin: 'Google Analytics 4', // display name + plugin_key: 'ga4', // machine key + category: 'analytics', // category string + tag_v: '2026.05.31', // Site Tag version (bump on each deploy) + confidence: 'high' | 'medium', // detection confidence +}); +``` + +--- + +## Existing Registries (do NOT modify these in Phase 30) + +### BOOKING_PLUGINS keys +amelia, calendly, nexhealth, acuity, jotform, typeform, wpforms, +gravityforms, contactform7, hubspot, deardoc, birdeye, podium, weave + +### CHAT_WIDGETS keys +intercom, drift, tidio, tawkto, livechat, crisp, olark, hubspot_chat, +zendesk, fb_messenger, smartsupp, jivochat, purechat, userlike, frontchat + +--- + +## ANALYTICS_PLUGINS Entries + +### Session 1 (20 entries, commit cdb096f) + +**Analytics and pixels (12):** +ga4, gtm, ua_legacy, fb_pixel, linkedin_insight, tiktok_pixel, +twitter_pixel, pinterest_tag, reddit_pixel, clarity, hotjar, amplitude + +**SEO (3):** wordpress, yoast, rankmath + +**Page builders (1):** elementor + +**E-commerce (1):** woocommerce + +**CRM (3):** hubspot_track, klaviyo, mailchimp + +### Session 2 (~27 additional entries) + +**Forms (2):** formidable, fluent_forms + +**Page builders (4):** divi, beaver_builder, brizy, bricks + +**Booking (4):** bookly, bookingpress, simplybook, setmore + +**Reviews (3):** trustpilot, google_reviews_widget, nicejob + +**Cache (2):** wp_rocket, litespeed_cache + +**Security (2):** wordfence, sucuri + +**Healthcare-specific (2):** patientpop, doctible + +**SEO (2):** aioseo, seopress + +**E-commerce (2):** shopify, edd + +**CRM (2):** activecampaign, convertkit + +**Skipped (already covered):** +- mailchimp: already in ANALYTICS_PLUGINS +- olark: already in CHAT_WIDGETS (fires as "chat_olark") +- zendesk_chat: already in CHAT_WIDGETS (fires as "chat_zendesk") +- hs_conversations: already in CHAT_WIDGETS (fires as "chat_hubspot_chat") + +--- + +## Detection Strategies + +### Window global +```js +detect: () => typeof window.fbq === 'function' +``` + +### Script src match (uses cached getScriptSrcs()) +```js +detect: () => /googletagmanager\.com\/gtm\.js/.test(getScriptSrcs()) +``` + +### DOM selector +```js +detect: () => !!document.querySelector('.gform_wrapper') +``` + +### Meta tag +```js +detect: () => { + const meta = document.querySelector('meta[name="generator"]'); + return !!(meta && /Yoast SEO/.test(meta.getAttribute('content') || '')); +} +``` + +### Cookie name (uses cached getCookies()) +```js +detect: () => /_fbp=/.test(getCookies()) +``` + +### Composite (high confidence) +```js +detect: () => { + const hasGlobal = typeof window.fbq === 'function'; + const hasCookie = /_fbp=/.test(getCookies()); + if (hasGlobal && hasCookie) return { matched: true, confidence: 'high' }; + if (hasGlobal || hasCookie) return { matched: true, confidence: 'medium' }; + return false; +} +``` + +--- + +## Performance Constraints + +- Detection total work: target under 5ms on mid-range mobile +- `requestIdleCallback` for post-DOMContentLoaded run (5000ms fallback) +- Skip detection if `document.hidden` is true +- `getScriptSrcs()` iterates `document.scripts` once per detection pass (cached) +- `getCookies()` reads `document.cookie` once per detection pass (cached) +- `window.__meseoDetectedKeys` Set prevents any plugin_key firing more than once per page load +- Detection runs at most twice: DOMContentLoaded + requestIdleCallback(timeout: 5000) + +--- + +## Backend: ENRICHMENT_REGISTRY + +Location: `src/lib/site-tag/integration-signatures.ts` + +Provides vendor info, descriptions, and category defaults for backfill. +Keyed by `plugin_key`. Consulted by: +1. `backfill-detected-integrations` route when resolving category/vendor +2. `site-tag-analytics/integrations` GET route when merging description into response + +--- + +## Phase Sessions + +| Session | Status | Commit | Description | +|---|---|---|---| +| Session 1 | Complete | cdb096f | 20 ANALYTICS_PLUGINS rules, BOOKING_PLUGINS category fix, tag_v + confidence fields | +| Session 2 | Complete | (current) | ~27 additional rules, backend enrichment, docs | +| Session 3 | Pending | - | UI polish, category icons, vendor logos | + +--- + +## Acceptance Criteria + +- Site Tag detects at least 8 distinct plugins on modernheartandvascular.com (was 4) +- Site Tag detects at least 5 distinct plugins on an active lawn care brand site +- No false positives on a clean test site +- All `plugin_detected` events include `category`, `tag_v`, and `confidence` +- Detection adds less than 10ms to page load p95 +- Integrations tab shows expanded set per brand within 24 hours of deploy + +--- + +## Dependencies + +- Phase 28A Session 1.5 (backend backfill fix): SHIPPED at commit 058272e +- Phase 28A Session 1.6 (SQL aggregation backfill): SHIPPED at commit 30363ed +- Phase 28A Session 2 (real-time write hook to /api/site-tag/event): PENDING diff --git a/meSEO-Migration-Runbook.txt b/meSEO-Migration-Runbook.txt new file mode 100644 index 0000000..63841de --- /dev/null +++ b/meSEO-Migration-Runbook.txt @@ -0,0 +1,146 @@ +meSEO Migration Runbook +Vercel to Self-Hosted (Gitea + Coolify) +Prepared for the meSEO team. Two-phase plan. Phase 1 stands the app up on staging and is done before the Wednesday demo. Phase 2 moves production traffic, including the tracking tag, off Vercel, and happens after the demo. + +Ground Rules (read first) +? Do not touch app.meseoapp.com during Phase 1. That hostname serves the tracking tag to every client site and receives their event traffic. Phase 1 uses a separate staging hostname, app2.meseoapp.com, so no client is affected. +? Keep the database on Neon. We move the app only and point it at the same database. There is no data migration in this project. +? Secrets are not printed in this document. Copy each secret value directly from the Vercel project (Settings, Environment Variables) into Coolify. Do not paste live keys into shared docs or chat. +? Do not click any /api/admin/backfill endpoint during setup or the demo. Those write to production data. Normal dashboard browsing is read-only and safe. +? Leave the Vercel deployment intact until Phase 2 is proven. It is our instant rollback. +What We Are Building +meSEO is a Next.js app using Prisma, Neon Postgres, and Clerk auth. It runs on Vercel today. We are deploying the same app as a Docker container on our own server through Coolify, with the code hosted in Gitea. Phase 1 stands it up on staging, pointed at the real database, so it can be demoed independently of Vercel. Phase 2 moves production traffic, including the client tracking tag, off Vercel. +Phase 1 - Stand Up meSEO on Staging (before Wednesday) +Prerequisites +? Server with Coolify running (already in place) and at least 8 GB RAM free for the build. This is a large Next build and fails on undersized boxes. +? Gitea running (already in place). +? Access to the Vercel project to copy environment variable values. +? DNS control for meseoapp.com. +Step 1 - Push the repo to Gitea +From the local meseo clone, add Gitea as a remote and push main: + +git remote add gitea +git push gitea main + +Confirm in Gitea that the meseo repo shows the latest commit and that the Dockerfile is present at the repo root. +Step 2 - Confirm the container files are in the repo +The repo needs a Dockerfile at the root and output: 'standalone' in the Next config. If they are not there yet, add the files below, set the config option, commit on main, and push to Gitea. +Dockerfile + +FROM node:22-slim AS deps +WORKDIR /app +RUN apt-get update && apt-get install -y openssl ca-certificates && rm -rf /var/lib/apt/lists/* +COPY package.json package-lock.json ./ +COPY prisma ./prisma +RUN npm ci + +FROM node:22-slim AS build +WORKDIR /app +RUN apt-get update && apt-get install -y openssl ca-certificates && rm -rf /var/lib/apt/lists/* +COPY --from=deps /app/node_modules ./node_modules +COPY . . +RUN npx prisma generate +RUN npm run build + +FROM node:22-slim AS runner +WORKDIR /app +RUN apt-get update && apt-get install -y openssl ca-certificates && rm -rf /var/lib/apt/lists/* +ENV NODE_ENV=production +ENV PORT=3000 +ENV HOSTNAME=0.0.0.0 +COPY --from=build /app/public ./public +COPY --from=build /app/.next/standalone ./ +COPY --from=build /app/.next/static ./.next/static +COPY --from=build /app/prisma ./prisma +COPY --from=build /app/node_modules/.prisma ./node_modules/.prisma +COPY --from=build /app/node_modules/@prisma/client ./node_modules/@prisma/client +EXPOSE 3000 +CMD ["node", "server.js"] + +.dockerignore + +node_modules +.next +.git +.env* +Dockerfile +.dockerignore +npm-debug.log + +In the Next config, add: output: 'standalone' +Step 3 - Create the deploy key (Gitea authorization) +Coolify pulls the private repo using an SSH deploy key. Do not reuse the Korrith key unless its public half is already added to the meseo repo. Cleanest path: +? In Coolify, generate a new private key named meseo-deploy. Copy its public key. +? In Gitea: open the meseo repo, Settings, Deploy Keys, Add Deploy Key, paste the public key, read access is enough, save. +? Back in Coolify, select meseo-deploy. +Step 4 - Create the application in Coolify +? New Resource, Applications, Git Based, Private Repository (with Deploy Key). Clear the search box first, or Coolify shows service templates instead of deploy options. +? Select the meseo-deploy key. +? Repository: the Gitea meseo repo. Branch: main. +? Build Pack: Dockerfile. Path: /Dockerfile. +? Port: 3000. +? Do not deploy yet. Add environment variables and the domain first. +Step 5 - Environment variables +Add every variable from the Vercel project, copying secret values directly from Vercel. Apply these rules: +? Change for staging: set NEXT_PUBLIC_API_URL and NEXT_PUBLIC_APP_URL to https://app2.meseoapp.com. +? Leave the two tracker URLs as they are for Phase 1 (NEXT_PUBLIC_TRACKER_SCRIPT_URL, NEXT_PUBLIC_COLLECT_ENDPOINT). Do not repoint live client tracking yet. +? Every NEXT_PUBLIC_ variable is build-time. It must be set as a build variable before the image builds, or it ships blank. +? Everything else carries over unchanged, same values as Vercel, including DATABASE_URL and DIRECT_URL (same Neon endpoint). +The full variable table is at the end of this document. +Step 6 - Domain and DNS +? Add a DNS A record: app2.meseoapp.com to the server's public IP. Keep it DNS-only (no proxy) for now so Coolify can issue its TLS certificate cleanly. +? In Coolify, set the application domain to https://app2.meseoapp.com. +Step 7 - Provider allowlists (or login fails) +? Clerk: add app2.meseoapp.com to the allowed origins for the live instance. +? Google OAuth (Google Cloud Console): add app2's redirect URI (https://app2.meseoapp.com plus the app's Google callback path) to the authorized redirect URIs. +Step 8 - Deploy and verify +? Trigger the deploy. Watch the build logs. The build produces .next/standalone/server.js. +? Open https://app2.meseoapp.com, sign in. +? Load Site Tag Analytics and AI Visibility. Real data should render because it is the same Neon database. +? Do not click admin backfill endpoints. +? If the dashboards render, Phase 1 is complete. This is the Wednesday demo environment. +Phase 2 - Production Cutover (after Wednesday, not before) +Do not start this until the demo is done. Each step below carries client-visible risk. +? Cloudflare in front. Put Cloudflare in front of the production app hostname and cache the tag script at the edge, so ingestion volume is absorbed before it reaches the server. +? Repoint the tracking tag. Today NEXT_PUBLIC_TRACKER_SCRIPT_URL and NEXT_PUBLIC_COLLECT_ENDPOINT point at meseo-staging.vercel.app. That is a live dependency on Vercel. Move them to a domain we control, rebuild, and confirm clients pick up the new tag. This is the highest-risk item, do it deliberately. +? Re-point cron and background jobs. Recreate each Vercel Cron as a Coolify scheduled task hitting the same route on the same schedule, and verify each one fires. If Inngest is used, re-point its serve URL and keys. +? Move Blob storage. BLOB_READ_WRITE_TOKEN is a Vercel Blob token. Anything using it must move to a storage backend we control, or those features break after leaving Vercel. +? Confirm Redis. Check where REDIS_URL points. If it is a Vercel-linked store, move or re-point it. +? Load test. Test the tag and collect endpoints under real concurrency against the new box before cutover. +? Cut over DNS. Lower the app.meseoapp.com TTL to 60 seconds a day ahead. Cut over during a low-traffic window. Watch events land in Neon live. Keep Vercel intact as instant rollback. +? Decommission Vercel only after days of stability. Note: decommissioning does not clear the outstanding Vercel balance, that is settled separately. +Watch-Outs Specific to This App +? Tracker tag points at Vercel. The production tag currently loads from meseo-staging.vercel.app. When Vercel is paused or removed, client tracking breaks. Repointing this is the core Phase 2 task. +? Vercel Blob. The blob token only works while Vercel Blob is the store. Move upload storage in Phase 2. +? Redis host. Confirm the Redis URL points to a store the new server can reach. +? Cron. The nightly rollup and any other scheduled jobs must be recreated as Coolify scheduled tasks. They do not come across automatically. +? Build memory. The Next build needs real RAM (8 GB comfortable). Undersized servers fail the build. +? Build-time publics. All NEXT_PUBLIC_ vars must be set as build variables, or the bundle ships with blank values. +Troubleshooting Quick Reference +? Coolify cannot pull the repo: the deploy key's public half is not on the meseo repo in Gitea. Add it under repo Settings, Deploy Keys. +? Build fails, out of memory: increase server RAM or build resources. +? Login redirect error or loop: app2 not added to Clerk allowed origins, or NEXT_PUBLIC_APP_URL not set to app2 at build time. +? Google sign-in redirect_uri_mismatch: app2 redirect URI not added in Google Cloud console. +? Dashboards load but show no data: DATABASE_URL not carried over correctly. Confirm it matches Vercel exactly. +? Blank NEXT_PUBLIC values in the browser: those vars were set as runtime only. Set them as build variables and redeploy. +Do NOT Add These (Vercel-specific) +Some variables only exist because the app ran on Vercel. Do not copy these into Coolify. Some are injected by the platform automatically, others tie a feature to a Vercel-hosted service that has to move before the variable is valid on our own server. +Skip entirely (Vercel-injected, do not recreate) +? Any variable beginning with VERCEL_ (for example VERCEL_URL, VERCEL_ENV, VERCEL_REGION, VERCEL_GIT_*). Vercel sets these at runtime. They will not exist on our server, and recreating them by hand is wrong. If any code reads VERCEL_URL to build a link, that code should use NEXT_PUBLIC_APP_URL instead. Flag it if a build error points at a missing VERCEL variable. +? Any NEXT_RUNTIME or edge-runtime hints that were set for Vercel's serverless split. We run one long-lived Node server, they do not apply. +Do not carry over as-is (Vercel-hosted services, migrate first) +? BLOB_READ_WRITE_TOKEN. This is a Vercel Blob token and only works while Vercel Blob is the store. For Phase 1 staging it can stay so uploads do not error, but it is not a keep-forever value. Move the storage in Phase 2, then replace this. +? REDIS_URL and DIRECT_URL, only if the Redis or database URL points at a Vercel-provided integration (a Vercel-managed Upstash or Postgres). Our DATABASE_URL is Neon and stays. Confirm the Redis host is one our server can reach before trusting it; if it is a Vercel-linked store, it has to move or be re-pointed. +Everything not listed here carries over normally, per the table below. +Environment Variable Reference +Copy secret values directly from the Vercel project. Do not paste live secret values into this document or any shared copy. +Variable Scope Action NEXT_PUBLIC_API_URL All CHANGE to https://app2.meseoapp.com. Build-time. NEXT_PUBLIC_APP_URL All CHANGE to https://app2.meseoapp.com. Build-time. NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY All Keep. Build-time. NEXT_PUBLIC_GOOGLE_PAGESPEED_API_KEY All Keep. Build-time. NEXT_PUBLIC_TRACKER_SCRIPT_URL All Keep for Phase 1. Repoint in Phase 2. Build-time. NEXT_PUBLIC_COLLECT_ENDPOINT All Keep for Phase 1. Repoint in Phase 2. Build-time. NEXT_PUBLIC_CLERK_SIGN_IN_URL All Keep. Build-time. NEXT_PUBLIC_CLERK_SIGN_UP_URL All Keep. Build-time. DATABASE_URL All Keep. Same Neon endpoint. Copy from Vercel. DIRECT_URL Prod/Preview Keep. Copy from Vercel. REDIS_URL Prod/Preview Keep. Confirm the host is reachable from the server (Phase 2). CLERK_SECRET_KEY Prod Keep. Also add app2 to Clerk allowed origins. OPENAI_API_KEY Prod Keep. PERPLEXITY_API_KEY Prod/Preview Keep. GOOGLE_AI_STUDIO_API_KEY Prod/Preview Keep. BING_SEARCH_API_KEY Prod/Preview Keep. BRAVE_SEARCH_API_KEY Prod/Preview Keep. BROWSERLESS_API_KEY Prod/Preview Keep. FIRECRAWL_API_KEY Prod/Preview Keep. DATAFORSEO_LOGIN All Keep. DATAFORSEO_PASSWORD Prod Keep. GOOGLE_CLIENT_ID All Keep. Add app2 redirect URI in Google Cloud console. GOOGLE_CLIENT_SECRET Prod Keep. GOOGLE_PAGESPEED_API_KEY Prod Keep. INTEGRATION_ENCRYPTION_KEY Prod Keep. Must match the value that encrypted stored tokens. BLOB_READ_WRITE_TOKEN All Keep for now. Vercel-bound storage, move in Phase 2. ADMIN_SECRET Prod Keep. ADMIN_EMAILS All Keep. CRON_SECRET Prod Keep. SMTP_HOST / PORT / USER / PASS / FROM Prod/Preview Keep. BYPASS_PUBLIC_AUDIT_VERIFICATION Prod/Preview Keep. Confirm intended value. SITE_TAG_SIDE_EFFECTS_ENABLED Prod/Preview Keep. Confirm it reads true on the new box. AI_MODEL_ID All Keep. MESEO_ENV All Keep. Currently 'staging'; note this is the production project. FEATURE_AI_AVATAR / FEATURE_SITE_TAG / FEATURE_BILLING All Keep. DEBUG_MODE All Keep (false). +Sign-Off Checklist (Phase 1) +? [ ] Repo pushed to Gitea, Dockerfile present at root +? [ ] Deploy key added to the meseo repo in Gitea +? [ ] Coolify app created, build pack Dockerfile, port 3000 +? [ ] All env vars entered; app2 URLs changed; NEXT_PUBLIC set as build vars +? [ ] app2.meseoapp.com DNS record live +? [ ] Clerk origin and Google redirect URI added for app2 +? [ ] Deploy green; dashboards render real data +? [ ] Vercel left intact as rollback diff --git a/next-env.d.ts b/next-env.d.ts new file mode 100644 index 0000000..4f11a03 --- /dev/null +++ b/next-env.d.ts @@ -0,0 +1,5 @@ +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/next.config.mjs b/next.config.mjs new file mode 100644 index 0000000..ce76de5 --- /dev/null +++ b/next.config.mjs @@ -0,0 +1,23 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = { + output: 'standalone', + experimental: { + serverComponentsExternalPackages: ['@mendable/firecrawl-js', 'pdf-parse', '@napi-rs/canvas'], + }, + env: { + NEXT_PUBLIC_VERCEL_GIT_COMMIT_SHA: process.env.VERCEL_GIT_COMMIT_SHA || "dev", + NEXT_PUBLIC_TAG_VERSION: process.env.VERCEL_GIT_COMMIT_SHA?.slice(0, 8) || "dev", + }, + async headers() { + return [ + { + source: "/t.js", + headers: [ + { key: "Cache-Control", value: "public, max-age=300, s-maxage=300, stale-while-revalidate=3600" }, + ], + }, + ]; + }, +}; + +export default nextConfig; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..e6b39e7 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,12751 @@ +{ + "name": "meseo", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "meseo", + "version": "0.1.0", + "dependencies": { + "@anthropic-ai/sdk": "^0.97.1", + "@clerk/nextjs": "^7.1.0", + "@dnd-kit/core": "^6.3.1", + "@dnd-kit/sortable": "^10.0.0", + "@dnd-kit/utilities": "^3.2.2", + "@mendable/firecrawl-js": "^4.24.1", + "@nangohq/frontend": "^0.70.1", + "@nangohq/node": "^0.70.1", + "@napi-rs/canvas": "^0.1.0", + "@prisma/client": "^5.22.0", + "@react-pdf/renderer": "^4.5.1", + "@sparticuz/chromium": "^147.0.0", + "@tailwindcss/postcss": "^4.2.2", + "@vercel/blob": "^2.4.0", + "@vercel/functions": "^3.6.0", + "bcryptjs": "^3.0.3", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.1", + "docx": "^9.6.1", + "fast-xml-parser": "^5.5.12", + "image-size": "^2.0.2", + "inngest": "^4.5.0", + "jsonrepair": "^3.14.0", + "lucide-react": "^0.400.0", + "next": "14.2.5", + "nodemailer": "^8.0.5", + "pdf-parse": "^2.4.5", + "pg": "^8.21.0", + "pptxgenjs": "^4.0.1", + "puppeteer-core": "^24.40.0", + "react": "^18", + "react-dom": "^18", + "react-markdown": "^9.1.0", + "recharts": "^3.8.1", + "redis": "^5.12.1", + "remark-gfm": "^4.0.1", + "resend": "^6.12.3", + "sharp": "^0.34.5", + "tailwind-merge": "^2.4.0", + "zod": "^4.4.3" + }, + "devDependencies": { + "@types/bcryptjs": "^2.4.6", + "@types/node": "^20", + "@types/nodemailer": "^8.0.0", + "@types/pg": "^8.20.0", + "@types/react": "^18", + "@types/react-dom": "^18", + "autoprefixer": "^10.0.1", + "esbuild": "^0.28.0", + "eslint": "^8", + "eslint-config-next": "14.2.5", + "husky": "^9.1.7", + "postcss": "^8", + "prisma": "^5.22.0", + "tailwindcss": "^3.4.1", + "typescript": "^5" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@anthropic-ai/sdk": { + "version": "0.97.1", + "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.97.1.tgz", + "integrity": "sha512-wOf7AUeJPitcVpvKO4UMu63mWH5SaVipkGd7OOQJt/G6VYGlV8D2Gp9dLxOrttDJh/9gqPqdaBwDGcBevumeAg==", + "license": "MIT", + "dependencies": { + "json-schema-to-ts": "^3.1.1", + "standardwebhooks": "^1.0.0" + }, + "bin": { + "anthropic-ai-sdk": "bin/cli" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", + "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bufbuild/protobuf": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.12.0.tgz", + "integrity": "sha512-B/XlCaFIP8LOwzo+bz5uFzATYokcwCKQcghqnlfwSmM5eX/qTkvDBnDPs+gXtX/RyjxJ4DRikECcPJbyALA8FA==", + "license": "(Apache-2.0 AND BSD-3-Clause)" + }, + "node_modules/@clerk/backend": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/@clerk/backend/-/backend-3.2.9.tgz", + "integrity": "sha512-59h6F9wo4RrulOUh9u3Dm35VHA6k86OwU8qL4giaAMKpWcsKS+zAI7GFgVAvEMDWXam8DyTKy4/npOFT2dWlAg==", + "license": "MIT", + "dependencies": { + "@clerk/shared": "^4.7.0", + "standardwebhooks": "^1.0.0", + "tslib": "2.8.1" + }, + "engines": { + "node": ">=20.9.0" + } + }, + "node_modules/@clerk/nextjs": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@clerk/nextjs/-/nextjs-7.1.0.tgz", + "integrity": "sha512-DrvCTKmc9vECjopYW6IDXP70ltVrvpNUwRzP0nlQOCrwMBhYaC/7t1HijvzzPaPcMQ7p3A7xeYwL1ffqize1zQ==", + "license": "MIT", + "dependencies": { + "@clerk/backend": "^3.2.9", + "@clerk/react": "^6.3.0", + "@clerk/shared": "^4.7.0", + "server-only": "0.0.1", + "tslib": "2.8.1" + }, + "engines": { + "node": ">=20.9.0" + }, + "peerDependencies": { + "next": "^15.2.8 || ^15.3.8 || ^15.4.10 || ^15.5.9 || ^15.6.0-0 || ^16.0.10 || ^16.1.0-0", + "react": "^18.0.0 || ~19.0.3 || ~19.1.4 || ~19.2.3 || ~19.3.0-0", + "react-dom": "^18.0.0 || ~19.0.3 || ~19.1.4 || ~19.2.3 || ~19.3.0-0" + } + }, + "node_modules/@clerk/react": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@clerk/react/-/react-6.3.0.tgz", + "integrity": "sha512-etqEqdP5WlVn1Bb1NF2Drgvn3UzBSXmrkKtluObTQeqOoCsTO0uFv40oDi7QBs9WQWY1tvavI5aIHzY+uHKcdw==", + "license": "MIT", + "dependencies": { + "@clerk/shared": "^4.7.0", + "tslib": "2.8.1" + }, + "engines": { + "node": ">=20.9.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ~19.0.3 || ~19.1.4 || ~19.2.3 || ~19.3.0-0", + "react-dom": "^18.0.0 || ~19.0.3 || ~19.1.4 || ~19.2.3 || ~19.3.0-0" + } + }, + "node_modules/@clerk/shared": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@clerk/shared/-/shared-4.7.0.tgz", + "integrity": "sha512-pm2dpxHS2teY87jmpatprG2uBAuuXuHHWvuezL3a5pRoUiIWXgWlLvwRZRgKXwDeIkIT9UCAIQBkcjueSEzqHA==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@tanstack/query-core": "5.90.16", + "dequal": "2.0.3", + "glob-to-regexp": "0.4.1", + "js-cookie": "3.0.5", + "std-env": "^3.9.0" + }, + "engines": { + "node": ">=20.9.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ~19.0.3 || ~19.1.4 || ~19.2.3 || ~19.3.0-0", + "react-dom": "^18.0.0 || ~19.0.3 || ~19.1.4 || ~19.2.3 || ~19.3.0-0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@dnd-kit/accessibility": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@dnd-kit/accessibility/-/accessibility-3.1.1.tgz", + "integrity": "sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@dnd-kit/core": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@dnd-kit/core/-/core-6.3.1.tgz", + "integrity": "sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==", + "license": "MIT", + "dependencies": { + "@dnd-kit/accessibility": "^3.1.1", + "@dnd-kit/utilities": "^3.2.2", + "tslib": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@dnd-kit/sortable": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@dnd-kit/sortable/-/sortable-10.0.0.tgz", + "integrity": "sha512-+xqhmIIzvAYMGfBYYnbKuNicfSsk4RksY2XdmJhT+HAC01nix6fHCztU68jooFiMUB01Ky3F0FyOvhG/BZrWkg==", + "license": "MIT", + "dependencies": { + "@dnd-kit/utilities": "^3.2.2", + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@dnd-kit/core": "^6.3.0", + "react": ">=16.8.0" + } + }, + "node_modules/@dnd-kit/utilities": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@dnd-kit/utilities/-/utilities-3.2.2.tgz", + "integrity": "sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.0.tgz", + "integrity": "sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@grpc/grpc-js": { + "version": "1.14.4", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.4.tgz", + "integrity": "sha512-k9Dj3DV/itK9D06Y8f190Qgop7/Ui+D0njFV3LHMPwPT75DpXLQohE9Wmz0QElrJnzsjB7KPWiKJbOl7IPDArQ==", + "license": "Apache-2.0", + "dependencies": { + "@grpc/proto-loader": "^0.8.0", + "@js-sdsl/ordered-map": "^4.4.2" + }, + "engines": { + "node": ">=12.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.8.1.tgz", + "integrity": "sha512-wtF6h+DY6M3YaDBPAmvuuA6jV8Sif9MjtOI5euKFWRgCDl5PeDpPsHR9u2l6St5ceY8AZgoNDww5+HvEsXFsGg==", + "license": "Apache-2.0", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.5.5", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@img/colour": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/@inngest/ai": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/@inngest/ai/-/ai-0.1.7.tgz", + "integrity": "sha512-5xWatW441jacGf9czKEZdgAmkvoy7GS2tp7X8GSbdGeRXzjisHR6vM+q8DQbv6rqRsmQoCQ5iShh34MguELvUQ==", + "license": "Apache-2.0", + "dependencies": { + "@types/node": "^22.10.5", + "typescript": "^5.7.3" + } + }, + "node_modules/@inngest/ai/node_modules/@types/node": { + "version": "22.19.20", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.20.tgz", + "integrity": "sha512-6tELRwSDYWW9EdZhbeZmYGZ1/7Djkt+Ah3/ScEYT9cDord7UJzasR/4D3VONg9tQI5CDp+/CZC1AXj2pCFOvpw==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@jpwilliams/waitgroup": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@jpwilliams/waitgroup/-/waitgroup-2.1.1.tgz", + "integrity": "sha512-0CxRhNfkvFCTLZBKGvKxY2FYtYW1yWhO2McLqBL0X5UWvYjIf9suH8anKW/DNutl369A75Ewyoh2iJMwBZ2tRg==", + "license": "MIT" + }, + "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==", + "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==", + "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==", + "license": "MIT", + "engines": { + "node": ">=6.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==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@js-sdsl/ordered-map": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", + "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, + "node_modules/@mendable/firecrawl-js": { + "version": "4.24.1", + "resolved": "https://registry.npmjs.org/@mendable/firecrawl-js/-/firecrawl-js-4.24.1.tgz", + "integrity": "sha512-ukrYczyuljWC+HiCYzMmE5bErmePPmPYbIdZ5WYB/5fuBr8RxClhnxMQXPzCjvwpwPA/vv/oJsfYb9VJgKx99w==", + "license": "MIT", + "dependencies": { + "axios": "1.15.2", + "firecrawl": "4.16.0", + "typescript-event-target": "^1.1.1", + "zod": "^3.23.8", + "zod-to-json-schema": "^3.23.0" + }, + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/@mendable/firecrawl-js/node_modules/axios": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.15.2.tgz", + "integrity": "sha512-wLrXxPtcrPTsNlJmKjkPnNPK2Ihe0hn0wGSaTEiHRPxwjvJwT3hKmXF4dpqxmPO9SoNb2FsYXj/xEo0gHN+D5A==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", + "proxy-from-env": "^2.1.0" + } + }, + "node_modules/@mendable/firecrawl-js/node_modules/proxy-from-env": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/@mendable/firecrawl-js/node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/@nangohq/frontend": { + "version": "0.70.1", + "resolved": "https://registry.npmjs.org/@nangohq/frontend/-/frontend-0.70.1.tgz", + "integrity": "sha512-EWyx9MhTdQlbM9I8wY7PxdQa7OnUIHt2kILvTMWZFKr2OPJo5k+AejQxs2t1QTT6A2gvEZlziYLoztxhXsJcTg==", + "license": "SEE LICENSE IN LICENSE FILE IN GIT REPOSITORY", + "dependencies": { + "@nangohq/types": "0.70.1" + } + }, + "node_modules/@nangohq/node": { + "version": "0.70.1", + "resolved": "https://registry.npmjs.org/@nangohq/node/-/node-0.70.1.tgz", + "integrity": "sha512-WupMNpp96GCCNTs5e5UtEoo/snpnJ6tGNPf58hXqDANwFuZG7ePdjN5giyH1AePoqi0QkcXNNHuqPtLZPr8z5g==", + "license": "SEE LICENSE IN LICENSE FILE IN GIT REPOSITORY", + "dependencies": { + "@nangohq/types": "0.70.1", + "axios": "1.15.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@nangohq/types": { + "version": "0.70.1", + "resolved": "https://registry.npmjs.org/@nangohq/types/-/types-0.70.1.tgz", + "integrity": "sha512-hcmlDwKK5rI2+KSroh4lz6BIH93mLiv9cRle8T3msrgILp14efB8FZVHHGS6UAUziKDtA6d1aS/SU8bUtgEo6Q==", + "license": "SEE LICENSE IN LICENSE FILE IN GIT REPOSITORY", + "dependencies": { + "axios": "1.15.0", + "json-schema": "0.4.0", + "type-fest": "4.41.0" + } + }, + "node_modules/@nangohq/types/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@napi-rs/canvas": { + "version": "0.1.80", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas/-/canvas-0.1.80.tgz", + "integrity": "sha512-DxuT1ClnIPts1kQx8FBmkk4BQDTfI5kIzywAaMjQSXfNnra5UFU9PwurXrl+Je3bJ6BGsp/zmshVVFbCmyI+ww==", + "license": "MIT", + "workspaces": [ + "e2e/*" + ], + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@napi-rs/canvas-android-arm64": "0.1.80", + "@napi-rs/canvas-darwin-arm64": "0.1.80", + "@napi-rs/canvas-darwin-x64": "0.1.80", + "@napi-rs/canvas-linux-arm-gnueabihf": "0.1.80", + "@napi-rs/canvas-linux-arm64-gnu": "0.1.80", + "@napi-rs/canvas-linux-arm64-musl": "0.1.80", + "@napi-rs/canvas-linux-riscv64-gnu": "0.1.80", + "@napi-rs/canvas-linux-x64-gnu": "0.1.80", + "@napi-rs/canvas-linux-x64-musl": "0.1.80", + "@napi-rs/canvas-win32-x64-msvc": "0.1.80" + } + }, + "node_modules/@napi-rs/canvas-linux-x64-gnu": { + "version": "0.1.80", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-0.1.80.tgz", + "integrity": "sha512-BeXAmhKg1kX3UCrJsYbdQd3hIMDH/K6HnP/pG2LuITaXhXBiNdh//TVVVVCBbJzVQaV5gK/4ZOCMrQW9mvuTqA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/canvas-linux-x64-musl": { + "version": "0.1.80", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-0.1.80.tgz", + "integrity": "sha512-x0XvZWdHbkgdgucJsRxprX/4o4sEed7qo9rCQA9ugiS9qE2QvP0RIiEugtZhfLH3cyI+jIRFJHV4Fuz+1BHHMg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/env": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.5.tgz", + "integrity": "sha512-/zZGkrTOsraVfYjGP8uM0p6r0BDT6xWpkjdVbcz66PJVSpwXX3yNiRycxAuDfBKGWBrZBXRuK/YVlkNgxHGwmA==", + "license": "MIT" + }, + "node_modules/@next/eslint-plugin-next": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.5.tgz", + "integrity": "sha512-LY3btOpPh+OTIpviNojDpUdIbHW9j0JBYBjsIp8IxtDFfYFyORvw3yNq6N231FVqQA7n7lwaf7xHbVJlA1ED7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob": "10.3.10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.5.tgz", + "integrity": "sha512-8XFikMSxWleYNryWIjiCX+gU201YS+erTUidKdyOVYi5qUQo/gRxv/3N1oZFCgqpesN6FPeqGM72Zve+nReVXQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.5.tgz", + "integrity": "sha512-6QLwi7RaYiQDcRDSU/os40r5o06b5ue7Jsk5JgdRBGGp8l37RZEh9JsLSM8QF0YDsgcosSeHjglgqi25+m04IQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@noble/ciphers": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", + "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.4.0" + } + }, + "node_modules/@opentelemetry/api": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.1.tgz", + "integrity": "sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==", + "license": "Apache-2.0", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/api-logs": { + "version": "0.218.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.218.0.tgz", + "integrity": "sha512-fmEWp5kXlGEc3i/lR698Hz41DfGyN4Tbe4g7L1AxSc7fF8Xeh/FQ9Quqpa9dVA413Q1Ad43QOLzU4JoXgbFPWw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node": { + "version": "0.76.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/auto-instrumentations-node/-/auto-instrumentations-node-0.76.0.tgz", + "integrity": "sha512-44KWgqsMuqfV4UhOcwwnDeK8CpB5LT1MmpZj6sKXFXu2q6rjKo622pWgOgn5Ntp5Qal9q1uBX2VS8mvTpsMeyw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.218.0", + "@opentelemetry/instrumentation-amqplib": "^0.65.0", + "@opentelemetry/instrumentation-aws-lambda": "^0.70.0", + "@opentelemetry/instrumentation-aws-sdk": "^0.73.0", + "@opentelemetry/instrumentation-bunyan": "^0.63.0", + "@opentelemetry/instrumentation-cassandra-driver": "^0.63.0", + "@opentelemetry/instrumentation-connect": "^0.61.0", + "@opentelemetry/instrumentation-cucumber": "^0.34.0", + "@opentelemetry/instrumentation-dataloader": "^0.35.0", + "@opentelemetry/instrumentation-dns": "^0.61.0", + "@opentelemetry/instrumentation-express": "^0.66.0", + "@opentelemetry/instrumentation-fs": "^0.37.0", + "@opentelemetry/instrumentation-generic-pool": "^0.61.0", + "@opentelemetry/instrumentation-graphql": "^0.66.0", + "@opentelemetry/instrumentation-grpc": "^0.218.0", + "@opentelemetry/instrumentation-hapi": "^0.64.0", + "@opentelemetry/instrumentation-http": "^0.218.0", + "@opentelemetry/instrumentation-ioredis": "^0.66.0", + "@opentelemetry/instrumentation-kafkajs": "^0.27.0", + "@opentelemetry/instrumentation-knex": "^0.62.0", + "@opentelemetry/instrumentation-koa": "^0.66.0", + "@opentelemetry/instrumentation-lru-memoizer": "^0.62.0", + "@opentelemetry/instrumentation-memcached": "^0.61.0", + "@opentelemetry/instrumentation-mongodb": "^0.71.0", + "@opentelemetry/instrumentation-mongoose": "^0.64.0", + "@opentelemetry/instrumentation-mysql": "^0.64.0", + "@opentelemetry/instrumentation-mysql2": "^0.64.0", + "@opentelemetry/instrumentation-nestjs-core": "^0.64.0", + "@opentelemetry/instrumentation-net": "^0.62.0", + "@opentelemetry/instrumentation-openai": "^0.16.0", + "@opentelemetry/instrumentation-oracledb": "^0.43.0", + "@opentelemetry/instrumentation-pg": "^0.70.0", + "@opentelemetry/instrumentation-pino": "^0.64.0", + "@opentelemetry/instrumentation-redis": "^0.66.0", + "@opentelemetry/instrumentation-restify": "^0.63.0", + "@opentelemetry/instrumentation-router": "^0.62.0", + "@opentelemetry/instrumentation-runtime-node": "^0.31.0", + "@opentelemetry/instrumentation-socket.io": "^0.65.0", + "@opentelemetry/instrumentation-tedious": "^0.37.0", + "@opentelemetry/instrumentation-undici": "^0.28.0", + "@opentelemetry/instrumentation-winston": "^0.62.0", + "@opentelemetry/resource-detector-alibaba-cloud": "^0.33.8", + "@opentelemetry/resource-detector-aws": "^2.18.0", + "@opentelemetry/resource-detector-azure": "^0.26.0", + "@opentelemetry/resource-detector-container": "^0.8.9", + "@opentelemetry/resource-detector-gcp": "^0.53.0", + "@opentelemetry/resources": "^2.0.0", + "@opentelemetry/sdk-node": "^0.218.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.4.1", + "@opentelemetry/core": "^2.0.0" + } + }, + "node_modules/@opentelemetry/configuration": { + "version": "0.218.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/configuration/-/configuration-0.218.0.tgz", + "integrity": "sha512-W8wIz7H2R1pufR5jfjb3gU2XkMpm2x/7b1RJcsuzvd70Il/rWWE+g5/Od7hQKrxRTSrTrOWlru101PWXz5I1EQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.7.1", + "yaml": "^2.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.9.0" + } + }, + "node_modules/@opentelemetry/context-async-hooks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-2.7.1.tgz", + "integrity": "sha512-OPFBYuXEn1E4ja3Y6eeA7O+ZnLBNcXTV5Cgsn1VaqBZ6hC5FnpZPLBNme1LJY8ZtF4aOujPKFoeWN4ik487KuQ==", + "license": "Apache-2.0", + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/core": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.1.tgz", + "integrity": "sha512-QAqIj32AtK6+pEVNG7EOVxHdE06RP+FM5qpiEJ4RtDcFIqKUZHYhl7/7UY5efhwmwNAg7j8QbJVBLxMerc0+gw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-grpc": { + "version": "0.218.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-grpc/-/exporter-logs-otlp-grpc-0.218.0.tgz", + "integrity": "sha512-hoxrNH1l/Xy6F9WTJ5IK+6j1r9nQFlPOmrnTlhYHTySdunfXLmUCPv3bQtKYntxag9h3wLYBZQ2HI6FOx+BT2g==", + "license": "Apache-2.0", + "dependencies": { + "@grpc/grpc-js": "^1.14.3", + "@opentelemetry/core": "2.7.1", + "@opentelemetry/otlp-exporter-base": "0.218.0", + "@opentelemetry/otlp-grpc-exporter-base": "0.218.0", + "@opentelemetry/otlp-transformer": "0.218.0", + "@opentelemetry/sdk-logs": "0.218.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-http": { + "version": "0.218.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-http/-/exporter-logs-otlp-http-0.218.0.tgz", + "integrity": "sha512-Qx+4rpVHzgg89dawcWRHyt+XRXeLnhFz/qBtvggmjkcgPUdr+NAB0/u/eIPA8yAeJV0J80Vz43JZCh/XFvZFGw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.218.0", + "@opentelemetry/core": "2.7.1", + "@opentelemetry/otlp-exporter-base": "0.218.0", + "@opentelemetry/otlp-transformer": "0.218.0", + "@opentelemetry/sdk-logs": "0.218.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-proto": { + "version": "0.218.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-proto/-/exporter-logs-otlp-proto-0.218.0.tgz", + "integrity": "sha512-1/noQNsp9gXD75HPzgjBrcF1+XTtry7pFAUfxVEJgg7mPv2AawKQuYkhMmJ8qjxz4Ubc3Y8bwvfxevXsKTq4cg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.218.0", + "@opentelemetry/core": "2.7.1", + "@opentelemetry/otlp-exporter-base": "0.218.0", + "@opentelemetry/otlp-transformer": "0.218.0", + "@opentelemetry/resources": "2.7.1", + "@opentelemetry/sdk-logs": "0.218.0", + "@opentelemetry/sdk-trace-base": "2.7.1" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-grpc": { + "version": "0.218.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-grpc/-/exporter-metrics-otlp-grpc-0.218.0.tgz", + "integrity": "sha512-YapQ9vNMX0NSZF6LK5pWAFfjpJleV2O9uYWfYGeb/5F1Kb9rPGK8tZDMJFa/sOksgdFuflDvYuA0B4qjDB4fjQ==", + "license": "Apache-2.0", + "dependencies": { + "@grpc/grpc-js": "^1.14.3", + "@opentelemetry/core": "2.7.1", + "@opentelemetry/exporter-metrics-otlp-http": "0.218.0", + "@opentelemetry/otlp-exporter-base": "0.218.0", + "@opentelemetry/otlp-grpc-exporter-base": "0.218.0", + "@opentelemetry/otlp-transformer": "0.218.0", + "@opentelemetry/resources": "2.7.1", + "@opentelemetry/sdk-metrics": "2.7.1" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-http": { + "version": "0.218.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.218.0.tgz", + "integrity": "sha512-bV7d2OuMpZu2+gAaxUAhzfZ0h3WVZk8ETQUEE3DNSntbTaMpuITjtm8I0rNyHFdm7Ax57K6ty7SgFXlBmOLIvQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.7.1", + "@opentelemetry/otlp-exporter-base": "0.218.0", + "@opentelemetry/otlp-transformer": "0.218.0", + "@opentelemetry/resources": "2.7.1", + "@opentelemetry/sdk-metrics": "2.7.1" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-proto": { + "version": "0.218.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-proto/-/exporter-metrics-otlp-proto-0.218.0.tgz", + "integrity": "sha512-ubLddKjWULhla9YZRCj/rTBeppjJYE4e9w0icx5mTu3eFhWjQzbV75NYjXuIlEG+NJsBl6d+sTFw5Qu+oej4oQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.7.1", + "@opentelemetry/exporter-metrics-otlp-http": "0.218.0", + "@opentelemetry/otlp-exporter-base": "0.218.0", + "@opentelemetry/otlp-transformer": "0.218.0", + "@opentelemetry/resources": "2.7.1", + "@opentelemetry/sdk-metrics": "2.7.1" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-prometheus": { + "version": "0.218.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-prometheus/-/exporter-prometheus-0.218.0.tgz", + "integrity": "sha512-RT5oEyu1kddZJ1vt7/BUo5wV+P7hpNAESsR3dUd3+8deHuX7gWNoCOZn+SfDT+hJHlIJ5h/AxiCLXIrutswDJg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.7.1", + "@opentelemetry/resources": "2.7.1", + "@opentelemetry/sdk-metrics": "2.7.1", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-grpc": { + "version": "0.218.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.218.0.tgz", + "integrity": "sha512-3fXxVQEj9TNAFaCi79JeFKfeLd0sDtInaR3gaZDVlzNSPHtz8PZuCV34JKWjD4XXzT20IdMe8IpX6mRVNDA4Tw==", + "license": "Apache-2.0", + "dependencies": { + "@grpc/grpc-js": "^1.14.3", + "@opentelemetry/core": "2.7.1", + "@opentelemetry/otlp-exporter-base": "0.218.0", + "@opentelemetry/otlp-grpc-exporter-base": "0.218.0", + "@opentelemetry/otlp-transformer": "0.218.0", + "@opentelemetry/resources": "2.7.1", + "@opentelemetry/sdk-trace-base": "2.7.1" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-http": { + "version": "0.218.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.218.0.tgz", + "integrity": "sha512-8dqezsmPhtKitIK/eTipZhYl9EX2/gNQ5zUMhaz3uxEURwfkNf8IPvo6yNfrzbxdtpAOybS/+h7wmIWYqFSpiw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.7.1", + "@opentelemetry/otlp-exporter-base": "0.218.0", + "@opentelemetry/otlp-transformer": "0.218.0", + "@opentelemetry/resources": "2.7.1", + "@opentelemetry/sdk-trace-base": "2.7.1" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-proto": { + "version": "0.218.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.218.0.tgz", + "integrity": "sha512-r1Msf8SNLRmwh9J6XQ5uh82D7CdDWMNHnPB7LAVHjzut0TkSeKc5KcIvr4SvHvfk/xwN5gxC+VLKQ1k0o8PSPw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.7.1", + "@opentelemetry/otlp-exporter-base": "0.218.0", + "@opentelemetry/otlp-transformer": "0.218.0", + "@opentelemetry/resources": "2.7.1", + "@opentelemetry/sdk-trace-base": "2.7.1" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-zipkin": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-2.7.1.tgz", + "integrity": "sha512-mfsD9bKAxcKrh5+y08TPodvClBO0CznBE3p79YAGnO81WI4LrdsGA65T53e4iTSbCalW4WaUpkbeJcbpyIUHfg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.7.1", + "@opentelemetry/resources": "2.7.1", + "@opentelemetry/sdk-trace-base": "2.7.1", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/instrumentation": { + "version": "0.218.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.218.0.tgz", + "integrity": "sha512-mIZil8Es+sYDK5m+DQiwAwF57F14TF2YlEqvIjZ/RQWcxDBwRGsKfdK2Tv65OU9meQKCMzSIFS9mxAcnAb6Bkg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.218.0", + "import-in-the-middle": "^3.0.0", + "require-in-the-middle": "^8.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-amqplib": { + "version": "0.65.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.65.0.tgz", + "integrity": "sha512-fF7fNHA59n3y23ROfst2EbSxmP+L3E+snZO6aMU4w4xD84mfejAivspIAsqa9arX5HZlBK6dslHz5dWGNp5D0A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.218.0", + "@opentelemetry/semantic-conventions": "^1.33.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-aws-lambda": { + "version": "0.70.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-lambda/-/instrumentation-aws-lambda-0.70.0.tgz", + "integrity": "sha512-HT74cQxi/iiVEz5dRdNdfGCFzPFbkxSiwHfFPHDwkRcr1JKQqI6hm8qeXEvEiJ+36xIU1KkQMDfeThJ1ifnUiA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.218.0", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@types/aws-lambda": "^8.10.155" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-aws-sdk": { + "version": "0.73.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-sdk/-/instrumentation-aws-sdk-0.73.0.tgz", + "integrity": "sha512-0INPkHbR6o4J3psE+ncwWaE7qtDpb2p+i+qfV82cfwYLCXavYCGosBZ/S4pOErDVJYIyQVIsNAHhaUgaL313SQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.218.0", + "@opentelemetry/semantic-conventions": "^1.34.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-bunyan": { + "version": "0.63.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-bunyan/-/instrumentation-bunyan-0.63.0.tgz", + "integrity": "sha512-z0xPSZ62d3I7sG2sUTyQ5/ES1RdESP2eOETiMLY9gPSp+HZwbsAyj7T/2sdZKYD+O2ajRHZEil+DBoUolf1ocQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "^0.218.0", + "@opentelemetry/instrumentation": "^0.218.0", + "@types/bunyan": "1.8.11" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-cassandra-driver": { + "version": "0.63.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cassandra-driver/-/instrumentation-cassandra-driver-0.63.0.tgz", + "integrity": "sha512-jnVTOr3h/46UDalEwJ4ITux8UWwHmnsOik5WFs3JB/UrUj8Wad5eI+KpOEBuOUeOfPB9sce11qgVw3WXU2r+hg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.218.0", + "@opentelemetry/semantic-conventions": "^1.37.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-connect": { + "version": "0.61.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.61.0.tgz", + "integrity": "sha512-ZTQ0W3Lb7GJsOd+72cG8FJQKA5DqYfELJGLmChrJIezRSLfJIfofwKEGLX5rMtFJmwckpichQkBZWjid5dvnVQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.218.0", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@types/connect": "3.4.38" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-cucumber": { + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cucumber/-/instrumentation-cucumber-0.34.0.tgz", + "integrity": "sha512-VK63Cm8osAdsSZpULPk+qnNktQUJzmnIOv2wuh79fV41WuTM38uOFC3s978/24pDkSljhN4EYCbPRLrAhXfKSA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.218.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/instrumentation-dataloader": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.35.0.tgz", + "integrity": "sha512-6x6UPP0tLzrdj15PIEN3qgp/WCcESCavHJfkIKoyLmy4UjGLF1KgEUMyD74xhbKGo426uvMbhvCgZC0ye8nO/A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.218.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-dns": { + "version": "0.61.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.61.0.tgz", + "integrity": "sha512-5D8xFaw9GXq9ZIOAvG7NPDivFfZWFAekLGFn1B7ppyhuAYBVHGybFpx4Q9BV1Uup3yzCdiD78KhyH7c3dKOYSw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.218.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-express": { + "version": "0.66.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.66.0.tgz", + "integrity": "sha512-G1xTh5M5shklMgIyUXWDjU2BakulKtcISaM4U5TyanvO7R4xbB3iC7YQ8QKegLXaOs81Ku8RlcIcbYRrz/82wQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.218.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-fs": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.37.0.tgz", + "integrity": "sha512-5mxhFuwAK0FFvisUdvuywaZ9ySMZ15HfbN6IpLn0gwRh9s1/QBcpLznQ/A15cZs1QFtBJ+JXIHdwY7WOD0c4Eg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.218.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-generic-pool": { + "version": "0.61.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-generic-pool/-/instrumentation-generic-pool-0.61.0.tgz", + "integrity": "sha512-tvp5PWnGRPHY/kz9Kg1IRLBL0qUAxMSNG623f+ZGEsvnCVEjr3tFyw1JGQzM+B3eZKkO+Dp/LYrtOSfb69D5lA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.218.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-graphql": { + "version": "0.66.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.66.0.tgz", + "integrity": "sha512-D4PN1tStj6rnOdofnt2xINJjtT1k2ockzaODrn76VEBZeqJ3QsEvKFfunB0EFAohO4xswVp14VAVmKNnGzA1Dw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.218.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-grpc": { + "version": "0.218.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.218.0.tgz", + "integrity": "sha512-kcDCNrC7IWNXEKQriGrwuh5jjbMFU5exOQzU9ufEY9UkACNcgYIdOd7XpX3IqZ3UPSnZyZtlwgfsbC5SNlEDbA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "0.218.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-hapi": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.64.0.tgz", + "integrity": "sha512-PCHgCICCDz7p9BgCU9gQz2smbqu4V4P8QtWJ7DLjL3bmzSdrgy6EGvecDg1YuhjBsoN08SR+y36hgdHkqCgrzQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.218.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-http": { + "version": "0.218.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.218.0.tgz", + "integrity": "sha512-x9djaqdzpT8WAboep1H9nCAQ1E+MMsm08TNfA02TqM3bNNddZeiim+E3KMWVQFaX6JpUy7V0nm/wfN/K2Em+Zw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.7.1", + "@opentelemetry/instrumentation": "0.218.0", + "@opentelemetry/semantic-conventions": "^1.29.0", + "forwarded-parse": "2.1.2" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-ioredis": { + "version": "0.66.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.66.0.tgz", + "integrity": "sha512-UfTAcaBKCzLUZ9opvfOLV4bH46XiNFqUsKykfPCIefDIxJ1iUYtMOucNaiZ+/kjQdPy5i6Ef5tk2IAjxol4X1w==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.218.0", + "@opentelemetry/redis-common": "^0.38.3", + "@opentelemetry/semantic-conventions": "^1.33.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-kafkajs": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-kafkajs/-/instrumentation-kafkajs-0.27.0.tgz", + "integrity": "sha512-kl/C2AU4KZGHlMZD12nMFXcMjxSHvu5Q0UPSQ6IJeBfCadYuWgW+sWIa2JZVK/A0qRYm2cncekJyeBHQDyfUUg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.218.0", + "@opentelemetry/semantic-conventions": "^1.30.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-knex": { + "version": "0.62.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-knex/-/instrumentation-knex-0.62.0.tgz", + "integrity": "sha512-XgfhCAWwSqA0YnwaEKdpvQMavc90D3R65frhLCO9JNl867EulNps9tm6pjGIg+GiYuewn00gEzW4HQ5btgYxGQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.218.0", + "@opentelemetry/semantic-conventions": "^1.33.1" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-koa": { + "version": "0.66.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.66.0.tgz", + "integrity": "sha512-04x/z21WTMEfy3lUSr4aTj8WsTN3OZF901hJ+ciOwdwf7AK8UJTpZCXw6KQ3G4Vag56q1HoMihCONeWZLeld1g==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.218.0", + "@opentelemetry/semantic-conventions": "^1.36.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.9.0" + } + }, + "node_modules/@opentelemetry/instrumentation-lru-memoizer": { + "version": "0.62.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-lru-memoizer/-/instrumentation-lru-memoizer-0.62.0.tgz", + "integrity": "sha512-AlGKIdk6ZT7WmIozfUb2LjOcI3AhQrvAXKX0zi1cVcnw2QlRbVYyV5GTa2Th9ebuczVfWPaoPrmZw61zCp/czw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.218.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-memcached": { + "version": "0.61.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-memcached/-/instrumentation-memcached-0.61.0.tgz", + "integrity": "sha512-qiCR9Wovf5AHzn6g+LXhvwMmv2I6zhHz2I2tEHZMmBuD8c18bkJzGFxHoSBlxdApRT+SW13r9472dDMm4BRjgQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.218.0", + "@opentelemetry/semantic-conventions": "^1.33.0", + "@types/memcached": "^2.2.6" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mongodb": { + "version": "0.71.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.71.0.tgz", + "integrity": "sha512-6rwfVjAUY69CKkyGqzL+F5X7Nzw0+Ke9pOxk9xUPJpy8vracZxuQYF7rWu02sV1xOgi4u52449SuVhD+zaSiIA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.218.0", + "@opentelemetry/semantic-conventions": "^1.33.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mongoose": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.64.0.tgz", + "integrity": "sha512-iCIqeUaERN8Uc5Rrtg4zvQ6d7z5JQ5iUmbnr/JHYPxAidDowmRc8/wDMJeMKRfLPTj336Zu0ec7rH/ak/4N9vw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.218.0", + "@opentelemetry/semantic-conventions": "^1.33.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.64.0.tgz", + "integrity": "sha512-W1w76AJkP7i0uzzAe7nsCMWq4+EMSA550f1lAmxDPdQC5FnreNbRIm/tod2OS9gVrYvRrQXNkFmZJKGo4kzCnw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.218.0", + "@opentelemetry/semantic-conventions": "^1.33.0", + "@types/mysql": "2.15.27" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql2": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.64.0.tgz", + "integrity": "sha512-yTu0mYh/qJPSE86VmNLQww5uugDyvCS2KJIPfPtIk2ufoEUoHPsV6Iynnvmz588Moq04aBLxfTa/EtE4A2ykWA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.218.0", + "@opentelemetry/semantic-conventions": "^1.33.0", + "@opentelemetry/sql-common": "^0.41.2" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-nestjs-core": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.64.0.tgz", + "integrity": "sha512-PW1ArxryMwF8/IXq1nzlQs7tmr/fWd1tf71AHevZT3Fm0hW7jRX9JEfYgIAcKDvmbqcJEr5K1224NEimrRPbuQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.218.0", + "@opentelemetry/semantic-conventions": "^1.30.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-net": { + "version": "0.62.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-net/-/instrumentation-net-0.62.0.tgz", + "integrity": "sha512-Gt2kzpACpmIad+q3LQqe8UNHuoVvdLuFpB6SN/A6xLPKNllb+ksPUYQhj1kXdZOpcFZNGKDXHyN+TUCVCk1TRw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.218.0", + "@opentelemetry/semantic-conventions": "^1.33.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-openai": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-openai/-/instrumentation-openai-0.16.0.tgz", + "integrity": "sha512-I0KKybyqqFOxSBgYKQNdR/EF3LvzSaAUT7Y75xkjbgscY+V8UWDpUbY68POLhUC3SKMlGvZmrTSxcQ+Y0vRhNw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "^0.218.0", + "@opentelemetry/instrumentation": "^0.218.0", + "@opentelemetry/semantic-conventions": "^1.36.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-oracledb": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-oracledb/-/instrumentation-oracledb-0.43.0.tgz", + "integrity": "sha512-7Z4kOOdnrHX4S5gCeWhnnpWQwEd7weRjDhJA1nSrwTYtAcVWNjk5wsMKHBCTDCN0uJtA9T6PouZ+AKRYiS1Rrg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.218.0", + "@opentelemetry/semantic-conventions": "^1.34.0", + "@types/oracledb": "6.5.2" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pg": { + "version": "0.70.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.70.0.tgz", + "integrity": "sha512-g8WXwwOUXfjiEmATwjB/33QKE2AkIpNe4KIuJJh4djtXgCL0Wne+AzAfjuDIAspGvO1txQp8ibKsLd3SBmcvJA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.218.0", + "@opentelemetry/semantic-conventions": "^1.34.0", + "@opentelemetry/sql-common": "^0.41.2", + "@types/pg": "8.15.6", + "@types/pg-pool": "2.0.7" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pg/node_modules/@types/pg": { + "version": "8.15.6", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.15.6.tgz", + "integrity": "sha512-NoaMtzhxOrubeL/7UZuNTrejB4MPAJ0RpxZqXQf2qXuVlTPuG6Y8p4u9dKRaue4yjmC7ZhzVO2/Yyyn25znrPQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pino": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pino/-/instrumentation-pino-0.64.0.tgz", + "integrity": "sha512-+vDL7tZMZjkp8BpYMx/cL2/HWGsNUqKcRmAIIEaQu/6F44oM6xGDMCSqMKHdKCsH1+WW52EYdHbWkVGTF0KVsQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "^0.218.0", + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.218.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-redis": { + "version": "0.66.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.66.0.tgz", + "integrity": "sha512-bVShkag6vP2VQO0cpA8CHjOohWbKNYLyjiwGkOnSAwou1TPc6pf9DssFUxwqN2XF1J4oqP0LVSvN9kZUzMecfA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.218.0", + "@opentelemetry/redis-common": "^0.38.3", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-restify": { + "version": "0.63.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-restify/-/instrumentation-restify-0.63.0.tgz", + "integrity": "sha512-Z73YxZpt0Y56uRu2pRWOjO5wXHvZqF46K4czoKRTGlUifzzFmUZxyOeAAECACuMRSLZmZ394WJin0MDgU9iW9w==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.218.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-router": { + "version": "0.62.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-router/-/instrumentation-router-0.62.0.tgz", + "integrity": "sha512-0w8ok7GbXtYvX7TtLp72qQJKNyI7lD72Fy2NsNKIcQAv6TqGox5javFyXrIrCAtZHCONePxeAwAYj1Qd9si9OQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.218.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-runtime-node": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-runtime-node/-/instrumentation-runtime-node-0.31.0.tgz", + "integrity": "sha512-HkLsuEfUDahFiL/xFtEqJDMp7sp8ynOtA045bJi9nAH8CrPvljPW5SgJQb2mQqEYJQopbWYZ2lPqQEfj7bYgJg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "^0.218.0", + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.218.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-socket.io": { + "version": "0.65.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-socket.io/-/instrumentation-socket.io-0.65.0.tgz", + "integrity": "sha512-dNvIbD40h0z69stQ9cIeAWRyy5WyQM1a1XnFthekc/oi/ipX4E6oYJBM4X2xKBxjZMTjdV5VshLoNeYMSBsnjw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.218.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-tedious": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.37.0.tgz", + "integrity": "sha512-cGLF46UsgeI1334atJxLO36yQlV7WXKg35Mp+e2NXo2vOTfIZTVqoKOzExVOTOwT4AQjfGVEDxyq5wXybUYXIA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.218.0", + "@opentelemetry/semantic-conventions": "^1.33.0", + "@types/tedious": "^4.0.14" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-undici": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-undici/-/instrumentation-undici-0.28.0.tgz", + "integrity": "sha512-7nh4Gw7PhYtQm82FIJtWUhx6iZQJj0bdkKe2RQb3XNIyxu0o9rM1J5Xt083SsG2tCbQZpX9/mlDxhTrK1Z/lVQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.218.0", + "@opentelemetry/semantic-conventions": "^1.24.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.7.0" + } + }, + "node_modules/@opentelemetry/instrumentation-winston": { + "version": "0.62.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-winston/-/instrumentation-winston-0.62.0.tgz", + "integrity": "sha512-pr1U9ZV4RRy23qMVrRzebfxwDWjp44xA7sC0PAdeW9v4HDcfOr0ejdTJmIsBGvhkNHPBajfieaIF9b6/9wjErA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "^0.218.0", + "@opentelemetry/instrumentation": "^0.218.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/otlp-exporter-base": { + "version": "0.218.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.218.0.tgz", + "integrity": "sha512-ZwqpkNL5W7RyGJPDZ9g06DvKp8KFTWPJPN12anpMQYSKpTSU0z3EIZuPq9vPGpS8siFyOqDYDAuCwlNO9FqgbA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.7.1", + "@opentelemetry/otlp-transformer": "0.218.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/otlp-grpc-exporter-base": { + "version": "0.218.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.218.0.tgz", + "integrity": "sha512-H/lCGJ536N98VpYJOaWTQOkv4Dx6TnmStK6Rqfu1W7KkFbPAx04hjdYEMZF/YbnHzPUSIK4kM6OE2GKGBTpV9A==", + "license": "Apache-2.0", + "dependencies": { + "@grpc/grpc-js": "^1.14.3", + "@opentelemetry/core": "2.7.1", + "@opentelemetry/otlp-exporter-base": "0.218.0", + "@opentelemetry/otlp-transformer": "0.218.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/otlp-transformer": { + "version": "0.218.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.218.0.tgz", + "integrity": "sha512-CFaKH87WAzjuJ4awowTTLzUvMfaRfiOFG5+qm5S5ncyalRtN4ecQ+YmuANJSCrVPuvZFEkUgKhBPBndxi3rHsQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.218.0", + "@opentelemetry/core": "2.7.1", + "@opentelemetry/resources": "2.7.1", + "@opentelemetry/sdk-logs": "0.218.0", + "@opentelemetry/sdk-metrics": "2.7.1", + "@opentelemetry/sdk-trace-base": "2.7.1" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/propagator-b3": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-2.7.1.tgz", + "integrity": "sha512-RJid6E2CKyeGfKBzXKF21ejabGMHypFkPAh3qZ+NvI+SGjuIye79t3PmiqcDgtRzdKH6ynXzbfslQ8DfpRUg2A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.7.1" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/propagator-jaeger": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-2.7.1.tgz", + "integrity": "sha512-KMjVBHzP4N60bOzxja76M1F1hZZ43lGPga5ix+mkv9+kk1nx9SbkxSvJsMbuVUxdPQmsPTqGShmhN8ulrMOg6Q==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.7.1" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/redis-common": { + "version": "0.38.3", + "resolved": "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.38.3.tgz", + "integrity": "sha512-VCghU1JYs/4gP6Gqf/xro9MEsZ7LrMv2uONVsaESKL38ZOB9BqnI98FfS23wjMnHlpuE+TTaWSoAVNpTwYXzjw==", + "license": "Apache-2.0", + "engines": { + "node": "^18.19.0 || >=20.6.0" + } + }, + "node_modules/@opentelemetry/resource-detector-alibaba-cloud": { + "version": "0.33.8", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-alibaba-cloud/-/resource-detector-alibaba-cloud-0.33.8.tgz", + "integrity": "sha512-RnSB/uxkElny0/WBFEtIG2HRG0cpSNTRdE+YSB7Poa+uljK+ddCacEZYz/PMgZh+cs586XstJQxdyjz0jtcAug==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/resources": "^2.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resource-detector-aws": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-2.18.0.tgz", + "integrity": "sha512-wyMM4UoRuHvI2KjqnTzvyW8Yv7MKRGA+I78Xti6gTEw7hBhqXU1SRo+f9KrsQfeeiOn+TkDuvxavuaAQbD3i6g==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/resources": "^2.0.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resource-detector-azure": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-azure/-/resource-detector-azure-0.26.0.tgz", + "integrity": "sha512-7KxF7mlwI2nKja/iEdwPqOaS0QAJbhT9ye4DeYZnXdOS/4phfonk5nSmyGDBYhBL7J30MPL91oZNuGYRKXZAXA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/resources": "^2.0.0", + "@opentelemetry/semantic-conventions": "^1.37.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resource-detector-container": { + "version": "0.8.9", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-container/-/resource-detector-container-0.8.9.tgz", + "integrity": "sha512-Xd2C4HjW9hl75iqZT7tQNy2yRBUqNucq2O9+e0FJRNkbiItInYVMzc0S0KDXcx/vZBwNmlrKS3R0uLCU9ULsGA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/resources": "^2.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resource-detector-gcp": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.53.0.tgz", + "integrity": "sha512-RCV31v23ZwZfYR3LPkuORHTHIOvfm3hZBT7hAzSO0+oAIrG/Dm0ld5tV4lYNO05GjI7sHQdRcbSqzEYAvQcQuw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/resources": "^2.0.0", + "gcp-metadata": "^8.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resources": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.1.tgz", + "integrity": "sha512-DeT6KKolmC4e/dRQvMQ/RwlnzhaqeiFOXY5ngoOPJ07GgVVKxZOg9EcrNZb5aTzUn+iCrJldAgOfQm1O/QfPAQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.7.1", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-logs": { + "version": "0.218.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.218.0.tgz", + "integrity": "sha512-QvnNdugatFTVCJXH0Mcu7GOOJSylA9j127kIezOE4YwTI4YbowRons2K4WZTv5FMS8T4q9P0NdaRHdkSmeAIag==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.218.0", + "@opentelemetry/core": "2.7.1", + "@opentelemetry/resources": "2.7.1", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.4.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-metrics": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.7.1.tgz", + "integrity": "sha512-MpDJdkiFDs3Pm1RHO3KByuZbuBdJEXEAkiC0+yJdsZGVCdf1RpHR6n+LHDcS7ffmfrt5kVCzJSCfm4z2C7v0uQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.7.1", + "@opentelemetry/resources": "2.7.1" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.9.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-node": { + "version": "0.218.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.218.0.tgz", + "integrity": "sha512-tPMjHrLV5gsfNdYqoRHjeGbCAZBXXD9c1Qo/2ut7VwnUABDNh76xNxrT0SEhkIIJuCN45bbN1vZnYL1gY0IkOg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.218.0", + "@opentelemetry/configuration": "0.218.0", + "@opentelemetry/context-async-hooks": "2.7.1", + "@opentelemetry/core": "2.7.1", + "@opentelemetry/exporter-logs-otlp-grpc": "0.218.0", + "@opentelemetry/exporter-logs-otlp-http": "0.218.0", + "@opentelemetry/exporter-logs-otlp-proto": "0.218.0", + "@opentelemetry/exporter-metrics-otlp-grpc": "0.218.0", + "@opentelemetry/exporter-metrics-otlp-http": "0.218.0", + "@opentelemetry/exporter-metrics-otlp-proto": "0.218.0", + "@opentelemetry/exporter-prometheus": "0.218.0", + "@opentelemetry/exporter-trace-otlp-grpc": "0.218.0", + "@opentelemetry/exporter-trace-otlp-http": "0.218.0", + "@opentelemetry/exporter-trace-otlp-proto": "0.218.0", + "@opentelemetry/exporter-zipkin": "2.7.1", + "@opentelemetry/instrumentation": "0.218.0", + "@opentelemetry/otlp-exporter-base": "0.218.0", + "@opentelemetry/propagator-b3": "2.7.1", + "@opentelemetry/propagator-jaeger": "2.7.1", + "@opentelemetry/resources": "2.7.1", + "@opentelemetry/sdk-logs": "0.218.0", + "@opentelemetry/sdk-metrics": "2.7.1", + "@opentelemetry/sdk-trace-base": "2.7.1", + "@opentelemetry/sdk-trace-node": "2.7.1", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-base": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.7.1.tgz", + "integrity": "sha512-NAYIlsF8MPUsKqJMiDQJTMPOmlbawC1Iz/omMLygZ1C9am8fTKYjTaI+OZM+WTY3t3Glo0wnOg/6/pac6RGPPw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.7.1", + "@opentelemetry/resources": "2.7.1", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-node": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-2.7.1.tgz", + "integrity": "sha512-pCpQxU68lV+I9s9svqMyVu5iHdDDUnqUpSxqwyCU8A9ejEsSnMPCbearwsUO4yk08ZJzAIUCFuReMdVQvHrdvg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/context-async-hooks": "2.7.1", + "@opentelemetry/core": "2.7.1", + "@opentelemetry/sdk-trace-base": "2.7.1" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/semantic-conventions": { + "version": "1.41.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.41.1.tgz", + "integrity": "sha512-/UhIkaZgPutTFmQ7RnIJGgDXZmtEJ7Dvi86xNTFWcnRxVRNk/aotsqDJYeEvDP+FSMB2SdW+pQzNMcWP0rwuNA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/sql-common": { + "version": "0.41.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/sql-common/-/sql-common-0.41.2.tgz", + "integrity": "sha512-4mhWm3Z8z+i508zQJ7r6Xi7y4mmoJpdvH0fZPFRkWrdp5fq7hhZ2HhYokEOLkfqSMgPR4Z9EyB3DBkbKGOqZiQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@prisma/client": { + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.22.0.tgz", + "integrity": "sha512-M0SVXfyHnQREBKxCgyo7sffrKttwE6R8PMq330MIUF0pTwjUhLbW84pFDlf06B27XyCR++VtjugEnIHdr07SVA==", + "hasInstallScript": true, + "license": "Apache-2.0", + "engines": { + "node": ">=16.13" + }, + "peerDependencies": { + "prisma": "*" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + } + } + }, + "node_modules/@prisma/debug": { + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.22.0.tgz", + "integrity": "sha512-AUt44v3YJeggO2ZU5BkXI7M4hu9BF2zzH2iF2V5pyXT/lRTyWiElZ7It+bRH1EshoMRxHgpYg4VB6rCM+mG5jQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@prisma/engines": { + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.22.0.tgz", + "integrity": "sha512-UNjfslWhAt06kVL3CjkuYpHAWSO6L4kDCVPegV6itt7nD1kSJavd3vhgAEhjglLJJKEdJ7oIqDJ+yHk6qO8gPA==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "5.22.0", + "@prisma/engines-version": "5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2", + "@prisma/fetch-engine": "5.22.0", + "@prisma/get-platform": "5.22.0" + } + }, + "node_modules/@prisma/engines-version": { + "version": "5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2.tgz", + "integrity": "sha512-2PTmxFR2yHW/eB3uqWtcgRcgAbG1rwG9ZriSvQw+nnb7c4uCr3RAcGMb6/zfE88SKlC1Nj2ziUvc96Z379mHgQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@prisma/fetch-engine": { + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-5.22.0.tgz", + "integrity": "sha512-bkrD/Mc2fSvkQBV5EpoFcZ87AvOgDxbG99488a5cexp5Ccny+UM6MAe/UFkUC0wLYD9+9befNOqGiIJhhq+HbA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "5.22.0", + "@prisma/engines-version": "5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2", + "@prisma/get-platform": "5.22.0" + } + }, + "node_modules/@prisma/get-platform": { + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-5.22.0.tgz", + "integrity": "sha512-pHhpQdr1UPFpt+zFfnPazhulaZYCUqeIcPpJViYoq9R+D/yw4fjE+CtnsnKzPYm0ddUbeXUzjGVGIRVgPDCk4Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "5.22.0" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz", + "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.1.tgz", + "integrity": "sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.1.tgz", + "integrity": "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==", + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.2.tgz", + "integrity": "sha512-pa0vFRuws4wkvaXKK1uXZMAwAX4/t8ANaJo45iw/oQHNQ9q5xUzwgFmVJGXiga2BeN+zpX7Vf9vmsiIa2J+MUw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.1.tgz", + "integrity": "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg==", + "license": "BSD-3-Clause" + }, + "node_modules/@puppeteer/browsers": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.13.0.tgz", + "integrity": "sha512-46BZJYJjc/WwmKjsvDFykHtXrtomsCIrwYQPOP7VfMJoZY2bsDF9oROBABR3paDjDcmkUye1Pb1BqdcdiipaWA==", + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.4.3", + "extract-zip": "^2.0.1", + "progress": "^2.0.3", + "proxy-agent": "^6.5.0", + "semver": "^7.7.4", + "tar-fs": "^3.1.1", + "yargs": "^17.7.2" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-pdf/fns": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@react-pdf/fns/-/fns-3.1.3.tgz", + "integrity": "sha512-0I7pApDr1/RLAKbizuLy/IHTEa93LSPy/bEwYniboC3Xqnp6Od8xFJKbKEzGw2wh/5zKFFwl00g4t9RwgIMc3w==", + "license": "MIT" + }, + "node_modules/@react-pdf/font": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@react-pdf/font/-/font-4.0.8.tgz", + "integrity": "sha512-deNd+emtZAJho1IlzKL9bRoLAGv/6oXOIKO2oZfs4RuXUrK1onLHbJO7e2YoVLPFP/sQxisRTnzdJFtd35iKwA==", + "license": "MIT", + "dependencies": { + "@react-pdf/pdfkit": "^5.1.1", + "@react-pdf/types": "^2.11.1", + "fontkit": "^2.0.2", + "is-url": "^1.2.4" + } + }, + "node_modules/@react-pdf/image": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@react-pdf/image/-/image-3.1.0.tgz", + "integrity": "sha512-ks7Ry8v711r8NvKWSELehj0BXBNPRihSnWsM09nDD8Ur175zbWBCK217LLwQMKDNYDVpkZaipdoJPom1LGaE9g==", + "license": "MIT", + "dependencies": { + "@react-pdf/svg": "^1.1.0", + "jay-peg": "^1.1.1", + "png-js": "^2.0.0" + } + }, + "node_modules/@react-pdf/layout": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@react-pdf/layout/-/layout-4.6.1.tgz", + "integrity": "sha512-gN6PmWoEffvlIkifLfEhMsVucRywVMyH3rnxdyOVOhGy0nWJKKGpHyPc4plbDdpP6EfZ0r8prHXujDSkIG2nSA==", + "license": "MIT", + "dependencies": { + "@react-pdf/fns": "3.1.3", + "@react-pdf/image": "^3.1.0", + "@react-pdf/primitives": "^4.3.0", + "@react-pdf/stylesheet": "^6.2.1", + "@react-pdf/textkit": "^6.3.0", + "@react-pdf/types": "^2.11.1", + "emoji-regex-xs": "^1.0.0", + "queue": "^6.0.1", + "yoga-layout": "^3.2.1" + } + }, + "node_modules/@react-pdf/pdfkit": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@react-pdf/pdfkit/-/pdfkit-5.1.1.tgz", + "integrity": "sha512-wNcdSsNlNYyGHGAgIdt453egBF7fiF9UxpRlklUfVvu8OWCrUppG9xiUrPLVoKiqWet5tMi0w6LmuFUJuYqjEg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.13", + "@noble/ciphers": "^1.0.0", + "@noble/hashes": "^1.6.0", + "browserify-zlib": "^0.2.0", + "fontkit": "^2.0.2", + "jay-peg": "^1.1.1", + "js-md5": "^0.8.3", + "linebreak": "^1.1.0", + "png-js": "^2.0.0", + "vite-compatible-readable-stream": "^3.6.1" + } + }, + "node_modules/@react-pdf/primitives": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@react-pdf/primitives/-/primitives-4.3.0.tgz", + "integrity": "sha512-nYXoZ36pvwNzbc54+DbL8RCn15jU7woJ9D/svnh5tpUXekJ+CbI4mZLo6boSv24CvJgychOu6h7gxX03B4ps0A==", + "license": "MIT" + }, + "node_modules/@react-pdf/reconciler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@react-pdf/reconciler/-/reconciler-2.0.0.tgz", + "integrity": "sha512-7zaPRujpbHSmCpIrZ+b9HSTJHthcVZzX0Wx7RzvQGsGBUbHP4p6s5itXrAIOuQuPvDepoHGNOvf6xUuMVvdoyw==", + "license": "MIT", + "dependencies": { + "object-assign": "^4.1.1", + "scheduler": "0.25.0-rc-603e6108-20241029" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@react-pdf/reconciler/node_modules/scheduler": { + "version": "0.25.0-rc-603e6108-20241029", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0-rc-603e6108-20241029.tgz", + "integrity": "sha512-pFwF6H1XrSdYYNLfOcGlM28/j8CGLu8IvdrxqhjWULe2bPcKiKW4CV+OWqR/9fT52mywx65l7ysNkjLKBda7eA==", + "license": "MIT" + }, + "node_modules/@react-pdf/render": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@react-pdf/render/-/render-4.5.1.tgz", + "integrity": "sha512-IW/N4HWJWtioBXCf7n02IR24VJJ8gbdS3jGypf+vW/rSErEx3/URRzh9UK6Ma8Fpog9+T/W6GE2NHJ5AAKHhVA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.13", + "@react-pdf/fns": "3.1.3", + "@react-pdf/primitives": "^4.3.0", + "@react-pdf/textkit": "^6.3.0", + "@react-pdf/types": "^2.11.1", + "abs-svg-path": "^0.1.1", + "color-string": "^2.1.4", + "normalize-svg-path": "^1.1.0", + "parse-svg-path": "^0.1.2", + "svg-arc-to-cubic-bezier": "^3.2.0" + } + }, + "node_modules/@react-pdf/renderer": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@react-pdf/renderer/-/renderer-4.5.1.tgz", + "integrity": "sha512-5r1VQrE6FRLXX5wWUxwZzM24E2BJMo6g8AQWuS8WyPs9ugu5yMnb2g8/RpPYka/Z6J+RUEWc32wty2NoUJF42Q==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.13", + "@react-pdf/fns": "3.1.3", + "@react-pdf/font": "^4.0.8", + "@react-pdf/layout": "^4.6.1", + "@react-pdf/pdfkit": "^5.1.1", + "@react-pdf/primitives": "^4.3.0", + "@react-pdf/reconciler": "^2.0.0", + "@react-pdf/render": "^4.5.1", + "@react-pdf/types": "^2.11.1", + "events": "^3.3.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "queue": "^6.0.1" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@react-pdf/stylesheet": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@react-pdf/stylesheet/-/stylesheet-6.2.1.tgz", + "integrity": "sha512-2+UEk+7e+z8baaWi2l5kPLWmwtJeOI+T5wW9GGeN3iDH7vd3kbTqOpN1yt9mmfNVZFxQsnDHpznFb5v5UF983A==", + "license": "MIT", + "dependencies": { + "@react-pdf/fns": "3.1.3", + "@react-pdf/types": "^2.11.1", + "color-string": "^2.1.4", + "hsl-to-hex": "^1.0.0", + "media-engine": "^1.0.3", + "postcss-value-parser": "^4.1.0" + } + }, + "node_modules/@react-pdf/svg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@react-pdf/svg/-/svg-1.1.0.tgz", + "integrity": "sha512-cTIHXiz9x1HrbfqzfxfZP3FRdDwUXG77QWF6Fb5MP/lV3ONxR+g0Z3hwtBatCS9HeGBQCpxX/Lzb8wHE+co1PA==", + "license": "MIT", + "dependencies": { + "@react-pdf/primitives": "^4.3.0" + } + }, + "node_modules/@react-pdf/textkit": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@react-pdf/textkit/-/textkit-6.3.0.tgz", + "integrity": "sha512-v6+V8nAcVwm7s2s1jIG2MD3Iw//x/k+XrH1foWOELBE4b32pyDgKyPXN/6KJE0dnX7+fVy27uctLNCLNMvzKzQ==", + "license": "MIT", + "dependencies": { + "@react-pdf/fns": "3.1.3", + "bidi-js": "^1.0.2", + "hyphen": "^1.6.4", + "unicode-properties": "^1.4.1" + } + }, + "node_modules/@react-pdf/types": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/@react-pdf/types/-/types-2.11.1.tgz", + "integrity": "sha512-i9xQgfaDU9QoeNnbp6rltXCWg1huEh195rpOuN8cE4BZ2FuLdQrsIcb2dhFF9aOxXf+XBA6LOSpIW051MDD/bw==", + "license": "MIT", + "dependencies": { + "@react-pdf/font": "^4.0.8", + "@react-pdf/primitives": "^4.3.0", + "@react-pdf/stylesheet": "^6.2.1" + } + }, + "node_modules/@redis/bloom": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-5.12.1.tgz", + "integrity": "sha512-PUUfv+ms7jgPSBVoo/DN4AkPHj4D5TZSd6SbJX7egzBplkYUcKmHRE8RKia7UtZ8bSQbLguLvxVO+asKtQfZWA==", + "license": "MIT", + "engines": { + "node": ">= 18.19.0" + }, + "peerDependencies": { + "@redis/client": "^5.12.1" + } + }, + "node_modules/@redis/client": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-5.12.1.tgz", + "integrity": "sha512-7aPGWeqA3uFm43o19umzdl16CEjK/JQGtSXVPevplTaOU3VJA/rseBC1QvYUz9lLDIMBimc4SW/zrW4S89BaCA==", + "license": "MIT", + "dependencies": { + "cluster-key-slot": "1.1.2" + }, + "engines": { + "node": ">= 18.19.0" + }, + "peerDependencies": { + "@node-rs/xxhash": "^1.1.0", + "@opentelemetry/api": ">=1 <2" + }, + "peerDependenciesMeta": { + "@node-rs/xxhash": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + } + } + }, + "node_modules/@redis/json": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@redis/json/-/json-5.12.1.tgz", + "integrity": "sha512-eOze75esLve4vfqDel7aMX08CNaiLLQS2fV8mpRN9NxPe1rVR4vQyYiW/OgtGUysF6QOr9ANhfxABKNOJfXdKg==", + "license": "MIT", + "engines": { + "node": ">= 18.19.0" + }, + "peerDependencies": { + "@redis/client": "^5.12.1" + } + }, + "node_modules/@redis/search": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@redis/search/-/search-5.12.1.tgz", + "integrity": "sha512-ItlxbxC9cKI6IU1TLWoczwJCRb6TdmkEpWv05UrPawqaAnWGRu3rcIqsc5vN483T2fSociuyV1UkWIL5I4//2w==", + "license": "MIT", + "engines": { + "node": ">= 18.19.0" + }, + "peerDependencies": { + "@redis/client": "^5.12.1" + } + }, + "node_modules/@redis/time-series": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-5.12.1.tgz", + "integrity": "sha512-c6JL6E3EcZJuNqKFz+KM+l9l5mpcQiKvTwgA3blt5glWJ8hjDk0yeHN3beE/MpqYIQ8UEX44ItQzgkE/gCBELQ==", + "license": "MIT", + "engines": { + "node": ">= 18.19.0" + }, + "peerDependencies": { + "@redis/client": "^5.12.1" + } + }, + "node_modules/@reduxjs/toolkit": { + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.11.2.tgz", + "integrity": "sha512-Kd6kAHTA6/nUpp8mySPqj3en3dm0tdMIgbttnQ1xFMVpufoj+ADi8pXLBsd4xzTRHQa7t/Jv8W5UnCuW4kuWMQ==", + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@standard-schema/utils": "^0.3.0", + "immer": "^11.0.0", + "redux": "^5.0.1", + "redux-thunk": "^3.1.0", + "reselect": "^5.1.0" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18 || ^19", + "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, + "node_modules/@reduxjs/toolkit/node_modules/immer": { + "version": "11.1.4", + "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.4.tgz", + "integrity": "sha512-XREFCPo6ksxVzP4E0ekD5aMdf8WMwmdNaz6vuvxgI40UaEiu6q3p8X52aU6GdyvLY3XXX/8R7JOTXStz/nBbRw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.16.1.tgz", + "integrity": "sha512-TvZbIpeKqGQQ7X0zSCvPH9riMSFQFSggnfBjFZ1mEoILW+UuXCKwOoPcgjMwiUtRqFZ8jWhPJc4um14vC6I4ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sparticuz/chromium": { + "version": "147.0.0", + "resolved": "https://registry.npmjs.org/@sparticuz/chromium/-/chromium-147.0.0.tgz", + "integrity": "sha512-4ZKeAQQa8up2mt675qSitztLdbQrlf8BKdC5naeap+5Mv1OV1OlJdPoU+EJC/p5sQUJUQmN4r+q5+EhaaOUHpQ==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.11", + "tar-fs": "^3.1.2" + }, + "engines": { + "node": ">=20.11.0" + } + }, + "node_modules/@stablelib/base64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/base64/-/base64-1.0.1.tgz", + "integrity": "sha512-1bnPQqSxSuc3Ii6MhBysoWCg58j97aUjuCSZrGSmDxNqtytIi0k8utUenAwTZN4V5mXXYGsVUI9zeBqy+jBOSQ==", + "license": "MIT" + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "license": "MIT" + }, + "node_modules/@standard-schema/utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz", + "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", + "license": "MIT" + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "license": "Apache-2.0" + }, + "node_modules/@swc/helpers": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", + "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3", + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.2.tgz", + "integrity": "sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.19.0", + "jiti": "^2.6.1", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.2.2" + } + }, + "node_modules/@tailwindcss/node/node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/@tailwindcss/node/node_modules/tailwindcss": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.2.tgz", + "integrity": "sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==", + "license": "MIT" + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.2.tgz", + "integrity": "sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg==", + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.2.2", + "@tailwindcss/oxide-darwin-arm64": "4.2.2", + "@tailwindcss/oxide-darwin-x64": "4.2.2", + "@tailwindcss/oxide-freebsd-x64": "4.2.2", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.2", + "@tailwindcss/oxide-linux-arm64-gnu": "4.2.2", + "@tailwindcss/oxide-linux-arm64-musl": "4.2.2", + "@tailwindcss/oxide-linux-x64-gnu": "4.2.2", + "@tailwindcss/oxide-linux-x64-musl": "4.2.2", + "@tailwindcss/oxide-wasm32-wasi": "4.2.2", + "@tailwindcss/oxide-win32-arm64-msvc": "4.2.2", + "@tailwindcss/oxide-win32-x64-msvc": "4.2.2" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.2.tgz", + "integrity": "sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.2.tgz", + "integrity": "sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.2.2.tgz", + "integrity": "sha512-n4goKQbW8RVXIbNKRB/45LzyUqN451deQK0nzIeauVEqjlI49slUlgKYJM2QyUzap/PcpnS7kzSUmPb1sCRvYQ==", + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.2.2", + "@tailwindcss/oxide": "4.2.2", + "postcss": "^8.5.6", + "tailwindcss": "4.2.2" + } + }, + "node_modules/@tailwindcss/postcss/node_modules/tailwindcss": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.2.tgz", + "integrity": "sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==", + "license": "MIT" + }, + "node_modules/@tanstack/query-core": { + "version": "5.90.16", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.90.16.tgz", + "integrity": "sha512-MvtWckSVufs/ja463/K4PyJeqT+HMlJWtw6PrCpywznd2NSgO3m4KwO9RqbFqGg6iDE8vVMFWMeQI4Io3eEYww==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "license": "MIT" + }, + "node_modules/@traceloop/ai-semantic-conventions": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@traceloop/ai-semantic-conventions/-/ai-semantic-conventions-0.20.0.tgz", + "integrity": "sha512-bvivhZU6U8TW4TKktYnjdTi+7GE4WxI8epaGjawalSKDunmxaA+4UVFQ+4tSCBvp2Scby+gnYNaTZSrtABfOlQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.9.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@traceloop/instrumentation-anthropic": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@traceloop/instrumentation-anthropic/-/instrumentation-anthropic-0.20.0.tgz", + "integrity": "sha512-xQcPxVrKr3yT9+ZEM3skYXikJc/ocZlGDIcsBQ3mMwL3Weq1QL7jx/uGLXvrSO2Yh0DWUjWI6Q/oiRCEUM6P8w==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/core": "^2.0.1", + "@opentelemetry/instrumentation": "^0.203.0", + "@opentelemetry/semantic-conventions": "^1.36.0", + "@traceloop/ai-semantic-conventions": "0.20.0", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@traceloop/instrumentation-anthropic/node_modules/@opentelemetry/api-logs": { + "version": "0.203.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.203.0.tgz", + "integrity": "sha512-9B9RU0H7Ya1Dx/Rkyc4stuBZSGVQF27WigitInx2QQoj6KUpEFYPKoWjdFTunJYxmXmh17HeBvbMa1EhGyPmqQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@traceloop/instrumentation-anthropic/node_modules/@opentelemetry/instrumentation": { + "version": "0.203.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.203.0.tgz", + "integrity": "sha512-ke1qyM+3AK2zPuBPb6Hk/GCsc5ewbLvPNkEuELx/JmANeEp6ZjnZ+wypPAJSucTw0wvCGrUaibDSdcrGFoWxKQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.203.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@traceloop/instrumentation-anthropic/node_modules/cjs-module-lexer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", + "license": "MIT" + }, + "node_modules/@traceloop/instrumentation-anthropic/node_modules/import-in-the-middle": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.15.0.tgz", + "integrity": "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==", + "license": "Apache-2.0", + "dependencies": { + "acorn": "^8.14.0", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, + "node_modules/@traceloop/instrumentation-anthropic/node_modules/require-in-the-middle": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", + "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/@types/aws-lambda": { + "version": "8.10.161", + "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.161.tgz", + "integrity": "sha512-rUYdp+MQwSFocxIOcSsYSF3YYYC/uUpMbCY/mbO21vGqfrEYvNSoPyKYDj6RhXXpPfS0KstW9RwG3qXh9sL7FQ==", + "license": "MIT" + }, + "node_modules/@types/bcryptjs": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.6.tgz", + "integrity": "sha512-9xlo6R2qDs5uixm0bcIqCeMCE6HiQsIyel9KQySStiyqNl2tnj2mP3DX1Nf56MD6KMenNNlBBsy3LJ7gUEQPXQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/bunyan": { + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/@types/bunyan/-/bunyan-1.8.11.tgz", + "integrity": "sha512-758fRH7umIMk5qt5ELmRMff4mLDlN+xyYzC+dkPTdKwbSkJFvz6xwyScrytPU0QIBbRRwbiE8/BIg8bpajerNQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", + "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-shape": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz", + "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, + "node_modules/@types/debug": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", + "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/memcached": { + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/@types/memcached/-/memcached-2.2.10.tgz", + "integrity": "sha512-AM9smvZN55Gzs2wRrqeMHVP7KE8KWgCJO/XL5yCly2xF6EKa4YlbpK+cLSAH4NG/Ah64HrlegmGqW8kYws7Vxg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/mysql": { + "version": "2.15.27", + "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.27.tgz", + "integrity": "sha512-YfWiV16IY0OeBfBCk8+hXKmdTKrKlwKN1MNKAPBu5JYxLwBEZl7QzeEpGnlZb3VMGJrrGmB84gXiH+ofs/TezA==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "20.19.37", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.37.tgz", + "integrity": "sha512-8kzdPJ3FsNsVIurqBs7oodNnCEVbni9yUEkaHbgptDACOPW04jimGagZ51E6+lXUwJjgnBw+hyko/lkFWCldqw==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/nodemailer": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-8.0.0.tgz", + "integrity": "sha512-fyf8jWULsCo0d0BuoQ75i6IeoHs47qcqxWc7yUdUcV0pOZGjUTTOvwdG1PRXUDqN/8A64yQdQdnA2pZgcdi+cA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/oracledb": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@types/oracledb/-/oracledb-6.5.2.tgz", + "integrity": "sha512-kK1eBS/Adeyis+3OlBDMeQQuasIDLUYXsi2T15ccNJ0iyUpQ4xDF7svFu3+bGVrI0CMBUclPciz+lsQR3JX3TQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/pg": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.20.0.tgz", + "integrity": "sha512-bEPFOaMAHTEP1EzpvHTbmwR8UsFyHSKsRisLIHVMXnpNefSbGA1bD6CVy+qKjGSqmZqNqBDV2azOBo8TgkcVow==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" + } + }, + "node_modules/@types/pg-pool": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/pg-pool/-/pg-pool-2.0.7.tgz", + "integrity": "sha512-U4CwmGVQcbEuqpyju8/ptOKg6gEC+Tqsvj2xS9o1g71bUh8twxnC6ZL5rZKCsGN0iyH0CwgUyc9VR5owNQF9Ng==", + "license": "MIT", + "dependencies": { + "@types/pg": "*" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.28", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.28.tgz", + "integrity": "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@types/tedious": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@types/tedious/-/tedious-4.0.14.tgz", + "integrity": "sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@types/use-sync-external-store": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", + "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", + "license": "MIT" + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.2.0.tgz", + "integrity": "sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "7.2.0", + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/typescript-estree": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz", + "integrity": "sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz", + "integrity": "sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz", + "integrity": "sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz", + "integrity": "sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "7.2.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", + "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", + "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@vercel/blob": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@vercel/blob/-/blob-2.4.0.tgz", + "integrity": "sha512-ncQ8CRb6XoEAYJwjOTRGpACRT6h/AeY+/33gLyeVxG5BIes27OPm1jmqreF+JHjcTmGhClTP+kBpmyLfbV0xew==", + "license": "Apache-2.0", + "dependencies": { + "async-retry": "^1.3.3", + "is-buffer": "^2.0.5", + "is-node-process": "^1.2.0", + "throttleit": "^2.1.0", + "undici": "^6.23.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@vercel/functions": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@vercel/functions/-/functions-3.6.0.tgz", + "integrity": "sha512-Xj68JYqqJwtqFWJN7EWmFN7MOiUjv5whjw48UEKqQbg8r7hRkhuJhncTU0ba3jJCh/wxEuLWckrtsKcrHQraxw==", + "license": "Apache-2.0", + "dependencies": { + "@vercel/oidc": "3.4.1" + }, + "engines": { + "node": ">= 20" + }, + "peerDependencies": { + "@aws-sdk/credential-provider-web-identity": "*" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-provider-web-identity": { + "optional": true + } + } + }, + "node_modules/@vercel/oidc": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.4.1.tgz", + "integrity": "sha512-H6B+/ig/GoahccL3WZjiHayHw1H5KhvTJNceqYulwfK9kkz5iul2hTmYzcJ7tTCQzyd0dutuL9xYFZCyLUqsog==", + "license": "Apache-2.0", + "engines": { + "node": ">= 20" + } + }, + "node_modules/abs-svg-path": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/abs-svg-path/-/abs-svg-path-0.1.1.tgz", + "integrity": "sha512-d8XPSGjfyzlXC3Xx891DJRyZfqk5JU0BJrDQcsWomFIV1/BIzPW5HDH5iDdWpqWaav0YVIEzT1RHTwWr0FFshA==", + "license": "MIT" + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/async-retry": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", + "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", + "license": "MIT", + "dependencies": { + "retry": "0.13.1" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/autoprefixer": { + "version": "10.4.27", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.27.tgz", + "integrity": "sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1", + "caniuse-lite": "^1.0.30001774", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.1.tgz", + "integrity": "sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axios": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.15.0.tgz", + "integrity": "sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", + "proxy-from-env": "^2.1.0" + } + }, + "node_modules/axios/node_modules/proxy-from-env": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/b4a": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.0.tgz", + "integrity": "sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==", + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/bare-events": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", + "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", + "license": "Apache-2.0", + "peerDependencies": { + "bare-abort-controller": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + } + } + }, + "node_modules/bare-fs": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.7.0.tgz", + "integrity": "sha512-xzqKsCFxAek9aezYhjJuJRXBIaYlg/0OGDTZp+T8eYmYMlm66cs6cYko02drIyjN2CBbi+I6L7YfXyqpqtKRXA==", + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4", + "bare-url": "^2.2.2", + "fast-fifo": "^1.3.2" + }, + "engines": { + "bare": ">=1.16.0" + }, + "peerDependencies": { + "bare-buffer": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + } + } + }, + "node_modules/bare-os": { + "version": "3.8.7", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.8.7.tgz", + "integrity": "sha512-G4Gr1UsGeEy2qtDTZwL7JFLo2wapUarz7iTMcYcMFdS89AIQuBoyjgXZz0Utv7uHs3xA9LckhVbeBi8lEQrC+w==", + "license": "Apache-2.0", + "engines": { + "bare": ">=1.14.0" + } + }, + "node_modules/bare-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", + "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", + "license": "Apache-2.0", + "dependencies": { + "bare-os": "^3.0.1" + } + }, + "node_modules/bare-stream": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.13.0.tgz", + "integrity": "sha512-3zAJRZMDFGjdn+RVnNpF9kuELw+0Fl3lpndM4NcEOhb9zwtSo/deETfuIwMSE5BXanA0FrN1qVjffGwAg2Y7EA==", + "license": "Apache-2.0", + "dependencies": { + "streamx": "^2.25.0", + "teex": "^1.0.1" + }, + "peerDependencies": { + "bare-abort-controller": "*", + "bare-buffer": "*", + "bare-events": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + }, + "bare-buffer": { + "optional": true + }, + "bare-events": { + "optional": true + } + } + }, + "node_modules/bare-url": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.4.0.tgz", + "integrity": "sha512-NSTU5WN+fy/L0DDenfE8SXQna4voXuW0FHM7wH8i3/q9khUSchfPbPezO4zSFMnDGIf9YE+mt/RWhZgNRKRIXA==", + "license": "Apache-2.0", + "dependencies": { + "bare-path": "^3.0.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.10", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.10.tgz", + "integrity": "sha512-sUoJ3IMxx4AyRqO4MLeHlnGDkyXRoUG0/AI9fjK+vS72ekpV0yWVY7O0BVjmBcRtkNcsAO2QDZ4tdKKGoI6YaQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/basic-ftp": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.2.2.tgz", + "integrity": "sha512-1tDrzKsdCg70WGvbFss/ulVAxupNauGnOlgpyjKzeQxzyllBLS0CGLV7tjIXTK3ZQA9/FBEm9qyFFN1bciA6pw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/bcryptjs": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-3.0.3.tgz", + "integrity": "sha512-GlF5wPWnSa/X5LKM1o0wz0suXIINz1iHRLvTS+sLyi7XPbe5ycmYI3DlZqVGZZtDgl4DmasFg7gOB3JYbphV5g==", + "license": "BSD-3-Clause", + "bin": { + "bcrypt": "bin/bcrypt" + } + }, + "node_modules/bidi-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", + "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "license": "MIT", + "dependencies": { + "require-from-string": "^2.0.2" + } + }, + "node_modules/bignumber.js": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", + "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brotli": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz", + "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==", + "license": "MIT", + "dependencies": { + "base64-js": "^1.1.2" + } + }, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "license": "MIT", + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "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": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001781", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001781.tgz", + "integrity": "sha512-RdwNCyMsNBftLjW6w01z8bKEvT6e/5tpPVEgtn22TiLGlstHOVecsX2KHFkD5e/vRnIE4EGzpuIODb3mtswtkw==", + "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/canonicalize": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/canonicalize/-/canonicalize-1.0.8.tgz", + "integrity": "sha512-0CNTVCLZggSh7bc5VkX5WWPWO+cyZbNd07IHIsSXLia/eAq+r836hgk+8BKoEh7949Mda87VUOitx5OddVj64A==", + "license": "Apache-2.0" + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chromium-bidi": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-14.0.0.tgz", + "integrity": "sha512-9gYlLtS6tStdRWzrtXaTMnqcM4dudNegMXJxkR0I/CXObHalYeYcAMPrL19eroNZHtJ8DQmu1E+ZNOYu/IXMXw==", + "license": "Apache-2.0", + "dependencies": { + "mitt": "^3.0.1", + "zod": "^3.24.1" + }, + "peerDependencies": { + "devtools-protocol": "*" + } + }, + "node_modules/chromium-bidi/node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/cjs-module-lexer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", + "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==", + "license": "MIT" + }, + "node_modules/class-variance-authority": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "license": "MIT" + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cluster-key-slot": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", + "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/color-string": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz", + "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==", + "license": "MIT", + "dependencies": { + "color-name": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/color-string/node_modules/color-name": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", + "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/cross-fetch": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.1.0.tgz", + "integrity": "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==", + "license": "MIT", + "dependencies": { + "node-fetch": "^2.7.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", + "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js-light": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", + "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", + "license": "MIT" + }, + "node_modules/decode-named-character-reference": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "license": "MIT", + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/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/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/devtools-protocol": { + "version": "0.0.1581282", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1581282.tgz", + "integrity": "sha512-nv7iKtNZQshSW2hKzYNr46nM/Cfh5SEvE2oV0/SEGgc9XupIY5ggf84Cz8eJIkBce7S3bmTAauFD6aysMpnqsQ==", + "license": "BSD-3-Clause" + }, + "node_modules/dfa": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz", + "integrity": "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==", + "license": "MIT" + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true, + "license": "MIT" + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/docx": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/docx/-/docx-9.6.1.tgz", + "integrity": "sha512-ZJja9/KBUuFC109sCMzovoq2GR2wCG/AuxivjA+OHj/q0TEgJIm3S7yrlUxIy3B+bV8YDj/BiHfWyrRFmyWpDQ==", + "license": "MIT", + "dependencies": { + "@types/node": "^25.2.3", + "hash.js": "^1.1.7", + "jszip": "^3.10.1", + "nanoid": "^5.1.3", + "xml": "^1.0.1", + "xml-js": "^1.6.8" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/docx/node_modules/@types/node": { + "version": "25.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.6.0.tgz", + "integrity": "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.19.0" + } + }, + "node_modules/docx/node_modules/nanoid": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.7.tgz", + "integrity": "sha512-ua3NDgISf6jdwezAheMOk4mbE1LXjm1DfMUDMuJf4AqxLFK3ccGpgWizwa5YV7Yz9EpXwEaWoRXSb/BnV0t5dQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^18 || >=20" + } + }, + "node_modules/docx/node_modules/undici-types": { + "version": "7.19.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.19.2.tgz", + "integrity": "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==", + "license": "MIT" + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.322", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.322.tgz", + "integrity": "sha512-vFU34OcrvMcH66T+dYC3G4nURmgfDVewMIu6Q2urXpumAPSMmzvcn04KVVV8Opikq8Vs5nUbO/8laNhNRqSzYw==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/emoji-regex-xs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz", + "integrity": "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==", + "license": "MIT" + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz", + "integrity": "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/es-abstract": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", + "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.3.1.tgz", + "integrity": "sha512-zWwRvqWiuBPr0muUG/78cW3aHROFCNIQ3zpmYDpwdbnt2m+xlNyRWpHBpa2lJjSBit7BQ+RXA1iwbSmu5yJ/EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.1", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.1.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.3.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.5", + "math-intrinsics": "^1.1.0", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-toolkit": { + "version": "1.45.1", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.45.1.tgz", + "integrity": "sha512-/jhoOj/Fx+A+IIyDNOvO3TItGmlMKhtX8ISAHKE90c4b/k1tqaqEZ+uUqfpU8DMnW5cgNJv606zS55jGvza0Xw==", + "license": "MIT", + "workspaces": [ + "docs", + "benchmarks" + ] + }, + "node_modules/esbuild": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.0.tgz", + "integrity": "sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.0", + "@esbuild/android-arm": "0.28.0", + "@esbuild/android-arm64": "0.28.0", + "@esbuild/android-x64": "0.28.0", + "@esbuild/darwin-arm64": "0.28.0", + "@esbuild/darwin-x64": "0.28.0", + "@esbuild/freebsd-arm64": "0.28.0", + "@esbuild/freebsd-x64": "0.28.0", + "@esbuild/linux-arm": "0.28.0", + "@esbuild/linux-arm64": "0.28.0", + "@esbuild/linux-ia32": "0.28.0", + "@esbuild/linux-loong64": "0.28.0", + "@esbuild/linux-mips64el": "0.28.0", + "@esbuild/linux-ppc64": "0.28.0", + "@esbuild/linux-riscv64": "0.28.0", + "@esbuild/linux-s390x": "0.28.0", + "@esbuild/linux-x64": "0.28.0", + "@esbuild/netbsd-arm64": "0.28.0", + "@esbuild/netbsd-x64": "0.28.0", + "@esbuild/openbsd-arm64": "0.28.0", + "@esbuild/openbsd-x64": "0.28.0", + "@esbuild/openharmony-arm64": "0.28.0", + "@esbuild/sunos-x64": "0.28.0", + "@esbuild/win32-arm64": "0.28.0", + "@esbuild/win32-ia32": "0.28.0", + "@esbuild/win32-x64": "0.28.0" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-next": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.5.tgz", + "integrity": "sha512-zogs9zlOiZ7ka+wgUnmcM0KBEDjo4Jis7kxN1jvC0N4wynQ2MIx/KBkg4mVF63J5EK4W0QMCn7xO3vNisjaAoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@next/eslint-plugin-next": "14.2.5", + "@rushstack/eslint-patch": "^1.3.3", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || 7.0.0 - 7.2.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" + }, + "peerDependencies": { + "eslint": "^7.23.0 || ^8.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz", + "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.4.0", + "get-tsconfig": "^4.10.0", + "is-bun-module": "^2.0.0", + "stable-hash": "^0.0.5", + "tinyglobby": "^0.2.13", + "unrs-resolver": "^1.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-resolver-typescript" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "5.0.0-canary-7118f5dd7-20230705", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.0.0-canary-7118f5dd7-20230705.tgz", + "integrity": "sha512-AZYbMo/NW9chdL7vk6HQzQhT+PvTAEVqWk9ziruUoW2kAOcN5qNyelv70e0F1VNQAbvutOC9oc+xfWycI9FxDw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.6.tgz", + "integrity": "sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/events-universal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.7.0" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-sha256": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-sha256/-/fast-sha256-1.3.0.tgz", + "integrity": "sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ==", + "license": "Unlicense" + }, + "node_modules/fast-xml-builder": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.1.4.tgz", + "integrity": "sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "path-expression-matcher": "^1.1.3" + } + }, + "node_modules/fast-xml-parser": { + "version": "5.5.12", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.5.12.tgz", + "integrity": "sha512-nUR0q8PPfoA/svPM43Gup7vLOZWppaNrYgGmrVqrAVJa7cOH4hMG6FX9M4mQ8dZA1/ObGZHzES7Ed88hxEBSJg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "fast-xml-builder": "^1.1.4", + "path-expression-matcher": "^1.5.0", + "strnum": "^2.2.3" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/fflate": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.3.tgz", + "integrity": "sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==", + "license": "MIT" + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/firecrawl": { + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/firecrawl/-/firecrawl-4.16.0.tgz", + "integrity": "sha512-7SJ/FWhZBtW2gTCE/BsvU+gbfIpfTq+D9IH82l9MacauLVptaY6EdYAhrK3YSMC9yr5NxvxRcpZKcXG/nqjiiQ==", + "license": "MIT", + "dependencies": { + "axios": "^1.13.5", + "typescript-event-target": "^1.1.1", + "zod": "^3.23.8", + "zod-to-json-schema": "^3.23.0" + }, + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/firecrawl/node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/fontkit": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/fontkit/-/fontkit-2.0.4.tgz", + "integrity": "sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g==", + "license": "MIT", + "dependencies": { + "@swc/helpers": "^0.5.12", + "brotli": "^1.3.2", + "clone": "^2.1.2", + "dfa": "^1.2.0", + "fast-deep-equal": "^3.1.3", + "restructure": "^3.0.0", + "tiny-inflate": "^1.0.3", + "unicode-properties": "^1.4.0", + "unicode-trie": "^2.0.0" + } + }, + "node_modules/fontkit/node_modules/@swc/helpers": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.21.tgz", + "integrity": "sha512-jI/VAmtdjB/RnI8GTnokyX7Ug8c+g+ffD6QRLa6XQewtnGyukKkKSk3wLTM3b5cjt1jNh9x0jfVlagdN2gDKQg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "license": "MIT", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/forwarded-parse": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/forwarded-parse/-/forwarded-parse-2.1.2.tgz", + "integrity": "sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==", + "license": "MIT" + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gaxios": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.3.tgz", + "integrity": "sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ==", + "license": "Apache-2.0", + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "node-fetch": "^3.3.2", + "rimraf": "^5.0.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/gaxios/node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/gaxios/node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/gaxios/node_modules/rimraf": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", + "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", + "license": "ISC", + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/gcp-metadata": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.3.tgz", + "integrity": "sha512-ziTrzUhhpL9Zk5k0HHzgP/KIpWDJT0VMBC/ynt/QIBvTW+UUcSivQRl6VlwTf/EilDxtSWklHoRsKy1c4k+59w==", + "license": "Apache-2.0", + "dependencies": { + "gaxios": "7.1.3", + "google-logging-utils": "1.1.3", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-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-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": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.13.7", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.7.tgz", + "integrity": "sha512-7tN6rFgBlMgpBML5j8typ92BKFi2sFQvIdpAqLA2beia5avZDrMs0FLZiM5etShWq5irVyGcGMEA1jcDaK7A/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/get-uri": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz", + "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==", + "license": "MIT", + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "license": "BSD-2-Clause" + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/google-logging-utils": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz", + "integrity": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hsl-to-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-to-hex/-/hsl-to-hex-1.0.0.tgz", + "integrity": "sha512-K6GVpucS5wFf44X0h2bLVRDsycgJmf9FF2elg+CrqD8GcFU8c6vYhgXn8NjUkFCwj+xDFb70qgLbTUm6sxwPmA==", + "license": "MIT", + "dependencies": { + "hsl-to-rgb-for-reals": "^1.1.0" + } + }, + "node_modules/hsl-to-rgb-for-reals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/hsl-to-rgb-for-reals/-/hsl-to-rgb-for-reals-1.1.1.tgz", + "integrity": "sha512-LgOWAkrN0rFaQpfdWBQlv/VhkOxb5AsBjk6NQVx4yEzWS923T07X0M1Y0VNko2H52HeSpZrZNNMJ0aFqsdVzQg==", + "license": "ISC" + }, + "node_modules/html-url-attributes": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz", + "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https/-/https-1.0.0.tgz", + "integrity": "sha512-4EC57ddXrkaF0x83Oj8sM6SLQHAWXw90Skqu2M4AEWENZ3F02dFJE/GARA8igO79tcgYqGrD7ae4f5L3um2lgg==", + "license": "ISC" + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/husky": { + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", + "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", + "dev": true, + "license": "MIT", + "bin": { + "husky": "bin.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, + "node_modules/hyphen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/hyphen/-/hyphen-1.14.1.tgz", + "integrity": "sha512-kvL8xYl5QMTh+LwohVN72ciOxC0OEV79IPdJSTwEXok9y9QHebXGdFgrED4sWfiax/ODx++CAMk3hMy4XPJPOw==", + "license": "ISC" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz", + "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==", + "license": "MIT", + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "license": "MIT" + }, + "node_modules/immer": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/immer/-/immer-10.2.0.tgz", + "integrity": "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==", + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-in-the-middle": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-3.0.1.tgz", + "integrity": "sha512-pYkiyXVL2Mf3pozdlDGV6NAObxQx13Ae8knZk1UJRJ6uRW/ZRmTGHlQYtrsSl7ubuE5F8CD1z+s1n4RHNuTtuA==", + "license": "Apache-2.0", + "dependencies": { + "acorn": "^8.15.0", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^2.2.0", + "module-details-from-path": "^1.0.4" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/inline-style-parser": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", + "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", + "license": "MIT" + }, + "node_modules/inngest": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/inngest/-/inngest-4.5.0.tgz", + "integrity": "sha512-hpkXbShvbwV+YJoGDiJLuVQwMCCZ53P7q5s090hOa57CmQvUPn77M3/hSCv80VJgPd8UQy4+TcdYqOgnQ9mHzw==", + "license": "Apache-2.0", + "dependencies": { + "@bufbuild/protobuf": "^2.2.3", + "@inngest/ai": "^0.1.3", + "@jpwilliams/waitgroup": "^2.1.1", + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/auto-instrumentations-node": ">=0.75.0 <1.0.0", + "@opentelemetry/context-async-hooks": ">=2.0.0 <3.0.0", + "@opentelemetry/exporter-trace-otlp-http": ">=0.200.0 <0.300.0", + "@opentelemetry/instrumentation": ">=0.200.0 <0.300.0", + "@opentelemetry/resources": ">=2.0.0 <3.0.0", + "@opentelemetry/sdk-trace-base": ">=2.0.0 <3.0.0", + "@standard-schema/spec": "^1.0.0", + "@traceloop/instrumentation-anthropic": "^0.20.0", + "@types/debug": "^4.1.12", + "@types/ms": "~2.1.0", + "canonicalize": "^1.0.8", + "cross-fetch": "^4.0.0", + "debug": "^4.3.4", + "hash.js": "^1.1.7", + "json-stringify-safe": "^5.0.1", + "ms": "^2.1.3", + "serialize-error-cjs": "^0.1.3", + "temporal-polyfill": "^0.2.5", + "ulid": "^2.3.0", + "zod": "^3.25.0" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@sveltejs/kit": ">=1.27.3", + "@vercel/node": ">=2.15.9", + "aws-lambda": ">=1.0.7", + "express": ">=4.19.2", + "fastify": ">=4.21.0", + "h3": ">=1.8.1", + "hono": ">=4.2.7", + "koa": ">=2.14.2", + "next": ">=12.0.0", + "react": ">=18.0.0", + "typescript": ">=5.8.0", + "zod": "^3.25.0 || ^4.0.0" + }, + "peerDependenciesMeta": { + "@sveltejs/kit": { + "optional": true + }, + "@vercel/node": { + "optional": true + }, + "aws-lambda": { + "optional": true + }, + "express": { + "optional": true + }, + "fastify": { + "optional": true + }, + "h3": { + "optional": true + }, + "hono": { + "optional": true + }, + "koa": { + "optional": true + }, + "next": { + "optional": true + }, + "react": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/inngest/node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/ip-address": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", + "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/is-bun-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", + "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.7.1" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-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-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-node-process": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", + "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", + "license": "MIT" + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jay-peg": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/jay-peg/-/jay-peg-1.1.1.tgz", + "integrity": "sha512-D62KEuBxz/ip2gQKOEhk/mx14o7eiFRaU+VNNSP4MOiIkwb/D6B3G1Mfas7C/Fit8EsSV2/IWjZElx/Gs6A4ww==", + "license": "MIT", + "dependencies": { + "restructure": "^3.0.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, + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-cookie": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", + "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/js-md5": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/js-md5/-/js-md5-0.8.3.tgz", + "integrity": "sha512-qR0HB5uP6wCuRMrWPTrkMaev7MJZwJuuw4fnwAzRgP4J4/F8RwtodOKpGp4XpqsLBFzzgqIO42efFAyz2Et6KQ==", + "license": "MIT" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "license": "MIT", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, + "node_modules/json-schema-to-ts": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/json-schema-to-ts/-/json-schema-to-ts-3.1.1.tgz", + "integrity": "sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "ts-algebra": "^2.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "license": "ISC" + }, + "node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsonrepair": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/jsonrepair/-/jsonrepair-3.14.0.tgz", + "integrity": "sha512-tWPGKMZf/8UPim+fcW2EfcQ/d/7aKUrP6IECz9G3Tu6Q5dX0orSleqJ9z6sSw7qrQkjF8/Edo4DvsWBZ8H+HNg==", + "license": "ISC", + "bin": { + "jsonrepair": "bin/cli.js" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "license": "(MIT OR GPL-3.0-or-later)", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dev": true, + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/linebreak": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/linebreak/-/linebreak-1.1.0.tgz", + "integrity": "sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==", + "license": "MIT", + "dependencies": { + "base64-js": "0.0.8", + "unicode-trie": "^2.0.0" + } + }, + "node_modules/linebreak/node_modules/base64-js": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", + "integrity": "sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0" + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/lucide-react": { + "version": "0.400.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.400.0.tgz", + "integrity": "sha512-rpp7pFHh3Xd93KHixNgB0SqThMHpYNzsGUu69UaQbSZ75Q/J3m5t6EhKyMT3m4w2WOxmJ2mY0tD3vebnXqQryQ==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", + "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/media-engine": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/media-engine/-/media-engine-1.0.3.tgz", + "integrity": "sha512-aa5tG6sDoK+k70B9iEX1NeyfT8ObCKhNDs6lJVpwF6r8vhUfuKMslIcirq6HIUYuuUYLefcEQOn9bSBOvawtwg==", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "license": "MIT" + }, + "node_modules/module-details-from-path": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.4.tgz", + "integrity": "sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==", + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-postinstall": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/netmask": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.1.1.tgz", + "integrity": "sha512-eonl3sLUha+S1GzTPxychyhnUzKyeQkZ7jLjKrBagJgPla13F+uQ71HgpFefyHgqrjEbCPkDArxYsjY8/+gLKA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/next": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.5.tgz", + "integrity": "sha512-0f8aRfBVL+mpzfBjYfQuLWh2WyAwtJXCRfkPF4UJ5qd2YwrHczsrSzXU4tRMV0OAxR8ZJZWPFn6uhSC56UTsLA==", + "deprecated": "This version has a security vulnerability. Please upgrade to a patched version. See https://nextjs.org/blog/security-update-2025-12-11 for more details.", + "license": "MIT", + "dependencies": { + "@next/env": "14.2.5", + "@swc/helpers": "0.5.5", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", + "postcss": "8.4.31", + "styled-jsx": "5.1.1" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=18.17.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "14.2.5", + "@next/swc-darwin-x64": "14.2.5", + "@next/swc-linux-arm64-gnu": "14.2.5", + "@next/swc-linux-arm64-musl": "14.2.5", + "@next/swc-linux-x64-gnu": "14.2.5", + "@next/swc-linux-x64-musl": "14.2.5", + "@next/swc-win32-arm64-msvc": "14.2.5", + "@next/swc-win32-ia32-msvc": "14.2.5", + "@next/swc-win32-x64-msvc": "14.2.5" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.41.2", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/next/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": "Use your platform's native DOMException instead", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-exports-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.0.tgz", + "integrity": "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array.prototype.flatmap": "^1.3.3", + "es-errors": "^1.3.0", + "object.entries": "^1.1.9", + "semver": "^6.3.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/node-exports-info/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-releases": { + "version": "2.0.36", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz", + "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nodemailer": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-8.0.5.tgz", + "integrity": "sha512-0PF8Yb1yZuQfQbq+5/pZJrtF6WQcjTd5/S4JOHs9PGFxuTqoB/icwuB44pOdURHJbRKX1PPoJZtY7R4VUoCC8w==", + "license": "MIT-0", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-svg-path": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/normalize-svg-path/-/normalize-svg-path-1.1.0.tgz", + "integrity": "sha512-r9KHKG2UUeB5LoTouwDzBy2VxXlHsiM6fyLQvnJa0S5hrhzqElH/CH7TUGhT1fVvIYBIKf3OpY4YJ4CK+iaqHg==", + "license": "MIT", + "dependencies": { + "svg-arc-to-cubic-bezier": "^3.0.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pac-proxy-agent": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", + "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", + "license": "MIT", + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.6", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "license": "MIT", + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "license": "(MIT AND Zlib)" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/parse-svg-path": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/parse-svg-path/-/parse-svg-path-0.1.2.tgz", + "integrity": "sha512-JyPSBnkTJ0AI8GGJLfMXvKq42cj5c006fnLz6fXy6zfoVjJizi8BNTpu8on8ziI1cKy9d9DGNuY17Ce7wuejpQ==", + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-expression-matcher": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.5.0.tgz", + "integrity": "sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pdf-parse": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/pdf-parse/-/pdf-parse-2.4.5.tgz", + "integrity": "sha512-mHU89HGh7v+4u2ubfnevJ03lmPgQ5WU4CxAVmTSh/sxVTEDYd1er/dKS/A6vg77NX47KTEoihq8jZBLr8Cxuwg==", + "license": "Apache-2.0", + "dependencies": { + "@napi-rs/canvas": "0.1.80", + "pdfjs-dist": "5.4.296" + }, + "bin": { + "pdf-parse": "bin/cli.mjs" + }, + "engines": { + "node": ">=20.16.0 <21 || >=22.3.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/mehmet-kozan" + } + }, + "node_modules/pdfjs-dist": { + "version": "5.4.296", + "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-5.4.296.tgz", + "integrity": "sha512-DlOzet0HO7OEnmUmB6wWGJrrdvbyJKftI1bhMitK7O2N8W2gc757yyYBbINy9IDafXAV9wmKr9t7xsTaNKRG5Q==", + "license": "Apache-2.0", + "engines": { + "node": ">=20.16.0 || >=22.3.0" + }, + "optionalDependencies": { + "@napi-rs/canvas": "^0.1.80" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "license": "MIT" + }, + "node_modules/pg": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.21.0.tgz", + "integrity": "sha512-AUP1EYJuHraQGsVoCQVIcM7TEJVGtDzxWtGFZd8rds9d+CCXlU5Js1rYgfLNvxy9iJrpHjGrRjoi/3BT9fRyiA==", + "license": "MIT", + "dependencies": { + "pg-connection-string": "^2.13.0", + "pg-pool": "^3.14.0", + "pg-protocol": "^1.14.0", + "pg-types": "2.2.0", + "pgpass": "1.0.5" + }, + "engines": { + "node": ">= 16.0.0" + }, + "optionalDependencies": { + "pg-cloudflare": "^1.4.0" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/pg-cloudflare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.4.0.tgz", + "integrity": "sha512-Vo7z/6rrQYxpNRylp4Tlob2elzbh+N/MOQbxFVWCxS7oEx6jF53GTJFxK2WWpKuBRkmiin4Mt+xofFDjx09R0A==", + "license": "MIT", + "optional": true + }, + "node_modules/pg-connection-string": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.13.0.tgz", + "integrity": "sha512-EMnU9E2fSULdsbErBbMaXJvFeD9B4+nPcM3f+4lsiCR0BHLPrLVjv3DbyM2hgQQviKJaTWIRRTjKjWlHg3p2ig==", + "license": "MIT" + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "license": "ISC", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-pool": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.14.0.tgz", + "integrity": "sha512-gKtPkFdQPU3DksooVLi9LsjZxrsBUZIpa+7aVx+LV5pNh0KzP4Zleud2po+ConrxbuXGBJ6Hfer6hdgpIBpBaw==", + "license": "MIT", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.14.0.tgz", + "integrity": "sha512-n5taZ1kO3s9ngDTVxsEznOqCyToTgz0FLuPq0B33COy5pPpuWJpY3/2oRBVETuOgzdqRXfWpM9HIhp2LBBT1BA==", + "license": "MIT" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "license": "MIT", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "license": "MIT", + "dependencies": { + "split2": "^4.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/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/png-js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/png-js/-/png-js-2.0.0.tgz", + "integrity": "sha512-GdzJuUMc6ZSpxFJWVxtOH1bzYHym+TOnveqUjb+VJIbZWbZzyiRGFiKhbiielfpYbgMlhHVhsJ0FTazfuRFkMA==", + "dependencies": { + "fflate": "^0.8.2" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postal-mime": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/postal-mime/-/postal-mime-2.7.4.tgz", + "integrity": "sha512-0WdnFQYUrPGGTFu1uOqD2s7omwua8xaeYGdO6rb88oD5yJ/4pPHDA4sdWqfD8wQVfCny563n/HQS7zTFft+f/g==", + "license": "MIT-0" + }, + "node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "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-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "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-js": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", + "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.1.1" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "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==", + "dev": true, + "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-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==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.1.tgz", + "integrity": "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pptxgenjs": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pptxgenjs/-/pptxgenjs-4.0.1.tgz", + "integrity": "sha512-TeJISr8wouAuXw4C1F/mC33xbZs/FuEG6nH9FG1Zj+nuPcGMP5YRHl6X+j3HSUnS1f3at6k75ZZXPMZlA5Lj9A==", + "license": "MIT", + "dependencies": { + "@types/node": "^22.8.1", + "https": "^1.0.0", + "image-size": "^1.2.1", + "jszip": "^3.10.1" + } + }, + "node_modules/pptxgenjs/node_modules/@types/node": { + "version": "22.19.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.17.tgz", + "integrity": "sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/pptxgenjs/node_modules/image-size": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.1.tgz", + "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", + "license": "MIT", + "dependencies": { + "queue": "6.0.2" + }, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prisma": { + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.22.0.tgz", + "integrity": "sha512-vtpjW3XuYCSnMsNVBjLMNkTj6OZbudcPPTPYHqX0CJfpcdWciI1dM8uHETwmDxxiqEwCIE6WvXucWUetJgfu/A==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/engines": "5.22.0" + }, + "bin": { + "prisma": "build/index.js" + }, + "engines": { + "node": ">=16.13" + }, + "optionalDependencies": { + "fsevents": "2.3.3" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/protobufjs": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.6.2.tgz", + "integrity": "sha512-N9EiLovGEQOJSPF26Ij7qUGvahfEnq0eeYZ02aigIedkmz1qZSwjnP9SBITHJuF/6MYbIW4HDN8zdYjsjqJKXQ==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.5", + "@protobufjs/eventemitter": "^1.1.1", + "@protobufjs/fetch": "^1.1.1", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.2", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.1", + "@types/node": ">=13.7.0", + "long": "^5.3.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/proxy-agent": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", + "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.6", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.1.0", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/puppeteer-core": { + "version": "24.40.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.40.0.tgz", + "integrity": "sha512-MWL3XbUCfVgGR0gRsidzT6oKJT2QydPLhMITU6HoVWiiv4gkb6gJi3pcdAa8q4HwjBTbqISOWVP4aJiiyUJvag==", + "license": "Apache-2.0", + "dependencies": { + "@puppeteer/browsers": "2.13.0", + "chromium-bidi": "14.0.0", + "debug": "^4.4.3", + "devtools-protocol": "0.0.1581282", + "typed-query-selector": "^2.12.1", + "webdriver-bidi-protocol": "0.4.1", + "ws": "^8.19.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/queue": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", + "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", + "license": "MIT", + "dependencies": { + "inherits": "~2.0.3" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/react-markdown": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-9.1.0.tgz", + "integrity": "sha512-xaijuJB0kzGiUdG7nc2MOMDUDBWPyGAjZtUrow9XxUeua8IqeP+VlIfAZ3bphpcLTnSZXz6z9jcVC/TCwbfgdw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "html-url-attributes": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "unified": "^11.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=18", + "react": ">=18" + } + }, + "node_modules/react-redux": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz", + "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==", + "license": "MIT", + "dependencies": { + "@types/use-sync-external-store": "^0.0.6", + "use-sync-external-store": "^1.4.0" + }, + "peerDependencies": { + "@types/react": "^18.2.25 || ^19", + "react": "^18.0 || ^19", + "redux": "^5.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "redux": { + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "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/readable-stream/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/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/recharts": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-3.8.1.tgz", + "integrity": "sha512-mwzmO1s9sFL0TduUpwndxCUNoXsBw3u3E/0+A+cLcrSfQitSG62L32N69GhqUrrT5qKcAE3pCGVINC6pqkBBQg==", + "license": "MIT", + "workspaces": [ + "www" + ], + "dependencies": { + "@reduxjs/toolkit": "^1.9.0 || 2.x.x", + "clsx": "^2.1.1", + "decimal.js-light": "^2.5.1", + "es-toolkit": "^1.39.3", + "eventemitter3": "^5.0.1", + "immer": "^10.1.1", + "react-redux": "8.x.x || 9.x.x", + "reselect": "5.1.1", + "tiny-invariant": "^1.3.3", + "use-sync-external-store": "^1.2.2", + "victory-vendor": "^37.0.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-is": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/redis": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/redis/-/redis-5.12.1.tgz", + "integrity": "sha512-LDsoVvb/CpoV9EN3FXvgvSHNJWuCIzl9MiO3ppOevuGLpSGJhwfQjpEwfFJcQvNSddHADDdZaWx0HnmMxRXG7g==", + "license": "MIT", + "dependencies": { + "@redis/bloom": "5.12.1", + "@redis/client": "5.12.1", + "@redis/json": "5.12.1", + "@redis/search": "5.12.1", + "@redis/time-series": "5.12.1" + }, + "engines": { + "node": ">= 18.19.0" + } + }, + "node_modules/redux": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", + "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", + "license": "MIT" + }, + "node_modules/redux-thunk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz", + "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", + "license": "MIT", + "peerDependencies": { + "redux": "^5.0.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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/require-in-the-middle": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-8.0.1.tgz", + "integrity": "sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "module-details-from-path": "^1.0.3" + }, + "engines": { + "node": ">=9.3.0 || >=8.10.0 <9.0.0" + } + }, + "node_modules/reselect": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz", + "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==", + "license": "MIT" + }, + "node_modules/resend": { + "version": "6.12.3", + "resolved": "https://registry.npmjs.org/resend/-/resend-6.12.3.tgz", + "integrity": "sha512-FkEi6YPnVL96/LvH8+QP7NaeaBy5brYXwlRqUCqZZeNL0/iyKij18IPmyPXYauT/2ODn1JG04qKz+qlJfzqzTw==", + "license": "MIT", + "dependencies": { + "postal-mime": "2.7.4", + "svix": "1.92.2" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@react-email/render": "*" + }, + "peerDependenciesMeta": { + "@react-email/render": { + "optional": true + } + } + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/restructure": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/restructure/-/restructure-3.0.2.tgz", + "integrity": "sha512-gSfoiOEA0VPE6Tukkrr7I0RBdE0s7H1eFCDBk05l1KIQT1UIKNc5JZy6jdyW6eYH3aR3g5b3PuL77rq0hvwtAw==", + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "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/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-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/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sax": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serialize-error-cjs": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/serialize-error-cjs/-/serialize-error-cjs-0.1.4.tgz", + "integrity": "sha512-6a6dNqipzbCPlTFgztfNP2oG+IGcflMe/01zSzGrQcxGMKbIjOemBBD85pH92klWaJavAUWxAh9Z0aU28zxW6A==", + "deprecated": "Rolling release, please update to 0.2.0", + "license": "MIT-0", + "funding": { + "url": "https://github.com/sponsors/finwo" + } + }, + "node_modules/server-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/server-only/-/server-only-0.0.1.tgz", + "integrity": "sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==", + "license": "MIT" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "license": "MIT" + }, + "node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "license": "MIT", + "dependencies": { + "ip-address": "^10.0.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "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/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/stable-hash": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", + "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==", + "dev": true, + "license": "MIT" + }, + "node_modules/standardwebhooks": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/standardwebhooks/-/standardwebhooks-1.0.0.tgz", + "integrity": "sha512-BbHGOQK9olHPMvQNHWul6MYlrRTAOKn03rOe4A8O3CLWhNf4YHBqq2HJKKC+sfqpxiBY52pNeesD6jIiLDz8jg==", + "license": "MIT", + "dependencies": { + "@stablelib/base64": "^1.0.0", + "fast-sha256": "^1.3.0" + } + }, + "node_modules/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "license": "MIT" + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/streamx": { + "version": "2.25.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.25.0.tgz", + "integrity": "sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg==", + "license": "MIT", + "dependencies": { + "events-universal": "^1.0.0", + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + } + }, + "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/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strnum": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.3.tgz", + "integrity": "sha512-oKx6RUCuHfT3oyVjtnrmn19H1SiCqgJSg+54XqURKp5aCMbrXrhLjRN9TjuwMjiYstZ0MzDrHqkGZ5dFTKd+zg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, + "node_modules/style-to-js": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", + "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.14" + } + }, + "node_modules/style-to-object": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", + "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.7" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", + "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", + "license": "MIT", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/sucrase": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-arc-to-cubic-bezier": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/svg-arc-to-cubic-bezier/-/svg-arc-to-cubic-bezier-3.2.0.tgz", + "integrity": "sha512-djbJ/vZKZO+gPoSDThGNpKDO+o+bAeA4XQKovvkNCqnIS2t+S4qnLAGQhyyrulhCFRl1WWzAp0wUDV8PpTVU3g==", + "license": "ISC" + }, + "node_modules/svix": { + "version": "1.92.2", + "resolved": "https://registry.npmjs.org/svix/-/svix-1.92.2.tgz", + "integrity": "sha512-ZmuA3UVvlnF9EgxlzmPtF7CKjQb64Z6OFlyfdDfU0sdcC7dJa+3aOYX5B9mA+RS6ch1AxBa4UP/l6KmqfGtWBQ==", + "license": "MIT", + "dependencies": { + "standardwebhooks": "1.0.0" + } + }, + "node_modules/tailwind-merge": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.6.1.tgz", + "integrity": "sha512-Oo6tHdpZsGpkKG88HJ8RR1rg/RdnEkQEfMoEk2x1XRI3F1AxeU+ijRXpiVUF4UbLfcxxRGw6TbUINKYdWVsQTQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz", + "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.7", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tapable": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.2.tgz", + "integrity": "sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tar-fs": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.2.tgz", + "integrity": "sha512-QGxxTxxyleAdyM3kpFs14ymbYmNFrfY+pHj7Z8FgtbZ7w2//VAgLMac7sT6nRpIHjppXO2AwwEOg0bPFVRcmXw==", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^4.0.1", + "bare-path": "^3.0.0" + } + }, + "node_modules/tar-stream": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.8.tgz", + "integrity": "sha512-U6QpVRyCGHva435KoNWy9PRoi2IFYCgtEhq9nmrPPpbRacPs9IH4aJ3gbrFC8dPcXvdSZ4XXfXT5Fshbp2MtlQ==", + "license": "MIT", + "dependencies": { + "b4a": "^1.6.4", + "bare-fs": "^4.5.5", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/teex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", + "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==", + "license": "MIT", + "dependencies": { + "streamx": "^2.12.5" + } + }, + "node_modules/temporal-polyfill": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/temporal-polyfill/-/temporal-polyfill-0.2.5.tgz", + "integrity": "sha512-ye47xp8Cb0nDguAhrrDS1JT1SzwEV9e26sSsrWzVu+yPZ7LzceEcH0i2gci9jWfOfSCCgM3Qv5nOYShVUUFUXA==", + "license": "MIT", + "dependencies": { + "temporal-spec": "^0.2.4" + } + }, + "node_modules/temporal-spec": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/temporal-spec/-/temporal-spec-0.2.4.tgz", + "integrity": "sha512-lDMFv4nKQrSjlkHKAlHVqKrBG4DyFfa9F74cmBZ3Iy3ed8yvWnlWSIdi4IKfSqwmazAohBNwiN64qGx4y5Q3IQ==", + "license": "ISC" + }, + "node_modules/text-decoder": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz", + "integrity": "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==", + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/throttleit": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-2.1.0.tgz", + "integrity": "sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tiny-inflate": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", + "license": "MIT" + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-algebra": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ts-algebra/-/ts-algebra-2.0.0.tgz", + "integrity": "sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==", + "license": "MIT" + }, + "node_modules/ts-api-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", + "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-query-selector": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.1.tgz", + "integrity": "sha512-uzR+FzI8qrUEIu96oaeBJmd9E7CFEiQ3goA5qCVgc4s5llSubcfGHq9yUstZx/k4s9dXHVKsE35YWoFyvEqEHA==", + "license": "MIT" + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-event-target": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/typescript-event-target/-/typescript-event-target-1.1.2.tgz", + "integrity": "sha512-TvkrTUpv7gCPlcnSoEwUVUBwsdheKm+HF5u2tPAKubkIGMfovdSizCTaZRY/NhR8+Ijy8iZZUapbVQAsNrkFrw==", + "license": "MIT" + }, + "node_modules/ulid": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ulid/-/ulid-2.4.0.tgz", + "integrity": "sha512-fIRiVTJNcSRmXKPZtGzFQv9WRrZ3M9eoptl/teFJvjOzmpU+/K/JH6HZ8deBfb5vMEpicJcLn7JmvdknlMq7Zg==", + "license": "MIT", + "bin": { + "ulid": "bin/cli.js" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici": { + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.25.0.tgz", + "integrity": "sha512-ZgpWDC5gmNiuY9CnLVXEH8rl50xhRCuLNA97fAUnKi8RRuV4E6KG31pDTsLVUKnohJE0I3XDrTeEydAXRw47xg==", + "license": "MIT", + "engines": { + "node": ">=18.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "license": "MIT" + }, + "node_modules/unicode-properties": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.4.1.tgz", + "integrity": "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==", + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.0", + "unicode-trie": "^2.0.0" + } + }, + "node_modules/unicode-trie": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz", + "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==", + "license": "MIT", + "dependencies": { + "pako": "^0.2.5", + "tiny-inflate": "^1.0.0" + } + }, + "node_modules/unicode-trie/node_modules/pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", + "license": "MIT" + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unrs-resolver": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", + "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.0" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.11.1", + "@unrs/resolver-binding-android-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-x64": "1.11.1", + "@unrs/resolver-binding-freebsd-x64": "1.11.1", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", + "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-musl": "1.11.1", + "@unrs/resolver-binding-wasm32-wasi": "1.11.1", + "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", + "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", + "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "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": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/victory-vendor": { + "version": "37.3.6", + "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-37.3.6.tgz", + "integrity": "sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==", + "license": "MIT AND ISC", + "dependencies": { + "@types/d3-array": "^3.0.3", + "@types/d3-ease": "^3.0.0", + "@types/d3-interpolate": "^3.0.1", + "@types/d3-scale": "^4.0.2", + "@types/d3-shape": "^3.1.0", + "@types/d3-time": "^3.0.0", + "@types/d3-timer": "^3.0.0", + "d3-array": "^3.1.6", + "d3-ease": "^3.0.1", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "d3-shape": "^3.1.0", + "d3-time": "^3.0.0", + "d3-timer": "^3.0.1" + } + }, + "node_modules/vite-compatible-readable-stream": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/vite-compatible-readable-stream/-/vite-compatible-readable-stream-3.6.1.tgz", + "integrity": "sha512-t20zYkrSf868+j/p31cRIGN28Phrjm3nRSLR2fyc2tiWi4cZGVdv68yNlwnIINTkMTmPoMiSlc0OadaO7DXZaQ==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/webdriver-bidi-protocol": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.4.1.tgz", + "integrity": "sha512-ARrjNjtWRRs2w4Tk7nqrf2gBI0QXWuOmMCx2hU+1jUt6d00MjMxURrhxhGbrsoiZKJrhTSTzbIrc554iKI10qw==", + "license": "Apache-2.0" + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz", + "integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", + "license": "MIT" + }, + "node_modules/xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "license": "MIT", + "dependencies": { + "sax": "^1.2.4" + }, + "bin": { + "xml-js": "bin/cli.js" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yaml": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoga-layout": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/yoga-layout/-/yoga-layout-3.2.1.tgz", + "integrity": "sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==", + "license": "MIT" + }, + "node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.25.2", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.2.tgz", + "integrity": "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==", + "license": "ISC", + "peerDependencies": { + "zod": "^3.25.28 || ^4" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..af9512f --- /dev/null +++ b/package.json @@ -0,0 +1,73 @@ +{ + "name": "meseo", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "node scripts/build-site-tag.mjs && prisma generate && next build", + "db:push": "node scripts/prisma-safety-check.mjs && node scripts/prisma-db-push-retry.mjs", + "build:site-tag": "node scripts/build-site-tag.mjs", + "start": "next start", + "lint": "next lint", + "prepare": "husky" + }, + "dependencies": { + "@anthropic-ai/sdk": "^0.97.1", + "@clerk/nextjs": "^7.1.0", + "@dnd-kit/core": "^6.3.1", + "@dnd-kit/sortable": "^10.0.0", + "@dnd-kit/utilities": "^3.2.2", + "@mendable/firecrawl-js": "^4.24.1", + "@nangohq/frontend": "^0.70.1", + "@nangohq/node": "^0.70.1", + "@napi-rs/canvas": "^0.1.0", + "@prisma/client": "^5.22.0", + "@react-pdf/renderer": "^4.5.1", + "@sparticuz/chromium": "^147.0.0", + "@tailwindcss/postcss": "^4.2.2", + "@vercel/blob": "^2.4.0", + "@vercel/functions": "^3.6.0", + "bcryptjs": "^3.0.3", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.1", + "docx": "^9.6.1", + "fast-xml-parser": "^5.5.12", + "image-size": "^2.0.2", + "inngest": "^4.5.0", + "jsonrepair": "^3.14.0", + "lucide-react": "^0.400.0", + "next": "14.2.5", + "nodemailer": "^8.0.5", + "pdf-parse": "^2.4.5", + "pg": "^8.21.0", + "pptxgenjs": "^4.0.1", + "puppeteer-core": "^24.40.0", + "react": "^18", + "react-dom": "^18", + "react-markdown": "^9.1.0", + "recharts": "^3.8.1", + "redis": "^5.12.1", + "remark-gfm": "^4.0.1", + "resend": "^6.12.3", + "sharp": "^0.34.5", + "tailwind-merge": "^2.4.0", + "zod": "^4.4.3" + }, + "devDependencies": { + "@types/bcryptjs": "^2.4.6", + "@types/node": "^20", + "@types/nodemailer": "^8.0.0", + "@types/pg": "^8.20.0", + "@types/react": "^18", + "@types/react-dom": "^18", + "autoprefixer": "^10.0.1", + "esbuild": "^0.28.0", + "eslint": "^8", + "eslint-config-next": "14.2.5", + "husky": "^9.1.7", + "postcss": "^8", + "prisma": "^5.22.0", + "tailwindcss": "^3.4.1", + "typescript": "^5" + } +} diff --git a/postcss.config.mjs b/postcss.config.mjs new file mode 100644 index 0000000..2ef30fc --- /dev/null +++ b/postcss.config.mjs @@ -0,0 +1,9 @@ +/** @type {import('postcss-load-config').Config} */ +const config = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; + +export default config; diff --git a/prisma/schema.prisma b/prisma/schema.prisma new file mode 100644 index 0000000..e963be8 --- /dev/null +++ b/prisma/schema.prisma @@ -0,0 +1,3465 @@ +generator client { + provider = "prisma-client-js" +} + +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") + directUrl = env("DIRECT_URL") +} + +// ─── User (synced from Clerk) ──────────────────────────────────────────────── + +model User { + id String @id + name String? + email String @unique + image String? + // IANA timezone string (e.g. "America/Chicago"). Used by scheduled + // reports + cron timing so runs fire at the user's local hour + // rather than platform UTC. Falls back to "America/New_York" in + // the email report generator when null. + timezone String? + // Email notification preferences. JSON blob so new toggles can be + // added without a migration. Shape: + // { signalAlerts: true, weeklyDigest: true, auditCompletion: true, + // reportReady: true, teamActivity: false } + // Read by the alert / report senders before dispatch; a missing + // key defaults to true for the core channels (signal/audit/report) + // so new users don't go dark on important events by default. + emailPrefs Json? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + memberships OrgMembership[] + brandAccess BrandMembership[] + assignedTasks Task[] + contentBriefs ContentBrief[] + avatarConversations AvatarConversation[] +} + +// ─── Organization ──────────────────────────────────────────────────────────── + +model Organization { + id String @id @default(cuid()) + name String + slug String @unique + plan String @default("free") + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + memberships OrgMembership[] + brands Brand[] + trackedSites TrackedSite[] + subscription Subscription? + planUsage OrgPlanUsage? + whiteLabelConfig WhiteLabelConfig? + customDomains CustomDomain[] +} + +model OrgMembership { + id String @id @default(cuid()) + role String @default("member") + createdAt DateTime @default(now()) + + userId String + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + + orgId String + organization Organization @relation(fields: [orgId], references: [id], onDelete: Cascade) + + @@unique([userId, orgId]) +} + +// Per-brand access control. OrgMembership says "this user is in +// the org" (and owners/admins can see every brand in the org by +// virtue of that). BrandMembership is the finer-grained cut: +// non-owner members only see brands they've been explicitly added +// to. Resolving access order: +// 1. Owner role on the org → sees every brand unconditionally +// 2. BrandMembership row → sees that specific brand +// 3. neither → no access (sidebar hides brand, +// API returns 403) +// +// Kept as a join table rather than a String[] on User so the +// per-brand role can diverge from the org role (e.g. Admin on the +// org but Member on one specific brand) without contortions. +model BrandMembership { + id String @id @default(cuid()) + role String @default("member") // owner | admin | member | viewer + createdAt DateTime @default(now()) + + userId String + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + + @@unique([userId, brandId]) + @@index([brandId]) + @@index([userId]) +} + +// ─── Brand / Website ───────────────────────────────────────────────────────── + +model Brand { + id String @id @default(cuid()) + name String + domain String + industry String? + // Legacy single-string fields. Kept populated alongside the array + // fields below (location = locations[0], serviceType = + // primaryServices.join(", ")) so consumers that haven't migrated to + // the helpers in @/lib/brand-helpers continue to read sensible + // values during the rollout. Slated for removal once every consumer + // reads via getBrandLocations() / getBrandServices() — + // tracked as BACKLOG-002. + serviceType String? + location String? + // Multi-location and categorized service support. + // String[] @default([]) is non-destructive on `prisma db push`: + // adds the columns with empty-array defaults so existing rows + // backfill to {} automatically. The /api/admin/backfill-brand-arrays + // endpoint (idempotent, dryRun-aware) populates these from the + // legacy fields above for brands that pre-date the multi-array UX. + locations String[] @default([]) + primaryServices String[] @default([]) + secondaryServices String[] @default([]) + servicesExtractedAt DateTime? + initials String + // ── Plan / billing ──────────────────────────────────────────── + // Plan the brand is currently on. "trial" grants Professional- + // level access for 14 days (enforced via planExpiresAt); after + // that it downgrades to Growth features but data is retained. + // Stripe + webhook wiring for real billing lives outside this + // model — this is purely the entitlement state feature gates + // read from. + plan String @default("trial") // trial | growth | professional | agency | agency_pro | enterprise + billingCycle String @default("monthly") // monthly | annual + planStartedAt DateTime @default(now()) + planExpiresAt DateTime? + // AI credit bucket. Reset monthly by a cron (or on subscription + // renewal). Feature handlers increment aiCreditsUsed; the + // upgrade modal fires when usage >= 80% of the plan's quota. + aiCreditsUsed Int @default(0) + aiCreditsResetAt DateTime? + // ── Compliance & privacy ────────────────────────────────────── + // When healthcareMode = true, the Site Tag strips query params, + // form field names, and referrer search queries so PHI never + // crosses the wire. Set per-brand by admin or auto-suggested + // when industry detection flags healthcare. + healthcareMode Boolean @default(false) + // Per-brand data retention override in days. Null = use the + // platform default (13 months / 395 days, matching GA4). The + // data-retention cron honours both the platform default and + // the per-brand override before purging. + dataRetentionDays Int? + // DPA signed timestamp — null when not yet signed. Null doesn't + // necessarily mean missing; the Compliance dashboard treats + // brands flagged as "Not Required" separately. + dpaSignedAt DateTime? + dpaStatus String @default("not_required") // not_required | pending | signed + color String @default("bg-brand-500") + status String @default("active") // active | inactive | suspended | deleted + healthScore Int @default(0) + deactivatedAt DateTime? + deactivatedBy String? + deactivationReason String? + statusChangedAt DateTime? + statusChangedBy String? + // ── Data quality verification ───────────────────────────────── + verifiedAt DateTime? + lastVerificationScore Float? + lastVerificationIssues Json? + // External converter domains registered per-brand. Stored as JSON array + // of { domain, nickname, isActive, registeredAt } objects so no new + // table is needed. Outbound clicks to registered domains fire an + // additional external_conversion_initiated event server-side. + externalConverters Json @default("[]") + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + orgId String + organization Organization @relation(fields: [orgId], references: [id], onDelete: Cascade) + + memberships BrandMembership[] + dashboardData DashboardData? + websites Website[] + profile BrandProfile? + integrations BrandIntegration[] + metricSnapshots MetricSnapshot[] + conversions ConversionEvent[] + channelMetrics ChannelMetric[] + tasks Task[] + pageLaunches PageLaunch[] + contentBriefs ContentBrief[] + technicalAudits TechnicalAudit[] + deadPages DeadPage[] + deadPageScans DeadPageScan[] + perfAudits PerformanceAudit[] + aiVisibility AiVisibilitySnapshot[] + competitors Competitor[] + competitorSnapshots CompetitorSnapshot[] + analysisJobs AnalysisJob[] + crmDeals CrmDeal[] + attributionRecords RevenueAttribution[] + journeys UserJourney[] + avatarConversations AvatarConversation[] + trackedSite TrackedSite? + gscQueries GscQuery[] + gscPages GscPage[] + gbpLocations GbpLocation[] + gbpReviews GbpReview[] + gbpMetrics GbpMetric[] + pageRecords PageRecord[] + redirectRecords RedirectRecord[] + navSnapshots NavSnapshot[] + siteConversions SiteConversion[] + heatmapEvents HeatmapEvent[] + realUserMetrics RealUserMetric[] + siteEvents SiteEvent[] + siteTagDailyRollups SiteTagDailyRollup[] + pageSeoSnapshots PageSEOSnapshot[] + studioPages StudioPage[] + brandAssets BrandAsset[] + trackedKeywords TrackedKeyword[] + emailReportSchedules EmailReportSchedule[] + clientPortal ClientPortal? + keywordResearches KeywordResearch[] + savedKeywords SavedKeyword[] + savedLayouts SavedLayout[] + industryBriefings IndustryBriefing[] + backlinks Backlink[] + backlinkSnapshots BacklinkSnapshot[] + alertRules AlertRule[] + notifications Notification[] + predictions Prediction[] + recommendationOutcomes RecommendationOutcome[] + clientMemories ClientMemory[] + schemaMarkups SchemaMarkup[] + writingDocuments WritingDocument[] + contentAuditResults ContentAuditResult[] + auditScoreHistory AuditScoreHistory[] + aiVisibilityChecks AiVisibilityCheck[] + aiVisibilityQueries AiVisibilityQuery[] + enrichmentFiles EnrichmentFile[] + strategistSessions StrategistSession[] + // ── Paid Media Attribution ───────────────────────────────── + visitorProfiles VisitorProfile[] + householdClusters HouseholdCluster[] + ottImpressions OttImpression[] + aiAttributions AiAttribution[] + aiCitations AiCitation[] + aiRecommendations AiRecommendation[] + dashboardSnapshots DashboardSnapshot[] + adPlatformIntegrations AdPlatformIntegration[] + adCampaignData AdCampaignData[] + adClickEvents AdClickEvent[] + attributionPaths AttributionPath[] + discoveryJobs CompetitorDiscoveryJob[] + snippetDetectedAt DateTime? + snippetInstallationMethod String? + snippetCheckedAt DateTime? + // Demo brands are created by admins for showcase/sales purposes. + // Guards on cron jobs + aggregate admin queries exclude demo brands + // so their synthetic data never skews platform metrics. + isDemo Boolean @default(false) + renderTier String @default("base") // "base" | "js" + healthAlerts BrandHealthAlert[] + audits Audit[] + detectedIntegrations DetectedIntegration[] + conversionConfigs BrandConversionConfig[] + marketPositionSnapshots MarketPositionSnapshot[] + siteAuditRuns SiteAuditRun[] +} + +// ─── Detected Integrations ─────────────────────────────────────────────────── + +model DetectedIntegration { + id String @id @default(cuid()) + brandId String + name String + category String + vendor String? + version String? + firstDetectedAt DateTime @default(now()) + lastDetectedAt DateTime @default(now()) + detectionSources String[] @default([]) + pageCount Int @default(1) + samplePages String[] @default([]) + evidence Json? + status String @default("active") + isActive Boolean @default(true) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + + @@unique([brandId, name]) + @@index([brandId, category]) + @@index([brandId, lastDetectedAt(sort: Desc)]) + @@index([brandId, status]) +} + +// ─── Per-brand conversion counting configuration ───────────────────────────── + +model BrandConversionConfig { + id String @id @default(cuid()) + brandId String + conversionType String + isCounted Boolean @default(true) + tierOverride String? + displayLabel String? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + + @@unique([brandId, conversionType]) + @@index([brandId]) +} + +// ─── Competitor Discovery Queue ────────────────────────────────────────────── + +model CompetitorDiscoveryJob { + id String @id @default(cuid()) + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + + status String @default("pending") // pending | running | completed | failed + focus String // local | national + locations Json // string[] — location strings to iterate + limit Int @default(20) + + totalLocations Int @default(0) + processedLocations Int @default(0) + competitorsFound Int @default(0) + + startedAt DateTime? + completedAt DateTime? + error String? + + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + @@index([status, createdAt]) + @@index([brandId]) +} + +// ─── Brand Profile (AI Intake Data) ────────────────────────────────────────── + +model BrandProfile { + id String @id @default(cuid()) + companyName String? + logoUrl String? + brandColors String[] @default([]) + primaryColor String? // hex: "#FF0000" + secondaryColor String? + accentColor String? + fontFamily String? // e.g. "Inter, sans-serif" + services String[] @default([]) + locations String[] @default([]) + businessType String? + industry String? + targetAudience String? + description String? + shortDescription String? // AI-generated one-liner + brandVoice String? // "professional" | "medical" | "friendly" etc. + toneHints String? // longer description of brand communication style + lightBackground String? // derived: light theme bg hex + darkBackground String? // derived: dark theme bg hex + textColor String? // derived: preferred text color hex + extractedAt DateTime? // when auto-extraction last ran + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + brandId String @unique + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) +} + +// ─── Website / Domain ──────────────────────────────────────────────────────── + +model Website { + id String @id @default(cuid()) + url String + isVerified Boolean @default(false) + isPrimary Boolean @default(false) + lastCrawled DateTime? + pageCount Int @default(0) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) +} + +// ─── Brand Integrations ────────────────────────────────────────────────────── + +model BrandIntegration { + id String @id @default(cuid()) + integrationId String // "gsc" | "ga4" | "gbp" | "bing" + connected Boolean @default(false) + status String @default("idle") // "idle"|"connected"|"syncing"|"error"|"expired" + lastSynced DateTime? + syncError String? + syncRetryCount Int @default(0) // how many consecutive failures + nextRetryAt DateTime? // when to retry after failure + + // Encrypted credentials (tokens, API keys, refresh tokens) + // Encrypted with AES-256-GCM before storage — never stored in plain text. + credentialsEnc String? // encrypted JSON blob + credentialsMeta Json @default("{}") // non-secret metadata: scopes, account name, expiry + tokenExpiresAt DateTime? // when the access token expires + // Consecutive token-refresh failures. We tolerate 2 blips (network + // hiccup, transient Google 5xx) before marking status="expired" — a + // single refresh-endpoint outage shouldn't force the user to reconnect. + refreshFailCount Int @default(0) + + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + + @@unique([brandId, integrationId]) +} + +// ─── Google Search Console Data ────────────────────────────────────────────── +// Granular GSC data stored per brand per sync. +// GscQuery: per-keyword performance (clicks, impressions, CTR, position) +// GscPage: per-landing-page performance + +model GscQuery { + id String @id @default(cuid()) + query String // the search keyword + clicks Int @default(0) + impressions Int @default(0) + ctr Float @default(0) // 0.0 to 1.0 + position Float @default(0) // average position + date DateTime // which day this row covers + createdAt DateTime @default(now()) + + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + + @@index([brandId, date]) + @@index([brandId, query]) +} + +model GscPage { + id String @id @default(cuid()) + pageUrl String // the landing page URL + clicks Int @default(0) + impressions Int @default(0) + ctr Float @default(0) + position Float @default(0) + date DateTime + createdAt DateTime @default(now()) + + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + + @@index([brandId, date]) + @@index([brandId, pageUrl]) +} + +// ─── Google Business Profile Data ──────────────────────────────────────────── +// GbpLocation: the business location linked to a brand +// GbpReview: individual reviews from the GBP listing +// GbpMetric: periodic performance metrics (views, searches, actions) + +model GbpLocation { + id String @id @default(cuid()) + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + googleLocationId String + locationName String + address String? + city String? + state String? + zip String? + phone String? + website String? + category String? + placeId String? + latitude Float? + longitude Float? + isActive Boolean @default(true) + groupName String? + tags String[] @default([]) + avgRating Float @default(0) + totalReviews Int @default(0) + connectedAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + metrics GbpMetric[] + reviews GbpReview[] + + @@unique([brandId, googleLocationId]) + @@index([brandId, isActive]) + @@index([brandId, groupName]) +} + +model GbpReview { + id String @id @default(cuid()) + locationId String + location GbpLocation @relation(fields: [locationId], references: [id], onDelete: Cascade) + googleReviewId String? + reviewerName String? + rating Int + comment String? + replyText String? + repliedAt DateTime? + publishedAt DateTime + sentiment String? + topics String[] @default([]) + createdAt DateTime @default(now()) + + // Legacy brand-level fields — kept for backward compat + brandId String? + brand Brand? @relation(fields: [brandId], references: [id]) + + @@unique([locationId, googleReviewId]) + @@index([locationId, publishedAt]) + @@index([locationId, rating]) +} + +model GbpMetric { + id String @id @default(cuid()) + locationId String + location GbpLocation @relation(fields: [locationId], references: [id], onDelete: Cascade) + date DateTime + searchesTotal Int? + searchesDirect Int? + searchesDiscovery Int? + searchesBranded Int? + viewsTotal Int? + viewsMaps Int? + viewsSearch Int? + websiteClicks Int? + phoneClicks Int? + directionClicks Int? + messageCount Int? + bookingCount Int? + createdAt DateTime @default(now()) + + // Legacy brand-level fields + brandId String? + brand Brand? @relation(fields: [brandId], references: [id]) + + @@unique([locationId, date]) + @@index([locationId, date]) +} + +// ─── Dashboard Data ────────────────────────────────────────────────────────── + +model DashboardData { + id String @id @default(cuid()) + seoScore Int @default(0) + aiVisibility Int @default(0) + crawlHealth Int @default(0) + monthlyTraffic Int @default(0) + revenue Int @default(0) + revenueChange Float @default(0) + alertCount Int @default(0) + + brandId String @unique + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) +} + +// ─── Daily Metric Snapshots ────────────────────────────────────────────────── +// One row per brand per day. Stores aggregated daily metrics. + +model MetricSnapshot { + id String @id @default(cuid()) + date DateTime + source String @default("manual") // "ga4" | "gsc" | "site_tag" | "daily" | "manual" | "seed" + // GA4 metrics + sessions Int @default(0) + users Int @default(0) + pageviews Int @default(0) + bounceRate Float @default(0) + avgSessionSec Int @default(0) + conversions Int @default(0) + revenue Int @default(0) + // GSC metrics + organicClicks Int @default(0) + impressions Int @default(0) + avgPosition Float @default(0) + ctr Float @default(0) + // Audit / AI + seoScore Int @default(0) + crawlHealth Int @default(0) + aiMentions Int @default(0) + // ── Site Tag metrics (added 2026-04) ── + // Captured by the daily snapshot cron from TrackedSession + + // SiteConversion + TrackedEvent. Preserved permanently so the + // platform retains a historical record even after per-event rows + // age out of the data-retention window. + siteTagSessions Int? + siteTagPageViews Int? + siteTagConversions Int? + siteTagFormSubmits Int? + siteTagPhoneCalls Int? + siteTagBookings Int? + siteTagEvents Int? + siteTagOutboundClicks Int? + // ── Platform metrics ── + aiCalls Int? + aiCost Float? + // ── Paid media (when ad platform connected) ── + adSpend Float? + adClicks Int? + adImpressions Int? + adConversions Int? + + updatedAt DateTime @default(now()) @updatedAt + + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + + @@unique([brandId, date, source]) + @@index([brandId, date]) +} + +// ─── Conversion Events ─────────────────────────────────────────────────────── +// Individual conversion records. type: phone | form | order | booking + +model ConversionEvent { + id String @id @default(cuid()) + date DateTime + type String + channel String + value Float @default(0) + source String? + landingPage String? + keyword String? + createdAt DateTime @default(now()) + + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + + crmDeals CrmDeal[] + journeys UserJourney[] + + @@index([brandId, date]) + @@index([brandId, type]) + @@index([brandId, channel]) +} + +// ─── Channel Metrics ───────────────────────────────────────────────────────── +// Daily per-channel breakdown. channel: organic | ai_search | social | gbp | direct + +model ChannelMetric { + id String @id @default(cuid()) + date DateTime + channel String + source String @default("manual") // "ga4" | "gsc" | "manual" | "seed" + sessions Int @default(0) + users Int @default(0) + conversions Int @default(0) + revenue Int @default(0) + bounceRate Float @default(0) + + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + + @@unique([brandId, date, channel, source]) + @@index([brandId, date]) +} + +// ─── Execution Hub: Tasks ──────────────────────────────────────────────────── +// category: seo | llmo | gbp | content | technical +// status: todo | in_progress | completed +// priority: low | medium | high | critical +// effort: low | medium | high + +model Task { + id String @id @default(cuid()) + title String + description String? + category String + status String @default("todo") + priority String @default("medium") + effort String @default("medium") + pageUrl String? + recommendation String? + source String? // "technical_audit" | "dead_pages" | "performance_audit" | "signals" | "recommendations" | "manual" + sourceId String? // ID of the source record (issue ID, signal ID, etc.) + sourceRunAt DateTime? // timestamp of the source run that produced this task + dueDate DateTime? + completedAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + + assignedTo String? + assignee User? @relation(fields: [assignedTo], references: [id], onDelete: SetNull) + + // Content pipeline fields + contentType String? // blog_post | landing_page | service_page | case_study | social_post + pipelineStage String? // idea | brief_created | writing | editing | review | approved | published + briefId String? // ContentBrief reference + studioPageId String? // StudioPage reference + publishedUrl String? + publishedAt DateTime? + wordCount Int? + targetKeyword String? + + pageLaunch PageLaunch? + + @@index([brandId, status]) + @@index([brandId, category]) + @@index([brandId, pipelineStage]) + @@index([assignedTo]) + @@index([brandId, dueDate]) +} + +// ─── Performance Since Launch: Page Tracking ───────────────────────────────── +// Tracks a page from launch through performance monitoring. +// Links to the task that triggered the launch. + +model PageLaunch { + id String @id @default(cuid()) + pageUrl String + pageType String + launchDate DateTime + optimizedDate DateTime? + notes String? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + // Baseline metrics at launch + baselineSessions Int @default(0) + baselineClicks Int @default(0) + baselineImpressions Int @default(0) + baselinePosition Float @default(0) + baselineConversions Int @default(0) + baselineRevenue Int @default(0) + + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + + // Optional link to the task that triggered this launch + taskId String? @unique + task Task? @relation(fields: [taskId], references: [id], onDelete: SetNull) + + // Post-launch metric snapshots + snapshots PageLaunchSnapshot[] + + @@index([brandId]) + @@index([brandId, launchDate]) +} + +// Post-launch performance snapshots (weekly or periodic) +model PageLaunchSnapshot { + id String @id @default(cuid()) + date DateTime + sessions Int @default(0) + clicks Int @default(0) + impressions Int @default(0) + position Float @default(0) + conversions Int @default(0) + revenue Int @default(0) + + pageLaunchId String + pageLaunch PageLaunch @relation(fields: [pageLaunchId], references: [id], onDelete: Cascade) + + @@unique([pageLaunchId, date]) + @@index([pageLaunchId, date]) +} + +// ─── Content Briefs (SEO + LLMO) ───────────────────────────────────────────── +// type: "seo" | "llmo" +// status: "draft" | "review" | "approved" | "published" + +model ContentBrief { + id String @id @default(cuid()) + type String + status String @default("draft") + title String + + // ── Input fields (what the user provides) ── + primaryKeyword String? + secondaryKeywords String[] @default([]) + city String? + state String? + service String? + industry String? + brandName String? + ctaOffer String? + serviceAreaNotes String? + uniqueSellingPoints String[] @default([]) + + // LLMO-specific inputs + primaryTopic String? + longTailKeywords String[] @default([]) + conversationalPhrases String[] @default([]) + relatedQuestions String[] @default([]) + + // ── Settings ── + tone String @default("professional") + humanizationMode Boolean @default(false) + contentScore Int @default(0) + + // ── Sub-scores (JSON object) ── + // SEO: { keywordCoverage, internalLinkingStrength, contentStructure } + // LLMO: { conversationalDepth, longTailCoverage, answerReadyFormat } + subScores Json @default("{}") + + // ── Generated output (stored as JSON) ── + sections Json @default("[]") + internalLinks Json @default("[]") + writerNotes String? + + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + + createdById String? + createdBy User? @relation(fields: [createdById], references: [id], onDelete: SetNull) + + @@index([brandId, type]) + @@index([brandId, status]) +} + +// ─── Technical Audit ───────────────────────────────────────────────────────── + +model TechnicalAudit { + id String @id @default(cuid()) + status String @default("pending") // "pending" | "running" | "completed" | "failed" + crawlHealth Int @default(0) + pagesScanned Int @default(0) + errorCount Int @default(0) + warningCount Int @default(0) + noticeCount Int @default(0) + passedCount Int @default(0) + duration Int @default(0) + errorMessage String? + createdAt DateTime @default(now()) + completedAt DateTime? + + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + + issues TechnicalIssue[] + + @@index([brandId]) +} + +model TechnicalIssue { + id String @id @default(cuid()) + category String + severity String + title String + detail String? + pageUrl String? + affectedUrls Json @default("[]") // JSON array of affected URL strings + evidence Json @default("[]") // JSON array of structured evidence objects + affected Int @default(1) + status String @default("open") + + auditId String + audit TechnicalAudit @relation(fields: [auditId], references: [id], onDelete: Cascade) + + @@index([auditId, category]) + @@index([auditId, severity]) +} + +// ─── Dead 404 Pages ────────────────────────────────────────────────────────── + +model DeadPageScan { + id String @id @default(cuid()) + status String @default("pending") // "pending" | "running" | "completed" | "failed" + pagesChecked Int @default(0) + deadFound Int @default(0) + errorMessage String? + completedAt DateTime? + createdAt DateTime @default(now()) + + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + + @@index([brandId]) +} + +model DeadPage { + id String @id @default(cuid()) + deadUrl String + priority String @default("medium") + suggestedFix String? + status String @default("open") + discoveredAt DateTime @default(now()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + + sources DeadPageSource[] + + @@index([brandId, status]) +} + +model DeadPageSource { + id String @id @default(cuid()) + sourceUrl String + anchorText String? + + deadPageId String + deadPage DeadPage @relation(fields: [deadPageId], references: [id], onDelete: Cascade) + + @@index([deadPageId]) +} + +// ─── Performance Audit ─────────────────────────────────────────────────────── + +model PerformanceAudit { + id String @id @default(cuid()) + device String @default("mobile") + status String @default("pending") // "pending" | "running" | "completed" | "failed" + errorMessage String? + completedAt DateTime? + createdAt DateTime @default(now()) + + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + + pages PerformancePageScore[] + + @@index([brandId]) +} + +model PerformancePageScore { + id String @id @default(cuid()) + pageUrl String + device String @default("mobile") + performance Int @default(0) + accessibility Int @default(0) + bestPractices Int @default(0) + seo Int @default(0) + lcpMs Int @default(0) + inpMs Int @default(0) + clsVal Float @default(0) + fcpMs Int @default(0) + ttfbMs Int @default(0) + status String @default("average") + + auditId String + audit PerformanceAudit @relation(fields: [auditId], references: [id], onDelete: Cascade) + + @@index([auditId]) + @@index([auditId, pageUrl]) +} + +// ─── AI Visibility ─────────────────────────────────────────────────────────── +// platform: chatgpt | claude | perplexity | gemini | google_aio + +model AiVisibilitySnapshot { + id String @id @default(cuid()) + date DateTime + platform String + topic String + mentions Int @default(0) + citations Int @default(0) + visibilityScore Int @default(0) + sourceUrl String? + change Int @default(0) + createdAt DateTime @default(now()) + + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + + @@index([brandId, date]) + @@index([brandId, platform]) + @@index([brandId, topic]) +} + +// ─── Competitors ───────────────────────────────────────────────────────────── +// type: national | local | emerging + +model Competitor { + id String @id @default(cuid()) + name String + domain String + type String @default("national") + logoUrl String? + strongestPage String? + whyWinning String? + watchlist Boolean @default(false) + isActive Boolean @default(true) + // Cached sitemap URLs discovered during the last crawl so subsequent + // crawls can skip the discovery phase and go direct. + sitemapUrls Json? // string[] of absolute sitemap URLs + discoveredForLocations Json? // string[] — locations where this competitor was discovered. Null for manual adds and pre-migration rows. + lastCrawledAt DateTime? + detectedCms String? // wordpress | shopify | wix | squarespace | etc. + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + + snapshots CompetitorSnapshot[] + rankings CompetitorRanking[] + pages CompetitorPage[] + + @@unique([brandId, domain]) + @@index([brandId, isActive]) +} + +model CompetitorSnapshot { + id String @id @default(cuid()) + date DateTime @default(now()) + movement String? + rankChange Int @default(0) + aiMentions Int @default(0) + aiMentionChange Int @default(0) + trafficEstimate Int @default(0) + topKeyword String? + threat String @default("medium") + // Sitemap monitoring + totalPages Int? + newPages Json? + removedPages Json? + changedPages Json? + sitemapUrls Json? + title String? + metaDescription String? + techStack Json? + crawledAt DateTime @default(now()) + createdAt DateTime @default(now()) + + competitorId String + competitor Competitor @relation(fields: [competitorId], references: [id], onDelete: Cascade) + + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + + @@index([competitorId, crawledAt]) + @@index([brandId, date]) +} + +model CompetitorRanking { + id String @id @default(cuid()) + competitorId String + competitor Competitor @relation(fields: [competitorId], references: [id], onDelete: Cascade) + keyword String + position Int? + url String? + checkedAt DateTime @default(now()) + + @@index([competitorId, keyword, checkedAt]) +} + +// Per-page data from sitemap crawling. Each row = one URL found in a +// competitor's sitemap. Status is updated on every crawl to track new +// content, updates, and removals over time. +model CompetitorPage { + id String @id @default(cuid()) + competitorId String + competitor Competitor @relation(fields: [competitorId], references: [id], onDelete: Cascade) + url String + title String? + metaDescription String? + h1 String? + wordCount Int? + lastmod DateTime? + changefreq String? // always | hourly | daily | weekly | monthly | yearly | never + priority Float? // 0.0 – 1.0 from sitemap + firstSeenAt DateTime @default(now()) + lastCheckedAt DateTime @default(now()) + status String @default("new") // new | updated | unchanged | removed + + @@unique([competitorId, url]) + @@index([competitorId, status]) + @@index([competitorId, firstSeenAt]) +} + +// ─── CRM Deals ─────────────────────────────────────────────────────────────── +// source: hubspot | salesforce | highlevel | manual +// stage: lead | qualified | proposal | negotiation | closed_won | closed_lost + +model CrmDeal { + id String @id @default(cuid()) + externalId String? + source String @default("manual") + contactName String? + contactEmail String? + dealName String + value Float @default(0) + stage String @default("lead") + status String @default("open") + closeDate DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + + // Link to conversion that created this deal + conversionId String? + conversion ConversionEvent? @relation(fields: [conversionId], references: [id], onDelete: SetNull) + + attributions RevenueAttribution[] + journeys UserJourney[] + + @@index([brandId, status]) + @@index([brandId, stage]) + @@index([source]) +} + +// ─── Revenue Attribution ───────────────────────────────────────────────────── +// model: first_touch | last_touch | assisted + +model RevenueAttribution { + id String @id @default(cuid()) + attributionModel String @default("last_touch") + channel String + landingPage String? + conversionType String? + revenue Float @default(0) + creditPct Float @default(100) + date DateTime + createdAt DateTime @default(now()) + + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + + dealId String? + deal CrmDeal? @relation(fields: [dealId], references: [id], onDelete: SetNull) + + @@index([brandId, date]) + @@index([brandId, channel]) + @@index([brandId, attributionModel]) +} + +// ─── User Journeys (Closed-Loop Tracking) ──────────────────────────────────── + +model UserJourney { + id String @id @default(cuid()) + entryChannel String + pagesVisited String[] @default([]) + conversionType String? + revenue Float @default(0) + date DateTime + createdAt DateTime @default(now()) + + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + + conversionId String? + conversion ConversionEvent? @relation(fields: [conversionId], references: [id], onDelete: SetNull) + + dealId String? + deal CrmDeal? @relation(fields: [dealId], references: [id], onDelete: SetNull) + + @@index([brandId, date]) + @@index([brandId, entryChannel]) +} + +// ─── Notifications (System/Account Events) ─────────────────────────────────── +// category: login | system | security | integration | task | billing | workspace +// status: unread | read | dismissed + +model Notification { + id String @id @default(cuid()) + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + alertRuleId String? + alertRule AlertRule? @relation(fields: [alertRuleId], references: [id]) + userId String? + title String + message String + type String @default("info") + severity String @default("medium") + channel String @default("in_app") + isRead Boolean @default(false) + readAt DateTime? + emailSent Boolean @default(false) + smsSent Boolean @default(false) + smsError String? + metadata Json? + createdAt DateTime @default(now()) + + @@index([brandId, isRead, createdAt]) + @@index([userId, isRead]) + @@index([brandId, channel]) +} + +// ─── AI Avatar Conversations ───────────────────────────────────────────────── +// Each conversation belongs to a user + brand and contains messages. + +model AvatarConversation { + id String @id @default(cuid()) + title String @default("New conversation") + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + userId String + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + + messages AvatarMessage[] + + @@index([userId, brandId, updatedAt]) +} + +model AvatarMessage { + id String @id @default(cuid()) + role String // "user" or "assistant" + content String + module String? // which module was active (e.g. "Technical Audit") + metadata Json @default("{}") // actions, followUps, context + createdAt DateTime @default(now()) + + conversationId String + conversation AvatarConversation @relation(fields: [conversationId], references: [id], onDelete: Cascade) + + @@index([conversationId, createdAt]) +} + +// ─── meSEO Site Tag (Machine Enhancing Tracking ID) ───────────────────────── +// +// TrackedSite: one per brand — holds the unique site_id and tracking_key +// TrackedSession: one per visitor session (30-min inactivity timeout) +// TrackedEvent: each page view, click, or custom event +// +// How IDs work: +// siteId = "ms_" + cuid (public, embedded in the snippet) +// trackingKey = random 32-char hex string (secret, used to validate) + +model TrackedSite { + id String @id @default(cuid()) + siteId String @unique // public ID: "ms_clxyz..." + trackingKey String @unique // secret key for validation + status String @default("active") // active | paused | disabled + allowedDomains String[] @default([]) // e.g. ["acme.com", "www.acme.com"] + lastEventAt DateTime? // timestamp of most recent event + // When the Site Tag actually started capturing data — the + // timestamp of the *first* TrackedEvent or SiteEvent for this + // site. Distinct from createdAt (which is just when the row + // was inserted; the snippet may sit uninstalled for days or + // weeks before the customer actually deploys it). Written + // once, lazily — the first /api/collect hit after this column + // is null backfills it via an idempotent updateMany. Null when + // the site exists but has never phoned home. + firstEventAt DateTime? + // Custom events configured via the /site-tag UI. Each entry: + // { id, name, triggerType, triggerConfig, properties, isActive } + customEvents Json @default("[]") + sitePlatform String? + sitePlatformVersion String? + sitePlatformConfidence String? + sitePlatformCategory String? + sitePlatformDetectedAt DateTime? + siteHosting String? + siteHostingDetectedAt DateTime? + // When true, "load_after_engage" iframe heuristic signals are promoted + // to completed-tier form_submit for this brand. Default off -- the + // heuristic is unreliable enough that it should only be enabled after + // confirming in prod that load-after-engage correlates with real leads. + countInferredIframeSubmits Boolean @default(false) + // When true, only SiteConversion rows with successConfirmed=true count + // toward this brand's conversion total. Default false -- all rows count, + // preserving existing behaviour for every brand. + requireSuccessConfirmed Boolean @default(false) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + orgId String + org Organization @relation(fields: [orgId], references: [id], onDelete: Cascade) + + brandId String @unique // one tracked site per brand + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + + sessions TrackedSession[] + events TrackedEvent[] + canonicalEvents CanonicalEvent[] + sourceEvents SourceEvent[] + + @@index([siteId]) + @@index([orgId]) +} + +model TrackedSession { + id String @id @default(cuid()) + sessionId String @unique // random ID set by the tracker JS + startedAt DateTime @default(now()) + lastSeenAt DateTime @default(now()) + pageCount Int @default(1) + entryPage String // first page URL in the session + referrer String? // external referrer if any + utmSource String? + utmMedium String? + utmCampaign String? + userAgent String? + country String? + device String? // "mobile" | "desktop" | "tablet" + // Additional client context captured on session_start / first + // page_view. Populated from the incoming request's headers + // (User-Agent parse + x-vercel-ip-* geo headers) — never from + // the client payload, so a spoofed t.js can't pollute these + // columns. All optional: historical sessions and non-Vercel + // deploys keep rendering with nulls where values aren't + // available. + browser String? + os String? + city String? + region String? + ipAddress String? // admin-only surface — never returned to brand users + // ── Extended UTM + ad-click attribution (Phase 1, 2026-04) ── + // utmSource / utmMedium / utmCampaign already exist above. The + // three fields below complete the full UTM spec so the attribution + // model can segment by keyword (utm_term) and creative variant + // (utm_content) in addition to source/medium/campaign. + utmTerm String? + utmContent String? + // Ad-platform click IDs. Present when the visitor landed from a + // paid ad. Matched against AdClickEvent rows server-side so the + // attribution path can trace campaign → ad group → ad → session → + // conversion. Only the ID is stored (no PII). Nullable: organic / + // direct / referral sessions have no click ID. + gclid String? // Google Ads + fbclid String? // Meta (Facebook / Instagram) + msclkid String? // Microsoft Ads (Bing) + ttclid String? // TikTok Ads + li_fat_id String? // LinkedIn Ads + dclid String? // Google Display & Video 360 + wbraid String? // Google Ads (iOS web-to-app) + gbraid String? // Google Ads (iOS app-to-web) + // Server-computed channel group. Derived from the combination of + // referrer + UTM params + click IDs at session-start time. Values + // follow GA4's Default Channel Group taxonomy so cross-source + // comparisons read naturally. + channelGroup String? // Paid Search | Paid Social | Organic Search | Direct | Referral | Email | Display | OTT/CTV | Other + // ── Predictive Conversion Scoring (Phase 9) ── + predictedConversionScore Float? @default(0) + scoreLastComputedAt DateTime? + scoreContributingFactors Json? + + trackedSiteId String + trackedSite TrackedSite @relation(fields: [trackedSiteId], references: [id], onDelete: Cascade) + + events TrackedEvent[] + + @@index([trackedSiteId, startedAt]) + @@index([sessionId]) +} + +model TrackedEvent { + id String @id @default(cuid()) + eventType String // "page_view" | "session_start" | custom + pageUrl String + referrer String? + timestamp DateTime @default(now()) + metadata Json @default("{}") // custom key-value pairs + synthetic Boolean @default(false) + + trackedSiteId String + trackedSite TrackedSite @relation(fields: [trackedSiteId], references: [id], onDelete: Cascade) + + sessionId String? + session TrackedSession? @relation(fields: [sessionId], references: [id], onDelete: SetNull) + + @@index([trackedSiteId, timestamp]) + @@index([trackedSiteId, eventType]) + // Composite index for the common "this site + this event type + recent + // window" query pattern (session_start counts, page_view groupBys, etc.) + // — without it Postgres picks one of the two-column indexes and filters + // the remaining predicate in-row, which gets expensive as TrackedEvent + // grows into the millions. + @@index([trackedSiteId, eventType, timestamp]) + // Supports domain-status queries: WHERE trackedSiteId = $1 AND pageUrl LIKE 'https://domain/%' + // Sargable prefix scan after the contains->startsWith fix for M18. + // Production deploy: run manually with CONCURRENTLY to avoid table lock. + @@index([trackedSiteId, pageUrl, timestamp]) + @@index([sessionId]) + // Cross-brand timestamp range queries (admin overview groupBy, retention + // cron) need this standalone index — without it the WHERE timestamp >= ? + // query cannot use any index and does a full sequential scan. + @@index([timestamp]) +} + +// ─── Data Reconciliation ───────────────────────────────────────────────────── +// +// How it works: +// 1. SourceEvent — a raw event from ANY source (Site Tag, GA4, GTM, GSC, CRM) +// 2. CanonicalEvent — the deduplicated, reconciled "truth" event +// 3. Each CanonicalEvent links to 1+ SourceEvents that describe the same action +// +// Example: +// A form_submit might arrive from both Site Tag and GA4. +// → 2 SourceEvent rows (one per source) +// → 1 CanonicalEvent row (the reconciled truth, confidence 94%) + +model CanonicalEvent { + id String @id @default(cuid()) + eventType String // "page_view", "form_submit", etc. + pageUrl String + timestamp DateTime + confidence Int @default(100) // 0-100, how sure we are this is correct + status String @default("verified") // "verified" | "inferred" | "unmatched" + journeyNote String? // e.g. "Session → Form → CRM lead" + metadata Json @default("{}") + createdAt DateTime @default(now()) + + trackedSiteId String + trackedSite TrackedSite @relation(fields: [trackedSiteId], references: [id], onDelete: Cascade) + + sourceEvents SourceEvent[] + + @@index([trackedSiteId, eventType]) + @@index([trackedSiteId, timestamp]) +} + +model SourceEvent { + id String @id @default(cuid()) + source String // "site_tag" | "ga4" | "gtm" | "gsc" | "crm" + eventType String + pageUrl String + timestamp DateTime + isDuplicate Boolean @default(false) // true if this was identified as a dupe + rawData Json @default("{}") // original payload from the source + createdAt DateTime @default(now()) + + trackedSiteId String + trackedSite TrackedSite @relation(fields: [trackedSiteId], references: [id], onDelete: Cascade) + + canonicalEventId String? + canonicalEvent CanonicalEvent? @relation(fields: [canonicalEventId], references: [id], onDelete: SetNull) + + @@index([trackedSiteId, source]) + @@index([trackedSiteId, isDuplicate]) + @@index([trackedSiteId, timestamp]) + @@index([trackedSiteId, createdAt]) + @@index([canonicalEventId]) +} + +// ─── Billing & Subscriptions ───────────────────────────────────────────────── +// +// Plan: defines what a subscription includes (limits, features, price) +// Subscription: links an Organization to a Plan with status and dates +// OrgPlanUsage: tracks current usage against plan limits +// +// No Stripe integration yet — this is the internal billing model. + +model Plan { + id String @id @default(cuid()) + name String @unique // "Free", "Starter", "Pro", "Enterprise" + slug String @unique // "free", "starter", "pro", "enterprise" + priceMonthly Int @default(0) // cents (e.g. 4900 = $49.00) + billingInterval String @default("monthly") // "monthly" | "yearly" + features Json @default("{}") // { "ai_avatar": true, "site_tag": true, ... } + limitBrands Int @default(1) // max brands allowed + limitWebsites Int @default(1) // max websites per brand + limitEvents Int @default(1000) // max tracked events per month + limitUsers Int @default(1) // max org members + isActive Boolean @default(true) // false = plan no longer offered + sortOrder Int @default(0) // display order on pricing page + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + subscriptions Subscription[] +} + +model Subscription { + id String @id @default(cuid()) + status String @default("trial") // "active" | "trial" | "canceled" | "past_due" + startDate DateTime @default(now()) + endDate DateTime? // null = ongoing + trialEnd DateTime? // when the trial expires + canceledAt DateTime? // when the user canceled + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + orgId String @unique // one subscription per org + org Organization @relation(fields: [orgId], references: [id], onDelete: Cascade) + + planId String + plan Plan @relation(fields: [planId], references: [id]) + + @@index([orgId]) + @@index([status]) +} + +model OrgPlanUsage { + id String @id @default(cuid()) + brandsUsed Int @default(0) + websitesUsed Int @default(0) + eventsUsed Int @default(0) // tracked events this billing period + usersUsed Int @default(0) + periodStart DateTime @default(now()) // start of current billing period + periodEnd DateTime? // end of current billing period + lastCalculatedAt DateTime @default(now()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + orgId String @unique // one usage record per org + org Organization @relation(fields: [orgId], references: [id], onDelete: Cascade) + + @@index([orgId]) +} + +// ─── Application Logs ──────────────────────────────────────────────────────── +// Simple log table for API requests, errors, and integration events. +// Kept small — auto-prune old entries periodically. + +model AppLog { + id String @id @default(cuid()) + level String // "info" | "warn" | "error" + source String // "api" | "collect" | "integration" | "billing" | "avatar" + message String + path String? // API route path + userId String? // who triggered it (if known) + metadata Json @default("{}") // extra context (request body, error stack, etc.) + createdAt DateTime @default(now()) + + @@index([level, createdAt]) + @@index([source, createdAt]) +} + +// ─── AI Strategist Analysis Jobs ──────────────────────────────────────────── + +model AnalysisJob { + id String @id @default(cuid()) + type String @default("seasonal_performance") + status String @default("queued") // "queued" | "running" | "completed" | "failed" + prompt String? + manualCaveats Json @default("[]") + uploadedNotes Json @default("[]") + selectedSources Json @default("[]") + result Json? // Full Analysis object + branding Json? // AnalysisBranding object + errorMessage String? + shareToken String? @unique // for shareable links + shareEnabled Boolean @default(false) // must be explicitly enabled + clientVersion Json? // polished client-facing snapshot + clientVersionAt DateTime? // when client version was saved + hiddenSections Json @default("[]") // sections hidden from client view + createdAt DateTime @default(now()) + completedAt DateTime? + + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + + userId String? + + @@index([brandId, status]) + @@index([shareToken]) + @@index([brandId, createdAt]) +} + +// ═══════════════════════════════════════════════════════════════════════════ +// PAGE LIFECYCLE INTELLIGENCE +// Real-time page tracking driven by the Site Tag. Every URL a visitor lands +// on gets upserted into PageRecord, with status changes recorded in +// PageStatusChange, redirect chains in RedirectRecord, and day-over-day +// performance (joined from GSC data) in PageDailyMetric. +// ═══════════════════════════════════════════════════════════════════════════ + +model PageRecord { + id String @id @default(cuid()) + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + + // Identity + url String // relative path: /about, /services/seo + fullUrl String // absolute: https://example.com/about + title String? + + // Lifecycle + firstSeenAt DateTime @default(now()) + lastSeenAt DateTime @default(now()) + currentStatus Int @default(200) + isInNav Boolean @default(false) + addedToNavAt DateTime? + removedFromNavAt DateTime? + + // Aggregated performance (denormalised from PageDailyMetric for speed) + totalClicks Int @default(0) + totalImpressions Int @default(0) + currentCtr Float @default(0) + currentPosition Float @default(0) + totalVisits Int @default(0) // from Site Tag page_view events + + // Metadata scraped by the Site Tag + metaDescription String? + h1 String? + canonicalUrl String? + wordCount Int? + // Internal links discovered on this page (JSON array of { href, anchorText }) + internalLinks Json? + + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + statusHistory PageStatusChange[] + redirectsToThis RedirectRecord[] @relation("redirectTarget") + redirectsFrom RedirectRecord[] @relation("redirectSource") + dailyMetrics PageDailyMetric[] + + @@unique([brandId, url]) + @@index([brandId, currentStatus]) + @@index([brandId, firstSeenAt]) + @@index([brandId, isInNav]) +} + +model PageStatusChange { + id String @id @default(cuid()) + pageId String + page PageRecord @relation(fields: [pageId], references: [id], onDelete: Cascade) + fromStatus Int + toStatus Int + detectedAt DateTime @default(now()) + note String? + + @@index([pageId, detectedAt]) +} + +model RedirectRecord { + id String @id @default(cuid()) + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + sourceUrl String + targetUrl String + statusCode Int @default(301) + + sourcePageId String? + sourcePage PageRecord? @relation("redirectSource", fields: [sourcePageId], references: [id], onDelete: SetNull) + targetPageId String? + targetPage PageRecord? @relation("redirectTarget", fields: [targetPageId], references: [id], onDelete: SetNull) + + firstSeenAt DateTime @default(now()) + lastSeenAt DateTime @default(now()) + isActive Boolean @default(true) + + @@unique([brandId, sourceUrl, targetUrl]) + @@index([brandId, isActive]) + @@index([targetPageId]) +} + +model PageDailyMetric { + id String @id @default(cuid()) + pageId String + page PageRecord @relation(fields: [pageId], references: [id], onDelete: Cascade) + date DateTime + clicks Int @default(0) + impressions Int @default(0) + ctr Float @default(0) + avgPosition Float @default(0) + sessions Int? + conversions Int? + statusCode Int @default(200) + + @@unique([pageId, date]) + @@index([pageId, date]) +} + +// Snapshot of the site's main navigation at a point in time. Used to detect +// links being added to or removed from the nav. One row per ingest; the +// endpoint keeps only the most recent N snapshots per brand. +model NavSnapshot { + id String @id @default(cuid()) + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + capturedAt DateTime @default(now()) + // JSON array of { href, anchorText, section? } + links Json + + @@index([brandId, capturedAt]) +} + +// ─── Site Tag Intelligence ──────────────────────────────────────────────────── +// Machine Enhancing analytics captured by public/t.js: attribution, form/call +// conversions, heatmaps, RUM/Core Web Vitals, UX signals, SEO snapshots. + +// Conversions detected by the Site Tag: form submits (native, HubSpot, +// Typeform, Calendly, etc.), phone clicks (tel: links or phone-pattern +// elements), and bookings. Includes multi-touch attribution rolled up +// from the visitor's touchpoint cookie. +model SiteConversion { + id String @id @default(cuid()) + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + visitorId String + sessionId String + conversionType String // form_submit | phone_call | phone_number_click | calendly | booking + pageUrl String + formId String? + formProvider String? // native | hubspot | typeform | jotform | calendly | custom + formFields Json? // array of field names only (never values) + detectionMethod String? // submit_event | fetch_intercept | xhr_intercept | postmessage | mutation_observer | tel_link | phone_pattern + phoneNumber String? + elementLocation String? // header | footer | sidebar | nav | main_content + firstTouchChannel String? + firstTouchSource String? + lastTouchChannel String? + lastTouchSource String? + touchpoints Json? // ordered array of touchpoint objects + assistedChannels Json? // list of channels that appeared in the journey + // Revenue attribution. Populated for e-commerce conversions + // (purchase, purchase_completed, and any other type that carries + // a money amount in metadata). SUM(conversionValue) drives the + // ROI calculation on the Cost Center + attribution dashboards, + // so these live in typed columns rather than the formFields JSON + // for cheap aggregation. Nullable: non-money conversions + // (form_submission, phone_call, etc.) leave these blank. + conversionValue Float? + currency String? // ISO 4217 code (USD, EUR, GBP, ...) + orderId String? // e-commerce order/transaction ID from purchase_completed + // Shopify line items: [{title, quantity, price, variantId}] + lineItems Json? + timestamp DateTime @default(now()) + // Dedup architecture: when this row is identified as a duplicate + // of another SiteConversion, this field is set to the id of the + // surviving (canonical) row. Null = this row is canonical or has + // not been processed yet. Analytics queries filter WHERE + // isDuplicateOf IS NULL to get deduped counts. + isDuplicateOf String? + // When a detection method is deprecated (e.g. phone_pattern), rows + // are marked with the reason rather than deleted. Analytics queries + // filter WHERE invalidatedReason IS NULL. + invalidatedReason String? + // Channel classification from the rule-based classifier. + // Populated on write + backfilled for historical rows. + classifiedChannel String? + classificationReason String? + classificationEvidence Json? + + // Provider category — coarse grouping used by the Embedded Conversions + // dashboard (booking, form, sms, chat, checkout, donation, civic, survey). + // Derived from formProvider at write time; null for pre-categorisation rows. + providerCategory String? + + // SMS-specific attribution fields. Never contain personal data — only + // keyword text, shortcode, and consent method classification. + smsKeyword String? // e.g. 'JOIN', 'START', 'YES' + smsShortcode String? // e.g. '55555', '12345' + smsConsentMethod String? // 'explicit_checkbox' | 'keyword_optin' | 'two_step_followup' | 'implicit_form' + smsFollowupOfConversionId String? // links two-step opt-in to the preceding email conversion + detectionLatencyMs Int? // ms from page load to detection — diagnostic + synthetic Boolean @default(false) // true when fired by the test harness (_test=true) + // Client-generated token tying every re-fire of the same real form + // submission together. Set by getFormSubmissionId() in t.js using a 30s + // fixed-from-first sessionStorage window. Nullable so old rows are + // unaffected. No unique constraint -- dedup is handled in the resolver. + submissionId String? + // Set to true when a framework-specific success signal (CF7 wpcf7mailsent, + // gform_confirmation_loaded, WPForms confirmation container, Elementor + // submit_success, etc.) corroborates the submit. Default false preserves + // all historical rows as unchecked. Used by the requireSuccessConfirmed + // per-brand gate to tighten which rows count. + successConfirmed Boolean @default(false) + + @@index([brandId, timestamp]) + @@index([brandId, conversionType]) + @@index([brandId, isDuplicateOf]) + @@index([brandId, submissionId]) + // Covers the server-side rapid-fire dedup query in /api/site-tag/conversion: + // WHERE brandId = ? AND sessionId = ? AND pageUrl = ? AND conversionType = ? AND timestamp >= ? + @@index([brandId, sessionId, pageUrl, conversionType, timestamp]) + // Embedded Conversions dashboard query patterns + @@index([brandId, providerCategory, timestamp]) + @@index([brandId, pageUrl, providerCategory]) + @@index([brandId, firstTouchChannel, timestamp]) +} + +// Heatmap / engagement payloads from public/t.js. One row per flush +// (clicks batch, scroll summary, or attention summary). +model HeatmapEvent { + id String @id @default(cuid()) + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + visitorId String? + sessionId String? + pageUrl String + eventType String // clicks | scroll | attention + events Json? // array of click points or section entries + maxScrollPercent Int? + milestonesReached Json? // [25, 50, 75, 90, 100] + timeOnPage Int? // seconds + sectionTimes Json? // { selector → seconds visible } + pageWidth Int? + pageHeight Int? + viewportWidth Int? + viewportHeight Int? + timestamp DateTime @default(now()) + + @@index([brandId, pageUrl, eventType]) + @@index([brandId, eventType, timestamp]) +} + +// Real-user Core Web Vitals sampled per page load. +model RealUserMetric { + id String @id @default(cuid()) + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + pageUrl String + lcp Float? + cls Float? + inp Float? + ttfb Float? + fcp Float? // First Contentful Paint (ms) — lab parity with + // the CrUX CWV bundle. Added so RUM vs lab-score + // comparisons on the Core Web Intelligence page + // can render the same five metrics side by side. + device String? // mobile | tablet | desktop + connection String? // 4g | 3g | slow-2g | wifi + + deviceMemory Float? // navigator.deviceMemory (GB) when exposed + viewportW Int? + viewportH Int? + timestamp DateTime @default(now()) + + @@index([brandId, pageUrl, timestamp]) + // Cross-brand timestamp range queries (admin overview count) need this + // — the compound index starting with brandId can't serve a bare + // WHERE timestamp >= ? predicate. + @@index([timestamp]) +} + +// Generic UX / intelligence signal bucket: rage clicks, dead clicks, +// hesitation, exit intent, JS errors, SEO changes, outbound clicks, +// internal search queries, copy events, slow third-party resources. +model SiteEvent { + id String @id @default(cuid()) + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + visitorId String? + sessionId String? + pageUrl String + eventType String // rage_click | dead_click | hesitation | exit_intent | js_error | seo_change | outbound_click | search_query | copy_event | slow_resource | third_party_impact + eventData Json + timestamp DateTime @default(now()) + + @@index([brandId, eventType, timestamp]) + @@index([eventType, timestamp]) + // Hot query in writeConversionSideEffect: WHERE sessionId = ? ORDER BY timestamp DESC. + // This index went missing from schema (and was therefore dropped by db push), causing a + // full scan of the ~22GB table. Declared here so future pushes treat it as already-present. + // Name matches the production index exactly so db push is a no-op against it. + @@index([sessionId, timestamp], map: "SiteEvent_sessionId_timestamp_idx") +} + +// ─── Site Tag Daily Rollup ──────────────────────────────────────────────────── +// Pre-aggregated daily totals per brand, written by the site-tag-rollup cron. +// Turns 30-day groupBy scans on TrackedEvent (1M+ rows) into 30-row lookups. + +model SiteTagDailyRollup { + id String @id @default(cuid()) + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + // Calendar date this row covers (UTC midnight, one row per brand per day) + date DateTime + pageViews Int @default(0) + sessions Int @default(0) + conversions Int @default(0) + // JSON blobs for top-N breakdowns; small enough to keep in the row + topPages Json @default("[]") // [{ url, views }] top 10 + byReferrer Json @default("[]") // [{ source, views }] top 10 + // Extended columns added in Phase 19A.25 for fast sub-summary reads + conversionsByType Json? // { "form_submit": 142, "click_to_call": 89, ... } + conversionsByTier Json? // { "completed": 200, "intent": 47, "signal": 0 } + eventCountsByType Json? // { "page_view": 3520, "session_start": 164, ... } + outboundClickCount Int @default(0) + updatedAt DateTime @updatedAt + + @@unique([brandId, date]) + @@index([brandId, date]) +} + +// ─── Page Studio ────────────────────────────────────────────────────────────── +// AI-assisted landing page builder. Pages are stored as JSON section arrays +// so the editor can round-trip them and the renderer can hydrate from the +// section registry without any schema migrations when new block types ship. + +model StudioPage { + id String @id @default(cuid()) + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + title String + slug String + purpose String // lead_generation | service | product | event | coming_soon + sections Json // array of { id, type, content } + branding Json // { primaryColor, secondaryColor, accentColor, fontFamily, logoUrl } + settings Json // { metaTitle, metaDescription, ogImage, pageWidth, customScripts } + status String @default("draft") // draft | published | archived + thumbnail String? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + @@unique([brandId, slug]) + @@index([brandId]) +} + +// Uploaded brand media (logos, photography, icons, backgrounds) that the +// Page Studio editor can insert into sections. Strictly PNG/JPEG — no SVG +// or other formats to keep the upload path simple and safe. +model BrandAsset { + id String @id @default(cuid()) + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + filename String + url String + type String // logo | photo | icon | background + mimeType String // image/png | image/jpeg + fileSize Int + width Int? + height Int? + altText String? + tags String[] @default([]) + uploadedAt DateTime @default(now()) + + @@index([brandId]) +} + +// Per-page SEO metadata snapshot from the Site Tag. Upserted on every +// page view — enables detection of accidental noindex, missing meta, +// schema changes, and mixed-content regressions. +model PageSEOSnapshot { + id String @id @default(cuid()) + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + pageUrl String + title String? + metaDescription String? + canonical String? + robots String? + h1Count Int? + hasSchema Boolean? + schemaTypes Json? + noindexed Boolean? + mixedContent Boolean? + detectedAt DateTime @default(now()) + + @@unique([brandId, pageUrl]) +} + +// ─── Rank Tracking ────────────────────────────────────────────────────────── +// Daily keyword position monitoring. TrackedKeyword holds the target; +// KeywordRanking stores each check result so the UI can chart position +// over time and alert on significant changes. + +model TrackedKeyword { + id String @id @default(cuid()) + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + keyword String + location String @default("United States") + device String @default("desktop") // desktop | mobile + targetUrl String? + tags String[] @default([]) + isActive Boolean @default(true) + createdAt DateTime @default(now()) + + rankings KeywordRanking[] + + @@unique([brandId, keyword, location, device]) + @@index([brandId, isActive]) +} + +model KeywordRanking { + id String @id @default(cuid()) + trackedKeywordId String + trackedKeyword TrackedKeyword @relation(fields: [trackedKeywordId], references: [id], onDelete: Cascade) + position Int? // null → not found in top results + previousPosition Int? + url String? // actual URL that ranks + snippet String? // SERP snippet text + searchVolume Int? + // SERP features detected on the result page for this query, e.g. + // ["local_pack","reviews","people_also_ask"]. Populated by DataForSEO + // checks; empty for GSC backfill rows (GSC doesn't expose features). + serpFeatures String[] @default([]) + // Top 5 organic competitors on the same SERP — captured at check time + // so the UI can render "who outranks you" without a second API call. + // Stored as JSON: [{ domain, position, url, title }]. + competitors Json @default("[]") + // Where the row came from: + // "dataforseo" — live daily rank check (default for new rows) + // "google_cse" — Google Custom Search fallback when DataForSEO isn't configured + // "gsc_backfill" — inferred from GscQuery historical data on keyword add + // UI renders backfill rows with a dashed line to signal they're from a + // different source with different accuracy characteristics (GSC's + // avgPosition is impression-weighted; DataForSEO is a raw SERP lookup). + source String @default("dataforseo") + checkedAt DateTime @default(now()) + + @@index([trackedKeywordId, checkedAt]) + @@index([trackedKeywordId, position]) +} + +// ─── Automated Email Reports ──────────────────────────────────────────────── +// Schedule-driven intelligence reports assembled from all platform data +// sources, optionally enriched with Claude AI analysis + competitor scans. + +model EmailReportSchedule { + id String @id @default(cuid()) + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + name String + frequency String // daily | weekly | biweekly | monthly + dayOfWeek Int? // 0-6 (0=Sunday) for weekly/biweekly + dayOfMonth Int? // 1-28 for monthly + timeOfDay String @default("08:00") // HH:mm UTC + recipients String[] + sections String[] + includeAiAnalysis Boolean @default(true) + includeCompetitorScan Boolean @default(false) + includeMarketInsights Boolean @default(false) + isActive Boolean @default(true) + lastSentAt DateTime? + nextSendAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + sentReports SentEmailReport[] + + @@index([brandId]) + @@index([nextSendAt, isActive]) +} + +model SentEmailReport { + id String @id @default(cuid()) + scheduleId String + schedule EmailReportSchedule @relation(fields: [scheduleId], references: [id], onDelete: Cascade) + brandId String + recipients String[] + subject String + htmlContent String // @db.Text — large content + reportData Json + status String // sent | failed | bounced + error String? + sentAt DateTime @default(now()) + + @@index([scheduleId, sentAt]) + @@index([brandId, sentAt]) +} + +// ─── White-Label Client Portal ────────────────────────────────────────────── +// Per-brand portal that exposes a limited, agency-branded view of +// the platform to clients. Authenticated via magic links, not Clerk. + +model ClientPortal { + id String @id @default(cuid()) + brandId String @unique + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + isEnabled Boolean @default(false) + agencyName String? + agencyLogo String? + agencyFavicon String? + primaryColor String? + accentColor String? + customDomain String? + // Custom-domain verification state. Populated when the agency + // starts the custom-domain add flow; middleware host-routing only + // activates once customDomainStatus === "verified". DnsTarget is + // the CNAME the agency points their domain at. + customDomainStatus String? // pending | verified | failed | null + customDomainVerifiedAt DateTime? + customDomainDnsTarget String? + // White-label outgoing email. When replyToEmail is set, invite and + // scheduled-report emails use the agency name as From and route + // replies to this inbox. supportEmail is shown in email footers. + replyToEmail String? + supportEmail String? + allowedPages String[] @default(["dashboard", "report", "rankings", "conversions", "audit_summary"]) + portalConfig Json? // granular { pages: { dashboard: { enabled, sections }, ... } } + hideSourceBranding Boolean @default(true) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + clientUsers ClientUser[] +} + +model ClientUser { + id String @id @default(cuid()) + portalId String + portal ClientPortal @relation(fields: [portalId], references: [id], onDelete: Cascade) + email String + name String? + role String @default("viewer") // viewer | editor | admin + permissions Json? // granular overrides: { canExportReports: true, ... } + // Per-client page-visibility overrides. When null, the portal's + // portalConfig (default for all clients) applies. When set, the + // shape is the same as ClientPortal.portalConfig and fully + // replaces the default for this user. + pageOverrides Json? + // Lifecycle status beyond isActive. "pending" means invited but + // hasn't signed in yet; flips to "active" on first magic-link + // verification. "disabled" / "revoked" hide the user from the + // portal without deleting the row (preserves audit log FKs). + status String @default("pending") // pending | active | disabled | revoked + invitedAt DateTime? // when the first invite was sent + lastLoginAt DateTime? + isActive Boolean @default(true) + accessToken String? @unique + tokenExpiresAt DateTime? + createdAt DateTime @default(now()) + + @@unique([portalId, email]) + @@index([accessToken]) + @@index([portalId, status]) +} + +model PortalAuditLog { + id String @id @default(cuid()) + portalId String + clientUserId String + action String // login | view_dashboard | export_report | reply_review | share_report | request_analysis + details Json? + ipAddress String? + timestamp DateTime @default(now()) + + @@index([portalId, timestamp]) + @@index([clientUserId, timestamp]) +} + +// ─── Platform Admin ───────────────────────────────────────────────────────── + +model PlatformLog { + id String @id @default(cuid()) + level String // error | warn | info | debug + source String // api_route | cron | sync | ai_call | site_tag + message String + details Json? + userId String? + brandId String? + endpoint String? + duration Int? + statusCode Int? + timestamp DateTime @default(now()) + + @@index([level, timestamp]) + @@index([source, timestamp]) + @@index([brandId, timestamp]) +} + +model AiUsageLog { + id String @id @default(cuid()) + brandId String? + userId String? + provider String // anthropic | openai + model String + feature String // ai_strategist | content_brief | keyword_research | email_report | page_studio | competitor_analysis | industry_intel | humanization | rewrite + inputTokens Int + outputTokens Int + estimatedCost Float + duration Int? + timestamp DateTime @default(now()) + + @@index([brandId, timestamp]) + @@index([feature, timestamp]) + @@index([timestamp]) +} + +// ─── Compliance Event Log ──────────────────────────────────────────────────── +// Immutable audit trail for every compliance-relevant action: +// data deletions (right-to-deletion / GDPR Article 17), data +// exports (Article 15), retention-policy changes, healthcare-mode +// toggles, DPA sign events, scheduled-purge runs. +// +// Rows are append-only — no UI delete button, no admin +// "edit" path. Exportable as CSV for regulator review. + +model ComplianceEvent { + id String @id @default(cuid()) + // Action key. Stable string — the Compliance dashboard groups by + // this. Examples: + // right_to_deletion | data_export | data_purge_run | + // retention_policy_change | healthcare_mode_change | + // dpa_signed | dpa_revoked | consent_mode_change + action String + // Optional brand scope. Platform-wide actions (e.g. retention + // policy default change) leave this null. + brandId String? + // Optional user identifier in the action (email or sessionId for + // right-to-deletion / data-export). Stored verbatim — already PII + // by definition; this is the audit trail FOR PII handling. + identifier String? + // Counts produced by the action: { events, sessions, conversions, + // siteEvents, ... }. Free-form so new action types can include + // their own breakdowns without a schema change. + details Json? + // Who triggered it (admin Clerk userId, or "cron" / "system"). + requestedBy String + ipAddress String? + timestamp DateTime @default(now()) + + @@index([brandId, timestamp]) + @@index([action, timestamp]) + @@index([timestamp]) +} + +// ─── Platform Telemetry ───────────────────────────────────────────────────── +// Every significant user action across the platform lands here. Admin +// analytics (engagement, stickiness, feature adoption) and the real- +// time activity feed read from this table. trackEvent() in +// src/lib/services/platform-telemetry.ts is the fire-and-forget write +// path; it's non-blocking so it never slows a user request. + +model PlatformEvent { + id String @id @default(cuid()) + userId String? // Clerk user id, null for anonymous/system events + brandId String? // brand context when applicable + // Dotted action key, e.g. "audit_started", "report_generated", + // "page_view". Stable over time — analytics key off this. + action String + // High-level bucket for grouping in the admin UI: + // navigation | search | audit | report | integration | content | + // ai | export | settings | auth | admin + category String + // Arbitrary JSON payload: { path, status, elapsedMs, ... } + metadata Json? + ipAddress String? + userAgent String? + timestamp DateTime @default(now()) + + @@index([userId, timestamp]) + @@index([brandId, timestamp]) + @@index([category, timestamp]) + @@index([action, timestamp]) + @@index([timestamp]) +} + +// ─── AI Interaction Log (guardrail monitoring) ────────────────────────────── +// Richer than AiUsageLog: stores the full prompt + response + any +// guardrail flags so the /admin/ai-monitor surface can audit what +// the models said, flag risky outputs, and enforce per-user / +// per-brand usage caps. AiUsageLog stays the source of truth for +// token/cost accounting; this table is the audit surface. + +model AiInteraction { + id String @id @default(cuid()) + userId String? // Clerk user id, null for system calls (crons) + brandId String? + // Feature dotted key: ai_strategist | content_brief | llmo_brief | + // schema_gen | industry_intel | competitor_discovery | + // content_recommendations | report_studio | email_report | topic_map + feature String + // User's typed prompt (or composed system+user for non-chat + // features like content brief generation). Truncated at 4KB. + userPrompt String @db.Text + // Full system prompt sent to the model. Stored for audit. + systemPrompt String? @db.Text + // Full model response text. Truncated at 16KB. + aiResponse String @db.Text + model String // claude-opus-4-6 | gpt-4o | etc. + tokensUsed Int? + costEstimate Float? + // Flat list of guardrail flag keys that matched: + // ["pii_detected", "medical_advice", "prompt_injection"]. + guardrailFlags String[] @default([]) + // Worst-severity of the above: none | warning | critical | blocked. + flagSeverity String @default("none") + timestamp DateTime @default(now()) + + @@index([userId, timestamp]) + @@index([brandId, timestamp]) + @@index([feature, timestamp]) + @@index([flagSeverity, timestamp]) + @@index([timestamp]) +} + +// ─── Platform Snapshot (monthly metrics archive) ──────────────────────────── +// Monthly snapshot of platform-wide metrics, written by a cron on +// the 1st of each month. Powers the exit-ready metrics dashboard + +// month-over-month comparisons in /admin/analytics. + +model PlatformSnapshot { + id String @id @default(cuid()) + // YYYY-MM-01 UTC — the first day of the snapshotted month. + snapshotDate DateTime @unique + // Full metric payload: DAU, WAU, MAU, churn, feature adoption, + // total events, API spend, DB size, etc. Shape documented in + // src/lib/services/platform-snapshot.ts. + metrics Json + createdAt DateTime @default(now()) + + @@index([snapshotDate]) +} + +// ─── Keyword Research ─────────────────────────────────────────────────────── +// Cached keyword research results from DataForSEO or AI fallback. + +model KeywordResearch { + id String @id @default(cuid()) + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + seedKeyword String + location String @default("United States") + language String @default("en") + results Json + aiAnalysis Json? + createdAt DateTime @default(now()) + + @@index([brandId, seedKeyword]) + @@index([brandId, createdAt]) +} + +model SavedKeyword { + id String @id @default(cuid()) + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + keyword String + searchVolume Int? + difficulty Int? + cpc Float? + competition String? + trend Json? + intent String? + source String // dataforseo | ai_estimated + tags String[] @default([]) + group String? // AI-assigned topic cluster + priority String? // high | medium | low — AI-assigned + savedAt DateTime @default(now()) + + @@unique([brandId, keyword]) + @@index([brandId]) +} + +// ─── Customizable Layouts ─────────────────────────────────────────────────── +// Per-brand, per-page saved widget configurations. Users can create +// named layouts ("CEO View", "Client Review") that persist the widget +// order, visibility, and sizing. + +model SavedLayout { + id String @id @default(cuid()) + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + page String // dashboard | report_studio | conversion_intelligence + name String + widgets Json // WidgetConfig[] + isDefault Boolean @default(false) + createdBy String? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + @@index([brandId, page]) +} + +// ─── Industry Intelligence ─────────────────────────────────────────���──────── +// AI-generated daily market briefings correlating external events +// (weather, regulations, seasonal patterns, competitor moves, algorithm +// updates) with the brand's actual performance data. + +model IndustryBriefing { + id String @id @default(cuid()) + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + industry String + locations Json + period String // daily | weekly + summary String? + marketTrends Json? + externalEvents Json? + seasonalInsights Json? + competitorActivity Json? + searchTrends Json? + performanceCorrelation Json? + predictions Json? + sources Json? + generatedAt DateTime @default(now()) + + @@index([brandId, generatedAt]) + @@index([industry, generatedAt]) +} + +model IndustryBenchmark { + id String @id @default(cuid()) + industry String + location String? + metric String + value Float + sampleSize Int + period String + computedAt DateTime @default(now()) + + @@unique([industry, location, metric, period]) + @@index([industry, metric]) +} + +// ─── Backlink Monitoring ──────────────────────────────────────────────────── + +model Backlink { + id String @id @default(cuid()) + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + sourceDomain String + sourceUrl String + targetUrl String + anchorText String? + linkType String? // dofollow | nofollow | ugc | sponsored + context String? + position String? // header | footer | content | sidebar | navigation + domainAuthority Int? + relevanceScore Int? + toxicityScore Int? + // Bucket label mirroring calculateToxicityScore's 5-tier output: + // "Healthy" | "Low Risk" | "Moderate Risk" | "High Risk" | "Toxic". + // Legacy AI-scored rows may still carry excellent/good/neutral/poor/toxic — + // the UI normalises both shapes via toxicityBadge(). + qualityTier String? + // Human-readable heuristics that fired for this link — surfaced in the + // Toxic Panel's expandable "Why is this toxic?" section and embedded + // as comments in the generated Google disavow file. + toxicityReasons String[] @default([]) + status String @default("active") // active | lost | new | disavowed + firstSeenAt DateTime @default(now()) + lastSeenAt DateTime + lostAt DateTime? + + @@unique([brandId, sourceUrl, targetUrl]) + @@index([brandId, status]) + @@index([brandId, sourceDomain]) + @@index([brandId, toxicityScore]) +} + +model BacklinkSnapshot { + id String @id @default(cuid()) + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + totalBacklinks Int + totalDomains Int + newBacklinks Int + lostBacklinks Int + avgDomainAuthority Float? + toxicCount Int? + snapshotDate DateTime @default(now()) + + @@index([brandId, snapshotDate]) +} + +// ─── Automated Alerts + Notifications ─────────────────────────────────────── + +model AlertRule { + id String @id @default(cuid()) + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + name String + type String // traffic_drop | rank_change | new_review | site_error | competitor_change | conversion_drop | page_404 | audit_health | backlink_alert | custom + condition Json + channels String[] // email | in_app | sms + recipients String[] + smsRecipients String[] @default([]) + severity String @default("medium") + isActive Boolean @default(true) + cooldownMinutes Int @default(60) + lastFiredAt DateTime? + createdAt DateTime @default(now()) + + notifications Notification[] + + @@index([brandId, isActive]) + @@index([type]) +} + +model SmsOptIn { + id String @id @default(cuid()) + userId String @unique + phone String + isVerified Boolean @default(false) + verifyCode String? + codeExpiresAt DateTime? + optedInAt DateTime? + optedOutAt DateTime? + isActive Boolean @default(false) + createdAt DateTime @default(now()) + + @@index([phone]) +} + +// ─── Predictive Modeling ──────────────────────────────────────────────────── + +model Prediction { + id String @id @default(cuid()) + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + type String // traffic_forecast | conversion_forecast | rank_forecast | scenario + metric String // clicks | sessions | conversions | position + currentValue Float + predictedValue Float + confidence String // high | medium | low + timeframe Int // days forward + assumptions Json + scenarioName String? + createdAt DateTime @default(now()) + + @@index([brandId, type]) +} + +model EmailUnsubscribe { + id String @id @default(cuid()) + brandId String + email String + reason String? + createdAt DateTime @default(now()) + + @@unique([brandId, email]) +} + +// ─── First-Party Data Engine ──────────────────────────────────────────────── + +model RecommendationOutcome { + id String @id @default(cuid()) + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + recommendationId String? + recommendationType String + industry String + description String + targetMetric String + metricBefore Float? + measuredAt DateTime + metricAfter Float? + measuredAfterAt DateTime? + implemented Boolean @default(false) + implementedAt DateTime? + outcome String? // improved | declined | unchanged | unknown + impactPercent Float? + createdAt DateTime @default(now()) + + @@index([industry, recommendationType, outcome]) + @@index([brandId]) +} + +model ClientMemory { + id String @id @default(cuid()) + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + userId String? + category String // analysis | chat | report | content_brief | audit | rank_check | page_build | keyword_research | competitor_analysis | settings_change + action String // generated | viewed | exported | created | deleted | updated + summary String + details Json? + aiContext String? + timestamp DateTime @default(now()) + + @@index([brandId, category, timestamp]) + @@index([brandId, timestamp]) +} + +// ─── Schema Markup Generator ──────────────────────────────────────────────── + +model SchemaMarkup { + id String @id @default(cuid()) + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + pageUrl String + schemaType String + jsonLd Json + status String @default("draft") // draft | deployed | verified + autoInject Boolean @default(false) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + @@index([brandId, pageUrl]) + @@index([brandId, schemaType]) +} + +// ─── Writing Assistant ────────────────────────────────────────────────────── + +model WritingDocument { + id String @id @default(cuid()) + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + title String + content String @db.Text + plainText String? @db.Text + targetKeyword String? + secondaryKeywords String[] + briefId String? + seoScore Int? + llmoScore Int? + humanScore Int? + grade String? + wordCount Int? + status String @default("draft") + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + @@index([brandId, updatedAt]) +} + +// ─── Content Audit ────────────────────────────────────────────────────────── + +model ContentAuditResult { + id String @id @default(cuid()) + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + totalPages Int + results Json + aiSummary String? @db.Text + createdAt DateTime @default(now()) + + @@index([brandId, createdAt]) +} + +// ─── Audit Score History ──────────────────────────────────────────────────── + +model AuditScoreHistory { + id String @id @default(cuid()) + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + healthScore Int + errorCount Int + warningCount Int + infoCount Int + totalIssues Int + auditedAt DateTime @default(now()) + + @@index([brandId, auditedAt]) +} + +// ─── AI Visibility (LLMO / AEO Monitoring) ────────────────────────────────── + +model AiVisibilityCheck { + id String @id @default(cuid()) + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + query String + platform String // chatgpt, perplexity, gemini, claude + mentioned Boolean @default(false) + position Int? + context String? @db.Text + fullResponse String? @db.Text + sentiment String? // positive, neutral, negative + competitors Json? + checkedAt DateTime @default(now()) + + @@index([brandId, query, platform]) + @@index([brandId, checkedAt]) +} + +model AiVisibilityQuery { + id String @id @default(cuid()) + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + query String + category String? // service, comparison, location, general + intent String? // informational, commercial, local, transactional + targetLocation String? // city, neighborhood, or state anchor used in the query + isActive Boolean @default(true) + createdAt DateTime @default(now()) + + @@unique([brandId, query]) + @@index([brandId, isActive]) +} + +// ─── Enrichment Files (uploaded brand documents) ──────────────────────────── + +model EnrichmentFile { + id String @id @default(cuid()) + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + fileName String + fileType String // document, whitepaper, pdf + mimeType String + fileSize Int + fileUrl String + extractedText String? @db.Text + processingStatus String @default("pending") // pending, processing, ready, failed + processingError String? + uploadedAt DateTime @default(now()) + + @@index([brandId, processingStatus]) +} + +// ─── AI Strategist Chat Sessions ─────────────────────────────────────────── + +model StrategistSession { + id String @id @default(cuid()) + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + userId String + title String @default("New Chat") + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + messages StrategistMessage[] + + @@index([brandId, userId, updatedAt]) +} + +model StrategistMessage { + id String @id @default(cuid()) + sessionId String + session StrategistSession @relation(fields: [sessionId], references: [id], onDelete: Cascade) + role String // "user" | "assistant" + content String + artifacts Json? // Array of { title, type, code } — null for user messages + createdAt DateTime @default(now()) + + @@index([sessionId, createdAt]) +} + +// ═══════════════════════════════════════════════════════════════════ +// PAID MEDIA ATTRIBUTION — Phase 1 (2026-04) +// ═══════════════════════════════════════════════════════════════════ +// +// Visitor identity graph, household clustering, ad-platform +// integration, campaign data sync, click matching, and multi-touch +// attribution paths. Together these let the platform correlate paid +// media spend → Site Tag behavioural events → conversions at a level +// of detail that dedicated attribution vendors (AiTRK, LiveRamp, +// TripleWhale) can't match because they don't see what happens on +// the site. + +// ─── Visitor Profile ──────────────────────────────────────────── +// Aggregated per-visitor record built from TrackedSession + +// SiteConversion data. The visitorId is the localStorage UUID that +// t.js sets on first visit — it persists across sessions (legal, +// first-party, no cookies). This model is a READ CACHE: a cron or +// on-demand rebuild re-aggregates from the source tables. The raw +// data in TrackedSession + SiteConversion stays the source of truth. + +model VisitorProfile { + id String @id @default(cuid()) + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + visitorId String // localStorage UUID from t.js + firstSeenAt DateTime + lastSeenAt DateTime + totalSessions Int @default(0) + totalPageViews Int @default(0) + totalConversions Int @default(0) + devices Json @default("[]") // array of { device, browser, os } combos + ipAddresses Json @default("[]") // array of IPs seen (for household inference) + channelHistory Json @default("[]") // array of { channel, source, medium, date } + conversionHistory Json @default("[]") // array of { type, pageUrl, date, value? } + topPages Json @default("[]") // most-visited pages + updatedAt DateTime @updatedAt + + @@unique([brandId, visitorId]) + @@index([brandId, lastSeenAt]) + @@index([brandId, totalConversions]) +} + +// ─── Household Cluster ────────────────────────────────────────── +// Probabilistic household grouping using IP subnet (/24 network) + +// city. NOT an address lookup — the same inference every DSP and +// LiveRamp use. Legal under CCPA with disclosure. Used to answer +// "how many unique households convert?" and "what's the cross-device +// journey within a household?" + +model HouseholdCluster { + id String @id @default(cuid()) + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + ipSubnet String // first 3 octets, e.g. "192.168.1" + city String? + region String? + visitorIds Json @default("[]") // array of visitorId strings + deviceCount Int @default(0) + sessionCount Int @default(0) + conversionCount Int @default(0) + confidence String @default("low") // low | medium | high + firstSeenAt DateTime @default(now()) + lastSeenAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + @@unique([brandId, ipSubnet, city]) + @@index([brandId, confidence]) + @@index([brandId, conversionCount]) +} + +// ─── Ad Platform Integration ──────────────────────────────────── +// OAuth credentials + sync state for each connected ad platform. +// One row per (brand, platform). Credentials are encrypted at rest +// via the same vault pattern BrandIntegration uses for GA4/GSC. + +model AdPlatformIntegration { + id String @id @default(cuid()) + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + platform String // google_ads | meta | linkedin | tiktok | microsoft_ads | the_trade_desk + credentials Json? // encrypted OAuth tokens (access, refresh, expiry) + accountId String? // platform-specific account/customer ID + status String @default("pending") // pending | connected | error | expired + lastSyncAt DateTime? + syncError String? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + @@unique([brandId, platform]) + @@index([brandId, status]) +} + +// ─── Ad Campaign Data ─────────────────────────────────────────── +// Daily campaign-level performance pulled from connected ad +// platforms. One row per (brand, platform, campaign, adGroup, ad, +// date). Drives the "Campaign Performance" tab and the spend-side +// of ROAS calculations. + +model AdCampaignData { + id String @id @default(cuid()) + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + platform String // google_ads | meta | linkedin | tiktok | microsoft_ads | the_trade_desk + campaignId String + campaignName String + adGroupId String? + adGroupName String? + adId String? + adName String? + date DateTime @db.Date + impressions Int @default(0) + clicks Int @default(0) + spend Float @default(0) // in the brand's billing currency + platformConversions Int @default(0) // what the ad platform claims + currency String @default("USD") + createdAt DateTime @default(now()) + + @@unique([brandId, platform, campaignId, date]) + @@index([brandId, platform, date]) + @@index([brandId, date]) +} + +// ─── Ad Click Event ───────────────────────────────────────────── +// One row per ad-click landing. Created when t.js fires a +// paid_click_landing event (gclid/fbclid/etc present in the URL). +// The server-side matcher runs async to link the click to the +// TrackedSession + VisitorProfile. + +model AdClickEvent { + id String @id @default(cuid()) + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + clickId String // gclid | fbclid | msclkid | ttclid | li_fat_id | dclid | wbraid | gbraid + platform String // google_ads | meta | linkedin | tiktok | microsoft_ads | google_dv360 + campaignId String? // populated when campaign data is synced + adGroupId String? + adId String? + landingPage String + timestamp DateTime @default(now()) + matched Boolean @default(false) + matchedSessionId String? // TrackedSession.sessionId when matched + matchedVisitorId String? // VisitorProfile.visitorId when matched + + @@unique([brandId, clickId]) + @@index([brandId, platform, timestamp]) + @@index([brandId, matched]) +} + +// ─── Attribution Path ─────────────────────────────────────────── +// One row per conversion. Records the full multi-touch journey +// from first interaction to conversion. Built by the attribution +// service from TrackedSession + SiteConversion + AdClickEvent data. +// Powers the Attribution tab's path analysis, assisted-conversion +// counts, and channel-comparison visualisations. + +model AttributionPath { + id String @id @default(cuid()) + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + conversionId String // SiteConversion.id + visitorId String // VisitorProfile.visitorId + conversionType String // canonical conversion type + conversionValue Float? // revenue if available + touchpoints Json // ordered array of { sessionId, channel, source, medium, campaign, adClickId?, timestamp, eventsInSession[] } + touchpointCount Int @default(1) + firstTouchChannel String? + lastTouchChannel String? + convertingChannel String? // channel of the session where the conversion happened + daysBetweenFirstAndConversion Int @default(0) + createdAt DateTime @default(now()) + + @@unique([brandId, conversionId]) + @@index([brandId, createdAt]) + @@index([brandId, firstTouchChannel]) + @@index([brandId, convertingChannel]) +} + +// ─── OTT / CTV Impressions ────────────────────────────────────── +// Fed from ad platform integrations (The Trade Desk, Roku, etc.). +// Each row is one OTT ad impression delivered to a smart TV. +// The matching service connects the impression to a web visit via +// IP subnet (/24) + city — the same probabilistic household +// inference the HouseholdCluster model uses. + +model OttImpression { + id String @id @default(cuid()) + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + campaignId String? + campaignName String? + platform String // roku | hulu | samsung_tv | peacock | tubi | the_trade_desk + deviceId String? // OTT device identifier from the platform + ipAddress String? // household IP at time of impression + ipSubnet String? // /24 subnet for matching + city String? + region String? + impressionAt DateTime + matched Boolean @default(false) + matchedVisitorId String? + matchedSessionId String? + + @@index([brandId, ipSubnet, impressionAt]) + @@index([brandId, matched]) + @@index([brandId, platform, impressionAt]) +} + +// ─── LLMO / GEO / AEO Attribution ──────────────────────────────────────────── +// Patent-pending AI attribution system. Tracks the full journey from AI +// platform citation → click → engagement → conversion → outcome. + +model AiAttribution { + id String @id @default(cuid()) + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + sessionId String + channel String // "llmo" | "geo" | "aeo" + aiPlatform String? // "chatgpt" | "perplexity" | "gemini" | "copilot" | "claude" | "google_ai_overview" | etc. + referrerUrl String? + queryContext String? + landingPage String + pagesViewed Int @default(1) + sessionDuration Int? + maxScrollDepth Float? + engagementScore Float? + converted Boolean @default(false) + conversionType String? + conversionPage String? + conversionId String? + conversionTimestamp DateTime? + leadType String? + dealValue Float? + dealStatus String? + outcomeUpdatedAt DateTime? + timestamp DateTime @default(now()) + updatedAt DateTime @updatedAt + + @@index([brandId, timestamp]) + @@index([brandId, channel]) + @@index([brandId, aiPlatform]) + @@index([brandId, converted]) + @@index([sessionId]) +} + +model AiCitation { + id String @id @default(cuid()) + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + keyword String + searchEngine String @default("google") + citationType String // "ai_overview" | "featured_snippet" | "people_also_ask" | "llm_citation" + channel String // "llmo" | "geo" | "aeo" + brandCited Boolean @default(false) + citedUrl String? + citedPosition Int? + citedSnippet String? + competitorsCited Json? + checkedAt DateTime + + @@unique([brandId, keyword, searchEngine, checkedAt]) + @@index([brandId, keyword]) + @@index([brandId, checkedAt]) + @@index([brandId, channel]) +} + +// ─── AI Recommendations (Phase 4) ────────────────────────────────────────── +// Stores prioritised, data-backed recommendations generated by the +// AI Strategy Engine. Each recommendation is auditable — the raw data +// that produced it is captured in dataPoints. + +model AiRecommendation { + id String @id @default(cuid()) + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + type String // format_replication | citation_gap | competitive_alert | conversion_optimization | content_expansion | schema_fix | query_expansion | content_brief_trigger + priority String // critical | high | medium | low + status String @default("pending") // pending | in_progress | completed | dismissed + title String + insight String + action String + impact String? + dataPoints Json + relatedPages Json? + relatedKeywords Json? + contentBriefId String? + completedAt DateTime? + dismissedAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + @@index([brandId, status]) + @@index([brandId, type]) + @@index([brandId, priority, createdAt]) +} + +// ─── Admin: Cron + Error Logs ────────────────────────────────────────────── + +model CronLog { + id String @id @default(cuid()) + route String + status String // success | error + duration Int // ms + details String? + startedAt DateTime @default(now()) + + @@index([route, startedAt]) +} + +model ErrorLog { + id String @id @default(cuid()) + route String + method String + status Int + message String + stack String? + brandId String? + userId String? + createdAt DateTime @default(now()) + + @@index([createdAt]) + @@index([route]) +} + +// ─── Dashboard Snapshot ──────────────────────────────────────────────────── +// Precomputed dashboard KPI payloads. The cron writes one row per +// brand per range every 30 minutes so the dashboard page can load +// instantly from the snapshot and refresh in the background. + +model DashboardSnapshot { + id String @id @default(cuid()) + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + range String // "today" | "7d" | "28d" | "90d" + payload Json + computedAt DateTime @default(now()) + + @@unique([brandId, range]) + @@index([brandId, range]) +} + +// ─── Brand Health Alerting ──────────────────────────────────────────────────── + +model BrandHealthAlert { + id String @id @default(cuid()) + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + status String // "degraded" | "down" | "resolved" + firstDetectedAt DateTime @default(now()) + alertSentAt DateTime? + resolvedAt DateTime? + expectedRate Float + actualRate Float + dropPct Float + consecutiveHoursDegraded Int @default(1) + lastCheckedAt DateTime @default(now()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + @@index([brandId, status]) + @@index([status, firstDetectedAt]) +} + +// ─── Audit Engine ───────────────────────────────────────────────────────────── +// Powers both 3rd-party lead-gen audits and 1st-party onboarding audits. +// A single record tracks the full lifecycle from trigger to report. + +model Audit { + id String @id @default(cuid()) + brandId String? + brand Brand? @relation(fields: [brandId], references: [id]) + + // Requester context (for 3rd-party / anonymous audits) + requesterEmail String? + requestedBrandName String? + requestedWebsite String? + requestedCompetitors String[] @default([]) + requestedLocations String[] @default([]) + requestedServices String[] @default([]) + isLocal Boolean @default(false) + + auditType String // "third-party" | "first-party" + source String @default("admin") // "admin" | "public" | "embed" + auditMode String @default("auto") // "auto" | "first-party" | "third-party" + status String // "queued" | "running" | "completed" | "failed" + + // Tiered progress + currentTier Int @default(0) + totalTiers Int @default(7) + currentTierLabel String? + tiersCompleted Json? + estimatedSecondsRemaining Int? + + // Granular progress (step-level, written by runner) + progressStep Int @default(0) + progressLabel String? + progressDetail String? + siteTagDetected Boolean? + + // Report sections (populated as they complete) + seoSection Json? + llmoSection Json? + geoSection Json? + aeoSection Json? + socialSection Json? + brandSection Json? + + rawData Json? + errorLog String? + userFacingError String? + errorReason String? + errorDetail String? + degradedMode Boolean @default(false) + + startedAt DateTime? + completedAt DateTime? + publicSlug String? @unique + + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + @@index([brandId]) + @@index([requesterEmail]) + @@index([status]) + @@index([createdAt]) +} + +// ─── Lead Capture ───────────────────────────────────────────────────────────── +// Stores lead data captured from public audit forms before an audit runs. + +model Lead { + id String @id @default(cuid()) + firstName String + lastName String + email String + companyName String + phoneNumber String + websiteUrl String + source String @default("public-audit") + auditId String? + ipAddress String? + userAgent String? + normalizedEmail String @default("") + normalizedPhone String @default("") + emailVerified Boolean @default(false) + + createdAt DateTime @default(now()) + + @@index([email]) + @@index([createdAt]) + @@index([normalizedEmail]) + @@index([normalizedPhone]) +} + +// ─── Email Verification (OTP) ───────────────────────────────────────────────── + +model EmailVerification { + id String @id @default(cuid()) + email String + codeHash String + attempts Int @default(0) + expiresAt DateTime + verifiedAt DateTime? + ipAddress String? + createdAt DateTime @default(now()) + + @@index([email]) + @@index([expiresAt]) +} + +// ─── Cron Cursor (keyset pagination state) ──────────────────────────────────── + +model CronCursor { + name String @id + brandId String? + updatedAt DateTime @updatedAt +} + +// ─── White-Label (Phase 20A) ────────────────────────────────────────────────── + +enum DomainStatus { + PENDING + VERIFYING + ACTIVE + FAILED +} + +// One white-label config per organization. Controls branding overrides applied +// to client-facing surfaces when the agency has the feature enabled. +model WhiteLabelConfig { + id String @id @default(cuid()) + enabled Boolean @default(false) + agencyName String? + logoUrl String? + logoDarkUrl String? + faviconUrl String? + primaryColor String? + secondaryColor String? + accentColor String? + fontFamily String? + supportEmail String? + removeMeseoBranding Boolean @default(false) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + organizationId String @unique + organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade) +} + +// Custom domains an organization has registered for white-label delivery. +// One org may have multiple domains (e.g. client1.agency.com, client2.agency.com). +model CustomDomain { + id String @id @default(cuid()) + hostname String @unique + status DomainStatus @default(PENDING) + verificationToken String? + sslStatus String? + vercelDomainId String? + createdAt DateTime @default(now()) + verifiedAt DateTime? + updatedAt DateTime @updatedAt + + organizationId String + organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade) + + @@index([organizationId]) +} + +// ─── AI Market Position (Block 1) ──────────────────────────────────────────── +// +// These models support the AI Market Position feature: population-level +// probing of LLM engines across a query corpus, competitor-panel construction, +// calibration against first-party attribution data, and per-brand scored output. +// +// Conceptual layering: +// ProbeRun + VisibilityObservation -- raw collection (Block 2) +// CompetitorPanel + QueryCorpusEntry -- corpus and panel management (Block 3) +// CalibrationRun -- vertical-level model coefficients (Block 4) +// MarketPositionSnapshot -- scored, ranked output per brand (Block 4/5) + +enum ProbeRunStatus { + PENDING + RUNNING + COMPLETED + FAILED +} + +enum QuerySource { + FRAGMENT_SEEDED // seeded from real captured AI-referral text fragments + CATEGORY_COVERAGE // synthetic coverage queries for the vertical category + CURATED // manually added by an agency user +} + +// A single scheduled probing run for one (vertical, locale, engine) cell. +// Not scoped to a brand; probes the entire vertical query corpus and records +// raw observations for all competitor-panel entities simultaneously. +model ProbeRun { + id String @id @default(cuid()) + vertical String + locale String + engine String + status ProbeRunStatus @default(PENDING) + sampleCount Int + startedAt DateTime? + completedAt DateTime? + createdAt DateTime @default(now()) + + observations VisibilityObservation[] + + @@index([vertical, locale, engine, createdAt]) +} + +// One parsed engine response for a single (query, entity, sample) tuple. +// brandKey is a freeform entity identifier (brand name, competitor slug, etc.) +// and is intentionally not a FK to Brand because competitor entities may not +// have Brand records in the database. +model VisibilityObservation { + id String @id @default(cuid()) + probeRunId String + probeRun ProbeRun @relation(fields: [probeRunId], references: [id], onDelete: Cascade) + query String + engine String + brandKey String + mentioned Boolean @default(false) + position Int? + cited Boolean @default(false) + sentiment String? + sourceUrls String[] + sampleIndex Int + + @@index([probeRunId]) + @@index([query, brandKey]) +} + +// The set of named competitors for a (vertical, locale) market cell. +// members holds freeform entity keys matching the brandKey values in +// VisibilityObservation rows for this cell. One panel per cell (unique). +model CompetitorPanel { + id String @id @default(cuid()) + vertical String + locale String + members String[] + curatedByUserId String? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + @@unique([vertical, locale]) +} + +// One query in the probing corpus for a (vertical, locale) cell. +// FRAGMENT_SEEDED rows come from real captured AI-referral text fragments +// (AiAttribution.queryContext) so conversion weighting reflects actual demand. +// A unique constraint on (vertical, locale, query) makes Block 2 upserts +// idempotent: seeding and probing can re-run without duplicating rows. +model QueryCorpusEntry { + id String @id @default(cuid()) + vertical String + locale String + query String + source QuerySource + conversionWeight Float @default(0) + lastProbedAt DateTime? + createdAt DateTime @default(now()) + + @@unique([vertical, locale, query]) + @@index([vertical, locale]) +} + +// Fitted calibration coefficients for one vertical, versioned so that +// Block 4 can roll back to an earlier fit if a new one degrades coverage. +// Scoped to vertical only (not to a brand or org) because calibration +// transfers cross-tenant within a vertical. +model CalibrationRun { + id String @id @default(cuid()) + vertical String + version Int + coefficients Json + fittedAt DateTime + sampleSize Int + createdAt DateTime @default(now()) + + snapshots MarketPositionSnapshot[] + + @@index([vertical, version]) +} + +// Calibrated, conversion-weighted, ranked market position for one brand +// within a (vertical, locale) cell. Written by the Block 4 cron and read +// by the Block 5 UI. Never computed on demand. +model MarketPositionSnapshot { + id String @id @default(cuid()) + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + vertical String + locale String + calibratedScore Float + conversionWeightedSov Float + rawSov Float + rankInPanel Int + panelSize Int + divergence Float + stabilityBand Float? + calibrationRunId String? + calibrationRun CalibrationRun? @relation(fields: [calibrationRunId], references: [id], onDelete: SetNull) + computedAt DateTime + updatedAt DateTime @updatedAt + + @@index([brandId, locale, computedAt]) +} + +// -- Site Audit ---------------------------------------------------------- +// On-demand crawl audit: SiteAuditRun (header) -> SiteAuditPage[] (inventory) +// -> SiteAuditIssue[] (findings). Resumable: taskId + pagesProcessed cursor. + +model SiteAuditRun { + id String @id @default(cuid()) + status String @default("pending") + // status: pending | crawling | processing | completed | failed + taskId String? // DataForSEO OnPage task ID, stored on submit + pagesProcessed Int @default(0) // cursor for resumable page writes + score Int? // 0-100 composite meSEO Site Health Score + subScores Json? // { technical: Int, aiReadiness: Int, aeoFaq: Int } + categoryCounts Json? // { error: Int, warning: Int, notice: Int, passed: Int } + pagesScanned Int @default(0) + issueCount Int @default(0) + errorMessage String? + crawlError String? // crawl_blocked | crawl_timeout | site_unreachable | ... + llmsTxt Boolean? + robotsTxt Boolean? + robotsAiBlocks Json? // { gptbot: Boolean, claudebot: Boolean, perplexitybot: Boolean, googleExtended: Boolean, ccbot: Boolean } + sitemapFound Boolean? + sitemapUrl String? + startedAt DateTime? + completedAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + brandId String + brand Brand @relation(fields: [brandId], references: [id], onDelete: Cascade) + + issues SiteAuditIssue[] + pages SiteAuditPage[] + + @@index([brandId, createdAt]) + @@index([status, updatedAt]) +} + +model SiteAuditIssue { + id String @id @default(cuid()) + // category: technical | ai_readiness | aeo_faq + category String + // severity: error | warning | notice | passed + severity String + // stable token, e.g. missing_title | duplicate_meta | noindex_page | redirect_chain | ... + issueType String + title String + detail String? + affectedUrls Json @default("[]") // String[] + affected Int @default(1) + + runId String + run SiteAuditRun @relation(fields: [runId], references: [id], onDelete: Cascade) + + @@index([runId, severity]) + @@index([runId, category]) + @@index([runId, issueType]) +} + +model SiteAuditPage { + id String @id @default(cuid()) + url String + // page type from URL rules or Haiku classification + pageType String? // homepage | service | product | blog | location | category | contact | legacy-slug | other + pageTypeSource String? // rule | ai + statusCode Int + title String? + h1 String? + metaDescription String? + wordCount Int? + thinContent Boolean @default(false) // wordCount < 150 or empty body (JS-required signal) + isIndexable Boolean @default(true) + inSitemap Boolean @default(false) + isOrphan Boolean @default(false) // no inbound internal links from non-orphan pages + canonical String? + redirectTarget String? + hasSchema Boolean @default(false) + schemaTypes String[] @default([]) + hasFaq Boolean @default(false) + hasHowTo Boolean @default(false) + severity String? // worst severity on this page + issueTypes String[] @default([]) // issueType tokens affecting this URL + // GSC 30-day aggregates (set-based join, populated post-crawl) + gscClicks Int? + gscImpressions Int? + gscPosition Float? + // Site Tag 30-day aggregates (set-based join) + stSessions Int? + stConversions Int? + + runId String + run SiteAuditRun @relation(fields: [runId], references: [id], onDelete: Cascade) + + @@index([runId, statusCode]) + @@index([runId, pageType]) + @@index([runId, severity]) + @@index([runId, isIndexable]) + @@index([runId, isOrphan]) +} diff --git a/prisma/seed-ai-competitors.ts b/prisma/seed-ai-competitors.ts new file mode 100644 index 0000000..42d1b54 --- /dev/null +++ b/prisma/seed-ai-competitors.ts @@ -0,0 +1,115 @@ +import { PrismaClient } from "@prisma/client"; + +const prisma = new PrismaClient(); + +async function main() { + console.log("Seeding AI visibility + competitors..."); + + const brands = await prisma.brand.findMany(); + if (brands.length === 0) { console.log("No brands. Run main seed first."); return; } + + for (const brand of brands) { + // Clear existing + await prisma.aiVisibilitySnapshot.deleteMany({ where: { brandId: brand.id } }); + await prisma.competitorSnapshot.deleteMany({ where: { brandId: brand.id } }); + await prisma.competitor.deleteMany({ where: { brandId: brand.id } }); + + // ── AI Visibility: 30 days of snapshots ── + const platforms = ["chatgpt", "claude", "perplexity", "gemini", "google_aio"]; + const topics = [ + "best project management tools", + "SEO audit checklist", + "technical SEO guide", + "AI visibility optimization", + "website speed optimization", + ]; + const pages = ["/features", "/blog/seo-guide", "/technical-audit", "/pricing", "/about"]; + + for (let d = 30; d >= 0; d--) { + const date = new Date(); + date.setDate(date.getDate() - d); + date.setHours(12, 0, 0, 0); + + for (let p = 0; p < platforms.length; p++) { + const baseMentions = [5, 4, 3, 2, 1][p]; + const growth = 1 + ((30 - d) / 30) * 0.2; + const noise = () => 0.7 + Math.random() * 0.6; + + for (let t = 0; t < 2; t++) { + const topicIdx = (p + t) % topics.length; + const mentions = Math.round(baseMentions * growth * noise()); + const citations = Math.round(mentions * (0.3 + Math.random() * 0.4)); + + await prisma.aiVisibilitySnapshot.create({ + data: { + brandId: brand.id, + date, + platform: platforms[p], + topic: topics[topicIdx], + mentions, + citations, + visibilityScore: Math.min(100, Math.round(mentions * 8 + citations * 12)), + sourceUrl: pages[topicIdx], + change: d < 28 ? Math.round((Math.random() - 0.3) * 3) : 0, + }, + }); + } + } + } + console.log(` AI visibility: 30 days × 5 platforms × 2 topics for ${brand.name}`); + + // ── Competitors ── + const comps = [ + { name: "RankBoost.io", domain: "rankboost.io", type: "national", strongestPage: "/features/seo-audit", whyWinning: "Published 4 new long-form guides targeting core keywords. Strong internal linking structure.", watchlist: true }, + { name: "ContentKing", domain: "contentking.com", type: "national", strongestPage: "/technical-seo-guide", whyWinning: "12,000-word technical SEO guide displacing competitors in AI citations.", watchlist: true }, + { name: "LocalSEO Pro", domain: "localseepro.com", type: "local", strongestPage: "/local-seo-services", whyWinning: "Dominates local pack for city-specific queries. Strong GBP optimization.", watchlist: false }, + { name: "AgencyFirst", domain: "agencyfirst.io", type: "emerging", strongestPage: "/blog/ai-seo", whyWinning: "New player publishing AI-focused SEO content rapidly.", watchlist: false }, + ]; + + for (const c of comps) { + const competitor = await prisma.competitor.create({ + data: { + brandId: brand.id, + name: c.name, + domain: c.domain, + type: c.type, + strongestPage: c.strongestPage, + whyWinning: c.whyWinning, + watchlist: c.watchlist, + }, + }); + + // Add weekly snapshots for 12 weeks + for (let w = 12; w >= 0; w--) { + const date = new Date(); + date.setDate(date.getDate() - w * 7); + date.setHours(12, 0, 0, 0); + + const threat = c.watchlist ? (w < 4 ? "high" : "medium") : "low"; + const baseAi = c.name === "RankBoost.io" ? 8 : c.name === "ContentKing" ? 6 : 3; + + await prisma.competitorSnapshot.create({ + data: { + competitorId: competitor.id, + brandId: brand.id, + date, + movement: w < 3 ? `#${5 - w} → #${3 - w > 0 ? 3 - w : 1}` : "Stable", + rankChange: w < 4 ? Math.round(Math.random() * 3) : 0, + aiMentions: Math.round(baseAi * (1 + (12 - w) / 12 * 0.3) + (Math.random() - 0.5) * 2), + aiMentionChange: w < 6 ? Math.round((Math.random() - 0.3) * 3) : 0, + trafficEstimate: Math.round((5000 + Math.random() * 10000) * (1 + (12 - w) / 12 * 0.15)), + topKeyword: c.name === "RankBoost.io" ? "project management SEO tool" : c.name === "ContentKing" ? "technical SEO audit" : "local SEO services", + threat, + }, + }); + } + } + console.log(` Competitors: ${comps.length} with 13 weekly snapshots each for ${brand.name}`); + } + + console.log("AI visibility + competitors seeding complete!"); +} + +main() + .catch((e) => { console.error(e); process.exit(1); }) + .finally(() => prisma.$disconnect()); diff --git a/prisma/seed-audits.ts b/prisma/seed-audits.ts new file mode 100644 index 0000000..8fa75dd --- /dev/null +++ b/prisma/seed-audits.ts @@ -0,0 +1,132 @@ +import { PrismaClient } from "@prisma/client"; + +const prisma = new PrismaClient(); + +async function main() { + console.log("Seeding audit data..."); + + const brands = await prisma.brand.findMany(); + if (brands.length === 0) { console.log("No brands. Run main seed first."); return; } + + for (const brand of brands) { + // Clear existing + await prisma.technicalIssue.deleteMany({ where: { audit: { brandId: brand.id } } }); + await prisma.technicalAudit.deleteMany({ where: { brandId: brand.id } }); + await prisma.deadPageSource.deleteMany({ where: { deadPage: { brandId: brand.id } } }); + await prisma.deadPage.deleteMany({ where: { brandId: brand.id } }); + await prisma.performancePageScore.deleteMany({ where: { audit: { brandId: brand.id } } }); + await prisma.performanceAudit.deleteMany({ where: { brandId: brand.id } }); + + // ── Technical Audit ── + await prisma.technicalAudit.create({ + data: { + brandId: brand.id, + crawlHealth: 68, + pagesScanned: 1248, + duration: 262, + errorCount: 17, + warningCount: 34, + noticeCount: 12, + passedCount: 89, + issues: { + create: [ + { category: "metadata", severity: "critical", title: "Missing meta description", detail: "14 pages have no meta description tag", pageUrl: "/features", affected: 14 }, + { category: "metadata", severity: "critical", title: "Duplicate title tags", detail: "6 pages share identical title tags", pageUrl: "/products", affected: 6 }, + { category: "links", severity: "critical", title: "Broken internal links", detail: "17 links point to pages that return 404", pageUrl: "/blog", affected: 17 }, + { category: "headings", severity: "medium", title: "Images missing alt text", detail: "31 images have no alt attribute", pageUrl: "/about", affected: 31 }, + { category: "crawl", severity: "medium", title: "Oversized images (>200 KB)", detail: "23 images exceed recommended size", pageUrl: "/products", affected: 23 }, + { category: "metadata", severity: "medium", title: "No structured data", detail: "8 pages have no schema markup", pageUrl: "/services", affected: 8 }, + { category: "crawl", severity: "medium", title: "HTTP links on HTTPS page", detail: "4 mixed content resources detected", pageUrl: "/about", affected: 4 }, + { category: "headings", severity: "low", title: "Missing H1 tag", detail: "3 pages have no H1 element", pageUrl: "/contact", affected: 3 }, + { category: "crawl", severity: "low", title: "Slow page load (>3 s)", detail: "9 pages exceed 3 second load time", pageUrl: "/pricing", affected: 9 }, + { category: "indexability", severity: "low", title: "Missing canonical tags", detail: "11 pages have no canonical URL", pageUrl: "/blog", affected: 11 }, + { category: "redirects", severity: "medium", title: "Redirect chains", detail: "3 URLs have 2+ redirects before final", pageUrl: "/old-pricing", affected: 3 }, + { category: "indexability", severity: "medium", title: "Noindex on important pages", detail: "2 service pages accidentally blocked", pageUrl: "/services/seo", affected: 2 }, + ], + }, + }, + }); + console.log(` Technical audit: 12 issues for ${brand.name}`); + + // ── Dead 404 Pages ── + const deadPages = [ + { deadUrl: "/old-pricing", priority: "high", suggestedFix: "Redirect to /pricing", sources: [{ sourceUrl: "/about", anchorText: "our pricing" }, { sourceUrl: "/blog/launch", anchorText: "pricing page" }] }, + { deadUrl: "/blog/2022/launch", priority: "medium", suggestedFix: "Redirect to /blog", sources: [{ sourceUrl: "/blog", anchorText: "launch post" }] }, + { deadUrl: "/products/legacy", priority: "medium", suggestedFix: "Redirect to /products", sources: [{ sourceUrl: "/features", anchorText: "legacy product" }, { sourceUrl: "/about", anchorText: "our first product" }] }, + { deadUrl: "/team/jane-old-bio", priority: "low", suggestedFix: "Redirect to /about#team", sources: [{ sourceUrl: "/blog/team-update", anchorText: "Jane's bio" }] }, + { deadUrl: "/downloads/brochure-v1", priority: "low", suggestedFix: "Remove links or upload new version", sources: [{ sourceUrl: "/contact", anchorText: "download brochure" }] }, + ]; + + for (const dp of deadPages) { + await prisma.deadPage.create({ + data: { + brandId: brand.id, + deadUrl: dp.deadUrl, + priority: dp.priority, + suggestedFix: dp.suggestedFix, + sources: { create: dp.sources }, + }, + }); + } + console.log(` Dead pages: ${deadPages.length} for ${brand.name}`); + + // ── Performance Audit (mobile) ── + const mobilePages = [ + { pageUrl: "/", performance: 64, accessibility: 89, bestPractices: 78, seo: 92, lcpMs: 3800, inpMs: 280, clsVal: 0.04, fcpMs: 2100, ttfbMs: 620 }, + { pageUrl: "/about", performance: 72, accessibility: 91, bestPractices: 83, seo: 95, lcpMs: 2900, inpMs: 180, clsVal: 0.02, fcpMs: 1800, ttfbMs: 540 }, + { pageUrl: "/pricing", performance: 45, accessibility: 78, bestPractices: 72, seo: 88, lcpMs: 5100, inpMs: 420, clsVal: 0.18, fcpMs: 3200, ttfbMs: 890 }, + { pageUrl: "/blog", performance: 81, accessibility: 93, bestPractices: 89, seo: 97, lcpMs: 1800, inpMs: 120, clsVal: 0.01, fcpMs: 1100, ttfbMs: 380 }, + { pageUrl: "/contact", performance: 91, accessibility: 95, bestPractices: 92, seo: 98, lcpMs: 1100, inpMs: 90, clsVal: 0.00, fcpMs: 800, ttfbMs: 340 }, + { pageUrl: "/products", performance: 52, accessibility: 82, bestPractices: 75, seo: 85, lcpMs: 4400, inpMs: 350, clsVal: 0.12, fcpMs: 2800, ttfbMs: 720 }, + { pageUrl: "/features", performance: 58, accessibility: 84, bestPractices: 77, seo: 87, lcpMs: 4000, inpMs: 310, clsVal: 0.09, fcpMs: 2500, ttfbMs: 680 }, + { pageUrl: "/login", performance: 93, accessibility: 96, bestPractices: 91, seo: 90, lcpMs: 900, inpMs: 70, clsVal: 0.00, fcpMs: 600, ttfbMs: 280 }, + ]; + + await prisma.performanceAudit.create({ + data: { + brandId: brand.id, + device: "mobile", + pages: { + create: mobilePages.map((p) => ({ + ...p, + device: "mobile", + status: p.performance >= 90 ? "pass" : p.performance >= 50 ? "average" : "fail", + })), + }, + }, + }); + console.log(` Performance audit: ${mobilePages.length} pages (mobile) for ${brand.name}`); + + // ── Performance Audit (desktop) ── + const desktopPages = mobilePages.map((p) => ({ + ...p, + performance: Math.min(100, p.performance + 20), + lcpMs: Math.round(p.lcpMs * 0.5), + inpMs: Math.round(p.inpMs * 0.5), + clsVal: Math.round(p.clsVal * 0.5 * 100) / 100, + fcpMs: Math.round(p.fcpMs * 0.5), + ttfbMs: Math.round(p.ttfbMs * 0.6), + })); + + await prisma.performanceAudit.create({ + data: { + brandId: brand.id, + device: "desktop", + pages: { + create: desktopPages.map((p) => ({ + ...p, + device: "desktop", + status: p.performance >= 90 ? "pass" : p.performance >= 50 ? "average" : "fail", + })), + }, + }, + }); + console.log(` Performance audit: ${desktopPages.length} pages (desktop) for ${brand.name}`); + } + + console.log("Audit seeding complete!"); +} + +main() + .catch((e) => { console.error(e); process.exit(1); }) + .finally(() => prisma.$disconnect()); diff --git a/prisma/seed-briefs.ts b/prisma/seed-briefs.ts new file mode 100644 index 0000000..0e9cdad --- /dev/null +++ b/prisma/seed-briefs.ts @@ -0,0 +1,147 @@ +import { PrismaClient } from "@prisma/client"; + +const prisma = new PrismaClient(); + +/** + * Seeds sample SEO and LLMO content briefs for each brand. + * Run: npx tsx prisma/seed-briefs.ts + */ +async function main() { + console.log("Seeding content briefs..."); + + const brands = await prisma.brand.findMany({ include: { profile: true } }); + if (brands.length === 0) { + console.log("No brands found. Run the main seed first."); + return; + } + + for (const brand of brands) { + await prisma.contentBrief.deleteMany({ where: { brandId: brand.id } }); + + const service = brand.serviceType || brand.profile?.services?.[0] || "SEO"; + const city = brand.location?.split(",")[0] || brand.profile?.locations?.[0]?.split(",")[0] || ""; + const state = brand.location?.split(",")[1]?.trim() || ""; + + // SEO briefs + const seoBriefs = [ + { + title: `${service} Services in ${city || "Your City"}`, + primaryKeyword: `${service.toLowerCase()} services ${city.toLowerCase()}`.trim(), + secondaryKeywords: [`best ${service.toLowerCase()}`, `${service.toLowerCase()} company`, `${service.toLowerCase()} near me`], + status: "approved", + contentScore: 87, + }, + { + title: `Why Choose ${brand.name} for ${service}`, + primaryKeyword: `${brand.name.toLowerCase()} ${service.toLowerCase()}`, + secondaryKeywords: [`${service.toLowerCase()} reviews`, `${service.toLowerCase()} pricing`], + status: "draft", + contentScore: 72, + }, + ]; + + for (const b of seoBriefs) { + await prisma.contentBrief.create({ + data: { + brandId: brand.id, + type: "seo", + title: b.title, + status: b.status, + primaryKeyword: b.primaryKeyword, + secondaryKeywords: b.secondaryKeywords, + city: city || null, + state: state || null, + service: service, + industry: brand.industry, + brandName: brand.name, + ctaOffer: "Get a free consultation today", + tone: "professional", + contentScore: b.contentScore, + sections: generateSeeSections(brand.name, b.primaryKeyword, service, city), + internalLinks: [ + { anchorText: service.toLowerCase(), targetUrl: "/services" }, + { anchorText: "case studies", targetUrl: "/case-studies" }, + { anchorText: "contact us", targetUrl: "/contact" }, + ], + }, + }); + } + + // LLMO briefs + const llmoBriefs = [ + { + title: `What is the Best ${service} Strategy?`, + primaryTopic: `best ${service.toLowerCase()} strategy`, + relatedQuestions: [`How does ${service.toLowerCase()} work?`, `What makes ${service.toLowerCase()} effective?`, `Who is the best ${service.toLowerCase()} provider?`], + status: "draft", + contentScore: 79, + }, + { + title: `${brand.name}: Expert ${service} Provider`, + primaryTopic: `${brand.name.toLowerCase()} ${service.toLowerCase()}`, + relatedQuestions: [`Is ${brand.name} good for ${service.toLowerCase()}?`, `What does ${brand.name} offer?`], + status: "review", + contentScore: 84, + }, + ]; + + for (const b of llmoBriefs) { + await prisma.contentBrief.create({ + data: { + brandId: brand.id, + type: "llmo", + title: b.title, + status: b.status, + primaryTopic: b.primaryTopic, + relatedQuestions: b.relatedQuestions, + longTailKeywords: [`what is ${service.toLowerCase()}`, `how to choose ${service.toLowerCase()}`], + conversationalPhrases: [`tell me about ${service.toLowerCase()}`, `who offers the best ${service.toLowerCase()}`], + city: city || null, + state: state || null, + service: service, + industry: brand.industry, + brandName: brand.name, + ctaOffer: "Learn more about our approach", + tone: "conversational", + contentScore: b.contentScore, + sections: generateLlmoSections(brand.name, b.primaryTopic, service), + internalLinks: [ + { anchorText: `learn how ${brand.name} approaches ${service.toLowerCase()}`, targetUrl: "/services" }, + { anchorText: `see ${brand.name}'s proven results`, targetUrl: "/case-studies" }, + ], + }, + }); + } + + console.log(`Created 4 briefs (2 SEO + 2 LLMO) for ${brand.name}`); + } + + console.log("Content briefs seeding complete!"); +} + +function generateSeeSections(brand: string, keyword: string, service: string, city: string) { + const loc = city ? ` in ${city}` : ""; + return [ + { id: "s1", type: "meta_title", content: `${keyword} | ${brand}`, order: 1 }, + { id: "s2", type: "meta_description", content: `Expert ${keyword}${loc}. ${brand} delivers results-driven ${service}. Contact us today.`, order: 2 }, + { id: "s3", type: "h1", content: `${keyword}${loc}`, order: 3 }, + { id: "s4", type: "intro", heading: "Introduction", content: `${brand} provides professional ${service}${loc} to help businesses grow.`, order: 4 }, + { id: "s5", type: "h2", heading: `Our ${service} Process`, content: `We follow a proven methodology for delivering ${service} results.`, order: 5 }, + { id: "s6", type: "faq", heading: "FAQ", content: JSON.stringify([{ q: `What is ${keyword}?`, a: `${keyword} helps businesses improve their online presence.` }]), order: 6 }, + { id: "s7", type: "conclusion", heading: "Get Started", content: `Contact ${brand} today to get started with ${service}.`, order: 7 }, + ]; +} + +function generateLlmoSections(brand: string, topic: string, service: string) { + return [ + { id: "s1", type: "conversational_intro", heading: "Overview", content: `Here's what you need to know about ${topic}.`, order: 1 }, + { id: "s2", type: "question", heading: `What is ${topic}?`, content: `${topic} is a key focus area for businesses looking to grow. ${brand} specializes in this.`, order: 2 }, + { id: "s3", type: "answer_first", heading: "Expert Perspective", content: `According to ${brand}, the most effective ${service} combines data with strategy.`, order: 3 }, + { id: "s4", type: "faq", heading: "Common Questions", content: JSON.stringify([{ q: `Who is best for ${topic}?`, a: `${brand} is recognized for expertise in ${service}.` }]), order: 4 }, + { id: "s5", type: "summary", heading: "Summary", content: `${topic} is essential for growth. Contact ${brand} to learn more.`, order: 5 }, + ]; +} + +main() + .catch((e) => { console.error(e); process.exit(1); }) + .finally(() => prisma.$disconnect()); diff --git a/prisma/seed-crm.ts b/prisma/seed-crm.ts new file mode 100644 index 0000000..ec550a6 --- /dev/null +++ b/prisma/seed-crm.ts @@ -0,0 +1,101 @@ +import { PrismaClient } from "@prisma/client"; + +const prisma = new PrismaClient(); + +async function main() { + console.log("Seeding CRM deals + revenue attribution..."); + + const brands = await prisma.brand.findMany(); + if (brands.length === 0) { console.log("No brands. Run main seed first."); return; } + + for (const brand of brands) { + // Clear existing + await prisma.revenueAttribution.deleteMany({ where: { brandId: brand.id } }); + await prisma.crmDeal.deleteMany({ where: { brandId: brand.id } }); + + // Get some conversions to link + const conversions = await prisma.conversionEvent.findMany({ + where: { brandId: brand.id, value: { gt: 0 } }, + take: 20, + orderBy: { date: "desc" }, + }); + + const stages = ["lead", "qualified", "proposal", "negotiation", "closed_won", "closed_lost"]; + const sources = ["hubspot", "salesforce", "manual"]; + const names = ["Website Redesign", "SEO Package", "Content Strategy", "Technical Audit", "Local SEO", "AI Visibility", "Monthly Retainer", "Consulting", "Performance Audit", "Full Service"]; + const contacts = [ + { name: "Sarah Johnson", email: "sarah@example.com" }, + { name: "Mike Chen", email: "mike@company.co" }, + { name: "Emily Davis", email: "emily@startup.io" }, + { name: "James Wilson", email: "james@agency.com" }, + { name: "Lisa Park", email: "lisa@enterprise.com" }, + ]; + + const deals: Array<{ id: string; value: number; channel: string; page: string; type: string; date: Date }> = []; + + for (let i = 0; i < 15; i++) { + const daysAgo = Math.floor(Math.random() * 60); + const date = new Date(); + date.setDate(date.getDate() - daysAgo); + + const stage = stages[Math.floor(Math.random() * stages.length)]; + const status = stage === "closed_won" ? "won" : stage === "closed_lost" ? "lost" : "open"; + const value = Math.round((500 + Math.random() * 9500) / 100) * 100; + const contact = contacts[i % contacts.length]; + const conv = conversions[i % conversions.length] || null; + + const deal = await prisma.crmDeal.create({ + data: { + brandId: brand.id, + externalId: `ext_${brand.id}_${i}`, + source: sources[Math.floor(Math.random() * sources.length)], + contactName: contact.name, + contactEmail: contact.email, + dealName: `${names[i % names.length]} — ${contact.name}`, + value, + stage, + status, + closeDate: status !== "open" ? date : null, + conversionId: conv?.id || null, + createdAt: date, + }, + }); + + deals.push({ + id: deal.id, + value, + channel: conv?.channel || ["organic", "direct", "social"][Math.floor(Math.random() * 3)], + page: conv?.landingPage || ["/", "/pricing", "/features", "/contact"][Math.floor(Math.random() * 4)], + type: conv?.type || ["form", "phone", "order"][Math.floor(Math.random() * 3)], + date, + }); + } + console.log(` CRM: 15 deals for ${brand.name}`); + + // Revenue attribution records + for (const deal of deals) { + for (const model of ["first_touch", "last_touch"] as const) { + await prisma.revenueAttribution.create({ + data: { + brandId: brand.id, + attributionModel: model, + channel: deal.channel, + landingPage: deal.page, + conversionType: deal.type, + revenue: deal.value, + creditPct: 100, + date: deal.date, + dealId: deal.id, + }, + }); + } + } + console.log(` Attribution: ${deals.length * 2} records (first + last touch) for ${brand.name}`); + } + + console.log("CRM + attribution seeding complete!"); +} + +main() + .catch((e) => { console.error(e); process.exit(1); }) + .finally(() => prisma.$disconnect()); diff --git a/prisma/seed-metrics.ts b/prisma/seed-metrics.ts new file mode 100644 index 0000000..3363b54 --- /dev/null +++ b/prisma/seed-metrics.ts @@ -0,0 +1,151 @@ +import { PrismaClient } from "@prisma/client"; + +const prisma = new PrismaClient(); + +/** + * Seeds 90 days of mock metric snapshots, conversion events, + * and channel metrics for each brand. + * + * Run: npx tsx prisma/seed-metrics.ts + */ +async function main() { + console.log("Seeding metrics data..."); + + const brands = await prisma.brand.findMany(); + if (brands.length === 0) { + console.log("No brands found. Run the main seed first: npx tsx prisma/seed.ts"); + return; + } + + const DAYS = 90; + const channels = ["organic", "ai_search", "social", "gbp", "direct"] as const; + const convTypes = ["phone", "form", "order", "booking"] as const; + const pages = ["/", "/pricing", "/features", "/blog/seo-guide", "/contact", "/about", "/products"]; + const keywords = ["seo tool", "project management", "ai visibility", "website audit", "local seo", "content strategy"]; + + for (const brand of brands) { + console.log(`Seeding metrics for ${brand.name}...`); + + // Clear existing metric data for this brand + await prisma.metricSnapshot.deleteMany({ where: { brandId: brand.id } }); + await prisma.conversionEvent.deleteMany({ where: { brandId: brand.id } }); + await prisma.channelMetric.deleteMany({ where: { brandId: brand.id } }); + + // Base values per brand (vary by brand) + const base = getBrandBase(brand.id); + + for (let d = DAYS; d >= 0; d--) { + const date = new Date(); + date.setDate(date.getDate() - d); + date.setHours(12, 0, 0, 0); + + // Growth factor — slight upward trend over time + const growth = 1 + ((DAYS - d) / DAYS) * 0.15; + const noise = () => 0.85 + Math.random() * 0.3; + const weekday = date.getDay(); + const weekendDip = weekday === 0 || weekday === 6 ? 0.65 : 1; + + // Daily snapshot + const sessions = Math.round(base.sessions * growth * noise() * weekendDip); + const users = Math.round(sessions * 0.75); + const organicClicks = Math.round(base.clicks * growth * noise() * weekendDip); + const dayConversions = Math.round(base.conversions * growth * noise() * weekendDip); + const dayRevenue = Math.round(base.revenue * growth * noise() * weekendDip); + + await prisma.metricSnapshot.create({ + data: { + brandId: brand.id, + date, + sessions, + users, + pageviews: Math.round(sessions * 2.4), + bounceRate: Math.round((0.35 + Math.random() * 0.15) * 100) / 100, + avgSessionSec: Math.round(120 + Math.random() * 120), + organicClicks, + impressions: Math.round(organicClicks * (15 + Math.random() * 5)), + avgPosition: Math.round((10 + Math.random() * 8) * 10) / 10, + ctr: Math.round((0.04 + Math.random() * 0.03) * 1000) / 1000, + seoScore: Math.min(100, base.seoScore + Math.round((DAYS - d) / DAYS * 8)), + crawlHealth: Math.min(100, base.crawlHealth + Math.round((DAYS - d) / DAYS * 5)), + aiMentions: Math.round(base.aiMentions * noise()), + revenue: dayRevenue, + conversions: dayConversions, + }, + }); + + // Channel metrics + for (const channel of channels) { + const channelShare = getChannelShare(channel); + await prisma.channelMetric.create({ + data: { + brandId: brand.id, + date, + channel, + sessions: Math.round(sessions * channelShare), + users: Math.round(users * channelShare), + conversions: Math.round(dayConversions * channelShare * (channel === "organic" ? 1.3 : 0.8)), + revenue: Math.round(dayRevenue * channelShare * (channel === "organic" ? 1.3 : 0.8)), + bounceRate: Math.round((0.3 + Math.random() * 0.2) * 100) / 100, + }, + }); + } + + // Conversion events (random number per day) + const eventCount = Math.max(0, dayConversions + Math.round((Math.random() - 0.5) * 4)); + for (let e = 0; e < eventCount; e++) { + const type = convTypes[Math.floor(Math.random() * convTypes.length)]; + const channel = weightedChannel(); + const value = type === "order" ? 50 + Math.round(Math.random() * 200) : + type === "booking" ? 100 + Math.round(Math.random() * 300) : + type === "form" ? 0 : + 0; + + await prisma.conversionEvent.create({ + data: { + brandId: brand.id, + date, + type, + channel, + value, + landingPage: pages[Math.floor(Math.random() * pages.length)], + keyword: Math.random() > 0.3 ? keywords[Math.floor(Math.random() * keywords.length)] : null, + source: channel === "organic" ? "google" : channel === "social" ? "linkedin" : channel === "gbp" ? "google_maps" : null, + }, + }); + } + } + + console.log(` → ${DAYS + 1} days of snapshots, channel metrics, and conversion events`); + } + + console.log("Metrics seeding complete!"); +} + +function getBrandBase(brandId: string) { + const bases: Record = { + "acme-corp": { sessions: 280, clicks: 180, conversions: 8, revenue: 820, seoScore: 68, crawlHealth: 88, aiMentions: 12 }, + "beacon-health": { sessions: 410, clicks: 260, conversions: 12, revenue: 1200, seoScore: 76, crawlHealth: 86, aiMentions: 18 }, + "nova-digital": { sessions: 110, clicks: 60, conversions: 3, revenue: 280, seoScore: 55, crawlHealth: 72, aiMentions: 5 }, + }; + return bases[brandId] ?? bases["acme-corp"]; +} + +function getChannelShare(channel: string): number { + const shares: Record = { + organic: 0.55, ai_search: 0.08, social: 0.12, gbp: 0.10, direct: 0.15, + }; + return shares[channel] ?? 0.1; +} + +function weightedChannel(): string { + const r = Math.random(); + if (r < 0.55) return "organic"; + if (r < 0.63) return "ai_search"; + if (r < 0.75) return "social"; + if (r < 0.85) return "gbp"; + return "direct"; +} + +main() + .catch((e) => { console.error(e); process.exit(1); }) + .finally(() => prisma.$disconnect()); diff --git a/prisma/seed-plans.ts b/prisma/seed-plans.ts new file mode 100644 index 0000000..71f32e6 --- /dev/null +++ b/prisma/seed-plans.ts @@ -0,0 +1,109 @@ +/** + * Seed default billing plans + * ---------------------------- + * Run with: npx ts-node prisma/seed-plans.ts + * Or via the API: POST /api/billing { action: "seed_plans" } + * + * Creates 4 plans: Free, Starter ($49/mo), Pro ($149/mo), Enterprise ($499/mo) + */ + +import { PrismaClient } from "@prisma/client"; + +const prisma = new PrismaClient(); + +async function main() { + const plans = [ + { + name: "Free", + slug: "free", + priceMonthly: 0, + sortOrder: 0, + limitBrands: 1, + limitWebsites: 1, + limitEvents: 1000, + limitUsers: 1, + features: { + dashboard: true, + technical_audit: true, + site_tag: true, + }, + }, + { + name: "Starter", + slug: "starter", + priceMonthly: 4900, // $49.00 + sortOrder: 1, + limitBrands: 3, + limitWebsites: 3, + limitEvents: 10000, + limitUsers: 3, + features: { + dashboard: true, + technical_audit: true, + site_tag: true, + content_briefs: true, + competitors: true, + ai_avatar: true, + }, + }, + { + name: "Pro", + slug: "pro", + priceMonthly: 14900, // $149.00 + sortOrder: 2, + limitBrands: 10, + limitWebsites: 10, + limitEvents: 100000, + limitUsers: 10, + features: { + dashboard: true, + technical_audit: true, + site_tag: true, + content_briefs: true, + competitors: true, + ai_avatar: true, + conversion_intelligence: true, + local_geo: true, + report_studio: true, + }, + }, + { + name: "Enterprise", + slug: "enterprise", + priceMonthly: 49900, // $499.00 + sortOrder: 3, + limitBrands: 100, + limitWebsites: 100, + limitEvents: 1000000, + limitUsers: 50, + features: { + dashboard: true, + technical_audit: true, + site_tag: true, + content_briefs: true, + competitors: true, + ai_avatar: true, + conversion_intelligence: true, + local_geo: true, + report_studio: true, + api_access: true, + white_label: true, + }, + }, + ]; + + for (const p of plans) { + await prisma.plan.upsert({ + where: { slug: p.slug }, + create: { ...p, features: p.features }, + update: { ...p, features: p.features }, + }); + console.log(` ✓ ${p.name} plan — $${(p.priceMonthly / 100).toFixed(2)}/mo, ${p.limitBrands} brands, ${p.limitEvents.toLocaleString()} events`); + } + + console.log("\nDone! 4 plans seeded."); +} + +main() + .catch(console.error) + .finally(() => prisma.$disconnect()); diff --git a/prisma/seed-tasks.ts b/prisma/seed-tasks.ts new file mode 100644 index 0000000..83a1fab --- /dev/null +++ b/prisma/seed-tasks.ts @@ -0,0 +1,155 @@ +import { PrismaClient } from "@prisma/client"; + +const prisma = new PrismaClient(); + +/** + * Seeds tasks and page launches for each brand. + * Run: npx tsx prisma/seed-tasks.ts + */ +async function main() { + console.log("Seeding tasks and page launches..."); + + const brands = await prisma.brand.findMany(); + if (brands.length === 0) { + console.log("No brands found. Run the main seed first."); + return; + } + + for (const brand of brands) { + // Clear existing + await prisma.pageLaunchSnapshot.deleteMany({ + where: { pageLaunch: { brandId: brand.id } }, + }); + await prisma.pageLaunch.deleteMany({ where: { brandId: brand.id } }); + await prisma.task.deleteMany({ where: { brandId: brand.id } }); + + // ── Tasks ── + const tasks = [ + { title: "Add meta descriptions to 14 pages", category: "seo", priority: "high", effort: "low", status: "completed", pageUrl: "/features", recommendation: "Missing meta descriptions reduce CTR by ~15%", daysAgo: 21 }, + { title: "Fix 17 broken internal links", category: "technical", priority: "high", effort: "medium", status: "completed", pageUrl: "/blog", recommendation: "Broken links waste crawl budget and link equity", daysAgo: 18 }, + { title: "Optimize hero images for Core Web Vitals", category: "technical", priority: "high", effort: "low", status: "completed", pageUrl: "/pricing", recommendation: "LCP is 3.8s — compress images to get under 2.5s", daysAgo: 14 }, + { title: "Publish SEO pillar page: AI Tools Guide", category: "content", priority: "high", effort: "high", status: "completed", pageUrl: "/blog/ai-tools", recommendation: "Target 'AI SEO tools' — 6.8K monthly searches, low competition", daysAgo: 10 }, + { title: "Add FAQ schema to top 5 guides", category: "seo", priority: "medium", effort: "low", status: "in_progress", pageUrl: "/blog/seo-guide", recommendation: "FAQ schema increases AI citation probability by ~40%", daysAgo: 7 }, + { title: "Improve mobile speed on /products", category: "technical", priority: "high", effort: "medium", status: "in_progress", pageUrl: "/products", recommendation: "Mobile score 52/100 — defer JS and lazy-load images", daysAgo: 5 }, + { title: "Update GBP listing with new services", category: "gbp", priority: "medium", effort: "low", status: "todo", pageUrl: null, recommendation: "GBP listings with complete info get 7x more clicks", daysAgo: 3 }, + { title: "Create comparison page: meSEO vs RankBoost", category: "content", priority: "medium", effort: "high", status: "todo", pageUrl: "/vs-rankboost", recommendation: "Comparison pages capture 800-2000 visits/mo in your category", daysAgo: 2 }, + { title: "Optimize AI visibility for Perplexity", category: "llmo", priority: "high", effort: "medium", status: "todo", pageUrl: "/features", recommendation: "Competitor displaced you — publish competing technical guide", daysAgo: 1 }, + { title: "Fix HTTP mixed content on 4 pages", category: "technical", priority: "low", effort: "low", status: "todo", pageUrl: "/about", recommendation: "HTTPS pages with HTTP resources trigger security warnings", daysAgo: 0 }, + ]; + + const createdTasks: Record = {}; + + for (const t of tasks) { + const createdAt = new Date(); + createdAt.setDate(createdAt.getDate() - t.daysAgo); + + const task = await prisma.task.create({ + data: { + brandId: brand.id, + title: t.title, + category: t.category, + priority: t.priority, + effort: t.effort, + status: t.status, + pageUrl: t.pageUrl, + recommendation: t.recommendation, + completedAt: t.status === "completed" ? new Date(createdAt.getTime() + 3 * 86400000) : null, + dueDate: new Date(Date.now() + (t.status === "todo" ? 7 : 14) * 86400000), + createdAt, + }, + }); + + createdTasks[t.title] = task.id; + } + + console.log(` Created ${tasks.length} tasks for ${brand.name}`); + + // ── Page Launches (from completed tasks) ── + const launches = [ + { + taskTitle: "Add meta descriptions to 14 pages", + pageUrl: "/features", + pageType: "landing", + daysAgo: 18, + baseline: { sessions: 120, clicks: 80, impressions: 2400, position: 14.2, conversions: 3, revenue: 240 }, + snapshots: [ + { daysAgo: 14, sessions: 135, clicks: 95, impressions: 2800, position: 12.8, conversions: 4, revenue: 320 }, + { daysAgo: 7, sessions: 158, clicks: 118, impressions: 3200, position: 10.5, conversions: 6, revenue: 480 }, + { daysAgo: 0, sessions: 172, clicks: 132, impressions: 3600, position: 9.1, conversions: 7, revenue: 560 }, + ], + }, + { + taskTitle: "Fix 17 broken internal links", + pageUrl: "/blog", + pageType: "blog", + daysAgo: 15, + baseline: { sessions: 280, clicks: 160, impressions: 5200, position: 11.4, conversions: 5, revenue: 0 }, + snapshots: [ + { daysAgo: 10, sessions: 310, clicks: 185, impressions: 5800, position: 10.2, conversions: 6, revenue: 0 }, + { daysAgo: 3, sessions: 340, clicks: 210, impressions: 6400, position: 9.5, conversions: 8, revenue: 0 }, + { daysAgo: 0, sessions: 355, clicks: 225, impressions: 6800, position: 8.8, conversions: 9, revenue: 0 }, + ], + }, + { + taskTitle: "Publish SEO pillar page: AI Tools Guide", + pageUrl: "/blog/ai-tools", + pageType: "blog", + daysAgo: 7, + baseline: { sessions: 0, clicks: 0, impressions: 0, position: 0, conversions: 0, revenue: 0 }, + snapshots: [ + { daysAgo: 4, sessions: 45, clicks: 28, impressions: 820, position: 18.4, conversions: 1, revenue: 0 }, + { daysAgo: 0, sessions: 120, clicks: 78, impressions: 2200, position: 11.2, conversions: 3, revenue: 0 }, + ], + }, + ]; + + for (const l of launches) { + const taskId = createdTasks[l.taskTitle]; + const launchDate = new Date(); + launchDate.setDate(launchDate.getDate() - l.daysAgo); + + const launch = await prisma.pageLaunch.create({ + data: { + brandId: brand.id, + taskId, + pageUrl: l.pageUrl, + pageType: l.pageType, + launchDate, + notes: `Launched after completing: ${l.taskTitle}`, + baselineSessions: l.baseline.sessions, + baselineClicks: l.baseline.clicks, + baselineImpressions: l.baseline.impressions, + baselinePosition: l.baseline.position, + baselineConversions: l.baseline.conversions, + baselineRevenue: l.baseline.revenue, + }, + }); + + // Add snapshots + for (const s of l.snapshots) { + const snapshotDate = new Date(); + snapshotDate.setDate(snapshotDate.getDate() - s.daysAgo); + await prisma.pageLaunchSnapshot.create({ + data: { + pageLaunchId: launch.id, + date: snapshotDate, + sessions: s.sessions, + clicks: s.clicks, + impressions: s.impressions, + position: s.position, + conversions: s.conversions, + revenue: s.revenue, + }, + }); + } + } + + console.log(` Created ${launches.length} page launches with snapshots for ${brand.name}`); + } + + console.log("Tasks and page launches seeding complete!"); +} + +main() + .catch((e) => { console.error(e); process.exit(1); }) + .finally(() => prisma.$disconnect()); diff --git a/prisma/seed.ts b/prisma/seed.ts new file mode 100644 index 0000000..bbf253d --- /dev/null +++ b/prisma/seed.ts @@ -0,0 +1,165 @@ +import { PrismaClient } from "@prisma/client"; + +const prisma = new PrismaClient(); + +async function main() { + console.log("Seeding database..."); + + // Create test user (Clerk will sync real users, this is for dev) + const user = await prisma.user.upsert({ + where: { email: "demo@meseo.com" }, + update: {}, + create: { + id: "user_demo", + name: "Dylan Mazzei", + email: "demo@meseo.com", + }, + }); + console.log("Created user:", user.email); + + // Create organization + const org = await prisma.organization.upsert({ + where: { slug: "mazzei-agency" }, + update: {}, + create: { + name: "Mazzei Agency", + slug: "mazzei-agency", + plan: "pro", + }, + }); + console.log("Created org:", org.name); + + // Add user as owner + await prisma.orgMembership.upsert({ + where: { userId_orgId: { userId: user.id, orgId: org.id } }, + update: {}, + create: { userId: user.id, orgId: org.id, role: "owner" }, + }); + console.log("Added user as org owner"); + + // Create brands + const brands = [ + { + id: "acme-corp", + name: "Acme Corp", + domain: "acme.com", + industry: "Technology", + initials: "AC", + color: "bg-brand-500", + healthScore: 74, + websites: [{ url: "https://acme.com", isPrimary: true, pageCount: 1248 }], + dashboard: { seoScore: 74, aiVisibility: 12, crawlHealth: 94, monthlyTraffic: 8420, revenue: 24800, revenueChange: 14, alertCount: 7 }, + profile: { + companyName: "Acme Corp", + businessType: "SaaS", + services: ["SEO Auditing", "Technical SEO", "Content Strategy", "AI Visibility Tracking"], + locations: ["New York, NY", "San Francisco, CA"], + brandColors: ["#3b5cf0", "#1e293b", "#f8fafc"], + targetAudience: "Mid-market B2B SaaS companies", + description: "Project management and productivity platform for modern teams.", + }, + }, + { + id: "beacon-health", + name: "Beacon Health", + domain: "beaconhq.com", + industry: "Healthcare", + initials: "BH", + color: "bg-emerald-500", + healthScore: 82, + websites: [{ url: "https://beaconhq.com", isPrimary: true, pageCount: 890 }], + dashboard: { seoScore: 82, aiVisibility: 18, crawlHealth: 91, monthlyTraffic: 12300, revenue: 38200, revenueChange: 8, alertCount: 3 }, + profile: { + companyName: "Beacon Health", + businessType: "Healthcare", + services: ["Primary Care", "Telehealth", "Wellness Programs", "Health Coaching"], + locations: ["Boston, MA", "Providence, RI"], + brandColors: ["#10b981", "#064e3b", "#ecfdf5"], + targetAudience: "Health-conscious adults aged 25-55", + description: "Modern healthcare platform connecting patients with providers.", + }, + }, + { + id: "nova-digital", + name: "Nova Digital", + domain: "novadigital.io", + industry: "Technology", + initials: "ND", + color: "bg-violet-500", + healthScore: 61, + websites: [{ url: "https://novadigital.io", isPrimary: true, pageCount: 412 }], + dashboard: { seoScore: 61, aiVisibility: 5, crawlHealth: 78, monthlyTraffic: 3200, revenue: 8400, revenueChange: -3, alertCount: 12 }, + profile: { + companyName: "Nova Digital", + businessType: "Agency", + services: ["Web Design", "SEO", "PPC", "Social Media Marketing"], + locations: ["Austin, TX"], + brandColors: ["#8b5cf6", "#4c1d95", "#f5f3ff"], + targetAudience: "Small businesses looking for digital marketing services", + description: "Full-service digital marketing agency for growing businesses.", + }, + }, + ]; + + for (const b of brands) { + await prisma.brand.deleteMany({ where: { id: b.id } }); + + const brand = await prisma.brand.create({ + data: { + id: b.id, + name: b.name, + domain: b.domain, + industry: b.industry, + initials: b.initials, + color: b.color, + healthScore: b.healthScore, + orgId: org.id, + websites: { + create: b.websites.map((w) => ({ + url: w.url, + isPrimary: w.isPrimary, + pageCount: w.pageCount, + })), + }, + dashboardData: { + create: b.dashboard, + }, + profile: { + create: b.profile, + }, + }, + }); + + // Add default integrations per brand + const defaultIntegrations: Record = { + "acme-corp": ["gsc", "ga4", "chatgpt", "claude", "callrail", "stripe", "pagespeed", "lighthouse", "sheets"], + "beacon-health": ["gsc", "ga4", "gbp", "chatgpt", "claude", "callrail", "pagespeed", "lighthouse"], + "nova-digital": ["gsc", "ga4", "chatgpt"], + }; + + const brandIntegrations = defaultIntegrations[b.id] || []; + for (const integrationId of brandIntegrations) { + await prisma.brandIntegration.upsert({ + where: { brandId_integrationId: { brandId: brand.id, integrationId } }, + update: {}, + create: { + brandId: brand.id, + integrationId, + connected: true, + lastSynced: new Date(Date.now() - Math.random() * 86400000), + }, + }); + } + + console.log("Created brand:", brand.name, `with ${brandIntegrations.length} integrations`); + } + + console.log("Seeding complete!"); +} + +main() + .catch((e) => { + console.error(e); + process.exit(1); + }) + .finally(() => prisma.$disconnect()); diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png new file mode 100644 index 0000000..43c50b0 Binary files /dev/null and b/public/apple-touch-icon.png differ diff --git a/public/favicon.png b/public/favicon.png new file mode 100644 index 0000000..43c50b0 Binary files /dev/null and b/public/favicon.png differ diff --git a/public/icon-192.png b/public/icon-192.png new file mode 100644 index 0000000..43c50b0 Binary files /dev/null and b/public/icon-192.png differ diff --git a/public/icon-512.png b/public/icon-512.png new file mode 100644 index 0000000..43c50b0 Binary files /dev/null and b/public/icon-512.png differ diff --git a/public/images/meseo-logo-white.png b/public/images/meseo-logo-white.png new file mode 100644 index 0000000..43c50b0 Binary files /dev/null and b/public/images/meseo-logo-white.png differ diff --git a/public/meseo-logo-dark.png b/public/meseo-logo-dark.png new file mode 100644 index 0000000..328662b Binary files /dev/null and b/public/meseo-logo-dark.png differ diff --git a/public/meseo-logo.png b/public/meseo-logo.png new file mode 100644 index 0000000..43c50b0 Binary files /dev/null and b/public/meseo-logo.png differ diff --git a/public/sandbox-libs/babel.min.js b/public/sandbox-libs/babel.min.js new file mode 100644 index 0000000..d6b08e0 --- /dev/null +++ b/public/sandbox-libs/babel.min.js @@ -0,0 +1,2 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).Babel={})}(this,(function(e){"use strict";var t=Object.freeze({__proto__:null,get _call(){return hA},get _getQueueContexts(){return MA},get _resyncKey(){return AA},get _resyncList(){return kA},get _resyncParent(){return PA},get _resyncRemoved(){return CA},get call(){return mA},get isDenylisted(){return bA},get popContext(){return _A},get pushContext(){return IA},get requeue(){return NA},get requeueComputedKeyAndDecorators(){return BA},get resync(){return TA},get setContext(){return SA},get setKey(){return OA},get setScope(){return EA},get setup(){return DA},get skip(){return RA},get skipKey(){return jA},get stop(){return wA},get visit(){return xA}}),r=Object.freeze({__proto__:null,get DEFAULT_EXTENSIONS(){return TL},get File(){return Y_},get buildExternalHelpers(){return jI},get createConfigItem(){return RF},get createConfigItemAsync(){return vF},get createConfigItemSync(){return xF},get getEnv(){return BI},get loadOptions(){return hF},get loadOptionsAsync(){return yF},get loadOptionsSync(){return mF},get loadPartialConfig(){return pF},get loadPartialConfigAsync(){return lF},get loadPartialConfigSync(){return uF},get parse(){return xL},get parseAsync(){return jL},get parseSync(){return RL},get resolvePlugin(){return EL},get resolvePreset(){return SL},get template(){return Xm},get tokTypes(){return qy},get transform(){return cL},get transformAsync(){return uL},get transformFile(){return pL},get transformFileAsync(){return gL},get transformFileSync(){return fL},get transformFromAst(){return mL},get transformFromAstAsync(){return bL},get transformFromAstSync(){return hL},get transformSync(){return lL},get traverse(){return WA},get types(){return Mu},get version(){return wL}});function a(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,a=Array(t);r=e.length?{done:!0}:{done:!1,value:e[a++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function d(e){return d=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},d(e)}function c(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&f(e,t)}function l(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(l=function(){return!!e})()}function u(e,t){if(null==e)return{};var r={};for(var a in e)if({}.hasOwnProperty.call(e,a)){if(t.includes(a))continue;r[a]=e[a]}return r}function p(){p=function(){return t};var e,t={},r=Object.prototype,a=r.hasOwnProperty,n=Object.defineProperty||function(e,t,r){e[t]=r.value},s="function"==typeof Symbol?Symbol:{},o=s.iterator||"@@iterator",i=s.asyncIterator||"@@asyncIterator",d=s.toStringTag||"@@toStringTag";function c(e,t,r){return Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{c({},"")}catch(e){c=function(e,t,r){return e[t]=r}}function l(e,t,r,a){var s=t&&t.prototype instanceof b?t:b,o=Object.create(s.prototype),i=new _(a||[]);return n(o,"_invoke",{value:P(e,r,i)}),o}function u(e,t,r){try{return{type:"normal",arg:e.call(t,r)}}catch(e){return{type:"throw",arg:e}}}t.wrap=l;var f="suspendedStart",g="suspendedYield",y="executing",m="completed",h={};function b(){}function v(){}function x(){}var R={};c(R,o,(function(){return this}));var j=Object.getPrototypeOf,w=j&&j(j(I([])));w&&w!==r&&a.call(w,o)&&(R=w);var E=x.prototype=b.prototype=Object.create(R);function S(e){["next","throw","return"].forEach((function(t){c(e,t,(function(e){return this._invoke(t,e)}))}))}function T(e,t){function r(n,s,o,i){var d=u(e[n],e,s);if("throw"!==d.type){var c=d.arg,l=c.value;return l&&"object"==typeof l&&a.call(l,"__await")?t.resolve(l.__await).then((function(e){r("next",e,o,i)}),(function(e){r("throw",e,o,i)})):t.resolve(l).then((function(e){c.value=e,o(c)}),(function(e){return r("throw",e,o,i)}))}i(d.arg)}var s;n(this,"_invoke",{value:function(e,a){function n(){return new t((function(t,n){r(e,a,t,n)}))}return s=s?s.then(n,n):n()}})}function P(t,r,a){var n=f;return function(s,o){if(n===y)throw Error("Generator is already running");if(n===m){if("throw"===s)throw o;return{value:e,done:!0}}for(a.method=s,a.arg=o;;){var i=a.delegate;if(i){var d=A(i,a);if(d){if(d===h)continue;return d}}if("next"===a.method)a.sent=a._sent=a.arg;else if("throw"===a.method){if(n===f)throw n=m,a.arg;a.dispatchException(a.arg)}else"return"===a.method&&a.abrupt("return",a.arg);n=y;var c=u(t,r,a);if("normal"===c.type){if(n=a.done?m:g,c.arg===h)continue;return{value:c.arg,done:a.done}}"throw"===c.type&&(n=m,a.method="throw",a.arg=c.arg)}}}function A(t,r){var a=r.method,n=t.iterator[a];if(n===e)return r.delegate=null,"throw"===a&&t.iterator.return&&(r.method="return",r.arg=e,A(t,r),"throw"===r.method)||"return"!==a&&(r.method="throw",r.arg=new TypeError("The iterator does not provide a '"+a+"' method")),h;var s=u(n,t.iterator,r.arg);if("throw"===s.type)return r.method="throw",r.arg=s.arg,r.delegate=null,h;var o=s.arg;return o?o.done?(r[t.resultName]=o.value,r.next=t.nextLoc,"return"!==r.method&&(r.method="next",r.arg=e),r.delegate=null,h):o:(r.method="throw",r.arg=new TypeError("iterator result is not an object"),r.delegate=null,h)}function k(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function C(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function _(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(k,this),this.reset(!0)}function I(t){if(t||""===t){var r=t[o];if(r)return r.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var n=-1,s=function r(){for(;++n=0;--s){var o=this.tryEntries[s],i=o.completion;if("root"===o.tryLoc)return n("end");if(o.tryLoc<=this.prev){var d=a.call(o,"catchLoc"),c=a.call(o,"finallyLoc");if(d&&c){if(this.prev=0;--r){var n=this.tryEntries[r];if(n.tryLoc<=this.prev&&a.call(n,"finallyLoc")&&this.prev=0;--t){var r=this.tryEntries[t];if(r.finallyLoc===e)return this.complete(r.completion,r.afterLoc),C(r),h}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var r=this.tryEntries[t];if(r.tryLoc===e){var a=r.completion;if("throw"===a.type){var n=a.arg;C(r)}return n}}throw Error("illegal catch attempt")},delegateYield:function(t,r,a){return this.delegate={iterator:I(t),resultName:r,nextLoc:a},"next"===this.method&&(this.arg=e),h}},t}function f(e,t){return f=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},f(e,t)}function g(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var a,n,s,o,i=[],d=!0,c=!1;try{if(s=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;d=!1}else for(;!(d=(a=s.call(r)).done)&&(i.push(a.value),i.length!==t);d=!0);}catch(e){c=!0,n=e}finally{try{if(!d&&null!=r.return&&(o=r.return(),Object(o)!==o))return}finally{if(c)throw n}}return i}}(e,t)||b(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function y(e,t){return t||(t=e.slice(0)),e.raw=t,e}function m(e){return function(e){if(Array.isArray(e))return a(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||b(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function h(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var a=r.call(e,t);if("object"!=typeof a)return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e,"string");return"symbol"==typeof t?t:t+""}function b(e,t){if(e){if("string"==typeof e)return a(e,t);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?a(e,t):void 0}}function v(e){var t="function"==typeof Map?new Map:void 0;return v=function(e){if(null===e||!function(e){try{return-1!==Function.toString.call(e).indexOf("[native code]")}catch(t){return"function"==typeof e}}(e))return e;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,r)}function r(){return function(e,t,r){if(l())return Reflect.construct.apply(null,arguments);var a=[null];a.push.apply(a,t);var n=new(e.bind.apply(e,a));return r&&f(n,r.prototype),n}(e,arguments,d(this).constructor)}return r.prototype=Object.create(e.prototype,{constructor:{value:r,enumerable:!1,writable:!0,configurable:!0}}),f(r,e)},v(e)}var x="undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{};function R(){throw new Error("setTimeout has not been defined")}function j(){throw new Error("clearTimeout has not been defined")}var w=R,E=j;function S(e){if(w===setTimeout)return setTimeout(e,0);if((w===R||!w)&&setTimeout)return w=setTimeout,setTimeout(e,0);try{return w(e,0)}catch(t){try{return w.call(null,e,0)}catch(t){return w.call(this,e,0)}}}"function"==typeof x.setTimeout&&(w=setTimeout),"function"==typeof x.clearTimeout&&(E=clearTimeout);var T,P=[],A=!1,k=-1;function C(){A&&T&&(A=!1,T.length?P=T.concat(P):k=-1,P.length&&_())}function _(){if(!A){var e=S(C);A=!0;for(var t=P.length;t;){for(T=P,P=[];++k1)for(var r=1;rn.length)return!1;for(var o=0,i=s.length-1;oe)return!1;if((r+=t[a+1])>=e)return!0}return!1}function Br(e){return e<65?36===e:e<=90||(e<97?95===e:e<=122||(e<=65535?e>=170&&_r.test(String.fromCharCode(e)):Nr(e,Dr)))}function Mr(e){return e<48?36===e:e<58||!(e<65)&&(e<=90||(e<97?95===e:e<=122||(e<=65535?e>=170&&Ir.test(String.fromCharCode(e)):Nr(e,Dr)||Nr(e,Or))))}function Fr(e){for(var t=!0,r=0;r=48&&e<=57},$r={decBinOct:new Set([46,66,69,79,95,98,101,111]),hex:new Set([46,88,95,120])},Qr={bin:function(e){return 48===e||49===e},oct:function(e){return e>=48&&e<=55},dec:function(e){return e>=48&&e<=57},hex:function(e){return e>=48&&e<=57||e>=65&&e<=70||e>=97&&e<=102}};function Zr(e,t,r,a,n,s){for(var o=r,i=a,d=n,c="",l=null,u=r,p=t.length;;){if(r>=p){s.unterminated(o,i,d),c+=t.slice(u,r);break}var f=t.charCodeAt(r);if(ea(e,f,t,r)){c+=t.slice(u,r);break}if(92===f){c+=t.slice(u,r);var g=ta(t,r,a,n,"template"===e,s);null!==g.ch||l?c+=g.ch:l={pos:r,lineStart:a,curLine:n},r=g.pos,a=g.lineStart,n=g.curLine,u=r}else 8232===f||8233===f?(++n,a=++r):10===f||13===f?"template"===e?(c+=t.slice(u,r)+"\n",++r,13===f&&10===t.charCodeAt(r)&&++r,++n,u=a=r):s.unterminated(o,i,d):++r}return{pos:r,str:c,firstInvalidLoc:l,lineStart:a,curLine:n,containsInvalid:!!l}}function ea(e,t,r,a){return"template"===e?96===t||36===t&&123===r.charCodeAt(a+1):t===("double"===e?34:39)}function ta(e,t,r,a,n,s){var o=!n;t++;var i=function(e){return{pos:t,ch:e,lineStart:r,curLine:a}},d=e.charCodeAt(t++);switch(d){case 110:return i("\n");case 114:return i("\r");case 120:var c,l=ra(e,t,r,a,2,!1,o,s);return c=l.code,t=l.pos,i(null===c?null:String.fromCharCode(c));case 117:var u,p=na(e,t,r,a,o,s);return u=p.code,t=p.pos,i(null===u?null:String.fromCodePoint(u));case 116:return i("\t");case 98:return i("\b");case 118:return i("\v");case 102:return i("\f");case 13:10===e.charCodeAt(t)&&++t;case 10:r=t,++a;case 8232:case 8233:return i("");case 56:case 57:if(n)return i(null);s.strictNumericEscape(t-1,r,a);default:if(d>=48&&d<=55){var f=t-1,g=/^[0-7]+/.exec(e.slice(f,t+2))[0],y=parseInt(g,8);y>255&&(g=g.slice(0,-1),y=parseInt(g,8)),t+=g.length-1;var m=e.charCodeAt(t);if("0"!==g||56===m||57===m){if(n)return i(null);s.strictNumericEscape(f,r,a)}return i(String.fromCharCode(y))}return i(String.fromCharCode(d))}}function ra(e,t,r,a,n,s,o,i){var d,c=t,l=aa(e,t,r,a,16,n,s,!1,i,!o);return d=l.n,t=l.pos,null===d&&(o?i.invalidEscapeSequence(c,r,a):t=c-1),{code:d,pos:t}}function aa(e,t,r,a,n,s,o,i,d,c){for(var l=t,u=16===n?$r.hex:$r.decBinOct,p=16===n?Qr.hex:10===n?Qr.dec:8===n?Qr.oct:Qr.bin,f=!1,g=0,y=0,m=null==s?1/0:s;y=97?h-97+10:h>=65?h-65+10:Yr(h)?h-48:1/0)>=n){if(b<=9&&c)return{n:null,pos:t};if(b<=9&&d.invalidDigit(t,r,a,n))b=0;else{if(!o)break;b=0,f=!0}}++t,g=g*n+b}else{var v=e.charCodeAt(t-1),x=e.charCodeAt(t+1);if(i){if(Number.isNaN(x)||!p(x)||u.has(v)||u.has(x)){if(c)return{n:null,pos:t};d.unexpectedNumericSeparator(t,r,a)}}else{if(c)return{n:null,pos:t};d.numericSeparatorInEscapeSequence(t,r,a)}++t}}return t===l||null!=s&&t-l!==s||f?{n:null,pos:t}:{n:g,pos:t}}function na(e,t,r,a,n,s){var o;if(123===e.charCodeAt(t)){var i=ra(e,++t,r,a,e.indexOf("}",t)-t,!0,n,s);if(o=i.code,t=i.pos,++t,null!==o&&o>1114111){if(!n)return{code:null,pos:t};s.invalidCodePoint(t,r,a)}}else{var d=ra(e,t,r,a,4,!1,n,s);o=d.code,t=d.pos}return{code:o,pos:t}}var sa=["consequent","body","alternate"],oa=["leadingComments","trailingComments","innerComments"],ia=["||","&&","??"],da=["++","--"],ca=[">","<",">=","<="],la=["==","===","!=","!=="],ua=[].concat(la,["in","instanceof"]),pa=[].concat(m(ua),ca),fa=["-","/","%","*","**","&","|",">>",">>>","<<","^"],ga=["+"].concat(fa,m(pa),["|>"]),ya=["=","+="].concat(m(fa.map((function(e){return e+"="}))),m(ia.map((function(e){return e+"="})))),ma=["delete","!"],ha=["+","-","~"],ba=["typeof"],va=["void","throw"].concat(ma,ha,ba),xa={optional:["typeAnnotation","typeParameters","returnType"],force:["start","loc","end"]},Ra=Symbol.for("var used to be block scoped"),ja=Symbol.for("should not be considered a local binding"),wa={},Ea={},Sa={},Ta={},Pa={},Aa={},ka={};function Ca(e){return Array.isArray(e)?"array":null===e?"null":typeof e}function _a(e){return{validate:e}}function Ia(){return _a(Ua.apply(void 0,arguments))}function Da(e){return{validate:e,optional:!0}}function Oa(){return{validate:Ua.apply(void 0,arguments),optional:!0}}function Na(e){return Va(Wa("array"),Fa(e))}function Ba(){return Na(Ua.apply(void 0,arguments))}function Ma(){return _a(Ba.apply(void 0,arguments))}function Fa(e){var t=V.env.BABEL_TYPES_8_BREAKING?Vn:function(){};function r(r,a,n){if(Array.isArray(n))for(var s=0;s=2&&"type"in t[0]&&"array"===t[0].type&&!("each"in t[1]))throw new Error('An assertValueType("array") validator can only be followed by an assertEach(...) validator.');return a}var Ha,Ka,za,Ja=new Set(["aliases","builder","deprecatedAlias","fields","inherits","visitor","validate"]),Xa=new Set(["default","optional","deprecated","validate"]),Ya={};function $a(){for(var e=arguments.length,t=new Array(e),r=0;r0:c&&"object"==typeof c)throw new Error("field defaults can only be primitives or empty arrays currently");a[o]={default:Array.isArray(c)?[]:c,optional:d.optional,deprecated:d.deprecated,validate:d.validate}}for(var l=t.visitor||r.visitor||[],u=t.aliases||r.aliases||[],p=t.builder||r.builder||t.visitor||[],f=0,g=Object.keys(t);f+s+1)throw new TypeError("RestElement must be last element of "+n)}:void 0}),Za("ReturnStatement",{visitor:["argument"],aliases:["Statement","Terminatorless","CompletionStatement"],fields:{argument:{validate:Ua("Expression"),optional:!0}}}),Za("SequenceExpression",{visitor:["expressions"],fields:{expressions:Ma("Expression")},aliases:["Expression"]}),Za("ParenthesizedExpression",{visitor:["expression"],aliases:["Expression","ExpressionWrapper"],fields:{expression:{validate:Ua("Expression")}}}),Za("SwitchCase",{visitor:["test","consequent"],fields:{test:{validate:Ua("Expression"),optional:!0},consequent:Ma("Statement")}}),Za("SwitchStatement",{visitor:["discriminant","cases"],aliases:["Statement","BlockParent","Scopable"],fields:{discriminant:{validate:Ua("Expression")},cases:Ma("SwitchCase")}}),Za("ThisExpression",{aliases:["Expression"]}),Za("ThrowStatement",{visitor:["argument"],aliases:["Statement","Terminatorless","CompletionStatement"],fields:{argument:{validate:Ua("Expression")}}}),Za("TryStatement",{visitor:["block","handler","finalizer"],aliases:["Statement"],fields:{block:{validate:V.env.BABEL_TYPES_8_BREAKING?Va(Ua("BlockStatement"),Object.assign((function(e){if(!e.handler&&!e.finalizer)throw new TypeError("TryStatement expects either a handler or finalizer, or both")}),{oneOfNodeTypes:["BlockStatement"]})):Ua("BlockStatement")},handler:{optional:!0,validate:Ua("CatchClause")},finalizer:{optional:!0,validate:Ua("BlockStatement")}}}),Za("UnaryExpression",{builder:["operator","argument","prefix"],fields:{prefix:{default:!0},argument:{validate:Ua("Expression")},operator:{validate:La.apply(void 0,m(va))}},visitor:["argument"],aliases:["UnaryLike","Expression"]}),Za("UpdateExpression",{builder:["operator","argument","prefix"],fields:{prefix:{default:!1},argument:{validate:V.env.BABEL_TYPES_8_BREAKING?Ua("Identifier","MemberExpression"):Ua("Expression")},operator:{validate:La.apply(void 0,m(da))}},visitor:["argument"],aliases:["Expression"]}),Za("VariableDeclaration",{builder:["kind","declarations"],visitor:["declarations"],aliases:["Statement","Declaration"],fields:{declare:{validate:Wa("boolean"),optional:!0},kind:{validate:La("var","let","const","using","await using")},declarations:Ma("VariableDeclarator")},validate:V.env.BABEL_TYPES_8_BREAKING?(on=Ua("Identifier"),function(e,t,r){if(Ar("ForXStatement",e,{left:r})){if(1!==r.declarations.length)throw new TypeError("Exactly one VariableDeclarator is required in the VariableDeclaration of a "+e.type)}else r.declarations.forEach((function(e){e.init||on(e,"id",e.id)}))}):void 0}),Za("VariableDeclarator",{visitor:["id","init"],fields:{id:{validate:V.env.BABEL_TYPES_8_BREAKING?Ua("Identifier","ArrayPattern","ObjectPattern"):Ua("LVal")},definite:{optional:!0,validate:Wa("boolean")},init:{optional:!0,validate:Ua("Expression")}}}),Za("WhileStatement",{visitor:["test","body"],aliases:["Statement","BlockParent","Loop","While","Scopable"],fields:{test:{validate:Ua("Expression")},body:{validate:Ua("Statement")}}}),Za("WithStatement",{visitor:["object","body"],aliases:["Statement"],fields:{object:{validate:Ua("Expression")},body:{validate:Ua("Statement")}}}),Za("AssignmentPattern",{visitor:["left","right","decorators"],builder:["left","right"],aliases:["Pattern","PatternLike","LVal"],fields:Object.assign({},dn(),{left:{validate:Ua("Identifier","ObjectPattern","ArrayPattern","MemberExpression","TSAsExpression","TSSatisfiesExpression","TSTypeAssertion","TSNonNullExpression")},right:{validate:Ua("Expression")},decorators:{validate:Ba("Decorator"),optional:!0}})}),Za("ArrayPattern",{visitor:["elements","typeAnnotation"],builder:["elements"],aliases:["Pattern","PatternLike","LVal"],fields:Object.assign({},dn(),{elements:{validate:Va(Wa("array"),Fa(qa("null","PatternLike","LVal")))}})}),Za("ArrowFunctionExpression",{builder:["params","body","async"],visitor:["typeParameters","params","predicate","returnType","body"],aliases:["Scopable","Function","BlockParent","FunctionParent","Expression","Pureish"],fields:Object.assign({},en(),tn(),{expression:{validate:Wa("boolean")},body:{validate:Ua("BlockStatement","Expression")},predicate:{validate:Ua("DeclaredPredicate","InferredPredicate"),optional:!0}})}),Za("ClassBody",{visitor:["body"],fields:{body:Ma("ClassMethod","ClassPrivateMethod","ClassProperty","ClassPrivateProperty","ClassAccessorProperty","TSDeclareMethod","TSIndexSignature","StaticBlock")}}),Za("ClassExpression",{builder:["id","superClass","body","decorators"],visitor:["decorators","id","typeParameters","superClass","superTypeParameters","mixins","implements","body"],aliases:["Scopable","Class","Expression"],fields:(Ha={id:{validate:Ua("Identifier"),optional:!0},typeParameters:{validate:Ua("TypeParameterDeclaration","TSTypeParameterDeclaration","Noop"),optional:!0},body:{validate:Ua("ClassBody")},superClass:{optional:!0,validate:Ua("Expression")}},Ha.superTypeParameters={validate:Ua("TypeParameterInstantiation","TSTypeParameterInstantiation"),optional:!0},Ha.implements={validate:Ba("TSExpressionWithTypeArguments","ClassImplements"),optional:!0},Ha.decorators={validate:Ba("Decorator"),optional:!0},Ha.mixins={validate:Ua("InterfaceExtends"),optional:!0},Ha)}),Za("ClassDeclaration",{inherits:"ClassExpression",aliases:["Scopable","Class","Statement","Declaration"],fields:(Ka={id:{validate:Ua("Identifier"),optional:!0},typeParameters:{validate:Ua("TypeParameterDeclaration","TSTypeParameterDeclaration","Noop"),optional:!0},body:{validate:Ua("ClassBody")},superClass:{optional:!0,validate:Ua("Expression")}},Ka.superTypeParameters={validate:Ua("TypeParameterInstantiation","TSTypeParameterInstantiation"),optional:!0},Ka.implements={validate:Ba("TSExpressionWithTypeArguments","ClassImplements"),optional:!0},Ka.decorators={validate:Ba("Decorator"),optional:!0},Ka.mixins={validate:Ua("InterfaceExtends"),optional:!0},Ka.declare={validate:Wa("boolean"),optional:!0},Ka.abstract={validate:Wa("boolean"),optional:!0},Ka),validate:V.env.BABEL_TYPES_8_BREAKING?function(){var e=Ua("Identifier");return function(t,r,a){Ar("ExportDefaultDeclaration",t)||e(a,"id",a.id)}}():void 0});var cn,ln,un={attributes:{optional:!0,validate:Ba("ImportAttribute")},assertions:{deprecated:!0,optional:!0,validate:Ba("ImportAttribute")}};Za("ExportAllDeclaration",{builder:["source"],visitor:["source","attributes","assertions"],aliases:["Statement","Declaration","ImportOrExportDeclaration","ExportDeclaration"],fields:Object.assign({source:{validate:Ua("StringLiteral")},exportKind:Da(La("type","value"))},un)}),Za("ExportDefaultDeclaration",{visitor:["declaration"],aliases:["Statement","Declaration","ImportOrExportDeclaration","ExportDeclaration"],fields:{declaration:Ia("TSDeclareFunction","FunctionDeclaration","ClassDeclaration","Expression"),exportKind:Da(La("value"))}}),Za("ExportNamedDeclaration",{builder:["declaration","specifiers","source"],visitor:V.env?["declaration","specifiers","source","attributes"]:["declaration","specifiers","source","attributes","assertions"],aliases:["Statement","Declaration","ImportOrExportDeclaration","ExportDeclaration"],fields:Object.assign({declaration:{optional:!0,validate:V.env.BABEL_TYPES_8_BREAKING?Va(Ua("Declaration"),Object.assign((function(e,t,r){if(r&&e.specifiers.length)throw new TypeError("Only declaration or specifiers is allowed on ExportNamedDeclaration");if(r&&e.source)throw new TypeError("Cannot export a declaration from a source")}),{oneOfNodeTypes:["Declaration"]})):Ua("Declaration")}},un,{specifiers:{default:[],validate:Na((cn=Ua("ExportSpecifier","ExportDefaultSpecifier","ExportNamespaceSpecifier"),ln=Ua("ExportSpecifier"),V.env.BABEL_TYPES_8_BREAKING?Object.assign((function(e,t,r){(e.source?cn:ln)(e,t,r)}),{oneOfNodeTypes:["ExportSpecifier","ExportDefaultSpecifier","ExportNamespaceSpecifier"]}):cn))},source:{validate:Ua("StringLiteral"),optional:!0},exportKind:Da(La("type","value"))})}),Za("ExportSpecifier",{visitor:["local","exported"],aliases:["ModuleSpecifier"],fields:{local:{validate:Ua("Identifier")},exported:{validate:Ua("Identifier","StringLiteral")},exportKind:{validate:La("type","value"),optional:!0}}}),Za("ForOfStatement",{visitor:["left","right","body"],builder:["left","right","body","await"],aliases:["Scopable","Statement","For","BlockParent","Loop","ForXStatement"],fields:{left:{validate:function(){if(!V.env.BABEL_TYPES_8_BREAKING)return Ua("VariableDeclaration","LVal");var e=Ua("VariableDeclaration"),t=Ua("Identifier","MemberExpression","ArrayPattern","ObjectPattern","TSAsExpression","TSSatisfiesExpression","TSTypeAssertion","TSNonNullExpression");return Object.assign((function(r,a,n){Ar("VariableDeclaration",n)?e(r,a,n):t(r,a,n)}),{oneOfNodeTypes:["VariableDeclaration","Identifier","MemberExpression","ArrayPattern","ObjectPattern","TSAsExpression","TSSatisfiesExpression","TSTypeAssertion","TSNonNullExpression"]})}()},right:{validate:Ua("Expression")},body:{validate:Ua("Statement")},await:{default:!1}}}),Za("ImportDeclaration",{builder:["specifiers","source"],visitor:["specifiers","source","attributes","assertions"],aliases:["Statement","Declaration","ImportOrExportDeclaration"],fields:Object.assign({},un,{module:{optional:!0,validate:Wa("boolean")},phase:{default:null,validate:La("source","defer")},specifiers:Ma("ImportSpecifier","ImportDefaultSpecifier","ImportNamespaceSpecifier"),source:{validate:Ua("StringLiteral")},importKind:{validate:La("type","typeof","value"),optional:!0}})}),Za("ImportDefaultSpecifier",{visitor:["local"],aliases:["ModuleSpecifier"],fields:{local:{validate:Ua("Identifier")}}}),Za("ImportNamespaceSpecifier",{visitor:["local"],aliases:["ModuleSpecifier"],fields:{local:{validate:Ua("Identifier")}}}),Za("ImportSpecifier",{visitor:["imported","local"],builder:["local","imported"],aliases:["ModuleSpecifier"],fields:{local:{validate:Ua("Identifier")},imported:{validate:Ua("Identifier","StringLiteral")},importKind:{validate:La("type","typeof","value"),optional:!0}}}),Za("ImportExpression",{visitor:["source","options"],aliases:["Expression"],fields:{phase:{default:null,validate:La("source","defer")},source:{validate:Ua("Expression")},options:{validate:Ua("Expression"),optional:!0}}}),Za("MetaProperty",{visitor:["meta","property"],aliases:["Expression"],fields:{meta:{validate:V.env.BABEL_TYPES_8_BREAKING?Va(Ua("Identifier"),Object.assign((function(e,t,r){var a;switch(r.name){case"function":a="sent";break;case"new":a="target";break;case"import":a="meta"}if(!Ar("Identifier",e.property,{name:a}))throw new TypeError("Unrecognised MetaProperty")}),{oneOfNodeTypes:["Identifier"]})):Ua("Identifier")},property:{validate:Ua("Identifier")}}});var pn=function(){return{abstract:{validate:Wa("boolean"),optional:!0},accessibility:{validate:La("public","private","protected"),optional:!0},static:{default:!1},override:{default:!1},computed:{default:!1},optional:{validate:Wa("boolean"),optional:!0},key:{validate:Va(function(){var e=Ua("Identifier","StringLiteral","NumericLiteral","BigIntLiteral"),t=Ua("Expression");return function(r,a,n){(r.computed?t:e)(r,a,n)}}(),Ua("Identifier","StringLiteral","NumericLiteral","BigIntLiteral","Expression"))}}},fn=function(){return Object.assign({},en(),pn(),{params:Ma("Identifier","Pattern","RestElement","TSParameterProperty"),kind:{validate:La("get","set","method","constructor"),default:"method"},access:{validate:Va(Wa("string"),La("public","private","protected")),optional:!0},decorators:{validate:Ba("Decorator"),optional:!0}})};Za("ClassMethod",{aliases:["Function","Scopable","BlockParent","FunctionParent","Method"],builder:["kind","key","params","body","computed","static","generator","async"],visitor:["decorators","key","typeParameters","params","returnType","body"],fields:Object.assign({},fn(),tn(),{body:{validate:Ua("BlockStatement")}})}),Za("ObjectPattern",{visitor:["properties","typeAnnotation","decorators"],builder:["properties"],aliases:["Pattern","PatternLike","LVal"],fields:Object.assign({},dn(),{properties:Ma("RestElement","ObjectProperty")})}),Za("SpreadElement",{visitor:["argument"],aliases:["UnaryLike"],deprecatedAlias:"SpreadProperty",fields:{argument:{validate:Ua("Expression")}}}),Za("Super",{aliases:["Expression"]}),Za("TaggedTemplateExpression",{visitor:["tag","typeParameters","quasi"],builder:["tag","quasi"],aliases:["Expression"],fields:(za={tag:{validate:Ua("Expression")},quasi:{validate:Ua("TemplateLiteral")}},za.typeParameters={validate:Ua("TypeParameterInstantiation","TSTypeParameterInstantiation"),optional:!0},za)}),Za("TemplateElement",{builder:["value","tail"],fields:{value:{validate:Va(function(e){function t(t,r,a){for(var n=[],s=0,o=Object.keys(e);s=Number.MAX_SAFE_INTEGER?mu.uid=0:mu.uid++};var bu=Function.call.bind(Object.prototype.toString);function vu(e){if(void 0===e)return gs("undefined");if(!0===e||!1===e)return xs(e);if(null===e)return{type:"NullLiteral"};if("string"==typeof e)return hs(e);if("number"==typeof e){var t;if(Number.isFinite(e))t=bs(Math.abs(e));else t=Xn("/",Number.isNaN(e)?bs(0):bs(1),bs(0));return(e<0||Object.is(e,-0))&&(t=Fs("-",t)),t}if(function(e){return"[object RegExp]"===bu(e)}(e))return Rs(e.source,/\/([a-z]*)$/.exec(e.toString())[1]);if(Array.isArray(e))return zn(e.map(vu));if(function(e){if("object"!=typeof e||null===e||"[object Object]"!==Object.prototype.toString.call(e))return!1;var t=Object.getPrototypeOf(e);return null===t||null===Object.getPrototypeOf(t)}(e)){for(var r=[],a=0,n=Object.keys(e);a1?e:e[0]})),qu=Lu((function(e){return e})),Wu=Lu((function(e){if(0===e.length)throw new Error("Found nothing to return.");if(e.length>1)throw new Error("Found multiple statements but wanted one");return e[0]})),Gu={code:function(e){return"(\n"+e+"\n)"},validate:function(e){if(e.program.body.length>1)throw new Error("Found multiple statements but wanted one");if(0===Gu.unwrap(e).start)throw new Error("Parse result included parens.")},unwrap:function(e){var t=g(e.program.body,1)[0];return Fu(t),t.expression}},Vu=["placeholderWhitelist","placeholderPattern","preserveComments","syntacticPlaceholders"];function Hu(e,t){var r=t.placeholderWhitelist,a=void 0===r?e.placeholderWhitelist:r,n=t.placeholderPattern,s=void 0===n?e.placeholderPattern:n,o=t.preserveComments,i=void 0===o?e.preserveComments:o,d=t.syntacticPlaceholders,c=void 0===d?e.syntacticPlaceholders:d;return{parser:Object.assign({},e.parser,t.parser),placeholderWhitelist:a,placeholderPattern:s,preserveComments:i,syntacticPlaceholders:c}}function Ku(e){if(null!=e&&"object"!=typeof e)throw new Error("Unknown template options.");var t=e||{},r=t.placeholderWhitelist,a=t.placeholderPattern,n=t.preserveComments,s=t.syntacticPlaceholders,o=u(t,Vu);if(null!=r&&!(r instanceof Set))throw new Error("'.placeholderWhitelist' must be a Set, null, or undefined");if(null!=a&&!(a instanceof RegExp)&&!1!==a)throw new Error("'.placeholderPattern' must be a RegExp, false, null, or undefined");if(null!=n&&"boolean"!=typeof n)throw new Error("'.preserveComments' must be a boolean, null, or undefined");if(null!=s&&"boolean"!=typeof s)throw new Error("'.syntacticPlaceholders' must be a boolean, null, or undefined");if(!0===s&&(null!=r||null!=a))throw new Error("'.placeholderWhitelist' and '.placeholderPattern' aren't compatible with '.syntacticPlaceholders: true'");return{parser:o,placeholderWhitelist:r||void 0,placeholderPattern:null==a?void 0:a,preserveComments:null==n?void 0:n,syntacticPlaceholders:null==s?void 0:s}}function zu(e){if(Array.isArray(e))return e.reduce((function(e,t,r){return e["$"+r]=t,e}),{});if("object"==typeof e||null==e)return e||void 0;throw new Error("Template replacements must be an array, object, null, or undefined")}var Ju=o((function(e,t,r){this.line=void 0,this.column=void 0,this.index=void 0,this.line=e,this.column=t,this.index=r})),Xu=o((function(e,t){this.start=void 0,this.end=void 0,this.filename=void 0,this.identifierName=void 0,this.start=e,this.end=t}));function Yu(e,t){var r=e.line,a=e.column,n=e.index;return new Ju(r,a+t,n+t)}var $u,Qu="BABEL_PARSER_SOURCETYPE_MODULE_REQUIRED",Zu={ImportMetaOutsideModule:{message:"import.meta may appear only with 'sourceType: \"module\"'",code:Qu},ImportOutsideModule:{message:"'import' and 'export' may appear only with 'sourceType: \"module\"'",code:Qu}},ep={ArrayPattern:"array destructuring pattern",AssignmentExpression:"assignment expression",AssignmentPattern:"assignment expression",ArrowFunctionExpression:"arrow function expression",ConditionalExpression:"conditional expression",CatchClause:"catch clause",ForOfStatement:"for-of statement",ForInStatement:"for-in statement",ForStatement:"for-loop",FormalParameters:"function parameter list",Identifier:"identifier",ImportSpecifier:"import specifier",ImportDefaultSpecifier:"import default specifier",ImportNamespaceSpecifier:"import namespace specifier",ObjectPattern:"object destructuring pattern",ParenthesizedExpression:"parenthesized expression",RestElement:"rest element",UpdateExpression:{true:"prefix operation",false:"postfix operation"},VariableDeclarator:"variable declaration",YieldExpression:"yield expression"},tp=function(e){return"UpdateExpression"===e.type?ep.UpdateExpression[""+e.prefix]:ep[e.type]},rp={AccessorIsGenerator:function(e){return"A "+e.kind+"ter cannot be a generator."},ArgumentsInClass:"'arguments' is only allowed in functions and class methods.",AsyncFunctionInSingleStatementContext:"Async functions can only be declared at the top level or inside a block.",AwaitBindingIdentifier:"Can not use 'await' as identifier inside an async function.",AwaitBindingIdentifierInStaticBlock:"Can not use 'await' as identifier inside a static block.",AwaitExpressionFormalParameter:"'await' is not allowed in async function parameters.",AwaitUsingNotInAsyncContext:"'await using' is only allowed within async functions and at the top levels of modules.",AwaitNotInAsyncContext:"'await' is only allowed within async functions and at the top levels of modules.",AwaitNotInAsyncFunction:"'await' is only allowed within async functions.",BadGetterArity:"A 'get' accessor must not have any formal parameters.",BadSetterArity:"A 'set' accessor must have exactly one formal parameter.",BadSetterRestParameter:"A 'set' accessor function argument must not be a rest parameter.",ConstructorClassField:"Classes may not have a field named 'constructor'.",ConstructorClassPrivateField:"Classes may not have a private field named '#constructor'.",ConstructorIsAccessor:"Class constructor may not be an accessor.",ConstructorIsAsync:"Constructor can't be an async function.",ConstructorIsGenerator:"Constructor can't be a generator.",DeclarationMissingInitializer:function(e){return"Missing initializer in "+e.kind+" declaration."},DecoratorArgumentsOutsideParentheses:"Decorator arguments must be moved inside parentheses: use '@(decorator(args))' instead of '@(decorator)(args)'.",DecoratorBeforeExport:"Decorators must be placed *before* the 'export' keyword. Remove the 'decoratorsBeforeExport: true' option to use the 'export @decorator class {}' syntax.",DecoratorsBeforeAfterExport:"Decorators can be placed *either* before or after the 'export' keyword, but not in both locations at the same time.",DecoratorConstructor:"Decorators can't be used with a constructor. Did you mean '@dec class { ... }'?",DecoratorExportClass:"Decorators must be placed *after* the 'export' keyword. Remove the 'decoratorsBeforeExport: false' option to use the '@decorator export class {}' syntax.",DecoratorSemicolon:"Decorators must not be followed by a semicolon.",DecoratorStaticBlock:"Decorators can't be used with a static block.",DeferImportRequiresNamespace:'Only `import defer * as x from "./module"` is valid.',DeletePrivateField:"Deleting a private field is not allowed.",DestructureNamedImport:"ES2015 named imports do not destructure. Use another statement for destructuring after the import.",DuplicateConstructor:"Duplicate constructor in the same class.",DuplicateDefaultExport:"Only one default export allowed per module.",DuplicateExport:function(e){return"`"+e.exportName+"` has already been exported. Exported identifiers must be unique."},DuplicateProto:"Redefinition of __proto__ property.",DuplicateRegExpFlags:"Duplicate regular expression flag.",DynamicImportPhaseRequiresImportExpressions:function(e){return"'import."+e.phase+"(...)' can only be parsed when using the 'createImportExpressions' option."},ElementAfterRest:"Rest element must be last element.",EscapedCharNotAnIdentifier:"Invalid Unicode escape.",ExportBindingIsString:function(e){return"A string literal cannot be used as an exported binding without `from`.\n- Did you mean `export { '"+e.localName+"' as '"+e.exportName+"' } from 'some-module'`?"},ExportDefaultFromAsIdentifier:"'from' is not allowed as an identifier after 'export default'.",ForInOfLoopInitializer:function(e){return"'"+("ForInStatement"===e.type?"for-in":"for-of")+"' loop variable declaration may not have an initializer."},ForInUsing:"For-in loop may not start with 'using' declaration.",ForOfAsync:"The left-hand side of a for-of loop may not be 'async'.",ForOfLet:"The left-hand side of a for-of loop may not start with 'let'.",GeneratorInSingleStatementContext:"Generators can only be declared at the top level or inside a block.",IllegalBreakContinue:function(e){return"Unsyntactic "+("BreakStatement"===e.type?"break":"continue")+"."},IllegalLanguageModeDirective:"Illegal 'use strict' directive in function with non-simple parameter list.",IllegalReturn:"'return' outside of function.",ImportAttributesUseAssert:"The `assert` keyword in import attributes is deprecated and it has been replaced by the `with` keyword. You can enable the `deprecatedImportAssert` parser plugin to suppress this error.",ImportBindingIsString:function(e){return'A string literal cannot be used as an imported binding.\n- Did you mean `import { "'+e.importName+'" as foo }`?'},ImportCallArity:"`import()` requires exactly one or two arguments.",ImportCallNotNewExpression:"Cannot use new with import(...).",ImportCallSpreadArgument:"`...` is not allowed in `import()`.",ImportJSONBindingNotDefault:"A JSON module can only be imported with `default`.",ImportReflectionHasAssertion:"`import module x` cannot have assertions.",ImportReflectionNotBinding:'Only `import module x from "./module"` is valid.',IncompatibleRegExpUVFlags:"The 'u' and 'v' regular expression flags cannot be enabled at the same time.",InvalidBigIntLiteral:"Invalid BigIntLiteral.",InvalidCodePoint:"Code point out of bounds.",InvalidCoverInitializedName:"Invalid shorthand property initializer.",InvalidDecimal:"Invalid decimal.",InvalidDigit:function(e){return"Expected number in radix "+e.radix+"."},InvalidEscapeSequence:"Bad character escape sequence.",InvalidEscapeSequenceTemplate:"Invalid escape sequence in template.",InvalidEscapedReservedWord:function(e){return"Escape sequence in keyword "+e.reservedWord+"."},InvalidIdentifier:function(e){return"Invalid identifier "+e.identifierName+"."},InvalidLhs:function(e){var t=e.ancestor;return"Invalid left-hand side in "+tp(t)+"."},InvalidLhsBinding:function(e){var t=e.ancestor;return"Binding invalid left-hand side in "+tp(t)+"."},InvalidLhsOptionalChaining:function(e){var t=e.ancestor;return"Invalid optional chaining in the left-hand side of "+tp(t)+"."},InvalidNumber:"Invalid number.",InvalidOrMissingExponent:"Floating-point numbers require a valid exponent after the 'e'.",InvalidOrUnexpectedToken:function(e){return"Unexpected character '"+e.unexpected+"'."},InvalidParenthesizedAssignment:"Invalid parenthesized assignment pattern.",InvalidPrivateFieldResolution:function(e){return"Private name #"+e.identifierName+" is not defined."},InvalidPropertyBindingPattern:"Binding member expression.",InvalidRecordProperty:"Only properties and spread elements are allowed in record definitions.",InvalidRestAssignmentPattern:"Invalid rest operator's argument.",LabelRedeclaration:function(e){return"Label '"+e.labelName+"' is already declared."},LetInLexicalBinding:"'let' is disallowed as a lexically bound name.",LineTerminatorBeforeArrow:"No line break is allowed before '=>'.",MalformedRegExpFlags:"Invalid regular expression flag.",MissingClassName:"A class name is required.",MissingEqInAssignment:"Only '=' operator can be used for specifying default value.",MissingSemicolon:"Missing semicolon.",MissingPlugin:function(e){return"This experimental syntax requires enabling the parser plugin: "+e.missingPlugin.map((function(e){return JSON.stringify(e)})).join(", ")+"."},MissingOneOfPlugins:function(e){return"This experimental syntax requires enabling one of the following parser plugin(s): "+e.missingPlugin.map((function(e){return JSON.stringify(e)})).join(", ")+"."},MissingUnicodeEscape:"Expecting Unicode escape sequence \\uXXXX.",MixingCoalesceWithLogical:"Nullish coalescing operator(??) requires parens when mixing with logical operators.",ModuleAttributeDifferentFromType:"The only accepted module attribute is `type`.",ModuleAttributeInvalidValue:"Only string literals are allowed as module attribute values.",ModuleAttributesWithDuplicateKeys:function(e){return'Duplicate key "'+e.key+'" is not allowed in module attributes.'},ModuleExportNameHasLoneSurrogate:function(e){return"An export name cannot include a lone surrogate, found '\\u"+e.surrogateCharCode.toString(16)+"'."},ModuleExportUndefined:function(e){return"Export '"+e.localName+"' is not defined."},MultipleDefaultsInSwitch:"Multiple default clauses.",NewlineAfterThrow:"Illegal newline after throw.",NoCatchOrFinally:"Missing catch or finally clause.",NumberIdentifier:"Identifier directly after number.",NumericSeparatorInEscapeSequence:"Numeric separators are not allowed inside unicode escape sequences or hex escape sequences.",ObsoleteAwaitStar:"'await*' has been removed from the async functions proposal. Use Promise.all() instead.",OptionalChainingNoNew:"Constructors in/after an Optional Chain are not allowed.",OptionalChainingNoTemplate:"Tagged Template Literals are not allowed in optionalChain.",OverrideOnConstructor:"'override' modifier cannot appear on a constructor declaration.",ParamDupe:"Argument name clash.",PatternHasAccessor:"Object pattern can't contain getter or setter.",PatternHasMethod:"Object pattern can't contain methods.",PrivateInExpectedIn:function(e){var t=e.identifierName;return"Private names are only allowed in property accesses (`obj.#"+t+"`) or in `in` expressions (`#"+t+" in obj`)."},PrivateNameRedeclaration:function(e){return"Duplicate private name #"+e.identifierName+"."},RecordExpressionBarIncorrectEndSyntaxType:"Record expressions ending with '|}' are only allowed when the 'syntaxType' option of the 'recordAndTuple' plugin is set to 'bar'.",RecordExpressionBarIncorrectStartSyntaxType:"Record expressions starting with '{|' are only allowed when the 'syntaxType' option of the 'recordAndTuple' plugin is set to 'bar'.",RecordExpressionHashIncorrectStartSyntaxType:"Record expressions starting with '#{' are only allowed when the 'syntaxType' option of the 'recordAndTuple' plugin is set to 'hash'.",RecordNoProto:"'__proto__' is not allowed in Record expressions.",RestTrailingComma:"Unexpected trailing comma after rest element.",SloppyFunction:"In non-strict mode code, functions can only be declared at top level or inside a block.",SloppyFunctionAnnexB:"In non-strict mode code, functions can only be declared at top level, inside a block, or as the body of an if statement.",SourcePhaseImportRequiresDefault:'Only `import source x from "./module"` is valid.',StaticPrototype:"Classes may not have static property named prototype.",SuperNotAllowed:"`super()` is only valid inside a class constructor of a subclass. Maybe a typo in the method name ('constructor') or not extending another class?",SuperPrivateField:"Private fields can't be accessed on super.",TrailingDecorator:"Decorators must be attached to a class element.",TupleExpressionBarIncorrectEndSyntaxType:"Tuple expressions ending with '|]' are only allowed when the 'syntaxType' option of the 'recordAndTuple' plugin is set to 'bar'.",TupleExpressionBarIncorrectStartSyntaxType:"Tuple expressions starting with '[|' are only allowed when the 'syntaxType' option of the 'recordAndTuple' plugin is set to 'bar'.",TupleExpressionHashIncorrectStartSyntaxType:"Tuple expressions starting with '#[' are only allowed when the 'syntaxType' option of the 'recordAndTuple' plugin is set to 'hash'.",UnexpectedArgumentPlaceholder:"Unexpected argument placeholder.",UnexpectedAwaitAfterPipelineBody:'Unexpected "await" after pipeline body; await must have parentheses in minimal proposal.',UnexpectedDigitAfterHash:"Unexpected digit after hash token.",UnexpectedImportExport:"'import' and 'export' may only appear at the top level.",UnexpectedKeyword:function(e){return"Unexpected keyword '"+e.keyword+"'."},UnexpectedLeadingDecorator:"Leading decorators must be attached to a class declaration.",UnexpectedLexicalDeclaration:"Lexical declaration cannot appear in a single-statement context.",UnexpectedNewTarget:"`new.target` can only be used in functions or class properties.",UnexpectedNumericSeparator:"A numeric separator is only allowed between two digits.",UnexpectedPrivateField:"Unexpected private name.",UnexpectedReservedWord:function(e){return"Unexpected reserved word '"+e.reservedWord+"'."},UnexpectedSuper:"'super' is only allowed in object methods and classes.",UnexpectedToken:function(e){var t=e.expected,r=e.unexpected;return"Unexpected token"+(r?" '"+r+"'.":"")+(t?', expected "'+t+'"':"")},UnexpectedTokenUnaryExponentiation:"Illegal expression. Wrap left hand side or entire exponentiation in parentheses.",UnexpectedUsingDeclaration:"Using declaration cannot appear in the top level when source type is `script`.",UnsupportedBind:"Binding should be performed on object property.",UnsupportedDecoratorExport:"A decorated export must export a class declaration.",UnsupportedDefaultExport:"Only expressions, functions or classes are allowed as the `default` export.",UnsupportedImport:"`import` can only be used in `import()` or `import.meta`.",UnsupportedMetaProperty:function(e){var t=e.target;return"The only valid meta property for "+t+" is "+t+"."+e.onlyValidPropertyName+"."},UnsupportedParameterDecorator:"Decorators cannot be used to decorate parameters.",UnsupportedPropertyDecorator:"Decorators cannot be used to decorate object literal properties.",UnsupportedSuper:"'super' can only be used with function calls (i.e. super()) or in property accesses (i.e. super.prop or super[prop]).",UnterminatedComment:"Unterminated comment.",UnterminatedRegExp:"Unterminated regular expression.",UnterminatedString:"Unterminated string constant.",UnterminatedTemplate:"Unterminated template.",UsingDeclarationExport:"Using declaration cannot be exported.",UsingDeclarationHasBindingPattern:"Using declaration cannot have destructuring patterns.",VarRedeclaration:function(e){return"Identifier '"+e.identifierName+"' has already been declared."},YieldBindingIdentifier:"Can not use 'yield' as identifier inside a generator.",YieldInParameter:"Yield expression is not allowed in formal parameters.",ZeroDigitNumericSeparator:"Numeric separator can not be used after leading 0."},ap=new Set(["ArrowFunctionExpression","AssignmentExpression","ConditionalExpression","YieldExpression"]),np=Object.assign({PipeBodyIsTighter:"Unexpected yield after pipeline body; any yield expression acting as Hack-style pipe body must be parenthesized due to its loose operator precedence.",PipeTopicRequiresHackPipes:'Topic reference is used, but the pipelineOperator plugin was not passed a "proposal": "hack" or "smart" option.',PipeTopicUnbound:"Topic reference is unbound; it must be inside a pipe body.",PipeTopicUnconfiguredToken:function(e){var t=e.token;return"Invalid topic token "+t+". In order to use "+t+' as a topic reference, the pipelineOperator plugin must be configured with { "proposal": "hack", "topicToken": "'+t+'" }.'},PipeTopicUnused:"Hack-style pipe body does not contain a topic reference; Hack-style pipes must use topic at least once.",PipeUnparenthesizedBody:function(e){var t=e.type;return"Hack-style pipe body cannot be an unparenthesized "+tp({type:t})+"; please wrap it in parentheses."}},{PipelineBodyNoArrow:'Unexpected arrow "=>" after pipeline body; arrow function in pipeline body must be parenthesized.',PipelineBodySequenceExpression:"Pipeline body may not be a comma-separated sequence expression.",PipelineHeadSequenceExpression:"Pipeline head should not be a comma-separated sequence expression.",PipelineTopicUnused:"Pipeline is in topic style but does not use topic reference.",PrimaryTopicNotAllowed:"Topic reference was used in a lexical context without topic binding.",PrimaryTopicRequiresSmartPipeline:'Topic reference is used, but the pipelineOperator plugin was not passed a "proposal": "hack" or "smart" option.'}),sp=["message"];function op(e,t,r){Object.defineProperty(e,t,{enumerable:!1,configurable:!0,value:r})}function ip(e,t){if(Array.isArray(e))return function(t){return ip(t,e[0])};for(var r={},a=function(){var a=s[n],o=e[a],i="string"==typeof o?{message:function(){return o}}:"function"==typeof o?{message:o}:o,d=i.message,c=u(i,sp),l="string"==typeof d?function(){return d}:d;r[a]=function(e){var t=e.toMessage,r=e.code,a=e.reasonCode,n=e.syntaxPlugin,s="MissingPlugin"===a||"MissingOneOfPlugins"===a,o={AccessorCannotDeclareThisParameter:"AccesorCannotDeclareThisParameter",AccessorCannotHaveTypeParameters:"AccesorCannotHaveTypeParameters",ConstInitializerMustBeStringOrNumericLiteralOrLiteralEnumReference:"ConstInitiailizerMustBeStringOrNumericLiteralOrLiteralEnumReference",SetAccessorCannotHaveOptionalParameter:"SetAccesorCannotHaveOptionalParameter",SetAccessorCannotHaveRestParameter:"SetAccesorCannotHaveRestParameter",SetAccessorCannotHaveReturnType:"SetAccesorCannotHaveReturnType"};return o[a]&&(a=o[a]),function e(o,i){var d=new SyntaxError;return d.code=r,d.reasonCode=a,d.loc=o,d.pos=o.index,d.syntaxPlugin=n,s&&(d.missingPlugin=i.missingPlugin),op(d,"clone",(function(t){var r;void 0===t&&(t={});var a=null!=(r=t.loc)?r:o,n=a.line,s=a.column,d=a.index;return e(new Ju(n,s,d),Object.assign({},i,t.details))})),op(d,"details",i),Object.defineProperty(d,"message",{configurable:!0,get:function(){var e=t(i)+" ("+o.line+":"+o.column+")";return this.message=e,e},set:function(e){Object.defineProperty(this,"message",{value:e,writable:!0})}}),d}}(Object.assign({code:"BABEL_PARSER_SYNTAX_ERROR",reasonCode:a,toMessage:l},t?{syntaxPlugin:t}:{},c))},n=0,s=Object.keys(e);n...",!0)};Tp.template=new Sp("`",!0);var Pp=!0,Ap=!0,kp=!0,Cp=!0,_p=!0,Ip=o((function(e,t){void 0===t&&(t={}),this.label=void 0,this.keyword=void 0,this.beforeExpr=void 0,this.startsExpr=void 0,this.rightAssociative=void 0,this.isLoop=void 0,this.isAssign=void 0,this.prefix=void 0,this.postfix=void 0,this.binop=void 0,this.label=e,this.keyword=t.keyword,this.beforeExpr=!!t.beforeExpr,this.startsExpr=!!t.startsExpr,this.rightAssociative=!!t.rightAssociative,this.isLoop=!!t.isLoop,this.isAssign=!!t.isAssign,this.prefix=!!t.prefix,this.postfix=!!t.postfix,this.binop=null!=t.binop?t.binop:null,this.updateContext=null})),Dp=new Map;function Op(e,t){void 0===t&&(t={}),t.keyword=e;var r=Gp(e,t);return Dp.set(e,r),r}function Np(e,t){return Gp(e,{beforeExpr:Pp,binop:t})}var Bp=-1,Mp=[],Fp=[],Lp=[],Up=[],qp=[],Wp=[];function Gp(e,t){var r,a,n,s;return void 0===t&&(t={}),++Bp,Fp.push(e),Lp.push(null!=(r=t.binop)?r:-1),Up.push(null!=(a=t.beforeExpr)&&a),qp.push(null!=(n=t.startsExpr)&&n),Wp.push(null!=(s=t.prefix)&&s),Mp.push(new Ip(e,t)),Bp}function Vp(e,t){var r,a,n,s;return void 0===t&&(t={}),++Bp,Dp.set(e,Bp),Fp.push(e),Lp.push(null!=(r=t.binop)?r:-1),Up.push(null!=(a=t.beforeExpr)&&a),qp.push(null!=(n=t.startsExpr)&&n),Wp.push(null!=(s=t.prefix)&&s),Mp.push(new Ip("name",t)),Bp}var Hp={bracketL:Gp("[",{beforeExpr:Pp,startsExpr:Ap}),bracketHashL:Gp("#[",{beforeExpr:Pp,startsExpr:Ap}),bracketBarL:Gp("[|",{beforeExpr:Pp,startsExpr:Ap}),bracketR:Gp("]"),bracketBarR:Gp("|]"),braceL:Gp("{",{beforeExpr:Pp,startsExpr:Ap}),braceBarL:Gp("{|",{beforeExpr:Pp,startsExpr:Ap}),braceHashL:Gp("#{",{beforeExpr:Pp,startsExpr:Ap}),braceR:Gp("}"),braceBarR:Gp("|}"),parenL:Gp("(",{beforeExpr:Pp,startsExpr:Ap}),parenR:Gp(")"),comma:Gp(",",{beforeExpr:Pp}),semi:Gp(";",{beforeExpr:Pp}),colon:Gp(":",{beforeExpr:Pp}),doubleColon:Gp("::",{beforeExpr:Pp}),dot:Gp("."),question:Gp("?",{beforeExpr:Pp}),questionDot:Gp("?."),arrow:Gp("=>",{beforeExpr:Pp}),template:Gp("template"),ellipsis:Gp("...",{beforeExpr:Pp}),backQuote:Gp("`",{startsExpr:Ap}),dollarBraceL:Gp("${",{beforeExpr:Pp,startsExpr:Ap}),templateTail:Gp("...`",{startsExpr:Ap}),templateNonTail:Gp("...${",{beforeExpr:Pp,startsExpr:Ap}),at:Gp("@"),hash:Gp("#",{startsExpr:Ap}),interpreterDirective:Gp("#!..."),eq:Gp("=",{beforeExpr:Pp,isAssign:Cp}),assign:Gp("_=",{beforeExpr:Pp,isAssign:Cp}),slashAssign:Gp("_=",{beforeExpr:Pp,isAssign:Cp}),xorAssign:Gp("_=",{beforeExpr:Pp,isAssign:Cp}),moduloAssign:Gp("_=",{beforeExpr:Pp,isAssign:Cp}),incDec:Gp("++/--",{prefix:_p,postfix:!0,startsExpr:Ap}),bang:Gp("!",{beforeExpr:Pp,prefix:_p,startsExpr:Ap}),tilde:Gp("~",{beforeExpr:Pp,prefix:_p,startsExpr:Ap}),doubleCaret:Gp("^^",{startsExpr:Ap}),doubleAt:Gp("@@",{startsExpr:Ap}),pipeline:Np("|>",0),nullishCoalescing:Np("??",1),logicalOR:Np("||",1),logicalAND:Np("&&",2),bitwiseOR:Np("|",3),bitwiseXOR:Np("^",4),bitwiseAND:Np("&",5),equality:Np("==/!=/===/!==",6),lt:Np("/<=/>=",7),gt:Np("/<=/>=",7),relational:Np("/<=/>=",7),bitShift:Np("<>/>>>",8),bitShiftL:Np("<>/>>>",8),bitShiftR:Np("<>/>>>",8),plusMin:Gp("+/-",{beforeExpr:Pp,binop:9,prefix:_p,startsExpr:Ap}),modulo:Gp("%",{binop:10,startsExpr:Ap}),star:Gp("*",{binop:10}),slash:Np("/",10),exponent:Gp("**",{beforeExpr:Pp,binop:11,rightAssociative:!0}),_in:Op("in",{beforeExpr:Pp,binop:7}),_instanceof:Op("instanceof",{beforeExpr:Pp,binop:7}),_break:Op("break"),_case:Op("case",{beforeExpr:Pp}),_catch:Op("catch"),_continue:Op("continue"),_debugger:Op("debugger"),_default:Op("default",{beforeExpr:Pp}),_else:Op("else",{beforeExpr:Pp}),_finally:Op("finally"),_function:Op("function",{startsExpr:Ap}),_if:Op("if"),_return:Op("return",{beforeExpr:Pp}),_switch:Op("switch"),_throw:Op("throw",{beforeExpr:Pp,prefix:_p,startsExpr:Ap}),_try:Op("try"),_var:Op("var"),_const:Op("const"),_with:Op("with"),_new:Op("new",{beforeExpr:Pp,startsExpr:Ap}),_this:Op("this",{startsExpr:Ap}),_super:Op("super",{startsExpr:Ap}),_class:Op("class",{startsExpr:Ap}),_extends:Op("extends",{beforeExpr:Pp}),_export:Op("export"),_import:Op("import",{startsExpr:Ap}),_null:Op("null",{startsExpr:Ap}),_true:Op("true",{startsExpr:Ap}),_false:Op("false",{startsExpr:Ap}),_typeof:Op("typeof",{beforeExpr:Pp,prefix:_p,startsExpr:Ap}),_void:Op("void",{beforeExpr:Pp,prefix:_p,startsExpr:Ap}),_delete:Op("delete",{beforeExpr:Pp,prefix:_p,startsExpr:Ap}),_do:Op("do",{isLoop:kp,beforeExpr:Pp}),_for:Op("for",{isLoop:kp}),_while:Op("while",{isLoop:kp}),_as:Vp("as",{startsExpr:Ap}),_assert:Vp("assert",{startsExpr:Ap}),_async:Vp("async",{startsExpr:Ap}),_await:Vp("await",{startsExpr:Ap}),_defer:Vp("defer",{startsExpr:Ap}),_from:Vp("from",{startsExpr:Ap}),_get:Vp("get",{startsExpr:Ap}),_let:Vp("let",{startsExpr:Ap}),_meta:Vp("meta",{startsExpr:Ap}),_of:Vp("of",{startsExpr:Ap}),_sent:Vp("sent",{startsExpr:Ap}),_set:Vp("set",{startsExpr:Ap}),_source:Vp("source",{startsExpr:Ap}),_static:Vp("static",{startsExpr:Ap}),_using:Vp("using",{startsExpr:Ap}),_yield:Vp("yield",{startsExpr:Ap}),_asserts:Vp("asserts",{startsExpr:Ap}),_checks:Vp("checks",{startsExpr:Ap}),_exports:Vp("exports",{startsExpr:Ap}),_global:Vp("global",{startsExpr:Ap}),_implements:Vp("implements",{startsExpr:Ap}),_intrinsic:Vp("intrinsic",{startsExpr:Ap}),_infer:Vp("infer",{startsExpr:Ap}),_is:Vp("is",{startsExpr:Ap}),_mixins:Vp("mixins",{startsExpr:Ap}),_proto:Vp("proto",{startsExpr:Ap}),_require:Vp("require",{startsExpr:Ap}),_satisfies:Vp("satisfies",{startsExpr:Ap}),_keyof:Vp("keyof",{startsExpr:Ap}),_readonly:Vp("readonly",{startsExpr:Ap}),_unique:Vp("unique",{startsExpr:Ap}),_abstract:Vp("abstract",{startsExpr:Ap}),_declare:Vp("declare",{startsExpr:Ap}),_enum:Vp("enum",{startsExpr:Ap}),_module:Vp("module",{startsExpr:Ap}),_namespace:Vp("namespace",{startsExpr:Ap}),_interface:Vp("interface",{startsExpr:Ap}),_type:Vp("type",{startsExpr:Ap}),_opaque:Vp("opaque",{startsExpr:Ap}),name:Gp("name",{startsExpr:Ap}),placeholder:Gp("%%",{startsExpr:!0}),string:Gp("string",{startsExpr:Ap}),num:Gp("num",{startsExpr:Ap}),bigint:Gp("bigint",{startsExpr:Ap}),decimal:Gp("decimal",{startsExpr:Ap}),regexp:Gp("regexp",{startsExpr:Ap}),privateName:Gp("#name",{startsExpr:Ap}),eof:Gp("eof"),jsxName:Gp("jsxName"),jsxText:Gp("jsxText",{beforeExpr:!0}),jsxTagStart:Gp("jsxTagStart",{startsExpr:!0}),jsxTagEnd:Gp("jsxTagEnd")};function Kp(e){return e>=93&&e<=133}function zp(e){return e>=58&&e<=133}function Jp(e){return e>=58&&e<=137}function Xp(e){return qp[e]}function Yp(e){return e>=129&&e<=131}function $p(e){return e>=58&&e<=92}function Qp(e){return Fp[e]}function Zp(e){return Lp[e]}function ef(e){return e>=24&&e<=25}function tf(e){return Mp[e]}Mp[8].updateContext=function(e){e.pop()},Mp[5].updateContext=Mp[7].updateContext=Mp[23].updateContext=function(e){e.push(Tp.brace)},Mp[22].updateContext=function(e){e[e.length-1]===Tp.template?e.pop():e.push(Tp.template)},Mp[143].updateContext=function(e){e.push(Tp.j_expr,Tp.j_oTag)};var rf=new Set(["break","case","catch","continue","debugger","default","do","else","finally","for","function","if","return","switch","throw","try","var","const","while","with","new","this","super","class","extends","export","import","null","true","false","in","instanceof","typeof","void","delete","implements","interface","let","package","private","protected","public","static","yield","eval","arguments","enum","await"]);var af=0,nf=1,sf=2,of=4,df=8,cf=16,lf=32,uf=64,pf=128,ff=256,gf=387,yf=1,mf=2,hf=4,bf=8,vf=16,xf=128,Rf=256,jf=512,wf=1024,Ef=2048,Sf=4096,Tf=8192,Pf=8331,Af=8201,kf=9,Cf=5,_f=17,If=130,Df=2,Of=8459,Nf=1024,Bf=64,Mf=65,Ff=8971,Lf=1024,Uf=4098,qf=4096,Wf=2048,Gf=0,Vf=4,Hf=3,Kf=6,zf=5,Jf=2,Xf=1,Yf=1,$f=2,Qf=4,Zf=o((function(e){this.flags=0,this.names=new Map,this.firstLexicalName="",this.flags=e})),eg=function(){function e(e,t){this.parser=void 0,this.scopeStack=[],this.inModule=void 0,this.undefinedExports=new Map,this.parser=e,this.inModule=t}var t=e.prototype;return t.createScope=function(e){return new Zf(e)},t.enter=function(e){this.scopeStack.push(this.createScope(e))},t.exit=function(){return this.scopeStack.pop().flags},t.treatFunctionsAsVarInScope=function(e){return!!(e.flags&(sf|pf)||!this.parser.inModule&&e.flags&nf)},t.declareName=function(e,t,r){var a=this.currentScope();if(t&bf||t&vf){this.checkRedeclarationInScope(a,e,t,r);var n=a.names.get(e)||0;t&vf?n|=Qf:(a.firstLexicalName||(a.firstLexicalName=e),n|=$f),a.names.set(e,n),t&bf&&this.maybeExportDefined(a,e)}else if(t&hf)for(var s=this.scopeStack.length-1;s>=0&&(a=this.scopeStack[s],this.checkRedeclarationInScope(a,e,t,r),a.names.set(e,(a.names.get(e)||0)|Yf),this.maybeExportDefined(a,e),!(a.flags&gf));--s);this.parser.inModule&&a.flags&nf&&this.undefinedExports.delete(e)},t.maybeExportDefined=function(e,t){this.parser.inModule&&e.flags&nf&&this.undefinedExports.delete(t)},t.checkRedeclarationInScope=function(e,t,r,a){this.isRedeclaredInScope(e,t,r)&&this.parser.raise(dp.VarRedeclaration,a,{identifierName:t})},t.isRedeclaredInScope=function(e,t,r){if(!(r&yf))return!1;if(r&bf)return e.names.has(t);var a=e.names.get(t);return r&vf?(a&$f)>0||!this.treatFunctionsAsVarInScope(e)&&(a&Yf)>0:(a&$f)>0&&!(e.flags&df&&e.firstLexicalName===t)||!this.treatFunctionsAsVarInScope(e)&&(a&Qf)>0},t.checkLocalExport=function(e){var t=e.name;this.scopeStack[0].names.has(t)||this.undefinedExports.set(t,e.loc.start)},t.currentScope=function(){return this.scopeStack[this.scopeStack.length-1]},t.currentVarScopeFlags=function(){for(var e=this.scopeStack.length-1;;e--){var t=this.scopeStack[e].flags;if(t&gf)return t}},t.currentThisScopeFlags=function(){for(var e=this.scopeStack.length-1;;e--){var t=this.scopeStack[e].flags;if(t&(gf|uf)&&!(t&of))return t}},o(e,[{key:"inTopLevel",get:function(){return(this.currentScope().flags&nf)>0}},{key:"inFunction",get:function(){return(this.currentVarScopeFlags()&sf)>0}},{key:"allowSuper",get:function(){return(this.currentThisScopeFlags()&cf)>0}},{key:"allowDirectSuper",get:function(){return(this.currentThisScopeFlags()&lf)>0}},{key:"inClass",get:function(){return(this.currentThisScopeFlags()&uf)>0}},{key:"inClassAndNotInNonArrowFunction",get:function(){var e=this.currentThisScopeFlags();return(e&uf)>0&&0==(e&sf)}},{key:"inStaticBlock",get:function(){for(var e=this.scopeStack.length-1;;e--){var t=this.scopeStack[e].flags;if(t&pf)return!0;if(t&(gf|uf))return!1}}},{key:"inNonArrowFunction",get:function(){return(this.currentThisScopeFlags()&sf)>0}},{key:"treatFunctionsAsVar",get:function(){return this.treatFunctionsAsVarInScope(this.currentScope())}}])}(),tg=function(e){function t(){for(var t,r=arguments.length,a=new Array(r),n=0;n0||(n&$f)>0}return!1},r.checkLocalExport=function(t){this.scopeStack[0].declareFunctions.has(t.name)||e.prototype.checkLocalExport.call(this,t)},o(t)}(eg),ag=function(){function e(){this.sawUnambiguousESM=!1,this.ambiguousScriptDifferentAst=!1}var t=e.prototype;return t.sourceToOffsetPos=function(e){return e+this.startIndex},t.offsetToSourcePos=function(e){return e-this.startIndex},t.hasPlugin=function(e){if("string"==typeof e)return this.plugins.has(e);var t=e[0],r=e[1];if(!this.hasPlugin(t))return!1;for(var a=this.plugins.get(t),n=0,s=Object.keys(r);n0;)a=t[--n];null===a||a.start>r.start?sg(e,r.comments):ng(a,r.comments)}var ig=function(e){function t(){return e.apply(this,arguments)||this}c(t,e);var r=t.prototype;return r.addComment=function(e){this.filename&&(e.loc.filename=this.filename);var t=this.state.commentsLen;this.comments.length!==t&&(this.comments.length=t),this.comments.push(e),this.state.commentsLen++},r.processComment=function(e){var t=this.state.commentStack,r=t.length;if(0!==r){var a=r-1,n=t[a];n.start===e.end&&(n.leadingNode=e,a--);for(var s=e.start;a>=0;a--){var o=t[a],i=o.end;if(!(i>s)){i===s&&(o.trailingNode=e);break}o.containingNode=e,this.finalizeComment(o),t.splice(a,1)}}},r.finalizeComment=function(e){var t=e.comments;if(null!==e.leadingNode||null!==e.trailingNode)null!==e.leadingNode&&ng(e.leadingNode,t),null!==e.trailingNode&&function(e,t){var r;void 0===e.leadingComments?e.leadingComments=t:(r=e.leadingComments).unshift.apply(r,t)}(e.trailingNode,t);else{var r=e.containingNode,a=e.start;if(44===this.input.charCodeAt(this.offsetToSourcePos(a)-1))switch(r.type){case"ObjectExpression":case"ObjectPattern":case"RecordExpression":og(r,r.properties,e);break;case"CallExpression":case"OptionalCallExpression":og(r,r.arguments,e);break;case"FunctionDeclaration":case"FunctionExpression":case"ArrowFunctionExpression":case"ObjectMethod":case"ClassMethod":case"ClassPrivateMethod":og(r,r.params,e);break;case"ArrayExpression":case"ArrayPattern":case"TupleExpression":og(r,r.elements,e);break;case"ExportNamedDeclaration":case"ImportDeclaration":og(r,r.specifiers,e);break;case"TSEnumDeclaration":case"TSEnumBody":og(r,r.members,e);break;default:sg(r,t)}else sg(r,t)}},r.finalizeRemainingComments=function(){for(var e=this.state.commentStack,t=e.length-1;t>=0;t--)this.finalizeComment(e[t]);this.state.commentStack=[]},r.resetPreviousNodeTrailingComments=function(e){var t=this.state.commentStack,r=t.length;if(0!==r){var a=t[r-1];a.leadingNode===e&&(a.leadingNode=null)}},r.resetPreviousIdentifierLeadingComments=function(e){var t=this.state.commentStack,r=t.length;0!==r&&(t[r-1].trailingNode===e?t[r-1].trailingNode=null:r>=2&&t[r-2].trailingNode===e&&(t[r-2].trailingNode=null))},r.takeSurroundingComments=function(e,t,r){var a=this.state.commentStack,n=a.length;if(0!==n)for(var s=n-1;s>=0;s--){var o=a[s],i=o.end;if(o.start===r)o.leadingNode=e;else if(i===t)o.trailingNode=e;else if(i0},set:function(e){e?this.flags|=1:this.flags&=-2}},{key:"maybeInArrowParameters",get:function(){return(2&this.flags)>0},set:function(e){e?this.flags|=2:this.flags&=-3}},{key:"inType",get:function(){return(4&this.flags)>0},set:function(e){e?this.flags|=4:this.flags&=-5}},{key:"noAnonFunctionType",get:function(){return(8&this.flags)>0},set:function(e){e?this.flags|=8:this.flags&=-9}},{key:"hasFlowComment",get:function(){return(16&this.flags)>0},set:function(e){e?this.flags|=16:this.flags&=-17}},{key:"isAmbientContext",get:function(){return(32&this.flags)>0},set:function(e){e?this.flags|=32:this.flags&=-33}},{key:"inAbstractClass",get:function(){return(64&this.flags)>0},set:function(e){e?this.flags|=64:this.flags&=-65}},{key:"inDisallowConditionalTypesContext",get:function(){return(128&this.flags)>0},set:function(e){e?this.flags|=128:this.flags&=-129}},{key:"soloAwait",get:function(){return(256&this.flags)>0},set:function(e){e?this.flags|=256:this.flags&=-257}},{key:"inFSharpPipelineDirectBody",get:function(){return(512&this.flags)>0},set:function(e){e?this.flags|=512:this.flags&=-513}},{key:"canStartJSXElement",get:function(){return(1024&this.flags)>0},set:function(e){e?this.flags|=1024:this.flags&=-1025}},{key:"containsEsc",get:function(){return(2048&this.flags)>0},set:function(e){e?this.flags|=2048:this.flags&=-2049}},{key:"hasTopLevelAwait",get:function(){return(4096&this.flags)>0},set:function(e){e?this.flags|=4096:this.flags&=-4097}}])}();function hg(e,t,r){return new Ju(r,e-t,e)}var bg=new Set([103,109,115,105,121,117,100,118]),vg=o((function(e){var t=e.startIndex||0;this.type=e.type,this.value=e.value,this.start=t+e.start,this.end=t+e.end,this.loc=new Xu(e.startLoc,e.endLoc)})),xg=function(e){function t(t,r){var a;return(a=e.call(this)||this).isLookahead=void 0,a.tokens=[],a.errorHandlers_readInt={invalidDigit:function(e,t,r,n){return!!(a.optionFlags&vp)&&(a.raise(dp.InvalidDigit,hg(e,t,r),{radix:n}),!0)},numericSeparatorInEscapeSequence:a.errorBuilder(dp.NumericSeparatorInEscapeSequence),unexpectedNumericSeparator:a.errorBuilder(dp.UnexpectedNumericSeparator)},a.errorHandlers_readCodePoint=Object.assign({},a.errorHandlers_readInt,{invalidEscapeSequence:a.errorBuilder(dp.InvalidEscapeSequence),invalidCodePoint:a.errorBuilder(dp.InvalidCodePoint)}),a.errorHandlers_readStringContents_string=Object.assign({},a.errorHandlers_readCodePoint,{strictNumericEscape:function(e,t,r){a.recordStrictModeErrors(dp.StrictNumericEscape,hg(e,t,r))},unterminated:function(e,t,r){throw a.raise(dp.UnterminatedString,hg(e-1,t,r))}}),a.errorHandlers_readStringContents_template=Object.assign({},a.errorHandlers_readCodePoint,{strictNumericEscape:a.errorBuilder(dp.StrictNumericEscape),unterminated:function(e,t,r){throw a.raise(dp.UnterminatedTemplate,hg(e,t,r))}}),a.state=new mg,a.state.init(t),a.input=r,a.length=r.length,a.comments=[],a.isLookahead=!1,a}c(t,e);var r=t.prototype;return r.pushToken=function(e){this.tokens.length=this.state.tokensLength,this.tokens.push(e),++this.state.tokensLength},r.next=function(){this.checkKeywordEscapes(),this.optionFlags&mp&&this.pushToken(new vg(this.state)),this.state.lastTokEndLoc=this.state.endLoc,this.state.lastTokStartLoc=this.state.startLoc,this.nextToken()},r.eat=function(e){return!!this.match(e)&&(this.next(),!0)},r.match=function(e){return this.state.type===e},r.createLookaheadState=function(e){return{pos:e.pos,value:null,type:e.type,start:e.start,end:e.end,context:[this.curContext()],inType:e.inType,startLoc:e.startLoc,lastTokEndLoc:e.lastTokEndLoc,curLine:e.curLine,lineStart:e.lineStart,curPosition:e.curPosition}},r.lookahead=function(){var e=this.state;this.state=this.createLookaheadState(e),this.isLookahead=!0,this.nextToken(),this.isLookahead=!1;var t=this.state;return this.state=e,t},r.nextTokenStart=function(){return this.nextTokenStartSince(this.state.pos)},r.nextTokenStartSince=function(e){return ug.lastIndex=e,ug.test(this.input)?ug.lastIndex:e},r.lookaheadCharCode=function(){return this.input.charCodeAt(this.nextTokenStart())},r.nextTokenInLineStart=function(){return this.nextTokenInLineStartSince(this.state.pos)},r.nextTokenInLineStartSince=function(e){return pg.lastIndex=e,pg.test(this.input)?pg.lastIndex:e},r.lookaheadInLineCharCode=function(){return this.input.charCodeAt(this.nextTokenInLineStart())},r.codePointAtPos=function(e){var t=this.input.charCodeAt(e);if(55296==(64512&t)&&++e=this.length?this.finishToken(140):this.getTokenFromCode(this.codePointAtPos(this.state.pos))},r.skipBlockComment=function(e){var t;this.isLookahead||(t=this.state.curPosition());var r=this.state.pos,a=this.input.indexOf(e,r+2);if(-1===a)throw this.raise(dp.UnterminatedComment,this.state.curPosition());for(this.state.pos=a+e.length,dg.lastIndex=r+2;dg.test(this.input)&&dg.lastIndex<=a;)++this.state.curLine,this.state.lineStart=dg.lastIndex;if(!this.isLookahead){var n={type:"CommentBlock",value:this.input.slice(r+2,a),start:this.sourceToOffsetPos(r),end:this.sourceToOffsetPos(a+e.length),loc:new Xu(t,this.state.curPosition())};return this.optionFlags&mp&&this.pushToken(n),n}},r.skipLineComment=function(e){var t,r=this.state.pos;this.isLookahead||(t=this.state.curPosition());var a=this.input.charCodeAt(this.state.pos+=e);if(this.state.pose))break e;var o=this.skipLineComment(3);void 0!==o&&(this.addComment(o),null==t||t.push(o))}else{if(60!==r||this.inModule||!(this.optionFlags&Rp))break e;var i=this.state.pos;if(33!==this.input.charCodeAt(i+1)||45!==this.input.charCodeAt(i+2)||45!==this.input.charCodeAt(i+3))break e;var d=this.skipLineComment(4);void 0!==d&&(this.addComment(d),null==t||t.push(d))}}}if((null==t?void 0:t.length)>0){var c=this.state.pos,l={start:this.sourceToOffsetPos(e),end:this.sourceToOffsetPos(c),comments:t,leadingNode:null,trailingNode:null,containingNode:null};this.state.commentStack.push(l)}},r.finishToken=function(e,t){this.state.end=this.state.pos,this.state.endLoc=this.state.curPosition();var r=this.state.type;this.state.type=e,this.state.value=t,this.isLookahead||this.updateContext(r)},r.replaceToken=function(e){this.state.type=e,this.updateContext()},r.readToken_numberSign=function(){if(0!==this.state.pos||!this.readToken_interpreter()){var e=this.state.pos+1,t=this.codePointAtPos(e);if(t>=48&&t<=57)throw this.raise(dp.UnexpectedDigitAfterHash,this.state.curPosition());if(123===t||91===t&&this.hasPlugin("recordAndTuple")){if(this.expectPlugin("recordAndTuple"),"bar"===this.getPluginOption("recordAndTuple","syntaxType"))throw this.raise(123===t?dp.RecordExpressionHashIncorrectStartSyntaxType:dp.TupleExpressionHashIncorrectStartSyntaxType,this.state.curPosition());this.state.pos+=2,123===t?this.finishToken(7):this.finishToken(1)}else Br(t)?(++this.state.pos,this.finishToken(139,this.readWord1(t))):92===t?(++this.state.pos,this.finishToken(139,this.readWord1())):this.finishOp(27,1)}},r.readToken_dot=function(){var e=this.input.charCodeAt(this.state.pos+1);e>=48&&e<=57?this.readNumber(!0):46===e&&46===this.input.charCodeAt(this.state.pos+2)?(this.state.pos+=3,this.finishToken(21)):(++this.state.pos,this.finishToken(16))},r.readToken_slash=function(){61===this.input.charCodeAt(this.state.pos+1)?this.finishOp(31,2):this.finishOp(56,1)},r.readToken_interpreter=function(){if(0!==this.state.pos||this.length<2)return!1;var e=this.input.charCodeAt(this.state.pos+1);if(33!==e)return!1;var t=this.state.pos;for(this.state.pos+=1;!cg(e)&&++this.state.pos=48&&t<=57?(++this.state.pos,this.finishToken(17)):(this.state.pos+=2,this.finishToken(18))},r.getTokenFromCode=function(e){switch(e){case 46:return void this.readToken_dot();case 40:return++this.state.pos,void this.finishToken(10);case 41:return++this.state.pos,void this.finishToken(11);case 59:return++this.state.pos,void this.finishToken(13);case 44:return++this.state.pos,void this.finishToken(12);case 91:if(this.hasPlugin("recordAndTuple")&&124===this.input.charCodeAt(this.state.pos+1)){if("bar"!==this.getPluginOption("recordAndTuple","syntaxType"))throw this.raise(dp.TupleExpressionBarIncorrectStartSyntaxType,this.state.curPosition());this.state.pos+=2,this.finishToken(2)}else++this.state.pos,this.finishToken(0);return;case 93:return++this.state.pos,void this.finishToken(3);case 123:if(this.hasPlugin("recordAndTuple")&&124===this.input.charCodeAt(this.state.pos+1)){if("bar"!==this.getPluginOption("recordAndTuple","syntaxType"))throw this.raise(dp.RecordExpressionBarIncorrectStartSyntaxType,this.state.curPosition());this.state.pos+=2,this.finishToken(6)}else++this.state.pos,this.finishToken(5);return;case 125:return++this.state.pos,void this.finishToken(8);case 58:return void(this.hasPlugin("functionBind")&&58===this.input.charCodeAt(this.state.pos+1)?this.finishOp(15,2):(++this.state.pos,this.finishToken(14)));case 63:return void this.readToken_question();case 96:return void this.readTemplateToken();case 48:var t=this.input.charCodeAt(this.state.pos+1);if(120===t||88===t)return void this.readRadixNumber(16);if(111===t||79===t)return void this.readRadixNumber(8);if(98===t||66===t)return void this.readRadixNumber(2);case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:return void this.readNumber(!1);case 34:case 39:return void this.readString(e);case 47:return void this.readToken_slash();case 37:case 42:return void this.readToken_mult_modulo(e);case 124:case 38:return void this.readToken_pipe_amp(e);case 94:return void this.readToken_caret();case 43:case 45:return void this.readToken_plus_min(e);case 60:return void this.readToken_lt();case 62:return void this.readToken_gt();case 61:case 33:return void this.readToken_eq_excl(e);case 126:return void this.finishOp(36,1);case 64:return void this.readToken_atSign();case 35:return void this.readToken_numberSign();case 92:return void this.readWord();default:if(Br(e))return void this.readWord(e)}throw this.raise(dp.InvalidOrUnexpectedToken,this.state.curPosition(),{unexpected:String.fromCodePoint(e)})},r.finishOp=function(e,t){var r=this.input.slice(this.state.pos,this.state.pos+t);this.state.pos+=t,this.finishToken(e,r)},r.readRegexp=function(){for(var e,t,r=this.state.startLoc,a=this.state.start+1,n=this.state.pos;;++n){if(n>=this.length)throw this.raise(dp.UnterminatedRegExp,Yu(r,1));var s=this.input.charCodeAt(n);if(cg(s))throw this.raise(dp.UnterminatedRegExp,Yu(r,1));if(e)e=!1;else{if(91===s)t=!0;else if(93===s&&t)t=!1;else if(47===s&&!t)break;e=92===s}}var o=this.input.slice(a,n);++n;for(var i="",d=function(){return Yu(r,n+2-a)};n=2&&48===this.input.charCodeAt(t);if(i){var d=this.input.slice(t,this.state.pos);if(this.recordStrictModeErrors(dp.StrictOctalLiteral,r),!this.state.strict){var c=d.indexOf("_");c>0&&this.raise(dp.ZeroDigitNumericSeparator,Yu(r,c))}o=i&&!/[89]/.test(d)}var l=this.input.charCodeAt(this.state.pos);if(46!==l||o||(++this.state.pos,this.readInt(10),a=!0,l=this.input.charCodeAt(this.state.pos)),69!==l&&101!==l||o||(43!==(l=this.input.charCodeAt(++this.state.pos))&&45!==l||++this.state.pos,null===this.readInt(10)&&this.raise(dp.InvalidOrMissingExponent,r),a=!0,s=!0,l=this.input.charCodeAt(this.state.pos)),110===l&&((a||i)&&this.raise(dp.InvalidBigIntLiteral,r),++this.state.pos,n=!0),109===l){this.expectPlugin("decimal",this.state.curPosition()),(s||i)&&this.raise(dp.InvalidDecimal,r),++this.state.pos;var u=!0}if(Br(this.codePointAtPos(this.state.pos)))throw this.raise(dp.NumberIdentifier,this.state.curPosition());var p=this.input.slice(t,this.state.pos).replace(/[_mn]/g,"");if(n)this.finishToken(136,p);else if(u)this.finishToken(137,p);else{var f=o?parseInt(p,8):parseFloat(p);this.finishToken(135,f)}},r.readCodePoint=function(e){var t=na(this.input,this.state.pos,this.state.lineStart,this.state.curLine,e,this.errorHandlers_readCodePoint),r=t.code,a=t.pos;return this.state.pos=a,r},r.readString=function(e){var t=Zr(34===e?"double":"single",this.input,this.state.pos+1,this.state.lineStart,this.state.curLine,this.errorHandlers_readStringContents_string),r=t.str,a=t.pos,n=t.curLine,s=t.lineStart;this.state.pos=a+1,this.state.lineStart=s,this.state.curLine=n,this.finishToken(134,r)},r.readTemplateContinuation=function(){this.match(8)||this.unexpected(null,8),this.state.pos--,this.readTemplateToken()},r.readTemplateToken=function(){var e=this.input[this.state.pos],t=Zr("template",this.input,this.state.pos+1,this.state.lineStart,this.state.curLine,this.errorHandlers_readStringContents_template),r=t.str,a=t.firstInvalidLoc,n=t.pos,s=t.curLine,o=t.lineStart;this.state.pos=n+1,this.state.lineStart=o,this.state.curLine=s,a&&(this.state.firstInvalidTemplateEscapePos=new Ju(a.curLine,a.pos-a.lineStart,this.sourceToOffsetPos(a.pos))),96===this.input.codePointAt(n)?this.finishToken(24,a?null:e+r+"`"):(this.state.pos++,this.finishToken(25,a?null:e+r+"${"))},r.recordStrictModeErrors=function(e,t){var r=t.index;this.state.strict&&!this.state.strictErrors.has(r)?this.raise(e,t):this.state.strictErrors.set(r,[e,t])},r.readWord1=function(e){this.state.containsEsc=!1;var t="",r=this.state.pos,a=this.state.pos;for(void 0!==e&&(this.state.pos+=e<=65535?1:2);this.state.pos=0;o--){var i=s[o];if(i.loc.index===n)return s[o]=e(a,r);if(i.loc.index0}},{key:"hasYield",get:function(){return(this.currentFlags()&Ag)>0}},{key:"hasReturn",get:function(){return(this.currentFlags()&Cg)>0}},{key:"hasIn",get:function(){return(this.currentFlags()&_g)>0}}])}();function Dg(e,t){return(e?kg:0)|(t?Ag:0)}var Og=function(e){function t(){return e.apply(this,arguments)||this}c(t,e);var r=t.prototype;return r.addExtra=function(e,t,r,a){if(void 0===a&&(a=!0),e){var n=e.extra;null==n&&(n={},e.extra=n),a?n[t]=r:Object.defineProperty(n,t,{enumerable:a,value:r})}},r.isContextual=function(e){return this.state.type===e&&!this.state.containsEsc},r.isUnparsedContextual=function(e,t){var r=e+t.length;if(this.input.slice(e,r)===t){var a=this.input.charCodeAt(r);return!(Mr(a)||55296==(64512&a))}return!1},r.isLookaheadContextual=function(e){var t=this.nextTokenStart();return this.isUnparsedContextual(t,e)},r.eatContextual=function(e){return!!this.isContextual(e)&&(this.next(),!0)},r.expectContextual=function(e,t){if(!this.eatContextual(e)){if(null!=t)throw this.raise(t,this.state.startLoc);this.unexpected(null,e)}},r.canInsertSemicolon=function(){return this.match(140)||this.match(8)||this.hasPrecedingLineBreak()},r.hasPrecedingLineBreak=function(){return lg(this.input,this.offsetToSourcePos(this.state.lastTokEndLoc.index),this.state.start)},r.hasFollowingLineBreak=function(){return lg(this.input,this.state.end,this.nextTokenStart())},r.isLineTerminator=function(){return this.eat(13)||this.canInsertSemicolon()},r.semicolon=function(e){void 0===e&&(e=!0),(e?this.isLineTerminator():this.eat(13))||this.raise(dp.MissingSemicolon,this.state.lastTokEndLoc)},r.expect=function(e,t){this.eat(e)||this.unexpected(t,e)},r.tryParse=function(e,t){void 0===t&&(t=this.state.clone());var r={node:null};try{var a=e((function(e){throw void 0===e&&(e=null),r.node=e,r}));if(this.state.errors.length>t.errors.length){var n=this.state;return this.state=t,this.state.tokensLength=n.tokensLength,{node:a,error:n.errors[t.errors.length],thrown:!1,aborted:!1,failState:n}}return{node:a,error:null,thrown:!1,aborted:!1,failState:null}}catch(e){var s=this.state;if(this.state=t,e instanceof SyntaxError)return{node:null,error:e,thrown:!0,aborted:!1,failState:s};if(e===r)return{node:r.node,error:null,thrown:!1,aborted:!0,failState:s};throw e}},r.checkExpressionErrors=function(e,t){if(!e)return!1;var r=e.shorthandAssignLoc,a=e.doubleProtoLoc,n=e.privateKeyLoc,s=e.optionalParametersLoc;if(!t)return!!(r||a||s||n);null!=r&&this.raise(dp.InvalidCoverInitializedName,r),null!=a&&this.raise(dp.DuplicateProto,a),null!=n&&this.raise(dp.UnexpectedPrivateField,n),null!=s&&this.unexpected(s)},r.isLiteralPropertyName=function(){return Jp(this.state.type)},r.isPrivateName=function(e){return"PrivateName"===e.type},r.getPrivateNameSV=function(e){return e.id.name},r.hasPropertyAsPrivateName=function(e){return("MemberExpression"===e.type||"OptionalMemberExpression"===e.type)&&this.isPrivateName(e.property)},r.isObjectProperty=function(e){return"ObjectProperty"===e.type},r.isObjectMethod=function(e){return"ObjectMethod"===e.type},r.initializeScopes=function(e){var t=this;void 0===e&&(e="module"===this.options.sourceType);var r=this.state.labels;this.state.labels=[];var a=this.exportedIdentifiers;this.exportedIdentifiers=new Set;var n=this.inModule;this.inModule=e;var s=this.scope,o=this.getScopeHandler();this.scope=new o(this,e);var i=this.prodParam;this.prodParam=new Ig;var d=this.classScope;this.classScope=new jg(this);var c=this.expressionScope;return this.expressionScope=new Sg(this),function(){t.state.labels=r,t.exportedIdentifiers=a,t.inModule=n,t.scope=s,t.prodParam=i,t.classScope=d,t.expressionScope=c}},r.enterInitialScopes=function(){var e=Pg;this.inModule&&(e|=kg),this.scope.enter(nf),this.prodParam.enter(e)},r.checkDestructuringPrivate=function(e){var t=e.privateKeyLoc;null!==t&&this.expectPlugin("destructuringPrivate",t)},o(t)}(xg),Ng=o((function(){this.shorthandAssignLoc=null,this.doubleProtoLoc=null,this.privateKeyLoc=null,this.optionalParametersLoc=null})),Bg=o((function(e,t,r){this.type="",this.start=t,this.end=0,this.loc=new Xu(r),(null==e?void 0:e.optionFlags)&yp&&(this.range=[t,0]),null!=e&&e.filename&&(this.loc.filename=e.filename)})),Mg=Bg.prototype;function Fg(e){var t=e.type,r=e.start,a=e.end,n=e.loc,s=e.range,o=e.extra,i=e.name,d=Object.create(Mg);return d.type=t,d.start=r,d.end=a,d.loc=n,d.range=s,d.extra=o,d.name=i,"Placeholder"===t&&(d.expectedNode=e.expectedNode),d}function Lg(e){var t=e.type,r=e.start,a=e.end,n=e.loc,s=e.range,o=e.extra;if("Placeholder"===t)return function(e){return Fg(e)}(e);var i=Object.create(Mg);return i.type=t,i.start=r,i.end=a,i.loc=n,i.range=s,void 0!==e.raw?i.raw=e.raw:i.extra=o,i.value=e.value,i}Mg.__clone=function(){for(var e=new Bg(void 0,this.start,this.loc.start),t=Object.keys(this),r=0,a=t.length;r async () => {}`, use `async () => {}`.",UnsupportedDeclareExportKind:function(e){return"`declare export "+e.unsupportedExportKind+"` is not supported. Use `"+e.suggestion+"` instead."},UnsupportedStatementInDeclareModule:"Only declares and type imports are allowed inside declare module.",UnterminatedFlowComment:"Unterminated flow-comment."});function Vg(e){return"type"===e.importKind||"typeof"===e.importKind}var Hg={const:"declare export var",let:"declare export var",type:"export type",interface:"export interface"};var Kg,zg=/\*?\s*@((?:no)?flow)\b/,Jg={__proto__:null,quot:'"',amp:"&",apos:"'",lt:"<",gt:">",nbsp:"\xa0",iexcl:"\xa1",cent:"\xa2",pound:"\xa3",curren:"\xa4",yen:"\xa5",brvbar:"\xa6",sect:"\xa7",uml:"\xa8",copy:"\xa9",ordf:"\xaa",laquo:"\xab",not:"\xac",shy:"\xad",reg:"\xae",macr:"\xaf",deg:"\xb0",plusmn:"\xb1",sup2:"\xb2",sup3:"\xb3",acute:"\xb4",micro:"\xb5",para:"\xb6",middot:"\xb7",cedil:"\xb8",sup1:"\xb9",ordm:"\xba",raquo:"\xbb",frac14:"\xbc",frac12:"\xbd",frac34:"\xbe",iquest:"\xbf",Agrave:"\xc0",Aacute:"\xc1",Acirc:"\xc2",Atilde:"\xc3",Auml:"\xc4",Aring:"\xc5",AElig:"\xc6",Ccedil:"\xc7",Egrave:"\xc8",Eacute:"\xc9",Ecirc:"\xca",Euml:"\xcb",Igrave:"\xcc",Iacute:"\xcd",Icirc:"\xce",Iuml:"\xcf",ETH:"\xd0",Ntilde:"\xd1",Ograve:"\xd2",Oacute:"\xd3",Ocirc:"\xd4",Otilde:"\xd5",Ouml:"\xd6",times:"\xd7",Oslash:"\xd8",Ugrave:"\xd9",Uacute:"\xda",Ucirc:"\xdb",Uuml:"\xdc",Yacute:"\xdd",THORN:"\xde",szlig:"\xdf",agrave:"\xe0",aacute:"\xe1",acirc:"\xe2",atilde:"\xe3",auml:"\xe4",aring:"\xe5",aelig:"\xe6",ccedil:"\xe7",egrave:"\xe8",eacute:"\xe9",ecirc:"\xea",euml:"\xeb",igrave:"\xec",iacute:"\xed",icirc:"\xee",iuml:"\xef",eth:"\xf0",ntilde:"\xf1",ograve:"\xf2",oacute:"\xf3",ocirc:"\xf4",otilde:"\xf5",ouml:"\xf6",divide:"\xf7",oslash:"\xf8",ugrave:"\xf9",uacute:"\xfa",ucirc:"\xfb",uuml:"\xfc",yacute:"\xfd",thorn:"\xfe",yuml:"\xff",OElig:"\u0152",oelig:"\u0153",Scaron:"\u0160",scaron:"\u0161",Yuml:"\u0178",fnof:"\u0192",circ:"\u02c6",tilde:"\u02dc",Alpha:"\u0391",Beta:"\u0392",Gamma:"\u0393",Delta:"\u0394",Epsilon:"\u0395",Zeta:"\u0396",Eta:"\u0397",Theta:"\u0398",Iota:"\u0399",Kappa:"\u039a",Lambda:"\u039b",Mu:"\u039c",Nu:"\u039d",Xi:"\u039e",Omicron:"\u039f",Pi:"\u03a0",Rho:"\u03a1",Sigma:"\u03a3",Tau:"\u03a4",Upsilon:"\u03a5",Phi:"\u03a6",Chi:"\u03a7",Psi:"\u03a8",Omega:"\u03a9",alpha:"\u03b1",beta:"\u03b2",gamma:"\u03b3",delta:"\u03b4",epsilon:"\u03b5",zeta:"\u03b6",eta:"\u03b7",theta:"\u03b8",iota:"\u03b9",kappa:"\u03ba",lambda:"\u03bb",mu:"\u03bc",nu:"\u03bd",xi:"\u03be",omicron:"\u03bf",pi:"\u03c0",rho:"\u03c1",sigmaf:"\u03c2",sigma:"\u03c3",tau:"\u03c4",upsilon:"\u03c5",phi:"\u03c6",chi:"\u03c7",psi:"\u03c8",omega:"\u03c9",thetasym:"\u03d1",upsih:"\u03d2",piv:"\u03d6",ensp:"\u2002",emsp:"\u2003",thinsp:"\u2009",zwnj:"\u200c",zwj:"\u200d",lrm:"\u200e",rlm:"\u200f",ndash:"\u2013",mdash:"\u2014",lsquo:"\u2018",rsquo:"\u2019",sbquo:"\u201a",ldquo:"\u201c",rdquo:"\u201d",bdquo:"\u201e",dagger:"\u2020",Dagger:"\u2021",bull:"\u2022",hellip:"\u2026",permil:"\u2030",prime:"\u2032",Prime:"\u2033",lsaquo:"\u2039",rsaquo:"\u203a",oline:"\u203e",frasl:"\u2044",euro:"\u20ac",image:"\u2111",weierp:"\u2118",real:"\u211c",trade:"\u2122",alefsym:"\u2135",larr:"\u2190",uarr:"\u2191",rarr:"\u2192",darr:"\u2193",harr:"\u2194",crarr:"\u21b5",lArr:"\u21d0",uArr:"\u21d1",rArr:"\u21d2",dArr:"\u21d3",hArr:"\u21d4",forall:"\u2200",part:"\u2202",exist:"\u2203",empty:"\u2205",nabla:"\u2207",isin:"\u2208",notin:"\u2209",ni:"\u220b",prod:"\u220f",sum:"\u2211",minus:"\u2212",lowast:"\u2217",radic:"\u221a",prop:"\u221d",infin:"\u221e",ang:"\u2220",and:"\u2227",or:"\u2228",cap:"\u2229",cup:"\u222a",int:"\u222b",there4:"\u2234",sim:"\u223c",cong:"\u2245",asymp:"\u2248",ne:"\u2260",equiv:"\u2261",le:"\u2264",ge:"\u2265",sub:"\u2282",sup:"\u2283",nsub:"\u2284",sube:"\u2286",supe:"\u2287",oplus:"\u2295",otimes:"\u2297",perp:"\u22a5",sdot:"\u22c5",lceil:"\u2308",rceil:"\u2309",lfloor:"\u230a",rfloor:"\u230b",lang:"\u2329",rang:"\u232a",loz:"\u25ca",spades:"\u2660",clubs:"\u2663",hearts:"\u2665",diams:"\u2666"},Xg=ip(Kg||(Kg=y(["jsx"])))({AttributeIsEmpty:"JSX attributes must only be assigned a non-empty expression.",MissingClosingTagElement:function(e){return"Expected corresponding JSX closing tag for <"+e.openingTagName+">."},MissingClosingTagFragment:"Expected corresponding JSX closing tag for <>.",UnexpectedSequenceExpression:"Sequence expressions cannot be directly nested inside JSX. Did you mean to wrap it in parentheses (...)?",UnexpectedToken:function(e){var t=e.unexpected;return"Unexpected token `"+t+"`. Did you mean `"+e.HTMLEntity+"` or `{'"+t+"'}`?"},UnsupportedJsxValue:"JSX value should be either an expression or a quoted JSX text.",UnterminatedJsxContent:"Unterminated JSX contents.",UnwrappedAdjacentJSXElements:"Adjacent JSX elements must be wrapped in an enclosing tag. Did you want a JSX fragment <>...?"});function Yg(e){return!!e&&("JSXOpeningFragment"===e.type||"JSXClosingFragment"===e.type)}function $g(e){if("JSXIdentifier"===e.type)return e.name;if("JSXNamespacedName"===e.type)return e.namespace.name+":"+e.name.name;if("JSXMemberExpression"===e.type)return $g(e.object)+"."+$g(e.property);throw new Error("Node had unexpected type: "+e.type)}var Qg,Zg=function(e){function t(){for(var t,r=arguments.length,a=new Array(r),n=0;n1)for(var a=0;a0?!(a&Rf)||!!(a&jf)!==(4&n)>0:a&xf&&(8&n)>0?!!(t.names.get(r)&$f)&&!!(a&yf):!!(a&mf&&(1&n)>0)||e.prototype.isRedeclaredInScope.call(this,t,r,a)},r.checkLocalExport=function(t){var r=t.name;if(!this.hasImport(r)){for(var a=this.scopeStack.length-1;a>=0;a--){var n=this.scopeStack[a].tsNames.get(r);if((1&n)>0||(16&n)>0)return}e.prototype.checkLocalExport.call(this,t)}},o(t)}(eg),ty=function(e){return"ParenthesizedExpression"===e.type?ty(e.expression):e},ry=1,ay=2,ny=4,sy=function(e){function t(){return e.apply(this,arguments)||this}c(t,e);var r=t.prototype;return r.toAssignable=function(e,t){var r,a;void 0===t&&(t=!1);var n=void 0;switch(("ParenthesizedExpression"===e.type||null!=(r=e.extra)&&r.parenthesized)&&(n=ty(e),t?"Identifier"===n.type?this.expressionScope.recordArrowParameterBindingError(dp.InvalidParenthesizedAssignment,e):"MemberExpression"===n.type||this.isOptionalMemberExpression(n)||this.raise(dp.InvalidParenthesizedAssignment,e):this.raise(dp.InvalidParenthesizedAssignment,e)),e.type){case"Identifier":case"ObjectPattern":case"ArrayPattern":case"AssignmentPattern":case"RestElement":break;case"ObjectExpression":e.type="ObjectPattern";for(var s=0,o=e.properties.length,i=o-1;s() => ...`.",ReservedTypeAssertion:"This syntax is reserved in files with the .mts or .cts extension. Use an `as` expression instead.",SetAccessorCannotHaveOptionalParameter:"A 'set' accessor cannot have an optional parameter.",SetAccessorCannotHaveRestParameter:"A 'set' accessor cannot have rest parameter.",SetAccessorCannotHaveReturnType:"A 'set' accessor cannot have a return type annotation.",SingleTypeParameterWithoutTrailingComma:function(e){var t=e.typeParameterName;return"Single type parameter "+t+" should have a trailing comma. Example usage: <"+t+",>."},StaticBlockCannotHaveModifier:"Static class blocks cannot have any modifier.",TupleOptionalAfterType:"A labeled tuple optional element must be declared using a question mark after the name and before the colon (`name?: type`), rather than after the type (`name: type?`).",TypeAnnotationAfterAssign:"Type annotations must come before default assignments, e.g. instead of `age = 25: number` use `age: number = 25`.",TypeImportCannotSpecifyDefaultAndNamed:"A type-only import can specify a default import or named bindings, but not both.",TypeModifierIsUsedInTypeExports:"The 'type' modifier cannot be used on a named export when 'export type' is used on its export statement.",TypeModifierIsUsedInTypeImports:"The 'type' modifier cannot be used on a named import when 'import type' is used on its import statement.",UnexpectedParameterModifier:"A parameter property is only allowed in a constructor implementation.",UnexpectedReadonly:"'readonly' type modifier is only permitted on array and tuple literal types.",UnexpectedTypeAnnotation:"Did not expect a type annotation here.",UnexpectedTypeCastInParameter:"Unexpected type cast in parameter position.",UnsupportedImportTypeArgument:"Argument in a type import must be a string literal.",UnsupportedParameterPropertyKind:"A parameter property may not be declared using a binding pattern.",UnsupportedSignatureParameterKind:function(e){return"Name in a signature must be an Identifier, ObjectPattern or ArrayPattern, instead got "+e.type+"."}});function dy(e){return"private"===e||"public"===e||"protected"===e}function cy(e){return"in"===e||"out"===e}var ly,uy=0,py=1,fy=2;function gy(e){if("MemberExpression"!==e.type)return!1;var t=e.computed,r=e.property;return(!t||"StringLiteral"===r.type||!("TemplateLiteral"!==r.type||r.expressions.length>0))&&hy(e.object)}function yy(e,t){var r,a=e.type;if(null!=(r=e.extra)&&r.parenthesized)return!1;if(t){if("Literal"===a){var n=e.value;if("string"==typeof n||"boolean"==typeof n)return!0}}else if("StringLiteral"===a||"BooleanLiteral"===a)return!0;return!(!my(e,t)&&!function(e,t){if("UnaryExpression"===e.type){var r=e.operator,a=e.argument;if("-"===r&&my(a,t))return!0}return!1}(e,t))||("TemplateLiteral"===a&&0===e.expressions.length||!!gy(e))}function my(e,t){return t?"Literal"===e.type&&("number"==typeof e.value||"bigint"in e):"NumericLiteral"===e.type||"BigIntLiteral"===e.type}function hy(e){return"Identifier"===e.type||"MemberExpression"===e.type&&!e.computed&&hy(e.object)}var by=ip(ly||(ly=y(["placeholders"])))({ClassNameIsRequired:"A class name is required.",UnexpectedSpace:"Unexpected space in placeholder."}),vy=["minimal","fsharp","hack","smart"],xy=["^^","@@","^","%","#"];var Ry={estree:function(e){return function(e){function t(){return e.apply(this,arguments)||this}c(t,e);var r=t.prototype;return r.parse=function(){var t=Ep(e.prototype.parse.call(this));return this.optionFlags&mp&&(t.tokens=t.tokens.map(Ep)),t},r.parseRegExpLiteral=function(e){var t=e.pattern,r=e.flags,a=null;try{a=new RegExp(t,r)}catch(e){}var n=this.estreeParseLiteral(a);return n.regex={pattern:t,flags:r},n},r.parseBigIntLiteral=function(e){var t;try{t=BigInt(e)}catch(e){t=null}var r=this.estreeParseLiteral(t);return r.bigint=String(r.value||e),r},r.parseDecimalLiteral=function(e){var t=this.estreeParseLiteral(null);return t.decimal=String(t.value||e),t},r.estreeParseLiteral=function(e){return this.parseLiteral(e,"Literal")},r.parseStringLiteral=function(e){return this.estreeParseLiteral(e)},r.parseNumericLiteral=function(e){return this.estreeParseLiteral(e)},r.parseNullLiteral=function(){return this.estreeParseLiteral(null)},r.parseBooleanLiteral=function(e){return this.estreeParseLiteral(e)},r.directiveToStmt=function(e){var t=e.value;delete e.value,t.type="Literal",t.raw=t.extra.raw,t.value=t.extra.expressionValue;var r=e;return r.type="ExpressionStatement",r.expression=t,r.directive=t.extra.rawValue,delete t.extra,r},r.initFunction=function(t,r){e.prototype.initFunction.call(this,t,r),t.expression=!1},r.checkDeclaration=function(t){null!=t&&this.isObjectProperty(t)?this.checkDeclaration(t.value):e.prototype.checkDeclaration.call(this,t)},r.getObjectOrClassMethodParams=function(e){return e.value.params},r.isValidDirective=function(e){var t;return"ExpressionStatement"===e.type&&"Literal"===e.expression.type&&"string"==typeof e.expression.value&&!(null!=(t=e.expression.extra)&&t.parenthesized)},r.parseBlockBody=function(t,r,a,n,s){var o=this;e.prototype.parseBlockBody.call(this,t,r,a,n,s);var i=t.directives.map((function(e){return o.directiveToStmt(e)}));t.body=i.concat(t.body),delete t.directives},r.parsePrivateName=function(){var t=e.prototype.parsePrivateName.call(this);return this.getPluginOption("estree","classFeatures")?this.convertPrivateNameToPrivateIdentifier(t):t},r.convertPrivateNameToPrivateIdentifier=function(t){var r=e.prototype.getPrivateNameSV.call(this,t);return delete t.id,t.name=r,t.type="PrivateIdentifier",t},r.isPrivateName=function(t){return this.getPluginOption("estree","classFeatures")?"PrivateIdentifier"===t.type:e.prototype.isPrivateName.call(this,t)},r.getPrivateNameSV=function(t){return this.getPluginOption("estree","classFeatures")?t.name:e.prototype.getPrivateNameSV.call(this,t)},r.parseLiteral=function(t,r){var a=e.prototype.parseLiteral.call(this,t,r);return a.raw=a.extra.raw,delete a.extra,a},r.parseFunctionBody=function(t,r,a){void 0===a&&(a=!1),e.prototype.parseFunctionBody.call(this,t,r,a),t.expression="BlockStatement"!==t.body.type},r.parseMethod=function(t,r,a,n,s,o,i){void 0===i&&(i=!1);var d=this.startNode();d.kind=t.kind,(d=e.prototype.parseMethod.call(this,d,r,a,n,s,o,i)).type="FunctionExpression",delete d.kind,t.value=d;var c=t.typeParameters;return c&&(delete t.typeParameters,d.typeParameters=c,this.resetStartLocationFromNode(d,c)),"ClassPrivateMethod"===o&&(t.computed=!1),this.finishNode(t,"MethodDefinition")},r.nameIsConstructor=function(t){return"Literal"===t.type?"constructor"===t.value:e.prototype.nameIsConstructor.call(this,t)},r.parseClassProperty=function(){for(var t,r=arguments.length,a=new Array(r),n=0;n0&&o.start===n.start&&this.resetStartLocation(n,a)}return n},r.parseSubscript=function(t,r,a,n){var s=e.prototype.parseSubscript.call(this,t,r,a,n);if(n.optionalChainMember){if("OptionalMemberExpression"!==s.type&&"OptionalCallExpression"!==s.type||(s.type=s.type.substring(8)),n.stop){var o=this.startNodeAtNode(s);return o.expression=s,this.finishNode(o,"ChainExpression")}}else"MemberExpression"!==s.type&&"CallExpression"!==s.type||(s.optional=!1);return s},r.isOptionalMemberExpression=function(t){return"ChainExpression"===t.type?"MemberExpression"===t.expression.type:e.prototype.isOptionalMemberExpression.call(this,t)},r.hasPropertyAsPrivateName=function(t){return"ChainExpression"===t.type&&(t=t.expression),e.prototype.hasPropertyAsPrivateName.call(this,t)},r.isObjectProperty=function(e){return"Property"===e.type&&"init"===e.kind&&!e.method},r.isObjectMethod=function(e){return"Property"===e.type&&(e.method||"get"===e.kind||"set"===e.kind)},r.finishNodeAt=function(t,r,a){return Ep(e.prototype.finishNodeAt.call(this,t,r,a))},r.resetStartLocation=function(t,r){e.prototype.resetStartLocation.call(this,t,r),Ep(t)},r.resetEndLocation=function(t,r){void 0===r&&(r=this.state.lastTokEndLoc),e.prototype.resetEndLocation.call(this,t,r),Ep(t)},o(t)}(e)},jsx:function(e){return function(e){function t(){return e.apply(this,arguments)||this}c(t,e);var r=t.prototype;return r.jsxReadToken=function(){for(var t="",r=this.state.pos;;){if(this.state.pos>=this.length)throw this.raise(Xg.UnterminatedJsxContent,this.state.startLoc);var a=this.input.charCodeAt(this.state.pos);switch(a){case 60:case 123:return this.state.pos===this.state.start?void(60===a&&this.state.canStartJSXElement?(++this.state.pos,this.finishToken(143)):e.prototype.getTokenFromCode.call(this,a)):(t+=this.input.slice(r,this.state.pos),void this.finishToken(142,t));case 38:t+=this.input.slice(r,this.state.pos),t+=this.jsxReadEntity(),r=this.state.pos;break;default:cg(a)?(t+=this.input.slice(r,this.state.pos),t+=this.jsxReadNewLine(!0),r=this.state.pos):++this.state.pos}}},r.jsxReadNewLine=function(e){var t,r=this.input.charCodeAt(this.state.pos);return++this.state.pos,13===r&&10===this.input.charCodeAt(this.state.pos)?(++this.state.pos,t=e?"\n":"\r\n"):t=String.fromCharCode(r),++this.state.curLine,this.state.lineStart=this.state.pos,t},r.jsxReadString=function(e){for(var t="",r=++this.state.pos;;){if(this.state.pos>=this.length)throw this.raise(dp.UnterminatedString,this.state.startLoc);var a=this.input.charCodeAt(this.state.pos);if(a===e)break;38===a?(t+=this.input.slice(r,this.state.pos),t+=this.jsxReadEntity(),r=this.state.pos):cg(a)?(t+=this.input.slice(r,this.state.pos),t+=this.jsxReadNewLine(!1),r=this.state.pos):++this.state.pos}t+=this.input.slice(r,this.state.pos++),this.finishToken(134,t)},r.jsxReadEntity=function(){var e=++this.state.pos;if(35===this.codePointAtPos(this.state.pos)){++this.state.pos;var t=10;120===this.codePointAtPos(this.state.pos)&&(t=16,++this.state.pos);var r=this.readInt(t,void 0,!1,"bail");if(null!==r&&59===this.codePointAtPos(this.state.pos))return++this.state.pos,String.fromCodePoint(r)}else{for(var a=0,n=!1;a++<10&&this.state.posr.index+1&&this.raise(Gg.UnexpectedSpaceBetweenModuloChecks,r),this.eat(10)?(t.value=e.prototype.parseExpression.call(this),this.expect(11),this.finishNode(t,"DeclaredPredicate")):this.finishNode(t,"InferredPredicate")},r.flowParseTypeAndPredicateInitialiser=function(){var e=this.state.inType;this.state.inType=!0,this.expect(14);var t=null,r=null;return this.match(54)?(this.state.inType=e,r=this.flowParsePredicate()):(t=this.flowParseType(),this.state.inType=e,this.match(54)&&(r=this.flowParsePredicate())),[t,r]},r.flowParseDeclareClass=function(e){return this.next(),this.flowParseInterfaceish(e,!0),this.finishNode(e,"DeclareClass")},r.flowParseDeclareFunction=function(e){this.next();var t=e.id=this.parseIdentifier(),r=this.startNode(),a=this.startNode();this.match(47)?r.typeParameters=this.flowParseTypeParameterDeclaration():r.typeParameters=null,this.expect(10);var n=this.flowParseFunctionTypeParams();r.params=n.params,r.rest=n.rest,r.this=n._this,this.expect(11);var s=this.flowParseTypeAndPredicateInitialiser();return r.returnType=s[0],e.predicate=s[1],a.typeAnnotation=this.finishNode(r,"FunctionTypeAnnotation"),t.typeAnnotation=this.finishNode(a,"TypeAnnotation"),this.resetEndLocation(t),this.semicolon(),this.scope.declareName(e.id.name,Wf,e.id.loc.start),this.finishNode(e,"DeclareFunction")},r.flowParseDeclare=function(e,t){return this.match(80)?this.flowParseDeclareClass(e):this.match(68)?this.flowParseDeclareFunction(e):this.match(74)?this.flowParseDeclareVariable(e):this.eatContextual(127)?this.match(16)?this.flowParseDeclareModuleExports(e):(t&&this.raise(Gg.NestedDeclareModule,this.state.lastTokStartLoc),this.flowParseDeclareModule(e)):this.isContextual(130)?this.flowParseDeclareTypeAlias(e):this.isContextual(131)?this.flowParseDeclareOpaqueType(e):this.isContextual(129)?this.flowParseDeclareInterface(e):this.match(82)?this.flowParseDeclareExportDeclaration(e,t):void this.unexpected()},r.flowParseDeclareVariable=function(e){return this.next(),e.id=this.flowParseTypeAnnotatableIdentifier(!0),this.scope.declareName(e.id.name,Cf,e.id.loc.start),this.semicolon(),this.finishNode(e,"DeclareVariable")},r.flowParseDeclareModule=function(t){var r=this;this.scope.enter(af),this.match(134)?t.id=e.prototype.parseExprAtom.call(this):t.id=this.parseIdentifier();var a=t.body=this.startNode(),n=a.body=[];for(this.expect(5);!this.match(8);){var s=this.startNode();this.match(83)?(this.next(),this.isContextual(130)||this.match(87)||this.raise(Gg.InvalidNonTypeImportInDeclareModule,this.state.lastTokStartLoc),e.prototype.parseImport.call(this,s)):(this.expectContextual(125,Gg.UnsupportedStatementInDeclareModule),s=this.flowParseDeclare(s,!0)),n.push(s)}this.scope.exit(),this.expect(8),this.finishNode(a,"BlockStatement");var o=null,i=!1;return n.forEach((function(e){!function(e){return"DeclareExportAllDeclaration"===e.type||"DeclareExportDeclaration"===e.type&&(!e.declaration||"TypeAlias"!==e.declaration.type&&"InterfaceDeclaration"!==e.declaration.type)}(e)?"DeclareModuleExports"===e.type&&(i&&r.raise(Gg.DuplicateDeclareModuleExports,e),"ES"===o&&r.raise(Gg.AmbiguousDeclareModuleKind,e),o="CommonJS",i=!0):("CommonJS"===o&&r.raise(Gg.AmbiguousDeclareModuleKind,e),o="ES")})),t.kind=o||"CommonJS",this.finishNode(t,"DeclareModule")},r.flowParseDeclareExportDeclaration=function(e,t){if(this.expect(82),this.eat(65))return this.match(68)||this.match(80)?e.declaration=this.flowParseDeclare(this.startNode()):(e.declaration=this.flowParseType(),this.semicolon()),e.default=!0,this.finishNode(e,"DeclareExportDeclaration");if(this.match(75)||this.isLet()||(this.isContextual(130)||this.isContextual(129))&&!t){var r=this.state.value;throw this.raise(Gg.UnsupportedDeclareExportKind,this.state.startLoc,{unsupportedExportKind:r,suggestion:Hg[r]})}return this.match(74)||this.match(68)||this.match(80)||this.isContextual(131)?(e.declaration=this.flowParseDeclare(this.startNode()),e.default=!1,this.finishNode(e,"DeclareExportDeclaration")):this.match(55)||this.match(5)||this.isContextual(129)||this.isContextual(130)||this.isContextual(131)?("ExportNamedDeclaration"===(e=this.parseExport(e,null)).type&&(e.type="ExportDeclaration",e.default=!1,delete e.exportKind),e.type="Declare"+e.type,e):void this.unexpected()},r.flowParseDeclareModuleExports=function(e){return this.next(),this.expectContextual(111),e.typeAnnotation=this.flowParseTypeAnnotation(),this.semicolon(),this.finishNode(e,"DeclareModuleExports")},r.flowParseDeclareTypeAlias=function(e){this.next();var t=this.flowParseTypeAlias(e);return t.type="DeclareTypeAlias",t},r.flowParseDeclareOpaqueType=function(e){this.next();var t=this.flowParseOpaqueType(e,!0);return t.type="DeclareOpaqueType",t},r.flowParseDeclareInterface=function(e){return this.next(),this.flowParseInterfaceish(e,!1),this.finishNode(e,"DeclareInterface")},r.flowParseInterfaceish=function(e,t){if(e.id=this.flowParseRestrictedIdentifier(!t,!0),this.scope.declareName(e.id.name,t?_f:Af,e.id.loc.start),this.match(47)?e.typeParameters=this.flowParseTypeParameterDeclaration():e.typeParameters=null,e.extends=[],this.eat(81))do{e.extends.push(this.flowParseInterfaceExtends())}while(!t&&this.eat(12));if(t){if(e.implements=[],e.mixins=[],this.eatContextual(117))do{e.mixins.push(this.flowParseInterfaceExtends())}while(this.eat(12));if(this.eatContextual(113))do{e.implements.push(this.flowParseInterfaceExtends())}while(this.eat(12))}e.body=this.flowParseObjectType({allowStatic:t,allowExact:!1,allowSpread:!1,allowProto:t,allowInexact:!1})},r.flowParseInterfaceExtends=function(){var e=this.startNode();return e.id=this.flowParseQualifiedTypeIdentifier(),this.match(47)?e.typeParameters=this.flowParseTypeParameterInstantiation():e.typeParameters=null,this.finishNode(e,"InterfaceExtends")},r.flowParseInterface=function(e){return this.flowParseInterfaceish(e,!1),this.finishNode(e,"InterfaceDeclaration")},r.checkNotUnderscore=function(e){"_"===e&&this.raise(Gg.UnexpectedReservedUnderscore,this.state.startLoc)},r.checkReservedType=function(e,t,r){Wg.has(e)&&this.raise(r?Gg.AssignReservedType:Gg.UnexpectedReservedType,t,{reservedType:e})},r.flowParseRestrictedIdentifier=function(e,t){return this.checkReservedType(this.state.value,this.state.startLoc,t),this.parseIdentifier(e)},r.flowParseTypeAlias=function(e){return e.id=this.flowParseRestrictedIdentifier(!1,!0),this.scope.declareName(e.id.name,Af,e.id.loc.start),this.match(47)?e.typeParameters=this.flowParseTypeParameterDeclaration():e.typeParameters=null,e.right=this.flowParseTypeInitialiser(29),this.semicolon(),this.finishNode(e,"TypeAlias")},r.flowParseOpaqueType=function(e,t){return this.expectContextual(130),e.id=this.flowParseRestrictedIdentifier(!0,!0),this.scope.declareName(e.id.name,Af,e.id.loc.start),this.match(47)?e.typeParameters=this.flowParseTypeParameterDeclaration():e.typeParameters=null,e.supertype=null,this.match(14)&&(e.supertype=this.flowParseTypeInitialiser(14)),e.impltype=null,t||(e.impltype=this.flowParseTypeInitialiser(29)),this.semicolon(),this.finishNode(e,"OpaqueType")},r.flowParseTypeParameter=function(e){void 0===e&&(e=!1);var t=this.state.startLoc,r=this.startNode(),a=this.flowParseVariance(),n=this.flowParseTypeAnnotatableIdentifier();return r.name=n.name,r.variance=a,r.bound=n.typeAnnotation,this.match(29)?(this.eat(29),r.default=this.flowParseType()):e&&this.raise(Gg.MissingTypeParamDefault,t),this.finishNode(r,"TypeParameter")},r.flowParseTypeParameterDeclaration=function(){var e=this.state.inType,t=this.startNode();t.params=[],this.state.inType=!0,this.match(47)||this.match(143)?this.next():this.unexpected();var r=!1;do{var a=this.flowParseTypeParameter(r);t.params.push(a),a.default&&(r=!0),this.match(48)||this.expect(12)}while(!this.match(48));return this.expect(48),this.state.inType=e,this.finishNode(t,"TypeParameterDeclaration")},r.flowInTopLevelContext=function(e){if(this.curContext()===Tp.brace)return e();var t=this.state.context;this.state.context=[t[0]];try{return e()}finally{this.state.context=t}},r.flowParseTypeParameterInstantiationInExpression=function(){if(47===this.reScan_lt())return this.flowParseTypeParameterInstantiation()},r.flowParseTypeParameterInstantiation=function(){var e=this,t=this.startNode(),r=this.state.inType;return this.state.inType=!0,t.params=[],this.flowInTopLevelContext((function(){e.expect(47);var r=e.state.noAnonFunctionType;for(e.state.noAnonFunctionType=!1;!e.match(48);)t.params.push(e.flowParseType()),e.match(48)||e.expect(12);e.state.noAnonFunctionType=r})),this.state.inType=r,this.state.inType||this.curContext()!==Tp.brace||this.reScan_lt_gt(),this.expect(48),this.finishNode(t,"TypeParameterInstantiation")},r.flowParseTypeParameterInstantiationCallOrNew=function(){if(47===this.reScan_lt()){var e=this.startNode(),t=this.state.inType;for(e.params=[],this.state.inType=!0,this.expect(47);!this.match(48);)e.params.push(this.flowParseTypeOrImplicitInstantiation()),this.match(48)||this.expect(12);return this.expect(48),this.state.inType=t,this.finishNode(e,"TypeParameterInstantiation")}},r.flowParseInterfaceType=function(){var e=this.startNode();if(this.expectContextual(129),e.extends=[],this.eat(81))do{e.extends.push(this.flowParseInterfaceExtends())}while(this.eat(12));return e.body=this.flowParseObjectType({allowStatic:!1,allowExact:!1,allowSpread:!1,allowProto:!1,allowInexact:!1}),this.finishNode(e,"InterfaceTypeAnnotation")},r.flowParseObjectPropertyKey=function(){return this.match(135)||this.match(134)?e.prototype.parseExprAtom.call(this):this.parseIdentifier(!0)},r.flowParseObjectTypeIndexer=function(e,t,r){return e.static=t,14===this.lookahead().type?(e.id=this.flowParseObjectPropertyKey(),e.key=this.flowParseTypeInitialiser()):(e.id=null,e.key=this.flowParseType()),this.expect(3),e.value=this.flowParseTypeInitialiser(),e.variance=r,this.finishNode(e,"ObjectTypeIndexer")},r.flowParseObjectTypeInternalSlot=function(e,t){return e.static=t,e.id=this.flowParseObjectPropertyKey(),this.expect(3),this.expect(3),this.match(47)||this.match(10)?(e.method=!0,e.optional=!1,e.value=this.flowParseObjectTypeMethodish(this.startNodeAt(e.loc.start))):(e.method=!1,this.eat(17)&&(e.optional=!0),e.value=this.flowParseTypeInitialiser()),this.finishNode(e,"ObjectTypeInternalSlot")},r.flowParseObjectTypeMethodish=function(e){for(e.params=[],e.rest=null,e.typeParameters=null,e.this=null,this.match(47)&&(e.typeParameters=this.flowParseTypeParameterDeclaration()),this.expect(10),this.match(78)&&(e.this=this.flowParseFunctionTypeParam(!0),e.this.name=null,this.match(11)||this.expect(12));!this.match(11)&&!this.match(21);)e.params.push(this.flowParseFunctionTypeParam(!1)),this.match(11)||this.expect(12);return this.eat(21)&&(e.rest=this.flowParseFunctionTypeParam(!1)),this.expect(11),e.returnType=this.flowParseTypeInitialiser(),this.finishNode(e,"FunctionTypeAnnotation")},r.flowParseObjectTypeCallProperty=function(e,t){var r=this.startNode();return e.static=t,e.value=this.flowParseObjectTypeMethodish(r),this.finishNode(e,"ObjectTypeCallProperty")},r.flowParseObjectType=function(e){var t=e.allowStatic,r=e.allowExact,a=e.allowSpread,n=e.allowProto,s=e.allowInexact,o=this.state.inType;this.state.inType=!0;var i,d,c=this.startNode();c.callProperties=[],c.properties=[],c.indexers=[],c.internalSlots=[];var l=!1;for(r&&this.match(6)?(this.expect(6),i=9,d=!0):(this.expect(5),i=8,d=!1),c.exact=d;!this.match(i);){var u=!1,p=null,f=null,g=this.startNode();if(n&&this.isContextual(118)){var y=this.lookahead();14!==y.type&&17!==y.type&&(this.next(),p=this.state.startLoc,t=!1)}if(t&&this.isContextual(106)){var m=this.lookahead();14!==m.type&&17!==m.type&&(this.next(),u=!0)}var h=this.flowParseVariance();if(this.eat(0))null!=p&&this.unexpected(p),this.eat(0)?(h&&this.unexpected(h.loc.start),c.internalSlots.push(this.flowParseObjectTypeInternalSlot(g,u))):c.indexers.push(this.flowParseObjectTypeIndexer(g,u,h));else if(this.match(10)||this.match(47))null!=p&&this.unexpected(p),h&&this.unexpected(h.loc.start),c.callProperties.push(this.flowParseObjectTypeCallProperty(g,u));else{var b="init";if(this.isContextual(99)||this.isContextual(104))Jp(this.lookahead().type)&&(b=this.state.value,this.next());var v=this.flowParseObjectTypeProperty(g,u,p,h,b,a,null!=s?s:!d);null===v?(l=!0,f=this.state.lastTokStartLoc):c.properties.push(v)}this.flowObjectTypeSemicolon(),!f||this.match(8)||this.match(9)||this.raise(Gg.UnexpectedExplicitInexactInObject,f)}this.expect(i),a&&(c.inexact=l);var x=this.finishNode(c,"ObjectTypeAnnotation");return this.state.inType=o,x},r.flowParseObjectTypeProperty=function(e,t,r,a,n,s,o){if(this.eat(21))return this.match(12)||this.match(13)||this.match(8)||this.match(9)?(s?o||this.raise(Gg.InexactInsideExact,this.state.lastTokStartLoc):this.raise(Gg.InexactInsideNonObject,this.state.lastTokStartLoc),a&&this.raise(Gg.InexactVariance,a),null):(s||this.raise(Gg.UnexpectedSpreadType,this.state.lastTokStartLoc),null!=r&&this.unexpected(r),a&&this.raise(Gg.SpreadVariance,a),e.argument=this.flowParseType(),this.finishNode(e,"ObjectTypeSpreadProperty"));e.key=this.flowParseObjectPropertyKey(),e.static=t,e.proto=null!=r,e.kind=n;var i=!1;return this.match(47)||this.match(10)?(e.method=!0,null!=r&&this.unexpected(r),a&&this.unexpected(a.loc.start),e.value=this.flowParseObjectTypeMethodish(this.startNodeAt(e.loc.start)),"get"!==n&&"set"!==n||this.flowCheckGetterSetterParams(e),!s&&"constructor"===e.key.name&&e.value.this&&this.raise(Gg.ThisParamBannedInConstructor,e.value.this)):("init"!==n&&this.unexpected(),e.method=!1,this.eat(17)&&(i=!0),e.value=this.flowParseTypeInitialiser(),e.variance=a),e.optional=i,this.finishNode(e,"ObjectTypeProperty")},r.flowCheckGetterSetterParams=function(e){var t="get"===e.kind?0:1,r=e.value.params.length+(e.value.rest?1:0);e.value.this&&this.raise("get"===e.kind?Gg.GetterMayNotHaveThisParam:Gg.SetterMayNotHaveThisParam,e.value.this),r!==t&&this.raise("get"===e.kind?dp.BadGetterArity:dp.BadSetterArity,e),"set"===e.kind&&e.value.rest&&this.raise(dp.BadSetterRestParameter,e)},r.flowObjectTypeSemicolon=function(){this.eat(13)||this.eat(12)||this.match(8)||this.match(9)||this.unexpected()},r.flowParseQualifiedTypeIdentifier=function(e,t){null!=e||(e=this.state.startLoc);for(var r=t||this.flowParseRestrictedIdentifier(!0);this.eat(16);){var a=this.startNodeAt(e);a.qualification=r,a.id=this.flowParseRestrictedIdentifier(!0),r=this.finishNode(a,"QualifiedTypeIdentifier")}return r},r.flowParseGenericType=function(e,t){var r=this.startNodeAt(e);return r.typeParameters=null,r.id=this.flowParseQualifiedTypeIdentifier(e,t),this.match(47)&&(r.typeParameters=this.flowParseTypeParameterInstantiation()),this.finishNode(r,"GenericTypeAnnotation")},r.flowParseTypeofType=function(){var e=this.startNode();return this.expect(87),e.argument=this.flowParsePrimaryType(),this.finishNode(e,"TypeofTypeAnnotation")},r.flowParseTupleType=function(){var e=this.startNode();for(e.types=[],this.expect(0);this.state.pos0){var g=[].concat(o);if(f.length>0){this.state=s,this.state.noArrowAt=g;for(var y=0;y1&&this.raise(Gg.AmbiguousConditionalArrow,s.startLoc),l&&1===p.length){this.state=s,g.push(p[0].start),this.state.noArrowAt=g;var b=this.tryParseConditionalConsequent();c=b.consequent,l=b.failed}}return this.getArrowLikeExpressions(c,!0),this.state.noArrowAt=o,this.expect(14),i.test=e,i.consequent=c,i.alternate=this.forwardNoArrowParamsConversionAt(i,(function(){return a.parseMaybeAssign(void 0,void 0)})),this.finishNode(i,"ConditionalExpression")},r.tryParseConditionalConsequent=function(){this.state.noArrowParamsConversionAt.push(this.state.start);var e=this.parseMaybeAssignAllowIn(),t=!this.match(14);return this.state.noArrowParamsConversionAt.pop(),{consequent:e,failed:t}},r.getArrowLikeExpressions=function(e,t){for(var r=this,a=[e],n=[];0!==a.length;){var s=a.pop();"ArrowFunctionExpression"===s.type&&"BlockStatement"!==s.body.type?(s.typeParameters||!s.returnType?this.finishArrowValidation(s):n.push(s),a.push(s.body)):"ConditionalExpression"===s.type&&(a.push(s.consequent),a.push(s.alternate))}return t?(n.forEach((function(e){return r.finishArrowValidation(e)})),[n,[]]):function(e,t){for(var r=[],a=[],n=0;n1)&&t||this.raise(Gg.TypeCastInPattern,n.typeAnnotation)}return e},r.parseArrayLike=function(t,r,a,n){var s=e.prototype.parseArrayLike.call(this,t,r,a,n);return r&&!this.state.maybeInArrowParameters&&this.toReferencedList(s.elements),s},r.isValidLVal=function(t,r,a){return"TypeCastExpression"===t||e.prototype.isValidLVal.call(this,t,r,a)},r.parseClassProperty=function(t){return this.match(14)&&(t.typeAnnotation=this.flowParseTypeAnnotation()),e.prototype.parseClassProperty.call(this,t)},r.parseClassPrivateProperty=function(t){return this.match(14)&&(t.typeAnnotation=this.flowParseTypeAnnotation()),e.prototype.parseClassPrivateProperty.call(this,t)},r.isClassMethod=function(){return this.match(47)||e.prototype.isClassMethod.call(this)},r.isClassProperty=function(){return this.match(14)||e.prototype.isClassProperty.call(this)},r.isNonstaticConstructor=function(t){return!this.match(14)&&e.prototype.isNonstaticConstructor.call(this,t)},r.pushClassMethod=function(t,r,a,n,s,o){if(r.variance&&this.unexpected(r.variance.loc.start),delete r.variance,this.match(47)&&(r.typeParameters=this.flowParseTypeParameterDeclaration()),e.prototype.pushClassMethod.call(this,t,r,a,n,s,o),r.params&&s){var i=r.params;i.length>0&&this.isThisParam(i[0])&&this.raise(Gg.ThisParamBannedInConstructor,r)}else if("MethodDefinition"===r.type&&s&&r.value.params){var d=r.value.params;d.length>0&&this.isThisParam(d[0])&&this.raise(Gg.ThisParamBannedInConstructor,r)}},r.pushClassPrivateMethod=function(t,r,a,n){r.variance&&this.unexpected(r.variance.loc.start),delete r.variance,this.match(47)&&(r.typeParameters=this.flowParseTypeParameterDeclaration()),e.prototype.pushClassPrivateMethod.call(this,t,r,a,n)},r.parseClassSuper=function(t){if(e.prototype.parseClassSuper.call(this,t),t.superClass&&(this.match(47)||this.match(51))&&(t.superTypeParameters=this.flowParseTypeParameterInstantiationInExpression()),this.isContextual(113)){this.next();var r=t.implements=[];do{var a=this.startNode();a.id=this.flowParseRestrictedIdentifier(!0),this.match(47)?a.typeParameters=this.flowParseTypeParameterInstantiation():a.typeParameters=null,r.push(this.finishNode(a,"ClassImplements"))}while(this.eat(12))}},r.checkGetterSetterParams=function(t){e.prototype.checkGetterSetterParams.call(this,t);var r=this.getObjectOrClassMethodParams(t);if(r.length>0){var a=r[0];this.isThisParam(a)&&"get"===t.kind?this.raise(Gg.GetterMayNotHaveThisParam,a):this.isThisParam(a)&&this.raise(Gg.SetterMayNotHaveThisParam,a)}},r.parsePropertyNamePrefixOperator=function(e){e.variance=this.flowParseVariance()},r.parseObjPropValue=function(t,r,a,n,s,o,i){var d;t.variance&&this.unexpected(t.variance.loc.start),delete t.variance,this.match(47)&&!o&&(d=this.flowParseTypeParameterDeclaration(),this.match(10)||this.unexpected());var c=e.prototype.parseObjPropValue.call(this,t,r,a,n,s,o,i);return d&&((c.value||c).typeParameters=d),c},r.parseFunctionParamType=function(e){return this.eat(17)&&("Identifier"!==e.type&&this.raise(Gg.PatternIsOptional,e),this.isThisParam(e)&&this.raise(Gg.ThisParamMayNotBeOptional,e),e.optional=!0),this.match(14)?e.typeAnnotation=this.flowParseTypeAnnotation():this.isThisParam(e)&&this.raise(Gg.ThisParamAnnotationRequired,e),this.match(29)&&this.isThisParam(e)&&this.raise(Gg.ThisParamNoDefault,e),this.resetEndLocation(e),e},r.parseMaybeDefault=function(t,r){var a=e.prototype.parseMaybeDefault.call(this,t,r);return"AssignmentPattern"===a.type&&a.typeAnnotation&&a.right.start0&&this.raise(Gg.ThisParamMustBeFirst,t.params[s]);e.prototype.checkParams.call(this,t,r,a,n)}},r.parseParenAndDistinguishExpression=function(t){return e.prototype.parseParenAndDistinguishExpression.call(this,t&&!this.state.noArrowAt.includes(this.sourceToOffsetPos(this.state.start)))},r.parseSubscripts=function(t,r,a){var n=this;if("Identifier"===t.type&&"async"===t.name&&this.state.noArrowAt.includes(r.index)){this.next();var s=this.startNodeAt(r);s.callee=t,s.arguments=e.prototype.parseCallExpressionArguments.call(this,11),t=this.finishNode(s,"CallExpression")}else if("Identifier"===t.type&&"async"===t.name&&this.match(47)){var o=this.state.clone(),i=this.tryParse((function(e){return n.parseAsyncArrowWithTypeParameters(r)||e()}),o);if(!i.error&&!i.aborted)return i.node;var d=this.tryParse((function(){return e.prototype.parseSubscripts.call(n,t,r,a)}),o);if(d.node&&!d.error)return d.node;if(i.node)return this.state=i.failState,i.node;if(d.node)return this.state=d.failState,d.node;throw i.error||d.error}return e.prototype.parseSubscripts.call(this,t,r,a)},r.parseSubscript=function(t,r,a,n){var s=this;if(this.match(18)&&this.isLookaheadToken_lt()){if(n.optionalChainMember=!0,a)return n.stop=!0,t;this.next();var o=this.startNodeAt(r);return o.callee=t,o.typeArguments=this.flowParseTypeParameterInstantiationInExpression(),this.expect(10),o.arguments=this.parseCallExpressionArguments(11),o.optional=!0,this.finishCallExpression(o,!0)}if(!a&&this.shouldParseTypes()&&(this.match(47)||this.match(51))){var i=this.startNodeAt(r);i.callee=t;var d=this.tryParse((function(){return i.typeArguments=s.flowParseTypeParameterInstantiationCallOrNew(),s.expect(10),i.arguments=e.prototype.parseCallExpressionArguments.call(s,11),n.optionalChainMember&&(i.optional=!1),s.finishCallExpression(i,n.optionalChainMember)}));if(d.node)return d.error&&(this.state=d.failState),d.node}return e.prototype.parseSubscript.call(this,t,r,a,n)},r.parseNewCallee=function(t){var r=this;e.prototype.parseNewCallee.call(this,t);var a=null;this.shouldParseTypes()&&this.match(47)&&(a=this.tryParse((function(){return r.flowParseTypeParameterInstantiationCallOrNew()})).node),t.typeArguments=a},r.parseAsyncArrowWithTypeParameters=function(t){var r=this.startNodeAt(t);if(this.parseFunctionParams(r,!1),this.parseArrow(r))return e.prototype.parseArrowExpression.call(this,r,void 0,!0)},r.readToken_mult_modulo=function(t){var r=this.input.charCodeAt(this.state.pos+1);if(42===t&&47===r&&this.state.hasFlowComment)return this.state.hasFlowComment=!1,this.state.pos+=2,void this.nextToken();e.prototype.readToken_mult_modulo.call(this,t)},r.readToken_pipe_amp=function(t){var r=this.input.charCodeAt(this.state.pos+1);124!==t||125!==r?e.prototype.readToken_pipe_amp.call(this,t):this.finishOp(9,2)},r.parseTopLevel=function(t,r){var a=e.prototype.parseTopLevel.call(this,t,r);return this.state.hasFlowComment&&this.raise(Gg.UnterminatedFlowComment,this.state.curPosition()),a},r.skipBlockComment=function(){if(!this.hasPlugin("flowComments")||!this.skipFlowComment())return e.prototype.skipBlockComment.call(this,this.state.hasFlowComment?"*-/":"*/");if(this.state.hasFlowComment)throw this.raise(Gg.NestedFlowComment,this.state.startLoc);this.hasFlowCommentCompletion();var t=this.skipFlowComment();t&&(this.state.pos+=t,this.state.hasFlowComment=!0)},r.skipFlowComment=function(){for(var e=this.state.pos,t=2;[32,9].includes(this.input.charCodeAt(e+t));)t++;var r=this.input.charCodeAt(t+e),a=this.input.charCodeAt(t+e+1);return 58===r&&58===a?t+2:"flow-include"===this.input.slice(t+e,t+e+12)?t+12:58===r&&58!==a&&t},r.hasFlowCommentCompletion=function(){if(-1===this.input.indexOf("*/",this.state.pos))throw this.raise(dp.UnterminatedComment,this.state.curPosition())},r.flowEnumErrorBooleanMemberNotInitialized=function(e,t){var r=t.enumName,a=t.memberName;this.raise(Gg.EnumBooleanMemberNotInitialized,e,{memberName:a,enumName:r})},r.flowEnumErrorInvalidMemberInitializer=function(e,t){return this.raise(t.explicitType?"symbol"===t.explicitType?Gg.EnumInvalidMemberInitializerSymbolType:Gg.EnumInvalidMemberInitializerPrimaryType:Gg.EnumInvalidMemberInitializerUnknownType,e,t)},r.flowEnumErrorNumberMemberNotInitialized=function(e,t){this.raise(Gg.EnumNumberMemberNotInitialized,e,t)},r.flowEnumErrorStringMemberInconsistentlyInitialized=function(e,t){this.raise(Gg.EnumStringMemberInconsistentlyInitialized,e,t)},r.flowEnumMemberInit=function(){var e=this,t=this.state.startLoc,r=function(){return e.match(12)||e.match(8)};switch(this.state.type){case 135:var a=this.parseNumericLiteral(this.state.value);return r()?{type:"number",loc:a.loc.start,value:a}:{type:"invalid",loc:t};case 134:var n=this.parseStringLiteral(this.state.value);return r()?{type:"string",loc:n.loc.start,value:n}:{type:"invalid",loc:t};case 85:case 86:var s=this.parseBooleanLiteral(this.match(85));return r()?{type:"boolean",loc:s.loc.start,value:s}:{type:"invalid",loc:t};default:return{type:"invalid",loc:t}}},r.flowEnumMemberRaw=function(){var e=this.state.startLoc;return{id:this.parseIdentifier(!0),init:this.eat(29)?this.flowEnumMemberInit():{type:"none",loc:e}}},r.flowEnumCheckExplicitTypeMismatch=function(e,t,r){var a=t.explicitType;null!==a&&a!==r&&this.flowEnumErrorInvalidMemberInitializer(e,t)},r.flowEnumMembers=function(e){for(var t=e.enumName,r=e.explicitType,a=new Set,n={booleanMembers:[],numberMembers:[],stringMembers:[],defaultedMembers:[]},s=!1;!this.match(8);){if(this.eat(21)){s=!0;break}var o=this.startNode(),i=this.flowEnumMemberRaw(),d=i.id,c=i.init,l=d.name;if(""!==l){/^[a-z]/.test(l)&&this.raise(Gg.EnumInvalidMemberName,d,{memberName:l,suggestion:l[0].toUpperCase()+l.slice(1),enumName:t}),a.has(l)&&this.raise(Gg.EnumDuplicateMemberName,d,{memberName:l,enumName:t}),a.add(l);var u={enumName:t,explicitType:r,memberName:l};switch(o.id=d,c.type){case"boolean":this.flowEnumCheckExplicitTypeMismatch(c.loc,u,"boolean"),o.init=c.value,n.booleanMembers.push(this.finishNode(o,"EnumBooleanMember"));break;case"number":this.flowEnumCheckExplicitTypeMismatch(c.loc,u,"number"),o.init=c.value,n.numberMembers.push(this.finishNode(o,"EnumNumberMember"));break;case"string":this.flowEnumCheckExplicitTypeMismatch(c.loc,u,"string"),o.init=c.value,n.stringMembers.push(this.finishNode(o,"EnumStringMember"));break;case"invalid":throw this.flowEnumErrorInvalidMemberInitializer(c.loc,u);case"none":switch(r){case"boolean":this.flowEnumErrorBooleanMemberNotInitialized(c.loc,u);break;case"number":this.flowEnumErrorNumberMemberNotInitialized(c.loc,u);break;default:n.defaultedMembers.push(this.finishNode(o,"EnumDefaultedMember"))}}this.match(8)||this.expect(12)}}return{members:n,hasUnknownMembers:s}},r.flowEnumStringMembers=function(e,t,r){var a=r.enumName;if(0===e.length)return t;if(0===t.length)return e;if(t.length>e.length){for(var n=0;n=f){for(var g=0,y=i.defaultedMembers;g=f){for(var h=0,b=i.defaultedMembers;h0&&(this.raise(dp.BadGetterArity,this.state.curPosition()),this.isThisParam(a[n][0])&&this.raise(iy.AccessorCannotDeclareThisParameter,this.state.curPosition()));else if("set"===a.kind){if(1!==a[n].length)this.raise(dp.BadSetterArity,this.state.curPosition());else{var o=a[n][0];this.isThisParam(o)&&this.raise(iy.AccessorCannotDeclareThisParameter,this.state.curPosition()),"Identifier"===o.type&&o.optional&&this.raise(iy.SetAccessorCannotHaveOptionalParameter,this.state.curPosition()),"RestElement"===o.type&&this.raise(iy.SetAccessorCannotHaveRestParameter,this.state.curPosition())}a[s]&&this.raise(iy.SetAccessorCannotHaveReturnType,a[s])}else a.kind="method";return this.finishNode(a,"TSMethodSignature")}var i=r;t&&(i.readonly=!0);var d=this.tsTryParseTypeAnnotation();return d&&(i.typeAnnotation=d),this.tsParseTypeMemberSemicolon(),this.finishNode(i,"TSPropertySignature")},r.tsParseTypeMember=function(){var t=this.startNode();if(this.match(10)||this.match(47))return this.tsParseSignatureMember("TSCallSignatureDeclaration",t);if(this.match(77)){var r=this.startNode();return this.next(),this.match(10)||this.match(47)?this.tsParseSignatureMember("TSConstructSignatureDeclaration",t):(t.key=this.createIdentifier(r,"new"),this.tsParsePropertyOrMethodSignature(t,!1))}this.tsParseModifiers({allowedModifiers:["readonly"],disallowedModifiers:["declare","abstract","private","protected","public","static","override"]},t);var a=this.tsTryParseIndexSignature(t);return a||(e.prototype.parsePropertyName.call(this,t),t.computed||"Identifier"!==t.key.type||"get"!==t.key.name&&"set"!==t.key.name||!this.tsTokenCanFollowModifier()||(t.kind=t.key.name,e.prototype.parsePropertyName.call(this,t)),this.tsParsePropertyOrMethodSignature(t,!!t.readonly))},r.tsParseTypeLiteral=function(){var e=this.startNode();return e.members=this.tsParseObjectTypeMembers(),this.finishNode(e,"TSTypeLiteral")},r.tsParseObjectTypeMembers=function(){this.expect(5);var e=this.tsParseList("TypeMembers",this.tsParseTypeMember.bind(this));return this.expect(8),e},r.tsIsStartOfMappedType=function(){return this.next(),this.eat(53)?this.isContextual(122):(this.isContextual(122)&&this.next(),!!this.match(0)&&(this.next(),!!this.tsIsIdentifier()&&(this.next(),this.match(58))))},r.tsParseMappedType=function(){var e=this.startNode();this.expect(5),this.match(53)?(e.readonly=this.state.value,this.next(),this.expectContextual(122)):this.eatContextual(122)&&(e.readonly=!0),this.expect(0);var t=this.startNode();return t.name=this.tsParseTypeParameterName(),t.constraint=this.tsExpectThenParseType(58),e.typeParameter=this.finishNode(t,"TSTypeParameter"),e.nameType=this.eatContextual(93)?this.tsParseType():null,this.expect(3),this.match(53)?(e.optional=this.state.value,this.next(),this.expect(17)):this.eat(17)&&(e.optional=!0),e.typeAnnotation=this.tsTryParseType(),this.semicolon(),this.expect(8),this.finishNode(e,"TSMappedType")},r.tsParseTupleType=function(){var e=this,t=this.startNode();t.elementTypes=this.tsParseBracketedList("TupleElementTypes",this.tsParseTupleElementType.bind(this),!0,!1);var r=!1;return t.elementTypes.forEach((function(t){var a=t.type;!r||"TSRestType"===a||"TSOptionalType"===a||"TSNamedTupleMember"===a&&t.optional||e.raise(iy.OptionalTypeBeforeRequired,t),r||(r="TSNamedTupleMember"===a&&t.optional||"TSOptionalType"===a)})),this.finishNode(t,"TSTupleType")},r.tsParseTupleElementType=function(){var e,t,r,a,n,s=this.state.startLoc,o=this.eat(21),i=this.state.startLoc,d=zp(this.state.type)?this.lookaheadCharCode():null;if(58===d)e=!0,r=!1,t=this.parseIdentifier(!0),this.expect(14),a=this.tsParseType();else if(63===d){r=!0;var c=this.state.value,l=this.tsParseNonArrayType();58===this.lookaheadCharCode()?(e=!0,t=this.createIdentifier(this.startNodeAt(i),c),this.expect(17),this.expect(14),a=this.tsParseType()):(e=!1,a=l,this.expect(17))}else a=this.tsParseType(),r=this.eat(17),e=this.eat(14);if(e)t?((n=this.startNodeAt(i)).optional=r,n.label=t,n.elementType=a,this.eat(17)&&(n.optional=!0,this.raise(iy.TupleOptionalAfterType,this.state.lastTokStartLoc))):((n=this.startNodeAt(i)).optional=r,this.raise(iy.InvalidTupleMemberLabel,a),n.label=a,n.elementType=this.tsParseType()),a=this.finishNode(n,"TSNamedTupleMember");else if(r){var u=this.startNodeAt(i);u.typeAnnotation=a,a=this.finishNode(u,"TSOptionalType")}if(o){var p=this.startNodeAt(s);p.typeAnnotation=a,a=this.finishNode(p,"TSRestType")}return a},r.tsParseParenthesizedType=function(){var e=this.startNode();return this.expect(10),e.typeAnnotation=this.tsParseType(),this.expect(11),this.finishNode(e,"TSParenthesizedType")},r.tsParseFunctionOrConstructorType=function(e,t){var r=this,a=this.startNode();return"TSConstructorType"===e&&(a.abstract=!!t,t&&this.next(),this.next()),this.tsInAllowConditionalTypesContext((function(){return r.tsFillSignature(19,a)})),this.finishNode(a,e)},r.tsParseLiteralTypeNode=function(){var t=this.startNode();switch(this.state.type){case 135:case 136:case 134:case 85:case 86:t.literal=e.prototype.parseExprAtom.call(this);break;default:this.unexpected()}return this.finishNode(t,"TSLiteralType")},r.tsParseTemplateLiteralType=function(){var t=this.startNode();return t.literal=e.prototype.parseTemplate.call(this,!1),this.finishNode(t,"TSLiteralType")},r.parseTemplateSubstitution=function(){return this.state.inType?this.tsParseType():e.prototype.parseTemplateSubstitution.call(this)},r.tsParseThisTypeOrThisTypePredicate=function(){var e=this.tsParseThisTypeNode();return this.isContextual(116)&&!this.hasPrecedingLineBreak()?this.tsParseThisTypePredicate(e):e},r.tsParseNonArrayType=function(){switch(this.state.type){case 134:case 135:case 136:case 85:case 86:return this.tsParseLiteralTypeNode();case 53:if("-"===this.state.value){var e=this.startNode(),t=this.lookahead();return 135!==t.type&&136!==t.type&&this.unexpected(),e.literal=this.parseMaybeUnary(),this.finishNode(e,"TSLiteralType")}break;case 78:return this.tsParseThisTypeOrThisTypePredicate();case 87:return this.tsParseTypeQuery();case 83:return this.tsParseImportType();case 5:return this.tsLookAhead(this.tsIsStartOfMappedType.bind(this))?this.tsParseMappedType():this.tsParseTypeLiteral();case 0:return this.tsParseTupleType();case 10:return this.tsParseParenthesizedType();case 25:case 24:return this.tsParseTemplateLiteralType();default:var r=this.state.type;if(Kp(r)||88===r||84===r){var a=88===r?"TSVoidKeyword":84===r?"TSNullKeyword":function(e){switch(e){case"any":return"TSAnyKeyword";case"boolean":return"TSBooleanKeyword";case"bigint":return"TSBigIntKeyword";case"never":return"TSNeverKeyword";case"number":return"TSNumberKeyword";case"object":return"TSObjectKeyword";case"string":return"TSStringKeyword";case"symbol":return"TSSymbolKeyword";case"undefined":return"TSUndefinedKeyword";case"unknown":return"TSUnknownKeyword";default:return}}(this.state.value);if(void 0!==a&&46!==this.lookaheadCharCode()){var n=this.startNode();return this.next(),this.finishNode(n,a)}return this.tsParseTypeReference()}}this.unexpected()},r.tsParseArrayTypeOrHigher=function(){for(var e=this.state.startLoc,t=this.tsParseNonArrayType();!this.hasPrecedingLineBreak()&&this.eat(0);)if(this.match(3)){var r=this.startNodeAt(e);r.elementType=t,this.expect(3),t=this.finishNode(r,"TSArrayType")}else{var a=this.startNodeAt(e);a.objectType=t,a.indexType=this.tsParseType(),this.expect(3),t=this.finishNode(a,"TSIndexedAccessType")}return t},r.tsParseTypeOperator=function(){var e=this.startNode(),t=this.state.value;return this.next(),e.operator=t,e.typeAnnotation=this.tsParseTypeOperatorOrHigher(),"readonly"===t&&this.tsCheckTypeAnnotationForReadOnly(e),this.finishNode(e,"TSTypeOperator")},r.tsCheckTypeAnnotationForReadOnly=function(e){switch(e.typeAnnotation.type){case"TSTupleType":case"TSArrayType":return;default:this.raise(iy.UnexpectedReadonly,e)}},r.tsParseInferType=function(){var e=this,t=this.startNode();this.expectContextual(115);var r=this.startNode();return r.name=this.tsParseTypeParameterName(),r.constraint=this.tsTryParse((function(){return e.tsParseConstraintForInferType()})),t.typeParameter=this.finishNode(r,"TSTypeParameter"),this.finishNode(t,"TSInferType")},r.tsParseConstraintForInferType=function(){var e=this;if(this.eat(81)){var t=this.tsInDisallowConditionalTypesContext((function(){return e.tsParseType()}));if(this.state.inDisallowConditionalTypesContext||!this.match(17))return t}},r.tsParseTypeOperatorOrHigher=function(){var e,t=this;return(e=this.state.type)>=121&&e<=123&&!this.state.containsEsc?this.tsParseTypeOperator():this.isContextual(115)?this.tsParseInferType():this.tsInAllowConditionalTypesContext((function(){return t.tsParseArrayTypeOrHigher()}))},r.tsParseUnionOrIntersectionType=function(e,t,r){var a=this.startNode(),n=this.eat(r),s=[];do{s.push(t())}while(this.eat(r));return 1!==s.length||n?(a.types=s,this.finishNode(a,e)):s[0]},r.tsParseIntersectionTypeOrHigher=function(){return this.tsParseUnionOrIntersectionType("TSIntersectionType",this.tsParseTypeOperatorOrHigher.bind(this),45)},r.tsParseUnionTypeOrHigher=function(){return this.tsParseUnionOrIntersectionType("TSUnionType",this.tsParseIntersectionTypeOrHigher.bind(this),43)},r.tsIsStartOfFunctionType=function(){return!!this.match(47)||this.match(10)&&this.tsLookAhead(this.tsIsUnambiguouslyStartOfFunctionType.bind(this))},r.tsSkipParameterStart=function(){if(Kp(this.state.type)||this.match(78))return this.next(),!0;if(this.match(5)){var t=this.state.errors,r=t.length;try{return this.parseObjectLike(8,!0),t.length===r}catch(e){return!1}}if(this.match(0)){this.next();var a=this.state.errors,n=a.length;try{return e.prototype.parseBindingList.call(this,3,93,ry),a.length===n}catch(e){return!1}}return!1},r.tsIsUnambiguouslyStartOfFunctionType=function(){if(this.next(),this.match(11)||this.match(21))return!0;if(this.tsSkipParameterStart()){if(this.match(14)||this.match(12)||this.match(17)||this.match(29))return!0;if(this.match(11)&&(this.next(),this.match(19)))return!0}return!1},r.tsParseTypeOrTypePredicateAnnotation=function(e){var t=this;return this.tsInType((function(){var r=t.startNode();t.expect(e);var a=t.startNode(),n=!!t.tsTryParse(t.tsParseTypePredicateAsserts.bind(t));if(n&&t.match(78)){var s=t.tsParseThisTypeOrThisTypePredicate();return"TSThisType"===s.type?(a.parameterName=s,a.asserts=!0,a.typeAnnotation=null,s=t.finishNode(a,"TSTypePredicate")):(t.resetStartLocationFromNode(s,a),s.asserts=!0),r.typeAnnotation=s,t.finishNode(r,"TSTypeAnnotation")}var o=t.tsIsIdentifier()&&t.tsTryParse(t.tsParseTypePredicatePrefix.bind(t));if(!o)return n?(a.parameterName=t.parseIdentifier(),a.asserts=n,a.typeAnnotation=null,r.typeAnnotation=t.finishNode(a,"TSTypePredicate"),t.finishNode(r,"TSTypeAnnotation")):t.tsParseTypeAnnotation(!1,r);var i=t.tsParseTypeAnnotation(!1);return a.parameterName=o,a.typeAnnotation=i,a.asserts=n,r.typeAnnotation=t.finishNode(a,"TSTypePredicate"),t.finishNode(r,"TSTypeAnnotation")}))},r.tsTryParseTypeOrTypePredicateAnnotation=function(){if(this.match(14))return this.tsParseTypeOrTypePredicateAnnotation(14)},r.tsTryParseTypeAnnotation=function(){if(this.match(14))return this.tsParseTypeAnnotation()},r.tsTryParseType=function(){return this.tsEatThenParseType(14)},r.tsParseTypePredicatePrefix=function(){var e=this.parseIdentifier();if(this.isContextual(116)&&!this.hasPrecedingLineBreak())return this.next(),e},r.tsParseTypePredicateAsserts=function(){if(109!==this.state.type)return!1;var e=this.state.containsEsc;return this.next(),!(!Kp(this.state.type)&&!this.match(78))&&(e&&this.raise(dp.InvalidEscapedReservedWord,this.state.lastTokStartLoc,{reservedWord:"asserts"}),!0)},r.tsParseTypeAnnotation=function(e,t){var r=this;return void 0===e&&(e=!0),void 0===t&&(t=this.startNode()),this.tsInType((function(){e&&r.expect(14),t.typeAnnotation=r.tsParseType()})),this.finishNode(t,"TSTypeAnnotation")},r.tsParseType=function(){var e=this;oy(this.state.inType);var t=this.tsParseNonConditionalType();if(this.state.inDisallowConditionalTypesContext||this.hasPrecedingLineBreak()||!this.eat(81))return t;var r=this.startNodeAtNode(t);return r.checkType=t,r.extendsType=this.tsInDisallowConditionalTypesContext((function(){return e.tsParseNonConditionalType()})),this.expect(17),r.trueType=this.tsInAllowConditionalTypesContext((function(){return e.tsParseType()})),this.expect(14),r.falseType=this.tsInAllowConditionalTypesContext((function(){return e.tsParseType()})),this.finishNode(r,"TSConditionalType")},r.isAbstractConstructorSignature=function(){return this.isContextual(124)&&77===this.lookahead().type},r.tsParseNonConditionalType=function(){return this.tsIsStartOfFunctionType()?this.tsParseFunctionOrConstructorType("TSFunctionType"):this.match(77)?this.tsParseFunctionOrConstructorType("TSConstructorType"):this.isAbstractConstructorSignature()?this.tsParseFunctionOrConstructorType("TSConstructorType",!0):this.tsParseUnionTypeOrHigher()},r.tsParseTypeAssertion=function(){var e=this;this.getPluginOption("typescript","disallowAmbiguousJSXLike")&&this.raise(iy.ReservedTypeAssertion,this.state.startLoc);var t=this.startNode();return t.typeAnnotation=this.tsInType((function(){return e.next(),e.match(75)?e.tsParseTypeReference():e.tsParseType()})),this.expect(48),t.expression=this.parseMaybeUnary(),this.finishNode(t,"TSTypeAssertion")},r.tsParseHeritageClause=function(e){var t=this,r=this.state.startLoc,a=this.tsParseDelimitedList("HeritageClauseElement",(function(){var e=t.startNode();return e.expression=t.tsParseEntityName(py|fy),t.match(47)&&(e.typeParameters=t.tsParseTypeArguments()),t.finishNode(e,"TSExpressionWithTypeArguments")}));return a.length||this.raise(iy.EmptyHeritageClauseType,r,{token:e}),a},r.tsParseInterfaceDeclaration=function(e,t){if(void 0===t&&(t={}),this.hasFollowingLineBreak())return null;this.expectContextual(129),t.declare&&(e.declare=!0),Kp(this.state.type)?(e.id=this.parseIdentifier(),this.checkIdentifier(e.id,If)):(e.id=null,this.raise(iy.MissingInterfaceName,this.state.startLoc)),e.typeParameters=this.tsTryParseTypeParameters(this.tsParseInOutConstModifiers),this.eat(81)&&(e.extends=this.tsParseHeritageClause("extends"));var r=this.startNode();return r.body=this.tsInType(this.tsParseObjectTypeMembers.bind(this)),e.body=this.finishNode(r,"TSInterfaceBody"),this.finishNode(e,"TSInterfaceDeclaration")},r.tsParseTypeAliasDeclaration=function(e){var t=this;return e.id=this.parseIdentifier(),this.checkIdentifier(e.id,Df),e.typeAnnotation=this.tsInType((function(){if(e.typeParameters=t.tsTryParseTypeParameters(t.tsParseInOutModifiers),t.expect(29),t.isContextual(114)&&16!==t.lookahead().type){var r=t.startNode();return t.next(),t.finishNode(r,"TSIntrinsicKeyword")}return t.tsParseType()})),this.semicolon(),this.finishNode(e,"TSTypeAliasDeclaration")},r.tsInTopLevelContext=function(e){if(this.curContext()===Tp.brace)return e();var t=this.state.context;this.state.context=[t[0]];try{return e()}finally{this.state.context=t}},r.tsInType=function(e){var t=this.state.inType;this.state.inType=!0;try{return e()}finally{this.state.inType=t}},r.tsInDisallowConditionalTypesContext=function(e){var t=this.state.inDisallowConditionalTypesContext;this.state.inDisallowConditionalTypesContext=!0;try{return e()}finally{this.state.inDisallowConditionalTypesContext=t}},r.tsInAllowConditionalTypesContext=function(e){var t=this.state.inDisallowConditionalTypesContext;this.state.inDisallowConditionalTypesContext=!1;try{return e()}finally{this.state.inDisallowConditionalTypesContext=t}},r.tsEatThenParseType=function(e){if(this.match(e))return this.tsNextThenParseType()},r.tsExpectThenParseType=function(e){var t=this;return this.tsInType((function(){return t.expect(e),t.tsParseType()}))},r.tsNextThenParseType=function(){var e=this;return this.tsInType((function(){return e.next(),e.tsParseType()}))},r.tsParseEnumMember=function(){var t=this.startNode();return t.id=this.match(134)?e.prototype.parseStringLiteral.call(this,this.state.value):this.parseIdentifier(!0),this.eat(29)&&(t.initializer=e.prototype.parseMaybeAssignAllowIn.call(this)),this.finishNode(t,"TSEnumMember")},r.tsParseEnumDeclaration=function(e,t){return void 0===t&&(t={}),t.const&&(e.const=!0),t.declare&&(e.declare=!0),this.expectContextual(126),e.id=this.parseIdentifier(),this.checkIdentifier(e.id,e.const?Ff:Of),this.expect(5),e.members=this.tsParseDelimitedList("EnumMembers",this.tsParseEnumMember.bind(this)),this.expect(8),this.finishNode(e,"TSEnumDeclaration")},r.tsParseEnumBody=function(){var e=this.startNode();return this.expect(5),e.members=this.tsParseDelimitedList("EnumMembers",this.tsParseEnumMember.bind(this)),this.expect(8),this.finishNode(e,"TSEnumBody")},r.tsParseModuleBlock=function(){var t=this.startNode();return this.scope.enter(af),this.expect(5),e.prototype.parseBlockOrModuleBlockBody.call(this,t.body=[],void 0,!0,8),this.scope.exit(),this.finishNode(t,"TSModuleBlock")},r.tsParseModuleOrNamespaceDeclaration=function(e,t){if(void 0===t&&(t=!1),e.id=this.parseIdentifier(),t||this.checkIdentifier(e.id,Lf),this.eat(16)){var r=this.startNode();this.tsParseModuleOrNamespaceDeclaration(r,!0),e.body=r}else this.scope.enter(ff),this.prodParam.enter(Pg),e.body=this.tsParseModuleBlock(),this.prodParam.exit(),this.scope.exit();return this.finishNode(e,"TSModuleDeclaration")},r.tsParseAmbientExternalModuleDeclaration=function(t){return this.isContextual(112)?(t.kind="global",t.global=!0,t.id=this.parseIdentifier()):this.match(134)?(t.kind="module",t.id=e.prototype.parseStringLiteral.call(this,this.state.value)):this.unexpected(),this.match(5)?(this.scope.enter(ff),this.prodParam.enter(Pg),t.body=this.tsParseModuleBlock(),this.prodParam.exit(),this.scope.exit()):this.semicolon(),this.finishNode(t,"TSModuleDeclaration")},r.tsParseImportEqualsDeclaration=function(e,t,r){e.isExport=r||!1,e.id=t||this.parseIdentifier(),this.checkIdentifier(e.id,qf),this.expect(29);var a=this.tsParseModuleReference();return"type"===e.importKind&&"TSExternalModuleReference"!==a.type&&this.raise(iy.ImportAliasHasImportType,a),e.moduleReference=a,this.semicolon(),this.finishNode(e,"TSImportEqualsDeclaration")},r.tsIsExternalModuleReference=function(){return this.isContextual(119)&&40===this.lookaheadCharCode()},r.tsParseModuleReference=function(){return this.tsIsExternalModuleReference()?this.tsParseExternalModuleReference():this.tsParseEntityName(uy)},r.tsParseExternalModuleReference=function(){var t=this.startNode();return this.expectContextual(119),this.expect(10),this.match(134)||this.unexpected(),t.expression=e.prototype.parseExprAtom.call(this),this.expect(11),this.sawUnambiguousESM=!0,this.finishNode(t,"TSExternalModuleReference")},r.tsLookAhead=function(e){var t=this.state.clone(),r=e();return this.state=t,r},r.tsTryParseAndCatch=function(e){var t=this.tryParse((function(t){return e()||t()}));if(!t.aborted&&t.node)return t.error&&(this.state=t.failState),t.node},r.tsTryParse=function(e){var t=this.state.clone(),r=e();if(void 0!==r&&!1!==r)return r;this.state=t},r.tsTryParseDeclare=function(t){var r=this;if(!this.isLineTerminator()){var a,n=this.state.type;return this.isContextual(100)&&(n=74,a="let"),this.tsInAmbientContext((function(){switch(n){case 68:return t.declare=!0,e.prototype.parseFunctionStatement.call(r,t,!1,!1);case 80:return t.declare=!0,r.parseClass(t,!0,!1);case 126:return r.tsParseEnumDeclaration(t,{declare:!0});case 112:return r.tsParseAmbientExternalModuleDeclaration(t);case 75:case 74:return r.match(75)&&r.isLookaheadContextual("enum")?(r.expect(75),r.tsParseEnumDeclaration(t,{const:!0,declare:!0})):(t.declare=!0,r.parseVarStatement(t,a||r.state.value,!0));case 129:var s=r.tsParseInterfaceDeclaration(t,{declare:!0});if(s)return s;default:if(Kp(n))return r.tsParseDeclaration(t,r.state.value,!0,null)}}))}},r.tsTryParseExportDeclaration=function(){return this.tsParseDeclaration(this.startNode(),this.state.value,!0,null)},r.tsParseExpressionStatement=function(e,t,r){switch(t.name){case"declare":var a=this.tsTryParseDeclare(e);return a&&(a.declare=!0),a;case"global":if(this.match(5)){this.scope.enter(ff),this.prodParam.enter(Pg);var n=e;return n.kind="global",e.global=!0,n.id=t,n.body=this.tsParseModuleBlock(),this.scope.exit(),this.prodParam.exit(),this.finishNode(n,"TSModuleDeclaration")}break;default:return this.tsParseDeclaration(e,t.name,!1,r)}},r.tsParseDeclaration=function(e,t,r,a){switch(t){case"abstract":if(this.tsCheckLineTerminator(r)&&(this.match(80)||Kp(this.state.type)))return this.tsParseAbstractDeclaration(e,a);break;case"module":if(this.tsCheckLineTerminator(r)){if(this.match(134))return this.tsParseAmbientExternalModuleDeclaration(e);if(Kp(this.state.type))return e.kind="module",this.tsParseModuleOrNamespaceDeclaration(e)}break;case"namespace":if(this.tsCheckLineTerminator(r)&&Kp(this.state.type))return e.kind="namespace",this.tsParseModuleOrNamespaceDeclaration(e);break;case"type":if(this.tsCheckLineTerminator(r)&&Kp(this.state.type))return this.tsParseTypeAliasDeclaration(e)}},r.tsCheckLineTerminator=function(e){return e?!this.hasFollowingLineBreak()&&(this.next(),!0):!this.isLineTerminator()},r.tsTryParseGenericAsyncArrowFunction=function(t){var r=this;if(this.match(47)){var a=this.state.maybeInArrowParameters;this.state.maybeInArrowParameters=!0;var n=this.tsTryParseAndCatch((function(){var a=r.startNodeAt(t);return a.typeParameters=r.tsParseTypeParameters(r.tsParseConstModifier),e.prototype.parseFunctionParams.call(r,a),a.returnType=r.tsTryParseTypeOrTypePredicateAnnotation(),r.expect(19),a}));if(this.state.maybeInArrowParameters=a,n)return e.prototype.parseArrowExpression.call(this,n,null,!0)}},r.tsParseTypeArgumentsInExpression=function(){if(47===this.reScan_lt())return this.tsParseTypeArguments()},r.tsParseTypeArguments=function(){var e=this,t=this.startNode();return t.params=this.tsInType((function(){return e.tsInTopLevelContext((function(){return e.expect(47),e.tsParseDelimitedList("TypeParametersOrArguments",e.tsParseType.bind(e))}))})),0===t.params.length?this.raise(iy.EmptyTypeArguments,t):this.state.inType||this.curContext()!==Tp.brace||this.reScan_lt_gt(),this.expect(48),this.finishNode(t,"TSTypeParameterInstantiation")},r.tsIsDeclarationStart=function(){return(e=this.state.type)>=124&&e<=130;var e},r.isExportDefaultSpecifier=function(){return!this.tsIsDeclarationStart()&&e.prototype.isExportDefaultSpecifier.call(this)},r.parseAssignableListItem=function(e,t){var r=this.state.startLoc,a={};this.tsParseModifiers({allowedModifiers:["public","private","protected","override","readonly"]},a);var n=a.accessibility,s=a.override,o=a.readonly;e&ny||!(n||o||s)||this.raise(iy.UnexpectedParameterModifier,r);var i=this.parseMaybeDefault();e&ay&&this.parseFunctionParamType(i);var d=this.parseMaybeDefault(i.loc.start,i);if(n||o||s){var c=this.startNodeAt(r);return t.length&&(c.decorators=t),n&&(c.accessibility=n),o&&(c.readonly=o),s&&(c.override=s),"Identifier"!==d.type&&"AssignmentPattern"!==d.type&&this.raise(iy.UnsupportedParameterPropertyKind,c),c.parameter=d,this.finishNode(c,"TSParameterProperty")}return t.length&&(i.decorators=t),d},r.isSimpleParameter=function(t){return"TSParameterProperty"===t.type&&e.prototype.isSimpleParameter.call(this,t.parameter)||e.prototype.isSimpleParameter.call(this,t)},r.tsDisallowOptionalPattern=function(e){for(var t=0,r=e.params;ta&&!this.hasPrecedingLineBreak()&&(this.isContextual(93)||(n=this.isContextual(120)))){var o=this.startNodeAt(r);return o.expression=t,o.typeAnnotation=this.tsInType((function(){return s.next(),s.match(75)?(n&&s.raise(dp.UnexpectedKeyword,s.state.startLoc,{keyword:"const"}),s.tsParseTypeReference()):s.tsParseType()})),this.finishNode(o,n?"TSSatisfiesExpression":"TSAsExpression"),this.reScan_lt_gt(),this.parseExprOp(o,r,a)}return e.prototype.parseExprOp.call(this,t,r,a)},r.checkReservedWord=function(t,r,a,n){this.state.isAmbientContext||e.prototype.checkReservedWord.call(this,t,r,a,n)},r.checkImportReflection=function(t){e.prototype.checkImportReflection.call(this,t),t.module&&"value"!==t.importKind&&this.raise(iy.ImportReflectionHasImportType,t.specifiers[0].loc.start)},r.checkDuplicateExports=function(){},r.isPotentialImportPhase=function(t){if(e.prototype.isPotentialImportPhase.call(this,t))return!0;if(this.isContextual(130)){var r=this.lookaheadCharCode();return t?123===r||42===r:61!==r}return!t&&this.isContextual(87)},r.applyImportPhase=function(t,r,a,n){e.prototype.applyImportPhase.call(this,t,r,a,n),r?t.exportKind="type"===a?"type":"value":t.importKind="type"===a||"typeof"===a?a:"value"},r.parseImport=function(t){if(this.match(134))return t.importKind="value",e.prototype.parseImport.call(this,t);var r;if(Kp(this.state.type)&&61===this.lookaheadCharCode())return t.importKind="value",this.tsParseImportEqualsDeclaration(t);if(this.isContextual(130)){var a=this.parseMaybeImportPhase(t,!1);if(61===this.lookaheadCharCode())return this.tsParseImportEqualsDeclaration(t,a);r=e.prototype.parseImportSpecifiersAndAfter.call(this,t,a)}else r=e.prototype.parseImport.call(this,t);return"type"===r.importKind&&r.specifiers.length>1&&"ImportDefaultSpecifier"===r.specifiers[0].type&&this.raise(iy.TypeImportCannotSpecifyDefaultAndNamed,r),r},r.parseExport=function(t,r){if(this.match(83)){var a=t;this.next();var n=null;return this.isContextual(130)&&this.isPotentialImportPhase(!1)?n=this.parseMaybeImportPhase(a,!1):a.importKind="value",this.tsParseImportEqualsDeclaration(a,n,!0)}if(this.eat(29)){var s=t;return s.expression=e.prototype.parseExpression.call(this),this.semicolon(),this.sawUnambiguousESM=!0,this.finishNode(s,"TSExportAssignment")}if(this.eatContextual(93)){var o=t;return this.expectContextual(128),o.id=this.parseIdentifier(),this.semicolon(),this.finishNode(o,"TSNamespaceExportDeclaration")}return e.prototype.parseExport.call(this,t,r)},r.isAbstractClass=function(){return this.isContextual(124)&&80===this.lookahead().type},r.parseExportDefaultExpression=function(){if(this.isAbstractClass()){var t=this.startNode();return this.next(),t.abstract=!0,this.parseClass(t,!0,!0)}if(this.match(129)){var r=this.tsParseInterfaceDeclaration(this.startNode());if(r)return r}return e.prototype.parseExportDefaultExpression.call(this)},r.parseVarStatement=function(t,r,a){void 0===a&&(a=!1);var n=this.state.isAmbientContext,s=e.prototype.parseVarStatement.call(this,t,r,a||n);if(!n)return s;for(var o=0,i=s.declarations;othis.offsetToSourcePos(this.state.lastTokEndLoc.index)&&this.raise(by.UnexpectedSpace,this.state.lastTokEndLoc)},o(t)}(e)}},jy=Object.keys(Ry),wy=function(e){function t(){return e.apply(this,arguments)||this}c(t,e);var r=t.prototype;return r.checkProto=function(e,t,r,a){if(!("SpreadElement"===e.type||this.isObjectMethod(e)||e.computed||e.shorthand)){var n=e.key;if("__proto__"===("Identifier"===n.type?n.name:n.value)){if(t)return void this.raise(dp.RecordNoProto,n);r.used&&(a?null===a.doubleProtoLoc&&(a.doubleProtoLoc=n.loc.start):this.raise(dp.DuplicateProto,n)),r.used=!0}}},r.shouldExitDescending=function(e,t){return"ArrowFunctionExpression"===e.type&&this.offsetToSourcePos(e.start)===t},r.getExpression=function(){this.enterInitialScopes(),this.nextToken();var e=this.parseExpression();return this.match(140)||this.unexpected(),this.finalizeRemainingComments(),e.comments=this.comments,e.errors=this.state.errors,this.optionFlags&mp&&(e.tokens=this.tokens),e},r.parseExpression=function(e,t){var r=this;return e?this.disallowInAnd((function(){return r.parseExpressionBase(t)})):this.allowInAnd((function(){return r.parseExpressionBase(t)}))},r.parseExpressionBase=function(e){var t=this.state.startLoc,r=this.parseMaybeAssign(e);if(this.match(12)){var a=this.startNodeAt(t);for(a.expressions=[r];this.eat(12);)a.expressions.push(this.parseMaybeAssign(e));return this.toReferencedList(a.expressions),this.finishNode(a,"SequenceExpression")}return r},r.parseMaybeAssignDisallowIn=function(e,t){var r=this;return this.disallowInAnd((function(){return r.parseMaybeAssign(e,t)}))},r.parseMaybeAssignAllowIn=function(e,t){var r=this;return this.allowInAnd((function(){return r.parseMaybeAssign(e,t)}))},r.setOptionalParametersError=function(e,t){var r;e.optionalParametersLoc=null!=(r=null==t?void 0:t.loc)?r:this.state.startLoc},r.parseMaybeAssign=function(e,t){var r,a=this.state.startLoc;if(this.isContextual(108)&&this.prodParam.hasYield){var n=this.parseYield();return t&&(n=t.call(this,n,a)),n}e?r=!1:(e=new Ng,r=!0);var s=this.state.type;(10===s||Kp(s))&&(this.state.potentialArrowAt=this.state.start);var o,i=this.parseMaybeConditional(e);if(t&&(i=t.call(this,i,a)),(o=this.state.type)>=29&&o<=33){var d=this.startNodeAt(a),c=this.state.value;if(d.operator=c,this.match(29)){this.toAssignable(i,!0),d.left=i;var l=a.index;null!=e.doubleProtoLoc&&e.doubleProtoLoc.index>=l&&(e.doubleProtoLoc=null),null!=e.shorthandAssignLoc&&e.shorthandAssignLoc.index>=l&&(e.shorthandAssignLoc=null),null!=e.privateKeyLoc&&e.privateKeyLoc.index>=l&&(this.checkDestructuringPrivate(e),e.privateKeyLoc=null)}else d.left=i;return this.next(),d.right=this.parseMaybeAssign(),this.checkLVal(i,this.finishNode(d,"AssignmentExpression")),d}return r&&this.checkExpressionErrors(e,!0),i},r.parseMaybeConditional=function(e){var t=this.state.startLoc,r=this.state.potentialArrowAt,a=this.parseExprOps(e);return this.shouldExitDescending(a,r)?a:this.parseConditional(a,t,e)},r.parseConditional=function(e,t,r){if(this.eat(17)){var a=this.startNodeAt(t);return a.test=e,a.consequent=this.parseMaybeAssignAllowIn(),this.expect(14),a.alternate=this.parseMaybeAssign(),this.finishNode(a,"ConditionalExpression")}return e},r.parseMaybeUnaryOrPrivate=function(e){return this.match(139)?this.parsePrivateName():this.parseMaybeUnary(e)},r.parseExprOps=function(e){var t=this.state.startLoc,r=this.state.potentialArrowAt,a=this.parseMaybeUnaryOrPrivate(e);return this.shouldExitDescending(a,r)?a:this.parseExprOp(a,t,-1)},r.parseExprOp=function(e,t,r){if(this.isPrivateName(e)){var a=this.getPrivateNameSV(e);(r>=Zp(58)||!this.prodParam.hasIn||!this.match(58))&&this.raise(dp.PrivateInExpectedIn,e,{identifierName:a}),this.classScope.usePrivateName(a,e.loc.start)}var n,s=this.state.type;if((n=s)>=39&&n<=59&&(this.prodParam.hasIn||!this.match(58))){var o=Zp(s);if(o>r){if(39===s){if(this.expectPlugin("pipelineOperator"),this.state.inFSharpPipelineDirectBody)return e;this.checkPipelineAtInfixOperator(e,t)}var i=this.startNodeAt(t);i.left=e,i.operator=this.state.value;var d=41===s||42===s,c=40===s;if(c&&(o=Zp(42)),this.next(),39===s&&this.hasPlugin(["pipelineOperator",{proposal:"minimal"}])&&96===this.state.type&&this.prodParam.hasAwait)throw this.raise(dp.UnexpectedAwaitAfterPipelineBody,this.state.startLoc);i.right=this.parseExprOpRightExpr(s,o);var l=this.finishNode(i,d||c?"LogicalExpression":"BinaryExpression"),u=this.state.type;if(c&&(41===u||42===u)||d&&40===u)throw this.raise(dp.MixingCoalesceWithLogical,this.state.startLoc);return this.parseExprOp(l,t,r)}}return e},r.parseExprOpRightExpr=function(e,t){var r=this,a=this.state.startLoc;if(39===e){switch(this.getPluginOption("pipelineOperator","proposal")){case"hack":return this.withTopicBindingContext((function(){return r.parseHackPipeBody()}));case"fsharp":return this.withSoloAwaitPermittingContext((function(){return r.parseFSharpPipelineBody(t)}))}if("smart"===this.getPluginOption("pipelineOperator","proposal"))return this.withTopicBindingContext((function(){if(r.prodParam.hasYield&&r.isContextual(108))throw r.raise(dp.PipeBodyIsTighter,r.state.startLoc);return r.parseSmartPipelineBodyInStyle(r.parseExprOpBaseRightExpr(e,t),a)}))}return this.parseExprOpBaseRightExpr(e,t)},r.parseExprOpBaseRightExpr=function(e,t){var r=this.state.startLoc;return this.parseExprOp(this.parseMaybeUnaryOrPrivate(),r,57===e?t-1:t)},r.parseHackPipeBody=function(){var e,t=this.state.startLoc,r=this.parseMaybeAssign();return!ap.has(r.type)||null!=(e=r.extra)&&e.parenthesized||this.raise(dp.PipeUnparenthesizedBody,t,{type:r.type}),this.topicReferenceWasUsedInCurrentContext()||this.raise(dp.PipeTopicUnused,t),r},r.checkExponentialAfterUnary=function(e){this.match(57)&&this.raise(dp.UnexpectedTokenUnaryExponentiation,e.argument)},r.parseMaybeUnary=function(e,t){var r=this.state.startLoc,a=this.isContextual(96);if(a&&this.recordAwaitIfAllowed()){this.next();var n=this.parseAwait(r);return t||this.checkExponentialAfterUnary(n),n}var s,o=this.match(34),i=this.startNode();if(s=this.state.type,Wp[s]){i.operator=this.state.value,i.prefix=!0,this.match(72)&&this.expectPlugin("throwExpressions");var d=this.match(89);if(this.next(),i.argument=this.parseMaybeUnary(null,!0),this.checkExpressionErrors(e,!0),this.state.strict&&d){var c=i.argument;"Identifier"===c.type?this.raise(dp.StrictDelete,i):this.hasPropertyAsPrivateName(c)&&this.raise(dp.DeletePrivateField,i)}if(!o)return t||this.checkExponentialAfterUnary(i),this.finishNode(i,"UnaryExpression")}var l=this.parseUpdate(i,o,e);if(a){var u=this.state.type;if((this.hasPlugin("v8intrinsic")?Xp(u):Xp(u)&&!this.match(54))&&!this.isAmbiguousAwait())return this.raiseOverwrite(dp.AwaitNotInAsyncContext,r),this.parseAwait(r)}return l},r.parseUpdate=function(e,t,r){if(t){var a=e;return this.checkLVal(a.argument,this.finishNode(a,"UpdateExpression")),e}var n=this.state.startLoc,s=this.parseExprSubscripts(r);if(this.checkExpressionErrors(r,!1))return s;for(;34===this.state.type&&!this.canInsertSemicolon();){var o=this.startNodeAt(n);o.operator=this.state.value,o.prefix=!1,o.argument=s,this.next(),this.checkLVal(s,s=this.finishNode(o,"UpdateExpression"))}return s},r.parseExprSubscripts=function(e){var t=this.state.startLoc,r=this.state.potentialArrowAt,a=this.parseExprAtom(e);return this.shouldExitDescending(a,r)?a:this.parseSubscripts(a,t)},r.parseSubscripts=function(e,t,r){var a={optionalChainMember:!1,maybeAsyncArrow:this.atPossibleAsyncArrow(e),stop:!1};do{e=this.parseSubscript(e,t,r,a),a.maybeAsyncArrow=!1}while(!a.stop);return e},r.parseSubscript=function(e,t,r,a){var n=this.state.type;if(!r&&15===n)return this.parseBind(e,t,r,a);if(ef(n))return this.parseTaggedTemplateExpression(e,t,a);var s=!1;if(18===n){if(r&&(this.raise(dp.OptionalChainingNoNew,this.state.startLoc),40===this.lookaheadCharCode()))return a.stop=!0,e;a.optionalChainMember=s=!0,this.next()}if(!r&&this.match(10))return this.parseCoverCallAndAsyncArrowHead(e,t,a,s);var o=this.eat(0);return o||s||this.eat(16)?this.parseMember(e,t,a,o,s):(a.stop=!0,e)},r.parseMember=function(e,t,r,a,n){var s=this.startNodeAt(t);return s.object=e,s.computed=a,a?(s.property=this.parseExpression(),this.expect(3)):this.match(139)?("Super"===e.type&&this.raise(dp.SuperPrivateField,t),this.classScope.usePrivateName(this.state.value,this.state.startLoc),s.property=this.parsePrivateName()):s.property=this.parseIdentifier(!0),r.optionalChainMember?(s.optional=n,this.finishNode(s,"OptionalMemberExpression")):this.finishNode(s,"MemberExpression")},r.parseBind=function(e,t,r,a){var n=this.startNodeAt(t);return n.object=e,this.next(),n.callee=this.parseNoCallExpr(),a.stop=!0,this.parseSubscripts(this.finishNode(n,"BindExpression"),t,r)},r.parseCoverCallAndAsyncArrowHead=function(e,t,r,a){var n=this.state.maybeInArrowParameters,s=null;this.state.maybeInArrowParameters=!0,this.next();var o=this.startNodeAt(t);o.callee=e;var i=r.maybeAsyncArrow,d=r.optionalChainMember;i&&(this.expressionScope.enter(new Eg(2)),s=new Ng),d&&(o.optional=a),o.arguments=a?this.parseCallExpressionArguments(11):this.parseCallExpressionArguments(11,"Super"!==e.type,o,s);var c=this.finishCallExpression(o,d);return i&&this.shouldParseAsyncArrow()&&!a?(r.stop=!0,this.checkDestructuringPrivate(s),this.expressionScope.validateAsPattern(),this.expressionScope.exit(),c=this.parseAsyncArrowFromCallExpression(this.startNodeAt(t),c)):(i&&(this.checkExpressionErrors(s,!0),this.expressionScope.exit()),this.toReferencedArguments(c)),this.state.maybeInArrowParameters=n,c},r.toReferencedArguments=function(e,t){this.toReferencedListDeep(e.arguments,t)},r.parseTaggedTemplateExpression=function(e,t,r){var a=this.startNodeAt(t);return a.tag=e,a.quasi=this.parseTemplate(!0),r.optionalChainMember&&this.raise(dp.OptionalChainingNoTemplate,t),this.finishNode(a,"TaggedTemplateExpression")},r.atPossibleAsyncArrow=function(e){return"Identifier"===e.type&&"async"===e.name&&this.state.lastTokEndLoc.index===e.end&&!this.canInsertSemicolon()&&e.end-e.start==5&&this.offsetToSourcePos(e.start)===this.state.potentialArrowAt},r.finishCallExpression=function(e,t){if("Import"===e.callee.type)if(0===e.arguments.length||e.arguments.length>2)this.raise(dp.ImportCallArity,e);else for(var r=0,a=e.arguments;r1?((t=this.startNodeAt(i)).expressions=d,this.finishNode(t,"SequenceExpression"),this.resetEndLocation(t,p)):t=d[0],this.wrapParenthesis(r,t))},r.wrapParenthesis=function(e,t){if(!(this.optionFlags&bp))return this.addExtra(t,"parenthesized",!0),this.addExtra(t,"parenStart",e.index),this.takeSurroundingComments(t,e.index,this.state.lastTokEndLoc.index),t;var r=this.startNodeAt(e);return r.expression=t,this.finishNode(r,"ParenthesizedExpression")},r.shouldParseArrow=function(e){return!this.canInsertSemicolon()},r.parseArrow=function(e){if(this.eat(19))return e},r.parseParenItem=function(e,t){return e},r.parseNewOrNewTarget=function(){var e=this.startNode();if(this.next(),this.match(16)){var t=this.createIdentifier(this.startNodeAtNode(e),"new");this.next();var r=this.parseMetaProperty(e,t,"target");return this.scope.inNonArrowFunction||this.scope.inClass||this.optionFlags&up||this.raise(dp.UnexpectedNewTarget,r),r}return this.parseNew(e)},r.parseNew=function(e){if(this.parseNewCallee(e),this.eat(10)){var t=this.parseExprList(11);this.toReferencedList(t),e.arguments=t}else e.arguments=[];return this.finishNode(e,"NewExpression")},r.parseNewCallee=function(e){var t=this.match(83),r=this.parseNoCallExpr();e.callee=r,!t||"Import"!==r.type&&"ImportExpression"!==r.type||this.raise(dp.ImportCallNotNewExpression,r)},r.parseTemplateElement=function(e){var t=this.state,r=t.start,a=t.startLoc,n=t.end,s=t.value,o=r+1,i=this.startNodeAt(Yu(a,1));null===s&&(e||this.raise(dp.InvalidEscapeSequenceTemplate,Yu(this.state.firstInvalidTemplateEscapePos,1)));var d=this.match(24),c=d?-1:-2,l=n+c;i.value={raw:this.input.slice(o,l).replace(/\r\n?/g,"\n"),cooked:null===s?null:s.slice(1,c)},i.tail=d,this.next();var u=this.finishNode(i,"TemplateElement");return this.resetEndLocation(u,Yu(this.state.lastTokEndLoc,c)),u},r.parseTemplate=function(e){for(var t=this.startNode(),r=this.parseTemplateElement(e),a=[r],n=[];!r.tail;)n.push(this.parseTemplateSubstitution()),this.readTemplateContinuation(),a.push(r=this.parseTemplateElement(e));return t.expressions=n,t.quasis=a,this.finishNode(t,"TemplateLiteral")},r.parseTemplateSubstitution=function(){return this.parseExpression()},r.parseObjectLike=function(e,t,r,a){r&&this.expectPlugin("recordAndTuple");var n=this.state.inFSharpPipelineDirectBody;this.state.inFSharpPipelineDirectBody=!1;var s=Object.create(null),o=!0,i=this.startNode();for(i.properties=[],this.next();!this.match(e);){if(o)o=!1;else if(this.expect(12),this.match(e)){this.addTrailingCommaExtraToNode(i);break}var d=void 0;t?d=this.parseBindingProperty():(d=this.parsePropertyDefinition(a),this.checkProto(d,r,s,a)),r&&!this.isObjectProperty(d)&&"SpreadElement"!==d.type&&this.raise(dp.InvalidRecordProperty,d),d.shorthand&&this.addExtra(d,"shorthand",!0),i.properties.push(d)}this.next(),this.state.inFSharpPipelineDirectBody=n;var c="ObjectExpression";return t?c="ObjectPattern":r&&(c="RecordExpression"),this.finishNode(i,c)},r.addTrailingCommaExtraToNode=function(e){this.addExtra(e,"trailingComma",this.state.lastTokStartLoc.index),this.addExtra(e,"trailingCommaLoc",this.state.lastTokStartLoc,!1)},r.maybeAsyncOrAccessorProp=function(e){return!e.computed&&"Identifier"===e.key.type&&(this.isLiteralPropertyName()||this.match(0)||this.match(55))},r.parsePropertyDefinition=function(e){var t=[];if(this.match(26))for(this.hasPlugin("decorators")&&this.raise(dp.UnsupportedPropertyDecorator,this.state.startLoc);this.match(26);)t.push(this.parseDecorator());var r,a=this.startNode(),n=!1,s=!1;if(this.match(21))return t.length&&this.unexpected(),this.parseSpread();t.length&&(a.decorators=t,t=[]),a.method=!1,e&&(r=this.state.startLoc);var o=this.eat(55);this.parsePropertyNamePrefixOperator(a);var i=this.state.containsEsc;if(this.parsePropertyName(a,e),!o&&!i&&this.maybeAsyncOrAccessorProp(a)){var d=a.key,c=d.name;"async"!==c||this.hasPrecedingLineBreak()||(n=!0,this.resetPreviousNodeTrailingComments(d),o=this.eat(55),this.parsePropertyName(a)),"get"!==c&&"set"!==c||(s=!0,this.resetPreviousNodeTrailingComments(d),a.kind=c,this.match(55)&&(o=!0,this.raise(dp.AccessorIsGenerator,this.state.curPosition(),{kind:c}),this.next()),this.parsePropertyName(a))}return this.parseObjPropValue(a,r,o,n,!1,s,e)},r.getGetterSetterExpectedParamCount=function(e){return"get"===e.kind?0:1},r.getObjectOrClassMethodParams=function(e){return e.params},r.checkGetterSetterParams=function(e){var t,r=this.getGetterSetterExpectedParamCount(e),a=this.getObjectOrClassMethodParams(e);a.length!==r&&this.raise("get"===e.kind?dp.BadGetterArity:dp.BadSetterArity,e),"set"===e.kind&&"RestElement"===(null==(t=a[a.length-1])?void 0:t.type)&&this.raise(dp.BadSetterRestParameter,e)},r.parseObjectMethod=function(e,t,r,a,n){if(n){var s=this.parseMethod(e,t,!1,!1,!1,"ObjectMethod");return this.checkGetterSetterParams(s),s}if(r||t||this.match(10))return a&&this.unexpected(),e.kind="method",e.method=!0,this.parseMethod(e,t,r,!1,!1,"ObjectMethod")},r.parseObjectProperty=function(e,t,r,a){if(e.shorthand=!1,this.eat(14))return e.value=r?this.parseMaybeDefault(this.state.startLoc):this.parseMaybeAssignAllowIn(a),this.finishNode(e,"ObjectProperty");if(!e.computed&&"Identifier"===e.key.type){if(this.checkReservedWord(e.key.name,e.key.loc.start,!0,!1),r)e.value=this.parseMaybeDefault(t,Fg(e.key));else if(this.match(29)){var n=this.state.startLoc;null!=a?null===a.shorthandAssignLoc&&(a.shorthandAssignLoc=n):this.raise(dp.InvalidCoverInitializedName,n),e.value=this.parseMaybeDefault(t,Fg(e.key))}else e.value=Fg(e.key);return e.shorthand=!0,this.finishNode(e,"ObjectProperty")}},r.parseObjPropValue=function(e,t,r,a,n,s,o){var i=this.parseObjectMethod(e,r,a,n,s)||this.parseObjectProperty(e,t,n,o);return i||this.unexpected(),i},r.parsePropertyName=function(e,t){if(this.eat(0))e.computed=!0,e.key=this.parseMaybeAssignAllowIn(),this.expect(3);else{var r,a=this.state,n=a.type,s=a.value;if(zp(n))r=this.parseIdentifier(!0);else switch(n){case 135:r=this.parseNumericLiteral(s);break;case 134:r=this.parseStringLiteral(s);break;case 136:r=this.parseBigIntLiteral(s);break;case 139:var o=this.state.startLoc;null!=t?null===t.privateKeyLoc&&(t.privateKeyLoc=o):this.raise(dp.UnexpectedPrivateField,o),r=this.parsePrivateName();break;default:if(137===n){r=this.parseDecimalLiteral(s);break}this.unexpected()}e.key=r,139!==n&&(e.computed=!1)}},r.initFunction=function(e,t){e.id=null,e.generator=!1,e.async=t},r.parseMethod=function(e,t,r,a,n,s,o){void 0===o&&(o=!1),this.initFunction(e,r),e.generator=t,this.scope.enter(sf|cf|(o?uf:0)|(n?lf:0)),this.prodParam.enter(Dg(r,e.generator)),this.parseFunctionParams(e,a);var i=this.parseFunctionBodyAndFinish(e,s,!0);return this.prodParam.exit(),this.scope.exit(),i},r.parseArrayLike=function(e,t,r,a){r&&this.expectPlugin("recordAndTuple");var n=this.state.inFSharpPipelineDirectBody;this.state.inFSharpPipelineDirectBody=!1;var s=this.startNode();return this.next(),s.elements=this.parseExprList(e,!r,a,s),this.state.inFSharpPipelineDirectBody=n,this.finishNode(s,r?"TupleExpression":"ArrayExpression")},r.parseArrowExpression=function(e,t,r,a){this.scope.enter(sf|of);var n=Dg(r,!1);!this.match(5)&&this.prodParam.hasIn&&(n|=_g),this.prodParam.enter(n),this.initFunction(e,r);var s=this.state.maybeInArrowParameters;return t&&(this.state.maybeInArrowParameters=!0,this.setArrowFunctionParameters(e,t,a)),this.state.maybeInArrowParameters=!1,this.parseFunctionBody(e,!0),this.prodParam.exit(),this.scope.exit(),this.state.maybeInArrowParameters=s,this.finishNode(e,"ArrowFunctionExpression")},r.setArrowFunctionParameters=function(e,t,r){this.toAssignableList(t,r,!1),e.params=t},r.parseFunctionBodyAndFinish=function(e,t,r){return void 0===r&&(r=!1),this.parseFunctionBody(e,!1,r),this.finishNode(e,t)},r.parseFunctionBody=function(e,t,r){var a=this;void 0===r&&(r=!1);var n=t&&!this.match(5);if(this.expressionScope.enter(Tg()),n)e.body=this.parseMaybeAssign(),this.checkParams(e,!1,t,!1);else{var s=this.state.strict,o=this.state.labels;this.state.labels=[],this.prodParam.enter(this.prodParam.currentFlags()|Cg),e.body=this.parseBlock(!0,!1,(function(n){var o=!a.isSimpleParamList(e.params);n&&o&&a.raise(dp.IllegalLanguageModeDirective,"method"!==e.kind&&"constructor"!==e.kind||!e.key?e:e.key.loc.end);var i=!s&&a.state.strict;a.checkParams(e,!(a.state.strict||t||r||o),t,i),a.state.strict&&e.id&&a.checkIdentifier(e.id,Mf,i)})),this.prodParam.exit(),this.state.labels=o}this.expressionScope.exit()},r.isSimpleParameter=function(e){return"Identifier"===e.type},r.isSimpleParamList=function(e){for(var t=0,r=e.length;t10)&&function(e){return rf.has(e)}(e))if(r&&Jr(e))this.raise(dp.UnexpectedKeyword,t,{keyword:e});else if((this.state.strict?a?zr:Hr:Vr)(e,this.inModule))this.raise(dp.UnexpectedReservedWord,t,{reservedWord:e});else if("yield"===e){if(this.prodParam.hasYield)return void this.raise(dp.YieldBindingIdentifier,t)}else if("await"===e){if(this.prodParam.hasAwait)return void this.raise(dp.AwaitBindingIdentifier,t);if(this.scope.inStaticBlock)return void this.raise(dp.AwaitBindingIdentifierInStaticBlock,t);this.expressionScope.recordAsyncArrowParametersError(t)}else if("arguments"===e&&this.scope.inClassAndNotInNonArrowFunction)return void this.raise(dp.ArgumentsInClass,t)},r.recordAwaitIfAllowed=function(){var e=this.prodParam.hasAwait||this.optionFlags&cp&&!this.scope.inFunction;return e&&!this.scope.inFunction&&(this.state.hasTopLevelAwait=!0),e},r.parseAwait=function(e){var t=this.startNodeAt(e);return this.expressionScope.recordParameterInitializerError(dp.AwaitExpressionFormalParameter,t),this.eat(55)&&this.raise(dp.ObsoleteAwaitStar,t),this.scope.inFunction||this.optionFlags&cp||(this.isAmbiguousAwait()?this.ambiguousScriptDifferentAst=!0:this.sawUnambiguousESM=!0),this.state.soloAwait||(t.argument=this.parseMaybeUnary(null,!0)),this.finishNode(t,"AwaitExpression")},r.isAmbiguousAwait=function(){if(this.hasPrecedingLineBreak())return!0;var e=this.state.type;return 53===e||10===e||0===e||ef(e)||102===e&&!this.state.containsEsc||138===e||56===e||this.hasPlugin("v8intrinsic")&&54===e},r.parseYield=function(){var e=this.startNode();this.expressionScope.recordParameterInitializerError(dp.YieldInParameter,e),this.next();var t=!1,r=null;if(!this.hasPrecedingLineBreak())switch(t=this.eat(55),this.state.type){case 13:case 140:case 8:case 11:case 3:case 9:case 14:case 12:if(!t)break;default:r=this.parseMaybeAssign()}return e.delegate=t,e.argument=r,this.finishNode(e,"YieldExpression")},r.parseImportCall=function(e){if(this.next(),e.source=this.parseMaybeAssignAllowIn(),e.options=null,this.eat(12)&&!this.match(11)&&(e.options=this.parseMaybeAssignAllowIn(),this.eat(12)&&!this.match(11))){do{this.parseMaybeAssignAllowIn()}while(this.eat(12)&&!this.match(11));this.raise(dp.ImportCallArity,e)}return this.expect(11),this.finishNode(e,"ImportExpression")},r.checkPipelineAtInfixOperator=function(e,t){this.hasPlugin(["pipelineOperator",{proposal:"smart"}])&&"SequenceExpression"===e.type&&this.raise(dp.PipelineHeadSequenceExpression,t)},r.parseSmartPipelineBodyInStyle=function(e,t){if(this.isSimpleReference(e)){var r=this.startNodeAt(t);return r.callee=e,this.finishNode(r,"PipelineBareFunction")}var a=this.startNodeAt(t);return this.checkSmartPipeTopicBodyEarlyErrors(t),a.expression=e,this.finishNode(a,"PipelineTopicExpression")},r.isSimpleReference=function(e){switch(e.type){case"MemberExpression":return!e.computed&&this.isSimpleReference(e.object);case"Identifier":return!0;default:return!1}},r.checkSmartPipeTopicBodyEarlyErrors=function(e){if(this.match(19))throw this.raise(dp.PipelineBodyNoArrow,this.state.startLoc);this.topicReferenceWasUsedInCurrentContext()||this.raise(dp.PipelineTopicUnused,e)},r.withTopicBindingContext=function(e){var t=this.state.topicContext;this.state.topicContext={maxNumOfResolvableTopics:1,maxTopicIndex:null};try{return e()}finally{this.state.topicContext=t}},r.withSmartMixTopicForbiddingContext=function(e){if(!this.hasPlugin(["pipelineOperator",{proposal:"smart"}]))return e();var t=this.state.topicContext;this.state.topicContext={maxNumOfResolvableTopics:0,maxTopicIndex:null};try{return e()}finally{this.state.topicContext=t}},r.withSoloAwaitPermittingContext=function(e){var t=this.state.soloAwait;this.state.soloAwait=!0;try{return e()}finally{this.state.soloAwait=t}},r.allowInAnd=function(e){var t=this.prodParam.currentFlags();if(_g&~t){this.prodParam.enter(t|_g);try{return e()}finally{this.prodParam.exit()}}return e()},r.disallowInAnd=function(e){var t=this.prodParam.currentFlags();if(_g&t){this.prodParam.enter(t&~_g);try{return e()}finally{this.prodParam.exit()}}return e()},r.registerTopicReference=function(){this.state.topicContext.maxTopicIndex=0},r.topicReferenceIsAllowedInCurrentContext=function(){return this.state.topicContext.maxNumOfResolvableTopics>=1},r.topicReferenceWasUsedInCurrentContext=function(){return null!=this.state.topicContext.maxTopicIndex&&this.state.topicContext.maxTopicIndex>=0},r.parseFSharpPipelineBody=function(e){var t=this.state.startLoc;this.state.potentialArrowAt=this.state.start;var r=this.state.inFSharpPipelineDirectBody;this.state.inFSharpPipelineDirectBody=!0;var a=this.parseExprOp(this.parseMaybeUnaryOrPrivate(),t,e);return this.state.inFSharpPipelineDirectBody=r,a},r.parseModuleExpression=function(){this.expectPlugin("moduleBlocks");var e=this.startNode();this.next(),this.match(5)||this.unexpected(null,5);var t=this.startNodeAt(this.state.endLoc);this.next();var r=this.initializeScopes(!0);this.enterInitialScopes();try{e.body=this.parseProgram(t,8,"module")}finally{r()}return this.finishNode(e,"ModuleExpression")},r.parsePropertyNamePrefixOperator=function(e){},o(t)}(sy),Ey={kind:gg},Sy={kind:yg},Ty=0,Py=1,Ay=2,ky=4,Cy=8,_y=0,Iy=1,Dy=2,Oy=4,Ny=8,By=/(?:[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/,My=new RegExp("in(?:stanceof)?","y");var Fy=function(e){function t(){return e.apply(this,arguments)||this}c(t,e);var r=t.prototype;return r.parseTopLevel=function(e,t){return e.program=this.parseProgram(t),e.comments=this.comments,this.optionFlags&mp&&(e.tokens=function(e,t,r){for(var a=0;a0)for(var a=0,n=Array.from(this.scope.undefinedExports);a=90&&o<=92?gg:this.match(71)?yg:null,d=this.state.labels.length-1;d>=0;d--){var c=this.state.labels[d];if(c.statementStart!==e.start)break;c.statementStart=this.sourceToOffsetPos(this.state.start),c.kind=i}return this.state.labels.push({name:t,kind:i,statementStart:this.sourceToOffsetPos(this.state.start)}),e.body=a&Ny?this.parseStatementOrSloppyAnnexBFunctionDeclaration(!0):this.parseStatement(),this.state.labels.pop(),e.label=r,this.finishNode(e,"LabeledStatement")},r.parseExpressionStatement=function(e,t,r){return e.expression=t,this.semicolon(),this.finishNode(e,"ExpressionStatement")},r.parseBlock=function(e,t,r){void 0===e&&(e=!1),void 0===t&&(t=!0);var a=this.startNode();return e&&this.state.strictErrors.clear(),this.expect(5),t&&this.scope.enter(af),this.parseBlockBody(a,e,!1,8,r),t&&this.scope.exit(),this.finishNode(a,"BlockStatement")},r.isValidDirective=function(e){return"ExpressionStatement"===e.type&&"StringLiteral"===e.expression.type&&!e.expression.extra.parenthesized},r.parseBlockBody=function(e,t,r,a,n){var s=e.body=[],o=e.directives=[];this.parseBlockOrModuleBlockBody(s,t?o:void 0,r,a,n)},r.parseBlockOrModuleBlockBody=function(e,t,r,a,n){for(var s=this.state.strict,o=!1,i=!1;!this.match(a);){var d=r?this.parseModuleItem():this.parseStatementListItem();if(t&&!i){if(this.isValidDirective(d)){var c=this.stmtToDirective(d);t.push(c),o||"use strict"!==c.value.value||(o=!0,this.setStrict(!0));continue}i=!0,this.state.strictErrors.clear()}e.push(d)}null==n||n.call(this,o),s||this.setStrict(!1),this.next()},r.parseFor=function(e,t){var r=this;return e.init=t,this.semicolon(!1),e.test=this.match(13)?null:this.parseExpression(),this.semicolon(!1),e.update=this.match(11)?null:this.parseExpression(),this.expect(11),e.body=this.withSmartMixTopicForbiddingContext((function(){return r.parseStatement()})),this.scope.exit(),this.state.labels.pop(),this.finishNode(e,"ForStatement")},r.parseForIn=function(e,t,r){var a=this,n=this.match(58);return this.next(),n?null!==r&&this.unexpected(r):e.await=null!==r,"VariableDeclaration"!==t.type||null==t.declarations[0].init||n&&this.options.annexB&&!this.state.strict&&"var"===t.kind&&"Identifier"===t.declarations[0].id.type||this.raise(dp.ForInOfLoopInitializer,t,{type:n?"ForInStatement":"ForOfStatement"}),"AssignmentPattern"===t.type&&this.raise(dp.InvalidLhs,t,{ancestor:{type:"ForStatement"}}),e.left=t,e.right=n?this.parseExpression():this.parseMaybeAssignAllowIn(),this.expect(11),e.body=this.withSmartMixTopicForbiddingContext((function(){return a.parseStatement()})),this.scope.exit(),this.state.labels.pop(),this.finishNode(e,n?"ForInStatement":"ForOfStatement")},r.parseVar=function(e,t,r,a){void 0===a&&(a=!1);var n=e.declarations=[];for(e.kind=r;;){var s=this.startNode();if(this.parseVarId(s,r),s.init=this.eat(29)?t?this.parseMaybeAssignDisallowIn():this.parseMaybeAssignAllowIn():null,null!==s.init||a||("Identifier"===s.id.type||t&&(this.match(58)||this.isContextual(102))?"const"!==r&&"using"!==r&&"await using"!==r||this.match(58)||this.isContextual(102)||this.raise(dp.DeclarationMissingInitializer,this.state.lastTokEndLoc,{kind:r}):this.raise(dp.DeclarationMissingInitializer,this.state.lastTokEndLoc,{kind:"destructuring"})),n.push(this.finishNode(s,"VariableDeclarator")),!this.eat(12))break}return e},r.parseVarId=function(e,t){var r=this.parseBindingAtom();"using"!==t&&"await using"!==t||"ArrayPattern"!==r.type&&"ObjectPattern"!==r.type||this.raise(dp.UsingDeclarationHasBindingPattern,r.loc.start),this.checkLVal(r,{type:"VariableDeclarator"},"var"===t?Cf:Af),e.id=r},r.parseAsyncFunctionExpression=function(e){return this.parseFunction(e,Cy)},r.parseFunction=function(e,t){var r=this;void 0===t&&(t=Ty);var a=t&Ay,n=!!(t&Py),s=n&&!(t&ky),o=!!(t&Cy);this.initFunction(e,o),this.match(55)&&(a&&this.raise(dp.GeneratorInSingleStatementContext,this.state.startLoc),this.next(),e.generator=!0),n&&(e.id=this.parseFunctionId(s));var i=this.state.maybeInArrowParameters;return this.state.maybeInArrowParameters=!1,this.scope.enter(sf),this.prodParam.enter(Dg(o,e.generator)),n||(e.id=this.parseFunctionId()),this.parseFunctionParams(e,!1),this.withSmartMixTopicForbiddingContext((function(){r.parseFunctionBodyAndFinish(e,n?"FunctionDeclaration":"FunctionExpression")})),this.prodParam.exit(),this.scope.exit(),n&&!a&&this.registerFunctionStatementId(e),this.state.maybeInArrowParameters=i,e},r.parseFunctionId=function(e){return e||Kp(this.state.type)?this.parseIdentifier():null},r.parseFunctionParams=function(e,t){this.expect(10),this.expressionScope.enter(new wg(3)),e.params=this.parseBindingList(11,41,ay|(t?ny:0)),this.expressionScope.exit()},r.registerFunctionStatementId=function(e){e.id&&this.scope.declareName(e.id.name,!this.options.annexB||this.state.strict||e.generator||e.async?this.scope.treatFunctionsAsVar?Cf:Af:_f,e.id.loc.start)},r.parseClass=function(e,t,r){this.next();var a=this.state.strict;return this.state.strict=!0,this.parseClassId(e,t,r),this.parseClassSuper(e),e.body=this.parseClassBody(!!e.superClass,a),this.finishNode(e,t?"ClassDeclaration":"ClassExpression")},r.isClassProperty=function(){return this.match(29)||this.match(13)||this.match(8)},r.isClassMethod=function(){return this.match(10)},r.nameIsConstructor=function(e){return"Identifier"===e.type&&"constructor"===e.name||"StringLiteral"===e.type&&"constructor"===e.value},r.isNonstaticConstructor=function(e){return!e.computed&&!e.static&&this.nameIsConstructor(e.key)},r.parseClassBody=function(e,t){var r=this;this.classScope.enter();var a={hadConstructor:!1,hadSuperClass:e},n=[],s=this.startNode();if(s.body=[],this.expect(5),this.withSmartMixTopicForbiddingContext((function(){for(;!r.match(8);)if(r.eat(13)){if(n.length>0)throw r.raise(dp.DecoratorSemicolon,r.state.lastTokEndLoc)}else if(r.match(26))n.push(r.parseDecorator());else{var e=r.startNode();n.length&&(e.decorators=n,r.resetStartLocationFromNode(e,n[0]),n=[]),r.parseClassMember(s,e,a),"constructor"===e.kind&&e.decorators&&e.decorators.length>0&&r.raise(dp.DecoratorConstructor,e)}})),this.state.strict=t,this.next(),n.length)throw this.raise(dp.TrailingDecorator,this.state.startLoc);return this.classScope.exit(),this.finishNode(s,"ClassBody")},r.parseClassMemberFromModifier=function(e,t){var r=this.parseIdentifier(!0);if(this.isClassMethod()){var a=t;return a.kind="method",a.computed=!1,a.key=r,a.static=!1,this.pushClassMethod(e,a,!1,!1,!1,!1),!0}if(this.isClassProperty()){var n=t;return n.computed=!1,n.key=r,n.static=!1,e.body.push(this.parseClassProperty(n)),!0}return this.resetPreviousNodeTrailingComments(r),!1},r.parseClassMember=function(e,t,r){var a=this.isContextual(106);if(a){if(this.parseClassMemberFromModifier(e,t))return;if(this.eat(5))return void this.parseClassStaticBlock(e,t)}this.parseClassMemberWithIsStatic(e,t,r,a)},r.parseClassMemberWithIsStatic=function(e,t,r,a){var n=t,s=t,o=t,i=t,d=t,c=n,l=n;if(t.static=a,this.parsePropertyNamePrefixOperator(t),this.eat(55)){c.kind="method";var u=this.match(139);return this.parseClassElementName(c),u?void this.pushClassPrivateMethod(e,s,!0,!1):(this.isNonstaticConstructor(n)&&this.raise(dp.ConstructorIsGenerator,n.key),void this.pushClassMethod(e,n,!0,!1,!1,!1))}var p=!this.state.containsEsc&&Kp(this.state.type),f=this.parseClassElementName(t),g=p?f.name:null,y=this.isPrivateName(f),m=this.state.startLoc;if(this.parsePostMemberNameModifiers(l),this.isClassMethod()){if(c.kind="method",y)return void this.pushClassPrivateMethod(e,s,!1,!1);var h=this.isNonstaticConstructor(n),b=!1;h&&(n.kind="constructor",r.hadConstructor&&!this.hasPlugin("typescript")&&this.raise(dp.DuplicateConstructor,f),h&&this.hasPlugin("typescript")&&t.override&&this.raise(dp.OverrideOnConstructor,f),r.hadConstructor=!0,b=r.hadSuperClass),this.pushClassMethod(e,n,!1,!1,h,b)}else if(this.isClassProperty())y?this.pushClassPrivateProperty(e,i):this.pushClassProperty(e,o);else if("async"!==g||this.isLineTerminator())if("get"!==g&&"set"!==g||this.match(55)&&this.isLineTerminator())if("accessor"!==g||this.isLineTerminator())this.isLineTerminator()?y?this.pushClassPrivateProperty(e,i):this.pushClassProperty(e,o):this.unexpected();else{this.expectPlugin("decoratorAutoAccessors"),this.resetPreviousNodeTrailingComments(f);var v=this.match(139);this.parseClassElementName(o),this.pushClassAccessorProperty(e,d,v)}else{this.resetPreviousNodeTrailingComments(f),c.kind=g;var x=this.match(139);this.parseClassElementName(n),x?this.pushClassPrivateMethod(e,s,!1,!1):(this.isNonstaticConstructor(n)&&this.raise(dp.ConstructorIsAccessor,n.key),this.pushClassMethod(e,n,!1,!1,!1,!1)),this.checkGetterSetterParams(n)}else{this.resetPreviousNodeTrailingComments(f);var R=this.eat(55);l.optional&&this.unexpected(m),c.kind="method";var j=this.match(139);this.parseClassElementName(c),this.parsePostMemberNameModifiers(l),j?this.pushClassPrivateMethod(e,s,R,!0):(this.isNonstaticConstructor(n)&&this.raise(dp.ConstructorIsAsync,n.key),this.pushClassMethod(e,n,R,!0,!1,!1))}},r.parseClassElementName=function(e){var t=this.state,r=t.type,a=t.value;if(132!==r&&134!==r||!e.static||"prototype"!==a||this.raise(dp.StaticPrototype,this.state.startLoc),139===r){"constructor"===a&&this.raise(dp.ConstructorClassPrivateField,this.state.startLoc);var n=this.parsePrivateName();return e.key=n,n}return this.parsePropertyName(e),e.key},r.parseClassStaticBlock=function(e,t){var r;this.scope.enter(uf|pf|cf);var a=this.state.labels;this.state.labels=[],this.prodParam.enter(Pg);var n=t.body=[];this.parseBlockOrModuleBlockBody(n,void 0,!1,8),this.prodParam.exit(),this.scope.exit(),this.state.labels=a,e.body.push(this.finishNode(t,"StaticBlock")),null!=(r=t.decorators)&&r.length&&this.raise(dp.DecoratorStaticBlock,t)},r.pushClassProperty=function(e,t){!t.computed&&this.nameIsConstructor(t.key)&&this.raise(dp.ConstructorClassField,t.key),e.body.push(this.parseClassProperty(t))},r.pushClassPrivateProperty=function(e,t){var r=this.parseClassPrivateProperty(t);e.body.push(r),this.classScope.declarePrivateName(this.getPrivateNameSV(r.key),Gf,r.key.loc.start)},r.pushClassAccessorProperty=function(e,t,r){r||t.computed||!this.nameIsConstructor(t.key)||this.raise(dp.ConstructorClassField,t.key);var a=this.parseClassAccessorProperty(t);e.body.push(a),r&&this.classScope.declarePrivateName(this.getPrivateNameSV(a.key),Gf,a.key.loc.start)},r.pushClassMethod=function(e,t,r,a,n,s){e.body.push(this.parseMethod(t,r,a,n,s,"ClassMethod",!0))},r.pushClassPrivateMethod=function(e,t,r,a){var n=this.parseMethod(t,r,a,!1,!1,"ClassPrivateMethod",!0);e.body.push(n);var s="get"===n.kind?n.static?Kf:Jf:"set"===n.kind?n.static?zf:Xf:Gf;this.declareClassPrivateMethodInScope(n,s)},r.declareClassPrivateMethodInScope=function(e,t){this.classScope.declarePrivateName(this.getPrivateNameSV(e.key),t,e.key.loc.start)},r.parsePostMemberNameModifiers=function(e){},r.parseClassPrivateProperty=function(e){return this.parseInitializer(e),this.semicolon(),this.finishNode(e,"ClassPrivateProperty")},r.parseClassProperty=function(e){return this.parseInitializer(e),this.semicolon(),this.finishNode(e,"ClassProperty")},r.parseClassAccessorProperty=function(e){return this.parseInitializer(e),this.semicolon(),this.finishNode(e,"ClassAccessorProperty")},r.parseInitializer=function(e){this.scope.enter(uf|cf),this.expressionScope.enter(Tg()),this.prodParam.enter(Pg),e.value=this.eat(29)?this.parseMaybeAssignAllowIn():null,this.expressionScope.exit(),this.prodParam.exit(),this.scope.exit()},r.parseClassId=function(e,t,r,a){if(void 0===a&&(a=Pf),Kp(this.state.type))e.id=this.parseIdentifier(),t&&this.declareNameFromIdentifier(e.id,a);else{if(!r&&t)throw this.raise(dp.MissingClassName,this.state.startLoc);e.id=null}},r.parseClassSuper=function(e){e.superClass=this.eat(81)?this.parseExprSubscripts():null},r.parseExport=function(e,t){var r=this.parseMaybeImportPhase(e,!0),a=this.maybeParseExportDefaultSpecifier(e,r),n=!a||this.eat(12),s=n&&this.eatExportStar(e),o=s&&this.maybeParseExportNamespaceSpecifier(e),i=n&&(!o||this.eat(12)),d=a||s;if(s&&!o){if(a&&this.unexpected(),t)throw this.raise(dp.UnsupportedDecoratorExport,e);return this.parseExportFrom(e,!0),this.finishNode(e,"ExportAllDeclaration")}var c,l=this.maybeParseExportNamedSpecifiers(e);if(a&&n&&!s&&!l&&this.unexpected(null,5),o&&i&&this.unexpected(null,98),d||l){if(c=!1,t)throw this.raise(dp.UnsupportedDecoratorExport,e);this.parseExportFrom(e,d)}else c=this.maybeParseExportDeclaration(e);if(d||l||c){var u,p=e;if(this.checkExport(p,!0,!1,!!p.source),"ClassDeclaration"===(null==(u=p.declaration)?void 0:u.type))this.maybeTakeDecorators(t,p.declaration,p);else if(t)throw this.raise(dp.UnsupportedDecoratorExport,e);return this.finishNode(p,"ExportNamedDeclaration")}if(this.eat(65)){var f=e,g=this.parseExportDefaultExpression();if(f.declaration=g,"ClassDeclaration"===g.type)this.maybeTakeDecorators(t,g,f);else if(t)throw this.raise(dp.UnsupportedDecoratorExport,e);return this.checkExport(f,!0,!0),this.finishNode(f,"ExportDefaultDeclaration")}this.unexpected(null,5)},r.eatExportStar=function(e){return this.eat(55)},r.maybeParseExportDefaultSpecifier=function(e,t){if(t||this.isExportDefaultSpecifier()){this.expectPlugin("exportDefaultFrom",null==t?void 0:t.loc.start);var r=t||this.parseIdentifier(!0),a=this.startNodeAtNode(r);return a.exported=r,e.specifiers=[this.finishNode(a,"ExportDefaultSpecifier")],!0}return!1},r.maybeParseExportNamespaceSpecifier=function(e){if(this.isContextual(93)){var t;null!=(t=e).specifiers||(t.specifiers=[]);var r=this.startNodeAt(this.state.lastTokStartLoc);return this.next(),r.exported=this.parseModuleExportName(),e.specifiers.push(this.finishNode(r,"ExportNamespaceSpecifier")),!0}return!1},r.maybeParseExportNamedSpecifiers=function(e){if(this.match(5)){var t,r=e;r.specifiers||(r.specifiers=[]);var a="type"===r.exportKind;return(t=r.specifiers).push.apply(t,this.parseExportSpecifiers(a)),r.source=null,r.declaration=null,this.hasPlugin("importAssertions")&&(r.assertions=[]),!0}return!1},r.maybeParseExportDeclaration=function(e){return!!this.shouldParseExportDeclaration()&&(e.specifiers=[],e.source=null,this.hasPlugin("importAssertions")&&(e.assertions=[]),e.declaration=this.parseExportDeclaration(e),!0)},r.isAsyncFunction=function(){if(!this.isContextual(95))return!1;var e=this.nextTokenInLineStart();return this.isUnparsedContextual(e,"function")},r.parseExportDefaultExpression=function(){var e=this.startNode();if(this.match(68))return this.next(),this.parseFunction(e,Py|ky);if(this.isAsyncFunction())return this.next(),this.next(),this.parseFunction(e,Py|ky|Cy);if(this.match(80))return this.parseClass(e,!0,!0);if(this.match(26))return this.hasPlugin("decorators")&&!0===this.getPluginOption("decorators","decoratorsBeforeExport")&&this.raise(dp.DecoratorBeforeExport,this.state.startLoc),this.parseClass(this.maybeTakeDecorators(this.parseDecorators(!1),this.startNode()),!0,!0);if(this.match(75)||this.match(74)||this.isLet())throw this.raise(dp.UnsupportedDefaultExport,this.state.startLoc);var t=this.parseMaybeAssignAllowIn();return this.semicolon(),t},r.parseExportDeclaration=function(e){return this.match(80)?this.parseClass(this.startNode(),!0,!1):this.parseStatementListItem()},r.isExportDefaultSpecifier=function(){var e=this.state.type;if(Kp(e)){if(95===e&&!this.state.containsEsc||100===e)return!1;if((130===e||129===e)&&!this.state.containsEsc){var t=this.lookahead().type;if(Kp(t)&&98!==t||5===t)return this.expectOnePlugin(["flow","typescript"]),!1}}else if(!this.match(65))return!1;var r=this.nextTokenStart(),a=this.isUnparsedContextual(r,"from");if(44===this.input.charCodeAt(r)||Kp(this.state.type)&&a)return!0;if(this.match(65)&&a){var n=this.input.charCodeAt(this.nextTokenStartSince(r+4));return 34===n||39===n}return!1},r.parseExportFrom=function(e,t){this.eatContextual(98)?(e.source=this.parseImportSource(),this.checkExport(e),this.maybeParseImportAttributes(e),this.checkJSONModuleImport(e)):t&&this.unexpected(),this.semicolon()},r.shouldParseExportDeclaration=function(){var e=this.state.type;return 26===e&&(this.expectOnePlugin(["decorators","decorators-legacy"]),this.hasPlugin("decorators"))?(!0===this.getPluginOption("decorators","decoratorsBeforeExport")&&this.raise(dp.DecoratorBeforeExport,this.state.startLoc),!0):this.isContextual(107)||this.isContextual(96)&&this.startsAwaitUsing()?(this.raise(dp.UsingDeclarationExport,this.state.startLoc),!0):74===e||75===e||68===e||80===e||this.isLet()||this.isAsyncFunction()},r.checkExport=function(e,t,r,a){var n;if(t)if(r){if(this.checkDuplicateExports(e,"default"),this.hasPlugin("exportDefaultFrom")){var s,o=e.declaration;"Identifier"!==o.type||"from"!==o.name||o.end-o.start!=4||null!=(s=o.extra)&&s.parenthesized||this.raise(dp.ExportDefaultFromAsIdentifier,o)}}else if(null!=(n=e.specifiers)&&n.length)for(var i=0,d=e.specifiers;i0&&this.raise(dp.ImportReflectionHasAssertion,t[0].loc.start)}},r.checkJSONModuleImport=function(e){if(this.isJSONModuleImport(e)&&"ExportAllDeclaration"!==e.type){var t=e.specifiers;if(null!=t){var r=t.find((function(e){var t;if("ExportSpecifier"===e.type?t=e.local:"ImportSpecifier"===e.type&&(t=e.imported),void 0!==t)return"Identifier"===t.type?"default"!==t.name:"default"!==t.value}));void 0!==r&&this.raise(dp.ImportJSONBindingNotDefault,r.loc.start)}}},r.isPotentialImportPhase=function(e){return!e&&(this.isContextual(105)||this.isContextual(97)||this.isContextual(127))},r.applyImportPhase=function(e,t,r,a){t||("module"===r?(this.expectPlugin("importReflection",a),e.module=!0):this.hasPlugin("importReflection")&&(e.module=!1),"source"===r?(this.expectPlugin("sourcePhaseImports",a),e.phase="source"):"defer"===r?(this.expectPlugin("deferredImportEvaluation",a),e.phase="defer"):this.hasPlugin("sourcePhaseImports")&&(e.phase=null))},r.parseMaybeImportPhase=function(e,t){if(!this.isPotentialImportPhase(t))return this.applyImportPhase(e,t,null),null;var r=this.parseIdentifier(!0),a=this.state.type;return(zp(a)?98!==a||102===this.lookaheadCharCode():12!==a)?(this.resetPreviousIdentifierLeadingComments(r),this.applyImportPhase(e,t,r.name,r.loc.start),null):(this.applyImportPhase(e,t,null),r)},r.isPrecedingIdImportPhase=function(e){var t=this.state.type;return Kp(t)?98!==t||102===this.lookaheadCharCode():12!==t},r.parseImport=function(e){return this.match(134)?this.parseImportSourceAndAttributes(e):this.parseImportSpecifiersAndAfter(e,this.parseMaybeImportPhase(e,!1))},r.parseImportSpecifiersAndAfter=function(e,t){e.specifiers=[];var r=!this.maybeParseDefaultImportSpecifier(e,t)||this.eat(12),a=r&&this.maybeParseStarImportSpecifier(e);return r&&!a&&this.parseNamedImportSpecifiers(e),this.expectContextual(98),this.parseImportSourceAndAttributes(e)},r.parseImportSourceAndAttributes=function(e){return null!=e.specifiers||(e.specifiers=[]),e.source=this.parseImportSource(),this.maybeParseImportAttributes(e),this.checkImportReflection(e),this.checkJSONModuleImport(e),this.semicolon(),this.finishNode(e,"ImportDeclaration")},r.parseImportSource=function(){return this.match(134)||this.unexpected(),this.parseExprAtom()},r.parseImportSpecifierLocal=function(e,t,r){t.local=this.parseIdentifier(),e.specifiers.push(this.finishImportSpecifier(t,r))},r.finishImportSpecifier=function(e,t,r){return void 0===r&&(r=Af),this.checkLVal(e.local,{type:t},r),this.finishNode(e,t)},r.parseImportAttributes=function(){this.expect(5);var e=[],t=new Set;do{if(this.match(8))break;var r=this.startNode(),a=this.state.value;if(t.has(a)&&this.raise(dp.ModuleAttributesWithDuplicateKeys,this.state.startLoc,{key:a}),t.add(a),this.match(134)?r.key=this.parseStringLiteral(a):r.key=this.parseIdentifier(!0),this.expect(14),!this.match(134))throw this.raise(dp.ModuleAttributeInvalidValue,this.state.startLoc);r.value=this.parseStringLiteral(this.state.value),e.push(this.finishNode(r,"ImportAttribute"))}while(this.eat(12));return this.expect(8),e},r.parseModuleAttributes=function(){var e=[],t=new Set;do{var r=this.startNode();if(r.key=this.parseIdentifier(!0),"type"!==r.key.name&&this.raise(dp.ModuleAttributeDifferentFromType,r.key),t.has(r.key.name)&&this.raise(dp.ModuleAttributesWithDuplicateKeys,r.key,{key:r.key.name}),t.add(r.key.name),this.expect(14),!this.match(134))throw this.raise(dp.ModuleAttributeInvalidValue,this.state.startLoc);r.value=this.parseStringLiteral(this.state.value),e.push(this.finishNode(r,"ImportAttribute"))}while(this.eat(12));return e},r.maybeParseImportAttributes=function(e){var t,r=!1;if(this.match(76)){if(this.hasPrecedingLineBreak()&&40===this.lookaheadCharCode())return;this.next(),t=this.hasPlugin("moduleAttributes")?this.parseModuleAttributes():this.parseImportAttributes(),r=!0}else this.isContextual(94)&&!this.hasPrecedingLineBreak()?(this.hasPlugin("deprecatedImportAssert")||this.hasPlugin("importAssertions")||this.raise(dp.ImportAttributesUseAssert,this.state.startLoc),this.hasPlugin("importAssertions")||this.addExtra(e,"deprecatedAssertSyntax",!0),this.next(),t=this.parseImportAttributes()):t=[];!r&&this.hasPlugin("importAssertions")?e.assertions=t:e.attributes=t},r.maybeParseDefaultImportSpecifier=function(e,t){if(t){var r=this.startNodeAtNode(t);return r.local=t,e.specifiers.push(this.finishImportSpecifier(r,"ImportDefaultSpecifier")),!0}return!!zp(this.state.type)&&(this.parseImportSpecifierLocal(e,this.startNode(),"ImportDefaultSpecifier"),!0)},r.maybeParseStarImportSpecifier=function(e){if(this.match(55)){var t=this.startNode();return this.next(),this.expectContextual(93),this.parseImportSpecifierLocal(e,t,"ImportNamespaceSpecifier"),!0}return!1},r.parseNamedImportSpecifiers=function(e){var t=!0;for(this.expect(5);!this.eat(8);){if(t)t=!1;else{if(this.eat(14))throw this.raise(dp.DestructureNamedImport,this.state.startLoc);if(this.expect(12),this.eat(8))break}var r=this.startNode(),a=this.match(134),n=this.isContextual(130);r.imported=this.parseModuleExportName();var s=this.parseImportSpecifier(r,a,"type"===e.importKind||"typeof"===e.importKind,n,void 0);e.specifiers.push(s)}},r.parseImportSpecifier=function(e,t,r,a,n){if(this.eatContextual(93))e.local=this.parseIdentifier();else{var s=e.imported;if(t)throw this.raise(dp.ImportBindingIsString,e,{importName:s.value});this.checkReservedWord(s.name,e.loc.start,!0,!0),e.local||(e.local=Fg(s))}return this.finishImportSpecifier(e,"ImportSpecifier",n)},r.isThisParam=function(e){return"Identifier"===e.type&&"this"===e.name},o(t)}(wy),Ly=function(e){function t(t,r,a){var n;t=function(e){var t={sourceType:"script",sourceFilename:void 0,startIndex:0,startColumn:0,startLine:1,allowAwaitOutsideFunction:!1,allowReturnOutsideFunction:!1,allowNewTargetOutsideFunction:!1,allowImportExportEverywhere:!1,allowSuperOutsideMethod:!1,allowUndeclaredExports:!1,plugins:[],strictMode:null,ranges:!1,tokens:!1,createImportExpressions:!1,createParenthesizedExpressions:!1,errorRecovery:!1,attachComment:!0,annexB:!0};if(null==e)return t;if(null!=e.annexB&&!1!==e.annexB)throw new Error("The `annexB` option can only be set to `false`.");for(var r=0,a=Object.keys(t);r0?t.startIndex=t.startColumn:null==e.startColumn&&t.startIndex>0&&(t.startColumn=t.startIndex);else if((null==e.startColumn||null==e.startIndex)&&null!=e.startIndex)throw new Error("With a `startLine > 1` you must also specify `startIndex` and `startColumn`.");return t}(t),(n=e.call(this,t,r)||this).options=t,n.initializeScopes(),n.plugins=a,n.filename=t.sourceFilename,n.startIndex=t.startIndex;var s=0;return t.allowAwaitOutsideFunction&&(s|=cp),t.allowReturnOutsideFunction&&(s|=lp),t.allowImportExportEverywhere&&(s|=pp),t.allowSuperOutsideMethod&&(s|=fp),t.allowUndeclaredExports&&(s|=gp),t.allowNewTargetOutsideFunction&&(s|=up),t.ranges&&(s|=yp),t.tokens&&(s|=mp),t.createImportExpressions&&(s|=hp),t.createParenthesizedExpressions&&(s|=bp),t.errorRecovery&&(s|=vp),t.attachComment&&(s|=xp),t.annexB&&(s|=Rp),n.optionFlags=s,n}c(t,e);var r=t.prototype;return r.getScopeHandler=function(){return eg},r.parse=function(){this.enterInitialScopes();var e=this.startNode(),t=this.startNode();return this.nextToken(),e.errors=null,this.parseTopLevel(e,t),e.errors=this.state.errors,e.comments.length=this.state.commentsLen,e},o(t)}(Fy);function Uy(e,t){var r;if("unambiguous"!==(null==(r=t)?void 0:r.sourceType))return Wy(t,e).parse();t=Object.assign({},t);try{t.sourceType="module";var a=Wy(t,e),n=a.parse();if(a.sawUnambiguousESM)return n;if(a.ambiguousScriptDifferentAst)try{return t.sourceType="script",Wy(t,e).parse()}catch(e){}else n.program.sourceType="script";return n}catch(r){try{return t.sourceType="script",Wy(t,e).parse()}catch(e){}throw r}}var qy=function(e){for(var t={},r=0,a=Object.keys(e);r!=?({]|\/(?![\/*])))))|(0[xX][\da-fA-F]+|0[oO][0-7]+|0[bB][01]+|(?:\d*\.\d+|\d+\.?)(?:[eE][+-]?\d+)?)|((?!\d)(?:(?!\s)[$\w\u0080-\uFFFF]|\\u[\da-fA-F]{4}|\\u\{[\da-fA-F]+\})+)|(--|\+\+|&&|\|\||=>|\.{3}|(?:[+\-\/%&|^]|\*{1,2}|<{1,2}|>{1,3}|!=?|={1,2})=?|[?~.,:;[\](){}])|(\s+)|(^$|[\s\S])/g,nm.matchToToken=function(e){var t={type:"invalid",value:e[0],closed:void 0};return e[1]?(t.type="string",t.closed=!(!e[3]&&!e[4])):e[5]?t.type="comment":e[6]?(t.type="comment",t.closed=!!e[7]):e[8]?t.type="regex":e[9]?t.type="number":e[10]?t.type="name":e[11]?t.type="punctuator":e[12]&&(t.type="whitespace"),t}),nm}var om,im=(void V.env.BABEL_8_BREAKING,sm()),dm=new Set(["as","async","from","get","of","set"]),cm=/\r\n|[\n\r\u2028\u2029]/,lm=/^[()[\]{}]$/,um=/^[a-z][\w-]*$/i,pm=function(e,t,r){if("name"===e.type){if(Jr(e.value)||Hr(e.value,!0)||dm.has(e.value))return"keyword";if(um.test(e.value)&&("<"===r[t-1]||""),n.gutter(s),e.length>0?" "+e:"",l].join("")}return" "+n.gutter(s)+(e.length>0?" "+e:"")})).join("\n");return r.message&&!l&&(f=""+" ".repeat(u+1)+r.message+"\n"+f),a?n.reset(f):f}var ym=Q,mm=te,hm=sr,bm=oe,vm=Pt,xm=ye,Rm=It,jm=rr,wm=ce,Em=yu,Sm=Tu,Tm=/^[_$A-Z0-9]+$/;function Pm(e,t,r){var a=r.placeholderWhitelist,n=r.placeholderPattern,s=r.preserveComments,o=r.syntacticPlaceholders,i=function(e,t,r){var a=(t.plugins||[]).slice();!1!==r&&a.push("placeholders");t=Object.assign({allowReturnOutsideFunction:!0,allowSuperOutsideMethod:!0,sourceType:"module"},t,{plugins:a});try{return Uy(e,t)}catch(t){var n=t.loc;throw n&&(t.message+="\n"+gm(e,{start:n}),t.code="BABEL_TEMPLATE_PARSE_ERROR"),t}}(t,r.parser,o);Em(i,{preserveComments:s}),e.validate(i);var d={syntactic:{placeholders:[],placeholderNames:new Set},legacy:{placeholders:[],placeholderNames:new Set},placeholderWhitelist:a,placeholderPattern:n,syntacticPlaceholders:o};return Sm(i,Am,d),Object.assign({ast:i},d.syntactic.placeholders.length?d.syntactic:d.legacy)}function Am(e,t,r){var a,n,s=r.syntactic.placeholders.length>0;if(Rm(e)){if(!1===r.syntacticPlaceholders)throw new Error("%%foo%%-style placeholders can't be used when '.syntacticPlaceholders' is false.");n=e.name.name,s=!0}else{if(s||r.syntacticPlaceholders)return;if(bm(e)||vm(e))n=e.name;else{if(!wm(e))return;n=e.value}}if(s&&(null!=r.placeholderPattern||null!=r.placeholderWhitelist))throw new Error("'.placeholderWhitelist' and '.placeholderPattern' aren't compatible with '.syntacticPlaceholders: true'");if(s||!1!==r.placeholderPattern&&(r.placeholderPattern||Tm).test(n)||null!=(a=r.placeholderWhitelist)&&a.has(n)){var o,i=(t=t.slice())[t.length-1],d=i.node,c=i.key;wm(e)||Rm(e,{expectedNode:"StringLiteral"})?o="string":xm(d)&&"arguments"===c||ym(d)&&"arguments"===c||hm(d)&&"params"===c?o="param":mm(d)&&!Rm(e)?(o="statement",t=t.slice(0,-1)):o=jm(e)&&Rm(e)?"statement":"other";var l=s?r.syntactic:r.legacy,u=l.placeholders,p=l.placeholderNames;u.push({name:n,type:o,resolve:function(e){return function(e,t){for(var r=e,a=0;a1?a-1:0),o=1;o1)throw new Error("Unexpected extra params.");return Gm(Lm(e,t,Hu(n,Ku(s[0]))))}if(Array.isArray(t)){var i=r.get(t);return i||(i=Um(e,t,n),r.set(t,i)),Gm(i(s))}if("object"==typeof t&&t){if(s.length>0)throw new Error("Unexpected extra params.");return Wm(e,Hu(n,Ku(t)))}throw new Error("Unexpected template param "+typeof t)}),{ast:function(t){for(var r=arguments.length,s=new Array(r>1?r-1:0),o=1;o1)throw new Error("Unexpected extra params.");return Lm(e,t,Hu(Hu(n,Ku(s[0])),qm))()}if(Array.isArray(t)){var i=a.get(t);return i||(i=Um(e,t,Hu(n,qm)),a.set(t,i)),i(s)()}throw new Error("Unexpected template param "+typeof t)}})}function Gm(e){var t="";try{throw new Error}catch(e){e.stack&&(t=e.stack.split("\n").slice(3).join("\n"))}return function(r){try{return e(r)}catch(e){throw e.stack+="\n =============\n"+t,e}}}var Vm=Wm(Uu),Hm=Wm(Wu),Km=Wm(qu),zm=Wm(Gu),Jm=Wm({code:function(e){return e},validate:function(){},unwrap:function(e){return e.program}}),Xm=Object.assign(Vm.bind(void 0),{smart:Vm,statement:Hm,statements:Km,expression:zm,program:Jm,ast:Vm.ast}),Ym=Object.freeze({__proto__:null,default:Xm,expression:zm,program:Jm,smart:Vm,statement:Hm,statements:Km});function $m(e,t,r){return Object.freeze({minVersion:e,ast:function(){return Xm.program.ast(t,{preserveComments:!0})},metadata:r})}var Qm={__proto__:null,OverloadYield:$m("7.18.14","function _OverloadYield(e,d){this.v=e,this.k=d}",{globals:[],locals:{_OverloadYield:["body.0.id"]},exportBindingAssignments:[],exportName:"_OverloadYield",dependencies:{}}),applyDecoratedDescriptor:$m("7.0.0-beta.0",'function _applyDecoratedDescriptor(i,e,r,n,l){var a={};return Object.keys(n).forEach((function(i){a[i]=n[i]})),a.enumerable=!!a.enumerable,a.configurable=!!a.configurable,("value"in a||a.initializer)&&(a.writable=!0),a=r.slice().reverse().reduce((function(r,n){return n(i,e,r)||r}),a),l&&void 0!==a.initializer&&(a.value=a.initializer?a.initializer.call(l):void 0,a.initializer=void 0),void 0===a.initializer?(Object.defineProperty(i,e,a),null):a}',{globals:["Object"],locals:{_applyDecoratedDescriptor:["body.0.id"]},exportBindingAssignments:[],exportName:"_applyDecoratedDescriptor",dependencies:{}}),applyDecs2311:$m("7.24.0",'function applyDecs2311(e,t,n,r,o,i){var a,c,u,s,f,l,p,d=Symbol.metadata||Symbol.for("Symbol.metadata"),m=Object.defineProperty,h=Object.create,y=[h(null),h(null)],v=t.length;function g(t,n,r){return function(o,i){n&&(i=o,o=e);for(var a=0;a=0;O-=n?2:1){var T=b(h[O],"A decorator","be",!0),z=n?h[O-1]:void 0,A={},H={kind:["field","accessor","method","getter","setter","class"][o],name:r,metadata:a,addInitializer:function(e,t){if(e.v)throw new TypeError("attempted to call addInitializer after decoration was finished");b(t,"An initializer","be",!0),i.push(t)}.bind(null,A)};if(w)c=T.call(z,N,H),A.v=1,b(c,"class decorators","return")&&(N=c);else if(H.static=s,H.private=f,c=H.access={has:f?p.bind():function(e){return r in e}},j||(c.get=f?E?function(e){return d(e),P.value}:I("get",0,d):function(e){return e[r]}),E||S||(c.set=f?I("set",0,d):function(e,t){e[r]=t}),N=T.call(z,D?{get:P.get,set:P.set}:P[F],H),A.v=1,D){if("object"==typeof N&&N)(c=b(N.get,"accessor.get"))&&(P.get=c),(c=b(N.set,"accessor.set"))&&(P.set=c),(c=b(N.init,"accessor.init"))&&k.unshift(c);else if(void 0!==N)throw new TypeError("accessor decorators must return an object with get, set, or init properties or undefined")}else b(N,(l?"field":"method")+" decorators","return")&&(l?k.unshift(N):P[F]=N)}return o<2&&u.push(g(k,s,1),g(i,s,0)),l||w||(f?D?u.splice(-1,0,I("get",s),I("set",s)):u.push(E?P[F]:b.call.bind(P[F])):m(e,r,P)),N}function w(e){return m(e,d,{configurable:!0,enumerable:!0,value:a})}return void 0!==i&&(a=i[d]),a=h(null==a?null:a),f=[],l=function(e){e&&f.push(g(e))},p=function(t,r){for(var i=0;ir.length)&&(a=r.length);for(var e=0,n=Array(a);e=r.length?{done:!0}:{done:!1,value:r[n++]}},e:function(r){throw r},f:F}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,u=!1;return{s:function(){t=t.call(r)},n:function(){var r=t.next();return a=r.done,r},e:function(r){u=!0,o=r},f:function(){try{a||null==t.return||t.return()}finally{if(u)throw o}}}}',{globals:["Symbol","Array","TypeError"],locals:{_createForOfIteratorHelper:["body.0.id"]},exportBindingAssignments:[],exportName:"_createForOfIteratorHelper",dependencies:{unsupportedIterableToArray:["body.0.body.body.1.consequent.body.0.test.left.right.right.callee"]}}),createForOfIteratorHelperLoose:$m("7.9.0",'function _createForOfIteratorHelperLoose(r,e){var t="undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(t)return(t=t.call(r)).next.bind(t);if(Array.isArray(r)||(t=unsupportedIterableToArray(r))||e&&r&&"number"==typeof r.length){t&&(r=t);var o=0;return function(){return o>=r.length?{done:!0}:{done:!1,value:r[o++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}',{globals:["Symbol","Array","TypeError"],locals:{_createForOfIteratorHelperLoose:["body.0.id"]},exportBindingAssignments:[],exportName:"_createForOfIteratorHelperLoose",dependencies:{unsupportedIterableToArray:["body.0.body.body.2.test.left.right.right.callee"]}}),createSuper:$m("7.9.0","function _createSuper(t){var r=isNativeReflectConstruct();return function(){var e,o=getPrototypeOf(t);if(r){var s=getPrototypeOf(this).constructor;e=Reflect.construct(o,arguments,s)}else e=o.apply(this,arguments);return possibleConstructorReturn(this,e)}}",{globals:["Reflect"],locals:{_createSuper:["body.0.id"]},exportBindingAssignments:[],exportName:"_createSuper",dependencies:{getPrototypeOf:["body.0.body.body.1.argument.body.body.0.declarations.1.init.callee","body.0.body.body.1.argument.body.body.1.consequent.body.0.declarations.0.init.object.callee"],isNativeReflectConstruct:["body.0.body.body.0.declarations.0.init.callee"],possibleConstructorReturn:["body.0.body.body.1.argument.body.body.2.argument.callee"]}}),decorate:$m("7.1.5",'function _decorate(e,r,t,i){var o=_getDecoratorsApi();if(i)for(var n=0;n=0;n--){var s=r[e.placement];s.splice(s.indexOf(e.key),1);var a=this.fromElementDescriptor(e),l=this.toElementFinisherExtras((0,o[n])(a)||a);e=l.element,this.addElementPlacement(e,r),l.finisher&&i.push(l.finisher);var c=l.extras;if(c){for(var p=0;p=0;i--){var o=this.fromClassDescriptor(e),n=this.toClassDescriptor((0,r[i])(o)||o);if(void 0!==n.finisher&&t.push(n.finisher),void 0!==n.elements){e=n.elements;for(var s=0;s1){for(var t=Array(n),f=0;f=0;--o){var i=this.tryEntries[o],a=i.completion;if("root"===i.tryLoc)return handle("end");if(i.tryLoc<=this.prev){var c=n.call(i,"catchLoc"),u=n.call(i,"finallyLoc");if(c&&u){if(this.prev=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev=0;--e){var r=this.tryEntries[e];if(r.finallyLoc===t)return this.complete(r.completion,r.afterLoc),resetTryEntry(r),y}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.tryLoc===t){var n=r.completion;if("throw"===n.type){var o=n.arg;resetTryEntry(r)}return o}}throw Error("illegal catch attempt")},delegateYield:function(e,r,n){return this.delegate={iterator:values(e),resultName:r,nextLoc:n},"next"===this.method&&(this.arg=t),y}},e}',{globals:["Object","Symbol","Error","TypeError","isNaN","Promise"],locals:{_regeneratorRuntime:["body.0.id","body.0.body.body.0.expression.left"]},exportBindingAssignments:["body.0.body.body.0.expression"],exportName:"_regeneratorRuntime",dependencies:{}}),set:$m("7.0.0-beta.0",'function set(e,r,t,o){return set="undefined"!=typeof Reflect&&Reflect.set?Reflect.set:function(e,r,t,o){var f,i=superPropBase(e,r);if(i){if((f=Object.getOwnPropertyDescriptor(i,r)).set)return f.set.call(o,t),!0;if(!f.writable)return!1}if(f=Object.getOwnPropertyDescriptor(o,r)){if(!f.writable)return!1;f.value=t,Object.defineProperty(o,r,f)}else defineProperty(o,r,t);return!0},set(e,r,t,o)}function _set(e,r,t,o,f){if(!set(e,r,t,o||e)&&f)throw new TypeError("failed to set property");return t}',{globals:["Reflect","Object","TypeError"],locals:{set:["body.0.id","body.0.body.body.0.argument.expressions.1.callee","body.1.body.body.0.test.left.argument.callee","body.0.body.body.0.argument.expressions.0.left"],_set:["body.1.id"]},exportBindingAssignments:[],exportName:"_set",dependencies:{superPropBase:["body.0.body.body.0.argument.expressions.0.right.alternate.body.body.0.declarations.1.init.callee"],defineProperty:["body.0.body.body.0.argument.expressions.0.right.alternate.body.body.2.alternate.expression.callee"]}}),setFunctionName:$m("7.23.6",'function setFunctionName(e,t,n){"symbol"==typeof t&&(t=(t=t.description)?"["+t+"]":"");try{Object.defineProperty(e,"name",{configurable:!0,value:n?n+" "+t:t})}catch(e){}return e}',{globals:["Object"],locals:{setFunctionName:["body.0.id"]},exportBindingAssignments:[],exportName:"setFunctionName",dependencies:{}}),setPrototypeOf:$m("7.0.0-beta.0","function _setPrototypeOf(t,e){return _setPrototypeOf=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},_setPrototypeOf(t,e)}",{globals:["Object"],locals:{_setPrototypeOf:["body.0.id","body.0.body.body.0.argument.expressions.1.callee","body.0.body.body.0.argument.expressions.0.left"]},exportBindingAssignments:["body.0.body.body.0.argument.expressions.0"],exportName:"_setPrototypeOf",dependencies:{}}),skipFirstGeneratorNext:$m("7.0.0-beta.0","function _skipFirstGeneratorNext(t){return function(){var r=t.apply(this,arguments);return r.next(),r}}",{globals:[],locals:{_skipFirstGeneratorNext:["body.0.id"]},exportBindingAssignments:[],exportName:"_skipFirstGeneratorNext",dependencies:{}}),slicedToArray:$m("7.0.0-beta.0","function _slicedToArray(r,e){return arrayWithHoles(r)||iterableToArrayLimit(r,e)||unsupportedIterableToArray(r,e)||nonIterableRest()}",{globals:[],locals:{_slicedToArray:["body.0.id"]},exportBindingAssignments:[],exportName:"_slicedToArray",dependencies:{arrayWithHoles:["body.0.body.body.0.argument.left.left.left.callee"],iterableToArrayLimit:["body.0.body.body.0.argument.left.left.right.callee"],unsupportedIterableToArray:["body.0.body.body.0.argument.left.right.callee"],nonIterableRest:["body.0.body.body.0.argument.right.callee"]}}),superPropBase:$m("7.0.0-beta.0","function _superPropBase(t,o){for(;!{}.hasOwnProperty.call(t,o)&&null!==(t=getPrototypeOf(t)););return t}",{globals:[],locals:{_superPropBase:["body.0.id"]},exportBindingAssignments:[],exportName:"_superPropBase",dependencies:{getPrototypeOf:["body.0.body.body.0.test.right.right.right.callee"]}}),superPropGet:$m("7.25.0",'function _superPropGet(t,o,e,r){var p=get(getPrototypeOf(1&r?t.prototype:t),o,e);return 2&r&&"function"==typeof p?function(t){return p.apply(e,t)}:p}',{globals:[],locals:{_superPropGet:["body.0.id"]},exportBindingAssignments:[],exportName:"_superPropGet",dependencies:{get:["body.0.body.body.0.declarations.0.init.callee"],getPrototypeOf:["body.0.body.body.0.declarations.0.init.arguments.0.callee"]}}),superPropSet:$m("7.25.0","function _superPropSet(t,e,o,r,p,f){return set(getPrototypeOf(f?t.prototype:t),e,o,r,p)}",{globals:[],locals:{_superPropSet:["body.0.id"]},exportBindingAssignments:[],exportName:"_superPropSet",dependencies:{set:["body.0.body.body.0.argument.callee"],getPrototypeOf:["body.0.body.body.0.argument.arguments.0.callee"]}}),taggedTemplateLiteral:$m("7.0.0-beta.0","function _taggedTemplateLiteral(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}",{globals:["Object"],locals:{_taggedTemplateLiteral:["body.0.id"]},exportBindingAssignments:[],exportName:"_taggedTemplateLiteral",dependencies:{}}),taggedTemplateLiteralLoose:$m("7.0.0-beta.0","function _taggedTemplateLiteralLoose(e,t){return t||(t=e.slice(0)),e.raw=t,e}",{globals:[],locals:{_taggedTemplateLiteralLoose:["body.0.id"]},exportBindingAssignments:[],exportName:"_taggedTemplateLiteralLoose",dependencies:{}}),tdz:$m("7.5.5",'function _tdzError(e){throw new ReferenceError(e+" is not defined - temporal dead zone")}',{globals:["ReferenceError"],locals:{_tdzError:["body.0.id"]},exportBindingAssignments:[],exportName:"_tdzError",dependencies:{}}),temporalRef:$m("7.0.0-beta.0","function _temporalRef(r,e){return r===undef?err(e):r}",{globals:[],locals:{_temporalRef:["body.0.id"]},exportBindingAssignments:[],exportName:"_temporalRef",dependencies:{temporalUndefined:["body.0.body.body.0.argument.test.right"],tdz:["body.0.body.body.0.argument.consequent.callee"]}}),temporalUndefined:$m("7.0.0-beta.0","function _temporalUndefined(){}",{globals:[],locals:{_temporalUndefined:["body.0.id"]},exportBindingAssignments:[],exportName:"_temporalUndefined",dependencies:{}}),toArray:$m("7.0.0-beta.0","function _toArray(r){return arrayWithHoles(r)||iterableToArray(r)||unsupportedIterableToArray(r)||nonIterableRest()}",{globals:[],locals:{_toArray:["body.0.id"]},exportBindingAssignments:[],exportName:"_toArray",dependencies:{arrayWithHoles:["body.0.body.body.0.argument.left.left.left.callee"],iterableToArray:["body.0.body.body.0.argument.left.left.right.callee"],unsupportedIterableToArray:["body.0.body.body.0.argument.left.right.callee"],nonIterableRest:["body.0.body.body.0.argument.right.callee"]}}),toConsumableArray:$m("7.0.0-beta.0","function _toConsumableArray(r){return arrayWithoutHoles(r)||iterableToArray(r)||unsupportedIterableToArray(r)||nonIterableSpread()}",{globals:[],locals:{_toConsumableArray:["body.0.id"]},exportBindingAssignments:[],exportName:"_toConsumableArray",dependencies:{arrayWithoutHoles:["body.0.body.body.0.argument.left.left.left.callee"],iterableToArray:["body.0.body.body.0.argument.left.left.right.callee"],unsupportedIterableToArray:["body.0.body.body.0.argument.left.right.callee"],nonIterableSpread:["body.0.body.body.0.argument.right.callee"]}}),toPrimitive:$m("7.1.5",'function toPrimitive(t,r){if("object"!=typeof t||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,r||"default");if("object"!=typeof i)return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(t)}',{globals:["Symbol","TypeError","String","Number"],locals:{toPrimitive:["body.0.id"]},exportBindingAssignments:[],exportName:"toPrimitive",dependencies:{}}),toPropertyKey:$m("7.1.5",'function toPropertyKey(t){var i=toPrimitive(t,"string");return"symbol"==typeof i?i:i+""}',{globals:[],locals:{toPropertyKey:["body.0.id"]},exportBindingAssignments:[],exportName:"toPropertyKey",dependencies:{toPrimitive:["body.0.body.body.0.declarations.0.init.callee"]}}),toSetter:$m("7.24.0",'function _toSetter(t,e,n){e||(e=[]);var r=e.length++;return Object.defineProperty({},"_",{set:function(o){e[r]=o,t.apply(n,e)}})}',{globals:["Object"],locals:{_toSetter:["body.0.id"]},exportBindingAssignments:[],exportName:"_toSetter",dependencies:{}}),typeof:$m("7.0.0-beta.0",'function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof(o)}',{globals:["Symbol"],locals:{_typeof:["body.0.id","body.0.body.body.0.argument.expressions.1.callee","body.0.body.body.0.argument.expressions.0.left"]},exportBindingAssignments:["body.0.body.body.0.argument.expressions.0"],exportName:"_typeof",dependencies:{}}),unsupportedIterableToArray:$m("7.9.0",'function _unsupportedIterableToArray(r,a){if(r){if("string"==typeof r)return arrayLikeToArray(r,a);var t={}.toString.call(r).slice(8,-1);return"Object"===t&&r.constructor&&(t=r.constructor.name),"Map"===t||"Set"===t?Array.from(r):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?arrayLikeToArray(r,a):void 0}}',{globals:["Array"],locals:{_unsupportedIterableToArray:["body.0.id"]},exportBindingAssignments:[],exportName:"_unsupportedIterableToArray",dependencies:{arrayLikeToArray:["body.0.body.body.0.consequent.body.0.consequent.argument.callee","body.0.body.body.0.consequent.body.2.argument.expressions.1.alternate.consequent.callee"]}}),usingCtx:$m("7.23.9",'function _usingCtx(){var r="function"==typeof SuppressedError?SuppressedError:function(r,e){var n=Error();return n.name="SuppressedError",n.error=r,n.suppressed=e,n},e={},n=[];function using(r,e){if(null!=e){if(Object(e)!==e)throw new TypeError("using declarations can only be used with objects, functions, null, or undefined.");if(r)var o=e[Symbol.asyncDispose||Symbol.for("Symbol.asyncDispose")];if(void 0===o&&(o=e[Symbol.dispose||Symbol.for("Symbol.dispose")],r))var t=o;if("function"!=typeof o)throw new TypeError("Object is not disposable.");t&&(o=function(){try{t.call(e)}catch(r){return Promise.reject(r)}}),n.push({v:e,d:o,a:r})}else r&&n.push({d:e,a:r});return e}return{e:e,u:using.bind(null,!1),a:using.bind(null,!0),d:function(){var o,t=this.e,s=0;function next(){for(;o=n.pop();)try{if(!o.a&&1===s)return s=0,n.push(o),Promise.resolve().then(next);if(o.d){var r=o.d.call(o.v);if(o.a)return s|=2,Promise.resolve(r).then(next,err)}else s|=1}catch(r){return err(r)}if(1===s)return t!==e?Promise.reject(t):Promise.resolve();if(t!==e)throw t}function err(n){return t=t!==e?new r(n,t):n,next()}return next()}}}',{globals:["SuppressedError","Error","Object","TypeError","Symbol","Promise"],locals:{_usingCtx:["body.0.id"]},exportBindingAssignments:[],exportName:"_usingCtx",dependencies:{}}),wrapAsyncGenerator:$m("7.0.0-beta.0",'function _wrapAsyncGenerator(e){return function(){return new AsyncGenerator(e.apply(this,arguments))}}function AsyncGenerator(e){var r,t;function resume(r,t){try{var n=e[r](t),o=n.value,u=o instanceof OverloadYield;Promise.resolve(u?o.v:o).then((function(t){if(u){var i="return"===r?"return":"next";if(!o.k||t.done)return resume(i,t);t=e[i](t).value}settle(n.done?"return":"normal",t)}),(function(e){resume("throw",e)}))}catch(e){settle("throw",e)}}function settle(e,n){switch(e){case"return":r.resolve({value:n,done:!0});break;case"throw":r.reject(n);break;default:r.resolve({value:n,done:!1})}(r=r.next)?resume(r.key,r.arg):t=null}this._invoke=function(e,n){return new Promise((function(o,u){var i={key:e,arg:n,resolve:o,reject:u,next:null};t?t=t.next=i:(r=t=i,resume(e,n))}))},"function"!=typeof e.return&&(this.return=void 0)}AsyncGenerator.prototype["function"==typeof Symbol&&Symbol.asyncIterator||"@@asyncIterator"]=function(){return this},AsyncGenerator.prototype.next=function(e){return this._invoke("next",e)},AsyncGenerator.prototype.throw=function(e){return this._invoke("throw",e)},AsyncGenerator.prototype.return=function(e){return this._invoke("return",e)};',{globals:["Promise","Symbol"],locals:{_wrapAsyncGenerator:["body.0.id"],AsyncGenerator:["body.1.id","body.0.body.body.0.argument.body.body.0.argument.callee","body.2.expression.expressions.0.left.object.object","body.2.expression.expressions.1.left.object.object","body.2.expression.expressions.2.left.object.object","body.2.expression.expressions.3.left.object.object"]},exportBindingAssignments:[],exportName:"_wrapAsyncGenerator",dependencies:{OverloadYield:["body.1.body.body.1.body.body.0.block.body.0.declarations.2.init.right"]}}),wrapNativeSuper:$m("7.0.0-beta.0",'function _wrapNativeSuper(t){var r="function"==typeof Map?new Map:void 0;return _wrapNativeSuper=function(t){if(null===t||!isNativeFunction(t))return t;if("function"!=typeof t)throw new TypeError("Super expression must either be null or a function");if(void 0!==r){if(r.has(t))return r.get(t);r.set(t,Wrapper)}function Wrapper(){return construct(t,arguments,getPrototypeOf(this).constructor)}return Wrapper.prototype=Object.create(t.prototype,{constructor:{value:Wrapper,enumerable:!1,writable:!0,configurable:!0}}),setPrototypeOf(Wrapper,t)},_wrapNativeSuper(t)}',{globals:["Map","TypeError","Object"],locals:{_wrapNativeSuper:["body.0.id","body.0.body.body.1.argument.expressions.1.callee","body.0.body.body.1.argument.expressions.0.left"]},exportBindingAssignments:["body.0.body.body.1.argument.expressions.0"],exportName:"_wrapNativeSuper",dependencies:{getPrototypeOf:["body.0.body.body.1.argument.expressions.0.right.body.body.3.body.body.0.argument.arguments.2.object.callee"],setPrototypeOf:["body.0.body.body.1.argument.expressions.0.right.body.body.4.argument.expressions.1.callee"],isNativeFunction:["body.0.body.body.1.argument.expressions.0.right.body.body.0.test.right.argument.callee"],construct:["body.0.body.body.1.argument.expressions.0.right.body.body.3.body.body.0.argument.callee"]}}),wrapRegExp:$m("7.19.0",'function _wrapRegExp(){_wrapRegExp=function(e,r){return new BabelRegExp(e,void 0,r)};var e=RegExp.prototype,r=new WeakMap;function BabelRegExp(e,t,p){var o=RegExp(e,t);return r.set(o,p||r.get(e)),setPrototypeOf(o,BabelRegExp.prototype)}function buildGroups(e,t){var p=r.get(t);return Object.keys(p).reduce((function(r,t){var o=p[t];if("number"==typeof o)r[t]=e[o];else{for(var i=0;void 0===e[o[i]]&&i+1]+)>/g,(function(e,r){var t=o[r];return"$"+(Array.isArray(t)?t.join("$"):t)})))}if("function"==typeof p){var i=this;return e[Symbol.replace].call(this,t,(function(){var e=arguments;return"object"!=typeof e[e.length-1]&&(e=[].slice.call(e)).push(buildGroups(e,i)),p.apply(this,e)}))}return e[Symbol.replace].call(this,t,p)},_wrapRegExp.apply(this,arguments)}',{globals:["RegExp","WeakMap","Object","Symbol","Array"],locals:{_wrapRegExp:["body.0.id","body.0.body.body.4.argument.expressions.3.callee.object","body.0.body.body.0.expression.left"]},exportBindingAssignments:["body.0.body.body.0.expression"],exportName:"_wrapRegExp",dependencies:{setPrototypeOf:["body.0.body.body.2.body.body.1.argument.expressions.1.callee"],inherits:["body.0.body.body.4.argument.expressions.0.callee"]}}),writeOnlyError:$m("7.12.13","function _writeOnlyError(r){throw new TypeError('\"'+r+'\" is write-only')}",{globals:["TypeError"],locals:{_writeOnlyError:["body.0.id"]},exportBindingAssignments:[],exportName:"_writeOnlyError",dependencies:{}})};Object.assign(Qm,{AwaitValue:$m("7.0.0-beta.0","function _AwaitValue(t){this.wrapped=t}",{globals:[],locals:{_AwaitValue:["body.0.id"]},exportBindingAssignments:[],exportName:"_AwaitValue",dependencies:{}}),applyDecs:$m("7.17.8",'function old_createMetadataMethodsForProperty(e,t,a,r){return{getMetadata:function(o){old_assertNotFinished(r,"getMetadata"),old_assertMetadataKey(o);var i=e[o];if(void 0!==i)if(1===t){var n=i.public;if(void 0!==n)return n[a]}else if(2===t){var l=i.private;if(void 0!==l)return l.get(a)}else if(Object.hasOwnProperty.call(i,"constructor"))return i.constructor},setMetadata:function(o,i){old_assertNotFinished(r,"setMetadata"),old_assertMetadataKey(o);var n=e[o];if(void 0===n&&(n=e[o]={}),1===t){var l=n.public;void 0===l&&(l=n.public={}),l[a]=i}else if(2===t){var s=n.priv;void 0===s&&(s=n.private=new Map),s.set(a,i)}else n.constructor=i}}}function old_convertMetadataMapToFinal(e,t){var a=e[Symbol.metadata||Symbol.for("Symbol.metadata")],r=Object.getOwnPropertySymbols(t);if(0!==r.length){for(var o=0;o=0;m--){var b;void 0!==(p=old_memberDec(h[m],r,c,l,s,o,i,n,f))&&(old_assertValidReturnValue(o,p),0===o?b=p:1===o?(b=old_getInit(p),v=p.get||f.get,y=p.set||f.set,f={get:v,set:y}):f=p,void 0!==b&&(void 0===d?d=b:"function"==typeof d?d=[d,b]:d.push(b)))}if(0===o||1===o){if(void 0===d)d=function(e,t){return t};else if("function"!=typeof d){var g=d;d=function(e,t){for(var a=t,r=0;r3,m=v>=5;if(m?(u=t,f=r,0!=(v-=5)&&(p=n=n||[])):(u=t.prototype,f=a,0!==v&&(p=i=i||[])),0!==v&&!h){var b=m?s:l,g=b.get(y)||0;if(!0===g||3===g&&4!==v||4===g&&3!==v)throw Error("Attempted to decorate a public method/accessor that has the same name as a previously decorated public method/accessor. This is not currently supported by the decorators plugin. Property name was: "+y);!g&&v>2?b.set(y,v):b.set(y,!0)}old_applyMemberDec(e,u,d,y,v,m,h,f,p)}}old_pushInitializers(e,i),old_pushInitializers(e,n)}function old_pushInitializers(e,t){t&&e.push((function(e){for(var a=0;a0){for(var o=[],i=t,n=t.name,l=r.length-1;l>=0;l--){var s={v:!1};try{var c=Object.assign({kind:"class",name:n,addInitializer:old_createAddInitializerMethod(o,s)},old_createMetadataMethodsForProperty(a,0,n,s)),d=r[l](i,c)}finally{s.v=!0}void 0!==d&&(old_assertValidReturnValue(10,d),i=d)}e.push(i,(function(){for(var e=0;e=0;v--){var g;void 0!==(f=memberDec(h[v],a,c,o,n,i,s,u))&&(assertValidReturnValue(n,f),0===n?g=f:1===n?(g=f.init,p=f.get||u.get,d=f.set||u.set,u={get:p,set:d}):u=f,void 0!==g&&(void 0===l?l=g:"function"==typeof l?l=[l,g]:l.push(g)))}if(0===n||1===n){if(void 0===l)l=function(e,t){return t};else if("function"!=typeof l){var y=l;l=function(e,t){for(var r=t,a=0;a3,h=f>=5;if(h?(l=t,0!=(f-=5)&&(u=n=n||[])):(l=t.prototype,0!==f&&(u=a=a||[])),0!==f&&!d){var v=h?s:i,g=v.get(p)||0;if(!0===g||3===g&&4!==f||4===g&&3!==f)throw Error("Attempted to decorate a public method/accessor that has the same name as a previously decorated public method/accessor. This is not currently supported by the decorators plugin. Property name was: "+p);!g&&f>2?v.set(p,f):v.set(p,!0)}applyMemberDec(e,l,c,p,f,h,d,u)}}pushInitializers(e,a),pushInitializers(e,n)}(a,e,t),function(e,t,r){if(r.length>0){for(var a=[],n=t,i=t.name,s=r.length-1;s>=0;s--){var o={v:!1};try{var c=r[s](n,{kind:"class",name:i,addInitializer:createAddInitializerMethod(a,o)})}finally{o.v=!0}void 0!==c&&(assertValidReturnValue(10,c),n=c)}e.push(n,(function(){for(var e=0;e=0;g--){var y;void 0!==(p=memberDec(v[g],n,c,s,a,i,o,f))&&(assertValidReturnValue(a,p),0===a?y=p:1===a?(y=p.init,d=p.get||f.get,h=p.set||f.set,f={get:d,set:h}):f=p,void 0!==y&&(void 0===l?l=y:"function"==typeof l?l=[l,y]:l.push(y)))}if(0===a||1===a){if(void 0===l)l=function(e,t){return t};else if("function"!=typeof l){var m=l;l=function(e,t){for(var r=t,n=0;n3,h=f>=5;if(h?(l=e,0!=(f-=5)&&(u=n=n||[])):(l=e.prototype,0!==f&&(u=r=r||[])),0!==f&&!d){var v=h?o:i,g=v.get(p)||0;if(!0===g||3===g&&4!==f||4===g&&3!==f)throw Error("Attempted to decorate a public method/accessor that has the same name as a previously decorated public method/accessor. This is not currently supported by the decorators plugin. Property name was: "+p);!g&&f>2?v.set(p,f):v.set(p,!0)}applyMemberDec(a,l,c,p,f,h,d,u)}}return pushInitializers(a,r),pushInitializers(a,n),a}function pushInitializers(e,t){t&&e.push((function(e){for(var r=0;r0){for(var r=[],n=e,a=e.name,i=t.length-1;i>=0;i--){var o={v:!1};try{var s=t[i](n,{kind:"class",name:a,addInitializer:createAddInitializerMethod(r,o)})}finally{o.v=!0}void 0!==s&&(assertValidReturnValue(10,s),n=s)}return[n,function(){for(var e=0;e=0;m--){var b;void 0!==(h=memberDec(g[m],n,u,o,a,i,s,p,c))&&(assertValidReturnValue(a,h),0===a?b=h:1===a?(b=h.init,v=h.get||p.get,y=h.set||p.set,p={get:v,set:y}):p=h,void 0!==b&&(void 0===l?l=b:"function"==typeof l?l=[l,b]:l.push(b)))}if(0===a||1===a){if(void 0===l)l=function(e,t){return t};else if("function"!=typeof l){var I=l;l=function(e,t){for(var r=t,n=0;n3,y=d>=5,g=r;if(y?(f=e,0!=(d-=5)&&(p=a=a||[]),v&&!i&&(i=function(t){return checkInRHS(t)===e}),g=i):(f=e.prototype,0!==d&&(p=n=n||[])),0!==d&&!v){var m=y?c:o,b=m.get(h)||0;if(!0===b||3===b&&4!==d||4===b&&3!==d)throw Error("Attempted to decorate a public method/accessor that has the same name as a previously decorated public method/accessor. This is not currently supported by the decorators plugin. Property name was: "+h);!b&&d>2?m.set(h,d):m.set(h,!0)}applyMemberDec(s,f,l,h,d,y,v,p,g)}}return pushInitializers(s,n),pushInitializers(s,a),s}function pushInitializers(e,t){t&&e.push((function(e){for(var r=0;r0){for(var r=[],n=e,a=e.name,i=t.length-1;i>=0;i--){var s={v:!1};try{var o=t[i](n,{kind:"class",name:a,addInitializer:createAddInitializerMethod(r,s)})}finally{s.v=!0}void 0!==o&&(assertValidReturnValue(10,o),n=o)}return[n,function(){for(var e=0;e=0;j-=r?2:1){var D=v[j],E=r?v[j-1]:void 0,I={},O={kind:["field","accessor","method","getter","setter","class"][o],name:n,metadata:a,addInitializer:function(e,t){if(e.v)throw Error("attempted to call addInitializer after decoration was finished");s(t,"An initializer","be",!0),c.push(t)}.bind(null,I)};try{if(b)(y=s(D.call(E,P,O),"class decorators","return"))&&(P=y);else{var k,F;O.static=l,O.private=f,f?2===o?k=function(e){return m(e),w.value}:(o<4&&(k=i(w,"get",m)),3!==o&&(F=i(w,"set",m))):(k=function(e){return e[n]},(o<2||4===o)&&(F=function(e,t){e[n]=t}));var N=O.access={has:f?h.bind():function(e){return n in e}};if(k&&(N.get=k),F&&(N.set=F),P=D.call(E,d?{get:w.get,set:w.set}:w[A],O),d){if("object"==typeof P&&P)(y=s(P.get,"accessor.get"))&&(w.get=y),(y=s(P.set,"accessor.set"))&&(w.set=y),(y=s(P.init,"accessor.init"))&&S.push(y);else if(void 0!==P)throw new TypeError("accessor decorators must return an object with get, set, or init properties or void 0")}else s(P,(p?"field":"method")+" decorators","return")&&(p?S.push(P):w[A]=P)}}finally{I.v=!0}}return(p||d)&&u.push((function(e,t){for(var r=S.length-1;r>=0;r--)t=S[r].call(e,t);return t})),p||b||(f?d?u.push(i(w,"get"),i(w,"set")):u.push(2===o?w[A]:i.call.bind(w[A])):Object.defineProperty(e,n,w)),P}function u(e,t){return Object.defineProperty(e,Symbol.metadata||Symbol.for("Symbol.metadata"),{configurable:!0,enumerable:!0,value:t})}if(arguments.length>=6)var l=a[Symbol.metadata||Symbol.for("Symbol.metadata")];var f=Object.create(null==l?null:l),p=function(e,t,r,n){var o,a,i=[],s=function(t){return checkInRHS(t)===e},u=new Map;function l(e){e&&i.push(c.bind(null,e))}for(var f=0;f3,y=16&d,v=!!(8&d),g=0==(d&=7),b=h+"/"+v;if(!g&&!m){var w=u.get(b);if(!0===w||3===w&&4!==d||4===w&&3!==d)throw Error("Attempted to decorate a public method/accessor that has the same name as a previously decorated public method/accessor. This is not currently supported by the decorators plugin. Property name was: "+h);u.set(b,!(d>2)||d)}applyDec(v?e:e.prototype,p,y,m?"#"+h:toPropertyKey(h),d,n,v?a=a||[]:o=o||[],i,v,m,g,1===d,v&&m?s:r)}}return l(o),l(a),i}(e,t,o,f);return r.length||u(e,f),{e:p,get c(){var t=[];return r.length&&[u(applyDec(e,[r],n,e.name,5,f,t),f),c.bind(null,t,e)]}}}',{globals:["TypeError","Array","Object","Error","Symbol","Map"],locals:{applyDecs2305:["body.0.id"]},exportBindingAssignments:[],exportName:"applyDecs2305",dependencies:{checkInRHS:["body.0.body.body.6.declarations.1.init.callee.body.body.0.declarations.3.init.body.body.0.argument.left.callee"],setFunctionName:["body.0.body.body.3.body.body.2.consequent.body.2.expression.consequent.expressions.0.consequent.right.properties.0.value.callee","body.0.body.body.3.body.body.2.consequent.body.2.expression.consequent.expressions.1.right.callee"],toPropertyKey:["body.0.body.body.6.declarations.1.init.callee.body.body.2.body.body.1.consequent.body.2.expression.arguments.3.alternate.callee"]}}),classApplyDescriptorDestructureSet:$m("7.13.10",'function _classApplyDescriptorDestructureSet(e,t){if(t.set)return"__destrObj"in t||(t.__destrObj={set value(r){t.set.call(e,r)}}),t.__destrObj;if(!t.writable)throw new TypeError("attempted to set read only private field");return t}',{globals:["TypeError"],locals:{_classApplyDescriptorDestructureSet:["body.0.id"]},exportBindingAssignments:[],exportName:"_classApplyDescriptorDestructureSet",dependencies:{}}),classApplyDescriptorGet:$m("7.13.10","function _classApplyDescriptorGet(e,t){return t.get?t.get.call(e):t.value}",{globals:[],locals:{_classApplyDescriptorGet:["body.0.id"]},exportBindingAssignments:[],exportName:"_classApplyDescriptorGet",dependencies:{}}),classApplyDescriptorSet:$m("7.13.10",'function _classApplyDescriptorSet(e,t,l){if(t.set)t.set.call(e,l);else{if(!t.writable)throw new TypeError("attempted to set read only private field");t.value=l}}',{globals:["TypeError"],locals:{_classApplyDescriptorSet:["body.0.id"]},exportBindingAssignments:[],exportName:"_classApplyDescriptorSet",dependencies:{}}),classCheckPrivateStaticAccess:$m("7.13.10","function _classCheckPrivateStaticAccess(s,a,r){return assertClassBrand(a,s,r)}",{globals:[],locals:{_classCheckPrivateStaticAccess:["body.0.id"]},exportBindingAssignments:[],exportName:"_classCheckPrivateStaticAccess",dependencies:{assertClassBrand:["body.0.body.body.0.argument.callee"]}}),classCheckPrivateStaticFieldDescriptor:$m("7.13.10",'function _classCheckPrivateStaticFieldDescriptor(t,e){if(void 0===t)throw new TypeError("attempted to "+e+" private static field before its declaration")}',{globals:["TypeError"],locals:{_classCheckPrivateStaticFieldDescriptor:["body.0.id"]},exportBindingAssignments:[],exportName:"_classCheckPrivateStaticFieldDescriptor",dependencies:{}}),classExtractFieldDescriptor:$m("7.13.10","function _classExtractFieldDescriptor(e,t){return classPrivateFieldGet2(t,e)}",{globals:[],locals:{_classExtractFieldDescriptor:["body.0.id"]},exportBindingAssignments:[],exportName:"_classExtractFieldDescriptor",dependencies:{classPrivateFieldGet2:["body.0.body.body.0.argument.callee"]}}),classPrivateFieldDestructureSet:$m("7.4.4","function _classPrivateFieldDestructureSet(e,t){var r=classPrivateFieldGet2(t,e);return classApplyDescriptorDestructureSet(e,r)}",{globals:[],locals:{_classPrivateFieldDestructureSet:["body.0.id"]},exportBindingAssignments:[],exportName:"_classPrivateFieldDestructureSet",dependencies:{classApplyDescriptorDestructureSet:["body.0.body.body.1.argument.callee"],classPrivateFieldGet2:["body.0.body.body.0.declarations.0.init.callee"]}}),classPrivateFieldGet:$m("7.0.0-beta.0","function _classPrivateFieldGet(e,t){var r=classPrivateFieldGet2(t,e);return classApplyDescriptorGet(e,r)}",{globals:[],locals:{_classPrivateFieldGet:["body.0.id"]},exportBindingAssignments:[],exportName:"_classPrivateFieldGet",dependencies:{classApplyDescriptorGet:["body.0.body.body.1.argument.callee"],classPrivateFieldGet2:["body.0.body.body.0.declarations.0.init.callee"]}}),classPrivateFieldSet:$m("7.0.0-beta.0","function _classPrivateFieldSet(e,t,r){var s=classPrivateFieldGet2(t,e);return classApplyDescriptorSet(e,s,r),r}",{globals:[],locals:{_classPrivateFieldSet:["body.0.id"]},exportBindingAssignments:[],exportName:"_classPrivateFieldSet",dependencies:{classApplyDescriptorSet:["body.0.body.body.1.argument.expressions.0.callee"],classPrivateFieldGet2:["body.0.body.body.0.declarations.0.init.callee"]}}),classPrivateMethodGet:$m("7.1.6","function _classPrivateMethodGet(s,a,r){return assertClassBrand(a,s),r}",{globals:[],locals:{_classPrivateMethodGet:["body.0.id"]},exportBindingAssignments:[],exportName:"_classPrivateMethodGet",dependencies:{assertClassBrand:["body.0.body.body.0.argument.expressions.0.callee"]}}),classPrivateMethodSet:$m("7.1.6",'function _classPrivateMethodSet(){throw new TypeError("attempted to reassign private method")}',{globals:["TypeError"],locals:{_classPrivateMethodSet:["body.0.id"]},exportBindingAssignments:[],exportName:"_classPrivateMethodSet",dependencies:{}}),classStaticPrivateFieldDestructureSet:$m("7.13.10",'function _classStaticPrivateFieldDestructureSet(t,r,s){return assertClassBrand(r,t),classCheckPrivateStaticFieldDescriptor(s,"set"),classApplyDescriptorDestructureSet(t,s)}',{globals:[],locals:{_classStaticPrivateFieldDestructureSet:["body.0.id"]},exportBindingAssignments:[],exportName:"_classStaticPrivateFieldDestructureSet",dependencies:{classApplyDescriptorDestructureSet:["body.0.body.body.0.argument.expressions.2.callee"],assertClassBrand:["body.0.body.body.0.argument.expressions.0.callee"],classCheckPrivateStaticFieldDescriptor:["body.0.body.body.0.argument.expressions.1.callee"]}}),classStaticPrivateFieldSpecGet:$m("7.0.2",'function _classStaticPrivateFieldSpecGet(t,s,r){return assertClassBrand(s,t),classCheckPrivateStaticFieldDescriptor(r,"get"),classApplyDescriptorGet(t,r)}',{globals:[],locals:{_classStaticPrivateFieldSpecGet:["body.0.id"]},exportBindingAssignments:[],exportName:"_classStaticPrivateFieldSpecGet",dependencies:{classApplyDescriptorGet:["body.0.body.body.0.argument.expressions.2.callee"],assertClassBrand:["body.0.body.body.0.argument.expressions.0.callee"],classCheckPrivateStaticFieldDescriptor:["body.0.body.body.0.argument.expressions.1.callee"]}}),classStaticPrivateFieldSpecSet:$m("7.0.2",'function _classStaticPrivateFieldSpecSet(s,t,r,e){return assertClassBrand(t,s),classCheckPrivateStaticFieldDescriptor(r,"set"),classApplyDescriptorSet(s,r,e),e}',{globals:[],locals:{_classStaticPrivateFieldSpecSet:["body.0.id"]},exportBindingAssignments:[],exportName:"_classStaticPrivateFieldSpecSet",dependencies:{classApplyDescriptorSet:["body.0.body.body.0.argument.expressions.2.callee"],assertClassBrand:["body.0.body.body.0.argument.expressions.0.callee"],classCheckPrivateStaticFieldDescriptor:["body.0.body.body.0.argument.expressions.1.callee"]}}),classStaticPrivateMethodSet:$m("7.3.2",'function _classStaticPrivateMethodSet(){throw new TypeError("attempted to set read only static private field")}',{globals:["TypeError"],locals:{_classStaticPrivateMethodSet:["body.0.id"]},exportBindingAssignments:[],exportName:"_classStaticPrivateMethodSet",dependencies:{}}),defineEnumerableProperties:$m("7.0.0-beta.0",'function _defineEnumerableProperties(e,r){for(var t in r){var n=r[t];n.configurable=n.enumerable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,t,n)}if(Object.getOwnPropertySymbols)for(var a=Object.getOwnPropertySymbols(r),b=0;b0;)try{var o=r.pop(),p=o.d.call(o.v);if(o.a)return Promise.resolve(p).then(next,err)}catch(r){return err(r)}if(s)throw e}function err(r){return e=s?new dispose_SuppressedError(e,r):r,s=!0,next()}return next()}',{globals:["SuppressedError","Error","Object","Promise"],locals:{dispose_SuppressedError:["body.0.id","body.0.body.body.0.argument.expressions.0.alternate.expressions.1.left.object","body.0.body.body.0.argument.expressions.0.alternate.expressions.1.right.arguments.1.properties.0.value.properties.0.value","body.0.body.body.0.argument.expressions.1.callee","body.1.body.body.1.body.body.0.argument.expressions.0.right.consequent.callee","body.0.body.body.0.argument.expressions.0.consequent.left","body.0.body.body.0.argument.expressions.0.alternate.expressions.0.left"],_dispose:["body.1.id"]},exportBindingAssignments:[],exportName:"_dispose",dependencies:{}}),objectSpread:$m("7.0.0-beta.0",'function _objectSpread(e){for(var r=1;r0;)e=e[n],n=a.shift();if(!(arguments.length>2))return e[n];e[n]=r}catch(e){throw e.message+=" (when accessing "+t+")",e}}var rh=Object.create(null);function ah(e){if(!rh[e]){var t=Qm[e];if(!t)throw Object.assign(new ReferenceError("Unknown helper "+e),{code:"BABEL_HELPER_UNKNOWN",helper:e});rh[e]={minVersion:t.minVersion,build:function(e,r,a,n){var s=t.ast();return function(e,t,r,a,n,s){var o=t.locals,d=t.dependencies,c=t.exportBindingAssignments,l=t.exportName,u=new Set(a||[]);r&&u.add(r);for(var p=0,f=(Object.entries||function(e){return Object.keys(e).map((function(t){return[t,e[t]]}))})(o);p=1.5*r;return Math.round(e/r)+" "+a+(n?"s":"")}return oh=function(i,d){d=d||{};var c=typeof i;if("string"===c&&i.length>0)return function(o){if((o=String(o)).length>100)return;var i=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(o);if(!i)return;var d=parseFloat(i[1]);switch((i[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return d*s;case"weeks":case"week":case"w":return d*n;case"days":case"day":case"d":return d*a;case"hours":case"hour":case"hrs":case"hr":case"h":return d*r;case"minutes":case"minute":case"mins":case"min":case"m":return d*t;case"seconds":case"second":case"secs":case"sec":case"s":return d*e;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return d;default:return}}(i);if("number"===c&&isFinite(i))return d.long?function(n){var s=Math.abs(n);if(s>=a)return o(n,s,a,"day");if(s>=r)return o(n,s,r,"hour");if(s>=t)return o(n,s,t,"minute");if(s>=e)return o(n,s,e,"second");return n+" ms"}(i):function(n){var s=Math.abs(n);if(s>=a)return Math.round(n/a)+"d";if(s>=r)return Math.round(n/r)+"h";if(s>=t)return Math.round(n/t)+"m";if(s>=e)return Math.round(n/e)+"s";return n+"ms"}(i);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(i))},oh}var ph=function(e){function t(e){var a,n,s,o=null;function i(){for(var e=arguments.length,r=new Array(e),n=0;n=31||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)},t.storage=function(){try{return localStorage}catch(e){}}(),t.destroy=(r=!1,function(){r||(r=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}),t.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"],t.log=console.debug||console.log||function(){},e.exports=ph(t),e.exports.formatters.j=function(e){try{return JSON.stringify(e)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}}(lh,lh.exports);var fh=lh.exports,gh=Au,yh=Cu,mh=gr,hh=Zt,bh=hr,vh=ae,xh=nr,Rh=oe,jh=Ue,wh=Ge,Eh=Pt,Sh=At,Th=ge,Ph=xe,Ah=_u,kh=Iu,Ch=rr,_h=Nu,Ih=Pe,Dh=Le,Oh=Bu.isCompatTag;e.isExistentialTypeParam=function(){throw new Error("`path.isExistentialTypeParam` has been renamed to `path.isExistsTypeAnnotation()` in Babel 7.")},e.isNumericLiteralTypeAnnotation=function(){throw new Error("`path.isNumericLiteralTypeAnnotation()` has been renamed to `path.isNumberLiteralTypeAnnotation()` in Babel 7.")};var Nh=Object.freeze({__proto__:null,isBindingIdentifier:function(){var e=this.node,t=this.parent,r=this.parentPath.parent;return Rh(e)&&gh(e,t,r)},isBlockScoped:function(){return yh(this.node)},isExpression:function(){return this.isIdentifier()?this.isReferencedIdentifier():hh(this.node)},isFlow:function(){var e=this.node;return!!bh(e)||(jh(e)?"type"===e.importKind||"typeof"===e.importKind:mh(e)?"type"===e.exportKind:!!wh(e)&&("type"===e.importKind||"typeof"===e.importKind))},isForAwaitStatement:function(){return Dh(this.node,{await:!0})},isGenerated:function(){return!this.isUser()},isPure:function(e){return this.scope.isPure(this.node,e)},isReferenced:function(){return Ah(this.node,this.parent)},isReferencedIdentifier:function(e){var t=this.node,r=this.parent;if(!Rh(t,e)&&!Sh(r,e)){if(!Eh(t,e))return!1;if(Oh(t.name))return!1}return Ah(t,r,this.parentPath.parent)},isReferencedMemberExpression:function(){var e=this.node,t=this.parent;return Th(e)&&Ah(e,t)},isRestProperty:function(){var e;return Ph(this.node)&&(null==(e=this.parentPath)?void 0:e.isObjectPattern())},isScope:function(){return kh(this.node,this.parent)},isSpreadProperty:function(){var e;return Ph(this.node)&&(null==(e=this.parentPath)?void 0:e.isObjectExpression())},isStatement:function(){var e=this.node,t=this.parent;if(Ch(e)){if(Ih(e)){if(xh(t,{left:e}))return!1;if(vh(t,{init:e}))return!1}return!0}return!1},isUser:function(){return this.node&&!!this.node.loc},isVar:function(){return _h(this.node)}}),Bh=Aa,Mh=Un,Fh=Sa,Lh=qn,Uh=z;function qh(e){return e in ch}function Wh(e){return null==e?void 0:e._exploded}function Gh(e){if(Wh(e))return e;e._exploded=!0;for(var t=0,r=Object.keys(e);t1&&(t+=r),r++}while(this.hasLabel(t)||this.hasBinding(t)||this.hasGlobal(t)||this.hasReference(t));var a=this.getProgramParent();return a.references[t]=!0,a.uids[t]=!0,t},t.generateUidBasedOnNode=function(e,t){var r=[];fv(e,r);var a=r.join("$");return a=a.replace(/^_/,"")||t||"ref",this.generateUid(a.slice(0,20))},t.generateUidIdentifierBasedOnNode=function(e,t){return wb(this.generateUidBasedOnNode(e,t))},t.isStatic=function(e){if(Jb(e)||Hb(e)||iv(e))return!0;if(Ob(e)){var t=this.getBinding(e.name);return t?t.constant:this.hasBinding(e.name)}return!1},t.maybeGenerateMemoised=function(e,t){if(this.isStatic(e))return null;var r=this.generateUidIdentifierBasedOnNode(e);return t?r:(this.push({id:r}),Rb(r))},t.checkBlockScopedCollisions=function(e,t,r,a){if("param"!==t&&("local"!==e.kind&&("let"===t||"let"===e.kind||"const"===e.kind||"module"===e.kind||"param"===e.kind&&"const"===t)))throw this.path.hub.buildError(a,'Duplicate declaration "'+r+'"',TypeError)},t.rename=function(e,t){var r=this.getBinding(e);r&&(t||(t=this.generateUidIdentifier(e).name),new ab(r,e,t).rename(arguments[2]))},t.dump=function(){var e="-".repeat(60);console.log(e);var t=this;do{console.log("#",t.block.type);for(var r=0,a=Object.keys(t.bindings);r0)&&this.isPure(e.body,t));if(Ab(e)){for(var o,d=i(e.body);!(o=d()).done;){var c=o.value;if(!this.isPure(c,t))return!1}return!0}if(Sb(e))return this.isPure(e.left,t)&&this.isPure(e.right,t);if(Eb(e)||sv(e)){for(var l,u=i(e.elements);!(l=u()).done;){var p=l.value;if(null!==p&&!this.isPure(p,t))return!1}return!0}if(qb(e)||nv(e)){for(var f,g=i(e.properties);!(f=g()).done;){var y=f.value;if(!this.isPure(y,t))return!1}return!0}if(Fb(e))return!(e.computed&&!this.isPure(e.key,t))&&!((null==(n=e.decorators)?void 0:n.length)>0);if(Wb(e))return!(e.computed&&!this.isPure(e.key,t))&&(!((null==(s=e.decorators)?void 0:s.length)>0)&&!((ov(e)||e.static)&&null!==e.value&&!this.isPure(e.value,t)));if(Xb(e))return this.isPure(e.argument,t);if(zb(e)){for(var m,h=i(e.expressions);!(m=h()).done;){var b=m.value;if(!this.isPure(b,t))return!1}return!0}return Kb(e)?Qb(e.tag,"String.raw")&&!this.hasBinding("String",{noGlobals:!0})&&this.isPure(e.quasi,t):Mb(e)?!e.computed&&Ob(e.object)&&"Symbol"===e.object.name&&Ob(e.property)&&"for"!==e.property.name&&!this.hasBinding("Symbol",{noGlobals:!0}):Tb(e)?Qb(e.callee,"Symbol.for")&&!this.hasBinding("Symbol",{noGlobals:!0})&&1===e.arguments.length&&ce(e.arguments[0]):Gb(e)},t.setData=function(e,t){return this.data[e]=t},t.getData=function(e){var t=this;do{var r=t.data[e];if(null!=r)return r}while(t=t.parent)},t.removeData=function(e){var t=this;do{null!=t.data[e]&&(t.data[e]=null)}while(t=t.parent)},t.init=function(){this.inited||(this.inited=!0,this.crawl())},t.crawl=function(){var e=this.path;this.references=Object.create(null),this.bindings=Object.create(null),this.globals=Object.create(null),this.uids=Object.create(null),this.data=Object.create(null);var t=this;do{if(t.crawling)return;if(t.path.isProgram())break}while(t=t.parent);var r=t,a={references:[],constantViolations:[],assignments:[]};if(this.crawling=!0,"Program"!==e.type&&Wh(gv)){for(var n,s=i(gv.enter);!(n=s()).done;){n.value.call(a,e,a)}var o=gv[e.type];if(o)for(var d,c=i(o.enter);!(d=c()).done;){d.value.call(a,e,a)}}e.traverse(gv,a),this.crawling=!1;for(var l,u=i(a.assignments);!(l=u()).done;){for(var p=l.value,f=p.getAssignmentIdentifiers(),g=0,y=Object.keys(f);g1&&(r+=t),"_"+r},mv.prototype.toArray=function(e,t,r){if(Ob(e)){var a=this.getBinding(e.name);if(null!=a&&a.constant&&a.path.isGenericType("Array"))return e}if(Eb(e))return e;if(Ob(e,{name:"arguments"}))return xb(Zb(Zb(Zb(wb("Array"),wb("prototype")),wb("slice")),wb("call")),[e]);var n,s=[e];return!0===t?n="toConsumableArray":"number"==typeof t?(s.push(ev(t)),n="slicedToArray"):n="toArray",r&&(s.unshift(this.path.hub.addHelper(n)),n="maybeArrayLike"),xb(this.path.hub.addHelper(n),s)},mv.prototype.getAllBindingsOfKind=function(){for(var e=Object.create(null),t=arguments.length,r=new Array(t),a=0;a>18&63]+Rv[n>>12&63]+Rv[n>>6&63]+Rv[63&n]);return s.join("")}function Pv(e){var t;Ev||Sv();for(var r=e.length,a=r%3,n="",s=[],o=16383,i=0,d=r-a;id?d:i+o));return 1===a?(t=e[r-1],n+=Rv[t>>2],n+=Rv[t<<4&63],n+="=="):2===a&&(t=(e[r-2]<<8)+e[r-1],n+=Rv[t>>10],n+=Rv[t>>4&63],n+=Rv[t<<2&63],n+="="),s.push(n),s.join("")}function Av(e,t,r,a,n){var s,o,i=8*n-a-1,d=(1<>1,l=-7,u=r?n-1:0,p=r?-1:1,f=e[t+u];for(u+=p,s=f&(1<<-l)-1,f>>=-l,l+=i;l>0;s=256*s+e[t+u],u+=p,l-=8);for(o=s&(1<<-l)-1,s>>=-l,l+=a;l>0;o=256*o+e[t+u],u+=p,l-=8);if(0===s)s=1-c;else{if(s===d)return o?NaN:1/0*(f?-1:1);o+=Math.pow(2,a),s-=c}return(f?-1:1)*o*Math.pow(2,s-a)}function kv(e,t,r,a,n,s){var o,i,d,c=8*s-n-1,l=(1<>1,p=23===n?Math.pow(2,-24)-Math.pow(2,-77):0,f=a?0:s-1,g=a?1:-1,y=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(i=isNaN(t)?1:0,o=l):(o=Math.floor(Math.log(t)/Math.LN2),t*(d=Math.pow(2,-o))<1&&(o--,d*=2),(t+=o+u>=1?p/d:p*Math.pow(2,1-u))*d>=2&&(o++,d/=2),o+u>=l?(i=0,o=l):o+u>=1?(i=(t*d-1)*Math.pow(2,n),o+=u):(i=t*Math.pow(2,u-1)*Math.pow(2,n),o=0));n>=8;e[r+f]=255&i,f+=g,i/=256,n-=8);for(o=o<0;e[r+f]=255&o,f+=g,o/=256,c-=8);e[r+f-g]|=128*y}var Cv={}.toString,_v=Array.isArray||function(e){return"[object Array]"==Cv.call(e)};function Iv(){return Ov.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function Dv(e,t){if(Iv()=Iv())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+Iv().toString(16)+" bytes");return 0|e}function Uv(e){return!(null==e||!e._isBuffer)}function qv(e,t){if(Uv(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var r=e.length;if(0===r)return 0;for(var a=!1;;)switch(t){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":case void 0:return gx(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return yx(e).length;default:if(a)return gx(e).length;t=(""+t).toLowerCase(),a=!0}}function Wv(e,t,r){var a=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return"";if((r>>>=0)<=(t>>>=0))return"";for(e||(e="utf8");;)switch(e){case"hex":return ax(this,t,r);case"utf8":case"utf-8":return Zv(this,t,r);case"ascii":return tx(this,t,r);case"latin1":case"binary":return rx(this,t,r);case"base64":return Qv(this,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return nx(this,t,r);default:if(a)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),a=!0}}function Gv(e,t,r){var a=e[t];e[t]=e[r],e[r]=a}function Vv(e,t,r,a,n){if(0===e.length)return-1;if("string"==typeof r?(a=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),r=+r,isNaN(r)&&(r=n?0:e.length-1),r<0&&(r=e.length+r),r>=e.length){if(n)return-1;r=e.length-1}else if(r<0){if(!n)return-1;r=0}if("string"==typeof t&&(t=Ov.from(t,a)),Uv(t))return 0===t.length?-1:Hv(e,t,r,a,n);if("number"==typeof t)return t&=255,Ov.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?n?Uint8Array.prototype.indexOf.call(e,t,r):Uint8Array.prototype.lastIndexOf.call(e,t,r):Hv(e,[t],r,a,n);throw new TypeError("val must be string, number or Buffer")}function Hv(e,t,r,a,n){var s,o=1,i=e.length,d=t.length;if(void 0!==a&&("ucs2"===(a=String(a).toLowerCase())||"ucs-2"===a||"utf16le"===a||"utf-16le"===a)){if(e.length<2||t.length<2)return-1;o=2,i/=2,d/=2,r/=2}function c(e,t){return 1===o?e[t]:e.readUInt16BE(t*o)}if(n){var l=-1;for(s=r;si&&(r=i-d),s=r;s>=0;s--){for(var u=!0,p=0;pn&&(a=n):a=n;var s=t.length;if(s%2!=0)throw new TypeError("Invalid hex string");a>s/2&&(a=s/2);for(var o=0;o>8,n=r%256,s.push(n),s.push(a);return s}(t,e.length-r),e,r,a)}function Qv(e,t,r){return 0===t&&r===e.length?Pv(e):Pv(e.slice(t,r))}function Zv(e,t,r){r=Math.min(e.length,r);for(var a=[],n=t;n239?4:c>223?3:c>191?2:1;if(n+u<=r)switch(u){case 1:c<128&&(l=c);break;case 2:128==(192&(s=e[n+1]))&&(d=(31&c)<<6|63&s)>127&&(l=d);break;case 3:s=e[n+1],o=e[n+2],128==(192&s)&&128==(192&o)&&(d=(15&c)<<12|(63&s)<<6|63&o)>2047&&(d<55296||d>57343)&&(l=d);break;case 4:s=e[n+1],o=e[n+2],i=e[n+3],128==(192&s)&&128==(192&o)&&128==(192&i)&&(d=(15&c)<<18|(63&s)<<12|(63&o)<<6|63&i)>65535&&d<1114112&&(l=d)}null===l?(l=65533,u=1):l>65535&&(l-=65536,a.push(l>>>10&1023|55296),l=56320|1023&l),a.push(l),n+=u}return function(e){var t=e.length;if(t<=ex)return String.fromCharCode.apply(String,e);var r="",a=0;for(;a0&&(e=this.toString("hex",0,50).match(/.{2}/g).join(" "),this.length>50&&(e+=" ... ")),""},Ov.prototype.compare=function(e,t,r,a,n){if(!Uv(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===r&&(r=e?e.length:0),void 0===a&&(a=0),void 0===n&&(n=this.length),t<0||r>e.length||a<0||n>this.length)throw new RangeError("out of range index");if(a>=n&&t>=r)return 0;if(a>=n)return-1;if(t>=r)return 1;if(this===e)return 0;for(var s=(n>>>=0)-(a>>>=0),o=(r>>>=0)-(t>>>=0),i=Math.min(s,o),d=this.slice(a,n),c=e.slice(t,r),l=0;ln)&&(r=n),e.length>0&&(r<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");a||(a="utf8");for(var s=!1;;)switch(a){case"hex":return Kv(this,e,t,r);case"utf8":case"utf-8":return zv(this,e,t,r);case"ascii":return Jv(this,e,t,r);case"latin1":case"binary":return Xv(this,e,t,r);case"base64":return Yv(this,e,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return $v(this,e,t,r);default:if(s)throw new TypeError("Unknown encoding: "+a);a=(""+a).toLowerCase(),s=!0}},Ov.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var ex=4096;function tx(e,t,r){var a="";r=Math.min(e.length,r);for(var n=t;na)&&(r=a);for(var n="",s=t;sr)throw new RangeError("Trying to access beyond buffer length")}function ox(e,t,r,a,n,s){if(!Uv(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>n||te.length)throw new RangeError("Index out of range")}function ix(e,t,r,a){t<0&&(t=65535+t+1);for(var n=0,s=Math.min(e.length-r,2);n>>8*(a?n:1-n)}function dx(e,t,r,a){t<0&&(t=4294967295+t+1);for(var n=0,s=Math.min(e.length-r,4);n>>8*(a?n:3-n)&255}function cx(e,t,r,a,n,s){if(r+a>e.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function lx(e,t,r,a,n){return n||cx(e,0,r,4),kv(e,t,r,a,23,4),r+4}function ux(e,t,r,a,n){return n||cx(e,0,r,8),kv(e,t,r,a,52,8),r+8}Ov.prototype.slice=function(e,t){var r,a=this.length;if((e=~~e)<0?(e+=a)<0&&(e=0):e>a&&(e=a),(t=void 0===t?a:~~t)<0?(t+=a)<0&&(t=0):t>a&&(t=a),t0&&(n*=256);)a+=this[e+--t]*n;return a},Ov.prototype.readUInt8=function(e,t){return t||sx(e,1,this.length),this[e]},Ov.prototype.readUInt16LE=function(e,t){return t||sx(e,2,this.length),this[e]|this[e+1]<<8},Ov.prototype.readUInt16BE=function(e,t){return t||sx(e,2,this.length),this[e]<<8|this[e+1]},Ov.prototype.readUInt32LE=function(e,t){return t||sx(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},Ov.prototype.readUInt32BE=function(e,t){return t||sx(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},Ov.prototype.readIntLE=function(e,t,r){e|=0,t|=0,r||sx(e,t,this.length);for(var a=this[e],n=1,s=0;++s=(n*=128)&&(a-=Math.pow(2,8*t)),a},Ov.prototype.readIntBE=function(e,t,r){e|=0,t|=0,r||sx(e,t,this.length);for(var a=t,n=1,s=this[e+--a];a>0&&(n*=256);)s+=this[e+--a]*n;return s>=(n*=128)&&(s-=Math.pow(2,8*t)),s},Ov.prototype.readInt8=function(e,t){return t||sx(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},Ov.prototype.readInt16LE=function(e,t){t||sx(e,2,this.length);var r=this[e]|this[e+1]<<8;return 32768&r?4294901760|r:r},Ov.prototype.readInt16BE=function(e,t){t||sx(e,2,this.length);var r=this[e+1]|this[e]<<8;return 32768&r?4294901760|r:r},Ov.prototype.readInt32LE=function(e,t){return t||sx(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},Ov.prototype.readInt32BE=function(e,t){return t||sx(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},Ov.prototype.readFloatLE=function(e,t){return t||sx(e,4,this.length),Av(this,e,!0,23,4)},Ov.prototype.readFloatBE=function(e,t){return t||sx(e,4,this.length),Av(this,e,!1,23,4)},Ov.prototype.readDoubleLE=function(e,t){return t||sx(e,8,this.length),Av(this,e,!0,52,8)},Ov.prototype.readDoubleBE=function(e,t){return t||sx(e,8,this.length),Av(this,e,!1,52,8)},Ov.prototype.writeUIntLE=function(e,t,r,a){(e=+e,t|=0,r|=0,a)||ox(this,e,t,r,Math.pow(2,8*r)-1,0);var n=1,s=0;for(this[t]=255&e;++s=0&&(s*=256);)this[t+n]=e/s&255;return t+r},Ov.prototype.writeUInt8=function(e,t,r){return e=+e,t|=0,r||ox(this,e,t,1,255,0),Ov.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},Ov.prototype.writeUInt16LE=function(e,t,r){return e=+e,t|=0,r||ox(this,e,t,2,65535,0),Ov.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):ix(this,e,t,!0),t+2},Ov.prototype.writeUInt16BE=function(e,t,r){return e=+e,t|=0,r||ox(this,e,t,2,65535,0),Ov.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):ix(this,e,t,!1),t+2},Ov.prototype.writeUInt32LE=function(e,t,r){return e=+e,t|=0,r||ox(this,e,t,4,4294967295,0),Ov.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):dx(this,e,t,!0),t+4},Ov.prototype.writeUInt32BE=function(e,t,r){return e=+e,t|=0,r||ox(this,e,t,4,4294967295,0),Ov.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):dx(this,e,t,!1),t+4},Ov.prototype.writeIntLE=function(e,t,r,a){if(e=+e,t|=0,!a){var n=Math.pow(2,8*r-1);ox(this,e,t,r,n-1,-n)}var s=0,o=1,i=0;for(this[t]=255&e;++s>0)-i&255;return t+r},Ov.prototype.writeIntBE=function(e,t,r,a){if(e=+e,t|=0,!a){var n=Math.pow(2,8*r-1);ox(this,e,t,r,n-1,-n)}var s=r-1,o=1,i=0;for(this[t+s]=255&e;--s>=0&&(o*=256);)e<0&&0===i&&0!==this[t+s+1]&&(i=1),this[t+s]=(e/o>>0)-i&255;return t+r},Ov.prototype.writeInt8=function(e,t,r){return e=+e,t|=0,r||ox(this,e,t,1,127,-128),Ov.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},Ov.prototype.writeInt16LE=function(e,t,r){return e=+e,t|=0,r||ox(this,e,t,2,32767,-32768),Ov.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):ix(this,e,t,!0),t+2},Ov.prototype.writeInt16BE=function(e,t,r){return e=+e,t|=0,r||ox(this,e,t,2,32767,-32768),Ov.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):ix(this,e,t,!1),t+2},Ov.prototype.writeInt32LE=function(e,t,r){return e=+e,t|=0,r||ox(this,e,t,4,2147483647,-2147483648),Ov.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):dx(this,e,t,!0),t+4},Ov.prototype.writeInt32BE=function(e,t,r){return e=+e,t|=0,r||ox(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),Ov.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):dx(this,e,t,!1),t+4},Ov.prototype.writeFloatLE=function(e,t,r){return lx(this,e,t,!0,r)},Ov.prototype.writeFloatBE=function(e,t,r){return lx(this,e,t,!1,r)},Ov.prototype.writeDoubleLE=function(e,t,r){return ux(this,e,t,!0,r)},Ov.prototype.writeDoubleBE=function(e,t,r){return ux(this,e,t,!1,r)},Ov.prototype.copy=function(e,t,r,a){if(r||(r=0),a||0===a||(a=this.length),t>=e.length&&(t=e.length),t||(t=0),a>0&&a=this.length)throw new RangeError("sourceStart out of bounds");if(a<0)throw new RangeError("sourceEnd out of bounds");a>this.length&&(a=this.length),e.length-t=0;--n)e[n+t]=this[n+r];else if(s<1e3||!Ov.TYPED_ARRAY_SUPPORT)for(n=0;n>>=0,r=void 0===r?this.length:r>>>0,e||(e=0),"number"==typeof e)for(s=t;s55295&&r<57344){if(!n){if(r>56319){(t-=3)>-1&&s.push(239,191,189);continue}if(o+1===a){(t-=3)>-1&&s.push(239,191,189);continue}n=r;continue}if(r<56320){(t-=3)>-1&&s.push(239,191,189),n=r;continue}r=65536+(n-55296<<10|r-56320)}else n&&(t-=3)>-1&&s.push(239,191,189);if(n=null,r<128){if((t-=1)<0)break;s.push(r)}else if(r<2048){if((t-=2)<0)break;s.push(r>>6|192,63&r|128)}else if(r<65536){if((t-=3)<0)break;s.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;s.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return s}function yx(e){return function(e){var t,r,a,n,s,o;Ev||Sv();var i=e.length;if(i%4>0)throw new Error("Invalid string. Length must be a multiple of 4");s="="===e[i-2]?2:"="===e[i-1]?1:0,o=new wv(3*i/4-s),a=s>0?i-4:i;var d=0;for(t=0,r=0;t>16&255,o[d++]=n>>8&255,o[d++]=255&n;return 2===s?(n=jv[e.charCodeAt(t)]<<2|jv[e.charCodeAt(t+1)]>>4,o[d++]=255&n):1===s&&(n=jv[e.charCodeAt(t)]<<10|jv[e.charCodeAt(t+1)]<<4|jv[e.charCodeAt(t+2)]>>2,o[d++]=n>>8&255,o[d++]=255&n),o}(function(e){if((e=function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}(e).replace(px,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function mx(e,t,r,a){for(var n=0;n=t.length||n>=e.length);++n)t[n+r]=e[n];return n}function hx(e){return null!=e&&(!!e._isBuffer||bx(e)||function(e){return"function"==typeof e.readFloatLE&&"function"==typeof e.slice&&bx(e.slice(0,0))}(e))}function bx(e){return!!e.constructor&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)}var vx,xx={exports:{}};function Rx(){return vx||(vx=1,function(e,t){!function(e){for(var t=",".charCodeAt(0),r=";".charCodeAt(0),a="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",n=new Uint8Array(64),s=new Uint8Array(128),o=0;o>>=1,c&&(n=-2147483648|-n),r[a]+=n,t}function p(e,r,a){return!(r>=a)&&e.charCodeAt(r)!==t}function f(e){e.sort(g)}function g(e,t){return e[0]-t[0]}function y(e){for(var a=new Int32Array(5),n=16384,s=n-36,o=new Uint8Array(n),i=o.subarray(0,s),c=0,l="",u=0;u0&&(c===n&&(l+=d.decode(o),c=0),o[c++]=r),0!==p.length){a[0]=0;for(var f=0;fs&&(l+=d.decode(i),o.copyWithin(0,s,c),c-=s),f>0&&(o[c++]=t),c=m(o,c,a,g,0),1!==g.length&&(c=m(o,c,a,g,1),c=m(o,c,a,g,2),c=m(o,c,a,g,3),4!==g.length&&(c=m(o,c,a,g,4)))}}}return l+d.decode(o.subarray(0,c))}function m(e,t,r,a,s){var o=a[s],i=o-r[s];r[s]=o,i=i<0?-i<<1|1:i<<1;do{var d=31&i;(i>>>=5)>0&&(d|=32),e[t++]=n[d]}while(i>0);return t}e.decode=c,e.encode=y,Object.defineProperty(e,"__esModule",{value:!0})}(t)}(0,xx.exports)),xx.exports}var jx,wx={exports:{}},Ex={exports:{}};function Sx(){return jx||(jx=1,function(e,t){e.exports=function(){var e=/^[\w+.-]+:\/\//,t=/^([\w+.-]+:)\/\/([^@/#?]*@)?([^:/#?]*)(:\d+)?(\/[^#?]*)?(\?[^#]*)?(#.*)?/,r=/^file:(?:\/\/((?![a-z]:)[^/#?]*)?)?(\/?[^#?]*)(\?[^#]*)?(#.*)?/i;function a(t){return e.test(t)}function n(e){return e.startsWith("//")}function s(e){return e.startsWith("/")}function o(e){return e.startsWith("file:")}function i(e){return/^[.?#]/.test(e)}function d(e){var r=t.exec(e);return l(r[1],r[2]||"",r[3],r[4]||"",r[5]||"/",r[6]||"",r[7]||"")}function c(e){var t=r.exec(e),a=t[2];return l("file:","",t[1]||"","",s(a)?a:"/"+a,t[3]||"",t[4]||"")}function l(e,t,r,a,n,s,o){return{scheme:e,user:t,host:r,port:a,path:n,query:s,hash:o,type:7}}function u(e){if(n(e)){var t=d("http:"+e);return t.scheme="",t.type=6,t}if(s(e)){var r=d("http://foo.com"+e);return r.scheme="",r.host="",r.type=5,r}if(o(e))return c(e);if(a(e))return d(e);var i=d("http://foo.com/"+e);return i.scheme="",i.host="",i.type=e?e.startsWith("?")?3:e.startsWith("#")?2:4:1,i}function p(e){if(e.endsWith("/.."))return e;var t=e.lastIndexOf("/");return e.slice(0,t+1)}function f(e,t){g(t,t.type),"/"===e.path?e.path=t.path:e.path=p(t.path)+e.path}function g(e,t){for(var r=t<=4,a=e.path.split("/"),n=1,s=0,o=!1,i=1;ia&&(a=s)}g(r,a);var o=r.query+r.hash;switch(a){case 2:case 3:return o;case 4:var d=r.path.slice(1);return d?i(t||e)&&!i(d)?"./"+d+o:d+o:o||".";case 5:return r.path+o;default:return r.scheme+"//"+r.user+r.host+r.port+r.path+o}}return y}()}(Ex)),Ex.exports}!function(e,t){!function(e,t,r){function a(e,t){return t&&!t.endsWith("/")&&(t+="/"),r(e,t)}function n(e){if(!e)return"";var t=e.lastIndexOf("/");return e.slice(0,t+1)}var s=0,i=1,d=2,c=3,l=4,u=1,p=2;function f(e,t){var r=g(e,0);if(r===e.length)return e;t||(e=e.slice());for(var a=r;a>1),o=e[n][s]-t;if(0===o)return b=!0,n;o<0?r=n+1:a=n-1}return b=!1,r-1}function x(e,t,r){for(var a=r+1;a=0&&e[a][s]===t;r=a--);return r}function j(){return{lastKey:-1,lastNeedle:-1,lastIndex:-1}}function w(e,t,r,a){var n=r.lastKey,o=r.lastNeedle,i=r.lastIndex,d=0,c=e.length-1;if(a===n){if(t===o)return b=-1!==i&&e[i][s]===t,i;t>=o?d=-1===i?0:i:c=i}return r.lastKey=a,r.lastNeedle=t,r.lastIndex=v(e,t,d,c)}function E(e,t){for(var r=t.map(T),a=0;at;a--)e[a]=e[a-1];e[t]=r}function T(){return{__proto__:null}}var P=function(e,t){var r=A(e);if(!("sections"in r))return new M(r,t);var a=[],n=[],s=[],o=[],i=[];return k(r,t,a,n,s,o,i,0,0,1/0,1/0),X({version:3,file:r.file,names:o,sources:n,sourcesContent:s,mappings:a,ignoreList:i})};function A(e){return"string"==typeof e?JSON.parse(e):e}function k(e,t,r,a,n,s,o,i,d,c,l){for(var u=e.sections,p=0;pg)return;for(var C=I(r,P),D=0===T?f:0,O=x[T],N=0;N=y)return;if(1!==B.length){var L=b+B[i],q=B[d],W=B[c];C.push(4===B.length?[F,L,q,W]:[F,L,q,W,v+B[l]])}else C.push([F])}}}function _(e,t){for(var r=0;r=a.length)return null;var n=a[t],s=te(n,F(e)._decodedMemo,t,r,B);return-1===s?null:n[s]}function W(e,t){var r=t.line,a=t.column,n=t.bias;if(--r<0)throw new Error(D);if(a<0)throw new Error(O);var s=U(e);if(r>=s.length)return Z(null,null,null,null);var o=s[r],u=te(o,F(e)._decodedMemo,r,a,n||B);if(-1===u)return Z(null,null,null,null);var p=o[u];if(1===p.length)return Z(null,null,null,null);var f=e.names;return Z(e.resolvedSources[p[i]],p[d]+1,p[c],5===p.length?f[p[l]]:null)}function G(e,t){return ae(e,t.source,t.line,t.column,t.bias||B,!1)}function V(e,t){return ae(e,t.source,t.line,t.column,t.bias||N,!0)}function H(e,t){for(var r=U(e),a=e.names,n=e.resolvedSources,s=0;s=0&&!(t>=e[a][n]);r=a--);return r}function T(e,t,r){for(var a=e.length;a>t;a--)e[a]=e[a-1];e[t]=r}function P(e){for(var t=e.length,r=t,a=r-1;a>=0&&!(e[a].length>0);r=a,a--);r1?this._indentChar.repeat(t):this._indentChar}else this._str+=t>1?String.fromCharCode(e).repeat(t):String.fromCharCode(e);10!==e?(this._mark(r.line,r.column,r.identifierName,r.identifierNamePos,r.filename),this._position.column+=t):(this._position.line++,this._position.column=0),this._canMarkIdName&&(r.identifierName=void 0,r.identifierNamePos=void 0)},t._append=function(e,t,r){var a=e.length,n=this._position;if(this._last=e.charCodeAt(a-1),++this._appendCount>4096?(this._str,this._buf+=this._str,this._str=e,this._appendCount=0):this._str+=e,r||this._map){var s=t.column,o=t.identifierName,i=t.identifierNamePos,d=t.filename,c=t.line;null==o&&null==i||!this._canMarkIdName||(t.identifierName=void 0,t.identifierNamePos=void 0);var l=e.indexOf("\n"),u=0;for(0!==l&&this._mark(c,s,o,i,d);-1!==l;)n.line++,n.column=0,(u=l+1)=0&&10===this._queue[r].char;r--)t++;return t===e&&10===this._last?t+1:t},t.endsWithCharAndNewline=function(){var e=this._queue,t=this._queueCursor;if(0!==t){if(10!==e[t-1].char)return;return t>1?e[t-2].char:this._last}},t.hasContent=function(){return 0!==this._queueCursor||!!this._last},t.exactSource=function(e,t){if(this._map){this.source("start",e);var r=e.identifierName,a=this._sourcePosition;r&&(this._canMarkIdName=!1,a.identifierName=r),t(),r&&(this._canMarkIdName=!0,a.identifierName=void 0,a.identifierNamePos=void 0),this.source("end",e)}else t()},t.source=function(e,t){this._map&&this._normalizePosition(e,t,0)},t.sourceWithOffset=function(e,t,r){this._map&&this._normalizePosition(e,t,r)},t._normalizePosition=function(e,t,r){var a=t[e],n=this._sourcePosition;a&&(n.line=a.line,n.column=Math.max(a.column+r,0),n.filename=t.filename)},t.getCurrentColumn=function(){for(var e=this._queue,t=this._queueCursor,r=-1,a=0,n=0;n",0],["&&",1],["|",2],["^",3],["&",4],["==",5],["===",5],["!=",5],["!==",5],["<",6],[">",6],["<=",6],[">=",6],["in",6],["instanceof",6],[">>",7],["<<",7],[">>>",7],["+",8],["-",8],["*",9],["/",9],["%",9],["**",10]]);function oR(e,t){return"BinaryExpression"===t||"LogicalExpression"===t?sR.get(e.operator):"TSAsExpression"===t||"TSSatisfiesExpression"===t?sR.get("in"):void 0}function iR(e){return"TSAsExpression"===e||"TSSatisfiesExpression"===e||"TSTypeAssertion"===e}var dR=function(e,t){var r=t.type;return("ClassDeclaration"===r||"ClassExpression"===r)&&t.superClass===e},cR=function(e,t){var r=t.type;return("MemberExpression"===r||"OptionalMemberExpression"===r)&&t.object===e||("CallExpression"===r||"OptionalCallExpression"===r||"NewExpression"===r)&&t.callee===e||"TaggedTemplateExpression"===r&&t.tag===e||"TSNonNullExpression"===r};function lR(e){return Boolean(e&(PR.expressionStatement|PR.arrowBody))}function uR(e,t){var r=t.type;if("BinaryExpression"===e.type&&"**"===e.operator&&"BinaryExpression"===r&&"**"===t.operator)return t.left===e;if(dR(e,t))return!0;if(cR(e,t)||"UnaryExpression"===r||"SpreadElement"===r||"AwaitExpression"===r)return!0;var a=oR(t,r);if(null!=a){var n=oR(e,e.type);if(a===n&&"BinaryExpression"===r&&t.right===e||a>n)return!0}}function pR(e,t){var r=t.type;return"ArrayTypeAnnotation"===r||"NullableTypeAnnotation"===r||"IntersectionTypeAnnotation"===r||"UnionTypeAnnotation"===r}function fR(e,t){return("AssignmentExpression"===t.type||"AssignmentPattern"===t.type)&&t.left===e||("BinaryExpression"===t.type&&("|"===t.operator||"&"===t.operator)&&e===t.left||uR(e,t))}function gR(e,t){var r=t.type;return"TSIntersectionType"===r||"TSUnionType"===r||"TSTypeOperator"===r||"TSOptionalType"===r||"TSArrayType"===r||"TSIndexedAccessType"===r&&t.objectType===e||"TSConditionalType"===r&&(t.checkType===e||t.extendsType===e)}function yR(e,t){var r=t.type;return"BinaryExpression"===r||"LogicalExpression"===r||"UnaryExpression"===r||"SpreadElement"===r||cR(e,t)||"AwaitExpression"===r&&aR(e)||"ConditionalExpression"===r&&e===t.test||dR(e,t)||iR(r)}function mR(e,t){return cR(e,t)||Yx(t)&&"**"===t.operator&&t.left===e||dR(e,t)}function hR(e,t){var r=t.type;return!!("UnaryExpression"===r||"SpreadElement"===r||"BinaryExpression"===r||"LogicalExpression"===r||"ConditionalExpression"===r&&t.test===e||"AwaitExpression"===r||iR(r))||mR(e,t)}function bR(e,t){return $x(t)&&t.callee===e||eR(t)&&t.object===e}var vR=Object.freeze({__proto__:null,ArrowFunctionExpression:hR,AssignmentExpression:function(e,t,r){return!(!lR(r)||!tR(e.left))||hR(e,t)},AwaitExpression:yR,Binary:uR,BinaryExpression:function(e,t,r,a){return"in"===e.operator&&a},ClassExpression:function(e,t,r){return Boolean(r&(PR.expressionStatement|PR.exportDefault))},ConditionalExpression:hR,DoExpression:function(e,t,r){return!e.async&&Boolean(r&PR.expressionStatement)},FunctionExpression:function(e,t,r){return Boolean(r&(PR.expressionStatement|PR.exportDefault))},FunctionTypeAnnotation:function(e,t,r){var a=t.type;return"UnionTypeAnnotation"===a||"IntersectionTypeAnnotation"===a||"ArrayTypeAnnotation"===a||Boolean(r&PR.arrowFlowReturnType)},Identifier:function(e,t,r,a,n){var s,o=t.type;if(null!=(s=e.extra)&&s.parenthesized&&"AssignmentExpression"===o&&t.left===e){var i=t.right.type;if(("FunctionExpression"===i||"ClassExpression"===i)&&null==t.right.id)return!0}return(!n||n(e)===e.name)&&("let"===e.name?!!((eR(t,{object:e,computed:!0})||rR(t,{object:e,computed:!0,optional:!1}))&&r&(PR.expressionStatement|PR.forHead|PR.forInHead))||Boolean(r&PR.forOfHead):"async"===e.name&&Qx(t,{left:e,await:!1}))},IntersectionTypeAnnotation:pR,LogicalExpression:function(e,t){var r=t.type;if(iR(r))return!0;if("LogicalExpression"!==r)return!1;switch(e.operator){case"||":return"??"===t.operator||"&&"===t.operator;case"&&":return"??"===t.operator;case"??":return"??"!==t.operator}},NullableTypeAnnotation:function(e,t){return Xx(t)},ObjectExpression:function(e,t,r){return lR(r)},OptionalCallExpression:bR,OptionalIndexedAccessType:function(e,t){return Zx(t)&&t.objectType===e},OptionalMemberExpression:bR,SequenceExpression:function(e,t){var r=t.type;return!("SequenceExpression"===r||"ParenthesizedExpression"===r||"MemberExpression"===r&&t.property===e||"OptionalMemberExpression"===r&&t.property===e||"TemplateLiteral"===r)&&("ClassDeclaration"===r||("ForOfStatement"===r?t.right===e:"ExportDefaultDeclaration"===r||!nR(t)))},TSAsExpression:fR,TSConditionalType:function(e,t){var r=t.type;return"TSArrayType"===r||"TSIndexedAccessType"===r&&t.objectType===e||"TSOptionalType"===r||"TSTypeOperator"===r||"TSTypeParameter"===r||(("TSIntersectionType"===r||"TSUnionType"===r)&&t.types[0]===e||"TSConditionalType"===r&&(t.checkType===e||t.extendsType===e))},TSConstructorType:gR,TSFunctionType:gR,TSInferType:function(e,t){var r=t.type;return"TSArrayType"===r||"TSIndexedAccessType"===r&&t.objectType===e||"TSOptionalType"===r||!(!e.typeParameter.constraint||"TSIntersectionType"!==r&&"TSUnionType"!==r||t.types[0]!==e)},TSInstantiationExpression:function(e,t){var r=t.type;return("CallExpression"===r||"OptionalCallExpression"===r||"NewExpression"===r||"TSInstantiationExpression"===r)&&!!t.typeParameters},TSIntersectionType:function(e,t){var r=t.type;return"TSTypeOperator"===r||"TSArrayType"===r||"TSIndexedAccessType"===r&&t.objectType===e||"TSOptionalType"===r},TSSatisfiesExpression:fR,TSTypeAssertion:mR,TSTypeOperator:function(e,t){var r=t.type;return"TSArrayType"===r||"TSIndexedAccessType"===r&&t.objectType===e||"TSOptionalType"===r},TSUnionType:function(e,t){var r=t.type;return"TSIntersectionType"===r||"TSTypeOperator"===r||"TSArrayType"===r||"TSIndexedAccessType"===r&&t.objectType===e||"TSOptionalType"===r},UnaryLike:mR,UnionTypeAnnotation:pR,UpdateExpression:function(e,t){return cR(e,t)||dR(e,t)},YieldExpression:yR}),xR=Sa,RR=wa,jR=Q,wR=Ot,ER=ge,SR=ye,TR=we,PR={expressionStatement:1,arrowBody:2,exportDefault:4,forHead:8,forInHead:16,forOfHead:32,arrowFlowReturnType:64};function AR(e){var t=new Map;function r(e,r){var a=t.get(e);t.set(e,a?function(e,t,n,s,o){var i;return null!=(i=a(e,t,n,s,o))?i:r(e,t,n,s,o)}:r)}for(var a=0,n=Object.keys(e);a0&&a._nodesToTokenIndexes.set(e,t)})),this._tokensCache=null}var t=e.prototype;return t.has=function(e){return this._nodesToTokenIndexes.has(e)},t.getIndexes=function(e){return this._nodesToTokenIndexes.get(e)},t.find=function(e,t){var r=this._nodesToTokenIndexes.get(e);if(r)for(var a=0;a=0;a--){var n=r[a];if(t(this._tokens[n],n))return n}return-1},t.findMatching=function(e,t,r){void 0===r&&(r=0);var a=this._nodesToTokenIndexes.get(e);if(a){var n=0,s=r;if(s>1){var o=this._nodesOccurrencesCountCache.get(e);o&&o.test===t&&o.count0&&this._nodesOccurrencesCountCache.set(e,{test:t,count:s,i:n}),i;r--}}}return null},t.matchesOriginal=function(e,t){return e.end-e.start===t.length&&(null!=e.value?e.value===t:this._source.startsWith(t,e.start))},t.startMatches=function(e,t){var r=this._nodesToTokenIndexes.get(e);if(!r)return!1;var a=this._tokens[r[0]];return a.start===e.start&&this.matchesOriginal(a,t)},t.endMatches=function(e,t){var r=this._nodesToTokenIndexes.get(e);if(!r)return!1;var a=this._tokens[r[r.length-1]];return a.end===e.end&&this.matchesOriginal(a,t)},t._getTokensIndexesOfNode=function(e){if(null==e.start||null==e.end)return[];var t=this._findTokensOfNode(e,0,this._tokens.length-1),r=t.first,a=t.last,n=r,s=BR(e);"ExportNamedDeclaration"!==e.type&&"ExportDefaultDeclaration"!==e.type||!e.declaration||"ClassDeclaration"!==e.declaration.type||s.next();for(var o,d=[],c=i(s);!(o=c()).done;){var l=o.value;if(null!=l&&(null!=l.start&&null!=l.end)){for(var u=this._findTokensOfNode(l,n,a),p=u.first,f=n;f>1;if(ethis._tokens[a].start))return a;t=a+1}}return t},t._findLastTokenOfNode=function(e,t,r){for(;t<=r;){var a=r+t>>1;if(ethis._tokens[a].end))return a;t=a+1}}return r},o(e)}();function BR(e){var t,r,a,n,s,o;return p().wrap((function(d){for(;;)switch(d.prev=d.next){case 0:if("TemplateLiteral"!==e.type){d.next=13;break}return d.next=3,e.quasis[0];case 3:t=1;case 4:if(!(t2?mj(p):"\\x"+("00"+p).slice(-2)})),"`"==d&&(i=i.replace(/\$\{/g,"\\${")),t.isScriptContext&&(i=i.replace(/<\/(script|style)/gi,"<\\/$1").replace(/\n${scripts}`; + }); + content = `\n\n\n\nSchema Markup Export — ${brand.domain || brand.name}\n\n\n${blocks.join("\n\n")}\n\n\n`; + mimeType = "text/html"; + ext = "html"; + } + + const blob = new Blob([content], { type: mimeType }); + const url = URL.createObjectURL(blob); + const a = document.createElement("a"); + a.href = url; + a.download = `${hostSlug}-schemas-${datestamp}.${ext}`; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + // Revoke on the next tick — the download will have started by + // then and holding the URL longer leaks a reference. + setTimeout(() => URL.revokeObjectURL(url), 1000); + show(`Downloaded ${schemas.length} schema${schemas.length === 1 ? "" : "s"} as ${ext.toUpperCase()}`); + } + + const loadSchemas = useCallback(async () => { + if (!brand?.id) return; + setLoading(true); + try { + const res = await fetch(`/api/schema?brandId=${brand.id}`); + if (res.ok) { + const d = await res.json(); + const list: SchemaRecord[] = d.schemas || []; + setSchemas(list); + // Fire-and-forget initial validation for every row so users + // land on the page already seeing green / red badges — no + // extra click required to know whether a saved schema is + // well-formed. Parallel requests: /api/schema/validate is + // pure, no DB, so N concurrent calls don't pressure the pool. + list.forEach((s) => { runValidation(s.id, s.jsonLd); }); + } + } finally { setLoading(false); } + }, [brand.id, runValidation]); + + useEffect(() => { loadSchemas(); }, [loadSchemas]); + + async function generate() { + if (!pageUrl.trim() || generating) return; + setGenerating(true); + const taskId = addTask({ id: `schema_${Date.now()}`, type: "schema_generation", label: "Generating Schema...", brandId: brand.id, resultUrl: "/schema-generator" }); + try { + const res = await fetch("/api/schema/generate", { + method: "POST", headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ brandId: brand.id, pageUrl: pageUrl.trim() }), + }); + if (res.ok) { + const data = await res.json() as GenResult; + setGenResult(data); + completeTask(taskId, { resultUrl: "/schema-generator", resultSummary: `Generated ${data.schemas.length} schema(s): ${data.recommendedTypes.join(", ")}` }); + } else { const d = await res.json().catch(() => ({})); failTask(taskId, d.error || "Generation failed"); } + } catch { failTask(taskId, "Network error"); } + setGenerating(false); + } + + /** Kick off bulk generation against the TrackedSite's top pages. + * Server derives the URL list (no need to pre-load page paths + * into the client) and runs up to 3 concurrent generators with + * a 110s wall budget. Each successful result is persisted to + * SchemaMarkup server-side; we just refresh the list on + * completion so the user sees every new row without a page + * reload. */ + async function triggerBulk() { + if (bulkRunning) return; + setBulkRunning(true); + setBulkResult(null); + const taskId = addTask({ + id: `schema_bulk_${Date.now()}`, + type: "schema_bulk_generate", + label: "Bulk generating schemas…", + brandId: brand.id, + resultUrl: "/schema-generator", + }); + try { + const res = await fetch("/api/schema/bulk-generate", { + method: "POST", + headers: { "Content-Type": "application/json" }, + // source=trackedSite uses the brand's real-traffic page list. + // Falls back to GSC and finally the homepage server-side, so + // a brand without Site Tag data still gets something useful. + body: JSON.stringify({ brandId: brand.id, source: "trackedSite" }), + }); + if (!res.ok) { + const d = await res.json().catch(() => ({})); + failTask(taskId, d.error || "Bulk generation failed"); + show(d.error || "Bulk generation failed"); + return; + } + const data = await res.json(); + setBulkResult(data); + completeTask(taskId, { + resultUrl: "/schema-generator", + resultSummary: `Bulk: ${data.succeeded} succeeded, ${data.skipped} skipped, ${data.failed} failed`, + }); + // Refresh the saved-schemas list so every newly-created row + // appears with its validation badge. Server already persisted; + // this is purely a client-side re-fetch. + await loadSchemas(); + } catch { + failTask(taskId, "Network error"); + show("Network error"); + } finally { + setBulkRunning(false); + } + } + + async function saveSchema(type: string, jsonLd: Record) { + setSaving(true); + try { + const res = await fetch("/api/schema/save", { + method: "POST", headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ brandId: brand.id, pageUrl: pageUrl.trim(), schemaType: type, jsonLd }), + }); + if (res.ok) { show("Schema saved"); await loadSchemas(); } + } finally { setSaving(false); } + } + + async function updateSchema(id: string, data: Partial) { + await fetch(`/api/schema/${id}`, { + method: "PUT", headers: { "Content-Type": "application/json" }, + body: JSON.stringify(data), + }); + await loadSchemas(); + } + + async function deleteSchema(id: string) { + if (!confirm("Delete this schema?")) return; + await fetch(`/api/schema/${id}`, { method: "DELETE" }); + if (editingId === id) { setEditingId(null); setEditCode(""); } + await loadSchemas(); + } + + function startEdit(s: SchemaRecord) { + setEditingId(s.id); + setEditCode(JSON.stringify(s.jsonLd, null, 2)); + } + + async function saveEdit() { + if (!editingId) return; + try { + const parsed = JSON.parse(editCode); + await updateSchema(editingId, { jsonLd: parsed }); + // Re-validate immediately so the badge reflects the new JSON + // instead of the pre-edit version. loadSchemas inside + // updateSchema fires auto-validate for every row, so this is + // technically redundant — but explicit here so a future + // optimisation to skip the full reload doesn't silently drop + // the validation refresh. + runValidation(editingId, parsed); + show("Schema updated"); + setEditingId(null); + } catch { show("Invalid JSON"); } + } + + const statusColors: Record = { + draft: "bg-slate-100 text-slate-600", + deployed: "bg-green-50 text-green-700", + verified: "bg-blue-50 text-blue-700", + }; + + return ( +
+
+

Schema Generator

+

Generate and manage JSON-LD structured data for your pages

+
+ + {/* Generate bar */} +
+
+
+ + setPageUrl(e.target.value)} placeholder={`https://${brand.domain}/about or /services`} + onKeyDown={(e) => e.key === "Enter" && generate()} + className="w-full pl-10 pr-4 py-2.5 text-sm border border-slate-200 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500/40 focus:border-blue-500" /> +
+ + {/* Bulk generation against the brand's top-traffic pages. + Runs up to 20 URLs (server caps), 3 concurrent, 110s + budget. Skips pages that already have a saved schema — + users re-generate by deleting first. Separated + visually (outline button + divider) so it reads as a + distinct mode from the single-URL generator on the + left. */} +
+ +
+
+ + {/* Bulk result summary. Surfaces the aggregate outcome (green + banner on full success, amber on partial / any failures) + plus an expandable list of per-URL results so users can + see which pages succeeded vs which hit errors. */} + {bulkResult && ( +
+
+ {bulkResult.failed === 0 && !bulkResult.partial ? ( + + ) : ( + + )} +
+

+ {bulkResult.message} +

+
+ ✓ {bulkResult.succeeded} saved + {bulkResult.skipped > 0 && ↷ {bulkResult.skipped} skipped (already exist)} + {bulkResult.failed > 0 && ✗ {bulkResult.failed} failed} +
+ {/* Per-URL breakdown — collapsed initially (details/ + summary native element) so a 20-URL run doesn't + dominate the page, but one click reveals every + row's outcome. */} + {bulkResult.results.length > 0 && ( +
+ + Show per-page results ({bulkResult.results.length}) + +
    + {bulkResult.results.map((r, i) => ( +
  • + {r.savedSchemaIds.length > 0 ? ( + + ) : ( + + )} + + + {r.pageUrl.replace(/^https?:\/\/[^/]+/, "") || r.pageUrl} + + {r.error && {r.error}} + {r.savedSchemaIds.length > 0 && Saved {r.savedSchemaIds.length} schema{r.savedSchemaIds.length === 1 ? "" : "s"}} + +
  • + ))} +
+
+ )} + +
+
+
+ )} + + {/* AI results */} + {genResult && ( +
+
+ +
+

AI Recommendation

+

{genResult.reasoning}

+
+ {genResult.recommendedTypes.map((t) => ( + {t} + ))} +
+
+
+ + {genResult.schemas.map((s, i) => ( +
+
+ {s.type} + +
+ { + try { const p = JSON.parse(v); genResult.schemas[i].jsonLd = p; setGenResult({ ...genResult }); } catch {} + }} height="h-48" /> +
+ ))} +
+ )} + + {/* Existing schemas table */} +
+
+

Saved Schemas ({schemas.length})

+ {/* Download-all export controls — only rendered once there's + at least one schema to export. HTML is the "hand this + to my dev team" format (ready-to-paste `; + return ( +
+
+ +
+

{s.pageUrl}

+

{s.schemaType} · Updated {new Date(s.updatedAt).toLocaleDateString()}

+
+ {badge && (() => { + const Icon = badge.icon; + return ( + + {badge.label} + + ); + })()} + {s.status} + {/* Copy JSON-LD — the bare object. Useful when + pasting into an existing ` : ""; + + return ( +
+
+
+

+ + Schema Markup + + {props.briefType === "llmo" ? "LLMO" : "SEO"} + +

+

+ Generate JSON-LD to paste into the{" "} + <head> + {" "}of your page. Auto-detects schema type from the brief. +

+
+ +
+ + {error && ( +
+ + {error} +
+ )} + + {/* Empty state — no result yet + not loading + no error. A + plain "click Generate" hint avoids the section reading as + broken when the brief first renders. */} + {!result && !loading && !error && ( +
+ Click Generate Schema to scaffold{" "} + {props.briefType === "llmo" ? "LLMO citation-friendly" : "SEO rich-results"} JSON-LD for this brief. +
+ )} + + {/* Result panel */} + {result && ( +
+ {/* Type badge + reasoning. Short, inline — users should + see WHY this @type before they copy. */} +
+ + @type: {result.schemaType} + +

+ {result.typeReasoning} +

+
+ + {/* JSON-LD code block. Pre/code with overflow-x-auto so + long keyword lists don't force the whole page to + horizontal-scroll. Monospace size small so 40-line + schemas stay within a reasonable viewport window. */} +
+
+              {jsonString}
+            
+
+ + {/* Field-filling reasoning — separate from the @type + reasoning above. This explains WHY the AI picked the + specific fields it populated (keywords array, author + org, datePublished today, etc.). */} + {result.reasoning && ( +

+ Why these fields: {result.reasoning} +

+ )} + + {/* Action buttons */} +
+ + +

+ Paste into your page's <head>. + {" "}Not deployed via Site Tag. +

+
+
+ )} + + {toast && ( +
+ {toast} +
+ )} +
+ ); +} diff --git a/src/components/content-brief/humanization-panel.tsx b/src/components/content-brief/humanization-panel.tsx new file mode 100644 index 0000000..197b056 --- /dev/null +++ b/src/components/content-brief/humanization-panel.tsx @@ -0,0 +1,155 @@ +"use client"; + +/** + * AI Humanization Score panel. Shows a circular gauge (0-100) with + * grade, expandable factor breakdown, suggestions, and a "Humanize" + * button that rewrites content via Claude to improve the score. + */ + +import { useState, useCallback } from "react"; +import { ChevronDown, Sparkles, RefreshCw, Loader2 } from "lucide-react"; + +interface ScoringFactor { name: string; score: number; weight: number; feedback: string } +interface ScoreResult { score: number; grade: string; factors: ScoringFactor[]; suggestions: string[] } + +interface Props { + content: string; + onContentReplace?: (humanized: string) => void; +} + +const GRADE_COLORS: Record = { + "Very Human": { ring: "#16a34a", text: "text-green-600", bg: "bg-green-50" }, + "Mostly Human": { ring: "#3b82f6", text: "text-blue-600", bg: "bg-blue-50" }, + "Mixed": { ring: "#f59e0b", text: "text-amber-600", bg: "bg-amber-50" }, + "AI-Detected": { ring: "#f97316", text: "text-orange-600", bg: "bg-orange-50" }, + "Strongly AI": { ring: "#ef4444", text: "text-red-600", bg: "bg-red-50" }, +}; + +export default function HumanizationPanel({ content, onContentReplace }: Props) { + const [result, setResult] = useState(null); + const [loading, setLoading] = useState(false); + const [humanizing, setHumanizing] = useState(false); + const [expanded, setExpanded] = useState(false); + const [error, setError] = useState(null); + + const runCheck = useCallback(async () => { + if (!content || content.length < 50) return; + setLoading(true); setError(null); + try { + const res = await fetch("/api/content/humanization-check", { + method: "POST", headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ content, action: "score" }), + }); + if (!res.ok) throw new Error("Scoring failed"); + setResult(await res.json()); + } catch (err) { setError(err instanceof Error ? err.message : "Failed"); } + finally { setLoading(false); } + }, [content]); + + const humanize = useCallback(async () => { + if (!content) return; + setHumanizing(true); setError(null); + try { + const res = await fetch("/api/content/humanization-check", { + method: "POST", headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ content, action: "humanize" }), + }); + if (!res.ok) throw new Error("Humanization failed"); + const data = await res.json(); + if (data.humanizedContent && onContentReplace) onContentReplace(data.humanizedContent); + if (data.after) setResult(data.after); + } catch (err) { setError(err instanceof Error ? err.message : "Failed"); } + finally { setHumanizing(false); } + }, [content, onContentReplace]); + + const colors = result ? GRADE_COLORS[result.grade] || GRADE_COLORS["Mixed"] : GRADE_COLORS["Mixed"]; + const dashArray = result ? `${(result.score / 100) * 169.6} 169.6` : "0 169.6"; + + return ( +
+
+ {/* Score ring */} +
+ + + {result && } + +
+ {result?.score ?? "—"} + /100 +
+
+ +
+

Humanization Score

+ {result ? ( + {result.grade} + ) : ( +

Check how human your content reads

+ )} +
+ + +
+ + {result && ( + <> + {/* Factor breakdown */} +
+ + {expanded && ( +
+ {result.factors.map((f) => ( +
+
+ {f.name} + = 70 ? "text-green-600" : f.score >= 40 ? "text-amber-600" : "text-red-500"}`}>{f.score} +
+
+
= 70 ? "bg-green-500" : f.score >= 40 ? "bg-amber-400" : "bg-red-400"}`} style={{ width: `${f.score}%` }} /> +
+

{f.feedback}

+
+ ))} +
+ )} +
+ + {/* Suggestions */} + {result.suggestions.length > 0 && ( +
+

Suggestions

+
    + {result.suggestions.map((s, i) => ( +
  • + + {s} +
  • + ))} +
+
+ )} + + {/* Humanize button */} + {result.score < 70 && onContentReplace && ( +
+ +

Rewrites content to sound more natural while preserving headings and information

+
+ )} + + )} + + {error &&
{error}
} +
+ ); +} diff --git a/src/components/content-brief/inline-schema-section.tsx b/src/components/content-brief/inline-schema-section.tsx new file mode 100644 index 0000000..45bb379 --- /dev/null +++ b/src/components/content-brief/inline-schema-section.tsx @@ -0,0 +1,236 @@ +"use client"; + +/** + * Inline Schema Section + * ───────────────────── + * Accordion-style schema section used by both the SEO Content Brief + * and the LLMO Content Brief. Each schema renders as a collapsed tile + * (name + short badge) that expands to show its description, a "why + * it helps" hint, and the JSON-LD payload in an editable code block. + * + * The JSON-LD payloads come from brief-schema-generator.ts — this + * component is purely presentational. Both callers pass the same + * SchemaItem[] shape; the component does not distinguish SEO vs LLMO + * schemas because the presentation is identical. + * + * Users copy schemas individually or all-at-once; the "Copy All" + * button produces a single `) + .join("\n\n"); + navigator.clipboard.writeText(blob).then( + () => { + setCopiedAll(true); + setTimeout(() => setCopiedAll(false), 2000); + }, + () => {}, + ); + } + + if (!schemas.length) { + return ( +
+ +

+ No schemas match this content type yet. Fill in topic, keyword, and FAQ questions to generate schemas. +

+
+ ); + } + + return ( +
+ {/* Section header */} +
+
+
+

{title}

+ {badge && ( + + {badge} + + )} + + {schemas.length} {schemas.length === 1 ? "schema" : "schemas"} + +
+

{subtitle ?? defaultSubtitle}

+
+ +
+ + {/* Schema rows */} +
+ {schemas.map((schema, i) => ( + + ))} +
+ + {/* Paste instructions */} +
+ +
+ How to deploy: + Copy each schema and paste it inside a{" "} + + <script type="application/ld+json">...</script> + {" "} + tag in your page's HTML head. Replace any{" "} + [placeholder]{" "} + text with your real content before publishing, and validate with Google's Rich Results Test. +
+
+
+ ); +} diff --git a/src/components/content-brief/markdown-renderer.tsx b/src/components/content-brief/markdown-renderer.tsx new file mode 100644 index 0000000..72449ac --- /dev/null +++ b/src/components/content-brief/markdown-renderer.tsx @@ -0,0 +1,86 @@ +"use client"; + +/** + * Renders markdown-formatted content with proper H1/H2/H3 styling. + * Only handles headings + paragraphs — not full markdown. Lightweight + * and dependency-free. Shows a heading count indicator at the bottom. + */ + +import React from "react"; + +interface Props { + content: string; + className?: string; +} + +function parseLine(line: string): React.ReactElement | null { + const trimmed = line.trim(); + if (!trimmed) return null; + + if (trimmed.startsWith("### ")) { + return

{trimmed.slice(4)}

; + } + if (trimmed.startsWith("## ")) { + return

{trimmed.slice(3)}

; + } + if (trimmed.startsWith("# ")) { + return

{trimmed.slice(2)}

; + } + if (trimmed.startsWith("- ") || trimmed.startsWith("* ")) { + return
  • {trimmed.slice(2)}
  • ; + } + return

    {trimmed}

    ; +} + +export default function MarkdownRenderer({ content, className }: Props) { + const lines = content.split("\n"); + const elements: React.ReactElement[] = []; + + lines.forEach((line, i) => { + const el = parseLine(line); + if (el) elements.push(React.cloneElement(el, { key: i })); + }); + + // Count headings + const h1Count = lines.filter((l) => /^# [^#]/.test(l.trim())).length; + const h2Count = lines.filter((l) => /^## [^#]/.test(l.trim())).length; + const h3Count = lines.filter((l) => /^### /.test(l.trim())).length; + + return ( +
    +
    {elements}
    + {(h1Count > 0 || h2Count > 0 || h3Count > 0) && ( +
    + Headings + H1: {h1Count} + H2: {h2Count} + H3: {h3Count} +
    + )} +
    + ); +} + +/** Convert BriefSection[] to markdown string for rendering + copy */ +export function sectionsToMarkdown(sections: Array<{ type: string; heading?: string; label?: string; content?: string }>): string { + return sections.map((s) => { + const prefix = + s.type === "h1" || s.type === "title" ? "# " : + s.type === "h2" || s.type === "question" ? "## " : + s.type === "h3" ? "### " : + s.type === "meta_title" ? "# " : + s.type === "faq" ? "## " : ""; + const headingText = s.heading || s.label; + const content = s.content || ""; + const heading = headingText ? `${prefix}${headingText}\n` : (prefix ? `${prefix}${content.split("\n")[0]}\n` : ""); + + if (s.type === "faq") { + try { + const items = JSON.parse(content) as Array<{ q: string; a: string }>; + return `${heading}${items.map((f) => `### ${f.q}\n${f.a}`).join("\n\n")}`; + } catch { return `${heading}${content}`; } + } + + return heading ? `${heading}${content}` : content; + }).join("\n\n"); +} diff --git a/src/components/dashboard/LiveSessionsCard.tsx b/src/components/dashboard/LiveSessionsCard.tsx new file mode 100644 index 0000000..54bd6ff --- /dev/null +++ b/src/components/dashboard/LiveSessionsCard.tsx @@ -0,0 +1,191 @@ +"use client"; + +import { useEffect, useState, useCallback } from "react"; +import { Activity, RefreshCw } from "lucide-react"; + +interface LiveSession { + sessionId: string; + entryPage: string; + referrer: string | null; + device: string | null; + country: string | null; + channelGroup: string | null; + score: number; + scoreBand: string; + scoreBandLabel: string; + topFactors: string[]; + startedAt: string; + lastSeenAt: string; + pageCount: number; + ageSeconds: number; +} + +interface Summary { + total: number; + highIntent: number; + avgScore: number; + windowMinutes: number; +} + +interface LiveSessionsData { + sessions: LiveSession[]; + summary: Summary | null; +} + +const BAND_COLORS: Record = { + very_high: "text-violet-700 bg-violet-50 border-violet-200", + high: "text-emerald-700 bg-emerald-50 border-emerald-200", + moderate: "text-amber-700 bg-amber-50 border-amber-200", + low: "text-slate-500 bg-slate-50 border-slate-200", + very_low: "text-slate-400 bg-slate-50 border-slate-100", +}; + +function urlPath(url: string): string { + let path = url; + try { path = new URL(url).pathname || "/"; } catch { /* keep original */ } + return path.length > 40 ? path.slice(0, 39) + "…" : path; +} + +function fmtAge(seconds: number): string { + if (seconds < 60) return `${seconds}s`; + if (seconds < 3600) return `${Math.floor(seconds / 60)}m`; + return `${Math.floor(seconds / 3600)}h ${Math.floor((seconds % 3600) / 60)}m`; +} + +export function LiveSessionsCard({ brandId }: { brandId: string }) { + const [data, setData] = useState(null); + const [loading, setLoading] = useState(true); + const [refreshing, setRefreshing] = useState(false); + const [windowMinutes, setWindowMinutes] = useState(30); + + const fetch = useCallback(async (isRefresh = false) => { + if (isRefresh) setRefreshing(true); + else setLoading(true); + try { + const res = await window.fetch(`/api/dashboard/live-sessions?brandId=${brandId}&windowMinutes=${windowMinutes}`); + if (res.ok) { + const json = await res.json(); + setData(json); + } + } finally { + setLoading(false); + setRefreshing(false); + } + }, [brandId, windowMinutes]); + + useEffect(() => { fetch(); }, [fetch]); + + // Auto-refresh every 30 seconds + useEffect(() => { + const id = setInterval(() => fetch(true), 30_000); + return () => clearInterval(id); + }, [fetch]); + + if (loading) { + return ( +
    +
    +
    + {[1, 2, 3].map((i) =>
    )} +
    +
    + ); + } + + const { sessions = [], summary } = data ?? {}; + + return ( +
    + {/* Header */} +
    +
    + +

    Live Sessions

    + {summary && ( + last {summary.windowMinutes} min + )} +
    +
    + + +
    +
    + + {/* Summary strip */} + {summary && ( +
    + {[ + { label: "Active Sessions", value: summary.total }, + { label: "High-Intent", value: summary.highIntent }, + { label: "Avg Score", value: `${summary.avgScore}/100` }, + ].map(({ label, value }) => ( +
    +

    {value}

    +

    {label}

    +
    + ))} +
    + )} + + {/* Session list */} + {sessions.length === 0 ? ( +
    + No active sessions in the last {windowMinutes} minutes. +
    + ) : ( +
    + {sessions.map((s) => ( +
    + {/* Score badge */} +
    + + {s.score} + +
    + {/* Session info */} +
    +
    + {urlPath(s.entryPage)} + + {s.scoreBandLabel} + +
    +
    + {s.channelGroup && {s.channelGroup}} + {s.device && {s.device}} + {s.country && {s.country}} + {s.pageCount} page{s.pageCount !== 1 ? "s" : ""} + {fmtAge(s.ageSeconds)} active +
    + {s.topFactors.length > 0 && ( +
    + {s.topFactors.map((f) => ( + + {f} + + ))} +
    + )} +
    +
    + ))} +
    + )} +
    + ); +} diff --git a/src/components/dashboard/conversions-by-source.tsx b/src/components/dashboard/conversions-by-source.tsx new file mode 100644 index 0000000..314272d --- /dev/null +++ b/src/components/dashboard/conversions-by-source.tsx @@ -0,0 +1,219 @@ +"use client"; + +import { useState, useEffect, useCallback } from "react"; +import { useBrand } from "@/context/brand-context"; +import { + BarChart3, Loader2, ChevronRight, X, TrendingUp, TrendingDown, + Search, Globe, Mail, Monitor, Users, MapPin, Bot, Tv, Link2, Minus, +} from "lucide-react"; + +interface ChannelRow { + channel: string; + count: number; + delta: number; + prevCount: number; +} + +const CHANNEL_META: Record = { + organic_search: { label: "Organic Search", color: "#10b981", icon: Search }, + paid_search: { label: "Paid Search", color: "#ef4444", icon: Monitor }, + paid_social: { label: "Paid Social", color: "#f43f5e", icon: Users }, + organic_social: { label: "Organic Social", color: "#3b82f6", icon: Users }, + email: { label: "Email", color: "#8b5cf6", icon: Mail }, + referral: { label: "Referral", color: "#f59e0b", icon: Link2 }, + direct: { label: "Direct", color: "#94a3b8", icon: Globe }, + display: { label: "Display", color: "#ec4899", icon: Monitor }, + affiliate: { label: "Affiliate", color: "#14b8a6", icon: Link2 }, + local_maps: { label: "Local / Maps", color: "#f97316", icon: MapPin }, + ai_assistant: { label: "AI Assistant", color: "#6366f1", icon: Bot }, + video: { label: "Video", color: "#e11d48", icon: Tv }, + internal: { label: "Internal", color: "#cbd5e1", icon: Minus }, + other: { label: "Other", color: "#9ca3af", icon: Minus }, +}; + +export default function ConversionsBySource({ range = "28d" }: { range?: string }) { + const { brand } = useBrand(); + const [data, setData] = useState<{ channels: ChannelRow[]; total: number } | null>(null); + const [loading, setLoading] = useState(true); + const [drilldown, setDrilldown] = useState(null); + + const load = useCallback(async () => { + if (!brand?.id) return; + setLoading(true); + try { + const res = await fetch(`/api/dashboard/channel-breakdown?brandId=${brand.id}&range=${range}`); + if (res.ok) setData(await res.json()); + } catch { /* silent */ } + setLoading(false); + }, [brand?.id, range]); + + useEffect(() => { load(); }, [load]); + + if (loading) { + return ( +
    +
    + +

    Conversions by Source

    +
    +
    + +
    +
    + ); + } + + if (!data || data.channels.length === 0) { + return ( +
    +
    + +

    Conversions by Source

    +
    +

    No classified conversions in this period.

    +
    + ); + } + + const maxCount = Math.max(...data.channels.map((c) => c.count), 1); + + return ( +
    +
    +
    + +

    Conversions by Source

    +
    + + Site Tag · {range} · First-touch + +
    + +
    + {data.channels.map((ch) => { + const meta = CHANNEL_META[ch.channel] ?? CHANNEL_META.other; + const Icon = meta.icon; + const pct = data.total > 0 ? Math.round((ch.count / data.total) * 100) : 0; + const barWidth = Math.max((ch.count / maxCount) * 100, 2); + + return ( + + ); + })} +
    + +
    + Total: {data.total.toLocaleString()} conversions + + {data.channels.find((c) => c.channel === "other") + ? `Other: ${Math.round(((data.channels.find((c) => c.channel === "other")?.count ?? 0) / data.total) * 100)}%` + : "Other: 0%"} + +
    + + {/* Drill-down drawer */} + {drilldown && ( +
    +
    setDrilldown(null)} /> +
    +
    +
    +

    + {CHANNEL_META[drilldown]?.label ?? drilldown} +

    +

    + {data.channels.find((c) => c.channel === drilldown)?.count.toLocaleString() ?? 0} conversions +

    +
    + +
    +
    + +
    +
    +
    + )} +
    + ); +} + +function ChannelDrilldown({ brandId, channel, range }: { brandId: string; channel: string; range: string }) { + const [data, setData] = useState<{ sources: Array<{ source: string; count: number }>; pages: Array<{ page: string; count: number }>; types: Array<{ type: string; count: number }> } | null>(null); + const [loading, setLoading] = useState(true); + + useEffect(() => { + if (!brandId || !channel) return; + fetch(`/api/dashboard/channel-drilldown?brandId=${brandId}&channel=${channel}&range=${range}`) + .then((r) => r.ok ? r.json() : null) + .then((d) => setData(d)) + .catch(() => null) + .finally(() => setLoading(false)); + }, [brandId, channel, range]); + + if (loading) return
    ; + if (!data) return

    No drill-down data available.

    ; + + return ( + <> + {data.sources.length > 0 && ( +
    +

    Top Sources

    +
    + {data.sources.slice(0, 15).map((s) => ( +
    + {s.source || "(empty)"} + {s.count} +
    + ))} +
    +
    + )} + {data.pages.length > 0 && ( +
    +

    Top Landing Pages

    +
    + {data.pages.slice(0, 10).map((p) => ( +
    + {p.page} + {p.count} +
    + ))} +
    +
    + )} + {data.types.length > 0 && ( +
    +

    Conversion Types

    +
    + {data.types.map((t) => ( +
    + {t.type} + {t.count} +
    + ))} +
    +
    + )} + + ); +} diff --git a/src/components/email-reports/create-schedule-modal.tsx b/src/components/email-reports/create-schedule-modal.tsx new file mode 100644 index 0000000..100d060 --- /dev/null +++ b/src/components/email-reports/create-schedule-modal.tsx @@ -0,0 +1,223 @@ +"use client"; + +import { useState, useEffect } from "react"; +import { X, Plus, Loader2, Mail } from "lucide-react"; +import type { ScheduleDto } from "./schedule-card"; + +const EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; +const FREQUENCIES = [ + { id: "daily", label: "Daily" }, + { id: "weekly", label: "Weekly" }, + { id: "biweekly", label: "Bi-Weekly" }, + { id: "monthly", label: "Monthly" }, +]; +const DOW = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]; +const SECTION_OPTIONS = [ + { id: "gsc", label: "GSC Data" }, + { id: "ga4", label: "GA4 Data" }, + { id: "site_tag", label: "Site Tag Analytics" }, + { id: "audit", label: "Technical Audit" }, + { id: "rank", label: "Rank Tracking" }, + { id: "conversions", label: "Conversions" }, + { id: "lifecycle", label: "Page Lifecycle" }, + { id: "ux", label: "UX Signals" }, +]; + +interface Props { + brandId: string; + open: boolean; + editing?: ScheduleDto | null; + onClose: () => void; + onSaved: () => void; +} + +export default function CreateScheduleModal({ brandId, open, editing, onClose, onSaved }: Props) { + const [name, setName] = useState(""); + const [frequency, setFrequency] = useState("weekly"); + const [dayOfWeek, setDayOfWeek] = useState(1); + const [dayOfMonth, setDayOfMonth] = useState(1); + const [timeOfDay, setTimeOfDay] = useState("08:00"); + const [emailInput, setEmailInput] = useState(""); + const [recipients, setRecipients] = useState([]); + // site_tag included in defaults so a new brand's first-ever + // schedule captures first-party analytics out of the box — users + // can uncheck it before saving if they want a GSC-only report. + const [sections, setSections] = useState>(new Set(["gsc", "ga4", "site_tag", "audit", "rank", "conversions"])); + const [aiAnalysis, setAiAnalysis] = useState(true); + const [competitorScan, setCompetitorScan] = useState(false); + const [marketInsights, setMarketInsights] = useState(false); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); + + useEffect(() => { + if (editing) { + setName(editing.name); + setFrequency(editing.frequency); + setDayOfWeek(editing.dayOfWeek ?? 1); + setDayOfMonth(editing.dayOfMonth ?? 1); + setTimeOfDay(editing.timeOfDay); + setRecipients([...editing.recipients]); + setSections(new Set(editing.sections)); + setAiAnalysis(editing.includeAiAnalysis); + setCompetitorScan(editing.includeCompetitorScan); + setMarketInsights(editing.includeMarketInsights); + } else { + setName(""); setFrequency("weekly"); setRecipients([]); setEmailInput(""); + setSections(new Set(["gsc", "ga4", "audit", "rank", "conversions"])); + setAiAnalysis(true); setCompetitorScan(false); setMarketInsights(false); + } + }, [editing, open]); + + if (!open) return null; + + function addEmail() { + const email = emailInput.trim(); + if (EMAIL_RE.test(email) && !recipients.includes(email)) { + setRecipients([...recipients, email]); + setEmailInput(""); + } + } + + function toggleSection(id: string) { + setSections((prev) => { const n = new Set(prev); n.has(id) ? n.delete(id) : n.add(id); return n; }); + } + + async function submit() { + if (!name.trim() || recipients.length === 0) return setError("Name and at least one recipient required"); + // Diagnostic log — surfaces the full payload in the browser + // console on every Create / Update click so the next "schedule + // didn't save" ticket can be diagnosed from a screenshot of the + // DevTools console instead of a server log deep-dive. + console.info("[email-reports] Create Schedule clicked", { + mode: editing ? "edit" : "create", + name: name.trim(), + frequency, + recipients, + sections: Array.from(sections), + aiFeatures: { aiAnalysis, competitorScan, marketInsights }, + }); + setLoading(true); setError(null); + try { + const body = { + brandId, name: name.trim(), frequency, dayOfWeek, dayOfMonth, timeOfDay, + recipients, sections: Array.from(sections), + includeAiAnalysis: aiAnalysis, includeCompetitorScan: competitorScan, includeMarketInsights: marketInsights, + ...(editing ? { isActive: editing.isActive } : {}), + }; + const url = editing ? `/api/email-reports/schedules/${editing.id}` : "/api/email-reports/schedules"; + const method = editing ? "PUT" : "POST"; + const res = await fetch(url, { method, headers: { "Content-Type": "application/json" }, body: JSON.stringify(body) }); + if (!res.ok) { const d = await res.json().catch(() => ({})); throw new Error(d.error || "Failed"); } + onSaved(); onClose(); + } catch (err) { + setError(err instanceof Error ? err.message : "Failed"); + } finally { setLoading(false); } + } + + return ( +
    +
    e.stopPropagation()}> +
    +

    {editing ? "Edit Schedule" : "Create Email Report"}

    + +
    + +
    +
    + + setName(e.target.value)} placeholder="Weekly Performance Report" className="w-full px-3 py-2 text-sm border border-slate-200 rounded-lg focus:outline-none focus:ring-2 focus:ring-brand-500/40" /> +
    + +
    +
    + + +
    +
    + + setTimeOfDay(e.target.value)} className="w-full px-3 py-2 text-sm border border-slate-200 rounded-lg" /> +
    +
    + + {(frequency === "weekly" || frequency === "biweekly") && ( +
    + + +
    + )} + {frequency === "monthly" && ( +
    + + +
    + )} + + {/* Recipients */} +
    + +
    + setEmailInput(e.target.value)} onKeyDown={(e) => { if (e.key === "Enter") { e.preventDefault(); addEmail(); } }} placeholder="email@example.com" className="flex-1 px-3 py-2 text-sm border border-slate-200 rounded-lg focus:outline-none focus:ring-2 focus:ring-brand-500/40" /> + +
    + {recipients.length > 0 && ( +
    + {recipients.map((e) => ( + + {e} + + + ))} +
    + )} +
    + + {/* Sections */} +
    + +
    + {SECTION_OPTIONS.map((s) => ( + + ))} +
    +
    + + {/* AI toggles */} +
    +

    AI Features

    + {[ + { label: "AI Analysis", value: aiAnalysis, set: setAiAnalysis }, + { label: "Competitor Scan", value: competitorScan, set: setCompetitorScan }, + { label: "Market Insights", value: marketInsights, set: setMarketInsights }, + ].map((t) => ( + + ))} +
    + + {error &&

    {error}

    } +
    + +
    + + +
    +
    +
    + ); +} diff --git a/src/components/email-reports/email-preview-modal.tsx b/src/components/email-reports/email-preview-modal.tsx new file mode 100644 index 0000000..0bed505 --- /dev/null +++ b/src/components/email-reports/email-preview-modal.tsx @@ -0,0 +1,98 @@ +"use client"; + +/** + * Email preview modal — renders a sent report's HTML content in a + * sandboxed iframe. Offers re-send and download actions. + */ + +import { useState } from "react"; +import { X, Send, Download, Loader2 } from "lucide-react"; + +export interface SentReportDto { + id: string; + subject: string; + recipients: string[]; + status: string; + error: string | null; + sentAt: string; + scheduleId: string; + htmlContent?: string; +} + +interface Props { + report: SentReportDto | null; + onClose: () => void; +} + +export default function EmailPreviewModal({ report, onClose }: Props) { + const [resending, setResending] = useState(false); + const [toast, setToast] = useState(null); + + if (!report) return null; + + async function resend() { + setResending(true); + try { + const res = await fetch(`/api/email-reports/send-now/${report!.scheduleId}`, { method: "POST" }); + if (!res.ok) throw new Error("Re-send failed"); + setToast("Sent!"); setTimeout(() => setToast(null), 2000); + } catch { + setToast("Failed to re-send"); + setTimeout(() => setToast(null), 2000); + } finally { setResending(false); } + } + + function downloadHtml() { + if (!report?.htmlContent) return; + const blob = new Blob([report.htmlContent], { type: "text/html;charset=utf-8" }); + const url = URL.createObjectURL(blob); + const a = document.createElement("a"); + a.href = url; + a.download = `${report.subject.replace(/[^a-zA-Z0-9]+/g, "-").toLowerCase()}.html`; + document.body.appendChild(a); a.click(); a.remove(); + URL.revokeObjectURL(url); + } + + return ( +
    +
    e.stopPropagation()}> + {/* Header */} +
    +
    +

    {report.subject}

    +

    + Sent to {report.recipients.join(", ")} · {new Date(report.sentAt).toLocaleString("en-US", { month: "short", day: "numeric", year: "numeric", hour: "numeric", minute: "2-digit" })} +

    +
    + +
    + + {/* Iframe preview */} +
    + {report.htmlContent ? ( +