├── .nvmrc ├── app ├── blue-green.css ├── favicon.ico ├── layout.tsx ├── globals.css ├── page.tsx └── page2 │ └── page.tsx ├── next.config.mjs ├── postcss.config.js ├── .gitignore ├── tailwind.config.ts ├── public ├── vercel.svg └── next.svg ├── package.json ├── tsconfig.json ├── .github └── workflows │ └── cron-blue-green-deploy.yml ├── middleware.ts ├── README.md └── pnpm-lock.yaml /.nvmrc: -------------------------------------------------------------------------------- 1 | 20 2 | -------------------------------------------------------------------------------- /app/blue-green.css: -------------------------------------------------------------------------------- 1 | body { 2 | background: blue; 3 | } 4 | -------------------------------------------------------------------------------- /app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vercel-labs/blue-green/HEAD/app/favicon.ico -------------------------------------------------------------------------------- /next.config.mjs: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = {}; 3 | 4 | export default nextConfig; 5 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | }; 7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | .yarn/install-state.gz 8 | 9 | # testing 10 | /coverage 11 | 12 | # next.js 13 | /.next/ 14 | /out/ 15 | 16 | # production 17 | /build 18 | 19 | # misc 20 | .DS_Store 21 | *.pem 22 | 23 | # debug 24 | npm-debug.log* 25 | yarn-debug.log* 26 | yarn-error.log* 27 | 28 | # local env files 29 | .env*.local 30 | 31 | # vercel 32 | .vercel 33 | 34 | # typescript 35 | *.tsbuildinfo 36 | next-env.d.ts 37 | -------------------------------------------------------------------------------- /app/layout.tsx: -------------------------------------------------------------------------------- 1 | import type { Metadata } from "next"; 2 | import { Inter } from "next/font/google"; 3 | import "./globals.css"; 4 | import "./blue-green.css"; 5 | 6 | const inter = Inter({ subsets: ["latin"] }); 7 | 8 | export const metadata: Metadata = { 9 | title: "Blue-Green deployments on Vercel", 10 | }; 11 | 12 | export default function RootLayout({ 13 | children, 14 | }: Readonly<{ 15 | children: React.ReactNode; 16 | }>) { 17 | return ( 18 | 19 | {children} 20 | 21 | ); 22 | } 23 | -------------------------------------------------------------------------------- /app/globals.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | :root { 6 | --foreground-rgb: 0, 0, 0; 7 | --background-start-rgb: 214, 219, 220; 8 | --background-end-rgb: 255, 255, 255; 9 | } 10 | 11 | @media (prefers-color-scheme: dark) { 12 | :root { 13 | --foreground-rgb: 255, 255, 255; 14 | --background-start-rgb: 0, 0, 0; 15 | --background-end-rgb: 0, 0, 0; 16 | } 17 | } 18 | 19 | body { 20 | color: rgb(var(--foreground-rgb)); 21 | } 22 | 23 | @layer utilities { 24 | .text-balance { 25 | text-wrap: balance; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /tailwind.config.ts: -------------------------------------------------------------------------------- 1 | import type { Config } from "tailwindcss"; 2 | 3 | const config: Config = { 4 | content: [ 5 | "./pages/**/*.{js,ts,jsx,tsx,mdx}", 6 | "./components/**/*.{js,ts,jsx,tsx,mdx}", 7 | "./app/**/*.{js,ts,jsx,tsx,mdx}", 8 | ], 9 | theme: { 10 | extend: { 11 | backgroundImage: { 12 | "gradient-radial": "radial-gradient(var(--tw-gradient-stops))", 13 | "gradient-conic": 14 | "conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))", 15 | }, 16 | }, 17 | }, 18 | plugins: [], 19 | }; 20 | export default config; 21 | -------------------------------------------------------------------------------- /public/vercel.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "blue-green", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "next dev", 7 | "build": "next build", 8 | "start": "next start", 9 | "lint": "next lint" 10 | }, 11 | "dependencies": { 12 | "@vercel/edge-config": "^1.1.0", 13 | "next": "14.1.4", 14 | "react": "^18", 15 | "react-dom": "^18" 16 | }, 17 | "devDependencies": { 18 | "@types/node": "^20", 19 | "@types/react": "^18", 20 | "@types/react-dom": "^18", 21 | "autoprefixer": "^10.0.1", 22 | "postcss": "^8", 23 | "tailwindcss": "^3.3.0", 24 | "typescript": "^5" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "lib": ["dom", "dom.iterable", "esnext"], 4 | "allowJs": true, 5 | "skipLibCheck": true, 6 | "strict": true, 7 | "noEmit": true, 8 | "esModuleInterop": true, 9 | "module": "esnext", 10 | "moduleResolution": "bundler", 11 | "resolveJsonModule": true, 12 | "isolatedModules": true, 13 | "jsx": "preserve", 14 | "incremental": true, 15 | "plugins": [ 16 | { 17 | "name": "next" 18 | } 19 | ], 20 | "paths": { 21 | "@/*": ["./*"] 22 | } 23 | }, 24 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], 25 | "exclude": ["node_modules"] 26 | } 27 | -------------------------------------------------------------------------------- /public/next.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.github/workflows/cron-blue-green-deploy.yml: -------------------------------------------------------------------------------- 1 | name: Cron Blue Green Deploy 2 | 3 | # How can I use GitHub Actions with Vercel? 4 | # https://vercel.com/guides/how-can-i-use-github-actions-with-vercel 5 | env: 6 | VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }} 7 | VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }} 8 | 9 | on: 10 | # Allow manual runs 11 | workflow_dispatch: 12 | inputs: 13 | logLevel: 14 | description: "Log level" 15 | required: true 16 | default: "information" 17 | type: choice 18 | options: 19 | - information 20 | - debug 21 | - warning 22 | - critical 23 | tags: 24 | description: "Reason for running workflow?" 25 | required: true 26 | type: string 27 | # Run once every day https://crontab.guru/every-day 28 | schedule: 29 | - cron: "0 0 * * *" 30 | 31 | jobs: 32 | create-blue-green-deployments: 33 | runs-on: ubuntu-latest 34 | steps: 35 | - name: Checkout 36 | uses: actions/checkout@v4 37 | with: 38 | # `1` means fetch the latest commit without full history, so it's fast and efficient. 39 | fetch-depth: 1 40 | - name: Set node version 41 | uses: actions/setup-node@v3 42 | with: 43 | node-version-file: ".nvmrc" 44 | - name: Enable corepack 45 | run: corepack enable pnpm 46 | - name: Set pnpm version 47 | uses: pnpm/action-setup@v3 48 | with: 49 | run_install: false 50 | version: 8 51 | - name: Cache node_modules 52 | id: node-modules-cache 53 | uses: actions/cache@v3 54 | with: 55 | path: "**/node_modules" 56 | key: node-modules-cache-${{ hashFiles('**/pnpm-lock.yaml') }} 57 | - name: Install dependencies 58 | if: steps.node-modules-cache.outputs.cache-hit != 'true' 59 | run: pnpm install --no-frozen-lockfile 60 | - name: Install Vercel CLI 61 | run: npm install --global vercel 62 | # Pull down the production environment variables as if were building on Vercel. 63 | # https://vercel.com/docs/cli/pull 64 | - name: Get Vercel Environment Variables 65 | run: vercel pull --yes --environment=production --token=${{ secrets.VERCEL_TOKEN }} 66 | # Create a "blue" version of the site, deloy it, and capture the deployment url. 67 | - name: Update CSS to Blue 68 | run: 'echo "body {background: blue;}" > ./app/blue-green.css' 69 | - name: Build Blue 70 | run: vercel build --prod --token=${{ secrets.VERCEL_TOKEN }} 71 | - name: Deploy Blue 72 | id: deploy-blue 73 | run: echo "url=$(vercel deploy --prebuilt --prod --token=${{ secrets.VERCEL_TOKEN }})" >> $GITHUB_OUTPUT 74 | # Create a "green" version of the site, deloy it, and capture the deployment url. 75 | - name: Update CSS to Green 76 | run: 'echo "body {background: green;}" > ./app/blue-green.css' 77 | - name: Build Green 78 | run: vercel build --prod --token=${{ secrets.VERCEL_TOKEN }} 79 | - name: Deploy Green 80 | id: deploy-green 81 | run: echo "url=$(vercel deploy --prebuilt --prod --token=${{ secrets.VERCEL_TOKEN }})" >> $GITHUB_OUTPUT 82 | # Update the blue-green urls in the Edge Config store using Vercel's API. 83 | # https://vercel.com/docs/storage/edge-config/vercel-api#update-your-edge-config-items 84 | - name: Update Edge Config 85 | run: | 86 | curl -X 'PATCH' 'https://api.vercel.com/v1/edge-config/${{ secrets.VERCEL_EDGE_CONFIG_ID }}/items?teamId=${{ secrets.VERCEL_ORG_ID }}' \ 87 | -H 'Authorization: Bearer ${{ secrets.VERCEL_TOKEN }}' \ 88 | -H 'Content-Type: application/json' \ 89 | -d $'{ "items": [ { "operation": "upsert", "key": "blue-green-configuration", "value": { "deploymentDomainBlue": "${{ steps.deploy-blue.outputs.url }}", "deploymentDomainGreen": "${{ steps.deploy-green.outputs.url }}", "trafficGreenPercent": 50 } } ] }' 90 | -------------------------------------------------------------------------------- /middleware.ts: -------------------------------------------------------------------------------- 1 | import { get } from "@vercel/edge-config"; 2 | import { NextRequest, NextResponse } from "next/server"; 3 | 4 | export const config = { 5 | matcher: [ 6 | /* 7 | * Match all request paths except for the ones starting with: 8 | * - api (API routes) 9 | * - _next/static (static files) 10 | * - _next/image (image optimization files) 11 | * - favicon.ico (favicon file) 12 | */ 13 | "/((?!api|_next/static|_next/image|favicon.ico).*)", 14 | ], 15 | }; 16 | 17 | // Configuration stored in Edge Config. 18 | interface BlueGreenConfig { 19 | deploymentDomainBlue: string; 20 | deploymentDomainGreen: string; 21 | trafficGreenPercent: number; 22 | } 23 | 24 | export async function middleware(req: NextRequest) { 25 | // We don't want to run blue-green during development. 26 | if (process.env.NODE_ENV !== "production") { 27 | return NextResponse.next(); 28 | } 29 | // Skip if the middleware has already run. 30 | if (req.headers.get("x-deployment-override")) { 31 | return getDeploymentWithCookieBasedOnEnvVar(); 32 | } 33 | // We skip blue-green when accesing from deployment urls 34 | if (req.nextUrl.hostname === process.env.VERCEL_URL) { 35 | return NextResponse.next(); 36 | } 37 | // We only want to run blue-green for GET requests that are for HTML documents. 38 | if (req.method !== "GET") { 39 | return NextResponse.next(); 40 | } 41 | if (req.headers.get("sec-fetch-dest") !== "document") { 42 | return NextResponse.next(); 43 | } 44 | // Skip if the request is coming from Vercel's deployment system. 45 | if (/vercel/i.test(req.headers.get("user-agent") || "")) { 46 | return NextResponse.next(); 47 | } 48 | if (!process.env.EDGE_CONFIG) { 49 | console.warn("EDGE_CONFIG env variable not set. Skipping blue-green."); 50 | return NextResponse.next(); 51 | } 52 | // Get the blue-green configuration from Edge Config. 53 | const blueGreenConfig = await get( 54 | "blue-green-configuration" 55 | ); 56 | if (!blueGreenConfig) { 57 | console.warn("No blue-green configuration found"); 58 | return NextResponse.next(); 59 | } 60 | const servingDeploymentDomain = process.env.VERCEL_URL; 61 | const selectedDeploymentDomain = 62 | selectBlueGreenDeploymentDomain(blueGreenConfig); 63 | console.info( 64 | "Selected deployment domain", 65 | selectedDeploymentDomain, 66 | blueGreenConfig 67 | ); 68 | if (!selectedDeploymentDomain) { 69 | return NextResponse.next(); 70 | } 71 | // The selected deployment domain is the same as the one serving the request. 72 | if (servingDeploymentDomain === selectedDeploymentDomain) { 73 | return getDeploymentWithCookieBasedOnEnvVar(); 74 | } 75 | // Fetch the HTML document from the selected deployment domain and return it to the user. 76 | const headers = new Headers(req.headers); 77 | headers.set("x-deployment-override", selectedDeploymentDomain); 78 | headers.set( 79 | "x-vercel-protection-bypass", 80 | process.env.VERCEL_AUTOMATION_BYPASS_SECRET || "unknown" 81 | ); 82 | const url = new URL(req.url); 83 | url.hostname = selectedDeploymentDomain; 84 | return fetch(url, { 85 | headers, 86 | redirect: "manual", 87 | }); 88 | } 89 | 90 | // Selects the deployment domain based on the blue-green configuration. 91 | function selectBlueGreenDeploymentDomain(blueGreenConfig: BlueGreenConfig) { 92 | const random = Math.random() * 100; 93 | 94 | const selected = 95 | random < blueGreenConfig.trafficGreenPercent 96 | ? blueGreenConfig.deploymentDomainGreen 97 | : blueGreenConfig.deploymentDomainBlue || process.env.VERCEL_URL; 98 | if (!selected) { 99 | console.error("Blue green configuration error", blueGreenConfig); 100 | } 101 | if (/^http/.test(selected || "")) { 102 | return new URL(selected || "").hostname; 103 | } 104 | return selected; 105 | } 106 | 107 | function getDeploymentWithCookieBasedOnEnvVar() { 108 | console.log( 109 | "Setting cookie based on env var", 110 | process.env.VERCEL_DEPLOYMENT_ID 111 | ); 112 | const response = NextResponse.next(); 113 | // We need to set this cookie because next.js does not do this by default, but we do want 114 | // the deployment choice to survive a client-side navigation. 115 | response.cookies.set("__vdpl", process.env.VERCEL_DEPLOYMENT_ID || "", { 116 | sameSite: "strict", 117 | httpOnly: true, 118 | maxAge: 60 * 60 * 24, // 24 hours 119 | }); 120 | return response; 121 | } 122 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fvercel-labs%2Fblue-green&project-name=blue-gree-on-vercel&repository-name=blue-gree-on-vercel&demo-title=Blue-Green%20deployments%20on%20Vercel&demo-description=See%20how%20Vercel's%20Skew%20Protection%20feature%20enables%20production-ready%20blue-green%20deployments%20with%20just%20a%20few%20lines%20of%20code.&demo-url=https%3A%2F%2Fblue-green.vercel.rocks&demo-image=https%3A%2F%2Fvercel.com%2F_next%2Fimage%3Furl%3Dhttps%253A%252F%252Fimages.ctfassets.net%252Fe5382hct74si%252F4xnSnpCnkYCw6ZzZcCXVVv%252F5e0c6666fe0b9583f42e84d5493b75a5%252Fblue-green.png%26w%3D3840%26q%3D75%26dpl%3Ddpl_8ZzCwcUW4b6UdGfjetyMvumYaoqS) 2 | 3 | # Blue-Green deployments and canary deployments on Vercel 4 | 5 | Blue-green deployments is a deployment strategy where you serve two versions of your application, "Blue" and "Green". You serve the current version of your application (Blue) and then you can then deploy a different version of your application (Green) without affecting the Blue environment. 6 | 7 | [Rolling Releases](https://vercel.com/docs/rolling-releases) are a built-in feature of Vercel that let you configure blue-green deployments with no code changes. You can create automated or manual, multi-stage rollout strategies that integrate with Observability. 8 | 9 | If you'd like to implement blue-green deployments yourself with lower-level primitives, you can use this template to do so. 10 | 11 | - [Demo](https://blue-green.vercel.app) 12 | - [Detailed guide](https://vercel.com/guides/blue_green_deployments_on_vercel) 13 | 14 | This keeps your Blue application running seamlessly for production users while you test and deploy to your Green application. When you're done testing and ready to serve user's your Green application, you can incrementally or fully switch to your new Green application with no perceptible change for your users. 15 | 16 | This is typically done using load balancers to direct traffic, but with [Vercel's generated urls](https://vercel.com/docs/deployments/generated-urls) you can instantly switch which application is served to users seamlessly using [Skew Protection](https://vercel.com/docs/deployments/skew-protection), [Edge Config](https://vercel.com/docs/storage/edge-config), and [Middleware in Next.js](https://nextjs.org/docs/app/building-your-application/routing/middleware). By using Skew Protection, the assignment to the blue or green deployments are sticky across Vercel's entire global CDN, edge functions, and serverless function infrastructure. This ensures users are never shuffling between the blue and green deployment in a given session. 17 | 18 | The blue-green deployment strategy is great for managing risk, giving you the ability to gradually roll out a new version of your application (including breaking changes) or go back to using the previous version instantaneously. 19 | 20 | ## Getting started 21 | 22 | - [Deploy this template](https://vercel.com/templates/next.js/blue-green-deployments-vercel) 23 | - Activate [Skew Protection](https://vercel.com/docs/deployments/skew-protection) for the project 24 | - Activate [Deployment protection bypass](https://vercel.com/docs/security/deployment-protection/methods-to-bypass-deployment-protection/protection-bypass-automation) for the project 25 | - Create an [Edge Config](https://vercel.com/docs/storage/edge-config) 26 | - Use the following Edge Config settings: 27 | 28 | ```json 29 | { 30 | "blue-green-configuration": { 31 | "deploymentDomainBlue": "https://blue-green-61yvm4f5d.vercel.rocks", 32 | "deploymentDomainGreen": "https://blue-green-nq2hvhtsv.vercel.rocks", 33 | "trafficGreenPercent": 50 34 | } 35 | } 36 | ``` 37 | 38 | The fields `deploymentDomainBlue` and `deploymentDomainGreen` must be valid [deployment domains](https://vercel.com/docs/deployments/generated-urls) for your projects. 39 | 40 | See this project's [`middleware.ts` file](https://github.com/vercel-labs/blue-green/blob/main/middleware.ts) for the logic implementing the blue-green logic. 41 | 42 | ## Executing a blue-green deployment 43 | 44 | With both deployments using the same [Middleware in this project](https://github.com/vercel-labs/blue-green/blob/main/middleware.ts), Vercel will only serve the deployment specified in your Edge Config. 45 | 46 | The simplest way to perform a blue-green deployment would be to manually update the Edge Config. Upon saving it, the new deployments will begin serving. 47 | 48 | For CI/CD-driven blue-green deployments, you can automate deployments using the [Edge Config API](https://vercel.com/docs/storage/edge-config/vercel-api#update-your-edge-config-items) in your CI/CD pipeline. You can see a working example of this in action by viewing the [GitHub Action in this project](https://github.com/vercel-labs/blue-green/blob/main/.github/workflows/cron-blue-green-deploy.yml). It creates new deployments and updates the Edge Config with the new deployment urls. 49 | -------------------------------------------------------------------------------- /app/page.tsx: -------------------------------------------------------------------------------- 1 | import Image from "next/image"; 2 | import Link from "next/link"; 3 | 4 | export default function Home() { 5 | return ( 6 |
7 |
8 |

