From 1a710aa3c61985c641898866c004242939ba4fef Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E2=80=9Ckirukib=E2=80=9D?= <“kirubeljkl679@gmail.com”>
Date: Wed, 20 May 2026 11:57:21 +0300
Subject: [PATCH] first commit + project setup
---
.dev.vars | 1 +
.env.example | 3 +
.../workflows/cloudflare-workers-opennext.yml | 28 +
.gitignore | 38 +
app/api/inquiry/route.ts | 19 +
app/api/payment/route.ts | 37 +
app/apple-icon.tsx | 41 +
app/calendar/route.ts | 12 +
app/contact/page.tsx | 46 +
app/exhibit/page.tsx | 79 +
app/globals.css | 191 +
app/icon.tsx | 54 +
app/layout.tsx | 39 +
app/page.tsx | 38 +
app/partners/page.tsx | 75 +
app/payment/page.tsx | 71 +
app/payment/success/page.tsx | 49 +
app/pitch-competition/page.tsx | 61 +
app/privacy/page.tsx | 35 +
app/program/page.tsx | 65 +
app/robots.ts | 13 +
app/sitemap.ts | 11 +
app/speakers/page.tsx | 68 +
app/sponsor/page.tsx | 70 +
components.json | 21 +
components/brand/BrandLogo.tsx | 106 +
components/brand/FooterTopographicBand.tsx | 108 +
components/brand/PartnerLogoPlaceholder.tsx | 28 +
components/brand/RiftFlowLines.tsx | 116 +
components/brand/RiftPageFlow.tsx | 70 +
components/brand/RiftSectionAccent.tsx | 133 +
components/brand/rift-patterns.ts | 9 +
components/event/AddToCalendar.tsx | 57 +
components/exhibit/BoothPackages.tsx | 28 +
components/exhibit/ExhibitorBoothForm.tsx | 264 +
components/forms/DataConsentField.tsx | 51 +
components/forms/InquiryForm.tsx | 108 +
components/grants/CyclingGrantAmount.tsx | 74 +
components/grants/GrantHeadline.tsx | 16 +
components/home/AttendSummitSection.tsx | 71 +
components/home/BoothAcquisitionBand.tsx | 37 +
components/home/ExperienceCards.tsx | 48 +
components/home/Faq.tsx | 27 +
components/home/Hero.tsx | 56 +
components/home/HeroGrantLine.tsx | 17 +
components/home/Newsletter.tsx | 69 +
components/home/PartnerMarquee.tsx | 20 +
components/home/PurposeBand.tsx | 37 +
components/home/PurposeGrantText.tsx | 15 +
components/home/Speakers.tsx | 73 +
components/home/SponsorTiers.tsx | 37 +
components/home/StatsGrid.tsx | 35 +
components/home/TicketsBand.tsx | 41 +
components/home/TopicMarquee.tsx | 25 +
components/home/Venue.tsx | 38 +
components/layout/FooterNewsletter.tsx | 108 +
components/layout/NavTicketsCta.tsx | 30 +
components/layout/Section.tsx | 42 +
components/layout/SiteFooter.tsx | 96 +
components/layout/SiteHeader.tsx | 127 +
components/partners/ChampionStartupModal.tsx | 172 +
components/partners/PartnerCard.tsx | 37 +
components/partners/PartnerSectionBlock.tsx | 31 +
components/partners/PartnershipCtaBand.tsx | 30 +
.../partners/PartnershipInquiryForm.tsx | 122 +
components/payment/PaymentForm.tsx | 215 +
components/seo/JsonLd.tsx | 65 +
components/speakers/SpeakerCard.tsx | 39 +
components/tickets/TicketCard.tsx | 87 +
components/ui/accordion.tsx | 66 +
components/ui/badge.tsx | 48 +
components/ui/button.tsx | 64 +
components/ui/card.tsx | 92 +
components/ui/carousel.tsx | 241 +
components/ui/checkbox.tsx | 32 +
components/ui/dialog.tsx | 158 +
components/ui/dropdown-menu.tsx | 257 +
components/ui/input.tsx | 21 +
components/ui/label.tsx | 24 +
components/ui/navigation-menu.tsx | 168 +
components/ui/select.tsx | 190 +
components/ui/separator.tsx | 28 +
components/ui/sheet.tsx | 143 +
components/ui/tabs.tsx | 91 +
components/ui/textarea.tsx | 18 +
content/attend.ts | 57 +
content/consent.ts | 9 +
content/exhibit.ts | 51 +
content/faq.ts | 50 +
content/grants.ts | 9 +
content/inquiries.ts | 26 +
content/legal.ts | 28 +
content/page-seo.ts | 69 +
content/partners.ts | 109 +
content/people.ts | 180 +
content/pitch.ts | 19 +
content/program.ts | 61 +
content/site.ts | 31 +
content/tickets.ts | 59 +
content/tracks.ts | 40 +
eslint.config.mjs | 14 +
lib/calendar.ts | 57 +
lib/inquiry.ts | 275 +
lib/payment.ts | 65 +
lib/seo.ts | 101 +
lib/utils.ts | 6 +
next.config.ts | 5 +
package-lock.json | 8412 +++++++++++++++++
package.json | 47 +
postcss.config.mjs | 7 +
public/branding/booth-mockup.png | Bin 0 -> 1369952 bytes
public/branding/logo-icon.png | Bin 0 -> 31127 bytes
public/branding/logo-wordmark.jpg | Bin 0 -> 78414 bytes
public/branding/logo.png | Bin 0 -> 23599 bytes
public/branding/speakers/abraham.png | Bin 0 -> 183032 bytes
public/branding/speakers/abrhame.png | Bin 0 -> 145163 bytes
public/branding/speakers/adam.png | Bin 0 -> 162309 bytes
public/branding/speakers/amity.png | Bin 0 -> 181921 bytes
public/branding/speakers/beamlak.png | Bin 0 -> 216961 bytes
public/branding/speakers/biruh.png | Bin 0 -> 167499 bytes
public/branding/speakers/brook.png | Bin 0 -> 173780 bytes
public/branding/speakers/dagmawit.png | Bin 0 -> 174386 bytes
public/branding/speakers/lulite.png | Bin 0 -> 141110 bytes
public/branding/speakers/mekdim.png | Bin 0 -> 176045 bytes
public/branding/speakers/samiya.png | Bin 0 -> 153038 bytes
public/branding/speakers/sarma.png | Bin 0 -> 186510 bytes
public/branding/speakers/solomon.png | Bin 0 -> 205521 bytes
public/branding/speakers/sunil.png | Bin 0 -> 187941 bytes
public/branding/speakers/tewabech.png | Bin 0 -> 194585 bytes
public/branding/speakers/tigist.png | Bin 0 -> 234073 bytes
public/branding/speakers/yared.png | Bin 0 -> 164817 bytes
scripts/download-assets.mjs | 49 +
tsconfig.json | 21 +
wrangler.jsonc | 17 +
134 files changed, 15695 insertions(+)
create mode 100644 .dev.vars
create mode 100644 .env.example
create mode 100644 .github/workflows/cloudflare-workers-opennext.yml
create mode 100644 .gitignore
create mode 100644 app/api/inquiry/route.ts
create mode 100644 app/api/payment/route.ts
create mode 100644 app/apple-icon.tsx
create mode 100644 app/calendar/route.ts
create mode 100644 app/contact/page.tsx
create mode 100644 app/exhibit/page.tsx
create mode 100644 app/globals.css
create mode 100644 app/icon.tsx
create mode 100644 app/layout.tsx
create mode 100644 app/page.tsx
create mode 100644 app/partners/page.tsx
create mode 100644 app/payment/page.tsx
create mode 100644 app/payment/success/page.tsx
create mode 100644 app/pitch-competition/page.tsx
create mode 100644 app/privacy/page.tsx
create mode 100644 app/program/page.tsx
create mode 100644 app/robots.ts
create mode 100644 app/sitemap.ts
create mode 100644 app/speakers/page.tsx
create mode 100644 app/sponsor/page.tsx
create mode 100644 components.json
create mode 100644 components/brand/BrandLogo.tsx
create mode 100644 components/brand/FooterTopographicBand.tsx
create mode 100644 components/brand/PartnerLogoPlaceholder.tsx
create mode 100644 components/brand/RiftFlowLines.tsx
create mode 100644 components/brand/RiftPageFlow.tsx
create mode 100644 components/brand/RiftSectionAccent.tsx
create mode 100644 components/brand/rift-patterns.ts
create mode 100644 components/event/AddToCalendar.tsx
create mode 100644 components/exhibit/BoothPackages.tsx
create mode 100644 components/exhibit/ExhibitorBoothForm.tsx
create mode 100644 components/forms/DataConsentField.tsx
create mode 100644 components/forms/InquiryForm.tsx
create mode 100644 components/grants/CyclingGrantAmount.tsx
create mode 100644 components/grants/GrantHeadline.tsx
create mode 100644 components/home/AttendSummitSection.tsx
create mode 100644 components/home/BoothAcquisitionBand.tsx
create mode 100644 components/home/ExperienceCards.tsx
create mode 100644 components/home/Faq.tsx
create mode 100644 components/home/Hero.tsx
create mode 100644 components/home/HeroGrantLine.tsx
create mode 100644 components/home/Newsletter.tsx
create mode 100644 components/home/PartnerMarquee.tsx
create mode 100644 components/home/PurposeBand.tsx
create mode 100644 components/home/PurposeGrantText.tsx
create mode 100644 components/home/Speakers.tsx
create mode 100644 components/home/SponsorTiers.tsx
create mode 100644 components/home/StatsGrid.tsx
create mode 100644 components/home/TicketsBand.tsx
create mode 100644 components/home/TopicMarquee.tsx
create mode 100644 components/home/Venue.tsx
create mode 100644 components/layout/FooterNewsletter.tsx
create mode 100644 components/layout/NavTicketsCta.tsx
create mode 100644 components/layout/Section.tsx
create mode 100644 components/layout/SiteFooter.tsx
create mode 100644 components/layout/SiteHeader.tsx
create mode 100644 components/partners/ChampionStartupModal.tsx
create mode 100644 components/partners/PartnerCard.tsx
create mode 100644 components/partners/PartnerSectionBlock.tsx
create mode 100644 components/partners/PartnershipCtaBand.tsx
create mode 100644 components/partners/PartnershipInquiryForm.tsx
create mode 100644 components/payment/PaymentForm.tsx
create mode 100644 components/seo/JsonLd.tsx
create mode 100644 components/speakers/SpeakerCard.tsx
create mode 100644 components/tickets/TicketCard.tsx
create mode 100644 components/ui/accordion.tsx
create mode 100644 components/ui/badge.tsx
create mode 100644 components/ui/button.tsx
create mode 100644 components/ui/card.tsx
create mode 100644 components/ui/carousel.tsx
create mode 100644 components/ui/checkbox.tsx
create mode 100644 components/ui/dialog.tsx
create mode 100644 components/ui/dropdown-menu.tsx
create mode 100644 components/ui/input.tsx
create mode 100644 components/ui/label.tsx
create mode 100644 components/ui/navigation-menu.tsx
create mode 100644 components/ui/select.tsx
create mode 100644 components/ui/separator.tsx
create mode 100644 components/ui/sheet.tsx
create mode 100644 components/ui/tabs.tsx
create mode 100644 components/ui/textarea.tsx
create mode 100644 content/attend.ts
create mode 100644 content/consent.ts
create mode 100644 content/exhibit.ts
create mode 100644 content/faq.ts
create mode 100644 content/grants.ts
create mode 100644 content/inquiries.ts
create mode 100644 content/legal.ts
create mode 100644 content/page-seo.ts
create mode 100644 content/partners.ts
create mode 100644 content/people.ts
create mode 100644 content/pitch.ts
create mode 100644 content/program.ts
create mode 100644 content/site.ts
create mode 100644 content/tickets.ts
create mode 100644 content/tracks.ts
create mode 100644 eslint.config.mjs
create mode 100644 lib/calendar.ts
create mode 100644 lib/inquiry.ts
create mode 100644 lib/payment.ts
create mode 100644 lib/seo.ts
create mode 100644 lib/utils.ts
create mode 100644 next.config.ts
create mode 100644 package-lock.json
create mode 100644 package.json
create mode 100644 postcss.config.mjs
create mode 100644 public/branding/booth-mockup.png
create mode 100644 public/branding/logo-icon.png
create mode 100644 public/branding/logo-wordmark.jpg
create mode 100644 public/branding/logo.png
create mode 100644 public/branding/speakers/abraham.png
create mode 100644 public/branding/speakers/abrhame.png
create mode 100644 public/branding/speakers/adam.png
create mode 100644 public/branding/speakers/amity.png
create mode 100644 public/branding/speakers/beamlak.png
create mode 100644 public/branding/speakers/biruh.png
create mode 100644 public/branding/speakers/brook.png
create mode 100644 public/branding/speakers/dagmawit.png
create mode 100644 public/branding/speakers/lulite.png
create mode 100644 public/branding/speakers/mekdim.png
create mode 100644 public/branding/speakers/samiya.png
create mode 100644 public/branding/speakers/sarma.png
create mode 100644 public/branding/speakers/solomon.png
create mode 100644 public/branding/speakers/sunil.png
create mode 100644 public/branding/speakers/tewabech.png
create mode 100644 public/branding/speakers/tigist.png
create mode 100644 public/branding/speakers/yared.png
create mode 100644 scripts/download-assets.mjs
create mode 100644 tsconfig.json
create mode 100644 wrangler.jsonc
diff --git a/.dev.vars b/.dev.vars
new file mode 100644
index 0000000..a2a6158
--- /dev/null
+++ b/.dev.vars
@@ -0,0 +1 @@
+NEXTJS_ENV=development
diff --git a/.env.example b/.env.example
new file mode 100644
index 0000000..6424f93
--- /dev/null
+++ b/.env.example
@@ -0,0 +1,3 @@
+# Future email integration (e.g. Resend)
+# RESEND_API_KEY=
+# INQUIRY_TO_EMAIL=partnerships@grvsummit.com
diff --git a/.github/workflows/cloudflare-workers-opennext.yml b/.github/workflows/cloudflare-workers-opennext.yml
new file mode 100644
index 0000000..a3de6d7
--- /dev/null
+++ b/.github/workflows/cloudflare-workers-opennext.yml
@@ -0,0 +1,28 @@
+name: Deploy to Cloudflare Workers (OpenNext)
+
+on:
+ push:
+ branches: [main]
+ workflow_dispatch:
+
+jobs:
+ deploy:
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ steps:
+ - uses: actions/checkout@v4
+
+ - uses: actions/setup-node@v4
+ with:
+ node-version: "22"
+ cache: "npm"
+
+ - name: Install
+ run: npm ci
+
+ - name: Build and deploy with OpenNext
+ run: npm run deploy
+ env:
+ CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
+ CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..6830bda
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,38 @@
+# dependencies
+/node_modules
+/.pnp
+.pnp.*
+.yarn/*
+!.yarn/patches
+!.yarn/plugins
+!.yarn/releases
+!.yarn/versions
+
+# testing
+/coverage
+
+# next.js
+/.next/
+/out/
+.vercel/
+.open-next/
+
+
+# production
+/build
+
+# misc
+.DS_Store
+*.pem
+.env*.local
+.env
+
+# debug
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+.pnpm-debug.log*
+
+# typescript
+*.tsbuildinfo
+next-env.d.ts
diff --git a/app/api/inquiry/route.ts b/app/api/inquiry/route.ts
new file mode 100644
index 0000000..dfe080c
--- /dev/null
+++ b/app/api/inquiry/route.ts
@@ -0,0 +1,19 @@
+import { NextResponse } from "next/server";
+import { validateInquiry } from "@/lib/inquiry";
+
+export async function POST(request: Request) {
+ try {
+ const body = await request.json();
+ const result = validateInquiry(body);
+
+ if (!result.ok) {
+ return NextResponse.json({ ok: false, error: result.error }, { status: 400 });
+ }
+
+ console.info("[GRV Summit Inquiry]", JSON.stringify(result.data, null, 2));
+
+ return NextResponse.json({ ok: true });
+ } catch {
+ return NextResponse.json({ ok: false, error: "Invalid JSON" }, { status: 400 });
+ }
+}
diff --git a/app/api/payment/route.ts b/app/api/payment/route.ts
new file mode 100644
index 0000000..b89e803
--- /dev/null
+++ b/app/api/payment/route.ts
@@ -0,0 +1,37 @@
+import { NextResponse } from "next/server";
+import { calculateTotal } from "@/lib/payment";
+import { validatePayment } from "@/lib/payment";
+import { ticketTiers } from "@/content/tickets";
+
+export async function POST(request: Request) {
+ try {
+ const body = await request.json();
+ const result = validatePayment(body);
+
+ if (!result.ok) {
+ return NextResponse.json({ ok: false, error: result.error }, { status: 400 });
+ }
+
+ const tier = ticketTiers.find((t) => t.id === result.data.ticketId)!;
+ const totalUsd = calculateTotal(result.data.ticketId, result.data.quantity);
+
+ const record = {
+ ...result.data,
+ ticketName: tier.name,
+ totalUsd,
+ status: "pending",
+ note: "v1 stub — wire payment provider (Stripe/Chapa) in production",
+ };
+
+ console.info("[GRV Summit Payment]", JSON.stringify(record, null, 2));
+
+ return NextResponse.json({
+ ok: true,
+ orderId: `GRV-${Date.now()}`,
+ totalUsd,
+ paymentMethod: result.data.paymentMethod,
+ });
+ } catch {
+ return NextResponse.json({ ok: false, error: "Invalid JSON" }, { status: 400 });
+ }
+}
diff --git a/app/apple-icon.tsx b/app/apple-icon.tsx
new file mode 100644
index 0000000..96168f2
--- /dev/null
+++ b/app/apple-icon.tsx
@@ -0,0 +1,41 @@
+import { ImageResponse } from "next/og";
+
+export const size = { width: 180, height: 180 };
+export const contentType = "image/png";
+
+export default function AppleIcon() {
+ return new ImageResponse(
+ (
+
+
+
+ GREAT RIFT
+
+
VALLEY
+
+ Innovation Summit
+
+
+ ),
+ { ...size }
+ );
+}
diff --git a/app/calendar/route.ts b/app/calendar/route.ts
new file mode 100644
index 0000000..8c4d5aa
--- /dev/null
+++ b/app/calendar/route.ts
@@ -0,0 +1,12 @@
+import { buildIcsFileContent } from "@/lib/calendar";
+
+export function GET() {
+ const ics = buildIcsFileContent();
+
+ return new Response(ics, {
+ headers: {
+ "Content-Type": "text/calendar; charset=utf-8",
+ "Content-Disposition": 'attachment; filename="grv-summit.ics"',
+ },
+ });
+}
diff --git a/app/contact/page.tsx b/app/contact/page.tsx
new file mode 100644
index 0000000..3bc60d2
--- /dev/null
+++ b/app/contact/page.tsx
@@ -0,0 +1,46 @@
+import type { Metadata } from "next";
+import { Section } from "@/components/layout/Section";
+import { InquiryForm } from "@/components/forms/InquiryForm";
+import { inquiryChannels } from "@/content/inquiries";
+import { pageSeo } from "@/content/page-seo";
+import { createPageMetadata } from "@/lib/seo";
+import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
+
+export const metadata: Metadata = createPageMetadata(pageSeo.contact);
+
+export default function ContactPage() {
+ return (
+ <>
+
+ Contact us
+
+ Reach the right team for registration, exhibitions, sponsorship, or media inquiries.
+
+
+ {inquiryChannels.map((ch) => (
+
+
+ {ch.label}
+ {ch.description}
+
+
+
+ {ch.email}
+
+
+
+ ))}
+
+
+
+ >
+ );
+}
diff --git a/app/exhibit/page.tsx b/app/exhibit/page.tsx
new file mode 100644
index 0000000..215b7ad
--- /dev/null
+++ b/app/exhibit/page.tsx
@@ -0,0 +1,79 @@
+import type { Metadata } from "next";
+import { pageSeo } from "@/content/page-seo";
+import { createPageMetadata } from "@/lib/seo";
+import Image from "next/image";
+import { exhibitCopy } from "@/content/exhibit";
+import { Section } from "@/components/layout/Section";
+import { BoothPackages } from "@/components/exhibit/BoothPackages";
+import { ExhibitorBoothForm } from "@/components/exhibit/ExhibitorBoothForm";
+import { Faq } from "@/components/home/Faq";
+
+export const metadata: Metadata = createPageMetadata(pageSeo.exhibit);
+
+const benefits = [
+ "Connect with 500+ investors, startups, and professionals",
+ "Showcase and advertise your products in the exhibitor hall",
+ "Meet emerging talent in agriculture, health, and education",
+ "Brand visibility across summit programming and materials",
+];
+
+export default function ExhibitPage() {
+ return (
+ <>
+
+
+
+
+ {exhibitCopy.eyebrow}
+
+
{exhibitCopy.headline}
+
{exhibitCopy.subheadline}
+
+ {benefits.map((b) => (
+
+ →
+ {b}
+
+ ))}
+
+
+
+
+
+
+
+
+
+ Booth packages
+
+ Choose a footprint that fits how you want to present your brand and products. Final
+ placement and pricing are confirmed by our exhibitions team.
+
+
+
+
+
+
+
+
+
Acquire your booth
+
+ Complete the form below with details about your company, the products you want to
+ advertise, and your booth requirements. We will follow up with availability and next
+ steps.
+
+
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/app/globals.css b/app/globals.css
new file mode 100644
index 0000000..0402e69
--- /dev/null
+++ b/app/globals.css
@@ -0,0 +1,191 @@
+@import "tailwindcss";
+
+@custom-variant dark (&:is(.dark *));
+
+@theme inline {
+ --color-background: var(--background);
+ --color-foreground: var(--foreground);
+ --color-card: var(--card);
+ --color-card-foreground: var(--card-foreground);
+ --color-popover: var(--popover);
+ --color-popover-foreground: var(--popover-foreground);
+ --color-primary: var(--primary);
+ --color-primary-foreground: var(--primary-foreground);
+ --color-secondary: var(--secondary);
+ --color-secondary-foreground: var(--secondary-foreground);
+ --color-muted: var(--muted);
+ --color-muted-foreground: var(--muted-foreground);
+ --color-accent: var(--accent);
+ --color-accent-foreground: var(--accent-foreground);
+ --color-destructive: var(--destructive);
+ --color-border: var(--border);
+ --color-input: var(--input);
+ --color-ring: var(--ring);
+ --radius-sm: calc(var(--radius) - 4px);
+ --radius-md: calc(var(--radius) - 2px);
+ --radius-lg: var(--radius);
+ --radius-xl: calc(var(--radius) + 4px);
+ --font-sans: var(--font-body);
+ --font-display: var(--font-display);
+ --color-brand-green: #1a5c38;
+ --color-brand-green-dark: #0d3d26;
+ --color-brand-gold: #ffb300;
+ --color-brand-blue: #1f3d7e;
+ --color-brand-navy: #0f0404;
+ --color-surface-muted: #f7f7f7;
+ --color-text-muted: #767676;
+}
+
+:root {
+ --radius: 0.75rem;
+ --background: #ffffff;
+ --foreground: #0d3d26;
+ --card: #ffffff;
+ --card-foreground: #0d3d26;
+ --popover: #ffffff;
+ --popover-foreground: #0d3d26;
+ /* Primary: brand green · Secondary: white */
+ --primary: #1a5c38;
+ --primary-foreground: #ffffff;
+ --secondary: #ffffff;
+ --secondary-foreground: #1a5c38;
+ --muted: #f0f5f2;
+ --muted-foreground: #5a6b62;
+ --accent: #ffb300;
+ --accent-foreground: #0d3d26;
+ --destructive: #dc2626;
+ --border: #dce8e0;
+ --input: #dce8e0;
+ --ring: #1a5c38;
+ --hero: #0d3d26;
+ --section-muted: #f0f5f2;
+ --section-inverse: #1a5c38;
+}
+
+@layer base {
+ * {
+ @apply border-border outline-ring/50;
+ }
+ body {
+ @apply bg-background text-foreground antialiased;
+ font-family: var(--font-body), system-ui, sans-serif;
+ }
+ h1,
+ h2,
+ h3,
+ h4 {
+ font-family: var(--font-display), system-ui, sans-serif;
+ letter-spacing: -0.02em;
+ }
+}
+
+@layer utilities {
+ .text-balance {
+ text-wrap: balance;
+ }
+ .section-inverse {
+ background: var(--section-inverse);
+ color: #fafafa;
+ }
+ .section-muted {
+ background: var(--section-muted);
+ }
+ .grain {
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.04'/%3E%3C/svg%3E");
+ }
+ .marquee {
+ animation: marquee 40s linear infinite;
+ }
+ @keyframes marquee {
+ from {
+ transform: translateX(0);
+ }
+ to {
+ transform: translateX(-50%);
+ }
+ }
+ @media (prefers-reduced-motion: reduce) {
+ .marquee {
+ animation: none;
+ }
+ }
+ .ticket-notch::before,
+ .ticket-notch::after {
+ content: "";
+ position: absolute;
+ left: 50%;
+ width: 1.5rem;
+ height: 1.5rem;
+ transform: translateX(-50%);
+ border-radius: 9999px;
+ background: var(--section-inverse, #0a0a0a);
+ }
+ .ticket-notch::before {
+ top: -0.75rem;
+ }
+ .ticket-notch::after {
+ bottom: -0.75rem;
+ }
+
+ /* Navbar tickets CTA — glow + text + arrow */
+ @keyframes ticket-glow {
+ 0%,
+ 100% {
+ box-shadow: 0 0 0 0 rgba(255, 179, 0, 0.4);
+ }
+ 50% {
+ box-shadow: 0 0 0 10px rgba(255, 179, 0, 0);
+ }
+ }
+ @keyframes ticket-text-pulse {
+ 0%,
+ 100% {
+ transform: scale(1);
+ }
+ 50% {
+ transform: scale(1.06);
+ }
+ }
+ @keyframes ticket-arrow-nudge {
+ 0%,
+ 100% {
+ transform: translateX(0);
+ }
+ 50% {
+ transform: translateX(4px);
+ }
+ }
+ .ticket-cta-pulse {
+ animation: ticket-glow 2.2s ease-in-out infinite;
+ }
+ .ticket-cta-text {
+ display: inline-block;
+ animation: ticket-text-pulse 2.2s ease-in-out infinite;
+ }
+ .ticket-cta-arrow {
+ animation: ticket-arrow-nudge 2.2s ease-in-out infinite;
+ }
+
+ @keyframes ticket-card-enter {
+ from {
+ opacity: 0;
+ transform: translateY(24px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+ }
+ .ticket-card-enter {
+ animation: ticket-card-enter 0.6s ease-out both;
+ }
+
+ @media (prefers-reduced-motion: reduce) {
+ .ticket-cta-pulse,
+ .ticket-cta-text,
+ .ticket-cta-arrow,
+ .ticket-card-enter {
+ animation: none;
+ }
+ }
+}
diff --git a/app/icon.tsx b/app/icon.tsx
new file mode 100644
index 0000000..0d5949b
--- /dev/null
+++ b/app/icon.tsx
@@ -0,0 +1,54 @@
+import { ImageResponse } from "next/og";
+
+export const size = { width: 32, height: 32 };
+export const contentType = "image/png";
+
+export default function Icon() {
+ return new ImageResponse(
+ (
+
+
+ GRV
+
+
+ GREAT RIFT
+
+
+ ),
+ { ...size }
+ );
+}
diff --git a/app/layout.tsx b/app/layout.tsx
new file mode 100644
index 0000000..267a1bb
--- /dev/null
+++ b/app/layout.tsx
@@ -0,0 +1,39 @@
+import { Syne, DM_Sans } from "next/font/google";
+import { RiftPageFlow } from "@/components/brand/RiftPageFlow";
+import { JsonLd } from "@/components/seo/JsonLd";
+import { SiteHeader } from "@/components/layout/SiteHeader";
+import { SiteFooter } from "@/components/layout/SiteFooter";
+import { rootMetadata } from "@/lib/seo";
+import "./globals.css";
+
+export const metadata = rootMetadata;
+
+const display = Syne({
+ subsets: ["latin"],
+ variable: "--font-display",
+});
+
+const body = DM_Sans({
+ subsets: ["latin"],
+ variable: "--font-body",
+});
+
+export default function RootLayout({
+ children,
+}: Readonly<{
+ children: React.ReactNode;
+}>) {
+ return (
+
+
+
+
+
+
+ {children}
+
+
+
+
+ );
+}
diff --git a/app/page.tsx b/app/page.tsx
new file mode 100644
index 0000000..dcce251
--- /dev/null
+++ b/app/page.tsx
@@ -0,0 +1,38 @@
+import type { Metadata } from "next";
+import { pageSeo } from "@/content/page-seo";
+import { createPageMetadata } from "@/lib/seo";
+import { Hero } from "@/components/home/Hero";
+import { PartnerMarquee } from "@/components/home/PartnerMarquee";
+import { StatsGrid } from "@/components/home/StatsGrid";
+import { PurposeBand } from "@/components/home/PurposeBand";
+import { TopicMarquee } from "@/components/home/TopicMarquee";
+import { ExperienceCards } from "@/components/home/ExperienceCards";
+import { BoothAcquisitionBand } from "@/components/home/BoothAcquisitionBand";
+import { AttendSummitSection } from "@/components/home/AttendSummitSection";
+import { Speakers } from "@/components/home/Speakers";
+import { SponsorTiers } from "@/components/home/SponsorTiers";
+import { TicketsBand } from "@/components/home/TicketsBand";
+import { Faq } from "@/components/home/Faq";
+import { Venue } from "@/components/home/Venue";
+
+export const metadata: Metadata = createPageMetadata(pageSeo.home);
+
+export default function HomePage() {
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/app/partners/page.tsx b/app/partners/page.tsx
new file mode 100644
index 0000000..2527eef
--- /dev/null
+++ b/app/partners/page.tsx
@@ -0,0 +1,75 @@
+import type { Metadata } from "next";
+import Link from "next/link";
+import { pageSeo } from "@/content/page-seo";
+import { createPageMetadata } from "@/lib/seo";
+import {
+ partnersIntro,
+ sponsorSections,
+ exhibitorSections,
+ supporterSections,
+ mediaPartnerSections,
+} from "@/content/partners";
+import { Section } from "@/components/layout/Section";
+import { PartnerSectionBlock } from "@/components/partners/PartnerSectionBlock";
+import { PartnershipCtaBand } from "@/components/partners/PartnershipCtaBand";
+import { Button } from "@/components/ui/button";
+import { ChampionStartupModal } from "@/components/partners/ChampionStartupModal";
+
+export const metadata: Metadata = createPageMetadata(pageSeo.partners);
+
+export default function PartnersPage() {
+ return (
+ <>
+
+
+ {partnersIntro.eyebrow}
+
+
+ {partnersIntro.headline}
+
+
+ {partnersIntro.subheadline}
+
+
+
+ Become a partner
+
+
+
+
+
+
+
+ {sponsorSections.map((section, index) => (
+
+ ))}
+
+
+
+
+
+ {exhibitorSections.map((section) => (
+
+ ))}
+
+
+
+
+
+ {supporterSections.map((section) => (
+
+ ))}
+ {mediaPartnerSections.map((section) => (
+
+ ))}
+
+
+
+
+ >
+ );
+}
diff --git a/app/payment/page.tsx b/app/payment/page.tsx
new file mode 100644
index 0000000..348654b
--- /dev/null
+++ b/app/payment/page.tsx
@@ -0,0 +1,71 @@
+import type { Metadata } from "next";
+import { pageSeo } from "@/content/page-seo";
+import { createPageMetadata } from "@/lib/seo";
+import { Suspense } from "react";
+import Link from "next/link";
+import { site } from "@/content/site";
+import { ticketTiers } from "@/content/tickets";
+import { Section } from "@/components/layout/Section";
+import { PaymentForm } from "@/components/payment/PaymentForm";
+import { AddToCalendar } from "@/components/event/AddToCalendar";
+import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card";
+import { Button } from "@/components/ui/button";
+
+export const metadata: Metadata = createPageMetadata(pageSeo.payment);
+
+export default function PaymentPage() {
+ return (
+ <>
+
+
+
+
+ {site.dates.label}
+
+
Tickets & payment
+
+ Secure your place at {site.venue.name}, {site.venue.address}. Choose a pass and
+ complete checkout below.
+
+
+
+
+
+
+ {ticketTiers.map((tier) => (
+
+
+ {tier.name}
+ {tier.description}
+
+
+ ${tier.priceUsd}
+ per ticket · USD
+
+ {tier.features.slice(0, 3).map((f) => (
+ · {f}
+ ))}
+
+
+
+
+ Select
+
+
+
+ ))}
+
+
+
+
+ Checkout
+ Complete your registration in a few steps.
+
+
Loading checkout…}>
+
+
+
+
+ >
+ );
+}
diff --git a/app/payment/success/page.tsx b/app/payment/success/page.tsx
new file mode 100644
index 0000000..31d291e
--- /dev/null
+++ b/app/payment/success/page.tsx
@@ -0,0 +1,49 @@
+import type { Metadata } from "next";
+import { pageSeo } from "@/content/page-seo";
+import { createPageMetadata } from "@/lib/seo";
+import Link from "next/link";
+import { CheckCircle2 } from "lucide-react";
+import { Section } from "@/components/layout/Section";
+import { Button } from "@/components/ui/button";
+import { AddToCalendar } from "@/components/event/AddToCalendar";
+
+export const metadata: Metadata = createPageMetadata(pageSeo.paymentSuccess);
+
+type Props = {
+ searchParams: Promise<{ order?: string; total?: string }>;
+};
+
+export default async function PaymentSuccessPage({ searchParams }: Props) {
+ const params = await searchParams;
+ const orderId = params.order ?? "GRV-ORDER";
+ const total = params.total ? `$${params.total} USD` : null;
+
+ return (
+
+
+
+
Thank you for your order
+
+ Your registration has been received. Order reference:{" "}
+ {orderId}
+ {total && (
+ <>
+ {" "}
+ · Total: {total}
+ >
+ )}
+
+
+ A confirmation email will be sent once payment processing is connected. For now, our
+ team has logged your request.
+
+
+
+
+ );
+}
diff --git a/app/pitch-competition/page.tsx b/app/pitch-competition/page.tsx
new file mode 100644
index 0000000..ca25ec4
--- /dev/null
+++ b/app/pitch-competition/page.tsx
@@ -0,0 +1,61 @@
+import type { Metadata } from "next";
+import { pageSeo } from "@/content/page-seo";
+import { createPageMetadata } from "@/lib/seo";
+import Link from "next/link";
+import { pitchCompetition } from "@/content/pitch";
+import { site } from "@/content/site";
+import { Section } from "@/components/layout/Section";
+import { GrantHeadline } from "@/components/grants/GrantHeadline";
+import { Button } from "@/components/ui/button";
+import {
+ Accordion,
+ AccordionContent,
+ AccordionItem,
+ AccordionTrigger,
+} from "@/components/ui/accordion";
+
+export const metadata: Metadata = createPageMetadata(pageSeo.pitch);
+
+export default function PitchCompetitionPage() {
+ return (
+ <>
+
+
+ Pitch competition
+
+
+
+
+ {pitchCompetition.subheadline}
+
+ {pitchCompetition.description}
+
+
+ Apply now
+
+
+
+ Award criteria
+
+ {pitchCompetition.criteria.map((c) => (
+
+ ✓
+ {c}
+
+ ))}
+
+
+
+ Timeline
+
+ {pitchCompetition.timeline.map((t) => (
+
+ {t.phase}
+ {t.date}
+
+ ))}
+
+
+ >
+ );
+}
diff --git a/app/privacy/page.tsx b/app/privacy/page.tsx
new file mode 100644
index 0000000..3d9da63
--- /dev/null
+++ b/app/privacy/page.tsx
@@ -0,0 +1,35 @@
+import type { Metadata } from "next";
+import Link from "next/link";
+import { privacyPolicy } from "@/content/legal";
+import { pageSeo } from "@/content/page-seo";
+import { Section } from "@/components/layout/Section";
+import { createPageMetadata } from "@/lib/seo";
+import { Button } from "@/components/ui/button";
+
+export const metadata: Metadata = createPageMetadata(pageSeo.privacy);
+
+export default function PrivacyPage() {
+ return (
+
+ Legal
+ {privacyPolicy.title}
+ Last updated: {privacyPolicy.updated}
+
+ {privacyPolicy.intro}
+
+
+ {privacyPolicy.sections.map((section) => (
+
+ {section.heading}
+ {section.body}
+
+ ))}
+
+
+
+ Contact us
+
+
+
+ );
+}
diff --git a/app/program/page.tsx b/app/program/page.tsx
new file mode 100644
index 0000000..c7b0164
--- /dev/null
+++ b/app/program/page.tsx
@@ -0,0 +1,65 @@
+import type { Metadata } from "next";
+import { pageSeo } from "@/content/page-seo";
+import { createPageMetadata } from "@/lib/seo";
+import Image from "next/image";
+import Link from "next/link";
+import { programDays } from "@/content/program";
+import { pillars } from "@/content/tracks";
+import { Section } from "@/components/layout/Section";
+import { Button } from "@/components/ui/button";
+import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
+
+export const metadata: Metadata = createPageMetadata(pageSeo.program);
+
+export default function ProgramPage() {
+ return (
+ <>
+
+ Event program
+
+ Two days of workshops, panels, exhibition, and the Great Rift Valley Pitch Competition at
+ Skylight Hotel, Addis Ababa.
+
+
+ {programDays.map((day) => (
+
+
+
+
+
+ {day.date}
+ {day.title}
+ {day.description}
+
+
+
+ {day.highlights.map((h) => (
+ · {h}
+ ))}
+
+
+
+ ))}
+
+
+
Innovation pillars
+
+ {pillars.map((p) => (
+
+
+ {p.title}
+
+
+ {p.description}
+
+
+ ))}
+
+
+
+ Pitch competition details
+
+
+ >
+ );
+}
diff --git a/app/robots.ts b/app/robots.ts
new file mode 100644
index 0000000..784a8da
--- /dev/null
+++ b/app/robots.ts
@@ -0,0 +1,13 @@
+import type { MetadataRoute } from "next";
+import { SITE_URL } from "@/lib/seo";
+
+export default function robots(): MetadataRoute.Robots {
+ return {
+ rules: {
+ userAgent: "*",
+ allow: "/",
+ disallow: ["/api/", "/payment/success"],
+ },
+ sitemap: `${SITE_URL}/sitemap.xml`,
+ };
+}
diff --git a/app/sitemap.ts b/app/sitemap.ts
new file mode 100644
index 0000000..1185cce
--- /dev/null
+++ b/app/sitemap.ts
@@ -0,0 +1,11 @@
+import type { MetadataRoute } from "next";
+import { staticRoutes, SITE_URL } from "@/lib/seo";
+
+export default function sitemap(): MetadataRoute.Sitemap {
+ return staticRoutes.map((route) => ({
+ url: `${SITE_URL}${route.path === "/" ? "" : route.path}`,
+ lastModified: new Date(),
+ changeFrequency: route.changeFrequency,
+ priority: route.priority,
+ }));
+}
diff --git a/app/speakers/page.tsx b/app/speakers/page.tsx
new file mode 100644
index 0000000..bb2ebcd
--- /dev/null
+++ b/app/speakers/page.tsx
@@ -0,0 +1,68 @@
+import type { Metadata } from "next";
+import { pageSeo } from "@/content/page-seo";
+import { createPageMetadata } from "@/lib/seo";
+import Link from "next/link";
+import {
+ speakers,
+ speakerGroupLabels,
+ speakerGroupOrder,
+ type SpeakerGroup,
+} from "@/content/people";
+import { site } from "@/content/site";
+import { Section } from "@/components/layout/Section";
+import { SpeakerCard } from "@/components/speakers/SpeakerCard";
+import { Button } from "@/components/ui/button";
+
+export const metadata: Metadata = createPageMetadata(pageSeo.speakers);
+
+export default function SpeakersPage() {
+ const grouped = speakerGroupOrder.reduce(
+ (acc, group) => {
+ const list = speakers.filter((s) => s.group === group);
+ if (list.length) acc[group] = list;
+ return acc;
+ },
+ {} as Partial>
+ );
+
+ return (
+ <>
+
+ Lineup
+
+ Summit speakers & judges
+
+
+ {site.dates.label} · {site.venue.name}
+
+
+
+
+
+ {(Object.entries(grouped) as [SpeakerGroup, typeof speakers][]).map(
+ ([group, list]) => (
+
+
+
+
{speakerGroupLabels[group]}
+
{site.dates.label}
+
+
+
+ {list.map((speaker) => (
+
+ ))}
+
+
+ )
+ )}
+
+
+
+ Get tickets
+
+
+
+ >
+ );
+}
diff --git a/app/sponsor/page.tsx b/app/sponsor/page.tsx
new file mode 100644
index 0000000..6230fd6
--- /dev/null
+++ b/app/sponsor/page.tsx
@@ -0,0 +1,70 @@
+import type { Metadata } from "next";
+import { pageSeo } from "@/content/page-seo";
+import { createPageMetadata } from "@/lib/seo";
+import { Section } from "@/components/layout/Section";
+import { InquiryForm } from "@/components/forms/InquiryForm";
+import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
+
+export const metadata: Metadata = createPageMetadata(pageSeo.sponsor);
+
+const tiers = [
+ {
+ name: "Lead Sponsor",
+ description: "Premier visibility across all summit touchpoints and keynote branding.",
+ perks: ["Logo on all materials", "Keynote introduction", "VIP hospitality", "Speaking slot"],
+ },
+ {
+ name: "Gold Sponsor",
+ description: "High-impact brand presence in exhibition and programming.",
+ perks: ["Exhibition branding", "Panel sponsorship", "Digital promotion", "4 VIP passes"],
+ },
+ {
+ name: "Supporting Sponsor",
+ description: "Align your brand with Ethiopia's innovation mission.",
+ perks: ["Website listing", "Program mention", "2 passes", "Newsletter feature"],
+ },
+];
+
+export default function SponsorPage() {
+ return (
+ <>
+
+ Sponsor
+
+ Partner with Ethiopia's flagship innovation summit
+
+
+ Support the Ethiopian Diaspora Trust Fund's mission to foster tech-enabled innovation.
+ Sponsorship connects your organization with investors, founders, and leaders across
+ agriculture, healthcare, and education.
+
+
+ {tiers.map((tier) => (
+
+
+ {tier.name}
+ {tier.description}
+
+
+
+ {tier.perks.map((p) => (
+ · {p}
+ ))}
+
+
+
+ ))}
+
+
+
+ Sponsorship inquiry
+
+ Share your goals and we'll tailor a partnership package for your organization.
+
+
+
+
+
+ >
+ );
+}
diff --git a/components.json b/components.json
new file mode 100644
index 0000000..4ee62ee
--- /dev/null
+++ b/components.json
@@ -0,0 +1,21 @@
+{
+ "$schema": "https://ui.shadcn.com/schema.json",
+ "style": "new-york",
+ "rsc": true,
+ "tsx": true,
+ "tailwind": {
+ "config": "",
+ "css": "app/globals.css",
+ "baseColor": "neutral",
+ "cssVariables": true,
+ "prefix": ""
+ },
+ "aliases": {
+ "components": "@/components",
+ "utils": "@/lib/utils",
+ "ui": "@/components/ui",
+ "lib": "@/lib",
+ "hooks": "@/hooks"
+ },
+ "iconLibrary": "lucide"
+}
diff --git a/components/brand/BrandLogo.tsx b/components/brand/BrandLogo.tsx
new file mode 100644
index 0000000..5417faf
--- /dev/null
+++ b/components/brand/BrandLogo.tsx
@@ -0,0 +1,106 @@
+import Image from "next/image";
+import Link from "next/link";
+import { cn } from "@/lib/utils";
+
+const siteName = "Great Rift Valley Innovation Summit";
+
+type BrandLogoProps = {
+ className?: string;
+ href?: string;
+ /** Header/footer wordmark, or icon-only */
+ variant?: "default" | "footer" | "icon";
+ /** Tighter sizing for the floating navbar */
+ compact?: boolean;
+};
+
+export function BrandLogo({
+ className,
+ href = "/",
+ variant = "default",
+ compact = false,
+}: BrandLogoProps) {
+ const isFooter = variant === "footer";
+
+ const markSize = compact ? "size-8" : "size-9 md:size-10";
+ const markPad = isFooter ? "rounded-md bg-white p-1 shadow-sm" : "rounded-md";
+
+ const mark = (
+
+
+
+ );
+
+ if (variant === "icon") {
+ return (
+
+ {mark}
+
+ );
+ }
+
+ const primaryClass = isFooter
+ ? "text-white"
+ : "text-[#1a5c38]";
+ const secondaryClass = isFooter
+ ? "text-white/85"
+ : "text-[#0d3d26]/90";
+
+ const primarySize = compact
+ ? "text-[11px] sm:text-xs md:text-[13px]"
+ : isFooter
+ ? "text-sm md:text-base"
+ : "text-xs sm:text-sm md:text-base";
+ const secondarySize = compact
+ ? "text-[8px] sm:text-[9px]"
+ : "text-[9px] sm:text-[10px]";
+
+ const content = (
+
+ {mark}
+
+
+ Great Rift Valley
+
+
+ Innovation Summit
+
+
+
+ );
+
+ if (!href) return content;
+
+ return (
+
+ {content}
+
+ );
+}
diff --git a/components/brand/FooterTopographicBand.tsx b/components/brand/FooterTopographicBand.tsx
new file mode 100644
index 0000000..b55db70
--- /dev/null
+++ b/components/brand/FooterTopographicBand.tsx
@@ -0,0 +1,108 @@
+import { cn } from "@/lib/utils";
+
+type Props = {
+ className?: string;
+};
+
+/**
+ * Curved green / white bands like the GRV logo topography.
+ * Overlaps the top of the footer — no straight stripe bar.
+ */
+export function FooterTopographicBand({ className }: Props) {
+ const contour = "rgba(255,255,255,0.35)";
+
+ return (
+
+
+ {/* Alternating curved bands (logo-style flow, not vertical stripes) */}
+
+
+
+
+
+
+ {/* Logo-like contour strokes */}
+
+
+
+
+
+
+ {/* Fade into solid footer green */}
+
+
+ );
+}
diff --git a/components/brand/PartnerLogoPlaceholder.tsx b/components/brand/PartnerLogoPlaceholder.tsx
new file mode 100644
index 0000000..54cc947
--- /dev/null
+++ b/components/brand/PartnerLogoPlaceholder.tsx
@@ -0,0 +1,28 @@
+import { cn } from "@/lib/utils";
+
+type Props = {
+ className?: string;
+ size?: "sm" | "md" | "lg";
+};
+
+const sizeClasses = {
+ sm: "h-12 min-w-[100px] px-4 text-xs",
+ md: "h-16 min-w-[140px] px-6 text-sm",
+ lg: "h-20 min-w-[180px] px-8 text-base",
+};
+
+export function PartnerLogoPlaceholder({ className, size = "md" }: Props) {
+ return (
+
+ Your logo here
+
+ );
+}
diff --git a/components/brand/RiftFlowLines.tsx b/components/brand/RiftFlowLines.tsx
new file mode 100644
index 0000000..b428438
--- /dev/null
+++ b/components/brand/RiftFlowLines.tsx
@@ -0,0 +1,116 @@
+import { cn } from "@/lib/utils";
+
+type FlowProps = {
+ className?: string;
+ variant?: "divider" | "card" | "section" | "footer";
+ inverse?: boolean;
+};
+
+/** Small-scale decorative lines (dividers, footer band) — keep subtle */
+export function RiftFlowLines({
+ className,
+ variant = "divider",
+ inverse = false,
+}: FlowProps) {
+ const green = inverse ? "rgba(255,255,255,0.35)" : "rgba(26,92,56,0.25)";
+ const soft = inverse ? "rgba(255,255,255,0.15)" : "rgba(26,92,56,0.12)";
+
+ if (variant === "card") {
+ return (
+
+
+
+ );
+ }
+
+ if (variant === "section") {
+ return (
+
+
+
+ );
+ }
+
+ if (variant === "footer") {
+ return (
+
+
+
+
+
+ );
+ }
+
+ return (
+
+
+
+
+ );
+}
+
+/** Subtle link between ticket card blocks */
+export function RiftCardConnector({ className }: { className?: string }) {
+ return (
+
+ );
+}
diff --git a/components/brand/RiftPageFlow.tsx b/components/brand/RiftPageFlow.tsx
new file mode 100644
index 0000000..ea18b43
--- /dev/null
+++ b/components/brand/RiftPageFlow.tsx
@@ -0,0 +1,70 @@
+import { cn } from "@/lib/utils";
+
+/**
+ * Continuous valley lines from top to bottom of the page.
+ * Sits behind content; sections use lighter accents on top.
+ */
+export function RiftPageFlow() {
+ return (
+
+ {/* Primary spine — left */}
+
+
+
+
+
+ {/* Secondary thread — right (different rhythm) */}
+
+
+
+
+
+ {/* Center whisper — only on xl, very faint */}
+
+
+
+
+ );
+}
diff --git a/components/brand/RiftSectionAccent.tsx b/components/brand/RiftSectionAccent.tsx
new file mode 100644
index 0000000..d3377ad
--- /dev/null
+++ b/components/brand/RiftSectionAccent.tsx
@@ -0,0 +1,133 @@
+import type { RiftPattern } from "@/components/brand/rift-patterns";
+import { cn } from "@/lib/utils";
+
+type Props = {
+ pattern: RiftPattern;
+ inverse?: boolean;
+};
+
+/** Light section-local accent — does not compete with page spine */
+export function RiftSectionAccent({ pattern, inverse }: Props) {
+ if (pattern === "none") return null;
+
+ const mainStroke = inverse ? "rgba(255,255,255,0.25)" : "rgba(26,92,56,0.2)";
+ const softStroke = inverse ? "rgba(255,255,255,0.12)" : "rgba(26,92,56,0.1)";
+
+ if (pattern === "whisper") {
+ return (
+
+ );
+ }
+
+ if (pattern === "vein-left") {
+ return (
+
+
+
+ );
+ }
+
+ if (pattern === "vein-right") {
+ return (
+
+
+
+ );
+ }
+
+ if (pattern === "arc-top") {
+ return (
+
+
+
+
+ );
+ }
+
+ if (pattern === "arc-bottom") {
+ return (
+
+
+
+ );
+ }
+
+ if (pattern === "fork") {
+ return (
+
+
+
+ );
+ }
+
+ return null;
+}
diff --git a/components/brand/rift-patterns.ts b/components/brand/rift-patterns.ts
new file mode 100644
index 0000000..e3800ac
--- /dev/null
+++ b/components/brand/rift-patterns.ts
@@ -0,0 +1,9 @@
+/** Subtle per-section line treatments — paired with page-level RiftPageFlow */
+export type RiftPattern =
+ | "none"
+ | "whisper"
+ | "arc-top"
+ | "arc-bottom"
+ | "vein-left"
+ | "vein-right"
+ | "fork";
diff --git a/components/event/AddToCalendar.tsx b/components/event/AddToCalendar.tsx
new file mode 100644
index 0000000..7b83b76
--- /dev/null
+++ b/components/event/AddToCalendar.tsx
@@ -0,0 +1,57 @@
+"use client";
+
+import { CalendarPlus, Download } from "lucide-react";
+import { buildGoogleCalendarUrl, buildOutlookCalendarUrl } from "@/lib/calendar";
+import { Button } from "@/components/ui/button";
+import {
+ DropdownMenu,
+ DropdownMenuContent,
+ DropdownMenuItem,
+ DropdownMenuTrigger,
+} from "@/components/ui/dropdown-menu";
+
+type Props = {
+ className?: string;
+ variant?: "default" | "outline" | "inverse";
+};
+
+export function AddToCalendar({ className, variant = "outline" }: Props) {
+ const googleUrl = buildGoogleCalendarUrl();
+ const outlookUrl = buildOutlookCalendarUrl();
+
+ const buttonClass =
+ variant === "inverse"
+ ? "rounded-full border-white/30 bg-transparent text-white hover:bg-white/10"
+ : variant === "default"
+ ? "rounded-full bg-[#ffb300] text-[#0f0404] hover:bg-[#ffb300]/90"
+ : "rounded-full";
+
+ return (
+
+
+
+
+ Add to calendar
+
+
+
+
+
+ Google Calendar
+
+
+
+
+ Outlook
+
+
+
+
+
+ Apple / iCal (.ics)
+
+
+
+
+ );
+}
diff --git a/components/exhibit/BoothPackages.tsx b/components/exhibit/BoothPackages.tsx
new file mode 100644
index 0000000..c33c8c5
--- /dev/null
+++ b/components/exhibit/BoothPackages.tsx
@@ -0,0 +1,28 @@
+import { boothPackages } from "@/content/exhibit";
+import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
+
+export function BoothPackages() {
+ return (
+
+ {boothPackages.map((pkg) => (
+
+
+ {pkg.name}
+ {pkg.size}
+
+
+ {pkg.description}
+
+ {pkg.highlights.map((h) => (
+
+ ✓
+ {h}
+
+ ))}
+
+
+
+ ))}
+
+ );
+}
diff --git a/components/exhibit/ExhibitorBoothForm.tsx b/components/exhibit/ExhibitorBoothForm.tsx
new file mode 100644
index 0000000..b082342
--- /dev/null
+++ b/components/exhibit/ExhibitorBoothForm.tsx
@@ -0,0 +1,264 @@
+"use client";
+
+import { useState } from "react";
+import { boothSizes, exhibitorSectors } from "@/content/exhibit";
+import { DataConsentField } from "@/components/forms/DataConsentField";
+import { dataConsent } from "@/content/consent";
+import { Button } from "@/components/ui/button";
+import { Input } from "@/components/ui/input";
+import { Label } from "@/components/ui/label";
+import { Textarea } from "@/components/ui/textarea";
+import { Checkbox } from "@/components/ui/checkbox";
+import {
+ Select,
+ SelectContent,
+ SelectItem,
+ SelectTrigger,
+ SelectValue,
+} from "@/components/ui/select";
+
+export function ExhibitorBoothForm() {
+ const [status, setStatus] = useState<"idle" | "loading" | "success" | "error">("idle");
+ const [error, setError] = useState("");
+ const [consent, setConsent] = useState(false);
+ const [sector, setSector] = useState("");
+ const [boothSize, setBoothSize] = useState("");
+
+ async function onSubmit(e: React.FormEvent) {
+ e.preventDefault();
+ if (!consent) {
+ setError(dataConsent.errorMessage);
+ return;
+ }
+ if (!sector) {
+ setError("Please select your industry / sector.");
+ return;
+ }
+ if (!boothSize) {
+ setError("Please select a preferred booth size.");
+ return;
+ }
+
+ setStatus("loading");
+ setError("");
+
+ const form = e.currentTarget;
+ const data = new FormData(form);
+
+ try {
+ const res = await fetch("/api/inquiry", {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify({
+ intent: "exhibitor",
+ firstName: data.get("firstName"),
+ lastName: data.get("lastName"),
+ name: `${data.get("firstName")} ${data.get("lastName")}`,
+ email: data.get("email"),
+ phone: data.get("phone"),
+ jobTitle: data.get("jobTitle"),
+ company: data.get("company"),
+ companyWebsite: data.get("companyWebsite") || undefined,
+ companyDescription: data.get("companyDescription"),
+ sector,
+ productsToAdvertise: data.get("productsToAdvertise"),
+ boothSize,
+ powerRequired: data.get("powerRequired") === "on",
+ internetRequired: data.get("internetRequired") === "on",
+ staffCount: data.get("staffCount") || undefined,
+ marketingMaterials: data.get("marketingMaterials") || undefined,
+ specialRequirements: data.get("specialRequirements") || undefined,
+ message: data.get("boothGoals"),
+ consent: true,
+ }),
+ });
+ const json = await res.json();
+ if (!res.ok || !json.ok) {
+ throw new Error(json.error || "Something went wrong");
+ }
+ setStatus("success");
+ form.reset();
+ setConsent(false);
+ setSector("");
+ setBoothSize("");
+ } catch (err) {
+ setStatus("error");
+ setError(err instanceof Error ? err.message : "Failed to send");
+ }
+ }
+
+ return (
+
+ );
+}
diff --git a/components/forms/DataConsentField.tsx b/components/forms/DataConsentField.tsx
new file mode 100644
index 0000000..a9be146
--- /dev/null
+++ b/components/forms/DataConsentField.tsx
@@ -0,0 +1,51 @@
+"use client";
+
+import Link from "next/link";
+import { Checkbox } from "@/components/ui/checkbox";
+import { Label } from "@/components/ui/label";
+import { dataConsent } from "@/content/consent";
+import { cn } from "@/lib/utils";
+
+type Props = {
+ id: string;
+ checked: boolean;
+ onCheckedChange: (checked: boolean) => void;
+ /** Defaults to standard form consent; use `payment` for checkout */
+ variant?: "default" | "payment";
+ className?: string;
+};
+
+export function DataConsentField({
+ id,
+ checked,
+ onCheckedChange,
+ variant = "default",
+ className,
+}: Props) {
+ const labelPrefix =
+ variant === "payment" ? dataConsent.paymentLabel : dataConsent.label;
+
+ return (
+
+ onCheckedChange(v === true)}
+ className="mt-0.5"
+ required
+ />
+
+ {labelPrefix}{" "}
+
+ {dataConsent.privacyLinkText}
+
+ .
+
+
+ );
+}
diff --git a/components/forms/InquiryForm.tsx b/components/forms/InquiryForm.tsx
new file mode 100644
index 0000000..be64d86
--- /dev/null
+++ b/components/forms/InquiryForm.tsx
@@ -0,0 +1,108 @@
+"use client";
+
+import { useState } from "react";
+import { Button } from "@/components/ui/button";
+import { Input } from "@/components/ui/input";
+import { Label } from "@/components/ui/label";
+import { Textarea } from "@/components/ui/textarea";
+import { DataConsentField } from "@/components/forms/DataConsentField";
+import { dataConsent } from "@/content/consent";
+import type { InquiryIntent } from "@/lib/inquiry";
+
+type Props = {
+ intent: InquiryIntent;
+ submitLabel?: string;
+};
+
+export function InquiryForm({ intent, submitLabel = "Send message" }: Props) {
+ const [status, setStatus] = useState<"idle" | "loading" | "success" | "error">("idle");
+ const [error, setError] = useState("");
+ const [consent, setConsent] = useState(false);
+
+ async function onSubmit(e: React.FormEvent) {
+ e.preventDefault();
+ if (!consent) {
+ setError(dataConsent.errorMessage);
+ return;
+ }
+
+ setStatus("loading");
+ setError("");
+
+ const form = e.currentTarget;
+ const data = new FormData(form);
+
+ try {
+ const res = await fetch("/api/inquiry", {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify({
+ intent,
+ name: data.get("name"),
+ email: data.get("email"),
+ company: data.get("company") || undefined,
+ phone: data.get("phone") || undefined,
+ message: data.get("message"),
+ consent: true,
+ }),
+ });
+ const json = await res.json();
+ if (!res.ok || !json.ok) {
+ throw new Error(json.error || "Something went wrong");
+ }
+ setStatus("success");
+ form.reset();
+ setConsent(false);
+ } catch (err) {
+ setStatus("error");
+ setError(err instanceof Error ? err.message : "Failed to send");
+ }
+ }
+
+ return (
+
+
+
+
+ Message
+
+
+
+ {error && {error}
}
+ {status === "success" && (
+ Thank you! We received your inquiry and will be in touch.
+ )}
+
+ {status === "loading" ? "Sending…" : submitLabel}
+
+
+ );
+}
diff --git a/components/grants/CyclingGrantAmount.tsx b/components/grants/CyclingGrantAmount.tsx
new file mode 100644
index 0000000..3ab5892
--- /dev/null
+++ b/components/grants/CyclingGrantAmount.tsx
@@ -0,0 +1,74 @@
+"use client";
+
+import { useEffect, useState } from "react";
+import { grantFundingCycle } from "@/content/grants";
+import { cn } from "@/lib/utils";
+
+type Figure = (typeof grantFundingCycle)[number];
+
+type Props = {
+ figures?: readonly Figure[];
+ intervalMs?: number;
+ className?: string;
+ valueClassName?: string;
+ showCaption?: boolean;
+ captionClassName?: string;
+};
+
+export function CyclingGrantAmount({
+ figures = grantFundingCycle,
+ intervalMs = 3200,
+ className,
+ valueClassName,
+ showCaption = false,
+ captionClassName,
+}: Props) {
+ const [index, setIndex] = useState(0);
+ const [visible, setVisible] = useState(true);
+
+ useEffect(() => {
+ let swapTimer: ReturnType;
+ const tick = setInterval(() => {
+ setVisible(false);
+ swapTimer = setTimeout(() => {
+ setIndex((i) => (i + 1) % figures.length);
+ setVisible(true);
+ }, 220);
+ }, intervalMs);
+
+ return () => {
+ clearInterval(tick);
+ clearTimeout(swapTimer);
+ };
+ }, [figures.length, intervalMs]);
+
+ const current = figures[index];
+
+ return (
+
+
+ {current.label}:
+ {current.display}
+
+ {showCaption && (
+
+ {current.label}
+
+ )}
+
+ );
+}
diff --git a/components/grants/GrantHeadline.tsx b/components/grants/GrantHeadline.tsx
new file mode 100644
index 0000000..8881ef5
--- /dev/null
+++ b/components/grants/GrantHeadline.tsx
@@ -0,0 +1,16 @@
+"use client";
+
+import { CyclingGrantAmount } from "@/components/grants/CyclingGrantAmount";
+
+/** Pitch / about headlines with rotating grant figures */
+export function GrantHeadline({ className }: { className?: string }) {
+ return (
+
+ {" "}
+ in non-dilutive grant funding
+
+ );
+}
diff --git a/components/home/AttendSummitSection.tsx b/components/home/AttendSummitSection.tsx
new file mode 100644
index 0000000..00de10d
--- /dev/null
+++ b/components/home/AttendSummitSection.tsx
@@ -0,0 +1,71 @@
+import Link from "next/link";
+import { ArrowRight } from "lucide-react";
+import { attendCopy, attendPaths } from "@/content/attend";
+import { site } from "@/content/site";
+import { Section } from "@/components/layout/Section";
+import { Button } from "@/components/ui/button";
+import { cn } from "@/lib/utils";
+
+export function AttendSummitSection() {
+ return (
+
+
+
+ {attendCopy.eyebrow}
+
+
+ {attendCopy.headline}
+
+
{attendCopy.subheadline}
+
+ {site.dates.label} · {site.venue.name}
+
+
+
+
+ {attendPaths.map((path) => {
+ const Icon = path.icon;
+ return (
+
+
+
+
+ {path.title}
+
+ {path.description}
+
+
+
+ {path.cta}
+
+
+
+
+ );
+ })}
+
+
+
+
+ Get tickets
+
+
+ Contact the team
+
+
+
+ );
+}
diff --git a/components/home/BoothAcquisitionBand.tsx b/components/home/BoothAcquisitionBand.tsx
new file mode 100644
index 0000000..07398ca
--- /dev/null
+++ b/components/home/BoothAcquisitionBand.tsx
@@ -0,0 +1,37 @@
+import Link from "next/link";
+import Image from "next/image";
+import { exhibitCopy } from "@/content/exhibit";
+import { Section } from "@/components/layout/Section";
+import { Button } from "@/components/ui/button";
+
+export function BoothAcquisitionBand() {
+ return (
+
+
+
+
+
+
+
+ {exhibitCopy.eyebrow}
+
+
{exhibitCopy.headline}
+
{exhibitCopy.subheadline}
+
+
+ Reserve a booth
+
+
+ View booth packages
+
+
+
+
+
+ );
+}
diff --git a/components/home/ExperienceCards.tsx b/components/home/ExperienceCards.tsx
new file mode 100644
index 0000000..c1ca972
--- /dev/null
+++ b/components/home/ExperienceCards.tsx
@@ -0,0 +1,48 @@
+import Image from "next/image";
+import Link from "next/link";
+import { ArrowRight } from "lucide-react";
+import { experiences } from "@/content/program";
+import { Section } from "@/components/layout/Section";
+import { Button } from "@/components/ui/button";
+import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
+
+export function ExperienceCards() {
+ return (
+
+
+ Two days to go deep into what Ethiopia's innovators need
+
+
+ Workshops, exhibition, and Africa's largest non-dilutive grant pitch event.
+
+
+ {experiences.map((exp, i) => (
+
+
+
+
+
+
+ Day {i + 1}
+
+ {exp.title}
+ {exp.description}
+
+
+
+
+ Learn more
+
+
+
+
+ ))}
+
+
+ );
+}
diff --git a/components/home/Faq.tsx b/components/home/Faq.tsx
new file mode 100644
index 0000000..f412e14
--- /dev/null
+++ b/components/home/Faq.tsx
@@ -0,0 +1,27 @@
+import { faqs } from "@/content/faq";
+import { Section } from "@/components/layout/Section";
+import {
+ Accordion,
+ AccordionContent,
+ AccordionItem,
+ AccordionTrigger,
+} from "@/components/ui/accordion";
+
+export function Faq() {
+ return (
+
+ Frequently asked questions
+
+ {faqs.map((faq, i) => (
+
+
+ {String(i + 1).padStart(2, "0")}.
+ {faq.question}
+
+ {faq.answer}
+
+ ))}
+
+
+ );
+}
diff --git a/components/home/Hero.tsx b/components/home/Hero.tsx
new file mode 100644
index 0000000..89fc526
--- /dev/null
+++ b/components/home/Hero.tsx
@@ -0,0 +1,56 @@
+import Image from "next/image";
+import Link from "next/link";
+import { ArrowRight } from "lucide-react";
+import { site } from "@/content/site";
+import { AddToCalendar } from "@/components/event/AddToCalendar";
+import { HeroGrantLine } from "@/components/home/HeroGrantLine";
+import { Button } from "@/components/ui/button";
+
+export function Hero() {
+ return (
+
+
+
+ {site.dates.label} · {site.venue.address}
+
+
+ Great Rift Valley
+
+ Innovation Summit
+
+
+ {site.tagline} Presented by {site.presentedBy}.
+
+
+
+
+ Register
+
+
+
+ Apply to pitch
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/components/home/HeroGrantLine.tsx b/components/home/HeroGrantLine.tsx
new file mode 100644
index 0000000..ab647da
--- /dev/null
+++ b/components/home/HeroGrantLine.tsx
@@ -0,0 +1,17 @@
+"use client";
+
+import { CyclingGrantAmount } from "@/components/grants/CyclingGrantAmount";
+
+export function HeroGrantLine() {
+ return (
+
+ 500+ attendees ·{" "}
+ {" "}
+ grant funding · Skylight Hotel, Addis Ababa
+
+ );
+}
diff --git a/components/home/Newsletter.tsx b/components/home/Newsletter.tsx
new file mode 100644
index 0000000..d79b9ac
--- /dev/null
+++ b/components/home/Newsletter.tsx
@@ -0,0 +1,69 @@
+"use client";
+
+import { useState } from "react";
+import { Section } from "@/components/layout/Section";
+import { Button } from "@/components/ui/button";
+import { Input } from "@/components/ui/input";
+import { Label } from "@/components/ui/label";
+
+export function Newsletter() {
+ const [email, setEmail] = useState("");
+ const [status, setStatus] = useState<"idle" | "loading" | "done" | "error">("idle");
+
+ async function submit(e: React.FormEvent) {
+ e.preventDefault();
+ setStatus("loading");
+ try {
+ const res = await fetch("/api/inquiry", {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify({
+ intent: "newsletter",
+ name: "Newsletter subscriber",
+ email,
+ message: "Newsletter signup from homepage",
+ }),
+ });
+ if (!res.ok) throw new Error();
+ setStatus("done");
+ setEmail("");
+ } catch {
+ setStatus("error");
+ }
+ }
+
+ return (
+
+
+
Stay up to date
+
+ Get announcements before anyone else about the next GRV Summit edition.
+
+
+
+ Email
+ setEmail(e.target.value)}
+ />
+
+
+ {status === "loading" ? "Signing up…" : "Sign up"}
+
+
+ {status === "done" &&
You're on the list!
}
+ {status === "error" && (
+
Something went wrong. Try again.
+ )}
+
+
+ );
+}
diff --git a/components/home/PartnerMarquee.tsx b/components/home/PartnerMarquee.tsx
new file mode 100644
index 0000000..c08be90
--- /dev/null
+++ b/components/home/PartnerMarquee.tsx
@@ -0,0 +1,20 @@
+import { PartnerLogoPlaceholder } from "@/components/brand/PartnerLogoPlaceholder";
+
+export function PartnerMarquee() {
+ const slots = Array.from({ length: 8 }, (_, i) => i);
+
+ return (
+
+
+ With the support of
+
+
+
+ {[...slots, ...slots].map((i) => (
+
+ ))}
+
+
+
+ );
+}
diff --git a/components/home/PurposeBand.tsx b/components/home/PurposeBand.tsx
new file mode 100644
index 0000000..0736faa
--- /dev/null
+++ b/components/home/PurposeBand.tsx
@@ -0,0 +1,37 @@
+import Image from "next/image";
+import { Section } from "@/components/layout/Section";
+import { PurposeGrantText } from "@/components/home/PurposeGrantText";
+export function PurposeBand() {
+ return (
+
+
+
+
+ About this summit
+
+
+ A first-of-its-kind gathering for Ethiopia's innovators
+
+
+ The Great Rift Valley Innovation Summit, presented by the Ethiopian Diaspora Trust
+ Fund (EDTF), convenes entrepreneurs, investors, companies, startups, and jobseekers to
+ advance tech-enabled innovation in agriculture, healthcare, and education.
+
+
+ Programming includes an exhibitor hall, workshops and panel discussions, and the
+ inaugural Great Rift Valley Pitch Competition— Ten companies will
+ be selected from the most impactful ventures.
+
+
+
+
+
+
+
+ );
+}
diff --git a/components/home/PurposeGrantText.tsx b/components/home/PurposeGrantText.tsx
new file mode 100644
index 0000000..903244a
--- /dev/null
+++ b/components/home/PurposeGrantText.tsx
@@ -0,0 +1,15 @@
+"use client";
+
+import { CyclingGrantAmount } from "@/components/grants/CyclingGrantAmount";
+
+export function PurposeGrantText() {
+ return (
+
+ {" "}
+ in non-dilutive grant funding
+
+ );
+}
diff --git a/components/home/Speakers.tsx b/components/home/Speakers.tsx
new file mode 100644
index 0000000..1162624
--- /dev/null
+++ b/components/home/Speakers.tsx
@@ -0,0 +1,73 @@
+import Link from "next/link";
+import {
+ speakers,
+ speakerGroupLabels,
+ speakerGroupOrder,
+ type SpeakerGroup,
+} from "@/content/people";
+import { site } from "@/content/site";
+import { Section } from "@/components/layout/Section";
+import { SpeakerCard } from "@/components/speakers/SpeakerCard";
+import { Button } from "@/components/ui/button";
+
+export function Speakers() {
+ const grouped = speakerGroupOrder.reduce(
+ (acc, group) => {
+ const list = speakers.filter((s) => s.group === group);
+ if (list.length) acc[group] = list;
+ return acc;
+ },
+ {} as Partial>
+ );
+
+ return (
+
+
+
+ Lineup
+
+
+ Meet the voices of GRV Summit
+
+
+ Keynotes, panelists, judges, and opening speakers — {site.dates.label} at{" "}
+ {site.venue.name}.
+
+
+
+
+ {(Object.entries(grouped) as [SpeakerGroup, typeof speakers][]).map(
+ ([group, list]) => (
+
+
+
+
+ {speakerGroupLabels[group]}
+
+
{site.dates.label}
+
+
+
+ {list.map((speaker) => (
+
+ ))}
+
+
+ )
+ )}
+
+
+
+
+ View full program
+
+
+ Full lineup page
+
+
+ Get tickets
+
+
+
+ );
+}
diff --git a/components/home/SponsorTiers.tsx b/components/home/SponsorTiers.tsx
new file mode 100644
index 0000000..a9d5e80
--- /dev/null
+++ b/components/home/SponsorTiers.tsx
@@ -0,0 +1,37 @@
+import Link from "next/link";
+import { partnerTiers } from "@/content/partners";
+import { PartnerLogoPlaceholder } from "@/components/brand/PartnerLogoPlaceholder";
+import { Section } from "@/components/layout/Section";
+import { Separator } from "@/components/ui/separator";
+import { Button } from "@/components/ui/button";
+
+export function SponsorTiers() {
+ return (
+
+ Partners & sponsors
+
+ Logo slots below are open — partner with GRV Summit and feature your brand here.
+
+
+ {partnerTiers.slice(0, 2).map((tier) => (
+
+
+
+ {tier.name}
+
+
+ {tier.partners.map((p, i) => (
+
+ ))}
+
+
+ ))}
+
+
+
+ Become a partner
+
+
+
+ );
+}
diff --git a/components/home/StatsGrid.tsx b/components/home/StatsGrid.tsx
new file mode 100644
index 0000000..eb5fc23
--- /dev/null
+++ b/components/home/StatsGrid.tsx
@@ -0,0 +1,35 @@
+import { site } from "@/content/site";
+import { Section } from "@/components/layout/Section";
+import { CyclingGrantAmount } from "@/components/grants/CyclingGrantAmount";
+
+export function StatsGrid() {
+ return (
+
+
+ The future starts here
+
+
+ Powering Ethiopia's innovation leap forward
+
+
+ {site.stats.map((stat) => (
+
+ {stat.type === "cycling" ? (
+
+ ) : (
+
{stat.value}
+ )}
+
{stat.label}
+
+ ))}
+
+
+ );
+}
diff --git a/components/home/TicketsBand.tsx b/components/home/TicketsBand.tsx
new file mode 100644
index 0000000..ce1a0ba
--- /dev/null
+++ b/components/home/TicketsBand.tsx
@@ -0,0 +1,41 @@
+import Link from "next/link";
+import { ticketTiers } from "@/content/tickets";
+import { site } from "@/content/site";
+import { Section } from "@/components/layout/Section";
+import { TicketCard } from "@/components/tickets/TicketCard";
+export function TicketsBand() {
+ return (
+
+
+
+ Register
+
+
+ Get your ticket
+
+
+ Join 500+ attendees at {site.venue.name}, {site.venue.address}. Add the summit to your
+ calendar when you choose a pass.
+
+
+
+
+ {ticketTiers.map((tier, index) => (
+
+ ))}
+
+
+
+ Accepted: Visa, Mastercard, AMEX ·{" "}
+
+ Bank transfer & invoice
+
+
+
+ );
+}
diff --git a/components/home/TopicMarquee.tsx b/components/home/TopicMarquee.tsx
new file mode 100644
index 0000000..b52596b
--- /dev/null
+++ b/components/home/TopicMarquee.tsx
@@ -0,0 +1,25 @@
+import { Badge } from "@/components/ui/badge";
+import { topicChips } from "@/content/tracks";
+import { Section } from "@/components/layout/Section";
+
+export function TopicMarquee() {
+ const items = [...topicChips, ...topicChips];
+ return (
+
+ Topics shaping the summit
+
+
+ {items.map((topic, i) => (
+
+ {topic}
+
+ ))}
+
+
+
+ );
+}
diff --git a/components/home/Venue.tsx b/components/home/Venue.tsx
new file mode 100644
index 0000000..411e6e7
--- /dev/null
+++ b/components/home/Venue.tsx
@@ -0,0 +1,38 @@
+import { site } from "@/content/site";
+import { Section } from "@/components/layout/Section";
+import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
+import { Button } from "@/components/ui/button";
+import Link from "next/link";
+
+export function Venue() {
+ return (
+
+
+
+
The venue
+
{site.venue.name}
+
{site.venue.address}
+
+
+ Open in Google Maps
+
+
+
+
+
+ Map
+
+
+
+
+
+
+
+ );
+}
diff --git a/components/layout/FooterNewsletter.tsx b/components/layout/FooterNewsletter.tsx
new file mode 100644
index 0000000..cba8ebf
--- /dev/null
+++ b/components/layout/FooterNewsletter.tsx
@@ -0,0 +1,108 @@
+"use client";
+
+import { useState } from "react";
+import { ArrowRight } from "lucide-react";
+import { BrandLogo } from "@/components/brand/BrandLogo";
+import { DataConsentField } from "@/components/forms/DataConsentField";
+import { Button } from "@/components/ui/button";
+import { Input } from "@/components/ui/input";
+import { Label } from "@/components/ui/label";
+import { dataConsent } from "@/content/consent";
+
+export function FooterNewsletter() {
+ const [status, setStatus] = useState<"idle" | "loading" | "done" | "error">("idle");
+ const [consent, setConsent] = useState(false);
+ const [error, setError] = useState("");
+
+ async function submit(e: React.FormEvent) {
+ e.preventDefault();
+ if (!consent) {
+ setError(dataConsent.errorMessage);
+ return;
+ }
+ setStatus("loading");
+ setError("");
+ const form = e.currentTarget;
+ const data = new FormData(form);
+
+ try {
+ const res = await fetch("/api/inquiry", {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify({
+ intent: "newsletter",
+ firstName: data.get("firstName"),
+ lastName: data.get("lastName"),
+ email: data.get("email"),
+ message: "Footer newsletter signup",
+ consent: true,
+ }),
+ });
+ const json = await res.json();
+ if (!res.ok || !json.ok) {
+ throw new Error(json.error || "Something went wrong");
+ }
+ setStatus("done");
+ form.reset();
+ setConsent(false);
+ } catch (err) {
+ setStatus("error");
+ setError(err instanceof Error ? err.message : "Something went wrong. Please try again.");
+ }
+ }
+
+ return (
+
+
+
+
+
Stay up to date!
+
+ Get announcements about tickets, lineup, and the next Great Rift Valley Innovation
+ Summit edition before anyone else.
+
+
+
+
+
+ First name
+
+
+
+ Last name
+
+
+
+
+ Email address
+
+
+
+ {error && {error}
}
+ {status === "done" && (
+ You're on the list — thank you!
+ )}
+
+ {status === "loading" ? "Signing up…" : "Sign up"}
+
+
+
+
+
+ );
+}
diff --git a/components/layout/NavTicketsCta.tsx b/components/layout/NavTicketsCta.tsx
new file mode 100644
index 0000000..95fb425
--- /dev/null
+++ b/components/layout/NavTicketsCta.tsx
@@ -0,0 +1,30 @@
+import Link from "next/link";
+import { ArrowRight } from "lucide-react";
+import { site } from "@/content/site";
+import { Button } from "@/components/ui/button";
+import { cn } from "@/lib/utils";
+
+type Props = {
+ className?: string;
+ /** Full-width style for mobile sheet */
+ fullWidth?: boolean;
+};
+
+export function NavTicketsCta({ className, fullWidth }: Props) {
+ return (
+
+
+ Tickets
+
+
+
+ );
+}
diff --git a/components/layout/Section.tsx b/components/layout/Section.tsx
new file mode 100644
index 0000000..7e4b734
--- /dev/null
+++ b/components/layout/Section.tsx
@@ -0,0 +1,42 @@
+import type { ReactNode } from "react";
+import { RiftSectionAccent } from "@/components/brand/RiftSectionAccent";
+import type { RiftPattern } from "@/components/brand/rift-patterns";
+import { cn } from "@/lib/utils";
+
+type Props = {
+ id?: string;
+ className?: string;
+ children: ReactNode;
+ variant?: "default" | "muted" | "inverse";
+ /** Subtle line accent for this section — page spine handles vertical flow */
+ riftPattern?: RiftPattern;
+ /** @deprecated Use riftPattern instead */
+ riftFlow?: boolean;
+};
+
+export function Section({
+ id,
+ className,
+ children,
+ variant = "default",
+ riftPattern = "none",
+ riftFlow,
+}: Props) {
+ const pattern: RiftPattern = riftFlow && riftPattern === "none" ? "whisper" : riftPattern;
+
+ return (
+
+ );
+}
diff --git a/components/layout/SiteFooter.tsx b/components/layout/SiteFooter.tsx
new file mode 100644
index 0000000..4d2d5a4
--- /dev/null
+++ b/components/layout/SiteFooter.tsx
@@ -0,0 +1,96 @@
+import Link from "next/link";
+import { BrandLogo } from "@/components/brand/BrandLogo";
+import { FooterTopographicBand } from "@/components/brand/FooterTopographicBand";
+import { FooterNewsletter } from "@/components/layout/FooterNewsletter";
+import { site } from "@/content/site";
+
+const footerColumns = [
+ {
+ title: "Event",
+ links: [
+ { href: "/", label: "Home" },
+ { href: "/payment", label: "Buy tickets" },
+ { href: "/pitch-competition", label: "Apply to pitch" },
+ { href: "/program", label: "Program" },
+ ],
+ },
+ {
+ title: "Experience",
+ links: [
+ { href: "/speakers", label: "Lineup" },
+ { href: "/program", label: "Workshops & panels" },
+ { href: "/exhibit", label: "Exhibitor hall" },
+ { href: "/pitch-competition", label: "Pitch finals" },
+ ],
+ },
+ {
+ title: "Participate",
+ links: [
+ { href: "/partners", label: "Partners" },
+ { href: "/exhibit", label: "Exhibit" },
+ { href: "/sponsor", label: "Sponsor" },
+ { href: "/contact", label: "Contact" },
+ { href: "/privacy", label: "Privacy policy" },
+ ],
+ },
+ {
+ title: "Connect",
+ links: [
+ { href: site.links.legacySite, label: "Legacy site", external: true },
+ { href: "mailto:info@grvsummit.com", label: "info@grvsummit.com" },
+ { href: site.venue.mapsUrl, label: "Venue map", external: true },
+ ],
+ },
+];
+
+export function SiteFooter() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {footerColumns.map((col) => (
+
+
{col.title}
+
+ {col.links.map((link) => (
+
+
+ {link.label}
+
+
+ ))}
+
+
+ ))}
+
+
+
+
+
+ {site.shortName} · {site.dates.label} · Presented by {site.presentedBy}
+
+
+ © {new Date().getFullYear()} Ethiopian Diaspora Trust Fund. All rights reserved.
+
+
+
+
+
+ );
+}
diff --git a/components/layout/SiteHeader.tsx b/components/layout/SiteHeader.tsx
new file mode 100644
index 0000000..14abd59
--- /dev/null
+++ b/components/layout/SiteHeader.tsx
@@ -0,0 +1,127 @@
+"use client";
+
+import Link from "next/link";
+import { ChevronDown, Menu } from "lucide-react";
+import { BrandLogo } from "@/components/brand/BrandLogo";
+import { NavTicketsCta } from "@/components/layout/NavTicketsCta";
+import { programDays } from "@/content/program";
+import { Button } from "@/components/ui/button";
+import {
+ DropdownMenu,
+ DropdownMenuContent,
+ DropdownMenuItem,
+ DropdownMenuTrigger,
+} from "@/components/ui/dropdown-menu";
+import {
+ Sheet,
+ SheetContent,
+ SheetHeader,
+ SheetTitle,
+ SheetTrigger,
+} from "@/components/ui/sheet";
+import { cn } from "@/lib/utils";
+
+const navPills = [
+ { href: "/speakers", label: "Lineup" },
+ { href: "/pitch-competition", label: "Pitch", badge: "Grants" },
+ { href: "/partners", label: "Partners" },
+ { href: "/exhibit", label: "Exhibit" },
+];
+
+const pillClass =
+ "inline-flex items-center gap-1.5 rounded-full bg-[#1a5c38]/10 px-4 py-2 text-sm font-medium text-[#0d3d26] transition-colors hover:bg-[#1a5c38]/15";
+
+export function SiteHeader() {
+ return (
+
+ );
+}
diff --git a/components/partners/ChampionStartupModal.tsx b/components/partners/ChampionStartupModal.tsx
new file mode 100644
index 0000000..f9741ae
--- /dev/null
+++ b/components/partners/ChampionStartupModal.tsx
@@ -0,0 +1,172 @@
+"use client";
+
+import { useState } from "react";
+import { Rocket } from "lucide-react";
+import { championStartupCopy } from "@/content/partners";
+import { Button } from "@/components/ui/button";
+import {
+ Dialog,
+ DialogContent,
+ DialogDescription,
+ DialogHeader,
+ DialogTitle,
+ DialogTrigger,
+} from "@/components/ui/dialog";
+import { Input } from "@/components/ui/input";
+import { Label } from "@/components/ui/label";
+import { Textarea } from "@/components/ui/textarea";
+import { DataConsentField } from "@/components/forms/DataConsentField";
+import { dataConsent } from "@/content/consent";
+import {
+ Select,
+ SelectContent,
+ SelectItem,
+ SelectTrigger,
+ SelectValue,
+} from "@/components/ui/select";
+
+const sectors = ["Agriculture", "Healthcare", "Education", "Other"];
+
+export function ChampionStartupModal() {
+ const [open, setOpen] = useState(false);
+ const [status, setStatus] = useState<"idle" | "loading" | "success" | "error">("idle");
+ const [error, setError] = useState("");
+ const [consent, setConsent] = useState(false);
+ const [sector, setSector] = useState("");
+
+ async function onSubmit(e: React.FormEvent) {
+ e.preventDefault();
+ if (!consent) {
+ setError(dataConsent.errorMessage);
+ return;
+ }
+
+ setStatus("loading");
+ setError("");
+
+ const form = e.currentTarget;
+ const data = new FormData(form);
+
+ try {
+ const res = await fetch("/api/inquiry", {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify({
+ intent: "startup_referral",
+ name: data.get("name"),
+ email: data.get("email"),
+ startupName: data.get("startupName"),
+ startupWebsite: data.get("startupWebsite") || undefined,
+ startupSector: sector || undefined,
+ whyRecommend: data.get("whyRecommend"),
+ consent: true,
+ }),
+ });
+ const json = await res.json();
+ if (!res.ok || !json.ok) {
+ throw new Error(json.error || "Something went wrong");
+ }
+ setStatus("success");
+ form.reset();
+ setConsent(false);
+ setSector("");
+ setTimeout(() => {
+ setOpen(false);
+ setStatus("idle");
+ }, 2500);
+ } catch (err) {
+ setStatus("error");
+ setError(err instanceof Error ? err.message : "Failed to send");
+ }
+ }
+
+ return (
+
+
+
+
+ {championStartupCopy.title}
+
+
+
+
+ {championStartupCopy.title}
+ {championStartupCopy.intro}
+
+
+ {championStartupCopy.disclaimer}
+
+
+
+
+ Your name *
+
+
+
+
+
+ Your email *
+
+
+
+
+
+ Startup name *
+
+
+
+
+ Startup website (optional)
+
+
+
+ Sector
+
+
+
+
+
+ {sectors.map((s) => (
+
+ {s}
+
+ ))}
+
+
+
+
+
+ Why do you recommend them? *
+
+
+
+
+ {error && {error}
}
+ {status === "success" && (
+ Thank you for championing this startup!
+ )}
+
+ {status === "loading" ? "Submitting…" : "Submit recommendation"}
+
+
+
+
+ );
+}
diff --git a/components/partners/PartnerCard.tsx b/components/partners/PartnerCard.tsx
new file mode 100644
index 0000000..c508a72
--- /dev/null
+++ b/components/partners/PartnerCard.tsx
@@ -0,0 +1,37 @@
+import Link from "next/link";
+import type { PartnerProfile } from "@/content/partners";
+import { PartnerLogoPlaceholder } from "@/components/brand/PartnerLogoPlaceholder";
+import { Card, CardContent, CardDescription, CardHeader } from "@/components/ui/card";
+import { Button } from "@/components/ui/button";
+
+type Props = {
+ partner: PartnerProfile;
+ tierLabel?: string;
+};
+
+export function PartnerCard({ partner, tierLabel }: Props) {
+ return (
+
+ {tierLabel && (
+
+ {tierLabel}
+
+ )}
+
+
+
+
+
+ {partner.description}
+
+ {partner.url && !partner.isPlaceholder && (
+
+
+ More info
+
+
+ )}
+
+
+ );
+}
diff --git a/components/partners/PartnerSectionBlock.tsx b/components/partners/PartnerSectionBlock.tsx
new file mode 100644
index 0000000..fc13c44
--- /dev/null
+++ b/components/partners/PartnerSectionBlock.tsx
@@ -0,0 +1,31 @@
+import type { PartnerSection } from "@/content/partners";
+import { PartnerCard } from "@/components/partners/PartnerCard";
+import { Separator } from "@/components/ui/separator";
+
+type Props = {
+ section: PartnerSection;
+ showTitle?: boolean;
+};
+
+export function PartnerSectionBlock({ section, showTitle = true }: Props) {
+ return (
+
+ {showTitle && (
+ <>
+
{section.title}
+
+ >
+ )}
+ {section.tierLabel && (
+
+ {section.tierLabel}
+
+ )}
+
+ {section.partners.map((partner) => (
+
+ ))}
+
+
+ );
+}
diff --git a/components/partners/PartnershipCtaBand.tsx b/components/partners/PartnershipCtaBand.tsx
new file mode 100644
index 0000000..92f69ed
--- /dev/null
+++ b/components/partners/PartnershipCtaBand.tsx
@@ -0,0 +1,30 @@
+import { partnershipCta } from "@/content/partners";
+import { PartnershipInquiryForm } from "@/components/partners/PartnershipInquiryForm";
+import { ChampionStartupModal } from "@/components/partners/ChampionStartupModal";
+
+export function PartnershipCtaBand() {
+ return (
+
+ );
+}
diff --git a/components/partners/PartnershipInquiryForm.tsx b/components/partners/PartnershipInquiryForm.tsx
new file mode 100644
index 0000000..dad7ffc
--- /dev/null
+++ b/components/partners/PartnershipInquiryForm.tsx
@@ -0,0 +1,122 @@
+"use client";
+
+import { useState } from "react";
+import { Button } from "@/components/ui/button";
+import { Input } from "@/components/ui/input";
+import { Label } from "@/components/ui/label";
+import { Textarea } from "@/components/ui/textarea";
+import { DataConsentField } from "@/components/forms/DataConsentField";
+import { dataConsent } from "@/content/consent";
+
+export function PartnershipInquiryForm() {
+ const [status, setStatus] = useState<"idle" | "loading" | "success" | "error">("idle");
+ const [error, setError] = useState("");
+ const [consent, setConsent] = useState(false);
+
+ async function onSubmit(e: React.FormEvent) {
+ e.preventDefault();
+ if (!consent) {
+ setError(dataConsent.errorMessage);
+ return;
+ }
+
+ setStatus("loading");
+ setError("");
+
+ const form = e.currentTarget;
+ const data = new FormData(form);
+
+ try {
+ const res = await fetch("/api/inquiry", {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify({
+ intent: "partnership",
+ firstName: data.get("firstName"),
+ lastName: data.get("lastName"),
+ email: data.get("email"),
+ company: data.get("company"),
+ message: data.get("message") || undefined,
+ consent: true,
+ }),
+ });
+ const json = await res.json();
+ if (!res.ok || !json.ok) {
+ throw new Error(json.error || "Something went wrong");
+ }
+ setStatus("success");
+ form.reset();
+ setConsent(false);
+ } catch (err) {
+ setStatus("error");
+ setError(err instanceof Error ? err.message : "Failed to send");
+ }
+ }
+
+ return (
+
+
Request Partnership Information
+
+
+
+
+ Email *
+
+
+
+
+
+ Company name *
+
+
+
+
+ Message (optional)
+
+
+
+ {error && {error}
}
+ {status === "success" && (
+
+ Thank you! We received your request and will be in touch.
+
+ )}
+
+ {status === "loading" ? "Sending…" : "Next"}
+
+
+
+ );
+}
diff --git a/components/payment/PaymentForm.tsx b/components/payment/PaymentForm.tsx
new file mode 100644
index 0000000..c99335b
--- /dev/null
+++ b/components/payment/PaymentForm.tsx
@@ -0,0 +1,215 @@
+"use client";
+
+import { useMemo, useState } from "react";
+import { useRouter, useSearchParams } from "next/navigation";
+import { ticketTiers, paymentMethods } from "@/content/tickets";
+import { calculateTotal } from "@/lib/payment";
+import { Button } from "@/components/ui/button";
+import { Input } from "@/components/ui/input";
+import { Label } from "@/components/ui/label";
+import {
+ Select,
+ SelectContent,
+ SelectItem,
+ SelectTrigger,
+ SelectValue,
+} from "@/components/ui/select";
+import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
+import { DataConsentField } from "@/components/forms/DataConsentField";
+import { dataConsent } from "@/content/consent";
+import { cn } from "@/lib/utils";
+
+export function PaymentForm() {
+ const searchParams = useSearchParams();
+ const router = useRouter();
+ const initialTicket = searchParams.get("ticket") ?? ticketTiers[0].id;
+
+ const [ticketId, setTicketId] = useState(initialTicket);
+ const [quantity, setQuantity] = useState(1);
+ const [paymentMethod, setPaymentMethod] = useState<"card" | "bank">("card");
+ const [status, setStatus] = useState<"idle" | "loading" | "error">("idle");
+ const [error, setError] = useState("");
+ const [consent, setConsent] = useState(false);
+
+ const tier = ticketTiers.find((t) => t.id === ticketId) ?? ticketTiers[0];
+ const total = useMemo(() => calculateTotal(ticketId, quantity), [ticketId, quantity]);
+
+ async function onSubmit(e: React.FormEvent) {
+ e.preventDefault();
+ if (!consent) {
+ setError(dataConsent.errorMessage);
+ return;
+ }
+ setStatus("loading");
+ setError("");
+
+ const form = e.currentTarget;
+ const data = new FormData(form);
+
+ try {
+ const res = await fetch("/api/payment", {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify({
+ ticketId,
+ quantity,
+ paymentMethod,
+ name: data.get("name"),
+ email: data.get("email"),
+ company: data.get("company") || undefined,
+ phone: data.get("phone") || undefined,
+ consent: true,
+ }),
+ });
+ const json = await res.json();
+ if (!res.ok || !json.ok) {
+ throw new Error(json.error || "Payment failed");
+ }
+ router.push(`/payment/success?order=${json.orderId}&total=${json.totalUsd}`);
+ } catch (err) {
+ setStatus("error");
+ setError(err instanceof Error ? err.message : "Payment failed");
+ }
+ }
+
+ return (
+
+
+
+
Ticket type
+
+ {ticketTiers.map((t) => (
+
setTicketId(t.id)}
+ className={cn(
+ "rounded-xl border p-4 text-left transition-colors",
+ ticketId === t.id
+ ? "border-[#1f3d7e] bg-[#1f3d7e]/5 ring-2 ring-[#1f3d7e]"
+ : "border-border hover:border-[#1f3d7e]/40",
+ t.soldOut && "opacity-50"
+ )}
+ >
+ {t.name}
+ ${t.priceUsd}
+ {t.soldOut && Sold out
}
+
+ ))}
+
+
+
+
+
+ Quantity
+ setQuantity(Number(v))}
+ >
+
+
+
+
+ {[1, 2, 3, 4, 5].map((n) => (
+
+ {n}
+
+ ))}
+
+
+
+
+
+
+
Payment method
+
+ {paymentMethods.map((m) => (
+
setPaymentMethod(m.id)}
+ className={cn(
+ "rounded-xl border p-4 text-left",
+ paymentMethod === m.id
+ ? "border-[#ffb300] ring-2 ring-[#ffb300]"
+ : "border-border"
+ )}
+ >
+ {m.label}
+ {m.description}
+
+ ))}
+
+
+
+
+
+
+ {error &&
{error}
}
+
+
+
+
+ Order summary
+ {tier.description}
+
+
+
+ {tier.features.map((f) => (
+ · {f}
+ ))}
+
+
+
+
+ {tier.name} × {quantity}
+
+ ${tier.priceUsd * quantity}
+
+
+ Total
+ ${total} USD
+
+
+
+ {status === "loading"
+ ? "Processing…"
+ : paymentMethod === "card"
+ ? "Pay now"
+ : "Request invoice"}
+
+
+ Payments are processed securely. v1 records your order for follow-up.
+
+
+
+
+ );
+}
diff --git a/components/seo/JsonLd.tsx b/components/seo/JsonLd.tsx
new file mode 100644
index 0000000..ac54e34
--- /dev/null
+++ b/components/seo/JsonLd.tsx
@@ -0,0 +1,65 @@
+import { site } from "@/content/site";
+import { absoluteUrl } from "@/lib/seo";
+
+export function JsonLd() {
+ const eventSchema = {
+ "@context": "https://schema.org",
+ "@type": "Event",
+ name: site.name,
+ description: site.tagline,
+ startDate: site.dates.start,
+ endDate: site.dates.end,
+ eventAttendanceMode: "https://schema.org/OfflineEventAttendanceMode",
+ eventStatus: "https://schema.org/EventScheduled",
+ location: {
+ "@type": "Place",
+ name: site.venue.name,
+ address: {
+ "@type": "PostalAddress",
+ streetAddress: site.venue.address,
+ addressLocality: "Addis Ababa",
+ addressCountry: "ET",
+ },
+ },
+ organizer: {
+ "@type": "Organization",
+ name: site.presentedBy,
+ url: absoluteUrl("/"),
+ },
+ image: absoluteUrl("/branding/logo.png"),
+ url: absoluteUrl("/"),
+ };
+
+ const organizationSchema = {
+ "@context": "https://schema.org",
+ "@type": "Organization",
+ name: site.presentedBy,
+ url: absoluteUrl("/"),
+ logo: absoluteUrl("/branding/logo-icon.png"),
+ };
+
+ const websiteSchema = {
+ "@context": "https://schema.org",
+ "@type": "WebSite",
+ name: site.name,
+ url: absoluteUrl("/"),
+ description: site.tagline,
+ };
+
+ return (
+ <>
+
+
+
+ >
+ );
+}
diff --git a/components/speakers/SpeakerCard.tsx b/components/speakers/SpeakerCard.tsx
new file mode 100644
index 0000000..7c2aa05
--- /dev/null
+++ b/components/speakers/SpeakerCard.tsx
@@ -0,0 +1,39 @@
+import Image from "next/image";
+import Link from "next/link";
+import type { Person } from "@/content/people";
+import { cn } from "@/lib/utils";
+
+type Props = {
+ speaker: Person;
+ className?: string;
+};
+
+export function SpeakerCard({ speaker, className }: Props) {
+ return (
+
+
+
+
+
+ {speaker.name}
+
+ {speaker.title}
+ {speaker.company}
+ {speaker.panel && (
+ {speaker.panel}
+ )}
+
+ );
+}
diff --git a/components/tickets/TicketCard.tsx b/components/tickets/TicketCard.tsx
new file mode 100644
index 0000000..c44fed5
--- /dev/null
+++ b/components/tickets/TicketCard.tsx
@@ -0,0 +1,87 @@
+"use client";
+
+import Link from "next/link";
+import { ArrowRight } from "lucide-react";
+import type { TicketTier } from "@/content/tickets";
+import { site } from "@/content/site";
+import { AddToCalendar } from "@/components/event/AddToCalendar";
+import { RiftCardConnector } from "@/components/brand/RiftFlowLines";
+import { Button } from "@/components/ui/button";
+import { cn } from "@/lib/utils";
+
+type Props = {
+ tier: TicketTier;
+ index: number;
+ featured?: boolean;
+};
+
+export function TicketCard({ tier, index, featured }: Props) {
+ const price =
+ tier.priceLabel ?? (tier.priceUsd === 0 ? "Free" : `$${tier.priceUsd}`);
+
+ return (
+
+
+ {featured && (
+
+ Popular
+
+ )}
+
+ {tier.scheduleLabel ?? site.dates.label}
+
+
{tier.name}
+
+ {tier.description}
+
+
{price}
+
+
+ {tier.soldOut ? (
+ Sold out
+ ) : (
+
+ Get tickets
+
+ )}
+
+
+
+
+
+
+
+
+
+ Included
+
+
+ {tier.features.map((feature) => (
+
+ ✓
+ {feature}
+
+ ))}
+
+
+
+ );
+}
diff --git a/components/ui/accordion.tsx b/components/ui/accordion.tsx
new file mode 100644
index 0000000..91e3a25
--- /dev/null
+++ b/components/ui/accordion.tsx
@@ -0,0 +1,66 @@
+"use client"
+
+import * as React from "react"
+import { ChevronDownIcon } from "lucide-react"
+import { Accordion as AccordionPrimitive } from "radix-ui"
+
+import { cn } from "@/lib/utils"
+
+function Accordion({
+ ...props
+}: React.ComponentProps) {
+ return
+}
+
+function AccordionItem({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+function AccordionTrigger({
+ className,
+ children,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ svg]:rotate-180",
+ className
+ )}
+ {...props}
+ >
+ {children}
+
+
+
+ )
+}
+
+function AccordionContent({
+ className,
+ children,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ {children}
+
+ )
+}
+
+export { Accordion, AccordionItem, AccordionTrigger, AccordionContent }
diff --git a/components/ui/badge.tsx b/components/ui/badge.tsx
new file mode 100644
index 0000000..6eb2a05
--- /dev/null
+++ b/components/ui/badge.tsx
@@ -0,0 +1,48 @@
+import * as React from "react"
+import { cva, type VariantProps } from "class-variance-authority"
+import { Slot } from "radix-ui"
+
+import { cn } from "@/lib/utils"
+
+const badgeVariants = cva(
+ "inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-full border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3",
+ {
+ variants: {
+ variant: {
+ default: "bg-primary text-primary-foreground [a&]:hover:bg-primary/90",
+ secondary:
+ "bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90",
+ destructive:
+ "bg-destructive text-white focus-visible:ring-destructive/20 dark:bg-destructive/60 dark:focus-visible:ring-destructive/40 [a&]:hover:bg-destructive/90",
+ outline:
+ "border-border text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground",
+ ghost: "[a&]:hover:bg-accent [a&]:hover:text-accent-foreground",
+ link: "text-primary underline-offset-4 [a&]:hover:underline",
+ },
+ },
+ defaultVariants: {
+ variant: "default",
+ },
+ }
+)
+
+function Badge({
+ className,
+ variant = "default",
+ asChild = false,
+ ...props
+}: React.ComponentProps<"span"> &
+ VariantProps & { asChild?: boolean }) {
+ const Comp = asChild ? Slot.Root : "span"
+
+ return (
+
+ )
+}
+
+export { Badge, badgeVariants }
diff --git a/components/ui/button.tsx b/components/ui/button.tsx
new file mode 100644
index 0000000..4d38506
--- /dev/null
+++ b/components/ui/button.tsx
@@ -0,0 +1,64 @@
+import * as React from "react"
+import { cva, type VariantProps } from "class-variance-authority"
+import { Slot } from "radix-ui"
+
+import { cn } from "@/lib/utils"
+
+const buttonVariants = cva(
+ "inline-flex shrink-0 items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
+ {
+ variants: {
+ variant: {
+ default: "bg-primary text-primary-foreground hover:bg-primary/90",
+ destructive:
+ "bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:bg-destructive/60 dark:focus-visible:ring-destructive/40",
+ outline:
+ "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",
+ secondary:
+ "bg-secondary text-secondary-foreground hover:bg-secondary/80",
+ ghost:
+ "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
+ link: "text-primary underline-offset-4 hover:underline",
+ },
+ size: {
+ default: "h-9 px-4 py-2 has-[>svg]:px-3",
+ xs: "h-6 gap-1 rounded-md px-2 text-xs has-[>svg]:px-1.5 [&_svg:not([class*='size-'])]:size-3",
+ sm: "h-8 gap-1.5 rounded-md px-3 has-[>svg]:px-2.5",
+ lg: "h-10 rounded-md px-6 has-[>svg]:px-4",
+ icon: "size-9",
+ "icon-xs": "size-6 rounded-md [&_svg:not([class*='size-'])]:size-3",
+ "icon-sm": "size-8",
+ "icon-lg": "size-10",
+ },
+ },
+ defaultVariants: {
+ variant: "default",
+ size: "default",
+ },
+ }
+)
+
+function Button({
+ className,
+ variant = "default",
+ size = "default",
+ asChild = false,
+ ...props
+}: React.ComponentProps<"button"> &
+ VariantProps & {
+ asChild?: boolean
+ }) {
+ const Comp = asChild ? Slot.Root : "button"
+
+ return (
+
+ )
+}
+
+export { Button, buttonVariants }
diff --git a/components/ui/card.tsx b/components/ui/card.tsx
new file mode 100644
index 0000000..acf57dc
--- /dev/null
+++ b/components/ui/card.tsx
@@ -0,0 +1,92 @@
+import * as React from "react"
+
+import { cn } from "@/lib/utils"
+
+function Card({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+
+ )
+}
+
+function CardHeader({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+
+ )
+}
+
+function CardTitle({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+
+ )
+}
+
+function CardDescription({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+
+ )
+}
+
+function CardAction({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+
+ )
+}
+
+function CardContent({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+
+ )
+}
+
+function CardFooter({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+
+ )
+}
+
+export {
+ Card,
+ CardHeader,
+ CardFooter,
+ CardTitle,
+ CardAction,
+ CardDescription,
+ CardContent,
+}
diff --git a/components/ui/carousel.tsx b/components/ui/carousel.tsx
new file mode 100644
index 0000000..0e05a77
--- /dev/null
+++ b/components/ui/carousel.tsx
@@ -0,0 +1,241 @@
+"use client"
+
+import * as React from "react"
+import useEmblaCarousel, {
+ type UseEmblaCarouselType,
+} from "embla-carousel-react"
+import { ArrowLeft, ArrowRight } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+import { Button } from "@/components/ui/button"
+
+type CarouselApi = UseEmblaCarouselType[1]
+type UseCarouselParameters = Parameters
+type CarouselOptions = UseCarouselParameters[0]
+type CarouselPlugin = UseCarouselParameters[1]
+
+type CarouselProps = {
+ opts?: CarouselOptions
+ plugins?: CarouselPlugin
+ orientation?: "horizontal" | "vertical"
+ setApi?: (api: CarouselApi) => void
+}
+
+type CarouselContextProps = {
+ carouselRef: ReturnType[0]
+ api: ReturnType[1]
+ scrollPrev: () => void
+ scrollNext: () => void
+ canScrollPrev: boolean
+ canScrollNext: boolean
+} & CarouselProps
+
+const CarouselContext = React.createContext(null)
+
+function useCarousel() {
+ const context = React.useContext(CarouselContext)
+
+ if (!context) {
+ throw new Error("useCarousel must be used within a ")
+ }
+
+ return context
+}
+
+function Carousel({
+ orientation = "horizontal",
+ opts,
+ setApi,
+ plugins,
+ className,
+ children,
+ ...props
+}: React.ComponentProps<"div"> & CarouselProps) {
+ const [carouselRef, api] = useEmblaCarousel(
+ {
+ ...opts,
+ axis: orientation === "horizontal" ? "x" : "y",
+ },
+ plugins
+ )
+ const [canScrollPrev, setCanScrollPrev] = React.useState(false)
+ const [canScrollNext, setCanScrollNext] = React.useState(false)
+
+ const onSelect = React.useCallback((api: CarouselApi) => {
+ if (!api) return
+ setCanScrollPrev(api.canScrollPrev())
+ setCanScrollNext(api.canScrollNext())
+ }, [])
+
+ const scrollPrev = React.useCallback(() => {
+ api?.scrollPrev()
+ }, [api])
+
+ const scrollNext = React.useCallback(() => {
+ api?.scrollNext()
+ }, [api])
+
+ const handleKeyDown = React.useCallback(
+ (event: React.KeyboardEvent) => {
+ if (event.key === "ArrowLeft") {
+ event.preventDefault()
+ scrollPrev()
+ } else if (event.key === "ArrowRight") {
+ event.preventDefault()
+ scrollNext()
+ }
+ },
+ [scrollPrev, scrollNext]
+ )
+
+ React.useEffect(() => {
+ if (!api || !setApi) return
+ setApi(api)
+ }, [api, setApi])
+
+ React.useEffect(() => {
+ if (!api) return
+ onSelect(api)
+ api.on("reInit", onSelect)
+ api.on("select", onSelect)
+
+ return () => {
+ api?.off("select", onSelect)
+ }
+ }, [api, onSelect])
+
+ return (
+
+
+ {children}
+
+
+ )
+}
+
+function CarouselContent({ className, ...props }: React.ComponentProps<"div">) {
+ const { carouselRef, orientation } = useCarousel()
+
+ return (
+
+ )
+}
+
+function CarouselItem({ className, ...props }: React.ComponentProps<"div">) {
+ const { orientation } = useCarousel()
+
+ return (
+
+ )
+}
+
+function CarouselPrevious({
+ className,
+ variant = "outline",
+ size = "icon",
+ ...props
+}: React.ComponentProps) {
+ const { orientation, scrollPrev, canScrollPrev } = useCarousel()
+
+ return (
+
+
+ Previous slide
+
+ )
+}
+
+function CarouselNext({
+ className,
+ variant = "outline",
+ size = "icon",
+ ...props
+}: React.ComponentProps) {
+ const { orientation, scrollNext, canScrollNext } = useCarousel()
+
+ return (
+
+
+ Next slide
+
+ )
+}
+
+export {
+ type CarouselApi,
+ Carousel,
+ CarouselContent,
+ CarouselItem,
+ CarouselPrevious,
+ CarouselNext,
+}
diff --git a/components/ui/checkbox.tsx b/components/ui/checkbox.tsx
new file mode 100644
index 0000000..f5a7e43
--- /dev/null
+++ b/components/ui/checkbox.tsx
@@ -0,0 +1,32 @@
+"use client"
+
+import * as React from "react"
+import { CheckIcon } from "lucide-react"
+import { Checkbox as CheckboxPrimitive } from "radix-ui"
+
+import { cn } from "@/lib/utils"
+
+function Checkbox({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+
+
+
+
+ )
+}
+
+export { Checkbox }
diff --git a/components/ui/dialog.tsx b/components/ui/dialog.tsx
new file mode 100644
index 0000000..84bdef4
--- /dev/null
+++ b/components/ui/dialog.tsx
@@ -0,0 +1,158 @@
+"use client"
+
+import * as React from "react"
+import { XIcon } from "lucide-react"
+import { Dialog as DialogPrimitive } from "radix-ui"
+
+import { cn } from "@/lib/utils"
+import { Button } from "@/components/ui/button"
+
+function Dialog({
+ ...props
+}: React.ComponentProps) {
+ return
+}
+
+function DialogTrigger({
+ ...props
+}: React.ComponentProps) {
+ return
+}
+
+function DialogPortal({
+ ...props
+}: React.ComponentProps) {
+ return
+}
+
+function DialogClose({
+ ...props
+}: React.ComponentProps) {
+ return
+}
+
+function DialogOverlay({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+function DialogContent({
+ className,
+ children,
+ showCloseButton = true,
+ ...props
+}: React.ComponentProps & {
+ showCloseButton?: boolean
+}) {
+ return (
+
+
+
+ {children}
+ {showCloseButton && (
+
+
+ Close
+
+ )}
+
+
+ )
+}
+
+function DialogHeader({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+
+ )
+}
+
+function DialogFooter({
+ className,
+ showCloseButton = false,
+ children,
+ ...props
+}: React.ComponentProps<"div"> & {
+ showCloseButton?: boolean
+}) {
+ return (
+
+ {children}
+ {showCloseButton && (
+
+ Close
+
+ )}
+
+ )
+}
+
+function DialogTitle({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+function DialogDescription({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+export {
+ Dialog,
+ DialogClose,
+ DialogContent,
+ DialogDescription,
+ DialogFooter,
+ DialogHeader,
+ DialogOverlay,
+ DialogPortal,
+ DialogTitle,
+ DialogTrigger,
+}
diff --git a/components/ui/dropdown-menu.tsx b/components/ui/dropdown-menu.tsx
new file mode 100644
index 0000000..ae1fcf6
--- /dev/null
+++ b/components/ui/dropdown-menu.tsx
@@ -0,0 +1,257 @@
+"use client"
+
+import * as React from "react"
+import { CheckIcon, ChevronRightIcon, CircleIcon } from "lucide-react"
+import { DropdownMenu as DropdownMenuPrimitive } from "radix-ui"
+
+import { cn } from "@/lib/utils"
+
+function DropdownMenu({
+ ...props
+}: React.ComponentProps) {
+ return
+}
+
+function DropdownMenuPortal({
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+function DropdownMenuTrigger({
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+function DropdownMenuContent({
+ className,
+ sideOffset = 4,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+
+
+ )
+}
+
+function DropdownMenuGroup({
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+function DropdownMenuItem({
+ className,
+ inset,
+ variant = "default",
+ ...props
+}: React.ComponentProps & {
+ inset?: boolean
+ variant?: "default" | "destructive"
+}) {
+ return (
+
+ )
+}
+
+function DropdownMenuCheckboxItem({
+ className,
+ children,
+ checked,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+
+
+
+
+
+ {children}
+
+ )
+}
+
+function DropdownMenuRadioGroup({
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+function DropdownMenuRadioItem({
+ className,
+ children,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+
+
+
+
+
+ {children}
+
+ )
+}
+
+function DropdownMenuLabel({
+ className,
+ inset,
+ ...props
+}: React.ComponentProps & {
+ inset?: boolean
+}) {
+ return (
+
+ )
+}
+
+function DropdownMenuSeparator({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+function DropdownMenuShortcut({
+ className,
+ ...props
+}: React.ComponentProps<"span">) {
+ return (
+
+ )
+}
+
+function DropdownMenuSub({
+ ...props
+}: React.ComponentProps) {
+ return
+}
+
+function DropdownMenuSubTrigger({
+ className,
+ inset,
+ children,
+ ...props
+}: React.ComponentProps & {
+ inset?: boolean
+}) {
+ return (
+
+ {children}
+
+
+ )
+}
+
+function DropdownMenuSubContent({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+export {
+ DropdownMenu,
+ DropdownMenuPortal,
+ DropdownMenuTrigger,
+ DropdownMenuContent,
+ DropdownMenuGroup,
+ DropdownMenuLabel,
+ DropdownMenuItem,
+ DropdownMenuCheckboxItem,
+ DropdownMenuRadioGroup,
+ DropdownMenuRadioItem,
+ DropdownMenuSeparator,
+ DropdownMenuShortcut,
+ DropdownMenuSub,
+ DropdownMenuSubTrigger,
+ DropdownMenuSubContent,
+}
diff --git a/components/ui/input.tsx b/components/ui/input.tsx
new file mode 100644
index 0000000..f1124ae
--- /dev/null
+++ b/components/ui/input.tsx
@@ -0,0 +1,21 @@
+import * as React from "react"
+
+import { cn } from "@/lib/utils"
+
+function Input({ className, type, ...props }: React.ComponentProps<"input">) {
+ return (
+
+ )
+}
+
+export { Input }
diff --git a/components/ui/label.tsx b/components/ui/label.tsx
new file mode 100644
index 0000000..1ac80f7
--- /dev/null
+++ b/components/ui/label.tsx
@@ -0,0 +1,24 @@
+"use client"
+
+import * as React from "react"
+import { Label as LabelPrimitive } from "radix-ui"
+
+import { cn } from "@/lib/utils"
+
+function Label({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+export { Label }
diff --git a/components/ui/navigation-menu.tsx b/components/ui/navigation-menu.tsx
new file mode 100644
index 0000000..0a673f5
--- /dev/null
+++ b/components/ui/navigation-menu.tsx
@@ -0,0 +1,168 @@
+import * as React from "react"
+import { cva } from "class-variance-authority"
+import { ChevronDownIcon } from "lucide-react"
+import { NavigationMenu as NavigationMenuPrimitive } from "radix-ui"
+
+import { cn } from "@/lib/utils"
+
+function NavigationMenu({
+ className,
+ children,
+ viewport = true,
+ ...props
+}: React.ComponentProps & {
+ viewport?: boolean
+}) {
+ return (
+
+ {children}
+ {viewport && }
+
+ )
+}
+
+function NavigationMenuList({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+function NavigationMenuItem({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+const navigationMenuTriggerStyle = cva(
+ "group inline-flex h-9 w-max items-center justify-center rounded-md bg-background px-4 py-2 text-sm font-medium transition-[color,box-shadow] outline-none hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 data-[state=open]:bg-accent/50 data-[state=open]:text-accent-foreground data-[state=open]:hover:bg-accent data-[state=open]:focus:bg-accent"
+)
+
+function NavigationMenuTrigger({
+ className,
+ children,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ {children}{" "}
+
+
+ )
+}
+
+function NavigationMenuContent({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+function NavigationMenuViewport({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+
+
+ )
+}
+
+function NavigationMenuLink({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+function NavigationMenuIndicator({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+
+
+ )
+}
+
+export {
+ NavigationMenu,
+ NavigationMenuList,
+ NavigationMenuItem,
+ NavigationMenuContent,
+ NavigationMenuTrigger,
+ NavigationMenuLink,
+ NavigationMenuIndicator,
+ NavigationMenuViewport,
+ navigationMenuTriggerStyle,
+}
diff --git a/components/ui/select.tsx b/components/ui/select.tsx
new file mode 100644
index 0000000..c0dc712
--- /dev/null
+++ b/components/ui/select.tsx
@@ -0,0 +1,190 @@
+"use client"
+
+import * as React from "react"
+import { CheckIcon, ChevronDownIcon, ChevronUpIcon } from "lucide-react"
+import { Select as SelectPrimitive } from "radix-ui"
+
+import { cn } from "@/lib/utils"
+
+function Select({
+ ...props
+}: React.ComponentProps) {
+ return
+}
+
+function SelectGroup({
+ ...props
+}: React.ComponentProps) {
+ return
+}
+
+function SelectValue({
+ ...props
+}: React.ComponentProps) {
+ return
+}
+
+function SelectTrigger({
+ className,
+ size = "default",
+ children,
+ ...props
+}: React.ComponentProps & {
+ size?: "sm" | "default"
+}) {
+ return (
+
+ {children}
+
+
+
+
+ )
+}
+
+function SelectContent({
+ className,
+ children,
+ position = "item-aligned",
+ align = "center",
+ ...props
+}: React.ComponentProps) {
+ return (
+
+
+
+
+ {children}
+
+
+
+
+ )
+}
+
+function SelectLabel({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+function SelectItem({
+ className,
+ children,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+
+
+
+
+
+ {children}
+
+ )
+}
+
+function SelectSeparator({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+function SelectScrollUpButton({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+
+
+ )
+}
+
+function SelectScrollDownButton({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+
+
+ )
+}
+
+export {
+ Select,
+ SelectContent,
+ SelectGroup,
+ SelectItem,
+ SelectLabel,
+ SelectScrollDownButton,
+ SelectScrollUpButton,
+ SelectSeparator,
+ SelectTrigger,
+ SelectValue,
+}
diff --git a/components/ui/separator.tsx b/components/ui/separator.tsx
new file mode 100644
index 0000000..cd873e3
--- /dev/null
+++ b/components/ui/separator.tsx
@@ -0,0 +1,28 @@
+"use client"
+
+import * as React from "react"
+import { Separator as SeparatorPrimitive } from "radix-ui"
+
+import { cn } from "@/lib/utils"
+
+function Separator({
+ className,
+ orientation = "horizontal",
+ decorative = true,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+export { Separator }
diff --git a/components/ui/sheet.tsx b/components/ui/sheet.tsx
new file mode 100644
index 0000000..cb53bb2
--- /dev/null
+++ b/components/ui/sheet.tsx
@@ -0,0 +1,143 @@
+"use client"
+
+import * as React from "react"
+import { XIcon } from "lucide-react"
+import { Dialog as SheetPrimitive } from "radix-ui"
+
+import { cn } from "@/lib/utils"
+
+function Sheet({ ...props }: React.ComponentProps) {
+ return
+}
+
+function SheetTrigger({
+ ...props
+}: React.ComponentProps) {
+ return
+}
+
+function SheetClose({
+ ...props
+}: React.ComponentProps) {
+ return
+}
+
+function SheetPortal({
+ ...props
+}: React.ComponentProps) {
+ return
+}
+
+function SheetOverlay({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+function SheetContent({
+ className,
+ children,
+ side = "right",
+ showCloseButton = true,
+ ...props
+}: React.ComponentProps & {
+ side?: "top" | "right" | "bottom" | "left"
+ showCloseButton?: boolean
+}) {
+ return (
+
+
+
+ {children}
+ {showCloseButton && (
+
+
+ Close
+
+ )}
+
+
+ )
+}
+
+function SheetHeader({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+
+ )
+}
+
+function SheetFooter({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+
+ )
+}
+
+function SheetTitle({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+function SheetDescription({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+export {
+ Sheet,
+ SheetTrigger,
+ SheetClose,
+ SheetContent,
+ SheetHeader,
+ SheetFooter,
+ SheetTitle,
+ SheetDescription,
+}
diff --git a/components/ui/tabs.tsx b/components/ui/tabs.tsx
new file mode 100644
index 0000000..b463afd
--- /dev/null
+++ b/components/ui/tabs.tsx
@@ -0,0 +1,91 @@
+"use client"
+
+import * as React from "react"
+import { cva, type VariantProps } from "class-variance-authority"
+import { Tabs as TabsPrimitive } from "radix-ui"
+
+import { cn } from "@/lib/utils"
+
+function Tabs({
+ className,
+ orientation = "horizontal",
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+const tabsListVariants = cva(
+ "group/tabs-list inline-flex w-fit items-center justify-center rounded-lg p-[3px] text-muted-foreground group-data-[orientation=horizontal]/tabs:h-9 group-data-[orientation=vertical]/tabs:h-fit group-data-[orientation=vertical]/tabs:flex-col data-[variant=line]:rounded-none",
+ {
+ variants: {
+ variant: {
+ default: "bg-muted",
+ line: "gap-1 bg-transparent",
+ },
+ },
+ defaultVariants: {
+ variant: "default",
+ },
+ }
+)
+
+function TabsList({
+ className,
+ variant = "default",
+ ...props
+}: React.ComponentProps &
+ VariantProps) {
+ return (
+
+ )
+}
+
+function TabsTrigger({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+function TabsContent({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+export { Tabs, TabsList, TabsTrigger, TabsContent, tabsListVariants }
diff --git a/components/ui/textarea.tsx b/components/ui/textarea.tsx
new file mode 100644
index 0000000..e67d8fe
--- /dev/null
+++ b/components/ui/textarea.tsx
@@ -0,0 +1,18 @@
+import * as React from "react"
+
+import { cn } from "@/lib/utils"
+
+function Textarea({ className, ...props }: React.ComponentProps<"textarea">) {
+ return (
+
+ )
+}
+
+export { Textarea }
diff --git a/content/attend.ts b/content/attend.ts
new file mode 100644
index 0000000..5831dba
--- /dev/null
+++ b/content/attend.ts
@@ -0,0 +1,57 @@
+import type { LucideIcon } from "lucide-react";
+import { Handshake, Mic2, Store, Ticket } from "lucide-react";
+
+export type AttendPath = {
+ id: string;
+ title: string;
+ description: string;
+ href: string;
+ cta: string;
+ icon: LucideIcon;
+};
+
+export const attendCopy = {
+ eyebrow: "Participate",
+ headline: "Attend the summit",
+ subheadline:
+ "Whether you're joining as an attendee, showcasing on the floor, backing the ecosystem, or pitching for grants — there's a path for you at Skylight Hotel.",
+} as const;
+
+export const attendPaths: AttendPath[] = [
+ {
+ id: "tickets",
+ title: "Get tickets",
+ description:
+ "Summit, VIP, and Cocktail passes for two days of keynotes, workshops, and networking in Addis Ababa.",
+ href: "/payment",
+ cta: "Buy tickets",
+ icon: Ticket,
+ },
+ {
+ id: "exhibit",
+ title: "Exhibit",
+ description:
+ "Reserve booth space in the exhibitor hall and connect with investors, partners, and buyers.",
+ href: "/exhibit",
+ cta: "Reserve a booth",
+ icon: Store,
+ },
+ {
+ id: "partner",
+ title: "Partner & sponsor",
+ description:
+ "Align your brand with EDTF's innovation mission through tiered sponsorship and partnership packages.",
+ href: "/partners",
+ cta: "View partners",
+ icon: Handshake,
+ },
+ {
+ id: "pitch",
+ title: "Pitch for grants",
+ description:
+ "Apply for non-dilutive funding across agriculture, healthcare, and education — 10 companies selected.",
+ href: "/pitch-competition",
+ cta: "Apply to pitch",
+ icon: Mic2,
+ },
+];
diff --git a/content/consent.ts b/content/consent.ts
new file mode 100644
index 0000000..22fb60b
--- /dev/null
+++ b/content/consent.ts
@@ -0,0 +1,9 @@
+/** Shared copy for data-collection consent checkboxes */
+export const dataConsent = {
+ errorMessage: "You must agree to data collection before submitting.",
+ label:
+ "I agree that my personal information may be collected and used by the Ethiopian Diaspora Trust Fund (EDTF) to process my request and communicate about the Great Rift Valley Innovation Summit, in accordance with the",
+ privacyLinkText: "Privacy Policy",
+ paymentLabel:
+ "I agree that my name, email, and payment details may be collected and used by the Ethiopian Diaspora Trust Fund (EDTF) to process my ticket order and send summit-related communications, in accordance with the",
+} as const;
diff --git a/content/exhibit.ts b/content/exhibit.ts
new file mode 100644
index 0000000..7cff4d9
--- /dev/null
+++ b/content/exhibit.ts
@@ -0,0 +1,51 @@
+export const exhibitCopy = {
+ eyebrow: "Exhibit",
+ headline: "Reserve a booth & showcase your products",
+ subheadline:
+ "Acquire exhibition space in the Great Rift Valley Innovation Summit hall. Promote your brand, demo products, and connect with investors, startups, and partners across Ethiopia's innovation ecosystem.",
+};
+
+export const boothPackages = [
+ {
+ id: "standard",
+ name: "Standard booth",
+ size: "3m × 3m",
+ description: "Table, chairs, power outlet, and listing in the exhibitor directory.",
+ highlights: ["Hall placement", "1 company listing", "2 staff badges"],
+ },
+ {
+ id: "corner",
+ name: "Corner booth",
+ size: "3m × 3m (corner)",
+ description: "Higher foot traffic with two open sides for demos and product displays.",
+ highlights: ["Corner visibility", "Enhanced signage", "3 staff badges"],
+ },
+ {
+ id: "premium",
+ name: "Premium booth",
+ size: "6m × 3m",
+ description: "Larger footprint for live demos, screens, and multi-product showcases.",
+ highlights: ["Priority placement", "Program mention", "5 staff badges", "Wi‑Fi add-on"],
+ },
+] as const;
+
+export const boothSizes = [
+ { value: "standard-3x3", label: "Standard — 3m × 3m" },
+ { value: "corner-3x3", label: "Corner — 3m × 3m" },
+ { value: "premium-6x3", label: "Premium — 6m × 3m" },
+ { value: "custom", label: "Custom / not sure yet" },
+] as const;
+
+export const exhibitorSectors = [
+ "Agriculture & food",
+ "Healthcare & life sciences",
+ "Education & edtech",
+ "Technology & software",
+ "Finance & fintech",
+ "Energy & climate",
+ "Government & NGO",
+ "Other",
+] as const;
+
+export const exhibitorConsentLabel =
+ "I agree that the information I provide may be collected and used by the Ethiopian Diaspora Trust Fund to process my booth request and contact me about exhibition opportunities, in line with the summit privacy policy.";
diff --git a/content/faq.ts b/content/faq.ts
new file mode 100644
index 0000000..884d7c3
--- /dev/null
+++ b/content/faq.ts
@@ -0,0 +1,50 @@
+export type FaqItem = {
+ id: string;
+ question: string;
+ answer: string;
+};
+
+export const faqs: FaqItem[] = [
+ {
+ id: "what",
+ question: "What is the Great Rift Valley Innovation Summit?",
+ answer:
+ "A first-of-its-kind event presented by the Ethiopian Diaspora Trust Fund (EDTF) to foster tech-enabled innovation and entrepreneurship in agriculture, healthcare, and education—bringing together investors, companies, startups, and entrepreneurs.",
+ },
+ {
+ id: "when",
+ question: "When and where does the summit take place?",
+ answer:
+ "The inaugural summit was held 31 January – 1 February 2025 at Skylight Hotel, Bole, Addis Ababa, Ethiopia. Future edition dates will be announced on this site.",
+ },
+ {
+ id: "who",
+ question: "Who should attend?",
+ answer:
+ "Entrepreneurs, investors, corporate leaders, policymakers, students, and professionals interested in innovation across agriculture, health, and education in Ethiopia and the broader region.",
+ },
+ {
+ id: "pitch",
+ question: "How does the pitch competition work?",
+ answer:
+ "The Great Rift Valley Pitch Competition awards $XXXK USD in non-dilutive grant funding. Ten companies will be selected from early- and growth-stage ventures driving innovation in Education, Health, and Agriculture. Application details are on the Pitch Competition page.",
+ },
+ {
+ id: "exhibit",
+ question: "How can my company exhibit?",
+ answer:
+ "Visit the Exhibit page to learn about booth options and submit an exhibitor inquiry. Our team will follow up with packages and availability.",
+ },
+ {
+ id: "sponsor",
+ question: "Are sponsorship opportunities available?",
+ answer:
+ "Yes. We offer tiered sponsorship packages for organizations seeking brand visibility and strategic alignment with EDTF's innovation mission. See the Sponsor page or contact partnerships.",
+ },
+ {
+ id: "register",
+ question: "How do I register to attend?",
+ answer:
+ "Registration links will be published when the next edition opens. Use the Register button in the navigation or subscribe to updates via the newsletter form.",
+ },
+];
diff --git a/content/grants.ts b/content/grants.ts
new file mode 100644
index 0000000..c77915e
--- /dev/null
+++ b/content/grants.ts
@@ -0,0 +1,9 @@
+/** Grant figures shown on site — amounts are placeholders until announced */
+export const grantFundingCycle = [
+ { display: "$XXXK", label: "Total grant pool" },
+ { display: "$XXXK", label: "Per sector (Ag · Health · Ed)" },
+ { display: "$XXXK", label: "Per finalist award" },
+ { display: "10", label: "Companies selected", isCount: true },
+] as const;
+
+export const grantFundingDisplay = "$XXXK";
diff --git a/content/inquiries.ts b/content/inquiries.ts
new file mode 100644
index 0000000..60224ba
--- /dev/null
+++ b/content/inquiries.ts
@@ -0,0 +1,26 @@
+export const inquiryChannels = [
+ {
+ id: "sales",
+ label: "Registration & Tickets",
+ email: "info@grvsummit.com",
+ description: "Questions about attending the summit.",
+ },
+ {
+ id: "exhibit",
+ label: "Exhibitor Inquiries",
+ email: "exhibit@grvsummit.com",
+ description: "Booth reservations and exhibitor packages.",
+ },
+ {
+ id: "sponsor",
+ label: "Sponsorship",
+ email: "partnerships@grvsummit.com",
+ description: "Sponsor tiers and partnership opportunities.",
+ },
+ {
+ id: "press",
+ label: "Press & Media",
+ email: "media@grvsummit.com",
+ description: "Media accreditation and press kits.",
+ },
+];
diff --git a/content/legal.ts b/content/legal.ts
new file mode 100644
index 0000000..88007cd
--- /dev/null
+++ b/content/legal.ts
@@ -0,0 +1,28 @@
+export const privacyPolicy = {
+ title: "Privacy Policy",
+ updated: "May 2025",
+ intro:
+ "The Ethiopian Diaspora Trust Fund (EDTF), presenter of the Great Rift Valley Innovation Summit, explains how we collect and use personal information when you use this website, register for the summit, or submit forms.",
+ sections: [
+ {
+ heading: "Information we collect",
+ body: "We may collect your name, email address, phone number, company name, job title, messages you send us, booth or partnership details, startup referral information, newsletter preferences, and ticket order details when you voluntarily submit a form or complete a purchase request.",
+ },
+ {
+ heading: "How we use your information",
+ body: "We use this information to respond to inquiries, process registrations and booth requests, manage partnerships, evaluate pitch and startup referrals, send summit updates you have opted into, and improve our programs. We do not sell your personal information.",
+ },
+ {
+ heading: "Legal basis & consent",
+ body: "Where required, we rely on your consent and our legitimate interest in operating the summit. Forms on this site include a consent checkbox; you may withdraw consent by contacting us, though we may need to retain certain records for legal or operational reasons.",
+ },
+ {
+ heading: "Retention & security",
+ body: "We retain information only as long as needed for the purposes above or as required by law. We apply reasonable technical and organizational measures to protect data, but no online transmission is completely secure.",
+ },
+ {
+ heading: "Contact",
+ body: "For privacy questions or to exercise your rights, email info@grvsummit.com.",
+ },
+ ],
+} as const;
diff --git a/content/page-seo.ts b/content/page-seo.ts
new file mode 100644
index 0000000..f45ddad
--- /dev/null
+++ b/content/page-seo.ts
@@ -0,0 +1,69 @@
+/** Per-route SEO copy — used with createPageMetadata() */
+export const pageSeo = {
+ home: {
+ title: "Great Rift Valley Innovation Summit",
+ description:
+ "Ethiopia's premier innovation summit for agriculture, healthcare, and education. 31 Jan – 01 Feb 2025 at Skylight Hotel, Addis Ababa. Tickets, pitch grants, and partnerships.",
+ path: "/",
+ },
+ program: {
+ title: "Program",
+ description:
+ "Summit agenda: keynotes, panels, workshops, and pitch finals across agriculture, healthcare, and education innovation.",
+ path: "/program",
+ },
+ speakers: {
+ title: "Lineup",
+ description:
+ "Meet speakers and innovators at the Great Rift Valley Innovation Summit in Addis Ababa.",
+ path: "/speakers",
+ },
+ pitch: {
+ title: "Pitch Competition",
+ description:
+ "Apply to pitch at GRV Summit. Grant funding for startups in agriculture, healthcare, and education — 10 companies selected.",
+ path: "/pitch-competition",
+ },
+ partners: {
+ title: "Partners",
+ description:
+ "Sponsors, exhibitors, and partners powering the Great Rift Valley Innovation Summit. Request partnership information.",
+ path: "/partners",
+ },
+ exhibit: {
+ title: "Exhibit",
+ description:
+ "Reserve an exhibitor booth at GRV Summit. Showcase products and connect with investors and ecosystem leaders.",
+ path: "/exhibit",
+ },
+ sponsor: {
+ title: "Sponsor",
+ description:
+ "Sponsor the Great Rift Valley Innovation Summit and align your brand with Ethiopia's innovation ecosystem.",
+ path: "/sponsor",
+ },
+ contact: {
+ title: "Contact",
+ description:
+ "Contact the GRV Summit team for tickets, partnerships, media, and general inquiries.",
+ path: "/contact",
+ },
+ payment: {
+ title: "Tickets",
+ description:
+ "Buy Summit, VIP, or Cocktail Pass tickets for the Great Rift Valley Innovation Summit.",
+ path: "/payment",
+ },
+ paymentSuccess: {
+ title: "Order Confirmed",
+ description: "Your GRV Summit ticket order has been received.",
+ path: "/payment/success",
+ noIndex: true,
+ },
+ privacy: {
+ title: "Privacy Policy",
+ description:
+ "How GRV Summit and the Ethiopian Diaspora Trust Fund collect, use, and protect your personal information.",
+ path: "/privacy",
+ },
+} as const;
diff --git a/content/partners.ts b/content/partners.ts
new file mode 100644
index 0000000..670c14b
--- /dev/null
+++ b/content/partners.ts
@@ -0,0 +1,109 @@
+export type PartnerProfile = {
+ name: string;
+ description: string;
+ logo?: string;
+ url?: string;
+ /** Renders “Your logo here” slot instead of name text */
+ isPlaceholder?: boolean;
+};
+
+export type PartnerSection = {
+ id: string;
+ title: string;
+ tierLabel?: string;
+ partners: PartnerProfile[];
+};
+
+const placeholder = (n: number): PartnerProfile => ({
+ name: `Partner slot ${n}`,
+ description: "Reserved for a summit partner. Contact us to feature your logo and brand story here.",
+ isPlaceholder: true,
+});
+
+const placeholderRow = (count: number) =>
+ Array.from({ length: count }, (_, i) => placeholder(i + 1));
+
+export const partnersIntro = {
+ eyebrow: "Partners 2025",
+ headline: "Meet the organizations that make GRV Summit possible",
+ subheadline:
+ "Partner logos and profiles below are placeholders — your brand could be featured here. Get in touch to secure a slot.",
+};
+
+export const sponsorSections: PartnerSection[] = [
+ {
+ id: "presenting",
+ title: "Our Sponsors",
+ tierLabel: "Presented By",
+ partners: [placeholder(1)],
+ },
+ {
+ id: "lead",
+ title: "Our Sponsors",
+ tierLabel: "Lead Sponsor",
+ partners: placeholderRow(2),
+ },
+ {
+ id: "gold",
+ title: "Our Sponsors",
+ tierLabel: "Gold Sponsor",
+ partners: placeholderRow(3),
+ },
+];
+
+export const exhibitorSections: PartnerSection[] = [
+ {
+ id: "exhibitors",
+ title: "Exhibitors",
+ partners: placeholderRow(4),
+ },
+];
+
+export const supporterSections: PartnerSection[] = [
+ {
+ id: "supporters",
+ title: "Supporters",
+ partners: placeholderRow(3),
+ },
+];
+
+export const mediaPartnerSections: PartnerSection[] = [
+ {
+ id: "media",
+ title: "Media Partners",
+ partners: placeholderRow(2),
+ },
+];
+
+/** @deprecated Use sponsorSections — kept for homepage marquee */
+export const partnerTiers = sponsorSections.map((s) => ({
+ id: s.id,
+ name: s.tierLabel ?? s.title,
+ partners: s.partners,
+}));
+
+export const marqueePartners = [
+ "Your logo here",
+ "Your logo here",
+ "Your logo here",
+ "Your logo here",
+ "Your logo here",
+ "Your logo here",
+];
+
+export const partnershipCta = {
+ eyebrow: "Join them!",
+ headline: "Let's get your brand in front of Ethiopia's top innovators.",
+ subheadline:
+ "Request partnership information and connect with investors, founders, and leaders across agriculture, healthcare, and education.",
+};
+
+export const championStartupCopy = {
+ title: "Champion a startup",
+ intro:
+ "Know a venture that deserves a spot at GRV Summit or in our pitch pipeline? Recommend them here.",
+ disclaimer:
+ "Not every recommendation will be selected for programming or grants. This channel exists so we can also consider founders who may not reach us directly or feel hesitant to apply on their own.",
+ consentLabel:
+ "I agree that my information and the startup details I provide may be collected and used by the Ethiopian Diaspora Trust Fund to evaluate partnership and programming opportunities, in line with the summit privacy policy.",
+};
diff --git a/content/people.ts b/content/people.ts
new file mode 100644
index 0000000..d2e72f8
--- /dev/null
+++ b/content/people.ts
@@ -0,0 +1,180 @@
+export type SpeakerGroup = "panelists" | "keynotes" | "judges" | "opening";
+
+export type Person = {
+ id: string;
+ name: string;
+ title: string;
+ company: string;
+ image: string;
+ group: SpeakerGroup;
+ panel?: string;
+};
+
+export const speakers: Person[] = [
+ {
+ id: "sarma",
+ name: "Sarma Velamuri",
+ title: "Founder and CEO",
+ company: "Luminare Media Quality Improvement",
+ image: "/branding/speakers/sarma.png",
+ group: "panelists",
+ panel: "Unpacking Investment Barriers",
+ },
+ {
+ id: "solomon",
+ name: "Solomon Gizaw",
+ title: "Captain and Managing Director",
+ company: "Abyssinian Flight Services & Aviation Academy",
+ image: "/branding/speakers/solomon.png",
+ group: "panelists",
+ panel: "Unpacking Investment Barriers",
+ },
+ {
+ id: "sunil-panel",
+ name: "Sunil Sharma",
+ title: "Venture Capital Investor and Managing Director",
+ company: "Techstars Toronto Accelerator",
+ image: "/branding/speakers/sunil.png",
+ group: "panelists",
+ panel: "Unpacking Investment Barriers",
+ },
+ {
+ id: "tewabech",
+ name: "Tewabech Molla",
+ title: "Chief Representative",
+ company: "Dubai Chamber International",
+ image: "/branding/speakers/tewabech.png",
+ group: "panelists",
+ panel: "Unpacking Investment Barriers",
+ },
+ {
+ id: "beamlak",
+ name: "Beamlak Alemayehu",
+ title: "CEO",
+ company: "Medanit Medical Directory",
+ image: "/branding/speakers/beamlak.png",
+ group: "panelists",
+ panel: "Why Startups Disappear in Ethiopia",
+ },
+ {
+ id: "abrhame",
+ name: "Abrhame Endrias",
+ title: "Founder & Managing Director",
+ company: "Lersha",
+ image: "/branding/speakers/abrhame.png",
+ group: "panelists",
+ panel: "Why Startups Disappear in Ethiopia",
+ },
+ {
+ id: "mekdim",
+ name: "Mekdim Gullilat",
+ title: "Country Manager",
+ company: "Reach for Change",
+ image: "/branding/speakers/mekdim.png",
+ group: "panelists",
+ panel: "Why Startups Disappear in Ethiopia",
+ },
+ {
+ id: "brook",
+ name: "Brook Taye",
+ title: "CEO",
+ company: "Ethiopian Investment Holdings",
+ image: "/branding/speakers/brook.png",
+ group: "keynotes",
+ },
+ {
+ id: "yared",
+ name: "Yared Endale",
+ title: "Country Manager",
+ company: "VISA",
+ image: "/branding/speakers/yared.png",
+ group: "keynotes",
+ },
+ {
+ id: "biruh",
+ name: "Dr. Biruh Workeneh",
+ title: "Board Member",
+ company: "EDTF",
+ image: "/branding/speakers/biruh.png",
+ group: "keynotes",
+ },
+ {
+ id: "abraham",
+ name: "Abraham Asrat",
+ title: "Country Manager",
+ company: "EDTF",
+ image: "/branding/speakers/abraham.png",
+ group: "keynotes",
+ },
+ {
+ id: "sunil-judge",
+ name: "Sunil Sharma",
+ title: "Managing Director",
+ company: "Techstars Toronto Accelerator",
+ image: "/branding/speakers/sunil.png",
+ group: "judges",
+ },
+ {
+ id: "amity",
+ name: "Amity Weiss",
+ title: "Senior Partner",
+ company: "Melala Partners",
+ image: "/branding/speakers/amity.png",
+ group: "judges",
+ },
+ {
+ id: "tigist",
+ name: "Tigist Araya",
+ title: "CEO / Co-Founder",
+ company: "Araya Ventures",
+ image: "/branding/speakers/tigist.png",
+ group: "judges",
+ },
+ {
+ id: "adam",
+ name: "Adam Abate",
+ title: "CEO / Co-Founder",
+ company: "RENEW Capital",
+ image: "/branding/speakers/adam.png",
+ group: "judges",
+ },
+ {
+ id: "lulite",
+ name: "Lulite Ejigu",
+ title: "Chair",
+ company: "EDTF",
+ image: "/branding/speakers/lulite.png",
+ group: "opening",
+ },
+ {
+ id: "dagmawit",
+ name: "Dagmawit Shiferaw",
+ title: "Director",
+ company: "Innovative Finance Lab",
+ image: "/branding/speakers/dagmawit.png",
+ group: "opening",
+ },
+ {
+ id: "samiya",
+ name: "Samiya Abdulkadir",
+ title: "President",
+ company: "EYEA",
+ image: "/branding/speakers/samiya.png",
+ group: "opening",
+ },
+];
+
+export const speakerGroupLabels: Record = {
+ keynotes: "Keynote Speakers",
+ panelists: "Panelists",
+ judges: "Pitch Judges",
+ opening: "Opening Remarks & Fireside",
+};
+
+/** Display order on lineup (Hatch-style: keynotes first) */
+export const speakerGroupOrder: SpeakerGroup[] = [
+ "keynotes",
+ "panelists",
+ "judges",
+ "opening",
+];
diff --git a/content/pitch.ts b/content/pitch.ts
new file mode 100644
index 0000000..767261c
--- /dev/null
+++ b/content/pitch.ts
@@ -0,0 +1,19 @@
+export const pitchCompetition = {
+ headline: "Non-dilutive grant funding up to $XXXK",
+ subheadline: "10 companies will be selected across Education, Health, and Agriculture",
+ description:
+ "The Great Rift Valley Pitch Competition supports early- and growth-stage ventures tackling Ethiopia's most pressing challenges in three critical sectors. Grants are non-dilutive—founders retain full ownership.",
+ criteria: [
+ "Innovation addressing Agriculture, Health, or Education",
+ "Demonstrable impact potential in Ethiopia",
+ "Scalable business model with clear traction or pathway",
+ "Strong founding team and execution capability",
+ "Alignment with EDTF mission and summit values",
+ ],
+ timeline: [
+ { phase: "Applications open", date: "TBA" },
+ { phase: "Shortlist announced", date: "TBA" },
+ { phase: "Final pitch day", date: "Summit Day 2" },
+ { phase: "Grant recipients announced", date: "At summit" },
+ ],
+};
diff --git a/content/program.ts b/content/program.ts
new file mode 100644
index 0000000..8bcccbb
--- /dev/null
+++ b/content/program.ts
@@ -0,0 +1,61 @@
+export type ProgramDay = {
+ id: string;
+ date: string;
+ title: string;
+ description: string;
+ highlights: string[];
+ image?: string;
+};
+
+export const programDays: ProgramDay[] = [
+ {
+ id: "day-1",
+ date: "31 Jan 2025",
+ title: "Workshops & Panel Discussions",
+ description:
+ "Curated sessions offering valuable insights for innovators and professionals at every career stage—from newcomers to seasoned executives.",
+ highlights: [
+ "Unpacking Investment Barriers",
+ "Why Startups Disappear in Ethiopia",
+ "Sector deep-dives in Ag, Health, and Education",
+ ],
+ image: "/branding/booth-mockup.png",
+ },
+ {
+ id: "day-2",
+ date: "01 Feb 2025",
+ title: "Exhibition & Pitch Finals",
+ description:
+ "Connect with investors, companies, and startups in the exhibitor hall. Watch finalists compete for Africa's largest non-dilutive grant pool.",
+ highlights: [
+ "Exhibitor hall networking",
+ "Great Rift Valley Pitch Competition finals",
+ "Keynotes and reflections",
+ ],
+ image: "/branding/booth-mockup.png",
+ },
+];
+
+export const experiences = [
+ {
+ id: "workshops",
+ title: "Workshops & Panels",
+ description:
+ "Hands-on learning and expert panels across agriculture, healthcare, and education innovation.",
+ href: "/program",
+ },
+ {
+ id: "exhibition",
+ title: "Exhibitor Hall",
+ description:
+ "Connect companies and startups with emerging talent in Ethiopia's innovation ecosystem.",
+ href: "/exhibit",
+ },
+ {
+ id: "pitch",
+ title: "Pitch Competition",
+ description:
+ "$XXXK in non-dilutive grants — 10 companies will be selected from the most impactful early- and growth-stage ventures.",
+ href: "/pitch-competition",
+ },
+];
diff --git a/content/site.ts b/content/site.ts
new file mode 100644
index 0000000..8eb9f99
--- /dev/null
+++ b/content/site.ts
@@ -0,0 +1,31 @@
+export const site = {
+ name: "Great Rift Valley Innovation Summit",
+ shortName: "GRV Summit",
+ tagline:
+ "Ethiopia's premier gathering for tech-enabled innovation in agriculture, healthcare, and education.",
+ presentedBy: "Ethiopian Diaspora Trust Fund (EDTF)",
+ dates: {
+ label: "31 Jan – 01 Feb 2025",
+ start: "2025-01-31",
+ end: "2025-02-01",
+ },
+ venue: {
+ name: "Skylight Hotel",
+ address: "Bole, Addis Ababa, Ethiopia",
+ mapsUrl: "https://maps.google.com/?q=Skylight+Hotel+Addis+Ababa",
+ lat: 8.9806,
+ lng: 38.7578,
+ },
+ links: {
+ ticketsUrl: "/payment",
+ pitchApplyUrl: "/pitch-competition",
+ legacySite: "https://grvsummit.com/",
+ calendarIcs: "/calendar",
+ },
+ stats: [
+ { type: "static", value: "500+", label: "Attendees" },
+ { type: "cycling", label: "Grant funding" },
+ { type: "static", value: "10", label: "Companies selected" },
+ { type: "static", value: "3", label: "Innovation sectors" },
+ ],
+} as const;
diff --git a/content/tickets.ts b/content/tickets.ts
new file mode 100644
index 0000000..1940c97
--- /dev/null
+++ b/content/tickets.ts
@@ -0,0 +1,59 @@
+export type TicketTier = {
+ id: string;
+ name: string;
+ description: string;
+ priceUsd: number;
+ priceLabel?: string;
+ /** e.g. "Day 2 — 01 Feb" for single-day passes */
+ scheduleLabel?: string;
+ features: string[];
+ soldOut?: boolean;
+};
+
+export const ticketTiers: TicketTier[] = [
+ {
+ id: "summit-pass",
+ name: "Summit Pass",
+ description: "Full access to both days including workshops, panels, exhibitor hall, and pitch finals.",
+ priceUsd: 150,
+ features: [
+ "2-day summit access",
+ "Workshops & panel discussions",
+ "Exhibitor hall networking",
+ "Pitch competition attendance",
+ ],
+ },
+ {
+ id: "vip-pass",
+ name: "VIP Pass",
+ description: "Premium access with reserved seating and exclusive networking sessions.",
+ priceUsd: 350,
+ features: [
+ "Everything in Summit Pass",
+ "Reserved seating",
+ "VIP networking reception",
+ "Priority check-in",
+ ],
+ },
+ {
+ id: "cocktail-pass",
+ name: "Cocktail Pass",
+ scheduleLabel: "Day 2 — 01 Feb 2025",
+ description:
+ "Join the summit cocktail reception and evening networking on the second day at Skylight Hotel.",
+ priceUsd: 75,
+ features: [
+ "Day 2 evening cocktail reception",
+ "Networking with investors & founders",
+ "Light bites & refreshments",
+ "Summit program guide",
+ ],
+ },
+];
+
+export const paymentMethods = [
+ { id: "card", label: "Credit / Debit Card", description: "Visa, Mastercard, AMEX" },
+ { id: "bank", label: "Bank Transfer", description: "Pay by invoice (ETB or USD)" },
+] as const;
+
+export type PaymentMethodId = (typeof paymentMethods)[number]["id"];
diff --git a/content/tracks.ts b/content/tracks.ts
new file mode 100644
index 0000000..26d3f25
--- /dev/null
+++ b/content/tracks.ts
@@ -0,0 +1,40 @@
+export const pillars = [
+ {
+ id: "agriculture",
+ title: "Agriculture",
+ description:
+ "Tech-enabled solutions transforming Ethiopia's agricultural productivity, supply chains, and rural livelihoods.",
+ },
+ {
+ id: "health",
+ title: "Healthcare",
+ description:
+ "Innovations improving access, quality, and outcomes across Ethiopia's health systems and communities.",
+ },
+ {
+ id: "education",
+ title: "Education",
+ description:
+ "Ventures expanding learning opportunities and workforce readiness through technology and new models.",
+ },
+];
+
+export const topicChips = [
+ "Agriculture",
+ "Healthcare",
+ "Education",
+ "Venture Capital",
+ "Grant Funding",
+ "Startup Growth",
+ "Diaspora Investment",
+ "Innovation Policy",
+ "Exhibitors",
+ "Pitch Competition",
+ "Workshops",
+ "Networking",
+ "Impact Investing",
+ "Entrepreneurship",
+ "EdTech",
+ "AgriTech",
+ "HealthTech",
+];
diff --git a/eslint.config.mjs b/eslint.config.mjs
new file mode 100644
index 0000000..bbd17c7
--- /dev/null
+++ b/eslint.config.mjs
@@ -0,0 +1,14 @@
+import { dirname } from "path";
+import { fileURLToPath } from "url";
+import { FlatCompat } from "@eslint/eslintrc";
+
+const __filename = fileURLToPath(import.meta.url);
+const __dirname = dirname(__filename);
+
+const compat = new FlatCompat({
+ baseDirectory: __dirname,
+});
+
+const eslintConfig = [...compat.extends("next/core-web-vitals", "next/typescript")];
+
+export default eslintConfig;
diff --git a/lib/calendar.ts b/lib/calendar.ts
new file mode 100644
index 0000000..8246e49
--- /dev/null
+++ b/lib/calendar.ts
@@ -0,0 +1,57 @@
+import { site } from "@/content/site";
+
+/** Event times in Addis Ababa (EAT, UTC+3) */
+const EVENT_START = "20250131T080000";
+const EVENT_END = "20250201T180000";
+
+function formatIcsDate(iso: string) {
+ return iso.replace(/[-:]/g, "").split(".")[0] + "Z";
+}
+
+export function buildGoogleCalendarUrl() {
+ const params = new URLSearchParams({
+ action: "TEMPLATE",
+ text: site.name,
+ dates: `${EVENT_START}/${EVENT_END}`,
+ details: `${site.tagline}\n\nPresented by ${site.presentedBy}.\n${site.links.legacySite}`,
+ location: `${site.venue.name}, ${site.venue.address}`,
+ ctz: "Africa/Addis_Ababa",
+ });
+ return `https://calendar.google.com/calendar/render?${params.toString()}`;
+}
+
+export function buildOutlookCalendarUrl() {
+ const params = new URLSearchParams({
+ path: "/calendar/action/compose",
+ rru: "addevent",
+ subject: site.name,
+ startdt: "2025-01-31T08:00:00",
+ enddt: "2025-02-01T18:00:00",
+ body: site.tagline,
+ location: `${site.venue.name}, ${site.venue.address}`,
+ });
+ return `https://outlook.live.com/calendar/0/deeplink/compose?${params.toString()}`;
+}
+
+export function buildIcsFileContent() {
+ const uid = `grv-summit-${site.dates.start}@grvsummit.com`;
+ const now = formatIcsDate(new Date().toISOString());
+
+ return [
+ "BEGIN:VCALENDAR",
+ "VERSION:2.0",
+ "PRODID:-//GRV Summit//EN",
+ "CALSCALE:GREGORIAN",
+ "METHOD:PUBLISH",
+ "BEGIN:VEVENT",
+ `UID:${uid}`,
+ `DTSTAMP:${now}`,
+ `DTSTART;TZID=Africa/Addis_Ababa:20250131T080000`,
+ `DTEND;TZID=Africa/Addis_Ababa:20250201T180000`,
+ `SUMMARY:${site.name}`,
+ `DESCRIPTION:${site.tagline.replace(/\n/g, "\\n")}`,
+ `LOCATION:${site.venue.name}, ${site.venue.address}`,
+ "END:VEVENT",
+ "END:VCALENDAR",
+ ].join("\r\n");
+}
diff --git a/lib/inquiry.ts b/lib/inquiry.ts
new file mode 100644
index 0000000..4103fd7
--- /dev/null
+++ b/lib/inquiry.ts
@@ -0,0 +1,275 @@
+export const inquiryIntents = [
+ "general",
+ "exhibitor",
+ "sponsor",
+ "partnership",
+ "startup_referral",
+ "sales",
+ "press",
+ "newsletter",
+] as const;
+
+export type InquiryIntent = (typeof inquiryIntents)[number];
+
+export type InquiryPayload = {
+ intent: InquiryIntent;
+ name: string;
+ email: string;
+ company?: string;
+ message: string;
+ phone?: string;
+ firstName?: string;
+ lastName?: string;
+ consent: boolean;
+ startupName?: string;
+ startupWebsite?: string;
+ startupSector?: string;
+ whyRecommend?: string;
+ jobTitle?: string;
+ companyWebsite?: string;
+ companyDescription?: string;
+ sector?: string;
+ productsToAdvertise?: string;
+ boothSize?: string;
+ powerRequired?: boolean;
+ internetRequired?: boolean;
+ staffCount?: string;
+ marketingMaterials?: string;
+ specialRequirements?: string;
+};
+
+function parseEmail(email: unknown) {
+ return typeof email === "string" ? email.trim() : "";
+}
+
+function requireConsent(consent: unknown): boolean {
+ return consent === true;
+}
+
+export function validateInquiry(
+ body: unknown
+): { ok: true; data: InquiryPayload } | { ok: false; error: string } {
+ if (!body || typeof body !== "object") {
+ return { ok: false, error: "Invalid request body" };
+ }
+
+ const b = body as Record;
+ const intent = b.intent as InquiryIntent;
+
+ if (!inquiryIntents.includes(intent)) {
+ return { ok: false, error: "Invalid intent" };
+ }
+
+ const email = parseEmail(b.email);
+ if (!email || !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
+ return { ok: false, error: "Valid email is required" };
+ }
+
+ if (intent === "partnership") {
+ const firstName = typeof b.firstName === "string" ? b.firstName.trim() : "";
+ const lastName = typeof b.lastName === "string" ? b.lastName.trim() : "";
+ const company = typeof b.company === "string" ? b.company.trim() : "";
+
+ if (!firstName || firstName.length < 2) {
+ return { ok: false, error: "First name is required" };
+ }
+ if (!lastName || lastName.length < 2) {
+ return { ok: false, error: "Last name is required" };
+ }
+ if (!company) {
+ return { ok: false, error: "Company name is required" };
+ }
+ if (!requireConsent(b.consent)) {
+ return { ok: false, error: "You must agree to data collection to submit" };
+ }
+
+ return {
+ ok: true,
+ data: {
+ intent,
+ firstName,
+ lastName,
+ name: `${firstName} ${lastName}`,
+ email,
+ company,
+ message:
+ typeof b.message === "string" && b.message.trim()
+ ? b.message.trim()
+ : "Partnership information request",
+ consent: true,
+ },
+ };
+ }
+
+ if (intent === "exhibitor") {
+ const firstName = typeof b.firstName === "string" ? b.firstName.trim() : "";
+ const lastName = typeof b.lastName === "string" ? b.lastName.trim() : "";
+ const company = typeof b.company === "string" ? b.company.trim() : "";
+ const phone = typeof b.phone === "string" ? b.phone.trim() : "";
+ const jobTitle = typeof b.jobTitle === "string" ? b.jobTitle.trim() : "";
+ const companyDescription =
+ typeof b.companyDescription === "string" ? b.companyDescription.trim() : "";
+ const productsToAdvertise =
+ typeof b.productsToAdvertise === "string" ? b.productsToAdvertise.trim() : "";
+ const boothSize = typeof b.boothSize === "string" ? b.boothSize.trim() : "";
+ const sector = typeof b.sector === "string" ? b.sector.trim() : "";
+ const message = typeof b.message === "string" ? b.message.trim() : "";
+
+ if (!firstName || firstName.length < 2) {
+ return { ok: false, error: "First name is required" };
+ }
+ if (!lastName || lastName.length < 2) {
+ return { ok: false, error: "Last name is required" };
+ }
+ if (!company) {
+ return { ok: false, error: "Company name is required" };
+ }
+ if (!phone) {
+ return { ok: false, error: "Phone number is required" };
+ }
+ if (!jobTitle) {
+ return { ok: false, error: "Job title is required" };
+ }
+ if (!sector) {
+ return { ok: false, error: "Industry / sector is required" };
+ }
+ if (!companyDescription || companyDescription.length < 20) {
+ return { ok: false, error: "Please describe your company (at least 20 characters)" };
+ }
+ if (!productsToAdvertise || productsToAdvertise.length < 20) {
+ return {
+ ok: false,
+ error: "Please describe the products you plan to advertise (at least 20 characters)",
+ };
+ }
+ if (!boothSize) {
+ return { ok: false, error: "Preferred booth size is required" };
+ }
+ if (!message || message.length < 10) {
+ return { ok: false, error: "Please describe your booth goals (at least 10 characters)" };
+ }
+ if (!requireConsent(b.consent)) {
+ return { ok: false, error: "You must agree to data collection to submit" };
+ }
+
+ return {
+ ok: true,
+ data: {
+ intent,
+ firstName,
+ lastName,
+ name: `${firstName} ${lastName}`,
+ email,
+ phone,
+ jobTitle,
+ company,
+ companyWebsite:
+ typeof b.companyWebsite === "string" ? b.companyWebsite.trim() : undefined,
+ companyDescription,
+ sector,
+ productsToAdvertise,
+ boothSize,
+ powerRequired: b.powerRequired === true,
+ internetRequired: b.internetRequired === true,
+ staffCount: typeof b.staffCount === "string" ? b.staffCount.trim() : undefined,
+ marketingMaterials:
+ typeof b.marketingMaterials === "string" ? b.marketingMaterials.trim() : undefined,
+ specialRequirements:
+ typeof b.specialRequirements === "string" ? b.specialRequirements.trim() : undefined,
+ message,
+ consent: true,
+ },
+ };
+ }
+
+ if (intent === "startup_referral") {
+ const name = typeof b.name === "string" ? b.name.trim() : "";
+ const startupName = typeof b.startupName === "string" ? b.startupName.trim() : "";
+ const whyRecommend = typeof b.whyRecommend === "string" ? b.whyRecommend.trim() : "";
+
+ if (!name || name.length < 2) {
+ return { ok: false, error: "Your name is required" };
+ }
+ if (!startupName) {
+ return { ok: false, error: "Startup name is required" };
+ }
+ if (!whyRecommend || whyRecommend.length < 20) {
+ return { ok: false, error: "Please tell us why you recommend this startup (at least 20 characters)" };
+ }
+ if (!requireConsent(b.consent)) {
+ return { ok: false, error: "You must agree to data collection to submit" };
+ }
+
+ return {
+ ok: true,
+ data: {
+ intent,
+ name,
+ email,
+ startupName,
+ startupWebsite:
+ typeof b.startupWebsite === "string" ? b.startupWebsite.trim() : undefined,
+ startupSector:
+ typeof b.startupSector === "string" ? b.startupSector.trim() : undefined,
+ whyRecommend,
+ message: whyRecommend,
+ consent: true,
+ },
+ };
+ }
+
+ if (!requireConsent(b.consent)) {
+ return { ok: false, error: "You must agree to data collection to submit" };
+ }
+
+ if (intent === "newsletter") {
+ const firstName = typeof b.firstName === "string" ? b.firstName.trim() : "";
+ const lastName = typeof b.lastName === "string" ? b.lastName.trim() : "";
+ const nameFromFields = `${firstName} ${lastName}`.trim();
+ const name = nameFromFields || (typeof b.name === "string" ? b.name.trim() : "");
+
+ if (!firstName || firstName.length < 2) {
+ return { ok: false, error: "First name is required" };
+ }
+ if (!lastName || lastName.length < 2) {
+ return { ok: false, error: "Last name is required" };
+ }
+
+ return {
+ ok: true,
+ data: {
+ intent,
+ firstName,
+ lastName,
+ name,
+ email,
+ message: "Newsletter signup",
+ consent: true,
+ },
+ };
+ }
+
+ const name = typeof b.name === "string" ? b.name.trim() : "";
+ const message = typeof b.message === "string" ? b.message.trim() : "";
+
+ if (!name || name.length < 2) {
+ return { ok: false, error: "Name is required" };
+ }
+
+ if (!message || message.length < 10) {
+ return { ok: false, error: "Message must be at least 10 characters" };
+ }
+
+ return {
+ ok: true,
+ data: {
+ intent,
+ name,
+ email,
+ message,
+ company: typeof b.company === "string" ? b.company.trim() : undefined,
+ phone: typeof b.phone === "string" ? b.phone.trim() : undefined,
+ consent: true,
+ },
+ };
+}
diff --git a/lib/payment.ts b/lib/payment.ts
new file mode 100644
index 0000000..23c0a27
--- /dev/null
+++ b/lib/payment.ts
@@ -0,0 +1,65 @@
+import { ticketTiers, type PaymentMethodId } from "@/content/tickets";
+
+export type PaymentPayload = {
+ ticketId: string;
+ quantity: number;
+ name: string;
+ email: string;
+ company?: string;
+ phone?: string;
+ paymentMethod: PaymentMethodId;
+ consent: boolean;
+};
+
+export function validatePayment(body: unknown): { ok: true; data: PaymentPayload } | { ok: false; error: string } {
+ if (!body || typeof body !== "object") {
+ return { ok: false, error: "Invalid request body" };
+ }
+
+ const b = body as Record;
+ const ticketId = typeof b.ticketId === "string" ? b.ticketId : "";
+ const quantity = typeof b.quantity === "number" ? b.quantity : Number(b.quantity);
+ const name = typeof b.name === "string" ? b.name.trim() : "";
+ const email = typeof b.email === "string" ? b.email.trim() : "";
+ const paymentMethod = b.paymentMethod as PaymentMethodId;
+
+ const tier = ticketTiers.find((t) => t.id === ticketId);
+ if (!tier || tier.soldOut) {
+ return { ok: false, error: "Invalid or unavailable ticket" };
+ }
+ if (!Number.isInteger(quantity) || quantity < 1 || quantity > 10) {
+ return { ok: false, error: "Quantity must be between 1 and 10" };
+ }
+ if (!name || name.length < 2) {
+ return { ok: false, error: "Name is required" };
+ }
+ if (!email || !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
+ return { ok: false, error: "Valid email is required" };
+ }
+ if (paymentMethod !== "card" && paymentMethod !== "bank") {
+ return { ok: false, error: "Invalid payment method" };
+ }
+ if (b.consent !== true) {
+ return { ok: false, error: "You must agree to data collection to complete your order" };
+ }
+
+ return {
+ ok: true,
+ data: {
+ ticketId,
+ quantity,
+ name,
+ email,
+ paymentMethod,
+ company: typeof b.company === "string" ? b.company.trim() : undefined,
+ phone: typeof b.phone === "string" ? b.phone.trim() : undefined,
+ consent: true,
+ },
+ };
+}
+
+export function calculateTotal(ticketId: string, quantity: number) {
+ const tier = ticketTiers.find((t) => t.id === ticketId);
+ if (!tier) return 0;
+ return tier.priceUsd * quantity;
+}
diff --git a/lib/seo.ts b/lib/seo.ts
new file mode 100644
index 0000000..a20e1f3
--- /dev/null
+++ b/lib/seo.ts
@@ -0,0 +1,101 @@
+import type { Metadata } from "next";
+import { site } from "@/content/site";
+
+export const SITE_URL =
+ process.env.NEXT_PUBLIC_SITE_URL?.replace(/\/$/, "") || "https://grvsummit.com";
+
+export const defaultKeywords = [
+ "Great Rift Valley Innovation Summit",
+ "GRV Summit",
+ "Ethiopia innovation",
+ "Addis Ababa conference",
+ "EDTF",
+ "startup pitch Ethiopia",
+ "agriculture health education innovation",
+ "Skylight Hotel summit",
+];
+
+export const staticRoutes = [
+ { path: "/", priority: 1, changeFrequency: "weekly" as const },
+ { path: "/program", priority: 0.9, changeFrequency: "weekly" as const },
+ { path: "/speakers", priority: 0.9, changeFrequency: "weekly" as const },
+ { path: "/pitch-competition", priority: 0.9, changeFrequency: "weekly" as const },
+ { path: "/partners", priority: 0.85, changeFrequency: "monthly" as const },
+ { path: "/exhibit", priority: 0.85, changeFrequency: "monthly" as const },
+ { path: "/sponsor", priority: 0.85, changeFrequency: "monthly" as const },
+ { path: "/payment", priority: 0.8, changeFrequency: "weekly" as const },
+ { path: "/contact", priority: 0.75, changeFrequency: "monthly" as const },
+ { path: "/privacy", priority: 0.3, changeFrequency: "yearly" as const },
+];
+
+type PageMetaInput = {
+ title: string;
+ description: string;
+ path?: string;
+ keywords?: string[];
+ noIndex?: boolean;
+ ogImage?: string;
+};
+
+export function absoluteUrl(path = ""): string {
+ const normalized = path.startsWith("/") ? path : path ? `/${path}` : "";
+ return `${SITE_URL}${normalized}`;
+}
+
+export function createPageMetadata({
+ title,
+ description,
+ path = "",
+ keywords = [],
+ noIndex = false,
+ ogImage = "/branding/logo.png",
+}: PageMetaInput): Metadata {
+ const url = absoluteUrl(path);
+ const fullTitle = title === site.name ? title : title;
+ const ogTitle = title.includes(site.shortName) ? title : `${title} | ${site.shortName}`;
+
+ return {
+ title: fullTitle,
+ description,
+ keywords: [...defaultKeywords, ...keywords],
+ alternates: { canonical: url },
+ robots: noIndex
+ ? { index: false, follow: false }
+ : { index: true, follow: true, googleBot: { index: true, follow: true } },
+ openGraph: {
+ type: "website",
+ locale: "en_US",
+ url,
+ siteName: site.name,
+ title: ogTitle,
+ description,
+ images: [
+ {
+ url: ogImage,
+ width: 1200,
+ height: 630,
+ alt: site.name,
+ },
+ ],
+ },
+ twitter: {
+ card: "summary_large_image",
+ title: ogTitle,
+ description,
+ images: [ogImage],
+ },
+ };
+}
+
+export const rootMetadata: Metadata = {
+ metadataBase: new URL(SITE_URL),
+ ...createPageMetadata({
+ title: site.name,
+ description: `${site.tagline} ${site.dates.label} at ${site.venue.name}, ${site.venue.address}. Presented by ${site.presentedBy}.`,
+ path: "/",
+ }),
+ title: {
+ default: site.name,
+ template: `%s | ${site.shortName}`,
+ },
+};
diff --git a/lib/utils.ts b/lib/utils.ts
new file mode 100644
index 0000000..a5ef193
--- /dev/null
+++ b/lib/utils.ts
@@ -0,0 +1,6 @@
+import { clsx, type ClassValue } from "clsx";
+import { twMerge } from "tailwind-merge";
+
+export function cn(...inputs: ClassValue[]) {
+ return twMerge(clsx(inputs));
+}
diff --git a/next.config.ts b/next.config.ts
new file mode 100644
index 0000000..cb651cd
--- /dev/null
+++ b/next.config.ts
@@ -0,0 +1,5 @@
+import type { NextConfig } from "next";
+
+const nextConfig: NextConfig = {};
+
+export default nextConfig;
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..f6c1a8f
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,8412 @@
+{
+ "name": "grv-summit",
+ "version": "0.1.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "grv-summit",
+ "version": "0.1.0",
+ "dependencies": {
+ "@radix-ui/react-accordion": "^1.2.11",
+ "@radix-ui/react-dialog": "^1.1.14",
+ "@radix-ui/react-label": "^2.1.7",
+ "@radix-ui/react-navigation-menu": "^1.2.13",
+ "@radix-ui/react-select": "^2.2.5",
+ "@radix-ui/react-separator": "^1.1.7",
+ "@radix-ui/react-slot": "^1.2.3",
+ "@radix-ui/react-tabs": "^1.1.12",
+ "class-variance-authority": "^0.7.1",
+ "clsx": "^2.1.1",
+ "embla-carousel-react": "^8.6.0",
+ "lucide-react": "^0.511.0",
+ "next": "^15.3.3",
+ "radix-ui": "^1.4.3",
+ "react": "^19.1.0",
+ "react-dom": "^19.1.0",
+ "tailwind-merge": "^3.3.0"
+ },
+ "devDependencies": {
+ "@eslint/eslintrc": "^3.3.5",
+ "@tailwindcss/postcss": "^4.1.8",
+ "@types/node": "^22.15.29",
+ "@types/react": "^19.1.6",
+ "@types/react-dom": "^19.1.5",
+ "eslint": "^9.28.0",
+ "eslint-config-next": "^15.3.3",
+ "tailwindcss": "^4.1.8",
+ "typescript": "^5.8.3"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@emnapi/core": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz",
+ "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/wasi-threads": "1.2.1",
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@emnapi/runtime": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz",
+ "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@emnapi/wasi-threads": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz",
+ "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "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/eslint-utils/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/@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/config-array": {
+ "version": "0.21.2",
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz",
+ "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/object-schema": "^2.1.7",
+ "debug": "^4.3.1",
+ "minimatch": "^3.1.5"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/config-helpers": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz",
+ "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^0.17.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/core": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz",
+ "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@types/json-schema": "^7.0.15"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "3.3.5",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz",
+ "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ajv": "^6.14.0",
+ "debug": "^4.3.2",
+ "espree": "^10.0.1",
+ "globals": "^14.0.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.1",
+ "minimatch": "^3.1.5",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "9.39.4",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz",
+ "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ }
+ },
+ "node_modules/@eslint/object-schema": {
+ "version": "2.1.7",
+ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz",
+ "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/plugin-kit": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz",
+ "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^0.17.0",
+ "levn": "^0.4.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@floating-ui/core": {
+ "version": "1.7.5",
+ "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz",
+ "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/utils": "^0.2.11"
+ }
+ },
+ "node_modules/@floating-ui/dom": {
+ "version": "1.7.6",
+ "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz",
+ "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/core": "^1.7.5",
+ "@floating-ui/utils": "^0.2.11"
+ }
+ },
+ "node_modules/@floating-ui/react-dom": {
+ "version": "2.1.8",
+ "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.8.tgz",
+ "integrity": "sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/dom": "^1.7.6"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0"
+ }
+ },
+ "node_modules/@floating-ui/utils": {
+ "version": "0.2.11",
+ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz",
+ "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==",
+ "license": "MIT"
+ },
+ "node_modules/@humanfs/core": {
+ "version": "0.19.2",
+ "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz",
+ "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@humanfs/types": "^0.15.0"
+ },
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanfs/node": {
+ "version": "0.16.8",
+ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz",
+ "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@humanfs/core": "^0.19.2",
+ "@humanfs/types": "^0.15.0",
+ "@humanwhocodes/retry": "^0.4.0"
+ },
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanfs/types": {
+ "version": "0.15.0",
+ "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz",
+ "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18.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/retry": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
+ "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "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",
+ "optional": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@img/sharp-darwin-arm64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz",
+ "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-darwin-arm64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-darwin-x64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz",
+ "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-darwin-x64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-libvips-darwin-arm64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz",
+ "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-darwin-x64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz",
+ "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-arm": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz",
+ "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==",
+ "cpu": [
+ "arm"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-arm64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz",
+ "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-ppc64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz",
+ "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-riscv64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz",
+ "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-s390x": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz",
+ "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "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"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linuxmusl-arm64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz",
+ "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "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"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-linux-arm": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz",
+ "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==",
+ "cpu": [
+ "arm"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "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-arm": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-linux-arm64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz",
+ "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "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-arm64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-linux-ppc64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz",
+ "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "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-ppc64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-linux-riscv64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz",
+ "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==",
+ "cpu": [
+ "riscv64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "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-riscv64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-linux-s390x": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz",
+ "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==",
+ "cpu": [
+ "s390x"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "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-s390x": "1.2.4"
+ }
+ },
+ "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"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "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-arm64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz",
+ "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "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-arm64": "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"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "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/@img/sharp-wasm32": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz",
+ "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==",
+ "cpu": [
+ "wasm32"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/runtime": "^1.7.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-win32-arm64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz",
+ "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-win32-ia32": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz",
+ "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-win32-x64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz",
+ "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.13",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/remapping": {
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
+ "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.31",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@napi-rs/wasm-runtime": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz",
+ "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@tybys/wasm-util": "^0.10.1"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Brooooooklyn"
+ },
+ "peerDependencies": {
+ "@emnapi/core": "^1.7.1",
+ "@emnapi/runtime": "^1.7.1"
+ }
+ },
+ "node_modules/@next/env": {
+ "version": "15.5.18",
+ "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.18.tgz",
+ "integrity": "sha512-hAV85Ckd9QR6RvH04MEKwsfLTksvFpO47j9xwtoIuvuPnlwecpSi+uZTtm8HirVbtlI2Fnz//xpcSTjFdyJk+g==",
+ "license": "MIT"
+ },
+ "node_modules/@next/eslint-plugin-next": {
+ "version": "15.5.18",
+ "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-15.5.18.tgz",
+ "integrity": "sha512-w4MYq8M26a8PNrfto0JosLf5/3ssln1rsyP96g2DkC8uFVymStM5DLSz5ElxxrPRg2XnTMnFo3kREFlhYvxhWw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-glob": "3.3.1"
+ }
+ },
+ "node_modules/@next/swc-darwin-arm64": {
+ "version": "15.5.18",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.18.tgz",
+ "integrity": "sha512-w0WvQf1n+txiwns/9pwIQteCJpZTbxzO2SE0FLcwuD4v0WEh1JPOjdyxWL21XwJsdpx8cFRjyzxzCS/siP7HcQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-darwin-x64": {
+ "version": "15.5.18",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.18.tgz",
+ "integrity": "sha512-znn71QmDuxm+BOaglihMZfvyySMnNljkVIY5Z2TCssBmm+WqL6c19VhtH5ktFkHa8EZ2bnTUpcNcmNSQsg67og==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-arm64-gnu": {
+ "version": "15.5.18",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.18.tgz",
+ "integrity": "sha512-yPPe5MNL+igZUa+OsqQJisqSfh6oarIuA1Q0BDxljGJhRQyZeP+WRHh7rs/jZUGMh5aY0YdIjXZG0VohkKkUdw==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-arm64-musl": {
+ "version": "15.5.18",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.18.tgz",
+ "integrity": "sha512-glaCczEWIrHsokFZ3pP08U4BpKxwIdnT+txdOM32OBgpL9Yw4aqx8NejmgtZQZOdstQ5f0L3CasIZudzCuD+nw==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-x64-gnu": {
+ "version": "15.5.18",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.18.tgz",
+ "integrity": "sha512-oUfg2EgJmU3R0OCOWiokGFUTvZiPfXtriXiuF3YNxRoROCdgvTedHIzYoeKH34gsZxS/V7mHbfq2hpAHwhH1/A==",
+ "cpu": [
+ "x64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-x64-musl": {
+ "version": "15.5.18",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.18.tgz",
+ "integrity": "sha512-JLxSP3KTd9iu/bvUMQxH7RJo9xKSHf55/6RPE4a6FTSZygGn7uvZbCej0AHXydwkggQGSD9UddSjwv6Xz5ESfA==",
+ "cpu": [
+ "x64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-win32-arm64-msvc": {
+ "version": "15.5.18",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.18.tgz",
+ "integrity": "sha512-ir1v7enP52K2HNz3tQQvwF+x7VNxBk1ciiZ18WBPvxf4C59IqdfmHPJYK3vH7rSxpuCVw/8C712wTXNAtEp+NA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-win32-x64-msvc": {
+ "version": "15.5.18",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.18.tgz",
+ "integrity": "sha512-LIu5me6QTANCd25E7I5uIEfvgQ06RK7tvHAbYo3zCb3VpxQEPvMcSpd87NwUABDT6MbGPdEGR5VRiK4PPTJhQg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nolyfill/is-core-module": {
+ "version": "1.0.39",
+ "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz",
+ "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.4.0"
+ }
+ },
+ "node_modules/@radix-ui/number": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz",
+ "integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==",
+ "license": "MIT"
+ },
+ "node_modules/@radix-ui/primitive": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz",
+ "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==",
+ "license": "MIT"
+ },
+ "node_modules/@radix-ui/react-accessible-icon": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-accessible-icon/-/react-accessible-icon-1.1.7.tgz",
+ "integrity": "sha512-XM+E4WXl0OqUJFovy6GjmxxFyx9opfCAIUku4dlKRd5YEPqt4kALOkQOp0Of6reHuUkJuiPBEc5k0o4z4lTC8A==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-visually-hidden": "1.2.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-accordion": {
+ "version": "1.2.12",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.12.tgz",
+ "integrity": "sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-collapsible": "1.1.12",
+ "@radix-ui/react-collection": "1.1.7",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-direction": "1.1.1",
+ "@radix-ui/react-id": "1.1.1",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-controllable-state": "1.2.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-alert-dialog": {
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.15.tgz",
+ "integrity": "sha512-oTVLkEw5GpdRe29BqJ0LSDFWI3qu0vR1M0mUkOQWDIUnY/QIkLpgDMWuKxP94c2NAC2LGcgVhG1ImF3jkZ5wXw==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-dialog": "1.1.15",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-slot": "1.2.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-alert-dialog/node_modules/@radix-ui/react-slot": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz",
+ "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-arrow": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz",
+ "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-primitive": "2.1.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-aspect-ratio": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-aspect-ratio/-/react-aspect-ratio-1.1.7.tgz",
+ "integrity": "sha512-Yq6lvO9HQyPwev1onK1daHCHqXVLzPhSVjmsNjCa2Zcxy2f7uJD2itDtxknv6FzAKCwD1qQkeVDmX/cev13n/g==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-primitive": "2.1.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-avatar": {
+ "version": "1.1.10",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.10.tgz",
+ "integrity": "sha512-V8piFfWapM5OmNCXTzVQY+E1rDa53zY+MQ4Y7356v4fFz6vqCyUtIz2rUD44ZEdwg78/jKmMJHj07+C/Z/rcog==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-callback-ref": "1.1.1",
+ "@radix-ui/react-use-is-hydrated": "0.1.0",
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-checkbox": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.3.tgz",
+ "integrity": "sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-presence": "1.1.5",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-controllable-state": "1.2.2",
+ "@radix-ui/react-use-previous": "1.1.1",
+ "@radix-ui/react-use-size": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-collapsible": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.12.tgz",
+ "integrity": "sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-id": "1.1.1",
+ "@radix-ui/react-presence": "1.1.5",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-controllable-state": "1.2.2",
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-collection": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz",
+ "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-slot": "1.2.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-slot": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz",
+ "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-compose-refs": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz",
+ "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-context": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz",
+ "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-context-menu": {
+ "version": "2.2.16",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-context-menu/-/react-context-menu-2.2.16.tgz",
+ "integrity": "sha512-O8morBEW+HsVG28gYDZPTrT9UUovQUlJue5YO836tiTJhuIWBm/zQHc7j388sHWtdH/xUZurK9olD2+pcqx5ww==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-menu": "2.1.16",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-callback-ref": "1.1.1",
+ "@radix-ui/react-use-controllable-state": "1.2.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-dialog": {
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz",
+ "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-dismissable-layer": "1.1.11",
+ "@radix-ui/react-focus-guards": "1.1.3",
+ "@radix-ui/react-focus-scope": "1.1.7",
+ "@radix-ui/react-id": "1.1.1",
+ "@radix-ui/react-portal": "1.1.9",
+ "@radix-ui/react-presence": "1.1.5",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-slot": "1.2.3",
+ "@radix-ui/react-use-controllable-state": "1.2.2",
+ "aria-hidden": "^1.2.4",
+ "react-remove-scroll": "^2.6.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-slot": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz",
+ "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-direction": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz",
+ "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-dismissable-layer": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz",
+ "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-callback-ref": "1.1.1",
+ "@radix-ui/react-use-escape-keydown": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-dropdown-menu": {
+ "version": "2.1.16",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.16.tgz",
+ "integrity": "sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-id": "1.1.1",
+ "@radix-ui/react-menu": "2.1.16",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-controllable-state": "1.2.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-focus-guards": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz",
+ "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-focus-scope": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz",
+ "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-callback-ref": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-form": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-form/-/react-form-0.1.8.tgz",
+ "integrity": "sha512-QM70k4Zwjttifr5a4sZFts9fn8FzHYvQ5PiB19O2HsYibaHSVt9fH9rzB0XZo/YcM+b7t/p7lYCT/F5eOeF5yQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-id": "1.1.1",
+ "@radix-ui/react-label": "2.1.7",
+ "@radix-ui/react-primitive": "2.1.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-form/node_modules/@radix-ui/react-label": {
+ "version": "2.1.7",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.7.tgz",
+ "integrity": "sha512-YT1GqPSL8kJn20djelMX7/cTRp/Y9w5IZHvfxQTVHrOqa2yMl7i/UfMqKRU5V7mEyKTrUVgJXhNQPVCG8PBLoQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-primitive": "2.1.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-hover-card": {
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-hover-card/-/react-hover-card-1.1.15.tgz",
+ "integrity": "sha512-qgTkjNT1CfKMoP0rcasmlH2r1DAiYicWsDsufxl940sT2wHNEWWv6FMWIQXWhVdmC1d/HYfbhQx60KYyAtKxjg==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-dismissable-layer": "1.1.11",
+ "@radix-ui/react-popper": "1.2.8",
+ "@radix-ui/react-portal": "1.1.9",
+ "@radix-ui/react-presence": "1.1.5",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-controllable-state": "1.2.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-id": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz",
+ "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-label": {
+ "version": "2.1.8",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.8.tgz",
+ "integrity": "sha512-FmXs37I6hSBVDlO4y764TNz1rLgKwjJMQ0EGte6F3Cb3f4bIuHB/iLa/8I9VKkmOy+gNHq8rql3j686ACVV21A==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-primitive": "2.1.4"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-label/node_modules/@radix-ui/react-primitive": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz",
+ "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-slot": "1.2.4"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-menu": {
+ "version": "2.1.16",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.16.tgz",
+ "integrity": "sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-collection": "1.1.7",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-direction": "1.1.1",
+ "@radix-ui/react-dismissable-layer": "1.1.11",
+ "@radix-ui/react-focus-guards": "1.1.3",
+ "@radix-ui/react-focus-scope": "1.1.7",
+ "@radix-ui/react-id": "1.1.1",
+ "@radix-ui/react-popper": "1.2.8",
+ "@radix-ui/react-portal": "1.1.9",
+ "@radix-ui/react-presence": "1.1.5",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-roving-focus": "1.1.11",
+ "@radix-ui/react-slot": "1.2.3",
+ "@radix-ui/react-use-callback-ref": "1.1.1",
+ "aria-hidden": "^1.2.4",
+ "react-remove-scroll": "^2.6.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-slot": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz",
+ "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-menubar": {
+ "version": "1.1.16",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-menubar/-/react-menubar-1.1.16.tgz",
+ "integrity": "sha512-EB1FktTz5xRRi2Er974AUQZWg2yVBb1yjip38/lgwtCVRd3a+maUoGHN/xs9Yv8SY8QwbSEb+YrxGadVWbEutA==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-collection": "1.1.7",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-direction": "1.1.1",
+ "@radix-ui/react-id": "1.1.1",
+ "@radix-ui/react-menu": "2.1.16",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-roving-focus": "1.1.11",
+ "@radix-ui/react-use-controllable-state": "1.2.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-navigation-menu": {
+ "version": "1.2.14",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.14.tgz",
+ "integrity": "sha512-YB9mTFQvCOAQMHU+C/jVl96WmuWeltyUEpRJJky51huhds5W2FQr1J8D/16sQlf0ozxkPK8uF3niQMdUwZPv5w==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-collection": "1.1.7",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-direction": "1.1.1",
+ "@radix-ui/react-dismissable-layer": "1.1.11",
+ "@radix-ui/react-id": "1.1.1",
+ "@radix-ui/react-presence": "1.1.5",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-callback-ref": "1.1.1",
+ "@radix-ui/react-use-controllable-state": "1.2.2",
+ "@radix-ui/react-use-layout-effect": "1.1.1",
+ "@radix-ui/react-use-previous": "1.1.1",
+ "@radix-ui/react-visually-hidden": "1.2.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-one-time-password-field": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-one-time-password-field/-/react-one-time-password-field-0.1.8.tgz",
+ "integrity": "sha512-ycS4rbwURavDPVjCb5iS3aG4lURFDILi6sKI/WITUMZ13gMmn/xGjpLoqBAalhJaDk8I3UbCM5GzKHrnzwHbvg==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/number": "1.1.1",
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-collection": "1.1.7",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-direction": "1.1.1",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-roving-focus": "1.1.11",
+ "@radix-ui/react-use-controllable-state": "1.2.2",
+ "@radix-ui/react-use-effect-event": "0.0.2",
+ "@radix-ui/react-use-is-hydrated": "0.1.0",
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-password-toggle-field": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-password-toggle-field/-/react-password-toggle-field-0.1.3.tgz",
+ "integrity": "sha512-/UuCrDBWravcaMix4TdT+qlNdVwOM1Nck9kWx/vafXsdfj1ChfhOdfi3cy9SGBpWgTXwYCuboT/oYpJy3clqfw==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-id": "1.1.1",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-controllable-state": "1.2.2",
+ "@radix-ui/react-use-effect-event": "0.0.2",
+ "@radix-ui/react-use-is-hydrated": "0.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-popover": {
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.15.tgz",
+ "integrity": "sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-dismissable-layer": "1.1.11",
+ "@radix-ui/react-focus-guards": "1.1.3",
+ "@radix-ui/react-focus-scope": "1.1.7",
+ "@radix-ui/react-id": "1.1.1",
+ "@radix-ui/react-popper": "1.2.8",
+ "@radix-ui/react-portal": "1.1.9",
+ "@radix-ui/react-presence": "1.1.5",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-slot": "1.2.3",
+ "@radix-ui/react-use-controllable-state": "1.2.2",
+ "aria-hidden": "^1.2.4",
+ "react-remove-scroll": "^2.6.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-slot": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz",
+ "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-popper": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz",
+ "integrity": "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/react-dom": "^2.0.0",
+ "@radix-ui/react-arrow": "1.1.7",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-callback-ref": "1.1.1",
+ "@radix-ui/react-use-layout-effect": "1.1.1",
+ "@radix-ui/react-use-rect": "1.1.1",
+ "@radix-ui/react-use-size": "1.1.1",
+ "@radix-ui/rect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-portal": {
+ "version": "1.1.9",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz",
+ "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-presence": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz",
+ "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-primitive": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz",
+ "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-slot": "1.2.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz",
+ "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-progress": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.7.tgz",
+ "integrity": "sha512-vPdg/tF6YC/ynuBIJlk1mm7Le0VgW6ub6J2UWnTQ7/D23KXcPI1qy+0vBkgKgd38RCMJavBXpB83HPNFMTb0Fg==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-primitive": "2.1.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-radio-group": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.3.8.tgz",
+ "integrity": "sha512-VBKYIYImA5zsxACdisNQ3BjCBfmbGH3kQlnFVqlWU4tXwjy7cGX8ta80BcrO+WJXIn5iBylEH3K6ZTlee//lgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-direction": "1.1.1",
+ "@radix-ui/react-presence": "1.1.5",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-roving-focus": "1.1.11",
+ "@radix-ui/react-use-controllable-state": "1.2.2",
+ "@radix-ui/react-use-previous": "1.1.1",
+ "@radix-ui/react-use-size": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-roving-focus": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz",
+ "integrity": "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-collection": "1.1.7",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-direction": "1.1.1",
+ "@radix-ui/react-id": "1.1.1",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-callback-ref": "1.1.1",
+ "@radix-ui/react-use-controllable-state": "1.2.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-scroll-area": {
+ "version": "1.2.10",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.10.tgz",
+ "integrity": "sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/number": "1.1.1",
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-direction": "1.1.1",
+ "@radix-ui/react-presence": "1.1.5",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-callback-ref": "1.1.1",
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-select": {
+ "version": "2.2.6",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.2.6.tgz",
+ "integrity": "sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/number": "1.1.1",
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-collection": "1.1.7",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-direction": "1.1.1",
+ "@radix-ui/react-dismissable-layer": "1.1.11",
+ "@radix-ui/react-focus-guards": "1.1.3",
+ "@radix-ui/react-focus-scope": "1.1.7",
+ "@radix-ui/react-id": "1.1.1",
+ "@radix-ui/react-popper": "1.2.8",
+ "@radix-ui/react-portal": "1.1.9",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-slot": "1.2.3",
+ "@radix-ui/react-use-callback-ref": "1.1.1",
+ "@radix-ui/react-use-controllable-state": "1.2.2",
+ "@radix-ui/react-use-layout-effect": "1.1.1",
+ "@radix-ui/react-use-previous": "1.1.1",
+ "@radix-ui/react-visually-hidden": "1.2.3",
+ "aria-hidden": "^1.2.4",
+ "react-remove-scroll": "^2.6.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-slot": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz",
+ "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-separator": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.8.tgz",
+ "integrity": "sha512-sDvqVY4itsKwwSMEe0jtKgfTh+72Sy3gPmQpjqcQneqQ4PFmr/1I0YA+2/puilhggCe2gJcx5EBAYFkWkdpa5g==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-primitive": "2.1.4"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz",
+ "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-slot": "1.2.4"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-slider": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.3.6.tgz",
+ "integrity": "sha512-JPYb1GuM1bxfjMRlNLE+BcmBC8onfCi60Blk7OBqi2MLTFdS+8401U4uFjnwkOr49BLmXxLC6JHkvAsx5OJvHw==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/number": "1.1.1",
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-collection": "1.1.7",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-direction": "1.1.1",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-controllable-state": "1.2.2",
+ "@radix-ui/react-use-layout-effect": "1.1.1",
+ "@radix-ui/react-use-previous": "1.1.1",
+ "@radix-ui/react-use-size": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-slot": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz",
+ "integrity": "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-switch": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.2.6.tgz",
+ "integrity": "sha512-bByzr1+ep1zk4VubeEVViV592vu2lHE2BZY5OnzehZqOOgogN80+mNtCqPkhn2gklJqOpxWgPoYTSnhBCqpOXQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-controllable-state": "1.2.2",
+ "@radix-ui/react-use-previous": "1.1.1",
+ "@radix-ui/react-use-size": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-tabs": {
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.13.tgz",
+ "integrity": "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-direction": "1.1.1",
+ "@radix-ui/react-id": "1.1.1",
+ "@radix-ui/react-presence": "1.1.5",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-roving-focus": "1.1.11",
+ "@radix-ui/react-use-controllable-state": "1.2.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-toast": {
+ "version": "1.2.15",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.15.tgz",
+ "integrity": "sha512-3OSz3TacUWy4WtOXV38DggwxoqJK4+eDkNMl5Z/MJZaoUPaP4/9lf81xXMe1I2ReTAptverZUpbPY4wWwWyL5g==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-collection": "1.1.7",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-dismissable-layer": "1.1.11",
+ "@radix-ui/react-portal": "1.1.9",
+ "@radix-ui/react-presence": "1.1.5",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-callback-ref": "1.1.1",
+ "@radix-ui/react-use-controllable-state": "1.2.2",
+ "@radix-ui/react-use-layout-effect": "1.1.1",
+ "@radix-ui/react-visually-hidden": "1.2.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-toggle": {
+ "version": "1.1.10",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.10.tgz",
+ "integrity": "sha512-lS1odchhFTeZv3xwHH31YPObmJn8gOg7Lq12inrr0+BH/l3Tsq32VfjqH1oh80ARM3mlkfMic15n0kg4sD1poQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-controllable-state": "1.2.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-toggle-group": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.11.tgz",
+ "integrity": "sha512-5umnS0T8JQzQT6HbPyO7Hh9dgd82NmS36DQr+X/YJ9ctFNCiiQd6IJAYYZ33LUwm8M+taCz5t2ui29fHZc4Y6Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-direction": "1.1.1",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-roving-focus": "1.1.11",
+ "@radix-ui/react-toggle": "1.1.10",
+ "@radix-ui/react-use-controllable-state": "1.2.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-toolbar": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-toolbar/-/react-toolbar-1.1.11.tgz",
+ "integrity": "sha512-4ol06/1bLoFu1nwUqzdD4Y5RZ9oDdKeiHIsntug54Hcr1pgaHiPqHFEaXI1IFP/EsOfROQZ8Mig9VTIRza6Tjg==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-direction": "1.1.1",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-roving-focus": "1.1.11",
+ "@radix-ui/react-separator": "1.1.7",
+ "@radix-ui/react-toggle-group": "1.1.11"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-toolbar/node_modules/@radix-ui/react-separator": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.7.tgz",
+ "integrity": "sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-primitive": "2.1.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-tooltip": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.8.tgz",
+ "integrity": "sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-dismissable-layer": "1.1.11",
+ "@radix-ui/react-id": "1.1.1",
+ "@radix-ui/react-popper": "1.2.8",
+ "@radix-ui/react-portal": "1.1.9",
+ "@radix-ui/react-presence": "1.1.5",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-slot": "1.2.3",
+ "@radix-ui/react-use-controllable-state": "1.2.2",
+ "@radix-ui/react-visually-hidden": "1.2.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-slot": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz",
+ "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-callback-ref": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz",
+ "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-controllable-state": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz",
+ "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-use-effect-event": "0.0.2",
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-effect-event": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz",
+ "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-escape-keydown": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz",
+ "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-use-callback-ref": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-is-hydrated": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.0.tgz",
+ "integrity": "sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA==",
+ "license": "MIT",
+ "dependencies": {
+ "use-sync-external-store": "^1.5.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-layout-effect": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz",
+ "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-previous": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz",
+ "integrity": "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-rect": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz",
+ "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/rect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-size": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz",
+ "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-visually-hidden": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz",
+ "integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-primitive": "2.1.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/rect": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz",
+ "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==",
+ "license": "MIT"
+ },
+ "node_modules/@rtsao/scc": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz",
+ "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==",
+ "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/@swc/helpers": {
+ "version": "0.5.15",
+ "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz",
+ "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.8.0"
+ }
+ },
+ "node_modules/@tailwindcss/node": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.0.tgz",
+ "integrity": "sha512-aFb4gUhFOgdh9AXo4IzBEOzBkkAxm9VigwDJnMIYv3lcfXCJVesNfbEaBl4BNgVRyid92AmdviqwBUBRKSeY3g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/remapping": "^2.3.5",
+ "enhanced-resolve": "^5.21.0",
+ "jiti": "^2.6.1",
+ "lightningcss": "1.32.0",
+ "magic-string": "^0.30.21",
+ "source-map-js": "^1.2.1",
+ "tailwindcss": "4.3.0"
+ }
+ },
+ "node_modules/@tailwindcss/oxide": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.0.tgz",
+ "integrity": "sha512-F7HZGBeN9I0/AuuJS5PwcD8xayx5ri5GhjYUDBEVYUkexyA/giwbDNjRVrxSezE3T250OU2K/wp/ltWx3UOefg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 20"
+ },
+ "optionalDependencies": {
+ "@tailwindcss/oxide-android-arm64": "4.3.0",
+ "@tailwindcss/oxide-darwin-arm64": "4.3.0",
+ "@tailwindcss/oxide-darwin-x64": "4.3.0",
+ "@tailwindcss/oxide-freebsd-x64": "4.3.0",
+ "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.0",
+ "@tailwindcss/oxide-linux-arm64-gnu": "4.3.0",
+ "@tailwindcss/oxide-linux-arm64-musl": "4.3.0",
+ "@tailwindcss/oxide-linux-x64-gnu": "4.3.0",
+ "@tailwindcss/oxide-linux-x64-musl": "4.3.0",
+ "@tailwindcss/oxide-wasm32-wasi": "4.3.0",
+ "@tailwindcss/oxide-win32-arm64-msvc": "4.3.0",
+ "@tailwindcss/oxide-win32-x64-msvc": "4.3.0"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-android-arm64": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.0.tgz",
+ "integrity": "sha512-TJPiq67tKlLuObP6RkwvVGDoxCMBVtDgKkLfa/uyj7/FyxvQwHS+UOnVrXXgbEsfUaMgiVvC4KbJnRr26ho4Ng==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-darwin-arm64": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.0.tgz",
+ "integrity": "sha512-oMN/WZRb+SO37BmUElEgeEWuU8E/HXRkiODxJxLe1UTHVXLrdVSgfaJV7pSlhRGMSOiXLuxTIjfsF3wYvz8cgQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-darwin-x64": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.0.tgz",
+ "integrity": "sha512-N6CUmu4a6bKVADfw77p+iw6Yd9Q3OBhe0veaDX+QazfuVYlQsHfDgxBrsjQ/IW+zywL8mTrNd0SdJT/zgtvMdA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-freebsd-x64": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.0.tgz",
+ "integrity": "sha512-zDL5hBkQdH5C6MpqbK3gQAgP80tsMwSI26vjOzjJtNCMUo0lFgOItzHKBIupOZNQxt3ouPH7RPhvNhiTfCe5CQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.0.tgz",
+ "integrity": "sha512-R06HdNi7A7OEoMsf6d4tjZ71RCWnZQPHj2mnotSFURjNLdBC+cIgXQ7l81CqeoiQftjf6OOblxXMInMgN2VzMA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-arm64-gnu": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.0.tgz",
+ "integrity": "sha512-qTJHELX8jetjhRQHCLilkVLmybpzNQAtaI/gaoVoidn/ufbNDbAo8KlK2J+yPoc8wQxvDxCmh/5lr8nC1+lTbg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-arm64-musl": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.0.tgz",
+ "integrity": "sha512-Z6sukiQsngnWO+l39X4pPbiWT81IC+PLKF+PHxIlyZbGNb9MODfYlXEVlFvej5BOZInWX01kVyzeLvHsXhfczQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-x64-gnu": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.0.tgz",
+ "integrity": "sha512-DRNdQRpSGzRGfARVuVkxvM8Q12nh19l4BF/G7zGA1oe+9wcC6saFBHTISrpIcKzhiXtSrlSrluCfvMuledoCTQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-x64-musl": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.0.tgz",
+ "integrity": "sha512-Z0IADbDo8bh6I7h2IQMx601AdXBLfFpEdUotft86evd/8ZPflZe9COPO8Q1vw+pfLWIUo9zN/JGZvwuAJqduqg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-wasm32-wasi": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.0.tgz",
+ "integrity": "sha512-HNZGOUxEmElksYR7S6sC5jTeNGpobAsy9u7Gu0AskJ8/20FR9GqebUyB+HBcU/ax6BHuiuJi+Oda4B+YX6H1yA==",
+ "bundleDependencies": [
+ "@napi-rs/wasm-runtime",
+ "@emnapi/core",
+ "@emnapi/runtime",
+ "@tybys/wasm-util",
+ "@emnapi/wasi-threads",
+ "tslib"
+ ],
+ "cpu": [
+ "wasm32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/core": "^1.10.0",
+ "@emnapi/runtime": "^1.10.0",
+ "@emnapi/wasi-threads": "^1.2.1",
+ "@napi-rs/wasm-runtime": "^1.1.4",
+ "@tybys/wasm-util": "^0.10.1",
+ "tslib": "^2.8.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.0.tgz",
+ "integrity": "sha512-Pe+RPVTi1T+qymuuRpcdvwSVZjnll/f7n8gBxMMh3xLTctMDKqpdfGimbMyioqtLhUYZxdJ9wGNhV7MKHvgZsQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-win32-x64-msvc": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.0.tgz",
+ "integrity": "sha512-Mvrf2kXW/yeW/OTezZlCGOirXRcUuLIBx/5Y12BaPM7wJoryG6dfS/NJL8aBPqtTEx/Vm4T4vKzFUcKDT+TKUA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/postcss": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.3.0.tgz",
+ "integrity": "sha512-Jm05Tjx+9yCLGv5qw1c+84Psds8MnyrEQYCB+FFk2lgGiUjlRqdxke4mVTuYrj2xnVZqKim2Apr5ySuQRYAw/w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@alloc/quick-lru": "^5.2.0",
+ "@tailwindcss/node": "4.3.0",
+ "@tailwindcss/oxide": "4.3.0",
+ "postcss": "^8.5.10",
+ "tailwindcss": "4.3.0"
+ }
+ },
+ "node_modules/@tybys/wasm-util": {
+ "version": "0.10.2",
+ "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz",
+ "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/json5": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
+ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/node": {
+ "version": "22.19.19",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.19.tgz",
+ "integrity": "sha512-dyh/xO2Fh5bYrfWaaqGrRQQGkNdmYw6AmaAUvYeUMNTWQtvb796ikLdmTchRmOlOiIJ1TDXfWgVx1QkUlQ6Hew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~6.21.0"
+ }
+ },
+ "node_modules/@types/react": {
+ "version": "19.2.14",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz",
+ "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "csstype": "^3.2.2"
+ }
+ },
+ "node_modules/@types/react-dom": {
+ "version": "19.2.3",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz",
+ "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==",
+ "devOptional": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "^19.2.0"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "8.59.4",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.4.tgz",
+ "integrity": "sha512-PegsU+XfyJJNjd4+u/k6f9yTyp0lEXXiPopUNobZcIAUJFGICFLN+sP0Rb3JehVmiij1Ph0dFGYqODoRo/2+6A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.12.2",
+ "@typescript-eslint/scope-manager": "8.59.4",
+ "@typescript-eslint/type-utils": "8.59.4",
+ "@typescript-eslint/utils": "8.59.4",
+ "@typescript-eslint/visitor-keys": "8.59.4",
+ "ignore": "^7.0.5",
+ "natural-compare": "^1.4.0",
+ "ts-api-utils": "^2.5.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^8.59.4",
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
+ "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "8.59.4",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.4.tgz",
+ "integrity": "sha512-zORHqO/tuhxY1zWuTvMUqddRxpiFJ72xVfcNoWpqdLjs6lfPbuQBJuW4pk+49/uBMy7Ssr4bzgjiKmmDB1UbZQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "8.59.4",
+ "@typescript-eslint/types": "8.59.4",
+ "@typescript-eslint/typescript-estree": "8.59.4",
+ "@typescript-eslint/visitor-keys": "8.59.4",
+ "debug": "^4.4.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/project-service": {
+ "version": "8.59.4",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.4.tgz",
+ "integrity": "sha512-Ly00Vu4oAacfDeHp2Zg85ioNG6l8HG+tN1D7J+xTHSxu9y0awYKJ2zH1rFBn8ZSfuGK+7FxK3Cgl3uAz0aZZLg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/tsconfig-utils": "^8.59.4",
+ "@typescript-eslint/types": "^8.59.4",
+ "debug": "^4.4.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.59.4",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.4.tgz",
+ "integrity": "sha512-mUeR/3H1WrTAddJrwut8OoPjfauaztMQmRwV5fQTUyNVJCLiUXXe4lGEyYIL2oFDpP7UtgbGJXCt72wT0z2S3Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.59.4",
+ "@typescript-eslint/visitor-keys": "8.59.4"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/tsconfig-utils": {
+ "version": "8.59.4",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.4.tgz",
+ "integrity": "sha512-DLCpnKgD4alVxTBSKulK+gU1KCqOgUXfDRDXh2mZgzokQKa/70ax93I2uVO3m/LLvIAtWZIFoiifudmIqAxpMA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "8.59.4",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.4.tgz",
+ "integrity": "sha512-uonTuPAAKr9XaBGqJ3LjYTh72zy5DyGesljO9gtmk/eFW0W1fRHjnwVYKB35Lm8d5Q5CluEW3gPHjTvZTmgrfA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.59.4",
+ "@typescript-eslint/typescript-estree": "8.59.4",
+ "@typescript-eslint/utils": "8.59.4",
+ "debug": "^4.4.3",
+ "ts-api-utils": "^2.5.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "8.59.4",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.4.tgz",
+ "integrity": "sha512-F1o7WJcCq+bc8dwcO/YsSEOudAH8RDtaOhM6wcAQhcUsFhnWQl81JKy48q1hoxAU0qrzM89+31GYh1515Zde3Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "8.59.4",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.4.tgz",
+ "integrity": "sha512-F+RuOmcDXo4+TPdfd/TCLS3m2nw8gE9XXyZLrA3JBfaA5tz9TtdkyD3YJFmPxulyc2cKbEok/CvFE3MgSLWnag==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/project-service": "8.59.4",
+ "@typescript-eslint/tsconfig-utils": "8.59.4",
+ "@typescript-eslint/types": "8.59.4",
+ "@typescript-eslint/visitor-keys": "8.59.4",
+ "debug": "^4.4.3",
+ "minimatch": "^10.2.2",
+ "semver": "^7.7.3",
+ "tinyglobby": "^0.2.15",
+ "ts-api-utils": "^2.5.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
+ "version": "5.0.6",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz",
+ "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^4.0.2"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
+ "version": "10.2.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
+ "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "brace-expansion": "^5.0.5"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "8.59.4",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.4.tgz",
+ "integrity": "sha512-cYXeNAUsG4lJo5dbc1FcKm+JwIWrj1/UpTORsC6tGMjEZ81DYcvIr9/ueikhMa/Y/gDQYGp+YX9/xQrXje5BJw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.9.1",
+ "@typescript-eslint/scope-manager": "8.59.4",
+ "@typescript-eslint/types": "8.59.4",
+ "@typescript-eslint/typescript-estree": "8.59.4"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.59.4",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.4.tgz",
+ "integrity": "sha512-U3gxVaDVnuZKhSspW/MzMxE1kq7zOdc072FcSNoqA1I9p8HyKbBFfEHoWckBAMgNMph4MamwS5iTVzFmrnt8TQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.59.4",
+ "eslint-visitor-keys": "^5.0.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
+ "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@unrs/resolver-binding-android-arm-eabi": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.12.2.tgz",
+ "integrity": "sha512-g5T90pqg1bo/7mytQx6F4iBNC0Wsh9cu+z9veDbFjc7HjpesJFWD7QMS0NGStXM075+7dJPPVvBbpZlnrdpi/w==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-android-arm64": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.12.2.tgz",
+ "integrity": "sha512-YGCRZv/9GLhwmz6mYDeTsm/92BAyR28l6c2ReweVW5pWgfsitWLY8upvfRlGdoyD8HjeTHSYJWyZGD4KJA/nFQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-darwin-arm64": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.12.2.tgz",
+ "integrity": "sha512-u9DiNT1auQMO20A9SyTuG3wUgQWB9Z7KjAg0uFuCDR1FsAY8A0CG2S6JpHS1xwm/w1G08bjXZDcyOCjv1WAm2w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-darwin-x64": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.12.2.tgz",
+ "integrity": "sha512-f7rPLi/T1HVKZu/u6t87lroib16n8vrSzcyxI7lg4BGO9UF26KhQL44sd9eOUgrTYhvRXtWOIZT5PejdPyJfUA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-freebsd-x64": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.12.2.tgz",
+ "integrity": "sha512-BpcOjWCJub6nRZUS2zA20pmLvjtqAtGejETaIyRLiZiQf++cbrjltLA5NN/xaXfqeOBOSlMFbemIl5/S5tljmg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.12.2.tgz",
+ "integrity": "sha512-vZTDvdSISZjJx66OzJqtsOhzifbqRjbmI1Mnu49fQDwog5GtDI4QidRiEAYbZCRj9C8YZEW+3ZjqsyS9GR4k2A==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.12.2.tgz",
+ "integrity": "sha512-BiPI+IrIlwcW4nLLMM21+B1dFPzd55yAVgVGrdgDjNef+ch03GdxrcyaIz8X9SsQirh/kCQ7mviyWlMxdh2D7g==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-arm64-gnu": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.12.2.tgz",
+ "integrity": "sha512-zJc0H99FEPoFfSrNpa91HYfxzfAJCr502oxNK1cfdC9hlaFI43RT+JFCann9JUgZmLzzntChHyn13Sgn9ljHNg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-arm64-musl": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.12.2.tgz",
+ "integrity": "sha512-KQ3Lki6l+Pz1k/eBipN41ES+YUK30beLGb9YqcB1O542cyLCNE6GaxrfcY3T6EezmGGk84wb5XyO9loTM9tkcA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-loong64-gnu": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-loong64-gnu/-/resolver-binding-linux-loong64-gnu-1.12.2.tgz",
+ "integrity": "sha512-3SJGEh1DborhG6pyxvhPzCT4bbSIVihsvgJc13P1bHG7KLdNDaF9T3gsTwFc7Jw/5Y5/iWOjkEx7Zy0NvCGX3Q==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-loong64-musl": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-loong64-musl/-/resolver-binding-linux-loong64-musl-1.12.2.tgz",
+ "integrity": "sha512-jiuG/Obbel7uw1PwHNFfrkiKhLAF6mnyZ6aWlOAVN9WqKm8v0OFGnciJIHu8+CMvXLQ8AD51LPzAoUfT21D5Ew==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.12.2.tgz",
+ "integrity": "sha512-q7xRvVpmcfeL+LlZg8Pbbo6QaTZwDU5BaGZbwfhkEsXJn3Was8xYfE0RBH266xZt0rM6B7i8xAYIvjthuUIWHg==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.12.2.tgz",
+ "integrity": "sha512-0CVdx6lcnT3Q9inOH8tsMIOJ6ImndllMjqJHg8RLVdB7Vq4SfkEXl9mCSsVNuNA4MCYycRicCUxPCabVHJRr6A==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-riscv64-musl": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.12.2.tgz",
+ "integrity": "sha512-iOwlRo9vnp6R6ohHQS11n0NnfdXx/omhkocmIfaPRpQhKZ+3BDMkkdRVh53qjkFkpPddf+FETA28NwGN7l5l+w==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-s390x-gnu": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.12.2.tgz",
+ "integrity": "sha512-HYJtLfXq94q8iZNFT1lknx258wlkkWhZeUXJRqzKBBUJ00CvZ+N33zgbCqimLjsyw5Va6uUxhVa12mI+kaveEw==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-x64-gnu": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.12.2.tgz",
+ "integrity": "sha512-mPsUhunKKDih5O96Y6enDQyHc1SqBPlY1E/SfMWDM3EdJ95Z9CArPeCVwCCqbP45ljvivdEk8Fxn+SIb1rDAJQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-x64-musl": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.12.2.tgz",
+ "integrity": "sha512-azrt6+5ydLd8Vt210AAFis/lZevSfPw93EJRIJG+xPu4WCJ8K0kppCTpMyLPcKT7H15M4Jnt2tMp5bOvCkRC6A==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-openharmony-arm64": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-openharmony-arm64/-/resolver-binding-openharmony-arm64-1.12.2.tgz",
+ "integrity": "sha512-YZ9hP4O0X9PQb8eO980qmLNGH4zT3I9+SZTdt0Pr0YyuGQhYKoOZkV02VzrzyOZJ5xIJ3UFIenKkUkGg8GjgWQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-wasm32-wasi": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.12.2.tgz",
+ "integrity": "sha512-tYFDIkMxSflfEc/h92ZWNsZlHSwgimbNHSO3PL2JWQHfCuC2q316jMyYU9TIWZsFK2bQwyK5VAdYgn8ygPj69A==",
+ "cpu": [
+ "wasm32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/core": "1.10.0",
+ "@emnapi/runtime": "1.10.0",
+ "@napi-rs/wasm-runtime": "^1.1.4"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@unrs/resolver-binding-win32-arm64-msvc": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.12.2.tgz",
+ "integrity": "sha512-qzNyg3xL0VPQmCaUh+N5jSitce6k+uCBfMDesWRnlULOZaqUkaJ0ybdT+UqlAWJoQjuqfIU/0Ptx9bteN4D82g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-win32-ia32-msvc": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.12.2.tgz",
+ "integrity": "sha512-WD9sY00OfpHVGfsnHZoA8jVT+esS/Bg8z8jzxp5BnDCjjwsuKsPQrzswwpFy4J1AUJbXPRfkpcX0mXrzeXW79g==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-win32-x64-msvc": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.12.2.tgz",
+ "integrity": "sha512-nAB74NfSNKknqQ1RrYj6uz8FcXEomu/MATJZxh/x+BArzN2U3JbOYC0APYzUIGhVY3m5hRxA8VPNdPBoG8txlA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.15.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz",
+ "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==",
+ "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-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true,
+ "license": "Python-2.0"
+ },
+ "node_modules/aria-hidden": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz",
+ "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "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.prototype.findlast": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz",
+ "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.findlastindex": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz",
+ "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.9",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "es-shim-unscopables": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flat": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz",
+ "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flatmap": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz",
+ "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.tosorted": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz",
+ "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.3",
+ "es-errors": "^1.3.0",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/arraybuffer.prototype.slice": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz",
+ "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.1",
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "is-array-buffer": "^3.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/ast-types-flow": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz",
+ "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/async-function": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz",
+ "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/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.4",
+ "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.4.tgz",
+ "integrity": "sha512-KunSNx+TVpkAw/6ULfhnx+HWRecjqZGTOyquAoWHYLRSdK1tB5Ihce1ZW+UY3fj33bYAFWPu7W/GRSmmrCGuxA==",
+ "dev": true,
+ "license": "MPL-2.0",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/axobject-query": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz",
+ "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz",
+ "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==",
+ "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/call-bind": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz",
+ "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "get-intrinsic": "^1.3.0",
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/call-bound": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "get-intrinsic": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001793",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001793.tgz",
+ "integrity": "sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "CC-BY-4.0"
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/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/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/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
+ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
+ "devOptional": true,
+ "license": "MIT"
+ },
+ "node_modules/damerau-levenshtein": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
+ "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==",
+ "dev": true,
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/data-view-buffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz",
+ "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/data-view-byte-length": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz",
+ "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/inspect-js"
+ }
+ },
+ "node_modules/data-view-byte-offset": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz",
+ "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/define-data-property": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/define-properties": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
+ "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.0.1",
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/detect-libc": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
+ "devOptional": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/detect-node-es": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz",
+ "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==",
+ "license": "MIT"
+ },
+ "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/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "dev": true,
+ "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/embla-carousel": {
+ "version": "8.6.0",
+ "resolved": "https://registry.npmjs.org/embla-carousel/-/embla-carousel-8.6.0.tgz",
+ "integrity": "sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA==",
+ "license": "MIT"
+ },
+ "node_modules/embla-carousel-react": {
+ "version": "8.6.0",
+ "resolved": "https://registry.npmjs.org/embla-carousel-react/-/embla-carousel-react-8.6.0.tgz",
+ "integrity": "sha512-0/PjqU7geVmo6F734pmPqpyHqiM99olvyecY7zdweCw+6tKEXnrE90pBiBbMMU8s5tICemzpQ3hi5EpxzGW+JA==",
+ "license": "MIT",
+ "dependencies": {
+ "embla-carousel": "8.6.0",
+ "embla-carousel-reactive-utils": "8.6.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.1 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+ }
+ },
+ "node_modules/embla-carousel-reactive-utils": {
+ "version": "8.6.0",
+ "resolved": "https://registry.npmjs.org/embla-carousel-reactive-utils/-/embla-carousel-reactive-utils-8.6.0.tgz",
+ "integrity": "sha512-fMVUDUEx0/uIEDM0Mz3dHznDhfX+znCCDCeIophYb1QGVM7YThSWX+wz11zlYwWFOr74b4QLGg0hrGPJeG2s4A==",
+ "license": "MIT",
+ "peerDependencies": {
+ "embla-carousel": "8.6.0"
+ }
+ },
+ "node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/enhanced-resolve": {
+ "version": "5.21.5",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.5.tgz",
+ "integrity": "sha512-mLCNbrQli11K1ySUmuNt4ZUB3OpGIDq4q2vTBTf5cL2lpsRjI9QKqSD0ndjW8FyvcW/Jj46gMe9syyHAsvMa/A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.4",
+ "tapable": "^2.3.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/es-abstract": {
+ "version": "1.24.2",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz",
+ "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==",
+ "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==",
+ "dev": true,
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-iterator-helpers": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.3.2.tgz",
+ "integrity": "sha512-HVLACW1TppGYjJ8H6/jqH/pqOtKRw6wMlrB23xfExmFWxFquAIWCmwoLsOyN96K4a5KbmOf5At9ZUO3GZbetAw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.9",
+ "call-bound": "^1.0.4",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.24.2",
+ "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"
+ },
+ "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==",
+ "dev": true,
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-shim-unscopables": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz",
+ "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-to-primitive": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz",
+ "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-callable": "^1.2.7",
+ "is-date-object": "^1.0.5",
+ "is-symbol": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "9.39.4",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz",
+ "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.8.0",
+ "@eslint-community/regexpp": "^4.12.1",
+ "@eslint/config-array": "^0.21.2",
+ "@eslint/config-helpers": "^0.4.2",
+ "@eslint/core": "^0.17.0",
+ "@eslint/eslintrc": "^3.3.5",
+ "@eslint/js": "9.39.4",
+ "@eslint/plugin-kit": "^0.4.1",
+ "@humanfs/node": "^0.16.6",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@humanwhocodes/retry": "^0.4.2",
+ "@types/estree": "^1.0.6",
+ "ajv": "^6.14.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.6",
+ "debug": "^4.3.2",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^8.4.0",
+ "eslint-visitor-keys": "^4.2.1",
+ "espree": "^10.4.0",
+ "esquery": "^1.5.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^8.0.0",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.5",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ },
+ "peerDependencies": {
+ "jiti": "*"
+ },
+ "peerDependenciesMeta": {
+ "jiti": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-config-next": {
+ "version": "15.5.18",
+ "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-15.5.18.tgz",
+ "integrity": "sha512-HuoJU6uUPD00eyiud78IBnT4HLhztFj2V+ild2Uon5ZUrYZKe0Olu2QRD99e9IgL4/H1eg5Onka3BsfRW2U0Xw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@next/eslint-plugin-next": "15.5.18",
+ "@rushstack/eslint-patch": "^1.10.3",
+ "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0",
+ "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0",
+ "eslint-import-resolver-node": "^0.3.6",
+ "eslint-import-resolver-typescript": "^3.5.2",
+ "eslint-plugin-import": "^2.31.0",
+ "eslint-plugin-jsx-a11y": "^6.10.0",
+ "eslint-plugin-react": "^7.37.0",
+ "eslint-plugin-react-hooks": "^5.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^7.23.0 || ^8.0.0 || ^9.0.0",
+ "typescript": ">=3.3.1"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-import-resolver-node": {
+ "version": "0.3.10",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.10.tgz",
+ "integrity": "sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^3.2.7",
+ "is-core-module": "^2.16.1",
+ "resolve": "^2.0.0-next.6"
+ }
+ },
+ "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/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.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz",
+ "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==",
+ "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 || ^9.0.0"
+ }
+ },
+ "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": "8.4.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz",
+ "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/espree": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
+ "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "acorn": "^8.15.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^4.2.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz",
+ "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==",
+ "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.4"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fastq": {
+ "version": "1.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/file-entry-cache": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
+ "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flat-cache": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
+ "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.4"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "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/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/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/function.prototype.name": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz",
+ "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "functions-have-names": "^1.2.3",
+ "hasown": "^2.0.2",
+ "is-callable": "^1.2.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/functions-have-names": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
+ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/generator-function": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz",
+ "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+ "dev": true,
+ "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-nonce": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz",
+ "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/get-symbol-description": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz",
+ "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-tsconfig": {
+ "version": "4.14.0",
+ "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.0.tgz",
+ "integrity": "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "resolve-pkg-maps": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
+ }
+ },
+ "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/globals": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
+ "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "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/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "dev": true,
+ "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==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "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==",
+ "dev": true,
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-symbols": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz",
+ "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
+ "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/internal-slot": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz",
+ "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "hasown": "^2.0.2",
+ "side-channel": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/is-array-buffer": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz",
+ "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-async-function": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz",
+ "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "async-function": "^1.0.0",
+ "call-bound": "^1.0.3",
+ "get-proto": "^1.0.1",
+ "has-tostringtag": "^1.0.2",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-bigint": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz",
+ "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-bigints": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-boolean-object": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz",
+ "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-bun-module": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz",
+ "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^7.7.1"
+ }
+ },
+ "node_modules/is-callable": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
+ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.16.2",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz",
+ "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "hasown": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-data-view": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz",
+ "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "get-intrinsic": "^1.2.6",
+ "is-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-date-object": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz",
+ "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-finalizationregistry": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz",
+ "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-generator-function": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz",
+ "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.4",
+ "generator-function": "^2.0.0",
+ "get-proto": "^1.0.1",
+ "has-tostringtag": "^1.0.2",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-map": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz",
+ "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-negative-zero": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
+ "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-number-object": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz",
+ "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-regex": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz",
+ "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "gopd": "^1.2.0",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-set": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz",
+ "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-shared-array-buffer": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz",
+ "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-string": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz",
+ "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-symbol": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz",
+ "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "has-symbols": "^1.1.0",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-typed-array": {
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz",
+ "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "which-typed-array": "^1.1.16"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakmap": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz",
+ "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakref": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz",
+ "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakset": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz",
+ "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/iterator.prototype": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz",
+ "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.6",
+ "get-proto": "^1.0.0",
+ "has-symbols": "^1.1.0",
+ "set-function-name": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/jiti": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz",
+ "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "jiti": "lib/jiti-cli.mjs"
+ }
+ },
+ "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==",
+ "dev": true,
+ "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-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json5": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+ "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "minimist": "^1.2.0"
+ },
+ "bin": {
+ "json5": "lib/cli.js"
+ }
+ },
+ "node_modules/jsx-ast-utils": {
+ "version": "3.3.5",
+ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz",
+ "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-includes": "^3.1.6",
+ "array.prototype.flat": "^1.3.1",
+ "object.assign": "^4.1.4",
+ "object.values": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/language-subtag-registry": {
+ "version": "0.3.23",
+ "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz",
+ "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==",
+ "dev": true,
+ "license": "CC0-1.0"
+ },
+ "node_modules/language-tags": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz",
+ "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "language-subtag-registry": "^0.3.20"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/lightningcss": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz",
+ "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==",
+ "dev": true,
+ "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-android-arm64": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz",
+ "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-darwin-arm64": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz",
+ "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-darwin-x64": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz",
+ "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-freebsd-x64": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz",
+ "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm-gnueabihf": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz",
+ "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "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-arm64-gnu": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz",
+ "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "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-arm64-musl": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz",
+ "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "libc": [
+ "musl"
+ ],
+ "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-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"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "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"
+ ],
+ "dev": true,
+ "libc": [
+ "musl"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-win32-arm64-msvc": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz",
+ "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-win32-x64-msvc": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz",
+ "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "loose-envify": "cli.js"
+ }
+ },
+ "node_modules/lucide-react": {
+ "version": "0.511.0",
+ "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.511.0.tgz",
+ "integrity": "sha512-VK5a2ydJ7xm8GvBeKLS9mu1pVK6ucef9780JVUjw6bAjJL/QXnd4Y0p7SPeOUMC27YhzNCZvm5d/QX0Tp3rc0w==",
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.5"
+ }
+ },
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/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/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.12",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz",
+ "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/napi-postinstall": {
+ "version": "0.3.4",
+ "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz",
+ "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "napi-postinstall": "lib/cli.js"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/napi-postinstall"
+ }
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/next": {
+ "version": "15.5.18",
+ "resolved": "https://registry.npmjs.org/next/-/next-15.5.18.tgz",
+ "integrity": "sha512-eKL8zUJkX9Y5lE+RX/2YJoItVdGlIscyVyboeD9wSpp0PaGqjoA4tTpT2qPqz9ax+5IzGESyLSeZ/RCwbSZ2uQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@next/env": "15.5.18",
+ "@swc/helpers": "0.5.15",
+ "caniuse-lite": "^1.0.30001579",
+ "postcss": "8.4.31",
+ "styled-jsx": "5.1.6"
+ },
+ "bin": {
+ "next": "dist/bin/next"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^19.8.0 || >= 20.0.0"
+ },
+ "optionalDependencies": {
+ "@next/swc-darwin-arm64": "15.5.18",
+ "@next/swc-darwin-x64": "15.5.18",
+ "@next/swc-linux-arm64-gnu": "15.5.18",
+ "@next/swc-linux-arm64-musl": "15.5.18",
+ "@next/swc-linux-x64-gnu": "15.5.18",
+ "@next/swc-linux-x64-musl": "15.5.18",
+ "@next/swc-win32-arm64-msvc": "15.5.18",
+ "@next/swc-win32-x64-msvc": "15.5.18",
+ "sharp": "^0.34.3"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.1.0",
+ "@playwright/test": "^1.51.1",
+ "babel-plugin-react-compiler": "*",
+ "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0",
+ "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0",
+ "sass": "^1.3.0"
+ },
+ "peerDependenciesMeta": {
+ "@opentelemetry/api": {
+ "optional": true
+ },
+ "@playwright/test": {
+ "optional": true
+ },
+ "babel-plugin-react-compiler": {
+ "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-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/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.4",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.assign": {
+ "version": "4.1.7",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz",
+ "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0",
+ "has-symbols": "^1.1.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.entries": {
+ "version": "1.1.9",
+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz",
+ "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.fromentries": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz",
+ "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.groupby": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz",
+ "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.values": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz",
+ "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.5"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/own-keys": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz",
+ "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "get-intrinsic": "^1.2.6",
+ "object-keys": "^1.1.1",
+ "safe-push-apply": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/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/possible-typed-array-names": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
+ "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.15",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz",
+ "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.12",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/prop-types": {
+ "version": "15.8.1",
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
+ "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.4.0",
+ "object-assign": "^4.1.1",
+ "react-is": "^16.13.1"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/radix-ui": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/radix-ui/-/radix-ui-1.4.3.tgz",
+ "integrity": "sha512-aWizCQiyeAenIdUbqEpXgRA1ya65P13NKn/W8rWkcN0OPkRDxdBVLWnIEDsS2RpwCK2nobI7oMUSmexzTDyAmA==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-accessible-icon": "1.1.7",
+ "@radix-ui/react-accordion": "1.2.12",
+ "@radix-ui/react-alert-dialog": "1.1.15",
+ "@radix-ui/react-arrow": "1.1.7",
+ "@radix-ui/react-aspect-ratio": "1.1.7",
+ "@radix-ui/react-avatar": "1.1.10",
+ "@radix-ui/react-checkbox": "1.3.3",
+ "@radix-ui/react-collapsible": "1.1.12",
+ "@radix-ui/react-collection": "1.1.7",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-context-menu": "2.2.16",
+ "@radix-ui/react-dialog": "1.1.15",
+ "@radix-ui/react-direction": "1.1.1",
+ "@radix-ui/react-dismissable-layer": "1.1.11",
+ "@radix-ui/react-dropdown-menu": "2.1.16",
+ "@radix-ui/react-focus-guards": "1.1.3",
+ "@radix-ui/react-focus-scope": "1.1.7",
+ "@radix-ui/react-form": "0.1.8",
+ "@radix-ui/react-hover-card": "1.1.15",
+ "@radix-ui/react-label": "2.1.7",
+ "@radix-ui/react-menu": "2.1.16",
+ "@radix-ui/react-menubar": "1.1.16",
+ "@radix-ui/react-navigation-menu": "1.2.14",
+ "@radix-ui/react-one-time-password-field": "0.1.8",
+ "@radix-ui/react-password-toggle-field": "0.1.3",
+ "@radix-ui/react-popover": "1.1.15",
+ "@radix-ui/react-popper": "1.2.8",
+ "@radix-ui/react-portal": "1.1.9",
+ "@radix-ui/react-presence": "1.1.5",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-progress": "1.1.7",
+ "@radix-ui/react-radio-group": "1.3.8",
+ "@radix-ui/react-roving-focus": "1.1.11",
+ "@radix-ui/react-scroll-area": "1.2.10",
+ "@radix-ui/react-select": "2.2.6",
+ "@radix-ui/react-separator": "1.1.7",
+ "@radix-ui/react-slider": "1.3.6",
+ "@radix-ui/react-slot": "1.2.3",
+ "@radix-ui/react-switch": "1.2.6",
+ "@radix-ui/react-tabs": "1.1.13",
+ "@radix-ui/react-toast": "1.2.15",
+ "@radix-ui/react-toggle": "1.1.10",
+ "@radix-ui/react-toggle-group": "1.1.11",
+ "@radix-ui/react-toolbar": "1.1.11",
+ "@radix-ui/react-tooltip": "1.2.8",
+ "@radix-ui/react-use-callback-ref": "1.1.1",
+ "@radix-ui/react-use-controllable-state": "1.2.2",
+ "@radix-ui/react-use-effect-event": "0.0.2",
+ "@radix-ui/react-use-escape-keydown": "1.1.1",
+ "@radix-ui/react-use-is-hydrated": "0.1.0",
+ "@radix-ui/react-use-layout-effect": "1.1.1",
+ "@radix-ui/react-use-size": "1.1.1",
+ "@radix-ui/react-visually-hidden": "1.2.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/radix-ui/node_modules/@radix-ui/react-label": {
+ "version": "2.1.7",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.7.tgz",
+ "integrity": "sha512-YT1GqPSL8kJn20djelMX7/cTRp/Y9w5IZHvfxQTVHrOqa2yMl7i/UfMqKRU5V7mEyKTrUVgJXhNQPVCG8PBLoQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-primitive": "2.1.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/radix-ui/node_modules/@radix-ui/react-separator": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.7.tgz",
+ "integrity": "sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-primitive": "2.1.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/radix-ui/node_modules/@radix-ui/react-slot": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz",
+ "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react": {
+ "version": "19.2.6",
+ "resolved": "https://registry.npmjs.org/react/-/react-19.2.6.tgz",
+ "integrity": "sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "19.2.6",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.6.tgz",
+ "integrity": "sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g==",
+ "license": "MIT",
+ "dependencies": {
+ "scheduler": "^0.27.0"
+ },
+ "peerDependencies": {
+ "react": "^19.2.6"
+ }
+ },
+ "node_modules/react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/react-remove-scroll": {
+ "version": "2.7.2",
+ "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz",
+ "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==",
+ "license": "MIT",
+ "dependencies": {
+ "react-remove-scroll-bar": "^2.3.7",
+ "react-style-singleton": "^2.2.3",
+ "tslib": "^2.1.0",
+ "use-callback-ref": "^1.3.3",
+ "use-sidecar": "^1.1.3"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-remove-scroll-bar": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz",
+ "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==",
+ "license": "MIT",
+ "dependencies": {
+ "react-style-singleton": "^2.2.2",
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-style-singleton": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz",
+ "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==",
+ "license": "MIT",
+ "dependencies": {
+ "get-nonce": "^1.0.0",
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/reflect.getprototypeof": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz",
+ "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.9",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.7",
+ "get-proto": "^1.0.1",
+ "which-builtin-type": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/regexp.prototype.flags": {
+ "version": "1.5.4",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz",
+ "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-errors": "^1.3.0",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "set-function-name": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resolve": {
+ "version": "2.0.0-next.7",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.7.tgz",
+ "integrity": "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "is-core-module": "^2.16.2",
+ "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/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/resolve-pkg-maps": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
+ "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/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.4",
+ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz",
+ "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.9",
+ "call-bound": "^1.0.4",
+ "get-intrinsic": "^1.3.0",
+ "has-symbols": "^1.1.0",
+ "isarray": "^2.0.5"
+ },
+ "engines": {
+ "node": ">=0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safe-push-apply": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz",
+ "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "isarray": "^2.0.5"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safe-regex-test": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz",
+ "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "is-regex": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/scheduler": {
+ "version": "0.27.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
+ "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==",
+ "license": "MIT"
+ },
+ "node_modules/semver": {
+ "version": "7.8.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz",
+ "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==",
+ "devOptional": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/set-function-length": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
+ "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/set-function-name": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz",
+ "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "functions-have-names": "^1.2.3",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/set-proto": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz",
+ "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/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",
+ "optional": true,
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/side-channel": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3",
+ "side-channel-list": "^1.0.0",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-list": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz",
+ "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.4"
+ },
+ "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/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/stable-hash": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz",
+ "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/stop-iteration-iterator": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz",
+ "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "internal-slot": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/string.prototype.includes": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz",
+ "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/string.prototype.matchall": {
+ "version": "4.0.12",
+ "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz",
+ "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.6",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.6",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "internal-slot": "^1.1.0",
+ "regexp.prototype.flags": "^1.5.3",
+ "set-function-name": "^2.0.2",
+ "side-channel": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.repeat": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz",
+ "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.5"
+ }
+ },
+ "node_modules/string.prototype.trim": {
+ "version": "1.2.10",
+ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz",
+ "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
+ "define-data-property": "^1.1.4",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-object-atoms": "^1.0.0",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimend": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz",
+ "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimstart": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz",
+ "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/styled-jsx": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz",
+ "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==",
+ "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 || ^19.0.0-0"
+ },
+ "peerDependenciesMeta": {
+ "@babel/core": {
+ "optional": true
+ },
+ "babel-plugin-macros": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/tailwind-merge": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.6.0.tgz",
+ "integrity": "sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/dcastil"
+ }
+ },
+ "node_modules/tailwindcss": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.0.tgz",
+ "integrity": "sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/tapable": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz",
+ "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.16",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz",
+ "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.4"
+ },
+ "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/ts-api-utils": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz",
+ "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.12"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4"
+ }
+ },
+ "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/typed-array-buffer": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz",
+ "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-typed-array": "^1.1.14"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/typed-array-byte-length": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz",
+ "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "for-each": "^0.3.3",
+ "gopd": "^1.2.0",
+ "has-proto": "^1.2.0",
+ "is-typed-array": "^1.1.14"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-byte-offset": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz",
+ "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "for-each": "^0.3.3",
+ "gopd": "^1.2.0",
+ "has-proto": "^1.2.0",
+ "is-typed-array": "^1.1.15",
+ "reflect.getprototypeof": "^1.0.9"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-length": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz",
+ "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "is-typed-array": "^1.1.13",
+ "possible-typed-array-names": "^1.0.0",
+ "reflect.getprototypeof": "^1.0.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.9.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
+ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/unbox-primitive": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz",
+ "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-bigints": "^1.0.2",
+ "has-symbols": "^1.1.0",
+ "which-boxed-primitive": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
+ "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/unrs-resolver": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.12.2.tgz",
+ "integrity": "sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "dependencies": {
+ "napi-postinstall": "^0.3.4"
+ },
+ "funding": {
+ "url": "https://opencollective.com/unrs-resolver"
+ },
+ "optionalDependencies": {
+ "@unrs/resolver-binding-android-arm-eabi": "1.12.2",
+ "@unrs/resolver-binding-android-arm64": "1.12.2",
+ "@unrs/resolver-binding-darwin-arm64": "1.12.2",
+ "@unrs/resolver-binding-darwin-x64": "1.12.2",
+ "@unrs/resolver-binding-freebsd-x64": "1.12.2",
+ "@unrs/resolver-binding-linux-arm-gnueabihf": "1.12.2",
+ "@unrs/resolver-binding-linux-arm-musleabihf": "1.12.2",
+ "@unrs/resolver-binding-linux-arm64-gnu": "1.12.2",
+ "@unrs/resolver-binding-linux-arm64-musl": "1.12.2",
+ "@unrs/resolver-binding-linux-loong64-gnu": "1.12.2",
+ "@unrs/resolver-binding-linux-loong64-musl": "1.12.2",
+ "@unrs/resolver-binding-linux-ppc64-gnu": "1.12.2",
+ "@unrs/resolver-binding-linux-riscv64-gnu": "1.12.2",
+ "@unrs/resolver-binding-linux-riscv64-musl": "1.12.2",
+ "@unrs/resolver-binding-linux-s390x-gnu": "1.12.2",
+ "@unrs/resolver-binding-linux-x64-gnu": "1.12.2",
+ "@unrs/resolver-binding-linux-x64-musl": "1.12.2",
+ "@unrs/resolver-binding-openharmony-arm64": "1.12.2",
+ "@unrs/resolver-binding-wasm32-wasi": "1.12.2",
+ "@unrs/resolver-binding-win32-arm64-msvc": "1.12.2",
+ "@unrs/resolver-binding-win32-ia32-msvc": "1.12.2",
+ "@unrs/resolver-binding-win32-x64-msvc": "1.12.2"
+ }
+ },
+ "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-callback-ref": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz",
+ "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/use-sidecar": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz",
+ "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==",
+ "license": "MIT",
+ "dependencies": {
+ "detect-node-es": "^1.1.0",
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "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/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/which-boxed-primitive": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz",
+ "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-bigint": "^1.1.0",
+ "is-boolean-object": "^1.2.1",
+ "is-number-object": "^1.1.1",
+ "is-string": "^1.1.1",
+ "is-symbol": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-builtin-type": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz",
+ "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "function.prototype.name": "^1.1.6",
+ "has-tostringtag": "^1.0.2",
+ "is-async-function": "^2.0.0",
+ "is-date-object": "^1.1.0",
+ "is-finalizationregistry": "^1.1.0",
+ "is-generator-function": "^1.0.10",
+ "is-regex": "^1.2.1",
+ "is-weakref": "^1.0.2",
+ "isarray": "^2.0.5",
+ "which-boxed-primitive": "^1.1.0",
+ "which-collection": "^1.0.2",
+ "which-typed-array": "^1.1.16"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-collection": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz",
+ "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-map": "^2.0.3",
+ "is-set": "^2.0.3",
+ "is-weakmap": "^2.0.2",
+ "is-weakset": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-typed-array": {
+ "version": "1.1.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/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..7337309
--- /dev/null
+++ b/package.json
@@ -0,0 +1,47 @@
+{
+ "name": "grv-summit",
+ "version": "0.1.0",
+ "private": true,
+ "scripts": {
+ "dev": "next dev --turbopack",
+ "build": "next build",
+ "start": "next start",
+ "lint": "eslint",
+ "download-assets": "node scripts/download-assets.mjs",
+ "deploy:cf": "npm run deploy",
+ "preview": "npx --yes @opennextjs/cloudflare@1.19.11 build && npx --yes @opennextjs/cloudflare@1.19.11 preview",
+ "deploy": "npx --yes @opennextjs/cloudflare@1.19.11 build && npx --yes @opennextjs/cloudflare@1.19.11 deploy",
+ "upload": "npx --yes @opennextjs/cloudflare@1.19.11 build && npx --yes @opennextjs/cloudflare@1.19.11 upload",
+ "cf-typegen": "npx --yes wrangler@4 types --env-interface CloudflareEnv cloudflare-env.d.ts"
+ },
+ "dependencies": {
+ "@radix-ui/react-accordion": "^1.2.11",
+ "@radix-ui/react-dialog": "^1.1.14",
+ "@radix-ui/react-label": "^2.1.7",
+ "@radix-ui/react-navigation-menu": "^1.2.13",
+ "@radix-ui/react-select": "^2.2.5",
+ "@radix-ui/react-separator": "^1.1.7",
+ "@radix-ui/react-slot": "^1.2.3",
+ "@radix-ui/react-tabs": "^1.1.12",
+ "class-variance-authority": "^0.7.1",
+ "clsx": "^2.1.1",
+ "embla-carousel-react": "^8.6.0",
+ "lucide-react": "^0.511.0",
+ "next": "^15.3.3",
+ "radix-ui": "^1.4.3",
+ "react": "^19.1.0",
+ "react-dom": "^19.1.0",
+ "tailwind-merge": "^3.3.0"
+ },
+ "devDependencies": {
+ "@eslint/eslintrc": "^3.3.5",
+ "@tailwindcss/postcss": "^4.1.8",
+ "@types/node": "^22.15.29",
+ "@types/react": "^19.1.6",
+ "@types/react-dom": "^19.1.5",
+ "eslint": "^9.28.0",
+ "eslint-config-next": "^15.3.3",
+ "tailwindcss": "^4.1.8",
+ "typescript": "^5.8.3"
+ }
+}
diff --git a/postcss.config.mjs b/postcss.config.mjs
new file mode 100644
index 0000000..61e3684
--- /dev/null
+++ b/postcss.config.mjs
@@ -0,0 +1,7 @@
+const config = {
+ plugins: {
+ "@tailwindcss/postcss": {},
+ },
+};
+
+export default config;
diff --git a/public/branding/booth-mockup.png b/public/branding/booth-mockup.png
new file mode 100644
index 0000000000000000000000000000000000000000..6b00a5670ac0d5d2acb04b2f1a5717106f53a3ec
GIT binary patch
literal 1369952
zcmeFZcT`hdw=T|W!wQyHQ4mlpsF=_RgeIaOBA`_1FI`#!BqWd!u%jZPB1Gv(lP)zt
z2&f3CNJ0@JBq8*K7K8)>3FQXG_xtX>=ey?{_x{H3pL5n24wAj*o@>szp82e~*52{q
zRa3)V+r_sF2?^~ox^%%@NJunINN7jZ){TNIAAE6LfrHc>}
z+K%$Jybix^as})L^#{7RLtQ<9A^rgZX(1sk-H-qmH(w9<5myf{Z-}*?=k*ETm1e19s&lxh!D839+3Y~8fF<9;304B0fPnyxp`bf2+Tb8
z+Z!0%+~Xhd{5NhFi2r>v+}rbC+`HEEKRM+Q;{7i~*LwaI4FKy0dAPu#L6%Uc-*50-
z{T;<4N-98wBd1JU+`J)caXr1}#riEC7hK>T+A?cU0w^d06qPL%6~Lz5o{inV)Yu4D|XTpImdBX&_3ti_M3y;9{Pk!D6#B4SN6uB}G*gHFZxH7e&|K&j0VmtAJJ2z{-Co-T$5O
z>!EeK;R5mU5UfV>GXMAPfK=3!m6SZy03bzW1%SJUiXfw0TwDMOs_yRU$_h#z8j6BM
z_+RGYUlGH<=Z-2+@yIC~Z-_e-2@`PCubciIXWXC=gh$Xnfh)iz$VITCdIZ6=WjuqR
z{zqH_0{pz)e&(1w0^+{DPW_$sN8r#S{~)1%88ml~An$)d!9S1kw+To7KOFBr#oWKg
zegD5tlKfhs@QVuM|5ujy_5H%HNE)oo&Cj(I{2%ebzl%Y^;tCcJ`F}#~uBvLT?i$J<
zfSZf562M(WK0pUb}ORuie07kVxs%&H{Xvhd01
z7&G|8b8x;xF11VLTBGPw(-X3w3CYhVyMvPw3%YW3gkzj6dzL`62OVd3VIvxMG%2E+Zx)Hw*f4IEY6d*5xdldVlnE
z_VPBj%t-6$W#W;wdm$cD3EV7^R^P<>gNdoWoRW@~HYizUtt;Hjp6FDZU}nMY=v_LW
zM0!{kQ*tG>YZ~l3Bvklw5*SP0M#mm0=w9YL{lFR1r)x}!2s)=r$9uokI;uHa
zmy>fB(c@u2j*1wH@Jwg2GTE?0uu}BrsnGpLOG3AX9!iYKBCI}r>3T*(R~0peqxHrd
z5@;aCh1zdI)=%CbwNSMH{wwd#i&nI=Z#~t1zNSB?Hw*)+_e&A&Tw0dxH8b*moZ@_N
z=TF57#OZ9wsbCuFWuKb-$f;J{uo{dAhu5PxYI8ms4qB60nDOol#`EJxJ1uU^)r4Ly
z%&~voyf_3fVDcBrfKa`MDzU{C9c<;aYyYcpLsecIy6K=f(U@&Uf1>`xa>y>;knq)1$A
z=gUvfUDeJp?L&o?A59Vm%@5Z)Yj#OwhWfHY{hYAnjH@56-Vbrz=de_e
z$jFgp21<9nWX>7klITz1`LwmTVTZ!}*x|~KAW@f;L|u9B7;@KwY#eHCBJc{Q2Ea0Z
z&CuddDjHYN
z(K;)~#v#Z!!Nk6+|H}&Wp2kgF^x@WSFM@c}>#uJSGy8^ETAB&{F1?@U2H?y{d{u3i
zC$>)21spgyFXF#;(=}*`RA1PjGm_QWLugeHYCX
zoh_Id;a>iS1@<|AtC>Kw1hc*OQQM?I^i?pWYi0yh6;etlMx&=PieEQl0G!CkZ+G_s
z&jv@>Nsz@Iv)9J*DCnk4WlP^5Sgcv(+_Wob825GvPhtc$UrBR7-;iK
zGcbLcvK4cNqh=s_y8D9Yocg&s*5w+Bv9-B~Q>RbyTG`L%6|^CB@-s)WhOS|nu}Gpb
zC?srUKUbF6NM|K;Y^cu&xqKUud;E+5IaEni)g$9K}Zw3VASF)m}1^!pAzo;m496a>3tyqESWn@e&&9|N78c=_;=R3*d8^Of5ZDNu)e9Q?o<
zj0LSfB5gE1i-z6kGjqFFrd0K)%~WKUjWB5>`C)MNxMGE|e7a#?I@XA5H>Sh?eh@ik
zz}xsU1=j9`&Me!5Ax=T;a{rVd*t6GtQK?ZA(8QK`TiCIw3B$!VaV?B}a7KzqbI#Cg
zj(-NWg*l*B6JyJ3Y4K=fO=bvYT+rTiRrBM6*gaK?xlNvnyj77U!yiRkIdW2CK
zel=7-NAs6GVFsOXx){jlO|Xr$O$R2P!}T44NN;UlpBz!z(tzQ0Pz?H;juePII-22NUnT--Yr&}I
z!dO;cC&YR|xRxd_2>y&|k>B_Pk{9eCfof?F?qD)?cHv1_2WNEEQGEdq3EEB3+)!{j
z0$edMn!X(vU!K@j`>E3M7O;d{%kq@|)1G%@)e|8_Z_?l{YX}X9=fq#DxnF
z10-FFFcSVw)C4E4F{z*hXhbE_={yT~YdNIo48|2uRG-$Z!JF;p|4B8ir&M#h!tj1)
zQ(Ep{Onpci$x~)UB}LZXKTa^JX>vi%MWq`W#^~`58FE4N#m&D^aFe?bUREPe1~`jd
zN&m<=X=*0ID*T8XsD5FJ44l}6X=Am1Tz>t-zNllb7@9it0Du(xp$t}t+j-sS
z&(jA}q$e}cMR44sqTr*BVO7sp_C6_YomuFO&(b}z?(y43?lfqoHnavJmC&ye_TW?6
zu+l>H;@4LvIE^IDbZlS}=4=2macZ(O?o|}u7r+9F%xZF}hD>M=QB=6|pv`S~V#b6e
zw_P>5M$EXmZGDCvHO#C6bR0p>!%Kf^_LjN(nv%NwJs7SCQfKGq77RrWt5@NHk0Y~H_17XS7$j$6Y&VdeggZ<|=n@2ixe5S?MwxN3*OK}__X62pK8m|bN
z<=_?m;OIzY^|+DGMSL&Sp-BL4*o1_|v{O@Hh|P%zw{wnuWWHhPY}Yb}L_J4dsy{v`
zVPhzUl^7IhZ4)+h2H_*4Iq=886lV(6aMkGkdW>D@O9PClW&ebCrpi-MrasRmPy0Vh
zj2iK%ajXfRJ$i){0YCT`HZa2B%3nHXvs&^7Y4I)o1v$@%zTcPf#z#@R{tI(@&iBf0})
zR0bJZJ&~zB%#eY=th7a2jGcGLQjDr<$qYo{2@bfUXeeFvVIefqm1)%;gL$-4jyXc;
zyMzrof~l&!pZ*JUOJ&0tHgk041q>z;Lw<;u!JJN#NXF;ZD(_(KwW;Rw)V;5TL|iwS
z>|Wgc5_(}IsIWFnn*w=~*5aeQjI?Isvd5YW#+tj{q8ZEtVlm)(F-+X@?fvi%>(jep
z1X?{1#BThOamv8ETyC@jmmd{cG&*iD;_rr@o|^Kkk#I$1EK=$Sjze|TX?;7E_fOVt
zuPJh3U*8AU91MRO%Q7QmipHn7!JQ$+`}OM^e=7z+AO}>4Du2?fs}=KN`fOWADhSHx_`uC6*-tF&
zM8wADSAN69rQzx{GCII7agWL0+{xb?3qLIA+GoftJr$VfDuF|*Z@KPi=(;7K-p^J)Z6
z7HwoaC1AcO!N>A@qY++m*lWc$kwj$2?6NOIx*eWuC|ZBL%_M#WO&f=J(sJC#y4xB8
zIU0{^B6ni4PyIq{|3ulRMNCZqYp5<%(#0$y*Z*deOHH{Wo6}?2)Zqr>s|-&rZ$g{W
z*kNdH!U}OQ?=2ys*rZ*@UX1HCR$avS9=y6MRa#WyFeM3nr6baXdu9yLs~ulM8dE`S
z@339x*@X|sLAqJN?AOD3sZrT@wa-p6KZb{`itO*5$kpdNCG~z$`NDH5
zW{20erO!DJ=l#B0L=hdIH1S7qBPSeNYHqX;8;N<8(yH)%+T4aNwW_}NxCRkSF?T5(^q$LSi6TPkVNSlsG`7ZI0
z`Uptf(`0{klsT-YoV{3zop_lB(geMBf)+`NLajO|a~1m2OjRQiCUD?~-IaE;3+t@z
ze3>K-5!29Je36{vgd6^1@yZJ4F_E2&@yQ=;EF@GTfd0u;NNzDOU3g5oxOkWB_xop%
zV^-HuzPjW+Tv=K`saQ(PMwUb<&n;+no}6BV!o{rMV>y3jbK`X?YSia=uhZLT^jXS|
zpK<&V%+WfV!Z4`%GcBhAX2Fl|CS_e1YiKV|c-kynI1rlXj>C0#NTKW;um`>vgMiLR
zGJi8iuiGRINZY{6+Y52)!&J1c47ATDr%F04Eu@kgCelWW@v*EE7t9EOk%8Z}&+ula
zkA;52Sfkd{tL{-sGsj_~T_xkw3B%Mch|r3;-AQJ13!&l&k}g=&CUN*t&Gcj%S$IF$
z(Hyoc!oSfU#Ioz{Hc{1(8;Gb1t;63cS{COGxy`V7Z>>4~g9Ev^=V?fr@4Ss;su#K9
z$KX5HwzGnA(0E}n=ITyawF9ZWf1$YW0}$Qdht*e#qH$({uWEG*)JAM}36sAH)gmW6
zxxoj32IXDq{4D=vvD{5EC(dxCAP}R3sU`d=|OX~_sJOX(X=A1P_3|Er6
z9-E9n^q4gvk1sF(SaQT-FRvqQvMo%z3Bph>gzb?D?i!Ofb
z=PWT!Pp9Dh7_o^|%h{=3G4fos_aSuZ*ZZNlalXQxjVI|1f1yGBEXp73B6CRC43pU*
z_Ia16+D-bQhY@rloy>0C=W9--Zb!|t=eF=B?AlwhI79YM22eeo1)W(mE-SOP4Hnd9
ztH?SUI=Xf0&K>;Ww5VK|eDk-HIj+1ON*FpNLf&M$kkxv&*sO^im5wHZKFw{ArwuML
z=^e%h-2?LW+ks-Nv?wC#^VV8c&N#`c&3S4sFKw*YE0%LO)yr6Zf?3$EeV2(ML6v@v
z_HGrFE@`R>z^;}efrb8?>~}jI9FovI*XHgPc+kH*u;Bqz2EB&A5%2JNld
zNEfpYa_`CaI}@CDX5xp;`>Zqb9ivVk(c7ZPbj3m-C5xse7ONKloeR;dh#wB69I$Du
z)_7c>_a42GS^7+?UNM_h9~P`GErHRQzqk1P8AJ7%6PN6hfp!PGtS`osPN`U-YB|$t
z_lGIP-yLi1NTyZf<;iL=kW{>Qrg=j1i$1{$X?xY|=v^nM!_}f1Z;aetn%c+0!@*;d
z8T9Kk7NNdEpS677fj4tQj@nwmFMP!b8mxyr9v~y3|sFa6Q=OOS~bZ~$TT|FW^DMG5b
zfk%pquXT=S8-<
z=x|-Q&G?b_qb2HbS;xru!6P^AL|q$klhBl|
zf5E(%8!_w;FRMn(u8cg4==eE|5Px_ImsvJcs>
zWU>=Unn*3mPkjl0r$rfk9m^Q2B1l@{PV$=uY8*-`HFX&|=&nU8jFSkJv5z}+=9Z4r
zwGqi=9lJtE88cO!mfE*_o&C|n!F5pV#U#oxxL8nqVy-1}EDy6X|Kb}`vD?_tq58bD
z)As16P%&a7U+tMx0veHc85cK&nAK82j}>mhIt}2XQzGjNNG(W`exe?(nFUJ5fz)cY
zzb1un&zr2Bg9vuFz`4a?kFAQgq(*nvbegbK!=$1pEedvHj>vS*XK#}gryT=PpAZJO
z@ZyLVUhS9{PN}Y)lV8aV)hXG>jJrg
zkgiYB&_G}Udf>i`j=%gDvbVjKR5jUfc(ilpNj7x@y
z^x;&h3JlxvP;719Jb=4&UkF7ABuNHF8YE9>a3C_6d<|BR`U@TI#n+nL$G?#P!mN~1
zaiaQEby3J}T20+4sMwbPyCS6M=>S&C6x!PhnQLwuWQ#v2@08QlLa%+3hco@|Q2)AS
z@b;k#*uTCES^oj+fkYZN26TeD76BU^)s&gE_^Q#x%lZ7QgJZdEm;=n1t?T@Ync+-&
zt%d;~wCrM8y~@d|2x7C&xA!fgX!+d;N0ypw+X-*(Zt#4_wj$%F&vnhtL@A3{fZg&1Tm%@*Bs};sg1U77&D4C^Yj8-{37;jve&X&G*nKT
znbUQPpZ8WfcWEWQ8V+CR{;`OQWpKB`y9RZ9XP?}w%W7$kp0A2a41cJ`8?i{!J+{6x
zL1dDoox+sb7$RJk_IiEGx4>Z-Qq0F2ZJLmyjMQ|1gw4WtNRP95J9QpK(60}dL=^@0
z#>oNm_aY_=5(7|W_1*TS+=#Oz=r;x%PaM!X9O3CvRL%`)iZYxld?qC7Cnsp%WibCsanU**_%!D=QGIDvGvwt^PtT&?!wD&q9}%%_xr#jZf;r5
z{!uNMKrx2X*58ZO{Ty;<4%msaxVv$&pggkl?EwGBVig?qj3nc4i{34v
zU`DE=S$CS^z3=#{;y!04I`=BJWQm;&k97N_ej^K^61aAC^hBV)Mp*CLIdSV&8U*(mXh6)?LGWQS-Vt9^{ME
z)C5Y~>}LtXcsk*6=ZY0MDi6Xnmd~gC+LKRSOsm&f5wT5?-;234y7-hmWZIFC;DczH
zV2-dH^R!aQVHp>=4DYp5)t#uxP)Q1L(X&bi7iwLi0hP+noSM!kTDyWw&1EV{*W(2L_O{n;$
zvQbm*z!Ux{hTV_JPR$+hQ))K6zKOl46tfsni$hmM-*;_S&q<&d+b16^CYa<(s7^_E
z6yb;C<(H1r3-93Ry1KY&N%JiP{~+nYz0#s`6_6TQvz#Lf8^sSfa`#t-`F2N&lWxZc
zy9dXZ?0fvdG*XPI&mM=4&eMOTn9;DL)2BW=d39$GKJ?Wn3}QxgJ16u-vk)VNBf7#D
zinDq;xdti5oqNdHU)Z3fVHS~
z_4NfQB;@Soz?l!)VCL8tZE?nksdjK<7B=s_&O_rCUsFcc@)<}`#>jJbZn?w9C|d)Y
zS<2%?WHsmmdh7I)TuJ$7IEJDqra)(
zeP<`-vytBeV>?_k}Kf5HrK~_Lcd`+cU&e}g1`=X>`uP#}f
z8r;;0D}eRvrM;#G+f!DeRV#qg+=<2Od%d(cg}2xc9KZ5v@fO~IfZz6IJs-}c
z>S|@*uR8iMz2e)D)L=TlI}{x-_k5Y{md77e^-6IL)~k3=)?c_<)PLu|kG!KqD#2!g
zRy8W4XFnGGA-=K(<3ok@i0fiCP3G`>nMN6@BtxqmAgNwNmH+1OSj$v@PE3#9>ic@Z
zd;WrUa}_PsmlUI67U6+oTb>TNoYc
z2zmGXoapCsF*YpYg|G*M-?P9-ujx+5SGLBk)I~TQ0wKxTkH&Mt{+uw{jXu4)E6r{w
z-peb0sCTah{uWRoG{|Z%)|XN&k{S{G1vnsjVd)Dj<`C!PJ)Q1QcDOzNhIE}dGpTAl
zj<=*&-KKXUCEXU}=jb<7Uha?=f4ckRyV=!MKaEbBvbO%^XOhxY=LjMD
zjpAcloX&Jv&9QC1yDuIe*Ah(hF>aEMG$mfm{FWo6C$T8lv+@f!Y^hFrQ?k##{bm)`
zrp7~RCUszYNA{GX6@EorbbDWQwL9ax+Ix`1n2A5X$mq$cQ(&=Kayd7md7;}8C+~Qg
z8gzX(_evbURfDPfJ9mWoIkmN;yWp_4U{8}r6pOvdNnU-Q;VtPopxdmM_zhL%5a3C4
z25zLzQCIA?roa63__naPVM{^vJ$5H%S;sz@Xurql(ZE8;;8MV;Wl8Wd?GKJo_;_J!
zTH;dC7M|cZG?e~~zYDXK=FOkMXGE@vKAxcY{zO^%cAlo6eBan
z0^QHbU}6o?Ok-$?JU5!-{Cnbs`j={JPnzgNCk7pE*~0sD{2J#{_mJtzI|oBz52E8#
zR%`1K`Deiz&SY~gnBeK_r+8pju2h2yV|@p`#B
zvYYo~WdpK(4oZvW2LjCy|TsoZ;;&ni|_@{zFTqFh|@+*r@i5tLDDAI
zV%m4yc%F~Uds3;XAZq(oSyMMDU!G{`GwS2u5H@w@Lnu}rDmPmDC+-rM3kdYDKtF$1
znb*Vx4=k8P2c&A;>Ra6mt=q3Du43Vv>7q+LuuEG`DE6fEslG}aSE_kr_r-O
z+^Lct18j4@0ZG)eeesGJOINwsuXz^HePBe99
z4R;V?!|_fL?MUV?4iOSkuRgb`n5z@hJ1BMHjt(z_v#eTeiL)o59;HzpXkcG+k8bmt
zc$yEG45Fp@jx24~Z0tBp)@0~}5(`PKwX1)qHWwZ&I^;%4uE;0pEQLxhw`a$tU=`zt$Rmg{}^8KJnVA
zfIAr15_`=#*0M%+2pw&`+YHn1U_W92O^?Ov$xf$$q64TgDeMNsyvaw=hNP{+&*0&^
zjaQ%E3RkI|?`|Suc(pShu?_K6S=cdjb;@DR4@ueI*%RPXR~Ke=MC*FBb7SdhEam$EB7wGcIw-DE=+v6&s2Yb*&hGjZe>NfYNPVGJzH
zxlhVEZj}AicRw?RGN@C16zJ7PuR&C0`QOd&Aiz4Y_|Unc2Fdk0P)H~#6{;J1OXrD)
zu%jK-0?j`dWgy0&K6J}V_P4wc+}_KxzVUj*voils-5Bgq&^BjMXYOR-MfqNgW0F(x
zbT*NuskmwMB&yGM>S~q-NipKYt#G;mgXH@lks7f$_pQ7VOUG`UA!r5D>Lw*Q_96Gy
zw=Y6BEsh;ycAaO8ip_aej>7>CHhirXh-cn2&XThJH;@cYpSc)mEt}`BN((0NJya8Q
z8RFm=LkYh#^ak;9U1|7H&Y9LoPLIozK&PBgTFSkgH`ryt$Y$%`b`eIj(1RvUUkoE`{?S{`V>ctkkSCL?=0FyhO6SKbM;qRmg1
z;xsR&nll^+66+I0fy6%Ra>m=mg80y{x$LD3m(Gzf-v|0Pc$DelRJNfwH3u*M+OdjX
zoF%C_4PTrcu1T<9lK1}uatT;@?@f+&gO9*o64xb8ul5;pe9|pC|77SG4Zdkssy3)-
z(gu`viBTO2mHFMlJ_)@Q8|(66ILRPeD++#8pVxdd(4s%k^knGeq>0X;A)Vu5n9)10
zD!f?VU+J<^Y=jAi?C>gafrUV41aeALlnPz^_)myWDwek?U4|X9jq2@Bc}*KW+4klm
zk%pfK*k6((f@EWp{NR9kw~;_2!9%efzSneJBPS0NULvgmhRYagcY)GD`94{~kgdUj
zlhydc@F%c-hn-##4`@}Qk;=YH9}n<&ijFKLCU&GB+d108s$G87FrVGH%;jy~@@w-Y
zNIKiJ)!OW%tkaEc6YuOw+6-0OjmqDGiUCoks4gk>DBkNK^7Ww+2vv))y;n;%`N!;6
zYEW-Jdr6h&s&4ZIIDPl8j)6~%
z`H1rI$5|k%17p~FQGAQLF^)Jh$1Tg|Qt?@*1Dt_o)gz)9&cv>Nz##Fk9!Z&b;x4da
zs$GOu=8kL+!oxt^qzkv3-`zOQFwIA3EIvnkM)Oaqi|D^~
zVZZBLt;Afp-0#V+)`)QXv;jkOzW9LT`lc9v0J)O1jU&vM>IB|lCC}Im)g3;YE+3Oe
z#nQft|5FOkor=^-4@`Z;yqK&`7#+$^Zx%mK{yaM#619O0B4d1P&dp2fB6x+}x8*9NZ4(_loq>Zx}JE(IX{t1-{f9gr+cz-*@xf{ahQIYl^
zzS1ykSpZ#D+U#W3W_uAGU^AZS=9ddJy^EegGdgzKtd>{qF7nGQYwYgKNqjVaUA+If
zjI`(HBw2QZl&_5@<4aYr6ew9IUnjLwxN^EMSU5Q*Zh_EV@dLDj8LuCq`6iP6jDy*L
zsjr@Y+q{e-+$Be(tryio{pDf&6*)X3c9`T=<3qwtor$hEMN}!(4pA*~)!vQPBh=u7
zi3q9vVU`zq5q!kozPvJ~Ce&8Rw6`X=1``w`=1TS*?ZHznqK
zq)8gA?E>$h=QWN|a*GI0TAZS*bZe!*1M_?zcm64@q5(h>A8k42yNoPt`$zfnDl{~@
z^fv1-yf8qz`Ye{~#yozHWqE!qr~~)~Orh%KkjMW*sjNC=j0Ky}@`lSN9kYpiu==yn
z{F>3kuOz}$=vjbSPVOBY;`7s3ohsB|QLol$q{BWjkK2HPM#QvN_rlc#w&C`{ljtOo
z`usy29sfFqC35>i{(ulqZ;o%G#JswGPAU{&UAMA;1z}#+8z{HKG!Do4mz8inES}-c
zi;bC}Pd~G-u3`L{k=@#*o0ENy07;yno7d3FYRUUm1+QD`i(n_18YGm_^kL2$On~o-
zgs0WF>{eWih>KKgy^b&5zVDpb0aS`D9yzcww$GP%Svu#A0Lpmp7Cwwgp4j}4^s!4@
zed3eaB2vStii$Gz-!`l|ZerkTh+{t}3rG%D_*)q9jy{k9?l%zECrjh7VNj-VCqA
zaLzuzbFbAa8BBix-+FS4ktWMJdppqtGEpa+EVok0#$uCrSN<`M1%ux#OE2OmW_v
zAG0kWka>?cadB{zQDAB)!zz>1K$Fi}GDy1ctc(z!1M)38qw!{
zQtM$5%_Qd@Y%i_WftcsW>r!u{jXp%~VLq#D>oOHpIw@}(l&l%$S4{6MJBZ}BZ{;>t
zbHmj^ZN7g}Irn$!YPz808vl`vR25O(>q(5KRq3bTJ~nR4G}7pIFMDR$DUesohNI}d=kAVg#{^${A$DK
z&ESy_i&vL}o;-+3YR#KhDxQ(-K*2;3bSvY+Nqz^{)ZbSE2&BGYTKppVAB6l<=Ip
zGf&cJB0OUx?QU*i8YFam)jC|%{nGbplB(L5fSQnrlGDoa&d)^qh~>UsiKj_Vy_^$T
zH7S8Ep{BQRV~3i{rs}rclx0vJ5u`%jBzGa8W#^`Ad;7-5&$bnE-3$0jnj5ZhL!DMS
zbZ}xArnJL3=^_jk*+$Xe=C%*-unp*J97=ReK0i1}L!SCwJXG1)y6mxskaL~*d*2a!>#2kt5#Mh)rG%uM
z<}AM8bHX#iP;O0_3Dytx@46k-(%_alvUturFmxBq=cQ(ARpMTJAF6Nmh4qu#9eRZ#h#s~&!Yl}@3;9CO&Lr-WY$40dn*@$^d
zorr6_?+HjA?TkK<*{*_uo0Kiil#|8GEx6?H+s@#D)aH!8M-|^R7d%`
z)ucgASMW&kY;Vhs5}v0meZ*WXQFhdW?=Tr^wwDl7w|_wC4|;Vs!1=(KRRf;%3c}#O
z)wUSku^4dT8-`VER_}LRPSy9HqT{jLA?i@poqs1~8TKTQVZt$p&3A!}d+iIXLjP1skou|O<+O2_O5WnjkC;e7++Zl53c7`
zn&MhL%lZn)0!64e9VzP&;k5(0cUW0Xre*1Yk07%B4N1;P@gjJx_a8OinLyF^Fb9Vc
z@?yewiufN4g74;XLRM7JTRcIW2GKp+7C9n&A0bS5#_WWj{7B!w59FvFl(q+{&J?}pGY6&9zOB8w`Qzf^{N)|Y7yGa-fu_hs
z8IGs*ts)@mvl~u)u;>p~{4RLh=wt=^=rL>n_LUb%6PpdYme5|QhRQu&k{or0W}9X#
zRjZb0Ki3p(P?>KoHq)xfaL6k1spD!K143WtVACa>+wWE1>jT78QAUSi&$LBW-#dWeHBTQ3Pa^A6qeGA^@
zS!PGm?VsMWh7RW^b7k=b_nag-@6=FNgCPyJgZ5L3AgkA%f8s0Cg}q?!6E1PSZ+iEz
zc*^?-q4s`Fzek57n*8aq>}DrP_^bP*hKa!k6IqqJ0vQ#-j*9a6%q3y2Q@GyK%_wWC
zY4I#Vt-r4J2_zzUdIdc+we(hd+BOkeXhQzdotT-7}%q3quRHr
zIR}&G6GOFD>M)TEr
zN&8$C8x^Fgo2~h3Ea2yx_CM}@uMN1%PuuL9K0UD=9Gwg+KnJ&5`B6MSYQIRUN*a~A
z%+SCU$CaI(eq=N4AWkiimrpH1JSpq@zNCX}%U~tv`>264fZ^5FZ`#E=N(KAR=ewpg
z4~2Lgoj$gMLli4>s6Zjwu=B(z+w)1gQjMncQn$@jtJJ%u)kigi+!QP*3t}BhE8)rI
zq0dK4I`_;EsY}He-78zsk%~F~-Vmi_{@Me@r%cD5H>=f};ui0lyKr*n7_#B*=M){8
zm|AGJTy6Cl@cVt2QagFJ`c%~h+Wo^jWnnBAsl8sMUCFV%(M4d1-=`2#05r4d6C
zK^>du0b{?ZKmV*nF+DcDR3ktT%|tXb+2J@&uw;lIFnkrH*EHw|3;N`$`{t>r)_|1v
zCvEFE+U6;}`b!Y!oeyEDxvlyvy;MA-0_N{cS&{@}60)kKo7&F_&SO^2h>FT}kCr>8
zNIg$d^Tgg=-0^uj)lA+fd^(3bH52k3B5EIgY1%Q9#5FS;OW`c)5O!qi$IU3rQp7bU
zhFB`k%_Ht!SbMDV4*M5d>&M=jO&_f`YDckOw?=<~TQIs>9Kf;-pYQVuMv}PgFz=eP
zFY$+0oE$@^Lqqz!^-&VE?4yA-Nx;{2?jPg+L@13GE)4X|7J!qpjK^!-iS%7(+hVo2
zDwjyjNtXHEpYVx=Y0ir6Q-)ipiGA$!#qd)iygDOjDiGZT6l)PPq~uJ9@In-}KHMm@
zq#an-OVuv*XW>6tOc^C7(jZh*{@BBwGNIJtvUkFty@9%Ck|MGxoo0KO@P)TS{DC8v
zo%&A47zUA%9DZ~2{?fHy6bb!EW$;IBcfpHnWA}4v@0+SJJw&y?pFHwJt}Xfjv=X1Z
zr|WRzvh|Flf9EseUYcfHJ$MkP!HS1bvMiHL_bjuL_uqnCMxj%=L}Q;M>ulHq{Np@f
z`h=M3M?%Xkf0?#iLZMse^o^r5&q8`@Ts1-I6Kh4~AZxHX{JT@;$F4vw?gPEARb5JP
zP=G(p)zX4)U8(88&-^Fl8b+`K47lc7p$PMNquUJUW8)?#sh@RMUjaD&6KT>SCgQ@5
z0e?oXY!~}^Zoi7Tp2l^!OI!(+f?=)Lc4kho0|lP}!_ha8U_aL5E19dQ1Yci&Nt=v~
zS#VU(UuTF>Q2`rTja8Hk?p<41m6wPB86lpl5w!1?StBW#m7S5hysf*VMK@*lUewK@
zD00W|;|!51h?G0`x=*MP$-AL3w%BiP4j0i(%s%v2oYFaC?^PrZT1cp!e2~8>Ic)CA
zD1$DUk$iMJZwwwf6e8+89jN=BjBMG7O19H@@48n9*jR^sB^C)S)zTw8O=bJ#6)s)-&wp%LS@6lV9$V>WKz{;$hyp|#(*
zRI3xe{(cug0M)o5my=BMeO?>DiC=(q8r1SHszbvaqncPxD?lYQvu3xMD)
zF4;WKvd5w0s+CfhbcU(x_=oz)SE1aRJ4GV_I%A*2pDn3h$2d$^h!>fi{bY|xQu`W+
zbhy^`xnJjkPO;d2g3Z1#X&oQv>aA^@^DXvdei6m`zK+^P-=VQ@i#;9lGhtDhe+oD{
zJTXaEn<^!;yz^PB9LVdBmqf)XEcQEG-_5?Co_~8q_gP!d=Q^6&S*K7;M~96aTqImom>ptTE-JPpRr%MRn{Q~zGKc>ru0-)4c>D`KTP9)_(zjJWHzYLDKYn_Y;9e#?*%>QCAnF-PouPyC(bVMJKZ&?AvNc8v1i;
zR7`RPqwfOe%?QNdY)%bgceOoz)7xG|Wx3%YB`@7tgEj&o@G9YlEqKs5L+aGE
z+g~S$o{fs^Z>%%@MhTVkoz7_L4fXJUb8%|+gerzG-K2`
znwcuQc&UAI{Np#T1bQT5%d*NJqGPg$S@?_t+@XcVGk3xty>#vyGwpo;U2ss)FI>I2
zOs@?z<&R1S!aCbPiLK$UlVL_Lq0afYi7I&I%{24z4w+^^KwL&~%F;=8l_qj4&TJv|
zXX5lHYy-+he8|RM2PXXq&R*J2
z;VGFXi#S!Ww~5+Q;n$h;Nj3RC1jI{h%waR9G$$Tl>0~jPqS*&uzJeM&wHNqDV9GgM
z3Nq0&V@N}dh}6id?fBpXigMvQ4EIHP@|PA4
zXy0Ca)UaHOaGGQdC8WsjWaXda&gd_OXMo+4o%}
zTT;oM6xqfy!!Wk8CZX)Rk?dQt4P!_MVT?Uyv6~sph{4!>)BC=^@BBZ@J@=gFo_o)8
z&I!~yduES^yaB5?-c08i|0x0+)_%CqN@7myFuEXM;k#K57K;L01?A}|#Rrq#bMiU1
zE@$(BGnCl&%+LMvnYoG!s_zUYf3reHFCSbp2|-26Z}5nN@oSn87xDaJS*gt#J|Li3
zwwqI}1Q%dh=)tHiZg1u~&?@6cexDL5-}(f&W_sUFel7GPp9gOa+=wXl6(C0Ddd3?e
zW$95-zjo^}SH}wOr1ugT{~Uf}B=$99sHZ_#Z_{1!@y&zahR}}K9>Ftjy^j$vc!!AP
zVKwu-tY5qJcOb`TDY2Tr@rIe`N|9-?zYRyJB-w^zD#4&riF66VjT)LWy9mKW{x{#{
zgQX9hW80sMK}Cl!d$}Y*Zb$o?w50$FIYp%TRD!Xv2p|NNDA
z=VGgL%+B><33HN9d2>Uc8B%~G7E&`o?x~ZS-LK(kwSIt@QlfV`hcmpY)y%wF(*mf^
zx-Bj05jy@$B}c>DpTQn5rgMEoWcRah?(B{CcDq8RI@D_Tao{;@ct;C@emEz`aFgOo
zbQ8AvwY$m1EIeCCIy~lr(vBoN|%yaM<6#R13Ga
zpD0H_PYl{L!ZvIf>;n-sRVx3t5GA2Xh(kImp-9cc*E}sfK8*As6gyp$ZKaU+#Kqex
zV?yDBcS@j{e)h+|veC#fH~oHQitv|q&L8aC>qTN?ViEaSI%VlT~xEwJOSQ1@TW+AxNSK+TyW;qDv!
zB?OVT|1+wI+8;tOI@`eN_bHcDDQh~-lP2dSUaCJBRF8|p)+LkaE|9HTlqE(GY2Q7}
zb15S9wFr_;Cpq(7y(j5mlYNx$@}H4k!+E*-7knJFo267jZ{obhkO9}Xz7PF!t%xA+
z=qzfpY?%x@3!BK}IaFF*;l#?zt)Vf(f2`ET1eDsUTqe^IK8yW2+neX++q`_WwErRT
z&khzY<&N;{R)=B3>qnugWb>mCpdGuRBw0G|&EkE1;YMP0eb}y-WZc-LgRlxU59}tA
z&zQh^@xO_|sU$-lRIvmgBm44!c1Y0QV!oOO%cGaA$XQ()4_+a7vDgLTFL>mX0+0x?
zj8~&Jdw9Y1QO-|9!b(Qvzn3t3;#4scQs%wevcfwS#Q4ic0=$E&-MDo0`zUIvmTQvQ
zP(4wTmRksYev=>(LY~J@0D-L=&n9>Mo$SDX*mbpHDQ3R}%^^7M6O
z&>)%U*0O?~JH;Xa_4wcDWsene@ySk``6U~t9h2cSQ$rEzm#6jlLdL1~E69efyt`{R
zqT`LQ#?v`jlf~B)#r#MAhPvj9!ak;{Hnd#W;Y9q&phyn2s}&+BZtd})bJeuxV5~GNQ-WchcaT}
zj?W4{{WGdi7pXX)Un8^1>GD)aZ=&b^?St6J2pTbIy{WA5vL;NqKRjN{4T!zsw>G)_*5Vdl=#o2{(SN^AQH
zY_jx(_me$weT}*rvBRecr_w;6zCWZ1J%XTf_*O=-&rfi^HD4NVv
zN3Xas!EN&EyGtRqU{vus$&1gQ={Swpa&Ipt-#bx~?8SI|CgR`Q{!#c5seMl3hyOxd
zdN=n4d-QynG*aO#sIe_4+Fp+En3oq8WZz9W{iD{5`{gTkUW;C{p2o>LFC#5~zW)cI
z$L?aprOboV4$o<&X%@$UnkyGm#qMm2B0I4BnduI)Y{PHOBt6a(zI=Dq
zxBGUY{=+_X&p4Kxd8OIpJ%5Gdu2UKlHC^;rwZQU0?rnmqswy6I^4^$4<7WU>Sdoax
z#bOK6OI6J8NKHk%NGb8{1u^N12W#z7eR+2X#utuJe=oNE=VPj>vkO02ENb><4z!2~
znn6c8MVTiICvsJ1ti9gMEz4%&rw
z8O95j2_%GF@(r5<0PmG9#;AoUd3>(byVJh)W}p4aAHXJ>o@+qj;rrTY8%2!7R2TNG
zF&Uc9#H(lK75g6c;+SDgWtKXYS6b`0P|}2aKXA*p>nZVwFUQdl*!u})c+6j0R8$Z9
z#hG&&{IfbBJZ%WOVLfc$xm`1f>W^%9~Fm~IWJwI)uGC%H
zX{h2n!kP>#k`PSvFUorQzZHJ*JXvI~LFZikH7wInY`)UvlJY{Mu=P{x&D8@5s@qvX
z_Rt&0ZC;gJ;6k9pyyp{$0S-9Qi-=F-MD?YfBi1tIl0mCfqzHzm{U*aHl^sqv7)HR{P5f8iBt}Jmen&{>o@k}lX}IY
zR}9Bfns*3H=QbYd@SYXq-fn%xvVdb4?sX}L-hr+WXcE%Tti)AyL)K78iI|v`@Q&(J
znv-DeywZgcDcAa3mVeWJdE1Y_}qKub=I<7tjlJ9n6v89*oTT!%K_Gdeo(4ZCu4dgm-9-J524&U}}OGGxe
z{~U9-YyEW^teVI*9#)M%O4NnCHkHs8?v7$rBiEjr=~e9sJ*|A`t0fhT>OE)y&~vJ~
zz#^IK^%g+?q>z4^
zy~APy5Q~X#rM8rVQNF#Q0zeat_PGOxmzW$EY-D?dH9tRqcKxz9qzT@*ZeOl2sG%%N
z*yW6G_F{3TsNfF>KGejUlB;}dv;>+M)nbQILw^DL-xuXrSC?D*sWHKrzxMX)nF&Z0
z1xx?hUZ#_{Wmamp`y-ehbcUe)eQAV`cby3+GZIRJCxVvxz
zuUBl$l02_FpbF_h7iI*u02ymJF{d{7H>5og(%jolb%UCA?>1UrlCYB0%|GQ#_J(-1
z`hB@qonA|gJ6b%0-qAp?weChM;0BxOdNXG@o61i?@YEP(S~D2+y2m~M1Hb>_@H->+
z%?EfQO^_MyDEN$otk4ErOVirmr9Yv{=Q2cd3e0*}#&csV<#H1x_O?NM*_};q%u+#-uMbd;xbo430adC?9$eMk2G#CtAVS0#RagwmTu2d>dRjb*_;9W
z_LI)V>KPn0a#Q^y;D_j3SlAFTwEkk8+ALVhI1WA$?obL_J58h=6(0vTcc`VLl|WlA
zOilzWnEwZSVhTI$G)M8BS}%8E@qQfTU__vc?Y7`l4H{pwZkIP=S^Wa__}}s+I{frF
z?518af+OnMXGsA!awX)MSPgHR*PAOn*F%@`x9#P%gCfFxzJJO8fy-2Z{7IVqlzp@=Un#-{uEvv}keUmR26!vd@#|&2^;zEB7lP
zoM^o9sw=enI_Qs6_>lN^s90gVEKG?@B~%o<+62GnI!q{a6)ZTi3DCdiqlJH&L$bLxP`bbf1R$
zlO5uL>*>guP~8iNJo@3Rkz4(F%Ru%ami-^~`ia)wIA`KMjZ};L-YofzBmNtoQ(Q{o^Y)b9azWghVbo&{Hqhy&meB
zV@J(jX>5EKVWzW*r`reXu7nQ|LZjDO&K=+FLHyW5**W@#4}@vjnfO}Kd>5aiUgwNk
zGk!@Sd46n(9;)@-IS8Xl5Pg=>py^15#~5nnLKqiA=o}Z-(bG~Q8o_~Lv)1!IPh#_D
zYdzQcAJ4$U0i~6@0dS%~T~I_NJ^q-CuQ3lyv{A0ASNf9C70t16ExEMzdL>;0o9WK$
z)Ul)+CBkn=p_+q?)kHb&GUr=pw#L$MWo^R?h*HJvTX>lBh1SmSK*Lau&Dyv`N8xd^w=%tT(#B{2QAF6OV#TIuzCe2ZSs3_Kgs0V-gNH)wRS4?STrCHyt6
zhWtZ8hFr_o8AjdL3rA-9@I$%L_8k+e_hCz7RGH(SKNLI;L&-YA|(
zm+L#@OSm5;xTQR*=vM^)`$#4eLvPiWt*v8PSD=d!wetjxTLiOgl#EynH%3txi{w5Q
zsAqoI5Zn(;`KoN$)KlJ>OZlT0H8v*5f1STOew+22(#iQM8#xY9CEpS?#Jw}6pWd?e
zv7YkjANuFoai5T7)DF8>G_wiEud@TZ_xozYA11YIzi9sG)$x;riEPK8QN9M+gl1f(
zy7z{DUTA-#>!?W)jE@L=qW#|pPTw8WljksLfh4(%WTzn#onH)F>m;t&)l+0JvdKq8vHkX-i}rG
z8$WrlOC+$2tK7++U%CIaIqu$$`FEwHw`8Y&tZkKbec@cw(8Yt>Rfr00Fm-%5c-n8n
zT1U&3(zp=#|B@arYD;j8DHx5cmes@!1JSTQZv!Dlx*cIfLk7Q>Q^Q-(iZz?S{bYq}hp#}p3T
z;3|(e1g@uv?qK#W4!=W!Z|0r$;u?1vszD>>x@EC!iSjSUd5fxjzpjXhCS4bGIz4p^
zX!Dj^v`yxj8FjA(KGb{pSV&;-cWcX6yPTTD==bofmq_Y+KeCG-#Q%A6E`<1L08K0_
zF&u^y36SPj2j1cY!xH?>m3$*@s?JC9H4%_0bS>+v3~)|zt3mb(3)6O^Q?I=Sdrc9d>ISCvh5=^00JLH=9=*Nb{_a2a=doNh*
zi=p73qjwltcYgADUct=wisI{olOCehR(JP@6j*9qMpJ-OnFm*|wz7jF=e3TbY#xaJ1)@#60wNbzE?iSC)
z=fOXCcFkIs$~+x72)Ry%0P|&^mwtvK8h4i012$gt!$oQW_YK_%G~@XWldw|5x_V+s
z^dsIQBj%-3aZvQyz>7Uw*nZw_L(vHxiWp5@Y1Nr5~lV_fY0qbJ^Q3K@Jta7Itfs
zHNu0Oh;1c*YSK{!SjDTu;I9h4=KJQ2{RS)hZMk7zI(OJ-{|ae5>obzac5gcdw=P|R
zeBuGS$E_8MOVQI3uDg}4NXcf#Jk{Y)fVFI_wWlC@R{Ja9`T?gCxmEnZsO@juQ%9zG
z;#*0d#|ot*Aoo{H9DQmcn|GmXG94n?=TuXDV?z~mv52XJ@N?E9KG=RSEZ`|)s5}Gq#l0(+3KD2H^V70tONA>d
z@1O6{j{&)c9dQo`>1Mki*rjG_7Vay!eT*@QH&~tAEQT|iB7)o@1vM3auEpNpNH;m{
zp+C+%UAyxk@veQ>iV3XoRPuqdnkA@BZA+Bn8NL|wxn@VxD`<@|TZ`?NNgu<-`3QAu5HqWTK;V<>Z`u;zp-da&aDIW#rT(
zil1*~&Hxu?z>w!M*-&WzaK@7CBP~f*DRHpDpzS!7yjPU1B*}{PE;LQV44?a$Gusi<
z;_hHV>U;JO{H!>?;}dhJ!63Fh96PiDUKa0Pw|yL3p|)c8Y^?u){JiTs$Tyrt-BB+g&*0zWA(Nw$*NT)^`-yPCZFmQooh{i#n`@w>TTx~6l5u{
zUdkBfK!>;cC3U!p{Zu-gT@}MwndlyahXwZfwW4G#o~&7S
z{Csu(h0HrvVJx$f1o3X}6pJqqm-p=KHfWLKU|N>I*yX5=tSdbx&YljmsUU(L1_8AW
z_-{diZvk+~{=h%Vj5Qx9K6$I0IufS`N?E$Yl4QFD2QJVpUuiXhwWc8_6T0I6xBxjJ
z%WPkQKOvgaX^OqX*yRdyr=W?wsA0FD-5YX6abgc`Uk_V8RLFA}*=Cm6R>%UY4G?z%
zAp3)LYgn24!wi0lpin^r8&iBX*w*B4pJ(h285rIqA0TSM-xAA?y)uye-#Fc;NSyJJO-Epc(#4QZ{
z@VVfE;|-RflKOtZWy+s=<93~#&{t}3GW76%q}tueMO;T~K&}VD&#^B%&mM>IqIvgdAi4=N8s!+i>*!8ol-j8
z=^d}?(a7j?ix1Apm>eCPuek;C@coZQHagt3)J-vM_CAz~A>)s~ia*%opgSr8!y-Q)
zb0~%5KBKW@IpP~gHCnCWlW6+MLmSANd43N_&{%L0y@Xo)n$595;M+K!4qeC(tNPC}6-K&_75>^R5J}I%GPS3n+w>AP!
zt(Bflwz3ceNUI{l#tBv
zecS2+m4AaiH;svB1y;ih4N>x0DeS+>jtA!6gO`yRaE>
zXf)Jx-#GK(J?o-jI6KBUcoi0xb3+qx72F-N*Rh59J!d%8M)3(Hj*UEoQcO)t!OJ
znsmCxUiKaFgY|fxnzXeyK1?HX#rTBAfZ7j1DUJT0j6kWww?Z|cSIij?H4XaoJX9iC
z?`y{z3zBCQ8Uir8aLUq*G4^uCDtlv#d;YVB2c`+WW3{!lCA3o`9GSEt>m8;guw?RZ)zVKH<-uVzg9j!vn_M=Ow
z+#n>>aNxfOkkXvlE1>&dK9`b!xxSWrC1T9ydz~*7Q1%EVmZ8oH)vpG@nFsagj1j9F
zT0^JhkGI2qZ~+`l4ZmoPx*Xig7upc^|2U++AsiQ6@zx_)5q3w<@FfoTIoMpERyG&X
z1QRW0y5-+ntWcJ_;jp^&VIf~*-F{@ENWPt2$2AFZw^vlFR6w77ur}7AJZmLY@IBU!bKs
zyL5HDDT6jUl#PjH9;!0mf3c;u&3zG0q$XYd{(^Plr-~ot58dF_cWYHcO`oc9O2cC$
zHeWUo0;Aa~S&B#kgqvzi%+fXWvKwVcHYo`>^P4aBy*v<2scqjqRMLL1?|U;^
z^jfH9WGlD!NT@4y$6@X11IS?Nf=}!Uie(k+;qI{5@I&>v%bp|+x
zkdphtcJiOyC09X9e-67DkglmJ$IlztVA!%c*H|Gr8st*d$S|ZHp(zsZ?|5r!1i(2RY++cfmUK_gIa;cz{!6?91gA{*}DkD?Kcc
zGY=2-GA9v&WN1$+r*&dYNk0TRwtZN~=fj>{$SXy?0}?_}Kb6W#hn${ageHv1#`8H-
zE-H!r}^P=;dDY4ONT*0$s@y^t>ORsuONR3=%5@a;wQ~$kvNr
zRNa6!XMHhFvrE&--~rde{u9>m+BaAzQ6JSQ%=gfzQ^&w~8l7-nMC8hfjS0
zSMSW4W=db2!y1SliHWuQwGJ3=w{?_fA{qR~7=+M^zfwHwLY)+_W+}p&2(qkhAg-*+SeTvD^>aT
z$$E`zP!T5q1(Z~08aTX*0LrK>>8rd*%^M_*SsFY;1@}ihD!l$qj)0mP48!71ER>&d
zX;g7-H)#0hH$4by&DJUPp|xQE+za_#8G_77$`77-txqbsr?O|Px#PjGPMSEkYwP*<
z@QLO)i|>*Tt@#BLPDlD7Y%x$p0^jbI0B?fDe?ZCx3+jMdx@kE`+Fjt@(Nd-2z{>b2
zvSR;R=Hoj#<98M=e@(gl3X-_BkG8#yb|2sgXjaQ@@_r8HzkP_im}A@6?p?o~>Y}S5
zoAy{ZmccJmPA^~T}{Iq1TS2z>;Exm-umZt6cI^3O_Tk{ri{TtJ1=LPvOsC
z_}**M1;N)M)~&UzEb;}(A%+qIUL3aGd{`N8)sb3LQSaM%5<7U~lb-j&+S!uXtXs(1Mo=A55UT6#h|2VB#9JznN3epndoxwV}FB<;PT
z$G+IJ!yL`W2hQ}$Jf2g3%!^S&;hvD&7wu;OZ_yiR=oc#_Wb=*o{l=a=Za;7scZ|bb
zG83Qfuo}Tju?7A#0sabQXo+H>-IxB3m8m4=BuQ4Wkg~FRe}we!SJCQQj;*TnL8#!Q)NUnQa?w|kGj
z^lvL^j0U#3SPvS*Imy_J~bQ446I%x^+HD@-Y0`C$0WemAH9@hQ9mP
z5651;_L8lioGVZQ_$sN^mpr=3^rH74|jr*jb3_Wm>&vARK?o6HJBl22^Tm~Wh>ebXXy
znwQ*RXgSktE5Qi1%E6Q_84o$*PKOodrt@D3y8bGf~bl|M~anz_ul
z{7u$Lx{awFxd1jW>7AWW_7U>kk}IS%uxJ`h=OAtqF80jE=5)2G>@+yz1V&fFxDOkd
z+f>AI(F+mk2Tu&aW0gEcEV#VijplM|_nkhh$W+o%S+9c1|1nj{@PFT3ge2SoqK27Q
zBbfyS-&=|N&DOEH$#t=3qM*K$(4;c+%~KQLhWEB1x|^ppW*p7`1nUnE^!9!?xOL#h
zr#76Pm|G3dO3@om-tntLYNk)FLEIcd`%0Y=cA?6zoZhn-sV?m%z6mOoRGb*K(ptF}
zNq(g3eKQKj!%7cIETq$uXcwHpR9_VzX6$K;XG9t8x^&vR3~##2KE(mOHTi!}mv;?a
zBPL#7pR;sLftU#tbc5z*d2F%Wb7ZwIOFsuJE;RSG-m*)af}RDjRf8JdvQ7~?^c1kb
z_`^SQno5mmW_$AThmpn;VNHHs*wl32x&y6I(_%U`O^{ssNvC5ZwoP}F*OG$fN9H)2
zs|7DfP1Iz(X+=CZ-|X=L|4d-t8U?=n>D|O=J#j#Z>%&?I4$9Wxy@hm4&~N!(WQ@cn8HrZ@9thbi~Mr!
zz|SbSDf?4L&P383+*+!O^h3z$&Sh#ZH$xUW#C$SHRaR-X*~;
zJo4>Rj6TBq-FyDq(TfP+@b`lUc1oWQ5*NTmuFqsuv{`(&r#o9nH{WW0I{DTyX^}60
z9JrJJM08R8_p#4yhtKh7V0-8XXbO+x{(Dcu1{JF1@sUmbu8;Kca}_oq!T%*wsNH;6
zR*DAtuKT0gym3zSgwuk9~5XM>S@
zg0c|6Usd=3bu~c*zn~Xn*e>h|P1ecKN@Qt1nSq1#ky>|jA&{P6}CC|(=BGo8g93PG5n`CX6dDp(aQ$&s{s1_2IP{^b8RM(4<
z+{gm86)nlo8
zXzU>p(rE_f&zUpg!f&XpkndUHT0d0$8EKR<{rf9^*4}+0NQs4x&{mPi2dk|zsj?_k
z!;jv{vZBjojS_rJ_%rVC^ifLgSi23LPO!H7#s>a+OUp^0je5PJTXeh}VROso;@bIO
zx{C+cYRx6?4;^oFBHdZtC|>5jEaVN%4>vAmz5cfgmlExFw_ID#)&3Si+^4cIxE6MYx(YKerEg$=wxAc5MNt6%0
zlMfan8rKRmtJgDn6aQX@oG&!KjBQYSjACIL7`g`F=QEH9Ze@-qRuvmolb@gGz2WyD
z#rCGR=x;Ayq8-=v`@DJ$p``tai({+MM0C^ov=ZQ(1w7X^3}ErZ@N*tL$W9A^DSdaY6CmS9?cus7t7HX{!2x?9{O3nEQ^(u{xU9fEyIO;0gpnSH5No`(gwr
zD~91c?oF1G
z?TK*C&dnr)fb2onfjdNI(+%s;vbrU~NFubjW4HDabm{6Qd
z15o&V%DcGQ%fnV>gxZ9ExNcsu0xr<U-+mH#rhbLZ8Mt6Y2akXy0r4jZNsH&
z#d#THyr916H=FRM1%?(0Gb0BmrzXyzBU?0ri#W`z{Y|3lBuMr@4@S8IJi^;O^^rlU
zf~U-#pfAMQH$iKTR|PGMI}jtC+x_u#g|pnx}7cyP7dpZss&=b
zo~#K8Z1}F)RgnrOG(7X`q2%`kmdmOz9Pv(dX^vtyE^bLL6Z43V84*1N2+hL%@DaAXc3%>~fgwG_}7ZOIQeC5-NJyadGEseL-3$JA!;^s)H@N!{1R
zLSD>Zu;?lX;2Zw>ETUX4tiLXpRgE}wW%_0m@+t^sJoI1N`Y8cO9vT_LnfC2JS7-Yj
ziw|C-iCLJVk4WH!iJ`o}ojU(j;hitIH@f%bsmCaEIf}u*RPg?9y
zYN+cVtX(>Ex!hgl`sxxmV^`TdC|qOruHZO`V@x4a2w~q)7_A`RvdEzt!X^9N;1c$M
zMys3YbLAvLYu}Q+S|QKjRLNb#?iCpoqoK}X8P!6&n7j!
zj>fKger#5WTdsaBC>TMg>3HA80lr3%M2MjLJJDo>U|M%im0;;Oy7I#6^3sE=x%ZsI
zgd|2><=cevp4V2t561H6SzF%JOwOX3-&JbKn5X%|gvr3K7%$_Q7i9eLXO!qV8rhSlPTDN^=~CwV
zza#RQCD7)nj(g(Ips(q8&UCXSOzCxeUq8`O<=|R6?qzaj3(r1UN2|8@%JECLV8d;J
zE0Co8-0=N_t*x!Yfm+9ou(RqIt&nh>h89CfzP$uIza|cy2eH+;xD>d0{D{twt#kXB
z-2)fOWzz9fMo=iLEizG*pk8lqnkDki?CZ>5eBV}L>9lqqA`S-In=zHo1@srPCirpl
zq3e>dTY=fk>|o}loJzFO-O}{k&tVSp_ZcIDjX{pT=l2uNU@R){h38XU)!GJb`XdQ%
zOAl{fCydQ%9u}&$4&)oy`-rk5YG%i9LXEJ>h?++sS5%nv4ogY9eTlnf?sMloz~kwz
zL(KJGzZASa49Gg=b>&~ge0k(>V`bdz!kT;(D}4^3S$WGq%=d7FRn_4pCj;WmC=bIi2DVfcRH!c*401QIk7!SA3n}Q$>e7F1zm(^dA
z(pA*&!|%+^8%WJq;&W|hDYw5)24BS1Jxl}uQJo?J}2p
zzYHwWJrU@kvbx?-7embsX3eH{0PaO0p*qz2j{#c99icmf9XlPiUXBk3RfbYTKRgdu
zj0TO3E&KQK85Mj4vleR{Pk2(ci>qLWrGUp%zHZXNPPn9)yX5;R6Q@Bl8ogJyv-|cd
z2dh4J3UWnAJVSMzhlsFJ|16kY1<`!}A1>yGFOpd9}2&E%74c0_w+?Qw8~RyzK#-k>;&^f4P<
zc?*B)y0M-!rr3J(go)rLux{`=$F~Xz>5&h7%+>$=mqYuhL?szbUS**d&kI^dlqg7_
zD=lX^@kMI5N=iIJp&6;^A8^aMdvwf
zr4H?PGvz+H1+NmOGTxEH2JHsuyqDNqj>L?7c@I_uL4C0l!qD}z$JZYh*Dz_&zStas
zTomHoR`y-!j*~;KC@J-S(U)(&y0)TcOK_@sjOpr~lFV`-K>D#z@#&_Rsly
z;x!JZdT$+`O1O5?dSroCS0y@w{4(S{!{EW5Wo>kL$_kxX;`k}-bPK-`j>Co?HmN)7
zY2^9&hrdItrhaSmUQ%sh9M>_XRuaEuI=s&e3q7`I1pU$Jo!6$5flYla;3w*VKa%KX
z?PhE#m6_+)CaK?4Laf5->?Vrm)8$#rfOo?Djn}Jhl;-t-%p48ta*s$`4?LZ`-=fn!
zVqC-^>XOi@)IY4T=YHvFKq&X;WwKA(t}`D@G~X7gtcwTCO@t
z>+_JXH<+qcnyVDp9-OtYqL1&xQ(XQogqTIB?%~2qZ?st64D~b*%QAbp3j&2Ber_vQ
zneaZG{j@CD`sbRal=Y1QH<{xi9n~`j>FwT4c5f4D6wKut1$XFzmts1!+(;NP809|u
zB(wctHfZ_!(s=^+s9(P|pelAz@BwYW6-7lV)iq1U8D8>wCs_}dLnlKrweZRwuX&e*
z{UPFUHk<{bg6Zf6fxp9@)dfEXO@9Hs_m(!`z|5wyGz-md`ClsvWvtS4hPgWCV->I1tw9rLap>tFo&LS6$$+BdNC;XS)&vZjlAuZyFHd1M56QEm)~0Nn0R
zCx|tDV!*NRlj>?FFp4(G<$PH|KCj`0ekio}I?aiZ(UfV=0AT$Co=g-gVueAhVPm4l
zFsZax(5Kn_rs0&v4{|1UM;jg#HhRd~TGY^-j#9Z%GZASv{N@4P_R^c$BUVTml)1pW
zDen^4L3fzu3TlLZ(7+k%&{A7dqodTUSf8ce4PqV#NtayBcBjE^t
zzv53CK0Kzxl?14~yx{LX8+H=%FziNBvo>BDfEU;onC8C$GQ@v{#)n8*#kwB|JF1t~
zBC|lRHr4G-TQ6US^zg4<>6)lEv0^FVy|R^<2);a4i_URaTk&y6-r^dy
zO;{m)P~iA|i-A?03`*VgcY7FH6Ub35w-$*zTV<`K6dmu@OCwHsR7&=CStob)Bz*}TbY$p677Rvp~XJjNRLu9@Te&kbm#9ot)gp*%2DM@o2nglUkZ
zajBNEzb(5df>ncX|DTDeFb`=B)w~;`rlK5P=m%S@&oMC
z6?UY(d>eZfby_j=Hu0jWcpWWq2}WgnS~TMePHTFJv2=KvA<-_0%k`d6oUH2kXSM>_
zmD38TIT_XlPClxShWycUHG1+?|0l<@^HbGBKqGHnbtN;c(zbx~A;B-<%R3Y&Ty;#A
zpu=t9b}UvyA@Bqi9Ae@SAd*X|*$=_fZ?6$Dv02`Rtg{
z?{L*uNm{9*65*0_LFRf7Vtck%s7%Ju#IMD}IJII&u`8_22J*evz&M=@4$u*=e6=qt
z|3sC{+kp&GsV{tWpzsz?UBJHccr;Uf<4^!^$irECFGYk2h2>Z?Fl)GHKB8*H?4zQA-P!
zIUCI`r?x*Wn9J+w;hIc5sUcU9ypA#7x)3G5+zTejw1G+|xjU4J9|u9IG4MBD-h?BW
zpc$;hyXw4R3S$pge@WV8Sxtu$v}Squ-FYWtU*lEZF|>*bkBzOrJ#7%A;gteWlc~8_
zV}hN%kV|KZNFD+?m<;EzHA>%&Co0viQ0u|#fd!KKI(Vq^lOY*Fv)_~MUPnAFh5)gP
zs@_lv6*!MV8xCwbsO~}+=@yjQ&mKaI&f`MjzHCe4UqDJ#<-1o{3)CXv+;>zro8_Sc
zwvJ^nDQ^>X5yeVOfeadVWLiJlj!1r2(fHE--V?w&kzX6^-kRjSaV=<~(xMW%sz0mG
zK+}jN>ef)zga6|K2!MxV3I(44Lo9q`e4-Dyi`bywg)Vqo&Ioj*s4e*fWxLrI8@hGW
z4y_Rf2xkbl`2SdaBxtUAb?vWzk2Gt%H$)o73U1#H1T1ALe}ftR`vIED{|+dLcS>IK
z{;)e#4XDmu3lI{JY0;xV8XgWseNYL#;@fCxpax)Oaw3_jvaL-(PmXGTm-i5(=5}M5
zP{__HoB{B+`|M|jc8}?4_KweEJ)@dh57y7`+7;kl95ly_niF5GaaRkbkHZ_t3k#6#
zM5qIzghQC=BWn)vp~9($j