[
  {
    "path": ".changeset/config.json",
    "content": "{\n  \"$schema\": \"https://unpkg.com/@changesets/config@3.1.1/schema.json\",\n  \"changelog\": [\n    \"@changesets/changelog-github\",\n    { \"repo\": \"vercel-labs/chatbot\" }\n  ],\n  \"commit\": false,\n  \"fixed\": [],\n  \"linked\": [],\n  \"access\": \"public\",\n  \"baseBranch\": \"main\",\n  \"updateInternalDependencies\": \"patch\",\n  \"ignore\": []\n}\n"
  },
  {
    "path": ".cursor/rules/ultracite.mdc",
    "content": "---\ndescription: Ultracite Rules - AI-Ready Formatter and Linter\nglobs: \"**/*.{ts,tsx,js,jsx}\"\nalwaysApply: true\n---\n\n# Project Context\nUltracite enforces strict type safety, accessibility standards, and consistent code quality for JavaScript/TypeScript projects using Biome's lightning-fast formatter and linter.\n\n## Key Principles\n- Zero configuration required\n- Subsecond performance\n- Maximum type safety\n- AI-friendly code generation\n\n## Before Writing Code\n1. Analyze existing patterns in the codebase\n2. Consider edge cases and error scenarios\n3. Follow the rules below strictly\n4. Validate accessibility requirements\n\n## Rules\n\n### Accessibility (a11y)\n- Don't use `accessKey` attribute on any HTML element.\n- Don't set `aria-hidden=\"true\"` on focusable elements.\n- Don't add ARIA roles, states, and properties to elements that don't support them.\n- Don't use distracting elements like `<marquee>` or `<blink>`.\n- Only use the `scope` prop on `<th>` elements.\n- Don't assign non-interactive ARIA roles to interactive HTML elements.\n- Make sure label elements have text content and are associated with an input.\n- Don't assign interactive ARIA roles to non-interactive HTML elements.\n- Don't assign `tabIndex` to non-interactive HTML elements.\n- Don't use positive integers for `tabIndex` property.\n- Don't include \"image\", \"picture\", or \"photo\" in img alt prop.\n- Don't use explicit role property that's the same as the implicit/default role.\n- Make static elements with click handlers use a valid role attribute.\n- Always include a `title` element for SVG elements.\n- Give all elements requiring alt text meaningful information for screen readers.\n- Make sure anchors have content that's accessible to screen readers.\n- Assign `tabIndex` to non-interactive HTML elements with `aria-activedescendant`.\n- Include all required ARIA attributes for elements with ARIA roles.\n- Make sure ARIA properties are valid for the element's supported roles.\n- Always include a `type` attribute for button elements.\n- Make elements with interactive roles and handlers focusable.\n- Give heading elements content that's accessible to screen readers (not hidden with `aria-hidden`).\n- Always include a `lang` attribute on the html element.\n- Always include a `title` attribute for iframe elements.\n- Accompany `onClick` with at least one of: `onKeyUp`, `onKeyDown`, or `onKeyPress`.\n- Accompany `onMouseOver`/`onMouseOut` with `onFocus`/`onBlur`.\n- Include caption tracks for audio and video elements.\n- Use semantic elements instead of role attributes in JSX.\n- Make sure all anchors are valid and navigable.\n- Ensure all ARIA properties (`aria-*`) are valid.\n- Use valid, non-abstract ARIA roles for elements with ARIA roles.\n- Use valid ARIA state and property values.\n- Use valid values for the `autocomplete` attribute on input elements.\n- Use correct ISO language/country codes for the `lang` attribute.\n\n### Code Complexity and Quality\n- Don't use consecutive spaces in regular expression literals.\n- Don't use the `arguments` object.\n- Don't use primitive type aliases or misleading types.\n- Don't use the comma operator.\n- Don't use empty type parameters in type aliases and interfaces.\n- Don't write functions that exceed a given Cognitive Complexity score.\n- Don't nest describe() blocks too deeply in test files.\n- Don't use unnecessary boolean casts.\n- Don't use unnecessary callbacks with flatMap.\n- Use for...of statements instead of Array.forEach.\n- Don't create classes that only have static members (like a static namespace).\n- Don't use this and super in static contexts.\n- Don't use unnecessary catch clauses.\n- Don't use unnecessary constructors.\n- Don't use unnecessary continue statements.\n- Don't export empty modules that don't change anything.\n- Don't use unnecessary escape sequences in regular expression literals.\n- Don't use unnecessary fragments.\n- Don't use unnecessary labels.\n- Don't use unnecessary nested block statements.\n- Don't rename imports, exports, and destructured assignments to the same name.\n- Don't use unnecessary string or template literal concatenation.\n- Don't use String.raw in template literals when there are no escape sequences.\n- Don't use useless case statements in switch statements.\n- Don't use ternary operators when simpler alternatives exist.\n- Don't use useless `this` aliasing.\n- Don't use any or unknown as type constraints.\n- Don't initialize variables to undefined.\n- Don't use the void operators (they're not familiar).\n- Use arrow functions instead of function expressions.\n- Use Date.now() to get milliseconds since the Unix Epoch.\n- Use .flatMap() instead of map().flat() when possible.\n- Use literal property access instead of computed property access.\n- Don't use parseInt() or Number.parseInt() when binary, octal, or hexadecimal literals work.\n- Use concise optional chaining instead of chained logical expressions.\n- Use regular expression literals instead of the RegExp constructor when possible.\n- Don't use number literal object member names that aren't base 10 or use underscore separators.\n- Remove redundant terms from logical expressions.\n- Use while loops instead of for loops when you don't need initializer and update expressions.\n- Don't pass children as props.\n- Don't reassign const variables.\n- Don't use constant expressions in conditions.\n- Don't use `Math.min` and `Math.max` to clamp values when the result is constant.\n- Don't return a value from a constructor.\n- Don't use empty character classes in regular expression literals.\n- Don't use empty destructuring patterns.\n- Don't call global object properties as functions.\n- Don't declare functions and vars that are accessible outside their block.\n- Make sure builtins are correctly instantiated.\n- Don't use super() incorrectly inside classes. Also check that super() is called in classes that extend other constructors.\n- Don't use variables and function parameters before they're declared.\n- Don't use 8 and 9 escape sequences in string literals.\n- Don't use literal numbers that lose precision.\n\n### React and JSX Best Practices\n- Don't use the return value of React.render.\n- Make sure all dependencies are correctly specified in React hooks.\n- Make sure all React hooks are called from the top level of component functions.\n- Don't forget key props in iterators and collection literals.\n- Don't destructure props inside JSX components in Solid projects.\n- Don't define React components inside other components.\n- Don't use event handlers on non-interactive elements.\n- Don't assign to React component props.\n- Don't use both `children` and `dangerouslySetInnerHTML` props on the same element.\n- Don't use dangerous JSX props.\n- Don't use Array index in keys.\n- Don't insert comments as text nodes.\n- Don't assign JSX properties multiple times.\n- Don't add extra closing tags for components without children.\n- Use `<>...</>` instead of `<Fragment>...</Fragment>`.\n- Watch out for possible \"wrong\" semicolons inside JSX elements.\n\n### Correctness and Safety\n- Don't assign a value to itself.\n- Don't return a value from a setter.\n- Don't compare expressions that modify string case with non-compliant values.\n- Don't use lexical declarations in switch clauses.\n- Don't use variables that haven't been declared in the document.\n- Don't write unreachable code.\n- Make sure super() is called exactly once on every code path in a class constructor before this is accessed if the class has a superclass.\n- Don't use control flow statements in finally blocks.\n- Don't use optional chaining where undefined values aren't allowed.\n- Don't have unused function parameters.\n- Don't have unused imports.\n- Don't have unused labels.\n- Don't have unused private class members.\n- Don't have unused variables.\n- Make sure void (self-closing) elements don't have children.\n- Don't return a value from a function with the return type 'void'\n- Use isNaN() when checking for NaN.\n- Make sure \"for\" loop update clauses move the counter in the right direction.\n- Make sure typeof expressions are compared to valid values.\n- Make sure generator functions contain yield.\n- Don't use await inside loops.\n- Don't use bitwise operators.\n- Don't use expressions where the operation doesn't change the value.\n- Make sure Promise-like statements are handled appropriately.\n- Don't use __dirname and __filename in the global scope.\n- Prevent import cycles.\n- Don't use configured elements.\n- Don't hardcode sensitive data like API keys and tokens.\n- Don't let variable declarations shadow variables from outer scopes.\n- Don't use the TypeScript directive @ts-ignore.\n- Prevent duplicate polyfills from Polyfill.io.\n- Don't use useless backreferences in regular expressions that always match empty strings.\n- Don't use unnecessary escapes in string literals.\n- Don't use useless undefined.\n- Make sure getters and setters for the same property are next to each other in class and object definitions.\n- Make sure object literals are declared consistently (defaults to explicit definitions).\n- Use static Response methods instead of new Response() constructor when possible.\n- Make sure switch-case statements are exhaustive.\n- Make sure the `preconnect` attribute is used when using Google Fonts.\n- Use `Array#{indexOf,lastIndexOf}()` instead of `Array#{findIndex,findLastIndex}()` when looking for the index of an item.\n- Make sure iterable callbacks return consistent values.\n- Use `with { type: \"json\" }` for JSON module imports.\n- Use numeric separators in numeric literals.\n- Use object spread instead of `Object.assign()` when constructing new objects.\n- Always use the radix argument when using `parseInt()`.\n- Make sure JSDoc comment lines start with a single asterisk, except for the first one.\n- Include a description parameter for `Symbol()`.\n- Don't use spread (`...`) syntax on accumulators.\n- Don't use the `delete` operator.\n- Don't access namespace imports dynamically.\n- Don't use namespace imports.\n- Declare regex literals at the top level.\n- Don't use `target=\"_blank\"` without `rel=\"noopener\"`.\n\n### TypeScript Best Practices\n- Don't use TypeScript enums.\n- Don't export imported variables.\n- Don't add type annotations to variables, parameters, and class properties that are initialized with literal expressions.\n- Don't use TypeScript namespaces.\n- Don't use non-null assertions with the `!` postfix operator.\n- Don't use parameter properties in class constructors.\n- Don't use user-defined types.\n- Use `as const` instead of literal types and type annotations.\n- Use either `T[]` or `Array<T>` consistently.\n- Initialize each enum member value explicitly.\n- Use `export type` for types.\n- Use `import type` for types.\n- Make sure all enum members are literal values.\n- Don't use TypeScript const enum.\n- Don't declare empty interfaces.\n- Don't let variables evolve into any type through reassignments.\n- Don't use the any type.\n- Don't misuse the non-null assertion operator (!) in TypeScript files.\n- Don't use implicit any type on variable declarations.\n- Don't merge interfaces and classes unsafely.\n- Don't use overload signatures that aren't next to each other.\n- Use the namespace keyword instead of the module keyword to declare TypeScript namespaces.\n\n### Style and Consistency\n- Don't use global `eval()`.\n- Don't use callbacks in asynchronous tests and hooks.\n- Don't use negation in `if` statements that have `else` clauses.\n- Don't use nested ternary expressions.\n- Don't reassign function parameters.\n- This rule lets you specify global variable names you don't want to use in your application.\n- Don't use specified modules when loaded by import or require.\n- Don't use constants whose value is the upper-case version of their name.\n- Use `String.slice()` instead of `String.substr()` and `String.substring()`.\n- Don't use template literals if you don't need interpolation or special-character handling.\n- Don't use `else` blocks when the `if` block breaks early.\n- Don't use yoda expressions.\n- Don't use Array constructors.\n- Use `at()` instead of integer index access.\n- Follow curly brace conventions.\n- Use `else if` instead of nested `if` statements in `else` clauses.\n- Use single `if` statements instead of nested `if` clauses.\n- Use `new` for all builtins except `String`, `Number`, and `Boolean`.\n- Use consistent accessibility modifiers on class properties and methods.\n- Use `const` declarations for variables that are only assigned once.\n- Put default function parameters and optional function parameters last.\n- Include a `default` clause in switch statements.\n- Use the `**` operator instead of `Math.pow`.\n- Use `for-of` loops when you need the index to extract an item from the iterated array.\n- Use `node:assert/strict` over `node:assert`.\n- Use the `node:` protocol for Node.js builtin modules.\n- Use Number properties instead of global ones.\n- Use assignment operator shorthand where possible.\n- Use function types instead of object types with call signatures.\n- Use template literals over string concatenation.\n- Use `new` when throwing an error.\n- Don't throw non-Error values.\n- Use `String.trimStart()` and `String.trimEnd()` over `String.trimLeft()` and `String.trimRight()`.\n- Use standard constants instead of approximated literals.\n- Don't assign values in expressions.\n- Don't use async functions as Promise executors.\n- Don't reassign exceptions in catch clauses.\n- Don't reassign class members.\n- Don't compare against -0.\n- Don't use labeled statements that aren't loops.\n- Don't use void type outside of generic or return types.\n- Don't use console.\n- Don't use control characters and escape sequences that match control characters in regular expression literals.\n- Don't use debugger.\n- Don't assign directly to document.cookie.\n- Use `===` and `!==`.\n- Don't use duplicate case labels.\n- Don't use duplicate class members.\n- Don't use duplicate conditions in if-else-if chains.\n- Don't use two keys with the same name inside objects.\n- Don't use duplicate function parameter names.\n- Don't have duplicate hooks in describe blocks.\n- Don't use empty block statements and static blocks.\n- Don't let switch clauses fall through.\n- Don't reassign function declarations.\n- Don't allow assignments to native objects and read-only global variables.\n- Use Number.isFinite instead of global isFinite.\n- Use Number.isNaN instead of global isNaN.\n- Don't assign to imported bindings.\n- Don't use irregular whitespace characters.\n- Don't use labels that share a name with a variable.\n- Don't use characters made with multiple code points in character class syntax.\n- Make sure to use new and constructor properly.\n- Don't use shorthand assign when the variable appears on both sides.\n- Don't use octal escape sequences in string literals.\n- Don't use Object.prototype builtins directly.\n- Don't redeclare variables, functions, classes, and types in the same scope.\n- Don't have redundant \"use strict\".\n- Don't compare things where both sides are exactly the same.\n- Don't let identifiers shadow restricted names.\n- Don't use sparse arrays (arrays with holes).\n- Don't use template literal placeholder syntax in regular strings.\n- Don't use the then property.\n- Don't use unsafe negation.\n- Don't use var.\n- Don't use with statements in non-strict contexts.\n- Make sure async functions actually use await.\n- Make sure default clauses in switch statements come last.\n- Make sure to pass a message value when creating a built-in error.\n- Make sure get methods always return a value.\n- Use a recommended display strategy with Google Fonts.\n- Make sure for-in loops include an if statement.\n- Use Array.isArray() instead of instanceof Array.\n- Make sure to use the digits argument with Number#toFixed().\n- Make sure to use the \"use strict\" directive in script files.\n\n### Next.js Specific Rules\n- Don't use `<img>` elements in Next.js projects.\n- Don't use `<head>` elements in Next.js projects.\n- Don't import next/document outside of pages/_document.jsx in Next.js projects.\n- Don't use the next/head module in pages/_document.js on Next.js projects.\n\n### Testing Best Practices\n- Don't use export or module.exports in test files.\n- Don't use focused tests.\n- Make sure the assertion function, like expect, is placed inside an it() function call.\n- Don't use disabled tests.\n\n## Common Tasks\n- `npx ultracite init` - Initialize Ultracite in your project\n- `npx ultracite fix` - Format and fix code automatically\n- `npx ultracite check` - Check for issues without fixing\n\n## Example: Error Handling\n```typescript\n// ✅ Good: Comprehensive error handling\ntry {\n  const result = await fetchData();\n  return { success: true, data: result };\n} catch (error) {\n  console.error('API call failed:', error);\n  return { success: false, error: error.message };\n}\n\n// ❌ Bad: Swallowing errors\ntry {\n  return await fetchData();\n} catch (e) {\n  console.log(e);\n}\n```"
  },
  {
    "path": ".github/CONTRIBUTING.md",
    "content": "# Contributing\n\nThanks for your interest in contributing to the chatbot template! Here's how to get started.\n\n## Development\n\n1. Fork and clone the repository\n2. Install dependencies with `pnpm install`\n3. Create a new branch from `demo` for your work\n\n## Changesets\n\nThis project uses [Changesets](https://github.com/changesets/changesets) to manage versioning and releases. When you make a change that should be included in the next release, you need to add a changeset.\n\n### Adding a changeset\n\nRun the following command from the root of the repository:\n\n```bash\npnpm changeset\n```\n\nYou'll be prompted to:\n\n1. **Select the bump type** — `patch` for bug fixes, `minor` for new features, `major` for breaking changes\n2. **Write a summary** — a short description of your change that will appear in the changelog\n\nThis creates a Markdown file in the `.changeset` directory. Commit this file along with your code changes.\n\n### When to add a changeset\n\n- Bug fixes, new features, breaking changes, dependency updates, and other user-facing changes should include a changeset\n- Internal refactors, test-only changes, and documentation updates typically don't need one\n\n### What happens next\n\nWhen your changes land on `main`, the release workflow picks up any changeset files and opens a \"Version Package\" PR. Merging that PR bumps the version, updates the changelog, and creates a GitHub Release.\n\n## Pull requests\n\n- Open PRs against the `demo` branch\n- Include a changeset if your change affects the release\n- Keep PRs focused — one feature or fix per PR\n"
  },
  {
    "path": ".github/workflows/lint.yml",
    "content": "name: Lint\non:\n  push:\n\njobs:\n  build:\n    runs-on: ubuntu-22.04\n    strategy:\n      matrix:\n        node-version: [20]\n    steps:\n      - uses: actions/checkout@v4\n      - name: Install pnpm\n        uses: pnpm/action-setup@v4\n        with:\n          version: 9.12.3\n      - name: Use Node.js ${{ matrix.node-version }}\n        uses: actions/setup-node@v4\n        with:\n          node-version: ${{ matrix.node-version }}\n          cache: \"pnpm\"\n      - name: Install dependencies\n        run: pnpm install\n      - name: Run check\n        run: pnpm check\n"
  },
  {
    "path": ".github/workflows/playwright.yml",
    "content": "name: Playwright Tests\non:\n  push:\n    branches: [main, master]\n  pull_request:\n    branches: [main, master]\n\njobs:\n  test:\n    timeout-minutes: 30\n    runs-on: ubuntu-latest\n    env:\n      AUTH_SECRET: ${{ secrets.AUTH_SECRET }}\n      POSTGRES_URL: ${{ secrets.POSTGRES_URL }}\n      BLOB_READ_WRITE_TOKEN: ${{ secrets.BLOB_READ_WRITE_TOKEN }}\n      REDIS_URL: ${{ secrets.REDIS_URL }}\n\n    steps:\n      - uses: actions/checkout@v4\n        with:\n          fetch-depth: 1\n\n      - uses: actions/setup-node@v4\n        with:\n          node-version: lts/*\n\n      - name: Install pnpm\n        uses: pnpm/action-setup@v2\n        with:\n          version: latest\n          run_install: false\n\n      - name: Get pnpm store directory\n        id: pnpm-cache\n        shell: bash\n        run: |\n          echo \"STORE_PATH=$(pnpm store path)\" >> $GITHUB_OUTPUT\n\n      - uses: actions/cache@v3\n        with:\n          path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}\n          key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}\n          restore-keys: |\n            ${{ runner.os }}-pnpm-store-\n\n      - uses: actions/setup-node@v4\n        with:\n          node-version: lts/*\n          cache: \"pnpm\"\n\n      - name: Install dependencies\n        run: pnpm install --frozen-lockfile\n\n      - name: Cache Playwright browsers\n        uses: actions/cache@v3\n        id: playwright-cache\n        with:\n          path: ~/.cache/ms-playwright\n          key: ${{ runner.os }}-playwright-${{ hashFiles('**/pnpm-lock.yaml') }}\n\n      - name: Install Playwright Browsers\n        if: steps.playwright-cache.outputs.cache-hit != 'true'\n        run: pnpm exec playwright install --with-deps chromium\n\n      - name: Run Playwright tests\n        run: pnpm test\n\n      - uses: actions/upload-artifact@v4\n        if: always() && !cancelled()\n        with:\n          name: playwright-report\n          path: playwright-report/\n          retention-days: 7\n"
  },
  {
    "path": ".github/workflows/release.yml",
    "content": "name: Release\n\non:\n  push:\n    branches:\n      - main\n\nconcurrency: ${{ github.workflow }}-${{ github.ref }}\n\npermissions:\n  contents: write\n  pull-requests: write\n\njobs:\n  release:\n    name: Release\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n\n      - name: Setup pnpm\n        uses: pnpm/action-setup@v4\n\n      - name: Setup Node.js\n        uses: actions/setup-node@v4\n        with:\n          node-version: 20\n          cache: pnpm\n\n      - name: Install dependencies\n        run: pnpm install --frozen-lockfile\n\n      - name: Create Release Pull Request or Tag\n        id: changesets\n        uses: changesets/action@v1\n        with:\n          title: 'chore: version package'\n          commit: 'chore: version package'\n          version: pnpm version\n          publish: pnpm release\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n\n      - name: Create GitHub Release\n        if: steps.changesets.outputs.published == 'true'\n        uses: actions/github-script@v7\n        env:\n          PUBLISHED_PACKAGES: ${{ steps.changesets.outputs.publishedPackages }}\n        with:\n          script: |\n            const packages = JSON.parse(process.env.PUBLISHED_PACKAGES);\n            for (const pkg of packages) {\n              const tag = `v${pkg.version}`;\n              await github.rest.repos.createRelease({\n                owner: context.repo.owner,\n                repo: context.repo.repo,\n                tag_name: tag,\n                name: tag,\n                generate_release_notes: true,\n              });\n            }\n"
  },
  {
    "path": ".gitignore",
    "content": "# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.\n\n# dependencies\nnode_modules\n.pnp\n.pnp.js\n\n# testing\ncoverage\n\n# next.js\n.next/\nout/\nbuild\n\n# misc\n.DS_Store\n*.pem\n\n# debug\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n.pnpm-debug.log*\n\n\n# local env files\n.env.local\n.env.development.local\n.env.test.local\n.env.production.local\n\n# turbo\n.turbo\n\n.env\n.vercel\n.env*.local\n\n# Playwright\n/test-results/\n/playwright-report/\n/blob-report/\n/playwright/*\n"
  },
  {
    "path": ".vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\"biomejs.biome\"]\n}\n"
  },
  {
    "path": ".vscode/settings.json",
    "content": "{\n  \"editor.defaultFormatter\": \"esbenp.prettier-vscode\",\n  \"[javascript]\": {\n    \"editor.defaultFormatter\": \"biomejs.biome\"\n  },\n  \"[typescript]\": {\n    \"editor.defaultFormatter\": \"biomejs.biome\"\n  },\n  \"[javascriptreact]\": {\n    \"editor.defaultFormatter\": \"biomejs.biome\"\n  },\n  \"[typescriptreact]\": {\n    \"editor.defaultFormatter\": \"biomejs.biome\"\n  },\n  \"[json]\": {\n    \"editor.defaultFormatter\": \"biomejs.biome\"\n  },\n  \"[jsonc]\": {\n    \"editor.defaultFormatter\": \"biomejs.biome\"\n  },\n  \"[css]\": {\n    \"editor.defaultFormatter\": \"biomejs.biome\"\n  },\n  \"[graphql]\": {\n    \"editor.defaultFormatter\": \"biomejs.biome\"\n  },\n  \"typescript.tsdk\": \"node_modules/typescript/lib\",\n  \"editor.formatOnSave\": true,\n  \"editor.formatOnPaste\": true,\n  \"emmet.showExpandedAbbreviation\": \"never\",\n  \"editor.codeActionsOnSave\": {\n    \"source.fixAll.biome\": \"explicit\",\n    \"source.organizeImports.biome\": \"explicit\"\n  },\n  \"[html]\": {\n    \"editor.defaultFormatter\": \"biomejs.biome\"\n  },\n  \"[vue]\": {\n    \"editor.defaultFormatter\": \"biomejs.biome\"\n  },\n  \"[svelte]\": {\n    \"editor.defaultFormatter\": \"biomejs.biome\"\n  },\n  \"[yaml]\": {\n    \"editor.defaultFormatter\": \"biomejs.biome\"\n  },\n  \"[markdown]\": {\n    \"editor.defaultFormatter\": \"biomejs.biome\"\n  },\n  \"[mdx]\": {\n    \"editor.defaultFormatter\": \"biomejs.biome\"\n  }\n}\n"
  },
  {
    "path": "LICENSE",
    "content": "Copyright 2024 Vercel, Inc.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License."
  },
  {
    "path": "README.md",
    "content": "<a href=\"https://chat.vercel.ai/\">\n  <img alt=\"Chatbot\" src=\"app/(chat)/opengraph-image.png\">\n  <h1 align=\"center\">Chatbot</h1>\n</a>\n\n<p align=\"center\">\n    Chatbot (formerly AI Chatbot) is a free, open-source template built with Next.js and the AI SDK that helps you quickly build powerful chatbot applications.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://chatbot.dev\"><strong>Read Docs</strong></a> ·\n  <a href=\"#features\"><strong>Features</strong></a> ·\n  <a href=\"#model-providers\"><strong>Model Providers</strong></a> ·\n  <a href=\"#deploy-your-own\"><strong>Deploy Your Own</strong></a> ·\n  <a href=\"#running-locally\"><strong>Running locally</strong></a>\n</p>\n<br/>\n\n## Features\n\n- [Next.js](https://nextjs.org) App Router\n  - Advanced routing for seamless navigation and performance\n  - React Server Components (RSCs) and Server Actions for server-side rendering and increased performance\n- [AI SDK](https://ai-sdk.dev/docs/introduction)\n  - Unified API for generating text, structured objects, and tool calls with LLMs\n  - Hooks for building dynamic chat and generative user interfaces\n  - Supports OpenAI, Anthropic, Google, xAI, and other model providers via AI Gateway\n- [shadcn/ui](https://ui.shadcn.com)\n  - Styling with [Tailwind CSS](https://tailwindcss.com)\n  - Component primitives from [Radix UI](https://radix-ui.com) for accessibility and flexibility\n- Data Persistence\n  - [Neon Serverless Postgres](https://vercel.com/marketplace/neon) for saving chat history and user data\n  - [Vercel Blob](https://vercel.com/storage/blob) for efficient file storage\n- [Auth.js](https://authjs.dev)\n  - Simple and secure authentication\n\n## Model Providers\n\nThis template uses the [Vercel AI Gateway](https://vercel.com/docs/ai-gateway) to access multiple AI models through a unified interface. The default model is [OpenAI](https://openai.com) GPT-4.1 Mini, with support for Anthropic, Google, and xAI models.\n\n### AI Gateway Authentication\n\n**For Vercel deployments**: Authentication is handled automatically via OIDC tokens.\n\n**For non-Vercel deployments**: You need to provide an AI Gateway API key by setting the `AI_GATEWAY_API_KEY` environment variable in your `.env.local` file.\n\nWith the [AI SDK](https://ai-sdk.dev/docs/introduction), you can also switch to direct LLM providers like [OpenAI](https://openai.com), [Anthropic](https://anthropic.com), [Cohere](https://cohere.com/), and [many more](https://ai-sdk.dev/providers/ai-sdk-providers) with just a few lines of code.\n\n## Deploy Your Own\n\nYou can deploy your own version of Chatbot to Vercel with one click:\n\n[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/templates/next.js/chatbot)\n\n## Running locally\n\nYou will need to use the environment variables [defined in `.env.example`](.env.example) to run Chatbot. It's recommended you use [Vercel Environment Variables](https://vercel.com/docs/projects/environment-variables) for this, but a `.env` file is all that is necessary.\n\n> Note: You should not commit your `.env` file or it will expose secrets that will allow others to control access to your various AI and authentication provider accounts.\n\n1. Install Vercel CLI: `npm i -g vercel`\n2. Link local instance with Vercel and GitHub accounts (creates `.vercel` directory): `vercel link`\n3. Download your environment variables: `vercel env pull`\n\n```bash\npnpm install\npnpm db:migrate # Setup database or apply latest database changes\npnpm dev\n```\n\nYour app template should now be running on [localhost:3000](http://localhost:3000).\n"
  },
  {
    "path": "app/(auth)/actions.ts",
    "content": "\"use server\";\n\nimport { z } from \"zod\";\n\nimport { createUser, getUser } from \"@/lib/db/queries\";\n\nimport { signIn } from \"./auth\";\n\nconst authFormSchema = z.object({\n  email: z.string().email(),\n  password: z.string().min(6),\n});\n\nexport type LoginActionState = {\n  status: \"idle\" | \"in_progress\" | \"success\" | \"failed\" | \"invalid_data\";\n};\n\nexport const login = async (\n  _: LoginActionState,\n  formData: FormData\n): Promise<LoginActionState> => {\n  try {\n    const validatedData = authFormSchema.parse({\n      email: formData.get(\"email\"),\n      password: formData.get(\"password\"),\n    });\n\n    await signIn(\"credentials\", {\n      email: validatedData.email,\n      password: validatedData.password,\n      redirect: false,\n    });\n\n    return { status: \"success\" };\n  } catch (error) {\n    if (error instanceof z.ZodError) {\n      return { status: \"invalid_data\" };\n    }\n\n    return { status: \"failed\" };\n  }\n};\n\nexport type RegisterActionState = {\n  status:\n    | \"idle\"\n    | \"in_progress\"\n    | \"success\"\n    | \"failed\"\n    | \"user_exists\"\n    | \"invalid_data\";\n};\n\nexport const register = async (\n  _: RegisterActionState,\n  formData: FormData\n): Promise<RegisterActionState> => {\n  try {\n    const validatedData = authFormSchema.parse({\n      email: formData.get(\"email\"),\n      password: formData.get(\"password\"),\n    });\n\n    const [user] = await getUser(validatedData.email);\n\n    if (user) {\n      return { status: \"user_exists\" } as RegisterActionState;\n    }\n    await createUser(validatedData.email, validatedData.password);\n    await signIn(\"credentials\", {\n      email: validatedData.email,\n      password: validatedData.password,\n      redirect: false,\n    });\n\n    return { status: \"success\" };\n  } catch (error) {\n    if (error instanceof z.ZodError) {\n      return { status: \"invalid_data\" };\n    }\n\n    return { status: \"failed\" };\n  }\n};\n"
  },
  {
    "path": "app/(auth)/api/auth/[...nextauth]/route.ts",
    "content": "export { GET, POST } from \"@/app/(auth)/auth\";\n"
  },
  {
    "path": "app/(auth)/api/auth/guest/route.ts",
    "content": "import { NextResponse } from \"next/server\";\nimport { getToken } from \"next-auth/jwt\";\nimport { signIn } from \"@/app/(auth)/auth\";\nimport { isDevelopmentEnvironment } from \"@/lib/constants\";\n\nexport async function GET(request: Request) {\n  const { searchParams } = new URL(request.url);\n  const redirectUrl = searchParams.get(\"redirectUrl\") || \"/\";\n\n  const token = await getToken({\n    req: request,\n    secret: process.env.AUTH_SECRET,\n    secureCookie: !isDevelopmentEnvironment,\n  });\n\n  if (token) {\n    return NextResponse.redirect(new URL(\"/\", request.url));\n  }\n\n  return signIn(\"guest\", { redirect: true, redirectTo: redirectUrl });\n}\n"
  },
  {
    "path": "app/(auth)/auth.config.ts",
    "content": "import type { NextAuthConfig } from \"next-auth\";\n\nexport const authConfig = {\n  pages: {\n    signIn: \"/login\",\n    newUser: \"/\",\n  },\n  providers: [\n    // added later in auth.ts since it requires bcrypt which is only compatible with Node.js\n    // while this file is also used in non-Node.js environments\n  ],\n  callbacks: {},\n} satisfies NextAuthConfig;\n"
  },
  {
    "path": "app/(auth)/auth.ts",
    "content": "import { compare } from \"bcrypt-ts\";\nimport NextAuth, { type DefaultSession } from \"next-auth\";\nimport type { DefaultJWT } from \"next-auth/jwt\";\nimport Credentials from \"next-auth/providers/credentials\";\nimport { DUMMY_PASSWORD } from \"@/lib/constants\";\nimport { createGuestUser, getUser } from \"@/lib/db/queries\";\nimport { authConfig } from \"./auth.config\";\n\nexport type UserType = \"guest\" | \"regular\";\n\ndeclare module \"next-auth\" {\n  interface Session extends DefaultSession {\n    user: {\n      id: string;\n      type: UserType;\n    } & DefaultSession[\"user\"];\n  }\n\n  interface User {\n    id?: string;\n    email?: string | null;\n    type: UserType;\n  }\n}\n\ndeclare module \"next-auth/jwt\" {\n  interface JWT extends DefaultJWT {\n    id: string;\n    type: UserType;\n  }\n}\n\nexport const {\n  handlers: { GET, POST },\n  auth,\n  signIn,\n  signOut,\n} = NextAuth({\n  ...authConfig,\n  providers: [\n    Credentials({\n      credentials: {},\n      async authorize({ email, password }: any) {\n        const users = await getUser(email);\n\n        if (users.length === 0) {\n          await compare(password, DUMMY_PASSWORD);\n          return null;\n        }\n\n        const [user] = users;\n\n        if (!user.password) {\n          await compare(password, DUMMY_PASSWORD);\n          return null;\n        }\n\n        const passwordsMatch = await compare(password, user.password);\n\n        if (!passwordsMatch) {\n          return null;\n        }\n\n        return { ...user, type: \"regular\" };\n      },\n    }),\n    Credentials({\n      id: \"guest\",\n      credentials: {},\n      async authorize() {\n        const [guestUser] = await createGuestUser();\n        return { ...guestUser, type: \"guest\" };\n      },\n    }),\n  ],\n  callbacks: {\n    jwt({ token, user }) {\n      if (user) {\n        token.id = user.id as string;\n        token.type = user.type;\n      }\n\n      return token;\n    },\n    session({ session, token }) {\n      if (session.user) {\n        session.user.id = token.id;\n        session.user.type = token.type;\n      }\n\n      return session;\n    },\n  },\n});\n"
  },
  {
    "path": "app/(auth)/login/page.tsx",
    "content": "\"use client\";\n\nimport Link from \"next/link\";\nimport { useRouter } from \"next/navigation\";\nimport { useSession } from \"next-auth/react\";\nimport { useActionState, useEffect, useState } from \"react\";\n\nimport { AuthForm } from \"@/components/auth-form\";\nimport { SubmitButton } from \"@/components/submit-button\";\nimport { toast } from \"@/components/toast\";\nimport { type LoginActionState, login } from \"../actions\";\n\nexport default function Page() {\n  const router = useRouter();\n\n  const [email, setEmail] = useState(\"\");\n  const [isSuccessful, setIsSuccessful] = useState(false);\n\n  const [state, formAction] = useActionState<LoginActionState, FormData>(\n    login,\n    {\n      status: \"idle\",\n    }\n  );\n\n  const { update: updateSession } = useSession();\n\n  // biome-ignore lint/correctness/useExhaustiveDependencies: router and updateSession are stable refs\n  useEffect(() => {\n    if (state.status === \"failed\") {\n      toast({\n        type: \"error\",\n        description: \"Invalid credentials!\",\n      });\n    } else if (state.status === \"invalid_data\") {\n      toast({\n        type: \"error\",\n        description: \"Failed validating your submission!\",\n      });\n    } else if (state.status === \"success\") {\n      setIsSuccessful(true);\n      updateSession();\n      router.refresh();\n    }\n  }, [state.status]);\n\n  const handleSubmit = (formData: FormData) => {\n    setEmail(formData.get(\"email\") as string);\n    formAction(formData);\n  };\n\n  return (\n    <div className=\"flex h-dvh w-screen items-start justify-center bg-background pt-12 md:items-center md:pt-0\">\n      <div className=\"flex w-full max-w-md flex-col gap-12 overflow-hidden rounded-2xl\">\n        <div className=\"flex flex-col items-center justify-center gap-2 px-4 text-center sm:px-16\">\n          <h3 className=\"font-semibold text-xl dark:text-zinc-50\">Sign In</h3>\n          <p className=\"text-gray-500 text-sm dark:text-zinc-400\">\n            Use your email and password to sign in\n          </p>\n        </div>\n        <AuthForm action={handleSubmit} defaultEmail={email}>\n          <SubmitButton isSuccessful={isSuccessful}>Sign in</SubmitButton>\n          <p className=\"mt-4 text-center text-gray-600 text-sm dark:text-zinc-400\">\n            {\"Don't have an account? \"}\n            <Link\n              className=\"font-semibold text-gray-800 hover:underline dark:text-zinc-200\"\n              href=\"/register\"\n            >\n              Sign up\n            </Link>\n            {\" for free.\"}\n          </p>\n        </AuthForm>\n      </div>\n    </div>\n  );\n}\n"
  },
  {
    "path": "app/(auth)/register/page.tsx",
    "content": "\"use client\";\n\nimport Link from \"next/link\";\nimport { useRouter } from \"next/navigation\";\nimport { useSession } from \"next-auth/react\";\nimport { useActionState, useEffect, useState } from \"react\";\nimport { AuthForm } from \"@/components/auth-form\";\nimport { SubmitButton } from \"@/components/submit-button\";\nimport { toast } from \"@/components/toast\";\nimport { type RegisterActionState, register } from \"../actions\";\n\nexport default function Page() {\n  const router = useRouter();\n\n  const [email, setEmail] = useState(\"\");\n  const [isSuccessful, setIsSuccessful] = useState(false);\n\n  const [state, formAction] = useActionState<RegisterActionState, FormData>(\n    register,\n    {\n      status: \"idle\",\n    }\n  );\n\n  const { update: updateSession } = useSession();\n\n  // biome-ignore lint/correctness/useExhaustiveDependencies: router and updateSession are stable refs\n  useEffect(() => {\n    if (state.status === \"user_exists\") {\n      toast({ type: \"error\", description: \"Account already exists!\" });\n    } else if (state.status === \"failed\") {\n      toast({ type: \"error\", description: \"Failed to create account!\" });\n    } else if (state.status === \"invalid_data\") {\n      toast({\n        type: \"error\",\n        description: \"Failed validating your submission!\",\n      });\n    } else if (state.status === \"success\") {\n      toast({ type: \"success\", description: \"Account created successfully!\" });\n\n      setIsSuccessful(true);\n      updateSession();\n      router.refresh();\n    }\n  }, [state.status]);\n\n  const handleSubmit = (formData: FormData) => {\n    setEmail(formData.get(\"email\") as string);\n    formAction(formData);\n  };\n\n  return (\n    <div className=\"flex h-dvh w-screen items-start justify-center bg-background pt-12 md:items-center md:pt-0\">\n      <div className=\"flex w-full max-w-md flex-col gap-12 overflow-hidden rounded-2xl\">\n        <div className=\"flex flex-col items-center justify-center gap-2 px-4 text-center sm:px-16\">\n          <h3 className=\"font-semibold text-xl dark:text-zinc-50\">Sign Up</h3>\n          <p className=\"text-gray-500 text-sm dark:text-zinc-400\">\n            Create an account with your email and password\n          </p>\n        </div>\n        <AuthForm action={handleSubmit} defaultEmail={email}>\n          <SubmitButton isSuccessful={isSuccessful}>Sign Up</SubmitButton>\n          <p className=\"mt-4 text-center text-gray-600 text-sm dark:text-zinc-400\">\n            {\"Already have an account? \"}\n            <Link\n              className=\"font-semibold text-gray-800 hover:underline dark:text-zinc-200\"\n              href=\"/login\"\n            >\n              Sign in\n            </Link>\n            {\" instead.\"}\n          </p>\n        </AuthForm>\n      </div>\n    </div>\n  );\n}\n"
  },
  {
    "path": "app/(chat)/actions.ts",
    "content": "\"use server\";\n\nimport { generateText, type UIMessage } from \"ai\";\nimport { cookies } from \"next/headers\";\nimport type { VisibilityType } from \"@/components/visibility-selector\";\nimport { titlePrompt } from \"@/lib/ai/prompts\";\nimport { getTitleModel } from \"@/lib/ai/providers\";\nimport {\n  deleteMessagesByChatIdAfterTimestamp,\n  getMessageById,\n  updateChatVisibilityById,\n} from \"@/lib/db/queries\";\nimport { getTextFromMessage } from \"@/lib/utils\";\n\nexport async function saveChatModelAsCookie(model: string) {\n  const cookieStore = await cookies();\n  cookieStore.set(\"chat-model\", model);\n}\n\nexport async function generateTitleFromUserMessage({\n  message,\n}: {\n  message: UIMessage;\n}) {\n  const { text } = await generateText({\n    model: getTitleModel(),\n    system: titlePrompt,\n    prompt: getTextFromMessage(message),\n  });\n  return text\n    .replace(/^[#*\"\\s]+/, \"\")\n    .replace(/[\"]+$/, \"\")\n    .trim();\n}\n\nexport async function deleteTrailingMessages({ id }: { id: string }) {\n  const [message] = await getMessageById({ id });\n\n  await deleteMessagesByChatIdAfterTimestamp({\n    chatId: message.chatId,\n    timestamp: message.createdAt,\n  });\n}\n\nexport async function updateChatVisibility({\n  chatId,\n  visibility,\n}: {\n  chatId: string;\n  visibility: VisibilityType;\n}) {\n  await updateChatVisibilityById({ chatId, visibility });\n}\n"
  },
  {
    "path": "app/(chat)/api/chat/[id]/stream/route.ts",
    "content": "export function GET() {\n  return new Response(null, { status: 204 });\n}\n"
  },
  {
    "path": "app/(chat)/api/chat/route.ts",
    "content": "import { geolocation, ipAddress } from \"@vercel/functions\";\nimport {\n  convertToModelMessages,\n  createUIMessageStream,\n  createUIMessageStreamResponse,\n  generateId,\n  stepCountIs,\n  streamText,\n} from \"ai\";\nimport { checkBotId } from \"botid/server\";\nimport { after } from \"next/server\";\nimport { createResumableStreamContext } from \"resumable-stream\";\nimport { auth, type UserType } from \"@/app/(auth)/auth\";\nimport { entitlementsByUserType } from \"@/lib/ai/entitlements\";\nimport { allowedModelIds } from \"@/lib/ai/models\";\nimport { type RequestHints, systemPrompt } from \"@/lib/ai/prompts\";\nimport { getLanguageModel } from \"@/lib/ai/providers\";\nimport { createDocument } from \"@/lib/ai/tools/create-document\";\nimport { getWeather } from \"@/lib/ai/tools/get-weather\";\nimport { requestSuggestions } from \"@/lib/ai/tools/request-suggestions\";\nimport { updateDocument } from \"@/lib/ai/tools/update-document\";\nimport { isProductionEnvironment } from \"@/lib/constants\";\nimport {\n  createStreamId,\n  deleteChatById,\n  getChatById,\n  getMessageCountByUserId,\n  getMessagesByChatId,\n  saveChat,\n  saveMessages,\n  updateChatTitleById,\n  updateMessage,\n} from \"@/lib/db/queries\";\nimport type { DBMessage } from \"@/lib/db/schema\";\nimport { ChatbotError } from \"@/lib/errors\";\nimport { checkIpRateLimit } from \"@/lib/ratelimit\";\nimport type { ChatMessage } from \"@/lib/types\";\nimport { convertToUIMessages, generateUUID } from \"@/lib/utils\";\nimport { generateTitleFromUserMessage } from \"../../actions\";\nimport { type PostRequestBody, postRequestBodySchema } from \"./schema\";\n\nexport const maxDuration = 60;\n\nfunction getStreamContext() {\n  try {\n    return createResumableStreamContext({ waitUntil: after });\n  } catch (_) {\n    return null;\n  }\n}\n\nexport { getStreamContext };\n\nexport async function POST(request: Request) {\n  let requestBody: PostRequestBody;\n\n  try {\n    const json = await request.json();\n    requestBody = postRequestBodySchema.parse(json);\n  } catch (_) {\n    return new ChatbotError(\"bad_request:api\").toResponse();\n  }\n\n  try {\n    const { id, message, messages, selectedChatModel, selectedVisibilityType } =\n      requestBody;\n\n    const [botResult, session] = await Promise.all([checkBotId(), auth()]);\n\n    if (botResult.isBot) {\n      return new ChatbotError(\"unauthorized:chat\").toResponse();\n    }\n\n    if (!session?.user) {\n      return new ChatbotError(\"unauthorized:chat\").toResponse();\n    }\n\n    if (!allowedModelIds.has(selectedChatModel)) {\n      return new ChatbotError(\"bad_request:api\").toResponse();\n    }\n\n    await checkIpRateLimit(ipAddress(request));\n\n    const userType: UserType = session.user.type;\n\n    const messageCount = await getMessageCountByUserId({\n      id: session.user.id,\n      differenceInHours: 1,\n    });\n\n    if (messageCount > entitlementsByUserType[userType].maxMessagesPerHour) {\n      return new ChatbotError(\"rate_limit:chat\").toResponse();\n    }\n\n    const isToolApprovalFlow = Boolean(messages);\n\n    const chat = await getChatById({ id });\n    let messagesFromDb: DBMessage[] = [];\n    let titlePromise: Promise<string> | null = null;\n\n    if (chat) {\n      if (chat.userId !== session.user.id) {\n        return new ChatbotError(\"forbidden:chat\").toResponse();\n      }\n      if (!isToolApprovalFlow) {\n        messagesFromDb = await getMessagesByChatId({ id });\n      }\n    } else if (message?.role === \"user\") {\n      await saveChat({\n        id,\n        userId: session.user.id,\n        title: \"New chat\",\n        visibility: selectedVisibilityType,\n      });\n      titlePromise = generateTitleFromUserMessage({ message });\n    }\n\n    const uiMessages = isToolApprovalFlow\n      ? (messages as ChatMessage[])\n      : [...convertToUIMessages(messagesFromDb), message as ChatMessage];\n\n    const { longitude, latitude, city, country } = geolocation(request);\n\n    const requestHints: RequestHints = {\n      longitude,\n      latitude,\n      city,\n      country,\n    };\n\n    if (message?.role === \"user\") {\n      await saveMessages({\n        messages: [\n          {\n            chatId: id,\n            id: message.id,\n            role: \"user\",\n            parts: message.parts,\n            attachments: [],\n            createdAt: new Date(),\n          },\n        ],\n      });\n    }\n\n    const isReasoningModel =\n      selectedChatModel.endsWith(\"-thinking\") ||\n      (selectedChatModel.includes(\"reasoning\") &&\n        !selectedChatModel.includes(\"non-reasoning\"));\n\n    const modelMessages = await convertToModelMessages(uiMessages);\n\n    const stream = createUIMessageStream({\n      originalMessages: isToolApprovalFlow ? uiMessages : undefined,\n      execute: async ({ writer: dataStream }) => {\n        const result = streamText({\n          model: getLanguageModel(selectedChatModel),\n          system: systemPrompt({ selectedChatModel, requestHints }),\n          messages: modelMessages,\n          stopWhen: stepCountIs(5),\n          experimental_activeTools: isReasoningModel\n            ? []\n            : [\n                \"getWeather\",\n                \"createDocument\",\n                \"updateDocument\",\n                \"requestSuggestions\",\n              ],\n          providerOptions: isReasoningModel\n            ? {\n                anthropic: {\n                  thinking: { type: \"enabled\", budgetTokens: 10_000 },\n                },\n              }\n            : undefined,\n          tools: {\n            getWeather,\n            createDocument: createDocument({ session, dataStream }),\n            updateDocument: updateDocument({ session, dataStream }),\n            requestSuggestions: requestSuggestions({ session, dataStream }),\n          },\n          experimental_telemetry: {\n            isEnabled: isProductionEnvironment,\n            functionId: \"stream-text\",\n          },\n        });\n\n        dataStream.merge(\n          result.toUIMessageStream({ sendReasoning: isReasoningModel })\n        );\n\n        if (titlePromise) {\n          const title = await titlePromise;\n          dataStream.write({ type: \"data-chat-title\", data: title });\n          updateChatTitleById({ chatId: id, title });\n        }\n      },\n      generateId: generateUUID,\n      onFinish: async ({ messages: finishedMessages }) => {\n        if (isToolApprovalFlow) {\n          for (const finishedMsg of finishedMessages) {\n            const existingMsg = uiMessages.find((m) => m.id === finishedMsg.id);\n            if (existingMsg) {\n              await updateMessage({\n                id: finishedMsg.id,\n                parts: finishedMsg.parts,\n              });\n            } else {\n              await saveMessages({\n                messages: [\n                  {\n                    id: finishedMsg.id,\n                    role: finishedMsg.role,\n                    parts: finishedMsg.parts,\n                    createdAt: new Date(),\n                    attachments: [],\n                    chatId: id,\n                  },\n                ],\n              });\n            }\n          }\n        } else if (finishedMessages.length > 0) {\n          await saveMessages({\n            messages: finishedMessages.map((currentMessage) => ({\n              id: currentMessage.id,\n              role: currentMessage.role,\n              parts: currentMessage.parts,\n              createdAt: new Date(),\n              attachments: [],\n              chatId: id,\n            })),\n          });\n        }\n      },\n      onError: (error) => {\n        if (\n          error instanceof Error &&\n          error.message?.includes(\n            \"AI Gateway requires a valid credit card on file to service requests\"\n          )\n        ) {\n          return \"AI Gateway requires a valid credit card on file to service requests. Please visit https://vercel.com/d?to=%2F%5Bteam%5D%2F%7E%2Fai%3Fmodal%3Dadd-credit-card to add a card and unlock your free credits.\";\n        }\n        return \"Oops, an error occurred!\";\n      },\n    });\n\n    return createUIMessageStreamResponse({\n      stream,\n      async consumeSseStream({ stream: sseStream }) {\n        if (!process.env.REDIS_URL) {\n          return;\n        }\n        try {\n          const streamContext = getStreamContext();\n          if (streamContext) {\n            const streamId = generateId();\n            await createStreamId({ streamId, chatId: id });\n            await streamContext.createNewResumableStream(\n              streamId,\n              () => sseStream\n            );\n          }\n        } catch (_) {\n          // ignore redis errors\n        }\n      },\n    });\n  } catch (error) {\n    const vercelId = request.headers.get(\"x-vercel-id\");\n\n    if (error instanceof ChatbotError) {\n      return error.toResponse();\n    }\n\n    if (\n      error instanceof Error &&\n      error.message?.includes(\n        \"AI Gateway requires a valid credit card on file to service requests\"\n      )\n    ) {\n      return new ChatbotError(\"bad_request:activate_gateway\").toResponse();\n    }\n\n    console.error(\"Unhandled error in chat API:\", error, { vercelId });\n    return new ChatbotError(\"offline:chat\").toResponse();\n  }\n}\n\nexport async function DELETE(request: Request) {\n  const { searchParams } = new URL(request.url);\n  const id = searchParams.get(\"id\");\n\n  if (!id) {\n    return new ChatbotError(\"bad_request:api\").toResponse();\n  }\n\n  const session = await auth();\n\n  if (!session?.user) {\n    return new ChatbotError(\"unauthorized:chat\").toResponse();\n  }\n\n  const chat = await getChatById({ id });\n\n  if (chat?.userId !== session.user.id) {\n    return new ChatbotError(\"forbidden:chat\").toResponse();\n  }\n\n  const deletedChat = await deleteChatById({ id });\n\n  return Response.json(deletedChat, { status: 200 });\n}\n"
  },
  {
    "path": "app/(chat)/api/chat/schema.ts",
    "content": "import { z } from \"zod\";\n\nconst textPartSchema = z.object({\n  type: z.enum([\"text\"]),\n  text: z.string().min(1).max(2000),\n});\n\nconst filePartSchema = z.object({\n  type: z.enum([\"file\"]),\n  mediaType: z.enum([\"image/jpeg\", \"image/png\"]),\n  name: z.string().min(1).max(100),\n  url: z.string().url(),\n});\n\nconst partSchema = z.union([textPartSchema, filePartSchema]);\n\nconst userMessageSchema = z.object({\n  id: z.string().uuid(),\n  role: z.enum([\"user\"]),\n  parts: z.array(partSchema),\n});\n\n// For tool approval flows, we accept all messages (more permissive schema)\nconst messageSchema = z.object({\n  id: z.string(),\n  role: z.string(),\n  parts: z.array(z.any()),\n});\n\nexport const postRequestBodySchema = z.object({\n  id: z.string().uuid(),\n  // Either a single new message or all messages (for tool approvals)\n  message: userMessageSchema.optional(),\n  messages: z.array(messageSchema).optional(),\n  selectedChatModel: z.string(),\n  selectedVisibilityType: z.enum([\"public\", \"private\"]),\n});\n\nexport type PostRequestBody = z.infer<typeof postRequestBodySchema>;\n"
  },
  {
    "path": "app/(chat)/api/document/route.ts",
    "content": "import { auth } from \"@/app/(auth)/auth\";\nimport type { ArtifactKind } from \"@/components/artifact\";\nimport {\n  deleteDocumentsByIdAfterTimestamp,\n  getDocumentsById,\n  saveDocument,\n} from \"@/lib/db/queries\";\nimport { ChatbotError } from \"@/lib/errors\";\n\nexport async function GET(request: Request) {\n  const { searchParams } = new URL(request.url);\n  const id = searchParams.get(\"id\");\n\n  if (!id) {\n    return new ChatbotError(\n      \"bad_request:api\",\n      \"Parameter id is missing\"\n    ).toResponse();\n  }\n\n  const session = await auth();\n\n  if (!session?.user) {\n    return new ChatbotError(\"unauthorized:document\").toResponse();\n  }\n\n  const documents = await getDocumentsById({ id });\n\n  const [document] = documents;\n\n  if (!document) {\n    return new ChatbotError(\"not_found:document\").toResponse();\n  }\n\n  if (document.userId !== session.user.id) {\n    return new ChatbotError(\"forbidden:document\").toResponse();\n  }\n\n  return Response.json(documents, { status: 200 });\n}\n\nexport async function POST(request: Request) {\n  const { searchParams } = new URL(request.url);\n  const id = searchParams.get(\"id\");\n\n  if (!id) {\n    return new ChatbotError(\n      \"bad_request:api\",\n      \"Parameter id is required.\"\n    ).toResponse();\n  }\n\n  const session = await auth();\n\n  if (!session?.user) {\n    return new ChatbotError(\"not_found:document\").toResponse();\n  }\n\n  const {\n    content,\n    title,\n    kind,\n  }: { content: string; title: string; kind: ArtifactKind } =\n    await request.json();\n\n  const documents = await getDocumentsById({ id });\n\n  if (documents.length > 0) {\n    const [doc] = documents;\n\n    if (doc.userId !== session.user.id) {\n      return new ChatbotError(\"forbidden:document\").toResponse();\n    }\n  }\n\n  const document = await saveDocument({\n    id,\n    content,\n    title,\n    kind,\n    userId: session.user.id,\n  });\n\n  return Response.json(document, { status: 200 });\n}\n\nexport async function DELETE(request: Request) {\n  const { searchParams } = new URL(request.url);\n  const id = searchParams.get(\"id\");\n  const timestamp = searchParams.get(\"timestamp\");\n\n  if (!id) {\n    return new ChatbotError(\n      \"bad_request:api\",\n      \"Parameter id is required.\"\n    ).toResponse();\n  }\n\n  if (!timestamp) {\n    return new ChatbotError(\n      \"bad_request:api\",\n      \"Parameter timestamp is required.\"\n    ).toResponse();\n  }\n\n  const session = await auth();\n\n  if (!session?.user) {\n    return new ChatbotError(\"unauthorized:document\").toResponse();\n  }\n\n  const documents = await getDocumentsById({ id });\n\n  const [document] = documents;\n\n  if (document.userId !== session.user.id) {\n    return new ChatbotError(\"forbidden:document\").toResponse();\n  }\n\n  const documentsDeleted = await deleteDocumentsByIdAfterTimestamp({\n    id,\n    timestamp: new Date(timestamp),\n  });\n\n  return Response.json(documentsDeleted, { status: 200 });\n}\n"
  },
  {
    "path": "app/(chat)/api/files/upload/route.ts",
    "content": "import { put } from \"@vercel/blob\";\nimport { NextResponse } from \"next/server\";\nimport { z } from \"zod\";\n\nimport { auth } from \"@/app/(auth)/auth\";\n\n// Use Blob instead of File since File is not available in Node.js environment\nconst FileSchema = z.object({\n  file: z\n    .instanceof(Blob)\n    .refine((file) => file.size <= 5 * 1024 * 1024, {\n      message: \"File size should be less than 5MB\",\n    })\n    // Update the file type based on the kind of files you want to accept\n    .refine((file) => [\"image/jpeg\", \"image/png\"].includes(file.type), {\n      message: \"File type should be JPEG or PNG\",\n    }),\n});\n\nexport async function POST(request: Request) {\n  const session = await auth();\n\n  if (!session) {\n    return NextResponse.json({ error: \"Unauthorized\" }, { status: 401 });\n  }\n\n  if (request.body === null) {\n    return new Response(\"Request body is empty\", { status: 400 });\n  }\n\n  try {\n    const formData = await request.formData();\n    const file = formData.get(\"file\") as Blob;\n\n    if (!file) {\n      return NextResponse.json({ error: \"No file uploaded\" }, { status: 400 });\n    }\n\n    const validatedFile = FileSchema.safeParse({ file });\n\n    if (!validatedFile.success) {\n      const errorMessage = validatedFile.error.errors\n        .map((error) => error.message)\n        .join(\", \");\n\n      return NextResponse.json({ error: errorMessage }, { status: 400 });\n    }\n\n    // Get filename from formData since Blob doesn't have name property\n    const filename = (formData.get(\"file\") as File).name;\n    const fileBuffer = await file.arrayBuffer();\n\n    try {\n      const data = await put(`${filename}`, fileBuffer, {\n        access: \"public\",\n      });\n\n      return NextResponse.json(data);\n    } catch (_error) {\n      return NextResponse.json({ error: \"Upload failed\" }, { status: 500 });\n    }\n  } catch (_error) {\n    return NextResponse.json(\n      { error: \"Failed to process request\" },\n      { status: 500 }\n    );\n  }\n}\n"
  },
  {
    "path": "app/(chat)/api/history/route.ts",
    "content": "import type { NextRequest } from \"next/server\";\nimport { auth } from \"@/app/(auth)/auth\";\nimport { deleteAllChatsByUserId, getChatsByUserId } from \"@/lib/db/queries\";\nimport { ChatbotError } from \"@/lib/errors\";\n\nexport async function GET(request: NextRequest) {\n  const { searchParams } = request.nextUrl;\n\n  const limit = Number.parseInt(searchParams.get(\"limit\") || \"10\", 10);\n  const startingAfter = searchParams.get(\"starting_after\");\n  const endingBefore = searchParams.get(\"ending_before\");\n\n  if (startingAfter && endingBefore) {\n    return new ChatbotError(\n      \"bad_request:api\",\n      \"Only one of starting_after or ending_before can be provided.\"\n    ).toResponse();\n  }\n\n  const session = await auth();\n\n  if (!session?.user) {\n    return new ChatbotError(\"unauthorized:chat\").toResponse();\n  }\n\n  const chats = await getChatsByUserId({\n    id: session.user.id,\n    limit,\n    startingAfter,\n    endingBefore,\n  });\n\n  return Response.json(chats);\n}\n\nexport async function DELETE() {\n  const session = await auth();\n\n  if (!session?.user) {\n    return new ChatbotError(\"unauthorized:chat\").toResponse();\n  }\n\n  const result = await deleteAllChatsByUserId({ userId: session.user.id });\n\n  return Response.json(result, { status: 200 });\n}\n"
  },
  {
    "path": "app/(chat)/api/suggestions/route.ts",
    "content": "import { auth } from \"@/app/(auth)/auth\";\nimport { getSuggestionsByDocumentId } from \"@/lib/db/queries\";\nimport { ChatbotError } from \"@/lib/errors\";\n\nexport async function GET(request: Request) {\n  const { searchParams } = new URL(request.url);\n  const documentId = searchParams.get(\"documentId\");\n\n  if (!documentId) {\n    return new ChatbotError(\n      \"bad_request:api\",\n      \"Parameter documentId is required.\"\n    ).toResponse();\n  }\n\n  const session = await auth();\n\n  if (!session?.user) {\n    return new ChatbotError(\"unauthorized:suggestions\").toResponse();\n  }\n\n  const suggestions = await getSuggestionsByDocumentId({\n    documentId,\n  });\n\n  const [suggestion] = suggestions;\n\n  if (!suggestion) {\n    return Response.json([], { status: 200 });\n  }\n\n  if (suggestion.userId !== session.user.id) {\n    return new ChatbotError(\"forbidden:api\").toResponse();\n  }\n\n  return Response.json(suggestions, { status: 200 });\n}\n"
  },
  {
    "path": "app/(chat)/api/vote/route.ts",
    "content": "import { auth } from \"@/app/(auth)/auth\";\nimport { getChatById, getVotesByChatId, voteMessage } from \"@/lib/db/queries\";\nimport { ChatbotError } from \"@/lib/errors\";\n\nexport async function GET(request: Request) {\n  const { searchParams } = new URL(request.url);\n  const chatId = searchParams.get(\"chatId\");\n\n  if (!chatId) {\n    return new ChatbotError(\n      \"bad_request:api\",\n      \"Parameter chatId is required.\"\n    ).toResponse();\n  }\n\n  const session = await auth();\n\n  if (!session?.user) {\n    return new ChatbotError(\"unauthorized:vote\").toResponse();\n  }\n\n  const chat = await getChatById({ id: chatId });\n\n  if (!chat) {\n    return new ChatbotError(\"not_found:chat\").toResponse();\n  }\n\n  if (chat.userId !== session.user.id) {\n    return new ChatbotError(\"forbidden:vote\").toResponse();\n  }\n\n  const votes = await getVotesByChatId({ id: chatId });\n\n  return Response.json(votes, { status: 200 });\n}\n\nexport async function PATCH(request: Request) {\n  const {\n    chatId,\n    messageId,\n    type,\n  }: { chatId: string; messageId: string; type: \"up\" | \"down\" } =\n    await request.json();\n\n  if (!chatId || !messageId || !type) {\n    return new ChatbotError(\n      \"bad_request:api\",\n      \"Parameters chatId, messageId, and type are required.\"\n    ).toResponse();\n  }\n\n  const session = await auth();\n\n  if (!session?.user) {\n    return new ChatbotError(\"unauthorized:vote\").toResponse();\n  }\n\n  const chat = await getChatById({ id: chatId });\n\n  if (!chat) {\n    return new ChatbotError(\"not_found:vote\").toResponse();\n  }\n\n  if (chat.userId !== session.user.id) {\n    return new ChatbotError(\"forbidden:vote\").toResponse();\n  }\n\n  await voteMessage({\n    chatId,\n    messageId,\n    type,\n  });\n\n  return new Response(\"Message voted\", { status: 200 });\n}\n"
  },
  {
    "path": "app/(chat)/chat/[id]/page.tsx",
    "content": "import { cookies } from \"next/headers\";\nimport { notFound, redirect } from \"next/navigation\";\nimport { Suspense } from \"react\";\n\nimport { auth } from \"@/app/(auth)/auth\";\nimport { Chat } from \"@/components/chat\";\nimport { DataStreamHandler } from \"@/components/data-stream-handler\";\nimport { DEFAULT_CHAT_MODEL } from \"@/lib/ai/models\";\nimport { getChatById, getMessagesByChatId } from \"@/lib/db/queries\";\nimport { convertToUIMessages } from \"@/lib/utils\";\n\nexport default function Page(props: { params: Promise<{ id: string }> }) {\n  return (\n    <Suspense fallback={<div className=\"flex h-dvh\" />}>\n      <ChatPage params={props.params} />\n    </Suspense>\n  );\n}\n\nasync function ChatPage({ params }: { params: Promise<{ id: string }> }) {\n  const { id } = await params;\n  const chat = await getChatById({ id });\n\n  if (!chat) {\n    redirect(\"/\");\n  }\n\n  const session = await auth();\n\n  if (!session) {\n    redirect(\"/api/auth/guest\");\n  }\n\n  if (chat.visibility === \"private\") {\n    if (!session.user) {\n      return notFound();\n    }\n\n    if (session.user.id !== chat.userId) {\n      return notFound();\n    }\n  }\n\n  const messagesFromDb = await getMessagesByChatId({\n    id,\n  });\n\n  const uiMessages = convertToUIMessages(messagesFromDb);\n\n  const cookieStore = await cookies();\n  const chatModelFromCookie = cookieStore.get(\"chat-model\");\n\n  if (!chatModelFromCookie) {\n    return (\n      <>\n        <Chat\n          autoResume={true}\n          id={chat.id}\n          initialChatModel={DEFAULT_CHAT_MODEL}\n          initialMessages={uiMessages}\n          initialVisibilityType={chat.visibility}\n          isReadonly={session?.user?.id !== chat.userId}\n        />\n        <DataStreamHandler />\n      </>\n    );\n  }\n\n  return (\n    <>\n      <Chat\n        autoResume={true}\n        id={chat.id}\n        initialChatModel={chatModelFromCookie.value}\n        initialMessages={uiMessages}\n        initialVisibilityType={chat.visibility}\n        isReadonly={session?.user?.id !== chat.userId}\n      />\n      <DataStreamHandler />\n    </>\n  );\n}\n"
  },
  {
    "path": "app/(chat)/layout.tsx",
    "content": "import { cookies } from \"next/headers\";\nimport Script from \"next/script\";\nimport { Suspense } from \"react\";\nimport { AppSidebar } from \"@/components/app-sidebar\";\nimport { DataStreamProvider } from \"@/components/data-stream-provider\";\nimport { SidebarInset, SidebarProvider } from \"@/components/ui/sidebar\";\nimport { auth } from \"../(auth)/auth\";\n\nexport default function Layout({ children }: { children: React.ReactNode }) {\n  return (\n    <>\n      <Script\n        src=\"https://cdn.jsdelivr.net/pyodide/v0.23.4/full/pyodide.js\"\n        strategy=\"beforeInteractive\"\n      />\n      <DataStreamProvider>\n        <Suspense fallback={<div className=\"flex h-dvh\" />}>\n          <SidebarWrapper>{children}</SidebarWrapper>\n        </Suspense>\n      </DataStreamProvider>\n    </>\n  );\n}\n\nasync function SidebarWrapper({ children }: { children: React.ReactNode }) {\n  const [session, cookieStore] = await Promise.all([auth(), cookies()]);\n  const isCollapsed = cookieStore.get(\"sidebar_state\")?.value !== \"true\";\n\n  return (\n    <SidebarProvider defaultOpen={!isCollapsed}>\n      <AppSidebar user={session?.user} />\n      <SidebarInset>{children}</SidebarInset>\n    </SidebarProvider>\n  );\n}\n"
  },
  {
    "path": "app/(chat)/page.tsx",
    "content": "import { cookies } from \"next/headers\";\nimport { Suspense } from \"react\";\nimport { Chat } from \"@/components/chat\";\nimport { DataStreamHandler } from \"@/components/data-stream-handler\";\nimport { DEFAULT_CHAT_MODEL } from \"@/lib/ai/models\";\nimport { generateUUID } from \"@/lib/utils\";\n\nexport default function Page() {\n  return (\n    <Suspense fallback={<div className=\"flex h-dvh\" />}>\n      <NewChatPage />\n    </Suspense>\n  );\n}\n\nasync function NewChatPage() {\n  const cookieStore = await cookies();\n  const modelIdFromCookie = cookieStore.get(\"chat-model\");\n  const id = generateUUID();\n\n  if (!modelIdFromCookie) {\n    return (\n      <>\n        <Chat\n          autoResume={false}\n          id={id}\n          initialChatModel={DEFAULT_CHAT_MODEL}\n          initialMessages={[]}\n          initialVisibilityType=\"private\"\n          isReadonly={false}\n          key={id}\n        />\n        <DataStreamHandler />\n      </>\n    );\n  }\n\n  return (\n    <>\n      <Chat\n        autoResume={false}\n        id={id}\n        initialChatModel={modelIdFromCookie.value}\n        initialMessages={[]}\n        initialVisibilityType=\"private\"\n        isReadonly={false}\n        key={id}\n      />\n      <DataStreamHandler />\n    </>\n  );\n}\n"
  },
  {
    "path": "app/globals.css",
    "content": "@import \"tailwindcss\";\n@import \"katex/dist/katex.min.css\";\n\n/* include utility classes in streamdown */\n@source \"../node_modules/streamdown/dist/index.js\";\n\n/* custom variant for setting dark mode programmatically */\n@custom-variant dark (&:is(.dark, .dark *));\n\n/* include plugins */\n@plugin \"tailwindcss-animate\";\n@plugin \"@tailwindcss/typography\";\n\n/* define design tokens (light mode) */\n:root {\n  --background: hsl(0 0% 100%);\n  --foreground: hsl(240 10% 3.9%);\n  --card: hsl(0 0% 100%);\n  --card-foreground: hsl(240 10% 3.9%);\n  --popover: hsl(0 0% 100%);\n  --popover-foreground: hsl(240 10% 3.9%);\n  --primary: hsl(240 5.9% 10%);\n  --primary-foreground: hsl(0 0% 98%);\n  --secondary: hsl(240 4.8% 95.9%);\n  --secondary-foreground: hsl(240 5.9% 10%);\n  --muted: hsl(240 4.8% 95.9%);\n  --muted-foreground: hsl(240 3.8% 46.1%);\n  --accent: hsl(240 4.8% 95.9%);\n  --accent-foreground: hsl(240 5.9% 10%);\n  --destructive: hsl(0 84.2% 60.2%);\n  --destructive-foreground: hsl(0 0% 98%);\n  --border: hsl(240 5.9% 90%);\n  --input: hsl(240 5.9% 90%);\n  --ring: hsl(240 10% 3.9%);\n  --chart-1: hsl(12 76% 61%);\n  --chart-2: hsl(173 58% 39%);\n  --chart-3: hsl(197 37% 24%);\n  --chart-4: hsl(43 74% 66%);\n  --chart-5: hsl(27 87% 67%);\n  --sidebar-background: hsl(0 0% 98%);\n  --sidebar-foreground: hsl(240 5.3% 26.1%);\n  --sidebar-primary: hsl(240 5.9% 10%);\n  --sidebar-primary-foreground: hsl(0 0% 98%);\n  --sidebar-accent: hsl(240 4.8% 95.9%);\n  --sidebar-accent-foreground: hsl(240 5.9% 10%);\n  --sidebar-border: hsl(220 13% 91%);\n  --sidebar-ring: hsl(217.2 91.2% 59.8%);\n  /* border radius unit */\n  --radius: 0.5rem;\n  --sidebar: hsl(0 0% 98%);\n}\n\n/* define design tokens (dark mode) */\n.dark {\n  --background: hsl(240 10% 3.9%);\n  --foreground: hsl(0 0% 98%);\n  --card: hsl(240 10% 3.9%);\n  --card-foreground: hsl(0 0% 98%);\n  --popover: hsl(240 10% 3.9%);\n  --popover-foreground: hsl(0 0% 98%);\n  --primary: hsl(0 0% 98%);\n  --primary-foreground: hsl(240 5.9% 10%);\n  --secondary: hsl(240 3.7% 15.9%);\n  --secondary-foreground: hsl(0 0% 98%);\n  --muted: hsl(240 3.7% 15.9%);\n  --muted-foreground: hsl(240 5% 64.9%);\n  --accent: hsl(240 3.7% 15.9%);\n  --accent-foreground: hsl(0 0% 98%);\n  --destructive: hsl(0 62.8% 30.6%);\n  --destructive-foreground: hsl(0 0% 98%);\n  --border: hsl(240 3.7% 15.9%);\n  --input: hsl(240 3.7% 15.9%);\n  --ring: hsl(240 4.9% 83.9%);\n  --chart-1: hsl(220 70% 50%);\n  --chart-2: hsl(160 60% 45%);\n  --chart-3: hsl(30 80% 55%);\n  --chart-4: hsl(280 65% 60%);\n  --chart-5: hsl(340 75% 55%);\n  --sidebar-background: hsl(240 5.9% 10%);\n  --sidebar-foreground: hsl(240 4.8% 95.9%);\n  --sidebar-primary: hsl(224.3 76.3% 48%);\n  --sidebar-primary-foreground: hsl(0 0% 100%);\n  --sidebar-accent: hsl(240 3.7% 15.9%);\n  --sidebar-accent-foreground: hsl(240 4.8% 95.9%);\n  --sidebar-border: hsl(240 3.7% 15.9%);\n  --sidebar-ring: hsl(217.2 91.2% 59.8%);\n  --sidebar: hsl(240 5.9% 10%);\n}\n\n/* define theme */\n@theme {\n  --font-sans: var(--font-geist);\n  --font-mono: var(--font-geist-mono);\n\n  --breakpoint-toast-mobile: 600px;\n\n  --radius-lg: var(--radius);\n  --radius-md: calc(var(--radius) - 2px);\n  --radius-sm: calc(var(--radius) - 4px);\n\n  --color-background: var(--background);\n  --color-foreground: var(--foreground);\n\n  --color-card: var(--card);\n  --color-card-foreground: var(--card-foreground);\n\n  --color-popover: var(--popover);\n  --color-popover-foreground: var(--popover-foreground);\n\n  --color-primary: var(--primary);\n  --color-primary-foreground: var(--primary-foreground);\n\n  --color-secondary: var(--secondary);\n  --color-secondary-foreground: var(--secondary-foreground);\n\n  --color-muted: var(--muted);\n  --color-muted-foreground: var(--muted-foreground);\n\n  --color-accent: var(--accent);\n  --color-accent-foreground: var(--accent-foreground);\n\n  --color-destructive: var(--destructive);\n  --color-destructive-foreground: var(--destructive-foreground);\n\n  --color-border: var(--border);\n  --color-input: var(--input);\n  --color-ring: var(--ring);\n\n  --color-chart-1: var(--chart-1);\n  --color-chart-2: var(--chart-2);\n  --color-chart-3: var(--chart-3);\n  --color-chart-4: var(--chart-4);\n  --color-chart-5: var(--chart-5);\n\n  --color-sidebar: var(--sidebar-background);\n  --color-sidebar-foreground: var(--sidebar-foreground);\n  --color-sidebar-primary: var(--sidebar-primary);\n  --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);\n  --color-sidebar-accent: var(--sidebar-accent);\n  --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);\n  --color-sidebar-border: var(--sidebar-border);\n  --color-sidebar-ring: var(--sidebar-ring);\n}\n\n/*\n  The default border color has changed to `currentcolor` in Tailwind CSS v4,\n  so we've added these compatibility styles to make sure everything still\n  looks the same as it did with Tailwind CSS v3.\n\n  If we ever want to remove these styles, we need to add an explicit border\n  color utility to any element that depends on these defaults.\n*/\n@layer base {\n  *,\n  ::after,\n  ::before,\n  ::backdrop,\n  ::file-selector-button {\n    border-color: var(--color-gray-200, currentcolor);\n  }\n}\n\n@utility text-balance {\n  text-wrap: balance;\n}\n\n@utility -webkit-overflow-scrolling-touch {\n  -webkit-overflow-scrolling: touch;\n}\n\n@utility touch-pan-y {\n  touch-action: pan-y;\n}\n\n@utility overscroll-behavior-contain {\n  overscroll-behavior: contain;\n}\n\n@layer utilities {\n  :root {\n    --foreground-rgb: 0, 0, 0;\n    --background-start-rgb: 214, 219, 220;\n    --background-end-rgb: 255, 255, 255;\n  }\n\n  @media (prefers-color-scheme: dark) {\n    :root {\n      --foreground-rgb: 255, 255, 255;\n      --background-start-rgb: 0, 0, 0;\n      --background-end-rgb: 0, 0, 0;\n    }\n  }\n}\n\n@layer base {\n  * {\n    @apply border-border;\n  }\n\n  body {\n    @apply bg-background text-foreground;\n    overflow-x: hidden;\n    position: relative;\n  }\n\n  html {\n    overflow-x: hidden;\n  }\n}\n\n.skeleton {\n  * {\n    pointer-events: none !important;\n  }\n\n  *[class^=\"text-\"] {\n    color: transparent;\n    @apply rounded-md bg-foreground/20 select-none animate-pulse;\n  }\n\n  .skeleton-bg {\n    @apply bg-foreground/10;\n  }\n\n  .skeleton-div {\n    @apply bg-foreground/20 animate-pulse;\n  }\n}\n\n.ProseMirror {\n  outline: none;\n}\n\n.cm-editor,\n.cm-gutters {\n  @apply bg-background! dark:bg-zinc-800! outline-hidden! selection:bg-zinc-900!;\n}\n\n.ͼo.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground,\n.ͼo.cm-selectionBackground,\n.ͼo.cm-content::selection {\n  @apply bg-zinc-200! dark:bg-zinc-900!;\n}\n\n.cm-activeLine,\n.cm-activeLineGutter {\n  @apply bg-transparent!;\n}\n\n.cm-activeLine {\n  @apply rounded-r-sm!;\n}\n\n.cm-lineNumbers {\n  @apply min-w-7;\n}\n\n.cm-foldGutter {\n  @apply min-w-3;\n}\n\n.cm-lineNumbers .cm-activeLineGutter {\n  @apply rounded-l-sm!;\n}\n\n.suggestion-highlight {\n  @apply bg-blue-200 hover:bg-blue-300 dark:hover:bg-blue-400/50 dark:text-blue-50 dark:bg-blue-500/40;\n}\n\n/* minimal scrollbar styling */\n::-webkit-scrollbar {\n  width: 6px;\n  height: 6px;\n}\n\n::-webkit-scrollbar-track {\n  background: transparent;\n}\n\n::-webkit-scrollbar-thumb {\n  background: var(--border);\n  border-radius: 3px;\n  transition: background 0.2s ease;\n}\n\n::-webkit-scrollbar-thumb:hover {\n  background: --alpha(var(--muted-foreground) / 0.5);\n}\n\n::-webkit-scrollbar-corner {\n  background: transparent;\n}\n\n/* firefox scrollbar styling */\n* {\n  scrollbar-width: thin;\n  scrollbar-color: var(--border) transparent;\n}\n\n@theme inline {\n  --color-sidebar: var(--sidebar);\n  --color-sidebar-foreground: var(--sidebar-foreground);\n  --color-sidebar-primary: var(--sidebar-primary);\n  --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);\n  --color-sidebar-accent: var(--sidebar-accent);\n  --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);\n  --color-sidebar-border: var(--sidebar-border);\n  --color-sidebar-ring: var(--sidebar-ring);\n}\n\n@layer base {\n  * {\n    @apply border-border outline-ring/50;\n  }\n  body {\n    @apply bg-background text-foreground;\n  }\n}\n"
  },
  {
    "path": "app/layout.tsx",
    "content": "import type { Metadata } from \"next\";\nimport { Geist, Geist_Mono } from \"next/font/google\";\nimport { Toaster } from \"sonner\";\nimport { ThemeProvider } from \"@/components/theme-provider\";\n\nimport \"./globals.css\";\nimport { SessionProvider } from \"next-auth/react\";\n\nexport const metadata: Metadata = {\n  metadataBase: new URL(\"https://chat.vercel.ai\"),\n  title: \"Next.js Chatbot Template\",\n  description: \"Next.js chatbot template using the AI SDK.\",\n};\n\nexport const viewport = {\n  maximumScale: 1, // Disable auto-zoom on mobile Safari\n};\n\nconst geist = Geist({\n  subsets: [\"latin\"],\n  display: \"swap\",\n  variable: \"--font-geist\",\n});\n\nconst geistMono = Geist_Mono({\n  subsets: [\"latin\"],\n  display: \"swap\",\n  variable: \"--font-geist-mono\",\n});\n\nconst LIGHT_THEME_COLOR = \"hsl(0 0% 100%)\";\nconst DARK_THEME_COLOR = \"hsl(240deg 10% 3.92%)\";\nconst THEME_COLOR_SCRIPT = `\\\n(function() {\n  var html = document.documentElement;\n  var meta = document.querySelector('meta[name=\"theme-color\"]');\n  if (!meta) {\n    meta = document.createElement('meta');\n    meta.setAttribute('name', 'theme-color');\n    document.head.appendChild(meta);\n  }\n  function updateThemeColor() {\n    var isDark = html.classList.contains('dark');\n    meta.setAttribute('content', isDark ? '${DARK_THEME_COLOR}' : '${LIGHT_THEME_COLOR}');\n  }\n  var observer = new MutationObserver(updateThemeColor);\n  observer.observe(html, { attributes: true, attributeFilter: ['class'] });\n  updateThemeColor();\n})();`;\n\nexport default function RootLayout({\n  children,\n}: Readonly<{\n  children: React.ReactNode;\n}>) {\n  return (\n    <html\n      className={`${geist.variable} ${geistMono.variable}`}\n      // `next-themes` injects an extra classname to the body element to avoid\n      // visual flicker before hydration. Hence the `suppressHydrationWarning`\n      // prop is necessary to avoid the React hydration mismatch warning.\n      // https://github.com/pacocoursey/next-themes?tab=readme-ov-file#with-app\n      lang=\"en\"\n      suppressHydrationWarning\n    >\n      <head>\n        <script\n          // biome-ignore lint/security/noDangerouslySetInnerHtml: \"Required\"\n          dangerouslySetInnerHTML={{\n            __html: THEME_COLOR_SCRIPT,\n          }}\n        />\n      </head>\n      <body className=\"antialiased\">\n        <ThemeProvider\n          attribute=\"class\"\n          defaultTheme=\"system\"\n          disableTransitionOnChange\n          enableSystem\n        >\n          <Toaster position=\"top-center\" />\n          <SessionProvider>{children}</SessionProvider>\n        </ThemeProvider>\n      </body>\n    </html>\n  );\n}\n"
  },
  {
    "path": "artifacts/actions.ts",
    "content": "\"use server\";\n\nimport { getSuggestionsByDocumentId } from \"@/lib/db/queries\";\n\nexport async function getSuggestions({ documentId }: { documentId: string }) {\n  const suggestions = await getSuggestionsByDocumentId({ documentId });\n  return suggestions ?? [];\n}\n"
  },
  {
    "path": "artifacts/code/client.tsx",
    "content": "import { toast } from \"sonner\";\nimport { CodeEditor } from \"@/components/code-editor\";\nimport {\n  Console,\n  type ConsoleOutput,\n  type ConsoleOutputContent,\n} from \"@/components/console\";\nimport { Artifact } from \"@/components/create-artifact\";\nimport {\n  CopyIcon,\n  LogsIcon,\n  MessageIcon,\n  PlayIcon,\n  RedoIcon,\n  UndoIcon,\n} from \"@/components/icons\";\nimport { generateUUID } from \"@/lib/utils\";\n\nconst OUTPUT_HANDLERS = {\n  matplotlib: `\n    import io\n    import base64\n    from matplotlib import pyplot as plt\n\n    # Clear any existing plots\n    plt.clf()\n    plt.close('all')\n\n    # Switch to agg backend\n    plt.switch_backend('agg')\n\n    def setup_matplotlib_output():\n        def custom_show():\n            if plt.gcf().get_size_inches().prod() * plt.gcf().dpi ** 2 > 25_000_000:\n                print(\"Warning: Plot size too large, reducing quality\")\n                plt.gcf().set_dpi(100)\n\n            png_buf = io.BytesIO()\n            plt.savefig(png_buf, format='png')\n            png_buf.seek(0)\n            png_base64 = base64.b64encode(png_buf.read()).decode('utf-8')\n            print(f'data:image/png;base64,{png_base64}')\n            png_buf.close()\n\n            plt.clf()\n            plt.close('all')\n\n        plt.show = custom_show\n  `,\n  basic: `\n    # Basic output capture setup\n  `,\n};\n\nfunction detectRequiredHandlers(code: string): string[] {\n  const handlers: string[] = [\"basic\"];\n\n  if (code.includes(\"matplotlib\") || code.includes(\"plt.\")) {\n    handlers.push(\"matplotlib\");\n  }\n\n  return handlers;\n}\n\ntype Metadata = {\n  outputs: ConsoleOutput[];\n};\n\nexport const codeArtifact = new Artifact<\"code\", Metadata>({\n  kind: \"code\",\n  description:\n    \"Useful for code generation; Code execution is only available for python code.\",\n  initialize: ({ setMetadata }) => {\n    setMetadata({\n      outputs: [],\n    });\n  },\n  onStreamPart: ({ streamPart, setArtifact }) => {\n    if (streamPart.type === \"data-codeDelta\") {\n      setArtifact((draftArtifact) => ({\n        ...draftArtifact,\n        content: streamPart.data,\n        isVisible:\n          draftArtifact.status === \"streaming\" &&\n          draftArtifact.content.length > 300 &&\n          draftArtifact.content.length < 310\n            ? true\n            : draftArtifact.isVisible,\n        status: \"streaming\",\n      }));\n    }\n  },\n  content: ({ metadata, setMetadata, ...props }) => {\n    return (\n      <>\n        <div className=\"px-1\">\n          <CodeEditor {...props} />\n        </div>\n\n        {metadata?.outputs && (\n          <Console\n            consoleOutputs={metadata.outputs}\n            setConsoleOutputs={() => {\n              setMetadata({\n                ...metadata,\n                outputs: [],\n              });\n            }}\n          />\n        )}\n      </>\n    );\n  },\n  actions: [\n    {\n      icon: <PlayIcon size={18} />,\n      label: \"Run\",\n      description: \"Execute code\",\n      onClick: async ({ content, setMetadata }) => {\n        const runId = generateUUID();\n        const outputContent: ConsoleOutputContent[] = [];\n\n        setMetadata((metadata) => ({\n          ...metadata,\n          outputs: [\n            ...metadata.outputs,\n            {\n              id: runId,\n              contents: [],\n              status: \"in_progress\",\n            },\n          ],\n        }));\n\n        try {\n          // @ts-expect-error - loadPyodide is not defined\n          const currentPyodideInstance = await globalThis.loadPyodide({\n            indexURL: \"https://cdn.jsdelivr.net/pyodide/v0.23.4/full/\",\n          });\n\n          currentPyodideInstance.setStdout({\n            batched: (output: string) => {\n              outputContent.push({\n                type: output.startsWith(\"data:image/png;base64\")\n                  ? \"image\"\n                  : \"text\",\n                value: output,\n              });\n            },\n          });\n\n          await currentPyodideInstance.loadPackagesFromImports(content, {\n            messageCallback: (message: string) => {\n              setMetadata((metadata) => ({\n                ...metadata,\n                outputs: [\n                  ...metadata.outputs.filter((output) => output.id !== runId),\n                  {\n                    id: runId,\n                    contents: [{ type: \"text\", value: message }],\n                    status: \"loading_packages\",\n                  },\n                ],\n              }));\n            },\n          });\n\n          const requiredHandlers = detectRequiredHandlers(content);\n          for (const handler of requiredHandlers) {\n            if (OUTPUT_HANDLERS[handler as keyof typeof OUTPUT_HANDLERS]) {\n              await currentPyodideInstance.runPythonAsync(\n                OUTPUT_HANDLERS[handler as keyof typeof OUTPUT_HANDLERS]\n              );\n\n              if (handler === \"matplotlib\") {\n                await currentPyodideInstance.runPythonAsync(\n                  \"setup_matplotlib_output()\"\n                );\n              }\n            }\n          }\n\n          await currentPyodideInstance.runPythonAsync(content);\n\n          setMetadata((metadata) => ({\n            ...metadata,\n            outputs: [\n              ...metadata.outputs.filter((output) => output.id !== runId),\n              {\n                id: runId,\n                contents: outputContent,\n                status: \"completed\",\n              },\n            ],\n          }));\n        } catch (error: any) {\n          setMetadata((metadata) => ({\n            ...metadata,\n            outputs: [\n              ...metadata.outputs.filter((output) => output.id !== runId),\n              {\n                id: runId,\n                contents: [{ type: \"text\", value: error.message }],\n                status: \"failed\",\n              },\n            ],\n          }));\n        }\n      },\n    },\n    {\n      icon: <UndoIcon size={18} />,\n      description: \"View Previous version\",\n      onClick: ({ handleVersionChange }) => {\n        handleVersionChange(\"prev\");\n      },\n      isDisabled: ({ currentVersionIndex }) => {\n        if (currentVersionIndex === 0) {\n          return true;\n        }\n\n        return false;\n      },\n    },\n    {\n      icon: <RedoIcon size={18} />,\n      description: \"View Next version\",\n      onClick: ({ handleVersionChange }) => {\n        handleVersionChange(\"next\");\n      },\n      isDisabled: ({ isCurrentVersion }) => {\n        if (isCurrentVersion) {\n          return true;\n        }\n\n        return false;\n      },\n    },\n    {\n      icon: <CopyIcon size={18} />,\n      description: \"Copy code to clipboard\",\n      onClick: ({ content }) => {\n        navigator.clipboard.writeText(content);\n        toast.success(\"Copied to clipboard!\");\n      },\n    },\n  ],\n  toolbar: [\n    {\n      icon: <MessageIcon />,\n      description: \"Add comments\",\n      onClick: ({ sendMessage }) => {\n        sendMessage({\n          role: \"user\",\n          parts: [\n            {\n              type: \"text\",\n              text: \"Add comments to the code snippet for understanding\",\n            },\n          ],\n        });\n      },\n    },\n    {\n      icon: <LogsIcon />,\n      description: \"Add logs\",\n      onClick: ({ sendMessage }) => {\n        sendMessage({\n          role: \"user\",\n          parts: [\n            {\n              type: \"text\",\n              text: \"Add logs to the code snippet for debugging\",\n            },\n          ],\n        });\n      },\n    },\n  ],\n});\n"
  },
  {
    "path": "artifacts/code/server.ts",
    "content": "import { streamObject } from \"ai\";\nimport { z } from \"zod\";\nimport { codePrompt, updateDocumentPrompt } from \"@/lib/ai/prompts\";\nimport { getArtifactModel } from \"@/lib/ai/providers\";\nimport { createDocumentHandler } from \"@/lib/artifacts/server\";\n\nexport const codeDocumentHandler = createDocumentHandler<\"code\">({\n  kind: \"code\",\n  onCreateDocument: async ({ title, dataStream }) => {\n    let draftContent = \"\";\n\n    const { fullStream } = streamObject({\n      model: getArtifactModel(),\n      system: codePrompt,\n      prompt: title,\n      schema: z.object({\n        code: z.string(),\n      }),\n    });\n\n    for await (const delta of fullStream) {\n      const { type } = delta;\n\n      if (type === \"object\") {\n        const { object } = delta;\n        const { code } = object;\n\n        if (code) {\n          dataStream.write({\n            type: \"data-codeDelta\",\n            data: code ?? \"\",\n            transient: true,\n          });\n\n          draftContent = code;\n        }\n      }\n    }\n\n    return draftContent;\n  },\n  onUpdateDocument: async ({ document, description, dataStream }) => {\n    let draftContent = \"\";\n\n    const { fullStream } = streamObject({\n      model: getArtifactModel(),\n      system: updateDocumentPrompt(document.content, \"code\"),\n      prompt: description,\n      schema: z.object({\n        code: z.string(),\n      }),\n    });\n\n    for await (const delta of fullStream) {\n      const { type } = delta;\n\n      if (type === \"object\") {\n        const { object } = delta;\n        const { code } = object;\n\n        if (code) {\n          dataStream.write({\n            type: \"data-codeDelta\",\n            data: code ?? \"\",\n            transient: true,\n          });\n\n          draftContent = code;\n        }\n      }\n    }\n\n    return draftContent;\n  },\n});\n"
  },
  {
    "path": "artifacts/image/client.tsx",
    "content": "import { toast } from \"sonner\";\nimport { Artifact } from \"@/components/create-artifact\";\nimport { CopyIcon, RedoIcon, UndoIcon } from \"@/components/icons\";\nimport { ImageEditor } from \"@/components/image-editor\";\n\nexport const imageArtifact = new Artifact({\n  kind: \"image\",\n  description: \"Useful for image generation\",\n  onStreamPart: ({ streamPart, setArtifact }) => {\n    if (streamPart.type === \"data-imageDelta\") {\n      setArtifact((draftArtifact) => ({\n        ...draftArtifact,\n        content: streamPart.data,\n        isVisible: true,\n        status: \"streaming\",\n      }));\n    }\n  },\n  content: ImageEditor,\n  actions: [\n    {\n      icon: <UndoIcon size={18} />,\n      description: \"View Previous version\",\n      onClick: ({ handleVersionChange }) => {\n        handleVersionChange(\"prev\");\n      },\n      isDisabled: ({ currentVersionIndex }) => {\n        if (currentVersionIndex === 0) {\n          return true;\n        }\n\n        return false;\n      },\n    },\n    {\n      icon: <RedoIcon size={18} />,\n      description: \"View Next version\",\n      onClick: ({ handleVersionChange }) => {\n        handleVersionChange(\"next\");\n      },\n      isDisabled: ({ isCurrentVersion }) => {\n        if (isCurrentVersion) {\n          return true;\n        }\n\n        return false;\n      },\n    },\n    {\n      icon: <CopyIcon size={18} />,\n      description: \"Copy image to clipboard\",\n      onClick: ({ content }) => {\n        const img = new Image();\n        img.src = `data:image/png;base64,${content}`;\n\n        img.onload = () => {\n          const canvas = document.createElement(\"canvas\");\n          canvas.width = img.width;\n          canvas.height = img.height;\n          const ctx = canvas.getContext(\"2d\");\n          ctx?.drawImage(img, 0, 0);\n          canvas.toBlob((blob) => {\n            if (blob) {\n              navigator.clipboard.write([\n                new ClipboardItem({ \"image/png\": blob }),\n              ]);\n            }\n          }, \"image/png\");\n        };\n\n        toast.success(\"Copied image to clipboard!\");\n      },\n    },\n  ],\n  toolbar: [],\n});\n"
  },
  {
    "path": "artifacts/sheet/client.tsx",
    "content": "import { parse, unparse } from \"papaparse\";\nimport { toast } from \"sonner\";\nimport { Artifact } from \"@/components/create-artifact\";\nimport {\n  CopyIcon,\n  LineChartIcon,\n  RedoIcon,\n  SparklesIcon,\n  UndoIcon,\n} from \"@/components/icons\";\nimport { SpreadsheetEditor } from \"@/components/sheet-editor\";\n\ntype Metadata = any;\n\nexport const sheetArtifact = new Artifact<\"sheet\", Metadata>({\n  kind: \"sheet\",\n  description: \"Useful for working with spreadsheets\",\n  initialize: () => null,\n  onStreamPart: ({ setArtifact, streamPart }) => {\n    if (streamPart.type === \"data-sheetDelta\") {\n      setArtifact((draftArtifact) => ({\n        ...draftArtifact,\n        content: streamPart.data,\n        isVisible: true,\n        status: \"streaming\",\n      }));\n    }\n  },\n  content: ({ content, currentVersionIndex, onSaveContent, status }) => {\n    return (\n      <SpreadsheetEditor\n        content={content}\n        currentVersionIndex={currentVersionIndex}\n        isCurrentVersion={true}\n        saveContent={onSaveContent}\n        status={status}\n      />\n    );\n  },\n  actions: [\n    {\n      icon: <UndoIcon size={18} />,\n      description: \"View Previous version\",\n      onClick: ({ handleVersionChange }) => {\n        handleVersionChange(\"prev\");\n      },\n      isDisabled: ({ currentVersionIndex }) => {\n        if (currentVersionIndex === 0) {\n          return true;\n        }\n\n        return false;\n      },\n    },\n    {\n      icon: <RedoIcon size={18} />,\n      description: \"View Next version\",\n      onClick: ({ handleVersionChange }) => {\n        handleVersionChange(\"next\");\n      },\n      isDisabled: ({ isCurrentVersion }) => {\n        if (isCurrentVersion) {\n          return true;\n        }\n\n        return false;\n      },\n    },\n    {\n      icon: <CopyIcon />,\n      description: \"Copy as .csv\",\n      onClick: ({ content }) => {\n        const parsed = parse<string[]>(content, { skipEmptyLines: true });\n\n        const nonEmptyRows = parsed.data.filter((row) =>\n          row.some((cell) => cell.trim() !== \"\")\n        );\n\n        const cleanedCsv = unparse(nonEmptyRows);\n\n        navigator.clipboard.writeText(cleanedCsv);\n        toast.success(\"Copied csv to clipboard!\");\n      },\n    },\n  ],\n  toolbar: [\n    {\n      description: \"Format and clean data\",\n      icon: <SparklesIcon />,\n      onClick: ({ sendMessage }) => {\n        sendMessage({\n          role: \"user\",\n          parts: [\n            { type: \"text\", text: \"Can you please format and clean the data?\" },\n          ],\n        });\n      },\n    },\n    {\n      description: \"Analyze and visualize data\",\n      icon: <LineChartIcon />,\n      onClick: ({ sendMessage }) => {\n        sendMessage({\n          role: \"user\",\n          parts: [\n            {\n              type: \"text\",\n              text: \"Can you please analyze and visualize the data by creating a new code artifact in python?\",\n            },\n          ],\n        });\n      },\n    },\n  ],\n});\n"
  },
  {
    "path": "artifacts/sheet/server.ts",
    "content": "import { streamObject } from \"ai\";\nimport { z } from \"zod\";\nimport { sheetPrompt, updateDocumentPrompt } from \"@/lib/ai/prompts\";\nimport { getArtifactModel } from \"@/lib/ai/providers\";\nimport { createDocumentHandler } from \"@/lib/artifacts/server\";\n\nexport const sheetDocumentHandler = createDocumentHandler<\"sheet\">({\n  kind: \"sheet\",\n  onCreateDocument: async ({ title, dataStream }) => {\n    let draftContent = \"\";\n\n    const { fullStream } = streamObject({\n      model: getArtifactModel(),\n      system: sheetPrompt,\n      prompt: title,\n      schema: z.object({\n        csv: z.string().describe(\"CSV data\"),\n      }),\n    });\n\n    for await (const delta of fullStream) {\n      const { type } = delta;\n\n      if (type === \"object\") {\n        const { object } = delta;\n        const { csv } = object;\n\n        if (csv) {\n          dataStream.write({\n            type: \"data-sheetDelta\",\n            data: csv,\n            transient: true,\n          });\n\n          draftContent = csv;\n        }\n      }\n    }\n\n    dataStream.write({\n      type: \"data-sheetDelta\",\n      data: draftContent,\n      transient: true,\n    });\n\n    return draftContent;\n  },\n  onUpdateDocument: async ({ document, description, dataStream }) => {\n    let draftContent = \"\";\n\n    const { fullStream } = streamObject({\n      model: getArtifactModel(),\n      system: updateDocumentPrompt(document.content, \"sheet\"),\n      prompt: description,\n      schema: z.object({\n        csv: z.string(),\n      }),\n    });\n\n    for await (const delta of fullStream) {\n      const { type } = delta;\n\n      if (type === \"object\") {\n        const { object } = delta;\n        const { csv } = object;\n\n        if (csv) {\n          dataStream.write({\n            type: \"data-sheetDelta\",\n            data: csv,\n            transient: true,\n          });\n\n          draftContent = csv;\n        }\n      }\n    }\n\n    return draftContent;\n  },\n});\n"
  },
  {
    "path": "artifacts/text/client.tsx",
    "content": "import { toast } from \"sonner\";\nimport { Artifact } from \"@/components/create-artifact\";\nimport { DiffView } from \"@/components/diffview\";\nimport { DocumentSkeleton } from \"@/components/document-skeleton\";\nimport {\n  ClockRewind,\n  CopyIcon,\n  MessageIcon,\n  PenIcon,\n  RedoIcon,\n  UndoIcon,\n} from \"@/components/icons\";\nimport { Editor } from \"@/components/text-editor\";\nimport type { Suggestion } from \"@/lib/db/schema\";\nimport { getSuggestions } from \"../actions\";\n\ntype TextArtifactMetadata = {\n  suggestions: Suggestion[];\n};\n\nexport const textArtifact = new Artifact<\"text\", TextArtifactMetadata>({\n  kind: \"text\",\n  description: \"Useful for text content, like drafting essays and emails.\",\n  initialize: async ({ documentId, setMetadata }) => {\n    const suggestions = await getSuggestions({ documentId });\n\n    setMetadata({\n      suggestions,\n    });\n  },\n  onStreamPart: ({ streamPart, setMetadata, setArtifact }) => {\n    if (streamPart.type === \"data-suggestion\") {\n      setMetadata((metadata) => {\n        return {\n          suggestions: [...metadata.suggestions, streamPart.data],\n        };\n      });\n    }\n\n    if (streamPart.type === \"data-textDelta\") {\n      setArtifact((draftArtifact) => {\n        return {\n          ...draftArtifact,\n          content: draftArtifact.content + streamPart.data,\n          isVisible:\n            draftArtifact.status === \"streaming\" &&\n            draftArtifact.content.length > 400 &&\n            draftArtifact.content.length < 450\n              ? true\n              : draftArtifact.isVisible,\n          status: \"streaming\",\n        };\n      });\n    }\n  },\n  content: ({\n    mode,\n    status,\n    content,\n    isCurrentVersion,\n    currentVersionIndex,\n    onSaveContent,\n    getDocumentContentById,\n    isLoading,\n    metadata,\n  }) => {\n    if (isLoading) {\n      return <DocumentSkeleton artifactKind=\"text\" />;\n    }\n\n    if (mode === \"diff\") {\n      const oldContent = getDocumentContentById(currentVersionIndex - 1);\n      const newContent = getDocumentContentById(currentVersionIndex);\n\n      return <DiffView newContent={newContent} oldContent={oldContent} />;\n    }\n\n    return (\n      <div className=\"flex flex-row px-4 py-8 md:p-20\">\n        <Editor\n          content={content}\n          currentVersionIndex={currentVersionIndex}\n          isCurrentVersion={isCurrentVersion}\n          onSaveContent={onSaveContent}\n          status={status}\n          suggestions={metadata ? metadata.suggestions : []}\n        />\n\n        {metadata?.suggestions && metadata.suggestions.length > 0 ? (\n          <div className=\"h-dvh w-12 shrink-0 md:hidden\" />\n        ) : null}\n      </div>\n    );\n  },\n  actions: [\n    {\n      icon: <ClockRewind size={18} />,\n      description: \"View changes\",\n      onClick: ({ handleVersionChange }) => {\n        handleVersionChange(\"toggle\");\n      },\n      isDisabled: ({ currentVersionIndex }) => {\n        if (currentVersionIndex === 0) {\n          return true;\n        }\n\n        return false;\n      },\n    },\n    {\n      icon: <UndoIcon size={18} />,\n      description: \"View Previous version\",\n      onClick: ({ handleVersionChange }) => {\n        handleVersionChange(\"prev\");\n      },\n      isDisabled: ({ currentVersionIndex }) => {\n        if (currentVersionIndex === 0) {\n          return true;\n        }\n\n        return false;\n      },\n    },\n    {\n      icon: <RedoIcon size={18} />,\n      description: \"View Next version\",\n      onClick: ({ handleVersionChange }) => {\n        handleVersionChange(\"next\");\n      },\n      isDisabled: ({ isCurrentVersion }) => {\n        if (isCurrentVersion) {\n          return true;\n        }\n\n        return false;\n      },\n    },\n    {\n      icon: <CopyIcon size={18} />,\n      description: \"Copy to clipboard\",\n      onClick: ({ content }) => {\n        navigator.clipboard.writeText(content);\n        toast.success(\"Copied to clipboard!\");\n      },\n    },\n  ],\n  toolbar: [\n    {\n      icon: <PenIcon />,\n      description: \"Add final polish\",\n      onClick: ({ sendMessage }) => {\n        sendMessage({\n          role: \"user\",\n          parts: [\n            {\n              type: \"text\",\n              text: \"Please add final polish and check for grammar, add section titles for better structure, and ensure everything reads smoothly.\",\n            },\n          ],\n        });\n      },\n    },\n    {\n      icon: <MessageIcon />,\n      description: \"Request suggestions\",\n      onClick: ({ sendMessage }) => {\n        sendMessage({\n          role: \"user\",\n          parts: [\n            {\n              type: \"text\",\n              text: \"Please add suggestions you have that could improve the writing.\",\n            },\n          ],\n        });\n      },\n    },\n  ],\n});\n"
  },
  {
    "path": "artifacts/text/server.ts",
    "content": "import { smoothStream, streamText } from \"ai\";\nimport { updateDocumentPrompt } from \"@/lib/ai/prompts\";\nimport { getArtifactModel } from \"@/lib/ai/providers\";\nimport { createDocumentHandler } from \"@/lib/artifacts/server\";\n\nexport const textDocumentHandler = createDocumentHandler<\"text\">({\n  kind: \"text\",\n  onCreateDocument: async ({ title, dataStream }) => {\n    let draftContent = \"\";\n\n    const { fullStream } = streamText({\n      model: getArtifactModel(),\n      system:\n        \"Write about the given topic. Markdown is supported. Use headings wherever appropriate.\",\n      experimental_transform: smoothStream({ chunking: \"word\" }),\n      prompt: title,\n    });\n\n    for await (const delta of fullStream) {\n      const { type } = delta;\n\n      if (type === \"text-delta\") {\n        const { text } = delta;\n\n        draftContent += text;\n\n        dataStream.write({\n          type: \"data-textDelta\",\n          data: text,\n          transient: true,\n        });\n      }\n    }\n\n    return draftContent;\n  },\n  onUpdateDocument: async ({ document, description, dataStream }) => {\n    let draftContent = \"\";\n\n    const { fullStream } = streamText({\n      model: getArtifactModel(),\n      system: updateDocumentPrompt(document.content, \"text\"),\n      experimental_transform: smoothStream({ chunking: \"word\" }),\n      prompt: description,\n      providerOptions: {\n        openai: {\n          prediction: {\n            type: \"content\",\n            content: document.content,\n          },\n        },\n      },\n    });\n\n    for await (const delta of fullStream) {\n      const { type } = delta;\n\n      if (type === \"text-delta\") {\n        const { text } = delta;\n\n        draftContent += text;\n\n        dataStream.write({\n          type: \"data-textDelta\",\n          data: text,\n          transient: true,\n        });\n      }\n    }\n\n    return draftContent;\n  },\n});\n"
  },
  {
    "path": "biome.jsonc",
    "content": "{\n  \"$schema\": \"./node_modules/@biomejs/biome/configuration_schema.json\",\n  \"extends\": [\n    \"ultracite/biome/core\",\n    \"ultracite/biome/next\",\n    \"ultracite/biome/react\"\n  ],\n  \"formatter\": {\n    \"indentStyle\": \"space\",\n    \"indentWidth\": 2\n  },\n  \"files\": {\n    \"includes\": [\n      \"**/*.ts\",\n      \"**/*.tsx\",\n      \"**/*.js\",\n      \"**/*.jsx\",\n      \"!node_modules\",\n      \"!.next\",\n      \"!ai-sdk\",\n      \"!components/ui\",\n      \"!lib/utils.ts\",\n      \"!hooks/use-mobile.ts\"\n    ]\n  },\n  \"linter\": {\n    \"rules\": {\n      \"suspicious\": {\n        \"noExplicitAny\": \"off\",\n        \"noUnknownAtRules\": \"off\",\n        \"noConsole\": \"off\",\n        \"noBitwiseOperators\": \"off\"\n      },\n      \"style\": {\n        \"noMagicNumbers\": \"off\",\n        \"noNestedTernary\": \"off\",\n        \"useConsistentTypeDefinitions\": \"off\"\n      },\n      \"nursery\": {\n        \"noUnnecessaryConditions\": \"off\",\n        \"useSortedClasses\": \"off\"\n      },\n      \"complexity\": {\n        \"noExcessiveCognitiveComplexity\": \"off\",\n        \"useSimplifiedLogicExpression\": \"off\"\n      },\n      \"a11y\": {\n        \"noSvgWithoutTitle\": \"off\"\n      },\n      \"correctness\": {\n        \"useUniqueElementIds\": \"off\",\n        \"useImageSize\": \"off\"\n      },\n      \"performance\": {\n        \"noBarrelFile\": \"off\",\n        \"useTopLevelRegex\": \"off\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "components/ai-elements/artifact.tsx",
    "content": "\"use client\";\n\nimport { type LucideIcon, XIcon } from \"lucide-react\";\nimport type { ComponentProps, HTMLAttributes } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n  Tooltip,\n  TooltipContent,\n  TooltipProvider,\n  TooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { cn } from \"@/lib/utils\";\n\nexport type ArtifactProps = HTMLAttributes<HTMLDivElement>;\n\nexport const Artifact = ({ className, ...props }: ArtifactProps) => (\n  <div\n    className={cn(\n      \"flex flex-col overflow-hidden rounded-lg border bg-background shadow-sm\",\n      className\n    )}\n    {...props}\n  />\n);\n\nexport type ArtifactHeaderProps = HTMLAttributes<HTMLDivElement>;\n\nexport const ArtifactHeader = ({\n  className,\n  ...props\n}: ArtifactHeaderProps) => (\n  <div\n    className={cn(\n      \"flex items-center justify-between border-b bg-muted/50 px-4 py-3\",\n      className\n    )}\n    {...props}\n  />\n);\n\nexport type ArtifactCloseProps = ComponentProps<typeof Button>;\n\nexport const ArtifactClose = ({\n  className,\n  children,\n  size = \"sm\",\n  variant = \"ghost\",\n  ...props\n}: ArtifactCloseProps) => (\n  <Button\n    className={cn(\n      \"size-8 p-0 text-muted-foreground hover:text-foreground\",\n      className\n    )}\n    size={size}\n    type=\"button\"\n    variant={variant}\n    {...props}\n  >\n    {children ?? <XIcon className=\"size-4\" />}\n    <span className=\"sr-only\">Close</span>\n  </Button>\n);\n\nexport type ArtifactTitleProps = HTMLAttributes<HTMLParagraphElement>;\n\nexport const ArtifactTitle = ({ className, ...props }: ArtifactTitleProps) => (\n  <p\n    className={cn(\"font-medium text-foreground text-sm\", className)}\n    {...props}\n  />\n);\n\nexport type ArtifactDescriptionProps = HTMLAttributes<HTMLParagraphElement>;\n\nexport const ArtifactDescription = ({\n  className,\n  ...props\n}: ArtifactDescriptionProps) => (\n  <p className={cn(\"text-muted-foreground text-sm\", className)} {...props} />\n);\n\nexport type ArtifactActionsProps = HTMLAttributes<HTMLDivElement>;\n\nexport const ArtifactActions = ({\n  className,\n  ...props\n}: ArtifactActionsProps) => (\n  <div className={cn(\"flex items-center gap-1\", className)} {...props} />\n);\n\nexport type ArtifactActionProps = ComponentProps<typeof Button> & {\n  tooltip?: string;\n  label?: string;\n  icon?: LucideIcon;\n};\n\nexport const ArtifactAction = ({\n  tooltip,\n  label,\n  icon: Icon,\n  children,\n  className,\n  size = \"sm\",\n  variant = \"ghost\",\n  ...props\n}: ArtifactActionProps) => {\n  const button = (\n    <Button\n      className={cn(\n        \"size-8 p-0 text-muted-foreground hover:text-foreground\",\n        className\n      )}\n      size={size}\n      type=\"button\"\n      variant={variant}\n      {...props}\n    >\n      {Icon ? <Icon className=\"size-4\" /> : children}\n      <span className=\"sr-only\">{label || tooltip}</span>\n    </Button>\n  );\n\n  if (tooltip) {\n    return (\n      <TooltipProvider>\n        <Tooltip>\n          <TooltipTrigger asChild>{button}</TooltipTrigger>\n          <TooltipContent>\n            <p>{tooltip}</p>\n          </TooltipContent>\n        </Tooltip>\n      </TooltipProvider>\n    );\n  }\n\n  return button;\n};\n\nexport type ArtifactContentProps = HTMLAttributes<HTMLDivElement>;\n\nexport const ArtifactContent = ({\n  className,\n  ...props\n}: ArtifactContentProps) => (\n  <div className={cn(\"flex-1 overflow-auto p-4\", className)} {...props} />\n);\n"
  },
  {
    "path": "components/ai-elements/canvas.tsx",
    "content": "import { Background, ReactFlow, type ReactFlowProps } from \"@xyflow/react\";\nimport type { ReactNode } from \"react\";\nimport \"@xyflow/react/dist/style.css\";\n\ntype CanvasProps = ReactFlowProps & {\n  children?: ReactNode;\n};\n\nexport const Canvas = ({ children, ...props }: CanvasProps) => (\n  <ReactFlow\n    deleteKeyCode={[\"Backspace\", \"Delete\"]}\n    fitView\n    panOnDrag={false}\n    panOnScroll\n    selectionOnDrag={true}\n    zoomOnDoubleClick={false}\n    {...props}\n  >\n    <Background bgColor=\"var(--sidebar)\" />\n    {children}\n  </ReactFlow>\n);\n"
  },
  {
    "path": "components/ai-elements/chain-of-thought.tsx",
    "content": "\"use client\";\n\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport {\n  BrainIcon,\n  ChevronDownIcon,\n  DotIcon,\n  type LucideIcon,\n} from \"lucide-react\";\nimport type { ComponentProps, ReactNode } from \"react\";\nimport { createContext, memo, useContext, useMemo } from \"react\";\nimport { Badge } from \"@/components/ui/badge\";\nimport {\n  Collapsible,\n  CollapsibleContent,\n  CollapsibleTrigger,\n} from \"@/components/ui/collapsible\";\nimport { cn } from \"@/lib/utils\";\n\ntype ChainOfThoughtContextValue = {\n  isOpen: boolean;\n  setIsOpen: (open: boolean) => void;\n};\n\nconst ChainOfThoughtContext = createContext<ChainOfThoughtContextValue | null>(\n  null\n);\n\nconst useChainOfThought = () => {\n  const context = useContext(ChainOfThoughtContext);\n  if (!context) {\n    throw new Error(\n      \"ChainOfThought components must be used within ChainOfThought\"\n    );\n  }\n  return context;\n};\n\nexport type ChainOfThoughtProps = ComponentProps<\"div\"> & {\n  open?: boolean;\n  defaultOpen?: boolean;\n  onOpenChange?: (open: boolean) => void;\n};\n\nexport const ChainOfThought = memo(\n  ({\n    className,\n    open,\n    defaultOpen = false,\n    onOpenChange,\n    children,\n    ...props\n  }: ChainOfThoughtProps) => {\n    const [isOpen, setIsOpen] = useControllableState({\n      prop: open,\n      defaultProp: defaultOpen,\n      onChange: onOpenChange,\n    });\n\n    const chainOfThoughtContext = useMemo(\n      () => ({ isOpen, setIsOpen }),\n      [isOpen, setIsOpen]\n    );\n\n    return (\n      <ChainOfThoughtContext.Provider value={chainOfThoughtContext}>\n        <div\n          className={cn(\"not-prose max-w-prose space-y-4\", className)}\n          {...props}\n        >\n          {children}\n        </div>\n      </ChainOfThoughtContext.Provider>\n    );\n  }\n);\n\nexport type ChainOfThoughtHeaderProps = ComponentProps<\n  typeof CollapsibleTrigger\n>;\n\nexport const ChainOfThoughtHeader = memo(\n  ({ className, children, ...props }: ChainOfThoughtHeaderProps) => {\n    const { isOpen, setIsOpen } = useChainOfThought();\n\n    return (\n      <Collapsible onOpenChange={setIsOpen} open={isOpen}>\n        <CollapsibleTrigger\n          className={cn(\n            \"flex w-full items-center gap-2 text-muted-foreground text-sm transition-colors hover:text-foreground\",\n            className\n          )}\n          {...props}\n        >\n          <BrainIcon className=\"size-4\" />\n          <span className=\"flex-1 text-left\">\n            {children ?? \"Chain of Thought\"}\n          </span>\n          <ChevronDownIcon\n            className={cn(\n              \"size-4 transition-transform\",\n              isOpen ? \"rotate-180\" : \"rotate-0\"\n            )}\n          />\n        </CollapsibleTrigger>\n      </Collapsible>\n    );\n  }\n);\n\nexport type ChainOfThoughtStepProps = ComponentProps<\"div\"> & {\n  icon?: LucideIcon;\n  label: ReactNode;\n  description?: ReactNode;\n  status?: \"complete\" | \"active\" | \"pending\";\n};\n\nexport const ChainOfThoughtStep = memo(\n  ({\n    className,\n    icon: Icon = DotIcon,\n    label,\n    description,\n    status = \"complete\",\n    children,\n    ...props\n  }: ChainOfThoughtStepProps) => {\n    const statusStyles = {\n      complete: \"text-muted-foreground\",\n      active: \"text-foreground\",\n      pending: \"text-muted-foreground/50\",\n    };\n\n    return (\n      <div\n        className={cn(\n          \"flex gap-2 text-sm\",\n          statusStyles[status],\n          \"fade-in-0 slide-in-from-top-2 animate-in\",\n          className\n        )}\n        {...props}\n      >\n        <div className=\"relative mt-0.5\">\n          <Icon className=\"size-4\" />\n          <div className=\"absolute top-7 bottom-0 left-1/2 -mx-px w-px bg-border\" />\n        </div>\n        <div className=\"flex-1 space-y-2 overflow-hidden\">\n          <div>{label}</div>\n          {description && (\n            <div className=\"text-muted-foreground text-xs\">{description}</div>\n          )}\n          {children}\n        </div>\n      </div>\n    );\n  }\n);\n\nexport type ChainOfThoughtSearchResultsProps = ComponentProps<\"div\">;\n\nexport const ChainOfThoughtSearchResults = memo(\n  ({ className, ...props }: ChainOfThoughtSearchResultsProps) => (\n    <div\n      className={cn(\"flex flex-wrap items-center gap-2\", className)}\n      {...props}\n    />\n  )\n);\n\nexport type ChainOfThoughtSearchResultProps = ComponentProps<typeof Badge>;\n\nexport const ChainOfThoughtSearchResult = memo(\n  ({ className, children, ...props }: ChainOfThoughtSearchResultProps) => (\n    <Badge\n      className={cn(\"gap-1 px-2 py-0.5 font-normal text-xs\", className)}\n      variant=\"secondary\"\n      {...props}\n    >\n      {children}\n    </Badge>\n  )\n);\n\nexport type ChainOfThoughtContentProps = ComponentProps<\n  typeof CollapsibleContent\n>;\n\nexport const ChainOfThoughtContent = memo(\n  ({ className, children, ...props }: ChainOfThoughtContentProps) => {\n    const { isOpen } = useChainOfThought();\n\n    return (\n      <Collapsible open={isOpen}>\n        <CollapsibleContent\n          className={cn(\n            \"mt-2 space-y-3\",\n            \"data-[state=closed]:fade-out-0 data-[state=closed]:slide-out-to-top-2 data-[state=open]:slide-in-from-top-2 text-popover-foreground outline-none data-[state=closed]:animate-out data-[state=open]:animate-in\",\n            className\n          )}\n          {...props}\n        >\n          {children}\n        </CollapsibleContent>\n      </Collapsible>\n    );\n  }\n);\n\nexport type ChainOfThoughtImageProps = ComponentProps<\"div\"> & {\n  caption?: string;\n};\n\nexport const ChainOfThoughtImage = memo(\n  ({ className, children, caption, ...props }: ChainOfThoughtImageProps) => (\n    <div className={cn(\"mt-2 space-y-2\", className)} {...props}>\n      <div className=\"relative flex max-h-[22rem] items-center justify-center overflow-hidden rounded-lg bg-muted p-3\">\n        {children}\n      </div>\n      {caption && <p className=\"text-muted-foreground text-xs\">{caption}</p>}\n    </div>\n  )\n);\n\nChainOfThought.displayName = \"ChainOfThought\";\nChainOfThoughtHeader.displayName = \"ChainOfThoughtHeader\";\nChainOfThoughtStep.displayName = \"ChainOfThoughtStep\";\nChainOfThoughtSearchResults.displayName = \"ChainOfThoughtSearchResults\";\nChainOfThoughtSearchResult.displayName = \"ChainOfThoughtSearchResult\";\nChainOfThoughtContent.displayName = \"ChainOfThoughtContent\";\nChainOfThoughtImage.displayName = \"ChainOfThoughtImage\";\n"
  },
  {
    "path": "components/ai-elements/checkpoint.tsx",
    "content": "\"use client\";\n\nimport { BookmarkIcon, type LucideProps } from \"lucide-react\";\nimport type { ComponentProps, HTMLAttributes } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport { Separator } from \"@/components/ui/separator\";\nimport {\n  Tooltip,\n  TooltipContent,\n  TooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { cn } from \"@/lib/utils\";\n\nexport type CheckpointProps = HTMLAttributes<HTMLDivElement>;\n\nexport const Checkpoint = ({\n  className,\n  children,\n  ...props\n}: CheckpointProps) => (\n  <div\n    className={cn(\n      \"flex items-center gap-0.5 overflow-hidden text-muted-foreground\",\n      className\n    )}\n    {...props}\n  >\n    {children}\n    <Separator />\n  </div>\n);\n\nexport type CheckpointIconProps = LucideProps;\n\nexport const CheckpointIcon = ({\n  className,\n  children,\n  ...props\n}: CheckpointIconProps) =>\n  children ?? (\n    <BookmarkIcon className={cn(\"size-4 shrink-0\", className)} {...props} />\n  );\n\nexport type CheckpointTriggerProps = ComponentProps<typeof Button> & {\n  tooltip?: string;\n};\n\nexport const CheckpointTrigger = ({\n  children,\n  className,\n  variant = \"ghost\",\n  size = \"sm\",\n  tooltip,\n  ...props\n}: CheckpointTriggerProps) =>\n  tooltip ? (\n    <Tooltip>\n      <TooltipTrigger asChild>\n        <Button size={size} type=\"button\" variant={variant} {...props}>\n          {children}\n        </Button>\n      </TooltipTrigger>\n      <TooltipContent align=\"start\" side=\"bottom\">\n        {tooltip}\n      </TooltipContent>\n    </Tooltip>\n  ) : (\n    <Button size={size} type=\"button\" variant={variant} {...props}>\n      {children}\n    </Button>\n  );\n"
  },
  {
    "path": "components/ai-elements/confirmation.tsx",
    "content": "\"use client\";\n\nimport type { ToolUIPart } from \"ai\";\nimport {\n  type ComponentProps,\n  createContext,\n  type ReactNode,\n  useContext,\n} from \"react\";\nimport { Alert, AlertDescription } from \"@/components/ui/alert\";\nimport { Button } from \"@/components/ui/button\";\nimport { cn } from \"@/lib/utils\";\n\ntype ToolUIPartApproval =\n  | {\n      id: string;\n      approved?: never;\n      reason?: never;\n    }\n  | {\n      id: string;\n      approved: boolean;\n      reason?: string;\n    }\n  | {\n      id: string;\n      approved: true;\n      reason?: string;\n    }\n  | {\n      id: string;\n      approved: true;\n      reason?: string;\n    }\n  | {\n      id: string;\n      approved: false;\n      reason?: string;\n    }\n  | undefined;\n\ntype ConfirmationContextValue = {\n  approval: ToolUIPartApproval;\n  state: ToolUIPart[\"state\"];\n};\n\nconst ConfirmationContext = createContext<ConfirmationContextValue | null>(\n  null\n);\n\nconst useConfirmation = () => {\n  const context = useContext(ConfirmationContext);\n\n  if (!context) {\n    throw new Error(\"Confirmation components must be used within Confirmation\");\n  }\n\n  return context;\n};\n\nexport type ConfirmationProps = ComponentProps<typeof Alert> & {\n  approval?: ToolUIPartApproval;\n  state: ToolUIPart[\"state\"];\n};\n\nexport const Confirmation = ({\n  className,\n  approval,\n  state,\n  ...props\n}: ConfirmationProps) => {\n  if (!approval || state === \"input-streaming\" || state === \"input-available\") {\n    return null;\n  }\n\n  return (\n    <ConfirmationContext.Provider value={{ approval, state }}>\n      <Alert className={cn(\"flex flex-col gap-2\", className)} {...props} />\n    </ConfirmationContext.Provider>\n  );\n};\n\nexport type ConfirmationTitleProps = ComponentProps<typeof AlertDescription>;\n\nexport const ConfirmationTitle = ({\n  className,\n  ...props\n}: ConfirmationTitleProps) => (\n  <AlertDescription className={cn(\"inline\", className)} {...props} />\n);\n\nexport type ConfirmationRequestProps = {\n  children?: ReactNode;\n};\n\nexport const ConfirmationRequest = ({ children }: ConfirmationRequestProps) => {\n  const { state } = useConfirmation();\n\n  // Only show when approval is requested\n  if (state !== \"approval-requested\") {\n    return null;\n  }\n\n  return children;\n};\n\nexport type ConfirmationAcceptedProps = {\n  children?: ReactNode;\n};\n\nexport const ConfirmationAccepted = ({\n  children,\n}: ConfirmationAcceptedProps) => {\n  const { approval, state } = useConfirmation();\n\n  // Only show when approved and in response states\n  if (\n    !approval?.approved ||\n    (state !== \"approval-responded\" &&\n      state !== \"output-denied\" &&\n      state !== \"output-available\")\n  ) {\n    return null;\n  }\n\n  return children;\n};\n\nexport type ConfirmationRejectedProps = {\n  children?: ReactNode;\n};\n\nexport const ConfirmationRejected = ({\n  children,\n}: ConfirmationRejectedProps) => {\n  const { approval, state } = useConfirmation();\n\n  // Only show when rejected and in response states\n  if (\n    approval?.approved !== false ||\n    (state !== \"approval-responded\" &&\n      state !== \"output-denied\" &&\n      state !== \"output-available\")\n  ) {\n    return null;\n  }\n\n  return children;\n};\n\nexport type ConfirmationActionsProps = ComponentProps<\"div\">;\n\nexport const ConfirmationActions = ({\n  className,\n  ...props\n}: ConfirmationActionsProps) => {\n  const { state } = useConfirmation();\n\n  // Only show when approval is requested\n  if (state !== \"approval-requested\") {\n    return null;\n  }\n\n  return (\n    <div\n      className={cn(\"flex items-center justify-end gap-2 self-end\", className)}\n      {...props}\n    />\n  );\n};\n\nexport type ConfirmationActionProps = ComponentProps<typeof Button>;\n\nexport const ConfirmationAction = (props: ConfirmationActionProps) => (\n  <Button className=\"h-8 px-3 text-sm\" type=\"button\" {...props} />\n);\n"
  },
  {
    "path": "components/ai-elements/connection.tsx",
    "content": "import type { ConnectionLineComponent } from \"@xyflow/react\";\n\nconst HALF = 0.5;\n\nexport const Connection: ConnectionLineComponent = ({\n  fromX,\n  fromY,\n  toX,\n  toY,\n}) => (\n  <g>\n    <path\n      className=\"animated\"\n      d={`M${fromX},${fromY} C ${fromX + (toX - fromX) * HALF},${fromY} ${fromX + (toX - fromX) * HALF},${toY} ${toX},${toY}`}\n      fill=\"none\"\n      stroke=\"var(--color-ring)\"\n      strokeWidth={1}\n    />\n    <circle\n      cx={toX}\n      cy={toY}\n      fill=\"#fff\"\n      r={3}\n      stroke=\"var(--color-ring)\"\n      strokeWidth={1}\n    />\n  </g>\n);\n"
  },
  {
    "path": "components/ai-elements/controls.tsx",
    "content": "\"use client\";\n\nimport { Controls as ControlsPrimitive } from \"@xyflow/react\";\nimport type { ComponentProps } from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport type ControlsProps = ComponentProps<typeof ControlsPrimitive>;\n\nexport const Controls = ({ className, ...props }: ControlsProps) => (\n  <ControlsPrimitive\n    className={cn(\n      \"gap-px overflow-hidden rounded-md border bg-card p-1 shadow-none!\",\n      \"[&>button]:rounded-md [&>button]:border-none! [&>button]:bg-transparent! [&>button]:hover:bg-secondary!\",\n      className\n    )}\n    {...props}\n  />\n);\n"
  },
  {
    "path": "components/ai-elements/conversation.tsx",
    "content": "\"use client\";\n\nimport { ArrowDownIcon } from \"lucide-react\";\nimport type { ComponentProps } from \"react\";\nimport { useCallback } from \"react\";\nimport { StickToBottom, useStickToBottomContext } from \"use-stick-to-bottom\";\nimport { Button } from \"@/components/ui/button\";\nimport { cn } from \"@/lib/utils\";\n\nexport type ConversationProps = ComponentProps<typeof StickToBottom>;\n\nexport const Conversation = ({ className, ...props }: ConversationProps) => (\n  <StickToBottom\n    className={cn(\"relative flex-1 overflow-y-hidden\", className)}\n    initial=\"smooth\"\n    resize=\"smooth\"\n    role=\"log\"\n    {...props}\n  />\n);\n\nexport type ConversationContentProps = ComponentProps<\n  typeof StickToBottom.Content\n>;\n\nexport const ConversationContent = ({\n  className,\n  ...props\n}: ConversationContentProps) => (\n  <StickToBottom.Content\n    className={cn(\"flex flex-col gap-8 p-4\", className)}\n    {...props}\n  />\n);\n\nexport type ConversationEmptyStateProps = ComponentProps<\"div\"> & {\n  title?: string;\n  description?: string;\n  icon?: React.ReactNode;\n};\n\nexport const ConversationEmptyState = ({\n  className,\n  title = \"No messages yet\",\n  description = \"Start a conversation to see messages here\",\n  icon,\n  children,\n  ...props\n}: ConversationEmptyStateProps) => (\n  <div\n    className={cn(\n      \"flex size-full flex-col items-center justify-center gap-3 p-8 text-center\",\n      className\n    )}\n    {...props}\n  >\n    {children ?? (\n      <>\n        {icon && <div className=\"text-muted-foreground\">{icon}</div>}\n        <div className=\"space-y-1\">\n          <h3 className=\"font-medium text-sm\">{title}</h3>\n          {description && (\n            <p className=\"text-muted-foreground text-sm\">{description}</p>\n          )}\n        </div>\n      </>\n    )}\n  </div>\n);\n\nexport type ConversationScrollButtonProps = ComponentProps<typeof Button>;\n\nexport const ConversationScrollButton = ({\n  className,\n  ...props\n}: ConversationScrollButtonProps) => {\n  const { isAtBottom, scrollToBottom } = useStickToBottomContext();\n\n  const handleScrollToBottom = useCallback(() => {\n    scrollToBottom();\n  }, [scrollToBottom]);\n\n  return (\n    !isAtBottom && (\n      <Button\n        className={cn(\n          \"absolute bottom-4 left-[50%] translate-x-[-50%] rounded-full\",\n          className\n        )}\n        onClick={handleScrollToBottom}\n        size=\"icon\"\n        type=\"button\"\n        variant=\"outline\"\n        {...props}\n      >\n        <ArrowDownIcon className=\"size-4\" />\n      </Button>\n    )\n  );\n};\n"
  },
  {
    "path": "components/ai-elements/edge.tsx",
    "content": "import {\n  BaseEdge,\n  type EdgeProps,\n  getBezierPath,\n  getSimpleBezierPath,\n  type InternalNode,\n  type Node,\n  Position,\n  useInternalNode,\n} from \"@xyflow/react\";\n\nconst Temporary = ({\n  id,\n  sourceX,\n  sourceY,\n  targetX,\n  targetY,\n  sourcePosition,\n  targetPosition,\n}: EdgeProps) => {\n  const [edgePath] = getSimpleBezierPath({\n    sourceX,\n    sourceY,\n    sourcePosition,\n    targetX,\n    targetY,\n    targetPosition,\n  });\n\n  return (\n    <BaseEdge\n      className=\"stroke-1 stroke-ring\"\n      id={id}\n      path={edgePath}\n      style={{\n        strokeDasharray: \"5, 5\",\n      }}\n    />\n  );\n};\n\nconst getHandleCoordsByPosition = (\n  node: InternalNode<Node>,\n  handlePosition: Position\n) => {\n  // Choose the handle type based on position - Left is for target, Right is for source\n  const handleType = handlePosition === Position.Left ? \"target\" : \"source\";\n\n  const handle = node.internals.handleBounds?.[handleType]?.find(\n    (h) => h.position === handlePosition\n  );\n\n  if (!handle) {\n    return [0, 0] as const;\n  }\n\n  let offsetX = handle.width / 2;\n  let offsetY = handle.height / 2;\n\n  // this is a tiny detail to make the markerEnd of an edge visible.\n  // The handle position that gets calculated has the origin top-left, so depending which side we are using, we add a little offset\n  // when the handlePosition is Position.Right for example, we need to add an offset as big as the handle itself in order to get the correct position\n  switch (handlePosition) {\n    case Position.Left:\n      offsetX = 0;\n      break;\n    case Position.Right:\n      offsetX = handle.width;\n      break;\n    case Position.Top:\n      offsetY = 0;\n      break;\n    case Position.Bottom:\n      offsetY = handle.height;\n      break;\n    default:\n      throw new Error(`Invalid handle position: ${handlePosition}`);\n  }\n\n  const x = node.internals.positionAbsolute.x + handle.x + offsetX;\n  const y = node.internals.positionAbsolute.y + handle.y + offsetY;\n\n  return [x, y] as const;\n};\n\nconst getEdgeParams = (\n  source: InternalNode<Node>,\n  target: InternalNode<Node>\n) => {\n  const sourcePos = Position.Right;\n  const [sx, sy] = getHandleCoordsByPosition(source, sourcePos);\n  const targetPos = Position.Left;\n  const [tx, ty] = getHandleCoordsByPosition(target, targetPos);\n\n  return {\n    sx,\n    sy,\n    tx,\n    ty,\n    sourcePos,\n    targetPos,\n  };\n};\n\nconst Animated = ({ id, source, target, markerEnd, style }: EdgeProps) => {\n  const sourceNode = useInternalNode(source);\n  const targetNode = useInternalNode(target);\n\n  if (!(sourceNode && targetNode)) {\n    return null;\n  }\n\n  const { sx, sy, tx, ty, sourcePos, targetPos } = getEdgeParams(\n    sourceNode,\n    targetNode\n  );\n\n  const [edgePath] = getBezierPath({\n    sourceX: sx,\n    sourceY: sy,\n    sourcePosition: sourcePos,\n    targetX: tx,\n    targetY: ty,\n    targetPosition: targetPos,\n  });\n\n  return (\n    <>\n      <BaseEdge id={id} markerEnd={markerEnd} path={edgePath} style={style} />\n      <circle fill=\"var(--primary)\" r=\"4\">\n        <animateMotion dur=\"2s\" path={edgePath} repeatCount=\"indefinite\" />\n      </circle>\n    </>\n  );\n};\n\nexport const Edge = {\n  Temporary,\n  Animated,\n};\n"
  },
  {
    "path": "components/ai-elements/image.tsx",
    "content": "import type { Experimental_GeneratedImage } from \"ai\";\nimport { cn } from \"@/lib/utils\";\n\nexport type ImageProps = Experimental_GeneratedImage & {\n  className?: string;\n  alt?: string;\n};\n\nexport const Image = ({\n  base64,\n  uint8Array,\n  mediaType,\n  ...props\n}: ImageProps) => (\n  // biome-ignore lint/performance/noImgElement: base64 data URLs require native img\n  <img\n    {...props}\n    alt={props.alt}\n    className={cn(\n      \"h-auto max-w-full overflow-hidden rounded-md\",\n      props.className\n    )}\n    src={`data:${mediaType};base64,${base64}`}\n  />\n);\n"
  },
  {
    "path": "components/ai-elements/inline-citation.tsx",
    "content": "\"use client\";\n\nimport { ArrowLeftIcon, ArrowRightIcon } from \"lucide-react\";\nimport {\n  type ComponentProps,\n  createContext,\n  useCallback,\n  useContext,\n  useEffect,\n  useState,\n} from \"react\";\nimport { Badge } from \"@/components/ui/badge\";\nimport {\n  Carousel,\n  type CarouselApi,\n  CarouselContent,\n  CarouselItem,\n} from \"@/components/ui/carousel\";\nimport {\n  HoverCard,\n  HoverCardContent,\n  HoverCardTrigger,\n} from \"@/components/ui/hover-card\";\nimport { cn } from \"@/lib/utils\";\n\nexport type InlineCitationProps = ComponentProps<\"span\">;\n\nexport const InlineCitation = ({\n  className,\n  ...props\n}: InlineCitationProps) => (\n  <span\n    className={cn(\"group inline items-center gap-1\", className)}\n    {...props}\n  />\n);\n\nexport type InlineCitationTextProps = ComponentProps<\"span\">;\n\nexport const InlineCitationText = ({\n  className,\n  ...props\n}: InlineCitationTextProps) => (\n  <span\n    className={cn(\"transition-colors group-hover:bg-accent\", className)}\n    {...props}\n  />\n);\n\nexport type InlineCitationCardProps = ComponentProps<typeof HoverCard>;\n\nexport const InlineCitationCard = (props: InlineCitationCardProps) => (\n  <HoverCard closeDelay={0} openDelay={0} {...props} />\n);\n\nexport type InlineCitationCardTriggerProps = ComponentProps<typeof Badge> & {\n  sources: string[];\n};\n\nexport const InlineCitationCardTrigger = ({\n  sources,\n  className,\n  ...props\n}: InlineCitationCardTriggerProps) => (\n  <HoverCardTrigger asChild>\n    <Badge\n      className={cn(\"ml-1 rounded-full\", className)}\n      variant=\"secondary\"\n      {...props}\n    >\n      {sources[0] ? (\n        <>\n          {new URL(sources[0]).hostname}{\" \"}\n          {sources.length > 1 && `+${sources.length - 1}`}\n        </>\n      ) : (\n        \"unknown\"\n      )}\n    </Badge>\n  </HoverCardTrigger>\n);\n\nexport type InlineCitationCardBodyProps = ComponentProps<\"div\">;\n\nexport const InlineCitationCardBody = ({\n  className,\n  ...props\n}: InlineCitationCardBodyProps) => (\n  <HoverCardContent className={cn(\"relative w-80 p-0\", className)} {...props} />\n);\n\nconst CarouselApiContext = createContext<CarouselApi | undefined>(undefined);\n\nconst useCarouselApi = () => {\n  const context = useContext(CarouselApiContext);\n  return context;\n};\n\nexport type InlineCitationCarouselProps = ComponentProps<typeof Carousel>;\n\nexport const InlineCitationCarousel = ({\n  className,\n  children,\n  ...props\n}: InlineCitationCarouselProps) => {\n  const [api, setApi] = useState<CarouselApi>();\n\n  return (\n    <CarouselApiContext.Provider value={api}>\n      <Carousel className={cn(\"w-full\", className)} setApi={setApi} {...props}>\n        {children}\n      </Carousel>\n    </CarouselApiContext.Provider>\n  );\n};\n\nexport type InlineCitationCarouselContentProps = ComponentProps<\"div\">;\n\nexport const InlineCitationCarouselContent = (\n  props: InlineCitationCarouselContentProps\n) => <CarouselContent {...props} />;\n\nexport type InlineCitationCarouselItemProps = ComponentProps<\"div\">;\n\nexport const InlineCitationCarouselItem = ({\n  className,\n  ...props\n}: InlineCitationCarouselItemProps) => (\n  <CarouselItem\n    className={cn(\"w-full space-y-2 p-4 pl-8\", className)}\n    {...props}\n  />\n);\n\nexport type InlineCitationCarouselHeaderProps = ComponentProps<\"div\">;\n\nexport const InlineCitationCarouselHeader = ({\n  className,\n  ...props\n}: InlineCitationCarouselHeaderProps) => (\n  <div\n    className={cn(\n      \"flex items-center justify-between gap-2 rounded-t-md bg-secondary p-2\",\n      className\n    )}\n    {...props}\n  />\n);\n\nexport type InlineCitationCarouselIndexProps = ComponentProps<\"div\">;\n\nexport const InlineCitationCarouselIndex = ({\n  children,\n  className,\n  ...props\n}: InlineCitationCarouselIndexProps) => {\n  const api = useCarouselApi();\n  const [current, setCurrent] = useState(0);\n  const [count, setCount] = useState(0);\n\n  useEffect(() => {\n    if (!api) {\n      return;\n    }\n\n    setCount(api.scrollSnapList().length);\n    setCurrent(api.selectedScrollSnap() + 1);\n\n    api.on(\"select\", () => {\n      setCurrent(api.selectedScrollSnap() + 1);\n    });\n  }, [api]);\n\n  return (\n    <div\n      className={cn(\n        \"flex flex-1 items-center justify-end px-3 py-1 text-muted-foreground text-xs\",\n        className\n      )}\n      {...props}\n    >\n      {children ?? `${current}/${count}`}\n    </div>\n  );\n};\n\nexport type InlineCitationCarouselPrevProps = ComponentProps<\"button\">;\n\nexport const InlineCitationCarouselPrev = ({\n  className,\n  ...props\n}: InlineCitationCarouselPrevProps) => {\n  const api = useCarouselApi();\n\n  const handleClick = useCallback(() => {\n    if (api) {\n      api.scrollPrev();\n    }\n  }, [api]);\n\n  return (\n    <button\n      aria-label=\"Previous\"\n      className={cn(\"shrink-0\", className)}\n      onClick={handleClick}\n      type=\"button\"\n      {...props}\n    >\n      <ArrowLeftIcon className=\"size-4 text-muted-foreground\" />\n    </button>\n  );\n};\n\nexport type InlineCitationCarouselNextProps = ComponentProps<\"button\">;\n\nexport const InlineCitationCarouselNext = ({\n  className,\n  ...props\n}: InlineCitationCarouselNextProps) => {\n  const api = useCarouselApi();\n\n  const handleClick = useCallback(() => {\n    if (api) {\n      api.scrollNext();\n    }\n  }, [api]);\n\n  return (\n    <button\n      aria-label=\"Next\"\n      className={cn(\"shrink-0\", className)}\n      onClick={handleClick}\n      type=\"button\"\n      {...props}\n    >\n      <ArrowRightIcon className=\"size-4 text-muted-foreground\" />\n    </button>\n  );\n};\n\nexport type InlineCitationSourceProps = ComponentProps<\"div\"> & {\n  title?: string;\n  url?: string;\n  description?: string;\n};\n\nexport const InlineCitationSource = ({\n  title,\n  url,\n  description,\n  className,\n  children,\n  ...props\n}: InlineCitationSourceProps) => (\n  <div className={cn(\"space-y-1\", className)} {...props}>\n    {title && (\n      <h4 className=\"truncate font-medium text-sm leading-tight\">{title}</h4>\n    )}\n    {url && (\n      <p className=\"truncate break-all text-muted-foreground text-xs\">{url}</p>\n    )}\n    {description && (\n      <p className=\"line-clamp-3 text-muted-foreground text-sm leading-relaxed\">\n        {description}\n      </p>\n    )}\n    {children}\n  </div>\n);\n\nexport type InlineCitationQuoteProps = ComponentProps<\"blockquote\">;\n\nexport const InlineCitationQuote = ({\n  children,\n  className,\n  ...props\n}: InlineCitationQuoteProps) => (\n  <blockquote\n    className={cn(\n      \"border-muted border-l-2 pl-3 text-muted-foreground text-sm italic\",\n      className\n    )}\n    {...props}\n  >\n    {children}\n  </blockquote>\n);\n"
  },
  {
    "path": "components/ai-elements/loader.tsx",
    "content": "import type { HTMLAttributes } from \"react\";\nimport { cn } from \"@/lib/utils\";\n\ntype LoaderIconProps = {\n  size?: number;\n};\n\nconst LoaderIcon = ({ size = 16 }: LoaderIconProps) => (\n  <svg\n    height={size}\n    strokeLinejoin=\"round\"\n    style={{ color: \"currentcolor\" }}\n    viewBox=\"0 0 16 16\"\n    width={size}\n  >\n    <title>Loader</title>\n    <g clipPath=\"url(#clip0_2393_1490)\">\n      <path d=\"M8 0V4\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n      <path\n        d=\"M8 16V12\"\n        opacity=\"0.5\"\n        stroke=\"currentColor\"\n        strokeWidth=\"1.5\"\n      />\n      <path\n        d=\"M3.29773 1.52783L5.64887 4.7639\"\n        opacity=\"0.9\"\n        stroke=\"currentColor\"\n        strokeWidth=\"1.5\"\n      />\n      <path\n        d=\"M12.7023 1.52783L10.3511 4.7639\"\n        opacity=\"0.1\"\n        stroke=\"currentColor\"\n        strokeWidth=\"1.5\"\n      />\n      <path\n        d=\"M12.7023 14.472L10.3511 11.236\"\n        opacity=\"0.4\"\n        stroke=\"currentColor\"\n        strokeWidth=\"1.5\"\n      />\n      <path\n        d=\"M3.29773 14.472L5.64887 11.236\"\n        opacity=\"0.6\"\n        stroke=\"currentColor\"\n        strokeWidth=\"1.5\"\n      />\n      <path\n        d=\"M15.6085 5.52783L11.8043 6.7639\"\n        opacity=\"0.2\"\n        stroke=\"currentColor\"\n        strokeWidth=\"1.5\"\n      />\n      <path\n        d=\"M0.391602 10.472L4.19583 9.23598\"\n        opacity=\"0.7\"\n        stroke=\"currentColor\"\n        strokeWidth=\"1.5\"\n      />\n      <path\n        d=\"M15.6085 10.4722L11.8043 9.2361\"\n        opacity=\"0.3\"\n        stroke=\"currentColor\"\n        strokeWidth=\"1.5\"\n      />\n      <path\n        d=\"M0.391602 5.52783L4.19583 6.7639\"\n        opacity=\"0.8\"\n        stroke=\"currentColor\"\n        strokeWidth=\"1.5\"\n      />\n    </g>\n    <defs>\n      <clipPath id=\"clip0_2393_1490\">\n        <rect fill=\"white\" height=\"16\" width=\"16\" />\n      </clipPath>\n    </defs>\n  </svg>\n);\n\nexport type LoaderProps = HTMLAttributes<HTMLDivElement> & {\n  size?: number;\n};\n\nexport const Loader = ({ className, size = 16, ...props }: LoaderProps) => (\n  <div\n    className={cn(\n      \"inline-flex animate-spin items-center justify-center\",\n      className\n    )}\n    {...props}\n  >\n    <LoaderIcon size={size} />\n  </div>\n);\n"
  },
  {
    "path": "components/ai-elements/message.tsx",
    "content": "\"use client\";\n\nimport type { FileUIPart, UIMessage } from \"ai\";\nimport {\n  ChevronLeftIcon,\n  ChevronRightIcon,\n  PaperclipIcon,\n  XIcon,\n} from \"lucide-react\";\nimport type { ComponentProps, HTMLAttributes, ReactElement } from \"react\";\nimport { createContext, memo, useContext, useEffect, useState } from \"react\";\nimport { Streamdown } from \"streamdown\";\nimport { Button } from \"@/components/ui/button\";\nimport { ButtonGroup, ButtonGroupText } from \"@/components/ui/button-group\";\nimport {\n  Tooltip,\n  TooltipContent,\n  TooltipProvider,\n  TooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { cn } from \"@/lib/utils\";\n\nexport type MessageProps = HTMLAttributes<HTMLDivElement> & {\n  from: UIMessage[\"role\"];\n};\n\nexport const Message = ({ className, from, ...props }: MessageProps) => (\n  <div\n    className={cn(\n      \"group flex w-full max-w-[95%] flex-col gap-2\",\n      from === \"user\" ? \"is-user ml-auto justify-end\" : \"is-assistant\",\n      className\n    )}\n    {...props}\n  />\n);\n\nexport type MessageContentProps = HTMLAttributes<HTMLDivElement>;\n\nexport const MessageContent = ({\n  children,\n  className,\n  ...props\n}: MessageContentProps) => (\n  <div\n    className={cn(\n      \"is-user:dark flex w-fit min-w-0 max-w-full flex-col gap-2 overflow-hidden text-sm\",\n      \"group-[.is-user]:ml-auto group-[.is-user]:rounded-lg group-[.is-user]:bg-secondary group-[.is-user]:px-4 group-[.is-user]:py-3 group-[.is-user]:text-foreground\",\n      \"group-[.is-assistant]:text-foreground\",\n      className\n    )}\n    {...props}\n  >\n    {children}\n  </div>\n);\n\nexport type MessageActionsProps = ComponentProps<\"div\">;\n\nexport const MessageActions = ({\n  className,\n  children,\n  ...props\n}: MessageActionsProps) => (\n  <div className={cn(\"flex items-center gap-1\", className)} {...props}>\n    {children}\n  </div>\n);\n\nexport type MessageActionProps = ComponentProps<typeof Button> & {\n  tooltip?: string;\n  label?: string;\n};\n\nexport const MessageAction = ({\n  tooltip,\n  children,\n  label,\n  variant = \"ghost\",\n  size = \"icon-sm\",\n  ...props\n}: MessageActionProps) => {\n  const button = (\n    <Button size={size} type=\"button\" variant={variant} {...props}>\n      {children}\n      <span className=\"sr-only\">{label || tooltip}</span>\n    </Button>\n  );\n\n  if (tooltip) {\n    return (\n      <TooltipProvider>\n        <Tooltip>\n          <TooltipTrigger asChild>{button}</TooltipTrigger>\n          <TooltipContent>\n            <p>{tooltip}</p>\n          </TooltipContent>\n        </Tooltip>\n      </TooltipProvider>\n    );\n  }\n\n  return button;\n};\n\ntype MessageBranchContextType = {\n  currentBranch: number;\n  totalBranches: number;\n  goToPrevious: () => void;\n  goToNext: () => void;\n  branches: ReactElement[];\n  setBranches: (branches: ReactElement[]) => void;\n};\n\nconst MessageBranchContext = createContext<MessageBranchContextType | null>(\n  null\n);\n\nconst useMessageBranch = () => {\n  const context = useContext(MessageBranchContext);\n\n  if (!context) {\n    throw new Error(\n      \"MessageBranch components must be used within MessageBranch\"\n    );\n  }\n\n  return context;\n};\n\nexport type MessageBranchProps = HTMLAttributes<HTMLDivElement> & {\n  defaultBranch?: number;\n  onBranchChange?: (branchIndex: number) => void;\n};\n\nexport const MessageBranch = ({\n  defaultBranch = 0,\n  onBranchChange,\n  className,\n  ...props\n}: MessageBranchProps) => {\n  const [currentBranch, setCurrentBranch] = useState(defaultBranch);\n  const [branches, setBranches] = useState<ReactElement[]>([]);\n\n  const handleBranchChange = (newBranch: number) => {\n    setCurrentBranch(newBranch);\n    onBranchChange?.(newBranch);\n  };\n\n  const goToPrevious = () => {\n    const newBranch =\n      currentBranch > 0 ? currentBranch - 1 : branches.length - 1;\n    handleBranchChange(newBranch);\n  };\n\n  const goToNext = () => {\n    const newBranch =\n      currentBranch < branches.length - 1 ? currentBranch + 1 : 0;\n    handleBranchChange(newBranch);\n  };\n\n  const contextValue: MessageBranchContextType = {\n    currentBranch,\n    totalBranches: branches.length,\n    goToPrevious,\n    goToNext,\n    branches,\n    setBranches,\n  };\n\n  return (\n    <MessageBranchContext.Provider value={contextValue}>\n      <div\n        className={cn(\"grid w-full gap-2 [&>div]:pb-0\", className)}\n        {...props}\n      />\n    </MessageBranchContext.Provider>\n  );\n};\n\nexport type MessageBranchContentProps = HTMLAttributes<HTMLDivElement>;\n\nexport const MessageBranchContent = ({\n  children,\n  ...props\n}: MessageBranchContentProps) => {\n  const { currentBranch, setBranches, branches } = useMessageBranch();\n  const childrenArray = Array.isArray(children) ? children : [children];\n\n  // Use useEffect to update branches when they change\n  useEffect(() => {\n    if (branches.length !== childrenArray.length) {\n      setBranches(childrenArray);\n    }\n  }, [childrenArray, branches, setBranches]);\n\n  return childrenArray.map((branch, index) => (\n    <div\n      className={cn(\n        \"grid gap-2 overflow-hidden [&>div]:pb-0\",\n        index === currentBranch ? \"block\" : \"hidden\"\n      )}\n      key={branch.key}\n      {...props}\n    >\n      {branch}\n    </div>\n  ));\n};\n\nexport type MessageBranchSelectorProps = HTMLAttributes<HTMLDivElement> & {\n  from: UIMessage[\"role\"];\n};\n\nexport const MessageBranchSelector = ({\n  className,\n  from,\n  ...props\n}: MessageBranchSelectorProps) => {\n  const { totalBranches } = useMessageBranch();\n\n  // Don't render if there's only one branch\n  if (totalBranches <= 1) {\n    return null;\n  }\n\n  return (\n    <ButtonGroup\n      className=\"[&>*:not(:first-child)]:rounded-l-md [&>*:not(:last-child)]:rounded-r-md\"\n      orientation=\"horizontal\"\n      {...props}\n    />\n  );\n};\n\nexport type MessageBranchPreviousProps = ComponentProps<typeof Button>;\n\nexport const MessageBranchPrevious = ({\n  children,\n  ...props\n}: MessageBranchPreviousProps) => {\n  const { goToPrevious, totalBranches } = useMessageBranch();\n\n  return (\n    <Button\n      aria-label=\"Previous branch\"\n      disabled={totalBranches <= 1}\n      onClick={goToPrevious}\n      size=\"icon-sm\"\n      type=\"button\"\n      variant=\"ghost\"\n      {...props}\n    >\n      {children ?? <ChevronLeftIcon size={14} />}\n    </Button>\n  );\n};\n\nexport type MessageBranchNextProps = ComponentProps<typeof Button>;\n\nexport const MessageBranchNext = ({\n  children,\n  className,\n  ...props\n}: MessageBranchNextProps) => {\n  const { goToNext, totalBranches } = useMessageBranch();\n\n  return (\n    <Button\n      aria-label=\"Next branch\"\n      disabled={totalBranches <= 1}\n      onClick={goToNext}\n      size=\"icon-sm\"\n      type=\"button\"\n      variant=\"ghost\"\n      {...props}\n    >\n      {children ?? <ChevronRightIcon size={14} />}\n    </Button>\n  );\n};\n\nexport type MessageBranchPageProps = HTMLAttributes<HTMLSpanElement>;\n\nexport const MessageBranchPage = ({\n  className,\n  ...props\n}: MessageBranchPageProps) => {\n  const { currentBranch, totalBranches } = useMessageBranch();\n\n  return (\n    <ButtonGroupText\n      className={cn(\n        \"border-none bg-transparent text-muted-foreground shadow-none\",\n        className\n      )}\n      {...props}\n    >\n      {currentBranch + 1} of {totalBranches}\n    </ButtonGroupText>\n  );\n};\n\nexport type MessageResponseProps = ComponentProps<typeof Streamdown>;\n\nexport const MessageResponse = memo(\n  ({ className, ...props }: MessageResponseProps) => (\n    <Streamdown\n      className={cn(\n        \"size-full [&>*:first-child]:mt-0 [&>*:last-child]:mb-0\",\n        className\n      )}\n      {...props}\n    />\n  ),\n  (prevProps, nextProps) => prevProps.children === nextProps.children\n);\n\nMessageResponse.displayName = \"MessageResponse\";\n\nexport type MessageAttachmentProps = HTMLAttributes<HTMLDivElement> & {\n  data: FileUIPart;\n  className?: string;\n  onRemove?: () => void;\n};\n\nexport function MessageAttachment({\n  data,\n  className,\n  onRemove,\n  ...props\n}: MessageAttachmentProps) {\n  const filename = data.filename || \"\";\n  const mediaType =\n    data.mediaType?.startsWith(\"image/\") && data.url ? \"image\" : \"file\";\n  const isImage = mediaType === \"image\";\n  const attachmentLabel = filename || (isImage ? \"Image\" : \"Attachment\");\n\n  return (\n    <div\n      className={cn(\n        \"group relative size-24 overflow-hidden rounded-lg\",\n        className\n      )}\n      {...props}\n    >\n      {isImage ? (\n        <>\n          {/* biome-ignore lint/performance/noImgElement: dynamic user-uploaded images */}\n          <img\n            alt={filename || \"attachment\"}\n            className=\"size-full object-cover\"\n            height={100}\n            src={data.url}\n            width={100}\n          />\n          {onRemove && (\n            <Button\n              aria-label=\"Remove attachment\"\n              className=\"absolute top-2 right-2 size-6 rounded-full bg-background/80 p-0 opacity-0 backdrop-blur-sm transition-opacity hover:bg-background group-hover:opacity-100 [&>svg]:size-3\"\n              onClick={(e) => {\n                e.stopPropagation();\n                onRemove();\n              }}\n              type=\"button\"\n              variant=\"ghost\"\n            >\n              <XIcon />\n              <span className=\"sr-only\">Remove</span>\n            </Button>\n          )}\n        </>\n      ) : (\n        <>\n          <Tooltip>\n            <TooltipTrigger asChild>\n              <div className=\"flex size-full shrink-0 items-center justify-center rounded-lg bg-muted text-muted-foreground\">\n                <PaperclipIcon className=\"size-4\" />\n              </div>\n            </TooltipTrigger>\n            <TooltipContent>\n              <p>{attachmentLabel}</p>\n            </TooltipContent>\n          </Tooltip>\n          {onRemove && (\n            <Button\n              aria-label=\"Remove attachment\"\n              className=\"size-6 shrink-0 rounded-full p-0 opacity-0 transition-opacity hover:bg-accent group-hover:opacity-100 [&>svg]:size-3\"\n              onClick={(e) => {\n                e.stopPropagation();\n                onRemove();\n              }}\n              type=\"button\"\n              variant=\"ghost\"\n            >\n              <XIcon />\n              <span className=\"sr-only\">Remove</span>\n            </Button>\n          )}\n        </>\n      )}\n    </div>\n  );\n}\n\nexport type MessageAttachmentsProps = ComponentProps<\"div\">;\n\nexport function MessageAttachments({\n  children,\n  className,\n  ...props\n}: MessageAttachmentsProps) {\n  if (!children) {\n    return null;\n  }\n\n  return (\n    <div\n      className={cn(\n        \"ml-auto flex w-fit flex-wrap items-start gap-2\",\n        className\n      )}\n      {...props}\n    >\n      {children}\n    </div>\n  );\n}\n\nexport type MessageToolbarProps = ComponentProps<\"div\">;\n\nexport const MessageToolbar = ({\n  className,\n  children,\n  ...props\n}: MessageToolbarProps) => (\n  <div\n    className={cn(\n      \"mt-4 flex w-full items-center justify-between gap-4\",\n      className\n    )}\n    {...props}\n  >\n    {children}\n  </div>\n);\n"
  },
  {
    "path": "components/ai-elements/model-selector.tsx",
    "content": "import Image from \"next/image\";\nimport type { ComponentProps, ReactNode } from \"react\";\nimport {\n  Command,\n  CommandDialog,\n  CommandEmpty,\n  CommandGroup,\n  CommandInput,\n  CommandItem,\n  CommandList,\n  CommandSeparator,\n  CommandShortcut,\n} from \"@/components/ui/command\";\nimport {\n  Dialog,\n  DialogContent,\n  DialogTitle,\n  DialogTrigger,\n} from \"@/components/ui/dialog\";\nimport { cn } from \"@/lib/utils\";\n\nexport type ModelSelectorProps = ComponentProps<typeof Dialog>;\n\nexport const ModelSelector = (props: ModelSelectorProps) => (\n  <Dialog {...props} />\n);\n\nexport type ModelSelectorTriggerProps = ComponentProps<typeof DialogTrigger>;\n\nexport const ModelSelectorTrigger = (props: ModelSelectorTriggerProps) => (\n  <DialogTrigger {...props} />\n);\n\nexport type ModelSelectorContentProps = ComponentProps<typeof DialogContent> & {\n  title?: ReactNode;\n};\n\nexport const ModelSelectorContent = ({\n  className,\n  children,\n  title = \"Model Selector\",\n  ...props\n}: ModelSelectorContentProps) => (\n  <DialogContent className={cn(\"p-0\", className)} {...props}>\n    <DialogTitle className=\"sr-only\">{title}</DialogTitle>\n    <Command className=\"**:data-[slot=command-input-wrapper]:h-auto\">\n      {children}\n    </Command>\n  </DialogContent>\n);\n\nexport type ModelSelectorDialogProps = ComponentProps<typeof CommandDialog>;\n\nexport const ModelSelectorDialog = (props: ModelSelectorDialogProps) => (\n  <CommandDialog {...props} />\n);\n\nexport type ModelSelectorInputProps = ComponentProps<typeof CommandInput>;\n\nexport const ModelSelectorInput = ({\n  className,\n  ...props\n}: ModelSelectorInputProps) => (\n  <CommandInput className={cn(\"h-auto py-3.5\", className)} {...props} />\n);\n\nexport type ModelSelectorListProps = ComponentProps<typeof CommandList>;\n\nexport const ModelSelectorList = (props: ModelSelectorListProps) => (\n  <CommandList {...props} />\n);\n\nexport type ModelSelectorEmptyProps = ComponentProps<typeof CommandEmpty>;\n\nexport const ModelSelectorEmpty = (props: ModelSelectorEmptyProps) => (\n  <CommandEmpty {...props} />\n);\n\nexport type ModelSelectorGroupProps = ComponentProps<typeof CommandGroup>;\n\nexport const ModelSelectorGroup = (props: ModelSelectorGroupProps) => (\n  <CommandGroup {...props} />\n);\n\nexport type ModelSelectorItemProps = ComponentProps<typeof CommandItem>;\n\nexport const ModelSelectorItem = (props: ModelSelectorItemProps) => (\n  <CommandItem {...props} />\n);\n\nexport type ModelSelectorShortcutProps = ComponentProps<typeof CommandShortcut>;\n\nexport const ModelSelectorShortcut = (props: ModelSelectorShortcutProps) => (\n  <CommandShortcut {...props} />\n);\n\nexport type ModelSelectorSeparatorProps = ComponentProps<\n  typeof CommandSeparator\n>;\n\nexport const ModelSelectorSeparator = (props: ModelSelectorSeparatorProps) => (\n  <CommandSeparator {...props} />\n);\n\nexport type ModelSelectorLogoProps = {\n  className?: string;\n  provider:\n    | \"moonshotai-cn\"\n    | \"lucidquery\"\n    | \"moonshotai\"\n    | \"zai-coding-plan\"\n    | \"alibaba\"\n    | \"xai\"\n    | \"vultr\"\n    | \"nvidia\"\n    | \"upstage\"\n    | \"groq\"\n    | \"github-copilot\"\n    | \"mistral\"\n    | \"vercel\"\n    | \"nebius\"\n    | \"deepseek\"\n    | \"alibaba-cn\"\n    | \"google-vertex-anthropic\"\n    | \"venice\"\n    | \"chutes\"\n    | \"cortecs\"\n    | \"github-models\"\n    | \"togetherai\"\n    | \"azure\"\n    | \"baseten\"\n    | \"huggingface\"\n    | \"opencode\"\n    | \"fastrouter\"\n    | \"google\"\n    | \"google-vertex\"\n    | \"cloudflare-workers-ai\"\n    | \"inception\"\n    | \"wandb\"\n    | \"openai\"\n    | \"zhipuai-coding-plan\"\n    | \"perplexity\"\n    | \"openrouter\"\n    | \"zenmux\"\n    | \"v0\"\n    | \"iflowcn\"\n    | \"synthetic\"\n    | \"deepinfra\"\n    | \"zhipuai\"\n    | \"submodel\"\n    | \"zai\"\n    | \"inference\"\n    | \"requesty\"\n    | \"morph\"\n    | \"lmstudio\"\n    | \"anthropic\"\n    | \"aihubmix\"\n    | \"fireworks-ai\"\n    | \"modelscope\"\n    | \"llama\"\n    | \"scaleway\"\n    | \"amazon-bedrock\"\n    | \"cerebras\"\n    | (string & {});\n};\n\nexport const ModelSelectorLogo = ({\n  provider,\n  className,\n}: ModelSelectorLogoProps) => (\n  <Image\n    alt={`${provider} logo`}\n    className={cn(\"size-3 dark:invert\", className)}\n    height={12}\n    src={`https://models.dev/logos/${provider}.svg`}\n    unoptimized\n    width={12}\n  />\n);\n\nexport type ModelSelectorLogoGroupProps = ComponentProps<\"div\">;\n\nexport const ModelSelectorLogoGroup = ({\n  className,\n  ...props\n}: ModelSelectorLogoGroupProps) => (\n  <div\n    className={cn(\n      \"flex shrink-0 items-center -space-x-1 [&>img]:rounded-full [&>img]:bg-background [&>img]:p-px [&>img]:ring-1 dark:[&>img]:bg-foreground\",\n      className\n    )}\n    {...props}\n  />\n);\n\nexport type ModelSelectorNameProps = ComponentProps<\"span\">;\n\nexport const ModelSelectorName = ({\n  className,\n  ...props\n}: ModelSelectorNameProps) => (\n  <span className={cn(\"flex-1 truncate text-left\", className)} {...props} />\n);\n"
  },
  {
    "path": "components/ai-elements/node.tsx",
    "content": "import { Handle, Position } from \"@xyflow/react\";\nimport type { ComponentProps } from \"react\";\nimport {\n  Card,\n  CardAction,\n  CardContent,\n  CardDescription,\n  CardFooter,\n  CardHeader,\n  CardTitle,\n} from \"@/components/ui/card\";\nimport { cn } from \"@/lib/utils\";\n\nexport type NodeProps = ComponentProps<typeof Card> & {\n  handles: {\n    target: boolean;\n    source: boolean;\n  };\n};\n\nexport const Node = ({ handles, className, ...props }: NodeProps) => (\n  <Card\n    className={cn(\n      \"node-container relative size-full h-auto w-sm gap-0 rounded-md p-0\",\n      className\n    )}\n    {...props}\n  >\n    {handles.target && <Handle position={Position.Left} type=\"target\" />}\n    {handles.source && <Handle position={Position.Right} type=\"source\" />}\n    {props.children}\n  </Card>\n);\n\nexport type NodeHeaderProps = ComponentProps<typeof CardHeader>;\n\nexport const NodeHeader = ({ className, ...props }: NodeHeaderProps) => (\n  <CardHeader\n    className={cn(\"gap-0.5 rounded-t-md border-b bg-secondary p-3!\", className)}\n    {...props}\n  />\n);\n\nexport type NodeTitleProps = ComponentProps<typeof CardTitle>;\n\nexport const NodeTitle = (props: NodeTitleProps) => <CardTitle {...props} />;\n\nexport type NodeDescriptionProps = ComponentProps<typeof CardDescription>;\n\nexport const NodeDescription = (props: NodeDescriptionProps) => (\n  <CardDescription {...props} />\n);\n\nexport type NodeActionProps = ComponentProps<typeof CardAction>;\n\nexport const NodeAction = (props: NodeActionProps) => <CardAction {...props} />;\n\nexport type NodeContentProps = ComponentProps<typeof CardContent>;\n\nexport const NodeContent = ({ className, ...props }: NodeContentProps) => (\n  <CardContent className={cn(\"p-3\", className)} {...props} />\n);\n\nexport type NodeFooterProps = ComponentProps<typeof CardFooter>;\n\nexport const NodeFooter = ({ className, ...props }: NodeFooterProps) => (\n  <CardFooter\n    className={cn(\"rounded-b-md border-t bg-secondary p-3!\", className)}\n    {...props}\n  />\n);\n"
  },
  {
    "path": "components/ai-elements/open-in-chat.tsx",
    "content": "\"use client\";\n\nimport {\n  ChevronDownIcon,\n  ExternalLinkIcon,\n  MessageCircleIcon,\n} from \"lucide-react\";\nimport { type ComponentProps, createContext, useContext } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n  DropdownMenu,\n  DropdownMenuContent,\n  DropdownMenuItem,\n  DropdownMenuLabel,\n  DropdownMenuSeparator,\n  DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { cn } from \"@/lib/utils\";\n\nconst providers = {\n  github: {\n    title: \"Open in GitHub\",\n    createUrl: (url: string) => url,\n    icon: (\n      <svg fill=\"currentColor\" role=\"img\" viewBox=\"0 0 24 24\">\n        <title>GitHub</title>\n        <path d=\"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\" />\n      </svg>\n    ),\n  },\n  scira: {\n    title: \"Open in Scira\",\n    createUrl: (q: string) =>\n      `https://scira.ai/?${new URLSearchParams({\n        q,\n      })}`,\n    icon: (\n      <svg\n        fill=\"none\"\n        height=\"934\"\n        viewBox=\"0 0 910 934\"\n        width=\"910\"\n        xmlns=\"http://www.w3.org/2000/svg\"\n      >\n        <title>Scira AI</title>\n        <path\n          d=\"M647.664 197.775C569.13 189.049 525.5 145.419 516.774 66.8849C508.048 145.419 464.418 189.049 385.884 197.775C464.418 206.501 508.048 250.131 516.774 328.665C525.5 250.131 569.13 206.501 647.664 197.775Z\"\n          fill=\"currentColor\"\n          stroke=\"currentColor\"\n          strokeLinejoin=\"round\"\n          strokeWidth=\"8\"\n        />\n        <path\n          d=\"M516.774 304.217C510.299 275.491 498.208 252.087 480.335 234.214C462.462 216.341 439.058 204.251 410.333 197.775C439.059 191.3 462.462 179.209 480.335 161.336C498.208 143.463 510.299 120.06 516.774 91.334C523.25 120.059 535.34 143.463 553.213 161.336C571.086 179.209 594.49 191.3 623.216 197.775C594.49 204.251 571.086 216.341 553.213 234.214C535.34 252.087 523.25 275.491 516.774 304.217Z\"\n          fill=\"currentColor\"\n          stroke=\"currentColor\"\n          strokeLinejoin=\"round\"\n          strokeWidth=\"8\"\n        />\n        <path\n          d=\"M857.5 508.116C763.259 497.644 710.903 445.288 700.432 351.047C689.961 445.288 637.605 497.644 543.364 508.116C637.605 518.587 689.961 570.943 700.432 665.184C710.903 570.943 763.259 518.587 857.5 508.116Z\"\n          stroke=\"currentColor\"\n          strokeLinejoin=\"round\"\n          strokeWidth=\"20\"\n        />\n        <path\n          d=\"M700.432 615.957C691.848 589.05 678.575 566.357 660.383 548.165C642.191 529.973 619.499 516.7 592.593 508.116C619.499 499.533 642.191 486.258 660.383 468.066C678.575 449.874 691.848 427.181 700.432 400.274C709.015 427.181 722.289 449.874 740.481 468.066C758.673 486.258 781.365 499.533 808.271 508.116C781.365 516.7 758.673 529.973 740.481 548.165C722.289 566.357 709.015 589.05 700.432 615.957Z\"\n          stroke=\"currentColor\"\n          strokeLinejoin=\"round\"\n          strokeWidth=\"20\"\n        />\n        <path\n          d=\"M889.949 121.237C831.049 114.692 798.326 81.9698 791.782 23.0692C785.237 81.9698 752.515 114.692 693.614 121.237C752.515 127.781 785.237 160.504 791.782 219.404C798.326 160.504 831.049 127.781 889.949 121.237Z\"\n          fill=\"currentColor\"\n          stroke=\"currentColor\"\n          strokeLinejoin=\"round\"\n          strokeWidth=\"8\"\n        />\n        <path\n          d=\"M791.782 196.795C786.697 176.937 777.869 160.567 765.16 147.858C752.452 135.15 736.082 126.322 716.226 121.237C736.082 116.152 752.452 107.324 765.16 94.6152C777.869 81.9065 786.697 65.5368 791.782 45.6797C796.867 65.5367 805.695 81.9066 818.403 94.6152C831.112 107.324 847.481 116.152 867.338 121.237C847.481 126.322 831.112 135.15 818.403 147.858C805.694 160.567 796.867 176.937 791.782 196.795Z\"\n          fill=\"currentColor\"\n          stroke=\"currentColor\"\n          strokeLinejoin=\"round\"\n          strokeWidth=\"8\"\n        />\n        <path\n          d=\"M760.632 764.337C720.719 814.616 669.835 855.1 611.872 882.692C553.91 910.285 490.404 924.255 426.213 923.533C362.022 922.812 298.846 907.419 241.518 878.531C184.19 849.643 134.228 808.026 95.4548 756.863C56.6815 705.7 30.1238 646.346 17.8129 583.343C5.50207 520.339 7.76433 455.354 24.4266 393.359C41.089 331.364 71.7099 274.001 113.947 225.658C156.184 177.315 208.919 139.273 268.117 114.442\"\n          stroke=\"currentColor\"\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n          strokeWidth=\"30\"\n        />\n      </svg>\n    ),\n  },\n  chatgpt: {\n    title: \"Open in ChatGPT\",\n    createUrl: (prompt: string) =>\n      `https://chatgpt.com/?${new URLSearchParams({\n        hints: \"search\",\n        prompt,\n      })}`,\n    icon: (\n      <svg\n        fill=\"currentColor\"\n        role=\"img\"\n        viewBox=\"0 0 24 24\"\n        xmlns=\"http://www.w3.org/2000/svg\"\n      >\n        <title>OpenAI</title>\n        <path d=\"M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z\" />\n      </svg>\n    ),\n  },\n  claude: {\n    title: \"Open in Claude\",\n    createUrl: (q: string) =>\n      `https://claude.ai/new?${new URLSearchParams({\n        q,\n      })}`,\n    icon: (\n      <svg\n        fill=\"currentColor\"\n        role=\"img\"\n        viewBox=\"0 0 12 12\"\n        xmlns=\"http://www.w3.org/2000/svg\"\n      >\n        <title>Claude</title>\n        <path\n          clipRule=\"evenodd\"\n          d=\"M2.3545 7.9775L4.7145 6.654L4.7545 6.539L4.7145 6.475H4.6L4.205 6.451L2.856 6.4145L1.6865 6.366L0.5535 6.305L0.268 6.2445L0 5.892L0.0275 5.716L0.2675 5.5555L0.6105 5.5855L1.3705 5.637L2.5095 5.716L3.3355 5.7645L4.56 5.892H4.7545L4.782 5.8135L4.715 5.7645L4.6635 5.716L3.4845 4.918L2.2085 4.074L1.5405 3.588L1.1785 3.3425L0.9965 3.1115L0.9175 2.6075L1.2455 2.2465L1.686 2.2765L1.7985 2.307L2.245 2.65L3.199 3.388L4.4445 4.3045L4.627 4.4565L4.6995 4.405L4.709 4.3685L4.627 4.2315L3.9495 3.0085L3.2265 1.7635L2.9045 1.2475L2.8195 0.938C2.78711 0.819128 2.76965 0.696687 2.7675 0.5735L3.1415 0.067L3.348 0L3.846 0.067L4.056 0.249L4.366 0.956L4.867 2.0705L5.6445 3.5855L5.8725 4.0345L5.994 4.4505L6.0395 4.578H6.1185V4.505L6.1825 3.652L6.301 2.6045L6.416 1.257L6.456 0.877L6.644 0.422L7.0175 0.176L7.3095 0.316L7.5495 0.6585L7.516 0.8805L7.373 1.806L7.0935 3.2575L6.9115 4.2285H7.0175L7.139 4.1075L7.6315 3.4545L8.4575 2.4225L8.8225 2.0125L9.2475 1.5605L9.521 1.345H10.0375L10.4175 1.9095L10.2475 2.4925L9.7155 3.166L9.275 3.737L8.643 4.587L8.248 5.267L8.2845 5.322L8.3785 5.312L9.8065 5.009L10.578 4.869L11.4985 4.7115L11.915 4.9055L11.9605 5.103L11.7965 5.5065L10.812 5.7495L9.6575 5.9805L7.938 6.387L7.917 6.402L7.9415 6.4325L8.716 6.5055L9.047 6.5235H9.858L11.368 6.636L11.763 6.897L12 7.216L11.9605 7.4585L11.353 7.7685L10.533 7.574L8.6185 7.119L7.9625 6.9545H7.8715V7.0095L8.418 7.5435L9.421 8.4485L10.6755 9.6135L10.739 9.9025L10.578 10.13L10.408 10.1055L9.3055 9.277L8.88 8.9035L7.917 8.0935H7.853V8.1785L8.075 8.503L9.2475 10.2635L9.3085 10.8035L9.2235 10.98L8.9195 11.0865L8.5855 11.0255L7.8985 10.063L7.191 8.9795L6.6195 8.008L6.5495 8.048L6.2125 11.675L6.0545 11.86L5.69 12L5.3865 11.7695L5.2255 11.396L5.3865 10.658L5.581 9.696L5.7385 8.931L5.8815 7.981L5.9665 7.665L5.9605 7.644L5.8905 7.653L5.1735 8.6365L4.0835 10.109L3.2205 11.0315L3.0135 11.1135L2.655 10.9285L2.6885 10.5975L2.889 10.303L4.083 8.785L4.803 7.844L5.268 7.301L5.265 7.222H5.2375L2.066 9.28L1.501 9.353L1.2575 9.125L1.288 8.752L1.4035 8.6305L2.3575 7.9745L2.3545 7.9775Z\"\n          fillRule=\"evenodd\"\n        />\n      </svg>\n    ),\n  },\n  t3: {\n    title: \"Open in T3 Chat\",\n    createUrl: (q: string) =>\n      `https://t3.chat/new?${new URLSearchParams({\n        q,\n      })}`,\n    icon: <MessageCircleIcon />,\n  },\n  v0: {\n    title: \"Open in v0\",\n    createUrl: (q: string) =>\n      `https://v0.app?${new URLSearchParams({\n        q,\n      })}`,\n    icon: (\n      <svg\n        fill=\"currentColor\"\n        viewBox=\"0 0 147 70\"\n        xmlns=\"http://www.w3.org/2000/svg\"\n      >\n        <title>v0</title>\n        <path d=\"M56 50.2031V14H70V60.1562C70 65.5928 65.5928 70 60.1562 70C57.5605 70 54.9982 68.9992 53.1562 67.1573L0 14H19.7969L56 50.2031Z\" />\n        <path d=\"M147 56H133V23.9531L100.953 56H133V70H96.6875C85.8144 70 77 61.1856 77 50.3125V14H91V46.1562L123.156 14H91V0H127.312C138.186 0 147 8.81439 147 19.6875V56Z\" />\n      </svg>\n    ),\n  },\n  cursor: {\n    title: \"Open in Cursor\",\n    createUrl: (text: string) => {\n      const url = new URL(\"https://cursor.com/link/prompt\");\n      url.searchParams.set(\"text\", text);\n      return url.toString();\n    },\n    icon: (\n      <svg\n        version=\"1.1\"\n        viewBox=\"0 0 466.73 532.09\"\n        xmlns=\"http://www.w3.org/2000/svg\"\n      >\n        <title>Cursor</title>\n        <path\n          d=\"M457.43,125.94L244.42,2.96c-6.84-3.95-15.28-3.95-22.12,0L9.3,125.94c-5.75,3.32-9.3,9.46-9.3,16.11v247.99c0,6.65,3.55,12.79,9.3,16.11l213.01,122.98c6.84,3.95,15.28,3.95,22.12,0l213.01-122.98c5.75-3.32,9.3-9.46,9.3-16.11v-247.99c0-6.65-3.55-12.79-9.3-16.11h-.01ZM444.05,151.99l-205.63,356.16c-1.39,2.4-5.06,1.42-5.06-1.36v-233.21c0-4.66-2.49-8.97-6.53-11.31L24.87,145.67c-2.4-1.39-1.42-5.06,1.36-5.06h411.26c5.84,0,9.49,6.33,6.57,11.39h-.01Z\"\n          fill=\"currentColor\"\n        />\n      </svg>\n    ),\n  },\n};\n\nconst OpenInContext = createContext<{ query: string } | undefined>(undefined);\n\nconst useOpenInContext = () => {\n  const context = useContext(OpenInContext);\n  if (!context) {\n    throw new Error(\"OpenIn components must be used within an OpenIn provider\");\n  }\n  return context;\n};\n\nexport type OpenInProps = ComponentProps<typeof DropdownMenu> & {\n  query: string;\n};\n\nexport const OpenIn = ({ query, ...props }: OpenInProps) => (\n  <OpenInContext.Provider value={{ query }}>\n    <DropdownMenu {...props} />\n  </OpenInContext.Provider>\n);\n\nexport type OpenInContentProps = ComponentProps<typeof DropdownMenuContent>;\n\nexport const OpenInContent = ({ className, ...props }: OpenInContentProps) => (\n  <DropdownMenuContent\n    align=\"start\"\n    className={cn(\"w-[240px]\", className)}\n    {...props}\n  />\n);\n\nexport type OpenInItemProps = ComponentProps<typeof DropdownMenuItem>;\n\nexport const OpenInItem = (props: OpenInItemProps) => (\n  <DropdownMenuItem {...props} />\n);\n\nexport type OpenInLabelProps = ComponentProps<typeof DropdownMenuLabel>;\n\nexport const OpenInLabel = (props: OpenInLabelProps) => (\n  <DropdownMenuLabel {...props} />\n);\n\nexport type OpenInSeparatorProps = ComponentProps<typeof DropdownMenuSeparator>;\n\nexport const OpenInSeparator = (props: OpenInSeparatorProps) => (\n  <DropdownMenuSeparator {...props} />\n);\n\nexport type OpenInTriggerProps = ComponentProps<typeof DropdownMenuTrigger>;\n\nexport const OpenInTrigger = ({ children, ...props }: OpenInTriggerProps) => (\n  <DropdownMenuTrigger {...props} asChild>\n    {children ?? (\n      <Button type=\"button\" variant=\"outline\">\n        Open in chat\n        <ChevronDownIcon className=\"size-4\" />\n      </Button>\n    )}\n  </DropdownMenuTrigger>\n);\n\nexport type OpenInChatGPTProps = ComponentProps<typeof DropdownMenuItem>;\n\nexport const OpenInChatGPT = (props: OpenInChatGPTProps) => {\n  const { query } = useOpenInContext();\n  return (\n    <DropdownMenuItem asChild {...props}>\n      <a\n        className=\"flex items-center gap-2\"\n        href={providers.chatgpt.createUrl(query)}\n        rel=\"noopener\"\n        target=\"_blank\"\n      >\n        <span className=\"shrink-0\">{providers.chatgpt.icon}</span>\n        <span className=\"flex-1\">{providers.chatgpt.title}</span>\n        <ExternalLinkIcon className=\"size-4 shrink-0\" />\n      </a>\n    </DropdownMenuItem>\n  );\n};\n\nexport type OpenInClaudeProps = ComponentProps<typeof DropdownMenuItem>;\n\nexport const OpenInClaude = (props: OpenInClaudeProps) => {\n  const { query } = useOpenInContext();\n  return (\n    <DropdownMenuItem asChild {...props}>\n      <a\n        className=\"flex items-center gap-2\"\n        href={providers.claude.createUrl(query)}\n        rel=\"noopener\"\n        target=\"_blank\"\n      >\n        <span className=\"shrink-0\">{providers.claude.icon}</span>\n        <span className=\"flex-1\">{providers.claude.title}</span>\n        <ExternalLinkIcon className=\"size-4 shrink-0\" />\n      </a>\n    </DropdownMenuItem>\n  );\n};\n\nexport type OpenInT3Props = ComponentProps<typeof DropdownMenuItem>;\n\nexport const OpenInT3 = (props: OpenInT3Props) => {\n  const { query } = useOpenInContext();\n  return (\n    <DropdownMenuItem asChild {...props}>\n      <a\n        className=\"flex items-center gap-2\"\n        href={providers.t3.createUrl(query)}\n        rel=\"noopener\"\n        target=\"_blank\"\n      >\n        <span className=\"shrink-0\">{providers.t3.icon}</span>\n        <span className=\"flex-1\">{providers.t3.title}</span>\n        <ExternalLinkIcon className=\"size-4 shrink-0\" />\n      </a>\n    </DropdownMenuItem>\n  );\n};\n\nexport type OpenInSciraProps = ComponentProps<typeof DropdownMenuItem>;\n\nexport const OpenInScira = (props: OpenInSciraProps) => {\n  const { query } = useOpenInContext();\n  return (\n    <DropdownMenuItem asChild {...props}>\n      <a\n        className=\"flex items-center gap-2\"\n        href={providers.scira.createUrl(query)}\n        rel=\"noopener\"\n        target=\"_blank\"\n      >\n        <span className=\"shrink-0\">{providers.scira.icon}</span>\n        <span className=\"flex-1\">{providers.scira.title}</span>\n        <ExternalLinkIcon className=\"size-4 shrink-0\" />\n      </a>\n    </DropdownMenuItem>\n  );\n};\n\nexport type OpenInv0Props = ComponentProps<typeof DropdownMenuItem>;\n\nexport const OpenInv0 = (props: OpenInv0Props) => {\n  const { query } = useOpenInContext();\n  return (\n    <DropdownMenuItem asChild {...props}>\n      <a\n        className=\"flex items-center gap-2\"\n        href={providers.v0.createUrl(query)}\n        rel=\"noopener\"\n        target=\"_blank\"\n      >\n        <span className=\"shrink-0\">{providers.v0.icon}</span>\n        <span className=\"flex-1\">{providers.v0.title}</span>\n        <ExternalLinkIcon className=\"size-4 shrink-0\" />\n      </a>\n    </DropdownMenuItem>\n  );\n};\n\nexport type OpenInCursorProps = ComponentProps<typeof DropdownMenuItem>;\n\nexport const OpenInCursor = (props: OpenInCursorProps) => {\n  const { query } = useOpenInContext();\n  return (\n    <DropdownMenuItem asChild {...props}>\n      <a\n        className=\"flex items-center gap-2\"\n        href={providers.cursor.createUrl(query)}\n        rel=\"noopener\"\n        target=\"_blank\"\n      >\n        <span className=\"shrink-0\">{providers.cursor.icon}</span>\n        <span className=\"flex-1\">{providers.cursor.title}</span>\n        <ExternalLinkIcon className=\"size-4 shrink-0\" />\n      </a>\n    </DropdownMenuItem>\n  );\n};\n"
  },
  {
    "path": "components/ai-elements/panel.tsx",
    "content": "import { Panel as PanelPrimitive } from \"@xyflow/react\";\nimport type { ComponentProps } from \"react\";\nimport { cn } from \"@/lib/utils\";\n\ntype PanelProps = ComponentProps<typeof PanelPrimitive>;\n\nexport const Panel = ({ className, ...props }: PanelProps) => (\n  <PanelPrimitive\n    className={cn(\n      \"m-4 overflow-hidden rounded-md border bg-card p-1\",\n      className\n    )}\n    {...props}\n  />\n);\n"
  },
  {
    "path": "components/ai-elements/plan.tsx",
    "content": "\"use client\";\n\nimport { ChevronsUpDownIcon } from \"lucide-react\";\nimport type { ComponentProps } from \"react\";\nimport { createContext, useContext } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n  Card,\n  CardAction,\n  CardContent,\n  CardDescription,\n  CardFooter,\n  CardHeader,\n  CardTitle,\n} from \"@/components/ui/card\";\nimport {\n  Collapsible,\n  CollapsibleContent,\n  CollapsibleTrigger,\n} from \"@/components/ui/collapsible\";\nimport { cn } from \"@/lib/utils\";\nimport { Shimmer } from \"./shimmer\";\n\ntype PlanContextValue = {\n  isStreaming: boolean;\n};\n\nconst PlanContext = createContext<PlanContextValue | null>(null);\n\nconst usePlan = () => {\n  const context = useContext(PlanContext);\n  if (!context) {\n    throw new Error(\"Plan components must be used within Plan\");\n  }\n  return context;\n};\n\nexport type PlanProps = ComponentProps<typeof Collapsible> & {\n  isStreaming?: boolean;\n};\n\nexport const Plan = ({\n  className,\n  isStreaming = false,\n  children,\n  ...props\n}: PlanProps) => (\n  <PlanContext.Provider value={{ isStreaming }}>\n    <Collapsible asChild data-slot=\"plan\" {...props}>\n      <Card className={cn(\"shadow-none\", className)}>{children}</Card>\n    </Collapsible>\n  </PlanContext.Provider>\n);\n\nexport type PlanHeaderProps = ComponentProps<typeof CardHeader>;\n\nexport const PlanHeader = ({ className, ...props }: PlanHeaderProps) => (\n  <CardHeader\n    className={cn(\"flex items-start justify-between\", className)}\n    data-slot=\"plan-header\"\n    {...props}\n  />\n);\n\nexport type PlanTitleProps = Omit<\n  ComponentProps<typeof CardTitle>,\n  \"children\"\n> & {\n  children: string;\n};\n\nexport const PlanTitle = ({ children, ...props }: PlanTitleProps) => {\n  const { isStreaming } = usePlan();\n\n  return (\n    <CardTitle data-slot=\"plan-title\" {...props}>\n      {isStreaming ? <Shimmer>{children}</Shimmer> : children}\n    </CardTitle>\n  );\n};\n\nexport type PlanDescriptionProps = Omit<\n  ComponentProps<typeof CardDescription>,\n  \"children\"\n> & {\n  children: string;\n};\n\nexport const PlanDescription = ({\n  className,\n  children,\n  ...props\n}: PlanDescriptionProps) => {\n  const { isStreaming } = usePlan();\n\n  return (\n    <CardDescription\n      className={cn(\"text-balance\", className)}\n      data-slot=\"plan-description\"\n      {...props}\n    >\n      {isStreaming ? <Shimmer>{children}</Shimmer> : children}\n    </CardDescription>\n  );\n};\n\nexport type PlanActionProps = ComponentProps<typeof CardAction>;\n\nexport const PlanAction = (props: PlanActionProps) => (\n  <CardAction data-slot=\"plan-action\" {...props} />\n);\n\nexport type PlanContentProps = ComponentProps<typeof CardContent>;\n\nexport const PlanContent = (props: PlanContentProps) => (\n  <CollapsibleContent asChild>\n    <CardContent data-slot=\"plan-content\" {...props} />\n  </CollapsibleContent>\n);\n\nexport type PlanFooterProps = ComponentProps<\"div\">;\n\nexport const PlanFooter = (props: PlanFooterProps) => (\n  <CardFooter data-slot=\"plan-footer\" {...props} />\n);\n\nexport type PlanTriggerProps = ComponentProps<typeof CollapsibleTrigger>;\n\nexport const PlanTrigger = ({ className, ...props }: PlanTriggerProps) => (\n  <CollapsibleTrigger asChild>\n    <Button\n      className={cn(\"size-8\", className)}\n      data-slot=\"plan-trigger\"\n      size=\"icon\"\n      variant=\"ghost\"\n      {...props}\n    >\n      <ChevronsUpDownIcon className=\"size-4\" />\n      <span className=\"sr-only\">Toggle plan</span>\n    </Button>\n  </CollapsibleTrigger>\n);\n"
  },
  {
    "path": "components/ai-elements/prompt-input.tsx",
    "content": "\"use client\";\n\nimport type { ChatStatus, FileUIPart } from \"ai\";\nimport {\n  CornerDownLeftIcon,\n  ImageIcon,\n  Loader2Icon,\n  MicIcon,\n  PaperclipIcon,\n  PlusIcon,\n  SquareIcon,\n  XIcon,\n} from \"lucide-react\";\nimport { nanoid } from \"nanoid\";\nimport {\n  type ChangeEvent,\n  type ChangeEventHandler,\n  Children,\n  type ClipboardEventHandler,\n  type ComponentProps,\n  createContext,\n  type FormEvent,\n  type FormEventHandler,\n  Fragment,\n  type HTMLAttributes,\n  type KeyboardEventHandler,\n  type PropsWithChildren,\n  type ReactNode,\n  type RefObject,\n  useCallback,\n  useContext,\n  useEffect,\n  useMemo,\n  useRef,\n  useState,\n} from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n  Command,\n  CommandEmpty,\n  CommandGroup,\n  CommandInput,\n  CommandItem,\n  CommandList,\n  CommandSeparator,\n} from \"@/components/ui/command\";\nimport {\n  DropdownMenu,\n  DropdownMenuContent,\n  DropdownMenuItem,\n  DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport {\n  HoverCard,\n  HoverCardContent,\n  HoverCardTrigger,\n} from \"@/components/ui/hover-card\";\nimport {\n  InputGroup,\n  InputGroupAddon,\n  InputGroupButton,\n  InputGroupTextarea,\n} from \"@/components/ui/input-group\";\nimport {\n  Select,\n  SelectContent,\n  SelectItem,\n  SelectTrigger,\n  SelectValue,\n} from \"@/components/ui/select\";\nimport { cn } from \"@/lib/utils\";\n\n// ============================================================================\n// Provider Context & Types\n// ============================================================================\n\nexport type AttachmentsContext = {\n  files: (FileUIPart & { id: string })[];\n  add: (files: File[] | FileList) => void;\n  remove: (id: string) => void;\n  clear: () => void;\n  openFileDialog: () => void;\n  fileInputRef: RefObject<HTMLInputElement | null>;\n};\n\nexport type TextInputContext = {\n  value: string;\n  setInput: (v: string) => void;\n  clear: () => void;\n};\n\nexport type PromptInputControllerProps = {\n  textInput: TextInputContext;\n  attachments: AttachmentsContext;\n  /** INTERNAL: Allows PromptInput to register its file textInput + \"open\" callback */\n  __registerFileInput: (\n    ref: RefObject<HTMLInputElement | null>,\n    open: () => void\n  ) => void;\n};\n\nconst PromptInputController = createContext<PromptInputControllerProps | null>(\n  null\n);\nconst ProviderAttachmentsContext = createContext<AttachmentsContext | null>(\n  null\n);\n\nexport const usePromptInputController = () => {\n  const ctx = useContext(PromptInputController);\n  if (!ctx) {\n    throw new Error(\n      \"Wrap your component inside <PromptInputProvider> to use usePromptInputController().\"\n    );\n  }\n  return ctx;\n};\n\n// Optional variants (do NOT throw). Useful for dual-mode components.\nconst useOptionalPromptInputController = () =>\n  useContext(PromptInputController);\n\nexport const useProviderAttachments = () => {\n  const ctx = useContext(ProviderAttachmentsContext);\n  if (!ctx) {\n    throw new Error(\n      \"Wrap your component inside <PromptInputProvider> to use useProviderAttachments().\"\n    );\n  }\n  return ctx;\n};\n\nconst useOptionalProviderAttachments = () =>\n  useContext(ProviderAttachmentsContext);\n\nexport type PromptInputProviderProps = PropsWithChildren<{\n  initialInput?: string;\n}>;\n\n/**\n * Optional global provider that lifts PromptInput state outside of PromptInput.\n * If you don't use it, PromptInput stays fully self-managed.\n */\nexport function PromptInputProvider({\n  initialInput: initialTextInput = \"\",\n  children,\n}: PromptInputProviderProps) {\n  // ----- textInput state\n  const [textInput, setTextInput] = useState(initialTextInput);\n  const clearInput = useCallback(() => setTextInput(\"\"), []);\n\n  // ----- attachments state (global when wrapped)\n  const [attachmentFiles, setAttachmentFiles] = useState<\n    (FileUIPart & { id: string })[]\n  >([]);\n  const fileInputRef = useRef<HTMLInputElement | null>(null);\n  const openRef = useRef<() => void>(() => undefined);\n\n  const add = useCallback((files: File[] | FileList) => {\n    const incoming = Array.from(files);\n    if (incoming.length === 0) {\n      return;\n    }\n\n    setAttachmentFiles((prev) =>\n      prev.concat(\n        incoming.map((file) => ({\n          id: nanoid(),\n          type: \"file\" as const,\n          url: URL.createObjectURL(file),\n          mediaType: file.type,\n          filename: file.name,\n        }))\n      )\n    );\n  }, []);\n\n  const remove = useCallback((id: string) => {\n    setAttachmentFiles((prev) => {\n      const found = prev.find((f) => f.id === id);\n      if (found?.url) {\n        URL.revokeObjectURL(found.url);\n      }\n      return prev.filter((f) => f.id !== id);\n    });\n  }, []);\n\n  const clear = useCallback(() => {\n    setAttachmentFiles((prev) => {\n      for (const f of prev) {\n        if (f.url) {\n          URL.revokeObjectURL(f.url);\n        }\n      }\n      return [];\n    });\n  }, []);\n\n  // Keep a ref to attachments for cleanup on unmount (avoids stale closure)\n  const attachmentsRef = useRef(attachmentFiles);\n  attachmentsRef.current = attachmentFiles;\n\n  // Cleanup blob URLs on unmount to prevent memory leaks\n  useEffect(() => {\n    return () => {\n      for (const f of attachmentsRef.current) {\n        if (f.url) {\n          URL.revokeObjectURL(f.url);\n        }\n      }\n    };\n  }, []);\n\n  const openFileDialog = useCallback(() => {\n    openRef.current?.();\n  }, []);\n\n  const attachments = useMemo<AttachmentsContext>(\n    () => ({\n      files: attachmentFiles,\n      add,\n      remove,\n      clear,\n      openFileDialog,\n      fileInputRef,\n    }),\n    [attachmentFiles, add, remove, clear, openFileDialog]\n  );\n\n  const __registerFileInput = useCallback(\n    (ref: RefObject<HTMLInputElement | null>, open: () => void) => {\n      fileInputRef.current = ref.current;\n      openRef.current = open;\n    },\n    []\n  );\n\n  const controller = useMemo<PromptInputControllerProps>(\n    () => ({\n      textInput: {\n        value: textInput,\n        setInput: setTextInput,\n        clear: clearInput,\n      },\n      attachments,\n      __registerFileInput,\n    }),\n    [textInput, clearInput, attachments, __registerFileInput]\n  );\n\n  return (\n    <PromptInputController.Provider value={controller}>\n      <ProviderAttachmentsContext.Provider value={attachments}>\n        {children}\n      </ProviderAttachmentsContext.Provider>\n    </PromptInputController.Provider>\n  );\n}\n\n// ============================================================================\n// Component Context & Hooks\n// ============================================================================\n\nconst LocalAttachmentsContext = createContext<AttachmentsContext | null>(null);\n\nexport const usePromptInputAttachments = () => {\n  // Dual-mode: prefer provider if present, otherwise use local\n  const provider = useOptionalProviderAttachments();\n  const local = useContext(LocalAttachmentsContext);\n  const context = provider ?? local;\n  if (!context) {\n    throw new Error(\n      \"usePromptInputAttachments must be used within a PromptInput or PromptInputProvider\"\n    );\n  }\n  return context;\n};\n\nexport type PromptInputAttachmentProps = HTMLAttributes<HTMLDivElement> & {\n  data: FileUIPart & { id: string };\n  className?: string;\n};\n\nexport function PromptInputAttachment({\n  data,\n  className,\n  ...props\n}: PromptInputAttachmentProps) {\n  const attachments = usePromptInputAttachments();\n\n  const filename = data.filename || \"\";\n\n  const mediaType =\n    data.mediaType?.startsWith(\"image/\") && data.url ? \"image\" : \"file\";\n  const isImage = mediaType === \"image\";\n\n  const attachmentLabel = filename || (isImage ? \"Image\" : \"Attachment\");\n\n  return (\n    <PromptInputHoverCard>\n      <HoverCardTrigger asChild>\n        <div\n          className={cn(\n            \"group relative flex h-8 cursor-pointer select-none items-center gap-1.5 rounded-md border border-border px-1.5 font-medium text-sm transition-all hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50\",\n            className\n          )}\n          key={data.id}\n          {...props}\n        >\n          <div className=\"relative size-5 shrink-0\">\n            <div className=\"flex overflow-hidden absolute inset-0 justify-center items-center rounded transition-opacity size-5 bg-background group-hover:opacity-0\">\n              {isImage ? (\n                /* biome-ignore lint/performance/noImgElement: dynamic user uploads */\n                <img\n                  alt={filename || \"attachment\"}\n                  className=\"object-cover size-5\"\n                  height={20}\n                  src={data.url}\n                  width={20}\n                />\n              ) : (\n                <div className=\"flex justify-center items-center size-5 text-muted-foreground\">\n                  <PaperclipIcon className=\"size-3\" />\n                </div>\n              )}\n            </div>\n            <Button\n              aria-label=\"Remove attachment\"\n              className=\"absolute inset-0 size-5 cursor-pointer rounded p-0 opacity-0 transition-opacity group-hover:pointer-events-auto group-hover:opacity-100 [&>svg]:size-2.5\"\n              onClick={(e) => {\n                e.stopPropagation();\n                attachments.remove(data.id);\n              }}\n              type=\"button\"\n              variant=\"ghost\"\n            >\n              <XIcon />\n              <span className=\"sr-only\">Remove</span>\n            </Button>\n          </div>\n\n          <span className=\"flex-1 truncate\">{attachmentLabel}</span>\n        </div>\n      </HoverCardTrigger>\n      <PromptInputHoverCardContent className=\"p-2 w-auto\">\n        <div className=\"space-y-3 w-auto\">\n          {isImage && (\n            <div className=\"flex overflow-hidden justify-center items-center w-96 max-h-96 rounded-md border\">\n              {/* biome-ignore lint/performance/noImgElement: dynamic user uploads */}\n              <img\n                alt={filename || \"attachment preview\"}\n                className=\"object-contain max-w-full max-h-full\"\n                height={384}\n                src={data.url}\n                width={448}\n              />\n            </div>\n          )}\n          <div className=\"flex items-center gap-2.5\">\n            <div className=\"min-w-0 flex-1 space-y-1 px-0.5\">\n              <h4 className=\"text-sm font-semibold leading-none truncate\">\n                {filename || (isImage ? \"Image\" : \"Attachment\")}\n              </h4>\n              {data.mediaType && (\n                <p className=\"font-mono text-xs truncate text-muted-foreground\">\n                  {data.mediaType}\n                </p>\n              )}\n            </div>\n          </div>\n        </div>\n      </PromptInputHoverCardContent>\n    </PromptInputHoverCard>\n  );\n}\n\nexport type PromptInputAttachmentsProps = Omit<\n  HTMLAttributes<HTMLDivElement>,\n  \"children\"\n> & {\n  children: (attachment: FileUIPart & { id: string }) => ReactNode;\n};\n\nexport function PromptInputAttachments({\n  children,\n  className,\n  ...props\n}: PromptInputAttachmentsProps) {\n  const attachments = usePromptInputAttachments();\n\n  if (!attachments.files.length) {\n    return null;\n  }\n\n  return (\n    <div\n      className={cn(\"flex flex-wrap gap-2 items-center p-3 w-full\", className)}\n      {...props}\n    >\n      {attachments.files.map((file) => (\n        <Fragment key={file.id}>{children(file)}</Fragment>\n      ))}\n    </div>\n  );\n}\n\nexport type PromptInputActionAddAttachmentsProps = ComponentProps<\n  typeof DropdownMenuItem\n> & {\n  label?: string;\n};\n\nexport const PromptInputActionAddAttachments = ({\n  label = \"Add photos or files\",\n  ...props\n}: PromptInputActionAddAttachmentsProps) => {\n  const attachments = usePromptInputAttachments();\n\n  return (\n    <DropdownMenuItem\n      {...props}\n      onSelect={(e) => {\n        e.preventDefault();\n        attachments.openFileDialog();\n      }}\n    >\n      <ImageIcon className=\"mr-2 size-4\" /> {label}\n    </DropdownMenuItem>\n  );\n};\n\nexport type PromptInputMessage = {\n  text: string;\n  files: FileUIPart[];\n};\n\nexport type PromptInputProps = Omit<\n  HTMLAttributes<HTMLFormElement>,\n  \"onSubmit\" | \"onError\"\n> & {\n  accept?: string; // e.g., \"image/*\" or leave undefined for any\n  multiple?: boolean;\n  // When true, accepts drops anywhere on document. Default false (opt-in).\n  globalDrop?: boolean;\n  // Render a hidden input with given name and keep it in sync for native form posts. Default false.\n  syncHiddenInput?: boolean;\n  // Minimal constraints\n  maxFiles?: number;\n  maxFileSize?: number; // bytes\n  onError?: (err: {\n    code: \"max_files\" | \"max_file_size\" | \"accept\";\n    message: string;\n  }) => void;\n  onSubmit: (\n    message: PromptInputMessage,\n    event: FormEvent<HTMLFormElement>\n  ) => void | Promise<void>;\n};\n\nexport const PromptInput = ({\n  className,\n  accept,\n  multiple,\n  globalDrop,\n  syncHiddenInput,\n  maxFiles,\n  maxFileSize,\n  onError,\n  onSubmit,\n  children,\n  ...props\n}: PromptInputProps) => {\n  // Try to use a provider controller if present\n  const controller = useOptionalPromptInputController();\n  const usingProvider = !!controller;\n\n  // Refs\n  const inputRef = useRef<HTMLInputElement | null>(null);\n  const formRef = useRef<HTMLFormElement | null>(null);\n\n  // ----- Local attachments (only used when no provider)\n  const [items, setItems] = useState<(FileUIPart & { id: string })[]>([]);\n  const files = usingProvider ? controller.attachments.files : items;\n\n  // Keep a ref to files for cleanup on unmount (avoids stale closure)\n  const filesRef = useRef(files);\n  filesRef.current = files;\n\n  const openFileDialogLocal = useCallback(() => {\n    inputRef.current?.click();\n  }, []);\n\n  const matchesAccept = useCallback(\n    (f: File) => {\n      if (!accept || accept.trim() === \"\") {\n        return true;\n      }\n\n      const patterns = accept\n        .split(\",\")\n        .map((s) => s.trim())\n        .filter(Boolean);\n\n      return patterns.some((pattern) => {\n        if (pattern.endsWith(\"/*\")) {\n          const prefix = pattern.slice(0, -1); // e.g: image/* -> image/\n          return f.type.startsWith(prefix);\n        }\n        return f.type === pattern;\n      });\n    },\n    [accept]\n  );\n\n  const addLocal = useCallback(\n    (fileList: File[] | FileList) => {\n      const incoming = Array.from(fileList);\n      const accepted = incoming.filter((f) => matchesAccept(f));\n      if (incoming.length && accepted.length === 0) {\n        onError?.({\n          code: \"accept\",\n          message: \"No files match the accepted types.\",\n        });\n        return;\n      }\n      const withinSize = (f: File) =>\n        maxFileSize ? f.size <= maxFileSize : true;\n      const sized = accepted.filter(withinSize);\n      if (accepted.length > 0 && sized.length === 0) {\n        onError?.({\n          code: \"max_file_size\",\n          message: \"All files exceed the maximum size.\",\n        });\n        return;\n      }\n\n      setItems((prev) => {\n        const capacity =\n          typeof maxFiles === \"number\"\n            ? Math.max(0, maxFiles - prev.length)\n            : undefined;\n        const capped =\n          typeof capacity === \"number\" ? sized.slice(0, capacity) : sized;\n        if (typeof capacity === \"number\" && sized.length > capacity) {\n          onError?.({\n            code: \"max_files\",\n            message: \"Too many files. Some were not added.\",\n          });\n        }\n        const next: (FileUIPart & { id: string })[] = [];\n        for (const file of capped) {\n          next.push({\n            id: nanoid(),\n            type: \"file\",\n            url: URL.createObjectURL(file),\n            mediaType: file.type,\n            filename: file.name,\n          });\n        }\n        return prev.concat(next);\n      });\n    },\n    [matchesAccept, maxFiles, maxFileSize, onError]\n  );\n\n  const removeLocal = useCallback(\n    (id: string) =>\n      setItems((prev) => {\n        const found = prev.find((file) => file.id === id);\n        if (found?.url) {\n          URL.revokeObjectURL(found.url);\n        }\n        return prev.filter((file) => file.id !== id);\n      }),\n    []\n  );\n\n  const clearLocal = useCallback(\n    () =>\n      setItems((prev) => {\n        for (const file of prev) {\n          if (file.url) {\n            URL.revokeObjectURL(file.url);\n          }\n        }\n        return [];\n      }),\n    []\n  );\n\n  const add = usingProvider ? controller.attachments.add : addLocal;\n  const remove = usingProvider ? controller.attachments.remove : removeLocal;\n  const clear = usingProvider ? controller.attachments.clear : clearLocal;\n  const openFileDialog = usingProvider\n    ? controller.attachments.openFileDialog\n    : openFileDialogLocal;\n\n  // Let provider know about our hidden file input so external menus can call openFileDialog()\n  useEffect(() => {\n    if (!usingProvider) {\n      return;\n    }\n    controller.__registerFileInput(inputRef, () => inputRef.current?.click());\n  }, [usingProvider, controller]);\n\n  // Note: File input cannot be programmatically set for security reasons\n  // The syncHiddenInput prop is no longer functional\n  useEffect(() => {\n    if (syncHiddenInput && inputRef.current && files.length === 0) {\n      inputRef.current.value = \"\";\n    }\n  }, [files, syncHiddenInput]);\n\n  // Attach drop handlers on nearest form and document (opt-in)\n  useEffect(() => {\n    const form = formRef.current;\n    if (!form) {\n      return;\n    }\n    if (globalDrop) {\n      return;\n    }\n\n    const onDragOver = (e: DragEvent) => {\n      if (e.dataTransfer?.types?.includes(\"Files\")) {\n        e.preventDefault();\n      }\n    };\n    const onDrop = (e: DragEvent) => {\n      if (e.dataTransfer?.types?.includes(\"Files\")) {\n        e.preventDefault();\n      }\n      if (e.dataTransfer?.files && e.dataTransfer.files.length > 0) {\n        add(e.dataTransfer.files);\n      }\n    };\n    form.addEventListener(\"dragover\", onDragOver);\n    form.addEventListener(\"drop\", onDrop);\n    return () => {\n      form.removeEventListener(\"dragover\", onDragOver);\n      form.removeEventListener(\"drop\", onDrop);\n    };\n  }, [add, globalDrop]);\n\n  useEffect(() => {\n    if (!globalDrop) {\n      return;\n    }\n\n    const onDragOver = (e: DragEvent) => {\n      if (e.dataTransfer?.types?.includes(\"Files\")) {\n        e.preventDefault();\n      }\n    };\n    const onDrop = (e: DragEvent) => {\n      if (e.dataTransfer?.types?.includes(\"Files\")) {\n        e.preventDefault();\n      }\n      if (e.dataTransfer?.files && e.dataTransfer.files.length > 0) {\n        add(e.dataTransfer.files);\n      }\n    };\n    document.addEventListener(\"dragover\", onDragOver);\n    document.addEventListener(\"drop\", onDrop);\n    return () => {\n      document.removeEventListener(\"dragover\", onDragOver);\n      document.removeEventListener(\"drop\", onDrop);\n    };\n  }, [add, globalDrop]);\n\n  useEffect(\n    () => () => {\n      if (!usingProvider) {\n        for (const f of filesRef.current) {\n          if (f.url) {\n            URL.revokeObjectURL(f.url);\n          }\n        }\n      }\n    },\n    // eslint-disable-next-line react-hooks/exhaustive-deps -- cleanup only on unmount; filesRef always current\n    [usingProvider]\n  );\n\n  const handleChange: ChangeEventHandler<HTMLInputElement> = (event) => {\n    if (event.currentTarget.files) {\n      add(event.currentTarget.files);\n    }\n    // Reset input value to allow selecting files that were previously removed\n    event.currentTarget.value = \"\";\n  };\n\n  const convertBlobUrlToDataUrl = async (\n    url: string\n  ): Promise<string | null> => {\n    try {\n      const response = await fetch(url);\n      const blob = await response.blob();\n      return new Promise((resolve) => {\n        const reader = new FileReader();\n        reader.onloadend = () => resolve(reader.result as string);\n        reader.onerror = () => resolve(null);\n        reader.readAsDataURL(blob);\n      });\n    } catch {\n      return null;\n    }\n  };\n\n  const ctx = useMemo<AttachmentsContext>(\n    () => ({\n      files: files.map((item) => ({ ...item, id: item.id })),\n      add,\n      remove,\n      clear,\n      openFileDialog,\n      fileInputRef: inputRef,\n    }),\n    [files, add, remove, clear, openFileDialog]\n  );\n\n  const handleSubmit: FormEventHandler<HTMLFormElement> = (event) => {\n    event.preventDefault();\n\n    const form = event.currentTarget;\n    const text = usingProvider\n      ? controller.textInput.value\n      : (() => {\n          const formData = new FormData(form);\n          return (formData.get(\"message\") as string) || \"\";\n        })();\n\n    // Reset form immediately after capturing text to avoid race condition\n    // where user input during async blob conversion would be lost\n    if (!usingProvider) {\n      form.reset();\n    }\n\n    // Convert blob URLs to data URLs asynchronously\n    Promise.all(\n      files.map(async ({ id, ...item }) => {\n        if (item.url?.startsWith(\"blob:\")) {\n          const dataUrl = await convertBlobUrlToDataUrl(item.url);\n          // If conversion failed, keep the original blob URL\n          return {\n            ...item,\n            url: dataUrl ?? item.url,\n          };\n        }\n        return item;\n      })\n    )\n      .then((convertedFiles: FileUIPart[]) => {\n        try {\n          const result = onSubmit({ text, files: convertedFiles }, event);\n\n          // Handle both sync and async onSubmit\n          if (result instanceof Promise) {\n            result\n              .then(() => {\n                clear();\n                if (usingProvider) {\n                  controller.textInput.clear();\n                }\n              })\n              .catch(() => {\n                // Don't clear on error - user may want to retry\n              });\n          } else {\n            // Sync function completed without throwing, clear attachments\n            clear();\n            if (usingProvider) {\n              controller.textInput.clear();\n            }\n          }\n        } catch {\n          // Don't clear on error - user may want to retry\n        }\n      })\n      .catch(() => {\n        // Don't clear on error - user may want to retry\n      });\n  };\n\n  // Render with or without local provider\n  const inner = (\n    <>\n      <input\n        accept={accept}\n        aria-label=\"Upload files\"\n        className=\"hidden\"\n        multiple={multiple}\n        onChange={handleChange}\n        ref={inputRef}\n        title=\"Upload files\"\n        type=\"file\"\n      />\n      <form\n        className={cn(\"w-full\", className)}\n        onSubmit={handleSubmit}\n        ref={formRef}\n        {...props}\n      >\n        <InputGroup className=\"overflow-hidden\">{children}</InputGroup>\n      </form>\n    </>\n  );\n\n  return usingProvider ? (\n    inner\n  ) : (\n    <LocalAttachmentsContext.Provider value={ctx}>\n      {inner}\n    </LocalAttachmentsContext.Provider>\n  );\n};\n\nexport type PromptInputBodyProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputBody = ({\n  className,\n  ...props\n}: PromptInputBodyProps) => (\n  <div className={cn(\"contents\", className)} {...props} />\n);\n\nexport type PromptInputTextareaProps = ComponentProps<\n  typeof InputGroupTextarea\n>;\n\nexport const PromptInputTextarea = ({\n  onChange,\n  className,\n  placeholder = \"What would you like to know?\",\n  ...props\n}: PromptInputTextareaProps) => {\n  const controller = useOptionalPromptInputController();\n  const attachments = usePromptInputAttachments();\n  const [isComposing, setIsComposing] = useState(false);\n\n  const handleKeyDown: KeyboardEventHandler<HTMLTextAreaElement> = (e) => {\n    if (e.key === \"Enter\") {\n      if (isComposing || e.nativeEvent.isComposing) {\n        return;\n      }\n      if (e.shiftKey) {\n        return;\n      }\n      e.preventDefault();\n\n      // Check if the submit button is disabled before submitting\n      const form = e.currentTarget.form;\n      const submitButton = form?.querySelector(\n        'button[type=\"submit\"]'\n      ) as HTMLButtonElement | null;\n      if (submitButton?.disabled) {\n        return;\n      }\n\n      form?.requestSubmit();\n    }\n\n    // Remove last attachment when Backspace is pressed and textarea is empty\n    if (\n      e.key === \"Backspace\" &&\n      e.currentTarget.value === \"\" &&\n      attachments.files.length > 0\n    ) {\n      e.preventDefault();\n      const lastAttachment = attachments.files.at(-1);\n      if (lastAttachment) {\n        attachments.remove(lastAttachment.id);\n      }\n    }\n  };\n\n  const handlePaste: ClipboardEventHandler<HTMLTextAreaElement> = (event) => {\n    const items = event.clipboardData?.items;\n\n    if (!items) {\n      return;\n    }\n\n    const files: File[] = [];\n\n    for (const item of items) {\n      if (item.kind === \"file\") {\n        const file = item.getAsFile();\n        if (file) {\n          files.push(file);\n        }\n      }\n    }\n\n    if (files.length > 0) {\n      event.preventDefault();\n      attachments.add(files);\n    }\n  };\n\n  const controlledProps = controller\n    ? {\n        value: controller.textInput.value,\n        onChange: (e: ChangeEvent<HTMLTextAreaElement>) => {\n          controller.textInput.setInput(e.currentTarget.value);\n          onChange?.(e);\n        },\n      }\n    : {\n        onChange,\n      };\n\n  return (\n    <InputGroupTextarea\n      className={cn(\"max-h-48 field-sizing-content min-h-16\", className)}\n      name=\"message\"\n      onCompositionEnd={() => setIsComposing(false)}\n      onCompositionStart={() => setIsComposing(true)}\n      onKeyDown={handleKeyDown}\n      onPaste={handlePaste}\n      placeholder={placeholder}\n      {...props}\n      {...controlledProps}\n    />\n  );\n};\n\nexport type PromptInputHeaderProps = Omit<\n  ComponentProps<typeof InputGroupAddon>,\n  \"align\"\n>;\n\nexport const PromptInputHeader = ({\n  className,\n  ...props\n}: PromptInputHeaderProps) => (\n  <InputGroupAddon\n    align=\"block-end\"\n    className={cn(\"flex-wrap order-first gap-1\", className)}\n    {...props}\n  />\n);\n\nexport type PromptInputFooterProps = Omit<\n  ComponentProps<typeof InputGroupAddon>,\n  \"align\"\n>;\n\nexport const PromptInputFooter = ({\n  className,\n  ...props\n}: PromptInputFooterProps) => (\n  <InputGroupAddon\n    align=\"block-end\"\n    className={cn(\"gap-1 justify-between\", className)}\n    {...props}\n  />\n);\n\nexport type PromptInputToolsProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputTools = ({\n  className,\n  ...props\n}: PromptInputToolsProps) => (\n  <div className={cn(\"flex gap-1 items-center\", className)} {...props} />\n);\n\nexport type PromptInputButtonProps = ComponentProps<typeof InputGroupButton>;\n\nexport const PromptInputButton = ({\n  variant = \"ghost\",\n  className,\n  size,\n  ...props\n}: PromptInputButtonProps) => {\n  const newSize =\n    size ?? (Children.count(props.children) > 1 ? \"sm\" : \"icon-sm\");\n\n  return (\n    <InputGroupButton\n      className={cn(className)}\n      size={newSize}\n      type=\"button\"\n      variant={variant}\n      {...props}\n    />\n  );\n};\n\nexport type PromptInputActionMenuProps = ComponentProps<typeof DropdownMenu>;\nexport const PromptInputActionMenu = (props: PromptInputActionMenuProps) => (\n  <DropdownMenu {...props} />\n);\n\nexport type PromptInputActionMenuTriggerProps = PromptInputButtonProps;\n\nexport const PromptInputActionMenuTrigger = ({\n  className,\n  children,\n  ...props\n}: PromptInputActionMenuTriggerProps) => (\n  <DropdownMenuTrigger asChild>\n    <PromptInputButton className={className} {...props}>\n      {children ?? <PlusIcon className=\"size-4\" />}\n    </PromptInputButton>\n  </DropdownMenuTrigger>\n);\n\nexport type PromptInputActionMenuContentProps = ComponentProps<\n  typeof DropdownMenuContent\n>;\nexport const PromptInputActionMenuContent = ({\n  className,\n  ...props\n}: PromptInputActionMenuContentProps) => (\n  <DropdownMenuContent align=\"start\" className={cn(className)} {...props} />\n);\n\nexport type PromptInputActionMenuItemProps = ComponentProps<\n  typeof DropdownMenuItem\n>;\nexport const PromptInputActionMenuItem = ({\n  className,\n  ...props\n}: PromptInputActionMenuItemProps) => (\n  <DropdownMenuItem className={cn(className)} {...props} />\n);\n\n// Note: Actions that perform side-effects (like opening a file dialog)\n// are provided in opt-in modules (e.g., prompt-input-attachments).\n\nexport type PromptInputSubmitProps = ComponentProps<typeof InputGroupButton> & {\n  status?: ChatStatus;\n};\n\nexport const PromptInputSubmit = ({\n  className,\n  variant = \"default\",\n  size = \"icon-sm\",\n  status,\n  children,\n  ...props\n}: PromptInputSubmitProps) => {\n  let Icon = <CornerDownLeftIcon className=\"size-4\" />;\n\n  if (status === \"submitted\") {\n    Icon = <Loader2Icon className=\"animate-spin size-4\" />;\n  } else if (status === \"streaming\") {\n    Icon = <SquareIcon className=\"size-4\" />;\n  } else if (status === \"error\") {\n    Icon = <XIcon className=\"size-4\" />;\n  }\n\n  return (\n    <InputGroupButton\n      aria-label=\"Submit\"\n      className={cn(className)}\n      size={size}\n      type=\"submit\"\n      variant={variant}\n      {...props}\n    >\n      {children ?? Icon}\n    </InputGroupButton>\n  );\n};\n\ninterface SpeechRecognition extends EventTarget {\n  continuous: boolean;\n  interimResults: boolean;\n  lang: string;\n  start(): void;\n  stop(): void;\n  onstart: ((this: SpeechRecognition, ev: Event) => any) | null;\n  onend: ((this: SpeechRecognition, ev: Event) => any) | null;\n  onresult:\n    | ((this: SpeechRecognition, ev: SpeechRecognitionEvent) => any)\n    | null;\n  onerror:\n    | ((this: SpeechRecognition, ev: SpeechRecognitionErrorEvent) => any)\n    | null;\n}\n\ninterface SpeechRecognitionEvent extends Event {\n  results: SpeechRecognitionResultList;\n  resultIndex: number;\n}\n\ntype SpeechRecognitionResultList = {\n  readonly length: number;\n  item(index: number): SpeechRecognitionResult;\n  [index: number]: SpeechRecognitionResult;\n};\n\ntype SpeechRecognitionResult = {\n  readonly length: number;\n  item(index: number): SpeechRecognitionAlternative;\n  [index: number]: SpeechRecognitionAlternative;\n  isFinal: boolean;\n};\n\ntype SpeechRecognitionAlternative = {\n  transcript: string;\n  confidence: number;\n};\n\ninterface SpeechRecognitionErrorEvent extends Event {\n  error: string;\n}\n\ndeclare global {\n  interface Window {\n    SpeechRecognition: {\n      new (): SpeechRecognition;\n    };\n    webkitSpeechRecognition: {\n      new (): SpeechRecognition;\n    };\n  }\n}\n\nexport type PromptInputSpeechButtonProps = ComponentProps<\n  typeof PromptInputButton\n> & {\n  textareaRef?: RefObject<HTMLTextAreaElement | null>;\n  onTranscriptionChange?: (text: string) => void;\n};\n\nexport const PromptInputSpeechButton = ({\n  className,\n  textareaRef,\n  onTranscriptionChange,\n  ...props\n}: PromptInputSpeechButtonProps) => {\n  const [isListening, setIsListening] = useState(false);\n  const [recognition, setRecognition] = useState<SpeechRecognition | null>(\n    null\n  );\n  const recognitionRef = useRef<SpeechRecognition | null>(null);\n\n  useEffect(() => {\n    if (\n      typeof window !== \"undefined\" &&\n      (\"SpeechRecognition\" in window || \"webkitSpeechRecognition\" in window)\n    ) {\n      const SpeechRecognitionCtor =\n        window.SpeechRecognition || window.webkitSpeechRecognition;\n      const speechRecognition = new SpeechRecognitionCtor();\n\n      speechRecognition.continuous = true;\n      speechRecognition.interimResults = true;\n      speechRecognition.lang = \"en-US\";\n\n      speechRecognition.onstart = () => {\n        setIsListening(true);\n      };\n\n      speechRecognition.onend = () => {\n        setIsListening(false);\n      };\n\n      speechRecognition.onresult = (event) => {\n        let finalTranscript = \"\";\n\n        for (let i = event.resultIndex; i < event.results.length; i++) {\n          const result = event.results[i];\n          if (result.isFinal) {\n            finalTranscript += result[0]?.transcript ?? \"\";\n          }\n        }\n\n        if (finalTranscript && textareaRef?.current) {\n          const textarea = textareaRef.current;\n          const currentValue = textarea.value;\n          const newValue =\n            currentValue + (currentValue ? \" \" : \"\") + finalTranscript;\n\n          textarea.value = newValue;\n          textarea.dispatchEvent(new Event(\"input\", { bubbles: true }));\n          onTranscriptionChange?.(newValue);\n        }\n      };\n\n      speechRecognition.onerror = (event) => {\n        console.error(\"Speech recognition error:\", event.error);\n        setIsListening(false);\n      };\n\n      recognitionRef.current = speechRecognition;\n      setRecognition(speechRecognition);\n    }\n\n    return () => {\n      if (recognitionRef.current) {\n        recognitionRef.current.stop();\n      }\n    };\n  }, [textareaRef, onTranscriptionChange]);\n\n  const toggleListening = useCallback(() => {\n    if (!recognition) {\n      return;\n    }\n\n    if (isListening) {\n      recognition.stop();\n    } else {\n      recognition.start();\n    }\n  }, [recognition, isListening]);\n\n  return (\n    <PromptInputButton\n      className={cn(\n        \"relative transition-all duration-200\",\n        isListening && \"animate-pulse bg-accent text-accent-foreground\",\n        className\n      )}\n      disabled={!recognition}\n      onClick={toggleListening}\n      {...props}\n    >\n      <MicIcon className=\"size-4\" />\n    </PromptInputButton>\n  );\n};\n\nexport type PromptInputSelectProps = ComponentProps<typeof Select>;\n\nexport const PromptInputSelect = (props: PromptInputSelectProps) => (\n  <Select {...props} />\n);\n\nexport type PromptInputSelectTriggerProps = ComponentProps<\n  typeof SelectTrigger\n>;\n\nexport const PromptInputSelectTrigger = ({\n  className,\n  ...props\n}: PromptInputSelectTriggerProps) => (\n  <SelectTrigger\n    className={cn(\n      \"font-medium bg-transparent border-none shadow-none transition-colors text-muted-foreground\",\n      \"hover:bg-accent hover:text-foreground aria-expanded:bg-accent aria-expanded:text-foreground\",\n      className\n    )}\n    {...props}\n  />\n);\n\nexport type PromptInputSelectContentProps = ComponentProps<\n  typeof SelectContent\n>;\n\nexport const PromptInputSelectContent = ({\n  className,\n  ...props\n}: PromptInputSelectContentProps) => (\n  <SelectContent className={cn(className)} {...props} />\n);\n\nexport type PromptInputSelectItemProps = ComponentProps<typeof SelectItem>;\n\nexport const PromptInputSelectItem = ({\n  className,\n  ...props\n}: PromptInputSelectItemProps) => (\n  <SelectItem className={cn(className)} {...props} />\n);\n\nexport type PromptInputSelectValueProps = ComponentProps<typeof SelectValue>;\n\nexport const PromptInputSelectValue = ({\n  className,\n  ...props\n}: PromptInputSelectValueProps) => (\n  <SelectValue className={cn(className)} {...props} />\n);\n\nexport type PromptInputHoverCardProps = ComponentProps<typeof HoverCard>;\n\nexport const PromptInputHoverCard = ({\n  openDelay = 0,\n  closeDelay = 0,\n  ...props\n}: PromptInputHoverCardProps) => (\n  <HoverCard closeDelay={closeDelay} openDelay={openDelay} {...props} />\n);\n\nexport type PromptInputHoverCardTriggerProps = ComponentProps<\n  typeof HoverCardTrigger\n>;\n\nexport const PromptInputHoverCardTrigger = (\n  props: PromptInputHoverCardTriggerProps\n) => <HoverCardTrigger {...props} />;\n\nexport type PromptInputHoverCardContentProps = ComponentProps<\n  typeof HoverCardContent\n>;\n\nexport const PromptInputHoverCardContent = ({\n  align = \"start\",\n  ...props\n}: PromptInputHoverCardContentProps) => (\n  <HoverCardContent align={align} {...props} />\n);\n\nexport type PromptInputTabsListProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputTabsList = ({\n  className,\n  ...props\n}: PromptInputTabsListProps) => <div className={cn(className)} {...props} />;\n\nexport type PromptInputTabProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputTab = ({\n  className,\n  ...props\n}: PromptInputTabProps) => <div className={cn(className)} {...props} />;\n\nexport type PromptInputTabLabelProps = HTMLAttributes<HTMLHeadingElement>;\n\nexport const PromptInputTabLabel = ({\n  className,\n  ...props\n}: PromptInputTabLabelProps) => (\n  <h3\n    className={cn(\n      \"px-3 mb-2 text-xs font-medium text-muted-foreground\",\n      className\n    )}\n    {...props}\n  />\n);\n\nexport type PromptInputTabBodyProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputTabBody = ({\n  className,\n  ...props\n}: PromptInputTabBodyProps) => (\n  <div className={cn(\"space-y-1\", className)} {...props} />\n);\n\nexport type PromptInputTabItemProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputTabItem = ({\n  className,\n  ...props\n}: PromptInputTabItemProps) => (\n  <div\n    className={cn(\n      \"flex gap-2 items-center px-3 py-2 text-xs hover:bg-accent\",\n      className\n    )}\n    {...props}\n  />\n);\n\nexport type PromptInputCommandProps = ComponentProps<typeof Command>;\n\nexport const PromptInputCommand = ({\n  className,\n  ...props\n}: PromptInputCommandProps) => <Command className={cn(className)} {...props} />;\n\nexport type PromptInputCommandInputProps = ComponentProps<typeof CommandInput>;\n\nexport const PromptInputCommandInput = ({\n  className,\n  ...props\n}: PromptInputCommandInputProps) => (\n  <CommandInput className={cn(className)} {...props} />\n);\n\nexport type PromptInputCommandListProps = ComponentProps<typeof CommandList>;\n\nexport const PromptInputCommandList = ({\n  className,\n  ...props\n}: PromptInputCommandListProps) => (\n  <CommandList className={cn(className)} {...props} />\n);\n\nexport type PromptInputCommandEmptyProps = ComponentProps<typeof CommandEmpty>;\n\nexport const PromptInputCommandEmpty = ({\n  className,\n  ...props\n}: PromptInputCommandEmptyProps) => (\n  <CommandEmpty className={cn(className)} {...props} />\n);\n\nexport type PromptInputCommandGroupProps = ComponentProps<typeof CommandGroup>;\n\nexport const PromptInputCommandGroup = ({\n  className,\n  ...props\n}: PromptInputCommandGroupProps) => (\n  <CommandGroup className={cn(className)} {...props} />\n);\n\nexport type PromptInputCommandItemProps = ComponentProps<typeof CommandItem>;\n\nexport const PromptInputCommandItem = ({\n  className,\n  ...props\n}: PromptInputCommandItemProps) => (\n  <CommandItem className={cn(className)} {...props} />\n);\n\nexport type PromptInputCommandSeparatorProps = ComponentProps<\n  typeof CommandSeparator\n>;\n\nexport const PromptInputCommandSeparator = ({\n  className,\n  ...props\n}: PromptInputCommandSeparatorProps) => (\n  <CommandSeparator className={cn(className)} {...props} />\n);\n"
  },
  {
    "path": "components/ai-elements/queue.tsx",
    "content": "\"use client\";\n\nimport { ChevronDownIcon, PaperclipIcon } from \"lucide-react\";\nimport type { ComponentProps } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n  Collapsible,\n  CollapsibleContent,\n  CollapsibleTrigger,\n} from \"@/components/ui/collapsible\";\nimport { ScrollArea } from \"@/components/ui/scroll-area\";\nimport { cn } from \"@/lib/utils\";\n\nexport type QueueMessagePart = {\n  type: string;\n  text?: string;\n  url?: string;\n  filename?: string;\n  mediaType?: string;\n};\n\nexport type QueueMessage = {\n  id: string;\n  parts: QueueMessagePart[];\n};\n\nexport type QueueTodo = {\n  id: string;\n  title: string;\n  description?: string;\n  status?: \"pending\" | \"completed\";\n};\n\nexport type QueueItemProps = ComponentProps<\"li\">;\n\nexport const QueueItem = ({ className, ...props }: QueueItemProps) => (\n  <li\n    className={cn(\n      \"group flex flex-col gap-1 rounded-md px-3 py-1 text-sm transition-colors hover:bg-muted\",\n      className\n    )}\n    {...props}\n  />\n);\n\nexport type QueueItemIndicatorProps = ComponentProps<\"span\"> & {\n  completed?: boolean;\n};\n\nexport const QueueItemIndicator = ({\n  completed = false,\n  className,\n  ...props\n}: QueueItemIndicatorProps) => (\n  <span\n    className={cn(\n      \"mt-0.5 inline-block size-2.5 rounded-full border\",\n      completed\n        ? \"border-muted-foreground/20 bg-muted-foreground/10\"\n        : \"border-muted-foreground/50\",\n      className\n    )}\n    {...props}\n  />\n);\n\nexport type QueueItemContentProps = ComponentProps<\"span\"> & {\n  completed?: boolean;\n};\n\nexport const QueueItemContent = ({\n  completed = false,\n  className,\n  ...props\n}: QueueItemContentProps) => (\n  <span\n    className={cn(\n      \"wrap-break-word line-clamp-1 grow\",\n      completed\n        ? \"text-muted-foreground/50 line-through\"\n        : \"text-muted-foreground\",\n      className\n    )}\n    {...props}\n  />\n);\n\nexport type QueueItemDescriptionProps = ComponentProps<\"div\"> & {\n  completed?: boolean;\n};\n\nexport const QueueItemDescription = ({\n  completed = false,\n  className,\n  ...props\n}: QueueItemDescriptionProps) => (\n  <div\n    className={cn(\n      \"ml-6 text-xs\",\n      completed\n        ? \"text-muted-foreground/40 line-through\"\n        : \"text-muted-foreground\",\n      className\n    )}\n    {...props}\n  />\n);\n\nexport type QueueItemActionsProps = ComponentProps<\"div\">;\n\nexport const QueueItemActions = ({\n  className,\n  ...props\n}: QueueItemActionsProps) => (\n  <div className={cn(\"flex gap-1\", className)} {...props} />\n);\n\nexport type QueueItemActionProps = Omit<\n  ComponentProps<typeof Button>,\n  \"variant\" | \"size\"\n>;\n\nexport const QueueItemAction = ({\n  className,\n  ...props\n}: QueueItemActionProps) => (\n  <Button\n    className={cn(\n      \"size-auto rounded p-1 text-muted-foreground opacity-0 transition-opacity hover:bg-muted-foreground/10 hover:text-foreground group-hover:opacity-100\",\n      className\n    )}\n    size=\"icon\"\n    type=\"button\"\n    variant=\"ghost\"\n    {...props}\n  />\n);\n\nexport type QueueItemAttachmentProps = ComponentProps<\"div\">;\n\nexport const QueueItemAttachment = ({\n  className,\n  ...props\n}: QueueItemAttachmentProps) => (\n  <div className={cn(\"mt-1 flex flex-wrap gap-2\", className)} {...props} />\n);\n\nexport type QueueItemImageProps = ComponentProps<\"img\">;\n\nexport const QueueItemImage = ({\n  className,\n  ...props\n}: QueueItemImageProps) => (\n  // biome-ignore lint/performance/noImgElement: dynamic blob/data URLs require native img\n  <img\n    alt=\"\"\n    className={cn(\"h-8 w-8 rounded border object-cover\", className)}\n    height={32}\n    width={32}\n    {...props}\n  />\n);\n\nexport type QueueItemFileProps = ComponentProps<\"span\">;\n\nexport const QueueItemFile = ({\n  children,\n  className,\n  ...props\n}: QueueItemFileProps) => (\n  <span\n    className={cn(\n      \"flex items-center gap-1 rounded border bg-muted px-2 py-1 text-xs\",\n      className\n    )}\n    {...props}\n  >\n    <PaperclipIcon size={12} />\n    <span className=\"max-w-[100px] truncate\">{children}</span>\n  </span>\n);\n\nexport type QueueListProps = ComponentProps<typeof ScrollArea>;\n\nexport const QueueList = ({\n  children,\n  className,\n  ...props\n}: QueueListProps) => (\n  <ScrollArea className={cn(\"mt-2 -mb-1\", className)} {...props}>\n    <div className=\"max-h-40 pr-4\">\n      <ul>{children}</ul>\n    </div>\n  </ScrollArea>\n);\n\n// QueueSection - collapsible section container\nexport type QueueSectionProps = ComponentProps<typeof Collapsible>;\n\nexport const QueueSection = ({\n  className,\n  defaultOpen = true,\n  ...props\n}: QueueSectionProps) => (\n  <Collapsible className={cn(className)} defaultOpen={defaultOpen} {...props} />\n);\n\n// QueueSectionTrigger - section header/trigger\nexport type QueueSectionTriggerProps = ComponentProps<\"button\">;\n\nexport const QueueSectionTrigger = ({\n  children,\n  className,\n  ...props\n}: QueueSectionTriggerProps) => (\n  <CollapsibleTrigger asChild>\n    <button\n      className={cn(\n        \"group flex w-full items-center justify-between rounded-md bg-muted/40 px-3 py-2 text-left font-medium text-muted-foreground text-sm transition-colors hover:bg-muted\",\n        className\n      )}\n      type=\"button\"\n      {...props}\n    >\n      {children}\n    </button>\n  </CollapsibleTrigger>\n);\n\n// QueueSectionLabel - label content with icon and count\nexport type QueueSectionLabelProps = ComponentProps<\"span\"> & {\n  count?: number;\n  label: string;\n  icon?: React.ReactNode;\n};\n\nexport const QueueSectionLabel = ({\n  count,\n  label,\n  icon,\n  className,\n  ...props\n}: QueueSectionLabelProps) => (\n  <span className={cn(\"flex items-center gap-2\", className)} {...props}>\n    <ChevronDownIcon className=\"size-4 transition-transform group-data-[state=closed]:-rotate-90\" />\n    {icon}\n    <span>\n      {count} {label}\n    </span>\n  </span>\n);\n\n// QueueSectionContent - collapsible content area\nexport type QueueSectionContentProps = ComponentProps<\n  typeof CollapsibleContent\n>;\n\nexport const QueueSectionContent = ({\n  className,\n  ...props\n}: QueueSectionContentProps) => (\n  <CollapsibleContent className={cn(className)} {...props} />\n);\n\nexport type QueueProps = ComponentProps<\"div\">;\n\nexport const Queue = ({ className, ...props }: QueueProps) => (\n  <div\n    className={cn(\n      \"flex flex-col gap-2 rounded-xl border border-border bg-background px-3 pt-2 pb-2 shadow-xs\",\n      className\n    )}\n    {...props}\n  />\n);\n"
  },
  {
    "path": "components/ai-elements/reasoning.tsx",
    "content": "\"use client\";\n\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { BrainIcon, ChevronDownIcon } from \"lucide-react\";\nimport type { ComponentProps, ReactNode } from \"react\";\nimport { createContext, memo, useContext, useEffect, useState } from \"react\";\nimport { Streamdown } from \"streamdown\";\nimport {\n  Collapsible,\n  CollapsibleContent,\n  CollapsibleTrigger,\n} from \"@/components/ui/collapsible\";\nimport { cn } from \"@/lib/utils\";\nimport { Shimmer } from \"./shimmer\";\n\ntype ReasoningContextValue = {\n  isStreaming: boolean;\n  isOpen: boolean;\n  setIsOpen: (open: boolean) => void;\n  duration: number | undefined;\n};\n\nconst ReasoningContext = createContext<ReasoningContextValue | null>(null);\n\nexport const useReasoning = () => {\n  const context = useContext(ReasoningContext);\n  if (!context) {\n    throw new Error(\"Reasoning components must be used within Reasoning\");\n  }\n  return context;\n};\n\nexport type ReasoningProps = ComponentProps<typeof Collapsible> & {\n  isStreaming?: boolean;\n  open?: boolean;\n  defaultOpen?: boolean;\n  onOpenChange?: (open: boolean) => void;\n  duration?: number;\n};\n\nconst AUTO_CLOSE_DELAY = 300;\nconst MS_IN_S = 1000;\n\nexport const Reasoning = memo(\n  ({\n    className,\n    isStreaming = false,\n    open,\n    defaultOpen = true,\n    onOpenChange,\n    duration: durationProp,\n    children,\n    ...props\n  }: ReasoningProps) => {\n    const [isOpen, setIsOpen] = useControllableState({\n      prop: open,\n      defaultProp: defaultOpen,\n      onChange: onOpenChange,\n    });\n    const [duration, setDuration] = useControllableState({\n      prop: durationProp,\n      defaultProp: undefined,\n    });\n\n    const [hasAutoClosed, setHasAutoClosed] = useState(false);\n    const [startTime, setStartTime] = useState<number | null>(null);\n\n    // Track duration when streaming starts and ends\n    useEffect(() => {\n      if (isStreaming) {\n        if (startTime === null) {\n          setStartTime(Date.now());\n        }\n      } else if (startTime !== null) {\n        setDuration(Math.ceil((Date.now() - startTime) / MS_IN_S));\n        setStartTime(null);\n      }\n    }, [isStreaming, startTime, setDuration]);\n\n    // Auto-open when streaming starts, auto-close when streaming ends (once only)\n    useEffect(() => {\n      if (defaultOpen && !isStreaming && isOpen && !hasAutoClosed) {\n        // Add a small delay before closing to allow user to see the content\n        const timer = setTimeout(() => {\n          setIsOpen(false);\n          setHasAutoClosed(true);\n        }, AUTO_CLOSE_DELAY);\n\n        return () => clearTimeout(timer);\n      }\n    }, [isStreaming, isOpen, defaultOpen, setIsOpen, hasAutoClosed]);\n\n    const handleOpenChange = (newOpen: boolean) => {\n      setIsOpen(newOpen);\n    };\n\n    return (\n      <ReasoningContext.Provider\n        value={{ isStreaming, isOpen, setIsOpen, duration }}\n      >\n        <Collapsible\n          className={cn(\"not-prose mb-2\", className)}\n          onOpenChange={handleOpenChange}\n          open={isOpen}\n          {...props}\n        >\n          {children}\n        </Collapsible>\n      </ReasoningContext.Provider>\n    );\n  }\n);\n\nexport type ReasoningTriggerProps = ComponentProps<\n  typeof CollapsibleTrigger\n> & {\n  getThinkingMessage?: (isStreaming: boolean, duration?: number) => ReactNode;\n};\n\nconst defaultGetThinkingMessage = (isStreaming: boolean, duration?: number) => {\n  if (isStreaming || duration === 0) {\n    return <Shimmer duration={1}>Thinking</Shimmer>;\n  }\n  if (duration === undefined) {\n    return <span>Thought</span>;\n  }\n  return <span>{duration}s</span>;\n};\n\nexport const ReasoningTrigger = memo(\n  ({\n    className,\n    children,\n    getThinkingMessage = defaultGetThinkingMessage,\n    ...props\n  }: ReasoningTriggerProps) => {\n    const { isStreaming, isOpen, duration } = useReasoning();\n\n    return (\n      <CollapsibleTrigger\n        className={cn(\n          \"flex items-center gap-1 rounded-md px-1.5 py-0.5 text-[11px] text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\",\n          className\n        )}\n        {...props}\n      >\n        {children ?? (\n          <>\n            <BrainIcon className=\"size-3\" />\n            {getThinkingMessage(isStreaming, duration)}\n            <ChevronDownIcon\n              className={cn(\n                \"size-2.5 transition-transform\",\n                isOpen ? \"rotate-180\" : \"rotate-0\"\n              )}\n            />\n          </>\n        )}\n      </CollapsibleTrigger>\n    );\n  }\n);\n\nexport type ReasoningContentProps = ComponentProps<\n  typeof CollapsibleContent\n> & {\n  children: string;\n};\n\nexport const ReasoningContent = memo(\n  ({ className, children, ...props }: ReasoningContentProps) => (\n    <CollapsibleContent\n      className={cn(\n        \"mt-1.5 text-[11px] leading-relaxed\",\n        \"data-[state=closed]:fade-out-0 data-[state=closed]:slide-out-to-top-2 data-[state=open]:slide-in-from-top-2 text-muted-foreground outline-none data-[state=closed]:animate-out data-[state=open]:animate-in\",\n        className\n      )}\n      {...props}\n    >\n      <div className=\"max-h-48 overflow-y-auto rounded-md border border-border/50 bg-muted/30 p-2.5 text-[11px] **:text-[11px] [&_li]:my-0 [&_ol]:my-1 [&_p]:my-0 [&_ul]:my-1\">\n        <Streamdown>{children}</Streamdown>\n      </div>\n    </CollapsibleContent>\n  )\n);\n\nReasoning.displayName = \"Reasoning\";\nReasoningTrigger.displayName = \"ReasoningTrigger\";\nReasoningContent.displayName = \"ReasoningContent\";\n"
  },
  {
    "path": "components/ai-elements/shimmer.tsx",
    "content": "\"use client\";\n\nimport { motion } from \"motion/react\";\nimport {\n  type CSSProperties,\n  type ElementType,\n  type JSX,\n  memo,\n  useMemo,\n} from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport type TextShimmerProps = {\n  children: string;\n  as?: ElementType;\n  className?: string;\n  duration?: number;\n  spread?: number;\n};\n\nconst ShimmerComponent = ({\n  children,\n  as: Component = \"p\",\n  className,\n  duration = 2,\n  spread = 2,\n}: TextShimmerProps) => {\n  const MotionComponent = motion.create(\n    Component as keyof JSX.IntrinsicElements\n  );\n\n  const dynamicSpread = useMemo(\n    () => (children?.length ?? 0) * spread,\n    [children, spread]\n  );\n\n  return (\n    <MotionComponent\n      animate={{ backgroundPosition: \"0% center\" }}\n      className={cn(\n        \"relative inline-block bg-[length:250%_100%,auto] bg-clip-text text-transparent\",\n        \"[--bg:linear-gradient(90deg,#0000_calc(50%-var(--spread)),var(--color-background),#0000_calc(50%+var(--spread)))] [background-repeat:no-repeat,padding-box]\",\n        className\n      )}\n      initial={{ backgroundPosition: \"100% center\" }}\n      style={\n        {\n          \"--spread\": `${dynamicSpread}px`,\n          backgroundImage:\n            \"var(--bg), linear-gradient(var(--color-muted-foreground), var(--color-muted-foreground))\",\n        } as CSSProperties\n      }\n      transition={{\n        repeat: Number.POSITIVE_INFINITY,\n        duration,\n        ease: \"linear\",\n      }}\n    >\n      {children}\n    </MotionComponent>\n  );\n};\n\nexport const Shimmer = memo(ShimmerComponent);\n"
  },
  {
    "path": "components/ai-elements/sources.tsx",
    "content": "\"use client\";\n\nimport { BookIcon, ChevronDownIcon } from \"lucide-react\";\nimport type { ComponentProps } from \"react\";\nimport {\n  Collapsible,\n  CollapsibleContent,\n  CollapsibleTrigger,\n} from \"@/components/ui/collapsible\";\nimport { cn } from \"@/lib/utils\";\n\nexport type SourcesProps = ComponentProps<\"div\">;\n\nexport const Sources = ({ className, ...props }: SourcesProps) => (\n  <Collapsible\n    className={cn(\"not-prose mb-4 text-primary text-xs\", className)}\n    {...props}\n  />\n);\n\nexport type SourcesTriggerProps = ComponentProps<typeof CollapsibleTrigger> & {\n  count: number;\n};\n\nexport const SourcesTrigger = ({\n  className,\n  count,\n  children,\n  ...props\n}: SourcesTriggerProps) => (\n  <CollapsibleTrigger\n    className={cn(\"flex items-center gap-2\", className)}\n    {...props}\n  >\n    {children ?? (\n      <>\n        <p className=\"font-medium\">Used {count} sources</p>\n        <ChevronDownIcon className=\"h-4 w-4\" />\n      </>\n    )}\n  </CollapsibleTrigger>\n);\n\nexport type SourcesContentProps = ComponentProps<typeof CollapsibleContent>;\n\nexport const SourcesContent = ({\n  className,\n  ...props\n}: SourcesContentProps) => (\n  <CollapsibleContent\n    className={cn(\n      \"mt-3 flex w-fit flex-col gap-2\",\n      \"data-[state=closed]:fade-out-0 data-[state=closed]:slide-out-to-top-2 data-[state=open]:slide-in-from-top-2 outline-none data-[state=closed]:animate-out data-[state=open]:animate-in\",\n      className\n    )}\n    {...props}\n  />\n);\n\nexport type SourceProps = ComponentProps<\"a\">;\n\nexport const Source = ({ href, title, children, ...props }: SourceProps) => (\n  <a\n    className=\"flex items-center gap-2\"\n    href={href}\n    rel=\"noreferrer\"\n    target=\"_blank\"\n    {...props}\n  >\n    {children ?? (\n      <>\n        <BookIcon className=\"h-4 w-4\" />\n        <span className=\"block font-medium\">{title}</span>\n      </>\n    )}\n  </a>\n);\n"
  },
  {
    "path": "components/ai-elements/suggestion.tsx",
    "content": "\"use client\";\n\nimport type { ComponentProps } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport { ScrollArea, ScrollBar } from \"@/components/ui/scroll-area\";\nimport { cn } from \"@/lib/utils\";\n\nexport type SuggestionsProps = ComponentProps<typeof ScrollArea>;\n\nexport const Suggestions = ({\n  className,\n  children,\n  ...props\n}: SuggestionsProps) => (\n  <ScrollArea className=\"w-full overflow-x-auto whitespace-nowrap\" {...props}>\n    <div className={cn(\"flex w-max flex-nowrap items-center gap-2\", className)}>\n      {children}\n    </div>\n    <ScrollBar className=\"hidden\" orientation=\"horizontal\" />\n  </ScrollArea>\n);\n\nexport type SuggestionProps = Omit<ComponentProps<typeof Button>, \"onClick\"> & {\n  suggestion: string;\n  onClick?: (suggestion: string) => void;\n};\n\nexport const Suggestion = ({\n  suggestion,\n  onClick,\n  className,\n  variant = \"outline\",\n  size = \"sm\",\n  children,\n  ...props\n}: SuggestionProps) => {\n  const handleClick = () => {\n    onClick?.(suggestion);\n  };\n\n  return (\n    <Button\n      className={cn(\"cursor-pointer rounded-full px-4\", className)}\n      onClick={handleClick}\n      size={size}\n      type=\"button\"\n      variant={variant}\n      {...props}\n    >\n      {children || suggestion}\n    </Button>\n  );\n};\n"
  },
  {
    "path": "components/ai-elements/task.tsx",
    "content": "\"use client\";\n\nimport { ChevronDownIcon, SearchIcon } from \"lucide-react\";\nimport type { ComponentProps } from \"react\";\nimport {\n  Collapsible,\n  CollapsibleContent,\n  CollapsibleTrigger,\n} from \"@/components/ui/collapsible\";\nimport { cn } from \"@/lib/utils\";\n\nexport type TaskItemFileProps = ComponentProps<\"div\">;\n\nexport const TaskItemFile = ({\n  children,\n  className,\n  ...props\n}: TaskItemFileProps) => (\n  <div\n    className={cn(\n      \"inline-flex items-center gap-1 rounded-md border bg-secondary px-1.5 py-0.5 text-foreground text-xs\",\n      className\n    )}\n    {...props}\n  >\n    {children}\n  </div>\n);\n\nexport type TaskItemProps = ComponentProps<\"div\">;\n\nexport const TaskItem = ({ children, className, ...props }: TaskItemProps) => (\n  <div className={cn(\"text-muted-foreground text-sm\", className)} {...props}>\n    {children}\n  </div>\n);\n\nexport type TaskProps = ComponentProps<typeof Collapsible>;\n\nexport const Task = ({\n  defaultOpen = true,\n  className,\n  ...props\n}: TaskProps) => (\n  <Collapsible className={cn(className)} defaultOpen={defaultOpen} {...props} />\n);\n\nexport type TaskTriggerProps = ComponentProps<typeof CollapsibleTrigger> & {\n  title: string;\n};\n\nexport const TaskTrigger = ({\n  children,\n  className,\n  title,\n  ...props\n}: TaskTriggerProps) => (\n  <CollapsibleTrigger asChild className={cn(\"group\", className)} {...props}>\n    {children ?? (\n      <div className=\"flex w-full cursor-pointer items-center gap-2 text-muted-foreground text-sm transition-colors hover:text-foreground\">\n        <SearchIcon className=\"size-4\" />\n        <p className=\"text-sm\">{title}</p>\n        <ChevronDownIcon className=\"size-4 transition-transform group-data-[state=open]:rotate-180\" />\n      </div>\n    )}\n  </CollapsibleTrigger>\n);\n\nexport type TaskContentProps = ComponentProps<typeof CollapsibleContent>;\n\nexport const TaskContent = ({\n  children,\n  className,\n  ...props\n}: TaskContentProps) => (\n  <CollapsibleContent\n    className={cn(\n      \"data-[state=closed]:fade-out-0 data-[state=closed]:slide-out-to-top-2 data-[state=open]:slide-in-from-top-2 text-popover-foreground outline-none data-[state=closed]:animate-out data-[state=open]:animate-in\",\n      className\n    )}\n    {...props}\n  >\n    <div className=\"mt-4 space-y-2 border-muted border-l-2 pl-4\">\n      {children}\n    </div>\n  </CollapsibleContent>\n);\n"
  },
  {
    "path": "components/ai-elements/tool.tsx",
    "content": "\"use client\";\n\nimport type { ToolUIPart } from \"ai\";\nimport {\n  CheckCircleIcon,\n  ChevronDownIcon,\n  CircleIcon,\n  ClockIcon,\n  WrenchIcon,\n  XCircleIcon,\n} from \"lucide-react\";\nimport type { ComponentProps, ReactNode } from \"react\";\nimport { isValidElement } from \"react\";\nimport { Badge } from \"@/components/ui/badge\";\nimport {\n  Collapsible,\n  CollapsibleContent,\n  CollapsibleTrigger,\n} from \"@/components/ui/collapsible\";\nimport { cn } from \"@/lib/utils\";\n\nexport type ToolProps = ComponentProps<typeof Collapsible>;\n\nexport const Tool = ({ className, ...props }: ToolProps) => (\n  <Collapsible\n    className={cn(\"not-prose mb-4 w-full rounded-md border\", className)}\n    {...props}\n  />\n);\n\nexport type ToolHeaderProps = {\n  title?: string;\n  type: ToolUIPart[\"type\"];\n  state: ToolUIPart[\"state\"];\n  className?: string;\n};\n\nconst getStatusBadge = (status: ToolUIPart[\"state\"]) => {\n  const labels: Record<ToolUIPart[\"state\"], string> = {\n    \"input-streaming\": \"Pending\",\n    \"input-available\": \"Running\",\n    \"approval-requested\": \"Awaiting Approval\",\n    \"approval-responded\": \"Responded\",\n    \"output-available\": \"Completed\",\n    \"output-error\": \"Error\",\n    \"output-denied\": \"Denied\",\n  };\n\n  const icons: Record<ToolUIPart[\"state\"], ReactNode> = {\n    \"input-streaming\": <CircleIcon className=\"size-4\" />,\n    \"input-available\": <ClockIcon className=\"size-4 animate-pulse\" />,\n    \"approval-requested\": <ClockIcon className=\"size-4 text-yellow-600\" />,\n    \"approval-responded\": <CheckCircleIcon className=\"size-4 text-blue-600\" />,\n    \"output-available\": <CheckCircleIcon className=\"size-4 text-green-600\" />,\n    \"output-error\": <XCircleIcon className=\"size-4 text-red-600\" />,\n    \"output-denied\": <XCircleIcon className=\"size-4 text-orange-600\" />,\n  };\n\n  return (\n    <Badge className=\"gap-1.5 rounded-full text-xs\" variant=\"secondary\">\n      {icons[status]}\n      {labels[status]}\n    </Badge>\n  );\n};\n\nexport const ToolHeader = ({\n  className,\n  title,\n  type,\n  state,\n  ...props\n}: ToolHeaderProps) => (\n  <CollapsibleTrigger\n    className={cn(\n      \"flex w-full items-center justify-between gap-4 p-3\",\n      className\n    )}\n    {...props}\n  >\n    <div className=\"flex items-center gap-2\">\n      <WrenchIcon className=\"size-4 text-muted-foreground\" />\n      <span className=\"font-medium text-sm\">\n        {title ?? type.split(\"-\").slice(1).join(\"-\")}\n      </span>\n      {getStatusBadge(state)}\n    </div>\n    <ChevronDownIcon className=\"size-4 text-muted-foreground transition-transform group-data-[state=open]:rotate-180\" />\n  </CollapsibleTrigger>\n);\n\nexport type ToolContentProps = ComponentProps<typeof CollapsibleContent>;\n\nexport const ToolContent = ({ className, ...props }: ToolContentProps) => (\n  <CollapsibleContent\n    className={cn(\n      \"data-[state=closed]:fade-out-0 data-[state=closed]:slide-out-to-top-2 data-[state=open]:slide-in-from-top-2 text-popover-foreground outline-none data-[state=closed]:animate-out data-[state=open]:animate-in\",\n      className\n    )}\n    {...props}\n  />\n);\n\nexport type ToolInputProps = ComponentProps<\"div\"> & {\n  input: ToolUIPart[\"input\"];\n};\n\nexport const ToolInput = ({ className, input, ...props }: ToolInputProps) => (\n  <div className={cn(\"space-y-2 overflow-hidden p-4\", className)} {...props}>\n    <h4 className=\"font-medium text-muted-foreground text-xs uppercase tracking-wide\">\n      Parameters\n    </h4>\n    <pre className=\"overflow-x-auto rounded-md bg-muted/50 p-3 font-mono text-xs\">\n      {JSON.stringify(input, null, 2)}\n    </pre>\n  </div>\n);\n\nexport type ToolOutputProps = ComponentProps<\"div\"> & {\n  output: ToolUIPart[\"output\"];\n  errorText: ToolUIPart[\"errorText\"];\n};\n\nexport const ToolOutput = ({\n  className,\n  output,\n  errorText,\n  ...props\n}: ToolOutputProps) => {\n  if (!(output || errorText)) {\n    return null;\n  }\n\n  const renderOutput = () => {\n    if (typeof output === \"object\" && !isValidElement(output)) {\n      return (\n        <pre className=\"overflow-x-auto p-3 font-mono text-xs\">\n          {JSON.stringify(output, null, 2)}\n        </pre>\n      );\n    }\n    if (typeof output === \"string\") {\n      return (\n        <pre className=\"overflow-x-auto p-3 font-mono text-xs\">{output}</pre>\n      );\n    }\n    return <div className=\"p-3\">{output as ReactNode}</div>;\n  };\n\n  return (\n    <div className={cn(\"space-y-2 p-4\", className)} {...props}>\n      <h4 className=\"font-medium text-muted-foreground text-xs uppercase tracking-wide\">\n        {errorText ? \"Error\" : \"Result\"}\n      </h4>\n      <div\n        className={cn(\n          \"overflow-x-auto rounded-md text-xs [&_table]:w-full\",\n          errorText\n            ? \"bg-destructive/10 text-destructive\"\n            : \"bg-muted/50 text-foreground\"\n        )}\n      >\n        {errorText && <div className=\"p-3\">{errorText}</div>}\n        {!errorText && renderOutput()}\n      </div>\n    </div>\n  );\n};\n"
  },
  {
    "path": "components/ai-elements/toolbar.tsx",
    "content": "import { NodeToolbar, Position } from \"@xyflow/react\";\nimport type { ComponentProps } from \"react\";\nimport { cn } from \"@/lib/utils\";\n\ntype ToolbarProps = ComponentProps<typeof NodeToolbar>;\n\nexport const Toolbar = ({ className, ...props }: ToolbarProps) => (\n  <NodeToolbar\n    className={cn(\n      \"flex items-center gap-1 rounded-sm border bg-background p-1.5\",\n      className\n    )}\n    position={Position.Bottom}\n    {...props}\n  />\n);\n"
  },
  {
    "path": "components/ai-elements/web-preview.tsx",
    "content": "\"use client\";\n\nimport { ChevronDownIcon } from \"lucide-react\";\nimport type { ComponentProps, ReactNode } from \"react\";\nimport { createContext, useContext, useEffect, useState } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n  Collapsible,\n  CollapsibleContent,\n  CollapsibleTrigger,\n} from \"@/components/ui/collapsible\";\nimport { Input } from \"@/components/ui/input\";\nimport {\n  Tooltip,\n  TooltipContent,\n  TooltipProvider,\n  TooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { cn } from \"@/lib/utils\";\n\nexport type WebPreviewContextValue = {\n  url: string;\n  setUrl: (url: string) => void;\n  consoleOpen: boolean;\n  setConsoleOpen: (open: boolean) => void;\n};\n\nconst WebPreviewContext = createContext<WebPreviewContextValue | null>(null);\n\nconst useWebPreview = () => {\n  const context = useContext(WebPreviewContext);\n  if (!context) {\n    throw new Error(\"WebPreview components must be used within a WebPreview\");\n  }\n  return context;\n};\n\nexport type WebPreviewProps = ComponentProps<\"div\"> & {\n  defaultUrl?: string;\n  onUrlChange?: (url: string) => void;\n};\n\nexport const WebPreview = ({\n  className,\n  children,\n  defaultUrl = \"\",\n  onUrlChange,\n  ...props\n}: WebPreviewProps) => {\n  const [url, setUrl] = useState(defaultUrl);\n  const [consoleOpen, setConsoleOpen] = useState(false);\n\n  const handleUrlChange = (newUrl: string) => {\n    setUrl(newUrl);\n    onUrlChange?.(newUrl);\n  };\n\n  const contextValue: WebPreviewContextValue = {\n    url,\n    setUrl: handleUrlChange,\n    consoleOpen,\n    setConsoleOpen,\n  };\n\n  return (\n    <WebPreviewContext.Provider value={contextValue}>\n      <div\n        className={cn(\n          \"flex size-full flex-col rounded-lg border bg-card\",\n          className\n        )}\n        {...props}\n      >\n        {children}\n      </div>\n    </WebPreviewContext.Provider>\n  );\n};\n\nexport type WebPreviewNavigationProps = ComponentProps<\"div\">;\n\nexport const WebPreviewNavigation = ({\n  className,\n  children,\n  ...props\n}: WebPreviewNavigationProps) => (\n  <div\n    className={cn(\"flex items-center gap-1 border-b p-2\", className)}\n    {...props}\n  >\n    {children}\n  </div>\n);\n\nexport type WebPreviewNavigationButtonProps = ComponentProps<typeof Button> & {\n  tooltip?: string;\n};\n\nexport const WebPreviewNavigationButton = ({\n  onClick,\n  disabled,\n  tooltip,\n  children,\n  ...props\n}: WebPreviewNavigationButtonProps) => (\n  <TooltipProvider>\n    <Tooltip>\n      <TooltipTrigger asChild>\n        <Button\n          className=\"h-8 w-8 p-0 hover:text-foreground\"\n          disabled={disabled}\n          onClick={onClick}\n          size=\"sm\"\n          variant=\"ghost\"\n          {...props}\n        >\n          {children}\n        </Button>\n      </TooltipTrigger>\n      <TooltipContent>\n        <p>{tooltip}</p>\n      </TooltipContent>\n    </Tooltip>\n  </TooltipProvider>\n);\n\nexport type WebPreviewUrlProps = ComponentProps<typeof Input>;\n\nexport const WebPreviewUrl = ({\n  value,\n  onChange,\n  onKeyDown,\n  ...props\n}: WebPreviewUrlProps) => {\n  const { url, setUrl } = useWebPreview();\n  const [inputValue, setInputValue] = useState(url);\n\n  // Sync input value with context URL when it changes externally\n  useEffect(() => {\n    setInputValue(url);\n  }, [url]);\n\n  const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n    setInputValue(event.target.value);\n    onChange?.(event);\n  };\n\n  const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n    if (event.key === \"Enter\") {\n      const target = event.target as HTMLInputElement;\n      setUrl(target.value);\n    }\n    onKeyDown?.(event);\n  };\n\n  return (\n    <Input\n      className=\"h-8 flex-1 text-sm\"\n      onChange={onChange ?? handleChange}\n      onKeyDown={handleKeyDown}\n      placeholder=\"Enter URL...\"\n      value={value ?? inputValue}\n      {...props}\n    />\n  );\n};\n\nexport type WebPreviewBodyProps = ComponentProps<\"iframe\"> & {\n  loading?: ReactNode;\n};\n\nexport const WebPreviewBody = ({\n  className,\n  loading,\n  src,\n  ...props\n}: WebPreviewBodyProps) => {\n  const { url } = useWebPreview();\n\n  return (\n    <div className=\"flex-1\">\n      <iframe\n        className={cn(\"size-full\", className)}\n        sandbox=\"allow-scripts allow-same-origin allow-forms allow-popups allow-presentation\"\n        src={(src ?? url) || undefined}\n        title=\"Preview\"\n        {...props}\n      />\n      {loading}\n    </div>\n  );\n};\n\nexport type WebPreviewConsoleProps = ComponentProps<\"div\"> & {\n  logs?: Array<{\n    level: \"log\" | \"warn\" | \"error\";\n    message: string;\n    timestamp: Date;\n  }>;\n};\n\nexport const WebPreviewConsole = ({\n  className,\n  logs = [],\n  children,\n  ...props\n}: WebPreviewConsoleProps) => {\n  const { consoleOpen, setConsoleOpen } = useWebPreview();\n\n  return (\n    <Collapsible\n      className={cn(\"border-t bg-muted/50 font-mono text-sm\", className)}\n      onOpenChange={setConsoleOpen}\n      open={consoleOpen}\n      {...props}\n    >\n      <CollapsibleTrigger asChild>\n        <Button\n          className=\"flex w-full items-center justify-between p-4 text-left font-medium hover:bg-muted/50\"\n          variant=\"ghost\"\n        >\n          Console\n          <ChevronDownIcon\n            className={cn(\n              \"h-4 w-4 transition-transform duration-200\",\n              consoleOpen && \"rotate-180\"\n            )}\n          />\n        </Button>\n      </CollapsibleTrigger>\n      <CollapsibleContent\n        className={cn(\n          \"px-4 pb-4\",\n          \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 outline-none data-[state=closed]:animate-out data-[state=open]:animate-in\"\n        )}\n      >\n        <div className=\"max-h-48 space-y-1 overflow-y-auto\">\n          {logs.length === 0 ? (\n            <p className=\"text-muted-foreground\">No console output</p>\n          ) : (\n            logs.map((log) => (\n              <div\n                className={cn(\n                  \"text-xs\",\n                  log.level === \"error\" && \"text-destructive\",\n                  log.level === \"warn\" && \"text-yellow-600\",\n                  log.level === \"log\" && \"text-foreground\"\n                )}\n                key={`${log.timestamp.getTime()}-${log.message}`}\n              >\n                <span className=\"text-muted-foreground\">\n                  {log.timestamp.toLocaleTimeString()}\n                </span>{\" \"}\n                {log.message}\n              </div>\n            ))\n          )}\n          {children}\n        </div>\n      </CollapsibleContent>\n    </Collapsible>\n  );\n};\n"
  },
  {
    "path": "components/app-sidebar.tsx",
    "content": "\"use client\";\n\nimport Link from \"next/link\";\nimport { useRouter } from \"next/navigation\";\nimport type { User } from \"next-auth\";\nimport { useState } from \"react\";\nimport { toast } from \"sonner\";\nimport { useSWRConfig } from \"swr\";\nimport { unstable_serialize } from \"swr/infinite\";\nimport { PlusIcon, TrashIcon } from \"@/components/icons\";\nimport {\n  getChatHistoryPaginationKey,\n  SidebarHistory,\n} from \"@/components/sidebar-history\";\nimport { SidebarUserNav } from \"@/components/sidebar-user-nav\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n  Sidebar,\n  SidebarContent,\n  SidebarFooter,\n  SidebarHeader,\n  SidebarMenu,\n  useSidebar,\n} from \"@/components/ui/sidebar\";\nimport {\n  AlertDialog,\n  AlertDialogAction,\n  AlertDialogCancel,\n  AlertDialogContent,\n  AlertDialogDescription,\n  AlertDialogFooter,\n  AlertDialogHeader,\n  AlertDialogTitle,\n} from \"./ui/alert-dialog\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"./ui/tooltip\";\n\nexport function AppSidebar({ user }: { user: User | undefined }) {\n  const router = useRouter();\n  const { setOpenMobile } = useSidebar();\n  const { mutate } = useSWRConfig();\n  const [showDeleteAllDialog, setShowDeleteAllDialog] = useState(false);\n\n  const handleDeleteAll = () => {\n    const deletePromise = fetch(\"/api/history\", {\n      method: \"DELETE\",\n    });\n\n    toast.promise(deletePromise, {\n      loading: \"Deleting all chats...\",\n      success: () => {\n        mutate(unstable_serialize(getChatHistoryPaginationKey));\n        setShowDeleteAllDialog(false);\n        router.replace(\"/\");\n        router.refresh();\n        return \"All chats deleted successfully\";\n      },\n      error: \"Failed to delete all chats\",\n    });\n  };\n\n  return (\n    <>\n      <Sidebar className=\"group-data-[side=left]:border-r-0\">\n        <SidebarHeader>\n          <SidebarMenu>\n            <div className=\"flex flex-row items-center justify-between\">\n              <Link\n                className=\"flex flex-row items-center gap-3\"\n                href=\"/\"\n                onClick={() => {\n                  setOpenMobile(false);\n                }}\n              >\n                <span className=\"cursor-pointer rounded-md px-2 font-semibold text-lg hover:bg-muted\">\n                  Chatbot\n                </span>\n              </Link>\n              <div className=\"flex flex-row gap-1\">\n                {user && (\n                  <Tooltip>\n                    <TooltipTrigger asChild>\n                      <Button\n                        className=\"h-8 p-1 md:h-fit md:p-2\"\n                        onClick={() => setShowDeleteAllDialog(true)}\n                        type=\"button\"\n                        variant=\"ghost\"\n                      >\n                        <TrashIcon />\n                      </Button>\n                    </TooltipTrigger>\n                    <TooltipContent align=\"end\" className=\"hidden md:block\">\n                      Delete All Chats\n                    </TooltipContent>\n                  </Tooltip>\n                )}\n                <Tooltip>\n                  <TooltipTrigger asChild>\n                    <Button\n                      className=\"h-8 p-1 md:h-fit md:p-2\"\n                      onClick={() => {\n                        setOpenMobile(false);\n                        router.push(\"/\");\n                        router.refresh();\n                      }}\n                      type=\"button\"\n                      variant=\"ghost\"\n                    >\n                      <PlusIcon />\n                    </Button>\n                  </TooltipTrigger>\n                  <TooltipContent align=\"end\" className=\"hidden md:block\">\n                    New Chat\n                  </TooltipContent>\n                </Tooltip>\n              </div>\n            </div>\n          </SidebarMenu>\n        </SidebarHeader>\n        <SidebarContent>\n          <SidebarHistory user={user} />\n        </SidebarContent>\n        <SidebarFooter>{user && <SidebarUserNav user={user} />}</SidebarFooter>\n      </Sidebar>\n\n      <AlertDialog\n        onOpenChange={setShowDeleteAllDialog}\n        open={showDeleteAllDialog}\n      >\n        <AlertDialogContent>\n          <AlertDialogHeader>\n            <AlertDialogTitle>Delete all chats?</AlertDialogTitle>\n            <AlertDialogDescription>\n              This action cannot be undone. This will permanently delete all\n              your chats and remove them from our servers.\n            </AlertDialogDescription>\n          </AlertDialogHeader>\n          <AlertDialogFooter>\n            <AlertDialogCancel>Cancel</AlertDialogCancel>\n            <AlertDialogAction onClick={handleDeleteAll}>\n              Delete All\n            </AlertDialogAction>\n          </AlertDialogFooter>\n        </AlertDialogContent>\n      </AlertDialog>\n    </>\n  );\n}\n"
  },
  {
    "path": "components/artifact-actions.tsx",
    "content": "import { type Dispatch, memo, type SetStateAction, useState } from \"react\";\nimport { toast } from \"sonner\";\nimport { cn } from \"@/lib/utils\";\nimport { artifactDefinitions, type UIArtifact } from \"./artifact\";\nimport type { ArtifactActionContext } from \"./create-artifact\";\nimport { Button } from \"./ui/button\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"./ui/tooltip\";\n\ntype ArtifactActionsProps = {\n  artifact: UIArtifact;\n  handleVersionChange: (type: \"next\" | \"prev\" | \"toggle\" | \"latest\") => void;\n  currentVersionIndex: number;\n  isCurrentVersion: boolean;\n  mode: \"edit\" | \"diff\";\n  metadata: any;\n  setMetadata: Dispatch<SetStateAction<any>>;\n};\n\nfunction PureArtifactActions({\n  artifact,\n  handleVersionChange,\n  currentVersionIndex,\n  isCurrentVersion,\n  mode,\n  metadata,\n  setMetadata,\n}: ArtifactActionsProps) {\n  const [isLoading, setIsLoading] = useState(false);\n\n  const artifactDefinition = artifactDefinitions.find(\n    (definition) => definition.kind === artifact.kind\n  );\n\n  if (!artifactDefinition) {\n    throw new Error(\"Artifact definition not found!\");\n  }\n\n  const actionContext: ArtifactActionContext = {\n    content: artifact.content,\n    handleVersionChange,\n    currentVersionIndex,\n    isCurrentVersion,\n    mode,\n    metadata,\n    setMetadata,\n  };\n\n  return (\n    <div className=\"flex flex-row gap-1\">\n      {artifactDefinition.actions.map((action) => (\n        <Tooltip key={action.description}>\n          <TooltipTrigger asChild>\n            <Button\n              className={cn(\"h-fit dark:hover:bg-zinc-700\", {\n                \"p-2\": !action.label,\n                \"px-2 py-1.5\": action.label,\n              })}\n              disabled={\n                isLoading || artifact.status === \"streaming\"\n                  ? true\n                  : action.isDisabled\n                    ? action.isDisabled(actionContext)\n                    : false\n              }\n              onClick={async () => {\n                setIsLoading(true);\n\n                try {\n                  await Promise.resolve(action.onClick(actionContext));\n                } catch (_error) {\n                  toast.error(\"Failed to execute action\");\n                } finally {\n                  setIsLoading(false);\n                }\n              }}\n              variant=\"outline\"\n            >\n              {action.icon}\n              {action.label}\n            </Button>\n          </TooltipTrigger>\n          <TooltipContent>{action.description}</TooltipContent>\n        </Tooltip>\n      ))}\n    </div>\n  );\n}\n\nexport const ArtifactActions = memo(\n  PureArtifactActions,\n  (prevProps, nextProps) => {\n    if (prevProps.artifact.status !== nextProps.artifact.status) {\n      return false;\n    }\n    if (prevProps.currentVersionIndex !== nextProps.currentVersionIndex) {\n      return false;\n    }\n    if (prevProps.isCurrentVersion !== nextProps.isCurrentVersion) {\n      return false;\n    }\n    if (prevProps.artifact.content !== nextProps.artifact.content) {\n      return false;\n    }\n\n    return true;\n  }\n);\n"
  },
  {
    "path": "components/artifact-close-button.tsx",
    "content": "import { memo } from \"react\";\nimport { initialArtifactData, useArtifact } from \"@/hooks/use-artifact\";\nimport { CrossIcon } from \"./icons\";\nimport { Button } from \"./ui/button\";\n\nfunction PureArtifactCloseButton() {\n  const { setArtifact } = useArtifact();\n\n  return (\n    <Button\n      className=\"h-fit p-2 dark:hover:bg-zinc-700\"\n      data-testid=\"artifact-close-button\"\n      onClick={() => {\n        setArtifact((currentArtifact) =>\n          currentArtifact.status === \"streaming\"\n            ? {\n                ...currentArtifact,\n                isVisible: false,\n              }\n            : { ...initialArtifactData, status: \"idle\" }\n        );\n      }}\n      variant=\"outline\"\n    >\n      <CrossIcon size={18} />\n    </Button>\n  );\n}\n\nexport const ArtifactCloseButton = memo(PureArtifactCloseButton, () => true);\n"
  },
  {
    "path": "components/artifact-messages.tsx",
    "content": "import type { UseChatHelpers } from \"@ai-sdk/react\";\nimport equal from \"fast-deep-equal\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { memo } from \"react\";\nimport { useMessages } from \"@/hooks/use-messages\";\nimport type { Vote } from \"@/lib/db/schema\";\nimport type { ChatMessage } from \"@/lib/types\";\nimport type { UIArtifact } from \"./artifact\";\nimport { PreviewMessage, ThinkingMessage } from \"./message\";\n\ntype ArtifactMessagesProps = {\n  addToolApprovalResponse: UseChatHelpers<ChatMessage>[\"addToolApprovalResponse\"];\n  chatId: string;\n  status: UseChatHelpers<ChatMessage>[\"status\"];\n  votes: Vote[] | undefined;\n  messages: ChatMessage[];\n  setMessages: UseChatHelpers<ChatMessage>[\"setMessages\"];\n  regenerate: UseChatHelpers<ChatMessage>[\"regenerate\"];\n  isReadonly: boolean;\n  artifactStatus: UIArtifact[\"status\"];\n};\n\nfunction PureArtifactMessages({\n  addToolApprovalResponse,\n  chatId,\n  status,\n  votes,\n  messages,\n  setMessages,\n  regenerate,\n  isReadonly,\n}: ArtifactMessagesProps) {\n  const {\n    containerRef: messagesContainerRef,\n    endRef: messagesEndRef,\n    onViewportEnter,\n    onViewportLeave,\n    hasSentMessage,\n  } = useMessages({\n    status,\n  });\n\n  return (\n    <div\n      className=\"flex h-full flex-col items-center gap-4 overflow-y-scroll px-4 pt-20\"\n      ref={messagesContainerRef}\n    >\n      {messages.map((message, index) => (\n        <PreviewMessage\n          addToolApprovalResponse={addToolApprovalResponse}\n          chatId={chatId}\n          isLoading={status === \"streaming\" && index === messages.length - 1}\n          isReadonly={isReadonly}\n          key={message.id}\n          message={message}\n          regenerate={regenerate}\n          requiresScrollPadding={\n            hasSentMessage && index === messages.length - 1\n          }\n          setMessages={setMessages}\n          vote={\n            votes\n              ? votes.find((vote) => vote.messageId === message.id)\n              : undefined\n          }\n        />\n      ))}\n\n      <AnimatePresence mode=\"wait\">\n        {status === \"submitted\" &&\n          !messages.some((msg) =>\n            msg.parts?.some(\n              (part) => \"state\" in part && part.state === \"approval-responded\"\n            )\n          ) && <ThinkingMessage key=\"thinking\" />}\n      </AnimatePresence>\n\n      <motion.div\n        className=\"min-h-[24px] min-w-[24px] shrink-0\"\n        onViewportEnter={onViewportEnter}\n        onViewportLeave={onViewportLeave}\n        ref={messagesEndRef}\n      />\n    </div>\n  );\n}\n\nfunction areEqual(\n  prevProps: ArtifactMessagesProps,\n  nextProps: ArtifactMessagesProps\n) {\n  if (\n    prevProps.artifactStatus === \"streaming\" &&\n    nextProps.artifactStatus === \"streaming\"\n  ) {\n    return true;\n  }\n\n  if (prevProps.status !== nextProps.status) {\n    return false;\n  }\n  if (prevProps.status && nextProps.status) {\n    return false;\n  }\n  if (prevProps.messages.length !== nextProps.messages.length) {\n    return false;\n  }\n  if (!equal(prevProps.votes, nextProps.votes)) {\n    return false;\n  }\n\n  return true;\n}\n\nexport const ArtifactMessages = memo(PureArtifactMessages, areEqual);\n"
  },
  {
    "path": "components/artifact.tsx",
    "content": "import type { UseChatHelpers } from \"@ai-sdk/react\";\nimport { formatDistance } from \"date-fns\";\nimport equal from \"fast-deep-equal\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport {\n  type Dispatch,\n  memo,\n  type SetStateAction,\n  useCallback,\n  useEffect,\n  useState,\n} from \"react\";\nimport useSWR, { useSWRConfig } from \"swr\";\nimport { useDebounceCallback, useWindowSize } from \"usehooks-ts\";\nimport { codeArtifact } from \"@/artifacts/code/client\";\nimport { imageArtifact } from \"@/artifacts/image/client\";\nimport { sheetArtifact } from \"@/artifacts/sheet/client\";\nimport { textArtifact } from \"@/artifacts/text/client\";\nimport { useArtifact } from \"@/hooks/use-artifact\";\nimport type { Document, Vote } from \"@/lib/db/schema\";\nimport type { Attachment, ChatMessage } from \"@/lib/types\";\nimport { fetcher } from \"@/lib/utils\";\nimport { ArtifactActions } from \"./artifact-actions\";\nimport { ArtifactCloseButton } from \"./artifact-close-button\";\nimport { ArtifactMessages } from \"./artifact-messages\";\nimport { MultimodalInput } from \"./multimodal-input\";\nimport { Toolbar } from \"./toolbar\";\nimport { useSidebar } from \"./ui/sidebar\";\nimport { VersionFooter } from \"./version-footer\";\nimport type { VisibilityType } from \"./visibility-selector\";\n\nexport const artifactDefinitions = [\n  textArtifact,\n  codeArtifact,\n  imageArtifact,\n  sheetArtifact,\n];\nexport type ArtifactKind = (typeof artifactDefinitions)[number][\"kind\"];\n\nexport type UIArtifact = {\n  title: string;\n  documentId: string;\n  kind: ArtifactKind;\n  content: string;\n  isVisible: boolean;\n  status: \"streaming\" | \"idle\";\n  boundingBox: {\n    top: number;\n    left: number;\n    width: number;\n    height: number;\n  };\n};\n\nfunction PureArtifact({\n  addToolApprovalResponse,\n  chatId,\n  input,\n  setInput,\n  status,\n  stop,\n  attachments,\n  setAttachments,\n  sendMessage,\n  messages,\n  setMessages,\n  regenerate,\n  votes,\n  isReadonly,\n  selectedVisibilityType,\n  selectedModelId,\n}: {\n  addToolApprovalResponse: UseChatHelpers<ChatMessage>[\"addToolApprovalResponse\"];\n  chatId: string;\n  input: string;\n  setInput: Dispatch<SetStateAction<string>>;\n  status: UseChatHelpers<ChatMessage>[\"status\"];\n  stop: UseChatHelpers<ChatMessage>[\"stop\"];\n  attachments: Attachment[];\n  setAttachments: Dispatch<SetStateAction<Attachment[]>>;\n  messages: ChatMessage[];\n  setMessages: UseChatHelpers<ChatMessage>[\"setMessages\"];\n  votes: Vote[] | undefined;\n  sendMessage: UseChatHelpers<ChatMessage>[\"sendMessage\"];\n  regenerate: UseChatHelpers<ChatMessage>[\"regenerate\"];\n  isReadonly: boolean;\n  selectedVisibilityType: VisibilityType;\n  selectedModelId: string;\n}) {\n  const { artifact, setArtifact, metadata, setMetadata } = useArtifact();\n\n  const {\n    data: documents,\n    isLoading: isDocumentsFetching,\n    mutate: mutateDocuments,\n  } = useSWR<Document[]>(\n    artifact.documentId !== \"init\" && artifact.status !== \"streaming\"\n      ? `/api/document?id=${artifact.documentId}`\n      : null,\n    fetcher\n  );\n\n  const [mode, setMode] = useState<\"edit\" | \"diff\">(\"edit\");\n  const [document, setDocument] = useState<Document | null>(null);\n  const [currentVersionIndex, setCurrentVersionIndex] = useState(-1);\n\n  const { open: isSidebarOpen } = useSidebar();\n\n  useEffect(() => {\n    if (documents && documents.length > 0) {\n      const mostRecentDocument = documents.at(-1);\n\n      if (mostRecentDocument) {\n        setDocument(mostRecentDocument);\n        setCurrentVersionIndex(documents.length - 1);\n        setArtifact((currentArtifact) => ({\n          ...currentArtifact,\n          content: mostRecentDocument.content ?? \"\",\n        }));\n      }\n    }\n  }, [documents, setArtifact]);\n\n  useEffect(() => {\n    mutateDocuments();\n  }, [mutateDocuments]);\n\n  const { mutate } = useSWRConfig();\n  const [isContentDirty, setIsContentDirty] = useState(false);\n\n  const handleContentChange = useCallback(\n    (updatedContent: string) => {\n      if (!artifact) {\n        return;\n      }\n\n      mutate<Document[]>(\n        `/api/document?id=${artifact.documentId}`,\n        async (currentDocuments) => {\n          if (!currentDocuments) {\n            return [];\n          }\n\n          const currentDocument = currentDocuments.at(-1);\n\n          if (!currentDocument || !currentDocument.content) {\n            setIsContentDirty(false);\n            return currentDocuments;\n          }\n\n          if (currentDocument.content !== updatedContent) {\n            await fetch(`/api/document?id=${artifact.documentId}`, {\n              method: \"POST\",\n              body: JSON.stringify({\n                title: artifact.title,\n                content: updatedContent,\n                kind: artifact.kind,\n              }),\n            });\n\n            setIsContentDirty(false);\n\n            const newDocument = {\n              ...currentDocument,\n              content: updatedContent,\n              createdAt: new Date(),\n            };\n\n            return [...currentDocuments, newDocument];\n          }\n          return currentDocuments;\n        },\n        { revalidate: false }\n      );\n    },\n    [artifact, mutate]\n  );\n\n  const debouncedHandleContentChange = useDebounceCallback(\n    handleContentChange,\n    2000\n  );\n\n  const saveContent = useCallback(\n    (updatedContent: string, debounce: boolean) => {\n      if (document && updatedContent !== document.content) {\n        setIsContentDirty(true);\n\n        if (debounce) {\n          debouncedHandleContentChange(updatedContent);\n        } else {\n          handleContentChange(updatedContent);\n        }\n      }\n    },\n    [document, debouncedHandleContentChange, handleContentChange]\n  );\n\n  function getDocumentContentById(index: number) {\n    if (!documents) {\n      return \"\";\n    }\n    if (!documents[index]) {\n      return \"\";\n    }\n    return documents[index].content ?? \"\";\n  }\n\n  const handleVersionChange = (type: \"next\" | \"prev\" | \"toggle\" | \"latest\") => {\n    if (!documents) {\n      return;\n    }\n\n    if (type === \"latest\") {\n      setCurrentVersionIndex(documents.length - 1);\n      setMode(\"edit\");\n    }\n\n    if (type === \"toggle\") {\n      setMode((currentMode) => (currentMode === \"edit\" ? \"diff\" : \"edit\"));\n    }\n\n    if (type === \"prev\") {\n      if (currentVersionIndex > 0) {\n        setCurrentVersionIndex((index) => index - 1);\n      }\n    } else if (type === \"next\" && currentVersionIndex < documents.length - 1) {\n      setCurrentVersionIndex((index) => index + 1);\n    }\n  };\n\n  const [isToolbarVisible, setIsToolbarVisible] = useState(false);\n\n  /*\n   * NOTE: if there are no documents, or if\n   * the documents are being fetched, then\n   * we mark it as the current version.\n   */\n\n  const isCurrentVersion =\n    documents && documents.length > 0\n      ? currentVersionIndex === documents.length - 1\n      : true;\n\n  const { width: windowWidth, height: windowHeight } = useWindowSize();\n  const isMobile = windowWidth ? windowWidth < 768 : false;\n\n  const artifactDefinition = artifactDefinitions.find(\n    (definition) => definition.kind === artifact.kind\n  );\n\n  if (!artifactDefinition) {\n    throw new Error(\"Artifact definition not found!\");\n  }\n\n  useEffect(() => {\n    if (artifact.documentId !== \"init\" && artifactDefinition.initialize) {\n      artifactDefinition.initialize({\n        documentId: artifact.documentId,\n        setMetadata,\n      });\n    }\n  }, [artifact.documentId, artifactDefinition, setMetadata]);\n\n  return (\n    <AnimatePresence>\n      {artifact.isVisible && (\n        <motion.div\n          animate={{ opacity: 1 }}\n          className=\"fixed top-0 left-0 z-50 flex h-dvh w-dvw flex-row bg-transparent\"\n          data-testid=\"artifact\"\n          exit={{ opacity: 0, transition: { delay: 0.4 } }}\n          initial={{ opacity: 1 }}\n        >\n          {!isMobile && (\n            <motion.div\n              animate={{ width: windowWidth, right: 0 }}\n              className=\"fixed h-dvh bg-background\"\n              exit={{\n                width: isSidebarOpen ? windowWidth - 256 : windowWidth,\n                right: 0,\n              }}\n              initial={{\n                width: isSidebarOpen ? windowWidth - 256 : windowWidth,\n                right: 0,\n              }}\n            />\n          )}\n\n          {!isMobile && (\n            <motion.div\n              animate={{\n                opacity: 1,\n                x: 0,\n                scale: 1,\n                transition: {\n                  delay: 0.1,\n                  type: \"spring\",\n                  stiffness: 300,\n                  damping: 30,\n                },\n              }}\n              className=\"relative h-dvh w-[400px] shrink-0 bg-muted dark:bg-background\"\n              exit={{\n                opacity: 0,\n                x: 0,\n                scale: 1,\n                transition: { duration: 0 },\n              }}\n              initial={{ opacity: 0, x: 10, scale: 1 }}\n            >\n              <AnimatePresence>\n                {!isCurrentVersion && (\n                  <motion.div\n                    animate={{ opacity: 1 }}\n                    className=\"absolute top-0 left-0 z-50 h-dvh w-[400px] bg-zinc-900/50\"\n                    exit={{ opacity: 0 }}\n                    initial={{ opacity: 0 }}\n                  />\n                )}\n              </AnimatePresence>\n\n              <div className=\"flex h-full flex-col items-center justify-between\">\n                <ArtifactMessages\n                  addToolApprovalResponse={addToolApprovalResponse}\n                  artifactStatus={artifact.status}\n                  chatId={chatId}\n                  isReadonly={isReadonly}\n                  messages={messages}\n                  regenerate={regenerate}\n                  setMessages={setMessages}\n                  status={status}\n                  votes={votes}\n                />\n\n                <div className=\"relative flex w-full flex-row items-end gap-2 px-4 pb-4\">\n                  <MultimodalInput\n                    attachments={attachments}\n                    chatId={chatId}\n                    className=\"bg-background dark:bg-muted\"\n                    input={input}\n                    messages={messages}\n                    selectedModelId={selectedModelId}\n                    selectedVisibilityType={selectedVisibilityType}\n                    sendMessage={sendMessage}\n                    setAttachments={setAttachments}\n                    setInput={setInput}\n                    setMessages={setMessages}\n                    status={status}\n                    stop={stop}\n                  />\n                </div>\n              </div>\n            </motion.div>\n          )}\n\n          <motion.div\n            animate={\n              isMobile\n                ? {\n                    opacity: 1,\n                    x: 0,\n                    y: 0,\n                    height: windowHeight,\n                    width: windowWidth ? windowWidth : \"calc(100dvw)\",\n                    borderRadius: 0,\n                    transition: {\n                      delay: 0,\n                      type: \"spring\",\n                      stiffness: 300,\n                      damping: 30,\n                      duration: 0.8,\n                    },\n                  }\n                : {\n                    opacity: 1,\n                    x: 400,\n                    y: 0,\n                    height: windowHeight,\n                    width: windowWidth\n                      ? windowWidth - 400\n                      : \"calc(100dvw-400px)\",\n                    borderRadius: 0,\n                    transition: {\n                      delay: 0,\n                      type: \"spring\",\n                      stiffness: 300,\n                      damping: 30,\n                      duration: 0.8,\n                    },\n                  }\n            }\n            className=\"fixed flex h-dvh flex-col overflow-y-scroll border-zinc-200 bg-background md:border-l dark:border-zinc-700 dark:bg-muted\"\n            exit={{\n              opacity: 0,\n              scale: 0.5,\n              transition: {\n                delay: 0.1,\n                type: \"spring\",\n                stiffness: 600,\n                damping: 30,\n              },\n            }}\n            initial={\n              isMobile\n                ? {\n                    opacity: 1,\n                    x: artifact.boundingBox.left,\n                    y: artifact.boundingBox.top,\n                    height: artifact.boundingBox.height,\n                    width: artifact.boundingBox.width,\n                    borderRadius: 50,\n                  }\n                : {\n                    opacity: 1,\n                    x: artifact.boundingBox.left,\n                    y: artifact.boundingBox.top,\n                    height: artifact.boundingBox.height,\n                    width: artifact.boundingBox.width,\n                    borderRadius: 50,\n                  }\n            }\n          >\n            <div className=\"flex flex-row items-start justify-between p-2\">\n              <div className=\"flex flex-row items-start gap-4\">\n                <ArtifactCloseButton />\n\n                <div className=\"flex flex-col\">\n                  <div className=\"font-medium\">{artifact.title}</div>\n\n                  {isContentDirty ? (\n                    <div className=\"text-muted-foreground text-sm\">\n                      Saving changes...\n                    </div>\n                  ) : document ? (\n                    <div className=\"text-muted-foreground text-sm\">\n                      {`Updated ${formatDistance(\n                        new Date(document.createdAt),\n                        new Date(),\n                        {\n                          addSuffix: true,\n                        }\n                      )}`}\n                    </div>\n                  ) : (\n                    <div className=\"mt-2 h-3 w-32 animate-pulse rounded-md bg-muted-foreground/20\" />\n                  )}\n                </div>\n              </div>\n\n              <ArtifactActions\n                artifact={artifact}\n                currentVersionIndex={currentVersionIndex}\n                handleVersionChange={handleVersionChange}\n                isCurrentVersion={isCurrentVersion}\n                metadata={metadata}\n                mode={mode}\n                setMetadata={setMetadata}\n              />\n            </div>\n\n            <div className=\"h-full max-w-full! items-center overflow-y-scroll bg-background dark:bg-muted\">\n              <artifactDefinition.content\n                content={\n                  isCurrentVersion\n                    ? artifact.content\n                    : getDocumentContentById(currentVersionIndex)\n                }\n                currentVersionIndex={currentVersionIndex}\n                getDocumentContentById={getDocumentContentById}\n                isCurrentVersion={isCurrentVersion}\n                isInline={false}\n                isLoading={isDocumentsFetching && !artifact.content}\n                metadata={metadata}\n                mode={mode}\n                onSaveContent={saveContent}\n                setMetadata={setMetadata}\n                status={artifact.status}\n                suggestions={[]}\n                title={artifact.title}\n              />\n\n              <AnimatePresence>\n                {isCurrentVersion && (\n                  <Toolbar\n                    artifactKind={artifact.kind}\n                    isToolbarVisible={isToolbarVisible}\n                    sendMessage={sendMessage}\n                    setIsToolbarVisible={setIsToolbarVisible}\n                    setMessages={setMessages}\n                    status={status}\n                    stop={stop}\n                  />\n                )}\n              </AnimatePresence>\n            </div>\n\n            <AnimatePresence>\n              {!isCurrentVersion && (\n                <VersionFooter\n                  currentVersionIndex={currentVersionIndex}\n                  documents={documents}\n                  handleVersionChange={handleVersionChange}\n                />\n              )}\n            </AnimatePresence>\n          </motion.div>\n        </motion.div>\n      )}\n    </AnimatePresence>\n  );\n}\n\nexport const Artifact = memo(PureArtifact, (prevProps, nextProps) => {\n  if (prevProps.status !== nextProps.status) {\n    return false;\n  }\n  if (!equal(prevProps.votes, nextProps.votes)) {\n    return false;\n  }\n  if (prevProps.input !== nextProps.input) {\n    return false;\n  }\n  if (!equal(prevProps.messages, nextProps.messages.length)) {\n    return false;\n  }\n  if (prevProps.selectedVisibilityType !== nextProps.selectedVisibilityType) {\n    return false;\n  }\n\n  return true;\n});\n"
  },
  {
    "path": "components/auth-form.tsx",
    "content": "import Form from \"next/form\";\n\nimport { Input } from \"./ui/input\";\nimport { Label } from \"./ui/label\";\n\nexport function AuthForm({\n  action,\n  children,\n  defaultEmail = \"\",\n}: {\n  action: NonNullable<\n    string | ((formData: FormData) => void | Promise<void>) | undefined\n  >;\n  children: React.ReactNode;\n  defaultEmail?: string;\n}) {\n  return (\n    <Form action={action} className=\"flex flex-col gap-4 px-4 sm:px-16\">\n      <div className=\"flex flex-col gap-2\">\n        <Label\n          className=\"font-normal text-zinc-600 dark:text-zinc-400\"\n          htmlFor=\"email\"\n        >\n          Email Address\n        </Label>\n\n        <Input\n          autoComplete=\"email\"\n          autoFocus\n          className=\"bg-muted text-md md:text-sm\"\n          defaultValue={defaultEmail}\n          id=\"email\"\n          name=\"email\"\n          placeholder=\"user@acme.com\"\n          required\n          type=\"email\"\n        />\n      </div>\n\n      <div className=\"flex flex-col gap-2\">\n        <Label\n          className=\"font-normal text-zinc-600 dark:text-zinc-400\"\n          htmlFor=\"password\"\n        >\n          Password\n        </Label>\n\n        <Input\n          className=\"bg-muted text-md md:text-sm\"\n          id=\"password\"\n          name=\"password\"\n          required\n          type=\"password\"\n        />\n      </div>\n\n      {children}\n    </Form>\n  );\n}\n"
  },
  {
    "path": "components/chat-header.tsx",
    "content": "\"use client\";\n\nimport Link from \"next/link\";\nimport { useRouter } from \"next/navigation\";\nimport { memo } from \"react\";\nimport { useWindowSize } from \"usehooks-ts\";\nimport { SidebarToggle } from \"@/components/sidebar-toggle\";\nimport { Button } from \"@/components/ui/button\";\nimport { PlusIcon, VercelIcon } from \"./icons\";\nimport { useSidebar } from \"./ui/sidebar\";\nimport { VisibilitySelector, type VisibilityType } from \"./visibility-selector\";\n\nfunction PureChatHeader({\n  chatId,\n  selectedVisibilityType,\n  isReadonly,\n}: {\n  chatId: string;\n  selectedVisibilityType: VisibilityType;\n  isReadonly: boolean;\n}) {\n  const router = useRouter();\n  const { open } = useSidebar();\n\n  const { width: windowWidth } = useWindowSize();\n\n  return (\n    <header className=\"sticky top-0 flex items-center gap-2 bg-background px-2 py-1.5 md:px-2\">\n      <SidebarToggle />\n\n      {(!open || windowWidth < 768) && (\n        <Button\n          className=\"order-2 ml-auto h-8 px-2 md:order-1 md:ml-0 md:h-fit md:px-2\"\n          onClick={() => {\n            router.push(\"/\");\n            router.refresh();\n          }}\n          variant=\"outline\"\n        >\n          <PlusIcon />\n          <span className=\"md:sr-only\">New Chat</span>\n        </Button>\n      )}\n\n      {!isReadonly && (\n        <VisibilitySelector\n          chatId={chatId}\n          className=\"order-1 md:order-2\"\n          selectedVisibilityType={selectedVisibilityType}\n        />\n      )}\n\n      <Button\n        asChild\n        className=\"order-3 hidden bg-zinc-900 px-2 text-zinc-50 hover:bg-zinc-800 md:ml-auto md:flex md:h-fit dark:bg-zinc-100 dark:text-zinc-900 dark:hover:bg-zinc-200\"\n      >\n        <Link\n          href={\"https://vercel.com/templates/next.js/chatbot\"}\n          rel=\"noreferrer\"\n          target=\"_noblank\"\n        >\n          <VercelIcon size={16} />\n          Deploy with Vercel\n        </Link>\n      </Button>\n    </header>\n  );\n}\n\nexport const ChatHeader = memo(PureChatHeader, (prevProps, nextProps) => {\n  return (\n    prevProps.chatId === nextProps.chatId &&\n    prevProps.selectedVisibilityType === nextProps.selectedVisibilityType &&\n    prevProps.isReadonly === nextProps.isReadonly\n  );\n});\n"
  },
  {
    "path": "components/chat.tsx",
    "content": "\"use client\";\n\nimport { useChat } from \"@ai-sdk/react\";\nimport { DefaultChatTransport } from \"ai\";\nimport { useRouter, useSearchParams } from \"next/navigation\";\nimport { useEffect, useRef, useState } from \"react\";\nimport useSWR, { useSWRConfig } from \"swr\";\nimport { unstable_serialize } from \"swr/infinite\";\nimport { ChatHeader } from \"@/components/chat-header\";\nimport {\n  AlertDialog,\n  AlertDialogAction,\n  AlertDialogCancel,\n  AlertDialogContent,\n  AlertDialogDescription,\n  AlertDialogFooter,\n  AlertDialogHeader,\n  AlertDialogTitle,\n} from \"@/components/ui/alert-dialog\";\nimport { useArtifactSelector } from \"@/hooks/use-artifact\";\nimport { useAutoResume } from \"@/hooks/use-auto-resume\";\nimport { useChatVisibility } from \"@/hooks/use-chat-visibility\";\nimport type { Vote } from \"@/lib/db/schema\";\nimport { ChatbotError } from \"@/lib/errors\";\nimport type { Attachment, ChatMessage } from \"@/lib/types\";\nimport { fetcher, fetchWithErrorHandlers, generateUUID } from \"@/lib/utils\";\nimport { Artifact } from \"./artifact\";\nimport { useDataStream } from \"./data-stream-provider\";\nimport { Messages } from \"./messages\";\nimport { MultimodalInput } from \"./multimodal-input\";\nimport { getChatHistoryPaginationKey } from \"./sidebar-history\";\nimport { toast } from \"./toast\";\nimport type { VisibilityType } from \"./visibility-selector\";\n\nexport function Chat({\n  id,\n  initialMessages,\n  initialChatModel,\n  initialVisibilityType,\n  isReadonly,\n  autoResume,\n}: {\n  id: string;\n  initialMessages: ChatMessage[];\n  initialChatModel: string;\n  initialVisibilityType: VisibilityType;\n  isReadonly: boolean;\n  autoResume: boolean;\n}) {\n  const router = useRouter();\n\n  const { visibilityType } = useChatVisibility({\n    chatId: id,\n    initialVisibilityType,\n  });\n\n  const { mutate } = useSWRConfig();\n\n  // Handle browser back/forward navigation\n  useEffect(() => {\n    const handlePopState = () => {\n      // When user navigates back/forward, refresh to sync with URL\n      router.refresh();\n    };\n\n    window.addEventListener(\"popstate\", handlePopState);\n    return () => window.removeEventListener(\"popstate\", handlePopState);\n  }, [router]);\n  const { setDataStream } = useDataStream();\n\n  const [input, setInput] = useState<string>(\"\");\n  const [showCreditCardAlert, setShowCreditCardAlert] = useState(false);\n  const [currentModelId, setCurrentModelId] = useState(initialChatModel);\n  const currentModelIdRef = useRef(currentModelId);\n\n  useEffect(() => {\n    currentModelIdRef.current = currentModelId;\n  }, [currentModelId]);\n\n  const {\n    messages,\n    setMessages,\n    sendMessage,\n    status,\n    stop,\n    regenerate,\n    resumeStream,\n    addToolApprovalResponse,\n  } = useChat<ChatMessage>({\n    id,\n    messages: initialMessages,\n    generateId: generateUUID,\n    sendAutomaticallyWhen: ({ messages: currentMessages }) => {\n      const lastMessage = currentMessages.at(-1);\n      const shouldContinue =\n        lastMessage?.parts?.some(\n          (part) =>\n            \"state\" in part &&\n            part.state === \"approval-responded\" &&\n            \"approval\" in part &&\n            (part.approval as { approved?: boolean })?.approved === true\n        ) ?? false;\n      return shouldContinue;\n    },\n    transport: new DefaultChatTransport({\n      api: \"/api/chat\",\n      fetch: fetchWithErrorHandlers,\n      prepareSendMessagesRequest(request) {\n        const lastMessage = request.messages.at(-1);\n        const isToolApprovalContinuation =\n          lastMessage?.role !== \"user\" ||\n          request.messages.some((msg) =>\n            msg.parts?.some((part) => {\n              const state = (part as { state?: string }).state;\n              return (\n                state === \"approval-responded\" || state === \"output-denied\"\n              );\n            })\n          );\n\n        return {\n          body: {\n            id: request.id,\n            ...(isToolApprovalContinuation\n              ? { messages: request.messages }\n              : { message: lastMessage }),\n            selectedChatModel: currentModelIdRef.current,\n            selectedVisibilityType: visibilityType,\n            ...request.body,\n          },\n        };\n      },\n    }),\n    onData: (dataPart) => {\n      setDataStream((ds) => (ds ? [...ds, dataPart] : []));\n    },\n    onFinish: () => {\n      mutate(unstable_serialize(getChatHistoryPaginationKey));\n    },\n    onError: (error) => {\n      if (error.message?.includes(\"AI Gateway requires a valid credit card\")) {\n        setShowCreditCardAlert(true);\n      } else if (error instanceof ChatbotError) {\n        toast({\n          type: \"error\",\n          description: error.message,\n        });\n      } else {\n        toast({\n          type: \"error\",\n          description: error.message || \"Oops, an error occurred!\",\n        });\n      }\n    },\n  });\n\n  const searchParams = useSearchParams();\n  const query = searchParams.get(\"query\");\n\n  const [hasAppendedQuery, setHasAppendedQuery] = useState(false);\n\n  useEffect(() => {\n    if (query && !hasAppendedQuery) {\n      sendMessage({\n        role: \"user\" as const,\n        parts: [{ type: \"text\", text: query }],\n      });\n\n      setHasAppendedQuery(true);\n      window.history.replaceState({}, \"\", `/chat/${id}`);\n    }\n  }, [query, sendMessage, hasAppendedQuery, id]);\n\n  const { data: votes } = useSWR<Vote[]>(\n    messages.length >= 2 ? `/api/vote?chatId=${id}` : null,\n    fetcher\n  );\n\n  const [attachments, setAttachments] = useState<Attachment[]>([]);\n  const isArtifactVisible = useArtifactSelector((state) => state.isVisible);\n\n  useAutoResume({\n    autoResume,\n    initialMessages,\n    resumeStream,\n    setMessages,\n  });\n\n  return (\n    <>\n      <div className=\"overscroll-behavior-contain flex h-dvh min-w-0 touch-pan-y flex-col bg-background\">\n        <ChatHeader\n          chatId={id}\n          isReadonly={isReadonly}\n          selectedVisibilityType={initialVisibilityType}\n        />\n\n        <Messages\n          addToolApprovalResponse={addToolApprovalResponse}\n          chatId={id}\n          isArtifactVisible={isArtifactVisible}\n          isReadonly={isReadonly}\n          messages={messages}\n          regenerate={regenerate}\n          selectedModelId={initialChatModel}\n          setMessages={setMessages}\n          status={status}\n          votes={votes}\n        />\n\n        <div className=\"sticky bottom-0 z-1 mx-auto flex w-full max-w-4xl gap-2 border-t-0 bg-background px-2 pb-3 md:px-4 md:pb-4\">\n          {!isReadonly && (\n            <MultimodalInput\n              attachments={attachments}\n              chatId={id}\n              input={input}\n              messages={messages}\n              onModelChange={setCurrentModelId}\n              selectedModelId={currentModelId}\n              selectedVisibilityType={visibilityType}\n              sendMessage={sendMessage}\n              setAttachments={setAttachments}\n              setInput={setInput}\n              setMessages={setMessages}\n              status={status}\n              stop={stop}\n            />\n          )}\n        </div>\n      </div>\n\n      <Artifact\n        addToolApprovalResponse={addToolApprovalResponse}\n        attachments={attachments}\n        chatId={id}\n        input={input}\n        isReadonly={isReadonly}\n        messages={messages}\n        regenerate={regenerate}\n        selectedModelId={currentModelId}\n        selectedVisibilityType={visibilityType}\n        sendMessage={sendMessage}\n        setAttachments={setAttachments}\n        setInput={setInput}\n        setMessages={setMessages}\n        status={status}\n        stop={stop}\n        votes={votes}\n      />\n\n      <AlertDialog\n        onOpenChange={setShowCreditCardAlert}\n        open={showCreditCardAlert}\n      >\n        <AlertDialogContent>\n          <AlertDialogHeader>\n            <AlertDialogTitle>Activate AI Gateway</AlertDialogTitle>\n            <AlertDialogDescription>\n              This application requires{\" \"}\n              {process.env.NODE_ENV === \"production\" ? \"the owner\" : \"you\"} to\n              activate Vercel AI Gateway.\n            </AlertDialogDescription>\n          </AlertDialogHeader>\n          <AlertDialogFooter>\n            <AlertDialogCancel>Cancel</AlertDialogCancel>\n            <AlertDialogAction\n              onClick={() => {\n                window.open(\n                  \"https://vercel.com/d?to=%2F%5Bteam%5D%2F%7E%2Fai%3Fmodal%3Dadd-credit-card\",\n                  \"_blank\"\n                );\n                window.location.href = \"/\";\n              }}\n            >\n              Activate\n            </AlertDialogAction>\n          </AlertDialogFooter>\n        </AlertDialogContent>\n      </AlertDialog>\n    </>\n  );\n}\n"
  },
  {
    "path": "components/code-editor.tsx",
    "content": "\"use client\";\n\nimport { python } from \"@codemirror/lang-python\";\nimport { EditorState, Transaction } from \"@codemirror/state\";\nimport { oneDark } from \"@codemirror/theme-one-dark\";\nimport { EditorView } from \"@codemirror/view\";\nimport { basicSetup } from \"codemirror\";\nimport { memo, useEffect, useRef } from \"react\";\nimport type { Suggestion } from \"@/lib/db/schema\";\n\ntype EditorProps = {\n  content: string;\n  onSaveContent: (updatedContent: string, debounce: boolean) => void;\n  status: \"streaming\" | \"idle\";\n  isCurrentVersion: boolean;\n  currentVersionIndex: number;\n  suggestions: Suggestion[];\n};\n\nfunction PureCodeEditor({ content, onSaveContent, status }: EditorProps) {\n  const containerRef = useRef<HTMLDivElement>(null);\n  const editorRef = useRef<EditorView | null>(null);\n\n  useEffect(() => {\n    if (containerRef.current && !editorRef.current) {\n      const startState = EditorState.create({\n        doc: content,\n        extensions: [basicSetup, python(), oneDark],\n      });\n\n      editorRef.current = new EditorView({\n        state: startState,\n        parent: containerRef.current,\n      });\n    }\n\n    return () => {\n      if (editorRef.current) {\n        editorRef.current.destroy();\n        editorRef.current = null;\n      }\n    };\n    // NOTE: we only want to run this effect once\n    // eslint-disable-next-line\n  }, [content]);\n\n  useEffect(() => {\n    if (editorRef.current) {\n      const updateListener = EditorView.updateListener.of((update) => {\n        if (update.docChanged) {\n          const transaction = update.transactions.find(\n            (tr) => !tr.annotation(Transaction.remote)\n          );\n\n          if (transaction) {\n            const newContent = update.state.doc.toString();\n            onSaveContent(newContent, true);\n          }\n        }\n      });\n\n      const currentSelection = editorRef.current.state.selection;\n\n      const newState = EditorState.create({\n        doc: editorRef.current.state.doc,\n        extensions: [basicSetup, python(), oneDark, updateListener],\n        selection: currentSelection,\n      });\n\n      editorRef.current.setState(newState);\n    }\n  }, [onSaveContent]);\n\n  useEffect(() => {\n    if (editorRef.current && content) {\n      const currentContent = editorRef.current.state.doc.toString();\n\n      if (status === \"streaming\" || currentContent !== content) {\n        const transaction = editorRef.current.state.update({\n          changes: {\n            from: 0,\n            to: currentContent.length,\n            insert: content,\n          },\n          annotations: [Transaction.remote.of(true)],\n        });\n\n        editorRef.current.dispatch(transaction);\n      }\n    }\n  }, [content, status]);\n\n  return (\n    <div\n      className=\"not-prose relative w-full pb-[calc(80dvh)] text-sm\"\n      ref={containerRef}\n    />\n  );\n}\n\nfunction areEqual(prevProps: EditorProps, nextProps: EditorProps) {\n  if (prevProps.suggestions !== nextProps.suggestions) {\n    return false;\n  }\n  if (prevProps.currentVersionIndex !== nextProps.currentVersionIndex) {\n    return false;\n  }\n  if (prevProps.isCurrentVersion !== nextProps.isCurrentVersion) {\n    return false;\n  }\n  if (prevProps.status === \"streaming\" && nextProps.status === \"streaming\") {\n    return false;\n  }\n  if (prevProps.content !== nextProps.content) {\n    return false;\n  }\n\n  return true;\n}\n\nexport const CodeEditor = memo(PureCodeEditor, areEqual);\n"
  },
  {
    "path": "components/console.tsx",
    "content": "import {\n  type Dispatch,\n  type SetStateAction,\n  useCallback,\n  useEffect,\n  useRef,\n  useState,\n} from \"react\";\nimport { useArtifactSelector } from \"@/hooks/use-artifact\";\nimport { cn } from \"@/lib/utils\";\nimport { Loader } from \"./elements/loader\";\nimport { CrossSmallIcon, TerminalWindowIcon } from \"./icons\";\nimport { Button } from \"./ui/button\";\n\nexport type ConsoleOutputContent = {\n  type: \"text\" | \"image\";\n  value: string;\n};\n\nexport type ConsoleOutput = {\n  id: string;\n  status: \"in_progress\" | \"loading_packages\" | \"completed\" | \"failed\";\n  contents: ConsoleOutputContent[];\n};\n\ntype ConsoleProps = {\n  consoleOutputs: ConsoleOutput[];\n  setConsoleOutputs: Dispatch<SetStateAction<ConsoleOutput[]>>;\n};\n\nexport function Console({ consoleOutputs, setConsoleOutputs }: ConsoleProps) {\n  const [height, setHeight] = useState<number>(300);\n  const [isResizing, setIsResizing] = useState(false);\n  const consoleEndRef = useRef<HTMLDivElement>(null);\n\n  const isArtifactVisible = useArtifactSelector((state) => state.isVisible);\n\n  const minHeight = 100;\n  const maxHeight = 800;\n\n  const startResizing = useCallback(() => {\n    setIsResizing(true);\n  }, []);\n\n  const stopResizing = useCallback(() => {\n    setIsResizing(false);\n  }, []);\n\n  const resize = useCallback(\n    (e: MouseEvent) => {\n      if (isResizing) {\n        const newHeight = window.innerHeight - e.clientY;\n        if (newHeight >= minHeight && newHeight <= maxHeight) {\n          setHeight(newHeight);\n        }\n      }\n    },\n    [isResizing]\n  );\n\n  useEffect(() => {\n    window.addEventListener(\"mousemove\", resize);\n    window.addEventListener(\"mouseup\", stopResizing);\n    return () => {\n      window.removeEventListener(\"mousemove\", resize);\n      window.removeEventListener(\"mouseup\", stopResizing);\n    };\n  }, [resize, stopResizing]);\n\n  useEffect(() => {\n    consoleEndRef.current?.scrollIntoView({ behavior: \"smooth\" });\n  }, []);\n\n  useEffect(() => {\n    if (!isArtifactVisible) {\n      setConsoleOutputs([]);\n    }\n  }, [isArtifactVisible, setConsoleOutputs]);\n\n  return consoleOutputs.length > 0 ? (\n    <>\n      <div\n        aria-label=\"Resize console\"\n        aria-orientation=\"horizontal\"\n        aria-valuemax={maxHeight}\n        aria-valuemin={minHeight}\n        aria-valuenow={height}\n        className=\"fixed z-50 h-2 w-full cursor-ns-resize\"\n        onKeyDown={(e) => {\n          if (e.key === \"ArrowUp\") {\n            setHeight((prev) => Math.min(prev + 10, maxHeight));\n          } else if (e.key === \"ArrowDown\") {\n            setHeight((prev) => Math.max(prev - 10, minHeight));\n          }\n        }}\n        onMouseDown={startResizing}\n        role=\"slider\"\n        style={{ bottom: height - 4 }}\n        tabIndex={0}\n      />\n\n      <div\n        className={cn(\n          \"fixed bottom-0 z-40 flex w-full flex-col overflow-x-hidden overflow-y-scroll border-zinc-200 border-t bg-zinc-50 dark:border-zinc-700 dark:bg-zinc-900\",\n          {\n            \"select-none\": isResizing,\n          }\n        )}\n        style={{ height }}\n      >\n        <div className=\"sticky top-0 z-50 flex h-fit w-full flex-row items-center justify-between border-zinc-200 border-b bg-muted px-2 py-1 dark:border-zinc-700\">\n          <div className=\"flex flex-row items-center gap-3 pl-2 text-sm text-zinc-800 dark:text-zinc-50\">\n            <div className=\"text-muted-foreground\">\n              <TerminalWindowIcon />\n            </div>\n            <div>Console</div>\n          </div>\n          <Button\n            className=\"size-fit p-1 hover:bg-zinc-200 dark:hover:bg-zinc-700\"\n            onClick={() => setConsoleOutputs([])}\n            size=\"icon\"\n            variant=\"ghost\"\n          >\n            <CrossSmallIcon />\n          </Button>\n        </div>\n\n        <div>\n          {consoleOutputs.map((consoleOutput, index) => (\n            <div\n              className=\"flex flex-row border-zinc-200 border-b bg-zinc-50 px-4 py-2 font-mono text-sm dark:border-zinc-700 dark:bg-zinc-900\"\n              key={consoleOutput.id}\n            >\n              <div\n                className={cn(\"w-12 shrink-0\", {\n                  \"text-muted-foreground\": [\n                    \"in_progress\",\n                    \"loading_packages\",\n                  ].includes(consoleOutput.status),\n                  \"text-emerald-500\": consoleOutput.status === \"completed\",\n                  \"text-red-400\": consoleOutput.status === \"failed\",\n                })}\n              >\n                [{index + 1}]\n              </div>\n              {[\"in_progress\", \"loading_packages\"].includes(\n                consoleOutput.status\n              ) ? (\n                <div className=\"flex flex-row gap-2\">\n                  <div className=\"mt-0.5 mb-auto size-fit self-center\">\n                    <Loader size={16} />\n                  </div>\n                  <div className=\"text-muted-foreground\">\n                    {consoleOutput.status === \"in_progress\"\n                      ? \"Initializing...\"\n                      : consoleOutput.status === \"loading_packages\"\n                        ? consoleOutput.contents.map((content) =>\n                            content.type === \"text\" ? content.value : null\n                          )\n                        : null}\n                  </div>\n                </div>\n              ) : (\n                <div className=\"flex w-full flex-col gap-2 overflow-x-scroll text-zinc-900 dark:text-zinc-50\">\n                  {consoleOutput.contents.map((content) =>\n                    content.type === \"image\" ? (\n                      <picture key={`${consoleOutput.id}-${content.value}`}>\n                        <img\n                          alt=\"output\"\n                          className=\"w-full max-w-(--breakpoint-toast-mobile) rounded-md\"\n                          src={content.value}\n                        />\n                      </picture>\n                    ) : (\n                      <div\n                        className=\"w-full whitespace-pre-line break-words\"\n                        key={`${consoleOutput.id}-${content.value}`}\n                      >\n                        {content.value}\n                      </div>\n                    )\n                  )}\n                </div>\n              )}\n            </div>\n          ))}\n          <div ref={consoleEndRef} />\n        </div>\n      </div>\n    </>\n  ) : null;\n}\n"
  },
  {
    "path": "components/create-artifact.tsx",
    "content": "import type { UseChatHelpers } from \"@ai-sdk/react\";\nimport type { DataUIPart } from \"ai\";\nimport type { ComponentType, Dispatch, ReactNode, SetStateAction } from \"react\";\nimport type { Suggestion } from \"@/lib/db/schema\";\nimport type { ChatMessage, CustomUIDataTypes } from \"@/lib/types\";\nimport type { UIArtifact } from \"./artifact\";\n\nexport type ArtifactActionContext<M = any> = {\n  content: string;\n  handleVersionChange: (type: \"next\" | \"prev\" | \"toggle\" | \"latest\") => void;\n  currentVersionIndex: number;\n  isCurrentVersion: boolean;\n  mode: \"edit\" | \"diff\";\n  metadata: M;\n  setMetadata: Dispatch<SetStateAction<M>>;\n};\n\ntype ArtifactAction<M = any> = {\n  icon: ReactNode;\n  label?: string;\n  description: string;\n  onClick: (context: ArtifactActionContext<M>) => Promise<void> | void;\n  isDisabled?: (context: ArtifactActionContext<M>) => boolean;\n};\n\nexport type ArtifactToolbarContext = {\n  sendMessage: UseChatHelpers<ChatMessage>[\"sendMessage\"];\n};\n\nexport type ArtifactToolbarItem = {\n  description: string;\n  icon: ReactNode;\n  onClick: (context: ArtifactToolbarContext) => void;\n};\n\ntype ArtifactContent<M = any> = {\n  title: string;\n  content: string;\n  mode: \"edit\" | \"diff\";\n  isCurrentVersion: boolean;\n  currentVersionIndex: number;\n  status: \"streaming\" | \"idle\";\n  suggestions: Suggestion[];\n  onSaveContent: (updatedContent: string, debounce: boolean) => void;\n  isInline: boolean;\n  getDocumentContentById: (index: number) => string;\n  isLoading: boolean;\n  metadata: M;\n  setMetadata: Dispatch<SetStateAction<M>>;\n};\n\ntype InitializeParameters<M = any> = {\n  documentId: string;\n  setMetadata: Dispatch<SetStateAction<M>>;\n};\n\ntype ArtifactConfig<T extends string, M = any> = {\n  kind: T;\n  description: string;\n  content: ComponentType<ArtifactContent<M>>;\n  actions: ArtifactAction<M>[];\n  toolbar: ArtifactToolbarItem[];\n  initialize?: (parameters: InitializeParameters<M>) => void;\n  onStreamPart: (args: {\n    setMetadata: Dispatch<SetStateAction<M>>;\n    setArtifact: Dispatch<SetStateAction<UIArtifact>>;\n    streamPart: DataUIPart<CustomUIDataTypes>;\n  }) => void;\n};\n\nexport class Artifact<T extends string, M = any> {\n  readonly kind: T;\n  readonly description: string;\n  readonly content: ComponentType<ArtifactContent<M>>;\n  readonly actions: ArtifactAction<M>[];\n  readonly toolbar: ArtifactToolbarItem[];\n  readonly initialize?: (parameters: InitializeParameters) => void;\n  readonly onStreamPart: (args: {\n    setMetadata: Dispatch<SetStateAction<M>>;\n    setArtifact: Dispatch<SetStateAction<UIArtifact>>;\n    streamPart: DataUIPart<CustomUIDataTypes>;\n  }) => void;\n\n  constructor(config: ArtifactConfig<T, M>) {\n    this.kind = config.kind;\n    this.description = config.description;\n    this.content = config.content;\n    this.actions = config.actions || [];\n    this.toolbar = config.toolbar || [];\n    this.initialize = config.initialize || (async () => ({}));\n    this.onStreamPart = config.onStreamPart;\n  }\n}\n"
  },
  {
    "path": "components/data-stream-handler.tsx",
    "content": "\"use client\";\n\nimport { useEffect } from \"react\";\nimport { useSWRConfig } from \"swr\";\nimport { unstable_serialize } from \"swr/infinite\";\nimport { initialArtifactData, useArtifact } from \"@/hooks/use-artifact\";\nimport { artifactDefinitions } from \"./artifact\";\nimport { useDataStream } from \"./data-stream-provider\";\nimport { getChatHistoryPaginationKey } from \"./sidebar-history\";\n\nexport function DataStreamHandler() {\n  const { dataStream, setDataStream } = useDataStream();\n  const { mutate } = useSWRConfig();\n\n  const { artifact, setArtifact, setMetadata } = useArtifact();\n\n  useEffect(() => {\n    if (!dataStream?.length) {\n      return;\n    }\n\n    const newDeltas = dataStream.slice();\n    setDataStream([]);\n\n    for (const delta of newDeltas) {\n      // Handle chat title updates\n      if (delta.type === \"data-chat-title\") {\n        mutate(unstable_serialize(getChatHistoryPaginationKey));\n        continue;\n      }\n      const artifactDefinition = artifactDefinitions.find(\n        (currentArtifactDefinition) =>\n          currentArtifactDefinition.kind === artifact.kind\n      );\n\n      if (artifactDefinition?.onStreamPart) {\n        artifactDefinition.onStreamPart({\n          streamPart: delta,\n          setArtifact,\n          setMetadata,\n        });\n      }\n\n      setArtifact((draftArtifact) => {\n        if (!draftArtifact) {\n          return { ...initialArtifactData, status: \"streaming\" };\n        }\n\n        switch (delta.type) {\n          case \"data-id\":\n            return {\n              ...draftArtifact,\n              documentId: delta.data,\n              status: \"streaming\",\n            };\n\n          case \"data-title\":\n            return {\n              ...draftArtifact,\n              title: delta.data,\n              status: \"streaming\",\n            };\n\n          case \"data-kind\":\n            return {\n              ...draftArtifact,\n              kind: delta.data,\n              status: \"streaming\",\n            };\n\n          case \"data-clear\":\n            return {\n              ...draftArtifact,\n              content: \"\",\n              status: \"streaming\",\n            };\n\n          case \"data-finish\":\n            return {\n              ...draftArtifact,\n              status: \"idle\",\n            };\n\n          default:\n            return draftArtifact;\n        }\n      });\n    }\n  }, [dataStream, setArtifact, setMetadata, artifact, setDataStream, mutate]);\n\n  return null;\n}\n"
  },
  {
    "path": "components/data-stream-provider.tsx",
    "content": "\"use client\";\n\nimport type { DataUIPart } from \"ai\";\nimport type React from \"react\";\nimport { createContext, useContext, useMemo, useState } from \"react\";\nimport type { CustomUIDataTypes } from \"@/lib/types\";\n\ntype DataStreamContextValue = {\n  dataStream: DataUIPart<CustomUIDataTypes>[];\n  setDataStream: React.Dispatch<\n    React.SetStateAction<DataUIPart<CustomUIDataTypes>[]>\n  >;\n};\n\nconst DataStreamContext = createContext<DataStreamContextValue | null>(null);\n\nexport function DataStreamProvider({\n  children,\n}: {\n  children: React.ReactNode;\n}) {\n  const [dataStream, setDataStream] = useState<DataUIPart<CustomUIDataTypes>[]>(\n    []\n  );\n\n  const value = useMemo(() => ({ dataStream, setDataStream }), [dataStream]);\n\n  return (\n    <DataStreamContext.Provider value={value}>\n      {children}\n    </DataStreamContext.Provider>\n  );\n}\n\nexport function useDataStream() {\n  const context = useContext(DataStreamContext);\n  if (!context) {\n    throw new Error(\"useDataStream must be used within a DataStreamProvider\");\n  }\n  return context;\n}\n"
  },
  {
    "path": "components/diffview.tsx",
    "content": "import OrderedMap from \"orderedmap\";\nimport {\n  DOMParser,\n  type MarkSpec,\n  type Node as ProsemirrorNode,\n  Schema,\n} from \"prosemirror-model\";\nimport { schema } from \"prosemirror-schema-basic\";\nimport { addListNodes } from \"prosemirror-schema-list\";\nimport { EditorState } from \"prosemirror-state\";\nimport { EditorView } from \"prosemirror-view\";\nimport { useEffect, useRef } from \"react\";\nimport { renderToString } from \"react-dom/server\";\nimport { Streamdown } from \"streamdown\";\n\nimport { DiffType, diffEditor } from \"@/lib/editor/diff\";\n\nconst diffSchema = new Schema({\n  nodes: addListNodes(schema.spec.nodes, \"paragraph block*\", \"block\"),\n  marks: OrderedMap.from({\n    ...schema.spec.marks.toObject(),\n    diffMark: {\n      attrs: { type: { default: \"\" } },\n      toDOM(mark) {\n        let className = \"\";\n\n        switch (mark.attrs.type) {\n          case DiffType.Inserted:\n            className =\n              \"bg-green-100 text-green-700 dark:bg-green-500/70 dark:text-green-300\";\n            break;\n          case DiffType.Deleted:\n            className =\n              \"bg-red-100 line-through text-red-600 dark:bg-red-500/70 dark:text-red-300\";\n            break;\n          default:\n            className = \"\";\n        }\n        return [\"span\", { class: className }, 0];\n      },\n    } as MarkSpec,\n  }),\n});\n\nfunction computeDiff(oldDoc: ProsemirrorNode, newDoc: ProsemirrorNode) {\n  return diffEditor(diffSchema, oldDoc.toJSON(), newDoc.toJSON());\n}\n\ntype DiffEditorProps = {\n  oldContent: string;\n  newContent: string;\n};\n\nexport const DiffView = ({ oldContent, newContent }: DiffEditorProps) => {\n  const editorRef = useRef<HTMLDivElement>(null);\n  const viewRef = useRef<EditorView | null>(null);\n\n  useEffect(() => {\n    if (editorRef.current && !viewRef.current) {\n      const parser = DOMParser.fromSchema(diffSchema);\n\n      const oldHtmlContent = renderToString(\n        <Streamdown>{oldContent}</Streamdown>\n      );\n      const newHtmlContent = renderToString(\n        <Streamdown>{newContent}</Streamdown>\n      );\n\n      const oldContainer = document.createElement(\"div\");\n      oldContainer.innerHTML = oldHtmlContent;\n\n      const newContainer = document.createElement(\"div\");\n      newContainer.innerHTML = newHtmlContent;\n\n      const oldDoc = parser.parse(oldContainer);\n      const newDoc = parser.parse(newContainer);\n\n      const diffedDoc = computeDiff(oldDoc, newDoc);\n\n      const state = EditorState.create({\n        doc: diffedDoc,\n        plugins: [],\n      });\n\n      viewRef.current = new EditorView(editorRef.current, {\n        state,\n        editable: () => false,\n      });\n    }\n\n    return () => {\n      if (viewRef.current) {\n        viewRef.current.destroy();\n        viewRef.current = null;\n      }\n    };\n  }, [oldContent, newContent]);\n\n  return <div className=\"diff-editor\" ref={editorRef} />;\n};\n"
  },
  {
    "path": "components/document-preview.tsx",
    "content": "\"use client\";\n\nimport equal from \"fast-deep-equal\";\nimport {\n  type MouseEvent,\n  memo,\n  useCallback,\n  useEffect,\n  useMemo,\n  useRef,\n} from \"react\";\nimport useSWR from \"swr\";\nimport { useArtifact } from \"@/hooks/use-artifact\";\nimport type { Document } from \"@/lib/db/schema\";\nimport { cn, fetcher } from \"@/lib/utils\";\nimport type { ArtifactKind, UIArtifact } from \"./artifact\";\nimport { CodeEditor } from \"./code-editor\";\nimport { DocumentToolCall, DocumentToolResult } from \"./document\";\nimport { InlineDocumentSkeleton } from \"./document-skeleton\";\nimport { FileIcon, FullscreenIcon, ImageIcon, LoaderIcon } from \"./icons\";\nimport { ImageEditor } from \"./image-editor\";\nimport { SpreadsheetEditor } from \"./sheet-editor\";\nimport { Editor } from \"./text-editor\";\n\ntype DocumentPreviewProps = {\n  isReadonly: boolean;\n  result?: any;\n  args?: any;\n};\n\nexport function DocumentPreview({\n  isReadonly,\n  result,\n  args,\n}: DocumentPreviewProps) {\n  const { artifact, setArtifact } = useArtifact();\n\n  const { data: documents, isLoading: isDocumentsFetching } = useSWR<\n    Document[]\n  >(result ? `/api/document?id=${result.id}` : null, fetcher);\n\n  const previewDocument = useMemo(() => documents?.[0], [documents]);\n  const hitboxRef = useRef<HTMLDivElement>(null);\n\n  useEffect(() => {\n    const boundingBox = hitboxRef.current?.getBoundingClientRect();\n\n    if (artifact.documentId && boundingBox) {\n      setArtifact((currentArtifact) => ({\n        ...currentArtifact,\n        boundingBox: {\n          left: boundingBox.x,\n          top: boundingBox.y,\n          width: boundingBox.width,\n          height: boundingBox.height,\n        },\n      }));\n    }\n  }, [artifact.documentId, setArtifact]);\n\n  if (artifact.isVisible) {\n    if (result) {\n      return (\n        <DocumentToolResult\n          isReadonly={isReadonly}\n          result={{ id: result.id, title: result.title, kind: result.kind }}\n          type=\"create\"\n        />\n      );\n    }\n\n    if (args) {\n      return (\n        <DocumentToolCall\n          args={{ title: args.title, kind: args.kind }}\n          isReadonly={isReadonly}\n          type=\"create\"\n        />\n      );\n    }\n  }\n\n  if (isDocumentsFetching) {\n    return <LoadingSkeleton artifactKind={result.kind ?? args.kind} />;\n  }\n\n  const document: Document | null = previewDocument\n    ? previewDocument\n    : artifact.status === \"streaming\"\n      ? {\n          title: artifact.title,\n          kind: artifact.kind,\n          content: artifact.content,\n          id: artifact.documentId,\n          createdAt: new Date(),\n          userId: \"noop\",\n        }\n      : null;\n\n  if (!document) {\n    return <LoadingSkeleton artifactKind={artifact.kind} />;\n  }\n\n  return (\n    <div className=\"relative w-full max-w-[450px] cursor-pointer\">\n      <HitboxLayer\n        hitboxRef={hitboxRef}\n        result={result}\n        setArtifact={setArtifact}\n      />\n      <DocumentHeader\n        isStreaming={artifact.status === \"streaming\"}\n        kind={document.kind}\n        title={document.title}\n      />\n      <DocumentContent document={document} />\n    </div>\n  );\n}\n\nconst LoadingSkeleton = ({ artifactKind }: { artifactKind: ArtifactKind }) => (\n  <div className=\"w-full max-w-[450px]\">\n    <div className=\"flex h-[57px] flex-row items-center justify-between gap-2 rounded-t-2xl border border-b-0 p-4 dark:border-zinc-700 dark:bg-muted\">\n      <div className=\"flex flex-row items-center gap-3\">\n        <div className=\"text-muted-foreground\">\n          <div className=\"size-4 animate-pulse rounded-md bg-muted-foreground/20\" />\n        </div>\n        <div className=\"h-4 w-24 animate-pulse rounded-lg bg-muted-foreground/20\" />\n      </div>\n      <div>\n        <FullscreenIcon />\n      </div>\n    </div>\n    {artifactKind === \"image\" ? (\n      <div className=\"overflow-y-scroll rounded-b-2xl border border-t-0 bg-muted dark:border-zinc-700\">\n        <div className=\"h-[257px] w-full animate-pulse bg-muted-foreground/20\" />\n      </div>\n    ) : (\n      <div className=\"overflow-y-scroll rounded-b-2xl border border-t-0 bg-muted p-8 pt-4 dark:border-zinc-700\">\n        <InlineDocumentSkeleton />\n      </div>\n    )}\n  </div>\n);\n\nconst PureHitboxLayer = ({\n  hitboxRef,\n  result,\n  setArtifact,\n}: {\n  hitboxRef: React.RefObject<HTMLDivElement>;\n  result: any;\n  setArtifact: (\n    updaterFn: UIArtifact | ((currentArtifact: UIArtifact) => UIArtifact)\n  ) => void;\n}) => {\n  const handleClick = useCallback(\n    (event: MouseEvent<HTMLElement>) => {\n      const boundingBox = event.currentTarget.getBoundingClientRect();\n\n      setArtifact((artifact) =>\n        artifact.status === \"streaming\"\n          ? { ...artifact, isVisible: true }\n          : {\n              ...artifact,\n              title: result.title,\n              documentId: result.id,\n              kind: result.kind,\n              isVisible: true,\n              boundingBox: {\n                left: boundingBox.x,\n                top: boundingBox.y,\n                width: boundingBox.width,\n                height: boundingBox.height,\n              },\n            }\n      );\n    },\n    [setArtifact, result]\n  );\n\n  return (\n    <div\n      aria-hidden=\"true\"\n      className=\"absolute top-0 left-0 z-10 size-full rounded-xl\"\n      onClick={handleClick}\n      ref={hitboxRef}\n      role=\"presentation\"\n    >\n      <div className=\"flex w-full items-center justify-end p-4\">\n        <div className=\"absolute top-[13px] right-[9px] rounded-md p-2 hover:bg-zinc-100 dark:hover:bg-zinc-700\">\n          <FullscreenIcon />\n        </div>\n      </div>\n    </div>\n  );\n};\n\nconst HitboxLayer = memo(PureHitboxLayer, (prevProps, nextProps) => {\n  if (!equal(prevProps.result, nextProps.result)) {\n    return false;\n  }\n  return true;\n});\n\nconst PureDocumentHeader = ({\n  title,\n  kind,\n  isStreaming,\n}: {\n  title: string;\n  kind: ArtifactKind;\n  isStreaming: boolean;\n}) => (\n  <div className=\"flex flex-row items-start justify-between gap-2 rounded-t-2xl border border-b-0 p-4 sm:items-center dark:border-zinc-700 dark:bg-muted\">\n    <div className=\"flex flex-row items-start gap-3 sm:items-center\">\n      <div className=\"text-muted-foreground\">\n        {isStreaming ? (\n          <div className=\"animate-spin\">\n            <LoaderIcon />\n          </div>\n        ) : kind === \"image\" ? (\n          <ImageIcon />\n        ) : (\n          <FileIcon />\n        )}\n      </div>\n      <div className=\"-translate-y-1 font-medium sm:translate-y-0\">{title}</div>\n    </div>\n    <div className=\"w-8\" />\n  </div>\n);\n\nconst DocumentHeader = memo(PureDocumentHeader, (prevProps, nextProps) => {\n  if (prevProps.title !== nextProps.title) {\n    return false;\n  }\n  if (prevProps.isStreaming !== nextProps.isStreaming) {\n    return false;\n  }\n\n  return true;\n});\n\nconst DocumentContent = ({ document }: { document: Document }) => {\n  const { artifact } = useArtifact();\n\n  const containerClassName = cn(\n    \"h-[257px] overflow-y-scroll rounded-b-2xl border border-t-0 dark:border-zinc-700 dark:bg-muted\",\n    {\n      \"p-4 sm:px-14 sm:py-16\": document.kind === \"text\",\n      \"p-0\": document.kind === \"code\",\n    }\n  );\n\n  const commonProps = {\n    content: document.content ?? \"\",\n    isCurrentVersion: true,\n    currentVersionIndex: 0,\n    status: artifact.status,\n    saveContent: () => null,\n    suggestions: [],\n  };\n\n  const handleSaveContent = () => null;\n\n  return (\n    <div className={containerClassName}>\n      {document.kind === \"text\" ? (\n        <Editor {...commonProps} onSaveContent={handleSaveContent} />\n      ) : document.kind === \"code\" ? (\n        <div className=\"relative flex w-full flex-1\">\n          <div className=\"absolute inset-0\">\n            <CodeEditor {...commonProps} onSaveContent={handleSaveContent} />\n          </div>\n        </div>\n      ) : document.kind === \"sheet\" ? (\n        <div className=\"relative flex size-full flex-1 p-4\">\n          <div className=\"absolute inset-0\">\n            <SpreadsheetEditor {...commonProps} />\n          </div>\n        </div>\n      ) : document.kind === \"image\" ? (\n        <ImageEditor\n          content={document.content ?? \"\"}\n          currentVersionIndex={0}\n          isCurrentVersion={true}\n          isInline={true}\n          status={artifact.status}\n          title={document.title}\n        />\n      ) : null}\n    </div>\n  );\n};\n"
  },
  {
    "path": "components/document-skeleton.tsx",
    "content": "\"use client\";\n\nimport type { ArtifactKind } from \"./artifact\";\n\nexport const DocumentSkeleton = ({\n  artifactKind,\n}: {\n  artifactKind: ArtifactKind;\n}) => {\n  return artifactKind === \"image\" ? (\n    <div className=\"flex h-[calc(100dvh-60px)] w-full flex-col items-center justify-center gap-4\">\n      <div className=\"size-96 animate-pulse rounded-lg bg-muted-foreground/20\" />\n    </div>\n  ) : (\n    <div className=\"flex w-full flex-col gap-4\">\n      <div className=\"h-12 w-1/2 animate-pulse rounded-lg bg-muted-foreground/20\" />\n      <div className=\"h-5 w-full animate-pulse rounded-lg bg-muted-foreground/20\" />\n      <div className=\"h-5 w-full animate-pulse rounded-lg bg-muted-foreground/20\" />\n      <div className=\"h-5 w-1/3 animate-pulse rounded-lg bg-muted-foreground/20\" />\n      <div className=\"h-5 w-52 animate-pulse rounded-lg bg-transparent\" />\n      <div className=\"h-8 w-52 animate-pulse rounded-lg bg-muted-foreground/20\" />\n      <div className=\"h-5 w-2/3 animate-pulse rounded-lg bg-muted-foreground/20\" />\n    </div>\n  );\n};\n\nexport const InlineDocumentSkeleton = () => {\n  return (\n    <div className=\"flex w-full flex-col gap-4\">\n      <div className=\"h-4 w-48 animate-pulse rounded-lg bg-muted-foreground/20\" />\n      <div className=\"h-4 w-3/4 animate-pulse rounded-lg bg-muted-foreground/20\" />\n      <div className=\"h-4 w-1/2 animate-pulse rounded-lg bg-muted-foreground/20\" />\n      <div className=\"h-4 w-64 animate-pulse rounded-lg bg-muted-foreground/20\" />\n      <div className=\"h-4 w-40 animate-pulse rounded-lg bg-muted-foreground/20\" />\n      <div className=\"h-4 w-36 animate-pulse rounded-lg bg-muted-foreground/20\" />\n      <div className=\"h-4 w-64 animate-pulse rounded-lg bg-muted-foreground/20\" />\n    </div>\n  );\n};\n"
  },
  {
    "path": "components/document.tsx",
    "content": "import { memo } from \"react\";\nimport { toast } from \"sonner\";\nimport { useArtifact } from \"@/hooks/use-artifact\";\nimport type { ArtifactKind } from \"./artifact\";\nimport { FileIcon, LoaderIcon, MessageIcon, PencilEditIcon } from \"./icons\";\n\nconst getActionText = (\n  type: \"create\" | \"update\" | \"request-suggestions\",\n  tense: \"present\" | \"past\"\n) => {\n  switch (type) {\n    case \"create\":\n      return tense === \"present\" ? \"Creating\" : \"Created\";\n    case \"update\":\n      return tense === \"present\" ? \"Updating\" : \"Updated\";\n    case \"request-suggestions\":\n      return tense === \"present\"\n        ? \"Adding suggestions\"\n        : \"Added suggestions to\";\n    default:\n      return null;\n  }\n};\n\ntype DocumentToolResultProps = {\n  type: \"create\" | \"update\" | \"request-suggestions\";\n  result: { id: string; title: string; kind: ArtifactKind };\n  isReadonly: boolean;\n};\n\nfunction PureDocumentToolResult({\n  type,\n  result,\n  isReadonly,\n}: DocumentToolResultProps) {\n  const { setArtifact } = useArtifact();\n\n  return (\n    <button\n      className=\"flex w-fit cursor-pointer flex-row items-start gap-3 rounded-xl border bg-background px-3 py-2\"\n      onClick={(event) => {\n        if (isReadonly) {\n          toast.error(\n            \"Viewing files in shared chats is currently not supported.\"\n          );\n          return;\n        }\n\n        const rect = event.currentTarget.getBoundingClientRect();\n\n        const boundingBox = {\n          top: rect.top,\n          left: rect.left,\n          width: rect.width,\n          height: rect.height,\n        };\n\n        setArtifact((currentArtifact) => ({\n          documentId: result.id,\n          kind: result.kind,\n          content: currentArtifact.content,\n          title: result.title,\n          isVisible: true,\n          status: \"idle\",\n          boundingBox,\n        }));\n      }}\n      type=\"button\"\n    >\n      <div className=\"mt-1 text-muted-foreground\">\n        {type === \"create\" ? (\n          <FileIcon />\n        ) : type === \"update\" ? (\n          <PencilEditIcon />\n        ) : type === \"request-suggestions\" ? (\n          <MessageIcon />\n        ) : null}\n      </div>\n      <div className=\"text-left\">\n        {`${getActionText(type, \"past\")} \"${result.title}\"`}\n      </div>\n    </button>\n  );\n}\n\nexport const DocumentToolResult = memo(PureDocumentToolResult, () => true);\n\ntype DocumentToolCallProps = {\n  type: \"create\" | \"update\" | \"request-suggestions\";\n  args:\n    | { title: string; kind: ArtifactKind } // for create\n    | { id: string; description: string } // for update\n    | { documentId: string }; // for request-suggestions\n  isReadonly: boolean;\n};\n\nfunction PureDocumentToolCall({\n  type,\n  args,\n  isReadonly,\n}: DocumentToolCallProps) {\n  const { setArtifact } = useArtifact();\n\n  return (\n    <button\n      className=\"cursor pointer flex w-fit flex-row items-start justify-between gap-3 rounded-xl border px-3 py-2\"\n      onClick={(event) => {\n        if (isReadonly) {\n          toast.error(\n            \"Viewing files in shared chats is currently not supported.\"\n          );\n          return;\n        }\n\n        const rect = event.currentTarget.getBoundingClientRect();\n\n        const boundingBox = {\n          top: rect.top,\n          left: rect.left,\n          width: rect.width,\n          height: rect.height,\n        };\n\n        setArtifact((currentArtifact) => ({\n          ...currentArtifact,\n          isVisible: true,\n          boundingBox,\n        }));\n      }}\n      type=\"button\"\n    >\n      <div className=\"flex flex-row items-start gap-3\">\n        <div className=\"mt-1 text-zinc-500\">\n          {type === \"create\" ? (\n            <FileIcon />\n          ) : type === \"update\" ? (\n            <PencilEditIcon />\n          ) : type === \"request-suggestions\" ? (\n            <MessageIcon />\n          ) : null}\n        </div>\n\n        <div className=\"text-left\">\n          {`${getActionText(type, \"present\")} ${\n            type === \"create\" && \"title\" in args && args.title\n              ? `\"${args.title}\"`\n              : type === \"update\" && \"description\" in args\n                ? `\"${args.description}\"`\n                : type === \"request-suggestions\"\n                  ? \"for document\"\n                  : \"\"\n          }`}\n        </div>\n      </div>\n\n      <div className=\"mt-1 animate-spin\">{<LoaderIcon />}</div>\n    </button>\n  );\n}\n\nexport const DocumentToolCall = memo(PureDocumentToolCall, () => true);\n"
  },
  {
    "path": "components/elements/actions.tsx",
    "content": "\"use client\";\n\nimport type { ComponentProps } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n  Tooltip,\n  TooltipContent,\n  TooltipProvider,\n  TooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { cn } from \"@/lib/utils\";\n\nexport type ActionsProps = ComponentProps<\"div\">;\n\nexport const Actions = ({ className, children, ...props }: ActionsProps) => (\n  <div className={cn(\"flex items-center gap-1\", className)} {...props}>\n    {children}\n  </div>\n);\n\nexport type ActionProps = ComponentProps<typeof Button> & {\n  tooltip?: string;\n  label?: string;\n};\n\nexport const Action = ({\n  tooltip,\n  children,\n  label,\n  className,\n  variant = \"ghost\",\n  size = \"sm\",\n  ...props\n}: ActionProps) => {\n  const button = (\n    <Button\n      className={cn(\n        \"relative size-9 p-1.5 text-muted-foreground hover:text-foreground\",\n        className\n      )}\n      size={size}\n      type=\"button\"\n      variant={variant}\n      {...props}\n    >\n      {children}\n      <span className=\"sr-only\">{label || tooltip}</span>\n    </Button>\n  );\n\n  if (tooltip) {\n    return (\n      <TooltipProvider>\n        <Tooltip>\n          <TooltipTrigger asChild>{button}</TooltipTrigger>\n          <TooltipContent>\n            <p>{tooltip}</p>\n          </TooltipContent>\n        </Tooltip>\n      </TooltipProvider>\n    );\n  }\n\n  return button;\n};\n"
  },
  {
    "path": "components/elements/branch.tsx",
    "content": "\"use client\";\n\nimport type { UIMessage } from \"ai\";\nimport { ChevronLeftIcon, ChevronRightIcon } from \"lucide-react\";\nimport type { ComponentProps, HTMLAttributes, ReactElement } from \"react\";\nimport { createContext, useContext, useEffect, useMemo, useState } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport { cn } from \"@/lib/utils\";\n\ntype BranchContextType = {\n  currentBranch: number;\n  totalBranches: number;\n  goToPrevious: () => void;\n  goToNext: () => void;\n  branches: ReactElement[];\n  setBranches: (branches: ReactElement[]) => void;\n};\n\nconst BranchContext = createContext<BranchContextType | null>(null);\n\nconst useBranch = () => {\n  const context = useContext(BranchContext);\n\n  if (!context) {\n    throw new Error(\"Branch components must be used within Branch\");\n  }\n\n  return context;\n};\n\nexport type BranchProps = HTMLAttributes<HTMLDivElement> & {\n  defaultBranch?: number;\n  onBranchChange?: (branchIndex: number) => void;\n};\n\nexport const Branch = ({\n  defaultBranch = 0,\n  onBranchChange,\n  className,\n  ...props\n}: BranchProps) => {\n  const [currentBranch, setCurrentBranch] = useState(defaultBranch);\n  const [branches, setBranches] = useState<ReactElement[]>([]);\n\n  const handleBranchChange = (newBranch: number) => {\n    setCurrentBranch(newBranch);\n    onBranchChange?.(newBranch);\n  };\n\n  const goToPrevious = () => {\n    const newBranch =\n      currentBranch > 0 ? currentBranch - 1 : branches.length - 1;\n    handleBranchChange(newBranch);\n  };\n\n  const goToNext = () => {\n    const newBranch =\n      currentBranch < branches.length - 1 ? currentBranch + 1 : 0;\n    handleBranchChange(newBranch);\n  };\n\n  const contextValue: BranchContextType = {\n    currentBranch,\n    totalBranches: branches.length,\n    goToPrevious,\n    goToNext,\n    branches,\n    setBranches,\n  };\n\n  return (\n    <BranchContext.Provider value={contextValue}>\n      <div\n        className={cn(\"grid w-full gap-2 [&>div]:pb-0\", className)}\n        {...props}\n      />\n    </BranchContext.Provider>\n  );\n};\n\nexport type BranchMessagesProps = HTMLAttributes<HTMLDivElement>;\n\nexport const BranchMessages = ({ children, ...props }: BranchMessagesProps) => {\n  const { currentBranch, setBranches, branches } = useBranch();\n  const childrenArray = useMemo(\n    () => (Array.isArray(children) ? children : [children]),\n    [children]\n  );\n\n  // Use useEffect to update branches when they change\n  useEffect(() => {\n    if (branches.length !== childrenArray.length) {\n      setBranches(childrenArray);\n    }\n  }, [childrenArray, branches, setBranches]);\n\n  return childrenArray.map((branch, index) => (\n    <div\n      className={cn(\n        \"grid gap-2 overflow-hidden [&>div]:pb-0\",\n        index === currentBranch ? \"block\" : \"hidden\"\n      )}\n      key={branch.key}\n      {...props}\n    >\n      {branch}\n    </div>\n  ));\n};\n\nexport type BranchSelectorProps = HTMLAttributes<HTMLDivElement> & {\n  from: UIMessage[\"role\"];\n};\n\nexport const BranchSelector = ({\n  className,\n  from,\n  ...props\n}: BranchSelectorProps) => {\n  const { totalBranches } = useBranch();\n\n  // Don't render if there's only one branch\n  if (totalBranches <= 1) {\n    return null;\n  }\n\n  return (\n    <div\n      className={cn(\n        \"flex items-center gap-2 self-end px-10\",\n        from === \"assistant\" ? \"justify-start\" : \"justify-end\",\n        className\n      )}\n      {...props}\n    />\n  );\n};\n\nexport type BranchPreviousProps = ComponentProps<typeof Button>;\n\nexport const BranchPrevious = ({\n  className,\n  children,\n  ...props\n}: BranchPreviousProps) => {\n  const { goToPrevious, totalBranches } = useBranch();\n\n  return (\n    <Button\n      aria-label=\"Previous branch\"\n      className={cn(\n        \"size-7 shrink-0 rounded-full text-muted-foreground transition-colors\",\n        \"hover:bg-accent hover:text-foreground\",\n        \"disabled:pointer-events-none disabled:opacity-50\",\n        className\n      )}\n      disabled={totalBranches <= 1}\n      onClick={goToPrevious}\n      size=\"icon\"\n      type=\"button\"\n      variant=\"ghost\"\n      {...props}\n    >\n      {children ?? <ChevronLeftIcon size={14} />}\n    </Button>\n  );\n};\n\nexport type BranchNextProps = ComponentProps<typeof Button>;\n\nexport const BranchNext = ({\n  className,\n  children,\n  ...props\n}: BranchNextProps) => {\n  const { goToNext, totalBranches } = useBranch();\n\n  return (\n    <Button\n      aria-label=\"Next branch\"\n      className={cn(\n        \"size-7 shrink-0 rounded-full text-muted-foreground transition-colors\",\n        \"hover:bg-accent hover:text-foreground\",\n        \"disabled:pointer-events-none disabled:opacity-50\",\n        className\n      )}\n      disabled={totalBranches <= 1}\n      onClick={goToNext}\n      size=\"icon\"\n      type=\"button\"\n      variant=\"ghost\"\n      {...props}\n    >\n      {children ?? <ChevronRightIcon size={14} />}\n    </Button>\n  );\n};\n\nexport type BranchPageProps = HTMLAttributes<HTMLSpanElement>;\n\nexport const BranchPage = ({ className, ...props }: BranchPageProps) => {\n  const { currentBranch, totalBranches } = useBranch();\n\n  return (\n    <span\n      className={cn(\n        \"font-medium text-muted-foreground text-xs tabular-nums\",\n        className\n      )}\n      {...props}\n    >\n      {currentBranch + 1} of {totalBranches}\n    </span>\n  );\n};\n"
  },
  {
    "path": "components/elements/conversation.tsx",
    "content": "\"use client\";\n\nimport { ArrowDownIcon } from \"lucide-react\";\nimport type { ComponentProps } from \"react\";\nimport { useCallback } from \"react\";\nimport { StickToBottom, useStickToBottomContext } from \"use-stick-to-bottom\";\nimport { Button } from \"@/components/ui/button\";\nimport { cn } from \"@/lib/utils\";\n\nexport type ConversationProps = ComponentProps<typeof StickToBottom>;\n\nexport const Conversation = ({ className, ...props }: ConversationProps) => (\n  <StickToBottom\n    className={cn(\n      \"relative flex-1 touch-pan-y overflow-y-auto will-change-scroll\",\n      className\n    )}\n    initial=\"smooth\"\n    resize=\"smooth\"\n    role=\"log\"\n    {...props}\n  />\n);\n\nexport type ConversationContentProps = ComponentProps<\n  typeof StickToBottom.Content\n>;\n\nexport const ConversationContent = ({\n  className,\n  ...props\n}: ConversationContentProps) => (\n  <StickToBottom.Content className={cn(\"p-4\", className)} {...props} />\n);\n\nexport type ConversationScrollButtonProps = ComponentProps<typeof Button>;\n\nexport const ConversationScrollButton = ({\n  className,\n  ...props\n}: ConversationScrollButtonProps) => {\n  const { isAtBottom, scrollToBottom } = useStickToBottomContext();\n\n  const handleScrollToBottom = useCallback(() => {\n    scrollToBottom();\n  }, [scrollToBottom]);\n\n  return (\n    !isAtBottom && (\n      <Button\n        className={cn(\n          \"absolute bottom-4 left-1/2 z-10 -translate-x-1/2 rounded-full shadow-lg\",\n          className\n        )}\n        onClick={handleScrollToBottom}\n        size=\"icon\"\n        type=\"button\"\n        variant=\"outline\"\n        {...props}\n      >\n        <ArrowDownIcon className=\"size-4\" />\n      </Button>\n    )\n  );\n};\n"
  },
  {
    "path": "components/elements/image.tsx",
    "content": "import type { Experimental_GeneratedImage } from \"ai\";\nimport { cn } from \"@/lib/utils\";\n\nexport type ImageProps = Experimental_GeneratedImage & {\n  className?: string;\n  alt?: string;\n};\n\nexport const Image = ({\n  base64,\n  uint8Array,\n  mediaType,\n  ...props\n}: ImageProps) => (\n  // biome-ignore lint/performance/noImgElement: base64 data URLs require native img\n  <img\n    {...props}\n    alt={props.alt}\n    className={cn(\n      \"h-auto max-w-full overflow-hidden rounded-md\",\n      props.className\n    )}\n    src={`data:${mediaType};base64,${base64}`}\n  />\n);\n"
  },
  {
    "path": "components/elements/inline-citation.tsx",
    "content": "\"use client\";\n\nimport { ArrowLeftIcon, ArrowRightIcon } from \"lucide-react\";\nimport {\n  type ComponentProps,\n  createContext,\n  useCallback,\n  useContext,\n  useEffect,\n  useState,\n} from \"react\";\nimport { Badge } from \"@/components/ui/badge\";\nimport {\n  Carousel,\n  type CarouselApi,\n  CarouselContent,\n  CarouselItem,\n} from \"@/components/ui/carousel\";\nimport {\n  HoverCard,\n  HoverCardContent,\n  HoverCardTrigger,\n} from \"@/components/ui/hover-card\";\nimport { cn } from \"@/lib/utils\";\n\nexport type InlineCitationProps = ComponentProps<\"span\">;\n\nexport const InlineCitation = ({\n  className,\n  ...props\n}: InlineCitationProps) => (\n  <span\n    className={cn(\"group inline items-center gap-1\", className)}\n    {...props}\n  />\n);\n\nexport type InlineCitationTextProps = ComponentProps<\"span\">;\n\nexport const InlineCitationText = ({\n  className,\n  ...props\n}: InlineCitationTextProps) => (\n  <span\n    className={cn(\"transition-colors group-hover:bg-accent\", className)}\n    {...props}\n  />\n);\n\nexport type InlineCitationCardProps = ComponentProps<typeof HoverCard>;\n\nexport const InlineCitationCard = (props: InlineCitationCardProps) => (\n  <HoverCard closeDelay={0} openDelay={0} {...props} />\n);\n\nexport type InlineCitationCardTriggerProps = ComponentProps<typeof Badge> & {\n  sources: string[];\n};\n\nexport const InlineCitationCardTrigger = ({\n  sources,\n  className,\n  ...props\n}: InlineCitationCardTriggerProps) => (\n  <HoverCardTrigger asChild>\n    <Badge\n      className={cn(\"ml-1 rounded-full\", className)}\n      variant=\"secondary\"\n      {...props}\n    >\n      {sources.length ? (\n        <>\n          {new URL(sources[0]).hostname}{\" \"}\n          {sources.length > 1 && `+${sources.length - 1}`}\n        </>\n      ) : (\n        \"unknown\"\n      )}\n    </Badge>\n  </HoverCardTrigger>\n);\n\nexport type InlineCitationCardBodyProps = ComponentProps<\"div\">;\n\nexport const InlineCitationCardBody = ({\n  className,\n  ...props\n}: InlineCitationCardBodyProps) => (\n  <HoverCardContent className={cn(\"relative w-80 p-0\", className)} {...props} />\n);\n\nconst CarouselApiContext = createContext<CarouselApi | undefined>(undefined);\n\nconst useCarouselApi = () => {\n  const context = useContext(CarouselApiContext);\n  return context;\n};\n\nexport type InlineCitationCarouselProps = ComponentProps<typeof Carousel>;\n\nexport const InlineCitationCarousel = ({\n  className,\n  children,\n  ...props\n}: InlineCitationCarouselProps) => {\n  const [api, setApi] = useState<CarouselApi>();\n\n  return (\n    <CarouselApiContext.Provider value={api}>\n      <Carousel className={cn(\"w-full\", className)} setApi={setApi} {...props}>\n        {children}\n      </Carousel>\n    </CarouselApiContext.Provider>\n  );\n};\n\nexport type InlineCitationCarouselContentProps = ComponentProps<\"div\">;\n\nexport const InlineCitationCarouselContent = (\n  props: InlineCitationCarouselContentProps\n) => <CarouselContent {...props} />;\n\nexport type InlineCitationCarouselItemProps = ComponentProps<\"div\">;\n\nexport const InlineCitationCarouselItem = ({\n  className,\n  ...props\n}: InlineCitationCarouselItemProps) => (\n  <CarouselItem\n    className={cn(\"w-full space-y-2 p-4 pl-8\", className)}\n    {...props}\n  />\n);\n\nexport type InlineCitationCarouselHeaderProps = ComponentProps<\"div\">;\n\nexport const InlineCitationCarouselHeader = ({\n  className,\n  ...props\n}: InlineCitationCarouselHeaderProps) => (\n  <div\n    className={cn(\n      \"flex items-center justify-between gap-2 rounded-t-md bg-secondary p-2\",\n      className\n    )}\n    {...props}\n  />\n);\n\nexport type InlineCitationCarouselIndexProps = ComponentProps<\"div\">;\n\nexport const InlineCitationCarouselIndex = ({\n  children,\n  className,\n  ...props\n}: InlineCitationCarouselIndexProps) => {\n  const api = useCarouselApi();\n  const [current, setCurrent] = useState(0);\n  const [count, setCount] = useState(0);\n\n  useEffect(() => {\n    if (!api) {\n      return;\n    }\n\n    setCount(api.scrollSnapList().length);\n    setCurrent(api.selectedScrollSnap() + 1);\n\n    api.on(\"select\", () => {\n      setCurrent(api.selectedScrollSnap() + 1);\n    });\n  }, [api]);\n\n  return (\n    <div\n      className={cn(\n        \"flex flex-1 items-center justify-end px-3 py-1 text-muted-foreground text-xs\",\n        className\n      )}\n      {...props}\n    >\n      {children ?? `${current}/${count}`}\n    </div>\n  );\n};\n\nexport type InlineCitationCarouselPrevProps = ComponentProps<\"button\">;\n\nexport const InlineCitationCarouselPrev = ({\n  className,\n  ...props\n}: InlineCitationCarouselPrevProps) => {\n  const api = useCarouselApi();\n\n  const handleClick = useCallback(() => {\n    if (api) {\n      api.scrollPrev();\n    }\n  }, [api]);\n\n  return (\n    <button\n      aria-label=\"Previous\"\n      className={cn(\"shrink-0\", className)}\n      onClick={handleClick}\n      type=\"button\"\n      {...props}\n    >\n      <ArrowLeftIcon className=\"size-4 text-muted-foreground\" />\n    </button>\n  );\n};\n\nexport type InlineCitationCarouselNextProps = ComponentProps<\"button\">;\n\nexport const InlineCitationCarouselNext = ({\n  className,\n  ...props\n}: InlineCitationCarouselNextProps) => {\n  const api = useCarouselApi();\n\n  const handleClick = useCallback(() => {\n    if (api) {\n      api.scrollNext();\n    }\n  }, [api]);\n\n  return (\n    <button\n      aria-label=\"Next\"\n      className={cn(\"shrink-0\", className)}\n      onClick={handleClick}\n      type=\"button\"\n      {...props}\n    >\n      <ArrowRightIcon className=\"size-4 text-muted-foreground\" />\n    </button>\n  );\n};\n\nexport type InlineCitationSourceProps = ComponentProps<\"div\"> & {\n  title?: string;\n  url?: string;\n  description?: string;\n};\n\nexport const InlineCitationSource = ({\n  title,\n  url,\n  description,\n  className,\n  children,\n  ...props\n}: InlineCitationSourceProps) => (\n  <div className={cn(\"space-y-1\", className)} {...props}>\n    {title && (\n      <h4 className=\"truncate font-medium text-sm leading-tight\">{title}</h4>\n    )}\n    {url && (\n      <p className=\"truncate break-all text-muted-foreground text-xs\">{url}</p>\n    )}\n    {description && (\n      <p className=\"line-clamp-3 text-muted-foreground text-sm leading-relaxed\">\n        {description}\n      </p>\n    )}\n    {children}\n  </div>\n);\n\nexport type InlineCitationQuoteProps = ComponentProps<\"blockquote\">;\n\nexport const InlineCitationQuote = ({\n  children,\n  className,\n  ...props\n}: InlineCitationQuoteProps) => (\n  <blockquote\n    className={cn(\n      \"border-muted border-l-2 pl-3 text-muted-foreground text-sm italic\",\n      className\n    )}\n    {...props}\n  >\n    {children}\n  </blockquote>\n);\n"
  },
  {
    "path": "components/elements/loader.tsx",
    "content": "import type { HTMLAttributes } from \"react\";\nimport { cn } from \"@/lib/utils\";\n\ntype LoaderIconProps = {\n  size?: number;\n};\n\nconst LoaderIcon = ({ size = 16 }: LoaderIconProps) => (\n  <svg\n    height={size}\n    strokeLinejoin=\"round\"\n    style={{ color: \"currentcolor\" }}\n    viewBox=\"0 0 16 16\"\n    width={size}\n  >\n    <title>Loader</title>\n    <g clipPath=\"url(#clip0_2393_1490)\">\n      <path d=\"M8 0V4\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n      <path\n        d=\"M8 16V12\"\n        opacity=\"0.5\"\n        stroke=\"currentColor\"\n        strokeWidth=\"1.5\"\n      />\n      <path\n        d=\"M3.29773 1.52783L5.64887 4.7639\"\n        opacity=\"0.9\"\n        stroke=\"currentColor\"\n        strokeWidth=\"1.5\"\n      />\n      <path\n        d=\"M12.7023 1.52783L10.3511 4.7639\"\n        opacity=\"0.1\"\n        stroke=\"currentColor\"\n        strokeWidth=\"1.5\"\n      />\n      <path\n        d=\"M12.7023 14.472L10.3511 11.236\"\n        opacity=\"0.4\"\n        stroke=\"currentColor\"\n        strokeWidth=\"1.5\"\n      />\n      <path\n        d=\"M3.29773 14.472L5.64887 11.236\"\n        opacity=\"0.6\"\n        stroke=\"currentColor\"\n        strokeWidth=\"1.5\"\n      />\n      <path\n        d=\"M15.6085 5.52783L11.8043 6.7639\"\n        opacity=\"0.2\"\n        stroke=\"currentColor\"\n        strokeWidth=\"1.5\"\n      />\n      <path\n        d=\"M0.391602 10.472L4.19583 9.23598\"\n        opacity=\"0.7\"\n        stroke=\"currentColor\"\n        strokeWidth=\"1.5\"\n      />\n      <path\n        d=\"M15.6085 10.4722L11.8043 9.2361\"\n        opacity=\"0.3\"\n        stroke=\"currentColor\"\n        strokeWidth=\"1.5\"\n      />\n      <path\n        d=\"M0.391602 5.52783L4.19583 6.7639\"\n        opacity=\"0.8\"\n        stroke=\"currentColor\"\n        strokeWidth=\"1.5\"\n      />\n    </g>\n    <defs>\n      <clipPath id=\"clip0_2393_1490\">\n        <rect fill=\"white\" height=\"16\" width=\"16\" />\n      </clipPath>\n    </defs>\n  </svg>\n);\n\nexport type LoaderProps = HTMLAttributes<HTMLDivElement> & {\n  size?: number;\n};\n\nexport const Loader = ({ className, size = 16, ...props }: LoaderProps) => (\n  <div\n    className={cn(\n      \"inline-flex animate-spin items-center justify-center\",\n      className\n    )}\n    {...props}\n  >\n    <LoaderIcon size={size} />\n  </div>\n);\n"
  },
  {
    "path": "components/elements/message.tsx",
    "content": "import type { UIMessage } from \"ai\";\nimport type { ComponentProps, HTMLAttributes } from \"react\";\nimport { Avatar, AvatarFallback, AvatarImage } from \"@/components/ui/avatar\";\nimport { cn } from \"@/lib/utils\";\n\nexport type MessageProps = HTMLAttributes<HTMLDivElement> & {\n  from: UIMessage[\"role\"];\n};\n\nexport const Message = ({ className, from, ...props }: MessageProps) => (\n  <div\n    className={cn(\n      \"group flex w-full items-end justify-end gap-2 py-4\",\n      from === \"user\" ? \"is-user\" : \"is-assistant flex-row-reverse justify-end\",\n      \"[&>div]:max-w-[80%]\",\n      className\n    )}\n    {...props}\n  />\n);\n\nexport type MessageContentProps = HTMLAttributes<HTMLDivElement>;\n\nexport const MessageContent = ({\n  children,\n  className,\n  ...props\n}: MessageContentProps) => (\n  <div\n    className={cn(\n      \"flex flex-col gap-2 overflow-hidden rounded-lg px-4 py-3 text-foreground text-sm\",\n      \"group-[.is-user]:bg-primary group-[.is-user]:text-primary-foreground\",\n      \"group-[.is-assistant]:bg-secondary group-[.is-assistant]:text-foreground\",\n      \"is-user:dark\",\n      className\n    )}\n    {...props}\n  >\n    {children}\n  </div>\n);\n\nexport type MessageAvatarProps = ComponentProps<typeof Avatar> & {\n  src: string;\n  name?: string;\n};\n\nexport const MessageAvatar = ({\n  src,\n  name,\n  className,\n  ...props\n}: MessageAvatarProps) => (\n  <Avatar className={cn(\"size-8 ring-1 ring-border\", className)} {...props}>\n    <AvatarImage alt=\"\" className=\"my-0\" src={src} />\n    <AvatarFallback>{name?.slice(0, 2) || \"ME\"}</AvatarFallback>\n  </Avatar>\n);\n"
  },
  {
    "path": "components/elements/prompt-input.tsx",
    "content": "\"use client\";\n\nimport type { ChatStatus } from \"ai\";\nimport { Loader2Icon, SendIcon, SquareIcon, XIcon } from \"lucide-react\";\nimport type {\n  ComponentProps,\n  HTMLAttributes,\n  KeyboardEventHandler,\n} from \"react\";\nimport { Children } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n  Select,\n  SelectContent,\n  SelectItem,\n  SelectTrigger,\n  SelectValue,\n} from \"@/components/ui/select\";\nimport { Textarea } from \"@/components/ui/textarea\";\nimport { cn } from \"@/lib/utils\";\n\nexport type PromptInputProps = HTMLAttributes<HTMLFormElement>;\n\nexport const PromptInput = ({ className, ...props }: PromptInputProps) => (\n  <form\n    className={cn(\n      \"w-full overflow-hidden rounded-xl border bg-background shadow-xs\",\n      className\n    )}\n    {...props}\n  />\n);\n\nexport type PromptInputTextareaProps = ComponentProps<typeof Textarea> & {\n  minHeight?: number;\n  maxHeight?: number;\n  disableAutoResize?: boolean;\n  resizeOnNewLinesOnly?: boolean;\n};\n\nexport const PromptInputTextarea = ({\n  onChange,\n  className,\n  placeholder = \"What would you like to know?\",\n  minHeight = 48,\n  maxHeight = 164,\n  disableAutoResize = false,\n  resizeOnNewLinesOnly = false,\n  ...props\n}: PromptInputTextareaProps) => {\n  const handleKeyDown: KeyboardEventHandler<HTMLTextAreaElement> = (e) => {\n    if (e.key === \"Enter\") {\n      if (e.nativeEvent.isComposing) {\n        return;\n      }\n\n      if (e.shiftKey) {\n        return;\n      }\n\n      e.preventDefault();\n\n      const form = e.currentTarget.form;\n      const submitButton = form?.querySelector(\n        'button[type=\"submit\"]'\n      ) as HTMLButtonElement | null;\n      if (submitButton?.disabled) {\n        return;\n      }\n\n      form?.requestSubmit();\n    }\n  };\n\n  return (\n    <Textarea\n      className={cn(\n        \"w-full resize-none rounded-none border-none p-3 shadow-none outline-hidden ring-0\",\n        disableAutoResize\n          ? \"field-sizing-fixed\"\n          : resizeOnNewLinesOnly\n            ? \"field-sizing-fixed\"\n            : \"field-sizing-content max-h-[6lh]\",\n        \"bg-transparent dark:bg-transparent\",\n        \"focus-visible:ring-0\",\n        className\n      )}\n      name=\"message\"\n      onChange={(e) => {\n        onChange?.(e);\n      }}\n      onKeyDown={handleKeyDown}\n      placeholder={placeholder}\n      {...props}\n    />\n  );\n};\n\nexport type PromptInputToolbarProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputToolbar = ({\n  className,\n  ...props\n}: PromptInputToolbarProps) => (\n  <div\n    className={cn(\"flex items-center justify-between p-1\", className)}\n    {...props}\n  />\n);\n\nexport type PromptInputToolsProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputTools = ({\n  className,\n  ...props\n}: PromptInputToolsProps) => (\n  <div\n    className={cn(\n      \"flex items-center gap-1\",\n      \"[&_button:first-child]:rounded-bl-xl\",\n      className\n    )}\n    {...props}\n  />\n);\n\nexport type PromptInputButtonProps = ComponentProps<typeof Button>;\n\nexport const PromptInputButton = ({\n  variant = \"ghost\",\n  className,\n  size,\n  ...props\n}: PromptInputButtonProps) => {\n  const newSize =\n    (size ?? Children.count(props.children) > 1) ? \"default\" : \"icon\";\n\n  return (\n    <Button\n      className={cn(\n        \"shrink-0 gap-1.5 rounded-lg\",\n        variant === \"ghost\" && \"text-muted-foreground\",\n        newSize === \"default\" && \"px-3\",\n        className\n      )}\n      size={newSize}\n      type=\"button\"\n      variant={variant}\n      {...props}\n    />\n  );\n};\n\nexport type PromptInputSubmitProps = ComponentProps<typeof Button> & {\n  status?: ChatStatus;\n};\n\nexport const PromptInputSubmit = ({\n  className,\n  variant = \"default\",\n  size = \"icon\",\n  status,\n  children,\n  ...props\n}: PromptInputSubmitProps) => {\n  let Icon = <SendIcon className=\"size-4\" />;\n\n  if (status === \"submitted\") {\n    Icon = <Loader2Icon className=\"size-4 animate-spin\" />;\n  } else if (status === \"streaming\") {\n    Icon = <SquareIcon className=\"size-4\" />;\n  } else if (status === \"error\") {\n    Icon = <XIcon className=\"size-4\" />;\n  }\n\n  return (\n    <Button\n      className={cn(\"gap-1.5 rounded-lg\", className)}\n      size={size}\n      type=\"submit\"\n      variant={variant}\n      {...props}\n    >\n      {children ?? Icon}\n    </Button>\n  );\n};\n\nexport type PromptInputModelSelectProps = ComponentProps<typeof Select>;\n\nexport const PromptInputModelSelect = (props: PromptInputModelSelectProps) => (\n  <Select {...props} />\n);\n\nexport type PromptInputModelSelectTriggerProps = ComponentProps<\n  typeof SelectTrigger\n>;\n\nexport const PromptInputModelSelectTrigger = ({\n  className,\n  ...props\n}: PromptInputModelSelectTriggerProps) => (\n  <SelectTrigger\n    className={cn(\n      \"border-none bg-transparent font-medium text-muted-foreground shadow-none transition-colors\",\n      \"hover:bg-accent hover:text-foreground aria-expanded:bg-accent aria-expanded:text-foreground\",\n      \"h-auto px-2 py-1.5\",\n      className\n    )}\n    {...props}\n  />\n);\n\nexport type PromptInputModelSelectContentProps = ComponentProps<\n  typeof SelectContent\n>;\n\nexport const PromptInputModelSelectContent = ({\n  className,\n  ...props\n}: PromptInputModelSelectContentProps) => (\n  <SelectContent className={cn(className)} {...props} />\n);\n\nexport type PromptInputModelSelectItemProps = ComponentProps<typeof SelectItem>;\n\nexport const PromptInputModelSelectItem = ({\n  className,\n  ...props\n}: PromptInputModelSelectItemProps) => (\n  <SelectItem className={cn(className)} {...props} />\n);\n\nexport type PromptInputModelSelectValueProps = ComponentProps<\n  typeof SelectValue\n>;\n\nexport const PromptInputModelSelectValue = ({\n  className,\n  ...props\n}: PromptInputModelSelectValueProps) => (\n  <SelectValue className={cn(className)} {...props} />\n);\n"
  },
  {
    "path": "components/elements/reasoning.tsx",
    "content": "\"use client\";\n\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { BrainIcon, ChevronDownIcon } from \"lucide-react\";\nimport type { ComponentProps } from \"react\";\nimport { createContext, memo, useContext, useEffect, useState } from \"react\";\nimport {\n  Collapsible,\n  CollapsibleContent,\n  CollapsibleTrigger,\n} from \"@/components/ui/collapsible\";\nimport { cn } from \"@/lib/utils\";\nimport { Response } from \"./response\";\n\ntype ReasoningContextValue = {\n  isStreaming: boolean;\n  isOpen: boolean;\n  setIsOpen: (open: boolean) => void;\n  duration: number;\n};\n\nconst ReasoningContext = createContext<ReasoningContextValue | null>(null);\n\nconst useReasoning = () => {\n  const context = useContext(ReasoningContext);\n  if (!context) {\n    throw new Error(\"Reasoning components must be used within Reasoning\");\n  }\n  return context;\n};\n\nexport type ReasoningProps = ComponentProps<typeof Collapsible> & {\n  isStreaming?: boolean;\n  open?: boolean;\n  defaultOpen?: boolean;\n  onOpenChange?: (open: boolean) => void;\n  duration?: number;\n};\n\nconst AUTO_CLOSE_DELAY = 500;\nconst MS_IN_S = 1000;\n\nexport const Reasoning = memo(\n  ({\n    className,\n    isStreaming = false,\n    open,\n    defaultOpen = true,\n    onOpenChange,\n    duration: durationProp,\n    children,\n    ...props\n  }: ReasoningProps) => {\n    const [isOpen, setIsOpen] = useControllableState({\n      prop: open,\n      defaultProp: defaultOpen,\n      onChange: onOpenChange,\n    });\n    const [duration, setDuration] = useControllableState({\n      prop: durationProp,\n      defaultProp: 0,\n    });\n\n    const [hasAutoClosedRef, setHasAutoClosedRef] = useState(false);\n    const [startTime, setStartTime] = useState<number | null>(null);\n\n    // Track duration when streaming starts and ends\n    useEffect(() => {\n      if (isStreaming) {\n        if (startTime === null) {\n          setStartTime(Date.now());\n        }\n      } else if (startTime !== null) {\n        setDuration(Math.round((Date.now() - startTime) / MS_IN_S));\n        setStartTime(null);\n      }\n    }, [isStreaming, startTime, setDuration]);\n\n    // Auto-open when streaming starts, auto-close when streaming ends (once only)\n    useEffect(() => {\n      if (defaultOpen && !isStreaming && isOpen && !hasAutoClosedRef) {\n        // Add a small delay before closing to allow user to see the content\n        const timer = setTimeout(() => {\n          setIsOpen(false);\n          setHasAutoClosedRef(true);\n        }, AUTO_CLOSE_DELAY);\n\n        return () => clearTimeout(timer);\n      }\n    }, [isStreaming, isOpen, defaultOpen, setIsOpen, hasAutoClosedRef]);\n\n    const handleOpenChange = (newOpen: boolean) => {\n      setIsOpen(newOpen);\n    };\n\n    return (\n      <ReasoningContext.Provider\n        value={{ isStreaming, isOpen, setIsOpen, duration }}\n      >\n        <Collapsible\n          className={cn(\"not-prose\", className)}\n          onOpenChange={handleOpenChange}\n          open={isOpen}\n          {...props}\n        >\n          {children}\n        </Collapsible>\n      </ReasoningContext.Provider>\n    );\n  }\n);\n\nexport type ReasoningTriggerProps = ComponentProps<typeof CollapsibleTrigger>;\n\nexport const ReasoningTrigger = memo(\n  ({ className, children, ...props }: ReasoningTriggerProps) => {\n    const { isStreaming, isOpen, duration } = useReasoning();\n\n    return (\n      <CollapsibleTrigger\n        className={cn(\n          \"flex items-center gap-1 rounded-md px-1.5 py-0.5 text-[11px] text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\",\n          className\n        )}\n        {...props}\n      >\n        {children ?? (\n          <>\n            <BrainIcon className=\"size-3\" />\n            {isStreaming || duration === 0 ? (\n              <span>Thinking</span>\n            ) : (\n              <span>{duration}s</span>\n            )}\n            <ChevronDownIcon\n              className={cn(\n                \"size-2.5 transition-transform\",\n                isOpen ? \"rotate-180\" : \"rotate-0\"\n              )}\n            />\n          </>\n        )}\n      </CollapsibleTrigger>\n    );\n  }\n);\n\nexport type ReasoningContentProps = ComponentProps<\n  typeof CollapsibleContent\n> & {\n  children: string;\n};\n\nexport const ReasoningContent = memo(\n  ({ className, children, ...props }: ReasoningContentProps) => (\n    <CollapsibleContent\n      className={cn(\n        \"mt-1.5 text-[11px] text-muted-foreground leading-relaxed\",\n        \"data-[state=closed]:fade-out-0 data-[state=closed]:slide-out-to-top-2 data-[state=open]:slide-in-from-top-2 outline-hidden data-[state=closed]:animate-out data-[state=open]:animate-in\",\n        className\n      )}\n      {...props}\n    >\n      <div className=\"max-h-48 overflow-y-auto rounded-md border border-border/50 bg-muted/30 p-2.5\">\n        <Response className=\"grid gap-1 text-[11px] **:text-[11px] [&_li]:my-0 [&_ol]:my-1 [&_p]:my-0 [&_ul]:my-1\">\n          {children}\n        </Response>\n      </div>\n    </CollapsibleContent>\n  )\n);\n\nReasoning.displayName = \"Reasoning\";\nReasoningTrigger.displayName = \"ReasoningTrigger\";\nReasoningContent.displayName = \"ReasoningContent\";\n"
  },
  {
    "path": "components/elements/response.tsx",
    "content": "\"use client\";\n\nimport type { ComponentProps } from \"react\";\nimport { Streamdown } from \"streamdown\";\nimport { cn } from \"@/lib/utils\";\n\ntype ResponseProps = ComponentProps<typeof Streamdown>;\n\nexport function Response({ className, children, ...props }: ResponseProps) {\n  return (\n    <Streamdown\n      className={cn(\n        \"size-full [&>*:first-child]:mt-0 [&>*:last-child]:mb-0 [&_code]:whitespace-pre-wrap [&_code]:break-words [&_pre]:max-w-full [&_pre]:overflow-x-auto\",\n        className\n      )}\n      {...props}\n    >\n      {children}\n    </Streamdown>\n  );\n}\n"
  },
  {
    "path": "components/elements/source.tsx",
    "content": "\"use client\";\n\nimport { BookIcon, ChevronDownIcon } from \"lucide-react\";\nimport type { ComponentProps } from \"react\";\nimport {\n  Collapsible,\n  CollapsibleContent,\n  CollapsibleTrigger,\n} from \"@/components/ui/collapsible\";\nimport { cn } from \"@/lib/utils\";\n\nexport type SourcesProps = ComponentProps<\"div\">;\n\nexport const Sources = ({ className, ...props }: SourcesProps) => (\n  <Collapsible\n    className={cn(\"not-prose mb-4 text-primary text-xs\", className)}\n    {...props}\n  />\n);\n\nexport type SourcesTriggerProps = ComponentProps<typeof CollapsibleTrigger> & {\n  count: number;\n};\n\nexport const SourcesTrigger = ({\n  className,\n  count,\n  children,\n  ...props\n}: SourcesTriggerProps) => (\n  <CollapsibleTrigger className=\"flex items-center gap-2\" {...props}>\n    {children ?? (\n      <>\n        <p className=\"font-medium\">Used {count} sources</p>\n        <ChevronDownIcon className=\"size-4\" />\n      </>\n    )}\n  </CollapsibleTrigger>\n);\n\nexport type SourcesContentProps = ComponentProps<typeof CollapsibleContent>;\n\nexport const SourcesContent = ({\n  className,\n  ...props\n}: SourcesContentProps) => (\n  <CollapsibleContent\n    className={cn(\n      \"mt-3 flex w-fit flex-col gap-2\",\n      \"data-[state=closed]:fade-out-0 data-[state=closed]:slide-out-to-top-2 data-[state=open]:slide-in-from-top-2 outline-hidden data-[state=closed]:animate-out data-[state=open]:animate-in\",\n      className\n    )}\n    {...props}\n  />\n);\n\nexport type SourceProps = ComponentProps<\"a\">;\n\nexport const Source = ({ href, title, children, ...props }: SourceProps) => (\n  <a\n    className=\"flex items-center gap-2\"\n    href={href}\n    rel=\"noreferrer\"\n    target=\"_blank\"\n    {...props}\n  >\n    {children ?? (\n      <>\n        <BookIcon className=\"size-4\" />\n        <span className=\"block font-medium\">{title}</span>\n      </>\n    )}\n  </a>\n);\n"
  },
  {
    "path": "components/elements/suggestion.tsx",
    "content": "\"use client\";\n\nimport type { ComponentProps } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport { ScrollArea, ScrollBar } from \"@/components/ui/scroll-area\";\nimport { cn } from \"@/lib/utils\";\n\nexport type SuggestionsProps = ComponentProps<typeof ScrollArea>;\n\nexport const Suggestions = ({\n  className,\n  children,\n  ...props\n}: SuggestionsProps) => (\n  <ScrollArea className=\"w-full overflow-x-auto whitespace-nowrap\" {...props}>\n    <div className={cn(\"flex w-max flex-nowrap items-center gap-2\", className)}>\n      {children}\n    </div>\n    <ScrollBar className=\"hidden\" orientation=\"horizontal\" />\n  </ScrollArea>\n);\n\nexport type SuggestionProps = Omit<ComponentProps<typeof Button>, \"onClick\"> & {\n  suggestion: string;\n  onClick?: (suggestion: string) => void;\n};\n\nexport const Suggestion = ({\n  suggestion,\n  onClick,\n  className,\n  variant = \"outline\",\n  size = \"sm\",\n  children,\n  ...props\n}: SuggestionProps) => {\n  const handleClick = () => {\n    onClick?.(suggestion);\n  };\n\n  return (\n    <Button\n      className={cn(\"cursor-pointer rounded-full px-4\", className)}\n      onClick={handleClick}\n      size={size}\n      type=\"button\"\n      variant={variant}\n      {...props}\n    >\n      {children || suggestion}\n    </Button>\n  );\n};\n"
  },
  {
    "path": "components/elements/task.tsx",
    "content": "\"use client\";\n\nimport { ChevronDownIcon, SearchIcon } from \"lucide-react\";\nimport type { ComponentProps } from \"react\";\nimport {\n  Collapsible,\n  CollapsibleContent,\n  CollapsibleTrigger,\n} from \"@/components/ui/collapsible\";\nimport { cn } from \"@/lib/utils\";\n\nexport type TaskItemFileProps = ComponentProps<\"div\">;\n\nexport const TaskItemFile = ({\n  children,\n  className,\n  ...props\n}: TaskItemFileProps) => (\n  <div\n    className={cn(\n      \"inline-flex items-center gap-1 rounded-md border bg-secondary px-1.5 py-0.5 text-foreground text-xs\",\n      className\n    )}\n    {...props}\n  >\n    {children}\n  </div>\n);\n\nexport type TaskItemProps = ComponentProps<\"div\">;\n\nexport const TaskItem = ({ children, className, ...props }: TaskItemProps) => (\n  <div className={cn(\"text-muted-foreground text-sm\", className)} {...props}>\n    {children}\n  </div>\n);\n\nexport type TaskProps = ComponentProps<typeof Collapsible>;\n\nexport const Task = ({\n  defaultOpen = true,\n  className,\n  ...props\n}: TaskProps) => (\n  <Collapsible\n    className={cn(\n      \"data-[state=closed]:fade-out-0 data-[state=closed]:slide-out-to-top-2 data-[state=open]:slide-in-from-top-2 data-[state=closed]:animate-out data-[state=open]:animate-in\",\n      className\n    )}\n    defaultOpen={defaultOpen}\n    {...props}\n  />\n);\n\nexport type TaskTriggerProps = ComponentProps<typeof CollapsibleTrigger> & {\n  title: string;\n};\n\nexport const TaskTrigger = ({\n  children,\n  className,\n  title,\n  ...props\n}: TaskTriggerProps) => (\n  <CollapsibleTrigger asChild className={cn(\"group\", className)} {...props}>\n    {children ?? (\n      <div className=\"flex cursor-pointer items-center gap-2 text-muted-foreground hover:text-foreground\">\n        <SearchIcon className=\"size-4\" />\n        <p className=\"text-sm\">{title}</p>\n        <ChevronDownIcon className=\"size-4 transition-transform group-data-[state=open]:rotate-180\" />\n      </div>\n    )}\n  </CollapsibleTrigger>\n);\n\nexport type TaskContentProps = ComponentProps<typeof CollapsibleContent>;\n\nexport const TaskContent = ({\n  children,\n  className,\n  ...props\n}: TaskContentProps) => (\n  <CollapsibleContent\n    className={cn(\n      \"data-[state=closed]:fade-out-0 data-[state=closed]:slide-out-to-top-2 data-[state=open]:slide-in-from-top-2 text-popover-foreground outline-hidden data-[state=closed]:animate-out data-[state=open]:animate-in\",\n      className\n    )}\n    {...props}\n  >\n    <div className=\"mt-4 space-y-2 border-muted border-l-2 pl-4\">\n      {children}\n    </div>\n  </CollapsibleContent>\n);\n"
  },
  {
    "path": "components/elements/tool.tsx",
    "content": "\"use client\";\n\nimport type { ToolUIPart } from \"ai\";\nimport {\n  CheckCircleIcon,\n  ChevronDownIcon,\n  CircleIcon,\n  ClockIcon,\n  WrenchIcon,\n  XCircleIcon,\n} from \"lucide-react\";\nimport type { ComponentProps, ReactNode } from \"react\";\nimport { Badge } from \"@/components/ui/badge\";\nimport {\n  Collapsible,\n  CollapsibleContent,\n  CollapsibleTrigger,\n} from \"@/components/ui/collapsible\";\nimport { cn } from \"@/lib/utils\";\n\nexport type ToolProps = ComponentProps<typeof Collapsible>;\n\nexport const Tool = ({ className, ...props }: ToolProps) => (\n  <Collapsible\n    className={cn(\"not-prose mb-4 w-full rounded-md border\", className)}\n    {...props}\n  />\n);\n\nexport type ToolHeaderProps = {\n  type: ToolUIPart[\"type\"];\n  state: ToolUIPart[\"state\"];\n  className?: string;\n};\n\nconst getStatusBadge = (status: ToolUIPart[\"state\"]) => {\n  const labels: Record<ToolUIPart[\"state\"], string> = {\n    \"input-streaming\": \"Pending\",\n    \"input-available\": \"Running\",\n    \"approval-requested\": \"Pending\",\n    \"approval-responded\": \"Approved\",\n    \"output-available\": \"Completed\",\n    \"output-error\": \"Error\",\n    \"output-denied\": \"Denied\",\n  };\n\n  const icons: Record<ToolUIPart[\"state\"], ReactNode> = {\n    \"input-streaming\": <CircleIcon className=\"size-4\" />,\n    \"input-available\": <ClockIcon className=\"size-4 animate-pulse\" />,\n    \"approval-requested\": <ClockIcon className=\"size-4 text-yellow-600\" />,\n    \"approval-responded\": <CheckCircleIcon className=\"size-4 text-blue-600\" />,\n    \"output-available\": <CheckCircleIcon className=\"size-4 text-green-600\" />,\n    \"output-error\": <XCircleIcon className=\"size-4 text-red-600\" />,\n    \"output-denied\": <XCircleIcon className=\"size-4 text-orange-600\" />,\n  };\n\n  return (\n    <Badge\n      className=\"flex items-center gap-1 rounded-full text-xs\"\n      variant=\"secondary\"\n    >\n      {icons[status]}\n      <span>{labels[status]}</span>\n    </Badge>\n  );\n};\n\nexport const ToolHeader = ({\n  className,\n  type,\n  state,\n  ...props\n}: ToolHeaderProps) => (\n  <CollapsibleTrigger\n    className={cn(\n      \"flex w-full min-w-0 items-center justify-between gap-2 p-3\",\n      className\n    )}\n    {...props}\n  >\n    <div className=\"flex min-w-0 flex-1 items-center gap-2\">\n      <WrenchIcon className=\"size-4 shrink-0 text-muted-foreground\" />\n      <span className=\"truncate font-medium text-sm\">{type}</span>\n    </div>\n    <div className=\"flex shrink-0 items-center gap-2\">\n      {getStatusBadge(state)}\n      <ChevronDownIcon className=\"size-4 text-muted-foreground transition-transform group-data-[state=open]:rotate-180\" />\n    </div>\n  </CollapsibleTrigger>\n);\n\nexport type ToolContentProps = ComponentProps<typeof CollapsibleContent>;\n\nexport const ToolContent = ({ className, ...props }: ToolContentProps) => (\n  <CollapsibleContent\n    className={cn(\n      \"data-[state=closed]:fade-out-0 data-[state=closed]:slide-out-to-top-2 data-[state=open]:slide-in-from-top-2 text-popover-foreground outline-hidden data-[state=closed]:animate-out data-[state=open]:animate-in\",\n      className\n    )}\n    {...props}\n  />\n);\n\nexport type ToolInputProps = ComponentProps<\"div\"> & {\n  input: ToolUIPart[\"input\"];\n};\n\nexport const ToolInput = ({ className, input, ...props }: ToolInputProps) => (\n  <div className={cn(\"space-y-2 overflow-hidden p-4\", className)} {...props}>\n    <h4 className=\"font-medium text-muted-foreground text-xs uppercase tracking-wide\">\n      Parameters\n    </h4>\n    <pre className=\"overflow-x-auto rounded-md bg-muted/50 p-3 font-mono text-xs\">\n      {JSON.stringify(input, null, 2)}\n    </pre>\n  </div>\n);\n\nexport type ToolOutputProps = ComponentProps<\"div\"> & {\n  output: ReactNode;\n  errorText: ToolUIPart[\"errorText\"];\n};\n\nexport const ToolOutput = ({\n  className,\n  output,\n  errorText,\n  ...props\n}: ToolOutputProps) => {\n  if (!(output || errorText)) {\n    return null;\n  }\n\n  return (\n    <div className={cn(\"space-y-2 p-4\", className)} {...props}>\n      <h4 className=\"font-medium text-muted-foreground text-xs uppercase tracking-wide\">\n        {errorText ? \"Error\" : \"Result\"}\n      </h4>\n      <div\n        className={cn(\n          \"overflow-x-auto rounded-md text-xs [&_table]:w-full\",\n          errorText\n            ? \"bg-destructive/10 text-destructive\"\n            : \"bg-muted/50 text-foreground\"\n        )}\n      >\n        {errorText && <div>{errorText}</div>}\n        {output && <div>{output}</div>}\n      </div>\n    </div>\n  );\n};\n"
  },
  {
    "path": "components/elements/web-preview.tsx",
    "content": "\"use client\";\n\nimport { ChevronDownIcon } from \"lucide-react\";\nimport type { ComponentProps, ReactNode } from \"react\";\nimport { createContext, useContext, useState } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n  Collapsible,\n  CollapsibleContent,\n  CollapsibleTrigger,\n} from \"@/components/ui/collapsible\";\nimport { Input } from \"@/components/ui/input\";\nimport {\n  Tooltip,\n  TooltipContent,\n  TooltipProvider,\n  TooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { cn } from \"@/lib/utils\";\n\nexport type WebPreviewContextValue = {\n  url: string;\n  setUrl: (url: string) => void;\n  consoleOpen: boolean;\n  setConsoleOpen: (open: boolean) => void;\n};\n\nconst WebPreviewContext = createContext<WebPreviewContextValue | null>(null);\n\nconst useWebPreview = () => {\n  const context = useContext(WebPreviewContext);\n  if (!context) {\n    throw new Error(\"WebPreview components must be used within a WebPreview\");\n  }\n  return context;\n};\n\nexport type WebPreviewProps = ComponentProps<\"div\"> & {\n  defaultUrl?: string;\n  onUrlChange?: (url: string) => void;\n};\n\nexport const WebPreview = ({\n  className,\n  children,\n  defaultUrl = \"\",\n  onUrlChange,\n  ...props\n}: WebPreviewProps) => {\n  const [url, setUrl] = useState(defaultUrl);\n  const [consoleOpen, setConsoleOpen] = useState(false);\n\n  const handleUrlChange = (newUrl: string) => {\n    setUrl(newUrl);\n    onUrlChange?.(newUrl);\n  };\n\n  const contextValue: WebPreviewContextValue = {\n    url,\n    setUrl: handleUrlChange,\n    consoleOpen,\n    setConsoleOpen,\n  };\n\n  return (\n    <WebPreviewContext.Provider value={contextValue}>\n      <div\n        className={cn(\n          \"flex size-full flex-col rounded-lg border bg-card\",\n          className\n        )}\n        {...props}\n      >\n        {children}\n      </div>\n    </WebPreviewContext.Provider>\n  );\n};\n\nexport type WebPreviewNavigationProps = ComponentProps<\"div\">;\n\nexport const WebPreviewNavigation = ({\n  className,\n  children,\n  ...props\n}: WebPreviewNavigationProps) => (\n  <div\n    className={cn(\"flex items-center gap-1 border-b p-2\", className)}\n    {...props}\n  >\n    {children}\n  </div>\n);\n\nexport type WebPreviewNavigationButtonProps = ComponentProps<typeof Button> & {\n  tooltip?: string;\n};\n\nexport const WebPreviewNavigationButton = ({\n  onClick,\n  disabled,\n  tooltip,\n  children,\n  ...props\n}: WebPreviewNavigationButtonProps) => (\n  <TooltipProvider>\n    <Tooltip>\n      <TooltipTrigger asChild>\n        <Button\n          className=\"size-8 p-0 hover:text-foreground\"\n          disabled={disabled}\n          onClick={onClick}\n          size=\"sm\"\n          variant=\"ghost\"\n          {...props}\n        >\n          {children}\n        </Button>\n      </TooltipTrigger>\n      <TooltipContent>\n        <p>{tooltip}</p>\n      </TooltipContent>\n    </Tooltip>\n  </TooltipProvider>\n);\n\nexport type WebPreviewUrlProps = ComponentProps<typeof Input>;\n\nexport const WebPreviewUrl = ({\n  value,\n  onChange,\n  onKeyDown,\n  ...props\n}: WebPreviewUrlProps) => {\n  const { url, setUrl } = useWebPreview();\n\n  const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n    if (event.key === \"Enter\") {\n      const target = event.target as HTMLInputElement;\n      setUrl(target.value);\n    }\n    onKeyDown?.(event);\n  };\n\n  return (\n    <Input\n      className=\"h-8 flex-1 text-sm\"\n      onChange={onChange}\n      onKeyDown={handleKeyDown}\n      placeholder=\"Enter URL...\"\n      value={value ?? url}\n      {...props}\n    />\n  );\n};\n\nexport type WebPreviewBodyProps = ComponentProps<\"iframe\"> & {\n  loading?: ReactNode;\n};\n\nexport const WebPreviewBody = ({\n  className,\n  loading,\n  src,\n  ...props\n}: WebPreviewBodyProps) => {\n  const { url } = useWebPreview();\n\n  return (\n    <div className=\"flex-1\">\n      <iframe\n        className={cn(\"size-full\", className)}\n        sandbox=\"allow-scripts allow-same-origin allow-forms allow-popups allow-presentation\"\n        src={(src ?? url) || undefined}\n        title=\"Preview\"\n        {...props}\n      />\n      {loading}\n    </div>\n  );\n};\n\nexport type WebPreviewConsoleProps = ComponentProps<\"div\"> & {\n  logs?: Array<{\n    level: \"log\" | \"warn\" | \"error\";\n    message: string;\n    timestamp: Date;\n  }>;\n};\n\nexport const WebPreviewConsole = ({\n  className,\n  logs = [],\n  children,\n  ...props\n}: WebPreviewConsoleProps) => {\n  const { consoleOpen, setConsoleOpen } = useWebPreview();\n\n  return (\n    <Collapsible\n      className={cn(\"border-t bg-muted/50 font-mono text-sm\", className)}\n      onOpenChange={setConsoleOpen}\n      open={consoleOpen}\n      {...props}\n    >\n      <CollapsibleTrigger asChild>\n        <Button\n          className=\"flex w-full items-center justify-between p-4 text-left font-medium hover:bg-muted/50\"\n          variant=\"ghost\"\n        >\n          Console\n          <ChevronDownIcon\n            className={cn(\n              \"h-4 w-4 transition-transform duration-200\",\n              consoleOpen && \"rotate-180\"\n            )}\n          />\n        </Button>\n      </CollapsibleTrigger>\n      <CollapsibleContent\n        className={cn(\n          \"px-4 pb-4\",\n          \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 outline-hidden data-[state=closed]:animate-out data-[state=open]:animate-in\"\n        )}\n      >\n        <div className=\"max-h-48 space-y-1 overflow-y-auto\">\n          {logs.length === 0 ? (\n            <p className=\"text-muted-foreground\">No console output</p>\n          ) : (\n            logs.map((log) => (\n              <div\n                className={cn(\n                  \"text-xs\",\n                  log.level === \"error\" && \"text-destructive\",\n                  log.level === \"warn\" && \"text-yellow-600\",\n                  log.level === \"log\" && \"text-foreground\"\n                )}\n                key={`${log.timestamp.getTime()}-${log.message}`}\n              >\n                <span className=\"text-muted-foreground\">\n                  {log.timestamp.toLocaleTimeString()}\n                </span>{\" \"}\n                {log.message}\n              </div>\n            ))\n          )}\n          {children}\n        </div>\n      </CollapsibleContent>\n    </Collapsible>\n  );\n};\n"
  },
  {
    "path": "components/greeting.tsx",
    "content": "import { motion } from \"framer-motion\";\n\nexport const Greeting = () => {\n  return (\n    <div\n      className=\"mx-auto mt-4 flex size-full max-w-3xl flex-col justify-center px-4 md:mt-16 md:px-8\"\n      key=\"overview\"\n    >\n      <motion.div\n        animate={{ opacity: 1, y: 0 }}\n        className=\"font-semibold text-xl md:text-2xl\"\n        exit={{ opacity: 0, y: 10 }}\n        initial={{ opacity: 0, y: 10 }}\n        transition={{ delay: 0.5 }}\n      >\n        Hello there!\n      </motion.div>\n      <motion.div\n        animate={{ opacity: 1, y: 0 }}\n        className=\"text-xl text-zinc-500 md:text-2xl\"\n        exit={{ opacity: 0, y: 10 }}\n        initial={{ opacity: 0, y: 10 }}\n        transition={{ delay: 0.6 }}\n      >\n        How can I help you today?\n      </motion.div>\n    </div>\n  );\n};\n"
  },
  {
    "path": "components/icons.tsx",
    "content": "export const BotIcon = () => {\n  return (\n    <svg\n      height=\"16\"\n      strokeLinejoin=\"round\"\n      style={{ color: \"currentcolor\" }}\n      viewBox=\"0 0 16 16\"\n      width=\"16\"\n    >\n      <path\n        clipRule=\"evenodd\"\n        d=\"M8.75 2.79933C9.19835 2.53997 9.5 2.05521 9.5 1.5C9.5 0.671573 8.82843 0 8 0C7.17157 0 6.5 0.671573 6.5 1.5C6.5 2.05521 6.80165 2.53997 7.25 2.79933V5H7C4.027 5 1.55904 7.16229 1.08296 10H0V13H1V14.5V16H2.5H13.5H15V14.5V13H16V10H14.917C14.441 7.16229 11.973 5 9 5H8.75V2.79933ZM7 6.5C4.51472 6.5 2.5 8.51472 2.5 11V14.5H13.5V11C13.5 8.51472 11.4853 6.5 9 6.5H7ZM7.25 11.25C7.25 12.2165 6.4665 13 5.5 13C4.5335 13 3.75 12.2165 3.75 11.25C3.75 10.2835 4.5335 9.5 5.5 9.5C6.4665 9.5 7.25 10.2835 7.25 11.25ZM10.5 13C11.4665 13 12.25 12.2165 12.25 11.25C12.25 10.2835 11.4665 9.5 10.5 9.5C9.5335 9.5 8.75 10.2835 8.75 11.25C8.75 12.2165 9.5335 13 10.5 13Z\"\n        fill=\"currentColor\"\n        fillRule=\"evenodd\"\n      />\n    </svg>\n  );\n};\n\nexport const UserIcon = () => {\n  return (\n    <svg\n      data-testid=\"geist-icon\"\n      height=\"16\"\n      strokeLinejoin=\"round\"\n      style={{ color: \"currentcolor\" }}\n      viewBox=\"0 0 16 16\"\n      width=\"16\"\n    >\n      <path\n        clipRule=\"evenodd\"\n        d=\"M7.75 0C5.95507 0 4.5 1.45507 4.5 3.25V3.75C4.5 5.54493 5.95507 7 7.75 7H8.25C10.0449 7 11.5 5.54493 11.5 3.75V3.25C11.5 1.45507 10.0449 0 8.25 0H7.75ZM6 3.25C6 2.2835 6.7835 1.5 7.75 1.5H8.25C9.2165 1.5 10 2.2835 10 3.25V3.75C10 4.7165 9.2165 5.5 8.25 5.5H7.75C6.7835 5.5 6 4.7165 6 3.75V3.25ZM2.5 14.5V13.1709C3.31958 11.5377 4.99308 10.5 6.82945 10.5H9.17055C11.0069 10.5 12.6804 11.5377 13.5 13.1709V14.5H2.5ZM6.82945 9C4.35483 9 2.10604 10.4388 1.06903 12.6857L1 12.8353V13V15.25V16H1.75H14.25H15V15.25V13V12.8353L14.931 12.6857C13.894 10.4388 11.6452 9 9.17055 9H6.82945Z\"\n        fill=\"currentColor\"\n        fillRule=\"evenodd\"\n      />\n    </svg>\n  );\n};\n\nexport const AttachmentIcon = () => {\n  return (\n    <svg\n      height=\"16\"\n      strokeLinejoin=\"round\"\n      style={{ color: \"currentcolor\" }}\n      viewBox=\"0 0 16 16\"\n      width=\"16\"\n    >\n      <path\n        clipRule=\"evenodd\"\n        d=\"M14.5 6.5V13.5C14.5 14.8807 13.3807 16 12 16H4C2.61929 16 1.5 14.8807 1.5 13.5V1.5V0H3H8H9.08579C9.351 0 9.60536 0.105357 9.79289 0.292893L14.2071 4.70711C14.3946 4.89464 14.5 5.149 14.5 5.41421V6.5ZM13 6.5V13.5C13 14.0523 12.5523 14.5 12 14.5H4C3.44772 14.5 3 14.0523 3 13.5V1.5H8V5V6.5H9.5H13ZM9.5 2.12132V5H12.3787L9.5 2.12132Z\"\n        fill=\"currentColor\"\n        fillRule=\"evenodd\"\n      />\n    </svg>\n  );\n};\n\nexport const VercelIcon = ({ size = 17 }) => {\n  return (\n    <svg\n      height={size}\n      strokeLinejoin=\"round\"\n      style={{ color: \"currentcolor\" }}\n      viewBox=\"0 0 16 16\"\n      width={size}\n    >\n      <path\n        clipRule=\"evenodd\"\n        d=\"M8 1L16 15H0L8 1Z\"\n        fill=\"currentColor\"\n        fillRule=\"evenodd\"\n      />\n    </svg>\n  );\n};\n\nexport const GitIcon = () => {\n  return (\n    <svg\n      height=\"16\"\n      strokeLinejoin=\"round\"\n      style={{ color: \"currentcolor\" }}\n      viewBox=\"0 0 16 16\"\n      width=\"16\"\n    >\n      <g clipPath=\"url(#clip0_872_3147)\">\n        <path\n          clipRule=\"evenodd\"\n          d=\"M8 0C3.58 0 0 3.57879 0 7.99729C0 11.5361 2.29 14.5251 5.47 15.5847C5.87 15.6547 6.02 15.4148 6.02 15.2049C6.02 15.0149 6.01 14.3851 6.01 13.7154C4 14.0852 3.48 13.2255 3.32 12.7757C3.23 12.5458 2.84 11.836 2.5 11.6461C2.22 11.4961 1.82 11.1262 2.49 11.1162C3.12 11.1062 3.57 11.696 3.72 11.936C4.44 13.1455 5.59 12.8057 6.05 12.5957C6.12 12.0759 6.33 11.726 6.56 11.5261C4.78 11.3262 2.92 10.6364 2.92 7.57743C2.92 6.70773 3.23 5.98797 3.74 5.42816C3.66 5.22823 3.38 4.40851 3.82 3.30888C3.82 3.30888 4.49 3.09895 6.02 4.1286C6.66 3.94866 7.34 3.85869 8.02 3.85869C8.7 3.85869 9.38 3.94866 10.02 4.1286C11.55 3.08895 12.22 3.30888 12.22 3.30888C12.66 4.40851 12.38 5.22823 12.3 5.42816C12.81 5.98797 13.12 6.69773 13.12 7.57743C13.12 10.6464 11.25 11.3262 9.47 11.5261C9.76 11.776 10.01 12.2558 10.01 13.0056C10.01 14.0752 10 14.9349 10 15.2049C10 15.4148 10.15 15.6647 10.55 15.5847C12.1381 15.0488 13.5182 14.0284 14.4958 12.6673C15.4735 11.3062 15.9996 9.67293 16 7.99729C16 3.57879 12.42 0 8 0Z\"\n          fill=\"currentColor\"\n          fillRule=\"evenodd\"\n        />\n      </g>\n      <defs>\n        <clipPath id=\"clip0_872_3147\">\n          <rect fill=\"white\" height=\"16\" width=\"16\" />\n        </clipPath>\n      </defs>\n    </svg>\n  );\n};\n\nexport const BoxIcon = ({ size = 16 }: { size: number }) => {\n  return (\n    <svg\n      height={size}\n      strokeLinejoin=\"round\"\n      style={{ color: \"currentcolor\" }}\n      viewBox=\"0 0 16 16\"\n      width={size}\n    >\n      <path\n        clipRule=\"evenodd\"\n        d=\"M8 0.154663L8.34601 0.334591L14.596 3.58459L15 3.79466V4.25V11.75V12.2053L14.596 12.4154L8.34601 15.6654L8 15.8453L7.65399 15.6654L1.40399 12.4154L1 12.2053V11.75V4.25V3.79466L1.40399 3.58459L7.65399 0.334591L8 0.154663ZM2.5 11.2947V5.44058L7.25 7.81559V13.7647L2.5 11.2947ZM8.75 13.7647L13.5 11.2947V5.44056L8.75 7.81556V13.7647ZM8 1.84534L12.5766 4.22519L7.99998 6.51352L3.42335 4.2252L8 1.84534Z\"\n        fill=\"currentColor\"\n        fillRule=\"evenodd\"\n      />\n    </svg>\n  );\n};\n\nexport const HomeIcon = ({ size = 16 }: { size: number }) => {\n  return (\n    <svg\n      height={size}\n      strokeLinejoin=\"round\"\n      style={{ color: \"currentcolor\" }}\n      viewBox=\"0 0 16 16\"\n      width={size}\n    >\n      <path\n        clipRule=\"evenodd\"\n        d=\"M12.5 6.56062L8.00001 2.06062L3.50001 6.56062V13.5L6.00001 13.5V11C6.00001 9.89539 6.89544 8.99996 8.00001 8.99996C9.10458 8.99996 10 9.89539 10 11V13.5L12.5 13.5V6.56062ZM13.78 5.71933L8.70711 0.646409C8.31659 0.255886 7.68342 0.255883 7.2929 0.646409L2.21987 5.71944C2.21974 5.71957 2.21961 5.7197 2.21949 5.71982L0.469676 7.46963L-0.0606537 7.99996L1.00001 9.06062L1.53034 8.53029L2.00001 8.06062V14.25V15H2.75001L6.00001 15H7.50001H8.50001H10L13.25 15H14V14.25V8.06062L14.4697 8.53029L15 9.06062L16.0607 7.99996L15.5303 7.46963L13.7806 5.71993C13.7804 5.71973 13.7802 5.71953 13.78 5.71933ZM8.50001 11V13.5H7.50001V11C7.50001 10.7238 7.72386 10.5 8.00001 10.5C8.27615 10.5 8.50001 10.7238 8.50001 11Z\"\n        fill=\"currentColor\"\n        fillRule=\"evenodd\"\n      />\n    </svg>\n  );\n};\n\nexport const GPSIcon = ({ size = 16 }: { size: number }) => {\n  return (\n    <svg\n      height={size}\n      strokeLinejoin=\"round\"\n      style={{ color: \"currentcolor\" }}\n      viewBox=\"0 0 16 16\"\n      width={size}\n    >\n      <path\n        d=\"M1 6L15 1L10 15L7.65955 8.91482C7.55797 8.65073 7.34927 8.44203 7.08518 8.34045L1 6Z\"\n        fill=\"transparent\"\n        stroke=\"currentColor\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"bevel\"\n        strokeWidth=\"1.5\"\n      />\n    </svg>\n  );\n};\n\nexport const InvoiceIcon = ({ size = 16 }: { size: number }) => {\n  return (\n    <svg\n      height={size}\n      strokeLinejoin=\"round\"\n      style={{ color: \"currentcolor\" }}\n      viewBox=\"0 0 16 16\"\n      width={size}\n    >\n      <path\n        clipRule=\"evenodd\"\n        d=\"M13 15.1L12 14.5L10.1524 15.8857C10.0621 15.9534 9.93791 15.9534 9.8476 15.8857L8 14.5L6.14377 15.8922C6.05761 15.9568 5.94008 15.9601 5.85047 15.9003L3.75 14.5L3 15L2.83257 15.1116L1.83633 15.7758L1.68656 15.8756C1.60682 15.9288 1.5 15.8716 1.5 15.7758V15.5958V14.3985V14.1972V1.5V0H3H8H9.08579C9.351 0 9.60536 0.105357 9.79289 0.292893L14.2071 4.70711C14.3946 4.89464 14.5 5.149 14.5 5.41421V6.5V14.2507V14.411V15.5881V15.7881C14.5 15.8813 14.3982 15.9389 14.3183 15.891L14.1468 15.7881L13.1375 15.1825L13 15.1ZM12.3787 5L9.5 2.12132V5H12.3787ZM8 1.5V5V6.5H9.5H13V13.3507L12.7717 13.2138L11.9069 12.6948L11.1 13.3L10 14.125L8.9 13.3L8 12.625L7.1 13.3L5.94902 14.1632L4.58205 13.2519L3.75 12.6972L3 13.1972V1.5H8Z\"\n        fill=\"currentColor\"\n        fillRule=\"evenodd\"\n      />\n    </svg>\n  );\n};\n\nexport const LogoOpenAI = ({ size = 16 }: { size?: number }) => {\n  return (\n    <svg\n      height={size}\n      strokeLinejoin=\"round\"\n      style={{ color: \"currentcolor\" }}\n      viewBox=\"0 0 16 16\"\n      width={size}\n    >\n      <path\n        d=\"M14.9449 6.54871C15.3128 5.45919 15.1861 4.26567 14.5978 3.27464C13.7131 1.75461 11.9345 0.972595 10.1974 1.3406C9.42464 0.481584 8.3144 -0.00692594 7.15045 7.42132e-05C5.37487 -0.00392587 3.79946 1.1241 3.2532 2.79113C2.11256 3.02164 1.12799 3.72615 0.551837 4.72468C-0.339497 6.24071 -0.1363 8.15175 1.05451 9.45178C0.686626 10.5413 0.813308 11.7348 1.40162 12.7258C2.28637 14.2459 4.06498 15.0279 5.80204 14.6599C6.5743 15.5189 7.68504 16.0074 8.849 15.9999C10.6256 16.0044 12.2015 14.8754 12.7478 13.2069C13.8884 12.9764 14.873 12.2718 15.4491 11.2733C16.3394 9.75728 16.1357 7.84774 14.9454 6.54771L14.9449 6.54871ZM8.85001 14.9544C8.13907 14.9554 7.45043 14.7099 6.90468 14.2604C6.92951 14.2474 6.97259 14.2239 7.00046 14.2069L10.2293 12.3668C10.3945 12.2743 10.4959 12.1008 10.4949 11.9133V7.42173L11.8595 8.19925C11.8742 8.20625 11.8838 8.22025 11.8858 8.23625V11.9558C11.8838 13.6099 10.5263 14.9509 8.85001 14.9544ZM2.32133 12.2028C1.9651 11.5958 1.8369 10.8843 1.95902 10.1938C1.98284 10.2078 2.02489 10.2333 2.05479 10.2503L5.28366 12.0903C5.44733 12.1848 5.65003 12.1848 5.81421 12.0903L9.75604 9.84429V11.3993C9.75705 11.4153 9.74945 11.4308 9.73678 11.4408L6.47295 13.3004C5.01915 14.1264 3.1625 13.6354 2.32184 12.2028H2.32133ZM1.47155 5.24819C1.82626 4.64017 2.38619 4.17516 3.05305 3.93366C3.05305 3.96116 3.05152 4.00966 3.05152 4.04366V7.72424C3.05051 7.91124 3.15186 8.08475 3.31654 8.17725L7.25838 10.4228L5.89376 11.2003C5.88008 11.2093 5.86285 11.2108 5.84765 11.2043L2.58331 9.34327C1.13255 8.51426 0.63494 6.68272 1.47104 5.24869L1.47155 5.24819ZM12.6834 7.82274L8.74157 5.57669L10.1062 4.79968C10.1199 4.79068 10.1371 4.78918 10.1523 4.79568L13.4166 6.65522C14.8699 7.48373 15.3681 9.31827 14.5284 10.7523C14.1732 11.3593 13.6138 11.8243 12.9474 12.0663V8.27575C12.9489 8.08875 12.8481 7.91574 12.6839 7.82274H12.6834ZM14.0414 5.8057C14.0176 5.7912 13.9756 5.7662 13.9457 5.7492L10.7168 3.90916C10.5531 3.81466 10.3504 3.81466 10.1863 3.90916L6.24442 6.15521V4.60017C6.2434 4.58417 6.251 4.56867 6.26367 4.55867L9.52751 2.70063C10.9813 1.87311 12.84 2.36563 13.6781 3.80066C14.0323 4.40667 14.1605 5.11618 14.0404 5.8057H14.0414ZM5.50257 8.57726L4.13744 7.79974C4.12275 7.79274 4.11312 7.77874 4.11109 7.76274V4.04316C4.11211 2.38713 5.47368 1.0451 7.15197 1.0461C7.86189 1.0461 8.54902 1.2921 9.09476 1.74011C9.06993 1.75311 9.02737 1.77661 8.99899 1.79361L5.77012 3.63365C5.60493 3.72615 5.50358 3.89916 5.50459 4.08666L5.50257 8.57626V8.57726ZM6.24391 7.00022L7.99972 5.9997L9.75553 6.99972V9.00027L7.99972 10.0003L6.24391 9.00027V7.00022Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nexport const LogoGoogle = ({ size = 16 }: { size?: number }) => {\n  return (\n    <svg\n      data-testid=\"geist-icon\"\n      height={size}\n      strokeLinejoin=\"round\"\n      style={{ color: \"currentcolor\" }}\n      viewBox=\"0 0 16 16\"\n      width={size}\n    >\n      <path\n        d=\"M8.15991 6.54543V9.64362H12.4654C12.2763 10.64 11.709 11.4837 10.8581 12.0509L13.4544 14.0655C14.9671 12.6692 15.8399 10.6182 15.8399 8.18188C15.8399 7.61461 15.789 7.06911 15.6944 6.54552L8.15991 6.54543Z\"\n        fill=\"#4285F4\"\n      />\n      <path\n        d=\"M3.6764 9.52268L3.09083 9.97093L1.01807 11.5855C2.33443 14.1963 5.03241 16 8.15966 16C10.3196 16 12.1305 15.2873 13.4542 14.0655L10.8578 12.0509C10.1451 12.5309 9.23598 12.8219 8.15966 12.8219C6.07967 12.8219 4.31245 11.4182 3.67967 9.5273L3.6764 9.52268Z\"\n        fill=\"#34A853\"\n      />\n      <path\n        d=\"M1.01803 4.41455C0.472607 5.49087 0.159912 6.70543 0.159912 7.99995C0.159912 9.29447 0.472607 10.509 1.01803 11.5854C1.01803 11.5926 3.6799 9.51991 3.6799 9.51991C3.5199 9.03991 3.42532 8.53085 3.42532 7.99987C3.42532 7.46889 3.5199 6.95983 3.6799 6.47983L1.01803 4.41455Z\"\n        fill=\"#FBBC05\"\n      />\n      <path\n        d=\"M8.15982 3.18545C9.33802 3.18545 10.3853 3.59271 11.2216 4.37818L13.5125 2.0873C12.1234 0.792777 10.3199 0 8.15982 0C5.03257 0 2.33443 1.79636 1.01807 4.41455L3.67985 6.48001C4.31254 4.58908 6.07983 3.18545 8.15982 3.18545Z\"\n        fill=\"#EA4335\"\n      />\n    </svg>\n  );\n};\n\nexport const LogoAnthropic = () => {\n  return (\n    <svg\n      height=\"18px\"\n      style={{ color: \"currentcolor\", fill: \"currentcolor\" }}\n      viewBox=\"0 0 92.2 65\"\n      width=\"18px\"\n      x=\"0px\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n      y=\"0px\"\n    >\n      <path\n        d=\"M66.5,0H52.4l25.7,65h14.1L66.5,0z M25.7,0L0,65h14.4l5.3-13.6h26.9L51.8,65h14.4L40.5,0C40.5,0,25.7,0,25.7,0z\n\t\tM24.3,39.3l8.8-22.8l8.8,22.8H24.3z\"\n      />\n    </svg>\n  );\n};\n\nexport const RouteIcon = ({ size = 16 }: { size?: number }) => {\n  return (\n    <svg\n      height={size}\n      strokeLinejoin=\"round\"\n      style={{ color: \"currentcolor\" }}\n      viewBox=\"0 0 16 16\"\n      width={size}\n    >\n      <path\n        clipRule=\"evenodd\"\n        d=\"M7.53033 0.719661L7 0.189331L5.93934 1.24999L6.46967 1.78032L6.68934 1.99999H3.375C1.51104 1.99999 0 3.51103 0 5.37499C0 7.23895 1.51104 8.74999 3.375 8.74999H12.625C13.6605 8.74999 14.5 9.58946 14.5 10.625C14.5 11.6605 13.6605 12.5 12.625 12.5H4.88555C4.56698 11.4857 3.61941 10.75 2.5 10.75C1.11929 10.75 0 11.8693 0 13.25C0 14.6307 1.11929 15.75 2.5 15.75C3.61941 15.75 4.56698 15.0143 4.88555 14H12.625C14.489 14 16 12.489 16 10.625C16 8.76103 14.489 7.24999 12.625 7.24999H3.375C2.33947 7.24999 1.5 6.41052 1.5 5.37499C1.5 4.33946 2.33947 3.49999 3.375 3.49999H6.68934L6.46967 3.71966L5.93934 4.24999L7 5.31065L7.53033 4.78032L8.85355 3.4571C9.24408 3.06657 9.24408 2.43341 8.85355 2.04288L7.53033 0.719661ZM2.5 14.25C3.05228 14.25 3.5 13.8023 3.5 13.25C3.5 12.6977 3.05228 12.25 2.5 12.25C1.94772 12.25 1.5 12.6977 1.5 13.25C1.5 13.8023 1.94772 14.25 2.5 14.25ZM14.5 2.74999C14.5 3.30228 14.0523 3.74999 13.5 3.74999C12.9477 3.74999 12.5 3.30228 12.5 2.74999C12.5 2.19771 12.9477 1.74999 13.5 1.74999C14.0523 1.74999 14.5 2.19771 14.5 2.74999ZM16 2.74999C16 4.1307 14.8807 5.24999 13.5 5.24999C12.1193 5.24999 11 4.1307 11 2.74999C11 1.36928 12.1193 0.249991 13.5 0.249991C14.8807 0.249991 16 1.36928 16 2.74999Z\"\n        fill=\"currentColor\"\n        fillRule=\"evenodd\"\n      />\n    </svg>\n  );\n};\n\nexport const FileIcon = ({ size = 16 }: { size?: number }) => {\n  return (\n    <svg\n      height={size}\n      strokeLinejoin=\"round\"\n      style={{ color: \"currentcolor\" }}\n      viewBox=\"0 0 16 16\"\n      width={size}\n    >\n      <path\n        clipRule=\"evenodd\"\n        d=\"M14.5 13.5V6.5V5.41421C14.5 5.149 14.3946 4.89464 14.2071 4.70711L9.79289 0.292893C9.60536 0.105357 9.351 0 9.08579 0H8H3H1.5V1.5V13.5C1.5 14.8807 2.61929 16 4 16H12C13.3807 16 14.5 14.8807 14.5 13.5ZM13 13.5V6.5H9.5H8V5V1.5H3V13.5C3 14.0523 3.44772 14.5 4 14.5H12C12.5523 14.5 13 14.0523 13 13.5ZM9.5 5V2.12132L12.3787 5H9.5ZM5.13 5.00062H4.505V6.25062H5.13H6H6.625V5.00062H6H5.13ZM4.505 8H5.13H11H11.625V9.25H11H5.13H4.505V8ZM5.13 11H4.505V12.25H5.13H11H11.625V11H11H5.13Z\"\n        fill=\"currentColor\"\n        fillRule=\"evenodd\"\n      />\n    </svg>\n  );\n};\n\nexport const LoaderIcon = ({ size = 16 }: { size?: number }) => {\n  return (\n    <svg\n      height={size}\n      strokeLinejoin=\"round\"\n      style={{ color: \"currentcolor\" }}\n      viewBox=\"0 0 16 16\"\n      width={size}\n    >\n      <g clipPath=\"url(#clip0_2393_1490)\">\n        <path d=\"M8 0V4\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n        <path\n          d=\"M8 16V12\"\n          opacity=\"0.5\"\n          stroke=\"currentColor\"\n          strokeWidth=\"1.5\"\n        />\n        <path\n          d=\"M3.29773 1.52783L5.64887 4.7639\"\n          opacity=\"0.9\"\n          stroke=\"currentColor\"\n          strokeWidth=\"1.5\"\n        />\n        <path\n          d=\"M12.7023 1.52783L10.3511 4.7639\"\n          opacity=\"0.1\"\n          stroke=\"currentColor\"\n          strokeWidth=\"1.5\"\n        />\n        <path\n          d=\"M12.7023 14.472L10.3511 11.236\"\n          opacity=\"0.4\"\n          stroke=\"currentColor\"\n          strokeWidth=\"1.5\"\n        />\n        <path\n          d=\"M3.29773 14.472L5.64887 11.236\"\n          opacity=\"0.6\"\n          stroke=\"currentColor\"\n          strokeWidth=\"1.5\"\n        />\n        <path\n          d=\"M15.6085 5.52783L11.8043 6.7639\"\n          opacity=\"0.2\"\n          stroke=\"currentColor\"\n          strokeWidth=\"1.5\"\n        />\n        <path\n          d=\"M0.391602 10.472L4.19583 9.23598\"\n          opacity=\"0.7\"\n          stroke=\"currentColor\"\n          strokeWidth=\"1.5\"\n        />\n        <path\n          d=\"M15.6085 10.4722L11.8043 9.2361\"\n          opacity=\"0.3\"\n          stroke=\"currentColor\"\n          strokeWidth=\"1.5\"\n        />\n        <path\n          d=\"M0.391602 5.52783L4.19583 6.7639\"\n          opacity=\"0.8\"\n          stroke=\"currentColor\"\n          strokeWidth=\"1.5\"\n        />\n      </g>\n      <defs>\n        <clipPath id=\"clip0_2393_1490\">\n          <rect fill=\"white\" height=\"16\" width=\"16\" />\n        </clipPath>\n      </defs>\n    </svg>\n  );\n};\n\nexport const UploadIcon = ({ size = 16 }: { size?: number }) => {\n  return (\n    <svg\n      data-testid=\"geist-icon\"\n      height={size}\n      strokeLinejoin=\"round\"\n      style={{ color: \"currentcolor\" }}\n      viewBox=\"0 0 16 16\"\n      width={size}\n    >\n      <path\n        clipRule=\"evenodd\"\n        d=\"M1.5 4.875C1.5 3.01104 3.01104 1.5 4.875 1.5C6.20018 1.5 7.34838 2.26364 7.901 3.37829C8.1902 3.96162 8.79547 4.5 9.60112 4.5H12.25C13.4926 4.5 14.5 5.50736 14.5 6.75C14.5 7.42688 14.202 8.03329 13.7276 8.44689L13.1622 8.93972L14.1479 10.0704L14.7133 9.57758C15.5006 8.89123 16 7.8785 16 6.75C16 4.67893 14.3211 3 12.25 3H9.60112C9.51183 3 9.35322 2.93049 9.2449 2.71201C8.44888 1.1064 6.79184 0 4.875 0C2.18261 0 0 2.18261 0 4.875V6.40385C0 7.69502 0.598275 8.84699 1.52982 9.59656L2.11415 10.0667L3.0545 8.89808L2.47018 8.42791C1.87727 7.95083 1.5 7.22166 1.5 6.40385V4.875ZM7.29289 7.39645C7.68342 7.00592 8.31658 7.00592 8.70711 7.39645L11.7803 10.4697L12.3107 11L11.25 12.0607L10.7197 11.5303L8.75 9.56066V15.25V16H7.25V15.25V9.56066L5.28033 11.5303L4.75 12.0607L3.68934 11L4.21967 10.4697L7.29289 7.39645Z\"\n        fill=\"currentColor\"\n        fillRule=\"evenodd\"\n      />\n    </svg>\n  );\n};\n\nexport const MenuIcon = ({ size = 16 }: { size?: number }) => {\n  return (\n    <svg\n      height={size}\n      strokeLinejoin=\"round\"\n      style={{ color: \"currentcolor\" }}\n      viewBox=\"0 0 16 16\"\n      width={size}\n    >\n      <path\n        clipRule=\"evenodd\"\n        d=\"M1 2H1.75H14.25H15V3.5H14.25H1.75H1V2ZM1 12.5H1.75H14.25H15V14H14.25H1.75H1V12.5ZM1.75 7.25H1V8.75H1.75H14.25H15V7.25H14.25H1.75Z\"\n        fill=\"currentColor\"\n        fillRule=\"evenodd\"\n      />\n    </svg>\n  );\n};\n\nexport const PencilEditIcon = ({ size = 16 }: { size?: number }) => {\n  return (\n    <svg\n      height={size}\n      strokeLinejoin=\"round\"\n      style={{ color: \"currentcolor\" }}\n      viewBox=\"0 0 16 16\"\n      width={size}\n    >\n      <path\n        clipRule=\"evenodd\"\n        d=\"M11.75 0.189331L12.2803 0.719661L15.2803 3.71966L15.8107 4.24999L15.2803 4.78032L5.15901 14.9016C4.45575 15.6049 3.50192 16 2.50736 16H0.75H0V15.25V13.4926C0 12.4981 0.395088 11.5442 1.09835 10.841L11.2197 0.719661L11.75 0.189331ZM11.75 2.31065L9.81066 4.24999L11.75 6.18933L13.6893 4.24999L11.75 2.31065ZM2.15901 11.9016L8.75 5.31065L10.6893 7.24999L4.09835 13.841C3.67639 14.2629 3.1041 14.5 2.50736 14.5H1.5V13.4926C1.5 12.8959 1.73705 12.3236 2.15901 11.9016ZM9 16H16V14.5H9V16Z\"\n        fill=\"currentColor\"\n        fillRule=\"evenodd\"\n      />\n    </svg>\n  );\n};\n\nexport const CheckedSquare = ({ size = 16 }: { size?: number }) => {\n  return (\n    <svg\n      height={size}\n      strokeLinejoin=\"round\"\n      style={{ color: \"currentcolor\" }}\n      viewBox=\"0 0 16 16\"\n      width={size}\n    >\n      <path\n        clipRule=\"evenodd\"\n        d=\"M15 16H1C0.447715 16 0 15.5523 0 15V1C0 0.447715 0.447716 0 1 0L15 8.17435e-06C15.5523 8.47532e-06 16 0.447724 16 1.00001V15C16 15.5523 15.5523 16 15 16ZM11.7803 6.28033L12.3107 5.75L11.25 4.68934L10.7197 5.21967L6.5 9.43935L5.28033 8.21967L4.75001 7.68934L3.68934 8.74999L4.21967 9.28033L5.96967 11.0303C6.11032 11.171 6.30109 11.25 6.5 11.25C6.69891 11.25 6.88968 11.171 7.03033 11.0303L11.7803 6.28033Z\"\n        fill=\"currentColor\"\n        fillRule=\"evenodd\"\n      />\n    </svg>\n  );\n};\n\nexport const UncheckedSquare = ({ size = 16 }: { size?: number }) => {\n  return (\n    <svg\n      height={size}\n      strokeLinejoin=\"round\"\n      style={{ color: \"currentcolor\" }}\n      viewBox=\"0 0 16 16\"\n      width={size}\n    >\n      <rect\n        fill=\"none\"\n        height=\"14\"\n        stroke=\"currentColor\"\n        strokeWidth=\"1.5\"\n        width=\"14\"\n        x=\"1\"\n        y=\"1\"\n      />\n    </svg>\n  );\n};\n\nexport const MoreIcon = ({ size = 16 }: { size?: number }) => {\n  return (\n    <svg\n      height={size}\n      strokeLinejoin=\"round\"\n      style={{ color: \"currentcolor\" }}\n      viewBox=\"0 0 16 16\"\n      width={size}\n    >\n      <path\n        clipRule=\"evenodd\"\n        d=\"M8 4C7.17157 4 6.5 3.32843 6.5 2.5C6.5 1.67157 7.17157 1 8 1C8.82843 1 9.5 1.67157 9.5 2.5C9.5 3.32843 8.82843 4 8 4ZM8 9.5C7.17157 9.5 6.5 8.82843 6.5 8C6.5 7.17157 7.17157 6.5 8 6.5C8.82843 6.5 9.5 7.17157 9.5 8C9.5 8.82843 8.82843 9.5 8 9.5ZM6.5 13.5C6.5 14.3284 7.17157 15 8 15C8.82843 15 9.5 14.3284 9.5 13.5C9.5 12.6716 8.82843 12 8 12C7.17157 12 6.5 12.6716 6.5 13.5Z\"\n        fill=\"currentColor\"\n        fillRule=\"evenodd\"\n      />\n    </svg>\n  );\n};\n\nexport const TrashIcon = ({ size = 16 }: { size?: number }) => {\n  return (\n    <svg\n      height={size}\n      strokeLinejoin=\"round\"\n      style={{ color: \"currentcolor\" }}\n      viewBox=\"0 0 16 16\"\n      width={size}\n    >\n      <path\n        clipRule=\"evenodd\"\n        d=\"M6.75 2.75C6.75 2.05964 7.30964 1.5 8 1.5C8.69036 1.5 9.25 2.05964 9.25 2.75V3H6.75V2.75ZM5.25 3V2.75C5.25 1.23122 6.48122 0 8 0C9.51878 0 10.75 1.23122 10.75 2.75V3H12.9201H14.25H15V4.5H14.25H13.8846L13.1776 13.6917C13.0774 14.9942 11.9913 16 10.6849 16H5.31508C4.00874 16 2.92263 14.9942 2.82244 13.6917L2.11538 4.5H1.75H1V3H1.75H3.07988H5.25ZM4.31802 13.5767L3.61982 4.5H12.3802L11.682 13.5767C11.6419 14.0977 11.2075 14.5 10.6849 14.5H5.31508C4.79254 14.5 4.3581 14.0977 4.31802 13.5767Z\"\n        fill=\"currentColor\"\n        fillRule=\"evenodd\"\n      />\n    </svg>\n  );\n};\n\nexport const InfoIcon = ({ size = 16 }: { size?: number }) => {\n  return (\n    <svg\n      height={size}\n      strokeLinejoin=\"round\"\n      style={{ color: \"currentcolor\" }}\n      viewBox=\"0 0 16 16\"\n      width={size}\n    >\n      <path\n        clipRule=\"evenodd\"\n        d=\"M16 8C16 12.4183 12.4183 16 8 16C3.58172 16 0 12.4183 0 8C0 3.58172 3.58172 0 8 0C12.4183 0 16 3.58172 16 8ZM6.25002 7H7.00002H7.75C8.30229 7 8.75 7.44772 8.75 8V11.5V12.25H7.25V11.5V8.5H7.00002H6.25002V7ZM8 6C8.55229 6 9 5.55228 9 5C9 4.44772 8.55229 4 8 4C7.44772 4 7 4.44772 7 5C7 5.55228 7.44772 6 8 6Z\"\n        fill=\"currentColor\"\n        fillRule=\"evenodd\"\n      />\n    </svg>\n  );\n};\n\nexport const ArrowUpIcon = ({\n  size = 16,\n  ...props\n}: { size?: number } & React.SVGProps<SVGSVGElement>) => {\n  return (\n    <svg\n      height={size}\n      strokeLinejoin=\"round\"\n      style={{ color: \"currentcolor\", ...props.style }}\n      viewBox=\"0 0 16 16\"\n      width={size}\n      {...props}\n    >\n      <path\n        clipRule=\"evenodd\"\n        d=\"M8.70711 1.39644C8.31659 1.00592 7.68342 1.00592 7.2929 1.39644L2.21968 6.46966L1.68935 6.99999L2.75001 8.06065L3.28034 7.53032L7.25001 3.56065V14.25V15H8.75001V14.25V3.56065L12.7197 7.53032L13.25 8.06065L14.3107 6.99999L13.7803 6.46966L8.70711 1.39644Z\"\n        fill=\"currentColor\"\n        fillRule=\"evenodd\"\n      />\n    </svg>\n  );\n};\n\nexport const StopIcon = ({\n  size = 16,\n  ...props\n}: { size?: number } & React.SVGProps<SVGSVGElement>) => {\n  return (\n    <svg\n      height={size}\n      style={{ color: \"currentcolor\", ...props.style }}\n      viewBox=\"0 0 16 16\"\n      width={size}\n      {...props}\n    >\n      <path\n        clipRule=\"evenodd\"\n        d=\"M3 3H13V13H3V3Z\"\n        fill=\"currentColor\"\n        fillRule=\"evenodd\"\n      />\n    </svg>\n  );\n};\n\nexport const PaperclipIcon = ({\n  size = 16,\n  ...props\n}: { size?: number } & React.SVGProps<SVGSVGElement>) => {\n  return (\n    <svg\n      className=\"-rotate-45\"\n      height={size}\n      strokeLinejoin=\"round\"\n      style={{ color: \"currentcolor\", ...props.style }}\n      viewBox=\"0 0 16 16\"\n      width={size}\n      {...props}\n    >\n      <path\n        clipRule=\"evenodd\"\n        d=\"M10.8591 1.70735C10.3257 1.70735 9.81417 1.91925 9.437 2.29643L3.19455 8.53886C2.56246 9.17095 2.20735 10.0282 2.20735 10.9222C2.20735 11.8161 2.56246 12.6734 3.19455 13.3055C3.82665 13.9376 4.68395 14.2927 5.57786 14.2927C6.47178 14.2927 7.32908 13.9376 7.96117 13.3055L14.2036 7.06304L14.7038 6.56287L15.7041 7.56321L15.204 8.06337L8.96151 14.3058C8.06411 15.2032 6.84698 15.7074 5.57786 15.7074C4.30875 15.7074 3.09162 15.2032 2.19422 14.3058C1.29682 13.4084 0.792664 12.1913 0.792664 10.9222C0.792664 9.65305 1.29682 8.43592 2.19422 7.53852L8.43666 1.29609C9.07914 0.653606 9.95054 0.292664 10.8591 0.292664C11.7678 0.292664 12.6392 0.653606 13.2816 1.29609C13.9241 1.93857 14.2851 2.80997 14.2851 3.71857C14.2851 4.62718 13.9241 5.49858 13.2816 6.14106L13.2814 6.14133L7.0324 12.3835C7.03231 12.3836 7.03222 12.3837 7.03213 12.3838C6.64459 12.7712 6.11905 12.9888 5.57107 12.9888C5.02297 12.9888 4.49731 12.7711 4.10974 12.3835C3.72217 11.9959 3.50444 11.4703 3.50444 10.9222C3.50444 10.3741 3.72217 9.8484 4.10974 9.46084L4.11004 9.46054L9.877 3.70039L10.3775 3.20051L11.3772 4.20144L10.8767 4.70131L5.11008 10.4612C5.11005 10.4612 5.11003 10.4612 5.11 10.4613C4.98779 10.5835 4.91913 10.7493 4.91913 10.9222C4.91913 11.0951 4.98782 11.2609 5.11008 11.3832C5.23234 11.5054 5.39817 11.5741 5.57107 11.5741C5.74398 11.5741 5.9098 11.5054 6.03206 11.3832L6.03233 11.3829L12.2813 5.14072C12.2814 5.14063 12.2815 5.14054 12.2816 5.14045C12.6586 4.7633 12.8704 4.25185 12.8704 3.71857C12.8704 3.18516 12.6585 2.6736 12.2813 2.29643C11.9041 1.91925 11.3926 1.70735 10.8591 1.70735Z\"\n        fill=\"currentColor\"\n        fillRule=\"evenodd\"\n      />\n    </svg>\n  );\n};\n\nexport const MoreHorizontalIcon = ({ size = 16 }: { size?: number }) => {\n  return (\n    <svg\n      height={size}\n      strokeLinejoin=\"round\"\n      style={{ color: \"currentcolor\" }}\n      viewBox=\"0 0 16 16\"\n      width={size}\n    >\n      <path\n        clipRule=\"evenodd\"\n        d=\"M4 8C4 8.82843 3.32843 9.5 2.5 9.5C1.67157 9.5 1 8.82843 1 8C1 7.17157 1.67157 6.5 2.5 6.5C3.32843 6.5 4 7.17157 4 8ZM9.5 8C9.5 8.82843 8.82843 9.5 8 9.5C7.17157 9.5 6.5 8.82843 6.5 8C6.5 7.17157 7.17157 6.5 8 6.5C8.82843 6.5 9.5 7.17157 9.5 8ZM13.5 9.5C14.3284 9.5 15 8.82843 15 8C15 7.17157 14.3284 6.5 13.5 6.5C12.6716 6.5 12 7.17157 12 8C12 8.82843 12.6716 9.5 13.5 9.5Z\"\n        fill=\"currentColor\"\n        fillRule=\"evenodd\"\n      />\n    </svg>\n  );\n};\n\nexport const MessageIcon = ({ size = 16 }: { size?: number }) => {\n  return (\n    <svg\n      height={size}\n      strokeLinejoin=\"round\"\n      style={{ color: \"currentcolor\" }}\n      viewBox=\"0 0 16 16\"\n      width={size}\n    >\n      <path\n        clipRule=\"evenodd\"\n        d=\"M2.8914 10.4028L2.98327 10.6318C3.22909 11.2445 3.5 12.1045 3.5 13C3.5 13.3588 3.4564 13.7131 3.38773 14.0495C3.69637 13.9446 4.01409 13.8159 4.32918 13.6584C4.87888 13.3835 5.33961 13.0611 5.70994 12.7521L6.22471 12.3226L6.88809 12.4196C7.24851 12.4724 7.61994 12.5 8 12.5C11.7843 12.5 14.5 9.85569 14.5 7C14.5 4.14431 11.7843 1.5 8 1.5C4.21574 1.5 1.5 4.14431 1.5 7C1.5 8.18175 1.94229 9.29322 2.73103 10.2153L2.8914 10.4028ZM2.8135 15.7653C1.76096 16 1 16 1 16C1 16 1.43322 15.3097 1.72937 14.4367C1.88317 13.9834 2 13.4808 2 13C2 12.3826 1.80733 11.7292 1.59114 11.1903C0.591845 10.0221 0 8.57152 0 7C0 3.13401 3.58172 0 8 0C12.4183 0 16 3.13401 16 7C16 10.866 12.4183 14 8 14C7.54721 14 7.10321 13.9671 6.67094 13.9038C6.22579 14.2753 5.66881 14.6656 5 15C4.23366 15.3832 3.46733 15.6195 2.8135 15.7653Z\"\n        fill=\"currentColor\"\n        fillRule=\"evenodd\"\n      />\n    </svg>\n  );\n};\n\nexport const CrossIcon = ({ size = 16 }: { size?: number }) => (\n  <svg\n    height={size}\n    strokeLinejoin=\"round\"\n    style={{ color: \"currentcolor\" }}\n    viewBox=\"0 0 16 16\"\n    width={size}\n  >\n    <path\n      clipRule=\"evenodd\"\n      d=\"M12.4697 13.5303L13 14.0607L14.0607 13L13.5303 12.4697L9.06065 7.99999L13.5303 3.53032L14.0607 2.99999L13 1.93933L12.4697 2.46966L7.99999 6.93933L3.53032 2.46966L2.99999 1.93933L1.93933 2.99999L2.46966 3.53032L6.93933 7.99999L2.46966 12.4697L1.93933 13L2.99999 14.0607L3.53032 13.5303L7.99999 9.06065L12.4697 13.5303Z\"\n      fill=\"currentColor\"\n      fillRule=\"evenodd\"\n    />\n  </svg>\n);\n\nexport const CrossSmallIcon = ({ size = 16 }: { size?: number }) => (\n  <svg\n    height={size}\n    strokeLinejoin=\"round\"\n    style={{ color: \"currentcolor\" }}\n    viewBox=\"0 0 16 16\"\n    width={size}\n  >\n    <path\n      clipRule=\"evenodd\"\n      d=\"M9.96966 11.0303L10.5 11.5607L11.5607 10.5L11.0303 9.96966L9.06065 7.99999L11.0303 6.03032L11.5607 5.49999L10.5 4.43933L9.96966 4.96966L7.99999 6.93933L6.03032 4.96966L5.49999 4.43933L4.43933 5.49999L4.96966 6.03032L6.93933 7.99999L4.96966 9.96966L4.43933 10.5L5.49999 11.5607L6.03032 11.0303L7.99999 9.06065L9.96966 11.0303Z\"\n      fill=\"currentColor\"\n      fillRule=\"evenodd\"\n    />\n  </svg>\n);\n\nexport const UndoIcon = ({ size = 16 }: { size?: number }) => (\n  <svg\n    height={size}\n    strokeLinejoin=\"round\"\n    style={{ color: \"currentcolor\" }}\n    viewBox=\"0 0 16 16\"\n    width={size}\n  >\n    <path\n      clipRule=\"evenodd\"\n      d=\"M13.5 8C13.5 4.96643 11.0257 2.5 7.96452 2.5C5.42843 2.5 3.29365 4.19393 2.63724 6.5H5.25H6V8H5.25H0.75C0.335787 8 0 7.66421 0 7.25V2.75V2H1.5V2.75V5.23347C2.57851 2.74164 5.06835 1 7.96452 1C11.8461 1 15 4.13001 15 8C15 11.87 11.8461 15 7.96452 15C5.62368 15 3.54872 13.8617 2.27046 12.1122L1.828 11.5066L3.03915 10.6217L3.48161 11.2273C4.48831 12.6051 6.12055 13.5 7.96452 13.5C11.0257 13.5 13.5 11.0336 13.5 8Z\"\n      fill=\"currentColor\"\n      fillRule=\"evenodd\"\n    />\n  </svg>\n);\n\nexport const RedoIcon = ({ size = 16 }: { size?: number }) => (\n  <svg\n    height={size}\n    strokeLinejoin=\"round\"\n    style={{ color: \"currentcolor\" }}\n    viewBox=\"0 0 16 16\"\n    width={size}\n  >\n    <path\n      clipRule=\"evenodd\"\n      d=\"M2.5 8C2.5 4.96643 4.97431 2.5 8.03548 2.5C10.5716 2.5 12.7064 4.19393 13.3628 6.5H10.75H10V8H10.75H15.25C15.6642 8 16 7.66421 16 7.25V2.75V2H14.5V2.75V5.23347C13.4215 2.74164 10.9316 1 8.03548 1C4.1539 1 1 4.13001 1 8C1 11.87 4.1539 15 8.03548 15C10.3763 15 12.4513 13.8617 13.7295 12.1122L14.172 11.5066L12.9609 10.6217L12.5184 11.2273C11.5117 12.6051 9.87945 13.5 8.03548 13.5C4.97431 13.5 2.5 11.0336 2.5 8Z\"\n      fill=\"currentColor\"\n      fillRule=\"evenodd\"\n    />\n  </svg>\n);\n\nexport const DeltaIcon = ({ size = 16 }: { size?: number }) => (\n  <svg\n    height={size}\n    strokeLinejoin=\"round\"\n    style={{ color: \"currentcolor\" }}\n    viewBox=\"0 0 16 16\"\n    width={size}\n  >\n    <path\n      clipRule=\"evenodd\"\n      d=\"M2.67705 15H1L1.75 13.5L6.16147 4.67705L6.15836 4.67082L6.16667 4.66667L7.16147 2.67705L8 1L8.83853 2.67705L14.25 13.5L15 15H13.3229H2.67705ZM7 6.3541L10.5729 13.5H3.42705L7 6.3541Z\"\n      fill=\"currentColor\"\n      fillRule=\"evenodd\"\n    />\n  </svg>\n);\n\nexport const CpuIcon = ({ size = 16 }: { size?: number }) => (\n  <svg\n    fill=\"none\"\n    height={size}\n    stroke=\"currentColor\"\n    strokeWidth=\"2\"\n    style={{ color: \"currentcolor\" }}\n    viewBox=\"0 0 24 24\"\n    width={size}\n  >\n    <path\n      d=\"M4 12C4 8.22876 4 6.34315 5.17157 5.17157C6.34315 4 8.22876 4 12 4C15.7712 4 17.6569 4 18.8284 5.17157C20 6.34315 20 8.22876 20 12C20 15.7712 20 17.6569 18.8284 18.8284C17.6569 20 15.7712 20 12 20C8.22876 20 6.34315 20 5.17157 18.8284C4 17.6569 4 15.7712 4 12Z\"\n      strokeLinejoin=\"round\"\n    />\n    <path d=\"M9.5 2V4\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n    <path d=\"M14.5 2V4\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n    <path d=\"M9.5 20V22\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n    <path d=\"M14.5 20V22\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n    <path d=\"M13 9L9 13\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n    <path d=\"M15 13L13 15\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n    <path d=\"M22 14.5L20 14.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n    <path d=\"M4 9.5L2 9.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n    <path d=\"M4 14.5L2 14.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n    <path d=\"M22 9.5L20 9.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n  </svg>\n);\n\nexport const PenIcon = ({ size = 16 }: { size?: number }) => (\n  <svg\n    height={size}\n    strokeLinejoin=\"round\"\n    style={{ color: \"currentcolor\" }}\n    viewBox=\"0 0 16 16\"\n    width={size}\n  >\n    <path\n      clipRule=\"evenodd\"\n      d=\"M8.75 0.189331L9.28033 0.719661L15.2803 6.71966L15.8107 7.24999L15.2803 7.78032L13.7374 9.32322C13.1911 9.8696 12.3733 9.97916 11.718 9.65188L9.54863 13.5568C8.71088 15.0648 7.12143 16 5.39639 16H0.75H0V15.25V10.6036C0 8.87856 0.935237 7.28911 2.4432 6.45136L6.34811 4.28196C6.02084 3.62674 6.13039 2.80894 6.67678 2.26255L8.21967 0.719661L8.75 0.189331ZM7.3697 5.43035L10.5696 8.63029L8.2374 12.8283C7.6642 13.8601 6.57668 14.5 5.39639 14.5H2.56066L5.53033 11.5303L4.46967 10.4697L1.5 13.4393V10.6036C1.5 9.42331 2.1399 8.33579 3.17166 7.76259L7.3697 5.43035ZM12.6768 8.26256C12.5791 8.36019 12.4209 8.36019 12.3232 8.26255L12.0303 7.96966L8.03033 3.96966L7.73744 3.67677C7.63981 3.57914 7.63981 3.42085 7.73744 3.32321L8.75 2.31065L13.6893 7.24999L12.6768 8.26256Z\"\n      fill=\"currentColor\"\n      fillRule=\"evenodd\"\n    />\n  </svg>\n);\n\nexport const SummarizeIcon = ({ size = 16 }: { size?: number }) => (\n  <svg\n    height={size}\n    strokeLinejoin=\"round\"\n    style={{ color: \"currentcolor\" }}\n    viewBox=\"0 0 16 16\"\n    width={size}\n  >\n    <path\n      clipRule=\"evenodd\"\n      d=\"M1.75 12H1V10.5H1.75H5.25H6V12H5.25H1.75ZM1.75 7.75H1V6.25H1.75H4.25H5V7.75H4.25H1.75ZM1.75 3.5H1V2H1.75H7.25H8V3.5H7.25H1.75ZM12.5303 14.7803C12.2374 15.0732 11.7626 15.0732 11.4697 14.7803L9.21967 12.5303L8.68934 12L9.75 10.9393L10.2803 11.4697L11.25 12.4393V2.75V2H12.75V2.75V12.4393L13.7197 11.4697L14.25 10.9393L15.3107 12L14.7803 12.5303L12.5303 14.7803Z\"\n      fill=\"currentColor\"\n      fillRule=\"evenodd\"\n    />\n  </svg>\n);\n\nexport const SidebarLeftIcon = ({ size = 16 }: { size?: number }) => (\n  <svg\n    height={size}\n    strokeLinejoin=\"round\"\n    style={{ color: \"currentcolor\" }}\n    viewBox=\"0 0 16 16\"\n    width={size}\n  >\n    <path\n      clipRule=\"evenodd\"\n      d=\"M6.245 2.5H14.5V12.5C14.5 13.0523 14.0523 13.5 13.5 13.5H6.245V2.5ZM4.995 2.5H1.5V12.5C1.5 13.0523 1.94772 13.5 2.5 13.5H4.995V2.5ZM0 1H1.5H14.5H16V2.5V12.5C16 13.8807 14.8807 15 13.5 15H2.5C1.11929 15 0 13.8807 0 12.5V2.5V1Z\"\n      fill=\"currentColor\"\n      fillRule=\"evenodd\"\n    />\n  </svg>\n);\n\nexport const PlusIcon = ({ size = 16 }: { size?: number }) => (\n  <svg\n    height={size}\n    strokeLinejoin=\"round\"\n    style={{ color: \"currentcolor\" }}\n    viewBox=\"0 0 16 16\"\n    width={size}\n  >\n    <path\n      clipRule=\"evenodd\"\n      d=\"M 8.75,1 H7.25 V7.25 H1.5 V8.75 H7.25 V15 H8.75 V8.75 H14.5 V7.25 H8.75 V1.75 Z\"\n      fill=\"currentColor\"\n      fillRule=\"evenodd\"\n    />\n  </svg>\n);\n\nexport const CopyIcon = ({ size = 16 }: { size?: number }) => (\n  <svg\n    height={size}\n    strokeLinejoin=\"round\"\n    style={{ color: \"currentcolor\" }}\n    viewBox=\"0 0 16 16\"\n    width={size}\n  >\n    <path\n      clipRule=\"evenodd\"\n      d=\"M2.75 0.5C1.7835 0.5 1 1.2835 1 2.25V9.75C1 10.7165 1.7835 11.5 2.75 11.5H3.75H4.5V10H3.75H2.75C2.61193 10 2.5 9.88807 2.5 9.75V2.25C2.5 2.11193 2.61193 2 2.75 2H8.25C8.38807 2 8.5 2.11193 8.5 2.25V3H10V2.25C10 1.2835 9.2165 0.5 8.25 0.5H2.75ZM7.75 4.5C6.7835 4.5 6 5.2835 6 6.25V13.75C6 14.7165 6.7835 15.5 7.75 15.5H13.25C14.2165 15.5 15 14.7165 15 13.75V6.25C15 5.2835 14.2165 4.5 13.25 4.5H7.75ZM7.5 6.25C7.5 6.11193 7.61193 6 7.75 6H13.25C13.3881 6 13.5 6.11193 13.5 6.25V13.75C13.5 13.8881 13.3881 14 13.25 14H7.75C7.61193 14 7.5 13.8881 7.5 13.75V6.25Z\"\n      fill=\"currentColor\"\n      fillRule=\"evenodd\"\n    />\n  </svg>\n);\n\nexport const ThumbUpIcon = ({ size = 16 }: { size?: number }) => (\n  <svg\n    height={size}\n    strokeLinejoin=\"round\"\n    style={{ color: \"currentcolor\" }}\n    viewBox=\"0 0 16 16\"\n    width={size}\n  >\n    <path\n      clipRule=\"evenodd\"\n      d=\"M6.89531 2.23972C6.72984 2.12153 6.5 2.23981 6.5 2.44315V5.25001C6.5 6.21651 5.7165 7.00001 4.75 7.00001H2.5V13.5H12.1884C12.762 13.5 13.262 13.1096 13.4011 12.5532L14.4011 8.55318C14.5984 7.76425 14.0017 7.00001 13.1884 7.00001H9.25H8.5V6.25001V3.51458C8.5 3.43384 8.46101 3.35807 8.39531 3.31114L6.89531 2.23972ZM5 2.44315C5 1.01975 6.6089 0.191779 7.76717 1.01912L9.26717 2.09054C9.72706 2.41904 10 2.94941 10 3.51458V5.50001H13.1884C14.9775 5.50001 16.2903 7.18133 15.8563 8.91698L14.8563 12.917C14.5503 14.1412 13.4503 15 12.1884 15H1.75H1V14.25V6.25001V5.50001H1.75H4.75C4.88807 5.50001 5 5.38808 5 5.25001V2.44315Z\"\n      fill=\"currentColor\"\n      fillRule=\"evenodd\"\n    />\n  </svg>\n);\n\nexport const ThumbDownIcon = ({ size = 16 }: { size?: number }) => (\n  <svg\n    height={size}\n    strokeLinejoin=\"round\"\n    style={{ color: \"currentcolor\" }}\n    viewBox=\"0 0 16 16\"\n    width={size}\n  >\n    <path\n      clipRule=\"evenodd\"\n      d=\"M6.89531 13.7603C6.72984 13.8785 6.5 13.7602 6.5 13.5569V10.75C6.5 9.7835 5.7165 9 4.75 9H2.5V2.5H12.1884C12.762 2.5 13.262 2.89037 13.4011 3.44683L14.4011 7.44683C14.5984 8.23576 14.0017 9 13.1884 9H9.25H8.5V9.75V12.4854C8.5 12.5662 8.46101 12.6419 8.39531 12.6889L6.89531 13.7603ZM5 13.5569C5 14.9803 6.6089 15.8082 7.76717 14.9809L9.26717 13.9095C9.72706 13.581 10 13.0506 10 12.4854V10.5H13.1884C14.9775 10.5 16.2903 8.81868 15.8563 7.08303L14.8563 3.08303C14.5503 1.85882 13.4503 1 12.1884 1H1.75H1V1.75V9.75V10.5H1.75H4.75C4.88807 10.5 5 10.6119 5 10.75V13.5569Z\"\n      fill=\"currentColor\"\n      fillRule=\"evenodd\"\n    />\n  </svg>\n);\n\nexport const ChevronDownIcon = ({ size = 16 }: { size?: number }) => (\n  <svg\n    height={size}\n    strokeLinejoin=\"round\"\n    style={{ color: \"currentcolor\" }}\n    viewBox=\"0 0 16 16\"\n    width={size}\n  >\n    <path\n      clipRule=\"evenodd\"\n      d=\"M12.0607 6.74999L11.5303 7.28032L8.7071 10.1035C8.31657 10.4941 7.68341 10.4941 7.29288 10.1035L4.46966 7.28032L3.93933 6.74999L4.99999 5.68933L5.53032 6.21966L7.99999 8.68933L10.4697 6.21966L11 5.68933L12.0607 6.74999Z\"\n      fill=\"currentColor\"\n      fillRule=\"evenodd\"\n    />\n  </svg>\n);\n\nexport const SparklesIcon = ({ size = 16 }: { size?: number }) => (\n  <svg\n    height={size}\n    strokeLinejoin=\"round\"\n    style={{ color: \"currentcolor\" }}\n    viewBox=\"0 0 16 16\"\n    width={size}\n  >\n    <path\n      d=\"M2.5 0.5V0H3.5V0.5C3.5 1.60457 4.39543 2.5 5.5 2.5H6V3V3.5H5.5C4.39543 3.5 3.5 4.39543 3.5 5.5V6H3H2.5V5.5C2.5 4.39543 1.60457 3.5 0.5 3.5H0V3V2.5H0.5C1.60457 2.5 2.5 1.60457 2.5 0.5Z\"\n      fill=\"currentColor\"\n    />\n    <path\n      d=\"M14.5 4.5V5H13.5V4.5C13.5 3.94772 13.0523 3.5 12.5 3.5H12V3V2.5H12.5C13.0523 2.5 13.5 2.05228 13.5 1.5V1H14H14.5V1.5C14.5 2.05228 14.9477 2.5 15.5 2.5H16V3V3.5H15.5C14.9477 3.5 14.5 3.94772 14.5 4.5Z\"\n      fill=\"currentColor\"\n    />\n    <path\n      d=\"M8.40706 4.92939L8.5 4H9.5L9.59294 4.92939C9.82973 7.29734 11.7027 9.17027 14.0706 9.40706L15 9.5V10.5L14.0706 10.5929C11.7027 10.8297 9.82973 12.7027 9.59294 15.0706L9.5 16H8.5L8.40706 15.0706C8.17027 12.7027 6.29734 10.8297 3.92939 10.5929L3 10.5V9.5L3.92939 9.40706C6.29734 9.17027 8.17027 7.29734 8.40706 4.92939Z\"\n      fill=\"currentColor\"\n    />\n  </svg>\n);\n\nexport const CheckCircleFillIcon = ({ size = 16 }: { size?: number }) => {\n  return (\n    <svg\n      height={size}\n      strokeLinejoin=\"round\"\n      style={{ color: \"currentcolor\" }}\n      viewBox=\"0 0 16 16\"\n      width={size}\n    >\n      <path\n        clipRule=\"evenodd\"\n        d=\"M16 8C16 12.4183 12.4183 16 8 16C3.58172 16 0 12.4183 0 8C0 3.58172 3.58172 0 8 0C12.4183 0 16 3.58172 16 8ZM11.5303 6.53033L12.0607 6L11 4.93934L10.4697 5.46967L6.5 9.43934L5.53033 8.46967L5 7.93934L3.93934 9L4.46967 9.53033L5.96967 11.0303C6.26256 11.3232 6.73744 11.3232 7.03033 11.0303L11.5303 6.53033Z\"\n        fill=\"currentColor\"\n        fillRule=\"evenodd\"\n      />\n    </svg>\n  );\n};\n\nexport const GlobeIcon = ({ size = 16 }: { size?: number }) => {\n  return (\n    <svg\n      height={size}\n      strokeLinejoin=\"round\"\n      style={{ color: \"currentcolor\" }}\n      viewBox=\"0 0 16 16\"\n      width={size}\n    >\n      <path\n        clipRule=\"evenodd\"\n        d=\"M10.268 14.0934C11.9051 13.4838 13.2303 12.2333 13.9384 10.6469C13.1192 10.7941 12.2138 10.9111 11.2469 10.9925C11.0336 12.2005 10.695 13.2621 10.268 14.0934ZM8 16C12.4183 16 16 12.4183 16 8C16 3.58172 12.4183 0 8 0C3.58172 0 0 3.58172 0 8C0 12.4183 3.58172 16 8 16ZM8.48347 14.4823C8.32384 14.494 8.16262 14.5 8 14.5C7.83738 14.5 7.67616 14.494 7.51654 14.4823C7.5132 14.4791 7.50984 14.4759 7.50647 14.4726C7.2415 14.2165 6.94578 13.7854 6.67032 13.1558C6.41594 12.5744 6.19979 11.8714 6.04101 11.0778C6.67605 11.1088 7.33104 11.125 8 11.125C8.66896 11.125 9.32395 11.1088 9.95899 11.0778C9.80021 11.8714 9.58406 12.5744 9.32968 13.1558C9.05422 13.7854 8.7585 14.2165 8.49353 14.4726C8.49016 14.4759 8.4868 14.4791 8.48347 14.4823ZM11.4187 9.72246C12.5137 9.62096 13.5116 9.47245 14.3724 9.28806C14.4561 8.87172 14.5 8.44099 14.5 8C14.5 7.55901 14.4561 7.12828 14.3724 6.71194C13.5116 6.52755 12.5137 6.37904 11.4187 6.27753C11.4719 6.83232 11.5 7.40867 11.5 8C11.5 8.59133 11.4719 9.16768 11.4187 9.72246ZM10.1525 6.18401C10.2157 6.75982 10.25 7.36805 10.25 8C10.25 8.63195 10.2157 9.24018 10.1525 9.81598C9.46123 9.85455 8.7409 9.875 8 9.875C7.25909 9.875 6.53877 9.85455 5.84749 9.81598C5.7843 9.24018 5.75 8.63195 5.75 8C5.75 7.36805 5.7843 6.75982 5.84749 6.18401C6.53877 6.14545 7.25909 6.125 8 6.125C8.74091 6.125 9.46123 6.14545 10.1525 6.18401ZM11.2469 5.00748C12.2138 5.08891 13.1191 5.20593 13.9384 5.35306C13.2303 3.7667 11.9051 2.51622 10.268 1.90662C10.695 2.73788 11.0336 3.79953 11.2469 5.00748ZM8.48347 1.51771C8.4868 1.52089 8.49016 1.52411 8.49353 1.52737C8.7585 1.78353 9.05422 2.21456 9.32968 2.84417C9.58406 3.42562 9.80021 4.12856 9.95899 4.92219C9.32395 4.89118 8.66896 4.875 8 4.875C7.33104 4.875 6.67605 4.89118 6.04101 4.92219C6.19978 4.12856 6.41594 3.42562 6.67032 2.84417C6.94578 2.21456 7.2415 1.78353 7.50647 1.52737C7.50984 1.52411 7.51319 1.52089 7.51653 1.51771C7.67615 1.50597 7.83738 1.5 8 1.5C8.16262 1.5 8.32384 1.50597 8.48347 1.51771ZM5.73202 1.90663C4.0949 2.51622 2.76975 3.7667 2.06159 5.35306C2.88085 5.20593 3.78617 5.08891 4.75309 5.00748C4.96639 3.79953 5.30497 2.73788 5.73202 1.90663ZM4.58133 6.27753C3.48633 6.37904 2.48837 6.52755 1.62761 6.71194C1.54392 7.12828 1.5 7.55901 1.5 8C1.5 8.44099 1.54392 8.87172 1.62761 9.28806C2.48837 9.47245 3.48633 9.62096 4.58133 9.72246C4.52807 9.16768 4.5 8.59133 4.5 8C4.5 7.40867 4.52807 6.83232 4.58133 6.27753ZM4.75309 10.9925C3.78617 10.9111 2.88085 10.7941 2.06159 10.6469C2.76975 12.2333 4.0949 13.4838 5.73202 14.0934C5.30497 13.2621 4.96639 12.2005 4.75309 10.9925Z\"\n        fill=\"currentColor\"\n        fillRule=\"evenodd\"\n      />\n    </svg>\n  );\n};\n\nexport const LockIcon = ({ size = 16 }: { size?: number }) => {\n  return (\n    <svg\n      height={size}\n      strokeLinejoin=\"round\"\n      style={{ color: \"currentcolor\" }}\n      viewBox=\"0 0 16 16\"\n      width={size}\n    >\n      <path\n        clipRule=\"evenodd\"\n        d=\"M10 4.5V6H6V4.5C6 3.39543 6.89543 2.5 8 2.5C9.10457 2.5 10 3.39543 10 4.5ZM4.5 6V4.5C4.5 2.567 6.067 1 8 1C9.933 1 11.5 2.567 11.5 4.5V6H12.5H14V7.5V12.5C14 13.8807 12.8807 15 11.5 15H4.5C3.11929 15 2 13.8807 2 12.5V7.5V6H3.5H4.5ZM11.5 7.5H10H6H4.5H3.5V12.5C3.5 13.0523 3.94772 13.5 4.5 13.5H11.5C12.0523 13.5 12.5 13.0523 12.5 12.5V7.5H11.5Z\"\n        fill=\"currentColor\"\n        fillRule=\"evenodd\"\n      />\n    </svg>\n  );\n};\n\nexport const EyeIcon = ({ size = 16 }: { size?: number }) => {\n  return (\n    <svg\n      height={size}\n      strokeLinejoin=\"round\"\n      style={{ color: \"currentcolor\" }}\n      viewBox=\"0 0 16 16\"\n      width={size}\n    >\n      <path\n        clipRule=\"evenodd\"\n        d=\"M4.02168 4.76932C6.11619 2.33698 9.88374 2.33698 11.9783 4.76932L14.7602 7.99999L11.9783 11.2307C9.88374 13.663 6.1162 13.663 4.02168 11.2307L1.23971 7.99999L4.02168 4.76932ZM13.1149 3.79054C10.422 0.663244 5.57797 0.663247 2.88503 3.79054L-0.318359 7.5106V8.48938L2.88503 12.2094C5.57797 15.3367 10.422 15.3367 13.1149 12.2094L16.3183 8.48938V7.5106L13.1149 3.79054ZM6.49997 7.99999C6.49997 7.17157 7.17154 6.49999 7.99997 6.49999C8.82839 6.49999 9.49997 7.17157 9.49997 7.99999C9.49997 8.82842 8.82839 9.49999 7.99997 9.49999C7.17154 9.49999 6.49997 8.82842 6.49997 7.99999ZM7.99997 4.99999C6.34311 4.99999 4.99997 6.34314 4.99997 7.99999C4.99997 9.65685 6.34311 11 7.99997 11C9.65682 11 11 9.65685 11 7.99999C11 6.34314 9.65682 4.99999 7.99997 4.99999Z\"\n        fill=\"currentColor\"\n        fillRule=\"evenodd\"\n      />\n    </svg>\n  );\n};\n\nexport const ShareIcon = ({ size = 16 }: { size?: number }) => {\n  return (\n    <svg\n      height={size}\n      strokeLinejoin=\"round\"\n      style={{ color: \"currentcolor\" }}\n      viewBox=\"0 0 16 16\"\n      width={size}\n    >\n      <path\n        clipRule=\"evenodd\"\n        d=\"M15 11.25V10.5H13.5V11.25V12.75C13.5 13.1642 13.1642 13.5 12.75 13.5H3.25C2.83579 13.5 2.5 13.1642 2.5 12.75L2.5 3.25C2.5 2.83579 2.83579 2.5 3.25 2.5H5.75H6.5V1H5.75H3.25C2.00736 1 1 2.00736 1 3.25V12.75C1 13.9926 2.00736 15 3.25 15H12.75C13.9926 15 15 13.9926 15 12.75V11.25ZM15 5.5L10.5 1V4C7.46243 4 5 6.46243 5 9.5V10L5.05855 9.91218C6.27146 8.09281 8.31339 7 10.5 7V10L15 5.5Z\"\n        fill=\"currentColor\"\n        fillRule=\"evenodd\"\n      />\n    </svg>\n  );\n};\n\nexport const CodeIcon = ({ size = 16 }: { size?: number }) => {\n  return (\n    <svg\n      height={size}\n      strokeLinejoin=\"round\"\n      style={{ color: \"currentcolor\" }}\n      viewBox=\"0 0 16 16\"\n      width={size}\n    >\n      <path\n        clipRule=\"evenodd\"\n        d=\"M4.21969 12.5303L4.75002 13.0607L5.81068 12L5.28035 11.4697L1.81068 7.99999L5.28035 4.53032L5.81068 3.99999L4.75002 2.93933L4.21969 3.46966L0.39647 7.29289C0.00594562 7.68341 0.00594562 8.31658 0.39647 8.7071L4.21969 12.5303ZM11.7804 12.5303L11.25 13.0607L10.1894 12L10.7197 11.4697L14.1894 7.99999L10.7197 4.53032L10.1894 3.99999L11.25 2.93933L11.7804 3.46966L15.6036 7.29289C15.9941 7.68341 15.9941 8.31658 15.6036 8.7071L11.7804 12.5303Z\"\n        fill=\"currentColor\"\n        fillRule=\"evenodd\"\n      />\n    </svg>\n  );\n};\n\nexport const PlayIcon = ({ size = 16 }: { size?: number }) => {\n  return (\n    <svg\n      height={size}\n      strokeLinejoin=\"round\"\n      style={{ color: \"currentcolor\" }}\n      viewBox=\"0 0 16 16\"\n      width={size}\n    >\n      <path\n        clipRule=\"evenodd\"\n        d=\"M13.4549 7.22745L13.3229 7.16146L2.5 1.74999L2.4583 1.72914L1.80902 1.4045L1.3618 1.18089C1.19558 1.09778 1 1.21865 1 1.4045L1 1.9045L1 2.63041L1 2.67704L1 13.3229L1 13.3696L1 14.0955L1 14.5955C1 14.7813 1.19558 14.9022 1.3618 14.8191L1.80902 14.5955L2.4583 14.2708L2.5 14.25L13.3229 8.83852L13.4549 8.77253L14.2546 8.37267L14.5528 8.2236C14.737 8.13147 14.737 7.86851 14.5528 7.77638L14.2546 7.62731L13.4549 7.22745ZM11.6459 7.99999L2.5 3.42704L2.5 12.5729L11.6459 7.99999Z\"\n        fill=\"currentColor\"\n        fillRule=\"evenodd\"\n      />\n    </svg>\n  );\n};\n\nexport const PythonIcon = ({ size = 16 }: { size?: number }) => {\n  return (\n    <svg\n      height={size}\n      strokeLinejoin=\"round\"\n      style={{ color: \"currentcolor\" }}\n      viewBox=\"0 0 16 16\"\n      width={size}\n    >\n      <path\n        d=\"M7.90474 0.00013087C7.24499 0.00316291 6.61494 0.0588153 6.06057 0.15584C4.42745 0.441207 4.13094 1.0385 4.13094 2.14002V3.59479H7.9902V4.07971H4.13094H2.68259C1.56099 4.07971 0.578874 4.7465 0.271682 6.01496C-0.0826597 7.4689 -0.0983767 8.37619 0.271682 9.89434C0.546012 11.0244 1.20115 11.8296 2.32276 11.8296H3.64966V10.0856C3.64966 8.82574 4.75179 7.71441 6.06057 7.71441H9.91533C10.9884 7.71441 11.845 6.84056 11.845 5.77472V2.14002C11.845 1.10556 10.9626 0.328487 9.91533 0.15584C9.25237 0.046687 8.56448 -0.00290121 7.90474 0.00013087ZM5.81768 1.17017C6.21631 1.17017 6.54185 1.49742 6.54185 1.89978C6.54185 2.30072 6.21631 2.62494 5.81768 2.62494C5.41761 2.62494 5.09351 2.30072 5.09351 1.89978C5.09351 1.49742 5.41761 1.17017 5.81768 1.17017Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M12.3262 4.07971V5.77472C12.3262 7.08883 11.1997 8.19488 9.91525 8.19488H6.06049C5.0046 8.19488 4.13086 9.0887 4.13086 10.1346V13.7693C4.13086 14.8037 5.04033 15.4122 6.06049 15.709C7.28211 16.0642 8.45359 16.1285 9.91525 15.709C10.8868 15.4307 11.8449 14.8708 11.8449 13.7693V12.3145H7.99012V11.8296H11.8449H13.7745C14.8961 11.8296 15.3141 11.0558 15.7041 9.89434C16.1071 8.69865 16.0899 7.5488 15.7041 6.01495C15.4269 4.91058 14.8975 4.07971 13.7745 4.07971H12.3262ZM10.1581 13.2843C10.5582 13.2843 10.8823 13.6086 10.8823 14.0095C10.8823 14.4119 10.5582 14.7391 10.1581 14.7391C9.7595 14.7391 9.43397 14.4119 9.43397 14.0095C9.43397 13.6086 9.7595 13.2843 10.1581 13.2843Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\n\nexport const TerminalWindowIcon = ({ size = 16 }: { size?: number }) => {\n  return (\n    <svg\n      height={size}\n      strokeLinejoin=\"round\"\n      style={{ color: \"currentcolor\" }}\n      viewBox=\"0 0 16 16\"\n      width={size}\n    >\n      <path\n        clipRule=\"evenodd\"\n        d=\"M1.5 2.5H14.5V12.5C14.5 13.0523 14.0523 13.5 13.5 13.5H2.5C1.94772 13.5 1.5 13.0523 1.5 12.5V2.5ZM0 1H1.5H14.5H16V2.5V12.5C16 13.8807 14.8807 15 13.5 15H2.5C1.11929 15 0 13.8807 0 12.5V2.5V1ZM4 11.1339L4.44194 10.6919L6.51516 8.61872C6.85687 8.27701 6.85687 7.72299 6.51517 7.38128L4.44194 5.30806L4 4.86612L3.11612 5.75L3.55806 6.19194L5.36612 8L3.55806 9.80806L3.11612 10.25L4 11.1339ZM8 9.75494H8.6225H11.75H12.3725V10.9999H11.75H8.6225H8V9.75494Z\"\n        fill=\"currentColor\"\n        fillRule=\"evenodd\"\n      />\n    </svg>\n  );\n};\n\nexport const TerminalIcon = ({ size = 16 }: { size?: number }) => {\n  return (\n    <svg\n      height={size}\n      strokeLinejoin=\"round\"\n      style={{ color: \"currentcolor\" }}\n      viewBox=\"0 0 16 16\"\n      width={size}\n    >\n      <path\n        clipRule=\"evenodd\"\n        d=\"M1.53035 12.7804L1.00002 13.3108L-0.0606384 12.2501L0.469692 11.7198L4.18936 8.00011L0.469692 4.28044L-0.0606384 3.75011L1.00002 2.68945L1.53035 3.21978L5.60358 7.29301C5.9941 7.68353 5.9941 8.3167 5.60357 8.70722L1.53035 12.7804ZM8.75002 12.5001H8.00002V14.0001H8.75002H15.25H16V12.5001H15.25H8.75002Z\"\n        fill=\"currentColor\"\n        fillRule=\"evenodd\"\n      />\n    </svg>\n  );\n};\n\nexport const ClockRewind = ({ size = 16 }: { size?: number }) => {\n  return (\n    <svg\n      height={size}\n      strokeLinejoin=\"round\"\n      style={{ color: \"currentcolor\" }}\n      viewBox=\"0 0 16 16\"\n      width={size}\n    >\n      <path\n        clipRule=\"evenodd\"\n        d=\"M7.96452 2.5C11.0257 2.5 13.5 4.96643 13.5 8C13.5 11.0336 11.0257 13.5 7.96452 13.5C6.12055 13.5 4.48831 12.6051 3.48161 11.2273L3.03915 10.6217L1.828 11.5066L2.27046 12.1122C3.54872 13.8617 5.62368 15 7.96452 15C11.8461 15 15 11.87 15 8C15 4.13001 11.8461 1 7.96452 1C5.06835 1 2.57851 2.74164 1.5 5.23347V3.75V3H0V3.75V7.25C0 7.66421 0.335786 8 0.75 8H3.75H4.5V6.5H3.75H2.63724C3.29365 4.19393 5.42843 2.5 7.96452 2.5ZM8.75 5.25V4.5H7.25V5.25V7.8662C7.25 8.20056 7.4171 8.51279 7.6953 8.69825L9.08397 9.62404L9.70801 10.0401L10.5401 8.79199L9.91603 8.37596L8.75 7.59861V5.25Z\"\n        fill=\"currentColor\"\n        fillRule=\"evenodd\"\n      />\n    </svg>\n  );\n};\n\nexport const LogsIcon = ({ size = 16 }: { size?: number }) => {\n  return (\n    <svg\n      height={size}\n      strokeLinejoin=\"round\"\n      style={{ color: \"currentcolor\" }}\n      viewBox=\"0 0 16 16\"\n      width={size}\n    >\n      <path\n        clipRule=\"evenodd\"\n        d=\"M9 2H9.75H14.25H15V3.5H14.25H9.75H9V2ZM9 12.5H9.75H14.25H15V14H14.25H9.75H9V12.5ZM9.75 7.25H9V8.75H9.75H14.25H15V7.25H14.25H9.75ZM1 12.5H1.75H2.25H3V14H2.25H1.75H1V12.5ZM1.75 2H1V3.5H1.75H2.25H3V2H2.25H1.75ZM1 7.25H1.75H2.25H3V8.75H2.25H1.75H1V7.25ZM5.75 12.5H5V14H5.75H6.25H7V12.5H6.25H5.75ZM5 2H5.75H6.25H7V3.5H6.25H5.75H5V2ZM5.75 7.25H5V8.75H5.75H6.25H7V7.25H6.25H5.75Z\"\n        fill=\"currentColor\"\n        fillRule=\"evenodd\"\n      />\n    </svg>\n  );\n};\n\nexport const ImageIcon = ({ size = 16 }: { size?: number }) => {\n  return (\n    <svg\n      height={size}\n      strokeLinejoin=\"round\"\n      style={{ color: \"currentcolor\" }}\n      viewBox=\"0 0 16 16\"\n      width={size}\n    >\n      <path\n        clipRule=\"evenodd\"\n        d=\"M14.5 2.5H1.5V9.18933L2.96966 7.71967L3.18933 7.5H3.49999H6.63001H6.93933L6.96966 7.46967L10.4697 3.96967L11.5303 3.96967L14.5 6.93934V2.5ZM8.00066 8.55999L9.53034 10.0897L10.0607 10.62L9.00001 11.6807L8.46968 11.1503L6.31935 9H3.81065L1.53032 11.2803L1.5 11.3106V12.5C1.5 13.0523 1.94772 13.5 2.5 13.5H13.5C14.0523 13.5 14.5 13.0523 14.5 12.5V9.06066L11 5.56066L8.03032 8.53033L8.00066 8.55999ZM4.05312e-06 10.8107V12.5C4.05312e-06 13.8807 1.11929 15 2.5 15H13.5C14.8807 15 16 13.8807 16 12.5V9.56066L16.5607 9L16.0303 8.46967L16 8.43934V2.5V1H14.5H1.5H4.05312e-06V2.5V10.6893L-0.0606689 10.75L4.05312e-06 10.8107Z\"\n        fill=\"currentColor\"\n        fillRule=\"evenodd\"\n      />\n    </svg>\n  );\n};\n\nexport const FullscreenIcon = ({ size = 16 }: { size?: number }) => (\n  <svg\n    height={size}\n    strokeLinejoin=\"round\"\n    style={{ color: \"currentcolor\" }}\n    viewBox=\"0 0 16 16\"\n    width={size}\n  >\n    <path\n      clipRule=\"evenodd\"\n      d=\"M1 5.25V6H2.5V5.25V2.5H5.25H6V1H5.25H2C1.44772 1 1 1.44772 1 2V5.25ZM5.25 14.9994H6V13.4994H5.25H2.5V10.7494V9.99939H1V10.7494V13.9994C1 14.5517 1.44772 14.9994 2 14.9994H5.25ZM15 10V10.75V14C15 14.5523 14.5523 15 14 15H10.75H10V13.5H10.75H13.5V10.75V10H15ZM10.75 1H10V2.5H10.75H13.5V5.25V6H15V5.25V2C15 1.44772 14.5523 1 14 1H10.75Z\"\n      fill=\"currentColor\"\n      fillRule=\"evenodd\"\n    />\n  </svg>\n);\n\nexport const DownloadIcon = ({ size = 16 }: { size?: number }) => (\n  <svg\n    height={size}\n    strokeLinejoin=\"round\"\n    style={{ color: \"currentcolor\" }}\n    viewBox=\"0 0 16 16\"\n    width={size}\n  >\n    <path\n      clipRule=\"evenodd\"\n      d=\"M8.75 1V1.75V8.68934L10.7197 6.71967L11.25 6.18934L12.3107 7.25L11.7803 7.78033L8.70711 10.8536C8.31658 11.2441 7.68342 11.2441 7.29289 10.8536L4.21967 7.78033L3.68934 7.25L4.75 6.18934L5.28033 6.71967L7.25 8.68934V1.75V1H8.75ZM13.5 9.25V13.5H2.5V9.25V8.5H1V9.25V14C1 14.5523 1.44771 15 2 15H14C14.5523 15 15 14.5523 15 14V9.25V8.5H13.5V9.25Z\"\n      fill=\"currentColor\"\n      fillRule=\"evenodd\"\n    />\n  </svg>\n);\n\nexport const LineChartIcon = ({ size = 16 }: { size?: number }) => (\n  <svg\n    height={size}\n    strokeLinejoin=\"round\"\n    style={{ color: \"currentcolor\" }}\n    viewBox=\"0 0 16 16\"\n    width={size}\n  >\n    <path\n      clipRule=\"evenodd\"\n      d=\"M1 1v11.75A2.25 2.25 0 0 0 3.25 15H15v-1.5H3.25a.75.75 0 0 1-.75-.75V1H1Zm13.297 5.013.513-.547-1.094-1.026-.513.547-3.22 3.434-2.276-2.275a1 1 0 0 0-1.414 0L4.22 8.22l-.53.53 1.06 1.06.53-.53L7 7.56l2.287 2.287a1 1 0 0 0 1.437-.023l3.573-3.811Z\"\n      fill=\"currentColor\"\n      fillRule=\"evenodd\"\n    />\n  </svg>\n);\n\nexport const WarningIcon = ({ size = 16 }: { size?: number }) => {\n  return (\n    <svg\n      height={size}\n      strokeLinejoin=\"round\"\n      style={{ color: \"currentcolor\" }}\n      viewBox=\"0 0 16 16\"\n      width={size}\n    >\n      <path\n        clipRule=\"evenodd\"\n        d=\"M8.55846 0.5C9.13413 0.5 9.65902 0.829456 9.90929 1.34788L15.8073 13.5653C16.1279 14.2293 15.6441 15 14.9068 15H1.09316C0.355835 15 -0.127943 14.2293 0.192608 13.5653L6.09065 1.34787C6.34092 0.829454 6.86581 0.5 7.44148 0.5H8.55846ZM8.74997 4.75V5.5V8V8.75H7.24997V8V5.5V4.75H8.74997ZM7.99997 12C8.55226 12 8.99997 11.5523 8.99997 11C8.99997 10.4477 8.55226 10 7.99997 10C7.44769 10 6.99997 10.4477 6.99997 11C6.99997 11.5523 7.44769 12 7.99997 12Z\"\n        fill=\"currentColor\"\n        fillRule=\"evenodd\"\n      />\n    </svg>\n  );\n};\n"
  },
  {
    "path": "components/image-editor.tsx",
    "content": "import cn from \"classnames\";\nimport { LoaderIcon } from \"./icons\";\n\ntype ImageEditorProps = {\n  title: string;\n  content: string;\n  isCurrentVersion: boolean;\n  currentVersionIndex: number;\n  status: string;\n  isInline: boolean;\n};\n\nexport function ImageEditor({\n  title,\n  content,\n  status,\n  isInline,\n}: ImageEditorProps) {\n  return (\n    <div\n      className={cn(\"flex w-full flex-row items-center justify-center\", {\n        \"h-[calc(100dvh-60px)]\": !isInline,\n        \"h-[200px]\": isInline,\n      })}\n    >\n      {status === \"streaming\" ? (\n        <div className=\"flex flex-row items-center gap-4\">\n          {!isInline && (\n            <div className=\"animate-spin\">\n              <LoaderIcon />\n            </div>\n          )}\n          <div>Generating Image...</div>\n        </div>\n      ) : (\n        <picture>\n          <img\n            alt={title}\n            className={cn(\"h-fit w-full max-w-[800px]\", {\n              \"p-0 md:p-20\": !isInline,\n            })}\n            src={`data:image/png;base64,${content}`}\n          />\n        </picture>\n      )}\n    </div>\n  );\n}\n"
  },
  {
    "path": "components/message-actions.tsx",
    "content": "import equal from \"fast-deep-equal\";\nimport { memo } from \"react\";\nimport { toast } from \"sonner\";\nimport { useSWRConfig } from \"swr\";\nimport { useCopyToClipboard } from \"usehooks-ts\";\nimport type { Vote } from \"@/lib/db/schema\";\nimport type { ChatMessage } from \"@/lib/types\";\nimport { Action, Actions } from \"./elements/actions\";\nimport { CopyIcon, PencilEditIcon, ThumbDownIcon, ThumbUpIcon } from \"./icons\";\n\nexport function PureMessageActions({\n  chatId,\n  message,\n  vote,\n  isLoading,\n  setMode,\n}: {\n  chatId: string;\n  message: ChatMessage;\n  vote: Vote | undefined;\n  isLoading: boolean;\n  setMode?: (mode: \"view\" | \"edit\") => void;\n}) {\n  const { mutate } = useSWRConfig();\n  const [_, copyToClipboard] = useCopyToClipboard();\n\n  if (isLoading) {\n    return null;\n  }\n\n  const textFromParts = message.parts\n    ?.filter((part) => part.type === \"text\")\n    .map((part) => part.text)\n    .join(\"\\n\")\n    .trim();\n\n  const handleCopy = async () => {\n    if (!textFromParts) {\n      toast.error(\"There's no text to copy!\");\n      return;\n    }\n\n    await copyToClipboard(textFromParts);\n    toast.success(\"Copied to clipboard!\");\n  };\n\n  // User messages get edit (on hover) and copy actions\n  if (message.role === \"user\") {\n    return (\n      <Actions className=\"-mr-0.5 justify-end\">\n        <div className=\"relative\">\n          {setMode && (\n            <Action\n              className=\"absolute top-0 -left-10 opacity-0 transition-opacity focus-visible:opacity-100 group-hover/message:opacity-100\"\n              data-testid=\"message-edit-button\"\n              onClick={() => setMode(\"edit\")}\n              tooltip=\"Edit\"\n            >\n              <PencilEditIcon />\n            </Action>\n          )}\n          <Action onClick={handleCopy} tooltip=\"Copy\">\n            <CopyIcon />\n          </Action>\n        </div>\n      </Actions>\n    );\n  }\n\n  return (\n    <Actions className=\"-ml-0.5\">\n      <Action onClick={handleCopy} tooltip=\"Copy\">\n        <CopyIcon />\n      </Action>\n\n      <Action\n        data-testid=\"message-upvote\"\n        disabled={vote?.isUpvoted}\n        onClick={() => {\n          const upvote = fetch(\"/api/vote\", {\n            method: \"PATCH\",\n            body: JSON.stringify({\n              chatId,\n              messageId: message.id,\n              type: \"up\",\n            }),\n          });\n\n          toast.promise(upvote, {\n            loading: \"Upvoting Response...\",\n            success: () => {\n              mutate<Vote[]>(\n                `/api/vote?chatId=${chatId}`,\n                (currentVotes) => {\n                  if (!currentVotes) {\n                    return [];\n                  }\n\n                  const votesWithoutCurrent = currentVotes.filter(\n                    (currentVote) => currentVote.messageId !== message.id\n                  );\n\n                  return [\n                    ...votesWithoutCurrent,\n                    {\n                      chatId,\n                      messageId: message.id,\n                      isUpvoted: true,\n                    },\n                  ];\n                },\n                { revalidate: false }\n              );\n\n              return \"Upvoted Response!\";\n            },\n            error: \"Failed to upvote response.\",\n          });\n        }}\n        tooltip=\"Upvote Response\"\n      >\n        <ThumbUpIcon />\n      </Action>\n\n      <Action\n        data-testid=\"message-downvote\"\n        disabled={vote && !vote.isUpvoted}\n        onClick={() => {\n          const downvote = fetch(\"/api/vote\", {\n            method: \"PATCH\",\n            body: JSON.stringify({\n              chatId,\n              messageId: message.id,\n              type: \"down\",\n            }),\n          });\n\n          toast.promise(downvote, {\n            loading: \"Downvoting Response...\",\n            success: () => {\n              mutate<Vote[]>(\n                `/api/vote?chatId=${chatId}`,\n                (currentVotes) => {\n                  if (!currentVotes) {\n                    return [];\n                  }\n\n                  const votesWithoutCurrent = currentVotes.filter(\n                    (currentVote) => currentVote.messageId !== message.id\n                  );\n\n                  return [\n                    ...votesWithoutCurrent,\n                    {\n                      chatId,\n                      messageId: message.id,\n                      isUpvoted: false,\n                    },\n                  ];\n                },\n                { revalidate: false }\n              );\n\n              return \"Downvoted Response!\";\n            },\n            error: \"Failed to downvote response.\",\n          });\n        }}\n        tooltip=\"Downvote Response\"\n      >\n        <ThumbDownIcon />\n      </Action>\n    </Actions>\n  );\n}\n\nexport const MessageActions = memo(\n  PureMessageActions,\n  (prevProps, nextProps) => {\n    if (!equal(prevProps.vote, nextProps.vote)) {\n      return false;\n    }\n    if (prevProps.isLoading !== nextProps.isLoading) {\n      return false;\n    }\n\n    return true;\n  }\n);\n"
  },
  {
    "path": "components/message-editor.tsx",
    "content": "\"use client\";\n\nimport type { UseChatHelpers } from \"@ai-sdk/react\";\nimport {\n  type Dispatch,\n  type SetStateAction,\n  useCallback,\n  useEffect,\n  useRef,\n  useState,\n} from \"react\";\nimport { deleteTrailingMessages } from \"@/app/(chat)/actions\";\nimport type { ChatMessage } from \"@/lib/types\";\nimport { getTextFromMessage } from \"@/lib/utils\";\nimport { Button } from \"./ui/button\";\nimport { Textarea } from \"./ui/textarea\";\n\nexport type MessageEditorProps = {\n  message: ChatMessage;\n  setMode: Dispatch<SetStateAction<\"view\" | \"edit\">>;\n  setMessages: UseChatHelpers<ChatMessage>[\"setMessages\"];\n  regenerate: UseChatHelpers<ChatMessage>[\"regenerate\"];\n};\n\nexport function MessageEditor({\n  message,\n  setMode,\n  setMessages,\n  regenerate,\n}: MessageEditorProps) {\n  const [isSubmitting, setIsSubmitting] = useState<boolean>(false);\n\n  const [draftContent, setDraftContent] = useState<string>(\n    getTextFromMessage(message)\n  );\n  const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n  const adjustHeight = useCallback(() => {\n    if (textareaRef.current) {\n      textareaRef.current.style.height = \"auto\";\n      textareaRef.current.style.height = `${textareaRef.current.scrollHeight + 2}px`;\n    }\n  }, []);\n\n  useEffect(() => {\n    if (textareaRef.current) {\n      adjustHeight();\n    }\n  }, [adjustHeight]);\n\n  const handleInput = (event: React.ChangeEvent<HTMLTextAreaElement>) => {\n    setDraftContent(event.target.value);\n    adjustHeight();\n  };\n\n  return (\n    <div className=\"flex w-full flex-col gap-2\">\n      <Textarea\n        className=\"w-full resize-none overflow-hidden rounded-xl bg-transparent text-base! outline-hidden\"\n        data-testid=\"message-editor\"\n        onChange={handleInput}\n        ref={textareaRef}\n        value={draftContent}\n      />\n\n      <div className=\"flex flex-row justify-end gap-2\">\n        <Button\n          className=\"h-fit px-3 py-2\"\n          onClick={() => {\n            setMode(\"view\");\n          }}\n          variant=\"outline\"\n        >\n          Cancel\n        </Button>\n        <Button\n          className=\"h-fit px-3 py-2\"\n          data-testid=\"message-editor-send-button\"\n          disabled={isSubmitting}\n          onClick={async () => {\n            setIsSubmitting(true);\n\n            await deleteTrailingMessages({\n              id: message.id,\n            });\n\n            setMessages((messages) => {\n              const index = messages.findIndex((m) => m.id === message.id);\n\n              if (index !== -1) {\n                const updatedMessage: ChatMessage = {\n                  ...message,\n                  parts: [{ type: \"text\", text: draftContent }],\n                };\n\n                return [...messages.slice(0, index), updatedMessage];\n              }\n\n              return messages;\n            });\n\n            setMode(\"view\");\n            regenerate();\n          }}\n          variant=\"default\"\n        >\n          {isSubmitting ? \"Sending...\" : \"Send\"}\n        </Button>\n      </div>\n    </div>\n  );\n}\n"
  },
  {
    "path": "components/message-reasoning.tsx",
    "content": "\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport {\n  Reasoning,\n  ReasoningContent,\n  ReasoningTrigger,\n} from \"./elements/reasoning\";\n\ntype MessageReasoningProps = {\n  isLoading: boolean;\n  reasoning: string;\n};\n\nexport function MessageReasoning({\n  isLoading,\n  reasoning,\n}: MessageReasoningProps) {\n  const [hasBeenStreaming, setHasBeenStreaming] = useState(isLoading);\n\n  useEffect(() => {\n    if (isLoading) {\n      setHasBeenStreaming(true);\n    }\n  }, [isLoading]);\n\n  return (\n    <Reasoning\n      data-testid=\"message-reasoning\"\n      defaultOpen={hasBeenStreaming}\n      isStreaming={isLoading}\n    >\n      <ReasoningTrigger />\n      <ReasoningContent>{reasoning}</ReasoningContent>\n    </Reasoning>\n  );\n}\n"
  },
  {
    "path": "components/message.tsx",
    "content": "\"use client\";\nimport type { UseChatHelpers } from \"@ai-sdk/react\";\nimport { useState } from \"react\";\nimport type { Vote } from \"@/lib/db/schema\";\nimport type { ChatMessage } from \"@/lib/types\";\nimport { cn, sanitizeText } from \"@/lib/utils\";\nimport { useDataStream } from \"./data-stream-provider\";\nimport { DocumentToolResult } from \"./document\";\nimport { DocumentPreview } from \"./document-preview\";\nimport { MessageContent } from \"./elements/message\";\nimport { Response } from \"./elements/response\";\nimport {\n  Tool,\n  ToolContent,\n  ToolHeader,\n  ToolInput,\n  ToolOutput,\n} from \"./elements/tool\";\nimport { SparklesIcon } from \"./icons\";\nimport { MessageActions } from \"./message-actions\";\nimport { MessageEditor } from \"./message-editor\";\nimport { MessageReasoning } from \"./message-reasoning\";\nimport { PreviewAttachment } from \"./preview-attachment\";\nimport { Weather } from \"./weather\";\n\nconst PurePreviewMessage = ({\n  addToolApprovalResponse,\n  chatId,\n  message,\n  vote,\n  isLoading,\n  setMessages,\n  regenerate,\n  isReadonly,\n  requiresScrollPadding: _requiresScrollPadding,\n}: {\n  addToolApprovalResponse: UseChatHelpers<ChatMessage>[\"addToolApprovalResponse\"];\n  chatId: string;\n  message: ChatMessage;\n  vote: Vote | undefined;\n  isLoading: boolean;\n  setMessages: UseChatHelpers<ChatMessage>[\"setMessages\"];\n  regenerate: UseChatHelpers<ChatMessage>[\"regenerate\"];\n  isReadonly: boolean;\n  requiresScrollPadding: boolean;\n}) => {\n  const [mode, setMode] = useState<\"view\" | \"edit\">(\"view\");\n\n  const attachmentsFromMessage = message.parts.filter(\n    (part) => part.type === \"file\"\n  );\n\n  useDataStream();\n\n  return (\n    <div\n      className=\"group/message fade-in w-full animate-in duration-200\"\n      data-role={message.role}\n      data-testid={`message-${message.role}`}\n    >\n      <div\n        className={cn(\"flex w-full items-start gap-2 md:gap-3\", {\n          \"justify-end\": message.role === \"user\" && mode !== \"edit\",\n          \"justify-start\": message.role === \"assistant\",\n        })}\n      >\n        {message.role === \"assistant\" && (\n          <div className=\"-mt-1 flex size-8 shrink-0 items-center justify-center rounded-full bg-background ring-1 ring-border\">\n            <SparklesIcon size={14} />\n          </div>\n        )}\n\n        <div\n          className={cn(\"flex flex-col\", {\n            \"gap-2 md:gap-4\": message.parts?.some(\n              (p) => p.type === \"text\" && p.text?.trim()\n            ),\n            \"w-full\":\n              (message.role === \"assistant\" &&\n                (message.parts?.some(\n                  (p) => p.type === \"text\" && p.text?.trim()\n                ) ||\n                  message.parts?.some((p) => p.type.startsWith(\"tool-\")))) ||\n              mode === \"edit\",\n            \"max-w-[calc(100%-2.5rem)] sm:max-w-[min(fit-content,80%)]\":\n              message.role === \"user\" && mode !== \"edit\",\n          })}\n        >\n          {attachmentsFromMessage.length > 0 && (\n            <div\n              className=\"flex flex-row justify-end gap-2\"\n              data-testid={\"message-attachments\"}\n            >\n              {attachmentsFromMessage.map((attachment) => (\n                <PreviewAttachment\n                  attachment={{\n                    name: attachment.filename ?? \"file\",\n                    contentType: attachment.mediaType,\n                    url: attachment.url,\n                  }}\n                  key={attachment.url}\n                />\n              ))}\n            </div>\n          )}\n\n          {message.parts?.map((part, index) => {\n            const { type } = part;\n            const key = `message-${message.id}-part-${index}`;\n\n            if (type === \"reasoning\") {\n              const hasContent = part.text?.trim().length > 0;\n              if (hasContent) {\n                const isStreaming =\n                  \"state\" in part && part.state === \"streaming\";\n                return (\n                  <MessageReasoning\n                    isLoading={isLoading || isStreaming}\n                    key={key}\n                    reasoning={part.text}\n                  />\n                );\n              }\n            }\n\n            if (type === \"text\") {\n              if (mode === \"view\") {\n                return (\n                  <div key={key}>\n                    <MessageContent\n                      className={cn({\n                        \"wrap-break-word w-fit rounded-2xl px-3 py-2 text-right text-white\":\n                          message.role === \"user\",\n                        \"bg-transparent px-0 py-0 text-left\":\n                          message.role === \"assistant\",\n                      })}\n                      data-testid=\"message-content\"\n                      style={\n                        message.role === \"user\"\n                          ? { backgroundColor: \"#006cff\" }\n                          : undefined\n                      }\n                    >\n                      <Response>{sanitizeText(part.text)}</Response>\n                    </MessageContent>\n                  </div>\n                );\n              }\n\n              if (mode === \"edit\") {\n                return (\n                  <div\n                    className=\"flex w-full flex-row items-start gap-3\"\n                    key={key}\n                  >\n                    <div className=\"size-8\" />\n                    <div className=\"min-w-0 flex-1\">\n                      <MessageEditor\n                        key={message.id}\n                        message={message}\n                        regenerate={regenerate}\n                        setMessages={setMessages}\n                        setMode={setMode}\n                      />\n                    </div>\n                  </div>\n                );\n              }\n            }\n\n            if (type === \"tool-getWeather\") {\n              const { toolCallId, state } = part;\n              const approvalId = (part as { approval?: { id: string } })\n                .approval?.id;\n              const isDenied =\n                state === \"output-denied\" ||\n                (state === \"approval-responded\" &&\n                  (part as { approval?: { approved?: boolean } }).approval\n                    ?.approved === false);\n              const widthClass = \"w-[min(100%,450px)]\";\n\n              if (state === \"output-available\") {\n                return (\n                  <div className={widthClass} key={toolCallId}>\n                    <Weather weatherAtLocation={part.output} />\n                  </div>\n                );\n              }\n\n              if (isDenied) {\n                return (\n                  <div className={widthClass} key={toolCallId}>\n                    <Tool className=\"w-full\" defaultOpen={true}>\n                      <ToolHeader\n                        state=\"output-denied\"\n                        type=\"tool-getWeather\"\n                      />\n                      <ToolContent>\n                        <div className=\"px-4 py-3 text-muted-foreground text-sm\">\n                          Weather lookup was denied.\n                        </div>\n                      </ToolContent>\n                    </Tool>\n                  </div>\n                );\n              }\n\n              if (state === \"approval-responded\") {\n                return (\n                  <div className={widthClass} key={toolCallId}>\n                    <Tool className=\"w-full\" defaultOpen={true}>\n                      <ToolHeader state={state} type=\"tool-getWeather\" />\n                      <ToolContent>\n                        <ToolInput input={part.input} />\n                      </ToolContent>\n                    </Tool>\n                  </div>\n                );\n              }\n\n              return (\n                <div className={widthClass} key={toolCallId}>\n                  <Tool className=\"w-full\" defaultOpen={true}>\n                    <ToolHeader state={state} type=\"tool-getWeather\" />\n                    <ToolContent>\n                      {(state === \"input-available\" ||\n                        state === \"approval-requested\") && (\n                        <ToolInput input={part.input} />\n                      )}\n                      {state === \"approval-requested\" && approvalId && (\n                        <div className=\"flex items-center justify-end gap-2 border-t px-4 py-3\">\n                          <button\n                            className=\"rounded-md px-3 py-1.5 text-muted-foreground text-sm transition-colors hover:bg-muted hover:text-foreground\"\n                            onClick={() => {\n                              addToolApprovalResponse({\n                                id: approvalId,\n                                approved: false,\n                                reason: \"User denied weather lookup\",\n                              });\n                            }}\n                            type=\"button\"\n                          >\n                            Deny\n                          </button>\n                          <button\n                            className=\"rounded-md bg-primary px-3 py-1.5 text-primary-foreground text-sm transition-colors hover:bg-primary/90\"\n                            onClick={() => {\n                              addToolApprovalResponse({\n                                id: approvalId,\n                                approved: true,\n                              });\n                            }}\n                            type=\"button\"\n                          >\n                            Allow\n                          </button>\n                        </div>\n                      )}\n                    </ToolContent>\n                  </Tool>\n                </div>\n              );\n            }\n\n            if (type === \"tool-createDocument\") {\n              const { toolCallId } = part;\n\n              if (part.output && \"error\" in part.output) {\n                return (\n                  <div\n                    className=\"rounded-lg border border-red-200 bg-red-50 p-4 text-red-500 dark:bg-red-950/50\"\n                    key={toolCallId}\n                  >\n                    Error creating document: {String(part.output.error)}\n                  </div>\n                );\n              }\n\n              return (\n                <DocumentPreview\n                  isReadonly={isReadonly}\n                  key={toolCallId}\n                  result={part.output}\n                />\n              );\n            }\n\n            if (type === \"tool-updateDocument\") {\n              const { toolCallId } = part;\n\n              if (part.output && \"error\" in part.output) {\n                return (\n                  <div\n                    className=\"rounded-lg border border-red-200 bg-red-50 p-4 text-red-500 dark:bg-red-950/50\"\n                    key={toolCallId}\n                  >\n                    Error updating document: {String(part.output.error)}\n                  </div>\n                );\n              }\n\n              return (\n                <div className=\"relative\" key={toolCallId}>\n                  <DocumentPreview\n                    args={{ ...part.output, isUpdate: true }}\n                    isReadonly={isReadonly}\n                    result={part.output}\n                  />\n                </div>\n              );\n            }\n\n            if (type === \"tool-requestSuggestions\") {\n              const { toolCallId, state } = part;\n\n              return (\n                <Tool defaultOpen={true} key={toolCallId}>\n                  <ToolHeader state={state} type=\"tool-requestSuggestions\" />\n                  <ToolContent>\n                    {state === \"input-available\" && (\n                      <ToolInput input={part.input} />\n                    )}\n                    {state === \"output-available\" && (\n                      <ToolOutput\n                        errorText={undefined}\n                        output={\n                          \"error\" in part.output ? (\n                            <div className=\"rounded border p-2 text-red-500\">\n                              Error: {String(part.output.error)}\n                            </div>\n                          ) : (\n                            <DocumentToolResult\n                              isReadonly={isReadonly}\n                              result={part.output}\n                              type=\"request-suggestions\"\n                            />\n                          )\n                        }\n                      />\n                    )}\n                  </ToolContent>\n                </Tool>\n              );\n            }\n\n            return null;\n          })}\n\n          {!isReadonly && (\n            <MessageActions\n              chatId={chatId}\n              isLoading={isLoading}\n              key={`action-${message.id}`}\n              message={message}\n              setMode={setMode}\n              vote={vote}\n            />\n          )}\n        </div>\n      </div>\n    </div>\n  );\n};\n\nexport const PreviewMessage = PurePreviewMessage;\n\nexport const ThinkingMessage = () => {\n  return (\n    <div\n      className=\"group/message fade-in w-full animate-in duration-300\"\n      data-role=\"assistant\"\n      data-testid=\"message-assistant-loading\"\n    >\n      <div className=\"flex items-start justify-start gap-3\">\n        <div className=\"-mt-1 flex size-8 shrink-0 items-center justify-center rounded-full bg-background ring-1 ring-border\">\n          <div className=\"animate-pulse\">\n            <SparklesIcon size={14} />\n          </div>\n        </div>\n\n        <div className=\"flex w-full flex-col gap-2 md:gap-4\">\n          <div className=\"flex items-center gap-1 p-0 text-muted-foreground text-sm\">\n            <span className=\"animate-pulse\">Thinking</span>\n            <span className=\"inline-flex\">\n              <span className=\"animate-bounce [animation-delay:0ms]\">.</span>\n              <span className=\"animate-bounce [animation-delay:150ms]\">.</span>\n              <span className=\"animate-bounce [animation-delay:300ms]\">.</span>\n            </span>\n          </div>\n        </div>\n      </div>\n    </div>\n  );\n};\n"
  },
  {
    "path": "components/messages.tsx",
    "content": "import type { UseChatHelpers } from \"@ai-sdk/react\";\nimport { ArrowDownIcon } from \"lucide-react\";\nimport { useMessages } from \"@/hooks/use-messages\";\nimport type { Vote } from \"@/lib/db/schema\";\nimport type { ChatMessage } from \"@/lib/types\";\nimport { useDataStream } from \"./data-stream-provider\";\nimport { Greeting } from \"./greeting\";\nimport { PreviewMessage, ThinkingMessage } from \"./message\";\n\ntype MessagesProps = {\n  addToolApprovalResponse: UseChatHelpers<ChatMessage>[\"addToolApprovalResponse\"];\n  chatId: string;\n  status: UseChatHelpers<ChatMessage>[\"status\"];\n  votes: Vote[] | undefined;\n  messages: ChatMessage[];\n  setMessages: UseChatHelpers<ChatMessage>[\"setMessages\"];\n  regenerate: UseChatHelpers<ChatMessage>[\"regenerate\"];\n  isReadonly: boolean;\n  isArtifactVisible: boolean;\n  selectedModelId: string;\n};\n\nfunction PureMessages({\n  addToolApprovalResponse,\n  chatId,\n  status,\n  votes,\n  messages,\n  setMessages,\n  regenerate,\n  isReadonly,\n  selectedModelId: _selectedModelId,\n}: MessagesProps) {\n  const {\n    containerRef: messagesContainerRef,\n    endRef: messagesEndRef,\n    isAtBottom,\n    scrollToBottom,\n    hasSentMessage,\n  } = useMessages({\n    status,\n  });\n\n  useDataStream();\n\n  return (\n    <div className=\"relative flex-1 bg-background\">\n      <div\n        className=\"absolute inset-0 touch-pan-y overflow-y-auto bg-background\"\n        ref={messagesContainerRef}\n      >\n        <div className=\"mx-auto flex min-w-0 max-w-4xl flex-col gap-4 px-2 py-4 md:gap-6 md:px-4\">\n          {messages.length === 0 && <Greeting />}\n\n          {messages.map((message, index) => (\n            <PreviewMessage\n              addToolApprovalResponse={addToolApprovalResponse}\n              chatId={chatId}\n              isLoading={\n                status === \"streaming\" && messages.length - 1 === index\n              }\n              isReadonly={isReadonly}\n              key={message.id}\n              message={message}\n              regenerate={regenerate}\n              requiresScrollPadding={\n                hasSentMessage && index === messages.length - 1\n              }\n              setMessages={setMessages}\n              vote={\n                votes\n                  ? votes.find((vote) => vote.messageId === message.id)\n                  : undefined\n              }\n            />\n          ))}\n\n          {status === \"submitted\" &&\n            !messages.some((msg) =>\n              msg.parts?.some(\n                (part) => \"state\" in part && part.state === \"approval-responded\"\n              )\n            ) && <ThinkingMessage />}\n\n          <div\n            className=\"min-h-[24px] min-w-[24px] shrink-0\"\n            ref={messagesEndRef}\n          />\n        </div>\n      </div>\n\n      <button\n        aria-label=\"Scroll to bottom\"\n        className={`absolute bottom-4 left-1/2 z-10 -translate-x-1/2 rounded-full border bg-background p-2 shadow-lg transition-all hover:bg-muted ${\n          isAtBottom\n            ? \"pointer-events-none scale-0 opacity-0\"\n            : \"pointer-events-auto scale-100 opacity-100\"\n        }`}\n        onClick={() => scrollToBottom(\"smooth\")}\n        type=\"button\"\n      >\n        <ArrowDownIcon className=\"size-4\" />\n      </button>\n    </div>\n  );\n}\n\nexport const Messages = PureMessages;\n"
  },
  {
    "path": "components/multimodal-input.tsx",
    "content": "\"use client\";\n\nimport type { UseChatHelpers } from \"@ai-sdk/react\";\nimport type { UIMessage } from \"ai\";\nimport equal from \"fast-deep-equal\";\nimport { CheckIcon } from \"lucide-react\";\nimport {\n  type ChangeEvent,\n  type Dispatch,\n  memo,\n  type SetStateAction,\n  useCallback,\n  useEffect,\n  useRef,\n  useState,\n} from \"react\";\nimport { toast } from \"sonner\";\nimport { useLocalStorage, useWindowSize } from \"usehooks-ts\";\nimport {\n  ModelSelector,\n  ModelSelectorContent,\n  ModelSelectorGroup,\n  ModelSelectorInput,\n  ModelSelectorItem,\n  ModelSelectorList,\n  ModelSelectorLogo,\n  ModelSelectorName,\n  ModelSelectorTrigger,\n} from \"@/components/ai-elements/model-selector\";\nimport {\n  chatModels,\n  DEFAULT_CHAT_MODEL,\n  modelsByProvider,\n} from \"@/lib/ai/models\";\nimport type { Attachment, ChatMessage } from \"@/lib/types\";\nimport { cn } from \"@/lib/utils\";\nimport {\n  PromptInput,\n  PromptInputSubmit,\n  PromptInputTextarea,\n  PromptInputToolbar,\n  PromptInputTools,\n} from \"./elements/prompt-input\";\nimport { ArrowUpIcon, PaperclipIcon, StopIcon } from \"./icons\";\nimport { PreviewAttachment } from \"./preview-attachment\";\nimport { SuggestedActions } from \"./suggested-actions\";\nimport { Button } from \"./ui/button\";\nimport type { VisibilityType } from \"./visibility-selector\";\n\nfunction setCookie(name: string, value: string) {\n  const maxAge = 60 * 60 * 24 * 365; // 1 year\n  // biome-ignore lint/suspicious/noDocumentCookie: needed for client-side cookie setting\n  document.cookie = `${name}=${encodeURIComponent(value)}; path=/; max-age=${maxAge}`;\n}\n\nfunction PureMultimodalInput({\n  chatId,\n  input,\n  setInput,\n  status,\n  stop,\n  attachments,\n  setAttachments,\n  messages,\n  setMessages,\n  sendMessage,\n  className,\n  selectedVisibilityType,\n  selectedModelId,\n  onModelChange,\n}: {\n  chatId: string;\n  input: string;\n  setInput: Dispatch<SetStateAction<string>>;\n  status: UseChatHelpers<ChatMessage>[\"status\"];\n  stop: () => void;\n  attachments: Attachment[];\n  setAttachments: Dispatch<SetStateAction<Attachment[]>>;\n  messages: UIMessage[];\n  setMessages: UseChatHelpers<ChatMessage>[\"setMessages\"];\n  sendMessage: UseChatHelpers<ChatMessage>[\"sendMessage\"];\n  className?: string;\n  selectedVisibilityType: VisibilityType;\n  selectedModelId: string;\n  onModelChange?: (modelId: string) => void;\n}) {\n  const textareaRef = useRef<HTMLTextAreaElement>(null);\n  const { width } = useWindowSize();\n\n  const adjustHeight = useCallback(() => {\n    if (textareaRef.current) {\n      textareaRef.current.style.height = \"44px\";\n    }\n  }, []);\n\n  useEffect(() => {\n    if (textareaRef.current) {\n      adjustHeight();\n    }\n  }, [adjustHeight]);\n\n  const hasAutoFocused = useRef(false);\n  useEffect(() => {\n    if (!hasAutoFocused.current && width) {\n      const timer = setTimeout(() => {\n        textareaRef.current?.focus();\n        hasAutoFocused.current = true;\n      }, 100);\n      return () => clearTimeout(timer);\n    }\n  }, [width]);\n\n  const resetHeight = useCallback(() => {\n    if (textareaRef.current) {\n      textareaRef.current.style.height = \"44px\";\n    }\n  }, []);\n\n  const [localStorageInput, setLocalStorageInput] = useLocalStorage(\n    \"input\",\n    \"\"\n  );\n\n  useEffect(() => {\n    if (textareaRef.current) {\n      const domValue = textareaRef.current.value;\n      // Prefer DOM value over localStorage to handle hydration\n      const finalValue = domValue || localStorageInput || \"\";\n      setInput(finalValue);\n      adjustHeight();\n    }\n    // Only run once after hydration\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [adjustHeight, localStorageInput, setInput]);\n\n  useEffect(() => {\n    setLocalStorageInput(input);\n  }, [input, setLocalStorageInput]);\n\n  const handleInput = (event: React.ChangeEvent<HTMLTextAreaElement>) => {\n    setInput(event.target.value);\n  };\n\n  const fileInputRef = useRef<HTMLInputElement>(null);\n  const [uploadQueue, setUploadQueue] = useState<string[]>([]);\n\n  const submitForm = useCallback(() => {\n    window.history.pushState({}, \"\", `/chat/${chatId}`);\n\n    sendMessage({\n      role: \"user\",\n      parts: [\n        ...attachments.map((attachment) => ({\n          type: \"file\" as const,\n          url: attachment.url,\n          name: attachment.name,\n          mediaType: attachment.contentType,\n        })),\n        {\n          type: \"text\",\n          text: input,\n        },\n      ],\n    });\n\n    setAttachments([]);\n    setLocalStorageInput(\"\");\n    resetHeight();\n    setInput(\"\");\n\n    if (width && width > 768) {\n      textareaRef.current?.focus();\n    }\n  }, [\n    input,\n    setInput,\n    attachments,\n    sendMessage,\n    setAttachments,\n    setLocalStorageInput,\n    width,\n    chatId,\n    resetHeight,\n  ]);\n\n  const uploadFile = useCallback(async (file: File) => {\n    const formData = new FormData();\n    formData.append(\"file\", file);\n\n    try {\n      const response = await fetch(\"/api/files/upload\", {\n        method: \"POST\",\n        body: formData,\n      });\n\n      if (response.ok) {\n        const data = await response.json();\n        const { url, pathname, contentType } = data;\n\n        return {\n          url,\n          name: pathname,\n          contentType,\n        };\n      }\n      const { error } = await response.json();\n      toast.error(error);\n    } catch (_error) {\n      toast.error(\"Failed to upload file, please try again!\");\n    }\n  }, []);\n\n  const handleFileChange = useCallback(\n    async (event: ChangeEvent<HTMLInputElement>) => {\n      const files = Array.from(event.target.files || []);\n\n      setUploadQueue(files.map((file) => file.name));\n\n      try {\n        const uploadPromises = files.map((file) => uploadFile(file));\n        const uploadedAttachments = await Promise.all(uploadPromises);\n        const successfullyUploadedAttachments = uploadedAttachments.filter(\n          (attachment) => attachment !== undefined\n        );\n\n        setAttachments((currentAttachments) => [\n          ...currentAttachments,\n          ...successfullyUploadedAttachments,\n        ]);\n      } catch (error) {\n        console.error(\"Error uploading files!\", error);\n      } finally {\n        setUploadQueue([]);\n      }\n    },\n    [setAttachments, uploadFile]\n  );\n\n  const handlePaste = useCallback(\n    async (event: ClipboardEvent) => {\n      const items = event.clipboardData?.items;\n      if (!items) {\n        return;\n      }\n\n      const imageItems = Array.from(items).filter((item) =>\n        item.type.startsWith(\"image/\")\n      );\n\n      if (imageItems.length === 0) {\n        return;\n      }\n\n      // Prevent default paste behavior for images\n      event.preventDefault();\n\n      setUploadQueue((prev) => [...prev, \"Pasted image\"]);\n\n      try {\n        const uploadPromises = imageItems\n          .map((item) => item.getAsFile())\n          .filter((file): file is File => file !== null)\n          .map((file) => uploadFile(file));\n\n        const uploadedAttachments = await Promise.all(uploadPromises);\n        const successfullyUploadedAttachments = uploadedAttachments.filter(\n          (attachment) =>\n            attachment !== undefined &&\n            attachment.url !== undefined &&\n            attachment.contentType !== undefined\n        );\n\n        setAttachments((curr) => [\n          ...curr,\n          ...(successfullyUploadedAttachments as Attachment[]),\n        ]);\n      } catch (error) {\n        console.error(\"Error uploading pasted images:\", error);\n        toast.error(\"Failed to upload pasted image(s)\");\n      } finally {\n        setUploadQueue([]);\n      }\n    },\n    [setAttachments, uploadFile]\n  );\n\n  // Add paste event listener to textarea\n  useEffect(() => {\n    const textarea = textareaRef.current;\n    if (!textarea) {\n      return;\n    }\n\n    textarea.addEventListener(\"paste\", handlePaste);\n    return () => textarea.removeEventListener(\"paste\", handlePaste);\n  }, [handlePaste]);\n\n  return (\n    <div className={cn(\"relative flex w-full flex-col gap-4\", className)}>\n      {messages.length === 0 &&\n        attachments.length === 0 &&\n        uploadQueue.length === 0 && (\n          <SuggestedActions\n            chatId={chatId}\n            selectedVisibilityType={selectedVisibilityType}\n            sendMessage={sendMessage}\n          />\n        )}\n\n      <input\n        className=\"pointer-events-none fixed -top-4 -left-4 size-0.5 opacity-0\"\n        multiple\n        onChange={handleFileChange}\n        ref={fileInputRef}\n        tabIndex={-1}\n        type=\"file\"\n      />\n\n      <PromptInput\n        className=\"rounded-xl border border-border bg-background p-3 shadow-xs transition-all duration-200 focus-within:border-border hover:border-muted-foreground/50\"\n        onSubmit={(event) => {\n          event.preventDefault();\n          if (!input.trim() && attachments.length === 0) {\n            return;\n          }\n          if (status === \"ready\") {\n            submitForm();\n          } else {\n            toast.error(\"Please wait for the model to finish its response!\");\n          }\n        }}\n      >\n        {(attachments.length > 0 || uploadQueue.length > 0) && (\n          <div\n            className=\"flex flex-row items-end gap-2 overflow-x-scroll\"\n            data-testid=\"attachments-preview\"\n          >\n            {attachments.map((attachment) => (\n              <PreviewAttachment\n                attachment={attachment}\n                key={attachment.url}\n                onRemove={() => {\n                  setAttachments((currentAttachments) =>\n                    currentAttachments.filter((a) => a.url !== attachment.url)\n                  );\n                  if (fileInputRef.current) {\n                    fileInputRef.current.value = \"\";\n                  }\n                }}\n              />\n            ))}\n\n            {uploadQueue.map((filename) => (\n              <PreviewAttachment\n                attachment={{\n                  url: \"\",\n                  name: filename,\n                  contentType: \"\",\n                }}\n                isUploading={true}\n                key={filename}\n              />\n            ))}\n          </div>\n        )}\n        <div className=\"flex flex-row items-start gap-1 sm:gap-2\">\n          <PromptInputTextarea\n            className=\"grow resize-none border-0! border-none! bg-transparent p-2 text-base outline-none ring-0 [-ms-overflow-style:none] [scrollbar-width:none] placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-0 focus-visible:ring-offset-0 [&::-webkit-scrollbar]:hidden\"\n            data-testid=\"multimodal-input\"\n            disableAutoResize={true}\n            maxHeight={200}\n            minHeight={44}\n            onChange={handleInput}\n            placeholder=\"Send a message...\"\n            ref={textareaRef}\n            rows={1}\n            value={input}\n          />\n        </div>\n        <PromptInputToolbar className=\"border-top-0! border-t-0! p-0 shadow-none dark:border-0 dark:border-transparent!\">\n          <PromptInputTools className=\"gap-0 sm:gap-0.5\">\n            <AttachmentsButton\n              fileInputRef={fileInputRef}\n              selectedModelId={selectedModelId}\n              status={status}\n            />\n            <ModelSelectorCompact\n              onModelChange={onModelChange}\n              selectedModelId={selectedModelId}\n            />\n          </PromptInputTools>\n\n          {status === \"submitted\" ? (\n            <StopButton setMessages={setMessages} stop={stop} />\n          ) : (\n            <PromptInputSubmit\n              className=\"size-8 rounded-full bg-primary text-primary-foreground transition-colors duration-200 hover:bg-primary/90 disabled:bg-muted disabled:text-muted-foreground\"\n              data-testid=\"send-button\"\n              disabled={!input.trim() || uploadQueue.length > 0}\n              status={status}\n            >\n              <ArrowUpIcon size={14} />\n            </PromptInputSubmit>\n          )}\n        </PromptInputToolbar>\n      </PromptInput>\n    </div>\n  );\n}\n\nexport const MultimodalInput = memo(\n  PureMultimodalInput,\n  (prevProps, nextProps) => {\n    if (prevProps.input !== nextProps.input) {\n      return false;\n    }\n    if (prevProps.status !== nextProps.status) {\n      return false;\n    }\n    if (!equal(prevProps.attachments, nextProps.attachments)) {\n      return false;\n    }\n    if (prevProps.selectedVisibilityType !== nextProps.selectedVisibilityType) {\n      return false;\n    }\n    if (prevProps.selectedModelId !== nextProps.selectedModelId) {\n      return false;\n    }\n\n    return true;\n  }\n);\n\nfunction PureAttachmentsButton({\n  fileInputRef,\n  status,\n  selectedModelId,\n}: {\n  fileInputRef: React.MutableRefObject<HTMLInputElement | null>;\n  status: UseChatHelpers<ChatMessage>[\"status\"];\n  selectedModelId: string;\n}) {\n  const isReasoningModel =\n    selectedModelId.includes(\"reasoning\") || selectedModelId.includes(\"think\");\n\n  return (\n    <Button\n      className=\"aspect-square h-8 rounded-lg p-1 transition-colors hover:bg-accent\"\n      data-testid=\"attachments-button\"\n      disabled={status !== \"ready\" || isReasoningModel}\n      onClick={(event) => {\n        event.preventDefault();\n        fileInputRef.current?.click();\n      }}\n      variant=\"ghost\"\n    >\n      <PaperclipIcon size={14} style={{ width: 14, height: 14 }} />\n    </Button>\n  );\n}\n\nconst AttachmentsButton = memo(PureAttachmentsButton);\n\nfunction PureModelSelectorCompact({\n  selectedModelId,\n  onModelChange,\n}: {\n  selectedModelId: string;\n  onModelChange?: (modelId: string) => void;\n}) {\n  const [open, setOpen] = useState(false);\n\n  const selectedModel =\n    chatModels.find((m) => m.id === selectedModelId) ??\n    chatModels.find((m) => m.id === DEFAULT_CHAT_MODEL) ??\n    chatModels[0];\n  const [provider] = selectedModel.id.split(\"/\");\n\n  // Provider display names\n  const providerNames: Record<string, string> = {\n    anthropic: \"Anthropic\",\n    openai: \"OpenAI\",\n    google: \"Google\",\n    xai: \"xAI\",\n    reasoning: \"Reasoning\",\n  };\n\n  return (\n    <ModelSelector onOpenChange={setOpen} open={open}>\n      <ModelSelectorTrigger asChild>\n        <Button className=\"h-8 w-[200px] justify-between px-2\" variant=\"ghost\">\n          {provider && <ModelSelectorLogo provider={provider} />}\n          <ModelSelectorName>{selectedModel.name}</ModelSelectorName>\n        </Button>\n      </ModelSelectorTrigger>\n      <ModelSelectorContent>\n        <ModelSelectorInput placeholder=\"Search models...\" />\n        <ModelSelectorList>\n          {Object.entries(modelsByProvider).map(\n            ([providerKey, providerModels]) => (\n              <ModelSelectorGroup\n                heading={providerNames[providerKey] ?? providerKey}\n                key={providerKey}\n              >\n                {providerModels.map((model) => {\n                  const logoProvider = model.id.split(\"/\")[0];\n                  return (\n                    <ModelSelectorItem\n                      key={model.id}\n                      onSelect={() => {\n                        onModelChange?.(model.id);\n                        setCookie(\"chat-model\", model.id);\n                        setOpen(false);\n                      }}\n                      value={model.id}\n                    >\n                      <ModelSelectorLogo provider={logoProvider} />\n                      <ModelSelectorName>{model.name}</ModelSelectorName>\n                      {model.id === selectedModel.id && (\n                        <CheckIcon className=\"ml-auto size-4\" />\n                      )}\n                    </ModelSelectorItem>\n                  );\n                })}\n              </ModelSelectorGroup>\n            )\n          )}\n        </ModelSelectorList>\n      </ModelSelectorContent>\n    </ModelSelector>\n  );\n}\n\nconst ModelSelectorCompact = memo(PureModelSelectorCompact);\n\nfunction PureStopButton({\n  stop,\n  setMessages,\n}: {\n  stop: () => void;\n  setMessages: UseChatHelpers<ChatMessage>[\"setMessages\"];\n}) {\n  return (\n    <Button\n      className=\"size-7 rounded-full bg-foreground p-1 text-background transition-colors duration-200 hover:bg-foreground/90 disabled:bg-muted disabled:text-muted-foreground\"\n      data-testid=\"stop-button\"\n      onClick={(event) => {\n        event.preventDefault();\n        stop();\n        setMessages((messages) => messages);\n      }}\n    >\n      <StopIcon size={14} />\n    </Button>\n  );\n}\n\nconst StopButton = memo(PureStopButton);\n"
  },
  {
    "path": "components/preview-attachment.tsx",
    "content": "import Image from \"next/image\";\nimport type { Attachment } from \"@/lib/types\";\nimport { Loader } from \"./elements/loader\";\nimport { CrossSmallIcon } from \"./icons\";\nimport { Button } from \"./ui/button\";\n\nexport const PreviewAttachment = ({\n  attachment,\n  isUploading = false,\n  onRemove,\n}: {\n  attachment: Attachment;\n  isUploading?: boolean;\n  onRemove?: () => void;\n}) => {\n  const { name, url, contentType } = attachment;\n\n  return (\n    <div\n      className=\"group relative size-16 overflow-hidden rounded-lg border bg-muted\"\n      data-testid=\"input-attachment-preview\"\n    >\n      {contentType?.startsWith(\"image\") ? (\n        <Image\n          alt={name ?? \"An image attachment\"}\n          className=\"size-full object-cover\"\n          height={64}\n          src={url}\n          width={64}\n        />\n      ) : (\n        <div className=\"flex size-full items-center justify-center text-muted-foreground text-xs\">\n          File\n        </div>\n      )}\n\n      {isUploading && (\n        <div\n          className=\"absolute inset-0 flex items-center justify-center bg-black/50\"\n          data-testid=\"input-attachment-loader\"\n        >\n          <Loader size={16} />\n        </div>\n      )}\n\n      {onRemove && !isUploading && (\n        <Button\n          className=\"absolute top-0.5 right-0.5 size-4 rounded-full p-0 opacity-0 transition-opacity group-hover:opacity-100\"\n          onClick={onRemove}\n          size=\"sm\"\n          variant=\"destructive\"\n        >\n          <CrossSmallIcon size={8} />\n        </Button>\n      )}\n\n      <div className=\"absolute inset-x-0 bottom-0 truncate bg-linear-to-t from-black/80 to-transparent px-1 py-0.5 text-[10px] text-white\">\n        {name}\n      </div>\n    </div>\n  );\n};\n"
  },
  {
    "path": "components/sheet-editor.tsx",
    "content": "\"use client\";\n\nimport { useTheme } from \"next-themes\";\nimport { parse, unparse } from \"papaparse\";\nimport { memo, useEffect, useMemo, useState } from \"react\";\nimport DataGrid, { textEditor } from \"react-data-grid\";\nimport { cn } from \"@/lib/utils\";\n\nimport \"react-data-grid/lib/styles.css\";\n\ntype SheetEditorProps = {\n  content: string;\n  saveContent: (content: string, isCurrentVersion: boolean) => void;\n  currentVersionIndex: number;\n  isCurrentVersion: boolean;\n  status: string;\n};\n\nconst MIN_ROWS = 50;\nconst MIN_COLS = 26;\n\nconst PureSpreadsheetEditor = ({ content, saveContent }: SheetEditorProps) => {\n  const { resolvedTheme } = useTheme();\n\n  const parseData = useMemo(() => {\n    if (!content) {\n      return new Array(MIN_ROWS).fill(new Array(MIN_COLS).fill(\"\"));\n    }\n    const result = parse<string[]>(content, { skipEmptyLines: true });\n\n    const paddedData = result.data.map((row) => {\n      const paddedRow = [...row];\n      while (paddedRow.length < MIN_COLS) {\n        paddedRow.push(\"\");\n      }\n      return paddedRow;\n    });\n\n    while (paddedData.length < MIN_ROWS) {\n      paddedData.push(new Array(MIN_COLS).fill(\"\"));\n    }\n\n    return paddedData;\n  }, [content]);\n\n  const columns = useMemo(() => {\n    const rowNumberColumn = {\n      key: \"rowNumber\",\n      name: \"\",\n      frozen: true,\n      width: 50,\n      renderCell: ({ rowIdx }: { rowIdx: number }) => rowIdx + 1,\n      cellClass: \"border-t border-r dark:bg-zinc-950 dark:text-zinc-50\",\n      headerCellClass: \"border-t border-r dark:bg-zinc-900 dark:text-zinc-50\",\n    };\n\n    const dataColumns = Array.from({ length: MIN_COLS }, (_, i) => ({\n      key: i.toString(),\n      name: String.fromCharCode(65 + i),\n      renderEditCell: textEditor,\n      width: 120,\n      cellClass: cn(\"border-t dark:bg-zinc-950 dark:text-zinc-50\", {\n        \"border-l\": i !== 0,\n      }),\n      headerCellClass: cn(\"border-t dark:bg-zinc-900 dark:text-zinc-50\", {\n        \"border-l\": i !== 0,\n      }),\n    }));\n\n    return [rowNumberColumn, ...dataColumns];\n  }, []);\n\n  const initialRows = useMemo(() => {\n    return parseData.map((row, rowIndex) => {\n      const rowData: any = {\n        id: rowIndex,\n        rowNumber: rowIndex + 1,\n      };\n\n      columns.slice(1).forEach((col, colIndex) => {\n        rowData[col.key] = row[colIndex] || \"\";\n      });\n\n      return rowData;\n    });\n  }, [parseData, columns]);\n\n  const [localRows, setLocalRows] = useState(initialRows);\n\n  useEffect(() => {\n    setLocalRows(initialRows);\n  }, [initialRows]);\n\n  const generateCsv = (data: any[][]) => {\n    return unparse(data);\n  };\n\n  const handleRowsChange = (newRows: any[]) => {\n    setLocalRows(newRows);\n\n    const updatedData = newRows.map((row) => {\n      return columns.slice(1).map((col) => row[col.key] || \"\");\n    });\n\n    const newCsvContent = generateCsv(updatedData);\n    saveContent(newCsvContent, true);\n  };\n\n  return (\n    <DataGrid\n      className={resolvedTheme === \"dark\" ? \"rdg-dark\" : \"rdg-light\"}\n      columns={columns}\n      defaultColumnOptions={{\n        resizable: true,\n        sortable: true,\n      }}\n      enableVirtualization\n      onCellClick={(args) => {\n        if (args.column.key !== \"rowNumber\") {\n          args.selectCell(true);\n        }\n      }}\n      onRowsChange={handleRowsChange}\n      rows={localRows}\n      style={{ height: \"100%\" }}\n    />\n  );\n};\n\nfunction areEqual(prevProps: SheetEditorProps, nextProps: SheetEditorProps) {\n  return (\n    prevProps.currentVersionIndex === nextProps.currentVersionIndex &&\n    prevProps.isCurrentVersion === nextProps.isCurrentVersion &&\n    !(prevProps.status === \"streaming\" && nextProps.status === \"streaming\") &&\n    prevProps.content === nextProps.content &&\n    prevProps.saveContent === nextProps.saveContent\n  );\n}\n\nexport const SpreadsheetEditor = memo(PureSpreadsheetEditor, areEqual);\n"
  },
  {
    "path": "components/sidebar-history-item.tsx",
    "content": "import Link from \"next/link\";\nimport { memo } from \"react\";\nimport { useChatVisibility } from \"@/hooks/use-chat-visibility\";\nimport type { Chat } from \"@/lib/db/schema\";\nimport {\n  CheckCircleFillIcon,\n  GlobeIcon,\n  LockIcon,\n  MoreHorizontalIcon,\n  ShareIcon,\n  TrashIcon,\n} from \"./icons\";\nimport {\n  DropdownMenu,\n  DropdownMenuContent,\n  DropdownMenuItem,\n  DropdownMenuPortal,\n  DropdownMenuSub,\n  DropdownMenuSubContent,\n  DropdownMenuSubTrigger,\n  DropdownMenuTrigger,\n} from \"./ui/dropdown-menu\";\nimport {\n  SidebarMenuAction,\n  SidebarMenuButton,\n  SidebarMenuItem,\n} from \"./ui/sidebar\";\n\nconst PureChatItem = ({\n  chat,\n  isActive,\n  onDelete,\n  setOpenMobile,\n}: {\n  chat: Chat;\n  isActive: boolean;\n  onDelete: (chatId: string) => void;\n  setOpenMobile: (open: boolean) => void;\n}) => {\n  const { visibilityType, setVisibilityType } = useChatVisibility({\n    chatId: chat.id,\n    initialVisibilityType: chat.visibility,\n  });\n\n  return (\n    <SidebarMenuItem>\n      <SidebarMenuButton asChild isActive={isActive}>\n        <Link href={`/chat/${chat.id}`} onClick={() => setOpenMobile(false)}>\n          <span>{chat.title}</span>\n        </Link>\n      </SidebarMenuButton>\n\n      <DropdownMenu modal={true}>\n        <DropdownMenuTrigger asChild>\n          <SidebarMenuAction\n            className=\"mr-0.5 data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground\"\n            showOnHover={!isActive}\n          >\n            <MoreHorizontalIcon />\n            <span className=\"sr-only\">More</span>\n          </SidebarMenuAction>\n        </DropdownMenuTrigger>\n\n        <DropdownMenuContent align=\"end\" side=\"bottom\">\n          <DropdownMenuSub>\n            <DropdownMenuSubTrigger className=\"cursor-pointer\">\n              <ShareIcon />\n              <span>Share</span>\n            </DropdownMenuSubTrigger>\n            <DropdownMenuPortal>\n              <DropdownMenuSubContent>\n                <DropdownMenuItem\n                  className=\"cursor-pointer flex-row justify-between\"\n                  onClick={() => {\n                    setVisibilityType(\"private\");\n                  }}\n                >\n                  <div className=\"flex flex-row items-center gap-2\">\n                    <LockIcon size={12} />\n                    <span>Private</span>\n                  </div>\n                  {visibilityType === \"private\" ? (\n                    <CheckCircleFillIcon />\n                  ) : null}\n                </DropdownMenuItem>\n                <DropdownMenuItem\n                  className=\"cursor-pointer flex-row justify-between\"\n                  onClick={() => {\n                    setVisibilityType(\"public\");\n                  }}\n                >\n                  <div className=\"flex flex-row items-center gap-2\">\n                    <GlobeIcon />\n                    <span>Public</span>\n                  </div>\n                  {visibilityType === \"public\" ? <CheckCircleFillIcon /> : null}\n                </DropdownMenuItem>\n              </DropdownMenuSubContent>\n            </DropdownMenuPortal>\n          </DropdownMenuSub>\n\n          <DropdownMenuItem\n            className=\"cursor-pointer text-destructive focus:bg-destructive/15 focus:text-destructive dark:text-red-500\"\n            onSelect={() => onDelete(chat.id)}\n          >\n            <TrashIcon />\n            <span>Delete</span>\n          </DropdownMenuItem>\n        </DropdownMenuContent>\n      </DropdownMenu>\n    </SidebarMenuItem>\n  );\n};\n\nexport const ChatItem = memo(PureChatItem, (prevProps, nextProps) => {\n  if (prevProps.isActive !== nextProps.isActive) {\n    return false;\n  }\n  return true;\n});\n"
  },
  {
    "path": "components/sidebar-history.tsx",
    "content": "\"use client\";\n\nimport { isToday, isYesterday, subMonths, subWeeks } from \"date-fns\";\nimport { motion } from \"framer-motion\";\nimport { usePathname, useRouter } from \"next/navigation\";\nimport type { User } from \"next-auth\";\nimport { useState } from \"react\";\nimport { toast } from \"sonner\";\nimport useSWRInfinite from \"swr/infinite\";\nimport {\n  AlertDialog,\n  AlertDialogAction,\n  AlertDialogCancel,\n  AlertDialogContent,\n  AlertDialogDescription,\n  AlertDialogFooter,\n  AlertDialogHeader,\n  AlertDialogTitle,\n} from \"@/components/ui/alert-dialog\";\nimport {\n  SidebarGroup,\n  SidebarGroupContent,\n  SidebarMenu,\n  useSidebar,\n} from \"@/components/ui/sidebar\";\nimport type { Chat } from \"@/lib/db/schema\";\nimport { fetcher } from \"@/lib/utils\";\nimport { LoaderIcon } from \"./icons\";\nimport { ChatItem } from \"./sidebar-history-item\";\n\ntype GroupedChats = {\n  today: Chat[];\n  yesterday: Chat[];\n  lastWeek: Chat[];\n  lastMonth: Chat[];\n  older: Chat[];\n};\n\nexport type ChatHistory = {\n  chats: Chat[];\n  hasMore: boolean;\n};\n\nconst PAGE_SIZE = 20;\n\nconst groupChatsByDate = (chats: Chat[]): GroupedChats => {\n  const now = new Date();\n  const oneWeekAgo = subWeeks(now, 1);\n  const oneMonthAgo = subMonths(now, 1);\n\n  return chats.reduce(\n    (groups, chat) => {\n      const chatDate = new Date(chat.createdAt);\n\n      if (isToday(chatDate)) {\n        groups.today.push(chat);\n      } else if (isYesterday(chatDate)) {\n        groups.yesterday.push(chat);\n      } else if (chatDate > oneWeekAgo) {\n        groups.lastWeek.push(chat);\n      } else if (chatDate > oneMonthAgo) {\n        groups.lastMonth.push(chat);\n      } else {\n        groups.older.push(chat);\n      }\n\n      return groups;\n    },\n    {\n      today: [],\n      yesterday: [],\n      lastWeek: [],\n      lastMonth: [],\n      older: [],\n    } as GroupedChats\n  );\n};\n\nexport function getChatHistoryPaginationKey(\n  pageIndex: number,\n  previousPageData: ChatHistory\n) {\n  if (previousPageData && previousPageData.hasMore === false) {\n    return null;\n  }\n\n  if (pageIndex === 0) {\n    return `/api/history?limit=${PAGE_SIZE}`;\n  }\n\n  const firstChatFromPage = previousPageData.chats.at(-1);\n\n  if (!firstChatFromPage) {\n    return null;\n  }\n\n  return `/api/history?ending_before=${firstChatFromPage.id}&limit=${PAGE_SIZE}`;\n}\n\nexport function SidebarHistory({ user }: { user: User | undefined }) {\n  const { setOpenMobile } = useSidebar();\n  const pathname = usePathname();\n  const id = pathname?.startsWith(\"/chat/\") ? pathname.split(\"/\")[2] : null;\n\n  const {\n    data: paginatedChatHistories,\n    setSize,\n    isValidating,\n    isLoading,\n    mutate,\n  } = useSWRInfinite<ChatHistory>(getChatHistoryPaginationKey, fetcher, {\n    fallbackData: [],\n  });\n\n  const router = useRouter();\n  const [deleteId, setDeleteId] = useState<string | null>(null);\n  const [showDeleteDialog, setShowDeleteDialog] = useState(false);\n\n  const hasReachedEnd = paginatedChatHistories\n    ? paginatedChatHistories.some((page) => page.hasMore === false)\n    : false;\n\n  const hasEmptyChatHistory = paginatedChatHistories\n    ? paginatedChatHistories.every((page) => page.chats.length === 0)\n    : false;\n\n  const handleDelete = () => {\n    const chatToDelete = deleteId;\n    const isCurrentChat = pathname === `/chat/${chatToDelete}`;\n\n    setShowDeleteDialog(false);\n\n    const deletePromise = fetch(`/api/chat?id=${chatToDelete}`, {\n      method: \"DELETE\",\n    });\n\n    toast.promise(deletePromise, {\n      loading: \"Deleting chat...\",\n      success: () => {\n        mutate((chatHistories) => {\n          if (chatHistories) {\n            return chatHistories.map((chatHistory) => ({\n              ...chatHistory,\n              chats: chatHistory.chats.filter(\n                (chat) => chat.id !== chatToDelete\n              ),\n            }));\n          }\n        });\n\n        if (isCurrentChat) {\n          router.replace(\"/\");\n          router.refresh();\n        }\n\n        return \"Chat deleted successfully\";\n      },\n      error: \"Failed to delete chat\",\n    });\n  };\n\n  if (!user) {\n    return (\n      <SidebarGroup>\n        <SidebarGroupContent>\n          <div className=\"flex w-full flex-row items-center justify-center gap-2 px-2 text-sm text-zinc-500\">\n            Login to save and revisit previous chats!\n          </div>\n        </SidebarGroupContent>\n      </SidebarGroup>\n    );\n  }\n\n  if (isLoading) {\n    return (\n      <SidebarGroup>\n        <div className=\"px-2 py-1 text-sidebar-foreground/50 text-xs\">\n          Today\n        </div>\n        <SidebarGroupContent>\n          <div className=\"flex flex-col\">\n            {[44, 32, 28, 64, 52].map((item) => (\n              <div\n                className=\"flex h-8 items-center gap-2 rounded-md px-2\"\n                key={item}\n              >\n                <div\n                  className=\"h-4 max-w-(--skeleton-width) flex-1 rounded-md bg-sidebar-accent-foreground/10\"\n                  style={\n                    {\n                      \"--skeleton-width\": `${item}%`,\n                    } as React.CSSProperties\n                  }\n                />\n              </div>\n            ))}\n          </div>\n        </SidebarGroupContent>\n      </SidebarGroup>\n    );\n  }\n\n  if (hasEmptyChatHistory) {\n    return (\n      <SidebarGroup>\n        <SidebarGroupContent>\n          <div className=\"flex w-full flex-row items-center justify-center gap-2 px-2 text-sm text-zinc-500\">\n            Your conversations will appear here once you start chatting!\n          </div>\n        </SidebarGroupContent>\n      </SidebarGroup>\n    );\n  }\n\n  return (\n    <>\n      <SidebarGroup>\n        <SidebarGroupContent>\n          <SidebarMenu>\n            {paginatedChatHistories &&\n              (() => {\n                const chatsFromHistory = paginatedChatHistories.flatMap(\n                  (paginatedChatHistory) => paginatedChatHistory.chats\n                );\n\n                const groupedChats = groupChatsByDate(chatsFromHistory);\n\n                return (\n                  <div className=\"flex flex-col gap-6\">\n                    {groupedChats.today.length > 0 && (\n                      <div>\n                        <div className=\"px-2 py-1 text-sidebar-foreground/50 text-xs\">\n                          Today\n                        </div>\n                        {groupedChats.today.map((chat) => (\n                          <ChatItem\n                            chat={chat}\n                            isActive={chat.id === id}\n                            key={chat.id}\n                            onDelete={(chatId) => {\n                              setDeleteId(chatId);\n                              setShowDeleteDialog(true);\n                            }}\n                            setOpenMobile={setOpenMobile}\n                          />\n                        ))}\n                      </div>\n                    )}\n\n                    {groupedChats.yesterday.length > 0 && (\n                      <div>\n                        <div className=\"px-2 py-1 text-sidebar-foreground/50 text-xs\">\n                          Yesterday\n                        </div>\n                        {groupedChats.yesterday.map((chat) => (\n                          <ChatItem\n                            chat={chat}\n                            isActive={chat.id === id}\n                            key={chat.id}\n                            onDelete={(chatId) => {\n                              setDeleteId(chatId);\n                              setShowDeleteDialog(true);\n                            }}\n                            setOpenMobile={setOpenMobile}\n                          />\n                        ))}\n                      </div>\n                    )}\n\n                    {groupedChats.lastWeek.length > 0 && (\n                      <div>\n                        <div className=\"px-2 py-1 text-sidebar-foreground/50 text-xs\">\n                          Last 7 days\n                        </div>\n                        {groupedChats.lastWeek.map((chat) => (\n                          <ChatItem\n                            chat={chat}\n                            isActive={chat.id === id}\n                            key={chat.id}\n                            onDelete={(chatId) => {\n                              setDeleteId(chatId);\n                              setShowDeleteDialog(true);\n                            }}\n                            setOpenMobile={setOpenMobile}\n                          />\n                        ))}\n                      </div>\n                    )}\n\n                    {groupedChats.lastMonth.length > 0 && (\n                      <div>\n                        <div className=\"px-2 py-1 text-sidebar-foreground/50 text-xs\">\n                          Last 30 days\n                        </div>\n                        {groupedChats.lastMonth.map((chat) => (\n                          <ChatItem\n                            chat={chat}\n                            isActive={chat.id === id}\n                            key={chat.id}\n                            onDelete={(chatId) => {\n                              setDeleteId(chatId);\n                              setShowDeleteDialog(true);\n                            }}\n                            setOpenMobile={setOpenMobile}\n                          />\n                        ))}\n                      </div>\n                    )}\n\n                    {groupedChats.older.length > 0 && (\n                      <div>\n                        <div className=\"px-2 py-1 text-sidebar-foreground/50 text-xs\">\n                          Older than last month\n                        </div>\n                        {groupedChats.older.map((chat) => (\n                          <ChatItem\n                            chat={chat}\n                            isActive={chat.id === id}\n                            key={chat.id}\n                            onDelete={(chatId) => {\n                              setDeleteId(chatId);\n                              setShowDeleteDialog(true);\n                            }}\n                            setOpenMobile={setOpenMobile}\n                          />\n                        ))}\n                      </div>\n                    )}\n                  </div>\n                );\n              })()}\n          </SidebarMenu>\n\n          <motion.div\n            onViewportEnter={() => {\n              if (!isValidating && !hasReachedEnd) {\n                setSize((size) => size + 1);\n              }\n            }}\n          />\n\n          {hasReachedEnd ? (\n            <div className=\"mt-8 flex w-full flex-row items-center justify-center gap-2 px-2 text-sm text-zinc-500\">\n              You have reached the end of your chat history.\n            </div>\n          ) : (\n            <div className=\"mt-8 flex flex-row items-center gap-2 p-2 text-zinc-500 dark:text-zinc-400\">\n              <div className=\"animate-spin\">\n                <LoaderIcon />\n              </div>\n              <div>Loading Chats...</div>\n            </div>\n          )}\n        </SidebarGroupContent>\n      </SidebarGroup>\n\n      <AlertDialog onOpenChange={setShowDeleteDialog} open={showDeleteDialog}>\n        <AlertDialogContent>\n          <AlertDialogHeader>\n            <AlertDialogTitle>Are you absolutely sure?</AlertDialogTitle>\n            <AlertDialogDescription>\n              This action cannot be undone. This will permanently delete your\n              chat and remove it from our servers.\n            </AlertDialogDescription>\n          </AlertDialogHeader>\n          <AlertDialogFooter>\n            <AlertDialogCancel>Cancel</AlertDialogCancel>\n            <AlertDialogAction onClick={handleDelete}>\n              Continue\n            </AlertDialogAction>\n          </AlertDialogFooter>\n        </AlertDialogContent>\n      </AlertDialog>\n    </>\n  );\n}\n"
  },
  {
    "path": "components/sidebar-toggle.tsx",
    "content": "import type { ComponentProps } from \"react\";\n\nimport { type SidebarTrigger, useSidebar } from \"@/components/ui/sidebar\";\nimport {\n  Tooltip,\n  TooltipContent,\n  TooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { cn } from \"@/lib/utils\";\nimport { SidebarLeftIcon } from \"./icons\";\nimport { Button } from \"./ui/button\";\n\nexport function SidebarToggle({\n  className,\n}: ComponentProps<typeof SidebarTrigger>) {\n  const { toggleSidebar } = useSidebar();\n\n  return (\n    <Tooltip>\n      <TooltipTrigger asChild>\n        <Button\n          className={cn(\"h-8 px-2 md:h-fit md:px-2\", className)}\n          data-testid=\"sidebar-toggle-button\"\n          onClick={toggleSidebar}\n          variant=\"outline\"\n        >\n          <SidebarLeftIcon size={16} />\n        </Button>\n      </TooltipTrigger>\n      <TooltipContent align=\"start\" className=\"hidden md:block\">\n        Toggle Sidebar\n      </TooltipContent>\n    </Tooltip>\n  );\n}\n"
  },
  {
    "path": "components/sidebar-user-nav.tsx",
    "content": "\"use client\";\n\nimport { ChevronUp } from \"lucide-react\";\nimport Image from \"next/image\";\nimport { useRouter } from \"next/navigation\";\nimport type { User } from \"next-auth\";\nimport { signOut, useSession } from \"next-auth/react\";\nimport { useTheme } from \"next-themes\";\nimport {\n  DropdownMenu,\n  DropdownMenuContent,\n  DropdownMenuItem,\n  DropdownMenuSeparator,\n  DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport {\n  SidebarMenu,\n  SidebarMenuButton,\n  SidebarMenuItem,\n} from \"@/components/ui/sidebar\";\nimport { guestRegex } from \"@/lib/constants\";\nimport { LoaderIcon } from \"./icons\";\nimport { toast } from \"./toast\";\n\nexport function SidebarUserNav({ user }: { user: User }) {\n  const router = useRouter();\n  const { data, status } = useSession();\n  const { setTheme, resolvedTheme } = useTheme();\n\n  const isGuest = guestRegex.test(data?.user?.email ?? \"\");\n\n  return (\n    <SidebarMenu>\n      <SidebarMenuItem>\n        <DropdownMenu>\n          <DropdownMenuTrigger asChild>\n            {status === \"loading\" ? (\n              <SidebarMenuButton className=\"h-10 justify-between bg-background data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground\">\n                <div className=\"flex flex-row gap-2\">\n                  <div className=\"size-6 animate-pulse rounded-full bg-zinc-500/30\" />\n                  <span className=\"animate-pulse rounded-md bg-zinc-500/30 text-transparent\">\n                    Loading auth status\n                  </span>\n                </div>\n                <div className=\"animate-spin text-zinc-500\">\n                  <LoaderIcon />\n                </div>\n              </SidebarMenuButton>\n            ) : (\n              <SidebarMenuButton\n                className=\"h-10 bg-background data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground\"\n                data-testid=\"user-nav-button\"\n              >\n                <Image\n                  alt={user.email ?? \"User Avatar\"}\n                  className=\"rounded-full\"\n                  height={24}\n                  src={`https://avatar.vercel.sh/${user.email}`}\n                  width={24}\n                />\n                <span className=\"truncate\" data-testid=\"user-email\">\n                  {isGuest ? \"Guest\" : user?.email}\n                </span>\n                <ChevronUp className=\"ml-auto\" />\n              </SidebarMenuButton>\n            )}\n          </DropdownMenuTrigger>\n          <DropdownMenuContent\n            className=\"w-(--radix-popper-anchor-width)\"\n            data-testid=\"user-nav-menu\"\n            side=\"top\"\n          >\n            <DropdownMenuItem\n              className=\"cursor-pointer\"\n              data-testid=\"user-nav-item-theme\"\n              onSelect={() =>\n                setTheme(resolvedTheme === \"dark\" ? \"light\" : \"dark\")\n              }\n            >\n              {`Toggle ${resolvedTheme === \"light\" ? \"dark\" : \"light\"} mode`}\n            </DropdownMenuItem>\n            <DropdownMenuSeparator />\n            <DropdownMenuItem asChild data-testid=\"user-nav-item-auth\">\n              <button\n                className=\"w-full cursor-pointer\"\n                onClick={() => {\n                  if (status === \"loading\") {\n                    toast({\n                      type: \"error\",\n                      description:\n                        \"Checking authentication status, please try again!\",\n                    });\n\n                    return;\n                  }\n\n                  if (isGuest) {\n                    router.push(\"/login\");\n                  } else {\n                    signOut({\n                      redirectTo: \"/\",\n                    });\n                  }\n                }}\n                type=\"button\"\n              >\n                {isGuest ? \"Login to your account\" : \"Sign out\"}\n              </button>\n            </DropdownMenuItem>\n          </DropdownMenuContent>\n        </DropdownMenu>\n      </SidebarMenuItem>\n    </SidebarMenu>\n  );\n}\n"
  },
  {
    "path": "components/sign-out-form.tsx",
    "content": "import Form from \"next/form\";\n\nimport { signOut } from \"@/app/(auth)/auth\";\n\nexport const SignOutForm = () => {\n  return (\n    <Form\n      action={async () => {\n        \"use server\";\n\n        await signOut({\n          redirectTo: \"/\",\n        });\n      }}\n      className=\"w-full\"\n    >\n      <button\n        className=\"w-full px-1 py-0.5 text-left text-red-500\"\n        type=\"submit\"\n      >\n        Sign out\n      </button>\n    </Form>\n  );\n};\n"
  },
  {
    "path": "components/submit-button.tsx",
    "content": "\"use client\";\n\nimport { useFormStatus } from \"react-dom\";\n\nimport { LoaderIcon } from \"@/components/icons\";\n\nimport { Button } from \"./ui/button\";\n\nexport function SubmitButton({\n  children,\n  isSuccessful,\n}: {\n  children: React.ReactNode;\n  isSuccessful: boolean;\n}) {\n  const { pending } = useFormStatus();\n\n  return (\n    <Button\n      aria-disabled={pending || isSuccessful}\n      className=\"relative\"\n      disabled={pending || isSuccessful}\n      type={pending ? \"button\" : \"submit\"}\n    >\n      {children}\n\n      {(pending || isSuccessful) && (\n        <span className=\"absolute right-4 animate-spin\">\n          <LoaderIcon />\n        </span>\n      )}\n\n      <output aria-live=\"polite\" className=\"sr-only\">\n        {pending || isSuccessful ? \"Loading\" : \"Submit form\"}\n      </output>\n    </Button>\n  );\n}\n"
  },
  {
    "path": "components/suggested-actions.tsx",
    "content": "\"use client\";\n\nimport type { UseChatHelpers } from \"@ai-sdk/react\";\nimport { motion } from \"framer-motion\";\nimport { memo } from \"react\";\nimport type { ChatMessage } from \"@/lib/types\";\nimport { Suggestion } from \"./elements/suggestion\";\nimport type { VisibilityType } from \"./visibility-selector\";\n\ntype SuggestedActionsProps = {\n  chatId: string;\n  sendMessage: UseChatHelpers<ChatMessage>[\"sendMessage\"];\n  selectedVisibilityType: VisibilityType;\n};\n\nfunction PureSuggestedActions({ chatId, sendMessage }: SuggestedActionsProps) {\n  const suggestedActions = [\n    \"What are the advantages of using Next.js?\",\n    \"Write code to demonstrate Dijkstra's algorithm\",\n    \"Help me write an essay about Silicon Valley\",\n    \"What is the weather in San Francisco?\",\n  ];\n\n  return (\n    <div\n      className=\"grid w-full gap-2 sm:grid-cols-2\"\n      data-testid=\"suggested-actions\"\n    >\n      {suggestedActions.map((suggestedAction, index) => (\n        <motion.div\n          animate={{ opacity: 1, y: 0 }}\n          exit={{ opacity: 0, y: 20 }}\n          initial={{ opacity: 0, y: 20 }}\n          key={suggestedAction}\n          transition={{ delay: 0.05 * index }}\n        >\n          <Suggestion\n            className=\"h-auto w-full whitespace-normal p-3 text-left\"\n            onClick={(suggestion) => {\n              window.history.pushState({}, \"\", `/chat/${chatId}`);\n              sendMessage({\n                role: \"user\",\n                parts: [{ type: \"text\", text: suggestion }],\n              });\n            }}\n            suggestion={suggestedAction}\n          >\n            {suggestedAction}\n          </Suggestion>\n        </motion.div>\n      ))}\n    </div>\n  );\n}\n\nexport const SuggestedActions = memo(\n  PureSuggestedActions,\n  (prevProps, nextProps) => {\n    if (prevProps.chatId !== nextProps.chatId) {\n      return false;\n    }\n    if (prevProps.selectedVisibilityType !== nextProps.selectedVisibilityType) {\n      return false;\n    }\n\n    return true;\n  }\n);\n"
  },
  {
    "path": "components/suggestion.tsx",
    "content": "\"use client\";\n\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { useState } from \"react\";\nimport { useWindowSize } from \"usehooks-ts\";\n\nimport type { UISuggestion } from \"@/lib/editor/suggestions\";\nimport { cn } from \"@/lib/utils\";\nimport type { ArtifactKind } from \"./artifact\";\nimport { CrossIcon, MessageIcon } from \"./icons\";\nimport { Button } from \"./ui/button\";\n\nexport const Suggestion = ({\n  suggestion,\n  onApply,\n  artifactKind,\n}: {\n  suggestion: UISuggestion;\n  onApply: () => void;\n  artifactKind: ArtifactKind;\n}) => {\n  const [isExpanded, setIsExpanded] = useState(false);\n  const { width: windowWidth } = useWindowSize();\n\n  return (\n    <AnimatePresence>\n      {isExpanded ? (\n        <motion.div\n          animate={{ opacity: 1, y: -20 }}\n          className=\"absolute -right-12 z-50 flex w-56 flex-col gap-3 rounded-2xl border bg-background p-3 font-sans text-sm shadow-xl md:-right-16\"\n          exit={{ opacity: 0, y: -10 }}\n          initial={{ opacity: 0, y: -10 }}\n          key={suggestion.id}\n          transition={{ type: \"spring\", stiffness: 500, damping: 30 }}\n          whileHover={{ scale: 1.05 }}\n        >\n          <div className=\"flex flex-row items-center justify-between\">\n            <div className=\"flex flex-row items-center gap-2\">\n              <div className=\"size-4 rounded-full bg-muted-foreground/25\" />\n              <div className=\"font-medium\">Assistant</div>\n            </div>\n            <button\n              className=\"cursor-pointer text-gray-500 text-xs\"\n              onClick={() => {\n                setIsExpanded(false);\n              }}\n              type=\"button\"\n            >\n              <CrossIcon size={12} />\n            </button>\n          </div>\n          <div>{suggestion.description}</div>\n          <Button\n            className=\"w-fit rounded-full px-3 py-1.5\"\n            onClick={onApply}\n            variant=\"outline\"\n          >\n            Apply\n          </Button>\n        </motion.div>\n      ) : (\n        <motion.div\n          className={cn(\"cursor-pointer p-1 text-muted-foreground\", {\n            \"absolute -right-8\": artifactKind === \"text\",\n            \"sticky top-0 right-4\": artifactKind === \"code\",\n          })}\n          onClick={() => {\n            setIsExpanded(true);\n          }}\n          whileHover={{ scale: 1.1 }}\n        >\n          <MessageIcon size={windowWidth && windowWidth < 768 ? 16 : 14} />\n        </motion.div>\n      )}\n    </AnimatePresence>\n  );\n};\n"
  },
  {
    "path": "components/text-editor.tsx",
    "content": "\"use client\";\n\nimport { exampleSetup } from \"prosemirror-example-setup\";\nimport { inputRules } from \"prosemirror-inputrules\";\nimport { EditorState } from \"prosemirror-state\";\nimport { EditorView } from \"prosemirror-view\";\nimport { memo, useEffect, useRef } from \"react\";\n\nimport type { Suggestion } from \"@/lib/db/schema\";\nimport {\n  documentSchema,\n  handleTransaction,\n  headingRule,\n} from \"@/lib/editor/config\";\nimport {\n  buildContentFromDocument,\n  buildDocumentFromContent,\n  createDecorations,\n} from \"@/lib/editor/functions\";\nimport {\n  projectWithPositions,\n  suggestionsPlugin,\n  suggestionsPluginKey,\n} from \"@/lib/editor/suggestions\";\n\ntype EditorProps = {\n  content: string;\n  onSaveContent: (updatedContent: string, debounce: boolean) => void;\n  status: \"streaming\" | \"idle\";\n  isCurrentVersion: boolean;\n  currentVersionIndex: number;\n  suggestions: Suggestion[];\n};\n\nfunction PureEditor({\n  content,\n  onSaveContent,\n  suggestions,\n  status,\n}: EditorProps) {\n  const containerRef = useRef<HTMLDivElement>(null);\n  const editorRef = useRef<EditorView | null>(null);\n\n  useEffect(() => {\n    if (containerRef.current && !editorRef.current) {\n      const state = EditorState.create({\n        doc: buildDocumentFromContent(content),\n        plugins: [\n          ...exampleSetup({ schema: documentSchema, menuBar: false }),\n          inputRules({\n            rules: [\n              headingRule(1),\n              headingRule(2),\n              headingRule(3),\n              headingRule(4),\n              headingRule(5),\n              headingRule(6),\n            ],\n          }),\n          suggestionsPlugin,\n        ],\n      });\n\n      editorRef.current = new EditorView(containerRef.current, {\n        state,\n      });\n    }\n\n    return () => {\n      if (editorRef.current) {\n        editorRef.current.destroy();\n        editorRef.current = null;\n      }\n    };\n    // NOTE: we only want to run this effect once\n    // eslint-disable-next-line\n  }, [content]);\n\n  useEffect(() => {\n    if (editorRef.current) {\n      editorRef.current.setProps({\n        dispatchTransaction: (transaction) => {\n          handleTransaction({\n            transaction,\n            editorRef,\n            onSaveContent,\n          });\n        },\n      });\n    }\n  }, [onSaveContent]);\n\n  useEffect(() => {\n    if (editorRef.current && content) {\n      const currentContent = buildContentFromDocument(\n        editorRef.current.state.doc\n      );\n\n      if (status === \"streaming\") {\n        const newDocument = buildDocumentFromContent(content);\n\n        const transaction = editorRef.current.state.tr.replaceWith(\n          0,\n          editorRef.current.state.doc.content.size,\n          newDocument.content\n        );\n\n        transaction.setMeta(\"no-save\", true);\n        editorRef.current.dispatch(transaction);\n        return;\n      }\n\n      if (currentContent !== content) {\n        const newDocument = buildDocumentFromContent(content);\n\n        const transaction = editorRef.current.state.tr.replaceWith(\n          0,\n          editorRef.current.state.doc.content.size,\n          newDocument.content\n        );\n\n        transaction.setMeta(\"no-save\", true);\n        editorRef.current.dispatch(transaction);\n      }\n    }\n  }, [content, status]);\n\n  useEffect(() => {\n    if (editorRef.current?.state.doc && content) {\n      const projectedSuggestions = projectWithPositions(\n        editorRef.current.state.doc,\n        suggestions\n      ).filter(\n        (suggestion) => suggestion.selectionStart && suggestion.selectionEnd\n      );\n\n      const decorations = createDecorations(\n        projectedSuggestions,\n        editorRef.current\n      );\n\n      const transaction = editorRef.current.state.tr;\n      transaction.setMeta(suggestionsPluginKey, { decorations });\n      editorRef.current.dispatch(transaction);\n    }\n  }, [suggestions, content]);\n\n  return (\n    <div className=\"prose dark:prose-invert relative\" ref={containerRef} />\n  );\n}\n\nfunction areEqual(prevProps: EditorProps, nextProps: EditorProps) {\n  return (\n    prevProps.suggestions === nextProps.suggestions &&\n    prevProps.currentVersionIndex === nextProps.currentVersionIndex &&\n    prevProps.isCurrentVersion === nextProps.isCurrentVersion &&\n    !(prevProps.status === \"streaming\" && nextProps.status === \"streaming\") &&\n    prevProps.content === nextProps.content &&\n    prevProps.onSaveContent === nextProps.onSaveContent\n  );\n}\n\nexport const Editor = memo(PureEditor, areEqual);\n"
  },
  {
    "path": "components/theme-provider.tsx",
    "content": "\"use client\";\n\nimport { ThemeProvider as NextThemesProvider } from \"next-themes\";\nimport type { ThemeProviderProps } from \"next-themes/dist/types\";\n\nexport function ThemeProvider({ children, ...props }: ThemeProviderProps) {\n  return <NextThemesProvider {...props}>{children}</NextThemesProvider>;\n}\n"
  },
  {
    "path": "components/toast.tsx",
    "content": "\"use client\";\n\nimport { type ReactNode, useEffect, useRef, useState } from \"react\";\nimport { toast as sonnerToast } from \"sonner\";\nimport { cn } from \"@/lib/utils\";\nimport { CheckCircleFillIcon, WarningIcon } from \"./icons\";\n\nconst iconsByType: Record<\"success\" | \"error\", ReactNode> = {\n  success: <CheckCircleFillIcon />,\n  error: <WarningIcon />,\n};\n\nexport function toast(props: Omit<ToastProps, \"id\">) {\n  return sonnerToast.custom((id) => (\n    <Toast description={props.description} id={id} type={props.type} />\n  ));\n}\n\nfunction Toast(props: ToastProps) {\n  const { id, type, description } = props;\n\n  const descriptionRef = useRef<HTMLDivElement>(null);\n  const [multiLine, setMultiLine] = useState(false);\n\n  useEffect(() => {\n    const el = descriptionRef.current;\n    if (!el) {\n      return;\n    }\n\n    const update = () => {\n      const lineHeight = Number.parseFloat(getComputedStyle(el).lineHeight);\n      const lines = Math.round(el.scrollHeight / lineHeight);\n      setMultiLine(lines > 1);\n    };\n\n    update(); // initial check\n    const ro = new ResizeObserver(update); // re-check on width changes\n    ro.observe(el);\n\n    return () => ro.disconnect();\n  }, []);\n\n  return (\n    <div className=\"flex toast-mobile:w-[356px] w-full justify-center\">\n      <div\n        className={cn(\n          \"flex toast-mobile:w-fit w-full flex-row gap-3 rounded-lg bg-zinc-100 p-3\",\n          multiLine ? \"items-start\" : \"items-center\"\n        )}\n        data-testid=\"toast\"\n        key={id}\n      >\n        <div\n          className={cn(\n            \"data-[type=error]:text-red-600 data-[type=success]:text-green-600\",\n            { \"pt-1\": multiLine }\n          )}\n          data-type={type}\n        >\n          {iconsByType[type]}\n        </div>\n        <div className=\"text-sm text-zinc-950\" ref={descriptionRef}>\n          {description}\n        </div>\n      </div>\n    </div>\n  );\n}\n\ntype ToastProps = {\n  id: string | number;\n  type: \"success\" | \"error\";\n  description: string;\n};\n"
  },
  {
    "path": "components/toolbar.tsx",
    "content": "\"use client\";\nimport type { UseChatHelpers } from \"@ai-sdk/react\";\nimport cx from \"classnames\";\nimport {\n  AnimatePresence,\n  motion,\n  useMotionValue,\n  useTransform,\n} from \"framer-motion\";\nimport { nanoid } from \"nanoid\";\nimport {\n  type Dispatch,\n  memo,\n  type ReactNode,\n  type SetStateAction,\n  useEffect,\n  useRef,\n  useState,\n} from \"react\";\nimport { useOnClickOutside } from \"usehooks-ts\";\nimport {\n  Tooltip,\n  TooltipContent,\n  TooltipProvider,\n  TooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport type { ChatMessage } from \"@/lib/types\";\nimport { type ArtifactKind, artifactDefinitions } from \"./artifact\";\nimport type { ArtifactToolbarItem } from \"./create-artifact\";\nimport { ArrowUpIcon, StopIcon, SummarizeIcon } from \"./icons\";\n\ntype ToolProps = {\n  description: string;\n  icon: ReactNode;\n  selectedTool: string | null;\n  setSelectedTool: Dispatch<SetStateAction<string | null>>;\n  isToolbarVisible?: boolean;\n  setIsToolbarVisible?: Dispatch<SetStateAction<boolean>>;\n  isAnimating: boolean;\n  sendMessage: UseChatHelpers<ChatMessage>[\"sendMessage\"];\n  onClick: ({\n    sendMessage,\n  }: {\n    sendMessage: UseChatHelpers<ChatMessage>[\"sendMessage\"];\n  }) => void;\n};\n\nconst Tool = ({\n  description,\n  icon,\n  selectedTool,\n  setSelectedTool,\n  isToolbarVisible,\n  setIsToolbarVisible,\n  isAnimating,\n  sendMessage,\n  onClick,\n}: ToolProps) => {\n  const [isHovered, setIsHovered] = useState(false);\n\n  useEffect(() => {\n    if (selectedTool !== description) {\n      setIsHovered(false);\n    }\n  }, [selectedTool, description]);\n\n  const handleSelect = () => {\n    if (!isToolbarVisible && setIsToolbarVisible) {\n      setIsToolbarVisible(true);\n      return;\n    }\n\n    if (!selectedTool) {\n      setIsHovered(true);\n      setSelectedTool(description);\n      return;\n    }\n\n    if (selectedTool === description) {\n      setSelectedTool(null);\n      onClick({ sendMessage });\n    } else {\n      setSelectedTool(description);\n    }\n  };\n\n  return (\n    <Tooltip open={isHovered && !isAnimating}>\n      <TooltipTrigger asChild>\n        <motion.div\n          animate={{ opacity: 1, transition: { delay: 0.1 } }}\n          className={cx(\"rounded-full p-3\", {\n            \"bg-primary text-primary-foreground!\": selectedTool === description,\n          })}\n          exit={{\n            scale: 0.9,\n            opacity: 0,\n            transition: { duration: 0.1 },\n          }}\n          initial={{ scale: 1, opacity: 0 }}\n          onClick={() => {\n            handleSelect();\n          }}\n          onHoverEnd={() => {\n            if (selectedTool !== description) {\n              setIsHovered(false);\n            }\n          }}\n          onHoverStart={() => {\n            setIsHovered(true);\n          }}\n          onKeyDown={(event) => {\n            if (event.key === \"Enter\") {\n              handleSelect();\n            }\n          }}\n          whileHover={{ scale: 1.1 }}\n          whileTap={{ scale: 0.95 }}\n        >\n          {selectedTool === description ? <ArrowUpIcon /> : icon}\n        </motion.div>\n      </TooltipTrigger>\n      <TooltipContent\n        className=\"rounded-2xl bg-foreground p-3 px-4 text-background\"\n        side=\"left\"\n        sideOffset={16}\n      >\n        {description}\n      </TooltipContent>\n    </Tooltip>\n  );\n};\n\nconst randomArr = [...new Array(6)].map((_x) => nanoid(5));\n\nconst ReadingLevelSelector = ({\n  setSelectedTool,\n  sendMessage,\n  isAnimating,\n}: {\n  setSelectedTool: Dispatch<SetStateAction<string | null>>;\n  isAnimating: boolean;\n  sendMessage: UseChatHelpers<ChatMessage>[\"sendMessage\"];\n}) => {\n  const LEVELS = [\n    \"Elementary\",\n    \"Middle School\",\n    \"Keep current level\",\n    \"High School\",\n    \"College\",\n    \"Graduate\",\n  ];\n\n  const y = useMotionValue(-40 * 2);\n  const dragConstraints = 5 * 40 + 2;\n  const yToLevel = useTransform(y, [0, -dragConstraints], [0, 5]);\n\n  const [currentLevel, setCurrentLevel] = useState(2);\n  const [hasUserSelectedLevel, setHasUserSelectedLevel] =\n    useState<boolean>(false);\n\n  useEffect(() => {\n    const unsubscribe = yToLevel.on(\"change\", (latest) => {\n      const level = Math.min(5, Math.max(0, Math.round(Math.abs(latest))));\n      setCurrentLevel(level);\n    });\n\n    return () => unsubscribe();\n  }, [yToLevel]);\n\n  return (\n    <div className=\"relative flex flex-col items-center justify-end\">\n      {randomArr.map((id) => (\n        <motion.div\n          animate={{ opacity: 1 }}\n          className=\"flex size-[40px] flex-row items-center justify-center\"\n          exit={{ opacity: 0 }}\n          initial={{ opacity: 0 }}\n          key={id}\n          transition={{ delay: 0.1 }}\n        >\n          <div className=\"size-2 rounded-full bg-muted-foreground/40\" />\n        </motion.div>\n      ))}\n\n      <TooltipProvider>\n        <Tooltip open={!isAnimating}>\n          <TooltipTrigger asChild>\n            <motion.div\n              className={cx(\n                \"absolute flex flex-row items-center rounded-full border bg-background p-3\",\n                {\n                  \"bg-primary text-primary-foreground\": currentLevel !== 2,\n                  \"bg-background text-foreground\": currentLevel === 2,\n                }\n              )}\n              drag=\"y\"\n              dragConstraints={{ top: -dragConstraints, bottom: 0 }}\n              dragElastic={0}\n              dragMomentum={false}\n              onClick={() => {\n                if (currentLevel !== 2 && hasUserSelectedLevel) {\n                  sendMessage({\n                    role: \"user\",\n                    parts: [\n                      {\n                        type: \"text\",\n                        text: `Please adjust the reading level to ${LEVELS[currentLevel]} level.`,\n                      },\n                    ],\n                  });\n\n                  setSelectedTool(null);\n                }\n              }}\n              onDragEnd={() => {\n                if (currentLevel === 2) {\n                  setSelectedTool(null);\n                } else {\n                  setHasUserSelectedLevel(true);\n                }\n              }}\n              onDragStart={() => {\n                setHasUserSelectedLevel(false);\n              }}\n              style={{ y }}\n              transition={{ duration: 0.1 }}\n              whileHover={{ scale: 1.05 }}\n              whileTap={{ scale: 0.95 }}\n            >\n              {currentLevel === 2 ? <SummarizeIcon /> : <ArrowUpIcon />}\n            </motion.div>\n          </TooltipTrigger>\n          <TooltipContent\n            className=\"rounded-2xl bg-foreground p-3 px-4 text-background text-sm\"\n            side=\"left\"\n            sideOffset={16}\n          >\n            {LEVELS[currentLevel]}\n          </TooltipContent>\n        </Tooltip>\n      </TooltipProvider>\n    </div>\n  );\n};\n\nexport const Tools = ({\n  isToolbarVisible,\n  selectedTool,\n  setSelectedTool,\n  sendMessage,\n  isAnimating,\n  setIsToolbarVisible,\n  tools,\n}: {\n  isToolbarVisible: boolean;\n  selectedTool: string | null;\n  setSelectedTool: Dispatch<SetStateAction<string | null>>;\n  sendMessage: UseChatHelpers<ChatMessage>[\"sendMessage\"];\n  isAnimating: boolean;\n  setIsToolbarVisible: Dispatch<SetStateAction<boolean>>;\n  tools: ArtifactToolbarItem[];\n}) => {\n  const [primaryTool, ...secondaryTools] = tools;\n\n  return (\n    <motion.div\n      animate={{ opacity: 1, scale: 1 }}\n      className=\"flex flex-col gap-1.5\"\n      exit={{ opacity: 0, scale: 0.95 }}\n      initial={{ opacity: 0, scale: 0.95 }}\n    >\n      <AnimatePresence>\n        {isToolbarVisible &&\n          secondaryTools.map((secondaryTool) => (\n            <Tool\n              description={secondaryTool.description}\n              icon={secondaryTool.icon}\n              isAnimating={isAnimating}\n              key={secondaryTool.description}\n              onClick={secondaryTool.onClick}\n              selectedTool={selectedTool}\n              sendMessage={sendMessage}\n              setSelectedTool={setSelectedTool}\n            />\n          ))}\n      </AnimatePresence>\n\n      <Tool\n        description={primaryTool.description}\n        icon={primaryTool.icon}\n        isAnimating={isAnimating}\n        isToolbarVisible={isToolbarVisible}\n        onClick={primaryTool.onClick}\n        selectedTool={selectedTool}\n        sendMessage={sendMessage}\n        setIsToolbarVisible={setIsToolbarVisible}\n        setSelectedTool={setSelectedTool}\n      />\n    </motion.div>\n  );\n};\n\nconst PureToolbar = ({\n  isToolbarVisible,\n  setIsToolbarVisible,\n  sendMessage,\n  status,\n  stop,\n  setMessages,\n  artifactKind,\n}: {\n  isToolbarVisible: boolean;\n  setIsToolbarVisible: Dispatch<SetStateAction<boolean>>;\n  status: UseChatHelpers<ChatMessage>[\"status\"];\n  sendMessage: UseChatHelpers<ChatMessage>[\"sendMessage\"];\n  stop: UseChatHelpers<ChatMessage>[\"stop\"];\n  setMessages: UseChatHelpers<ChatMessage>[\"setMessages\"];\n  artifactKind: ArtifactKind;\n}) => {\n  const toolbarRef = useRef<HTMLDivElement>(null);\n  const timeoutRef = useRef<ReturnType<typeof setTimeout>>();\n\n  const [selectedTool, setSelectedTool] = useState<string | null>(null);\n  const [isAnimating, setIsAnimating] = useState(false);\n\n  useOnClickOutside(toolbarRef, () => {\n    setIsToolbarVisible(false);\n    setSelectedTool(null);\n  });\n\n  const startCloseTimer = () => {\n    if (timeoutRef.current) {\n      clearTimeout(timeoutRef.current);\n    }\n\n    timeoutRef.current = setTimeout(() => {\n      setSelectedTool(null);\n      setIsToolbarVisible(false);\n    }, 2000);\n  };\n\n  const cancelCloseTimer = () => {\n    if (timeoutRef.current) {\n      clearTimeout(timeoutRef.current);\n    }\n  };\n\n  useEffect(() => {\n    return () => {\n      if (timeoutRef.current) {\n        clearTimeout(timeoutRef.current);\n      }\n    };\n  }, []);\n\n  useEffect(() => {\n    if (status === \"streaming\") {\n      setIsToolbarVisible(false);\n    }\n  }, [status, setIsToolbarVisible]);\n\n  const artifactDefinition = artifactDefinitions.find(\n    (definition) => definition.kind === artifactKind\n  );\n\n  if (!artifactDefinition) {\n    throw new Error(\"Artifact definition not found!\");\n  }\n\n  const toolsByArtifactKind = artifactDefinition.toolbar;\n\n  if (toolsByArtifactKind.length === 0) {\n    return null;\n  }\n\n  return (\n    <TooltipProvider delayDuration={0}>\n      <motion.div\n        animate={\n          isToolbarVisible\n            ? selectedTool === \"adjust-reading-level\"\n              ? {\n                  opacity: 1,\n                  y: 0,\n                  height: 6 * 43,\n                  transition: { delay: 0 },\n                  scale: 0.95,\n                }\n              : {\n                  opacity: 1,\n                  y: 0,\n                  height: toolsByArtifactKind.length * 50,\n                  transition: { delay: 0 },\n                  scale: 1,\n                }\n            : { opacity: 1, y: 0, height: 54, transition: { delay: 0 } }\n        }\n        className=\"absolute right-6 bottom-6 flex cursor-pointer flex-col justify-end rounded-full border bg-background p-1.5 shadow-lg\"\n        exit={{ opacity: 0, y: -20, transition: { duration: 0.1 } }}\n        initial={{ opacity: 0, y: -20, scale: 1 }}\n        onAnimationComplete={() => {\n          setIsAnimating(false);\n        }}\n        onAnimationStart={() => {\n          setIsAnimating(true);\n        }}\n        onHoverEnd={() => {\n          if (status === \"streaming\") {\n            return;\n          }\n\n          startCloseTimer();\n        }}\n        onHoverStart={() => {\n          if (status === \"streaming\") {\n            return;\n          }\n\n          cancelCloseTimer();\n          setIsToolbarVisible(true);\n        }}\n        ref={toolbarRef}\n        transition={{ type: \"spring\", stiffness: 300, damping: 25 }}\n      >\n        {status === \"streaming\" ? (\n          <motion.div\n            animate={{ scale: 1.4 }}\n            className=\"p-3\"\n            exit={{ scale: 1 }}\n            initial={{ scale: 1 }}\n            key=\"stop-icon\"\n            onClick={() => {\n              stop();\n              setMessages((messages) => messages);\n            }}\n          >\n            <StopIcon />\n          </motion.div>\n        ) : selectedTool === \"adjust-reading-level\" ? (\n          <ReadingLevelSelector\n            isAnimating={isAnimating}\n            key=\"reading-level-selector\"\n            sendMessage={sendMessage}\n            setSelectedTool={setSelectedTool}\n          />\n        ) : (\n          <Tools\n            isAnimating={isAnimating}\n            isToolbarVisible={isToolbarVisible}\n            key=\"tools\"\n            selectedTool={selectedTool}\n            sendMessage={sendMessage}\n            setIsToolbarVisible={setIsToolbarVisible}\n            setSelectedTool={setSelectedTool}\n            tools={toolsByArtifactKind}\n          />\n        )}\n      </motion.div>\n    </TooltipProvider>\n  );\n};\n\nexport const Toolbar = memo(PureToolbar, (prevProps, nextProps) => {\n  if (prevProps.status !== nextProps.status) {\n    return false;\n  }\n  if (prevProps.isToolbarVisible !== nextProps.isToolbarVisible) {\n    return false;\n  }\n  if (prevProps.artifactKind !== nextProps.artifactKind) {\n    return false;\n  }\n\n  return true;\n});\n"
  },
  {
    "path": "components/ui/alert-dialog.tsx",
    "content": "\"use client\";\n\nimport { AlertDialog as AlertDialogPrimitive } from \"radix-ui\";\nimport * as React from \"react\";\nimport { buttonVariants } from \"@/components/ui/button\";\nimport { cn } from \"@/lib/utils\";\n\nconst AlertDialog = AlertDialogPrimitive.Root;\n\nconst AlertDialogTrigger = AlertDialogPrimitive.Trigger;\n\nconst AlertDialogPortal = AlertDialogPrimitive.Portal;\n\nconst AlertDialogOverlay = React.forwardRef<\n  React.ElementRef<typeof AlertDialogPrimitive.Overlay>,\n  React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n  <AlertDialogPrimitive.Overlay\n    className={cn(\n      \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/80 data-[state=closed]:animate-out data-[state=open]:animate-in\",\n      className\n    )}\n    {...props}\n    ref={ref}\n  />\n));\nAlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName;\n\nconst AlertDialogContent = React.forwardRef<\n  React.ElementRef<typeof AlertDialogPrimitive.Content>,\n  React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Content>\n>(({ className, ...props }, ref) => (\n  <AlertDialogPortal>\n    <AlertDialogOverlay />\n    <AlertDialogPrimitive.Content\n      className={cn(\n        \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=closed]:animate-out data-[state=open]:animate-in sm:rounded-lg\",\n        className\n      )}\n      ref={ref}\n      {...props}\n    />\n  </AlertDialogPortal>\n));\nAlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName;\n\nconst AlertDialogHeader = ({\n  className,\n  ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n  <div\n    className={cn(\n      \"flex flex-col space-y-2 text-center sm:text-left\",\n      className\n    )}\n    {...props}\n  />\n);\nAlertDialogHeader.displayName = \"AlertDialogHeader\";\n\nconst AlertDialogFooter = ({\n  className,\n  ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n  <div\n    className={cn(\n      \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n      className\n    )}\n    {...props}\n  />\n);\nAlertDialogFooter.displayName = \"AlertDialogFooter\";\n\nconst AlertDialogTitle = React.forwardRef<\n  React.ElementRef<typeof AlertDialogPrimitive.Title>,\n  React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n  <AlertDialogPrimitive.Title\n    className={cn(\"font-semibold text-lg\", className)}\n    ref={ref}\n    {...props}\n  />\n));\nAlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName;\n\nconst AlertDialogDescription = React.forwardRef<\n  React.ElementRef<typeof AlertDialogPrimitive.Description>,\n  React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n  <AlertDialogPrimitive.Description\n    className={cn(\"text-muted-foreground text-sm\", className)}\n    ref={ref}\n    {...props}\n  />\n));\nAlertDialogDescription.displayName =\n  AlertDialogPrimitive.Description.displayName;\n\nconst AlertDialogAction = React.forwardRef<\n  React.ElementRef<typeof AlertDialogPrimitive.Action>,\n  React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Action>\n>(({ className, ...props }, ref) => (\n  <AlertDialogPrimitive.Action\n    className={cn(buttonVariants(), className)}\n    ref={ref}\n    {...props}\n  />\n));\nAlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName;\n\nconst AlertDialogCancel = React.forwardRef<\n  React.ElementRef<typeof AlertDialogPrimitive.Cancel>,\n  React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Cancel>\n>(({ className, ...props }, ref) => (\n  <AlertDialogPrimitive.Cancel\n    className={cn(\n      buttonVariants({ variant: \"outline\" }),\n      \"mt-2 sm:mt-0\",\n      className\n    )}\n    ref={ref}\n    {...props}\n  />\n));\nAlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName;\n\nexport {\n  AlertDialog,\n  AlertDialogPortal,\n  AlertDialogOverlay,\n  AlertDialogTrigger,\n  AlertDialogContent,\n  AlertDialogHeader,\n  AlertDialogFooter,\n  AlertDialogTitle,\n  AlertDialogDescription,\n  AlertDialogAction,\n  AlertDialogCancel,\n};\n"
  },
  {
    "path": "components/ui/alert.tsx",
    "content": "import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst alertVariants = cva(\n  \"relative w-full rounded-lg border p-4 [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground\",\n  {\n    variants: {\n      variant: {\n        default: \"bg-background text-foreground\",\n        destructive:\n          \"border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive\",\n      },\n    },\n    defaultVariants: {\n      variant: \"default\",\n    },\n  }\n)\n\nconst Alert = React.forwardRef<\n  HTMLDivElement,\n  React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof alertVariants>\n>(({ className, variant, ...props }, ref) => (\n  <div\n    ref={ref}\n    role=\"alert\"\n    className={cn(alertVariants({ variant }), className)}\n    {...props}\n  />\n))\nAlert.displayName = \"Alert\"\n\nconst AlertTitle = React.forwardRef<\n  HTMLParagraphElement,\n  React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n  <h5\n    ref={ref}\n    className={cn(\"mb-1 font-medium leading-none tracking-tight\", className)}\n    {...props}\n  />\n))\nAlertTitle.displayName = \"AlertTitle\"\n\nconst AlertDescription = React.forwardRef<\n  HTMLParagraphElement,\n  React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n  <div\n    ref={ref}\n    className={cn(\"text-sm [&_p]:leading-relaxed\", className)}\n    {...props}\n  />\n))\nAlertDescription.displayName = \"AlertDescription\"\n\nexport { Alert, AlertTitle, AlertDescription }\n"
  },
  {
    "path": "components/ui/avatar.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { Avatar as AvatarPrimitive } from \"radix-ui\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Avatar = React.forwardRef<\n  React.ElementRef<typeof AvatarPrimitive.Root>,\n  React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>\n>(({ className, ...props }, ref) => (\n  <AvatarPrimitive.Root\n    ref={ref}\n    className={cn(\n      \"relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full\",\n      className\n    )}\n    {...props}\n  />\n))\nAvatar.displayName = AvatarPrimitive.Root.displayName\n\nconst AvatarImage = React.forwardRef<\n  React.ElementRef<typeof AvatarPrimitive.Image>,\n  React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>\n>(({ className, ...props }, ref) => (\n  <AvatarPrimitive.Image\n    ref={ref}\n    className={cn(\"aspect-square h-full w-full\", className)}\n    {...props}\n  />\n))\nAvatarImage.displayName = AvatarPrimitive.Image.displayName\n\nconst AvatarFallback = React.forwardRef<\n  React.ElementRef<typeof AvatarPrimitive.Fallback>,\n  React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>\n>(({ className, ...props }, ref) => (\n  <AvatarPrimitive.Fallback\n    ref={ref}\n    className={cn(\n      \"flex h-full w-full items-center justify-center rounded-full bg-muted\",\n      className\n    )}\n    {...props}\n  />\n))\nAvatarFallback.displayName = AvatarPrimitive.Fallback.displayName\n\nexport { Avatar, AvatarImage, AvatarFallback }\n"
  },
  {
    "path": "components/ui/badge.tsx",
    "content": "import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst badgeVariants = cva(\n  \"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\",\n  {\n    variants: {\n      variant: {\n        default:\n          \"border-transparent bg-primary text-primary-foreground hover:bg-primary/80\",\n        secondary:\n          \"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n        destructive:\n          \"border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80\",\n        outline: \"text-foreground\",\n      },\n    },\n    defaultVariants: {\n      variant: \"default\",\n    },\n  }\n)\n\nexport interface BadgeProps\n  extends React.HTMLAttributes<HTMLDivElement>,\n    VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, ...props }: BadgeProps) {\n  return (\n    <div className={cn(badgeVariants({ variant }), className)} {...props} />\n  )\n}\n\nexport { Badge, badgeVariants }\n"
  },
  {
    "path": "components/ui/button-group.tsx",
    "content": "import { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Separator } from \"@/components/ui/separator\"\n\nconst buttonGroupVariants = cva(\n  \"flex w-fit items-stretch has-[>[data-slot=button-group]]:gap-2 [&>*]:focus-visible:relative [&>*]:focus-visible:z-10 has-[select[aria-hidden=true]:last-child]:[&>[data-slot=select-trigger]:last-of-type]:rounded-r-md [&>[data-slot=select-trigger]:not([class*='w-'])]:w-fit [&>input]:flex-1\",\n  {\n    variants: {\n      orientation: {\n        horizontal:\n          \"[&>*:not(:first-child)]:rounded-l-none [&>*:not(:first-child)]:border-l-0 [&>*:not(:last-child)]:rounded-r-none\",\n        vertical:\n          \"flex-col [&>*:not(:first-child)]:rounded-t-none [&>*:not(:first-child)]:border-t-0 [&>*:not(:last-child)]:rounded-b-none\",\n      },\n    },\n    defaultVariants: {\n      orientation: \"horizontal\",\n    },\n  }\n)\n\nfunction ButtonGroup({\n  className,\n  orientation,\n  ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof buttonGroupVariants>) {\n  return (\n    <div\n      role=\"group\"\n      data-slot=\"button-group\"\n      data-orientation={orientation}\n      className={cn(buttonGroupVariants({ orientation }), className)}\n      {...props}\n    />\n  )\n}\n\nfunction ButtonGroupText({\n  className,\n  asChild = false,\n  ...props\n}: React.ComponentProps<\"div\"> & {\n  asChild?: boolean\n}) {\n  const Comp = asChild ? Slot : \"div\"\n\n  return (\n    <Comp\n      className={cn(\n        \"bg-muted shadow-xs flex items-center gap-2 rounded-md border px-4 text-sm font-medium [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction ButtonGroupSeparator({\n  className,\n  orientation = \"vertical\",\n  ...props\n}: React.ComponentProps<typeof Separator>) {\n  return (\n    <Separator\n      data-slot=\"button-group-separator\"\n      orientation={orientation}\n      className={cn(\n        \"bg-input relative !m-0 self-stretch data-[orientation=vertical]:h-auto\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nexport {\n  ButtonGroup,\n  ButtonGroupSeparator,\n  ButtonGroupText,\n  buttonGroupVariants,\n}\n"
  },
  {
    "path": "components/ui/button.tsx",
    "content": "import { cva, type VariantProps } from \"class-variance-authority\";\nimport { Slot as SlotPrimitive } from \"radix-ui\";\nimport * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nconst buttonVariants = cva(\n  \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md font-medium text-sm ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n  {\n    variants: {\n      variant: {\n        default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n        destructive:\n          \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\n        outline:\n          \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n        secondary:\n          \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n        ghost: \"hover:bg-accent hover:text-accent-foreground\",\n        link: \"text-primary underline-offset-4 hover:underline\",\n      },\n      size: {\n        default: \"h-10 px-4 py-2\",\n        sm: \"h-9 rounded-md px-3\",\n        lg: \"h-11 rounded-md px-8\",\n        icon: \"h-10 w-10\",\n        \"icon-sm\": \"h-8 w-8\",\n      },\n    },\n    defaultVariants: {\n      variant: \"default\",\n      size: \"default\",\n    },\n  }\n);\n\nexport interface ButtonProps\n  extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n    VariantProps<typeof buttonVariants> {\n  asChild?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n  ({ className, variant, size, asChild = false, ...props }, ref) => {\n    const Comp = asChild ? SlotPrimitive.Slot : \"button\";\n    return (\n      <Comp\n        className={cn(buttonVariants({ variant, size, className }))}\n        ref={ref}\n        {...props}\n      />\n    );\n  }\n);\nButton.displayName = \"Button\";\n\nexport { Button, buttonVariants };\n"
  },
  {
    "path": "components/ui/card.tsx",
    "content": "import * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nconst Card = React.forwardRef<\n  HTMLDivElement,\n  React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n  <div\n    className={cn(\n      \"rounded-lg border bg-card text-card-foreground shadow-sm\",\n      className\n    )}\n    ref={ref}\n    {...props}\n  />\n));\nCard.displayName = \"Card\";\n\nconst CardHeader = React.forwardRef<\n  HTMLDivElement,\n  React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n  <div\n    className={cn(\"flex flex-col space-y-1.5 p-6\", className)}\n    ref={ref}\n    {...props}\n  />\n));\nCardHeader.displayName = \"CardHeader\";\n\nconst CardTitle = React.forwardRef<\n  HTMLDivElement,\n  React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n  <div\n    className={cn(\n      \"font-semibold text-2xl leading-none tracking-tight\",\n      className\n    )}\n    ref={ref}\n    {...props}\n  />\n));\nCardTitle.displayName = \"CardTitle\";\n\nconst CardDescription = React.forwardRef<\n  HTMLDivElement,\n  React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n  <div\n    className={cn(\"text-muted-foreground text-sm\", className)}\n    ref={ref}\n    {...props}\n  />\n));\nCardDescription.displayName = \"CardDescription\";\n\nconst CardContent = React.forwardRef<\n  HTMLDivElement,\n  React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n  <div className={cn(\"p-6 pt-0\", className)} ref={ref} {...props} />\n));\nCardContent.displayName = \"CardContent\";\n\nconst CardFooter = React.forwardRef<\n  HTMLDivElement,\n  React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n  <div\n    className={cn(\"flex items-center p-6 pt-0\", className)}\n    ref={ref}\n    {...props}\n  />\n));\nCardFooter.displayName = \"CardFooter\";\n\nconst CardAction = React.forwardRef<\n  HTMLDivElement,\n  React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n  <div\n    className={cn(\"flex items-center gap-2\", className)}\n    ref={ref}\n    {...props}\n  />\n));\nCardAction.displayName = \"CardAction\";\n\nexport {\n  Card,\n  CardHeader,\n  CardFooter,\n  CardTitle,\n  CardDescription,\n  CardContent,\n  CardAction,\n};\n"
  },
  {
    "path": "components/ui/carousel.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport useEmblaCarousel, {\n  type UseEmblaCarouselType,\n} from \"embla-carousel-react\"\nimport { ArrowLeft, ArrowRight } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\n\ntype CarouselApi = UseEmblaCarouselType[1]\ntype UseCarouselParameters = Parameters<typeof useEmblaCarousel>\ntype CarouselOptions = UseCarouselParameters[0]\ntype CarouselPlugin = UseCarouselParameters[1]\n\ntype CarouselProps = {\n  opts?: CarouselOptions\n  plugins?: CarouselPlugin\n  orientation?: \"horizontal\" | \"vertical\"\n  setApi?: (api: CarouselApi) => void\n}\n\ntype CarouselContextProps = {\n  carouselRef: ReturnType<typeof useEmblaCarousel>[0]\n  api: ReturnType<typeof useEmblaCarousel>[1]\n  scrollPrev: () => void\n  scrollNext: () => void\n  canScrollPrev: boolean\n  canScrollNext: boolean\n} & CarouselProps\n\nconst CarouselContext = React.createContext<CarouselContextProps | null>(null)\n\nfunction useCarousel() {\n  const context = React.useContext(CarouselContext)\n\n  if (!context) {\n    throw new Error(\"useCarousel must be used within a <Carousel />\")\n  }\n\n  return context\n}\n\nconst Carousel = React.forwardRef<\n  HTMLDivElement,\n  React.HTMLAttributes<HTMLDivElement> & CarouselProps\n>(\n  (\n    {\n      orientation = \"horizontal\",\n      opts,\n      setApi,\n      plugins,\n      className,\n      children,\n      ...props\n    },\n    ref\n  ) => {\n    const [carouselRef, api] = useEmblaCarousel(\n      {\n        ...opts,\n        axis: orientation === \"horizontal\" ? \"x\" : \"y\",\n      },\n      plugins\n    )\n    const [canScrollPrev, setCanScrollPrev] = React.useState(false)\n    const [canScrollNext, setCanScrollNext] = React.useState(false)\n\n    const onSelect = React.useCallback((api: CarouselApi) => {\n      if (!api) {\n        return\n      }\n\n      setCanScrollPrev(api.canScrollPrev())\n      setCanScrollNext(api.canScrollNext())\n    }, [])\n\n    const scrollPrev = React.useCallback(() => {\n      api?.scrollPrev()\n    }, [api])\n\n    const scrollNext = React.useCallback(() => {\n      api?.scrollNext()\n    }, [api])\n\n    const handleKeyDown = React.useCallback(\n      (event: React.KeyboardEvent<HTMLDivElement>) => {\n        if (event.key === \"ArrowLeft\") {\n          event.preventDefault()\n          scrollPrev()\n        } else if (event.key === \"ArrowRight\") {\n          event.preventDefault()\n          scrollNext()\n        }\n      },\n      [scrollPrev, scrollNext]\n    )\n\n    React.useEffect(() => {\n      if (!api || !setApi) {\n        return\n      }\n\n      setApi(api)\n    }, [api, setApi])\n\n    React.useEffect(() => {\n      if (!api) {\n        return\n      }\n\n      onSelect(api)\n      api.on(\"reInit\", onSelect)\n      api.on(\"select\", onSelect)\n\n      return () => {\n        api?.off(\"select\", onSelect)\n      }\n    }, [api, onSelect])\n\n    return (\n      <CarouselContext.Provider\n        value={{\n          carouselRef,\n          api: api,\n          opts,\n          orientation:\n            orientation || (opts?.axis === \"y\" ? \"vertical\" : \"horizontal\"),\n          scrollPrev,\n          scrollNext,\n          canScrollPrev,\n          canScrollNext,\n        }}\n      >\n        <div\n          ref={ref}\n          onKeyDownCapture={handleKeyDown}\n          className={cn(\"relative\", className)}\n          role=\"region\"\n          aria-roledescription=\"carousel\"\n          {...props}\n        >\n          {children}\n        </div>\n      </CarouselContext.Provider>\n    )\n  }\n)\nCarousel.displayName = \"Carousel\"\n\nconst CarouselContent = React.forwardRef<\n  HTMLDivElement,\n  React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => {\n  const { carouselRef, orientation } = useCarousel()\n\n  return (\n    <div ref={carouselRef} className=\"overflow-hidden\">\n      <div\n        ref={ref}\n        className={cn(\n          \"flex\",\n          orientation === \"horizontal\" ? \"-ml-4\" : \"-mt-4 flex-col\",\n          className\n        )}\n        {...props}\n      />\n    </div>\n  )\n})\nCarouselContent.displayName = \"CarouselContent\"\n\nconst CarouselItem = React.forwardRef<\n  HTMLDivElement,\n  React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => {\n  const { orientation } = useCarousel()\n\n  return (\n    <div\n      ref={ref}\n      role=\"group\"\n      aria-roledescription=\"slide\"\n      className={cn(\n        \"min-w-0 shrink-0 grow-0 basis-full\",\n        orientation === \"horizontal\" ? \"pl-4\" : \"pt-4\",\n        className\n      )}\n      {...props}\n    />\n  )\n})\nCarouselItem.displayName = \"CarouselItem\"\n\nconst CarouselPrevious = React.forwardRef<\n  HTMLButtonElement,\n  React.ComponentProps<typeof Button>\n>(({ className, variant = \"outline\", size = \"icon\", ...props }, ref) => {\n  const { orientation, scrollPrev, canScrollPrev } = useCarousel()\n\n  return (\n    <Button\n      ref={ref}\n      variant={variant}\n      size={size}\n      className={cn(\n        \"absolute  h-8 w-8 rounded-full\",\n        orientation === \"horizontal\"\n          ? \"-left-12 top-1/2 -translate-y-1/2\"\n          : \"-top-12 left-1/2 -translate-x-1/2 rotate-90\",\n        className\n      )}\n      disabled={!canScrollPrev}\n      onClick={scrollPrev}\n      {...props}\n    >\n      <ArrowLeft className=\"h-4 w-4\" />\n      <span className=\"sr-only\">Previous slide</span>\n    </Button>\n  )\n})\nCarouselPrevious.displayName = \"CarouselPrevious\"\n\nconst CarouselNext = React.forwardRef<\n  HTMLButtonElement,\n  React.ComponentProps<typeof Button>\n>(({ className, variant = \"outline\", size = \"icon\", ...props }, ref) => {\n  const { orientation, scrollNext, canScrollNext } = useCarousel()\n\n  return (\n    <Button\n      ref={ref}\n      variant={variant}\n      size={size}\n      className={cn(\n        \"absolute h-8 w-8 rounded-full\",\n        orientation === \"horizontal\"\n          ? \"-right-12 top-1/2 -translate-y-1/2\"\n          : \"-bottom-12 left-1/2 -translate-x-1/2 rotate-90\",\n        className\n      )}\n      disabled={!canScrollNext}\n      onClick={scrollNext}\n      {...props}\n    >\n      <ArrowRight className=\"h-4 w-4\" />\n      <span className=\"sr-only\">Next slide</span>\n    </Button>\n  )\n})\nCarouselNext.displayName = \"CarouselNext\"\n\nexport {\n  type CarouselApi,\n  Carousel,\n  CarouselContent,\n  CarouselItem,\n  CarouselPrevious,\n  CarouselNext,\n}\n"
  },
  {
    "path": "components/ui/collapsible.tsx",
    "content": "\"use client\"\n\nimport { Collapsible as CollapsiblePrimitive } from \"radix-ui\"\n\nconst Collapsible = CollapsiblePrimitive.Root\n\nconst CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger\n\nconst CollapsibleContent = CollapsiblePrimitive.CollapsibleContent\n\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent }\n"
  },
  {
    "path": "components/ui/command.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { type DialogProps } from \"@radix-ui/react-dialog\"\nimport { Command as CommandPrimitive } from \"cmdk\"\nimport { Search } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Dialog, DialogContent } from \"@/components/ui/dialog\"\n\nconst Command = React.forwardRef<\n  React.ElementRef<typeof CommandPrimitive>,\n  React.ComponentPropsWithoutRef<typeof CommandPrimitive>\n>(({ className, ...props }, ref) => (\n  <CommandPrimitive\n    ref={ref}\n    className={cn(\n      \"flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground\",\n      className\n    )}\n    {...props}\n  />\n))\nCommand.displayName = CommandPrimitive.displayName\n\nconst CommandDialog = ({ children, ...props }: DialogProps) => {\n  return (\n    <Dialog {...props}>\n      <DialogContent className=\"overflow-hidden p-0 shadow-lg\">\n        <Command className=\"[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-group]]:px-2 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5\">\n          {children}\n        </Command>\n      </DialogContent>\n    </Dialog>\n  )\n}\n\nconst CommandInput = React.forwardRef<\n  React.ElementRef<typeof CommandPrimitive.Input>,\n  React.ComponentPropsWithoutRef<typeof CommandPrimitive.Input>\n>(({ className, ...props }, ref) => (\n  <div className=\"flex items-center border-b px-3\" cmdk-input-wrapper=\"\">\n    <Search className=\"mr-2 h-4 w-4 shrink-0 opacity-50\" />\n    <CommandPrimitive.Input\n      ref={ref}\n      className={cn(\n        \"flex h-11 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50\",\n        className\n      )}\n      {...props}\n    />\n  </div>\n))\n\nCommandInput.displayName = CommandPrimitive.Input.displayName\n\nconst CommandList = React.forwardRef<\n  React.ElementRef<typeof CommandPrimitive.List>,\n  React.ComponentPropsWithoutRef<typeof CommandPrimitive.List>\n>(({ className, ...props }, ref) => (\n  <CommandPrimitive.List\n    ref={ref}\n    className={cn(\"max-h-[300px] overflow-y-auto overflow-x-hidden\", className)}\n    {...props}\n  />\n))\n\nCommandList.displayName = CommandPrimitive.List.displayName\n\nconst CommandEmpty = React.forwardRef<\n  React.ElementRef<typeof CommandPrimitive.Empty>,\n  React.ComponentPropsWithoutRef<typeof CommandPrimitive.Empty>\n>((props, ref) => (\n  <CommandPrimitive.Empty\n    ref={ref}\n    className=\"py-6 text-center text-sm\"\n    {...props}\n  />\n))\n\nCommandEmpty.displayName = CommandPrimitive.Empty.displayName\n\nconst CommandGroup = React.forwardRef<\n  React.ElementRef<typeof CommandPrimitive.Group>,\n  React.ComponentPropsWithoutRef<typeof CommandPrimitive.Group>\n>(({ className, ...props }, ref) => (\n  <CommandPrimitive.Group\n    ref={ref}\n    className={cn(\n      \"overflow-hidden p-1 text-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground\",\n      className\n    )}\n    {...props}\n  />\n))\n\nCommandGroup.displayName = CommandPrimitive.Group.displayName\n\nconst CommandSeparator = React.forwardRef<\n  React.ElementRef<typeof CommandPrimitive.Separator>,\n  React.ComponentPropsWithoutRef<typeof CommandPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n  <CommandPrimitive.Separator\n    ref={ref}\n    className={cn(\"-mx-1 h-px bg-border\", className)}\n    {...props}\n  />\n))\nCommandSeparator.displayName = CommandPrimitive.Separator.displayName\n\nconst CommandItem = React.forwardRef<\n  React.ElementRef<typeof CommandPrimitive.Item>,\n  React.ComponentPropsWithoutRef<typeof CommandPrimitive.Item>\n>(({ className, ...props }, ref) => (\n  <CommandPrimitive.Item\n    ref={ref}\n    className={cn(\n      \"relative flex cursor-default gap-2 select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none data-[disabled=true]:pointer-events-none data-[selected='true']:bg-accent data-[selected=true]:text-accent-foreground data-[disabled=true]:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n      className\n    )}\n    {...props}\n  />\n))\n\nCommandItem.displayName = CommandPrimitive.Item.displayName\n\nconst CommandShortcut = ({\n  className,\n  ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => {\n  return (\n    <span\n      className={cn(\n        \"ml-auto text-xs tracking-widest text-muted-foreground\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\nCommandShortcut.displayName = \"CommandShortcut\"\n\nexport {\n  Command,\n  CommandDialog,\n  CommandInput,\n  CommandList,\n  CommandEmpty,\n  CommandGroup,\n  CommandItem,\n  CommandShortcut,\n  CommandSeparator,\n}\n"
  },
  {
    "path": "components/ui/dialog.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\nimport { X } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Dialog = DialogPrimitive.Root\n\nconst DialogTrigger = DialogPrimitive.Trigger\n\nconst DialogPortal = DialogPrimitive.Portal\n\nconst DialogClose = DialogPrimitive.Close\n\nconst DialogOverlay = React.forwardRef<\n  React.ElementRef<typeof DialogPrimitive.Overlay>,\n  React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n  <DialogPrimitive.Overlay\n    ref={ref}\n    className={cn(\n      \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n      className\n    )}\n    {...props}\n  />\n))\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName\n\nconst DialogContent = React.forwardRef<\n  React.ElementRef<typeof DialogPrimitive.Content>,\n  React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n  <DialogPortal>\n    <DialogOverlay />\n    <DialogPrimitive.Content\n      ref={ref}\n      className={cn(\n        \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 sm:rounded-lg\",\n        className\n      )}\n      {...props}\n    >\n      {children}\n      <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground\">\n        <X className=\"h-4 w-4\" />\n        <span className=\"sr-only\">Close</span>\n      </DialogPrimitive.Close>\n    </DialogPrimitive.Content>\n  </DialogPortal>\n))\nDialogContent.displayName = DialogPrimitive.Content.displayName\n\nconst DialogHeader = ({\n  className,\n  ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n  <div\n    className={cn(\n      \"flex flex-col space-y-1.5 text-center sm:text-left\",\n      className\n    )}\n    {...props}\n  />\n)\nDialogHeader.displayName = \"DialogHeader\"\n\nconst DialogFooter = ({\n  className,\n  ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n  <div\n    className={cn(\n      \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n      className\n    )}\n    {...props}\n  />\n)\nDialogFooter.displayName = \"DialogFooter\"\n\nconst DialogTitle = React.forwardRef<\n  React.ElementRef<typeof DialogPrimitive.Title>,\n  React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n  <DialogPrimitive.Title\n    ref={ref}\n    className={cn(\n      \"text-lg font-semibold leading-none tracking-tight\",\n      className\n    )}\n    {...props}\n  />\n))\nDialogTitle.displayName = DialogPrimitive.Title.displayName\n\nconst DialogDescription = React.forwardRef<\n  React.ElementRef<typeof DialogPrimitive.Description>,\n  React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n  <DialogPrimitive.Description\n    ref={ref}\n    className={cn(\"text-sm text-muted-foreground\", className)}\n    {...props}\n  />\n))\nDialogDescription.displayName = DialogPrimitive.Description.displayName\n\nexport {\n  Dialog,\n  DialogPortal,\n  DialogOverlay,\n  DialogClose,\n  DialogTrigger,\n  DialogContent,\n  DialogHeader,\n  DialogFooter,\n  DialogTitle,\n  DialogDescription,\n}\n"
  },
  {
    "path": "components/ui/dropdown-menu.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { DropdownMenu as DropdownMenuPrimitive } from \"radix-ui\"\nimport { Check, ChevronRight, Circle } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst DropdownMenu = DropdownMenuPrimitive.Root\n\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger\n\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group\n\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal\n\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub\n\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup\n\nconst DropdownMenuSubTrigger = React.forwardRef<\n  React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,\n  React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\n    inset?: boolean\n  }\n>(({ className, inset, children, ...props }, ref) => (\n  <DropdownMenuPrimitive.SubTrigger\n    ref={ref}\n    className={cn(\n      \"flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n      inset && \"pl-8\",\n      className\n    )}\n    {...props}\n  >\n    {children}\n    <ChevronRight className=\"ml-auto\" />\n  </DropdownMenuPrimitive.SubTrigger>\n))\nDropdownMenuSubTrigger.displayName =\n  DropdownMenuPrimitive.SubTrigger.displayName\n\nconst DropdownMenuSubContent = React.forwardRef<\n  React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,\n  React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n  <DropdownMenuPrimitive.SubContent\n    ref={ref}\n    className={cn(\n      \"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-dropdown-menu-content-transform-origin]\",\n      className\n    )}\n    {...props}\n  />\n))\nDropdownMenuSubContent.displayName =\n  DropdownMenuPrimitive.SubContent.displayName\n\nconst DropdownMenuContent = React.forwardRef<\n  React.ElementRef<typeof DropdownMenuPrimitive.Content>,\n  React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n  <DropdownMenuPrimitive.Portal>\n    <DropdownMenuPrimitive.Content\n      ref={ref}\n      sideOffset={sideOffset}\n      className={cn(\n        \"z-50 max-h-[var(--radix-dropdown-menu-content-available-height)] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-dropdown-menu-content-transform-origin]\",\n        className\n      )}\n      {...props}\n    />\n  </DropdownMenuPrimitive.Portal>\n))\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName\n\nconst DropdownMenuItem = React.forwardRef<\n  React.ElementRef<typeof DropdownMenuPrimitive.Item>,\n  React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\n    inset?: boolean\n  }\n>(({ className, inset, ...props }, ref) => (\n  <DropdownMenuPrimitive.Item\n    ref={ref}\n    className={cn(\n      \"relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n      inset && \"pl-8\",\n      className\n    )}\n    {...props}\n  />\n))\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName\n\nconst DropdownMenuCheckboxItem = React.forwardRef<\n  React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,\n  React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n  <DropdownMenuPrimitive.CheckboxItem\n    ref={ref}\n    className={cn(\n      \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n      className\n    )}\n    checked={checked}\n    {...props}\n  >\n    <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n      <DropdownMenuPrimitive.ItemIndicator>\n        <Check className=\"h-4 w-4\" />\n      </DropdownMenuPrimitive.ItemIndicator>\n    </span>\n    {children}\n  </DropdownMenuPrimitive.CheckboxItem>\n))\nDropdownMenuCheckboxItem.displayName =\n  DropdownMenuPrimitive.CheckboxItem.displayName\n\nconst DropdownMenuRadioItem = React.forwardRef<\n  React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,\n  React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n  <DropdownMenuPrimitive.RadioItem\n    ref={ref}\n    className={cn(\n      \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n      className\n    )}\n    {...props}\n  >\n    <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n      <DropdownMenuPrimitive.ItemIndicator>\n        <Circle className=\"h-2 w-2 fill-current\" />\n      </DropdownMenuPrimitive.ItemIndicator>\n    </span>\n    {children}\n  </DropdownMenuPrimitive.RadioItem>\n))\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName\n\nconst DropdownMenuLabel = React.forwardRef<\n  React.ElementRef<typeof DropdownMenuPrimitive.Label>,\n  React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\n    inset?: boolean\n  }\n>(({ className, inset, ...props }, ref) => (\n  <DropdownMenuPrimitive.Label\n    ref={ref}\n    className={cn(\n      \"px-2 py-1.5 text-sm font-semibold\",\n      inset && \"pl-8\",\n      className\n    )}\n    {...props}\n  />\n))\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName\n\nconst DropdownMenuSeparator = React.forwardRef<\n  React.ElementRef<typeof DropdownMenuPrimitive.Separator>,\n  React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n  <DropdownMenuPrimitive.Separator\n    ref={ref}\n    className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n    {...props}\n  />\n))\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName\n\nconst DropdownMenuShortcut = ({\n  className,\n  ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => {\n  return (\n    <span\n      className={cn(\"ml-auto text-xs tracking-widest opacity-60\", className)}\n      {...props}\n    />\n  )\n}\nDropdownMenuShortcut.displayName = \"DropdownMenuShortcut\"\n\nexport {\n  DropdownMenu,\n  DropdownMenuTrigger,\n  DropdownMenuContent,\n  DropdownMenuItem,\n  DropdownMenuCheckboxItem,\n  DropdownMenuRadioItem,\n  DropdownMenuLabel,\n  DropdownMenuSeparator,\n  DropdownMenuShortcut,\n  DropdownMenuGroup,\n  DropdownMenuPortal,\n  DropdownMenuSub,\n  DropdownMenuSubContent,\n  DropdownMenuSubTrigger,\n  DropdownMenuRadioGroup,\n}\n"
  },
  {
    "path": "components/ui/hover-card.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { HoverCard as HoverCardPrimitive } from \"radix-ui\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst HoverCard = HoverCardPrimitive.Root\n\nconst HoverCardTrigger = HoverCardPrimitive.Trigger\n\nconst HoverCardContent = React.forwardRef<\n  React.ElementRef<typeof HoverCardPrimitive.Content>,\n  React.ComponentPropsWithoutRef<typeof HoverCardPrimitive.Content>\n>(({ className, align = \"center\", sideOffset = 4, ...props }, ref) => (\n  <HoverCardPrimitive.Content\n    ref={ref}\n    align={align}\n    sideOffset={sideOffset}\n    className={cn(\n      \"z-50 w-64 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-hover-card-content-transform-origin]\",\n      className\n    )}\n    {...props}\n  />\n))\nHoverCardContent.displayName = HoverCardPrimitive.Content.displayName\n\nexport { HoverCard, HoverCardTrigger, HoverCardContent }\n"
  },
  {
    "path": "components/ui/input-group.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport { Input } from \"@/components/ui/input\"\nimport { Textarea } from \"@/components/ui/textarea\"\n\nfunction InputGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"input-group\"\n      role=\"group\"\n      className={cn(\n        \"group/input-group border-input dark:bg-input/30 shadow-xs relative flex w-full items-center rounded-md border outline-none transition-[color,box-shadow]\",\n        \"h-9 has-[>textarea]:h-auto\",\n\n        // Variants based on alignment.\n        \"has-[>[data-align=inline-start]]:[&>input]:pl-2\",\n        \"has-[>[data-align=inline-end]]:[&>input]:pr-2\",\n        \"has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>[data-align=block-start]]:[&>input]:pb-3\",\n        \"has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-end]]:[&>input]:pt-3\",\n\n        // Focus state.\n        \"has-[[data-slot=input-group-control]:focus-visible]:ring-ring has-[[data-slot=input-group-control]:focus-visible]:ring-1\",\n\n        // Error state.\n        \"has-[[data-slot][aria-invalid=true]]:ring-destructive/20 has-[[data-slot][aria-invalid=true]]:border-destructive dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40\",\n\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nconst inputGroupAddonVariants = cva(\n  \"text-muted-foreground flex h-auto cursor-text select-none items-center justify-center gap-2 py-1.5 text-sm font-medium group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-4\",\n  {\n    variants: {\n      align: {\n        \"inline-start\":\n          \"order-first pl-3 has-[>button]:ml-[-0.45rem] has-[>kbd]:ml-[-0.35rem]\",\n        \"inline-end\":\n          \"order-last pr-3 has-[>button]:mr-[-0.4rem] has-[>kbd]:mr-[-0.35rem]\",\n        \"block-start\":\n          \"[.border-b]:pb-3 order-first w-full justify-start px-3 pt-3 group-has-[>input]/input-group:pt-2.5\",\n        \"block-end\":\n          \"[.border-t]:pt-3 order-last w-full justify-start px-3 pb-3 group-has-[>input]/input-group:pb-2.5\",\n      },\n    },\n    defaultVariants: {\n      align: \"inline-start\",\n    },\n  }\n)\n\nfunction InputGroupAddon({\n  className,\n  align = \"inline-start\",\n  ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof inputGroupAddonVariants>) {\n  return (\n    <div\n      role=\"group\"\n      data-slot=\"input-group-addon\"\n      data-align={align}\n      className={cn(inputGroupAddonVariants({ align }), className)}\n      onClick={(e) => {\n        if ((e.target as HTMLElement).closest(\"button\")) {\n          return\n        }\n        e.currentTarget.parentElement?.querySelector(\"input\")?.focus()\n      }}\n      {...props}\n    />\n  )\n}\n\nconst inputGroupButtonVariants = cva(\n  \"flex items-center gap-2 text-sm shadow-none\",\n  {\n    variants: {\n      size: {\n        xs: \"h-6 gap-1 rounded-[calc(var(--radius)-5px)] px-2 has-[>svg]:px-2 [&>svg:not([class*='size-'])]:size-3.5\",\n        sm: \"h-8 gap-1.5 rounded-md px-2.5 has-[>svg]:px-2.5\",\n        \"icon-xs\":\n          \"size-6 rounded-[calc(var(--radius)-5px)] p-0 has-[>svg]:p-0\",\n        \"icon-sm\": \"size-8 p-0 has-[>svg]:p-0\",\n      },\n    },\n    defaultVariants: {\n      size: \"xs\",\n    },\n  }\n)\n\nfunction InputGroupButton({\n  className,\n  type = \"button\",\n  variant = \"ghost\",\n  size = \"xs\",\n  ...props\n}: Omit<React.ComponentProps<typeof Button>, \"size\"> &\n  VariantProps<typeof inputGroupButtonVariants>) {\n  return (\n    <Button\n      type={type}\n      data-size={size}\n      variant={variant}\n      className={cn(inputGroupButtonVariants({ size }), className)}\n      {...props}\n    />\n  )\n}\n\nfunction InputGroupText({ className, ...props }: React.ComponentProps<\"span\">) {\n  return (\n    <span\n      className={cn(\n        \"text-muted-foreground flex items-center gap-2 text-sm [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction InputGroupInput({\n  className,\n  ...props\n}: React.ComponentProps<\"input\">) {\n  return (\n    <Input\n      data-slot=\"input-group-control\"\n      className={cn(\n        \"flex-1 rounded-none border-0 bg-transparent shadow-none focus-visible:ring-0 dark:bg-transparent\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction InputGroupTextarea({\n  className,\n  ...props\n}: React.ComponentProps<\"textarea\">) {\n  return (\n    <Textarea\n      data-slot=\"input-group-control\"\n      className={cn(\n        \"flex-1 resize-none rounded-none border-0 bg-transparent py-3 shadow-none focus-visible:ring-0 dark:bg-transparent\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nexport {\n  InputGroup,\n  InputGroupAddon,\n  InputGroupButton,\n  InputGroupText,\n  InputGroupInput,\n  InputGroupTextarea,\n}\n"
  },
  {
    "path": "components/ui/input.tsx",
    "content": "import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Input = React.forwardRef<HTMLInputElement, React.ComponentProps<\"input\">>(\n  ({ className, type, ...props }, ref) => {\n    return (\n      <input\n        type={type}\n        className={cn(\n          \"flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-base ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n          className\n        )}\n        ref={ref}\n        {...props}\n      />\n    )\n  }\n)\nInput.displayName = \"Input\"\n\nexport { Input }\n"
  },
  {
    "path": "components/ui/label.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { Label as LabelPrimitive } from \"radix-ui\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst labelVariants = cva(\n  \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n)\n\nconst Label = React.forwardRef<\n  React.ElementRef<typeof LabelPrimitive.Root>,\n  React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> &\n    VariantProps<typeof labelVariants>\n>(({ className, ...props }, ref) => (\n  <LabelPrimitive.Root\n    ref={ref}\n    className={cn(labelVariants(), className)}\n    {...props}\n  />\n))\nLabel.displayName = LabelPrimitive.Root.displayName\n\nexport { Label }\n"
  },
  {
    "path": "components/ui/progress.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { Progress as ProgressPrimitive } from \"radix-ui\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Progress = React.forwardRef<\n  React.ElementRef<typeof ProgressPrimitive.Root>,\n  React.ComponentPropsWithoutRef<typeof ProgressPrimitive.Root>\n>(({ className, value, ...props }, ref) => (\n  <ProgressPrimitive.Root\n    ref={ref}\n    className={cn(\n      \"relative h-4 w-full overflow-hidden rounded-full bg-secondary\",\n      className\n    )}\n    {...props}\n  >\n    <ProgressPrimitive.Indicator\n      className=\"h-full w-full flex-1 bg-primary transition-all\"\n      style={{ transform: `translateX(-${100 - (value || 0)}%)` }}\n    />\n  </ProgressPrimitive.Root>\n))\nProgress.displayName = ProgressPrimitive.Root.displayName\n\nexport { Progress }\n"
  },
  {
    "path": "components/ui/scroll-area.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { ScrollArea as ScrollAreaPrimitive } from \"radix-ui\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst ScrollArea = React.forwardRef<\n  React.ElementRef<typeof ScrollAreaPrimitive.Root>,\n  React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root>\n>(({ className, children, ...props }, ref) => (\n  <ScrollAreaPrimitive.Root\n    ref={ref}\n    className={cn(\"relative overflow-hidden\", className)}\n    {...props}\n  >\n    <ScrollAreaPrimitive.Viewport className=\"h-full w-full rounded-[inherit]\">\n      {children}\n    </ScrollAreaPrimitive.Viewport>\n    <ScrollBar />\n    <ScrollAreaPrimitive.Corner />\n  </ScrollAreaPrimitive.Root>\n))\nScrollArea.displayName = ScrollAreaPrimitive.Root.displayName\n\nconst ScrollBar = React.forwardRef<\n  React.ElementRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>,\n  React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>\n>(({ className, orientation = \"vertical\", ...props }, ref) => (\n  <ScrollAreaPrimitive.ScrollAreaScrollbar\n    ref={ref}\n    orientation={orientation}\n    className={cn(\n      \"flex touch-none select-none transition-colors\",\n      orientation === \"vertical\" &&\n        \"h-full w-2.5 border-l border-l-transparent p-[1px]\",\n      orientation === \"horizontal\" &&\n        \"h-2.5 flex-col border-t border-t-transparent p-[1px]\",\n      className\n    )}\n    {...props}\n  >\n    <ScrollAreaPrimitive.ScrollAreaThumb className=\"relative flex-1 rounded-full bg-border\" />\n  </ScrollAreaPrimitive.ScrollAreaScrollbar>\n))\nScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName\n\nexport { ScrollArea, ScrollBar }\n"
  },
  {
    "path": "components/ui/select.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { Select as SelectPrimitive } from \"radix-ui\"\nimport { Check, ChevronDown, ChevronUp } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Select = SelectPrimitive.Root\n\nconst SelectGroup = SelectPrimitive.Group\n\nconst SelectValue = SelectPrimitive.Value\n\nconst SelectTrigger = React.forwardRef<\n  React.ElementRef<typeof SelectPrimitive.Trigger>,\n  React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n  <SelectPrimitive.Trigger\n    ref={ref}\n    className={cn(\n      \"flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background data-[placeholder]:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1\",\n      className\n    )}\n    {...props}\n  >\n    {children}\n    <SelectPrimitive.Icon asChild>\n      <ChevronDown className=\"h-4 w-4 opacity-50\" />\n    </SelectPrimitive.Icon>\n  </SelectPrimitive.Trigger>\n))\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName\n\nconst SelectScrollUpButton = React.forwardRef<\n  React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,\n  React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n  <SelectPrimitive.ScrollUpButton\n    ref={ref}\n    className={cn(\n      \"flex cursor-default items-center justify-center py-1\",\n      className\n    )}\n    {...props}\n  >\n    <ChevronUp className=\"h-4 w-4\" />\n  </SelectPrimitive.ScrollUpButton>\n))\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName\n\nconst SelectScrollDownButton = React.forwardRef<\n  React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,\n  React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n  <SelectPrimitive.ScrollDownButton\n    ref={ref}\n    className={cn(\n      \"flex cursor-default items-center justify-center py-1\",\n      className\n    )}\n    {...props}\n  >\n    <ChevronDown className=\"h-4 w-4\" />\n  </SelectPrimitive.ScrollDownButton>\n))\nSelectScrollDownButton.displayName =\n  SelectPrimitive.ScrollDownButton.displayName\n\nconst SelectContent = React.forwardRef<\n  React.ElementRef<typeof SelectPrimitive.Content>,\n  React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = \"popper\", ...props }, ref) => (\n  <SelectPrimitive.Portal>\n    <SelectPrimitive.Content\n      ref={ref}\n      className={cn(\n        \"relative z-50 max-h-[--radix-select-content-available-height] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-select-content-transform-origin]\",\n        position === \"popper\" &&\n          \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n        className\n      )}\n      position={position}\n      {...props}\n    >\n      <SelectScrollUpButton />\n      <SelectPrimitive.Viewport\n        className={cn(\n          \"p-1\",\n          position === \"popper\" &&\n            \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]\"\n        )}\n      >\n        {children}\n      </SelectPrimitive.Viewport>\n      <SelectScrollDownButton />\n    </SelectPrimitive.Content>\n  </SelectPrimitive.Portal>\n))\nSelectContent.displayName = SelectPrimitive.Content.displayName\n\nconst SelectLabel = React.forwardRef<\n  React.ElementRef<typeof SelectPrimitive.Label>,\n  React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n  <SelectPrimitive.Label\n    ref={ref}\n    className={cn(\"py-1.5 pl-8 pr-2 text-sm font-semibold\", className)}\n    {...props}\n  />\n))\nSelectLabel.displayName = SelectPrimitive.Label.displayName\n\nconst SelectItem = React.forwardRef<\n  React.ElementRef<typeof SelectPrimitive.Item>,\n  React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n  <SelectPrimitive.Item\n    ref={ref}\n    className={cn(\n      \"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n      className\n    )}\n    {...props}\n  >\n    <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n      <SelectPrimitive.ItemIndicator>\n        <Check className=\"h-4 w-4\" />\n      </SelectPrimitive.ItemIndicator>\n    </span>\n\n    <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n  </SelectPrimitive.Item>\n))\nSelectItem.displayName = SelectPrimitive.Item.displayName\n\nconst SelectSeparator = React.forwardRef<\n  React.ElementRef<typeof SelectPrimitive.Separator>,\n  React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n  <SelectPrimitive.Separator\n    ref={ref}\n    className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n    {...props}\n  />\n))\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName\n\nexport {\n  Select,\n  SelectGroup,\n  SelectValue,\n  SelectTrigger,\n  SelectContent,\n  SelectLabel,\n  SelectItem,\n  SelectSeparator,\n  SelectScrollUpButton,\n  SelectScrollDownButton,\n}\n"
  },
  {
    "path": "components/ui/separator.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { Separator as SeparatorPrimitive } from \"radix-ui\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Separator = React.forwardRef<\n  React.ElementRef<typeof SeparatorPrimitive.Root>,\n  React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>\n>(\n  (\n    { className, orientation = \"horizontal\", decorative = true, ...props },\n    ref\n  ) => (\n    <SeparatorPrimitive.Root\n      ref={ref}\n      decorative={decorative}\n      orientation={orientation}\n      className={cn(\n        \"shrink-0 bg-border\",\n        orientation === \"horizontal\" ? \"h-[1px] w-full\" : \"h-full w-[1px]\",\n        className\n      )}\n      {...props}\n    />\n  )\n)\nSeparator.displayName = SeparatorPrimitive.Root.displayName\n\nexport { Separator }\n"
  },
  {
    "path": "components/ui/sheet.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { Dialog as SheetPrimitive } from \"radix-ui\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { X } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Sheet = SheetPrimitive.Root\n\nconst SheetTrigger = SheetPrimitive.Trigger\n\nconst SheetClose = SheetPrimitive.Close\n\nconst SheetPortal = SheetPrimitive.Portal\n\nconst SheetOverlay = React.forwardRef<\n  React.ElementRef<typeof SheetPrimitive.Overlay>,\n  React.ComponentPropsWithoutRef<typeof SheetPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n  <SheetPrimitive.Overlay\n    className={cn(\n      \"fixed inset-0 z-50 bg-black/80  data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n      className\n    )}\n    {...props}\n    ref={ref}\n  />\n))\nSheetOverlay.displayName = SheetPrimitive.Overlay.displayName\n\nconst sheetVariants = cva(\n  \"fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500\",\n  {\n    variants: {\n      side: {\n        top: \"inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top\",\n        bottom:\n          \"inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom\",\n        left: \"inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm\",\n        right:\n          \"inset-y-0 right-0 h-full w-3/4  border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm\",\n      },\n    },\n    defaultVariants: {\n      side: \"right\",\n    },\n  }\n)\n\ninterface SheetContentProps\n  extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content>,\n    VariantProps<typeof sheetVariants> {}\n\nconst SheetContent = React.forwardRef<\n  React.ElementRef<typeof SheetPrimitive.Content>,\n  SheetContentProps\n>(({ side = \"right\", className, children, ...props }, ref) => (\n  <SheetPortal>\n    <SheetOverlay />\n    <SheetPrimitive.Content\n      ref={ref}\n      className={cn(sheetVariants({ side }), className)}\n      {...props}\n    >\n      {children}\n      <SheetPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary\">\n        <X className=\"h-4 w-4\" />\n        <span className=\"sr-only\">Close</span>\n      </SheetPrimitive.Close>\n    </SheetPrimitive.Content>\n  </SheetPortal>\n))\nSheetContent.displayName = SheetPrimitive.Content.displayName\n\nconst SheetHeader = ({\n  className,\n  ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n  <div\n    className={cn(\n      \"flex flex-col space-y-2 text-center sm:text-left\",\n      className\n    )}\n    {...props}\n  />\n)\nSheetHeader.displayName = \"SheetHeader\"\n\nconst SheetFooter = ({\n  className,\n  ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n  <div\n    className={cn(\n      \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n      className\n    )}\n    {...props}\n  />\n)\nSheetFooter.displayName = \"SheetFooter\"\n\nconst SheetTitle = React.forwardRef<\n  React.ElementRef<typeof SheetPrimitive.Title>,\n  React.ComponentPropsWithoutRef<typeof SheetPrimitive.Title>\n>(({ className, ...props }, ref) => (\n  <SheetPrimitive.Title\n    ref={ref}\n    className={cn(\"text-lg font-semibold text-foreground\", className)}\n    {...props}\n  />\n))\nSheetTitle.displayName = SheetPrimitive.Title.displayName\n\nconst SheetDescription = React.forwardRef<\n  React.ElementRef<typeof SheetPrimitive.Description>,\n  React.ComponentPropsWithoutRef<typeof SheetPrimitive.Description>\n>(({ className, ...props }, ref) => (\n  <SheetPrimitive.Description\n    ref={ref}\n    className={cn(\"text-sm text-muted-foreground\", className)}\n    {...props}\n  />\n))\nSheetDescription.displayName = SheetPrimitive.Description.displayName\n\nexport {\n  Sheet,\n  SheetPortal,\n  SheetOverlay,\n  SheetTrigger,\n  SheetClose,\n  SheetContent,\n  SheetHeader,\n  SheetFooter,\n  SheetTitle,\n  SheetDescription,\n}\n"
  },
  {
    "path": "components/ui/sidebar.tsx",
    "content": "\"use client\";\n\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { PanelLeft } from \"lucide-react\";\nimport { Slot as SlotPrimitive } from \"radix-ui\";\nimport * as React from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\nimport { Separator } from \"@/components/ui/separator\";\nimport {\n  Sheet,\n  SheetContent,\n  SheetDescription,\n  SheetHeader,\n  SheetTitle,\n} from \"@/components/ui/sheet\";\nimport { Skeleton } from \"@/components/ui/skeleton\";\nimport {\n  Tooltip,\n  TooltipContent,\n  TooltipProvider,\n  TooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { useIsMobile } from \"@/hooks/use-mobile\";\nimport { cn } from \"@/lib/utils\";\n\nconst SIDEBAR_COOKIE_NAME = \"sidebar_state\";\nconst SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;\nconst SIDEBAR_WIDTH = \"16rem\";\nconst SIDEBAR_WIDTH_MOBILE = \"18rem\";\nconst SIDEBAR_WIDTH_ICON = \"3rem\";\nconst SIDEBAR_KEYBOARD_SHORTCUT = \"b\";\n\ntype SidebarContextProps = {\n  state: \"expanded\" | \"collapsed\";\n  open: boolean;\n  setOpen: (open: boolean) => void;\n  openMobile: boolean;\n  setOpenMobile: (open: boolean) => void;\n  isMobile: boolean;\n  toggleSidebar: () => void;\n};\n\nconst SidebarContext = React.createContext<SidebarContextProps | null>(null);\n\nfunction useSidebar() {\n  const context = React.useContext(SidebarContext);\n  if (!context) {\n    throw new Error(\"useSidebar must be used within a SidebarProvider.\");\n  }\n\n  return context;\n}\n\nconst SidebarProvider = React.forwardRef<\n  HTMLDivElement,\n  React.ComponentProps<\"div\"> & {\n    defaultOpen?: boolean;\n    open?: boolean;\n    onOpenChange?: (open: boolean) => void;\n  }\n>(\n  (\n    {\n      defaultOpen = true,\n      open: openProp,\n      onOpenChange: setOpenProp,\n      className,\n      style,\n      children,\n      ...props\n    },\n    ref\n  ) => {\n    const isMobile = useIsMobile();\n    const [openMobile, setOpenMobile] = React.useState(false);\n\n    // This is the internal state of the sidebar.\n    // We use openProp and setOpenProp for control from outside the component.\n    const [_open, _setOpen] = React.useState(defaultOpen);\n    const open = openProp ?? _open;\n    const setOpen = React.useCallback(\n      (value: boolean | ((value: boolean) => boolean)) => {\n        const openState = typeof value === \"function\" ? value(open) : value;\n        if (setOpenProp) {\n          setOpenProp(openState);\n        } else {\n          _setOpen(openState);\n        }\n\n        // This sets the cookie to keep the sidebar state.\n        document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`;\n      },\n      [setOpenProp, open]\n    );\n\n    // Helper to toggle the sidebar.\n    const toggleSidebar = React.useCallback(() => {\n      return isMobile\n        ? setOpenMobile((open) => !open)\n        : setOpen((open) => !open);\n    }, [isMobile, setOpen, setOpenMobile]);\n\n    // Adds a keyboard shortcut to toggle the sidebar.\n    React.useEffect(() => {\n      const handleKeyDown = (event: KeyboardEvent) => {\n        if (\n          event.key === SIDEBAR_KEYBOARD_SHORTCUT &&\n          (event.metaKey || event.ctrlKey)\n        ) {\n          event.preventDefault();\n          toggleSidebar();\n        }\n      };\n\n      window.addEventListener(\"keydown\", handleKeyDown);\n      return () => window.removeEventListener(\"keydown\", handleKeyDown);\n    }, [toggleSidebar]);\n\n    // We add a state so that we can do data-state=\"expanded\" or \"collapsed\".\n    // This makes it easier to style the sidebar with Tailwind classes.\n    const state = open ? \"expanded\" : \"collapsed\";\n\n    const contextValue = React.useMemo<SidebarContextProps>(\n      () => ({\n        state,\n        open,\n        setOpen,\n        isMobile,\n        openMobile,\n        setOpenMobile,\n        toggleSidebar,\n      }),\n      [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar]\n    );\n\n    return (\n      <SidebarContext.Provider value={contextValue}>\n        <TooltipProvider delayDuration={0}>\n          <div\n            className={cn(\n              \"group/sidebar-wrapper flex min-h-svh w-full has-[[data-variant=inset]]:bg-sidebar\",\n              className\n            )}\n            ref={ref}\n            style={\n              {\n                \"--sidebar-width\": SIDEBAR_WIDTH,\n                \"--sidebar-width-icon\": SIDEBAR_WIDTH_ICON,\n                ...style,\n              } as React.CSSProperties\n            }\n            {...props}\n          >\n            {children}\n          </div>\n        </TooltipProvider>\n      </SidebarContext.Provider>\n    );\n  }\n);\nSidebarProvider.displayName = \"SidebarProvider\";\n\nconst Sidebar = React.forwardRef<\n  HTMLDivElement,\n  React.ComponentProps<\"div\"> & {\n    side?: \"left\" | \"right\";\n    variant?: \"sidebar\" | \"floating\" | \"inset\";\n    collapsible?: \"offcanvas\" | \"icon\" | \"none\";\n  }\n>(\n  (\n    {\n      side = \"left\",\n      variant = \"sidebar\",\n      collapsible = \"offcanvas\",\n      className,\n      children,\n      ...props\n    },\n    ref\n  ) => {\n    const { isMobile, state, openMobile, setOpenMobile } = useSidebar();\n\n    if (collapsible === \"none\") {\n      return (\n        <div\n          className={cn(\n            \"flex h-full w-[var(--sidebar-width)] flex-col bg-sidebar text-sidebar-foreground\",\n            className\n          )}\n          ref={ref}\n          {...props}\n        >\n          {children}\n        </div>\n      );\n    }\n\n    if (isMobile) {\n      return (\n        <Sheet onOpenChange={setOpenMobile} open={openMobile} {...props}>\n          <SheetContent\n            className=\"w-[var(--sidebar-width)] bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden\"\n            data-mobile=\"true\"\n            data-sidebar=\"sidebar\"\n            side={side}\n            style={\n              {\n                \"--sidebar-width\": SIDEBAR_WIDTH_MOBILE,\n              } as React.CSSProperties\n            }\n          >\n            <SheetHeader className=\"sr-only\">\n              <SheetTitle>Sidebar</SheetTitle>\n              <SheetDescription>Displays the mobile sidebar.</SheetDescription>\n            </SheetHeader>\n            <div className=\"flex h-full w-full flex-col\">{children}</div>\n          </SheetContent>\n        </Sheet>\n      );\n    }\n\n    return (\n      <div\n        className=\"group peer hidden text-sidebar-foreground md:block\"\n        data-collapsible={state === \"collapsed\" ? collapsible : \"\"}\n        data-side={side}\n        data-state={state}\n        data-variant={variant}\n        ref={ref}\n      >\n        {/* This is what handles the sidebar gap on desktop */}\n        <div\n          className={cn(\n            \"relative w-[var(--sidebar-width)] bg-transparent transition-[width] duration-200 ease-linear\",\n            \"group-data-[collapsible=offcanvas]:w-0\",\n            \"group-data-[side=right]:rotate-180\",\n            variant === \"floating\" || variant === \"inset\"\n              ? \"group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4))]\"\n              : \"group-data-[collapsible=icon]:w-[var(--sidebar-width-icon)]\"\n          )}\n        />\n        <div\n          className={cn(\n            \"fixed inset-y-0 z-10 hidden h-svh w-[var(--sidebar-width)] transition-[left,right,width] duration-200 ease-linear md:flex\",\n            side === \"left\"\n              ? \"left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]\"\n              : \"right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]\",\n            // Adjust the padding for floating and inset variants.\n            variant === \"floating\" || variant === \"inset\"\n              ? \"p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4)_+2px)]\"\n              : \"group-data-[collapsible=icon]:w-[var(--sidebar-width-icon)] group-data-[side=left]:border-r group-data-[side=right]:border-l\",\n            className\n          )}\n          {...props}\n        >\n          <div\n            className=\"flex h-full w-full flex-col bg-sidebar group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:border-sidebar-border group-data-[variant=floating]:shadow\"\n            data-sidebar=\"sidebar\"\n          >\n            {children}\n          </div>\n        </div>\n      </div>\n    );\n  }\n);\nSidebar.displayName = \"Sidebar\";\n\nconst SidebarTrigger = React.forwardRef<\n  React.ElementRef<typeof Button>,\n  React.ComponentProps<typeof Button>\n>(({ className, onClick, ...props }, ref) => {\n  const { toggleSidebar } = useSidebar();\n\n  return (\n    <Button\n      className={cn(\"h-7 w-7\", className)}\n      data-sidebar=\"trigger\"\n      onClick={(event) => {\n        onClick?.(event);\n        toggleSidebar();\n      }}\n      ref={ref}\n      size=\"icon\"\n      variant=\"ghost\"\n      {...props}\n    >\n      <PanelLeft />\n      <span className=\"sr-only\">Toggle Sidebar</span>\n    </Button>\n  );\n});\nSidebarTrigger.displayName = \"SidebarTrigger\";\n\nconst SidebarRail = React.forwardRef<\n  HTMLButtonElement,\n  React.ComponentProps<\"button\">\n>(({ className, ...props }, ref) => {\n  const { toggleSidebar } = useSidebar();\n\n  return (\n    <button\n      aria-label=\"Toggle Sidebar\"\n      className={cn(\n        \"-translate-x-1/2 group-data-[side=left]:-right-4 absolute inset-y-0 z-20 hidden w-4 transition-all ease-linear after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] hover:after:bg-sidebar-border group-data-[side=right]:left-0 sm:flex\",\n        \"[[data-side=left]_&]:cursor-w-resize [[data-side=right]_&]:cursor-e-resize\",\n        \"[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize\",\n        \"group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:hover:bg-sidebar group-data-[collapsible=offcanvas]:after:left-full\",\n        \"[[data-side=left][data-collapsible=offcanvas]_&]:-right-2\",\n        \"[[data-side=right][data-collapsible=offcanvas]_&]:-left-2\",\n        className\n      )}\n      data-sidebar=\"rail\"\n      onClick={toggleSidebar}\n      ref={ref}\n      tabIndex={-1}\n      title=\"Toggle Sidebar\"\n      {...props}\n    />\n  );\n});\nSidebarRail.displayName = \"SidebarRail\";\n\nconst SidebarInset = React.forwardRef<\n  HTMLDivElement,\n  React.ComponentProps<\"main\">\n>(({ className, ...props }, ref) => {\n  return (\n    <main\n      className={cn(\n        \"relative flex w-full flex-1 flex-col bg-background\",\n        \"md:peer-data-[state=collapsed]:peer-data-[variant=inset]:ml-2 md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow\",\n        className\n      )}\n      ref={ref}\n      {...props}\n    />\n  );\n});\nSidebarInset.displayName = \"SidebarInset\";\n\nconst SidebarInput = React.forwardRef<\n  React.ElementRef<typeof Input>,\n  React.ComponentProps<typeof Input>\n>(({ className, ...props }, ref) => {\n  return (\n    <Input\n      className={cn(\n        \"h-8 w-full bg-background shadow-none focus-visible:ring-2 focus-visible:ring-sidebar-ring\",\n        className\n      )}\n      data-sidebar=\"input\"\n      ref={ref}\n      {...props}\n    />\n  );\n});\nSidebarInput.displayName = \"SidebarInput\";\n\nconst SidebarHeader = React.forwardRef<\n  HTMLDivElement,\n  React.ComponentProps<\"div\">\n>(({ className, ...props }, ref) => {\n  return (\n    <div\n      className={cn(\"flex flex-col gap-2 p-2\", className)}\n      data-sidebar=\"header\"\n      ref={ref}\n      {...props}\n    />\n  );\n});\nSidebarHeader.displayName = \"SidebarHeader\";\n\nconst SidebarFooter = React.forwardRef<\n  HTMLDivElement,\n  React.ComponentProps<\"div\">\n>(({ className, ...props }, ref) => {\n  return (\n    <div\n      className={cn(\"flex flex-col gap-2 p-2\", className)}\n      data-sidebar=\"footer\"\n      ref={ref}\n      {...props}\n    />\n  );\n});\nSidebarFooter.displayName = \"SidebarFooter\";\n\nconst SidebarSeparator = React.forwardRef<\n  React.ElementRef<typeof Separator>,\n  React.ComponentProps<typeof Separator>\n>(({ className, ...props }, ref) => {\n  return (\n    <Separator\n      className={cn(\"mx-2 w-auto bg-sidebar-border\", className)}\n      data-sidebar=\"separator\"\n      ref={ref}\n      {...props}\n    />\n  );\n});\nSidebarSeparator.displayName = \"SidebarSeparator\";\n\nconst SidebarContent = React.forwardRef<\n  HTMLDivElement,\n  React.ComponentProps<\"div\">\n>(({ className, ...props }, ref) => {\n  return (\n    <div\n      className={cn(\n        \"flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden\",\n        className\n      )}\n      data-sidebar=\"content\"\n      ref={ref}\n      {...props}\n    />\n  );\n});\nSidebarContent.displayName = \"SidebarContent\";\n\nconst SidebarGroup = React.forwardRef<\n  HTMLDivElement,\n  React.ComponentProps<\"div\">\n>(({ className, ...props }, ref) => {\n  return (\n    <div\n      className={cn(\"relative flex w-full min-w-0 flex-col p-2\", className)}\n      data-sidebar=\"group\"\n      ref={ref}\n      {...props}\n    />\n  );\n});\nSidebarGroup.displayName = \"SidebarGroup\";\n\nconst SidebarGroupLabel = React.forwardRef<\n  HTMLDivElement,\n  React.ComponentProps<\"div\"> & { asChild?: boolean }\n>(({ className, asChild = false, ...props }, ref) => {\n  const Comp = asChild ? SlotPrimitive.Slot : \"div\";\n\n  return (\n    <Comp\n      className={cn(\n        \"flex h-8 shrink-0 items-center rounded-md px-2 font-medium text-sidebar-foreground/70 text-xs outline-none ring-sidebar-ring transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n        \"group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0\",\n        className\n      )}\n      data-sidebar=\"group-label\"\n      ref={ref}\n      {...props}\n    />\n  );\n});\nSidebarGroupLabel.displayName = \"SidebarGroupLabel\";\n\nconst SidebarGroupAction = React.forwardRef<\n  HTMLButtonElement,\n  React.ComponentProps<\"button\"> & { asChild?: boolean }\n>(({ className, asChild = false, ...props }, ref) => {\n  const Comp = asChild ? SlotPrimitive.Slot : \"button\";\n\n  return (\n    <Comp\n      className={cn(\n        \"absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n        // Increases the hit area of the button on mobile.\n        \"after:-inset-2 after:absolute after:md:hidden\",\n        \"group-data-[collapsible=icon]:hidden\",\n        className\n      )}\n      data-sidebar=\"group-action\"\n      ref={ref}\n      {...props}\n    />\n  );\n});\nSidebarGroupAction.displayName = \"SidebarGroupAction\";\n\nconst SidebarGroupContent = React.forwardRef<\n  HTMLDivElement,\n  React.ComponentProps<\"div\">\n>(({ className, ...props }, ref) => (\n  <div\n    className={cn(\"w-full text-sm\", className)}\n    data-sidebar=\"group-content\"\n    ref={ref}\n    {...props}\n  />\n));\nSidebarGroupContent.displayName = \"SidebarGroupContent\";\n\nconst SidebarMenu = React.forwardRef<\n  HTMLUListElement,\n  React.ComponentProps<\"ul\">\n>(({ className, ...props }, ref) => (\n  <ul\n    className={cn(\"flex w-full min-w-0 flex-col gap-1\", className)}\n    data-sidebar=\"menu\"\n    ref={ref}\n    {...props}\n  />\n));\nSidebarMenu.displayName = \"SidebarMenu\";\n\nconst SidebarMenuItem = React.forwardRef<\n  HTMLLIElement,\n  React.ComponentProps<\"li\">\n>(({ className, ...props }, ref) => (\n  <li\n    className={cn(\"group/menu-item relative\", className)}\n    data-sidebar=\"menu-item\"\n    ref={ref}\n    {...props}\n  />\n));\nSidebarMenuItem.displayName = \"SidebarMenuItem\";\n\nconst sidebarMenuButtonVariants = cva(\n  \"peer/menu-button group-data-[collapsible=icon]:!size-8 group-data-[collapsible=icon]:!p-2 flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-none ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-[[data-sidebar=menu-action]]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0\",\n  {\n    variants: {\n      variant: {\n        default: \"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n        outline:\n          \"bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]\",\n      },\n      size: {\n        default: \"h-8 text-sm\",\n        sm: \"h-7 text-xs\",\n        lg: \"group-data-[collapsible=icon]:!p-0 h-12 text-sm\",\n      },\n    },\n    defaultVariants: {\n      variant: \"default\",\n      size: \"default\",\n    },\n  }\n);\n\nconst SidebarMenuButton = React.forwardRef<\n  HTMLButtonElement,\n  React.ComponentProps<\"button\"> & {\n    asChild?: boolean;\n    isActive?: boolean;\n    tooltip?: string | React.ComponentProps<typeof TooltipContent>;\n  } & VariantProps<typeof sidebarMenuButtonVariants>\n>(\n  (\n    {\n      asChild = false,\n      isActive = false,\n      variant = \"default\",\n      size = \"default\",\n      tooltip,\n      className,\n      ...props\n    },\n    ref\n  ) => {\n    const Comp = asChild ? SlotPrimitive.Slot : \"button\";\n    const { isMobile, state } = useSidebar();\n\n    const button = (\n      <Comp\n        className={cn(sidebarMenuButtonVariants({ variant, size }), className)}\n        data-active={isActive}\n        data-sidebar=\"menu-button\"\n        data-size={size}\n        ref={ref}\n        {...props}\n      />\n    );\n\n    if (!tooltip) {\n      return button;\n    }\n\n    if (typeof tooltip === \"string\") {\n      tooltip = {\n        children: tooltip,\n      };\n    }\n\n    return (\n      <Tooltip>\n        <TooltipTrigger asChild>{button}</TooltipTrigger>\n        <TooltipContent\n          align=\"center\"\n          hidden={state !== \"collapsed\" || isMobile}\n          side=\"right\"\n          {...tooltip}\n        />\n      </Tooltip>\n    );\n  }\n);\nSidebarMenuButton.displayName = \"SidebarMenuButton\";\n\nconst SidebarMenuAction = React.forwardRef<\n  HTMLButtonElement,\n  React.ComponentProps<\"button\"> & {\n    asChild?: boolean;\n    showOnHover?: boolean;\n  }\n>(({ className, asChild = false, showOnHover = false, ...props }, ref) => {\n  const Comp = asChild ? SlotPrimitive.Slot : \"button\";\n\n  return (\n    <Comp\n      className={cn(\n        \"absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 peer-hover/menu-button:text-sidebar-accent-foreground [&>svg]:size-4 [&>svg]:shrink-0\",\n        // Increases the hit area of the button on mobile.\n        \"after:-inset-2 after:absolute after:md:hidden\",\n        \"peer-data-[size=sm]/menu-button:top-1\",\n        \"peer-data-[size=default]/menu-button:top-1.5\",\n        \"peer-data-[size=lg]/menu-button:top-2.5\",\n        \"group-data-[collapsible=icon]:hidden\",\n        showOnHover &&\n          \"group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 peer-data-[active=true]/menu-button:text-sidebar-accent-foreground md:opacity-0\",\n        className\n      )}\n      data-sidebar=\"menu-action\"\n      ref={ref}\n      {...props}\n    />\n  );\n});\nSidebarMenuAction.displayName = \"SidebarMenuAction\";\n\nconst SidebarMenuBadge = React.forwardRef<\n  HTMLDivElement,\n  React.ComponentProps<\"div\">\n>(({ className, ...props }, ref) => (\n  <div\n    className={cn(\n      \"pointer-events-none absolute right-1 flex h-5 min-w-5 select-none items-center justify-center rounded-md px-1 font-medium text-sidebar-foreground text-xs tabular-nums\",\n      \"peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground\",\n      \"peer-data-[size=sm]/menu-button:top-1\",\n      \"peer-data-[size=default]/menu-button:top-1.5\",\n      \"peer-data-[size=lg]/menu-button:top-2.5\",\n      \"group-data-[collapsible=icon]:hidden\",\n      className\n    )}\n    data-sidebar=\"menu-badge\"\n    ref={ref}\n    {...props}\n  />\n));\nSidebarMenuBadge.displayName = \"SidebarMenuBadge\";\n\nconst SidebarMenuSkeleton = React.forwardRef<\n  HTMLDivElement,\n  React.ComponentProps<\"div\"> & {\n    showIcon?: boolean;\n  }\n>(({ className, showIcon = false, ...props }, ref) => {\n  // Random width between 50 to 90%.\n  const width = React.useMemo(() => {\n    return `${Math.floor(Math.random() * 40) + 50}%`;\n  }, []);\n\n  return (\n    <div\n      className={cn(\"flex h-8 items-center gap-2 rounded-md px-2\", className)}\n      data-sidebar=\"menu-skeleton\"\n      ref={ref}\n      {...props}\n    >\n      {showIcon && (\n        <Skeleton\n          className=\"size-4 rounded-md\"\n          data-sidebar=\"menu-skeleton-icon\"\n        />\n      )}\n      <Skeleton\n        className=\"h-4 max-w-[var(--skeleton-width)] flex-1\"\n        data-sidebar=\"menu-skeleton-text\"\n        style={\n          {\n            \"--skeleton-width\": width,\n          } as React.CSSProperties\n        }\n      />\n    </div>\n  );\n});\nSidebarMenuSkeleton.displayName = \"SidebarMenuSkeleton\";\n\nconst SidebarMenuSub = React.forwardRef<\n  HTMLUListElement,\n  React.ComponentProps<\"ul\">\n>(({ className, ...props }, ref) => (\n  <ul\n    className={cn(\n      \"mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-sidebar-border border-l px-2.5 py-0.5\",\n      \"group-data-[collapsible=icon]:hidden\",\n      className\n    )}\n    data-sidebar=\"menu-sub\"\n    ref={ref}\n    {...props}\n  />\n));\nSidebarMenuSub.displayName = \"SidebarMenuSub\";\n\nconst SidebarMenuSubItem = React.forwardRef<\n  HTMLLIElement,\n  React.ComponentProps<\"li\">\n>(({ ...props }, ref) => <li ref={ref} {...props} />);\nSidebarMenuSubItem.displayName = \"SidebarMenuSubItem\";\n\nconst SidebarMenuSubButton = React.forwardRef<\n  HTMLAnchorElement,\n  React.ComponentProps<\"a\"> & {\n    asChild?: boolean;\n    size?: \"sm\" | \"md\";\n    isActive?: boolean;\n  }\n>(({ asChild = false, size = \"md\", isActive, className, ...props }, ref) => {\n  const Comp = asChild ? SlotPrimitive.Slot : \"a\";\n\n  return (\n    <Comp\n      className={cn(\n        \"-translate-x-px flex h-7 min-w-0 items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground outline-none ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground\",\n        \"data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground\",\n        size === \"sm\" && \"text-xs\",\n        size === \"md\" && \"text-sm\",\n        \"group-data-[collapsible=icon]:hidden\",\n        className\n      )}\n      data-active={isActive}\n      data-sidebar=\"menu-sub-button\"\n      data-size={size}\n      ref={ref}\n      {...props}\n    />\n  );\n});\nSidebarMenuSubButton.displayName = \"SidebarMenuSubButton\";\n\nexport {\n  Sidebar,\n  SidebarContent,\n  SidebarFooter,\n  SidebarGroup,\n  SidebarGroupAction,\n  SidebarGroupContent,\n  SidebarGroupLabel,\n  SidebarHeader,\n  SidebarInput,\n  SidebarInset,\n  SidebarMenu,\n  SidebarMenuAction,\n  SidebarMenuBadge,\n  SidebarMenuButton,\n  SidebarMenuItem,\n  SidebarMenuSkeleton,\n  SidebarMenuSub,\n  SidebarMenuSubButton,\n  SidebarMenuSubItem,\n  SidebarProvider,\n  SidebarRail,\n  SidebarSeparator,\n  SidebarTrigger,\n  useSidebar,\n};\n"
  },
  {
    "path": "components/ui/skeleton.tsx",
    "content": "import { cn } from \"@/lib/utils\"\n\nfunction Skeleton({\n  className,\n  ...props\n}: React.HTMLAttributes<HTMLDivElement>) {\n  return (\n    <div\n      className={cn(\"animate-pulse rounded-md bg-muted\", className)}\n      {...props}\n    />\n  )\n}\n\nexport { Skeleton }\n"
  },
  {
    "path": "components/ui/textarea.tsx",
    "content": "import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Textarea = React.forwardRef<\n  HTMLTextAreaElement,\n  React.ComponentProps<\"textarea\">\n>(({ className, ...props }, ref) => {\n  return (\n    <textarea\n      className={cn(\n        \"flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-base ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n        className\n      )}\n      ref={ref}\n      {...props}\n    />\n  )\n})\nTextarea.displayName = \"Textarea\"\n\nexport { Textarea }\n"
  },
  {
    "path": "components/ui/tooltip.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { Tooltip as TooltipPrimitive } from \"radix-ui\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst TooltipProvider = TooltipPrimitive.Provider\n\nconst Tooltip = TooltipPrimitive.Root\n\nconst TooltipTrigger = TooltipPrimitive.Trigger\n\nconst TooltipContent = React.forwardRef<\n  React.ElementRef<typeof TooltipPrimitive.Content>,\n  React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n  <TooltipPrimitive.Content\n    ref={ref}\n    sideOffset={sideOffset}\n    className={cn(\n      \"z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-tooltip-content-transform-origin]\",\n      className\n    )}\n    {...props}\n  />\n))\nTooltipContent.displayName = TooltipPrimitive.Content.displayName\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n"
  },
  {
    "path": "components/version-footer.tsx",
    "content": "\"use client\";\n\nimport { isAfter } from \"date-fns\";\nimport { motion } from \"framer-motion\";\nimport { useState } from \"react\";\nimport { useSWRConfig } from \"swr\";\nimport { useWindowSize } from \"usehooks-ts\";\nimport { useArtifact } from \"@/hooks/use-artifact\";\nimport type { Document } from \"@/lib/db/schema\";\nimport { getDocumentTimestampByIndex } from \"@/lib/utils\";\nimport { LoaderIcon } from \"./icons\";\nimport { Button } from \"./ui/button\";\n\ntype VersionFooterProps = {\n  handleVersionChange: (type: \"next\" | \"prev\" | \"toggle\" | \"latest\") => void;\n  documents: Document[] | undefined;\n  currentVersionIndex: number;\n};\n\nexport const VersionFooter = ({\n  handleVersionChange,\n  documents,\n  currentVersionIndex,\n}: VersionFooterProps) => {\n  const { artifact } = useArtifact();\n\n  const { width } = useWindowSize();\n  const isMobile = width < 768;\n\n  const { mutate } = useSWRConfig();\n  const [isMutating, setIsMutating] = useState(false);\n\n  if (!documents) {\n    return;\n  }\n\n  return (\n    <motion.div\n      animate={{ y: 0 }}\n      className=\"absolute bottom-0 z-50 flex w-full flex-col justify-between gap-4 border-t bg-background p-4 lg:flex-row\"\n      exit={{ y: isMobile ? 200 : 77 }}\n      initial={{ y: isMobile ? 200 : 77 }}\n      transition={{ type: \"spring\", stiffness: 140, damping: 20 }}\n    >\n      <div>\n        <div>You are viewing a previous version</div>\n        <div className=\"text-muted-foreground text-sm\">\n          Restore this version to make edits\n        </div>\n      </div>\n\n      <div className=\"flex flex-row gap-4\">\n        <Button\n          disabled={isMutating}\n          onClick={async () => {\n            setIsMutating(true);\n\n            mutate(\n              `/api/document?id=${artifact.documentId}`,\n              await fetch(\n                `/api/document?id=${artifact.documentId}&timestamp=${getDocumentTimestampByIndex(\n                  documents,\n                  currentVersionIndex\n                )}`,\n                {\n                  method: \"DELETE\",\n                }\n              ),\n              {\n                optimisticData: documents\n                  ? [\n                      ...documents.filter((document) =>\n                        isAfter(\n                          new Date(document.createdAt),\n                          new Date(\n                            getDocumentTimestampByIndex(\n                              documents,\n                              currentVersionIndex\n                            )\n                          )\n                        )\n                      ),\n                    ]\n                  : [],\n              }\n            );\n          }}\n        >\n          <div>Restore this version</div>\n          {isMutating && (\n            <div className=\"animate-spin\">\n              <LoaderIcon />\n            </div>\n          )}\n        </Button>\n        <Button\n          onClick={() => {\n            handleVersionChange(\"latest\");\n          }}\n          variant=\"outline\"\n        >\n          Back to latest version\n        </Button>\n      </div>\n    </motion.div>\n  );\n};\n"
  },
  {
    "path": "components/visibility-selector.tsx",
    "content": "\"use client\";\n\nimport { type ReactNode, useMemo, useState } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n  DropdownMenu,\n  DropdownMenuContent,\n  DropdownMenuItem,\n  DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { useChatVisibility } from \"@/hooks/use-chat-visibility\";\nimport { cn } from \"@/lib/utils\";\nimport {\n  CheckCircleFillIcon,\n  ChevronDownIcon,\n  GlobeIcon,\n  LockIcon,\n} from \"./icons\";\n\nexport type VisibilityType = \"private\" | \"public\";\n\nconst visibilities: Array<{\n  id: VisibilityType;\n  label: string;\n  description: string;\n  icon: ReactNode;\n}> = [\n  {\n    id: \"private\",\n    label: \"Private\",\n    description: \"Only you can access this chat\",\n    icon: <LockIcon />,\n  },\n  {\n    id: \"public\",\n    label: \"Public\",\n    description: \"Anyone with the link can access this chat\",\n    icon: <GlobeIcon />,\n  },\n];\n\nexport function VisibilitySelector({\n  chatId,\n  className,\n  selectedVisibilityType,\n}: {\n  chatId: string;\n  selectedVisibilityType: VisibilityType;\n} & React.ComponentProps<typeof Button>) {\n  const [open, setOpen] = useState(false);\n\n  const { visibilityType, setVisibilityType } = useChatVisibility({\n    chatId,\n    initialVisibilityType: selectedVisibilityType,\n  });\n\n  const selectedVisibility = useMemo(\n    () => visibilities.find((visibility) => visibility.id === visibilityType),\n    [visibilityType]\n  );\n\n  return (\n    <DropdownMenu onOpenChange={setOpen} open={open}>\n      <DropdownMenuTrigger\n        asChild\n        className={cn(\n          \"w-fit data-[state=open]:bg-accent data-[state=open]:text-accent-foreground\",\n          className\n        )}\n      >\n        <Button\n          className=\"hidden h-8 md:flex md:h-fit md:px-2\"\n          data-testid=\"visibility-selector\"\n          variant=\"outline\"\n        >\n          {selectedVisibility?.icon}\n          <span className=\"md:sr-only\">{selectedVisibility?.label}</span>\n          <ChevronDownIcon />\n        </Button>\n      </DropdownMenuTrigger>\n\n      <DropdownMenuContent align=\"start\" className=\"min-w-[300px]\">\n        {visibilities.map((visibility) => (\n          <DropdownMenuItem\n            className=\"group/item flex flex-row items-center justify-between gap-4\"\n            data-active={visibility.id === visibilityType}\n            data-testid={`visibility-selector-item-${visibility.id}`}\n            key={visibility.id}\n            onSelect={() => {\n              setVisibilityType(visibility.id);\n              setOpen(false);\n            }}\n          >\n            <div className=\"flex flex-col items-start gap-1\">\n              {visibility.label}\n              {visibility.description && (\n                <div className=\"text-muted-foreground text-xs\">\n                  {visibility.description}\n                </div>\n              )}\n            </div>\n            <div className=\"text-foreground opacity-0 group-data-[active=true]/item:opacity-100 dark:text-foreground\">\n              <CheckCircleFillIcon />\n            </div>\n          </DropdownMenuItem>\n        ))}\n      </DropdownMenuContent>\n    </DropdownMenu>\n  );\n}\n"
  },
  {
    "path": "components/weather.tsx",
    "content": "\"use client\";\n\nimport cx from \"classnames\";\nimport { format, isWithinInterval } from \"date-fns\";\nimport { useEffect, useState } from \"react\";\n\nconst SunIcon = ({ size = 40 }: { size?: number }) => (\n  <svg fill=\"none\" height={size} viewBox=\"0 0 24 24\" width={size}>\n    <circle cx=\"12\" cy=\"12\" fill=\"currentColor\" r=\"5\" />\n    <line stroke=\"currentColor\" strokeWidth=\"2\" x1=\"12\" x2=\"12\" y1=\"1\" y2=\"3\" />\n    <line\n      stroke=\"currentColor\"\n      strokeWidth=\"2\"\n      x1=\"12\"\n      x2=\"12\"\n      y1=\"21\"\n      y2=\"23\"\n    />\n    <line\n      stroke=\"currentColor\"\n      strokeWidth=\"2\"\n      x1=\"4.22\"\n      x2=\"5.64\"\n      y1=\"4.22\"\n      y2=\"5.64\"\n    />\n    <line\n      stroke=\"currentColor\"\n      strokeWidth=\"2\"\n      x1=\"18.36\"\n      x2=\"19.78\"\n      y1=\"18.36\"\n      y2=\"19.78\"\n    />\n    <line stroke=\"currentColor\" strokeWidth=\"2\" x1=\"1\" x2=\"3\" y1=\"12\" y2=\"12\" />\n    <line\n      stroke=\"currentColor\"\n      strokeWidth=\"2\"\n      x1=\"21\"\n      x2=\"23\"\n      y1=\"12\"\n      y2=\"12\"\n    />\n    <line\n      stroke=\"currentColor\"\n      strokeWidth=\"2\"\n      x1=\"4.22\"\n      x2=\"5.64\"\n      y1=\"19.78\"\n      y2=\"18.36\"\n    />\n    <line\n      stroke=\"currentColor\"\n      strokeWidth=\"2\"\n      x1=\"18.36\"\n      x2=\"19.78\"\n      y1=\"5.64\"\n      y2=\"4.22\"\n    />\n  </svg>\n);\n\nconst MoonIcon = ({ size = 40 }: { size?: number }) => (\n  <svg fill=\"none\" height={size} viewBox=\"0 0 24 24\" width={size}>\n    <path\n      d=\"M21 12.79A9 9 0 1 1 11.21 3A7 7 0 0 0 21 12.79z\"\n      fill=\"currentColor\"\n    />\n  </svg>\n);\n\nconst CloudIcon = ({ size = 24 }: { size?: number }) => (\n  <svg fill=\"none\" height={size} viewBox=\"0 0 24 24\" width={size}>\n    <path\n      d=\"M18 10h-1.26A8 8 0 1 0 9 20h9a5 5 0 0 0 0-10z\"\n      fill=\"none\"\n      stroke=\"currentColor\"\n      strokeWidth=\"2\"\n    />\n  </svg>\n);\n\ntype WeatherAtLocation = {\n  latitude: number;\n  longitude: number;\n  generationtime_ms: number;\n  utc_offset_seconds: number;\n  timezone: string;\n  timezone_abbreviation: string;\n  elevation: number;\n  cityName?: string;\n  current_units: {\n    time: string;\n    interval: string;\n    temperature_2m: string;\n  };\n  current: {\n    time: string;\n    interval: number;\n    temperature_2m: number;\n  };\n  hourly_units: {\n    time: string;\n    temperature_2m: string;\n  };\n  hourly: {\n    time: string[];\n    temperature_2m: number[];\n  };\n  daily_units: {\n    time: string;\n    sunrise: string;\n    sunset: string;\n  };\n  daily: {\n    time: string[];\n    sunrise: string[];\n    sunset: string[];\n  };\n};\n\nconst SAMPLE = {\n  latitude: 37.763_283,\n  longitude: -122.412_86,\n  generationtime_ms: 0.027_894_973_754_882_812,\n  utc_offset_seconds: 0,\n  timezone: \"GMT\",\n  timezone_abbreviation: \"GMT\",\n  elevation: 18,\n  current_units: { time: \"iso8601\", interval: \"seconds\", temperature_2m: \"°C\" },\n  current: { time: \"2024-10-07T19:30\", interval: 900, temperature_2m: 29.3 },\n  hourly_units: { time: \"iso8601\", temperature_2m: \"°C\" },\n  hourly: {\n    time: [\n      \"2024-10-07T00:00\",\n      \"2024-10-07T01:00\",\n      \"2024-10-07T02:00\",\n      \"2024-10-07T03:00\",\n      \"2024-10-07T04:00\",\n      \"2024-10-07T05:00\",\n      \"2024-10-07T06:00\",\n      \"2024-10-07T07:00\",\n      \"2024-10-07T08:00\",\n      \"2024-10-07T09:00\",\n      \"2024-10-07T10:00\",\n      \"2024-10-07T11:00\",\n      \"2024-10-07T12:00\",\n      \"2024-10-07T13:00\",\n      \"2024-10-07T14:00\",\n      \"2024-10-07T15:00\",\n      \"2024-10-07T16:00\",\n      \"2024-10-07T17:00\",\n      \"2024-10-07T18:00\",\n      \"2024-10-07T19:00\",\n      \"2024-10-07T20:00\",\n      \"2024-10-07T21:00\",\n      \"2024-10-07T22:00\",\n      \"2024-10-07T23:00\",\n      \"2024-10-08T00:00\",\n      \"2024-10-08T01:00\",\n      \"2024-10-08T02:00\",\n      \"2024-10-08T03:00\",\n      \"2024-10-08T04:00\",\n      \"2024-10-08T05:00\",\n      \"2024-10-08T06:00\",\n      \"2024-10-08T07:00\",\n      \"2024-10-08T08:00\",\n      \"2024-10-08T09:00\",\n      \"2024-10-08T10:00\",\n      \"2024-10-08T11:00\",\n      \"2024-10-08T12:00\",\n      \"2024-10-08T13:00\",\n      \"2024-10-08T14:00\",\n      \"2024-10-08T15:00\",\n      \"2024-10-08T16:00\",\n      \"2024-10-08T17:00\",\n      \"2024-10-08T18:00\",\n      \"2024-10-08T19:00\",\n      \"2024-10-08T20:00\",\n      \"2024-10-08T21:00\",\n      \"2024-10-08T22:00\",\n      \"2024-10-08T23:00\",\n      \"2024-10-09T00:00\",\n      \"2024-10-09T01:00\",\n      \"2024-10-09T02:00\",\n      \"2024-10-09T03:00\",\n      \"2024-10-09T04:00\",\n      \"2024-10-09T05:00\",\n      \"2024-10-09T06:00\",\n      \"2024-10-09T07:00\",\n      \"2024-10-09T08:00\",\n      \"2024-10-09T09:00\",\n      \"2024-10-09T10:00\",\n      \"2024-10-09T11:00\",\n      \"2024-10-09T12:00\",\n      \"2024-10-09T13:00\",\n      \"2024-10-09T14:00\",\n      \"2024-10-09T15:00\",\n      \"2024-10-09T16:00\",\n      \"2024-10-09T17:00\",\n      \"2024-10-09T18:00\",\n      \"2024-10-09T19:00\",\n      \"2024-10-09T20:00\",\n      \"2024-10-09T21:00\",\n      \"2024-10-09T22:00\",\n      \"2024-10-09T23:00\",\n      \"2024-10-10T00:00\",\n      \"2024-10-10T01:00\",\n      \"2024-10-10T02:00\",\n      \"2024-10-10T03:00\",\n      \"2024-10-10T04:00\",\n      \"2024-10-10T05:00\",\n      \"2024-10-10T06:00\",\n      \"2024-10-10T07:00\",\n      \"2024-10-10T08:00\",\n      \"2024-10-10T09:00\",\n      \"2024-10-10T10:00\",\n      \"2024-10-10T11:00\",\n      \"2024-10-10T12:00\",\n      \"2024-10-10T13:00\",\n      \"2024-10-10T14:00\",\n      \"2024-10-10T15:00\",\n      \"2024-10-10T16:00\",\n      \"2024-10-10T17:00\",\n      \"2024-10-10T18:00\",\n      \"2024-10-10T19:00\",\n      \"2024-10-10T20:00\",\n      \"2024-10-10T21:00\",\n      \"2024-10-10T22:00\",\n      \"2024-10-10T23:00\",\n      \"2024-10-11T00:00\",\n      \"2024-10-11T01:00\",\n      \"2024-10-11T02:00\",\n      \"2024-10-11T03:00\",\n    ],\n    temperature_2m: [\n      36.6, 32.8, 29.5, 28.6, 29.2, 28.2, 27.5, 26.6, 26.5, 26, 25, 23.5, 23.9,\n      24.2, 22.9, 21, 24, 28.1, 31.4, 33.9, 32.1, 28.9, 26.9, 25.2, 23, 21.1,\n      19.6, 18.6, 17.7, 16.8, 16.2, 15.5, 14.9, 14.4, 14.2, 13.7, 13.3, 12.9,\n      12.5, 13.5, 15.8, 17.7, 19.6, 21, 21.9, 22.3, 22, 20.7, 18.9, 17.9, 17.3,\n      17, 16.7, 16.2, 15.6, 15.2, 15, 15, 15.1, 14.8, 14.8, 14.9, 14.7, 14.8,\n      15.3, 16.2, 17.9, 19.6, 20.5, 21.6, 21, 20.7, 19.3, 18.7, 18.4, 17.9,\n      17.3, 17, 17, 16.8, 16.4, 16.2, 16, 15.8, 15.7, 15.4, 15.4, 16.1, 16.7,\n      17, 18.6, 19, 19.5, 19.4, 18.5, 17.9, 17.5, 16.7, 16.3, 16.1,\n    ],\n  },\n  daily_units: {\n    time: \"iso8601\",\n    sunrise: \"iso8601\",\n    sunset: \"iso8601\",\n  },\n  daily: {\n    time: [\n      \"2024-10-07\",\n      \"2024-10-08\",\n      \"2024-10-09\",\n      \"2024-10-10\",\n      \"2024-10-11\",\n    ],\n    sunrise: [\n      \"2024-10-07T07:15\",\n      \"2024-10-08T07:16\",\n      \"2024-10-09T07:17\",\n      \"2024-10-10T07:18\",\n      \"2024-10-11T07:19\",\n    ],\n    sunset: [\n      \"2024-10-07T19:00\",\n      \"2024-10-08T18:58\",\n      \"2024-10-09T18:57\",\n      \"2024-10-10T18:55\",\n      \"2024-10-11T18:54\",\n    ],\n  },\n};\n\nfunction n(num: number): number {\n  return Math.ceil(num);\n}\n\nexport function Weather({\n  weatherAtLocation = SAMPLE,\n}: {\n  weatherAtLocation?: WeatherAtLocation;\n}) {\n  const currentHigh = Math.max(\n    ...weatherAtLocation.hourly.temperature_2m.slice(0, 24)\n  );\n  const currentLow = Math.min(\n    ...weatherAtLocation.hourly.temperature_2m.slice(0, 24)\n  );\n\n  const isDay = isWithinInterval(new Date(weatherAtLocation.current.time), {\n    start: new Date(weatherAtLocation.daily.sunrise[0]),\n    end: new Date(weatherAtLocation.daily.sunset[0]),\n  });\n\n  const [isMobile, setIsMobile] = useState(false);\n\n  useEffect(() => {\n    const handleResize = () => {\n      setIsMobile(window.innerWidth < 768);\n    };\n\n    handleResize();\n    window.addEventListener(\"resize\", handleResize);\n\n    return () => window.removeEventListener(\"resize\", handleResize);\n  }, []);\n\n  const hoursToShow = isMobile ? 5 : 6;\n\n  const currentTimeIndex = weatherAtLocation.hourly.time.findIndex(\n    (time) => new Date(time) >= new Date(weatherAtLocation.current.time)\n  );\n\n  const displayTimes = weatherAtLocation.hourly.time.slice(\n    currentTimeIndex,\n    currentTimeIndex + hoursToShow\n  );\n  const displayTemperatures = weatherAtLocation.hourly.temperature_2m.slice(\n    currentTimeIndex,\n    currentTimeIndex + hoursToShow\n  );\n\n  const location =\n    weatherAtLocation.cityName ||\n    `${weatherAtLocation.latitude?.toFixed(1)}°, ${weatherAtLocation.longitude?.toFixed(1)}°`;\n\n  return (\n    <div\n      className={cx(\n        \"relative flex w-full flex-col gap-3 overflow-hidden rounded-2xl p-4 shadow-lg backdrop-blur-sm\",\n        {\n          \"bg-gradient-to-br from-sky-400 via-blue-500 to-blue-600\": isDay,\n        },\n        {\n          \"bg-gradient-to-br from-indigo-900 via-purple-900 to-slate-900\":\n            !isDay,\n        }\n      )}\n    >\n      <div className=\"absolute inset-0 bg-white/10 backdrop-blur-sm\" />\n\n      <div className=\"relative z-10\">\n        <div className=\"mb-2 flex items-center justify-between\">\n          <div className=\"font-medium text-white/80 text-xs\">{location}</div>\n          <div className=\"text-white/60 text-xs\">\n            {format(new Date(weatherAtLocation.current.time), \"MMM d, h:mm a\")}\n          </div>\n        </div>\n\n        <div className=\"mb-3 flex items-center justify-between\">\n          <div className=\"flex items-center gap-3\">\n            <div\n              className={cx(\"text-white/90\", {\n                \"text-yellow-200\": isDay,\n                \"text-blue-200\": !isDay,\n              })}\n            >\n              {isDay ? <SunIcon size={32} /> : <MoonIcon size={32} />}\n            </div>\n            <div className=\"font-light text-3xl text-white\">\n              {n(weatherAtLocation.current.temperature_2m)}\n              <span className=\"text-lg text-white/80\">\n                {weatherAtLocation.current_units.temperature_2m}\n              </span>\n            </div>\n          </div>\n\n          <div className=\"text-right\">\n            <div className=\"font-medium text-white/90 text-xs\">\n              H: {n(currentHigh)}°\n            </div>\n            <div className=\"text-white/70 text-xs\">L: {n(currentLow)}°</div>\n          </div>\n        </div>\n\n        <div className=\"rounded-xl bg-white/10 p-3 backdrop-blur-sm\">\n          <div className=\"mb-2 font-medium text-white/80 text-xs\">\n            Hourly Forecast\n          </div>\n          <div className=\"flex justify-between gap-1\">\n            {displayTimes.map((time, index) => {\n              const hourTime = new Date(time);\n              const isCurrentHour =\n                hourTime.getHours() === new Date().getHours();\n\n              return (\n                <div\n                  className={cx(\n                    \"flex min-w-0 flex-1 flex-col items-center gap-1 rounded-md px-1 py-1.5\",\n                    {\n                      \"bg-white/20\": isCurrentHour,\n                    }\n                  )}\n                  key={time}\n                >\n                  <div className=\"font-medium text-white/70 text-xs\">\n                    {index === 0 ? \"Now\" : format(hourTime, \"ha\")}\n                  </div>\n\n                  <div\n                    className={cx(\"text-white/60\", {\n                      \"text-yellow-200\": isDay,\n                      \"text-blue-200\": !isDay,\n                    })}\n                  >\n                    <CloudIcon size={16} />\n                  </div>\n\n                  <div className=\"font-medium text-white text-xs\">\n                    {n(displayTemperatures[index])}°\n                  </div>\n                </div>\n              );\n            })}\n          </div>\n        </div>\n\n        <div className=\"mt-2 flex justify-between text-white/60 text-xs\">\n          <div>\n            Sunrise:{\" \"}\n            {format(new Date(weatherAtLocation.daily.sunrise[0]), \"h:mm a\")}\n          </div>\n          <div>\n            Sunset:{\" \"}\n            {format(new Date(weatherAtLocation.daily.sunset[0]), \"h:mm a\")}\n          </div>\n        </div>\n      </div>\n    </div>\n  );\n}\n"
  },
  {
    "path": "components.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema.json\",\n  \"style\": \"default\",\n  \"rsc\": true,\n  \"tsx\": true,\n  \"tailwind\": {\n    \"config\": \"\",\n    \"css\": \"app/globals.css\",\n    \"baseColor\": \"zinc\",\n    \"cssVariables\": true,\n    \"prefix\": \"\"\n  },\n  \"aliases\": {\n    \"components\": \"@/components\",\n    \"utils\": \"@/lib/utils\",\n    \"ui\": \"@/components/ui\",\n    \"lib\": \"@/lib\",\n    \"hooks\": \"@/hooks\"\n  }\n}\n"
  },
  {
    "path": "drizzle.config.ts",
    "content": "import { config } from \"dotenv\";\nimport { defineConfig } from \"drizzle-kit\";\n\nconfig({\n  path: \".env.local\",\n});\n\nexport default defineConfig({\n  schema: \"./lib/db/schema.ts\",\n  out: \"./lib/db/migrations\",\n  dialect: \"postgresql\",\n  dbCredentials: {\n    // biome-ignore lint: Forbidden non-null assertion.\n    url: process.env.POSTGRES_URL!,\n  },\n});\n"
  },
  {
    "path": "hooks/use-artifact.ts",
    "content": "\"use client\";\n\nimport { useCallback, useMemo } from \"react\";\nimport useSWR from \"swr\";\nimport type { UIArtifact } from \"@/components/artifact\";\n\nexport const initialArtifactData: UIArtifact = {\n  documentId: \"init\",\n  content: \"\",\n  kind: \"text\",\n  title: \"\",\n  status: \"idle\",\n  isVisible: false,\n  boundingBox: {\n    top: 0,\n    left: 0,\n    width: 0,\n    height: 0,\n  },\n};\n\ntype Selector<T> = (state: UIArtifact) => T;\n\nexport function useArtifactSelector<Selected>(selector: Selector<Selected>) {\n  const { data: localArtifact } = useSWR<UIArtifact>(\"artifact\", null, {\n    fallbackData: initialArtifactData,\n  });\n\n  const selectedValue = useMemo(() => {\n    if (!localArtifact) {\n      return selector(initialArtifactData);\n    }\n    return selector(localArtifact);\n  }, [localArtifact, selector]);\n\n  return selectedValue;\n}\n\nexport function useArtifact() {\n  const { data: localArtifact, mutate: setLocalArtifact } = useSWR<UIArtifact>(\n    \"artifact\",\n    null,\n    {\n      fallbackData: initialArtifactData,\n    }\n  );\n\n  const artifact = useMemo(() => {\n    if (!localArtifact) {\n      return initialArtifactData;\n    }\n    return localArtifact;\n  }, [localArtifact]);\n\n  const setArtifact = useCallback(\n    (updaterFn: UIArtifact | ((currentArtifact: UIArtifact) => UIArtifact)) => {\n      setLocalArtifact((currentArtifact) => {\n        const artifactToUpdate = currentArtifact || initialArtifactData;\n\n        if (typeof updaterFn === \"function\") {\n          return updaterFn(artifactToUpdate);\n        }\n\n        return updaterFn;\n      });\n    },\n    [setLocalArtifact]\n  );\n\n  const { data: localArtifactMetadata, mutate: setLocalArtifactMetadata } =\n    useSWR<any>(\n      () =>\n        artifact.documentId ? `artifact-metadata-${artifact.documentId}` : null,\n      null,\n      {\n        fallbackData: null,\n      }\n    );\n\n  return useMemo(\n    () => ({\n      artifact,\n      setArtifact,\n      metadata: localArtifactMetadata,\n      setMetadata: setLocalArtifactMetadata,\n    }),\n    [artifact, setArtifact, localArtifactMetadata, setLocalArtifactMetadata]\n  );\n}\n"
  },
  {
    "path": "hooks/use-auto-resume.ts",
    "content": "\"use client\";\n\nimport type { UseChatHelpers } from \"@ai-sdk/react\";\nimport { useEffect } from \"react\";\nimport { useDataStream } from \"@/components/data-stream-provider\";\nimport type { ChatMessage } from \"@/lib/types\";\n\nexport type UseAutoResumeParams = {\n  autoResume: boolean;\n  initialMessages: ChatMessage[];\n  resumeStream: UseChatHelpers<ChatMessage>[\"resumeStream\"];\n  setMessages: UseChatHelpers<ChatMessage>[\"setMessages\"];\n};\n\nexport function useAutoResume({\n  autoResume,\n  initialMessages,\n  resumeStream,\n  setMessages,\n}: UseAutoResumeParams) {\n  const { dataStream } = useDataStream();\n\n  useEffect(() => {\n    if (!autoResume) {\n      return;\n    }\n\n    const mostRecentMessage = initialMessages.at(-1);\n\n    if (mostRecentMessage?.role === \"user\") {\n      resumeStream();\n    }\n\n    // we intentionally run this once\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [autoResume, initialMessages.at, resumeStream]);\n\n  useEffect(() => {\n    if (!dataStream) {\n      return;\n    }\n    if (dataStream.length === 0) {\n      return;\n    }\n\n    const dataPart = dataStream[0];\n\n    if (dataPart.type === \"data-appendMessage\") {\n      const message = JSON.parse(dataPart.data);\n      setMessages([...initialMessages, message]);\n    }\n  }, [dataStream, initialMessages, setMessages]);\n}\n"
  },
  {
    "path": "hooks/use-chat-visibility.ts",
    "content": "\"use client\";\n\nimport { useMemo } from \"react\";\nimport useSWR, { useSWRConfig } from \"swr\";\nimport { unstable_serialize } from \"swr/infinite\";\nimport { updateChatVisibility } from \"@/app/(chat)/actions\";\nimport {\n  type ChatHistory,\n  getChatHistoryPaginationKey,\n} from \"@/components/sidebar-history\";\nimport type { VisibilityType } from \"@/components/visibility-selector\";\n\nexport function useChatVisibility({\n  chatId,\n  initialVisibilityType,\n}: {\n  chatId: string;\n  initialVisibilityType: VisibilityType;\n}) {\n  const { mutate, cache } = useSWRConfig();\n  const history: ChatHistory = cache.get(\"/api/history\")?.data;\n\n  const { data: localVisibility, mutate: setLocalVisibility } = useSWR(\n    `${chatId}-visibility`,\n    null,\n    {\n      fallbackData: initialVisibilityType,\n    }\n  );\n\n  const visibilityType = useMemo(() => {\n    if (!history) {\n      return localVisibility;\n    }\n    const chat = history.chats.find((currentChat) => currentChat.id === chatId);\n    if (!chat) {\n      return \"private\";\n    }\n    return chat.visibility;\n  }, [history, chatId, localVisibility]);\n\n  const setVisibilityType = (updatedVisibilityType: VisibilityType) => {\n    setLocalVisibility(updatedVisibilityType);\n    mutate(unstable_serialize(getChatHistoryPaginationKey));\n\n    updateChatVisibility({\n      chatId,\n      visibility: updatedVisibilityType,\n    });\n  };\n\n  return { visibilityType, setVisibilityType };\n}\n"
  },
  {
    "path": "hooks/use-messages.tsx",
    "content": "import type { UseChatHelpers } from \"@ai-sdk/react\";\nimport { useEffect, useState } from \"react\";\nimport type { ChatMessage } from \"@/lib/types\";\nimport { useScrollToBottom } from \"./use-scroll-to-bottom\";\n\nexport function useMessages({\n  status,\n}: {\n  status: UseChatHelpers<ChatMessage>[\"status\"];\n}) {\n  const {\n    containerRef,\n    endRef,\n    isAtBottom,\n    scrollToBottom,\n    onViewportEnter,\n    onViewportLeave,\n  } = useScrollToBottom();\n\n  const [hasSentMessage, setHasSentMessage] = useState(false);\n\n  useEffect(() => {\n    if (status === \"submitted\") {\n      setHasSentMessage(true);\n    }\n  }, [status]);\n\n  return {\n    containerRef,\n    endRef,\n    isAtBottom,\n    scrollToBottom,\n    onViewportEnter,\n    onViewportLeave,\n    hasSentMessage,\n  };\n}\n"
  },
  {
    "path": "hooks/use-mobile.ts",
    "content": "import * as React from \"react\"\n\nconst MOBILE_BREAKPOINT = 768\n\nexport function useIsMobile() {\n  const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined)\n\n  React.useEffect(() => {\n    const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`)\n    const onChange = () => {\n      setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)\n    }\n    mql.addEventListener(\"change\", onChange)\n    setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)\n    return () => mql.removeEventListener(\"change\", onChange)\n  }, [])\n\n  return !!isMobile\n}\n"
  },
  {
    "path": "hooks/use-scroll-to-bottom.tsx",
    "content": "import { useCallback, useEffect, useRef, useState } from \"react\";\n\nexport function useScrollToBottom() {\n  const containerRef = useRef<HTMLDivElement>(null);\n  const endRef = useRef<HTMLDivElement>(null);\n  const [isAtBottom, setIsAtBottom] = useState(true);\n  const isAtBottomRef = useRef(true);\n  const isUserScrollingRef = useRef(false);\n\n  // Keep ref in sync with state\n  useEffect(() => {\n    isAtBottomRef.current = isAtBottom;\n  }, [isAtBottom]);\n\n  const checkIfAtBottom = useCallback(() => {\n    if (!containerRef.current) {\n      return true;\n    }\n    const { scrollTop, scrollHeight, clientHeight } = containerRef.current;\n    return scrollTop + clientHeight >= scrollHeight - 100;\n  }, []);\n\n  const scrollToBottom = useCallback((behavior: ScrollBehavior = \"smooth\") => {\n    if (!containerRef.current) {\n      return;\n    }\n    containerRef.current.scrollTo({\n      top: containerRef.current.scrollHeight,\n      behavior,\n    });\n  }, []);\n\n  // Handle user scroll events\n  useEffect(() => {\n    const container = containerRef.current;\n    if (!container) {\n      return;\n    }\n\n    let scrollTimeout: ReturnType<typeof setTimeout>;\n\n    const handleScroll = () => {\n      // Mark as user scrolling\n      isUserScrollingRef.current = true;\n      clearTimeout(scrollTimeout);\n\n      // Update isAtBottom state\n      const atBottom = checkIfAtBottom();\n      setIsAtBottom(atBottom);\n      isAtBottomRef.current = atBottom;\n\n      // Reset user scrolling flag after scroll ends\n      scrollTimeout = setTimeout(() => {\n        isUserScrollingRef.current = false;\n      }, 150);\n    };\n\n    container.addEventListener(\"scroll\", handleScroll, { passive: true });\n    return () => {\n      container.removeEventListener(\"scroll\", handleScroll);\n      clearTimeout(scrollTimeout);\n    };\n  }, [checkIfAtBottom]);\n\n  // Auto-scroll when content changes\n  useEffect(() => {\n    const container = containerRef.current;\n    if (!container) {\n      return;\n    }\n\n    const scrollIfNeeded = () => {\n      // Only auto-scroll if user was at bottom and isn't actively scrolling\n      if (isAtBottomRef.current && !isUserScrollingRef.current) {\n        requestAnimationFrame(() => {\n          container.scrollTo({\n            top: container.scrollHeight,\n            behavior: \"instant\",\n          });\n          setIsAtBottom(true);\n          isAtBottomRef.current = true;\n        });\n      }\n    };\n\n    // Watch for DOM changes\n    const mutationObserver = new MutationObserver(scrollIfNeeded);\n    mutationObserver.observe(container, {\n      childList: true,\n      subtree: true,\n      characterData: true,\n    });\n\n    // Watch for size changes\n    const resizeObserver = new ResizeObserver(scrollIfNeeded);\n    resizeObserver.observe(container);\n\n    // Also observe children for size changes\n    for (const child of container.children) {\n      resizeObserver.observe(child);\n    }\n\n    return () => {\n      mutationObserver.disconnect();\n      resizeObserver.disconnect();\n    };\n  }, []);\n\n  function onViewportEnter() {\n    setIsAtBottom(true);\n    isAtBottomRef.current = true;\n  }\n\n  function onViewportLeave() {\n    setIsAtBottom(false);\n    isAtBottomRef.current = false;\n  }\n\n  return {\n    containerRef,\n    endRef,\n    isAtBottom,\n    scrollToBottom,\n    onViewportEnter,\n    onViewportLeave,\n  };\n}\n"
  },
  {
    "path": "instrumentation-client.ts",
    "content": "import { initBotId } from \"botid/client/core\";\n\ninitBotId({\n  protect: [\n    {\n      path: \"/api/chat\",\n      method: \"POST\",\n    },\n  ],\n});\n"
  },
  {
    "path": "instrumentation.ts",
    "content": "import { registerOTel } from \"@vercel/otel\";\n\nexport function register() {\n  registerOTel({ serviceName: \"chatbot\" });\n}\n"
  },
  {
    "path": "lib/ai/entitlements.ts",
    "content": "import type { UserType } from \"@/app/(auth)/auth\";\n\ntype Entitlements = {\n  maxMessagesPerHour: number;\n};\n\nexport const entitlementsByUserType: Record<UserType, Entitlements> = {\n  /*\n   * For users without an account\n   */\n  guest: {\n    maxMessagesPerHour: 10,\n  },\n\n  /*\n   * For users with an account\n   */\n  regular: {\n    maxMessagesPerHour: 10,\n  },\n\n  /*\n   * TODO: For users with an account and a paid membership\n   */\n};\n"
  },
  {
    "path": "lib/ai/models.mock.ts",
    "content": "import type { LanguageModel } from \"ai\";\n\nconst mockResponses: Record<string, string> = {\n  default: \"This is a mock response for testing.\",\n  weather: \"The weather in San Francisco is sunny and 72°F.\",\n  greeting: \"Hello! How can I help you today?\",\n};\n\nconst mockUsage = {\n  inputTokens: { total: 10, noCache: 10, cacheRead: 0, cacheWrite: 0 },\n  outputTokens: { total: 20, text: 20, reasoning: 0 },\n};\n\nfunction getResponseForPrompt(prompt: unknown): string {\n  const promptStr = JSON.stringify(prompt).toLowerCase();\n\n  if (promptStr.includes(\"weather\") || promptStr.includes(\"temperature\")) {\n    return mockResponses.weather;\n  }\n  if (\n    promptStr.includes(\"hello\") ||\n    promptStr.includes(\"hi\") ||\n    promptStr.includes(\"hey\")\n  ) {\n    return mockResponses.greeting;\n  }\n\n  return mockResponses.default;\n}\n\nconst createMockModel = (): LanguageModel => {\n  return {\n    specificationVersion: \"v3\",\n    provider: \"mock\",\n    modelId: \"mock-model\",\n    defaultObjectGenerationMode: \"tool\",\n    supportedUrls: {},\n    doGenerate: async ({ prompt }: { prompt: unknown }) => ({\n      finishReason: \"stop\",\n      usage: mockUsage,\n      content: [{ type: \"text\", text: getResponseForPrompt(prompt) }],\n      warnings: [],\n    }),\n    doStream: ({ prompt }: { prompt: unknown }) => {\n      const response = getResponseForPrompt(prompt);\n      const words = response.split(\" \");\n\n      return {\n        stream: new ReadableStream({\n          async start(controller) {\n            controller.enqueue({ type: \"text-start\", id: \"t1\" });\n            for (const word of words) {\n              controller.enqueue({\n                type: \"text-delta\",\n                id: \"t1\",\n                delta: `${word} `,\n              });\n              await new Promise((resolve) => {\n                setTimeout(resolve, 10);\n              });\n            }\n            controller.enqueue({ type: \"text-end\", id: \"t1\" });\n            controller.enqueue({\n              type: \"finish\",\n              finishReason: \"stop\",\n              usage: mockUsage,\n            });\n            controller.close();\n          },\n        }),\n      };\n    },\n  } as unknown as LanguageModel;\n};\n\nconst createMockReasoningModel = (): LanguageModel => {\n  return {\n    specificationVersion: \"v3\",\n    provider: \"mock\",\n    modelId: \"mock-reasoning-model\",\n    defaultObjectGenerationMode: \"tool\",\n    supportedUrls: {},\n    doGenerate: async () => ({\n      finishReason: \"stop\",\n      usage: mockUsage,\n      content: [{ type: \"text\", text: \"This is a reasoned response.\" }],\n      reasoning: [\n        { type: \"text\", text: \"Let me think through this step by step...\" },\n      ],\n      warnings: [],\n    }),\n    doStream: () => ({\n      stream: new ReadableStream({\n        async start(controller) {\n          controller.enqueue({ type: \"reasoning-start\", id: \"r1\" });\n          controller.enqueue({\n            type: \"reasoning-delta\",\n            id: \"r1\",\n            delta: \"Let me think through this step by step... \",\n          });\n          controller.enqueue({ type: \"reasoning-end\", id: \"r1\" });\n          await new Promise((resolve) => {\n            setTimeout(resolve, 10);\n          });\n          controller.enqueue({ type: \"text-start\", id: \"t1\" });\n          controller.enqueue({\n            type: \"text-delta\",\n            id: \"t1\",\n            delta: \"This is a reasoned response.\",\n          });\n          controller.enqueue({ type: \"text-end\", id: \"t1\" });\n          controller.enqueue({\n            type: \"finish\",\n            finishReason: \"stop\",\n            usage: mockUsage,\n          });\n          controller.close();\n        },\n      }),\n    }),\n  } as unknown as LanguageModel;\n};\n\nconst createMockTitleModel = (): LanguageModel => {\n  return {\n    specificationVersion: \"v3\",\n    provider: \"mock\",\n    modelId: \"mock-title-model\",\n    defaultObjectGenerationMode: \"tool\",\n    supportedUrls: {},\n    doGenerate: async () => ({\n      finishReason: \"stop\",\n      usage: {\n        inputTokens: { total: 5, noCache: 5, cacheRead: 0, cacheWrite: 0 },\n        outputTokens: { total: 5, text: 5, reasoning: 0 },\n      },\n      content: [{ type: \"text\", text: \"Test Conversation\" }],\n      warnings: [],\n    }),\n    doStream: () => ({\n      stream: new ReadableStream({\n        start(controller) {\n          controller.enqueue({ type: \"text-start\", id: \"t1\" });\n          controller.enqueue({\n            type: \"text-delta\",\n            id: \"t1\",\n            delta: \"Test Conversation\",\n          });\n          controller.enqueue({ type: \"text-end\", id: \"t1\" });\n          controller.enqueue({\n            type: \"finish\",\n            finishReason: \"stop\",\n            usage: {\n              inputTokens: {\n                total: 5,\n                noCache: 5,\n                cacheRead: 0,\n                cacheWrite: 0,\n              },\n              outputTokens: { total: 5, text: 5, reasoning: 0 },\n            },\n          });\n          controller.close();\n        },\n      }),\n    }),\n  } as unknown as LanguageModel;\n};\n\nexport const chatModel = createMockModel();\nexport const reasoningModel = createMockReasoningModel();\nexport const titleModel = createMockTitleModel();\nexport const artifactModel = createMockModel();\n"
  },
  {
    "path": "lib/ai/models.test.ts",
    "content": "import { simulateReadableStream } from \"ai\";\nimport { MockLanguageModelV3 } from \"ai/test\";\nimport { getResponseChunksByPrompt } from \"@/tests/prompts/utils\";\n\nconst mockUsage = {\n  inputTokens: { total: 10, noCache: 10, cacheRead: 0, cacheWrite: 0 },\n  outputTokens: { total: 20, text: 20, reasoning: 0 },\n};\n\nexport const chatModel = new MockLanguageModelV3({\n  doGenerate: async () => ({\n    finishReason: \"stop\",\n    usage: mockUsage,\n    content: [{ type: \"text\", text: \"Hello, world!\" }],\n    warnings: [],\n  }),\n  doStream: async ({ prompt }) => ({\n    stream: simulateReadableStream({\n      chunkDelayInMs: 500,\n      initialDelayInMs: 1000,\n      chunks: getResponseChunksByPrompt(prompt),\n    }),\n  }),\n});\n\nexport const reasoningModel = new MockLanguageModelV3({\n  doGenerate: async () => ({\n    finishReason: \"stop\",\n    usage: mockUsage,\n    content: [{ type: \"text\", text: \"Hello, world!\" }],\n    warnings: [],\n  }),\n  doStream: async ({ prompt }) => ({\n    stream: simulateReadableStream({\n      chunkDelayInMs: 500,\n      initialDelayInMs: 1000,\n      chunks: getResponseChunksByPrompt(prompt, true),\n    }),\n  }),\n});\n\nexport const titleModel = new MockLanguageModelV3({\n  doGenerate: async () => ({\n    finishReason: \"stop\",\n    usage: mockUsage,\n    content: [{ type: \"text\", text: \"This is a test title\" }],\n    warnings: [],\n  }),\n  doStream: async () => ({\n    stream: simulateReadableStream({\n      chunkDelayInMs: 500,\n      initialDelayInMs: 1000,\n      chunks: [\n        { id: \"1\", type: \"text-start\" },\n        { id: \"1\", type: \"text-delta\", delta: \"This is a test title\" },\n        { id: \"1\", type: \"text-end\" },\n        {\n          type: \"finish\",\n          finishReason: \"stop\",\n          usage: mockUsage,\n        },\n      ],\n    }),\n  }),\n});\n\nexport const artifactModel = new MockLanguageModelV3({\n  doGenerate: async () => ({\n    finishReason: \"stop\",\n    usage: mockUsage,\n    content: [{ type: \"text\", text: \"Hello, world!\" }],\n    warnings: [],\n  }),\n  doStream: async ({ prompt }) => ({\n    stream: simulateReadableStream({\n      chunkDelayInMs: 50,\n      initialDelayInMs: 100,\n      chunks: getResponseChunksByPrompt(prompt),\n    }),\n  }),\n});\n"
  },
  {
    "path": "lib/ai/models.ts",
    "content": "// Curated list of top models from Vercel AI Gateway\nexport const DEFAULT_CHAT_MODEL = \"openai/gpt-4.1-mini\";\n\nexport type ChatModel = {\n  id: string;\n  name: string;\n  provider: string;\n  description: string;\n};\n\nexport const chatModels: ChatModel[] = [\n  // Anthropic\n  {\n    id: \"anthropic/claude-haiku-4.5\",\n    name: \"Claude Haiku 4.5\",\n    provider: \"anthropic\",\n    description: \"Fast and affordable, great for everyday tasks\",\n  },\n  // OpenAI\n  {\n    id: \"openai/gpt-4.1-mini\",\n    name: \"GPT-4.1 Mini\",\n    provider: \"openai\",\n    description: \"Fast and cost-effective for simple tasks\",\n  },\n  {\n    id: \"openai/gpt-5-mini\",\n    name: \"GPT-5 Mini\",\n    provider: \"openai\",\n    description: \"Most capable OpenAI model\",\n  },\n  // Google\n  {\n    id: \"google/gemini-2.5-flash-lite\",\n    name: \"Gemini 2.5 Flash Lite\",\n    provider: \"google\",\n    description: \"Ultra fast and affordable\",\n  },\n  {\n    id: \"google/gemini-3-pro-preview\",\n    name: \"Gemini 3 Pro\",\n    provider: \"google\",\n    description: \"Most capable Google model\",\n  },\n  // xAI\n  {\n    id: \"xai/grok-4.1-fast-non-reasoning\",\n    name: \"Grok 4.1 Fast\",\n    provider: \"xai\",\n    description: \"Fast with 30K context\",\n  },\n  // Reasoning models (extended thinking)\n  {\n    id: \"anthropic/claude-3.7-sonnet-thinking\",\n    name: \"Claude 3.7 Sonnet\",\n    provider: \"reasoning\",\n    description: \"Extended thinking for complex problems\",\n  },\n  {\n    id: \"xai/grok-code-fast-1-thinking\",\n    name: \"Grok Code Fast\",\n    provider: \"reasoning\",\n    description: \"Reasoning optimized for code\",\n  },\n];\n\n// Group models by provider for UI\nexport const allowedModelIds = new Set(chatModels.map((m) => m.id));\n\nexport const modelsByProvider = chatModels.reduce(\n  (acc, model) => {\n    if (!acc[model.provider]) {\n      acc[model.provider] = [];\n    }\n    acc[model.provider].push(model);\n    return acc;\n  },\n  {} as Record<string, ChatModel[]>\n);\n"
  },
  {
    "path": "lib/ai/prompts.ts",
    "content": "import type { Geo } from \"@vercel/functions\";\nimport type { ArtifactKind } from \"@/components/artifact\";\n\nexport const artifactsPrompt = `\nArtifacts is a special user interface mode that helps users with writing, editing, and other content creation tasks. When artifact is open, it is on the right side of the screen, while the conversation is on the left side. When creating or updating documents, changes are reflected in real-time on the artifacts and visible to the user.\n\nWhen asked to write code, always use artifacts. When writing code, specify the language in the backticks, e.g. \\`\\`\\`python\\`code here\\`\\`\\`. The default language is Python. Other languages are not yet supported, so let the user know if they request a different language.\n\nDO NOT UPDATE DOCUMENTS IMMEDIATELY AFTER CREATING THEM. WAIT FOR USER FEEDBACK OR REQUEST TO UPDATE IT.\n\nThis is a guide for using artifacts tools: \\`createDocument\\` and \\`updateDocument\\`, which render content on a artifacts beside the conversation.\n\n**When to use \\`createDocument\\`:**\n- For substantial content (>10 lines) or code\n- For content users will likely save/reuse (emails, code, essays, etc.)\n- When explicitly requested to create a document\n- For when content contains a single code snippet\n\n**When NOT to use \\`createDocument\\`:**\n- For informational/explanatory content\n- For conversational responses\n- When asked to keep it in chat\n\n**Using \\`updateDocument\\`:**\n- Default to full document rewrites for major changes\n- Use targeted updates only for specific, isolated changes\n- Follow user instructions for which parts to modify\n\n**When NOT to use \\`updateDocument\\`:**\n- Immediately after creating a document\n\nDo not update document right after creating it. Wait for user feedback or request to update it.\n\n**Using \\`requestSuggestions\\`:**\n- ONLY use when the user explicitly asks for suggestions on an existing document\n- Requires a valid document ID from a previously created document\n- Never use for general questions or information requests\n`;\n\nexport const regularPrompt = `You are a friendly assistant! Keep your responses concise and helpful.\n\nWhen asked to write, create, or help with something, just do it directly. Don't ask clarifying questions unless absolutely necessary - make reasonable assumptions and proceed with the task.`;\n\nexport type RequestHints = {\n  latitude: Geo[\"latitude\"];\n  longitude: Geo[\"longitude\"];\n  city: Geo[\"city\"];\n  country: Geo[\"country\"];\n};\n\nexport const getRequestPromptFromHints = (requestHints: RequestHints) => `\\\nAbout the origin of user's request:\n- lat: ${requestHints.latitude}\n- lon: ${requestHints.longitude}\n- city: ${requestHints.city}\n- country: ${requestHints.country}\n`;\n\nexport const systemPrompt = ({\n  selectedChatModel,\n  requestHints,\n}: {\n  selectedChatModel: string;\n  requestHints: RequestHints;\n}) => {\n  const requestPrompt = getRequestPromptFromHints(requestHints);\n\n  // reasoning models don't need artifacts prompt (they can't use tools)\n  if (\n    selectedChatModel.includes(\"reasoning\") ||\n    selectedChatModel.includes(\"thinking\")\n  ) {\n    return `${regularPrompt}\\n\\n${requestPrompt}`;\n  }\n\n  return `${regularPrompt}\\n\\n${requestPrompt}\\n\\n${artifactsPrompt}`;\n};\n\nexport const codePrompt = `\nYou are a Python code generator that creates self-contained, executable code snippets. When writing code:\n\n1. Each snippet should be complete and runnable on its own\n2. Prefer using print() statements to display outputs\n3. Include helpful comments explaining the code\n4. Keep snippets concise (generally under 15 lines)\n5. Avoid external dependencies - use Python standard library\n6. Handle potential errors gracefully\n7. Return meaningful output that demonstrates the code's functionality\n8. Don't use input() or other interactive functions\n9. Don't access files or network resources\n10. Don't use infinite loops\n\nExamples of good snippets:\n\n# Calculate factorial iteratively\ndef factorial(n):\n    result = 1\n    for i in range(1, n + 1):\n        result *= i\n    return result\n\nprint(f\"Factorial of 5 is: {factorial(5)}\")\n`;\n\nexport const sheetPrompt = `\nYou are a spreadsheet creation assistant. Create a spreadsheet in csv format based on the given prompt. The spreadsheet should contain meaningful column headers and data.\n`;\n\nexport const updateDocumentPrompt = (\n  currentContent: string | null,\n  type: ArtifactKind\n) => {\n  let mediaType = \"document\";\n\n  if (type === \"code\") {\n    mediaType = \"code snippet\";\n  } else if (type === \"sheet\") {\n    mediaType = \"spreadsheet\";\n  }\n\n  return `Improve the following contents of the ${mediaType} based on the given prompt.\n\n${currentContent}`;\n};\n\nexport const titlePrompt = `Generate a short chat title (2-5 words) summarizing the user's message.\n\nOutput ONLY the title text. No prefixes, no formatting.\n\nExamples:\n- \"what's the weather in nyc\" → Weather in NYC\n- \"help me write an essay about space\" → Space Essay Help\n- \"hi\" → New Conversation\n- \"debug my python code\" → Python Debugging\n\nBad outputs (never do this):\n- \"# Space Essay\" (no hashtags)\n- \"Title: Weather\" (no prefixes)\n- \"\"NYC Weather\"\" (no quotes)`;\n"
  },
  {
    "path": "lib/ai/providers.ts",
    "content": "import { gateway } from \"@ai-sdk/gateway\";\nimport {\n  customProvider,\n  extractReasoningMiddleware,\n  wrapLanguageModel,\n} from \"ai\";\nimport { isTestEnvironment } from \"../constants\";\n\nconst THINKING_SUFFIX_REGEX = /-thinking$/;\n\nexport const myProvider = isTestEnvironment\n  ? (() => {\n      const {\n        artifactModel,\n        chatModel,\n        reasoningModel,\n        titleModel,\n      } = require(\"./models.mock\");\n      return customProvider({\n        languageModels: {\n          \"chat-model\": chatModel,\n          \"chat-model-reasoning\": reasoningModel,\n          \"title-model\": titleModel,\n          \"artifact-model\": artifactModel,\n        },\n      });\n    })()\n  : null;\n\nexport function getLanguageModel(modelId: string) {\n  if (isTestEnvironment && myProvider) {\n    return myProvider.languageModel(modelId);\n  }\n\n  const isReasoningModel =\n    modelId.endsWith(\"-thinking\") ||\n    (modelId.includes(\"reasoning\") && !modelId.includes(\"non-reasoning\"));\n\n  if (isReasoningModel) {\n    const gatewayModelId = modelId.replace(THINKING_SUFFIX_REGEX, \"\");\n\n    return wrapLanguageModel({\n      model: gateway.languageModel(gatewayModelId),\n      middleware: extractReasoningMiddleware({ tagName: \"thinking\" }),\n    });\n  }\n\n  return gateway.languageModel(modelId);\n}\n\nexport function getTitleModel() {\n  if (isTestEnvironment && myProvider) {\n    return myProvider.languageModel(\"title-model\");\n  }\n  return gateway.languageModel(\"google/gemini-2.5-flash-lite\");\n}\n\nexport function getArtifactModel() {\n  if (isTestEnvironment && myProvider) {\n    return myProvider.languageModel(\"artifact-model\");\n  }\n  return gateway.languageModel(\"anthropic/claude-haiku-4.5\");\n}\n"
  },
  {
    "path": "lib/ai/tools/create-document.ts",
    "content": "import { tool, type UIMessageStreamWriter } from \"ai\";\nimport type { Session } from \"next-auth\";\nimport { z } from \"zod\";\nimport {\n  artifactKinds,\n  documentHandlersByArtifactKind,\n} from \"@/lib/artifacts/server\";\nimport type { ChatMessage } from \"@/lib/types\";\nimport { generateUUID } from \"@/lib/utils\";\n\ntype CreateDocumentProps = {\n  session: Session;\n  dataStream: UIMessageStreamWriter<ChatMessage>;\n};\n\nexport const createDocument = ({ session, dataStream }: CreateDocumentProps) =>\n  tool({\n    description:\n      \"Create a document for a writing or content creation activities. This tool will call other functions that will generate the contents of the document based on the title and kind.\",\n    inputSchema: z.object({\n      title: z.string(),\n      kind: z.enum(artifactKinds),\n    }),\n    execute: async ({ title, kind }) => {\n      const id = generateUUID();\n\n      dataStream.write({\n        type: \"data-kind\",\n        data: kind,\n        transient: true,\n      });\n\n      dataStream.write({\n        type: \"data-id\",\n        data: id,\n        transient: true,\n      });\n\n      dataStream.write({\n        type: \"data-title\",\n        data: title,\n        transient: true,\n      });\n\n      dataStream.write({\n        type: \"data-clear\",\n        data: null,\n        transient: true,\n      });\n\n      const documentHandler = documentHandlersByArtifactKind.find(\n        (documentHandlerByArtifactKind) =>\n          documentHandlerByArtifactKind.kind === kind\n      );\n\n      if (!documentHandler) {\n        throw new Error(`No document handler found for kind: ${kind}`);\n      }\n\n      await documentHandler.onCreateDocument({\n        id,\n        title,\n        dataStream,\n        session,\n      });\n\n      dataStream.write({ type: \"data-finish\", data: null, transient: true });\n\n      return {\n        id,\n        title,\n        kind,\n        content: \"A document was created and is now visible to the user.\",\n      };\n    },\n  });\n"
  },
  {
    "path": "lib/ai/tools/get-weather.ts",
    "content": "import { tool } from \"ai\";\nimport { z } from \"zod\";\n\nasync function geocodeCity(\n  city: string\n): Promise<{ latitude: number; longitude: number } | null> {\n  try {\n    const response = await fetch(\n      `https://geocoding-api.open-meteo.com/v1/search?name=${encodeURIComponent(city)}&count=1&language=en&format=json`\n    );\n\n    if (!response.ok) {\n      return null;\n    }\n\n    const data = await response.json();\n\n    if (!data.results || data.results.length === 0) {\n      return null;\n    }\n\n    const result = data.results[0];\n    return {\n      latitude: result.latitude,\n      longitude: result.longitude,\n    };\n  } catch {\n    return null;\n  }\n}\n\nexport const getWeather = tool({\n  description:\n    \"Get the current weather at a location. You can provide either coordinates or a city name.\",\n  inputSchema: z.object({\n    latitude: z.number().optional(),\n    longitude: z.number().optional(),\n    city: z\n      .string()\n      .describe(\"City name (e.g., 'San Francisco', 'New York', 'London')\")\n      .optional(),\n  }),\n  needsApproval: true,\n  execute: async (input) => {\n    let latitude: number;\n    let longitude: number;\n\n    if (input.city) {\n      const coords = await geocodeCity(input.city);\n      if (!coords) {\n        return {\n          error: `Could not find coordinates for \"${input.city}\". Please check the city name.`,\n        };\n      }\n      latitude = coords.latitude;\n      longitude = coords.longitude;\n    } else if (input.latitude !== undefined && input.longitude !== undefined) {\n      latitude = input.latitude;\n      longitude = input.longitude;\n    } else {\n      return {\n        error:\n          \"Please provide either a city name or both latitude and longitude coordinates.\",\n      };\n    }\n\n    const response = await fetch(\n      `https://api.open-meteo.com/v1/forecast?latitude=${latitude}&longitude=${longitude}&current=temperature_2m&hourly=temperature_2m&daily=sunrise,sunset&timezone=auto`\n    );\n\n    const weatherData = await response.json();\n\n    if (\"city\" in input) {\n      weatherData.cityName = input.city;\n    }\n\n    return weatherData;\n  },\n});\n"
  },
  {
    "path": "lib/ai/tools/request-suggestions.ts",
    "content": "import { Output, streamText, tool, type UIMessageStreamWriter } from \"ai\";\nimport type { Session } from \"next-auth\";\nimport { z } from \"zod\";\nimport { getDocumentById, saveSuggestions } from \"@/lib/db/queries\";\nimport type { Suggestion } from \"@/lib/db/schema\";\nimport type { ChatMessage } from \"@/lib/types\";\nimport { generateUUID } from \"@/lib/utils\";\nimport { getArtifactModel } from \"../providers\";\n\ntype RequestSuggestionsProps = {\n  session: Session;\n  dataStream: UIMessageStreamWriter<ChatMessage>;\n};\n\nexport const requestSuggestions = ({\n  session,\n  dataStream,\n}: RequestSuggestionsProps) =>\n  tool({\n    description:\n      \"Request writing suggestions for an existing document artifact. Only use this when the user explicitly asks to improve or get suggestions for a document they have already created. Never use for general questions.\",\n    inputSchema: z.object({\n      documentId: z\n        .string()\n        .describe(\n          \"The UUID of an existing document artifact that was previously created with createDocument\"\n        ),\n    }),\n    execute: async ({ documentId }) => {\n      const document = await getDocumentById({ id: documentId });\n\n      if (!document || !document.content) {\n        return {\n          error: \"Document not found\",\n        };\n      }\n\n      const suggestions: Omit<\n        Suggestion,\n        \"userId\" | \"createdAt\" | \"documentCreatedAt\"\n      >[] = [];\n\n      const { partialOutputStream } = streamText({\n        model: getArtifactModel(),\n        system:\n          \"You are a help writing assistant. Given a piece of writing, please offer suggestions to improve the piece of writing and describe the change. It is very important for the edits to contain full sentences instead of just words. Max 5 suggestions.\",\n        prompt: document.content,\n        output: Output.array({\n          element: z.object({\n            originalSentence: z.string().describe(\"The original sentence\"),\n            suggestedSentence: z.string().describe(\"The suggested sentence\"),\n            description: z\n              .string()\n              .describe(\"The description of the suggestion\"),\n          }),\n        }),\n      });\n\n      let processedCount = 0;\n      for await (const partialOutput of partialOutputStream) {\n        if (!partialOutput) {\n          continue;\n        }\n\n        for (let i = processedCount; i < partialOutput.length; i++) {\n          const element = partialOutput[i];\n          if (\n            !element?.originalSentence ||\n            !element?.suggestedSentence ||\n            !element?.description\n          ) {\n            continue;\n          }\n\n          const suggestion = {\n            originalText: element.originalSentence,\n            suggestedText: element.suggestedSentence,\n            description: element.description,\n            id: generateUUID(),\n            documentId,\n            isResolved: false,\n          };\n\n          dataStream.write({\n            type: \"data-suggestion\",\n            data: suggestion as Suggestion,\n            transient: true,\n          });\n\n          suggestions.push(suggestion);\n          processedCount++;\n        }\n      }\n\n      if (session.user?.id) {\n        const userId = session.user.id;\n\n        await saveSuggestions({\n          suggestions: suggestions.map((suggestion) => ({\n            ...suggestion,\n            userId,\n            createdAt: new Date(),\n            documentCreatedAt: document.createdAt,\n          })),\n        });\n      }\n\n      return {\n        id: documentId,\n        title: document.title,\n        kind: document.kind,\n        message: \"Suggestions have been added to the document\",\n      };\n    },\n  });\n"
  },
  {
    "path": "lib/ai/tools/update-document.ts",
    "content": "import { tool, type UIMessageStreamWriter } from \"ai\";\nimport type { Session } from \"next-auth\";\nimport { z } from \"zod\";\nimport { documentHandlersByArtifactKind } from \"@/lib/artifacts/server\";\nimport { getDocumentById } from \"@/lib/db/queries\";\nimport type { ChatMessage } from \"@/lib/types\";\n\ntype UpdateDocumentProps = {\n  session: Session;\n  dataStream: UIMessageStreamWriter<ChatMessage>;\n};\n\nexport const updateDocument = ({ session, dataStream }: UpdateDocumentProps) =>\n  tool({\n    description: \"Update a document with the given description.\",\n    inputSchema: z.object({\n      id: z.string().describe(\"The ID of the document to update\"),\n      description: z\n        .string()\n        .describe(\"The description of changes that need to be made\"),\n    }),\n    execute: async ({ id, description }) => {\n      const document = await getDocumentById({ id });\n\n      if (!document) {\n        return {\n          error: \"Document not found\",\n        };\n      }\n\n      dataStream.write({\n        type: \"data-clear\",\n        data: null,\n        transient: true,\n      });\n\n      const documentHandler = documentHandlersByArtifactKind.find(\n        (documentHandlerByArtifactKind) =>\n          documentHandlerByArtifactKind.kind === document.kind\n      );\n\n      if (!documentHandler) {\n        throw new Error(`No document handler found for kind: ${document.kind}`);\n      }\n\n      await documentHandler.onUpdateDocument({\n        document,\n        description,\n        dataStream,\n        session,\n      });\n\n      dataStream.write({ type: \"data-finish\", data: null, transient: true });\n\n      return {\n        id,\n        title: document.title,\n        kind: document.kind,\n        content: \"The document has been updated successfully.\",\n      };\n    },\n  });\n"
  },
  {
    "path": "lib/artifacts/server.ts",
    "content": "import type { UIMessageStreamWriter } from \"ai\";\nimport type { Session } from \"next-auth\";\nimport { codeDocumentHandler } from \"@/artifacts/code/server\";\nimport { sheetDocumentHandler } from \"@/artifacts/sheet/server\";\nimport { textDocumentHandler } from \"@/artifacts/text/server\";\nimport type { ArtifactKind } from \"@/components/artifact\";\nimport { saveDocument } from \"../db/queries\";\nimport type { Document } from \"../db/schema\";\nimport type { ChatMessage } from \"../types\";\n\nexport type SaveDocumentProps = {\n  id: string;\n  title: string;\n  kind: ArtifactKind;\n  content: string;\n  userId: string;\n};\n\nexport type CreateDocumentCallbackProps = {\n  id: string;\n  title: string;\n  dataStream: UIMessageStreamWriter<ChatMessage>;\n  session: Session;\n};\n\nexport type UpdateDocumentCallbackProps = {\n  document: Document;\n  description: string;\n  dataStream: UIMessageStreamWriter<ChatMessage>;\n  session: Session;\n};\n\nexport type DocumentHandler<T = ArtifactKind> = {\n  kind: T;\n  onCreateDocument: (args: CreateDocumentCallbackProps) => Promise<void>;\n  onUpdateDocument: (args: UpdateDocumentCallbackProps) => Promise<void>;\n};\n\nexport function createDocumentHandler<T extends ArtifactKind>(config: {\n  kind: T;\n  onCreateDocument: (params: CreateDocumentCallbackProps) => Promise<string>;\n  onUpdateDocument: (params: UpdateDocumentCallbackProps) => Promise<string>;\n}): DocumentHandler<T> {\n  return {\n    kind: config.kind,\n    onCreateDocument: async (args: CreateDocumentCallbackProps) => {\n      const draftContent = await config.onCreateDocument({\n        id: args.id,\n        title: args.title,\n        dataStream: args.dataStream,\n        session: args.session,\n      });\n\n      if (args.session?.user?.id) {\n        await saveDocument({\n          id: args.id,\n          title: args.title,\n          content: draftContent,\n          kind: config.kind,\n          userId: args.session.user.id,\n        });\n      }\n\n      return;\n    },\n    onUpdateDocument: async (args: UpdateDocumentCallbackProps) => {\n      const draftContent = await config.onUpdateDocument({\n        document: args.document,\n        description: args.description,\n        dataStream: args.dataStream,\n        session: args.session,\n      });\n\n      if (args.session?.user?.id) {\n        await saveDocument({\n          id: args.document.id,\n          title: args.document.title,\n          content: draftContent,\n          kind: config.kind,\n          userId: args.session.user.id,\n        });\n      }\n\n      return;\n    },\n  };\n}\n\n/*\n * Use this array to define the document handlers for each artifact kind.\n */\nexport const documentHandlersByArtifactKind: DocumentHandler[] = [\n  textDocumentHandler,\n  codeDocumentHandler,\n  sheetDocumentHandler,\n];\n\nexport const artifactKinds = [\"text\", \"code\", \"sheet\"] as const;\n"
  },
  {
    "path": "lib/constants.ts",
    "content": "import { generateDummyPassword } from \"./db/utils\";\n\nexport const isProductionEnvironment = process.env.NODE_ENV === \"production\";\nexport const isDevelopmentEnvironment = process.env.NODE_ENV === \"development\";\nexport const isTestEnvironment = Boolean(\n  process.env.PLAYWRIGHT_TEST_BASE_URL ||\n    process.env.PLAYWRIGHT ||\n    process.env.CI_PLAYWRIGHT\n);\n\nexport const guestRegex = /^guest-\\d+$/;\n\nexport const DUMMY_PASSWORD = generateDummyPassword();\n"
  },
  {
    "path": "lib/db/helpers/01-core-to-parts.ts",
    "content": "// This is a helper for an older version of ai, v4.3.13\n\n// import { config } from 'dotenv';\n// import postgres from 'postgres';\n// import {\n//   chat,\n//   message,\n//   type MessageDeprecated,\n//   messageDeprecated,\n//   vote,\n//   voteDeprecated,\n// } from '../schema';\n// import { drizzle } from 'drizzle-orm/postgres-js';\n// import { inArray } from 'drizzle-orm';\n// import { appendResponseMessages, type UIMessage } from 'ai';\n\n// config({\n//   path: '.env.local',\n// });\n\n// if (!process.env.POSTGRES_URL) {\n//   throw new Error('POSTGRES_URL environment variable is not set');\n// }\n\n// const client = postgres(process.env.POSTGRES_URL);\n// const db = drizzle(client);\n\n// const BATCH_SIZE = 100; // Process 100 chats at a time\n// const INSERT_BATCH_SIZE = 1000; // Insert 1000 messages at a time\n\n// type NewMessageInsert = {\n//   id: string;\n//   chatId: string;\n//   parts: any[];\n//   role: string;\n//   attachments: any[];\n//   createdAt: Date;\n// };\n\n// type NewVoteInsert = {\n//   messageId: string;\n//   chatId: string;\n//   isUpvoted: boolean;\n// };\n\n// interface MessageDeprecatedContentPart {\n//   type: string;\n//   content: unknown;\n// }\n\n// function getMessageRank(message: MessageDeprecated): number {\n//   if (\n//     message.role === 'assistant' &&\n//     (message.content as MessageDeprecatedContentPart[]).some(\n//       (contentPart) => contentPart.type === 'tool-call',\n//     )\n//   ) {\n//     return 0;\n//   }\n\n//   if (\n//     message.role === 'tool' &&\n//     (message.content as MessageDeprecatedContentPart[]).some(\n//       (contentPart) => contentPart.type === 'tool-result',\n//     )\n//   ) {\n//     return 1;\n//   }\n\n//   if (message.role === 'assistant') {\n//     return 2;\n//   }\n\n//   return 3;\n// }\n\n// function dedupeParts<T extends { type: string; [k: string]: any }>(\n//   parts: T[],\n// ): T[] {\n//   const seen = new Set<string>();\n//   return parts.filter((p) => {\n//     const key = `${p.type}|${JSON.stringify(p.content ?? p)}`;\n//     if (seen.has(key)) return false;\n//     seen.add(key);\n//     return true;\n//   });\n// }\n\n// function sanitizeParts<T extends { type: string; [k: string]: any }>(\n//   parts: T[],\n// ): T[] {\n//   return parts.filter(\n//     (part) => !(part.type === 'reasoning' && part.reasoning === 'undefined'),\n//   );\n// }\n\n// async function migrateMessages() {\n//   const chats = await db.select().from(chat);\n\n//   let processedCount = 0;\n\n//   for (let i = 0; i < chats.length; i += BATCH_SIZE) {\n//     const chatBatch = chats.slice(i, i + BATCH_SIZE);\n//     const chatIds = chatBatch.map((chat) => chat.id);\n\n//     const allMessages = await db\n//       .select()\n//       .from(messageDeprecated)\n//       .where(inArray(messageDeprecated.chatId, chatIds));\n\n//     const allVotes = await db\n//       .select()\n//       .from(voteDeprecated)\n//       .where(inArray(voteDeprecated.chatId, chatIds));\n\n//     const newMessagesToInsert: NewMessageInsert[] = [];\n//     const newVotesToInsert: NewVoteInsert[] = [];\n\n//     for (const chat of chatBatch) {\n//       processedCount++;\n//       console.info(`Processed ${processedCount}/${chats.length} chats`);\n\n//       const messages = allMessages\n//         .filter((message) => message.chatId === chat.id)\n//         .sort((a, b) => {\n//           const differenceInTime =\n//             new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime();\n//           if (differenceInTime !== 0) return differenceInTime;\n\n//           return getMessageRank(a) - getMessageRank(b);\n//         });\n\n//       const votes = allVotes.filter((v) => v.chatId === chat.id);\n\n//       const messageSection: Array<UIMessage> = [];\n//       const messageSections: Array<Array<UIMessage>> = [];\n\n//       for (const message of messages) {\n//         const { role } = message;\n\n//         if (role === 'user' && messageSection.length > 0) {\n//           messageSections.push([...messageSection]);\n//           messageSection.length = 0;\n//         }\n\n//         // @ts-expect-error message.content has different type\n//         messageSection.push(message);\n//       }\n\n//       if (messageSection.length > 0) {\n//         messageSections.push([...messageSection]);\n//       }\n\n//       for (const section of messageSections) {\n//         const [userMessage, ...assistantMessages] = section;\n\n//         const [firstAssistantMessage] = assistantMessages;\n\n//         try {\n//           const uiSection = appendResponseMessages({\n//             messages: [userMessage],\n//             // @ts-expect-error: message.content has different type\n//             responseMessages: assistantMessages,\n//             _internal: {\n//               currentDate: () => firstAssistantMessage.createdAt ?? new Date(),\n//             },\n//           });\n\n//           const projectedUISection = uiSection\n//             .map((message) => {\n//               if (message.role === 'user') {\n//                 return {\n//                   id: message.id,\n//                   chatId: chat.id,\n//                   parts: [{ type: 'text', text: message.content }],\n//                   role: message.role,\n//                   createdAt: message.createdAt,\n//                   attachments: [],\n//                 } as NewMessageInsert;\n//               } else if (message.role === 'assistant') {\n//                 const cleanParts = sanitizeParts(\n//                   dedupeParts(message.parts || []),\n//                 );\n\n//                 return {\n//                   id: message.id,\n//                   chatId: chat.id,\n//                   parts: cleanParts,\n//                   role: message.role,\n//                   createdAt: message.createdAt,\n//                   attachments: [],\n//                 } as NewMessageInsert;\n//               }\n//               return null;\n//             })\n//             .filter((msg): msg is NewMessageInsert => msg !== null);\n\n//           for (const msg of projectedUISection) {\n//             newMessagesToInsert.push(msg);\n\n//             if (msg.role === 'assistant') {\n//               const voteByMessage = votes.find((v) => v.messageId === msg.id);\n//               if (voteByMessage) {\n//                 newVotesToInsert.push({\n//                   messageId: msg.id,\n//                   chatId: msg.chatId,\n//                   isUpvoted: voteByMessage.isUpvoted,\n//                 });\n//               }\n//             }\n//           }\n//         } catch (error) {\n//           console.error(`Error processing chat ${chat.id}: ${error}`);\n//         }\n//       }\n//     }\n\n//     for (let j = 0; j < newMessagesToInsert.length; j += INSERT_BATCH_SIZE) {\n//       const messageBatch = newMessagesToInsert.slice(j, j + INSERT_BATCH_SIZE);\n//       if (messageBatch.length > 0) {\n//         const validMessageBatch = messageBatch.map((msg) => ({\n//           id: msg.id,\n//           chatId: msg.chatId,\n//           parts: msg.parts,\n//           role: msg.role,\n//           attachments: msg.attachments,\n//           createdAt: msg.createdAt,\n//         }));\n\n//         await db.insert(message).values(validMessageBatch);\n//       }\n//     }\n\n//     for (let j = 0; j < newVotesToInsert.length; j += INSERT_BATCH_SIZE) {\n//       const voteBatch = newVotesToInsert.slice(j, j + INSERT_BATCH_SIZE);\n//       if (voteBatch.length > 0) {\n//         await db.insert(vote).values(voteBatch);\n//       }\n//     }\n//   }\n\n//   console.info(`Migration completed: ${processedCount} chats processed`);\n// }\n\n// migrateMessages()\n//   .then(() => {\n//     console.info('Script completed successfully');\n//     process.exit(0);\n//   })\n//   .catch((error) => {\n//     console.error('Script failed:', error);\n//     process.exit(1);\n//   });\n"
  },
  {
    "path": "lib/db/migrate.ts",
    "content": "import { config } from \"dotenv\";\nimport { drizzle } from \"drizzle-orm/postgres-js\";\nimport { migrate } from \"drizzle-orm/postgres-js/migrator\";\nimport postgres from \"postgres\";\n\nconfig({\n  path: \".env.local\",\n});\n\nconst runMigrate = async () => {\n  if (!process.env.POSTGRES_URL) {\n    console.log(\"⏭️  POSTGRES_URL not defined, skipping migrations\");\n    process.exit(0);\n  }\n\n  const connection = postgres(process.env.POSTGRES_URL, { max: 1 });\n  const db = drizzle(connection);\n\n  console.log(\"⏳ Running migrations...\");\n\n  const start = Date.now();\n  await migrate(db, { migrationsFolder: \"./lib/db/migrations\" });\n  const end = Date.now();\n\n  console.log(\"✅ Migrations completed in\", end - start, \"ms\");\n  process.exit(0);\n};\n\nrunMigrate().catch((err) => {\n  console.error(\"❌ Migration failed\");\n  console.error(err);\n  process.exit(1);\n});\n"
  },
  {
    "path": "lib/db/migrations/0000_keen_devos.sql",
    "content": "CREATE TABLE IF NOT EXISTS \"Chat\" (\n\t\"id\" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,\n\t\"createdAt\" timestamp NOT NULL,\n\t\"messages\" json NOT NULL,\n\t\"userId\" uuid NOT NULL\n);\n--> statement-breakpoint\nCREATE TABLE IF NOT EXISTS \"User\" (\n\t\"id\" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,\n\t\"email\" varchar(64) NOT NULL,\n\t\"password\" varchar(64)\n);\n--> statement-breakpoint\nDO $$ BEGIN\n ALTER TABLE \"Chat\" ADD CONSTRAINT \"Chat_userId_User_id_fk\" FOREIGN KEY (\"userId\") REFERENCES \"public\".\"User\"(\"id\") ON DELETE no action ON UPDATE no action;\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n"
  },
  {
    "path": "lib/db/migrations/0001_sparkling_blue_marvel.sql",
    "content": "CREATE TABLE IF NOT EXISTS \"Suggestion\" (\n\t\"id\" uuid DEFAULT gen_random_uuid() NOT NULL,\n\t\"documentId\" uuid NOT NULL,\n\t\"documentCreatedAt\" timestamp NOT NULL,\n\t\"originalText\" text NOT NULL,\n\t\"suggestedText\" text NOT NULL,\n\t\"description\" text,\n\t\"isResolved\" boolean DEFAULT false NOT NULL,\n\t\"userId\" uuid NOT NULL,\n\t\"createdAt\" timestamp NOT NULL,\n\tCONSTRAINT \"Suggestion_id_pk\" PRIMARY KEY(\"id\")\n);\n--> statement-breakpoint\nCREATE TABLE IF NOT EXISTS \"Document\" (\n\t\"id\" uuid DEFAULT gen_random_uuid() NOT NULL,\n\t\"createdAt\" timestamp NOT NULL,\n\t\"title\" text NOT NULL,\n\t\"content\" text,\n\t\"userId\" uuid NOT NULL,\n\tCONSTRAINT \"Document_id_createdAt_pk\" PRIMARY KEY(\"id\",\"createdAt\")\n);\n--> statement-breakpoint\nDO $$ BEGIN\n ALTER TABLE \"Suggestion\" ADD CONSTRAINT \"Suggestion_userId_User_id_fk\" FOREIGN KEY (\"userId\") REFERENCES \"public\".\"User\"(\"id\") ON DELETE no action ON UPDATE no action;\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n--> statement-breakpoint\nDO $$ BEGIN\n ALTER TABLE \"Suggestion\" ADD CONSTRAINT \"Suggestion_documentId_documentCreatedAt_Document_id_createdAt_fk\" FOREIGN KEY (\"documentId\",\"documentCreatedAt\") REFERENCES \"public\".\"Document\"(\"id\",\"createdAt\") ON DELETE no action ON UPDATE no action;\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n--> statement-breakpoint\nDO $$ BEGIN\n ALTER TABLE \"Document\" ADD CONSTRAINT \"Document_userId_User_id_fk\" FOREIGN KEY (\"userId\") REFERENCES \"public\".\"User\"(\"id\") ON DELETE no action ON UPDATE no action;\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n"
  },
  {
    "path": "lib/db/migrations/0002_wandering_riptide.sql",
    "content": "CREATE TABLE IF NOT EXISTS \"Message\" (\n\t\"id\" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,\n\t\"chatId\" uuid NOT NULL,\n\t\"role\" varchar NOT NULL,\n\t\"content\" json NOT NULL,\n\t\"createdAt\" timestamp NOT NULL\n);\n--> statement-breakpoint\nCREATE TABLE IF NOT EXISTS \"Vote\" (\n\t\"chatId\" uuid NOT NULL,\n\t\"messageId\" uuid NOT NULL,\n\t\"isUpvoted\" boolean NOT NULL,\n\tCONSTRAINT \"Vote_chatId_messageId_pk\" PRIMARY KEY(\"chatId\",\"messageId\")\n);\n--> statement-breakpoint\nALTER TABLE \"Chat\" ADD COLUMN \"title\" text NOT NULL;--> statement-breakpoint\nDO $$ BEGIN\n ALTER TABLE \"Message\" ADD CONSTRAINT \"Message_chatId_Chat_id_fk\" FOREIGN KEY (\"chatId\") REFERENCES \"public\".\"Chat\"(\"id\") ON DELETE no action ON UPDATE no action;\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n--> statement-breakpoint\nDO $$ BEGIN\n ALTER TABLE \"Vote\" ADD CONSTRAINT \"Vote_chatId_Chat_id_fk\" FOREIGN KEY (\"chatId\") REFERENCES \"public\".\"Chat\"(\"id\") ON DELETE no action ON UPDATE no action;\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n--> statement-breakpoint\nDO $$ BEGIN\n ALTER TABLE \"Vote\" ADD CONSTRAINT \"Vote_messageId_Message_id_fk\" FOREIGN KEY (\"messageId\") REFERENCES \"public\".\"Message\"(\"id\") ON DELETE no action ON UPDATE no action;\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n--> statement-breakpoint\nALTER TABLE \"Chat\" DROP COLUMN IF EXISTS \"messages\";"
  },
  {
    "path": "lib/db/migrations/0003_cloudy_glorian.sql",
    "content": "ALTER TABLE \"Chat\" ADD COLUMN \"visibility\" varchar DEFAULT 'private' NOT NULL;"
  },
  {
    "path": "lib/db/migrations/0004_odd_slayback.sql",
    "content": "ALTER TABLE \"Document\" ADD COLUMN \"text\" varchar DEFAULT 'text' NOT NULL;"
  },
  {
    "path": "lib/db/migrations/0005_wooden_whistler.sql",
    "content": "CREATE TABLE IF NOT EXISTS \"Message_v2\" (\n\t\"id\" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,\n\t\"chatId\" uuid NOT NULL,\n\t\"role\" varchar NOT NULL,\n\t\"parts\" json NOT NULL,\n\t\"attachments\" json NOT NULL,\n\t\"createdAt\" timestamp NOT NULL\n);\n--> statement-breakpoint\nCREATE TABLE IF NOT EXISTS \"Vote_v2\" (\n\t\"chatId\" uuid NOT NULL,\n\t\"messageId\" uuid NOT NULL,\n\t\"isUpvoted\" boolean NOT NULL,\n\tCONSTRAINT \"Vote_v2_chatId_messageId_pk\" PRIMARY KEY(\"chatId\",\"messageId\")\n);\n--> statement-breakpoint\nDO $$ BEGIN\n ALTER TABLE \"Message_v2\" ADD CONSTRAINT \"Message_v2_chatId_Chat_id_fk\" FOREIGN KEY (\"chatId\") REFERENCES \"public\".\"Chat\"(\"id\") ON DELETE no action ON UPDATE no action;\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n--> statement-breakpoint\nDO $$ BEGIN\n ALTER TABLE \"Vote_v2\" ADD CONSTRAINT \"Vote_v2_chatId_Chat_id_fk\" FOREIGN KEY (\"chatId\") REFERENCES \"public\".\"Chat\"(\"id\") ON DELETE no action ON UPDATE no action;\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n--> statement-breakpoint\nDO $$ BEGIN\n ALTER TABLE \"Vote_v2\" ADD CONSTRAINT \"Vote_v2_messageId_Message_v2_id_fk\" FOREIGN KEY (\"messageId\") REFERENCES \"public\".\"Message_v2\"(\"id\") ON DELETE no action ON UPDATE no action;\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n"
  },
  {
    "path": "lib/db/migrations/0006_marvelous_frog_thor.sql",
    "content": "CREATE TABLE IF NOT EXISTS \"Stream\" (\n\t\"id\" uuid DEFAULT gen_random_uuid() NOT NULL,\n\t\"chatId\" uuid NOT NULL,\n\t\"createdAt\" timestamp NOT NULL,\n\tCONSTRAINT \"Stream_id_pk\" PRIMARY KEY(\"id\")\n);\n--> statement-breakpoint\nDO $$ BEGIN\n ALTER TABLE \"Stream\" ADD CONSTRAINT \"Stream_chatId_Chat_id_fk\" FOREIGN KEY (\"chatId\") REFERENCES \"public\".\"Chat\"(\"id\") ON DELETE no action ON UPDATE no action;\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n"
  },
  {
    "path": "lib/db/migrations/0007_flowery_ben_parker.sql",
    "content": "ALTER TABLE \"Chat\" ADD COLUMN \"lastContext\" jsonb;"
  },
  {
    "path": "lib/db/migrations/0008_flat_forgotten_one.sql",
    "content": "ALTER TABLE \"Chat\" DROP COLUMN IF EXISTS \"lastContext\";"
  },
  {
    "path": "lib/db/migrations/meta/0000_snapshot.json",
    "content": "{\n  \"id\": \"715ec9ec-6715-4d0f-9f6c-9b5c7f09827c\",\n  \"prevId\": \"00000000-0000-0000-0000-000000000000\",\n  \"version\": \"7\",\n  \"dialect\": \"postgresql\",\n  \"tables\": {\n    \"public.Chat\": {\n      \"name\": \"Chat\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"uuid\",\n          \"primaryKey\": true,\n          \"notNull\": true,\n          \"default\": \"gen_random_uuid()\"\n        },\n        \"createdAt\": {\n          \"name\": \"createdAt\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"messages\": {\n          \"name\": \"messages\",\n          \"type\": \"json\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"userId\": {\n          \"name\": \"userId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"Chat_userId_User_id_fk\": {\n          \"name\": \"Chat_userId_User_id_fk\",\n          \"tableFrom\": \"Chat\",\n          \"tableTo\": \"User\",\n          \"columnsFrom\": [\"userId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {},\n      \"uniqueConstraints\": {}\n    },\n    \"public.User\": {\n      \"name\": \"User\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"uuid\",\n          \"primaryKey\": true,\n          \"notNull\": true,\n          \"default\": \"gen_random_uuid()\"\n        },\n        \"email\": {\n          \"name\": \"email\",\n          \"type\": \"varchar(64)\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"password\": {\n          \"name\": \"password\",\n          \"type\": \"varchar(64)\",\n          \"primaryKey\": false,\n          \"notNull\": false\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {},\n      \"compositePrimaryKeys\": {},\n      \"uniqueConstraints\": {}\n    }\n  },\n  \"enums\": {},\n  \"schemas\": {},\n  \"sequences\": {},\n  \"_meta\": {\n    \"columns\": {},\n    \"schemas\": {},\n    \"tables\": {}\n  }\n}\n"
  },
  {
    "path": "lib/db/migrations/meta/0001_snapshot.json",
    "content": "{\n  \"id\": \"f3d3437c-4735-4c91-80af-1014048a904e\",\n  \"prevId\": \"715ec9ec-6715-4d0f-9f6c-9b5c7f09827c\",\n  \"version\": \"7\",\n  \"dialect\": \"postgresql\",\n  \"tables\": {\n    \"public.Suggestion\": {\n      \"name\": \"Suggestion\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"default\": \"gen_random_uuid()\"\n        },\n        \"documentId\": {\n          \"name\": \"documentId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"documentCreatedAt\": {\n          \"name\": \"documentCreatedAt\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"originalText\": {\n          \"name\": \"originalText\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"suggestedText\": {\n          \"name\": \"suggestedText\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"description\": {\n          \"name\": \"description\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": false\n        },\n        \"isResolved\": {\n          \"name\": \"isResolved\",\n          \"type\": \"boolean\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"default\": false\n        },\n        \"userId\": {\n          \"name\": \"userId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"createdAt\": {\n          \"name\": \"createdAt\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"Suggestion_userId_User_id_fk\": {\n          \"name\": \"Suggestion_userId_User_id_fk\",\n          \"tableFrom\": \"Suggestion\",\n          \"tableTo\": \"User\",\n          \"columnsFrom\": [\"userId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        },\n        \"Suggestion_documentId_documentCreatedAt_Document_id_createdAt_fk\": {\n          \"name\": \"Suggestion_documentId_documentCreatedAt_Document_id_createdAt_fk\",\n          \"tableFrom\": \"Suggestion\",\n          \"tableTo\": \"Document\",\n          \"columnsFrom\": [\"documentId\", \"documentCreatedAt\"],\n          \"columnsTo\": [\"id\", \"createdAt\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {\n        \"Suggestion_id_pk\": {\n          \"name\": \"Suggestion_id_pk\",\n          \"columns\": [\"id\"]\n        }\n      },\n      \"uniqueConstraints\": {}\n    },\n    \"public.Chat\": {\n      \"name\": \"Chat\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"uuid\",\n          \"primaryKey\": true,\n          \"notNull\": true,\n          \"default\": \"gen_random_uuid()\"\n        },\n        \"createdAt\": {\n          \"name\": \"createdAt\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"messages\": {\n          \"name\": \"messages\",\n          \"type\": \"json\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"userId\": {\n          \"name\": \"userId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"Chat_userId_User_id_fk\": {\n          \"name\": \"Chat_userId_User_id_fk\",\n          \"tableFrom\": \"Chat\",\n          \"tableTo\": \"User\",\n          \"columnsFrom\": [\"userId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {},\n      \"uniqueConstraints\": {}\n    },\n    \"public.Document\": {\n      \"name\": \"Document\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"default\": \"gen_random_uuid()\"\n        },\n        \"createdAt\": {\n          \"name\": \"createdAt\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"title\": {\n          \"name\": \"title\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"content\": {\n          \"name\": \"content\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": false\n        },\n        \"userId\": {\n          \"name\": \"userId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"Document_userId_User_id_fk\": {\n          \"name\": \"Document_userId_User_id_fk\",\n          \"tableFrom\": \"Document\",\n          \"tableTo\": \"User\",\n          \"columnsFrom\": [\"userId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {\n        \"Document_id_createdAt_pk\": {\n          \"name\": \"Document_id_createdAt_pk\",\n          \"columns\": [\"id\", \"createdAt\"]\n        }\n      },\n      \"uniqueConstraints\": {}\n    },\n    \"public.User\": {\n      \"name\": \"User\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"uuid\",\n          \"primaryKey\": true,\n          \"notNull\": true,\n          \"default\": \"gen_random_uuid()\"\n        },\n        \"email\": {\n          \"name\": \"email\",\n          \"type\": \"varchar(64)\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"password\": {\n          \"name\": \"password\",\n          \"type\": \"varchar(64)\",\n          \"primaryKey\": false,\n          \"notNull\": false\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {},\n      \"compositePrimaryKeys\": {},\n      \"uniqueConstraints\": {}\n    }\n  },\n  \"enums\": {},\n  \"schemas\": {},\n  \"sequences\": {},\n  \"_meta\": {\n    \"columns\": {},\n    \"schemas\": {},\n    \"tables\": {}\n  }\n}\n"
  },
  {
    "path": "lib/db/migrations/meta/0002_snapshot.json",
    "content": "{\n  \"id\": \"b5d8e862-936f-4419-a50f-97be3e7fe665\",\n  \"prevId\": \"f3d3437c-4735-4c91-80af-1014048a904e\",\n  \"version\": \"7\",\n  \"dialect\": \"postgresql\",\n  \"tables\": {\n    \"public.Suggestion\": {\n      \"name\": \"Suggestion\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"default\": \"gen_random_uuid()\"\n        },\n        \"documentId\": {\n          \"name\": \"documentId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"documentCreatedAt\": {\n          \"name\": \"documentCreatedAt\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"originalText\": {\n          \"name\": \"originalText\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"suggestedText\": {\n          \"name\": \"suggestedText\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"description\": {\n          \"name\": \"description\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": false\n        },\n        \"isResolved\": {\n          \"name\": \"isResolved\",\n          \"type\": \"boolean\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"default\": false\n        },\n        \"userId\": {\n          \"name\": \"userId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"createdAt\": {\n          \"name\": \"createdAt\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"Suggestion_userId_User_id_fk\": {\n          \"name\": \"Suggestion_userId_User_id_fk\",\n          \"tableFrom\": \"Suggestion\",\n          \"tableTo\": \"User\",\n          \"columnsFrom\": [\"userId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        },\n        \"Suggestion_documentId_documentCreatedAt_Document_id_createdAt_fk\": {\n          \"name\": \"Suggestion_documentId_documentCreatedAt_Document_id_createdAt_fk\",\n          \"tableFrom\": \"Suggestion\",\n          \"tableTo\": \"Document\",\n          \"columnsFrom\": [\"documentId\", \"documentCreatedAt\"],\n          \"columnsTo\": [\"id\", \"createdAt\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {\n        \"Suggestion_id_pk\": {\n          \"name\": \"Suggestion_id_pk\",\n          \"columns\": [\"id\"]\n        }\n      },\n      \"uniqueConstraints\": {}\n    },\n    \"public.Chat\": {\n      \"name\": \"Chat\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"uuid\",\n          \"primaryKey\": true,\n          \"notNull\": true,\n          \"default\": \"gen_random_uuid()\"\n        },\n        \"createdAt\": {\n          \"name\": \"createdAt\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"title\": {\n          \"name\": \"title\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"userId\": {\n          \"name\": \"userId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"Chat_userId_User_id_fk\": {\n          \"name\": \"Chat_userId_User_id_fk\",\n          \"tableFrom\": \"Chat\",\n          \"tableTo\": \"User\",\n          \"columnsFrom\": [\"userId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {},\n      \"uniqueConstraints\": {}\n    },\n    \"public.Document\": {\n      \"name\": \"Document\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"default\": \"gen_random_uuid()\"\n        },\n        \"createdAt\": {\n          \"name\": \"createdAt\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"title\": {\n          \"name\": \"title\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"content\": {\n          \"name\": \"content\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": false\n        },\n        \"userId\": {\n          \"name\": \"userId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"Document_userId_User_id_fk\": {\n          \"name\": \"Document_userId_User_id_fk\",\n          \"tableFrom\": \"Document\",\n          \"tableTo\": \"User\",\n          \"columnsFrom\": [\"userId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {\n        \"Document_id_createdAt_pk\": {\n          \"name\": \"Document_id_createdAt_pk\",\n          \"columns\": [\"id\", \"createdAt\"]\n        }\n      },\n      \"uniqueConstraints\": {}\n    },\n    \"public.Message\": {\n      \"name\": \"Message\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"uuid\",\n          \"primaryKey\": true,\n          \"notNull\": true,\n          \"default\": \"gen_random_uuid()\"\n        },\n        \"chatId\": {\n          \"name\": \"chatId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"role\": {\n          \"name\": \"role\",\n          \"type\": \"varchar\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"content\": {\n          \"name\": \"content\",\n          \"type\": \"json\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"createdAt\": {\n          \"name\": \"createdAt\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"Message_chatId_Chat_id_fk\": {\n          \"name\": \"Message_chatId_Chat_id_fk\",\n          \"tableFrom\": \"Message\",\n          \"tableTo\": \"Chat\",\n          \"columnsFrom\": [\"chatId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {},\n      \"uniqueConstraints\": {}\n    },\n    \"public.User\": {\n      \"name\": \"User\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"uuid\",\n          \"primaryKey\": true,\n          \"notNull\": true,\n          \"default\": \"gen_random_uuid()\"\n        },\n        \"email\": {\n          \"name\": \"email\",\n          \"type\": \"varchar(64)\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"password\": {\n          \"name\": \"password\",\n          \"type\": \"varchar(64)\",\n          \"primaryKey\": false,\n          \"notNull\": false\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {},\n      \"compositePrimaryKeys\": {},\n      \"uniqueConstraints\": {}\n    },\n    \"public.Vote\": {\n      \"name\": \"Vote\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"chatId\": {\n          \"name\": \"chatId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"messageId\": {\n          \"name\": \"messageId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"isUpvoted\": {\n          \"name\": \"isUpvoted\",\n          \"type\": \"boolean\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"Vote_chatId_Chat_id_fk\": {\n          \"name\": \"Vote_chatId_Chat_id_fk\",\n          \"tableFrom\": \"Vote\",\n          \"tableTo\": \"Chat\",\n          \"columnsFrom\": [\"chatId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        },\n        \"Vote_messageId_Message_id_fk\": {\n          \"name\": \"Vote_messageId_Message_id_fk\",\n          \"tableFrom\": \"Vote\",\n          \"tableTo\": \"Message\",\n          \"columnsFrom\": [\"messageId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {\n        \"Vote_chatId_messageId_pk\": {\n          \"name\": \"Vote_chatId_messageId_pk\",\n          \"columns\": [\"chatId\", \"messageId\"]\n        }\n      },\n      \"uniqueConstraints\": {}\n    }\n  },\n  \"enums\": {},\n  \"schemas\": {},\n  \"sequences\": {},\n  \"_meta\": {\n    \"columns\": {},\n    \"schemas\": {},\n    \"tables\": {}\n  }\n}\n"
  },
  {
    "path": "lib/db/migrations/meta/0003_snapshot.json",
    "content": "{\n  \"id\": \"011efa9e-42c7-4ff6-830a-02106f6638c9\",\n  \"prevId\": \"b5d8e862-936f-4419-a50f-97be3e7fe665\",\n  \"version\": \"7\",\n  \"dialect\": \"postgresql\",\n  \"tables\": {\n    \"public.Chat\": {\n      \"name\": \"Chat\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"uuid\",\n          \"primaryKey\": true,\n          \"notNull\": true,\n          \"default\": \"gen_random_uuid()\"\n        },\n        \"createdAt\": {\n          \"name\": \"createdAt\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"title\": {\n          \"name\": \"title\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"userId\": {\n          \"name\": \"userId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"visibility\": {\n          \"name\": \"visibility\",\n          \"type\": \"varchar\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"default\": \"'private'\"\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"Chat_userId_User_id_fk\": {\n          \"name\": \"Chat_userId_User_id_fk\",\n          \"tableFrom\": \"Chat\",\n          \"tableTo\": \"User\",\n          \"columnsFrom\": [\"userId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {},\n      \"uniqueConstraints\": {}\n    },\n    \"public.Document\": {\n      \"name\": \"Document\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"default\": \"gen_random_uuid()\"\n        },\n        \"createdAt\": {\n          \"name\": \"createdAt\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"title\": {\n          \"name\": \"title\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"content\": {\n          \"name\": \"content\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": false\n        },\n        \"userId\": {\n          \"name\": \"userId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"Document_userId_User_id_fk\": {\n          \"name\": \"Document_userId_User_id_fk\",\n          \"tableFrom\": \"Document\",\n          \"tableTo\": \"User\",\n          \"columnsFrom\": [\"userId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {\n        \"Document_id_createdAt_pk\": {\n          \"name\": \"Document_id_createdAt_pk\",\n          \"columns\": [\"id\", \"createdAt\"]\n        }\n      },\n      \"uniqueConstraints\": {}\n    },\n    \"public.Message\": {\n      \"name\": \"Message\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"uuid\",\n          \"primaryKey\": true,\n          \"notNull\": true,\n          \"default\": \"gen_random_uuid()\"\n        },\n        \"chatId\": {\n          \"name\": \"chatId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"role\": {\n          \"name\": \"role\",\n          \"type\": \"varchar\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"content\": {\n          \"name\": \"content\",\n          \"type\": \"json\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"createdAt\": {\n          \"name\": \"createdAt\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"Message_chatId_Chat_id_fk\": {\n          \"name\": \"Message_chatId_Chat_id_fk\",\n          \"tableFrom\": \"Message\",\n          \"tableTo\": \"Chat\",\n          \"columnsFrom\": [\"chatId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {},\n      \"uniqueConstraints\": {}\n    },\n    \"public.Suggestion\": {\n      \"name\": \"Suggestion\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"default\": \"gen_random_uuid()\"\n        },\n        \"documentId\": {\n          \"name\": \"documentId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"documentCreatedAt\": {\n          \"name\": \"documentCreatedAt\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"originalText\": {\n          \"name\": \"originalText\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"suggestedText\": {\n          \"name\": \"suggestedText\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"description\": {\n          \"name\": \"description\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": false\n        },\n        \"isResolved\": {\n          \"name\": \"isResolved\",\n          \"type\": \"boolean\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"default\": false\n        },\n        \"userId\": {\n          \"name\": \"userId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"createdAt\": {\n          \"name\": \"createdAt\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"Suggestion_userId_User_id_fk\": {\n          \"name\": \"Suggestion_userId_User_id_fk\",\n          \"tableFrom\": \"Suggestion\",\n          \"tableTo\": \"User\",\n          \"columnsFrom\": [\"userId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        },\n        \"Suggestion_documentId_documentCreatedAt_Document_id_createdAt_fk\": {\n          \"name\": \"Suggestion_documentId_documentCreatedAt_Document_id_createdAt_fk\",\n          \"tableFrom\": \"Suggestion\",\n          \"tableTo\": \"Document\",\n          \"columnsFrom\": [\"documentId\", \"documentCreatedAt\"],\n          \"columnsTo\": [\"id\", \"createdAt\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {\n        \"Suggestion_id_pk\": {\n          \"name\": \"Suggestion_id_pk\",\n          \"columns\": [\"id\"]\n        }\n      },\n      \"uniqueConstraints\": {}\n    },\n    \"public.User\": {\n      \"name\": \"User\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"uuid\",\n          \"primaryKey\": true,\n          \"notNull\": true,\n          \"default\": \"gen_random_uuid()\"\n        },\n        \"email\": {\n          \"name\": \"email\",\n          \"type\": \"varchar(64)\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"password\": {\n          \"name\": \"password\",\n          \"type\": \"varchar(64)\",\n          \"primaryKey\": false,\n          \"notNull\": false\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {},\n      \"compositePrimaryKeys\": {},\n      \"uniqueConstraints\": {}\n    },\n    \"public.Vote\": {\n      \"name\": \"Vote\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"chatId\": {\n          \"name\": \"chatId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"messageId\": {\n          \"name\": \"messageId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"isUpvoted\": {\n          \"name\": \"isUpvoted\",\n          \"type\": \"boolean\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"Vote_chatId_Chat_id_fk\": {\n          \"name\": \"Vote_chatId_Chat_id_fk\",\n          \"tableFrom\": \"Vote\",\n          \"tableTo\": \"Chat\",\n          \"columnsFrom\": [\"chatId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        },\n        \"Vote_messageId_Message_id_fk\": {\n          \"name\": \"Vote_messageId_Message_id_fk\",\n          \"tableFrom\": \"Vote\",\n          \"tableTo\": \"Message\",\n          \"columnsFrom\": [\"messageId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {\n        \"Vote_chatId_messageId_pk\": {\n          \"name\": \"Vote_chatId_messageId_pk\",\n          \"columns\": [\"chatId\", \"messageId\"]\n        }\n      },\n      \"uniqueConstraints\": {}\n    }\n  },\n  \"enums\": {},\n  \"schemas\": {},\n  \"sequences\": {},\n  \"_meta\": {\n    \"columns\": {},\n    \"schemas\": {},\n    \"tables\": {}\n  }\n}\n"
  },
  {
    "path": "lib/db/migrations/meta/0004_snapshot.json",
    "content": "{\n  \"id\": \"30ad8233-1432-428b-93fc-2bb1ba867ff1\",\n  \"prevId\": \"011efa9e-42c7-4ff6-830a-02106f6638c9\",\n  \"version\": \"7\",\n  \"dialect\": \"postgresql\",\n  \"tables\": {\n    \"public.Chat\": {\n      \"name\": \"Chat\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"uuid\",\n          \"primaryKey\": true,\n          \"notNull\": true,\n          \"default\": \"gen_random_uuid()\"\n        },\n        \"createdAt\": {\n          \"name\": \"createdAt\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"title\": {\n          \"name\": \"title\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"userId\": {\n          \"name\": \"userId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"visibility\": {\n          \"name\": \"visibility\",\n          \"type\": \"varchar\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"default\": \"'private'\"\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"Chat_userId_User_id_fk\": {\n          \"name\": \"Chat_userId_User_id_fk\",\n          \"tableFrom\": \"Chat\",\n          \"tableTo\": \"User\",\n          \"columnsFrom\": [\"userId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {},\n      \"uniqueConstraints\": {}\n    },\n    \"public.Document\": {\n      \"name\": \"Document\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"default\": \"gen_random_uuid()\"\n        },\n        \"createdAt\": {\n          \"name\": \"createdAt\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"title\": {\n          \"name\": \"title\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"content\": {\n          \"name\": \"content\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": false\n        },\n        \"text\": {\n          \"name\": \"text\",\n          \"type\": \"varchar\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"default\": \"'text'\"\n        },\n        \"userId\": {\n          \"name\": \"userId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"Document_userId_User_id_fk\": {\n          \"name\": \"Document_userId_User_id_fk\",\n          \"tableFrom\": \"Document\",\n          \"tableTo\": \"User\",\n          \"columnsFrom\": [\"userId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {\n        \"Document_id_createdAt_pk\": {\n          \"name\": \"Document_id_createdAt_pk\",\n          \"columns\": [\"id\", \"createdAt\"]\n        }\n      },\n      \"uniqueConstraints\": {}\n    },\n    \"public.Message\": {\n      \"name\": \"Message\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"uuid\",\n          \"primaryKey\": true,\n          \"notNull\": true,\n          \"default\": \"gen_random_uuid()\"\n        },\n        \"chatId\": {\n          \"name\": \"chatId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"role\": {\n          \"name\": \"role\",\n          \"type\": \"varchar\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"content\": {\n          \"name\": \"content\",\n          \"type\": \"json\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"createdAt\": {\n          \"name\": \"createdAt\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"Message_chatId_Chat_id_fk\": {\n          \"name\": \"Message_chatId_Chat_id_fk\",\n          \"tableFrom\": \"Message\",\n          \"tableTo\": \"Chat\",\n          \"columnsFrom\": [\"chatId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {},\n      \"uniqueConstraints\": {}\n    },\n    \"public.Suggestion\": {\n      \"name\": \"Suggestion\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"default\": \"gen_random_uuid()\"\n        },\n        \"documentId\": {\n          \"name\": \"documentId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"documentCreatedAt\": {\n          \"name\": \"documentCreatedAt\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"originalText\": {\n          \"name\": \"originalText\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"suggestedText\": {\n          \"name\": \"suggestedText\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"description\": {\n          \"name\": \"description\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": false\n        },\n        \"isResolved\": {\n          \"name\": \"isResolved\",\n          \"type\": \"boolean\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"default\": false\n        },\n        \"userId\": {\n          \"name\": \"userId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"createdAt\": {\n          \"name\": \"createdAt\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"Suggestion_userId_User_id_fk\": {\n          \"name\": \"Suggestion_userId_User_id_fk\",\n          \"tableFrom\": \"Suggestion\",\n          \"tableTo\": \"User\",\n          \"columnsFrom\": [\"userId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        },\n        \"Suggestion_documentId_documentCreatedAt_Document_id_createdAt_fk\": {\n          \"name\": \"Suggestion_documentId_documentCreatedAt_Document_id_createdAt_fk\",\n          \"tableFrom\": \"Suggestion\",\n          \"tableTo\": \"Document\",\n          \"columnsFrom\": [\"documentId\", \"documentCreatedAt\"],\n          \"columnsTo\": [\"id\", \"createdAt\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {\n        \"Suggestion_id_pk\": {\n          \"name\": \"Suggestion_id_pk\",\n          \"columns\": [\"id\"]\n        }\n      },\n      \"uniqueConstraints\": {}\n    },\n    \"public.User\": {\n      \"name\": \"User\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"uuid\",\n          \"primaryKey\": true,\n          \"notNull\": true,\n          \"default\": \"gen_random_uuid()\"\n        },\n        \"email\": {\n          \"name\": \"email\",\n          \"type\": \"varchar(64)\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"password\": {\n          \"name\": \"password\",\n          \"type\": \"varchar(64)\",\n          \"primaryKey\": false,\n          \"notNull\": false\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {},\n      \"compositePrimaryKeys\": {},\n      \"uniqueConstraints\": {}\n    },\n    \"public.Vote\": {\n      \"name\": \"Vote\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"chatId\": {\n          \"name\": \"chatId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"messageId\": {\n          \"name\": \"messageId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"isUpvoted\": {\n          \"name\": \"isUpvoted\",\n          \"type\": \"boolean\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"Vote_chatId_Chat_id_fk\": {\n          \"name\": \"Vote_chatId_Chat_id_fk\",\n          \"tableFrom\": \"Vote\",\n          \"tableTo\": \"Chat\",\n          \"columnsFrom\": [\"chatId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        },\n        \"Vote_messageId_Message_id_fk\": {\n          \"name\": \"Vote_messageId_Message_id_fk\",\n          \"tableFrom\": \"Vote\",\n          \"tableTo\": \"Message\",\n          \"columnsFrom\": [\"messageId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {\n        \"Vote_chatId_messageId_pk\": {\n          \"name\": \"Vote_chatId_messageId_pk\",\n          \"columns\": [\"chatId\", \"messageId\"]\n        }\n      },\n      \"uniqueConstraints\": {}\n    }\n  },\n  \"enums\": {},\n  \"schemas\": {},\n  \"sequences\": {},\n  \"_meta\": {\n    \"columns\": {},\n    \"schemas\": {},\n    \"tables\": {}\n  }\n}\n"
  },
  {
    "path": "lib/db/migrations/meta/0005_snapshot.json",
    "content": "{\n  \"id\": \"c6c102e6-b64e-4f0c-a7a6-32df758de437\",\n  \"prevId\": \"30ad8233-1432-428b-93fc-2bb1ba867ff1\",\n  \"version\": \"7\",\n  \"dialect\": \"postgresql\",\n  \"tables\": {\n    \"public.Chat\": {\n      \"name\": \"Chat\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"uuid\",\n          \"primaryKey\": true,\n          \"notNull\": true,\n          \"default\": \"gen_random_uuid()\"\n        },\n        \"createdAt\": {\n          \"name\": \"createdAt\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"title\": {\n          \"name\": \"title\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"userId\": {\n          \"name\": \"userId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"visibility\": {\n          \"name\": \"visibility\",\n          \"type\": \"varchar\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"default\": \"'private'\"\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"Chat_userId_User_id_fk\": {\n          \"name\": \"Chat_userId_User_id_fk\",\n          \"tableFrom\": \"Chat\",\n          \"tableTo\": \"User\",\n          \"columnsFrom\": [\"userId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {},\n      \"uniqueConstraints\": {}\n    },\n    \"public.Document\": {\n      \"name\": \"Document\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"default\": \"gen_random_uuid()\"\n        },\n        \"createdAt\": {\n          \"name\": \"createdAt\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"title\": {\n          \"name\": \"title\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"content\": {\n          \"name\": \"content\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": false\n        },\n        \"text\": {\n          \"name\": \"text\",\n          \"type\": \"varchar\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"default\": \"'text'\"\n        },\n        \"userId\": {\n          \"name\": \"userId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"Document_userId_User_id_fk\": {\n          \"name\": \"Document_userId_User_id_fk\",\n          \"tableFrom\": \"Document\",\n          \"tableTo\": \"User\",\n          \"columnsFrom\": [\"userId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {\n        \"Document_id_createdAt_pk\": {\n          \"name\": \"Document_id_createdAt_pk\",\n          \"columns\": [\"id\", \"createdAt\"]\n        }\n      },\n      \"uniqueConstraints\": {}\n    },\n    \"public.Message_v2\": {\n      \"name\": \"Message_v2\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"uuid\",\n          \"primaryKey\": true,\n          \"notNull\": true,\n          \"default\": \"gen_random_uuid()\"\n        },\n        \"chatId\": {\n          \"name\": \"chatId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"role\": {\n          \"name\": \"role\",\n          \"type\": \"varchar\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"parts\": {\n          \"name\": \"parts\",\n          \"type\": \"json\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"attachments\": {\n          \"name\": \"attachments\",\n          \"type\": \"json\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"createdAt\": {\n          \"name\": \"createdAt\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"Message_v2_chatId_Chat_id_fk\": {\n          \"name\": \"Message_v2_chatId_Chat_id_fk\",\n          \"tableFrom\": \"Message_v2\",\n          \"tableTo\": \"Chat\",\n          \"columnsFrom\": [\"chatId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {},\n      \"uniqueConstraints\": {}\n    },\n    \"public.Message\": {\n      \"name\": \"Message\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"uuid\",\n          \"primaryKey\": true,\n          \"notNull\": true,\n          \"default\": \"gen_random_uuid()\"\n        },\n        \"chatId\": {\n          \"name\": \"chatId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"role\": {\n          \"name\": \"role\",\n          \"type\": \"varchar\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"content\": {\n          \"name\": \"content\",\n          \"type\": \"json\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"createdAt\": {\n          \"name\": \"createdAt\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"Message_chatId_Chat_id_fk\": {\n          \"name\": \"Message_chatId_Chat_id_fk\",\n          \"tableFrom\": \"Message\",\n          \"tableTo\": \"Chat\",\n          \"columnsFrom\": [\"chatId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {},\n      \"uniqueConstraints\": {}\n    },\n    \"public.Suggestion\": {\n      \"name\": \"Suggestion\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"default\": \"gen_random_uuid()\"\n        },\n        \"documentId\": {\n          \"name\": \"documentId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"documentCreatedAt\": {\n          \"name\": \"documentCreatedAt\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"originalText\": {\n          \"name\": \"originalText\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"suggestedText\": {\n          \"name\": \"suggestedText\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"description\": {\n          \"name\": \"description\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": false\n        },\n        \"isResolved\": {\n          \"name\": \"isResolved\",\n          \"type\": \"boolean\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"default\": false\n        },\n        \"userId\": {\n          \"name\": \"userId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"createdAt\": {\n          \"name\": \"createdAt\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"Suggestion_userId_User_id_fk\": {\n          \"name\": \"Suggestion_userId_User_id_fk\",\n          \"tableFrom\": \"Suggestion\",\n          \"tableTo\": \"User\",\n          \"columnsFrom\": [\"userId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        },\n        \"Suggestion_documentId_documentCreatedAt_Document_id_createdAt_fk\": {\n          \"name\": \"Suggestion_documentId_documentCreatedAt_Document_id_createdAt_fk\",\n          \"tableFrom\": \"Suggestion\",\n          \"tableTo\": \"Document\",\n          \"columnsFrom\": [\"documentId\", \"documentCreatedAt\"],\n          \"columnsTo\": [\"id\", \"createdAt\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {\n        \"Suggestion_id_pk\": {\n          \"name\": \"Suggestion_id_pk\",\n          \"columns\": [\"id\"]\n        }\n      },\n      \"uniqueConstraints\": {}\n    },\n    \"public.User\": {\n      \"name\": \"User\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"uuid\",\n          \"primaryKey\": true,\n          \"notNull\": true,\n          \"default\": \"gen_random_uuid()\"\n        },\n        \"email\": {\n          \"name\": \"email\",\n          \"type\": \"varchar(64)\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"password\": {\n          \"name\": \"password\",\n          \"type\": \"varchar(64)\",\n          \"primaryKey\": false,\n          \"notNull\": false\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {},\n      \"compositePrimaryKeys\": {},\n      \"uniqueConstraints\": {}\n    },\n    \"public.Vote_v2\": {\n      \"name\": \"Vote_v2\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"chatId\": {\n          \"name\": \"chatId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"messageId\": {\n          \"name\": \"messageId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"isUpvoted\": {\n          \"name\": \"isUpvoted\",\n          \"type\": \"boolean\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"Vote_v2_chatId_Chat_id_fk\": {\n          \"name\": \"Vote_v2_chatId_Chat_id_fk\",\n          \"tableFrom\": \"Vote_v2\",\n          \"tableTo\": \"Chat\",\n          \"columnsFrom\": [\"chatId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        },\n        \"Vote_v2_messageId_Message_v2_id_fk\": {\n          \"name\": \"Vote_v2_messageId_Message_v2_id_fk\",\n          \"tableFrom\": \"Vote_v2\",\n          \"tableTo\": \"Message_v2\",\n          \"columnsFrom\": [\"messageId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {\n        \"Vote_v2_chatId_messageId_pk\": {\n          \"name\": \"Vote_v2_chatId_messageId_pk\",\n          \"columns\": [\"chatId\", \"messageId\"]\n        }\n      },\n      \"uniqueConstraints\": {}\n    },\n    \"public.Vote\": {\n      \"name\": \"Vote\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"chatId\": {\n          \"name\": \"chatId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"messageId\": {\n          \"name\": \"messageId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"isUpvoted\": {\n          \"name\": \"isUpvoted\",\n          \"type\": \"boolean\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"Vote_chatId_Chat_id_fk\": {\n          \"name\": \"Vote_chatId_Chat_id_fk\",\n          \"tableFrom\": \"Vote\",\n          \"tableTo\": \"Chat\",\n          \"columnsFrom\": [\"chatId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        },\n        \"Vote_messageId_Message_id_fk\": {\n          \"name\": \"Vote_messageId_Message_id_fk\",\n          \"tableFrom\": \"Vote\",\n          \"tableTo\": \"Message\",\n          \"columnsFrom\": [\"messageId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {\n        \"Vote_chatId_messageId_pk\": {\n          \"name\": \"Vote_chatId_messageId_pk\",\n          \"columns\": [\"chatId\", \"messageId\"]\n        }\n      },\n      \"uniqueConstraints\": {}\n    }\n  },\n  \"enums\": {},\n  \"schemas\": {},\n  \"sequences\": {},\n  \"_meta\": {\n    \"columns\": {},\n    \"schemas\": {},\n    \"tables\": {}\n  }\n}\n"
  },
  {
    "path": "lib/db/migrations/meta/0006_snapshot.json",
    "content": "{\n  \"id\": \"443de550-b7e8-4bfb-b229-c12dc6c132f0\",\n  \"prevId\": \"c6c102e6-b64e-4f0c-a7a6-32df758de437\",\n  \"version\": \"7\",\n  \"dialect\": \"postgresql\",\n  \"tables\": {\n    \"public.Chat\": {\n      \"name\": \"Chat\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"uuid\",\n          \"primaryKey\": true,\n          \"notNull\": true,\n          \"default\": \"gen_random_uuid()\"\n        },\n        \"createdAt\": {\n          \"name\": \"createdAt\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"title\": {\n          \"name\": \"title\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"userId\": {\n          \"name\": \"userId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"visibility\": {\n          \"name\": \"visibility\",\n          \"type\": \"varchar\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"default\": \"'private'\"\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"Chat_userId_User_id_fk\": {\n          \"name\": \"Chat_userId_User_id_fk\",\n          \"tableFrom\": \"Chat\",\n          \"tableTo\": \"User\",\n          \"columnsFrom\": [\"userId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {},\n      \"uniqueConstraints\": {}\n    },\n    \"public.Document\": {\n      \"name\": \"Document\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"default\": \"gen_random_uuid()\"\n        },\n        \"createdAt\": {\n          \"name\": \"createdAt\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"title\": {\n          \"name\": \"title\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"content\": {\n          \"name\": \"content\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": false\n        },\n        \"text\": {\n          \"name\": \"text\",\n          \"type\": \"varchar\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"default\": \"'text'\"\n        },\n        \"userId\": {\n          \"name\": \"userId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"Document_userId_User_id_fk\": {\n          \"name\": \"Document_userId_User_id_fk\",\n          \"tableFrom\": \"Document\",\n          \"tableTo\": \"User\",\n          \"columnsFrom\": [\"userId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {\n        \"Document_id_createdAt_pk\": {\n          \"name\": \"Document_id_createdAt_pk\",\n          \"columns\": [\"id\", \"createdAt\"]\n        }\n      },\n      \"uniqueConstraints\": {}\n    },\n    \"public.Message_v2\": {\n      \"name\": \"Message_v2\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"uuid\",\n          \"primaryKey\": true,\n          \"notNull\": true,\n          \"default\": \"gen_random_uuid()\"\n        },\n        \"chatId\": {\n          \"name\": \"chatId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"role\": {\n          \"name\": \"role\",\n          \"type\": \"varchar\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"parts\": {\n          \"name\": \"parts\",\n          \"type\": \"json\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"attachments\": {\n          \"name\": \"attachments\",\n          \"type\": \"json\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"createdAt\": {\n          \"name\": \"createdAt\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"Message_v2_chatId_Chat_id_fk\": {\n          \"name\": \"Message_v2_chatId_Chat_id_fk\",\n          \"tableFrom\": \"Message_v2\",\n          \"tableTo\": \"Chat\",\n          \"columnsFrom\": [\"chatId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {},\n      \"uniqueConstraints\": {}\n    },\n    \"public.Message\": {\n      \"name\": \"Message\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"uuid\",\n          \"primaryKey\": true,\n          \"notNull\": true,\n          \"default\": \"gen_random_uuid()\"\n        },\n        \"chatId\": {\n          \"name\": \"chatId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"role\": {\n          \"name\": \"role\",\n          \"type\": \"varchar\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"content\": {\n          \"name\": \"content\",\n          \"type\": \"json\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"createdAt\": {\n          \"name\": \"createdAt\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"Message_chatId_Chat_id_fk\": {\n          \"name\": \"Message_chatId_Chat_id_fk\",\n          \"tableFrom\": \"Message\",\n          \"tableTo\": \"Chat\",\n          \"columnsFrom\": [\"chatId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {},\n      \"uniqueConstraints\": {}\n    },\n    \"public.Stream\": {\n      \"name\": \"Stream\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"default\": \"gen_random_uuid()\"\n        },\n        \"chatId\": {\n          \"name\": \"chatId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"createdAt\": {\n          \"name\": \"createdAt\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"Stream_chatId_Chat_id_fk\": {\n          \"name\": \"Stream_chatId_Chat_id_fk\",\n          \"tableFrom\": \"Stream\",\n          \"tableTo\": \"Chat\",\n          \"columnsFrom\": [\"chatId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {\n        \"Stream_id_pk\": {\n          \"name\": \"Stream_id_pk\",\n          \"columns\": [\"id\"]\n        }\n      },\n      \"uniqueConstraints\": {}\n    },\n    \"public.Suggestion\": {\n      \"name\": \"Suggestion\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"default\": \"gen_random_uuid()\"\n        },\n        \"documentId\": {\n          \"name\": \"documentId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"documentCreatedAt\": {\n          \"name\": \"documentCreatedAt\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"originalText\": {\n          \"name\": \"originalText\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"suggestedText\": {\n          \"name\": \"suggestedText\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"description\": {\n          \"name\": \"description\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": false\n        },\n        \"isResolved\": {\n          \"name\": \"isResolved\",\n          \"type\": \"boolean\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"default\": false\n        },\n        \"userId\": {\n          \"name\": \"userId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"createdAt\": {\n          \"name\": \"createdAt\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"Suggestion_userId_User_id_fk\": {\n          \"name\": \"Suggestion_userId_User_id_fk\",\n          \"tableFrom\": \"Suggestion\",\n          \"tableTo\": \"User\",\n          \"columnsFrom\": [\"userId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        },\n        \"Suggestion_documentId_documentCreatedAt_Document_id_createdAt_fk\": {\n          \"name\": \"Suggestion_documentId_documentCreatedAt_Document_id_createdAt_fk\",\n          \"tableFrom\": \"Suggestion\",\n          \"tableTo\": \"Document\",\n          \"columnsFrom\": [\"documentId\", \"documentCreatedAt\"],\n          \"columnsTo\": [\"id\", \"createdAt\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {\n        \"Suggestion_id_pk\": {\n          \"name\": \"Suggestion_id_pk\",\n          \"columns\": [\"id\"]\n        }\n      },\n      \"uniqueConstraints\": {}\n    },\n    \"public.User\": {\n      \"name\": \"User\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"uuid\",\n          \"primaryKey\": true,\n          \"notNull\": true,\n          \"default\": \"gen_random_uuid()\"\n        },\n        \"email\": {\n          \"name\": \"email\",\n          \"type\": \"varchar(64)\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"password\": {\n          \"name\": \"password\",\n          \"type\": \"varchar(64)\",\n          \"primaryKey\": false,\n          \"notNull\": false\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {},\n      \"compositePrimaryKeys\": {},\n      \"uniqueConstraints\": {}\n    },\n    \"public.Vote_v2\": {\n      \"name\": \"Vote_v2\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"chatId\": {\n          \"name\": \"chatId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"messageId\": {\n          \"name\": \"messageId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"isUpvoted\": {\n          \"name\": \"isUpvoted\",\n          \"type\": \"boolean\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"Vote_v2_chatId_Chat_id_fk\": {\n          \"name\": \"Vote_v2_chatId_Chat_id_fk\",\n          \"tableFrom\": \"Vote_v2\",\n          \"tableTo\": \"Chat\",\n          \"columnsFrom\": [\"chatId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        },\n        \"Vote_v2_messageId_Message_v2_id_fk\": {\n          \"name\": \"Vote_v2_messageId_Message_v2_id_fk\",\n          \"tableFrom\": \"Vote_v2\",\n          \"tableTo\": \"Message_v2\",\n          \"columnsFrom\": [\"messageId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {\n        \"Vote_v2_chatId_messageId_pk\": {\n          \"name\": \"Vote_v2_chatId_messageId_pk\",\n          \"columns\": [\"chatId\", \"messageId\"]\n        }\n      },\n      \"uniqueConstraints\": {}\n    },\n    \"public.Vote\": {\n      \"name\": \"Vote\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"chatId\": {\n          \"name\": \"chatId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"messageId\": {\n          \"name\": \"messageId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"isUpvoted\": {\n          \"name\": \"isUpvoted\",\n          \"type\": \"boolean\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"Vote_chatId_Chat_id_fk\": {\n          \"name\": \"Vote_chatId_Chat_id_fk\",\n          \"tableFrom\": \"Vote\",\n          \"tableTo\": \"Chat\",\n          \"columnsFrom\": [\"chatId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        },\n        \"Vote_messageId_Message_id_fk\": {\n          \"name\": \"Vote_messageId_Message_id_fk\",\n          \"tableFrom\": \"Vote\",\n          \"tableTo\": \"Message\",\n          \"columnsFrom\": [\"messageId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {\n        \"Vote_chatId_messageId_pk\": {\n          \"name\": \"Vote_chatId_messageId_pk\",\n          \"columns\": [\"chatId\", \"messageId\"]\n        }\n      },\n      \"uniqueConstraints\": {}\n    }\n  },\n  \"enums\": {},\n  \"schemas\": {},\n  \"sequences\": {},\n  \"_meta\": {\n    \"columns\": {},\n    \"schemas\": {},\n    \"tables\": {}\n  }\n}\n"
  },
  {
    "path": "lib/db/migrations/meta/0007_snapshot.json",
    "content": "{\n  \"id\": \"097660a7-976a-4b3e-8ebb-79312e3ece6f\",\n  \"prevId\": \"443de550-b7e8-4bfb-b229-c12dc6c132f0\",\n  \"version\": \"7\",\n  \"dialect\": \"postgresql\",\n  \"tables\": {\n    \"public.Chat\": {\n      \"name\": \"Chat\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"uuid\",\n          \"primaryKey\": true,\n          \"notNull\": true,\n          \"default\": \"gen_random_uuid()\"\n        },\n        \"createdAt\": {\n          \"name\": \"createdAt\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"title\": {\n          \"name\": \"title\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"userId\": {\n          \"name\": \"userId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"visibility\": {\n          \"name\": \"visibility\",\n          \"type\": \"varchar\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"default\": \"'private'\"\n        },\n        \"lastContext\": {\n          \"name\": \"lastContext\",\n          \"type\": \"jsonb\",\n          \"primaryKey\": false,\n          \"notNull\": false\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"Chat_userId_User_id_fk\": {\n          \"name\": \"Chat_userId_User_id_fk\",\n          \"tableFrom\": \"Chat\",\n          \"tableTo\": \"User\",\n          \"columnsFrom\": [\"userId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {},\n      \"uniqueConstraints\": {}\n    },\n    \"public.Document\": {\n      \"name\": \"Document\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"default\": \"gen_random_uuid()\"\n        },\n        \"createdAt\": {\n          \"name\": \"createdAt\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"title\": {\n          \"name\": \"title\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"content\": {\n          \"name\": \"content\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": false\n        },\n        \"text\": {\n          \"name\": \"text\",\n          \"type\": \"varchar\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"default\": \"'text'\"\n        },\n        \"userId\": {\n          \"name\": \"userId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"Document_userId_User_id_fk\": {\n          \"name\": \"Document_userId_User_id_fk\",\n          \"tableFrom\": \"Document\",\n          \"tableTo\": \"User\",\n          \"columnsFrom\": [\"userId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {\n        \"Document_id_createdAt_pk\": {\n          \"name\": \"Document_id_createdAt_pk\",\n          \"columns\": [\"id\", \"createdAt\"]\n        }\n      },\n      \"uniqueConstraints\": {}\n    },\n    \"public.Message_v2\": {\n      \"name\": \"Message_v2\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"uuid\",\n          \"primaryKey\": true,\n          \"notNull\": true,\n          \"default\": \"gen_random_uuid()\"\n        },\n        \"chatId\": {\n          \"name\": \"chatId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"role\": {\n          \"name\": \"role\",\n          \"type\": \"varchar\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"parts\": {\n          \"name\": \"parts\",\n          \"type\": \"json\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"attachments\": {\n          \"name\": \"attachments\",\n          \"type\": \"json\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"createdAt\": {\n          \"name\": \"createdAt\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"Message_v2_chatId_Chat_id_fk\": {\n          \"name\": \"Message_v2_chatId_Chat_id_fk\",\n          \"tableFrom\": \"Message_v2\",\n          \"tableTo\": \"Chat\",\n          \"columnsFrom\": [\"chatId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {},\n      \"uniqueConstraints\": {}\n    },\n    \"public.Message\": {\n      \"name\": \"Message\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"uuid\",\n          \"primaryKey\": true,\n          \"notNull\": true,\n          \"default\": \"gen_random_uuid()\"\n        },\n        \"chatId\": {\n          \"name\": \"chatId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"role\": {\n          \"name\": \"role\",\n          \"type\": \"varchar\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"content\": {\n          \"name\": \"content\",\n          \"type\": \"json\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"createdAt\": {\n          \"name\": \"createdAt\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"Message_chatId_Chat_id_fk\": {\n          \"name\": \"Message_chatId_Chat_id_fk\",\n          \"tableFrom\": \"Message\",\n          \"tableTo\": \"Chat\",\n          \"columnsFrom\": [\"chatId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {},\n      \"uniqueConstraints\": {}\n    },\n    \"public.Stream\": {\n      \"name\": \"Stream\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"default\": \"gen_random_uuid()\"\n        },\n        \"chatId\": {\n          \"name\": \"chatId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"createdAt\": {\n          \"name\": \"createdAt\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"Stream_chatId_Chat_id_fk\": {\n          \"name\": \"Stream_chatId_Chat_id_fk\",\n          \"tableFrom\": \"Stream\",\n          \"tableTo\": \"Chat\",\n          \"columnsFrom\": [\"chatId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {\n        \"Stream_id_pk\": {\n          \"name\": \"Stream_id_pk\",\n          \"columns\": [\"id\"]\n        }\n      },\n      \"uniqueConstraints\": {}\n    },\n    \"public.Suggestion\": {\n      \"name\": \"Suggestion\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"default\": \"gen_random_uuid()\"\n        },\n        \"documentId\": {\n          \"name\": \"documentId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"documentCreatedAt\": {\n          \"name\": \"documentCreatedAt\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"originalText\": {\n          \"name\": \"originalText\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"suggestedText\": {\n          \"name\": \"suggestedText\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"description\": {\n          \"name\": \"description\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": false\n        },\n        \"isResolved\": {\n          \"name\": \"isResolved\",\n          \"type\": \"boolean\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"default\": false\n        },\n        \"userId\": {\n          \"name\": \"userId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"createdAt\": {\n          \"name\": \"createdAt\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"Suggestion_userId_User_id_fk\": {\n          \"name\": \"Suggestion_userId_User_id_fk\",\n          \"tableFrom\": \"Suggestion\",\n          \"tableTo\": \"User\",\n          \"columnsFrom\": [\"userId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        },\n        \"Suggestion_documentId_documentCreatedAt_Document_id_createdAt_fk\": {\n          \"name\": \"Suggestion_documentId_documentCreatedAt_Document_id_createdAt_fk\",\n          \"tableFrom\": \"Suggestion\",\n          \"tableTo\": \"Document\",\n          \"columnsFrom\": [\"documentId\", \"documentCreatedAt\"],\n          \"columnsTo\": [\"id\", \"createdAt\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {\n        \"Suggestion_id_pk\": {\n          \"name\": \"Suggestion_id_pk\",\n          \"columns\": [\"id\"]\n        }\n      },\n      \"uniqueConstraints\": {}\n    },\n    \"public.User\": {\n      \"name\": \"User\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"uuid\",\n          \"primaryKey\": true,\n          \"notNull\": true,\n          \"default\": \"gen_random_uuid()\"\n        },\n        \"email\": {\n          \"name\": \"email\",\n          \"type\": \"varchar(64)\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"password\": {\n          \"name\": \"password\",\n          \"type\": \"varchar(64)\",\n          \"primaryKey\": false,\n          \"notNull\": false\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {},\n      \"compositePrimaryKeys\": {},\n      \"uniqueConstraints\": {}\n    },\n    \"public.Vote_v2\": {\n      \"name\": \"Vote_v2\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"chatId\": {\n          \"name\": \"chatId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"messageId\": {\n          \"name\": \"messageId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"isUpvoted\": {\n          \"name\": \"isUpvoted\",\n          \"type\": \"boolean\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"Vote_v2_chatId_Chat_id_fk\": {\n          \"name\": \"Vote_v2_chatId_Chat_id_fk\",\n          \"tableFrom\": \"Vote_v2\",\n          \"tableTo\": \"Chat\",\n          \"columnsFrom\": [\"chatId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        },\n        \"Vote_v2_messageId_Message_v2_id_fk\": {\n          \"name\": \"Vote_v2_messageId_Message_v2_id_fk\",\n          \"tableFrom\": \"Vote_v2\",\n          \"tableTo\": \"Message_v2\",\n          \"columnsFrom\": [\"messageId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {\n        \"Vote_v2_chatId_messageId_pk\": {\n          \"name\": \"Vote_v2_chatId_messageId_pk\",\n          \"columns\": [\"chatId\", \"messageId\"]\n        }\n      },\n      \"uniqueConstraints\": {}\n    },\n    \"public.Vote\": {\n      \"name\": \"Vote\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"chatId\": {\n          \"name\": \"chatId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"messageId\": {\n          \"name\": \"messageId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"isUpvoted\": {\n          \"name\": \"isUpvoted\",\n          \"type\": \"boolean\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"Vote_chatId_Chat_id_fk\": {\n          \"name\": \"Vote_chatId_Chat_id_fk\",\n          \"tableFrom\": \"Vote\",\n          \"tableTo\": \"Chat\",\n          \"columnsFrom\": [\"chatId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        },\n        \"Vote_messageId_Message_id_fk\": {\n          \"name\": \"Vote_messageId_Message_id_fk\",\n          \"tableFrom\": \"Vote\",\n          \"tableTo\": \"Message\",\n          \"columnsFrom\": [\"messageId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {\n        \"Vote_chatId_messageId_pk\": {\n          \"name\": \"Vote_chatId_messageId_pk\",\n          \"columns\": [\"chatId\", \"messageId\"]\n        }\n      },\n      \"uniqueConstraints\": {}\n    }\n  },\n  \"enums\": {},\n  \"schemas\": {},\n  \"sequences\": {},\n  \"_meta\": {\n    \"columns\": {},\n    \"schemas\": {},\n    \"tables\": {}\n  }\n}\n"
  },
  {
    "path": "lib/db/migrations/meta/0008_snapshot.json",
    "content": "{\n  \"id\": \"31934f42-f6af-42a3-9320-b2e86fb67e81\",\n  \"prevId\": \"097660a7-976a-4b3e-8ebb-79312e3ece6f\",\n  \"version\": \"7\",\n  \"dialect\": \"postgresql\",\n  \"tables\": {\n    \"public.Chat\": {\n      \"name\": \"Chat\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"uuid\",\n          \"primaryKey\": true,\n          \"notNull\": true,\n          \"default\": \"gen_random_uuid()\"\n        },\n        \"createdAt\": {\n          \"name\": \"createdAt\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"title\": {\n          \"name\": \"title\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"userId\": {\n          \"name\": \"userId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"visibility\": {\n          \"name\": \"visibility\",\n          \"type\": \"varchar\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"default\": \"'private'\"\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"Chat_userId_User_id_fk\": {\n          \"name\": \"Chat_userId_User_id_fk\",\n          \"tableFrom\": \"Chat\",\n          \"tableTo\": \"User\",\n          \"columnsFrom\": [\"userId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {},\n      \"uniqueConstraints\": {}\n    },\n    \"public.Document\": {\n      \"name\": \"Document\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"default\": \"gen_random_uuid()\"\n        },\n        \"createdAt\": {\n          \"name\": \"createdAt\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"title\": {\n          \"name\": \"title\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"content\": {\n          \"name\": \"content\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": false\n        },\n        \"text\": {\n          \"name\": \"text\",\n          \"type\": \"varchar\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"default\": \"'text'\"\n        },\n        \"userId\": {\n          \"name\": \"userId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"Document_userId_User_id_fk\": {\n          \"name\": \"Document_userId_User_id_fk\",\n          \"tableFrom\": \"Document\",\n          \"tableTo\": \"User\",\n          \"columnsFrom\": [\"userId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {\n        \"Document_id_createdAt_pk\": {\n          \"name\": \"Document_id_createdAt_pk\",\n          \"columns\": [\"id\", \"createdAt\"]\n        }\n      },\n      \"uniqueConstraints\": {}\n    },\n    \"public.Message_v2\": {\n      \"name\": \"Message_v2\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"uuid\",\n          \"primaryKey\": true,\n          \"notNull\": true,\n          \"default\": \"gen_random_uuid()\"\n        },\n        \"chatId\": {\n          \"name\": \"chatId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"role\": {\n          \"name\": \"role\",\n          \"type\": \"varchar\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"parts\": {\n          \"name\": \"parts\",\n          \"type\": \"json\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"attachments\": {\n          \"name\": \"attachments\",\n          \"type\": \"json\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"createdAt\": {\n          \"name\": \"createdAt\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"Message_v2_chatId_Chat_id_fk\": {\n          \"name\": \"Message_v2_chatId_Chat_id_fk\",\n          \"tableFrom\": \"Message_v2\",\n          \"tableTo\": \"Chat\",\n          \"columnsFrom\": [\"chatId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {},\n      \"uniqueConstraints\": {}\n    },\n    \"public.Message\": {\n      \"name\": \"Message\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"uuid\",\n          \"primaryKey\": true,\n          \"notNull\": true,\n          \"default\": \"gen_random_uuid()\"\n        },\n        \"chatId\": {\n          \"name\": \"chatId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"role\": {\n          \"name\": \"role\",\n          \"type\": \"varchar\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"content\": {\n          \"name\": \"content\",\n          \"type\": \"json\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"createdAt\": {\n          \"name\": \"createdAt\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"Message_chatId_Chat_id_fk\": {\n          \"name\": \"Message_chatId_Chat_id_fk\",\n          \"tableFrom\": \"Message\",\n          \"tableTo\": \"Chat\",\n          \"columnsFrom\": [\"chatId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {},\n      \"uniqueConstraints\": {}\n    },\n    \"public.Stream\": {\n      \"name\": \"Stream\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"default\": \"gen_random_uuid()\"\n        },\n        \"chatId\": {\n          \"name\": \"chatId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"createdAt\": {\n          \"name\": \"createdAt\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"Stream_chatId_Chat_id_fk\": {\n          \"name\": \"Stream_chatId_Chat_id_fk\",\n          \"tableFrom\": \"Stream\",\n          \"tableTo\": \"Chat\",\n          \"columnsFrom\": [\"chatId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {\n        \"Stream_id_pk\": {\n          \"name\": \"Stream_id_pk\",\n          \"columns\": [\"id\"]\n        }\n      },\n      \"uniqueConstraints\": {}\n    },\n    \"public.Suggestion\": {\n      \"name\": \"Suggestion\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"default\": \"gen_random_uuid()\"\n        },\n        \"documentId\": {\n          \"name\": \"documentId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"documentCreatedAt\": {\n          \"name\": \"documentCreatedAt\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"originalText\": {\n          \"name\": \"originalText\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"suggestedText\": {\n          \"name\": \"suggestedText\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"description\": {\n          \"name\": \"description\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": false\n        },\n        \"isResolved\": {\n          \"name\": \"isResolved\",\n          \"type\": \"boolean\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"default\": false\n        },\n        \"userId\": {\n          \"name\": \"userId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"createdAt\": {\n          \"name\": \"createdAt\",\n          \"type\": \"timestamp\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"Suggestion_userId_User_id_fk\": {\n          \"name\": \"Suggestion_userId_User_id_fk\",\n          \"tableFrom\": \"Suggestion\",\n          \"tableTo\": \"User\",\n          \"columnsFrom\": [\"userId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        },\n        \"Suggestion_documentId_documentCreatedAt_Document_id_createdAt_fk\": {\n          \"name\": \"Suggestion_documentId_documentCreatedAt_Document_id_createdAt_fk\",\n          \"tableFrom\": \"Suggestion\",\n          \"tableTo\": \"Document\",\n          \"columnsFrom\": [\"documentId\", \"documentCreatedAt\"],\n          \"columnsTo\": [\"id\", \"createdAt\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {\n        \"Suggestion_id_pk\": {\n          \"name\": \"Suggestion_id_pk\",\n          \"columns\": [\"id\"]\n        }\n      },\n      \"uniqueConstraints\": {}\n    },\n    \"public.User\": {\n      \"name\": \"User\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"uuid\",\n          \"primaryKey\": true,\n          \"notNull\": true,\n          \"default\": \"gen_random_uuid()\"\n        },\n        \"email\": {\n          \"name\": \"email\",\n          \"type\": \"varchar(64)\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"password\": {\n          \"name\": \"password\",\n          \"type\": \"varchar(64)\",\n          \"primaryKey\": false,\n          \"notNull\": false\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {},\n      \"compositePrimaryKeys\": {},\n      \"uniqueConstraints\": {}\n    },\n    \"public.Vote_v2\": {\n      \"name\": \"Vote_v2\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"chatId\": {\n          \"name\": \"chatId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"messageId\": {\n          \"name\": \"messageId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"isUpvoted\": {\n          \"name\": \"isUpvoted\",\n          \"type\": \"boolean\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"Vote_v2_chatId_Chat_id_fk\": {\n          \"name\": \"Vote_v2_chatId_Chat_id_fk\",\n          \"tableFrom\": \"Vote_v2\",\n          \"tableTo\": \"Chat\",\n          \"columnsFrom\": [\"chatId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        },\n        \"Vote_v2_messageId_Message_v2_id_fk\": {\n          \"name\": \"Vote_v2_messageId_Message_v2_id_fk\",\n          \"tableFrom\": \"Vote_v2\",\n          \"tableTo\": \"Message_v2\",\n          \"columnsFrom\": [\"messageId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {\n        \"Vote_v2_chatId_messageId_pk\": {\n          \"name\": \"Vote_v2_chatId_messageId_pk\",\n          \"columns\": [\"chatId\", \"messageId\"]\n        }\n      },\n      \"uniqueConstraints\": {}\n    },\n    \"public.Vote\": {\n      \"name\": \"Vote\",\n      \"schema\": \"\",\n      \"columns\": {\n        \"chatId\": {\n          \"name\": \"chatId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"messageId\": {\n          \"name\": \"messageId\",\n          \"type\": \"uuid\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        },\n        \"isUpvoted\": {\n          \"name\": \"isUpvoted\",\n          \"type\": \"boolean\",\n          \"primaryKey\": false,\n          \"notNull\": true\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"Vote_chatId_Chat_id_fk\": {\n          \"name\": \"Vote_chatId_Chat_id_fk\",\n          \"tableFrom\": \"Vote\",\n          \"tableTo\": \"Chat\",\n          \"columnsFrom\": [\"chatId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        },\n        \"Vote_messageId_Message_id_fk\": {\n          \"name\": \"Vote_messageId_Message_id_fk\",\n          \"tableFrom\": \"Vote\",\n          \"tableTo\": \"Message\",\n          \"columnsFrom\": [\"messageId\"],\n          \"columnsTo\": [\"id\"],\n          \"onDelete\": \"no action\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {\n        \"Vote_chatId_messageId_pk\": {\n          \"name\": \"Vote_chatId_messageId_pk\",\n          \"columns\": [\"chatId\", \"messageId\"]\n        }\n      },\n      \"uniqueConstraints\": {}\n    }\n  },\n  \"enums\": {},\n  \"schemas\": {},\n  \"sequences\": {},\n  \"_meta\": {\n    \"columns\": {},\n    \"schemas\": {},\n    \"tables\": {}\n  }\n}\n"
  },
  {
    "path": "lib/db/migrations/meta/_journal.json",
    "content": "{\n  \"version\": \"7\",\n  \"dialect\": \"postgresql\",\n  \"entries\": [\n    {\n      \"idx\": 0,\n      \"version\": \"7\",\n      \"when\": 1728598022383,\n      \"tag\": \"0000_keen_devos\",\n      \"breakpoints\": true\n    },\n    {\n      \"idx\": 1,\n      \"version\": \"7\",\n      \"when\": 1730207363999,\n      \"tag\": \"0001_sparkling_blue_marvel\",\n      \"breakpoints\": true\n    },\n    {\n      \"idx\": 2,\n      \"version\": \"7\",\n      \"when\": 1730725226313,\n      \"tag\": \"0002_wandering_riptide\",\n      \"breakpoints\": true\n    },\n    {\n      \"idx\": 3,\n      \"version\": \"7\",\n      \"when\": 1733403031014,\n      \"tag\": \"0003_cloudy_glorian\",\n      \"breakpoints\": true\n    },\n    {\n      \"idx\": 4,\n      \"version\": \"7\",\n      \"when\": 1733945232355,\n      \"tag\": \"0004_odd_slayback\",\n      \"breakpoints\": true\n    },\n    {\n      \"idx\": 5,\n      \"version\": \"7\",\n      \"when\": 1741934630596,\n      \"tag\": \"0005_wooden_whistler\",\n      \"breakpoints\": true\n    },\n    {\n      \"idx\": 6,\n      \"version\": \"7\",\n      \"when\": 1746118166211,\n      \"tag\": \"0006_marvelous_frog_thor\",\n      \"breakpoints\": true\n    },\n    {\n      \"idx\": 7,\n      \"version\": \"7\",\n      \"when\": 1757362773211,\n      \"tag\": \"0007_flowery_ben_parker\",\n      \"breakpoints\": true\n    },\n    {\n      \"idx\": 8,\n      \"version\": \"7\",\n      \"when\": 1768479010084,\n      \"tag\": \"0008_flat_forgotten_one\",\n      \"breakpoints\": true\n    }\n  ]\n}\n"
  },
  {
    "path": "lib/db/queries.ts",
    "content": "import \"server-only\";\n\nimport {\n  and,\n  asc,\n  count,\n  desc,\n  eq,\n  gt,\n  gte,\n  inArray,\n  lt,\n  type SQL,\n} from \"drizzle-orm\";\nimport { drizzle } from \"drizzle-orm/postgres-js\";\nimport postgres from \"postgres\";\nimport type { ArtifactKind } from \"@/components/artifact\";\nimport type { VisibilityType } from \"@/components/visibility-selector\";\nimport { ChatbotError } from \"../errors\";\nimport { generateUUID } from \"../utils\";\nimport {\n  type Chat,\n  chat,\n  type DBMessage,\n  document,\n  message,\n  type Suggestion,\n  stream,\n  suggestion,\n  type User,\n  user,\n  vote,\n} from \"./schema\";\nimport { generateHashedPassword } from \"./utils\";\n\n// Optionally, if not using email/pass login, you can\n// use the Drizzle adapter for Auth.js / NextAuth\n// https://authjs.dev/reference/adapter/drizzle\n\n// biome-ignore lint: Forbidden non-null assertion.\nconst client = postgres(process.env.POSTGRES_URL!);\nconst db = drizzle(client);\n\nexport async function getUser(email: string): Promise<User[]> {\n  try {\n    return await db.select().from(user).where(eq(user.email, email));\n  } catch (_error) {\n    throw new ChatbotError(\n      \"bad_request:database\",\n      \"Failed to get user by email\"\n    );\n  }\n}\n\nexport async function createUser(email: string, password: string) {\n  const hashedPassword = generateHashedPassword(password);\n\n  try {\n    return await db.insert(user).values({ email, password: hashedPassword });\n  } catch (_error) {\n    throw new ChatbotError(\"bad_request:database\", \"Failed to create user\");\n  }\n}\n\nexport async function createGuestUser() {\n  const email = `guest-${Date.now()}`;\n  const password = generateHashedPassword(generateUUID());\n\n  try {\n    return await db.insert(user).values({ email, password }).returning({\n      id: user.id,\n      email: user.email,\n    });\n  } catch (_error) {\n    throw new ChatbotError(\n      \"bad_request:database\",\n      \"Failed to create guest user\"\n    );\n  }\n}\n\nexport async function saveChat({\n  id,\n  userId,\n  title,\n  visibility,\n}: {\n  id: string;\n  userId: string;\n  title: string;\n  visibility: VisibilityType;\n}) {\n  try {\n    return await db.insert(chat).values({\n      id,\n      createdAt: new Date(),\n      userId,\n      title,\n      visibility,\n    });\n  } catch (_error) {\n    throw new ChatbotError(\"bad_request:database\", \"Failed to save chat\");\n  }\n}\n\nexport async function deleteChatById({ id }: { id: string }) {\n  try {\n    await db.delete(vote).where(eq(vote.chatId, id));\n    await db.delete(message).where(eq(message.chatId, id));\n    await db.delete(stream).where(eq(stream.chatId, id));\n\n    const [chatsDeleted] = await db\n      .delete(chat)\n      .where(eq(chat.id, id))\n      .returning();\n    return chatsDeleted;\n  } catch (_error) {\n    throw new ChatbotError(\n      \"bad_request:database\",\n      \"Failed to delete chat by id\"\n    );\n  }\n}\n\nexport async function deleteAllChatsByUserId({ userId }: { userId: string }) {\n  try {\n    const userChats = await db\n      .select({ id: chat.id })\n      .from(chat)\n      .where(eq(chat.userId, userId));\n\n    if (userChats.length === 0) {\n      return { deletedCount: 0 };\n    }\n\n    const chatIds = userChats.map((c) => c.id);\n\n    await db.delete(vote).where(inArray(vote.chatId, chatIds));\n    await db.delete(message).where(inArray(message.chatId, chatIds));\n    await db.delete(stream).where(inArray(stream.chatId, chatIds));\n\n    const deletedChats = await db\n      .delete(chat)\n      .where(eq(chat.userId, userId))\n      .returning();\n\n    return { deletedCount: deletedChats.length };\n  } catch (_error) {\n    throw new ChatbotError(\n      \"bad_request:database\",\n      \"Failed to delete all chats by user id\"\n    );\n  }\n}\n\nexport async function getChatsByUserId({\n  id,\n  limit,\n  startingAfter,\n  endingBefore,\n}: {\n  id: string;\n  limit: number;\n  startingAfter: string | null;\n  endingBefore: string | null;\n}) {\n  try {\n    const extendedLimit = limit + 1;\n\n    const query = (whereCondition?: SQL<any>) =>\n      db\n        .select()\n        .from(chat)\n        .where(\n          whereCondition\n            ? and(whereCondition, eq(chat.userId, id))\n            : eq(chat.userId, id)\n        )\n        .orderBy(desc(chat.createdAt))\n        .limit(extendedLimit);\n\n    let filteredChats: Chat[] = [];\n\n    if (startingAfter) {\n      const [selectedChat] = await db\n        .select()\n        .from(chat)\n        .where(eq(chat.id, startingAfter))\n        .limit(1);\n\n      if (!selectedChat) {\n        throw new ChatbotError(\n          \"not_found:database\",\n          `Chat with id ${startingAfter} not found`\n        );\n      }\n\n      filteredChats = await query(gt(chat.createdAt, selectedChat.createdAt));\n    } else if (endingBefore) {\n      const [selectedChat] = await db\n        .select()\n        .from(chat)\n        .where(eq(chat.id, endingBefore))\n        .limit(1);\n\n      if (!selectedChat) {\n        throw new ChatbotError(\n          \"not_found:database\",\n          `Chat with id ${endingBefore} not found`\n        );\n      }\n\n      filteredChats = await query(lt(chat.createdAt, selectedChat.createdAt));\n    } else {\n      filteredChats = await query();\n    }\n\n    const hasMore = filteredChats.length > limit;\n\n    return {\n      chats: hasMore ? filteredChats.slice(0, limit) : filteredChats,\n      hasMore,\n    };\n  } catch (_error) {\n    throw new ChatbotError(\n      \"bad_request:database\",\n      \"Failed to get chats by user id\"\n    );\n  }\n}\n\nexport async function getChatById({ id }: { id: string }) {\n  try {\n    const [selectedChat] = await db.select().from(chat).where(eq(chat.id, id));\n    if (!selectedChat) {\n      return null;\n    }\n\n    return selectedChat;\n  } catch (_error) {\n    throw new ChatbotError(\"bad_request:database\", \"Failed to get chat by id\");\n  }\n}\n\nexport async function saveMessages({ messages }: { messages: DBMessage[] }) {\n  try {\n    return await db.insert(message).values(messages);\n  } catch (_error) {\n    throw new ChatbotError(\"bad_request:database\", \"Failed to save messages\");\n  }\n}\n\nexport async function updateMessage({\n  id,\n  parts,\n}: {\n  id: string;\n  parts: DBMessage[\"parts\"];\n}) {\n  try {\n    return await db.update(message).set({ parts }).where(eq(message.id, id));\n  } catch (_error) {\n    throw new ChatbotError(\"bad_request:database\", \"Failed to update message\");\n  }\n}\n\nexport async function getMessagesByChatId({ id }: { id: string }) {\n  try {\n    return await db\n      .select()\n      .from(message)\n      .where(eq(message.chatId, id))\n      .orderBy(asc(message.createdAt));\n  } catch (_error) {\n    throw new ChatbotError(\n      \"bad_request:database\",\n      \"Failed to get messages by chat id\"\n    );\n  }\n}\n\nexport async function voteMessage({\n  chatId,\n  messageId,\n  type,\n}: {\n  chatId: string;\n  messageId: string;\n  type: \"up\" | \"down\";\n}) {\n  try {\n    const [existingVote] = await db\n      .select()\n      .from(vote)\n      .where(and(eq(vote.messageId, messageId)));\n\n    if (existingVote) {\n      return await db\n        .update(vote)\n        .set({ isUpvoted: type === \"up\" })\n        .where(and(eq(vote.messageId, messageId), eq(vote.chatId, chatId)));\n    }\n    return await db.insert(vote).values({\n      chatId,\n      messageId,\n      isUpvoted: type === \"up\",\n    });\n  } catch (_error) {\n    throw new ChatbotError(\"bad_request:database\", \"Failed to vote message\");\n  }\n}\n\nexport async function getVotesByChatId({ id }: { id: string }) {\n  try {\n    return await db.select().from(vote).where(eq(vote.chatId, id));\n  } catch (_error) {\n    throw new ChatbotError(\n      \"bad_request:database\",\n      \"Failed to get votes by chat id\"\n    );\n  }\n}\n\nexport async function saveDocument({\n  id,\n  title,\n  kind,\n  content,\n  userId,\n}: {\n  id: string;\n  title: string;\n  kind: ArtifactKind;\n  content: string;\n  userId: string;\n}) {\n  try {\n    return await db\n      .insert(document)\n      .values({\n        id,\n        title,\n        kind,\n        content,\n        userId,\n        createdAt: new Date(),\n      })\n      .returning();\n  } catch (_error) {\n    throw new ChatbotError(\"bad_request:database\", \"Failed to save document\");\n  }\n}\n\nexport async function getDocumentsById({ id }: { id: string }) {\n  try {\n    const documents = await db\n      .select()\n      .from(document)\n      .where(eq(document.id, id))\n      .orderBy(asc(document.createdAt));\n\n    return documents;\n  } catch (_error) {\n    throw new ChatbotError(\n      \"bad_request:database\",\n      \"Failed to get documents by id\"\n    );\n  }\n}\n\nexport async function getDocumentById({ id }: { id: string }) {\n  try {\n    const [selectedDocument] = await db\n      .select()\n      .from(document)\n      .where(eq(document.id, id))\n      .orderBy(desc(document.createdAt));\n\n    return selectedDocument;\n  } catch (_error) {\n    throw new ChatbotError(\n      \"bad_request:database\",\n      \"Failed to get document by id\"\n    );\n  }\n}\n\nexport async function deleteDocumentsByIdAfterTimestamp({\n  id,\n  timestamp,\n}: {\n  id: string;\n  timestamp: Date;\n}) {\n  try {\n    await db\n      .delete(suggestion)\n      .where(\n        and(\n          eq(suggestion.documentId, id),\n          gt(suggestion.documentCreatedAt, timestamp)\n        )\n      );\n\n    return await db\n      .delete(document)\n      .where(and(eq(document.id, id), gt(document.createdAt, timestamp)))\n      .returning();\n  } catch (_error) {\n    throw new ChatbotError(\n      \"bad_request:database\",\n      \"Failed to delete documents by id after timestamp\"\n    );\n  }\n}\n\nexport async function saveSuggestions({\n  suggestions,\n}: {\n  suggestions: Suggestion[];\n}) {\n  try {\n    return await db.insert(suggestion).values(suggestions);\n  } catch (_error) {\n    throw new ChatbotError(\n      \"bad_request:database\",\n      \"Failed to save suggestions\"\n    );\n  }\n}\n\nexport async function getSuggestionsByDocumentId({\n  documentId,\n}: {\n  documentId: string;\n}) {\n  try {\n    return await db\n      .select()\n      .from(suggestion)\n      .where(eq(suggestion.documentId, documentId));\n  } catch (_error) {\n    throw new ChatbotError(\n      \"bad_request:database\",\n      \"Failed to get suggestions by document id\"\n    );\n  }\n}\n\nexport async function getMessageById({ id }: { id: string }) {\n  try {\n    return await db.select().from(message).where(eq(message.id, id));\n  } catch (_error) {\n    throw new ChatbotError(\n      \"bad_request:database\",\n      \"Failed to get message by id\"\n    );\n  }\n}\n\nexport async function deleteMessagesByChatIdAfterTimestamp({\n  chatId,\n  timestamp,\n}: {\n  chatId: string;\n  timestamp: Date;\n}) {\n  try {\n    const messagesToDelete = await db\n      .select({ id: message.id })\n      .from(message)\n      .where(\n        and(eq(message.chatId, chatId), gte(message.createdAt, timestamp))\n      );\n\n    const messageIds = messagesToDelete.map(\n      (currentMessage) => currentMessage.id\n    );\n\n    if (messageIds.length > 0) {\n      await db\n        .delete(vote)\n        .where(\n          and(eq(vote.chatId, chatId), inArray(vote.messageId, messageIds))\n        );\n\n      return await db\n        .delete(message)\n        .where(\n          and(eq(message.chatId, chatId), inArray(message.id, messageIds))\n        );\n    }\n  } catch (_error) {\n    throw new ChatbotError(\n      \"bad_request:database\",\n      \"Failed to delete messages by chat id after timestamp\"\n    );\n  }\n}\n\nexport async function updateChatVisibilityById({\n  chatId,\n  visibility,\n}: {\n  chatId: string;\n  visibility: \"private\" | \"public\";\n}) {\n  try {\n    return await db.update(chat).set({ visibility }).where(eq(chat.id, chatId));\n  } catch (_error) {\n    throw new ChatbotError(\n      \"bad_request:database\",\n      \"Failed to update chat visibility by id\"\n    );\n  }\n}\n\nexport async function updateChatTitleById({\n  chatId,\n  title,\n}: {\n  chatId: string;\n  title: string;\n}) {\n  try {\n    return await db.update(chat).set({ title }).where(eq(chat.id, chatId));\n  } catch (error) {\n    console.warn(\"Failed to update title for chat\", chatId, error);\n    return;\n  }\n}\n\nexport async function getMessageCountByUserId({\n  id,\n  differenceInHours,\n}: {\n  id: string;\n  differenceInHours: number;\n}) {\n  try {\n    const twentyFourHoursAgo = new Date(\n      Date.now() - differenceInHours * 60 * 60 * 1000\n    );\n\n    const [stats] = await db\n      .select({ count: count(message.id) })\n      .from(message)\n      .innerJoin(chat, eq(message.chatId, chat.id))\n      .where(\n        and(\n          eq(chat.userId, id),\n          gte(message.createdAt, twentyFourHoursAgo),\n          eq(message.role, \"user\")\n        )\n      )\n      .execute();\n\n    return stats?.count ?? 0;\n  } catch (_error) {\n    throw new ChatbotError(\n      \"bad_request:database\",\n      \"Failed to get message count by user id\"\n    );\n  }\n}\n\nexport async function createStreamId({\n  streamId,\n  chatId,\n}: {\n  streamId: string;\n  chatId: string;\n}) {\n  try {\n    await db\n      .insert(stream)\n      .values({ id: streamId, chatId, createdAt: new Date() });\n  } catch (_error) {\n    throw new ChatbotError(\n      \"bad_request:database\",\n      \"Failed to create stream id\"\n    );\n  }\n}\n\nexport async function getStreamIdsByChatId({ chatId }: { chatId: string }) {\n  try {\n    const streamIds = await db\n      .select({ id: stream.id })\n      .from(stream)\n      .where(eq(stream.chatId, chatId))\n      .orderBy(asc(stream.createdAt))\n      .execute();\n\n    return streamIds.map(({ id }) => id);\n  } catch (_error) {\n    throw new ChatbotError(\n      \"bad_request:database\",\n      \"Failed to get stream ids by chat id\"\n    );\n  }\n}\n"
  },
  {
    "path": "lib/db/schema.ts",
    "content": "import type { InferSelectModel } from \"drizzle-orm\";\nimport {\n  boolean,\n  foreignKey,\n  json,\n  pgTable,\n  primaryKey,\n  text,\n  timestamp,\n  uuid,\n  varchar,\n} from \"drizzle-orm/pg-core\";\n\nexport const user = pgTable(\"User\", {\n  id: uuid(\"id\").primaryKey().notNull().defaultRandom(),\n  email: varchar(\"email\", { length: 64 }).notNull(),\n  password: varchar(\"password\", { length: 64 }),\n});\n\nexport type User = InferSelectModel<typeof user>;\n\nexport const chat = pgTable(\"Chat\", {\n  id: uuid(\"id\").primaryKey().notNull().defaultRandom(),\n  createdAt: timestamp(\"createdAt\").notNull(),\n  title: text(\"title\").notNull(),\n  userId: uuid(\"userId\")\n    .notNull()\n    .references(() => user.id),\n  visibility: varchar(\"visibility\", { enum: [\"public\", \"private\"] })\n    .notNull()\n    .default(\"private\"),\n});\n\nexport type Chat = InferSelectModel<typeof chat>;\n\n// DEPRECATED: The following schema is deprecated and will be removed in the future.\n// Read the migration guide at https://chatbot.dev/docs/migration-guides/message-parts\nexport const messageDeprecated = pgTable(\"Message\", {\n  id: uuid(\"id\").primaryKey().notNull().defaultRandom(),\n  chatId: uuid(\"chatId\")\n    .notNull()\n    .references(() => chat.id),\n  role: varchar(\"role\").notNull(),\n  content: json(\"content\").notNull(),\n  createdAt: timestamp(\"createdAt\").notNull(),\n});\n\nexport type MessageDeprecated = InferSelectModel<typeof messageDeprecated>;\n\nexport const message = pgTable(\"Message_v2\", {\n  id: uuid(\"id\").primaryKey().notNull().defaultRandom(),\n  chatId: uuid(\"chatId\")\n    .notNull()\n    .references(() => chat.id),\n  role: varchar(\"role\").notNull(),\n  parts: json(\"parts\").notNull(),\n  attachments: json(\"attachments\").notNull(),\n  createdAt: timestamp(\"createdAt\").notNull(),\n});\n\nexport type DBMessage = InferSelectModel<typeof message>;\n\n// DEPRECATED: The following schema is deprecated and will be removed in the future.\n// Read the migration guide at https://chatbot.dev/docs/migration-guides/message-parts\nexport const voteDeprecated = pgTable(\n  \"Vote\",\n  {\n    chatId: uuid(\"chatId\")\n      .notNull()\n      .references(() => chat.id),\n    messageId: uuid(\"messageId\")\n      .notNull()\n      .references(() => messageDeprecated.id),\n    isUpvoted: boolean(\"isUpvoted\").notNull(),\n  },\n  (table) => {\n    return {\n      pk: primaryKey({ columns: [table.chatId, table.messageId] }),\n    };\n  }\n);\n\nexport type VoteDeprecated = InferSelectModel<typeof voteDeprecated>;\n\nexport const vote = pgTable(\n  \"Vote_v2\",\n  {\n    chatId: uuid(\"chatId\")\n      .notNull()\n      .references(() => chat.id),\n    messageId: uuid(\"messageId\")\n      .notNull()\n      .references(() => message.id),\n    isUpvoted: boolean(\"isUpvoted\").notNull(),\n  },\n  (table) => {\n    return {\n      pk: primaryKey({ columns: [table.chatId, table.messageId] }),\n    };\n  }\n);\n\nexport type Vote = InferSelectModel<typeof vote>;\n\nexport const document = pgTable(\n  \"Document\",\n  {\n    id: uuid(\"id\").notNull().defaultRandom(),\n    createdAt: timestamp(\"createdAt\").notNull(),\n    title: text(\"title\").notNull(),\n    content: text(\"content\"),\n    kind: varchar(\"text\", { enum: [\"text\", \"code\", \"image\", \"sheet\"] })\n      .notNull()\n      .default(\"text\"),\n    userId: uuid(\"userId\")\n      .notNull()\n      .references(() => user.id),\n  },\n  (table) => {\n    return {\n      pk: primaryKey({ columns: [table.id, table.createdAt] }),\n    };\n  }\n);\n\nexport type Document = InferSelectModel<typeof document>;\n\nexport const suggestion = pgTable(\n  \"Suggestion\",\n  {\n    id: uuid(\"id\").notNull().defaultRandom(),\n    documentId: uuid(\"documentId\").notNull(),\n    documentCreatedAt: timestamp(\"documentCreatedAt\").notNull(),\n    originalText: text(\"originalText\").notNull(),\n    suggestedText: text(\"suggestedText\").notNull(),\n    description: text(\"description\"),\n    isResolved: boolean(\"isResolved\").notNull().default(false),\n    userId: uuid(\"userId\")\n      .notNull()\n      .references(() => user.id),\n    createdAt: timestamp(\"createdAt\").notNull(),\n  },\n  (table) => ({\n    pk: primaryKey({ columns: [table.id] }),\n    documentRef: foreignKey({\n      columns: [table.documentId, table.documentCreatedAt],\n      foreignColumns: [document.id, document.createdAt],\n    }),\n  })\n);\n\nexport type Suggestion = InferSelectModel<typeof suggestion>;\n\nexport const stream = pgTable(\n  \"Stream\",\n  {\n    id: uuid(\"id\").notNull().defaultRandom(),\n    chatId: uuid(\"chatId\").notNull(),\n    createdAt: timestamp(\"createdAt\").notNull(),\n  },\n  (table) => ({\n    pk: primaryKey({ columns: [table.id] }),\n    chatRef: foreignKey({\n      columns: [table.chatId],\n      foreignColumns: [chat.id],\n    }),\n  })\n);\n\nexport type Stream = InferSelectModel<typeof stream>;\n"
  },
  {
    "path": "lib/db/utils.ts",
    "content": "import { generateId } from \"ai\";\nimport { genSaltSync, hashSync } from \"bcrypt-ts\";\n\nexport function generateHashedPassword(password: string) {\n  const salt = genSaltSync(10);\n  const hash = hashSync(password, salt);\n\n  return hash;\n}\n\nexport function generateDummyPassword() {\n  const password = generateId();\n  const hashedPassword = generateHashedPassword(password);\n\n  return hashedPassword;\n}\n"
  },
  {
    "path": "lib/editor/config.ts",
    "content": "import { textblockTypeInputRule } from \"prosemirror-inputrules\";\nimport { Schema } from \"prosemirror-model\";\nimport { schema } from \"prosemirror-schema-basic\";\nimport { addListNodes } from \"prosemirror-schema-list\";\nimport type { Transaction } from \"prosemirror-state\";\nimport type { EditorView } from \"prosemirror-view\";\nimport type { MutableRefObject } from \"react\";\n\nimport { buildContentFromDocument } from \"./functions\";\n\nexport const documentSchema = new Schema({\n  nodes: addListNodes(schema.spec.nodes, \"paragraph block*\", \"block\"),\n  marks: schema.spec.marks,\n});\n\nexport function headingRule(level: number) {\n  return textblockTypeInputRule(\n    new RegExp(`^(#{1,${level}})\\\\s$`),\n    documentSchema.nodes.heading,\n    () => ({ level })\n  );\n}\n\nexport const handleTransaction = ({\n  transaction,\n  editorRef,\n  onSaveContent,\n}: {\n  transaction: Transaction;\n  editorRef: MutableRefObject<EditorView | null>;\n  onSaveContent: (updatedContent: string, debounce: boolean) => void;\n}) => {\n  if (!editorRef || !editorRef.current) {\n    return;\n  }\n\n  const newState = editorRef.current.state.apply(transaction);\n  editorRef.current.updateState(newState);\n\n  if (transaction.docChanged && !transaction.getMeta(\"no-save\")) {\n    const updatedContent = buildContentFromDocument(newState.doc);\n\n    if (transaction.getMeta(\"no-debounce\")) {\n      onSaveContent(updatedContent, false);\n    } else {\n      onSaveContent(updatedContent, true);\n    }\n  }\n};\n"
  },
  {
    "path": "lib/editor/diff.js",
    "content": "// Modified from https://github.com/hamflx/prosemirror-diff/blob/master/src/diff.js\n\nimport { diff_match_patch } from \"diff-match-patch\";\nimport { Fragment, Node } from \"prosemirror-model\";\n\nexport const DiffType = {\n  Unchanged: 0,\n  Deleted: -1,\n  Inserted: 1,\n};\n\nexport const patchDocumentNode = (schema, oldNode, newNode) => {\n  assertNodeTypeEqual(oldNode, newNode);\n\n  const finalLeftChildren = [];\n  const finalRightChildren = [];\n\n  const oldChildren = normalizeNodeContent(oldNode);\n  const newChildren = normalizeNodeContent(newNode);\n  const oldChildLen = oldChildren.length;\n  const newChildLen = newChildren.length;\n  const minChildLen = Math.min(oldChildLen, newChildLen);\n\n  let left = 0;\n  let right = 0;\n\n  for (; left < minChildLen; left++) {\n    const oldChild = oldChildren[left];\n    const newChild = newChildren[left];\n    if (!isNodeEqual(oldChild, newChild)) {\n      break;\n    }\n    finalLeftChildren.push(...ensureArray(oldChild));\n  }\n\n  for (; right + left + 1 < minChildLen; right++) {\n    const oldChild = oldChildren[oldChildLen - right - 1];\n    const newChild = newChildren[newChildLen - right - 1];\n    if (!isNodeEqual(oldChild, newChild)) {\n      break;\n    }\n    finalRightChildren.unshift(...ensureArray(oldChild));\n  }\n\n  const diffOldChildren = oldChildren.slice(left, oldChildLen - right);\n  const diffNewChildren = newChildren.slice(left, newChildLen - right);\n\n  if (diffOldChildren.length && diffNewChildren.length) {\n    const matchedNodes = matchNodes(\n      schema,\n      diffOldChildren,\n      diffNewChildren\n    ).sort((a, b) => b.count - a.count);\n    const bestMatch = matchedNodes[0];\n    if (bestMatch) {\n      const { oldStartIndex, newStartIndex, oldEndIndex, newEndIndex } =\n        bestMatch;\n      const oldBeforeMatchChildren = diffOldChildren.slice(0, oldStartIndex);\n      const newBeforeMatchChildren = diffNewChildren.slice(0, newStartIndex);\n\n      finalLeftChildren.push(\n        ...patchRemainNodes(\n          schema,\n          oldBeforeMatchChildren,\n          newBeforeMatchChildren\n        )\n      );\n      finalLeftChildren.push(\n        ...diffOldChildren.slice(oldStartIndex, oldEndIndex)\n      );\n\n      const oldAfterMatchChildren = diffOldChildren.slice(oldEndIndex);\n      const newAfterMatchChildren = diffNewChildren.slice(newEndIndex);\n\n      finalRightChildren.unshift(\n        ...patchRemainNodes(\n          schema,\n          oldAfterMatchChildren,\n          newAfterMatchChildren\n        )\n      );\n    } else {\n      finalLeftChildren.push(\n        ...patchRemainNodes(schema, diffOldChildren, diffNewChildren)\n      );\n    }\n  } else {\n    finalLeftChildren.push(\n      ...patchRemainNodes(schema, diffOldChildren, diffNewChildren)\n    );\n  }\n\n  return createNewNode(oldNode, [...finalLeftChildren, ...finalRightChildren]);\n};\n\nconst matchNodes = (_schema, oldChildren, newChildren) => {\n  const matches = [];\n  for (\n    let oldStartIndex = 0;\n    oldStartIndex < oldChildren.length;\n    oldStartIndex++\n  ) {\n    const oldStartNode = oldChildren[oldStartIndex];\n    const newStartIndex = findMatchNode(newChildren, oldStartNode);\n\n    if (newStartIndex !== -1) {\n      let oldEndIndex = oldStartIndex + 1;\n      let newEndIndex = newStartIndex + 1;\n      for (\n        ;\n        oldEndIndex < oldChildren.length && newEndIndex < newChildren.length;\n        oldEndIndex++, newEndIndex++\n      ) {\n        const oldEndNode = oldChildren[oldEndIndex];\n        if (!isNodeEqual(newChildren[newEndIndex], oldEndNode)) {\n          break;\n        }\n      }\n      matches.push({\n        oldStartIndex,\n        newStartIndex,\n        oldEndIndex,\n        newEndIndex,\n        count: newEndIndex - newStartIndex,\n      });\n    }\n  }\n  return matches;\n};\n\nconst findMatchNode = (children, node, startIndex = 0) => {\n  for (let i = startIndex; i < children.length; i++) {\n    if (isNodeEqual(children[i], node)) {\n      return i;\n    }\n  }\n  return -1;\n};\n\nconst patchRemainNodes = (schema, oldChildren, newChildren) => {\n  const finalLeftChildren = [];\n  const finalRightChildren = [];\n  const oldChildLen = oldChildren.length;\n  const newChildLen = newChildren.length;\n  let left = 0;\n  let right = 0;\n  while (oldChildLen - left - right > 0 && newChildLen - left - right > 0) {\n    const leftOldNode = oldChildren[left];\n    const leftNewNode = newChildren[left];\n    const rightOldNode = oldChildren[oldChildLen - right - 1];\n    const rightNewNode = newChildren[newChildLen - right - 1];\n    let updateLeft =\n      !isTextNode(leftOldNode) && matchNodeType(leftOldNode, leftNewNode);\n    let updateRight =\n      !isTextNode(rightOldNode) && matchNodeType(rightOldNode, rightNewNode);\n    if (Array.isArray(leftOldNode) && Array.isArray(leftNewNode)) {\n      finalLeftChildren.push(\n        ...patchTextNodes(schema, leftOldNode, leftNewNode)\n      );\n      left += 1;\n      continue;\n    }\n\n    if (updateLeft && updateRight) {\n      const equalityLeft = computeChildEqualityFactor(leftOldNode, leftNewNode);\n      const equalityRight = computeChildEqualityFactor(\n        rightOldNode,\n        rightNewNode\n      );\n      if (equalityLeft < equalityRight) {\n        updateLeft = false;\n      } else {\n        updateRight = false;\n      }\n    }\n    if (updateLeft) {\n      finalLeftChildren.push(\n        patchDocumentNode(schema, leftOldNode, leftNewNode)\n      );\n      left += 1;\n    } else if (updateRight) {\n      finalRightChildren.unshift(\n        patchDocumentNode(schema, rightOldNode, rightNewNode)\n      );\n      right += 1;\n    } else {\n      // Delete and insert\n      finalLeftChildren.push(\n        createDiffNode(schema, leftOldNode, DiffType.Deleted)\n      );\n      finalLeftChildren.push(\n        createDiffNode(schema, leftNewNode, DiffType.Inserted)\n      );\n      left += 1;\n    }\n  }\n\n  const deleteNodeLen = oldChildLen - left - right;\n  const insertNodeLen = newChildLen - left - right;\n  if (deleteNodeLen) {\n    finalLeftChildren.push(\n      ...oldChildren\n        .slice(left, left + deleteNodeLen)\n        .flat()\n        .map((node) => createDiffNode(schema, node, DiffType.Deleted))\n    );\n  }\n\n  if (insertNodeLen) {\n    finalRightChildren.unshift(\n      ...newChildren\n        .slice(left, left + insertNodeLen)\n        .flat()\n        .map((node) => createDiffNode(schema, node, DiffType.Inserted))\n    );\n  }\n\n  return [...finalLeftChildren, ...finalRightChildren];\n};\n\n// Updated function to perform sentence-level diffs\nexport const patchTextNodes = (schema, oldNode, newNode) => {\n  const dmp = new diff_match_patch();\n\n  // Concatenate the text from the text nodes\n  const oldText = oldNode.map((n) => getNodeText(n)).join(\"\");\n  const newText = newNode.map((n) => getNodeText(n)).join(\"\");\n\n  // Tokenize the text into sentences\n  const oldSentences = tokenizeSentences(oldText);\n  const newSentences = tokenizeSentences(newText);\n\n  // Map sentences to unique characters\n  const { chars1, chars2, lineArray } = sentencesToChars(\n    oldSentences,\n    newSentences\n  );\n\n  // Perform the diff\n  let diffs = dmp.diff_main(chars1, chars2, false);\n\n  // Convert back to sentences\n  diffs = diffs.map(([type, text]) => {\n    const sentences = text\n      .split(\"\")\n      .map((char) => lineArray[char.charCodeAt(0)]);\n    return [type, sentences];\n  });\n\n  // Map diffs to nodes\n  const res = diffs.flatMap(([type, sentences]) => {\n    return sentences.map((sentence) => {\n      const node = createTextNode(\n        schema,\n        sentence,\n        type === DiffType.Unchanged ? [] : [createDiffMark(schema, type)]\n      );\n      return node;\n    });\n  });\n\n  return res;\n};\n\n// Function to tokenize text into sentences\nconst tokenizeSentences = (text) => {\n  return text.match(/[^.!?]+[.!?]*\\s*/g) || [];\n};\n\n// Function to map sentences to unique characters\nconst sentencesToChars = (oldSentences, newSentences) => {\n  const lineArray = [];\n  const lineHash = {};\n  let lineStart = 0;\n\n  const chars1 = oldSentences\n    .map((sentence) => {\n      const line = sentence;\n      if (line in lineHash) {\n        return String.fromCharCode(lineHash[line]);\n      }\n      lineHash[line] = lineStart;\n      lineArray[lineStart] = line;\n      lineStart++;\n      return String.fromCharCode(lineHash[line]);\n    })\n    .join(\"\");\n\n  const chars2 = newSentences\n    .map((sentence) => {\n      const line = sentence;\n      if (line in lineHash) {\n        return String.fromCharCode(lineHash[line]);\n      }\n      lineHash[line] = lineStart;\n      lineArray[lineStart] = line;\n      lineStart++;\n      return String.fromCharCode(lineHash[line]);\n    })\n    .join(\"\");\n\n  return { chars1, chars2, lineArray };\n};\n\nexport const computeChildEqualityFactor = (_node1, _node2) => {\n  return 0;\n};\n\nexport const assertNodeTypeEqual = (node1, node2) => {\n  if (getNodeProperty(node1, \"type\") !== getNodeProperty(node2, \"type\")) {\n    throw new Error(`node type not equal: ${node1.type} !== ${node2.type}`);\n  }\n};\n\nexport const ensureArray = (value) => {\n  return Array.isArray(value) ? value : [value];\n};\n\nexport const isNodeEqual = (node1, node2) => {\n  const isNode1Array = Array.isArray(node1);\n  const isNode2Array = Array.isArray(node2);\n  if (isNode1Array !== isNode2Array) {\n    return false;\n  }\n  if (isNode1Array) {\n    return (\n      node1.length === node2.length &&\n      node1.every((node, index) => isNodeEqual(node, node2[index]))\n    );\n  }\n\n  const type1 = getNodeProperty(node1, \"type\");\n  const type2 = getNodeProperty(node2, \"type\");\n  if (type1 !== type2) {\n    return false;\n  }\n  if (isTextNode(node1)) {\n    const text1 = getNodeProperty(node1, \"text\");\n    const text2 = getNodeProperty(node2, \"text\");\n    if (text1 !== text2) {\n      return false;\n    }\n  }\n  const attrs1 = getNodeAttributes(node1);\n  const attrs2 = getNodeAttributes(node2);\n  const attrs = [...new Set([...Object.keys(attrs1), ...Object.keys(attrs2)])];\n  for (const attr of attrs) {\n    if (attrs1[attr] !== attrs2[attr]) {\n      return false;\n    }\n  }\n  const marks1 = getNodeMarks(node1);\n  const marks2 = getNodeMarks(node2);\n  if (marks1.length !== marks2.length) {\n    return false;\n  }\n  for (let i = 0; i < marks1.length; i++) {\n    if (!isNodeEqual(marks1[i], marks2[i])) {\n      return false;\n    }\n  }\n  const children1 = getNodeChildren(node1);\n  const children2 = getNodeChildren(node2);\n  if (children1.length !== children2.length) {\n    return false;\n  }\n  for (let i = 0; i < children1.length; i++) {\n    if (!isNodeEqual(children1[i], children2[i])) {\n      return false;\n    }\n  }\n  return true;\n};\n\nexport const normalizeNodeContent = (node) => {\n  const content = getNodeChildren(node) ?? [];\n  const res = [];\n  for (let i = 0; i < content.length; i++) {\n    const child = content[i];\n    if (isTextNode(child)) {\n      const textNodes = [];\n      for (\n        let textNode = content[i];\n        i < content.length && isTextNode(textNode);\n        textNode = content[++i]\n      ) {\n        textNodes.push(textNode);\n      }\n      i--;\n      res.push(textNodes);\n    } else {\n      res.push(child);\n    }\n  }\n  return res;\n};\n\nexport const getNodeProperty = (node, property) => {\n  if (property === \"type\") {\n    return node.type?.name;\n  }\n  return node[property];\n};\n\nexport const getNodeAttribute = (node, attribute) =>\n  node.attrs ? node.attrs[attribute] : undefined;\n\nexport const getNodeAttributes = (node) => (node.attrs ? node.attrs : {});\n\nexport const getNodeMarks = (node) => node.marks ?? [];\n\nexport const getNodeChildren = (node) => node.content?.content ?? [];\n\nexport const getNodeText = (node) => node.text;\n\nexport const isTextNode = (node) => node.type?.name === \"text\";\n\nexport const matchNodeType = (node1, node2) =>\n  node1.type?.name === node2.type?.name ||\n  (Array.isArray(node1) && Array.isArray(node2));\n\nexport const createNewNode = (oldNode, children) => {\n  if (!oldNode.type) {\n    throw new Error(\"oldNode.type is undefined\");\n  }\n  return new Node(\n    oldNode.type,\n    oldNode.attrs,\n    Fragment.fromArray(children),\n    oldNode.marks\n  );\n};\n\nexport const createDiffNode = (schema, node, type) => {\n  return mapDocumentNode(node, (currentNode) => {\n    if (isTextNode(currentNode)) {\n      return createTextNode(schema, getNodeText(currentNode), [\n        ...(currentNode.marks || []),\n        createDiffMark(schema, type),\n      ]);\n    }\n    return currentNode;\n  });\n};\n\nfunction mapDocumentNode(node, mapper) {\n  const copy = node.copy(\n    Fragment.from(\n      node.content.content\n        .map((currentNode) => mapDocumentNode(currentNode, mapper))\n        .filter((n) => n)\n    )\n  );\n  return mapper(copy) || copy;\n}\n\nexport const createDiffMark = (schema, type) => {\n  if (type === DiffType.Inserted) {\n    return schema.mark(\"diffMark\", { type });\n  }\n  if (type === DiffType.Deleted) {\n    return schema.mark(\"diffMark\", { type });\n  }\n  throw new Error(\"type is not valid\");\n};\n\nexport const createTextNode = (schema, content, marks = []) => {\n  return schema.text(content, marks);\n};\n\nexport const diffEditor = (schema, oldDoc, newDoc) => {\n  const oldNode = Node.fromJSON(schema, oldDoc);\n  const newNode = Node.fromJSON(schema, newDoc);\n  return patchDocumentNode(schema, oldNode, newNode);\n};\n"
  },
  {
    "path": "lib/editor/functions.tsx",
    "content": "\"use client\";\n\nimport { defaultMarkdownSerializer } from \"prosemirror-markdown\";\nimport { DOMParser, type Node } from \"prosemirror-model\";\nimport { Decoration, DecorationSet, type EditorView } from \"prosemirror-view\";\nimport { renderToString } from \"react-dom/server\";\n\nimport { Response } from \"@/components/elements/response\";\n\nimport { documentSchema } from \"./config\";\nimport { createSuggestionWidget, type UISuggestion } from \"./suggestions\";\n\nexport const buildDocumentFromContent = (content: string) => {\n  const parser = DOMParser.fromSchema(documentSchema);\n  const stringFromMarkdown = renderToString(<Response>{content}</Response>);\n  const tempContainer = document.createElement(\"div\");\n  tempContainer.innerHTML = stringFromMarkdown;\n  return parser.parse(tempContainer);\n};\n\nexport const buildContentFromDocument = (document: Node) => {\n  return defaultMarkdownSerializer.serialize(document);\n};\n\nexport const createDecorations = (\n  suggestions: UISuggestion[],\n  view: EditorView\n) => {\n  const decorations: Decoration[] = [];\n\n  for (const suggestion of suggestions) {\n    decorations.push(\n      Decoration.inline(\n        suggestion.selectionStart,\n        suggestion.selectionEnd,\n        {\n          class: \"suggestion-highlight\",\n        },\n        {\n          suggestionId: suggestion.id,\n          type: \"highlight\",\n        }\n      )\n    );\n\n    decorations.push(\n      Decoration.widget(\n        suggestion.selectionStart,\n        (currentView) => {\n          const { dom } = createSuggestionWidget(suggestion, currentView);\n          return dom;\n        },\n        {\n          suggestionId: suggestion.id,\n          type: \"widget\",\n        }\n      )\n    );\n  }\n\n  return DecorationSet.create(view.state.doc, decorations);\n};\n"
  },
  {
    "path": "lib/editor/react-renderer.tsx",
    "content": "import { createRoot } from \"react-dom/client\";\n\n// biome-ignore lint/complexity/noStaticOnlyClass: \"Needs to be static\"\nexport class ReactRenderer {\n  static render(component: React.ReactElement, dom: HTMLElement) {\n    const root = createRoot(dom);\n    root.render(component);\n\n    return {\n      destroy: () => root.unmount(),\n    };\n  }\n}\n"
  },
  {
    "path": "lib/editor/suggestions.tsx",
    "content": "import type { Node } from \"prosemirror-model\";\nimport { Plugin, PluginKey } from \"prosemirror-state\";\nimport {\n  type Decoration,\n  DecorationSet,\n  type EditorView,\n} from \"prosemirror-view\";\nimport { createRoot } from \"react-dom/client\";\nimport type { ArtifactKind } from \"@/components/artifact\";\nimport { Suggestion as PreviewSuggestion } from \"@/components/suggestion\";\nimport type { Suggestion } from \"@/lib/db/schema\";\n\nexport interface UISuggestion extends Suggestion {\n  selectionStart: number;\n  selectionEnd: number;\n}\n\ntype Position = {\n  start: number;\n  end: number;\n};\n\nfunction findPositionsInDoc(doc: Node, searchText: string): Position | null {\n  let positions: { start: number; end: number } | null = null;\n\n  doc.nodesBetween(0, doc.content.size, (node, pos) => {\n    if (node.isText && node.text) {\n      const index = node.text.indexOf(searchText);\n\n      if (index !== -1) {\n        positions = {\n          start: pos + index,\n          end: pos + index + searchText.length,\n        };\n\n        return false;\n      }\n    }\n\n    return true;\n  });\n\n  return positions;\n}\n\nexport function projectWithPositions(\n  doc: Node,\n  suggestions: Suggestion[]\n): UISuggestion[] {\n  return suggestions.map((suggestion) => {\n    const positions = findPositionsInDoc(doc, suggestion.originalText);\n\n    if (!positions) {\n      return {\n        ...suggestion,\n        selectionStart: 0,\n        selectionEnd: 0,\n      };\n    }\n\n    return {\n      ...suggestion,\n      selectionStart: positions.start,\n      selectionEnd: positions.end,\n    };\n  });\n}\n\nexport function createSuggestionWidget(\n  suggestion: UISuggestion,\n  view: EditorView,\n  artifactKind: ArtifactKind = \"text\"\n): { dom: HTMLElement; destroy: () => void } {\n  const dom = document.createElement(\"span\");\n  const root = createRoot(dom);\n\n  dom.addEventListener(\"mousedown\", (event) => {\n    event.preventDefault();\n    view.dom.blur();\n  });\n\n  const onApply = () => {\n    const { state, dispatch } = view;\n\n    const decorationTransaction = state.tr;\n    const currentState = suggestionsPluginKey.getState(state);\n    const currentDecorations = currentState?.decorations;\n\n    if (currentDecorations) {\n      const newDecorations = DecorationSet.create(\n        state.doc,\n        currentDecorations.find().filter((decoration: Decoration) => {\n          return decoration.spec.suggestionId !== suggestion.id;\n        })\n      );\n\n      decorationTransaction.setMeta(suggestionsPluginKey, {\n        decorations: newDecorations,\n        selected: null,\n      });\n      dispatch(decorationTransaction);\n    }\n\n    const textTransaction = view.state.tr.replaceWith(\n      suggestion.selectionStart,\n      suggestion.selectionEnd,\n      state.schema.text(suggestion.suggestedText)\n    );\n\n    textTransaction.setMeta(\"no-debounce\", true);\n\n    dispatch(textTransaction);\n  };\n\n  root.render(\n    <PreviewSuggestion\n      artifactKind={artifactKind}\n      onApply={onApply}\n      suggestion={suggestion}\n    />\n  );\n\n  return {\n    dom,\n    destroy: () => {\n      // Wrapping unmount in setTimeout to avoid synchronous unmounting during render\n      setTimeout(() => {\n        root.unmount();\n      }, 0);\n    },\n  };\n}\n\nexport const suggestionsPluginKey = new PluginKey(\"suggestions\");\nexport const suggestionsPlugin = new Plugin({\n  key: suggestionsPluginKey,\n  state: {\n    init() {\n      return { decorations: DecorationSet.empty, selected: null };\n    },\n    apply(tr, state) {\n      const newDecorations = tr.getMeta(suggestionsPluginKey);\n      if (newDecorations) {\n        return newDecorations;\n      }\n\n      return {\n        decorations: state.decorations.map(tr.mapping, tr.doc),\n        selected: state.selected,\n      };\n    },\n  },\n  props: {\n    decorations(state) {\n      return this.getState(state)?.decorations ?? DecorationSet.empty;\n    },\n  },\n});\n"
  },
  {
    "path": "lib/errors.ts",
    "content": "export type ErrorType =\n  | \"bad_request\"\n  | \"unauthorized\"\n  | \"forbidden\"\n  | \"not_found\"\n  | \"rate_limit\"\n  | \"offline\";\n\nexport type Surface =\n  | \"chat\"\n  | \"auth\"\n  | \"api\"\n  | \"stream\"\n  | \"database\"\n  | \"history\"\n  | \"vote\"\n  | \"document\"\n  | \"suggestions\"\n  | \"activate_gateway\";\n\nexport type ErrorCode = `${ErrorType}:${Surface}`;\n\nexport type ErrorVisibility = \"response\" | \"log\" | \"none\";\n\nexport const visibilityBySurface: Record<Surface, ErrorVisibility> = {\n  database: \"log\",\n  chat: \"response\",\n  auth: \"response\",\n  stream: \"response\",\n  api: \"response\",\n  history: \"response\",\n  vote: \"response\",\n  document: \"response\",\n  suggestions: \"response\",\n  activate_gateway: \"response\",\n};\n\nexport class ChatbotError extends Error {\n  type: ErrorType;\n  surface: Surface;\n  statusCode: number;\n\n  constructor(errorCode: ErrorCode, cause?: string) {\n    super();\n\n    const [type, surface] = errorCode.split(\":\");\n\n    this.type = type as ErrorType;\n    this.cause = cause;\n    this.surface = surface as Surface;\n    this.message = getMessageByErrorCode(errorCode);\n    this.statusCode = getStatusCodeByType(this.type);\n  }\n\n  toResponse() {\n    const code: ErrorCode = `${this.type}:${this.surface}`;\n    const visibility = visibilityBySurface[this.surface];\n\n    const { message, cause, statusCode } = this;\n\n    if (visibility === \"log\") {\n      console.error({\n        code,\n        message,\n        cause,\n      });\n\n      return Response.json(\n        { code: \"\", message: \"Something went wrong. Please try again later.\" },\n        { status: statusCode }\n      );\n    }\n\n    return Response.json({ code, message, cause }, { status: statusCode });\n  }\n}\n\nexport function getMessageByErrorCode(errorCode: ErrorCode): string {\n  if (errorCode.includes(\"database\")) {\n    return \"An error occurred while executing a database query.\";\n  }\n\n  switch (errorCode) {\n    case \"bad_request:api\":\n      return \"The request couldn't be processed. Please check your input and try again.\";\n\n    case \"bad_request:activate_gateway\":\n      return \"AI Gateway requires a valid credit card on file to service requests. Please visit https://vercel.com/d?to=%2F%5Bteam%5D%2F%7E%2Fai%3Fmodal%3Dadd-credit-card to add a card and unlock your free credits.\";\n\n    case \"unauthorized:auth\":\n      return \"You need to sign in before continuing.\";\n    case \"forbidden:auth\":\n      return \"Your account does not have access to this feature.\";\n\n    case \"rate_limit:chat\":\n      return \"You have exceeded your maximum number of messages for the day. Please try again later.\";\n    case \"not_found:chat\":\n      return \"The requested chat was not found. Please check the chat ID and try again.\";\n    case \"forbidden:chat\":\n      return \"This chat belongs to another user. Please check the chat ID and try again.\";\n    case \"unauthorized:chat\":\n      return \"You need to sign in to view this chat. Please sign in and try again.\";\n    case \"offline:chat\":\n      return \"We're having trouble sending your message. Please check your internet connection and try again.\";\n\n    case \"not_found:document\":\n      return \"The requested document was not found. Please check the document ID and try again.\";\n    case \"forbidden:document\":\n      return \"This document belongs to another user. Please check the document ID and try again.\";\n    case \"unauthorized:document\":\n      return \"You need to sign in to view this document. Please sign in and try again.\";\n    case \"bad_request:document\":\n      return \"The request to create or update the document was invalid. Please check your input and try again.\";\n\n    default:\n      return \"Something went wrong. Please try again later.\";\n  }\n}\n\nfunction getStatusCodeByType(type: ErrorType) {\n  switch (type) {\n    case \"bad_request\":\n      return 400;\n    case \"unauthorized\":\n      return 401;\n    case \"forbidden\":\n      return 403;\n    case \"not_found\":\n      return 404;\n    case \"rate_limit\":\n      return 429;\n    case \"offline\":\n      return 503;\n    default:\n      return 500;\n  }\n}\n"
  },
  {
    "path": "lib/ratelimit.ts",
    "content": "import { createClient } from \"redis\";\n\nimport { isProductionEnvironment } from \"@/lib/constants\";\nimport { ChatbotError } from \"@/lib/errors\";\n\nconst MAX_MESSAGES = 10;\nconst TTL_SECONDS = 60 * 60;\n\nlet client: ReturnType<typeof createClient> | null = null;\n\nfunction getClient() {\n  if (!client && process.env.REDIS_URL) {\n    client = createClient({ url: process.env.REDIS_URL });\n    client.on(\"error\", () => undefined);\n    client.connect().catch(() => {\n      client = null;\n    });\n  }\n  return client;\n}\n\nexport async function checkIpRateLimit(ip: string | undefined) {\n  if (!isProductionEnvironment || !ip) {\n    return;\n  }\n\n  const redis = getClient();\n  if (!redis?.isReady) {\n    return;\n  }\n\n  try {\n    const key = `ip-rate-limit:${ip}`;\n    const [count] = await redis\n      .multi()\n      .incr(key)\n      .expire(key, TTL_SECONDS, \"NX\")\n      .exec();\n\n    if (typeof count === \"number\" && count > MAX_MESSAGES) {\n      throw new ChatbotError(\"rate_limit:chat\");\n    }\n  } catch (error) {\n    if (error instanceof ChatbotError) {\n      throw error;\n    }\n  }\n}\n"
  },
  {
    "path": "lib/types.ts",
    "content": "import type { InferUITool, UIMessage } from \"ai\";\nimport { z } from \"zod\";\nimport type { ArtifactKind } from \"@/components/artifact\";\nimport type { createDocument } from \"./ai/tools/create-document\";\nimport type { getWeather } from \"./ai/tools/get-weather\";\nimport type { requestSuggestions } from \"./ai/tools/request-suggestions\";\nimport type { updateDocument } from \"./ai/tools/update-document\";\nimport type { Suggestion } from \"./db/schema\";\n\nexport type DataPart = { type: \"append-message\"; message: string };\n\nexport const messageMetadataSchema = z.object({\n  createdAt: z.string(),\n});\n\nexport type MessageMetadata = z.infer<typeof messageMetadataSchema>;\n\ntype weatherTool = InferUITool<typeof getWeather>;\ntype createDocumentTool = InferUITool<ReturnType<typeof createDocument>>;\ntype updateDocumentTool = InferUITool<ReturnType<typeof updateDocument>>;\ntype requestSuggestionsTool = InferUITool<\n  ReturnType<typeof requestSuggestions>\n>;\n\nexport type ChatTools = {\n  getWeather: weatherTool;\n  createDocument: createDocumentTool;\n  updateDocument: updateDocumentTool;\n  requestSuggestions: requestSuggestionsTool;\n};\n\nexport type CustomUIDataTypes = {\n  textDelta: string;\n  imageDelta: string;\n  sheetDelta: string;\n  codeDelta: string;\n  suggestion: Suggestion;\n  appendMessage: string;\n  id: string;\n  title: string;\n  kind: ArtifactKind;\n  clear: null;\n  finish: null;\n  \"chat-title\": string;\n};\n\nexport type ChatMessage = UIMessage<\n  MessageMetadata,\n  CustomUIDataTypes,\n  ChatTools\n>;\n\nexport type Attachment = {\n  name: string;\n  url: string;\n  contentType: string;\n};\n"
  },
  {
    "path": "lib/utils.ts",
    "content": "import type {\n  AssistantModelMessage,\n  ToolModelMessage,\n  UIMessage,\n  UIMessagePart,\n} from 'ai';\nimport { type ClassValue, clsx } from 'clsx';\nimport { formatISO } from 'date-fns';\nimport { twMerge } from 'tailwind-merge';\nimport type { DBMessage, Document } from '@/lib/db/schema';\nimport { ChatbotError, type ErrorCode } from './errors';\nimport type { ChatMessage, ChatTools, CustomUIDataTypes } from './types';\n\nexport function cn(...inputs: ClassValue[]) {\n  return twMerge(clsx(inputs));\n}\n\nexport const fetcher = async (url: string) => {\n  const response = await fetch(url);\n\n  if (!response.ok) {\n    const { code, cause } = await response.json();\n    throw new ChatbotError(code as ErrorCode, cause);\n  }\n\n  return response.json();\n};\n\nexport async function fetchWithErrorHandlers(\n  input: RequestInfo | URL,\n  init?: RequestInit,\n) {\n  try {\n    const response = await fetch(input, init);\n\n    if (!response.ok) {\n      const { code, cause } = await response.json();\n      throw new ChatbotError(code as ErrorCode, cause);\n    }\n\n    return response;\n  } catch (error: unknown) {\n    if (typeof navigator !== 'undefined' && !navigator.onLine) {\n      throw new ChatbotError('offline:chat');\n    }\n\n    throw error;\n  }\n}\n\nexport function getLocalStorage(key: string) {\n  if (typeof window !== 'undefined') {\n    return JSON.parse(localStorage.getItem(key) || '[]');\n  }\n  return [];\n}\n\nexport function generateUUID(): string {\n  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n    const r = (Math.random() * 16) | 0;\n    const v = c === 'x' ? r : (r & 0x3) | 0x8;\n    return v.toString(16);\n  });\n}\n\ntype ResponseMessageWithoutId = ToolModelMessage | AssistantModelMessage;\ntype ResponseMessage = ResponseMessageWithoutId & { id: string };\n\nexport function getMostRecentUserMessage(messages: UIMessage[]) {\n  const userMessages = messages.filter((message) => message.role === 'user');\n  return userMessages.at(-1);\n}\n\nexport function getDocumentTimestampByIndex(\n  documents: Document[],\n  index: number,\n) {\n  if (!documents) { return new Date(); }\n  if (index > documents.length) { return new Date(); }\n\n  return documents[index].createdAt;\n}\n\nexport function getTrailingMessageId({\n  messages,\n}: {\n  messages: ResponseMessage[];\n}): string | null {\n  const trailingMessage = messages.at(-1);\n\n  if (!trailingMessage) { return null; }\n\n  return trailingMessage.id;\n}\n\nexport function sanitizeText(text: string) {\n  return text.replace('<has_function_call>', '');\n}\n\nexport function convertToUIMessages(messages: DBMessage[]): ChatMessage[] {\n  return messages.map((message) => ({\n    id: message.id,\n    role: message.role as 'user' | 'assistant' | 'system',\n    parts: message.parts as UIMessagePart<CustomUIDataTypes, ChatTools>[],\n    metadata: {\n      createdAt: formatISO(message.createdAt),\n    },\n  }));\n}\n\nexport function getTextFromMessage(message: ChatMessage | UIMessage): string {\n  return message.parts\n    .filter((part) => part.type === 'text')\n    .map((part) => (part as { type: 'text'; text: string}).text)\n    .join('');\n}\n"
  },
  {
    "path": "next-env.d.ts",
    "content": "/// <reference types=\"next\" />\n/// <reference types=\"next/image-types/global\" />\nimport \"./.next/dev/types/routes.d.ts\";\n\n// NOTE: This file should not be edited\n// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.\n"
  },
  {
    "path": "next.config.ts",
    "content": "import { withBotId } from \"botid/next/config\";\nimport type { NextConfig } from \"next\";\n\nconst nextConfig: NextConfig = {\n  cacheComponents: true,\n  images: {\n    remotePatterns: [\n      {\n        hostname: \"avatar.vercel.sh\",\n      },\n      {\n        protocol: \"https\",\n        //https://nextjs.org/docs/messages/next-image-unconfigured-host\n        hostname: \"*.public.blob.vercel-storage.com\",\n      },\n    ],\n  },\n};\n\nexport default withBotId(nextConfig);\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"chatbot\",\n  \"version\": \"3.1.0\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"next dev --turbo\",\n    \"build\": \"tsx lib/db/migrate && next build\",\n    \"start\": \"next start\",\n    \"check\": \"ultracite check\",\n    \"fix\": \"ultracite fix\",\n    \"db:generate\": \"drizzle-kit generate\",\n    \"db:migrate\": \"npx tsx lib/db/migrate.ts\",\n    \"db:studio\": \"drizzle-kit studio\",\n    \"db:push\": \"drizzle-kit push\",\n    \"db:pull\": \"drizzle-kit pull\",\n    \"db:check\": \"drizzle-kit check\",\n    \"db:up\": \"drizzle-kit up\",\n    \"test\": \"export PLAYWRIGHT=True && pnpm exec playwright test\",\n    \"changeset\": \"changeset\",\n    \"version\": \"changeset version\",\n    \"release\": \"changeset tag\"\n  },\n  \"dependencies\": {\n    \"@ai-sdk/gateway\": \"^3.0.15\",\n    \"@ai-sdk/provider\": \"^3.0.3\",\n    \"@ai-sdk/react\": \"3.0.39\",\n    \"@codemirror/lang-javascript\": \"^6.2.2\",\n    \"@codemirror/lang-python\": \"^6.1.6\",\n    \"@codemirror/state\": \"^6.5.0\",\n    \"@codemirror/theme-one-dark\": \"^6.1.2\",\n    \"@codemirror/view\": \"^6.35.3\",\n    \"@icons-pack/react-simple-icons\": \"^13.7.0\",\n    \"@opentelemetry/api\": \"^1.9.0\",\n    \"@opentelemetry/api-logs\": \"^0.200.0\",\n    \"@radix-ui/react-collapsible\": \"^1.1.12\",\n    \"@radix-ui/react-dialog\": \"^1.1.15\",\n    \"@radix-ui/react-dropdown-menu\": \"^2.1.16\",\n    \"@radix-ui/react-hover-card\": \"^1.1.15\",\n    \"@radix-ui/react-icons\": \"^1.3.0\",\n    \"@radix-ui/react-progress\": \"^1.1.8\",\n    \"@radix-ui/react-scroll-area\": \"^1.2.10\",\n    \"@radix-ui/react-select\": \"^2.2.6\",\n    \"@radix-ui/react-separator\": \"^1.1.8\",\n    \"@radix-ui/react-slot\": \"^1.2.4\",\n    \"@radix-ui/react-tooltip\": \"^1.2.8\",\n    \"@radix-ui/react-use-controllable-state\": \"^1.2.2\",\n    \"@radix-ui/react-visually-hidden\": \"^1.1.0\",\n    \"@vercel/analytics\": \"^1.3.1\",\n    \"@vercel/blob\": \"^0.24.1\",\n    \"@vercel/functions\": \"^2.0.0\",\n    \"@vercel/otel\": \"^1.12.0\",\n    \"@xyflow/react\": \"^12.10.0\",\n    \"ai\": \"6.0.37\",\n    \"bcrypt-ts\": \"^5.0.2\",\n    \"botid\": \"1.5.11\",\n    \"class-variance-authority\": \"^0.7.1\",\n    \"classnames\": \"^2.5.1\",\n    \"clsx\": \"^2.1.1\",\n    \"cmdk\": \"^1.1.1\",\n    \"codemirror\": \"^6.0.1\",\n    \"date-fns\": \"^4.1.0\",\n    \"diff-match-patch\": \"^1.0.5\",\n    \"dotenv\": \"^16.4.5\",\n    \"drizzle-orm\": \"^0.34.0\",\n    \"embla-carousel-react\": \"^8.6.0\",\n    \"fast-deep-equal\": \"^3.1.3\",\n    \"framer-motion\": \"^11.3.19\",\n    \"geist\": \"^1.3.1\",\n    \"katex\": \"^0.16.25\",\n    \"lucide-react\": \"^0.446.0\",\n    \"motion\": \"^12.23.26\",\n    \"nanoid\": \"^5.1.3\",\n    \"next\": \"16.0.10\",\n    \"next-auth\": \"5.0.0-beta.25\",\n    \"next-themes\": \"^0.3.0\",\n    \"orderedmap\": \"^2.1.1\",\n    \"papaparse\": \"^5.5.2\",\n    \"postgres\": \"^3.4.4\",\n    \"prosemirror-example-setup\": \"^1.2.3\",\n    \"prosemirror-inputrules\": \"^1.4.0\",\n    \"prosemirror-markdown\": \"^1.13.1\",\n    \"prosemirror-model\": \"^1.23.0\",\n    \"prosemirror-schema-basic\": \"^1.2.3\",\n    \"prosemirror-schema-list\": \"^1.4.1\",\n    \"prosemirror-state\": \"^1.4.3\",\n    \"prosemirror-view\": \"^1.34.3\",\n    \"radix-ui\": \"^1.4.3\",\n    \"react\": \"19.0.1\",\n    \"react-data-grid\": \"7.0.0-beta.47\",\n    \"react-dom\": \"19.0.1\",\n    \"react-resizable-panels\": \"^2.1.7\",\n    \"react-syntax-highlighter\": \"^15.6.6\",\n    \"redis\": \"^5.0.0\",\n    \"resumable-stream\": \"^2.2.10\",\n    \"server-only\": \"^0.0.1\",\n    \"shiki\": \"^3.21.0\",\n    \"sonner\": \"^1.5.0\",\n    \"streamdown\": \"^2.0.1\",\n    \"swr\": \"^2.2.5\",\n    \"tailwind-merge\": \"^2.5.2\",\n    \"tailwindcss-animate\": \"^1.0.7\",\n    \"use-stick-to-bottom\": \"^1.1.1\",\n    \"usehooks-ts\": \"^3.1.0\",\n    \"zod\": \"^3.25.76\"\n  },\n  \"devDependencies\": {\n    \"@biomejs/biome\": \"2.3.11\",\n    \"@changesets/changelog-github\": \"^0.6.0\",\n    \"@changesets/cli\": \"^2.30.0\",\n    \"@playwright/test\": \"^1.50.1\",\n    \"@tailwindcss/postcss\": \"^4.1.13\",\n    \"@tailwindcss/typography\": \"^0.5.15\",\n    \"@types/d3-scale\": \"^4.0.8\",\n    \"@types/node\": \"^22.8.6\",\n    \"@types/papaparse\": \"^5.3.15\",\n    \"@types/pdf-parse\": \"^1.1.4\",\n    \"@types/react\": \"^18\",\n    \"@types/react-dom\": \"^18\",\n    \"@types/react-syntax-highlighter\": \"^15.5.13\",\n    \"drizzle-kit\": \"^0.25.0\",\n    \"postcss\": \"^8\",\n    \"tailwindcss\": \"^4.1.13\",\n    \"tsx\": \"^4.19.1\",\n    \"typescript\": \"^5.6.3\",\n    \"ultracite\": \"^7.0.11\"\n  },\n  \"packageManager\": \"pnpm@9.12.3\"\n}\n"
  },
  {
    "path": "playwright.config.ts",
    "content": "import { defineConfig, devices } from \"@playwright/test\";\n\n/**\n * Read environment variables from file.\n * https://github.com/motdotla/dotenv\n */\nimport { config } from \"dotenv\";\n\nconfig({\n  path: \".env.local\",\n});\n\n/* Use process.env.PORT by default and fallback to port 3000 */\nconst PORT = process.env.PORT || 3000;\n\n/**\n * Set webServer.url and use.baseURL with the location\n * of the WebServer respecting the correct set port\n */\nconst baseURL = `http://localhost:${PORT}`;\n\n/**\n * See https://playwright.dev/docs/test-configuration.\n */\nexport default defineConfig({\n  testDir: \"./tests\",\n  /* Run tests in files in parallel */\n  fullyParallel: true,\n  /* Fail the build on CI if you accidentally left test.only in the source code. */\n  forbidOnly: !!process.env.CI,\n  /* Retry on CI only */\n  retries: 0,\n  /* Limit workers to prevent browser crashes */\n  workers: process.env.CI ? 2 : 2,\n  /* Reporter to use. See https://playwright.dev/docs/test-reporters */\n  reporter: \"html\",\n  /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */\n  use: {\n    /* Base URL to use in actions like `await page.goto('/')`. */\n    baseURL,\n\n    /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */\n    trace: \"retain-on-failure\",\n  },\n\n  /* Configure global timeout for each test */\n  timeout: 240 * 1000, // 120 seconds\n  expect: {\n    timeout: 240 * 1000,\n  },\n\n  /* Configure projects */\n  projects: [\n    {\n      name: \"e2e\",\n      testMatch: /e2e\\/.*.test.ts/,\n      use: {\n        ...devices[\"Desktop Chrome\"],\n      },\n    },\n\n    // {\n    //   name: 'firefox',\n    //   use: { ...devices['Desktop Firefox'] },\n    // },\n\n    // {\n    //   name: 'webkit',\n    //   use: { ...devices['Desktop Safari'] },\n    // },\n\n    /* Test against mobile viewports. */\n    // {\n    //   name: 'Mobile Chrome',\n    //   use: { ...devices['Pixel 5'] },\n    // },\n    // {\n    //   name: 'Mobile Safari',\n    //   use: { ...devices['iPhone 12'] },\n    // },\n\n    /* Test against branded browsers. */\n    // {\n    //   name: 'Microsoft Edge',\n    //   use: { ...devices['Desktop Edge'], channel: 'msedge' },\n    // },\n    // {\n    //   name: 'Google Chrome',\n    //   use: { ...devices['Desktop Chrome'], channel: 'chrome' },\n    // },\n  ],\n\n  /* Run your local dev server before starting the tests */\n  webServer: {\n    command: \"pnpm dev\",\n    url: `${baseURL}/ping`,\n    timeout: 120 * 1000,\n    reuseExistingServer: !process.env.CI,\n  },\n});\n"
  },
  {
    "path": "postcss.config.mjs",
    "content": "/** @type {import('postcss-load-config').Config} */\nconst config = {\n  plugins: {\n    \"@tailwindcss/postcss\": {},\n  },\n};\n\nexport default config;\n"
  },
  {
    "path": "proxy.ts",
    "content": "import { type NextRequest, NextResponse } from \"next/server\";\nimport { getToken } from \"next-auth/jwt\";\nimport { guestRegex, isDevelopmentEnvironment } from \"./lib/constants\";\n\nexport async function proxy(request: NextRequest) {\n  const { pathname } = request.nextUrl;\n\n  /*\n   * Playwright starts the dev server and requires a 200 status to\n   * begin the tests, so this ensures that the tests can start\n   */\n  if (pathname.startsWith(\"/ping\")) {\n    return new Response(\"pong\", { status: 200 });\n  }\n\n  if (pathname.startsWith(\"/api/auth\")) {\n    return NextResponse.next();\n  }\n\n  const token = await getToken({\n    req: request,\n    secret: process.env.AUTH_SECRET,\n    secureCookie: !isDevelopmentEnvironment,\n  });\n\n  if (!token) {\n    const redirectUrl = encodeURIComponent(request.url);\n\n    return NextResponse.redirect(\n      new URL(`/api/auth/guest?redirectUrl=${redirectUrl}`, request.url)\n    );\n  }\n\n  const isGuest = guestRegex.test(token?.email ?? \"\");\n\n  if (token && !isGuest && [\"/login\", \"/register\"].includes(pathname)) {\n    return NextResponse.redirect(new URL(\"/\", request.url));\n  }\n\n  return NextResponse.next();\n}\n\nexport const config = {\n  matcher: [\n    \"/\",\n    \"/chat/:id\",\n    \"/api/:path*\",\n    \"/login\",\n    \"/register\",\n\n    /*\n     * Match all request paths except for the ones starting with:\n     * - _next/static (static files)\n     * - _next/image (image optimization files)\n     * - favicon.ico, sitemap.xml, robots.txt (metadata files)\n     */\n    \"/((?!_next/static|_next/image|favicon.ico|sitemap.xml|robots.txt).*)\",\n  ],\n};\n"
  },
  {
    "path": "tests/e2e/api.test.ts",
    "content": "import { expect, test } from \"@playwright/test\";\n\nconst CHAT_URL_REGEX = /\\/chat\\/[\\w-]+/;\nconst ERROR_TEXT_REGEX = /error|failed|trouble/i;\n\ntest.describe(\"Chat API Integration\", () => {\n  test(\"sends message and receives AI response\", async ({ page }) => {\n    await page.goto(\"/\");\n\n    const input = page.getByTestId(\"multimodal-input\");\n    await input.fill(\"Hello\");\n    await page.getByTestId(\"send-button\").click();\n\n    // Wait for assistant response to appear\n    const assistantMessage = page.locator(\"[data-role='assistant']\").first();\n    await expect(assistantMessage).toBeVisible({ timeout: 30_000 });\n\n    // Verify it has some text content\n    const content = await assistantMessage.textContent();\n    expect(content?.length).toBeGreaterThan(0);\n  });\n\n  test(\"redirects to /chat/:id after sending message\", async ({ page }) => {\n    await page.goto(\"/\");\n\n    const input = page.getByTestId(\"multimodal-input\");\n    await input.fill(\"Test redirect\");\n    await page.getByTestId(\"send-button\").click();\n\n    // URL should change to /chat/:id format\n    await expect(page).toHaveURL(CHAT_URL_REGEX, { timeout: 10_000 });\n  });\n\n  test(\"clears input after sending\", async ({ page }) => {\n    await page.goto(\"/\");\n\n    const input = page.getByTestId(\"multimodal-input\");\n    await input.fill(\"Test message\");\n    await page.getByTestId(\"send-button\").click();\n\n    // Input should be cleared\n    await expect(input).toHaveValue(\"\");\n  });\n\n  test(\"shows stop button during generation\", async ({ page }) => {\n    await page.goto(\"/\");\n    const input = page.getByTestId(\"multimodal-input\");\n    await input.fill(\"Test\");\n    await page.getByTestId(\"send-button\").click();\n\n    // Stop button should appear during generation\n    const stopButton = page.getByTestId(\"stop-button\");\n    await expect(stopButton).toBeVisible({ timeout: 5000 });\n  });\n});\n\ntest.describe(\"Chat Error Handling\", () => {\n  test(\"handles API error gracefully\", async ({ page }) => {\n    await page.route(\"**/api/chat\", async (route) => {\n      await route.fulfill({\n        status: 500,\n        contentType: \"application/json\",\n        body: JSON.stringify({ error: \"Internal server error\" }),\n      });\n    });\n\n    await page.goto(\"/\");\n    const input = page.getByTestId(\"multimodal-input\");\n    await input.fill(\"Test error\");\n    await page.getByTestId(\"send-button\").click();\n\n    // Should show error toast or message\n    await expect(page.getByText(ERROR_TEXT_REGEX).first()).toBeVisible({\n      timeout: 5000,\n    });\n  });\n});\n\ntest.describe(\"Suggested Actions\", () => {\n  test(\"suggested actions are clickable\", async ({ page }) => {\n    await page.goto(\"/\");\n\n    const suggestions = page.locator(\n      \"[data-testid='suggested-actions'] button\"\n    );\n    const count = await suggestions.count();\n\n    if (count > 0) {\n      await suggestions.first().click();\n\n      // Should redirect after clicking suggestion\n      await expect(page).toHaveURL(CHAT_URL_REGEX, { timeout: 10_000 });\n    }\n  });\n});\n"
  },
  {
    "path": "tests/e2e/auth.test.ts",
    "content": "import { expect, test } from \"@playwright/test\";\n\ntest.describe(\"Authentication Pages\", () => {\n  test(\"login page renders correctly\", async ({ page }) => {\n    await page.goto(\"/login\");\n    await expect(page.getByPlaceholder(\"user@acme.com\")).toBeVisible();\n    await expect(page.getByLabel(\"Password\")).toBeVisible();\n    await expect(page.getByRole(\"button\", { name: \"Sign In\" })).toBeVisible();\n    await expect(page.getByText(\"Don't have an account?\")).toBeVisible();\n  });\n\n  test(\"register page renders correctly\", async ({ page }) => {\n    await page.goto(\"/register\");\n    await expect(page.getByPlaceholder(\"user@acme.com\")).toBeVisible();\n    await expect(page.getByLabel(\"Password\")).toBeVisible();\n    await expect(page.getByRole(\"button\", { name: \"Sign Up\" })).toBeVisible();\n    await expect(page.getByText(\"Already have an account?\")).toBeVisible();\n  });\n\n  test(\"can navigate from login to register\", async ({ page }) => {\n    await page.goto(\"/login\");\n    await page.getByRole(\"link\", { name: \"Sign up\" }).click();\n    await expect(page).toHaveURL(\"/register\");\n  });\n\n  test(\"can navigate from register to login\", async ({ page }) => {\n    await page.goto(\"/register\");\n    await page.getByRole(\"link\", { name: \"Sign in\" }).click();\n    await expect(page).toHaveURL(\"/login\");\n  });\n});\n"
  },
  {
    "path": "tests/e2e/chat.test.ts",
    "content": "import { expect, test } from \"@playwright/test\";\n\ntest.describe(\"Chat Page\", () => {\n  test(\"home page loads with input field\", async ({ page }) => {\n    await page.goto(\"/\");\n    await expect(page.getByTestId(\"multimodal-input\")).toBeVisible();\n  });\n\n  test(\"can type in the input field\", async ({ page }) => {\n    await page.goto(\"/\");\n    const input = page.getByTestId(\"multimodal-input\");\n    await input.fill(\"Hello world\");\n    await expect(input).toHaveValue(\"Hello world\");\n  });\n\n  test(\"submit button is visible\", async ({ page }) => {\n    await page.goto(\"/\");\n    await expect(page.getByTestId(\"send-button\")).toBeVisible();\n  });\n\n  test(\"suggested actions are visible on empty chat\", async ({ page }) => {\n    await page.goto(\"/\");\n    const suggestions = page.locator(\"[data-testid='suggested-actions']\");\n    await expect(suggestions).toBeVisible();\n  });\n\n  test(\"can stop generation with stop button\", async ({ page }) => {\n    await page.goto(\"/\");\n\n    // Type and send a message\n    await page.getByTestId(\"multimodal-input\").fill(\"Hello\");\n    await page.getByTestId(\"send-button\").click();\n\n    // Stop button should appear during generation\n    const stopButton = page.getByTestId(\"stop-button\");\n    // If generation starts, stop button appears\n    // This is a best-effort check since timing depends on API\n    await stopButton.click({ timeout: 5000 }).catch(() => {\n      // Generation may have finished before we could click\n    });\n  });\n});\n\ntest.describe(\"Chat Input Features\", () => {\n  test(\"input clears after sending\", async ({ page }) => {\n    await page.goto(\"/\");\n    const input = page.getByTestId(\"multimodal-input\");\n    await input.fill(\"Test message\");\n    await page.getByTestId(\"send-button\").click();\n\n    // Input should clear after sending\n    await expect(input).toHaveValue(\"\");\n  });\n\n  test(\"input supports multiline text\", async ({ page }) => {\n    await page.goto(\"/\");\n    const input = page.getByTestId(\"multimodal-input\");\n    await input.fill(\"Line 1\\nLine 2\\nLine 3\");\n    await expect(input).toContainText(\"Line 1\");\n  });\n});\n"
  },
  {
    "path": "tests/e2e/model-selector.test.ts",
    "content": "import { expect, test } from \"@playwright/test\";\n\nconst MODEL_BUTTON_REGEX = /Gemini|Claude|GPT|Grok/i;\n\ntest.describe(\"Model Selector\", () => {\n  test.beforeEach(async ({ page }) => {\n    await page.goto(\"/\");\n  });\n\n  test(\"displays a model button\", async ({ page }) => {\n    // Look for any button with model-related content\n    const modelButton = page\n      .locator(\"button\")\n      .filter({ hasText: MODEL_BUTTON_REGEX })\n      .first();\n    await expect(modelButton).toBeVisible();\n  });\n\n  test(\"opens model selector popover on click\", async ({ page }) => {\n    const modelButton = page\n      .locator(\"button\")\n      .filter({ hasText: MODEL_BUTTON_REGEX })\n      .first();\n    await modelButton.click();\n\n    // Search input should be visible in the popover\n    await expect(page.getByPlaceholder(\"Search models...\")).toBeVisible();\n  });\n\n  test(\"can search for models\", async ({ page }) => {\n    const modelButton = page\n      .locator(\"button\")\n      .filter({ hasText: MODEL_BUTTON_REGEX })\n      .first();\n    await modelButton.click();\n\n    const searchInput = page.getByPlaceholder(\"Search models...\");\n    await searchInput.fill(\"Claude\");\n\n    // Should show at least one Claude model\n    await expect(page.getByText(\"Claude Haiku\").first()).toBeVisible();\n  });\n\n  test(\"can close model selector by clicking outside\", async ({ page }) => {\n    const modelButton = page\n      .locator(\"button\")\n      .filter({ hasText: MODEL_BUTTON_REGEX })\n      .first();\n    await modelButton.click();\n\n    await expect(page.getByPlaceholder(\"Search models...\")).toBeVisible();\n\n    // Click outside to close\n    await page.keyboard.press(\"Escape\");\n\n    await expect(page.getByPlaceholder(\"Search models...\")).not.toBeVisible();\n  });\n\n  test(\"shows model provider groups\", async ({ page }) => {\n    const modelButton = page\n      .locator(\"button\")\n      .filter({ hasText: MODEL_BUTTON_REGEX })\n      .first();\n    await modelButton.click();\n\n    // Should show provider group headers\n    await expect(page.getByText(\"Anthropic\")).toBeVisible();\n    await expect(page.getByText(\"Google\")).toBeVisible();\n  });\n\n  test(\"can select a different model\", async ({ page }) => {\n    const modelButton = page\n      .locator(\"button\")\n      .filter({ hasText: MODEL_BUTTON_REGEX })\n      .first();\n    await modelButton.click();\n\n    // Select a specific model\n    await page.getByText(\"Claude Haiku\").first().click();\n\n    // Popover should close\n    await expect(page.getByPlaceholder(\"Search models...\")).not.toBeVisible();\n\n    // Model button should now show the selected model\n    await expect(\n      page.locator(\"button\").filter({ hasText: \"Claude Haiku\" }).first()\n    ).toBeVisible();\n  });\n});\n"
  },
  {
    "path": "tests/fixtures.ts",
    "content": "import { expect as baseExpect, test as baseTest } from \"@playwright/test\";\nimport { ChatPage } from \"./pages/chat\";\n\ntype Fixtures = {\n  chatPage: ChatPage;\n};\n\nexport const test = baseTest.extend<Fixtures>({\n  chatPage: async ({ page }, use) => {\n    const chatPage = new ChatPage(page);\n    await use(chatPage);\n  },\n});\n\nexport const expect = baseExpect;\n"
  },
  {
    "path": "tests/helpers.ts",
    "content": "import { generateId } from \"ai\";\nimport { getUnixTime } from \"date-fns\";\n\nexport function generateRandomTestUser() {\n  const email = `test-${getUnixTime(new Date())}@playwright.com`;\n  const password = generateId();\n\n  return {\n    email,\n    password,\n  };\n}\n\nexport function generateTestMessage() {\n  return `Test message ${Date.now()}`;\n}\n"
  },
  {
    "path": "tests/pages/chat.ts",
    "content": "import type { Page } from \"@playwright/test\";\n\nconst MODEL_BUTTON_REGEX = /Gemini|Claude|GPT|Grok/i;\n\nexport class ChatPage {\n  page: Page;\n\n  constructor(page: Page) {\n    this.page = page;\n  }\n\n  async goto() {\n    await this.page.goto(\"/\");\n  }\n\n  async createNewChat() {\n    await this.page.goto(\"/\");\n    await this.page.waitForSelector(\"[data-testid='multimodal-input']\");\n  }\n\n  getInput() {\n    return this.page.getByTestId(\"multimodal-input\");\n  }\n\n  async typeMessage(message: string) {\n    const input = this.getInput();\n    await input.fill(message);\n  }\n\n  async sendMessage() {\n    await this.page.getByTestId(\"send-button\").click();\n  }\n\n  async sendUserMessage(message: string) {\n    await this.typeMessage(message);\n    await this.sendMessage();\n  }\n\n  getSendButton() {\n    return this.page.getByTestId(\"send-button\");\n  }\n\n  getStopButton() {\n    return this.page.getByTestId(\"stop-button\");\n  }\n\n  async clickSuggestedAction(index = 0) {\n    const suggestions = this.page.locator(\n      \"[data-testid='suggested-actions'] button\"\n    );\n    await suggestions.nth(index).click();\n  }\n\n  async openModelSelector() {\n    const modelButton = this.page\n      .locator(\"button\")\n      .filter({ hasText: MODEL_BUTTON_REGEX })\n      .first();\n    await modelButton.click();\n  }\n\n  async selectModel(modelName: string) {\n    await this.openModelSelector();\n    await this.page.getByText(modelName).first().click();\n  }\n\n  async searchModels(query: string) {\n    await this.openModelSelector();\n    await this.page.getByPlaceholder(\"Search models...\").fill(query);\n  }\n}\n"
  },
  {
    "path": "tests/prompts/utils.ts",
    "content": "import type { LanguageModelV3StreamPart } from \"@ai-sdk/provider\";\n\nconst mockUsage = {\n  inputTokens: { total: 10, noCache: 10, cacheRead: 0, cacheWrite: 0 },\n  outputTokens: { total: 20, text: 20, reasoning: 0 },\n};\n\nexport function getResponseChunksByPrompt(\n  _prompt: unknown,\n  includeReasoning = false\n): LanguageModelV3StreamPart[] {\n  const chunks: LanguageModelV3StreamPart[] = [];\n\n  if (includeReasoning) {\n    chunks.push(\n      { type: \"reasoning-start\", id: \"r1\" },\n      { type: \"reasoning-delta\", id: \"r1\", delta: \"Let me think about this.\" },\n      { type: \"reasoning-end\", id: \"r1\" }\n    );\n  }\n\n  chunks.push(\n    { type: \"text-start\", id: \"t1\" },\n    { type: \"text-delta\", id: \"t1\", delta: \"Hello, world!\" },\n    { type: \"text-end\", id: \"t1\" },\n    {\n      type: \"finish\",\n      finishReason: { unified: \"stop\", raw: \"stop\" },\n      usage: mockUsage,\n    }\n  );\n\n  return chunks;\n}\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ESNext\",\n    \"lib\": [\"dom\", \"dom.iterable\", \"esnext\"],\n    \"allowJs\": true,\n    \"skipLibCheck\": true,\n    \"strict\": true,\n    \"noEmit\": true,\n    \"esModuleInterop\": true,\n    \"module\": \"esnext\",\n    \"moduleResolution\": \"bundler\",\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": true,\n    \"jsx\": \"react-jsx\",\n    \"incremental\": true,\n    \"plugins\": [\n      {\n        \"name\": \"next\"\n      }\n    ],\n    \"paths\": {\n      \"@/*\": [\"./*\"]\n    },\n    \"strictNullChecks\": true\n  },\n  \"include\": [\n    \"next-env.d.ts\",\n    \"**/*.ts\",\n    \"**/*.tsx\",\n    \".next/types/**/*.ts\",\n    \"next.config.js\",\n    \".next/dev/types/**/*.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "tsconfig.tsbuildinfo",
    "content": "{\"fileNames\":[\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es5.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2015.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2016.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2017.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2018.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2019.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2020.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2021.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2022.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2023.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2024.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.esnext.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.dom.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.dom.iterable.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2015.core.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2015.collection.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2015.generator.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2015.iterable.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2015.promise.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2015.proxy.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2015.reflect.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2015.symbol.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2016.array.include.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2016.intl.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2017.date.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2017.object.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2017.string.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2017.intl.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2018.intl.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2018.promise.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2018.regexp.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2019.array.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2019.object.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2019.string.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2019.symbol.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2019.intl.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2020.bigint.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2020.date.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2020.promise.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2020.string.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2020.intl.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2020.number.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2021.promise.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2021.string.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2021.weakref.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2021.intl.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2022.array.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2022.error.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2022.intl.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2022.object.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2022.string.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2022.regexp.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2023.array.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2023.collection.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2023.intl.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2024.collection.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2024.object.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2024.promise.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2024.regexp.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2024.string.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.esnext.array.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.esnext.collection.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.esnext.intl.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.esnext.disposable.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.esnext.promise.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.esnext.decorators.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.esnext.iterator.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.esnext.float16.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.decorators.d.ts\",\"./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.decorators.legacy.d.ts\",\"./node_modules/.pnpm/@types+react@18.3.18/node_modules/@types/react/global.d.ts\",\"./node_modules/.pnpm/csstype@3.1.3/node_modules/csstype/index.d.ts\",\"./node_modules/.pnpm/@types+prop-types@15.7.14/node_modules/@types/prop-types/index.d.ts\",\"./node_modules/.pnpm/@types+react@18.3.18/node_modules/@types/react/index.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/styled-jsx/types/css.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/styled-jsx/types/macro.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/styled-jsx/types/style.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/styled-jsx/types/global.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/styled-jsx/types/index.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/get-page-files.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/compatibility/disposable.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/compatibility/indexable.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/compatibility/iterators.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/compatibility/index.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/globals.typedarray.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/buffer.buffer.d.ts\",\"./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/header.d.ts\",\"./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/readable.d.ts\",\"./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/file.d.ts\",\"./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/fetch.d.ts\",\"./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/formdata.d.ts\",\"./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/connector.d.ts\",\"./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/client.d.ts\",\"./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/errors.d.ts\",\"./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/dispatcher.d.ts\",\"./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/global-dispatcher.d.ts\",\"./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/global-origin.d.ts\",\"./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/pool-stats.d.ts\",\"./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/pool.d.ts\",\"./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/handlers.d.ts\",\"./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/balanced-pool.d.ts\",\"./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/agent.d.ts\",\"./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/mock-interceptor.d.ts\",\"./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/mock-agent.d.ts\",\"./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/mock-client.d.ts\",\"./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/mock-pool.d.ts\",\"./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/mock-errors.d.ts\",\"./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/proxy-agent.d.ts\",\"./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/env-http-proxy-agent.d.ts\",\"./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/retry-handler.d.ts\",\"./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/retry-agent.d.ts\",\"./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/api.d.ts\",\"./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/interceptors.d.ts\",\"./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/util.d.ts\",\"./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/cookies.d.ts\",\"./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/patch.d.ts\",\"./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/websocket.d.ts\",\"./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/eventsource.d.ts\",\"./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/filereader.d.ts\",\"./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/diagnostics-channel.d.ts\",\"./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/content-type.d.ts\",\"./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/cache.d.ts\",\"./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/index.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/globals.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/assert.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/assert/strict.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/async_hooks.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/buffer.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/child_process.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/cluster.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/console.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/constants.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/crypto.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/dgram.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/diagnostics_channel.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/dns.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/dns/promises.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/domain.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/dom-events.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/events.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/fs.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/fs/promises.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/http.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/http2.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/https.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/inspector.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/module.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/net.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/os.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/path.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/perf_hooks.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/process.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/punycode.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/querystring.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/readline.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/readline/promises.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/repl.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/sea.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/sqlite.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/stream.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/stream/promises.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/stream/consumers.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/stream/web.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/string_decoder.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/test.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/timers.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/timers/promises.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/tls.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/trace_events.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/tty.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/url.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/util.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/v8.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/vm.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/wasi.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/worker_threads.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/zlib.d.ts\",\"./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/index.d.ts\",\"./node_modules/.pnpm/@types+react@18.3.18/node_modules/@types/react/canary.d.ts\",\"./node_modules/.pnpm/@types+react@18.3.18/node_modules/@types/react/experimental.d.ts\",\"./node_modules/.pnpm/@types+react-dom@18.3.5_@types+react@18.3.18/node_modules/@types/react-dom/index.d.ts\",\"./node_modules/.pnpm/@types+react-dom@18.3.5_@types+react@18.3.18/node_modules/@types/react-dom/canary.d.ts\",\"./node_modules/.pnpm/@types+react-dom@18.3.5_@types+react@18.3.18/node_modules/@types/react-dom/experimental.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/lib/fallback.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/compiled/webpack/webpack.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/modern-browserslist-target.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/entry-constants.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/constants.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/config.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/lib/load-custom-routes.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/image-config.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/webpack/plugins/subresource-integrity-plugin.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/body-streams.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/lib/cache-control.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/lib/setup-exception-listeners.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/lib/worker.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/lib/constants.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/lib/bundler.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/app-router-types.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/static-paths/types.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/client/components/app-router-headers.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/rendering-mode.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/lib/router-utils/build-prefetch-segment-data-route.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/require-hook.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/lib/experimental/ppr.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/lib/page-types.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/segment-config/app/app-segment-config.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/segment-config/pages/pages-segment-config.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/analysis/get-page-static-info.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/webpack/loaders/get-module-build-info.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/webpack/plugins/middleware-plugin.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/node-polyfill-crypto.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/node-environment-baseline.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/node-environment-extensions/error-inspect.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/node-environment-extensions/console-file.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/node-environment-extensions/console-exit.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/node-environment-extensions/console-dim.external.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/node-environment-extensions/unhandled-rejection.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/node-environment-extensions/random.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/node-environment-extensions/date.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/node-environment-extensions/web-crypto.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/node-environment-extensions/node-crypto.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/node-environment.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/page-extensions-type.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/route-kind.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/route-definitions/route-definition.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/route-definitions/app-page-route-definition.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/lib/cache-handlers/types.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/response-cache/types.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/resume-data-cache/cache-store.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/resume-data-cache/resume-data-cache.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/render-result.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/webpack/plugins/flight-manifest-plugin.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/instrumentation/types.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/lib/coalesced-function.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/router/utils/middleware-route-matcher.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/lib/router-utils/types.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/trace/types.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/trace/trace.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/trace/shared.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/trace/index.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/load-jsconfig.d.ts\",\"./node_modules/.pnpm/@next+env@16.0.10/node_modules/@next/env/dist/index.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/webpack/plugins/telemetry-plugin/use-cache-tracker-utils.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/webpack/plugins/telemetry-plugin/telemetry-plugin.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/telemetry/storage.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/build-context.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/bloom-filter.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/webpack-config.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/swc/generated-native.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/swc/types.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/dev/parse-version-info.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/next-devtools/shared/types.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/dev/dev-indicator-server-state.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/next-devtools/dev-overlay/cache-indicator.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/lib/parse-stack.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/next-devtools/server/shared.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/next-devtools/shared/stack-frame.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/next-devtools/dev-overlay/utils/get-error-by-type.d.ts\",\"./node_modules/.pnpm/@types+react@18.3.18/node_modules/@types/react/jsx-runtime.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/next-devtools/dev-overlay/container/runtime-error/render-error.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/next-devtools/dev-overlay/shared.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/dev/debug-channel.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/dev/hot-reloader-types.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/lib/i18n-provider.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/web/next-url.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/compiled/@edge-runtime/cookies/index.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/web/spec-extension/cookies.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/web/spec-extension/request.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/after/builtin-request-context.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/web/spec-extension/fetch-event.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/web/spec-extension/response.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/segment-config/middleware/middleware-config.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/web/types.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/webpack/plugins/pages-manifest-plugin.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/router/utils/parse-url.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/base-http/node.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/webpack/plugins/next-font-manifest-plugin.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/route-definitions/locale-route-definition.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/route-definitions/pages-route-definition.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/mitt.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/client/with-router.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/client/router.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/client/route-loader.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/client/page-loader.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/router/router.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/router-context.shared-runtime.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/loadable-context.shared-runtime.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/loadable.shared-runtime.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/image-config-context.shared-runtime.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/hooks-client-context.shared-runtime.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/head-manager-context.shared-runtime.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/app-router-context.shared-runtime.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/server-inserted-html.shared-runtime.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/route-modules/pages/vendored/contexts/entrypoints.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/route-modules/pages/module.compiled.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/templates/pages.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/route-modules/pages/module.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/deep-readonly.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/next-devtools/userspace/pages/pages-dev-overlay-setup.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/render.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/response-cache/index.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/route-definitions/pages-api-route-definition.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/route-matches/pages-api-route-match.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/route-matchers/route-matcher.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/route-matcher-providers/route-matcher-provider.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/route-matcher-managers/route-matcher-manager.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/normalizers/normalizer.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/normalizers/locale-route-normalizer.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/normalizers/request/pathname-normalizer.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/normalizers/request/suffix.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/normalizers/request/rsc.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/normalizers/request/prefetch-rsc.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/normalizers/request/next-data.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/normalizers/request/segment-prefix-rsc.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/base-server.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/lib/async-callback-set.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/router/utils/route-regex.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/router/utils/route-matcher.d.ts\",\"./node_modules/.pnpm/sharp@0.34.5/node_modules/sharp/lib/index.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/image-optimizer.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/next-server.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/lib/types.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/lib/lru-cache.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/lib/dev-bundler-service.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/use-cache/cache-life.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/dev/static-paths-worker.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/dev/next-dev-server.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/next.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/lib/render-server.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/lib/router-server.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/router/utils/path-match.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/lib/router-utils/filesystem.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/lib/router-utils/setup-dev-bundler.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/lib/router-utils/router-server-context.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/route-modules/route-module.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/load-components.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/web/adapter.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/app-render/types.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/webpack/loaders/metadata/types.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/webpack/loaders/next-app-loader/index.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/lib/app-dir-module.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/web/spec-extension/adapters/request-cookies.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/async-storage/draft-mode-provider.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/web/spec-extension/adapters/headers.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/app-render/cache-signal.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/app-render/dynamic-rendering.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/request/fallback-params.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/app-render/work-unit-async-storage-instance.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/lib/lazy-result.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/lib/implicit-tags.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/app-render/staged-rendering.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/app-render/work-unit-async-storage.external.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/router/utils/parse-relative-url.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/app-render/app-render.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/route-modules/app-page/vendored/contexts/entrypoints.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/client/components/error-boundary.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/client/components/layout-router.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/client/components/render-from-template-context.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/app-render/action-async-storage-instance.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/app-render/action-async-storage.external.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/client/components/client-page.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/client/components/client-segment.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/request/search-params.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/client/components/hooks-server-context.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/client/components/http-access-fallback/error-boundary.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/lib/metadata/types/alternative-urls-types.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/lib/metadata/types/extra-types.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/lib/metadata/types/metadata-types.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/lib/metadata/types/manifest-types.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/lib/metadata/types/opengraph-types.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/lib/metadata/types/twitter-types.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/lib/metadata/types/metadata-interface.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/lib/metadata/types/resolvers.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/lib/metadata/types/icons.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/lib/metadata/resolve-metadata.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/lib/metadata/metadata.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/lib/framework/boundary-components.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/app-render/rsc/preloads.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/app-render/rsc/postpone.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/app-render/rsc/taint.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/segment-cache/segment-value-encoding.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/app-render/collect-segment-data.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/next-devtools/userspace/app/segment-explorer-node.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/app-render/entry-base.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/templates/app-page.d.ts\",\"./node_modules/.pnpm/@types+react@18.3.18/node_modules/@types/react/jsx-dev-runtime.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/route-modules/app-page/vendored/rsc/entrypoints.d.ts\",\"./node_modules/.pnpm/@types+react-dom@18.3.5_@types+react@18.3.18/node_modules/@types/react-dom/client.d.ts\",\"./node_modules/.pnpm/@types+react-dom@18.3.5_@types+react@18.3.18/node_modules/@types/react-dom/server.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/route-modules/app-page/vendored/ssr/entrypoints.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/route-modules/app-page/module.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/route-modules/app-page/module.compiled.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/route-definitions/app-route-route-definition.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/async-storage/work-store.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/web/http.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/route-modules/app-route/shared-modules.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/client/components/redirect-status-code.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/client/components/redirect-error.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/templates/app-route.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/route-modules/app-route/module.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/route-modules/app-route/module.compiled.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/segment-config/app/app-segments.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/utils.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/turborepo-access-trace/types.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/turborepo-access-trace/result.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/turborepo-access-trace/helpers.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/turborepo-access-trace/index.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/export/routes/types.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/export/types.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/export/worker.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/worker.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/index.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/lib/incremental-cache/index.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/after/after.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/after/after-context.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/app-render/work-async-storage-instance.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/app-render/work-async-storage.external.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/request/params.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/route-matches/route-match.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/request-meta.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/cli/next-test.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/config-shared.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/base-http/index.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/api-utils/index.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/build/adapter/build-complete.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/types.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/html-context.shared-runtime.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/utils.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/pages/_app.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/app.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/web/spec-extension/unstable-cache.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/web/spec-extension/revalidate.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/web/spec-extension/unstable-no-store.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/use-cache/cache-tag.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/cache.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/pages/_document.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/document.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/dynamic.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dynamic.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/pages/_error.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/error.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/head.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/head.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/request/cookies.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/request/headers.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/request/draft-mode.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/headers.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/get-img-props.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/client/image-component.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/shared/lib/image-external.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/image.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/client/link.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/link.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/client/components/readonly-url-search-params.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/client/components/unrecognized-action-error.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/client/components/redirect.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/client/components/not-found.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/client/components/forbidden.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/client/components/unauthorized.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/client/components/unstable-rethrow.server.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/client/components/unstable-rethrow.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/client/components/navigation.react-server.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/client/components/navigation.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/navigation.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/router.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/client/script.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/script.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/web/spec-extension/user-agent.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/compiled/@edge-runtime/primitives/url.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/web/spec-extension/image-response.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/compiled/@vercel/og/satori/index.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/compiled/@vercel/og/emoji/index.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/compiled/@vercel/og/types.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/after/index.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/server/request/connection.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/server.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/types/global.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/types/compiled.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/types.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/index.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/image-types/global.d.ts\",\"./.next/dev/types/routes.d.ts\",\"./next-env.d.ts\",\"./node_modules/.pnpm/dotenv@16.4.7/node_modules/dotenv/lib/main.d.ts\",\"./node_modules/.pnpm/drizzle-kit@0.25.0/node_modules/drizzle-kit/common-dyjgls6u.d.mts\",\"./node_modules/.pnpm/drizzle-kit@0.25.0/node_modules/drizzle-kit/index.d.mts\",\"./drizzle.config.ts\",\"./node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/baggage/internal/symbol.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/baggage/types.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/baggage/utils.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/common/exception.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/common/time.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/common/attributes.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/context/types.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/context/context.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/api/context.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/diag/types.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/diag/consolelogger.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/api/diag.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/metrics/observableresult.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/metrics/metric.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/metrics/meter.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/metrics/noopmeter.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/metrics/meterprovider.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/api/metrics.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/propagation/textmappropagator.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/baggage/context-helpers.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/api/propagation.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/attributes.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/trace_state.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/span_context.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/link.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/status.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/span.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/span_kind.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/spanoptions.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/tracer.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/tracer_options.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/proxytracer.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/tracer_provider.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/proxytracerprovider.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/samplingresult.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/sampler.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/trace_flags.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/internal/utils.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/spancontext-utils.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/invalid-span-constants.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/context-utils.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/api/trace.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/context-api.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/diag-api.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/metrics-api.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/propagation-api.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace-api.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/index.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api-logs@0.57.2/node_modules/@opentelemetry/api-logs/build/src/types/anyvalue.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api-logs@0.57.2/node_modules/@opentelemetry/api-logs/build/src/types/logrecord.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api-logs@0.57.2/node_modules/@opentelemetry/api-logs/build/src/types/logger.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api-logs@0.57.2/node_modules/@opentelemetry/api-logs/build/src/types/loggeroptions.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api-logs@0.57.2/node_modules/@opentelemetry/api-logs/build/src/types/loggerprovider.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api-logs@0.57.2/node_modules/@opentelemetry/api-logs/build/src/nooplogger.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api-logs@0.57.2/node_modules/@opentelemetry/api-logs/build/src/nooploggerprovider.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api-logs@0.57.2/node_modules/@opentelemetry/api-logs/build/src/proxylogger.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api-logs@0.57.2/node_modules/@opentelemetry/api-logs/build/src/proxyloggerprovider.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api-logs@0.57.2/node_modules/@opentelemetry/api-logs/build/src/api/logs.d.ts\",\"./node_modules/.pnpm/@opentelemetry+api-logs@0.57.2/node_modules/@opentelemetry/api-logs/build/src/index.d.ts\",\"./node_modules/.pnpm/@opentelemetry+instrumentation@0.57.2_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/types.d.ts\",\"./node_modules/.pnpm/@opentelemetry+instrumentation@0.57.2_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/types_internal.d.ts\",\"./node_modules/.pnpm/@opentelemetry+instrumentation@0.57.2_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/autoloader.d.ts\",\"./node_modules/.pnpm/@types+shimmer@1.2.0/node_modules/@types/shimmer/index.d.ts\",\"./node_modules/.pnpm/@opentelemetry+instrumentation@0.57.2_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/instrumentation.d.ts\",\"./node_modules/.pnpm/@opentelemetry+instrumentation@0.57.2_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/platform/node/instrumentation.d.ts\",\"./node_modules/.pnpm/@opentelemetry+instrumentation@0.57.2_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/platform/node/normalize.d.ts\",\"./node_modules/.pnpm/@opentelemetry+instrumentation@0.57.2_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/platform/node/index.d.ts\",\"./node_modules/.pnpm/@opentelemetry+instrumentation@0.57.2_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/platform/index.d.ts\",\"./node_modules/.pnpm/@opentelemetry+instrumentation@0.57.2_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/instrumentationnodemoduledefinition.d.ts\",\"./node_modules/.pnpm/@opentelemetry+instrumentation@0.57.2_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/instrumentationnodemodulefile.d.ts\",\"./node_modules/.pnpm/@opentelemetry+instrumentation@0.57.2_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/utils.d.ts\",\"./node_modules/.pnpm/@opentelemetry+instrumentation@0.57.2_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/index.d.ts\",\"./node_modules/.pnpm/@opentelemetry+resources@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/config.d.ts\",\"./node_modules/.pnpm/@opentelemetry+resources@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/iresource.d.ts\",\"./node_modules/.pnpm/@opentelemetry+resources@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/types.d.ts\",\"./node_modules/.pnpm/@opentelemetry+resources@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/resource.d.ts\",\"./node_modules/.pnpm/@opentelemetry+resources@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/platform/node/default-service-name.d.ts\",\"./node_modules/.pnpm/@opentelemetry+resources@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/platform/node/index.d.ts\",\"./node_modules/.pnpm/@opentelemetry+resources@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/platform/index.d.ts\",\"./node_modules/.pnpm/@opentelemetry+resources@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/platform/node/hostdetector.d.ts\",\"./node_modules/.pnpm/@opentelemetry+resources@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/platform/node/hostdetectorsync.d.ts\",\"./node_modules/.pnpm/@opentelemetry+resources@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/platform/node/osdetector.d.ts\",\"./node_modules/.pnpm/@opentelemetry+resources@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/platform/node/osdetectorsync.d.ts\",\"./node_modules/.pnpm/@opentelemetry+resources@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/platform/node/processdetector.d.ts\",\"./node_modules/.pnpm/@opentelemetry+resources@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/platform/node/processdetectorsync.d.ts\",\"./node_modules/.pnpm/@opentelemetry+resources@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/platform/node/serviceinstanceiddetectorsync.d.ts\",\"./node_modules/.pnpm/@opentelemetry+resources@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/platform/node/index.d.ts\",\"./node_modules/.pnpm/@opentelemetry+resources@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/platform/index.d.ts\",\"./node_modules/.pnpm/@opentelemetry+resources@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/browserdetector.d.ts\",\"./node_modules/.pnpm/@opentelemetry+resources@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/envdetector.d.ts\",\"./node_modules/.pnpm/@opentelemetry+resources@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/browserdetectorsync.d.ts\",\"./node_modules/.pnpm/@opentelemetry+resources@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/envdetectorsync.d.ts\",\"./node_modules/.pnpm/@opentelemetry+resources@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/index.d.ts\",\"./node_modules/.pnpm/@opentelemetry+resources@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detect-resources.d.ts\",\"./node_modules/.pnpm/@opentelemetry+resources@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/index.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-logs@0.57.2_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/types.d.ts\",\"./node_modules/.pnpm/@opentelemetry+core@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/baggage/propagation/w3cbaggagepropagator.d.ts\",\"./node_modules/.pnpm/@opentelemetry+core@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/common/anchored-clock.d.ts\",\"./node_modules/.pnpm/@opentelemetry+core@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/common/attributes.d.ts\",\"./node_modules/.pnpm/@opentelemetry+core@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/common/types.d.ts\",\"./node_modules/.pnpm/@opentelemetry+core@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/common/global-error-handler.d.ts\",\"./node_modules/.pnpm/@opentelemetry+core@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/common/logging-error-handler.d.ts\",\"./node_modules/.pnpm/@opentelemetry+core@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/common/time.d.ts\",\"./node_modules/.pnpm/@opentelemetry+core@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/common/hex-to-binary.d.ts\",\"./node_modules/.pnpm/@opentelemetry+core@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/exportresult.d.ts\",\"./node_modules/.pnpm/@opentelemetry+core@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/baggage/utils.d.ts\",\"./node_modules/.pnpm/@opentelemetry+core@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/utils/environment.d.ts\",\"./node_modules/.pnpm/@opentelemetry+core@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/platform/node/environment.d.ts\",\"./node_modules/.pnpm/@opentelemetry+core@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/platform/node/globalthis.d.ts\",\"./node_modules/.pnpm/@opentelemetry+core@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/platform/node/hex-to-base64.d.ts\",\"./node_modules/.pnpm/@opentelemetry+core@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/trace/idgenerator.d.ts\",\"./node_modules/.pnpm/@opentelemetry+core@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/platform/node/randomidgenerator.d.ts\",\"./node_modules/.pnpm/@opentelemetry+core@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/platform/node/performance.d.ts\",\"./node_modules/.pnpm/@opentelemetry+core@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/platform/node/sdk-info.d.ts\",\"./node_modules/.pnpm/@opentelemetry+core@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/platform/node/timer-util.d.ts\",\"./node_modules/.pnpm/@opentelemetry+core@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/platform/node/index.d.ts\",\"./node_modules/.pnpm/@opentelemetry+core@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/platform/index.d.ts\",\"./node_modules/.pnpm/@opentelemetry+core@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/propagation/composite.d.ts\",\"./node_modules/.pnpm/@opentelemetry+core@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/trace/w3ctracecontextpropagator.d.ts\",\"./node_modules/.pnpm/@opentelemetry+core@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/trace/rpc-metadata.d.ts\",\"./node_modules/.pnpm/@opentelemetry+core@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/trace/sampler/alwaysoffsampler.d.ts\",\"./node_modules/.pnpm/@opentelemetry+core@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/trace/sampler/alwaysonsampler.d.ts\",\"./node_modules/.pnpm/@opentelemetry+core@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/trace/sampler/parentbasedsampler.d.ts\",\"./node_modules/.pnpm/@opentelemetry+core@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/trace/sampler/traceidratiobasedsampler.d.ts\",\"./node_modules/.pnpm/@opentelemetry+core@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/trace/suppress-tracing.d.ts\",\"./node_modules/.pnpm/@opentelemetry+core@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/trace/tracestate.d.ts\",\"./node_modules/.pnpm/@opentelemetry+core@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/utils/merge.d.ts\",\"./node_modules/.pnpm/@opentelemetry+core@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/utils/sampling.d.ts\",\"./node_modules/.pnpm/@opentelemetry+core@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/utils/timeout.d.ts\",\"./node_modules/.pnpm/@opentelemetry+core@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/utils/url.d.ts\",\"./node_modules/.pnpm/@opentelemetry+core@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/utils/wrap.d.ts\",\"./node_modules/.pnpm/@opentelemetry+core@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/utils/callback.d.ts\",\"./node_modules/.pnpm/@opentelemetry+core@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/version.d.ts\",\"./node_modules/.pnpm/@opentelemetry+core@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/internal/exporter.d.ts\",\"./node_modules/.pnpm/@opentelemetry+core@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/index.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-logs@0.57.2_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/export/readablelogrecord.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-logs@0.57.2_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/internal/loggerprovidersharedstate.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-logs@0.57.2_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/logrecord.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-logs@0.57.2_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/logrecordprocessor.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-logs@0.57.2_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/loggerprovider.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-logs@0.57.2_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/export/nooplogrecordprocessor.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-logs@0.57.2_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/export/logrecordexporter.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-logs@0.57.2_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/export/consolelogrecordexporter.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-logs@0.57.2_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/export/simplelogrecordprocessor.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-logs@0.57.2_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/export/inmemorylogrecordexporter.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-logs@0.57.2_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/export/batchlogrecordprocessorbase.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-logs@0.57.2_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/platform/node/export/batchlogrecordprocessor.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-logs@0.57.2_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/platform/node/index.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-logs@0.57.2_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/platform/index.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-logs@0.57.2_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/index.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/timedevent.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/export/readablespan.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/span.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/spanprocessor.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/idgenerator.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/sampler.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/types.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/export/spanexporter.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/basictracerprovider.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/tracer.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/export/batchspanprocessorbase.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/platform/node/export/batchspanprocessor.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/platform/node/randomidgenerator.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/platform/node/index.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/platform/index.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/export/consolespanexporter.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/export/inmemoryspanexporter.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/export/simplespanprocessor.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/export/noopspanprocessor.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/sampler/alwaysoffsampler.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/sampler/alwaysonsampler.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/sampler/parentbasedsampler.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/sampler/traceidratiobasedsampler.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/index.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-metrics@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/view/attributesprocessor.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-metrics@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/view/predicate.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-metrics@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/view/instrumentselector.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-metrics@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/view/meterselector.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-metrics@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/export/aggregationtemporality.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-metrics@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/utils.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-metrics@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/types.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-metrics@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/drop.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-metrics@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/histogram.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-metrics@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/exponential-histogram/buckets.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-metrics@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/exponential-histogram/mapping/types.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-metrics@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/exponentialhistogram.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-metrics@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/lastvalue.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-metrics@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/sum.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-metrics@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/index.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-metrics@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/view/aggregation.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-metrics@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/view/view.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-metrics@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/instrumentdescriptor.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-metrics@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/export/metricdata.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-metrics@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/export/aggregationselector.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-metrics@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/export/metricexporter.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-metrics@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/export/metricproducer.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-metrics@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/types.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-metrics@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/export/cardinalityselector.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-metrics@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/export/metricreader.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-metrics@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/export/periodicexportingmetricreader.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-metrics@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/export/inmemorymetricexporter.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-metrics@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/export/consolemetricexporter.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-metrics@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/meterprovider.d.ts\",\"./node_modules/.pnpm/@opentelemetry+sdk-metrics@1.30.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/index.d.ts\",\"./node_modules/.pnpm/@vercel+otel@1.14.0_@opentelemetry+api-logs@0.200.0_@opentelemetry+api@1.9.0_@opentelemetry+i_uybhrqvlz4uuo544tb5yunej5y/node_modules/@vercel/otel/dist/types/instrumentations/fetch.d.ts\",\"./node_modules/.pnpm/@vercel+otel@1.14.0_@opentelemetry+api-logs@0.200.0_@opentelemetry+api@1.9.0_@opentelemetry+i_uybhrqvlz4uuo544tb5yunej5y/node_modules/@vercel/otel/dist/types/types.d.ts\",\"./node_modules/.pnpm/@vercel+otel@1.14.0_@opentelemetry+api-logs@0.200.0_@opentelemetry+api@1.9.0_@opentelemetry+i_uybhrqvlz4uuo544tb5yunej5y/node_modules/@vercel/otel/dist/types/exporters/config.d.ts\",\"./node_modules/.pnpm/@vercel+otel@1.14.0_@opentelemetry+api-logs@0.200.0_@opentelemetry+api@1.9.0_@opentelemetry+i_uybhrqvlz4uuo544tb5yunej5y/node_modules/@vercel/otel/dist/types/exporters/exporter-trace-otlp-http-fetch.d.ts\",\"./node_modules/.pnpm/@vercel+otel@1.14.0_@opentelemetry+api-logs@0.200.0_@opentelemetry+api@1.9.0_@opentelemetry+i_uybhrqvlz4uuo544tb5yunej5y/node_modules/@vercel/otel/dist/types/exporters/exporter-trace-otlp-proto-fetch.d.ts\",\"./node_modules/.pnpm/@vercel+otel@1.14.0_@opentelemetry+api-logs@0.200.0_@opentelemetry+api@1.9.0_@opentelemetry+i_uybhrqvlz4uuo544tb5yunej5y/node_modules/@vercel/otel/dist/types/index.d.ts\",\"./instrumentation.ts\",\"./next.config.ts\",\"./node_modules/.pnpm/playwright-core@1.51.0/node_modules/playwright-core/types/protocol.d.ts\",\"./node_modules/.pnpm/playwright-core@1.51.0/node_modules/playwright-core/types/structs.d.ts\",\"./node_modules/.pnpm/playwright-core@1.51.0/node_modules/playwright-core/types/types.d.ts\",\"./node_modules/.pnpm/playwright-core@1.51.0/node_modules/playwright-core/index.d.ts\",\"./node_modules/.pnpm/playwright@1.51.0/node_modules/playwright/types/test.d.ts\",\"./node_modules/.pnpm/playwright@1.51.0/node_modules/playwright/test.d.ts\",\"./node_modules/.pnpm/@playwright+test@1.51.0/node_modules/@playwright/test/index.d.ts\",\"./playwright.config.ts\",\"./node_modules/.pnpm/@types+cookie@0.6.0/node_modules/@types/cookie/index.d.ts\",\"./node_modules/.pnpm/oauth4webapi@3.3.1/node_modules/oauth4webapi/build/index.d.ts\",\"./node_modules/.pnpm/@auth+core@0.37.2/node_modules/@auth/core/lib/utils/cookie.d.ts\",\"./node_modules/.pnpm/@auth+core@0.37.2/node_modules/@auth/core/lib/symbols.d.ts\",\"./node_modules/.pnpm/@auth+core@0.37.2/node_modules/@auth/core/lib/index.d.ts\",\"./node_modules/.pnpm/@auth+core@0.37.2/node_modules/@auth/core/lib/utils/env.d.ts\",\"./node_modules/.pnpm/preact@10.11.3/node_modules/preact/src/jsx.d.ts\",\"./node_modules/.pnpm/preact@10.11.3/node_modules/preact/src/index.d.ts\",\"./node_modules/.pnpm/@auth+core@0.37.2/node_modules/@auth/core/providers/credentials.d.ts\",\"./node_modules/.pnpm/@auth+core@0.37.2/node_modules/@auth/core/providers/nodemailer.d.ts\",\"./node_modules/.pnpm/@auth+core@0.37.2/node_modules/@auth/core/providers/email.d.ts\",\"./node_modules/.pnpm/@auth+core@0.37.2/node_modules/@auth/core/providers/oauth-types.d.ts\",\"./node_modules/.pnpm/@auth+core@0.37.2/node_modules/@auth/core/providers/oauth.d.ts\",\"./node_modules/.pnpm/@auth+core@0.37.2/node_modules/@auth/core/providers/webauthn.d.ts\",\"./node_modules/.pnpm/@auth+core@0.37.2/node_modules/@auth/core/providers/index.d.ts\",\"./node_modules/.pnpm/@auth+core@0.37.2/node_modules/@auth/core/adapters.d.ts\",\"./node_modules/.pnpm/@auth+core@0.37.2/node_modules/@auth/core/lib/utils/actions.d.ts\",\"./node_modules/.pnpm/@auth+core@0.37.2/node_modules/@auth/core/index.d.ts\",\"./node_modules/.pnpm/@auth+core@0.37.2/node_modules/@auth/core/lib/utils/logger.d.ts\",\"./node_modules/.pnpm/@auth+core@0.37.2/node_modules/@auth/core/lib/utils/webauthn-utils.d.ts\",\"./node_modules/.pnpm/@auth+core@0.37.2/node_modules/@auth/core/types.d.ts\",\"./node_modules/.pnpm/@auth+core@0.37.2/node_modules/@auth/core/jwt.d.ts\",\"./node_modules/.pnpm/next-auth@5.0.0-beta.25_next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-d_kwdwn6b3rajgl6e7ziyurdtwie/node_modules/next-auth/jwt.d.ts\",\"./node_modules/.pnpm/@ai-sdk+provider@2.0.0/node_modules/@ai-sdk/provider/dist/index.d.ts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/core/standard-schema.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/core/util.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/core/versions.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/core/schemas.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/core/checks.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/core/errors.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/core/core.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/core/parse.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/core/regexes.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/ar.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/az.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/be.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/ca.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/cs.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/de.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/en.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/eo.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/es.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/fa.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/fi.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/fr.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/fr-ca.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/he.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/hu.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/id.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/it.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/ja.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/kh.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/ko.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/mk.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/ms.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/nl.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/no.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/ota.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/ps.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/pl.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/pt.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/ru.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/sl.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/sv.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/ta.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/th.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/tr.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/ua.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/ur.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/vi.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/zh-cn.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/zh-tw.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/index.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/core/registries.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/core/doc.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/core/function.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/core/api.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/core/json-schema.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/core/to-json-schema.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/core/index.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/classic/errors.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/classic/parse.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/classic/schemas.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/classic/checks.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/classic/compat.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/classic/iso.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/classic/coerce.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/classic/external.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/classic/index.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/index.d.cts\",\"./node_modules/.pnpm/@standard-schema+spec@1.0.0/node_modules/@standard-schema/spec/dist/index.d.ts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/typealiases.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/util.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/zoderror.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/locales/en.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/errors.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/parseutil.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/enumutil.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/errorutil.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/partialutil.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/standard-schema.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/types.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/external.d.cts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/index.d.cts\",\"./node_modules/.pnpm/eventsource-parser@3.0.6/node_modules/eventsource-parser/dist/stream.d.ts\",\"./node_modules/.pnpm/@ai-sdk+provider-utils@3.0.18_zod@3.25.76/node_modules/@ai-sdk/provider-utils/dist/index.d.ts\",\"./node_modules/.pnpm/@ai-sdk+gateway@2.0.18_zod@3.25.76/node_modules/@ai-sdk/gateway/dist/index.d.ts\",\"./node_modules/.pnpm/ai@5.0.108_zod@3.25.76/node_modules/ai/dist/index.d.ts\",\"./node_modules/.pnpm/bcrypt-ts@5.0.3/node_modules/bcrypt-ts/dist/node.d.mts\",\"./lib/db/utils.ts\",\"./lib/constants.ts\",\"./proxy.ts\",\"./node_modules/.pnpm/zod@3.25.76/node_modules/zod/index.d.cts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/entity.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/logger.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/utils.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/casing.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/subquery.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/sql/sql.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/operations.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/table.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/checks.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/columns/binary.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/columns/boolean.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/columns/char.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/columns/custom.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/columns/date.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/columns/datetime.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/columns/decimal.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/columns/double.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/columns/enum.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/columns/float.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/columns/int.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/columns/json.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/columns/mediumint.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/columns/real.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/columns/serial.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/columns/smallint.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/columns/text.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/columns/time.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/columns/date.common.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/columns/timestamp.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/columns/tinyint.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/columns/varbinary.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/columns/varchar.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/columns/year.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/columns/all.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/indexes.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/primary-keys.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/unique-constraint.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/table.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/foreign-keys.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/columns/common.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/columns/bigint.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/columns/index.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/sql/expressions/conditions.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/sql/expressions/select.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/sql/expressions/index.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/sql/functions/aggregate.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/sql/functions/vector.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/sql/functions/index.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/sql/index.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/query-builders/query-builder.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/query-builders/select.types.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/relations.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/migrator.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/query-promise.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/query-builders/delete.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/runnable-query.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/query-builders/update.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/query-builders/insert.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/dialect.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/view-base.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/query-builders/count.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/subquery.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/query-builders/select.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/query-builders/query-builder.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/query-builders/index.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/query-builders/query.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/db.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/session.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/view-common.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/view.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/query-builders/select.types.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/alias.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/schema.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/utils.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/mysql-core/index.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/checks.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/columns/bigserial.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/columns/boolean.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/columns/char.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/columns/cidr.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/columns/custom.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/columns/date.common.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/columns/date.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/columns/double-precision.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/columns/inet.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/sequence.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/columns/int.common.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/columns/integer.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/columns/timestamp.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/columns/interval.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/columns/json.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/columns/jsonb.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/columns/line.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/columns/macaddr.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/columns/macaddr8.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/columns/numeric.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/columns/point.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/columns/postgis_extension/geometry.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/columns/real.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/columns/serial.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/columns/smallint.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/columns/smallserial.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/columns/text.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/columns/time.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/columns/uuid.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/columns/varchar.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/columns/vector_extension/bit.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/columns/vector_extension/halfvec.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/columns/vector_extension/sparsevec.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/columns/vector_extension/vector.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/columns/all.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/indexes.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/primary-keys.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/unique-constraint.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/table.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/foreign-keys.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/columns/common.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/columns/bigint.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/columns/enum.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/columns/index.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/view-base.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/session.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/query-builders/count.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/query-builders/query.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/query-builders/raw.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/query-builders/refresh-materialized-view.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/subquery.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/db.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/session.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/query-builders/delete.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/query-builders/update.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/query-builders/insert.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/query-builders/select.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/query-builders/index.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/dialect.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/query-builders/query-builder.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/view-common.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/view.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/query-builders/select.types.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/alias.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/schema.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/utils.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/utils/array.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/utils/index.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/pg-core/index.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/sqlite-core/checks.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/sqlite-core/columns/custom.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/sqlite-core/indexes.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/sqlite-core/primary-keys.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/sqlite-core/unique-constraint.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/sqlite-core/query-builders/count.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/sqlite-core/query-builders/query.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/sqlite-core/subquery.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/sqlite-core/view-base.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/sqlite-core/db.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/sqlite-core/query-builders/raw.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/sqlite-core/session.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/sqlite-core/query-builders/delete.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/sqlite-core/query-builders/update.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/sqlite-core/query-builders/insert.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/sqlite-core/query-builders/select.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/sqlite-core/query-builders/index.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/sqlite-core/dialect.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/sqlite-core/query-builders/query-builder.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/sqlite-core/view.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/sqlite-core/utils.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/sqlite-core/columns/integer.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/sqlite-core/columns/numeric.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/sqlite-core/columns/real.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/sqlite-core/columns/text.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/sqlite-core/columns/all.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/sqlite-core/table.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/sqlite-core/foreign-keys.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/sqlite-core/columns/common.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/sqlite-core/columns/blob.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/sqlite-core/columns/index.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/sqlite-core/query-builders/select.types.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/sqlite-core/alias.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/sqlite-core/index.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/column-builder.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/column.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/alias.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/errors.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/expressions.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/view-common.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/index.d.ts\",\"./node_modules/.pnpm/postgres@3.4.5/node_modules/postgres/types/index.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/postgres-js/session.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/postgres-js/driver.d.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/postgres-js/index.d.ts\",\"./node_modules/.pnpm/@ai-sdk+react@2.0.109_react@19.0.1_zod@3.25.76/node_modules/@ai-sdk/react/dist/index.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/constants.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/types.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/fp/types.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/types.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/add.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/addbusinessdays.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/adddays.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/addhours.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/addisoweekyears.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/addmilliseconds.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/addminutes.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/addmonths.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/addquarters.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/addseconds.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/addweeks.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/addyears.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/areintervalsoverlapping.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/clamp.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/closestindexto.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/closestto.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/compareasc.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/comparedesc.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/constructfrom.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/constructnow.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/daystoweeks.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceinbusinessdays.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceincalendardays.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceincalendarisoweekyears.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceincalendarisoweeks.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceincalendarmonths.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceincalendarquarters.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceincalendarweeks.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceincalendaryears.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceindays.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceinhours.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceinisoweekyears.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceinmilliseconds.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceinminutes.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceinmonths.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceinquarters.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceinseconds.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceinweeks.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceinyears.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/eachdayofinterval.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/eachhourofinterval.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/eachminuteofinterval.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/eachmonthofinterval.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/eachquarterofinterval.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/eachweekofinterval.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/eachweekendofinterval.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/eachweekendofmonth.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/eachweekendofyear.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/eachyearofinterval.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endofday.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endofdecade.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endofhour.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endofisoweek.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endofisoweekyear.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endofminute.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endofmonth.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endofquarter.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endofsecond.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endoftoday.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endoftomorrow.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endofweek.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endofyear.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endofyesterday.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/_lib/format/formatters.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/_lib/format/longformatters.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/format.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/formatdistance.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/formatdistancestrict.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/formatdistancetonow.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/formatdistancetonowstrict.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/formatduration.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/formatiso.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/formatiso9075.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/formatisoduration.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/formatrfc3339.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/formatrfc7231.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/formatrelative.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/fromunixtime.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getdate.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getday.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getdayofyear.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getdaysinmonth.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getdaysinyear.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getdecade.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/_lib/defaultoptions.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getdefaultoptions.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/gethours.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getisoday.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getisoweek.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getisoweekyear.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getisoweeksinyear.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getmilliseconds.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getminutes.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getmonth.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getoverlappingdaysinintervals.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getquarter.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getseconds.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/gettime.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getunixtime.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getweek.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getweekofmonth.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getweekyear.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getweeksinmonth.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getyear.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/hourstomilliseconds.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/hourstominutes.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/hourstoseconds.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/interval.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/intervaltoduration.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/intlformat.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/intlformatdistance.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isafter.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isbefore.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isdate.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isequal.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isexists.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isfirstdayofmonth.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isfriday.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isfuture.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/islastdayofmonth.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isleapyear.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/ismatch.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/ismonday.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/ispast.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/issameday.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/issamehour.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/issameisoweek.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/issameisoweekyear.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/issameminute.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/issamemonth.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/issamequarter.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/issamesecond.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/issameweek.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/issameyear.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/issaturday.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/issunday.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isthishour.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isthisisoweek.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isthisminute.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isthismonth.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isthisquarter.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isthissecond.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isthisweek.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isthisyear.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isthursday.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/istoday.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/istomorrow.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/istuesday.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isvalid.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/iswednesday.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isweekend.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/iswithininterval.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isyesterday.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/lastdayofdecade.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/lastdayofisoweek.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/lastdayofisoweekyear.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/lastdayofmonth.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/lastdayofquarter.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/lastdayofweek.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/lastdayofyear.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/_lib/format/lightformatters.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/lightformat.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/max.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/milliseconds.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/millisecondstohours.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/millisecondstominutes.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/millisecondstoseconds.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/min.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/minutestohours.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/minutestomilliseconds.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/minutestoseconds.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/monthstoquarters.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/monthstoyears.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/nextday.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/nextfriday.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/nextmonday.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/nextsaturday.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/nextsunday.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/nextthursday.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/nexttuesday.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/nextwednesday.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/types.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/setter.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parser.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parseiso.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parsejson.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/previousday.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/previousfriday.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/previousmonday.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/previoussaturday.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/previoussunday.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/previousthursday.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/previoustuesday.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/previouswednesday.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/quarterstomonths.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/quarterstoyears.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/roundtonearesthours.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/roundtonearestminutes.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/secondstohours.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/secondstomilliseconds.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/secondstominutes.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/set.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setdate.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setday.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setdayofyear.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setdefaultoptions.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/sethours.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setisoday.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setisoweek.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setisoweekyear.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setmilliseconds.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setminutes.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setmonth.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setquarter.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setseconds.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setweek.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setweekyear.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setyear.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startofday.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startofdecade.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startofhour.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startofisoweek.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startofisoweekyear.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startofminute.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startofmonth.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startofquarter.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startofsecond.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startoftoday.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startoftomorrow.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startofweek.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startofweekyear.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startofyear.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startofyesterday.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/sub.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/subbusinessdays.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/subdays.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/subhours.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/subisoweekyears.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/submilliseconds.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/subminutes.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/submonths.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/subquarters.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/subseconds.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/subweeks.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/subyears.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/todate.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/transpose.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/weekstodays.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/yearstodays.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/yearstomonths.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/yearstoquarters.d.ts\",\"./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/index.d.ts\",\"./node_modules/.pnpm/fast-deep-equal@3.1.3/node_modules/fast-deep-equal/index.d.ts\",\"./node_modules/.pnpm/motion-dom@11.18.1/node_modules/motion-dom/dist/index.d.ts\",\"./node_modules/.pnpm/motion-utils@11.18.1/node_modules/motion-utils/dist/index.d.ts\",\"./node_modules/.pnpm/framer-motion@11.18.2_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/framer-motion/dist/index.d.ts\",\"./node_modules/.pnpm/swr@2.3.3_react@19.0.1/node_modules/swr/dist/_internal/events.d.mts\",\"./node_modules/.pnpm/swr@2.3.3_react@19.0.1/node_modules/swr/dist/_internal/types.d.mts\",\"./node_modules/.pnpm/swr@2.3.3_react@19.0.1/node_modules/swr/dist/_internal/constants.d.mts\",\"./node_modules/.pnpm/dequal@2.0.3/node_modules/dequal/index.d.ts\",\"./node_modules/.pnpm/swr@2.3.3_react@19.0.1/node_modules/swr/dist/_internal/index.d.mts\",\"./node_modules/.pnpm/swr@2.3.3_react@19.0.1/node_modules/swr/dist/index/index.d.mts\",\"./node_modules/.pnpm/usehooks-ts@3.1.1_react@19.0.1/node_modules/usehooks-ts/dist/index.d.ts\",\"./node_modules/.pnpm/sonner@1.7.4_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/sonner/dist/index.d.ts\",\"./node_modules/.pnpm/@lezer+common@1.2.3/node_modules/@lezer/common/dist/index.d.ts\",\"./node_modules/.pnpm/@lezer+lr@1.4.2/node_modules/@lezer/lr/dist/index.d.ts\",\"./node_modules/.pnpm/@codemirror+state@6.5.2/node_modules/@codemirror/state/dist/index.d.ts\",\"./node_modules/.pnpm/style-mod@4.1.2/node_modules/style-mod/src/style-mod.d.ts\",\"./node_modules/.pnpm/@codemirror+view@6.36.4/node_modules/@codemirror/view/dist/index.d.ts\",\"./node_modules/.pnpm/@lezer+highlight@1.2.1/node_modules/@lezer/highlight/dist/index.d.ts\",\"./node_modules/.pnpm/@codemirror+language@6.11.0/node_modules/@codemirror/language/dist/index.d.ts\",\"./node_modules/.pnpm/@codemirror+autocomplete@6.18.6/node_modules/@codemirror/autocomplete/dist/index.d.ts\",\"./node_modules/.pnpm/@codemirror+lang-python@6.1.7/node_modules/@codemirror/lang-python/dist/index.d.ts\",\"./node_modules/.pnpm/@codemirror+theme-one-dark@6.1.2/node_modules/@codemirror/theme-one-dark/dist/index.d.ts\",\"./node_modules/.pnpm/codemirror@6.0.1/node_modules/codemirror/dist/index.d.ts\",\"./lib/db/schema.ts\",\"./components/code-editor.tsx\",\"./hooks/use-artifact.ts\",\"./node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/clsx.d.mts\",\"./node_modules/.pnpm/tailwind-merge@2.6.0/node_modules/tailwind-merge/dist/types.d.ts\",\"./lib/errors.ts\",\"./node_modules/.pnpm/next-auth@5.0.0-beta.25_next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-d_kwdwn6b3rajgl6e7ziyurdtwie/node_modules/next-auth/lib/types.d.ts\",\"./node_modules/.pnpm/next-auth@5.0.0-beta.25_next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-d_kwdwn6b3rajgl6e7ziyurdtwie/node_modules/next-auth/lib/index.d.ts\",\"./node_modules/.pnpm/@auth+core@0.37.2/node_modules/@auth/core/errors.d.ts\",\"./node_modules/.pnpm/next-auth@5.0.0-beta.25_next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-d_kwdwn6b3rajgl6e7ziyurdtwie/node_modules/next-auth/index.d.ts\",\"./node_modules/.pnpm/@vercel+functions@2.2.13/node_modules/@vercel/functions/headers.d.ts\",\"./node_modules/.pnpm/@vercel+functions@2.2.13/node_modules/@vercel/functions/get-env.d.ts\",\"./node_modules/.pnpm/@vercel+functions@2.2.13/node_modules/@vercel/functions/wait-until.d.ts\",\"./node_modules/.pnpm/@vercel+functions@2.2.13/node_modules/@vercel/functions/middleware.d.ts\",\"./node_modules/.pnpm/@vercel+functions@2.2.13/node_modules/@vercel/functions/cache/types.d.ts\",\"./node_modules/.pnpm/@vercel+functions@2.2.13/node_modules/@vercel/functions/cache/index.d.ts\",\"./node_modules/.pnpm/@vercel+functions@2.2.13/node_modules/@vercel/functions/db-connections/index.d.ts\",\"./node_modules/.pnpm/@vercel+functions@2.2.13/node_modules/@vercel/functions/index.d.ts\",\"./lib/ai/prompts.ts\",\"./lib/ai/providers.ts\",\"./artifacts/code/server.ts\",\"./artifacts/sheet/server.ts\",\"./artifacts/text/server.ts\",\"./lib/artifacts/server.ts\",\"./lib/ai/tools/create-document.ts\",\"./lib/ai/tools/get-weather.ts\",\"./lib/ai/tools/request-suggestions.ts\",\"./lib/ai/tools/update-document.ts\",\"./lib/types.ts\",\"./lib/utils.ts\",\"./components/elements/loader.tsx\",\"./components/icons.tsx\",\"./node_modules/.pnpm/class-variance-authority@0.7.1/node_modules/class-variance-authority/dist/types.d.ts\",\"./node_modules/.pnpm/class-variance-authority@0.7.1/node_modules/class-variance-authority/dist/index.d.ts\",\"./node_modules/.pnpm/@radix-ui+react-accessible-icon@1.1.7_@types+react-dom@18.3.5_@types+react@18.3.18__@types+re_tdj6lhwwbq3obumwsi5rnktd6q/node_modules/@radix-ui/react-accessible-icon/dist/index.d.mts\",\"./node_modules/.pnpm/@radix-ui+react-context@1.1.2_@types+react@18.3.18_react@19.0.1/node_modules/@radix-ui/react-context/dist/index.d.mts\",\"./node_modules/.pnpm/@radix-ui+react-primitive@2.1.3_@types+react-dom@18.3.5_@types+react@18.3.18__@types+react@18_l46emuortqk3a5m24xmvpplgxu/node_modules/@radix-ui/react-primitive/dist/index.d.mts\",\"./node_modules/.pnpm/@radix-ui+react-collapsible@1.1.12_@types+react-dom@18.3.5_@types+react@18.3.18__@types+react_4zwxbncfwzxhcb6uiquaxb2n7q/node_modules/@radix-ui/react-collapsible/dist/index.d.mts\",\"./node_modules/.pnpm/@radix-ui+react-accordion@1.2.12_@types+react-dom@18.3.5_@types+react@18.3.18__@types+react@1_c7xlvvtixurwdeyv6xjwc47fim/node_modules/@radix-ui/react-accordion/dist/index.d.mts\",\"./node_modules/.pnpm/@radix-ui+react-dismissable-layer@1.1.11_@types+react-dom@18.3.5_@types+react@18.3.18__@types_lzs2d6hickwtyzpszpjjb2cxge/node_modules/@radix-ui/react-dismissable-layer/dist/index.d.mts\",\"./node_modules/.pnpm/@radix-ui+react-focus-scope@1.1.7_@types+react-dom@18.3.5_@types+react@18.3.18__@types+react@_i6nt3xa7q75lylgzamyxf5t3bq/node_modules/@radix-ui/react-focus-scope/dist/index.d.mts\",\"./node_modules/.pnpm/@radix-ui+react-portal@1.1.9_@types+react-dom@18.3.5_@types+react@18.3.18__@types+react@18.3._rp5oazfvjnkup2rk54tnb2fx6q/node_modules/@radix-ui/react-portal/dist/index.d.mts\",\"./node_modules/.pnpm/@radix-ui+react-dialog@1.1.15_@types+react-dom@18.3.5_@types+react@18.3.18__@types+react@18.3_knv3xb42hvzvuxn4pbh22atidm/node_modules/@radix-ui/react-dialog/dist/index.d.mts\",\"./node_modules/.pnpm/@radix-ui+react-alert-dialog@1.1.15_@types+react-dom@18.3.5_@types+react@18.3.18__@types+reac_nx3id2vzz22wfasieliyhw4fra/node_modules/@radix-ui/react-alert-dialog/dist/index.d.mts\",\"./node_modules/.pnpm/@radix-ui+react-aspect-ratio@1.1.7_@types+react-dom@18.3.5_@types+react@18.3.18__@types+react_xnfvxkthxd26qnsggevszwdhs4/node_modules/@radix-ui/react-aspect-ratio/dist/index.d.mts\",\"./node_modules/.pnpm/@radix-ui+react-avatar@1.1.10_@types+react-dom@18.3.5_@types+react@18.3.18__@types+react@18.3_7c37aetekviyxuwjwkneeskiru/node_modules/@radix-ui/react-avatar/dist/index.d.mts\",\"./node_modules/.pnpm/@radix-ui+react-checkbox@1.3.3_@types+react-dom@18.3.5_@types+react@18.3.18__@types+react@18._u24diuktfq2cjxmmuft6dd2csi/node_modules/@radix-ui/react-checkbox/dist/index.d.mts\",\"./node_modules/.pnpm/@radix-ui+react-arrow@1.1.7_@types+react-dom@18.3.5_@types+react@18.3.18__@types+react@18.3.1_3yc2gdnojrggdmjmcfeaui5uri/node_modules/@radix-ui/react-arrow/dist/index.d.mts\",\"./node_modules/.pnpm/@radix-ui+rect@1.1.1/node_modules/@radix-ui/rect/dist/index.d.mts\",\"./node_modules/.pnpm/@radix-ui+react-popper@1.2.8_@types+react-dom@18.3.5_@types+react@18.3.18__@types+react@18.3._hlw7xtpap2z5bjgivdx5b3ldoq/node_modules/@radix-ui/react-popper/dist/index.d.mts\",\"./node_modules/.pnpm/@radix-ui+react-roving-focus@1.1.11_@types+react-dom@18.3.5_@types+react@18.3.18__@types+reac_j6bav5myv43gxvcr2yfesecxpy/node_modules/@radix-ui/react-roving-focus/dist/index.d.mts\",\"./node_modules/.pnpm/@radix-ui+react-menu@2.1.16_@types+react-dom@18.3.5_@types+react@18.3.18__@types+react@18.3.1_iue2blzm7k2txc6xlhavazdno4/node_modules/@radix-ui/react-menu/dist/index.d.mts\",\"./node_modules/.pnpm/@radix-ui+react-context-menu@2.2.16_@types+react-dom@18.3.5_@types+react@18.3.18__@types+reac_uy2wc2evk2m4ogharw3rjs3gie/node_modules/@radix-ui/react-context-menu/dist/index.d.mts\",\"./node_modules/.pnpm/@radix-ui+react-direction@1.1.1_@types+react@18.3.18_react@19.0.1/node_modules/@radix-ui/react-direction/dist/index.d.mts\",\"./node_modules/.pnpm/@radix-ui+react-dropdown-menu@2.1.16_@types+react-dom@18.3.5_@types+react@18.3.18__@types+rea_b67nc37mpq7v3cagfvuxdrgqbi/node_modules/@radix-ui/react-dropdown-menu/dist/index.d.mts\",\"./node_modules/.pnpm/@radix-ui+react-label@2.1.7_@types+react-dom@18.3.5_@types+react@18.3.18__@types+react@18.3.1_fmbtwh6esjjcp4etrll7phj33e/node_modules/@radix-ui/react-label/dist/index.d.mts\",\"./node_modules/.pnpm/@radix-ui+react-form@0.1.8_@types+react-dom@18.3.5_@types+react@18.3.18__@types+react@18.3.18_7s2axjkxqo3xcmhdyczscxfjsa/node_modules/@radix-ui/react-form/dist/index.d.mts\",\"./node_modules/.pnpm/@radix-ui+react-hover-card@1.1.15_@types+react-dom@18.3.5_@types+react@18.3.18__@types+react@_z75l5sy2k5nexezjkwg7m3j45u/node_modules/@radix-ui/react-hover-card/dist/index.d.mts\",\"./node_modules/.pnpm/@radix-ui+react-menubar@1.1.16_@types+react-dom@18.3.5_@types+react@18.3.18__@types+react@18._uloe2fimzxuocbkhh6bgu245wi/node_modules/@radix-ui/react-menubar/dist/index.d.mts\",\"./node_modules/.pnpm/@radix-ui+react-visually-hidden@1.2.3_@types+react-dom@18.3.5_@types+react@18.3.18__@types+re_6gru7ew7w76ba55fiptsbs4t7e/node_modules/@radix-ui/react-visually-hidden/dist/index.d.mts\",\"./node_modules/.pnpm/@radix-ui+react-navigation-menu@1.2.14_@types+react-dom@18.3.5_@types+react@18.3.18__@types+r_iyp6s5ioig3eartvsdxpgg3xly/node_modules/@radix-ui/react-navigation-menu/dist/index.d.mts\",\"./node_modules/.pnpm/@radix-ui+react-one-time-password-field@0.1.8_@types+react-dom@18.3.5_@types+react@18.3.18__@_2hnsahxmskm36czf3zsx2uxo5m/node_modules/@radix-ui/react-one-time-password-field/dist/index.d.mts\",\"./node_modules/.pnpm/@radix-ui+react-password-toggle-field@0.1.3_@types+react-dom@18.3.5_@types+react@18.3.18__@ty_erwusyktjcrivkm7xjd7aux6mu/node_modules/@radix-ui/react-password-toggle-field/dist/index.d.mts\",\"./node_modules/.pnpm/@radix-ui+react-popover@1.1.15_@types+react-dom@18.3.5_@types+react@18.3.18__@types+react@18._nffyxplfx7fwfyl4g4xy4rjwq4/node_modules/@radix-ui/react-popover/dist/index.d.mts\",\"./node_modules/.pnpm/@radix-ui+react-progress@1.1.7_@types+react-dom@18.3.5_@types+react@18.3.18__@types+react@18._375omlynffpw7nbgcsq47glzui/node_modules/@radix-ui/react-progress/dist/index.d.mts\",\"./node_modules/.pnpm/@radix-ui+react-radio-group@1.3.8_@types+react-dom@18.3.5_@types+react@18.3.18__@types+react@_2zinrzlp4uhnytud2antz46dn4/node_modules/@radix-ui/react-radio-group/dist/index.d.mts\",\"./node_modules/.pnpm/@radix-ui+react-scroll-area@1.2.10_@types+react-dom@18.3.5_@types+react@18.3.18__@types+react_lkk55xekg5t44erl27obj46jcu/node_modules/@radix-ui/react-scroll-area/dist/index.d.mts\",\"./node_modules/.pnpm/@radix-ui+react-select@2.2.6_@types+react-dom@18.3.5_@types+react@18.3.18__@types+react@18.3._bpafkh23e5do3c6dm5tq7owvvy/node_modules/@radix-ui/react-select/dist/index.d.mts\",\"./node_modules/.pnpm/@radix-ui+react-separator@1.1.7_@types+react-dom@18.3.5_@types+react@18.3.18__@types+react@18_354ycih6kmdbt5swf2wx5vwy6q/node_modules/@radix-ui/react-separator/dist/index.d.mts\",\"./node_modules/.pnpm/@radix-ui+react-slider@1.3.6_@types+react-dom@18.3.5_@types+react@18.3.18__@types+react@18.3._kvc4gi5rvgacjd3fohw5zws32a/node_modules/@radix-ui/react-slider/dist/index.d.mts\",\"./node_modules/.pnpm/@radix-ui+react-slot@1.2.3_@types+react@18.3.18_react@19.0.1/node_modules/@radix-ui/react-slot/dist/index.d.mts\",\"./node_modules/.pnpm/@radix-ui+react-switch@1.2.6_@types+react-dom@18.3.5_@types+react@18.3.18__@types+react@18.3._hdxu5faefkkeesxgtcpvzxxiki/node_modules/@radix-ui/react-switch/dist/index.d.mts\",\"./node_modules/.pnpm/@radix-ui+react-tabs@1.1.13_@types+react-dom@18.3.5_@types+react@18.3.18__@types+react@18.3.1_yalignze5e5t6d7d7dnv6v2gem/node_modules/@radix-ui/react-tabs/dist/index.d.mts\",\"./node_modules/.pnpm/@radix-ui+react-toast@1.2.15_@types+react-dom@18.3.5_@types+react@18.3.18__@types+react@18.3._ub4tipcaqnjpqrnkads5ql5id4/node_modules/@radix-ui/react-toast/dist/index.d.mts\",\"./node_modules/.pnpm/@radix-ui+react-toggle@1.1.10_@types+react-dom@18.3.5_@types+react@18.3.18__@types+react@18.3_yt6yy76p6lfzroaz4gzwdhr3ym/node_modules/@radix-ui/react-toggle/dist/index.d.mts\",\"./node_modules/.pnpm/@radix-ui+react-toggle-group@1.1.11_@types+react-dom@18.3.5_@types+react@18.3.18__@types+reac_gs5hbta3ocnhas3vhsubcgr7ey/node_modules/@radix-ui/react-toggle-group/dist/index.d.mts\",\"./node_modules/.pnpm/@radix-ui+react-toolbar@1.1.11_@types+react-dom@18.3.5_@types+react@18.3.18__@types+react@18._dyf5nsiew4draqgbi6y7w65v6a/node_modules/@radix-ui/react-toolbar/dist/index.d.mts\",\"./node_modules/.pnpm/@radix-ui+react-tooltip@1.2.8_@types+react-dom@18.3.5_@types+react@18.3.18__@types+react@18.3_hcjk7xmvgfmh5qkgo25sfkmioq/node_modules/@radix-ui/react-tooltip/dist/index.d.mts\",\"./node_modules/.pnpm/radix-ui@1.4.3_@types+react-dom@18.3.5_@types+react@18.3.18__@types+react@18.3.18_react-dom@1_e62mc3zvpcski5wyvex2hfztaq/node_modules/radix-ui/dist/index.d.mts\",\"./components/ui/button.tsx\",\"./components/console.tsx\",\"./components/create-artifact.tsx\",\"./artifacts/code/client.tsx\",\"./node_modules/.pnpm/classnames@2.5.1/node_modules/classnames/index.d.ts\",\"./components/image-editor.tsx\",\"./artifacts/image/client.tsx\",\"./node_modules/.pnpm/@types+papaparse@5.3.15/node_modules/@types/papaparse/index.d.ts\",\"./node_modules/.pnpm/next-themes@0.3.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next-themes/dist/types.d.ts\",\"./node_modules/.pnpm/next-themes@0.3.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next-themes/dist/index.d.ts\",\"./node_modules/.pnpm/react-data-grid@7.0.0-beta.47_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/react-data-grid/lib/index.d.ts\",\"./components/sheet-editor.tsx\",\"./artifacts/sheet/client.tsx\",\"./node_modules/.pnpm/orderedmap@2.1.1/node_modules/orderedmap/dist/index.d.ts\",\"./node_modules/.pnpm/prosemirror-model@1.24.1/node_modules/prosemirror-model/dist/index.d.ts\",\"./node_modules/.pnpm/prosemirror-schema-basic@1.2.3/node_modules/prosemirror-schema-basic/dist/index.d.ts\",\"./node_modules/.pnpm/prosemirror-transform@1.10.3/node_modules/prosemirror-transform/dist/index.d.ts\",\"./node_modules/.pnpm/prosemirror-view@1.38.1/node_modules/prosemirror-view/dist/index.d.ts\",\"./node_modules/.pnpm/prosemirror-state@1.4.3/node_modules/prosemirror-state/dist/index.d.ts\",\"./node_modules/.pnpm/prosemirror-schema-list@1.5.1/node_modules/prosemirror-schema-list/dist/index.d.ts\",\"./node_modules/.pnpm/@types+unist@3.0.3/node_modules/@types/unist/index.d.ts\",\"./node_modules/.pnpm/@types+hast@3.0.4/node_modules/@types/hast/index.d.ts\",\"./node_modules/.pnpm/vfile-message@4.0.2/node_modules/vfile-message/lib/index.d.ts\",\"./node_modules/.pnpm/vfile-message@4.0.2/node_modules/vfile-message/index.d.ts\",\"./node_modules/.pnpm/vfile@6.0.3/node_modules/vfile/lib/index.d.ts\",\"./node_modules/.pnpm/vfile@6.0.3/node_modules/vfile/index.d.ts\",\"./node_modules/.pnpm/unified@11.0.5/node_modules/unified/lib/callable-instance.d.ts\",\"./node_modules/.pnpm/trough@2.2.0/node_modules/trough/lib/index.d.ts\",\"./node_modules/.pnpm/trough@2.2.0/node_modules/trough/index.d.ts\",\"./node_modules/.pnpm/unified@11.0.5/node_modules/unified/lib/index.d.ts\",\"./node_modules/.pnpm/unified@11.0.5/node_modules/unified/index.d.ts\",\"./node_modules/.pnpm/@types+mdast@4.0.4/node_modules/@types/mdast/index.d.ts\",\"./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/state.d.ts\",\"./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/footer.d.ts\",\"./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/blockquote.d.ts\",\"./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/break.d.ts\",\"./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/code.d.ts\",\"./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/delete.d.ts\",\"./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/emphasis.d.ts\",\"./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/footnote-reference.d.ts\",\"./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/heading.d.ts\",\"./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/html.d.ts\",\"./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/image-reference.d.ts\",\"./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/image.d.ts\",\"./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/inline-code.d.ts\",\"./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/link-reference.d.ts\",\"./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/link.d.ts\",\"./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/list-item.d.ts\",\"./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/list.d.ts\",\"./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/paragraph.d.ts\",\"./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/root.d.ts\",\"./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/strong.d.ts\",\"./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/table.d.ts\",\"./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/table-cell.d.ts\",\"./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/table-row.d.ts\",\"./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/text.d.ts\",\"./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/thematic-break.d.ts\",\"./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/index.d.ts\",\"./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/index.d.ts\",\"./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/index.d.ts\",\"./node_modules/.pnpm/remark-rehype@11.1.1/node_modules/remark-rehype/lib/index.d.ts\",\"./node_modules/.pnpm/remark-rehype@11.1.1/node_modules/remark-rehype/index.d.ts\",\"./node_modules/.pnpm/react-markdown@10.1.0_@types+react@18.3.18_react@19.0.1/node_modules/react-markdown/lib/index.d.ts\",\"./node_modules/.pnpm/react-markdown@10.1.0_@types+react@18.3.18_react@19.0.1/node_modules/react-markdown/index.d.ts\",\"./node_modules/.pnpm/@shikijs+vscode-textmate@10.0.2/node_modules/@shikijs/vscode-textmate/dist/index.d.ts\",\"./node_modules/.pnpm/@shikijs+types@3.14.0/node_modules/@shikijs/types/dist/index.d.mts\",\"./node_modules/.pnpm/shiki@3.14.0/node_modules/shiki/dist/langs.d.mts\",\"./node_modules/.pnpm/stringify-entities@4.0.4/node_modules/stringify-entities/lib/util/format-smart.d.ts\",\"./node_modules/.pnpm/stringify-entities@4.0.4/node_modules/stringify-entities/lib/core.d.ts\",\"./node_modules/.pnpm/stringify-entities@4.0.4/node_modules/stringify-entities/lib/index.d.ts\",\"./node_modules/.pnpm/stringify-entities@4.0.4/node_modules/stringify-entities/index.d.ts\",\"./node_modules/.pnpm/property-information@7.0.0/node_modules/property-information/lib/util/info.d.ts\",\"./node_modules/.pnpm/property-information@7.0.0/node_modules/property-information/lib/find.d.ts\",\"./node_modules/.pnpm/property-information@7.0.0/node_modules/property-information/lib/hast-to-react.d.ts\",\"./node_modules/.pnpm/property-information@7.0.0/node_modules/property-information/lib/normalize.d.ts\",\"./node_modules/.pnpm/property-information@7.0.0/node_modules/property-information/index.d.ts\",\"./node_modules/.pnpm/hast-util-to-html@9.0.5/node_modules/hast-util-to-html/lib/index.d.ts\",\"./node_modules/.pnpm/hast-util-to-html@9.0.5/node_modules/hast-util-to-html/index.d.ts\",\"./node_modules/.pnpm/@shikijs+core@3.14.0/node_modules/@shikijs/core/dist/index.d.mts\",\"./node_modules/.pnpm/shiki@3.14.0/node_modules/shiki/dist/themes.d.mts\",\"./node_modules/.pnpm/shiki@3.14.0/node_modules/shiki/dist/bundle-full.d.mts\",\"./node_modules/.pnpm/@shikijs+core@3.14.0/node_modules/@shikijs/core/dist/types.d.mts\",\"./node_modules/.pnpm/shiki@3.14.0/node_modules/shiki/dist/types.d.mts\",\"./node_modules/.pnpm/oniguruma-to-es@4.3.3/node_modules/oniguruma-to-es/dist/esm/subclass.d.ts\",\"./node_modules/.pnpm/oniguruma-to-es@4.3.3/node_modules/oniguruma-to-es/dist/esm/index.d.ts\",\"./node_modules/.pnpm/@shikijs+engine-javascript@3.14.0/node_modules/@shikijs/engine-javascript/dist/shared/engine-javascript.cdednu-m.d.mts\",\"./node_modules/.pnpm/@shikijs+engine-javascript@3.14.0/node_modules/@shikijs/engine-javascript/dist/engine-raw.d.mts\",\"./node_modules/.pnpm/@shikijs+engine-javascript@3.14.0/node_modules/@shikijs/engine-javascript/dist/index.d.mts\",\"./node_modules/.pnpm/@shikijs+engine-oniguruma@3.14.0/node_modules/@shikijs/engine-oniguruma/dist/chunk-index.d.d.mts\",\"./node_modules/.pnpm/@shikijs+engine-oniguruma@3.14.0/node_modules/@shikijs/engine-oniguruma/dist/index.d.mts\",\"./node_modules/.pnpm/shiki@3.14.0/node_modules/shiki/dist/index.d.mts\",\"./node_modules/.pnpm/@iconify+types@2.0.0/node_modules/@iconify/types/types.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/colors/types.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/colors/index.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/colors/keywords.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/css/types.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/css/icon.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/css/icons.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/customisations/bool.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/customisations/defaults.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/customisations/flip.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/customisations/merge.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/customisations/rotate.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/emoji/cleanup.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/emoji/convert.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/emoji/format.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/emoji/parse.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/emoji/regex/create.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/emoji/replace/find.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/emoji/replace/replace.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/emoji/test/parse.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/emoji/data.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/emoji/test/components.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/emoji/test/name.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/emoji/test/similar.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/emoji/test/tree.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/emoji/test/missing.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/emoji/test/variations.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/icon-set/convert-info.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/icon-set/expand.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/icon-set/get-icon.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/icon-set/get-icons.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/icon-set/minify.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/icon-set/parse.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/icon-set/tree.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/icon-set/validate-basic.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/icon-set/validate.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/icon/defaults.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/icon/merge.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/icon/name.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/svg/viewbox.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/icon/square.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/icon/transformations.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/svg/build.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/svg/defs.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/svg/id.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/svg/size.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/svg/encode-svg-for-css.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/svg/trim.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/svg/pretty.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/svg/html.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/svg/url.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/svg/inner-html.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/svg/parse.d.ts\",\"./node_modules/.pnpm/@antfu+utils@9.3.0/node_modules/@antfu/utils/dist/index.d.mts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/loader/types.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/loader/utils.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/loader/custom.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/loader/modern.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/loader/loader.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/misc/strings.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/misc/objects.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/misc/title.d.ts\",\"./node_modules/.pnpm/@iconify+utils@3.0.2/node_modules/@iconify/utils/lib/index.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/icons.d.ts\",\"./node_modules/.pnpm/@types+trusted-types@2.0.7/node_modules/@types/trusted-types/lib/index.d.ts\",\"./node_modules/.pnpm/dompurify@3.3.0/node_modules/dompurify/dist/purify.es.d.mts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/config.type.d.ts\",\"./node_modules/.pnpm/@types+d3-array@3.2.2/node_modules/@types/d3-array/index.d.ts\",\"./node_modules/.pnpm/@types+d3-selection@3.0.11/node_modules/@types/d3-selection/index.d.ts\",\"./node_modules/.pnpm/@types+d3-axis@3.0.6/node_modules/@types/d3-axis/index.d.ts\",\"./node_modules/.pnpm/@types+d3-brush@3.0.6/node_modules/@types/d3-brush/index.d.ts\",\"./node_modules/.pnpm/@types+d3-chord@3.0.6/node_modules/@types/d3-chord/index.d.ts\",\"./node_modules/.pnpm/@types+d3-color@3.1.3/node_modules/@types/d3-color/index.d.ts\",\"./node_modules/.pnpm/@types+geojson@7946.0.16/node_modules/@types/geojson/index.d.ts\",\"./node_modules/.pnpm/@types+d3-contour@3.0.6/node_modules/@types/d3-contour/index.d.ts\",\"./node_modules/.pnpm/@types+d3-delaunay@6.0.4/node_modules/@types/d3-delaunay/index.d.ts\",\"./node_modules/.pnpm/@types+d3-dispatch@3.0.7/node_modules/@types/d3-dispatch/index.d.ts\",\"./node_modules/.pnpm/@types+d3-drag@3.0.7/node_modules/@types/d3-drag/index.d.ts\",\"./node_modules/.pnpm/@types+d3-dsv@3.0.7/node_modules/@types/d3-dsv/index.d.ts\",\"./node_modules/.pnpm/@types+d3-ease@3.0.2/node_modules/@types/d3-ease/index.d.ts\",\"./node_modules/.pnpm/@types+d3-fetch@3.0.7/node_modules/@types/d3-fetch/index.d.ts\",\"./node_modules/.pnpm/@types+d3-force@3.0.10/node_modules/@types/d3-force/index.d.ts\",\"./node_modules/.pnpm/@types+d3-format@3.0.4/node_modules/@types/d3-format/index.d.ts\",\"./node_modules/.pnpm/@types+d3-geo@3.1.0/node_modules/@types/d3-geo/index.d.ts\",\"./node_modules/.pnpm/@types+d3-hierarchy@3.1.7/node_modules/@types/d3-hierarchy/index.d.ts\",\"./node_modules/.pnpm/@types+d3-interpolate@3.0.4/node_modules/@types/d3-interpolate/index.d.ts\",\"./node_modules/.pnpm/@types+d3-path@3.1.1/node_modules/@types/d3-path/index.d.ts\",\"./node_modules/.pnpm/@types+d3-polygon@3.0.2/node_modules/@types/d3-polygon/index.d.ts\",\"./node_modules/.pnpm/@types+d3-quadtree@3.0.6/node_modules/@types/d3-quadtree/index.d.ts\",\"./node_modules/.pnpm/@types+d3-random@3.0.3/node_modules/@types/d3-random/index.d.ts\",\"./node_modules/.pnpm/@types+d3-time@3.0.4/node_modules/@types/d3-time/index.d.ts\",\"./node_modules/.pnpm/@types+d3-scale@4.0.9/node_modules/@types/d3-scale/index.d.ts\",\"./node_modules/.pnpm/@types+d3-scale-chromatic@3.1.0/node_modules/@types/d3-scale-chromatic/index.d.ts\",\"./node_modules/.pnpm/@types+d3-shape@3.1.7/node_modules/@types/d3-shape/index.d.ts\",\"./node_modules/.pnpm/@types+d3-time-format@4.0.3/node_modules/@types/d3-time-format/index.d.ts\",\"./node_modules/.pnpm/@types+d3-timer@3.0.2/node_modules/@types/d3-timer/index.d.ts\",\"./node_modules/.pnpm/@types+d3-transition@3.0.9/node_modules/@types/d3-transition/index.d.ts\",\"./node_modules/.pnpm/@types+d3-zoom@3.0.8/node_modules/@types/d3-zoom/index.d.ts\",\"./node_modules/.pnpm/@types+d3@7.4.3/node_modules/@types/d3/index.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/types.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/utils.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/diagram.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/diagrams/git/gitgraphtypes.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/diagram-api/types.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/diagram-api/detecttype.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/errors.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/clusters.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/types.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/anchor.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/bowtierect.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/card.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/choice.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/circle.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/crossedcircle.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/curlybraceleft.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/curlybraceright.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/curlybraces.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/curvedtrapezoid.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/cylinder.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/dividedrect.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/doublecircle.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/filledcircle.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/flippedtriangle.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/forkjoin.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/halfroundedrectangle.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/hexagon.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/hourglass.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/icon.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/iconcircle.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/iconrounded.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/iconsquare.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/imagesquare.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/invertedtrapezoid.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/labelrect.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/leanleft.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/leanright.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/lightningbolt.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/linedcylinder.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/linedwaveedgedrect.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/multirect.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/multiwaveedgedrectangle.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/note.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/question.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/rectleftinvarrow.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/rectwithtitle.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/roundedrect.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/shadedprocess.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/slopedrect.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/squarerect.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/stadium.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/state.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/stateend.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/statestart.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/subroutine.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/taggedrect.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/taggedwaveedgedrectangle.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/text.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/tiltedcylinder.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/trapezoid.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/trapezoidalpentagon.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/triangle.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/waveedgedrectangle.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/waverectangle.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/windowpane.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/erbox.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/classbox.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/requirementbox.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/kanbanitem.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/bang.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/cloud.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/defaultmindmapnode.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes/mindmapcircle.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/shapes.d.ts\",\"./node_modules/.pnpm/dagre-d3-es@7.0.13/node_modules/dagre-d3-es/src/graphlib/graph.d.ts\",\"./node_modules/.pnpm/dagre-d3-es@7.0.13/node_modules/dagre-d3-es/src/graphlib/index.d.ts\",\"./node_modules/.pnpm/dagre-d3-es@7.0.13/node_modules/dagre-d3-es/src/dagre-js/intersect/intersect-node.d.ts\",\"./node_modules/.pnpm/dagre-d3-es@7.0.13/node_modules/dagre-d3-es/src/dagre-js/intersect/intersect-circle.d.ts\",\"./node_modules/.pnpm/dagre-d3-es@7.0.13/node_modules/dagre-d3-es/src/dagre-js/intersect/intersect-ellipse.d.ts\",\"./node_modules/.pnpm/dagre-d3-es@7.0.13/node_modules/dagre-d3-es/src/dagre-js/intersect/intersect-polygon.d.ts\",\"./node_modules/.pnpm/dagre-d3-es@7.0.13/node_modules/dagre-d3-es/src/dagre-js/intersect/intersect-rect.d.ts\",\"./node_modules/.pnpm/dagre-d3-es@7.0.13/node_modules/dagre-d3-es/src/dagre-js/intersect/index.d.ts\",\"./node_modules/.pnpm/dagre-d3-es@7.0.13/node_modules/dagre-d3-es/src/dagre-js/render.d.ts\",\"./node_modules/.pnpm/dagre-d3-es@7.0.13/node_modules/dagre-d3-es/src/index.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/rendering-elements/nodes.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/logger.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/internals.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/mermaidapi.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/rendering-util/render.d.ts\",\"./node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/mermaid.d.ts\",\"./node_modules/.pnpm/streamdown@1.4.0_@types+react@18.3.18_react@19.0.1/node_modules/streamdown/dist/index.d.ts\",\"./lib/editor/diff.js\",\"./components/diffview.tsx\",\"./components/document-skeleton.tsx\",\"./node_modules/.pnpm/prosemirror-menu@1.2.4/node_modules/prosemirror-menu/dist/index.d.ts\",\"./node_modules/.pnpm/prosemirror-example-setup@1.2.3/node_modules/prosemirror-example-setup/dist/index.d.ts\",\"./node_modules/.pnpm/prosemirror-inputrules@1.4.0/node_modules/prosemirror-inputrules/dist/index.d.ts\",\"./node_modules/.pnpm/@types+linkify-it@5.0.0/node_modules/@types/linkify-it/index.d.mts\",\"./node_modules/.pnpm/@types+mdurl@2.0.0/node_modules/@types/mdurl/lib/decode.d.mts\",\"./node_modules/.pnpm/@types+mdurl@2.0.0/node_modules/@types/mdurl/lib/encode.d.mts\",\"./node_modules/.pnpm/@types+mdurl@2.0.0/node_modules/@types/mdurl/lib/parse.d.mts\",\"./node_modules/.pnpm/@types+mdurl@2.0.0/node_modules/@types/mdurl/lib/format.d.mts\",\"./node_modules/.pnpm/@types+mdurl@2.0.0/node_modules/@types/mdurl/index.d.mts\",\"./node_modules/.pnpm/@types+markdown-it@14.1.2/node_modules/@types/markdown-it/lib/common/utils.d.mts\",\"./node_modules/.pnpm/@types+markdown-it@14.1.2/node_modules/@types/markdown-it/lib/helpers/parse_link_destination.d.mts\",\"./node_modules/.pnpm/@types+markdown-it@14.1.2/node_modules/@types/markdown-it/lib/token.d.mts\",\"./node_modules/.pnpm/@types+markdown-it@14.1.2/node_modules/@types/markdown-it/lib/rules_inline/state_inline.d.mts\",\"./node_modules/.pnpm/@types+markdown-it@14.1.2/node_modules/@types/markdown-it/lib/helpers/parse_link_label.d.mts\",\"./node_modules/.pnpm/@types+markdown-it@14.1.2/node_modules/@types/markdown-it/lib/helpers/parse_link_title.d.mts\",\"./node_modules/.pnpm/@types+markdown-it@14.1.2/node_modules/@types/markdown-it/lib/helpers/index.d.mts\",\"./node_modules/.pnpm/@types+markdown-it@14.1.2/node_modules/@types/markdown-it/lib/ruler.d.mts\",\"./node_modules/.pnpm/@types+markdown-it@14.1.2/node_modules/@types/markdown-it/lib/rules_block/state_block.d.mts\",\"./node_modules/.pnpm/@types+markdown-it@14.1.2/node_modules/@types/markdown-it/lib/parser_block.d.mts\",\"./node_modules/.pnpm/@types+markdown-it@14.1.2/node_modules/@types/markdown-it/lib/rules_core/state_core.d.mts\",\"./node_modules/.pnpm/@types+markdown-it@14.1.2/node_modules/@types/markdown-it/lib/parser_core.d.mts\",\"./node_modules/.pnpm/@types+markdown-it@14.1.2/node_modules/@types/markdown-it/lib/parser_inline.d.mts\",\"./node_modules/.pnpm/@types+markdown-it@14.1.2/node_modules/@types/markdown-it/lib/renderer.d.mts\",\"./node_modules/.pnpm/@types+markdown-it@14.1.2/node_modules/@types/markdown-it/lib/index.d.mts\",\"./node_modules/.pnpm/@types+markdown-it@14.1.2/node_modules/@types/markdown-it/index.d.mts\",\"./node_modules/.pnpm/prosemirror-markdown@1.13.1/node_modules/prosemirror-markdown/dist/index.d.ts\",\"./components/elements/response.tsx\",\"./components/suggestion.tsx\",\"./lib/editor/suggestions.tsx\",\"./lib/editor/functions.tsx\",\"./lib/editor/config.ts\",\"./components/text-editor.tsx\",\"./artifacts/actions.ts\",\"./artifacts/text/client.tsx\",\"./components/ui/tooltip.tsx\",\"./components/artifact-actions.tsx\",\"./components/artifact-close-button.tsx\",\"./hooks/use-scroll-to-bottom.tsx\",\"./hooks/use-messages.tsx\",\"./components/data-stream-provider.tsx\",\"./components/document.tsx\",\"./components/document-preview.tsx\",\"./components/ui/avatar.tsx\",\"./components/elements/message.tsx\",\"./node_modules/.pnpm/lucide-react@0.446.0_react@19.0.1/node_modules/lucide-react/dist/lucide-react.d.ts\",\"./components/ui/badge.tsx\",\"./components/ui/collapsible.tsx\",\"./node_modules/.pnpm/@types+react-syntax-highlighter@15.5.13/node_modules/@types/react-syntax-highlighter/index.d.ts\",\"./components/elements/code-block.tsx\",\"./components/elements/tool.tsx\",\"./components/elements/actions.tsx\",\"./components/message-actions.tsx\",\"./components/ui/dropdown-menu.tsx\",\"./node_modules/.pnpm/swr@2.3.3_react@19.0.1/node_modules/swr/dist/infinite/index.d.mts\",\"./components/ui/alert-dialog.tsx\",\"./components/ui/input.tsx\",\"./components/ui/separator.tsx\",\"./components/ui/sheet.tsx\",\"./components/ui/skeleton.tsx\",\"./hooks/use-mobile.ts\",\"./components/ui/sidebar.tsx\",\"./components/sidebar-history-item.tsx\",\"./components/sidebar-history.tsx\",\"./hooks/use-chat-visibility.ts\",\"./components/visibility-selector.tsx\",\"./app/(chat)/actions.ts\",\"./components/ui/textarea.tsx\",\"./components/message-editor.tsx\",\"./node_modules/.pnpm/@radix-ui+react-use-controllable-state@1.2.2_@types+react@18.3.18_react@19.0.1/node_modules/@radix-ui/react-use-controllable-state/dist/index.d.mts\",\"./components/elements/reasoning.tsx\",\"./components/message-reasoning.tsx\",\"./components/preview-attachment.tsx\",\"./components/weather.tsx\",\"./components/message.tsx\",\"./components/artifact-messages.tsx\",\"./node_modules/.pnpm/cmdk@1.1.1_@types+react-dom@18.3.5_@types+react@18.3.18__@types+react@18.3.18_react-dom@19.0._6dawtmx3nt5irj3gqlfuatdv2m/node_modules/cmdk/dist/index.d.ts\",\"./components/ui/dialog.tsx\",\"./components/ui/command.tsx\",\"./components/ai-elements/model-selector.tsx\",\"./lib/ai/models.ts\",\"./components/ui/select.tsx\",\"./components/elements/prompt-input.tsx\",\"./components/ui/scroll-area.tsx\",\"./components/elements/suggestion.tsx\",\"./components/suggested-actions.tsx\",\"./components/multimodal-input.tsx\",\"./node_modules/.pnpm/nanoid@5.1.3/node_modules/nanoid/index.d.ts\",\"./components/toolbar.tsx\",\"./components/version-footer.tsx\",\"./components/artifact.tsx\",\"./lib/db/queries.ts\",\"./node_modules/.pnpm/next-auth@5.0.0-beta.25_next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-d_kwdwn6b3rajgl6e7ziyurdtwie/node_modules/next-auth/providers/credentials.d.ts\",\"./app/(auth)/auth.config.ts\",\"./app/(auth)/auth.ts\",\"./app/(auth)/actions.ts\",\"./app/(auth)/api/auth/[...nextauth]/route.ts\",\"./app/(auth)/api/auth/guest/route.ts\",\"./node_modules/.pnpm/resumable-stream@2.2.8/node_modules/resumable-stream/dist/types.d.ts\",\"./node_modules/.pnpm/resumable-stream@2.2.8/node_modules/resumable-stream/dist/runtime.d.ts\",\"./node_modules/.pnpm/resumable-stream@2.2.8/node_modules/resumable-stream/dist/redis.d.ts\",\"./node_modules/.pnpm/resumable-stream@2.2.8/node_modules/resumable-stream/dist/index.d.ts\",\"./lib/ai/entitlements.ts\",\"./app/(chat)/api/chat/schema.ts\",\"./app/(chat)/api/chat/route.ts\",\"./app/(chat)/api/chat/[id]/stream/route.ts\",\"./app/(chat)/api/document/route.ts\",\"./node_modules/.pnpm/@vercel+blob@0.24.1/node_modules/@vercel/blob/dist/create-folder-oa5wyhfm.d.ts\",\"./node_modules/.pnpm/@vercel+blob@0.24.1/node_modules/@vercel/blob/dist/index.d.ts\",\"./app/(chat)/api/files/upload/route.ts\",\"./app/(chat)/api/history/route.ts\",\"./app/(chat)/api/suggestions/route.ts\",\"./app/(chat)/api/vote/route.ts\",\"./hooks/use-auto-resume.ts\",\"./lib/ai/models.mock.ts\",\"./node_modules/.pnpm/@ai-sdk+provider-utils@3.0.18_zod@3.25.76/node_modules/@ai-sdk/provider-utils/dist/test/index.d.ts\",\"./node_modules/.pnpm/ai@5.0.108_zod@3.25.76/node_modules/ai/dist/test/index.d.ts\",\"./lib/ai/models.test.ts\",\"./node_modules/.pnpm/drizzle-orm@0.34.1_@neondatabase+serverless@0.9.5_@opentelemetry+api@1.9.0_@types+pg@8.11.6_@_776tq3fsedfyew5bgiaz3arwhu/node_modules/drizzle-orm/postgres-js/migrator.d.ts\",\"./lib/db/migrate.ts\",\"./lib/db/helpers/01-core-to-parts.ts\",\"./tests/pages/chat.ts\",\"./tests/fixtures.ts\",\"./tests/helpers.ts\",\"./tests/e2e/api.test.ts\",\"./tests/e2e/auth.test.ts\",\"./tests/e2e/chat.test.ts\",\"./tests/e2e/model-selector.test.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/compiled/@next/font/dist/types.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/compiled/@next/font/dist/google/index.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/font/google/index.d.ts\",\"./components/theme-provider.tsx\",\"./node_modules/.pnpm/next-auth@5.0.0-beta.25_next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-d_kwdwn6b3rajgl6e7ziyurdtwie/node_modules/next-auth/lib/client.d.ts\",\"./node_modules/.pnpm/next-auth@5.0.0-beta.25_next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-d_kwdwn6b3rajgl6e7ziyurdtwie/node_modules/next-auth/react.d.ts\",\"./app/layout.tsx\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/client/form-shared.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/dist/client/form.d.ts\",\"./node_modules/.pnpm/next@16.0.10_@opentelemetry+api@1.9.0_@playwright+test@1.51.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/next/form.d.ts\",\"./components/ui/label.tsx\",\"./components/auth-form.tsx\",\"./components/submit-button.tsx\",\"./components/toast.tsx\",\"./app/(auth)/login/page.tsx\",\"./app/(auth)/register/page.tsx\",\"./components/sidebar-user-nav.tsx\",\"./components/app-sidebar.tsx\",\"./app/(chat)/layout.tsx\",\"./components/sidebar-toggle.tsx\",\"./components/chat-header.tsx\",\"./components/greeting.tsx\",\"./components/messages.tsx\",\"./components/chat.tsx\",\"./components/data-stream-handler.tsx\",\"./app/(chat)/page.tsx\",\"./app/(chat)/chat/[id]/page.tsx\",\"./components/sign-out-form.tsx\",\"./components/ai-elements/artifact.tsx\",\"./node_modules/.pnpm/@xyflow+system@0.0.74/node_modules/@xyflow/system/dist/esm/types/changes.d.ts\",\"./node_modules/.pnpm/@xyflow+system@0.0.74/node_modules/@xyflow/system/dist/esm/types/utils.d.ts\",\"./node_modules/.pnpm/@xyflow+system@0.0.74/node_modules/@xyflow/system/dist/esm/utils/types.d.ts\",\"./node_modules/.pnpm/@xyflow+system@0.0.74/node_modules/@xyflow/system/dist/esm/types/nodes.d.ts\",\"./node_modules/.pnpm/@xyflow+system@0.0.74/node_modules/@xyflow/system/dist/esm/types/handles.d.ts\",\"./node_modules/.pnpm/@xyflow+system@0.0.74/node_modules/@xyflow/system/dist/esm/types/panzoom.d.ts\",\"./node_modules/.pnpm/@xyflow+system@0.0.74/node_modules/@xyflow/system/dist/esm/types/general.d.ts\",\"./node_modules/.pnpm/@xyflow+system@0.0.74/node_modules/@xyflow/system/dist/esm/types/edges.d.ts\",\"./node_modules/.pnpm/@xyflow+system@0.0.74/node_modules/@xyflow/system/dist/esm/types/index.d.ts\",\"./node_modules/.pnpm/@xyflow+system@0.0.74/node_modules/@xyflow/system/dist/esm/constants.d.ts\",\"./node_modules/.pnpm/@xyflow+system@0.0.74/node_modules/@xyflow/system/dist/esm/utils/connections.d.ts\",\"./node_modules/.pnpm/@xyflow+system@0.0.74/node_modules/@xyflow/system/dist/esm/utils/dom.d.ts\",\"./node_modules/.pnpm/@xyflow+system@0.0.74/node_modules/@xyflow/system/dist/esm/utils/edges/bezier-edge.d.ts\",\"./node_modules/.pnpm/@xyflow+system@0.0.74/node_modules/@xyflow/system/dist/esm/utils/edges/straight-edge.d.ts\",\"./node_modules/.pnpm/@xyflow+system@0.0.74/node_modules/@xyflow/system/dist/esm/utils/edges/smoothstep-edge.d.ts\",\"./node_modules/.pnpm/@xyflow+system@0.0.74/node_modules/@xyflow/system/dist/esm/utils/edges/general.d.ts\",\"./node_modules/.pnpm/@xyflow+system@0.0.74/node_modules/@xyflow/system/dist/esm/utils/edges/positions.d.ts\",\"./node_modules/.pnpm/@xyflow+system@0.0.74/node_modules/@xyflow/system/dist/esm/utils/edges/index.d.ts\",\"./node_modules/.pnpm/@xyflow+system@0.0.74/node_modules/@xyflow/system/dist/esm/utils/graph.d.ts\",\"./node_modules/.pnpm/@xyflow+system@0.0.74/node_modules/@xyflow/system/dist/esm/utils/general.d.ts\",\"./node_modules/.pnpm/@xyflow+system@0.0.74/node_modules/@xyflow/system/dist/esm/utils/marker.d.ts\",\"./node_modules/.pnpm/@xyflow+system@0.0.74/node_modules/@xyflow/system/dist/esm/utils/node-toolbar.d.ts\",\"./node_modules/.pnpm/@xyflow+system@0.0.74/node_modules/@xyflow/system/dist/esm/utils/edge-toolbar.d.ts\",\"./node_modules/.pnpm/@xyflow+system@0.0.74/node_modules/@xyflow/system/dist/esm/utils/store.d.ts\",\"./node_modules/.pnpm/@xyflow+system@0.0.74/node_modules/@xyflow/system/dist/esm/utils/shallow-node-data.d.ts\",\"./node_modules/.pnpm/@xyflow+system@0.0.74/node_modules/@xyflow/system/dist/esm/utils/index.d.ts\",\"./node_modules/.pnpm/@xyflow+system@0.0.74/node_modules/@xyflow/system/dist/esm/xydrag/xydrag.d.ts\",\"./node_modules/.pnpm/@xyflow+system@0.0.74/node_modules/@xyflow/system/dist/esm/xydrag/index.d.ts\",\"./node_modules/.pnpm/@xyflow+system@0.0.74/node_modules/@xyflow/system/dist/esm/xyhandle/types.d.ts\",\"./node_modules/.pnpm/@xyflow+system@0.0.74/node_modules/@xyflow/system/dist/esm/xyhandle/xyhandle.d.ts\",\"./node_modules/.pnpm/@xyflow+system@0.0.74/node_modules/@xyflow/system/dist/esm/xyhandle/index.d.ts\",\"./node_modules/.pnpm/@xyflow+system@0.0.74/node_modules/@xyflow/system/dist/esm/xyminimap/index.d.ts\",\"./node_modules/.pnpm/@xyflow+system@0.0.74/node_modules/@xyflow/system/dist/esm/xypanzoom/xypanzoom.d.ts\",\"./node_modules/.pnpm/@xyflow+system@0.0.74/node_modules/@xyflow/system/dist/esm/xypanzoom/index.d.ts\",\"./node_modules/.pnpm/@xyflow+system@0.0.74/node_modules/@xyflow/system/dist/esm/xyresizer/types.d.ts\",\"./node_modules/.pnpm/@xyflow+system@0.0.74/node_modules/@xyflow/system/dist/esm/xyresizer/xyresizer.d.ts\",\"./node_modules/.pnpm/@xyflow+system@0.0.74/node_modules/@xyflow/system/dist/esm/xyresizer/index.d.ts\",\"./node_modules/.pnpm/@xyflow+system@0.0.74/node_modules/@xyflow/system/dist/esm/index.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/types/general.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/types/nodes.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/types/edges.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/types/component-props.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/types/store.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/types/instance.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/types/index.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/container/reactflow/index.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/components/handle/index.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/components/edges/edgetext.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/components/edges/straightedge.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/components/edges/stepedge.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/components/edges/bezieredge.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/components/edges/simplebezieredge.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/components/edges/smoothstepedge.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/components/edges/baseedge.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/components/reactflowprovider/index.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/components/panel/index.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/components/edgelabelrenderer/index.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/components/viewportportal/index.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/hooks/usereactflow.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/hooks/useupdatenodeinternals.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/hooks/usenodes.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/hooks/useedges.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/hooks/useviewport.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/hooks/usekeypress.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/hooks/usenodesedgesstate.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/hooks/usestore.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/hooks/useonviewportchange.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/hooks/useonselectionchange.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/hooks/usenodesinitialized.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/hooks/usehandleconnections.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/hooks/usenodeconnections.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/hooks/usenodesdata.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/hooks/useconnection.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/hooks/useinternalnode.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/contexts/nodeidcontext.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/hooks/useonnodeschangemiddleware.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/hooks/useonedgeschangemiddleware.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/utils/changes.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/utils/general.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/additional-components/background/types.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/additional-components/background/background.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/additional-components/background/index.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/additional-components/controls/types.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/additional-components/controls/controls.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/additional-components/controls/controlbutton.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/additional-components/controls/index.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/additional-components/minimap/types.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/additional-components/minimap/minimap.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/additional-components/minimap/minimapnode.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/additional-components/minimap/index.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/additional-components/noderesizer/types.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/additional-components/noderesizer/noderesizer.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/additional-components/noderesizer/noderesizecontrol.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/additional-components/noderesizer/index.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/additional-components/nodetoolbar/types.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/additional-components/nodetoolbar/nodetoolbar.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/additional-components/nodetoolbar/index.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/additional-components/edgetoolbar/types.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/additional-components/edgetoolbar/edgetoolbar.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/additional-components/edgetoolbar/index.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/additional-components/index.d.ts\",\"./node_modules/.pnpm/@xyflow+react@12.10.0_@types+react@18.3.18_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/@xyflow/react/dist/esm/index.d.ts\",\"./components/ai-elements/canvas.tsx\",\"./components/ai-elements/chain-of-thought.tsx\",\"./components/ai-elements/checkpoint.tsx\",\"./components/ai-elements/code-block.tsx\",\"./components/ui/alert.tsx\",\"./components/ai-elements/confirmation.tsx\",\"./components/ai-elements/connection.tsx\",\"./components/ai-elements/controls.tsx\",\"./node_modules/.pnpm/use-stick-to-bottom@1.1.1_react@19.0.1/node_modules/use-stick-to-bottom/dist/usesticktobottom.d.ts\",\"./node_modules/.pnpm/use-stick-to-bottom@1.1.1_react@19.0.1/node_modules/use-stick-to-bottom/dist/sticktobottom.d.ts\",\"./node_modules/.pnpm/use-stick-to-bottom@1.1.1_react@19.0.1/node_modules/use-stick-to-bottom/dist/index.d.ts\",\"./components/ai-elements/conversation.tsx\",\"./components/ai-elements/edge.tsx\",\"./components/ai-elements/image.tsx\",\"./node_modules/.pnpm/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/alignment.d.ts\",\"./node_modules/.pnpm/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/noderects.d.ts\",\"./node_modules/.pnpm/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/axis.d.ts\",\"./node_modules/.pnpm/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/slidestoscroll.d.ts\",\"./node_modules/.pnpm/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/limit.d.ts\",\"./node_modules/.pnpm/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/scrollcontain.d.ts\",\"./node_modules/.pnpm/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/dragtracker.d.ts\",\"./node_modules/.pnpm/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/utils.d.ts\",\"./node_modules/.pnpm/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/animations.d.ts\",\"./node_modules/.pnpm/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/counter.d.ts\",\"./node_modules/.pnpm/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/eventhandler.d.ts\",\"./node_modules/.pnpm/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/eventstore.d.ts\",\"./node_modules/.pnpm/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/percentofview.d.ts\",\"./node_modules/.pnpm/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/resizehandler.d.ts\",\"./node_modules/.pnpm/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/vector1d.d.ts\",\"./node_modules/.pnpm/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/scrollbody.d.ts\",\"./node_modules/.pnpm/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/scrollbounds.d.ts\",\"./node_modules/.pnpm/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/scrolllooper.d.ts\",\"./node_modules/.pnpm/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/scrollprogress.d.ts\",\"./node_modules/.pnpm/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/slideregistry.d.ts\",\"./node_modules/.pnpm/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/scrolltarget.d.ts\",\"./node_modules/.pnpm/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/scrollto.d.ts\",\"./node_modules/.pnpm/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/slidefocus.d.ts\",\"./node_modules/.pnpm/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/translate.d.ts\",\"./node_modules/.pnpm/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/slidelooper.d.ts\",\"./node_modules/.pnpm/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/slideshandler.d.ts\",\"./node_modules/.pnpm/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/slidesinview.d.ts\",\"./node_modules/.pnpm/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/engine.d.ts\",\"./node_modules/.pnpm/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/optionshandler.d.ts\",\"./node_modules/.pnpm/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/plugins.d.ts\",\"./node_modules/.pnpm/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/emblacarousel.d.ts\",\"./node_modules/.pnpm/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/draghandler.d.ts\",\"./node_modules/.pnpm/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/options.d.ts\",\"./node_modules/.pnpm/embla-carousel@8.6.0/node_modules/embla-carousel/esm/index.d.ts\",\"./node_modules/.pnpm/embla-carousel-react@8.6.0_react@19.0.1/node_modules/embla-carousel-react/esm/components/useemblacarousel.d.ts\",\"./node_modules/.pnpm/embla-carousel-react@8.6.0_react@19.0.1/node_modules/embla-carousel-react/esm/index.d.ts\",\"./components/ui/carousel.tsx\",\"./components/ui/hover-card.tsx\",\"./components/ai-elements/inline-citation.tsx\",\"./components/ai-elements/loader.tsx\",\"./node_modules/.pnpm/@radix-ui+react-slot@1.2.4_@types+react@18.3.18_react@19.0.1/node_modules/@radix-ui/react-slot/dist/index.d.mts\",\"./components/ui/button-group.tsx\",\"./components/ai-elements/message.tsx\",\"./components/ui/card.tsx\",\"./components/ai-elements/node.tsx\",\"./components/ai-elements/open-in-chat.tsx\",\"./components/ai-elements/panel.tsx\",\"./node_modules/.pnpm/motion-utils@12.23.6/node_modules/motion-utils/dist/index.d.ts\",\"./node_modules/.pnpm/motion-dom@12.23.23/node_modules/motion-dom/dist/index.d.ts\",\"./node_modules/.pnpm/framer-motion@12.23.26_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/framer-motion/dist/types.d-dagzkals.d.ts\",\"./node_modules/.pnpm/framer-motion@12.23.26_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/framer-motion/dist/types/index.d.ts\",\"./node_modules/.pnpm/motion@12.23.26_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/motion/dist/react.d.ts\",\"./components/ai-elements/shimmer.tsx\",\"./components/ai-elements/plan.tsx\",\"./components/ui/input-group.tsx\",\"./components/ai-elements/prompt-input.tsx\",\"./components/ai-elements/queue.tsx\",\"./components/ai-elements/reasoning.tsx\",\"./components/ai-elements/sources.tsx\",\"./components/ai-elements/suggestion.tsx\",\"./components/ai-elements/task.tsx\",\"./components/ai-elements/tool.tsx\",\"./components/ai-elements/toolbar.tsx\",\"./components/ai-elements/web-preview.tsx\",\"./components/elements/branch.tsx\",\"./components/elements/conversation.tsx\",\"./components/elements/image.tsx\",\"./components/elements/inline-citation.tsx\",\"./components/elements/source.tsx\",\"./components/elements/task.tsx\",\"./components/elements/web-preview.tsx\",\"./components/ui/progress.tsx\",\"./lib/editor/react-renderer.tsx\",\"./.next/types/routes.d.ts\",\"./.next/types/validator.ts\",\"./.next/dev/types/cache-life.d.ts\",\"./.next/dev/types/validator.ts\",\"./node_modules/.pnpm/@types+pdf-parse@1.1.4/node_modules/@types/pdf-parse/index.d.ts\"],\"fileIdsList\":[[96,138,442,443,444,445],[96,138],[96,138,270,487,490,493,1762,1763,1770,1771,1772,1775,1776,1777,1778,1800,1808,1809,1812,1819,1820],[96,138,270,487,490,1762,1763,1770,1771,1772,1775,1776,1777,1778,1800,1808,1809,1812,1819,1820,2012],[96,138,270,831,1757,1760],[96,138,270,1760],[96,138,270,487,741,829,1760],[96,138,270,1313,1760],[96,138,270,741,827,829,1313,1757,1758,1759,1760],[84,96,138,270,464,475,1761,1799,1805,1806,1807],[96,138,270,458,826,1322,1323,1333,1731,1757],[96,138,270,826,1280,1304,1309,1332,1757,1760,1770],[96,138,270,487,826,829,1304,1309,1321,1322,1323,1328,1329,1330,1331,1332,1333,1731,1732,1746,1757,1760,1767,1768,1769],[96,138,270,831],[96,138,270,1309,1756,1757,1760],[96,138,270,487,831,1760,1774],[96,138,270,487,1309,1757,1760],[96,138,270,1309,1757,1760],[84,96,138,270,458,475,1333,1746,1757,1760,1817,1818],[84,96,138,270,458,478,1706,1727,1760,1811],[84,96,138,270,458,475,1333,1746,1760,1817,1818],[96,138,270,491,1292,1796,1797,1799],[96,138,270,1757],[96,138,270,1292,1305,1333,1335,1384,1385],[96,138,270,826,831,1322,1323,1327],[96,138,270,1292,1335,1385,1388],[96,138,270,1292,1335,1385,1390,1394],[96,138,270,1292,1304,1335,1385,1665,1666,1698,1699],[96,138,270,826,1322,1323,1327],[84,96,138,270,1333,1383,1701,1711],[84,96,138,270,1924],[84,96,138,270,1333,1711,1712,1713,1735],[84,96,138,270,1333,1383,1701,1711,1723],[84,96,138,270,1333,1383,1473,1711],[84,96,138,270,826,1333,1383,1929],[96,138,270,1924],[84,96,138,270,1333,1924],[84,96,138,270,1333,1383,1711,1935],[96,138,270,826,1333],[84,96,138,270,1333,1711,1712,1975,1976],[84,96,138,270,1333],[84,96,138,270,826,1333,1383,1663,1701,1711,1980],[84,96,138,270,462,1333,1743,1744],[84,96,138,270,1333,1924,1982],[84,96,138,270,1333,1383,1711,1719],[84,96,138,270,1333,1383,1711,1713,1982,1991],[84,96,138,270,826,1333,1383,1711,1719,1744,1747,1753,1976,1993],[84,96,138,270,1333,1383,1711,1713,1749],[84,96,138,270,1333,1663,1711,1713,1735,1991],[84,96,138,270,1333,1990],[84,96,138,270,1333,1711,1713],[84,96,138,270,1333,1383,1749],[84,96,138,270,826,1333,1711,1712,1713,1928],[84,96,138,270,1333,1383,1701,1711,1713,1722],[84,96,138,270,464,475,1290,1292,1313,1335,1383,1701,1720,1721,1727,1729,1760,1810],[84,96,138,270,1292,1333,1383,1385,1701,1756],[84,96,138,270,1306,1335,1383],[84,96,138,270,1022,1281,1284,1304,1332,1705,1740,1756],[84,96,138,270,1022,1280,1281,1284,1290,1291,1304,1306,1332,1333,1386,1389,1395,1700,1702,1703,1727,1731,1741,1752,1754,1755],[96,138,270,1722,1803,1804],[84,96,138,270,464,475,1291,1335,1383,1727,1731,1813],[84,96,138,270,475,826,1022,1290,1304,1306,1309,1332,1333,1706,1720,1721,1729,1730,1731,1752,1756,1779,1807,1814,1816],[84,96,138,270,1295,1297,1301,1302,1303,1304],[84,96,138,270,1306,1333,1334,1335,1383],[84,96,138,270,826,1022,1304,1332,1756],[84,96,138,270,1290,1306,1706,1720,1729,1756],[84,96,138,270,826,1332],[84,96,138,270,400,1396,1397,1398,1400,1401,1402,1663,1664],[84,96,138,270,1281,1290,1304,1305,1306,1333,1335,1388,1394,1666,1698,1707,1756],[96,138,270,1756],[84,96,138,270,1292,1306,1335,1756],[84,96,138,270,1333,1383,1701],[84,96,138,270,826,1333,1383,1711],[84,96,138,270,1333,1383,1711,1714],[84,96,138,270,826,1333,1709],[84,96,138,270,826,1333,1383,1711,1733,1747],[84,96,138,270,1333,1693,1711,1713,1735],[84,96,138,270,1333,1663],[84,96,138,270,826,1333,1711,1712,1713,1715],[96,138,270,1284],[96,138,270],[96,138,270,1335,1387],[84,96,138,270,1281,1290,1291,1292,1304,1332,1335,1717],[84,96,138,270,1022,1332,1333,1383,1732,1733],[84,96,138,270,1736],[84,96,138,270,1022,1281,1304,1332,1333,1335,1693,1706,1707,1708,1710,1716,1718,1734,1737,1738,1739],[84,96,138,270,1022,1281,1304,1332,1705,1706,1711,1740,1815],[84,96,138,270,826,1022,1281,1291,1292,1332,1333,1335,1383,1711,1731,1738,1745,1746,1748,1751],[96,138,270,462,1332,1334,1335,1383],[84,96,138,270,1333,1390,1392,1393],[84,96,138,270,464,1304,1335,1719,1727,1730],[84,96,138,270,475,1280,1284,1292,1304,1313,1333,1335,1720,1721,1727,1728,1760],[84,96,138,270,1333,1335,1383,1701,1727],[96,138,270,462,475,829,1313,1335,1392,1711,1719,1727,1760,1799,1807],[96,138,270,1760,1803],[96,138,191,192,193,270,1335,1383],[84,96,138,270,1022,1284,1332,1731,1750],[84,96,138,270,1284,1291,1333,1335,1383,1695,1756],[84,96,138,270,1304,1400,1401,1668,1669,1695,1696,1697],[96,138,270,1391,1392],[84,96,138,270,1292,1333,1335],[84,96,138,270,1022,1284,1291,1332,1335,1385,1387,1701,1753,1756],[84,96,138,270,1333,1382,1383],[84,96,138,270,1333,1337],[84,96,138,270,1333,1382],[96,138,270,1333,1337,1723,1979],[84,96,138,270,1333,1337,1382],[84,96,138,270,1333,1383,1711,1974],[96,138,270,1382],[84,96,138,270,1333,1346,1711,1742,1743],[84,96,138,270,1333,1346,1711],[84,96,138,270,1333,1382,1711],[84,96,138,270,1333,1337,1383,1722,1733],[84,96,138,270,1333,1337,1382,1711],[84,96,138,270,1333,1337,1382,1383,1701,1711,1722,1723,1724,1725,1726],[96,138,270,1333],[84,96,138,270,1280,1284,1290,1291,1304,1306,1333,1335,1383],[84,96,138,270,1333,1335,1383,1719,1730],[84,96,138,270,1280,1387],[96,138,270,495,497],[84,96,138,270,1290,1756],[84,96,138,270,1022,1332,1706],[84,96,138,270,1290,1720,1729,1731,1732],[84,96,138,270,1022,1332,1704],[84,96,138,270],[96,138,270,708],[96,138,270,826],[96,138,270,826,1782],[96,138,270,1321,1756],[96,138,270,825,826,829],[96,138,270,826,831,1313,1327,1332,1333,1760],[96,138,270,826,831],[96,138,270,826,831,1304,1313,1323,1332,1333,1757,1760],[96,138,270,826,831,1313,1327,1332,1757,1760],[96,138,270,826,1304,1313,1324,1325,1326,1332,1756,1757,1760],[96,138,270,828],[96,138,270,495,1018,1021,1784],[96,138,270,488,828,1017,1018,1021,1304,1309,1333,1731,1756],[96,138,270,976,1017],[96,138,270,826,827],[84,96,138,270,1397,1398,1400,1401,1402,1669,1696],[96,138,270,1397],[96,138,270,400,1397,1400,1692,1693,1695,1697],[96,138,192,270,399],[96,138,192,270,399,1304,1397,1400,1401,1694,1756],[96,138,270,826,831,1304,1328,1329,1330,1331,1756],[96,138,270,826,1280,1304,1307,1308,1309,1332],[96,138,491,492,493],[96,138,270,491],[96,138,742,824],[96,138,742,808,809,822,823],[96,138,808,822,824,826],[96,138,733,739],[96,138,722,723,724,733,734,735,737,739,740],[96,138,737,739],[96,138,722],[96,138,739],[96,138,736,739],[96,138,736],[96,138,721,732,734,739],[96,138,726,733,739],[96,138,728,733,739],[96,138,727,729,731,732,739],[96,138,729,739],[96,138,720,722,730,733,736,739],[96,138,719,720,721,733,736,737,738],[96,138,1293,1295,1297],[96,138,1299,1300],[96,138,1293,1294,1295,1296,1297,1298],[96,138,1295,1299],[96,138,1295,1296],[96,138,1475],[96,138,1474,1478],[96,138,1474],[96,138,1482],[96,138,1491],[96,138,1493,1494],[96,138,1498],[96,138,1495],[96,138,1493,1495,1496],[96,138,1494,1497],[96,138,1510],[96,138,1474,1513],[96,138,1476,1477,1479,1480,1481,1482,1483,1484,1485,1486,1487,1488,1489,1490,1492,1493,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,1515,1516,1517,1518,1519,1520,1521,1522,1523,1524,1525,1526,1528,1529,1530,1531,1532,1533,1534,1535],[96,138,1528],[96,138,1474,1528],[96,138,1474,1482,1527],[96,138,1527,1528],[96,138,1482,1510,1513],[96,138,1474,1516],[96,138,1293],[96,138,549,550,551],[96,138,547,548,549,550,551,552,553,554,555,556],[96,138,548,549],[96,138,548,549,550],[96,138,548],[96,138,546],[96,138,549,550],[96,138,546,547],[96,138,505],[96,138,508],[96,138,513,515],[96,138,501,505,517,518],[96,138,528,531,537,539],[96,138,500,505],[96,138,499],[96,138,500],[96,138,507],[96,138,510],[96,138,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,540,541,542,543,544,545],[96,138,516],[96,138,512],[96,138,513],[96,138,504,505,511],[96,138,512,513],[96,138,519],[96,138,540],[96,138,504],[96,138,505,522,525],[96,138,521],[96,138,522],[96,138,520,522],[96,138,505,525,527,528,529],[96,138,528,529,531],[96,138,505,520,523,526,533],[96,138,520,521],[96,138,502,503,520,522,523,524],[96,138,522,525],[96,138,503,520,523,526],[96,138,505,525,527],[96,138,528,529],[96,138,546,598],[96,138,598],[96,138,595,596,597,598,599,600,601,602,603,604,605,609,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632],[96,138,603],[96,138,614],[96,138,605],[96,138,606,607,608,610,611,612,613],[96,138,161,188],[96,138,609],[96,138,188],[96,138,559],[96,138,558,559,560,566,567,568,569],[96,138,546,557,558],[96,138,558],[96,138,565],[96,138,563,564],[96,138,558,561,562],[96,138,160],[96,138,546,557],[96,138,573],[96,138,571,572],[96,138,571,572,573],[96,138,586,587,588,589,590],[96,138,585],[96,138,571,573,574],[96,138,578,579,580,581,582,583,584],[96,138,571,572,573,574,577,591,592],[96,138,576],[96,138,575],[96,138,572,573],[96,138,546,571,572],[96,138,594,636,637,640],[96,138,633,634,640],[96,138,633,634],[96,138,546,634,637],[96,138,546,557,593,633],[96,138,636,637,640],[96,138,594,634,636,637,638,639,640,641,642,643,647],[96,138,557,593,594,637],[96,138,557,594,637],[96,138,546,557,593,633,634,635],[96,138,546,636],[96,138,646],[96,138,594,644],[96,138,645],[96,138,593],[96,138,546,677,678,679,691],[96,138,546,677,678,679,682,683,691],[96,138,679,680,681,684,685,686],[96,138,546,677,678,691],[96,138,677,688,690],[96,138,690],[96,138,633,677,690,691,692,693],[96,138,633,677,690,691,693],[96,138,546,593,633,677,679,690],[96,138,633,677,688,690,691],[96,138,691],[96,138,677,688,690,691,692,694,695,696],[96,138,693,694,697],[96,138,677,678,679,688,689,690,691,692,693,694,697,698,699,700,701],[96,138,546,689],[96,138,546,593,689,695,697],[96,138,546,633],[96,138,678,679,687,690],[96,138,674,690],[96,138,674],[96,138,673,675,676,688,690],[96,138,546,593,652,655,656,658],[96,138,546,650,651,652,655,656],[96,138,633,650,656],[96,138,546,650,651,652],[96,138,546,593,633,649],[96,138,546,650,651,652,656],[96,138,633,650],[96,138,649,650,651,652,653,654,655,656,657,658,663,664,665,666,667,668,669,670,671],[96,138,662],[96,138,655,659],[96,138,660,661],[96,138,653],[96,138,654],[96,138,546,654],[96,138,546,593,633,649,650,658],[96,138,546,650,651],[96,138,546,593,633,652,655,657],[96,138,546,593,652,653,654],[96,138,716],[84,96,138],[84,96,138,1339,1340,1341],[84,96,138,1339,1346],[84,96,138,1340],[84,96,138,1339,1340],[84,96,138,270,1339,1340],[84,96,138,1339,1340,1355],[84,96,138,1339,1340,1343,1344,1345],[84,96,138,270,1339,1340,1359],[84,96,138,1339,1340,1343,1345,1353],[84,96,138,1339,1340,1343,1344,1345,1353,1354],[84,96,138,270,1339,1340,1354,1355],[84,96,138,1339,1340,1343,1363],[84,96,138,1340,1354],[84,96,138,1339,1340,1343,1344,1345,1353],[84,96,138,1339,1340,1351,1352],[84,96,138,1339,1340,1354],[84,88,96,138,189,190,437,484],[84,96,138,1339,1340,1343],[84,96,138,1339,1340,1354,1378],[84,96,138,1339,1340,1354,1372,1379],[96,138,1404,1442,1448,1460],[96,138,1447,1448],[96,138,1448],[96,138,1447,1448,1467,1468,1469],[96,138,1447,1448,1467],[96,138,1471],[96,138,1404,1442,1447],[96,138,1542,1570],[96,138,1541,1547],[96,138,1552],[96,138,1547],[96,138,1546],[96,138,1564],[96,138,1560],[96,138,1542,1559,1570],[96,138,1541,1542,1543,1544,1545,1546,1548,1549,1550,1551,1552,1553,1554,1555,1556,1557,1558,1559,1560,1561,1562,1563,1564,1565,1566,1567,1568,1569,1570,1571],[96,138,1403],[96,138,1690],[96,138,1675],[96,138,1677,1680,1681],[96,138,1679],[96,138,1670,1676,1678,1682,1685,1687,1688,1689],[96,138,1678,1683,1684,1690],[96,138,1683,1686],[96,138,1678,1679,1683,1690],[96,138,1678,1690],[96,138,1671,1672,1673,1674],[96,138,1673],[96,135,138],[96,137,138],[138],[96,138,143,173],[96,138,139,144,150,151,158,170,181],[96,138,139,140,150,158],[91,92,93,96,138],[96,138,141,182],[96,138,142,143,151,159],[96,138,143,170,178],[96,138,144,146,150,158],[96,137,138,145],[96,138,146,147],[96,138,150],[96,138,148,150],[96,137,138,150],[96,138,150,151,152,170,181],[96,138,150,151,152,165,170,173],[96,133,138,186],[96,133,138,146,150,153,158,170,181],[96,138,150,151,153,154,158,170,178,181],[96,138,153,155,170,178,181],[94,95,96,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187],[96,138,150,156],[96,138,157,181],[96,138,146,150,158,170],[96,138,159],[96,137,138,161],[96,135,136,137,138,139,140,141,142,143,144,145,146,147,148,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187],[96,138,163],[96,138,164],[96,138,150,165,166],[96,138,165,167,182,184],[96,138,150,170,171,173],[96,138,170,172],[96,138,170,171],[96,138,173],[96,138,174],[96,135,138,170],[96,138,150,176,177],[96,138,176,177],[96,138,143,158,170,178],[96,138,179],[96,138,158,180],[96,138,153,164,181],[96,138,143,182],[96,138,170,183],[96,138,157,184],[96,138,185],[96,138,143,150,152,161,170,181,184,186],[96,138,170,187],[96,138,170,188],[84,96,138,191,192,193,399],[84,96,138,191,192],[84,96,138,192,399],[84,96,138,1714],[84,88,96,138,190,437,484,1979],[84,88,96,138,189,437,484,1979],[81,82,83,96,138],[96,138,170],[96,138,170,1773],[96,138,1318],[96,138,1314,1315,1316,1317,1318,1319,1320],[96,138,633,672,705],[96,138,703,704,705,706,707],[96,138,153,155,188,546,570],[96,138,546,570,593,648,672,702,703],[84,96,138,270,1902],[96,138,1902,1903],[96,138,270,1905],[84,96,138,270,1905],[96,138,1905,1906,1907],[84,96,138,1860,1867],[96,138,270,1920],[96,138,1920,1921],[84,96,138,1860],[96,138,1904,1908,1912,1916,1919,1922],[96,138,1909,1910,1911],[96,138,270,1867,1909],[84,96,138,270,1909],[96,138,1913,1914,1915],[84,96,138,270,1913],[96,138,270,1913],[96,138,1917,1918],[96,138,270,1917],[96,138,270,1867],[84,96,138,270,1867],[84,96,138,270,1860,1867],[84,96,138,1867],[96,138,1860,1867],[96,138,1867],[96,138,1860],[96,138,1860,1867,1868,1869,1870,1871,1872,1873,1874,1875,1876,1877,1878,1879,1880,1881,1882,1883,1884,1885,1886,1887,1888,1889,1890,1891,1892,1893,1894,1895,1896,1897,1898,1899,1900,1901,1923],[96,138,1861,1862,1863,1864,1865,1866],[84,96,138,1860,1861],[96,138,1831],[96,138,1831,1832,1848,1850,1853,1854,1856,1859],[96,138,1824],[96,138,1542,1551,1570,1571,1824,1826,1827,1828,1860],[96,138,1823,1824,1826,1827,1828,1829,1830],[96,138,1825,1831],[96,138,1571,1831],[96,138,1835,1836,1837,1838,1839],[96,138,1824,1826,1829,1830,1831],[96,138,1831,1832],[96,138,1825,1833,1834,1840,1841,1842,1843,1844,1845,1846,1847],[96,138,1825,1831,1860],[96,138,1849],[96,138,1852],[96,138,1851],[96,138,1542,1570,1831],[96,138,1855],[96,138,1857,1858],[96,138,1551],[96,138,1831,1857],[96,138,153,546,742,808,822,824,825],[96,138,742,1781],[96,138,1307,1336],[96,138,1307],[84,96,138,1346],[96,138,1295,1297],[96,138,1649,1650,1651,1652,1653],[96,138,1647],[96,138,1648,1654,1655],[96,138,1026],[96,138,1024,1026],[96,138,1024],[96,138,1026,1090,1091],[96,138,1026,1093],[96,138,1026,1094],[96,138,1111],[96,138,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279],[96,138,1026,1187],[96,138,1026,1091,1211],[96,138,1024,1208,1209],[96,138,1210],[96,138,1026,1208],[96,138,1023,1024,1025],[96,138,1538],[96,138,181,188],[96,138,178,496],[96,138,832,837,839,883,1012],[96,138,832,834,1012],[96,138,832,834,837,906,976,1010,1012],[96,138,832,834,837,839,1011],[96,138,832],[96,138,876],[96,138,832,833,834,836,838,839,880,883,885,1011,1012,1013,1014,1015,1016],[96,138,869,891,902],[96,138,832,837,869],[96,138,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,860,861,862,863,864,872],[96,138,832,871,1011,1012],[96,138,832,834,871,1011,1012],[96,138,832,834,837,869,870,1011,1012],[96,138,832,834,837,869,871,1011,1012],[96,138,832,834,869,871,1011,1012],[96,138,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,860,861,862,863,864,871,872],[96,138,832,851,871,1011,1012],[96,138,832,834,859,1011,1012],[96,138,832,834,836,837,869,881,883,890,891,892,893,896,897,899,902],[96,138,832,834,837,869,871,883,884,886,888,889,899,902],[96,138,832,869,873],[96,138,840,866,867,868,869,870,873,890,893,896,898,899,900,901,903,904,905],[96,138,832,837,869,873],[96,138,832,837,869,891,899],[96,138,832,836,837,869,885,890,899,902],[96,138,886,888,889,894,895,902],[96,138,832,837,839,869,871,885,887,888,890,899,902],[96,138,832,836,837,881,890,893,894,902],[96,138,832,834,837,869,883,885,890,899],[96,138,832,834,836,837,869,873,881,882,885,890,891,893,899,902],[96,138,834,836,837,838,839,869,873,881,882,891,894,899,901],[96,138,832,834,836,837,869,885,890,899,902,1012],[96,138,832,869,901],[96,138,832,834,837,883,890,898,902],[96,138,836,837,882],[96,138,832,839,840,865,866,867,868,870,871,1011],[96,138,838,839,840,866,867,868,869,870,901,906,1011,1012,1017],[96,138,832,837],[96,138,832,837,873,881,882,891,895,900,902,1011],[96,138,837,839,1012],[96,138,946,952,970],[96,138,832,880,946],[96,138,908,909,910,911,912,914,915,916,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,949],[96,138,832,918,948,1011,1012],[96,138,832,948,1011,1012],[96,138,832,834,948,1011,1012],[96,138,832,834,837,943,946,947,1011,1012],[96,138,832,834,837,946,948,1011,1012],[96,138,832,948,1011],[96,138,832,834,913,948,1011,1012],[96,138,832,834,946,948,1011,1012],[96,138,908,909,910,911,912,914,915,916,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,948,949,950],[96,138,832,917,948,1011],[96,138,832,920,948,1011,1012],[96,138,832,946,948,1011,1012],[96,138,832,913,920,946,948,1011,1012],[96,138,832,834,913,946,948,1011,1012],[96,138,832,834,836,837,881,883,946,951,952,954,955,956,957,958,960,965,966,969,970],[96,138,832,834,837,883,884,946,951,960,965,969,970],[96,138,832,946,951],[96,138,907,917,943,944,945,946,947,951,958,959,960,965,966,968,969,971,972,973,975],[96,138,832,837,946,951],[96,138,832,837,946,960],[96,138,832,836,837,882,885,887,946,960,966,970],[96,138,957,961,962,963,964,967,970],[96,138,832,836,837,882,885,887,943,946,960,962,966,970],[96,138,832,836,837,881,951,958,964,966,970],[96,138,832,834,837,883,885,887,946,960,966],[96,138,832,837,885,887,953],[96,138,832,837,885,887,960,966,969],[96,138,832,834,836,837,881,882,885,887,946,951,952,958,960,966,970],[96,138,834,836,837,838,839,881,882,946,951,952,960,964,969],[96,138,832,834,836,837,882,885,887,946,960,966,970,1012],[96,138,832,837,917,946,950,969],[96,138,832,880,883,953,959,966,970],[96,138,832,839,907,942,943,944,945,947,948,1011],[96,138,838,839,907,943,944,945,946,947,948,951,969,1011,1012,1017],[96,138,974],[96,138,832,837,881,882,948,952,967,968,970,1011],[96,138,832,834,959,1018,1019],[96,138,1019,1020],[96,138,884,1020],[96,138,832,833,834,837,883,960,966,970,976,1018],[96,138,832,880],[96,138,834,836,837,838,839,1011,1012],[96,138,832,834,837,839,874,876,1012],[96,138,1011],[96,138,1017],[96,138,837,1012],[96,138,874,875],[96,138,877,878],[96,138,837,881,1012],[96,138,837,876,879],[96,138,832,835,836,838,839,1012],[96,138,985,1003,1008],[96,138,832,837,1003],[96,138,978,998,999,1000,1001,1006],[96,138,188,832,834,1005,1011,1012],[96,138,832,834,837,1003,1004,1011,1012],[96,138,832,834,837,1003,1005,1011,1012],[96,138,978,998,999,1000,1001,1005,1006],[96,138,832,834,997,1003,1005,1011,1012],[96,138,832,1005,1011,1012],[96,138,832,834,1003,1005,1011,1012],[96,138,832,834,836,837,881,883,982,983,984,985,988,993,994,1003,1008],[96,138,832,834,837,883,884,988,993,1003,1007,1008],[96,138,832,1003,1007],[96,138,977,979,980,981,984,986,988,993,994,996,997,1003,1004,1007,1009],[96,138,832,837,1003,1007],[96,138,832,837,988,996,1003],[96,138,832,834,836,837,882,885,887,988,994,1003,1008],[96,138,989,990,991,992,995,1008],[96,138,832,834,836,837,882,885,887,979,988,990,994,1003,1008],[96,138,832,836,837,881,984,992,994,1008],[96,138,832,834,837,883,885,887,988,994,1003],[96,138,832,837,885,887,953,994],[96,138,832,834,836,837,881,882,885,887,984,985,988,994,1003,1007,1008],[96,138,834,836,837,838,839,881,882,985,988,992,996,1003,1007],[96,138,832,834,836,837,882,885,887,988,994,1003,1008,1012],[96,138,832,837,883,885,953,986,987,994,1008],[96,138,832,839,977,979,980,981,1002,1004,1005,1011],[96,138,832,1003,1005],[96,138,838,839,977,979,980,981,996,1003,1004,1010,1012,1017],[96,138,832,837,881,882,985,995,1005,1008,1011],[96,138,832,834,837,838,1012],[96,138,833,837,839,1012],[96,138,1972],[96,138,1973],[96,138,1946,1966],[96,138,1940],[96,138,1941,1945,1946,1947,1948,1949,1951,1953,1954,1959,1960,1969],[96,138,1941,1946],[96,138,1949,1966,1968,1971],[96,138,1940,1941,1942,1943,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1958,1959,1960,1961,1962,1963,1964,1965,1970,1971],[96,138,1969],[96,138,1939,1941,1942,1944,1952,1961,1964,1965,1970],[96,138,1946,1971],[96,138,1967,1969,1971],[96,138,1940,1941,1946,1949,1969],[96,138,1953],[96,138,1943,1951,1953,1954],[96,138,1943],[96,138,1943,1953],[96,138,1947,1948,1949,1953,1954,1959],[96,138,1949,1950,1954,1958,1960,1969],[96,138,1941,1953,1962],[96,138,1942,1943,1944],[96,138,1949,1969],[96,138,1949],[96,138,1940,1941],[96,138,1941],[96,138,1945],[96,138,1949,1954,1966,1967,1968,1969,1971],[84,96,138,270,1282,1283],[84,96,138,1986,1987],[84,96,138,270,1986,1987,1988],[96,138,1459],[96,138,1404,1442,1453,1458],[96,138,1404,1414,1415,1416,1440,1441,1442],[96,138,1404,1415,1442],[96,138,1404,1414,1415,1442],[96,138,1417,1418,1419,1420,1421,1422,1423,1424,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1438,1439],[96,138,1404,1408,1414,1416,1442],[96,138,1539],[96,138,1540,1577],[96,138,1540,1572,1575,1576],[96,138,1574,1577],[96,138,1540,1542,1570,1573,1574,1581,1657,1658],[96,138,1537,1540,1573,1574,1575,1577,1578,1579,1581,1659,1660,1661],[96,138,1540,1573,1575,1577],[96,138,1474,1536],[96,138,1577,1581,1659],[96,138,1581],[96,138,1542,1570,1573,1581,1646,1656,1662],[96,138,1573,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,1615,1616,1617,1618,1619,1620,1621,1622,1623,1624,1625,1626,1627,1628,1629,1630,1631,1632,1633,1634,1635,1636,1637,1638,1639,1640,1641,1642,1643,1644,1645],[96,138,1542,1570,1573,1581],[96,138,1540,1573,1580,1646],[96,138,1540],[96,138,1540,1542,1570,1572,1573],[96,138,1986],[96,138,1989],[96,138,487,491,733,736,739,1310,1311,1312],[96,138,740],[84,96,138,733,739,1312],[96,138,487,491,736,739,1310],[96,138,487],[96,138,727],[84,96,138,733,739,1798],[84,96,138,1391],[96,138,440],[96,138,198,200,204,212,221,423,433],[96,138,200,216,217,218,220,433],[96,138,200,251,253,255,256,259,433,435],[96,138,200,204,206,207,208,210,211,212,213,422,433,435],[96,138,433],[96,138,209,210,217,403,412,429],[96,138,200],[96,138,194,209,429],[96,138,261],[96,138,260,433],[96,138,153,395,403,489],[96,138,153,363,375,412,428],[96,138,153,306],[96,138,416],[96,138,415,416,417],[96,138,415],[90,96,138,153,194,200,204,207,210,214,215,217,221,233,234,261,336,413,423,433,437],[96,138,198,200,219,251,252,257,258,433,489],[96,138,219,489],[96,138,198,234,350,433,489],[96,138,489],[96,138,200,219,220,489],[96,138,254,489],[96,138,214,414,421],[96,138,164,270,429],[96,138,270,429],[84,96,138,367],[96,138,303,304,429,465,466,473],[96,138,409,465,467,468,469,470,472],[96,138,408],[96,138,408,409],[96,138,471],[84,96,138,1801],[84,96,138,201,459],[84,96,138,181],[84,96,138,219,294],[84,96,138,219],[96,138,292,296],[84,96,138,293,439],[96,138,1794],[84,88,96,138,153,188,189,190,437,482,483,1979],[96,138,153],[96,138,153,204,241,311,326,347,349,418,419,433,434],[96,138,233,420],[96,138,437],[96,138,199],[84,96,138,352,365,374,384,386,428],[96,138,164,352,365,383,384,385,428,488],[96,138,377,378,379,380,381,382],[96,138,379],[96,138,383],[96,138,268,269,270,272],[84,96,138,262,263,264,265,271],[96,138,268,271],[96,138,266],[96,138,267],[84,96,138,270,293,439],[84,96,138,270,438,439],[84,96,138,270,439],[96,138,326,425],[96,138,425],[96,138,153,434,439],[96,138,371],[96,137,138,370],[96,138,209,242,243,309,312,349,358,361,363,364,402,428,431,434],[96,138,209,243,392],[96,138,363,428],[84,96,138,363,368,369,371,372,373,374,375,376,387,388,389,390,391,393,394,428,429,489],[96,138,357],[96,138,153,164,201,241,243,244,265,288,309,326,336,347,348,402,424,433,434,435,437,489],[96,138,428],[96,137,138,217,309,336,360,424,426,427,434],[96,138,363],[96,137,138,241,278,312,353,354,355,356,357,358,359,361,362,428,429],[96,138,153,278,279,353,434,435],[96,138,217,326,336,349,424,428,434],[96,138,153,433,435],[96,138,153,170,431,434,435],[96,138,153,164,181,194,204,210,219,242,243,244,246,275,280,285,288,309,311,312,314,317,319,322,323,324,325,347,349,423,424,429,431,433,434,435],[96,138,153,170],[96,138,200,201,202,215,431,432,437,439,489],[96,138,198,433],[96,138,274],[96,138,153,170,181,236,259,261,262,263,264,265,272,273,489],[96,138,164,181,194,210,236,251,284,285,286,287,312,317,326,332,335,337,347,349,424,429,431],[96,138,210,214,215,233,336,424,433],[96,138,153,181,201,204,312,330,431,433],[96,138,351],[96,138,153,265,273,274,333,334,344],[96,138,431,433],[96,138,358,360],[96,138,309,312,423,439],[96,138,153,164,247,251,287,317,332,335,339,431],[96,138,153,214,233,251,340],[96,138,200,246,342,423,433],[96,138,153,181,265,433],[96,138,153,219,245,246,247,256,274,341,343,423,433],[90,96,138,243,309,346,437,439],[96,138,153,164,181,204,214,221,233,242,244,280,284,285,286,287,288,312,314,326,327,329,331,347,349,423,424,429,430,431,439],[96,138,153,170,214,332,338,344,431],[96,138,224,225,226,227,228,229,230,231,232],[96,138,275,318],[96,138,320],[96,138,318],[96,138,320,321],[96,138,153,204,207,211,241,434],[96,138,153,164,199,201,242,243,288,308,309,310,347,431,435,437,439],[96,138,153,164,181,203,211,310,312,358,424,430,434],[96,138,353],[96,138,354],[96,138,209,210,402],[96,138,355],[96,138,235,239],[96,138,153,204,235,242],[96,138,238,239],[96,138,240],[96,138,235,236],[96,138,235,289],[96,138,235],[96,138,275,316,430],[96,138,315],[96,138,236,429,430],[96,138,313,430],[96,138,236,429],[96,138,402],[96,138,204,209,212,237,242,309,312,346,349,352,358,365,366,396,398,401,423,431,434],[96,138,297,300,301,302,303,304],[84,96,138,191,192,193,270,397],[84,96,138,191,192,193,270,397,400],[96,138,411],[96,138,217,279,309,346,349,363,371,375,404,405,406,407,409,410,413,423,428,433],[96,138,303],[96,138,308],[96,138,153,242,290,305,307,311,346,431,437,439],[96,138,297,298,299,300,301,302,303,304,438],[90,96,138,153,164,181,235,236,244,288,309,312,344,345,347,423,424,433,434,437],[96,138,279,281,284,424],[96,138,153,275,433],[96,138,278,363],[96,138,277],[96,138,279,280],[96,138,276,278,433],[96,138,153,203,279,281,282,283,433,434],[84,96,138,209,429],[96,138,196,197],[84,96,138,201],[84,96,138,429],[84,90,96,138,288,309,437,439],[96,138,201,459,460],[84,96,138,296],[84,96,138,164,181,199,258,291,293,295,439],[96,138,219,429,434],[96,138,328,429],[96,138,209],[84,96,138,151,153,164,198,199,253,296,437,438],[84,96,138,189,190,437,484,1979],[84,85,86,87,88,96,138],[96,138,143],[96,138,248,249,250],[96,138,248],[84,88,96,138,153,155,164,188,189,190,191,193,194,199,244,339,383,435,436,439,484,1979],[96,138,447],[96,138,449],[96,138,451],[96,138,1795],[96,138,1802],[96,138,453],[96,138,455,456,457],[96,138,461],[89,96,138,441,446,448,450,452,454,458,462,464,475,476,478,487,488,489,490],[96,138,463],[96,138,474],[96,138,293],[96,138,477],[96,137,138,279,281,282,284,479,480,481,484,485,486],[96,138,1466],[96,138,713],[96,138,139,151,170,711,712],[96,138,715],[96,138,714],[96,138,725],[96,138,726],[96,138,1455,1456,1457],[96,138,1454,1458],[96,138,1458],[96,138,1397,1401,1667],[96,138,1397,1401],[96,138,1397,1678,1691],[96,138,1397,1400,1401],[96,138,1396],[96,138,1397],[96,138,1396,1397,1401],[96,138,1397,1399,1400],[96,138,1397,1399,1401],[96,138,1338,1341,1342,1345,1346,1347,1348,1349,1350,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1367,1368,1369,1370,1371,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381],[96,138,1445],[84,96,138,1404,1413,1442,1444],[96,138,1442,1443],[96,138,1404,1408,1413,1414,1442],[96,138,1766],[96,138,1764,1765],[96,138,1764],[96,138,1404,1442,1448,1449,1461,1462],[96,138,1404,1442,1448,1449,1461,1462,1463,1464,1465,1470,1472],[96,138,1461],[96,138,1448,1449,1461,1462,1464],[84,96,138,270,1413,1446,1473,1662],[96,138,1452],[96,138,1450],[96,138,1450,1451],[84,96,138,1285,1286,1287,1288],[96,138,1285],[84,96,138,1289],[96,138,1289],[96,138,1410],[96,105,109,138,181],[96,105,138,170,181],[96,100,138],[96,102,105,138,178,181],[96,138,158,178],[96,100,138,188],[96,102,105,138,158,181],[96,97,98,101,104,138,150,170,181],[96,105,112,138],[96,97,103,138],[96,105,126,127,138],[96,101,105,138,173,181,188],[96,126,138,188],[96,99,100,138,188],[96,105,138],[96,99,100,101,102,103,104,105,106,107,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,127,128,129,130,131,132,138],[96,105,120,138],[96,105,112,113,138],[96,103,105,113,114,138],[96,104,138],[96,97,100,105,138],[96,105,109,113,114,138],[96,109,138],[96,103,105,108,138,181],[96,97,102,105,112,138],[96,100,105,126,138,186,188],[96,138,1408,1412],[96,138,1403,1408,1409,1411,1413],[96,138,1933,1934],[84,96,138,1933],[96,138,1405],[96,138,1406,1407],[96,138,1403,1406,1408],[96,138,821],[96,138,812,813],[96,138,810,811,812,814,815,820],[96,138,811,812],[96,138,820],[96,138,812],[96,138,810,811,812,815,816,817,818,819],[96,138,810,811,822],[96,138,798],[96,138,798,801],[96,138,791,798,799,800,801,802,803,804,805],[96,138,806],[96,138,798,799],[96,138,798,800],[96,138,744,746,747,748,749],[96,138,744,746,748,749],[96,138,744,746,748],[96,138,744,746,747,749],[96,138,744,746,749],[96,138,744,745,746,747,748,749,750,751,791,792,793,794,795,796,797],[96,138,746,749],[96,138,743,744,745,747,748,749],[96,138,746,792,796],[96,138,746,747,748,749],[96,138,807],[96,138,748],[96,138,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790],[96,138,270,495,717],[96,138,270,717],[96,138,270,717,1787],[96,138,270,826,1280]],\"fileInfos\":[{\"version\":\"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4\",\"impliedFormat\":1},{\"version\":\"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75\",\"impliedFormat\":1},{\"version\":\"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962\",\"impliedFormat\":1},{\"version\":\"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8\",\"impliedFormat\":1},{\"version\":\"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7\",\"impliedFormat\":1},{\"version\":\"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4\",\"impliedFormat\":1},{\"version\":\"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569\",\"impliedFormat\":1},{\"version\":\"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2\",\"impliedFormat\":1},{\"version\":\"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10\",\"impliedFormat\":1},{\"version\":\"8fd575e12870e9944c7e1d62e1f5a73fcf23dd8d3a321f2a2c74c20d022283fe\",\"impliedFormat\":1},{\"version\":\"8bf8b5e44e3c9c36f98e1007e8b7018c0f38d8adc07aecef42f5200114547c70\",\"impliedFormat\":1},{\"version\":\"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"07f073f19d67f74d732b1adea08e1dc66b1b58d77cb5b43931dee3d798a2fd53\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"b5ce7a470bc3628408429040c4e3a53a27755022a32fd05e2cb694e7015386c7\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"df83c2a6c73228b625b0beb6669c7ee2a09c914637e2d35170723ad49c0f5cd4\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"87dc0f382502f5bbce5129bdc0aea21e19a3abbc19259e0b43ae038a9fc4e326\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"b1cb28af0c891c8c96b2d6b7be76bd394fddcfdb4709a20ba05a7c1605eea0f9\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"2fef54945a13095fdb9b84f705f2b5994597640c46afeb2ce78352fab4cb3279\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"ac77cb3e8c6d3565793eb90a8373ee8033146315a3dbead3bde8db5eaf5e5ec6\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"56e4ed5aab5f5920980066a9409bfaf53e6d21d3f8d020c17e4de584d29600ad\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"4ece9f17b3866cc077099c73f4983bddbcb1dc7ddb943227f1ec070f529dedd1\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"0a6282c8827e4b9a95f4bf4f5c205673ada31b982f50572d27103df8ceb8013c\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"1c9319a09485199c1f7b0498f2988d6d2249793ef67edda49d1e584746be9032\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"e3a2a0cee0f03ffdde24d89660eba2685bfbdeae955a6c67e8c4c9fd28928eeb\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"60037901da1a425516449b9a20073aa03386cce92f7a1fd902d7602be3a7c2e9\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"22adec94ef7047a6c9d1af3cb96be87a335908bf9ef386ae9fd50eeb37f44c47\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"4245fee526a7d1754529d19227ecbf3be066ff79ebb6a380d78e41648f2f224d\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"36a2e4c9a67439aca5f91bb304611d5ae6e20d420503e96c230cf8fcdc948d94\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9\",\"impliedFormat\":1},{\"version\":\"65ff5a0aefd7817a03c1ad04fee85c9cdd3ec415cc3c9efec85d8008d4d5e4ee\",\"impliedFormat\":1},{\"version\":\"b89c2ddec6bd955e8721d41e24ca667de06882338d88b183c2cdc1f41f4c5a34\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"acd8fd5090ac73902278889c38336ff3f48af6ba03aa665eb34a75e7ba1dccc4\",\"impliedFormat\":1},{\"version\":\"d6258883868fb2680d2ca96bc8b1352cab69874581493e6d52680c5ffecdb6cc\",\"impliedFormat\":1},{\"version\":\"1b61d259de5350f8b1e5db06290d31eaebebc6baafd5f79d314b5af9256d7153\",\"impliedFormat\":1},{\"version\":\"f258e3960f324a956fc76a3d3d9e964fff2244ff5859dcc6ce5951e5413ca826\",\"impliedFormat\":1},{\"version\":\"643f7232d07bf75e15bd8f658f664d6183a0efaca5eb84b48201c7671a266979\",\"impliedFormat\":1},{\"version\":\"21da358700a3893281ce0c517a7a30cbd46be020d9f0c3f2834d0a8ad1f5fc75\",\"impliedFormat\":1},{\"version\":\"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"030e350db2525514580ed054f712ffb22d273e6bc7eddc1bb7eda1e0ba5d395e\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a\",\"impliedFormat\":1},{\"version\":\"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"8fa51737611c21ba3a5ac02c4e1535741d58bec67c9bdf94b1837a31c97a2263\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f\",\"impliedFormat\":1},{\"version\":\"24bd580b5743dc56402c440dc7f9a4f5d592ad7a419f25414d37a7bfe11e342b\",\"impliedFormat\":1},{\"version\":\"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc\",\"impliedFormat\":1},{\"version\":\"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8\",\"impliedFormat\":1},{\"version\":\"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21\",\"impliedFormat\":1},{\"version\":\"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195\",\"impliedFormat\":1},{\"version\":\"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75\",\"impliedFormat\":1},{\"version\":\"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43\",\"impliedFormat\":1},{\"version\":\"6bdc71028db658243775263e93a7db2fd2abfce3ca569c3cca5aee6ed5eb186d\",\"impliedFormat\":1},{\"version\":\"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd\",\"impliedFormat\":1},{\"version\":\"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20\",\"impliedFormat\":1},{\"version\":\"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219\",\"impliedFormat\":1},{\"version\":\"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7\",\"impliedFormat\":1},{\"version\":\"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb\",\"impliedFormat\":1},{\"version\":\"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882\",\"impliedFormat\":1},{\"version\":\"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd\",\"impliedFormat\":1},{\"version\":\"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e\",\"impliedFormat\":1},{\"version\":\"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9\",\"impliedFormat\":1},{\"version\":\"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a\",\"impliedFormat\":1},{\"version\":\"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da\",\"impliedFormat\":1},{\"version\":\"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2\",\"impliedFormat\":1},{\"version\":\"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43\",\"impliedFormat\":1},{\"version\":\"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9\",\"impliedFormat\":1},{\"version\":\"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17\",\"impliedFormat\":1},{\"version\":\"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e\",\"impliedFormat\":1},{\"version\":\"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6\",\"impliedFormat\":1},{\"version\":\"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8\",\"impliedFormat\":1},{\"version\":\"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a\",\"impliedFormat\":1},{\"version\":\"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2\",\"impliedFormat\":1},{\"version\":\"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f\",\"impliedFormat\":1},{\"version\":\"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656\",\"impliedFormat\":1},{\"version\":\"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88\",\"impliedFormat\":1},{\"version\":\"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00\",\"impliedFormat\":1},{\"version\":\"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f\",\"impliedFormat\":1},{\"version\":\"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6\",\"impliedFormat\":1},{\"version\":\"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605\",\"impliedFormat\":1},{\"version\":\"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107\",\"impliedFormat\":1},{\"version\":\"d2bc987ae352271d0d615a420dcf98cc886aa16b87fb2b569358c1fe0ca0773d\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"4f0539c58717cbc8b73acb29f9e992ab5ff20adba5f9b57130691c7f9b186a4d\",\"impliedFormat\":1},{\"version\":\"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419\",\"impliedFormat\":1},{\"version\":\"76103716ba397bbb61f9fa9c9090dca59f39f9047cb1352b2179c5d8e7f4e8d0\",\"impliedFormat\":1},{\"version\":\"f9677e434b7a3b14f0a9367f9dfa1227dfe3ee661792d0085523c3191ae6a1a4\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"4314c7a11517e221f7296b46547dbc4df047115b182f544d072bdccffa57fc72\",\"impliedFormat\":1},{\"version\":\"115971d64632ea4742b5b115fb64ed04bcaae2c3c342f13d9ba7e3f9ee39c4e7\",\"impliedFormat\":1},{\"version\":\"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a\",\"impliedFormat\":1},{\"version\":\"9057f224b79846e3a95baf6dad2c8103278de2b0c5eebda23fc8188171ad2398\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"19d5f8d3930e9f99aa2c36258bf95abbe5adf7e889e6181872d1cdba7c9a7dd5\",\"impliedFormat\":1},{\"version\":\"e6f5a38687bebe43a4cef426b69d34373ef68be9a6b1538ec0a371e69f309354\",\"impliedFormat\":1},{\"version\":\"a6bf63d17324010ca1fbf0389cab83f93389bb0b9a01dc8a346d092f65b3605f\",\"impliedFormat\":1},{\"version\":\"e009777bef4b023a999b2e5b9a136ff2cde37dc3f77c744a02840f05b18be8ff\",\"impliedFormat\":1},{\"version\":\"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393\",\"impliedFormat\":1},{\"version\":\"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"88bc59b32d0d5b4e5d9632ac38edea23454057e643684c3c0b94511296f2998c\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"1ff5a53a58e756d2661b73ba60ffe274231a4432d21f7a2d0d9e4f6aa99f4283\",\"impliedFormat\":1},{\"version\":\"1e289f30a48126935a5d408a91129a13a59c9b0f8c007a816f9f16ef821e144e\",\"impliedFormat\":1},{\"version\":\"2ea254f944dfe131df1264d1fb96e4b1f7d110195b21f1f5dbb68fdd394e5518\",\"impliedFormat\":1},{\"version\":\"5135bdd72cc05a8192bd2e92f0914d7fc43ee077d1293dc622a049b7035a0afb\",\"impliedFormat\":1},{\"version\":\"4f80de3a11c0d2f1329a72e92c7416b2f7eab14f67e92cac63bb4e8d01c6edc8\",\"impliedFormat\":1},{\"version\":\"6d386bc0d7f3afa1d401afc3e00ed6b09205a354a9795196caed937494a713e6\",\"impliedFormat\":1},{\"version\":\"f579f267a2f4c2278cca2ec84613e95059368b503ce96586972d304e5e40125b\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"23459c1915878a7c1e86e8bdb9c187cddd3aea105b8b1dfce512f093c969bc7e\",\"impliedFormat\":1},{\"version\":\"b1b6ee0d012aeebe11d776a155d8979730440082797695fc8e2a5c326285678f\",\"impliedFormat\":1},{\"version\":\"45875bcae57270aeb3ebc73a5e3fb4c7b9d91d6b045f107c1d8513c28ece71c0\",\"impliedFormat\":1},{\"version\":\"1dc73f8854e5c4506131c4d95b3a6c24d0c80336d3758e95110f4c7b5cb16397\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"5f6f1d54779d0b9ed152b0516b0958cd34889764c1190434bbf18e7a8bb884cd\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c\",\"impliedFormat\":1},{\"version\":\"c6b4e0a02545304935ecbf7de7a8e056a31bb50939b5b321c9d50a405b5a0bba\",\"impliedFormat\":1},{\"version\":\"fab29e6d649aa074a6b91e3bdf2bff484934a46067f6ee97a30fcd9762ae2213\",\"impliedFormat\":1},{\"version\":\"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2\",\"impliedFormat\":1},{\"version\":\"e1120271ebbc9952fdc7b2dd3e145560e52e06956345e6fdf91d70ca4886464f\",\"impliedFormat\":1},{\"version\":\"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466\",\"impliedFormat\":1},{\"version\":\"f7b1df115dbd1b8522cba4f404a9f4fdcd5169e2137129187ffeee9d287e4fd1\",\"impliedFormat\":1},{\"version\":\"c878f74b6d10b267f6075c51ac1d8becd15b4aa6a58f79c0cfe3b24908357f60\",\"impliedFormat\":1},{\"version\":\"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972\",\"impliedFormat\":1},{\"version\":\"93452d394fdd1dc551ec62f5042366f011a00d342d36d50793b3529bfc9bd633\",\"impliedFormat\":1},{\"version\":\"fbf68fc8057932b1c30107ebc37420f8d8dc4bef1253c4c2f9e141886c0df5ab\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"2754d8221d77c7b382096651925eb476f1066b3348da4b73fe71ced7801edada\",\"impliedFormat\":1},{\"version\":\"993985beef40c7d113f6dd8f0ba26eed63028b691fbfeb6a5b63f26408dd2c6d\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"bef91efa0baea5d0e0f0f27b574a8bc100ce62a6d7e70220a0d58af6acab5e89\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"282fd2a1268a25345b830497b4b7bf5037a5e04f6a9c44c840cb605e19fea841\",\"impliedFormat\":1},{\"version\":\"5360a27d3ebca11b224d7d3e38e3e2c63f8290cb1fcf6c3610401898f8e68bc3\",\"impliedFormat\":1},{\"version\":\"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60\",\"impliedFormat\":1},{\"version\":\"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4\",\"impliedFormat\":1},{\"version\":\"7d6ff413e198d25639f9f01f16673e7df4e4bd2875a42455afd4ecc02ef156da\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"cb094bb347d7df3380299eb69836c2c8758626ecf45917577707c03cf816b6f4\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"f689c4237b70ae6be5f0e4180e8833f34ace40529d1acc0676ab8fb8f70457d7\",\"impliedFormat\":1},{\"version\":\"b02784111b3fc9c38590cd4339ff8718f9329a6f4d3fd66e9744a1dcd1d7e191\",\"impliedFormat\":1},{\"version\":\"ac5ed35e649cdd8143131964336ab9076937fa91802ec760b3ea63b59175c10a\",\"impliedFormat\":1},{\"version\":\"52a8e7e8a1454b6d1b5ad428efae3870ffc56f2c02d923467f2940c454aa9aec\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"78dc0513cc4f1642906b74dda42146bcbd9df7401717d6e89ea6d72d12ecb539\",\"impliedFormat\":1},{\"version\":\"ad90122e1cb599b3bc06a11710eb5489101be678f2920f2322b0ac3e195af78d\",\"impliedFormat\":1},{\"version\":\"3609e455ffcba8176c8ce0aa57f8258fe10cf03987e27f1fab68f702b4426521\",\"impliedFormat\":1},{\"version\":\"d1bd4e51810d159899aad1660ccb859da54e27e08b8c9862b40cd36c1d9ff00f\",\"impliedFormat\":1},{\"version\":\"17ed71200119e86ccef2d96b73b02ce8854b76ad6bd21b5021d4269bec527b5f\",\"impliedFormat\":1},{\"version\":\"5dbf2a502a7fcd85bfe753b585cfc6c9f60294570ee6a18084e574cf93be3fa0\",\"impliedFormat\":1},{\"version\":\"bb7a61dd55dc4b9422d13da3a6bb9cc5e89be888ef23bbcf6558aa9726b89a1c\",\"impliedFormat\":1},{\"version\":\"413df52d4ea14472c2fa5bee62f7a40abd1eb49be0b9722ee01ee4e52e63beb2\",\"impliedFormat\":1},{\"version\":\"db6d2d9daad8a6d83f281af12ce4355a20b9a3e71b82b9f57cddcca0a8964a96\",\"impliedFormat\":1},{\"version\":\"446a50749b24d14deac6f8843e057a6355dd6437d1fac4f9e5ce4a5071f34bff\",\"impliedFormat\":1},{\"version\":\"182e9fcbe08ac7c012e0a6e2b5798b4352470be29a64fdc114d23c2bab7d5106\",\"impliedFormat\":1},{\"version\":\"14109b34dc927e3b872c0f954a8d2536c245e38062bc47e8f97ba27f922fc9bd\",\"impliedFormat\":1},{\"version\":\"1214c8bb321e2376f9dfc174a97b06c6e7bef05a61a1c50f094617d99fc4c9dd\",\"impliedFormat\":1},{\"version\":\"96ffa70b486207241c0fcedb5d9553684f7fa6746bc2b04c519e7ebf41a51205\",\"impliedFormat\":1},{\"version\":\"5c24c66b3ba29ce9f2a79c719967e6e944131352a117a0bc43fa5b346b5562b3\",\"impliedFormat\":1},{\"version\":\"a86f82d646a739041d6702101afa82dcb935c416dd93cbca7fd754fd0282ce1f\",\"impliedFormat\":1},{\"version\":\"ad0d1d75d129b1c80f911be438d6b61bfa8703930a8ff2be2f0e1f8a91841c64\",\"impliedFormat\":1},{\"version\":\"ce75b1aebb33d510ff28af960a9221410a3eaf7f18fc5f21f9404075fba77256\",\"impliedFormat\":1},{\"version\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\"impliedFormat\":1},{\"version\":\"496bbf339f3838c41f164238543e9fe5f1f10659cb30b68903851618464b98ba\",\"impliedFormat\":1},{\"version\":\"099f915371bf0f8fd812d48a088531397f9edaf2ebfefe422cbe774c274a1621\",\"impliedFormat\":1},{\"version\":\"78a2869ad0cbf3f9045dda08c0d4562b7e1b2bfe07b19e0db072f5c3c56e9584\",\"impliedFormat\":1},{\"version\":\"42277254e219cd5b047373e39d48248cd228d84b200b08e4d4d0949d6a48ef86\",\"impliedFormat\":1},{\"version\":\"b06d68a692d3c1dd12bed02eaa3b4c06cfc2a3e9560b0cecd2014bba480c4e8e\",\"impliedFormat\":1},{\"version\":\"f0a1bd6ad77f98dd7ed0d3207fcbcb5dd109ba144799cf41b8ea4dacb4e3e009\",\"impliedFormat\":1},{\"version\":\"9e2739b32f741859263fdba0244c194ca8e96da49b430377930b8f721d77c000\",\"impliedFormat\":1},{\"version\":\"fb1d8e814a3eeb5101ca13515e0548e112bd1ff3fb358ece535b93e94adf5a3a\",\"impliedFormat\":1},{\"version\":\"ffa495b17a5ef1d0399586b590bd281056cee6ce3583e34f39926f8dcc6ecdb5\",\"impliedFormat\":1},{\"version\":\"f8d5ff8eafd37499f2b6a98659dd9b45a321de186b8db6b6142faed0fea3de77\",\"impliedFormat\":1},{\"version\":\"c86fe861cf1b4c46a0fb7d74dffe596cf679a2e5e8b1456881313170f092e3fa\",\"impliedFormat\":1},{\"version\":\"c685d9f68c70fe11ce527287526585a06ea13920bb6c18482ca84945a4e433a7\",\"impliedFormat\":1},{\"version\":\"540cc83ab772a2c6bc509fe1354f314825b5dba3669efdfbe4693ecd3048e34f\",\"impliedFormat\":1},{\"version\":\"121b0696021ab885c570bbeb331be8ad82c6efe2f3b93a6e63874901bebc13e3\",\"impliedFormat\":1},{\"version\":\"4e01846df98d478a2a626ec3641524964b38acaac13945c2db198bf9f3df22ee\",\"impliedFormat\":1},{\"version\":\"678d6d4c43e5728bf66e92fc2269da9fa709cb60510fed988a27161473c3853f\",\"impliedFormat\":1},{\"version\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\"impliedFormat\":1},{\"version\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\"impliedFormat\":1},{\"version\":\"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881\",\"impliedFormat\":1},{\"version\":\"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881\",\"impliedFormat\":1},{\"version\":\"aa14cee20aa0db79f8df101fc027d929aec10feb5b8a8da3b9af3895d05b7ba2\",\"impliedFormat\":1},{\"version\":\"493c700ac3bd317177b2eb913805c87fe60d4e8af4fb39c41f04ba81fae7e170\",\"impliedFormat\":1},{\"version\":\"aeb554d876c6b8c818da2e118d8b11e1e559adbe6bf606cc9a611c1b6c09f670\",\"impliedFormat\":1},{\"version\":\"acf5a2ac47b59ca07afa9abbd2b31d001bf7448b041927befae2ea5b1951d9f9\",\"impliedFormat\":1},{\"version\":\"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881\",\"impliedFormat\":1},{\"version\":\"d71291eff1e19d8762a908ba947e891af44749f3a2cbc5bd2ec4b72f72ea795f\",\"impliedFormat\":1},{\"version\":\"c0480e03db4b816dff2682b347c95f2177699525c54e7e6f6aa8ded890b76be7\",\"impliedFormat\":1},{\"version\":\"892258709c8fc69cc1711d3554503f35101381df7e33eec344356bdc443ba07b\",\"impliedFormat\":1},{\"version\":\"b620391fe8060cf9bedc176a4d01366e6574d7a71e0ac0ab344a4e76576fcbb8\",\"impliedFormat\":1},{\"version\":\"3e7efde639c6a6c3edb9847b3f61e308bf7a69685b92f665048c45132f51c218\",\"impliedFormat\":1},{\"version\":\"df45ca1176e6ac211eae7ddf51336dc075c5314bc5c253651bae639defd5eec5\",\"impliedFormat\":1},{\"version\":\"106c6025f1d99fd468fd8bf6e5bda724e11e5905a4076c5d29790b6c3745e50c\",\"impliedFormat\":1},{\"version\":\"ee8df1cb8d0faaca4013a1b442e99130769ce06f438d18d510fed95890067563\",\"impliedFormat\":1},{\"version\":\"bfb7f8475428637bee12bdd31bd9968c1c8a1cc2c3e426c959e2f3a307f8936f\",\"impliedFormat\":1},{\"version\":\"6f491d0108927478d3247bbbc489c78c2da7ef552fd5277f1ab6819986fdf0b1\",\"impliedFormat\":1},{\"version\":\"0d8f2b8781c721170b87a6b662b3cb038fd1a721165ecca390352c818d425872\",\"impliedFormat\":1},{\"version\":\"15a234e5031b19c48a69ccc1607522d6e4b50f57d308ecb7fe863d44cd9f9eb3\",\"impliedFormat\":1},{\"version\":\"380647d8f3b7f852cca6d154a376dbf8ac620a2f12b936594504a8a852e71d2f\",\"impliedFormat\":1},{\"version\":\"148679c6d0f449210a96e7d2e562d589e56fcde87f843a92808b3ff103f1a774\",\"impliedFormat\":1},{\"version\":\"6459054aabb306821a043e02b89d54da508e3a6966601a41e71c166e4ea1474f\",\"impliedFormat\":1},{\"version\":\"2f9c89cbb29d362290531b48880a4024f258c6033aaeb7e59fbc62db26819650\",\"impliedFormat\":1},{\"version\":\"bb37588926aba35c9283fe8d46ebf4e79ffe976343105f5c6d45f282793352b2\",\"impliedFormat\":1},{\"version\":\"05c97cddbaf99978f83d96de2d8af86aded9332592f08ce4a284d72d0952c391\",\"impliedFormat\":1},{\"version\":\"72179f9dd22a86deaad4cc3490eb0fe69ee084d503b686985965654013f1391b\",\"impliedFormat\":1},{\"version\":\"2e6114a7dd6feeef85b2c80120fdbfb59a5529c0dcc5bfa8447b6996c97a69f5\",\"impliedFormat\":1},{\"version\":\"7b6ff760c8a240b40dab6e4419b989f06a5b782f4710d2967e67c695ef3e93c4\",\"impliedFormat\":1},{\"version\":\"c8f004e6036aa1c764ad4ec543cf89a5c1893a9535c80ef3f2b653e370de45e6\",\"impliedFormat\":1},{\"version\":\"dd80b1e600d00f5c6a6ba23f455b84a7db121219e68f89f10552c54ba46e4dc9\",\"impliedFormat\":1},{\"version\":\"b064c36f35de7387d71c599bfcf28875849a1dbc733e82bd26cae3d1cd060521\",\"impliedFormat\":1},{\"version\":\"05c7280d72f3ed26f346cbe7cbbbb002fb7f15739197cbbee6ab3fd1a6cb9347\",\"impliedFormat\":1},{\"version\":\"8de9fe97fa9e00ec00666fa77ab6e91b35d25af8ca75dabcb01e14ad3299b150\",\"impliedFormat\":1},{\"version\":\"803cd2aaf1921c218916c2c7ee3fce653e852d767177eb51047ff15b5b253893\",\"impliedFormat\":1},{\"version\":\"dba114fb6a32b355a9cfc26ca2276834d72fe0e94cd2c3494005547025015369\",\"impliedFormat\":1},{\"version\":\"7ab12b2f1249187223d11a589f5789c75177a0b597b9eb7f8e2e42d045393347\",\"impliedFormat\":1},{\"version\":\"b4d871fb9b74fb5f9d4a4d54f5e01254282b2250bb0e8152bbd51aac2e67d9f7\",\"impliedFormat\":1},{\"version\":\"93436bd74c66baba229bfefe1314d122c01f0d4c1d9e35081a0c4f0470ac1a6c\",\"impliedFormat\":1},{\"version\":\"f974e4a06953682a2c15d5bd5114c0284d5abf8bc0fe4da25cb9159427b70072\",\"impliedFormat\":1},{\"version\":\"50256e9c31318487f3752b7ac12ff365c8949953e04568009c8705db802776fb\",\"impliedFormat\":1},{\"version\":\"7d73b24e7bf31dfb8a931ca6c4245f6bb0814dfae17e4b60c9e194a631fe5f7b\",\"impliedFormat\":1},{\"version\":\"d130c5f73768de51402351d5dc7d1b36eaec980ca697846e53156e4ea9911476\",\"impliedFormat\":1},{\"version\":\"413586add0cfe7369b64979d4ec2ed56c3f771c0667fbde1bf1f10063ede0b08\",\"impliedFormat\":1},{\"version\":\"06472528e998d152375ad3bd8ebcb69ff4694fd8d2effaf60a9d9f25a37a097a\",\"impliedFormat\":1},{\"version\":\"50b5bc34ce6b12eccb76214b51aadfa56572aa6cc79c2b9455cdbb3d6c76af1d\",\"impliedFormat\":1},{\"version\":\"b7e16ef7f646a50991119b205794ebfd3a4d8f8e0f314981ebbe991639023d0e\",\"impliedFormat\":1},{\"version\":\"42c169fb8c2d42f4f668c624a9a11e719d5d07dacbebb63cbcf7ef365b0a75b3\",\"impliedFormat\":1},{\"version\":\"a401617604fa1f6ce437b81689563dfdc377069e4c58465dbd8d16069aede0a5\",\"impliedFormat\":1},{\"version\":\"6e9082e91370de5040e415cd9f24e595b490382e8c7402c4e938a8ce4bccc99f\",\"impliedFormat\":1},{\"version\":\"8695dec09ad439b0ceef3776ea68a232e381135b516878f0901ed2ea114fd0fe\",\"impliedFormat\":1},{\"version\":\"5ab8a9b437a9b2d1d3729def9694ba15525fd4028307e803fafc09aa30a8486a\",\"impliedFormat\":1},{\"version\":\"d682336018141807fb602709e2d95a192828fcb8d5ba06dda3833a8ea98f69e3\",\"impliedFormat\":1},{\"version\":\"6124e973eab8c52cabf3c07575204efc1784aca6b0a30c79eb85fe240a857efa\",\"impliedFormat\":1},{\"version\":\"0d891735a21edc75df51f3eb995e18149e119d1ce22fd40db2b260c5960b914e\",\"impliedFormat\":1},{\"version\":\"3b414b99a73171e1c4b7b7714e26b87d6c5cb03d200352da5342ab4088a54c85\",\"impliedFormat\":1},{\"version\":\"4fbd3116e00ed3a6410499924b6403cc9367fdca303e34838129b328058ede40\",\"impliedFormat\":1},{\"version\":\"b01bd582a6e41457bc56e6f0f9de4cb17f33f5f3843a7cf8210ac9c18472fb0f\",\"impliedFormat\":1},{\"version\":\"0a437ae178f999b46b6153d79095b60c42c996bc0458c04955f1c996dc68b971\",\"impliedFormat\":1},{\"version\":\"74b2a5e5197bd0f2e0077a1ea7c07455bbea67b87b0869d9786d55104006784f\",\"impliedFormat\":1},{\"version\":\"4a7baeb6325920044f66c0f8e5e6f1f52e06e6d87588d837bdf44feb6f35c664\",\"impliedFormat\":1},{\"version\":\"12d218a49dbe5655b911e6cc3c13b2c655e4c783471c3b0432137769c79e1b3c\",\"impliedFormat\":1},{\"version\":\"7274fbffbd7c9589d8d0ffba68157237afd5cecff1e99881ea3399127e60572f\",\"impliedFormat\":1},{\"version\":\"6b0fc04121360f752d196ba35b6567192f422d04a97b2840d7d85f8b79921c92\",\"impliedFormat\":1},{\"version\":\"1a82deef4c1d39f6882f28d275cad4c01f907b9b39be9cbc472fcf2cf051e05b\",\"impliedFormat\":1},{\"version\":\"c5426dbfc1cf90532f66965a7aa8c1136a78d4d0f96d8180ecbfc11d7722f1a5\",\"impliedFormat\":1},{\"version\":\"65a15fc47900787c0bd18b603afb98d33ede930bed1798fc984d5ebb78b26cf9\",\"impliedFormat\":1},{\"version\":\"9d202701f6e0744adb6314d03d2eb8fc994798fc83d91b691b75b07626a69801\",\"impliedFormat\":1},{\"version\":\"de9d2df7663e64e3a91bf495f315a7577e23ba088f2949d5ce9ec96f44fba37d\",\"impliedFormat\":1},{\"version\":\"c7af78a2ea7cb1cd009cfb5bdb48cd0b03dad3b54f6da7aab615c2e9e9d570c5\",\"impliedFormat\":1},{\"version\":\"1ee45496b5f8bdee6f7abc233355898e5bf9bd51255db65f5ff7ede617ca0027\",\"impliedFormat\":1},{\"version\":\"42189cd810c0bf1247da0742d5744bb7c1486de6fd62269d5c25833b7ec38732\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"3fbdd025f9d4d820414417eeb4107ffa0078d454a033b506e22d3a23bc3d9c41\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"a8f8e6ab2fa07b45251f403548b78eaf2022f3c2254df3dc186cb2671fe4996d\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"fa6c12a7c0f6b84d512f200690bfc74819e99efae69e4c95c4cd30f6884c526e\",\"impliedFormat\":1},{\"version\":\"f1c32f9ce9c497da4dc215c3bc84b722ea02497d35f9134db3bb40a8d918b92b\",\"impliedFormat\":1},{\"version\":\"b73c319af2cc3ef8f6421308a250f328836531ea3761823b4cabbd133047aefa\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"e433b0337b8106909e7953015e8fa3f2d30797cea27141d1c5b135365bb975a6\",\"impliedFormat\":1},{\"version\":\"40436e992021afc07b61da5f488e9671729a3c5b5e6665b99b1fb43a39081ee3\",\"impliedFormat\":1},{\"version\":\"ddff7fc6edbdc5163a09e22bf8df7bef75f75369ebd7ecea95ba55c4386e2441\",\"impliedFormat\":1},{\"version\":\"3a788c7fb7b1b1153d69a4d1d9e1d0dfbcf1127e703bdb02b6d12698e683d1fb\",\"impliedFormat\":1},{\"version\":\"2e4f37ffe8862b14d8e24ae8763daaa8340c0df0b859d9a9733def0eee7562d9\",\"impliedFormat\":1},{\"version\":\"d38530db0601215d6d767f280e3a3c54b2a83b709e8d9001acb6f61c67e965fc\",\"impliedFormat\":1},{\"version\":\"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff\",\"impliedFormat\":1},{\"version\":\"4805f6161c2c8cefb8d3b8bd96a080c0fe8dbc9315f6ad2e53238f9a79e528a6\",\"impliedFormat\":1},{\"version\":\"b83cb14474fa60c5f3ec660146b97d122f0735627f80d82dd03e8caa39b4388c\",\"impliedFormat\":1},{\"version\":\"9c82171d836c47486074e4ca8e059735bf97b205e70b196535b5efd40cbe1bc5\",\"impliedFormat\":1},{\"version\":\"f374cb24e93e7798c4d9e83ff872fa52d2cdb36306392b840a6ddf46cb925cb6\",\"impliedFormat\":1},{\"version\":\"42b81043b00ff27c6bd955aea0f6e741545f2265978bf364b614702b72a027ab\",\"impliedFormat\":1},{\"version\":\"162e071992b34bc36ca257d629547f93cb43728d6fe073ad18a237e4f7c52d7d\",\"impliedFormat\":1},{\"version\":\"b73cbf0a72c8800cf8f96a9acfe94f3ad32ca71342a8908b8ae484d61113f647\",\"impliedFormat\":1},{\"version\":\"bae6dd176832f6423966647382c0d7ba9e63f8c167522f09a982f086cd4e8b23\",\"impliedFormat\":1},{\"version\":\"20865ac316b8893c1a0cc383ccfc1801443fbcc2a7255be166cf90d03fac88c9\",\"impliedFormat\":1},{\"version\":\"c9958eb32126a3843deedda8c22fb97024aa5d6dd588b90af2d7f2bfac540f23\",\"impliedFormat\":1},{\"version\":\"461d0ad8ae5f2ff981778af912ba71b37a8426a33301daa00f21c6ccb27f8156\",\"impliedFormat\":1},{\"version\":\"e927c2c13c4eaf0a7f17e6022eee8519eb29ef42c4c13a31e81a611ab8c95577\",\"impliedFormat\":1},{\"version\":\"fcafff163ca5e66d3b87126e756e1b6dfa8c526aa9cd2a2b0a9da837d81bbd72\",\"impliedFormat\":1},{\"version\":\"70246ad95ad8a22bdfe806cb5d383a26c0c6e58e7207ab9c431f1cb175aca657\",\"impliedFormat\":1},{\"version\":\"f00f3aa5d64ff46e600648b55a79dcd1333458f7a10da2ed594d9f0a44b76d0b\",\"impliedFormat\":1},{\"version\":\"772d8d5eb158b6c92412c03228bd9902ccb1457d7a705b8129814a5d1a6308fc\",\"impliedFormat\":1},{\"version\":\"45490817629431853543adcb91c0673c25af52a456479588b6486daba34f68bb\",\"impliedFormat\":1},{\"version\":\"802e797bcab5663b2c9f63f51bdf67eff7c41bc64c0fd65e6da3e7941359e2f7\",\"impliedFormat\":1},{\"version\":\"8b4327413e5af38cd8cb97c59f48c3c866015d5d642f28518e3a891c469f240e\",\"impliedFormat\":1},{\"version\":\"d76bd0317e0958a220262a40d24f43fd5db2ff6e0ef0b2e14d2acdf7f88a78af\",\"impliedFormat\":1},{\"version\":\"4b20fcf10a5413680e39f5666464859fc56b1003e7dfe2405ced82371ebd49b6\",\"impliedFormat\":1},{\"version\":\"c06ef3b2569b1c1ad99fcd7fe5fba8d466e2619da5375dfa940a94e0feea899b\",\"impliedFormat\":1},{\"version\":\"f7d628893c9fa52ba3ab01bcb5e79191636c4331ee5667ecc6373cbccff8ae12\",\"impliedFormat\":1},{\"version\":\"1d879125d1ec570bf04bc1f362fdbe0cb538315c7ac4bcfcdf0c1e9670846aa6\",\"impliedFormat\":1},{\"version\":\"8c50ee1fcb97de2860d9ebd76561614ab6d365ac8390ef4a02bb4e76929705d1\",\"impliedFormat\":1},{\"version\":\"cff125b5bbb8b819d7835c6b78809416d08da8b00e66611bfe368e0964be7b83\",\"impliedFormat\":1},{\"version\":\"d663134457d8d669ae0df34eabd57028bddc04fc444c4bc04bc5215afc91e1f4\",\"impliedFormat\":1},{\"version\":\"985153f0deb9b4391110331a2f0c114019dbea90cba5ca68a4107700796e0d75\",\"impliedFormat\":1},{\"version\":\"382654d5da3eda8ea18f931d380ab6b099daa4913ae5b64265e6960338572914\",\"impliedFormat\":1},{\"version\":\"43e96a3d5d1411ab40ba2f61d6a3192e58177bcf3b133a80ad2a16591611726d\",\"impliedFormat\":1},{\"version\":\"58659b06d33fa430bee1105b75cf876c0a35b2567207487c8578aec51ca2d977\",\"impliedFormat\":1},{\"version\":\"d8cdd9477b9c5d1a8fbf2fa58e2eb6723969e7201b3549f998e0d2661dfec9d8\",\"impliedFormat\":1},{\"version\":\"cfa846a7b7847a1d973605fbb8c91f47f3a0f0643c18ac05c47077ebc72e71c7\",\"impliedFormat\":1},{\"version\":\"20e1c8beced348a9bf7864dd2b3ca7efa9ea6675dde8ecae6109b1a3f7248cd2\",\"impliedFormat\":1},{\"version\":\"6c800b281b9e89e69165fd11536195488de3ff53004e55905e6c0059a2d8591e\",\"impliedFormat\":1},{\"version\":\"7d4254b4c6c67a29d5e7f65e67d72540480ac2cfb041ca484847f5ae70480b62\",\"impliedFormat\":1},{\"version\":\"19c3d6db2020cee6f9d8d79e13c15e546e05b6db2020a3ee63789ec74a9990b3\",\"impliedFormat\":1},{\"version\":\"41eeb453ccb75c5b2c3abef97adbbd741bd7e9112a2510e12f03f646dc9ad13d\",\"impliedFormat\":1},{\"version\":\"0285dbbb2fdb8c5e9b50b92570c4c039b1eea2da4cfb5a04e77c1ca8b1949771\",\"impliedFormat\":1},{\"version\":\"301cf1d98bce8b1666184888c7aaacd6c9dfed9185510f4317ed623596e38d2c\",\"impliedFormat\":1},{\"version\":\"6c66d5cf284a56109703f941c92b9a22f2472c14645f80a2dbb8e4ef2128d67c\",\"impliedFormat\":1},{\"version\":\"a3e7d932dc9c09daa99141a8e4800fc6c58c625af0d4bbb017773dc36da75426\",\"impliedFormat\":1},{\"version\":\"0b888a0aa10655cadc0dc3b66cd79a99d79ff376aaacc9b628a3c497646fddab\",\"impliedFormat\":1},{\"version\":\"a57b1802794433adec9ff3fed12aa79d671faed86c49b09e02e1ac41b4f1d33a\",\"impliedFormat\":1},{\"version\":\"ad10d4f0517599cdeca7755b930f148804e3e0e5b5a3847adce0f1f71bbccd74\",\"impliedFormat\":1},{\"version\":\"1042064ece5bb47d6aba91648fbe0635c17c600ebdf567588b4ca715602f0a9d\",\"impliedFormat\":1},{\"version\":\"c49469a5349b3cc1965710b5b0f98ed6c028686aa8450bcb3796728873eb923e\",\"impliedFormat\":1},{\"version\":\"4a889f2c763edb4d55cb624257272ac10d04a1cad2ed2948b10ed4a7fda2a428\",\"impliedFormat\":1},{\"version\":\"7bb79aa2fead87d9d56294ef71e056487e848d7b550c9a367523ee5416c44cfa\",\"impliedFormat\":1},{\"version\":\"d88ea80a6447d7391f52352ec97e56b52ebec934a4a4af6e2464cfd8b39c3ba8\",\"impliedFormat\":1},{\"version\":\"d3c8b73132efa48e9399d63e8946a57ed4a7176e2f26d2f144bb14c89fcdefc1\",\"impliedFormat\":1},{\"version\":\"96171c03c2e7f314d66d38acd581f9667439845865b7f85da8df598ff9617476\",\"impliedFormat\":1},{\"version\":\"27ff4196654e6373c9af16b6165120e2dd2169f9ad6abb5c935af5abd8c7938c\",\"impliedFormat\":1},{\"version\":\"8c030e515014c10a2b98f9f48408e3ba18023dfd3f56e3312c6c2f3ae1f55a16\",\"impliedFormat\":1},{\"version\":\"d193c8a86144b3a87b22bc1f5534b9c3e0f5a187873ec337c289a183973a58fe\",\"impliedFormat\":1},{\"version\":\"d2aa1580a899bcec04c29b1c37f2a60f62e2f03acb731534d4e210307c982da8\",\"impliedFormat\":1},{\"version\":\"58d70c38037fc0f949243388ff7ae20cf43321107152f14a9d36ca79311e0ada\",\"impliedFormat\":1},{\"version\":\"f56bdc6884648806d34bc66d31cdb787c4718d04105ce2cd88535db214631f82\",\"impliedFormat\":1},{\"version\":\"68ab1530f0ddf7475425917b0e04068afdc1aee2db033bed9aa9b60a914c512e\",\"impliedFormat\":1},{\"version\":\"01479d9d5a5dda16d529b91811375187f61a06e74be294a35ecce77e0b9e8d6c\",\"impliedFormat\":1},{\"version\":\"49f95e989b4632c6c2a578cc0078ee19a5831832d79cc59abecf5160ea71abad\",\"impliedFormat\":1},{\"version\":\"9666533332f26e8995e4d6fe472bdeec9f15d405693723e6497bf94120c566c8\",\"impliedFormat\":1},{\"version\":\"ce0df82a9ae6f914ba08409d4d883983cc08e6d59eb2df02d8e4d68309e7848b\",\"impliedFormat\":1},{\"version\":\"796273b2edc72e78a04e86d7c58ae94d370ab93a0ddf40b1aa85a37a1c29ecd7\",\"impliedFormat\":1},{\"version\":\"5df15a69187d737d6d8d066e189ae4f97e41f4d53712a46b2710ff9f8563ec9f\",\"impliedFormat\":1},{\"version\":\"1a4dc28334a926d90ba6a2d811ba0ff6c22775fcc13679521f034c124269fd40\",\"impliedFormat\":1},{\"version\":\"f05315ff85714f0b87cc0b54bcd3dde2716e5a6b99aedcc19cad02bf2403e08c\",\"impliedFormat\":1},{\"version\":\"8a8c64dafaba11c806efa56f5c69f611276471bef80a1db1f71316ec4168acef\",\"impliedFormat\":1},{\"version\":\"43ba4f2fa8c698f5c304d21a3ef596741e8e85a810b7c1f9b692653791d8d97a\",\"impliedFormat\":1},{\"version\":\"5fad3b31fc17a5bc58095118a8b160f5260964787c52e7eb51e3d4fcf5d4a6f0\",\"impliedFormat\":1},{\"version\":\"72105519d0390262cf0abe84cf41c926ade0ff475d35eb21307b2f94de985778\",\"impliedFormat\":1},{\"version\":\"d0a4cac61fa080f2be5ebb68b82726be835689b35994ba0e22e3ed4d2bc45e3b\",\"impliedFormat\":1},{\"version\":\"c857e0aae3f5f444abd791ec81206020fbcc1223e187316677e026d1c1d6fe08\",\"impliedFormat\":1},{\"version\":\"ccf6dd45b708fb74ba9ed0f2478d4eb9195c9dfef0ff83a6092fa3cf2ff53b4f\",\"impliedFormat\":1},{\"version\":\"2d7db1d73456e8c5075387d4240c29a2a900847f9c1bff106a2e490da8fbd457\",\"impliedFormat\":1},{\"version\":\"2b15c805f48e4e970f8ec0b1915f22d13ca6212375e8987663e2ef5f0205e832\",\"impliedFormat\":1},{\"version\":\"205a31b31beb7be73b8df18fcc43109cbc31f398950190a0967afc7a12cb478c\",\"impliedFormat\":1},{\"version\":\"8fca3039857709484e5893c05c1f9126ab7451fa6c29e19bb8c2411a2e937345\",\"impliedFormat\":1},{\"version\":\"35069c2c417bd7443ae7c7cafd1de02f665bf015479fec998985ffbbf500628c\",\"impliedFormat\":1},{\"version\":\"dba6c7006e14a98ec82999c6f89fbbbfd1c642f41db148535f3b77b8018829b8\",\"impliedFormat\":1},{\"version\":\"7f897b285f22a57a5c4dc14a27da2747c01084a542b4d90d33897216dceeea2e\",\"impliedFormat\":1},{\"version\":\"7e0b7f91c5ab6e33f511efc640d36e6f933510b11be24f98836a20a2dc914c2d\",\"impliedFormat\":1},{\"version\":\"045b752f44bf9bbdcaffd882424ab0e15cb8d11fa94e1448942e338c8ef19fba\",\"impliedFormat\":1},{\"version\":\"2894c56cad581928bb37607810af011764a2f511f575d28c9f4af0f2ef02d1ab\",\"impliedFormat\":1},{\"version\":\"0a72186f94215d020cb386f7dca81d7495ab6c17066eb07d0f44a5bf33c1b21a\",\"impliedFormat\":1},{\"version\":\"d96b39301d0ded3f1a27b47759676a33a02f6f5049bfcbde81e533fd10f50dcb\",\"impliedFormat\":1},{\"version\":\"2ded4f930d6abfaa0625cf55e58f565b7cbd4ab5b574dd2cb19f0a83a2f0be8b\",\"impliedFormat\":1},{\"version\":\"0aedb02516baf3e66b2c1db9fef50666d6ed257edac0f866ea32f1aa05aa474f\",\"impliedFormat\":1},{\"version\":\"ca0f4d9068d652bad47e326cf6ba424ac71ab866e44b24ddb6c2bd82d129586a\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"04d36005fcbeac741ac50c421181f4e0316d57d148d37cc321a8ea285472462b\",\"impliedFormat\":1},{\"version\":\"56ccb49443bfb72e5952f7012f0de1a8679f9f75fc93a5c1ac0bafb28725fc5f\",\"impliedFormat\":1},{\"version\":\"d90b9f1520366d713a73bd30c5a9eb0040d0fb6076aff370796bc776fd705943\",\"impliedFormat\":1},{\"version\":\"05321b823dd3781d0b6aac8700bfdc0c9181d56479fe52ba6a40c9196fd661a8\",\"impliedFormat\":1},{\"version\":\"f269a1c2a37fdf64fbf3808d72da60acdbd48d2023f5a16ab51b21de39dd318f\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"bef86adb77316505c6b471da1d9b8c9e428867c2566270e8894d4d773a1c4dc2\",\"impliedFormat\":1},{\"version\":\"1b239954e46191b95913d20771cf4283f63c3ebac79d7e30736a8d40b094fdaf\",\"impliedFormat\":1},{\"version\":\"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff\",\"impliedFormat\":1},{\"version\":\"2652448ac55a2010a1f71dd141f828b682298d39728f9871e1cdf8696ef443fd\",\"impliedFormat\":1},{\"version\":\"02c4fc9e6bb27545fa021f6056e88ff5fdf10d9d9f1467f1d10536c6e749ac50\",\"impliedFormat\":1},{\"version\":\"120599fd965257b1f4d0ff794bc696162832d9d8467224f4665f713a3119078b\",\"impliedFormat\":1},{\"version\":\"5433f33b0a20300cca35d2f229a7fc20b0e8477c44be2affeb21cb464af60c76\",\"impliedFormat\":1},{\"version\":\"db036c56f79186da50af66511d37d9fe77fa6793381927292d17f81f787bb195\",\"impliedFormat\":1},{\"version\":\"bd4131091b773973ca5d2326c60b789ab1f5e02d8843b3587effe6e1ea7c9d86\",\"impliedFormat\":1},{\"version\":\"c7f6485931085bf010fbaf46880a9b9ec1a285ad9dc8c695a9e936f5a48f34b4\",\"impliedFormat\":1},{\"version\":\"14f6b927888a1112d662877a5966b05ac1bf7ed25d6c84386db4c23c95a5363b\",\"impliedFormat\":1},{\"version\":\"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff\",\"impliedFormat\":1},{\"version\":\"b5189fd031ef3232ec66817df5a8e7b23b079fdf3cd29a0c100eff1e98b2ce8e\",\"impliedFormat\":1},{\"version\":\"00d3b80428c646edbd62379ea531606ee94eed51c4759cbab5a454e92b379690\",\"impliedFormat\":1},{\"version\":\"49c346823ba6d4b12278c12c977fb3a31c06b9ca719015978cb145eb86da1c61\",\"impliedFormat\":1},{\"version\":\"bfac6e50eaa7e73bb66b7e052c38fdc8ccfc8dbde2777648642af33cf349f7f1\",\"impliedFormat\":1},{\"version\":\"92f7c1a4da7fbfd67a2228d1687d5c2e1faa0ba865a94d3550a3941d7527a45d\",\"impliedFormat\":1},{\"version\":\"f53b120213a9289d9a26f5af90c4c686dd71d91487a0aa5451a38366c70dc64b\",\"impliedFormat\":1},{\"version\":\"83fe880c090afe485a5c02262c0b7cdd76a299a50c48d9bde02be8e908fb4ae6\",\"impliedFormat\":1},{\"version\":\"946a709579b7868a92a70ad70906444f32803fa6e6ce3739b6594c17691837ce\",\"impliedFormat\":1},{\"version\":\"57d67b72e06059adc5e9454de26bbfe567d412b962a501d263c75c2db430f40e\",\"impliedFormat\":1},{\"version\":\"6511e4503cf74c469c60aafd6589e4d14d5eb0a25f9bf043dcbecdf65f261972\",\"impliedFormat\":1},{\"version\":\"5b955caba32e3dc3c3e293e00c104e255f0868848796e5bd5763f990c36d2798\",\"impliedFormat\":1},{\"version\":\"8c70ddc0c22d85e56011d49fddfaae3405eb53d47b59327b9dd589e82df672e7\",\"impliedFormat\":1},{\"version\":\"a67b87d0281c97dfc1197ef28dfe397fc2c865ccd41f7e32b53f647184cc7307\",\"impliedFormat\":1},{\"version\":\"771ffb773f1ddd562492a6b9aaca648192ac3f056f0e1d997678ff97dbb6bf9b\",\"impliedFormat\":1},{\"version\":\"232f70c0cf2b432f3a6e56a8dc3417103eb162292a9fd376d51a3a9ea5fbbf6f\",\"impliedFormat\":1},{\"version\":\"4162ae9d4c1b8a7ab7f9ef287d98e9000b57062db1eb1ae735c4814845c2cb5d\",\"impliedFormat\":1},{\"version\":\"a0ba218ac1baa3da0d5d9c1ec1a7c2f8676c284e6f5b920d6d049b13fa267377\",\"impliedFormat\":1},{\"version\":\"8a0e762ceb20c7e72504feef83d709468a70af4abccb304f32d6b9bac1129b2c\",\"impliedFormat\":1},{\"version\":\"d0af5b1b8d6262ef94fee7f8a39d12db1e21762a048ae33d4a5941a5b9fc2e1d\",\"impliedFormat\":1},{\"version\":\"9252d498a77517aab5d8d4b5eb9d71e4b225bbc7123df9713e08181de63180f6\",\"impliedFormat\":1},{\"version\":\"54d320df89710586fddb799b1b4f5b3364773a510dc5d507f3fbf52d8a734ae4\",\"impliedFormat\":1},{\"version\":\"35e6379c3f7cb27b111ad4c1aa69538fd8e788ab737b8ff7596a1b40e96f4f90\",\"impliedFormat\":1},{\"version\":\"1fffe726740f9787f15b532e1dc870af3cd964dbe29e191e76121aa3dd8693f2\",\"impliedFormat\":1},{\"version\":\"371bf6127c1d427836de95197155132501cb6b69ef8709176ce6e0b85d059264\",\"impliedFormat\":1},{\"version\":\"2bafd700e617d3693d568e972d02b92224b514781f542f70d497a8fdf92d52a2\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"5542d8a7ea13168cb573be0d1ba0d29460d59430fb12bb7bf4674efd5604e14c\",\"impliedFormat\":1},{\"version\":\"af48e58339188d5737b608d41411a9c054685413d8ae88b8c1d0d9bfabdf6e7e\",\"impliedFormat\":1},{\"version\":\"616775f16134fa9d01fc677ad3f76e68c051a056c22ab552c64cc281a9686790\",\"impliedFormat\":1},{\"version\":\"65c24a8baa2cca1de069a0ba9fba82a173690f52d7e2d0f1f7542d59d5eb4db0\",\"impliedFormat\":1},{\"version\":\"f9fe6af238339a0e5f7563acee3178f51db37f32a2e7c09f85273098cee7ec49\",\"impliedFormat\":1},{\"version\":\"1de8c302fd35220d8f29dea378a4ae45199dc8ff83ca9923aca1400f2b28848a\",\"impliedFormat\":1},{\"version\":\"77e71242e71ebf8528c5802993697878f0533db8f2299b4d36aa015bae08a79c\",\"impliedFormat\":1},{\"version\":\"98a787be42bd92f8c2a37d7df5f13e5992da0d967fab794adbb7ee18370f9849\",\"impliedFormat\":1},{\"version\":\"332248ee37cca52903572e66c11bef755ccc6e235835e63d3c3e60ddda3e9b93\",\"impliedFormat\":1},{\"version\":\"94e8cc88ae2ef3d920bb3bdc369f48436db123aa2dc07f683309ad8c9968a1e1\",\"impliedFormat\":1},{\"version\":\"4545c1a1ceca170d5d83452dd7c4994644c35cf676a671412601689d9a62da35\",\"impliedFormat\":1},{\"version\":\"320f4091e33548b554d2214ce5fc31c96631b513dffa806e2e3a60766c8c49d9\",\"impliedFormat\":1},{\"version\":\"a2d648d333cf67b9aeac5d81a1a379d563a8ffa91ddd61c6179f68de724260ff\",\"impliedFormat\":1},{\"version\":\"d90d5f524de38889d1e1dbc2aeef00060d779f8688c02766ddb9ca195e4a713d\",\"impliedFormat\":1},{\"version\":\"a3f41ed1b4f2fc3049394b945a68ae4fdefd49fa1739c32f149d32c0545d67f5\",\"impliedFormat\":1},{\"version\":\"b0309e1eda99a9e76f87c18992d9c3689b0938266242835dd4611f2b69efe456\",\"impliedFormat\":1},{\"version\":\"47699512e6d8bebf7be488182427189f999affe3addc1c87c882d36b7f2d0b0e\",\"impliedFormat\":1},{\"version\":\"6ceb10ca57943be87ff9debe978f4ab73593c0c85ee802c051a93fc96aaf7a20\",\"impliedFormat\":1},{\"version\":\"1de3ffe0cc28a9fe2ac761ece075826836b5a02f340b412510a59ba1d41a505a\",\"impliedFormat\":1},{\"version\":\"e46d6cc08d243d8d0d83986f609d830991f00450fb234f5b2f861648c42dc0d8\",\"impliedFormat\":1},{\"version\":\"1c0a98de1323051010ce5b958ad47bc1c007f7921973123c999300e2b7b0ecc0\",\"impliedFormat\":1},{\"version\":\"ff863d17c6c659440f7c5c536e4db7762d8c2565547b2608f36b798a743606ca\",\"impliedFormat\":1},{\"version\":\"5412ad0043cd60d1f1406fc12cb4fb987e9a734decbdd4db6f6acf71791e36fe\",\"impliedFormat\":1},{\"version\":\"ad036a85efcd9e5b4f7dd5c1a7362c8478f9a3b6c3554654ca24a29aa850a9c5\",\"impliedFormat\":1},{\"version\":\"fedebeae32c5cdd1a85b4e0504a01996e4a8adf3dfa72876920d3dd6e42978e7\",\"impliedFormat\":1},{\"version\":\"b6c1f64158da02580f55e8a2728eda6805f79419aed46a930f43e68ad66a38fc\",\"impliedFormat\":1},{\"version\":\"cdf21eee8007e339b1b9945abf4a7b44930b1d695cc528459e68a3adc39a622e\",\"impliedFormat\":1},{\"version\":\"9f9bb6755a8ce32d656ffa4763a8144aa4f274d6b69b59d7c32811031467216e\",\"impliedFormat\":1},{\"version\":\"bc9ee0192f056b3d5527bcd78dc3f9e527a9ba2bdc0a2c296fbc9027147df4b2\",\"impliedFormat\":1},{\"version\":\"330896c1a2b9693edd617be24fbf9e5895d6e18c7955d6c08f028f272b37314d\",\"impliedFormat\":1},{\"version\":\"1d9c0a9a6df4e8f29dc84c25c5aa0bb1da5456ebede7a03e03df08bb8b27bae6\",\"impliedFormat\":1},{\"version\":\"84380af21da938a567c65ef95aefb5354f676368ee1a1cbb4cae81604a4c7d17\",\"impliedFormat\":1},{\"version\":\"1af3e1f2a5d1332e136f8b0b95c0e6c0a02aaabd5092b36b64f3042a03debf28\",\"impliedFormat\":1},{\"version\":\"30d8da250766efa99490fc02801047c2c6d72dd0da1bba6581c7e80d1d8842a4\",\"impliedFormat\":1},{\"version\":\"03566202f5553bd2d9de22dfab0c61aa163cabb64f0223c08431fb3fc8f70280\",\"impliedFormat\":1},{\"version\":\"4c0a1233155afb94bd4d7518c75c84f98567cd5f13fc215d258de196cdb40d91\",\"impliedFormat\":1},{\"version\":\"f9ceb394e029da0392ebd49564002b01fb4517cef0d14b238f2a8e7362a833e1\",\"impliedFormat\":1},{\"version\":\"1de80059b8078ea5749941c9f863aa970b4735bdbb003be4925c853a8b6b4450\",\"impliedFormat\":1},{\"version\":\"1d079c37fa53e3c21ed3fa214a27507bda9991f2a41458705b19ed8c2b61173d\",\"impliedFormat\":1},{\"version\":\"5bf5c7a44e779790d1eb54c234b668b15e34affa95e78eada73e5757f61ed76a\",\"impliedFormat\":1},{\"version\":\"5835a6e0d7cd2738e56b671af0e561e7c1b4fb77751383672f4b009f4e161d70\",\"impliedFormat\":1},{\"version\":\"5c634644d45a1b6bc7b05e71e05e52ec04f3d73d9ac85d5927f647a5f965181a\",\"impliedFormat\":1},{\"version\":\"4b7f74b772140395e7af67c4841be1ab867c11b3b82a51b1aeb692822b76c872\",\"impliedFormat\":1},{\"version\":\"27be6622e2922a1b412eb057faa854831b95db9db5035c3f6d4b677b902ab3b7\",\"impliedFormat\":1},{\"version\":\"a68d4b3182e8d776cdede7ac9630c209a7bfbb59191f99a52479151816ef9f9e\",\"impliedFormat\":99},{\"version\":\"39644b343e4e3d748344af8182111e3bbc594930fff0170256567e13bbdbebb0\",\"impliedFormat\":99},{\"version\":\"ed7fd5160b47b0de3b1571c5c5578e8e7e3314e33ae0b8ea85a895774ee64749\",\"impliedFormat\":99},{\"version\":\"63a7595a5015e65262557f883463f934904959da563b4f788306f699411e9bac\",\"impliedFormat\":1},{\"version\":\"4ba137d6553965703b6b55fd2000b4e07ba365f8caeb0359162ad7247f9707a6\",\"impliedFormat\":1},{\"version\":\"6de125ea94866c736c6d58d68eb15272cf7d1020a5b459fea1c660027eca9a90\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"8fac4a15690b27612d8474fb2fc7cc00388df52d169791b78d1a3645d60b4c8b\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"064ac1c2ac4b2867c2ceaa74bbdce0cb6a4c16e7c31a6497097159c18f74aa7c\",\"impliedFormat\":1},{\"version\":\"3dc14e1ab45e497e5d5e4295271d54ff689aeae00b4277979fdd10fa563540ae\",\"impliedFormat\":1},{\"version\":\"d3b315763d91265d6b0e7e7fa93cfdb8a80ce7cdd2d9f55ba0f37a22db00bdb8\",\"impliedFormat\":1},{\"version\":\"b789bf89eb19c777ed1e956dbad0925ca795701552d22e68fd130a032008b9f9\",\"impliedFormat\":1},{\"version\":\"51bcd1b0c1b5e8c67c084b40c811414d4b93e9fec77f110c68130f4304ddb3e5\",\"affectsGlobalScope\":true},\"7ad303e40d4fddf44f156129e397511953a71481c5cfd86b1862649aaaf240cc\",{\"version\":\"f634e4c7d5cdba8e092d98098033b311c8ef304038d815c63ffdb9f78f3f7bb7\",\"impliedFormat\":1},{\"version\":\"a97990239c609e7abcfa259d4235e2c51a0e21a53cb12cec8d820f1d5da0ccd4\",\"impliedFormat\":99},{\"version\":\"e77eedffc28191f1efa0ca96254cd7f9dd4261e11e59b63844f4ea8b2d796c98\",\"impliedFormat\":99},\"0a3629f896ca2392b18caea7b40ba50360430365cfeefb0a30f99bdea630d90a\",{\"version\":\"a4e9e0d92dcad2cb387a5f1bdffe621569052f2d80186e11973aa7080260d296\",\"impliedFormat\":1},{\"version\":\"f6380cc36fc3efc70084d288d0a05d0a2e09da012ee3853f9d62431e7216f129\",\"impliedFormat\":1},{\"version\":\"497c3e541b4acf6c5d5ba75b03569cfe5fe25c8a87e6c87f1af98da6a3e7b918\",\"impliedFormat\":1},{\"version\":\"d9429b81edf2fb2abf1e81e9c2e92615f596ed3166673d9b69b84c369b15fdc0\",\"impliedFormat\":1},{\"version\":\"7e22943ae4e474854ca0695ab750a8026f55bb94278331fda02a4fb42efce063\",\"impliedFormat\":1},{\"version\":\"7da9ff3d9a7e62ddca6393a23e67296ab88f2fcb94ee5f7fb977fa8e478852ac\",\"impliedFormat\":1},{\"version\":\"e1b45cc21ea200308cbc8abae2fb0cfd014cb5b0e1d1643bcc50afa5959b6d83\",\"impliedFormat\":1},{\"version\":\"c9740b0ce7533ce6ba21a7d424e38d2736acdddeab2b1a814c00396e62cc2f10\",\"impliedFormat\":1},{\"version\":\"b3c1f6a3fdbb04c6b244de6d5772ffdd9e962a2faea1440e410049c13e874b87\",\"impliedFormat\":1},{\"version\":\"dcaa872d9b52b9409979170734bdfd38f846c32114d05b70640fd05140b171bb\",\"impliedFormat\":1},{\"version\":\"6c434d20da381fcd2e8b924a3ec9b8653cf8bed8e0da648e91f4c984bd2a5a91\",\"impliedFormat\":1},{\"version\":\"992419d044caf6b14946fa7b9463819ab2eeb7af7c04919cc2087ce354c92266\",\"impliedFormat\":1},{\"version\":\"fa9815e9ce1330289a5c0192e2e91eb6178c0caa83c19fe0c6a9f67013fe795c\",\"impliedFormat\":1},{\"version\":\"06384a1a73fcf4524952ecd0d6b63171c5d41dd23573907a91ef0a687ddb4a8c\",\"impliedFormat\":1},{\"version\":\"34b1594ecf1c84bcc7a04d9f583afa6345a6fea27a52cf2685f802629219de45\",\"impliedFormat\":1},{\"version\":\"d82c9ca830d7b94b7530a2c5819064d8255b93dfeddc5b2ebb8a09316f002c89\",\"impliedFormat\":1},{\"version\":\"7e046b9634add57e512412a7881efbc14d44d1c65eadd35432412aa564537975\",\"impliedFormat\":1},{\"version\":\"aac9079b9e2b5180036f27ab37cb3cf4fd19955be48ccc82eab3f092ee3d4026\",\"impliedFormat\":1},{\"version\":\"3d9c38933bc69e0a885da20f019de441a3b5433ce041ba5b9d3a541db4b568cb\",\"impliedFormat\":1},{\"version\":\"606aa2b74372221b0f79ca8ae3568629f444cc454aa59b032e4cb602308dec94\",\"impliedFormat\":1},{\"version\":\"50474eaea72bfda85cc37ae6cd29f0556965c0849495d96c8c04c940ef3d2f44\",\"impliedFormat\":1},{\"version\":\"b4874382f863cf7dc82b3d15aed1e1372ac3fede462065d5bfc8510c0d8f7b19\",\"impliedFormat\":1},{\"version\":\"df10b4f781871afb72b2d648d497671190b16b679bf7533b744cc10b3c6bf7ea\",\"impliedFormat\":1},{\"version\":\"1fdc28754c77e852c92087c789a1461aa6eed19c335dc92ce6b16a188e7ba305\",\"impliedFormat\":1},{\"version\":\"a656dab1d502d4ddc845b66d8735c484bfebbf0b1eda5fb29729222675759884\",\"impliedFormat\":1},{\"version\":\"465a79505258d251068dc0047a67a3605dd26e6b15e9ad2cec297442cbb58820\",\"impliedFormat\":1},{\"version\":\"ddae22d9329db28ce3d80a2a53f99eaed66959c1c9cd719c9b744e5470579d2f\",\"impliedFormat\":1},{\"version\":\"d0e25feadef054c6fc6a7f55ccc3b27b7216142106b9ff50f5e7b19d85c62ca7\",\"impliedFormat\":1},{\"version\":\"111214009193320cacbae104e8281f6cb37788b52a6a84d259f9822c8c71f6ca\",\"impliedFormat\":1},{\"version\":\"01c8e2c8984c96b9b48be20ee396bd3689a3a3e6add8d50fe8229a7d4e62ff45\",\"impliedFormat\":1},{\"version\":\"a4a0800b592e533897b4967b00fb00f7cd48af9714d300767cc231271aa100af\",\"impliedFormat\":1},{\"version\":\"20aa818c3e16e40586f2fa26327ea17242c8873fe3412a69ec68846017219314\",\"impliedFormat\":1},{\"version\":\"f498532f53d54f831851990cb4bcd96063d73e302906fa07e2df24aa5935c7d1\",\"impliedFormat\":1},{\"version\":\"5fd19dfde8de7a0b91df6a9bbdc44b648fd1f245cae9e8b8cf210d83ee06f106\",\"impliedFormat\":1},{\"version\":\"3b8d6638c32e63ea0679eb26d1eb78534f4cc02c27b80f1c0a19f348774f5571\",\"impliedFormat\":1},{\"version\":\"ce0da52e69bc3d82a7b5bc40da6baad08d3790de13ad35e89148a88055b46809\",\"impliedFormat\":1},{\"version\":\"9e01233da81bfed887f8d9a70d1a26bf11b8ddff165806cc586c84980bf8fc24\",\"impliedFormat\":1},{\"version\":\"214a6afbab8b285fc97eb3cece36cae65ea2fca3cbd0c017a96159b14050d202\",\"impliedFormat\":1},{\"version\":\"14beeca2944b75b229c0549e0996dc4b7863e07257e0d359d63a7be49a6b86a4\",\"impliedFormat\":1},{\"version\":\"f7bb9adb1daa749208b47d1313a46837e4d27687f85a3af7777fc1c9b3dc06b1\",\"impliedFormat\":1},{\"version\":\"c549fe2f52101ffe47f58107c702af7cdcd42da8c80afd79f707d1c5d77d4b6e\",\"impliedFormat\":1},{\"version\":\"3966ea9e1c1a5f6e636606785999734988e135541b79adc6b5d00abdc0f4bf05\",\"impliedFormat\":1},{\"version\":\"0b60b69c957adb27f990fbc27ea4ac1064249400262d7c4c1b0a1687506b3406\",\"impliedFormat\":1},{\"version\":\"12c26e5d1befc0ded725cee4c2316f276013e6f2eb545966562ae9a0c1931357\",\"impliedFormat\":1},{\"version\":\"27b247363f1376c12310f73ebac6debcde009c0b95b65a8207e4fa90e132b30a\",\"impliedFormat\":1},{\"version\":\"05bd302e2249da923048c09dc684d1d74cb205551a87f22fb8badc09ec532a08\",\"impliedFormat\":1},{\"version\":\"fe930ec064571ab3b698b13bddf60a29abf9d2f36d51ab1ca0083b087b061f3a\",\"impliedFormat\":1},{\"version\":\"6b85c4198e4b62b0056d55135ad95909adf1b95c9a86cdbed2c0f4cc1a902d53\",\"impliedFormat\":1},{\"version\":\"e53462960e9799ff89f63e847d3a338bdadcc41fc98a816b9aaf32e82cb0071a\",\"impliedFormat\":1},{\"version\":\"9593de9c14310da95e677e83110b37f1407878352f9ebe1345f97fc69e4b627c\",\"impliedFormat\":1},{\"version\":\"e009f9f511db1a215577f241b2dc6d3f9418f9bc1686b6950a1d3f1b433a37ff\",\"impliedFormat\":1},{\"version\":\"caa48f3b98f9737d51fabce5ce2d126de47d8f9dffeb7ad17cd500f7fd5112e0\",\"impliedFormat\":1},{\"version\":\"64d15723ce818bb7074679f5e8d4d19a6e753223f5965fd9f1a9a1f029f802f7\",\"impliedFormat\":1},{\"version\":\"2900496cc3034767cd31dd8e628e046bc3e1e5f199afe7323ece090e8872cfa7\",\"impliedFormat\":1},{\"version\":\"ba74ef369486b613146fa4a3bccb959f3e64cdc6a43f05cc7010338ba0eab9f7\",\"impliedFormat\":1},{\"version\":\"58ce0e6b87ffb9f58608e2a1adae45487e07074fe2a591feb6ad660416e26b2f\",\"impliedFormat\":1},{\"version\":\"c4f885600b6f398223fab2c97165befb768a4a6348008b1e995906d070992d15\",\"impliedFormat\":1},{\"version\":\"6d2089f3928a72795c3648b3a296047cb566cd2dae161db50434faf12e0b2843\",\"impliedFormat\":1},{\"version\":\"5cb00927cbb410110dde3fb0fda5f1b093f53af27a8e6869233315c635d78708\",\"impliedFormat\":1},{\"version\":\"83995c7fa683c849e9e4d2a33c6e2421e10e31277bacec7769a4c2cabdebec02\",\"impliedFormat\":1},{\"version\":\"ac8582e453158a1e4cccfb683af8850b9d2a0420e7f6f9a260ab268fc715ab0d\",\"impliedFormat\":1},{\"version\":\"c80aa3ff0661e065d700a72d8924dcec32bf30eb8f184c962da43f01a5edeb6f\",\"impliedFormat\":1},{\"version\":\"837f5c12e3e94ee97aca37aa2a50ede521e5887fb7fa89330f5625b70597e116\",\"impliedFormat\":1},{\"version\":\"33e2d7a5bf6ceb9159e3e919b39497d72d6437cede9a1e8f0db6553bb5b73cf9\",\"impliedFormat\":1},{\"version\":\"eb34b5818c9f5a31e020a8a5a7ca3300249644466ef71adf74e9e96022b8b810\",\"impliedFormat\":1},{\"version\":\"cdec09a633b816046d9496a59345ad81f5f97c642baf4fe1611554aa3fbf4a41\",\"impliedFormat\":1},{\"version\":\"5b933c1b71bff2aa417038dabb527b8318d9ef6136f7bd612046e66a062f5dbf\",\"impliedFormat\":1},{\"version\":\"b94a350c0e4d7d40b81c5873b42ae0e3629b0c45abf2a1eeb1a3c88f60a26e9a\",\"impliedFormat\":1},{\"version\":\"231f407c0f697534facae9ca5d976f3432da43d5b68f0948b55063ca53831e7c\",\"impliedFormat\":1},{\"version\":\"188857be1eebad5f4021f5f771f248cf04495e27ad467aa1cf9624e35346e647\",\"impliedFormat\":1},{\"version\":\"d0a20f432f1f10dc5dbb04ae3bee7253f5c7cee5865a262f9aac007b84902276\",\"impliedFormat\":1},{\"version\":\"e0eb2938d78e30af06783046057c657669e293d399b1b9ee8e56d457f532e006\",\"impliedFormat\":1},{\"version\":\"20064a8528651a0718e3a486f09a0fd9f39aaca3286aea63ddeb89a4428eab2b\",\"impliedFormat\":1},{\"version\":\"743da6529a5777d7b68d0c6c2b006800d66e078e3b8391832121981d61cd0abc\",\"impliedFormat\":1},{\"version\":\"f87c199c9f52878c8a2f418af250ccfc80f2419d0bd9b8aebf4d4822595d654f\",\"impliedFormat\":1},{\"version\":\"57397be192782bd8bedf04faa9eea2b59de3e0cfa1d69367f621065e7abd253b\",\"impliedFormat\":1},{\"version\":\"df9e6f89f923a5e8acf9ce879ec70b4b2d8d744c3fb8a54993396b19660ac42a\",\"impliedFormat\":1},{\"version\":\"175628176d1c2430092d82b06895e072176d92d6627b661c8ea85bee65232f6e\",\"impliedFormat\":1},{\"version\":\"21625e9b1e7687f847a48347d9b77ce02b9631e8f14990cffb7689236e95f2bb\",\"impliedFormat\":1},{\"version\":\"483fad2b4ebaabd01e983d596e2bb883121165660060f498f7f056fecd6fb56a\",\"impliedFormat\":1},{\"version\":\"6a089039922bf00f81957eafd1da251adb0201a21dcb8124bcfed14be0e5b37d\",\"impliedFormat\":1},{\"version\":\"6cd1c25b356e9f7100ca69219522a21768ae3ea9a0273a3cc8c4af0cbd0a3404\",\"impliedFormat\":1},{\"version\":\"201497a1cbe0d7c5145acd9bf1b663737f1c3a03d4ecffd2d7e15da74da4aaf1\",\"impliedFormat\":1},{\"version\":\"66e92a7b3d38c8fa4d007b734be3cdcd4ded6292753a0c86976ac92ae2551926\",\"impliedFormat\":1},{\"version\":\"a8e88f5e01065a9ab3c99ff5e35a669fdb7ae878a03b53895af35e1130326c15\",\"impliedFormat\":1},{\"version\":\"05a8dfa81435f82b89ecbcb8b0e81eb696fac0a3c3f657a2375a4630d4f94115\",\"impliedFormat\":1},{\"version\":\"5773e4f6ac407d1eff8ef11ccaa17e4340a7da6b96b2e346821ebd5fff9f6e30\",\"impliedFormat\":1},{\"version\":\"c736dd6013cac2c57dffb183f9064ddd6723be3dfc0da1845c9e8a9921fc53bb\",\"impliedFormat\":1},{\"version\":\"7b43949c0c0a169c6e44dcdf5b146f5115b98fa9d1054e8a7b420d28f2e6358f\",\"impliedFormat\":1},{\"version\":\"b46549d078955775366586a31e75028e24ad1f3c4bc1e75ad51447c717151c68\",\"impliedFormat\":1},{\"version\":\"34dd068c2a955f4272db0f9fdafb6b0871db4ec8f1f044dfc5c956065902fe1c\",\"impliedFormat\":1},{\"version\":\"e5854625da370345ba85c29208ae67c2ae17a8dbf49f24c8ed880c9af2fe95b2\",\"impliedFormat\":1},{\"version\":\"cf1f7b8b712d5db28e180d907b3dd2ba7949efcfec81ec30feb229eee644bda4\",\"impliedFormat\":1},{\"version\":\"2423fa71d467235a0abffb4169e4650714d37461a8b51dc4e523169e6caac9b8\",\"impliedFormat\":1},{\"version\":\"4de5d28c3bc76943453df1a00435eb6f81d0b61aa08ff34ae9c64dd8e0800544\",\"impliedFormat\":1},{\"version\":\"e9ab0cb47842267615bfc3f080b735a0b29bf04f6d5dfa2b3b05b15c6f6dfbc5\",\"impliedFormat\":1},{\"version\":\"dbfa8af0021ddb4ddebe1b279b46e5bccf05f473c178041b3b859b1d535dd1e5\",\"impliedFormat\":1},{\"version\":\"7ab2721483b53d5551175e29a383283242704c217695378e2462c16de44aff1a\",\"impliedFormat\":1},{\"version\":\"ebafa97de59db1a26c71b59fa4ee674c91d85a24a29d715e29e4db58b5ff267d\",\"impliedFormat\":1},{\"version\":\"16ba4c64c1c5a52cc6f1b4e1fa084b82b273a5310ae7bc1206c877be7de45d03\",\"impliedFormat\":1},{\"version\":\"1538a8a715f841d0a130b6542c72aea01d55d6aa515910dfef356185acf3b252\",\"impliedFormat\":1},{\"version\":\"68eeb3d2d97a86a2c037e1268f059220899861172e426b656740effd93f63a45\",\"impliedFormat\":1},{\"version\":\"d5689cb5d542c8e901195d8df6c2011a516d5f14c6a2283ffdaae381f5c38c01\",\"impliedFormat\":1},{\"version\":\"9974861cff8cb8736b8784879fe44daca78bc2e621fc7828b0c2cf03b184a9e5\",\"impliedFormat\":1},{\"version\":\"675e5ac3410a9a186dd746e7b2b5612fa77c49f534283876ffc0c58257da2be7\",\"impliedFormat\":1},{\"version\":\"951a8f023da2905ae4d00418539ff190c01d8a34c8d8616b3982ff50c994bbb6\",\"impliedFormat\":1},{\"version\":\"8cfe5ad847a1e073099e64ce97e91c0c14d8d88aaefcff5073aa4dda17f3067f\",\"impliedFormat\":1},{\"version\":\"955c80622de0580d047d9ccdb1590e589c666c9240f63d2c5159e0732ab0a02e\",\"impliedFormat\":1},{\"version\":\"e4b31fc1a59b688d30ff95f5a511bfb05e340097981e0de3e03419cbefe36c0e\",\"impliedFormat\":1},{\"version\":\"16a2ac3ba047eddda3a381e6dac30b2e14e84459967f86013c97b5d8959276f3\",\"impliedFormat\":1},{\"version\":\"45f1c5dbeb6bbf16c32492ba182c17449ab18d2d448cc2751c779275be0713d8\",\"impliedFormat\":1},{\"version\":\"23d9f0f07f316bc244ffaaec77ae8e75219fb8b6697d1455916bc2153a312916\",\"impliedFormat\":1},{\"version\":\"eac028a74dba3e0c2aa785031b7df83586beab4efce9da4903b2f3abad293d3a\",\"impliedFormat\":1},{\"version\":\"8d22beed3e8bbf57e0adbc986f3b96011eef317fd0adadccd401bcb45d6ee57e\",\"impliedFormat\":1},{\"version\":\"3a1fc0aae490201663c926fde22e6203a8ac6aa4c01c7f5532d2dcdde5b512f5\",\"impliedFormat\":1},{\"version\":\"4fbae6249d3c80cc85a1d33de46f350678f8af87b9566abce87e6e22960271b7\",\"impliedFormat\":1},{\"version\":\"d36c6f1f19a6c298a6e10f87d9b1f2d05e528251bbe351f95b1b805b42c2d627\",\"impliedFormat\":1},{\"version\":\"a7f590406204026bf49d737edb9d605bb181d0675e5894a6b80714bbc525f3df\",\"impliedFormat\":1},{\"version\":\"533039607e507410c858c1fa607d473deacb25c8bf0c3f1bd74873af5210e9a0\",\"impliedFormat\":1},{\"version\":\"b09561e71ae9feab2e4d2b06ceb7b89de7fad8d6e3dc556c33021f20b0fb88c4\",\"impliedFormat\":1},{\"version\":\"dd79d768006bfd8dd46cf60f7470dca0c8fa25a56ac8778e40bd46f873bd5687\",\"impliedFormat\":1},{\"version\":\"4daacd053dd57d50a8cdf110f5bc9bb18df43cd9bcc784a2a6979884e5f313de\",\"impliedFormat\":1},{\"version\":\"d103fff68cd233722eea9e4e6adfb50c0c36cc4a2539c50601b0464e33e4f702\",\"impliedFormat\":1},{\"version\":\"3c6d8041b0c8db6f74f1fd9816cd14104bcd9b7899b38653eb082e3bdcfe64d7\",\"impliedFormat\":1},{\"version\":\"4207e6f2556e3e9f7daa5d1dd1fdaa294f7d766ebea653846518af48a41dd8e0\",\"impliedFormat\":1},{\"version\":\"c94b3332d328b45216078155ba5228b4b4f500d6282ac1def812f70f0306ed1c\",\"impliedFormat\":1},{\"version\":\"43497bdd2d9b53afad7eed81fb5656a36c3a6c735971c1eed576d18d3e1b8345\",\"impliedFormat\":1},{\"version\":\"5db2d64cfcfbc8df01eda87ce5937cb8af952f8ba8bbc8fd2a8ef10783614ca7\",\"impliedFormat\":1},{\"version\":\"b13319e9b7e8a9172330a364416d483c98f3672606695b40af167754c91fa4ec\",\"impliedFormat\":1},{\"version\":\"7f8a5e8fc773c089c8ca1b27a6fea3b4b1abc8e80ca0dd5c17086bbed1df6eaa\",\"impliedFormat\":1},{\"version\":\"0d54e6e53636877755ac3e2fab3e03e2843c8ca7d5f6f8a18bbf5702d3771323\",\"impliedFormat\":1},{\"version\":\"124b96661046ec3f63b7590dc13579d4f69df5bb42fa6d3e257c437835a68b4d\",\"impliedFormat\":1},{\"version\":\"0e7b3f288bf35c62c2534388a82aa0976c4d9ebaf6ebe5643336c67ed55e981d\",\"impliedFormat\":1},{\"version\":\"724775a12f87fc7005c3805c77265374a28fb3bc93c394a96e2b4ffee9dde65d\",\"impliedFormat\":1},{\"version\":\"431f29f17261cff4937375ff478f8f0d992059c0a2b266cc64030fb0e736ce74\",\"impliedFormat\":1},{\"version\":\"c477c9c6003e659d5aad681acd70694176d4f88fc16cc4c5bcfa5b8dcc01874b\",\"impliedFormat\":1},{\"version\":\"ca2ebe3f3791275d3287eed417660b515eb4d171f0b7badcfa95f0f709b149f7\",\"impliedFormat\":1},{\"version\":\"8605b33c2b65285339bc24989f456eb818eab5a117f1a92f94d77951ea0e1b36\",\"impliedFormat\":1},{\"version\":\"e2a4983a141f4185996e1ab3230cb24754c786d68434f2e7659276c325f3c46c\",\"impliedFormat\":1},{\"version\":\"b2216c0b4c7f32e7e9bba74d0223fc9ad3bec50b71663701d60578cecc323fb5\",\"impliedFormat\":1},{\"version\":\"1cbbd9272af325d7189d845c75bbdb6d467ce1691afe12bcb9964e4bd1270e66\",\"impliedFormat\":1},{\"version\":\"86eb11b1e540fe07b2ebfc9cca24c35b005f0d81edf7701eaf426db1f5702a07\",\"impliedFormat\":1},{\"version\":\"ee3457d827475b9e64ea793f49a83fffbb4b8fefe534b8f0a340b0e47d786e76\",\"impliedFormat\":1},{\"version\":\"67cbde477deac96c2b92ccb42d9cf21f2a7417f8df9330733643cc101aa1bca5\",\"impliedFormat\":1},{\"version\":\"2cb440791f9d52fa2222c92654d42f510bf3f7d2f47727bf268f229feced15ba\",\"impliedFormat\":1},{\"version\":\"5bb4355324ea86daf55ee8b0a4d0afdef1b8adadc950aab1324c49a3acd6d74e\",\"impliedFormat\":1},{\"version\":\"64e07eac6076ccb2880461d483bae870604062746415393bfbfae3db162e460a\",\"impliedFormat\":1},{\"version\":\"5b6707397f71e3e1c445a75a06abf882872d347c4530eef26c178215de1e6043\",\"impliedFormat\":1},{\"version\":\"c74d9594bda9fe32ab2a99010db232d712f09686bbee66f2026bc17401fe7b7e\",\"impliedFormat\":1},{\"version\":\"15bbb824c277395f8b91836a5e17fedc86f3bb17df19dcdc5173930fd50cc83e\",\"impliedFormat\":1},{\"version\":\"ff3f1d258bd14ca6bbf7c7158580b486d199e317fc4c433f98f13b31e6bb5723\",\"impliedFormat\":1},{\"version\":\"a3f1cac717a25f5b8b6df9deef8fc8d0a0726390fdaa83aed55be430cd532ebf\",\"impliedFormat\":1},{\"version\":\"f1a1edb271da27e2d8925a68db1eb8b16d8190037eb44a324b826e54f97e315f\",\"impliedFormat\":1},{\"version\":\"1553d16fb752521327f101465a3844fe73684503fdd10bed79bd886c6d72a1bc\",\"impliedFormat\":1},{\"version\":\"07ea97f8e11cedfb35f22c5cab2f7aacd8721df7a9052fb577f9ba400932933b\",\"impliedFormat\":1},{\"version\":\"66ab54a2a098a1f22918bd47dc7af1d1a8e8428aa9c3cb5ef5ed0fef45a13fa4\",\"impliedFormat\":1},{\"version\":\"f3c511e1d8b463dc37eaf777b0a620cbd4dd2fe448a16413dc300a831c397b91\",\"impliedFormat\":1},{\"version\":\"bf22ee38d4d989e1c72307ab701557022e074e66940cf3d03efa9beb72224723\",\"impliedFormat\":1},{\"version\":\"158c190bebda38391b1235408b978e1b2b3366b92539042f43ae5479bfcb1a5e\",\"impliedFormat\":1},{\"version\":\"271119c7cbd09036fd8bd555144ec0ea54d43b59bcb3d8733995c8ef94cb620b\",\"impliedFormat\":1},{\"version\":\"5a51eff6f27604597e929b13ee67a39267df8f44bbd6a634417ed561a2fa05d6\",\"impliedFormat\":1},{\"version\":\"1f93b377bb06ed9de4dc4eb664878edb8dcac61822f6e7633ca99a3d4a1d85da\",\"impliedFormat\":1},{\"version\":\"53e77c7bf8f076340edde20bf00088543230ba19c198346112af35140a0cfac5\",\"impliedFormat\":1},{\"version\":\"cec6a5e638d005c00dd6b1eaafe6179e835022f8438ff210ddb3fe0ae76f4bf9\",\"impliedFormat\":1},{\"version\":\"c264c5bb2f6ec6cea1f9b159b841fc8f6f6a87eb279fef6c471b127c41001034\",\"impliedFormat\":1},{\"version\":\"ff42cc408214648895c1de8ada2143edc3379b5cbb7667d5add8b0b3630c9634\",\"impliedFormat\":1},{\"version\":\"c9018ca6314539bf92981ab4f6bc045d7caaff9f798ce7e89d60bb1bb70f579c\",\"impliedFormat\":1},{\"version\":\"d74c5b76c1c964a2e80a54f759de4b35003b7f5969fb9f6958bd263dcc86d288\",\"impliedFormat\":1},{\"version\":\"b83a3738f76980505205e6c88ca03823d01b1aa48b3700e8ba69f47d72ab8d0f\",\"impliedFormat\":1},{\"version\":\"01b9f216ada543f5c9a37fbc24d80a0113bda8c7c2c057d0d1414cde801e5f9d\",\"impliedFormat\":1},{\"version\":\"f1e9397225a760524141dc52b1ca670084bde5272e56db1bd0ad8c8bea8c1c30\",\"impliedFormat\":1},{\"version\":\"08c43afe12ba92c1482fc4727aab5f788a83fd49339eb0b43ad01ed2b5ad6066\",\"impliedFormat\":1},{\"version\":\"6066b918eb4475bfcce362999f7199ce5df84cea78bd55ed338da57c73043d45\",\"impliedFormat\":1},{\"version\":\"c67beadff16a8139f87dc9c07581500d88abd21e8436c9e9bf25f2ee39c5b1af\",\"impliedFormat\":1},{\"version\":\"1c94de96416c02405da00d8f7bde9d196064c3ce1464f0c4df1966202196b558\",\"impliedFormat\":1},{\"version\":\"406cc85801b49efd5f75c84cc557e2bba9155c7f88c758c3fadd4e844ad6b19e\",\"impliedFormat\":1},{\"version\":\"6d235f62eb41ac4010a0dab8ba186c20dec8565f42273a34f0fa3fc3ca9d0dbb\",\"impliedFormat\":1},{\"version\":\"f7663954884610aeb38c78ffd22525749fab19ab5e86e4a53df664180efd1ff5\",\"impliedFormat\":1},{\"version\":\"4ac0045aa4bc48b5f709da38c944d4fec2368eda6b67e4dd224147f3471b7eaf\",\"impliedFormat\":1},{\"version\":\"e998acd4765ee7f773680312968618498994f00963f4079301766a6273429769\",\"impliedFormat\":1},{\"version\":\"71390fe0b867a2161bd39c63f7d35c128933efbbae63eae91605fe4ae6895faf\",\"impliedFormat\":1},{\"version\":\"3e717eef40648a7d8895219063b1e5cb5bcc404bc1d41a22b91f3140b83bce1d\",\"impliedFormat\":1},{\"version\":\"9b61c06ab1e365e5b32f50a56c0f3bb2491329bb3cd2a46e8caa30edcf0281cc\",\"impliedFormat\":1},{\"version\":\"8f91df3614625daa000bffe84a5c1939b4da0254db9d7c62764f916ebb93dcdc\",\"impliedFormat\":1},{\"version\":\"ee745db646de4c5cf019e495ff5d800ed6f4ee9d9b3aaa7b2c5ca836928bc80e\",\"impliedFormat\":1},{\"version\":\"d8d808ab0c5c550fb715641e1f5813dededa9b657e7ed3c3a6665ce7f629273d\",\"impliedFormat\":1},{\"version\":\"059a7dfc70b0e875ef87a961d1e9b69917a32a6eea1c3950a5aad8c62d8274aa\",\"impliedFormat\":1},{\"version\":\"cf575b64fadf5f646c0f715730c490f317f856f5b3bbe06493638576bad711d9\",\"impliedFormat\":1},{\"version\":\"86e8053735c07114cc6be9f70bbc1d53820fbc76c6b08963bbc9a11070a9e354\",\"impliedFormat\":1},{\"version\":\"6306621db4fbb1c1e79883599912c32da2c5974402531b47a2cf2c19ce61200e\",\"impliedFormat\":1},{\"version\":\"db1c864a7ab8f401c793a040d3f708cc9a5e5a7d2e6a7a0783b8f256acfb322b\",\"impliedFormat\":1},{\"version\":\"f263db23ce0b198ab373032126d83eb6bcd9a70c1f08048e7770dac32297d9b5\",\"impliedFormat\":1},{\"version\":\"3d51b78be622aa3f4afa5cbe7ca35dec64406c1436aaee61cd4a24b9060b7f25\",\"impliedFormat\":1},{\"version\":\"aa8f659712fd02d08bdf17d3a93865d33bd1ee3b5bcf2120b2aa5e9374a74157\",\"impliedFormat\":1},{\"version\":\"5a06765319ef887a78dd42ca5837e2e46723525b0eaa53dd31b36ba9b9d33b56\",\"impliedFormat\":1},{\"version\":\"27bf29df603ae9c123ffd3d3cfd3b047b1fa9898bf04e6ab3b05db95beebb017\",\"impliedFormat\":1},{\"version\":\"5f019b4b2cd2dbf4cd24288d9858ef819a81f89c49663b6d13d0f4d1b8ea6b22\",\"impliedFormat\":1},{\"version\":\"ff3174855c0939abcec4c17b4e541f7953edee00b6219697a1032f2c7f1dbb2a\",\"impliedFormat\":1},{\"version\":\"79eec21ed8d68daad880d96f5865a9c5247d01170ad8ff7f350a441216c12018\",\"impliedFormat\":1},{\"version\":\"9d1c3fe1639a48bfd9b086b8ae333071f7da60759344916600b979b7ed6ffaa6\",\"impliedFormat\":1},{\"version\":\"8b3d89d08a132d7a2549ac0a972af3773f10902908a96590b3fe702c325a80ec\",\"impliedFormat\":1},{\"version\":\"fa294d757c39c4d65e52e4d17084ee63b52b04e0864bc04d4b16adc243b9f542\",\"impliedFormat\":1},{\"version\":\"77b99a7972d64491c7329a6c295b42af7876c247d5ac0bd3a2c794f976a4f8c2\",\"impliedFormat\":1},{\"version\":\"49cfd2c983594c18fe36f64c82d5e1282fd5d42168e925937345ef927b07f073\",\"impliedFormat\":1},{\"version\":\"e401504a62e7a88f64c6dc27fa2226ffa3e66ef4256026bcbce69758c3110e42\",\"affectsGlobalScope\":true,\"impliedFormat\":99},{\"version\":\"ae4701f27d676209105e91e1102a67a1ef068a534bfefb27fb9365298933c274\",\"impliedFormat\":99},{\"version\":\"5e029163ae160751761fb74bf7a95aa55e5ad71a483e2dd47ae486b1c9047029\",\"impliedFormat\":99},{\"version\":\"f93edf2dde7462574e93ddaedb21550b11a7367c4dbc5f97dfc12f61c6c5bd3e\",\"impliedFormat\":99},{\"version\":\"8ab775a3db45bf6d291405d4b6e9e3637f37b639c2b9c9094d43222db307c1bc\",\"impliedFormat\":99},{\"version\":\"14d5ccd6f427b4d1e74a214f59c55740b2079d032a947a706ba0f07cd5599dcd\",\"impliedFormat\":99},\"66641a29ed9499993e36009ec51de231678f15bee263697446b39feab427df4d\",\"5ee57d32ebd5d4d9e4a6b2565d6c83b4b80b2b94473ff56295abdca7ca36cf91\",{\"version\":\"2374a7d32a94f9519c83203310d59c6eed36b14fd4e232f61649aa02326d21c4\",\"impliedFormat\":1},{\"version\":\"32727845ab5bd8a9ef3e4844c567c09f6d418fcf0f90d381c00652a6f23e7f6e\",\"impliedFormat\":1},{\"version\":\"6ce681121f9d9520c9a7f3fa9fcd976ce4534dc214983a9e8dac1b481c7ce7bc\",\"impliedFormat\":1},{\"version\":\"7a8ec10b0834eb7183e4bfcd929838ac77583828e343211bb73676d1e47f6f01\",\"impliedFormat\":1},{\"version\":\"587716b97310e61b22f481e46d8678ae4c5d5b619041be3cbc08c8c63883bfa8\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"3f00324f263189b385c3a9383b1f4dae6237697bcf0801f96aa35c340512d79c\",\"impliedFormat\":1},{\"version\":\"ec8997c2e5cea26befc76e7bf990750e96babb16977673a9ff3b5c0575d01e48\",\"impliedFormat\":1},\"8ece19c0242beff50b1d9895ec04ac354d8bf632bd31046f6f682e67d61a673b\",{\"version\":\"1748c03e7a7d118f7f6648c709507971eb0d416f489958492c5ae625de445184\",\"impliedFormat\":1},{\"version\":\"db4a3b1ff504ad9e300685a36b25e1b89393b85bc08e50f5d6610863c11acbbe\",\"impliedFormat\":99},{\"version\":\"20be44c04e883d5fe7840d630a8d0656e95b00c2d6eebab9ab253275e7170534\",\"impliedFormat\":99},{\"version\":\"cc2958d8abd86edcdf05542bb1b40ba659db5bc5a2560720cde08e8950e63bc1\",\"impliedFormat\":99},{\"version\":\"e44e0ea195d68c0aea951809bda325322085008c0622fc4ee44db5359f37b747\",\"impliedFormat\":99},{\"version\":\"21053659ad72fe51b9dfbde4fa14dbbac0912359fa37c9a5aa75f188782b2ee8\",\"impliedFormat\":99},{\"version\":\"f9fa0f246d000ebe3a77dee7c66db017ca7b65ae76a3a026fe36356bc7815a5d\",\"impliedFormat\":1},{\"version\":\"0fcd9cd895e08e23c26d4819de6be35c3880ac703670702416fc284c65d3e180\",\"impliedFormat\":1},{\"version\":\"f4272c1409ba5ce42d17be35575083f37dfe282284cc5e350d5fa60481ff44eb\",\"impliedFormat\":99},{\"version\":\"b7bd70307671536c735389e0a1748555c438c392dfceb6f2ac3aa0a50ca82530\",\"impliedFormat\":99},{\"version\":\"5589e7f5a94a87a8dfc60e7bc81a610376925053a659f183606c3d76d3f92f84\",\"impliedFormat\":99},{\"version\":\"d4a98ba517f71f7b8ab85f158859cdfc42ad9926e8623fc96337014e5d4dbb5b\",\"impliedFormat\":99},{\"version\":\"94c33d70bcda3c3f98b8262340cd528344142133dbc8fcc7e2d4b2589b185db7\",\"impliedFormat\":99},{\"version\":\"b52f7568bb9b00bcee6c4929938226541c09d86b849b8ba8db2fe2a8bba46f49\",\"impliedFormat\":99},{\"version\":\"d11667aa2a6063fde3c4054da9ab98e3b9bc7e3da800beaca437f1eff2a17fe2\",\"impliedFormat\":99},{\"version\":\"828f8b38dff4e5c47b0112cb437da379c720f0360d40d392457c9775f30c8ae8\",\"impliedFormat\":99},{\"version\":\"ef816ad6735a271c4c8035a1914c3a9beaaa90b3c174da312d26bce8736e56ec\",\"impliedFormat\":99},{\"version\":\"3a5cda2463d20d696dfc87fcdfc4066307802cd6a07fb73932280446c7cb74f3\",\"impliedFormat\":99},{\"version\":\"c1c545c407e4ad166b8285ae063ffffdc8f33ac38504acbaae8cc5692b9da7bb\",\"impliedFormat\":99},{\"version\":\"d42e1872d53ebb213e7bbe15e5fecdcaa9a490d2f2a2b035ee9cf4a6d3f1e44e\",\"impliedFormat\":99},{\"version\":\"ffd8877d71bd60e6490cd30b26a070f5ae29427477965e60c71394e1545e214f\",\"impliedFormat\":99},{\"version\":\"e297bdcb7db008d8d7d0481f2c935a9f7f0a338f41b7e5d1cec6a7744140a4ff\",\"impliedFormat\":99},{\"version\":\"568c26e04942bc025342240f0fadc1463ce47171909302d05024a7f77a31a7c2\",\"impliedFormat\":99},{\"version\":\"3e8b97f70a096dd3ce1757d460810e58e4a7de0d3d0ddfe430d02dc27295b3f4\",\"impliedFormat\":1},{\"version\":\"309ebd217636d68cf8784cbc3272c16fb94fb8e969e18b6fe88c35200340aef1\",\"impliedFormat\":1},{\"version\":\"91cf9887208be8641244827c18e620166edf7e1c53114930b54eaeaab588a5be\",\"impliedFormat\":1},{\"version\":\"ef9b6279acc69002a779d0172916ef22e8be5de2d2469ff2f4bb019a21e89de2\",\"impliedFormat\":1},{\"version\":\"71623b889c23a332292c85f9bf41469c3f2efa47f81f12c73e14edbcffa270d3\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"88863d76039cc550f8b7688a213dd051ae80d94a883eb99389d6bc4ce21c8688\",\"impliedFormat\":1},{\"version\":\"e9ce511dae7201b833936d13618dff01815a9db2e6c2cc28646e21520c452d6c\",\"impliedFormat\":1},{\"version\":\"243649afb10d950e7e83ee4d53bd2fbd615bb579a74cf6c1ce10e64402cdf9bb\",\"impliedFormat\":1},{\"version\":\"35575179030368798cbcd50da928a275234445c9a0df32d4a2c694b2b3d20439\",\"impliedFormat\":1},{\"version\":\"c939cb12cb000b4ec9c3eca3fe7dee1fe373ccb801237631d9252bad10206d61\",\"impliedFormat\":1},{\"version\":\"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5\",\"impliedFormat\":1},{\"version\":\"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5\",\"impliedFormat\":1},{\"version\":\"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5\",\"impliedFormat\":1},{\"version\":\"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5\",\"impliedFormat\":1},{\"version\":\"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5\",\"impliedFormat\":1},{\"version\":\"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5\",\"impliedFormat\":1},{\"version\":\"26384fb401f582cae1234213c3dc75fdc80e3d728a0a1c55b405be8a0c6dddbe\",\"impliedFormat\":1},{\"version\":\"26384fb401f582cae1234213c3dc75fdc80e3d728a0a1c55b405be8a0c6dddbe\",\"impliedFormat\":1},{\"version\":\"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5\",\"impliedFormat\":1},{\"version\":\"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5\",\"impliedFormat\":1},{\"version\":\"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5\",\"impliedFormat\":1},{\"version\":\"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5\",\"impliedFormat\":1},{\"version\":\"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5\",\"impliedFormat\":1},{\"version\":\"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5\",\"impliedFormat\":1},{\"version\":\"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5\",\"impliedFormat\":1},{\"version\":\"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5\",\"impliedFormat\":1},{\"version\":\"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5\",\"impliedFormat\":1},{\"version\":\"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5\",\"impliedFormat\":1},{\"version\":\"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5\",\"impliedFormat\":1},{\"version\":\"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5\",\"impliedFormat\":1},{\"version\":\"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5\",\"impliedFormat\":1},{\"version\":\"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5\",\"impliedFormat\":1},{\"version\":\"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5\",\"impliedFormat\":1},{\"version\":\"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5\",\"impliedFormat\":1},{\"version\":\"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5\",\"impliedFormat\":1},{\"version\":\"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5\",\"impliedFormat\":1},{\"version\":\"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5\",\"impliedFormat\":1},{\"version\":\"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5\",\"impliedFormat\":1},{\"version\":\"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5\",\"impliedFormat\":1},{\"version\":\"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5\",\"impliedFormat\":1},{\"version\":\"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5\",\"impliedFormat\":1},{\"version\":\"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5\",\"impliedFormat\":1},{\"version\":\"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5\",\"impliedFormat\":1},{\"version\":\"26384fb401f582cae1234213c3dc75fdc80e3d728a0a1c55b405be8a0c6dddbe\",\"impliedFormat\":1},{\"version\":\"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5\",\"impliedFormat\":1},{\"version\":\"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5\",\"impliedFormat\":1},{\"version\":\"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5\",\"impliedFormat\":1},{\"version\":\"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5\",\"impliedFormat\":1},{\"version\":\"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5\",\"impliedFormat\":1},{\"version\":\"03268b4d02371bdf514f513797ed3c9eb0840b0724ff6778bda0ef74c35273be\",\"impliedFormat\":1},{\"version\":\"3511847babb822e10715a18348d1cbb0dae73c4e4c0a1bcf7cbc12771b310d45\",\"impliedFormat\":1},{\"version\":\"80e653fbbec818eecfe95d182dc65a1d107b343d970159a71922ac4491caa0af\",\"impliedFormat\":1},{\"version\":\"53f00dc83ccceb8fad22eb3aade64e4bcdb082115f230c8ba3d40f79c835c30e\",\"impliedFormat\":1},{\"version\":\"35475931e8b55c4d33bfe3abc79f5673924a0bd4224c7c6108a4e08f3521643c\",\"impliedFormat\":1},{\"version\":\"9078205849121a5d37a642949d687565498da922508eacb0e5a0c3de427f0ae5\",\"impliedFormat\":1},{\"version\":\"e8f8f095f137e96dc64b56e59556c02f3c31db4b354801d6ae3b90dceae60240\",\"impliedFormat\":1},{\"version\":\"451abef2a26cebb6f54236e68de3c33691e3b47b548fd4c8fa05fd84ab2238ff\",\"impliedFormat\":1},{\"version\":\"6042774c61ece4ba77b3bf375f15942eb054675b7957882a00c22c0e4fe5865c\",\"impliedFormat\":1},{\"version\":\"41f185713d78f7af0253a339927dc04b485f46210d6bc0691cf908e3e8ded2a1\",\"impliedFormat\":1},{\"version\":\"23ee410c645f68bd99717527de1586e3eb826f166d654b74250ad92b27311fde\",\"impliedFormat\":1},{\"version\":\"ffc3e1064146c1cafda1b0686ae9679ba1fb706b2f415e057be01614bf918dba\",\"impliedFormat\":1},{\"version\":\"995869b1ddf66bbcfdb417f7446f610198dcce3280a0ae5c8b332ed985c01855\",\"impliedFormat\":1},{\"version\":\"58d65a2803c3b6629b0e18c8bf1bc883a686fcf0333230dd0151ab6e85b74307\",\"impliedFormat\":1},{\"version\":\"e818471014c77c103330aee11f00a7a00b37b35500b53ea6f337aefacd6174c9\",\"impliedFormat\":1},{\"version\":\"dca963a986285211cfa75b9bb57914538de29585d34217d03b538e6473ac4c44\",\"impliedFormat\":1},{\"version\":\"d8bc0c5487582c6d887c32c92d8b4ffb23310146fcb1d82adf4b15c77f57c4ac\",\"impliedFormat\":1},{\"version\":\"8cb31102790372bebfd78dd56d6752913b0f3e2cefbeb08375acd9f5ba737155\",\"impliedFormat\":1},{\"version\":\"76af14c3cce62da183aaf30375e3a4613109d16c7f16d30702f16d625a95e62c\",\"impliedFormat\":99},{\"version\":\"d3cfde44f8089768ebb08098c96d01ca260b88bccf238d55eee93f1c620ff5a5\",\"impliedFormat\":1},{\"version\":\"293eadad9dead44c6fd1db6de552663c33f215c55a1bfa2802a1bceed88ff0ec\",\"impliedFormat\":1},{\"version\":\"08b2fae7b0f553ad9f79faec864b179fc58bc172e295a70943e8585dd85f600c\",\"impliedFormat\":1},{\"version\":\"f12edf1672a94c578eca32216839604f1e1c16b40a1896198deabf99c882b340\",\"impliedFormat\":1},{\"version\":\"e3498cf5e428e6c6b9e97bd88736f26d6cf147dedbfa5a8ad3ed8e05e059af8a\",\"impliedFormat\":1},{\"version\":\"dba3f34531fd9b1b6e072928b6f885aa4d28dd6789cbd0e93563d43f4b62da53\",\"impliedFormat\":1},{\"version\":\"f672c876c1a04a223cf2023b3d91e8a52bb1544c576b81bf64a8fec82be9969c\",\"impliedFormat\":1},{\"version\":\"e4b03ddcf8563b1c0aee782a185286ed85a255ce8a30df8453aade2188bbc904\",\"impliedFormat\":1},{\"version\":\"2329d90062487e1eaca87b5e06abcbbeeecf80a82f65f949fd332cfcf824b87b\",\"impliedFormat\":1},{\"version\":\"25b3f581e12ede11e5739f57a86e8668fbc0124f6649506def306cad2c59d262\",\"impliedFormat\":1},{\"version\":\"4fdb529707247a1a917a4626bfb6a293d52cd8ee57ccf03830ec91d39d606d6d\",\"impliedFormat\":1},{\"version\":\"a9ebb67d6bbead6044b43714b50dcb77b8f7541ffe803046fdec1714c1eba206\",\"impliedFormat\":1},{\"version\":\"833e92c058d033cde3f29a6c7603f517001d1ddd8020bc94d2067a3bc69b2a8e\",\"impliedFormat\":1},{\"version\":\"56e0775830b68d13c3d7f4ec75df7d016db6b879ef9676affb5233a9a289c192\",\"impliedFormat\":99},{\"version\":\"4610b06c7e642929d5a828fe2be1f7a820df575906a84050b660a7b6376a3d65\",\"impliedFormat\":1},{\"version\":\"626e93657ff6adea8c9c836c157e8e23b32182a24cdea022e59933315989c6a5\",\"impliedFormat\":1},{\"version\":\"186db99f61e183cb74c13196fec6c23a08379d7685a977a6510f2a6b32928277\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"8bafb36cc57a9eed55211eae719becaec2569976f606db9a846989c1a5163e0b\",\"impliedFormat\":99},\"95ca63aaee592f4f687bd458f4fd7787b58e04f6e98bd2df06b08d75626e9843\",\"efee69ee0838625b981a3054591c4d53d31b25b815de2342f977600439a86b46\",\"e78a0c33605504eb48c5111dc9ef77f40b825d1baa347c6486fb24626ddc37b6\",{\"version\":\"5780b706cece027f0d4444fbb4e1af62dc51e19da7c3d3719f67b22b033859b9\",\"impliedFormat\":1},{\"version\":\"c6fe327c538417b8dd5b9bb32abcd7911534b10da3a4514f3445cdb28cf3abf2\",\"impliedFormat\":99},{\"version\":\"0065cdb7ac9f5b19921632de63f888ec2cc11ad57f7fc868f44bf0faad2fce3e\",\"impliedFormat\":99},{\"version\":\"91207808044134a33ac22e7c484f73c1f60ef618dee1610017d33d0e06c88d86\",\"impliedFormat\":99},{\"version\":\"8c1adc3171d0287f3a26f4891a7d1834c89999573a9b444aa5ff519dcc43a2b7\",\"impliedFormat\":99},{\"version\":\"015916d335054556670a8c67266c493ce792a2c23a530a6b430f1662a65b73a8\",\"impliedFormat\":99},{\"version\":\"4085ea8fe65ea592da52217eae0df11696acd83bfe2fdef6cc848412712f8874\",\"impliedFormat\":99},{\"version\":\"db837f95d1d516db38a3d414253e91df645a47748e54de1ae5d7c8530aa4fdd0\",\"impliedFormat\":99},{\"version\":\"1e46a859f5858e89259a9d9b5eff64873a9cd1ff07813b97a6c2501369dbc787\",\"impliedFormat\":99},{\"version\":\"4f97089fe15655ae448c9d005bb9a87cc4e599b155edc9e115738c87aa788464\",\"impliedFormat\":99},{\"version\":\"08e0a47204e10298b7bb015ad6483a883e95cdc38ca3592fe0243b90be829e8f\",\"impliedFormat\":99},{\"version\":\"684e2e26f3b2b3b0be87671ca6f8f33d8d6918e731f9779cf0561e1dcac7e883\",\"impliedFormat\":99},{\"version\":\"4589695e7b294fe8a2b3f7bc98ec1aa6807b56510b15f62fdb8c66c7a1685c9b\",\"impliedFormat\":99},{\"version\":\"52e602363be8335fbe3787103b8e8468e44bffea00927ee811b58496f6eb3af2\",\"impliedFormat\":99},{\"version\":\"915737bc565ac2e42b00c939d9618961d9a9968e57fc027993ccae52c8fd5652\",\"impliedFormat\":99},{\"version\":\"d0d8ed04944c47c57518350a67df5a27cd56331c5e2f2a637d6690a1c692deab\",\"impliedFormat\":99},{\"version\":\"3ddcfb1c4c09da5f1d7533688bc8c8b86e141cb2c33638aa3e7cd3bafe2b75e7\",\"impliedFormat\":99},{\"version\":\"28ec86cac6a59e4e702c18e451d536efc958835a980db4733c28b6fae3a76c1e\",\"impliedFormat\":99},{\"version\":\"9e7a645f75492e47c6cc418979536ffe2acc866deadf61be051a7f682ec048e5\",\"impliedFormat\":99},{\"version\":\"aa3e957e769f1a0d06565962e5ba1b41d56540b98c289f185a99292eaa3a9851\",\"impliedFormat\":99},{\"version\":\"6f334b6d74aeb099a5ee6174e01b78e649f90cef8fced59eef326097a41db306\",\"impliedFormat\":99},{\"version\":\"a0eb2662211ef78af42c3b376a40ac09c7391299938f671e8cfd028fe4bc8a20\",\"impliedFormat\":99},{\"version\":\"cd44ad0f1b23de58d2e08345b3e3b2f78ee3ad97f81610f7dec759c122ea29cb\",\"impliedFormat\":99},{\"version\":\"5704d417da53115460520befca002a12c6f9f69d35278379ea80e751002a2632\",\"impliedFormat\":99},{\"version\":\"8d91635e28186fe92084dd59bd35c6bff891cca1ccd308b05398d2462dc4f5aa\",\"impliedFormat\":99},{\"version\":\"1f4c05ca427bb38bc3d8f8d956044507a9bd27c3de25b11a5b2a0ad9f12aa9ff\",\"impliedFormat\":99},{\"version\":\"8ee95ffeda10ea1721e00e3008ee24d3acc1f4e364bf04e2c20264e4c534117a\",\"impliedFormat\":99},{\"version\":\"55923f49df9745fa07ada1a3e766942db66feb3ad28432a9d7ca7279911bfe0d\",\"impliedFormat\":99},{\"version\":\"6dc0813d9091dfaed7d19df0c5a079ee72e0248ce5e412562c5633913900be25\",\"impliedFormat\":99},{\"version\":\"711a1419a2aec3b2d1175858ca660600e87842c8f587baed47fa8d447d11f43c\",\"impliedFormat\":99},{\"version\":\"751ec3b90e73e80a4e70c36e31e83755cb089649204adbfa2719eeb297eb6bea\",\"impliedFormat\":99},{\"version\":\"a3e194061d3e646bc4ebdb2e30e82969d485d4df6335fc6a3b4a1dfad13b084a\",\"impliedFormat\":99},{\"version\":\"4ad4374299fc441c462341fca63478381951827ec989ded6f573c3ccecab2bbb\",\"impliedFormat\":99},{\"version\":\"b632b50e086cb066fcee7328e06dd8ec551853f882d67b78c1b52e1ab2d6e7aa\",\"impliedFormat\":99},{\"version\":\"4aa40d838a4567a7ebd9bc163a8a5c54e9b300b01ebbf21de2aafa7a87394882\",\"impliedFormat\":99},{\"version\":\"bcab57f5fe8791f2576249dfcc21a688ecf2a5929348cfe94bf3eb152cff8205\",\"impliedFormat\":99},{\"version\":\"b5428f35f4ebf7ea46652b0158181d9c709e40a0182e93034b291a9dc53718d8\",\"impliedFormat\":99},{\"version\":\"0afcd28553038bca2db622646c1e7fcf3fb6a1c4d3b919ef205a6014edeeae0f\",\"impliedFormat\":99},{\"version\":\"7709f6ae1364ed6c4c0dcec202f1553795b1de9321a428b812a38c6d9d44526c\",\"impliedFormat\":99},{\"version\":\"0e09ffe659fdd2e452e1cbe4159a51059ae4b2de7c9a02227553f69b82303234\",\"impliedFormat\":99},{\"version\":\"b80858a2f26906d39ef75cef20d1419080b7c6b7c3776384d79787b0ac70e8c0\",\"impliedFormat\":99},{\"version\":\"90299a45a15a314d12046e7970680648c74c37c058dc9fb8217642483fda749b\",\"impliedFormat\":99},{\"version\":\"3d3f189177511d1452e7095471e3e7854b8c44d94443485dc21f6599c2161921\",\"impliedFormat\":99},{\"version\":\"e0cf2aefc2ed503764f0fd218a2eef85923e7714ad6cebab5a7613ddb3b3f85f\",\"impliedFormat\":99},{\"version\":\"043195af0b52aadd10713870dd60369df0377ed153104b26e6bac1213b19f63e\",\"impliedFormat\":99},{\"version\":\"ad17a36132569045ab97c8e5badf8febb556011a8ed7b2776ff823967d6d5aca\",\"impliedFormat\":99},{\"version\":\"698d2b22251dbbfc0735e2d6ed350addead9ad031fac48b8bb316e0103d865db\",\"impliedFormat\":99},{\"version\":\"ff10facf373a13d2864ff4de38c4892d74be27d9c6468dac49c08adabbf9b0eb\",\"impliedFormat\":99},{\"version\":\"97b1cf4599cc3bc2e84b997aa1af60d91ca489d96bea0e20aaff0e52a5504b29\",\"impliedFormat\":99},{\"version\":\"853dfbcd0999d3edc6be547d83dc0e0d75bf44530365b9583e75519d35984c35\",\"impliedFormat\":99},{\"version\":\"abbb31e3da98902306359386224021bfb6cfa2496c89bbbde7ee2065cf58297c\",\"impliedFormat\":99},{\"version\":\"eb77a8615b87a807171bc0a69a1b3c3d69db190a5f243c0dac2c5acc9cffba15\",\"impliedFormat\":99},{\"version\":\"1c5042f8943e23f55a16c788558d2df6cc1d92fac933e71df516a1e114aa8c93\",\"impliedFormat\":99},{\"version\":\"bb0519ff5ef245bbf829d51ad1f90002de702b536691f25334136864be259ec5\",\"impliedFormat\":99},{\"version\":\"e2381c64702025b4d57b005e94ed0b994b5592488d76f1e5f67f59d1860ebb70\",\"impliedFormat\":99},{\"version\":\"dedd673bc22ab642bdcdd5b3dccb47cf6637c3b44030c8e4d9b4ea2b201e7fcc\",\"impliedFormat\":99},{\"version\":\"d7dfcb039ff9cff38ccd48d2cc1ba95ca45c316670eddbcf81784e21b7128692\",\"impliedFormat\":99},{\"version\":\"ff555c8aa0311e94f4be373b8c6de8afa506bcde3c0c271d43f870372543d1b7\",\"impliedFormat\":99},{\"version\":\"4b16df3f2783af630f8d50fa4018a7943f7cda766371c27187d448c13eac234d\",\"impliedFormat\":99},{\"version\":\"19342bf9867482ac324df0edd174e991775a8b1c85c670707d94e1306fb466e7\",\"impliedFormat\":99},{\"version\":\"d204b9ae964f73721d593e97c54fc55f7fd67de826ce9e9f14b1e762190f23d1\",\"impliedFormat\":99},{\"version\":\"85059ed9b6605d92c753daf3a534855ba944be69ff1a12ab4eca28cefbabd07a\",\"impliedFormat\":99},{\"version\":\"8ec3b354ca25fa7524ac376da4480ffb141157ed6900a830cfe40d1ab0f2162a\",\"impliedFormat\":99},{\"version\":\"ceb78be9831cb2646370d5149b4475bd847cf40f2f7e920760a23e4efd92ff82\",\"impliedFormat\":99},{\"version\":\"14d26b5f20b4bdd01a57ca3aa61975d46a9caba335c054280d7615120bcc94b6\",\"impliedFormat\":99},{\"version\":\"687208233ae7a969baa2d0c565c9f24eb4cb1e64d6cfb30f71afec9e929e58c2\",\"impliedFormat\":99},{\"version\":\"a93c8f43b78c1d0ceb985a6edaf9e838f3f449be28e8c285ed41a0db06d96513\",\"impliedFormat\":99},{\"version\":\"e9f8fe43d2f8d3a3e631afdbac0d3670b618c00ae820f191985bad3f4e3c4f1b\",\"impliedFormat\":99},{\"version\":\"f3ed9a4ec3123351b2a8cba473e9a6f173eab5458309f380fe0039642f70bcae\",\"impliedFormat\":99},{\"version\":\"21f96085ed19d415725c5a7d665de964f8283cacef43957de10bdd0333721cc4\",\"impliedFormat\":99},{\"version\":\"16adaba3987310c895ac5309bc36558a06d1298d1f3249ce3ba49753138a6fcc\",\"impliedFormat\":99},{\"version\":\"66ee7e53d78fbf38cd6fc8d2e013c811e0a34b78cbf601c996d862a136fd9844\",\"impliedFormat\":99},{\"version\":\"a10fd5d76a2aaba572bec4143a35ff58912e81f107aa9e6d97f0cd11e4f12483\",\"impliedFormat\":99},{\"version\":\"1215f54401c4af167783d0f88f5bfb2dcb6f0dacf48495607920229a84005538\",\"impliedFormat\":99},{\"version\":\"c2760bbe32a6a4b8277c9de119b9076d7999b37f6b6d6d1c232767eaeab752d8\",\"impliedFormat\":99},{\"version\":\"2fe93aef0ee58eaa1b22a9b93c8d8279fe94490160703e1aabeff026591f8300\",\"impliedFormat\":99},{\"version\":\"bbb02e695c037f84947e56da3485bb0d0da9493ed005fa59e4b3c5bc6d448529\",\"impliedFormat\":99},{\"version\":\"557cc6d5e75d09874bf2bb5a57454301c1b6aea4db97b0394fe009a4d5d2d409\",\"impliedFormat\":99},{\"version\":\"6c8bfda4e462499ac46c96b7638b1f087fee1dee5f144245d3e3c01b9b6b95bf\",\"impliedFormat\":99},{\"version\":\"edc65c28dd60039aa4547cc0c80bc167eb1dc4a584e266290ead72974810bfbe\",\"impliedFormat\":99},{\"version\":\"f09e1fd004a3007a499b07ef90e1aef8c94d24851ee5f8d34fc8f74f7ceb5805\",\"impliedFormat\":99},{\"version\":\"f89658695a95c49f1e20c48afcf00c25145bf4ef9d7f98a0e327b3c33213b2b3\",\"impliedFormat\":99},{\"version\":\"b5ea27f19a54feca5621f5ba36a51026128ea98e7777e5d47f08b79637527cf5\",\"impliedFormat\":99},{\"version\":\"413a2318cf5c0070706524ce6319e2ae130438fda1d1160dfbccec4662a462ee\",\"impliedFormat\":99},{\"version\":\"aeae5c3c8e4fee83c4d1af6ae54390b0939af80d2bc30b2832aeff0456190797\",\"impliedFormat\":99},{\"version\":\"47576d023c8223c0c03fb86abfa997d12728ccc2d6f57e2211d4080ac1ef245a\",\"impliedFormat\":99},{\"version\":\"fa568f8d605595e1cffbfca3e8c8c492cf88ae2c6ed151f6c64acf0f9e8c25d8\",\"impliedFormat\":99},{\"version\":\"649d93da3a0aeb4e24fbcc1b73f17cf6bd8d077e87467c19c7216b88a34c72e4\",\"impliedFormat\":99},{\"version\":\"167623f0857c3cb46dcebf80be817c953da3e2bc6c8d0b1f5716046fbadaf4e6\",\"impliedFormat\":99},{\"version\":\"d4efa005dd88f50d4e263ec487aa915e4a4419183befb194ee53b127054553a3\",\"impliedFormat\":99},{\"version\":\"93705970a2cf530e02172056c8ed093afce6b04ec8f058296a199307275ffe0f\",\"impliedFormat\":99},{\"version\":\"5949b2417a9071a8dc99f76f207a4033d58623e2022684631eb20d9313d78b58\",\"impliedFormat\":99},{\"version\":\"04170b38aa7ca9d1f6dce663695122f118a19f3a3471d730af276a0aad9876f2\",\"impliedFormat\":99},{\"version\":\"21d875aef514b2e080d9de527f0acb3735ce4fe792e9a3f53ac4c4f87bca8459\",\"impliedFormat\":99},{\"version\":\"a7b5e6ed7bed3947df30b5c1c5e00078ce51ac494007339000dcac5f3dddbeea\",\"impliedFormat\":99},{\"version\":\"99b3ae437b805d9aabf3b1273ef428d813090235a1678c50288f8ca35269f753\",\"impliedFormat\":99},{\"version\":\"31b62f3307e6258868b1fc328d2dd97f0806cbc86f83ad3a17df91b10a559436\",\"impliedFormat\":99},{\"version\":\"09ab715404aa25cc702f3976198caede3069ab9fcfc1b8a3fb227c32d7741e1f\",\"impliedFormat\":99},{\"version\":\"fca55623e40d83b292bd3db11a515a755e049e000768a6986efcc86361ed250e\",\"impliedFormat\":99},{\"version\":\"c2f8edd42421ef6bfeb75137849962e9d4da4751150e7db09283f1a569896994\",\"impliedFormat\":99},{\"version\":\"b00b84501597ddbe7c08ee70e78673286f40cb04ecfe56dfcf5694692e48a672\",\"impliedFormat\":99},{\"version\":\"39b9adc0d4c9cc7266d83c3170da33fa5e636666456462177f8d2c5e20ac5538\",\"impliedFormat\":99},{\"version\":\"cdb5a0e3d00a7022840292b1dac29570f3eb51d61a96f40dd42d606803a0793e\",\"impliedFormat\":99},{\"version\":\"6d9677165e19b3b8659a419abe4475e6896ec0b9acda14ef5a8d37d61ed35e8f\",\"impliedFormat\":99},{\"version\":\"f386a5b5ca1c32218f22ba17be71ac345738f989057d1d7b9512b4b3c2d3c8ed\",\"impliedFormat\":99},{\"version\":\"bf6b1d5161174ed36d21171703d7242f01d9328f73a908c0a82ae1f5c40bd63d\",\"impliedFormat\":99},{\"version\":\"585a34480a4e2f23e4ff17e4d13ae9771b3aff59f2065b654d23ad3aba421c34\",\"impliedFormat\":99},{\"version\":\"7d03fb5db461d532924bcd64d895e142506c6c63d0a2e93679b322efcd0f7f14\",\"impliedFormat\":99},{\"version\":\"a15fce1a9c2bee62030920de26a570ed7da8ff8cb145967f307089407fd321e2\",\"impliedFormat\":99},{\"version\":\"a3e99a5277965c03dda61ed2de3d9e24a13ddc55a8482991b9cdf449f0c7cd9d\",\"impliedFormat\":99},{\"version\":\"26ee250e86cfd060585afb2c76c7dbc6d387fc58b71bb48683ea3df216fc9bcc\",\"impliedFormat\":99},{\"version\":\"e2cdad7543a43a2fb6ed9b5928821558a03665d3632c95e3212094358ae5896b\",\"impliedFormat\":99},{\"version\":\"326a980e72f7b9426be0805774c04838e95195b467bea2072189cefe708e9be7\",\"impliedFormat\":99},{\"version\":\"6362a4854c52419f71f14d3fee88b3b434d1e89dcd58a970e9a82602c0fd707a\",\"impliedFormat\":99},{\"version\":\"fb1cc1e09d57dfeb315875453a228948b904cbe1450aaf8fda396ff58364a740\",\"impliedFormat\":99},{\"version\":\"7a258bdd1589c76597766197d10487a4d4aae3e0a5054f1b7b6dd74978395415\",\"impliedFormat\":99},{\"version\":\"d388e0c1c9a42d59ce88412d3f6ce111f63ce2ff558e0a3f84510092431dfee0\",\"impliedFormat\":99},{\"version\":\"b1ffb52598ac5410448047b6759d3f527f404828f22dbfe0e6cb432ae703fc5b\",\"impliedFormat\":99},{\"version\":\"1bbcd8b9290a11a0d4bb4a84667b34bd9e36f2eea6fdc0c78ff1c820b300accb\",\"impliedFormat\":99},{\"version\":\"88b741c32bda69018bb0729167232ea8860294e4713d695d982499998d35e68f\",\"impliedFormat\":99},{\"version\":\"a4f90a12cbfac13b45d256697ce70a6b4227790ca2bf3898ffd2359c19eab4eb\",\"impliedFormat\":99},{\"version\":\"4a6c2ac831cff2d8fa846dfb010ee5f7afce3f1b9bd294298ee54fdc555f1161\",\"impliedFormat\":99},{\"version\":\"730cb342a128f5a8a036ffbd6dbc1135b623ce2100cefe1e1817bb8845bc7100\",\"impliedFormat\":99},{\"version\":\"23c2f7daf936ac36c6ecb0cb890c6437c481b64b83cff97f636051f220d10ed3\",\"impliedFormat\":99},{\"version\":\"3ed2a5eba8a85d7bd0d5e7ee46caf12c75ed3e449ccbab1f269a902e5feb65eb\",\"impliedFormat\":99},{\"version\":\"bc14cb4f3868dab2a0293f54a8fe10aa23c0428f37aece586270e35631dd6b67\",\"impliedFormat\":99},{\"version\":\"4d9639d3617f65bc5160864849fbeafe14ec69a582e20d83aa1a3bdaf6153c0b\",\"impliedFormat\":99},{\"version\":\"6b7606e690f511bd1fa9218487aceb2f8693218eed5328a7af87a8f34e88936e\",\"impliedFormat\":99},{\"version\":\"dd07dec8df207ba247af31484ef02390e255ef9b0eabebf44d75f7e1c88ba717\",\"impliedFormat\":99},{\"version\":\"1e2988a3f1390b88dd1b1f14ebb2e6828cda6968d10df9869c790412b9201735\",\"impliedFormat\":99},{\"version\":\"215ee63b66e5019240f0353c688f0c47b34d8daad2f7940a5a00c54a42d5c24f\",\"impliedFormat\":99},{\"version\":\"5760fc3aa599c30b4bf0fe989bea4ca7807b1017aa03e6b1be804f327f49ca39\",\"impliedFormat\":99},{\"version\":\"02955d8d53d4492bc22b3526dcda81779df82c74f332d01b40f1c72d719f77cf\",\"impliedFormat\":99},{\"version\":\"a03645f65eec2cd03adbd7e1f03fc8e1b90d6b254d3417f4d96f01c2ed5fdfc5\",\"impliedFormat\":99},{\"version\":\"77dabe31d44c48782c529d5c9acddc41f799bf9b424b259596131efc77355478\",\"impliedFormat\":99},{\"version\":\"e1b10986dd7e630e7f17efb28acc801d62eee0fe1e731034226e9d1e628c310c\",\"impliedFormat\":99},{\"version\":\"bfe24a42297a44caba5067d4e3feab260251783398c4d66b4e25d802f2e1c74b\",\"impliedFormat\":99},{\"version\":\"ac56b2f316b70d6a727fdbbcfa8d124bcd1798c293487acb2b27a43b5c886bb0\",\"impliedFormat\":99},{\"version\":\"26722ba25e122ab7e11592044cf38123ea995039a66fa5cd1880f689d26e60c4\",\"impliedFormat\":99},{\"version\":\"5ead43a727f75335fdbce4d4f658d60388dfaae3d9e96ff085a37edae70400da\",\"impliedFormat\":99},{\"version\":\"0f9c9f7d13a5cf1c63eb56318b6ae4dfa2accef1122b2e88b5ed1c22a4f24e3b\",\"impliedFormat\":99},{\"version\":\"c693f9c0fda89d41e7670429d30ddcda570f9ad63a7301379695916524eb6d2e\",\"impliedFormat\":99},{\"version\":\"586623b01c4a3be4de3fce373a3d2287c4ab367ba62e793363f817ff65fd0f00\",\"impliedFormat\":99},{\"version\":\"6b514d5159d0d189675a1d5a707ba068a6da6bc097afb2828aae0c98d8b32f08\",\"impliedFormat\":99},{\"version\":\"39d7dbcfec85393fedc8c7cf62ee93f7e97c67605279492b085723b54ccaca8e\",\"impliedFormat\":99},{\"version\":\"9c7a532873d37eea7d3d04a39da4783421bdbbf7f1b0a4aaa99ba121a787eb1a\",\"impliedFormat\":99},{\"version\":\"7d604c1d876ef8b7fec441cf799296fd0d8f66844cf2232d82cf36eb2ddff8fe\",\"impliedFormat\":99},{\"version\":\"912b7172c005917012ce63453d6f9b40ac61a9010b1ae96e51202a09676794ab\",\"impliedFormat\":99},{\"version\":\"861596a3b58ade9e9733374bd6b45e5833b8b80fd2eb9fe504368fc8f73ae257\",\"impliedFormat\":99},{\"version\":\"a3da7cf20826f3344ad9a8a56da040186a1531cace94e2788a2db795f277df94\",\"impliedFormat\":99},{\"version\":\"900a9da363740d29e4df6298e09fad18ae01771d4639b4024aa73841c6a725da\",\"impliedFormat\":99},{\"version\":\"4e979a85e80e332414f45089ff02f396683c0b5919598032a491eb7b981fedfd\",\"impliedFormat\":99},{\"version\":\"6d3496cac1c65b8a645ecbb3e45ec678dd4d39ce360eecbcb6806a33e3d9a7ae\",\"impliedFormat\":99},{\"version\":\"d4066ba263b829f8fc098b6ae66eaa476a585dbd965852026949d41bd5b5e389\",\"impliedFormat\":99},{\"version\":\"442f6a9e83bb7d79ff61877dc5f221eea37f1d8609d8848dfbc6228ebc7a8e90\",\"impliedFormat\":99},{\"version\":\"2063687e55299fd380574b7ed84b3c97d4d12a8d4f7d4f6b6339f50e931a3f95\",\"impliedFormat\":99},{\"version\":\"55e7120535e109c72fe87d367e6bee99ac484b8842df28e2912109ad40aa0179\",\"impliedFormat\":99},{\"version\":\"2dd4989deea8669628ef01af137d9494c12bbfc5ff2bbe033369631932c558cb\",\"impliedFormat\":99},{\"version\":\"233c107a5721c5a695574abe07afc1d7e106a5e93ea9cd841c846ab436a6ca26\",\"impliedFormat\":99},{\"version\":\"de24a6825606e79c913a702d7114e38055d823078c9fe9018a1a9c3bf558e9dd\",\"impliedFormat\":99},{\"version\":\"4b3e103eca50f82c683a1fe18d54edd916726e3b6f767ef0a80d601e86b82196\",\"impliedFormat\":99},{\"version\":\"ecc8f3ef3a4ef382960b2c83291ce4d7ebbb6fed0854ecb7103b4cf9fde232f9\",\"impliedFormat\":99},{\"version\":\"687208233ae7a969baa2d0c565c9f24eb4cb1e64d6cfb30f71afec9e929e58c2\",\"impliedFormat\":99},{\"version\":\"a6015a25da3b022feaff8b644ac1ac0f8416ff4b6abdffddb86bcaac2de557cf\",\"impliedFormat\":99},{\"version\":\"fc320f9198060155cb6af9ea7bf92b3118d754fd6aa55b09e444ba9344e04740\",\"impliedFormat\":99},{\"version\":\"9ac718f694ba940c697391db374e17c887d55c1c722ee5dbd2f2b0050a9f7451\",\"impliedFormat\":99},{\"version\":\"5b1d323982717499784bb63fd87068e920a4434c03247d9a65fd03f57ecff760\",\"impliedFormat\":99},{\"version\":\"7eaa55cc08113ff34673c3545b0dc60f2e63073244973540ce3a1b0180b28467\",\"impliedFormat\":99},{\"version\":\"41c9f070851fc0da4ef0f7213cc2007e352a89b8bfde76f489688a5ef2bfbdac\",\"impliedFormat\":99},{\"version\":\"d1b9f4ae04a0ef6fbb01e40d573c667a4a571d9b3e3b27df1ae706acfca52b20\",\"impliedFormat\":99},{\"version\":\"1f7a6614ab0168938e60a5c989109b12c4f4d679333c210111e4aa512078388c\",\"impliedFormat\":99},{\"version\":\"dee6934166088b55fe84eae24de63d2e7aae9bfe918dfe635b252f682ceca95a\",\"impliedFormat\":99},{\"version\":\"92233d73d60a8c6a965f7db9b2c9c1e74e39d92dc12d6a9810eb642f967b1cc7\",\"impliedFormat\":99},{\"version\":\"db027bc9edef650cff3cbe542959f0d4ef8532073308c04a5217af25fc4f5860\",\"impliedFormat\":99},{\"version\":\"62df21e26bfd13b36ef3cf329b1ac5113260879a6664632e35c98cc81717b6b1\",\"impliedFormat\":99},{\"version\":\"1b4b2db05fa0bb42bc44e7d2625f129369be302d2765d115c864a246dd9146ca\",\"impliedFormat\":99},{\"version\":\"fa910f88f55844718a277ee9519206abce66629de2692676c3e2ad1c9278bdfd\",\"impliedFormat\":99},{\"version\":\"b9bfbc9537a33509b840636acbb8fd382231d361af5df63bddb00323085feac7\",\"impliedFormat\":99},{\"version\":\"9ae87bd743e93b6384efbfa306bde1fa70b6ff27533983e1e1fe08a4ef7037b8\",\"impliedFormat\":99},{\"version\":\"5f7c0a4aad7a3406db65d674a5de9e36e0d08773f638b0f49d70e441de7127c0\",\"impliedFormat\":99},{\"version\":\"264e030e9a2d949b5a3a4e3a3728438349e24468daf83f607026d9692a72ddc6\",\"impliedFormat\":99},{\"version\":\"c227268909d3cb4142e4808e4f4b83b1581e1beabcb86d8646a5494d2e8371e3\",\"impliedFormat\":99},{\"version\":\"9d1352fbed9d30513e1306cfdbdfc07af8e9e950973a97417b081075c5ff8e1a\",\"impliedFormat\":99},{\"version\":\"07603bb68d27ff41499e4ed871cde4f6b4bb519c389dcf25d7f0256dfaa56554\",\"impliedFormat\":99},{\"version\":\"6139824680a34eba08979f2e21785a761870384a4df16c143b19288aced9c346\",\"impliedFormat\":99},{\"version\":\"6bd4aa523d61e94da44cee0ee0f3b6c8d5f1a91ef0bd9e8a8cf14530b0a1a6df\",\"impliedFormat\":99},{\"version\":\"6b6e2508f79513e01386273e63d0fc3617613d80a5aca950a2b0fc33d90ad0b4\",\"impliedFormat\":99},{\"version\":\"cacbb7829fdc44382199306cc9b516eb44df1b26bd984c2516b11933ac8049f8\",\"impliedFormat\":1},{\"version\":\"666ff8c2156d5cccc9b050308dba6570c6759c9e13c417d544242ba45598fcbd\",\"impliedFormat\":99},{\"version\":\"da1fd0eb6be0b43e2cc1f93aa396777ce9c33d8f916d3c9c4651029cdff0d5f7\",\"impliedFormat\":99},{\"version\":\"2fac70f99da22181acfda399eed248b47395a8eeb33c9c82d75ca966aee58912\",\"impliedFormat\":99},{\"version\":\"7e36722be609155cf1cedb727b7b39849fb2c1106d4bca9195a682e30572427e\",\"impliedFormat\":1},{\"version\":\"2cef84bf00cbdb452fdc5d8ecfe7b8c0aa3fa788bdc4ad8961e2e636530dbb60\",\"impliedFormat\":99},{\"version\":\"24104650185414f379d5cc35c0e2c19f06684a73de5b472bae79e0d855771ecf\",\"impliedFormat\":99},{\"version\":\"799003c0ab928582fca04977f47b8d85b43a8de610f4eef0ad2d069fbb9f9399\",\"impliedFormat\":99},{\"version\":\"b13dd41c344a23e085f81b2f5cd96792e6b35ae814f32b25e39d9841844ad240\",\"impliedFormat\":99},{\"version\":\"17d8b4e6416e48b6e23b73d05fd2fde407e2af8fddbe9da2a98ede14949c3489\",\"impliedFormat\":99},{\"version\":\"6d17b2b41f874ab4369b8e04bdbe660163ea5c8239785c850f767370604959e3\",\"impliedFormat\":99},{\"version\":\"04b4c044c8fe6af77b6c196a16c41e0f7d76b285d036d79dcaa6d92e24b4982b\",\"impliedFormat\":99},{\"version\":\"30bdeead5293c1ddfaea4097d3e9dd5a6b0bc59a1e07ff4714ea1bbe7c5b2318\",\"impliedFormat\":99},{\"version\":\"e7df226dcc1b0ce76b32f160556f3d1550124c894aae2d5f73cefaaf28df7779\",\"impliedFormat\":99},{\"version\":\"f2b7eef5c46c61e6e72fba9afd7cc612a08c0c48ed44c3c5518559d8508146a2\",\"impliedFormat\":99},{\"version\":\"00f0ba57e829398d10168b7db1e16217f87933e61bd8612b53a894bd7d6371da\",\"impliedFormat\":99},{\"version\":\"126b20947d9fa74a88bb4e9281462bda05e529f90e22d08ee9f116a224291e84\",\"impliedFormat\":99},{\"version\":\"40d9e43acee39702745eb5c641993978ac40f227475eacc99a83ba893ad995db\",\"impliedFormat\":99},{\"version\":\"8a66b69b21c8de9cb88b4b6d12f655d5b7636e692a014c5aa1bd81745c8c51d5\",\"impliedFormat\":99},{\"version\":\"ebbb846bdd5a78fdacff59ae04cea7a097912aeb1a2b34f8d88f4ebb84643069\",\"impliedFormat\":99},{\"version\":\"7321adb29ffd637acb33ee67ea035f1a97d0aa0b14173291cc2fd58e93296e04\",\"impliedFormat\":99},{\"version\":\"320816f1a4211188f07a782bdb6c1a44555b3e716ce13018f528ad7387108d5f\",\"impliedFormat\":99},{\"version\":\"b2cc8a474b7657f4a03c67baf6bff75e26635fd4b5850675e8cad524a09ddd0c\",\"impliedFormat\":99},{\"version\":\"0d081e9dc251063cc69611041c17d25847e8bdbe18164baaa89b7f1f1633c0ab\",\"impliedFormat\":99},{\"version\":\"a64c25d8f4ec16339db49867ea2324e77060782993432a875d6e5e8608b0de1e\",\"impliedFormat\":99},{\"version\":\"0739310b6b777f3e2baaf908c0fbc622c71160e6310eb93e0d820d86a52e2e23\",\"impliedFormat\":99},{\"version\":\"37b32e4eadd8cd3c263e7ac1681c58b2ac54f3f77bb34c5e4326cc78516d55a9\",\"impliedFormat\":99},{\"version\":\"9b7a8974e028c4ed6f7f9abb969e3eb224c069fd7f226e26fcc3a5b0e2a1eba8\",\"impliedFormat\":99},{\"version\":\"e8100b569926a5592146ed68a0418109d625a045a94ed878a8c5152b1379237c\",\"impliedFormat\":99},{\"version\":\"594201c616c318b7f3149a912abd8d6bdf338d765b7bcbde86bca2e66b144606\",\"impliedFormat\":99},{\"version\":\"03e380975e047c5c6ded532cf8589e6cc85abb7be3629e1e4b0c9e703f2fd36f\",\"impliedFormat\":99},{\"version\":\"fae14b53b7f52a8eb3274c67c11f261a58530969885599efe3df0277b48909e1\",\"impliedFormat\":99},{\"version\":\"c41206757c428186f2e0d1fd373915c823504c249336bdc9a9c9bbdf9da95fef\",\"impliedFormat\":99},{\"version\":\"e961f853b7b0111c42b763a6aa46fc70d06a697db3d8ed69b38f7ba0ae42a62b\",\"impliedFormat\":99},{\"version\":\"3db90f79e36bcb60b3f8de1bc60321026800979c150e5615047d598c787a64b7\",\"impliedFormat\":99},{\"version\":\"639b6fb3afbb8f6067c1564af2bd284c3e883f0f1556d59bd5eb87cdbbdd8486\",\"impliedFormat\":99},{\"version\":\"49795f5478cb607fd5965aa337135a8e7fd1c58bc40c0b6db726adf186dd403f\",\"impliedFormat\":99},{\"version\":\"7d8890e6e2e4e215959e71d5b5bd49482cf7a23be68d48ea446601a4c99bd511\",\"impliedFormat\":99},{\"version\":\"d56f72c4bb518de5702b8b6ae3d3c3045c99e0fd48b3d3b54c653693a8378017\",\"impliedFormat\":99},{\"version\":\"4c9ac40163e4265b5750510d6d2933fb7b39023eed69f7b7c68b540ad960826e\",\"impliedFormat\":99},{\"version\":\"8dfab17cf48e7be6e023c438a9cdf6d15a9b4d2fa976c26e223ba40c53eb8da8\",\"impliedFormat\":99},{\"version\":\"38bdf7ccacfd8e418de3a7b1e3cecc29b5625f90abc2fa4ac7843a290f3bf555\",\"impliedFormat\":99},{\"version\":\"9819e46a914735211fbc04b8dc6ba65152c62e3a329ca0601a46ba6e05b2c897\",\"impliedFormat\":99},{\"version\":\"50f0dc9a42931fb5d65cdd64ba0f7b378aedd36e0cfca988aa4109aad5e714cb\",\"impliedFormat\":99},{\"version\":\"894f23066f9fafccc6e2dd006ed5bd85f3b913de90f17cf1fe15a2eb677fd603\",\"impliedFormat\":99},{\"version\":\"abdf39173867e6c2d6045f120a316de451bbb6351a6929546b8470ddf2e4b3b9\",\"impliedFormat\":99},{\"version\":\"aa2cb4053f948fbd606228195bbe44d78733861b6f7204558bbee603202ee440\",\"impliedFormat\":99},{\"version\":\"6911b41bfe9942ac59c2da1bbcbe5c3c1f4e510bf65cae89ed00f434cc588860\",\"impliedFormat\":99},{\"version\":\"7b81bc4d4e2c764e85d869a8dd9fe3652b34b45c065482ac94ffaacc642b2507\",\"impliedFormat\":99},{\"version\":\"895df4edb46ccdcbce2ec982f5eed292cf7ea3f7168f1efea738ee346feab273\",\"impliedFormat\":99},{\"version\":\"8692bb1a4799eda7b2e3288a6646519d4cebb9a0bddf800085fc1bd8076997a0\",\"impliedFormat\":99},{\"version\":\"239c9e98547fe99711b01a0293f8a1a776fc10330094aa261f3970aaba957c82\",\"impliedFormat\":99},{\"version\":\"34833ec50360a32efdc12780ae624e9a710dd1fd7013b58c540abf856b54285a\",\"impliedFormat\":99},{\"version\":\"647538e4007dcc351a8882067310a0835b5bb8559d1cfa5f378e929bceb2e64d\",\"impliedFormat\":99},{\"version\":\"992d6b1abcc9b6092e5a574d51d441238566b6461ade5de53cb9718e4f27da46\",\"impliedFormat\":99},{\"version\":\"938702305649bf1050bd79f3803cf5cc2904596fc1edd4e3b91033184eae5c54\",\"impliedFormat\":99},{\"version\":\"1e931d3c367d4b96fe043e792196d9c2cf74f672ff9c0b894be54e000280a79d\",\"impliedFormat\":99},{\"version\":\"05bec322ea9f6eb9efcd6458bb47087e55bd688afdd232b78379eb5d526816ed\",\"impliedFormat\":99},{\"version\":\"4c449a874c2d2e5e5bc508e6aa98f3140218e78c585597a21a508a647acd780a\",\"impliedFormat\":99},{\"version\":\"dae15e326140a633d7693e92b1af63274f7295ea94fb7c322d5cbe3f5e48be88\",\"impliedFormat\":99},{\"version\":\"c2b0a869713bca307e58d81d1d1f4b99ebfc7ec8b8f17e80dde40739aa8a2bc6\",\"impliedFormat\":99},{\"version\":\"6e4b4ff6c7c54fa9c6022e88f2f3e675eac3c6923143eb8b9139150f09074049\",\"impliedFormat\":99},{\"version\":\"69559172a9a97bbe34a32bff8c24ef1d8c8063feb5f16a6d3407833b7ee504cf\",\"impliedFormat\":99},{\"version\":\"86b94a2a3edcb78d9bfcdb3b382547d47cb017e71abe770c9ee8721e9c84857f\",\"impliedFormat\":99},{\"version\":\"e3fafafda82853c45c0afc075fea1eaf0df373a06daf6e6c7f382f9f61b2deb3\",\"impliedFormat\":99},{\"version\":\"a4ba4b31de9e9140bc49c0addddbfaf96b943a7956a46d45f894822e12bf5560\",\"impliedFormat\":99},{\"version\":\"d8a7926fc75f2ed887f17bae732ee31a4064b8a95a406c87e430c58578ee1f67\",\"impliedFormat\":99},{\"version\":\"9886ffbb134b0a0059fd82219eba2a75f8af341d98bc6331b6ef8a921e10ec68\",\"impliedFormat\":99},{\"version\":\"c2ead057b70d0ae7b87a771461a6222ebdb187ba6f300c974768b0ae5966d10e\",\"impliedFormat\":99},{\"version\":\"46687d985aed8485ab2c71085f82fafb11e69e82e8552cf5d3849c00e64a00a5\",\"impliedFormat\":99},{\"version\":\"999ca66d4b5e2790b656e0a7ce42267737577fc7a52b891e97644ec418eff7ec\",\"impliedFormat\":99},{\"version\":\"ec948ee7e92d0888f92d4a490fdd0afb27fbf6d7aabebe2347a3e8ac82c36db9\",\"impliedFormat\":99},{\"version\":\"03ef2386c683707ce741a1c30cb126e8c51a908aa0acc01c3471fafb9baaacd5\",\"impliedFormat\":99},{\"version\":\"66a372e03c41d2d5e920df5282dadcec2acae4c629cb51cab850825d2a144cea\",\"impliedFormat\":99},{\"version\":\"ddf9b157bd4c06c2e4646c9f034f36267a0fbd028bd4738214709de7ea7c548b\",\"impliedFormat\":99},{\"version\":\"3e795aac9be23d4ad9781c00b153e7603be580602e40e5228e2dafe8a8e3aba1\",\"impliedFormat\":99},{\"version\":\"98c461ec5953dfb1b5d5bca5fee0833c8a932383b9e651ca6548e55f1e2c71c3\",\"impliedFormat\":99},{\"version\":\"5c42107b46cb1d36b6f1dee268df125e930b81f9b47b5fa0b7a5f2a42d556c10\",\"impliedFormat\":99},{\"version\":\"7e32f1251d1e986e9dd98b6ff25f62c06445301b94aeebdf1f4296dbd2b8652f\",\"impliedFormat\":99},{\"version\":\"2f7e328dda700dcb2b72db0f58c652ae926913de27391bd11505fc5e9aae6c33\",\"impliedFormat\":99},{\"version\":\"3de7190e4d37da0c316db53a8a60096dbcd06d1a50677ccf11d182fa26882080\",\"impliedFormat\":99},{\"version\":\"a9d6f87e59b32b02c861aade3f4477d7277c30d43939462b93f48644fa548c58\",\"impliedFormat\":99},{\"version\":\"2bce8fd2d16a9432110bbe0ba1e663fd02f7d8b8968cd10178ea7bc306c4a5df\",\"impliedFormat\":99},{\"version\":\"798bedbf45a8f1e55594e6879cd46023e8767757ecce1d3feaa78d16ad728703\",\"impliedFormat\":99},{\"version\":\"62723d5ac66f7ed6885a3931dd5cfa017797e73000d590492988a944832e8bc2\",\"impliedFormat\":99},{\"version\":\"03db8e7df7514bf17fc729c87fff56ca99567b9aa50821f544587a666537c233\",\"impliedFormat\":99},{\"version\":\"9b1f311ba4409968b68bf20b5d892dbd3c5b1d65c673d5841c7dbde351bc0d0b\",\"impliedFormat\":99},{\"version\":\"2d1e8b5431502739fe335ceec0aaded030b0f918e758a5d76f61effa0965b189\",\"impliedFormat\":99},{\"version\":\"e725839b8f884dab141b42e9d7ff5659212f6e1d7b4054caa23bc719a4629071\",\"impliedFormat\":99},{\"version\":\"4fa38a0b8ae02507f966675d0a7d230ed67c92ab8b5736d99a16c5fbe2b42036\",\"impliedFormat\":99},{\"version\":\"50ec1e8c23bad160ddedf8debeebc722becbddda127b8fdce06c23eacd3fe689\",\"impliedFormat\":99},{\"version\":\"9a0aea3a113064fd607f41375ade308c035911d3c8af5ae9db89593b5ca9f1f9\",\"impliedFormat\":99},{\"version\":\"8d643903b58a0bf739ce4e6a8b0e5fb3fbdfaacbae50581b90803934b27d5b89\",\"impliedFormat\":99},{\"version\":\"19de2915ccebc0a1482c2337b34cb178d446def2493bf775c4018a4ea355adb8\",\"impliedFormat\":99},{\"version\":\"9be8fc03c8b5392cd17d40fd61063d73f08d0ee3457ecf075dcb3768ae1427bd\",\"impliedFormat\":99},{\"version\":\"a2d89a8dc5a993514ca79585039eea083a56822b1d9b9d9d85b14232e4782cbe\",\"impliedFormat\":99},{\"version\":\"f526f20cae73f17e8f38905de4c3765287575c9c4d9ecacee41cfda8c887da5b\",\"impliedFormat\":99},{\"version\":\"d9ec0978b7023612b9b83a71fee8972e290d02f8ff894e95cdd732cd0213b070\",\"impliedFormat\":99},{\"version\":\"7ab10c473a058ec8ac4790b05cae6f3a86c56be9b0c0a897771d428a2a48a9f9\",\"impliedFormat\":99},{\"version\":\"451d7a93f8249d2e1453b495b13805e58f47784ef2131061821b0e456a9fd0e1\",\"impliedFormat\":99},{\"version\":\"21c56fe515d227ed4943f275a8b242d884046001722a4ba81f342a08dbe74ae2\",\"impliedFormat\":99},{\"version\":\"d8311f0c39381aa1825081c921efde36e618c5cf46258c351633342a11601208\",\"impliedFormat\":99},{\"version\":\"6b50c3bcc92dc417047740810596fcb2df2502aa3f280c9e7827e87896da168a\",\"impliedFormat\":99},{\"version\":\"18a6b318d1e7b31e5749a52be0cf9bbce1b275f63190ef32e2c79db0579328ca\",\"impliedFormat\":99},{\"version\":\"6a2d0af2c27b993aa85414f3759898502aa198301bc58b0d410948fe908b07b0\",\"impliedFormat\":99},{\"version\":\"2da11b6f5c374300e5e66a6b01c3c78ec21b5d3fec0748a28cc28e00be73e006\",\"impliedFormat\":99},{\"version\":\"0729691b39c24d222f0b854776b00530877217bfc30aac1dc7fa2f4b1795c536\",\"impliedFormat\":99},{\"version\":\"ca45bb5c98c474d669f0e47615e4a5ae65d90a2e78531fda7862ee43e687a059\",\"impliedFormat\":99},{\"version\":\"c1c058b91d5b9a24c95a51aea814b0ad4185f411c38ac1d5eef0bf3cebec17dc\",\"impliedFormat\":99},{\"version\":\"3ab0ed4060b8e5b5e594138aab3e7f0262d68ad671d6678bcda51568d4fc4ccc\",\"impliedFormat\":99},{\"version\":\"e2bf1faba4ff10a6020c41df276411f641d3fdce5c6bae1db0ec84a0bf042106\",\"impliedFormat\":99},{\"version\":\"80b0a8fe14d47a71e23d7c3d4dcee9584d4282ef1d843b70cab1a42a4ea1588c\",\"impliedFormat\":99},{\"version\":\"a0f02a73f6e3de48168d14abe33bf5970fdacdb52d7c574e908e75ad571e78f7\",\"impliedFormat\":99},{\"version\":\"c728002a759d8ec6bccb10eed56184e86aeff0a762c1555b62b5d0fa9d1f7d64\",\"impliedFormat\":99},{\"version\":\"586f94e07a295f3d02f847f9e0e47dbf14c16e04ccc172b011b3f4774a28aaea\",\"impliedFormat\":99},{\"version\":\"cfe1a0f4ed2df36a2c65ea6bc235dbb8cf6e6c25feb6629989f1fa51210b32e7\",\"impliedFormat\":99},{\"version\":\"8ba69c9bf6de79c177329451ffde48ddab7ec495410b86972ded226552f664df\",\"impliedFormat\":99},{\"version\":\"15111cbe020f8802ad1d150524f974a5251f53d2fe10eb55675f9df1e82dbb62\",\"impliedFormat\":99},{\"version\":\"782dc153c56a99c9ed07b2f6f497d8ad2747764966876dbfef32f3e27ce11421\",\"impliedFormat\":99},{\"version\":\"cc2db30c3d8bb7feb53a9c9ff9b0b859dd5e04c83d678680930b5594b2bf99cb\",\"impliedFormat\":99},{\"version\":\"46909b8c85a6fd52e0807d18045da0991e3bdc7373435794a6ba425bc23cc6be\",\"impliedFormat\":99},{\"version\":\"e4e511ff63bb6bd69a2a51e472c6044298bca2c27835a34a20827bc3ef9b7d13\",\"impliedFormat\":99},{\"version\":\"2c86f279d7db3c024de0f21cd9c8c2c972972f842357016bfbbd86955723b223\",\"impliedFormat\":99},{\"version\":\"112c895cff9554cf754f928477c7d58a21191c8089bffbf6905c87fe2dc6054f\",\"impliedFormat\":99},{\"version\":\"8cfc293b33082003cacbf7856b8b5e2d6dd3bde46abbd575b0c935dc83af4844\",\"impliedFormat\":99},{\"version\":\"d2c5c53f85ce0474b3a876d76c4fc44ff7bb766b14ed1bf495f9abac181d7f5f\",\"impliedFormat\":99},{\"version\":\"3c523f27926905fcbe20b8301a0cc2da317f3f9aea2273f8fc8d9ae88b524819\",\"impliedFormat\":99},{\"version\":\"9ca0d706f6b039cc52552323aeccb4db72e600b67ddc7a54cebc095fc6f35539\",\"impliedFormat\":99},{\"version\":\"a64909a9f75081342ddd061f8c6b49decf0d28051bc78e698d347bdcb9746577\",\"impliedFormat\":99},{\"version\":\"7d8d55ae58766d0d52033eae73084c4db6a93c4630a3e17f419dd8a0b2a4dcd8\",\"impliedFormat\":99},{\"version\":\"b8b5c8ba972d9ffff313b3c8a3321e7c14523fc58173862187e8d1cb814168ac\",\"impliedFormat\":99},{\"version\":\"9c42c0fa76ee36cf9cc7cc34b1389fbb4bd49033ec124b93674ec635fabf7ffe\",\"impliedFormat\":99},{\"version\":\"6184c8da9d8107e3e67c0b99dedb5d2dfe5ccf6dfea55c2a71d4037caf8ca196\",\"impliedFormat\":99},{\"version\":\"4030ceea7bf41449c1b86478b786e3b7eadd13dfe5a4f8f5fe2eb359260e08b3\",\"impliedFormat\":99},{\"version\":\"7bf516ec5dfc60e97a5bde32a6b73d772bd9de24a2e0ec91d83138d39ac83d04\",\"impliedFormat\":99},{\"version\":\"e6a6fb3e6525f84edf42ba92e261240d4efead3093aca3d6eb1799d5942ba393\",\"impliedFormat\":99},{\"version\":\"45df74648934f97d26800262e9b2af2f77ef7191d4a5c2eb1df0062f55e77891\",\"impliedFormat\":99},{\"version\":\"3fe361e4e567f32a53af1f2c67ad62d958e3d264e974b0a8763d174102fe3b29\",\"impliedFormat\":99},{\"version\":\"28b520acee4bc6911bfe458d1ad3ebc455fa23678463f59946ad97a327c9ab2b\",\"impliedFormat\":99},{\"version\":\"121b39b1a9ad5d23ed1076b0db2fe326025150ef476dccb8bf87778fcc4f6dd7\",\"impliedFormat\":99},{\"version\":\"f791f92a060b52aa043dde44eb60307938f18d4c7ac13df1b52c82a1e658953f\",\"impliedFormat\":99},{\"version\":\"df09443e7743fd6adc7eb108e760084bacdf5914403b7aac5fbd4dc4e24e0c2c\",\"impliedFormat\":99},{\"version\":\"eeb4ff4aa06956083eaa2aad59070361c20254b865d986bc997ee345dbd44cbb\",\"impliedFormat\":99},{\"version\":\"ed84d5043444d51e1e5908f664addc4472c227b9da8401f13daa565f23624b6e\",\"impliedFormat\":99},{\"version\":\"146bf888b703d8baa825f3f2fb1b7b31bda5dff803e15973d9636cdda33f4af3\",\"impliedFormat\":99},{\"version\":\"b4ec8b7a8d23bdf7e1c31e43e5beac3209deb7571d2ccf2a9572865bf242da7c\",\"impliedFormat\":99},{\"version\":\"3fba0d61d172091638e56fba651aa1f8a8500aac02147d29bd5a9cc0bc8f9ec2\",\"impliedFormat\":99},{\"version\":\"a5a57deb0351b03041e0a1448d3a0cc5558c48e0ed9b79b69c99163cdca64ad8\",\"impliedFormat\":99},{\"version\":\"9bcecf0cbc2bfc17e33199864c19549905309a0f9ecc37871146107aac6e05ae\",\"impliedFormat\":99},{\"version\":\"d6a211db4b4a821e93c978add57e484f2a003142a6aef9dbfa1fe990c66f337b\",\"impliedFormat\":99},{\"version\":\"bd4d10bd44ce3f630dd9ce44f102422cb2814ead5711955aa537a52c8d2cae14\",\"impliedFormat\":99},{\"version\":\"08e4c39ab1e52eea1e528ee597170480405716bae92ebe7a7c529f490afff1e0\",\"impliedFormat\":99},{\"version\":\"625bb2bc3867557ea7912bd4581288a9fca4f3423b8dffa1d9ed57fafc8610e3\",\"impliedFormat\":99},{\"version\":\"d1992164ecc334257e0bef56b1fd7e3e1cea649c70c64ffc39999bb480c0ecdf\",\"impliedFormat\":99},{\"version\":\"a53ff2c4037481eb357e33b85e0d78e8236e285b6428b93aa286ceea1db2f5dc\",\"impliedFormat\":99},{\"version\":\"4fe608d524954b6857d78857efce623852fcb0c155f010710656f9db86e973a5\",\"impliedFormat\":99},{\"version\":\"b53b62a9838d3f57b70cc456093662302abb9962e5555f5def046172a4fe0d4e\",\"impliedFormat\":99},{\"version\":\"9866369eb72b6e77be2a92589c9df9be1232a1a66e96736170819e8a1297b61f\",\"impliedFormat\":99},{\"version\":\"43abfbdf4e297868d780b8f4cfdd8b781b90ecd9f588b05e845192146a86df34\",\"impliedFormat\":99},{\"version\":\"582419791241fb851403ae4a08d0712a63d4c94787524a7419c2bc8e0eb1b031\",\"impliedFormat\":99},{\"version\":\"18437eeb932fe48590b15f404090db0ab3b32d58f831d5ffc157f63b04885ee5\",\"impliedFormat\":99},{\"version\":\"0c5eaedf622d7a8150f5c2ec1f79ac3d51eea1966b0b3e61bfdea35e8ca213a7\",\"impliedFormat\":99},{\"version\":\"fac39fc7a9367c0246de3543a6ee866a0cf2e4c3a8f64641461c9f2dac0d8aae\",\"impliedFormat\":99},{\"version\":\"3b9f559d0200134f3c196168630997caedeadc6733523c8b6076a09615d5dec8\",\"impliedFormat\":99},{\"version\":\"932af64286d9723da5ef7b77a0c4229829ce8e085e6bcc5f874cb0b83e8310d4\",\"impliedFormat\":99},{\"version\":\"adeb9278f11f5561157feee565171c72fd48f5fe34ed06f71abf24e561fcaa1e\",\"impliedFormat\":99},{\"version\":\"2269fef79b4900fc6b08c840260622ca33524771ff24fda5b9101ad98ea551f3\",\"impliedFormat\":99},{\"version\":\"73d47498a1b73d5392d40fb42a3e7b009ae900c8423f4088c4faa663cc508886\",\"impliedFormat\":99},{\"version\":\"7efc34cdc4da0968c3ba687bc780d5cacde561915577d8d1c1e46c7ac931d023\",\"impliedFormat\":99},{\"version\":\"3c20a3bb0c50c819419f44aa55acc58476dad4754a16884cef06012d02b0722f\",\"impliedFormat\":99},{\"version\":\"4569abf6bc7d51a455503670f3f1c0e9b4f8632a3b030e0794c61bfbba2d13be\",\"impliedFormat\":99},{\"version\":\"98b2297b4dc1404078a54b61758d8643e4c1d7830af724f3ed2445d77a7a2d57\",\"impliedFormat\":99},{\"version\":\"952ba89d75f1b589e07070fea2d8174332e3028752e76fd46e1c16cc51e6e2af\",\"impliedFormat\":99},{\"version\":\"b6c9a2deefb6a57ff68d2a38d33c34407b9939487fc9ee9f32ba3ecf2987a88a\",\"impliedFormat\":99},{\"version\":\"f6b371377bab3018dac2bca63e27502ecbd5d06f708ad7e312658d3b5315d948\",\"impliedFormat\":99},{\"version\":\"31947dd8f1c8eeb7841e1f139a493a73bd520f90e59a6415375d0d8e6a031f01\",\"impliedFormat\":99},{\"version\":\"95cd83b807e10b1af408e62caf5fea98562221e8ddca9d7ccc053d482283ddda\",\"impliedFormat\":99},{\"version\":\"19287d6b76288c2814f1633bdd68d2b76748757ffd355e73e41151644e4773d6\",\"impliedFormat\":99},{\"version\":\"fc4e6ec7dade5f9d422b153c5d8f6ad074bd9cc4e280415b7dc58fb5c52b5df1\",\"impliedFormat\":99},{\"version\":\"3aea973106e1184db82d8880f0ca134388b6cbc420f7309d1c8947b842886349\",\"impliedFormat\":99},{\"version\":\"765e278c464923da94dda7c2b281ece92f58981642421ae097862effe2bd30fa\",\"impliedFormat\":99},{\"version\":\"de260bed7f7d25593f59e859bd7c7f8c6e6bb87e8686a0fcafa3774cb5ca02d8\",\"impliedFormat\":99},{\"version\":\"b5c341ce978f5777fbe05bc86f65e9906a492fa6b327bda3c6aae900c22e76c6\",\"impliedFormat\":99},{\"version\":\"686ddbfaf88f06b02c6324005042f85317187866ca0f8f4c9584dd9479653344\",\"impliedFormat\":99},{\"version\":\"7f789c0c1db29dd3aab6e159d1ba82894a046bf8df595ac48385931ae6ad83e0\",\"impliedFormat\":99},{\"version\":\"8eb3057d4fe9b59b2492921b73a795a2455ebe94ccb3d01027a7866612ead137\",\"impliedFormat\":99},{\"version\":\"1e43c5d7aee1c5ec20611e28b5417f5840c75d048de9d7f1800d6808499236f8\",\"impliedFormat\":99},{\"version\":\"d42610a5a2bee4b71769968a24878885c9910cd049569daa2d2ee94208b3a7a5\",\"impliedFormat\":99},{\"version\":\"f6ed95506a6ed2d40ed5425747529befaa4c35fcbbc1e0d793813f6d725690fa\",\"impliedFormat\":99},{\"version\":\"a6fcc1cd6583939506c906dff1276e7ebdc38fbe12d3e108ba38ad231bd18d97\",\"impliedFormat\":99},{\"version\":\"ed13354f0d96fb6d5878655b1fead51722b54875e91d5e53ef16de5b71a0e278\",\"impliedFormat\":99},{\"version\":\"1193b4872c1fb65769d8b164ca48124c7ebacc33eae03abf52087c2b29e8c46c\",\"impliedFormat\":99},{\"version\":\"af682dfabe85688289b420d939020a10eb61f0120e393d53c127f1968b3e9f66\",\"impliedFormat\":99},{\"version\":\"0dca04006bf13f72240c6a6a502df9c0b49c41c3cab2be75e81e9b592dcd4ea8\",\"impliedFormat\":99},{\"version\":\"79d6ac4a2a229047259116688f9cd62fda25422dee3ad304f77d7e9af53a41ef\",\"impliedFormat\":99},{\"version\":\"64534c17173990dc4c3d9388d16675a059aac407031cfce8f7fdffa4ee2de988\",\"impliedFormat\":99},{\"version\":\"ba46d160a192639f3ca9e5b640b870b1263f24ac77b6895ab42960937b42dcbb\",\"impliedFormat\":99},{\"version\":\"5e5ddd6fc5b590190dde881974ab969455e7fad61012e32423415ae3d085b037\",\"impliedFormat\":99},{\"version\":\"1c16fd00c42b60b96fe0fa62113a953af58ddf0d93b0a49cb4919cf5644616f0\",\"impliedFormat\":99},{\"version\":\"eb240c0e6b412c57f7d9a9f1c6cd933642a929837c807b179a818f6e8d3a4e44\",\"impliedFormat\":99},{\"version\":\"4a7bde5a1155107fc7d9483b8830099f1a6072b6afda5b78d91eb5d6549b3956\",\"impliedFormat\":99},{\"version\":\"3c1baaffa9a24cc7ef9eea6b64742394498e0616b127ca630aca0e11e3298006\",\"impliedFormat\":99},{\"version\":\"87ca1c31a326c898fa3feb99ec10750d775e1c84dbb7c4b37252bcf3742c7b21\",\"impliedFormat\":99},{\"version\":\"d7bd26af1f5457f037225602035c2d7e876b80d02663ab4ca644099ad3a55888\",\"impliedFormat\":99},{\"version\":\"2ad0a6b93e84a56b64f92f36a07de7ebcb910822f9a72ad22df5f5d642aff6f3\",\"impliedFormat\":99},{\"version\":\"523d1775135260f53f672264937ee0f3dc42a92a39de8bee6c48c7ea60b50b5a\",\"impliedFormat\":99},{\"version\":\"e441b9eebbc1284e5d995d99b53ed520b76a87cab512286651c4612d86cd408e\",\"impliedFormat\":99},{\"version\":\"76f853ee21425c339a79d28e0859d74f2e53dee2e4919edafff6883dd7b7a80f\",\"impliedFormat\":99},{\"version\":\"00cf042cd6ba1915648c8d6d2aa00e63bbbc300ea54d28ed087185f0f662e080\",\"impliedFormat\":99},{\"version\":\"f57e6707d035ab89a03797d34faef37deefd3dd90aa17d90de2f33dce46a2c56\",\"impliedFormat\":99},{\"version\":\"cc8b559b2cf9380ca72922c64576a43f000275c72042b2af2415ce0fb88d7077\",\"impliedFormat\":99},{\"version\":\"1a337ca294c428ba8f2eb01e887b28d080ee4a4307ae87e02e468b1d26af4a74\",\"impliedFormat\":99},{\"version\":\"5a15362fc2e72765a908c0d4dd89e3ab3b763e8bc8c23f19234a709ecfd202fe\",\"impliedFormat\":99},{\"version\":\"2dffdfe62ac8af0943853234519616db6fd8958fc7ff631149fd8364e663f361\",\"impliedFormat\":99},{\"version\":\"5dbdb2b2229b5547d8177c34705272da5a10b8d0033c49efbc9f6efba5e617f2\",\"impliedFormat\":99},{\"version\":\"6fc0498cd8823d139004baff830343c9a0d210c687b2402c1384fb40f0aa461c\",\"impliedFormat\":99},{\"version\":\"8492306a4864a1dc6fc7e0cc0de0ae9279cbd37f3aae3e9dc1065afcdc83dddc\",\"impliedFormat\":99},{\"version\":\"c011b378127497d6337a93f020a05f726db2c30d55dc56d20e6a5090f05919a6\",\"impliedFormat\":99},{\"version\":\"f4556979e95a274687ae206bbab2bb9a71c3ad923b92df241d9ab88c184b3f40\",\"impliedFormat\":99},{\"version\":\"50e82bb6e238db008b5beba16d733b77e8b2a933c9152d1019cf8096845171a4\",\"impliedFormat\":99},{\"version\":\"d6011f8b8bbf5163ef1e73588e64a53e8bf1f13533c375ec53e631aad95f1375\",\"impliedFormat\":99},{\"version\":\"693cd7936ac7acfa026d4bcb5801fce71cec49835ba45c67af1ef90dbfd30af7\",\"impliedFormat\":99},{\"version\":\"195e2cf684ecddfc1f6420564535d7c469f9611ce7a380d6e191811f84556cd2\",\"impliedFormat\":99},{\"version\":\"1dc6b6e7b2a7f2962f31c77f4713f3a5a132bbe14c00db75d557568fe82e4311\",\"impliedFormat\":99},{\"version\":\"add93b1180e9aaac2dae4ef3b16f7655893e2ecbe62bd9e48366c305f0063d89\",\"impliedFormat\":99},{\"version\":\"594bd896fe37c970aafb7a376ebeec4c0d636b62a5f611e2e27d30fb839ad8a5\",\"impliedFormat\":99},{\"version\":\"b1c6a6faf60542ba4b4271db045d7faea56e143b326ef507d2797815250f3afc\",\"impliedFormat\":99},{\"version\":\"8c8b165beb794260f462679329b131419e9f5f35212de11c4d53e6d4d9cbedf6\",\"impliedFormat\":99},{\"version\":\"ee5a4cf57d49fcf977249ab73c690a59995997c4672bb73fcaaf2eed65dbd1b2\",\"impliedFormat\":99},{\"version\":\"f9f36051f138ab1c40b76b230c2a12b3ce6e1271179f4508da06a959f8bee4c1\",\"impliedFormat\":99},{\"version\":\"9dc2011a3573d271a45c12656326530c0930f92539accbec3531d65131a14a14\",\"impliedFormat\":99},{\"version\":\"091521ce3ede6747f784ae6f68ad2ea86bbda76b59d2bf678bcad2f9d141f629\",\"impliedFormat\":99},{\"version\":\"202c2be951f53bafe943fb2c8d1245e35ed0e4dfed89f48c9a948e4d186dd6d4\",\"impliedFormat\":99},{\"version\":\"c618aead1d799dbf4f5b28df5a6b9ce13d72722000a0ec3fe90a8115b1ea9226\",\"impliedFormat\":99},{\"version\":\"9b0bf59708549c3e77fddd36530b95b55419414f88bbe5893f7bc8b534617973\",\"impliedFormat\":99},{\"version\":\"7e216f67c4886f1bde564fb4eebdd6b185f262fe85ad1d6128cad9b229b10354\",\"impliedFormat\":99},{\"version\":\"cd51e60b96b4d43698df74a665aa7a16604488193de86aa60ec0c44d9f114951\",\"impliedFormat\":99},{\"version\":\"b63341fb6c7ba6f2aeabd9fc46b43e6cc2d2b9eec06534cfd583d9709f310ec2\",\"impliedFormat\":99},{\"version\":\"be2af50c81b15bcfe54ad60f53eb1c72dae681c72d0a9dce1967825e1b5830a3\",\"impliedFormat\":99},{\"version\":\"be5366845dfb9726f05005331b9b9645f237f1ddc594c0def851208e8b7d297b\",\"impliedFormat\":99},{\"version\":\"5ddd536aaeadd4bf0f020492b3788ed209a7050ce27abec4e01c7563ff65da81\",\"impliedFormat\":99},{\"version\":\"e243b24da119c1ef0d79af2a45217e50682b139cb48e7607efd66cc01bd9dcda\",\"impliedFormat\":99},{\"version\":\"5b1398c8257fd180d0bf62e999fe0a89751c641e87089a83b24392efda720476\",\"impliedFormat\":99},{\"version\":\"1588b1359f8507a16dbef67cd2759965fc2e8d305e5b3eb71be5aa9506277dff\",\"impliedFormat\":99},{\"version\":\"4c99f2524eee1ec81356e2b4f67047a4b7efaf145f1c4eb530cd358c36784423\",\"impliedFormat\":99},{\"version\":\"b30c6b9f6f30c35d6ef84daed1c3781e367f4360171b90598c02468b0db2fc3d\",\"impliedFormat\":99},{\"version\":\"79c0d32274ccfd45fae74ac61d17a2be27aea74c70806d22c43fc625b7e9f12a\",\"impliedFormat\":99},{\"version\":\"1b7e3958f668063c9d24ac75279f3e610755b0f49b1c02bb3b1c232deb958f54\",\"impliedFormat\":99},{\"version\":\"779d4022c3d0a4df070f94858a33d9ebf54af3664754536c4ce9fd37c6f4a8db\",\"impliedFormat\":99},{\"version\":\"e662f063d46aa8c088edffdf1d96cb13d9a2cbf06bc38dc6fc62b4d125fb7b49\",\"impliedFormat\":99},{\"version\":\"d1d612df1e41c90d9678b07740d13d4f8e6acec2f17390d4ff4be5c889a6d37d\",\"impliedFormat\":99},{\"version\":\"c95933fe140918892d569186f17b70ef6b1162f851a0f13f6a89e8f4d599c5a1\",\"impliedFormat\":99},{\"version\":\"1d8d30677f87c13c2786980a80750ac1e281bdb65aa013ea193766fe9f0edd74\",\"impliedFormat\":99},{\"version\":\"4661673cbc984b8a6ee5e14875a71ed529b64e7f8e347e12c0db4cecc25ad67d\",\"impliedFormat\":99},{\"version\":\"7f980a414274f0f23658baa9a16e21d828535f9eac538e2eab2bb965325841db\",\"impliedFormat\":99},{\"version\":\"20fb747a339d3c1d4a032a31881d0c65695f8167575e01f222df98791a65da9b\",\"impliedFormat\":99},{\"version\":\"dd4e7ebd3f205a11becf1157422f98db675a626243d2fbd123b8b93efe5fb505\",\"impliedFormat\":99},{\"version\":\"43ec6b74c8d31e88bb6947bb256ad78e5c6c435cbbbad991c3ff39315b1a3dba\",\"impliedFormat\":99},{\"version\":\"b27242dd3af2a5548d0c7231db7da63d6373636d6c4e72d9b616adaa2acef7e1\",\"impliedFormat\":99},{\"version\":\"e0ee7ba0571b83c53a3d6ec761cf391e7128d8f8f590f8832c28661b73c21b68\",\"impliedFormat\":99},{\"version\":\"072bfd97fc61c894ef260723f43a416d49ebd8b703696f647c8322671c598873\",\"impliedFormat\":99},{\"version\":\"e70875232f5d5528f1650dd6f5c94a5bed344ecf04bdbb998f7f78a3c1317d02\",\"impliedFormat\":99},{\"version\":\"8e495129cb6cd8008de6f4ff8ce34fe1302a9e0dcff8d13714bd5593be3f7898\",\"impliedFormat\":99},{\"version\":\"37ffe3c12813b6a6d512f7c27b71f3388d03dafa10555ad5094cea393ed3d1f6\",\"impliedFormat\":1},{\"version\":\"38479e9851ea5f43f60baaa6bc894a49dba0a74dd706ce592d32bcb8b59e3be9\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"9592f843d45105b9335c4cd364b9b2562ce4904e0895152206ac4f5b2d1bb212\",\"impliedFormat\":1},{\"version\":\"f9ff719608ace88cae7cb823f159d5fb82c9550f2f7e6e7d0f4c6e41d4e4edb4\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"02b3b77a8d29c9ac409edc1c7a4efa339e2a07e3c5b5e6ea16f108c6eef9e20e\",\"impliedFormat\":99},{\"version\":\"b654edb2d27ce30bdf7498a9ce6ecacbf22a27bafc8008b6ccdc86e8fc21beb9\",\"impliedFormat\":99},{\"version\":\"d5602055e69da5aaf7dafa987dbf645f608f8c66536c7965680fe65420fed2fe\",\"impliedFormat\":99},{\"version\":\"41a5ae482e864a6128e6054e88f1c0e06884793f92aff5c67144fb02d2373079\",\"impliedFormat\":1},{\"version\":\"b8f01261ee1417ef9ca6e0e55e4b66ce3eaf79e711f8d165b27f4d211dc9fb24\",\"impliedFormat\":99},{\"version\":\"9a0cc8dd19c696a14f3763d614bfb8f38f7cb41ff6679c6d2c321fcc12d3afd5\",\"impliedFormat\":99},{\"version\":\"4b274728b5d2b682d9ed98f0e7c227bc65ce2b58c6fe3e5437dc09ee5676e995\",\"affectsGlobalScope\":true,\"impliedFormat\":99},{\"version\":\"e6b8f3cd057e49a50b57a52acc38cff7c224def2249464d489295e0e1d200af6\",\"impliedFormat\":1},{\"version\":\"90cfe1c9c92f079e5b57bce233b4121ff92f40b9c2f6bcba11121636fbbf2ef4\",\"impliedFormat\":99},{\"version\":\"7d470d5054929cb61ab1f1bd67cb6fab6561e6b16f33fd608138889f90d7a5ab\",\"impliedFormat\":99},{\"version\":\"fc389e150c5b0b2fbc6eacc4afff5be6ad03617953558ee9ef5d0f10f4121b2f\",\"impliedFormat\":99},{\"version\":\"fe9dd679e568dc2a0e5e6959f77b53f8bc1f126d46b0d17631347ba57470b808\",\"impliedFormat\":99},{\"version\":\"89f3938d4c43e82ca2d58c940dbb73462a5764ce567fd49054049f891b59d9e4\",\"impliedFormat\":99},{\"version\":\"e848ce7c5a99fcf2f4425eb8175eded771b7783aee1432b6e270d0f33202bd81\",\"impliedFormat\":99},{\"version\":\"3f8fe8c555ee8378b85dd77a5b49f77bf4cf96d5d5a847733b748144bd25f633\",\"impliedFormat\":99},{\"version\":\"d6f593e4b121499ba7b3ea7a3c210562fab5bf812006ab0951603408d7ccd19c\",\"impliedFormat\":99},{\"version\":\"dd7928e76087e0bb029074c20675aeb38eff85513d5f941f440c26d82dd5436c\",\"impliedFormat\":99},{\"version\":\"9001790195bf5cf382c676ded6da44833812e677bb9f31fcb22fa47d389039f4\",\"impliedFormat\":99},{\"version\":\"760c9ccae9612ff1cd7d39c6eb7cdf913ca528a7f89afeee33f6759d62715e43\",\"impliedFormat\":99},\"15f4bda62362f4d1b26aad3ce95a178238791953518d88c7ea97efa9fbe0aeec\",\"fe8ac1eb205da428e803f57aaae8370c322ded8d156dc72df7ec3eb211dd4f8f\",\"cd00c86335658df629cdfabbe169c924535b2b64081d036335991af84ee6d36b\",{\"version\":\"c57b441e0c0a9cbdfa7d850dae1f8a387d6f81cbffbc3cd0465d530084c2417d\",\"impliedFormat\":99},{\"version\":\"26c57c9f839e6d2048d6c25e81f805ba0ca32a28fd4d824399fd5456c9b0575b\",\"impliedFormat\":1},\"6b833cd61f6fe6b343afb06c0d0147a0c2dc29d0ff012833907b99090cc8f6e4\",{\"version\":\"4de4bcd345a7717f57cc4734987374b9d3272abc450ff7bb538467ce0192dce8\",\"impliedFormat\":99},{\"version\":\"6a78643fbbf1b0bd954a53d4edfa217b6a5f92d357fa9cdf8d2ee430f96b9472\",\"impliedFormat\":99},{\"version\":\"50c8072a33d8833eaf692a83ef2c1f1ef13b7d31922cc36037bf35bbfa45f527\",\"impliedFormat\":99},{\"version\":\"2f47d72a64b083c34a172ffc97b7ece747488b717daa3dab794a7116f7ee0570\",\"impliedFormat\":99},{\"version\":\"e9257ac6b4a9450e4098229c2433c8782a2cf2fa8a5b4c295170a1fe146ed5a2\",\"impliedFormat\":1},{\"version\":\"c6114e51dfc109a36a9d36869e417800ec74d4d7a2833af7944f9ff1dc2c946f\",\"impliedFormat\":1},{\"version\":\"a12782c532163f1b735ba56723d9023253b1448dace8f5f3eb4f9cda27ae76b1\",\"impliedFormat\":1},{\"version\":\"ab29ef3914657e223a568b2f6dc0bb9185c02ebe7623ba3e74eb75cbdbc7e103\",\"impliedFormat\":1},{\"version\":\"44d11d5554089c0d7054404eda9fb6e177e2bdf3c636b49a9fb65b1eb52ab527\",\"impliedFormat\":1},{\"version\":\"d2b5d5fbd7028fd6382188bcef1c349af460dbd9662a7392b611ef823dc8e798\",\"impliedFormat\":1},{\"version\":\"35b5fc7a4c21403d043d2695744c72840d07a2774bed7cc4f69da32c00e1d974\",\"impliedFormat\":1},{\"version\":\"3d926c7cd783974e4724c5e18241266e3fc7ad8c09eee844b5cfba54cb984be4\",\"impliedFormat\":1},\"3fee95e13b758417ceb57372fa2025e3bb20871b3fdd49300e91f32b661f841a\",\"4f384ca31f327f7db6c016a4efcb786e8b8f9e5c4308f347438c077cb83c7083\",\"bccfc1f46f249903b47df59518cc5913a86490ef66e378f56924b8b6c5753b0e\",\"6c1c876194016ddccfd6dc4dd5854d4e1c4a3931431a3859e658d61a142be456\",\"deb1bdf2a10578762e87db774cb046cb7f0f850f24a31a66ef6d0a311f71d02f\",\"ac55b6fadb6505ad7d5a54ccf40f40b366bd9a74256531adbd9ffb160fabda38\",\"6558989bbf25a4583f1c402b535a19db946aefae69dbcd449474d45547256612\",\"6fe3bdc38c025d0056f86c21a2e8c80c78895db88e92975db2074df15c7f8495\",\"94cd890f461dee1c1c1e0f6a1933b746b42ec4ad729152567e7c787917f9b69d\",\"2c87672226365e638dfb5948e8ab156618fc4475587ed24dc509b1d00ef27b7e\",{\"version\":\"c580505980a5682a533a8d7fcfc72ff093b1a2a0d8cc0b16f8821700f89a482b\",\"signature\":\"19088037c784d0bb692d3afe4aaf26e2dcbc2d984bd56f251be605d54fbc3272\"},\"dcb478ed1275a00c7f9b57ff21f7db7052b551554ee4e2e35feb9080024d2a94\",\"94b0f01138ac7ccf5066a12bee5fb4916d5dc7e7237aee25447a5e524bd2995d\",\"2372b3604235e8070d64eb81936f7de45e6e95c9dd80b04c2cfe9f5090c1f92d\",{\"version\":\"2fbe402f0ee5aa8ab55367f88030f79d46211c0a0f342becaa9f648bf8534e9d\",\"impliedFormat\":1},{\"version\":\"b94258ef37e67474ac5522e9c519489a55dcb3d4a8f645e335fc68ea2215fe88\",\"impliedFormat\":1},{\"version\":\"024829c0b317972acf4f871bf701525f81896ad74015f1a52d46ae6036205cb9\",\"impliedFormat\":99},{\"version\":\"a9373d52584b48809ffd61d74f5b3dfd127da846e3c4ee3c415560386df3994b\",\"impliedFormat\":99},{\"version\":\"caf4af98bf464ad3e10c46cf7d340556f89197aab0f87f032c7b84eb8ddb24d9\",\"impliedFormat\":99},{\"version\":\"0943a6e4e026d0de8a4969ee975a7283e0627bf41aa4635d8502f6f24365ac9b\",\"impliedFormat\":99},{\"version\":\"1461efc4aefd3e999244f238f59c9b9753a7e3dfede923ebe2b4a11d6e13a0d0\",\"impliedFormat\":99},{\"version\":\"7ec047b73f621c526468517fea779fec2007dd05baa880989def59126c98ef79\",\"impliedFormat\":99},{\"version\":\"8dd450de6d756cee0761f277c6dc58b0b5a66b8c274b980949318b8cad26d712\",\"impliedFormat\":99},{\"version\":\"904d6ad970b6bd825449480488a73d9b98432357ab38cf8d31ffd651ae376ff5\",\"impliedFormat\":99},{\"version\":\"dfcf16e716338e9fe8cf790ac7756f61c85b83b699861df970661e97bf482692\",\"impliedFormat\":99},{\"version\":\"31c30cc54e8c3da37c8e2e40e5658471f65915df22d348990d1601901e8c9ff3\",\"impliedFormat\":99},{\"version\":\"36d8011f1437aecf0e6e88677d933e4fb3403557f086f4ac00c5a4cb6d028ac2\",\"impliedFormat\":99},{\"version\":\"8085954ba165e611c6230596078063627f3656fed3fb68ad1e36a414c4d7599a\",\"impliedFormat\":99},{\"version\":\"2c57db2bf2dbd9e8ef4853be7257d62a1cb72845f7b976bb4ee827d362675f96\",\"impliedFormat\":99},{\"version\":\"6b5f886fe41e2e767168e491fe6048398ed6439d44e006d9f51cc31265f08978\",\"impliedFormat\":99},{\"version\":\"56a87e37f91f5625eb7d5f8394904f3f1e2a90fb08f347161dc94f1ae586bdd0\",\"impliedFormat\":99},{\"version\":\"6b863463764ae572b9ada405bf77aac37b5e5089a3ab420d0862e4471051393b\",\"impliedFormat\":99},{\"version\":\"68b6a7501a56babd7bcd840e0d638ee7ec582f1e70b3c36ebf32e5e5836913c8\",\"impliedFormat\":99},{\"version\":\"89783bd45ab35df55203b522f8271500189c3526976af533a599a86caaf31362\",\"impliedFormat\":99},{\"version\":\"6da2e0928bdab05861abc4e4abebea0c7cf0b67e25374ba35a94df2269563dd8\",\"impliedFormat\":99},{\"version\":\"e7b00bec016013bcde74268d837a8b57173951add2b23c8fd12ffe57f204d88f\",\"impliedFormat\":99},{\"version\":\"26e6c521a290630ea31f0205a46a87cab35faac96e2b30606f37bae7bcda4f9d\",\"impliedFormat\":99},{\"version\":\"71acd198e19fa38447a3cbc5c33f2f5a719d933fccf314aaff0e8b0593271324\",\"impliedFormat\":99},{\"version\":\"044047026c70439867589d8596ffe417b56158a1f054034f590166dd793b676b\",\"impliedFormat\":99},{\"version\":\"89ad9a4e8044299f356f38879a1c2176bc60c997519b442c92cc5a70b731a360\",\"impliedFormat\":99},{\"version\":\"fd4f58cd6b5fc8ce8af0d04bfef5142f15c4bafaac9a9899c6daa056f10bb517\",\"impliedFormat\":99},{\"version\":\"2a00cea77767cb26393ee6f972fd32941249a0d65b246bfcb20a780a2b919a21\",\"impliedFormat\":99},{\"version\":\"440cb5b34e06fabe3dcb13a3f77b98d771bf696857c8e97ce170b4f345f8a26b\",\"impliedFormat\":99},{\"version\":\"5bc7f0946c94e23765bd1b8f62dc3ab65d7716285ca7cf45609f57777ddb436f\",\"impliedFormat\":99},{\"version\":\"7d5a5e603a68faea3d978630a84cacad7668f11e14164c4dd10224fa1e210f56\",\"impliedFormat\":99},{\"version\":\"2535fc1a5fe64892783ff8f61321b181c24f824e688a4a05ae738da33466605b\",\"impliedFormat\":99},{\"version\":\"cbfd5ef0c8fdb4983202252b5f5758a579f4500edc3b9ad413da60cffb5c3564\",\"impliedFormat\":99},{\"version\":\"9f7a3c434912fd3feb87af4aabdf0d1b614152ecb5e7b2aa1fff3429879cdd51\",\"impliedFormat\":99},{\"version\":\"99d1a601593495371e798da1850b52877bf63d0678f15722d5f048e404f002e4\",\"impliedFormat\":99},{\"version\":\"1179ef8174e0e4a09d35576199df04803b1db17c0fb35b9326442884bc0b0cce\",\"impliedFormat\":99},{\"version\":\"9c580c6eae94f8c9a38373566e59d5c3282dc194aa266b23a50686fe10560159\",\"impliedFormat\":99},{\"version\":\"cc3738ba01d9af5ba1206a313896837ff8779791afcd9869e582783550f17f38\",\"impliedFormat\":99},{\"version\":\"a80ec72f5e178862476deaeed532c305bdfcd3627014ae7ac2901356d794fc93\",\"impliedFormat\":99},{\"version\":\"4a5aa16151dbec524bb043a5cbce2c3fec75957d175475c115a953aca53999a9\",\"impliedFormat\":99},{\"version\":\"7a14bf21ae8a29d64c42173c08f026928daf418bed1b97b37ac4bb2aa197b89b\",\"impliedFormat\":99},{\"version\":\"c5013d60cbff572255ccc87c314c39e198c8cc6c5aa7855db7a21b79e06a510f\",\"impliedFormat\":99},{\"version\":\"69ec8d900cfec3d40e50490fedbbea5c1b49d32c38adbc236e73a3b8978c0b11\",\"impliedFormat\":99},{\"version\":\"7fd629484ba6772b686885b443914655089246f75a13dd685845d0abae337671\",\"impliedFormat\":99},{\"version\":\"13dcccb62e8537329ac0448f088ab16fe5b0bbed71e56906d28d202072759804\",\"impliedFormat\":99},{\"version\":\"233267a4a036c64aee95f66a0d31e3e0ef048cccc57dd66f9cf87582b38691e4\",\"impliedFormat\":99},{\"version\":\"ccb9fbe369885d02cf6c2b2948fb5060451565d37b04356bbe753807f98e0682\",\"impliedFormat\":99},\"669a78cfd394edc666ca132480ad59a98d0c2d511cfe7ce0a871763dd092e0db\",\"e659bc33475e46e65e2e5ef7ed719d4bfcc3c9e2c6d813888b3a3787d0f937ac\",\"dd66b826fd8a23603542d0203c157dc4503d541f714b2ea0ea70658770b77b3c\",\"621a57380f211809f016427053c73d59a4f446b19471d6e12e9b4d9e9f9eb05d\",{\"version\":\"1dfdec0ec9c299625d20c5cb8f96e2a801c81d91669c6245f520e8734a92fb3d\",\"impliedFormat\":1},\"822ad0bc985429a867cd9f1e174adb8d6bee7d6da44e6ef43c60fe587e1b9c3b\",\"4c8c7a85930e8fa2cc518f271ac7534910c153aad2231432eb56217eabc3e195\",{\"version\":\"bd15a9604f3a4d4064818eca97d5b0211068e11328731106a0a60068c3bbbcd9\",\"impliedFormat\":1},{\"version\":\"87751d98eb135aedd77ca8289e70ce0f389ebd5ca966f97e59bc11b05876111b\",\"impliedFormat\":1},{\"version\":\"e361e681415c6e7f95315b710f61fcce578b3afe23e494a63ad33b96b77f0743\",\"impliedFormat\":1},{\"version\":\"e83383e87a2803244a8b657acc569942483e308cdca92591ae18fcd38759df4f\",\"impliedFormat\":99},\"7ef8dbf3f8bdf6dfe43fe5bb57b18460e8ebc6a3893259d6b582e192faeec2b8\",\"80679d31c47f6570fb708524682a47340da5b6c3a1327fff7d45e7c242ecdbe5\",{\"version\":\"264f935450101e4b000eb351cf75c9d799ca20a278b260a9e5770303b5f2b6a3\",\"impliedFormat\":99},{\"version\":\"997a9f469f23a302280c987e2165d0fb3b729d8d11401f32afadbc2ec1a3d6c8\",\"impliedFormat\":99},{\"version\":\"76b08f2b7104cf38a46555a0bb3ee6852ffd70ec64d67110876b963d330793d1\",\"impliedFormat\":99},{\"version\":\"690c045f8c226e49a63670dc89caf4f323b9508673994c446e0473ba606deea6\",\"impliedFormat\":99},{\"version\":\"e6540d1449216d3718c16d3b6b2b2e3dba6655fbe490458e9e380b71d66431d3\",\"affectsGlobalScope\":true,\"impliedFormat\":99},{\"version\":\"e29c3246bccba476f4285c89ea0c026b6bfdf9e3d15b6edf2d50e7ea1a59ecfb\",\"impliedFormat\":99},{\"version\":\"3bbc718988d8e71dfd6e66190184211e0026b363c6bc75463a8693c1b593b0ed\",\"impliedFormat\":99},{\"version\":\"89121c1bf2990f5219bfd802a3e7fc557de447c62058d6af68d6b6348d64499a\",\"impliedFormat\":1},{\"version\":\"79b4369233a12c6fa4a07301ecb7085802c98f3a77cf9ab97eee27e1656f82e6\",\"impliedFormat\":1},{\"version\":\"5c5d901a999dfe64746ef4244618ae0628ac8afdb07975e3d5ed66e33c767ed0\",\"impliedFormat\":99},{\"version\":\"85d08536e6cd9787f82261674e7d566421a84d286679db1503432a6ccf9e9625\",\"impliedFormat\":99},{\"version\":\"5702b3c2f5d248290ed99419d77ca1cc3e6c29db5847172377659c50e6303768\",\"impliedFormat\":99},{\"version\":\"9764b2eb5b4fc0b8951468fb3dbd6cd922d7752343ef5fbf1a7cd3dfcd54a75e\",\"impliedFormat\":99},{\"version\":\"1fc2d3fe8f31c52c802c4dee6c0157c5a1d1f6be44ece83c49174e316cf931ad\",\"impliedFormat\":99},{\"version\":\"dc4aae103a0c812121d9db1f7a5ea98231801ed405bf577d1c9c46a893177e36\",\"impliedFormat\":99},{\"version\":\"106d3f40907ba68d2ad8ce143a68358bad476e1cc4a5c710c11c7dbaac878308\",\"impliedFormat\":99},{\"version\":\"42ad582d92b058b88570d5be95393cf0a6c09a29ba9aa44609465b41d39d2534\",\"impliedFormat\":99},{\"version\":\"36e051a1e0d2f2a808dbb164d846be09b5d98e8b782b37922a3b75f57ee66698\",\"impliedFormat\":99},{\"version\":\"d4a22007b481fe2a2e6bfd3a42c00cd62d41edb36d30fc4697df2692e9891fc8\",\"impliedFormat\":1},{\"version\":\"a510938c29a2e04183c801a340f0bbb5a0ae091651bd659214a8587d710ddfbb\",\"impliedFormat\":99},{\"version\":\"07bcf85b52f652572fc2a7ec58e6de5dd4fcaf9bbc6f4706b124378cedcbb95c\",\"impliedFormat\":99},{\"version\":\"4368a800522ca3dd131d3bbc05f2c46a8b7d612eefca41d5c2e5ac0428a45582\",\"impliedFormat\":99},{\"version\":\"720e56f06175c21512bcaeed59a4d4173cd635ea7b4df3739901791b83f835b9\",\"impliedFormat\":99},{\"version\":\"349949a8894257122f278f418f4ee2d39752c67b1f06162bb59747d8d06bbc51\",\"impliedFormat\":99},{\"version\":\"364832fbef8fb60e1fee868343c0b64647ab8a4e6b0421ca6dafb10dff9979ba\",\"impliedFormat\":99},{\"version\":\"dfe4d1087854351e45109f87e322a4fb9d3d28d8bd92aa0460f3578320f024e9\",\"impliedFormat\":99},{\"version\":\"886051ae2ccc4c5545bedb4f9af372d69c7c3844ae68833ed1fba8cae8d90ef8\",\"impliedFormat\":99},{\"version\":\"3f4e5997cb760b0ef04a7110b4dd18407718e7502e4bf6cd8dd8aa97af8456ff\",\"impliedFormat\":99},{\"version\":\"381b5f28b29f104bbdd130704f0a0df347f2fc6cb7bab89cfdc2ec637e613f78\",\"impliedFormat\":99},{\"version\":\"a52baccd4bf285e633816caffe74e7928870ce064ebc2a702e54d5e908228777\",\"impliedFormat\":99},{\"version\":\"c6120582914acd667ce268849283702a625fee9893e9cad5cd27baada5f89f50\",\"impliedFormat\":99},{\"version\":\"da1c22fbbf43de3065d227f8acbc10b132dfa2f3c725db415adbe392f6d1359f\",\"impliedFormat\":99},{\"version\":\"858880acbe7e15f7e4f06ac82fd8f394dfe2362687271d5860900d584856c205\",\"impliedFormat\":99},{\"version\":\"8dfb1bf0a03e4db2371bafe9ac3c5fb2a4481c77e904d2a210f3fed7d2ad243a\",\"impliedFormat\":99},{\"version\":\"bc840f0c5e7274e66f61212bb517fb4348d3e25ed57a27e7783fed58301591e0\",\"impliedFormat\":99},{\"version\":\"26438d4d1fc8c9923aea60424369c6e9e13f7ce2672e31137aa3d89b7e1ba9af\",\"impliedFormat\":99},{\"version\":\"1ace7207aa2566178c72693b145a566f1209677a2d5e9fb948c8be56a1a61ca9\",\"impliedFormat\":99},{\"version\":\"a776df294180c0fdb62ba1c56a959b0bb1d2967d25b372abefdb13d6eba14caf\",\"impliedFormat\":99},{\"version\":\"6c88ea4c3b86430dd03de268fd178803d22dc6aa85f954f41b1a27c6bb6227f2\",\"impliedFormat\":99},{\"version\":\"11e17a3addf249ae2d884b35543d2b40fabf55ddcbc04f8ee3dcdae8a0ce61eb\",\"impliedFormat\":99},{\"version\":\"4fd8aac8f684ee9b1a61807c65ee48f217bf12c77eb169a84a3ba8ddf7335a86\",\"impliedFormat\":99},{\"version\":\"1d0736a4bfcb9f32de29d6b15ac2fa0049fd447980cf1159d219543aa5266426\",\"impliedFormat\":99},{\"version\":\"11083c0a8f45d2ec174df1cb565c7ba9770878d6820bf01d76d4fedb86052a77\",\"impliedFormat\":99},{\"version\":\"d8e37104ef452b01cefe43990821adc3c6987423a73a1252aa55fb1d9ebc7e6d\",\"impliedFormat\":99},{\"version\":\"f5622423ee5642dcf2b92d71b37967b458e8df3cf90b468675ff9fddaa532a0f\",\"impliedFormat\":99},{\"version\":\"21a942886d6b3e372db0504c5ee277285cbe4f517a27fc4763cf8c48bd0f4310\",\"impliedFormat\":99},{\"version\":\"41a4b2454b2d3a13b4fc4ec57d6a0a639127369f87da8f28037943019705d619\",\"impliedFormat\":99},{\"version\":\"98bed72180140fdf2c9d031d64c9ac9237b2208cbdb7ba172dc6f2d73329f3fd\",\"impliedFormat\":99},{\"version\":\"eed9b5f5a6998abe0b408db4b8847a46eb401c9924ddc5b24b1cede3ebf4ee8c\",\"impliedFormat\":99},{\"version\":\"af85fde8986fdad68e96e871ae2d5278adaf2922d9879043b9313b18fae920b1\",\"impliedFormat\":99},{\"version\":\"8a1f5d2f7cf4bf851cc9baae82056c3316d3c6d29561df28aff525556095554b\",\"impliedFormat\":99},{\"version\":\"6c3741e44c9b0ebd563c8c74dcfb2f593190dfd939266c07874dc093ecb4aa0e\",\"impliedFormat\":99},{\"version\":\"367986e86147da028e1a107cd1c72666a5677d6339d3af294d5e253dfe66ea5a\",\"impliedFormat\":99},{\"version\":\"10ab5b311087399a1a08c27cc72758f3069067b6934407347bd5f83fa2bf8928\",\"impliedFormat\":99},{\"version\":\"a65735a086ae8b401c1c41b51b41546532670c919fd2cedc1606fd186fcee2d7\",\"impliedFormat\":99},{\"version\":\"fe021dbde66bd0d6195d4116dcb4c257966ebc8cfba0f34441839415e9e913e1\",\"impliedFormat\":99},{\"version\":\"d52a4b1cabee2c94ed18c741c480a45dd9fed32477dd94a9cc8630a8bc263426\",\"impliedFormat\":99},{\"version\":\"d059a52684789e6ef30f8052244cb7c52fb786e4066ac415c50642174cc76d14\",\"impliedFormat\":99},{\"version\":\"2ccdfd33a753c18e8e5fe8a1eadefff968531d920bc9cdc7e4c97b0c6d3dcaf8\",\"impliedFormat\":99},{\"version\":\"d64a434d7fb5040dbe7d5f4911145deda53e281b3f1887b9a610defd51b3c1a2\",\"impliedFormat\":99},{\"version\":\"927f406568919fd7cd238ef7fe5e9c5e9ec826f1fff89830e480aff8cfd197da\",\"impliedFormat\":99},{\"version\":\"a77d742410fe78bb054d325b690fda75459531db005b62ba0e9371c00163353c\",\"impliedFormat\":99},{\"version\":\"f8de61dd3e3c4dc193bb341891d67d3979cb5523a57fcacaf46bf1e6284e6c35\",\"impliedFormat\":99},{\"version\":\"addca1bb7478ebc3f1c67b710755acc945329875207a3c9befd6b5cbcab12574\",\"impliedFormat\":99},{\"version\":\"50b565f4771b6b150cbf3ae31eb815c31f15e2e0f45518958a5f4348a1a01660\",\"impliedFormat\":99},{\"version\":\"eaee342ebb3a826a48c87c1af3ec9359ee5452da6e960751fcd5c5dd8ca8d7ea\",\"impliedFormat\":99},{\"version\":\"bc7f70d67697f70e89ef74f6620b9ac0096a3f0ee3cdf2531b4fa08d2af4219d\",\"impliedFormat\":99},{\"version\":\"4056a596190daaaa7268f5465b972915facc5eca90ee6432e90afa130ba2e4ee\",\"impliedFormat\":99},{\"version\":\"aa20728bb08af6288996197b97b5ed7bcfb0b183423bb482a9b25867a5b33c57\",\"impliedFormat\":99},{\"version\":\"5322c3686d3797d415f8570eec54e898f328e59f8271b38516b1366074b499aa\",\"impliedFormat\":99},{\"version\":\"b0aa778c53f491350d81ec58eb3e435d34bef2ec93b496c51d9b50aa5a8a61e5\",\"impliedFormat\":99},{\"version\":\"fa454230c32f38213198cf47db147caf4c03920b3f8904566b29a1a033341602\",\"impliedFormat\":99},{\"version\":\"5571608cd06d2935efe2ed7ba105ec93e5c5d1e822d300e5770a1ad9a065c8b6\",\"impliedFormat\":99},{\"version\":\"6bf8aa6ed64228b4d065f334b8fe11bc11f59952fd15015b690dfb3301c94484\",\"impliedFormat\":99},{\"version\":\"41ae2bf47844e4643ebe68b8e0019af7a87a9daea2d38959a9f7520ada9ad3cb\",\"impliedFormat\":99},{\"version\":\"f4498a2ac4186466abe5f9641c9279a3458fa5992dc10ed4581c265469b118d4\",\"impliedFormat\":99},{\"version\":\"bd09a0e906dae9a9351c658e7d8d6caa9f4df2ba104df650ebca96d1c4f81c23\",\"impliedFormat\":99},{\"version\":\"055ad004f230e10cf1099d08c6f5774c564782bd76fbefbda669ab1ad132c175\",\"impliedFormat\":99},{\"version\":\"12baec7a4e2c3acddd09ab665e0ae262395044396e41ecde616fefdd33dc75ff\",\"impliedFormat\":99},{\"version\":\"a5b88a3dd2d88189df04e242aa103b7d380d6f3226cb709e6231b1714ab32367\",\"impliedFormat\":99},{\"version\":\"e0ae30ef821c679555662ef3b2fe7876550bb882351e7763658e574af8b46c70\",\"impliedFormat\":99},{\"version\":\"7078c77d332326a372c1a2bf1a82aa5d1a75f2ef0aee6ace01c0caf509d682e6\",\"impliedFormat\":99},{\"version\":\"3c655c148cc91a10ac5cd7e037a043225da3df41be908f5ff4970c27f5019e41\",\"impliedFormat\":99},{\"version\":\"1c2895fbfa6cd25406f29fcdd75c2e2105e8c8df1a4944fbba9ccace6211c893\",\"impliedFormat\":99},{\"version\":\"81e8f8a08f31dd6766ef203bfe8d9e1f2fdd42e22ddebba6607c569ee750f611\",\"impliedFormat\":99},{\"version\":\"8cab328fafd8141b097260fa1bb4478477ccb4215b83fe710bb863d639eeaad7\",\"impliedFormat\":99},{\"version\":\"b71c133a200ec0f58e2fed163ffd7195727fa60ad82e2f04b23f3d0358d11c69\",\"impliedFormat\":99},{\"version\":\"2a6056297dcd95be218af4da343508fb6f669b1847a0bd0a61ab565555e9bff4\",\"impliedFormat\":99},{\"version\":\"4f8d052e63e35abab5461f3d2243ffbfcbd5746c82d915f2eec6a56a92f2de2f\",\"impliedFormat\":99},{\"version\":\"ea80607028bdbddc6cedd31518df127b1c1d8d36e61602c1ab087a143f6cf35e\",\"impliedFormat\":99},{\"version\":\"190526c884bd366f0286e83f341623be7a7ff3c4d8693d565aaf5d830c5da81c\",\"impliedFormat\":99},{\"version\":\"10514d44b1341ca2eed6ce145b5be548cd22b64a00ec35c25e52088cecc3c71e\",\"impliedFormat\":99},{\"version\":\"b71d05a8d89c62d2e9110b16a413ccbf72a6c6c745a46b1c98684a3f5a11d9af\",\"impliedFormat\":99},{\"version\":\"084f53ba42c54c0a929a9bbe3d0a8083214b629bce53e0eb1ddbe952e17e0943\",\"impliedFormat\":99},{\"version\":\"dcea451fd572ddd0ed46c322042eaa0bfcf9ec27eb3c6253d60903a58463c78c\",\"impliedFormat\":99},{\"version\":\"d2bc6aceb7e558385033d069e9b6263df719a54d17f2a9672c9c675e106c4ff2\",\"impliedFormat\":99},{\"version\":\"3e9f400911379b8eba9a2a1346fa1cce3cc21ee2587cedb14c0636d2956ec3a5\",\"impliedFormat\":99},{\"version\":\"2cab545dabda94fe5419bd6bdfae4d9aabd6f40b46bb0040c417ef570b32b13f\",\"impliedFormat\":99},{\"version\":\"d0b92629d56e8bf11a5b5391daf8cb09488e4840bd17b0847760321e314748c4\",\"impliedFormat\":99},{\"version\":\"d6b3c97a7d31d1ea76c8680ff11b0b07185e1f6222d3e6f29d7a13b6911127ab\",\"impliedFormat\":99},{\"version\":\"0ddd9ab937cef821a908be8581c73874105b34a61b6debaaa89c5c5cf25594a1\",\"impliedFormat\":99},{\"version\":\"f8f112dfc0427d63a94413a12bca3cc858b4359e70e1e30d3f3709bef76f1c52\",\"impliedFormat\":99},{\"version\":\"26c42de693907fa56842e6ebf39007334e1c6dbae30388a71d715179a527edb2\",\"impliedFormat\":99},{\"version\":\"cceba3e6626d0d5a6b743b5f7f150f92323173a42d25269e731080a3ff36d31a\",\"impliedFormat\":99},{\"version\":\"698f3f181d2eb5a09ba7cbd78e9ffd6bd21b48873972f64764ff774c86e411c1\",\"impliedFormat\":99},{\"version\":\"81d272285c96d6be6287c6217a6f7fd9daaa86bdb9b0592f3831bbcf149ec6c2\",\"impliedFormat\":99},{\"version\":\"3fbed1bc84290ae6bad246a668e41aa6308cb9f54c499b29297ff639a9833b7e\",\"impliedFormat\":99},{\"version\":\"67c4642b72f0769f2900ed67a9b004165a0821359f79dab12c9f686df9c4319c\",\"impliedFormat\":99},{\"version\":\"02933889d4b0d3b26342b240f71c10f0ffb75fa66742b7e4c3884e6e3e134908\",\"impliedFormat\":99},{\"version\":\"55555ba42cc8a2104c5bfe9fa1f86d2db480f7db20648eaca3d24aed203af504\",\"impliedFormat\":99},{\"version\":\"a6b1ed3b5c123319781d5ea0e22ff29ccb13620226b6ca95c3358eeef802f57d\",\"impliedFormat\":99},{\"version\":\"b71b43f6718d950985da7c703896d50e387bfca17da86ad5d285ffa260ac452c\",\"impliedFormat\":99},{\"version\":\"7aeb46eb0a4c9cdcdec142780cb9adf1726f9a321ae7e648b6b164a9438beaf5\",\"impliedFormat\":99},{\"version\":\"c53e4574eb73e3f8ba12ee417601cafa27b7f0326d80caa101e1396bc6f57a66\",\"impliedFormat\":99},{\"version\":\"327f4c840a0bf72609a9b9f367c443adf6dcfd193e8ec97ea50ca3e91ab57dec\",\"impliedFormat\":99},{\"version\":\"40efa8b89da5f84d101a2e11d3bde07ceba84d2151a46362d51af9fcac38a300\",\"impliedFormat\":99},{\"version\":\"7584bebefa39b6befd2f53b682a7f78837c2bb156cdfdf45967e8849e0d55dd8\",\"impliedFormat\":99},{\"version\":\"86f06b955ff10b08571f46f3ced5cbb8b13c1ad049d5532f7ee2956ac3f2beb1\",\"impliedFormat\":99},{\"version\":\"85b303f253aa1ace057cb95c4877ab0284733266b2659721776c8bce3123ee52\",\"impliedFormat\":99},{\"version\":\"d986ec1523a115dee85f6b0887b6f2fd9c442963f80bbb4ee0fc4283668c370f\",\"impliedFormat\":99},{\"version\":\"94599e64d23ffdf775213a6d58dc5c168fdccc183b99a25638fad6cac404aed9\",\"impliedFormat\":99},{\"version\":\"51fe1fa188fcd12d95d6bb8585f562e402ecf1cfe20468bf26b16705f601a5d3\",\"impliedFormat\":99},{\"version\":\"dd00452f03f26720d7bae5313580be4b0ce2c61d9adb99c62a00a8ed01aff94c\",\"impliedFormat\":99},{\"version\":\"623cfc15d5f796ad146ff31ab9f2c6b0f9a87546df41ad899ca250a49602cb73\",\"impliedFormat\":99},{\"version\":\"153638de5f15083b920bc363ce6466625d28507e2c6ca321404d10ad394a8c68\",\"impliedFormat\":99},{\"version\":\"aa8e3b222985e2dff4f056802cb68ef6e798f60761758a0ce2aa9be8ba964a08\",\"impliedFormat\":99},{\"version\":\"f2f1da2c3c170f8f88b158926c9c36f3cdb9e178dfb82c76ccfcc4ce49607f7d\",\"impliedFormat\":99},{\"version\":\"79926764aeff0993b4c5572388a26a0c8840b7019e95d0c413f8bfa28faa9a11\",\"impliedFormat\":99},{\"version\":\"f0e4415f13da8dbcb3ca10e18aa243d97bf3448a75f14fe2ade07a3462684539\",\"impliedFormat\":99},{\"version\":\"407894b66b2b266e4ac9f85f9d561132461b22e912a9391f86a0f5e49929d468\",\"impliedFormat\":99},{\"version\":\"5c26337066b61988acd1cde0a41da915efa0cbd4059ca78098e356b52a61451f\",\"impliedFormat\":99},{\"version\":\"f62d26fd65b2f0fcab2bd16f15e641a69c8b988cfe278c986bbda25d9b4b9096\",\"impliedFormat\":99},{\"version\":\"a1432e2f9f50696576c7642f8d28eed730b0ea09208e015d64385ed8eab679ab\",\"impliedFormat\":99},{\"version\":\"2e1807e5fb1e4722f02eebb012b1f0dfb9ffc3c3103dc730e25c379168178010\",\"impliedFormat\":99},{\"version\":\"a853fefc5b7f2491746cf1c612a1eaaa00d459c3196e7ab19c851785264e8795\",\"impliedFormat\":99},{\"version\":\"48a465f5c5355b19f0c392918c93f8b7e49aaaedb95b3834d9b4c81e0d1cd344\",\"impliedFormat\":99},{\"version\":\"ae02342d343890e389173008232602886260a423bf0ce4050dc4f069a865387d\",\"impliedFormat\":99},{\"version\":\"3a9add1125746158416c8fe8b07798bfe63dcf27c9fb81b07e110a80357a2f3b\",\"impliedFormat\":99},{\"version\":\"4dc4c65d064c762de00721f3e475c72875d010a12eb00991adca4951003cae1f\",\"impliedFormat\":99},{\"version\":\"cca32394edecf4a3e67183b41246fbfddbc5697d71acf3e838cc89deb69fea1d\",\"impliedFormat\":99},{\"version\":\"900d74897b9f1bb17578172e82429afd0ab189a2dafaafed2c76b288573a1c8c\",\"impliedFormat\":99},{\"version\":\"b689b467912ca0ff089a178fc46d28080324dbef440da3994d5b58c79207fa0e\",\"impliedFormat\":99},{\"version\":\"15fe687c59d62741b4494d5e623d497d55eb38966ecf5bea7f36e48fc3fbe15e\",\"impliedFormat\":1},{\"version\":\"2c2abae36b5a9319abf6a057f34bf2cc63d93b5135b4e8471eaa9519d24e51d5\",\"impliedFormat\":99},{\"version\":\"9d8d29eb1604f8f81839170f35609b3c8deaf84a1261e1f5c293bdb574f36297\",\"impliedFormat\":99},{\"version\":\"b1538a92b9bae8d230267210c5db38c2eb6bdb352128a3ce3aa8c6acf9fc9622\",\"impliedFormat\":1},{\"version\":\"469532350a366536390c6eb3bde6839ec5c81fe1227a6b7b6a70202954d70c40\",\"impliedFormat\":1},{\"version\":\"17c9f569be89b4c3c17dc17a9fb7909b6bab34f73da5a9a02d160f502624e2e8\",\"impliedFormat\":1},{\"version\":\"003df7b9a77eaeb7a524b795caeeb0576e624e78dea5e362b053cb96ae89132a\",\"impliedFormat\":1},{\"version\":\"7ba17571f91993b87c12b5e4ecafe66b1a1e2467ac26fcb5b8cee900f6cf8ff4\",\"impliedFormat\":1},{\"version\":\"6fc1a4f64372593767a9b7b774e9b3b92bf04e8785c3f9ea98973aa9f4bbe490\",\"impliedFormat\":1},{\"version\":\"d30e67059f5c545c5f8f0cc328a36d2e03b8c4a091b4301bc1d6afb2b1491a3a\",\"impliedFormat\":1},{\"version\":\"8b219399c6a743b7c526d4267800bd7c84cf8e27f51884c86ad032d662218a9d\",\"impliedFormat\":1},{\"version\":\"bad6d83a581dbd97677b96ee3270a5e7d91b692d220b87aab53d63649e47b9ad\",\"impliedFormat\":1},{\"version\":\"324726a1827e34c0c45c43c32ecf73d235b01e76ef6d0f44c2c0270628df746a\",\"impliedFormat\":1},{\"version\":\"54e79224429e911b5d6aeb3cf9097ec9fd0f140d5a1461bbdece3066b17c232c\",\"impliedFormat\":1},{\"version\":\"e1b666b145865bc8d0d843134b21cf589c13beba05d333c7568e7c30309d933a\",\"impliedFormat\":1},{\"version\":\"ff09b6fbdcf74d8af4e131b8866925c5e18d225540b9b19ce9485ca93e574d84\",\"impliedFormat\":1},{\"version\":\"c836b5d8d84d990419548574fc037c923284df05803b098fe5ddaa49f88b898a\",\"impliedFormat\":1},{\"version\":\"3a2b8ed9d6b687ab3e1eac3350c40b1624632f9e837afe8a4b5da295acf491cb\",\"impliedFormat\":1},{\"version\":\"189266dd5f90a981910c70d7dfa05e2bca901a4f8a2680d7030c3abbfb5b1e23\",\"impliedFormat\":1},{\"version\":\"5ec8dcf94c99d8f1ed7bb042cdfa4ef6a9810ca2f61d959be33bcaf3f309debe\",\"impliedFormat\":1},{\"version\":\"a80e02af710bdac31f2d8308890ac4de4b6a221aafcbce808123bfc2903c5dc2\",\"impliedFormat\":1},{\"version\":\"d5895252efa27a50f134a9b580aa61f7def5ab73d0a8071f9b5bf9a317c01c2d\",\"impliedFormat\":1},{\"version\":\"2c378d9368abcd2eba8c29b294d40909845f68557bc0b38117e4f04fc56e5f9c\",\"impliedFormat\":1},{\"version\":\"0f345151cece7be8d10df068b58983ea8bcbfead1b216f0734037a6c63d8af87\",\"impliedFormat\":1},{\"version\":\"37fd7bde9c88aa142756d15aeba872498f45ad149e0d1e56f3bccc1af405c520\",\"impliedFormat\":1},{\"version\":\"2a920fd01157f819cf0213edfb801c3fb970549228c316ce0a4b1885020bad35\",\"impliedFormat\":1},{\"version\":\"56208c500dcb5f42be7e18e8cb578f257a1a89b94b3280c506818fed06391805\",\"impliedFormat\":1},{\"version\":\"0c94c2e497e1b9bcfda66aea239d5d36cd980d12a6d9d59e66f4be1fa3da5d5a\",\"impliedFormat\":1},{\"version\":\"a67774ceb500c681e1129b50a631fa210872bd4438fae55e5e8698bac7036b19\",\"impliedFormat\":1},{\"version\":\"bb220eaac1677e2ad82ac4e7fd3e609a0c7b6f2d6d9c673a35068c97f9fcd5cd\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"dd8936160e41420264a9d5fade0ff95cc92cab56032a84c74a46b4c38e43121e\",\"impliedFormat\":1},{\"version\":\"1f366bde16e0513fa7b64f87f86689c4d36efd85afce7eb24753e9c99b91c319\",\"impliedFormat\":1},{\"version\":\"421c3f008f6ef4a5db2194d58a7b960ef6f33e94b033415649cd557be09ef619\",\"impliedFormat\":1},{\"version\":\"57568ff84b8ba1a4f8c817141644b49252cc39ec7b899e4bfba0ec0557c910a0\",\"impliedFormat\":1},{\"version\":\"e6f10f9a770dedf552ca0946eef3a3386b9bfb41509233a30fc8ca47c49db71c\",\"impliedFormat\":1},{\"version\":\"4ba724e66bdfc294cc8e87499b42f63cdc3b354122705d8d2c7e1371fecc3e93\",\"impliedFormat\":99},{\"version\":\"b79e98f1f013fe611b0076d6628e0766c3fd7ceff79fff061b100563486b2feb\",\"impliedFormat\":99},{\"version\":\"5aa8b50a334af93ff1bb3da686178871a7e27e03791d07fd6107980076ddb90e\",\"impliedFormat\":99},{\"version\":\"62423031f8a01e15a8a7141b5786fd450d57b6a921032366c09c81d11e167306\",\"impliedFormat\":99},{\"version\":\"7879aa1a06fd399f58482958af0b7c4eb6410131d20d07d3699258013d8ff45e\",\"impliedFormat\":99},{\"version\":\"25c1448dafc60e4ee55022d86c9deb322b669b93743a01f415c7f3974e5eb265\",\"impliedFormat\":99},{\"version\":\"43ac78f8e0c5defecc2e501f77d1e61d078c79975af401702c16b9828ab12ca8\",\"impliedFormat\":99},{\"version\":\"ce7fb4fdf24dcaebb1fdcf2f36cf954da3b53d8f06fca67b89ef50898eeca489\",\"impliedFormat\":99},{\"version\":\"fb83d38e7427dd1c7b1e63e2445d99af8f4544bc2d933ba2ecd6ddc87960e3a0\",\"impliedFormat\":99},{\"version\":\"dcab5635cd67fbabb85fff25d7cebbe7f5ab4aaecba0d076376a467a628a892d\",\"impliedFormat\":99},{\"version\":\"c8698ce13a61d68036ac8eb97141c168b619d80f3c1a5c6c435fe5b7700a7ece\",\"impliedFormat\":99},{\"version\":\"7b90746131607190763112f9edb5f3319b6b2a695c2fa7a8d0227d9486e934c7\",\"impliedFormat\":99},{\"version\":\"269b06e0b7605316080b5e34602dee2f228400076950bd58c56ffad1300a1ff1\",\"impliedFormat\":99},{\"version\":\"2000d0ab5e4203f1909f85426212757fbcd94a0e91cfb4a47d44c297a8545379\",\"impliedFormat\":99},{\"version\":\"73e7fad963b6273a64a9db125286890871f8cf11c8e8a0c6ace94f2fa476c260\",\"impliedFormat\":99},{\"version\":\"8496476b1f719d9f197069fe18932133870a73e3aacf7e234c460e886e33a04d\",\"impliedFormat\":99},{\"version\":\"3cb5ccb27576538fb71adba1fa647da73fae5d80c6cf6a76e1a229a0a8580ede\",\"impliedFormat\":99},{\"version\":\"e66490a581bea6aeaa5779a10f3b59e2d021a46c1920713ae063baaba89e9a57\",\"impliedFormat\":99},{\"version\":\"aea830b89cbed15feb1a4f82e944a18e4de8cecc8e1fbfaf480946265714e94e\",\"impliedFormat\":99},{\"version\":\"1600536cd61f84efed3bb5e803df52c3fc13b3e1727d3230738476bcb179f176\",\"impliedFormat\":99},{\"version\":\"b350b567766483689603b5df1b91ccaab40bb0b1089835265c21e1c290370e7e\",\"impliedFormat\":99},{\"version\":\"d5a3e982d9d5610f7711be40d0c5da0f06bbb6bd50c154012ac1e6ce534561da\",\"impliedFormat\":99},{\"version\":\"ddbe1301fdf5670f0319b7fb1d2567dc08da0343cb16bf95dc63108922c781dc\",\"impliedFormat\":99},{\"version\":\"ff5321e692b2310e1eb714e2bc787d30c45f7b47b96665549953ccfd5b0b6d55\",\"impliedFormat\":99},{\"version\":\"8a0e4db16deae4e4d8c91ee6e5027b85899b6431ace9f2d5cec7d590170d83cd\",\"impliedFormat\":99},{\"version\":\"c6d6182d16bf45a4875bf8e64a755eb3997faeb1dfc7ef6c5ead3096f4922cb6\",\"impliedFormat\":99},{\"version\":\"d5585e9bae6909f69918ea370d6003887ea379663001afccca14c0f1f9e3243f\",\"impliedFormat\":99},{\"version\":\"2103118e29cf7d25535bde1bae30667a27891aae1e6898df5f42fd84775ae852\",\"impliedFormat\":99},{\"version\":\"58c28d9cb640cac0b9a3e46449e134b137ec132c315f8cb8041a1132202c6ff1\",\"impliedFormat\":99},{\"version\":\"d7efb2609ff11f5b746238d42a621afcfb489a9f26ac31da9dff1ab3c55fc8f3\",\"impliedFormat\":99},{\"version\":\"556b4615c5bf4e83a73cbf5b8670cb9b8fd46ee2439e2da75e869f29e79c4145\",\"impliedFormat\":99},{\"version\":\"51fc38fbb3e2793ec77ef8ffa886530b1fed9118df02943679f1c4a7479f565d\",\"impliedFormat\":99},{\"version\":\"03a4f9132fe1ffa58f1889e3a2f8ae047dcb6d0a1a52aa2454de84edc705e918\",\"impliedFormat\":99},{\"version\":\"437dd98ff7257140b495b4ff5911da0363a26f2d59df1042d6849ecb42c1ee84\",\"impliedFormat\":99},{\"version\":\"8345eadc4cceddc707e9e386c4ad19df40ed6a1e47f07e3f44d8ecf4fe06d37f\",\"impliedFormat\":99},{\"version\":\"2df69f11080a8916d3d570f75ddf5c51e701fc408fd1f07629c2f9a20f37f1ea\",\"impliedFormat\":99},{\"version\":\"2c19fb4e886b618b989d1f28d4ee4bee16296f0521d800b93fd20e7c013344fe\",\"impliedFormat\":99},{\"version\":\"61085fe7d6889b5fc65c30c49506a240f5fbb1d51024f4b79eef12254e374e76\",\"impliedFormat\":99},{\"version\":\"aad42bbf26fe21915c6a0f90ef5c8f1e9972771a22f0ea0e0f3658e696d01717\",\"impliedFormat\":99},{\"version\":\"7a504df16e0b4b65f4c1f20f584df45bc75301e8e35c8a800bcdec83fc59e340\",\"impliedFormat\":99},{\"version\":\"37077b8bf4928dcc3effd21898b9b54fa7b4b55ff40d2e0df844c11aed58197b\",\"impliedFormat\":99},{\"version\":\"a508144cd34322c6ad98f75b909ba18fa764db86c32e7098f6a786a5dcca7e03\",\"impliedFormat\":99},{\"version\":\"021bf96e46520559d2d9cc3d6d12fb03ca82598e910876fdb7ee2f708add4ce9\",\"impliedFormat\":99},{\"version\":\"44cbc604b6e5c96d23704a6b3228bd7ca970b8b982f7b240b1c6d975b2753e4c\",\"impliedFormat\":99},{\"version\":\"7bfb0450c4de8f1d62b11e05bbfdc3b25ccb9d0c39ae730233b6c93d1d47aea2\",\"impliedFormat\":99},{\"version\":\"51696f7c8c3794dcf5f0250f43eda013d588f0db74b102def76d3055e039afff\",\"impliedFormat\":99},{\"version\":\"1101402feff3c606f37fe36028b998e0da1b00eef9d039275d01390f462d1d69\",\"impliedFormat\":99},{\"version\":\"39d8d14a745c2a567b8c25d24bb06d76dbffc5409ab1f348fde5bc1290abd690\",\"impliedFormat\":99},{\"version\":\"6d9aeea6853ed156d226f2411d82cb1951c8bb81c7a882eeb92083f974f15197\",\"impliedFormat\":99},{\"version\":\"1fed41ee4ba0fb55df2fbf9c26ec1b560179ea6227709742ec83f415cebef33e\",\"impliedFormat\":99},{\"version\":\"d5982015553b9672974a08f12fc21dcee67d812eeb626fcaf19930bc25c2a709\",\"impliedFormat\":99},{\"version\":\"6ad9d297c0feca586c7b55e52dbd5015f0e92001a80105059b092a1d3ecfc105\",\"impliedFormat\":99},{\"version\":\"13fa4f4ee721c2740a26fe7058501c9ba10c34398cdf47ad73431b3951eea4e2\",\"impliedFormat\":99},{\"version\":\"3a9b807bd0e0b0cd0e4b6028bec2301838a8d172bcc7f18f2205b9974c5d1ecc\",\"impliedFormat\":99},{\"version\":\"8c5b994a640ef2a5f6c551d1b53b00fbbd893a1743cbae010e922ac32e207737\",\"impliedFormat\":99},{\"version\":\"688424fbbef17ee891e1066c3fb04d61d0d0f68be31a70123415f824b633720a\",\"impliedFormat\":99},{\"version\":\"25eafa9f24b7d938a895ab15ed5d295bc000187d4a6aa5bfd310f32ba2d4eea5\",\"impliedFormat\":99},{\"version\":\"d9df062c57b3795e2cae045c72a881fb24c4137cea283557669d3e393aa10031\",\"impliedFormat\":99},{\"version\":\"72f4b1dc4c34418935d4d87a90486b86d5450286139e4c25eeee8b905d2886b2\",\"impliedFormat\":99},{\"version\":\"92efd5d38691eece63952e89297adcc9cb4c9b8878d635c76d5473c20489fd4d\",\"impliedFormat\":99},{\"version\":\"a4b4d0ac8882e2d857f76f75ca33694d315715cdc19d275ac37e9ef2a8d8693b\",\"impliedFormat\":99},{\"version\":\"e185a44b6e46dc9621704f471ed0a39b56ce5b5027dbc81949b67cbcb59da7d0\",\"impliedFormat\":99},{\"version\":\"5102e449a65c1f816d6ac1199b683f9ddf21b107f4eec5ce8316e957350d1b8d\",\"impliedFormat\":99},{\"version\":\"73397fcaa8afa955ae1ac27c8ff5473418195ecacc90b275abbac0b8099b7e91\",\"impliedFormat\":99},{\"version\":\"3a8b3e4e8ee1784e46e8151b4b0717b8a22e045b20257ad4491815f7cdb3ab22\",\"impliedFormat\":99},{\"version\":\"823a190056fa78cfe888a24a0679624cfc36cab0ce9cfc875b1856e8a535bc9f\",\"impliedFormat\":99},{\"version\":\"28b5d252374af23b8db3d80154078d76ab4af7635d6f20ec892cf86651bb5f52\",\"impliedFormat\":99},{\"version\":\"d6d72de42c0a81f3d22b71fca1ff348f4bc3a50deb9382ebdfd71214794ec58e\",\"impliedFormat\":99},{\"version\":\"1a4fae85bd066e1f57250ecd3be398f45c0ee35fd639d1a91f2b816ad37cf4db\",\"impliedFormat\":99},{\"version\":\"e8065cc0b1c821d3dcd8b045a03412ab03e6002bbbfd5b379e0a8e3624c1a2f7\",\"impliedFormat\":99},{\"version\":\"8fd5a1b91763e73f5d30ecdfe66da4400b6b6c18af619e7f7230d72e49959935\",\"impliedFormat\":99},{\"version\":\"be02a1d8cdd4905919e1a26ce668a51e726f381ed12e8f4236f000b9f8ec126b\",\"impliedFormat\":99},{\"version\":\"8dd4181760665479df5a7b45c09142c96296fe9dee0f7df9013408b909c508bf\",\"impliedFormat\":99},{\"version\":\"3ea52decded1435d9b57b183b74618922bfc8ef0ac6717280e5657e2a134cd50\",\"impliedFormat\":99},{\"version\":\"3828353b7c352649166506cefb1bc4de2d98591796e4b7afda4650eadefb3c2b\",\"impliedFormat\":99},{\"version\":\"c6fb620f7d3160662e9bae07262b192fd257259220c46b090c84b7e7f02e2da3\",\"impliedFormat\":99},{\"version\":\"2a7bd12de58b9b8cb10dabf6c1eb933b4d4efe1d1b57dcc541f43061d0e0f70b\",\"impliedFormat\":99},{\"version\":\"0e8e5b2568b6b1bebacc2b4a10d84badf973554f069ded173c88c59d74ce7524\",\"impliedFormat\":99},{\"version\":\"f3159181773938d1ecd732e44ce25abe7e5c08dd1d90770e2fd9f8b92fab6c22\",\"impliedFormat\":99},{\"version\":\"a574154c958cdaaee26294e338024932d9cc403bae2d85ff1de76363aad04bbe\",\"impliedFormat\":99},{\"version\":\"5fa60c104a981a5430b937b09b5b9a06ceb392f6bb724d4a2f527c60f6f768b8\",\"impliedFormat\":99},{\"version\":\"006dabdcdcc1f1fa70b71da50791f380603dd2fe2ef3da9dec4f70c8c7a72fd9\",\"impliedFormat\":99},{\"version\":\"bcd511f2a2c83fc41059e90ed7305e7210cbd071752968fd0ca6a591b165ff97\",\"impliedFormat\":99},{\"version\":\"e351fc610efbbdbe1d92a7df4b75e0bc4b7678ee3585f416df1e0cc8894d2b20\",\"impliedFormat\":99},{\"version\":\"33c06a102df241666a34e69fe5f9a6808e575d684fcfcf95886d470517a456cd\",\"impliedFormat\":99},{\"version\":\"404818f4f7cfc01054eeb0a3568da67a02b67b9ed375e745fdc20c2c22ad9f9b\",\"impliedFormat\":99},{\"version\":\"40d820544765762c7770eba3b12c326f01d787fc3584b53cb20ce5dd813d9946\",\"impliedFormat\":99},{\"version\":\"586f4a88fffdfa6f4d2e2fae23d55c946d4aad8c81573aa851b18884b185b67e\",\"impliedFormat\":99},{\"version\":\"ad4b3aa66c7d3c3e7a5fb2126ca0aedafcded91b2d175fca89f50fcb6d3a1258\",\"impliedFormat\":99},{\"version\":\"8e012265839f6acdd4a3321d7fe476c258f49a85ffe15645c5352434b68b6dac\",\"impliedFormat\":99},{\"version\":\"d1a4cb5cbee99a7184dcccd2116d90e3f5b2ae232074dd07a769e372aad0adb1\",\"impliedFormat\":99},\"6768b4f5daf764070ab543dbcb4085b54b11e638aa2f13ea92f1a7e52bdf913d\",\"35f9927fb3137b33e63819893bf8431577e77809218e59b96505463fc1b54d79\",\"73bf7c9637b477dabb89d1c1523fe95810bb1be58f64e7cfdac67a660e0c7101\",{\"version\":\"c4c2d76a02c43f569e2183c140ea255ededb2a2d42b5233f767261b50c14affe\",\"impliedFormat\":99},{\"version\":\"511b0aae76fd029181ba8594aad9eeacac250b38ee8550fc10007db72f18f7e0\",\"impliedFormat\":99},{\"version\":\"5a874f07663fc37d56c6f117823bc339dee0f964e779dc4c8d5f5b8ca175cbf2\",\"impliedFormat\":99},{\"version\":\"01f9bade4ea5db62464fed4f6bda2abc928862000baae48a0f54cfffc1af3cc6\",\"impliedFormat\":99},{\"version\":\"f1ed4b327880fa467f6b7b8a8f0c0a182901213ec4bc732a1de32a24f959424a\",\"impliedFormat\":99},{\"version\":\"1f527f5aa7667cf13cd61a83327ac127bd9be0fe705517bec56abd7f93a3267d\",\"impliedFormat\":99},{\"version\":\"930371ee0f953df416ac187dc69f9d469e1808f05023410d8864ddbe4c877731\",\"impliedFormat\":99},{\"version\":\"fe0150ce20bc36bcc4250e562b951073a27c3665bf58c5c19defcdcb4c124307\",\"impliedFormat\":99},{\"version\":\"1287b82bfb7169da991900975e76543c3c21c42733bee7378e5429cb367e016a\",\"impliedFormat\":99},{\"version\":\"14cb75ba862b72eb71e62062abb678eed961d0c3cb5c5509865929187d3bc22b\",\"impliedFormat\":99},{\"version\":\"273570ff6139f4a05a8863a933c28a6b5033b6d4dba515d06ad71a3efa766685\",\"impliedFormat\":99},{\"version\":\"3cede24c7dbb210a05b2199edb8d37a604fd2000087a92809c5f321b96b9060e\",\"impliedFormat\":99},{\"version\":\"56bf46d943e202a7fbdd6de1b00ce794b414b7a640bca3d1bed7e98f983df8c2\",\"impliedFormat\":99},{\"version\":\"eb5b855ca3d65fd100bbf97317def7be3ecb5aa27003e931712550dc9d83808f\",\"impliedFormat\":99},{\"version\":\"bb7e70394dd1808fb08a28cf74bb5a59d5e8b2e3a79f601cfe4231b6f671a8a8\",\"impliedFormat\":99},{\"version\":\"426c7929dba2c15eef2da827c7fea629df1789865eb7774ad4ffeef819944adc\",\"impliedFormat\":99},{\"version\":\"a42d343866ab53f3f5f23b0617e7cfcd35bded730962d1392d2b782194ce1478\",\"impliedFormat\":99},{\"version\":\"90c0c132340dbfd22e66dd4faa648bbdd0d1bea8c84d24850d75ae02dbc85f8e\",\"impliedFormat\":99},{\"version\":\"2f7ae32421d8c12ee799ff5861b49fdd76d9120d152a54e6731cbfb45794c00d\",\"impliedFormat\":99},{\"version\":\"da735780043c7b7382319b246c8e39a4fa23e5b053b445404cd377f2d8c3d427\",\"impliedFormat\":99},{\"version\":\"d25f105bc9e09d3f491a6860b12cbbad343eb7155428d0e82406b48d4295deff\",\"impliedFormat\":99},{\"version\":\"5994371065209ea5a9cb08e454a2cde716ea935269d6801ffd55505563e70590\",\"impliedFormat\":99},{\"version\":\"201b08fbbb3e5a5ff55ce6abe225db0f552d0e4c2a832c34851fb66e1858052f\",\"impliedFormat\":99},{\"version\":\"a95943b4629fee65ba5f488b11648860e04c2bf1c48b2080621255f8c5a6d088\",\"impliedFormat\":99},{\"version\":\"84fa8470a1b177773756d9f4b2e9d80e3d88725aba949b7e9d94a92ca723fb0e\",\"impliedFormat\":99},{\"version\":\"ceb78397fc310a7d5ca021f9f82979d5e1176bbff3397207f0c8c04c7e3476aa\",\"impliedFormat\":99},\"601e40a0dd4301a4b51f198f0a3687c0ff797df4dfe2f34d5daf18f05c432844\",\"738baf8c178414e51104372589cb961430bc61087077e265d19dd1edb7e333b0\",\"3aedc01dd614e156abbfba9b5dab71a6952ca69e4b47475a4b7123259f6eb4ad\",\"adc363f04fc05de408579816f094f06a7be8e4b31778b168b99645dbbdc8981a\",\"e4376c03a7a793137fcf9f23508400bfaf42335cd3c72bbec146809f49650fdd\",\"5dec076e9a969cc5875c7c1b81ab8fe918c34230b8c5859eeeae40dcad59882b\",\"9fb5724a590595ea8cc6e9ad4667f4134f13fc7fbfd28ec9e45d173be6abedde\",\"ee0473d0d07e4a76fd88fdec28d895cca811eb709778519def6e65a59bb61f6d\",\"8d606d4617e584c1a67cb4960011a74a7711ee913b2a831898dd86f04436bc7d\",\"351d806122f2899c18e16b1fbaa17fa40a296c063aa3ac04318373ab07a35bd1\",\"546cb7a1beb0fabadcf7a8b5d08ee803f107c381ed8d2db563c6f096de9027eb\",\"c9e7829b305c1b816569b53b3f538a0179bc7f8d46715f44ef59dd2e0d61d8e1\",\"e5f0e892a7491053cdbd11d7bb4a0d82df8bfcf9280b3545c40baed000eaaff5\",\"abe6979b92c66d6aae73e8cacfd6f0cb01fcb612f846bd74a796f00dfa449f40\",\"6094826920fa07d2bf0240c7cf39fb8a65527c49108f81ccfb4bba015edc74a9\",\"463bec1af9cf3cd2251fb42a2cfc455699f4cc4ce08e1f5cf30c736327700911\",\"2d2e48d7a5b42c158783851844948c009e7759db588f1c8ec31fd46312c85d1c\",\"ff40a94067898574af4498b645113fd4d95115bc7ab2d100c65aaafe8af1565e\",{\"version\":\"22227267459567f5b88936b6be5168164aea54ffbcaf4a6373230116754673ff\",\"impliedFormat\":1},\"db977d821af56ae3fb7952182d9c0a076a10c75c38bc2d2b000827e720423d32\",\"2d01f6f3c9562d938736527bb4d53d1b158edb69ec8e8eef6b67796aadd79960\",{\"version\":\"3cef134032da5e1bfabba59a03a58d91ed59f302235034279bb25a5a5b65ca62\",\"affectsGlobalScope\":true,\"impliedFormat\":1},\"8d933ce703765772315dd543a606cd0d4dfb064da343ff43ec68bea6ab221c0c\",\"0240853a0e2235836170aeb4329040e2f816a2b43f66d78ad04e84d6b2608922\",\"0128884a0728b8e6fe0e919a3e957ece61daa7693dbc24e0ae3de8ff46dfed53\",\"c68b7413e700444150791ba360c53823e2b82b70bed334e048a9aa9a2f78c5a2\",\"413e29be3c5b16aa6d2e4337743ccada74fcc3b99b51a98326db1e1f1f5fd2bb\",{\"version\":\"585d9831c64d31515aa1ed9b25b1e6ae6b6018bfe8b1ded953b283ff3878f95f\",\"impliedFormat\":99},\"3155dc50d0e746332fb7094e47f935d927389b3bb98259c350a6192d620fb6cb\",\"b326e2af874b14aa2ac18096ddbec512c6258f3fafc20ba6c8262818d48e6a5b\",\"bdc82fcad0a93fcbdd074b4c2fe6de9a70f30272e30fcf13721949fb39ec6440\",\"a4d9a3a3fa41d4646cab81e6c0620beb72f2f77bd16f320fc81f7eb75dc47be2\",\"a72a9d8fc1c1999b5411a33391c5e70048863c5865629077280e943ca85689a8\",\"ad0936f84f1df79d3697bfbff9c18f8ad58431c1cbaf2359c6a853b0fcc9f28b\",\"309b099ca7caefcc09dbe17c35ce8408e6a8a3a6830451745d006a55e29a1985\",\"2035404b9bf7df6dd68555b566708b59423ed1ba4b954287eec707fa7a35665f\",\"e55d068005a719b285a782b8e70becee3e6d8918b0b334131496caced0f10a70\",\"7f15174211e160265fa44f0b1796090016e6dd2815857f55ce20b00bed61a995\",\"1b4e09c1adb4f2750b7db1ed9cfbe20261fa14d5184729f7b7962c4c0b0f820e\",\"e632950501a585b0af957f510272899e5bb736d5d195ba814e5c55a7fa60e15c\",\"aaf46918c590c2bf59e2afb7904dfd8e69317e12ee34ff93ed2746dd06cc994a\",\"038e23946044be58e4630ba65dfe675762b1defa58c85ab5da6e24c87dc0f851\",{\"version\":\"e2d1eae4f7fd60710db522cca46a3a21f7235e58bf89696bfe6cabbca2cd23ed\",\"impliedFormat\":99},\"5b4ca57b4c9755bee6439587c1a9eeeba5998d3db9eeafda3cac4eae9eed7442\",\"5c918246a03d2cb09916c990e18e6cd15b0590509da243930314cf5ffe280696\",\"db593699d35d5ee5888910a023863e5a5de00a44b08084f4ef4817b58b2e1c90\",\"baa05d8d5b5b97ccb986acea9452a417340d937452aa915981b8e033c9f55bbb\",\"0ec2a7b2477a3b263eaabac0a4119a8aae6d8552e17ebbcee003b927a0390635\",\"814211209b837b95655aafca391a9690629aae855ad81e203f46d69b52de060c\",{\"version\":\"bb703864a1bc9ca5ac3589ffd83785f6dc86f7f6c485c97d7ffd53438777cb9e\",\"impliedFormat\":1},\"60d5246653c714fc12a67743ee5951331ecd2548cdaef9a599922bcb14da26db\",\"a19d8fdb1d4a6c02c071e1f35afab99b2e759c5cd04ded8c2bfd6ad84dfb8962\",\"06938b780eed97fdfde2baa2e23f9d87cca5a8dd3b1a4673d3c9ddf202e801c2\",\"876c4c3ab80db34eeb2d12b5d17931357b11e529776b720208b974ffe808a5a5\",\"a983e1e245ffee30b743b2be930641e518ade07b1a790a62bbdaff3a048d143d\",\"6526efdd9b96b5f04cb1806861399e12d18b9fad6db435dfdbb0c64bc2f9d6a8\",\"4b9817ef82fbf0425c6ed18bd9bd33ae81e8258b3cfe1d8fc725f2ce332545d4\",\"e4cc1d327dca053ad2771367c65c64309ef8c030254df81a0d1e9ef82f4d1107\",\"a5aa8a9c56577d278ea4be35067c3f6d29d5f36e741c64942c3361071a77b8c7\",\"4c7c7b108f46bf482067ea51bdadaff500e556292f948b0007ac38200d0bc183\",{\"version\":\"fa4f7a50d9bf0f0848a6606ded81436678f64b3b7977a3a806ac5386573c7c88\",\"impliedFormat\":99},\"0665354f3ac986d4b4b9b43e74abb558a02c11dff3dbb8af618af884a06a0e18\",\"c8d031e40fe7fa52b8b752f83a8a141cf956b1aeaf8c718ecde2c18452d5fbca\",\"9661cc19f046573727e96b404e7d652a7e1ce72bf56637f92659c266d931d409\",\"deb786ae29e86564b4cf90b9b333ad73773ea0163dc42ed0234ea45a3eb415f1\",{\"version\":\"fc7c3943608aec142abb8c28f5892a1faaf255d48e1137ff2b2e0be0afdd479e\",\"impliedFormat\":99},\"bde44040cba551fe3c16398eaa4cf3bb2db40413ba7437cefb491a6ac78bfc70\",\"862ffd2001bffaa75b046f623464abeae860892eff97cec52e8d9270c54cce17\",\"dbd1352ad3e2dd5c59c74bd0ee63363bd90e18c02dde7e51019b91ebb180b34d\",\"2b1fdf8c5fd1d037fb6ab09aafea31afdf606ec07994a49f08ba181d066387ed\",\"33726d789f90f67859528e08614c4bbbf2974a24e969335f91578a6a0c011ba2\",{\"version\":\"acadc8bf3feaf97963a31517fcef4103f5aff34f57592260e995286093f9b84a\",\"impliedFormat\":1},{\"version\":\"bc2774dc366495d7f88475a6a134dcc3a2054b107fe1eba8f188d2e4e22f8488\",\"impliedFormat\":1},{\"version\":\"5e5ecbb857dfb61c6ec3f0f7e6d5c6866c1009d0d7c65b7313981994198d0d58\",\"impliedFormat\":1},{\"version\":\"fda67e29b44962799a5917029cd4084c34ea73fbbdf296534796d22a49c08d3e\",\"impliedFormat\":1},\"59a822966cf0180f0f89f129caa8382c2607e8bcab90c3a58f009a2617e2d044\",\"0655e30d865739a510894dc1755262771e8908a4623c266ad1e96c2333b05c40\",\"8c3d328d53eff7090d6ad3cfe55ecb9d353b24f93a5cc5379464c325e5b95575\",\"90e924b3392c8f27de64bb704246bb16bfaeb9ef79d4bf2de8daf9981e07a7c6\",\"271c0328eb85e63faca7b28981d8749520490aac118b31b0d472365541122510\",{\"version\":\"23aa7031361136c338d5caa2a85e2a8fa33686011c681291f610294ba9b0e16a\",\"impliedFormat\":99},{\"version\":\"3f9f922ca57d1b47c19b6cb0e952f17aff40d40ff42d8ed83bd6920cd7792d6a\",\"impliedFormat\":99},\"bc6c49321847eebc06d51bd5b121b1d2ad128be5695a81e391f3555bb1e753bd\",\"fe0684b4513d2c65ff07d473ea1bbf8583fea639863afbad3cd2d25caba1481d\",\"69ce0a3d8a113cd6aa2f8499ef15eee8fa7d66e58f6273b92d75e62e1b77e06a\",\"b63ac88ede5313abdc6eaa768a558995e35b32cad6ea4c73d60945f36572087a\",\"ac0ecaa93f086b60e66dfdc5942083360124b5841a4b17f1aa310e4112f362b5\",\"60013af20c19648d4d7e1b40bc1b5bf6304816166b6072fd6af8eaa4259cffad\",{\"version\":\"1fb3fbcc61b75dee225ba08f165ad4a23967b2399c3576184c0caa137d920ec8\",\"impliedFormat\":1},{\"version\":\"5b07fcde89caefe6fb75fdcf7427f56ca9274e12133d04fdddd99742ad45f72b\",\"impliedFormat\":1},\"d0ce0d0306f62bff27554fe926018d0475642acc2b3f7605285bca6f30e06958\",{\"version\":\"a03b097607908fed59d8c33333707b2a5303d685fcb68a4f3a818c0cf7b178bc\",\"impliedFormat\":99},\"e0fb22d231c76e0d5ff2e3348973e574897c109515a9e481e248cce3a24d7898\",\"31b7fa86171afbfa538c6cb317447078bd0ffeeab064474847d37f0522c6ef75\",\"8d073bd0905380dde6d222a6c5dd0305359f9d9e65969ec150b1309a1e97fded\",\"8b700e74dd4a61997881ce4dc458369d4ef3cc5a18cb99031e4a7b01b8aef91f\",\"4ce59e905707ee106590c014437877f5b6c67cbb75e5419a00552ebdd20ec890\",\"f6ce47513e496895964892d3faec9f77c951a4d00e292167a1dc34fe429d8da7\",\"6650b471c151daa1c7b0d06c823af7a1ae7cbed1b96bcf159cb2ac82a2c86774\",\"5a8dc34773b1c4fb920216afdd06b65392ab581fe1cedef0466c1f1b3cc601c8\",\"cb417459c8166a50767af3c1764f13bd544f8345730c94b101c40ea57f73b0ed\",{\"version\":\"fe93c474ab38ac02e30e3af073412b4f92b740152cf3a751fdaee8cbea982341\",\"impliedFormat\":1},{\"version\":\"1bddafb2bee422e871de305b43a484ec058de25c3605b8da7dc8e63dc074e09f\",\"impliedFormat\":1},{\"version\":\"1e00b8bf9e3766c958218cd6144ffe08418286f89ff44ba5a2cc830c03dd22c7\",\"impliedFormat\":1},\"8794ad447ac7deebb3ec7a30eaf7efe2320193e5cfe0f65d5c8da399424d228b\",{\"version\":\"6d7cacc06137c56410cf27e334ef68694a94306f6552e5fa868b65ebb5c52ede\",\"impliedFormat\":99},{\"version\":\"720d9a7af59f4086314d801c17dfa2a057ae5c0c86caf3a588a333f2bd61c4c2\",\"impliedFormat\":99},\"d65d902b45ebc85f5291d752716e276909eb3c007af35961b846783f5e8b3b40\",{\"version\":\"bdc1824d433df07efbd9a0ccf543d9358e250676fb755b27a9937176ff3a31e1\",\"impliedFormat\":1},{\"version\":\"41c514d6896dd73d171bfa8ee88fb56cecda181e1811493ea4d330683eef7df5\",\"impliedFormat\":1},{\"version\":\"7feb744d9571f4ceec8c3a76383950a13f26c3d39ce8ca928850c8f67febe21e\",\"impliedFormat\":1},\"9f7ec90e36b1578fcdf2c566f4910db3638e774d5f51140043779dcad3f80686\",\"066f2433bee4106d8e914c8cc6b6c3ba8e6f3696ba7dd7e62b9546684588af93\",\"210944b300f7d8230124ecbc4402e4f9dfa454d0025e80ca04aa7eed167753cf\",\"745f4168f77945526986a0779e4e678e432bea66a0521dee024f6b86f1c5c9bd\",\"5089bd580c5b845c789d40d6044ed1e14ed6f2b4b6364988e697be632b51efe0\",\"5a11e1134cf62fc039f02d26c688f285808e4d982a27f44db9a5322bafaf4504\",\"5f0ac67eea09705e38d957523960c16df33a5d80ac1fae0038735aab57048442\",\"1250415dbebd55f72b1789aaf5d4414c57614e0a57fe4b7dc19d9bf7d5f32aed\",\"ab77fa1bc274e337457fb4952c3a462112fd91570d8d3200fb3fd3769fdc6f4f\",\"7e85c850abaf1f4aca0f83fb83967ed503dc93f60660025076739e8fcfc1ae3a\",\"970b9a7152a4a7399f0e7c4cd27b5c018b7a5dec3d20fad4a132eec32d243565\",\"ddc93137887e33afebd7c5e4d6b5e9cd2a677c00e63b26c793bb8cfac5abfd43\",\"093fd911c6ff72c91da0e314fbd1e7550aafb251de6d7f8dc4d69116e6a8b68f\",\"dfc9d222fa83126350acc8e3e4b4ba0b0649d52da5484e8eb158a68b1584cca2\",\"bfd3852981e0178a1a343431f8b33d38da1bf706edc32c3877e7add15bfe4b33\",\"8b36fd5dcd21774647f711393fe7de9993832e79451700163b057892eff32578\",\"7fe47ad3cc4d92a827e9f506e3f772d4f18895635e3a96ff58d2449236d340a7\",\"a9f2dc788746e6bc1d05a389a2fd2df8af5c7fef76c27f9e8fe266cea1e62091\",\"cb8ad35ad374a854f0c3e51700d0b2aa7d407b1a1dc0375b0d3bff25bf609522\",{\"version\":\"713571db67fa81007d8267a5c35bd74662f8da3482f2e0117e142ffd5c0937a7\",\"impliedFormat\":1},{\"version\":\"cddee5768c712806c4825da45f2ef481f478987abc1f8cf1bb524b8bb32cd48c\",\"impliedFormat\":1},{\"version\":\"3fd17251af6b700a417a6333f6df0d45955ee926d0fc87d1535f070ae7715d81\",\"impliedFormat\":1},{\"version\":\"48aee03744cbe6fb98859199f9d720a96c177c36c0fc7e5d81966bd2743f5190\",\"impliedFormat\":1},{\"version\":\"a04338d8191ebc59875ebe52eb335eacf8c663adb786ee420ba553a808566dc0\",\"impliedFormat\":1},{\"version\":\"e8e5462d4a17d62eadb9fa16c46a0cf467c48f04a30705f656446d4e90da35d5\",\"impliedFormat\":1},{\"version\":\"2ea3b81baddff6943c7e1704b39f3acdeddb2982b78ee8c1968a053e95151ba9\",\"impliedFormat\":1},{\"version\":\"7fe31f933471075abbc4e7529805ad31251a7019cb9658df154663337e9bab60\",\"impliedFormat\":1},{\"version\":\"aeb8e8e06b280225adcb57b5f9037c20f436e2cbbed2baf663f98dd8c079fc02\",\"impliedFormat\":1},{\"version\":\"35c26005c17218503f25b79c569a06f06a589e219d7f391b8bc3093dde728d7c\",\"impliedFormat\":1},{\"version\":\"f32c9af2ceaa89fa11c0e1393e443cd536c59f94a1f835b28459188a791d0d24\",\"impliedFormat\":1},{\"version\":\"0f8d5493a0123ebb6b6ca48a28ff23952db6d385d0505a2ba99d89d634f55502\",\"impliedFormat\":1},{\"version\":\"5396ccd4007e9fea23eda8c4dca1f5ccfad239ec7e13f2a0d5fd2c535d12e821\",\"impliedFormat\":1},{\"version\":\"9c44e80d832d0bca70527a603fd05b0e4b8d1a7d08921eecc47669b16f0d0094\",\"impliedFormat\":1},{\"version\":\"8f6786732b48efa9dcf54e3cb5db9b37e93406ab387d0180062b0b3d1e88003f\",\"impliedFormat\":1},{\"version\":\"6940b74d8156bbea90f54311a4c95dcb6fadd4e194bd953b421799a00a0974da\",\"impliedFormat\":1},{\"version\":\"53dc4527a3ed51f201376ea3a11152afe0ab643477719234f69122f3e19fb7f8\",\"impliedFormat\":1},{\"version\":\"3f9a50b3bd5d05ce64a1eaa5b6d9e4557b09f052cdf770f6960729230865811b\",\"impliedFormat\":1},{\"version\":\"539be2ef049df622b365b9dc9d0f159844dd964eeb3b217b26109bfe8b9d5b51\",\"impliedFormat\":1},{\"version\":\"c20d1d667be283a19b27c364000f64f3db7a22fa67a386360aa465d4f22b369e\",\"impliedFormat\":1},{\"version\":\"d88e0b5b07e7da500c1fcc6b4b1ffeacd8c4494148ee05657c076560ef23c318\",\"impliedFormat\":1},{\"version\":\"7a9aaa2da69a99ddc1af90adc264f4c46d9b5bd5445827fdd10b5eb6b041f856\",\"impliedFormat\":1},{\"version\":\"086caf9537c9e76607d11e605f2b1892b7f4e061a3d85de46c6b2718deb54a95\",\"impliedFormat\":1},{\"version\":\"3362c7388ec2f8bc2744fb5a464d97bdbab3256f79b933ceda101fa00ea2d6d4\",\"impliedFormat\":1},{\"version\":\"4d1b4a4e6e4cec22d76f7a5bb6d909a3c42f2a99bb0102c159f2ebbdf9fefe09\",\"impliedFormat\":1},{\"version\":\"30a82ac2d8c8a45ffaaf0b168dfcc9e477cac0c0928a95ac95caf799a7c83177\",\"impliedFormat\":1},{\"version\":\"cf8d92a3490c95b1acc08f94907cce79999b4a0ca081828a14c22220503a9c01\",\"impliedFormat\":1},{\"version\":\"957e2258cd6c97d582673e83239141e810a42caf4862514a7db6806b35414c25\",\"impliedFormat\":1},{\"version\":\"cafc0dea942daee65e4c9895b186d6631fbc4ffd470e9a805446e06df3a5c85a\",\"impliedFormat\":1},{\"version\":\"b6b12d7fc9caf24f95581113ceac63c12a674c82040b60e1f35fdc972f36d24e\",\"impliedFormat\":1},{\"version\":\"066f0ab8c0d0100b9db417204defa31a9aa9d8c6194ba7aebf71375701afcf21\",\"impliedFormat\":1},{\"version\":\"1d500b087e784c8fd25f81974ff5ab21fe9d54f2b997abc97ff7e75f851b94c1\",\"impliedFormat\":1},{\"version\":\"c947497552a6d04a37575cec61860d12265b189af87d8ff8c0d5f6c20dd53e53\",\"impliedFormat\":1},{\"version\":\"b2b9e2d66040fdada60701a2c6a44de785b4635fded7c5abdf333db98b14b986\",\"impliedFormat\":1},{\"version\":\"61804c55cfa5ae7c421f1768bc8c59df448955842264a92f3d330d1222ca3781\",\"impliedFormat\":1},{\"version\":\"77a903b2d44ced0a996826e9ba57a357c514c4a707b27f8978988166586da9e0\",\"impliedFormat\":1},{\"version\":\"3e46c022f080be631daf4d4945ce934d01576f9d40546fd46842acaa045f1d24\",\"impliedFormat\":1},{\"version\":\"1ed754d6574b3d08d9bcc143507a1dacf006bd91cbc2bd9a5d3d40b61b77cd88\",\"impliedFormat\":1},{\"version\":\"8229e36cf3be8e225af26c64634fe877eb38e7ba5715677d553576633a67d523\",\"impliedFormat\":1},{\"version\":\"5e0ce1da2500d5ba27633852a8edf0e4ac3d2b8ef9de8e125f9e39e4d2ef8623\",\"impliedFormat\":1},{\"version\":\"d03447d1f0c153f4ea2b00135d73d19569b80191fba23fc78dfcbea62f3f3ab6\",\"impliedFormat\":1},{\"version\":\"3d67f41f9bcbc803e039769f9584e4f49a5a04f4ab0d1519384a274d432e5ebc\",\"impliedFormat\":1},{\"version\":\"19a15f51d36de3326ac7aaf3518558c0823557a33f9380753a1f8ebb3b3a5eab\",\"impliedFormat\":1},{\"version\":\"97fbcbc2dbba4da759d703ec478404ff6838c9d51f420dd08a193f4dbfff0a73\",\"impliedFormat\":1},{\"version\":\"8f433a52637174cf6394e731c14636e1fa187823c0322bbf94c955f14faa93b9\",\"impliedFormat\":1},{\"version\":\"f3c2bd65d2b1ebe29b9672a06ac7cdd57c810f32f0733e7a718723c2dddd37c6\",\"impliedFormat\":1},{\"version\":\"a693fdcc130eeb9ca6dd841f7d628d018194b6fd13e86d7203088f940d0a6f20\",\"impliedFormat\":1},{\"version\":\"a4aaa063e4bb4935367f466f60bbc719ea7baccc4ed240621a0586b669b71674\",\"impliedFormat\":1},{\"version\":\"ad52353cb2d395083e91a486e4a352cd8fab6f595b8001e1061ff8922e074506\",\"impliedFormat\":1},{\"version\":\"0e6ee18a9299d14f74470171533d059c1b6e23238ce8c6e6cb470d4857f6974a\",\"impliedFormat\":1},{\"version\":\"f0b297519bf8d9bb9e051aad6a4b733c631837d9963906cf55a87f0d6244243f\",\"impliedFormat\":1},{\"version\":\"35132905bd4cdc718580e7d7893d2c2069d9e8e4ac7d617e1d04838fb951c51a\",\"impliedFormat\":1},{\"version\":\"6c50f85b63e41ead945f0f61d546447fa2fabfd8e6854518675ddc2400504234\",\"impliedFormat\":1},{\"version\":\"e67aa44222d0cfc33180f747fbf61d92357a33c89daa8ddd4edba5f587eaf868\",\"impliedFormat\":1},{\"version\":\"31fea62febf974f1a499099bd47a2d18655f988ff2924bc6ab443b86ee912a21\",\"impliedFormat\":1},{\"version\":\"4021b53cc689a2c4bd2e1e6ae1afcf411837c607e41c9690ce9c98d33b4bce4f\",\"impliedFormat\":1},{\"version\":\"1ac4796de6906ad7f92042d4843e3ba28f4eed7aff51724ae2aec0cc237c4871\",\"impliedFormat\":1},{\"version\":\"94a34050268481c1e27d0ad77a8698d896d71c7358e9d53ae42c2093267ffd53\",\"impliedFormat\":1},{\"version\":\"f43f76675b1af949a8ed127b8d8991bb0307c3b85d34f53137fe30e496cb272a\",\"impliedFormat\":1},{\"version\":\"f23302eb32a96f3ab5082d4b425dc4a227d14f725d4e6682d9b650586a80a3e7\",\"impliedFormat\":1},{\"version\":\"ee7cc650232e8d921addfdea819290b05b4d22f7f914e57cd7ca1aa5582f5b29\",\"impliedFormat\":1},{\"version\":\"2ad055a4363036e32cebb36afcceaa6e3966faada01c43a31cc14762217ee84e\",\"impliedFormat\":1},{\"version\":\"fba569f1487287c59d8483c248a65a99bd6871c0b8308c81d33f2b45c1f446e7\",\"impliedFormat\":1},{\"version\":\"75d774b9ccb1e202709ffbcadba1d8578bad1d6915d86633ac056574879269b0\",\"impliedFormat\":1},{\"version\":\"08559fafddfa692a02cce2d3ef9fa77cf4481edd041c4da2b6154a8994dec70e\",\"impliedFormat\":1},{\"version\":\"2e422973e645e6ee77190fe7867192094fa5451db96eb34bf6bf0419cef10e85\",\"impliedFormat\":1},{\"version\":\"349f0616eb0bfbcaa8e0bf53fee657bff044bff6ccaf2b8295be42d2c8b8a3f3\",\"impliedFormat\":1},{\"version\":\"25b0285ec91d78fcc1c0800022dd15f948df01b35d1775dafbae3cce5a79b162\",\"impliedFormat\":1},{\"version\":\"8a6414c6d70225e89602733cfa2af2c02a03b2af48c865763932c3892df782d2\",\"impliedFormat\":1},{\"version\":\"b37402e79f4cc5103b12b86dbdcbd98124a4431fb72684a911ef6ecf588cc0ef\",\"impliedFormat\":1},{\"version\":\"cd09f4c7c4fdb9f92ee046dd2ffc2aa3467da3e699defde33ace3ca885acffbb\",\"impliedFormat\":1},{\"version\":\"c257aca7515910900e65faa520eed9351f4686cddfdbb017b1c2a8f008332c47\",\"impliedFormat\":1},{\"version\":\"9ddbd249d514938f9fc8be64bda78275b4c8c9df826ec33c7290672724119322\",\"impliedFormat\":1},{\"version\":\"242012330179475ac6ffca9208827e165c796d0d69e53f957d631eaaea655047\",\"impliedFormat\":1},{\"version\":\"320c53fc659467b10c05aad2e7730ba67d2eb703b0b3b6279894d67da153bee2\",\"impliedFormat\":1},{\"version\":\"e2efe528ec3276c71f32154f0f458d7b387f0183827859cf0ce845773c7ff52d\",\"impliedFormat\":1},{\"version\":\"176c7a1c47b5136de3683fbeac007b727905ca693dbd8cc340fa1fb9f26b365c\",\"impliedFormat\":1},{\"version\":\"ebc07908e1834dca2f7dcea1ea841e1a22bc1c58832262ffa9b422ade7cbeb8a\",\"impliedFormat\":1},{\"version\":\"67146f41d14ea0f137a6b5a71ee8947ad6c805d5acaed61c8fc5224f02dfde4f\",\"impliedFormat\":1},{\"version\":\"22e92cabd62c19a7e43e76fba0865b33536b6434e50a97e0b0220c34c74831cb\",\"impliedFormat\":1},{\"version\":\"d1f5f6ec7cafb6de252ce831d41e8d059bf7c44bd03bb4f8327b28b82c4d2700\",\"impliedFormat\":1},{\"version\":\"96fba29a099df9b0c7d79ca051d7528ae546a625f9a16371b077e09f4f518e2d\",\"impliedFormat\":1},{\"version\":\"79dd276b87e761fb23979c0d270974c19f1b3fd51575bab4691abf7701fe8154\",\"impliedFormat\":1},{\"version\":\"764df94196883c293e3c7bc0d45eb365a9082c91a18d01f341675186f2fe8225\",\"impliedFormat\":1},{\"version\":\"7654616453f4b4aabb6302828f884d41adddea7cfaec40d65ed507e637ae190d\",\"impliedFormat\":1},{\"version\":\"b310eb6555fd2c6df7a1258d034b890d7bddd7a76048a8a9a8a600dd68a550f3\",\"impliedFormat\":1},{\"version\":\"93d5a78ff448731738a42b22bd78fc52a92931097702218b90fcba5a4676a433\",\"impliedFormat\":1},{\"version\":\"80b1dc86292412425b14888d66c044151f05c5c2f59b0fa4b6c4fe002d64d6a8\",\"impliedFormat\":1},{\"version\":\"2ea7aba09d12e4e8f550206fc8dbf13d0bb2cc8bb7469fb9ccef39391dfa443c\",\"impliedFormat\":1},{\"version\":\"d7f91db766561a83655b535c2f06163647bd780d9bbb2c19e50dec97c0e391ea\",\"impliedFormat\":1},{\"version\":\"1c7951a2784c2fef0ed6218bf18cd3d3b895667881ba4d586b2bc15fffd0ab29\",\"impliedFormat\":1},{\"version\":\"3d82db9fba4a59ef5bcc45f6a2172b6b262fd02331fe55ec60b08900f5df69f8\",\"impliedFormat\":1},{\"version\":\"2594a354021468bb014f4e7cad72af89cd421b44f5ac3305a6b904d5513f1bd4\",\"impliedFormat\":1},{\"version\":\"cbbd8d2ceb58f0c618e561d6a8d74c028dcbe36ce8e7a290b666c561824c39de\",\"impliedFormat\":1},{\"version\":\"8c70aefeaa2989a0d36bb0c15d157132ad14bd1df1ce490ad850443ac899ba82\",\"impliedFormat\":1},{\"version\":\"6961f2279f3ad848347154ea492c1971784705bc001aea20526b1c1d694ea0c0\",\"impliedFormat\":1},{\"version\":\"2ae0c35c2bffb3ad231d40170402436a4b323fe9ef1dfcb9a20248090f600f36\",\"impliedFormat\":1},{\"version\":\"9c1bce25595a518eaa5644c0af484a3794319ef22525bc63085a8137106d3ed9\",\"impliedFormat\":1},{\"version\":\"a33ee8bd8beb3b14c3ab393b85717d7c1e5aca451ebcef09237675fa9a207389\",\"impliedFormat\":1},{\"version\":\"6c5d50dca19d6fb862c9eac0db1b4882add3dd47a38ba5ed74b117b3860d078f\",\"impliedFormat\":1},{\"version\":\"1f5679d1cd7b9909c1470f14350f409df0ee45c3a55d34c53f7869bf6d93b572\",\"impliedFormat\":1},{\"version\":\"f6ae233b35bde47bb249c11525bb8d89ea93d907955450cd5d1c650e45088bab\",\"impliedFormat\":1},\"44ee4eb9fd199120da84a6efe5bdbb09ad32203123ce464f0c821f1d57ac19b9\",\"61eab9962eaaa5acaf7bd0ebd97404d61b47652b766dfc7e25caddc891681d86\",\"5a7ff510d4b63b0f2f8b35c7e6fd6c6aadd7de5d4d0178e85be42099db651e12\",\"09f095316a531cf3497190d10411dd01a8d549dd4a66233092b182f57999fedd\",\"ed78a053a9db783f48d5dfab7398b630f87c17ed2e237b6f30a3eb153675960c\",\"3e461772e2303e483841dea6411fd5e0a78bfd9e374b7df09555d4e85c077314\",\"3da80a551da8a7eb4949a0b64b5329af463037dc15e6945e60ae66dcd903e71f\",\"59119a5e2a7588539e29a0c8e45d5f0bee7ddee07bad6825a49ecee47293fb75\",{\"version\":\"65891a4ae521b5c5c09a6d45cbeb30d519f54a9c45415cfa6ee2fb43ae352d4e\",\"impliedFormat\":99},{\"version\":\"1e7222556efba662a52edc81642a51f1925d3c2cc8caa465eebb3fdffcbe2bd8\",\"impliedFormat\":99},{\"version\":\"a8ea73651858588a66956c62bb992e855dd7ec9d4e37d22612c91d170d129360\",\"impliedFormat\":99},\"eb3af6b3593e5e830d9f261942d21c3484fe825a90eb3dc3abd47584cfd1241e\",\"aabd264637475dd6af9ff9d001970450da808070262c35f283a856fac1853169\",\"796a72a75bd053cfbc39afec66773a8e57ab6c7700468ed4a5bdd66550d93937\",{\"version\":\"e516240bc1e5e9faef055432b900bc0d3c9ca7edce177fdabbc6c53d728cced8\",\"impliedFormat\":99},{\"version\":\"5402765feacf44e052068ccb4535a346716fa1318713e3dae1af46e1e85f29a9\",\"impliedFormat\":99},{\"version\":\"e16ec5d4796e7a765810efee80373675cedc4aa4814cf7272025a88addf5f0be\",\"impliedFormat\":99},{\"version\":\"1f57157fcd45f9300c6efcfc53e2071fbe43396b0a7ed2701fbd1efb5599f07f\",\"impliedFormat\":99},{\"version\":\"9f1886f3efddfac35babcada2d454acd4e23164345d11c979966c594af63468b\",\"impliedFormat\":99},{\"version\":\"a3541c308f223863526df064933e408eba640c0208c7345769d7dc330ad90407\",\"impliedFormat\":99},{\"version\":\"59af208befeb7b3c9ab0cb6c511e4fec54ede11922f2ffb7b497351deaf8aa2e\",\"impliedFormat\":99},{\"version\":\"928b16f344f6cddaba565da8238f4cf2ddf12fe03eb426ab46a7560e9b3078fa\",\"impliedFormat\":99},{\"version\":\"120bdf62bccef4ea96562a3d30dd60c9d55481662f5cf31c19725f56c0056b34\",\"impliedFormat\":99},{\"version\":\"39e0da933908de42ba76ea1a92e4657305ae195804cfaa8760664e80baac2d6a\",\"impliedFormat\":99},{\"version\":\"55ce6ca8df9d774d60cef58dd5d716807d5cc8410b8b065c06d3edac13f2e726\",\"impliedFormat\":99},{\"version\":\"788a0faf3f28d43ce3793b4147b7539418a887b4a15a00ffb037214ed8f0b7f6\",\"impliedFormat\":99},{\"version\":\"a3e66e7b8ccdab967cd4ada0f178151f1c42746eabb589a06958482fd4ed354e\",\"impliedFormat\":99},{\"version\":\"bf45a2964a872c9966d06b971d0823daecbd707f97e927f2368ba54bb1b13a90\",\"impliedFormat\":99},{\"version\":\"39973a12c57e06face646fb79462aabe8002e5523eec4e86e399228eb34b32c9\",\"impliedFormat\":99},{\"version\":\"f01091e9b5028acfb38208113ae051fad8a0b4b8ec1f7137a2a5cf903c47eefc\",\"impliedFormat\":99},{\"version\":\"b3e87824c9e7e3a3be7f76246e45c8d603ce83d116733047200b3aa95875445b\",\"impliedFormat\":99},{\"version\":\"7e1f7f9ae14e362d41167dc861be6a8d76eca30dde3a9893c42946dc5a5fc686\",\"impliedFormat\":99},{\"version\":\"9308ef3b9433063ac753a55c3f36d6d89fa38a8e6c51e05d9d8329c7f1174f24\",\"impliedFormat\":99},{\"version\":\"cd3bb1aa24726a0abd67558fde5759fe968c3c6aa3ec7bad272e718851502894\",\"impliedFormat\":99},{\"version\":\"1ae0f22c3b8420b5c2fec118f07b7ebd5ae9716339ab3477f63c603fe7a151c8\",\"impliedFormat\":99},{\"version\":\"919ff537fff349930acc8ad8b875fd985a17582fb1beb43e2f558c541fd6ecd9\",\"impliedFormat\":99},{\"version\":\"4e67811e45bae6c44bd6f13a160e4188d72fd643665f40c2ac3e8a27552d3fd9\",\"impliedFormat\":99},{\"version\":\"3d1450fd1576c1073f6f4db9ebae5104e52e2c4599afb68d7d6c3d283bdbaf4f\",\"impliedFormat\":99},{\"version\":\"c072af873c33ff11af126c56a846dfada32461b393983a72b6da7bff373e0002\",\"impliedFormat\":99},{\"version\":\"de66e997ea5376d4aeb16d77b86f01c7b7d6d72fbb738241966459d42a4089e0\",\"impliedFormat\":99},{\"version\":\"d77ea3b91e4bc44d710b7c9487c2c6158e8e5a3439d25fc578befeb27b03efd7\",\"impliedFormat\":99},{\"version\":\"a3d5c695c3d1ebc9b0bd55804afaf2ac7c97328667cbeedf2c0861b933c45d3e\",\"impliedFormat\":99},{\"version\":\"270724545d446036f42ddea422ee4d06963db1563ccc5e18b01c76f6e67968ae\",\"impliedFormat\":99},{\"version\":\"85441c4f6883f7cfd1c5a211c26e702d33695acbabec8044e7fa6831ed501b45\",\"impliedFormat\":99},{\"version\":\"0f268017a6b1891fdeea69c2a11d576646d7fd9cdfc8aac74d003cd7e87e9c5a\",\"impliedFormat\":99},{\"version\":\"9ece188c336c80358742a5a0279f2f550175f5a07264349d8e0ce64db9701c0b\",\"impliedFormat\":99},{\"version\":\"cf41b0fc7d57643d1a8d21af07b0247db2f2d7e2391c2e55929e9c00fbe6ab9a\",\"impliedFormat\":99},{\"version\":\"11e7ddddd9eddaac56a6f23d8699ae7a94c2a55ae8c986fdabc719d3c3e875a1\",\"impliedFormat\":99},{\"version\":\"dd129c2d348be7dbf9f15d34661defdfc11ee00628ca6f7161bead46095c6bc3\",\"impliedFormat\":99},{\"version\":\"c38d8e7cfc64bbfc14a63346388249c1cfa2cc02166c5f37e5a57da4790ce27f\",\"impliedFormat\":99},\"69686986376cbc02a5f907b1ca8a7a759808c4e8df1200517c57ec749e8484cd\",\"fce581657b3a87d7f5e909eef606693d503942ddeafcdedb6b3c3adbee2fb723\",\"b05ee8faa85538ec914053a87a0b04fa2d4b0cceded80ec8e88622677e9c19fa\",\"94b0f01138ac7ccf5066a12bee5fb4916d5dc7e7237aee25447a5e524bd2995d\",{\"version\":\"a346701ad6dcdaa58e388fe0995fc5304c09c395b8cba68ed872780f8c102004\",\"impliedFormat\":99},\"e3716d270e9ef6457b5cd29464ae00194abc8093c08ebf726c9204d7a69231d9\",\"32b6516cd893b93e968569abff2bf4c647d7ed39c855ecf21d84a937faced68b\",\"14604849a9efd20b7486c6dac0d693828d23f8fd7561db3af9e5d41a90fca6b0\",\"cd956d722cd6f4f02f388f2fa1c2af96e487de38b32ed95a589492e84264d1ab\",\"9efbabd0ae865ee6a2102ed4125276ffa369478b4c2467735e0db2e2e461e6d7\",\"e587e81ea93a427e2002dc77a5556f357801b267698a2dcb8dd2f63184f74915\",{\"version\":\"37c7961117708394f64361ade31a41f96cef7f2a6606300821c72438dd4abda3\",\"impliedFormat\":1},{\"version\":\"5f38aeb6dea42ad0e3cc7f8feafadad51e0d8a51a743e88cd6f3380caf921779\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"5dc81b4351526189849a351b59ac36d91e43d95dc56fb5d6e95d62802c0342e5\",\"affectsGlobalScope\":true,\"impliedFormat\":1},{\"version\":\"a271253336f6b441bce353d268892ee5e4774fcf64d5e8eab827f0cd716c7a56\",\"impliedFormat\":1},{\"version\":\"39875f62f78dfcd829f2d38f7b06e8a8d5e39bbb9487abe63b81b41fe3b58c04\",\"impliedFormat\":1},\"27bf081cef8e2967e00917ef38aba711a42ef52bb721dbdc69a29df5df8c3c41\",\"49b6c0388922238a0796ad9a6c620a5d0f7d9be03ab488117d3d01f4d06c7d69\",\"dcb76b7c1f6c3ed36437c1bed6c46dd735b1091ba162bcb5fca0a7d2167f3307\",{\"version\":\"65c9c89410b61cf526603322b6a321066f10075df4fc3f2bc80588fda1e53745\",\"affectsGlobalScope\":true},\"33d9b679d6847f8b7d9e0346c572867554bab8869e348b3bb0bcf37fd480f3de\",\"76114d85f1cd6d2f65283fd7a14af0a3ecab8c74f83d409c1f23a13fa2ba2928\",\"fde090e9f9b5321c00b420dc57e93bb32d72117cf1a37f5eb012a4749d4e952c\",\"e4cc1d327dca053ad2771367c65c64309ef8c030254df81a0d1e9ef82f4d1107\",\"6499b421f151058e1080982f92a4ca2a313900f62f99fb76ba9da215b9a83212\",\"42ab837667387d3378c6602cfb8b73bbaa3be76d27846d20d9cfa57607b634a9\",\"8869cb2e1032b871b277a01aedb401134bf743a8cc3dc327a30d2cccb6eac582\",\"0435563b51522fb6c27b02424ed8510b8ca90566acb246d906db2cab6817cac7\",\"ccb12e5253399c6a58e525c96fa267ec6f0f4dff7a72dd18af691c74b6532f88\",\"19e5de14ff65f162df2b77405d2b827d59850a4c17d4fad298e173aeef1f2610\",\"bf16a63defabad0c600dff75b2598216cea0d4f9899de1098b4a8184006dfec2\",\"1ceaf372bb954ea285067fd9361d21c15dbc20491b88f6d7250b3114c9c1acb3\",\"cd439a893c41afab51b57782205bce96477ad2f9ed3f075ad17807d005a16b9c\",\"092db3119bf959f4e70079984ae2c91b88c406d6bbc2f5e4683e313688a41ef4\",\"4fa96fafc9e74a30033e1f379bd134bf6a63a6032cd991076e4c20edafcc7fbc\",\"5a2aaad7408741e7bd30b556896aa4e9c58925fbec9a33771465a1a70f888853\",\"ab2324ff41ba36b818272edfa227f470a3082dde6da23c40ae32bde5aeccdb70\",{\"version\":\"51bcd1b0c1b5e8c67c084b40c811414d4b93e9fec77f110c68130f4304ddb3e5\",\"affectsGlobalScope\":true},\"8741883c63c69df2d32574a924d6483215d9b20ab264507ecdc7caf736006032\",\"d1986184a09a52db8228cb2bb2a61a8c05c9354e5b93cec8e2628d8579c892d7\",\"18b8038c30666aeb9e26779de35e2f4bf6f005e13c95a368c85e64142d4b915f\",{\"version\":\"c846ed7b4f1558d798819bada21af103e43c3db60a2dd3c53d8942bfe3c0588a\",\"impliedFormat\":1}],\"root\":[493,494,498,709,710,718,[828,830],[1304,1306],1309,[1322,1335],[1383,1386],1388,1389,1394,1395,1665,1666,[1693,1710],1712,1713,[1715,1719],[1721,1734],[1736,1741],[1743,1752],[1754,1757],[1759,1763],[1768,1772],[1775,1780],1783,[1785,1793],1797,1800,[1804,1822],[1925,1932],[1936,1938],[1975,1978],[1980,1985],[1991,2015]],\"options\":{\"allowJs\":true,\"esModuleInterop\":true,\"jsx\":4,\"module\":99,\"skipLibCheck\":true,\"strict\":true,\"strictNullChecks\":true,\"target\":99},\"referencedMap\":[[2014,1],[493,2],[2015,3],[2012,2],[2013,4],[1761,5],[1762,6],[1763,7],[1759,8],[1760,9],[1808,10],[1809,10],[1732,11],[1771,12],[1770,13],[1769,14],[1772,15],[1775,16],[1776,17],[1777,18],[1778,18],[1820,19],[1812,20],[1819,21],[1800,22],[1699,23],[1386,24],[1324,25],[1389,26],[1395,27],[1325,25],[1700,28],[1326,29],[1822,30],[1925,31],[1926,32],[1927,33],[1928,34],[1930,35],[1931,36],[1932,37],[1936,38],[1937,36],[1938,39],[1977,40],[1978,41],[1981,42],[1745,43],[1983,44],[1984,45],[1985,37],[1992,46],[1994,47],[1995,48],[1996,49],[1991,50],[1997,51],[1998,52],[1999,51],[2000,53],[2001,37],[2002,54],[1811,55],[1702,56],[1703,57],[1741,58],[1756,59],[1805,60],[1814,61],[1817,62],[1305,63],[1384,64],[1385,65],[1818,66],[1706,67],[1665,68],[1708,69],[1666,70],[1707,71],[1717,72],[2003,73],[1715,74],[2004,38],[2005,39],[2006,40],[1334,41],[1710,75],[1748,76],[1736,77],[1693,78],[2007,51],[1750,52],[2008,51],[1716,79],[2009,54],[1815,80],[1335,81],[1388,82],[1718,83],[1734,84],[1737,85],[1740,86],[1816,87],[1752,88],[1738,89],[1394,90],[1728,91],[1729,92],[1813,93],[1810,94],[1821,95],[1806,96],[1751,97],[1694,98],[1698,99],[1797,100],[1807,101],[1754,102],[1721,103],[1929,104],[1709,105],[1712,104],[1980,106],[1383,107],[1982,41],[1975,108],[1713,109],[1744,110],[1743,111],[1719,112],[1976,105],[1993,113],[1722,41],[1804,107],[2010,105],[1749,105],[1747,112],[1723,105],[1724,114],[1727,115],[1725,116],[1733,41],[1701,105],[1755,117],[1731,118],[1739,119],[498,120],[1306,121],[1779,122],[1730,123],[1705,124],[1726,125],[1704,125],[709,126],[1768,6],[1780,127],[1783,128],[1746,81],[1322,129],[1323,130],[1328,131],[1329,132],[1330,133],[1331,134],[1327,135],[829,136],[1786,81],[1785,137],[1757,138],[1304,139],[828,140],[1697,141],[1664,142],[1696,143],[2011,144],[1695,145],[1309,81],[1332,146],[1333,147],[494,148],[710,149],[825,150],[824,151],[1781,2],[742,2],[1022,152],[1527,2],[734,153],[1312,2],[736,154],[740,155],[723,156],[722,2],[735,157],[721,157],[724,158],[737,159],[738,160],[727,161],[729,162],[733,163],[728,164],[730,2],[731,165],[732,153],[739,166],[1300,167],[1301,168],[1299,169],[1295,2],[1302,170],[1297,171],[1474,2],[1476,172],[1477,172],[1475,2],[1479,173],[1480,173],[1478,2],[1481,2],[1482,174],[1483,175],[1484,175],[1485,2],[1486,2],[1487,2],[1494,2],[1488,2],[1489,174],[1490,2],[1491,2],[1492,176],[1495,177],[1499,178],[1496,179],[1493,2],[1497,180],[1498,181],[1500,2],[1501,174],[1502,174],[1503,174],[1504,174],[1505,174],[1506,174],[1507,174],[1508,174],[1509,174],[1510,174],[1511,182],[1512,2],[1514,183],[1515,174],[1536,184],[1530,185],[1532,185],[1531,186],[1528,187],[1529,188],[1534,2],[1533,2],[1535,2],[1516,189],[1517,2],[1520,2],[1523,2],[1518,2],[1525,2],[1526,190],[1522,2],[1519,2],[1521,2],[1524,2],[1513,2],[1293,2],[1298,191],[1294,191],[253,2],[556,192],[557,193],[552,194],[553,192],[554,195],[555,192],[547,2],[549,196],[550,197],[551,198],[548,199],[507,200],[510,201],[516,202],[519,203],[540,204],[518,205],[499,2],[500,206],[501,207],[504,2],[502,2],[503,2],[541,208],[506,200],[505,2],[542,209],[509,201],[508,2],[546,210],[543,211],[513,212],[515,213],[512,214],[514,215],[511,212],[544,216],[517,200],[545,217],[520,218],[539,219],[536,220],[538,221],[523,222],[530,223],[532,224],[534,225],[533,226],[525,227],[522,220],[526,2],[537,228],[527,229],[524,2],[535,2],[521,2],[528,230],[529,2],[531,231],[595,197],[604,197],[596,2],[597,197],[599,232],[602,2],[600,233],[601,197],[598,197],[603,2],[633,234],[632,235],[615,236],[606,237],[607,2],[608,2],[614,238],[611,239],[610,240],[612,2],[613,241],[616,197],[609,2],[618,197],[619,197],[620,197],[621,197],[622,197],[623,197],[624,197],[617,197],[630,2],[605,197],[625,2],[626,2],[627,2],[628,2],[629,233],[631,2],[560,242],[570,243],[562,244],[567,245],[568,245],[566,246],[565,247],[563,248],[564,249],[558,250],[559,244],[569,245],[571,251],[592,252],[587,253],[589,253],[588,253],[590,253],[591,254],[586,255],[578,253],[579,256],[585,257],[580,253],[581,256],[582,253],[583,253],[584,256],[593,258],[572,251],[577,259],[575,2],[576,260],[574,261],[573,262],[644,263],[641,264],[643,264],[640,265],[639,266],[634,267],[642,268],[648,269],[635,270],[638,271],[636,272],[637,273],[647,274],[645,275],[646,276],[594,277],[680,278],[682,2],[683,2],[684,279],[681,278],[687,280],[685,278],[686,278],[679,281],[692,282],[677,2],[696,283],[700,284],[699,285],[691,286],[693,287],[694,288],[697,289],[698,290],[702,291],[690,292],[701,293],[695,197],[678,294],[688,295],[673,197],[675,296],[676,297],[674,2],[689,298],[657,299],[659,300],[664,301],[665,301],[667,302],[650,303],[666,304],[656,305],[653,2],[672,306],[663,307],[660,308],[662,309],[661,310],[654,197],[668,311],[669,311],[670,312],[671,311],[651,313],[652,314],[649,197],[658,315],[655,316],[717,317],[1338,318],[1342,319],[1347,320],[1351,321],[1348,321],[1349,322],[1350,323],[1341,322],[1356,324],[1339,318],[1346,325],[1357,318],[1343,321],[1358,324],[1344,321],[1360,326],[1361,327],[1359,321],[1355,328],[1362,329],[1364,330],[1365,331],[1366,318],[1367,332],[1353,333],[1345,321],[1340,318],[1368,322],[1369,334],[1354,322],[1370,322],[1371,332],[1372,321],[1373,322],[1374,318],[1979,335],[1375,322],[1376,334],[1377,336],[1379,337],[1378,321],[1380,338],[1381,327],[1735,318],[1363,321],[1352,2],[1461,339],[1464,340],[1469,341],[1470,342],[1468,343],[1471,2],[1472,344],[1448,345],[1447,2],[809,2],[719,2],[1541,2],[1543,346],[1544,346],[1545,2],[1546,2],[1548,347],[1549,2],[1550,2],[1551,346],[1552,2],[1553,2],[1554,348],[1555,2],[1556,2],[1557,349],[1558,2],[1559,350],[1560,2],[1561,2],[1562,2],[1563,2],[1566,2],[1565,351],[1542,2],[1567,352],[1568,2],[1564,2],[1569,2],[1570,346],[1571,353],[1572,354],[1547,2],[1404,355],[1670,2],[1691,356],[1676,357],[1682,358],[1677,2],[1680,359],[1681,2],[1690,360],[1685,361],[1687,362],[1688,363],[1689,364],[1683,2],[1684,364],[1686,364],[1679,364],[1678,2],[1414,355],[1675,365],[1671,2],[1672,2],[1674,366],[1673,2],[135,367],[136,367],[137,368],[96,369],[138,370],[139,371],[140,372],[91,2],[94,373],[92,2],[93,2],[141,374],[142,375],[143,376],[144,377],[145,378],[146,379],[147,379],[149,380],[148,381],[150,382],[151,383],[152,384],[134,385],[95,2],[153,386],[154,387],[155,388],[188,389],[156,390],[157,391],[158,392],[159,393],[160,249],[161,394],[162,395],[163,396],[164,397],[165,398],[166,398],[167,399],[168,2],[169,2],[170,400],[172,401],[171,402],[173,403],[174,404],[175,405],[176,406],[177,407],[178,408],[179,409],[180,410],[181,411],[182,412],[183,413],[184,414],[185,415],[186,416],[187,417],[1390,418],[2016,2],[83,2],[192,419],[399,318],[193,420],[191,318],[400,421],[1714,422],[189,423],[190,424],[81,2],[84,425],[397,318],[270,318],[561,2],[1538,2],[1403,2],[1773,426],[1774,427],[1319,428],[1318,2],[1320,2],[1315,2],[1314,2],[1321,429],[1317,2],[1316,2],[705,2],[706,430],[707,430],[708,431],[703,432],[704,433],[1903,434],[1904,435],[1902,318],[1907,436],[1906,437],[1908,438],[1905,439],[1921,440],[1922,441],[1920,442],[1923,443],[1912,444],[1910,445],[1911,446],[1909,439],[1916,447],[1915,448],[1914,449],[1913,442],[1919,450],[1918,451],[1917,442],[1879,318],[1876,452],[1873,453],[1870,453],[1874,454],[1875,453],[1872,453],[1871,453],[1869,442],[1878,442],[1877,454],[1880,318],[1868,455],[1897,318],[1895,456],[1884,457],[1892,458],[1896,457],[1886,458],[1893,458],[1883,457],[1894,457],[1887,455],[1891,2],[1899,456],[1898,456],[1890,457],[1889,458],[1881,457],[1888,457],[1882,458],[1885,458],[1924,459],[1864,439],[1863,439],[1861,439],[1867,460],[1866,456],[1862,461],[1865,456],[1900,456],[1901,455],[1832,462],[1860,463],[1823,462],[1830,464],[1829,465],[1827,462],[1831,466],[1826,467],[1828,468],[1824,2],[1833,462],[1834,462],[1845,2],[1835,462],[1838,458],[1840,469],[1839,470],[1837,462],[1836,2],[1842,471],[1841,462],[1848,472],[1843,462],[1844,458],[1847,462],[1846,473],[1825,462],[1850,474],[1849,462],[1853,475],[1851,462],[1852,476],[1854,477],[1856,478],[1855,462],[1859,479],[1857,480],[1858,481],[826,482],[1782,483],[827,2],[1337,484],[1336,485],[1387,2],[1307,2],[1742,486],[1303,487],[82,2],[1654,488],[1650,2],[1651,2],[1649,2],[1652,2],[1653,2],[1655,2],[1647,2],[1648,489],[1656,490],[1111,491],[1090,492],[1187,2],[1091,493],[1027,491],[1028,491],[1029,491],[1030,491],[1031,491],[1032,491],[1033,491],[1034,491],[1035,491],[1036,491],[1037,491],[1038,491],[1039,491],[1040,491],[1041,491],[1042,491],[1043,491],[1044,491],[1023,2],[1045,491],[1046,491],[1047,2],[1048,491],[1049,491],[1051,491],[1050,491],[1052,491],[1053,491],[1054,491],[1055,491],[1056,491],[1057,491],[1058,491],[1059,491],[1060,491],[1061,491],[1062,491],[1063,491],[1064,491],[1065,491],[1066,491],[1067,491],[1068,491],[1069,491],[1070,491],[1072,491],[1073,491],[1074,491],[1071,491],[1075,491],[1076,491],[1077,491],[1078,491],[1079,491],[1080,491],[1081,491],[1082,491],[1083,491],[1084,491],[1085,491],[1086,491],[1087,491],[1088,491],[1089,491],[1092,494],[1093,491],[1094,491],[1095,495],[1096,496],[1097,491],[1098,491],[1099,491],[1100,491],[1103,491],[1101,491],[1102,491],[1025,2],[1104,491],[1105,491],[1106,491],[1107,491],[1108,491],[1109,491],[1110,491],[1112,497],[1113,491],[1114,491],[1115,491],[1117,491],[1116,491],[1118,491],[1119,491],[1120,491],[1121,491],[1122,491],[1123,491],[1124,491],[1125,491],[1126,491],[1127,491],[1129,491],[1128,491],[1130,491],[1131,2],[1132,2],[1133,2],[1280,498],[1134,491],[1135,491],[1136,491],[1137,491],[1138,491],[1139,491],[1140,2],[1141,491],[1142,2],[1143,491],[1144,491],[1145,491],[1146,491],[1147,491],[1148,491],[1149,491],[1150,491],[1151,491],[1152,491],[1153,491],[1154,491],[1155,491],[1156,491],[1157,491],[1158,491],[1159,491],[1160,491],[1161,491],[1162,491],[1163,491],[1164,491],[1165,491],[1166,491],[1167,491],[1168,491],[1169,491],[1170,491],[1171,491],[1172,491],[1173,491],[1174,491],[1175,2],[1176,491],[1177,491],[1178,491],[1179,491],[1180,491],[1181,491],[1182,491],[1183,491],[1184,491],[1185,491],[1186,491],[1188,499],[1024,491],[1189,491],[1190,491],[1191,2],[1192,2],[1193,2],[1194,491],[1195,2],[1196,2],[1197,2],[1198,2],[1199,2],[1200,491],[1201,491],[1202,491],[1203,491],[1204,491],[1205,491],[1206,491],[1207,491],[1212,500],[1210,501],[1211,502],[1209,503],[1208,491],[1213,491],[1214,491],[1215,491],[1216,491],[1217,491],[1218,491],[1219,491],[1220,491],[1221,491],[1222,491],[1223,2],[1224,2],[1225,491],[1226,491],[1227,2],[1228,2],[1229,2],[1230,491],[1231,491],[1232,491],[1233,491],[1234,497],[1235,491],[1236,491],[1237,491],[1238,491],[1239,491],[1240,491],[1241,491],[1242,491],[1243,491],[1244,491],[1245,491],[1246,491],[1247,491],[1248,491],[1249,491],[1250,491],[1251,491],[1252,491],[1253,491],[1254,491],[1255,491],[1256,491],[1257,491],[1258,491],[1259,491],[1260,491],[1261,491],[1262,491],[1263,491],[1264,491],[1265,491],[1266,491],[1267,491],[1268,491],[1269,491],[1270,491],[1271,491],[1272,491],[1273,491],[1274,491],[1275,491],[1026,504],[1276,2],[1277,2],[1278,2],[1279,2],[1288,2],[1539,505],[495,506],[496,2],[497,507],[1013,508],[835,509],[1011,510],[1012,511],[832,2],[1014,512],[1015,513],[1017,514],[833,512],[884,2],[903,515],[840,516],[865,517],[872,518],[841,518],[842,518],[843,519],[871,520],[844,521],[859,518],[845,522],[846,522],[847,518],[848,518],[849,519],[850,518],[873,523],[851,518],[852,518],[853,524],[854,518],[855,518],[856,524],[857,519],[858,518],[860,525],[861,524],[862,518],[863,519],[864,518],[898,526],[890,527],[870,528],[906,529],[866,530],[867,528],[892,531],[886,532],[896,533],[889,534],[895,535],[897,536],[894,537],[902,538],[888,539],[904,540],[899,541],[893,542],[869,543],[868,528],[905,544],[891,545],[900,2],[901,546],[838,547],[971,548],[907,549],[942,550],[949,551],[908,552],[909,552],[910,553],[911,552],[948,554],[912,555],[913,556],[914,557],[915,552],[950,558],[951,559],[916,552],[918,560],[919,551],[921,561],[922,562],[923,562],[924,553],[925,552],[926,552],[927,562],[928,553],[929,553],[930,562],[931,552],[932,551],[933,552],[934,553],[935,563],[920,564],[936,552],[937,553],[938,552],[939,552],[940,552],[941,552],[959,565],[966,566],[947,567],[976,568],[943,569],[944,567],[954,570],[961,571],[965,572],[963,573],[967,574],[955,575],[956,576],[957,577],[964,578],[970,579],[962,580],[972,581],[917,512],[960,582],[958,542],[946,583],[945,567],[973,584],[974,2],[975,585],[952,545],[968,2],[969,586],[1020,587],[1021,588],[1784,589],[1019,590],[881,591],[882,592],[885,512],[883,593],[887,594],[953,595],[874,596],[876,597],[875,596],[877,596],[879,598],[878,599],[880,600],[837,601],[1009,602],[977,603],[1002,604],[1006,605],[1005,606],[978,607],[1007,608],[998,609],[999,610],[1000,610],[1001,611],[986,612],[994,613],[1004,614],[1010,615],[979,616],[980,614],[982,617],[989,618],[993,619],[991,620],[995,621],[983,622],[987,623],[992,624],[1008,625],[990,626],[988,627],[984,542],[1003,628],[981,629],[997,630],[985,545],[996,631],[836,545],[839,632],[834,633],[1016,2],[1973,634],[1974,635],[1939,2],[1947,636],[1941,637],[1948,2],[1970,638],[1945,639],[1969,640],[1966,641],[1949,642],[1950,2],[1943,2],[1940,2],[1971,643],[1967,644],[1951,2],[1968,645],[1952,646],[1954,647],[1955,648],[1944,649],[1956,650],[1957,649],[1959,650],[1960,651],[1961,652],[1963,653],[1958,654],[1964,655],[1965,656],[1942,657],[1962,658],[1946,659],[1953,2],[1972,660],[823,2],[1281,2],[1284,661],[1988,662],[1989,663],[1460,664],[1459,665],[1711,318],[1442,666],[1416,667],[1417,668],[1418,668],[1419,668],[1420,668],[1421,668],[1422,668],[1423,668],[1424,668],[1425,668],[1426,668],[1440,669],[1427,668],[1428,668],[1429,668],[1430,668],[1431,668],[1432,668],[1433,668],[1434,668],[1436,668],[1437,668],[1435,668],[1438,668],[1439,668],[1441,668],[1415,670],[1540,671],[1578,672],[1577,673],[1575,674],[1576,672],[1579,2],[1659,675],[1658,2],[1662,676],[1660,677],[1537,678],[1661,679],[1580,680],[1657,681],[1646,682],[1582,683],[1642,683],[1583,683],[1584,683],[1585,683],[1586,683],[1639,683],[1643,683],[1587,683],[1588,683],[1589,683],[1590,683],[1591,683],[1592,683],[1644,683],[1593,683],[1594,683],[1638,683],[1595,683],[1596,683],[1597,683],[1598,683],[1599,683],[1600,683],[1601,683],[1602,683],[1603,683],[1604,683],[1605,683],[1606,683],[1641,683],[1607,683],[1608,683],[1609,683],[1610,683],[1611,683],[1612,683],[1645,683],[1613,683],[1614,683],[1615,683],[1616,683],[1617,683],[1618,683],[1640,683],[1619,683],[1620,683],[1621,683],[1622,683],[1623,683],[1624,683],[1625,683],[1626,683],[1627,683],[1628,683],[1629,683],[1630,683],[1631,683],[1632,683],[1633,683],[1634,683],[1635,683],[1636,683],[1637,683],[1581,684],[1573,685],[1574,686],[1282,2],[1987,687],[1283,2],[1986,2],[1990,688],[1753,2],[1313,689],[741,690],[1798,691],[1311,692],[1310,693],[1758,694],[1799,695],[1392,696],[1391,318],[441,697],[446,1],[436,698],[219,699],[257,700],[423,701],[252,702],[234,2],[212,2],[217,2],[413,703],[283,704],[218,2],[210,705],[260,706],[261,707],[396,708],[410,709],[307,710],[417,711],[418,712],[416,713],[415,2],[414,714],[259,715],[220,716],[350,2],[351,717],[243,718],[221,719],[288,718],[285,718],[202,718],[255,720],[254,2],[422,721],[432,2],[211,2],[372,722],[373,723],[367,318],[469,2],[375,2],[376,125],[368,724],[474,725],[473,726],[468,2],[465,2],[409,727],[408,2],[467,728],[369,318],[470,2],[466,2],[472,729],[471,2],[1801,318],[1802,730],[460,731],[463,732],[295,733],[294,734],[293,735],[477,318],[292,736],[277,2],[480,2],[1795,737],[1794,2],[483,2],[482,318],[484,738],[195,2],[419,739],[420,740],[421,741],[208,2],[245,2],[207,742],[194,2],[388,318],[200,743],[387,744],[386,745],[377,2],[378,2],[385,2],[380,2],[383,746],[379,2],[381,747],[384,748],[382,747],[216,2],[205,2],[206,718],[265,2],[271,749],[272,750],[269,751],[267,752],[268,753],[263,2],[394,125],[310,125],[440,754],[447,755],[451,756],[426,757],[425,2],[280,2],[485,758],[435,759],[370,760],[371,761],[365,762],[356,2],[393,763],[357,764],[395,765],[390,766],[389,2],[391,2],[362,2],[349,767],[427,768],[428,769],[359,770],[363,771],[354,772],[405,773],[434,774],[287,775],[326,776],[203,777],[433,778],[199,779],[273,780],[264,2],[274,781],[338,782],[262,2],[337,783],[90,2],[331,784],[244,2],[352,785],[327,2],[204,2],[238,2],[335,786],[215,2],[275,787],[361,788],[424,789],[360,2],[334,2],[266,2],[340,790],[341,791],[213,2],[343,792],[345,793],[344,794],[247,2],[333,777],[347,795],[332,796],[339,797],[223,2],[227,2],[226,2],[225,2],[230,2],[224,2],[232,2],[229,2],[228,2],[231,2],[233,798],[222,2],[319,799],[318,2],[324,800],[320,801],[323,802],[322,802],[325,800],[321,801],[242,803],[311,804],[431,805],[486,2],[455,806],[457,807],[358,808],[456,809],[429,768],[374,768],[214,2],[312,810],[239,811],[240,812],[241,813],[237,814],[404,814],[289,814],[313,815],[290,815],[236,816],[235,2],[317,817],[316,818],[315,819],[314,820],[430,821],[403,822],[402,823],[366,824],[398,825],[401,826],[412,827],[411,828],[407,829],[306,830],[308,831],[305,832],[346,833],[336,2],[445,2],[348,834],[406,2],[276,835],[355,739],[353,836],[278,837],[281,838],[481,2],[279,839],[282,839],[443,2],[442,2],[444,2],[479,2],[284,840],[303,841],[209,318],[258,2],[198,842],[309,2],[449,318],[197,2],[459,843],[302,318],[453,125],[301,844],[438,845],[300,843],[201,2],[461,846],[298,318],[299,318],[291,2],[196,2],[297,847],[296,848],[246,849],[364,397],[286,397],[342,2],[329,850],[328,2],[392,851],[304,318],[439,852],[85,318],[88,853],[89,854],[86,318],[87,2],[256,855],[251,856],[250,2],[249,857],[248,2],[437,858],[448,859],[450,860],[452,861],[1796,862],[1803,863],[454,864],[458,865],[492,866],[462,866],[491,867],[464,868],[475,869],[476,870],[478,871],[487,872],[490,742],[489,2],[488,241],[720,2],[1467,873],[1466,2],[1396,2],[714,874],[711,2],[712,874],[713,875],[716,876],[715,877],[1018,426],[726,878],[725,879],[1458,880],[1455,881],[1456,2],[1457,2],[1454,882],[1668,883],[1669,884],[1692,885],[1667,886],[1397,887],[1398,888],[1402,889],[1401,890],[1399,888],[1400,891],[1382,892],[1393,125],[1446,893],[1445,894],[1444,895],[1443,896],[1767,897],[1766,898],[1765,899],[1764,2],[330,418],[1463,900],[1473,901],[1449,341],[1462,902],[1465,903],[1292,318],[1663,904],[1453,905],[1451,906],[1452,907],[1450,2],[1296,2],[1287,2],[1285,2],[1289,908],[1286,909],[1290,910],[1720,911],[1308,2],[1411,912],[1410,2],[79,2],[80,2],[13,2],[14,2],[16,2],[15,2],[2,2],[17,2],[18,2],[19,2],[20,2],[21,2],[22,2],[23,2],[24,2],[3,2],[25,2],[26,2],[4,2],[27,2],[31,2],[28,2],[29,2],[30,2],[32,2],[33,2],[34,2],[5,2],[35,2],[36,2],[37,2],[38,2],[6,2],[42,2],[39,2],[40,2],[41,2],[43,2],[7,2],[44,2],[49,2],[50,2],[45,2],[46,2],[47,2],[48,2],[8,2],[54,2],[51,2],[52,2],[53,2],[55,2],[9,2],[56,2],[57,2],[58,2],[60,2],[59,2],[61,2],[62,2],[10,2],[63,2],[64,2],[65,2],[11,2],[66,2],[67,2],[68,2],[69,2],[70,2],[1,2],[71,2],[72,2],[12,2],[76,2],[74,2],[78,2],[73,2],[77,2],[75,2],[112,913],[122,914],[111,913],[132,915],[103,916],[102,917],[131,241],[125,918],[130,919],[105,920],[119,921],[104,922],[128,923],[100,924],[99,241],[129,925],[101,926],[106,927],[107,2],[110,927],[97,2],[133,928],[123,929],[114,930],[115,931],[117,932],[113,933],[116,934],[126,241],[108,935],[109,936],[118,937],[98,426],[121,929],[120,927],[124,2],[127,938],[1413,939],[1409,2],[1412,940],[1935,941],[1934,942],[1933,2],[1291,318],[1406,943],[1405,355],[1408,944],[1407,945],[831,946],[814,947],[821,948],[816,2],[817,2],[815,949],[818,950],[810,2],[811,2],[822,946],[813,951],[819,2],[820,952],[812,953],[802,954],[805,955],[803,955],[799,954],[806,956],[807,957],[804,955],[800,958],[801,959],[795,960],[747,961],[749,962],[793,2],[748,963],[794,964],[798,965],[796,2],[750,961],[751,2],[792,966],[746,967],[743,2],[797,968],[744,969],[745,2],[808,970],[752,971],[753,971],[754,971],[755,971],[756,971],[757,971],[758,971],[759,971],[760,971],[761,971],[762,971],[764,971],[763,971],[765,971],[766,971],[767,971],[791,972],[768,971],[769,971],[770,971],[771,971],[772,971],[773,971],[774,971],[775,971],[776,971],[778,971],[777,971],[779,971],[780,971],[781,971],[782,971],[783,971],[784,971],[785,971],[786,971],[787,971],[788,971],[789,971],[790,971],[718,973],[830,7],[1790,974],[1791,974],[1792,974],[1793,974],[1788,975],[1789,976],[1787,974]],\"semanticDiagnosticsPerFile\":[[1783,[{\"start\":134,\"length\":23,\"messageText\":\"Cannot find module '@/tests/prompts/utils' or its corresponding type declarations.\",\"category\":1,\"code\":2307}]]],\"affectedFilesPendingEmit\":[2015,2013,1761,1762,1763,1759,1760,1808,1809,1732,1771,1770,1769,1772,1775,1776,1777,1778,1820,1812,1819,1800,1699,1386,1324,1389,1395,1325,1700,1326,1822,1925,1926,1927,1928,1930,1931,1932,1936,1937,1938,1977,1978,1981,1745,1983,1984,1985,1992,1994,1995,1996,1991,1997,1998,1999,2000,2001,2002,1811,1702,1703,1741,1756,1805,1814,1817,1305,1384,1385,1818,1706,1665,1708,1666,1707,1717,2003,1715,2004,2005,2006,1334,1710,1748,1736,1693,2007,1750,2008,1716,2009,1815,1335,1388,1718,1734,1737,1740,1816,1752,1738,1394,1728,1729,1813,1810,1821,1806,1751,1694,1698,1797,1807,1754,1721,1929,1709,1712,1980,1383,1982,1975,1713,1744,1743,1719,1976,1993,1722,1804,2010,1749,1747,1723,1724,1727,1725,1733,1701,1755,1731,1739,498,1306,1779,1730,1705,1726,1704,709,1768,1780,1783,1746,1322,1323,1328,1329,1330,1331,1327,829,1786,1785,1757,1304,828,1697,1664,1696,2011,1695,1309,1332,1333,710,718,830,1790,1791,1792,1793,1788,1789,1787],\"version\":\"5.8.2\"}"
  },
  {
    "path": "vercel-template.json",
    "content": "{\n  \"products\": [\n    {\n      \"type\": \"integration\",\n      \"protocol\": \"storage\",\n      \"productSlug\": \"neon\",\n      \"integrationSlug\": \"neon\"\n    },\n    {\n      \"type\": \"integration\",\n      \"protocol\": \"storage\",\n      \"productSlug\": \"upstash-kv\",\n      \"integrationSlug\": \"upstash\"\n    },\n    {\n      \"type\": \"blob\"\n    }\n  ]\n}\n"
  },
  {
    "path": "vercel.json",
    "content": "{\n  \"framework\": \"nextjs\"\n}\n"
  }
]