9 | Reload to get a chance for a different deployment. 10 |

11 |
12 | 18 | By{" "} 19 | Vercel Logo 27 | 28 |
29 |
30 | 31 |
32 | Next.js Logo 40 |
41 | 42 |
43 | 47 |

48 | Test a soft nav{" "} 49 | 50 | -> 51 | 52 |

53 |

54 | To make sure we can navigate. 55 |

56 | 57 | 58 | 64 |

65 | Guide{" "} 66 | 67 | -> 68 | 69 |

70 |

71 | Learn how to use blue-green deployments on Vercel 72 |

73 |
74 | 75 | 81 |

82 | Template{" "} 83 | 84 | -> 85 | 86 |

87 |

88 | Explore blue-green starter template for Next.js. 89 |

90 |
91 |
92 |
93 | ); 94 | } 95 | -------------------------------------------------------------------------------- /app/page2/page.tsx: -------------------------------------------------------------------------------- 1 | import Image from "next/image"; 2 | 3 | export default function Home() { 4 | return ( 5 |
6 |
7 |

8 | Page 2 9 |

10 |
11 | 17 | By{" "} 18 | Vercel Logo 26 | 27 |
28 |
29 | 30 |
31 | Next.js Logo 39 |
40 | 41 |
42 | 48 |

49 | Docs{" "} 50 | 51 | -> 52 | 53 |

54 |

55 | Find in-depth information about Next.js features and API. 56 |

57 |
58 | 59 | 65 |

66 | Learn{" "} 67 | 68 | -> 69 | 70 |

71 |

72 | Learn about Next.js in an interactive course with quizzes! 73 |

74 |
75 | 76 | 82 |

83 | Templates{" "} 84 | 85 | -> 86 | 87 |

88 |

89 | Explore starter templates for Next.js. 90 |

91 |
92 | 93 | 99 |

100 | Deploy{" "} 101 | 102 | -> 103 | 104 |

105 |

106 | Instantly deploy your Next.js site to a shareable URL with Vercel. 107 |

108 |
109 |
110 |
111 | ); 112 | } 113 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | dependencies: 8 | '@vercel/edge-config': 9 | specifier: ^1.1.0 10 | version: 1.1.0(typescript@5.4.2) 11 | next: 12 | specifier: 14.1.4 13 | version: 14.1.4(react-dom@18.2.0)(react@18.2.0) 14 | react: 15 | specifier: ^18 16 | version: 18.2.0 17 | react-dom: 18 | specifier: ^18 19 | version: 18.2.0(react@18.2.0) 20 | 21 | devDependencies: 22 | '@types/node': 23 | specifier: ^20 24 | version: 20.11.28 25 | '@types/react': 26 | specifier: ^18 27 | version: 18.2.66 28 | '@types/react-dom': 29 | specifier: ^18 30 | version: 18.2.22 31 | autoprefixer: 32 | specifier: ^10.0.1 33 | version: 10.4.18(postcss@8.4.35) 34 | postcss: 35 | specifier: ^8 36 | version: 8.4.35 37 | tailwindcss: 38 | specifier: ^3.3.0 39 | version: 3.4.1 40 | typescript: 41 | specifier: ^5 42 | version: 5.4.2 43 | 44 | packages: 45 | 46 | /@alloc/quick-lru@5.2.0: 47 | resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} 48 | engines: {node: '>=10'} 49 | dev: true 50 | 51 | /@isaacs/cliui@8.0.2: 52 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 53 | engines: {node: '>=12'} 54 | dependencies: 55 | string-width: 5.1.2 56 | string-width-cjs: /string-width@4.2.3 57 | strip-ansi: 7.1.0 58 | strip-ansi-cjs: /strip-ansi@6.0.1 59 | wrap-ansi: 8.1.0 60 | wrap-ansi-cjs: /wrap-ansi@7.0.0 61 | dev: true 62 | 63 | /@jridgewell/gen-mapping@0.3.5: 64 | resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} 65 | engines: {node: '>=6.0.0'} 66 | dependencies: 67 | '@jridgewell/set-array': 1.2.1 68 | '@jridgewell/sourcemap-codec': 1.4.15 69 | '@jridgewell/trace-mapping': 0.3.25 70 | dev: true 71 | 72 | /@jridgewell/resolve-uri@3.1.2: 73 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 74 | engines: {node: '>=6.0.0'} 75 | dev: true 76 | 77 | /@jridgewell/set-array@1.2.1: 78 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 79 | engines: {node: '>=6.0.0'} 80 | dev: true 81 | 82 | /@jridgewell/sourcemap-codec@1.4.15: 83 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 84 | dev: true 85 | 86 | /@jridgewell/trace-mapping@0.3.25: 87 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 88 | dependencies: 89 | '@jridgewell/resolve-uri': 3.1.2 90 | '@jridgewell/sourcemap-codec': 1.4.15 91 | dev: true 92 | 93 | /@next/env@14.1.4: 94 | resolution: {integrity: sha512-e7X7bbn3Z6DWnDi75UWn+REgAbLEqxI8Tq2pkFOFAMpWAWApz/YCUhtWMWn410h8Q2fYiYL7Yg5OlxMOCfFjJQ==} 95 | dev: false 96 | 97 | /@next/swc-darwin-arm64@14.1.4: 98 | resolution: {integrity: sha512-ubmUkbmW65nIAOmoxT1IROZdmmJMmdYvXIe8211send9ZYJu+SqxSnJM4TrPj9wmL6g9Atvj0S/2cFmMSS99jg==} 99 | engines: {node: '>= 10'} 100 | cpu: [arm64] 101 | os: [darwin] 102 | requiresBuild: true 103 | dev: false 104 | optional: true 105 | 106 | /@next/swc-darwin-x64@14.1.4: 107 | resolution: {integrity: sha512-b0Xo1ELj3u7IkZWAKcJPJEhBop117U78l70nfoQGo4xUSvv0PJSTaV4U9xQBLvZlnjsYkc8RwQN1HoH/oQmLlQ==} 108 | engines: {node: '>= 10'} 109 | cpu: [x64] 110 | os: [darwin] 111 | requiresBuild: true 112 | dev: false 113 | optional: true 114 | 115 | /@next/swc-linux-arm64-gnu@14.1.4: 116 | resolution: {integrity: sha512-457G0hcLrdYA/u1O2XkRMsDKId5VKe3uKPvrKVOyuARa6nXrdhJOOYU9hkKKyQTMru1B8qEP78IAhf/1XnVqKA==} 117 | engines: {node: '>= 10'} 118 | cpu: [arm64] 119 | os: [linux] 120 | requiresBuild: true 121 | dev: false 122 | optional: true 123 | 124 | /@next/swc-linux-arm64-musl@14.1.4: 125 | resolution: {integrity: sha512-l/kMG+z6MB+fKA9KdtyprkTQ1ihlJcBh66cf0HvqGP+rXBbOXX0dpJatjZbHeunvEHoBBS69GYQG5ry78JMy3g==} 126 | engines: {node: '>= 10'} 127 | cpu: [arm64] 128 | os: [linux] 129 | requiresBuild: true 130 | dev: false 131 | optional: true 132 | 133 | /@next/swc-linux-x64-gnu@14.1.4: 134 | resolution: {integrity: sha512-BapIFZ3ZRnvQ1uWbmqEGJuPT9cgLwvKtxhK/L2t4QYO7l+/DxXuIGjvp1x8rvfa/x1FFSsipERZK70pewbtJtw==} 135 | engines: {node: '>= 10'} 136 | cpu: [x64] 137 | os: [linux] 138 | requiresBuild: true 139 | dev: false 140 | optional: true 141 | 142 | /@next/swc-linux-x64-musl@14.1.4: 143 | resolution: {integrity: sha512-mqVxTwk4XuBl49qn2A5UmzFImoL1iLm0KQQwtdRJRKl21ylQwwGCxJtIYo2rbfkZHoSKlh/YgztY0qH3wG1xIg==} 144 | engines: {node: '>= 10'} 145 | cpu: [x64] 146 | os: [linux] 147 | requiresBuild: true 148 | dev: false 149 | optional: true 150 | 151 | /@next/swc-win32-arm64-msvc@14.1.4: 152 | resolution: {integrity: sha512-xzxF4ErcumXjO2Pvg/wVGrtr9QQJLk3IyQX1ddAC/fi6/5jZCZ9xpuL9Tzc4KPWMFq8GGWFVDMshZOdHGdkvag==} 153 | engines: {node: '>= 10'} 154 | cpu: [arm64] 155 | os: [win32] 156 | requiresBuild: true 157 | dev: false 158 | optional: true 159 | 160 | /@next/swc-win32-ia32-msvc@14.1.4: 161 | resolution: {integrity: sha512-WZiz8OdbkpRw6/IU/lredZWKKZopUMhcI2F+XiMAcPja0uZYdMTZQRoQ0WZcvinn9xZAidimE7tN9W5v9Yyfyw==} 162 | engines: {node: '>= 10'} 163 | cpu: [ia32] 164 | os: [win32] 165 | requiresBuild: true 166 | dev: false 167 | optional: true 168 | 169 | /@next/swc-win32-x64-msvc@14.1.4: 170 | resolution: {integrity: sha512-4Rto21sPfw555sZ/XNLqfxDUNeLhNYGO2dlPqsnuCg8N8a2a9u1ltqBOPQ4vj1Gf7eJC0W2hHG2eYUHuiXgY2w==} 171 | engines: {node: '>= 10'} 172 | cpu: [x64] 173 | os: [win32] 174 | requiresBuild: true 175 | dev: false 176 | optional: true 177 | 178 | /@nodelib/fs.scandir@2.1.5: 179 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 180 | engines: {node: '>= 8'} 181 | dependencies: 182 | '@nodelib/fs.stat': 2.0.5 183 | run-parallel: 1.2.0 184 | dev: true 185 | 186 | /@nodelib/fs.stat@2.0.5: 187 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 188 | engines: {node: '>= 8'} 189 | dev: true 190 | 191 | /@nodelib/fs.walk@1.2.8: 192 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 193 | engines: {node: '>= 8'} 194 | dependencies: 195 | '@nodelib/fs.scandir': 2.1.5 196 | fastq: 1.17.1 197 | dev: true 198 | 199 | /@pkgjs/parseargs@0.11.0: 200 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 201 | engines: {node: '>=14'} 202 | requiresBuild: true 203 | dev: true 204 | optional: true 205 | 206 | /@swc/helpers@0.5.2: 207 | resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==} 208 | dependencies: 209 | tslib: 2.6.2 210 | dev: false 211 | 212 | /@types/node@20.11.28: 213 | resolution: {integrity: sha512-M/GPWVS2wLkSkNHVeLkrF2fD5Lx5UC4PxA0uZcKc6QqbIQUJyW1jVjueJYi1z8n0I5PxYrtpnPnWglE+y9A0KA==} 214 | dependencies: 215 | undici-types: 5.26.5 216 | dev: true 217 | 218 | /@types/prop-types@15.7.11: 219 | resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==} 220 | dev: true 221 | 222 | /@types/react-dom@18.2.22: 223 | resolution: {integrity: sha512-fHkBXPeNtfvri6gdsMYyW+dW7RXFo6Ad09nLFK0VQWR7yGLai/Cyvyj696gbwYvBnhGtevUG9cET0pmUbMtoPQ==} 224 | dependencies: 225 | '@types/react': 18.2.66 226 | dev: true 227 | 228 | /@types/react@18.2.66: 229 | resolution: {integrity: sha512-OYTmMI4UigXeFMF/j4uv0lBBEbongSgptPrHBxqME44h9+yNov+oL6Z3ocJKo0WyXR84sQUNeyIp9MRfckvZpg==} 230 | dependencies: 231 | '@types/prop-types': 15.7.11 232 | '@types/scheduler': 0.16.8 233 | csstype: 3.1.3 234 | dev: true 235 | 236 | /@types/scheduler@0.16.8: 237 | resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} 238 | dev: true 239 | 240 | /@vercel/edge-config-fs@0.1.0: 241 | resolution: {integrity: sha512-NRIBwfcS0bUoUbRWlNGetqjvLSwgYH/BqKqDN7vK1g32p7dN96k0712COgaz6VFizAm9b0g6IG6hR6+hc0KCPg==} 242 | dev: false 243 | 244 | /@vercel/edge-config@1.1.0(typescript@5.4.2): 245 | resolution: {integrity: sha512-es/4BzzKfyUilL5E1knR42MZHJqHMRfqitrnv18gVZZUha9ywrX3qNoCrPsNMJ1HS8xAAz/FJEyel7YFIDfKoQ==} 246 | engines: {node: '>=14.6'} 247 | peerDependencies: 248 | '@opentelemetry/api': ^1.7.0 249 | peerDependenciesMeta: 250 | '@opentelemetry/api': 251 | optional: true 252 | dependencies: 253 | '@vercel/edge-config-fs': 0.1.0 254 | ts-essentials: 9.4.1(typescript@5.4.2) 255 | transitivePeerDependencies: 256 | - typescript 257 | dev: false 258 | 259 | /ansi-regex@5.0.1: 260 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 261 | engines: {node: '>=8'} 262 | dev: true 263 | 264 | /ansi-regex@6.0.1: 265 | resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} 266 | engines: {node: '>=12'} 267 | dev: true 268 | 269 | /ansi-styles@4.3.0: 270 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 271 | engines: {node: '>=8'} 272 | dependencies: 273 | color-convert: 2.0.1 274 | dev: true 275 | 276 | /ansi-styles@6.2.1: 277 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 278 | engines: {node: '>=12'} 279 | dev: true 280 | 281 | /any-promise@1.3.0: 282 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} 283 | dev: true 284 | 285 | /anymatch@3.1.3: 286 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 287 | engines: {node: '>= 8'} 288 | dependencies: 289 | normalize-path: 3.0.0 290 | picomatch: 2.3.1 291 | dev: true 292 | 293 | /arg@5.0.2: 294 | resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} 295 | dev: true 296 | 297 | /autoprefixer@10.4.18(postcss@8.4.35): 298 | resolution: {integrity: sha512-1DKbDfsr6KUElM6wg+0zRNkB/Q7WcKYAaK+pzXn+Xqmszm/5Xa9coeNdtP88Vi+dPzZnMjhge8GIV49ZQkDa+g==} 299 | engines: {node: ^10 || ^12 || >=14} 300 | hasBin: true 301 | peerDependencies: 302 | postcss: ^8.1.0 303 | dependencies: 304 | browserslist: 4.23.0 305 | caniuse-lite: 1.0.30001598 306 | fraction.js: 4.3.7 307 | normalize-range: 0.1.2 308 | picocolors: 1.0.0 309 | postcss: 8.4.35 310 | postcss-value-parser: 4.2.0 311 | dev: true 312 | 313 | /balanced-match@1.0.2: 314 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 315 | dev: true 316 | 317 | /binary-extensions@2.3.0: 318 | resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} 319 | engines: {node: '>=8'} 320 | dev: true 321 | 322 | /brace-expansion@2.0.1: 323 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 324 | dependencies: 325 | balanced-match: 1.0.2 326 | dev: true 327 | 328 | /braces@3.0.2: 329 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 330 | engines: {node: '>=8'} 331 | dependencies: 332 | fill-range: 7.0.1 333 | dev: true 334 | 335 | /browserslist@4.23.0: 336 | resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} 337 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 338 | hasBin: true 339 | dependencies: 340 | caniuse-lite: 1.0.30001598 341 | electron-to-chromium: 1.4.708 342 | node-releases: 2.0.14 343 | update-browserslist-db: 1.0.13(browserslist@4.23.0) 344 | dev: true 345 | 346 | /busboy@1.6.0: 347 | resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} 348 | engines: {node: '>=10.16.0'} 349 | dependencies: 350 | streamsearch: 1.1.0 351 | dev: false 352 | 353 | /camelcase-css@2.0.1: 354 | resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} 355 | engines: {node: '>= 6'} 356 | dev: true 357 | 358 | /caniuse-lite@1.0.30001598: 359 | resolution: {integrity: sha512-j8mQRDziG94uoBfeFuqsJUNECW37DXpnvhcMJMdlH2u3MRkq1sAI0LJcXP1i/Py0KbSIC4UDj8YHPrTn5YsL+Q==} 360 | 361 | /chokidar@3.6.0: 362 | resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} 363 | engines: {node: '>= 8.10.0'} 364 | dependencies: 365 | anymatch: 3.1.3 366 | braces: 3.0.2 367 | glob-parent: 5.1.2 368 | is-binary-path: 2.1.0 369 | is-glob: 4.0.3 370 | normalize-path: 3.0.0 371 | readdirp: 3.6.0 372 | optionalDependencies: 373 | fsevents: 2.3.3 374 | dev: true 375 | 376 | /client-only@0.0.1: 377 | resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} 378 | dev: false 379 | 380 | /color-convert@2.0.1: 381 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 382 | engines: {node: '>=7.0.0'} 383 | dependencies: 384 | color-name: 1.1.4 385 | dev: true 386 | 387 | /color-name@1.1.4: 388 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 389 | dev: true 390 | 391 | /commander@4.1.1: 392 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} 393 | engines: {node: '>= 6'} 394 | dev: true 395 | 396 | /cross-spawn@7.0.3: 397 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 398 | engines: {node: '>= 8'} 399 | dependencies: 400 | path-key: 3.1.1 401 | shebang-command: 2.0.0 402 | which: 2.0.2 403 | dev: true 404 | 405 | /cssesc@3.0.0: 406 | resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} 407 | engines: {node: '>=4'} 408 | hasBin: true 409 | dev: true 410 | 411 | /csstype@3.1.3: 412 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 413 | dev: true 414 | 415 | /didyoumean@1.2.2: 416 | resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} 417 | dev: true 418 | 419 | /dlv@1.1.3: 420 | resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} 421 | dev: true 422 | 423 | /eastasianwidth@0.2.0: 424 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 425 | dev: true 426 | 427 | /electron-to-chromium@1.4.708: 428 | resolution: {integrity: sha512-iWgEEvREL4GTXXHKohhh33+6Y8XkPI5eHihDmm8zUk5Zo7HICEW+wI/j5kJ2tbuNUCXJ/sNXa03ajW635DiJXA==} 429 | dev: true 430 | 431 | /emoji-regex@8.0.0: 432 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 433 | dev: true 434 | 435 | /emoji-regex@9.2.2: 436 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 437 | dev: true 438 | 439 | /escalade@3.1.2: 440 | resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} 441 | engines: {node: '>=6'} 442 | dev: true 443 | 444 | /fast-glob@3.3.2: 445 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 446 | engines: {node: '>=8.6.0'} 447 | dependencies: 448 | '@nodelib/fs.stat': 2.0.5 449 | '@nodelib/fs.walk': 1.2.8 450 | glob-parent: 5.1.2 451 | merge2: 1.4.1 452 | micromatch: 4.0.5 453 | dev: true 454 | 455 | /fastq@1.17.1: 456 | resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} 457 | dependencies: 458 | reusify: 1.0.4 459 | dev: true 460 | 461 | /fill-range@7.0.1: 462 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 463 | engines: {node: '>=8'} 464 | dependencies: 465 | to-regex-range: 5.0.1 466 | dev: true 467 | 468 | /foreground-child@3.1.1: 469 | resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} 470 | engines: {node: '>=14'} 471 | dependencies: 472 | cross-spawn: 7.0.3 473 | signal-exit: 4.1.0 474 | dev: true 475 | 476 | /fraction.js@4.3.7: 477 | resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} 478 | dev: true 479 | 480 | /fsevents@2.3.3: 481 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 482 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 483 | os: [darwin] 484 | requiresBuild: true 485 | dev: true 486 | optional: true 487 | 488 | /function-bind@1.1.2: 489 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 490 | dev: true 491 | 492 | /glob-parent@5.1.2: 493 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 494 | engines: {node: '>= 6'} 495 | dependencies: 496 | is-glob: 4.0.3 497 | dev: true 498 | 499 | /glob-parent@6.0.2: 500 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 501 | engines: {node: '>=10.13.0'} 502 | dependencies: 503 | is-glob: 4.0.3 504 | dev: true 505 | 506 | /glob@10.3.10: 507 | resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} 508 | engines: {node: '>=16 || 14 >=14.17'} 509 | hasBin: true 510 | dependencies: 511 | foreground-child: 3.1.1 512 | jackspeak: 2.3.6 513 | minimatch: 9.0.3 514 | minipass: 7.0.4 515 | path-scurry: 1.10.1 516 | dev: true 517 | 518 | /graceful-fs@4.2.11: 519 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 520 | dev: false 521 | 522 | /hasown@2.0.2: 523 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 524 | engines: {node: '>= 0.4'} 525 | dependencies: 526 | function-bind: 1.1.2 527 | dev: true 528 | 529 | /is-binary-path@2.1.0: 530 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 531 | engines: {node: '>=8'} 532 | dependencies: 533 | binary-extensions: 2.3.0 534 | dev: true 535 | 536 | /is-core-module@2.13.1: 537 | resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} 538 | dependencies: 539 | hasown: 2.0.2 540 | dev: true 541 | 542 | /is-extglob@2.1.1: 543 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 544 | engines: {node: '>=0.10.0'} 545 | dev: true 546 | 547 | /is-fullwidth-code-point@3.0.0: 548 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 549 | engines: {node: '>=8'} 550 | dev: true 551 | 552 | /is-glob@4.0.3: 553 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 554 | engines: {node: '>=0.10.0'} 555 | dependencies: 556 | is-extglob: 2.1.1 557 | dev: true 558 | 559 | /is-number@7.0.0: 560 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 561 | engines: {node: '>=0.12.0'} 562 | dev: true 563 | 564 | /isexe@2.0.0: 565 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 566 | dev: true 567 | 568 | /jackspeak@2.3.6: 569 | resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} 570 | engines: {node: '>=14'} 571 | dependencies: 572 | '@isaacs/cliui': 8.0.2 573 | optionalDependencies: 574 | '@pkgjs/parseargs': 0.11.0 575 | dev: true 576 | 577 | /jiti@1.21.0: 578 | resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} 579 | hasBin: true 580 | dev: true 581 | 582 | /js-tokens@4.0.0: 583 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 584 | dev: false 585 | 586 | /lilconfig@2.1.0: 587 | resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} 588 | engines: {node: '>=10'} 589 | dev: true 590 | 591 | /lilconfig@3.1.1: 592 | resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} 593 | engines: {node: '>=14'} 594 | dev: true 595 | 596 | /lines-and-columns@1.2.4: 597 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 598 | dev: true 599 | 600 | /loose-envify@1.4.0: 601 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} 602 | hasBin: true 603 | dependencies: 604 | js-tokens: 4.0.0 605 | dev: false 606 | 607 | /lru-cache@10.2.0: 608 | resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} 609 | engines: {node: 14 || >=16.14} 610 | dev: true 611 | 612 | /merge2@1.4.1: 613 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 614 | engines: {node: '>= 8'} 615 | dev: true 616 | 617 | /micromatch@4.0.5: 618 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 619 | engines: {node: '>=8.6'} 620 | dependencies: 621 | braces: 3.0.2 622 | picomatch: 2.3.1 623 | dev: true 624 | 625 | /minimatch@9.0.3: 626 | resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} 627 | engines: {node: '>=16 || 14 >=14.17'} 628 | dependencies: 629 | brace-expansion: 2.0.1 630 | dev: true 631 | 632 | /minipass@7.0.4: 633 | resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} 634 | engines: {node: '>=16 || 14 >=14.17'} 635 | dev: true 636 | 637 | /mz@2.7.0: 638 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} 639 | dependencies: 640 | any-promise: 1.3.0 641 | object-assign: 4.1.1 642 | thenify-all: 1.6.0 643 | dev: true 644 | 645 | /nanoid@3.3.7: 646 | resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} 647 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 648 | hasBin: true 649 | 650 | /next@14.1.4(react-dom@18.2.0)(react@18.2.0): 651 | resolution: {integrity: sha512-1WTaXeSrUwlz/XcnhGTY7+8eiaFvdet5z9u3V2jb+Ek1vFo0VhHKSAIJvDWfQpttWjnyw14kBeq28TPq7bTeEQ==} 652 | engines: {node: '>=18.17.0'} 653 | hasBin: true 654 | peerDependencies: 655 | '@opentelemetry/api': ^1.1.0 656 | react: ^18.2.0 657 | react-dom: ^18.2.0 658 | sass: ^1.3.0 659 | peerDependenciesMeta: 660 | '@opentelemetry/api': 661 | optional: true 662 | sass: 663 | optional: true 664 | dependencies: 665 | '@next/env': 14.1.4 666 | '@swc/helpers': 0.5.2 667 | busboy: 1.6.0 668 | caniuse-lite: 1.0.30001598 669 | graceful-fs: 4.2.11 670 | postcss: 8.4.31 671 | react: 18.2.0 672 | react-dom: 18.2.0(react@18.2.0) 673 | styled-jsx: 5.1.1(react@18.2.0) 674 | optionalDependencies: 675 | '@next/swc-darwin-arm64': 14.1.4 676 | '@next/swc-darwin-x64': 14.1.4 677 | '@next/swc-linux-arm64-gnu': 14.1.4 678 | '@next/swc-linux-arm64-musl': 14.1.4 679 | '@next/swc-linux-x64-gnu': 14.1.4 680 | '@next/swc-linux-x64-musl': 14.1.4 681 | '@next/swc-win32-arm64-msvc': 14.1.4 682 | '@next/swc-win32-ia32-msvc': 14.1.4 683 | '@next/swc-win32-x64-msvc': 14.1.4 684 | transitivePeerDependencies: 685 | - '@babel/core' 686 | - babel-plugin-macros 687 | dev: false 688 | 689 | /node-releases@2.0.14: 690 | resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} 691 | dev: true 692 | 693 | /normalize-path@3.0.0: 694 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 695 | engines: {node: '>=0.10.0'} 696 | dev: true 697 | 698 | /normalize-range@0.1.2: 699 | resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} 700 | engines: {node: '>=0.10.0'} 701 | dev: true 702 | 703 | /object-assign@4.1.1: 704 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 705 | engines: {node: '>=0.10.0'} 706 | dev: true 707 | 708 | /object-hash@3.0.0: 709 | resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} 710 | engines: {node: '>= 6'} 711 | dev: true 712 | 713 | /path-key@3.1.1: 714 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 715 | engines: {node: '>=8'} 716 | dev: true 717 | 718 | /path-parse@1.0.7: 719 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 720 | dev: true 721 | 722 | /path-scurry@1.10.1: 723 | resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} 724 | engines: {node: '>=16 || 14 >=14.17'} 725 | dependencies: 726 | lru-cache: 10.2.0 727 | minipass: 7.0.4 728 | dev: true 729 | 730 | /picocolors@1.0.0: 731 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 732 | 733 | /picomatch@2.3.1: 734 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 735 | engines: {node: '>=8.6'} 736 | dev: true 737 | 738 | /pify@2.3.0: 739 | resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} 740 | engines: {node: '>=0.10.0'} 741 | dev: true 742 | 743 | /pirates@4.0.6: 744 | resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} 745 | engines: {node: '>= 6'} 746 | dev: true 747 | 748 | /postcss-import@15.1.0(postcss@8.4.35): 749 | resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} 750 | engines: {node: '>=14.0.0'} 751 | peerDependencies: 752 | postcss: ^8.0.0 753 | dependencies: 754 | postcss: 8.4.35 755 | postcss-value-parser: 4.2.0 756 | read-cache: 1.0.0 757 | resolve: 1.22.8 758 | dev: true 759 | 760 | /postcss-js@4.0.1(postcss@8.4.35): 761 | resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} 762 | engines: {node: ^12 || ^14 || >= 16} 763 | peerDependencies: 764 | postcss: ^8.4.21 765 | dependencies: 766 | camelcase-css: 2.0.1 767 | postcss: 8.4.35 768 | dev: true 769 | 770 | /postcss-load-config@4.0.2(postcss@8.4.35): 771 | resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} 772 | engines: {node: '>= 14'} 773 | peerDependencies: 774 | postcss: '>=8.0.9' 775 | ts-node: '>=9.0.0' 776 | peerDependenciesMeta: 777 | postcss: 778 | optional: true 779 | ts-node: 780 | optional: true 781 | dependencies: 782 | lilconfig: 3.1.1 783 | postcss: 8.4.35 784 | yaml: 2.4.1 785 | dev: true 786 | 787 | /postcss-nested@6.0.1(postcss@8.4.35): 788 | resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} 789 | engines: {node: '>=12.0'} 790 | peerDependencies: 791 | postcss: ^8.2.14 792 | dependencies: 793 | postcss: 8.4.35 794 | postcss-selector-parser: 6.0.16 795 | dev: true 796 | 797 | /postcss-selector-parser@6.0.16: 798 | resolution: {integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==} 799 | engines: {node: '>=4'} 800 | dependencies: 801 | cssesc: 3.0.0 802 | util-deprecate: 1.0.2 803 | dev: true 804 | 805 | /postcss-value-parser@4.2.0: 806 | resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} 807 | dev: true 808 | 809 | /postcss@8.4.31: 810 | resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} 811 | engines: {node: ^10 || ^12 || >=14} 812 | dependencies: 813 | nanoid: 3.3.7 814 | picocolors: 1.0.0 815 | source-map-js: 1.0.2 816 | dev: false 817 | 818 | /postcss@8.4.35: 819 | resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} 820 | engines: {node: ^10 || ^12 || >=14} 821 | dependencies: 822 | nanoid: 3.3.7 823 | picocolors: 1.0.0 824 | source-map-js: 1.0.2 825 | dev: true 826 | 827 | /queue-microtask@1.2.3: 828 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 829 | dev: true 830 | 831 | /react-dom@18.2.0(react@18.2.0): 832 | resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} 833 | peerDependencies: 834 | react: ^18.2.0 835 | dependencies: 836 | loose-envify: 1.4.0 837 | react: 18.2.0 838 | scheduler: 0.23.0 839 | dev: false 840 | 841 | /react@18.2.0: 842 | resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} 843 | engines: {node: '>=0.10.0'} 844 | dependencies: 845 | loose-envify: 1.4.0 846 | dev: false 847 | 848 | /read-cache@1.0.0: 849 | resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} 850 | dependencies: 851 | pify: 2.3.0 852 | dev: true 853 | 854 | /readdirp@3.6.0: 855 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 856 | engines: {node: '>=8.10.0'} 857 | dependencies: 858 | picomatch: 2.3.1 859 | dev: true 860 | 861 | /resolve@1.22.8: 862 | resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} 863 | hasBin: true 864 | dependencies: 865 | is-core-module: 2.13.1 866 | path-parse: 1.0.7 867 | supports-preserve-symlinks-flag: 1.0.0 868 | dev: true 869 | 870 | /reusify@1.0.4: 871 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 872 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 873 | dev: true 874 | 875 | /run-parallel@1.2.0: 876 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 877 | dependencies: 878 | queue-microtask: 1.2.3 879 | dev: true 880 | 881 | /scheduler@0.23.0: 882 | resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} 883 | dependencies: 884 | loose-envify: 1.4.0 885 | dev: false 886 | 887 | /shebang-command@2.0.0: 888 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 889 | engines: {node: '>=8'} 890 | dependencies: 891 | shebang-regex: 3.0.0 892 | dev: true 893 | 894 | /shebang-regex@3.0.0: 895 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 896 | engines: {node: '>=8'} 897 | dev: true 898 | 899 | /signal-exit@4.1.0: 900 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 901 | engines: {node: '>=14'} 902 | dev: true 903 | 904 | /source-map-js@1.0.2: 905 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 906 | engines: {node: '>=0.10.0'} 907 | 908 | /streamsearch@1.1.0: 909 | resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} 910 | engines: {node: '>=10.0.0'} 911 | dev: false 912 | 913 | /string-width@4.2.3: 914 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 915 | engines: {node: '>=8'} 916 | dependencies: 917 | emoji-regex: 8.0.0 918 | is-fullwidth-code-point: 3.0.0 919 | strip-ansi: 6.0.1 920 | dev: true 921 | 922 | /string-width@5.1.2: 923 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 924 | engines: {node: '>=12'} 925 | dependencies: 926 | eastasianwidth: 0.2.0 927 | emoji-regex: 9.2.2 928 | strip-ansi: 7.1.0 929 | dev: true 930 | 931 | /strip-ansi@6.0.1: 932 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 933 | engines: {node: '>=8'} 934 | dependencies: 935 | ansi-regex: 5.0.1 936 | dev: true 937 | 938 | /strip-ansi@7.1.0: 939 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 940 | engines: {node: '>=12'} 941 | dependencies: 942 | ansi-regex: 6.0.1 943 | dev: true 944 | 945 | /styled-jsx@5.1.1(react@18.2.0): 946 | resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} 947 | engines: {node: '>= 12.0.0'} 948 | peerDependencies: 949 | '@babel/core': '*' 950 | babel-plugin-macros: '*' 951 | react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' 952 | peerDependenciesMeta: 953 | '@babel/core': 954 | optional: true 955 | babel-plugin-macros: 956 | optional: true 957 | dependencies: 958 | client-only: 0.0.1 959 | react: 18.2.0 960 | dev: false 961 | 962 | /sucrase@3.35.0: 963 | resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} 964 | engines: {node: '>=16 || 14 >=14.17'} 965 | hasBin: true 966 | dependencies: 967 | '@jridgewell/gen-mapping': 0.3.5 968 | commander: 4.1.1 969 | glob: 10.3.10 970 | lines-and-columns: 1.2.4 971 | mz: 2.7.0 972 | pirates: 4.0.6 973 | ts-interface-checker: 0.1.13 974 | dev: true 975 | 976 | /supports-preserve-symlinks-flag@1.0.0: 977 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 978 | engines: {node: '>= 0.4'} 979 | dev: true 980 | 981 | /tailwindcss@3.4.1: 982 | resolution: {integrity: sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==} 983 | engines: {node: '>=14.0.0'} 984 | hasBin: true 985 | dependencies: 986 | '@alloc/quick-lru': 5.2.0 987 | arg: 5.0.2 988 | chokidar: 3.6.0 989 | didyoumean: 1.2.2 990 | dlv: 1.1.3 991 | fast-glob: 3.3.2 992 | glob-parent: 6.0.2 993 | is-glob: 4.0.3 994 | jiti: 1.21.0 995 | lilconfig: 2.1.0 996 | micromatch: 4.0.5 997 | normalize-path: 3.0.0 998 | object-hash: 3.0.0 999 | picocolors: 1.0.0 1000 | postcss: 8.4.35 1001 | postcss-import: 15.1.0(postcss@8.4.35) 1002 | postcss-js: 4.0.1(postcss@8.4.35) 1003 | postcss-load-config: 4.0.2(postcss@8.4.35) 1004 | postcss-nested: 6.0.1(postcss@8.4.35) 1005 | postcss-selector-parser: 6.0.16 1006 | resolve: 1.22.8 1007 | sucrase: 3.35.0 1008 | transitivePeerDependencies: 1009 | - ts-node 1010 | dev: true 1011 | 1012 | /thenify-all@1.6.0: 1013 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} 1014 | engines: {node: '>=0.8'} 1015 | dependencies: 1016 | thenify: 3.3.1 1017 | dev: true 1018 | 1019 | /thenify@3.3.1: 1020 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} 1021 | dependencies: 1022 | any-promise: 1.3.0 1023 | dev: true 1024 | 1025 | /to-regex-range@5.0.1: 1026 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1027 | engines: {node: '>=8.0'} 1028 | dependencies: 1029 | is-number: 7.0.0 1030 | dev: true 1031 | 1032 | /ts-essentials@9.4.1(typescript@5.4.2): 1033 | resolution: {integrity: sha512-oke0rI2EN9pzHsesdmrOrnqv1eQODmJpd/noJjwj2ZPC3Z4N2wbjrOEqnsEgmvlO2+4fBb0a794DCna2elEVIQ==} 1034 | peerDependencies: 1035 | typescript: '>=4.1.0' 1036 | peerDependenciesMeta: 1037 | typescript: 1038 | optional: true 1039 | dependencies: 1040 | typescript: 5.4.2 1041 | dev: false 1042 | 1043 | /ts-interface-checker@0.1.13: 1044 | resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} 1045 | dev: true 1046 | 1047 | /tslib@2.6.2: 1048 | resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} 1049 | dev: false 1050 | 1051 | /typescript@5.4.2: 1052 | resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} 1053 | engines: {node: '>=14.17'} 1054 | hasBin: true 1055 | 1056 | /undici-types@5.26.5: 1057 | resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} 1058 | dev: true 1059 | 1060 | /update-browserslist-db@1.0.13(browserslist@4.23.0): 1061 | resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} 1062 | hasBin: true 1063 | peerDependencies: 1064 | browserslist: '>= 4.21.0' 1065 | dependencies: 1066 | browserslist: 4.23.0 1067 | escalade: 3.1.2 1068 | picocolors: 1.0.0 1069 | dev: true 1070 | 1071 | /util-deprecate@1.0.2: 1072 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 1073 | dev: true 1074 | 1075 | /which@2.0.2: 1076 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1077 | engines: {node: '>= 8'} 1078 | hasBin: true 1079 | dependencies: 1080 | isexe: 2.0.0 1081 | dev: true 1082 | 1083 | /wrap-ansi@7.0.0: 1084 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1085 | engines: {node: '>=10'} 1086 | dependencies: 1087 | ansi-styles: 4.3.0 1088 | string-width: 4.2.3 1089 | strip-ansi: 6.0.1 1090 | dev: true 1091 | 1092 | /wrap-ansi@8.1.0: 1093 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 1094 | engines: {node: '>=12'} 1095 | dependencies: 1096 | ansi-styles: 6.2.1 1097 | string-width: 5.1.2 1098 | strip-ansi: 7.1.0 1099 | dev: true 1100 | 1101 | /yaml@2.4.1: 1102 | resolution: {integrity: sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==} 1103 | engines: {node: '>= 14'} 1104 | hasBin: true 1105 | dev: true 1106 | --------------------------------------------------------------------------------