@jvittechs/j 1.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/node-version-check.ts","../src/cli.ts","../src/errors/index.ts","../src/services/error-log.service.ts","../package.json","../src/services/config.service.ts","../src/utils/cli-name.ts","../src/services/version-check.service.ts","../src/commands/framework/auth.ts","../src/services/tracking.service.ts","../src/commands/status.ts","../src/services/components.service.ts","../src/commands/apply.ts","../src/ui/apply/UnifiedApplyApp.tsx","../src/services/migrate-ide.service.ts","../src/constants/ide-migration-configs.ts","../src/ui/shared/ProgressBar.tsx","../src/ui/shared/StatusIcon.tsx","../src/ui/shared/theme.ts","../src/commands/apply-new.ts","../src/ui/apply/TwoPaneApplyApp.tsx","../src/commands/update.ts","../src/commands/framework/check.ts","../src/commands/ide/index.ts","../src/commands/ide/context.ts","../src/ui/context/ContextApp.tsx","../src/ui/context/views/MainMenuView.tsx","../src/ui/context/views/IDEOverviewView.tsx","../src/ui/context/views/ListView.tsx","../src/ui/context/views/DetailView.tsx","../src/services/context-scanner.service.ts","../src/constants/ide-configs.ts","../src/commands/ide/setup.ts","../src/utils/prompt-theme.ts","../src/commands/ide/sync.ts","../src/commands/ide/status.ts","../src/services/ide-detection.service.ts","../src/config/ide-formats.ts","../src/commands/guide.ts","../src/ui/guide/GuideApp.tsx","../src/ui/guide/components/Layout.tsx","../src/ui/guide/utils/theme.ts","../src/ui/guide/components/Header.tsx","../src/ui/guide/components/Footer.tsx","../src/ui/guide/components/Sidebar/index.tsx","../src/ui/guide/components/Sidebar/MainMenu.tsx","../src/ui/guide/components/Sidebar/TableOfContents.tsx","../src/ui/guide/components/Content/ContentPane.tsx","../src/ui/guide/components/Content/Breadcrumb.tsx","../src/ui/guide/components/Content/MarkdownRenderer.tsx","../src/ui/guide/components/Content/ScrollIndicator.tsx","../src/ui/guide/components/Search/SearchOverlay.tsx","../src/ui/guide/hooks/useContent.ts","../src/ui/guide/utils/markdown.ts","../src/ui/guide/content/index.ts","../src/commands/chat.ts","../src/services/llm-proxy.service.ts","../src/ui/llm/LlmApp.tsx","../src/ui/llm/hooks/useChat.ts","../src/ui/llm/hooks/useLlmApi.ts","../src/ui/llm/components/ChatPanel.tsx","../src/ui/llm/components/MessageItem.tsx","../src/ui/llm/components/InputBox.tsx","../src/ui/llm/components/ModelSelector.tsx","../src/server/web-chat-server.ts","../src/server/session.ts","../src/server/file-service.ts","../src/commands/openai-keys.ts","../src/commands/stats.ts","../src/commands/translate.ts","../src/services/translation.service.ts","../src/commands/image/index.ts","../src/commands/image/gen.ts","../src/services/image.service.ts","../src/commands/image/list.ts","../src/commands/image/info.ts","../src/commands/image/delete.ts","../src/commands/feedback.ts","../src/commands/client-info.ts","../src/commands/errors/index.ts","../src/commands/errors/list.ts","../src/commands/errors/show.ts","../src/commands/errors/clear.ts","../src/commands/utils/index.ts","../src/commands/utils/password.ts","../src/services/utils.service.ts","../src/commands/utils/uuid.ts","../src/commands/utils/hash.ts","../src/commands/utils/base64-encode.ts","../src/commands/utils/base64-decode.ts","../src/commands/utils/http.ts","../src/commands/utils/jwt.ts","../src/commands/utils/unix-time.ts","../src/commands/utils/timezone.ts","../src/commands/utils/url-encode.ts","../src/commands/utils/url-decode.ts","../src/commands/utils/cron.ts","../src/commands/utils/markdown-preview.ts","../src/commands/utils/interactive.ts","../src/ui/utils/UtilsApp.tsx","../src/ui/utils/views/PasswordView.tsx","../src/ui/utils/views/UuidView.tsx","../src/ui/utils/views/HashView.tsx","../src/ui/utils/views/Base64View.tsx","../src/ui/utils/views/UrlView.tsx","../src/ui/utils/views/UnixTimeView.tsx","../src/ui/utils/views/JwtView.tsx","../src/ui/utils/views/CronView.tsx","../src/ui/utils/views/TimezoneView.tsx","../src/ui/utils/views/HttpView.tsx","../src/ui/utils/views/MarkdownView.tsx","../src/commands/deps/index.ts","../src/commands/deps/check.ts","../src/services/deps-detector.service.ts","../src/services/deps.service.ts","../src/services/deps-php.service.ts","../src/services/deps-python.service.ts","../src/commands/deps/upgrade.ts","../src/commands/tasks/index.ts","../src/commands/tasks/add.ts","../src/commands/tasks/list.ts","../src/commands/tasks/ready.ts","../src/commands/tasks/update.ts","../src/commands/tasks/show.ts","../src/commands/tasks/pick.ts","../src/commands/tasks/done.ts","../src/commands/tasks/dep.ts","../src/commands/tasks/sync.ts","../src/commands/tasks/guide.ts","../src/commands/kit/index.ts","../src/commands/kit/list.ts","../src/services/starter-kit.service.ts","../src/commands/kit/info.ts","../src/commands/kit/create.ts","../src/services/hook-executor.service.ts","../src/commands/rules/index.ts","../src/commands/rules/list.ts","../src/commands/rules/init.ts","../src/services/project-config.service.ts","../src/commands/rules/apply.ts","../src/services/rules-generator.service.ts","../src/services/backup.service.ts","../src/commands/rules/restore.ts","../src/commands/rules/sync.ts","../src/commands/rules/info.ts","../src/commands/upgrade.ts","../src/commands/clean.ts","../src/commands/redmine/check.ts","../src/services/redmine-config.service.ts","../src/types/redmine.types.ts","../src/api.ts","../src/services/redmine-connectivity.service.ts","../src/commands/redmine/sync-issue.ts","../src/sync-issue.ts","../src/mappers.ts","../src/slug.util.ts","../src/file.util.ts","../src/commands/redmine/sync-project.ts","../src/sync-project.ts","../src/commands/framework/info.ts","../src/commands/self-update.ts","../src/commands/clear-backups.ts","../src/commands/vscode/index.ts","../src/commands/context.ts","../src/commands/migrate-ide.ts","../src/utils/help-formatter.ts"],"sourcesContent":["import chalk from 'chalk';\nimport { execSync } from 'child_process';\n\n/**\n * Minimum required Node.js version\n * Must match package.json engines.node field\n */\nconst MIN_NODE_VERSION = '20.12.0';\n\n/**\n * Parse semantic version string to comparable number\n * Example: \"20.12.0\" -> [20, 12, 0]\n */\nfunction parseVersion(version: string): number[] {\n return version.replace(/^v/, '').split('.').map(Number);\n}\n\n/**\n * Compare two semantic versions\n * Returns: -1 if a < b, 0 if a == b, 1 if a > b\n */\nfunction compareVersions(a: string, b: string): number {\n const partsA = parseVersion(a);\n const partsB = parseVersion(b);\n\n for (let i = 0; i < Math.max(partsA.length, partsB.length); i++) {\n const numA = partsA[i] || 0;\n const numB = partsB[i] || 0;\n\n if (numA < numB) return -1;\n if (numA > numB) return 1;\n }\n\n return 0;\n}\n\n/**\n * Check if current Node.js version meets minimum requirement\n * Throws error if version is too old\n */\nexport function checkNodeVersion(): void {\n const currentVersion = process.version;\n\n if (compareVersions(currentVersion, MIN_NODE_VERSION) < 0) {\n console.error(chalk.red('โŒ Node.js version too old!'));\n console.error(chalk.yellow(` Current version: ${currentVersion}`));\n console.error(chalk.yellow(` Required version: >=${MIN_NODE_VERSION}`));\n console.error();\n console.error(chalk.cyan('๐Ÿ’ก Please upgrade Node.js:'));\n console.error(chalk.gray(' - Using nvm: nvm install 20 && nvm use 20'));\n console.error(chalk.gray(' - Using fnm: fnm install 20 && fnm use 20'));\n console.error(chalk.gray(' - Download: https://nodejs.org/'));\n console.error();\n process.exit(1);\n }\n}\n\n/**\n * Commands that require specific Node.js versions\n * Key: command path (e.g., \"kit create\", \"deps upgrade\")\n * Value: minimum version required\n */\nconst COMMAND_VERSION_REQUIREMENTS: Record<string, string> = {\n // Example: 'kit create': '20.12.0',\n // Example: 'deps upgrade': '20.12.0',\n};\n\n/**\n * Check if command requires specific Node.js version\n * @param commandPath - Command path (e.g., \"kit create\")\n */\nexport function checkCommandNodeVersion(commandPath: string): void {\n const requiredVersion = COMMAND_VERSION_REQUIREMENTS[commandPath];\n\n if (!requiredVersion) {\n return; // No specific requirement for this command\n }\n\n const currentVersion = process.version;\n\n if (compareVersions(currentVersion, requiredVersion) < 0) {\n console.error(chalk.red(`โŒ Command '${commandPath}' requires Node.js >=${requiredVersion}`));\n console.error(chalk.yellow(` Current version: ${currentVersion}`));\n console.error(chalk.yellow(` Required version: >=${requiredVersion}`));\n console.error();\n console.error(chalk.cyan('๐Ÿ’ก Please upgrade Node.js to use this command.'));\n console.error();\n process.exit(1);\n }\n}\n\n/**\n * Get recommended Node.js version for current OS/architecture\n * Useful for upgrade suggestions\n */\nexport function getRecommendedNodeVersion(): string {\n try {\n // Try to detect latest LTS version from nvm or fnm\n const nvmVersion = execSync('nvm ls-remote --lts | tail -1', {\n encoding: 'utf8',\n stdio: ['pipe', 'pipe', 'ignore'],\n }).trim();\n\n if (nvmVersion) {\n const match = nvmVersion.match(/v(\\d+\\.\\d+\\.\\d+)/);\n if (match) {\n return match[1];\n }\n }\n } catch {\n // Fallback to hardcoded LTS version\n }\n\n return '20.18.1'; // Latest LTS as of 2024\n}\n","#!/usr/bin/env node\n\n// Check Node.js version FIRST before importing anything else\nimport { checkNodeVersion } from './utils/node-version-check.js';\ncheckNodeVersion();\n\nimport { Command } from 'commander';\nimport { Jai1Error } from './errors/index.js';\nimport { ErrorLogService } from './services/error-log.service.js';\nimport { basename } from 'path';\nimport packageJson from '../package.json' with { type: 'json' };\nimport { checkForClientUpdate } from './services/version-check.service.js';\nimport { getCliName } from './utils/cli-name.js';\n\n// ============================================\n// SETUP & AUTH COMMANDS\n// ============================================\nimport { createAuthCommand } from './commands/framework/auth.js';\nimport { createStatusCommand } from './commands/status.js';\n\n// ============================================\n// COMPONENT MANAGEMENT COMMANDS\n// ============================================\nimport { createApplyCommand } from './commands/apply.js';\nimport { createApplyNewCommand } from './commands/apply-new.js';\nimport { createUpdateCommand } from './commands/update.js';\nimport { createCheckCommand } from './commands/framework/check.js';\n\n// ============================================\n// IDE COMMANDS (grouped)\n// ============================================\nimport { createIdeCommand } from './commands/ide/index.js';\n\n// ============================================\n// GUIDE COMMAND\n// ============================================\nimport { createGuideCommand } from './commands/guide.js';\n\n// ============================================\n// LLM PROXY COMMAND\n// ============================================\nimport { createChatCommand } from './commands/chat.js';\nimport { createOpenAiKeysCommand } from './commands/openai-keys.js';\nimport { createStatsCommand } from './commands/stats.js';\nimport { createTranslateCommand } from './commands/translate.js';\nimport { createImageCommand } from './commands/image/index.js';\nimport { createFeedbackCommand } from './commands/feedback.js';\nimport { createClientInfoCommand } from './commands/client-info.js';\nimport { createErrorsCommand } from './commands/errors/index.js';\n\n// ============================================\n// DEVELOPER UTILITIES\n// ============================================\nimport { createUtilsCommand } from './commands/utils/index.js';\nimport { createDepsCommand } from './commands/deps/index.js';\n\n// ============================================\n// TASK MANAGEMENT\n// ============================================\nimport { createTasksCommand } from './commands/tasks/index.js';\n\n// ============================================\n// STARTER KITS\n// ============================================\nimport { createKitCommand } from './commands/kit/index.js';\n// ============================================\nimport { createRulesCommand } from './commands/rules/index.js';\n\n\n\n// ============================================\n// MAINTENANCE COMMANDS\n// ============================================\nimport { createUpgradeCommand } from './commands/upgrade.js';\nimport { createCleanCommand } from './commands/clean.js';\n\n// ============================================\n// EXTERNAL INTEGRATIONS\n// ============================================\nimport { createRedmineCheckCommand } from './commands/redmine/check.js';\nimport { createSyncIssueCommand } from './commands/redmine/sync-issue.js';\nimport { createSyncProjectCommand } from './commands/redmine/sync-project.js';\n\n// ============================================\n// LEGACY ALIASES (for backward compatibility)\n// ============================================\nimport { createInfoCommand } from './commands/framework/info.js';\nimport { createSelfUpdateCommand } from './commands/self-update.js';\nimport { createClearBackupsCommand } from './commands/clear-backups.js';\nimport { createVSCodeCommand } from './commands/vscode/index.js';\nimport { createContextCommand } from './commands/context.js';\nimport { createMigrateIdeCommand } from './commands/migrate-ide.js';\n\n// ============================================\n// CUSTOM HELP\n// ============================================\nimport { showCustomHelp, showUnknownCommand } from './utils/help-formatter.js';\n\nconst program = new Command();\n\n// Manual version check to support update checking\nif (process.argv.includes('-v') || process.argv.includes('--version')) {\n console.log(packageJson.version);\n // Check for updates\n if (!process.argv.includes('--skip-update-check')) {\n await checkForClientUpdate();\n }\n process.exit(0);\n}\n\nprogram\n .name(getCliName())\n .description('Jai1 Framework Management CLI')\n .configureHelp({\n formatHelp: () => {\n showCustomHelp(packageJson.version);\n return '';\n },\n });\n// .version() removed to custom handle update check (handled above)\n\n// Global options (hidden from help)\nprogram\n // .option('-v, --version', 'output the version number') // Handled manually\n .option('--verbose', 'Enable verbose logging', false)\n .option('--json', 'Output results as JSON', false)\n .option('--skip-update-check', 'Skip checking for client updates', false);\n\n// ============================================\n// ๐Ÿ”ง SETUP & INFO\n// ============================================\nprogram.addCommand(createAuthCommand());\nprogram.addCommand(createStatusCommand());\n\n// ============================================\n// ๐Ÿ“ฆ COMPONENT MANAGEMENT\n// ============================================\nprogram.addCommand(createApplyCommand());\nprogram.addCommand(createApplyNewCommand());\nprogram.addCommand(createUpdateCommand());\nprogram.addCommand(createCheckCommand());\n\n// ============================================\n// ๐Ÿ–ฅ๏ธ IDE INTEGRATION (grouped)\n// ============================================\nprogram.addCommand(createIdeCommand());\n\n// ============================================\n// ๐Ÿ“š GUIDE\n// ============================================\nprogram.addCommand(createGuideCommand());\n\n// ============================================\n// ๐Ÿค– LLM PROXY\n// ============================================\nprogram.addCommand(createChatCommand());\nprogram.addCommand(createOpenAiKeysCommand());\nprogram.addCommand(createStatsCommand());\nprogram.addCommand(createTranslateCommand());\nprogram.addCommand(createImageCommand());\nprogram.addCommand(createFeedbackCommand());\nprogram.addCommand(createClientInfoCommand());\nprogram.addCommand(createErrorsCommand());\n\n// ============================================\n// ๐Ÿ› ๏ธ DEVELOPER UTILITIES\n// ============================================\nprogram.addCommand(createUtilsCommand());\nprogram.addCommand(createDepsCommand());\n\n// ============================================\n// ๐Ÿ“‹ TASK MANAGEMENT\n// ============================================\nprogram.addCommand(createTasksCommand());\n\n// ============================================\n// ๐Ÿ“ฆ STARTER KITS\n// ============================================\nprogram.addCommand(createKitCommand());\n// ============================================\n// ๐Ÿ“‹ RULE PRESETS\n// ============================================\nprogram.addCommand(createRulesCommand());\n\n\n// ============================================\n// ๐Ÿ”ง MAINTENANCE\n// ============================================\nprogram.addCommand(createUpgradeCommand());\nprogram.addCommand(createCleanCommand());\n\n// ============================================\n// ๐Ÿ”— EXTERNAL INTEGRATIONS\n// ============================================\nconst redmineCommand = new Command('redmine')\n .description('Redmine context sync commands');\n\nredmineCommand.addCommand(createRedmineCheckCommand());\n\nconst syncCommand = new Command('sync')\n .description('Sync Redmine issues to markdown files');\n\nsyncCommand.addCommand(createSyncIssueCommand());\nsyncCommand.addCommand(createSyncProjectCommand());\n\nredmineCommand.addCommand(syncCommand);\n\nprogram.addCommand(redmineCommand);\n\n// ============================================\n// ๐Ÿ”„ LEGACY ALIASES (backward compatibility)\n// Hidden from help, but still work\n// ============================================\n\n\n// Legacy: info -> status\nprogram.addCommand(createInfoCommand(), { hidden: true });\n\n// Legacy: self-update -> upgrade\nprogram.addCommand(createSelfUpdateCommand(), { hidden: true });\n\n// Legacy: clear-backups -> clean\nprogram.addCommand(createClearBackupsCommand(), { hidden: true });\n\n// Legacy: vscode -> ide setup\nprogram.addCommand(createVSCodeCommand(), { hidden: true });\n\n// Legacy: context -> ide context\nprogram.addCommand(createContextCommand(), { hidden: true });\n\n// Legacy: migrate-ide -> ide sync\nprogram.addCommand(createMigrateIdeCommand(), { hidden: true });\n\n\n// Handle unknown commands\nprogram.on('command:*', (operands) => {\n showUnknownCommand(operands[0]);\n process.exit(1);\n});\n\n// Error handling\nprocess.on('unhandledRejection', (error) => {\n // Best-effort local error log (never blocks exit)\n void new ErrorLogService().logError(error, {\n command: process.argv.slice(2).join(' '),\n cwdBase: basename(process.cwd()),\n });\n\n if (error instanceof Jai1Error) {\n console.error('โŒ', error.message);\n process.exit(error.exitCode);\n } else if (error instanceof Error) {\n console.error('โŒ Unexpected error:', error.message);\n if (program.opts().verbose) {\n console.error(error.stack);\n }\n process.exit(1);\n }\n});\n\n// Parse and execute\nprogram.parseAsync(process.argv).then(async () => {\n const opts = program.opts();\n\n // Check for client updates after command execution (unless skipped)\n if (!opts.skipUpdateCheck) {\n await checkForClientUpdate();\n }\n}).catch((error) => {\n // Best-effort local error log (never blocks exit)\n void new ErrorLogService().logError(error, {\n command: process.argv.slice(2).join(' '),\n cwdBase: basename(process.cwd()),\n });\n\n console.error('โŒ', error.message);\n process.exit(1);\n});\n","/**\n * Base error class for jai1-client\n */\nexport class Jai1Error extends Error {\n constructor(\n message: string,\n public exitCode: number\n ) {\n super(message);\n this.name = 'Jai1Error';\n }\n}\n\n/**\n * Validation error (exit code 2)\n */\nexport class ValidationError extends Jai1Error {\n constructor(message: string) {\n super(message, 2);\n this.name = 'ValidationError';\n }\n}\n\n/**\n * Authentication error (exit code 3)\n */\nexport class AuthenticationError extends Jai1Error {\n constructor(message: string) {\n super(message, 3);\n this.name = 'AuthenticationError';\n }\n}\n\n/**\n * Not found error (exit code 4)\n */\nexport class NotFoundError extends Jai1Error {\n constructor(message: string) {\n super(message, 4);\n this.name = 'NotFoundError';\n }\n}\n\n/**\n * Network/System error (exit code 5)\n */\nexport class NetworkError extends Jai1Error {\n constructor(message: string) {\n super(message, 5);\n this.name = 'NetworkError';\n }\n}\n","import { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { Jai1Error } from '../errors/index.js';\n\nexport interface ErrorLogContext {\n command?: string;\n cwdBase?: string;\n details?: unknown;\n}\n\nexport interface ErrorLogEntry {\n timestamp: string;\n command?: string;\n cwdBase?: string;\n name: string;\n message: string;\n stack?: string;\n exitCode?: number;\n details?: unknown;\n}\n\nexport interface ReadForSubmitResult {\n files: Array<{ path: string; entry: ErrorLogEntry; bytes: number }>;\n totalBytes: number;\n}\n\nexport interface ReadLogResult {\n entry: ErrorLogEntry;\n bytes: number;\n}\n\nexport class ErrorLogService {\n private readonly jai1Dir: string;\n private readonly errorDir: string;\n\n constructor() {\n this.jai1Dir = join(homedir(), '.jai1');\n this.errorDir = join(this.jai1Dir, 'errors');\n }\n\n getErrorDir(): string {\n return this.errorDir;\n }\n\n async logError(error: unknown, context: ErrorLogContext = {}): Promise<string | null> {\n const err = error instanceof Error ? error : new Error(String(error));\n const nowIso = new Date().toISOString();\n const filenameSafe = nowIso.replace(/[:.]/g, '-');\n\n const entry: ErrorLogEntry = {\n timestamp: nowIso,\n command: context.command,\n cwdBase: context.cwdBase,\n name: err.name || 'Error',\n message: err.message || 'Unknown error',\n stack: err.stack,\n exitCode: error instanceof Jai1Error ? error.exitCode : undefined,\n details: context.details,\n };\n\n try {\n await fs.mkdir(this.errorDir, { recursive: true, mode: 0o700 });\n const filePath = join(this.errorDir, `error-${filenameSafe}.json`);\n await fs.writeFile(filePath, JSON.stringify(entry, null, 2), { mode: 0o600 });\n\n // Best-effort rotation\n await this.enforceRotation(20);\n return filePath;\n } catch {\n // Never block CLI on logging\n return null;\n }\n }\n\n async list(): Promise<string[]> {\n try {\n const entries = await fs.readdir(this.errorDir, { withFileTypes: true });\n return entries\n .filter((e) => e.isFile() && e.name.endsWith('.json'))\n .map((e) => join(this.errorDir, e.name))\n .sort()\n .reverse();\n } catch {\n return [];\n }\n }\n\n async readLog(path: string): Promise<ReadLogResult | null> {\n try {\n const content = await fs.readFile(path, 'utf-8');\n const bytes = Buffer.byteLength(content, 'utf-8');\n const entry = JSON.parse(content) as ErrorLogEntry;\n return { entry, bytes };\n } catch {\n return null;\n }\n }\n\n async readForSubmit(options: { limitCount: number; limitBytes: number }): Promise<ReadForSubmitResult> {\n const paths = await this.list();\n const selected = paths.slice(0, options.limitCount);\n\n const result: ReadForSubmitResult = { files: [], totalBytes: 0 };\n\n for (const path of selected) {\n const read = await this.readLog(path);\n if (!read) continue;\n\n if (result.totalBytes + read.bytes > options.limitBytes) {\n break;\n }\n\n result.files.push({ path, entry: read.entry, bytes: read.bytes });\n result.totalBytes += read.bytes;\n }\n\n return result;\n }\n\n async clear(filePaths: string[]): Promise<void> {\n await Promise.all(\n filePaths.map(async (p) => {\n try {\n await fs.rm(p, { force: true });\n } catch {\n // ignore\n }\n })\n );\n }\n\n private async enforceRotation(maxFiles: number): Promise<void> {\n try {\n const paths = await this.list();\n const toDelete = paths.slice(maxFiles);\n if (toDelete.length === 0) return;\n await this.clear(toDelete);\n } catch {\n // ignore\n }\n }\n}\n","{\n \"name\": \"@jvittechs/j\",\n \"version\": \"1.0.11\",\n \"description\": \"A unified CLI tool for JV-IT TECHS developers to manage Jai1 Framework. Supports both `j` and `jai1` commands. Please contact TeamAI for usage instructions.\",\n \"type\": \"module\",\n \"bin\": {\n \"j\": \"dist/cli.js\",\n \"jai1\": \"dist/cli.js\"\n },\n \"exports\": {\n \".\": \"./dist/cli.js\"\n },\n \"files\": [\n \"dist\",\n \"redmine.config.example.yaml\",\n \"scripts/redmine-sync-issue.sh\",\n \"scripts/postinstall.js\"\n ],\n \"engines\": {\n \"node\": \">=20\"\n },\n \"license\": \"MIT\",\n \"author\": \"JVIT <dev@jvit.com>\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/jvittechs/jai.git\",\n \"directory\": \"packages/cli\"\n },\n \"homepage\": \"https://github.com/jvittechs/jai/tree/main/packages/cli#readme\",\n \"keywords\": [\n \"jai1\",\n \"framework\",\n \"redmine\",\n \"cli\",\n \"markdown\",\n \"issues\",\n \"context\",\n \"agentic\",\n \"coding\"\n ],\n \"scripts\": {\n \"postinstall\": \"node scripts/postinstall.js\",\n \"bundle:guide\": \"node scripts/bundle-guide-content.js\",\n \"build\": \"npm run bundle:guide && tsup src/cli.ts --dts --format esm --target node22 --out-dir dist --sourcemap && npm run copy-web-chat\",\n \"copy-web-chat\": \"mkdir -p dist/web-chat && cp -r src/web-chat/* dist/web-chat/\",\n \"dev\": \"tsx src/cli.ts --help\",\n \"lint\": \"eslint .\",\n \"test\": \"vitest run\",\n \"release\": \"node scripts/release.js\",\n \"smart-publish\": \"node scripts/smart-publish.js\"\n },\n \"dependencies\": {\n \"@inquirer/prompts\": \"^8.0.2\",\n \"adm-zip\": \"^0.5.16\",\n \"bcryptjs\": \"^2.4.3\",\n \"boxen\": \"^8.0.1\",\n \"chalk\": \"^5.6.2\",\n \"cli-progress\": \"^3.12.0\",\n \"cli-table3\": \"^0.6.5\",\n \"clipboardy\": \"^4.0.0\",\n \"commander\": \"^12.1.0\",\n \"cronstrue\": \"^2.50.0\",\n \"execa\": \"^9.6.1\",\n \"figlet\": \"^1.9.4\",\n \"gradient-string\": \"^3.0.0\",\n \"gray-matter\": \"^4.0.3\",\n \"ignore\": \"^7.0.5\",\n \"ink\": \"^5.0.1\",\n \"ink-spinner\": \"^5.0.0\",\n \"ink-text-input\": \"^6.0.0\",\n \"marked\": \"^12.0.0\",\n \"marked-terminal\": \"^7.0.0\",\n \"open\": \"^10.1.0\",\n \"ora\": \"^9.0.0\",\n \"p-limit\": \"^5.0.0\",\n \"p-queue\": \"^7.4.1\",\n \"p-retry\": \"^6.2.0\",\n \"react\": \"^18.3.1\",\n \"slugify\": \"^1.6.6\",\n \"terminal-image\": \"^4.1.0\",\n \"undici\": \"^6.19.5\",\n \"yaml\": \"^2.5.0\",\n \"zod\": \"^3.23.8\"\n },\n \"devDependencies\": {\n \"@changesets/cli\": \"^2.27.7\",\n \"@types/figlet\": \"^1.7.0\",\n \"@types/gradient-string\": \"^1.1.6\",\n \"@types/node\": \"^24.10.1\",\n \"@types/react\": \"^18.3.12\",\n \"@typescript-eslint/eslint-plugin\": \"^8.6.0\",\n \"@typescript-eslint/parser\": \"^8.6.0\",\n \"@vitest/coverage-v8\": \"^2.1.4\",\n \"eslint\": \"^9.9.0\",\n \"prettier\": \"^3.3.3\",\n \"tsup\": \"^8.1.0\",\n \"tsx\": \"^4.19.2\",\n \"typescript\": \"^5.6.3\",\n \"vitest\": \"^2.1.4\"\n }\n}","import { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport type { Jai1Config } from '../types/framework.types.js';\n\n/**\n * Service for managing Jai1 global configuration\n * Config stored in ~/.jai1/config.json\n */\nexport class ConfigService {\n private readonly configDir: string;\n private readonly configPath: string;\n\n constructor() {\n this.configDir = join(homedir(), '.jai1');\n this.configPath = join(this.configDir, 'config.json');\n }\n\n /**\n * Check if config file exists\n */\n async exists(): Promise<boolean> {\n try {\n await fs.access(this.configPath);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Load configuration from file\n * @returns Config object or null if not found\n */\n async load(): Promise<Jai1Config | null> {\n if (!(await this.exists())) {\n return null;\n }\n\n try {\n const content = await fs.readFile(this.configPath, 'utf-8');\n return JSON.parse(content) as Jai1Config;\n } catch (error) {\n throw new Error(\n `Failed to load config: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Save configuration to file\n * Creates directory if it doesn't exist\n * Sets proper file permissions (600)\n */\n async save(config: Jai1Config): Promise<void> {\n try {\n // Ensure directory exists with restricted permissions\n await fs.mkdir(this.configDir, { recursive: true, mode: 0o700 });\n\n // Write config with restricted permissions\n await fs.writeFile(this.configPath, JSON.stringify(config, null, 2), {\n mode: 0o600,\n });\n } catch (error) {\n throw new Error(\n `Failed to save config: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Get config file path\n */\n getConfigPath(): string {\n return this.configPath;\n }\n\n /**\n * Get config directory path\n */\n getConfigDir(): string {\n return this.configDir;\n }\n}\n","import { basename } from 'path';\n\n/**\n * Detect which binary name was used to invoke the CLI.\n * Returns 'jai1' if invoked as 'jai1', otherwise defaults to 'j'.\n */\nexport function getCliName(): string {\n const bin = basename(process.argv[1] || '');\n return bin === 'jai1' ? 'jai1' : 'j';\n}\n","import { ConfigService } from './config.service.js';\nimport packageJson from '../../package.json' with { type: 'json' };\nimport { getCliName } from '../utils/cli-name.js';\n\n// Colors for terminal output\nconst colors = {\n yellow: '\\x1b[33m',\n cyan: '\\x1b[36m',\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n};\n\n// Cache to avoid checking too frequently\nlet lastCheckTime = 0;\nlet cachedLatestVersion: string | null = null;\nlet shouldCheckUpdates = true;\nconst CHECK_INTERVAL_MS = 60 * 60 * 1000; // 1 hour\n\n/**\n * Disable automatic update checks for this session\n */\nexport function disableUpdateCheck() {\n shouldCheckUpdates = false;\n}\n\n/**\n * Check if there's a newer version of jai1-client available\n * This runs silently and only shows a message if update is available\n */\nexport async function checkForClientUpdate(): Promise<void> {\n if (!shouldCheckUpdates) return;\n\n try {\n // Check only once per hour\n const now = Date.now();\n if (now - lastCheckTime < CHECK_INTERVAL_MS && cachedLatestVersion) {\n if (isNewerVersion(cachedLatestVersion, packageJson.version)) {\n showUpdateNotification(cachedLatestVersion);\n }\n return;\n }\n\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n return; // Not initialized, skip check\n }\n\n // Fetch latest client version from API\n const response = await fetch(`${config.apiUrl}/api/versions/client`, {\n headers: {\n 'JAI1-Access-Key': config.accessKey,\n },\n signal: AbortSignal.timeout(5000), // 5 second timeout\n });\n\n if (!response.ok) {\n return; // Silently fail\n }\n\n const data = await response.json() as {\n component: string;\n version: string;\n releasedAt: string;\n releaseNotes?: string;\n minClientVersion?: string;\n };\n lastCheckTime = now;\n cachedLatestVersion = data.version;\n\n if (isNewerVersion(data.version, packageJson.version)) {\n showUpdateNotification(data.version);\n }\n } catch {\n // Silently fail - don't interrupt user flow\n }\n}\n\n/**\n * Compare versions to check if remote is newer than local\n */\nfunction isNewerVersion(remote: string, local: string): boolean {\n const remoteParts = remote.split('.').map(Number);\n const localParts = local.split('.').map(Number);\n\n for (let i = 0; i < 3; i++) {\n const r = remoteParts[i] || 0;\n const l = localParts[i] || 0;\n\n if (r > l) return true;\n if (r < l) return false;\n }\n\n return false;\n}\n\n/**\n * Show update notification to user\n */\nfunction showUpdateNotification(latestVersion: string): void {\n console.log('');\n console.log(`${colors.yellow}โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ${colors.reset}`);\n console.log(`${colors.yellow}โ”‚${colors.reset} ${colors.bold}โฌ†๏ธ Update available!${colors.reset} ${packageJson.version} โ†’ ${colors.cyan}${latestVersion}${colors.reset} ${colors.yellow}โ”‚${colors.reset}`);\n console.log(`${colors.yellow}โ”‚${colors.reset} Run: ${colors.cyan}${getCliName()} upgrade${colors.reset} ${colors.yellow}โ”‚${colors.reset}`);\n console.log(`${colors.yellow}โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ${colors.reset}`);\n console.log('');\n}\n\n/**\n * Get current client version\n */\nexport function getClientVersion(): string {\n return packageJson.version;\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport boxen from 'boxen';\nimport { ConfigService } from '../../services/config.service.js';\nimport { trackActionSync } from '../../services/tracking.service.js';\nimport { ValidationError } from '../../errors/index.js';\nimport type { InitOptions } from '../../types/framework.types.js';\nimport { getCliName } from '../../utils/cli-name.js';\n\n/**\n * Create auth command for Jai1 Framework\n * Allows both interactive and non-interactive modes\n */\nexport function createAuthCommand(): Command {\n const cmd = new Command('auth')\n .description('Xรกc thแปฑc vร  cแบฅu hรฌnh client')\n .option('--api-url <url>', 'Jai1 Store API URL')\n .option('--access-key <key>', 'Your access key')\n .action(async (options: InitOptions) => {\n await handleAuth(options);\n });\n\n return cmd;\n}\n\nasync function handleAuth(options: InitOptions): Promise<void> {\n const configService = new ConfigService();\n\n let apiUrl: string;\n let accessKey: string;\n let isInteractive = false;\n\n // Check if config already exists\n const existingConfig = await configService.load();\n if (existingConfig) {\n console.log(\n chalk.yellow('โš ๏ธ Cแบฅu hรฌnh ฤ‘รฃ tแป“n tแบกi tแบกi:'),\n chalk.dim(configService.getConfigPath())\n );\n console.log(\n chalk.dim(' Chแบกy lแบกi lแป‡nh nร y vแป›i giรก trแป‹ mแป›i ฤ‘แปƒ ghi ฤ‘รจ.\\n')\n );\n }\n\n // Interactive vs Non-Interactive mode\n if (options.apiUrl && options.accessKey) {\n // Non-interactive mode\n apiUrl = options.apiUrl;\n accessKey = options.accessKey;\n } else if (options.apiUrl || options.accessKey) {\n // Partial options provided - error\n throw new ValidationError(\n 'Cแบงn cแบฃ --api-url vร  --access-key trong non-interactive mode'\n );\n } else {\n // Interactive mode\n isInteractive = true;\n\n console.log(\n boxen(chalk.cyan.bold('๐Ÿš€ Jai1 Client Setup'), {\n padding: { left: 1, right: 1, top: 0, bottom: 0 },\n borderStyle: 'round',\n borderColor: 'cyan',\n })\n );\n console.log();\n\n // For now, use simple readline until inquirer is installed\n const readline = await import('readline');\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n const question = (prompt: string): Promise<string> => {\n return new Promise((resolve) => {\n rl.question(prompt, (answer) => {\n resolve(answer);\n });\n });\n };\n\n apiUrl = await question(\n chalk.dim('API URL') + chalk.gray(' (https://store.jai1.io): ')\n );\n if (!apiUrl) {\n apiUrl = 'https://store.jai1.io';\n }\n\n accessKey = await question(chalk.dim('Access Key: '));\n if (!accessKey) {\n rl.close();\n throw new ValidationError('Access key lร  bแบฏt buแป™c');\n }\n\n rl.close();\n }\n\n // Validate API URL format\n try {\n new URL(apiUrl);\n } catch {\n throw new ValidationError('ฤแป‹nh dแบกng API URL khรดng hแปฃp lแป‡');\n }\n\n console.log(chalk.dim('\\nฤang xรกc thแปฑc access key...'));\n\n // TODO: Validate access key with API\n // For now, just save it\n // const isValid = await validateAccessKey(apiUrl, accessKey);\n // if (!isValid) {\n // throw new AuthenticationError('Invalid access key');\n // }\n\n // Save config\n await configService.save({\n apiUrl,\n accessKey,\n version: null,\n lastUpdated: null,\n });\n\n // Track auth action (sync to ensure it completes before exit)\n await trackActionSync('auth', {\n configPath: configService.getConfigPath(),\n mode: isInteractive ? 'interactive' : 'non-interactive',\n isReconfig: !!existingConfig,\n });\n\n console.log(\n chalk.green('โœ“ Cแบฅu hรฌnh ฤ‘รฃ lฦฐu tแบกi'),\n chalk.dim(configService.getConfigPath())\n );\n console.log();\n console.log(\n chalk.dim('Bแบกn ฤ‘รฃ sแบตn sร ng! Chแบกy'),\n chalk.cyan(`'${getCliName()} check'`),\n chalk.dim('ฤ‘แปƒ kiแปƒm tra cแบญp nhแบญt.')\n );\n}\n","import { ConfigService } from './config.service.js';\nimport { platform, release, arch, hostname, homedir } from 'os';\nimport { version as nodeVersion } from 'process';\nimport packageJson from '../../package.json' with { type: 'json' };\n\n/**\n * Tracking action categories\n */\nexport type TrackingAction =\n | 'init'\n | 'download'\n | 'version_check'\n | 'sync'\n | 'update'\n | 'redmine_check'\n | 'redmine_sync_issue'\n | 'redmine_sync_project'\n | 'vscode'\n | 'info'\n | 'check';\n\nexport interface TrackingDetail {\n [key: string]: unknown;\n}\n\n/**\n * Get basic system info for logging\n */\nfunction getSystemInfo(): Record<string, string> {\n return {\n os: platform(),\n osRelease: release(),\n arch: arch(),\n nodeVersion: nodeVersion,\n hostname: hostname(),\n homeDir: homedir(),\n };\n}\n\n/**\n * Service for tracking CLI usage to server\n * Tracking is fire-and-forget, errors are silently ignored\n */\nexport class TrackingService {\n private configService: ConfigService;\n\n constructor() {\n this.configService = new ConfigService();\n }\n\n /**\n * Track a CLI action (fire-and-forget)\n * WARNING: Process may exit before request completes\n * Use trackSync for important events\n *\n * @param action - The action being performed\n * @param detail - Optional additional details\n */\n async track(action: TrackingAction, detail?: TrackingDetail): Promise<void> {\n try {\n const config = await this.configService.load();\n if (!config || !config.accessKey || !config.apiUrl) {\n return;\n }\n\n const trackUrl = `${config.apiUrl.replace(/\\/$/, '')}/api/track`;\n\n // Fire and forget - don't await\n this.sendTrackingEvent(trackUrl, config.accessKey, action, detail).catch(\n () => {\n // Silently ignore tracking errors\n }\n );\n } catch {\n // Silently ignore config errors\n }\n }\n\n /**\n * Track a CLI action synchronously (waits for completion)\n * Use this for important events before process exit\n */\n async trackSync(action: TrackingAction, detail?: TrackingDetail): Promise<boolean> {\n try {\n const config = await this.configService.load();\n if (!config || !config.accessKey || !config.apiUrl) {\n return false;\n }\n\n const trackUrl = `${config.apiUrl.replace(/\\/$/, '')}/api/track`;\n return await this.sendTrackingEvent(trackUrl, config.accessKey, action, detail);\n } catch {\n return false;\n }\n }\n\n private async sendTrackingEvent(\n trackUrl: string,\n accessKey: string,\n action: TrackingAction,\n detail?: TrackingDetail\n ): Promise<boolean> {\n try {\n // Merge detail with system info\n const enrichedDetail = {\n ...getSystemInfo(),\n ...detail,\n };\n\n const response = await fetch(trackUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'JAI1-Access-Key': accessKey,\n },\n body: JSON.stringify({\n action,\n detail: enrichedDetail,\n clientVersion: packageJson.version,\n }),\n // Timeout to avoid blocking too long\n signal: AbortSignal.timeout(10000),\n });\n\n return response.ok;\n } catch {\n return false;\n }\n }\n}\n\n// Singleton instance for convenience\nlet trackingInstance: TrackingService | null = null;\n\n/**\n * Get or create tracking service instance\n */\nexport function getTrackingService(): TrackingService {\n if (!trackingInstance) {\n trackingInstance = new TrackingService();\n }\n return trackingInstance;\n}\n\n/**\n * Convenience function to track an action (fire-and-forget)\n * WARNING: May not complete before process exit\n */\nexport function trackAction(action: TrackingAction, detail?: TrackingDetail): void {\n getTrackingService().track(action, detail);\n}\n\n/**\n * Convenience function to track an action synchronously\n * Use this for important events at end of commands\n */\nexport async function trackActionSync(action: TrackingAction, detail?: TrackingDetail): Promise<boolean> {\n return getTrackingService().trackSync(action, detail);\n}\n","/**\n * Status Command\n * Show CLI client configuration and installed components status\n *\n * Renamed from 'info' to 'status' for clarity (common CLI pattern)\n */\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport boxen from 'boxen';\nimport { ConfigService } from '../services/config.service.js';\nimport { ComponentsService } from '../services/components.service.js';\nimport { ValidationError } from '../errors/index.js';\nimport { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport type { InfoOptions } from '../types/framework.types.js';\nimport { getCliName } from '../utils/cli-name.js';\n\n/**\n * Create status command\n */\nexport function createStatusCommand(): Command {\n const cmd = new Command('status')\n .description('Hiแปƒn thแป‹ trแบกng thรกi cแบฅu hรฌnh vร  components')\n .option('--json', 'Output as JSON')\n .option('--verbose', 'Show detailed information')\n .action(async (options: InfoOptions) => {\n await handleStatus(options);\n });\n\n return cmd;\n}\n\nasync function handleStatus(options: InfoOptions): Promise<void> {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError(`Not initialized. Run \"${getCliName()} auth\" first.`);\n }\n\n const componentsService = new ComponentsService();\n const frameworkPath = join(homedir(), '.jai1', 'framework');\n const projectStatus = await getProjectStatus();\n const installedComponents = await componentsService.getInstalled();\n const componentCount = Object.keys(installedComponents).length;\n\n const info = {\n configPath: configService.getConfigPath(),\n apiUrl: config.apiUrl,\n accessKey: maskKey(config.accessKey),\n version: config.version || 'Not downloaded',\n lastUpdated: config.lastUpdated || 'Never',\n frameworkPath,\n projectStatus,\n componentCount,\n };\n\n if (options.json) {\n console.log(JSON.stringify(info, null, 2));\n return;\n }\n\n // Header\n console.log(\n boxen(chalk.cyan.bold('๐Ÿ“Š Jai1 Client Status'), {\n padding: { left: 1, right: 1, top: 0, bottom: 0 },\n borderStyle: 'round',\n borderColor: 'cyan',\n })\n );\n\n // Configuration section\n console.log(chalk.bold('\\n๐Ÿ”ง Cแบฅu hรฌnh'));\n console.log(` ${chalk.dim('Config:')} ${info.configPath}`);\n console.log(` ${chalk.dim('API URL:')} ${info.apiUrl}`);\n console.log(` ${chalk.dim('Access Key:')} ${chalk.yellow(info.accessKey)}`);\n\n // Framework section\n console.log(chalk.bold('\\n๐Ÿ“ฆ Framework'));\n console.log(` ${chalk.dim('Version:')} ${chalk.green(info.version)}`);\n console.log(` ${chalk.dim('Updated:')} ${info.lastUpdated}`);\n console.log(` ${chalk.dim('Location:')} ${info.frameworkPath}`);\n\n // Project section\n console.log(chalk.bold('\\n๐Ÿ“ Project'));\n const existsIcon = info.projectStatus.exists\n ? chalk.green('โœ“')\n : chalk.red('โœ—');\n console.log(` ${chalk.dim('.jai1/ exists:')} ${existsIcon}`);\n if (info.projectStatus.exists) {\n console.log(\n ` ${chalk.dim('Components:')} ${chalk.cyan(componentCount)} installed`\n );\n }\n\n // Quick tips\n console.log();\n if (!info.projectStatus.exists) {\n console.log(\n chalk.dim(`๐Ÿ’ก Chแบกy \"${getCliName()} apply\" ฤ‘แปƒ cร i components cho project nร y.`)\n );\n } else if (componentCount > 0) {\n console.log(\n chalk.dim(`๐Ÿ’ก Chแบกy \"${getCliName()} check\" ฤ‘แปƒ kiแปƒm tra cแบญp nhแบญt components.`)\n );\n }\n}\n\nfunction maskKey(key: string): string {\n if (key.length <= 4) return '****';\n return '****' + key.slice(-4);\n}\n\nasync function getProjectStatus(): Promise<{ exists: boolean; version?: string }> {\n const projectJai1 = join(process.cwd(), '.jai1');\n try {\n await fs.access(projectJai1);\n // Try to read version from project\n return { exists: true, version: 'Synced' };\n } catch {\n return { exists: false };\n }\n}\n","import { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { gunzipSync } from 'zlib';\nimport { createHash } from 'crypto';\nimport type { Jai1Config } from '../types/framework.types.js';\nimport { NetworkError } from '../errors/index.js';\n\n/**\n * Component from API\n */\nexport interface Component {\n id: number;\n filepath: string;\n name: string;\n description: string | null;\n content: string | null;\n contentType: 'markdown' | 'bundle' | 'zip' | 'rule-preset'; // 'zip' for legacy compatibility\n version: string;\n downloads: number;\n status: string;\n tags?: string[];\n dependencies?: { filepath: string; required: boolean }[];\n}\n\n/**\n * Tag from API\n */\nexport interface Tag {\n tag: string;\n count: number;\n}\n\n/**\n * Installed component info\n */\nexport interface InstalledComponent {\n filepath: string;\n version: string;\n checksum: string;\n installedAt: string;\n modified: boolean;\n}\n\n/**\n * Rule preset bundle structure\n */\ninterface RulePresetBundle {\n preset: {\n slug: string;\n name: string;\n description: string;\n version: string;\n tags: string[];\n stack: Record<string, string | null>;\n files: {\n required: string[];\n optional: string[];\n template: string[];\n };\n output?: {\n agentsMd?: boolean;\n ideFolder?: string;\n };\n };\n files: Record<string, string>;\n}\n\n/**\n * Service for managing components\n */\nexport class ComponentsService {\n private readonly cacheDir: string;\n private readonly manifestFile: string;\n\n constructor(projectRoot: string = process.cwd()) {\n this.cacheDir = join(homedir(), '.jai1', 'cache');\n this.manifestFile = join(projectRoot, '.jai1', 'manifest.json');\n }\n\n /**\n * Expand component paths with special prefixes\n *\n * Supported formats:\n * - Standard paths: \"rule-presets/react-spa-zustand\", \"rules/jai1.md\", \"workflows/commit-it.md\"\n * - Package prefix: \"package:core\" -> expands to all components in that package\n *\n * @param config - Jai1 config\n * @param paths - Array of component paths (may include special prefixes)\n * @returns Array of expanded component paths\n */\n async expandPaths(config: Jai1Config, paths: string[]): Promise<string[]> {\n const expandedPaths: string[] = [];\n\n for (const path of paths) {\n if (path.startsWith('package:')) {\n // Package prefix: fetch all components and filter by package\n const packageName = path.substring('package:'.length);\n const components = await this.list(config);\n\n // Currently only 'core' package is supported\n // All components in the API are from the core package\n if (packageName === 'core') {\n expandedPaths.push(...components.map(c => c.filepath));\n } else {\n console.warn(`Warning: Unknown package '${packageName}', skipping`);\n }\n } else {\n // Standard path: use as-is\n expandedPaths.push(path);\n }\n }\n\n return expandedPaths;\n }\n\n /**\n * List components from API\n */\n async list(config: Jai1Config, options?: { tag?: string; search?: string }): Promise<Component[]> {\n const params = new URLSearchParams();\n if (options?.tag) params.set('tag', options.tag);\n if (options?.search) params.set('search', options.search);\n\n const url = `${config.apiUrl}/api/components${params.toString() ? '?' + params.toString() : ''}`;\n\n const response = await fetch(url, {\n headers: { 'JAI1-Access-Key': config.accessKey },\n });\n\n if (!response.ok) {\n throw new NetworkError(`Failed to list components: HTTP ${response.status}`);\n }\n\n const data = await response.json() as { components: Component[] };\n return data.components;\n }\n\n /**\n * List available tags\n */\n async listTags(config: Jai1Config): Promise<Tag[]> {\n const response = await fetch(`${config.apiUrl}/api/tags`, {\n headers: { 'JAI1-Access-Key': config.accessKey },\n });\n\n if (!response.ok) {\n throw new NetworkError(`Failed to list tags: HTTP ${response.status}`);\n }\n\n const data = await response.json() as { tags: Tag[] };\n return data.tags;\n }\n\n /**\n * Get single component\n */\n async get(config: Jai1Config, filepath: string): Promise<Component> {\n const encodedPath = encodeURIComponent(filepath);\n const response = await fetch(`${config.apiUrl}/api/components/${encodedPath}`, {\n headers: { 'JAI1-Access-Key': config.accessKey },\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new Error(`Component not found: ${filepath}`);\n }\n throw new NetworkError(`Failed to get component: HTTP ${response.status}`);\n }\n\n return await response.json() as Component;\n }\n\n /**\n * Get core components\n */\n async getCore(config: Jai1Config): Promise<Component[]> {\n const response = await fetch(`${config.apiUrl}/api/components/core`, {\n headers: { 'JAI1-Access-Key': config.accessKey },\n });\n\n if (!response.ok) {\n throw new NetworkError(`Failed to get core components: HTTP ${response.status}`);\n }\n\n const data = await response.json() as { components: Component[] };\n return data.components;\n }\n\n /**\n * Download and install a component\n */\n async install(config: Jai1Config, filepath: string, targetDir: string): Promise<void> {\n const component = await this.get(config, filepath);\n\n if (!component.content) {\n throw new Error(`Component ${filepath} has no content`);\n }\n\n let checksumContent = component.content; // Default for simple types\n\n if (component.contentType === 'bundle' || component.contentType === 'zip') {\n // Decompress if gzipped (bundle type), or parse directly (legacy zip)\n let bundleJson: string;\n if (component.contentType === 'bundle') {\n // Gzipped base64 content\n const compressed = Buffer.from(component.content, 'base64');\n bundleJson = gunzipSync(compressed).toString('utf-8');\n checksumContent = bundleJson;\n } else {\n // Legacy: raw JSON string\n bundleJson = component.content;\n }\n\n const bundle = JSON.parse(bundleJson) as { main: string; assets: Record<string, string> };\n\n // Extract skill folder\n const skillDir = join(targetDir, filepath);\n await fs.mkdir(skillDir, { recursive: true });\n\n // Write main SKILL.md\n await fs.writeFile(join(skillDir, 'SKILL.md'), bundle.main);\n\n // Write assets\n for (const [assetPath, content] of Object.entries(bundle.assets)) {\n if (assetPath === 'SKILL.md') continue;\n const assetFullPath = join(skillDir, assetPath);\n await fs.mkdir(join(assetFullPath, '..'), { recursive: true });\n await fs.writeFile(assetFullPath, content);\n }\n } else if (component.contentType === 'rule-preset') {\n // Rule preset: gzipped base64 bundle with preset metadata and .mdc files\n // Single preset per project: always save to .jai1/rule-preset/ (singular)\n const compressed = Buffer.from(component.content, 'base64');\n const bundleJson = gunzipSync(compressed).toString('utf-8');\n checksumContent = bundleJson;\n\n const bundle = JSON.parse(bundleJson) as RulePresetBundle;\n\n // Single preset directory: .jai1/rule-preset/ (replaces old preset)\n const presetDir = join(targetDir, 'rule-preset');\n\n // Remove old preset if exists\n try {\n await fs.rm(presetDir, { recursive: true, force: true });\n } catch {\n // Directory doesn't exist, that's fine\n }\n\n await fs.mkdir(presetDir, { recursive: true });\n\n // Write preset.json\n await fs.writeFile(\n join(presetDir, 'preset.json'),\n JSON.stringify(bundle.preset, null, 2)\n );\n\n // Write all .mdc files\n for (const [filename, content] of Object.entries(bundle.files)) {\n const filePath = join(presetDir, filename);\n await fs.mkdir(join(filePath, '..'), { recursive: true });\n await fs.writeFile(filePath, content);\n }\n } else {\n // Checksum content for markdown is just the content\n if (component.contentType === 'markdown') {\n checksumContent = component.content;\n }\n // Regular markdown file - create parent directory\n const targetPath = join(targetDir, filepath);\n const targetFolder = join(targetPath, '..');\n await fs.mkdir(targetFolder, { recursive: true });\n await fs.writeFile(targetPath, component.content);\n }\n\n // Update installed.json\n await this.markInstalled(filepath, component.version, this.calculateChecksum(checksumContent));\n }\n\n /**\n * Get installed components\n */\n async getInstalled(): Promise<Record<string, InstalledComponent>> {\n try {\n const content = await fs.readFile(this.manifestFile, 'utf-8');\n return JSON.parse(content);\n } catch {\n return {};\n }\n }\n\n /**\n * Mark component as installed\n */\n async markInstalled(filepath: string, version: string, checksum: string): Promise<void> {\n const installed = await this.getInstalled();\n installed[filepath] = {\n filepath,\n version,\n checksum,\n installedAt: new Date().toISOString(),\n modified: false,\n };\n\n await fs.mkdir(join(this.manifestFile, '..'), { recursive: true });\n await fs.writeFile(this.manifestFile, JSON.stringify(installed, null, 2));\n }\n\n /**\n * Get checksums for multiple components\n */\n async getChecksums(config: Jai1Config, filepaths: string[]): Promise<Record<string, { version: string; checksum: string }>> {\n const response = await fetch(`${config.apiUrl}/api/components/checksums`, {\n method: 'POST',\n headers: {\n 'JAI1-Access-Key': config.accessKey,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ filepaths }),\n });\n\n if (!response.ok) {\n throw new NetworkError(`Failed to get checksums: HTTP ${response.status}`);\n }\n\n const data = await response.json() as { checksums: Record<string, { version: string; checksum: string }> };\n return data.checksums;\n }\n\n /**\n * Resolve dependencies recursively\n */\n async resolveWithDependencies(config: Jai1Config, filepaths: string[]): Promise<string[]> {\n const resolved = new Set<string>();\n const queue = [...filepaths];\n const seen = new Set<string>();\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n if (seen.has(current)) continue;\n seen.add(current);\n resolved.add(current);\n\n try {\n // We need metadata to check deps\n // For efficiency, we could batch fetch metadata, but for now simple get is fine\n // Optimization: getBatch API could be used here\n const component = await this.get(config, current);\n\n if (component.dependencies) {\n for (const dep of component.dependencies) {\n if (!dep.filepath) continue; // Should have filepath\n // Handle both string and object format if API changes\n const depPath = typeof dep === 'string' ? dep : dep.filepath;\n if (!seen.has(depPath)) {\n queue.push(depPath);\n }\n }\n }\n } catch (error) {\n console.warn(`Warning: Could not resolve dependencies for ${current}: ${error}`);\n }\n }\n\n return Array.from(resolved);\n }\n\n /**\n * Backup component file before update\n */\n async backupFile(filepath: string, targetDir: string): Promise<string | null> {\n const sourcePath = join(targetDir, filepath);\n\n try {\n await fs.access(sourcePath);\n } catch {\n return null; // File doesn't exist, no backup needed\n }\n\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const backupDir = join(targetDir, '..', '.jai1_backup', timestamp);\n const backupPath = join(backupDir, filepath);\n\n const stats = await fs.stat(sourcePath);\n\n await fs.mkdir(join(backupPath, '..'), { recursive: true });\n\n if (stats.isDirectory()) {\n await fs.cp(sourcePath, backupPath, { recursive: true });\n } else {\n await fs.copyFile(sourcePath, backupPath);\n }\n\n return backupPath;\n }\n\n /**\n * List all backup directories\n */\n async listBackups(projectRoot: string): Promise<string[]> {\n const backupRoot = join(projectRoot, '.jai1_backup');\n try {\n const entries = await fs.readdir(backupRoot, { withFileTypes: true });\n return entries\n .filter(e => e.isDirectory())\n .map(e => e.name)\n .sort()\n .reverse();\n } catch {\n return [];\n }\n }\n\n /**\n * Clear all backups\n */\n async clearBackups(projectRoot: string): Promise<void> {\n const backupRoot = join(projectRoot, '.jai1_backup');\n try {\n await fs.rm(backupRoot, { recursive: true, force: true });\n } catch (error) {\n // Ignore error if dir doesn't exist\n }\n }\n\n /**\n * Calculate SHA256 checksum (matches server logic)\n */\n calculateChecksum(content: string): string {\n return createHash('sha256').update(content).digest('hex').substring(0, 16);\n }\n}\n","import React from 'react';\nimport { render } from 'ink';\nimport { Command } from 'commander';\nimport { ConfigService } from '../services/config.service.js';\nimport { ComponentsService } from '../services/components.service.js';\nimport { ValidationError } from '../errors/index.js';\nimport { UnifiedApplyApp } from '../ui/apply/UnifiedApplyApp.js';\nimport { ErrorLogService } from '../services/error-log.service.js';\n\n/**\n * Create apply command with Unified Ink UI\n */\nexport function createApplyCommand(): Command {\n const cmd = new Command('apply')\n .description('Apply components to your project (interactive UI)')\n .argument('[items...]', 'Package name or component filepaths (non-interactive mode)')\n .option('--force', 'Force overwrite even if modified locally')\n .option('--no-interactive', 'Disable interactive UI (for CI/CD)')\n .action(async (items: string[], options: { force?: boolean; interactive?: boolean }) => {\n const configService = new ConfigService();\n const config = await configService.load();\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n // Non-interactive mode or direct arguments\n if (options.interactive === false || items.length > 0) {\n await nonInteractiveApply(config, items, options);\n return;\n }\n\n // Interactive mode with Unified Ink UI\n const { waitUntilExit } = render(\n React.createElement(UnifiedApplyApp, {\n config: config,\n force: options.force,\n onExit: () => {\n process.exit(0);\n }\n })\n );\n\n await waitUntilExit();\n });\n\n return cmd;\n}\n\n/**\n * Non-interactive apply (for CLI args or CI/CD)\n */\nasync function nonInteractiveApply(\n config: any,\n items: string[],\n options: { force?: boolean }\n) {\n const componentsService = new ComponentsService();\n\n if (items.length === 0) {\n console.log('โŒ No items specified. Use interactive mode or provide package/component names.');\n console.log('๐Ÿ’ก Usage: jai1 apply <package> or jai1 apply <filepath...>');\n return;\n }\n\n // Check if first arg is a package\n const tags = await componentsService.listTags(config);\n const packageNames = tags.map(t => t.tag);\n\n let filepaths: string[];\n\n if (items.length === 1 && packageNames.includes(items[0]!)) {\n // Package mode\n console.log(`๐Ÿ“ฆ Applying package '${items[0]}'...`);\n const components = await componentsService.list(config, { tag: items[0] });\n filepaths = components.map(c => c.filepath);\n } else {\n // Direct filepaths\n filepaths = items;\n }\n\n // Resolve dependencies\n console.log('๐Ÿ” Resolving dependencies...');\n const resolvedPaths = await componentsService.resolveWithDependencies(config, filepaths);\n\n console.log(`๐Ÿ“ฆ Will apply ${resolvedPaths.length} component(s):`);\n for (const fp of resolvedPaths) {\n const isDep = !filepaths.includes(fp);\n const suffix = isDep ? ' (dependency)' : '';\n console.log(` - ${fp}${suffix}`);\n }\n\n // Install\n const targetDir = process.cwd() + '/.jai1';\n const installed = await componentsService.getInstalled();\n let added = 0;\n let updated = 0;\n let skipped = 0;\n const failures: Array<{ filepath: string; error: string }> = [];\n\n for (const fp of resolvedPaths) {\n try {\n const info = installed[fp];\n\n if (info && !options.force && info.modified) {\n console.log(`โš ๏ธ ${fp}: modified locally. Use --force to overwrite.`);\n skipped++;\n continue;\n }\n\n console.log(`๐Ÿ“ฅ Downloading ${fp}...`);\n await componentsService.install(config, fp, targetDir);\n\n if (info) updated++;\n else added++;\n\n console.log(`โœ… ${fp}`);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Error';\n console.log(`โŒ ${fp}: ${message}`);\n failures.push({ filepath: fp, error: message });\n }\n }\n\n if (failures.length > 0) {\n void new ErrorLogService().logError(new Error('apply failed'), {\n command: 'apply',\n cwdBase: process.cwd().split('/').filter(Boolean).pop(),\n details: { failures },\n });\n }\n\n console.log(`\\nโœ… Complete: ${added} added, ${updated} updated, ${skipped} skipped`);\n console.log(`๐Ÿ“ Location: ${targetDir}`);\n console.log(`\\n๐Ÿ’ก Next step: Run \"jai1 ide sync\" to sync content to your IDE(s)`);\n}\n","import React, { useState, useEffect, useMemo } from 'react';\nimport { Box, Text, useInput, useApp } from 'ink';\nimport Spinner from 'ink-spinner';\nimport TextInput from 'ink-text-input';\nimport type { Jai1Config } from '../../types/framework.types.js';\nimport { ComponentsService, type Component, type Tag } from '../../services/components.service.js';\nimport { MigrateIdeService } from '../../services/migrate-ide.service.js';\nimport { IDE_MIGRATION_CONFIGS, getMigrationIDEs } from '../../constants/ide-migration-configs.js';\nimport type { MigrateIDE, MigrateContentType } from '../../types/migrate-ide.types.js';\nimport { ProgressBar } from '../shared/ProgressBar.js';\nimport { StatusIcon } from '../shared/StatusIcon.js';\nimport { ErrorLogService } from '../../services/error-log.service.js';\n\ntype ViewState = 'browse' | 'installing' | 'summary' | 'ide-sync' | 'syncing' | 'done';\n\ninterface UnifiedApplyAppProps {\n config: Jai1Config;\n force?: boolean;\n onExit: () => void;\n}\n\ninterface InstallProgress {\n filepath: string;\n status: 'pending' | 'downloading' | 'success' | 'error';\n error?: string;\n}\n\ninterface SyncProgress {\n targetPath: string;\n status: 'pending' | 'syncing' | 'success' | 'error';\n error?: string;\n}\n\n/**\n * Unified Apply App - All-in-one interface\n */\nexport const UnifiedApplyApp: React.FC<UnifiedApplyAppProps> = ({\n config,\n force = false,\n onExit\n}) => {\n const { exit } = useApp();\n\n // View state\n const [viewState, setViewState] = useState<ViewState>('browse');\n\n // Data state\n const [components, setComponents] = useState<Component[]>([]);\n const [tags, setTags] = useState<Tag[]>([]);\n const [installedPaths, setInstalledPaths] = useState<Set<string>>(new Set());\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n // UI state - Hybrid layout: package bar + search on same row, components below\n const [searchQuery, setSearchQuery] = useState('');\n const [selectedPaths, setSelectedPaths] = useState<Set<string>>(new Set());\n const [cursorIndex, setCursorIndex] = useState(0);\n const [focusArea, setFocusArea] = useState<'packages' | 'search' | 'components'>('packages');\n const [selectedPackageIndex, setSelectedPackageIndex] = useState(0); // 0 = \"All\", 1+ = specific package\n\n // Install state\n const [installProgress, setInstallProgress] = useState<InstallProgress[]>([]);\n const [installStats, setInstallStats] = useState({ total: 0, completed: 0, added: 0, updated: 0, failed: 0 });\n\n // IDE sync state\n const [availableIdes, setAvailableIdes] = useState<MigrateIDE[]>([]);\n const [selectedIdes, setSelectedIdes] = useState<Set<MigrateIDE>>(new Set());\n const [ideCursorIndex, setIdeCursorIndex] = useState(0);\n const [syncProgress, setSyncProgress] = useState<SyncProgress[]>([]);\n const [syncStats, setSyncStats] = useState({ total: 0, completed: 0, created: 0, updated: 0, skipped: 0, errors: 0 });\n\n const service = new ComponentsService();\n\n // Load data on mount\n useEffect(() => {\n const loadData = async () => {\n try {\n const [comps, tagList, installed] = await Promise.all([\n service.list(config),\n service.listTags(config),\n service.getInstalled()\n ]);\n setComponents(comps);\n setTags(tagList);\n setInstalledPaths(new Set(Object.keys(installed)));\n // Start with \"All\" packages (index 0)\n setSelectedPackageIndex(0);\n setLoading(false);\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to load';\n setError(message);\n setLoading(false);\n\n void new ErrorLogService().logError(err, {\n command: 'apply',\n cwdBase: process.cwd().split('/').filter(Boolean).pop(),\n details: { phase: 'loadData' },\n });\n }\n };\n loadData();\n\n // Initialize available IDEs\n setAvailableIdes(getMigrationIDEs());\n }, []);\n\n // Create \"All\" + package tags for the bar\n const packageOptions = useMemo(() => {\n const allCount = components.length;\n return [\n { tag: 'All', count: allCount },\n ...tags\n ];\n }, [tags, components]);\n\n // Filter components: combine package filter AND search query\n const filteredComponents = useMemo(() => {\n let filtered = components;\n\n // Step 1: Filter by package (if not \"All\")\n const selectedPackage = packageOptions[selectedPackageIndex];\n if (selectedPackage && selectedPackage.tag !== 'All') {\n filtered = filtered.filter(c => c.tags?.includes(selectedPackage.tag));\n }\n\n // Step 2: Filter by search query (always applied)\n if (searchQuery.trim()) {\n const query = searchQuery.toLowerCase();\n filtered = filtered.filter(c =>\n c.filepath.toLowerCase().includes(query) ||\n c.tags?.some(t => t.toLowerCase().includes(query))\n );\n }\n\n return filtered;\n }, [components, packageOptions, selectedPackageIndex, searchQuery]);\n\n // Handle keyboard input\n useInput((input, key) => {\n // Done view - exit on Enter or q\n if (viewState === 'done') {\n if (key.return || (input === 'q' && key.ctrl) || key.escape) {\n onExit();\n }\n return;\n }\n\n // Summary view - proceed to IDE sync or skip\n if (viewState === 'summary') {\n if (key.return) {\n // Proceed to IDE sync\n setViewState('ide-sync');\n } else if (input === 's' || (input === 'q' && key.ctrl) || key.escape) {\n // Skip IDE sync\n onExit();\n }\n return;\n }\n\n // IDE sync view - select IDEs\n if (viewState === 'ide-sync') {\n if (key.upArrow) {\n setIdeCursorIndex(prev => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setIdeCursorIndex(prev => Math.min(availableIdes.length - 1, prev + 1));\n } else if (input === ' ') {\n // Toggle IDE selection\n const ide = availableIdes[ideCursorIndex];\n if (ide) {\n setSelectedIdes(prev => {\n const next = new Set(prev);\n if (next.has(ide)) {\n next.delete(ide);\n } else {\n next.add(ide);\n }\n return next;\n });\n }\n } else if (input === 'a') {\n // Select all IDEs\n setSelectedIdes(new Set(availableIdes));\n } else if (input === 'c') {\n // Clear selection\n setSelectedIdes(new Set());\n } else if (key.return) {\n if (selectedIdes.size > 0) {\n handleIdeSync();\n }\n } else if (input === 's' || (input === 'q' && key.ctrl) || key.escape) {\n // Skip IDE sync\n onExit();\n }\n return;\n }\n\n // Syncing view - no input\n if (viewState === 'syncing') {\n return;\n }\n\n // Installing view - no input\n if (viewState === 'installing') {\n return;\n }\n\n // Browse view - Hybrid layout navigation\n // Tab cycles: packages โ†’ search โ†’ packages (horizontal bar)\n // Down arrow from packages/search โ†’ components\n // Up arrow from components (at top) โ†’ back to previous focus\n if (key.tab) {\n if (focusArea === 'packages') {\n setFocusArea('search');\n } else if (focusArea === 'search') {\n setFocusArea('packages');\n } else {\n // From components, go back to packages\n setFocusArea('packages');\n }\n return;\n }\n\n // Down arrow: from packages/search โ†’ components\n if (key.downArrow && (focusArea === 'packages' || focusArea === 'search')) {\n if (filteredComponents.length > 0) {\n setFocusArea('components');\n setCursorIndex(0);\n }\n return;\n }\n\n // Ctrl+Q to exit\n if (key.escape || (input === 'q' && key.ctrl)) {\n onExit();\n return;\n }\n\n // Enter to apply\n if (key.return && focusArea !== 'search') {\n if (selectedPaths.size > 0) {\n handleApply();\n }\n return;\n }\n\n // Global shortcuts (work in both packages and components, but not in search)\n if (focusArea !== 'search') {\n if (input === 'a') {\n // Select all filtered\n setSelectedPaths(prev => {\n const next = new Set(prev);\n filteredComponents.forEach(c => next.add(c.filepath));\n return next;\n });\n return;\n } else if (input === 'c') {\n // Clear selection\n setSelectedPaths(new Set());\n return;\n }\n }\n\n // Navigation in components\n if (focusArea === 'components') {\n if (key.upArrow) {\n if (cursorIndex === 0) {\n // At top, go back to packages bar\n setFocusArea('packages');\n return;\n }\n setCursorIndex(prev => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setCursorIndex(prev => Math.min(filteredComponents.length - 1, prev + 1));\n } else if (input === ' ') {\n // Toggle selection\n const current = filteredComponents[cursorIndex];\n if (current) {\n setSelectedPaths(prev => {\n const next = new Set(prev);\n if (next.has(current.filepath)) {\n next.delete(current.filepath);\n } else {\n next.add(current.filepath);\n }\n return next;\n });\n }\n }\n }\n\n // Navigation in packages - left/right to cycle, space/enter to select all in package\n if (focusArea === 'packages') {\n if (key.leftArrow) {\n setSelectedPackageIndex(prev => Math.max(0, prev - 1));\n setCursorIndex(0); // Reset cursor when changing package\n } else if (key.rightArrow) {\n setSelectedPackageIndex(prev => Math.min(packageOptions.length - 1, prev + 1));\n setCursorIndex(0); // Reset cursor when changing package\n } else if (input === ' ' || key.return) {\n // Select all components in current package view\n setSelectedPaths(prev => {\n const next = new Set(prev);\n filteredComponents.forEach(c => next.add(c.filepath));\n return next;\n });\n }\n }\n });\n\n // Handle apply\n const handleApply = async () => {\n setViewState('installing');\n const targetDir = process.cwd() + '/.jai1';\n const pathsToInstall = Array.from(selectedPaths);\n\n // Resolve dependencies\n const resolvedPaths = await service.resolveWithDependencies(config, pathsToInstall);\n const installed = await service.getInstalled();\n\n // Initialize progress\n const initialProgress: InstallProgress[] = resolvedPaths.map(fp => ({\n filepath: fp,\n status: 'pending' as const\n }));\n setInstallProgress(initialProgress);\n setInstallStats({ total: resolvedPaths.length, completed: 0, added: 0, updated: 0, failed: 0 });\n\n let added = 0, updated = 0, failed = 0;\n const failures: Array<{ filepath: string; error: string }> = [];\n\n for (let i = 0; i < resolvedPaths.length; i++) {\n const fp = resolvedPaths[i]!;\n setInstallProgress(prev => prev.map(p =>\n p.filepath === fp ? { ...p, status: 'downloading' as const } : p\n ));\n\n try {\n const info = installed[fp];\n if (info && !force && info.modified) {\n const message = 'Modified locally';\n setInstallProgress(prev => prev.map(p =>\n p.filepath === fp ? { ...p, status: 'error' as const, error: message } : p\n ));\n failures.push({ filepath: fp, error: message });\n failed++;\n } else {\n await service.install(config, fp, targetDir);\n setInstallProgress(prev => prev.map(p =>\n p.filepath === fp ? { ...p, status: 'success' as const } : p\n ));\n if (info) updated++;\n else added++;\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Error';\n setInstallProgress(prev => prev.map(p =>\n p.filepath === fp ? { ...p, status: 'error' as const, error: message } : p\n ));\n failures.push({ filepath: fp, error: message });\n failed++;\n }\n\n setInstallStats({ total: resolvedPaths.length, completed: i + 1, added, updated, failed });\n }\n\n if (failed > 0) {\n void new ErrorLogService().logError(new Error('apply failed'), {\n command: 'apply',\n cwdBase: process.cwd().split('/').filter(Boolean).pop() || undefined,\n details: { phase: 'install', failures },\n });\n }\n\n setViewState('summary');\n };\n\n // Handle IDE sync\n const handleIdeSync = async () => {\n setViewState('syncing');\n\n const migrateService = new MigrateIdeService();\n const content = await migrateService.scanJai1Content();\n\n if (content.totalCount === 0) {\n // No content to sync, go to done\n setSyncStats({ total: 0, completed: 0, created: 0, updated: 0, skipped: 0, errors: 0 });\n setViewState('done');\n return;\n }\n\n const selectedIdeList = Array.from(selectedIdes);\n const contentTypes: MigrateContentType[] = ['rules', 'workflows'];\n\n // Calculate total files\n const totalItems = contentTypes.reduce((sum, type) => {\n return sum + (type === 'rules' ? content.rules.length :\n type === 'workflows' ? content.workflows.length :\n content.commands.length);\n }, 0);\n const totalFiles = totalItems * selectedIdeList.length;\n\n // Initialize progress\n setSyncStats({ total: totalFiles, completed: 0, created: 0, updated: 0, skipped: 0, errors: 0 });\n\n let created = 0, updated = 0, skipped = 0, errors = 0;\n let completed = 0;\n\n const results = await migrateService.migrate(\n selectedIdeList,\n contentTypes,\n content,\n (result) => {\n completed++;\n if (result.status === 'created') created++;\n else if (result.status === 'updated') updated++;\n else if (result.status === 'skipped') skipped++;\n else if (result.status === 'error') errors++;\n\n setSyncProgress(prev => [...prev.slice(-7), {\n targetPath: result.targetPath || result.source.relativePath,\n status: result.status === 'error' ? 'error' : 'success',\n error: result.error\n }]);\n setSyncStats({ total: totalFiles, completed, created, updated, skipped, errors });\n }\n );\n\n setViewState('done');\n };\n\n // Render loading\n if (loading) {\n return (\n <Box padding={1}>\n <Text color=\"cyan\"><Spinner type=\"dots\" /> ฤang tแบฃi components...</Text>\n </Box>\n );\n }\n\n // Render error\n if (error) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Text color=\"red\">โŒ Error: {error}</Text>\n <Text dimColor>Press q to exit</Text>\n </Box>\n );\n }\n\n // Render installing\n if (viewState === 'installing') {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">๐Ÿ“ฆ Installing Components</Text>\n </Box>\n\n <Box marginBottom={1}>\n <ProgressBar current={installStats.completed} total={installStats.total} width={50} />\n </Box>\n\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" padding={1} height={10}>\n {installProgress.slice(-8).map((item) => (\n <Box key={item.filepath}>\n <StatusIcon status={\n item.status === 'success' ? 'success' :\n item.status === 'error' ? 'error' :\n item.status === 'downloading' ? 'loading' : 'pending'\n } />\n <Text> {item.filepath}</Text>\n {item.error && <Text color=\"red\" dimColor> ({item.error})</Text>}\n </Box>\n ))}\n </Box>\n\n <Box marginTop={1}>\n <Text>\n ๐Ÿ“Š <Text color=\"green\">{installStats.added} added</Text>\n {' ยท '}<Text color=\"cyan\">{installStats.updated} updated</Text>\n {' ยท '}<Text color=\"red\">{installStats.failed} failed</Text>\n </Text>\n </Box>\n </Box>\n );\n }\n\n // Render summary (after install, before IDE sync)\n if (viewState === 'summary') {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Box marginBottom={1}>\n <Text bold color=\"green\">โœ… Installation Complete!</Text>\n </Box>\n\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" padding={1}>\n <Text>{installStats.total} components processed:</Text>\n <Text> โ””โ”€ <Text color=\"green\">{installStats.added}</Text> newly added</Text>\n <Text> โ””โ”€ <Text color=\"cyan\">{installStats.updated}</Text> updated</Text>\n {installStats.failed > 0 && <Text> โ””โ”€ <Text color=\"red\">{installStats.failed}</Text> failed</Text>}\n </Box>\n\n <Box marginTop={1}>\n <Text>๐Ÿ“ Location: <Text color=\"cyan\">{process.cwd()}/.jai1</Text></Text>\n </Box>\n\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold color=\"yellow\">๐Ÿ“ฆ Next Step: Sync to IDE(s)?</Text>\n <Text dimColor>Sync .jai1/ content to your IDE directories (rules, workflows)</Text>\n </Box>\n\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text dimColor>\n [Enter] Select IDE(s) to sync ยท [S/Ctrl+Q] Skip and exit\n </Text>\n </Box>\n </Box>\n );\n }\n\n // Render IDE sync selection\n if (viewState === 'ide-sync') {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">๐Ÿ”„ Select IDE(s) to Sync</Text>\n </Box>\n\n <Box marginBottom={1}>\n <Text dimColor>Sync .jai1/ content (rules, workflows) to IDE-specific directories</Text>\n </Box>\n\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"cyan\" padding={1}>\n {availableIdes.map((ide, i) => {\n const ideConfig = IDE_MIGRATION_CONFIGS[ide];\n const isCursor = i === ideCursorIndex;\n const isChecked = selectedIdes.has(ide);\n\n return (\n <Box key={ide}>\n <Text color={isCursor ? 'cyan' : 'white'}>\n {isCursor ? 'โฏ ' : ' '}\n {isChecked ? '[โœ“]' : '[ ]'} {ideConfig.icon} {ideConfig.name}\n </Text>\n </Box>\n );\n })}\n </Box>\n\n {selectedIdes.size > 0 && (\n <Box marginTop={1}>\n <Text>Selected: <Text color=\"green\">{selectedIdes.size}</Text> IDE(s)</Text>\n </Box>\n )}\n\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text dimColor>\n [โ†‘โ†“] Navigate ยท [โฃ] Toggle ยท [A] Select all ยท [C] Clear ยท [Enter] Sync ยท [S/Ctrl+Q] Skip\n </Text>\n </Box>\n </Box>\n );\n }\n\n // Render syncing\n if (viewState === 'syncing') {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">๐Ÿ”„ Syncing to IDE(s)</Text>\n </Box>\n\n <Box marginBottom={1}>\n <ProgressBar current={syncStats.completed} total={syncStats.total} width={50} />\n </Box>\n\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" padding={1} height={10}>\n {syncProgress.slice(-8).map((item, idx) => (\n <Box key={`${item.targetPath}-${idx}`}>\n <StatusIcon status={\n item.status === 'success' ? 'success' :\n item.status === 'error' ? 'error' :\n item.status === 'syncing' ? 'loading' : 'pending'\n } />\n <Text> {item.targetPath}</Text>\n {item.error && <Text color=\"red\" dimColor> ({item.error})</Text>}\n </Box>\n ))}\n </Box>\n\n <Box marginTop={1}>\n <Text>\n ๐Ÿ“Š <Text color=\"green\">{syncStats.created} created</Text>\n {' ยท '}<Text color=\"cyan\">{syncStats.updated} updated</Text>\n {syncStats.skipped > 0 && <>{' ยท '}<Text color=\"yellow\">{syncStats.skipped} skipped</Text></>}\n {syncStats.errors > 0 && <>{' ยท '}<Text color=\"red\">{syncStats.errors} errors</Text></>}\n </Text>\n </Box>\n </Box>\n );\n }\n\n // Render done (after IDE sync)\n if (viewState === 'done') {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Box marginBottom={1}>\n <Text bold color=\"green\">๐ŸŽ‰ All Done!</Text>\n </Box>\n\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" padding={1}>\n <Text bold>๐Ÿ“ฆ Components Applied:</Text>\n <Text> โ””โ”€ <Text color=\"green\">{installStats.added}</Text> added, <Text color=\"cyan\">{installStats.updated}</Text> updated</Text>\n\n {syncStats.total > 0 && (\n <>\n <Text> </Text>\n <Text bold>๐Ÿ”„ IDE Sync:</Text>\n <Text> โ””โ”€ <Text color=\"green\">{syncStats.created}</Text> created, <Text color=\"cyan\">{syncStats.updated}</Text> updated</Text>\n <Text> โ””โ”€ Synced to: {Array.from(selectedIdes).map(ide => IDE_MIGRATION_CONFIGS[ide].name).join(', ')}</Text>\n </>\n )}\n </Box>\n\n <Box marginTop={1}>\n <Text>๐Ÿ“ Framework: <Text color=\"cyan\">{process.cwd()}/.jai1</Text></Text>\n </Box>\n\n <Box marginTop={1}>\n <Text dimColor>Press Enter or Q to exit</Text>\n </Box>\n </Box>\n );\n }\n\n // Render browse (main view) - Hybrid layout\n const visibleComponents = filteredComponents.slice(0, 12);\n const hasMore = filteredComponents.length > 12;\n const selectedPackage = packageOptions[selectedPackageIndex];\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n {/* Header */}\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">๐Ÿ“ฆ Jai1 Apply</Text>\n {selectedPaths.size > 0 && (\n <Text color=\"green\"> [{selectedPaths.size} selected]</Text>\n )}\n </Box>\n\n {/* Package Bar + Search - Same Row */}\n <Box marginBottom={1} flexDirection=\"column\">\n {/* Package tabs */}\n <Box flexWrap=\"wrap\">\n <Text dimColor>๐Ÿ“ </Text>\n {packageOptions.map((pkg, i) => {\n const isActive = i === selectedPackageIndex;\n const isFocused = focusArea === 'packages' && isActive;\n return (\n <Box key={pkg.tag} marginRight={1} flexShrink={0}>\n <Text\n backgroundColor={isFocused ? 'cyan' : isActive ? 'gray' : undefined}\n color={isFocused ? 'black' : isActive ? 'white' : 'gray'}\n >\n [{pkg.tag}:{pkg.count}]\n </Text>\n </Box>\n );\n })}\n </Box>\n\n {/* Search input */}\n <Box marginTop={1}>\n <Text color={focusArea === 'search' ? 'cyan' : 'gray'}>๐Ÿ” </Text>\n {focusArea === 'search' ? (\n <TextInput\n value={searchQuery}\n onChange={setSearchQuery}\n placeholder=\"Type to filter...\"\n />\n ) : (\n <Text>{searchQuery || <Text dimColor>Tab to search</Text>}</Text>\n )}\n </Box>\n </Box>\n\n {/* Components List */}\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={focusArea === 'components' ? 'cyan' : 'gray'} padding={1}>\n <Box marginBottom={1}>\n <Text bold>Components </Text>\n {selectedPackage && selectedPackage.tag !== 'All' && (\n <Text color=\"cyan\">[{selectedPackage.tag}] </Text>\n )}\n {searchQuery && (\n <Text color=\"yellow\">\"{searchQuery}\" </Text>\n )}\n <Text dimColor>({filteredComponents.length} shown{hasMore ? `, โ†“ for more` : ''})</Text>\n </Box>\n\n {visibleComponents.map((comp, i) => {\n const isCursor = i === cursorIndex && focusArea === 'components';\n const isChecked = selectedPaths.has(comp.filepath);\n const isInstalled = installedPaths.has(comp.filepath);\n\n return (\n <Box key={comp.filepath}>\n <Text color={isCursor ? 'cyan' : 'white'}>\n {isCursor ? 'โฏ ' : ' '}\n {isChecked ? '[โœ“]' : '[ ]'} {comp.filepath}\n </Text>\n <Text dimColor> {isInstalled ? 'โœ“' : 'โ—‹'}</Text>\n </Box>\n );\n })}\n\n {filteredComponents.length === 0 && (\n <Text dimColor>No components match your filter</Text>\n )}\n </Box>\n\n {/* Selected Preview */}\n {selectedPaths.size > 0 && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold>Selected: {selectedPaths.size} components</Text>\n <Box flexDirection=\"column\" marginLeft={2}>\n {Array.from(selectedPaths).slice(0, 3).map(fp => (\n <Text key={fp} dimColor>๐Ÿ“Œ {fp}</Text>\n ))}\n {selectedPaths.size > 3 && (\n <Text dimColor> ... +{selectedPaths.size - 3} more</Text>\n )}\n </Box>\n </Box>\n )}\n\n {/* Help - Context sensitive */}\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text dimColor>\n {focusArea === 'packages' && '[โ†โ†’] Package ยท [โ†“] List ยท [โฃ] Select all'}\n {focusArea === 'search' && 'Type to filter ยท [โ†“] List'}\n {focusArea === 'components' && '[โ†‘โ†“] Navigate ยท [โฃ] Toggle'}\n {' ยท [Tab] Switch ยท [A] All ยท [C] Clear ยท [Enter] Apply'}\n </Text>\n </Box>\n </Box>\n );\n};\n","/**\n * Migration service for IDE content migration\n *\n * Jai1 Source Format (Windsurf/Antigravity compatible):\n * - trigger: always_on | always | manual | glob_pattern\n *\n * The service reads frontmatter from source files and extracts the `trigger`\n * field to pass to IDE-specific transformers.\n */\nimport { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport matter from 'gray-matter';\nimport type {\n MigrateIDE,\n MigrateContentType,\n SourceContentItem,\n MigrationResult,\n ScanSummary,\n IDEMigrationConfig,\n Jai1Trigger,\n} from '../types/migrate-ide.types.js';\nimport { IDE_MIGRATION_CONFIGS } from '../constants/ide-migration-configs.js';\n\nexport class MigrateIdeService {\n private projectPath: string;\n private jai1Path: string;\n\n constructor(projectPath: string = process.cwd()) {\n this.projectPath = projectPath;\n this.jai1Path = path.join(projectPath, '.jai1');\n }\n\n /**\n * Scan .jai1/ directory for content\n */\n async scanJai1Content(): Promise<ScanSummary> {\n // Scan manual rules from .jai1/rules/\n const manualRules = await this.scanContentType('rules');\n\n // Scan rule preset from .jai1/rule-preset/ (source of truth for presets)\n const presetRules = await this.scanRulePreset();\n\n // Combine: preset rules take precedence, then manual rules\n const rules = [...presetRules, ...manualRules];\n\n const workflows = await this.scanContentType('workflows');\n const commands: SourceContentItem[] = [];\n\n return {\n rules,\n workflows,\n commands,\n totalCount: rules.length + workflows.length + commands.length,\n };\n }\n\n /**\n * Scan .jai1/rule-preset/ directory for rule preset files\n */\n private async scanRulePreset(): Promise<SourceContentItem[]> {\n const items: SourceContentItem[] = [];\n const presetDir = path.join(this.jai1Path, 'rule-preset');\n\n try {\n await fs.access(presetDir);\n } catch {\n return items;\n }\n\n const files = await fs.readdir(presetDir);\n\n for (const file of files) {\n // Rule preset files can be .md or .mdc format\n if (!file.endsWith('.md') && !file.endsWith('.mdc')) continue;\n // Skip preset.json\n if (file === 'preset.json') continue;\n\n const filepath = path.join(presetDir, file);\n const stat = await fs.stat(filepath);\n if (!stat.isFile()) continue;\n\n const content = await fs.readFile(filepath, 'utf-8');\n\n // Parse frontmatter if exists (mdc files may have frontmatter)\n let frontmatter: Record<string, unknown> = {};\n try {\n const { data } = matter(content);\n frontmatter = data;\n } catch {\n // No frontmatter, that's fine\n }\n\n const name = file.endsWith('.mdc')\n ? path.basename(file, '.mdc')\n : path.basename(file, '.md');\n\n // Extract trigger from frontmatter (Jai1 source format)\n const trigger = this.extractTrigger(frontmatter);\n\n // Determine alwaysApply based on trigger\n const alwaysApply = this.isAlwaysTrigger(trigger);\n\n items.push({\n type: 'rules',\n name,\n filepath,\n relativePath: path.relative(this.projectPath, filepath),\n description: frontmatter.description as string | undefined,\n globs: this.extractGlobs(frontmatter),\n trigger,\n alwaysApply,\n });\n }\n\n return items;\n }\n\n /**\n * Scan a specific content type\n */\n private async scanContentType(type: MigrateContentType): Promise<SourceContentItem[]> {\n const items: SourceContentItem[] = [];\n const dirPath = path.join(this.jai1Path, type);\n\n try {\n await fs.access(dirPath);\n } catch {\n return items;\n }\n\n const files = await fs.readdir(dirPath);\n\n for (const file of files) {\n if (!file.endsWith('.md')) continue;\n\n const filepath = path.join(dirPath, file);\n const stat = await fs.stat(filepath);\n if (!stat.isFile()) continue;\n\n const content = await fs.readFile(filepath, 'utf-8');\n\n let frontmatter: Record<string, unknown> = {};\n try {\n const { data } = matter(content);\n frontmatter = data;\n } catch (e) {\n // Skip files with invalid YAML frontmatter\n console.warn(`โš ๏ธ Skipping ${file}: Invalid YAML frontmatter`);\n continue;\n }\n\n const name = path.basename(file, '.md');\n\n // Extract trigger from frontmatter (Jai1 source format)\n const trigger = this.extractTrigger(frontmatter);\n\n // Determine alwaysApply based on trigger\n const alwaysApply = this.isAlwaysTrigger(trigger);\n\n items.push({\n type,\n name,\n filepath,\n relativePath: path.relative(this.projectPath, filepath),\n description: frontmatter.description as string | undefined,\n globs: this.extractGlobs(frontmatter),\n trigger,\n alwaysApply,\n });\n }\n\n return items;\n }\n\n /**\n * Generate stub file content with @ reference\n */\n generateStubContent(\n ide: MigrateIDE,\n sourceItem: SourceContentItem\n ): string {\n const config = IDE_MIGRATION_CONFIGS[ide];\n if (!config) throw new Error(`Unknown IDE: ${ide}`);\n\n // Generate IDE-specific frontmatter\n const frontmatter = config.generateFrontmatter({\n description: sourceItem.description,\n globs: sourceItem.globs,\n trigger: sourceItem.trigger,\n alwaysApply: sourceItem.alwaysApply,\n sourceFile: sourceItem.relativePath,\n });\n\n // Generate @ reference\n const reference = `@${sourceItem.relativePath}`;\n\n // Combine frontmatter and reference\n if (frontmatter) {\n return `${frontmatter}\\n\\n${reference}\\n`;\n }\n return `${reference}\\n`;\n }\n\n /**\n * Migrate content to specific IDEs\n */\n async migrate(\n ides: MigrateIDE[],\n contentTypes: MigrateContentType[],\n content: ScanSummary,\n onProgress?: (result: MigrationResult) => void\n ): Promise<MigrationResult[]> {\n const results: MigrationResult[] = [];\n\n for (const ide of ides) {\n const config = IDE_MIGRATION_CONFIGS[ide];\n if (!config) continue;\n\n // Special handling for OpenCode rules: merge all rules into AGENTS.md\n if (ide === 'opencode' && contentTypes.includes('rules') && content.rules.length > 0) {\n const agentsResult = await this.migrateOpenCodeRules(content.rules);\n results.push(agentsResult);\n onProgress?.(agentsResult);\n }\n\n // Migrate each content type\n for (const type of contentTypes) {\n // Skip rules for OpenCode (already handled above)\n if (ide === 'opencode' && type === 'rules') {\n continue;\n }\n\n const items = type === 'rules' ? content.rules :\n type === 'workflows' ? content.workflows :\n content.commands;\n\n for (const item of items) {\n const result = await this.migrateItem(ide, config, item);\n results.push(result);\n onProgress?.(result);\n }\n }\n }\n\n return results;\n }\n\n /**\n * Migrate rules for OpenCode by creating/updating AGENTS.md\n */\n private async migrateOpenCodeRules(rules: SourceContentItem[]): Promise<MigrationResult> {\n const agentsPath = path.join(this.projectPath, 'AGENTS.md');\n\n try {\n // Check if AGENTS.md exists\n let status: 'created' | 'updated' = 'created';\n try {\n await fs.access(agentsPath);\n status = 'updated';\n } catch {\n // File doesn't exist, will be created\n }\n\n // Generate AGENTS.md content with references to all rules\n const lines = [\n '# AGENTS.md',\n '',\n '> Auto-generated by jai1 ide sync for OpenCode',\n '',\n ];\n\n for (const rule of rules) {\n lines.push(`@${rule.relativePath}`);\n }\n\n lines.push('');\n\n await fs.writeFile(agentsPath, lines.join('\\n'), 'utf-8');\n\n return {\n source: {\n type: 'rules',\n name: 'AGENTS',\n filepath: agentsPath,\n relativePath: 'AGENTS.md',\n description: `Merged ${rules.length} rules for OpenCode`,\n alwaysApply: true,\n },\n targetIDE: 'opencode',\n targetPath: agentsPath,\n status,\n };\n } catch (error) {\n return {\n source: {\n type: 'rules',\n name: 'AGENTS',\n filepath: agentsPath,\n relativePath: 'AGENTS.md',\n alwaysApply: true,\n },\n targetIDE: 'opencode',\n targetPath: agentsPath,\n status: 'error',\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n /**\n * Migrate a single item\n */\n private async migrateItem(\n ide: MigrateIDE,\n config: IDEMigrationConfig,\n item: SourceContentItem\n ): Promise<MigrationResult> {\n try {\n // Determine target path\n const targetPath = this.getTargetPath(config, item);\n\n if (!targetPath) {\n return {\n source: item,\n targetIDE: ide,\n targetPath: '',\n status: 'skipped',\n error: `IDE ${config.id} does not support ${item.type}`,\n };\n }\n\n // Ensure directory exists\n const targetDir = path.dirname(targetPath);\n await fs.mkdir(targetDir, { recursive: true });\n\n // Check if file exists\n let status: 'created' | 'updated' = 'created';\n try {\n await fs.access(targetPath);\n status = 'updated';\n } catch {\n // File doesn't exist, will be created\n }\n\n // Generate stub content\n const stubContent = this.generateStubContent(ide, item);\n\n // Write file\n await fs.writeFile(targetPath, stubContent, 'utf-8');\n\n return {\n source: item,\n targetIDE: ide,\n targetPath,\n status,\n };\n } catch (error) {\n return {\n source: item,\n targetIDE: ide,\n targetPath: '',\n status: 'error',\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n /**\n * Get target file path for an item\n */\n private getTargetPath(config: IDEMigrationConfig, item: SourceContentItem): string | null {\n let contentPath: string | null = null;\n let extension = config.fileExtension;\n\n switch (item.type) {\n case 'rules':\n contentPath = config.rulesPath;\n // Rules always use fileExtension\n break;\n case 'workflows':\n // For IDEs without workflows (like Claude Code), map workflows to commands\n contentPath = config.workflowsPath ?? config.commandsPath;\n // Use workflowsExtension if available, otherwise fallback to fileExtension\n extension = config.workflowsExtension ?? config.fileExtension;\n break;\n case 'commands':\n contentPath = config.commandsPath;\n // Commands use workflowsExtension if available, otherwise fileExtension\n extension = config.workflowsExtension ?? config.fileExtension;\n break;\n }\n\n if (!contentPath) {\n return null;\n }\n\n const filename = `${item.name}${extension}`;\n return path.join(this.projectPath, config.basePath, contentPath, filename);\n }\n\n // Helper methods\n\n /**\n * Extract trigger from frontmatter\n * Jai1 source format uses 'trigger' field (Windsurf/Antigravity compatible)\n */\n private extractTrigger(frontmatter: Record<string, unknown>): Jai1Trigger | undefined {\n const trigger = frontmatter.trigger;\n if (typeof trigger === 'string') {\n return trigger as Jai1Trigger;\n }\n\n // Fallback: check alwaysApply for Cursor-style frontmatter\n if (frontmatter.alwaysApply === true) {\n return 'always_on';\n }\n\n // Fallback: check globs for file-specific rules\n const globs = this.extractGlobs(frontmatter);\n if (globs && globs.length > 0) {\n return globs[0] as Jai1Trigger;\n }\n\n return undefined;\n }\n\n /**\n * Extract globs from frontmatter\n */\n private extractGlobs(frontmatter: Record<string, unknown>): string[] | undefined {\n const globs = frontmatter.globs;\n if (typeof globs === 'string') return [globs];\n if (Array.isArray(globs)) return globs as string[];\n return undefined;\n }\n\n /**\n * Check if trigger indicates \"always apply\"\n */\n private isAlwaysTrigger(trigger?: Jai1Trigger): boolean {\n return trigger === 'always' || trigger === 'always_on';\n }\n}\n","/**\n * IDE migration configurations\n *\n * Jai1 Source Format (Windsurf/Antigravity compatible):\n * - trigger: always_on | always | manual | glob_pattern\n *\n * Transformation rules:\n * - Cursor: trigger=always_on/always โ†’ alwaysApply=true, trigger=glob โ†’ globs=pattern\n * - Windsurf: trigger=always_on โ†’ trigger=always_on, trigger=glob โ†’ trigger=pattern\n * - Antigravity: trigger=always_on โ†’ trigger=always_on (same as source)\n * - Claude Code: trigger=always_on โ†’ no paths field, trigger=glob โ†’ paths=pattern\n * - OpenCode: trigger=always_on โ†’ trigger=always_on, trigger=glob โ†’ trigger=pattern\n */\nimport type { IDEMigrationConfig, FrontmatterOptions, MigrateIDE } from '../types/migrate-ide.types.js';\n\n/**\n * Check if trigger is an \"always\" type trigger\n */\nfunction isAlwaysTrigger(trigger?: string): boolean {\n return trigger === 'always_on' || trigger === 'always';\n}\n\n/**\n * Get glob pattern from trigger (if not an always/manual trigger)\n */\nfunction getGlobFromTrigger(trigger?: string, globs?: string[]): string[] | undefined {\n // If explicit globs are provided, use them\n if (globs && globs.length > 0) return globs;\n\n // If trigger is a glob pattern (not always/always_on/manual), use it\n if (trigger && !isAlwaysTrigger(trigger) && trigger !== 'manual') {\n return [trigger];\n }\n\n return undefined;\n}\n\nexport const IDE_MIGRATION_CONFIGS: Record<MigrateIDE, IDEMigrationConfig> = {\n cursor: {\n id: 'cursor',\n name: 'Cursor',\n icon: '๐Ÿ”ฎ',\n basePath: '.cursor',\n rulesPath: 'rules',\n workflowsPath: null,\n commandsPath: 'commands',\n fileExtension: '.mdc', // For rules\n workflowsExtension: '.md', // For workflows/commands\n generateFrontmatter: (opts: FrontmatterOptions) => {\n const lines = ['---'];\n\n if (opts.description) {\n lines.push(`description: ${opts.description}`);\n }\n\n // Determine alwaysApply from trigger or explicit flag\n const alwaysApply = opts.alwaysApply || isAlwaysTrigger(opts.trigger);\n\n // Get globs from explicit globs or trigger pattern\n const globs = getGlobFromTrigger(opts.trigger, opts.globs);\n if (globs && globs.length > 0) {\n lines.push(`globs: ${globs.join(', ')}`);\n }\n\n lines.push(`alwaysApply: ${alwaysApply}`);\n lines.push('---');\n return lines.join('\\n');\n },\n },\n windsurf: {\n id: 'windsurf',\n name: 'Windsurf',\n icon: '๐Ÿ„',\n basePath: '.windsurf',\n rulesPath: 'rules',\n workflowsPath: 'workflows',\n commandsPath: null,\n fileExtension: '.md',\n generateFrontmatter: (opts: FrontmatterOptions) => {\n // Windsurf uses trigger field, same as Jai1 source format\n // But Windsurf prefers 'always_on' for always-active rules\n let trigger: string;\n\n if (opts.trigger) {\n // Use source trigger directly, normalize 'always' to 'always_on'\n trigger = opts.trigger === 'always' ? 'always_on' : opts.trigger;\n } else if (opts.alwaysApply) {\n trigger = 'always_on';\n } else if (opts.globs && opts.globs.length > 0) {\n trigger = opts.globs[0]!;\n } else {\n trigger = 'always_on';\n }\n\n return `---\\ntrigger: ${trigger}\\n---`;\n },\n },\n antigravity: {\n id: 'antigravity',\n name: 'Antigravity',\n icon: '๐Ÿš€',\n basePath: '.agent',\n rulesPath: 'rules',\n workflowsPath: 'workflows',\n commandsPath: null,\n fileExtension: '.md',\n generateFrontmatter: (opts: FrontmatterOptions) => {\n // Antigravity uses trigger field, same as Jai1 source format\n // Antigravity prefers 'always_on' for always-active rules\n let trigger: string;\n\n if (opts.trigger) {\n // Use source trigger directly, normalize 'always' to 'always_on'\n trigger = opts.trigger === 'always' ? 'always_on' : opts.trigger;\n } else if (opts.alwaysApply) {\n trigger = 'always_on';\n } else if (opts.globs && opts.globs.length > 0) {\n trigger = opts.globs[0]!;\n } else {\n trigger = 'always_on';\n }\n\n return `---\\ntrigger: ${trigger}\\n---`;\n },\n },\n claudecode: {\n id: 'claudecode',\n name: 'Claude Code',\n icon: '๐Ÿค–',\n basePath: '.claude',\n rulesPath: 'rules',\n workflowsPath: null,\n commandsPath: 'commands',\n fileExtension: '.md',\n generateFrontmatter: (opts: FrontmatterOptions) => {\n const lines = ['---'];\n\n if (opts.description) {\n lines.push(`description: ${opts.description}`);\n }\n\n // Claude Code uses 'paths' instead of 'globs'\n // If no paths, rule is always applied\n const isAlways = opts.alwaysApply || isAlwaysTrigger(opts.trigger);\n\n if (!isAlways) {\n const paths = getGlobFromTrigger(opts.trigger, opts.globs);\n if (paths && paths.length > 0) {\n lines.push(`paths: ${paths.join(', ')}`);\n }\n }\n\n lines.push('---');\n return lines.join('\\n');\n },\n },\n opencode: {\n id: 'opencode',\n name: 'OpenCode',\n icon: '๐Ÿ’ป',\n basePath: '.opencode',\n rulesPath: null, // OpenCode uses AGENTS.md for rules\n workflowsPath: null,\n commandsPath: 'command', // Note: singular \"command\" not \"commands\"\n fileExtension: '.md',\n generateFrontmatter: (opts: FrontmatterOptions) => {\n // OpenCode command frontmatter includes: description, agent, model\n const lines = ['---'];\n\n if (opts.description) {\n lines.push(`description: ${opts.description}`);\n }\n\n // Add agent field (default to 'build' if not specified)\n const agent = opts.agent ?? 'build';\n lines.push(`agent: ${agent}`);\n\n // Add model field (optional)\n if (opts.model) {\n lines.push(`model: ${opts.model}`);\n }\n\n lines.push('---');\n return lines.join('\\n');\n },\n },\n};\n\nexport function getMigrationIDEs(): MigrateIDE[] {\n return Object.keys(IDE_MIGRATION_CONFIGS) as MigrateIDE[];\n}\n\nexport function getIDEConfig(ide: MigrateIDE): IDEMigrationConfig | undefined {\n return IDE_MIGRATION_CONFIGS[ide];\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\n\ninterface ProgressBarProps {\n current: number;\n total: number;\n width?: number;\n showPercentage?: boolean;\n color?: string;\n}\n\n/**\n * ASCII progress bar component\n */\nexport const ProgressBar: React.FC<ProgressBarProps> = ({\n current,\n total,\n width = 40,\n showPercentage = true,\n color = 'cyan',\n}) => {\n const percentage = total > 0 ? Math.round((current / total) * 100) : 0;\n const filled = Math.round((percentage / 100) * width);\n const empty = width - filled;\n\n const bar = 'โ–ˆ'.repeat(filled) + 'โ–‘'.repeat(empty);\n\n return (\n <Box>\n <Text color={color}>{bar}</Text>\n {showPercentage && (\n <Text dimColor> {current}/{total} ({percentage}%)</Text>\n )}\n </Box>\n );\n};\n","import React from 'react';\nimport { Text } from 'ink';\nimport { theme } from './theme.js';\n\nexport type Status = 'success' | 'error' | 'pending' | 'loading' | 'warning';\n\ninterface StatusIconProps {\n status: Status;\n text?: string;\n}\n\n/**\n * Status icon component with optional text\n */\nexport const StatusIcon: React.FC<StatusIconProps> = ({ status, text }) => {\n const iconMap: Record<Status, string> = {\n success: theme.icons.success,\n error: theme.icons.error,\n pending: theme.icons.pending,\n loading: theme.icons.loading,\n warning: theme.icons.warning,\n };\n\n const colorMap: Record<Status, string> = {\n success: 'green',\n error: 'red',\n pending: 'gray',\n loading: 'yellow',\n warning: 'yellow',\n };\n\n const icon = iconMap[status];\n const color = colorMap[status];\n\n return (\n <Text color={color}>\n {icon} {text}\n </Text>\n );\n};\n","/**\n * Theme configuration for Ink UI components\n */\n\nexport const theme = {\n colors: {\n primary: '#6366f1', // Indigo\n success: '#22c55e', // Green\n warning: '#eab308', // Yellow\n error: '#ef4444', // Red\n muted: '#6b7280', // Gray\n border: '#374151', // Dark gray\n text: '#f3f4f6', // Light gray\n background: '#1a1a2e', // Dark background\n },\n\n icons: {\n success: 'โœ…',\n error: 'โŒ',\n pending: 'โ—‹',\n loading: 'โณ',\n package: '๐Ÿ“ฆ',\n folder: '๐Ÿ“',\n file: '๐Ÿ“„',\n tip: '๐Ÿ’ก',\n warning: 'โš ๏ธ',\n checkmark: 'โœ“',\n arrow: 'โ†’',\n bullet: 'โ€ข',\n },\n\n borders: {\n single: {\n topLeft: 'โ”Œ',\n topRight: 'โ”',\n bottomLeft: 'โ””',\n bottomRight: 'โ”˜',\n horizontal: 'โ”€',\n vertical: 'โ”‚',\n },\n double: {\n topLeft: 'โ•”',\n topRight: 'โ•—',\n bottomLeft: 'โ•š',\n bottomRight: 'โ•',\n horizontal: 'โ•',\n vertical: 'โ•‘',\n },\n },\n} as const;\n\nexport type Theme = typeof theme;\n","import React from 'react';\nimport { render } from 'ink';\nimport { Command } from 'commander';\nimport { ConfigService } from '../services/config.service.js';\nimport { ValidationError } from '../errors/index.js';\nimport { TwoPaneApplyApp } from '../ui/apply/TwoPaneApplyApp.js';\n\n/**\n * Create apply-new command with Two-Pane UI (experimental)\n */\nexport function createApplyNewCommand(): Command {\n const cmd = new Command('apply-new')\n .description('Apply components (Two-Pane UI - experimental)')\n .option('--force', 'Force overwrite even if modified locally')\n .action(async (options: { force?: boolean }) => {\n const configService = new ConfigService();\n const config = await configService.load();\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n // Two-Pane Ink UI\n const { waitUntilExit } = render(\n React.createElement(TwoPaneApplyApp, {\n config: config,\n force: options.force,\n onExit: () => {\n process.exit(0);\n }\n })\n );\n\n await waitUntilExit();\n });\n\n return cmd;\n}\n","import React, { useState, useEffect, useMemo } from 'react';\nimport { Box, Text, useInput, useApp } from 'ink';\nimport Spinner from 'ink-spinner';\nimport TextInput from 'ink-text-input';\nimport type { Jai1Config } from '../../types/framework.types.js';\nimport { ComponentsService, type Component, type Tag } from '../../services/components.service.js';\nimport { MigrateIdeService } from '../../services/migrate-ide.service.js';\nimport { IDE_MIGRATION_CONFIGS, getMigrationIDEs } from '../../constants/ide-migration-configs.js';\nimport type { MigrateIDE, MigrateContentType } from '../../types/migrate-ide.types.js';\nimport { ProgressBar } from '../shared/ProgressBar.js';\nimport { StatusIcon } from '../shared/StatusIcon.js';\n\ntype ViewState = 'browse' | 'installing' | 'summary' | 'ide-sync' | 'syncing' | 'done';\ntype Pane = 'packages' | 'components';\n\ninterface TwoPaneApplyAppProps {\n config: Jai1Config;\n force?: boolean;\n onExit: () => void;\n}\n\ninterface InstallProgress {\n filepath: string;\n status: 'pending' | 'downloading' | 'success' | 'error';\n error?: string;\n}\n\ninterface SyncProgress {\n targetPath: string;\n status: 'pending' | 'syncing' | 'success' | 'error';\n error?: string;\n}\n\n/**\n * Two-Pane Apply App - Power User Interface\n * Left pane: Package list\n * Right pane: Search + Component list\n */\nexport const TwoPaneApplyApp: React.FC<TwoPaneApplyAppProps> = ({\n config,\n force = false,\n onExit\n}) => {\n const { exit } = useApp();\n\n // View state\n const [viewState, setViewState] = useState<ViewState>('browse');\n\n // Data state\n const [components, setComponents] = useState<Component[]>([]);\n const [tags, setTags] = useState<Tag[]>([]);\n const [installedPaths, setInstalledPaths] = useState<Set<string>>(new Set());\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n // UI state - Two Pane layout\n const [activePane, setActivePane] = useState<Pane>('packages');\n const [searchQuery, setSearchQuery] = useState('');\n const [isSearchFocused, setIsSearchFocused] = useState(false);\n const [selectedPaths, setSelectedPaths] = useState<Set<string>>(new Set());\n const [packageCursorIndex, setPackageCursorIndex] = useState(0); // 0 = \"All\"\n const [componentCursorIndex, setComponentCursorIndex] = useState(0);\n\n // Install state\n const [installProgress, setInstallProgress] = useState<InstallProgress[]>([]);\n const [installStats, setInstallStats] = useState({ total: 0, completed: 0, added: 0, updated: 0, failed: 0 });\n\n // IDE sync state\n const [availableIdes, setAvailableIdes] = useState<MigrateIDE[]>([]);\n const [selectedIdes, setSelectedIdes] = useState<Set<MigrateIDE>>(new Set());\n const [ideCursorIndex, setIdeCursorIndex] = useState(0);\n const [syncProgress, setSyncProgress] = useState<SyncProgress[]>([]);\n const [syncStats, setSyncStats] = useState({ total: 0, completed: 0, created: 0, updated: 0, skipped: 0, errors: 0 });\n\n const service = new ComponentsService();\n\n // Package options with \"All\" at the start\n const packageOptions = useMemo(() => {\n return [\n { tag: 'All', count: components.length },\n ...tags\n ];\n }, [tags, components]);\n\n // Load data on mount\n useEffect(() => {\n const loadData = async () => {\n try {\n const [comps, tagList, installed] = await Promise.all([\n service.list(config),\n service.listTags(config),\n service.getInstalled()\n ]);\n setComponents(comps);\n setTags(tagList);\n setInstalledPaths(new Set(Object.keys(installed)));\n setLoading(false);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load');\n setLoading(false);\n }\n };\n loadData();\n setAvailableIdes(getMigrationIDEs());\n }, []);\n\n // Filter components: package filter + search\n const filteredComponents = useMemo(() => {\n let filtered = components;\n\n // Filter by package\n const selectedPackage = packageOptions[packageCursorIndex];\n if (selectedPackage && selectedPackage.tag !== 'All') {\n filtered = filtered.filter(c => c.tags?.includes(selectedPackage.tag));\n }\n\n // Filter by search\n if (searchQuery.trim()) {\n const query = searchQuery.toLowerCase();\n filtered = filtered.filter(c =>\n c.filepath.toLowerCase().includes(query) ||\n c.tags?.some(t => t.toLowerCase().includes(query))\n );\n }\n\n return filtered;\n }, [components, packageOptions, packageCursorIndex, searchQuery]);\n\n // Reset component cursor when filter changes\n useEffect(() => {\n setComponentCursorIndex(0);\n }, [packageCursorIndex, searchQuery]);\n\n // Handle keyboard input - disable when search is focused to let TextInput work\n useInput((input, key) => {\n // Done view\n if (viewState === 'done') {\n if (key.return || (input === 'q' && key.ctrl) || key.escape) {\n onExit();\n }\n return;\n }\n\n // Summary view\n if (viewState === 'summary') {\n if (key.return) {\n setViewState('ide-sync');\n } else if (input === 's' || (input === 'q' && key.ctrl) || key.escape) {\n onExit();\n }\n return;\n }\n\n // IDE sync view\n if (viewState === 'ide-sync') {\n if (key.upArrow) {\n setIdeCursorIndex(prev => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setIdeCursorIndex(prev => Math.min(availableIdes.length - 1, prev + 1));\n } else if (input === ' ') {\n const ide = availableIdes[ideCursorIndex];\n if (ide) {\n setSelectedIdes(prev => {\n const next = new Set(prev);\n if (next.has(ide)) next.delete(ide);\n else next.add(ide);\n return next;\n });\n }\n } else if (input === 'a') {\n setSelectedIdes(new Set(availableIdes));\n } else if (input === 'c') {\n setSelectedIdes(new Set());\n } else if (key.return && selectedIdes.size > 0) {\n handleIdeSync();\n } else if (input === 's' || (input === 'q' && key.ctrl) || key.escape) {\n onExit();\n }\n return;\n }\n\n if (viewState === 'syncing' || viewState === 'installing') {\n return;\n }\n\n // Browse view - Two pane navigation\n // Note: When isSearchFocused is true, this hook is disabled via isActive option\n // so TextInput can receive keyboard input\n\n // Escape to exit\n if (key.escape || (input === 'q' && key.ctrl)) {\n onExit();\n return;\n }\n\n // \"/\" to enter search\n if (input === '/') {\n setIsSearchFocused(true);\n setActivePane('components');\n return;\n }\n\n // Left/Right to switch panes\n if (key.leftArrow && activePane === 'components') {\n setActivePane('packages');\n return;\n }\n if (key.rightArrow && activePane === 'packages') {\n setActivePane('components');\n return;\n }\n\n // Tab to switch panes\n if (key.tab) {\n setActivePane(activePane === 'packages' ? 'components' : 'packages');\n return;\n }\n\n // Enter to apply\n if (key.return && selectedPaths.size > 0) {\n handleApply();\n return;\n }\n\n // Global shortcuts\n if (input === 'a') {\n setSelectedPaths(prev => {\n const next = new Set(prev);\n filteredComponents.forEach(c => next.add(c.filepath));\n return next;\n });\n return;\n }\n if (input === 'c') {\n setSelectedPaths(new Set());\n return;\n }\n\n // Package pane navigation\n if (activePane === 'packages') {\n if (key.upArrow) {\n setPackageCursorIndex(prev => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setPackageCursorIndex(prev => Math.min(packageOptions.length - 1, prev + 1));\n } else if (input === ' ') {\n // Select all in current package\n setSelectedPaths(prev => {\n const next = new Set(prev);\n filteredComponents.forEach(c => next.add(c.filepath));\n return next;\n });\n }\n }\n\n // Component pane navigation\n if (activePane === 'components') {\n if (key.upArrow) {\n setComponentCursorIndex(prev => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setComponentCursorIndex(prev => Math.min(filteredComponents.length - 1, prev + 1));\n } else if (input === ' ') {\n const current = filteredComponents[componentCursorIndex];\n if (current) {\n setSelectedPaths(prev => {\n const next = new Set(prev);\n if (next.has(current.filepath)) next.delete(current.filepath);\n else next.add(current.filepath);\n return next;\n });\n }\n }\n }\n }, { isActive: !isSearchFocused });\n\n // Handle search-specific keys (escape, enter, down arrow)\n useInput((input, key) => {\n if (key.escape) {\n setIsSearchFocused(false);\n return;\n }\n if (key.return) {\n setIsSearchFocused(false);\n return;\n }\n if (key.downArrow && filteredComponents.length > 0) {\n setIsSearchFocused(false);\n setComponentCursorIndex(0);\n return;\n }\n }, { isActive: isSearchFocused });\n\n // Handle apply\n const handleApply = async () => {\n setViewState('installing');\n const targetDir = process.cwd() + '/.jai1';\n const pathsToInstall = Array.from(selectedPaths);\n\n const resolvedPaths = await service.resolveWithDependencies(config, pathsToInstall);\n const installed = await service.getInstalled();\n\n const initialProgress: InstallProgress[] = resolvedPaths.map(fp => ({\n filepath: fp,\n status: 'pending' as const\n }));\n setInstallProgress(initialProgress);\n setInstallStats({ total: resolvedPaths.length, completed: 0, added: 0, updated: 0, failed: 0 });\n\n let added = 0, updated = 0, failed = 0;\n\n for (let i = 0; i < resolvedPaths.length; i++) {\n const fp = resolvedPaths[i]!;\n setInstallProgress(prev => prev.map(p =>\n p.filepath === fp ? { ...p, status: 'downloading' as const } : p\n ));\n\n try {\n const info = installed[fp];\n if (info && !force && info.modified) {\n setInstallProgress(prev => prev.map(p =>\n p.filepath === fp ? { ...p, status: 'error' as const, error: 'Modified locally' } : p\n ));\n failed++;\n } else {\n await service.install(config, fp, targetDir);\n setInstallProgress(prev => prev.map(p =>\n p.filepath === fp ? { ...p, status: 'success' as const } : p\n ));\n if (info) updated++;\n else added++;\n }\n } catch (err) {\n setInstallProgress(prev => prev.map(p =>\n p.filepath === fp ? { ...p, status: 'error' as const, error: err instanceof Error ? err.message : 'Error' } : p\n ));\n failed++;\n }\n\n setInstallStats({ total: resolvedPaths.length, completed: i + 1, added, updated, failed });\n }\n\n setViewState('summary');\n };\n\n // Handle IDE sync\n const handleIdeSync = async () => {\n setViewState('syncing');\n\n const migrateService = new MigrateIdeService();\n const content = await migrateService.scanJai1Content();\n\n if (content.totalCount === 0) {\n setSyncStats({ total: 0, completed: 0, created: 0, updated: 0, skipped: 0, errors: 0 });\n setViewState('done');\n return;\n }\n\n const selectedIdeList = Array.from(selectedIdes);\n const contentTypes: MigrateContentType[] = ['rules', 'workflows'];\n\n const totalItems = contentTypes.reduce((sum, type) => {\n return sum + (type === 'rules' ? content.rules.length :\n type === 'workflows' ? content.workflows.length :\n content.commands.length);\n }, 0);\n const totalFiles = totalItems * selectedIdeList.length;\n\n setSyncStats({ total: totalFiles, completed: 0, created: 0, updated: 0, skipped: 0, errors: 0 });\n\n let created = 0, updated = 0, skipped = 0, errors = 0;\n let completed = 0;\n\n await migrateService.migrate(\n selectedIdeList,\n contentTypes,\n content,\n (result) => {\n completed++;\n if (result.status === 'created') created++;\n else if (result.status === 'updated') updated++;\n else if (result.status === 'skipped') skipped++;\n else if (result.status === 'error') errors++;\n\n setSyncProgress(prev => [...prev.slice(-7), {\n targetPath: result.targetPath || result.source.relativePath,\n status: result.status === 'error' ? 'error' : 'success',\n error: result.error\n }]);\n setSyncStats({ total: totalFiles, completed, created, updated, skipped, errors });\n }\n );\n\n setViewState('done');\n };\n\n // Render loading\n if (loading) {\n return (\n <Box padding={1}>\n <Text color=\"cyan\"><Spinner type=\"dots\" /> Loading components...</Text>\n </Box>\n );\n }\n\n // Render error\n if (error) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Text color=\"red\">โŒ Error: {error}</Text>\n <Text dimColor>Press Ctrl+Q to exit</Text>\n </Box>\n );\n }\n\n // Render installing\n if (viewState === 'installing') {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">๐Ÿ“ฆ Installing Components</Text>\n </Box>\n <Box marginBottom={1}>\n <ProgressBar current={installStats.completed} total={installStats.total} width={50} />\n </Box>\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" padding={1} height={10}>\n {installProgress.slice(-8).map((item) => (\n <Box key={item.filepath}>\n <StatusIcon status={\n item.status === 'success' ? 'success' :\n item.status === 'error' ? 'error' :\n item.status === 'downloading' ? 'loading' : 'pending'\n } />\n <Text> {item.filepath}</Text>\n {item.error && <Text color=\"red\" dimColor> ({item.error})</Text>}\n </Box>\n ))}\n </Box>\n <Box marginTop={1}>\n <Text>\n ๐Ÿ“Š <Text color=\"green\">{installStats.added} added</Text>\n {' ยท '}<Text color=\"cyan\">{installStats.updated} updated</Text>\n {' ยท '}<Text color=\"red\">{installStats.failed} failed</Text>\n </Text>\n </Box>\n </Box>\n );\n }\n\n // Render summary\n if (viewState === 'summary') {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Box marginBottom={1}>\n <Text bold color=\"green\">โœ… Installation Complete!</Text>\n </Box>\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" padding={1}>\n <Text>{installStats.total} components processed:</Text>\n <Text> โ””โ”€ <Text color=\"green\">{installStats.added}</Text> added</Text>\n <Text> โ””โ”€ <Text color=\"cyan\">{installStats.updated}</Text> updated</Text>\n {installStats.failed > 0 && <Text> โ””โ”€ <Text color=\"red\">{installStats.failed}</Text> failed</Text>}\n </Box>\n <Box marginTop={1}>\n <Text>๐Ÿ“ Location: <Text color=\"cyan\">{process.cwd()}/.jai1</Text></Text>\n </Box>\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold color=\"yellow\">๐Ÿ“ฆ Sync to IDE(s)?</Text>\n <Text dimColor>Sync rules and workflows to your IDE directories</Text>\n </Box>\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text dimColor>[Enter] Select IDEs ยท [S/Esc] Skip</Text>\n </Box>\n </Box>\n );\n }\n\n // Render IDE sync selection\n if (viewState === 'ide-sync') {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">๐Ÿ”„ Select IDE(s)</Text>\n </Box>\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"cyan\" padding={1}>\n {availableIdes.map((ide, i) => {\n const ideConfig = IDE_MIGRATION_CONFIGS[ide];\n const isCursor = i === ideCursorIndex;\n const isChecked = selectedIdes.has(ide);\n return (\n <Box key={ide}>\n <Text color={isCursor ? 'cyan' : 'white'}>\n {isCursor ? 'โฏ ' : ' '}\n {isChecked ? '[โœ“]' : '[ ]'} {ideConfig.icon} {ideConfig.name}\n </Text>\n </Box>\n );\n })}\n </Box>\n {selectedIdes.size > 0 && (\n <Box marginTop={1}>\n <Text>Selected: <Text color=\"green\">{selectedIdes.size}</Text> IDE(s)</Text>\n </Box>\n )}\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text dimColor>[โ†‘โ†“] Navigate ยท [โฃ] Toggle ยท [A] All ยท [Enter] Sync ยท [S] Skip</Text>\n </Box>\n </Box>\n );\n }\n\n // Render syncing\n if (viewState === 'syncing') {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">๐Ÿ”„ Syncing to IDE(s)</Text>\n </Box>\n <Box marginBottom={1}>\n <ProgressBar current={syncStats.completed} total={syncStats.total} width={50} />\n </Box>\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" padding={1} height={10}>\n {syncProgress.slice(-8).map((item, idx) => (\n <Box key={`${item.targetPath}-${idx}`}>\n <StatusIcon status={item.status === 'success' ? 'success' : item.status === 'error' ? 'error' : 'pending'} />\n <Text> {item.targetPath}</Text>\n {item.error && <Text color=\"red\" dimColor> ({item.error})</Text>}\n </Box>\n ))}\n </Box>\n <Box marginTop={1}>\n <Text>\n ๐Ÿ“Š <Text color=\"green\">{syncStats.created} created</Text>\n {' ยท '}<Text color=\"cyan\">{syncStats.updated} updated</Text>\n {syncStats.skipped > 0 && <>{' ยท '}<Text color=\"yellow\">{syncStats.skipped} skipped</Text></>}\n {syncStats.errors > 0 && <>{' ยท '}<Text color=\"red\">{syncStats.errors} errors</Text></>}\n </Text>\n </Box>\n </Box>\n );\n }\n\n // Render done\n if (viewState === 'done') {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Box marginBottom={1}>\n <Text bold color=\"green\">๐ŸŽ‰ All Done!</Text>\n </Box>\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" padding={1}>\n <Text bold>๐Ÿ“ฆ Components:</Text>\n <Text> โ””โ”€ <Text color=\"green\">{installStats.added}</Text> added, <Text color=\"cyan\">{installStats.updated}</Text> updated</Text>\n {syncStats.total > 0 && (\n <>\n <Text> </Text>\n <Text bold>๐Ÿ”„ IDE Sync:</Text>\n <Text> โ””โ”€ <Text color=\"green\">{syncStats.created}</Text> created, <Text color=\"cyan\">{syncStats.updated}</Text> updated</Text>\n <Text> โ””โ”€ {Array.from(selectedIdes).map(ide => IDE_MIGRATION_CONFIGS[ide].name).join(', ')}</Text>\n </>\n )}\n </Box>\n <Box marginTop={1}>\n <Text dimColor>Press Enter to exit</Text>\n </Box>\n </Box>\n );\n }\n\n // Render browse - Two Pane Layout\n const selectedPackage = packageOptions[packageCursorIndex];\n const visibleComponents = filteredComponents.slice(0, 10);\n const hasMore = filteredComponents.length > 10;\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n {/* Header */}\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">๐Ÿ“ฆ Jai1 Apply</Text>\n {selectedPaths.size > 0 && (\n <Text color=\"green\"> [{selectedPaths.size} selected]</Text>\n )}\n </Box>\n\n {/* Two Pane Layout */}\n <Box>\n {/* Left Pane - Packages */}\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={activePane === 'packages' ? 'cyan' : 'gray'}\n width={22}\n padding={1}\n >\n <Text bold dimColor>PACKAGES</Text>\n <Box flexDirection=\"column\" marginTop={1}>\n {packageOptions.map((pkg, i) => {\n const isCursor = i === packageCursorIndex;\n const isActive = activePane === 'packages';\n return (\n <Box key={pkg.tag}>\n <Text color={isCursor && isActive ? 'cyan' : isCursor ? 'white' : 'gray'}>\n {isCursor && isActive ? 'โฏ ' : isCursor ? 'โ€บ ' : ' '}\n {pkg.tag} <Text dimColor>({pkg.count})</Text>\n </Text>\n </Box>\n );\n })}\n </Box>\n </Box>\n\n {/* Right Pane - Components */}\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={activePane === 'components' ? 'cyan' : 'gray'}\n flexGrow={1}\n marginLeft={1}\n padding={1}\n >\n {/* Search */}\n <Box marginBottom={1}>\n <Text color={isSearchFocused ? 'cyan' : 'gray'}>๐Ÿ” </Text>\n {isSearchFocused ? (\n <TextInput\n value={searchQuery}\n onChange={setSearchQuery}\n placeholder=\"Type to filter...\"\n focus={true}\n />\n ) : (\n <Text>{searchQuery || <Text dimColor>/ to search</Text>}</Text>\n )}\n </Box>\n\n {/* Components header */}\n <Box marginBottom={1}>\n <Text bold>COMPONENTS </Text>\n {selectedPackage && selectedPackage.tag !== 'All' && (\n <Text color=\"cyan\">[{selectedPackage.tag}] </Text>\n )}\n {searchQuery && (\n <Text color=\"yellow\">\"{searchQuery}\" </Text>\n )}\n <Text dimColor>({filteredComponents.length}{hasMore ? '+' : ''})</Text>\n </Box>\n\n {/* Components list */}\n <Box flexDirection=\"column\">\n {visibleComponents.map((comp, i) => {\n const isCursor = i === componentCursorIndex && activePane === 'components';\n const isChecked = selectedPaths.has(comp.filepath);\n const isInstalled = installedPaths.has(comp.filepath);\n\n return (\n <Box key={comp.filepath}>\n <Text color={isCursor ? 'cyan' : 'white'}>\n {isCursor ? 'โฏ ' : ' '}\n {isChecked ? '[โœ“]' : '[ ]'} {comp.filepath}\n </Text>\n <Text dimColor> {isInstalled ? 'โœ“' : 'โ—‹'}</Text>\n </Box>\n );\n })}\n {filteredComponents.length === 0 && (\n <Text dimColor> No components match</Text>\n )}\n {hasMore && (\n <Text dimColor> ... +{filteredComponents.length - 10} more</Text>\n )}\n </Box>\n </Box>\n </Box>\n\n {/* Selected preview */}\n {selectedPaths.size > 0 && (\n <Box marginTop={1}>\n <Text dimColor>\n ๐Ÿ“Œ {Array.from(selectedPaths).slice(0, 2).join(', ')}\n {selectedPaths.size > 2 && ` +${selectedPaths.size - 2} more`}\n </Text>\n </Box>\n )}\n\n {/* Help */}\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text dimColor>\n {activePane === 'packages' && '[โ†‘โ†“] Select ยท [โ†’/Tab] Components ยท [โฃ] Select all'}\n {activePane === 'components' && !isSearchFocused && '[โ†‘โ†“] Navigate ยท [โ†/Tab] Packages ยท [โฃ] Toggle ยท [/] Search'}\n {isSearchFocused && 'Type to filter ยท [Enter/Esc] Done'}\n {!isSearchFocused && ' ยท [A] All ยท [C] Clear ยท [Enter] Apply'}\n </Text>\n </Box>\n </Box>\n );\n};\n","import { Command } from 'commander';\nimport { confirm } from '@inquirer/prompts';\nimport chalk from 'chalk';\nimport { ConfigService } from '../services/config.service.js';\nimport { ComponentsService } from '../services/components.service.js';\nimport { ValidationError } from '../errors/index.js';\nimport { trackAction } from '../services/tracking.service.js';\n\n/**\n * Create update command\n */\nexport function createUpdateCommand(): Command {\n return new Command('update')\n .description('Update installed components to latest versions')\n .option('--force', 'Force update even if files are modified locally')\n .action(async (options: { force?: boolean }) => {\n await handleUpdate(options);\n });\n}\n\nasync function handleUpdate(options: { force?: boolean }) {\n const configService = new ConfigService();\n const config = await configService.load();\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n const componentsService = new ComponentsService();\n const installed = await componentsService.getInstalled();\n const filepaths = Object.keys(installed);\n\n if (filepaths.length === 0) {\n console.log(chalk.yellow('๐Ÿ“ฆ Chฦฐa cรณ components nร o ฤ‘ฦฐแปฃc cร i ฤ‘แบทt.'));\n console.log(chalk.dim(' Chแบกy \"jai1 apply\" ฤ‘แปƒ thรชm components.'));\n return;\n }\n\n console.log(chalk.cyan('๐Ÿ” ฤang kiแปƒm tra cแบญp nhแบญt...'));\n\n try {\n const checksums = await componentsService.getChecksums(config, filepaths);\n const updates: string[] = [];\n const upToDate: string[] = [];\n const deprecated: string[] = [];\n\n for (const fp of filepaths) {\n const current = installed[fp];\n const latest = checksums[fp];\n\n if (!latest) {\n deprecated.push(fp);\n continue;\n }\n\n if (current.checksum !== latest.checksum) {\n updates.push(fp);\n } else {\n upToDate.push(fp);\n }\n }\n\n // Show deprecated components\n if (deprecated.length > 0) {\n console.log(chalk.yellow('\\nโš ๏ธ Components khรดng cรฒn trรชn server (deprecated):'));\n for (const fp of deprecated) {\n console.log(chalk.dim(` - ${fp}`));\n }\n }\n\n if (updates.length === 0) {\n console.log(chalk.green('\\nโœ… Tแบฅt cแบฃ components ฤ‘รฃ lร  phiรชn bแบฃn mแป›i nhแบฅt.'));\n if (upToDate.length > 0) {\n console.log(chalk.dim(` ${upToDate.length} component(s) ฤ‘รฃ cแบญp nhแบญt.`));\n }\n return;\n }\n\n console.log(chalk.cyan(`\\n๐Ÿ“ฆ Tรฌm thแบฅy ${chalk.bold(updates.length)} cแบญp nhแบญt:`));\n for (const fp of updates) {\n const current = installed[fp];\n const latest = checksums[fp];\n console.log(\n ` ${chalk.white(fp)} ` +\n chalk.dim(`v${current.version}`) +\n chalk.cyan(' โ†’ ') +\n chalk.green(`v${latest.version}`)\n );\n }\n console.log();\n\n if (!options.force) {\n const shouldUpdate = await confirm({ message: 'Cแบญp nhแบญt ngay?', default: true });\n if (!shouldUpdate) {\n console.log(chalk.dim('ฤรฃ hแปงy cแบญp nhแบญt.'));\n return;\n }\n }\n\n // Perform updates\n const targetDir = process.cwd() + '/.jai1';\n let updatedCount = 0;\n const backupPaths: string[] = [];\n\n console.log();\n for (const fp of updates) {\n try {\n process.stdout.write(chalk.cyan(`๐Ÿ“ฅ ฤang cแบญp nhแบญt ${chalk.white(fp)}...`));\n const backupPath = await componentsService.backupFile(fp, targetDir);\n if (backupPath) {\n backupPaths.push(backupPath);\n }\n\n await componentsService.install(config, fp, targetDir);\n console.log(chalk.green(' โœ“'));\n updatedCount++;\n } catch (error) {\n console.log(chalk.red(' โœ—'));\n console.log(chalk.red(` Lแป—i: ${error instanceof Error ? error.message : 'Unknown error'}`));\n }\n }\n\n console.log();\n if (updatedCount === updates.length) {\n console.log(chalk.green(`โœ… Hoร n tแบฅt: ${updatedCount}/${updates.length} ฤ‘รฃ cแบญp nhแบญt.`));\n } else {\n console.log(chalk.yellow(`โš ๏ธ Hoร n tแบฅt: ${updatedCount}/${updates.length} ฤ‘รฃ cแบญp nhแบญt.`));\n }\n\n if (backupPaths.length > 0) {\n console.log(chalk.dim(`\\n๐Ÿ“ ฤรฃ tแบกo backup tแบกi .jai1_backup/`));\n\n const cleanBackups = await confirm({ message: 'Xรณa cรกc backup nร y?', default: false });\n if (cleanBackups) {\n await componentsService.clearBackups(process.cwd());\n console.log(chalk.green('๐Ÿ—‘๏ธ ฤรฃ xรณa backups.'));\n } else {\n console.log(chalk.dim('๐Ÿ’ก Chแบกy \"jai1 clean\" ฤ‘แปƒ xรณa sau.'));\n }\n }\n\n trackAction('components_update', { count: updatedCount });\n\n } catch (error) {\n throw new Error(`Kiแปƒm tra cแบญp nhแบญt thแบฅt bแบกi: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport Table from 'cli-table3';\nimport { ConfigService } from '../../services/config.service.js';\nimport { ComponentsService } from '../../services/components.service.js';\nimport { ValidationError } from '../../errors/index.js';\nimport { getCliName } from '../../utils/cli-name.js';\n\ninterface CheckOptions {\n json?: boolean;\n}\n\n/**\n * Create check command for Jai1 Framework\n * Checks current version and compares with latest from server\n */\nexport function createCheckCommand(): Command {\n const cmd = new Command('check')\n .description('Kiแปƒm tra cแบญp nhแบญt framework')\n .option('--json', 'Output as JSON')\n .action(async (options: CheckOptions) => {\n await handleCheck(options);\n });\n\n return cmd;\n}\n\nasync function handleCheck(options: CheckOptions): Promise<void> {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError(`Not initialized. Run \"${getCliName()} auth\" first.`);\n }\n\n const componentsService = new ComponentsService();\n const installed = await componentsService.getInstalled();\n const filepaths = Object.keys(installed);\n\n if (filepaths.length === 0) {\n console.log(\n chalk.yellow(`Chฦฐa cรณ components nร o. Chแบกy \"${getCliName()} apply\" ฤ‘แปƒ bแบฏt ฤ‘แบงu.`)\n );\n return;\n }\n\n console.log(chalk.dim('ฤang kiแปƒm tra cแบญp nhแบญt...\\n'));\n\n try {\n const checksums = await componentsService.getChecksums(config, filepaths);\n const updates: string[] = [];\n const upToDate: string[] = [];\n\n for (const fp of filepaths) {\n const current = installed[fp];\n const latest = checksums[fp];\n\n if (!latest) {\n // Component removed from server?\n continue;\n }\n\n if (current.checksum !== latest.checksum) {\n updates.push(fp);\n } else {\n upToDate.push(fp);\n }\n }\n\n // Output as JSON if requested\n if (options.json) {\n console.log(\n JSON.stringify(\n {\n updates: updates.map((fp) => ({\n path: fp,\n currentVersion: installed[fp].version,\n latestVersion: checksums[fp].version,\n })),\n upToDate: upToDate.length,\n total: filepaths.length,\n },\n null,\n 2\n )\n );\n return;\n }\n\n // Show status table\n console.log(chalk.bold('๐Ÿ“Œ Trแบกng thรกi Components:\\n'));\n\n if (updates.length > 0) {\n const table = new Table({\n head: [\n chalk.bold('Component'),\n chalk.bold('Hiแป‡n tแบกi'),\n chalk.bold('Mแป›i nhแบฅt'),\n chalk.bold('Trแบกng thรกi'),\n ],\n style: {\n head: ['cyan'],\n border: ['gray'],\n },\n });\n\n for (const fp of updates) {\n const current = installed[fp];\n const latest = checksums[fp];\n table.push([\n fp,\n `v${current.version}`,\n chalk.green(`v${latest.version}`),\n chalk.yellow('โš ๏ธ CแบฆN CแบฌP NHแบฌT'),\n ]);\n }\n\n console.log(table.toString());\n }\n\n // Summary\n console.log();\n if (updates.length === 0 && upToDate.length > 0) {\n console.log(\n chalk.green(`โœ“ Tแบฅt cแบฃ ${upToDate.length} components ฤ‘รฃ cแบญp nhแบญt.`)\n );\n } else if (upToDate.length > 0) {\n console.log(chalk.dim(`โœ“ ${upToDate.length} components ฤ‘รฃ cแบญp nhแบญt.`));\n }\n\n if (updates.length > 0) {\n console.log(\n chalk.yellow(`\\nโš ๏ธ ${updates.length} component(s) cรณ bแบฃn cแบญp nhแบญt!`)\n );\n console.log(\n chalk.dim('Chแบกy'),\n chalk.cyan(`'${getCliName()} update'`),\n chalk.dim('ฤ‘แปƒ cแบญp nhแบญt.')\n );\n } else {\n console.log(chalk.green('\\nโœ… Mแปi thแปฉ ฤ‘รฃ ฤ‘ฦฐแปฃc cแบญp nhแบญt!'));\n }\n } catch (error) {\n console.error(\n chalk.red('Lแป—i kiแปƒm tra cแบญp nhแบญt:'),\n error instanceof Error ? error.message : error\n );\n }\n}\n","/**\n * IDE Command Group\n * Manages IDE integration commands: context, setup, sync, status\n */\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { createContextSubcommand } from './context.js';\nimport { createSetupSubcommand } from './setup.js';\nimport { createSyncSubcommand } from './sync.js';\nimport { createStatusSubcommand } from './status.js';\n\nfunction showIdeHelp(): void {\n console.log(chalk.bold.cyan('๐Ÿ–ฅ๏ธ jai1 ide') + chalk.dim(' - IDE integration vร  cแบฅu hรฌnh'));\n console.log();\n console.log(chalk.bold('Cรกc lแป‡nh:'));\n console.log(` ${chalk.cyan('context')} Duyแป‡t vร  khรกm phรก IDE context`);\n console.log(` ${chalk.cyan('setup')} Cแบฅu hรฌnh IDE settings (VSCode optimizations)`);\n console.log(` ${chalk.cyan('sync')} ฤแป“ng bแป™ .jai1 content ฤ‘แบฟn IDE directories`);\n console.log(` ${chalk.cyan('status')} Hiแปƒn thแป‹ cรกc IDE ฤ‘ฦฐแปฃc phรกt hiแป‡n vร  trแบกng thรกi`);\n console.log();\n console.log(chalk.bold('IDEs ฤ‘ฦฐแปฃc hแป— trแปฃ:'));\n console.log(chalk.dim(' Cursor, Windsurf, VSCode, Trae, Claude'));\n console.log();\n console.log(chalk.bold('Vรญ dแปฅ:'));\n console.log(chalk.dim(' $ jai1 ide status'));\n console.log(chalk.dim(' $ jai1 ide setup --optimize'));\n console.log(chalk.dim(' $ jai1 ide sync'));\n console.log(chalk.dim(' $ jai1 ide context'));\n console.log();\n console.log(chalk.dim('Chแบกy \"jai1 ide <lแป‡nh> --help\" ฤ‘แปƒ xem chi tiแบฟt'));\n}\n\n/**\n * Create IDE command group\n */\nexport function createIdeCommand(): Command {\n const ideCommand = new Command('ide')\n .description('IDE integration and configuration commands')\n .action(() => {\n showIdeHelp();\n });\n\n // Add subcommands\n ideCommand.addCommand(createContextSubcommand());\n ideCommand.addCommand(createSetupSubcommand());\n ideCommand.addCommand(createSyncSubcommand());\n ideCommand.addCommand(createStatusSubcommand());\n\n return ideCommand;\n}\n","/**\n * IDE Context Subcommand\n * Browse and explore IDE context (rules, workflows, skills, etc.)\n */\nimport React from 'react';\nimport { render } from 'ink';\nimport { Command } from 'commander';\nimport { ContextApp } from '../../ui/context/ContextApp.js';\nimport type { IDE, ContentType } from '../../types/context.types.js';\nimport { ContextScannerService } from '../../services/context-scanner.service.js';\n\n/**\n * Create context subcommand for IDE group\n */\nexport function createContextSubcommand(): Command {\n const cmd = new Command('context')\n .description('Browse and explore IDE context (rules, workflows, skills)')\n .option('--target <ide>', 'Open specific IDE context (cursor, windsurf, antigravity, jai1)')\n .option('--type <type>', 'Show specific content type (rules, workflows, skills, agents, prompts)')\n .option('--stats', 'Show context statistics (non-interactive)')\n .action(async (options: { target?: string; type?: string; stats?: boolean }) => {\n // Validate IDE option\n let initialIDE: IDE | undefined;\n if (options.target) {\n const validIDEs = ['cursor', 'windsurf', 'antigravity', 'jai1'];\n if (!validIDEs.includes(options.target)) {\n console.error(`โŒ Invalid IDE: ${options.target}`);\n console.error(` Valid IDEs: ${validIDEs.join(', ')}`);\n process.exit(1);\n }\n initialIDE = options.target as IDE;\n }\n\n // Validate type option\n let initialType: ContentType | undefined;\n if (options.type) {\n const validTypes = ['rules', 'workflows', 'skills', 'agents', 'prompts', 'context'];\n if (!validTypes.includes(options.type)) {\n console.error(`โŒ Invalid content type: ${options.type}`);\n console.error(` Valid types: ${validTypes.join(', ')}`);\n process.exit(1);\n }\n initialType = options.type as ContentType;\n }\n\n // Stats mode - non-interactive\n if (options.stats) {\n await printStats();\n return;\n }\n\n // Interactive mode\n const { waitUntilExit } = render(\n React.createElement(ContextApp, {\n initialIDE,\n initialType,\n onExit: () => {\n process.exit(0);\n },\n })\n );\n\n await waitUntilExit();\n });\n\n return cmd;\n}\n\n/**\n * Print context statistics (non-interactive)\n */\nasync function printStats(): Promise<void> {\n const scanner = new ContextScannerService();\n\n console.log('๐Ÿ” Scanning context...\\n');\n\n try {\n const context = await scanner.scanAll();\n\n if (context.ides.length === 0) {\n console.log('โš ๏ธ No context found');\n console.log(' Run `jai1 apply` to install context for your IDE.\\n');\n return;\n }\n\n console.log('๐Ÿ“Š Context Statistics\\n');\n console.log(`๐Ÿ“ Project: ${context.projectPath}`);\n console.log(`๐Ÿ• Scan time: ${context.scanTime.toLocaleString('en-US')}\\n`);\n\n for (const ideContext of context.ides) {\n console.log(`${ideContext.config.icon} ${ideContext.config.name}`);\n console.log(` Path: ${ideContext.config.basePath}`);\n console.log(` Items: ${ideContext.stats.totalItems}`);\n\n const types: string[] = [];\n if (ideContext.stats.byType.rules) types.push(`${ideContext.stats.byType.rules} rules`);\n if (ideContext.stats.byType.workflows) types.push(`${ideContext.stats.byType.workflows} workflows`);\n if (ideContext.stats.byType.skills) types.push(`${ideContext.stats.byType.skills} skills`);\n if (ideContext.stats.byType.agents) types.push(`${ideContext.stats.byType.agents} agents`);\n if (ideContext.stats.byType.prompts) types.push(`${ideContext.stats.byType.prompts} prompts`);\n if (ideContext.stats.byType.context) types.push(`${ideContext.stats.byType.context} context`);\n\n if (types.length > 0) {\n console.log(` Breakdown: ${types.join(', ')}`);\n }\n\n console.log('');\n }\n\n console.log(`โœ… Total: ${context.totalItems} items\\n`);\n } catch (error) {\n console.error('โŒ Error scanning context:', error);\n process.exit(1);\n }\n}\n","import React, { useState, useEffect } from 'react';\nimport { Box, Text, useInput, useApp } from 'ink';\nimport type { IDE, ContentType, IDEContext, ContextItem } from '../../types/context.types.js';\nimport { MainMenuView } from './views/MainMenuView.js';\nimport { IDEOverviewView } from './views/IDEOverviewView.js';\nimport { ListView } from './views/ListView.js';\nimport { DetailView } from './views/DetailView.js';\nimport { ContextScannerService } from '../../services/context-scanner.service.js';\n\nexport type ContextScreen = 'menu' | 'overview' | 'list' | 'detail';\n\ninterface ContextAppProps {\n initialIDE?: IDE;\n initialType?: ContentType;\n onExit: () => void;\n}\n\n/**\n * ContextApp - Interactive Context Visualizer\n */\nexport const ContextApp: React.FC<ContextAppProps> = ({ initialIDE, initialType, onExit }) => {\n const { exit } = useApp();\n const [screen, setScreen] = useState<ContextScreen>('menu');\n const [selectedIDE, setSelectedIDE] = useState<IDE | null>(initialIDE || null);\n const [selectedType, setSelectedType] = useState<ContentType | null>(initialType || null);\n const [selectedItem, setSelectedItem] = useState<ContextItem | null>(null);\n\n const [ideContexts, setIdeContexts] = useState<IDEContext[]>([]);\n const [loading, setLoading] = useState(true);\n const [scrollPosition, setScrollPosition] = useState(0);\n\n // Scan context on mount\n useEffect(() => {\n const scanner = new ContextScannerService();\n scanner.scanAll().then(result => {\n setIdeContexts(result.ides);\n setLoading(false);\n\n // If initialIDE is set, jump to overview\n if (initialIDE) {\n setScreen('overview');\n }\n }).catch(error => {\n console.error('Failed to scan context:', error);\n setLoading(false);\n });\n }, [initialIDE]);\n\n // Handle keyboard input\n useInput((input, key) => {\n // q to quit (global)\n if (input === 'q') {\n onExit();\n return;\n }\n\n // Escape or Backspace to go back (NOT in detail view - DetailView handles its own input)\n if (screen !== 'detail' && (key.escape || key.backspace)) {\n handleBack();\n return;\n }\n });\n\n const handleBack = () => {\n if (screen === 'detail') {\n setScreen('list');\n setSelectedItem(null);\n setScrollPosition(0);\n } else if (screen === 'list') {\n setScreen('overview');\n setSelectedType(null);\n } else if (screen === 'overview') {\n setScreen('menu');\n setSelectedIDE(null);\n } else {\n onExit();\n }\n };\n\n const handleSelectIDE = (ide: IDE) => {\n setSelectedIDE(ide);\n setScreen('overview');\n };\n\n const handleSelectType = (type: ContentType) => {\n setSelectedType(type);\n setScreen('list');\n };\n\n const handleSelectItem = (item: ContextItem) => {\n setSelectedItem(item);\n setScreen('detail');\n setScrollPosition(0);\n };\n\n // Get current IDE context\n const currentIDEContext = ideContexts.find(ctx => ctx.ide === selectedIDE);\n\n // Get current items for selected type\n const currentItems = currentIDEContext?.items?.filter(item => item.type === selectedType) ?? [];\n\n // Render appropriate view\n const renderContent = () => {\n if (loading) {\n return (\n <Box padding={1}>\n <Text>ฤang quรฉt context...</Text>\n </Box>\n );\n }\n\n switch (screen) {\n case 'menu':\n return <MainMenuView ideContexts={ideContexts} onSelect={handleSelectIDE} />;\n case 'overview':\n return currentIDEContext ? (\n <IDEOverviewView\n ideContext={currentIDEContext}\n onSelectType={handleSelectType}\n onBack={handleBack}\n />\n ) : null;\n case 'list':\n return (\n <ListView\n items={currentItems}\n contentType={selectedType!}\n onSelect={handleSelectItem}\n onBack={handleBack}\n />\n );\n case 'detail':\n return selectedItem ? (\n <DetailView\n item={selectedItem}\n scrollPosition={scrollPosition}\n onBack={handleBack}\n />\n ) : null;\n default:\n return <MainMenuView ideContexts={ideContexts} onSelect={handleSelectIDE} />;\n }\n };\n\n // Get footer hints based on screen\n const getFooterHints = () => {\n switch (screen) {\n case 'menu':\n return '[โ†‘โ†“] Chแปn ยท [Enter] MแปŸ ยท [q] Thoรกt';\n case 'overview':\n return '[Tab/1-6] Chuyแปƒn tab ยท [Enter] Xem danh sรกch ยท [Esc/โ†] Quay lแบกi ยท [q] Thoรกt';\n case 'list':\n return '[โ†‘โ†“] Chแปn ยท [Enter] Chi tiแบฟt ยท [Esc/โ†] Quay lแบกi ยท [q] Thoรกt';\n case 'detail':\n return '[โ†‘โ†“/j/k] Cuแป™n ยท [PgUp/u PgDn/d] Cuแป™n nhanh ยท [g/G] ฤแบงu/Cuแป‘i ยท [Esc/โ†] Quay lแบกi ยท [q] Thoรกt';\n default:\n return '[q] Thoรกt';\n }\n };\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n {/* Header */}\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">๐Ÿ“‹ Jai1 Context</Text>\n <Text dimColor> - Khรกm phรก context dแปฑ รกn</Text>\n </Box>\n\n {/* Content */}\n {renderContent()}\n\n {/* Footer */}\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text dimColor>{getFooterHints()}</Text>\n </Box>\n </Box>\n );\n};\n","import React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport type { IDE, IDEContext } from '../../../types/context.types.js';\n\ninterface MainMenuViewProps {\n ideContexts: IDEContext[];\n onSelect: (ide: IDE) => void;\n}\n\ninterface IDEMenuItem {\n ide: IDE;\n icon: string;\n title: string;\n itemCount: number;\n available: boolean;\n}\n\n/**\n * MainMenuView - IDE selector menu\n */\nexport const MainMenuView: React.FC<MainMenuViewProps> = ({ ideContexts, onSelect }) => {\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n // Build menu items\n const menuItems: IDEMenuItem[] = [\n {\n ide: 'cursor',\n icon: '๐Ÿ”ฎ',\n title: 'Cursor',\n itemCount: ideContexts.find(ctx => ctx.ide === 'cursor')?.stats.totalItems || 0,\n available: ideContexts.some(ctx => ctx.ide === 'cursor'),\n },\n {\n ide: 'windsurf',\n icon: '๐Ÿ„',\n title: 'Windsurf',\n itemCount: ideContexts.find(ctx => ctx.ide === 'windsurf')?.stats.totalItems || 0,\n available: ideContexts.some(ctx => ctx.ide === 'windsurf'),\n },\n {\n ide: 'antigravity',\n icon: '๐Ÿš€',\n title: 'Antigravity',\n itemCount: ideContexts.find(ctx => ctx.ide === 'antigravity')?.stats.totalItems || 0,\n available: ideContexts.some(ctx => ctx.ide === 'antigravity'),\n },\n {\n ide: 'jai1',\n icon: '๐Ÿค–',\n title: 'Jai1 Framework',\n itemCount: ideContexts.find(ctx => ctx.ide === 'jai1')?.stats.totalItems || 0,\n available: ideContexts.some(ctx => ctx.ide === 'jai1'),\n },\n ];\n\n useInput((input, key) => {\n if (key.upArrow) {\n setSelectedIndex(prev => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setSelectedIndex(prev => Math.min(menuItems.length - 1, prev + 1));\n } else if (key.return) {\n const item = menuItems[selectedIndex];\n if (item && item.available) {\n onSelect(item.ide);\n }\n }\n }, { isActive: true });\n\n // Format item count summary\n const formatSummary = (item: IDEMenuItem): string => {\n if (!item.available) {\n return 'Khรดng cรณ context';\n }\n\n const ctx = ideContexts.find(c => c.ide === item.ide);\n if (!ctx) return '';\n\n const parts: string[] = [];\n if (ctx.stats.byType.rules) parts.push(`${ctx.stats.byType.rules} rules`);\n if (ctx.stats.byType.workflows) parts.push(`${ctx.stats.byType.workflows} workflows`);\n if (ctx.stats.byType.skills) parts.push(`${ctx.stats.byType.skills} skills`);\n if (ctx.stats.byType.agents) parts.push(`${ctx.stats.byType.agents} agents`);\n if (ctx.stats.byType.prompts) parts.push(`${ctx.stats.byType.prompts} prompts`);\n\n return parts.join(', ') || `${item.itemCount} items`;\n };\n\n return (\n <Box flexDirection=\"column\">\n {/* Welcome message */}\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"cyan\"\n padding={1}\n marginBottom={1}\n >\n <Text>Chร o mแปซng ฤ‘แบฟn vแป›i <Text bold color=\"cyan\">Jai1 Context</Text>!</Text>\n <Text dimColor>\n Khรกm phรก vร  quแบฃn lรฝ context cho cรกc IDE hแป— trแปฃ Agentic Coding.\n </Text>\n </Box>\n\n {/* Menu items */}\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" padding={1}>\n <Text bold marginBottom={1}>Chแปn IDE ฤ‘แปƒ khรกm phรก:</Text>\n\n {menuItems.map((item, index) => {\n const isSelected = index === selectedIndex;\n const dimmed = !item.available;\n\n return (\n <Box key={item.ide} marginY={0}>\n <Text color={isSelected ? 'cyan' : dimmed ? 'gray' : 'white'} dimColor={dimmed}>\n {isSelected ? 'โฏ ' : ' '}\n {item.icon} {item.title}\n </Text>\n {item.available && (\n <Text dimColor> - {formatSummary(item)}</Text>\n )}\n {!item.available && (\n <Text dimColor> - Khรดng cรณ context</Text>\n )}\n </Box>\n );\n })}\n </Box>\n\n {/* Quick tips */}\n {ideContexts.length === 0 && (\n <Box marginTop={1} borderStyle=\"round\" borderColor=\"yellow\" padding={1}>\n <Text color=\"yellow\">โš ๏ธ Khรดng tรฌm thแบฅy context nร o</Text>\n <Text dimColor>Hรฃy chแบกy </Text>\n <Text color=\"cyan\">jai1 apply</Text>\n <Text dimColor> ฤ‘แปƒ cร i ฤ‘แบทt context cho IDE cแปงa bแบกn.</Text>\n </Box>\n )}\n </Box>\n );\n};\n","import React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport type { IDEContext, ContentType } from '../../../types/context.types.js';\n\ninterface IDEOverviewViewProps {\n ideContext: IDEContext;\n onSelectType: (type: ContentType) => void;\n onBack: () => void;\n}\n\ninterface ContentTypeTab {\n type: ContentType;\n label: string;\n icon: string;\n count: number;\n}\n\n/**\n * IDEOverviewView - Overview of an IDE's context with tabs\n */\nexport const IDEOverviewView: React.FC<IDEOverviewViewProps> = ({\n ideContext,\n onSelectType,\n onBack,\n}) => {\n const [selectedTabIndex, setSelectedTabIndex] = useState(0);\n\n // Build tabs from available content types\n const tabs: ContentTypeTab[] = [];\n\n if (ideContext.stats.byType.rules) {\n tabs.push({\n type: 'rules',\n label: 'Rules',\n icon: '๐Ÿ“œ',\n count: ideContext.stats.byType.rules,\n });\n }\n if (ideContext.stats.byType.workflows) {\n tabs.push({\n type: 'workflows',\n label: 'Workflows',\n icon: '๐Ÿ”„',\n count: ideContext.stats.byType.workflows,\n });\n }\n if (ideContext.stats.byType.skills) {\n tabs.push({\n type: 'skills',\n label: 'Skills',\n icon: '๐Ÿ› ',\n count: ideContext.stats.byType.skills,\n });\n }\n if (ideContext.stats.byType.agents) {\n tabs.push({\n type: 'agents',\n label: 'Agents',\n icon: '๐Ÿค–',\n count: ideContext.stats.byType.agents,\n });\n }\n if (ideContext.stats.byType.prompts) {\n tabs.push({\n type: 'prompts',\n label: 'Prompts',\n icon: '๐Ÿ’ฌ',\n count: ideContext.stats.byType.prompts,\n });\n }\n if (ideContext.stats.byType.context) {\n tabs.push({\n type: 'context',\n label: 'Context',\n icon: '๐Ÿ“‹',\n count: ideContext.stats.byType.context,\n });\n }\n\n useInput((input, key) => {\n // Tab navigation\n if (key.tab || key.rightArrow) {\n setSelectedTabIndex(prev => Math.min(tabs.length - 1, prev + 1));\n } else if (key.leftArrow) {\n setSelectedTabIndex(prev => Math.max(0, prev - 1));\n }\n\n // Number shortcuts (1-6)\n const num = parseInt(input, 10);\n if (!isNaN(num) && num >= 1 && num <= tabs.length) {\n setSelectedTabIndex(num - 1);\n }\n\n // Enter to select\n if (key.return) {\n const tab = tabs[selectedTabIndex];\n if (tab) {\n onSelectType(tab.type);\n }\n }\n }, { isActive: true });\n\n // Get current tab\n const currentTab = tabs[selectedTabIndex];\n\n // Get items for current tab\n const currentItems = currentTab\n ? ideContext?.items?.filter(item => item.type === currentTab.type) ?? []\n : [];\n\n // Format file size\n const formatSize = (bytes: number): string => {\n if (bytes < 1024) return `${bytes}B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;\n };\n\n // Format date\n const formatDate = (date: Date): string => {\n return date.toLocaleDateString('vi-VN', {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n });\n };\n\n return (\n <Box flexDirection=\"column\">\n {/* Header */}\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">{ideContext.config.icon} {ideContext.config.name}</Text>\n </Box>\n\n {/* Summary Stats */}\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"cyan\"\n padding={1}\n marginBottom={1}\n >\n <Text bold>๐Ÿ“Š Tแป•ng quan</Text>\n <Box marginTop={1}>\n <Text>\n ๐Ÿ“ Tแป•ng: <Text bold color=\"cyan\">{ideContext.stats.totalItems} items</Text>\n </Text>\n <Text dimColor> ยท </Text>\n <Text>\n ๐Ÿ’พ Kรญch thฦฐแป›c: <Text bold>{formatSize(ideContext.stats.totalSize)}</Text>\n </Text>\n {ideContext.stats.lastModified && (\n <>\n <Text dimColor> ยท </Text>\n <Text>\n ๐Ÿ• Cแบญp nhแบญt: <Text bold>{formatDate(ideContext.stats.lastModified)}</Text>\n </Text>\n </>\n )}\n </Box>\n </Box>\n\n {/* Content Type Tabs */}\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" padding={1}>\n {/* Tab Headers */}\n <Box marginBottom={1}>\n {tabs.map((tab, index) => {\n const isSelected = index === selectedTabIndex;\n return (\n <Box key={tab.type} marginRight={1}>\n <Text\n color={isSelected ? 'cyan' : 'gray'}\n bold={isSelected}\n inverse={isSelected}\n >\n {' '}{tab.icon} {tab.label} ({tab.count}){' '}\n </Text>\n </Box>\n );\n })}\n </Box>\n\n {/* Tab Content Preview */}\n {currentTab && currentItems.length > 0 && (\n <Box flexDirection=\"column\">\n <Text dimColor>Preview (nhแบฅn Enter ฤ‘แปƒ xem chi tiแบฟt):</Text>\n <Box flexDirection=\"column\" marginTop={1}>\n {currentItems.slice(0, 5).map(item => (\n <Box key={item.id} marginY={0}>\n <Text>โ€ข {item.name}</Text>\n {item.description && (\n <Text dimColor> - {item.description}</Text>\n )}\n </Box>\n ))}\n {currentItems.length > 5 && (\n <Text dimColor>... vร  {currentItems.length - 5} items khรกc</Text>\n )}\n </Box>\n </Box>\n )}\n\n {currentTab && currentItems.length === 0 && (\n <Text dimColor>Khรดng cรณ items nร o trong {currentTab.label}</Text>\n )}\n </Box>\n </Box>\n );\n};\n","import React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport type { ContextItem, ContentType } from '../../../types/context.types.js';\n\ninterface ListViewProps {\n items: ContextItem[];\n contentType: ContentType;\n onSelect: (item: ContextItem) => void;\n onBack: () => void;\n}\n\n/**\n * ListView - List view for context items\n */\nexport const ListView: React.FC<ListViewProps> = ({ items, contentType, onSelect, onBack }) => {\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n useInput((input, key) => {\n if (key.upArrow) {\n setSelectedIndex(prev => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setSelectedIndex(prev => Math.min(items.length - 1, prev + 1));\n } else if (key.return) {\n const item = items[selectedIndex];\n if (item) {\n onSelect(item);\n }\n }\n }, { isActive: true });\n\n // Get type label\n const getTypeLabel = (): string => {\n switch (contentType) {\n case 'rules':\n return '๐Ÿ“œ Rules';\n case 'workflows':\n return '๐Ÿ”„ Workflows';\n case 'skills':\n return '๐Ÿ›  Skills';\n case 'agents':\n return '๐Ÿค– Agents';\n case 'prompts':\n return '๐Ÿ’ฌ Prompts';\n case 'context':\n return '๐Ÿ“‹ Context';\n default:\n return contentType;\n }\n };\n\n // Format file size\n const formatSize = (bytes: number): string => {\n if (bytes < 1024) return `${bytes}B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;\n };\n\n if (items.length === 0) {\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">{getTypeLabel()}</Text>\n </Box>\n <Box borderStyle=\"round\" borderColor=\"gray\" padding={1}>\n <Text dimColor>Khรดng cรณ items nร o</Text>\n </Box>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\">\n {/* Header */}\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">{getTypeLabel()}</Text>\n <Text dimColor> - {items.length} items</Text>\n </Box>\n\n {/* Items List */}\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" padding={1}>\n {items.map((item, index) => {\n const isSelected = index === selectedIndex;\n\n return (\n <Box key={item.id} flexDirection=\"column\" marginY={0}>\n <Box>\n <Text color={isSelected ? 'cyan' : 'white'}>\n {isSelected ? 'โฏ ' : ' '}\n {item.name}\n </Text>\n <Text dimColor> ({formatSize(item.fileSize)})</Text>\n </Box>\n\n {isSelected && (\n <Box marginLeft={3} flexDirection=\"column\">\n {item.description && (\n <Text dimColor>๐Ÿ“ {item.description}</Text>\n )}\n\n {/* Rules-specific metadata */}\n {contentType === 'rules' && (\n <>\n {item.alwaysApply && (\n <Text dimColor>โœ… Always active</Text>\n )}\n {item.globs && item.globs.length > 0 && (\n <Text dimColor>๐ŸŽฏ Globs: {item.globs.join(', ')}</Text>\n )}\n </>\n )}\n\n {/* Skills-specific metadata */}\n {contentType === 'skills' && (\n <Box>\n {item.hasScripts && <Text dimColor>๐Ÿ“ฆ scripts/ </Text>}\n {item.hasReferences && <Text dimColor>๐Ÿ“š references/ </Text>}\n {item.hasAssets && <Text dimColor>๐ŸŽจ assets/ </Text>}\n </Box>\n )}\n\n {/* Agents-specific metadata */}\n {contentType === 'agents' && item.model && (\n <Text dimColor>๐Ÿ”ง Model: {item.model}</Text>\n )}\n\n <Text dimColor>๐Ÿ“ {item.relativePath}</Text>\n </Box>\n )}\n </Box>\n );\n })}\n </Box>\n </Box>\n );\n};\n","import React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport type { ContextItem } from '../../../types/context.types.js';\n\ninterface DetailViewProps {\n item: ContextItem;\n scrollPosition: number;\n onBack: () => void;\n}\n\n/**\n * DetailView - Detail view for a context item with metadata and preview\n */\nexport const DetailView: React.FC<DetailViewProps> = ({ item, scrollPosition: initialScroll, onBack }) => {\n // Local scroll state\n const [scrollPosition, setScrollPosition] = useState(initialScroll);\n const maxVisibleLines = 25;\n const maxScroll = Math.max(0, item.previewLines.length - maxVisibleLines);\n\n // Handle keyboard input for scrolling\n useInput((input, key) => {\n // Scroll controls\n if (key.upArrow || input === 'k') {\n setScrollPosition(prev => Math.max(0, prev - 1));\n } else if (key.downArrow || input === 'j') {\n setScrollPosition(prev => Math.min(maxScroll, prev + 1));\n } else if (key.pageDown || input === 'd') {\n setScrollPosition(prev => Math.min(maxScroll, prev + 5));\n } else if (key.pageUp || input === 'u') {\n setScrollPosition(prev => Math.max(0, prev - 5));\n } else if (input === 'g') {\n setScrollPosition(0);\n } else if (input === 'G') {\n setScrollPosition(maxScroll);\n }\n // Back navigation\n else if (key.escape || key.backspace) {\n onBack();\n }\n }, { isActive: true });\n // Format file size\n const formatSize = (bytes: number): string => {\n if (bytes < 1024) return `${bytes}B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;\n };\n\n // Format date\n const formatDate = (date: Date): string => {\n return date.toLocaleString('vi-VN', {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n });\n };\n\n // Get visible preview lines based on scroll\n const visibleLines = item.previewLines.slice(\n scrollPosition,\n scrollPosition + maxVisibleLines\n );\n\n const hasMoreAbove = scrollPosition > 0;\n const hasMoreBelow = scrollPosition + maxVisibleLines < item.previewLines.length;\n\n // Calculate scroll percentage\n const scrollPercentage = item.previewLines.length <= maxVisibleLines\n ? 100\n : Math.round((scrollPosition / maxScroll) * 100);\n\n return (\n <Box flexDirection=\"column\">\n {/* Header with compact metadata */}\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text bold color=\"cyan\">{item.name}</Text>\n <Box>\n <Text dimColor>{item.relativePath} โ€ข {formatSize(item.fileSize)}</Text>\n {item.description && <Text dimColor> โ€ข {item.description}</Text>}\n </Box>\n <Box>\n {/* Type-specific metadata in one line */}\n {item.type === 'rules' && item.globs && item.globs.length > 0 && (\n <Text dimColor>globs: {item.globs.join(', ')}</Text>\n )}\n {item.type === 'agents' && item.model && (\n <Text dimColor>model: {item.model}</Text>\n )}\n {item.type === 'skills' && (\n <Text dimColor>\n {item.hasScripts && '๐Ÿ“ฆ scripts '}\n {item.hasReferences && '๐Ÿ“š refs '}\n {item.hasAssets && '๐ŸŽจ assets'}\n </Text>\n )}\n </Box>\n </Box>\n\n {/* Preview Panel */}\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" padding={1}>\n <Box justifyContent=\"space-between\">\n <Text bold>๐Ÿ‘๏ธ Preview</Text>\n {item.previewLines.length > maxVisibleLines && (\n <Text dimColor>\n [{scrollPosition + 1}-{Math.min(scrollPosition + maxVisibleLines, item.previewLines.length)}/{item.lineCount}] {scrollPercentage}%\n </Text>\n )}\n </Box>\n\n {hasMoreAbove && (\n <Box justifyContent=\"center\">\n <Text dimColor>โ–ฒ โ–ฒ โ–ฒ ({scrollPosition} dรฒng แปŸ trรชn) โ–ฒ โ–ฒ โ–ฒ</Text>\n </Box>\n )}\n\n <Box flexDirection=\"column\" marginTop={1}>\n {visibleLines.map((line, index) => {\n const lineNumber = scrollPosition + index + 1;\n return (\n <Box key={index}>\n <Text dimColor>{lineNumber.toString().padStart(3, ' ')}โ”‚ </Text>\n <Text>{line}</Text>\n </Box>\n );\n })}\n </Box>\n\n {hasMoreBelow && (\n <Box justifyContent=\"center\" marginTop={1}>\n <Text dimColor>\n โ–ผ โ–ผ โ–ผ ({item.lineCount - scrollPosition - visibleLines.length} dรฒng แปŸ dฦฐแป›i) โ–ผ โ–ผ โ–ผ\n </Text>\n </Box>\n )}\n\n {item.previewLines.length === 0 && (\n <Text dimColor>Khรดng cรณ nแป™i dung ฤ‘แปƒ hiแปƒn thแป‹</Text>\n )}\n </Box>\n </Box>\n );\n};\n","import { promises as fs } from 'fs';\nimport path from 'path';\nimport matter from 'gray-matter';\nimport type {\n IDE,\n ContentType,\n ContextItem,\n IDEContext,\n ProjectContext,\n ContextStats,\n} from '../types/context.types.js';\nimport { IDE_CONFIGS, getAllIDEs } from '../constants/ide-configs.js';\n\n/**\n * Service for scanning and parsing context files\n */\nexport class ContextScannerService {\n private projectPath: string;\n\n constructor(projectPath: string = process.cwd()) {\n this.projectPath = projectPath;\n }\n\n /**\n * Scan all IDEs for context\n */\n async scanAll(): Promise<ProjectContext> {\n const ides = await this.detectIDEs();\n const ideContexts: IDEContext[] = [];\n\n for (const ide of ides) {\n try {\n const context = await this.scanIDE(ide);\n if (context.items.length > 0) {\n ideContexts.push(context);\n }\n } catch (error) {\n // Skip IDEs that fail to scan\n console.error(`Failed to scan ${ide}:`, error);\n }\n }\n\n const totalItems = ideContexts.reduce((sum, ctx) => sum + ctx.items.length, 0);\n\n return {\n projectPath: this.projectPath,\n ides: ideContexts,\n totalItems,\n scanTime: new Date(),\n };\n }\n\n /**\n * Scan specific IDE\n */\n async scanIDE(ide: IDE): Promise<IDEContext> {\n const config = IDE_CONFIGS[ide];\n const items: ContextItem[] = [];\n\n // Scan each content type\n for (const [type, relativePath] of Object.entries(config.contentPaths)) {\n if (!relativePath) continue;\n\n const contentType = type as ContentType;\n try {\n const typeItems = await this.scanType(ide, contentType);\n items.push(...typeItems);\n } catch (error) {\n // Skip types that fail to scan (directory doesn't exist, etc.)\n }\n }\n\n const stats = this.calculateStats(items);\n\n return {\n ide,\n config,\n items,\n stats,\n scanTime: new Date(),\n };\n }\n\n /**\n * Scan specific content type\n */\n async scanType(ide: IDE, type: ContentType): Promise<ContextItem[]> {\n const config = IDE_CONFIGS[ide];\n const relativePath = config.contentPaths[type];\n if (!relativePath) return [];\n\n let dirPath: string;\n\n // For jai1, check both .jai1 and packages/jai1-framework\n if (ide === 'jai1') {\n const jai1Path = path.join(this.projectPath, '.jai1', relativePath);\n const frameworkPath = path.join(this.projectPath, 'packages/jai1-framework', relativePath);\n\n // Use whichever path exists\n if (await this.pathExists(jai1Path)) {\n dirPath = jai1Path;\n } else if (await this.pathExists(frameworkPath)) {\n dirPath = frameworkPath;\n } else {\n return [];\n }\n } else {\n dirPath = path.join(this.projectPath, config.basePath, relativePath);\n\n // Check if directory exists\n try {\n await fs.access(dirPath);\n } catch {\n return [];\n }\n }\n\n const extensions = config.fileExtensions[type] || [];\n const items: ContextItem[] = [];\n\n // Special handling for skills (folders with SKILL.md)\n if (type === 'skills') {\n const skillItems = await this.scanSkills(dirPath, ide);\n items.push(...skillItems);\n } else {\n // Regular files\n const files = await fs.readdir(dirPath);\n\n for (const file of files) {\n const filepath = path.join(dirPath, file);\n const stat = await fs.stat(filepath);\n\n if (!stat.isFile()) continue;\n\n // Check if file matches extensions\n const matchesExtension = extensions.some(ext => file.endsWith(ext));\n if (!matchesExtension) continue;\n\n try {\n const item = await this.parseContextItem(filepath, ide, type);\n items.push(item);\n } catch (error) {\n console.error(`Failed to parse ${filepath}:`, error);\n }\n }\n }\n\n return items;\n }\n\n /**\n * Scan skills (folders with SKILL.md)\n */\n private async scanSkills(skillsDir: string, ide: IDE): Promise<ContextItem[]> {\n const items: ContextItem[] = [];\n\n try {\n const entries = await fs.readdir(skillsDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n\n const skillPath = path.join(skillsDir, entry.name);\n const skillFilePath = path.join(skillPath, 'SKILL.md');\n\n // Check if SKILL.md exists\n try {\n await fs.access(skillFilePath);\n } catch {\n continue;\n }\n\n // Parse SKILL.md\n const item = await this.parseContextItem(skillFilePath, ide, 'skills');\n\n // Check for additional folders\n item.hasScripts = await this.pathExists(path.join(skillPath, 'scripts'));\n item.hasReferences = await this.pathExists(path.join(skillPath, 'references'));\n item.hasAssets = await this.pathExists(path.join(skillPath, 'assets'));\n\n items.push(item);\n }\n } catch (error) {\n console.error(`Failed to scan skills:`, error);\n }\n\n return items;\n }\n\n /**\n * Parse a context item from file\n */\n private async parseContextItem(\n filepath: string,\n ide: IDE,\n type: ContentType\n ): Promise<ContextItem> {\n const content = await fs.readFile(filepath, 'utf-8');\n const stat = await fs.stat(filepath);\n\n // Parse frontmatter\n let frontmatter: Record<string, unknown> = {};\n let bodyContent: string = content;\n try {\n const parsed = matter(content);\n frontmatter = parsed.data;\n bodyContent = parsed.content;\n } catch (e) {\n // If YAML parsing fails, treat as no frontmatter\n console.warn(`โš ๏ธ Invalid YAML frontmatter in ${filepath}, skipping frontmatter parsing`);\n }\n\n // Extract description\n const config = IDE_CONFIGS[ide];\n const description = frontmatter[config.frontmatterSchema.descriptionField] as string | undefined;\n\n // Extract globs/trigger info\n let globs: string[] | undefined;\n let alwaysApply: boolean | undefined;\n\n if (config.frontmatterSchema.alwaysApplyField) {\n const alwaysField = frontmatter[config.frontmatterSchema.alwaysApplyField];\n alwaysApply = alwaysField === true || alwaysField === 'always' || alwaysField === 'always_on';\n }\n\n const triggerValue = frontmatter[config.frontmatterSchema.triggerField];\n if (typeof triggerValue === 'string') {\n globs = [triggerValue];\n } else if (Array.isArray(triggerValue)) {\n globs = triggerValue;\n }\n\n // Extract preview lines\n const { previewLines, lineCount } = this.extractPreview(bodyContent, 20);\n\n // Generate ID\n const relativePath = path.relative(this.projectPath, filepath);\n const id = `${ide}-${type}-${path.basename(filepath, path.extname(filepath))}`;\n\n // Extract name\n const name = frontmatter.name || path.basename(filepath, path.extname(filepath));\n\n return {\n id,\n ide,\n type,\n name,\n filepath,\n relativePath,\n frontmatter,\n description,\n globs,\n alwaysApply,\n model: frontmatter.model as string | undefined,\n fileSize: stat.size,\n modifiedAt: stat.mtime,\n previewLines,\n lineCount,\n };\n }\n\n /**\n * Extract preview lines (after frontmatter)\n */\n private extractPreview(content: string, maxLines: number = 20): { previewLines: string[]; lineCount: number } {\n const lines = content.split('\\n');\n const previewLines = lines.slice(0, maxLines);\n const lineCount = lines.length;\n\n return { previewLines, lineCount };\n }\n\n /**\n * Detect available IDEs in project\n */\n async detectIDEs(): Promise<IDE[]> {\n const ides: IDE[] = [];\n\n for (const ide of getAllIDEs()) {\n const config = IDE_CONFIGS[ide];\n\n // For jai1, check both .jai1 and packages/jai1-framework\n if (ide === 'jai1') {\n const jai1Path = path.join(this.projectPath, '.jai1');\n const frameworkPath = path.join(this.projectPath, 'packages/jai1-framework');\n\n if (await this.pathExists(jai1Path) || await this.pathExists(frameworkPath)) {\n ides.push(ide);\n }\n } else {\n const idePath = path.join(this.projectPath, config.basePath);\n if (await this.pathExists(idePath)) {\n ides.push(ide);\n }\n }\n }\n\n return ides;\n }\n\n /**\n * Check if path exists\n */\n private async pathExists(filepath: string): Promise<boolean> {\n try {\n await fs.access(filepath);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Calculate statistics from items\n */\n private calculateStats(items: ContextItem[]): ContextStats {\n const byType: Partial<Record<ContentType, number>> = {};\n\n for (const item of items) {\n byType[item.type] = (byType[item.type] || 0) + 1;\n }\n\n const totalSize = items.reduce((sum, item) => sum + item.fileSize, 0);\n\n const lastModified = items.length > 0\n ? items.reduce((latest, item) =>\n item.modifiedAt > latest ? item.modifiedAt : latest,\n items[0]!.modifiedAt\n )\n : null;\n\n return {\n totalItems: items.length,\n byType,\n totalSize,\n lastModified,\n };\n }\n}\n","import type { IDE, IDEConfig } from '../types/context.types.js';\n\n/**\n * IDE configurations for context scanning\n */\nexport const IDE_CONFIGS: Record<IDE, IDEConfig> = {\n cursor: {\n id: 'cursor',\n name: 'Cursor',\n icon: '๐Ÿ”ฎ',\n basePath: '.cursor',\n contentPaths: {\n rules: 'rules',\n workflows: 'commands', // Cursor uses \"commands\" for workflows\n },\n fileExtensions: {\n rules: ['.mdc'], // Cursor-specific markdown\n workflows: ['.md'],\n },\n frontmatterSchema: {\n triggerField: 'globs',\n alwaysApplyField: 'alwaysApply',\n descriptionField: 'description',\n },\n },\n windsurf: {\n id: 'windsurf',\n name: 'Windsurf',\n icon: '๐Ÿ„',\n basePath: '.windsurf',\n contentPaths: {\n rules: 'rules',\n workflows: 'workflows',\n },\n fileExtensions: {\n rules: ['.md'],\n workflows: ['.md'],\n },\n frontmatterSchema: {\n triggerField: 'trigger',\n alwaysApplyField: 'trigger', // Value: 'always'\n descriptionField: 'description',\n },\n },\n antigravity: {\n id: 'antigravity',\n name: 'Antigravity',\n icon: '๐Ÿš€',\n basePath: '.agent',\n contentPaths: {\n rules: 'rules',\n workflows: 'workflows',\n },\n fileExtensions: {\n rules: ['.md'],\n workflows: ['.md'],\n },\n frontmatterSchema: {\n triggerField: 'trigger',\n alwaysApplyField: 'trigger', // Value: 'always_on'\n descriptionField: 'description',\n },\n },\n jai1: {\n id: 'jai1',\n name: 'Jai1 Framework',\n icon: '๐Ÿค–',\n basePath: '.jai1', // Or packages/jai1-framework\n contentPaths: {\n rules: 'rules',\n workflows: 'workflows',\n skills: 'skills', // Folders with SKILL.md\n agents: 'agents',\n prompts: 'prompts',\n context: 'context',\n },\n fileExtensions: {\n rules: ['.md'],\n workflows: ['.md'],\n skills: ['SKILL.md'], // Special handling for skill folders\n agents: ['.md'],\n prompts: ['.md'],\n context: ['.md'],\n },\n frontmatterSchema: {\n triggerField: 'globs',\n alwaysApplyField: 'alwaysApply',\n descriptionField: 'description',\n },\n },\n};\n\n/**\n * Get IDE config by ID\n */\nexport function getIDEConfig(ide: IDE): IDEConfig {\n return IDE_CONFIGS[ide];\n}\n\n/**\n * Get all IDE IDs\n */\nexport function getAllIDEs(): IDE[] {\n return Object.keys(IDE_CONFIGS) as IDE[];\n}\n","/**\n * IDE Setup Subcommand\n * Configure IDE settings (VSCode optimizations, etc.)\n * \n * This is a wrapper that re-exports the existing vscode command\n * but as a subcommand under 'ide setup'\n */\nimport { Command } from 'commander';\nimport { checkbox, confirm, select } from '@inquirer/prompts';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { existsSync } from 'node:fs';\nimport { selectTheme, checkboxTheme } from '../../utils/prompt-theme.js';\n\n// Performance Groups Definition\ninterface SettingsGroup {\n name: string;\n description: string;\n settings: Record<string, unknown>;\n}\n\nconst PERFORMANCE_GROUPS: Record<string, SettingsGroup> = {\n telemetry: {\n name: 'Telemetry',\n description: 'Disable all telemetry and data collection',\n settings: {\n \"telemetry.telemetryLevel\": \"off\",\n \"telemetry.feedback.enabled\": false,\n \"workbench.enableExperiments\": false,\n \"workbench.settings.enableNaturalLanguageSearch\": false,\n }\n },\n languageServers: {\n name: 'Language Servers',\n description: 'Disable/reduce language server load (tsserver, eslint...)',\n settings: {\n // TypeScript\n \"typescript.tsserver.experimental.enableProjectDiagnostics\": false,\n \"typescript.disableAutomaticTypeAcquisition\": true,\n \"typescript.tsserver.maxTsServerMemory\": 2048,\n \"typescript.surveys.enabled\": false,\n // JavaScript\n \"js/ts.implicitProjectConfig.strictNullChecks\": false,\n // ESLint\n \"eslint.enable\": false,\n // Prettier\n \"prettier.enable\": false,\n // CSS/HTML\n \"css.validate\": false,\n \"html.validate.scripts\": false,\n \"html.validate.styles\": false,\n // JSON\n \"json.schemaDownload.enable\": false,\n }\n },\n git: {\n name: 'Git Integration',\n description: 'Disable built-in Git for better performance',\n settings: {\n \"git.enabled\": false,\n \"git.autoRepositoryDetection\": false,\n \"git.decorations.enabled\": false,\n \"git.path\": null,\n \"scm.diffDecorations\": \"none\",\n }\n },\n fileWatcher: {\n name: 'File Watcher',\n description: 'Exclude directories from file watcher',\n settings: {\n \"files.watcherExclude\": {\n \"**/node_modules/**\": true,\n \"**/.git/**\": true,\n \"**/vendor/**\": true,\n \"**/dist/**\": true,\n \"**/build/**\": true,\n \"**/.next/**\": true,\n \"**/out/**\": true,\n \"**/.nuxt/**\": true,\n \"**/.cache/**\": true,\n \"**/coverage/**\": true,\n },\n \"files.exclude\": {\n \"**/.git\": true,\n \"**/.DS_Store\": true,\n \"**/node_modules\": false, // Keep visible but don't watch\n }\n }\n },\n search: {\n name: 'Search',\n description: 'Exclude directories from search',\n settings: {\n \"search.exclude\": {\n \"**/node_modules\": true,\n \"**/bower_components\": true,\n \"**/*.code-search\": true,\n \"**/dist\": true,\n \"**/build\": true,\n \"**/out\": true,\n \"**/.next\": true,\n \"**/.nuxt\": true,\n \"**/coverage\": true,\n \"**/.cache\": true,\n },\n \"search.followSymlinks\": false,\n }\n },\n extensions: {\n name: 'Extensions',\n description: 'Disable auto-update extensions',\n settings: {\n \"extensions.autoUpdate\": false,\n \"extensions.autoCheckUpdates\": false,\n \"update.mode\": \"manual\",\n \"extensions.ignoreRecommendations\": true,\n }\n },\n editorRendering: {\n name: 'Editor Rendering',\n description: 'Optimize rendering (minimap, whitespace, highlights...)',\n settings: {\n \"editor.minimap.enabled\": false,\n \"editor.renderWhitespace\": \"none\",\n \"editor.renderControlCharacters\": false,\n \"editor.renderLineHighlight\": \"none\",\n \"editor.cursorBlinking\": \"solid\",\n \"editor.smoothScrolling\": false,\n \"editor.largeFileOptimizations\": true,\n \"editor.maxTokenizationLineLength\": 2000,\n \"editor.quickSuggestions\": {\n \"other\": true,\n \"comments\": false,\n \"strings\": false\n },\n \"editor.suggest.showStatusBar\": false,\n \"editor.hover.delay\": 500,\n \"editor.matchBrackets\": \"never\",\n }\n },\n uiElements: {\n name: 'UI Elements',\n description: 'Hide unnecessary UI elements',\n settings: {\n \"workbench.activityBar.visible\": false,\n \"workbench.statusBar.visible\": false,\n \"breadcrumbs.enabled\": false,\n \"window.menuBarVisibility\": \"compact\",\n \"workbench.editor.showTabs\": true, // Keep tabs for navigation\n \"workbench.startupEditor\": \"none\",\n }\n }\n};\n\n/**\n * Create setup subcommand for IDE group\n * Manages IDE settings (VSCode optimizations)\n */\nexport function createSetupSubcommand(): Command {\n const setupCommand = new Command('setup')\n .description('Configure IDE settings and optimizations');\n\n // Interactive mode (default)\n setupCommand.action(async () => {\n await interactiveMode();\n });\n\n // Enable subcommand\n setupCommand\n .command('enable')\n .description('Enable specific optimization groups')\n .argument('[groups...]', 'Group names to enable (telemetry, languageServers, git, ...)')\n .action(async (groups: string[]) => {\n if (groups.length === 0) {\n await selectGroupsToApply('enable');\n } else {\n await applyGroups(groups, 'enable');\n }\n });\n\n // Disable subcommand\n setupCommand\n .command('disable')\n .description('Disable specific optimization groups (restore to default)')\n .argument('[groups...]', 'Group names to disable')\n .action(async (groups: string[]) => {\n if (groups.length === 0) {\n await selectGroupsToApply('disable');\n } else {\n await applyGroups(groups, 'disable');\n }\n });\n\n // Max performance preset\n setupCommand\n .command('max-performance')\n .description('Enable all optimizations for maximum performance')\n .action(async () => {\n const allGroups = Object.keys(PERFORMANCE_GROUPS);\n await applyGroups(allGroups, 'enable');\n });\n\n // Reset subcommand\n setupCommand\n .command('reset')\n .description('Reset to default settings (remove all optimizations)')\n .argument('[groups...]', 'Group names to reset (empty = reset all)')\n .action(async (groups: string[]) => {\n await resetSettings(groups);\n });\n\n // List subcommand\n setupCommand\n .command('list')\n .description('List all available optimization groups')\n .action(() => {\n console.log('๐Ÿ”ง Available optimization groups:\\n');\n Object.entries(PERFORMANCE_GROUPS).forEach(([key, group]) => {\n console.log(` ${key.padEnd(20)} - ${group.name}`);\n console.log(` ${' '.repeat(20)} ${group.description}`);\n console.log();\n });\n });\n\n return setupCommand;\n}\n\nasync function interactiveMode() {\n console.log('๐Ÿ”ง IDE Settings Manager\\n');\n console.log('โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ');\n console.log('โ”‚ ๐Ÿ“Œ Usage: โ”‚');\n console.log('โ”‚ โ€ข Use โ†‘โ†“ keys to navigate โ”‚');\n console.log('โ”‚ โ€ข Press SPACE to select/deselect group โ”‚');\n console.log('โ”‚ โ€ข Press ENTER to confirm and apply โ”‚');\n console.log('โ”‚ โ€ข Press Ctrl+C to cancel โ”‚');\n console.log('โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ\\n');\n\n const action = await select({\n message: 'What do you want to do?',\n choices: [\n { name: 'โœ… Enable optimization groups', value: 'enable' },\n { name: 'โŒ Disable optimization groups', value: 'disable' },\n { name: '๐Ÿš€ Max Performance (enable all)', value: 'max' },\n { name: '๐Ÿ”„ Reset to defaults', value: 'reset' },\n ],\n theme: selectTheme,\n });\n\n if (action === 'max') {\n const allGroups = Object.keys(PERFORMANCE_GROUPS);\n await applyGroups(allGroups, 'enable');\n } else if (action === 'reset') {\n await resetSettings([]);\n } else {\n await selectGroupsToApply(action as 'enable' | 'disable');\n }\n}\n\nasync function selectGroupsToApply(action: 'enable' | 'disable') {\n const choices = Object.entries(PERFORMANCE_GROUPS).map(([key, group]) => ({\n name: `${group.name} - ${group.description}`,\n value: key,\n }));\n\n try {\n const selectedGroups = await checkbox({\n message: `Select groups to ${action} (SPACE to select, ENTER to confirm):`,\n choices,\n theme: checkboxTheme,\n });\n\n if (selectedGroups.length === 0) {\n console.log('\\nโš ๏ธ No groups selected!');\n console.log(' ๐Ÿ’ก Tip: Press SPACE to select at least 1 group before pressing ENTER.');\n return;\n }\n\n await applyGroups(selectedGroups, action);\n } catch {\n console.log('\\nโŒ Operation cancelled.');\n }\n}\n\nasync function applyGroups(groupKeys: string[], action: 'enable' | 'disable') {\n const vscodeDir = path.join(process.cwd(), '.vscode');\n const settingsPath = path.join(vscodeDir, 'settings.json');\n\n // Validate group keys\n const invalidGroups = groupKeys.filter(key => !PERFORMANCE_GROUPS[key]);\n if (invalidGroups.length > 0) {\n console.log(`\\nโŒ Invalid groups: ${invalidGroups.join(', ')}`);\n console.log(' ๐Ÿ’ก Run \"jai1 ide setup list\" to see available groups.');\n return;\n }\n\n // Ensure .vscode directory exists\n if (!existsSync(vscodeDir)) {\n await fs.mkdir(vscodeDir, { recursive: true });\n console.log('๐Ÿ“ Created .vscode/ directory');\n }\n\n // Read existing settings\n let currentSettings: Record<string, unknown> = {};\n if (existsSync(settingsPath)) {\n try {\n const content = await fs.readFile(settingsPath, 'utf-8');\n currentSettings = JSON.parse(content);\n console.log('๐Ÿ“„ Read current settings from settings.json');\n } catch {\n console.warn('โš ๏ธ Cannot read settings.json (may contain comments).');\n const confirmOverwrite = await confirm({\n message: 'Overwrite current settings.json file?',\n default: false\n });\n\n if (!confirmOverwrite) {\n console.log('โŒ Operation cancelled.');\n return;\n }\n currentSettings = {};\n }\n }\n\n // Apply or remove settings\n const newSettings = { ...currentSettings };\n\n console.log(`\\n๐Ÿ“ ${action === 'enable' ? 'Enabling' : 'Disabling'} groups:\\n`);\n\n for (const key of groupKeys) {\n const group = PERFORMANCE_GROUPS[key];\n console.log(` ${action === 'enable' ? 'โœ“' : 'โœ—'} ${group.name}`);\n\n if (action === 'enable') {\n // Merge settings\n for (const [settingKey, settingValue] of Object.entries(group.settings)) {\n if (typeof settingValue === 'object' && settingValue !== null && !Array.isArray(settingValue) &&\n typeof newSettings[settingKey] === 'object' && newSettings[settingKey] !== null) {\n newSettings[settingKey] = {\n ...(newSettings[settingKey] as Record<string, unknown>),\n ...settingValue\n };\n } else {\n newSettings[settingKey] = settingValue;\n }\n }\n } else {\n // Remove settings (disable)\n for (const settingKey of Object.keys(group.settings)) {\n delete newSettings[settingKey];\n }\n }\n }\n\n // Write back\n await fs.writeFile(settingsPath, JSON.stringify(newSettings, null, 2));\n console.log(`\\nโœ… Updated IDE settings at: ${settingsPath}`);\n console.log('๐Ÿ’ก Tip: Restart your IDE to apply changes.');\n}\n\nasync function resetSettings(groupKeys: string[]) {\n const vscodeDir = path.join(process.cwd(), '.vscode');\n const settingsPath = path.join(vscodeDir, 'settings.json');\n\n if (!existsSync(settingsPath)) {\n console.log('\\nโš ๏ธ No settings.json file found');\n return;\n }\n\n const confirmReset = await confirm({\n message: groupKeys.length === 0\n ? 'Reset ALL settings to default (delete entire file)?'\n : `Reset groups: ${groupKeys.join(', ')}?`,\n default: false\n });\n\n if (!confirmReset) {\n console.log('โŒ Operation cancelled.');\n return;\n }\n\n if (groupKeys.length === 0) {\n // Reset all - delete file\n await fs.unlink(settingsPath);\n console.log('\\nโœ… Deleted settings.json file');\n } else {\n // Reset specific groups\n await applyGroups(groupKeys, 'disable');\n }\n\n console.log('๐Ÿ’ก Tip: Restart your IDE to apply changes.');\n}\n","/**\n * Shared prompt theme utilities for @inquirer/prompts\n * Adds \"Ctrl+C quit\" to help line for all interactive prompts\n */\n\n/**\n * Custom keysHelpTip that appends \"Ctrl+C quit\" to the help line\n */\nexport const keysHelpTipWithQuit = (keys: [key: string, action: string][]): string => {\n const keyStrings = keys.map(([key, action]) => `${key} ${action}`);\n keyStrings.push('Ctrl+C quit');\n return keyStrings.join(' โ€ข ');\n};\n\n/**\n * Theme configuration for checkbox prompts with Ctrl+C quit hint\n */\nexport const checkboxTheme = {\n style: {\n keysHelpTip: keysHelpTipWithQuit,\n },\n};\n\n/**\n * Theme configuration for select prompts with Ctrl+C quit hint\n */\nexport const selectTheme = {\n style: {\n keysHelpTip: keysHelpTipWithQuit,\n },\n};\n","/**\n * IDE Sync Subcommand\n * Sync .jai1 content to IDE directories (rules, workflows, commands)\n */\nimport { Command } from 'commander';\nimport { checkbox, confirm } from '@inquirer/prompts';\nimport type { MigrateIDE, MigrateContentType } from '../../types/migrate-ide.types.js';\nimport { MigrateIdeService } from '../../services/migrate-ide.service.js';\nimport { IDE_MIGRATION_CONFIGS, getMigrationIDEs } from '../../constants/ide-migration-configs.js';\nimport { checkboxTheme } from '../../utils/prompt-theme.js';\n\n/**\n * Create sync subcommand for IDE group\n * Syncs .jai1 content to IDE-specific directories\n */\nexport function createSyncSubcommand(): Command {\n const cmd = new Command('sync')\n .description('Sync .jai1 content to IDE directories (Cursor, Windsurf, Claude Code, etc.)')\n .option('--ide <ides...>', 'Target IDEs (cursor, windsurf, antigravity, claudecode, opencode)')\n .option('--type <types...>', 'Content types (rules, workflows, commands)')\n .option('--dry-run', 'Preview changes without writing files')\n .action(async (options: {\n ide?: string[];\n type?: string[];\n dryRun?: boolean;\n }) => {\n await runSync(options);\n });\n\n return cmd;\n}\n\nasync function runSync(options: {\n ide?: string[];\n type?: string[];\n dryRun?: boolean;\n}) {\n const service = new MigrateIdeService();\n\n console.log('\\n๐Ÿ”„ Sync rules and workflows to IDE(s)\\n');\n\n // Scan .jai1 content\n console.log('๐Ÿ“ Scanning .jai1/ directory...');\n console.log(' โ€ข .jai1/rule-preset/ (active rule preset)');\n console.log(' โ€ข .jai1/rules/ (manual rules)');\n console.log(' โ€ข .jai1/workflows/\\n');\n\n const content = await service.scanJai1Content();\n\n if (content.totalCount === 0) {\n console.log('โš ๏ธ No content found in .jai1/');\n console.log(' ๐Ÿ’ก Run \"jai1 rules apply\" to apply a rule preset, or');\n console.log(' ๐Ÿ’ก Create files in .jai1/rules/ or .jai1/workflows/\\n');\n process.exit(1);\n }\n\n console.log(`โœ“ Found: ${content.rules.length} rules, ${content.workflows.length} workflows\\n`);\n\n // Select IDEs\n let selectedIdes: MigrateIDE[];\n if (options.ide && options.ide.length > 0) {\n selectedIdes = options.ide as MigrateIDE[];\n } else {\n const ideChoices = getMigrationIDEs().map(ide => {\n const config = IDE_MIGRATION_CONFIGS[ide];\n return {\n name: `${config.icon} ${config.name}`,\n value: ide,\n };\n });\n\n selectedIdes = await checkbox({\n message: 'Select target IDE(s) (SPACE to select, ENTER to confirm):',\n choices: ideChoices,\n theme: checkboxTheme,\n });\n\n if (selectedIdes.length === 0) {\n console.log('\\nโš ๏ธ No IDE selected!');\n console.log(' ๐Ÿ’ก Select at least 1 IDE.\\n');\n process.exit(0);\n }\n }\n\n // Select content types\n let selectedTypes: MigrateContentType[];\n if (options.type && options.type.length > 0) {\n selectedTypes = options.type as MigrateContentType[];\n } else {\n const typeChoices = [\n { name: `Rules (${content.rules.length} files)`, value: 'rules' as MigrateContentType },\n { name: `Workflows (${content.workflows.length} files)`, value: 'workflows' as MigrateContentType },\n { name: `Commands (${content.commands.length} files)`, value: 'commands' as MigrateContentType },\n ];\n\n selectedTypes = await checkbox({\n message: 'Select content types to sync:',\n choices: typeChoices,\n theme: checkboxTheme,\n });\n\n if (selectedTypes.length === 0) {\n console.log('\\nโš ๏ธ No content type selected!');\n console.log(' ๐Ÿ’ก Select at least 1 content type.\\n');\n process.exit(0);\n }\n }\n\n // Calculate total files\n const totalItems = selectedTypes.reduce((sum, type) => {\n return sum + (type === 'rules' ? content.rules.length :\n type === 'workflows' ? content.workflows.length :\n content.commands.length);\n }, 0);\n const totalFiles = totalItems * selectedIdes.length;\n\n // Preview\n console.log('\\n๐Ÿ“Š Preview:\\n');\n console.log(` IDEs: ${selectedIdes.map(ide => IDE_MIGRATION_CONFIGS[ide].name).join(', ')}`);\n console.log(` Content types: ${selectedTypes.join(', ')}`);\n console.log(` Will create/update: ${totalFiles} stub files\\n`);\n\n if (options.dryRun) {\n console.log('๐Ÿ” DRY RUN - No files will be written\\n');\n }\n\n // Confirm\n const confirmed = await confirm({\n message: 'Proceed with sync?',\n default: true,\n });\n\n if (!confirmed) {\n console.log('\\nโŒ Sync cancelled.\\n');\n process.exit(0);\n }\n\n // Migrate\n console.log('\\n๐Ÿ”„ Syncing...\\n');\n let completed = 0;\n\n const results = await service.migrate(\n selectedIdes,\n selectedTypes,\n content,\n (result) => {\n completed++;\n const icon = result.status === 'created' ? 'โœ“' :\n result.status === 'updated' ? 'โ†ป' :\n result.status === 'error' ? 'โœ—' : 'โ—‹';\n\n const percentage = Math.round((completed / totalFiles) * 100);\n console.log(` ${icon} [${percentage}%] ${result.targetPath}`);\n\n if (result.status === 'error' && result.error) {\n console.log(` Error: ${result.error}`);\n }\n }\n );\n\n // Summary\n const created = results.filter(r => r.status === 'created').length;\n const updated = results.filter(r => r.status === 'updated').length;\n const skipped = results.filter(r => r.status === 'skipped').length;\n const errors = results.filter(r => r.status === 'error').length;\n\n console.log('\\nโœ… Sync complete!\\n');\n console.log(` Created: ${created}`);\n console.log(` Updated: ${updated}`);\n if (skipped > 0) console.log(` Skipped: ${skipped}`);\n if (errors > 0) console.log(` Errors: ${errors}`);\n console.log('');\n}\n","/**\n * IDE Status Subcommand\n * Show detected IDEs and their configuration status\n */\nimport { Command } from 'commander';\nimport { IdeDetectionService } from '../../services/ide-detection.service.js';\n\n/**\n * Create status subcommand for IDE group\n * Shows which IDEs are detected and configured\n */\nexport function createStatusSubcommand(): Command {\n const cmd = new Command('status')\n .description('Show detected IDEs and their configuration status')\n .option('--json', 'Output as JSON')\n .option('--suggestions', 'Show IDE suggestions based on project structure')\n .action(async (options: {\n json?: boolean;\n suggestions?: boolean;\n }) => {\n await runStatus(options);\n });\n\n return cmd;\n}\n\nasync function runStatus(options: { json?: boolean; suggestions?: boolean }) {\n const service = new IdeDetectionService();\n\n if (options.json) {\n const summary = await service.getSummary();\n console.log(JSON.stringify(summary, null, 2));\n return;\n }\n\n console.log('\\n๐Ÿ” IDE Detection Status\\n');\n\n const summary = await service.getSummary();\n\n if (summary.active.length === 0) {\n console.log('โš ๏ธ No active IDEs detected\\n');\n console.log('๐Ÿ’ก Tips:');\n console.log(' โ€ข Run \"jai1 rules apply\" to configure IDE rules');\n console.log(' โ€ข Create rules in .cursor/rules/, .windsurf/rules/, etc.');\n console.log(' โ€ข Create AGENTS.md for universal IDE support\\n');\n } else {\n console.log(`๐Ÿ“Š Found ${summary.active.length} active IDE(s):\\n`);\n\n // Show primary IDE\n if (summary.primary) {\n const confidence = getConfidenceEmoji(summary.primary.confidence);\n console.log(`๐ŸŽฏ Primary IDE: ${summary.primary.name} ${confidence}\\n`);\n }\n\n // Show all active IDEs\n for (const ide of summary.active) {\n const confidence = getConfidenceEmoji(ide.confidence);\n const isPrimary = summary.primary?.id === ide.id;\n const marker = isPrimary ? '๐ŸŽฏ' : ' ';\n\n console.log(`${marker} ${ide.name} ${confidence}`);\n\n if (ide.hasRules) {\n console.log(` Rules: ${ide.ruleCount} file(s)`);\n }\n\n if (ide.hasWorkflows) {\n console.log(` Workflows: ${ide.workflowCount} file(s)`);\n }\n\n const format = service.getIdeFormat(ide.id);\n if (format) {\n if (ide.id === 'agentsmd') {\n console.log(` Location: AGENTS.md`);\n } else if (ide.id === 'gemini') {\n console.log(` Location: GEMINI.md`);\n } else if (ide.id === 'opencode') {\n console.log(` Location: AGENTS.md + .opencode/command/`);\n } else {\n console.log(` Location: ${format.rulesPath}/`);\n }\n }\n console.log('');\n }\n }\n\n // Show inactive IDEs\n if (summary.inactive.length > 0) {\n console.log(`๐Ÿ“‹ Available IDEs (not configured):\\n`);\n for (const ideId of summary.inactive) {\n const format = service.getIdeFormat(ideId);\n if (format) {\n console.log(` โ€ข ${format.name} - ${format.description}`);\n }\n }\n console.log('');\n }\n\n // Show suggestions\n if (options.suggestions) {\n const suggestions = await service.suggestIdes();\n\n if (suggestions.length > 0) {\n console.log('๐Ÿ’ก Suggested IDEs for this project:\\n');\n\n for (const suggestion of suggestions) {\n const priorityEmoji = suggestion.priority === 'high' ? 'โญ' :\n suggestion.priority === 'medium' ? '๐Ÿ”ธ' : 'โ–ซ๏ธ';\n\n console.log(`${priorityEmoji} ${suggestion.name}`);\n console.log(` Reason: ${suggestion.reason}\\n`);\n }\n }\n }\n\n // Show next steps\n console.log('๐Ÿ“ Commands:\\n');\n console.log(' โ€ข \"jai1 rules apply\" - Configure rules for IDEs');\n console.log(' โ€ข \"jai1 rules sync\" - Regenerate IDE outputs');\n console.log(' โ€ข \"jai1 ide sync\" - Sync .jai1/ content to IDEs');\n console.log(' โ€ข \"jai1 ide status --suggestions\" - Get IDE recommendations\\n');\n}\n\n/**\n * Get emoji for confidence level\n */\nfunction getConfidenceEmoji(confidence: 'high' | 'medium' | 'low'): string {\n switch (confidence) {\n case 'high':\n return '๐ŸŸข';\n case 'medium':\n return '๐ŸŸก';\n case 'low':\n return '๐Ÿ”ด';\n default:\n return 'โšช';\n }\n}\n","/**\n * IDE Detection Service\n *\n * Automatically detects which IDEs are active in the current project\n * based on the presence of IDE-specific directories and files.\n */\n\nimport { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { IDE_FORMATS, type IdeFormat } from '../config/ide-formats.js';\n\nexport interface DetectedIDE {\n id: string;\n name: string;\n detected: boolean;\n hasRules: boolean;\n hasWorkflows: boolean;\n ruleCount: number;\n workflowCount: number;\n confidence: 'high' | 'medium' | 'low';\n}\n\nexport class IdeDetectionService {\n private projectPath: string;\n\n constructor(projectPath: string = process.cwd()) {\n this.projectPath = projectPath;\n }\n\n /**\n * Detect all active IDEs in the project\n */\n async detectActiveIdes(): Promise<DetectedIDE[]> {\n const detected: DetectedIDE[] = [];\n\n for (const [ideId, format] of Object.entries(IDE_FORMATS)) {\n const detection = await this.detectIde(ideId, format);\n detected.push(detection);\n }\n\n return detected.filter((d) => d.detected);\n }\n\n /**\n * Detect a specific IDE\n */\n async detectIde(ideId: string, format: IdeFormat): Promise<DetectedIDE> {\n const detection: DetectedIDE = {\n id: ideId,\n name: format.name,\n detected: false,\n hasRules: false,\n hasWorkflows: false,\n ruleCount: 0,\n workflowCount: 0,\n confidence: 'low',\n };\n\n // Special handling for AGENTS.md and GEMINI.md\n if (ideId === 'agentsmd') {\n const exists = await this.pathExists('AGENTS.md');\n detection.detected = exists;\n detection.hasRules = exists;\n detection.ruleCount = exists ? 1 : 0;\n detection.confidence = exists ? 'high' : 'low';\n return detection;\n }\n\n if (ideId === 'gemini') {\n const exists = await this.pathExists('GEMINI.md');\n detection.detected = exists;\n detection.hasRules = exists;\n detection.ruleCount = exists ? 1 : 0;\n detection.confidence = exists ? 'high' : 'low';\n return detection;\n }\n\n // Special handling for OpenCode (AGENTS.md + .opencode/command/)\n if (ideId === 'opencode') {\n const hasAgents = await this.pathExists('AGENTS.md');\n const commandPath = join(this.projectPath, '.opencode/command');\n const hasCommands = await this.pathExists(commandPath);\n\n detection.hasRules = hasAgents;\n detection.ruleCount = hasAgents ? 1 : 0;\n\n if (hasCommands) {\n detection.hasWorkflows = true;\n detection.workflowCount = await this.countFiles(commandPath, '.md');\n }\n\n detection.detected = hasAgents || (hasCommands && detection.workflowCount > 0);\n detection.confidence = detection.detected ? (hasAgents && hasCommands ? 'high' : 'medium') : 'low';\n return detection;\n }\n\n // Check for IDE-specific directories\n const rulesPath = join(this.projectPath, format.rulesPath);\n const rulesExist = await this.pathExists(rulesPath);\n\n if (rulesExist) {\n detection.hasRules = true;\n detection.ruleCount = await this.countFiles(rulesPath, format.fileExtension);\n\n if (detection.ruleCount > 0) {\n detection.detected = true;\n }\n }\n\n // Check for workflows if supported\n if (format.workflowsPath) {\n const workflowsPath = join(this.projectPath, format.workflowsPath);\n const workflowsExist = await this.pathExists(workflowsPath);\n\n if (workflowsExist) {\n detection.hasWorkflows = true;\n detection.workflowCount = await this.countFiles(workflowsPath, format.fileExtension);\n\n if (detection.workflowCount > 0) {\n detection.detected = true;\n }\n }\n }\n\n // Determine confidence level\n if (detection.ruleCount > 3 || detection.workflowCount > 0) {\n detection.confidence = 'high';\n } else if (detection.ruleCount > 0) {\n detection.confidence = 'medium';\n }\n\n return detection;\n }\n\n /**\n * Get the most likely active IDE (highest confidence)\n */\n async getPrimaryIde(): Promise<DetectedIDE | null> {\n const active = await this.detectActiveIdes();\n\n if (active.length === 0) {\n return null;\n }\n\n // Sort by confidence and rule count\n active.sort((a, b) => {\n const confidenceScore = { high: 3, medium: 2, low: 1 };\n const aScore = confidenceScore[a.confidence] * 10 + a.ruleCount;\n const bScore = confidenceScore[b.confidence] * 10 + b.ruleCount;\n return bScore - aScore;\n });\n\n return active[0];\n }\n\n /**\n * Get IDE IDs that are active\n */\n async getActiveIdeIds(): Promise<string[]> {\n const active = await this.detectActiveIdes();\n return active.map((d) => d.id);\n }\n\n /**\n * Check if a specific IDE is active\n */\n async isIdeActive(ideId: string): Promise<boolean> {\n const format = IDE_FORMATS[ideId];\n if (!format) {\n return false;\n }\n\n const detection = await this.detectIde(ideId, format);\n return detection.detected;\n }\n\n /**\n * Detect IDEs with existing rule files (for backward compatibility)\n */\n async detectExistingIdes(): Promise<string[]> {\n const detected: string[] = [];\n\n for (const [ideId, format] of Object.entries(IDE_FORMATS)) {\n if (ideId === 'agentsmd') {\n if (await this.pathExists('AGENTS.md')) {\n detected.push(ideId);\n }\n } else if (ideId === 'gemini') {\n if (await this.pathExists('GEMINI.md')) {\n detected.push(ideId);\n }\n } else if (ideId === 'opencode') {\n // OpenCode uses AGENTS.md + .opencode/command/\n const hasAgents = await this.pathExists('AGENTS.md');\n const commandPath = join(this.projectPath, '.opencode/command');\n const hasCommands = await this.pathExists(commandPath);\n if (hasAgents || hasCommands) {\n detected.push(ideId);\n }\n } else {\n const rulesPath = join(this.projectPath, format.rulesPath);\n if (await this.pathExists(rulesPath)) {\n const count = await this.countFiles(rulesPath, format.fileExtension);\n if (count > 0) {\n detected.push(ideId);\n }\n }\n }\n }\n\n return detected;\n }\n\n /**\n * Get detection summary\n */\n async getSummary(): Promise<{\n total: number;\n active: DetectedIDE[];\n inactive: string[];\n primary: DetectedIDE | null;\n }> {\n const all = await Promise.all(\n Object.entries(IDE_FORMATS).map(([ideId, format]) => this.detectIde(ideId, format))\n );\n\n const active = all.filter((d) => d.detected);\n const inactive = all.filter((d) => !d.detected).map((d) => d.id);\n const primary = await this.getPrimaryIde();\n\n return {\n total: all.length,\n active,\n inactive,\n primary,\n };\n }\n\n /**\n * Check if a path exists\n */\n private async pathExists(path: string): Promise<boolean> {\n try {\n await fs.access(path);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Count files with specific extension in a directory\n */\n private async countFiles(dirPath: string, extension: string): Promise<number> {\n try {\n const entries = await fs.readdir(dirPath, { withFileTypes: true });\n return entries.filter((entry) => entry.isFile() && entry.name.endsWith(extension)).length;\n } catch {\n return 0;\n }\n }\n\n /**\n * Get IDE format by ID\n */\n getIdeFormat(ideId: string): IdeFormat | undefined {\n return IDE_FORMATS[ideId];\n }\n\n /**\n * Suggest IDEs to configure based on project structure\n */\n async suggestIdes(): Promise<\n Array<{\n ideId: string;\n name: string;\n reason: string;\n priority: 'high' | 'medium' | 'low';\n }>\n > {\n const suggestions: Array<{\n ideId: string;\n name: string;\n reason: string;\n priority: 'high' | 'medium' | 'low';\n }> = [];\n\n // Check for .vscode - suggest VSCode-based IDEs\n if (await this.pathExists(join(this.projectPath, '.vscode'))) {\n suggestions.push({\n ideId: 'cursor',\n name: 'Cursor',\n reason: 'VSCode configuration detected',\n priority: 'high',\n });\n }\n\n // Check for package.json - web project\n if (await this.pathExists(join(this.projectPath, 'package.json'))) {\n suggestions.push({\n ideId: 'windsurf',\n name: 'Windsurf',\n reason: 'JavaScript/TypeScript project detected',\n priority: 'medium',\n });\n }\n\n // Always suggest AGENTS.md as universal\n suggestions.push({\n ideId: 'agentsmd',\n name: 'AGENTS.md',\n reason: 'Universal format, works with all IDEs',\n priority: 'high',\n });\n\n // Check for existing AI config files\n const hasClaudeConfig = await this.pathExists(join(this.projectPath, '.claude'));\n if (hasClaudeConfig) {\n suggestions.push({\n ideId: 'claude',\n name: 'Claude Code',\n reason: '.claude directory detected',\n priority: 'high',\n });\n }\n\n // Check for .opencode directory\n const hasOpenCodeConfig = await this.pathExists(join(this.projectPath, '.opencode'));\n if (hasOpenCodeConfig) {\n suggestions.push({\n ideId: 'opencode',\n name: 'OpenCode',\n reason: '.opencode directory detected',\n priority: 'high',\n });\n }\n\n return suggestions;\n }\n}\n","/**\n * IDE Format Definitions\n *\n * Defines the configuration for all supported IDE formats\n * including file paths, extensions, and metadata formats.\n */\n\nexport interface IdeFormat {\n id: string;\n name: string;\n description: string;\n rulesPath: string;\n workflowsPath?: string;\n fileExtension: string;\n metadataFormat: 'yaml-frontmatter' | 'none';\n supportsReference: boolean;\n dependencies?: string[];\n}\n\nexport const IDE_FORMATS: Record<string, IdeFormat> = {\n cursor: {\n id: 'cursor',\n name: 'Cursor',\n description: 'Cursor IDE (.cursor/rules/)',\n rulesPath: '.cursor/rules',\n workflowsPath: '.cursor/commands',\n fileExtension: '.mdc',\n metadataFormat: 'yaml-frontmatter',\n supportsReference: true,\n },\n\n windsurf: {\n id: 'windsurf',\n name: 'Windsurf',\n description: 'Windsurf IDE (.windsurf/rules/)',\n rulesPath: '.windsurf/rules',\n workflowsPath: '.windsurf/workflows',\n fileExtension: '.md',\n metadataFormat: 'yaml-frontmatter',\n supportsReference: true,\n },\n\n antigravity: {\n id: 'antigravity',\n name: 'Antigravity',\n description: 'Antigravity IDE (.agent/rules/)',\n rulesPath: '.agent/rules',\n workflowsPath: '.agent/workflows',\n fileExtension: '.md',\n metadataFormat: 'yaml-frontmatter',\n supportsReference: true,\n },\n\n claude: {\n id: 'claude',\n name: 'Claude Code',\n description: 'Claude Code (.claude/rules/)',\n rulesPath: '.claude/rules',\n fileExtension: '.md',\n metadataFormat: 'yaml-frontmatter',\n supportsReference: true,\n },\n\n agentsmd: {\n id: 'agentsmd',\n name: 'AGENTS.md',\n description: 'Single AGENTS.md file',\n rulesPath: '.',\n workflowsPath: undefined,\n fileExtension: '.md',\n metadataFormat: 'none',\n supportsReference: false,\n },\n\n gemini: {\n id: 'gemini',\n name: 'Gemini CLI',\n description: 'Gemini CLI (GEMINI.md)',\n rulesPath: '.',\n fileExtension: '.md',\n metadataFormat: 'none',\n supportsReference: false,\n dependencies: ['agentsmd'], // Gemini requires AGENTS.md\n },\n\n opencode: {\n id: 'opencode',\n name: 'OpenCode',\n description: 'OpenCode (AGENTS.md + .opencode/command/)',\n rulesPath: '.', // Uses AGENTS.md\n workflowsPath: '.opencode/command',\n fileExtension: '.md',\n metadataFormat: 'yaml-frontmatter',\n supportsReference: true,\n dependencies: ['agentsmd'], // OpenCode requires AGENTS.md for rules\n },\n};\n\n/**\n * Base jai1 rule content that is included in all outputs\n */\nexport const JAI1_BASE_RULE = `# Jai1 Framework Agent\n\nYou are an AI coding assistant integrated with the Jai1 Framework.\n\n## Skills Reference\n\nThe Jai1 Framework provides specialized skills that you can reference and apply:\n\n### Pattern Detection\n\nWhen you encounter:\n- **Component creation**: Reference \\`@jai1-component-patterns\\`\n- **API development**: Reference \\`@jai1-api-patterns\\`\n- **Database operations**: Reference \\`@jai1-database-patterns\\`\n- **Testing**: Reference \\`@jai1-testing-patterns\\`\n- **Deployment**: Reference \\`@jai1-deployment-patterns\\`\n\n### Skill Loading Procedure\n\n1. **Detect the task type** from user request\n2. **Load relevant skill** using \\`@jai1-[skill-name]\\` syntax\n3. **Apply patterns** from the skill to your response\n4. **Follow conventions** defined in the skill\n\nExample:\n\\`\\`\\`\nUser: \"Create a new API endpoint for users\"\nAssistant:\n1. Loading @jai1-api-patterns\n2. Applying RESTful conventions\n3. Following project structure from @jai1-component-patterns\n4. Implementing validation using @jai1-testing-patterns\n\\`\\`\\`\n\n### Application\n\n- **Always reference skills** before implementing patterns\n- **Follow naming conventions** from loaded skills\n- **Apply best practices** defined in skills\n- **Maintain consistency** with existing codebase patterns\n\n### Naming Convention\n\nSkills are named using the pattern: \\`@jai1-[domain]-patterns\\`\n\nExamples:\n- \\`@jai1-component-patterns\\`\n- \\`@jai1-api-patterns\\`\n- \\`@jai1-database-patterns\\`\n- \\`@jai1-testing-patterns\\`\n- \\`@jai1-deployment-patterns\\`\n\n## Best Practices\n\n1. **Load before applying**: Always reference the appropriate skill before implementing\n2. **Follow project structure**: Use patterns from \\`@jai1-component-patterns\\`\n3. **Maintain consistency**: Apply conventions consistently across the codebase\n4. **Document decisions**: Explain why specific patterns are used\n\n## Integration\n\nThis base rule works in conjunction with:\n- Project-specific rules (e.g., 01-project.md)\n- Technology-specific rules (e.g., 03-frontend.md)\n- Custom rules (e.g., 09-custom.md)\n- AGENTS.md (if present)\n\nWhen conflicts arise, prioritize:\n1. Custom rules (09-custom.*)\n2. Project rules (01-project.*)\n3. This base rule (00-jai1.*)\n`;\n\n/**\n * Get IDE format by ID\n */\nexport function getIdeFormat(id: string): IdeFormat | undefined {\n return IDE_FORMATS[id];\n}\n\n/**\n * Get all IDE format IDs\n */\nexport function getIdeFormatIds(): string[] {\n return Object.keys(IDE_FORMATS);\n}\n\n/**\n * Validate IDE format ID\n */\nexport function isValidIdeFormat(id: string): boolean {\n return id in IDE_FORMATS;\n}\n\n/**\n * Get IDE formats that require dependencies\n */\nexport function getIdeFormatsWithDependencies(): string[] {\n return Object.entries(IDE_FORMATS)\n .filter(([_, format]) => format.dependencies && format.dependencies.length > 0)\n .map(([id]) => id);\n}\n","/**\n * Guide Command\n * Interactive guide center for Agentic Coding\n *\n * Renamed from 'learn' back to 'guide' for clarity\n */\nimport React from 'react';\nimport { render } from 'ink';\nimport { Command } from 'commander';\nimport { GuideApp } from '../ui/guide/GuideApp.js';\n\n/**\n * Create guide command - Agentic Coding guide center\n */\nexport function createGuideCommand(): Command {\n const cmd = new Command('guide')\n .description('Trung tรขm hแปc Agentic Coding (interactive)')\n .option(\n '--topic <topic>',\n 'MแปŸ topic cแปฅ thแปƒ (intro, rules, workflows, prompts, skills)'\n )\n .action(async (options: { topic?: string }) => {\n const { waitUntilExit } = render(\n React.createElement(GuideApp, {\n initialTopic: options.topic,\n onExit: () => {\n process.exit(0);\n },\n })\n );\n\n await waitUntilExit();\n });\n\n return cmd;\n}\n","/**\n * GuideApp - Interactive Agentic Coding Guide Center\n * Redesigned with 2-column layout, markdown content, and search\n */\n\nimport React, { useState, useEffect, useCallback } from 'react';\nimport { Box, Text, useInput, useApp } from 'ink';\n\n// Components\nimport { Layout } from './components/Layout.js';\nimport { Sidebar, MENU_ITEMS } from './components/Sidebar/index.js';\nimport { ContentPane, WelcomePane } from './components/Content/ContentPane.js';\nimport { SearchOverlay } from './components/Search/SearchOverlay.js';\n\n// Hooks\nimport { useContent } from './hooks/useContent.js';\nimport type { FocusArea } from './hooks/useKeyboard.js';\n\n// Types\nimport type { ContentTopic } from './content/index.js';\n\nexport type GuideTopic = ContentTopic | null;\n\ninterface GuideAppProps {\n initialTopic?: string;\n onExit: () => void;\n}\n\ntype SidebarMode = 'menu' | 'toc';\n\n/**\n * GuideApp - Main application component\n */\nexport const GuideApp: React.FC<GuideAppProps> = ({ initialTopic, onExit }) => {\n const { exit } = useApp();\n\n // Navigation state\n const [currentTopic, setCurrentTopic] = useState<GuideTopic>(null);\n const [focusArea, setFocusArea] = useState<FocusArea>('sidebar');\n const [sidebarMode, setSidebarMode] = useState<SidebarMode>('menu');\n\n // Selection indices\n const [menuIndex, setMenuIndex] = useState(0);\n const [tocIndex, setTocIndex] = useState(0);\n const [scrollPosition, setScrollPosition] = useState(0);\n\n // Search state\n const [isSearchOpen, setIsSearchOpen] = useState(false);\n\n // Load content for current topic\n const { content, loading, error } = useContent(currentTopic);\n\n // Set initial topic from CLI option\n useEffect(() => {\n if (initialTopic) {\n const validTopics = ['intro', 'rules', 'workflows', 'prompts', 'skills'];\n if (validTopics.includes(initialTopic)) {\n setCurrentTopic(initialTopic as GuideTopic);\n setFocusArea('content');\n }\n }\n }, [initialTopic]);\n\n // Handle topic selection\n const handleSelectTopic = useCallback((topic: ContentTopic) => {\n setCurrentTopic(topic);\n setScrollPosition(0);\n setTocIndex(0);\n setFocusArea('content');\n setSidebarMode('menu');\n }, []);\n\n // Handle section selection from TOC\n const handleSelectSection = useCallback((sectionId: string) => {\n // Find section index and scroll to it\n if (content) {\n const sectionIndex = content.sections.findIndex(\n (s) => s.type === 'heading' && s.content.toLowerCase().includes(sectionId)\n );\n if (sectionIndex >= 0) {\n setScrollPosition(sectionIndex);\n }\n }\n setFocusArea('content');\n }, [content]);\n\n // Handle search result selection\n const handleSearchSelect = useCallback((topic: ContentTopic) => {\n setCurrentTopic(topic);\n setScrollPosition(0);\n setIsSearchOpen(false);\n setFocusArea('content');\n }, []);\n\n // Handle back navigation\n const handleBack = useCallback(() => {\n if (isSearchOpen) {\n setIsSearchOpen(false);\n } else if (focusArea === 'content' && currentTopic) {\n setFocusArea('sidebar');\n } else if (currentTopic) {\n setCurrentTopic(null);\n setFocusArea('sidebar');\n setSidebarMode('menu');\n } else {\n onExit();\n }\n }, [isSearchOpen, focusArea, currentTopic, onExit]);\n\n // Keyboard input handler\n useInput((input, key) => {\n // Search overlay has its own input handling\n if (isSearchOpen) {\n return;\n }\n\n // Quit\n if (input === 'q') {\n onExit();\n return;\n }\n\n // Open search\n if (input === '/') {\n setIsSearchOpen(true);\n return;\n }\n\n // Escape - back navigation\n if (key.escape) {\n handleBack();\n return;\n }\n\n // Tab - switch focus\n if (key.tab) {\n setFocusArea((prev) => (prev === 'sidebar' ? 'content' : 'sidebar'));\n return;\n }\n\n // Left/Right arrows - switch focus\n if (key.leftArrow && focusArea === 'content') {\n setFocusArea('sidebar');\n return;\n }\n if (key.rightArrow && focusArea === 'sidebar') {\n setFocusArea('content');\n return;\n }\n\n // Sidebar navigation\n if (focusArea === 'sidebar') {\n if (sidebarMode === 'menu') {\n if (key.upArrow || input === 'k') {\n setMenuIndex((prev) => Math.max(0, prev - 1));\n } else if (key.downArrow || input === 'j') {\n setMenuIndex((prev) => Math.min(MENU_ITEMS.length - 1, prev + 1));\n } else if (key.return) {\n const item = MENU_ITEMS[menuIndex];\n if (item) {\n handleSelectTopic(item.id);\n }\n }\n } else if (sidebarMode === 'toc' && content) {\n const sections = content.toc.filter((e) => e.level === 2);\n if (key.upArrow || input === 'k') {\n setTocIndex((prev) => Math.max(0, prev - 1));\n } else if (key.downArrow || input === 'j') {\n setTocIndex((prev) => Math.min(sections.length - 1, prev + 1));\n } else if (key.return) {\n const section = sections[tocIndex];\n if (section) {\n handleSelectSection(section.id);\n }\n }\n }\n\n // Switch between menu and TOC with 't'\n if (input === 't' && currentTopic && content?.toc.length) {\n setSidebarMode((prev) => (prev === 'menu' ? 'toc' : 'menu'));\n }\n }\n\n // Content scrolling\n if (focusArea === 'content' && currentTopic) {\n const maxScroll = content ? Math.max(0, content.sections.length - 10) : 0;\n\n if (key.upArrow || input === 'k') {\n setScrollPosition((prev) => Math.max(0, prev - 1));\n } else if (key.downArrow || input === 'j') {\n setScrollPosition((prev) => Math.min(maxScroll, prev + 1));\n } else if (key.pageUp || (key.ctrl && input === 'u')) {\n setScrollPosition((prev) => Math.max(0, prev - 5));\n } else if (key.pageDown || (key.ctrl && input === 'd')) {\n setScrollPosition((prev) => Math.min(maxScroll, prev + 5));\n } else if (input === 'g') {\n setScrollPosition(0);\n } else if (input === 'G') {\n setScrollPosition(maxScroll);\n }\n }\n });\n\n // Render content area\n const renderContent = () => {\n // Show loading state\n if (loading) {\n return (\n <Box padding={1}>\n <Text dimColor>Loading...</Text>\n </Box>\n );\n }\n\n // Show error state\n if (error) {\n return (\n <Box padding={1}>\n <Text color=\"red\">Error: {error}</Text>\n </Box>\n );\n }\n\n // Show content for selected topic\n if (content && currentTopic) {\n return (\n <ContentPane\n title={content.meta.title}\n icon={content.meta.icon}\n breadcrumb={['Guide', content.meta.title]}\n sections={content.sections}\n scrollPosition={scrollPosition}\n isFocused={focusArea === 'content'}\n />\n );\n }\n\n // Show welcome screen\n return <WelcomePane />;\n };\n\n // Render sidebar\n const renderSidebar = () => (\n <Sidebar\n mode={sidebarMode}\n menuIndex={menuIndex}\n tocIndex={tocIndex}\n currentTopic={currentTopic}\n toc={content?.toc || []}\n topicTitle={content?.meta.title}\n isFocused={focusArea === 'sidebar'}\n onSelectTopic={handleSelectTopic}\n onSelectSection={handleSelectSection}\n />\n );\n\n // Render search overlay\n const renderSearch = () => (\n <SearchOverlay\n onClose={() => setIsSearchOpen(false)}\n onSelectResult={handleSearchSelect}\n />\n );\n\n return (\n <Layout\n focusArea={focusArea}\n isSearchOpen={isSearchOpen}\n sidebar={renderSidebar()}\n content={renderContent()}\n searchOverlay={isSearchOpen ? renderSearch() : undefined}\n />\n );\n};\n","/**\n * Main Layout component for Jai1 Guide\n * Provides 2-column layout with sidebar and content area\n */\n\nimport React from 'react';\nimport { Box, Text, useStdout } from 'ink';\nimport { layout, colors } from '../utils/theme.js';\nimport { Header } from './Header.js';\nimport { Footer } from './Footer.js';\nimport type { FocusArea } from '../hooks/useKeyboard.js';\n\ninterface LayoutProps {\n focusArea: FocusArea;\n isSearchOpen?: boolean;\n sidebar: React.ReactNode;\n content: React.ReactNode;\n searchOverlay?: React.ReactNode;\n}\n\nexport const Layout: React.FC<LayoutProps> = ({\n focusArea,\n isSearchOpen = false,\n sidebar,\n content,\n searchOverlay,\n}) => {\n const { stdout } = useStdout();\n const terminalWidth = stdout?.columns || 80;\n const terminalHeight = stdout?.rows || 24;\n\n // Calculate dimensions\n const sidebarWidth = Math.min(layout.sidebarWidth, Math.floor(terminalWidth * 0.3));\n const contentWidth = terminalWidth - sidebarWidth - 4; // Account for borders\n\n // Main content height (subtract header, footer, borders)\n const mainHeight = Math.max(10, terminalHeight - 6);\n\n return (\n <Box flexDirection=\"column\" width={terminalWidth}>\n {/* Header */}\n <Header showSearch={!isSearchOpen} />\n\n {/* Main content area */}\n <Box height={mainHeight}>\n {/* Sidebar */}\n <Box\n flexDirection=\"column\"\n width={sidebarWidth}\n borderStyle=\"single\"\n borderColor={focusArea === 'sidebar' ? colors.secondary : colors.muted}\n paddingX={1}\n >\n {sidebar}\n </Box>\n\n {/* Content */}\n <Box\n flexDirection=\"column\"\n flexGrow={1}\n borderStyle=\"round\"\n borderColor={focusArea === 'content' ? colors.secondary : colors.muted}\n paddingX={1}\n marginLeft={-1}\n >\n {content}\n </Box>\n </Box>\n\n {/* Footer */}\n <Footer focusArea={focusArea} isSearchOpen={isSearchOpen} />\n\n {/* Search overlay (modal) */}\n {isSearchOpen && searchOverlay && (\n <Box\n position=\"absolute\"\n marginTop={3}\n marginLeft={Math.floor((terminalWidth - 60) / 2)}\n width={60}\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={colors.search.border}\n padding={1}\n >\n {searchOverlay}\n </Box>\n )}\n </Box>\n );\n};\n","/**\n * Theme configuration for Jai1 Guide UI\n * Provides consistent colors and styles across all components\n */\n\nexport const colors = {\n // Primary colors\n primary: 'magenta',\n secondary: 'cyan',\n success: 'green',\n warning: 'yellow',\n error: 'red',\n muted: 'gray',\n\n // Text colors\n text: {\n primary: 'white',\n secondary: 'gray',\n heading: 'magenta',\n link: 'cyan',\n code: 'yellow',\n },\n\n // Component-specific colors\n sidebar: {\n border: 'gray',\n selected: 'cyan',\n heading: 'magenta',\n active: 'green',\n },\n\n content: {\n border: 'gray',\n heading: 'magenta',\n subheading: 'cyan',\n code: 'yellow',\n blockquote: 'green',\n },\n\n header: {\n title: 'magenta',\n badge: 'green',\n },\n\n footer: {\n text: 'gray',\n key: 'cyan',\n },\n\n search: {\n border: 'cyan',\n match: 'yellow',\n selected: 'green',\n },\n} as const;\n\nexport const borders = {\n header: { style: 'double' as const, color: colors.primary },\n sidebar: { style: 'single' as const, color: colors.sidebar.border },\n content: { style: 'round' as const, color: colors.content.border },\n tip: { style: 'round' as const, color: colors.success },\n warning: { style: 'round' as const, color: colors.warning },\n error: { style: 'round' as const, color: colors.error },\n code: { style: 'single' as const, color: colors.muted },\n search: { style: 'round' as const, color: colors.search.border },\n} as const;\n\nexport const icons = {\n // Menu icons\n menu: {\n intro: '๐Ÿ“–',\n rules: '๐Ÿ“œ',\n workflows: '๐Ÿ”„',\n prompts: '๐Ÿ’ฌ',\n skills: '๐Ÿ› ',\n },\n\n // UI icons\n ui: {\n selected: 'โ–ธ',\n unselected: ' ',\n bullet: 'โ€ข',\n arrow: 'โ†’',\n check: 'โœ“',\n cross: 'โœ—',\n search: '๐Ÿ”',\n tip: '๐Ÿ’ก',\n warning: 'โš ๏ธ',\n info: 'โ„น๏ธ',\n scrollUp: 'โ†‘',\n scrollDown: 'โ†“',\n },\n} as const;\n\nexport const layout = {\n // Minimum terminal width\n minWidth: 80,\n\n // Sidebar width (characters)\n sidebarWidth: 24,\n\n // Content padding\n padding: {\n header: 1,\n sidebar: 1,\n content: 1,\n footer: 1,\n },\n\n // Max visible items\n maxVisibleMenuItems: 10,\n maxVisibleTocItems: 8,\n maxVisibleContentLines: 20,\n} as const;\n\nexport const shortcuts = {\n navigation: {\n up: ['โ†‘', 'k'],\n down: ['โ†“', 'j'],\n left: ['โ†', 'h'],\n right: ['โ†’', 'l'],\n pageUp: ['PgUp'],\n pageDown: ['PgDn'],\n top: ['g'],\n bottom: ['G'],\n },\n actions: {\n select: ['Enter'],\n back: ['Esc', 'Backspace'],\n search: ['/'],\n quit: ['q'],\n help: ['?'],\n },\n} as const;\n\n// Badge styles\nexport const badges = {\n beta: { text: 'BETA', bgColor: 'green', textColor: 'black' },\n new: { text: 'NEW', bgColor: 'cyan', textColor: 'black' },\n updated: { text: 'UPDATED', bgColor: 'yellow', textColor: 'black' },\n} as const;\n\nexport type ThemeColors = typeof colors;\nexport type ThemeBorders = typeof borders;\nexport type ThemeIcons = typeof icons;\nexport type ThemeLayout = typeof layout;\n","/**\n * Header component for Jai1 Guide\n */\n\nimport React from 'react';\nimport { Box, Text } from 'ink';\nimport { colors, borders } from '../utils/theme.js';\n\ninterface HeaderProps {\n showSearch?: boolean;\n}\n\nexport const Header: React.FC<HeaderProps> = ({ showSearch = true }) => {\n return (\n <Box\n borderStyle={borders.header.style}\n borderColor={borders.header.color}\n paddingX={1}\n justifyContent=\"space-between\"\n >\n <Box>\n <Text bold color={colors.header.title}>\n ๐ŸŽ“ Jai1 Guide\n </Text>\n <Text dimColor> - Trung tรขm hฦฐแป›ng dแบซn Agentic Coding</Text>\n </Box>\n\n <Box>\n {showSearch && (\n <Text dimColor>\n <Text color={colors.footer.key}>[/]</Text> Search{' '}\n </Text>\n )}\n <Text dimColor>\n <Text color={colors.footer.key}>[q]</Text> Quit\n </Text>\n </Box>\n </Box>\n );\n};\n","/**\n * Footer component for Jai1 Guide\n * Shows context-aware keyboard shortcuts\n */\n\nimport React from 'react';\nimport { Box, Text } from 'ink';\nimport { colors, borders } from '../utils/theme.js';\nimport type { FocusArea } from '../hooks/useKeyboard.js';\n\ninterface FooterProps {\n focusArea: FocusArea;\n isSearchOpen?: boolean;\n}\n\nexport const Footer: React.FC<FooterProps> = ({ focusArea, isSearchOpen = false }) => {\n const getShortcuts = () => {\n if (isSearchOpen) {\n return [\n { key: 'โ†‘โ†“', action: 'Navigate' },\n { key: 'Enter', action: 'Select' },\n { key: 'Esc', action: 'Close' },\n ];\n }\n\n if (focusArea === 'sidebar') {\n return [\n { key: 'โ†‘โ†“/jk', action: 'Navigate' },\n { key: 'Enter', action: 'Select' },\n { key: 'โ†’/Tab', action: 'Content' },\n { key: '/', action: 'Search' },\n { key: 'Ctrl+q', action: 'Quit' },\n ];\n }\n\n // content focus\n return [\n { key: 'โ†‘โ†“/jk', action: 'Scroll' },\n { key: 'g/G', action: 'Top/Bottom' },\n { key: 'โ†/Tab', action: 'Sidebar' },\n { key: 'Esc', action: 'Back' },\n { key: '/', action: 'Search' },\n ];\n };\n\n const shortcuts = getShortcuts();\n\n return (\n <Box\n borderStyle=\"single\"\n borderColor={colors.muted}\n paddingX={1}\n justifyContent=\"center\"\n >\n <Box>\n {shortcuts.map((shortcut, index) => (\n <React.Fragment key={shortcut.key}>\n {index > 0 && <Text dimColor> ยท </Text>}\n <Text color={colors.footer.key}>[{shortcut.key}]</Text>\n <Text dimColor> {shortcut.action}</Text>\n </React.Fragment>\n ))}\n </Box>\n </Box>\n );\n};\n","/**\n * Sidebar container component\n */\n\nimport React from 'react';\nimport { Box } from 'ink';\nimport { MainMenu, MENU_ITEMS } from './MainMenu.js';\nimport { TableOfContents } from './TableOfContents.js';\nimport type { ContentTopic } from '../../content/index.js';\nimport type { TocEntry } from '../../utils/markdown.js';\n\ntype SidebarMode = 'menu' | 'toc';\n\ninterface SidebarProps {\n mode: SidebarMode;\n menuIndex: number;\n tocIndex: number;\n currentTopic: ContentTopic | null;\n toc: TocEntry[];\n topicTitle?: string;\n isFocused: boolean;\n onSelectTopic: (topic: ContentTopic) => void;\n onSelectSection: (sectionId: string) => void;\n}\n\nexport const Sidebar: React.FC<SidebarProps> = ({\n mode,\n menuIndex,\n tocIndex,\n currentTopic,\n toc,\n topicTitle,\n isFocused,\n onSelectTopic,\n onSelectSection,\n}) => {\n return (\n <Box flexDirection=\"column\" height=\"100%\">\n {/* Main menu - always visible */}\n <MainMenu\n selectedIndex={menuIndex}\n currentTopic={currentTopic}\n onSelect={onSelectTopic}\n isFocused={isFocused && mode === 'menu'}\n />\n\n {/* Table of contents - visible when viewing a topic */}\n {currentTopic && toc.length > 0 && (\n <TableOfContents\n toc={toc}\n selectedIndex={tocIndex}\n topicTitle={topicTitle}\n isFocused={isFocused && mode === 'toc'}\n />\n )}\n </Box>\n );\n};\n\nexport { MENU_ITEMS };\n","/**\n * MainMenu component - Topic selection menu\n */\n\nimport React from 'react';\nimport { Box, Text } from 'ink';\nimport { colors, icons } from '../../utils/theme.js';\nimport type { ContentTopic } from '../../content/index.js';\n\ninterface MenuItem {\n id: ContentTopic;\n icon: string;\n title: string;\n badge?: string;\n}\n\nconst MENU_ITEMS: MenuItem[] = [\n { id: 'intro', icon: icons.menu.intro, title: 'Giแป›i thiแป‡u' },\n { id: 'rules', icon: icons.menu.rules, title: 'IDE Rules' },\n { id: 'workflows', icon: icons.menu.workflows, title: 'Workflows' },\n { id: 'prompts', icon: icons.menu.prompts, title: 'Prompts' },\n { id: 'skills', icon: icons.menu.skills, title: 'Skills' },\n];\n\ninterface MainMenuProps {\n selectedIndex: number;\n currentTopic: ContentTopic | null;\n onSelect: (topic: ContentTopic) => void;\n isFocused: boolean;\n}\n\nexport const MainMenu: React.FC<MainMenuProps> = ({\n selectedIndex,\n currentTopic,\n onSelect,\n isFocused,\n}) => {\n return (\n <Box flexDirection=\"column\">\n {/* Menu header */}\n <Box marginBottom={1}>\n <Text bold color={colors.sidebar.heading}>\n ๐Ÿ“š MENU\n </Text>\n </Box>\n\n {/* Menu items */}\n {MENU_ITEMS.map((item, index) => {\n const isSelected = isFocused && index === selectedIndex;\n const isActive = item.id === currentTopic;\n\n return (\n <Box key={item.id}>\n {/* Selection indicator */}\n <Text color={isSelected ? colors.sidebar.selected : undefined}>\n {isSelected ? icons.ui.selected : icons.ui.unselected}\n </Text>\n\n {/* Icon and title */}\n <Text\n color={\n isActive\n ? colors.sidebar.active\n : isSelected\n ? colors.sidebar.selected\n : undefined\n }\n bold={isActive}\n >\n {' '}\n {item.icon} {item.title}\n </Text>\n\n {/* Badge */}\n {item.badge && (\n <Text color=\"yellow\" dimColor>\n {' '}\n [{item.badge}]\n </Text>\n )}\n\n {/* Active indicator */}\n {isActive && (\n <Text color={colors.sidebar.active}> โ—€</Text>\n )}\n </Box>\n );\n })}\n </Box>\n );\n};\n\nexport { MENU_ITEMS };\nexport type { MenuItem };\n","/**\n * TableOfContents component - Dynamic TOC for current topic\n */\n\nimport React from 'react';\nimport { Box, Text } from 'ink';\nimport { colors, icons, layout } from '../../utils/theme.js';\nimport type { TocEntry } from '../../utils/markdown.js';\n\ninterface TableOfContentsProps {\n toc: TocEntry[];\n selectedIndex: number;\n activeSection?: string;\n isFocused: boolean;\n topicTitle?: string;\n}\n\nexport const TableOfContents: React.FC<TableOfContentsProps> = ({\n toc,\n selectedIndex,\n activeSection,\n isFocused,\n topicTitle,\n}) => {\n // Filter to show only h2 headers (main sections)\n const sections = toc.filter((entry) => entry.level === 2);\n\n if (sections.length === 0) {\n return null;\n }\n\n // Limit visible items\n const maxVisible = layout.maxVisibleTocItems;\n const startIndex = Math.max(\n 0,\n Math.min(selectedIndex - Math.floor(maxVisible / 2), sections.length - maxVisible)\n );\n const visibleSections = sections.slice(startIndex, startIndex + maxVisible);\n\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n {/* Separator */}\n <Box marginBottom={1}>\n <Text dimColor>{'โ”€'.repeat(18)}</Text>\n </Box>\n\n {/* TOC header */}\n <Box marginBottom={1}>\n <Text bold color={colors.sidebar.heading}>\n ๐Ÿ“‘ {topicTitle || 'Contents'}\n </Text>\n </Box>\n\n {/* Show scroll indicator if needed */}\n {startIndex > 0 && (\n <Box justifyContent=\"center\">\n <Text dimColor>{icons.ui.scrollUp}</Text>\n </Box>\n )}\n\n {/* TOC items */}\n {visibleSections.map((entry, visibleIndex) => {\n const actualIndex = startIndex + visibleIndex;\n const isSelected = isFocused && actualIndex === selectedIndex;\n const isActive = entry.id === activeSection;\n\n // Indent based on level\n const indent = ' '.repeat(entry.level - 2);\n\n // Truncate long titles\n const maxLength = 14;\n const displayText =\n entry.text.length > maxLength\n ? entry.text.substring(0, maxLength - 1) + 'โ€ฆ'\n : entry.text;\n\n return (\n <Box key={entry.id}>\n <Text color={isSelected ? colors.sidebar.selected : undefined}>\n {isSelected ? icons.ui.selected : icons.ui.unselected}\n </Text>\n <Text\n color={\n isActive\n ? colors.sidebar.active\n : isSelected\n ? colors.sidebar.selected\n : colors.muted\n }\n >\n {indent}\n {icons.ui.bullet} {displayText}\n </Text>\n {isActive && <Text color={colors.sidebar.active}> โ—€</Text>}\n </Box>\n );\n })}\n\n {/* Show scroll indicator if more items below */}\n {startIndex + maxVisible < sections.length && (\n <Box justifyContent=\"center\">\n <Text dimColor>{icons.ui.scrollDown}</Text>\n </Box>\n )}\n </Box>\n );\n};\n","/**\n * ContentPane - Main content display area\n */\n\nimport React from 'react';\nimport { Box, Text } from 'ink';\nimport { Breadcrumb } from './Breadcrumb.js';\nimport { MarkdownRenderer } from './MarkdownRenderer.js';\nimport { ScrollIndicator } from './ScrollIndicator.js';\nimport { colors, layout } from '../../utils/theme.js';\nimport type { ContentSection } from '../../utils/markdown.js';\n\ninterface ContentPaneProps {\n title: string;\n icon: string;\n breadcrumb: string[];\n sections: ContentSection[];\n scrollPosition: number;\n isFocused: boolean;\n}\n\nexport const ContentPane: React.FC<ContentPaneProps> = ({\n title,\n icon,\n breadcrumb,\n sections,\n scrollPosition,\n isFocused,\n}) => {\n const maxVisibleSections = layout.maxVisibleContentLines;\n\n return (\n <Box flexDirection=\"column\" height=\"100%\">\n {/* Breadcrumb navigation */}\n <Breadcrumb items={breadcrumb} />\n\n {/* Content area */}\n <Box flexDirection=\"column\" flexGrow={1}>\n <MarkdownRenderer\n sections={sections}\n scrollPosition={scrollPosition}\n maxLines={maxVisibleSections}\n />\n </Box>\n\n {/* Scroll indicator */}\n {sections.length > maxVisibleSections && (\n <ScrollIndicator\n current={scrollPosition}\n total={sections.length}\n />\n )}\n </Box>\n );\n};\n\n/**\n * WelcomePane - Shown when no topic is selected\n */\nexport const WelcomePane: React.FC = () => {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={colors.primary}\n padding={1}\n marginBottom={1}\n >\n <Text bold color={colors.primary}>\n Chร o mแปซng ฤ‘แบฟn vแป›i Jai1 Guide!\n </Text>\n <Text />\n <Text>\n ฤรขy lร  trung tรขm hฦฐแป›ng dแบซn giรบp bแบกn lร m chแปง{' '}\n <Text bold color={colors.secondary}>Agentic Coding</Text> -\n </Text>\n <Text>\n phฦฐฦกng phรกp phรกt triแปƒn phแบงn mแปm vแป›i sแปฑ hแป— trแปฃ cแปงa AI.\n </Text>\n </Box>\n\n <Box flexDirection=\"column\" marginTop={1}>\n <Text bold color={colors.secondary}>Bแบฏt ฤ‘แบงu:</Text>\n <Text />\n <Text> โ† Chแปn mแป™t chแปง ฤ‘แป tแปซ menu bรชn trรกi</Text>\n <Text />\n <Text dimColor> hoแบทc nhแบฅn <Text color={colors.footer.key}>/</Text> ฤ‘แปƒ tรฌm kiแบฟm</Text>\n </Box>\n\n <Box flexDirection=\"column\" marginTop={2}>\n <Text bold color={colors.secondary}>Gแปฃi รฝ ฤ‘แปc:</Text>\n <Text />\n <Text> 1. <Text color={colors.primary}>Giแป›i thiแป‡u</Text> - Hiแปƒu vแป Agentic Coding</Text>\n <Text> 2. <Text color={colors.primary}>IDE Rules</Text> - Nแปn tแบฃng quan trแปng nhแบฅt</Text>\n <Text> 3. <Text color={colors.primary}>Workflows</Text> - Quy trรฌnh lร m viแป‡c</Text>\n </Box>\n </Box>\n );\n};\n","/**\n * Breadcrumb navigation component\n */\n\nimport React from 'react';\nimport { Box, Text } from 'ink';\nimport { colors } from '../../utils/theme.js';\n\ninterface BreadcrumbProps {\n items: string[];\n}\n\nexport const Breadcrumb: React.FC<BreadcrumbProps> = ({ items }) => {\n if (items.length === 0) {\n return null;\n }\n\n return (\n <Box marginBottom={1}>\n <Text dimColor>โ”Œโ”€ </Text>\n {items.map((item, index) => (\n <React.Fragment key={index}>\n {index > 0 && (\n <Text color={colors.muted}> {'>'} </Text>\n )}\n <Text\n color={index === items.length - 1 ? colors.secondary : colors.muted}\n bold={index === items.length - 1}\n >\n {item}\n </Text>\n </React.Fragment>\n ))}\n </Box>\n );\n};\n","/**\n * MarkdownRenderer component - Renders markdown content with styling\n */\n\nimport React from 'react';\nimport { Box, Text } from 'ink';\nimport { colors, borders, icons } from '../../utils/theme.js';\nimport type { ContentSection } from '../../utils/markdown.js';\n\ninterface MarkdownRendererProps {\n sections: ContentSection[];\n scrollPosition: number;\n maxLines: number;\n}\n\n/**\n * Render a single section with appropriate styling\n */\nconst SectionRenderer: React.FC<{ section: ContentSection }> = ({ section }) => {\n switch (section.type) {\n case 'heading':\n if (section.level === 1) {\n return (\n <Box\n flexDirection=\"column\"\n marginBottom={1}\n borderStyle={borders.header.style}\n borderColor={borders.header.color}\n paddingX={1}\n >\n <Text bold color={colors.content.heading}>\n {section.content}\n </Text>\n </Box>\n );\n } else if (section.level === 2) {\n return (\n <Box marginTop={1} marginBottom={1}>\n <Text bold color={colors.content.subheading}>\n ## {section.content}\n </Text>\n </Box>\n );\n } else {\n return (\n <Box marginTop={1}>\n <Text bold>### {section.content}</Text>\n </Box>\n );\n }\n\n case 'paragraph':\n return (\n <Box marginBottom={1} flexDirection=\"column\">\n {section.content.split('\\n').map((line, i) => (\n <Text key={i}>{line}</Text>\n ))}\n </Box>\n );\n\n case 'code':\n return (\n <Box\n flexDirection=\"column\"\n marginY={1}\n borderStyle={borders.code.style}\n borderColor={borders.code.color}\n paddingX={1}\n >\n {section.language && (\n <Text dimColor>[{section.language}]</Text>\n )}\n {section.content.split('\\n').map((line, i) => (\n <Text key={i} color={colors.content.code}>\n {line}\n </Text>\n ))}\n </Box>\n );\n\n case 'tip':\n return (\n <Box\n marginY={1}\n borderStyle={borders.tip.style}\n borderColor={borders.tip.color}\n paddingX={1}\n >\n <Text color={colors.success}>\n {icons.ui.tip} <Text bold>Tip:</Text> {section.content}\n </Text>\n </Box>\n );\n\n case 'warning':\n return (\n <Box\n marginY={1}\n borderStyle={borders.warning.style}\n borderColor={borders.warning.color}\n paddingX={1}\n >\n <Text color={colors.warning}>\n {icons.ui.warning} <Text bold>Warning:</Text> {section.content}\n </Text>\n </Box>\n );\n\n case 'blockquote':\n return (\n <Box marginY={1} paddingLeft={1}>\n <Text color={colors.muted}>โ”‚ </Text>\n <Text italic color={colors.content.blockquote}>\n {section.content}\n </Text>\n </Box>\n );\n\n case 'list':\n return (\n <Box flexDirection=\"column\" marginY={1}>\n {(section.items || []).map((item, i) => (\n <Box key={i}>\n <Text> {icons.ui.bullet} {item}</Text>\n </Box>\n ))}\n </Box>\n );\n\n default:\n return (\n <Box marginBottom={1}>\n <Text>{section.content}</Text>\n </Box>\n );\n }\n};\n\nexport const MarkdownRenderer: React.FC<MarkdownRendererProps> = ({\n sections,\n scrollPosition,\n maxLines,\n}) => {\n // Calculate visible sections based on scroll position\n const visibleSections = sections.slice(\n scrollPosition,\n scrollPosition + maxLines\n );\n\n const hasMore = scrollPosition + maxLines < sections.length;\n const hasPrevious = scrollPosition > 0;\n\n return (\n <Box flexDirection=\"column\">\n {/* Scroll up indicator */}\n {hasPrevious && (\n <Box justifyContent=\"center\">\n <Text dimColor>{icons.ui.scrollUp} Scroll up for more</Text>\n </Box>\n )}\n\n {/* Content sections */}\n {visibleSections.map((section, index) => (\n <SectionRenderer\n key={`${section.type}-${scrollPosition + index}`}\n section={section}\n />\n ))}\n\n {/* Scroll down indicator */}\n {hasMore && (\n <Box justifyContent=\"center\" marginTop={1}>\n <Text dimColor>\n {icons.ui.scrollDown} Scroll down for more ({sections.length - scrollPosition - maxLines} more)\n </Text>\n </Box>\n )}\n </Box>\n );\n};\n","/**\n * ScrollIndicator component - Shows scroll position/progress\n */\n\nimport React from 'react';\nimport { Box, Text } from 'ink';\nimport { colors } from '../../utils/theme.js';\n\ninterface ScrollIndicatorProps {\n current: number;\n total: number;\n showPercentage?: boolean;\n}\n\nexport const ScrollIndicator: React.FC<ScrollIndicatorProps> = ({\n current,\n total,\n showPercentage = true,\n}) => {\n if (total <= 0) {\n return null;\n }\n\n const percentage = Math.min(100, Math.round((current / total) * 100));\n const barWidth = 10;\n const filledWidth = Math.round((percentage / 100) * barWidth);\n const emptyWidth = barWidth - filledWidth;\n\n return (\n <Box justifyContent=\"flex-end\">\n <Text dimColor>\n {showPercentage && `${percentage}% `}\n <Text color={colors.secondary}>{'โ–ˆ'.repeat(filledWidth)}</Text>\n <Text color={colors.muted}>{'โ–‘'.repeat(emptyWidth)}</Text>\n {' '}\n {current + 1}/{total}\n </Text>\n </Box>\n );\n};\n","/**\n * SearchOverlay component - Modal search interface\n */\n\nimport React, { useState, useCallback } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { colors, borders, icons } from '../../utils/theme.js';\nimport { useSearch } from '../../hooks/useContent.js';\nimport type { ContentTopic } from '../../content/index.js';\n\ninterface SearchOverlayProps {\n onClose: () => void;\n onSelectResult: (topic: ContentTopic, sectionId?: string) => void;\n}\n\nexport const SearchOverlay: React.FC<SearchOverlayProps> = ({\n onClose,\n onSelectResult,\n}) => {\n const [query, setQuery] = useState('');\n const [selectedIndex, setSelectedIndex] = useState(0);\n const { results } = useSearch(query);\n\n // Flatten results for navigation\n const flatResults = results.flatMap((r) =>\n r.matches.map((m) => ({\n topic: r.topic,\n title: r.title,\n match: m.text,\n context: m.context,\n }))\n );\n\n useInput((input, key) => {\n if (key.escape) {\n onClose();\n return;\n }\n\n if (key.upArrow) {\n setSelectedIndex((prev) => Math.max(0, prev - 1));\n return;\n }\n\n if (key.downArrow) {\n setSelectedIndex((prev) => Math.min(flatResults.length - 1, prev + 1));\n return;\n }\n\n if (key.return && flatResults.length > 0) {\n const result = flatResults[selectedIndex];\n if (result) {\n onSelectResult(result.topic);\n onClose();\n }\n return;\n }\n });\n\n // Reset selection when query changes\n const handleQueryChange = useCallback((value: string) => {\n setQuery(value);\n setSelectedIndex(0);\n }, []);\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle={borders.search.style}\n borderColor={borders.search.color}\n padding={1}\n width={60}\n >\n {/* Search header */}\n <Box marginBottom={1}>\n <Text bold color={colors.search.border}>\n {icons.ui.search} Search\n </Text>\n <Box flexGrow={1} />\n <Text dimColor>[Esc] Close</Text>\n </Box>\n\n {/* Search input */}\n <Box\n borderStyle=\"single\"\n borderColor={colors.secondary}\n paddingX={1}\n marginBottom={1}\n >\n <Text color={colors.secondary}>โฏ </Text>\n <TextInput\n value={query}\n onChange={handleQueryChange}\n placeholder=\"Type to search...\"\n focus={true}\n />\n </Box>\n\n {/* Results */}\n <Box flexDirection=\"column\" maxHeight={10}>\n {query.length < 2 ? (\n <Text dimColor>Type at least 2 characters to search...</Text>\n ) : flatResults.length === 0 ? (\n <Text dimColor>No results found for \"{query}\"</Text>\n ) : (\n <>\n <Text dimColor marginBottom={1}>\n Found {flatResults.length} result(s):\n </Text>\n {flatResults.slice(0, 5).map((result, index) => {\n const isSelected = index === selectedIndex;\n // Truncate match text\n const matchText =\n result.match.length > 45\n ? result.match.substring(0, 42) + '...'\n : result.match;\n\n return (\n <Box key={`${result.topic}-${index}`} flexDirection=\"column\">\n <Box>\n <Text\n color={isSelected ? colors.search.selected : undefined}\n backgroundColor={isSelected ? colors.search.selected : undefined}\n bold={isSelected}\n >\n {isSelected ? 'โ–ธ' : ' '} [{result.title}]\n </Text>\n </Box>\n <Box marginLeft={2}>\n <Text\n color={isSelected ? colors.search.match : colors.muted}\n dimColor={!isSelected}\n >\n {matchText}\n </Text>\n </Box>\n </Box>\n );\n })}\n {flatResults.length > 5 && (\n <Text dimColor marginTop={1}>\n ... and {flatResults.length - 5} more results\n </Text>\n )}\n </>\n )}\n </Box>\n\n {/* Help */}\n <Box marginTop={1} borderTop borderColor={colors.muted} paddingTop={1}>\n <Text dimColor>\n [โ†‘โ†“] Navigate ยท [Enter] Go to ยท [Esc] Close\n </Text>\n </Box>\n </Box>\n );\n};\n","/**\n * Content loading hook for Jai1 Guide\n * Loads and parses markdown content from embedded files\n */\n\nimport { useState, useEffect, useMemo } from 'react';\nimport matter from 'gray-matter';\nimport {\n extractToc,\n parseMarkdownToSections,\n type TocEntry,\n type ContentSection,\n} from '../utils/markdown.js';\nimport { contentFiles, type ContentTopic } from '../content/index.js';\n\n/**\n * Frontmatter metadata from markdown files\n */\nexport interface ContentMeta {\n title: string;\n icon: string;\n description: string;\n badge?: string;\n}\n\n/**\n * Loaded content with parsed sections and TOC\n */\nexport interface LoadedContent {\n meta: ContentMeta;\n sections: ContentSection[];\n toc: TocEntry[];\n rawMarkdown: string;\n}\n\n/**\n * Hook to load and parse content for a topic\n */\nexport function useContent(topic: ContentTopic | null): {\n content: LoadedContent | null;\n loading: boolean;\n error: string | null;\n} {\n const [content, setContent] = useState<LoadedContent | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (!topic) {\n setContent(null);\n return;\n }\n\n setLoading(true);\n setError(null);\n\n try {\n const rawContent = contentFiles[topic];\n\n if (!rawContent) {\n throw new Error(`Content not found for topic: ${topic}`);\n }\n\n // Parse frontmatter\n const { data, content: markdown } = matter(rawContent);\n\n // Extract metadata with defaults\n const meta: ContentMeta = {\n title: data.title || topic,\n icon: data.icon || '๐Ÿ“„',\n description: data.description || '',\n badge: data.badge,\n };\n\n // Parse markdown to sections\n const sections = parseMarkdownToSections(markdown);\n\n // Extract table of contents\n const toc = extractToc(markdown);\n\n setContent({\n meta,\n sections,\n toc,\n rawMarkdown: markdown,\n });\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Unknown error');\n setContent(null);\n } finally {\n setLoading(false);\n }\n }, [topic]);\n\n return { content, loading, error };\n}\n\n/**\n * Get all available topics with their metadata\n */\nexport function useTopicList(): {\n id: ContentTopic;\n title: string;\n icon: string;\n description: string;\n badge?: string;\n}[] {\n return useMemo(() => {\n const topics: {\n id: ContentTopic;\n title: string;\n icon: string;\n description: string;\n badge?: string;\n }[] = [];\n\n for (const [id, rawContent] of Object.entries(contentFiles)) {\n try {\n const { data } = matter(rawContent);\n topics.push({\n id: id as ContentTopic,\n title: data.title || id,\n icon: data.icon || '๐Ÿ“„',\n description: data.description || '',\n badge: data.badge,\n });\n } catch {\n topics.push({\n id: id as ContentTopic,\n title: id,\n icon: '๐Ÿ“„',\n description: '',\n });\n }\n }\n\n return topics;\n }, []);\n}\n\n/**\n * Search across all content\n */\nexport function useSearch(query: string): {\n results: {\n topic: ContentTopic;\n title: string;\n matches: { text: string; context: string }[];\n }[];\n} {\n return useMemo(() => {\n if (!query || query.length < 2) {\n return { results: [] };\n }\n\n const results: {\n topic: ContentTopic;\n title: string;\n matches: { text: string; context: string }[];\n }[] = [];\n\n const lowerQuery = query.toLowerCase();\n\n for (const [id, rawContent] of Object.entries(contentFiles)) {\n const { data, content: markdown } = matter(rawContent);\n const lowerContent = markdown.toLowerCase();\n\n if (lowerContent.includes(lowerQuery)) {\n // Find matching lines\n const lines = markdown.split('\\n');\n const matches: { text: string; context: string }[] = [];\n\n for (let i = 0; i < lines.length; i++) {\n if (lines[i]!.toLowerCase().includes(lowerQuery)) {\n matches.push({\n text: lines[i]!.trim(),\n context: `Line ${i + 1}`,\n });\n\n // Limit matches per file\n if (matches.length >= 3) break;\n }\n }\n\n if (matches.length > 0) {\n results.push({\n topic: id as ContentTopic,\n title: data.title || id,\n matches,\n });\n }\n }\n }\n\n return { results };\n }, [query]);\n}\n","/**\n * Markdown parsing utilities for Jai1 Guide\n * Uses marked with marked-terminal for CLI rendering\n */\n\nimport chalk from 'chalk';\nimport { marked, type Tokens } from 'marked';\nimport TerminalRenderer from 'marked-terminal';\nimport { colors } from './theme.js';\n\n// Configure marked-terminal renderer\nconst renderer = new TerminalRenderer({\n // Code styling\n code: chalk.yellow,\n codespan: chalk.yellow.dim,\n\n // Block elements\n blockquote: chalk.green.italic,\n html: chalk.gray,\n heading: chalk.magenta.bold,\n firstHeading: chalk.magenta.bold,\n hr: chalk.gray,\n\n // Lists\n listitem: chalk.white,\n list: (body: string) => body,\n\n // Tables\n table: chalk.white,\n tablerow: chalk.white,\n tablecell: chalk.white,\n\n // Inline elements\n strong: chalk.bold,\n em: chalk.italic,\n del: chalk.strikethrough,\n link: chalk.cyan.underline,\n href: chalk.cyan,\n\n // Other\n paragraph: chalk.white,\n image: chalk.gray,\n\n // Custom options\n showSectionPrefix: false,\n reflowText: true,\n width: 70,\n emoji: true,\n tab: 2,\n});\n\n// Set up marked with our renderer\nmarked.setOptions({\n renderer,\n gfm: true,\n breaks: true,\n});\n\n/**\n * Render markdown string to terminal-formatted string\n */\nexport function renderMarkdown(markdown: string): string {\n try {\n const rendered = marked(markdown) as string;\n return rendered.trim();\n } catch (error) {\n console.error('Markdown render error:', error);\n return markdown;\n }\n}\n\n/**\n * Content item types for structured content\n */\nexport interface ContentSection {\n type: 'heading' | 'paragraph' | 'code' | 'tip' | 'warning' | 'list' | 'blockquote';\n level?: number; // For headings: 1, 2, 3\n content: string;\n language?: string; // For code blocks\n items?: string[]; // For lists\n}\n\n/**\n * Table of contents entry\n */\nexport interface TocEntry {\n level: number;\n text: string;\n id: string;\n}\n\n/**\n * Extract table of contents from markdown\n */\nexport function extractToc(markdown: string): TocEntry[] {\n const toc: TocEntry[] = [];\n const headingRegex = /^(#{1,3})\\s+(.+)$/gm;\n\n let match;\n while ((match = headingRegex.exec(markdown)) !== null) {\n const level = match[1]!.length;\n const text = match[2]!.trim();\n const id = text\n .toLowerCase()\n .replace(/[^\\w\\s-]/g, '')\n .replace(/\\s+/g, '-');\n\n toc.push({ level, text, id });\n }\n\n return toc;\n}\n\n/**\n * Parse markdown into structured content sections\n */\nexport function parseMarkdownToSections(markdown: string): ContentSection[] {\n const sections: ContentSection[] = [];\n const tokens = marked.lexer(markdown);\n\n for (const token of tokens) {\n switch (token.type) {\n case 'heading': {\n const headingToken = token as Tokens.Heading;\n sections.push({\n type: 'heading',\n level: headingToken.depth,\n content: headingToken.text,\n });\n break;\n }\n\n case 'paragraph': {\n const paraToken = token as Tokens.Paragraph;\n const text = paraToken.text;\n\n // Check for special patterns\n if (text.startsWith('> ๐Ÿ’ก') || text.startsWith('๐Ÿ’ก')) {\n sections.push({\n type: 'tip',\n content: text.replace(/^>\\s*๐Ÿ’ก\\s*/, '').replace(/^๐Ÿ’ก\\s*/, ''),\n });\n } else if (text.startsWith('> โš ๏ธ') || text.startsWith('โš ๏ธ')) {\n sections.push({\n type: 'warning',\n content: text.replace(/^>\\s*โš ๏ธ\\s*/, '').replace(/^โš ๏ธ\\s*/, ''),\n });\n } else {\n sections.push({\n type: 'paragraph',\n content: text,\n });\n }\n break;\n }\n\n case 'code': {\n const codeToken = token as Tokens.Code;\n sections.push({\n type: 'code',\n content: codeToken.text,\n language: codeToken.lang || 'text',\n });\n break;\n }\n\n case 'blockquote': {\n const bqToken = token as Tokens.Blockquote;\n const text = bqToken.text;\n\n if (text.includes('๐Ÿ’ก')) {\n sections.push({\n type: 'tip',\n content: text.replace(/๐Ÿ’ก\\s*(Tip:?)?\\s*/gi, ''),\n });\n } else if (text.includes('โš ๏ธ')) {\n sections.push({\n type: 'warning',\n content: text.replace(/โš ๏ธ\\s*(Warning:?)?\\s*/gi, ''),\n });\n } else {\n sections.push({\n type: 'blockquote',\n content: text,\n });\n }\n break;\n }\n\n case 'list': {\n const listToken = token as Tokens.List;\n const items = listToken.items.map((item) => item.text);\n sections.push({\n type: 'list',\n content: '',\n items,\n });\n break;\n }\n }\n }\n\n return sections;\n}\n\n/**\n * Render a single content section to styled string\n */\nexport function renderSection(section: ContentSection): string {\n switch (section.type) {\n case 'heading':\n if (section.level === 1) {\n return chalk.magenta.bold(`\\n${'โ•'.repeat(50)}\\n${section.content}\\n${'โ•'.repeat(50)}`);\n } else if (section.level === 2) {\n return chalk.cyan.bold(`\\n## ${section.content}`);\n } else {\n return chalk.white.bold(`\\n### ${section.content}`);\n }\n\n case 'paragraph':\n return section.content;\n\n case 'code':\n const langLabel = section.language ? chalk.gray(`[${section.language}]`) : '';\n return `${langLabel}\\n${chalk.yellow(section.content)}`;\n\n case 'tip':\n return chalk.green(`๐Ÿ’ก Tip: ${section.content}`);\n\n case 'warning':\n return chalk.yellow(`โš ๏ธ Warning: ${section.content}`);\n\n case 'blockquote':\n return chalk.gray.italic(`โ”‚ ${section.content.replace(/\\n/g, '\\nโ”‚ ')}`);\n\n case 'list':\n return (section.items || []).map((item) => ` โ€ข ${item}`).join('\\n');\n\n default:\n return section.content;\n }\n}\n\n/**\n * Split rendered content into lines for scrolling\n */\nexport function splitIntoLines(content: string, maxWidth: number = 70): string[] {\n const lines: string[] = [];\n\n for (const line of content.split('\\n')) {\n if (line.length <= maxWidth) {\n lines.push(line);\n } else {\n // Word wrap long lines\n const words = line.split(' ');\n let currentLine = '';\n\n for (const word of words) {\n if (currentLine.length + word.length + 1 <= maxWidth) {\n currentLine += (currentLine ? ' ' : '') + word;\n } else {\n if (currentLine) lines.push(currentLine);\n currentLine = word;\n }\n }\n\n if (currentLine) lines.push(currentLine);\n }\n }\n\n return lines;\n}\n","/**\n * Content files for Jai1 Guide\n *\n * โš ๏ธ AUTO-GENERATED FILE - DO NOT EDIT DIRECTLY\n *\n * This file is generated by scripts/bundle-guide-content.js\n * To modify content, edit the markdown files in content/topics/\n * Then run: pnpm run bundle:guide\n */\n\n/**\n * Available content topics\n */\nexport type ContentTopic = 'intro' | 'prompts' | 'rules' | 'skills' | 'workflows';\n\n/**\n * Topic display order\n */\nexport const topicOrder: ContentTopic[] = [\n 'intro',\n 'prompts',\n 'rules',\n 'skills',\n 'workflows',\n];\n\n/**\n * Content files indexed by topic\n */\nexport const contentFiles: Record<ContentTopic, string> = {\n 'intro': `---\ntitle: Giแป›i thiแป‡u Agentic Coding\nicon: ๐Ÿ“–\ndescription: Tแป•ng quan vแป AI-assisted development vร  Jai1 Framework\n---\n\n# Giแป›i thiแป‡u Agentic Coding\n\n## Agentic Coding lร  gรฌ?\n\nAgentic Coding (hay Agentic Software Development - ASD) lร  phฦฐฦกng phรกp phรกt triแปƒn phแบงn mแปm vแป›i sแปฑ hแป— trแปฃ cแปงa AI agents. AI khรดng chแป‰ suggest code, mร  cรฒn chแปง ฤ‘แป™ng:\n\n- ฤแปc vร  hiแปƒu codebase cแปงa bแบกn\n- Thแปฑc thi commands vร  scripts\n- Tแบกo, sแปญa, xรณa files\n- Chแบกy tests vร  debug\n- Tฦฐฦกng tรกc vแป›i terminal vร  browser\n\n## Jai1 Framework lร  gรฌ?\n\nJai1 lร  framework giรบp bแบกn lร m viแป‡c hiแป‡u quแบฃ vแป›i AI agents trong cรกc IDE:\n\n- **Cursor** - AI-first code editor\n- **Windsurf** - Codeium's agentic IDE\n- **Claude Code** - Anthropic's CLI agent\n- **GitHub Copilot Workspace** - GitHub's AI workspace\n- **Codeium** - Free AI coding assistant\n\nFramework cung cแบฅp:\n\n| Component | Mรด tแบฃ |\n|-----------|-------|\n| ๐Ÿ“œ Rules | Quy tแบฏc hฦฐแป›ng dแบซn AI hiแปƒu dแปฑ รกn |\n| ๐Ÿ”„ Workflows | Quy trรฌnh lร m viแป‡c step-by-step |\n| ๐Ÿ’ฌ Prompts | Templates prompts hiแป‡u quแบฃ |\n| ๐Ÿ›  Skills | MแปŸ rแป™ng khแบฃ nฤƒng AI |\n\n## Tแบกi sao cแบงn Jai1?\n\nAI agents mแบกnh mแบฝ, nhฦฐng cแบงn \"context\" ฤ‘แปƒ lร m viแป‡c hiแป‡u quแบฃ.\n\n**Khรดng cรณ context:**\n\n\\`\\`\\`\nUser: Tแบกo mแป™t API endpoint\nAI: Khรดng biแบฟt tech stack, conventions โ†’ Code generic, khรดng phรน hแปฃp\n\\`\\`\\`\n\n**Cรณ Jai1 Framework:**\n\n\\`\\`\\`\nUser: Tแบกo mแป™t API endpoint\nAI: ฤแปc rules โ†’ Biแบฟt dรนng HonoJS, cแบฅu trรบc thฦฐ mแปฅc, conventions\n โ†’ Tแปฑ ฤ‘แป™ng follow best practices\n\\`\\`\\`\n\n> ๐Ÿ’ก **Tip:** Context lร  chรฌa khรณa ฤ‘แปƒ AI lร m viแป‡c hiแป‡u quแบฃ!\n\n## Yรชu cแบงu mรดi trฦฐแปng\n\n### Windows\n\nโš ๏ธ **Bแบฏt buแป™c:** Cร i ฤ‘แบทt **Git for Windows** (bao gแป“m Git Bash)\n\nWorkflows cแปงa Jai1 sแปญ dแปฅng cรกc Unix commands (\\`grep\\`, \\`wc\\`, \\`xargs\\`...) khรดng cรณ sแบตn trรชn PowerShell/CMD.\n\n1. Download: https://git-scm.com/download/win\n2. Khi cร i ฤ‘แบทt, chแปn **\"Git Bash Here\"** context menu\n3. Trong VSCode, cแบฅu hรฌnh terminal mแบทc ฤ‘แป‹nh:\n \\`\\`\\`json\n {\n \"terminal.integrated.defaultProfile.windows\": \"Git Bash\"\n }\n \\`\\`\\`\n\n### macOS / Linux\n\nโœ… Sแบตn sร ng - Cรกc Unix commands ฤ‘รฃ cรณ sแบตn trong terminal.\n\n## Bแบฏt ฤ‘แบงu nhanh\n\n1. **KhแปŸi tแบกo Jai1** trong dแปฑ รกn:\n \\`\\`\\`bash\n jai1 init\n \\`\\`\\`\n\n2. **Cร i ฤ‘แบทt components** cแบงn thiแบฟt:\n \\`\\`\\`bash\n jai1 apply\n \\`\\`\\`\n\n3. **Sแปญ dแปฅng workflows** trong IDE:\n Gรต \\`@workflow\\` hoแบทc \\`/workflow\\` ฤ‘แปƒ trigger\n\n4. **Tรนy chแป‰nh rules** theo dแปฑ รกn:\n Sแปญa files trong \\`.jai1/rules/\\`\n\n> ๐Ÿ’ก **Tip:** Tiแบฟp theo, tรฌm hiแปƒu vแป Rules - nแปn tแบฃng quan trแปng nhแบฅt cแปงa Agentic Coding!\n`,\n\n 'prompts': `---\ntitle: Prompts\nicon: ๐Ÿ’ฌ\ndescription: Cรกch viแบฟt prompts hiแป‡u quแบฃ cho AI\n---\n\n# Prompts - Giao tiแบฟp hiแป‡u quแบฃ vแป›i AI\n\n## Prompts trong Agentic Coding\n\nTrong Agentic Coding, prompts khรดng chแป‰ lร  \"hแปi mแป™t cรขu\" - mร  lร  cรกch bแบกn ฤ‘แป‹nh hฦฐแป›ng AI thแปฑc hiแป‡n cรดng viแป‡c phแปฉc tแบกp.\n\nVแป›i Jai1 Framework, AI ฤ‘รฃ cรณ sแบตn context tแปซ Rules, nรชn prompts cแปงa bแบกn cรณ thแปƒ ngแบฏn gแปn vร  tแบญp trung vร o mแปฅc ฤ‘รญch.\n\n## Prompt Patterns hiแป‡u quแบฃ\n\n### 1. โšก Quick Task Pattern\n\n\\`\\`\\`\nTแบกo API endpoint cho user registration\n\\`\\`\\`\n\nโ†’ AI tแปฑ รกp dแปฅng conventions tแปซ rules\n\n### 2. ๐Ÿ“‹ Task with Context Pattern\n\n\\`\\`\\`\nTแบกo API endpoint cho user registration.\nBแบฃng users: id, email, password_hash, created_at\n\\`\\`\\`\n\nโ†’ Thรชm context cแปฅ thแปƒ cho task\n\n### 3. ๐Ÿ”„ Workflow Trigger Pattern\n\n\\`\\`\\`\n@workflow develop-feature: Implement user login\n\\`\\`\\`\n\nโ†’ Trigger toร n bแป™ workflow\n\n### 4. ๐ŸŽฏ Constraint Pattern\n\n\\`\\`\\`\nRefactor UserService. Giแปฏ nguyรชn public interface,\nchแป‰ extract private methods\n\\`\\`\\`\n\nโ†’ ฤแป‹nh rรต giแป›i hแบกn\n\n## DO vs DON'T\n\n### โœ… NรŠN:\n\n- Nรชu rรต mแปฅc ฤ‘รญch (\"ฤ‘แปƒ lร m gรฌ\")\n- Cung cแบฅp context cแปฅ thแปƒ\n- ฤแป‹nh scope rรต rร ng\n- Mention files/functions liรชn quan\n\n### โŒ KHร”NG NรŠN:\n\n- Viแบฟt quรก dร i (AI mแบฅt focus)\n- Yรชu cแบงu mฦก hแป“ (\"fix bugs\")\n- Giแบฃ ฤ‘แป‹nh AI biแบฟt context khรดng cรณ trong rules\n- Hแปi nhiแปu viแป‡c trong 1 prompt\n\n## Levels of Prompting\n\n### Level 1: Simple (cรณ Rules)\n\n\\`\\`\\`\nTแบกo model Product\n\\`\\`\\`\n\nโ†’ AI follow conventions tแปซ rules\n\n### Level 2: Guided (cรณ context)\n\n\\`\\`\\`\nTแบกo model Product vแป›i: name, price, category_id, status\n\\`\\`\\`\n\nโ†’ AI cรณ thรชm thรดng tin cแปฅ thแปƒ\n\n### Level 3: Workflow\n\n\\`\\`\\`\n@workflow: develop-feature Product CRUD\n\\`\\`\\`\n\nโ†’ AI chแบกy toร n bแป™ quy trรฌnh\n\n### Level 4: Collaborative\n\nChat multi-turn vแป›i AI ฤ‘แปƒ refine solution โ†’ Phรน hแปฃp vแป›i complex problems\n\n## Prompt Templates trong Jai1\n\nJai1 cung cแบฅp prompt templates cho cรกc use cases phแป• biแบฟn:\n\n| Template | Mรด tแบฃ |\n|----------|-------|\n| \\`prompts/code-review.md\\` | Review vร  improve code |\n| \\`prompts/debug-issue.md\\` | Debug vแป›i context ฤ‘แบงy ฤ‘แปง |\n| \\`prompts/explain-code.md\\` | Giแบฃi thรญch code cho team |\n| \\`prompts/refactor.md\\` | Refactor patterns |\n\n**Cร i ฤ‘แบทt:** \\`jai1 apply prompts/...\\`\n\n> ๐Ÿ’ก **Tip:** Prompts ngแบฏn + Rules tแป‘t = Kแบฟt quแบฃ chรญnh xรกc nhแบฅt!\n`,\n\n 'rules': `---\ntitle: IDE Rules\nicon: ๐Ÿ“œ\ndescription: Quy tแบฏc hฦฐแป›ng dแบซn AI hiแปƒu context dแปฑ รกn cแปงa bแบกn\n---\n\n# IDE Rules - Quy tแบฏc cho AI\n\n## Rules lร  gรฌ?\n\nRules lร  cรกc file Markdown chแปฉa hฦฐแป›ng dแบซn cho AI agent. Chรบng giรบp AI hiแปƒu:\n\n- **Tech stack** cแปงa dแปฑ รกn (Laravel, NestJS, React...)\n- **Coding conventions** (naming, patterns...)\n- **Cแบฅu trรบc thฦฐ mแปฅc** vร  architecture\n- **Business logic** vร  domain knowledge\n\n## Tรชn gแปi trong cรกc IDE\n\n| IDE | Tรชn gแปi | Thฦฐ mแปฅc |\n|-----|---------|---------|\n| Cursor | Rules | \\`.cursor/rules/\\` |\n| Windsurf | Rules | \\`.windsurf/rules/\\` |\n| Antigravity | Rules | \\`.agent/rules/\\` |\n| Claude Code | CLAUDE.md | \\`CLAUDE.md\\` (root) |\n| Copilot | Instructions | \\`.github/copilot/\\` |\n\n## Cแบฅu trรบc mแป™t Rule file\n\n\\`\\`\\`markdown\n---\ndescription: [Mรด tแบฃ ngแบฏn khi nร o rule nร y ฤ‘ฦฐแปฃc apply]\nglobs: [Optional - file patterns ฤ‘แปƒ auto-apply]\n---\n\n# Tรชn Rule\n\n## Purpose\nGiแบฃi thรญch mแปฅc ฤ‘รญch cแปงa rule\n\n## Conventions\nCรกc quy tแบฏc cแบงn tuรขn theo\n\n## Examples\nVรญ dแปฅ minh hแปa (nแบฟu cแบงn)\n\\`\\`\\`\n\n## Cรกc loแบกi Rules\n\n### 1. Global Rules (always active)\n\n- Conventions chung cแปงa dแปฑ รกn\n- Tech stack vร  dependencies\n- Coding style guidelines\n\n### 2. Contextual Rules (auto-applied by globs)\n\n- Frontend rules (cho \\`*.tsx\\`, \\`*.vue\\`...)\n- Backend rules (cho routes, controllers...)\n- Testing rules (cho \\`*.test.*\\`, \\`*.spec.*\\`)\n\n### 3. On-demand Rules\n\n- Gแปi khi cแบงn bแบฑng \\`@ruleName\\`\n- Vรญ dแปฅ: \\`@database-migration\\`, \\`@api-design\\`\n\n## Quแบฃn lรฝ Rules vแป›i CLI\n\n### Apply Rules Preset\n\n\\`\\`\\`bash\n# Apply preset cรณ sแบตn\njai1 rules apply nextjs-saas\n\n# Apply cho nhiแปu IDE cรนng lรบc\njai1 rules apply nextjs-saas --ides cursor,windsurf,agentsmd\n\\`\\`\\`\n\n### Sync Rules (NEW!)\n\nSau khi apply rules, bแบกn cรณ thแปƒ sync sang IDE khรกc hoแบทc regenerate:\n\n\\`\\`\\`bash\n# Interactive mode - chแปn IDE tแปซ menu\njai1 rules sync\n\n# Auto-detect active IDEs\njai1 rules sync --detect\n\n# Sync specific IDEs\njai1 rules sync --ides cursor,windsurf\n\n# Auto mode (no prompts)\njai1 rules sync -y\n\\`\\`\\`\n\n**Interactive Mode Flow:**\n1. Hiแปƒn thแป‹ current IDE configuration\n2. Smart suggestions dแปฑa trรชn project structure\n3. Checkbox ฤ‘แปƒ chแปn IDE (pre-selected current + suggested)\n4. Regenerate rules cho cรกc IDE ฤ‘รฃ chแปn\n\n### Restore Rules\n\n\\`\\`\\`bash\n# List available backups\njai1 rules restore --list\n\n# Restore from backup\njai1 rules restore\n\\`\\`\\`\n\n## Best Practices\n\n### โœ… NรŠN lร m:\n\n- Viแบฟt rules ngแบฏn gแปn, dแป… ฤ‘แปc\n- Focus vร o \"what to do\", khรดng phแบฃi \"how to do\"\n- Cแบญp nhแบญt rules khi dแปฑ รกn thay ฤ‘แป•i\n- Chia nhแป rules theo domain/feature\n- Edit rules trong \\`.jai1/rule-preset/\\` (source of truth)\n- Chแบกy \\`jai1 rules sync\\` sau khi edit ฤ‘แปƒ regenerate\n\n### โŒ KHร”NG NรŠN:\n\n- Viแบฟt rules quรก dร i (>1000 tokens)\n- Copy-paste toร n bแป™ documentation\n- Include code examples quรก chi tiแบฟt\n- Hardcode paths hoแบทc values\n- Edit trแปฑc tiแบฟp trong \\`.cursor/rules/\\` (sแบฝ bแป‹ overwrite khi sync)\n\n> ๐Ÿ’ก **Tip:** Dรนng \\`jai1 rules apply\\` ฤ‘แปƒ cร i ฤ‘แบทt rules mแบซu cho tech stack cแปงa bแบกn!\n`,\n\n 'skills': `---\ntitle: Skills\nicon: ๐Ÿ› \ndescription: MแปŸ rแป™ng khแบฃ nฤƒng AI vแป›i skills chuyรชn biแป‡t\n---\n\n# Skills - MแปŸ rแป™ng khแบฃ nฤƒng AI\n\n## Skills lร  gรฌ?\n\nSkills lร  \"kแปน nฤƒng\" chuyรชn biแป‡t mร  AI cรณ thแปƒ hแปc vร  sแปญ dแปฅng. Mแป—i skill lร  mแป™t gรณi hฦฐแป›ng dแบซn chi tiแบฟt cho mแป™t tรกc vแปฅ cแปฅ thแปƒ.\n\n**Khรกc vแป›i Rules vร  Workflows:**\n\n| Component | Mรด tแบฃ | Vรญ dแปฅ |\n|-----------|-------|-------|\n| Rules | Context chung | \"Dแปฑ รกn dรนng Laravel, naming convention...\" |\n| Workflows | Quy trรฌnh | \"ฤแปƒ phรกt triแปƒn feature, lร m theo bฦฐแป›c 1-2-3...\" |\n| Skills | Kแปน nฤƒng cแปฅ thแปƒ | \"ฤแปƒ generate commit message, phรขn tรญch diff...\" |\n\n## Cแบฅu trรบc mแป™t Skill\n\n\\`\\`\\`\nskills/\nโ””โ”€โ”€ skill-name/\n โ”œโ”€โ”€ SKILL.md # Main instruction file\n โ”œโ”€โ”€ scripts/ # Scripts hแป— trแปฃ (optional)\n โ”œโ”€โ”€ references/ # Reference materials (optional)\n โ””โ”€โ”€ assets/ # Assets nhฦฐ templates (optional)\n\\`\\`\\`\n\n### SKILL.md format\n\n\\`\\`\\`markdown\n---\nname: skill-name\ndescription: Mรด tแบฃ ngแบฏn\ntriggers: [patterns kรญch hoแบกt skill]\n---\n\n## Purpose\nMแปฅc ฤ‘รญch cแปงa skill\n\n## Steps\nCรกc bฦฐแป›c thแปฑc hiแป‡n\n\n## Examples\nVรญ dแปฅ minh hแปa\n\\`\\`\\`\n\n## Skills cรณ sแบตn trong Jai1\n\n### ๐ŸŽฏ Development Skills\n\n| Skill | Mรด tแบฃ |\n|-------|-------|\n| \\`gen-commit-message\\` | Tแบกo commit message tแปซ staged changes |\n| \\`gen-prd\\` | Generate Product Requirements Document |\n| \\`skill-creator\\` | Hฦฐแป›ng dแบซn tแบกo skill mแป›i |\n\n### ๐Ÿ–ผ Media Skills\n\n| Skill | Mรด tแบฃ |\n|-------|-------|\n| \\`merge-mp4-files\\` | Merge video files vแป›i ffmpeg |\n| \\`vid-scene-gen\\` | Generate video scene prompts |\n\n### ๐Ÿ“ Documentation Skills\n\n| Skill | Mรด tแบฃ |\n|-------|-------|\n| \\`gen-frd\\` | Generate Functional Requirements Doc |\n| \\`gen-tdd\\` | Generate Technical Design Doc |\n\n## Cรกch sแปญ dแปฅng Skills\n\n### 1. Trigger bแบฑng pattern\n\n\\`\\`\\`\nskill:gen-commit-message\n\\`\\`\\`\n\nhoแบทc\n\n\\`\\`\\`\nDรนng skill gen-commit-message ฤ‘แปƒ tแบกo message\n\\`\\`\\`\n\n### 2. Kแบฟt hแปฃp vแป›i Workflow\n\nWorkflows cรณ thแปƒ gแปi skills bรชn trong cรกc phase\n\n### 3. Direct call trong chat\n\n\\`\\`\\`\n@skill/gen-commit-message\n\\`\\`\\`\n\n(tรนy IDE hแป— trแปฃ)\n\n## Tแบกo Skill mแป›i\n\nDรนng workflow \\`skill-creator\\`:\n\n1. Xรกc ฤ‘แป‹nh use case cแปฅ thแปƒ\n2. Viแบฟt \\`SKILL.md\\` vแป›i format chuแบฉn\n3. Thรชm \\`scripts/references\\` nแบฟu cแบงn\n4. Test vแป›i AI\n\n### Best Practices\n\n**โœ… NรŠN:**\n\n- Skill nรชn focused vร o 1 task\n- Steps rรต rร ng, actionable\n- Cรณ examples minh hแปa\n\n**โŒ KHร”NG NรŠN:**\n\n- Lร m skill quรก generic\n- Trแป™n nhiแปu tรกc vแปฅ khรกc nhau\n\n> ๐Ÿ’ก **Tip:** Skills giแป‘ng nhฦฐ teaching AI mแป™t kแปน nฤƒng mแป›i - cร ng chi tiแบฟt, AI cร ng lร m tแป‘t!\n`,\n\n 'workflows': `---\ntitle: Workflows\nicon: ๐Ÿ”„\ndescription: \"Quy trรฌnh lร m viแป‡c step-by-step (Cursor: Commands)\"\n---\n\n# Workflows - Quy trรฌnh lร m viแป‡c\n\n## Workflows lร  gรฌ?\n\nWorkflows lร  tแบญp hแปฃp cรกc bฦฐแป›c tuแบงn tแปฑ ฤ‘แปƒ AI thแปฑc hiแป‡n mแป™t tรกc vแปฅ phแปฉc tแบกp. Thay vรฌ viแบฟt prompt dร i dรฒng, bแบกn chแป‰ cแบงn trigger workflow.\n\n**Vรญ dแปฅ:** \\`/develop-feature\\`\n\nโ†’ AI tแปฑ ฤ‘แป™ng: ฤ‘แปc task โ†’ plan โ†’ code โ†’ test โ†’ commit\n\n## Tรชn gแปi trong cรกc IDE\n\n| IDE | Tรชn gแปi | Cรกch trigger |\n|-----|---------|--------------|\n| Cursor | Commands | \\`/\\` hoแบทc \\`@command\\` |\n| Windsurf | Workflows | \\`@workflow\\` |\n| Antigravity | Workflows | \\`/workflow\\` |\n| Claude Code | (Manual) | Gแปi CLAUDE.md |\n\n## Cแบฅu trรบc Workflow file\n\n\\`\\`\\`markdown\n---\ndescription: [Mรด tแบฃ ngแบฏn vแป workflow]\n---\n\n# Tรชn Workflow\n\n## โš ๏ธ CRITICAL RULES\nCรกc quy tแบฏc bแบฏt buแป™c phแบฃi tuรขn theo\n\n## ๐ŸŽฏ INPUT\nNhแปฏng gรฌ cแบงn cรณ trฦฐแป›c khi bแบฏt ฤ‘แบงu\n\n## ๐Ÿ”„ WORKFLOW PHASES\n\n### Phase 1: [Tรชn phase]\n- Step-by-step instructions\n- Commands to run\n- Validations to check\n\n### Phase 2: [Tรชn phase]\n...\n\n## โœ… QUALITY CHECKLIST\nChecklist kiแปƒm tra khi hoร n thร nh\n\\`\\`\\`\n\n## Workflows cรณ sแบตn trong Jai1\n\n| Workflow | Mรด tแบฃ |\n|----------|-------|\n| \\`/develop-feature\\` | Phรกt triแปƒn feature mแป›i vแป›i auto-implement |\n| \\`/fix-feature\\` | Sแปญa bugs vแป›i root cause analysis |\n| \\`/commit-it\\` | Safe commit vแป›i security checks |\n| \\`/gen-single-docs\\` | Generate documentation cho feature |\n| \\`/setup-honojs\\` | Setup HonoJS + Drizzle cho dแปฑ รกn |\n| \\`/create-prd\\` | Tแบกo Product Requirements Document |\n\n## ฤแบทc ฤ‘iแปƒm cแปงa Workflow tแป‘t\n\n### โœ… Continuous Execution\n\nAI chแบกy liแปn mแบกch, khรดng dแปซng hแปi user trแปซ khi thแบญt sแปฑ cแบงn\n\n### โœ… Progress Tracking\n\n- Tแบกo \\`todo.md\\` ฤ‘แปƒ track tiแบฟn ฤ‘แป™\n- Hแป— trแปฃ auto-resume tแปซ checkpoint\n\n### โœ… Quality Gates\n\n- Cรณ validation แปŸ mแป—i phase\n- Checklist kiแปƒm tra cuแป‘i cรนng\n\n### โœ… Error Handling\n\n- Xแปญ lรฝ errors gracefully\n- Cรณ rollback plan khi thแบฅt bแบกi\n\n> ๐Ÿ’ก **Tip:** Workflows mแบกnh nhแบฅt khi kแบฟt hแปฃp vแป›i Rules - AI sแบฝ follow cแบฃ quy trรฌnh lแบซn conventions!\n`,\n};\n\n/**\n * Check if a string is a valid topic\n */\nexport function isValidTopic(topic: string): topic is ContentTopic {\n return topic in contentFiles;\n}\n","/**\n * Chat Command\n * Interactive chat with Jai1 LLM Proxy\n * Default: Web browser mode | Alternative: Terminal TUI mode\n */\nimport { Command } from 'commander';\nimport React from 'react';\nimport { render } from 'ink';\nimport { ConfigService } from '../services/config.service.js';\nimport { LlmProxyService } from '../services/llm-proxy.service.js';\nimport { ChatApp } from '../ui/llm/LlmApp.js';\nimport { ValidationError } from '../errors/index.js';\nimport { createWebChatServer } from '../server/web-chat-server.js';\n\ninterface ChatCommandOptions {\n model?: string;\n terminal?: boolean;\n port?: string;\n noOpen?: boolean;\n}\n\n/**\n * Handle terminal chat command (TUI mode)\n */\nasync function handleTerminalChat(options: ChatCommandOptions): Promise<void> {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n const service = new LlmProxyService(config);\n\n // Render fullscreen app\n const { waitUntilExit, clear } = render(\n React.createElement(ChatApp, {\n service,\n initialModel: options.model,\n }),\n {\n // Enable fullscreen mode - clears terminal on exit\n exitOnCtrlC: false, // We handle exit via Esc\n }\n );\n\n await waitUntilExit();\n\n // Clear screen on exit for clean terminal\n clear();\n}\n\n/**\n * Handle web chat command (browser mode) - DEFAULT\n */\nasync function handleWebChat(options: ChatCommandOptions): Promise<void> {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n const port = options.port ? parseInt(options.port, 10) : undefined;\n\n // Create and start web server\n const server = createWebChatServer({\n config,\n port,\n });\n\n try {\n const { port: actualPort, sessionToken } = await server.start();\n const url = server.getUrl();\n\n // Open browser unless --no-open is specified\n if (!options.noOpen) {\n const { default: open } = await import('open');\n await open(url);\n console.log('๐ŸŒ Browser opened with chat interface');\n } else {\n console.log(`\\n๐Ÿ“‹ Open this URL in your browser:\\n ${url}\\n`);\n }\n\n console.log('Press Ctrl+C to stop the server\\n');\n\n // Keep server running until Ctrl+C\n await new Promise<void>((resolve) => {\n process.on('SIGINT', async () => {\n console.log('\\n\\n๐Ÿ›‘ Shutting down...');\n await server.stop();\n resolve();\n });\n\n process.on('SIGTERM', async () => {\n await server.stop();\n resolve();\n });\n });\n } catch (error) {\n if (error instanceof Error && error.message.includes('Port')) {\n throw new ValidationError(error.message + ' Try specifying a different port with --port.');\n }\n throw error;\n }\n}\n\n/**\n * Handle chat command\n * Default: Web mode | --terminal: Terminal TUI mode\n */\nasync function handleChatCommand(options: ChatCommandOptions): Promise<void> {\n if (options.terminal) {\n await handleTerminalChat(options);\n } else {\n await handleWebChat(options);\n }\n}\n\n/**\n * Create chat command\n */\nexport function createChatCommand(): Command {\n const cmd = new Command('chat')\n .description('AI chat with Jai1 LLM Proxy (default: web browser)')\n .option('--model <model>', 'Initial model to use (e.g., gpt-4o, claude-3-opus)')\n .option('-t, --terminal', 'Use terminal TUI mode instead of web browser')\n .option('--port <port>', 'Port for web server (default: auto-find available port)')\n .option('--no-open', \"Don't auto-open browser (web mode only)\")\n .action(async (options: ChatCommandOptions) => {\n await handleChatCommand(options);\n });\n\n return cmd;\n}\n","/**\n * LLM Proxy Service\n * Client for interacting with Jai1 LLM proxy API\n */\nimport type { Jai1Config } from '../types/framework.types.js';\nimport type {\n ModelsResponse,\n UserLimits,\n UsageStats,\n CompletionMessage,\n ChatCompletionChunk,\n ModelWithUsage,\n} from '../types/llm.types.js';\n\nexport class LlmProxyService {\n private readonly baseUrl: string;\n private readonly apiKey: string;\n\n constructor(config: Jai1Config) {\n // Remove trailing slash if present\n this.baseUrl = config.apiUrl.replace(/\\/$/, '');\n this.apiKey = config.accessKey;\n }\n\n /**\n * Get the base URL for the LLM proxy (OpenAI-compatible endpoint)\n */\n getBaseUrl(): string {\n return `${this.baseUrl}/v1`;\n }\n\n /**\n * Get the API key\n */\n getApiKey(): string {\n return this.apiKey;\n }\n\n /**\n * Fetch available models\n */\n async getModels(): Promise<ModelsResponse> {\n const response = await fetch(`${this.baseUrl}/v1/models`, {\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch models: ${response.statusText}`);\n }\n\n const result = await response.json();\n return result ?? { data: [] };\n }\n\n /**\n * Fetch user limits\n */\n async getLimits(): Promise<UserLimits> {\n const response = await fetch(`${this.baseUrl}/v1/me/limits`, {\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch limits: ${response.statusText}`);\n }\n\n const result = await response.json();\n return result?.data ?? { effectiveAllowedModels: [], effectiveRateLimits: {} };\n }\n\n /**\n * Fetch usage statistics\n */\n async getUsage(days = 7): Promise<UsageStats> {\n const response = await fetch(`${this.baseUrl}/v1/me/usage?days=${days}`, {\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch usage: ${response.statusText}`);\n }\n\n const result = await response.json();\n return result ?? { data: [] };\n }\n\n /**\n * Get models with usage information\n */\n async getModelsWithUsage(): Promise<ModelWithUsage[]> {\n const [modelsRes, limits, usage] = await Promise.all([\n this.getModels(),\n this.getLimits(),\n this.getUsage(1), // Today only\n ]);\n\n // Use GMT+7 timezone to match API date recording\n const today = new Date().toLocaleDateString('en-CA', { timeZone: 'Asia/Ho_Chi_Minh' });\n const modelsData = modelsRes.data ?? [];\n\n return modelsData.map((model) => {\n const allowed = limits.effectiveAllowedModels?.includes(model.id) ?? false;\n const dailyLimit = limits.effectiveRateLimits?.[model.id] ?? limits.effectiveRateLimits?.[model.id.toLowerCase()];\n\n // Find usage record - try exact match first, then case-insensitive\n const usageData = usage.data ?? [];\n const usageRecord = usageData.find(\n (u) => u.model === model.id && u.date === today\n ) || usageData.find(\n (u) => u.model.toLowerCase() === model.id.toLowerCase() && u.date === today\n );\n const usedToday = usageRecord?.count || 0;\n\n return {\n ...model,\n allowed,\n dailyLimit,\n usedToday,\n };\n });\n }\n\n /**\n * Non-streaming chat completion (for translation and complete responses)\n * @returns Complete response content\n */\n async chat(\n messages: CompletionMessage[],\n model: string,\n signal?: AbortSignal\n ): Promise<string> {\n const response = await fetch(`${this.baseUrl}/v1/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n model,\n messages,\n stream: false,\n }),\n signal,\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Chat completion failed: ${error}`);\n }\n\n const result = await response.json();\n return result.choices[0]?.message?.content || '';\n }\n\n /**\n * Stream chat completion\n * @yields Streamed text chunks\n */\n async *chatStream(\n messages: CompletionMessage[],\n model: string,\n signal?: AbortSignal\n ): AsyncGenerator<string> {\n const response = await fetch(`${this.baseUrl}/v1/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n model,\n messages,\n stream: true,\n }),\n signal,\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Chat completion failed: ${error}`);\n }\n\n if (!response.body) {\n throw new Error('Response body is null');\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n // Append new chunk to buffer\n buffer += decoder.decode(value, { stream: true });\n\n // Process only complete lines (ending with \\n)\n const lines = buffer.split('\\n');\n // Keep the last incomplete line in buffer\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const trimmedLine = line.trim();\n if (!trimmedLine) continue;\n\n if (trimmedLine.startsWith('data: ')) {\n const data = trimmedLine.slice(6);\n if (data === '[DONE]') {\n return;\n }\n\n try {\n const parsed = JSON.parse(data) as ChatCompletionChunk;\n const content = parsed.choices[0]?.delta?.content;\n if (content) {\n yield content;\n }\n } catch (e) {\n // Skip malformed SSE chunk\n }\n }\n }\n }\n\n // Process any remaining content in buffer\n if (buffer.trim()) {\n const trimmedLine = buffer.trim();\n if (trimmedLine.startsWith('data: ')) {\n const data = trimmedLine.slice(6);\n if (data !== '[DONE]') {\n try {\n const parsed = JSON.parse(data) as ChatCompletionChunk;\n const content = parsed.choices[0]?.delta?.content;\n if (content) {\n yield content;\n }\n } catch (e) {\n // Skip malformed SSE chunk\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n /**\n * Generate sample cURL command\n */\n generateCurlSample(model: string): string {\n return `curl ${this.getBaseUrl()}/chat/completions \\\\\n -H \"Authorization: Bearer ${this.apiKey.slice(0, 12)}...\" \\\\\n -H \"Content-Type: application/json\" \\\\\n -d '{\n \"model\": \"${model}\",\n \"messages\": [\n {\"role\": \"user\", \"content\": \"Hello!\"}\n ]\n }'`;\n }\n\n /**\n * Generate full cURL command with actual API key\n */\n generateFullCurlSample(model: string): string {\n return `curl ${this.getBaseUrl()}/chat/completions \\\\\n -H \"Authorization: Bearer ${this.apiKey}\" \\\\\n -H \"Content-Type: application/json\" \\\\\n -d '{\n \"model\": \"${model}\",\n \"messages\": [\n {\"role\": \"user\", \"content\": \"Hello!\"}\n ]\n }'`;\n }\n}\n","/**\n * ChatApp - Main LLM Proxy Chat Application\n * Interactive TUI for chatting with LLM API\n * Simple layout to avoid re-render flickering\n */\nimport React, { useState, useEffect, useMemo, useCallback, useRef } from 'react';\nimport { Box, Text, useInput, useApp, useStdout } from 'ink';\nimport Spinner from 'ink-spinner';\nimport { LlmProxyService } from '../../services/llm-proxy.service.js';\nimport { useChat } from './hooks/useChat.js';\nimport { useLlmApi } from './hooks/useLlmApi.js';\nimport { ChatPanel } from './components/ChatPanel.js';\nimport { ModelSelector } from './components/ModelSelector.js';\nimport { SlashCommand } from './components/SlashCommandMenu.js';\n\n// Available slash commands - defined outside component to prevent recreation\nconst SLASH_COMMANDS: SlashCommand[] = [\n { name: 'model', description: 'Change the AI model', aliases: ['m'] },\n { name: 'stats', description: 'Show model usage statistics', aliases: ['s'] },\n { name: 'quit', description: 'Exit the chat', aliases: ['q', 'exit'] },\n];\n\ninterface ChatAppProps {\n service: LlmProxyService;\n initialModel?: string;\n}\n\ntype ViewType = 'loading' | 'chat' | 'model' | 'stats' | 'error';\n\nexport const ChatApp: React.FC<ChatAppProps> = ({ service, initialModel }) => {\n const { exit } = useApp();\n const { stdout } = useStdout();\n\n // Capture terminal inner height once on mount (subtract header + footer = ~6 lines)\n const contentHeight = useRef(Math.max(10, (stdout?.rows || 24) - 6));\n\n // Core state\n const [currentView, setCurrentView] = useState<ViewType>('loading');\n const [showSlashMenu, setShowSlashMenu] = useState(false);\n const [slashMenuIndex, setSlashMenuIndex] = useState(0);\n const [inputValue, setInputValue] = useState('');\n const [selectedModel, setSelectedModel] = useState<string>('');\n\n // API data\n const { models, loading, error, refetch } = useLlmApi(service);\n\n // Chat state\n const { messages, isStreaming, sendMessage } = useChat(service);\n\n // Set initial model when loaded, or show error\n useEffect(() => {\n if (error && !loading) {\n setCurrentView('error');\n return;\n }\n if (models.length > 0 && !selectedModel) {\n const first = models.find((m) => m.allowed);\n if (first) {\n setSelectedModel(initialModel || first.id);\n setCurrentView('chat');\n }\n }\n }, [models, selectedModel, initialModel, error, loading]);\n\n // Filter commands based on input\n const filteredCommands = useMemo(() => {\n if (!inputValue.startsWith('/')) return SLASH_COMMANDS;\n const filter = inputValue.slice(1).toLowerCase();\n return SLASH_COMMANDS.filter(\n (cmd) => cmd.name.includes(filter) || cmd.aliases?.some((a) => a.includes(filter))\n );\n }, [inputValue]);\n\n // Handlers\n const cycleModel = useCallback(() => {\n const allowed = models.filter((m) => m.allowed);\n if (allowed.length === 0) return;\n const idx = allowed.findIndex((m) => m.id === selectedModel);\n setSelectedModel(allowed[(idx + 1) % allowed.length]!.id);\n }, [models, selectedModel]);\n\n const execCommand = useCallback((cmd: string) => {\n const c = cmd.toLowerCase().replace(/^\\//, '');\n if (c === 'model' || c === 'm') { setCurrentView('model'); return true; }\n if (c === 'stats' || c === 's') { setCurrentView('stats'); refetch(); return true; }\n if (c === 'quit' || c === 'q' || c === 'exit') { exit(); return true; }\n return false;\n }, [refetch, exit]);\n\n // Keyboard input\n useInput((input, key) => {\n if (showSlashMenu) {\n if (key.upArrow) { setSlashMenuIndex((i) => Math.max(0, i - 1)); return; }\n if (key.downArrow) { setSlashMenuIndex((i) => Math.min(filteredCommands.length - 1, i + 1)); return; }\n if (key.return && filteredCommands[slashMenuIndex]) {\n setShowSlashMenu(false);\n execCommand(filteredCommands[slashMenuIndex].name);\n setInputValue('');\n return;\n }\n }\n if (key.escape) {\n if (showSlashMenu) { setShowSlashMenu(false); setInputValue(''); }\n else if (currentView !== 'chat' && currentView !== 'loading' && currentView !== 'error') { setCurrentView('chat'); }\n else { exit(); }\n return;\n }\n // Allow retry on error view with Enter or 'r'\n if (currentView === 'error' && (key.return || input === 'r')) {\n setCurrentView('loading');\n refetch();\n return;\n }\n if (key.tab && currentView === 'chat' && !showSlashMenu && !isStreaming) {\n cycleModel();\n }\n }, { isActive: true });\n\n const onInputChange = useCallback((v: string) => {\n setInputValue(v);\n const show = v.startsWith('/');\n setShowSlashMenu(show);\n if (show && v === '/') setSlashMenuIndex(0);\n }, []);\n\n const onSubmit = useCallback((v: string) => {\n const t = v.trim();\n setShowSlashMenu(false);\n if (t.startsWith('/') && execCommand(t)) { setInputValue(''); return; }\n if (t && !isStreaming && selectedModel) { sendMessage(t, selectedModel); setInputValue(''); }\n }, [execCommand, isStreaming, selectedModel, sendMessage]);\n\n const onSelectModel = useCallback((id: string) => {\n setSelectedModel(id);\n setCurrentView('chat');\n }, []);\n\n // Render stats\n const statsView = useMemo(() => {\n const allowed = models.filter((m) => m.allowed);\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"cyan\" padding={1}>\n <Text bold color=\"cyan\">๐Ÿ“Š Model Usage Statistics</Text>\n {allowed.map((m) => {\n const limit = m.dailyLimit ?? 0;\n const used = m.usedToday ?? 0;\n const pct = limit > 0 ? Math.round((used / limit) * 100) : 0;\n const bar = 'โ–ˆ'.repeat(Math.round(pct / 5)) + 'โ–‘'.repeat(20 - Math.round(pct / 5));\n return (\n <Box key={m.id} flexDirection=\"column\">\n <Text color={m.id === selectedModel ? 'yellow' : 'white'}>\n {m.id === selectedModel ? 'โ–บ ' : ' '}{m.id}\n </Text>\n <Text color={pct > 80 ? 'red' : pct > 50 ? 'yellow' : 'green'}>\n {' '}{bar} <Text dimColor>{used}/{limit}</Text>\n </Text>\n </Box>\n );\n })}\n <Text dimColor>[Esc] Back</Text>\n </Box>\n );\n }, [models, selectedModel]);\n\n // Footer text\n const footer = currentView === 'error'\n ? '[Enter/r] Retry โ€ข [Esc] Quit'\n : currentView === 'model' || currentView === 'stats'\n ? '[โ†‘โ†“] Navigate โ€ข [Enter] Select โ€ข [Esc] Back'\n : showSlashMenu\n ? '[โ†‘โ†“] Navigate โ€ข [Enter] Select โ€ข [Esc] Cancel'\n : '[Tab] Next Model โ€ข [/] Commands โ€ข [Esc] Quit';\n\n return (\n <Box flexDirection=\"column\">\n {/* Header */}\n <Box borderStyle=\"double\" borderColor=\"magenta\" paddingX={1}>\n <Text bold color=\"magenta\">๐Ÿค– Jai1 Chat</Text>\n <Box flexGrow={1} />\n <Text dimColor>Model: </Text>\n <Text color=\"yellow\" bold>{selectedModel || '...'}</Text>\n </Box>\n\n {/* Content */}\n {currentView === 'loading' ? (\n <Box padding={2} minHeight={contentHeight.current} alignItems=\"center\" justifyContent=\"center\">\n <Text><Spinner type=\"dots\" /> Loading...</Text>\n </Box>\n ) : currentView === 'error' ? (\n <Box padding={2} minHeight={contentHeight.current} alignItems=\"center\" justifyContent=\"center\" flexDirection=\"column\">\n <Text color=\"red\" bold>Connection Error</Text>\n <Text color=\"red\">{error}</Text>\n <Text dimColor> </Text>\n <Text dimColor>Press Enter or 'r' to retry</Text>\n </Box>\n ) : currentView === 'model' ? (\n <Box padding={1} minHeight={contentHeight.current} justifyContent=\"center\" alignItems=\"center\">\n <ModelSelector\n models={models}\n currentModel={selectedModel}\n onSelect={onSelectModel}\n onCancel={() => setCurrentView('chat')}\n />\n </Box>\n ) : currentView === 'stats' ? (\n <Box padding={1} minHeight={contentHeight.current} justifyContent=\"center\" alignItems=\"center\">\n {statsView}\n </Box>\n ) : (\n <ChatPanel\n messages={messages}\n isStreaming={isStreaming}\n inputValue={inputValue}\n onInputChange={onInputChange}\n onSubmit={onSubmit}\n inputFocused={!showSlashMenu}\n showSlashMenu={showSlashMenu}\n slashCommands={filteredCommands}\n slashMenuIndex={slashMenuIndex}\n minHeight={contentHeight.current}\n />\n )}\n\n {/* Footer */}\n <Box borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text dimColor>{footer}</Text>\n </Box>\n </Box>\n );\n};\n","/**\n * useChat hook\n * Manages chat state and streaming responses\n */\nimport { useState, useCallback } from 'react';\nimport { LlmProxyService } from '../../../services/llm-proxy.service.js';\nimport type { ChatMessage, CompletionMessage } from '../../../types/llm.types.js';\n\nexport function useChat(service: LlmProxyService) {\n const [messages, setMessages] = useState<ChatMessage[]>([]);\n const [isStreaming, setIsStreaming] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const sendMessage = useCallback(\n async (content: string, model: string) => {\n if (!content.trim() || isStreaming) return;\n\n // Add user message\n const userMessage: ChatMessage = {\n id: `user-${Date.now()}`,\n role: 'user',\n content: content.trim(),\n timestamp: new Date(),\n };\n\n setMessages((prev) => [...prev, userMessage]);\n setError(null);\n setIsStreaming(true);\n\n // Create assistant message placeholder\n const assistantMessageId = `assistant-${Date.now()}`;\n const assistantMessage: ChatMessage = {\n id: assistantMessageId,\n role: 'assistant',\n content: '',\n timestamp: new Date(),\n };\n\n setMessages((prev) => [...prev, assistantMessage]);\n\n try {\n // Convert chat messages to completion messages\n const completionMessages: CompletionMessage[] = [\n ...messages.map((m) => ({\n role: m.role,\n content: m.content,\n })),\n {\n role: 'user' as const,\n content: content.trim(),\n },\n ];\n\n // Stream response\n let fullContent = '';\n for await (const chunk of service.chatStream(completionMessages, model)) {\n fullContent += chunk;\n\n // Update message content incrementally\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === assistantMessageId\n ? { ...msg, content: fullContent }\n : msg\n )\n );\n }\n\n setIsStreaming(false);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Unknown error';\n setError(errorMessage);\n\n // Update last message with error\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === assistantMessageId\n ? { ...msg, content: `Error: ${errorMessage}` }\n : msg\n )\n );\n\n setIsStreaming(false);\n }\n },\n [service, messages, isStreaming]\n );\n\n const clearMessages = useCallback(() => {\n setMessages([]);\n setError(null);\n }, []);\n\n return {\n messages,\n isStreaming,\n error,\n sendMessage,\n clearMessages,\n };\n}\n","/**\n * useLlmApi hook\n * Manages LLM API data fetching and state\n * Only fetches once on mount - use refetch for manual updates\n */\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport { LlmProxyService } from '../../../services/llm-proxy.service.js';\nimport type { ModelWithUsage, UserLimits, UsageStats } from '../../../types/llm.types.js';\n\ninterface LlmApiState {\n models: ModelWithUsage[];\n limits: UserLimits | null;\n usage: UsageStats | null;\n loading: boolean;\n error: string | null;\n}\n\nexport function useLlmApi(service: LlmProxyService) {\n const [state, setState] = useState<LlmApiState>({\n models: [],\n limits: null,\n usage: null,\n loading: true,\n error: null,\n });\n\n // Track if we've already fetched\n const hasFetched = useRef(false);\n\n const fetchData = useCallback(async (showLoading = false) => {\n // Show loading and clear error on fetch\n if (showLoading) {\n setState((prev) => ({ ...prev, loading: true, error: null }));\n }\n\n try {\n const [models, limits, usage] = await Promise.all([\n service.getModelsWithUsage(),\n service.getLimits(),\n service.getUsage(7),\n ]);\n\n setState({\n models,\n limits,\n usage,\n loading: false,\n error: null,\n });\n } catch (err) {\n setState((prev) => ({\n ...prev,\n loading: false,\n error: err instanceof Error ? err.message : 'Unknown error',\n }));\n }\n }, [service]);\n\n // Only fetch once on mount\n useEffect(() => {\n if (!hasFetched.current) {\n hasFetched.current = true;\n fetchData(true);\n }\n }, []);\n\n // Refetch with loading state (for retry after error)\n const refetch = useCallback(() => {\n fetchData(true);\n }, [fetchData]);\n\n return {\n ...state,\n refetch,\n };\n}\n","/**\n * ChatPanel component\n * Simple, stable layout\n */\nimport React, { memo } from 'react';\nimport { Box, Text } from 'ink';\nimport Spinner from 'ink-spinner';\nimport { MessageItem } from './MessageItem.js';\nimport { InputBox } from './InputBox.js';\nimport { SlashCommand } from './SlashCommandMenu.js';\nimport type { ChatMessage } from '../../../types/llm.types.js';\n\ninterface ChatPanelProps {\n messages: ChatMessage[];\n isStreaming: boolean;\n inputValue: string;\n onInputChange: (value: string) => void;\n onSubmit: (value: string) => void;\n inputFocused?: boolean;\n showSlashMenu?: boolean;\n slashCommands?: SlashCommand[];\n slashMenuIndex?: number;\n minHeight?: number;\n}\n\n// Memoized message list to prevent re-renders\nconst MessageList = memo(({ messages }: { messages: ChatMessage[] }) => {\n const visible = messages.slice(-8);\n const hidden = messages.length - visible.length;\n\n if (visible.length === 0) {\n return (\n <Box flexDirection=\"column\" alignItems=\"center\" padding={1}>\n <Text dimColor>Start a conversation...</Text>\n <Text dimColor>Type / for commands</Text>\n </Box>\n );\n }\n\n return (\n <>\n {hidden > 0 && <Text dimColor>({hidden} earlier)</Text>}\n {visible.map((m) => <MessageItem key={m.id} message={m} />)}\n </>\n );\n});\n\n// Memoized slash menu\nconst SlashMenu = memo(({ commands, index }: { commands: SlashCommand[]; index: number }) => (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"cyan\" paddingX={1}>\n <Text bold color=\"cyan\">Commands</Text>\n {commands.map((cmd, i) => (\n <Text\n key={cmd.name}\n backgroundColor={i === index ? 'cyan' : undefined}\n color={i === index ? 'black' : 'white'}\n >\n {i === index ? 'โ€บ ' : ' '}/{cmd.name} - {cmd.description}\n </Text>\n ))}\n </Box>\n));\n\nexport const ChatPanel: React.FC<ChatPanelProps> = ({\n messages,\n isStreaming,\n inputValue,\n onInputChange,\n onSubmit,\n inputFocused = true,\n showSlashMenu = false,\n slashCommands = [],\n slashMenuIndex = 0,\n minHeight = 15,\n}) => {\n // Subtract space for input box (~3 lines) and slash menu if shown (~5 lines)\n const messagesMinHeight = Math.max(5, minHeight - 4 - (showSlashMenu ? 5 : 0));\n\n return (\n <Box flexDirection=\"column\">\n {/* Messages */}\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" padding={1} minHeight={messagesMinHeight}>\n <MessageList messages={messages} />\n {isStreaming && (\n <Text color=\"green\"><Spinner type=\"dots\" /> Responding...</Text>\n )}\n </Box>\n\n {/* Slash menu */}\n {showSlashMenu && slashCommands.length > 0 && (\n <SlashMenu commands={slashCommands} index={slashMenuIndex} />\n )}\n\n {/* Input */}\n <InputBox\n value={inputValue}\n onChange={onInputChange}\n onSubmit={onSubmit}\n disabled={isStreaming}\n focused={inputFocused}\n />\n </Box>\n );\n};\n","/**\n * MessageItem component\n * Memoized to prevent re-renders\n */\nimport React, { memo } from 'react';\nimport { Box, Text } from 'ink';\nimport type { ChatMessage } from '../../../types/llm.types.js';\n\ninterface MessageItemProps {\n message: ChatMessage;\n}\n\nexport const MessageItem = memo<MessageItemProps>(({ message }) => {\n if (message.role === 'user') {\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text color=\"cyan\" bold>You:</Text>\n <Text wrap=\"wrap\">{message.content}</Text>\n </Box>\n );\n }\n\n if (message.role === 'assistant') {\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text color=\"green\" bold>Jai1:</Text>\n <Text wrap=\"wrap\">{message.content}</Text>\n </Box>\n );\n }\n\n return (\n <Box marginBottom={1}>\n <Text dimColor italic>{message.content}</Text>\n </Box>\n );\n});\n","/**\n * InputBox component\n * Memoized, stable layout\n */\nimport React, { memo } from 'react';\nimport { Box, Text } from 'ink';\nimport TextInput from 'ink-text-input';\n\ninterface InputBoxProps {\n value: string;\n onChange: (value: string) => void;\n onSubmit: (value: string) => void;\n disabled?: boolean;\n focused?: boolean;\n}\n\nexport const InputBox = memo<InputBoxProps>(({\n value,\n onChange,\n onSubmit,\n disabled = false,\n focused = true,\n}) => (\n <Box borderStyle=\"round\" borderColor=\"cyan\" paddingX={1}>\n <Text color=\"cyan\">โฏ </Text>\n {!disabled ? (\n <TextInput\n value={value}\n onChange={onChange}\n onSubmit={onSubmit}\n placeholder=\"Type your message...\"\n focus={focused}\n />\n ) : (\n <Text dimColor>Waiting...</Text>\n )}\n </Box>\n));\n","/**\n * ModelSelector component\n * Overlay for selecting LLM model\n */\nimport React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport type { ModelWithUsage } from '../../../types/llm.types.js';\n\ninterface ModelSelectorProps {\n models: ModelWithUsage[];\n currentModel: string;\n onSelect: (modelId: string) => void;\n onCancel: () => void;\n}\n\nexport const ModelSelector: React.FC<ModelSelectorProps> = ({\n models,\n currentModel,\n onSelect,\n onCancel,\n}) => {\n const allowedModels = models.filter((m) => m.allowed);\n const currentIndex = allowedModels.findIndex((m) => m.id === currentModel);\n const [selectedIndex, setSelectedIndex] = useState(Math.max(0, currentIndex));\n\n useInput((input, key) => {\n if (key.escape) {\n onCancel();\n return;\n }\n\n if (key.upArrow) {\n setSelectedIndex((prev) => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setSelectedIndex((prev) => Math.min(allowedModels.length - 1, prev + 1));\n } else if (key.return) {\n const selected = allowedModels[selectedIndex];\n if (selected) {\n onSelect(selected.id);\n }\n }\n });\n\n if (allowedModels.length === 0) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"red\"\n padding={1}\n width={60}\n >\n <Text color=\"red\" bold>\n No models available\n </Text>\n <Text dimColor>Press Esc to close</Text>\n </Box>\n );\n }\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"cyan\"\n padding={1}\n width={70}\n >\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n โš™๏ธ Select Model\n </Text>\n </Box>\n\n <Box flexDirection=\"column\" marginBottom={1}>\n {allowedModels.map((model, i) => {\n const isSelected = i === selectedIndex;\n const isCurrent = model.id === currentModel;\n const icon = isSelected ? 'โ—' : 'โ—‹';\n\n let usageText = '';\n if (model.dailyLimit !== undefined && model.usedToday !== undefined) {\n usageText = ` (${model.usedToday}/${model.dailyLimit})`;\n }\n\n return (\n <Box key={model.id} marginY={0}>\n <Text\n backgroundColor={isSelected ? 'cyan' : undefined}\n color={isSelected ? 'black' : 'white'}\n >\n {isSelected ? 'โฏ ' : ' '}\n {icon} {model.id}\n {isCurrent ? ' โœ“' : ''}\n {usageText}\n </Text>\n </Box>\n );\n })}\n </Box>\n\n <Box borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text dimColor>[โ†‘โ†“] Navigate [Enter] Select [Esc] Cancel</Text>\n </Box>\n </Box>\n );\n};\n","/**\n * Web Chat Server\n * Local HTTP server for web-based chat interface\n * Serves static files and proxies requests to LLM Proxy API\n */\nimport http from 'http';\nimport fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport { SessionManager, Session } from './session.js';\nimport { LlmProxyService } from '../services/llm-proxy.service.js';\nimport { FileService } from './file-service.js';\nimport type { Jai1Config } from '../types/framework.types.js';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\n// MIME types for static files\nconst MIME_TYPES: Record<string, string> = {\n '.html': 'text/html',\n '.css': 'text/css',\n '.js': 'application/javascript',\n '.json': 'application/json',\n '.png': 'image/png',\n '.svg': 'image/svg+xml',\n '.ico': 'image/x-icon',\n};\n\nexport interface WebChatServerConfig {\n port?: number;\n host?: string;\n config: Jai1Config;\n}\n\nexport interface WebChatServer {\n start(): Promise<{ port: number; sessionToken: string }>;\n stop(): Promise<void>;\n getUrl(): string;\n}\n\n/**\n * Find an available port in range\n */\nasync function findAvailablePort(startPort: number, endPort: number): Promise<number> {\n for (let port = startPort; port <= endPort; port++) {\n try {\n await new Promise<void>((resolve, reject) => {\n const server = http.createServer();\n server.listen(port, '127.0.0.1');\n server.once('listening', () => {\n server.close(() => resolve());\n });\n server.once('error', reject);\n });\n return port;\n } catch {\n continue;\n }\n }\n throw new Error(`No available port found in range ${startPort}-${endPort}`);\n}\n\n/**\n * Parse JSON body from request\n */\nasync function parseJsonBody(req: http.IncomingMessage): Promise<unknown> {\n return new Promise((resolve, reject) => {\n let body = '';\n req.on('data', (chunk) => {\n body += chunk.toString();\n });\n req.on('end', () => {\n try {\n resolve(body ? JSON.parse(body) : {});\n } catch (e) {\n reject(new Error('Invalid JSON body'));\n }\n });\n req.on('error', reject);\n });\n}\n\n/**\n * Send JSON response\n */\nfunction sendJson(\n res: http.ServerResponse,\n statusCode: number,\n data: unknown\n): void {\n res.writeHead(statusCode, {\n 'Content-Type': 'application/json',\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',\n 'Access-Control-Allow-Headers': 'Content-Type, X-Session-Token',\n });\n res.end(JSON.stringify(data));\n}\n\n/**\n * Send error response\n */\nfunction sendError(\n res: http.ServerResponse,\n statusCode: number,\n code: string,\n message: string\n): void {\n sendJson(res, statusCode, {\n success: false,\n error: { code, message },\n });\n}\n\n/**\n * Get session token from request\n */\nfunction getSessionToken(req: http.IncomingMessage): string | null {\n // Try header first\n const headerToken = req.headers['x-session-token'];\n if (headerToken && typeof headerToken === 'string') {\n return headerToken;\n }\n\n // Try query param\n const url = new URL(req.url || '/', `http://${req.headers.host}`);\n return url.searchParams.get('session');\n}\n\n/**\n * Create the web chat server\n */\nexport function createWebChatServer(options: WebChatServerConfig): WebChatServer {\n const { config } = options;\n const host = options.host ?? '127.0.0.1';\n let port = options.port ?? 0;\n\n const sessionManager = new SessionManager();\n let server: http.Server | null = null;\n let session: Session | null = null;\n\n // File service for file mention feature\n // Uses the directory where CLI was invoked\n const fileService = new FileService({ workingDir: process.cwd() });\n\n // Path to static files\n // After build with tsup, __dirname is the dist/ folder\n // Web-chat files are copied to dist/web-chat/ by the build script\n const staticDir = path.join(__dirname, 'web-chat');\n\n /**\n * Serve static file\n */\n async function serveStaticFile(\n res: http.ServerResponse,\n filePath: string\n ): Promise<void> {\n const fullPath = path.join(staticDir, filePath);\n\n // Security: prevent path traversal\n if (!fullPath.startsWith(staticDir)) {\n sendError(res, 403, 'ERR-WC-006', 'Forbidden');\n return;\n }\n\n try {\n const stat = await fs.promises.stat(fullPath);\n if (!stat.isFile()) {\n sendError(res, 404, 'ERR-WC-007', 'Not found');\n return;\n }\n\n const ext = path.extname(fullPath);\n const contentType = MIME_TYPES[ext] || 'application/octet-stream';\n\n const content = await fs.promises.readFile(fullPath);\n res.writeHead(200, { 'Content-Type': contentType });\n res.end(content);\n } catch (error: unknown) {\n if (error && typeof error === 'object' && 'code' in error && error.code === 'ENOENT') {\n sendError(res, 404, 'ERR-WC-007', 'Not found');\n } else {\n sendError(res, 500, 'ERR-WC-008', 'Internal server error');\n }\n }\n }\n\n /**\n * Handle API requests\n */\n async function handleApi(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n pathname: string\n ): Promise<void> {\n // CORS preflight\n if (req.method === 'OPTIONS') {\n res.writeHead(204, {\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',\n 'Access-Control-Allow-Headers': 'Content-Type, X-Session-Token',\n });\n res.end();\n return;\n }\n\n // Health check (no auth required)\n if (pathname === '/health') {\n sendJson(res, 200, { status: 'ok' });\n return;\n }\n\n // All other API routes require valid session\n const token = getSessionToken(req);\n const validSession = token ? sessionManager.validateSession(token) : null;\n\n if (!validSession) {\n sendError(\n res,\n 401,\n 'ERR-WC-001',\n \"Session expired. Please run 'jai1 chat --web' again.\"\n );\n return;\n }\n\n // Create LLM service with session credentials\n const llmService = new LlmProxyService({\n accessKey: validSession.accessKey,\n apiUrl: validSession.apiUrl,\n });\n\n // Route handlers\n if (pathname === '/api/session' && req.method === 'GET') {\n // Get session info\n try {\n const models = await llmService.getModelsWithUsage();\n const allowedModels = models\n .filter((m) => m.allowed)\n .map((m) => m.id);\n\n sendJson(res, 200, {\n success: true,\n data: {\n expiresAt: validSession.expiresAt.toISOString(),\n models: allowedModels,\n },\n });\n } catch (error: unknown) {\n sendError(res, 502, 'ERR-WC-004', 'Failed to connect to LLM service.');\n }\n return;\n }\n\n if (pathname === '/api/models' && req.method === 'GET') {\n // Get available models\n try {\n const models = await llmService.getModelsWithUsage();\n sendJson(res, 200, {\n success: true,\n data: models.filter((m) => m.allowed),\n });\n } catch (error: unknown) {\n sendError(res, 502, 'ERR-WC-004', 'Failed to connect to LLM service.');\n }\n return;\n }\n\n if (pathname === '/api/stats' && req.method === 'GET') {\n // Get model stats (limits and usage)\n try {\n const [limits, usage] = await Promise.all([\n llmService.getLimits(),\n llmService.getUsage(1), // Today only\n ]);\n\n // Use GMT+7 timezone to match API date recording\n const today = new Date().toLocaleDateString('en-CA', { timeZone: 'Asia/Ho_Chi_Minh' });\n\n // Build stats per model\n const modelStats: Record<string, { limit: number; used: number; remaining: number }> = {};\n const allowedModels = limits.effectiveAllowedModels || [];\n const rateLimits = limits.effectiveRateLimits || {};\n\n allowedModels.forEach((modelId: string) => {\n const limit = rateLimits[modelId] || rateLimits[modelId.toLowerCase()] || 0;\n const usageRecord = (usage.data || []).find(\n (u) => (u.model === modelId || u.model.toLowerCase() === modelId.toLowerCase()) && u.date === today\n );\n const used = usageRecord?.count || 0;\n\n modelStats[modelId] = {\n limit,\n used,\n remaining: Math.max(0, limit - used),\n };\n });\n\n sendJson(res, 200, {\n success: true,\n data: {\n date: today,\n models: modelStats,\n },\n });\n } catch (error: unknown) {\n sendError(res, 502, 'ERR-WC-004', 'Failed to connect to LLM service.');\n }\n return;\n }\n\n // === File API Endpoints ===\n\n if (pathname === '/api/files/search' && req.method === 'GET') {\n // Search files for autocomplete\n try {\n const url = new URL(req.url || '/', `http://${req.headers.host}`);\n const query = url.searchParams.get('q') || '';\n const limit = parseInt(url.searchParams.get('limit') || '10', 10);\n\n if (!query || query.length < 1) {\n sendJson(res, 200, { success: true, data: { files: [] } });\n return;\n }\n\n const files = await fileService.searchFiles(query, Math.min(limit, 20));\n sendJson(res, 200, {\n success: true,\n data: { files },\n });\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n sendError(res, 500, 'ERR-WC-011', `File search failed: ${errorMessage}`);\n }\n return;\n }\n\n if (pathname === '/api/files/read' && req.method === 'GET') {\n // Read single file\n try {\n const url = new URL(req.url || '/', `http://${req.headers.host}`);\n const filePath = url.searchParams.get('path');\n\n if (!filePath) {\n sendError(res, 400, 'ERR-WC-012', 'Missing file path');\n return;\n }\n\n const fileContent = await fileService.readFile(filePath);\n sendJson(res, 200, {\n success: true,\n data: fileContent,\n });\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n if (errorMessage.includes('Path traversal')) {\n sendError(res, 403, 'ERR-WC-013', 'Access denied');\n } else if (errorMessage.includes('ENOENT')) {\n sendError(res, 404, 'ERR-WC-014', 'File not found');\n } else {\n sendError(res, 400, 'ERR-WC-015', errorMessage);\n }\n }\n return;\n }\n\n if (pathname === '/api/files/batch' && req.method === 'POST') {\n // Read multiple files\n try {\n const body = (await parseJsonBody(req)) as { paths?: string[] };\n\n if (!body.paths || !Array.isArray(body.paths) || body.paths.length === 0) {\n sendError(res, 400, 'ERR-WC-016', 'Missing or invalid paths array');\n return;\n }\n\n if (body.paths.length > fileService.getMaxFilesLimit()) {\n sendError(res, 400, 'ERR-WC-017', `Maximum ${fileService.getMaxFilesLimit()} files allowed per request`);\n return;\n }\n\n const files = await fileService.readFiles(body.paths);\n sendJson(res, 200, {\n success: true,\n data: { files },\n });\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n sendError(res, 500, 'ERR-WC-018', `Batch read failed: ${errorMessage}`);\n }\n return;\n }\n\n if (pathname === '/api/files/info' && req.method === 'GET') {\n // Get file service info\n sendJson(res, 200, {\n success: true,\n data: {\n workingDir: fileService.getWorkingDir(),\n maxFiles: fileService.getMaxFilesLimit(),\n },\n });\n return;\n }\n\n if (pathname === '/api/chat' && req.method === 'POST') {\n // Chat endpoint with streaming\n try {\n const body = (await parseJsonBody(req)) as {\n message: string;\n model: string;\n history?: Array<{ role: string; content: string }>;\n systemPrompt?: string | null;\n };\n\n if (!body.message || !body.model) {\n sendError(res, 400, 'ERR-WC-009', 'Missing message or model');\n return;\n }\n\n // Build messages array with optional system prompt\n const messages: Array<{ role: 'system' | 'user' | 'assistant'; content: string }> = [];\n\n // Add system prompt if provided\n if (body.systemPrompt) {\n messages.push({ role: 'system', content: body.systemPrompt });\n }\n\n // Add history and current message\n messages.push(\n ...(body.history || []).map((m) => ({\n role: m.role as 'user' | 'assistant',\n content: m.content,\n })),\n { role: 'user' as const, content: body.message }\n );\n\n // Set up SSE\n res.writeHead(200, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n 'Access-Control-Allow-Origin': '*',\n });\n\n try {\n // Stream response\n for await (const chunk of llmService.chatStream(\n messages,\n body.model\n )) {\n res.write(\n `data: ${JSON.stringify({ type: 'chunk', content: chunk })}\\n\\n`\n );\n }\n\n res.write(`data: ${JSON.stringify({ type: 'done' })}\\n\\n`);\n } catch (streamError: unknown) {\n const errorMessage =\n streamError instanceof Error\n ? streamError.message\n : 'Unknown error';\n\n // Check for specific error types\n if (errorMessage.includes('not allowed')) {\n res.write(\n `data: ${JSON.stringify({ type: 'error', code: 'ERR-WC-002', message: \"You don't have access to this model.\" })}\\n\\n`\n );\n } else if (errorMessage.includes('rate limit')) {\n res.write(\n `data: ${JSON.stringify({ type: 'error', code: 'ERR-WC-003', message: 'Rate limit exceeded. Please wait.' })}\\n\\n`\n );\n } else {\n res.write(\n `data: ${JSON.stringify({ type: 'error', code: 'ERR-WC-004', message: errorMessage })}\\n\\n`\n );\n }\n }\n\n res.end();\n } catch (error: unknown) {\n sendError(res, 500, 'ERR-WC-008', 'Internal server error');\n }\n return;\n }\n\n // Unknown API endpoint\n sendError(res, 404, 'ERR-WC-010', 'API endpoint not found');\n }\n\n /**\n * Main request handler\n */\n async function handleRequest(\n req: http.IncomingMessage,\n res: http.ServerResponse\n ): Promise<void> {\n const url = new URL(req.url || '/', `http://${req.headers.host}`);\n const pathname = url.pathname;\n\n try {\n // API routes\n if (pathname.startsWith('/api/') || pathname === '/health') {\n await handleApi(req, res, pathname);\n return;\n }\n\n // Static files\n let filePath = pathname === '/' ? '/index.html' : pathname;\n\n // Remove leading slash for path.join\n filePath = filePath.replace(/^\\//, '');\n\n await serveStaticFile(res, filePath);\n } catch (error) {\n console.error('[WebChatServer] Error:', error);\n sendError(res, 500, 'ERR-WC-008', 'Internal server error');\n }\n }\n\n return {\n async start(): Promise<{ port: number; sessionToken: string }> {\n // Find available port if not specified\n if (!port || port === 0) {\n port = await findAvailablePort(54321, 54399);\n }\n\n // Create session\n session = sessionManager.createSession({\n accessKey: config.accessKey,\n apiUrl: config.apiUrl,\n });\n\n // Create HTTP server\n server = http.createServer(handleRequest);\n\n return new Promise((resolve, reject) => {\n server!.listen(port, host, () => {\n console.log(`\\n๐ŸŒ Web Chat server started at http://${host}:${port}`);\n console.log(`๐Ÿ“‹ Session token: ${session!.token.slice(0, 12)}...`);\n console.log(`โฐ Session expires in 30 minutes\\n`);\n\n resolve({\n port,\n sessionToken: session!.token,\n });\n });\n\n server!.once('error', (err: NodeJS.ErrnoException) => {\n if (err.code === 'EADDRINUSE') {\n reject(new Error(`Port ${port} is already in use.`));\n } else {\n reject(err);\n }\n });\n });\n },\n\n async stop(): Promise<void> {\n if (server) {\n return new Promise((resolve) => {\n server!.close(() => {\n sessionManager.clearAll();\n console.log('\\n๐Ÿ‘‹ Web Chat server stopped');\n resolve();\n });\n });\n }\n },\n\n getUrl(): string {\n return `http://${host}:${port}/?session=${session?.token || ''}`;\n },\n };\n}\n","/**\n * Session Management\n * Short-lived session tokens for web chat security\n */\nimport crypto from 'crypto';\n\nexport interface Session {\n token: string;\n accessKey: string;\n apiUrl: string;\n createdAt: Date;\n expiresAt: Date;\n lastActivity: Date;\n}\n\nexport interface SessionConfig {\n accessKey: string;\n apiUrl: string;\n ttlMinutes?: number; // Default: 30 minutes\n}\n\nconst SESSION_PREFIX = 'wc_';\nconst DEFAULT_TTL_MINUTES = 30;\n\nexport class SessionManager {\n private sessions: Map<string, Session> = new Map();\n private cleanupInterval: NodeJS.Timeout | null = null;\n\n constructor() {\n // Start cleanup interval to remove expired sessions\n this.startCleanup();\n }\n\n /**\n * Generate a new session token\n */\n generateToken(): string {\n const randomBytes = crypto.randomBytes(16).toString('hex');\n return `${SESSION_PREFIX}${randomBytes}`;\n }\n\n /**\n * Create a new session\n */\n createSession(config: SessionConfig): Session {\n const token = this.generateToken();\n const now = new Date();\n const ttlMinutes = config.ttlMinutes ?? DEFAULT_TTL_MINUTES;\n\n const session: Session = {\n token,\n accessKey: config.accessKey,\n apiUrl: config.apiUrl,\n createdAt: now,\n expiresAt: new Date(now.getTime() + ttlMinutes * 60 * 1000),\n lastActivity: now,\n };\n\n this.sessions.set(token, session);\n return session;\n }\n\n /**\n * Validate a session token and return session if valid\n * Also extends the session TTL on successful validation\n */\n validateSession(token: string): Session | null {\n if (!token || !token.startsWith(SESSION_PREFIX)) {\n return null;\n }\n\n const session = this.sessions.get(token);\n if (!session) {\n return null;\n }\n\n // Check if expired\n if (new Date() > session.expiresAt) {\n this.sessions.delete(token);\n return null;\n }\n\n // Extend session TTL on activity (sliding expiration)\n session.lastActivity = new Date();\n session.expiresAt = new Date(\n session.lastActivity.getTime() + DEFAULT_TTL_MINUTES * 60 * 1000\n );\n\n return session;\n }\n\n /**\n * Get session without extending TTL\n */\n getSession(token: string): Session | null {\n if (!token || !token.startsWith(SESSION_PREFIX)) {\n return null;\n }\n\n const session = this.sessions.get(token);\n if (!session) {\n return null;\n }\n\n if (new Date() > session.expiresAt) {\n this.sessions.delete(token);\n return null;\n }\n\n return session;\n }\n\n /**\n * Invalidate/delete a session\n */\n invalidateSession(token: string): void {\n this.sessions.delete(token);\n }\n\n /**\n * Get remaining TTL in seconds\n */\n getTimeToLive(token: string): number {\n const session = this.getSession(token);\n if (!session) {\n return 0;\n }\n\n const remaining = session.expiresAt.getTime() - Date.now();\n return Math.max(0, Math.floor(remaining / 1000));\n }\n\n /**\n * Start periodic cleanup of expired sessions\n */\n private startCleanup(): void {\n // Cleanup every 5 minutes\n this.cleanupInterval = setInterval(() => {\n const now = new Date();\n for (const [token, session] of this.sessions.entries()) {\n if (now > session.expiresAt) {\n this.sessions.delete(token);\n }\n }\n }, 5 * 60 * 1000);\n\n // Allow Node.js to exit even if interval is running\n this.cleanupInterval.unref();\n }\n\n /**\n * Stop cleanup interval (call when shutting down)\n */\n stopCleanup(): void {\n if (this.cleanupInterval) {\n clearInterval(this.cleanupInterval);\n this.cleanupInterval = null;\n }\n }\n\n /**\n * Clear all sessions (for shutdown)\n */\n clearAll(): void {\n this.sessions.clear();\n this.stopCleanup();\n }\n\n /**\n * Get active session count (for debugging)\n */\n getActiveSessionCount(): number {\n return this.sessions.size;\n }\n}\n\n// Singleton instance\nlet sessionManagerInstance: SessionManager | null = null;\n\nexport function getSessionManager(): SessionManager {\n if (!sessionManagerInstance) {\n sessionManagerInstance = new SessionManager();\n }\n return sessionManagerInstance;\n}\n\nexport function resetSessionManager(): void {\n if (sessionManagerInstance) {\n sessionManagerInstance.clearAll();\n sessionManagerInstance = null;\n }\n}\n","/**\n * File Service for Web Chat\n * Provides secure file access from the working directory\n * with .gitignore support and security measures\n */\nimport fs from 'fs';\nimport path from 'path';\nimport ignore, { Ignore } from 'ignore';\n\n// Always excluded patterns (security + performance)\nconst ALWAYS_EXCLUDED = [\n 'node_modules',\n 'vendor',\n '.git',\n '.env',\n '.env.*',\n '.env.local',\n '.env.*.local',\n 'dist',\n 'build',\n '.next',\n '.nuxt',\n '.output',\n '.cache',\n '*.lock',\n 'package-lock.json',\n 'pnpm-lock.yaml',\n 'yarn.lock',\n 'composer.lock',\n '.DS_Store',\n 'Thumbs.db',\n '*.log',\n '*.tmp',\n '*.temp',\n '.idea',\n '.vscode',\n '*.min.js',\n '*.min.css',\n '*.map',\n 'coverage',\n '.nyc_output',\n '__pycache__',\n '*.pyc',\n '.pytest_cache',\n '.mypy_cache',\n];\n\n// Allowed text file extensions\nconst TEXT_EXTENSIONS = new Set([\n // Web\n '.html', '.htm', '.css', '.scss', '.sass', '.less',\n '.js', '.jsx', '.ts', '.tsx', '.mjs', '.cjs',\n '.vue', '.svelte', '.astro',\n // Data\n '.json', '.yaml', '.yml', '.toml', '.xml', '.csv',\n // Docs\n '.md', '.mdx', '.txt', '.rst', '.adoc',\n // Config\n '.env.example', '.gitignore', '.dockerignore', '.npmrc', '.nvmrc',\n '.editorconfig', '.prettierrc', '.eslintrc', '.babelrc',\n // Server\n '.php', '.py', '.rb', '.go', '.java', '.kt', '.scala',\n '.rs', '.swift', '.c', '.cpp', '.h', '.hpp', '.cs',\n // Shell\n '.sh', '.bash', '.zsh', '.fish', '.ps1', '.bat', '.cmd',\n // Database\n '.sql', '.prisma', '.graphql', '.gql',\n // Other\n '.dockerfile', '.makefile', '.rake', '.gradle',\n]);\n\n// Files without extension that are text\nconst TEXT_FILES = new Set([\n 'Makefile', 'Dockerfile', 'Vagrantfile', 'Gemfile', 'Rakefile',\n 'Procfile', 'Brewfile', '.gitignore', '.dockerignore', '.npmrc',\n '.nvmrc', '.env.example', 'LICENSE', 'README', 'CHANGELOG',\n 'CONTRIBUTING', 'AUTHORS', 'CODEOWNERS',\n]);\n\nexport interface FileInfo {\n path: string; // Relative path from working dir\n name: string; // File name only\n size: number; // File size in bytes\n type: 'file' | 'dir';\n extension?: string; // File extension (without dot)\n}\n\nexport interface FileContent {\n path: string;\n content: string;\n size: number;\n language: string; // Syntax highlighting hint\n}\n\nexport interface FileServiceOptions {\n workingDir: string;\n maxFileSize?: number; // Default: 1MB\n maxFilesPerRequest?: number; // Default: 5\n maxSearchResults?: number; // Default: 20\n}\n\n/**\n * Get language identifier for syntax highlighting\n */\nfunction getLanguage(filePath: string): string {\n const ext = path.extname(filePath).toLowerCase();\n const langMap: Record<string, string> = {\n '.ts': 'typescript', '.tsx': 'typescript',\n '.js': 'javascript', '.jsx': 'javascript',\n '.mjs': 'javascript', '.cjs': 'javascript',\n '.py': 'python',\n '.rb': 'ruby',\n '.php': 'php',\n '.java': 'java',\n '.kt': 'kotlin',\n '.go': 'go',\n '.rs': 'rust',\n '.swift': 'swift',\n '.c': 'c', '.h': 'c',\n '.cpp': 'cpp', '.hpp': 'cpp',\n '.cs': 'csharp',\n '.css': 'css', '.scss': 'scss', '.sass': 'sass', '.less': 'less',\n '.html': 'html', '.htm': 'html',\n '.vue': 'vue',\n '.svelte': 'svelte',\n '.json': 'json',\n '.yaml': 'yaml', '.yml': 'yaml',\n '.xml': 'xml',\n '.md': 'markdown', '.mdx': 'markdown',\n '.sql': 'sql',\n '.graphql': 'graphql', '.gql': 'graphql',\n '.sh': 'bash', '.bash': 'bash', '.zsh': 'bash',\n '.dockerfile': 'dockerfile',\n '.prisma': 'prisma',\n };\n return langMap[ext] || 'text';\n}\n\n/**\n * Check if file is a text file based on extension\n */\nfunction isTextFile(filePath: string): boolean {\n const ext = path.extname(filePath).toLowerCase();\n const name = path.basename(filePath);\n\n if (TEXT_FILES.has(name)) return true;\n if (ext && TEXT_EXTENSIONS.has(ext)) return true;\n\n // Special cases - config files without standard extension\n if (name.endsWith('rc') || name.endsWith('config')) return true;\n\n return false;\n}\n\nexport class FileService {\n private workingDir: string;\n private maxFileSize: number;\n private maxFilesPerRequest: number;\n private maxSearchResults: number;\n private ignoreFilter: Ignore;\n\n constructor(options: FileServiceOptions) {\n this.workingDir = path.resolve(options.workingDir);\n this.maxFileSize = options.maxFileSize ?? 1024 * 1024; // 1MB\n this.maxFilesPerRequest = options.maxFilesPerRequest ?? 5;\n this.maxSearchResults = options.maxSearchResults ?? 20;\n\n // Initialize ignore filter\n this.ignoreFilter = ignore();\n this.loadIgnorePatterns();\n }\n\n /**\n * Load ignore patterns from .gitignore and add always-excluded patterns\n */\n private loadIgnorePatterns(): void {\n // Add always-excluded patterns\n this.ignoreFilter.add(ALWAYS_EXCLUDED);\n\n // Try to load .gitignore\n const gitignorePath = path.join(this.workingDir, '.gitignore');\n try {\n if (fs.existsSync(gitignorePath)) {\n const content = fs.readFileSync(gitignorePath, 'utf-8');\n this.ignoreFilter.add(content);\n }\n } catch {\n // Ignore errors reading .gitignore\n }\n }\n\n /**\n * Check if a path should be ignored\n */\n private isIgnored(relativePath: string): boolean {\n // Normalize path separators\n const normalizedPath = relativePath.replace(/\\\\/g, '/');\n return this.ignoreFilter.ignores(normalizedPath);\n }\n\n /**\n * Validate path is within working directory (prevent path traversal)\n */\n private validatePath(relativePath: string): string {\n // Remove leading slashes\n const cleanPath = relativePath.replace(/^\\/+/, '');\n\n // Resolve to absolute path\n const absolutePath = path.resolve(this.workingDir, cleanPath);\n\n // Security check: must be within working directory\n if (!absolutePath.startsWith(this.workingDir + path.sep) && absolutePath !== this.workingDir) {\n throw new Error('Path traversal detected');\n }\n\n return absolutePath;\n }\n\n /**\n * Get relative path from working directory\n */\n private getRelativePath(absolutePath: string): string {\n return path.relative(this.workingDir, absolutePath);\n }\n\n /**\n * Search files matching a query (for autocomplete)\n * Returns files where path contains the query string\n */\n async searchFiles(query: string, limit?: number): Promise<FileInfo[]> {\n const maxResults = Math.min(limit ?? this.maxSearchResults, 50);\n const results: FileInfo[] = [];\n const normalizedQuery = query.toLowerCase().replace(/\\\\/g, '/');\n\n // Recursive search function\n const searchDir = async (dirPath: string, depth: number = 0): Promise<void> => {\n // Limit depth to prevent infinite loops\n if (depth > 10 || results.length >= maxResults) return;\n\n try {\n const entries = await fs.promises.readdir(dirPath, { withFileTypes: true });\n\n for (const entry of entries) {\n if (results.length >= maxResults) break;\n\n const entryPath = path.join(dirPath, entry.name);\n const relativePath = this.getRelativePath(entryPath);\n\n // Skip ignored paths\n if (this.isIgnored(relativePath)) continue;\n\n // Check if path matches query\n const normalizedRelPath = relativePath.toLowerCase().replace(/\\\\/g, '/');\n if (normalizedRelPath.includes(normalizedQuery)) {\n // Only include text files\n if (entry.isFile() && isTextFile(entry.name)) {\n try {\n const stat = await fs.promises.stat(entryPath);\n results.push({\n path: relativePath,\n name: entry.name,\n size: stat.size,\n type: 'file',\n extension: path.extname(entry.name).slice(1) || undefined,\n });\n } catch {\n // Skip files we can't stat\n }\n }\n }\n\n // Recurse into directories\n if (entry.isDirectory()) {\n await searchDir(entryPath, depth + 1);\n }\n }\n } catch {\n // Skip directories we can't read\n }\n };\n\n await searchDir(this.workingDir);\n\n // Sort by path length (shorter paths first) then alphabetically\n results.sort((a, b) => {\n if (a.path.length !== b.path.length) {\n return a.path.length - b.path.length;\n }\n return a.path.localeCompare(b.path);\n });\n\n return results;\n }\n\n /**\n * Read a single file\n */\n async readFile(relativePath: string): Promise<FileContent> {\n const absolutePath = this.validatePath(relativePath);\n const normalizedRelPath = this.getRelativePath(absolutePath);\n\n // Check if ignored\n if (this.isIgnored(normalizedRelPath)) {\n throw new Error('File is excluded by ignore rules');\n }\n\n // Check if it's a text file\n if (!isTextFile(absolutePath)) {\n throw new Error('Only text files can be read');\n }\n\n // Check file exists and get stats\n const stat = await fs.promises.stat(absolutePath);\n\n if (!stat.isFile()) {\n throw new Error('Path is not a file');\n }\n\n // Check file size\n if (stat.size > this.maxFileSize) {\n throw new Error(`File exceeds maximum size of ${Math.round(this.maxFileSize / 1024)}KB`);\n }\n\n // Read file content\n const content = await fs.promises.readFile(absolutePath, 'utf-8');\n\n return {\n path: normalizedRelPath,\n content,\n size: stat.size,\n language: getLanguage(absolutePath),\n };\n }\n\n /**\n * Read multiple files (batch)\n */\n async readFiles(relativePaths: string[]): Promise<Array<FileContent & { error?: string }>> {\n // Limit number of files\n const paths = relativePaths.slice(0, this.maxFilesPerRequest);\n\n const results = await Promise.all(\n paths.map(async (filePath) => {\n try {\n const content = await this.readFile(filePath);\n return content;\n } catch (error) {\n return {\n path: filePath,\n content: '',\n size: 0,\n language: 'text',\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n })\n );\n\n return results;\n }\n\n /**\n * Get working directory info\n */\n getWorkingDir(): string {\n return this.workingDir;\n }\n\n /**\n * Get max files per request limit\n */\n getMaxFilesLimit(): number {\n return this.maxFilesPerRequest;\n }\n}\n","/**\n * OpenAI Keys Command\n * Show OpenAI-compatible API credentials and info\n */\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport boxen from 'boxen';\nimport { ConfigService } from '../services/config.service.js';\nimport { LlmProxyService } from '../services/llm-proxy.service.js';\nimport { ValidationError } from '../errors/index.js';\n\nfunction maskKey(key: string): string {\n if (key.length <= 8) return '****';\n return key.slice(0, 8) + '****' + key.slice(-4);\n}\n\n/**\n * Handle openai-keys command\n */\nasync function handleOpenAiKeysCommand(options: { full?: boolean }): Promise<void> {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n const service = new LlmProxyService(config);\n\n // Header\n console.log(\n boxen(chalk.cyan.bold('๐Ÿ“ก Jai1 LLM Proxy - OpenAI Compatible API'), {\n padding: { top: 0, bottom: 0, left: 1, right: 1 },\n borderStyle: 'round',\n borderColor: 'cyan',\n })\n );\n console.log();\n\n // API Credentials\n console.log(chalk.bold('๐Ÿ”‘ API Credentials'));\n console.log(` ${chalk.dim('BASE_URL:')} ${chalk.white(service.getBaseUrl())}`);\n console.log(\n ` ${chalk.dim('API_KEY:')} ${options.full ? chalk.green(service.getApiKey()) : chalk.yellow(maskKey(service.getApiKey()))}`\n );\n console.log();\n\n try {\n const [models, limits] = await Promise.all([\n service.getModelsWithUsage(),\n service.getLimits(),\n ]);\n\n const allowedModels = models.filter((m) => m.allowed);\n\n // Available Models\n console.log(chalk.bold('๐Ÿ“ฆ Available Models'));\n if (allowedModels.length === 0) {\n console.log(chalk.dim(' Khรดng cรณ models khแบฃ dแปฅng'));\n } else {\n for (const model of allowedModels) {\n const usageText =\n model.dailyLimit !== undefined && model.usedToday !== undefined\n ? chalk.dim(` (${model.usedToday}/${model.dailyLimit} hรดm nay)`)\n : '';\n console.log(` ${chalk.green('โœ“')} ${chalk.white(model.id)}${usageText}`);\n }\n }\n console.log();\n\n // Sample cURL\n const defaultModel = allowedModels[0]?.id || 'gpt-4o';\n console.log(chalk.bold('๐Ÿ“ Sample cURL'));\n console.log();\n const curlSample = options.full\n ? service.generateFullCurlSample(defaultModel)\n : service.generateCurlSample(defaultModel);\n const curlLines = curlSample.split('\\n');\n for (const line of curlLines) {\n console.log(chalk.dim(` ${line}`));\n }\n console.log();\n\n // Usage tips\n console.log(chalk.bold('๐Ÿ’ก Cรกch sแปญ dแปฅng'));\n console.log(chalk.dim(' - Thay thแบฟ OpenAI API URL vร  API Key'));\n console.log(chalk.dim(' - Tฦฐฦกng thรญch: OpenAI SDK, LangChain, LlamaIndex, v.v.'));\n console.log(chalk.dim(' - Chแบกy \"jai1 chat\" ฤ‘แปƒ chat trแปฑc tiแบฟp'));\n if (!options.full) {\n console.log(chalk.dim(' - Chแบกy \"jai1 openai-keys --full\" ฤ‘แปƒ hiแปƒn thแป‹ API key ฤ‘แบงy ฤ‘แปง'));\n }\n } catch (error) {\n console.log();\n console.log(\n chalk.red('โŒ Lแป—i khi lแบฅy thรดng tin API:'),\n chalk.dim(error instanceof Error ? error.message : String(error))\n );\n console.log(chalk.dim('\\n๐Ÿ’ก Kiแปƒm tra API URL vร  access key vแป›i \"jai1 status\"'));\n }\n}\n\n/**\n * Create openai-keys command\n */\nexport function createOpenAiKeysCommand(): Command {\n const cmd = new Command('openai-keys')\n .description('Show OpenAI-compatible API credentials and info')\n .option('--full', 'Show full API key (unmasked)')\n .action(async (options: { full?: boolean }) => {\n await handleOpenAiKeysCommand(options);\n });\n\n return cmd;\n}\n","/**\n * Stats Command\n * Show LLM usage statistics and limits\n */\nimport { Command } from 'commander';\nimport Table from 'cli-table3';\nimport chalk from 'chalk';\nimport { ConfigService } from '../services/config.service.js';\nimport { LlmProxyService } from '../services/llm-proxy.service.js';\nimport { ValidationError } from '../errors/index.js';\nimport type { UsageRecord } from '../types/llm.types.js';\n\n/**\n * Handle stats command\n */\nasync function handleStatsCommand(): Promise<void> {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError(\n 'Chฦฐa xรกc thแปฑc. Vui lรฒng chแบกy \"jai1 auth\" trฦฐแป›c.'\n );\n }\n\n const service = new LlmProxyService(config);\n\n console.log(chalk.bold('\\n๐Ÿ“Š Thแป‘ng Kรช Sแปญ Dแปฅng LLM'));\n console.log(chalk.dim('โ”€'.repeat(45)));\n\n try {\n // Fetch data in parallel\n const [limits, usage7Days, usageToday] = await Promise.all([\n service.getLimits(),\n service.getUsage(7),\n service.getUsage(1),\n ]);\n\n // Get today's date in GMT+7 timezone\n const today = new Date().toLocaleDateString('en-CA', {\n timeZone: 'Asia/Ho_Chi_Minh',\n });\n\n console.log(chalk.cyan('\\n๐Ÿ“… Khoแบฃng thแปi gian: 7 ngร y qua\\n'));\n\n // Process usage data\n const usageByModel = new Map<string, { today: number; total7Days: number }>();\n\n // Calculate 7-day totals\n let total7DaysRequests = 0;\n usage7Days.data?.forEach((record: UsageRecord) => {\n if (!usageByModel.has(record.model)) {\n usageByModel.set(record.model, { today: 0, total7Days: 0 });\n }\n const modelData = usageByModel.get(record.model)!;\n modelData.total7Days += record.count;\n total7DaysRequests += record.count;\n });\n\n // Add today's usage\n usageToday.data?.forEach((record: UsageRecord) => {\n if (record.date === today) {\n if (!usageByModel.has(record.model)) {\n usageByModel.set(record.model, { today: 0, total7Days: 0 });\n }\n const modelData = usageByModel.get(record.model)!;\n modelData.today = record.count;\n }\n });\n\n // Display total summary\n console.log(chalk.bold('๐Ÿ“ˆ Tแป•ng quan sแปญ dแปฅng'));\n console.log(` Tแป•ng sแป‘ yรชu cแบงu (7 ngร y): ${chalk.green(total7DaysRequests)}\\n`);\n\n // Display per-model table\n console.log(chalk.bold('๐Ÿ“ฆ Thแป‘ng kรช theo model\\n'));\n\n // Create table with cli-table3\n const table = new Table({\n head: [\n chalk.bold('Model'),\n chalk.bold('Hรดm nay'),\n chalk.bold('Giแป›i hแบกn'),\n chalk.bold('Tแป•ng 7 ngร y'),\n ],\n style: {\n head: ['cyan'],\n border: ['gray'],\n },\n colWidths: [35, 14, 14, 14],\n });\n\n // Get all models from limits\n const allowedModels = limits.effectiveAllowedModels || [];\n const rateLimits = limits.effectiveRateLimits || {};\n\n if (allowedModels.length === 0) {\n table.push([\n { colSpan: 4, content: chalk.yellow('Khรดng cรณ model nร o khแบฃ dแปฅng') },\n ]);\n } else {\n allowedModels.forEach((modelId: string) => {\n const usage = usageByModel.get(modelId) || { today: 0, total7Days: 0 };\n const limit =\n rateLimits[modelId] || rateLimits[modelId.toLowerCase()] || 0;\n\n // Color code usage\n const usagePercent = limit > 0 ? usage.today / limit : 0;\n let todayDisplay = `${usage.today}/${limit}`;\n if (usagePercent >= 0.9) {\n todayDisplay = chalk.red(todayDisplay);\n } else if (usagePercent >= 0.7) {\n todayDisplay = chalk.yellow(todayDisplay);\n } else {\n todayDisplay = chalk.green(todayDisplay);\n }\n\n table.push([modelId, todayDisplay, `${limit}/ngร y`, String(usage.total7Days)]);\n });\n }\n\n console.log(table.toString());\n console.log(\n chalk.dim('\\n๐Ÿ’ก Mแบนo: Chแบกy \"jai1 openai-keys\" ฤ‘แปƒ xem danh sรกch model khแบฃ dแปฅng')\n );\n } catch (error) {\n console.error(\n chalk.red('\\nโŒ Khรดng thแปƒ lแบฅy thแป‘ng kรช:'),\n error instanceof Error ? error.message : String(error)\n );\n console.log(chalk.dim('\\n๐Ÿ’ก Kiแปƒm tra kแบฟt nแป‘i API vแป›i \"jai1 status\"'));\n }\n}\n\n/**\n * Create stats command\n */\nexport function createStatsCommand(): Command {\n const cmd = new Command('stats')\n .description('Hiแปƒn thแป‹ thแป‘ng kรช sแปญ dแปฅng LLM vร  giแป›i hแบกn')\n .action(async () => {\n await handleStatsCommand();\n });\n\n return cmd;\n}\n","/**\n * Translate Command\n * Translate text, files, or folders using LLM Proxy\n */\nimport { Command } from 'commander';\nimport { ConfigService } from '../services/config.service.js';\nimport { LlmProxyService } from '../services/llm-proxy.service.js';\nimport { TranslationService } from '../services/translation.service.js';\nimport { ValidationError, NotFoundError } from '../errors/index.js';\nimport type { TranslateOptions } from '../types/translate.types.js';\n\ninterface TranslateCommandOptions extends TranslateOptions {\n model?: string;\n}\n\n/**\n * Handle translate command\n */\nasync function handleTranslate(input: string, options: TranslateCommandOptions): Promise<void> {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Chฦฐa xรกc thแปฑc. Chแบกy \"jai1 auth\" trฦฐแป›c.');\n }\n\n const llmService = new LlmProxyService(config);\n const translationService = new TranslationService(llmService, options, options.model);\n\n // Detect input type\n const inputType = await translationService.detectInputType(input);\n\n // Handle based on type\n switch (inputType) {\n case 'text':\n await handleTextTranslation(translationService, input, options);\n break;\n case 'file':\n await handleFileTranslation(translationService, input, options);\n break;\n case 'folder':\n await handleFolderTranslation(translationService, input, options);\n break;\n }\n}\n\n/**\n * Handle text translation\n */\nasync function handleTextTranslation(\n service: TranslationService,\n text: string,\n options: TranslateOptions\n): Promise<void> {\n if (!options.json) {\n console.log('๐ŸŒ ฤang dแป‹ch vฤƒn bแบฃn...');\n }\n\n const result = await service.translateText(text);\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n if (result.success && result.translatedContent) {\n console.log(`โœ… Hoร n tแบฅt! Ngรดn ngแปฏ: ${result.targetLanguage}\\n`);\n console.log(result.translatedContent);\n } else {\n console.error(`โŒ Lแป—i: ${result.error}`);\n process.exit(1);\n }\n}\n\n/**\n * Handle file translation\n */\nasync function handleFileTranslation(\n service: TranslationService,\n filePath: string,\n options: TranslateOptions\n): Promise<void> {\n if (!options.json) {\n console.log(`๐ŸŒ ฤang dแป‹ch file: ${filePath}`);\n }\n\n const result = await service.translateFile(filePath);\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n if (result.success) {\n if (options.dryRun) {\n console.log(`โœ… Preview mode - sแบฝ lฦฐu: ${result.outputPath}`);\n } else {\n console.log(`โœ… ฤรฃ lฦฐu: ${result.outputPath}`);\n }\n } else {\n console.error(`โŒ Lแป—i: ${result.error}`);\n process.exit(1);\n }\n}\n\n/**\n * Handle folder translation\n */\nasync function handleFolderTranslation(\n service: TranslationService,\n folderPath: string,\n options: TranslateOptions\n): Promise<void> {\n if (!options.json) {\n console.log(`๐ŸŒ ฤang quรฉt thฦฐ mแปฅc: ${folderPath}\\n`);\n }\n\n const result = await service.translateFolder(folderPath, (progress) => {\n if (!options.json) {\n const fileName = progress.currentFile.split('/').pop() || progress.currentFile;\n process.stdout.write(\n `\\r๐ŸŒ ฤang xแปญ lรฝ: ${progress.current}/${progress.total} - ${fileName}${' '.repeat(20)}`\n );\n }\n });\n\n if (!options.json) {\n // Clear progress line\n process.stdout.write('\\r' + ' '.repeat(100) + '\\r');\n }\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n // Display summary\n console.log(`\\nโœ… Hoร n tแบฅt! ${result.summary.success}/${result.summary.total} file ฤ‘รฃ dแป‹ch`);\n\n if (result.summary.failed > 0) {\n console.log(`\\nโš ๏ธ ${result.summary.failed} file gแบทp lแป—i:`);\n result.results\n .filter((r) => !r.success)\n .forEach((r) => {\n const fileName = r.inputPath.split('/').pop() || r.inputPath;\n console.log(` โŒ ${fileName}: ${r.error}`);\n });\n }\n\n if (options.dryRun) {\n console.log('\\n๐Ÿ’ก Chแบกy khรดng cรณ --dry-run ฤ‘แปƒ lฦฐu file.');\n }\n}\n\n/**\n * Create translate command\n */\nexport function createTranslateCommand(): Command {\n const cmd = new Command('translate')\n .description('Dแป‹ch vฤƒn bแบฃn, file hoแบทc thฦฐ mแปฅc bแบฑng AI')\n .argument('<input>', 'Chuแป—i vฤƒn bแบฃn, ฤ‘ฦฐแปng dแบซn file hoแบทc thฦฐ mแปฅc')\n .option('--to <language>', 'Mรฃ ngรดn ngแปฏ ฤ‘รญch (mแบทc ฤ‘แป‹nh: vi)', 'vi')\n .option('-o, --output <path>', 'ฤฦฐแปng dแบซn output (file/thฦฐ mแปฅc)')\n .option('--dry-run', 'Xem trฦฐแป›c khรดng lฦฐu file')\n .option('--concurrency <number>', 'Sแป‘ file xแปญ lรฝ song song (mแบทc ฤ‘แป‹nh: 3)', '3')\n .option('--model <model>', 'Model LLM (mแบทc ฤ‘แป‹nh: gpt-5.1-codex-mini)')\n .option('--json', 'Xuแบฅt kแบฟt quแบฃ dแบกng JSON')\n .action(async (input: string, options: TranslateCommandOptions) => {\n await handleTranslate(input, options);\n });\n\n return cmd;\n}\n","/**\n * Translation Service\n * Handles translation of text, files, and folders using LLM Proxy\n */\nimport { promises as fs } from 'fs';\nimport path from 'path';\nimport pLimit from 'p-limit';\nimport pRetry from 'p-retry';\nimport { LlmProxyService } from './llm-proxy.service.js';\nimport type { CompletionMessage } from '../types/llm.types.js';\nimport type {\n TranslateOptions,\n TranslationResult,\n FileTranslationResult,\n FolderTranslationResult,\n TranslationProgress,\n TRANSLATABLE_EXTENSIONS,\n TranslatableExtension,\n} from '../types/translate.types.js';\n\nconst TRANSLATABLE_EXTS = ['.md', '.txt', '.json', '.yaml', '.yml'] as const;\n\nexport class TranslationService {\n private readonly llmService: LlmProxyService;\n private readonly options: TranslateOptions;\n private readonly model: string;\n\n constructor(llmService: LlmProxyService, options: TranslateOptions, model?: string) {\n this.llmService = llmService;\n this.options = options;\n this.model = model || 'gpt-5.1-codex-mini'; // Default fast model for translation\n }\n\n /**\n * Detect input type\n */\n async detectInputType(input: string): Promise<'text' | 'file' | 'folder'> {\n try {\n const stat = await fs.stat(input);\n if (stat.isDirectory()) return 'folder';\n if (stat.isFile()) return 'file';\n } catch {\n // Path doesn't exist, treat as text\n }\n return 'text';\n }\n\n /**\n * Translate text string\n */\n async translateText(text: string): Promise<TranslationResult> {\n try {\n const translatedContent = await this.translateWithRetry(text, 'text');\n return {\n success: true,\n inputType: 'text',\n input: text,\n output: translatedContent,\n targetLanguage: this.options.to,\n translatedContent,\n };\n } catch (error) {\n return {\n success: false,\n inputType: 'text',\n input: text,\n output: '',\n targetLanguage: this.options.to,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n /**\n * Translate single file\n */\n async translateFile(filePath: string): Promise<FileTranslationResult> {\n try {\n // Read file content\n const content = await fs.readFile(filePath, 'utf-8');\n\n // Detect file type\n const ext = path.extname(filePath).toLowerCase();\n const fileType = this.getFileType(ext);\n\n // Translate content\n const translatedContent = await this.translateWithRetry(content, fileType);\n\n // Generate output path\n const outputPath = this.generateOutputPath(filePath);\n\n // Write output (unless dry-run)\n if (!this.options.dryRun) {\n await fs.writeFile(outputPath, translatedContent, 'utf-8');\n }\n\n return {\n inputPath: filePath,\n outputPath,\n success: true,\n };\n } catch (error) {\n return {\n inputPath: filePath,\n outputPath: '',\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n /**\n * Translate entire folder recursively\n */\n async translateFolder(\n folderPath: string,\n onProgress?: (progress: TranslationProgress) => void\n ): Promise<FolderTranslationResult> {\n const files = await this.discoverFiles(folderPath);\n const concurrency = parseInt(this.options.concurrency || '3', 10);\n const limit = pLimit(concurrency);\n\n const results: FileTranslationResult[] = [];\n let current = 0;\n\n const tasks = files.map((file) =>\n limit(async () => {\n current++;\n onProgress?.({\n current,\n total: files.length,\n currentFile: file,\n status: 'translating',\n });\n\n const result = await this.translateFile(file);\n results.push(result);\n\n onProgress?.({\n current,\n total: files.length,\n currentFile: file,\n status: result.success ? 'done' : 'error',\n });\n\n return result;\n })\n );\n\n await Promise.all(tasks);\n\n return this.summarizeResults(folderPath, results);\n }\n\n /**\n * Generate output path with language suffix\n */\n private generateOutputPath(inputPath: string): string {\n if (this.options.output) {\n return this.options.output;\n }\n\n const ext = path.extname(inputPath);\n const base = path.basename(inputPath, ext);\n const dir = path.dirname(inputPath);\n const lang = this.options.to;\n\n return path.join(dir, `${base}.${lang}${ext}`);\n }\n\n /**\n * Discover translatable files in folder recursively\n */\n private async discoverFiles(folderPath: string): Promise<string[]> {\n const entries = await fs.readdir(folderPath, { withFileTypes: true });\n const files: string[] = [];\n\n for (const entry of entries) {\n const fullPath = path.join(folderPath, entry.name);\n\n if (entry.isDirectory()) {\n // Skip hidden directories and node_modules\n if (!entry.name.startsWith('.') && entry.name !== 'node_modules') {\n const subFiles = await this.discoverFiles(fullPath);\n files.push(...subFiles);\n }\n } else if (entry.isFile()) {\n const ext = path.extname(entry.name).toLowerCase();\n if (TRANSLATABLE_EXTS.includes(ext as TranslatableExtension)) {\n // Skip already translated files (e.g., file.vi.md)\n if (!this.isTranslatedFile(entry.name)) {\n files.push(fullPath);\n }\n }\n }\n }\n\n return files;\n }\n\n /**\n * Check if filename indicates already translated file\n */\n private isTranslatedFile(filename: string): boolean {\n // Pattern: .{lang}.{ext} (e.g., .vi.md, .en.txt)\n const pattern = /\\.[a-z]{2}\\.(md|txt|json|ya?ml)$/i;\n return pattern.test(filename);\n }\n\n /**\n * Build translation prompt based on content type\n */\n private buildPrompt(content: string, fileType: string): CompletionMessage[] {\n const targetLang = this.options.to;\n let systemPrompt = '';\n\n switch (fileType) {\n case 'markdown':\n systemPrompt = `You are a professional translator.\nTranslate the following Markdown content to ${targetLang}.\nPreserve all formatting including:\n- Markdown syntax (headers, lists, code blocks, links, tables)\n- Line breaks and paragraph structure\n- Code snippets (do not translate code, only comments if present)\n- HTML tags if present\n\nReturn ONLY the translated content, no explanations.`;\n break;\n\n case 'json':\n systemPrompt = `You are translating a JSON localization file.\nTranslate all string values to ${targetLang}.\nPreserve the JSON structure and keys exactly.\nReturn valid JSON only, no explanations.`;\n break;\n\n case 'yaml':\n systemPrompt = `You are translating a YAML configuration file.\nTranslate all string values to ${targetLang}.\nPreserve the YAML structure and keys exactly.\nReturn valid YAML only, no explanations.`;\n break;\n\n default:\n systemPrompt = `You are a professional translator.\nTranslate the following text to ${targetLang}.\nPreserve all formatting and line breaks.\nReturn ONLY the translated content, no explanations.`;\n }\n\n return [\n { role: 'system', content: systemPrompt },\n { role: 'user', content: content },\n ];\n }\n\n /**\n * Get file type from extension\n */\n private getFileType(ext: string): string {\n switch (ext.toLowerCase()) {\n case '.md':\n return 'markdown';\n case '.json':\n return 'json';\n case '.yaml':\n case '.yml':\n return 'yaml';\n default:\n return 'text';\n }\n }\n\n /**\n * Translate with retry logic\n */\n private async translateWithRetry(content: string, fileType: string): Promise<string> {\n return pRetry(\n async () => {\n const messages = this.buildPrompt(content, fileType);\n const result = await this.llmService.chat(messages, this.model);\n return result;\n },\n {\n retries: 3,\n onFailedAttempt: (error) => {\n if (error.message.includes('rate limit')) {\n console.log('โš ๏ธ Rate limit, ฤ‘ang thแปญ lแบกi...');\n }\n },\n }\n );\n }\n\n /**\n * Summarize folder translation results\n */\n private summarizeResults(\n folderPath: string,\n results: FileTranslationResult[]\n ): FolderTranslationResult {\n const summary = {\n total: results.length,\n success: results.filter((r) => r.success).length,\n failed: results.filter((r) => !r.success).length,\n skipped: 0,\n };\n\n return {\n inputFolder: folderPath,\n outputFolder: this.options.output || folderPath,\n results,\n summary,\n };\n }\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { createImageGenCommand } from './gen.js';\nimport { createImageListCommand } from './list.js';\nimport { createImageInfoCommand } from './info.js';\nimport { createImageDeleteCommand } from './delete.js';\n\nfunction showImageHelp(): void {\n console.log(chalk.bold.cyan('๐ŸŽจ jai1 image') + chalk.dim(' - Image generation commands'));\n console.log();\n console.log(chalk.yellow('โš ๏ธ Coming Soon - Tรญnh nฤƒng ฤ‘ang phรกt triแปƒn'));\n console.log();\n console.log(chalk.bold('Cรกc lแป‡nh:'));\n console.log(` ${chalk.cyan('gen')} Tแบกo แบฃnh tแปซ prompt`);\n console.log(` ${chalk.cyan('list')} Liแป‡t kรช cรกc แบฃnh ฤ‘รฃ tแบกo`);\n console.log(` ${chalk.cyan('info')} Xem thรดng tin แบฃnh`);\n console.log(` ${chalk.cyan('delete')} Xรณa แบฃnh`);\n console.log();\n console.log(chalk.bold('Vรญ dแปฅ:'));\n console.log(chalk.dim(' $ jai1 image gen \"a cute cat\"'));\n console.log(chalk.dim(' $ jai1 image list'));\n console.log(chalk.dim(' $ jai1 image info <image-id>'));\n console.log();\n console.log(chalk.dim('Chแบกy \"jai1 image <lแป‡nh> --help\" ฤ‘แปƒ xem chi tiแบฟt'));\n}\n\nexport function createImageCommand(): Command {\n const cmd = new Command('image')\n .description('Image generation commands (Coming Soon)')\n .action(() => {\n showImageHelp();\n });\n\n cmd.addCommand(createImageGenCommand());\n cmd.addCommand(createImageListCommand());\n cmd.addCommand(createImageInfoCommand());\n cmd.addCommand(createImageDeleteCommand());\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { ConfigService } from '../../services/config.service.js';\nimport { ImageService } from '../../services/image.service.js';\nimport { ValidationError } from '../../errors/index.js';\nimport terminalImage from 'terminal-image';\n\n// Supported image sizes with aspect ratios\nconst SUPPORTED_SIZES = [\n '1024x1024', // 1:1 (default)\n '1792x1024', // 16:9 (landscape)\n '1024x1792', // 9:16 (portrait)\n '1024x768', // 4:3 (landscape)\n '768x1024', // 3:4 (portrait)\n] as const;\n\ntype ImageSize = typeof SUPPORTED_SIZES[number];\n\nexport function createImageGenCommand(): Command {\n return new Command('gen')\n .description('Generate an image from text prompt')\n .argument('<prompt>', 'Image description prompt')\n .option('-m, --model <model>', 'Model to use', 'gemini-3-pro-image-preview')\n .option('-s, --size <size>', `Image size: ${SUPPORTED_SIZES.join(', ')}`, '1024x1024')\n .option('-q, --quality <quality>', 'Image quality: standard, hd', 'hd')\n .option('--no-display', 'Don\\'t display image in terminal')\n .action(async (prompt, options) => {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n // Validate size\n const size = options.size as ImageSize;\n if (!SUPPORTED_SIZES.includes(size)) {\n console.error(`\\nโŒ Invalid size: ${size}`);\n console.error(` Supported sizes: ${SUPPORTED_SIZES.join(', ')}`);\n console.error('\\n Size reference:');\n console.error(' 1024x1024 - Square (1:1)');\n console.error(' 1792x1024 - Landscape wide (16:9)');\n console.error(' 1024x1792 - Portrait tall (9:16)');\n console.error(' 1024x768 - Landscape (4:3)');\n console.error(' 768x1024 - Portrait (3:4)');\n process.exit(1);\n }\n\n const imageService = new ImageService();\n\n console.log('๐ŸŽจ Generating image...');\n console.log(` Prompt: ${prompt}`);\n console.log(` Model: ${options.model}`);\n console.log(` Size: ${size}`);\n console.log(` Quality: ${options.quality}`);\n\n try {\n const result = await imageService.generate(config, {\n prompt,\n model: options.model,\n size,\n quality: options.quality,\n });\n\n console.log('\\nโœ… Image generated successfully!');\n console.log(` URL: ${result.url}`);\n console.log(` Size: ${(result.contentSize / 1024).toFixed(2)} KB`);\n console.log(` ID: ${result.id}`);\n\n // Display in terminal if supported and not disabled\n if (options.display !== false) {\n try {\n const imageResponse = await fetch(result.url);\n const arrayBuffer = await imageResponse.arrayBuffer();\n const imageBuffer = Buffer.from(arrayBuffer);\n const rendered = await terminalImage.buffer(imageBuffer, {\n width: '50%',\n height: '50%',\n });\n console.log('\\n' + rendered);\n } catch (displayError) {\n // Terminal image display not supported or failed\n }\n }\n\n console.log('\\n๐Ÿ’ก Tip: Use \"jai1 image list\" to view all your images');\n console.log(' Use \"jai1 image info <id>\" for details');\n\n } catch (error) {\n if (error instanceof Error) {\n if (error.message.includes('Rate limit')) {\n console.error('\\nโš ๏ธ Rate limit exceeded');\n console.error(' Use \"jai1 image limits\" to check your quota');\n } else {\n throw error;\n }\n }\n throw error;\n }\n });\n}\n","/**\n * Image Generation Service\n */\nimport type { Jai1Config } from '../types/framework.types.js';\nimport { NetworkError } from '../errors/index.js';\n\n// Supported image sizes\nexport type ImageSize = '1024x1024' | '1792x1024' | '1024x1792' | '1024x768' | '768x1024';\n\n// Supported quality options\nexport type ImageQuality = 'standard' | 'hd';\n\nexport interface GenerateImageOptions {\n prompt: string;\n model: string;\n size?: ImageSize;\n quality?: ImageQuality;\n}\n\nexport interface ImageResult {\n id: number;\n url: string;\n prompt: string;\n model: string;\n size?: string;\n quality?: string;\n contentSize: number;\n createdAt: string;\n}\n\nexport interface ListImagesOptions {\n model?: string;\n limit?: number;\n offset?: number;\n}\n\nexport interface ListImagesResult {\n images: Array<{\n id: number;\n url: string;\n prompt: string;\n model: string;\n createdAt: string;\n }>;\n total: number;\n limit: number;\n offset: number;\n}\n\nexport class ImageService {\n /**\n * Generate image from prompt\n */\n async generate(config: Jai1Config, options: GenerateImageOptions): Promise<ImageResult> {\n const response = await fetch(`${config.apiUrl}/api/image/generate`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'JAI1-Access-Key': config.accessKey,\n },\n body: JSON.stringify({\n prompt: options.prompt,\n model: options.model,\n size: options.size || '1024x1024',\n quality: options.quality || 'hd',\n }),\n });\n\n if (!response.ok) {\n let errorMessage = `HTTP ${response.status}`;\n try {\n const error = await response.json();\n errorMessage = error.message || errorMessage;\n } catch (e) {\n // Ignore parse error\n }\n throw new NetworkError(errorMessage);\n }\n\n const data = await response.json();\n return data.data;\n }\n\n /**\n * List generated images\n */\n async list(config: Jai1Config, options: ListImagesOptions): Promise<ListImagesResult> {\n const params = new URLSearchParams();\n if (options.model) params.set('model', options.model);\n if (options.limit) params.set('limit', options.limit.toString());\n if (options.offset) params.set('offset', options.offset.toString());\n\n const url = `${config.apiUrl}/api/image/list?${params}`;\n\n const response = await fetch(url, {\n headers: {\n 'JAI1-Access-Key': config.accessKey,\n },\n });\n\n if (!response.ok) {\n throw new NetworkError(`Failed to list images: HTTP ${response.status}`);\n }\n\n const data = await response.json();\n return data.data;\n }\n\n /**\n * Get image info\n */\n async getInfo(config: Jai1Config, id: number): Promise<any> {\n const response = await fetch(`${config.apiUrl}/api/image/${id}`, {\n headers: {\n 'JAI1-Access-Key': config.accessKey,\n },\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new Error('Image not found');\n }\n throw new NetworkError(`Failed to get image: HTTP ${response.status}`);\n }\n\n const data = await response.json();\n return data.data;\n }\n\n /**\n * Delete image\n */\n async delete(config: Jai1Config, id: number): Promise<void> {\n const response = await fetch(`${config.apiUrl}/api/image/${id}`, {\n method: 'DELETE',\n headers: {\n 'JAI1-Access-Key': config.accessKey,\n },\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new Error('Image not found');\n }\n throw new NetworkError(`Failed to delete image: HTTP ${response.status}`);\n }\n }\n}\n","import { Command } from 'commander';\nimport { ConfigService } from '../../services/config.service.js';\nimport { ImageService } from '../../services/image.service.js';\nimport { ValidationError } from '../../errors/index.js';\n\nexport function createImageListCommand(): Command {\n return new Command('list')\n .description('List generated images')\n .option('-m, --model <model>', 'Filter by model')\n .option('-l, --limit <number>', 'Number of results', '20')\n .option('-o, --offset <number>', 'Offset for pagination', '0')\n .action(async (options) => {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n const imageService = new ImageService();\n const result = await imageService.list(config, {\n model: options.model,\n limit: parseInt(options.limit),\n offset: parseInt(options.offset),\n });\n\n if (result.images.length === 0) {\n console.log('No images found.');\n return;\n }\n\n console.log(`\\n๐Ÿ“ธ Your Generated Images (${result.total} total):\\n`);\n\n for (const img of result.images) {\n const date = new Date(img.createdAt).toLocaleString();\n const promptPreview = img.prompt.length > 50\n ? img.prompt.slice(0, 50) + '...'\n : img.prompt;\n\n console.log(`ID: ${img.id.toString().padEnd(6)} | ${date}`);\n console.log(` Model: ${img.model}`);\n console.log(` Prompt: ${promptPreview}`);\n console.log(` URL: ${img.url}`);\n console.log();\n }\n\n if (result.total > result.offset + result.limit) {\n const nextOffset = result.offset + result.limit;\n console.log(`๐Ÿ’ก Show more: jai1 image list -o ${nextOffset}`);\n }\n });\n}\n","import { Command } from 'commander';\nimport { ConfigService } from '../../services/config.service.js';\nimport { ImageService } from '../../services/image.service.js';\nimport { ValidationError } from '../../errors/index.js';\n\nexport function createImageInfoCommand(): Command {\n return new Command('info')\n .description('Get detailed info about an image')\n .argument('<id>', 'Image ID')\n .action(async (id) => {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n const imageService = new ImageService();\n const image = await imageService.getInfo(config, parseInt(id));\n\n console.log('\\n๐Ÿ“ธ Image Details:\\n');\n console.log(`ID: ${image.id}`);\n console.log(`Model: ${image.model}`);\n console.log(`Prompt: ${image.prompt}`);\n console.log(`URL: ${image.url}`);\n console.log(`Size: ${(image.contentSize / 1024).toFixed(2)} KB`);\n if (image.width && image.height) {\n console.log(`Dimensions: ${image.width}x${image.height}`);\n }\n console.log(`Created: ${new Date(image.createdAt).toLocaleString()}`);\n\n if (image.metadata) {\n const meta = typeof image.metadata === 'string' ? JSON.parse(image.metadata) : image.metadata;\n if (meta.aspectRatio) {\n console.log(`Ratio: ${meta.aspectRatio}`);\n }\n if (meta.negativePrompt) {\n console.log(`Negative: ${meta.negativePrompt}`);\n }\n if (meta.seed) {\n console.log(`Seed: ${meta.seed}`);\n }\n }\n });\n}\n","import { Command } from 'commander';\nimport { confirm } from '@inquirer/prompts';\nimport { ConfigService } from '../../services/config.service.js';\nimport { ImageService } from '../../services/image.service.js';\nimport { ValidationError } from '../../errors/index.js';\n\nexport function createImageDeleteCommand(): Command {\n return new Command('delete')\n .description('Delete a generated image')\n .argument('<id>', 'Image ID')\n .option('-y, --yes', 'Skip confirmation')\n .action(async (id, options) => {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n if (!options.yes) {\n const confirmed = await confirm({\n message: `Are you sure you want to delete image #${id}?`,\n default: false,\n });\n\n if (!confirmed) {\n console.log('Cancelled.');\n return;\n }\n }\n\n const imageService = new ImageService();\n await imageService.delete(config, parseInt(id));\n\n console.log(`โœ… Image #${id} deleted successfully.`);\n });\n}\n","/**\n * Feedback Command\n * Submit bug reports, feature requests, and suggestions\n * Supports both interactive and non-interactive modes\n */\nimport { Command } from 'commander';\nimport { select, input, confirm } from '@inquirer/prompts';\nimport { ConfigService } from '../services/config.service.js';\nimport { ValidationError } from '../errors/index.js';\nimport os from 'os';\nimport { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { selectTheme } from '../utils/prompt-theme.js';\n\ninterface FeedbackOptions {\n type?: string;\n title?: string;\n message?: string;\n context?: string;\n noContext?: boolean;\n json?: boolean;\n}\n\ninterface FeedbackContext {\n os?: string;\n cli_version?: string;\n project_name?: string;\n error_log?: string;\n}\n\n/**\n * Collect automatic context\n */\nasync function collectContext(): Promise<FeedbackContext> {\n const context: FeedbackContext = {\n os: `${os.platform()} ${os.release()}`,\n };\n\n // Get CLI version from package.json\n try {\n const packageJsonPath = new URL('../../package.json', import.meta.url);\n const packageJson = JSON.parse(await fs.readFile(packageJsonPath, 'utf-8'));\n context.cli_version = packageJson.version;\n } catch {\n // Ignore if can't read\n }\n\n // Get project name from package.json in current directory\n try {\n const projectPackageJson = await fs.readFile(join(process.cwd(), 'package.json'), 'utf-8');\n const projectData = JSON.parse(projectPackageJson);\n context.project_name = projectData.name;\n } catch {\n // Ignore if not in a project directory\n }\n\n return context;\n}\n\n/**\n * Submit feedback to API\n */\nasync function submitFeedback(\n apiUrl: string,\n accessKey: string,\n data: {\n type: string;\n title: string;\n message: string;\n context?: FeedbackContext;\n }\n): Promise<{ success: boolean; feedback_id?: string; error?: string }> {\n const response = await fetch(`${apiUrl}/api/feedback`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'JAI1-Access-Key': accessKey,\n },\n body: JSON.stringify({\n type: data.type,\n title: data.title,\n message: data.message,\n context: data.context,\n source: 'cli',\n }),\n });\n\n const result = await response.json();\n\n if (!response.ok) {\n return { success: false, error: result.error || 'Failed to submit feedback' };\n }\n\n return { success: true, feedback_id: result.data.feedback_id };\n}\n\n/**\n * Handle interactive feedback submission\n */\nasync function handleInteractiveFeedback(config: any): Promise<void> {\n console.log('๐Ÿ“ Submit Feedback to Jai1\\n');\n\n // Select type\n const type = await select({\n message: 'What type of feedback?',\n choices: [\n {\n name: '๐Ÿ› Bug Report - Report an error or issue',\n value: 'bug',\n },\n {\n name: '๐Ÿ’ก Feature Request - Suggest a new feature',\n value: 'feature',\n },\n {\n name: '๐Ÿ“ Suggestion - Share ideas or improvements',\n value: 'suggestion',\n },\n ],\n theme: selectTheme,\n });\n\n // Get title\n const title = await input({\n message: 'Title (max 200 characters):',\n validate: (value) => {\n if (!value || value.trim().length === 0) {\n return 'Title is required';\n }\n if (value.length > 200) {\n return 'Title must be 200 characters or less';\n }\n return true;\n },\n });\n\n // Get message\n const message = await input({\n message: 'Description (max 4000 characters):',\n validate: (value) => {\n if (!value || value.trim().length === 0) {\n return 'Description is required';\n }\n if (value.length > 4000) {\n return 'Description must be 4000 characters or less';\n }\n return true;\n },\n });\n\n // Collect context (always included by default)\n const context = await collectContext();\n\n // Show summary\n console.log('\\n๐Ÿ“‹ Summary:\\n');\n console.log(`Type: ${type}`);\n console.log(`Title: ${title}`);\n console.log(`Description: ${message.substring(0, 100)}${message.length > 100 ? '...' : ''}`);\n if (context) {\n console.log(`Context: OS: ${context.os}, CLI: ${context.cli_version || 'unknown'}`);\n }\n\n const confirmed = await confirm({\n message: '\\nSubmit feedback?',\n default: true,\n });\n\n if (!confirmed) {\n console.log('\\nโŒ Cancelled.');\n return;\n }\n\n // Submit\n console.log('\\nโณ Submitting feedback...');\n\n try {\n const result = await submitFeedback(config.apiUrl, config.accessKey, {\n type,\n title: title.trim(),\n message: message.trim(),\n context,\n });\n\n if (result.success) {\n console.log(`\\nโœ… Feedback submitted successfully!`);\n console.log(` Feedback ID: ${result.feedback_id}\\n`);\n console.log(' Thank you for your feedback! We will review it soon.');\n } else {\n console.error(`\\nโŒ Failed to submit feedback: ${result.error}`);\n process.exit(1);\n }\n } catch (error) {\n console.error('\\nโŒ Network error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\n/**\n * Handle non-interactive feedback submission\n */\nasync function handleNonInteractiveFeedback(config: any, options: FeedbackOptions): Promise<void> {\n // Validate required fields\n if (!options.type || !options.title || !options.message) {\n throw new ValidationError('Missing required fields: --type, --title, --message');\n }\n\n // Validate type\n const validTypes = ['bug', 'feature', 'suggestion'];\n if (!validTypes.includes(options.type)) {\n throw new ValidationError(`Invalid type. Must be one of: ${validTypes.join(', ')}`);\n }\n\n // Validate lengths\n if (options.title.length > 200) {\n throw new ValidationError('Title must be 200 characters or less');\n }\n\n if (options.message.length > 4000) {\n throw new ValidationError('Message must be 4000 characters or less');\n }\n\n // Collect context\n let context: FeedbackContext | undefined;\n if (!options.noContext) {\n context = await collectContext();\n\n // Merge custom context if provided\n if (options.context) {\n try {\n const customContext = JSON.parse(options.context);\n context = { ...context, ...customContext };\n } catch {\n throw new ValidationError('Invalid JSON in --context');\n }\n }\n }\n\n // Submit\n try {\n const result = await submitFeedback(config.apiUrl, config.accessKey, {\n type: options.type,\n title: options.title.trim(),\n message: options.message.trim(),\n context,\n });\n\n if (result.success) {\n if (options.json) {\n console.log(JSON.stringify({ success: true, feedback_id: result.feedback_id }));\n } else {\n console.log(`โœ… Feedback submitted: ${result.feedback_id}`);\n }\n } else {\n if (options.json) {\n console.log(JSON.stringify({ success: false, error: result.error }));\n } else {\n console.error(`โŒ Error: ${result.error}`);\n }\n process.exit(1);\n }\n } catch (error) {\n if (options.json) {\n console.log(JSON.stringify({ success: false, error: error instanceof Error ? error.message : 'Unknown error' }));\n } else {\n console.error('โŒ Error:', error instanceof Error ? error.message : String(error));\n }\n process.exit(1);\n }\n}\n\n/**\n * Handle feedback command\n */\nasync function handleFeedbackCommand(options: FeedbackOptions): Promise<void> {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n // Check if stdin has data (for piping)\n let stdinMessage = '';\n if (!process.stdin.isTTY && !options.message) {\n // Read from stdin\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(chunk);\n }\n stdinMessage = Buffer.concat(chunks).toString('utf-8').trim();\n }\n\n // If stdin provided, use non-interactive mode\n if (stdinMessage) {\n options.message = stdinMessage;\n }\n\n // Determine mode\n const isInteractive = !options.type && !options.title && !options.message;\n\n if (isInteractive) {\n await handleInteractiveFeedback(config);\n } else {\n await handleNonInteractiveFeedback(config, options);\n }\n}\n\n/**\n * Create feedback command\n */\nexport function createFeedbackCommand(): Command {\n const cmd = new Command('feedback')\n .alias('report')\n .description('Submit bug reports, feature requests, or suggestions')\n .option('--type <type>', 'Feedback type: bug, feature, suggestion')\n .option('--title <title>', 'Feedback title (max 200 chars)')\n .option('--message <message>', 'Feedback message (max 4000 chars)')\n .option('--context <json>', 'Additional context as JSON')\n .option('--no-context', 'Do not include automatic context')\n .option('--json', 'Output JSON format')\n .action(async (options: FeedbackOptions) => {\n await handleFeedbackCommand(options);\n });\n\n return cmd;\n}\n","/**\n * Client Info Command\n * Generate sanitized client info for debugging\n */\nimport { Command } from 'commander';\nimport { ConfigService } from '../services/config.service.js';\nimport { ComponentsService } from '../services/components.service.js';\nimport { IdeDetectionService } from '../services/ide-detection.service.js';\nimport { ValidationError } from '../errors/index.js';\nimport { ErrorLogService, type ErrorLogEntry } from '../services/error-log.service.js';\nimport { LlmProxyService } from '../services/llm-proxy.service.js';\nimport { confirm } from '@inquirer/prompts';\nimport os from 'os';\nimport { promises as fs } from 'fs';\nimport { basename, join } from 'path';\nimport { version as nodeVersion } from 'process';\nimport packageJson from '../../package.json' with { type: 'json' };\n\ninterface ClientInfoOptions {\n json?: boolean;\n full?: boolean;\n submit?: boolean;\n message?: string;\n showPaths?: boolean;\n}\n\ninterface ClientInfoPayload {\n timestamp: string;\n system: {\n os: string;\n arch: string;\n node: string;\n cliVersion: string | null;\n };\n config: {\n apiUrl: string;\n accessKeyMasked: string;\n frameworkVersion: string | null;\n lastUpdated: string | null;\n };\n project: {\n cwdBase: string;\n cwdFull?: string;\n hasJai1: boolean;\n componentCount: number;\n };\n ide: {\n primary: { id: string; name: string } | null;\n active: Array<{\n id: string;\n name: string;\n ruleCount: number;\n workflowCount: number;\n confidence: 'high' | 'medium' | 'low';\n }>;\n };\n components?: Array<{ filepath: string; version: string; modified: boolean }>;\n}\n\n/**\n * Create client-info command\n */\nexport function createClientInfoCommand(): Command {\n const cmd = new Command('client-info')\n .description('Tแบกo thรดng tin client ฤ‘แปƒ gแปญi ฤ‘แป™i phรกt triแปƒn jai1')\n .option('--json', 'Output as JSON')\n .option('--full', 'Include component list (top 20)')\n .option('--submit', 'Submit client info to Jai1 feedback endpoint')\n .option('--message <text>', 'Additional message when submitting')\n .option('--show-paths', 'Include full project path')\n .action(async (options: ClientInfoOptions) => {\n await handleClientInfo(options);\n });\n\n return cmd;\n}\n\nasync function handleClientInfo(options: ClientInfoOptions): Promise<void> {\n // Support global --json from root command as well\n const globalJson = process.argv.includes('--json');\n const useJsonOutput = options.json || globalJson;\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n const payload = await collectClientInfo(config, options);\n\n if (useJsonOutput) {\n if (!options.submit) {\n console.log(JSON.stringify(payload, null, 2));\n return;\n }\n } else {\n printTextPayload(payload, options.full === true);\n }\n\n if (options.submit) {\n const errorLogService = new ErrorLogService();\n const pendingLogs = await errorLogService.readForSubmit({ limitCount: 5, limitBytes: 50_000 });\n const errorLogs: ErrorLogEntry[] = pendingLogs.files.map((f) => f.entry);\n\n const verbose = process.argv.includes('--verbose');\n const summary = await generateAiSummary(config, payload, errorLogs, verbose);\n const approved = await confirmSubmit(summary, useJsonOutput);\n if (!approved) {\n if (!useJsonOutput) {\n console.log('\\nโŒ ฤรฃ huแปท gแปญi client info.');\n } else {\n console.log(JSON.stringify({ success: false, cancelled: true }, null, 2));\n }\n return;\n }\n\n const result = await submitClientInfo(config.apiUrl, config.accessKey, payload, errorLogs, summary);\n\n if (result.success) {\n await errorLogService.clear(pendingLogs.files.map((f) => f.path));\n }\n\n if (useJsonOutput) {\n console.log(JSON.stringify({ ...result, error_log_count: errorLogs.length }, null, 2));\n return;\n }\n\n if (result.success) {\n console.log(`\\nโœ… ฤรฃ gแปญi client info thร nh cรดng. ID: ${result.feedback_id}`);\n if (errorLogs.length > 0) {\n console.log(`๐Ÿงน ฤรฃ xoรก ${errorLogs.length} error log(s) sau khi gแปญi.`);\n }\n } else {\n console.error(`\\nโŒ Gแปญi client info thแบฅt bแบกi: ${result.error}`);\n process.exit(1);\n }\n }\n}\n\nasync function collectClientInfo(\n config: { apiUrl: string; accessKey: string; version: string | null; lastUpdated: string | null },\n options: ClientInfoOptions\n): Promise<ClientInfoPayload> {\n const cliVersion = packageJson.version ?? null;\n const timestamp = new Date().toISOString();\n\n const componentsService = new ComponentsService();\n const installedComponents = await componentsService.getInstalled();\n const componentEntries = Object.values(installedComponents);\n\n const hasJai1 = await hasProjectJai1();\n const projectCwd = process.cwd();\n\n const ideDetection = new IdeDetectionService(process.cwd());\n const ideSummary = await ideDetection.getSummary();\n\n const payload: ClientInfoPayload = {\n timestamp,\n system: {\n os: `${os.platform()} ${os.release()}`,\n arch: os.arch(),\n node: nodeVersion,\n cliVersion,\n },\n config: {\n apiUrl: config.apiUrl,\n accessKeyMasked: maskKey(config.accessKey),\n frameworkVersion: config.version,\n lastUpdated: config.lastUpdated,\n },\n project: {\n cwdBase: basename(projectCwd),\n hasJai1,\n componentCount: componentEntries.length,\n },\n ide: {\n primary: ideSummary.primary\n ? { id: ideSummary.primary.id, name: ideSummary.primary.name }\n : null,\n active: ideSummary.active.map((ide) => ({\n id: ide.id,\n name: ide.name,\n ruleCount: ide.ruleCount,\n workflowCount: ide.workflowCount,\n confidence: ide.confidence,\n })),\n },\n };\n\n if (options.showPaths) {\n payload.project.cwdFull = projectCwd;\n }\n\n if (options.full) {\n const topComponents = componentEntries\n .sort((a, b) => a.filepath.localeCompare(b.filepath))\n .slice(0, 20)\n .map((item) => ({\n filepath: item.filepath,\n version: item.version,\n modified: item.modified,\n }));\n\n payload.components = topComponents;\n }\n\n return payload;\n}\n\nasync function hasProjectJai1(): Promise<boolean> {\n const projectJai1 = join(process.cwd(), '.jai1');\n try {\n await fs.access(projectJai1);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction maskKey(key: string): string {\n if (key.length <= 4) return '****';\n return '****' + key.slice(-4);\n}\n\nfunction printTextPayload(payload: ClientInfoPayload, includeComponents: boolean): void {\n console.log('JAI1 CLIENT INFO');\n console.log('----------------');\n console.log(`timestamp: ${payload.timestamp}`);\n\n console.log('\\nsystem:');\n console.log(` os: ${payload.system.os}`);\n console.log(` arch: ${payload.system.arch}`);\n console.log(` node: ${payload.system.node}`);\n console.log(` cli_version: ${payload.system.cliVersion ?? 'unknown'}`);\n\n console.log('\\nconfig:');\n console.log(` api_url: ${payload.config.apiUrl}`);\n console.log(` access_key: ${payload.config.accessKeyMasked}`);\n console.log(` framework_version: ${payload.config.frameworkVersion ?? 'unknown'}`);\n console.log(` last_updated: ${payload.config.lastUpdated ?? 'unknown'}`);\n\n console.log('\\nproject:');\n console.log(` cwd: ${payload.project.cwdBase}`);\n if (payload.project.cwdFull) {\n console.log(` cwd_full: ${payload.project.cwdFull}`);\n }\n console.log(` jai1_present: ${payload.project.hasJai1}`);\n console.log(` component_count: ${payload.project.componentCount}`);\n\n console.log('\\nide:');\n if (payload.ide.primary) {\n console.log(` primary: ${payload.ide.primary.id} (${payload.ide.primary.name})`);\n } else {\n console.log(' primary: none');\n }\n if (payload.ide.active.length === 0) {\n console.log(' active: none');\n } else {\n console.log(' active:');\n for (const ide of payload.ide.active) {\n console.log(\n ` - ${ide.id} (${ide.name}) rules=${ide.ruleCount} workflows=${ide.workflowCount} confidence=${ide.confidence}`\n );\n }\n }\n\n if (includeComponents && payload.components) {\n console.log('\\ncomponents:');\n if (payload.components.length === 0) {\n console.log(' none');\n } else {\n for (const component of payload.components) {\n const modifiedLabel = component.modified ? ' modified' : '';\n console.log(` - ${component.filepath}@${component.version}${modifiedLabel}`);\n }\n }\n }\n}\n\ntype FeedbackDraft = {\n type: 'bug' | 'feature' | 'suggestion';\n title: string;\n message: string;\n};\n\nconst DEFAULT_FEEDBACK: FeedbackDraft = {\n type: 'bug',\n title: 'Client Info Report',\n message: 'Client info auto-generated by jai1 CLI.',\n};\n\nasync function submitClientInfo(\n apiUrl: string,\n accessKey: string,\n payload: ClientInfoPayload,\n errorLogs: ErrorLogEntry[],\n summary: FeedbackDraft\n): Promise<{ success: boolean; feedback_id?: string; error?: string }> {\n const response = await fetch(`${apiUrl}/api/feedback`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'JAI1-Access-Key': accessKey,\n },\n body: JSON.stringify({\n type: summary.type,\n title: summary.title,\n message: summary.message,\n context: {\n client_info: payload,\n error_logs: errorLogs,\n },\n source: 'cli',\n }),\n });\n\n const result = await response.json();\n\n if (!response.ok) {\n return { success: false, error: result.error || 'Failed to submit client info' };\n }\n\n return { success: true, feedback_id: result.data?.feedback_id };\n}\n\nfunction buildSummaryPrompt(payload: ClientInfoPayload, errorLogs: ErrorLogEntry[]): string {\n return [\n 'Bแบกn lร  trแปฃ lรฝ kแปน thuแบญt. Hรฃy tแบกo JSON hแปฃp lแป‡ vแป›i 3 trฦฐแปng: type, title, message.',\n '- type chแป‰ ฤ‘ฦฐแปฃc lร : bug | feature | suggestion.',\n '- title <= 200 kรฝ tแปฑ.',\n '- message <= 4000 kรฝ tแปฑ, vร  lร  tรณm tแบฏt lแป—i + thรดng tin client quan trแปng.',\n '- message phแบฃi lร  tiแบฟng Viแป‡t, ngแบฏn gแปn, rรต rร ng.',\n '- Khรดng thรชm giแบฃi thรญch ngoร i JSON.',\n '',\n 'Dแปฏ liแป‡u ฤ‘แบงu vร o (JSON):',\n JSON.stringify({ client_info: payload, error_logs: errorLogs }, null, 2),\n ].join('\\n');\n}\n\nfunction parseSummaryDraft(raw: string): FeedbackDraft | null {\n try {\n const cleaned = raw.trim().replace(/^```json\\s*/i, '').replace(/```$/i, '');\n const parsed = JSON.parse(cleaned) as FeedbackDraft;\n if (!parsed || typeof parsed !== 'object') return null;\n if (!['bug', 'feature', 'suggestion'].includes(parsed.type)) return null;\n if (!parsed.title || parsed.title.length > 200) return null;\n if (!parsed.message || parsed.message.length > 4000) return null;\n return parsed;\n } catch {\n return null;\n }\n}\n\nasync function generateAiSummary(\n config: { apiUrl: string; accessKey: string },\n payload: ClientInfoPayload,\n errorLogs: ErrorLogEntry[],\n verbose: boolean\n): Promise<FeedbackDraft> {\n const llm = new LlmProxyService({ apiUrl: config.apiUrl, accessKey: config.accessKey } as any);\n const prompt = buildSummaryPrompt(payload, errorLogs);\n try {\n const content = await llm.chat([\n { role: 'system', content: 'Return ONLY valid JSON. Do not add any extra text.' },\n { role: 'user', content: prompt },\n ], 'gemini-3-flash');\n\n const parsed = parseSummaryDraft(content);\n if (parsed) return parsed;\n\n if (verbose) {\n console.error('Khรดng parse ฤ‘ฦฐแปฃc JSON tแปซ AI. Raw output:');\n console.error(content.slice(0, 2000));\n }\n } catch (error) {\n if (verbose) {\n console.error('AI summary failed:', error instanceof Error ? error.message : String(error));\n }\n }\n\n return DEFAULT_FEEDBACK;\n}\n\nasync function confirmSubmit(summary: FeedbackDraft, jsonMode: boolean): Promise<boolean> {\n if (jsonMode) {\n return true;\n }\n\n console.log('\\nAI SUMMARY (PREVIEW)');\n console.log('---------------------');\n console.log(`type: ${summary.type}`);\n console.log(`title: ${summary.title}`);\n console.log('message:');\n console.log(summary.message);\n\n return confirm({ message: 'Gแปญi client info vแป›i nแป™i dung trรชn?', default: true });\n}\n","/**\n * Errors Command Group\n * Manage local error logs: list, show, clear\n */\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { createErrorsListSubcommand } from './list.js';\nimport { createErrorsShowSubcommand } from './show.js';\nimport { createErrorsClearSubcommand } from './clear.js';\n\nfunction showErrorsHelp(): void {\n console.log(chalk.bold.cyan('๐Ÿงพ jai1 errors') + chalk.dim(' - Quแบฃn lรฝ error logs cแปฅc bแป™'));\n console.log();\n console.log(chalk.bold('Cรกc lแป‡nh:'));\n console.log(` ${chalk.cyan('list')} Danh sรกch error logs`);\n console.log(` ${chalk.cyan('show')} Xem chi tiแบฟt error log`);\n console.log(` ${chalk.cyan('clear')} Xoรก error logs`);\n console.log();\n console.log(chalk.bold('Vรญ dแปฅ:'));\n console.log(chalk.dim(' $ jai1 errors list'));\n console.log(chalk.dim(' $ jai1 errors show <id>'));\n console.log(chalk.dim(' $ jai1 errors clear --all'));\n console.log();\n console.log(chalk.dim('Chแบกy \"jai1 errors <lแป‡nh> --help\" ฤ‘แปƒ xem chi tiแบฟt'));\n}\n\nexport function createErrorsCommand(): Command {\n const errorsCommand = new Command('errors')\n .description('Manage local error logs')\n .action(() => {\n showErrorsHelp();\n });\n\n errorsCommand.addCommand(createErrorsListSubcommand());\n errorsCommand.addCommand(createErrorsShowSubcommand());\n errorsCommand.addCommand(createErrorsClearSubcommand());\n\n return errorsCommand;\n}\n","/**\n * Errors List Subcommand\n */\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport Table from 'cli-table3';\nimport { ErrorLogService } from '../../services/error-log.service.js';\n\nexport function createErrorsListSubcommand(): Command {\n return new Command('list')\n .description('Danh sรกch error logs')\n .option('--json', 'Output JSON format')\n .action(async (options: { json?: boolean }) => {\n const service = new ErrorLogService();\n const paths = await service.list();\n\n if (paths.length === 0) {\n if (options.json) {\n console.log(JSON.stringify({ logs: [] }, null, 2));\n } else {\n console.log('โœจ Khรดng cรณ error logs nร o.');\n }\n return;\n }\n\n const logs = [] as Array<{ id: string; timestamp?: string; command?: string; message?: string }>;\n for (const path of paths) {\n const read = await service.readLog(path);\n if (read) {\n logs.push({\n id: path.split('/').pop()?.replace(/\\.json$/, '') || path,\n timestamp: read.entry.timestamp,\n command: read.entry.command,\n message: read.entry.message,\n });\n }\n }\n\n if (options.json) {\n console.log(JSON.stringify({ logs }, null, 2));\n return;\n }\n\n const table = new Table({\n head: ['ID', 'Timestamp', 'Command', 'Message'],\n colWidths: [36, 26, 16, 60],\n wordWrap: true,\n });\n\n for (const log of logs) {\n table.push([\n chalk.cyan(log.id),\n log.timestamp || '-',\n log.command || '-',\n log.message || '-',\n ]);\n }\n\n console.log(table.toString());\n });\n}\n","/**\n * Errors Show Subcommand\n */\nimport { Command } from 'commander';\nimport { ErrorLogService } from '../../services/error-log.service.js';\n\nexport function createErrorsShowSubcommand(): Command {\n return new Command('show')\n .description('Xem chi tiแบฟt error log')\n .argument('[id]', 'Error log id (default: latest)')\n .option('--json', 'Output JSON format')\n .action(async (id: string | undefined, options: { json?: boolean }) => {\n const service = new ErrorLogService();\n const paths = await service.list();\n\n if (paths.length === 0) {\n console.log('โœจ Khรดng cรณ error logs nร o.');\n return;\n }\n\n let targetPath: string | undefined;\n if (!id) {\n targetPath = paths[0];\n } else {\n targetPath = paths.find((p) => p.endsWith(`${id}.json`));\n }\n\n if (!targetPath) {\n console.error(`โŒ Khรดng tรฌm thแบฅy log: ${id}`);\n process.exit(1);\n }\n\n const read = await service.readLog(targetPath);\n if (!read) {\n console.error('โŒ Khรดng thแปƒ ฤ‘แปc log file.');\n process.exit(1);\n }\n\n console.log(JSON.stringify(read.entry, null, 2));\n });\n}\n","/**\n * Errors Clear Subcommand\n */\nimport { Command } from 'commander';\nimport { confirm } from '@inquirer/prompts';\nimport { ErrorLogService } from '../../services/error-log.service.js';\n\ninterface ClearOptions {\n all?: boolean;\n id?: string;\n yes?: boolean;\n}\n\nexport function createErrorsClearSubcommand(): Command {\n return new Command('clear')\n .description('Xoรก error logs')\n .option('--all', 'Delete all error logs')\n .option('--id <id>', 'Delete one error log by id')\n .option('-y, --yes', 'Skip confirmation')\n .action(async (options: ClearOptions) => {\n const service = new ErrorLogService();\n const paths = await service.list();\n\n if (paths.length === 0) {\n console.log('โœจ Khรดng cรณ error logs nร o ฤ‘แปƒ xoรก.');\n return;\n }\n\n if (options.all) {\n if (!(options.yes || (await confirm({ message: 'Xoรก tแบฅt cแบฃ error logs?', default: false })))) {\n console.log('โŒ ฤรฃ huแปท.');\n return;\n }\n await service.clear(paths);\n console.log(`โœ… ฤรฃ xoรก ${paths.length} error logs.`);\n return;\n }\n\n if (!options.id) {\n console.error('โŒ Vui lรฒng dรนng --id <id> hoแบทc --all.');\n process.exit(1);\n }\n\n const targetPath = paths.find((p) => p.endsWith(`${options.id}.json`));\n if (!targetPath) {\n console.error(`โŒ Khรดng tรฌm thแบฅy log: ${options.id}`);\n process.exit(1);\n }\n\n if (!(options.yes || (await confirm({ message: `Xoรก log ${options.id}?`, default: false })))) {\n console.log('โŒ ฤรฃ huแปท.');\n return;\n }\n\n await service.clear([targetPath]);\n console.log(`โœ… ฤรฃ xoรก log ${options.id}.`);\n });\n}\n","/**\n * Utils Command Group\n * Developer utilities for common tasks\n */\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { createPasswordCommand } from './password.js';\nimport { createUuidCommand } from './uuid.js';\nimport { createHashCommand } from './hash.js';\nimport { createBase64EncodeCommand } from './base64-encode.js';\nimport { createBase64DecodeCommand } from './base64-decode.js';\nimport { createHttpCommand } from './http.js';\nimport { createJwtCommand } from './jwt.js';\nimport { createUnixTimeCommand } from './unix-time.js';\nimport { createTimezoneCommand } from './timezone.js';\nimport { createUrlEncodeCommand } from './url-encode.js';\nimport { createUrlDecodeCommand } from './url-decode.js';\nimport { createCronCommand } from './cron.js';\nimport { createMarkdownPreviewCommand } from './markdown-preview.js';\nimport { runInteractiveMode } from './interactive.js';\n\nfunction showUtilsHelp(): void {\n console.log(chalk.bold.cyan('๐Ÿ› ๏ธ jai1 utils') + chalk.dim(' - Developer utilities'));\n console.log();\n console.log(chalk.bold('Mรฃ hรณa & Bแบฃo mแบญt:'));\n console.log(` ${chalk.cyan('password')} Tแบกo mแบญt khแบฉu ngแบซu nhiรชn`);\n console.log(` ${chalk.cyan('uuid')} Tแบกo UUID v4`);\n console.log(` ${chalk.cyan('hash')} Hash text (MD5/SHA/bcrypt)`);\n console.log(` ${chalk.cyan('jwt')} Decode/encode JWT tokens`);\n console.log();\n console.log(chalk.bold('Encoding:'));\n console.log(` ${chalk.cyan('base64-encode')} Encode sang Base64`);\n console.log(` ${chalk.cyan('base64-decode')} Decode tแปซ Base64`);\n console.log(` ${chalk.cyan('url-encode')} Encode URL components`);\n console.log(` ${chalk.cyan('url-decode')} Decode URL components`);\n console.log();\n console.log(chalk.bold('Thแปi gian:'));\n console.log(` ${chalk.cyan('unix-time')} Chuyแปƒn ฤ‘แป•i unix timestamp`);\n console.log(` ${chalk.cyan('timezone')} Chuyแปƒn ฤ‘แป•i mรบi giแป`);\n console.log(` ${chalk.cyan('cron')} Parse cron expressions`);\n console.log();\n console.log(chalk.bold('Khรกc:'));\n console.log(` ${chalk.cyan('http')} Gแปญi HTTP requests`);\n console.log(` ${chalk.cyan('markdown-preview')} Xem trฦฐแป›c file markdown`);\n console.log();\n console.log(chalk.bold('Chแบฟ ฤ‘แป™ Interactive:'));\n console.log(chalk.dim(' $ jai1 utils -i'));\n console.log(chalk.dim(' $ jai1 utils --interactive'));\n console.log();\n console.log(chalk.bold('Vรญ dแปฅ:'));\n console.log(chalk.dim(' $ jai1 utils password --length 24'));\n console.log(chalk.dim(' $ jai1 utils uuid --count 5'));\n console.log(chalk.dim(' $ jai1 utils hash \"text\" --algorithm sha256'));\n console.log(chalk.dim(' $ jai1 utils http https://api.example.com'));\n console.log();\n console.log(chalk.dim('Chแบกy \"jai1 utils <lแป‡nh> --help\" ฤ‘แปƒ xem chi tiแบฟt'));\n}\n\n/**\n * Create utils command group\n */\nexport function createUtilsCommand(): Command {\n const utilsCommand = new Command('utils')\n .description('Developer utilities for common tasks')\n .option('-i, --interactive', 'Run in interactive mode');\n\n // Add all subcommands\n utilsCommand.addCommand(createPasswordCommand());\n utilsCommand.addCommand(createUuidCommand());\n utilsCommand.addCommand(createHashCommand());\n utilsCommand.addCommand(createBase64EncodeCommand());\n utilsCommand.addCommand(createBase64DecodeCommand());\n utilsCommand.addCommand(createHttpCommand());\n utilsCommand.addCommand(createJwtCommand());\n utilsCommand.addCommand(createUnixTimeCommand());\n utilsCommand.addCommand(createTimezoneCommand());\n utilsCommand.addCommand(createUrlEncodeCommand());\n utilsCommand.addCommand(createUrlDecodeCommand());\n utilsCommand.addCommand(createCronCommand());\n utilsCommand.addCommand(createMarkdownPreviewCommand());\n\n // Default action - interactive mode if no subcommand, otherwise show help\n utilsCommand.action(async (options) => {\n if (options.interactive) {\n await runInteractiveMode();\n } else {\n showUtilsHelp();\n }\n });\n\n return utilsCommand;\n}\n","/**\n * Password Generation Command\n * Generate secure random passwords\n */\nimport { Command } from 'commander';\nimport { UtilsService } from '../../services/utils.service.js';\n\nasync function handlePasswordGeneration(options: {\n length: number;\n lowercase: boolean;\n uppercase: boolean;\n digits: boolean;\n symbols: boolean;\n symbolChars?: string;\n count: number;\n}): Promise<void> {\n const service = new UtilsService();\n\n try {\n const passwords: string[] = [];\n\n for (let i = 0; i < options.count; i++) {\n const password = service.generatePassword({\n length: options.length,\n lowercase: options.lowercase,\n uppercase: options.uppercase,\n digits: options.digits,\n symbols: options.symbols,\n symbolChars: options.symbolChars,\n });\n passwords.push(password);\n }\n\n console.log('๐Ÿ” Generated Password(s):');\n console.log('โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\\n');\n\n passwords.forEach((password, index) => {\n if (options.count > 1) {\n console.log(` ${index + 1}. ${password}`);\n } else {\n console.log(` ${password}`);\n }\n });\n\n console.log();\n } catch (error) {\n console.error('โŒ Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\nexport function createPasswordCommand(): Command {\n const cmd = new Command('password')\n .description('Generate secure random password')\n .option('-l, --length <number>', 'Password length', '16')\n .option('--no-lowercase', 'Exclude lowercase letters')\n .option('--no-uppercase', 'Exclude uppercase letters')\n .option('--no-digits', 'Exclude digits')\n .option('--no-symbols', 'Exclude symbols')\n .option('--symbol-chars <chars>', 'Custom symbol characters')\n .option('-c, --count <number>', 'Number of passwords to generate', '1')\n .addHelpText('after', `\nExamples:\n $ jai1 utils password\n $ jai1 utils password --length 24\n $ jai1 utils password --no-symbols\n $ jai1 utils password --count 5\n $ jai1 utils password -l 32 --no-digits\n`)\n .action(async (options) => {\n await handlePasswordGeneration({\n ...options,\n length: parseInt(options.length, 10),\n count: parseInt(options.count, 10),\n });\n });\n\n return cmd;\n}\n","/**\n * Utils Service\n * Core utility functions for developer tools\n */\nimport crypto from 'crypto';\nimport bcrypt from 'bcryptjs';\nimport { readFile } from 'fs/promises';\n\n// ============================================\n// TYPES\n// ============================================\n\nexport interface PasswordOptions {\n length: number;\n lowercase: boolean;\n uppercase: boolean;\n digits: boolean;\n symbols: boolean;\n symbolChars?: string;\n}\n\nexport interface UuidOptions {\n uppercase?: boolean;\n noHyphens?: boolean;\n}\n\nexport type HashAlgorithm = 'md5' | 'sha1' | 'sha256' | 'sha512' | 'bcrypt';\n\nexport interface HttpRequestOptions {\n method: string;\n headers?: Record<string, string>;\n body?: string;\n timeout?: number;\n followRedirects?: boolean;\n}\n\nexport interface HttpResponse {\n status: number;\n statusText: string;\n headers: Record<string, string>;\n body: string;\n timing: number;\n size: number;\n}\n\n// ============================================\n// UTILS SERVICE\n// ============================================\n\nexport class UtilsService {\n /**\n * Generate secure random password\n */\n generatePassword(options: PasswordOptions): string {\n const {\n length,\n lowercase,\n uppercase,\n digits,\n symbols,\n symbolChars = '!@#$%^&*()_+-=[]{}|;:,.<>?'\n } = options;\n\n let charset = '';\n if (lowercase) charset += 'abcdefghijklmnopqrstuvwxyz';\n if (uppercase) charset += 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\n if (digits) charset += '0123456789';\n if (symbols) charset += symbolChars;\n\n if (charset.length === 0) {\n throw new Error('At least one character type must be enabled');\n }\n\n const randomBytes = crypto.randomBytes(length);\n let password = '';\n\n for (let i = 0; i < length; i++) {\n const randomIndex = randomBytes[i] % charset.length;\n password += charset[randomIndex];\n }\n\n return password;\n }\n\n /**\n * Generate UUID v4\n */\n generateUuid(options?: UuidOptions): string {\n let uuid = crypto.randomUUID();\n\n if (options?.uppercase) {\n uuid = uuid.toUpperCase();\n }\n\n if (options?.noHyphens) {\n uuid = uuid.replace(/-/g, '');\n }\n\n return uuid;\n }\n\n /**\n * Hash text or file using specified algorithm\n */\n async hash(input: string | Buffer, algorithm: HashAlgorithm): Promise<string> {\n if (algorithm === 'bcrypt') {\n throw new Error('Use hashBcrypt for bcrypt algorithm');\n }\n\n const hash = crypto.createHash(algorithm);\n hash.update(input);\n return hash.digest('hex');\n }\n\n /**\n * Hash file contents\n */\n async hashFile(filePath: string, algorithm: HashAlgorithm): Promise<string> {\n const content = await readFile(filePath);\n return this.hash(content, algorithm);\n }\n\n /**\n * Hash using bcrypt\n */\n async hashBcrypt(input: string, rounds: number = 10): Promise<string> {\n return bcrypt.hash(input, rounds);\n }\n\n /**\n * Base64 encode\n */\n base64Encode(input: string | Buffer, urlSafe: boolean = false): string {\n const buffer = typeof input === 'string' ? Buffer.from(input, 'utf-8') : input;\n let encoded = buffer.toString('base64');\n\n if (urlSafe) {\n encoded = encoded.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n }\n\n return encoded;\n }\n\n /**\n * Base64 decode\n */\n base64Decode(input: string): Buffer {\n // Handle URL-safe base64\n let normalized = input.replace(/-/g, '+').replace(/_/g, '/');\n\n // Add padding if needed\n while (normalized.length % 4) {\n normalized += '=';\n }\n\n return Buffer.from(normalized, 'base64');\n }\n\n /**\n * Make HTTP request with detailed output\n */\n async httpRequest(url: string, options: HttpRequestOptions): Promise<HttpResponse> {\n const startTime = performance.now();\n\n const fetchOptions: RequestInit = {\n method: options.method,\n headers: options.headers,\n body: options.body,\n signal: options.timeout ? AbortSignal.timeout(options.timeout) : undefined,\n redirect: options.followRedirects === false ? 'manual' : 'follow',\n };\n\n const response = await fetch(url, fetchOptions);\n const body = await response.text();\n const endTime = performance.now();\n\n const headers: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n headers[key] = value;\n });\n\n return {\n status: response.status,\n statusText: response.statusText,\n headers,\n body,\n timing: Math.round(endTime - startTime),\n size: Buffer.byteLength(body, 'utf-8'),\n };\n }\n\n /**\n * Decode JWT (no verification)\n */\n jwtDecode(token: string): { header: object; payload: object; signature: string } {\n const parts = token.split('.');\n if (parts.length !== 3) {\n throw new Error('Invalid JWT format');\n }\n\n const [headerB64, payloadB64, signature] = parts;\n\n const header = JSON.parse(this.base64Decode(headerB64).toString('utf-8'));\n const payload = JSON.parse(this.base64Decode(payloadB64).toString('utf-8'));\n\n return { header, payload, signature };\n }\n\n /**\n * Encode JWT (HS256 only)\n */\n jwtEncode(payload: object, secret: string, header?: object): string {\n const defaultHeader = { alg: 'HS256', typ: 'JWT' };\n const finalHeader = { ...defaultHeader, ...header };\n\n const headerB64 = this.base64Encode(JSON.stringify(finalHeader), true);\n const payloadB64 = this.base64Encode(JSON.stringify(payload), true);\n\n const signatureInput = `${headerB64}.${payloadB64}`;\n const signature = crypto\n .createHmac('sha256', secret)\n .update(signatureInput)\n .digest('base64')\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=/g, '');\n\n return `${headerB64}.${payloadB64}.${signature}`;\n }\n\n /**\n * Convert unix timestamp to date\n */\n unixToDate(timestamp: number, milliseconds: boolean = false): Date {\n return new Date(milliseconds ? timestamp : timestamp * 1000);\n }\n\n /**\n * Convert date to unix timestamp\n */\n dateToUnix(date: Date, milliseconds: boolean = false): number {\n const timestamp = date.getTime();\n return milliseconds ? timestamp : Math.floor(timestamp / 1000);\n }\n\n /**\n * Convert time between timezones\n */\n convertTimezone(\n time: Date | string,\n fromTimezone: string,\n toTimezone: string\n ): { time: string; iso: string } {\n const date = typeof time === 'string' ? new Date(time) : time;\n\n // Format in target timezone\n const formatter = new Intl.DateTimeFormat('en-US', {\n timeZone: toTimezone,\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n hour12: false,\n });\n\n const parts = formatter.formatToParts(date);\n const dateParts = parts.reduce((acc, part) => {\n if (part.type !== 'literal') {\n acc[part.type] = part.value;\n }\n return acc;\n }, {} as Record<string, string>);\n\n const time24 = `${dateParts.year}-${dateParts.month}-${dateParts.day} ${dateParts.hour}:${dateParts.minute}:${dateParts.second}`;\n\n return {\n time: time24,\n iso: date.toISOString(),\n };\n }\n\n /**\n * Get list of available timezones\n */\n getTimezones(): string[] {\n // Common timezones\n return [\n 'UTC',\n 'America/New_York',\n 'America/Chicago',\n 'America/Denver',\n 'America/Los_Angeles',\n 'America/Sao_Paulo',\n 'Europe/London',\n 'Europe/Paris',\n 'Europe/Berlin',\n 'Europe/Moscow',\n 'Asia/Dubai',\n 'Asia/Kolkata',\n 'Asia/Bangkok',\n 'Asia/Shanghai',\n 'Asia/Tokyo',\n 'Asia/Seoul',\n 'Asia/Ho_Chi_Minh',\n 'Australia/Sydney',\n 'Pacific/Auckland',\n ];\n }\n\n /**\n * URL encode\n */\n urlEncode(input: string, full: boolean = false): string {\n return full ? encodeURI(input) : encodeURIComponent(input);\n }\n\n /**\n * URL decode\n */\n urlDecode(input: string, full: boolean = false): string {\n return full ? decodeURI(input) : decodeURIComponent(input);\n }\n\n /**\n * Format bytes to human-readable size\n */\n formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return `${(bytes / Math.pow(k, i)).toFixed(1)} ${sizes[i]}`;\n }\n}\n","/**\n * UUID Generation Command\n * Generate UUID v4 identifiers\n */\nimport { Command } from 'commander';\nimport { UtilsService } from '../../services/utils.service.js';\n\nasync function handleUuidGeneration(options: {\n count: number;\n uppercase: boolean;\n noHyphens: boolean;\n}): Promise<void> {\n const service = new UtilsService();\n\n try {\n const uuids: string[] = [];\n\n for (let i = 0; i < options.count; i++) {\n const uuid = service.generateUuid({\n uppercase: options.uppercase,\n noHyphens: options.noHyphens,\n });\n uuids.push(uuid);\n }\n\n console.log('๐Ÿ†” Generated UUID(s):');\n console.log('โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\\n');\n\n uuids.forEach((uuid, index) => {\n if (options.count > 1) {\n console.log(` ${index + 1}. ${uuid}`);\n } else {\n console.log(` ${uuid}`);\n }\n });\n\n console.log();\n } catch (error) {\n console.error('โŒ Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\nexport function createUuidCommand(): Command {\n const cmd = new Command('uuid')\n .description('Generate UUID v4 identifier')\n .option('-c, --count <number>', 'Number of UUIDs to generate', '1')\n .option('--uppercase', 'Output in uppercase')\n .option('--no-hyphens', 'Remove hyphens from output')\n .addHelpText('after', `\nExamples:\n $ jai1 utils uuid\n $ jai1 utils uuid --count 10\n $ jai1 utils uuid --uppercase\n $ jai1 utils uuid --no-hyphens\n $ jai1 utils uuid --uppercase --no-hyphens\n`)\n .action(async (options) => {\n await handleUuidGeneration({\n ...options,\n count: parseInt(options.count, 10),\n });\n });\n\n return cmd;\n}\n","/**\n * Hash Generation Command\n * Generate hash using MD5, SHA, or bcrypt\n */\nimport { Command } from 'commander';\nimport { UtilsService, HashAlgorithm } from '../../services/utils.service.js';\n\nasync function handleHashGeneration(\n input: string | undefined,\n options: {\n algorithm: HashAlgorithm;\n file?: string;\n rounds: number;\n }\n): Promise<void> {\n const service = new UtilsService();\n\n try {\n let hash: string;\n\n if (options.file) {\n // Hash file contents\n if (options.algorithm === 'bcrypt') {\n console.error('โŒ bcrypt cannot be used with files (it requires string input)');\n process.exit(1);\n }\n hash = await service.hashFile(options.file, options.algorithm);\n } else {\n // Hash text input\n if (!input) {\n console.error('โŒ Please provide input text or use --file option');\n process.exit(1);\n }\n\n if (options.algorithm === 'bcrypt') {\n hash = await service.hashBcrypt(input, options.rounds);\n } else {\n hash = await service.hash(input, options.algorithm);\n }\n }\n\n console.log('๐Ÿ”’ Hash Result:');\n console.log('โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€');\n console.log(` Algorithm: ${options.algorithm.toUpperCase()}`);\n if (options.file) {\n console.log(` File: ${options.file}`);\n }\n if (options.algorithm === 'bcrypt') {\n console.log(` Rounds: ${options.rounds}`);\n }\n console.log();\n console.log(` ${hash}`);\n console.log();\n } catch (error) {\n console.error('โŒ Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\nexport function createHashCommand(): Command {\n const cmd = new Command('hash')\n .description('Generate hash (MD5, SHA, bcrypt)')\n .argument('[input]', 'Text to hash')\n .option(\n '-a, --algorithm <algorithm>',\n 'Hash algorithm (md5, sha1, sha256, sha512, bcrypt)',\n 'sha256'\n )\n .option('-f, --file <path>', 'Hash file contents instead of text')\n .option('-r, --rounds <number>', 'Bcrypt rounds (only for bcrypt)', '10')\n .addHelpText('after', `\nExamples:\n $ jai1 utils hash \"hello world\"\n $ jai1 utils hash \"hello\" --algorithm md5\n $ jai1 utils hash \"password\" --algorithm bcrypt\n $ jai1 utils hash \"password\" --algorithm bcrypt --rounds 12\n $ jai1 utils hash --file ./myfile.txt\n $ jai1 utils hash --file ./image.png --algorithm sha512\n`)\n .action(async (input, options) => {\n await handleHashGeneration(input, {\n ...options,\n rounds: parseInt(options.rounds, 10),\n });\n });\n\n return cmd;\n}\n","/**\n * Base64 Encode Command\n * Encode text or files to Base64\n */\nimport { Command } from 'commander';\nimport { readFile } from 'fs/promises';\nimport { UtilsService } from '../../services/utils.service.js';\n\nasync function handleBase64Encode(\n input: string | undefined,\n options: {\n file?: string;\n urlSafe: boolean;\n }\n): Promise<void> {\n const service = new UtilsService();\n\n try {\n let encoded: string;\n\n if (options.file) {\n const content = await readFile(options.file);\n encoded = service.base64Encode(content, options.urlSafe);\n } else {\n if (!input) {\n console.error('โŒ Please provide input text or use --file option');\n process.exit(1);\n }\n encoded = service.base64Encode(input, options.urlSafe);\n }\n\n console.log('๐Ÿ“ Base64 Encoded:');\n console.log('โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€');\n if (options.file) {\n console.log(` File: ${options.file}`);\n }\n if (options.urlSafe) {\n console.log(` Format: URL-safe`);\n }\n console.log();\n console.log(` ${encoded}`);\n console.log();\n } catch (error) {\n console.error('โŒ Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\nexport function createBase64EncodeCommand(): Command {\n const cmd = new Command('base64-encode')\n .description('Encode text or file to Base64')\n .argument('[input]', 'Text to encode')\n .option('-f, --file <path>', 'Encode file contents')\n .option('--url-safe', 'Use URL-safe Base64 encoding')\n .addHelpText('after', `\nExamples:\n $ jai1 utils base64-encode \"hello world\"\n $ jai1 utils base64-encode \"hello world\" --url-safe\n $ jai1 utils base64-encode --file ./document.txt\n $ jai1 utils base64-encode --file ./image.png\n`)\n .action(async (input, options) => {\n await handleBase64Encode(input, options);\n });\n\n return cmd;\n}\n","/**\n * Base64 Decode Command\n * Decode Base64 strings\n */\nimport { Command } from 'commander';\nimport { readFile, writeFile } from 'fs/promises';\nimport { UtilsService } from '../../services/utils.service.js';\n\nasync function handleBase64Decode(\n input: string | undefined,\n options: {\n file?: string;\n output?: string;\n }\n): Promise<void> {\n const service = new UtilsService();\n\n try {\n let encodedInput: string;\n\n if (options.file) {\n encodedInput = await readFile(options.file, 'utf-8');\n } else {\n if (!input) {\n console.error('โŒ Please provide Base64 input or use --file option');\n process.exit(1);\n }\n encodedInput = input;\n }\n\n const decoded = service.base64Decode(encodedInput.trim());\n\n if (options.output) {\n await writeFile(options.output, decoded);\n console.log('โœ… Decoded and saved to:', options.output);\n } else {\n console.log('๐Ÿ“ Base64 Decoded:');\n console.log('โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€');\n console.log();\n console.log(` ${decoded.toString('utf-8')}`);\n console.log();\n }\n } catch (error) {\n console.error('โŒ Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\nexport function createBase64DecodeCommand(): Command {\n const cmd = new Command('base64-decode')\n .description('Decode Base64 string')\n .argument('[input]', 'Base64 string to decode')\n .option('-f, --file <path>', 'Decode from file')\n .option('-o, --output <path>', 'Write decoded output to file')\n .addHelpText('after', `\nExamples:\n $ jai1 utils base64-decode \"aGVsbG8gd29ybGQ=\"\n $ jai1 utils base64-decode --file ./encoded.txt\n $ jai1 utils base64-decode \"aGVsbG8=\" --output ./decoded.txt\n $ jai1 utils base64-decode --file ./encoded.txt --output ./image.png\n`)\n .action(async (input, options) => {\n await handleBase64Decode(input, options);\n });\n\n return cmd;\n}\n","/**\n * HTTP Request Command\n * Make HTTP requests with detailed output\n */\nimport { Command } from 'commander';\nimport { readFile } from 'fs/promises';\nimport { UtilsService } from '../../services/utils.service.js';\n\nasync function handleHttpRequest(\n url: string,\n options: {\n method: string;\n header?: string[];\n data?: string;\n file?: string;\n timeout: number;\n noFollow: boolean;\n onlyHeaders: boolean;\n onlyBody: boolean;\n }\n): Promise<void> {\n const service = new UtilsService();\n\n try {\n // Parse headers\n const headers: Record<string, string> = {};\n if (options.header) {\n options.header.forEach((header) => {\n const [key, ...valueParts] = header.split(':');\n if (key && valueParts.length > 0) {\n headers[key.trim()] = valueParts.join(':').trim();\n }\n });\n }\n\n // Get body\n let body: string | undefined;\n if (options.file) {\n body = await readFile(options.file, 'utf-8');\n } else if (options.data) {\n body = options.data;\n }\n\n // Make request\n const response = await service.httpRequest(url, {\n method: options.method.toUpperCase(),\n headers,\n body,\n timeout: options.timeout,\n followRedirects: !options.noFollow,\n });\n\n // Display results\n if (!options.onlyBody) {\n console.log(`HTTP/${response.status >= 200 && response.status < 300 ? '1.1' : '1.0'} ${response.status} ${response.statusText}`);\n console.log('โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€');\n console.log(`๐Ÿ“Š Status: ${response.status} ${response.statusText}`);\n console.log(`โฑ๏ธ Time: ${response.timing}ms`);\n console.log(`๐Ÿ“ฆ Size: ${service.formatBytes(response.size)}`);\n console.log();\n }\n\n if (!options.onlyBody && !options.onlyHeaders) {\n console.log('๐Ÿ“‹ Headers:');\n Object.entries(response.headers).forEach(([key, value]) => {\n console.log(` ${key}: ${value}`);\n });\n console.log();\n }\n\n if (options.onlyHeaders) {\n Object.entries(response.headers).forEach(([key, value]) => {\n console.log(`${key}: ${value}`);\n });\n return;\n }\n\n if (!options.onlyHeaders) {\n if (!options.onlyBody) {\n console.log('๐Ÿ“„ Body:');\n }\n\n // Try to format as JSON\n try {\n const json = JSON.parse(response.body);\n console.log(JSON.stringify(json, null, 2));\n } catch {\n console.log(response.body);\n }\n console.log();\n }\n } catch (error) {\n console.error('โŒ Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\nexport function createHttpCommand(): Command {\n const cmd = new Command('http')\n .description('Make HTTP request with formatted output')\n .argument('<url>', 'Target URL')\n .option('-X, --method <method>', 'HTTP method', 'GET')\n .option('-H, --header <header...>', 'Request headers (repeatable)')\n .option('-d, --data <data>', 'Request body (JSON string)')\n .option('--file <path>', 'Read body from file')\n .option('--timeout <ms>', 'Request timeout in milliseconds', '30000')\n .option('--no-follow', 'Do not follow redirects')\n .option('--only-headers', 'Show only response headers')\n .option('--only-body', 'Show only response body')\n .addHelpText('after', `\nExamples:\n $ jai1 utils http https://api.example.com/users\n $ jai1 utils http https://api.example.com/users -X POST -d '{\"name\":\"John\"}'\n $ jai1 utils http https://api.example.com -H \"Authorization: Bearer token123\"\n $ jai1 utils http https://api.example.com -H \"Content-Type: application/json\" -H \"Accept: application/json\"\n $ jai1 utils http https://api.example.com --timeout 5000\n $ jai1 utils http https://api.example.com --only-body\n`)\n .showHelpAfterError('(add --help for additional examples)')\n .action(async (url, options) => {\n await handleHttpRequest(url, {\n ...options,\n timeout: parseInt(options.timeout, 10),\n });\n });\n\n return cmd;\n}\n","/**\n * JWT Command\n * Decode and encode JWT tokens\n */\nimport { Command } from 'commander';\nimport { UtilsService } from '../../services/utils.service.js';\n\nasync function handleJwtDecode(token: string): Promise<void> {\n const service = new UtilsService();\n\n try {\n const { header, payload, signature } = service.jwtDecode(token);\n\n console.log('๐Ÿ”“ JWT Decoded:');\n console.log('โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\\n');\n\n console.log('๐Ÿ“‹ Header:');\n console.log(JSON.stringify(header, null, 2));\n console.log();\n\n console.log('๐Ÿ“„ Payload:');\n console.log(JSON.stringify(payload, null, 2));\n console.log();\n\n console.log('๐Ÿ” Signature:');\n console.log(` ${signature}`);\n console.log();\n\n console.log('โš ๏ธ Note: Token signature is not verified');\n console.log();\n } catch (error) {\n console.error('โŒ Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\nasync function handleJwtEncode(options: {\n payload: string;\n secret: string;\n header?: string;\n}): Promise<void> {\n const service = new UtilsService();\n\n try {\n const payload = JSON.parse(options.payload);\n const header = options.header ? JSON.parse(options.header) : undefined;\n\n const token = service.jwtEncode(payload, options.secret, header);\n\n console.log('๐Ÿ” JWT Encoded:');\n console.log('โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\\n');\n console.log(` ${token}`);\n console.log();\n } catch (error) {\n console.error('โŒ Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\nexport function createJwtCommand(): Command {\n const jwtCommand = new Command('jwt')\n .description('Decode and encode JWT tokens');\n\n // Decode subcommand\n jwtCommand\n .command('decode')\n .description('Decode JWT token')\n .argument('<token>', 'JWT token to decode')\n .addHelpText('after', `\nExamples:\n $ jai1 utils jwt decode \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c\"\n $ jai1 utils jwt decode $JWT_TOKEN\n`)\n .action(async (token) => {\n await handleJwtDecode(token);\n });\n\n // Encode subcommand\n const encodeCommand = jwtCommand\n .command('encode')\n .description('Encode JWT token (HS256)')\n .requiredOption('-p, --payload <json>', 'Payload as JSON string')\n .requiredOption('-s, --secret <secret>', 'Secret key for signing')\n .option('-h, --header <json>', 'Custom header as JSON string')\n .addHelpText('after', `\nExamples:\n $ jai1 utils jwt encode --payload '{\"sub\":\"123\",\"name\":\"John\"}' --secret \"mysecret\"\n $ jai1 utils jwt encode -p '{\"userId\":\"456\"}' -s \"key123\"\n $ jai1 utils jwt encode -p '{\"sub\":\"789\"}' -s \"secret\" -h '{\"alg\":\"HS256\",\"typ\":\"JWT\"}'\n`)\n .action(async (options) => {\n await handleJwtEncode(options);\n });\n\n // Show help on error for missing required options\n encodeCommand.showHelpAfterError('(add --help for additional examples)');\n\n return jwtCommand;\n}\n","/**\n * Unix Time Command\n * Convert unix timestamps to/from human-readable dates\n */\nimport { Command } from 'commander';\nimport { UtilsService } from '../../services/utils.service.js';\n\nasync function handleUnixTime(\n input: string | undefined,\n options: {\n format: 'iso' | 'local' | 'utc';\n ms: boolean;\n }\n): Promise<void> {\n const service = new UtilsService();\n\n try {\n if (!input) {\n // Show current timestamp\n const now = new Date();\n const timestamp = service.dateToUnix(now, options.ms);\n\n console.log('๐Ÿ•’ Current Unix Timestamp:');\n console.log('โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€');\n console.log(` ${timestamp}${options.ms ? ' (milliseconds)' : ''}`);\n console.log();\n console.log(` ISO: ${now.toISOString()}`);\n console.log(` Local: ${now.toLocaleString()}`);\n console.log();\n } else if (/^\\d+$/.test(input)) {\n // Convert unix timestamp to date\n const timestamp = parseInt(input, 10);\n const date = service.unixToDate(timestamp, options.ms);\n\n console.log('๐Ÿ•’ Unix Timestamp to Date:');\n console.log('โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€');\n console.log(` Input: ${timestamp}${options.ms ? ' (ms)' : ''}`);\n console.log();\n\n if (options.format === 'iso' || options.format === 'utc') {\n console.log(` ${date.toISOString()}`);\n } else {\n console.log(` ${date.toLocaleString()}`);\n }\n console.log();\n } else {\n // Convert date string to unix timestamp\n const date = new Date(input);\n\n if (isNaN(date.getTime())) {\n console.error('โŒ Invalid date format');\n process.exit(1);\n }\n\n const timestamp = service.dateToUnix(date, options.ms);\n\n console.log('๐Ÿ•’ Date to Unix Timestamp:');\n console.log('โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€');\n console.log(` Input: ${input}`);\n console.log(` Parsed: ${date.toISOString()}`);\n console.log();\n console.log(` ${timestamp}${options.ms ? ' (ms)' : ''}`);\n console.log();\n }\n } catch (error) {\n console.error('โŒ Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\nexport function createUnixTimeCommand(): Command {\n const cmd = new Command('unix-time')\n .description('Convert unix timestamps to/from dates')\n .argument('[input]', 'Unix timestamp or date string')\n .option('-f, --format <format>', 'Output format (iso, local, utc)', 'iso')\n .option('--ms', 'Use milliseconds instead of seconds')\n .addHelpText('after', `\nExamples:\n $ jai1 utils unix-time\n $ jai1 utils unix-time 1702550400\n $ jai1 utils unix-time 1702550400000 --ms\n $ jai1 utils unix-time \"2024-01-15 10:30:00\"\n $ jai1 utils unix-time \"2024-01-15\" --format local\n $ jai1 utils unix-time --ms\n`)\n .action(async (input, options) => {\n await handleUnixTime(input, options);\n });\n\n return cmd;\n}\n","/**\n * Timezone Command\n * Convert time between timezones\n */\nimport { Command } from 'commander';\nimport { UtilsService } from '../../services/utils.service.js';\n\nasync function handleTimezoneConversion(\n time: string | undefined,\n options: {\n from: string;\n to: string;\n list: boolean;\n }\n): Promise<void> {\n const service = new UtilsService();\n\n try {\n if (options.list) {\n console.log('๐ŸŒ Available Timezones:');\n console.log('โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\\n');\n\n const timezones = service.getTimezones();\n timezones.forEach((tz) => {\n console.log(` ${tz}`);\n });\n console.log();\n return;\n }\n\n if (!time) {\n console.error('โŒ Please provide time to convert or use --list to see available timezones');\n process.exit(1);\n }\n\n if (!options.from || !options.to) {\n console.error('โŒ Please provide both --from and --to timezones');\n process.exit(1);\n }\n\n const result = service.convertTimezone(time, options.from, options.to);\n\n console.log('๐ŸŒ Timezone Conversion:');\n console.log('โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€');\n console.log(` From: ${options.from}`);\n console.log(` To: ${options.to}`);\n console.log();\n console.log(` ${result.time}`);\n console.log(` ISO: ${result.iso}`);\n console.log();\n } catch (error) {\n console.error('โŒ Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\nexport function createTimezoneCommand(): Command {\n const cmd = new Command('timezone')\n .description('Convert time between timezones')\n .argument('[time]', 'Time to convert (e.g., \"2024-01-15 10:00\")')\n .option('--from <timezone>', 'Source timezone')\n .option('--to <timezone>', 'Target timezone')\n .option('--list', 'Show available timezones')\n .addHelpText('after', `\nExamples:\n $ jai1 utils timezone --list\n $ jai1 utils timezone \"2024-01-15 10:00\" --from \"America/New_York\" --to \"Asia/Tokyo\"\n $ jai1 utils timezone \"2024-01-15 14:30\" --from \"UTC\" --to \"America/Los_Angeles\"\n $ jai1 utils timezone \"2024-12-25 12:00\" --from \"Europe/London\" --to \"Asia/Ho_Chi_Minh\"\n`)\n .action(async (time, options) => {\n await handleTimezoneConversion(time, options);\n });\n\n return cmd;\n}\n","/**\n * URL Encode Command\n * Encode URL components or full URLs\n */\nimport { Command } from 'commander';\nimport { UtilsService } from '../../services/utils.service.js';\n\nasync function handleUrlEncode(\n input: string,\n options: {\n full: boolean;\n }\n): Promise<void> {\n const service = new UtilsService();\n\n try {\n const encoded = service.urlEncode(input, options.full);\n\n console.log('๐Ÿ”— URL Encoded:');\n console.log('โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€');\n if (options.full) {\n console.log(' Mode: Full URL (encodeURI)');\n } else {\n console.log(' Mode: Component (encodeURIComponent)');\n }\n console.log();\n console.log(` ${encoded}`);\n console.log();\n } catch (error) {\n console.error('โŒ Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\nexport function createUrlEncodeCommand(): Command {\n const cmd = new Command('url-encode')\n .description('Encode URL component or full URL')\n .argument('<input>', 'Text to encode')\n .option('--full', 'Encode full URL (use encodeURI instead of encodeURIComponent)')\n .addHelpText('after', `\nExamples:\n $ jai1 utils url-encode \"hello world\"\n $ jai1 utils url-encode \"hello world & test\"\n $ jai1 utils url-encode \"name=John Doe&age=30\"\n $ jai1 utils url-encode \"https://example.com/path with spaces\" --full\n`)\n .showHelpAfterError('(add --help for additional examples)')\n .action(async (input, options) => {\n await handleUrlEncode(input, options);\n });\n\n return cmd;\n}\n","/**\n * URL Decode Command\n * Decode URL-encoded strings\n */\nimport { Command } from 'commander';\nimport { UtilsService } from '../../services/utils.service.js';\n\nasync function handleUrlDecode(\n input: string,\n options: {\n full: boolean;\n }\n): Promise<void> {\n const service = new UtilsService();\n\n try {\n const decoded = service.urlDecode(input, options.full);\n\n console.log('๐Ÿ”— URL Decoded:');\n console.log('โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€');\n if (options.full) {\n console.log(' Mode: Full URL (decodeURI)');\n } else {\n console.log(' Mode: Component (decodeURIComponent)');\n }\n console.log();\n console.log(` ${decoded}`);\n console.log();\n } catch (error) {\n console.error('โŒ Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\nexport function createUrlDecodeCommand(): Command {\n const cmd = new Command('url-decode')\n .description('Decode URL-encoded string')\n .argument('<input>', 'Text to decode')\n .option('--full', 'Decode full URL (use decodeURI instead of decodeURIComponent)')\n .addHelpText('after', `\nExamples:\n $ jai1 utils url-decode \"hello%20world\"\n $ jai1 utils url-decode \"hello%20world%20%26%20test\"\n $ jai1 utils url-decode \"name%3DJohn%20Doe%26age%3D30\"\n $ jai1 utils url-decode \"https://example.com/path%20with%20spaces\" --full\n`)\n .showHelpAfterError('(add --help for additional examples)')\n .action(async (input, options) => {\n await handleUrlDecode(input, options);\n });\n\n return cmd;\n}\n","/**\n * Cron Parser Command\n * Parse and explain cron expressions\n */\nimport { Command } from 'commander';\nimport cronstrue from 'cronstrue';\n\nasync function handleCronParse(expression: string): Promise<void> {\n try {\n // Parse cron expression to human-readable\n const description = cronstrue.toString(expression);\n\n console.log('โฐ Cron Expression Parser:');\n console.log('โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€');\n console.log(` Expression: ${expression}`);\n console.log(` Meaning: ${description}`);\n console.log();\n\n // Calculate next 5 execution times\n console.log('๐Ÿ“… Next 5 Executions:');\n\n const parts = expression.trim().split(/\\s+/);\n if (parts.length < 5 || parts.length > 6) {\n console.log(' โš ๏ธ Invalid cron expression format');\n return;\n }\n\n // Simple calculation for next runs (approximate)\n const now = new Date();\n const executions: string[] = [];\n\n for (let i = 0; i < 5; i++) {\n const nextTime = new Date(now);\n nextTime.setDate(nextTime.getDate() + i);\n\n // Try to match hour and minute from cron\n const [minute, hour] = parts.slice(parts.length === 6 ? 1 : 0, parts.length === 6 ? 3 : 2);\n\n if (minute !== '*' && !minute.includes('/') && !minute.includes('-')) {\n nextTime.setMinutes(parseInt(minute, 10));\n }\n\n if (hour !== '*' && !hour.includes('/') && !hour.includes('-')) {\n nextTime.setHours(parseInt(hour, 10));\n }\n\n executions.push(\n ` ${i + 1}. ${nextTime.toISOString().replace('T', ' ').substring(0, 19)}`\n );\n }\n\n executions.forEach((exec) => console.log(exec));\n console.log();\n\n console.log('๐Ÿ’ก Tip: This is an approximate calculation.');\n console.log(' For exact times, consider your system timezone.');\n console.log();\n } catch (error) {\n console.error('โŒ Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\nexport function createCronCommand(): Command {\n const cmd = new Command('cron')\n .description('Parse and explain cron expression')\n .argument('<expression>', 'Cron expression (e.g., \"0 5 * * *\")')\n .addHelpText('after', `\nExamples:\n $ jai1 utils cron \"0 5 * * *\"\n $ jai1 utils cron \"*/15 * * * *\"\n $ jai1 utils cron \"0 0 1 * *\"\n $ jai1 utils cron \"0 9-17 * * 1-5\"\n $ jai1 utils cron \"30 2 * * 0\"\n`)\n .showHelpAfterError('(add --help for additional examples)')\n .action(async (expression) => {\n await handleCronParse(expression);\n });\n\n return cmd;\n}\n","/**\n * Markdown Preview Command\n * Preview markdown files in terminal\n */\nimport { Command } from 'commander';\nimport { readFile } from 'fs/promises';\nimport { marked } from 'marked';\nimport TerminalRenderer from 'marked-terminal';\n\nasync function handleMarkdownPreview(\n file: string,\n options: {\n raw: boolean;\n }\n): Promise<void> {\n try {\n let content = await readFile(file, 'utf-8');\n\n if (options.raw) {\n // Show raw markdown with basic formatting\n console.log('๐Ÿ“„ Markdown File (Raw):');\n console.log('โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\\n');\n console.log(content);\n console.log();\n } else {\n // Pre-process content to replace Mermaid blocks with placeholders\n content = content.replace(/```mermaid\\n([\\s\\S]*?)```/g, (match, code) => {\n return `\\n๐ŸŽจ **Mermaid Diagram**\\n\\n\\`\\`\\`\\n${code.trim()}\\n\\`\\`\\`\\n\\n๐Ÿ’ก *Tip: Mermaid diagrams cannot be rendered in terminal. View in a Markdown viewer.*\\n`;\n });\n\n // Render markdown in terminal\n marked.setOptions({\n // @ts-ignore - marked-terminal types may not match perfectly\n renderer: new TerminalRenderer(),\n });\n\n const rendered = marked(content);\n\n console.log('๐Ÿ“„ Markdown Preview:');\n console.log('โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\\n');\n console.log(rendered);\n }\n } catch (error) {\n console.error('โŒ Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\nexport function createMarkdownPreviewCommand(): Command {\n const cmd = new Command('markdown-preview')\n .description('Preview markdown file in terminal')\n .argument('<file>', 'Markdown file path')\n .option('--raw', 'Show raw markdown instead of rendered')\n .addHelpText('after', `\nExamples:\n $ jai1 utils markdown-preview README.md\n $ jai1 utils markdown-preview ./docs/guide.md\n $ jai1 utils markdown-preview CHANGELOG.md --raw\n $ jai1 utils markdown-preview ./notes.md\n`)\n .showHelpAfterError('(add --help for additional examples)')\n .action(async (file, options) => {\n await handleMarkdownPreview(file, options);\n });\n\n return cmd;\n}\n","/**\n * Interactive Utils Mode\n * Launch the professional Ink-based TUI\n */\nimport React from 'react';\nimport { render } from 'ink';\nimport { UtilsApp } from '../../ui/utils/UtilsApp.js';\n\nexport async function runInteractiveMode(): Promise<void> {\n return new Promise((resolve) => {\n const { unmount, waitUntilExit } = render(\n React.createElement(UtilsApp, {\n onExit: () => {\n unmount();\n resolve();\n },\n })\n );\n\n // Wait for the app to exit\n waitUntilExit().then(() => {\n resolve();\n });\n });\n}\n","/**\n * Utils TUI App\n * Professional TUI interface with left sidebar menu\n */\nimport React, { useState } from 'react';\nimport { Box, Text, useInput, useApp } from 'ink';\nimport { PasswordView } from './views/PasswordView.js';\nimport { UuidView } from './views/UuidView.js';\nimport { HashView } from './views/HashView.js';\nimport { Base64View } from './views/Base64View.js';\nimport { UrlView } from './views/UrlView.js';\nimport { UnixTimeView } from './views/UnixTimeView.js';\nimport { JwtView } from './views/JwtView.js';\nimport { CronView } from './views/CronView.js';\nimport { TimezoneView } from './views/TimezoneView.js';\nimport { HttpView } from './views/HttpView.js';\nimport { MarkdownView } from './views/MarkdownView.js';\n\nexport type UtilityType =\n | 'password'\n | 'uuid'\n | 'hash'\n | 'base64-encode'\n | 'base64-decode'\n | 'http'\n | 'jwt'\n | 'unix-time'\n | 'timezone'\n | 'url-encode'\n | 'url-decode'\n | 'cron'\n | 'markdown';\n\ninterface MenuItem {\n id: UtilityType;\n icon: string;\n label: string;\n description: string;\n}\n\nconst MENU_ITEMS: MenuItem[] = [\n { id: 'password', icon: '๐Ÿ”', label: 'Password', description: 'Generate secure passwords' },\n { id: 'uuid', icon: '๐Ÿ†”', label: 'UUID', description: 'Generate UUID v4' },\n { id: 'hash', icon: '๐Ÿ”’', label: 'Hash', description: 'Hash with MD5/SHA/bcrypt' },\n { id: 'base64-encode', icon: '๐Ÿ“', label: 'Base64 Encode', description: 'Encode to Base64' },\n { id: 'base64-decode', icon: '๐Ÿ“', label: 'Base64 Decode', description: 'Decode Base64' },\n { id: 'http', icon: '๐ŸŒ', label: 'HTTP Request', description: 'Make HTTP requests' },\n { id: 'jwt', icon: '๐Ÿ”‘', label: 'JWT', description: 'Decode/encode JWT' },\n { id: 'unix-time', icon: '๐Ÿ•’', label: 'Unix Time', description: 'Convert timestamps' },\n { id: 'timezone', icon: '๐ŸŒ', label: 'Timezone', description: 'Convert timezones' },\n { id: 'url-encode', icon: '๐Ÿ”—', label: 'URL Encode', description: 'Encode URLs' },\n { id: 'url-decode', icon: '๐Ÿ”—', label: 'URL Decode', description: 'Decode URLs' },\n { id: 'cron', icon: 'โฐ', label: 'Cron Parser', description: 'Parse cron expressions' },\n { id: 'markdown', icon: '๐Ÿ“„', label: 'Markdown', description: 'Preview markdown' },\n];\n\ninterface UtilsAppProps {\n onExit: () => void;\n}\n\nexport const UtilsApp: React.FC<UtilsAppProps> = ({ onExit }) => {\n const [selectedIndex, setSelectedIndex] = useState(0);\n const [activeView, setActiveView] = useState<UtilityType | null>(null);\n const { exit } = useApp();\n\n useInput((input, key) => {\n if (activeView) {\n // If in a view, Escape goes back to menu\n if (key.escape) {\n setActiveView(null);\n }\n return;\n }\n\n // Main menu navigation\n if (key.upArrow || input === 'k') {\n setSelectedIndex((prev) => (prev > 0 ? prev - 1 : MENU_ITEMS.length - 1));\n } else if (key.downArrow || input === 'j') {\n setSelectedIndex((prev) => (prev < MENU_ITEMS.length - 1 ? prev + 1 : 0));\n } else if (key.return) {\n setActiveView(MENU_ITEMS[selectedIndex].id);\n } else if ((input === 'q' && key.ctrl) || key.escape) {\n onExit();\n exit();\n }\n });\n\n return (\n <Box flexDirection=\"column\" width=\"100%\" height=\"100%\">\n {/* Header */}\n <Box\n borderStyle=\"single\"\n borderColor=\"cyan\"\n paddingX={2}\n paddingY={0}\n marginBottom={1}\n >\n <Text bold color=\"cyan\">\n ๐Ÿ› ๏ธ Developer Utilities - Interactive Mode\n </Text>\n <Box marginLeft=\"auto\">\n <Text dimColor>Press Ctrl+Q to quit</Text>\n </Box>\n </Box>\n\n {/* Main Content Area */}\n <Box flexGrow={1}>\n {/* Left Sidebar - Menu */}\n <Box\n flexDirection=\"column\"\n width={30}\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={1}\n paddingY={1}\n marginRight={1}\n >\n <Box marginBottom={1}>\n <Text bold color=\"yellow\">\n Select Utility:\n </Text>\n </Box>\n\n {MENU_ITEMS.map((item, index) => (\n <Box key={item.id} marginBottom={0}>\n <Text\n color={selectedIndex === index && !activeView ? 'green' : undefined}\n bold={selectedIndex === index && !activeView}\n dimColor={activeView !== null && activeView !== item.id}\n >\n {selectedIndex === index && !activeView ? 'โ–ถ ' : ' '}\n {item.icon} {item.label}\n </Text>\n </Box>\n ))}\n\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text dimColor>\n โ†‘/โ†“: Navigate{'\\n'}\n Enter: Select{'\\n'}\n Esc: Back/Quit\n </Text>\n </Box>\n </Box>\n\n {/* Right Content Area */}\n <Box\n flexDirection=\"column\"\n flexGrow={1}\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={2}\n paddingY={1}\n >\n {activeView ? (\n <ActiveUtilityView utilityType={activeView} />\n ) : (\n <WelcomeView selectedItem={MENU_ITEMS[selectedIndex]} />\n )}\n </Box>\n </Box>\n\n {/* Footer */}\n <Box\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={2}\n marginTop={1}\n >\n <Text dimColor>\n jai1-cli | Use arrow keys or j/k to navigate\n </Text>\n </Box>\n </Box>\n );\n};\n\n// Welcome view shown when no utility is selected\nconst WelcomeView: React.FC<{ selectedItem: MenuItem }> = ({ selectedItem }) => {\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n Welcome to Developer Utilities\n </Text>\n </Box>\n\n <Box marginBottom={2}>\n <Text>\n Select a utility from the left menu to get started.\n </Text>\n </Box>\n\n <Box\n borderStyle=\"single\"\n borderColor=\"yellow\"\n paddingX={2}\n paddingY={1}\n marginBottom={2}\n >\n <Box flexDirection=\"column\">\n <Text bold color=\"yellow\">\n {selectedItem.icon} {selectedItem.label}\n </Text>\n <Text dimColor>{selectedItem.description}</Text>\n </Box>\n </Box>\n\n <Box marginBottom={1}>\n <Text bold>Quick Actions:</Text>\n </Box>\n\n <Box flexDirection=\"column\" marginLeft={2}>\n <Text>โ€ข Press <Text color=\"green\">Enter</Text> to open selected utility</Text>\n <Text>โ€ข Use <Text color=\"green\">โ†‘/โ†“</Text> or <Text color=\"green\">j/k</Text> to navigate</Text>\n <Text>โ€ข Press <Text color=\"green\">Esc</Text> to go back or quit</Text>\n <Text>โ€ข Press <Text color=\"green\">Ctrl+Q</Text> to quit anytime</Text>\n </Box>\n\n <Box marginTop={2}>\n <Text dimColor>\n ๐Ÿ’ก Tip: Each utility provides an interactive interface for easy usage.\n </Text>\n </Box>\n </Box>\n );\n};\n\n// Active utility view - renders the appropriate component\nconst ActiveUtilityView: React.FC<{ utilityType: UtilityType }> = ({ utilityType }) => {\n switch (utilityType) {\n case 'password':\n return <PasswordView />;\n case 'uuid':\n return <UuidView />;\n case 'hash':\n return <HashView />;\n case 'base64-encode':\n case 'base64-decode':\n return <Base64View />;\n case 'url-encode':\n case 'url-decode':\n return <UrlView />;\n case 'unix-time':\n return <UnixTimeView />;\n case 'jwt':\n return <JwtView />;\n case 'cron':\n return <CronView />;\n case 'timezone':\n return <TimezoneView />;\n case 'http':\n return <HttpView />;\n case 'markdown':\n return <MarkdownView />;\n default:\n return <PlaceholderView utilityType={utilityType} />;\n }\n};\n\n// Placeholder for utilities not yet implemented\nconst PlaceholderView: React.FC<{ utilityType: UtilityType }> = ({ utilityType }) => {\n const item = MENU_ITEMS.find((m) => m.id === utilityType);\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n {item?.icon} {item?.label}\n </Text>\n </Box>\n\n <Box borderStyle=\"single\" borderColor=\"yellow\" paddingX={2} paddingY={1}>\n <Text>\n ๐Ÿšง This utility view is under construction.{'\\n'}\n {'\\n'}\n For now, use the command-line version:{'\\n'}\n <Text color=\"green\">$ jai1 utils {utilityType} --help</Text>\n {'\\n'}\n {'\\n'}\n Press <Text color=\"yellow\">Esc</Text> to return to the menu.\n </Text>\n </Box>\n </Box>\n );\n};\n","/**\n * Password Generator View\n * Interactive password generation with options\n */\nimport React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { UtilsService } from '../../../services/utils.service.js';\n\nexport const PasswordView: React.FC = () => {\n const [length, setLength] = useState('16');\n const [count, setCount] = useState('1');\n const [passwords, setPasswords] = useState<string[]>([]);\n const [focusedField, setFocusedField] = useState<'length' | 'count' | 'generate'>('length');\n const [copiedIndex, setCopiedIndex] = useState<number | null>(null);\n\n const service = new UtilsService();\n\n // Auto-generate on first mount\n React.useEffect(() => {\n handleGenerate();\n }, []);\n\n useInput((input, key) => {\n if (key.tab) {\n // Cycle through fields\n if (focusedField === 'length') setFocusedField('count');\n else if (focusedField === 'count') setFocusedField('generate');\n else setFocusedField('length');\n } else if (key.return) {\n // Generate passwords on Enter from any field\n handleGenerate();\n } else if (input === 'c' && passwords.length > 0) {\n // Copy first password\n handleCopy(0);\n }\n });\n\n const handleGenerate = () => {\n const newPasswords: string[] = [];\n const lengthNum = parseInt(length, 10) || 16;\n const countNum = parseInt(count, 10) || 1;\n\n for (let i = 0; i < countNum; i++) {\n newPasswords.push(\n service.generatePassword({\n length: lengthNum,\n lowercase: true,\n uppercase: true,\n digits: true,\n symbols: true,\n })\n );\n }\n setPasswords(newPasswords);\n setCopiedIndex(null);\n };\n\n const handleCopy = async (index: number) => {\n try {\n const { default: clipboardy } = await import('clipboardy');\n await clipboardy.write(passwords[index]);\n setCopiedIndex(index);\n setTimeout(() => setCopiedIndex(null), 2000);\n } catch (error) {\n // Clipboard not available\n }\n };\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n ๐Ÿ” Password Generator\n </Text>\n </Box>\n\n {/* Options */}\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text bold color=\"yellow\" marginBottom={1}>\n Options:\n </Text>\n\n {/* Length Input */}\n <Box marginBottom={1}>\n <Box width={20}>\n <Text color={focusedField === 'length' ? 'green' : undefined}>\n {focusedField === 'length' ? 'โ–ถ ' : ' '}Length:\n </Text>\n </Box>\n <Box width={10}>\n {focusedField === 'length' ? (\n <TextInput value={length} onChange={setLength} />\n ) : (\n <Text>{length}</Text>\n )}\n </Box>\n <Text dimColor>(characters)</Text>\n </Box>\n\n {/* Count Input */}\n <Box marginBottom={1}>\n <Box width={20}>\n <Text color={focusedField === 'count' ? 'green' : undefined}>\n {focusedField === 'count' ? 'โ–ถ ' : ' '}Count:\n </Text>\n </Box>\n <Box width={10}>\n {focusedField === 'count' ? (\n <TextInput value={count} onChange={setCount} />\n ) : (\n <Text>{count}</Text>\n )}\n </Box>\n <Text dimColor>(passwords to generate)</Text>\n </Box>\n\n {/* Generate Button */}\n <Box marginTop={1}>\n <Text\n bold\n backgroundColor={focusedField === 'generate' ? 'green' : undefined}\n color={focusedField === 'generate' ? 'black' : 'green'}\n >\n {focusedField === 'generate' ? 'โ–ถ ' : ' '}\n [ Generate Passwords ]\n </Text>\n </Box>\n </Box>\n\n {/* Results */}\n {passwords.length > 0 && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"green\"\n paddingX={2}\n paddingY={1}\n >\n <Text bold color=\"green\" marginBottom={1}>\n โœ“ Generated Passwords:\n </Text>\n\n {passwords.map((password, index) => (\n <Box key={index} marginBottom={0}>\n <Box width={4}>\n <Text dimColor>{index + 1}.</Text>\n </Box>\n <Box flexGrow={1}>\n <Text>{password}</Text>\n </Box>\n {copiedIndex === index && (\n <Text color=\"green\"> โœ“ Copied!</Text>\n )}\n </Box>\n ))}\n </Box>\n )}\n\n {/* Help */}\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={2}>\n <Text dimColor>\n Tab: Next field | Enter: Generate | C: Copy | Esc: Back\n </Text>\n </Box>\n </Box>\n );\n};\n","/**\n * UUID Generator View\n * Interactive UUID generation\n */\nimport React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { UtilsService } from '../../../services/utils.service.js';\n\nexport const UuidView: React.FC = () => {\n const [count, setCount] = useState('1');\n const [uppercase, setUppercase] = useState(false);\n const [noHyphens, setNoHyphens] = useState(false);\n const [uuids, setUuids] = useState<string[]>([]);\n const [focusedField, setFocusedField] = useState<'count' | 'uppercase' | 'hyphens' | 'generate'>('count');\n const [copiedIndex, setCopiedIndex] = useState<number | null>(null);\n\n const service = new UtilsService();\n\n // Auto-generate on first mount\n React.useEffect(() => {\n handleGenerate();\n }, []);\n\n useInput((input, key) => {\n if (key.tab) {\n const fields: typeof focusedField[] = ['count', 'uppercase', 'hyphens', 'generate'];\n const currentIndex = fields.indexOf(focusedField);\n setFocusedField(fields[(currentIndex + 1) % fields.length]);\n } else if (key.return) {\n if (focusedField === 'uppercase') {\n setUppercase(!uppercase);\n } else if (focusedField === 'hyphens') {\n setNoHyphens(!noHyphens);\n } else {\n // Generate on Enter from any field (except checkboxes)\n handleGenerate();\n }\n } else if (input === 'c' && uuids.length > 0) {\n handleCopy(0);\n }\n });\n\n const handleGenerate = () => {\n const newUuids: string[] = [];\n const countNum = parseInt(count, 10) || 1;\n\n for (let i = 0; i < countNum; i++) {\n newUuids.push(service.generateUuid({ uppercase, noHyphens }));\n }\n setUuids(newUuids);\n setCopiedIndex(null);\n };\n\n const handleCopy = async (index: number) => {\n try {\n const { default: clipboardy } = await import('clipboardy');\n await clipboardy.write(uuids[index]);\n setCopiedIndex(index);\n setTimeout(() => setCopiedIndex(null), 2000);\n } catch (error) {\n // Clipboard not available\n }\n };\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n ๐Ÿ†” UUID Generator\n </Text>\n </Box>\n\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text bold color=\"yellow\" marginBottom={1}>\n Options:\n </Text>\n\n <Box marginBottom={1}>\n <Box width={20}>\n <Text color={focusedField === 'count' ? 'green' : undefined}>\n {focusedField === 'count' ? 'โ–ถ ' : ' '}Count:\n </Text>\n </Box>\n <Box width={10}>\n {focusedField === 'count' ? (\n <TextInput value={count} onChange={setCount} />\n ) : (\n <Text>{count}</Text>\n )}\n </Box>\n </Box>\n\n <Box marginBottom={1}>\n <Text color={focusedField === 'uppercase' ? 'green' : undefined}>\n {focusedField === 'uppercase' ? 'โ–ถ ' : ' '}\n [{uppercase ? 'โœ“' : ' '}] Uppercase\n </Text>\n </Box>\n\n <Box marginBottom={1}>\n <Text color={focusedField === 'hyphens' ? 'green' : undefined}>\n {focusedField === 'hyphens' ? 'โ–ถ ' : ' '}\n [{noHyphens ? 'โœ“' : ' '}] No Hyphens\n </Text>\n </Box>\n\n <Box marginTop={1}>\n <Text\n bold\n backgroundColor={focusedField === 'generate' ? 'green' : undefined}\n color={focusedField === 'generate' ? 'black' : 'green'}\n >\n {focusedField === 'generate' ? 'โ–ถ ' : ' '}\n [ Generate UUIDs ]\n </Text>\n </Box>\n </Box>\n\n {uuids.length > 0 && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"green\"\n paddingX={2}\n paddingY={1}\n >\n <Text bold color=\"green\" marginBottom={1}>\n โœ“ Generated UUIDs:\n </Text>\n\n {uuids.map((uuid, index) => (\n <Box key={index} marginBottom={0}>\n <Box width={4}>\n <Text dimColor>{index + 1}.</Text>\n </Box>\n <Box flexGrow={1}>\n <Text>{uuid}</Text>\n </Box>\n {copiedIndex === index && (\n <Text color=\"green\"> โœ“ Copied!</Text>\n )}\n </Box>\n ))}\n </Box>\n )}\n\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={2}>\n <Text dimColor>\n Tab: Next | Enter: Toggle/Generate | C: Copy | Esc: Back\n </Text>\n </Box>\n </Box>\n );\n};\n","/**\n * Hash Generator View\n * Interactive hash generation with algorithm selection\n */\nimport React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { UtilsService, HashAlgorithm } from '../../../services/utils.service.js';\n\nconst ALGORITHMS: HashAlgorithm[] = ['sha256', 'sha512', 'sha1', 'md5', 'bcrypt'];\n\nexport const HashView: React.FC = () => {\n const [text, setText] = useState('hello world');\n const [algorithm, setAlgorithm] = useState<HashAlgorithm>('sha256');\n const [hash, setHash] = useState('');\n const [focusedField, setFocusedField] = useState<'text' | 'algorithm' | 'generate'>('text');\n const [copied, setCopied] = useState(false);\n\n const service = new UtilsService();\n\n // Auto-generate on first mount\n React.useEffect(() => {\n handleGenerate();\n }, []);\n\n useInput((input, key) => {\n if (key.tab) {\n const fields: typeof focusedField[] = ['text', 'algorithm', 'generate'];\n const currentIndex = fields.indexOf(focusedField);\n setFocusedField(fields[(currentIndex + 1) % fields.length]);\n } else if (key.return) {\n // Generate on Enter from any field\n handleGenerate();\n } else if (key.leftArrow && focusedField === 'algorithm') {\n const currentIndex = ALGORITHMS.indexOf(algorithm);\n setAlgorithm(ALGORITHMS[currentIndex > 0 ? currentIndex - 1 : ALGORITHMS.length - 1]);\n } else if (key.rightArrow && focusedField === 'algorithm') {\n const currentIndex = ALGORITHMS.indexOf(algorithm);\n setAlgorithm(ALGORITHMS[(currentIndex + 1) % ALGORITHMS.length]);\n } else if (input === 'c' && hash) {\n handleCopy();\n }\n });\n\n const handleGenerate = async () => {\n if (!text) return;\n\n let result: string;\n if (algorithm === 'bcrypt') {\n result = await service.hashBcrypt(text, 10);\n } else {\n result = await service.hash(text, algorithm);\n }\n setHash(result);\n setCopied(false);\n };\n\n const handleCopy = async () => {\n try {\n const { default: clipboardy } = await import('clipboardy');\n await clipboardy.write(hash);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (error) {\n // Clipboard not available\n }\n };\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n ๐Ÿ”’ Hash Generator\n </Text>\n </Box>\n\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text bold color=\"yellow\" marginBottom={1}>\n Options:\n </Text>\n\n <Box marginBottom={1} flexDirection=\"column\">\n <Box marginBottom={0}>\n <Text color={focusedField === 'text' ? 'green' : undefined}>\n {focusedField === 'text' ? 'โ–ถ ' : ' '}Text to hash:\n </Text>\n </Box>\n <Box marginLeft={2} width={60}>\n {focusedField === 'text' ? (\n <TextInput value={text} onChange={setText} placeholder=\"Enter text...\" />\n ) : (\n <Text dimColor={!text}>{text || '(empty)'}</Text>\n )}\n </Box>\n </Box>\n\n <Box marginBottom={1}>\n <Box width={20}>\n <Text color={focusedField === 'algorithm' ? 'green' : undefined}>\n {focusedField === 'algorithm' ? 'โ–ถ ' : ' '}Algorithm:\n </Text>\n </Box>\n <Text bold color={focusedField === 'algorithm' ? 'yellow' : undefined}>\n {algorithm.toUpperCase()}\n </Text>\n {focusedField === 'algorithm' && (\n <Text dimColor> (โ† โ†’ to change)</Text>\n )}\n </Box>\n\n <Box marginTop={1}>\n <Text\n bold\n backgroundColor={focusedField === 'generate' ? 'green' : undefined}\n color={focusedField === 'generate' ? 'black' : 'green'}\n >\n {focusedField === 'generate' ? 'โ–ถ ' : ' '}\n [ Generate Hash ]\n </Text>\n </Box>\n </Box>\n\n {hash && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"green\"\n paddingX={2}\n paddingY={1}\n >\n <Box marginBottom={1}>\n <Text bold color=\"green\">\n โœ“ Hash Result:\n </Text>\n {copied && (\n <Box marginLeft={2}>\n <Text color=\"green\">โœ“ Copied to clipboard!</Text>\n </Box>\n )}\n </Box>\n\n <Box flexDirection=\"column\">\n <Text dimColor>Algorithm: {algorithm.toUpperCase()}</Text>\n <Box marginTop={1}>\n <Text wrap=\"wrap\">{hash}</Text>\n </Box>\n </Box>\n </Box>\n )}\n\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={2}>\n <Text dimColor>\n Tab: Next | โ†/โ†’: Change algorithm | Enter: Generate | C: Copy | Esc: Back\n </Text>\n </Box>\n </Box>\n );\n};\n","/**\n * Base64 Encoder/Decoder View\n * Interactive Base64 encoding and decoding\n */\nimport React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { UtilsService } from '../../../services/utils.service.js';\n\ntype Mode = 'encode' | 'decode';\n\nexport const Base64View: React.FC = () => {\n const [input, setInput] = useState('');\n const [mode, setMode] = useState<Mode>('encode');\n const [urlSafe, setUrlSafe] = useState(false);\n const [result, setResult] = useState('');\n const [error, setError] = useState('');\n const [focusedField, setFocusedField] = useState<'input' | 'mode' | 'urlsafe' | 'convert'>('input');\n const [copied, setCopied] = useState(false);\n\n const service = new UtilsService();\n\n useInput((input, key) => {\n if (key.tab) {\n const fields: typeof focusedField[] = ['input', 'mode', 'urlsafe', 'convert'];\n const currentIndex = fields.indexOf(focusedField);\n setFocusedField(fields[(currentIndex + 1) % fields.length]);\n } else if (key.return) {\n if (focusedField === 'mode') {\n setMode(mode === 'encode' ? 'decode' : 'encode');\n setResult('');\n setError('');\n } else if (focusedField === 'urlsafe') {\n setUrlSafe(!urlSafe);\n } else {\n // Convert on Enter from input or convert button\n handleConvert();\n }\n } else if (input === 'c' && result) {\n handleCopy();\n }\n });\n\n const handleConvert = () => {\n if (!input) {\n setError('Input cannot be empty');\n return;\n }\n\n try {\n setError('');\n if (mode === 'encode') {\n const encoded = service.base64Encode(input, urlSafe);\n setResult(encoded);\n } else {\n const decoded = service.base64Decode(input);\n setResult(decoded.toString('utf-8'));\n }\n setCopied(false);\n } catch (err) {\n setError(`Failed to ${mode}: ${err instanceof Error ? err.message : 'Unknown error'}`);\n setResult('');\n }\n };\n\n const handleCopy = async () => {\n try {\n const { default: clipboardy } = await import('clipboardy');\n await clipboardy.write(result);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (error) {\n // Clipboard not available\n }\n };\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n ๐Ÿ“ Base64 Encoder/Decoder\n </Text>\n </Box>\n\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text bold color=\"yellow\" marginBottom={1}>\n Options:\n </Text>\n\n <Box marginBottom={1} flexDirection=\"column\">\n <Box marginBottom={0}>\n <Text color={focusedField === 'input' ? 'green' : undefined}>\n {focusedField === 'input' ? 'โ–ถ ' : ' '}Input text:\n </Text>\n </Box>\n <Box marginLeft={2} width={60}>\n {focusedField === 'input' ? (\n <TextInput value={input} onChange={setInput} placeholder=\"Enter text...\" />\n ) : (\n <Text dimColor={!input}>{input || '(empty)'}</Text>\n )}\n </Box>\n </Box>\n\n <Box marginBottom={1}>\n <Box width={20}>\n <Text color={focusedField === 'mode' ? 'green' : undefined}>\n {focusedField === 'mode' ? 'โ–ถ ' : ' '}Mode:\n </Text>\n </Box>\n <Text bold color={focusedField === 'mode' ? 'yellow' : undefined}>\n {mode === 'encode' ? 'ENCODE' : 'DECODE'}\n </Text>\n {focusedField === 'mode' && (\n <Text dimColor> (Enter to toggle)</Text>\n )}\n </Box>\n\n {mode === 'encode' && (\n <Box marginBottom={1}>\n <Text color={focusedField === 'urlsafe' ? 'green' : undefined}>\n {focusedField === 'urlsafe' ? 'โ–ถ ' : ' '}\n [{urlSafe ? 'โœ“' : ' '}] URL-Safe (+ โ†’ -, / โ†’ _)\n </Text>\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text\n bold\n backgroundColor={focusedField === 'convert' ? 'green' : undefined}\n color={focusedField === 'convert' ? 'black' : 'green'}\n >\n {focusedField === 'convert' ? 'โ–ถ ' : ' '}\n [ {mode === 'encode' ? 'Encode' : 'Decode'} ]\n </Text>\n </Box>\n </Box>\n\n {error && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"red\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text color=\"red\">โœ— Error: {error}</Text>\n </Box>\n )}\n\n {result && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"green\"\n paddingX={2}\n paddingY={1}\n >\n <Box marginBottom={1}>\n <Text bold color=\"green\">\n โœ“ Result:\n </Text>\n {copied && (\n <Box marginLeft={2}>\n <Text color=\"green\">โœ“ Copied to clipboard!</Text>\n </Box>\n )}\n </Box>\n\n <Box flexDirection=\"column\">\n <Text dimColor>Mode: {mode.toUpperCase()}</Text>\n <Box marginTop={1}>\n <Text wrap=\"wrap\">{result}</Text>\n </Box>\n </Box>\n </Box>\n )}\n\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={2}>\n <Text dimColor>\n Tab: Next | Enter: Toggle/Convert | C: Copy | Esc: Back\n </Text>\n </Box>\n </Box>\n );\n};\n","/**\n * URL Encoder/Decoder View\n * Interactive URL encoding and decoding\n */\nimport React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { UtilsService } from '../../../services/utils.service.js';\n\ntype Mode = 'encode' | 'decode';\n\nexport const UrlView: React.FC = () => {\n const [input, setInput] = useState('');\n const [mode, setMode] = useState<Mode>('encode');\n const [fullUrl, setFullUrl] = useState(false);\n const [result, setResult] = useState('');\n const [focusedField, setFocusedField] = useState<'input' | 'mode' | 'full' | 'convert'>('input');\n const [copied, setCopied] = useState(false);\n\n const service = new UtilsService();\n\n useInput((input, key) => {\n if (key.tab) {\n const fields: typeof focusedField[] = ['input', 'mode', 'full', 'convert'];\n const currentIndex = fields.indexOf(focusedField);\n setFocusedField(fields[(currentIndex + 1) % fields.length]);\n } else if (key.return) {\n if (focusedField === 'mode') {\n setMode(mode === 'encode' ? 'decode' : 'encode');\n setResult('');\n } else if (focusedField === 'full') {\n setFullUrl(!fullUrl);\n } else {\n // Convert on Enter from input or convert button\n handleConvert();\n }\n } else if (input === 'c' && result) {\n handleCopy();\n }\n });\n\n const handleConvert = () => {\n if (!input) return;\n\n if (mode === 'encode') {\n const encoded = fullUrl\n ? service.urlEncode(input, true)\n : service.urlEncode(input, false);\n setResult(encoded);\n } else {\n const decoded = fullUrl\n ? service.urlDecode(input, true)\n : service.urlDecode(input, false);\n setResult(decoded);\n }\n setCopied(false);\n };\n\n const handleCopy = async () => {\n try {\n const { default: clipboardy } = await import('clipboardy');\n await clipboardy.write(result);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (error) {\n // Clipboard not available\n }\n };\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n ๐Ÿ”— URL Encoder/Decoder\n </Text>\n </Box>\n\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text bold color=\"yellow\" marginBottom={1}>\n Options:\n </Text>\n\n <Box marginBottom={1} flexDirection=\"column\">\n <Box marginBottom={0}>\n <Text color={focusedField === 'input' ? 'green' : undefined}>\n {focusedField === 'input' ? 'โ–ถ ' : ' '}Input text:\n </Text>\n </Box>\n <Box marginLeft={2} width={60}>\n {focusedField === 'input' ? (\n <TextInput value={input} onChange={setInput} placeholder=\"Enter text or URL...\" />\n ) : (\n <Text dimColor={!input}>{input || '(empty)'}</Text>\n )}\n </Box>\n </Box>\n\n <Box marginBottom={1}>\n <Box width={20}>\n <Text color={focusedField === 'mode' ? 'green' : undefined}>\n {focusedField === 'mode' ? 'โ–ถ ' : ' '}Mode:\n </Text>\n </Box>\n <Text bold color={focusedField === 'mode' ? 'yellow' : undefined}>\n {mode === 'encode' ? 'ENCODE' : 'DECODE'}\n </Text>\n {focusedField === 'mode' && (\n <Text dimColor> (Enter to toggle)</Text>\n )}\n </Box>\n\n <Box marginBottom={1}>\n <Text color={focusedField === 'full' ? 'green' : undefined}>\n {focusedField === 'full' ? 'โ–ถ ' : ' '}\n [{fullUrl ? 'โœ“' : ' '}] Full URL (encode/decode entire URL)\n </Text>\n </Box>\n\n <Box marginTop={1}>\n <Text\n bold\n backgroundColor={focusedField === 'convert' ? 'green' : undefined}\n color={focusedField === 'convert' ? 'black' : 'green'}\n >\n {focusedField === 'convert' ? 'โ–ถ ' : ' '}\n [ {mode === 'encode' ? 'Encode' : 'Decode'} ]\n </Text>\n </Box>\n </Box>\n\n {result && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"green\"\n paddingX={2}\n paddingY={1}\n >\n <Box marginBottom={1}>\n <Text bold color=\"green\">\n โœ“ Result:\n </Text>\n {copied && (\n <Box marginLeft={2}>\n <Text color=\"green\">โœ“ Copied to clipboard!</Text>\n </Box>\n )}\n </Box>\n\n <Box flexDirection=\"column\">\n <Text dimColor>Mode: {mode.toUpperCase()} {fullUrl ? '(Full URL)' : '(Component)'}</Text>\n <Box marginTop={1}>\n <Text wrap=\"wrap\">{result}</Text>\n </Box>\n </Box>\n </Box>\n )}\n\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={2}>\n <Text dimColor>\n Tab: Next | Enter: Toggle/Convert | C: Copy | Esc: Back\n </Text>\n </Box>\n </Box>\n );\n};\n","/**\n * Unix Time Converter View\n * Interactive Unix timestamp conversion\n */\nimport React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { UtilsService } from '../../../services/utils.service.js';\n\ntype Mode = 'now' | 'to-human' | 'to-unix';\n\nexport const UnixTimeView: React.FC = () => {\n const [input, setInput] = useState('');\n const [mode, setMode] = useState<Mode>('now');\n const [format, setFormat] = useState<'iso' | 'local' | 'utc'>('iso');\n const [useMs, setUseMs] = useState(false);\n const [result, setResult] = useState('');\n const [error, setError] = useState('');\n const [focusedField, setFocusedField] = useState<'mode' | 'input' | 'format' | 'ms' | 'convert'>('mode');\n const [copied, setCopied] = useState(false);\n\n const service = new UtilsService();\n\n useInput((input, key) => {\n if (key.tab) {\n const fields: typeof focusedField[] = mode === 'now'\n ? ['mode', 'ms', 'convert']\n : mode === 'to-human'\n ? ['mode', 'input', 'format', 'convert']\n : ['mode', 'input', 'convert'];\n const currentIndex = fields.indexOf(focusedField);\n setFocusedField(fields[(currentIndex + 1) % fields.length]);\n } else if (key.return) {\n if (focusedField === 'mode') {\n const modes: Mode[] = ['now', 'to-human', 'to-unix'];\n const currentIndex = modes.indexOf(mode);\n setMode(modes[(currentIndex + 1) % modes.length]);\n setResult('');\n setError('');\n } else if (focusedField === 'format') {\n const formats: typeof format[] = ['iso', 'local', 'utc'];\n const currentIndex = formats.indexOf(format);\n setFormat(formats[(currentIndex + 1) % formats.length]);\n } else if (focusedField === 'ms') {\n setUseMs(!useMs);\n } else {\n // Convert on Enter from input or convert button\n handleConvert();\n }\n } else if (input === 'c' && result) {\n handleCopy();\n }\n });\n\n const handleConvert = () => {\n try {\n setError('');\n if (mode === 'now') {\n const timestamp = service.unixTimeCurrent(useMs);\n setResult(timestamp.toString());\n } else if (mode === 'to-human') {\n if (!input) {\n setError('Please enter a timestamp');\n return;\n }\n const human = service.unixTimeToHuman(parseInt(input, 10), format);\n setResult(human);\n } else {\n if (!input) {\n setError('Please enter a date string');\n return;\n }\n const timestamp = service.unixTimeFromString(input);\n setResult(timestamp.toString());\n }\n setCopied(false);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Conversion failed');\n setResult('');\n }\n };\n\n const handleCopy = async () => {\n try {\n const { default: clipboardy } = await import('clipboardy');\n await clipboardy.write(result);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (error) {\n // Clipboard not available\n }\n };\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n ๐Ÿ•’ Unix Time Converter\n </Text>\n </Box>\n\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text bold color=\"yellow\" marginBottom={1}>\n Options:\n </Text>\n\n <Box marginBottom={1}>\n <Box width={20}>\n <Text color={focusedField === 'mode' ? 'green' : undefined}>\n {focusedField === 'mode' ? 'โ–ถ ' : ' '}Mode:\n </Text>\n </Box>\n <Text bold color={focusedField === 'mode' ? 'yellow' : undefined}>\n {mode === 'now' ? 'CURRENT TIME' : mode === 'to-human' ? 'TIMESTAMP โ†’ HUMAN' : 'HUMAN โ†’ TIMESTAMP'}\n </Text>\n {focusedField === 'mode' && (\n <Text dimColor> (Enter to cycle)</Text>\n )}\n </Box>\n\n {mode !== 'now' && (\n <Box marginBottom={1} flexDirection=\"column\">\n <Box marginBottom={0}>\n <Text color={focusedField === 'input' ? 'green' : undefined}>\n {focusedField === 'input' ? 'โ–ถ ' : ' '}\n {mode === 'to-human' ? 'Timestamp:' : 'Date string:'}\n </Text>\n </Box>\n <Box marginLeft={2} width={50}>\n {focusedField === 'input' ? (\n <TextInput\n value={input}\n onChange={setInput}\n placeholder={mode === 'to-human' ? '1702550400' : '2024-01-15 10:30:00'}\n />\n ) : (\n <Text dimColor={!input}>{input || '(empty)'}</Text>\n )}\n </Box>\n </Box>\n )}\n\n {mode === 'to-human' && (\n <Box marginBottom={1}>\n <Box width={20}>\n <Text color={focusedField === 'format' ? 'green' : undefined}>\n {focusedField === 'format' ? 'โ–ถ ' : ' '}Format:\n </Text>\n </Box>\n <Text bold color={focusedField === 'format' ? 'yellow' : undefined}>\n {format.toUpperCase()}\n </Text>\n {focusedField === 'format' && (\n <Text dimColor> (Enter to cycle)</Text>\n )}\n </Box>\n )}\n\n {mode === 'now' && (\n <Box marginBottom={1}>\n <Text color={focusedField === 'ms' ? 'green' : undefined}>\n {focusedField === 'ms' ? 'โ–ถ ' : ' '}\n [{useMs ? 'โœ“' : ' '}] Milliseconds\n </Text>\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text\n bold\n backgroundColor={focusedField === 'convert' ? 'green' : undefined}\n color={focusedField === 'convert' ? 'black' : 'green'}\n >\n {focusedField === 'convert' ? 'โ–ถ ' : ' '}\n [ {mode === 'now' ? 'Get Current' : 'Convert'} ]\n </Text>\n </Box>\n </Box>\n\n {error && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"red\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text color=\"red\">โœ— Error: {error}</Text>\n </Box>\n )}\n\n {result && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"green\"\n paddingX={2}\n paddingY={1}\n >\n <Box marginBottom={1}>\n <Text bold color=\"green\">\n โœ“ Result:\n </Text>\n {copied && (\n <Box marginLeft={2}>\n <Text color=\"green\">โœ“ Copied to clipboard!</Text>\n </Box>\n )}\n </Box>\n\n <Box flexDirection=\"column\">\n <Box marginTop={1}>\n <Text wrap=\"wrap\">{result}</Text>\n </Box>\n </Box>\n </Box>\n )}\n\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={2}>\n <Text dimColor>\n Tab: Next | Enter: Toggle/Convert | C: Copy | Esc: Back\n </Text>\n </Box>\n </Box>\n );\n};\n","/**\n * JWT Decoder/Encoder View\n * Interactive JWT decoding and encoding\n */\nimport React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { UtilsService } from '../../../services/utils.service.js';\n\ntype Mode = 'decode' | 'encode';\n\nexport const JwtView: React.FC = () => {\n const [mode, setMode] = useState<Mode>('decode');\n const [token, setToken] = useState('');\n const [payload, setPayload] = useState('');\n const [secret, setSecret] = useState('');\n const [result, setResult] = useState<{ header?: object; payload?: object; signature?: string; token?: string }>({});\n const [error, setError] = useState('');\n const [focusedField, setFocusedField] = useState<'mode' | 'token' | 'payload' | 'secret' | 'process'>('mode');\n const [copied, setCopied] = useState(false);\n\n const service = new UtilsService();\n\n useInput((input, key) => {\n if (key.tab) {\n const fields: typeof focusedField[] = mode === 'decode'\n ? ['mode', 'token', 'process']\n : ['mode', 'payload', 'secret', 'process'];\n const currentIndex = fields.indexOf(focusedField);\n setFocusedField(fields[(currentIndex + 1) % fields.length]);\n } else if (key.return) {\n if (focusedField === 'mode') {\n setMode(mode === 'decode' ? 'encode' : 'decode');\n setResult({});\n setError('');\n } else {\n // Process on Enter from any input field or process button\n handleProcess();\n }\n } else if (input === 'c' && result.token) {\n handleCopy();\n }\n });\n\n const handleProcess = () => {\n try {\n setError('');\n if (mode === 'decode') {\n if (!token) {\n setError('Please enter a JWT token');\n return;\n }\n const decoded = service.jwtDecode(token);\n setResult(decoded);\n } else {\n if (!payload) {\n setError('Please enter payload JSON');\n return;\n }\n if (!secret) {\n setError('Please enter a secret key');\n return;\n }\n const payloadObj = JSON.parse(payload);\n const encoded = service.jwtEncode(payloadObj, secret);\n setResult({ token: encoded });\n }\n setCopied(false);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Processing failed');\n setResult({});\n }\n };\n\n const handleCopy = async () => {\n try {\n const { default: clipboardy } = await import('clipboardy');\n await clipboardy.write(result.token || '');\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (error) {\n // Clipboard not available\n }\n };\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n ๐Ÿ”‘ JWT Decoder/Encoder\n </Text>\n </Box>\n\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text bold color=\"yellow\" marginBottom={1}>\n Options:\n </Text>\n\n <Box marginBottom={1}>\n <Box width={20}>\n <Text color={focusedField === 'mode' ? 'green' : undefined}>\n {focusedField === 'mode' ? 'โ–ถ ' : ' '}Mode:\n </Text>\n </Box>\n <Text bold color={focusedField === 'mode' ? 'yellow' : undefined}>\n {mode === 'decode' ? 'DECODE' : 'ENCODE'}\n </Text>\n {focusedField === 'mode' && (\n <Text dimColor> (Enter to toggle)</Text>\n )}\n </Box>\n\n {mode === 'decode' ? (\n <Box marginBottom={1} flexDirection=\"column\">\n <Box marginBottom={0}>\n <Text color={focusedField === 'token' ? 'green' : undefined}>\n {focusedField === 'token' ? 'โ–ถ ' : ' '}JWT Token:\n </Text>\n </Box>\n <Box marginLeft={2} width={60}>\n {focusedField === 'token' ? (\n <TextInput\n value={token}\n onChange={setToken}\n placeholder=\"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\"\n />\n ) : (\n <Text dimColor={!token}>{token || '(empty)'}</Text>\n )}\n </Box>\n </Box>\n ) : (\n <>\n <Box marginBottom={1} flexDirection=\"column\">\n <Box marginBottom={0}>\n <Text color={focusedField === 'payload' ? 'green' : undefined}>\n {focusedField === 'payload' ? 'โ–ถ ' : ' '}Payload (JSON):\n </Text>\n </Box>\n <Box marginLeft={2} width={60}>\n {focusedField === 'payload' ? (\n <TextInput\n value={payload}\n onChange={setPayload}\n placeholder='{\"sub\":\"123\",\"name\":\"John\"}'\n />\n ) : (\n <Text dimColor={!payload}>{payload || '(empty)'}</Text>\n )}\n </Box>\n </Box>\n\n <Box marginBottom={1} flexDirection=\"column\">\n <Box marginBottom={0}>\n <Text color={focusedField === 'secret' ? 'green' : undefined}>\n {focusedField === 'secret' ? 'โ–ถ ' : ' '}Secret Key:\n </Text>\n </Box>\n <Box marginLeft={2} width={60}>\n {focusedField === 'secret' ? (\n <TextInput\n value={secret}\n onChange={setSecret}\n placeholder=\"your-secret-key\"\n mask=\"*\"\n />\n ) : (\n <Text dimColor={!secret}>\n {secret ? '*'.repeat(secret.length) : '(empty)'}\n </Text>\n )}\n </Box>\n </Box>\n </>\n )}\n\n <Box marginTop={1}>\n <Text\n bold\n backgroundColor={focusedField === 'process' ? 'green' : undefined}\n color={focusedField === 'process' ? 'black' : 'green'}\n >\n {focusedField === 'process' ? 'โ–ถ ' : ' '}\n [ {mode === 'decode' ? 'Decode' : 'Encode'} ]\n </Text>\n </Box>\n </Box>\n\n {error && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"red\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text color=\"red\">โœ— Error: {error}</Text>\n </Box>\n )}\n\n {(result.header || result.token) && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"green\"\n paddingX={2}\n paddingY={1}\n >\n <Box marginBottom={1}>\n <Text bold color=\"green\">\n โœ“ Result:\n </Text>\n {copied && result.token && (\n <Box marginLeft={2}>\n <Text color=\"green\">โœ“ Copied to clipboard!</Text>\n </Box>\n )}\n </Box>\n\n <Box flexDirection=\"column\">\n {result.header && (\n <>\n <Text bold color=\"yellow\">Header:</Text>\n <Text>{JSON.stringify(result.header, null, 2)}</Text>\n <Text> </Text>\n <Text bold color=\"yellow\">Payload:</Text>\n <Text>{JSON.stringify(result.payload, null, 2)}</Text>\n <Text> </Text>\n <Text bold color=\"yellow\">Signature:</Text>\n <Text dimColor>{result.signature}</Text>\n </>\n )}\n {result.token && (\n <>\n <Text bold color=\"yellow\">Token:</Text>\n <Text wrap=\"wrap\">{result.token}</Text>\n </>\n )}\n </Box>\n </Box>\n )}\n\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={2}>\n <Text dimColor>\n Tab: Next | Enter: Toggle/{mode === 'decode' ? 'Decode' : 'Encode'} | C: Copy | Esc: Back\n </Text>\n </Box>\n </Box>\n );\n};\n","/**\n * Cron Parser View\n * Interactive cron expression parsing and explanation\n */\nimport React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { UtilsService } from '../../../services/utils.service.js';\n\nexport const CronView: React.FC = () => {\n const [expression, setExpression] = useState('');\n const [result, setResult] = useState<{ description: string; nextRuns: string[] } | null>(null);\n const [error, setError] = useState('');\n const [focusedField, setFocusedField] = useState<'expression' | 'parse'>('expression');\n const [copied, setCopied] = useState(false);\n\n const service = new UtilsService();\n\n useInput((input, key) => {\n if (key.tab) {\n setFocusedField(focusedField === 'expression' ? 'parse' : 'expression');\n } else if (key.return) {\n // Parse on Enter from any field\n handleParse();\n } else if (input === 'c' && result) {\n handleCopy();\n }\n });\n\n const handleParse = () => {\n if (!expression) {\n setError('Please enter a cron expression');\n return;\n }\n\n try {\n setError('');\n const parsed = service.parseCron(expression);\n setResult(parsed);\n setCopied(false);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to parse cron expression');\n setResult(null);\n }\n };\n\n const handleCopy = async () => {\n if (!result) return;\n try {\n const { default: clipboardy } = await import('clipboardy');\n const copyText = `${result.description}\\n\\nNext runs:\\n${result.nextRuns.join('\\n')}`;\n await clipboardy.write(copyText);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (error) {\n // Clipboard not available\n }\n };\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n โฐ Cron Expression Parser\n </Text>\n </Box>\n\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text bold color=\"yellow\" marginBottom={1}>\n Options:\n </Text>\n\n <Box marginBottom={1} flexDirection=\"column\">\n <Box marginBottom={0}>\n <Text color={focusedField === 'expression' ? 'green' : undefined}>\n {focusedField === 'expression' ? 'โ–ถ ' : ' '}Cron Expression:\n </Text>\n </Box>\n <Box marginLeft={2} width={50}>\n {focusedField === 'expression' ? (\n <TextInput\n value={expression}\n onChange={setExpression}\n placeholder=\"0 5 * * * (5-field or 6-field)\"\n />\n ) : (\n <Text dimColor={!expression}>{expression || '(empty)'}</Text>\n )}\n </Box>\n </Box>\n\n <Box marginTop={1} marginBottom={1}>\n <Text dimColor>\n Examples: \"0 5 * * *\" (daily at 5am), \"*/15 * * * *\" (every 15 min)\n </Text>\n </Box>\n\n <Box marginTop={1}>\n <Text\n bold\n backgroundColor={focusedField === 'parse' ? 'green' : undefined}\n color={focusedField === 'parse' ? 'black' : 'green'}\n >\n {focusedField === 'parse' ? 'โ–ถ ' : ' '}\n [ Parse Expression ]\n </Text>\n </Box>\n </Box>\n\n {error && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"red\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text color=\"red\">โœ— Error: {error}</Text>\n </Box>\n )}\n\n {result && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"green\"\n paddingX={2}\n paddingY={1}\n >\n <Box marginBottom={1}>\n <Text bold color=\"green\">\n โœ“ Result:\n </Text>\n {copied && (\n <Box marginLeft={2}>\n <Text color=\"green\">โœ“ Copied to clipboard!</Text>\n </Box>\n )}\n </Box>\n\n <Box flexDirection=\"column\">\n <Text bold color=\"yellow\">Expression:</Text>\n <Text>{expression}</Text>\n <Text> </Text>\n\n <Text bold color=\"yellow\">Meaning:</Text>\n <Text>{result.description}</Text>\n <Text> </Text>\n\n <Text bold color=\"yellow\">Next 5 executions:</Text>\n {result.nextRuns.map((run, index) => (\n <Text key={index}> {index + 1}. {run}</Text>\n ))}\n </Box>\n </Box>\n )}\n\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={2}>\n <Text dimColor>\n Tab: Next | Enter: Parse | C: Copy | Esc: Back\n </Text>\n </Box>\n </Box>\n );\n};\n","/**\n * Timezone Converter View\n * Interactive timezone conversion\n */\nimport React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { UtilsService } from '../../../services/utils.service.js';\n\nexport const TimezoneView: React.FC = () => {\n const [time, setTime] = useState('');\n const [fromTz, setFromTz] = useState('UTC');\n const [toTz, setToTz] = useState('America/New_York');\n const [result, setResult] = useState('');\n const [error, setError] = useState('');\n const [focusedField, setFocusedField] = useState<'time' | 'from' | 'to' | 'convert'>('time');\n const [copied, setCopied] = useState(false);\n\n const service = new UtilsService();\n\n useInput((input, key) => {\n if (key.tab) {\n const fields: typeof focusedField[] = ['time', 'from', 'to', 'convert'];\n const currentIndex = fields.indexOf(focusedField);\n setFocusedField(fields[(currentIndex + 1) % fields.length]);\n } else if (key.return) {\n // Convert on Enter from any field\n handleConvert();\n } else if (input === 'c' && result) {\n handleCopy();\n }\n });\n\n const handleConvert = () => {\n if (!time) {\n setError('Please enter a time');\n return;\n }\n if (!fromTz || !toTz) {\n setError('Please enter both timezones');\n return;\n }\n\n try {\n setError('');\n const converted = service.convertTimezone(time, fromTz, toTz);\n setResult(converted);\n setCopied(false);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Conversion failed');\n setResult('');\n }\n };\n\n const handleCopy = async () => {\n try {\n const { default: clipboardy } = await import('clipboardy');\n await clipboardy.write(result);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (error) {\n // Clipboard not available\n }\n };\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n ๐ŸŒ Timezone Converter\n </Text>\n </Box>\n\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text bold color=\"yellow\" marginBottom={1}>\n Options:\n </Text>\n\n <Box marginBottom={1} flexDirection=\"column\">\n <Box marginBottom={0}>\n <Text color={focusedField === 'time' ? 'green' : undefined}>\n {focusedField === 'time' ? 'โ–ถ ' : ' '}Time:\n </Text>\n </Box>\n <Box marginLeft={2} width={50}>\n {focusedField === 'time' ? (\n <TextInput\n value={time}\n onChange={setTime}\n placeholder=\"2024-01-15 10:00:00\"\n />\n ) : (\n <Text dimColor={!time}>{time || '(empty)'}</Text>\n )}\n </Box>\n </Box>\n\n <Box marginBottom={1} flexDirection=\"column\">\n <Box marginBottom={0}>\n <Text color={focusedField === 'from' ? 'green' : undefined}>\n {focusedField === 'from' ? 'โ–ถ ' : ' '}From Timezone:\n </Text>\n </Box>\n <Box marginLeft={2} width={50}>\n {focusedField === 'from' ? (\n <TextInput\n value={fromTz}\n onChange={setFromTz}\n placeholder=\"UTC or America/New_York\"\n />\n ) : (\n <Text dimColor={!fromTz}>{fromTz || '(empty)'}</Text>\n )}\n </Box>\n </Box>\n\n <Box marginBottom={1} flexDirection=\"column\">\n <Box marginBottom={0}>\n <Text color={focusedField === 'to' ? 'green' : undefined}>\n {focusedField === 'to' ? 'โ–ถ ' : ' '}To Timezone:\n </Text>\n </Box>\n <Box marginLeft={2} width={50}>\n {focusedField === 'to' ? (\n <TextInput\n value={toTz}\n onChange={setToTz}\n placeholder=\"Asia/Tokyo or Europe/London\"\n />\n ) : (\n <Text dimColor={!toTz}>{toTz || '(empty)'}</Text>\n )}\n </Box>\n </Box>\n\n <Box marginBottom={1}>\n <Text dimColor>\n Common: UTC, America/New_York, Europe/London, Asia/Tokyo\n </Text>\n </Box>\n\n <Box marginTop={1}>\n <Text\n bold\n backgroundColor={focusedField === 'convert' ? 'green' : undefined}\n color={focusedField === 'convert' ? 'black' : 'green'}\n >\n {focusedField === 'convert' ? 'โ–ถ ' : ' '}\n [ Convert ]\n </Text>\n </Box>\n </Box>\n\n {error && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"red\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text color=\"red\">โœ— Error: {error}</Text>\n </Box>\n )}\n\n {result && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"green\"\n paddingX={2}\n paddingY={1}\n >\n <Box marginBottom={1}>\n <Text bold color=\"green\">\n โœ“ Result:\n </Text>\n {copied && (\n <Box marginLeft={2}>\n <Text color=\"green\">โœ“ Copied to clipboard!</Text>\n </Box>\n )}\n </Box>\n\n <Box flexDirection=\"column\">\n <Text dimColor>From: {fromTz}</Text>\n <Text dimColor>To: {toTz}</Text>\n <Box marginTop={1}>\n <Text wrap=\"wrap\">{result}</Text>\n </Box>\n </Box>\n </Box>\n )}\n\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={2}>\n <Text dimColor>\n Tab: Next | Enter: Convert | C: Copy | Esc: Back\n </Text>\n </Box>\n </Box>\n );\n};\n","/**\n * HTTP Request View\n * Interactive HTTP request tool\n */\nimport React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { UtilsService, HttpResponse } from '../../../services/utils.service.js';\n\nconst METHODS = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'];\n\nexport const HttpView: React.FC = () => {\n const [url, setUrl] = useState('');\n const [method, setMethod] = useState<string>('GET');\n const [headers, setHeaders] = useState('');\n const [body, setBody] = useState('');\n const [response, setResponse] = useState<HttpResponse | null>(null);\n const [error, setError] = useState('');\n const [loading, setLoading] = useState(false);\n const [focusedField, setFocusedField] = useState<'url' | 'method' | 'headers' | 'body' | 'send'>('url');\n const [copied, setCopied] = useState(false);\n\n const service = new UtilsService();\n\n useInput((input, key) => {\n if (loading) return;\n\n if (key.tab) {\n const fields: typeof focusedField[] = ['url', 'method', 'headers', 'body', 'send'];\n const currentIndex = fields.indexOf(focusedField);\n setFocusedField(fields[(currentIndex + 1) % fields.length]);\n } else if (key.leftArrow && focusedField === 'method') {\n const currentIndex = METHODS.indexOf(method);\n setMethod(METHODS[currentIndex > 0 ? currentIndex - 1 : METHODS.length - 1]);\n } else if (key.rightArrow && focusedField === 'method') {\n const currentIndex = METHODS.indexOf(method);\n setMethod(METHODS[(currentIndex + 1) % METHODS.length]);\n } else if (key.return && focusedField === 'send') {\n handleSend();\n } else if (input === 'c' && response) {\n handleCopy();\n }\n });\n\n const handleSend = async () => {\n if (!url) {\n setError('Please enter a URL');\n return;\n }\n\n try {\n setError('');\n setLoading(true);\n\n const headersObj: Record<string, string> = {};\n if (headers) {\n const headerLines = headers.split('\\n');\n for (const line of headerLines) {\n const [key, ...valueParts] = line.split(':');\n if (key && valueParts.length > 0) {\n headersObj[key.trim()] = valueParts.join(':').trim();\n }\n }\n }\n\n const result = await service.httpRequest(url, {\n method,\n headers: headersObj,\n body: body || undefined,\n });\n\n setResponse(result);\n setCopied(false);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Request failed');\n setResponse(null);\n } finally {\n setLoading(false);\n }\n };\n\n const handleCopy = async () => {\n if (!response) return;\n try {\n const { default: clipboardy } = await import('clipboardy');\n const copyText = typeof response.body === 'string'\n ? response.body\n : JSON.stringify(response.body, null, 2);\n await clipboardy.write(copyText);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (error) {\n // Clipboard not available\n }\n };\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n ๐ŸŒ HTTP Request\n </Text>\n </Box>\n\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text bold color=\"yellow\" marginBottom={1}>\n Request:\n </Text>\n\n <Box marginBottom={1} flexDirection=\"column\">\n <Box marginBottom={0}>\n <Text color={focusedField === 'url' ? 'green' : undefined}>\n {focusedField === 'url' ? 'โ–ถ ' : ' '}URL:\n </Text>\n </Box>\n <Box marginLeft={2} width={60}>\n {focusedField === 'url' ? (\n <TextInput\n value={url}\n onChange={setUrl}\n placeholder=\"https://api.example.com/endpoint\"\n />\n ) : (\n <Text dimColor={!url}>{url || '(empty)'}</Text>\n )}\n </Box>\n </Box>\n\n <Box marginBottom={1}>\n <Box width={20}>\n <Text color={focusedField === 'method' ? 'green' : undefined}>\n {focusedField === 'method' ? 'โ–ถ ' : ' '}Method:\n </Text>\n </Box>\n <Text bold color={focusedField === 'method' ? 'yellow' : undefined}>\n {method}\n </Text>\n {focusedField === 'method' && (\n <Text dimColor> (โ† โ†’ to change)</Text>\n )}\n </Box>\n\n <Box marginBottom={1} flexDirection=\"column\">\n <Box marginBottom={0}>\n <Text color={focusedField === 'headers' ? 'green' : undefined}>\n {focusedField === 'headers' ? 'โ–ถ ' : ' '}Headers (one per line, Key: Value):\n </Text>\n </Box>\n <Box marginLeft={2} width={60}>\n {focusedField === 'headers' ? (\n <TextInput\n value={headers}\n onChange={setHeaders}\n placeholder=\"Authorization: Bearer token\"\n />\n ) : (\n <Text dimColor={!headers}>{headers || '(none)'}</Text>\n )}\n </Box>\n </Box>\n\n {(method === 'POST' || method === 'PUT' || method === 'PATCH') && (\n <Box marginBottom={1} flexDirection=\"column\">\n <Box marginBottom={0}>\n <Text color={focusedField === 'body' ? 'green' : undefined}>\n {focusedField === 'body' ? 'โ–ถ ' : ' '}Body (JSON):\n </Text>\n </Box>\n <Box marginLeft={2} width={60}>\n {focusedField === 'body' ? (\n <TextInput\n value={body}\n onChange={setBody}\n placeholder='{\"key\":\"value\"}'\n />\n ) : (\n <Text dimColor={!body}>{body || '(empty)'}</Text>\n )}\n </Box>\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text\n bold\n backgroundColor={focusedField === 'send' ? 'green' : undefined}\n color={focusedField === 'send' ? 'black' : 'green'}\n >\n {focusedField === 'send' ? 'โ–ถ ' : ' '}\n [ {loading ? 'Sending...' : 'Send Request'} ]\n </Text>\n </Box>\n </Box>\n\n {error && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"red\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text color=\"red\">โœ— Error: {error}</Text>\n </Box>\n )}\n\n {response && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"green\"\n paddingX={2}\n paddingY={1}\n >\n <Box marginBottom={1}>\n <Text bold color=\"green\">\n โœ“ Response:\n </Text>\n {copied && (\n <Box marginLeft={2}>\n <Text color=\"green\">โœ“ Copied body to clipboard!</Text>\n </Box>\n )}\n </Box>\n\n <Box flexDirection=\"column\">\n <Text>\n Status: <Text color={response.status < 400 ? 'green' : 'red'}>{response.status}</Text>\n </Text>\n <Text>Time: {response.time}ms</Text>\n <Text>Size: {response.size}</Text>\n <Text> </Text>\n\n <Text bold color=\"yellow\">Headers:</Text>\n {Object.entries(response.headers).slice(0, 5).map(([key, value]) => (\n <Text key={key} dimColor> {key}: {value}</Text>\n ))}\n <Text> </Text>\n\n <Text bold color=\"yellow\">Body:</Text>\n <Text>\n {typeof response.body === 'string'\n ? response.body.slice(0, 500)\n : JSON.stringify(response.body, null, 2).slice(0, 500)}\n </Text>\n </Box>\n </Box>\n )}\n\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={2}>\n <Text dimColor>\n Tab: Next | โ†/โ†’: Change method | Enter: Send | C: Copy body | Esc: Back\n </Text>\n </Box>\n </Box>\n );\n};\n","/**\n * Markdown Preview View\n * Interactive markdown file preview\n */\nimport React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport TextInput from 'ink-text-input';\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nexport const MarkdownView: React.FC = () => {\n const [filePath, setFilePath] = useState('');\n const [content, setContent] = useState('');\n const [error, setError] = useState('');\n const [focusedField, setFocusedField] = useState<'file' | 'preview'>('file');\n\n useInput((input, key) => {\n if (key.tab) {\n setFocusedField(focusedField === 'file' ? 'preview' : 'file');\n } else if (key.return) {\n // Preview on Enter from any field\n handlePreview();\n }\n });\n\n const handlePreview = async () => {\n if (!filePath) {\n setError('Please enter a file path');\n return;\n }\n\n try {\n setError('');\n\n const resolvedPath = path.resolve(filePath);\n if (!fs.existsSync(resolvedPath)) {\n setError(`File not found: ${resolvedPath}`);\n return;\n }\n\n let fileContent = fs.readFileSync(resolvedPath, 'utf-8');\n\n // Pre-process Mermaid diagrams\n fileContent = fileContent.replace(/```mermaid\\n([\\s\\S]*?)```/g, (match, code) => {\n return `\\n๐ŸŽจ **Mermaid Diagram**\\n\\n\\`\\`\\`\\n${code.trim()}\\n\\`\\`\\`\\n\\n๐Ÿ’ก *Tip: Mermaid diagrams cannot be rendered in terminal. View in a Markdown viewer.*\\n`;\n });\n\n // Import marked and marked-terminal dynamically\n const { marked } = await import('marked');\n const { default: markedTerminal } = await import('marked-terminal');\n\n // Configure marked with terminal renderer\n marked.use(markedTerminal() as any);\n\n // Render markdown\n const rendered = marked(fileContent) as string;\n setContent(rendered);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to preview file');\n setContent('');\n }\n };\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n ๐Ÿ“„ Markdown Preview\n </Text>\n </Box>\n\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text bold color=\"yellow\" marginBottom={1}>\n Options:\n </Text>\n\n <Box marginBottom={1} flexDirection=\"column\">\n <Box marginBottom={0}>\n <Text color={focusedField === 'file' ? 'green' : undefined}>\n {focusedField === 'file' ? 'โ–ถ ' : ' '}File path:\n </Text>\n </Box>\n <Box marginLeft={2} width={60}>\n {focusedField === 'file' ? (\n <TextInput\n value={filePath}\n onChange={setFilePath}\n placeholder=\"./README.md or /path/to/file.md\"\n />\n ) : (\n <Text dimColor={!filePath}>{filePath || '(empty)'}</Text>\n )}\n </Box>\n </Box>\n\n <Box marginTop={1}>\n <Text\n bold\n backgroundColor={focusedField === 'preview' ? 'green' : undefined}\n color={focusedField === 'preview' ? 'black' : 'green'}\n >\n {focusedField === 'preview' ? 'โ–ถ ' : ' '}\n [ Preview File ]\n </Text>\n </Box>\n </Box>\n\n {error && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"red\"\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Text color=\"red\">โœ— Error: {error}</Text>\n </Box>\n )}\n\n {content && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"green\"\n paddingX={2}\n paddingY={1}\n >\n <Box marginBottom={1}>\n <Text bold color=\"green\">\n โœ“ Preview:\n </Text>\n </Box>\n\n <Box flexDirection=\"column\">\n <Text>{content}</Text>\n </Box>\n </Box>\n )}\n\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={2}>\n <Text dimColor>\n Tab: Next | Enter: Preview | Esc: Back\n </Text>\n </Box>\n </Box>\n );\n};\n","/**\n * Deps Command Group\n * Quแบฃn lรฝ dependencies trong project\n */\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { createDepsCheckCommand } from './check.js';\nimport { createDepsUpgradeCommand } from './upgrade.js';\n\nfunction showDepsHelp(): void {\n console.log(chalk.bold.cyan('๐Ÿ“ฆ jai1 deps') + chalk.dim(' - Quแบฃn lรฝ dependencies trong project'));\n console.log();\n console.log(chalk.bold('Cรกc lแป‡nh:'));\n console.log(` ${chalk.cyan('check')} Kiแปƒm tra cรกc packages cแบงn upgrade`);\n console.log(` ${chalk.cyan('upgrade')} Nรขng cแบฅp dependencies lรชn phiรชn bแบฃn mแป›i nhแบฅt`);\n console.log();\n console.log(chalk.bold('Hแป— trแปฃ:'));\n console.log(chalk.dim(' โ€ข Node.js (npm, pnpm, yarn, bun)'));\n console.log(chalk.dim(' โ€ข PHP/Composer (vแป›i bแบฃo vแป‡ Laravel major version)'));\n console.log(chalk.dim(' โ€ข Python (pip, pipenv)'));\n console.log();\n console.log(chalk.bold('Vรญ dแปฅ:'));\n console.log(chalk.dim(' $ jai1 deps check'));\n console.log(chalk.dim(' $ jai1 deps upgrade'));\n console.log(chalk.dim(' $ jai1 deps upgrade --all'));\n console.log();\n console.log(chalk.dim('Chแบกy \"jai1 deps <lแป‡nh> --help\" ฤ‘แปƒ xem chi tiแบฟt'));\n}\n\nexport function createDepsCommand(): Command {\n const depsCommand = new Command('deps')\n .description('Quแบฃn lรฝ dependencies trong project')\n .action(() => {\n showDepsHelp();\n });\n\n // Register subcommands\n depsCommand.addCommand(createDepsCheckCommand());\n depsCommand.addCommand(createDepsUpgradeCommand());\n\n return depsCommand;\n}\n","/**\n * Deps Check Command\n * Kiแปƒm tra cรกc packages cแบงn upgrade mร  khรดng thแปฑc hiแป‡n upgrade\n */\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport Table from 'cli-table3';\nimport ora from 'ora';\nimport { DepsDetectorService } from '../../services/deps-detector.service.js';\nimport { DepsService } from '../../services/deps.service.js';\nimport { DepsPhpService } from '../../services/deps-php.service.js';\nimport { DepsPythonService } from '../../services/deps-python.service.js';\nimport type { DepsServiceInterface, CheckResult } from '../../types/deps.types.js';\n\nexport function createDepsCheckCommand(): Command {\n const checkCommand = new Command('check')\n .description('Kiแปƒm tra cรกc packages cแบงn upgrade')\n .action(async () => {\n const cwd = process.cwd();\n const detector = new DepsDetectorService();\n\n // Detect project types\n const spinner = ora('ฤang phรกt hiแป‡n loแบกi project...').start();\n const projects = await detector.detectProjects(cwd);\n\n if (projects.length === 0) {\n spinner.fail('Khรดng tรฌm thแบฅy project nร o ฤ‘ฦฐแปฃc hแป— trแปฃ');\n console.log();\n console.log(chalk.dim('Hแป— trแปฃ: Node.js (package.json), PHP (composer.json), Python (requirements.txt/Pipfile)'));\n process.exit(1);\n }\n\n spinner.succeed(`Phรกt hiแป‡n ${projects.length} project:`);\n for (const project of projects) {\n const icon = project.ecosystem === 'node' ? '๐Ÿ“ฆ' : project.ecosystem === 'php' ? '๐Ÿ˜' : '๐Ÿ';\n const label = project.ecosystem === 'node' ? 'Node.js' :\n project.ecosystem === 'php' ? 'PHP/Composer' : 'Python';\n console.log(` ${icon} ${label} (${project.manager})`);\n }\n console.log();\n\n // Check each ecosystem\n for (const project of projects) {\n await checkEcosystem(project.ecosystem, project.manager, cwd);\n }\n\n console.log();\n console.log(chalk.dim('๐Ÿ’ก Chแบกy \"jai1 deps upgrade\" ฤ‘แปƒ nรขng cแบฅp packages.'));\n });\n\n return checkCommand;\n}\n\nasync function checkEcosystem(\n ecosystem: 'node' | 'php' | 'python',\n manager: string,\n cwd: string\n): Promise<void> {\n // Get appropriate service\n let service: DepsServiceInterface;\n let icon: string;\n let label: string;\n\n switch (ecosystem) {\n case 'node':\n service = new DepsService();\n icon = '๐Ÿ“ฆ';\n label = `Node.js (${manager})`;\n break;\n case 'php':\n service = new DepsPhpService();\n icon = '๐Ÿ˜';\n label = 'PHP/Composer';\n break;\n case 'python':\n service = new DepsPythonService();\n icon = '๐Ÿ';\n label = `Python (${manager})`;\n break;\n }\n\n // Check for outdated packages\n const spinner = ora(`ฤang kiแปƒm tra ${label}...`).start();\n\n let result: CheckResult;\n try {\n result = await service.check(cwd, (completed, total) => {\n spinner.text = `ฤang kiแปƒm tra ${label}... (${completed}/${total})`;\n });\n } catch (error) {\n spinner.fail(`Lแป—i kiแปƒm tra ${label}`);\n console.log(chalk.red((error as Error).message));\n console.log();\n return;\n }\n\n if (result.packages.length === 0) {\n spinner.succeed(`${label} - Tแบฅt cแบฃ packages ฤ‘รฃ cแบญp nhแบญt`);\n console.log();\n return;\n }\n\n spinner.succeed(`${label} - ${result.packages.length} packages cรณ thแปƒ nรขng cแบฅp`);\n console.log();\n\n // Display table\n const table = new Table({\n head: [\n chalk.cyan('Package'),\n chalk.cyan('Hiแป‡n tแบกi'),\n chalk.cyan('Mแป›i nhแบฅt'),\n chalk.cyan('Loแบกi')\n ],\n style: {\n head: [],\n border: ['dim']\n }\n });\n\n for (const pkg of result.packages) {\n const upgradeIcon = pkg.upgradeType === 'major' ? '๐Ÿ”ด' :\n pkg.upgradeType === 'minor' ? '๐ŸŸก' : '๐ŸŸข';\n\n table.push([\n `${upgradeIcon} ${pkg.name}`,\n chalk.dim(pkg.current),\n chalk.green(pkg.latest),\n pkg.type === 'dev' ? chalk.dim('dev') : 'dep'\n ]);\n }\n\n console.log(table.toString());\n console.log();\n\n // Show Laravel warnings if applicable\n if (result.isLaravel) {\n // Check if there are blocked Laravel packages\n const blockedPackages = result.packages.filter(p => p.blockedReason);\n if (blockedPackages.length > 0) {\n console.log(chalk.yellow('โš ๏ธ Laravel major version upgrades blocked (nguy hiแปƒm):'));\n for (const pkg of blockedPackages) {\n console.log(chalk.dim(` - ${pkg.name}: ${pkg.current} โ†’ ${pkg.latest}`));\n }\n console.log();\n console.log(chalk.dim('๐Ÿ’ก ฤแปƒ nรขng cแบฅp Laravel major version, chแบกy thแปง cรดng:'));\n console.log(chalk.dim(` composer require ${blockedPackages[0].name}:^${blockedPackages[0].latest}`));\n console.log();\n }\n }\n}\n","/**\n * Deps Detector Service\n * Detect project types and package managers\n */\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport type { DetectedProject, Ecosystem, PackageManager } from '../types/deps.types.js';\n\nexport class DepsDetectorService {\n /**\n * Detect all project types in the given directory\n */\n async detectProjects(cwd: string): Promise<DetectedProject[]> {\n const projects: DetectedProject[] = [];\n\n // 1. Check Node.js\n if (await this.fileExists(cwd, 'package.json')) {\n const manager = await this.detectNodePackageManager(cwd);\n projects.push({\n ecosystem: 'node',\n manager,\n configFile: 'package.json'\n });\n }\n\n // 2. Check PHP\n if (await this.fileExists(cwd, 'composer.json') || await this.fileExists(cwd, 'composer.lock')) {\n const isLaravel = await this.detectLaravel(cwd);\n projects.push({\n ecosystem: 'php',\n manager: 'composer',\n isLaravel,\n configFile: 'composer.json'\n });\n }\n\n // 3. Check Python\n if (await this.fileExists(cwd, 'Pipfile')) {\n projects.push({\n ecosystem: 'python',\n manager: 'pipenv',\n configFile: 'Pipfile'\n });\n } else if (await this.fileExists(cwd, 'requirements.txt')) {\n projects.push({\n ecosystem: 'python',\n manager: 'pip',\n configFile: 'requirements.txt'\n });\n }\n\n return projects;\n }\n\n /**\n * Detect Node.js package manager\n */\n private async detectNodePackageManager(cwd: string): Promise<PackageManager> {\n // Check lockfiles first\n if (await this.fileExists(cwd, 'pnpm-lock.yaml')) {\n return 'pnpm';\n }\n if (await this.fileExists(cwd, 'yarn.lock')) {\n return 'yarn';\n }\n if (await this.fileExists(cwd, 'bun.lockb')) {\n return 'bun';\n }\n if (await this.fileExists(cwd, 'package-lock.json')) {\n return 'npm';\n }\n\n // Check environment\n const userAgent = process.env.npm_config_user_agent || '';\n if (userAgent.includes('pnpm')) return 'pnpm';\n if (userAgent.includes('yarn')) return 'yarn';\n if (userAgent.includes('bun')) return 'bun';\n\n // Default to npm\n return 'npm';\n }\n\n /**\n * Detect if project is Laravel\n */\n private async detectLaravel(cwd: string): Promise<boolean> {\n try {\n const composerPath = path.join(cwd, 'composer.json');\n const content = await fs.readFile(composerPath, 'utf-8');\n const composerJson = JSON.parse(content);\n \n const deps = {\n ...composerJson.require,\n ...composerJson['require-dev']\n };\n \n return 'laravel/framework' in deps;\n } catch {\n return false;\n }\n }\n\n /**\n * Check if file exists\n */\n private async fileExists(cwd: string, filename: string): Promise<boolean> {\n try {\n await fs.access(path.join(cwd, filename));\n return true;\n } catch {\n return false;\n }\n }\n}\n","/**\n * Dependencies Service - Node.js ecosystem\n */\nimport { promises as fs } from 'fs';\nimport path from 'path';\nimport { execSync } from 'child_process';\nimport pLimit from 'p-limit';\nimport type { \n DepsServiceInterface, \n PackageInfo, \n CheckResult, \n UpgradeOptions,\n PackageManager,\n UpgradeType\n} from '../types/deps.types.js';\n\nexport interface PackageJson {\n name?: string;\n version?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n}\n\nexport class DepsService implements DepsServiceInterface {\n readonly ecosystem = 'node' as const;\n private versionCache: Map<string, string> = new Map();\n\n async check(cwd: string, onProgress?: (completed: number, total: number) => void): Promise<CheckResult> {\n const pkgJson = await this.readPackageJson(cwd);\n const manager = await this.detectPackageManager(cwd);\n const packages: Array<{ name: string; current: string; type: 'dep' | 'dev' }> = [];\n\n if (pkgJson.dependencies) {\n for (const [name, version] of Object.entries(pkgJson.dependencies)) {\n if (this.isValidNpmDependency(version)) {\n packages.push({ name, current: version, type: 'dep' });\n }\n }\n }\n\n if (pkgJson.devDependencies) {\n for (const [name, version] of Object.entries(pkgJson.devDependencies)) {\n if (this.isValidNpmDependency(version)) {\n packages.push({ name, current: version, type: 'dev' });\n }\n }\n }\n\n const upgradablePackages = await this.fetchBulkVersions(packages, onProgress);\n return { ecosystem: this.ecosystem, manager, packages: upgradablePackages };\n }\n\n async upgrade(cwd: string, options: UpgradeOptions): Promise<void> {\n const manager = await this.detectPackageManager(cwd);\n const commands = this.buildUpgradeCommands(options.packages, manager);\n if (commands.deps) this.executeUpgrade(commands.deps);\n if (commands.devDeps) this.executeUpgrade(commands.devDeps);\n }\n\n async readPackageJson(cwd: string): Promise<PackageJson> {\n const pkgPath = path.join(cwd, 'package.json');\n try {\n const content = await fs.readFile(pkgPath, 'utf-8');\n return JSON.parse(content) as PackageJson;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n throw new Error('Khรดng tรฌm thแบฅy package.json trong thฦฐ mแปฅc hiแป‡n tแบกi');\n }\n throw new Error(`Lแป—i ฤ‘แปc package.json: ${(error as Error).message}`);\n }\n }\n\n async fetchLatestVersion(packageName: string): Promise<string | null> {\n if (this.versionCache.has(packageName)) {\n return this.versionCache.get(packageName)!;\n }\n\n try {\n const response = await fetch(\n `https://registry.npmjs.org/${encodeURIComponent(packageName)}/latest`,\n { signal: AbortSignal.timeout(10000) }\n );\n\n if (!response.ok) return null;\n const data = await response.json() as { version: string };\n this.versionCache.set(packageName, data.version);\n return data.version;\n } catch {\n return null;\n }\n }\n\n async fetchBulkVersions(\n packages: Array<{ name: string; current: string; type: 'dep' | 'dev' }>,\n onProgress?: (completed: number, total: number) => void\n ): Promise<PackageInfo[]> {\n const limit = pLimit(10);\n const total = packages.length;\n let completed = 0;\n\n const results = await Promise.all(\n packages.map(pkg => limit(async () => {\n const latest = await this.fetchLatestVersion(pkg.name);\n completed++;\n onProgress?.(completed, total);\n\n if (!latest) return null;\n const currentClean = this.stripSemverPrefix(pkg.current);\n const canUpgrade = this.isNewerVersion(latest, currentClean);\n const upgradeType = this.getUpgradeType(currentClean, latest);\n\n return {\n name: pkg.name,\n current: pkg.current,\n latest,\n latestWithPrefix: this.preserveSemverPrefix(pkg.current, latest),\n type: pkg.type,\n canUpgrade,\n upgradeType\n } satisfies PackageInfo;\n }))\n );\n\n return results.filter((r): r is PackageInfo => r !== null && r.canUpgrade);\n }\n\n private isValidNpmDependency(version: string): boolean {\n const invalidPrefixes = ['git+', 'git:', 'file:', 'link:', 'workspace:'];\n return !invalidPrefixes.some(prefix => version.startsWith(prefix));\n }\n\n private getUpgradeType(current: string, latest: string): UpgradeType {\n const currentParts = current.split('.').map(Number);\n const latestParts = latest.split('.').map(Number);\n if ((latestParts[0] || 0) > (currentParts[0] || 0)) return 'major';\n if ((latestParts[1] || 0) > (currentParts[1] || 0)) return 'minor';\n return 'patch';\n }\n\n stripSemverPrefix(version: string): string {\n return version.replace(/^[~^>=<]+/, '');\n }\n\n preserveSemverPrefix(current: string, latest: string): string {\n const match = current.match(/^([~^>=<]*)/);\n const prefix = match?.[1] || '';\n return prefix + latest;\n }\n\n isNewerVersion(remote: string, local: string): boolean {\n const remoteParts = remote.split('.').map(Number);\n const localParts = local.split('.').map(Number);\n\n for (let i = 0; i < 3; i++) {\n const r = remoteParts[i] || 0;\n const l = localParts[i] || 0;\n if (r > l) return true;\n if (r < l) return false;\n }\n return false;\n }\n\n async detectPackageManager(cwd: string): Promise<PackageManager> {\n const lockFiles: Array<{ file: string; pm: PackageManager }> = [\n { file: 'pnpm-lock.yaml', pm: 'pnpm' },\n { file: 'yarn.lock', pm: 'yarn' },\n { file: 'bun.lockb', pm: 'bun' },\n { file: 'package-lock.json', pm: 'npm' },\n ];\n\n for (const { file, pm } of lockFiles) {\n try {\n await fs.access(path.join(cwd, file));\n return pm;\n } catch {}\n }\n\n const userAgent = process.env.npm_config_user_agent || '';\n if (userAgent.includes('pnpm')) return 'pnpm';\n if (userAgent.includes('yarn')) return 'yarn';\n if (userAgent.includes('bun')) return 'bun';\n if (this.isCommandAvailable('pnpm')) return 'pnpm';\n return 'npm';\n }\n\n private isCommandAvailable(command: string): boolean {\n try {\n execSync(`${command} --version`, { stdio: ['pipe', 'pipe', 'pipe'] });\n return true;\n } catch {\n return false;\n }\n }\n\n getUpgradeCommands(packages: PackageInfo[]): { deps: string | null; devDeps: string | null } {\n const pm = process.env.npm_config_user_agent?.includes('pnpm') ? 'pnpm' : 'npm';\n return this.buildUpgradeCommands(packages, pm as PackageManager);\n }\n\n private buildUpgradeCommands(packages: PackageInfo[], pm: PackageManager): { deps: string | null; devDeps: string | null } {\n const deps = packages.filter(p => p.type === 'dep');\n const devDeps = packages.filter(p => p.type === 'dev');\n\n const formatPackages = (pkgs: PackageInfo[]) => pkgs.map(p => `${p.name}@${p.latestWithPrefix}`).join(' ');\n\n let depsCmd: string | null = null;\n let devDepsCmd: string | null = null;\n\n if (deps.length > 0) {\n const pkgList = formatPackages(deps);\n switch (pm) {\n case 'pnpm': depsCmd = `pnpm add ${pkgList}`; break;\n case 'yarn': depsCmd = `yarn add ${pkgList}`; break;\n case 'bun': depsCmd = `bun add ${pkgList}`; break;\n default: depsCmd = `npm install ${pkgList}`;\n }\n }\n\n if (devDeps.length > 0) {\n const pkgList = formatPackages(devDeps);\n switch (pm) {\n case 'pnpm': devDepsCmd = `pnpm add -D ${pkgList}`; break;\n case 'yarn': devDepsCmd = `yarn add -D ${pkgList}`; break;\n case 'bun': devDepsCmd = `bun add -D ${pkgList}`; break;\n default: devDepsCmd = `npm install -D ${pkgList}`;\n }\n }\n\n return { deps: depsCmd, devDeps: devDepsCmd };\n }\n\n executeUpgrade(command: string): void {\n execSync(command, { stdio: 'inherit', env: { ...process.env, FORCE_COLOR: '1' } });\n }\n}\n","/**\n * PHP/Composer Dependencies Service\n */\nimport { execSync } from 'child_process';\nimport { promises as fs } from 'fs';\nimport path from 'path';\nimport type {\n DepsServiceInterface,\n PackageInfo,\n CheckResult,\n UpgradeOptions,\n UpgradeType\n} from '../types/deps.types.js';\n\ninterface ComposerOutdatedPackage {\n name: string;\n version: string;\n latest: string;\n 'latest-status': string;\n description?: string;\n}\n\ninterface ComposerOutdatedResult {\n installed: ComposerOutdatedPackage[];\n}\n\ninterface ComposerJson {\n name?: string;\n require?: Record<string, string>;\n 'require-dev'?: Record<string, string>;\n}\n\nconst LARAVEL_PROTECTED_PACKAGES = /^laravel\\//;\n\nexport class DepsPhpService implements DepsServiceInterface {\n readonly ecosystem = 'php' as const;\n private isLaravel = false;\n\n async check(cwd: string, onProgress?: (completed: number, total: number) => void): Promise<CheckResult> {\n this.isLaravel = await this.detectLaravel(cwd);\n const outdated = await this.fetchOutdatedPackages(cwd);\n const composerJson = await this.readComposerJson(cwd);\n\n const packages: PackageInfo[] = [];\n let processed = 0;\n\n for (const pkg of outdated) {\n const isDev = pkg.name in (composerJson['require-dev'] || {});\n const upgradeType = this.getUpgradeType(pkg.version, pkg.latest);\n const canUpgrade = this.canUpgradePackage(pkg.name, upgradeType);\n const blockedReason = !canUpgrade ? 'Laravel major version blocked' : undefined;\n\n packages.push({\n name: pkg.name,\n current: pkg.version,\n latest: pkg.latest,\n latestWithPrefix: pkg.latest,\n type: isDev ? 'dev' : 'dep',\n upgradeType,\n canUpgrade,\n blockedReason\n });\n\n processed++;\n onProgress?.(processed, outdated.length);\n }\n\n return {\n ecosystem: this.ecosystem,\n manager: 'composer',\n packages: packages.filter(p => p.canUpgrade),\n isLaravel: this.isLaravel\n };\n }\n\n async upgrade(cwd: string, options: UpgradeOptions): Promise<void> {\n const commands = this.getUpgradeCommands(options.packages);\n if (commands.deps) this.executeUpgrade(commands.deps, cwd);\n if (commands.devDeps) this.executeUpgrade(commands.devDeps, cwd);\n }\n\n getUpgradeCommands(packages: PackageInfo[]): { deps: string | null; devDeps: string | null } {\n const deps = packages.filter(p => p.type === 'dep');\n const devDeps = packages.filter(p => p.type === 'dev');\n\n let depsCmd: string | null = null;\n let devDepsCmd: string | null = null;\n\n if (deps.length > 0) {\n const pkgList = deps.map(p => `${p.name}:${p.latest}`).join(' ');\n depsCmd = `composer require -W ${pkgList}`;\n }\n\n if (devDeps.length > 0) {\n const pkgList = devDeps.map(p => `${p.name}:${p.latest}`).join(' ');\n devDepsCmd = `composer require --dev -W ${pkgList}`;\n }\n\n return { deps: depsCmd, devDeps: devDepsCmd };\n }\n\n private async readComposerJson(cwd: string): Promise<ComposerJson> {\n const composerPath = path.join(cwd, 'composer.json');\n try {\n const content = await fs.readFile(composerPath, 'utf-8');\n return JSON.parse(content) as ComposerJson;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n throw new Error('Khรดng tรฌm thแบฅy composer.json trong thฦฐ mแปฅc hiแป‡n tแบกi');\n }\n throw new Error(`Lแป—i ฤ‘แปc composer.json: ${(error as Error).message}`);\n }\n }\n\n private async detectLaravel(cwd: string): Promise<boolean> {\n try {\n const composerJson = await this.readComposerJson(cwd);\n const deps = { ...composerJson.require, ...composerJson['require-dev'] };\n return 'laravel/framework' in deps;\n } catch {\n return false;\n }\n }\n\n private async fetchOutdatedPackages(cwd: string): Promise<ComposerOutdatedPackage[]> {\n try {\n const output = execSync('composer outdated --format=json --direct', {\n cwd,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe']\n });\n const result = JSON.parse(output) as ComposerOutdatedResult;\n return result.installed || [];\n } catch (error) {\n if ((error as any).stdout) {\n try {\n const result = JSON.parse((error as any).stdout) as ComposerOutdatedResult;\n return result.installed || [];\n } catch {}\n }\n throw new Error(`Lแป—i kiแปƒm tra composer packages: ${(error as Error).message}`);\n }\n }\n\n private getUpgradeType(current: string, latest: string): UpgradeType {\n const currentParts = current.split('.').map(Number);\n const latestParts = latest.split('.').map(Number);\n if ((latestParts[0] || 0) > (currentParts[0] || 0)) return 'major';\n if ((latestParts[1] || 0) > (currentParts[1] || 0)) return 'minor';\n return 'patch';\n }\n\n private canUpgradePackage(packageName: string, upgradeType: UpgradeType): boolean {\n if (this.isLaravel && LARAVEL_PROTECTED_PACKAGES.test(packageName) && upgradeType === 'major') {\n return false;\n }\n return true;\n }\n\n private executeUpgrade(command: string, cwd: string): void {\n execSync(command, {\n cwd,\n stdio: 'inherit',\n env: { ...process.env, FORCE_COLOR: '1' }\n });\n }\n}\n","/**\n * Python Dependencies Service\n */\nimport { execSync } from 'child_process';\nimport { promises as fs } from 'fs';\nimport path from 'path';\nimport pLimit from 'p-limit';\nimport type {\n DepsServiceInterface,\n PackageInfo,\n CheckResult,\n UpgradeOptions,\n UpgradeType,\n PackageManager\n} from '../types/deps.types.js';\n\ninterface PyPIPackageInfo {\n info: { version: string; };\n}\n\nexport class DepsPythonService implements DepsServiceInterface {\n readonly ecosystem = 'python' as const;\n private versionCache: Map<string, string> = new Map();\n\n async check(cwd: string, onProgress?: (completed: number, total: number) => void): Promise<CheckResult> {\n const manager = await this.detectPackageManager(cwd);\n let packages: PackageInfo[];\n\n if (manager === 'pipenv') {\n packages = await this.checkPipenv(cwd, onProgress);\n } else {\n packages = await this.checkPip(cwd, onProgress);\n }\n\n return { ecosystem: this.ecosystem, manager, packages };\n }\n\n async upgrade(cwd: string, options: UpgradeOptions): Promise<void> {\n const manager = await this.detectPackageManager(cwd);\n const commands = this.getUpgradeCommands(options.packages);\n\n if (manager === 'pipenv') {\n if (commands.deps || commands.devDeps) {\n const allPackages = options.packages.map(p => p.name).join(' ');\n this.executeUpgrade(`pipenv update ${allPackages}`, cwd);\n }\n } else {\n if (commands.deps) this.executeUpgrade(commands.deps, cwd);\n if (commands.devDeps) this.executeUpgrade(commands.devDeps, cwd);\n }\n }\n\n getUpgradeCommands(packages: PackageInfo[]): { deps: string | null; devDeps: string | null } {\n const deps = packages.filter(p => p.type === 'dep');\n const devDeps = packages.filter(p => p.type === 'dev');\n\n let depsCmd: string | null = null;\n let devDepsCmd: string | null = null;\n\n if (deps.length > 0) {\n const pkgList = deps.map(p => `${p.name}==${p.latest}`).join(' ');\n depsCmd = `pip install --upgrade ${pkgList}`;\n }\n\n if (devDeps.length > 0) {\n const pkgList = devDeps.map(p => `${p.name}==${p.latest}`).join(' ');\n devDepsCmd = `pip install --upgrade ${pkgList}`;\n }\n\n return { deps: depsCmd, devDeps: devDepsCmd };\n }\n\n private async detectPackageManager(cwd: string): Promise<PackageManager> {\n if (await this.fileExists(cwd, 'Pipfile')) return 'pipenv';\n return 'pip';\n }\n\n private async checkPip(cwd: string, onProgress?: (completed: number, total: number) => void): Promise<PackageInfo[]> {\n const requirementsPath = path.join(cwd, 'requirements.txt');\n try {\n const content = await fs.readFile(requirementsPath, 'utf-8');\n const packages = this.parseRequirementsTxt(content);\n return await this.fetchBulkVersions(packages, onProgress);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n throw new Error('Khรดng tรฌm thแบฅy requirements.txt trong thฦฐ mแปฅc hiแป‡n tแบกi');\n }\n throw new Error(`Lแป—i ฤ‘แปc requirements.txt: ${(error as Error).message}`);\n }\n }\n\n private async checkPipenv(cwd: string, onProgress?: (completed: number, total: number) => void): Promise<PackageInfo[]> {\n try {\n const output = execSync('pipenv run pip list --outdated --format=json', {\n cwd, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe']\n });\n\n const outdated = JSON.parse(output) as Array<{ name: string; version: string; latest_version: string; }>;\n const total = outdated.length;\n let completed = 0;\n\n const packages: PackageInfo[] = outdated.map(pkg => {\n completed++;\n onProgress?.(completed, total);\n return {\n name: pkg.name,\n current: pkg.version,\n latest: pkg.latest_version,\n latestWithPrefix: pkg.latest_version,\n type: 'dep',\n upgradeType: this.getUpgradeType(pkg.version, pkg.latest_version),\n canUpgrade: true\n };\n });\n\n return packages;\n } catch (error) {\n throw new Error(`Lแป—i kiแปƒm tra pipenv packages: ${(error as Error).message}`);\n }\n }\n\n private parseRequirementsTxt(content: string): Array<{ name: string; current: string; type: 'dep' | 'dev' }> {\n const packages: Array<{ name: string; current: string; type: 'dep' | 'dev' }> = [];\n const lines = content.split('\\n');\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n\n const match = trimmed.match(/^([a-zA-Z0-9_-]+)\\s*([=><]=?)\\s*([0-9.]+)/);\n if (match) {\n const [, name, , version] = match;\n packages.push({ name: name.toLowerCase(), current: version, type: 'dep' });\n }\n }\n\n return packages;\n }\n\n private async fetchBulkVersions(\n packages: Array<{ name: string; current: string; type: 'dep' | 'dev' }>,\n onProgress?: (completed: number, total: number) => void\n ): Promise<PackageInfo[]> {\n const limit = pLimit(10);\n const total = packages.length;\n let completed = 0;\n\n const results = await Promise.all(\n packages.map(pkg => limit(async () => {\n const latest = await this.fetchLatestVersion(pkg.name);\n completed++;\n onProgress?.(completed, total);\n\n if (!latest) return null;\n const canUpgrade = this.isNewerVersion(latest, pkg.current);\n if (!canUpgrade) return null;\n\n return {\n name: pkg.name,\n current: pkg.current,\n latest,\n latestWithPrefix: latest,\n type: pkg.type,\n upgradeType: this.getUpgradeType(pkg.current, latest),\n canUpgrade: true\n } satisfies PackageInfo;\n }))\n );\n\n return results.filter((r): r is PackageInfo => r !== null);\n }\n\n private async fetchLatestVersion(packageName: string): Promise<string | null> {\n if (this.versionCache.has(packageName)) return this.versionCache.get(packageName)!;\n\n try {\n const response = await fetch(\n `https://pypi.org/pypi/${encodeURIComponent(packageName)}/json`,\n { signal: AbortSignal.timeout(10000) }\n );\n\n if (!response.ok) return null;\n const data = await response.json() as PyPIPackageInfo;\n this.versionCache.set(packageName, data.info.version);\n return data.info.version;\n } catch {\n return null;\n }\n }\n\n private getUpgradeType(current: string, latest: string): UpgradeType {\n const currentParts = current.split('.').map(Number);\n const latestParts = latest.split('.').map(Number);\n if ((latestParts[0] || 0) > (currentParts[0] || 0)) return 'major';\n if ((latestParts[1] || 0) > (currentParts[1] || 0)) return 'minor';\n return 'patch';\n }\n\n private isNewerVersion(remote: string, local: string): boolean {\n const remoteParts = remote.split('.').map(Number);\n const localParts = local.split('.').map(Number);\n\n for (let i = 0; i < 3; i++) {\n const r = remoteParts[i] || 0;\n const l = localParts[i] || 0;\n if (r > l) return true;\n if (r < l) return false;\n }\n\n return false;\n }\n\n private async fileExists(cwd: string, filename: string): Promise<boolean> {\n try {\n await fs.access(path.join(cwd, filename));\n return true;\n } catch {\n return false;\n }\n }\n\n private executeUpgrade(command: string, cwd: string): void {\n execSync(command, { cwd, stdio: 'inherit', env: { ...process.env, FORCE_COLOR: '1' } });\n }\n}\n","/**\n * Deps Upgrade Command\n * Upgrade packages trong cรกc ecosystem khรกc nhau\n */\nimport { Command } from 'commander';\nimport { checkbox, confirm } from '@inquirer/prompts';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport Table from 'cli-table3';\nimport { DepsDetectorService } from '../../services/deps-detector.service.js';\nimport { DepsService } from '../../services/deps.service.js';\nimport { DepsPhpService } from '../../services/deps-php.service.js';\nimport { DepsPythonService } from '../../services/deps-python.service.js';\nimport { checkboxTheme } from '../../utils/prompt-theme.js';\nimport type { \n DepsServiceInterface, \n DetectedProject,\n PackageInfo \n} from '../../types/deps.types.js';\n\ninterface UpgradeOptions {\n all?: boolean;\n}\n\nexport function createDepsUpgradeCommand(): Command {\n return new Command('upgrade')\n .description('Upgrade packages lรชn version mแป›i nhแบฅt')\n .option('--all', 'Upgrade tแบฅt cแบฃ khรดng cแบงn chแปn')\n .action(async (options: UpgradeOptions) => {\n await handleDepsUpgrade(options);\n });\n}\n\nasync function handleDepsUpgrade(options: UpgradeOptions): Promise<void> {\n const cwd = process.cwd();\n const detector = new DepsDetectorService();\n\n try {\n const spinner = ora('ฤang phรกt hiแป‡n loแบกi project...').start();\n const projects = await detector.detectProjects(cwd);\n\n if (projects.length === 0) {\n spinner.fail('Khรดng tรฌm thแบฅy project nร o ฤ‘ฦฐแปฃc hแป— trแปฃ');\n console.log();\n console.log(chalk.dim('Hแป— trแปฃ: Node.js (package.json), PHP (composer.json), Python (requirements.txt/Pipfile)'));\n process.exit(1);\n }\n\n spinner.succeed(`Phรกt hiแป‡n ${projects.length} project:`);\n for (const project of projects) {\n const icon = getEcosystemIcon(project.ecosystem);\n const label = getEcosystemLabel(project.ecosystem);\n console.log(` ${icon} ${label} (${project.manager})`);\n }\n console.log();\n\n // Always upgrade all detected ecosystems\n for (const project of projects) {\n await upgradeEcosystem(project, cwd, options);\n }\n\n console.log();\n console.log(chalk.green('โœ… Hoร n thร nh!'));\n } catch (error) {\n console.error(chalk.red(`\\nโŒ ${(error as Error).message}\\n`));\n process.exit(1);\n }\n}\n\nasync function upgradeEcosystem(\n project: DetectedProject,\n cwd: string,\n options: UpgradeOptions\n): Promise<void> {\n const service = getService(project.ecosystem);\n const label = `${getEcosystemIcon(project.ecosystem)} ${getEcosystemLabel(project.ecosystem)}`;\n\n console.log(chalk.bold.cyan(`\\n${'โ”'.repeat(80)}`));\n console.log(chalk.bold.cyan(`${label}`));\n console.log(chalk.bold.cyan('โ”'.repeat(80)));\n console.log();\n\n const spinner = ora('ฤang kiแปƒm tra packages...').start();\n\n let packages: PackageInfo[];\n try {\n const result = await service.check(cwd, (completed, total) => {\n spinner.text = `ฤang kiแปƒm tra packages... (${completed}/${total})`;\n });\n packages = result.packages;\n } catch (error) {\n spinner.fail('Lแป—i kiแปƒm tra packages');\n console.log(chalk.red((error as Error).message));\n return;\n }\n\n if (packages.length === 0) {\n spinner.succeed('Tแบฅt cแบฃ packages ฤ‘รฃ cแบญp nhแบญt');\n return;\n }\n\n spinner.succeed(`Tรฌm thแบฅy ${packages.length} packages cรณ thแปƒ nรขng cแบฅp`);\n console.log();\n\n displayUpgradeTable(packages);\n\n let selectedPackages: PackageInfo[];\n\n if (options.all) {\n selectedPackages = packages;\n console.log(chalk.cyan(`๐Ÿ“‹ ฤรฃ chแปn tแบฅt cแบฃ ${selectedPackages.length} packages\\n`));\n } else {\n try {\n const selected = await checkbox({\n message: 'Chแปn packages ฤ‘แปƒ upgrade (โ†‘โ†“ di chuyแปƒn โ€ข space chแปn โ€ข a tแบฅt cแบฃ โ€ข i ฤ‘แบฃo โ€ข โŽ xรกc nhแบญn):',\n choices: packages.map(pkg => {\n const icon = pkg.upgradeType === 'major' ? '๐Ÿ”ด' : \n pkg.upgradeType === 'minor' ? '๐ŸŸก' : '๐ŸŸข';\n return {\n name: `${icon} ${pkg.name} (${pkg.current} โ†’ ${pkg.latest}) [${pkg.type}]`,\n value: pkg.name,\n checked: true\n };\n }),\n pageSize: 15,\n theme: checkboxTheme,\n });\n\n if (selected.length === 0) {\n console.log(chalk.yellow('โธ๏ธ Khรดng cรณ packages nร o ฤ‘ฦฐแปฃc chแปn\\n'));\n return;\n }\n\n selectedPackages = packages.filter(p => selected.includes(p.name));\n } catch {\n console.log(chalk.yellow('\\nโธ๏ธ ฤรฃ hแปงy\\n'));\n return;\n }\n }\n\n let shouldProceed: boolean;\n try {\n shouldProceed = await confirm({\n message: `Tiแบฟn hร nh upgrade ${selectedPackages.length} packages? (ESC ฤ‘แปƒ hแปงy)`,\n default: true\n });\n } catch {\n console.log(chalk.yellow('\\nโธ๏ธ ฤรฃ hแปงy\\n'));\n return;\n }\n\n if (!shouldProceed) {\n console.log(chalk.yellow('โธ๏ธ Upgrade ฤ‘รฃ hแปงy\\n'));\n return;\n }\n\n console.log();\n console.log(chalk.cyan(`๐Ÿ”ง Package manager: ${project.manager}`));\n console.log(chalk.cyan('๐Ÿ“ฅ ฤang upgrade...\\n'));\n\n const commands = service.getUpgradeCommands(selectedPackages);\n \n try {\n if (commands.deps) {\n console.log(chalk.dim(`$ ${commands.deps}\\n`));\n }\n if (commands.devDeps) {\n console.log(chalk.dim(`$ ${commands.devDeps}\\n`));\n }\n\n await service.upgrade(cwd, { packages: selectedPackages });\n\n console.log(chalk.green(`\\nโœ… ฤรฃ upgrade ${selectedPackages.length} packages thร nh cรดng!`));\n } catch (error) {\n console.error(chalk.red('\\nโŒ Lแป—i khi upgrade:'));\n console.error(chalk.red((error as Error).message));\n\n console.log(chalk.yellow('\\n๐Ÿ’ก Bแบกn cรณ thแปƒ thแปญ upgrade thแปง cรดng:'));\n if (commands.deps) console.log(chalk.cyan(` ${commands.deps}`));\n if (commands.devDeps) console.log(chalk.cyan(` ${commands.devDeps}`));\n console.log();\n\n throw error;\n }\n}\n\nfunction displayUpgradeTable(packages: PackageInfo[]): void {\n const table = new Table({\n head: [\n chalk.cyan('Package'),\n chalk.cyan('Hiแป‡n tแบกi'),\n chalk.cyan('Mแป›i nhแบฅt'),\n chalk.cyan('Loแบกi')\n ],\n style: {\n head: [],\n border: ['dim']\n }\n });\n\n for (const pkg of packages) {\n const upgradeIcon = pkg.upgradeType === 'major' ? '๐Ÿ”ด' : \n pkg.upgradeType === 'minor' ? '๐ŸŸก' : '๐ŸŸข';\n \n table.push([\n `${upgradeIcon} ${pkg.name}`,\n chalk.dim(pkg.current),\n chalk.green(pkg.latest),\n pkg.type === 'dev' ? chalk.dim('dev') : 'dep'\n ]);\n }\n\n console.log(table.toString());\n console.log();\n}\n\nfunction getService(ecosystem: 'node' | 'php' | 'python'): DepsServiceInterface {\n switch (ecosystem) {\n case 'node':\n return new DepsService();\n case 'php':\n return new DepsPhpService();\n case 'python':\n return new DepsPythonService();\n }\n}\n\nfunction getEcosystemIcon(ecosystem: string): string {\n switch (ecosystem) {\n case 'node': return '๐Ÿ“ฆ';\n case 'php': return '๐Ÿ˜';\n case 'python': return '๐Ÿ';\n default: return '๐Ÿ“ฆ';\n }\n}\n\nfunction getEcosystemLabel(ecosystem: string): string {\n switch (ecosystem) {\n case 'node': return 'Node.js';\n case 'php': return 'PHP/Composer';\n case 'python': return 'Python';\n default: return ecosystem;\n }\n}\n","/**\n * Tasks Command Group\n * jai1 tasks (alias: jai1 t)\n */\nimport { Command } from 'commander';\nimport { createTaskAddCommand } from './add.js';\nimport { createTaskListCommand } from './list.js';\nimport { createTaskReadyCommand } from './ready.js';\nimport { createTaskUpdateCommand } from './update.js';\nimport { createTaskShowCommand } from './show.js';\nimport { createTaskPickCommand } from './pick.js';\nimport { createTaskDoneCommand } from './done.js';\nimport { createTaskDepCommand } from './dep.js';\nimport { createTaskSyncCommand } from './sync.js';\nimport { createTaskSummaryCommand } from './summary.js';\nimport { createTaskGuideCommand } from './guide.js';\n\nexport function createTasksCommand(): Command {\n const cmd = new Command('tasks')\n .alias('t')\n .description('Task management โ€” track, assign, and manage development tasks');\n\n cmd.addCommand(createTaskListCommand());\n cmd.addCommand(createTaskReadyCommand());\n cmd.addCommand(createTaskAddCommand());\n cmd.addCommand(createTaskUpdateCommand());\n cmd.addCommand(createTaskShowCommand());\n cmd.addCommand(createTaskPickCommand());\n cmd.addCommand(createTaskDoneCommand());\n cmd.addCommand(createTaskDepCommand());\n cmd.addCommand(createTaskSyncCommand());\n cmd.addCommand(createTaskSummaryCommand());\n cmd.addCommand(createTaskGuideCommand());\n\n // Default action: show summary\n cmd.action(async () => {\n const { handleTaskSummary } = await import('./summary.js');\n await handleTaskSummary({ json: false });\n });\n\n return cmd;\n}\n","/**\n * jai1 tasks add <title> [-p priority] [-P parent] [-t tags] [-j]\n */\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { TaskService } from '../../services/task.service.js';\nimport { PRIORITY_ICONS, PRIORITY_LABELS } from '../../types/task.types.js';\nimport type { TaskAddOptions } from '../../types/task.types.js';\n\nexport function createTaskAddCommand(): Command {\n return new Command('add')\n .description('Add a new task')\n .argument('<title>', 'Task title')\n .option('-p, --priority <n>', 'Priority: 0=critical, 1=high, 2=medium, 3=low', '2')\n .option('-P, --parent <parent>', 'Parent: feature/xxx, plan/xxx, bug/xxx')\n .option('-t, --tags <tags>', 'Comma-separated tags')\n .option('-j, --json', 'Output JSON')\n .action(async (title: string, options: TaskAddOptions) => {\n const service = new TaskService();\n const priority = Number(options.priority ?? 2);\n\n if (priority < 0 || priority > 3) {\n console.error(chalk.red('โŒ Priority must be 0-3'));\n process.exit(1);\n }\n\n const tags = options.tags\n ? options.tags.split(',').map((t: string) => t.trim())\n : [];\n\n const task = await service.add({\n title,\n parent: options.parent || '',\n priority,\n tags,\n });\n\n if (options.json) {\n console.log(JSON.stringify(task, null, 2));\n return;\n }\n\n const icon = PRIORITY_ICONS[task.priority] || '๐ŸŸก';\n const label = PRIORITY_LABELS[task.priority] || 'Medium';\n\n console.log(chalk.green(`โœ… Task added: ${chalk.bold(task.id)}`));\n console.log(` ${chalk.dim('Title:')} ${task.title}`);\n console.log(` ${chalk.dim('Priority:')} ${icon} ${label}`);\n if (task.parent) {\n console.log(` ${chalk.dim('Parent:')} ${task.parent}`);\n }\n if (task.tags.length > 0) {\n console.log(` ${chalk.dim('Tags:')} ${task.tags.join(', ')}`);\n }\n });\n}\n","/**\n * jai1 tasks list [-s status] [-P parent] [-j]\n */\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { TaskService } from '../../services/task.service.js';\nimport {\n STATUS_ICONS,\n BLOCKED_ICON,\n PRIORITY_ICONS,\n type Task,\n type TaskListOptions,\n type TaskStatusType,\n} from '../../types/task.types.js';\n\nexport function createTaskListCommand(): Command {\n return new Command('list')\n .alias('ls')\n .description('List tasks')\n .option('-s, --status <status>', 'Filter by status: todo, in_progress, done, cancelled')\n .option('-P, --parent <parent>', 'Filter by parent: feature/xxx, plan/xxx')\n .option('-j, --json', 'Output JSON')\n .action(async (options: TaskListOptions) => {\n await handleTaskList(options);\n });\n}\n\nasync function handleTaskList(options: TaskListOptions): Promise<void> {\n const service = new TaskService();\n const allTasks = await service.readAll();\n\n let tasks = allTasks;\n\n if (options.status) {\n tasks = tasks.filter((t) => t.status === options.status);\n }\n if (options.parent) {\n tasks = tasks.filter((t) => t.parent === options.parent);\n }\n\n if (options.json) {\n console.log(JSON.stringify(tasks, null, 2));\n return;\n }\n\n if (tasks.length === 0) {\n console.log(chalk.dim('No tasks found.'));\n return;\n }\n\n // Compute blocked status\n const doneIds = new Set(allTasks.filter((t) => t.status === 'done').map((t) => t.id));\n\n const header = options.parent\n ? `๐Ÿ“‹ ${options.parent} (${tasks.length} tasks)`\n : `๐Ÿ“‹ All tasks (${tasks.length})`;\n console.log(chalk.bold(header));\n console.log();\n\n for (const task of tasks) {\n printTaskLine(task, doneIds);\n }\n}\n\nfunction printTaskLine(task: Task, doneIds: Set<string>): void {\n const isBlocked =\n task.status === 'todo' &&\n task.depends_on.length > 0 &&\n !task.depends_on.every((id) => doneIds.has(id));\n\n const statusIcon = isBlocked ? BLOCKED_ICON : STATUS_ICONS[task.status as TaskStatusType] || '๐Ÿ“‹';\n const priorityIcon = PRIORITY_ICONS[task.priority] || '๐ŸŸก';\n\n let line = ` ${statusIcon} ${chalk.dim(task.id)} P${task.priority}${priorityIcon} ${task.title}`;\n\n if (task.status === 'in_progress' && task.assigned_to) {\n line += chalk.cyan(` @${task.assigned_to}`);\n }\n\n if (isBlocked) {\n const blockedBy = task.depends_on.filter((id) => !doneIds.has(id));\n line += chalk.red(` (blocked: ${blockedBy.join(', ')})`);\n }\n\n if (task.parent) {\n line += chalk.dim(` [${task.parent}]`);\n }\n\n console.log(line);\n}\n","/**\n * jai1 tasks ready [-P parent] [-j]\n */\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { TaskService } from '../../services/task.service.js';\nimport { PRIORITY_ICONS, type TaskReadyOptions } from '../../types/task.types.js';\n\nexport function createTaskReadyCommand(): Command {\n return new Command('ready')\n .description('Show tasks ready to pick (not blocked, not assigned)')\n .option('-P, --parent <parent>', 'Filter by parent')\n .option('-j, --json', 'Output JSON')\n .action(async (options: TaskReadyOptions) => {\n const service = new TaskService();\n const tasks = await service.getReady(options.parent);\n\n if (options.json) {\n console.log(JSON.stringify(tasks, null, 2));\n return;\n }\n\n if (tasks.length === 0) {\n console.log(chalk.dim('No tasks ready to pick.'));\n console.log(chalk.dim('๐Ÿ’ก Check blocked tasks: jai1 t list -s todo'));\n return;\n }\n\n console.log(chalk.bold(`๐Ÿ“‹ Ready to pick (${tasks.length} tasks):`));\n console.log();\n\n for (const task of tasks) {\n const icon = PRIORITY_ICONS[task.priority] || '๐ŸŸก';\n let line = ` P${task.priority}${icon} ${chalk.dim(task.id)} ${task.title}`;\n if (task.parent) {\n line += chalk.dim(` [${task.parent}]`);\n }\n console.log(line);\n }\n\n console.log();\n console.log(chalk.dim('๐Ÿ’ก Run: jai1 t pick'));\n });\n}\n","/**\n * jai1 tasks update <id> -s <status> [-j]\n */\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { TaskService } from '../../services/task.service.js';\nimport { STATUS_ICONS, type TaskUpdateOptions, type TaskStatusType } from '../../types/task.types.js';\n\nconst VALID_STATUSES = ['todo', 'in_progress', 'done', 'cancelled'];\n\nexport function createTaskUpdateCommand(): Command {\n return new Command('update')\n .description('Update task status')\n .argument('<id>', 'Task ID (e.g. T-001)')\n .requiredOption('-s, --status <status>', 'New status: todo, in_progress, done, cancelled')\n .option('-j, --json', 'Output JSON')\n .action(async (id: string, options: TaskUpdateOptions) => {\n if (!VALID_STATUSES.includes(options.status)) {\n console.error(chalk.red(`โŒ Invalid status. Must be: ${VALID_STATUSES.join(', ')}`));\n process.exit(1);\n }\n\n const service = new TaskService();\n\n try {\n const task = await service.update(id, { status: options.status });\n\n if (options.json) {\n console.log(JSON.stringify(task, null, 2));\n return;\n }\n\n const icon = STATUS_ICONS[task.status as TaskStatusType] || '๐Ÿ“‹';\n console.log(chalk.green(`โœ… ${task.id} โ†’ ${icon} ${task.status}`));\n } catch (error) {\n console.error(chalk.red(`โŒ ${error instanceof Error ? error.message : String(error)}`));\n process.exit(1);\n }\n });\n}\n","/**\n * jai1 tasks show <id|parent> [-j]\n */\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { TaskService } from '../../services/task.service.js';\nimport {\n STATUS_ICONS,\n BLOCKED_ICON,\n PRIORITY_ICONS,\n PRIORITY_LABELS,\n type TaskShowOptions,\n type TaskStatusType,\n} from '../../types/task.types.js';\n\nexport function createTaskShowCommand(): Command {\n return new Command('show')\n .description('Show task detail or all tasks under a parent')\n .argument('<query>', 'Task ID (T-001) or parent (feature/xxx)')\n .option('-j, --json', 'Output JSON')\n .action(async (query: string, options: TaskShowOptions) => {\n const service = new TaskService();\n\n if (query.startsWith('T-')) {\n // Show single task\n const task = await service.findById(query);\n if (!task) {\n console.error(chalk.red(`โŒ Task ${query} not found`));\n process.exit(1);\n }\n\n if (options.json) {\n console.log(JSON.stringify(task, null, 2));\n return;\n }\n\n const { blocked, blockedBy } = await service.isBlocked(task);\n const statusIcon = blocked\n ? BLOCKED_ICON\n : STATUS_ICONS[task.status as TaskStatusType] || '๐Ÿ“‹';\n const priIcon = PRIORITY_ICONS[task.priority] || '๐ŸŸก';\n const priLabel = PRIORITY_LABELS[task.priority] || 'Medium';\n\n console.log(chalk.bold(`\\n๐Ÿ“Œ ${task.id}: ${task.title}\\n`));\n console.log(` ${chalk.dim('Status:')} ${statusIcon} ${task.status}${blocked ? chalk.red(' (BLOCKED)') : ''}`);\n console.log(` ${chalk.dim('Priority:')} ${priIcon} P${task.priority} ${priLabel}`);\n if (task.parent) {\n console.log(` ${chalk.dim('Parent:')} ${task.parent}`);\n }\n if (task.assigned_to) {\n console.log(` ${chalk.dim('Assigned:')} @${task.assigned_to} (${task.claimed_at})`);\n }\n if (task.depends_on.length > 0) {\n console.log(` ${chalk.dim('Depends on:')} ${task.depends_on.join(', ')}`);\n if (blocked) {\n console.log(` ${chalk.dim('Blocked by:')} ${chalk.red(blockedBy.join(', '))}`);\n }\n }\n if (task.tags.length > 0) {\n console.log(` ${chalk.dim('Tags:')} ${task.tags.join(', ')}`);\n }\n if (task.branch) {\n console.log(` ${chalk.dim('Branch:')} ${task.branch}`);\n }\n if (task.notes) {\n console.log(` ${chalk.dim('Notes:')} ${task.notes}`);\n }\n console.log(` ${chalk.dim('Created:')} ${task.created}`);\n console.log(` ${chalk.dim('Updated:')} ${task.updated}`);\n console.log();\n } else {\n // Show all tasks under parent\n const tasks = await service.filter({ parent: query });\n\n if (options.json) {\n console.log(JSON.stringify(tasks, null, 2));\n return;\n }\n\n if (tasks.length === 0) {\n console.log(chalk.dim(`No tasks for parent: ${query}`));\n return;\n }\n\n console.log(chalk.bold(`\\n๐Ÿ“‹ ${query} (${tasks.length} tasks)\\n`));\n\n const allTasks = await service.readAll();\n const doneIds = new Set(allTasks.filter((t) => t.status === 'done').map((t) => t.id));\n\n for (const task of tasks) {\n const isBlocked =\n task.status === 'todo' &&\n task.depends_on.length > 0 &&\n !task.depends_on.every((id) => doneIds.has(id));\n\n const icon = isBlocked ? BLOCKED_ICON : STATUS_ICONS[task.status as TaskStatusType] || '๐Ÿ“‹';\n let line = ` ${icon} ${chalk.dim(task.id)} P${task.priority} ${task.title}`;\n if (task.assigned_to) line += chalk.cyan(` @${task.assigned_to}`);\n if (isBlocked) {\n const bb = task.depends_on.filter((id) => !doneIds.has(id));\n line += chalk.red(` (blocked: ${bb.join(', ')})`);\n }\n console.log(line);\n }\n console.log();\n }\n });\n}\n","/**\n * jai1 tasks pick [-j]\n */\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { confirm } from '@inquirer/prompts';\nimport { TaskService } from '../../services/task.service.js';\nimport { PRIORITY_ICONS, type TaskPickOptions } from '../../types/task.types.js';\n\nexport function createTaskPickCommand(): Command {\n return new Command('pick')\n .description('Claim the next available task')\n .option('-j, --json', 'Output JSON')\n .action(async (options: TaskPickOptions) => {\n const service = new TaskService();\n const ready = await service.getReady();\n\n if (ready.length === 0) {\n if (options.json) {\n console.log(JSON.stringify({ picked: null, message: 'No tasks ready' }));\n return;\n }\n console.log(chalk.dim('No tasks ready to pick.'));\n console.log(chalk.dim('๐Ÿ’ก Add tasks first: jai1 t add \"...\"'));\n return;\n }\n\n const top = ready[0]!;\n const icon = PRIORITY_ICONS[top.priority] || '๐ŸŸก';\n\n if (options.json) {\n // Non-interactive: auto-pick first\n const picked = await service.pick(top.id);\n console.log(JSON.stringify(picked, null, 2));\n return;\n }\n\n console.log(chalk.bold('\\n๐Ÿ“Œ Next available task:'));\n console.log(` ${chalk.bold(top.id)} P${top.priority}${icon} ${top.title}`);\n if (top.parent) {\n console.log(` ${chalk.dim('Parent:')} ${top.parent}`);\n }\n\n if (ready.length > 1) {\n console.log(chalk.dim(`\\n +${ready.length - 1} more tasks ready`));\n }\n\n const proceed = await confirm({\n message: 'Claim this task?',\n default: true,\n });\n\n if (!proceed) {\n console.log(chalk.dim('\\nCancelled.'));\n return;\n }\n\n const picked = await service.pick(top.id);\n console.log(chalk.green(`\\nโœ… ${picked.id} assigned to @${picked.assigned_to}, status โ†’ in_progress`));\n });\n}\n","/**\n * jai1 tasks done <id> [-j]\n */\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { TaskService } from '../../services/task.service.js';\nimport type { TaskDoneOptions } from '../../types/task.types.js';\n\nexport function createTaskDoneCommand(): Command {\n return new Command('done')\n .description('Mark task as done')\n .argument('<id>', 'Task ID (e.g. T-001)')\n .option('-j, --json', 'Output JSON')\n .action(async (id: string, options: TaskDoneOptions) => {\n const service = new TaskService();\n\n try {\n const task = await service.markDone(id);\n\n if (options.json) {\n console.log(JSON.stringify(task, null, 2));\n return;\n }\n\n console.log(chalk.green(`โœ… ${task.id}: ${task.title} โ†’ done`));\n } catch (error) {\n console.error(chalk.red(`โŒ ${error instanceof Error ? error.message : String(error)}`));\n process.exit(1);\n }\n });\n}\n","/**\n * jai1 tasks dep <childId> <parentId> [-j]\n */\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { TaskService } from '../../services/task.service.js';\nimport type { TaskDepOptions } from '../../types/task.types.js';\n\nexport function createTaskDepCommand(): Command {\n return new Command('dep')\n .description('Add dependency: child depends on parent')\n .argument('<childId>', 'Child task ID (the one that waits)')\n .argument('<parentId>', 'Parent task ID (must be done first)')\n .option('-j, --json', 'Output JSON')\n .action(async (childId: string, parentId: string, options: TaskDepOptions) => {\n const service = new TaskService();\n\n try {\n const task = await service.addDependency(childId, parentId);\n\n if (options.json) {\n console.log(JSON.stringify(task, null, 2));\n return;\n }\n\n console.log(chalk.green(`โœ… ${childId} now depends on ${parentId}`));\n console.log(chalk.dim(` ${task.title} โ†’ waits for ${parentId}`));\n } catch (error) {\n console.error(chalk.red(`โŒ ${error instanceof Error ? error.message : String(error)}`));\n process.exit(1);\n }\n });\n}\n","/**\n * jai1 tasks sync [--pull] [--push]\n */\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { TaskService } from '../../services/task.service.js';\nimport type { TaskSyncOptions } from '../../types/task.types.js';\n\nexport function createTaskSyncCommand(): Command {\n return new Command('sync')\n .description('Sync tasks with git (commit & push only tasks file)')\n .option('--pull', 'Pull and merge tasks from origin/main')\n .option('--push', 'Commit and push tasks file')\n .action(async (options: TaskSyncOptions) => {\n const service = new TaskService();\n\n if (options.pull) {\n console.log(chalk.dim('โณ Pulling tasks from origin/main...'));\n try {\n const result = await service.syncPull();\n console.log(chalk.green(`โœ… Sync pull complete: ${result.merged} tasks merged`));\n } catch (error) {\n console.error(chalk.red(`โŒ ${error instanceof Error ? error.message : String(error)}`));\n process.exit(1);\n }\n return;\n }\n\n // Default or --push: commit and push\n console.log(chalk.dim('โณ Syncing tasks to git...'));\n try {\n await service.syncPush();\n console.log(chalk.green('โœ… Tasks synced to git'));\n } catch (error) {\n console.error(chalk.red(`โŒ ${error instanceof Error ? error.message : String(error)}`));\n process.exit(1);\n }\n });\n}\n","/**\n * jai1 tasks guide\n * Full usage guide - single source of truth for workflows and AI agents\n */\nimport { Command } from 'commander';\nimport chalk from 'chalk';\n\nconst GUIDE_TEXT = `\n${chalk.cyan.bold('๐Ÿ“– Jai1 Task Management Guide')}\n\n${chalk.bold('โ”โ”โ” STATUSES โ”โ”โ”')}\n ${chalk.dim('todo')} ๐Ÿ“‹ Chฦฐa bแบฏt ฤ‘แบงu\n ${chalk.dim('in_progress')} ๐Ÿ”ต ฤang lร m (bao gแป“m review)\n ${chalk.dim('done')} โœ… Hoร n thร nh\n ${chalk.dim('cancelled')} โšซ Huแปท\n ${chalk.dim('(blocked)')} ๐Ÿ”ด Computed: depends_on chฦฐa done\n\n${chalk.bold('โ”โ”โ” PRIORITY โ”โ”โ”')}\n ${chalk.dim('0')} = ๐Ÿ”ฅ Critical โ€” Prod down, security, block cแบฃ team\n ${chalk.dim('1')} = ๐Ÿ”ด High โ€” Feature chรญnh, deadline gแบงn\n ${chalk.dim('2')} = ๐ŸŸก Medium โ€” Bรฌnh thฦฐแปng (default)\n ${chalk.dim('3')} = ๐ŸŸข Low โ€” Nice-to-have, docs, refactor\n\n${chalk.bold('โ”โ”โ” QUICK START โ”โ”โ”')}\n ${chalk.cyan('jai1 t add')} \"Fix login bug\" -p 1 -P bug/login\n ${chalk.cyan('jai1 t ready')} Show tasks sแบตn sร ng\n ${chalk.cyan('jai1 t pick')} Claim & start working\n ${chalk.cyan('jai1 t done')} T-003 Mark complete\n\n${chalk.bold('โ”โ”โ” DAILY WORKFLOW โ”โ”โ”')}\n ${chalk.cyan('jai1 t sync --pull')} Pull latest tasks\n ${chalk.cyan('jai1 t summary')} Dashboard tแป•ng quan\n ${chalk.cyan('jai1 t ready')} Xem tasks sแบตn sร ng\n ${chalk.cyan('jai1 t pick')} Claim task mแป›i\n ${chalk.cyan('jai1 t done')} T-xxx Hoร n thร nh task\n ${chalk.cyan('jai1 t sync --push')} Push lรชn git\n\n${chalk.bold('โ”โ”โ” ADDING TASKS โ”โ”โ”')}\n ${chalk.yellow('โš  Luรดn kiแปƒm tra duplicate trฦฐแป›c khi add:')}\n ${chalk.cyan('jai1 t list -P')} feature/xxx\n\n ${chalk.dim('Add cho feature:')}\n ${chalk.cyan('jai1 t add')} \"Setup DB schema\" -p 1 -P feature/xxx\n ${chalk.cyan('jai1 t add')} \"Create API\" -p 1 -P feature/xxx\n ${chalk.cyan('jai1 t add')} \"Build UI\" -p 2 -P feature/xxx\n\n ${chalk.dim('Add cho plan:')}\n ${chalk.cyan('jai1 t add')} \"Refactor middleware\" -p 2 -P plan/xxx\n\n ${chalk.dim('Add standalone:')}\n ${chalk.cyan('jai1 t add')} \"Fix README typo\" -p 3\n\n ${chalk.dim('Add bug fix:')}\n ${chalk.cyan('jai1 t add')} \"Fix login redirect\" -p 1 -P bug/xxx\n\n${chalk.bold('โ”โ”โ” DEPENDENCY โ”โ”โ”')}\n ${chalk.dim('Task dependency:')}\n ${chalk.cyan('jai1 t dep')} T-002 T-001 T-002 chแป T-001 done\n ${chalk.cyan('jai1 t dep')} T-003 T-002 T-003 chแป T-002 done\n\n ${chalk.dim('Feature-level dependency:')}\n ${chalk.dim('# Nแบฟu feature/auth phแปฅ thuแป™c feature/user-model:')}\n ${chalk.cyan('jai1 t add')} \"[DEP] Wait for feature/user-model\" -p 1 -P feature/auth\n ${chalk.dim('# Rแป“i dep nรณ vแป›i tasks cuแป‘i cแปงa user-model')}\n\n ${chalk.dim('View deps:')}\n ${chalk.cyan('jai1 t show')} T-002 Hiแป‡n depends_on\n\n${chalk.bold('โ”โ”โ” TEAM COLLABORATION โ”โ”โ”')}\n ${chalk.yellow('โš  Assignment chแป‰ qua pick โ€” khรดng set thแปง cรดng.')}\n ${chalk.dim('Khi bแบกn pick โ†’ team thแบฅy task ฤ‘รฃ cรณ ngฦฐแปi nhแบญn.')}\n\n ${chalk.dim('Sync morning:')} ${chalk.cyan('jai1 t sync --pull')}\n ${chalk.dim('Sync evening:')} ${chalk.cyan('jai1 t sync --push')}\n\n${chalk.bold('โ”โ”โ” FOR AI AGENTS (Workflow Integration) โ”โ”โ”')}\n ${chalk.dim('Khi tแบกo tasks tแปซ feature/plan:')}\n 1. ${chalk.cyan('jai1 t list -P')} <parent> Check existing (trรกnh duplicate)\n 2. ${chalk.cyan('jai1 t add')} \"...\" -p <0-3> -P <parent> Add tแปซng task\n 3. ${chalk.cyan('jai1 t dep')} <child> <parent> Set dependencies\n 4. ${chalk.cyan('jai1 t done')} <id> Mark complete\n\n ${chalk.dim('Khi implement task tiแบฟp theo:')}\n 1. ${chalk.cyan('jai1 t pick')} (hoแบทc ${chalk.cyan('jai1 t ready -P')} <parent>)\n 2. Implement task\n 3. ${chalk.cyan('jai1 t done')} <id>\n\n ${chalk.dim('Status transitions:')}\n add โ†’ todo (default)\n pick โ†’ in_progress (auto assign)\n done โ†’ done\n update -s โ†’ any valid status\n\n${chalk.bold('โ”โ”โ” ALL COMMANDS โ”โ”โ”')}\n ${chalk.cyan('jai1 t list')} [-s status] [-P parent] [-j]\n ${chalk.cyan('jai1 t ready')} [-P parent] [-j]\n ${chalk.cyan('jai1 t add')} <title> [-p 0-3] [-P parent] [-t tags] [-j]\n ${chalk.cyan('jai1 t update')} <id> -s <status> [-j]\n ${chalk.cyan('jai1 t show')} <id|parent> [-j]\n ${chalk.cyan('jai1 t pick')} [-j]\n ${chalk.cyan('jai1 t done')} <id> [-j]\n ${chalk.cyan('jai1 t dep')} <childId> <parentId> [-j]\n ${chalk.cyan('jai1 t sync')} [--pull] [--push]\n ${chalk.cyan('jai1 t summary')} [-j]\n ${chalk.cyan('jai1 t guide')}\n\n ${chalk.dim('-j / --json available on all commands (except guide, sync)')}\n`;\n\nexport function createTaskGuideCommand(): Command {\n return new Command('guide')\n .description('Show full task management guide')\n .action(() => {\n console.log(GUIDE_TEXT);\n });\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { createKitListCommand } from './list.js';\nimport { createKitInfoCommand } from './info.js';\nimport { createKitCreateCommand } from './create.js';\n\nfunction showKitHelp(): void {\n console.log(chalk.bold.cyan('๐Ÿ“ฆ jai1 kit') + chalk.dim(' - Quแบฃn lรฝ starter kits'));\n console.log();\n console.log(chalk.bold('Cรกc lแป‡nh:'));\n console.log(` ${chalk.cyan('list')} Liแป‡t kรช cรกc starter kits cรณ sแบตn`);\n console.log(` ${chalk.cyan('info')} Xem chi tiแบฟt mแป™t starter kit`);\n console.log(` ${chalk.cyan('create')} Tแบกo project mแป›i tแปซ starter kit`);\n console.log();\n console.log(chalk.bold('Vรญ dแปฅ:'));\n console.log(chalk.dim(' $ jai1 kit list'));\n console.log(chalk.dim(' $ jai1 kit list --category frontend'));\n console.log(chalk.dim(' $ jai1 kit info next-tw4-shadcn'));\n console.log(chalk.dim(' $ jai1 kit create next-tw4-shadcn my-project'));\n console.log();\n console.log(chalk.dim('Chแบกy \"jai1 kit <lแป‡nh> --help\" ฤ‘แปƒ xem chi tiแบฟt'));\n}\n\nexport function createKitCommand(): Command {\n const cmd = new Command('kit')\n .description('Manage starter kits for new projects')\n .action(() => {\n showKitHelp();\n });\n\n cmd.addCommand(createKitListCommand());\n cmd.addCommand(createKitInfoCommand());\n cmd.addCommand(createKitCreateCommand());\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport Table from 'cli-table3';\nimport { ConfigService } from '../../services/config.service.js';\nimport { StarterKitService } from '../../services/starter-kit.service.js';\nimport { ValidationError } from '../../errors/index.js';\n\nexport function createKitListCommand(): Command {\n return new Command('list')\n .description('List available starter kits')\n .option('-c, --category <category>', 'Filter by category (backend, frontend, fullstack)')\n .option('-s, --search <term>', 'Search kits by name or description')\n .action(async (options) => {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n console.log(chalk.cyan('๐Ÿ“ฆ ฤang tแบฃi danh sรกch starter kits...'));\n console.log();\n\n const kitService = new StarterKitService();\n const kits = await kitService.list(config, {\n category: options.category,\n search: options.search,\n });\n\n if (kits.length === 0) {\n console.log(chalk.yellow('Khรดng tรฌm thแบฅy starter kits nร o.'));\n if (options.category || options.search) {\n console.log(chalk.dim('Thแปญ bแป filter ฤ‘แปƒ xem tแบฅt cแบฃ.'));\n }\n return;\n }\n\n // Group by category\n const byCategory: Record<string, typeof kits> = {};\n for (const kit of kits) {\n if (!byCategory[kit.category]) {\n byCategory[kit.category] = [];\n }\n byCategory[kit.category].push(kit);\n }\n\n const categoryOrder = ['frontend', 'backend', 'fullstack'];\n const sortedCategories = Object.keys(byCategory).sort((a, b) => {\n const indexA = categoryOrder.indexOf(a);\n const indexB = categoryOrder.indexOf(b);\n if (indexA === -1 && indexB === -1) return a.localeCompare(b);\n if (indexA === -1) return 1;\n if (indexB === -1) return -1;\n return indexA - indexB;\n });\n\n for (const category of sortedCategories) {\n const categoryKits = byCategory[category];\n const categoryIcon =\n category === 'frontend' ? '๐ŸŽจ' :\n category === 'backend' ? 'โš™๏ธ' :\n category === 'fullstack' ? '๐Ÿš€' : '๐Ÿ“ฆ';\n\n console.log(\n chalk.bold(`${categoryIcon} ${category.charAt(0).toUpperCase() + category.slice(1)}`)\n );\n\n const table = new Table({\n head: [\n chalk.cyan('Slug'),\n chalk.cyan('Mรด tแบฃ'),\n chalk.cyan('Version'),\n ],\n style: { head: [], border: ['gray'] },\n });\n\n for (const kit of categoryKits) {\n table.push([\n chalk.white(kit.slug),\n chalk.dim(kit.description.slice(0, 50)),\n chalk.green(`v${kit.version}`),\n ]);\n }\n\n console.log(table.toString());\n console.log();\n }\n\n console.log(chalk.dim(`Tแป•ng cแป™ng: ${kits.length} starter kit(s)`));\n console.log(chalk.dim('\\n๐Ÿ’ก Chแบกy \"jai1 kit create <slug>\" ฤ‘แปƒ tแบกo project mแป›i'));\n });\n}\n","import { promises as fs } from 'fs';\nimport { join } from 'path';\nimport AdmZip from 'adm-zip';\nimport type { Jai1Config } from '../types/framework.types.js';\nimport { NetworkError } from '../errors/index.js';\n\nexport interface StarterKit {\n id: number;\n slug: string;\n name: string;\n description: string;\n category: string;\n tags: string[];\n version: string;\n downloads: number;\n}\n\nexport interface StarterKitFull extends StarterKit {\n config: KitConfig;\n}\n\nexport interface KitConfig {\n slug: string;\n name: string;\n description: string;\n category: string;\n tags?: string[];\n version: string;\n requiredTools?: string[];\n variables?: Variable[];\n hooks?: {\n preInit?: string[];\n postExtract?: string[];\n postInit?: string[];\n };\n framework?: {\n apply: boolean;\n components: string[];\n };\n ide?: {\n promptSync?: boolean;\n defaultTargets?: string[];\n };\n git?: {\n init: boolean;\n initialCommit?: string;\n };\n}\n\nexport interface Variable {\n name: string;\n prompt: string;\n type?: 'text' | 'select';\n default?: string;\n options?: string[];\n validate?: string;\n}\n\n/**\n * Service for managing starter kits\n */\nexport class StarterKitService {\n /**\n * List available starter kits\n */\n async list(\n config: Jai1Config,\n options?: { category?: string; search?: string }\n ): Promise<StarterKit[]> {\n const params = new URLSearchParams();\n if (options?.category) params.set('category', options.category);\n if (options?.search) params.set('search', options.search);\n\n const url = `${config.apiUrl}/api/starter-kits${params.toString() ? '?' + params : ''}`;\n\n const response = await fetch(url, {\n headers: { 'JAI1-Access-Key': config.accessKey },\n });\n\n if (!response.ok) {\n throw new NetworkError(`Failed to list starter kits: HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as { kits: StarterKit[] };\n return data.kits;\n }\n\n /**\n * Get single starter kit with full config\n */\n async get(config: Jai1Config, slug: string): Promise<StarterKitFull> {\n const response = await fetch(`${config.apiUrl}/api/starter-kits/${slug}`, {\n headers: { 'JAI1-Access-Key': config.accessKey },\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new Error(`Starter kit not found: ${slug}`);\n }\n throw new NetworkError(`Failed to get starter kit: HTTP ${response.status}`);\n }\n\n return (await response.json()) as StarterKitFull;\n }\n\n /**\n * Download and extract starter kit\n */\n async downloadAndExtract(\n config: Jai1Config,\n slug: string,\n targetDir: string,\n onProgress?: (percent: number) => void\n ): Promise<void> {\n if (onProgress) onProgress(10);\n\n // Download zip directly from API (streams from R2)\n const response = await fetch(`${config.apiUrl}/api/starter-kits/${slug}/download`, {\n headers: { 'JAI1-Access-Key': config.accessKey },\n });\n\n if (!response.ok) {\n throw new NetworkError(`Failed to download kit: HTTP ${response.status}`);\n }\n\n if (onProgress) onProgress(30);\n\n // Save to temp file\n const tmpDir = join(process.env.TMPDIR || '/tmp', 'jai1-kits');\n await fs.mkdir(tmpDir, { recursive: true });\n const tmpFile = join(tmpDir, `${slug}.zip`);\n\n const buffer = await response.arrayBuffer();\n await fs.writeFile(tmpFile, Buffer.from(buffer));\n\n if (onProgress) onProgress(60);\n\n // Extract\n const zip = new AdmZip(tmpFile);\n await fs.mkdir(targetDir, { recursive: true });\n zip.extractAllTo(targetDir, true);\n\n if (onProgress) onProgress(100);\n\n // Cleanup\n await fs.unlink(tmpFile);\n }\n}\n","import { Command } from 'commander';\nimport { ConfigService } from '../../services/config.service.js';\nimport { StarterKitService } from '../../services/starter-kit.service.js';\nimport { ValidationError } from '../../errors/index.js';\n\nexport function createKitInfoCommand(): Command {\n return new Command('info')\n .description('Show detailed information about a starter kit')\n .argument('<slug>', 'Starter kit slug')\n .action(async (slug) => {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n const kitService = new StarterKitService();\n const kit = await kitService.get(config, slug);\n\n console.log(`๐Ÿ“ฆ ${kit.name}\\n`);\n console.log(`Description: ${kit.description}`);\n console.log(`Category: ${kit.category}`);\n console.log(`Version: ${kit.version}`);\n console.log(`Downloads: ${kit.downloads}`);\n\n if (kit.tags.length > 0) {\n console.log(`Tags: ${kit.tags.join(', ')}`);\n }\n\n if (kit.config.requiredTools && kit.config.requiredTools.length > 0) {\n console.log(`\\nRequired Tools:`);\n kit.config.requiredTools.forEach((tool) => {\n console.log(` - ${tool}`);\n });\n }\n\n if (kit.config.framework?.apply && kit.config.framework.components.length > 0) {\n console.log(`\\nIncluded Framework Components:`);\n kit.config.framework.components.forEach((comp) => {\n console.log(` - ${comp}`);\n });\n }\n\n if (kit.config.variables && kit.config.variables.length > 0) {\n console.log(`\\nVariables (prompted during creation):`);\n kit.config.variables.forEach((v) => {\n console.log(` - ${v.name}: ${v.prompt}${v.default ? ` (default: ${v.default})` : ''}`);\n });\n }\n\n if (kit.config.hooks?.postInit && kit.config.hooks.postInit.length > 0) {\n console.log(`\\nPost-Init Commands:`);\n kit.config.hooks.postInit.forEach((cmd) => {\n console.log(` - ${cmd}`);\n });\n }\n });\n}\n","import { Command } from 'commander';\nimport { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { select, input, checkbox } from '@inquirer/prompts';\nimport { execa } from 'execa';\nimport { ConfigService } from '../../services/config.service.js';\nimport { StarterKitService } from '../../services/starter-kit.service.js';\nimport { HookExecutor } from '../../services/hook-executor.service.js';\nimport { ComponentsService } from '../../services/components.service.js';\nimport { ValidationError } from '../../errors/index.js';\nimport { selectTheme, checkboxTheme } from '../../utils/prompt-theme.js';\n\nexport function createKitCreateCommand(): Command {\n return new Command('create')\n .description('Create a new project from a starter kit')\n .argument('<slug>', 'Starter kit slug')\n .argument('[directory]', 'Project directory (default: ./<slug>)')\n .option('-y, --yes', 'Auto mode - use defaults, no prompts')\n .option('--name <name>', 'Project name')\n .option('--skip-install', 'Skip dependency installation')\n .option('--skip-git', 'Skip git initialization')\n .option('--skip-framework', 'Skip framework apply')\n .option('--skip-ide', 'Skip IDE sync')\n .action(async (slug, directory, options) => {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n const isAutoMode = options.yes === true;\n const kitService = new StarterKitService();\n\n // Step 1: Fetch metadata\n console.log(`๐Ÿ“ฆ Fetching starter kit: ${slug}...`);\n const kit = await kitService.get(config, slug);\n\n // Step 2: Check required tools\n if (kit.config.requiredTools && kit.config.requiredTools.length > 0) {\n console.log('๐Ÿ” Checking required tools...');\n for (const tool of kit.config.requiredTools) {\n try {\n await execa('which', [tool]);\n } catch {\n console.warn(`โš ๏ธ Warning: Required tool '${tool}' not found`);\n }\n }\n }\n\n // Determine target directory\n const targetDir = directory || join(process.cwd(), options.name || slug);\n\n // Check if directory exists\n try {\n await fs.access(targetDir);\n throw new Error(`Directory already exists: ${targetDir}`);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw error;\n }\n }\n\n // Step 3: Run preInit hooks\n if (kit.config.hooks?.preInit && kit.config.hooks.preInit.length > 0) {\n console.log('๐Ÿ”ง Running pre-init hooks...');\n const hookExecutor = new HookExecutor(process.cwd(), {});\n await hookExecutor.run(kit.config.hooks.preInit);\n }\n\n // Step 4: Download and extract\n console.log('๐Ÿ“ฅ Downloading template...');\n await kitService.downloadAndExtract(config, slug, targetDir, (percent) => {\n if (percent === 100) {\n console.log(' โœ“ Downloaded and extracted');\n }\n });\n\n // Step 5: Run postExtract hooks\n if (kit.config.hooks?.postExtract && kit.config.hooks.postExtract.length > 0) {\n console.log('๐Ÿ“„ Setting up environment...');\n const hookExecutor = new HookExecutor(targetDir, {});\n await hookExecutor.run(kit.config.hooks.postExtract);\n }\n\n // Step 6: Prompt variables or use defaults\n const variables: Record<string, string> = {};\n\n if (kit.config.variables && kit.config.variables.length > 0) {\n if (isAutoMode) {\n console.log('๐Ÿ“ Using default values (auto mode)');\n for (const v of kit.config.variables) {\n variables[v.name] =\n options.name && v.name === 'PROJECT_NAME'\n ? options.name\n : v.default || '';\n }\n } else {\n console.log('๐Ÿ“ Please provide project details:');\n for (const v of kit.config.variables) {\n if (v.type === 'select' && v.options) {\n const answer = await select({\n message: v.prompt,\n choices: v.options.map((opt) => ({ name: opt, value: opt })),\n default: v.default,\n theme: selectTheme,\n });\n variables[v.name] = answer as string;\n } else {\n const answer = await input({\n message: v.prompt,\n default: v.default,\n });\n variables[v.name] = answer;\n }\n }\n }\n }\n\n // Step 7: Apply variable substitution\n if (Object.keys(variables).length > 0) {\n await applyVariableSubstitution(targetDir, variables);\n }\n\n // Step 8: Apply framework components\n if (!options.skipFramework && kit.config.framework?.apply) {\n console.log('๐Ÿค– Applying jai1 framework...');\n const componentsService = new ComponentsService(targetDir);\n\n // Expand paths with special prefixes (e.g., package:core)\n const expandedPaths = await componentsService.expandPaths(\n config,\n kit.config.framework.components\n );\n\n for (const filepath of expandedPaths) {\n console.log(` ๐Ÿ“ฅ Installing ${filepath}...`);\n await componentsService.install(config, filepath, join(targetDir, '.jai1'));\n }\n\n console.log(' โœ“ Framework components applied');\n }\n\n // Step 9: Git init\n if (!options.skipGit && kit.config.git?.init) {\n console.log('๐Ÿ”ง Initializing git repository...');\n await execa('git', ['init'], { cwd: targetDir });\n await execa('git', ['add', '.'], { cwd: targetDir });\n const commitMsg = kit.config.git.initialCommit || 'Initial commit';\n await execa('git', ['commit', '-m', commitMsg], { cwd: targetDir });\n console.log(' โœ“ Git initialized');\n }\n\n // Step 10: Run postInit hooks\n if (!options.skipInstall && kit.config.hooks?.postInit) {\n console.log('๐Ÿ”ง Running setup...');\n const hookExecutor = new HookExecutor(targetDir, variables);\n await hookExecutor.run(kit.config.hooks.postInit);\n }\n\n // Step 11: IDE sync\n const shouldPromptIdeSync = kit.config.ide?.promptSync !== false;\n if (!options.skipIde && shouldPromptIdeSync) {\n const ideChoices = [\n { name: 'Cursor', value: 'cursor' },\n { name: 'Windsurf', value: 'windsurf' },\n { name: 'Claude Code', value: 'claudecode' },\n { name: 'Antigravity', value: 'antigravity' },\n { name: 'OpenCode', value: 'opencode' },\n ];\n\n let selectedIdes: string[] = [];\n\n if (isAutoMode) {\n selectedIdes = kit.config.ide?.defaultTargets || [];\n if (selectedIdes.length > 0) {\n console.log(`๐Ÿ–ฅ๏ธ Syncing to IDEs: ${selectedIdes.join(', ')}`);\n }\n } else {\n const defaultTargets = kit.config.ide?.defaultTargets || [];\n const answer = await checkbox({\n message: 'Chแปn IDE ฤ‘แปƒ sync framework:',\n choices: ideChoices.map((c) => ({\n ...c,\n checked: defaultTargets.includes(c.value),\n })),\n theme: checkboxTheme,\n });\n selectedIdes = answer as string[];\n }\n\n if (selectedIdes.length > 0) {\n await execa('jai1', ['ide', 'sync', '--ide', ...selectedIdes, '--type', 'rules', 'workflows', 'commands'], {\n cwd: targetDir,\n stdio: 'inherit',\n });\n }\n }\n\n // Done\n console.log('\\nโœ… Project created successfully!');\n console.log(`๐Ÿ“ Location: ${targetDir}`);\n console.log('\\n๐Ÿ’ก Next steps:');\n console.log(` cd ${targetDir}`);\n console.log(' jai1 apply # Install framework components');\n console.log(' jai1 ide sync <ides> # Sync to your IDE(s)');\n });\n}\n\n/**\n * Apply variable substitution to files\n */\nasync function applyVariableSubstitution(\n dir: string,\n variables: Record<string, string>\n): Promise<void> {\n const files = await getAllFiles(dir);\n\n for (const file of files) {\n let content = await fs.readFile(file, 'utf-8');\n let modified = false;\n\n for (const [key, value] of Object.entries(variables)) {\n const regex = new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, 'g');\n if (regex.test(content)) {\n content = content.replace(regex, value);\n modified = true;\n }\n }\n\n if (modified) {\n await fs.writeFile(file, content, 'utf-8');\n }\n }\n}\n\n/**\n * Get all files recursively\n */\nasync function getAllFiles(dir: string): Promise<string[]> {\n const files: string[] = [];\n const entries = await fs.readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n if (!entry.name.startsWith('.') && entry.name !== 'node_modules') {\n files.push(...(await getAllFiles(fullPath)));\n }\n } else {\n files.push(fullPath);\n }\n }\n\n return files;\n}\n","import { execa } from 'execa';\n\n/**\n * Service for executing kit hooks\n */\nexport class HookExecutor {\n constructor(\n private cwd: string,\n private variables: Record<string, string>\n ) {}\n\n /**\n * Run hooks sequentially\n */\n async run(hooks: string[]): Promise<void> {\n for (const hook of hooks) {\n const cmd = this.replaceVariables(hook);\n console.log(` $ ${cmd}`);\n\n try {\n await execa(cmd, {\n cwd: this.cwd,\n shell: true,\n stdio: 'inherit',\n });\n } catch (error) {\n throw new Error(`Hook failed: ${cmd}`);\n }\n }\n }\n\n /**\n * Replace variables in command\n */\n private replaceVariables(cmd: string): string {\n let result = cmd;\n for (const [key, value] of Object.entries(this.variables)) {\n result = result.replace(new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, 'g'), value);\n }\n return result;\n }\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { createRulesListCommand } from './list.js';\nimport { createRulesInitCommand } from './init.js';\nimport { createRulesApplyCommand } from './apply.js';\nimport { createRulesRestoreCommand } from './restore.js';\nimport { createRulesSyncCommand } from './sync.js';\nimport { createRulesInfoCommand } from './info.js';\n\nfunction showRulesHelp(): void {\n console.log(chalk.bold.cyan('๐Ÿ“‹ jai1 rules') + chalk.dim(' - Quแบฃn lรฝ rule presets cho AI agents'));\n console.log();\n console.log(chalk.bold('Cรกc lแป‡nh:'));\n console.log(` ${chalk.cyan('list')} Liแป‡t kรช cรกc presets cรณ sแบตn`);\n console.log(` ${chalk.cyan('info')} Xem chi tiแบฟt mแป™t preset`);\n console.log(` ${chalk.cyan('init')} KhแปŸi tแบกo rules tแปซ preset`);\n console.log(` ${chalk.cyan('apply')} รp dแปฅng preset vร o project`);\n console.log(` ${chalk.cyan('sync')} ฤแป“ng bแป™ rules sang cรกc ฤ‘แป‹nh dแบกng IDE`);\n console.log(` ${chalk.cyan('restore')} Khรดi phแปฅc rules tแปซ backup`);\n console.log();\n console.log(chalk.bold('Vรญ dแปฅ:'));\n console.log(chalk.dim(' $ jai1 rules list'));\n console.log(chalk.dim(' $ jai1 rules info react-typescript'));\n console.log(chalk.dim(' $ jai1 rules init --preset=react-typescript'));\n console.log(chalk.dim(' $ jai1 rules apply react-typescript'));\n console.log();\n console.log(chalk.dim('Chแบกy \"jai1 rules <lแป‡nh> --help\" ฤ‘แปƒ xem chi tiแบฟt'));\n}\n\nexport function createRulesCommand(): Command {\n const rulesCommand = new Command('rules')\n .description('Manage rule presets for AI agents')\n .action(() => {\n showRulesHelp();\n });\n\n // Add subcommands\n rulesCommand.addCommand(createRulesListCommand());\n rulesCommand.addCommand(createRulesInitCommand());\n rulesCommand.addCommand(createRulesApplyCommand());\n rulesCommand.addCommand(createRulesRestoreCommand());\n rulesCommand.addCommand(createRulesSyncCommand());\n rulesCommand.addCommand(createRulesInfoCommand());\n\n return rulesCommand;\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport Table from 'cli-table3';\nimport { ConfigService } from '../../services/config.service.js';\nimport { ValidationError } from '../../errors/index.js';\n\ninterface Preset {\n slug: string;\n name: string;\n description: string;\n version: string;\n tags: string[];\n stack: {\n frontend?: string | null;\n backend?: string | null;\n css?: string | null;\n database?: string | null;\n language?: string | null;\n };\n downloads: number;\n}\n\ninterface ListPresetsResponse {\n presets: Preset[];\n total: number;\n}\n\nexport function createRulesListCommand(): Command {\n return new Command('list')\n .description('List available rule presets')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n console.log(chalk.cyan('๐Ÿ“‹ ฤang tแบฃi danh sรกch rule presets...'));\n console.log();\n\n try {\n const response = await fetch(`${config.apiUrl}/api/rules/presets`, {\n headers: {\n 'JAI1-Access-Key': config.accessKey,\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch presets: ${response.statusText}`);\n }\n\n const data = (await response.json()) as ListPresetsResponse;\n\n if (options.json) {\n console.log(JSON.stringify(data, null, 2));\n return;\n }\n\n if (data.total === 0) {\n console.log(chalk.yellow('Khรดng cรณ presets nร o.'));\n return;\n }\n\n console.log(\n chalk.green(`โœ“ Tรฌm thแบฅy ${chalk.bold(data.total)} preset${data.total > 1 ? 's' : ''}`)\n );\n console.log();\n\n for (const preset of data.presets) {\n // Preset header\n console.log(chalk.bold.cyan(`๐Ÿ“ฆ ${preset.slug}`));\n\n // Details table\n const table = new Table({\n style: { head: [], border: ['gray'], compact: true },\n colWidths: [15, 55],\n });\n\n table.push(\n [chalk.dim('Tรชn'), chalk.white(preset.name)],\n [chalk.dim('Mรด tแบฃ'), chalk.white(preset.description)],\n [chalk.dim('Version'), chalk.green(`v${preset.version}`)]\n );\n\n // Stack info\n const stackParts: string[] = [];\n if (preset.stack.frontend) stackParts.push(preset.stack.frontend);\n if (preset.stack.backend) stackParts.push(preset.stack.backend);\n if (preset.stack.css) stackParts.push(preset.stack.css);\n if (preset.stack.database) stackParts.push(preset.stack.database);\n if (stackParts.length > 0) {\n table.push([chalk.dim('Stack'), chalk.yellow(stackParts.join(' + '))]);\n }\n\n table.push(\n [chalk.dim('Tags'), chalk.dim(preset.tags.join(', ') || '-')],\n [chalk.dim('Downloads'), chalk.white(preset.downloads.toString())]\n );\n\n console.log(table.toString());\n console.log();\n }\n\n console.log(chalk.dim('๐Ÿ’ก Chแบกy \"jai1 rules apply <name>\" ฤ‘แปƒ รกp dแปฅng preset'));\n } catch (error) {\n throw new Error(\n `Lแป—i khi tแบฃi presets: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n });\n}\n","import { Command } from 'commander';\nimport { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { select, confirm, input } from '@inquirer/prompts';\nimport { ConfigService } from '../../services/config.service.js';\nimport { ProjectConfigService, type RulesConfig } from '../../services/project-config.service.js';\nimport { ValidationError } from '../../errors/index.js';\nimport { selectTheme } from '../../utils/prompt-theme.js';\n\ninterface Preset {\n slug: string;\n name: string;\n description: string;\n version: string;\n tags: string[];\n stack: {\n frontend?: string | null;\n backend?: string | null;\n css?: string | null;\n database?: string | null;\n language?: string | null;\n };\n downloads: number;\n}\n\ninterface PresetBundle {\n preset: {\n slug: string;\n name: string;\n description: string;\n version: string;\n tags: string[];\n stack: Record<string, string | null>;\n files: {\n required: string[];\n optional: string[];\n template: string[];\n };\n output?: {\n agentsMd?: boolean;\n ideFolder?: string;\n };\n };\n files: Record<string, string>;\n}\n\n\n\nexport function createRulesInitCommand(): Command {\n return new Command('init')\n .description('Apply rule preset to project')\n .option('--preset <slug>', 'Preset slug to apply')\n .option('--output <format>', 'Output format: cursor, agents-md, both (default: cursor)', 'cursor')\n .option('-y, --yes', 'Skip confirmations')\n .action(async (options) => {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n let presetSlug = options.preset as string | undefined;\n\n // If no preset specified, show interactive selection\n if (!presetSlug) {\n console.log('๐Ÿ“‹ Fetching available presets...\\n');\n\n const response = await fetch(`${config.apiUrl}/api/rules/presets`, {\n headers: {\n 'JAI1-Access-Key': config.accessKey,\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch presets: ${response.statusText}`);\n }\n\n const data = (await response.json()) as { presets: Preset[]; total: number };\n\n if (data.total === 0) {\n console.log('No presets available.');\n return;\n }\n\n presetSlug = await select({\n message: 'Select a preset:',\n choices: data.presets.map((p) => ({\n name: `${p.name} - ${p.description}`,\n value: p.slug,\n description: `v${p.version} | ${p.tags.join(', ')}`,\n })),\n theme: selectTheme,\n });\n }\n\n // Fetch preset bundle\n console.log(`\\n๐Ÿ“ฆ Fetching preset: ${presetSlug}...\\n`);\n\n const presetResponse = await fetch(`${config.apiUrl}/api/rules/presets/${presetSlug}`, {\n headers: {\n 'JAI1-Access-Key': config.accessKey,\n },\n });\n\n if (!presetResponse.ok) {\n if (presetResponse.status === 404) {\n throw new Error(`Preset '${presetSlug}' not found`);\n }\n throw new Error(`Failed to fetch preset: ${presetResponse.statusText}`);\n }\n\n const bundle = (await presetResponse.json()) as PresetBundle;\n\n console.log(`โœ“ Preset: ${bundle.preset.name} v${bundle.preset.version}`);\n console.log(` Files: ${Object.keys(bundle.files).length}`);\n\n // Determine output format\n let outputFormat = options.output as string;\n if (!['cursor', 'agents-md', 'both'].includes(outputFormat)) {\n outputFormat = await select({\n message: 'Select output format:',\n choices: [\n { name: 'Cursor (.cursor/rules/)', value: 'cursor' },\n { name: 'AGENTS.md (single file)', value: 'agents-md' },\n { name: 'Both', value: 'both' },\n ],\n theme: selectTheme,\n });\n }\n\n // Confirm before applying\n if (!options.yes) {\n const proceed = await confirm({\n message: `Apply preset '${bundle.preset.name}' to current directory?`,\n default: true,\n });\n\n if (!proceed) {\n console.log('Cancelled.');\n return;\n }\n }\n\n console.log('\\n๐Ÿ“ Applying preset...\\n');\n\n // Apply based on output format\n if (outputFormat === 'cursor' || outputFormat === 'both') {\n await applyCursorFormat(bundle);\n }\n\n if (outputFormat === 'agents-md' || outputFormat === 'both') {\n await applyAgentsMdFormat(bundle);\n }\n\n // Create project config\n const projectConfigService = new ProjectConfigService();\n const rulesConfig: RulesConfig = {\n preset: bundle.preset.slug,\n version: bundle.preset.version,\n appliedAt: new Date().toISOString(),\n ides: [],\n customContext: '09-custom.mdc',\n };\n\n await projectConfigService.saveRules(rulesConfig);\n console.log('โœ“ Created .jai1/project.json');\n\n console.log('\\nโœ… Preset applied successfully!\\n');\n console.log('Next steps:');\n console.log(' 1. Edit 09-custom.mdc to add project-specific rules');\n console.log(' 2. Commit the rules to git');\n console.log(' 3. Use \"jai1 rules sync\" to regenerate outputs after editing\\n');\n });\n}\n\nasync function applyCursorFormat(bundle: PresetBundle): Promise<void> {\n const rulesDir = join(process.cwd(), '.cursor', 'rules');\n\n // Create directory\n await fs.mkdir(rulesDir, { recursive: true });\n\n // Write all files\n for (const [filename, content] of Object.entries(bundle.files)) {\n const filePath = join(rulesDir, filename);\n await fs.writeFile(filePath, content, 'utf-8');\n console.log(`โœ“ Created .cursor/rules/${filename}`);\n }\n}\n\nasync function applyAgentsMdFormat(bundle: PresetBundle): Promise<void> {\n const sections: string[] = [];\n\n // Header\n sections.push('# AGENTS.md\\n');\n sections.push(`<!-- Generated by jai1 rules - Preset: ${bundle.preset.slug} v${bundle.preset.version} -->\\n`);\n\n // Extract content from each file (remove frontmatter)\n const fileOrder = [\n '01-project.mdc',\n '02-standards.mdc',\n '03-frontend.mdc',\n '04-backend.mdc',\n '05-testing.mdc',\n '06-workflow.mdc',\n '09-custom.mdc',\n ];\n\n for (const filename of fileOrder) {\n if (bundle.files[filename]) {\n const content = bundle.files[filename];\n // Remove frontmatter (---\\n...\\n---)\n const withoutFrontmatter = content.replace(/^---\\n[\\s\\S]*?\\n---\\n/, '');\n sections.push(withoutFrontmatter.trim());\n sections.push('\\n');\n }\n }\n\n const agentsMd = sections.join('\\n');\n await fs.writeFile('AGENTS.md', agentsMd, 'utf-8');\n console.log('โœ“ Created AGENTS.md');\n}\n","import { promises as fs } from 'fs';\nimport { join } from 'path';\n\n/**\n * Rules configuration within project config\n */\nexport interface RulesConfig {\n preset: string;\n version: string;\n appliedAt: string;\n ides: string[];\n customContext: string;\n backups?: Array<{\n path: string;\n timestamp: string;\n ides: string[];\n }>;\n}\n\n/**\n * Project-level Jai1 configuration\n * Stored in .jai1/project.json\n */\nexport interface Jai1ProjectConfig {\n rules?: RulesConfig;\n // Future extensions:\n // kit?: { ... }\n // mcp?: { ... }\n}\n\n/**\n * Service for managing project-level Jai1 configuration\n * Config stored in .jai1/project.json (relative to project root)\n */\nexport class ProjectConfigService {\n private readonly projectRoot: string;\n private readonly configDir: string;\n private readonly configPath: string;\n\n constructor(projectRoot: string = process.cwd()) {\n this.projectRoot = projectRoot;\n this.configDir = join(this.projectRoot, '.jai1');\n this.configPath = join(this.configDir, 'project.json');\n }\n\n /**\n * Check if config file exists\n */\n async exists(): Promise<boolean> {\n try {\n await fs.access(this.configPath);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Load full project configuration\n * @returns Config object or null if not found\n */\n async load(): Promise<Jai1ProjectConfig | null> {\n if (!(await this.exists())) {\n return null;\n }\n\n try {\n const content = await fs.readFile(this.configPath, 'utf-8');\n return JSON.parse(content) as Jai1ProjectConfig;\n } catch (error) {\n throw new Error(\n `Failed to load project config: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Save full project configuration\n * Creates .jai1 directory if it doesn't exist\n */\n async save(config: Jai1ProjectConfig): Promise<void> {\n try {\n await fs.mkdir(this.configDir, { recursive: true });\n await fs.writeFile(this.configPath, JSON.stringify(config, null, 2), 'utf-8');\n } catch (error) {\n throw new Error(\n `Failed to save project config: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Load rules configuration only\n * @returns RulesConfig or null if not found\n */\n async loadRules(): Promise<RulesConfig | null> {\n const config = await this.load();\n return config?.rules ?? null;\n }\n\n /**\n * Save rules configuration\n * Merges with existing config, preserving other sections\n */\n async saveRules(rulesConfig: RulesConfig): Promise<void> {\n const existingConfig = (await this.load()) ?? {};\n existingConfig.rules = rulesConfig;\n await this.save(existingConfig);\n }\n\n /**\n * Update rules configuration partially\n * Merges with existing rules config\n */\n async updateRules(partialRulesConfig: Partial<RulesConfig>): Promise<void> {\n const existingRules = await this.loadRules();\n if (!existingRules) {\n throw new Error('No rules configuration found. Run \"jai1 rules apply\" first.');\n }\n\n const updatedRules: RulesConfig = {\n ...existingRules,\n ...partialRulesConfig,\n };\n await this.saveRules(updatedRules);\n }\n\n /**\n * Add a backup entry to rules config\n * Keeps only the last 5 backups\n */\n async addBackup(backup: { path: string; timestamp: string; ides: string[] }): Promise<void> {\n const rules = await this.loadRules();\n if (!rules) {\n throw new Error('No rules configuration found.');\n }\n\n const backups = [backup, ...(rules.backups ?? [])].slice(0, 5);\n await this.updateRules({ backups });\n }\n\n /**\n * Get config file path\n */\n getConfigPath(): string {\n return this.configPath;\n }\n\n /**\n * Get config directory path (.jai1/)\n */\n getConfigDir(): string {\n return this.configDir;\n }\n\n /**\n * Get project root path\n */\n getProjectRoot(): string {\n return this.projectRoot;\n }\n}\n","/**\n * Rules Apply Command\n *\n * Apply rule presets to project with multi-IDE support\n * Supports: Cursor, Windsurf, Antigravity, Claude Code, AGENTS.md, Gemini CLI\n */\n\nimport { Command } from 'commander';\nimport { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { select, confirm, input, checkbox } from '@inquirer/prompts';\nimport { ConfigService } from '../../services/config.service.js';\nimport { ProjectConfigService, type RulesConfig } from '../../services/project-config.service.js';\nimport { RulesGeneratorService } from '../../services/rules-generator.service.js';\nimport { BackupService } from '../../services/backup.service.js';\nimport { IdeDetectionService } from '../../services/ide-detection.service.js';\nimport { ValidationError } from '../../errors/index.js';\nimport { IDE_FORMATS } from '../../config/ide-formats.js';\nimport { selectTheme, checkboxTheme } from '../../utils/prompt-theme.js';\n\ninterface Preset {\n slug: string;\n name: string;\n description: string;\n version: string;\n tags: string[];\n stack: {\n frontend?: string | null;\n backend?: string | null;\n css?: string | null;\n database?: string | null;\n language?: string | null;\n };\n downloads: number;\n}\n\ninterface PresetBundle {\n preset: {\n slug: string;\n name: string;\n description: string;\n version: string;\n tags: string[];\n stack: Record<string, string | null>;\n files: {\n required: string[];\n optional: string[];\n template: string[];\n };\n output?: {\n agentsMd?: boolean;\n ideFolder?: string;\n };\n };\n files: Record<string, string>;\n}\n\nenum ApplyStep {\n SELECT_PRESET = 'select_preset',\n SELECT_IDES = 'select_ides',\n BACKUP = 'backup',\n CONFIRM = 'confirm',\n APPLY = 'apply',\n}\n\nexport function createRulesApplyCommand(): Command {\n return new Command('apply')\n .description('Apply rule preset to project with multi-IDE support')\n .argument('[preset]', 'Preset slug to apply (optional)')\n .option('--ides <ides>', 'Comma-separated list of IDE formats (cursor,windsurf,antigravity,claude,agentsmd,gemini)')\n .option('--skip-backup', 'Skip backup creation')\n .option('-y, --yes', 'Skip all confirmations (auto mode)')\n .action(async (presetSlug: string | undefined, options) => {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n const generatorService = new RulesGeneratorService();\n const backupService = new BackupService();\n\n // Parse options\n const autoMode = options.yes === true;\n const skipBackup = options.skipBackup === true;\n let selectedIdes: string[] = [];\n\n if (options.ides) {\n selectedIdes = (options.ides as string)\n .split(',')\n .map((ide) => ide.trim())\n .filter((ide) => generatorService.isValidIde(ide));\n\n if (selectedIdes.length === 0) {\n throw new ValidationError('No valid IDE formats specified');\n }\n }\n\n // Step 1: Select Preset\n if (!presetSlug) {\n console.log('๐Ÿ“‹ Fetching available presets...\\n');\n\n const response = await fetch(`${config.apiUrl}/api/rules/presets`, {\n headers: {\n 'JAI1-Access-Key': config.accessKey,\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch presets: ${response.statusText}`);\n }\n\n const data = (await response.json()) as { presets: Preset[]; total: number };\n\n if (data.total === 0) {\n console.log('No presets available.');\n return;\n }\n\n presetSlug = await select({\n message: 'Select a preset:',\n choices: data.presets.map((p) => ({\n name: `${p.name} - ${p.description}`,\n value: p.slug,\n description: `v${p.version} | ${p.tags.join(', ')}`,\n })),\n theme: selectTheme,\n });\n }\n\n // Fetch preset bundle\n console.log(`\\n๐Ÿ“ฆ Fetching preset: ${presetSlug}...\\n`);\n\n const presetResponse = await fetch(`${config.apiUrl}/api/rules/presets/${presetSlug}`, {\n headers: {\n 'JAI1-Access-Key': config.accessKey,\n },\n });\n\n if (!presetResponse.ok) {\n if (presetResponse.status === 404) {\n throw new Error(`Preset '${presetSlug}' not found`);\n }\n throw new Error(`Failed to fetch preset: ${presetResponse.statusText}`);\n }\n\n const bundle = (await presetResponse.json()) as PresetBundle;\n\n console.log(`โœ“ Preset: ${bundle.preset.name} v${bundle.preset.version}`);\n console.log(` Files: ${Object.keys(bundle.files).length}`);\n\n // Step 2: Select IDE formats\n if (selectedIdes.length === 0) {\n if (autoMode) {\n // Default to cursor in auto mode\n selectedIdes = ['cursor'];\n } else {\n // Get smart suggestions\n const detectionService = new IdeDetectionService();\n const suggestions = await detectionService.suggestIdes();\n const detected = await detectionService.detectActiveIdes();\n\n // Show suggestions if available\n if (suggestions.length > 0) {\n console.log('\\n๐Ÿ’ก Smart suggestions based on your project:\\n');\n suggestions.slice(0, 3).forEach(s => {\n const priority = s.priority === 'high' ? 'โญ' : s.priority === 'medium' ? '๐Ÿ”ธ' : 'โ–ซ๏ธ';\n console.log(`${priority} ${s.name} - ${s.reason}`);\n });\n console.log('');\n }\n\n // Build choices with smart defaults\n const choices = [\n {\n name: 'Cursor (.cursor/rules/)',\n value: 'cursor',\n checked: suggestions.some(s => s.ideId === 'cursor') || detected.some(d => d.id === 'cursor')\n },\n {\n name: 'Windsurf (.windsurf/rules/)',\n value: 'windsurf',\n checked: detected.some(d => d.id === 'windsurf')\n },\n {\n name: 'Antigravity (.agent/rules/)',\n value: 'antigravity',\n checked: detected.some(d => d.id === 'antigravity')\n },\n {\n name: 'Claude Code (.claude/rules/)',\n value: 'claude',\n checked: suggestions.some(s => s.ideId === 'claude') || detected.some(d => d.id === 'claude')\n },\n {\n name: 'AGENTS.md (single file)',\n value: 'agentsmd',\n checked: suggestions.some(s => s.ideId === 'agentsmd')\n },\n {\n name: 'Gemini CLI (GEMINI.md)',\n value: 'gemini',\n checked: detected.some(d => d.id === 'gemini')\n },\n ];\n\n selectedIdes = await checkbox({\n message: 'Select IDE formats to generate (pre-selected are recommended):',\n choices,\n required: true,\n theme: checkboxTheme,\n });\n }\n }\n\n // Resolve dependencies (e.g., Gemini requires AGENTS.md)\n const resolvedIdes = generatorService.resolveIdeDependencies(selectedIdes);\n\n if (resolvedIdes.length > selectedIdes.length) {\n const addedIdes = resolvedIdes.filter((ide) => !selectedIdes.includes(ide));\n console.log(`\\n๐Ÿ“Œ Auto-added dependencies: ${addedIdes.join(', ')}`);\n }\n\n // Step 3: Create Backup\n let backupPath: string | null = null;\n\n if (!skipBackup) {\n console.log('\\n๐Ÿ’พ Creating backup of existing rules...');\n\n try {\n backupPath = await backupService.createBackup(resolvedIdes, presetSlug);\n\n if (backupPath) {\n console.log(`โœ“ Backup created: ${backupPath}`);\n } else {\n console.log('โœ“ No existing files to backup');\n }\n } catch (error) {\n console.warn('โš ๏ธ Backup failed, but continuing...');\n }\n }\n\n // Step 4: Confirm\n if (!autoMode) {\n console.log('\\n๐Ÿ“‹ Summary:');\n console.log(` Preset: ${bundle.preset.name} v${bundle.preset.version}`);\n console.log(` IDEs: ${resolvedIdes.join(', ')}`);\n console.log(` Files: ${Object.keys(bundle.files).length} rule files`);\n if (backupPath) {\n console.log(` Backup: ${backupPath}`);\n }\n\n const proceed = await confirm({\n message: 'Apply these rules to the current directory?',\n default: true,\n });\n\n if (!proceed) {\n console.log('Cancelled.');\n return;\n }\n }\n\n // Step 5: Apply\n console.log('\\n๐Ÿ“ Applying preset...\\n');\n\n // Single preset per project: delete old preset before applying new one\n const rulePresetDir = join(process.cwd(), '.jai1', 'rule-preset');\n\n // Remove old preset if exists\n try {\n await fs.rm(rulePresetDir, { recursive: true, force: true });\n } catch {\n // Directory doesn't exist, that's fine\n }\n\n // Create new preset directory\n await fs.mkdir(rulePresetDir, { recursive: true });\n\n // Write preset.json\n await fs.writeFile(\n join(rulePresetDir, 'preset.json'),\n JSON.stringify(bundle.preset, null, 2),\n 'utf-8'\n );\n\n // Write all rule files from bundle\n for (const [filename, content] of Object.entries(bundle.files)) {\n const filePath = join(rulePresetDir, filename);\n await fs.mkdir(join(filePath, '..'), { recursive: true });\n await fs.writeFile(filePath, content, 'utf-8');\n }\n\n console.log(`โœ“ Saved preset to .jai1/rule-preset/`);\n\n const allGeneratedFiles: Array<{ ide: string; path: string; description: string }> = [];\n\n for (const ideId of resolvedIdes) {\n try {\n const files = generatorService.generateForIde(bundle, ideId);\n\n for (const file of files) {\n const fullPath = join(process.cwd(), file.path);\n await fs.mkdir(join(fullPath, '..'), { recursive: true });\n await fs.writeFile(fullPath, file.content, 'utf-8');\n\n console.log(`โœ“ [${ideId}] ${file.path}`);\n\n allGeneratedFiles.push({\n ide: ideId,\n path: file.path,\n description: file.description,\n });\n }\n } catch (error) {\n console.error(`โœ— Failed to generate ${ideId} files:`, error);\n }\n }\n\n // Create/update project config\n const projectConfigService = new ProjectConfigService();\n const rulesConfig: RulesConfig = {\n preset: bundle.preset.slug,\n version: bundle.preset.version,\n appliedAt: new Date().toISOString(),\n ides: resolvedIdes,\n customContext: '09-custom.mdc',\n backups: backupPath\n ? [\n {\n path: backupPath,\n timestamp: new Date().toISOString(),\n ides: resolvedIdes,\n },\n ]\n : [],\n };\n\n // Merge with existing config if it exists\n try {\n const existingRules = await projectConfigService.loadRules();\n\n // Preserve existing backups\n if (existingRules?.backups && existingRules.backups.length > 0) {\n rulesConfig.backups = [\n ...rulesConfig.backups!,\n ...existingRules.backups.slice(0, 5), // Keep last 5 backups\n ];\n }\n } catch {\n // No existing config, that's fine\n }\n\n await projectConfigService.saveRules(rulesConfig);\n console.log('\\nโœ“ Updated .jai1/project.json');\n\n // Summary\n console.log('\\nโœ… Preset applied successfully!\\n');\n console.log('๐Ÿ“Š Summary:');\n console.log(` Generated ${allGeneratedFiles.length} files across ${resolvedIdes.length} IDE(s)`);\n\n // Group files by IDE\n const filesByIde = resolvedIdes.reduce((acc, ide) => {\n acc[ide] = allGeneratedFiles.filter((f) => f.ide === ide).length;\n return acc;\n }, {} as Record<string, number>);\n\n for (const [ide, count] of Object.entries(filesByIde)) {\n const format = IDE_FORMATS[ide];\n console.log(` - ${format?.name}: ${count} files`);\n }\n\n if (backupPath) {\n console.log(`\\n๐Ÿ’พ Backup saved to: ${backupPath}`);\n console.log(' Use \"jai1 rules restore\" to restore if needed');\n }\n\n console.log('\\n๐Ÿ“ Next steps:');\n console.log(' 1. Review generated files in your IDE');\n console.log(' 2. Edit rules in .jai1/rule-preset/ (source of truth)');\n console.log(' 3. Run \"jai1 rules sync\" to regenerate IDE outputs');\n console.log(' 4. Commit the rules to git');\n console.log(' 5. Use \"jai1 ide status\" to check IDE configuration\\n');\n });\n}\n","/**\n * Rules Generator Service\n *\n * Generates IDE-specific rule files from preset bundles\n * Supports: Cursor, Windsurf, Antigravity, Claude Code, AGENTS.md, Gemini CLI\n */\n\nimport { IDE_FORMATS, JAI1_BASE_RULE, type IdeFormat } from '../config/ide-formats.js';\n\nexport interface PresetFile {\n filename: string;\n content: string;\n}\n\nexport interface PresetBundle {\n preset: {\n slug: string;\n name: string;\n description: string;\n version: string;\n tags: string[];\n stack: Record<string, string | null>;\n files: {\n required: string[];\n optional: string[];\n template: string[];\n };\n output?: {\n agentsMd?: boolean;\n ideFolder?: string;\n };\n };\n files: Record<string, string>;\n}\n\nexport interface GeneratedFile {\n path: string;\n content: string;\n description: string;\n}\n\nexport class RulesGeneratorService {\n /**\n * Generate files for a specific IDE format\n */\n generateForIde(bundle: PresetBundle, ideId: string): GeneratedFile[] {\n const format = IDE_FORMATS[ideId];\n if (!format) {\n throw new Error(`Unknown IDE format: ${ideId}`);\n }\n\n switch (ideId) {\n case 'cursor':\n return this.generateCursorFiles(bundle, format);\n case 'windsurf':\n return this.generateWindsurfFiles(bundle, format);\n case 'antigravity':\n return this.generateAntigravityFiles(bundle, format);\n case 'claude':\n return this.generateClaudeFiles(bundle, format);\n case 'agentsmd':\n return this.generateAgentsMd(bundle, format);\n case 'gemini':\n return this.generateGeminiMd(bundle, format);\n default:\n throw new Error(`Unsupported IDE format: ${ideId}`);\n }\n }\n\n /**\n * Generate Cursor format (.mdc files)\n */\n private generateCursorFiles(bundle: PresetBundle, format: IdeFormat): GeneratedFile[] {\n const files: GeneratedFile[] = [];\n\n // Convert all preset files (preset includes its own base rule)\n for (const [filename, content] of Object.entries(bundle.files)) {\n files.push({\n path: `${format.rulesPath}/${filename}`,\n content: content, // Already in .mdc format\n description: `Preset rule: ${filename}`,\n });\n }\n\n return files;\n }\n\n /**\n * Generate Windsurf format (.md files with trigger metadata)\n */\n private generateWindsurfFiles(bundle: PresetBundle, format: IdeFormat): GeneratedFile[] {\n const files: GeneratedFile[] = [];\n\n // Convert all preset files (preset includes its own base rule)\n for (const [filename, content] of Object.entries(bundle.files)) {\n const converted = this.convertToWindsurf(content, filename);\n const newFilename = filename.replace(/\\.mdc$/, '.md');\n\n files.push({\n path: `${format.rulesPath}/${newFilename}`,\n content: converted,\n description: `Preset rule: ${newFilename}`,\n });\n }\n\n return files;\n }\n\n /**\n * Convert Cursor format to Windsurf format\n */\n private convertToWindsurf(content: string, filename: string): string {\n // Parse frontmatter\n const frontmatterMatch = content.match(/^---\\n([\\s\\S]*?)\\n---\\n([\\s\\S]*)$/);\n if (!frontmatterMatch) {\n return content;\n }\n\n const [, frontmatter, body] = frontmatterMatch;\n const parsed = this.parseFrontmatter(frontmatter);\n\n // Determine trigger\n let trigger = 'always';\n if (parsed.alwaysApply === 'true' || parsed.alwaysApply === true) {\n trigger = 'always';\n } else if (parsed.globs && parsed.globs.length > 0) {\n trigger = parsed.globs.join(', ');\n }\n\n // Build Windsurf frontmatter\n const windsurfFrontmatter = `---\ntrigger: ${trigger}\n---`;\n\n return `${windsurfFrontmatter}\\n\\n${body.trim()}\\n`;\n }\n\n /**\n * Generate Antigravity format (.md files with trigger metadata + @AGENTS.md reference)\n */\n private generateAntigravityFiles(bundle: PresetBundle, format: IdeFormat): GeneratedFile[] {\n const files: GeneratedFile[] = [];\n\n // Convert all preset files (preset includes its own base rule)\n for (const [filename, content] of Object.entries(bundle.files)) {\n const converted = this.convertToAntigravity(content, filename);\n const newFilename = filename.replace(/\\.mdc$/, '.md');\n\n files.push({\n path: `${format.rulesPath}/${newFilename}`,\n content: converted,\n description: `Preset rule: ${newFilename}`,\n });\n }\n\n return files;\n }\n\n /**\n * Convert Cursor format to Antigravity format\n */\n private convertToAntigravity(content: string, filename: string): string {\n // Parse frontmatter\n const frontmatterMatch = content.match(/^---\\n([\\s\\S]*?)\\n---\\n([\\s\\S]*)$/);\n if (!frontmatterMatch) {\n return content;\n }\n\n const [, frontmatter, body] = frontmatterMatch;\n const parsed = this.parseFrontmatter(frontmatter);\n\n // Determine trigger\n let trigger = 'always_on';\n if (parsed.alwaysApply === 'true' || parsed.alwaysApply === true) {\n trigger = 'always_on';\n }\n\n // Build Antigravity frontmatter with AGENTS.md reference\n const antigravityFrontmatter = `---\ntrigger: ${trigger}\n---\n\n@AGENTS.md`;\n\n return `${antigravityFrontmatter}\\n\\n${body.trim()}\\n`;\n }\n\n /**\n * Generate Claude Code format (.md files with paths metadata)\n */\n private generateClaudeFiles(bundle: PresetBundle, format: IdeFormat): GeneratedFile[] {\n const files: GeneratedFile[] = [];\n\n // Convert all preset files (preset includes its own base rule)\n for (const [filename, content] of Object.entries(bundle.files)) {\n const converted = this.convertToClaude(content, filename);\n const newFilename = filename.replace(/\\.mdc$/, '.md');\n\n files.push({\n path: `${format.rulesPath}/${newFilename}`,\n content: converted,\n description: `Preset rule: ${newFilename}`,\n });\n }\n\n return files;\n }\n\n /**\n * Convert Cursor format to Claude format\n */\n private convertToClaude(content: string, filename: string): string {\n // Parse frontmatter\n const frontmatterMatch = content.match(/^---\\n([\\s\\S]*?)\\n---\\n([\\s\\S]*)$/);\n if (!frontmatterMatch) {\n return content;\n }\n\n const [, frontmatter, body] = frontmatterMatch;\n const parsed = this.parseFrontmatter(frontmatter);\n\n // Build Claude frontmatter\n let metadata = `---\ndescription: ${parsed.description || 'Rule'}`;\n\n if (parsed.globs && parsed.globs.length > 0) {\n // Convert globs to paths\n const paths = parsed.globs.map((g: string) => g.replace(/[\\[\\]\"]/g, '')).join(', ');\n metadata += `\\npaths: ${paths}`;\n }\n\n metadata += '\\n---';\n\n return `${metadata}\\n\\n${body.trim()}\\n`;\n }\n\n /**\n * Generate AGENTS.md file (single merged file)\n */\n private generateAgentsMd(bundle: PresetBundle, format: IdeFormat): GeneratedFile[] {\n const sections: string[] = [];\n\n // Header\n sections.push('# AGENTS.md\\n');\n sections.push(`<!-- Generated by jai1 rules - Preset: ${bundle.preset.slug} v${bundle.preset.version} -->\\n`);\n\n // Extract content from each file (remove frontmatter)\n const fileOrder = [\n '00-jai1.mdc',\n '01-project.mdc',\n '02-standards.mdc',\n '03-frontend.mdc',\n '04-backend.mdc',\n '05-testing.mdc',\n '06-workflow.mdc',\n '07-deployment.mdc',\n '08-database.mdc',\n '09-custom.mdc',\n ];\n\n for (const filename of fileOrder) {\n if (bundle.files[filename]) {\n const content = bundle.files[filename];\n const withoutFrontmatter = this.removeFrontmatter(content);\n\n if (withoutFrontmatter.trim()) {\n sections.push(withoutFrontmatter.trim());\n sections.push('\\n');\n }\n }\n }\n\n const agentsMd = sections.join('\\n');\n\n return [\n {\n path: 'AGENTS.md',\n content: agentsMd,\n description: 'Single AGENTS.md file with all rules',\n },\n ];\n }\n\n /**\n * Generate Gemini CLI format (GEMINI.md that references AGENTS.md)\n */\n private generateGeminiMd(bundle: PresetBundle, format: IdeFormat): GeneratedFile[] {\n const content = `# Gemini Instructions\n\n@AGENTS.md\n\nYou are an AI coding assistant integrated with the Jai1 Framework.\nFollow all instructions and patterns defined in AGENTS.md above.\n\n## Additional Gemini-Specific Guidelines\n\n- Use the context from AGENTS.md for all coding decisions\n- Apply the Jai1 Framework patterns consistently\n- Reference skills using the @jai1-[skill-name] syntax\n- Maintain consistency with project standards\n\n<!-- Generated by jai1 rules - Preset: ${bundle.preset.slug} v${bundle.preset.version} -->\n`;\n\n return [\n {\n path: 'GEMINI.md',\n content: content,\n description: 'Gemini CLI instructions file',\n },\n ];\n }\n\n /**\n * Remove frontmatter from content\n */\n private removeFrontmatter(content: string): string {\n return content.replace(/^---\\n[\\s\\S]*?\\n---\\n/, '');\n }\n\n /**\n * Parse YAML frontmatter into object\n */\n private parseFrontmatter(frontmatter: string): Record<string, any> {\n const result: Record<string, any> = {};\n const lines = frontmatter.split('\\n');\n\n for (const line of lines) {\n const match = line.match(/^(\\w+):\\s*(.+)$/);\n if (match) {\n const [, key, value] = match;\n\n // Handle arrays (e.g., globs: [\"**/*\"])\n if (value.startsWith('[') && value.endsWith(']')) {\n result[key] = value\n .slice(1, -1)\n .split(',')\n .map((v) => v.trim().replace(/^[\"']|[\"']$/g, ''));\n } else if (value === 'true' || value === 'false') {\n result[key] = value === 'true';\n } else {\n result[key] = value.replace(/^[\"']|[\"']$/g, '');\n }\n }\n }\n\n return result;\n }\n\n /**\n * Get all IDE IDs that can be generated\n */\n getAvailableIdes(): string[] {\n return Object.keys(IDE_FORMATS);\n }\n\n /**\n * Check if IDE format exists\n */\n isValidIde(ideId: string): boolean {\n return ideId in IDE_FORMATS;\n }\n\n /**\n * Get IDE format details\n */\n getIdeFormat(ideId: string): IdeFormat | undefined {\n return IDE_FORMATS[ideId];\n }\n\n /**\n * Resolve IDE dependencies\n * For example, Gemini requires AGENTS.md\n */\n resolveIdeDependencies(ides: string[]): string[] {\n const resolved = new Set<string>(ides);\n\n for (const ide of ides) {\n const format = IDE_FORMATS[ide];\n if (format?.dependencies) {\n format.dependencies.forEach((dep) => resolved.add(dep));\n }\n }\n\n return Array.from(resolved);\n }\n}\n","/**\n * Backup Service\n *\n * Creates backups of existing IDE rule files before applying presets\n * Supports restoration and cleanup of backups\n */\n\nimport { promises as fs } from 'fs';\nimport { join, dirname, basename } from 'path';\nimport { IDE_FORMATS, type IdeFormat } from '../config/ide-formats.js';\n\nexport interface BackupMetadata {\n timestamp: string;\n preset?: string;\n version?: string;\n ides: string[];\n files: Array<{\n originalPath: string;\n backupPath: string;\n ide: string;\n }>;\n}\n\nexport class BackupService {\n private backupDir = '.jai1/backups';\n\n /**\n * Create backup of existing rules for specified IDEs\n */\n async createBackup(ides: string[], presetSlug?: string): Promise<string | null> {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const backupPath = join(this.backupDir, timestamp);\n\n const backedUpFiles: Array<{\n originalPath: string;\n backupPath: string;\n ide: string;\n }> = [];\n\n let hasContent = false;\n\n for (const ideId of ides) {\n const format = IDE_FORMATS[ideId];\n if (!format) {\n console.warn(`Unknown IDE format: ${ideId}, skipping backup`);\n continue;\n }\n\n // Check if rules directory exists\n const rulesPath = format.rulesPath === '.' ? process.cwd() : join(process.cwd(), format.rulesPath);\n\n try {\n const exists = await this.pathExists(rulesPath);\n\n if (!exists) {\n continue;\n }\n\n // For AGENTS.md and GEMINI.md, backup specific files\n if (ideId === 'agentsmd') {\n await this.backupSingleFile('AGENTS.md', backupPath, ideId, backedUpFiles);\n hasContent = true;\n } else if (ideId === 'gemini') {\n await this.backupSingleFile('GEMINI.md', backupPath, ideId, backedUpFiles);\n hasContent = true;\n } else {\n // Backup entire directory\n const stats = await fs.stat(rulesPath);\n if (stats.isDirectory()) {\n const files = await fs.readdir(rulesPath);\n\n for (const file of files) {\n if (file.endsWith(format.fileExtension)) {\n const originalPath = join(rulesPath, file);\n const relativePath = join(format.rulesPath, file);\n const destPath = join(backupPath, ideId, file);\n\n await fs.mkdir(dirname(destPath), { recursive: true });\n await fs.copyFile(originalPath, destPath);\n\n backedUpFiles.push({\n originalPath: relativePath,\n backupPath: join(ideId, file),\n ide: ideId,\n });\n\n hasContent = true;\n }\n }\n }\n }\n } catch (error) {\n // Directory doesn't exist, skip\n continue;\n }\n }\n\n // If no files were backed up, don't create backup\n if (!hasContent) {\n return null;\n }\n\n // Create metadata file\n const metadata: BackupMetadata = {\n timestamp,\n preset: presetSlug,\n ides,\n files: backedUpFiles,\n };\n\n await fs.mkdir(backupPath, { recursive: true });\n await fs.writeFile(\n join(backupPath, 'metadata.json'),\n JSON.stringify(metadata, null, 2),\n 'utf-8'\n );\n\n return backupPath;\n }\n\n /**\n * Backup a single file (for AGENTS.md, GEMINI.md)\n */\n private async backupSingleFile(\n filename: string,\n backupPath: string,\n ideId: string,\n backedUpFiles: Array<{ originalPath: string; backupPath: string; ide: string }>\n ): Promise<void> {\n const originalPath = join(process.cwd(), filename);\n\n try {\n const exists = await this.pathExists(originalPath);\n if (!exists) {\n return;\n }\n\n const destPath = join(backupPath, ideId, filename);\n await fs.mkdir(dirname(destPath), { recursive: true });\n await fs.copyFile(originalPath, destPath);\n\n backedUpFiles.push({\n originalPath: filename,\n backupPath: join(ideId, filename),\n ide: ideId,\n });\n } catch (error) {\n // File doesn't exist, skip\n }\n }\n\n /**\n * Restore files from a backup\n */\n async restoreBackup(backupPath: string): Promise<void> {\n const metadataPath = join(backupPath, 'metadata.json');\n const metadataContent = await fs.readFile(metadataPath, 'utf-8');\n const metadata: BackupMetadata = JSON.parse(metadataContent);\n\n console.log(`\\nRestoring backup from ${metadata.timestamp}...`);\n\n for (const file of metadata.files) {\n const sourcePath = join(backupPath, file.backupPath);\n const destPath = join(process.cwd(), file.originalPath);\n\n await fs.mkdir(dirname(destPath), { recursive: true });\n await fs.copyFile(sourcePath, destPath);\n\n console.log(`โœ“ Restored ${file.originalPath}`);\n }\n\n console.log('\\nโœ… Backup restored successfully!');\n }\n\n /**\n * List all available backups\n */\n async listBackups(): Promise<BackupMetadata[]> {\n try {\n const backupDirPath = join(process.cwd(), this.backupDir);\n const exists = await this.pathExists(backupDirPath);\n\n if (!exists) {\n return [];\n }\n\n const entries = await fs.readdir(backupDirPath, { withFileTypes: true });\n const backups: BackupMetadata[] = [];\n\n for (const entry of entries) {\n if (entry.isDirectory()) {\n const metadataPath = join(backupDirPath, entry.name, 'metadata.json');\n\n try {\n const metadataContent = await fs.readFile(metadataPath, 'utf-8');\n const metadata: BackupMetadata = JSON.parse(metadataContent);\n backups.push(metadata);\n } catch {\n // Skip invalid backups\n continue;\n }\n }\n }\n\n // Sort by timestamp (newest first)\n return backups.sort((a, b) => b.timestamp.localeCompare(a.timestamp));\n } catch {\n return [];\n }\n }\n\n /**\n * Delete a specific backup\n */\n async deleteBackup(timestamp: string): Promise<void> {\n const backupPath = join(process.cwd(), this.backupDir, timestamp);\n await this.deleteDirectory(backupPath);\n }\n\n /**\n * Delete all backups older than specified days\n */\n async cleanupOldBackups(daysToKeep: number = 30): Promise<number> {\n const backups = await this.listBackups();\n const cutoffDate = new Date();\n cutoffDate.setDate(cutoffDate.getDate() - daysToKeep);\n\n let deletedCount = 0;\n\n for (const backup of backups) {\n const backupDate = new Date(backup.timestamp);\n\n if (backupDate < cutoffDate) {\n await this.deleteBackup(backup.timestamp);\n deletedCount++;\n }\n }\n\n return deletedCount;\n }\n\n /**\n * Get the most recent backup\n */\n async getLatestBackup(): Promise<BackupMetadata | null> {\n const backups = await this.listBackups();\n return backups.length > 0 ? backups[0] : null;\n }\n\n /**\n * Check if a path exists\n */\n private async pathExists(path: string): Promise<boolean> {\n try {\n await fs.access(path);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Recursively delete a directory\n */\n private async deleteDirectory(path: string): Promise<void> {\n try {\n const exists = await this.pathExists(path);\n if (!exists) {\n return;\n }\n\n const entries = await fs.readdir(path, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(path, entry.name);\n\n if (entry.isDirectory()) {\n await this.deleteDirectory(fullPath);\n } else {\n await fs.unlink(fullPath);\n }\n }\n\n await fs.rmdir(path);\n } catch (error) {\n // Ignore errors\n }\n }\n\n /**\n * Get backup directory path\n */\n getBackupDir(): string {\n return join(process.cwd(), this.backupDir);\n }\n\n /**\n * Ensure backup directory exists\n */\n async ensureBackupDir(): Promise<void> {\n const backupDirPath = join(process.cwd(), this.backupDir);\n await fs.mkdir(backupDirPath, { recursive: true });\n }\n}\n","/**\n * Rules Restore Command\n *\n * Restore previously backed up rules\n */\n\nimport { Command } from 'commander';\nimport { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { select, confirm } from '@inquirer/prompts';\nimport { BackupService } from '../../services/backup.service.js';\nimport { ValidationError } from '../../errors/index.js';\nimport { selectTheme } from '../../utils/prompt-theme.js';\n\nexport function createRulesRestoreCommand(): Command {\n return new Command('restore')\n .description('Restore rules from a backup')\n .option('--latest', 'Restore the most recent backup')\n .option('-y, --yes', 'Skip confirmation')\n .action(async (options) => {\n const backupService = new BackupService();\n\n // List available backups\n const backups = await backupService.listBackups();\n\n if (backups.length === 0) {\n console.log('No backups available.');\n return;\n }\n\n let selectedBackup;\n\n if (options.latest) {\n selectedBackup = backups[0];\n console.log(`๐Ÿ“ฆ Selected latest backup: ${selectedBackup.timestamp}`);\n } else {\n // Show interactive selection\n console.log('๐Ÿ“‹ Available backups:\\n');\n\n const backupTimestamp = await select({\n message: 'Select a backup to restore:',\n choices: backups.map((backup) => ({\n name: formatBackupInfo(backup),\n value: backup.timestamp,\n description: `${backup.files.length} files | IDEs: ${backup.ides.join(', ')}`,\n })),\n theme: selectTheme,\n });\n\n selectedBackup = backups.find((b) => b.timestamp === backupTimestamp);\n\n if (!selectedBackup) {\n throw new ValidationError('Backup not found');\n }\n }\n\n // Show backup details\n console.log('\\n๐Ÿ“Š Backup Details:');\n console.log(` Timestamp: ${formatTimestamp(selectedBackup.timestamp)}`);\n console.log(` Preset: ${selectedBackup.preset || 'N/A'}`);\n console.log(` IDEs: ${selectedBackup.ides.join(', ')}`);\n console.log(` Files: ${selectedBackup.files.length}`);\n\n // Confirm restoration\n if (!options.yes) {\n const proceed = await confirm({\n message: 'This will overwrite current rules. Continue?',\n default: false,\n });\n\n if (!proceed) {\n console.log('Cancelled.');\n return;\n }\n }\n\n // Restore backup\n console.log('\\n๐Ÿ”„ Restoring backup...\\n');\n\n try {\n const backupPath = join(backupService.getBackupDir(), selectedBackup.timestamp);\n await backupService.restoreBackup(backupPath);\n\n console.log('\\nโœ… Backup restored successfully!\\n');\n console.log('๐Ÿ’ก Tip: Your IDE may need to be restarted to pick up the changes.');\n } catch (error) {\n console.error('\\nโŒ Failed to restore backup:', error);\n throw error;\n }\n });\n}\n\n/**\n * Format backup info for display\n */\nfunction formatBackupInfo(backup: any): string {\n const timestamp = formatTimestamp(backup.timestamp);\n const preset = backup.preset ? ` [${backup.preset}]` : '';\n return `${timestamp}${preset}`;\n}\n\n/**\n * Format timestamp for display\n */\nfunction formatTimestamp(timestamp: string): string {\n try {\n const date = new Date(timestamp);\n return date.toLocaleString();\n } catch {\n return timestamp;\n }\n}\n","import { Command } from 'commander';\nimport { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { checkbox, confirm, Separator } from '@inquirer/prompts';\nimport { ValidationError } from '../../errors/index.js';\nimport { RulesGeneratorService } from '../../services/rules-generator.service.js';\nimport { ConfigService } from '../../services/config.service.js';\nimport { ProjectConfigService, type RulesConfig } from '../../services/project-config.service.js';\nimport { IdeDetectionService } from '../../services/ide-detection.service.js';\nimport { IDE_FORMATS } from '../../config/ide-formats.js';\nimport { checkboxTheme } from '../../utils/prompt-theme.js';\n\ninterface PresetBundle {\n preset: {\n slug: string;\n name: string;\n description: string;\n version: string;\n tags: string[];\n stack: Record<string, string | null>;\n files: {\n required: string[];\n optional: string[];\n template: string[];\n };\n output?: {\n agentsMd?: boolean;\n ideFolder?: string;\n };\n };\n files: Record<string, string>;\n}\n\nexport function createRulesSyncCommand(): Command {\n return new Command('sync')\n .description('Regenerate rule outputs for all configured IDEs')\n .option('--ides <ides>', 'Comma-separated list of IDEs to sync (default: all configured)')\n .option('--detect', 'Auto-detect active IDEs instead of using config')\n .option('-y, --yes', 'Skip confirmations')\n .action(async (options) => {\n // Check for rule preset first (source of truth)\n const rulePresetDir = join(process.cwd(), '.jai1', 'rule-preset');\n const presetJsonPath = join(rulePresetDir, 'preset.json');\n\n let presetExists = false;\n let presetData: any = null;\n\n try {\n const presetContent = await fs.readFile(presetJsonPath, 'utf-8');\n presetData = JSON.parse(presetContent);\n presetExists = true;\n } catch {\n // No preset found\n }\n\n if (!presetExists) {\n throw new ValidationError(\n 'No rule preset found in .jai1/rule-preset/\\n' +\n 'Run \"jai1 rules apply <preset>\" or create a project with \"jai1 kit create <kit>\" first.'\n );\n }\n\n // Load project config or create from preset\n const projectConfigService = new ProjectConfigService();\n let rulesConfig = await projectConfigService.loadRules();\n\n if (!rulesConfig) {\n // Create config from preset.json\n console.log('โš ๏ธ No .jai1/project.json found, creating from preset...\\n');\n rulesConfig = {\n preset: presetData.slug,\n version: presetData.version,\n appliedAt: new Date().toISOString(),\n ides: [],\n customContext: '09-custom.md',\n backups: [],\n };\n }\n\n console.log('๐Ÿ”„ Syncing rules...\\n');\n console.log(`Preset: ${rulesConfig.preset} v${rulesConfig.version}`);\n\n // Determine which IDEs to sync\n let idesToSync: string[] = [];\n\n // Option 1: Auto-detect active IDEs\n if (options.detect) {\n console.log('\\n๐Ÿ” Auto-detecting active IDEs...');\n const detectionService = new IdeDetectionService();\n const detected = await detectionService.detectActiveIdes();\n\n if (detected.length === 0) {\n throw new ValidationError(\n 'No active IDEs detected. Run \"jai1 rules apply\" first or use \"jai1 ide status\" to check.'\n );\n }\n\n console.log(`\\nDetected ${detected.length} active IDE(s):\\n`);\n detected.forEach(d => {\n const confidence = d.confidence === 'high' ? '๐ŸŸข' : d.confidence === 'medium' ? '๐ŸŸก' : '๐Ÿ”ด';\n console.log(` ${confidence} ${d.name} - ${d.ruleCount} rules`);\n });\n\n if (!options.yes) {\n const proceed = await confirm({\n message: '\\nSync these detected IDEs?',\n default: true,\n });\n\n if (!proceed) {\n console.log('Cancelled.');\n return;\n }\n }\n\n idesToSync = detected.map(d => d.id);\n }\n // Option 2: Specific IDEs via flag\n else if (options.ides) {\n const requested = (options.ides as string).split(',').map(ide => ide.trim());\n const configured = rulesConfig.ides || [];\n\n // Use requested IDEs, but warn if not in config\n idesToSync = requested;\n const notConfigured = requested.filter(ide => !configured.includes(ide));\n\n if (notConfigured.length > 0) {\n console.log(`\\nโš ๏ธ IDEs not in config: ${notConfigured.join(', ')}`);\n console.log(' They will still be synced, but may not be in .jai1/project.json');\n }\n }\n // Option 3: Interactive selection (default when no flags, unless --yes)\n else if (!options.yes) {\n const currentIdes = rulesConfig.ides || [];\n\n // Show current configuration\n console.log(`\\nCurrent IDE(s): ${currentIdes.join(', ') || 'none'}`);\n\n // Detect existing IDE files and get suggestions\n const detectionService = new IdeDetectionService();\n const detected = await detectionService.detectActiveIdes();\n const suggestions = await detectionService.suggestIdes();\n\n // Show summary of current state\n if (detected.length > 0) {\n const detectedCount = detected.reduce((sum, d) => sum + d.ruleCount + d.workflowCount, 0);\n console.log(` (${detectedCount} files detected)`);\n }\n\n // Show smart suggestions\n if (suggestions.length > 0) {\n console.log('\\n๐Ÿ’ก Smart suggestions based on your project:\\n');\n suggestions.slice(0, 3).forEach(s => {\n const priority = s.priority === 'high' ? 'โญ' : s.priority === 'medium' ? '๐Ÿ”ธ' : 'โ–ซ๏ธ';\n console.log(`${priority} ${s.name} - ${s.reason}`);\n });\n console.log('');\n }\n\n // Build choices with smart pre-selection\n const choices = buildIdeChoices(currentIdes, detected, suggestions);\n\n // Show interactive prompt\n idesToSync = await checkbox({\n message: 'Select IDE formats to sync:',\n choices,\n required: false,\n theme: checkboxTheme,\n });\n\n // Handle quit option\n if (idesToSync.includes('__quit__')) {\n console.log('Cancelled.');\n return;\n }\n\n // If user cancelled or selected nothing\n if (idesToSync.length === 0) {\n console.log('Cancelled.');\n return;\n }\n }\n // Option 4: Auto mode with --yes flag\n else {\n idesToSync = rulesConfig.ides || [];\n\n // Legacy support: if no IDEs configured, detect from existing files\n if (idesToSync.length === 0) {\n console.log('\\nโš ๏ธ No IDEs configured in .jai1/project.json');\n console.log(' Detecting from existing files...\\n');\n\n const detectionService = new IdeDetectionService();\n idesToSync = await detectionService.detectExistingIdes();\n\n if (idesToSync.length === 0) {\n throw new ValidationError(\n 'No rule outputs found. Run \"jai1 rules apply\" first.'\n );\n }\n\n console.log(` Found: ${idesToSync.join(', ')}\\n`);\n }\n }\n\n console.log(`\\n๐Ÿ“ Syncing ${idesToSync.length} IDE(s): ${idesToSync.join(', ')}\\n`);\n\n // Fetch preset bundle to regenerate\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n const presetResponse = await fetch(`${config.apiUrl}/api/rules/presets/${rulesConfig.preset}`, {\n headers: {\n 'JAI1-Access-Key': config.accessKey,\n },\n });\n\n if (!presetResponse.ok) {\n throw new Error(`Failed to fetch preset: ${presetResponse.statusText}`);\n }\n\n const bundle = (await presetResponse.json()) as PresetBundle;\n\n // Read source files from .jai1/rule-preset/ (source of truth)\n // Update bundle with edited files from local preset\n const files = await fs.readdir(rulePresetDir);\n\n for (const file of files) {\n if (file.endsWith('.mdc') || file.endsWith('.md')) {\n const filePath = join(rulePresetDir, file);\n const content = await fs.readFile(filePath, 'utf-8');\n bundle.files[file] = content;\n }\n }\n\n // Regenerate for each IDE\n const generatorService = new RulesGeneratorService();\n\n for (const ideId of idesToSync) {\n try {\n const format = IDE_FORMATS[ideId];\n if (!format) {\n console.log(`โš ๏ธ Unknown IDE format: ${ideId}, skipping`);\n continue;\n }\n\n const files = generatorService.generateForIde(bundle, ideId);\n\n for (const file of files) {\n const fullPath = join(process.cwd(), file.path);\n await fs.mkdir(join(fullPath, '..'), { recursive: true });\n await fs.writeFile(fullPath, file.content, 'utf-8');\n }\n\n console.log(`โœ“ ${format.name} - ${files.length} files regenerated`);\n } catch (error) {\n console.error(`โœ— Failed to sync ${ideId}:`, error);\n }\n }\n\n // Update config with synced IDEs (if different)\n if (JSON.stringify(rulesConfig.ides) !== JSON.stringify(idesToSync)) {\n rulesConfig.ides = idesToSync;\n await projectConfigService.saveRules(rulesConfig);\n console.log('\\nโœ“ Updated .jai1/project.json with synced IDEs');\n }\n\n console.log('\\nโœ… Rules synced successfully!\\n');\n console.log('๐Ÿ’ก Next steps:');\n console.log(' โ€ข Your IDE may need to be restarted to pick up changes');\n console.log(' โ€ข Use \"jai1 ide status\" to verify IDE configuration');\n console.log(' โ€ข Edit source files in .jai1/rule-preset/ and sync again\\n');\n });\n}\n\n/**\n * Build IDE choices for checkbox prompt with smart pre-selection\n */\nfunction buildIdeChoices(\n currentIdes: string[],\n detected: Array<{ id: string; name: string; detected: boolean }>,\n suggestions: Array<{ ideId: string; priority: string }>\n): Array<{ name: string; value: string; checked: boolean } | Separator> {\n const choices: Array<{ name: string; value: string; checked: boolean } | Separator> = [\n {\n name: 'Cursor (.cursor/rules/)',\n value: 'cursor',\n checked: currentIdes.includes('cursor') || detected.some(d => d.id === 'cursor')\n },\n {\n name: 'Windsurf (.windsurf/rules/)',\n value: 'windsurf',\n checked: currentIdes.includes('windsurf') || detected.some(d => d.id === 'windsurf')\n },\n {\n name: 'Antigravity (.agent/rules/)',\n value: 'antigravity',\n checked: currentIdes.includes('antigravity') || detected.some(d => d.id === 'antigravity')\n },\n {\n name: 'Claude Code (.claude/rules/)',\n value: 'claude',\n checked: currentIdes.includes('claude') || detected.some(d => d.id === 'claude')\n },\n {\n name: 'AGENTS.md (single file)',\n value: 'agentsmd',\n checked: currentIdes.includes('agentsmd') || detected.some(d => d.id === 'agentsmd')\n },\n {\n name: 'Gemini CLI (GEMINI.md)',\n value: 'gemini',\n checked: currentIdes.includes('gemini') || detected.some(d => d.id === 'gemini')\n },\n new Separator(),\n {\n name: 'โœ– Quit',\n value: '__quit__',\n checked: false\n },\n ];\n\n return choices;\n}\n\nasync function checkPathExists(absolutePath: string): Promise<boolean> {\n try {\n await fs.access(absolutePath);\n return true;\n } catch {\n return false;\n }\n}\n","import { Command } from 'commander';\nimport { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { ValidationError } from '../../errors/index.js';\nimport { ProjectConfigService, type RulesConfig } from '../../services/project-config.service.js';\nimport { IDE_FORMATS } from '../../config/ide-formats.js';\n\ninterface PresetMetadata {\n slug: string;\n name: string;\n description: string;\n version: string;\n tags: string[];\n stack: Record<string, string | null>;\n}\n\nexport function createRulesInfoCommand(): Command {\n return new Command('info')\n .description('Show current preset information')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n // Load project config\n const projectConfigService = new ProjectConfigService();\n const rulesConfig = await projectConfigService.loadRules();\n\n if (!rulesConfig) {\n throw new ValidationError(\n 'No .jai1/project.json found. Run \"jai1 rules apply\" first.'\n );\n }\n\n if (options.json) {\n console.log(JSON.stringify(rulesConfig, null, 2));\n return;\n }\n\n console.log('๐Ÿ“‹ Current Preset Information\\n');\n\n // Try to read detailed preset info from .jai1/rule-preset/preset.json\n const rulePresetDir = join(process.cwd(), '.jai1', 'rule-preset');\n const presetJsonPath = join(rulePresetDir, 'preset.json');\n let presetMetadata: PresetMetadata | null = null;\n let presetFiles: string[] = [];\n\n try {\n const presetContent = await fs.readFile(presetJsonPath, 'utf-8');\n presetMetadata = JSON.parse(presetContent) as PresetMetadata;\n\n // Count files in preset directory\n const files = await fs.readdir(rulePresetDir);\n presetFiles = files.filter(f => f.endsWith('.mdc'));\n } catch {\n // Preset directory doesn't exist or is corrupted\n }\n\n // Show preset info\n if (presetMetadata) {\n console.log(`Preset: ${presetMetadata.name} (${presetMetadata.slug})`);\n console.log(`Version: ${presetMetadata.version}`);\n console.log(`Description: ${presetMetadata.description}`);\n if (presetMetadata.tags && presetMetadata.tags.length > 0) {\n console.log(`Tags: ${presetMetadata.tags.join(', ')}`);\n }\n } else {\n console.log(`Preset: ${rulesConfig.preset}`);\n console.log(`Version: ${rulesConfig.version}`);\n }\n\n console.log(`Applied at: ${new Date(rulesConfig.appliedAt).toLocaleString()}`);\n\n // Show source of truth\n console.log(`\\nSource of Truth:`);\n if (presetFiles.length > 0) {\n console.log(` ๐Ÿ“ .jai1/rule-preset/ (${presetFiles.length} files)`);\n for (const file of presetFiles.slice(0, 5)) {\n console.log(` โ€ข ${file}`);\n }\n if (presetFiles.length > 5) {\n console.log(` ... and ${presetFiles.length - 5} more`);\n }\n } else {\n console.log(` โš ๏ธ .jai1/rule-preset/ not found`);\n console.log(` Run \"jai1 rules apply\" to create it`);\n }\n\n // Show configured IDEs\n if (rulesConfig.ides && rulesConfig.ides.length > 0) {\n console.log(`\\nConfigured IDEs (${rulesConfig.ides.length}):`);\n for (const ideId of rulesConfig.ides) {\n const format = IDE_FORMATS[ideId];\n if (format) {\n const exists = await checkIdeFilesExist(ideId, format);\n const status = exists ? 'โœ“' : 'โœ—';\n console.log(` ${status} ${format.name} (${format.description})`);\n }\n }\n }\n\n // Show backups\n if (rulesConfig.backups && rulesConfig.backups.length > 0) {\n console.log(`\\nAvailable Backups (${rulesConfig.backups.length}):`);\n for (const backup of rulesConfig.backups.slice(0, 3)) {\n const timestamp = new Date(backup.timestamp).toLocaleString();\n console.log(` โ€ข ${timestamp} - IDEs: ${backup.ides.join(', ')}`);\n }\n if (rulesConfig.backups.length > 3) {\n console.log(` ... and ${rulesConfig.backups.length - 3} more`);\n }\n }\n\n console.log('\\nโ„น๏ธ Commands:');\n console.log(' โ€ข \"jai1 rules sync\" - Regenerate IDE outputs after editing .jai1/rule-preset/');\n console.log(' โ€ข \"jai1 rules restore\" - Restore from backup');\n console.log(' โ€ข \"jai1 rules apply\" - Apply a different preset (replaces current)');\n });\n}\n\nasync function checkPathExists(path: string): Promise<boolean> {\n try {\n await fs.access(join(process.cwd(), path));\n return true;\n } catch {\n return false;\n }\n}\n\nasync function checkIdeFilesExist(ideId: string, format: any): Promise<boolean> {\n try {\n if (ideId === 'agentsmd') {\n return await checkPathExists('AGENTS.md');\n } else if (ideId === 'gemini') {\n return await checkPathExists('GEMINI.md');\n } else {\n return await checkPathExists(format.rulesPath);\n }\n } catch {\n return false;\n }\n}\n","/**\n * Upgrade Command\n * Update jai1-client to the latest version\n * \n * Renamed from 'self-update' to 'upgrade' for clarity\n * - 'update' = update installed components\n * - 'upgrade' = upgrade the CLI tool itself\n */\nimport { Command } from 'commander';\nimport { confirm } from '@inquirer/prompts';\nimport { execSync } from 'child_process';\nimport { ConfigService } from '../services/config.service.js';\nimport { ValidationError } from '../errors/index.js';\nimport { trackAction } from '../services/tracking.service.js';\nimport packageJson from '../../package.json' with { type: 'json' };\nimport { disableUpdateCheck } from '../services/version-check.service.js';\nimport { getCliName } from '../utils/cli-name.js';\n\n// Colors for terminal output\nconst colors = {\n yellow: '\\x1b[33m',\n green: '\\x1b[32m',\n cyan: '\\x1b[36m',\n red: '\\x1b[31m',\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n};\n\n/**\n * Create upgrade command\n */\nexport function createUpgradeCommand(): Command {\n return new Command('upgrade')\n .description('Upgrade CLI client to the latest version')\n .option('--check', 'Only check for updates without installing')\n .option('--force', 'Force upgrade without confirmation')\n .action(async (options: { check?: boolean; force?: boolean }) => {\n await handleUpgrade(options);\n });\n}\n\nasync function handleUpgrade(options: { check?: boolean; force?: boolean }) {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError(`Not initialized. Run \"${getCliName()} auth\" first.`);\n }\n\n try {\n // Fetch latest version from API\n console.log(`${colors.cyan}๐Ÿ” Checking for updates...${colors.reset}`);\n\n const response = await fetch(`${config.apiUrl}/api/versions/client`, {\n headers: {\n 'JAI1-Access-Key': config.accessKey,\n },\n signal: AbortSignal.timeout(10000), // 10 second timeout\n });\n\n if (!response.ok) {\n throw new Error(`Failed to check for updates: ${response.statusText}`);\n }\n\n const data = await response.json() as {\n component: string;\n version: string;\n releasedAt: string;\n releaseNotes?: string;\n minClientVersion?: string;\n };\n const latestVersion = data.version;\n const currentVersion = packageJson.version;\n\n console.log(`\\n${colors.bold}Current version:${colors.reset} ${currentVersion}`);\n console.log(`${colors.bold}Latest version:${colors.reset} ${latestVersion}\\n`);\n\n if (!isNewerVersion(latestVersion, currentVersion)) {\n console.log(`${colors.green}โœ… You're already on the latest version!${colors.reset}\\n`);\n return;\n }\n\n // Show update available\n console.log(`${colors.yellow}โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ${colors.reset}`);\n console.log(`${colors.yellow}โ”‚${colors.reset} ${colors.bold}โฌ†๏ธ Update available!${colors.reset} ${currentVersion} โ†’ ${colors.cyan}${latestVersion}${colors.reset} ${colors.yellow}โ”‚${colors.reset}`);\n console.log(`${colors.yellow}โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ${colors.reset}\\n`);\n\n // If --check only, stop here\n if (options.check) {\n console.log(`${colors.cyan}Run \"${getCliName()} upgrade\" to install the latest version.${colors.reset}\\n`);\n return;\n }\n\n // Ask for confirmation unless --force\n if (!options.force) {\n const shouldUpdate = await confirm({\n message: 'Update to the latest version now?',\n default: true\n });\n\n if (!shouldUpdate) {\n console.log(`${colors.yellow}โธ๏ธ Upgrade cancelled.${colors.reset}\\n`);\n return;\n }\n }\n\n // Perform update\n console.log(`\\n${colors.cyan}๐Ÿ“ฅ Installing latest version...${colors.reset}\\n`);\n\n try {\n // Detect package manager (npm, pnpm, yarn, bun)\n const packageManager = detectPackageManager();\n const installCommand = getInstallCommand(packageManager);\n\n console.log(`${colors.cyan}Using ${packageManager}...${colors.reset}`);\n\n // Execute installation\n execSync(installCommand, {\n stdio: 'inherit',\n env: { ...process.env, FORCE_COLOR: '1' }\n });\n\n console.log(`\\n${colors.green}โœ… Successfully upgraded to version ${latestVersion}!${colors.reset}\\n`);\n\n // Track successful update\n trackAction('upgrade', {\n from_version: currentVersion,\n to_version: latestVersion,\n package_manager: packageManager\n });\n\n // Disable update check for this session since we just upgraded\n disableUpdateCheck();\n\n } catch (error) {\n console.error(`\\n${colors.red}โŒ Upgrade failed!${colors.reset}`);\n console.error(`${colors.red}Error: ${error instanceof Error ? error.message : 'Unknown error'}${colors.reset}\\n`);\n console.error(`${colors.yellow}๐Ÿ’ก You can try manually upgrading with:${colors.reset}`);\n\n // Show manual upgrade command for detected package manager\n const manualCommands = {\n npm: `npm install -g @jvittechs/j@latest`,\n pnpm: `pnpm add -g @jvittechs/j@latest`,\n yarn: `yarn global add @jvittechs/j@latest`,\n bun: `bun add -g @jvittechs/j@latest`\n };\n\n console.error(` ${colors.cyan}${manualCommands[packageManager]}${colors.reset}\\n`);\n throw error;\n }\n\n } catch (error) {\n if (error instanceof Error && error.message.includes('Failed to check')) {\n throw new ValidationError('Cannot connect to update server. Please check your internet connection.');\n }\n throw error;\n }\n}\n\n/**\n * Compare versions to check if remote is newer than local\n */\nfunction isNewerVersion(remote: string, local: string): boolean {\n const remoteParts = remote.split('.').map(Number);\n const localParts = local.split('.').map(Number);\n\n for (let i = 0; i < 3; i++) {\n const r = remoteParts[i] || 0;\n const l = localParts[i] || 0;\n\n if (r > l) return true;\n if (r < l) return false;\n }\n\n return false;\n}\n\n/**\n * Detect which package manager was used to install jai1\n * Priority:\n * 1. Check how jai1 was installed (via global bin path) - MOST RELIABLE\n * 2. Check npm_config_user_agent environment variable\n * 3. Default to npm (safest fallback)\n * \n * Supports both Windows and Unix paths\n */\nfunction detectPackageManager(): 'npm' | 'pnpm' | 'yarn' | 'bun' {\n // 1. Try to detect from actual jai1 installation path (MOST RELIABLE)\n try {\n const jai1Path = execSync('which j || which jai1 || where j || where jai1', {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'ignore']\n }).trim();\n\n if (jai1Path) {\n // Normalize path separators for consistent matching (Windows uses \\, Unix uses /)\n const normalizedPath = jai1Path.toLowerCase().replace(/\\\\/g, '/');\n\n // pnpm global paths:\n // - Unix: ~/.local/share/pnpm or ~/Library/pnpm\n // - Windows: C:/Users/username/AppData/Local/pnpm\n if (normalizedPath.includes('/pnpm/')) return 'pnpm';\n\n // yarn global paths:\n // - Unix: ~/.yarn or ~/Library/Yarn\n // - Windows: C:/Users/username/AppData/Local/Yarn\n if (normalizedPath.includes('/.yarn/') || normalizedPath.includes('/yarn/')) return 'yarn';\n\n // bun global paths:\n // - Unix: ~/.bun\n // - Windows: C:/Users/username/.bun\n if (normalizedPath.includes('/.bun/')) return 'bun';\n\n // npm global paths:\n // Unix:\n // - nvm: ~/.nvm/versions/node/vX.X.X/bin/\n // - system: /usr/local/bin/ or /usr/bin/\n // - npm prefix: ~/.npm-global/bin/ or similar\n // - node_modules: anywhere with /node_modules/.bin/\n // Windows:\n // - AppData: C:/Users/username/AppData/Roaming/npm/\n // - Program Files: C:/Program Files/nodejs/\n // - node_modules: anywhere with /node_modules/\n if (normalizedPath.includes('/.nvm/') ||\n normalizedPath.includes('/node_modules/') ||\n normalizedPath.includes('/lib/node_modules/') ||\n normalizedPath.includes('/npm-global/') ||\n normalizedPath.includes('/usr/local/bin/') ||\n normalizedPath.includes('/usr/bin/') ||\n normalizedPath.includes('/appdata/roaming/npm/') ||\n normalizedPath.includes('/program files/nodejs/')) {\n return 'npm';\n }\n }\n } catch {\n // Ignore errors, continue with other detection methods\n }\n\n // 2. Check user agent for package manager (when running via npm/pnpm/yarn scripts)\n const userAgent = process.env.npm_config_user_agent || '';\n\n if (userAgent.includes('pnpm')) return 'pnpm';\n if (userAgent.includes('yarn')) return 'yarn';\n if (userAgent.includes('bun')) return 'bun';\n if (userAgent.includes('npm')) return 'npm';\n\n // 3. Default to npm (safest and most common)\n // DO NOT check for available package managers here - it causes false positives!\n // If user has pnpm installed but used npm to install jai1, we should use npm.\n return 'npm';\n}\n\n/**\n * Get install command for package manager\n */\nfunction getInstallCommand(packageManager: 'npm' | 'pnpm' | 'yarn' | 'bun'): string {\n const packageName = '@jvittechs/j@latest';\n\n switch (packageManager) {\n case 'pnpm':\n return `pnpm add -g ${packageName}`;\n case 'yarn':\n return `yarn global add ${packageName}`;\n case 'bun':\n return `bun add -g ${packageName}`;\n case 'npm':\n default:\n return `npm install -g ${packageName}`;\n }\n}\n","/**\n * Clean Command\n * Clean up backups, cache, and temporary files\n * \n * Renamed from 'clear-backups' to 'clean' for broader scope\n */\nimport { Command } from 'commander';\nimport { confirm, select } from '@inquirer/prompts';\nimport { ComponentsService } from '../services/components.service.js';\nimport { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { existsSync } from 'fs';\nimport { selectTheme } from '../utils/prompt-theme.js';\n\ninterface CleanTarget {\n name: string;\n description: string;\n path: string;\n check: () => Promise<{ exists: boolean; count?: number; size?: string }>;\n clean: () => Promise<void>;\n}\n\n/**\n * Create clean command\n */\nexport function createCleanCommand(): Command {\n return new Command('clean')\n .description('Clean up backups, cache, and temporary files')\n .option('-y, --yes', 'Skip confirmation')\n .option('--backups', 'Clean only backup files')\n .option('--all', 'Clean all (backups + cache)')\n .action(async (options: { yes?: boolean; backups?: boolean; all?: boolean }) => {\n await handleClean(options);\n });\n}\n\nasync function handleClean(options: { yes?: boolean; backups?: boolean; all?: boolean }) {\n const cwd = process.cwd();\n const service = new ComponentsService();\n\n // Define clean targets\n const targets: CleanTarget[] = [\n {\n name: 'Backups',\n description: 'Component backup files (.jai1_backup/)',\n path: join(cwd, '.jai1_backup'),\n check: async () => {\n const backups = await service.listBackups(cwd);\n return { exists: backups.length > 0, count: backups.length };\n },\n clean: async () => {\n await service.clearBackups(cwd);\n }\n },\n // Future targets can be added here:\n // {\n // name: 'Cache',\n // description: 'Downloaded component cache',\n // path: join(homedir(), '.jai1', 'cache'),\n // ...\n // }\n ];\n\n console.log('๐Ÿงน Clean up CLI client files\\n');\n\n // Check what's available to clean\n const availableTargets: Array<{ target: CleanTarget; info: { exists: boolean; count?: number } }> = [];\n\n for (const target of targets) {\n const info = await target.check();\n if (info.exists) {\n availableTargets.push({ target, info });\n }\n }\n\n if (availableTargets.length === 0) {\n console.log('โœจ Nothing to clean up!');\n return;\n }\n\n // If specific option provided\n if (options.backups) {\n const backupTarget = targets.find(t => t.name === 'Backups');\n if (backupTarget) {\n await cleanTarget(backupTarget, options.yes);\n }\n return;\n }\n\n if (options.all) {\n for (const { target } of availableTargets) {\n await cleanTarget(target, options.yes);\n }\n return;\n }\n\n // Interactive mode\n console.log('Found the following items:\\n');\n for (const { target, info } of availableTargets) {\n const countStr = info.count ? ` (${info.count} items)` : '';\n console.log(` ๐Ÿ“ ${target.name}${countStr}`);\n console.log(` ${target.description}`);\n console.log(` Path: ${target.path}\\n`);\n }\n\n const action = await select({\n message: 'What do you want to clean?',\n choices: [\n ...availableTargets.map(({ target, info }) => ({\n name: `${target.name}${info.count ? ` (${info.count} items)` : ''}`,\n value: target.name\n })),\n { name: '๐Ÿงน Clean all', value: 'all' },\n { name: 'โŒ Cancel', value: 'cancel' }\n ],\n theme: selectTheme,\n });\n\n if (action === 'cancel') {\n console.log('\\nโŒ Operation cancelled.');\n return;\n }\n\n if (action === 'all') {\n for (const { target } of availableTargets) {\n await cleanTarget(target, options.yes);\n }\n } else {\n const target = targets.find(t => t.name === action);\n if (target) {\n await cleanTarget(target, options.yes);\n }\n }\n}\n\nasync function cleanTarget(target: CleanTarget, skipConfirm?: boolean): Promise<void> {\n const info = await target.check();\n\n if (!info.exists) {\n console.log(`โœจ ${target.name}: Nothing to clean.`);\n return;\n }\n\n const countStr = info.count ? ` (${info.count} items)` : '';\n\n if (!skipConfirm) {\n const confirmed = await confirm({\n message: `Delete ${target.name}${countStr}?`,\n default: false\n });\n\n if (!confirmed) {\n console.log(`โญ๏ธ Skipped ${target.name}`);\n return;\n }\n }\n\n try {\n await target.clean();\n console.log(`โœ… Cleaned ${target.name}${countStr}`);\n } catch (error) {\n console.error(`โŒ Failed to clean ${target.name}: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n","import { Command } from 'commander';\nimport { RedmineConfigService } from '../../services/redmine-config.service.js';\nimport { checkConnectivity } from '../../services/redmine-connectivity.service.js';\n\ninterface CheckOptions {\n config?: string;\n json?: boolean;\n}\n\n/**\n * Create redmine check command\n */\nexport function createRedmineCheckCommand(): Command {\n const cmd = new Command('check')\n .description('Check Redmine connectivity')\n .option('-c, --config <path>', 'Config file path', 'redmine.config.yaml')\n .option('--json', 'Output as JSON')\n .action(async (options: CheckOptions) => {\n await handleRedmineCheck(options);\n });\n\n return cmd;\n}\n\nasync function handleRedmineCheck(options: CheckOptions): Promise<void> {\n const configService = new RedmineConfigService(options.config);\n const config = await configService.load();\n\n const result = await checkConnectivity(config);\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n if (result.success) {\n console.log('โœ…', result.message);\n if (result.details?.project) {\n console.log(\n ` Project: ${result.details.project.name} (${result.details.project.identifier})`\n );\n console.log(` Project ID: ${result.details.project.id}`);\n }\n } else {\n console.error('โŒ', result.message);\n process.exit(4);\n }\n }\n}\n","import { readFile } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport type { RedmineConfig } from '../types/redmine.types.js';\nimport { RedmineConfigSchema } from '../types/redmine.types.js';\nimport { parse } from 'yaml';\nimport { z } from 'zod';\nimport { ValidationError, NotFoundError } from '../errors/index.js';\n\n/**\n * Service for managing Redmine configuration\n */\nexport class RedmineConfigService {\n private configPath: string;\n\n constructor(configPath?: string) {\n this.configPath = configPath ?? resolve(process.cwd(), 'redmine.config.yaml');\n }\n\n /**\n * Load Redmine configuration from YAML file\n */\n async load(): Promise<RedmineConfig> {\n try {\n const content = await readFile(this.configPath, 'utf-8');\n const rawConfig = parse(content);\n\n return RedmineConfigSchema.parse(rawConfig);\n } catch (error) {\n if (error instanceof z.ZodError) {\n throw new ValidationError(`Configuration validation failed: ${error.message}`);\n }\n\n if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {\n throw new NotFoundError(`Configuration file not found: ${this.configPath}`);\n }\n\n throw new ValidationError(\n `Failed to load configuration: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Validate configuration object\n */\n validate(config: unknown): RedmineConfig {\n try {\n return RedmineConfigSchema.parse(config);\n } catch (error) {\n if (error instanceof z.ZodError) {\n throw new ValidationError(`Configuration validation failed: ${error.message}`);\n }\n throw error;\n }\n }\n\n /**\n * Get config file path\n */\n getConfigPath(): string {\n return this.configPath;\n }\n}\n\n// Export schema for use in types file\nexport { RedmineConfigSchema };\n","import { readFile } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport { parse } from 'yaml';\nimport { z } from 'zod';\n\nconst RetryConfigSchema = z.object({\n retries: z.number().min(0).default(3),\n baseMs: z.number().min(100).default(300),\n});\n\nconst FilenameConfigSchema = z.object({\n pattern: z.string().default('{issueId}-{slug}.md'),\n slug: z.object({\n maxLength: z.number().min(10).default(80),\n dedupe: z.boolean().default(true),\n lowercase: z.boolean().default(true),\n }),\n renameOnTitleChange: z.boolean().default(false),\n});\n\nconst CommentsConfigSchema = z.object({\n anchors: z.object({\n start: z.string().default('<!-- redmine:comments:start -->'),\n end: z.string().default('<!-- redmine:comments:end -->'),\n }),\n trackBy: z.enum(['journalId', 'createdOn']).default('journalId'),\n});\n\nconst DefaultsConfigSchema = z.object({\n include: z.array(z.enum(['journals', 'relations', 'attachments'])).default(['journals']),\n status: z.string().default('*'),\n pageSize: z.number().min(1).max(100).default(100),\n concurrency: z.number().min(1).max(10).default(4),\n retry: RetryConfigSchema.default({}),\n});\n\nconst ProjectConfigSchema = z.object({\n id: z.number(),\n identifier: z.string(),\n});\n\nconst RedmineConfigSchema = z.object({\n baseUrl: z.string().url(),\n apiAccessToken: z.string().min(1),\n project: ProjectConfigSchema,\n outputDir: z.string().default('.jai1/redmine'),\n defaults: DefaultsConfigSchema.default({}),\n filename: FilenameConfigSchema.default({}),\n comments: CommentsConfigSchema.default({}),\n});\n\nexport type RedmineConfig = z.infer<typeof RedmineConfigSchema>;\nexport type RetryConfig = z.infer<typeof RetryConfigSchema>;\nexport type FilenameConfig = z.infer<typeof FilenameConfigSchema>;\nexport type CommentsConfig = z.infer<typeof CommentsConfigSchema>;\nexport type DefaultsConfig = z.infer<typeof DefaultsConfigSchema>;\nexport type ProjectConfig = z.infer<typeof ProjectConfigSchema>;\n\n// Export schema for use in service\nexport { RedmineConfigSchema };\n","import { fetch } from 'undici';\nimport pRetry from 'p-retry';\nimport pLimit from 'p-limit';\nimport type { RedmineConfig, RetryConfig } from './config.js';\n\nexport interface RedmineIssue {\n id: number;\n subject: string;\n description: string;\n status: { id: number; name: string };\n priority: { id: number; name: string };\n author: { id: number; name: string };\n assigned_to?: { id: number; name: string };\n created_on: string;\n updated_on: string;\n project: { id: number; name: string };\n tracker: { id: number; name: string };\n journals?: RedmineJournal[];\n relations?: RedmineRelation[];\n attachments?: RedmineAttachment[];\n}\n\nexport interface RedmineJournal {\n id: number;\n user: { id: number; name: string };\n notes?: string;\n created_on: string;\n details?: Array<{\n name: string;\n old_value: string;\n new_value: string;\n }>;\n}\n\nexport interface RedmineRelation {\n id: number;\n issue_to_id: number;\n relation_type: string;\n delay?: number;\n}\n\nexport interface RedmineAttachment {\n id: number;\n filename: string;\n filesize: number;\n content_type: string;\n author: { id: number; name: string };\n created_on: string;\n content_url?: string;\n}\n\nexport interface RedmineIssueResponse {\n issue: RedmineIssue;\n}\n\nexport interface RedmineIssuesResponse {\n issues: RedmineIssue[];\n total_count: number;\n offset: number;\n limit: number;\n}\n\nexport interface RedmineProjectResponse {\n project: {\n id: number;\n identifier: string;\n name: string;\n created_on: string;\n updated_on: string;\n };\n}\n\nexport class RedmineApiError extends Error {\n constructor(\n message: string,\n public status?: number,\n public response?: unknown\n ) {\n super(message);\n this.name = 'RedmineApiError';\n }\n}\n\nexport class RedmineApiClient {\n private readonly baseUrl: string;\n private readonly apiAccessToken: string;\n private readonly retryConfig: RetryConfig;\n private readonly concurrencyLimit: pLimit.Limit;\n\n constructor(config: RedmineConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, '');\n this.apiAccessToken = config.apiAccessToken;\n this.retryConfig = config.defaults.retry;\n this.concurrencyLimit = pLimit(config.defaults.concurrency);\n }\n\n private async request<T>(path: string, options: RequestInit = {}): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n\n const headers = {\n 'X-Redmine-API-Key': this.apiAccessToken,\n 'Content-Type': 'application/json',\n ...options.headers,\n };\n\n const attempt = async (): Promise<T> => {\n const response = await fetch(url, {\n ...options,\n headers,\n });\n\n if (!response.ok) {\n let errorMessage = `HTTP ${response.status}: ${response.statusText}`;\n\n try {\n const errorData = (await response.json()) as { errors?: string[] };\n if (errorData.errors && Array.isArray(errorData.errors)) {\n errorMessage = errorData.errors.join(', ');\n }\n } catch {\n // Ignore JSON parsing errors for error response\n }\n\n throw new RedmineApiError(errorMessage, response.status);\n }\n\n const contentType = response.headers.get('content-type');\n if (contentType && contentType.includes('application/json')) {\n return response.json() as Promise<T>;\n }\n\n return response.text() as unknown as T;\n };\n\n return pRetry(attempt, {\n retries: this.retryConfig.retries,\n onFailedAttempt: (error) => {\n console.warn(\n `Request failed (attempt ${error.attemptNumber}/${error.retriesLeft + 1}): ${error.message}`\n );\n },\n factor: 2,\n minTimeout: this.retryConfig.baseMs,\n maxTimeout: this.retryConfig.baseMs * 8,\n });\n }\n\n async checkConnectivity(): Promise<boolean> {\n try {\n await this.request<RedmineProjectResponse>('/projects.json?limit=1');\n return true;\n } catch (error) {\n if (error instanceof RedmineApiError) {\n throw error;\n }\n throw new RedmineApiError(\n `Connectivity check failed: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n async getProject(identifier: string): Promise<RedmineProjectResponse> {\n return this.request<RedmineProjectResponse>(`/projects/${identifier}.json`);\n }\n\n async getIssue(issueId: number, include?: string[]): Promise<RedmineIssueResponse> {\n const params = new URLSearchParams();\n if (include && include.length > 0) {\n params.append('include', include.join(','));\n }\n\n const path = `/issues/${issueId}.json${params.toString() ? `?${params.toString()}` : ''}`;\n return this.request<RedmineIssueResponse>(path);\n }\n\n async getIssues(\n projectId: number,\n options: {\n status?: string;\n pageSize?: number;\n offset?: number;\n include?: string[];\n updatedSince?: string;\n } = {}\n ): Promise<RedmineIssuesResponse> {\n const params = new URLSearchParams();\n params.append('project_id', projectId.toString());\n\n if (options.status && options.status !== '*') {\n params.append('status_id', options.status);\n }\n\n if (options.pageSize) {\n params.append('limit', options.pageSize.toString());\n }\n\n if (options.offset) {\n params.append('offset', options.offset.toString());\n }\n\n if (options.include && options.include.length > 0) {\n params.append('include', options.include.join(','));\n }\n\n if (options.updatedSince) {\n params.append('updated_on', `>=${options.updatedSince}`);\n }\n\n const path = `/issues.json?${params.toString()}`;\n return this.request<RedmineIssuesResponse>(path);\n }\n\n async getAllIssues(\n projectId: number,\n options: {\n status?: string;\n pageSize?: number;\n include?: string[];\n updatedSince?: string;\n onProgress?: (current: number, total: number) => void;\n } = {}\n ): Promise<RedmineIssue[]> {\n const pageSize = options.pageSize || 100;\n const allIssues: RedmineIssue[] = [];\n let offset = 0;\n let hasMore = true;\n\n while (hasMore) {\n const response = await this.getIssues(projectId, {\n ...options,\n pageSize,\n offset,\n });\n\n allIssues.push(...response.issues);\n\n if (options.onProgress) {\n options.onProgress(allIssues.length, response.total_count);\n }\n\n hasMore = allIssues.length < response.total_count;\n offset += pageSize;\n }\n\n return allIssues;\n }\n\n async getIssuesConcurrently(\n projectId: number,\n options: {\n status?: string;\n pageSize?: number;\n include?: string[];\n updatedSince?: string;\n onProgress?: (current: number, total: number) => void;\n } = {}\n ): Promise<RedmineIssue[]> {\n const pageSize = options.pageSize || 100;\n\n // First, get the total count\n const initialResponse = await this.getIssues(projectId, {\n ...options,\n pageSize: 1,\n });\n\n const totalCount = initialResponse.total_count;\n const totalPages = Math.ceil(totalCount / pageSize);\n\n const pagePromises = Array.from({ length: totalPages }, (_, index) => {\n const offset = index * pageSize;\n\n return this.concurrencyLimit(async () => {\n const response = await this.getIssues(projectId, {\n ...options,\n pageSize,\n offset,\n });\n\n if (options.onProgress) {\n options.onProgress(offset + response.issues.length, totalCount);\n }\n\n return response.issues;\n });\n });\n\n const pageResults = await Promise.all(pagePromises);\n return pageResults.flat();\n }\n}\n","import type { RedmineConfig } from '../types/redmine.types.js';\nimport { RedmineApiClient, RedmineApiError } from '../api.js';\n\nexport interface ConnectivityResult {\n success: boolean;\n message: string;\n details?: {\n baseUrl: string;\n project?: {\n id: number;\n identifier: string;\n name: string;\n };\n };\n}\n\nexport async function checkConnectivity(config: RedmineConfig): Promise<ConnectivityResult> {\n const client = new RedmineApiClient(config);\n\n try {\n const isConnected = await client.checkConnectivity();\n\n if (!isConnected) {\n return {\n success: false,\n message: 'Failed to connect to Redmine API',\n details: {\n baseUrl: config.baseUrl,\n },\n };\n }\n\n const projectResponse = await client.getProject(config.project.identifier);\n\n return {\n success: true,\n message: `Successfully connected to Redmine and found project \"${projectResponse.project.name}\"`,\n details: {\n baseUrl: config.baseUrl,\n project: projectResponse.project,\n },\n };\n } catch (error) {\n if (error instanceof RedmineApiError) {\n let message = `Redmine API error: ${error.message}`;\n\n if (error.status === 401) {\n message = 'Authentication failed - please check your API access token';\n } else if (error.status === 403) {\n message = 'Access forbidden - insufficient permissions for the project';\n } else if (error.status === 404) {\n message = `Project \"${config.project.identifier}\" not found or inaccessible`;\n }\n\n return {\n success: false,\n message,\n details: {\n baseUrl: config.baseUrl,\n },\n };\n }\n\n return {\n success: false,\n message: `Connection failed: ${error instanceof Error ? error.message : String(error)}`,\n details: {\n baseUrl: config.baseUrl,\n },\n };\n }\n}\n","import { Command } from 'commander';\nimport { RedmineConfigService } from '../../services/redmine-config.service.js';\nimport { syncIssue, extractIssueIdFromUrl } from '../../sync-issue.js';\nimport { ValidationError } from '../../errors/index.js';\n\ninterface SyncIssueOptions {\n id?: string;\n url?: string;\n dryRun?: boolean;\n config?: string;\n outputDir?: string;\n json?: boolean;\n}\n\n/**\n * Create redmine sync issue command\n */\nexport function createSyncIssueCommand(): Command {\n const cmd = new Command('issue')\n .description('Sync a single issue')\n .option('-i, --id <number>', 'Issue ID')\n .option('-u, --url <url>', 'Issue URL')\n .option('--dry-run', 'Preview without making changes')\n .option('-c, --config <path>', 'Config file path')\n .option('-o, --output-dir <path>', 'Output directory')\n .option('--json', 'Output as JSON')\n .action(async (options: SyncIssueOptions) => {\n await handleSyncIssue(options);\n });\n\n return cmd;\n}\n\nasync function handleSyncIssue(options: SyncIssueOptions): Promise<void> {\n const configService = new RedmineConfigService(options.config);\n const config = await configService.load();\n\n let issueId: number;\n\n if (options.id) {\n issueId = parseInt(options.id, 10);\n if (isNaN(issueId)) {\n throw new ValidationError('Invalid issue ID');\n }\n } else if (options.url) {\n const extractedId = extractIssueIdFromUrl(options.url);\n if (!extractedId) {\n throw new ValidationError('Could not extract issue ID from URL');\n }\n issueId = extractedId;\n } else {\n throw new ValidationError('Either --id or --url must be provided');\n }\n\n const result = await syncIssue(issueId, config, {\n dryRun: options.dryRun,\n outputDir: options.outputDir,\n });\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n if (result.success) {\n const icon = result.action === 'skipped' ? 'โญ๏ธ' : 'โœ…';\n console.log(`${icon} ${result.message}`);\n if (result.filePath) {\n console.log(` File: ${result.filePath}`);\n }\n } else {\n console.error('โŒ', result.message);\n process.exit(4);\n }\n }\n}\n","import { resolve, relative } from 'node:path';\nimport type { RedmineConfig } from './config.js';\nimport { RedmineApiClient } from './api.js';\nimport {\n mapIssueToFrontmatter,\n mapIssueToContent,\n mapJournalsToComments,\n extractNewJournals,\n shouldUpdateIssue,\n shouldUpdateComments,\n} from './mappers.js';\nimport { generateFilename } from './slug.util.js';\nimport {\n readMarkdownFile,\n writeMarkdownFile,\n extractIssueIdFromFrontmatter,\n extractLastJournalId,\n} from './file.util.js';\n\nexport interface SyncIssueOptions {\n dryRun?: boolean;\n outputDir?: string;\n}\n\nexport interface SyncIssueResult {\n success: boolean;\n issueId: number;\n filename: string;\n filePath: string;\n action: 'created' | 'updated' | 'skipped';\n message: string;\n changes?: {\n content?: boolean;\n comments?: boolean;\n frontmatter?: boolean;\n };\n}\n\nexport async function syncIssue(\n issueId: number,\n config: RedmineConfig,\n options: SyncIssueOptions = {}\n): Promise<SyncIssueResult> {\n const client = new RedmineApiClient(config);\n const outputDir = options.outputDir || config.outputDir;\n\n try {\n const include = config.defaults.include;\n const response = await client.getIssue(issueId, include);\n const issue = response.issue;\n\n const filename = generateFilename(issue.id, issue.subject, config.filename);\n const filePath = resolve(outputDir, filename);\n const relativePath = relative(process.cwd(), filePath);\n\n const existingFile = await readMarkdownFile(filePath);\n const existingIssueId = extractIssueIdFromFrontmatter(existingFile.frontmatter);\n const existingLastJournalId = extractLastJournalId(existingFile.frontmatter);\n\n if (existingIssueId && existingIssueId !== issue.id) {\n return {\n success: false,\n issueId: issue.id,\n filename,\n filePath: relativePath,\n action: 'skipped',\n message: `File ${filename} contains issue ${existingIssueId}, not ${issue.id}`,\n };\n }\n\n const needsUpdate = shouldUpdateIssue(issue, existingFile.frontmatter);\n const needsCommentsUpdate = shouldUpdateComments(\n issue.journals || [],\n existingFile.frontmatter\n );\n\n if (!needsUpdate && !needsCommentsUpdate) {\n return {\n success: true,\n issueId: issue.id,\n filename,\n filePath: relativePath,\n action: 'skipped',\n message: `Issue ${issueId} is already up to date`,\n };\n }\n\n const frontmatter = mapIssueToFrontmatter(issue);\n const content = mapIssueToContent(issue);\n\n let comments: string | undefined;\n if (needsCommentsUpdate && issue.journals) {\n const newJournals = extractNewJournals(issue.journals, existingLastJournalId);\n if (newJournals.length > 0) {\n const newComments = mapJournalsToComments(newJournals, config.comments);\n if (existingFile.comments) {\n comments = `${existingFile.comments}\\n\\n---\\n\\n${newComments}`;\n } else {\n comments = newComments;\n }\n } else {\n comments = existingFile.comments || undefined;\n }\n } else {\n comments = existingFile.comments || undefined;\n }\n\n const changes: SyncIssueResult['changes'] = {};\n if (needsUpdate) {\n changes.frontmatter = true;\n changes.content = true;\n }\n if (needsCommentsUpdate) {\n changes.comments = true;\n }\n\n if (options.dryRun) {\n const action = existingIssueId ? 'updated' : 'created';\n return {\n success: true,\n issueId: issue.id,\n filename,\n filePath: relativePath,\n action,\n message: `Would ${action} issue ${issueId} (dry run)`,\n changes,\n };\n }\n\n await writeMarkdownFile(\n filePath,\n {\n frontmatter,\n content,\n comments,\n },\n config.comments\n );\n\n const action = existingIssueId ? 'updated' : 'created';\n return {\n success: true,\n issueId: issue.id,\n filename,\n filePath: relativePath,\n action,\n message: `Successfully ${action} issue ${issueId}`,\n changes,\n };\n } catch (error) {\n return {\n success: false,\n issueId,\n filename: '',\n filePath: '',\n action: 'skipped',\n message: `Failed to sync issue ${issueId}: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\nexport function extractIssueIdFromUrl(url: string): number | null {\n const match = url.match(/\\/issues\\/(\\d+)(?:\\/|$)/);\n if (match) {\n const issueId = parseInt(match[1], 10);\n return isNaN(issueId) ? null : issueId;\n }\n return null;\n}\n","import type { RedmineIssue, RedmineJournal } from './api.js';\nimport type { CommentsConfig } from './config.js';\n\nexport interface IssueFrontmatter {\n id: number;\n subject: string;\n status: string;\n priority: string;\n author: string;\n assigned_to?: string;\n created_on: string;\n updated_on: string;\n project: string;\n tracker: string;\n lastJournalId?: number;\n relations?: Array<{\n type: string;\n issue_id: number;\n delay?: number;\n }>;\n attachments?: Array<{\n id: number;\n filename: string;\n filesize: number;\n content_type: string;\n author: string;\n created_on: string;\n content_url?: string;\n }>;\n}\n\nexport function mapIssueToFrontmatter(issue: RedmineIssue): IssueFrontmatter {\n const frontmatter: IssueFrontmatter = {\n id: issue.id,\n subject: issue.subject,\n status: issue.status.name,\n priority: issue.priority.name,\n author: issue.author.name,\n created_on: issue.created_on,\n updated_on: issue.updated_on,\n project: issue.project.name,\n tracker: issue.tracker.name,\n };\n\n if (issue.assigned_to) {\n frontmatter.assigned_to = issue.assigned_to.name;\n }\n\n if (issue.relations && issue.relations.length > 0) {\n frontmatter.relations = issue.relations.map((relation) => ({\n type: relation.relation_type,\n issue_id: relation.issue_to_id,\n delay: relation.delay,\n }));\n }\n\n if (issue.attachments && issue.attachments.length > 0) {\n frontmatter.attachments = issue.attachments.map((attachment) => ({\n id: attachment.id,\n filename: attachment.filename,\n filesize: attachment.filesize,\n content_type: attachment.content_type,\n author: attachment.author.name,\n created_on: attachment.created_on,\n content_url: attachment.content_url,\n }));\n }\n\n if (issue.journals && issue.journals.length > 0) {\n const lastJournal = issue.journals.reduce((latest, journal) =>\n journal.id > latest.id ? journal : latest\n );\n frontmatter.lastJournalId = lastJournal.id;\n }\n\n return frontmatter;\n}\n\nexport function mapIssueToContent(issue: RedmineIssue): string {\n let content = '';\n\n if (issue.description) {\n content += issue.description;\n }\n\n return content;\n}\n\nexport function mapJournalsToComments(journals: RedmineJournal[], config: CommentsConfig): string {\n if (!journals || journals.length === 0) {\n return '';\n }\n\n let comments = '';\n\n const sortedJournals = [...journals].sort((a, b) => {\n if (config.trackBy === 'journalId') {\n return a.id - b.id;\n }\n return new Date(a.created_on).getTime() - new Date(b.created_on).getTime();\n });\n\n for (const journal of sortedJournals) {\n if (!journal.notes || journal.notes.trim() === '') {\n continue;\n }\n\n const date = new Date(journal.created_on).toISOString().split('T')[0];\n const time = new Date(journal.created_on).toTimeString().split(' ')[0].substring(0, 5);\n\n comments += `## ${journal.user.name} - ${date} ${time}\\n\\n`;\n comments += `${journal.notes}\\n\\n`;\n\n if (journal.details && journal.details.length > 0) {\n comments += '**Changes:**\\n';\n for (const detail of journal.details) {\n const oldValue = detail.old_value || '(none)';\n const newValue = detail.new_value || '(none)';\n comments += `- ${detail.name}: ${oldValue} โ†’ ${newValue}\\n`;\n }\n comments += '\\n';\n }\n\n comments += '---\\n\\n';\n }\n\n return comments.trim();\n}\n\nexport function extractNewJournals(\n allJournals: RedmineJournal[],\n lastJournalId: number | null\n): RedmineJournal[] {\n if (!lastJournalId) {\n return allJournals;\n }\n\n return allJournals.filter((journal) => journal.id > lastJournalId);\n}\n\nexport function shouldUpdateIssue(\n remoteIssue: RedmineIssue,\n localFrontmatter: Record<string, unknown>\n): boolean {\n const localUpdatedOn = localFrontmatter.updated_on as string;\n const remoteUpdatedOn = remoteIssue.updated_on;\n\n if (!localUpdatedOn) {\n return true;\n }\n\n return new Date(remoteUpdatedOn) > new Date(localUpdatedOn);\n}\n\nexport function shouldUpdateComments(\n remoteJournals: RedmineJournal[],\n localFrontmatter: Record<string, unknown>\n): boolean {\n const localLastJournalId = localFrontmatter.lastJournalId as number;\n\n if (!localLastJournalId) {\n return remoteJournals.length > 0;\n }\n\n return remoteJournals.some((journal) => journal.id > localLastJournalId);\n}\n","import slugify from 'slugify';\nimport type { FilenameConfig } from './config.js';\n\nexport function generateSlug(\n title: string,\n config: FilenameConfig['slug'],\n existingSlugs: Set<string> = new Set()\n): string {\n let slug = slugify(title, {\n lower: config.lowercase,\n strict: true,\n remove: /[^\\w\\s-]/g,\n });\n\n slug = slug.substring(0, config.maxLength);\n\n if (!config.dedupe) {\n return slug;\n }\n\n let finalSlug = slug;\n let counter = 1;\n\n while (existingSlugs.has(finalSlug)) {\n const suffix = `-${counter}`;\n const maxLength = config.maxLength - suffix.length;\n finalSlug = `${slug.substring(0, maxLength)}${suffix}`;\n counter++;\n }\n\n existingSlugs.add(finalSlug);\n return finalSlug;\n}\n\nexport function generateFilename(\n issueId: number,\n title: string,\n config: FilenameConfig,\n existingSlugs: Set<string> = new Set()\n): string {\n const slug = generateSlug(title, config.slug, existingSlugs);\n\n return config.pattern.replace('{issueId}', issueId.toString()).replace('{slug}', slug);\n}\n","import { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { dirname } from 'node:path';\nimport matter from 'gray-matter';\nimport type { CommentsConfig } from './config.js';\n\nexport interface MarkdownData {\n frontmatter: Record<string, unknown>;\n content: string;\n comments?: string;\n}\n\nexport interface ParsedMarkdown {\n frontmatter: Record<string, unknown>;\n content: string;\n comments: string | null;\n rawContent: string;\n}\n\nexport async function ensureDir(filePath: string): Promise<void> {\n const dir = dirname(filePath);\n await mkdir(dir, { recursive: true });\n}\n\nexport async function readMarkdownFile(filePath: string): Promise<ParsedMarkdown> {\n try {\n const content = await readFile(filePath, 'utf-8');\n return parseMarkdownContent(content);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return {\n frontmatter: {},\n content: '',\n comments: null,\n rawContent: '',\n };\n }\n throw error;\n }\n}\n\nexport function parseMarkdownContent(content: string): ParsedMarkdown {\n if (!content.trim()) {\n return {\n frontmatter: {},\n content: '',\n comments: null,\n rawContent: content,\n };\n }\n\n let frontmatter: Record<string, unknown> = {};\n let body: string = content;\n try {\n const parsed = matter(content);\n frontmatter = parsed.data;\n body = parsed.content;\n } catch (e) {\n // If YAML parsing fails, treat as no frontmatter\n console.warn(`โš ๏ธ Invalid YAML frontmatter, skipping frontmatter parsing`);\n }\n\n const comments = extractCommentsSection(body);\n const mainContent = removeCommentsSection(body);\n\n return {\n frontmatter,\n content: mainContent,\n comments,\n rawContent: content,\n };\n}\n\nexport function extractCommentsSection(content: string): string | null {\n const startMatch = content.match(/<!-- redmine:comments:start -->/);\n const endMatch = content.match(/<!-- redmine:comments:end -->/);\n\n if (!startMatch || !endMatch) {\n return null;\n }\n\n const startIndex = content.indexOf(startMatch[0]) + startMatch[0].length;\n const endIndex = content.indexOf(endMatch[0]);\n\n if (startIndex >= endIndex) {\n return null;\n }\n\n return content.substring(startIndex, endIndex).trim();\n}\n\nexport function removeCommentsSection(content: string): string {\n const startMatch = content.match(/<!-- redmine:comments:start -->/);\n const endMatch = content.match(/<!-- redmine:comments:end -->/);\n\n if (!startMatch || !endMatch) {\n return content;\n }\n\n const startIndex = content.indexOf(startMatch[0]);\n const endIndex = content.indexOf(endMatch[0]) + endMatch[0].length;\n\n return content.substring(0, startIndex) + content.substring(endIndex).trim();\n}\n\nexport function buildMarkdownContent(data: MarkdownData, config: CommentsConfig): string {\n let content = '';\n\n if (Object.keys(data.frontmatter).length > 0) {\n const frontmatterYaml = matter.stringify('', data.frontmatter).replace(/^---\\n|\\n---\\n?$/g, '');\n content += `---\\n${frontmatterYaml}---\\n\\n`;\n }\n\n content += data.content;\n\n if (data.comments) {\n content += `\\n\\n${config.anchors.start}\\n${data.comments}\\n${config.anchors.end}`;\n }\n\n return content;\n}\n\nexport async function writeMarkdownFile(\n filePath: string,\n data: MarkdownData,\n config: CommentsConfig\n): Promise<void> {\n await ensureDir(filePath);\n const content = buildMarkdownContent(data, config);\n await writeFile(filePath, content, 'utf-8');\n}\n\nexport function extractIssueIdFromFrontmatter(frontmatter: Record<string, unknown>): number | null {\n const id = frontmatter.id as number | string | undefined;\n if (typeof id === 'number') {\n return id;\n }\n if (typeof id === 'string') {\n const parsed = parseInt(id, 10);\n return isNaN(parsed) ? null : parsed;\n }\n return null;\n}\n\nexport function extractLastJournalId(frontmatter: Record<string, unknown>): number | null {\n const lastJournalId = frontmatter.lastJournalId as number | string | undefined;\n if (typeof lastJournalId === 'number') {\n return lastJournalId;\n }\n if (typeof lastJournalId === 'string') {\n const parsed = parseInt(lastJournalId, 10);\n return isNaN(parsed) ? null : parsed;\n }\n return null;\n}\n","import { Command } from 'commander';\nimport { RedmineConfigService } from '../../services/redmine-config.service.js';\nimport { syncProject } from '../../sync-project.js';\n\ninterface SyncProjectOptions {\n status?: string;\n updatedSince?: string;\n concurrency?: string;\n pageSize?: string;\n dryRun?: boolean;\n config?: string;\n outputDir?: string;\n json?: boolean;\n}\n\n/**\n * Create redmine sync project command\n */\nexport function createSyncProjectCommand(): Command {\n const cmd = new Command('project')\n .description('Sync all issues in a project')\n .option('-s, --status <status>', 'Filter by status (default: *)', '*')\n .option('--updated-since <date>', 'Only sync issues updated since YYYY-MM-DD')\n .option('--concurrency <number>', 'Number of concurrent requests')\n .option('--page-size <number>', 'Page size for API requests')\n .option('--dry-run', 'Preview without making changes')\n .option('-c, --config <path>', 'Config file path')\n .option('-o, --output-dir <path>', 'Output directory')\n .option('--json', 'Output as JSON')\n .action(async (options: SyncProjectOptions) => {\n await handleSyncProject(options);\n });\n\n return cmd;\n}\n\nasync function handleSyncProject(options: SyncProjectOptions): Promise<void> {\n const configService = new RedmineConfigService(options.config);\n const config = await configService.load();\n\n const syncOptions: Parameters<typeof syncProject>[1] = {\n status: options.status,\n updatedSince: options.updatedSince,\n dryRun: options.dryRun,\n outputDir: options.outputDir,\n ...(options.concurrency && { concurrency: parseInt(options.concurrency, 10) }),\n ...(options.pageSize && { pageSize: parseInt(options.pageSize, 10) }),\n onProgress: options.json\n ? undefined\n : (current: number, total: number) => {\n process.stdout.write(`\\rProgress: ${current}/${total} issues`);\n },\n };\n\n const result = await syncProject(config, syncOptions);\n\n if (!options.json) {\n process.stdout.write('\\r'); // Clear progress line\n }\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n if (result.success) {\n console.log('โœ… Sync completed successfully');\n console.log(` Total issues: ${result.totalIssues}`);\n console.log(` Created: ${result.created}`);\n console.log(` Updated: ${result.updated}`);\n console.log(` Skipped: ${result.skipped}`);\n if (result.failed > 0) {\n console.log(` Failed: ${result.failed}`);\n }\n } else {\n console.log('โŒ Sync completed with errors');\n console.log(` Total issues: ${result.totalIssues}`);\n console.log(` Processed: ${result.processed}`);\n console.log(` Created: ${result.created}`);\n console.log(` Updated: ${result.updated}`);\n console.log(` Skipped: ${result.skipped}`);\n console.log(` Failed: ${result.failed}`);\n\n if (result.errors.length > 0) {\n console.log('\\nErrors:');\n result.errors.forEach((error) => {\n console.log(` Issue ${error.issueId}: ${error.error}`);\n });\n }\n\n process.exit(5);\n }\n }\n}\n","import type { RedmineConfig } from './config.js';\nimport { RedmineApiClient } from './api.js';\nimport { syncIssue } from './sync-issue.js';\n\nexport interface SyncProjectOptions {\n status?: string;\n updatedSince?: string;\n dryRun?: boolean;\n outputDir?: string;\n concurrency?: number;\n pageSize?: number;\n onProgress?: (current: number, total: number) => void;\n}\n\nexport interface SyncProjectResult {\n success: boolean;\n totalIssues: number;\n processed: number;\n created: number;\n updated: number;\n skipped: number;\n failed: number;\n errors: Array<{\n issueId: number;\n error: string;\n }>;\n}\n\nexport async function syncProject(\n config: RedmineConfig,\n options: SyncProjectOptions = {}\n): Promise<SyncProjectResult> {\n const client = new RedmineApiClient(config);\n const pageSize = options.pageSize || config.defaults.pageSize;\n\n const result: SyncProjectResult = {\n success: true,\n totalIssues: 0,\n processed: 0,\n created: 0,\n updated: 0,\n skipped: 0,\n failed: 0,\n errors: [],\n };\n\n try {\n const issues = await client.getIssuesConcurrently(config.project.id, {\n status: options.status || config.defaults.status,\n pageSize,\n include: config.defaults.include,\n updatedSince: options.updatedSince,\n onProgress: options.onProgress,\n });\n\n result.totalIssues = issues.length;\n\n if (issues.length === 0) {\n return result;\n }\n\n const syncPromises = issues.map(async (issue) => {\n const syncResult = await syncIssue(issue.id, config, {\n dryRun: options.dryRun,\n outputDir: options.outputDir,\n });\n\n result.processed++;\n\n if (syncResult.success) {\n switch (syncResult.action) {\n case 'created':\n result.created++;\n break;\n case 'updated':\n result.updated++;\n break;\n case 'skipped':\n result.skipped++;\n break;\n }\n } else {\n result.failed++;\n result.errors.push({\n issueId: syncResult.issueId,\n error: syncResult.message,\n });\n }\n\n return syncResult;\n });\n\n await Promise.all(syncPromises);\n\n result.success = result.failed === 0;\n return result;\n } catch (error) {\n result.success = false;\n result.errors.push({\n issueId: 0,\n error: `Failed to fetch issues: ${error instanceof Error ? error.message : String(error)}`,\n });\n return result;\n }\n}\n","import { Command } from 'commander';\nimport { ConfigService } from '../../services/config.service.js';\nimport { ValidationError } from '../../errors/index.js';\nimport { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport type { InfoOptions } from '../../types/framework.types.js';\nimport { getCliName } from '../../utils/cli-name.js';\n\n/**\n * Create info command for Jai1 Framework\n * Shows configuration and status information\n */\nexport function createInfoCommand(): Command {\n const cmd = new Command('info')\n .description('Show client configuration and status')\n .option('--json', 'Output as JSON')\n .option('--verbose', 'Show detailed information')\n .action(async (options: InfoOptions) => {\n await handleInfo(options);\n });\n\n return cmd;\n}\n\nasync function handleInfo(options: InfoOptions): Promise<void> {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError(`Not initialized. Run \"${getCliName()} auth\" first.`);\n }\n\n const frameworkPath = join(homedir(), '.jai1', 'framework');\n const projectStatus = await getProjectStatus();\n\n const info = {\n configPath: configService.getConfigPath(),\n apiUrl: config.apiUrl,\n accessKey: maskKey(config.accessKey),\n version: config.version || 'Not downloaded',\n lastUpdated: config.lastUpdated || 'Never',\n frameworkPath,\n projectStatus,\n };\n\n if (options.json) {\n console.log(JSON.stringify(info, null, 2));\n return;\n }\n\n console.log('Jai1 Client Info');\n console.log('โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\\n');\n console.log(`Config Location: ${info.configPath}`);\n console.log(`API URL: ${info.apiUrl}`);\n console.log(`Access Key: ${info.accessKey}`);\n console.log(`Framework Version: ${info.version}`);\n console.log(`Last Updated: ${info.lastUpdated}`);\n console.log(`Framework Location: ${info.frameworkPath}`);\n console.log();\n console.log('Project Status:');\n console.log(` .jai1/ exists: ${info.projectStatus.exists ? 'โœ“' : 'โœ—'}`);\n if (info.projectStatus.exists) {\n console.log(` Synced version: ${info.projectStatus.version || 'Unknown'}`);\n }\n}\n\nfunction maskKey(key: string): string {\n if (key.length <= 4) return '****';\n return '****' + key.slice(-4);\n}\n\nasync function getProjectStatus(): Promise<{ exists: boolean; version?: string }> {\n const projectJai1 = join(process.cwd(), '.jai1');\n try {\n await fs.access(projectJai1);\n // Try to read version from project\n return { exists: true, version: 'Synced' };\n } catch {\n return { exists: false };\n }\n}\n","import { Command } from 'commander';\nimport { confirm } from '@inquirer/prompts';\nimport { execSync } from 'child_process';\nimport { ConfigService } from '../services/config.service.js';\nimport { ValidationError } from '../errors/index.js';\nimport { trackAction } from '../services/tracking.service.js';\nimport packageJson from '../../package.json' with { type: 'json' };\nimport { disableUpdateCheck } from '../services/version-check.service.js';\nimport { getCliName } from '../utils/cli-name.js';\n\n// Colors for terminal output\nconst colors = {\n yellow: '\\x1b[33m',\n green: '\\x1b[32m',\n cyan: '\\x1b[36m',\n red: '\\x1b[31m',\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n};\n\n/**\n * Create self-update command\n */\nexport function createSelfUpdateCommand(): Command {\n return new Command('self-update')\n .description('Update CLI client to the latest version')\n .option('--check', 'Only check for updates without installing')\n .option('--force', 'Force update without confirmation')\n .action(async (options: { check?: boolean; force?: boolean }) => {\n await handleSelfUpdate(options);\n });\n}\n\nasync function handleSelfUpdate(options: { check?: boolean; force?: boolean }) {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError(`Not initialized. Run \"${getCliName()} auth\" first.`);\n }\n\n try {\n // Fetch latest version from API\n console.log(`${colors.cyan}๐Ÿ” Checking for updates...${colors.reset}`);\n\n const response = await fetch(`${config.apiUrl}/api/versions/client`, {\n headers: {\n 'JAI1-Access-Key': config.accessKey,\n },\n signal: AbortSignal.timeout(10000), // 10 second timeout\n });\n\n if (!response.ok) {\n throw new Error(`Failed to check for updates: ${response.statusText}`);\n }\n\n const data = await response.json() as { version: string };\n const latestVersion = data.version;\n const currentVersion = packageJson.version;\n\n console.log(`\\n${colors.bold}Current version:${colors.reset} ${currentVersion}`);\n console.log(`${colors.bold}Latest version:${colors.reset} ${latestVersion}\\n`);\n\n if (!isNewerVersion(latestVersion, currentVersion)) {\n console.log(`${colors.green}โœ… You're already on the latest version!${colors.reset}\\n`);\n return;\n }\n\n // Show update available\n console.log(`${colors.yellow}โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ${colors.reset}`);\n console.log(`${colors.yellow}โ”‚${colors.reset} ${colors.bold}โฌ†๏ธ Update available!${colors.reset} ${currentVersion} โ†’ ${colors.cyan}${latestVersion}${colors.reset} ${colors.yellow}โ”‚${colors.reset}`);\n console.log(`${colors.yellow}โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ${colors.reset}\\n`);\n\n // If --check only, stop here\n if (options.check) {\n console.log(`${colors.cyan}Run \"${getCliName()} self-update\" to install the latest version.${colors.reset}\\n`);\n return;\n }\n\n // Ask for confirmation unless --force\n if (!options.force) {\n const shouldUpdate = await confirm({\n message: 'Update to the latest version now?',\n default: true\n });\n\n if (!shouldUpdate) {\n console.log(`${colors.yellow}โธ๏ธ Update cancelled.${colors.reset}\\n`);\n return;\n }\n }\n\n // Perform update\n console.log(`\\n${colors.cyan}๐Ÿ“ฅ Installing latest version...${colors.reset}\\n`);\n\n try {\n // Detect package manager (npm, pnpm, yarn, bun)\n const packageManager = detectPackageManager();\n const installCommand = getInstallCommand(packageManager);\n\n console.log(`${colors.cyan}Using ${packageManager}...${colors.reset}`);\n\n // Execute installation\n execSync(installCommand, {\n stdio: 'inherit',\n env: { ...process.env, FORCE_COLOR: '1' }\n });\n\n console.log(`\\n${colors.green}โœ… Successfully updated to version ${latestVersion}!${colors.reset}\\n`);\n\n // Track successful update\n trackAction('self_update', {\n from_version: currentVersion,\n to_version: latestVersion,\n package_manager: packageManager\n });\n\n // Disable update check for this session since we just upgraded\n disableUpdateCheck();\n\n } catch (error) {\n console.error(`\\n${colors.red}โŒ Update failed!${colors.reset}`);\n console.error(`${colors.red}Error: ${error instanceof Error ? error.message : 'Unknown error'}${colors.reset}\\n`);\n console.error(`${colors.yellow}๐Ÿ’ก You can try manually updating with:${colors.reset}`);\n console.error(` ${colors.cyan}npm install -g @jvittechs/j@latest${colors.reset}\\n`);\n throw error;\n }\n\n } catch (error) {\n if (error instanceof Error && error.message.includes('Failed to check')) {\n throw new ValidationError('Cannot connect to update server. Please check your internet connection.');\n }\n throw error;\n }\n}\n\n/**\n * Compare versions to check if remote is newer than local\n */\nfunction isNewerVersion(remote: string, local: string): boolean {\n const remoteParts = remote.split('.').map(Number);\n const localParts = local.split('.').map(Number);\n\n for (let i = 0; i < 3; i++) {\n const r = remoteParts[i] || 0;\n const l = localParts[i] || 0;\n\n if (r > l) return true;\n if (r < l) return false;\n }\n\n return false;\n}\n\n/**\n * Detect which package manager is being used\n */\nfunction detectPackageManager(): 'npm' | 'pnpm' | 'yarn' | 'bun' {\n // Check user agent for package manager\n const userAgent = process.env.npm_config_user_agent || '';\n\n if (userAgent.includes('pnpm')) return 'pnpm';\n if (userAgent.includes('yarn')) return 'yarn';\n if (userAgent.includes('bun')) return 'bun';\n\n // Check which command is available\n try {\n execSync('pnpm --version', { stdio: 'ignore' });\n return 'pnpm';\n } catch {\n // pnpm not available\n }\n\n try {\n execSync('yarn --version', { stdio: 'ignore' });\n return 'yarn';\n } catch {\n // yarn not available\n }\n\n try {\n execSync('bun --version', { stdio: 'ignore' });\n return 'bun';\n } catch {\n // bun not available\n }\n\n // Default to npm\n return 'npm';\n}\n\n/**\n * Get install command for package manager\n */\nfunction getInstallCommand(packageManager: 'npm' | 'pnpm' | 'yarn' | 'bun'): string {\n const packageName = '@jvittechs/j@latest';\n\n switch (packageManager) {\n case 'pnpm':\n return `pnpm add -g ${packageName}`;\n case 'yarn':\n return `yarn global add ${packageName}`;\n case 'bun':\n return `bun add -g ${packageName}`;\n case 'npm':\n default:\n return `npm install -g ${packageName}`;\n }\n}\n","import { Command } from 'commander';\nimport { confirm } from '@inquirer/prompts';\nimport { ComponentsService } from '../services/components.service.js';\n\nexport function createClearBackupsCommand(): Command {\n return new Command('clear-backups')\n .description('Clear backup files')\n .option('-y, --yes', 'Skip confirmation')\n .action(async (options) => {\n const service = new ComponentsService();\n const backups = await service.listBackups(process.cwd());\n\n if (backups.length === 0) {\n console.log('No backups found.');\n return;\n }\n\n console.log(`Found ${backups.length} backup(s):`);\n if (backups.length <= 5) {\n backups.forEach(b => console.log(` - ${b}`));\n } else {\n backups.slice(0, 5).forEach(b => console.log(` - ${b}`));\n console.log(` ...and ${backups.length - 5} more`);\n }\n console.log();\n\n if (!options.yes) {\n const ok = await confirm({ message: 'Delete all backups?', default: false });\n if (!ok) return;\n }\n\n await service.clearBackups(process.cwd());\n console.log('โœ… Backups cleared.');\n });\n}\n","import { Command } from 'commander';\nimport { checkbox, confirm, select } from '@inquirer/prompts';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { existsSync } from 'node:fs';\nimport { selectTheme, checkboxTheme } from '../../utils/prompt-theme.js';\n\n// Performance Groups Definition\ninterface SettingsGroup {\n name: string;\n description: string;\n settings: Record<string, unknown>;\n}\n\nconst PERFORMANCE_GROUPS: Record<string, SettingsGroup> = {\n telemetry: {\n name: 'Telemetry',\n description: 'Tแบฏt tแบฅt cแบฃ telemetry vร  thu thแบญp dแปฏ liแป‡u',\n settings: {\n \"telemetry.telemetryLevel\": \"off\",\n \"telemetry.feedback.enabled\": false,\n \"workbench.enableExperiments\": false,\n \"workbench.settings.enableNaturalLanguageSearch\": false,\n }\n },\n languageServers: {\n name: 'Language Servers',\n description: 'Tแบฏt/giแบฃm tแบฃi cรกc language servers (tsserver, eslint...)',\n settings: {\n // TypeScript\n \"typescript.tsserver.experimental.enableProjectDiagnostics\": false,\n \"typescript.disableAutomaticTypeAcquisition\": true,\n \"typescript.tsserver.maxTsServerMemory\": 2048,\n \"typescript.surveys.enabled\": false,\n // JavaScript\n \"js/ts.implicitProjectConfig.strictNullChecks\": false,\n // ESLint\n \"eslint.enable\": false,\n // Prettier\n \"prettier.enable\": false,\n // CSS/HTML\n \"css.validate\": false,\n \"html.validate.scripts\": false,\n \"html.validate.styles\": false,\n // JSON\n \"json.schemaDownload.enable\": false,\n }\n },\n git: {\n name: 'Git Integration',\n description: 'Tแบฏt Git tรญch hแปฃp ฤ‘แปƒ cแบฃi thiแป‡n hiแป‡u suแบฅt',\n settings: {\n \"git.enabled\": false,\n \"git.autoRepositoryDetection\": false,\n \"git.decorations.enabled\": false,\n \"git.path\": null,\n \"scm.diffDecorations\": \"none\",\n }\n },\n fileWatcher: {\n name: 'File Watcher',\n description: 'Loแบกi trแปซ cรกc thฦฐ mแปฅc khแปi file watcher',\n settings: {\n \"files.watcherExclude\": {\n \"**/node_modules/**\": true,\n \"**/.git/**\": true,\n \"**/vendor/**\": true,\n \"**/dist/**\": true,\n \"**/build/**\": true,\n \"**/.next/**\": true,\n \"**/out/**\": true,\n \"**/.nuxt/**\": true,\n \"**/.cache/**\": true,\n \"**/coverage/**\": true,\n },\n \"files.exclude\": {\n \"**/.git\": true,\n \"**/.DS_Store\": true,\n \"**/node_modules\": false, // Keep visible but don't watch\n }\n }\n },\n search: {\n name: 'Search',\n description: 'Loแบกi trแปซ cรกc thฦฐ mแปฅc khแปi search',\n settings: {\n \"search.exclude\": {\n \"**/node_modules\": true,\n \"**/bower_components\": true,\n \"**/*.code-search\": true,\n \"**/dist\": true,\n \"**/build\": true,\n \"**/out\": true,\n \"**/.next\": true,\n \"**/.nuxt\": true,\n \"**/coverage\": true,\n \"**/.cache\": true,\n },\n \"search.followSymlinks\": false,\n }\n },\n extensions: {\n name: 'Extensions',\n description: 'Tแบฏt auto-update extensions',\n settings: {\n \"extensions.autoUpdate\": false,\n \"extensions.autoCheckUpdates\": false,\n \"update.mode\": \"manual\",\n \"extensions.ignoreRecommendations\": true,\n }\n },\n editorRendering: {\n name: 'Editor Rendering',\n description: 'Tแป‘i ฦฐu rendering (minimap, whitespace, highlights...)',\n settings: {\n \"editor.minimap.enabled\": false,\n \"editor.renderWhitespace\": \"none\",\n \"editor.renderControlCharacters\": false,\n \"editor.renderLineHighlight\": \"none\",\n \"editor.cursorBlinking\": \"solid\",\n \"editor.smoothScrolling\": false,\n \"editor.largeFileOptimizations\": true,\n \"editor.maxTokenizationLineLength\": 2000,\n \"editor.quickSuggestions\": {\n \"other\": true,\n \"comments\": false,\n \"strings\": false\n },\n \"editor.suggest.showStatusBar\": false,\n \"editor.hover.delay\": 500,\n \"editor.matchBrackets\": \"never\",\n }\n },\n uiElements: {\n name: 'UI Elements',\n description: 'แบจn cรกc UI elements khรดng cแบงn thiแบฟt',\n settings: {\n \"workbench.activityBar.visible\": false,\n \"workbench.statusBar.visible\": false,\n \"breadcrumbs.enabled\": false,\n \"window.menuBarVisibility\": \"compact\",\n \"workbench.editor.showTabs\": true, // Keep tabs for navigation\n \"workbench.startupEditor\": \"none\",\n }\n }\n};\n\nexport function createVSCodeCommand(): Command {\n const vscodeCommand = new Command('vscode')\n .description('Quแบฃn lรฝ cร i ฤ‘แบทt VSCode cho dแปฑ รกn hiแป‡n tแบกi');\n\n // Interactive mode (default)\n vscodeCommand.action(async () => {\n await interactiveMode();\n });\n\n // Enable subcommand\n vscodeCommand\n .command('enable')\n .description('Enable cรกc nhรณm tแป‘i ฦฐu cแปฅ thแปƒ')\n .argument('[groups...]', 'Tรชn cรกc nhรณm cแบงn enable (telemetry, languageServers, git, ...)')\n .action(async (groups: string[]) => {\n if (groups.length === 0) {\n await selectGroupsToApply('enable');\n } else {\n await applyGroups(groups, 'enable');\n }\n });\n\n // Disable subcommand\n vscodeCommand\n .command('disable')\n .description('Disable cรกc nhรณm tแป‘i ฦฐu cแปฅ thแปƒ (restore vแป default)')\n .argument('[groups...]', 'Tรชn cรกc nhรณm cแบงn disable')\n .action(async (groups: string[]) => {\n if (groups.length === 0) {\n await selectGroupsToApply('disable');\n } else {\n await applyGroups(groups, 'disable');\n }\n });\n\n // Max performance preset\n vscodeCommand\n .command('max-performance')\n .description('Enable tแบฅt cแบฃ cรกc tแป‘i ฦฐu ฤ‘แปƒ ฤ‘แบกt hiแป‡u suแบฅt tแป‘i ฤ‘a')\n .action(async () => {\n const allGroups = Object.keys(PERFORMANCE_GROUPS);\n await applyGroups(allGroups, 'enable');\n });\n\n // Reset subcommand\n vscodeCommand\n .command('reset')\n .description('Reset vแป settings mแบทc ฤ‘แป‹nh (xรณa tแบฅt cแบฃ tแป‘i ฦฐu)')\n .argument('[groups...]', 'Tรชn cรกc nhรณm cแบงn reset (ฤ‘แปƒ trแป‘ng = reset tแบฅt cแบฃ)')\n .action(async (groups: string[]) => {\n await resetSettings(groups);\n });\n\n // List subcommand\n vscodeCommand\n .command('list')\n .description('Liแป‡t kรช tแบฅt cแบฃ cรกc nhรณm tแป‘i ฦฐu cรณ sแบตn')\n .action(() => {\n console.log('๐Ÿ”ง Cรกc nhรณm tแป‘i ฦฐu cรณ sแบตn:\\n');\n Object.entries(PERFORMANCE_GROUPS).forEach(([key, group]) => {\n console.log(` ${key.padEnd(20)} - ${group.name}`);\n console.log(` ${' '.repeat(20)} ${group.description}`);\n console.log();\n });\n });\n\n return vscodeCommand;\n}\n\nasync function interactiveMode() {\n console.log('๐Ÿ”ง Quแบฃn lรฝ cร i ฤ‘แบทt VSCode\\n');\n console.log('โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ');\n console.log('โ”‚ ๐Ÿ“Œ Hฦฐแป›ng dแบซn sแปญ dแปฅng: โ”‚');\n console.log('โ”‚ โ€ข Dรนng phรญm โ†‘โ†“ ฤ‘แปƒ di chuyแปƒn โ”‚');\n console.log('โ”‚ โ€ข Nhแบฅn SPACE ฤ‘แปƒ chแปn/bแป chแปn nhรณm โ”‚');\n console.log('โ”‚ โ€ข Nhแบฅn ENTER ฤ‘แปƒ xรกc nhแบญn vร  รกp dแปฅng โ”‚');\n console.log('โ”‚ โ€ข Nhแบฅn Ctrl+C ฤ‘แปƒ hแปงy โ”‚');\n console.log('โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ\\n');\n\n const action = await select({\n message: 'Bแบกn muแป‘n lร m gรฌ?',\n choices: [\n { name: 'โœ… Enable cรกc nhรณm tแป‘i ฦฐu', value: 'enable' },\n { name: 'โŒ Disable cรกc nhรณm tแป‘i ฦฐu', value: 'disable' },\n { name: '๐Ÿš€ Max Performance (enable tแบฅt cแบฃ)', value: 'max' },\n { name: '๐Ÿ”„ Reset vแป mแบทc ฤ‘แป‹nh', value: 'reset' },\n ],\n theme: selectTheme,\n });\n\n if (action === 'max') {\n const allGroups = Object.keys(PERFORMANCE_GROUPS);\n await applyGroups(allGroups, 'enable');\n } else if (action === 'reset') {\n await resetSettings([]);\n } else {\n await selectGroupsToApply(action as 'enable' | 'disable');\n }\n}\n\nasync function selectGroupsToApply(action: 'enable' | 'disable') {\n const choices = Object.entries(PERFORMANCE_GROUPS).map(([key, group]) => ({\n name: `${group.name} - ${group.description}`,\n value: key,\n }));\n\n try {\n const selectedGroups = await checkbox({\n message: `Chแปn cรกc nhรณm ฤ‘แปƒ ${action === 'enable' ? 'enable' : 'disable'} (SPACE ฤ‘แปƒ chแปn, ENTER ฤ‘แปƒ xรกc nhแบญn):`,\n choices,\n theme: checkboxTheme,\n });\n\n if (selectedGroups.length === 0) {\n console.log('\\nโš ๏ธ Bแบกn chฦฐa chแปn nhรณm nร o!');\n console.log(' ๐Ÿ’ก Mแบนo: Hรฃy nhแบฅn SPACE ฤ‘แปƒ chแปn รญt nhแบฅt 1 nhรณm trฦฐแป›c khi nhแบฅn ENTER.');\n return;\n }\n\n await applyGroups(selectedGroups, action);\n } catch {\n console.log('\\nโŒ ฤรฃ hแปงy thao tรกc.');\n }\n}\n\nasync function applyGroups(groupKeys: string[], action: 'enable' | 'disable') {\n const vscodeDir = path.join(process.cwd(), '.vscode');\n const settingsPath = path.join(vscodeDir, 'settings.json');\n\n // Validate group keys\n const invalidGroups = groupKeys.filter(key => !PERFORMANCE_GROUPS[key]);\n if (invalidGroups.length > 0) {\n console.log(`\\nโŒ Nhรณm khรดng hแปฃp lแป‡: ${invalidGroups.join(', ')}`);\n console.log(' ๐Ÿ’ก Chแบกy \"jai1 vscode list\" ฤ‘แปƒ xem danh sรกch nhรณm cรณ sแบตn.');\n return;\n }\n\n // Ensure .vscode directory exists\n if (!existsSync(vscodeDir)) {\n await fs.mkdir(vscodeDir, { recursive: true });\n console.log('๐Ÿ“ ฤรฃ tแบกo thฦฐ mแปฅc .vscode/');\n }\n\n // Read existing settings\n let currentSettings: Record<string, unknown> = {};\n if (existsSync(settingsPath)) {\n try {\n const content = await fs.readFile(settingsPath, 'utf-8');\n currentSettings = JSON.parse(content);\n console.log('๐Ÿ“„ ฤรฃ ฤ‘แปc cร i ฤ‘แบทt hiแป‡n tแบกi tแปซ settings.json');\n } catch {\n console.warn('โš ๏ธ Khรดng thแปƒ ฤ‘แปc settings.json (cรณ thแปƒ chแปฉa comments).');\n const confirmOverwrite = await confirm({\n message: 'Ghi ฤ‘รจ file settings.json hiแป‡n tแบกi?',\n default: false\n });\n\n if (!confirmOverwrite) {\n console.log('โŒ ฤรฃ hแปงy thao tรกc.');\n return;\n }\n currentSettings = {};\n }\n }\n\n // Apply or remove settings\n const newSettings = { ...currentSettings };\n\n console.log(`\\n๐Ÿ“ ฤang ${action === 'enable' ? 'enable' : 'disable'} cรกc nhรณm:\\n`);\n\n for (const key of groupKeys) {\n const group = PERFORMANCE_GROUPS[key];\n console.log(` ${action === 'enable' ? 'โœ“' : 'โœ—'} ${group.name}`);\n\n if (action === 'enable') {\n // Merge settings\n for (const [settingKey, settingValue] of Object.entries(group.settings)) {\n if (typeof settingValue === 'object' && settingValue !== null && !Array.isArray(settingValue) &&\n typeof newSettings[settingKey] === 'object' && newSettings[settingKey] !== null) {\n newSettings[settingKey] = {\n ...(newSettings[settingKey] as Record<string, unknown>),\n ...settingValue\n };\n } else {\n newSettings[settingKey] = settingValue;\n }\n }\n } else {\n // Remove settings (disable)\n for (const settingKey of Object.keys(group.settings)) {\n delete newSettings[settingKey];\n }\n }\n }\n\n // Write back\n await fs.writeFile(settingsPath, JSON.stringify(newSettings, null, 2));\n console.log(`\\nโœ… ฤรฃ cแบญp nhแบญt cร i ฤ‘แบทt VSCode tแบกi: ${settingsPath}`);\n console.log('๐Ÿ’ก Mแบนo: KhแปŸi ฤ‘แป™ng lแบกi VSCode ฤ‘แปƒ รกp dแปฅng cรกc thay ฤ‘แป•i.');\n}\n\nasync function resetSettings(groupKeys: string[]) {\n const vscodeDir = path.join(process.cwd(), '.vscode');\n const settingsPath = path.join(vscodeDir, 'settings.json');\n\n if (!existsSync(settingsPath)) {\n console.log('\\nโš ๏ธ Khรดng tรฌm thแบฅy file settings.json');\n return;\n }\n\n const confirmReset = await confirm({\n message: groupKeys.length === 0\n ? 'Reset TแบคT Cแบข settings vแป mแบทc ฤ‘แป‹nh (xรณa toร n bแป™ file)?'\n : `Reset cรกc nhรณm: ${groupKeys.join(', ')}?`,\n default: false\n });\n\n if (!confirmReset) {\n console.log('โŒ ฤรฃ hแปงy thao tรกc.');\n return;\n }\n\n if (groupKeys.length === 0) {\n // Reset all - delete file\n await fs.unlink(settingsPath);\n console.log('\\nโœ… ฤรฃ xรณa file settings.json');\n } else {\n // Reset specific groups\n await applyGroups(groupKeys, 'disable');\n }\n\n console.log('๐Ÿ’ก Mแบนo: KhแปŸi ฤ‘แป™ng lแบกi VSCode ฤ‘แปƒ รกp dแปฅng cรกc thay ฤ‘แป•i.');\n}\n","import React from 'react';\nimport { render } from 'ink';\nimport { Command } from 'commander';\nimport { ContextApp } from '../ui/context/ContextApp.js';\nimport type { IDE, ContentType } from '../types/context.types.js';\nimport { ContextScannerService } from '../services/context-scanner.service.js';\n\n/**\n * Create context command - Visualize project context\n */\nexport function createContextCommand(): Command {\n const cmd = new Command('context')\n .description('Khรกm phรก vร  quแบฃn lรฝ context dแปฑ รกn cho cรกc IDE')\n .option('--ide <ide>', 'MแปŸ trแปฑc tiแบฟp IDE cแปฅ thแปƒ (cursor, windsurf, antigravity, jai1)')\n .option('--type <type>', 'Hiแปƒn thแป‹ loแบกi context cแปฅ thแปƒ (rules, workflows, skills, agents, prompts)')\n .option('--stats', 'Hiแปƒn thแป‹ thแป‘ng kรช context (non-interactive)')\n .action(async (options: { ide?: string; type?: string; stats?: boolean }) => {\n // Validate IDE option\n let initialIDE: IDE | undefined;\n if (options.ide) {\n const validIDEs = ['cursor', 'windsurf', 'antigravity', 'jai1'];\n if (!validIDEs.includes(options.ide)) {\n console.error(`โŒ IDE khรดng hแปฃp lแป‡: ${options.ide}`);\n console.error(` IDE hแปฃp lแป‡: ${validIDEs.join(', ')}`);\n process.exit(1);\n }\n initialIDE = options.ide as IDE;\n }\n\n // Validate type option\n let initialType: ContentType | undefined;\n if (options.type) {\n const validTypes = ['rules', 'workflows', 'skills', 'agents', 'prompts', 'context'];\n if (!validTypes.includes(options.type)) {\n console.error(`โŒ Loแบกi context khรดng hแปฃp lแป‡: ${options.type}`);\n console.error(` Loแบกi hแปฃp lแป‡: ${validTypes.join(', ')}`);\n process.exit(1);\n }\n initialType = options.type as ContentType;\n }\n\n // Stats mode - non-interactive\n if (options.stats) {\n await printStats();\n return;\n }\n\n // Interactive mode\n const { waitUntilExit } = render(\n React.createElement(ContextApp, {\n initialIDE,\n initialType,\n onExit: () => {\n process.exit(0);\n },\n })\n );\n\n await waitUntilExit();\n });\n\n return cmd;\n}\n\n/**\n * Print context statistics (non-interactive)\n */\nasync function printStats(): Promise<void> {\n const scanner = new ContextScannerService();\n\n console.log('๐Ÿ” ฤang quรฉt context...\\n');\n\n try {\n const context = await scanner.scanAll();\n\n if (context.ides.length === 0) {\n console.log('โš ๏ธ Khรดng tรฌm thแบฅy context nร o');\n console.log(' Hรฃy chแบกy `jai1 apply` ฤ‘แปƒ cร i ฤ‘แบทt context cho IDE cแปงa bแบกn.\\n');\n return;\n }\n\n console.log('๐Ÿ“Š Thแป‘ng kรช Context\\n');\n console.log(`๐Ÿ“ Project: ${context.projectPath}`);\n console.log(`๐Ÿ• Scan time: ${context.scanTime.toLocaleString('vi-VN')}\\n`);\n\n for (const ideContext of context.ides) {\n console.log(`${ideContext.config.icon} ${ideContext.config.name}`);\n console.log(` Path: ${ideContext.config.basePath}`);\n console.log(` Items: ${ideContext.stats.totalItems}`);\n\n const types: string[] = [];\n if (ideContext.stats.byType.rules) types.push(`${ideContext.stats.byType.rules} rules`);\n if (ideContext.stats.byType.workflows) types.push(`${ideContext.stats.byType.workflows} workflows`);\n if (ideContext.stats.byType.skills) types.push(`${ideContext.stats.byType.skills} skills`);\n if (ideContext.stats.byType.agents) types.push(`${ideContext.stats.byType.agents} agents`);\n if (ideContext.stats.byType.prompts) types.push(`${ideContext.stats.byType.prompts} prompts`);\n if (ideContext.stats.byType.context) types.push(`${ideContext.stats.byType.context} context`);\n\n if (types.length > 0) {\n console.log(` Breakdown: ${types.join(', ')}`);\n }\n\n console.log('');\n }\n\n console.log(`โœ… Tแป•ng: ${context.totalItems} items\\n`);\n } catch (error) {\n console.error('โŒ Lแป—i khi quรฉt context:', error);\n process.exit(1);\n }\n}\n","/**\n * migrate-ide command - Migrate .jai1 content to IDE directories\n */\nimport { Command } from 'commander';\nimport { checkbox, confirm } from '@inquirer/prompts';\nimport type { MigrateIDE, MigrateContentType } from '../types/migrate-ide.types.js';\nimport { MigrateIdeService } from '../services/migrate-ide.service.js';\nimport { IDE_MIGRATION_CONFIGS, getMigrationIDEs } from '../constants/ide-migration-configs.js';\nimport { checkboxTheme } from '../utils/prompt-theme.js';\n\n/**\n * Create migrate-ide command\n */\nexport function createMigrateIdeCommand(): Command {\n const cmd = new Command('migrate-ide')\n .description('Migrate .jai1 rules vร  workflows sang IDEs (Cursor, Windsurf, Claude Code, etc.)')\n .option('--ide <ides...>', 'Target IDEs (cursor, windsurf, antigravity, claudecode, opencode)')\n .option('--type <types...>', 'Content types (rules, workflows, commands)')\n .option('--dry-run', 'Preview changes without writing files')\n .action(async (options: {\n ide?: string[];\n type?: string[];\n dryRun?: boolean;\n }) => {\n await runMigrateIde(options);\n });\n\n return cmd;\n}\n\nasync function runMigrateIde(options: {\n ide?: string[];\n type?: string[];\n dryRun?: boolean;\n}) {\n const service = new MigrateIdeService();\n\n console.log('\\n๐Ÿ”„ Migrate rules vร  workflows sang IDE(s)\\n');\n\n // Scan .jai1 content\n console.log('๐Ÿ“ Scanning .jai1/ directory...');\n const content = await service.scanJai1Content();\n\n if (content.totalCount === 0) {\n console.log('\\nโš ๏ธ Khรดng tรฌm thแบฅy content trong .jai1/');\n console.log(' ๐Ÿ’ก Hรฃy tแบกo files trong .jai1/rules/ hoแบทc .jai1/workflows/ trฦฐแป›c.\\n');\n process.exit(1);\n }\n\n console.log(` Found: ${content.rules.length} rules, ${content.workflows.length} workflows\\n`);\n\n // Select IDEs\n let selectedIdes: MigrateIDE[];\n if (options.ide && options.ide.length > 0) {\n selectedIdes = options.ide as MigrateIDE[];\n } else {\n const ideChoices = getMigrationIDEs().map(ide => {\n const config = IDE_MIGRATION_CONFIGS[ide];\n return {\n name: `${config.icon} ${config.name}`,\n value: ide,\n };\n });\n\n selectedIdes = await checkbox({\n message: 'Chแปn IDE(s) ฤ‘แปƒ migrate (SPACE ฤ‘แปƒ chแปn, ENTER ฤ‘แปƒ xรกc nhแบญn):',\n choices: ideChoices,\n theme: checkboxTheme,\n });\n\n if (selectedIdes.length === 0) {\n console.log('\\nโš ๏ธ Bแบกn chฦฐa chแปn IDE nร o!');\n console.log(' ๐Ÿ’ก Hรฃy chแปn รญt nhแบฅt 1 IDE.\\n');\n process.exit(0);\n }\n }\n\n // Select content types\n let selectedTypes: MigrateContentType[];\n if (options.type && options.type.length > 0) {\n selectedTypes = options.type as MigrateContentType[];\n } else {\n const typeChoices = [\n { name: `Rules (${content.rules.length} files)`, value: 'rules' as MigrateContentType },\n { name: `Workflows (${content.workflows.length} files)`, value: 'workflows' as MigrateContentType },\n { name: `Commands (${content.commands.length} files)`, value: 'commands' as MigrateContentType },\n ];\n\n selectedTypes = await checkbox({\n message: 'Chแปn content types ฤ‘แปƒ migrate:',\n choices: typeChoices,\n theme: checkboxTheme,\n });\n\n if (selectedTypes.length === 0) {\n console.log('\\nโš ๏ธ Bแบกn chฦฐa chแปn content type nร o!');\n console.log(' ๐Ÿ’ก Hรฃy chแปn รญt nhแบฅt 1 content type.\\n');\n process.exit(0);\n }\n }\n\n // Calculate total files\n const totalItems = selectedTypes.reduce((sum, type) => {\n return sum + (type === 'rules' ? content.rules.length :\n type === 'workflows' ? content.workflows.length :\n content.commands.length);\n }, 0);\n const totalFiles = totalItems * selectedIdes.length;\n\n // Preview\n console.log('\\n๐Ÿ“Š Preview:\\n');\n console.log(` IDEs: ${selectedIdes.map(ide => IDE_MIGRATION_CONFIGS[ide].name).join(', ')}`);\n console.log(` Content types: ${selectedTypes.join(', ')}`);\n console.log(` Will create/update: ${totalFiles} stub files\\n`);\n\n if (options.dryRun) {\n console.log('๐Ÿ” DRY RUN - No files will be written\\n');\n }\n\n // Confirm\n const confirmed = await confirm({\n message: 'Proceed with migration?',\n default: true,\n });\n\n if (!confirmed) {\n console.log('\\nโŒ Migration cancelled.\\n');\n process.exit(0);\n }\n\n // Migrate\n console.log('\\n๐Ÿ”„ Migrating...\\n');\n let completed = 0;\n\n const results = await service.migrate(\n selectedIdes,\n selectedTypes,\n content,\n (result) => {\n completed++;\n const icon = result.status === 'created' ? 'โœ“' :\n result.status === 'updated' ? 'โ†ป' :\n result.status === 'error' ? 'โœ—' : 'โ—‹';\n\n const percentage = Math.round((completed / totalFiles) * 100);\n console.log(` ${icon} [${percentage}%] ${result.targetPath}`);\n\n if (result.status === 'error' && result.error) {\n console.log(` Error: ${result.error}`);\n }\n }\n );\n\n // Summary\n const created = results.filter(r => r.status === 'created').length;\n const updated = results.filter(r => r.status === 'updated').length;\n const skipped = results.filter(r => r.status === 'skipped').length;\n const errors = results.filter(r => r.status === 'error').length;\n\n console.log('\\nโœ… Migration complete!\\n');\n console.log(` Created: ${created}`);\n console.log(` Updated: ${updated}`);\n if (skipped > 0) console.log(` Skipped: ${skipped}`);\n if (errors > 0) console.log(` Errors: ${errors}`);\n console.log('');\n}\n","import boxen from 'boxen';\nimport chalk from 'chalk';\nimport gradient from 'gradient-string';\nimport figlet from 'figlet';\nimport { getCliName } from './cli-name.js';\n\n/**\n * Custom help screen vแป›i UI ฤ‘แบนp hฦกn\n */\nexport function showCustomHelp(version: string): void {\n // Header vแป›i gradient ASCII art\n const title = figlet.textSync('JAI1', { font: 'Small' });\n console.log(gradient.pastel(title));\n\n // Box vแป›i version\n console.log(\n boxen(chalk.cyan(`Agentic Coding CLI v${version}`), {\n padding: { left: 1, right: 1, top: 0, bottom: 0 },\n borderStyle: 'round',\n borderColor: 'cyan',\n })\n );\n\n // Grouped commands\n console.log(chalk.bold('\\n๐Ÿ”ง Thiแบฟt lแบญp & Thรดng tin'));\n console.log(' auth Xรกc thแปฑc vร  cแบฅu hรฌnh client');\n console.log(' status Hiแปƒn thแป‹ trแบกng thรกi cแบฅu hรฌnh');\n console.log(' client-info Tแบกo thรดng tin client ฤ‘แปƒ gแปญi ฤ‘แป™i phรกt triแปƒn');\n console.log(' errors Quแบฃn lรฝ error logs cแปฅc bแป™');\n console.log(' guide Trung tรขm hแปc Agentic Coding');\n\n console.log(chalk.bold('\\n๐Ÿ“ฆ Quแบฃn lรฝ Components'));\n console.log(' apply Cร i ฤ‘แบทt components (interactive)');\n console.log(' update Cแบญp nhแบญt components ฤ‘รฃ cร i');\n console.log(' check Kiแปƒm tra cแบญp nhแบญt tแปซ server');\n\n console.log(chalk.bold('\\n๐Ÿ–ฅ๏ธ IDE & Tรญch hแปฃp'));\n console.log(' ide Lแป‡nh cแบฅu hรฌnh IDE');\n console.log(' chat Chat AI vแป›i Jai1 LLM Proxy');\n console.log(' openai-keys Thรดng tin API credentials');\n\n console.log(chalk.bold('\\n๐Ÿค– AI Tools'));\n console.log(' translate Dแป‹ch vฤƒn bแบฃn/file bแบฑng AI');\n console.log(' image Tแบกo แบฃnh (Coming Soon)');\n console.log(' stats Thแป‘ng kรช sแปญ dแปฅng LLM');\n console.log(' feedback Gแปญi bรกo cรกo/ฤ‘แป xuแบฅt');\n\n console.log(chalk.bold('\\n๐Ÿ“ Project'));\n console.log(' kit Quแบฃn lรฝ starter kits');\n console.log(' rules Quแบฃn lรฝ rule presets');\n console.log(' deps Quแบฃn lรฝ dependencies');\n console.log(' redmine Redmine context sync');\n\n console.log(chalk.bold('\\nโš™๏ธ Bแบฃo trรฌ'));\n console.log(' upgrade Cแบญp nhแบญt CLI client');\n console.log(' clean Dแปn dแบนp cache/backup');\n console.log(' utils Developer utilities');\n\n const name = getCliName();\n console.log(chalk.dim(`\\nSแปญ dแปฅng: ${name} [lแป‡nh] --help ฤ‘แปƒ xem chi tiแบฟt`));\n}\n\n/**\n * Custom unknown command handler\n */\nexport function showUnknownCommand(commandName: string): void {\n console.error(chalk.red(`โŒ Lแป‡nh khรดng tแป“n tแบกi: ${commandName}`));\n const name = getCliName();\n console.error(chalk.dim(`\\nGแปฃi รฝ: Chแบกy ${name} --help ฤ‘แปƒ xem danh sรกch lแป‡nh`));\n}\n"],"mappings":";;;;;;;;;;;AAAA,OAAO,WAAW;AAOlB,IAAM,mBAAmB;AAMzB,SAAS,aAAa,SAA2B;AAC/C,SAAO,QAAQ,QAAQ,MAAM,EAAE,EAAE,MAAM,GAAG,EAAE,IAAI,MAAM;AACxD;AAMA,SAAS,gBAAgB,GAAW,GAAmB;AACrD,QAAM,SAAS,aAAa,CAAC;AAC7B,QAAM,SAAS,aAAa,CAAC;AAE7B,WAAS,IAAI,GAAG,IAAI,KAAK,IAAI,OAAO,QAAQ,OAAO,MAAM,GAAG,KAAK;AAC/D,UAAM,OAAO,OAAO,CAAC,KAAK;AAC1B,UAAM,OAAO,OAAO,CAAC,KAAK;AAE1B,QAAI,OAAO,KAAM,QAAO;AACxB,QAAI,OAAO,KAAM,QAAO;AAAA,EAC1B;AAEA,SAAO;AACT;AAMO,SAAS,mBAAyB;AACvC,QAAM,iBAAiB,QAAQ;AAE/B,MAAI,gBAAgB,gBAAgB,gBAAgB,IAAI,GAAG;AACzD,YAAQ,MAAM,MAAM,IAAI,iCAA4B,CAAC;AACrD,YAAQ,MAAM,MAAM,OAAO,uBAAuB,cAAc,EAAE,CAAC;AACnE,YAAQ,MAAM,MAAM,OAAO,0BAA0B,gBAAgB,EAAE,CAAC;AACxE,YAAQ,MAAM;AACd,YAAQ,MAAM,MAAM,KAAK,mCAA4B,CAAC;AACtD,YAAQ,MAAM,MAAM,KAAK,8CAA8C,CAAC;AACxE,YAAQ,MAAM,MAAM,KAAK,8CAA8C,CAAC;AACxE,YAAQ,MAAM,MAAM,KAAK,oCAAoC,CAAC;AAC9D,YAAQ,MAAM;AACd,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;;;ACjDA,SAAS,WAAAA,iBAAe;;;ACHjB,IAAM,YAAN,cAAwB,MAAM;AAAA,EACjC,YACI,SACO,UACT;AACE,UAAM,OAAO;AAFN;AAGP,SAAK,OAAO;AAAA,EAChB;AACJ;AAKO,IAAM,kBAAN,cAA8B,UAAU;AAAA,EAC3C,YAAY,SAAiB;AACzB,UAAM,SAAS,CAAC;AAChB,SAAK,OAAO;AAAA,EAChB;AACJ;AAeO,IAAM,gBAAN,cAA4B,UAAU;AAAA,EACzC,YAAY,SAAiB;AACzB,UAAM,SAAS,CAAC;AAChB,SAAK,OAAO;AAAA,EAChB;AACJ;AAKO,IAAM,eAAN,cAA2B,UAAU;AAAA,EACxC,YAAY,SAAiB;AACzB,UAAM,SAAS,CAAC;AAChB,SAAK,OAAO;AAAA,EAChB;AACJ;;;ACnDA,SAAS,YAAY,UAAU;AAC/B,SAAS,YAAY;AACrB,SAAS,eAAe;AA8BjB,IAAM,kBAAN,MAAsB;AAAA,EACV;AAAA,EACA;AAAA,EAEjB,cAAc;AACZ,SAAK,UAAU,KAAK,QAAQ,GAAG,OAAO;AACtC,SAAK,WAAW,KAAK,KAAK,SAAS,QAAQ;AAAA,EAC7C;AAAA,EAEA,cAAsB;AACpB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,SAAS,OAAgB,UAA2B,CAAC,GAA2B;AACpF,UAAM,MAAM,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AACpE,UAAM,UAAS,oBAAI,KAAK,GAAE,YAAY;AACtC,UAAM,eAAe,OAAO,QAAQ,SAAS,GAAG;AAEhD,UAAM,QAAuB;AAAA,MAC3B,WAAW;AAAA,MACX,SAAS,QAAQ;AAAA,MACjB,SAAS,QAAQ;AAAA,MACjB,MAAM,IAAI,QAAQ;AAAA,MAClB,SAAS,IAAI,WAAW;AAAA,MACxB,OAAO,IAAI;AAAA,MACX,UAAU,iBAAiB,YAAY,MAAM,WAAW;AAAA,MACxD,SAAS,QAAQ;AAAA,IACnB;AAEA,QAAI;AACF,YAAM,GAAG,MAAM,KAAK,UAAU,EAAE,WAAW,MAAM,MAAM,IAAM,CAAC;AAC9D,YAAM,WAAW,KAAK,KAAK,UAAU,SAAS,YAAY,OAAO;AACjE,YAAM,GAAG,UAAU,UAAU,KAAK,UAAU,OAAO,MAAM,CAAC,GAAG,EAAE,MAAM,IAAM,CAAC;AAG5E,YAAM,KAAK,gBAAgB,EAAE;AAC7B,aAAO;AAAA,IACT,QAAQ;AAEN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,OAA0B;AAC9B,QAAI;AACF,YAAM,UAAU,MAAM,GAAG,QAAQ,KAAK,UAAU,EAAE,eAAe,KAAK,CAAC;AACvE,aAAO,QACJ,OAAO,CAAC,MAAM,EAAE,OAAO,KAAK,EAAE,KAAK,SAAS,OAAO,CAAC,EACpD,IAAI,CAAC,MAAM,KAAK,KAAK,UAAU,EAAE,IAAI,CAAC,EACtC,KAAK,EACL,QAAQ;AAAA,IACb,QAAQ;AACN,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AAAA,EAEA,MAAM,QAAQC,QAA6C;AACzD,QAAI;AACF,YAAM,UAAU,MAAM,GAAG,SAASA,QAAM,OAAO;AAC/C,YAAM,QAAQ,OAAO,WAAW,SAAS,OAAO;AAChD,YAAM,QAAQ,KAAK,MAAM,OAAO;AAChC,aAAO,EAAE,OAAO,MAAM;AAAA,IACxB,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,cAAc,SAAmF;AACrG,UAAM,QAAQ,MAAM,KAAK,KAAK;AAC9B,UAAM,WAAW,MAAM,MAAM,GAAG,QAAQ,UAAU;AAElD,UAAM,SAA8B,EAAE,OAAO,CAAC,GAAG,YAAY,EAAE;AAE/D,eAAWA,UAAQ,UAAU;AAC3B,YAAM,OAAO,MAAM,KAAK,QAAQA,MAAI;AACpC,UAAI,CAAC,KAAM;AAEX,UAAI,OAAO,aAAa,KAAK,QAAQ,QAAQ,YAAY;AACvD;AAAA,MACF;AAEA,aAAO,MAAM,KAAK,EAAE,MAAAA,QAAM,OAAO,KAAK,OAAO,OAAO,KAAK,MAAM,CAAC;AAChE,aAAO,cAAc,KAAK;AAAA,IAC5B;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,MAAM,WAAoC;AAC9C,UAAM,QAAQ;AAAA,MACZ,UAAU,IAAI,OAAO,MAAM;AACzB,YAAI;AACF,gBAAM,GAAG,GAAG,GAAG,EAAE,OAAO,KAAK,CAAC;AAAA,QAChC,QAAQ;AAAA,QAER;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAc,gBAAgB,UAAiC;AAC7D,QAAI;AACF,YAAM,QAAQ,MAAM,KAAK,KAAK;AAC9B,YAAM,WAAW,MAAM,MAAM,QAAQ;AACrC,UAAI,SAAS,WAAW,EAAG;AAC3B,YAAM,KAAK,MAAM,QAAQ;AAAA,IAC3B,QAAQ;AAAA,IAER;AAAA,EACF;AACF;;;AFrIA,SAAS,YAAAC,iBAAgB;;;AGTzB;AAAA,EACE,MAAQ;AAAA,EACR,SAAW;AAAA,EACX,aAAe;AAAA,EACf,MAAQ;AAAA,EACR,KAAO;AAAA,IACL,GAAK;AAAA,IACL,MAAQ;AAAA,EACV;AAAA,EACA,SAAW;AAAA,IACT,KAAK;AAAA,EACP;AAAA,EACA,OAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,SAAW;AAAA,IACT,MAAQ;AAAA,EACV;AAAA,EACA,SAAW;AAAA,EACX,QAAU;AAAA,EACV,YAAc;AAAA,IACZ,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,WAAa;AAAA,EACf;AAAA,EACA,UAAY;AAAA,EACZ,UAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,SAAW;AAAA,IACT,aAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,OAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,SAAW;AAAA,IACX,iBAAiB;AAAA,EACnB;AAAA,EACA,cAAgB;AAAA,IACd,qBAAqB;AAAA,IACrB,WAAW;AAAA,IACX,UAAY;AAAA,IACZ,OAAS;AAAA,IACT,OAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,cAAc;AAAA,IACd,YAAc;AAAA,IACd,WAAa;AAAA,IACb,WAAa;AAAA,IACb,OAAS;AAAA,IACT,QAAU;AAAA,IACV,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,QAAU;AAAA,IACV,KAAO;AAAA,IACP,eAAe;AAAA,IACf,kBAAkB;AAAA,IAClB,QAAU;AAAA,IACV,mBAAmB;AAAA,IACnB,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,WAAW;AAAA,IACX,WAAW;AAAA,IACX,WAAW;AAAA,IACX,OAAS;AAAA,IACT,SAAW;AAAA,IACX,kBAAkB;AAAA,IAClB,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,KAAO;AAAA,EACT;AAAA,EACA,iBAAmB;AAAA,IACjB,mBAAmB;AAAA,IACnB,iBAAiB;AAAA,IACjB,0BAA0B;AAAA,IAC1B,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,oCAAoC;AAAA,IACpC,6BAA6B;AAAA,IAC7B,uBAAuB;AAAA,IACvB,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,YAAc;AAAA,IACd,QAAU;AAAA,EACZ;AACF;;;ACpGA,SAAS,YAAYC,WAAU;AAC/B,SAAS,QAAAC,aAAY;AACrB,SAAS,WAAAC,gBAAe;AAOjB,IAAM,gBAAN,MAAoB;AAAA,EACN;AAAA,EACA;AAAA,EAEjB,cAAc;AACV,SAAK,YAAYD,MAAKC,SAAQ,GAAG,OAAO;AACxC,SAAK,aAAaD,MAAK,KAAK,WAAW,aAAa;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAA2B;AAC7B,QAAI;AACA,YAAMD,IAAG,OAAO,KAAK,UAAU;AAC/B,aAAO;AAAA,IACX,QAAQ;AACJ,aAAO;AAAA,IACX;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAmC;AACrC,QAAI,CAAE,MAAM,KAAK,OAAO,GAAI;AACxB,aAAO;AAAA,IACX;AAEA,QAAI;AACA,YAAM,UAAU,MAAMA,IAAG,SAAS,KAAK,YAAY,OAAO;AAC1D,aAAO,KAAK,MAAM,OAAO;AAAA,IAC7B,SAAS,OAAO;AACZ,YAAM,IAAI;AAAA,QACN,0BAA0B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MACpF;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,KAAK,QAAmC;AAC1C,QAAI;AAEA,YAAMA,IAAG,MAAM,KAAK,WAAW,EAAE,WAAW,MAAM,MAAM,IAAM,CAAC;AAG/D,YAAMA,IAAG,UAAU,KAAK,YAAY,KAAK,UAAU,QAAQ,MAAM,CAAC,GAAG;AAAA,QACjE,MAAM;AAAA,MACV,CAAC;AAAA,IACL,SAAS,OAAO;AACZ,YAAM,IAAI;AAAA,QACN,0BAA0B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MACpF;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAwB;AACpB,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,eAAuB;AACnB,WAAO,KAAK;AAAA,EAChB;AACJ;;;ACnFA,SAAS,gBAAgB;AAMlB,SAAS,aAAqB;AACjC,QAAM,MAAM,SAAS,QAAQ,KAAK,CAAC,KAAK,EAAE;AAC1C,SAAO,QAAQ,SAAS,SAAS;AACrC;;;ACJA,IAAM,SAAS;AAAA,EACX,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AACV;AAGA,IAAI,gBAAgB;AACpB,IAAI,sBAAqC;AACzC,IAAI,qBAAqB;AACzB,IAAM,oBAAoB,KAAK,KAAK;AAK7B,SAAS,qBAAqB;AACjC,uBAAqB;AACzB;AAMA,eAAsB,uBAAsC;AACxD,MAAI,CAAC,mBAAoB;AAEzB,MAAI;AAEA,UAAM,MAAM,KAAK,IAAI;AACrB,QAAI,MAAM,gBAAgB,qBAAqB,qBAAqB;AAChE,UAAI,eAAe,qBAAqB,gBAAY,OAAO,GAAG;AAC1D,+BAAuB,mBAAmB;AAAA,MAC9C;AACA;AAAA,IACJ;AAEA,UAAM,gBAAgB,IAAI,cAAc;AACxC,UAAM,SAAS,MAAM,cAAc,KAAK;AAExC,QAAI,CAAC,QAAQ;AACT;AAAA,IACJ;AAGA,UAAM,WAAW,MAAM,MAAM,GAAG,OAAO,MAAM,wBAAwB;AAAA,MACjE,SAAS;AAAA,QACL,mBAAmB,OAAO;AAAA,MAC9B;AAAA,MACA,QAAQ,YAAY,QAAQ,GAAI;AAAA;AAAA,IACpC,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AACd;AAAA,IACJ;AAEA,UAAM,OAAO,MAAM,SAAS,KAAK;AAOjC,oBAAgB;AAChB,0BAAsB,KAAK;AAE3B,QAAI,eAAe,KAAK,SAAS,gBAAY,OAAO,GAAG;AACnD,6BAAuB,KAAK,OAAO;AAAA,IACvC;AAAA,EACJ,QAAQ;AAAA,EAER;AACJ;AAKA,SAAS,eAAe,QAAgB,OAAwB;AAC5D,QAAM,cAAc,OAAO,MAAM,GAAG,EAAE,IAAI,MAAM;AAChD,QAAM,aAAa,MAAM,MAAM,GAAG,EAAE,IAAI,MAAM;AAE9C,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AACxB,UAAM,IAAI,YAAY,CAAC,KAAK;AAC5B,UAAM,IAAI,WAAW,CAAC,KAAK;AAE3B,QAAI,IAAI,EAAG,QAAO;AAClB,QAAI,IAAI,EAAG,QAAO;AAAA,EACtB;AAEA,SAAO;AACX;AAKA,SAAS,uBAAuB,eAA6B;AACzD,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,GAAG,OAAO,MAAM,2WAA+D,OAAO,KAAK,EAAE;AACzG,UAAQ,IAAI,GAAG,OAAO,MAAM,SAAI,OAAO,KAAK,KAAK,OAAO,IAAI,kCAAwB,OAAO,KAAK,IAAI,gBAAY,OAAO,WAAM,OAAO,IAAI,GAAG,aAAa,GAAG,OAAO,KAAK,qBAAqB,OAAO,MAAM,SAAI,OAAO,KAAK,EAAE;AAC3N,UAAQ,IAAI,GAAG,OAAO,MAAM,SAAI,OAAO,KAAK,UAAU,OAAO,IAAI,GAAG,WAAW,CAAC,WAAW,OAAO,KAAK,sCAAsC,OAAO,MAAM,SAAI,OAAO,KAAK,EAAE;AAC5K,UAAQ,IAAI,GAAG,OAAO,MAAM,2WAA+D,OAAO,KAAK,EAAE;AACzG,UAAQ,IAAI,EAAE;AAClB;;;AC3GA,SAAS,eAAe;AACxB,OAAOG,YAAW;AAClB,OAAO,WAAW;;;ACDlB,SAAS,UAAU,SAAS,MAAM,UAAU,WAAAC,gBAAe;AAC3D,SAAS,WAAW,mBAAmB;AA0BvC,SAAS,gBAAwC;AAC7C,SAAO;AAAA,IACH,IAAI,SAAS;AAAA,IACb,WAAW,QAAQ;AAAA,IACnB,MAAM,KAAK;AAAA,IACX;AAAA,IACA,UAAU,SAAS;AAAA,IACnB,SAASC,SAAQ;AAAA,EACrB;AACJ;AAMO,IAAM,kBAAN,MAAsB;AAAA,EACjB;AAAA,EAER,cAAc;AACV,SAAK,gBAAgB,IAAI,cAAc;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,MAAM,QAAwB,QAAwC;AACxE,QAAI;AACA,YAAM,SAAS,MAAM,KAAK,cAAc,KAAK;AAC7C,UAAI,CAAC,UAAU,CAAC,OAAO,aAAa,CAAC,OAAO,QAAQ;AAChD;AAAA,MACJ;AAEA,YAAM,WAAW,GAAG,OAAO,OAAO,QAAQ,OAAO,EAAE,CAAC;AAGpD,WAAK,kBAAkB,UAAU,OAAO,WAAW,QAAQ,MAAM,EAAE;AAAA,QAC/D,MAAM;AAAA,QAEN;AAAA,MACJ;AAAA,IACJ,QAAQ;AAAA,IAER;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,UAAU,QAAwB,QAA2C;AAC/E,QAAI;AACA,YAAM,SAAS,MAAM,KAAK,cAAc,KAAK;AAC7C,UAAI,CAAC,UAAU,CAAC,OAAO,aAAa,CAAC,OAAO,QAAQ;AAChD,eAAO;AAAA,MACX;AAEA,YAAM,WAAW,GAAG,OAAO,OAAO,QAAQ,OAAO,EAAE,CAAC;AACpD,aAAO,MAAM,KAAK,kBAAkB,UAAU,OAAO,WAAW,QAAQ,MAAM;AAAA,IAClF,QAAQ;AACJ,aAAO;AAAA,IACX;AAAA,EACJ;AAAA,EAEA,MAAc,kBACV,UACA,WACA,QACA,QACgB;AAChB,QAAI;AAEA,YAAM,iBAAiB;AAAA,QACnB,GAAG,cAAc;AAAA,QACjB,GAAG;AAAA,MACP;AAEA,YAAM,WAAW,MAAM,MAAM,UAAU;AAAA,QACnC,QAAQ;AAAA,QACR,SAAS;AAAA,UACL,gBAAgB;AAAA,UAChB,mBAAmB;AAAA,QACvB;AAAA,QACA,MAAM,KAAK,UAAU;AAAA,UACjB;AAAA,UACA,QAAQ;AAAA,UACR,eAAe,gBAAY;AAAA,QAC/B,CAAC;AAAA;AAAA,QAED,QAAQ,YAAY,QAAQ,GAAK;AAAA,MACrC,CAAC;AAED,aAAO,SAAS;AAAA,IACpB,QAAQ;AACJ,aAAO;AAAA,IACX;AAAA,EACJ;AACJ;AAGA,IAAI,mBAA2C;AAKxC,SAAS,qBAAsC;AAClD,MAAI,CAAC,kBAAkB;AACnB,uBAAmB,IAAI,gBAAgB;AAAA,EAC3C;AACA,SAAO;AACX;AAMO,SAAS,YAAY,QAAwB,QAA+B;AAC/E,qBAAmB,EAAE,MAAM,QAAQ,MAAM;AAC7C;AAMA,eAAsB,gBAAgB,QAAwB,QAA2C;AACrG,SAAO,mBAAmB,EAAE,UAAU,QAAQ,MAAM;AACxD;;;ADjJO,SAAS,oBAA6B;AAC3C,QAAM,MAAM,IAAI,QAAQ,MAAM,EAC3B,YAAY,gDAA6B,EACzC,OAAO,mBAAmB,oBAAoB,EAC9C,OAAO,sBAAsB,iBAAiB,EAC9C,OAAO,OAAO,YAAyB;AACtC,UAAM,WAAW,OAAO;AAAA,EAC1B,CAAC;AAEH,SAAO;AACT;AAEA,eAAe,WAAW,SAAqC;AAC7D,QAAM,gBAAgB,IAAI,cAAc;AAExC,MAAI;AACJ,MAAI;AACJ,MAAI,gBAAgB;AAGpB,QAAM,iBAAiB,MAAM,cAAc,KAAK;AAChD,MAAI,gBAAgB;AAClB,YAAQ;AAAA,MACNC,OAAM,OAAO,uEAA8B;AAAA,MAC3CA,OAAM,IAAI,cAAc,cAAc,CAAC;AAAA,IACzC;AACA,YAAQ;AAAA,MACNA,OAAM,IAAI,0GAAoD;AAAA,IAChE;AAAA,EACF;AAGA,MAAI,QAAQ,UAAU,QAAQ,WAAW;AAEvC,aAAS,QAAQ;AACjB,gBAAY,QAAQ;AAAA,EACtB,WAAW,QAAQ,UAAU,QAAQ,WAAW;AAE9C,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF,OAAO;AAEL,oBAAgB;AAEhB,YAAQ;AAAA,MACN,MAAMA,OAAM,KAAK,KAAK,6BAAsB,GAAG;AAAA,QAC7C,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,QAAQ,EAAE;AAAA,QAChD,aAAa;AAAA,QACb,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AACA,YAAQ,IAAI;AAGZ,UAAM,WAAW,MAAM,OAAO,UAAU;AACxC,UAAM,KAAK,SAAS,gBAAgB;AAAA,MAClC,OAAO,QAAQ;AAAA,MACf,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAED,UAAM,WAAW,CAAC,WAAoC;AACpD,aAAO,IAAI,QAAQ,CAACC,aAAY;AAC9B,WAAG,SAAS,QAAQ,CAAC,WAAW;AAC9B,UAAAA,SAAQ,MAAM;AAAA,QAChB,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAEA,aAAS,MAAM;AAAA,MACbD,OAAM,IAAI,SAAS,IAAIA,OAAM,KAAK,4BAA4B;AAAA,IAChE;AACA,QAAI,CAAC,QAAQ;AACX,eAAS;AAAA,IACX;AAEA,gBAAY,MAAM,SAASA,OAAM,IAAI,cAAc,CAAC;AACpD,QAAI,CAAC,WAAW;AACd,SAAG,MAAM;AACT,YAAM,IAAI,gBAAgB,qCAAwB;AAAA,IACpD;AAEA,OAAG,MAAM;AAAA,EACX;AAGA,MAAI;AACF,QAAI,IAAI,MAAM;AAAA,EAChB,QAAQ;AACN,UAAM,IAAI,gBAAgB,4DAAgC;AAAA,EAC5D;AAEA,UAAQ,IAAIA,OAAM,IAAI,4CAA+B,CAAC;AAUtD,QAAM,cAAc,KAAK;AAAA,IACvB;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,aAAa;AAAA,EACf,CAAC;AAGD,QAAM,gBAAgB,QAAQ;AAAA,IAC5B,YAAY,cAAc,cAAc;AAAA,IACxC,MAAM,gBAAgB,gBAAgB;AAAA,IACtC,YAAY,CAAC,CAAC;AAAA,EAChB,CAAC;AAED,UAAQ;AAAA,IACNA,OAAM,MAAM,sDAAuB;AAAA,IACnCA,OAAM,IAAI,cAAc,cAAc,CAAC;AAAA,EACzC;AACA,UAAQ,IAAI;AACZ,UAAQ;AAAA,IACNA,OAAM,IAAI,iDAAuB;AAAA,IACjCA,OAAM,KAAK,IAAI,WAAW,CAAC,SAAS;AAAA,IACpCA,OAAM,IAAI,gDAAuB;AAAA,EACnC;AACF;;;AErIA,SAAS,WAAAE,gBAAe;AACxB,OAAOC,YAAW;AAClB,OAAOC,YAAW;;;ACRlB,SAAS,YAAYC,WAAU;AAC/B,SAAS,QAAAC,aAAY;AACrB,SAAS,WAAAC,gBAAe;AACxB,SAAS,kBAAkB;AAC3B,SAAS,kBAAkB;AAmEpB,IAAM,oBAAN,MAAwB;AAAA,EACV;AAAA,EACA;AAAA,EAEjB,YAAY,cAAsB,QAAQ,IAAI,GAAG;AAC7C,SAAK,WAAWC,MAAKC,SAAQ,GAAG,SAAS,OAAO;AAChD,SAAK,eAAeD,MAAK,aAAa,SAAS,eAAe;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,YAAY,QAAoB,OAAoC;AACtE,UAAM,gBAA0B,CAAC;AAEjC,eAAWE,UAAQ,OAAO;AACtB,UAAIA,OAAK,WAAW,UAAU,GAAG;AAE7B,cAAM,cAAcA,OAAK,UAAU,WAAW,MAAM;AACpD,cAAM,aAAa,MAAM,KAAK,KAAK,MAAM;AAIzC,YAAI,gBAAgB,QAAQ;AACxB,wBAAc,KAAK,GAAG,WAAW,IAAI,OAAK,EAAE,QAAQ,CAAC;AAAA,QACzD,OAAO;AACH,kBAAQ,KAAK,6BAA6B,WAAW,aAAa;AAAA,QACtE;AAAA,MACJ,OAAO;AAEH,sBAAc,KAAKA,MAAI;AAAA,MAC3B;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAK,QAAoB,SAAmE;AAC9F,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,SAAS,IAAK,QAAO,IAAI,OAAO,QAAQ,GAAG;AAC/C,QAAI,SAAS,OAAQ,QAAO,IAAI,UAAU,QAAQ,MAAM;AAExD,UAAM,MAAM,GAAG,OAAO,MAAM,kBAAkB,OAAO,SAAS,IAAI,MAAM,OAAO,SAAS,IAAI,EAAE;AAE9F,UAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAC9B,SAAS,EAAE,mBAAmB,OAAO,UAAU;AAAA,IACnD,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AACd,YAAM,IAAI,aAAa,mCAAmC,SAAS,MAAM,EAAE;AAAA,IAC/E;AAEA,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,QAAoC;AAC/C,UAAM,WAAW,MAAM,MAAM,GAAG,OAAO,MAAM,aAAa;AAAA,MACtD,SAAS,EAAE,mBAAmB,OAAO,UAAU;AAAA,IACnD,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AACd,YAAM,IAAI,aAAa,6BAA6B,SAAS,MAAM,EAAE;AAAA,IACzE;AAEA,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAI,QAAoB,UAAsC;AAChE,UAAM,cAAc,mBAAmB,QAAQ;AAC/C,UAAM,WAAW,MAAM,MAAM,GAAG,OAAO,MAAM,mBAAmB,WAAW,IAAI;AAAA,MAC3E,SAAS,EAAE,mBAAmB,OAAO,UAAU;AAAA,IACnD,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AACd,UAAI,SAAS,WAAW,KAAK;AACzB,cAAM,IAAI,MAAM,wBAAwB,QAAQ,EAAE;AAAA,MACtD;AACA,YAAM,IAAI,aAAa,iCAAiC,SAAS,MAAM,EAAE;AAAA,IAC7E;AAEA,WAAO,MAAM,SAAS,KAAK;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,QAA0C;AACpD,UAAM,WAAW,MAAM,MAAM,GAAG,OAAO,MAAM,wBAAwB;AAAA,MACjE,SAAS,EAAE,mBAAmB,OAAO,UAAU;AAAA,IACnD,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AACd,YAAM,IAAI,aAAa,uCAAuC,SAAS,MAAM,EAAE;AAAA,IACnF;AAEA,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,QAAoB,UAAkB,WAAkC;AAClF,UAAM,YAAY,MAAM,KAAK,IAAI,QAAQ,QAAQ;AAEjD,QAAI,CAAC,UAAU,SAAS;AACpB,YAAM,IAAI,MAAM,aAAa,QAAQ,iBAAiB;AAAA,IAC1D;AAEA,QAAI,kBAAkB,UAAU;AAEhC,QAAI,UAAU,gBAAgB,YAAY,UAAU,gBAAgB,OAAO;AAEvE,UAAI;AACJ,UAAI,UAAU,gBAAgB,UAAU;AAEpC,cAAM,aAAa,OAAO,KAAK,UAAU,SAAS,QAAQ;AAC1D,qBAAa,WAAW,UAAU,EAAE,SAAS,OAAO;AACpD,0BAAkB;AAAA,MACtB,OAAO;AAEH,qBAAa,UAAU;AAAA,MAC3B;AAEA,YAAM,SAAS,KAAK,MAAM,UAAU;AAGpC,YAAM,WAAWF,MAAK,WAAW,QAAQ;AACzC,YAAMG,IAAG,MAAM,UAAU,EAAE,WAAW,KAAK,CAAC;AAG5C,YAAMA,IAAG,UAAUH,MAAK,UAAU,UAAU,GAAG,OAAO,IAAI;AAG1D,iBAAW,CAAC,WAAW,OAAO,KAAK,OAAO,QAAQ,OAAO,MAAM,GAAG;AAC9D,YAAI,cAAc,WAAY;AAC9B,cAAM,gBAAgBA,MAAK,UAAU,SAAS;AAC9C,cAAMG,IAAG,MAAMH,MAAK,eAAe,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAC7D,cAAMG,IAAG,UAAU,eAAe,OAAO;AAAA,MAC7C;AAAA,IACJ,WAAW,UAAU,gBAAgB,eAAe;AAGhD,YAAM,aAAa,OAAO,KAAK,UAAU,SAAS,QAAQ;AAC1D,YAAM,aAAa,WAAW,UAAU,EAAE,SAAS,OAAO;AAC1D,wBAAkB;AAElB,YAAM,SAAS,KAAK,MAAM,UAAU;AAGpC,YAAM,YAAYH,MAAK,WAAW,aAAa;AAG/C,UAAI;AACA,cAAMG,IAAG,GAAG,WAAW,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,MAC3D,QAAQ;AAAA,MAER;AAEA,YAAMA,IAAG,MAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAG7C,YAAMA,IAAG;AAAA,QACLH,MAAK,WAAW,aAAa;AAAA,QAC7B,KAAK,UAAU,OAAO,QAAQ,MAAM,CAAC;AAAA,MACzC;AAGA,iBAAW,CAAC,UAAU,OAAO,KAAK,OAAO,QAAQ,OAAO,KAAK,GAAG;AAC5D,cAAM,WAAWA,MAAK,WAAW,QAAQ;AACzC,cAAMG,IAAG,MAAMH,MAAK,UAAU,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AACxD,cAAMG,IAAG,UAAU,UAAU,OAAO;AAAA,MACxC;AAAA,IACJ,OAAO;AAEH,UAAI,UAAU,gBAAgB,YAAY;AACtC,0BAAkB,UAAU;AAAA,MAChC;AAEA,YAAM,aAAaH,MAAK,WAAW,QAAQ;AAC3C,YAAM,eAAeA,MAAK,YAAY,IAAI;AAC1C,YAAMG,IAAG,MAAM,cAAc,EAAE,WAAW,KAAK,CAAC;AAChD,YAAMA,IAAG,UAAU,YAAY,UAAU,OAAO;AAAA,IACpD;AAGA,UAAM,KAAK,cAAc,UAAU,UAAU,SAAS,KAAK,kBAAkB,eAAe,CAAC;AAAA,EACjG;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAA4D;AAC9D,QAAI;AACA,YAAM,UAAU,MAAMA,IAAG,SAAS,KAAK,cAAc,OAAO;AAC5D,aAAO,KAAK,MAAM,OAAO;AAAA,IAC7B,QAAQ;AACJ,aAAO,CAAC;AAAA,IACZ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,UAAkB,SAAiB,UAAiC;AACpF,UAAM,YAAY,MAAM,KAAK,aAAa;AAC1C,cAAU,QAAQ,IAAI;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,UAAU;AAAA,IACd;AAEA,UAAMA,IAAG,MAAMH,MAAK,KAAK,cAAc,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AACjE,UAAMG,IAAG,UAAU,KAAK,cAAc,KAAK,UAAU,WAAW,MAAM,CAAC,CAAC;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,QAAoB,WAAqF;AACxH,UAAM,WAAW,MAAM,MAAM,GAAG,OAAO,MAAM,6BAA6B;AAAA,MACtE,QAAQ;AAAA,MACR,SAAS;AAAA,QACL,mBAAmB,OAAO;AAAA,QAC1B,gBAAgB;AAAA,MACpB;AAAA,MACA,MAAM,KAAK,UAAU,EAAE,UAAU,CAAC;AAAA,IACtC,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AACd,YAAM,IAAI,aAAa,iCAAiC,SAAS,MAAM,EAAE;AAAA,IAC7E;AAEA,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,wBAAwB,QAAoB,WAAwC;AACtF,UAAM,WAAW,oBAAI,IAAY;AACjC,UAAM,QAAQ,CAAC,GAAG,SAAS;AAC3B,UAAM,OAAO,oBAAI,IAAY;AAE7B,WAAO,MAAM,SAAS,GAAG;AACrB,YAAM,UAAU,MAAM,MAAM;AAC5B,UAAI,KAAK,IAAI,OAAO,EAAG;AACvB,WAAK,IAAI,OAAO;AAChB,eAAS,IAAI,OAAO;AAEpB,UAAI;AAIA,cAAM,YAAY,MAAM,KAAK,IAAI,QAAQ,OAAO;AAEhD,YAAI,UAAU,cAAc;AACxB,qBAAW,OAAO,UAAU,cAAc;AACtC,gBAAI,CAAC,IAAI,SAAU;AAEnB,kBAAM,UAAU,OAAO,QAAQ,WAAW,MAAM,IAAI;AACpD,gBAAI,CAAC,KAAK,IAAI,OAAO,GAAG;AACpB,oBAAM,KAAK,OAAO;AAAA,YACtB;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ,SAAS,OAAO;AACZ,gBAAQ,KAAK,+CAA+C,OAAO,KAAK,KAAK,EAAE;AAAA,MACnF;AAAA,IACJ;AAEA,WAAO,MAAM,KAAK,QAAQ;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,UAAkB,WAA2C;AAC1E,UAAM,aAAaH,MAAK,WAAW,QAAQ;AAE3C,QAAI;AACA,YAAMG,IAAG,OAAO,UAAU;AAAA,IAC9B,QAAQ;AACJ,aAAO;AAAA,IACX;AAEA,UAAM,aAAY,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,SAAS,GAAG;AAC/D,UAAM,YAAYH,MAAK,WAAW,MAAM,gBAAgB,SAAS;AACjE,UAAM,aAAaA,MAAK,WAAW,QAAQ;AAE3C,UAAM,QAAQ,MAAMG,IAAG,KAAK,UAAU;AAEtC,UAAMA,IAAG,MAAMH,MAAK,YAAY,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAE1D,QAAI,MAAM,YAAY,GAAG;AACrB,YAAMG,IAAG,GAAG,YAAY,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,IAC3D,OAAO;AACH,YAAMA,IAAG,SAAS,YAAY,UAAU;AAAA,IAC5C;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,aAAwC;AACtD,UAAM,aAAaH,MAAK,aAAa,cAAc;AACnD,QAAI;AACA,YAAM,UAAU,MAAMG,IAAG,QAAQ,YAAY,EAAE,eAAe,KAAK,CAAC;AACpE,aAAO,QACF,OAAO,OAAK,EAAE,YAAY,CAAC,EAC3B,IAAI,OAAK,EAAE,IAAI,EACf,KAAK,EACL,QAAQ;AAAA,IACjB,QAAQ;AACJ,aAAO,CAAC;AAAA,IACZ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,aAAoC;AACnD,UAAM,aAAaH,MAAK,aAAa,cAAc;AACnD,QAAI;AACA,YAAMG,IAAG,GAAG,YAAY,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,IAC5D,SAAS,OAAO;AAAA,IAEhB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,SAAyB;AACvC,WAAO,WAAW,QAAQ,EAAE,OAAO,OAAO,EAAE,OAAO,KAAK,EAAE,UAAU,GAAG,EAAE;AAAA,EAC7E;AACJ;;;ADnaA,SAAS,YAAYC,WAAU;AAC/B,SAAS,QAAAC,aAAY;AACrB,SAAS,WAAAC,gBAAe;AAOjB,SAAS,sBAA+B;AAC7C,QAAM,MAAM,IAAIC,SAAQ,QAAQ,EAC7B,YAAY,yEAA4C,EACxD,OAAO,UAAU,gBAAgB,EACjC,OAAO,aAAa,2BAA2B,EAC/C,OAAO,OAAO,YAAyB;AACtC,UAAM,aAAa,OAAO;AAAA,EAC5B,CAAC;AAEH,SAAO;AACT;AAEA,eAAe,aAAa,SAAqC;AAC/D,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,SAAS,MAAM,cAAc,KAAK;AAExC,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,gBAAgB,yBAAyB,WAAW,CAAC,eAAe;AAAA,EAChF;AAEA,QAAM,oBAAoB,IAAI,kBAAkB;AAChD,QAAM,gBAAgBC,MAAKC,SAAQ,GAAG,SAAS,WAAW;AAC1D,QAAM,gBAAgB,MAAM,iBAAiB;AAC7C,QAAM,sBAAsB,MAAM,kBAAkB,aAAa;AACjE,QAAM,iBAAiB,OAAO,KAAK,mBAAmB,EAAE;AAExD,QAAM,OAAO;AAAA,IACX,YAAY,cAAc,cAAc;AAAA,IACxC,QAAQ,OAAO;AAAA,IACf,WAAW,QAAQ,OAAO,SAAS;AAAA,IACnC,SAAS,OAAO,WAAW;AAAA,IAC3B,aAAa,OAAO,eAAe;AAAA,IACnC;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI,QAAQ,MAAM;AAChB,YAAQ,IAAI,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AACzC;AAAA,EACF;AAGA,UAAQ;AAAA,IACNC,OAAMC,OAAM,KAAK,KAAK,8BAAuB,GAAG;AAAA,MAC9C,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,QAAQ,EAAE;AAAA,MAChD,aAAa;AAAA,MACb,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AAGA,UAAQ,IAAIA,OAAM,KAAK,8BAAe,CAAC;AACvC,UAAQ,IAAI,MAAMA,OAAM,IAAI,SAAS,CAAC,QAAQ,KAAK,UAAU,EAAE;AAC/D,UAAQ,IAAI,MAAMA,OAAM,IAAI,UAAU,CAAC,OAAO,KAAK,MAAM,EAAE;AAC3D,UAAQ,IAAI,MAAMA,OAAM,IAAI,aAAa,CAAC,IAAIA,OAAM,OAAO,KAAK,SAAS,CAAC,EAAE;AAG5E,UAAQ,IAAIA,OAAM,KAAK,uBAAgB,CAAC;AACxC,UAAQ,IAAI,MAAMA,OAAM,IAAI,UAAU,CAAC,OAAOA,OAAM,MAAM,KAAK,OAAO,CAAC,EAAE;AACzE,UAAQ,IAAI,MAAMA,OAAM,IAAI,UAAU,CAAC,OAAO,KAAK,WAAW,EAAE;AAChE,UAAQ,IAAI,MAAMA,OAAM,IAAI,WAAW,CAAC,MAAM,KAAK,aAAa,EAAE;AAGlE,UAAQ,IAAIA,OAAM,KAAK,qBAAc,CAAC;AACtC,QAAM,aAAa,KAAK,cAAc,SAClCA,OAAM,MAAM,QAAG,IACfA,OAAM,IAAI,QAAG;AACjB,UAAQ,IAAI,MAAMA,OAAM,IAAI,gBAAgB,CAAC,MAAM,UAAU,EAAE;AAC/D,MAAI,KAAK,cAAc,QAAQ;AAC7B,YAAQ;AAAA,MACN,MAAMA,OAAM,IAAI,aAAa,CAAC,SAASA,OAAM,KAAK,cAAc,CAAC;AAAA,IACnE;AAAA,EACF;AAGA,UAAQ,IAAI;AACZ,MAAI,CAAC,KAAK,cAAc,QAAQ;AAC9B,YAAQ;AAAA,MACNA,OAAM,IAAI,wBAAY,WAAW,CAAC,4DAA4C;AAAA,IAChF;AAAA,EACF,WAAW,iBAAiB,GAAG;AAC7B,YAAQ;AAAA,MACNA,OAAM,IAAI,wBAAY,WAAW,CAAC,mEAA0C;AAAA,IAC9E;AAAA,EACF;AACF;AAEA,SAAS,QAAQ,KAAqB;AACpC,MAAI,IAAI,UAAU,EAAG,QAAO;AAC5B,SAAO,SAAS,IAAI,MAAM,EAAE;AAC9B;AAEA,eAAe,mBAAmE;AAChF,QAAM,cAAcH,MAAK,QAAQ,IAAI,GAAG,OAAO;AAC/C,MAAI;AACF,UAAMI,IAAG,OAAO,WAAW;AAE3B,WAAO,EAAE,QAAQ,MAAM,SAAS,SAAS;AAAA,EAC3C,QAAQ;AACN,WAAO,EAAE,QAAQ,MAAM;AAAA,EACzB;AACF;;;AE3HA,OAAOC,YAAW;AAClB,SAAS,cAAc;AACvB,SAAS,WAAAC,gBAAe;;;ACFxB,OAAOC,UAAS,UAAU,WAAW,eAAe;AACpD,SAAS,OAAAC,MAAK,QAAAC,OAAM,UAAU,cAAc;AAC5C,OAAO,aAAa;AACpB,OAAO,eAAe;;;ACMtB,SAAS,YAAYC,WAAU;AAC/B,OAAO,UAAU;AACjB,OAAO,YAAY;;;ACOnB,SAAS,gBAAgB,SAA2B;AAChD,SAAO,YAAY,eAAe,YAAY;AAClD;AAKA,SAAS,mBAAmB,SAAkB,OAAwC;AAElF,MAAI,SAAS,MAAM,SAAS,EAAG,QAAO;AAGtC,MAAI,WAAW,CAAC,gBAAgB,OAAO,KAAK,YAAY,UAAU;AAC9D,WAAO,CAAC,OAAO;AAAA,EACnB;AAEA,SAAO;AACX;AAEO,IAAM,wBAAgE;AAAA,EACzE,QAAQ;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA,IACV,WAAW;AAAA,IACX,eAAe;AAAA,IACf,cAAc;AAAA,IACd,eAAe;AAAA;AAAA,IACf,oBAAoB;AAAA;AAAA,IACpB,qBAAqB,CAAC,SAA6B;AAC/C,YAAM,QAAQ,CAAC,KAAK;AAEpB,UAAI,KAAK,aAAa;AAClB,cAAM,KAAK,gBAAgB,KAAK,WAAW,EAAE;AAAA,MACjD;AAGA,YAAM,cAAc,KAAK,eAAe,gBAAgB,KAAK,OAAO;AAGpE,YAAM,QAAQ,mBAAmB,KAAK,SAAS,KAAK,KAAK;AACzD,UAAI,SAAS,MAAM,SAAS,GAAG;AAC3B,cAAM,KAAK,UAAU,MAAM,KAAK,IAAI,CAAC,EAAE;AAAA,MAC3C;AAEA,YAAM,KAAK,gBAAgB,WAAW,EAAE;AACxC,YAAM,KAAK,KAAK;AAChB,aAAO,MAAM,KAAK,IAAI;AAAA,IAC1B;AAAA,EACJ;AAAA,EACA,UAAU;AAAA,IACN,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA,IACV,WAAW;AAAA,IACX,eAAe;AAAA,IACf,cAAc;AAAA,IACd,eAAe;AAAA,IACf,qBAAqB,CAAC,SAA6B;AAG/C,UAAI;AAEJ,UAAI,KAAK,SAAS;AAEd,kBAAU,KAAK,YAAY,WAAW,cAAc,KAAK;AAAA,MAC7D,WAAW,KAAK,aAAa;AACzB,kBAAU;AAAA,MACd,WAAW,KAAK,SAAS,KAAK,MAAM,SAAS,GAAG;AAC5C,kBAAU,KAAK,MAAM,CAAC;AAAA,MAC1B,OAAO;AACH,kBAAU;AAAA,MACd;AAEA,aAAO;AAAA,WAAiB,OAAO;AAAA;AAAA,IACnC;AAAA,EACJ;AAAA,EACA,aAAa;AAAA,IACT,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA,IACV,WAAW;AAAA,IACX,eAAe;AAAA,IACf,cAAc;AAAA,IACd,eAAe;AAAA,IACf,qBAAqB,CAAC,SAA6B;AAG/C,UAAI;AAEJ,UAAI,KAAK,SAAS;AAEd,kBAAU,KAAK,YAAY,WAAW,cAAc,KAAK;AAAA,MAC7D,WAAW,KAAK,aAAa;AACzB,kBAAU;AAAA,MACd,WAAW,KAAK,SAAS,KAAK,MAAM,SAAS,GAAG;AAC5C,kBAAU,KAAK,MAAM,CAAC;AAAA,MAC1B,OAAO;AACH,kBAAU;AAAA,MACd;AAEA,aAAO;AAAA,WAAiB,OAAO;AAAA;AAAA,IACnC;AAAA,EACJ;AAAA,EACA,YAAY;AAAA,IACR,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA,IACV,WAAW;AAAA,IACX,eAAe;AAAA,IACf,cAAc;AAAA,IACd,eAAe;AAAA,IACf,qBAAqB,CAAC,SAA6B;AAC/C,YAAM,QAAQ,CAAC,KAAK;AAEpB,UAAI,KAAK,aAAa;AAClB,cAAM,KAAK,gBAAgB,KAAK,WAAW,EAAE;AAAA,MACjD;AAIA,YAAM,WAAW,KAAK,eAAe,gBAAgB,KAAK,OAAO;AAEjE,UAAI,CAAC,UAAU;AACX,cAAM,QAAQ,mBAAmB,KAAK,SAAS,KAAK,KAAK;AACzD,YAAI,SAAS,MAAM,SAAS,GAAG;AAC3B,gBAAM,KAAK,UAAU,MAAM,KAAK,IAAI,CAAC,EAAE;AAAA,QAC3C;AAAA,MACJ;AAEA,YAAM,KAAK,KAAK;AAChB,aAAO,MAAM,KAAK,IAAI;AAAA,IAC1B;AAAA,EACJ;AAAA,EACA,UAAU;AAAA,IACN,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA,IACV,WAAW;AAAA;AAAA,IACX,eAAe;AAAA,IACf,cAAc;AAAA;AAAA,IACd,eAAe;AAAA,IACf,qBAAqB,CAAC,SAA6B;AAE/C,YAAM,QAAQ,CAAC,KAAK;AAEpB,UAAI,KAAK,aAAa;AAClB,cAAM,KAAK,gBAAgB,KAAK,WAAW,EAAE;AAAA,MACjD;AAGA,YAAM,QAAQ,KAAK,SAAS;AAC5B,YAAM,KAAK,UAAU,KAAK,EAAE;AAG5B,UAAI,KAAK,OAAO;AACZ,cAAM,KAAK,UAAU,KAAK,KAAK,EAAE;AAAA,MACrC;AAEA,YAAM,KAAK,KAAK;AAChB,aAAO,MAAM,KAAK,IAAI;AAAA,IAC1B;AAAA,EACJ;AACJ;AAEO,SAAS,mBAAiC;AAC7C,SAAO,OAAO,KAAK,qBAAqB;AAC5C;;;ADvKO,IAAM,oBAAN,MAAwB;AAAA,EACnB;AAAA,EACA;AAAA,EAER,YAAY,cAAsB,QAAQ,IAAI,GAAG;AAC7C,SAAK,cAAc;AACnB,SAAK,WAAW,KAAK,KAAK,aAAa,OAAO;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAwC;AAE1C,UAAM,cAAc,MAAM,KAAK,gBAAgB,OAAO;AAGtD,UAAM,cAAc,MAAM,KAAK,eAAe;AAG9C,UAAM,QAAQ,CAAC,GAAG,aAAa,GAAG,WAAW;AAE7C,UAAM,YAAY,MAAM,KAAK,gBAAgB,WAAW;AACxD,UAAM,WAAgC,CAAC;AAEvC,WAAO;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY,MAAM,SAAS,UAAU,SAAS,SAAS;AAAA,IAC3D;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,iBAA+C;AACzD,UAAM,QAA6B,CAAC;AACpC,UAAM,YAAY,KAAK,KAAK,KAAK,UAAU,aAAa;AAExD,QAAI;AACA,YAAMC,IAAG,OAAO,SAAS;AAAA,IAC7B,QAAQ;AACJ,aAAO;AAAA,IACX;AAEA,UAAM,QAAQ,MAAMA,IAAG,QAAQ,SAAS;AAExC,eAAW,QAAQ,OAAO;AAEtB,UAAI,CAAC,KAAK,SAAS,KAAK,KAAK,CAAC,KAAK,SAAS,MAAM,EAAG;AAErD,UAAI,SAAS,cAAe;AAE5B,YAAM,WAAW,KAAK,KAAK,WAAW,IAAI;AAC1C,YAAM,OAAO,MAAMA,IAAG,KAAK,QAAQ;AACnC,UAAI,CAAC,KAAK,OAAO,EAAG;AAEpB,YAAM,UAAU,MAAMA,IAAG,SAAS,UAAU,OAAO;AAGnD,UAAI,cAAuC,CAAC;AAC5C,UAAI;AACA,cAAM,EAAE,KAAK,IAAI,OAAO,OAAO;AAC/B,sBAAc;AAAA,MAClB,QAAQ;AAAA,MAER;AAEA,YAAM,OAAO,KAAK,SAAS,MAAM,IAC3B,KAAK,SAAS,MAAM,MAAM,IAC1B,KAAK,SAAS,MAAM,KAAK;AAG/B,YAAM,UAAU,KAAK,eAAe,WAAW;AAG/C,YAAM,cAAc,KAAK,gBAAgB,OAAO;AAEhD,YAAM,KAAK;AAAA,QACP,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,cAAc,KAAK,SAAS,KAAK,aAAa,QAAQ;AAAA,QACtD,aAAa,YAAY;AAAA,QACzB,OAAO,KAAK,aAAa,WAAW;AAAA,QACpC;AAAA,QACA;AAAA,MACJ,CAAC;AAAA,IACL;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,gBAAgB,MAAwD;AAClF,UAAM,QAA6B,CAAC;AACpC,UAAM,UAAU,KAAK,KAAK,KAAK,UAAU,IAAI;AAE7C,QAAI;AACA,YAAMA,IAAG,OAAO,OAAO;AAAA,IAC3B,QAAQ;AACJ,aAAO;AAAA,IACX;AAEA,UAAM,QAAQ,MAAMA,IAAG,QAAQ,OAAO;AAEtC,eAAW,QAAQ,OAAO;AACtB,UAAI,CAAC,KAAK,SAAS,KAAK,EAAG;AAE3B,YAAM,WAAW,KAAK,KAAK,SAAS,IAAI;AACxC,YAAM,OAAO,MAAMA,IAAG,KAAK,QAAQ;AACnC,UAAI,CAAC,KAAK,OAAO,EAAG;AAEpB,YAAM,UAAU,MAAMA,IAAG,SAAS,UAAU,OAAO;AAEnD,UAAI,cAAuC,CAAC;AAC5C,UAAI;AACA,cAAM,EAAE,KAAK,IAAI,OAAO,OAAO;AAC/B,sBAAc;AAAA,MAClB,SAAS,GAAG;AAER,gBAAQ,KAAK,0BAAgB,IAAI,4BAA4B;AAC7D;AAAA,MACJ;AAEA,YAAM,OAAO,KAAK,SAAS,MAAM,KAAK;AAGtC,YAAM,UAAU,KAAK,eAAe,WAAW;AAG/C,YAAM,cAAc,KAAK,gBAAgB,OAAO;AAEhD,YAAM,KAAK;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA,cAAc,KAAK,SAAS,KAAK,aAAa,QAAQ;AAAA,QACtD,aAAa,YAAY;AAAA,QACzB,OAAO,KAAK,aAAa,WAAW;AAAA,QACpC;AAAA,QACA;AAAA,MACJ,CAAC;AAAA,IACL;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,oBACI,KACA,YACM;AACN,UAAM,SAAS,sBAAsB,GAAG;AACxC,QAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,gBAAgB,GAAG,EAAE;AAGlD,UAAM,cAAc,OAAO,oBAAoB;AAAA,MAC3C,aAAa,WAAW;AAAA,MACxB,OAAO,WAAW;AAAA,MAClB,SAAS,WAAW;AAAA,MACpB,aAAa,WAAW;AAAA,MACxB,YAAY,WAAW;AAAA,IAC3B,CAAC;AAGD,UAAM,YAAY,IAAI,WAAW,YAAY;AAG7C,QAAI,aAAa;AACb,aAAO,GAAG,WAAW;AAAA;AAAA,EAAO,SAAS;AAAA;AAAA,IACzC;AACA,WAAO,GAAG,SAAS;AAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QACF,MACA,cACA,SACA,YAC0B;AAC1B,UAAM,UAA6B,CAAC;AAEpC,eAAW,OAAO,MAAM;AACpB,YAAM,SAAS,sBAAsB,GAAG;AACxC,UAAI,CAAC,OAAQ;AAGb,UAAI,QAAQ,cAAc,aAAa,SAAS,OAAO,KAAK,QAAQ,MAAM,SAAS,GAAG;AAClF,cAAM,eAAe,MAAM,KAAK,qBAAqB,QAAQ,KAAK;AAClE,gBAAQ,KAAK,YAAY;AACzB,qBAAa,YAAY;AAAA,MAC7B;AAGA,iBAAW,QAAQ,cAAc;AAE7B,YAAI,QAAQ,cAAc,SAAS,SAAS;AACxC;AAAA,QACJ;AAEA,cAAM,QAAQ,SAAS,UAAU,QAAQ,QAC3B,SAAS,cAAc,QAAQ,YAC/B,QAAQ;AAEtB,mBAAW,QAAQ,OAAO;AACtB,gBAAM,SAAS,MAAM,KAAK,YAAY,KAAK,QAAQ,IAAI;AACvD,kBAAQ,KAAK,MAAM;AACnB,uBAAa,MAAM;AAAA,QACvB;AAAA,MACJ;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,qBAAqB,OAAsD;AACrF,UAAM,aAAa,KAAK,KAAK,KAAK,aAAa,WAAW;AAE1D,QAAI;AAEA,UAAI,SAAgC;AACpC,UAAI;AACA,cAAMA,IAAG,OAAO,UAAU;AAC1B,iBAAS;AAAA,MACb,QAAQ;AAAA,MAER;AAGA,YAAM,QAAQ;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAEA,iBAAW,QAAQ,OAAO;AACtB,cAAM,KAAK,IAAI,KAAK,YAAY,EAAE;AAAA,MACtC;AAEA,YAAM,KAAK,EAAE;AAEb,YAAMA,IAAG,UAAU,YAAY,MAAM,KAAK,IAAI,GAAG,OAAO;AAExD,aAAO;AAAA,QACH,QAAQ;AAAA,UACJ,MAAM;AAAA,UACN,MAAM;AAAA,UACN,UAAU;AAAA,UACV,cAAc;AAAA,UACd,aAAa,UAAU,MAAM,MAAM;AAAA,UACnC,aAAa;AAAA,QACjB;AAAA,QACA,WAAW;AAAA,QACX,YAAY;AAAA,QACZ;AAAA,MACJ;AAAA,IACJ,SAAS,OAAO;AACZ,aAAO;AAAA,QACH,QAAQ;AAAA,UACJ,MAAM;AAAA,UACN,MAAM;AAAA,UACN,UAAU;AAAA,UACV,cAAc;AAAA,UACd,aAAa;AAAA,QACjB;AAAA,QACA,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MACpD;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,YACV,KACA,QACA,MACwB;AACxB,QAAI;AAEA,YAAM,aAAa,KAAK,cAAc,QAAQ,IAAI;AAElD,UAAI,CAAC,YAAY;AACb,eAAO;AAAA,UACH,QAAQ;AAAA,UACR,WAAW;AAAA,UACX,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,OAAO,OAAO,OAAO,EAAE,qBAAqB,KAAK,IAAI;AAAA,QACzD;AAAA,MACJ;AAGA,YAAM,YAAY,KAAK,QAAQ,UAAU;AACzC,YAAMA,IAAG,MAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAG7C,UAAI,SAAgC;AACpC,UAAI;AACA,cAAMA,IAAG,OAAO,UAAU;AAC1B,iBAAS;AAAA,MACb,QAAQ;AAAA,MAER;AAGA,YAAM,cAAc,KAAK,oBAAoB,KAAK,IAAI;AAGtD,YAAMA,IAAG,UAAU,YAAY,aAAa,OAAO;AAEnD,aAAO;AAAA,QACH,QAAQ;AAAA,QACR,WAAW;AAAA,QACX;AAAA,QACA;AAAA,MACJ;AAAA,IACJ,SAAS,OAAO;AACZ,aAAO;AAAA,QACH,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MACpD;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc,QAA4B,MAAwC;AACtF,QAAI,cAA6B;AACjC,QAAI,YAAY,OAAO;AAEvB,YAAQ,KAAK,MAAM;AAAA,MACf,KAAK;AACD,sBAAc,OAAO;AAErB;AAAA,MACJ,KAAK;AAED,sBAAc,OAAO,iBAAiB,OAAO;AAE7C,oBAAY,OAAO,sBAAsB,OAAO;AAChD;AAAA,MACJ,KAAK;AACD,sBAAc,OAAO;AAErB,oBAAY,OAAO,sBAAsB,OAAO;AAChD;AAAA,IACR;AAEA,QAAI,CAAC,aAAa;AACd,aAAO;AAAA,IACX;AAEA,UAAM,WAAW,GAAG,KAAK,IAAI,GAAG,SAAS;AACzC,WAAO,KAAK,KAAK,KAAK,aAAa,OAAO,UAAU,aAAa,QAAQ;AAAA,EAC7E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,eAAe,aAA+D;AAClF,UAAM,UAAU,YAAY;AAC5B,QAAI,OAAO,YAAY,UAAU;AAC7B,aAAO;AAAA,IACX;AAGA,QAAI,YAAY,gBAAgB,MAAM;AAClC,aAAO;AAAA,IACX;AAGA,UAAM,QAAQ,KAAK,aAAa,WAAW;AAC3C,QAAI,SAAS,MAAM,SAAS,GAAG;AAC3B,aAAO,MAAM,CAAC;AAAA,IAClB;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,aAA4D;AAC7E,UAAM,QAAQ,YAAY;AAC1B,QAAI,OAAO,UAAU,SAAU,QAAO,CAAC,KAAK;AAC5C,QAAI,MAAM,QAAQ,KAAK,EAAG,QAAO;AACjC,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,SAAgC;AACpD,WAAO,YAAY,YAAY,YAAY;AAAA,EAC/C;AACJ;;;AE1bA,OAAO,WAAW;AAClB,SAAS,KAAK,YAAY;AAanB,IAAM,cAA0C,CAAC;AAAA,EACpD;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,QAAQ;AACZ,MAAM;AACF,QAAM,aAAa,QAAQ,IAAI,KAAK,MAAO,UAAU,QAAS,GAAG,IAAI;AACrE,QAAM,SAAS,KAAK,MAAO,aAAa,MAAO,KAAK;AACpD,QAAM,QAAQ,QAAQ;AAEtB,QAAM,MAAM,SAAI,OAAO,MAAM,IAAI,SAAI,OAAO,KAAK;AAEjD,SACI,oCAAC,WACG,oCAAC,QAAK,SAAe,GAAI,GACxB,kBACG,oCAAC,QAAK,UAAQ,QAAC,KAAE,SAAQ,KAAE,OAAM,MAAG,YAAW,IAAE,CAEzD;AAER;;;ACnCA,OAAOC,YAAW;AAClB,SAAS,QAAAC,aAAY;;;ACGd,IAAM,QAAQ;AAAA,EACjB,QAAQ;AAAA,IACJ,SAAS;AAAA;AAAA,IACT,SAAS;AAAA;AAAA,IACT,SAAS;AAAA;AAAA,IACT,OAAO;AAAA;AAAA,IACP,OAAO;AAAA;AAAA,IACP,QAAQ;AAAA;AAAA,IACR,MAAM;AAAA;AAAA,IACN,YAAY;AAAA;AAAA,EAChB;AAAA,EAEA,OAAO;AAAA,IACH,SAAS;AAAA,IACT,OAAO;AAAA,IACP,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,KAAK;AAAA,IACL,SAAS;AAAA,IACT,WAAW;AAAA,IACX,OAAO;AAAA,IACP,QAAQ;AAAA,EACZ;AAAA,EAEA,SAAS;AAAA,IACL,QAAQ;AAAA,MACJ,SAAS;AAAA,MACT,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,UAAU;AAAA,IACd;AAAA,IACA,QAAQ;AAAA,MACJ,SAAS;AAAA,MACT,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,UAAU;AAAA,IACd;AAAA,EACJ;AACJ;;;ADnCO,IAAM,aAAwC,CAAC,EAAE,QAAQ,KAAK,MAAM;AACvE,QAAM,UAAkC;AAAA,IACpC,SAAS,MAAM,MAAM;AAAA,IACrB,OAAO,MAAM,MAAM;AAAA,IACnB,SAAS,MAAM,MAAM;AAAA,IACrB,SAAS,MAAM,MAAM;AAAA,IACrB,SAAS,MAAM,MAAM;AAAA,EACzB;AAEA,QAAM,WAAmC;AAAA,IACrC,SAAS;AAAA,IACT,OAAO;AAAA,IACP,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,EACb;AAEA,QAAM,OAAO,QAAQ,MAAM;AAC3B,QAAM,QAAQ,SAAS,MAAM;AAE7B,SACI,gBAAAC,OAAA,cAACC,OAAA,EAAK,SACD,MAAK,KAAE,IACZ;AAER;;;AJHO,IAAM,kBAAkD,CAAC;AAAA,EAC5D;AAAA,EACA,QAAQ;AAAA,EACR;AACJ,MAAM;AACF,QAAM,EAAE,KAAK,IAAI,OAAO;AAGxB,QAAM,CAAC,WAAW,YAAY,IAAI,SAAoB,QAAQ;AAG9D,QAAM,CAAC,YAAY,aAAa,IAAI,SAAsB,CAAC,CAAC;AAC5D,QAAM,CAAC,MAAM,OAAO,IAAI,SAAgB,CAAC,CAAC;AAC1C,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAAsB,oBAAI,IAAI,CAAC;AAC3E,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,IAAI;AAC3C,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAwB,IAAI;AAGtD,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,EAAE;AACjD,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAsB,oBAAI,IAAI,CAAC;AACzE,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,CAAC;AAChD,QAAM,CAAC,WAAW,YAAY,IAAI,SAA+C,UAAU;AAC3F,QAAM,CAAC,sBAAsB,uBAAuB,IAAI,SAAS,CAAC;AAGlE,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAA4B,CAAC,CAAC;AAC5E,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,EAAE,OAAO,GAAG,WAAW,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,EAAE,CAAC;AAG5G,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAuB,CAAC,CAAC;AACnE,QAAM,CAAC,cAAc,eAAe,IAAI,SAA0B,oBAAI,IAAI,CAAC;AAC3E,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAAS,CAAC;AACtD,QAAM,CAAC,cAAc,eAAe,IAAI,SAAyB,CAAC,CAAC;AACnE,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,EAAE,OAAO,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,EAAE,CAAC;AAEpH,QAAM,UAAU,IAAI,kBAAkB;AAGtC,YAAU,MAAM;AACZ,UAAM,WAAW,YAAY;AACzB,UAAI;AACA,cAAM,CAAC,OAAO,SAAS,SAAS,IAAI,MAAM,QAAQ,IAAI;AAAA,UAClD,QAAQ,KAAK,MAAM;AAAA,UACnB,QAAQ,SAAS,MAAM;AAAA,UACvB,QAAQ,aAAa;AAAA,QACzB,CAAC;AACD,sBAAc,KAAK;AACnB,gBAAQ,OAAO;AACf,0BAAkB,IAAI,IAAI,OAAO,KAAK,SAAS,CAAC,CAAC;AAEjD,gCAAwB,CAAC;AACzB,mBAAW,KAAK;AAAA,MACpB,SAAS,KAAK;AACV,cAAM,UAAU,eAAe,QAAQ,IAAI,UAAU;AACrD,iBAAS,OAAO;AAChB,mBAAW,KAAK;AAEhB,aAAK,IAAI,gBAAgB,EAAE,SAAS,KAAK;AAAA,UACrC,SAAS;AAAA,UACT,SAAS,QAAQ,IAAI,EAAE,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE,IAAI;AAAA,UACtD,SAAS,EAAE,OAAO,WAAW;AAAA,QACjC,CAAC;AAAA,MACL;AAAA,IACJ;AACA,aAAS;AAGT,qBAAiB,iBAAiB,CAAC;AAAA,EACvC,GAAG,CAAC,CAAC;AAGL,QAAM,iBAAiB,QAAQ,MAAM;AACjC,UAAM,WAAW,WAAW;AAC5B,WAAO;AAAA,MACH,EAAE,KAAK,OAAO,OAAO,SAAS;AAAA,MAC9B,GAAG;AAAA,IACP;AAAA,EACJ,GAAG,CAAC,MAAM,UAAU,CAAC;AAGrB,QAAM,qBAAqB,QAAQ,MAAM;AACrC,QAAI,WAAW;AAGf,UAAMC,mBAAkB,eAAe,oBAAoB;AAC3D,QAAIA,oBAAmBA,iBAAgB,QAAQ,OAAO;AAClD,iBAAW,SAAS,OAAO,OAAK,EAAE,MAAM,SAASA,iBAAgB,GAAG,CAAC;AAAA,IACzE;AAGA,QAAI,YAAY,KAAK,GAAG;AACpB,YAAM,QAAQ,YAAY,YAAY;AACtC,iBAAW,SAAS;AAAA,QAAO,OACvB,EAAE,SAAS,YAAY,EAAE,SAAS,KAAK,KACvC,EAAE,MAAM,KAAK,OAAK,EAAE,YAAY,EAAE,SAAS,KAAK,CAAC;AAAA,MACrD;AAAA,IACJ;AAEA,WAAO;AAAA,EACX,GAAG,CAAC,YAAY,gBAAgB,sBAAsB,WAAW,CAAC;AAGlE,WAAS,CAACC,QAAO,QAAQ;AAErB,QAAI,cAAc,QAAQ;AACtB,UAAI,IAAI,UAAWA,WAAU,OAAO,IAAI,QAAS,IAAI,QAAQ;AACzD,eAAO;AAAA,MACX;AACA;AAAA,IACJ;AAGA,QAAI,cAAc,WAAW;AACzB,UAAI,IAAI,QAAQ;AAEZ,qBAAa,UAAU;AAAA,MAC3B,WAAWA,WAAU,OAAQA,WAAU,OAAO,IAAI,QAAS,IAAI,QAAQ;AAEnE,eAAO;AAAA,MACX;AACA;AAAA,IACJ;AAGA,QAAI,cAAc,YAAY;AAC1B,UAAI,IAAI,SAAS;AACb,0BAAkB,UAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,CAAC;AAAA,MACnD,WAAW,IAAI,WAAW;AACtB,0BAAkB,UAAQ,KAAK,IAAI,cAAc,SAAS,GAAG,OAAO,CAAC,CAAC;AAAA,MAC1E,WAAWA,WAAU,KAAK;AAEtB,cAAM,MAAM,cAAc,cAAc;AACxC,YAAI,KAAK;AACL,0BAAgB,UAAQ;AACpB,kBAAM,OAAO,IAAI,IAAI,IAAI;AACzB,gBAAI,KAAK,IAAI,GAAG,GAAG;AACf,mBAAK,OAAO,GAAG;AAAA,YACnB,OAAO;AACH,mBAAK,IAAI,GAAG;AAAA,YAChB;AACA,mBAAO;AAAA,UACX,CAAC;AAAA,QACL;AAAA,MACJ,WAAWA,WAAU,KAAK;AAEtB,wBAAgB,IAAI,IAAI,aAAa,CAAC;AAAA,MAC1C,WAAWA,WAAU,KAAK;AAEtB,wBAAgB,oBAAI,IAAI,CAAC;AAAA,MAC7B,WAAW,IAAI,QAAQ;AACnB,YAAI,aAAa,OAAO,GAAG;AACvB,wBAAc;AAAA,QAClB;AAAA,MACJ,WAAWA,WAAU,OAAQA,WAAU,OAAO,IAAI,QAAS,IAAI,QAAQ;AAEnE,eAAO;AAAA,MACX;AACA;AAAA,IACJ;AAGA,QAAI,cAAc,WAAW;AACzB;AAAA,IACJ;AAGA,QAAI,cAAc,cAAc;AAC5B;AAAA,IACJ;AAMA,QAAI,IAAI,KAAK;AACT,UAAI,cAAc,YAAY;AAC1B,qBAAa,QAAQ;AAAA,MACzB,WAAW,cAAc,UAAU;AAC/B,qBAAa,UAAU;AAAA,MAC3B,OAAO;AAEH,qBAAa,UAAU;AAAA,MAC3B;AACA;AAAA,IACJ;AAGA,QAAI,IAAI,cAAc,cAAc,cAAc,cAAc,WAAW;AACvE,UAAI,mBAAmB,SAAS,GAAG;AAC/B,qBAAa,YAAY;AACzB,uBAAe,CAAC;AAAA,MACpB;AACA;AAAA,IACJ;AAGA,QAAI,IAAI,UAAWA,WAAU,OAAO,IAAI,MAAO;AAC3C,aAAO;AACP;AAAA,IACJ;AAGA,QAAI,IAAI,UAAU,cAAc,UAAU;AACtC,UAAI,cAAc,OAAO,GAAG;AACxB,oBAAY;AAAA,MAChB;AACA;AAAA,IACJ;AAGA,QAAI,cAAc,UAAU;AACxB,UAAIA,WAAU,KAAK;AAEf,yBAAiB,UAAQ;AACrB,gBAAM,OAAO,IAAI,IAAI,IAAI;AACzB,6BAAmB,QAAQ,OAAK,KAAK,IAAI,EAAE,QAAQ,CAAC;AACpD,iBAAO;AAAA,QACX,CAAC;AACD;AAAA,MACJ,WAAWA,WAAU,KAAK;AAEtB,yBAAiB,oBAAI,IAAI,CAAC;AAC1B;AAAA,MACJ;AAAA,IACJ;AAGA,QAAI,cAAc,cAAc;AAC5B,UAAI,IAAI,SAAS;AACb,YAAI,gBAAgB,GAAG;AAEnB,uBAAa,UAAU;AACvB;AAAA,QACJ;AACA,uBAAe,UAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,CAAC;AAAA,MAChD,WAAW,IAAI,WAAW;AACtB,uBAAe,UAAQ,KAAK,IAAI,mBAAmB,SAAS,GAAG,OAAO,CAAC,CAAC;AAAA,MAC5E,WAAWA,WAAU,KAAK;AAEtB,cAAM,UAAU,mBAAmB,WAAW;AAC9C,YAAI,SAAS;AACT,2BAAiB,UAAQ;AACrB,kBAAM,OAAO,IAAI,IAAI,IAAI;AACzB,gBAAI,KAAK,IAAI,QAAQ,QAAQ,GAAG;AAC5B,mBAAK,OAAO,QAAQ,QAAQ;AAAA,YAChC,OAAO;AACH,mBAAK,IAAI,QAAQ,QAAQ;AAAA,YAC7B;AACA,mBAAO;AAAA,UACX,CAAC;AAAA,QACL;AAAA,MACJ;AAAA,IACJ;AAGA,QAAI,cAAc,YAAY;AAC1B,UAAI,IAAI,WAAW;AACf,gCAAwB,UAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,CAAC;AACrD,uBAAe,CAAC;AAAA,MACpB,WAAW,IAAI,YAAY;AACvB,gCAAwB,UAAQ,KAAK,IAAI,eAAe,SAAS,GAAG,OAAO,CAAC,CAAC;AAC7E,uBAAe,CAAC;AAAA,MACpB,WAAWA,WAAU,OAAO,IAAI,QAAQ;AAEpC,yBAAiB,UAAQ;AACrB,gBAAM,OAAO,IAAI,IAAI,IAAI;AACzB,6BAAmB,QAAQ,OAAK,KAAK,IAAI,EAAE,QAAQ,CAAC;AACpD,iBAAO;AAAA,QACX,CAAC;AAAA,MACL;AAAA,IACJ;AAAA,EACJ,CAAC;AAGD,QAAM,cAAc,YAAY;AAC5B,iBAAa,YAAY;AACzB,UAAM,YAAY,QAAQ,IAAI,IAAI;AAClC,UAAM,iBAAiB,MAAM,KAAK,aAAa;AAG/C,UAAM,gBAAgB,MAAM,QAAQ,wBAAwB,QAAQ,cAAc;AAClF,UAAM,YAAY,MAAM,QAAQ,aAAa;AAG7C,UAAM,kBAAqC,cAAc,IAAI,SAAO;AAAA,MAChE,UAAU;AAAA,MACV,QAAQ;AAAA,IACZ,EAAE;AACF,uBAAmB,eAAe;AAClC,oBAAgB,EAAE,OAAO,cAAc,QAAQ,WAAW,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,EAAE,CAAC;AAE9F,QAAI,QAAQ,GAAG,UAAU,GAAG,SAAS;AACrC,UAAM,WAAuD,CAAC;AAE9D,aAAS,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK;AAC3C,YAAM,KAAK,cAAc,CAAC;AAC1B,yBAAmB,UAAQ,KAAK;AAAA,QAAI,OAChC,EAAE,aAAa,KAAK,EAAE,GAAG,GAAG,QAAQ,cAAuB,IAAI;AAAA,MACnE,CAAC;AAED,UAAI;AACA,cAAM,OAAO,UAAU,EAAE;AACzB,YAAI,QAAQ,CAAC,SAAS,KAAK,UAAU;AACjC,gBAAM,UAAU;AAChB,6BAAmB,UAAQ,KAAK;AAAA,YAAI,OAChC,EAAE,aAAa,KAAK,EAAE,GAAG,GAAG,QAAQ,SAAkB,OAAO,QAAQ,IAAI;AAAA,UAC7E,CAAC;AACD,mBAAS,KAAK,EAAE,UAAU,IAAI,OAAO,QAAQ,CAAC;AAC9C;AAAA,QACJ,OAAO;AACH,gBAAM,QAAQ,QAAQ,QAAQ,IAAI,SAAS;AAC3C,6BAAmB,UAAQ,KAAK;AAAA,YAAI,OAChC,EAAE,aAAa,KAAK,EAAE,GAAG,GAAG,QAAQ,UAAmB,IAAI;AAAA,UAC/D,CAAC;AACD,cAAI,KAAM;AAAA,cACL;AAAA,QACT;AAAA,MACJ,SAAS,KAAK;AACV,cAAM,UAAU,eAAe,QAAQ,IAAI,UAAU;AACrD,2BAAmB,UAAQ,KAAK;AAAA,UAAI,OAChC,EAAE,aAAa,KAAK,EAAE,GAAG,GAAG,QAAQ,SAAkB,OAAO,QAAQ,IAAI;AAAA,QAC7E,CAAC;AACD,iBAAS,KAAK,EAAE,UAAU,IAAI,OAAO,QAAQ,CAAC;AAC9C;AAAA,MACJ;AAEA,sBAAgB,EAAE,OAAO,cAAc,QAAQ,WAAW,IAAI,GAAG,OAAO,SAAS,OAAO,CAAC;AAAA,IAC7F;AAEA,QAAI,SAAS,GAAG;AACZ,WAAK,IAAI,gBAAgB,EAAE,SAAS,IAAI,MAAM,cAAc,GAAG;AAAA,QAC3D,SAAS;AAAA,QACT,SAAS,QAAQ,IAAI,EAAE,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE,IAAI,KAAK;AAAA,QAC3D,SAAS,EAAE,OAAO,WAAW,SAAS;AAAA,MAC1C,CAAC;AAAA,IACL;AAEA,iBAAa,SAAS;AAAA,EAC1B;AAGA,QAAM,gBAAgB,YAAY;AAC9B,iBAAa,SAAS;AAEtB,UAAM,iBAAiB,IAAI,kBAAkB;AAC7C,UAAM,UAAU,MAAM,eAAe,gBAAgB;AAErD,QAAI,QAAQ,eAAe,GAAG;AAE1B,mBAAa,EAAE,OAAO,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,EAAE,CAAC;AACtF,mBAAa,MAAM;AACnB;AAAA,IACJ;AAEA,UAAM,kBAAkB,MAAM,KAAK,YAAY;AAC/C,UAAM,eAAqC,CAAC,SAAS,WAAW;AAGhE,UAAM,aAAa,aAAa,OAAO,CAAC,KAAK,SAAS;AAClD,aAAO,OAAO,SAAS,UAAU,QAAQ,MAAM,SAC3C,SAAS,cAAc,QAAQ,UAAU,SACrC,QAAQ,SAAS;AAAA,IAC7B,GAAG,CAAC;AACJ,UAAM,aAAa,aAAa,gBAAgB;AAGhD,iBAAa,EAAE,OAAO,YAAY,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,EAAE,CAAC;AAE/F,QAAI,UAAU,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS;AACpD,QAAI,YAAY;AAEhB,UAAM,UAAU,MAAM,eAAe;AAAA,MACjC;AAAA,MACA;AAAA,MACA;AAAA,MACA,CAAC,WAAW;AACR;AACA,YAAI,OAAO,WAAW,UAAW;AAAA,iBACxB,OAAO,WAAW,UAAW;AAAA,iBAC7B,OAAO,WAAW,UAAW;AAAA,iBAC7B,OAAO,WAAW,QAAS;AAEpC,wBAAgB,UAAQ,CAAC,GAAG,KAAK,MAAM,EAAE,GAAG;AAAA,UACxC,YAAY,OAAO,cAAc,OAAO,OAAO;AAAA,UAC/C,QAAQ,OAAO,WAAW,UAAU,UAAU;AAAA,UAC9C,OAAO,OAAO;AAAA,QAClB,CAAC,CAAC;AACF,qBAAa,EAAE,OAAO,YAAY,WAAW,SAAS,SAAS,SAAS,OAAO,CAAC;AAAA,MACpF;AAAA,IACJ;AAEA,iBAAa,MAAM;AAAA,EACvB;AAGA,MAAI,SAAS;AACT,WACI,gBAAAC,OAAA,cAACC,MAAA,EAAI,SAAS,KACV,gBAAAD,OAAA,cAACE,OAAA,EAAK,OAAM,UAAO,gBAAAF,OAAA,cAAC,WAAQ,MAAK,QAAO,GAAE,mCAAuB,CACrE;AAAA,EAER;AAGA,MAAI,OAAO;AACP,WACI,gBAAAA,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,SAAS,KACjC,gBAAAD,OAAA,cAACE,OAAA,EAAK,OAAM,SAAM,kBAAU,KAAM,GAClC,gBAAAF,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,iBAAe,CAClC;AAAA,EAER;AAGA,MAAI,cAAc,cAAc;AAC5B,WACI,gBAAAF,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,SAAS,KACjC,gBAAAD,OAAA,cAACC,MAAA,EAAI,cAAc,KACf,gBAAAD,OAAA,cAACE,OAAA,EAAK,MAAI,MAAC,OAAM,UAAO,iCAAwB,CACpD,GAEA,gBAAAF,OAAA,cAACC,MAAA,EAAI,cAAc,KACf,gBAAAD,OAAA,cAAC,eAAY,SAAS,aAAa,WAAW,OAAO,aAAa,OAAO,OAAO,IAAI,CACxF,GAEA,gBAAAA,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,aAAY,SAAQ,aAAY,QAAO,SAAS,GAAG,QAAQ,MAClF,gBAAgB,MAAM,EAAE,EAAE,IAAI,CAAC,SAC5B,gBAAAD,OAAA,cAACC,MAAA,EAAI,KAAK,KAAK,YACX,gBAAAD,OAAA,cAAC,cAAW,QACR,KAAK,WAAW,YAAY,YACxB,KAAK,WAAW,UAAU,UACtB,KAAK,WAAW,gBAAgB,YAAY,WACtD,GACF,gBAAAA,OAAA,cAACE,OAAA,MAAK,KAAE,KAAK,QAAS,GACrB,KAAK,SAAS,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,OAAM,UAAQ,QAAC,MAAG,KAAK,OAAM,GAAC,CAC7D,CACH,CACL,GAEA,gBAAAF,OAAA,cAACC,MAAA,EAAI,WAAW,KACZ,gBAAAD,OAAA,cAACE,OAAA,MAAK,cACC,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,WAAS,aAAa,OAAM,QAAM,GAChD,UAAM,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,UAAQ,aAAa,SAAQ,UAAQ,GACvD,UAAM,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,SAAO,aAAa,QAAO,SAAO,CACzD,CACJ,CACJ;AAAA,EAER;AAGA,MAAI,cAAc,WAAW;AACzB,WACI,gBAAAF,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,SAAS,KACjC,gBAAAD,OAAA,cAACC,MAAA,EAAI,cAAc,KACf,gBAAAD,OAAA,cAACE,OAAA,EAAK,MAAI,MAAC,OAAM,WAAQ,+BAAwB,CACrD,GAEA,gBAAAF,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,aAAY,SAAQ,aAAY,QAAO,SAAS,KACxE,gBAAAD,OAAA,cAACE,OAAA,MAAM,aAAa,OAAM,wBAAsB,GAChD,gBAAAF,OAAA,cAACE,OAAA,MAAK,mBAAK,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,WAAS,aAAa,KAAM,GAAO,cAAY,GACtE,gBAAAF,OAAA,cAACE,OAAA,MAAK,mBAAK,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,UAAQ,aAAa,OAAQ,GAAO,UAAQ,GAClE,aAAa,SAAS,KAAK,gBAAAF,OAAA,cAACE,OAAA,MAAK,mBAAK,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,SAAO,aAAa,MAAO,GAAO,SAAO,CAChG,GAEA,gBAAAF,OAAA,cAACC,MAAA,EAAI,WAAW,KACZ,gBAAAD,OAAA,cAACE,OAAA,MAAK,wBAAa,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,UAAQ,QAAQ,IAAI,GAAE,QAAM,CAAO,CACtE,GAEA,gBAAAF,OAAA,cAACC,MAAA,EAAI,WAAW,GAAG,eAAc,YAC7B,gBAAAD,OAAA,cAACE,OAAA,EAAK,MAAI,MAAC,OAAM,YAAS,sCAA6B,GACvD,gBAAAF,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,gEAA8D,CACjF,GAEA,gBAAAF,OAAA,cAACC,MAAA,EAAI,WAAW,GAAG,aAAY,UAAS,aAAY,QAAO,UAAU,KACjE,gBAAAD,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,6DAEf,CACJ,CACJ;AAAA,EAER;AAGA,MAAI,cAAc,YAAY;AAC1B,WACI,gBAAAF,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,SAAS,KACjC,gBAAAD,OAAA,cAACC,MAAA,EAAI,cAAc,KACf,gBAAAD,OAAA,cAACE,OAAA,EAAK,MAAI,MAAC,OAAM,UAAO,iCAAwB,CACpD,GAEA,gBAAAF,OAAA,cAACC,MAAA,EAAI,cAAc,KACf,gBAAAD,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,oEAAkE,CACrF,GAEA,gBAAAF,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,aAAY,SAAQ,aAAY,QAAO,SAAS,KACvE,cAAc,IAAI,CAAC,KAAK,MAAM;AAC3B,YAAM,YAAY,sBAAsB,GAAG;AAC3C,YAAM,WAAW,MAAM;AACvB,YAAM,YAAY,aAAa,IAAI,GAAG;AAEtC,aACI,gBAAAD,OAAA,cAACC,MAAA,EAAI,KAAK,OACN,gBAAAD,OAAA,cAACE,OAAA,EAAK,OAAO,WAAW,SAAS,WAC5B,WAAW,YAAO,MAClB,YAAY,aAAQ,OAAM,KAAE,UAAU,MAAK,KAAE,UAAU,IAC5D,CACJ;AAAA,IAER,CAAC,CACL,GAEC,aAAa,OAAO,KACjB,gBAAAF,OAAA,cAACC,MAAA,EAAI,WAAW,KACZ,gBAAAD,OAAA,cAACE,OAAA,MAAK,cAAU,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,WAAS,aAAa,IAAK,GAAO,SAAO,CACzE,GAGJ,gBAAAF,OAAA,cAACC,MAAA,EAAI,WAAW,GAAG,aAAY,UAAS,aAAY,QAAO,UAAU,KACjE,gBAAAD,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,wHAEf,CACJ,CACJ;AAAA,EAER;AAGA,MAAI,cAAc,WAAW;AACzB,WACI,gBAAAF,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,SAAS,KACjC,gBAAAD,OAAA,cAACC,MAAA,EAAI,cAAc,KACf,gBAAAD,OAAA,cAACE,OAAA,EAAK,MAAI,MAAC,OAAM,UAAO,6BAAoB,CAChD,GAEA,gBAAAF,OAAA,cAACC,MAAA,EAAI,cAAc,KACf,gBAAAD,OAAA,cAAC,eAAY,SAAS,UAAU,WAAW,OAAO,UAAU,OAAO,OAAO,IAAI,CAClF,GAEA,gBAAAA,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,aAAY,SAAQ,aAAY,QAAO,SAAS,GAAG,QAAQ,MAClF,aAAa,MAAM,EAAE,EAAE,IAAI,CAAC,MAAM,QAC/B,gBAAAD,OAAA,cAACC,MAAA,EAAI,KAAK,GAAG,KAAK,UAAU,IAAI,GAAG,MAC/B,gBAAAD,OAAA,cAAC,cAAW,QACR,KAAK,WAAW,YAAY,YACxB,KAAK,WAAW,UAAU,UACtB,KAAK,WAAW,YAAY,YAAY,WAClD,GACF,gBAAAA,OAAA,cAACE,OAAA,MAAK,KAAE,KAAK,UAAW,GACvB,KAAK,SAAS,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,OAAM,UAAQ,QAAC,MAAG,KAAK,OAAM,GAAC,CAC7D,CACH,CACL,GAEA,gBAAAF,OAAA,cAACC,MAAA,EAAI,WAAW,KACZ,gBAAAD,OAAA,cAACE,OAAA,MAAK,cACC,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,WAAS,UAAU,SAAQ,UAAQ,GACjD,UAAM,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,UAAQ,UAAU,SAAQ,UAAQ,GACpD,UAAU,UAAU,KAAK,gBAAAF,OAAA,cAAAA,OAAA,gBAAG,UAAM,gBAAAA,OAAA,cAACE,OAAA,EAAK,OAAM,YAAU,UAAU,SAAQ,UAAQ,CAAO,GACzF,UAAU,SAAS,KAAK,gBAAAF,OAAA,cAAAA,OAAA,gBAAG,UAAM,gBAAAA,OAAA,cAACE,OAAA,EAAK,OAAM,SAAO,UAAU,QAAO,SAAO,CAAO,CACxF,CACJ,CACJ;AAAA,EAER;AAGA,MAAI,cAAc,QAAQ;AACtB,WACI,gBAAAF,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,SAAS,KACjC,gBAAAD,OAAA,cAACC,MAAA,EAAI,cAAc,KACf,gBAAAD,OAAA,cAACE,OAAA,EAAK,MAAI,MAAC,OAAM,WAAQ,qBAAY,CACzC,GAEA,gBAAAF,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,aAAY,SAAQ,aAAY,QAAO,SAAS,KACxE,gBAAAD,OAAA,cAACE,OAAA,EAAK,MAAI,QAAC,+BAAsB,GACjC,gBAAAF,OAAA,cAACE,OAAA,MAAK,mBAAK,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,WAAS,aAAa,KAAM,GAAO,YAAQ,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,UAAQ,aAAa,OAAQ,GAAO,UAAQ,GAEzH,UAAU,QAAQ,KACf,gBAAAF,OAAA,cAAAA,OAAA,gBACI,gBAAAA,OAAA,cAACE,OAAA,MAAK,GAAC,GACP,gBAAAF,OAAA,cAACE,OAAA,EAAK,MAAI,QAAC,qBAAY,GACvB,gBAAAF,OAAA,cAACE,OAAA,MAAK,mBAAK,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,WAAS,UAAU,OAAQ,GAAO,cAAU,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,UAAQ,UAAU,OAAQ,GAAO,UAAQ,GACxH,gBAAAF,OAAA,cAACE,OAAA,MAAK,8BAAiB,MAAM,KAAK,YAAY,EAAE,IAAI,SAAO,sBAAsB,GAAG,EAAE,IAAI,EAAE,KAAK,IAAI,CAAE,CAC3G,CAER,GAEA,gBAAAF,OAAA,cAACC,MAAA,EAAI,WAAW,KACZ,gBAAAD,OAAA,cAACE,OAAA,MAAK,yBAAc,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,UAAQ,QAAQ,IAAI,GAAE,QAAM,CAAO,CACvE,GAEA,gBAAAF,OAAA,cAACC,MAAA,EAAI,WAAW,KACZ,gBAAAD,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,0BAAwB,CAC3C,CACJ;AAAA,EAER;AAGA,QAAM,oBAAoB,mBAAmB,MAAM,GAAG,EAAE;AACxD,QAAM,UAAU,mBAAmB,SAAS;AAC5C,QAAM,kBAAkB,eAAe,oBAAoB;AAE3D,SACI,gBAAAF,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,SAAS,KAEjC,gBAAAD,OAAA,cAACC,MAAA,EAAI,cAAc,KACf,gBAAAD,OAAA,cAACE,OAAA,EAAK,MAAI,MAAC,OAAM,UAAO,sBAAa,GACpC,cAAc,OAAO,KAClB,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,WAAQ,MAAG,cAAc,MAAK,YAAU,CAE5D,GAGA,gBAAAF,OAAA,cAACC,MAAA,EAAI,cAAc,GAAG,eAAc,YAEhC,gBAAAD,OAAA,cAACC,MAAA,EAAI,UAAS,UACV,gBAAAD,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,YAAG,GACjB,eAAe,IAAI,CAAC,KAAK,MAAM;AAC5B,UAAM,WAAW,MAAM;AACvB,UAAM,YAAY,cAAc,cAAc;AAC9C,WACI,gBAAAF,OAAA,cAACC,MAAA,EAAI,KAAK,IAAI,KAAK,aAAa,GAAG,YAAY,KAC3C,gBAAAD,OAAA;AAAA,MAACE;AAAA,MAAA;AAAA,QACG,iBAAiB,YAAY,SAAS,WAAW,SAAS;AAAA,QAC1D,OAAO,YAAY,UAAU,WAAW,UAAU;AAAA;AAAA,MACrD;AAAA,MACK,IAAI;AAAA,MAAI;AAAA,MAAE,IAAI;AAAA,MAAM;AAAA,IAC1B,CACJ;AAAA,EAER,CAAC,CACL,GAGA,gBAAAF,OAAA,cAACC,MAAA,EAAI,WAAW,KACZ,gBAAAD,OAAA,cAACE,OAAA,EAAK,OAAO,cAAc,WAAW,SAAS,UAAQ,YAAG,GACzD,cAAc,WACX,gBAAAF,OAAA;AAAA,IAAC;AAAA;AAAA,MACG,OAAO;AAAA,MACP,UAAU;AAAA,MACV,aAAY;AAAA;AAAA,EAChB,IAEA,gBAAAA,OAAA,cAACE,OAAA,MAAM,eAAe,gBAAAF,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,eAAa,CAAQ,CAElE,CACJ,GAGA,gBAAAF,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,aAAY,SAAQ,aAAa,cAAc,eAAe,SAAS,QAAQ,SAAS,KAChH,gBAAAD,OAAA,cAACC,MAAA,EAAI,cAAc,KACf,gBAAAD,OAAA,cAACE,OAAA,EAAK,MAAI,QAAC,aAAW,GACrB,mBAAmB,gBAAgB,QAAQ,SACxC,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,UAAO,KAAE,gBAAgB,KAAI,IAAE,GAE9C,eACG,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,YAAS,KAAE,aAAY,IAAE,GAEzC,gBAAAF,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,KAAE,mBAAmB,QAAO,UAAO,UAAU,sBAAiB,IAAG,GAAC,CACrF,GAEC,kBAAkB,IAAI,CAAC,MAAM,MAAM;AAChC,UAAM,WAAW,MAAM,eAAe,cAAc;AACpD,UAAM,YAAY,cAAc,IAAI,KAAK,QAAQ;AACjD,UAAM,cAAc,eAAe,IAAI,KAAK,QAAQ;AAEpD,WACI,gBAAAF,OAAA,cAACC,MAAA,EAAI,KAAK,KAAK,YACX,gBAAAD,OAAA,cAACE,OAAA,EAAK,OAAO,WAAW,SAAS,WAC5B,WAAW,YAAO,MAClB,YAAY,aAAQ,OAAM,KAAE,KAAK,QACtC,GACA,gBAAAF,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,KAAE,cAAc,WAAM,QAAI,CAC7C;AAAA,EAER,CAAC,GAEA,mBAAmB,WAAW,KAC3B,gBAAAF,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,iCAA+B,CAEtD,GAGC,cAAc,OAAO,KAClB,gBAAAF,OAAA,cAACC,MAAA,EAAI,WAAW,GAAG,eAAc,YAC7B,gBAAAD,OAAA,cAACE,OAAA,EAAK,MAAI,QAAC,cAAW,cAAc,MAAK,aAAW,GACpD,gBAAAF,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,YAAY,KACnC,MAAM,KAAK,aAAa,EAAE,MAAM,GAAG,CAAC,EAAE,IAAI,QACvC,gBAAAD,OAAA,cAACE,OAAA,EAAK,KAAK,IAAI,UAAQ,QAAC,cAAI,EAAG,CAClC,GACA,cAAc,OAAO,KAClB,gBAAAF,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,YAAS,cAAc,OAAO,GAAE,OAAK,CAE5D,CACJ,GAIJ,gBAAAF,OAAA,cAACC,MAAA,EAAI,WAAW,GAAG,aAAY,UAAS,aAAY,QAAO,UAAU,KACjE,gBAAAD,OAAA,cAACE,OAAA,EAAK,UAAQ,QACT,cAAc,cAAc,sEAC5B,cAAc,YAAY,qCAC1B,cAAc,gBAAgB,gDAC9B,mEACL,CACJ,CACJ;AAER;;;AD7tBO,SAAS,qBAA8B;AAC1C,QAAM,MAAM,IAAIC,SAAQ,OAAO,EAC1B,YAAY,mDAAmD,EAC/D,SAAS,cAAc,4DAA4D,EACnF,OAAO,WAAW,0CAA0C,EAC5D,OAAO,oBAAoB,oCAAoC,EAC/D,OAAO,OAAO,OAAiB,YAAwD;AACpF,UAAM,gBAAgB,IAAI,cAAc;AACxC,UAAM,SAAS,MAAM,cAAc,KAAK;AACxC,QAAI,CAAC,QAAQ;AACT,YAAM,IAAI,gBAAgB,yCAAyC;AAAA,IACvE;AAGA,QAAI,QAAQ,gBAAgB,SAAS,MAAM,SAAS,GAAG;AACnD,YAAM,oBAAoB,QAAQ,OAAO,OAAO;AAChD;AAAA,IACJ;AAGA,UAAM,EAAE,cAAc,IAAI;AAAA,MACtBC,OAAM,cAAc,iBAAiB;AAAA,QACjC;AAAA,QACA,OAAO,QAAQ;AAAA,QACf,QAAQ,MAAM;AACV,kBAAQ,KAAK,CAAC;AAAA,QAClB;AAAA,MACJ,CAAC;AAAA,IACL;AAEA,UAAM,cAAc;AAAA,EACxB,CAAC;AAEL,SAAO;AACX;AAKA,eAAe,oBACX,QACA,OACA,SACF;AACE,QAAM,oBAAoB,IAAI,kBAAkB;AAEhD,MAAI,MAAM,WAAW,GAAG;AACpB,YAAQ,IAAI,qFAAgF;AAC5F,YAAQ,IAAI,mEAA4D;AACxE;AAAA,EACJ;AAGA,QAAM,OAAO,MAAM,kBAAkB,SAAS,MAAM;AACpD,QAAM,eAAe,KAAK,IAAI,OAAK,EAAE,GAAG;AAExC,MAAI;AAEJ,MAAI,MAAM,WAAW,KAAK,aAAa,SAAS,MAAM,CAAC,CAAE,GAAG;AAExD,YAAQ,IAAI,+BAAwB,MAAM,CAAC,CAAC,MAAM;AAClD,UAAM,aAAa,MAAM,kBAAkB,KAAK,QAAQ,EAAE,KAAK,MAAM,CAAC,EAAE,CAAC;AACzE,gBAAY,WAAW,IAAI,OAAK,EAAE,QAAQ;AAAA,EAC9C,OAAO;AAEH,gBAAY;AAAA,EAChB;AAGA,UAAQ,IAAI,qCAA8B;AAC1C,QAAM,gBAAgB,MAAM,kBAAkB,wBAAwB,QAAQ,SAAS;AAEvF,UAAQ,IAAI,wBAAiB,cAAc,MAAM,gBAAgB;AACjE,aAAW,MAAM,eAAe;AAC5B,UAAM,QAAQ,CAAC,UAAU,SAAS,EAAE;AACpC,UAAM,SAAS,QAAQ,kBAAkB;AACzC,YAAQ,IAAI,QAAQ,EAAE,GAAG,MAAM,EAAE;AAAA,EACrC;AAGA,QAAM,YAAY,QAAQ,IAAI,IAAI;AAClC,QAAM,YAAY,MAAM,kBAAkB,aAAa;AACvD,MAAI,QAAQ;AACZ,MAAI,UAAU;AACd,MAAI,UAAU;AACd,QAAM,WAAuD,CAAC;AAE9D,aAAW,MAAM,eAAe;AAC5B,QAAI;AACA,YAAM,OAAO,UAAU,EAAE;AAEzB,UAAI,QAAQ,CAAC,QAAQ,SAAS,KAAK,UAAU;AACzC,gBAAQ,IAAI,iBAAO,EAAE,+CAA+C;AACpE;AACA;AAAA,MACJ;AAEA,cAAQ,IAAI,yBAAkB,EAAE,KAAK;AACrC,YAAM,kBAAkB,QAAQ,QAAQ,IAAI,SAAS;AAErD,UAAI,KAAM;AAAA,UACL;AAEL,cAAQ,IAAI,UAAK,EAAE,EAAE;AAAA,IACzB,SAAS,OAAO;AACZ,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,cAAQ,IAAI,UAAK,EAAE,KAAK,OAAO,EAAE;AACjC,eAAS,KAAK,EAAE,UAAU,IAAI,OAAO,QAAQ,CAAC;AAAA,IAClD;AAAA,EACJ;AAEA,MAAI,SAAS,SAAS,GAAG;AACrB,SAAK,IAAI,gBAAgB,EAAE,SAAS,IAAI,MAAM,cAAc,GAAG;AAAA,MAC3D,SAAS;AAAA,MACT,SAAS,QAAQ,IAAI,EAAE,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE,IAAI;AAAA,MACtD,SAAS,EAAE,SAAS;AAAA,IACxB,CAAC;AAAA,EACL;AAEA,UAAQ,IAAI;AAAA,mBAAiB,KAAK,WAAW,OAAO,aAAa,OAAO,UAAU;AAClF,UAAQ,IAAI,uBAAgB,SAAS,EAAE;AACvC,UAAQ,IAAI;AAAA,wEAAoE;AACpF;;;AOtIA,OAAOC,YAAW;AAClB,SAAS,UAAAC,eAAc;AACvB,SAAS,WAAAC,gBAAe;;;ACFxB,OAAOC,UAAS,YAAAC,WAAU,aAAAC,YAAW,WAAAC,gBAAe;AACpD,SAAS,OAAAC,MAAK,QAAAC,OAAM,YAAAC,WAAU,UAAAC,eAAc;AAC5C,OAAOC,cAAa;AACpB,OAAOC,gBAAe;AAmCf,IAAM,kBAAkD,CAAC;AAAA,EAC5D;AAAA,EACA,QAAQ;AAAA,EACR;AACJ,MAAM;AACF,QAAM,EAAE,KAAK,IAAIC,QAAO;AAGxB,QAAM,CAAC,WAAW,YAAY,IAAIC,UAAoB,QAAQ;AAG9D,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAsB,CAAC,CAAC;AAC5D,QAAM,CAAC,MAAM,OAAO,IAAIA,UAAgB,CAAC,CAAC;AAC1C,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,UAAsB,oBAAI,IAAI,CAAC;AAC3E,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,IAAI;AAC3C,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAwB,IAAI;AAGtD,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAe,UAAU;AAC7D,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAS,EAAE;AACjD,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,UAAS,KAAK;AAC5D,QAAM,CAAC,eAAe,gBAAgB,IAAIA,UAAsB,oBAAI,IAAI,CAAC;AACzE,QAAM,CAAC,oBAAoB,qBAAqB,IAAIA,UAAS,CAAC;AAC9D,QAAM,CAAC,sBAAsB,uBAAuB,IAAIA,UAAS,CAAC;AAGlE,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,UAA4B,CAAC,CAAC;AAC5E,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAS,EAAE,OAAO,GAAG,WAAW,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,EAAE,CAAC;AAG5G,QAAM,CAAC,eAAe,gBAAgB,IAAIA,UAAuB,CAAC,CAAC;AACnE,QAAM,CAAC,cAAc,eAAe,IAAIA,UAA0B,oBAAI,IAAI,CAAC;AAC3E,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,UAAS,CAAC;AACtD,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAyB,CAAC,CAAC;AACnE,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAS,EAAE,OAAO,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,EAAE,CAAC;AAEpH,QAAM,UAAU,IAAI,kBAAkB;AAGtC,QAAM,iBAAiBC,SAAQ,MAAM;AACjC,WAAO;AAAA,MACH,EAAE,KAAK,OAAO,OAAO,WAAW,OAAO;AAAA,MACvC,GAAG;AAAA,IACP;AAAA,EACJ,GAAG,CAAC,MAAM,UAAU,CAAC;AAGrB,EAAAC,WAAU,MAAM;AACZ,UAAM,WAAW,YAAY;AACzB,UAAI;AACA,cAAM,CAAC,OAAO,SAAS,SAAS,IAAI,MAAM,QAAQ,IAAI;AAAA,UAClD,QAAQ,KAAK,MAAM;AAAA,UACnB,QAAQ,SAAS,MAAM;AAAA,UACvB,QAAQ,aAAa;AAAA,QACzB,CAAC;AACD,sBAAc,KAAK;AACnB,gBAAQ,OAAO;AACf,0BAAkB,IAAI,IAAI,OAAO,KAAK,SAAS,CAAC,CAAC;AACjD,mBAAW,KAAK;AAAA,MACpB,SAAS,KAAK;AACV,iBAAS,eAAe,QAAQ,IAAI,UAAU,gBAAgB;AAC9D,mBAAW,KAAK;AAAA,MACpB;AAAA,IACJ;AACA,aAAS;AACT,qBAAiB,iBAAiB,CAAC;AAAA,EACvC,GAAG,CAAC,CAAC;AAGL,QAAM,qBAAqBD,SAAQ,MAAM;AACrC,QAAI,WAAW;AAGf,UAAME,mBAAkB,eAAe,kBAAkB;AACzD,QAAIA,oBAAmBA,iBAAgB,QAAQ,OAAO;AAClD,iBAAW,SAAS,OAAO,OAAK,EAAE,MAAM,SAASA,iBAAgB,GAAG,CAAC;AAAA,IACzE;AAGA,QAAI,YAAY,KAAK,GAAG;AACpB,YAAM,QAAQ,YAAY,YAAY;AACtC,iBAAW,SAAS;AAAA,QAAO,OACvB,EAAE,SAAS,YAAY,EAAE,SAAS,KAAK,KACvC,EAAE,MAAM,KAAK,OAAK,EAAE,YAAY,EAAE,SAAS,KAAK,CAAC;AAAA,MACrD;AAAA,IACJ;AAEA,WAAO;AAAA,EACX,GAAG,CAAC,YAAY,gBAAgB,oBAAoB,WAAW,CAAC;AAGhE,EAAAD,WAAU,MAAM;AACZ,4BAAwB,CAAC;AAAA,EAC7B,GAAG,CAAC,oBAAoB,WAAW,CAAC;AAGpC,EAAAE,UAAS,CAACC,QAAO,QAAQ;AAErB,QAAI,cAAc,QAAQ;AACtB,UAAI,IAAI,UAAWA,WAAU,OAAO,IAAI,QAAS,IAAI,QAAQ;AACzD,eAAO;AAAA,MACX;AACA;AAAA,IACJ;AAGA,QAAI,cAAc,WAAW;AACzB,UAAI,IAAI,QAAQ;AACZ,qBAAa,UAAU;AAAA,MAC3B,WAAWA,WAAU,OAAQA,WAAU,OAAO,IAAI,QAAS,IAAI,QAAQ;AACnE,eAAO;AAAA,MACX;AACA;AAAA,IACJ;AAGA,QAAI,cAAc,YAAY;AAC1B,UAAI,IAAI,SAAS;AACb,0BAAkB,UAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,CAAC;AAAA,MACnD,WAAW,IAAI,WAAW;AACtB,0BAAkB,UAAQ,KAAK,IAAI,cAAc,SAAS,GAAG,OAAO,CAAC,CAAC;AAAA,MAC1E,WAAWA,WAAU,KAAK;AACtB,cAAM,MAAM,cAAc,cAAc;AACxC,YAAI,KAAK;AACL,0BAAgB,UAAQ;AACpB,kBAAM,OAAO,IAAI,IAAI,IAAI;AACzB,gBAAI,KAAK,IAAI,GAAG,EAAG,MAAK,OAAO,GAAG;AAAA,gBAC7B,MAAK,IAAI,GAAG;AACjB,mBAAO;AAAA,UACX,CAAC;AAAA,QACL;AAAA,MACJ,WAAWA,WAAU,KAAK;AACtB,wBAAgB,IAAI,IAAI,aAAa,CAAC;AAAA,MAC1C,WAAWA,WAAU,KAAK;AACtB,wBAAgB,oBAAI,IAAI,CAAC;AAAA,MAC7B,WAAW,IAAI,UAAU,aAAa,OAAO,GAAG;AAC5C,sBAAc;AAAA,MAClB,WAAWA,WAAU,OAAQA,WAAU,OAAO,IAAI,QAAS,IAAI,QAAQ;AACnE,eAAO;AAAA,MACX;AACA;AAAA,IACJ;AAEA,QAAI,cAAc,aAAa,cAAc,cAAc;AACvD;AAAA,IACJ;AAOA,QAAI,IAAI,UAAWA,WAAU,OAAO,IAAI,MAAO;AAC3C,aAAO;AACP;AAAA,IACJ;AAGA,QAAIA,WAAU,KAAK;AACf,yBAAmB,IAAI;AACvB,oBAAc,YAAY;AAC1B;AAAA,IACJ;AAGA,QAAI,IAAI,aAAa,eAAe,cAAc;AAC9C,oBAAc,UAAU;AACxB;AAAA,IACJ;AACA,QAAI,IAAI,cAAc,eAAe,YAAY;AAC7C,oBAAc,YAAY;AAC1B;AAAA,IACJ;AAGA,QAAI,IAAI,KAAK;AACT,oBAAc,eAAe,aAAa,eAAe,UAAU;AACnE;AAAA,IACJ;AAGA,QAAI,IAAI,UAAU,cAAc,OAAO,GAAG;AACtC,kBAAY;AACZ;AAAA,IACJ;AAGA,QAAIA,WAAU,KAAK;AACf,uBAAiB,UAAQ;AACrB,cAAM,OAAO,IAAI,IAAI,IAAI;AACzB,2BAAmB,QAAQ,OAAK,KAAK,IAAI,EAAE,QAAQ,CAAC;AACpD,eAAO;AAAA,MACX,CAAC;AACD;AAAA,IACJ;AACA,QAAIA,WAAU,KAAK;AACf,uBAAiB,oBAAI,IAAI,CAAC;AAC1B;AAAA,IACJ;AAGA,QAAI,eAAe,YAAY;AAC3B,UAAI,IAAI,SAAS;AACb,8BAAsB,UAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,CAAC;AAAA,MACvD,WAAW,IAAI,WAAW;AACtB,8BAAsB,UAAQ,KAAK,IAAI,eAAe,SAAS,GAAG,OAAO,CAAC,CAAC;AAAA,MAC/E,WAAWA,WAAU,KAAK;AAEtB,yBAAiB,UAAQ;AACrB,gBAAM,OAAO,IAAI,IAAI,IAAI;AACzB,6BAAmB,QAAQ,OAAK,KAAK,IAAI,EAAE,QAAQ,CAAC;AACpD,iBAAO;AAAA,QACX,CAAC;AAAA,MACL;AAAA,IACJ;AAGA,QAAI,eAAe,cAAc;AAC7B,UAAI,IAAI,SAAS;AACb,gCAAwB,UAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,CAAC;AAAA,MACzD,WAAW,IAAI,WAAW;AACtB,gCAAwB,UAAQ,KAAK,IAAI,mBAAmB,SAAS,GAAG,OAAO,CAAC,CAAC;AAAA,MACrF,WAAWA,WAAU,KAAK;AACtB,cAAM,UAAU,mBAAmB,oBAAoB;AACvD,YAAI,SAAS;AACT,2BAAiB,UAAQ;AACrB,kBAAM,OAAO,IAAI,IAAI,IAAI;AACzB,gBAAI,KAAK,IAAI,QAAQ,QAAQ,EAAG,MAAK,OAAO,QAAQ,QAAQ;AAAA,gBACvD,MAAK,IAAI,QAAQ,QAAQ;AAC9B,mBAAO;AAAA,UACX,CAAC;AAAA,QACL;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ,GAAG,EAAE,UAAU,CAAC,gBAAgB,CAAC;AAGjC,EAAAD,UAAS,CAACC,QAAO,QAAQ;AACrB,QAAI,IAAI,QAAQ;AACZ,yBAAmB,KAAK;AACxB;AAAA,IACJ;AACA,QAAI,IAAI,QAAQ;AACZ,yBAAmB,KAAK;AACxB;AAAA,IACJ;AACA,QAAI,IAAI,aAAa,mBAAmB,SAAS,GAAG;AAChD,yBAAmB,KAAK;AACxB,8BAAwB,CAAC;AACzB;AAAA,IACJ;AAAA,EACJ,GAAG,EAAE,UAAU,gBAAgB,CAAC;AAGhC,QAAM,cAAc,YAAY;AAC5B,iBAAa,YAAY;AACzB,UAAM,YAAY,QAAQ,IAAI,IAAI;AAClC,UAAM,iBAAiB,MAAM,KAAK,aAAa;AAE/C,UAAM,gBAAgB,MAAM,QAAQ,wBAAwB,QAAQ,cAAc;AAClF,UAAM,YAAY,MAAM,QAAQ,aAAa;AAE7C,UAAM,kBAAqC,cAAc,IAAI,SAAO;AAAA,MAChE,UAAU;AAAA,MACV,QAAQ;AAAA,IACZ,EAAE;AACF,uBAAmB,eAAe;AAClC,oBAAgB,EAAE,OAAO,cAAc,QAAQ,WAAW,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,EAAE,CAAC;AAE9F,QAAI,QAAQ,GAAG,UAAU,GAAG,SAAS;AAErC,aAAS,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK;AAC3C,YAAM,KAAK,cAAc,CAAC;AAC1B,yBAAmB,UAAQ,KAAK;AAAA,QAAI,OAChC,EAAE,aAAa,KAAK,EAAE,GAAG,GAAG,QAAQ,cAAuB,IAAI;AAAA,MACnE,CAAC;AAED,UAAI;AACA,cAAM,OAAO,UAAU,EAAE;AACzB,YAAI,QAAQ,CAAC,SAAS,KAAK,UAAU;AACjC,6BAAmB,UAAQ,KAAK;AAAA,YAAI,OAChC,EAAE,aAAa,KAAK,EAAE,GAAG,GAAG,QAAQ,SAAkB,OAAO,mBAAmB,IAAI;AAAA,UACxF,CAAC;AACD;AAAA,QACJ,OAAO;AACH,gBAAM,QAAQ,QAAQ,QAAQ,IAAI,SAAS;AAC3C,6BAAmB,UAAQ,KAAK;AAAA,YAAI,OAChC,EAAE,aAAa,KAAK,EAAE,GAAG,GAAG,QAAQ,UAAmB,IAAI;AAAA,UAC/D,CAAC;AACD,cAAI,KAAM;AAAA,cACL;AAAA,QACT;AAAA,MACJ,SAAS,KAAK;AACV,2BAAmB,UAAQ,KAAK;AAAA,UAAI,OAChC,EAAE,aAAa,KAAK,EAAE,GAAG,GAAG,QAAQ,SAAkB,OAAO,eAAe,QAAQ,IAAI,UAAU,QAAQ,IAAI;AAAA,QAClH,CAAC;AACD;AAAA,MACJ;AAEA,sBAAgB,EAAE,OAAO,cAAc,QAAQ,WAAW,IAAI,GAAG,OAAO,SAAS,OAAO,CAAC;AAAA,IAC7F;AAEA,iBAAa,SAAS;AAAA,EAC1B;AAGA,QAAM,gBAAgB,YAAY;AAC9B,iBAAa,SAAS;AAEtB,UAAM,iBAAiB,IAAI,kBAAkB;AAC7C,UAAM,UAAU,MAAM,eAAe,gBAAgB;AAErD,QAAI,QAAQ,eAAe,GAAG;AAC1B,mBAAa,EAAE,OAAO,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,EAAE,CAAC;AACtF,mBAAa,MAAM;AACnB;AAAA,IACJ;AAEA,UAAM,kBAAkB,MAAM,KAAK,YAAY;AAC/C,UAAM,eAAqC,CAAC,SAAS,WAAW;AAEhE,UAAM,aAAa,aAAa,OAAO,CAAC,KAAK,SAAS;AAClD,aAAO,OAAO,SAAS,UAAU,QAAQ,MAAM,SAC3C,SAAS,cAAc,QAAQ,UAAU,SACrC,QAAQ,SAAS;AAAA,IAC7B,GAAG,CAAC;AACJ,UAAM,aAAa,aAAa,gBAAgB;AAEhD,iBAAa,EAAE,OAAO,YAAY,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,EAAE,CAAC;AAE/F,QAAI,UAAU,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS;AACpD,QAAI,YAAY;AAEhB,UAAM,eAAe;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA,CAAC,WAAW;AACR;AACA,YAAI,OAAO,WAAW,UAAW;AAAA,iBACxB,OAAO,WAAW,UAAW;AAAA,iBAC7B,OAAO,WAAW,UAAW;AAAA,iBAC7B,OAAO,WAAW,QAAS;AAEpC,wBAAgB,UAAQ,CAAC,GAAG,KAAK,MAAM,EAAE,GAAG;AAAA,UACxC,YAAY,OAAO,cAAc,OAAO,OAAO;AAAA,UAC/C,QAAQ,OAAO,WAAW,UAAU,UAAU;AAAA,UAC9C,OAAO,OAAO;AAAA,QAClB,CAAC,CAAC;AACF,qBAAa,EAAE,OAAO,YAAY,WAAW,SAAS,SAAS,SAAS,OAAO,CAAC;AAAA,MACpF;AAAA,IACJ;AAEA,iBAAa,MAAM;AAAA,EACvB;AAGA,MAAI,SAAS;AACT,WACI,gBAAAC,OAAA,cAACC,MAAA,EAAI,SAAS,KACV,gBAAAD,OAAA,cAACE,OAAA,EAAK,OAAM,UAAO,gBAAAF,OAAA,cAACG,UAAA,EAAQ,MAAK,QAAO,GAAE,wBAAsB,CACpE;AAAA,EAER;AAGA,MAAI,OAAO;AACP,WACI,gBAAAH,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,SAAS,KACjC,gBAAAD,OAAA,cAACE,OAAA,EAAK,OAAM,SAAM,kBAAU,KAAM,GAClC,gBAAAF,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,sBAAoB,CACvC;AAAA,EAER;AAGA,MAAI,cAAc,cAAc;AAC5B,WACI,gBAAAF,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,SAAS,KACjC,gBAAAD,OAAA,cAACC,MAAA,EAAI,cAAc,KACf,gBAAAD,OAAA,cAACE,OAAA,EAAK,MAAI,MAAC,OAAM,UAAO,iCAAwB,CACpD,GACA,gBAAAF,OAAA,cAACC,MAAA,EAAI,cAAc,KACf,gBAAAD,OAAA,cAAC,eAAY,SAAS,aAAa,WAAW,OAAO,aAAa,OAAO,OAAO,IAAI,CACxF,GACA,gBAAAA,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,aAAY,SAAQ,aAAY,QAAO,SAAS,GAAG,QAAQ,MAClF,gBAAgB,MAAM,EAAE,EAAE,IAAI,CAAC,SAC5B,gBAAAD,OAAA,cAACC,MAAA,EAAI,KAAK,KAAK,YACX,gBAAAD,OAAA,cAAC,cAAW,QACR,KAAK,WAAW,YAAY,YACxB,KAAK,WAAW,UAAU,UACtB,KAAK,WAAW,gBAAgB,YAAY,WACtD,GACF,gBAAAA,OAAA,cAACE,OAAA,MAAK,KAAE,KAAK,QAAS,GACrB,KAAK,SAAS,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,OAAM,UAAQ,QAAC,MAAG,KAAK,OAAM,GAAC,CAC7D,CACH,CACL,GACA,gBAAAF,OAAA,cAACC,MAAA,EAAI,WAAW,KACZ,gBAAAD,OAAA,cAACE,OAAA,MAAK,cACC,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,WAAS,aAAa,OAAM,QAAM,GAChD,UAAM,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,UAAQ,aAAa,SAAQ,UAAQ,GACvD,UAAM,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,SAAO,aAAa,QAAO,SAAO,CACzD,CACJ,CACJ;AAAA,EAER;AAGA,MAAI,cAAc,WAAW;AACzB,WACI,gBAAAF,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,SAAS,KACjC,gBAAAD,OAAA,cAACC,MAAA,EAAI,cAAc,KACf,gBAAAD,OAAA,cAACE,OAAA,EAAK,MAAI,MAAC,OAAM,WAAQ,+BAAwB,CACrD,GACA,gBAAAF,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,aAAY,SAAQ,aAAY,QAAO,SAAS,KACxE,gBAAAD,OAAA,cAACE,OAAA,MAAM,aAAa,OAAM,wBAAsB,GAChD,gBAAAF,OAAA,cAACE,OAAA,MAAK,mBAAK,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,WAAS,aAAa,KAAM,GAAO,QAAM,GAChE,gBAAAF,OAAA,cAACE,OAAA,MAAK,mBAAK,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,UAAQ,aAAa,OAAQ,GAAO,UAAQ,GAClE,aAAa,SAAS,KAAK,gBAAAF,OAAA,cAACE,OAAA,MAAK,mBAAK,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,SAAO,aAAa,MAAO,GAAO,SAAO,CAChG,GACA,gBAAAF,OAAA,cAACC,MAAA,EAAI,WAAW,KACZ,gBAAAD,OAAA,cAACE,OAAA,MAAK,wBAAa,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,UAAQ,QAAQ,IAAI,GAAE,QAAM,CAAO,CACtE,GACA,gBAAAF,OAAA,cAACC,MAAA,EAAI,WAAW,GAAG,eAAc,YAC7B,gBAAAD,OAAA,cAACE,OAAA,EAAK,MAAI,MAAC,OAAM,YAAS,2BAAkB,GAC5C,gBAAAF,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,kDAAgD,CACnE,GACA,gBAAAF,OAAA,cAACC,MAAA,EAAI,WAAW,GAAG,aAAY,UAAS,aAAY,QAAO,UAAU,KACjE,gBAAAD,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,uCAAkC,CACrD,CACJ;AAAA,EAER;AAGA,MAAI,cAAc,YAAY;AAC1B,WACI,gBAAAF,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,SAAS,KACjC,gBAAAD,OAAA,cAACC,MAAA,EAAI,cAAc,KACf,gBAAAD,OAAA,cAACE,OAAA,EAAK,MAAI,MAAC,OAAM,UAAO,yBAAgB,CAC5C,GACA,gBAAAF,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,aAAY,SAAQ,aAAY,QAAO,SAAS,KACvE,cAAc,IAAI,CAAC,KAAK,MAAM;AAC3B,YAAM,YAAY,sBAAsB,GAAG;AAC3C,YAAM,WAAW,MAAM;AACvB,YAAM,YAAY,aAAa,IAAI,GAAG;AACtC,aACI,gBAAAD,OAAA,cAACC,MAAA,EAAI,KAAK,OACN,gBAAAD,OAAA,cAACE,OAAA,EAAK,OAAO,WAAW,SAAS,WAC5B,WAAW,YAAO,MAClB,YAAY,aAAQ,OAAM,KAAE,UAAU,MAAK,KAAE,UAAU,IAC5D,CACJ;AAAA,IAER,CAAC,CACL,GACC,aAAa,OAAO,KACjB,gBAAAF,OAAA,cAACC,MAAA,EAAI,WAAW,KACZ,gBAAAD,OAAA,cAACE,OAAA,MAAK,cAAU,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,WAAS,aAAa,IAAK,GAAO,SAAO,CACzE,GAEJ,gBAAAF,OAAA,cAACC,MAAA,EAAI,WAAW,GAAG,aAAY,UAAS,aAAY,QAAO,UAAU,KACjE,gBAAAD,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,2FAA8D,CACjF,CACJ;AAAA,EAER;AAGA,MAAI,cAAc,WAAW;AACzB,WACI,gBAAAF,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,SAAS,KACjC,gBAAAD,OAAA,cAACC,MAAA,EAAI,cAAc,KACf,gBAAAD,OAAA,cAACE,OAAA,EAAK,MAAI,MAAC,OAAM,UAAO,6BAAoB,CAChD,GACA,gBAAAF,OAAA,cAACC,MAAA,EAAI,cAAc,KACf,gBAAAD,OAAA,cAAC,eAAY,SAAS,UAAU,WAAW,OAAO,UAAU,OAAO,OAAO,IAAI,CAClF,GACA,gBAAAA,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,aAAY,SAAQ,aAAY,QAAO,SAAS,GAAG,QAAQ,MAClF,aAAa,MAAM,EAAE,EAAE,IAAI,CAAC,MAAM,QAC/B,gBAAAD,OAAA,cAACC,MAAA,EAAI,KAAK,GAAG,KAAK,UAAU,IAAI,GAAG,MAC/B,gBAAAD,OAAA,cAAC,cAAW,QAAQ,KAAK,WAAW,YAAY,YAAY,KAAK,WAAW,UAAU,UAAU,WAAW,GAC3G,gBAAAA,OAAA,cAACE,OAAA,MAAK,KAAE,KAAK,UAAW,GACvB,KAAK,SAAS,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,OAAM,UAAQ,QAAC,MAAG,KAAK,OAAM,GAAC,CAC7D,CACH,CACL,GACA,gBAAAF,OAAA,cAACC,MAAA,EAAI,WAAW,KACZ,gBAAAD,OAAA,cAACE,OAAA,MAAK,cACC,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,WAAS,UAAU,SAAQ,UAAQ,GACjD,UAAM,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,UAAQ,UAAU,SAAQ,UAAQ,GACpD,UAAU,UAAU,KAAK,gBAAAF,OAAA,cAAAA,OAAA,gBAAG,UAAM,gBAAAA,OAAA,cAACE,OAAA,EAAK,OAAM,YAAU,UAAU,SAAQ,UAAQ,CAAO,GACzF,UAAU,SAAS,KAAK,gBAAAF,OAAA,cAAAA,OAAA,gBAAG,UAAM,gBAAAA,OAAA,cAACE,OAAA,EAAK,OAAM,SAAO,UAAU,QAAO,SAAO,CAAO,CACxF,CACJ,CACJ;AAAA,EAER;AAGA,MAAI,cAAc,QAAQ;AACtB,WACI,gBAAAF,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,SAAS,KACjC,gBAAAD,OAAA,cAACC,MAAA,EAAI,cAAc,KACf,gBAAAD,OAAA,cAACE,OAAA,EAAK,MAAI,MAAC,OAAM,WAAQ,qBAAY,CACzC,GACA,gBAAAF,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,aAAY,SAAQ,aAAY,QAAO,SAAS,KACxE,gBAAAD,OAAA,cAACE,OAAA,EAAK,MAAI,QAAC,uBAAc,GACzB,gBAAAF,OAAA,cAACE,OAAA,MAAK,mBAAK,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,WAAS,aAAa,KAAM,GAAO,YAAQ,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,UAAQ,aAAa,OAAQ,GAAO,UAAQ,GACzH,UAAU,QAAQ,KACf,gBAAAF,OAAA,cAAAA,OAAA,gBACI,gBAAAA,OAAA,cAACE,OAAA,MAAK,GAAC,GACP,gBAAAF,OAAA,cAACE,OAAA,EAAK,MAAI,QAAC,qBAAY,GACvB,gBAAAF,OAAA,cAACE,OAAA,MAAK,mBAAK,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,WAAS,UAAU,OAAQ,GAAO,cAAU,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,UAAQ,UAAU,OAAQ,GAAO,UAAQ,GACxH,gBAAAF,OAAA,cAACE,OAAA,MAAK,mBAAM,MAAM,KAAK,YAAY,EAAE,IAAI,SAAO,sBAAsB,GAAG,EAAE,IAAI,EAAE,KAAK,IAAI,CAAE,CAChG,CAER,GACA,gBAAAF,OAAA,cAACC,MAAA,EAAI,WAAW,KACZ,gBAAAD,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,qBAAmB,CACtC,CACJ;AAAA,EAER;AAGA,QAAM,kBAAkB,eAAe,kBAAkB;AACzD,QAAM,oBAAoB,mBAAmB,MAAM,GAAG,EAAE;AACxD,QAAM,UAAU,mBAAmB,SAAS;AAE5C,SACI,gBAAAF,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,SAAS,KAEjC,gBAAAD,OAAA,cAACC,MAAA,EAAI,cAAc,KACf,gBAAAD,OAAA,cAACE,OAAA,EAAK,MAAI,MAAC,OAAM,UAAO,sBAAa,GACpC,cAAc,OAAO,KAClB,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,WAAQ,MAAG,cAAc,MAAK,YAAU,CAE5D,GAGA,gBAAAF,OAAA,cAACC,MAAA,MAEG,gBAAAD,OAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACG,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAa,eAAe,aAAa,SAAS;AAAA,MAClD,OAAO;AAAA,MACP,SAAS;AAAA;AAAA,IAET,gBAAAD,OAAA,cAACE,OAAA,EAAK,MAAI,MAAC,UAAQ,QAAC,UAAQ;AAAA,IAC5B,gBAAAF,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,WAAW,KAClC,eAAe,IAAI,CAAC,KAAK,MAAM;AAC5B,YAAM,WAAW,MAAM;AACvB,YAAM,WAAW,eAAe;AAChC,aACI,gBAAAD,OAAA,cAACC,MAAA,EAAI,KAAK,IAAI,OACV,gBAAAD,OAAA,cAACE,OAAA,EAAK,OAAO,YAAY,WAAW,SAAS,WAAW,UAAU,UAC7D,YAAY,WAAW,YAAO,WAAW,YAAO,MAChD,IAAI,KAAI,KAAC,gBAAAF,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,KAAE,IAAI,OAAM,GAAC,CAC1C,CACJ;AAAA,IAER,CAAC,CACL;AAAA,EACJ,GAGA,gBAAAF,OAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACG,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAa,eAAe,eAAe,SAAS;AAAA,MACpD,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,SAAS;AAAA;AAAA,IAGT,gBAAAD,OAAA,cAACC,MAAA,EAAI,cAAc,KACf,gBAAAD,OAAA,cAACE,OAAA,EAAK,OAAO,kBAAkB,SAAS,UAAQ,YAAG,GAClD,kBACG,gBAAAF,OAAA;AAAA,MAACI;AAAA,MAAA;AAAA,QACG,OAAO;AAAA,QACP,UAAU;AAAA,QACV,aAAY;AAAA,QACZ,OAAO;AAAA;AAAA,IACX,IAEA,gBAAAJ,OAAA,cAACE,OAAA,MAAM,eAAe,gBAAAF,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,aAAW,CAAQ,CAEhE;AAAA,IAGA,gBAAAF,OAAA,cAACC,MAAA,EAAI,cAAc,KACf,gBAAAD,OAAA,cAACE,OAAA,EAAK,MAAI,QAAC,aAAW,GACrB,mBAAmB,gBAAgB,QAAQ,SACxC,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,UAAO,KAAE,gBAAgB,KAAI,IAAE,GAE9C,eACG,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,YAAS,KAAE,aAAY,IAAE,GAEzC,gBAAAF,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,KAAE,mBAAmB,QAAQ,UAAU,MAAM,IAAG,GAAC,CACpE;AAAA,IAGA,gBAAAF,OAAA,cAACC,MAAA,EAAI,eAAc,YACd,kBAAkB,IAAI,CAAC,MAAM,MAAM;AAChC,YAAM,WAAW,MAAM,wBAAwB,eAAe;AAC9D,YAAM,YAAY,cAAc,IAAI,KAAK,QAAQ;AACjD,YAAM,cAAc,eAAe,IAAI,KAAK,QAAQ;AAEpD,aACI,gBAAAD,OAAA,cAACC,MAAA,EAAI,KAAK,KAAK,YACX,gBAAAD,OAAA,cAACE,OAAA,EAAK,OAAO,WAAW,SAAS,WAC5B,WAAW,YAAO,MAClB,YAAY,aAAQ,OAAM,KAAE,KAAK,QACtC,GACA,gBAAAF,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,KAAE,cAAc,WAAM,QAAI,CAC7C;AAAA,IAER,CAAC,GACA,mBAAmB,WAAW,KAC3B,gBAAAF,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,uBAAqB,GAEvC,WACG,gBAAAF,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,WAAQ,mBAAmB,SAAS,IAAG,OAAK,CAEnE;AAAA,EACJ,CACJ,GAGC,cAAc,OAAO,KAClB,gBAAAF,OAAA,cAACC,MAAA,EAAI,WAAW,KACZ,gBAAAD,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,cACP,MAAM,KAAK,aAAa,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,GAClD,cAAc,OAAO,KAAK,KAAK,cAAc,OAAO,CAAC,OAC1D,CACJ,GAIJ,gBAAAF,OAAA,cAACC,MAAA,EAAI,WAAW,GAAG,aAAY,UAAS,aAAY,QAAO,UAAU,KACjE,gBAAAD,OAAA,cAACE,OAAA,EAAK,UAAQ,QACT,eAAe,cAAc,+EAC7B,eAAe,gBAAgB,CAAC,mBAAmB,2FACnD,mBAAmB,wCACnB,CAAC,mBAAmB,iDACzB,CACJ,CACJ;AAER;;;ADzqBO,SAAS,wBAAiC;AAC7C,QAAM,MAAM,IAAIG,SAAQ,WAAW,EAC9B,YAAY,+CAA+C,EAC3D,OAAO,WAAW,0CAA0C,EAC5D,OAAO,OAAO,YAAiC;AAC5C,UAAM,gBAAgB,IAAI,cAAc;AACxC,UAAM,SAAS,MAAM,cAAc,KAAK;AACxC,QAAI,CAAC,QAAQ;AACT,YAAM,IAAI,gBAAgB,yCAAyC;AAAA,IACvE;AAGA,UAAM,EAAE,cAAc,IAAIC;AAAA,MACtBC,OAAM,cAAc,iBAAiB;AAAA,QACjC;AAAA,QACA,OAAO,QAAQ;AAAA,QACf,QAAQ,MAAM;AACV,kBAAQ,KAAK,CAAC;AAAA,QAClB;AAAA,MACJ,CAAC;AAAA,IACL;AAEA,UAAM,cAAc;AAAA,EACxB,CAAC;AAEL,SAAO;AACX;;;AEpCA,SAAS,WAAAC,gBAAe;AACxB,SAAS,eAAe;AACxB,OAAOC,YAAW;AASX,SAAS,sBAA+B;AAC3C,SAAO,IAAIC,SAAQ,QAAQ,EACtB,YAAY,gDAAgD,EAC5D,OAAO,WAAW,iDAAiD,EACnE,OAAO,OAAO,YAAiC;AAC5C,UAAM,aAAa,OAAO;AAAA,EAC9B,CAAC;AACT;AAEA,eAAe,aAAa,SAA8B;AACtD,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,SAAS,MAAM,cAAc,KAAK;AACxC,MAAI,CAAC,QAAQ;AACT,UAAM,IAAI,gBAAgB,yCAAyC;AAAA,EACvE;AAEA,QAAM,oBAAoB,IAAI,kBAAkB;AAChD,QAAM,YAAY,MAAM,kBAAkB,aAAa;AACvD,QAAM,YAAY,OAAO,KAAK,SAAS;AAEvC,MAAI,UAAU,WAAW,GAAG;AACxB,YAAQ,IAAIC,OAAM,OAAO,uFAAyC,CAAC;AACnE,YAAQ,IAAIA,OAAM,IAAI,4DAA0C,CAAC;AACjE;AAAA,EACJ;AAEA,UAAQ,IAAIA,OAAM,KAAK,yDAA8B,CAAC;AAEtD,MAAI;AACA,UAAM,YAAY,MAAM,kBAAkB,aAAa,QAAQ,SAAS;AACxE,UAAM,UAAoB,CAAC;AAC3B,UAAM,WAAqB,CAAC;AAC5B,UAAM,aAAuB,CAAC;AAE9B,eAAW,MAAM,WAAW;AACxB,YAAM,UAAU,UAAU,EAAE;AAC5B,YAAM,SAAS,UAAU,EAAE;AAE3B,UAAI,CAAC,QAAQ;AACT,mBAAW,KAAK,EAAE;AAClB;AAAA,MACJ;AAEA,UAAI,QAAQ,aAAa,OAAO,UAAU;AACtC,gBAAQ,KAAK,EAAE;AAAA,MACnB,OAAO;AACH,iBAAS,KAAK,EAAE;AAAA,MACpB;AAAA,IACJ;AAGA,QAAI,WAAW,SAAS,GAAG;AACvB,cAAQ,IAAIA,OAAM,OAAO,yEAAsD,CAAC;AAChF,iBAAW,MAAM,YAAY;AACzB,gBAAQ,IAAIA,OAAM,IAAI,QAAQ,EAAE,EAAE,CAAC;AAAA,MACvC;AAAA,IACJ;AAEA,QAAI,QAAQ,WAAW,GAAG;AACtB,cAAQ,IAAIA,OAAM,MAAM,6FAAiD,CAAC;AAC1E,UAAI,SAAS,SAAS,GAAG;AACrB,gBAAQ,IAAIA,OAAM,IAAI,MAAM,SAAS,MAAM,8CAA4B,CAAC;AAAA,MAC5E;AACA;AAAA,IACJ;AAEA,YAAQ,IAAIA,OAAM,KAAK;AAAA,6BAAiBA,OAAM,KAAK,QAAQ,MAAM,CAAC,sBAAY,CAAC;AAC/E,eAAW,MAAM,SAAS;AACtB,YAAM,UAAU,UAAU,EAAE;AAC5B,YAAM,SAAS,UAAU,EAAE;AAC3B,cAAQ;AAAA,QACJ,MAAMA,OAAM,MAAM,EAAE,CAAC,MACrBA,OAAM,IAAI,IAAI,QAAQ,OAAO,EAAE,IAC/BA,OAAM,KAAK,UAAK,IAChBA,OAAM,MAAM,IAAI,OAAO,OAAO,EAAE;AAAA,MACpC;AAAA,IACJ;AACA,YAAQ,IAAI;AAEZ,QAAI,CAAC,QAAQ,OAAO;AAChB,YAAM,eAAe,MAAM,QAAQ,EAAE,SAAS,4BAAkB,SAAS,KAAK,CAAC;AAC/E,UAAI,CAAC,cAAc;AACf,gBAAQ,IAAIA,OAAM,IAAI,yCAAkB,CAAC;AACzC;AAAA,MACJ;AAAA,IACJ;AAGA,UAAM,YAAY,QAAQ,IAAI,IAAI;AAClC,QAAI,eAAe;AACnB,UAAM,cAAwB,CAAC;AAE/B,YAAQ,IAAI;AACZ,eAAW,MAAM,SAAS;AACtB,UAAI;AACA,gBAAQ,OAAO,MAAMA,OAAM,KAAK,0CAAoBA,OAAM,MAAM,EAAE,CAAC,KAAK,CAAC;AACzE,cAAM,aAAa,MAAM,kBAAkB,WAAW,IAAI,SAAS;AACnE,YAAI,YAAY;AACZ,sBAAY,KAAK,UAAU;AAAA,QAC/B;AAEA,cAAM,kBAAkB,QAAQ,QAAQ,IAAI,SAAS;AACrD,gBAAQ,IAAIA,OAAM,MAAM,SAAI,CAAC;AAC7B;AAAA,MACJ,SAAS,OAAO;AACZ,gBAAQ,IAAIA,OAAM,IAAI,SAAI,CAAC;AAC3B,gBAAQ,IAAIA,OAAM,IAAI,gBAAW,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE,CAAC;AAAA,MAChG;AAAA,IACJ;AAEA,YAAQ,IAAI;AACZ,QAAI,iBAAiB,QAAQ,QAAQ;AACjC,cAAQ,IAAIA,OAAM,MAAM,4BAAe,YAAY,IAAI,QAAQ,MAAM,iCAAe,CAAC;AAAA,IACzF,OAAO;AACH,cAAQ,IAAIA,OAAM,OAAO,mCAAiB,YAAY,IAAI,QAAQ,MAAM,iCAAe,CAAC;AAAA,IAC5F;AAEA,QAAI,YAAY,SAAS,GAAG;AACxB,cAAQ,IAAIA,OAAM,IAAI;AAAA,4DAAsC,CAAC;AAE7D,YAAM,eAAe,MAAM,QAAQ,EAAE,SAAS,gCAAuB,SAAS,MAAM,CAAC;AACrF,UAAI,cAAc;AACd,cAAM,kBAAkB,aAAa,QAAQ,IAAI,CAAC;AAClD,gBAAQ,IAAIA,OAAM,MAAM,6CAAsB,CAAC;AAAA,MACnD,OAAO;AACH,gBAAQ,IAAIA,OAAM,IAAI,2DAAkC,CAAC;AAAA,MAC7D;AAAA,IACJ;AAEA,gBAAY,qBAAqB,EAAE,OAAO,aAAa,CAAC;AAAA,EAE5D,SAAS,OAAO;AACZ,UAAM,IAAI,MAAM,wDAA+B,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AAAA,EAC7G;AACJ;;;ACjJA,SAAS,WAAAC,gBAAe;AACxB,OAAOC,YAAW;AAClB,OAAO,WAAW;AAcX,SAAS,qBAA8B;AAC5C,QAAM,MAAM,IAAIC,SAAQ,OAAO,EAC5B,YAAY,4CAA6B,EACzC,OAAO,UAAU,gBAAgB,EACjC,OAAO,OAAO,YAA0B;AACvC,UAAM,YAAY,OAAO;AAAA,EAC3B,CAAC;AAEH,SAAO;AACT;AAEA,eAAe,YAAY,SAAsC;AAC/D,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,SAAS,MAAM,cAAc,KAAK;AAExC,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,gBAAgB,yBAAyB,WAAW,CAAC,eAAe;AAAA,EAChF;AAEA,QAAM,oBAAoB,IAAI,kBAAkB;AAChD,QAAM,YAAY,MAAM,kBAAkB,aAAa;AACvD,QAAM,YAAY,OAAO,KAAK,SAAS;AAEvC,MAAI,UAAU,WAAW,GAAG;AAC1B,YAAQ;AAAA,MACNC,OAAM,OAAO,iDAAiC,WAAW,CAAC,8CAAqB;AAAA,IACjF;AACA;AAAA,EACF;AAEA,UAAQ,IAAIA,OAAM,IAAI,iDAA6B,CAAC;AAEpD,MAAI;AACF,UAAM,YAAY,MAAM,kBAAkB,aAAa,QAAQ,SAAS;AACxE,UAAM,UAAoB,CAAC;AAC3B,UAAM,WAAqB,CAAC;AAE5B,eAAW,MAAM,WAAW;AAC1B,YAAM,UAAU,UAAU,EAAE;AAC5B,YAAM,SAAS,UAAU,EAAE;AAE3B,UAAI,CAAC,QAAQ;AAEX;AAAA,MACF;AAEA,UAAI,QAAQ,aAAa,OAAO,UAAU;AACxC,gBAAQ,KAAK,EAAE;AAAA,MACjB,OAAO;AACL,iBAAS,KAAK,EAAE;AAAA,MAClB;AAAA,IACF;AAGA,QAAI,QAAQ,MAAM;AAChB,cAAQ;AAAA,QACN,KAAK;AAAA,UACH;AAAA,YACE,SAAS,QAAQ,IAAI,CAAC,QAAQ;AAAA,cAC5B,MAAM;AAAA,cACN,gBAAgB,UAAU,EAAE,EAAE;AAAA,cAC9B,eAAe,UAAU,EAAE,EAAE;AAAA,YAC/B,EAAE;AAAA,YACF,UAAU,SAAS;AAAA,YACnB,OAAO,UAAU;AAAA,UACnB;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AAGA,YAAQ,IAAIA,OAAM,KAAK,4CAA6B,CAAC;AAErD,QAAI,QAAQ,SAAS,GAAG;AACtB,YAAM,QAAQ,IAAI,MAAM;AAAA,QACtB,MAAM;AAAA,UACJA,OAAM,KAAK,WAAW;AAAA,UACtBA,OAAM,KAAK,oBAAU;AAAA,UACrBA,OAAM,KAAK,oBAAU;AAAA,UACrBA,OAAM,KAAK,oBAAY;AAAA,QACzB;AAAA,QACA,OAAO;AAAA,UACL,MAAM,CAAC,MAAM;AAAA,UACb,QAAQ,CAAC,MAAM;AAAA,QACjB;AAAA,MACF,CAAC;AAED,iBAAW,MAAM,SAAS;AACxB,cAAM,UAAU,UAAU,EAAE;AAC5B,cAAM,SAAS,UAAU,EAAE;AAC3B,cAAM,KAAK;AAAA,UACT;AAAA,UACA,IAAI,QAAQ,OAAO;AAAA,UACnBA,OAAM,MAAM,IAAI,OAAO,OAAO,EAAE;AAAA,UAChCA,OAAM,OAAO,2CAAkB;AAAA,QACjC,CAAC;AAAA,MACH;AAEA,cAAQ,IAAI,MAAM,SAAS,CAAC;AAAA,IAC9B;AAGA,YAAQ,IAAI;AACZ,QAAI,QAAQ,WAAW,KAAK,SAAS,SAAS,GAAG;AAC/C,cAAQ;AAAA,QACNA,OAAM,MAAM,2BAAY,SAAS,MAAM,4CAA0B;AAAA,MACnE;AAAA,IACF,WAAW,SAAS,SAAS,GAAG;AAC9B,cAAQ,IAAIA,OAAM,IAAI,UAAK,SAAS,MAAM,4CAA0B,CAAC;AAAA,IACvE;AAEA,QAAI,QAAQ,SAAS,GAAG;AACtB,cAAQ;AAAA,QACNA,OAAM,OAAO;AAAA,gBAAS,QAAQ,MAAM,kDAAgC;AAAA,MACtE;AACA,cAAQ;AAAA,QACNA,OAAM,IAAI,WAAM;AAAA,QAChBA,OAAM,KAAK,IAAI,WAAW,CAAC,UAAU;AAAA,QACrCA,OAAM,IAAI,kCAAc;AAAA,MAC1B;AAAA,IACF,OAAO;AACL,cAAQ,IAAIA,OAAM,MAAM,+EAA+B,CAAC;AAAA,IAC1D;AAAA,EACF,SAAS,OAAO;AACd,YAAQ;AAAA,MACNA,OAAM,IAAI,4CAAwB;AAAA,MAClC,iBAAiB,QAAQ,MAAM,UAAU;AAAA,IAC3C;AAAA,EACF;AACF;;;AChJA,SAAS,WAAAC,iBAAe;AACxB,OAAOC,YAAW;;;ACDlB,OAAOC,aAAW;AAClB,SAAS,UAAAC,eAAc;AACvB,SAAS,WAAAC,gBAAe;;;ACNxB,OAAOC,WAAS,YAAAC,WAAU,aAAAC,kBAAiB;AAC3C,SAAS,OAAAC,MAAK,QAAAC,OAAM,YAAAC,WAAU,UAAAC,eAAc;;;ACD5C,OAAOC,UAAS,YAAAC,iBAAgB;AAChC,SAAS,OAAAC,MAAK,QAAAC,OAAM,YAAAC,iBAAgB;AAmB7B,IAAM,eAA4C,CAAC,EAAE,aAAa,SAAS,MAAM;AACpF,QAAM,CAAC,eAAe,gBAAgB,IAAIH,UAAS,CAAC;AAGpD,QAAM,YAA2B;AAAA,IAC7B;AAAA,MACI,KAAK;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,WAAW,YAAY,KAAK,SAAO,IAAI,QAAQ,QAAQ,GAAG,MAAM,cAAc;AAAA,MAC9E,WAAW,YAAY,KAAK,SAAO,IAAI,QAAQ,QAAQ;AAAA,IAC3D;AAAA,IACA;AAAA,MACI,KAAK;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,WAAW,YAAY,KAAK,SAAO,IAAI,QAAQ,UAAU,GAAG,MAAM,cAAc;AAAA,MAChF,WAAW,YAAY,KAAK,SAAO,IAAI,QAAQ,UAAU;AAAA,IAC7D;AAAA,IACA;AAAA,MACI,KAAK;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,WAAW,YAAY,KAAK,SAAO,IAAI,QAAQ,aAAa,GAAG,MAAM,cAAc;AAAA,MACnF,WAAW,YAAY,KAAK,SAAO,IAAI,QAAQ,aAAa;AAAA,IAChE;AAAA,IACA;AAAA,MACI,KAAK;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,WAAW,YAAY,KAAK,SAAO,IAAI,QAAQ,MAAM,GAAG,MAAM,cAAc;AAAA,MAC5E,WAAW,YAAY,KAAK,SAAO,IAAI,QAAQ,MAAM;AAAA,IACzD;AAAA,EACJ;AAEA,EAAAG,UAAS,CAACC,QAAO,QAAQ;AACrB,QAAI,IAAI,SAAS;AACb,uBAAiB,UAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,CAAC;AAAA,IAClD,WAAW,IAAI,WAAW;AACtB,uBAAiB,UAAQ,KAAK,IAAI,UAAU,SAAS,GAAG,OAAO,CAAC,CAAC;AAAA,IACrE,WAAW,IAAI,QAAQ;AACnB,YAAM,OAAO,UAAU,aAAa;AACpC,UAAI,QAAQ,KAAK,WAAW;AACxB,iBAAS,KAAK,GAAG;AAAA,MACrB;AAAA,IACJ;AAAA,EACJ,GAAG,EAAE,UAAU,KAAK,CAAC;AAGrB,QAAM,gBAAgB,CAAC,SAA8B;AACjD,QAAI,CAAC,KAAK,WAAW;AACjB,aAAO;AAAA,IACX;AAEA,UAAM,MAAM,YAAY,KAAK,OAAK,EAAE,QAAQ,KAAK,GAAG;AACpD,QAAI,CAAC,IAAK,QAAO;AAEjB,UAAM,QAAkB,CAAC;AACzB,QAAI,IAAI,MAAM,OAAO,MAAO,OAAM,KAAK,GAAG,IAAI,MAAM,OAAO,KAAK,QAAQ;AACxE,QAAI,IAAI,MAAM,OAAO,UAAW,OAAM,KAAK,GAAG,IAAI,MAAM,OAAO,SAAS,YAAY;AACpF,QAAI,IAAI,MAAM,OAAO,OAAQ,OAAM,KAAK,GAAG,IAAI,MAAM,OAAO,MAAM,SAAS;AAC3E,QAAI,IAAI,MAAM,OAAO,OAAQ,OAAM,KAAK,GAAG,IAAI,MAAM,OAAO,MAAM,SAAS;AAC3E,QAAI,IAAI,MAAM,OAAO,QAAS,OAAM,KAAK,GAAG,IAAI,MAAM,OAAO,OAAO,UAAU;AAE9E,WAAO,MAAM,KAAK,IAAI,KAAK,GAAG,KAAK,SAAS;AAAA,EAChD;AAEA,SACI,gBAAAL,OAAA,cAACE,MAAA,EAAI,eAAc,YAEf,gBAAAF,OAAA;AAAA,IAACE;AAAA,IAAA;AAAA,MACG,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,SAAS;AAAA,MACT,cAAc;AAAA;AAAA,IAEd,gBAAAF,OAAA,cAACG,OAAA,MAAK,6CAAkB,gBAAAH,OAAA,cAACG,OAAA,EAAK,MAAI,MAAC,OAAM,UAAO,cAAY,GAAO,GAAC;AAAA,IACpE,gBAAAH,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,8FAEf;AAAA,EACJ,GAGA,gBAAAH,OAAA,cAACE,MAAA,EAAI,eAAc,UAAS,aAAY,SAAQ,aAAY,QAAO,SAAS,KACxE,gBAAAF,OAAA,cAACG,OAAA,EAAK,MAAI,MAAC,cAAc,KAAG,4CAAqB,GAEhD,UAAU,IAAI,CAAC,MAAM,UAAU;AAC5B,UAAM,aAAa,UAAU;AAC7B,UAAM,SAAS,CAAC,KAAK;AAErB,WACI,gBAAAH,OAAA,cAACE,MAAA,EAAI,KAAK,KAAK,KAAK,SAAS,KACzB,gBAAAF,OAAA,cAACG,OAAA,EAAK,OAAO,aAAa,SAAS,SAAS,SAAS,SAAS,UAAU,UACnE,aAAa,YAAO,MACpB,KAAK,MAAK,KAAE,KAAK,KACtB,GACC,KAAK,aACF,gBAAAH,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,OAAI,cAAc,IAAI,CAAE,GAE1C,CAAC,KAAK,aACH,gBAAAH,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,2BAAmB,CAE1C;AAAA,EAER,CAAC,CACL,GAGC,YAAY,WAAW,KACpB,gBAAAH,OAAA,cAACE,MAAA,EAAI,WAAW,GAAG,aAAY,SAAQ,aAAY,UAAS,SAAS,KACjE,gBAAAF,OAAA,cAACG,OAAA,EAAK,OAAM,YAAS,wDAA8B,GACnD,gBAAAH,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,mBAAS,GACxB,gBAAAH,OAAA,cAACG,OAAA,EAAK,OAAM,UAAO,YAAU,GAC7B,gBAAAH,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,uEAAoC,CACvD,CAER;AAER;;;AC3IA,OAAOG,UAAS,YAAAC,iBAAgB;AAChC,SAAS,OAAAC,MAAK,QAAAC,OAAM,YAAAC,iBAAgB;AAmB7B,IAAM,kBAAkD,CAAC;AAAA,EAC5D;AAAA,EACA;AAAA,EACA;AACJ,MAAM;AACF,QAAM,CAAC,kBAAkB,mBAAmB,IAAIH,UAAS,CAAC;AAG1D,QAAM,OAAyB,CAAC;AAEhC,MAAI,WAAW,MAAM,OAAO,OAAO;AAC/B,SAAK,KAAK;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,MAAM;AAAA,MACN,OAAO,WAAW,MAAM,OAAO;AAAA,IACnC,CAAC;AAAA,EACL;AACA,MAAI,WAAW,MAAM,OAAO,WAAW;AACnC,SAAK,KAAK;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,MAAM;AAAA,MACN,OAAO,WAAW,MAAM,OAAO;AAAA,IACnC,CAAC;AAAA,EACL;AACA,MAAI,WAAW,MAAM,OAAO,QAAQ;AAChC,SAAK,KAAK;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,MAAM;AAAA,MACN,OAAO,WAAW,MAAM,OAAO;AAAA,IACnC,CAAC;AAAA,EACL;AACA,MAAI,WAAW,MAAM,OAAO,QAAQ;AAChC,SAAK,KAAK;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,MAAM;AAAA,MACN,OAAO,WAAW,MAAM,OAAO;AAAA,IACnC,CAAC;AAAA,EACL;AACA,MAAI,WAAW,MAAM,OAAO,SAAS;AACjC,SAAK,KAAK;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,MAAM;AAAA,MACN,OAAO,WAAW,MAAM,OAAO;AAAA,IACnC,CAAC;AAAA,EACL;AACA,MAAI,WAAW,MAAM,OAAO,SAAS;AACjC,SAAK,KAAK;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,MAAM;AAAA,MACN,OAAO,WAAW,MAAM,OAAO;AAAA,IACnC,CAAC;AAAA,EACL;AAEA,EAAAG,UAAS,CAACC,QAAO,QAAQ;AAErB,QAAI,IAAI,OAAO,IAAI,YAAY;AAC3B,0BAAoB,UAAQ,KAAK,IAAI,KAAK,SAAS,GAAG,OAAO,CAAC,CAAC;AAAA,IACnE,WAAW,IAAI,WAAW;AACtB,0BAAoB,UAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,CAAC;AAAA,IACrD;AAGA,UAAM,MAAM,SAASA,QAAO,EAAE;AAC9B,QAAI,CAAC,MAAM,GAAG,KAAK,OAAO,KAAK,OAAO,KAAK,QAAQ;AAC/C,0BAAoB,MAAM,CAAC;AAAA,IAC/B;AAGA,QAAI,IAAI,QAAQ;AACZ,YAAM,MAAM,KAAK,gBAAgB;AACjC,UAAI,KAAK;AACL,qBAAa,IAAI,IAAI;AAAA,MACzB;AAAA,IACJ;AAAA,EACJ,GAAG,EAAE,UAAU,KAAK,CAAC;AAGrB,QAAM,aAAa,KAAK,gBAAgB;AAGxC,QAAM,eAAe,aACf,YAAY,OAAO,OAAO,UAAQ,KAAK,SAAS,WAAW,IAAI,KAAK,CAAC,IACrE,CAAC;AAGP,QAAM,aAAa,CAAC,UAA0B;AAC1C,QAAI,QAAQ,KAAM,QAAO,GAAG,KAAK;AACjC,QAAI,QAAQ,OAAO,KAAM,QAAO,IAAI,QAAQ,MAAM,QAAQ,CAAC,CAAC;AAC5D,WAAO,IAAI,SAAS,OAAO,OAAO,QAAQ,CAAC,CAAC;AAAA,EAChD;AAGA,QAAM,aAAa,CAAC,SAAuB;AACvC,WAAO,KAAK,mBAAmB,SAAS;AAAA,MACpC,MAAM;AAAA,MACN,OAAO;AAAA,MACP,KAAK;AAAA,IACT,CAAC;AAAA,EACL;AAEA,SACI,gBAAAL,OAAA,cAACE,MAAA,EAAI,eAAc,YAEf,gBAAAF,OAAA,cAACE,MAAA,EAAI,cAAc,KACf,gBAAAF,OAAA,cAACG,OAAA,EAAK,MAAI,MAAC,OAAM,UAAQ,WAAW,OAAO,MAAK,KAAE,WAAW,OAAO,IAAK,CAC7E,GAGA,gBAAAH,OAAA;AAAA,IAACE;AAAA,IAAA;AAAA,MACG,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,SAAS;AAAA,MACT,cAAc;AAAA;AAAA,IAEd,gBAAAF,OAAA,cAACG,OAAA,EAAK,MAAI,QAAC,0BAAY;AAAA,IACvB,gBAAAH,OAAA,cAACE,MAAA,EAAI,WAAW,KACZ,gBAAAF,OAAA,cAACG,OAAA,MAAK,yBACO,gBAAAH,OAAA,cAACG,OAAA,EAAK,MAAI,MAAC,OAAM,UAAQ,WAAW,MAAM,YAAW,QAAM,CACxE,GACA,gBAAAH,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,QAAG,GAClB,gBAAAH,OAAA,cAACG,OAAA,MAAK,uCACa,gBAAAH,OAAA,cAACG,OAAA,EAAK,MAAI,QAAE,WAAW,WAAW,MAAM,SAAS,CAAE,CACtE,GACC,WAAW,MAAM,gBACd,gBAAAH,OAAA,cAAAA,OAAA,gBACI,gBAAAA,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,QAAG,GAClB,gBAAAH,OAAA,cAACG,OAAA,MAAK,kCACW,gBAAAH,OAAA,cAACG,OAAA,EAAK,MAAI,QAAE,WAAW,WAAW,MAAM,YAAY,CAAE,CACvE,CACJ,CAER;AAAA,EACJ,GAGA,gBAAAH,OAAA,cAACE,MAAA,EAAI,eAAc,UAAS,aAAY,SAAQ,aAAY,QAAO,SAAS,KAExE,gBAAAF,OAAA,cAACE,MAAA,EAAI,cAAc,KACd,KAAK,IAAI,CAAC,KAAK,UAAU;AACtB,UAAM,aAAa,UAAU;AAC7B,WACI,gBAAAF,OAAA,cAACE,MAAA,EAAI,KAAK,IAAI,MAAM,aAAa,KAC7B,gBAAAF,OAAA;AAAA,MAACG;AAAA,MAAA;AAAA,QACG,OAAO,aAAa,SAAS;AAAA,QAC7B,MAAM;AAAA,QACN,SAAS;AAAA;AAAA,MAER;AAAA,MAAK,IAAI;AAAA,MAAK;AAAA,MAAE,IAAI;AAAA,MAAM;AAAA,MAAG,IAAI;AAAA,MAAM;AAAA,MAAE;AAAA,IAC9C,CACJ;AAAA,EAER,CAAC,CACL,GAGC,cAAc,aAAa,SAAS,KACjC,gBAAAH,OAAA,cAACE,MAAA,EAAI,eAAc,YACf,gBAAAF,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,2DAAqC,GACpD,gBAAAH,OAAA,cAACE,MAAA,EAAI,eAAc,UAAS,WAAW,KAClC,aAAa,MAAM,GAAG,CAAC,EAAE,IAAI,UAC1B,gBAAAF,OAAA,cAACE,MAAA,EAAI,KAAK,KAAK,IAAI,SAAS,KACxB,gBAAAF,OAAA,cAACG,OAAA,MAAK,WAAG,KAAK,IAAK,GAClB,KAAK,eACF,gBAAAH,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,OAAI,KAAK,WAAY,CAE5C,CACH,GACA,aAAa,SAAS,KACnB,gBAAAH,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,cAAQ,aAAa,SAAS,GAAE,gBAAW,CAElE,CACJ,GAGH,cAAc,aAAa,WAAW,KACnC,gBAAAH,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,sCAA0B,WAAW,KAAM,CAElE,CACJ;AAER;;;AC/MA,OAAOG,UAAS,YAAAC,iBAAgB;AAChC,SAAS,OAAAC,MAAK,QAAAC,OAAM,YAAAC,iBAAgB;AAa7B,IAAM,WAAoC,CAAC,EAAE,OAAO,aAAa,UAAU,OAAO,MAAM;AAC3F,QAAM,CAAC,eAAe,gBAAgB,IAAIH,UAAS,CAAC;AAEpD,EAAAG,UAAS,CAACC,QAAO,QAAQ;AACrB,QAAI,IAAI,SAAS;AACb,uBAAiB,UAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,CAAC;AAAA,IAClD,WAAW,IAAI,WAAW;AACtB,uBAAiB,UAAQ,KAAK,IAAI,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC;AAAA,IACjE,WAAW,IAAI,QAAQ;AACnB,YAAM,OAAO,MAAM,aAAa;AAChC,UAAI,MAAM;AACN,iBAAS,IAAI;AAAA,MACjB;AAAA,IACJ;AAAA,EACJ,GAAG,EAAE,UAAU,KAAK,CAAC;AAGrB,QAAM,eAAe,MAAc;AAC/B,YAAQ,aAAa;AAAA,MACjB,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX;AACI,eAAO;AAAA,IACf;AAAA,EACJ;AAGA,QAAM,aAAa,CAAC,UAA0B;AAC1C,QAAI,QAAQ,KAAM,QAAO,GAAG,KAAK;AACjC,QAAI,QAAQ,OAAO,KAAM,QAAO,IAAI,QAAQ,MAAM,QAAQ,CAAC,CAAC;AAC5D,WAAO,IAAI,SAAS,OAAO,OAAO,QAAQ,CAAC,CAAC;AAAA,EAChD;AAEA,MAAI,MAAM,WAAW,GAAG;AACpB,WACI,gBAAAL,OAAA,cAACE,MAAA,EAAI,eAAc,YACf,gBAAAF,OAAA,cAACE,MAAA,EAAI,cAAc,KACf,gBAAAF,OAAA,cAACG,OAAA,EAAK,MAAI,MAAC,OAAM,UAAQ,aAAa,CAAE,CAC5C,GACA,gBAAAH,OAAA,cAACE,MAAA,EAAI,aAAY,SAAQ,aAAY,QAAO,SAAS,KACjD,gBAAAF,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,6BAAkB,CACrC,CACJ;AAAA,EAER;AAEA,SACI,gBAAAH,OAAA,cAACE,MAAA,EAAI,eAAc,YAEf,gBAAAF,OAAA,cAACE,MAAA,EAAI,cAAc,KACf,gBAAAF,OAAA,cAACG,OAAA,EAAK,MAAI,MAAC,OAAM,UAAQ,aAAa,CAAE,GACxC,gBAAAH,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,OAAI,MAAM,QAAO,QAAM,CAC1C,GAGA,gBAAAH,OAAA,cAACE,MAAA,EAAI,eAAc,UAAS,aAAY,SAAQ,aAAY,QAAO,SAAS,KACvE,MAAM,IAAI,CAAC,MAAM,UAAU;AACxB,UAAM,aAAa,UAAU;AAE7B,WACI,gBAAAF,OAAA,cAACE,MAAA,EAAI,KAAK,KAAK,IAAI,eAAc,UAAS,SAAS,KAC/C,gBAAAF,OAAA,cAACE,MAAA,MACG,gBAAAF,OAAA,cAACG,OAAA,EAAK,OAAO,aAAa,SAAS,WAC9B,aAAa,YAAO,MACpB,KAAK,IACV,GACA,gBAAAH,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,MAAG,WAAW,KAAK,QAAQ,GAAE,GAAC,CACjD,GAEC,cACG,gBAAAH,OAAA,cAACE,MAAA,EAAI,YAAY,GAAG,eAAc,YAC7B,KAAK,eACF,gBAAAF,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,cAAI,KAAK,WAAY,GAIvC,gBAAgB,WACb,gBAAAH,OAAA,cAAAA,OAAA,gBACK,KAAK,eACF,gBAAAA,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,sBAAe,GAEjC,KAAK,SAAS,KAAK,MAAM,SAAS,KAC/B,gBAAAH,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,qBAAW,KAAK,MAAM,KAAK,IAAI,CAAE,CAExD,GAIH,gBAAgB,YACb,gBAAAH,OAAA,cAACE,MAAA,MACI,KAAK,cAAc,gBAAAF,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,qBAAY,GAC9C,KAAK,iBAAiB,gBAAAH,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,wBAAe,GACpD,KAAK,aAAa,gBAAAH,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,oBAAW,CACjD,GAIH,gBAAgB,YAAY,KAAK,SAC9B,gBAAAH,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,qBAAW,KAAK,KAAM,GAGzC,gBAAAH,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,cAAI,KAAK,YAAa,CACzC,CAER;AAAA,EAER,CAAC,CACL,CACJ;AAER;;;ACtIA,OAAOG,WAAS,YAAAC,iBAAgB;AAChC,SAAS,OAAAC,MAAK,QAAAC,OAAM,YAAAC,iBAAgB;AAY7B,IAAM,aAAwC,CAAC,EAAE,MAAM,gBAAgB,eAAe,OAAO,MAAM;AAEtG,QAAM,CAAC,gBAAgB,iBAAiB,IAAIH,UAAS,aAAa;AAClE,QAAM,kBAAkB;AACxB,QAAM,YAAY,KAAK,IAAI,GAAG,KAAK,aAAa,SAAS,eAAe;AAGxE,EAAAG,UAAS,CAACC,QAAO,QAAQ;AAErB,QAAI,IAAI,WAAWA,WAAU,KAAK;AAC9B,wBAAkB,UAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,CAAC;AAAA,IACnD,WAAW,IAAI,aAAaA,WAAU,KAAK;AACvC,wBAAkB,UAAQ,KAAK,IAAI,WAAW,OAAO,CAAC,CAAC;AAAA,IAC3D,WAAW,IAAI,YAAYA,WAAU,KAAK;AACtC,wBAAkB,UAAQ,KAAK,IAAI,WAAW,OAAO,CAAC,CAAC;AAAA,IAC3D,WAAW,IAAI,UAAUA,WAAU,KAAK;AACpC,wBAAkB,UAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,CAAC;AAAA,IACnD,WAAWA,WAAU,KAAK;AACtB,wBAAkB,CAAC;AAAA,IACvB,WAAWA,WAAU,KAAK;AACtB,wBAAkB,SAAS;AAAA,IAC/B,WAES,IAAI,UAAU,IAAI,WAAW;AAClC,aAAO;AAAA,IACX;AAAA,EACJ,GAAG,EAAE,UAAU,KAAK,CAAC;AAErB,QAAM,aAAa,CAAC,UAA0B;AAC1C,QAAI,QAAQ,KAAM,QAAO,GAAG,KAAK;AACjC,QAAI,QAAQ,OAAO,KAAM,QAAO,IAAI,QAAQ,MAAM,QAAQ,CAAC,CAAC;AAC5D,WAAO,IAAI,SAAS,OAAO,OAAO,QAAQ,CAAC,CAAC;AAAA,EAChD;AAGA,QAAM,aAAa,CAAC,SAAuB;AACvC,WAAO,KAAK,eAAe,SAAS;AAAA,MAChC,MAAM;AAAA,MACN,OAAO;AAAA,MACP,KAAK;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,IACZ,CAAC;AAAA,EACL;AAGA,QAAM,eAAe,KAAK,aAAa;AAAA,IACnC;AAAA,IACA,iBAAiB;AAAA,EACrB;AAEA,QAAM,eAAe,iBAAiB;AACtC,QAAM,eAAe,iBAAiB,kBAAkB,KAAK,aAAa;AAG1E,QAAM,mBAAmB,KAAK,aAAa,UAAU,kBAC/C,MACA,KAAK,MAAO,iBAAiB,YAAa,GAAG;AAEnD,SACI,gBAAAL,QAAA,cAACE,MAAA,EAAI,eAAc,YAEf,gBAAAF,QAAA,cAACE,MAAA,EAAI,eAAc,UAAS,cAAc,KACtC,gBAAAF,QAAA,cAACG,OAAA,EAAK,MAAI,MAAC,OAAM,UAAQ,KAAK,IAAK,GACnC,gBAAAH,QAAA,cAACE,MAAA,MACG,gBAAAF,QAAA,cAACG,OAAA,EAAK,UAAQ,QAAE,KAAK,cAAa,YAAI,WAAW,KAAK,QAAQ,CAAE,GAC/D,KAAK,eAAe,gBAAAH,QAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,YAAI,KAAK,WAAY,CAC7D,GACA,gBAAAH,QAAA,cAACE,MAAA,MAEI,KAAK,SAAS,WAAW,KAAK,SAAS,KAAK,MAAM,SAAS,KACxD,gBAAAF,QAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,WAAQ,KAAK,MAAM,KAAK,IAAI,CAAE,GAEhD,KAAK,SAAS,YAAY,KAAK,SAC5B,gBAAAH,QAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,WAAQ,KAAK,KAAM,GAErC,KAAK,SAAS,YACX,gBAAAH,QAAA,cAACG,OAAA,EAAK,UAAQ,QACT,KAAK,cAAc,sBACnB,KAAK,iBAAiB,mBACtB,KAAK,aAAa,kBACvB,CAER,CACJ,GAGA,gBAAAH,QAAA,cAACE,MAAA,EAAI,eAAc,UAAS,aAAY,SAAQ,aAAY,QAAO,SAAS,KACxE,gBAAAF,QAAA,cAACE,MAAA,EAAI,gBAAe,mBAChB,gBAAAF,QAAA,cAACG,OAAA,EAAK,MAAI,QAAC,0BAAY,GACtB,KAAK,aAAa,SAAS,mBACxB,gBAAAH,QAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,KACT,iBAAiB,GAAE,KAAE,KAAK,IAAI,iBAAiB,iBAAiB,KAAK,aAAa,MAAM,GAAE,KAAE,KAAK,WAAU,MAAG,kBAAiB,GACrI,CAER,GAEC,gBACG,gBAAAH,QAAA,cAACE,MAAA,EAAI,gBAAe,YAChB,gBAAAF,QAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,0BAAQ,gBAAe,+CAAmB,CAC7D,GAGJ,gBAAAH,QAAA,cAACE,MAAA,EAAI,eAAc,UAAS,WAAW,KAClC,aAAa,IAAI,CAAC,MAAM,UAAU;AAC/B,UAAM,aAAa,iBAAiB,QAAQ;AAC5C,WACI,gBAAAF,QAAA,cAACE,MAAA,EAAI,KAAK,SACN,gBAAAF,QAAA,cAACG,OAAA,EAAK,UAAQ,QAAE,WAAW,SAAS,EAAE,SAAS,GAAG,GAAG,GAAE,SAAE,GACzD,gBAAAH,QAAA,cAACG,OAAA,MAAM,IAAK,CAChB;AAAA,EAER,CAAC,CACL,GAEC,gBACG,gBAAAH,QAAA,cAACE,MAAA,EAAI,gBAAe,UAAS,WAAW,KACpC,gBAAAF,QAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,0BACH,KAAK,YAAY,iBAAiB,aAAa,QAAO,sDAClE,CACJ,GAGH,KAAK,aAAa,WAAW,KAC1B,gBAAAH,QAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,8DAA6B,CAEpD,CACJ;AAER;;;AC9IA,SAAS,YAAYG,WAAU;AAC/B,OAAOC,WAAU;AACjB,OAAOC,aAAY;;;ACGZ,IAAM,cAAsC;AAAA,EAC/C,QAAQ;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA,IACV,cAAc;AAAA,MACV,OAAO;AAAA,MACP,WAAW;AAAA;AAAA,IACf;AAAA,IACA,gBAAgB;AAAA,MACZ,OAAO,CAAC,MAAM;AAAA;AAAA,MACd,WAAW,CAAC,KAAK;AAAA,IACrB;AAAA,IACA,mBAAmB;AAAA,MACf,cAAc;AAAA,MACd,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,IACtB;AAAA,EACJ;AAAA,EACA,UAAU;AAAA,IACN,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA,IACV,cAAc;AAAA,MACV,OAAO;AAAA,MACP,WAAW;AAAA,IACf;AAAA,IACA,gBAAgB;AAAA,MACZ,OAAO,CAAC,KAAK;AAAA,MACb,WAAW,CAAC,KAAK;AAAA,IACrB;AAAA,IACA,mBAAmB;AAAA,MACf,cAAc;AAAA,MACd,kBAAkB;AAAA;AAAA,MAClB,kBAAkB;AAAA,IACtB;AAAA,EACJ;AAAA,EACA,aAAa;AAAA,IACT,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA,IACV,cAAc;AAAA,MACV,OAAO;AAAA,MACP,WAAW;AAAA,IACf;AAAA,IACA,gBAAgB;AAAA,MACZ,OAAO,CAAC,KAAK;AAAA,MACb,WAAW,CAAC,KAAK;AAAA,IACrB;AAAA,IACA,mBAAmB;AAAA,MACf,cAAc;AAAA,MACd,kBAAkB;AAAA;AAAA,MAClB,kBAAkB;AAAA,IACtB;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACF,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA;AAAA,IACV,cAAc;AAAA,MACV,OAAO;AAAA,MACP,WAAW;AAAA,MACX,QAAQ;AAAA;AAAA,MACR,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAAS;AAAA,IACb;AAAA,IACA,gBAAgB;AAAA,MACZ,OAAO,CAAC,KAAK;AAAA,MACb,WAAW,CAAC,KAAK;AAAA,MACjB,QAAQ,CAAC,UAAU;AAAA;AAAA,MACnB,QAAQ,CAAC,KAAK;AAAA,MACd,SAAS,CAAC,KAAK;AAAA,MACf,SAAS,CAAC,KAAK;AAAA,IACnB;AAAA,IACA,mBAAmB;AAAA,MACf,cAAc;AAAA,MACd,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,IACtB;AAAA,EACJ;AACJ;AAYO,SAAS,aAAoB;AAChC,SAAO,OAAO,KAAK,WAAW;AAClC;;;ADxFO,IAAM,wBAAN,MAA4B;AAAA,EACvB;AAAA,EAER,YAAY,cAAsB,QAAQ,IAAI,GAAG;AAC7C,SAAK,cAAc;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAmC;AACrC,UAAM,OAAO,MAAM,KAAK,WAAW;AACnC,UAAM,cAA4B,CAAC;AAEnC,eAAW,OAAO,MAAM;AACpB,UAAI;AACA,cAAM,UAAU,MAAM,KAAK,QAAQ,GAAG;AACtC,YAAI,QAAQ,MAAM,SAAS,GAAG;AAC1B,sBAAY,KAAK,OAAO;AAAA,QAC5B;AAAA,MACJ,SAAS,OAAO;AAEZ,gBAAQ,MAAM,kBAAkB,GAAG,KAAK,KAAK;AAAA,MACjD;AAAA,IACJ;AAEA,UAAM,aAAa,YAAY,OAAO,CAAC,KAAK,QAAQ,MAAM,IAAI,MAAM,QAAQ,CAAC;AAE7E,WAAO;AAAA,MACH,aAAa,KAAK;AAAA,MAClB,MAAM;AAAA,MACN;AAAA,MACA,UAAU,oBAAI,KAAK;AAAA,IACvB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,KAA+B;AACzC,UAAM,SAAS,YAAY,GAAG;AAC9B,UAAM,QAAuB,CAAC;AAG9B,eAAW,CAAC,MAAM,YAAY,KAAK,OAAO,QAAQ,OAAO,YAAY,GAAG;AACpE,UAAI,CAAC,aAAc;AAEnB,YAAM,cAAc;AACpB,UAAI;AACA,cAAM,YAAY,MAAM,KAAK,SAAS,KAAK,WAAW;AACtD,cAAM,KAAK,GAAG,SAAS;AAAA,MAC3B,SAAS,OAAO;AAAA,MAEhB;AAAA,IACJ;AAEA,UAAM,QAAQ,KAAK,eAAe,KAAK;AAEvC,WAAO;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU,oBAAI,KAAK;AAAA,IACvB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,KAAU,MAA2C;AAChE,UAAM,SAAS,YAAY,GAAG;AAC9B,UAAM,eAAe,OAAO,aAAa,IAAI;AAC7C,QAAI,CAAC,aAAc,QAAO,CAAC;AAE3B,QAAI;AAGJ,QAAI,QAAQ,QAAQ;AAChB,YAAM,WAAWC,MAAK,KAAK,KAAK,aAAa,SAAS,YAAY;AAClE,YAAM,gBAAgBA,MAAK,KAAK,KAAK,aAAa,2BAA2B,YAAY;AAGzF,UAAI,MAAM,KAAK,WAAW,QAAQ,GAAG;AACjC,kBAAU;AAAA,MACd,WAAW,MAAM,KAAK,WAAW,aAAa,GAAG;AAC7C,kBAAU;AAAA,MACd,OAAO;AACH,eAAO,CAAC;AAAA,MACZ;AAAA,IACJ,OAAO;AACH,gBAAUA,MAAK,KAAK,KAAK,aAAa,OAAO,UAAU,YAAY;AAGnE,UAAI;AACA,cAAMC,IAAG,OAAO,OAAO;AAAA,MAC3B,QAAQ;AACJ,eAAO,CAAC;AAAA,MACZ;AAAA,IACJ;AAEA,UAAM,aAAa,OAAO,eAAe,IAAI,KAAK,CAAC;AACnD,UAAM,QAAuB,CAAC;AAG9B,QAAI,SAAS,UAAU;AACnB,YAAM,aAAa,MAAM,KAAK,WAAW,SAAS,GAAG;AACrD,YAAM,KAAK,GAAG,UAAU;AAAA,IAC5B,OAAO;AAEH,YAAM,QAAQ,MAAMA,IAAG,QAAQ,OAAO;AAEtC,iBAAW,QAAQ,OAAO;AACtB,cAAM,WAAWD,MAAK,KAAK,SAAS,IAAI;AACxC,cAAM,OAAO,MAAMC,IAAG,KAAK,QAAQ;AAEnC,YAAI,CAAC,KAAK,OAAO,EAAG;AAGpB,cAAM,mBAAmB,WAAW,KAAK,SAAO,KAAK,SAAS,GAAG,CAAC;AAClE,YAAI,CAAC,iBAAkB;AAEvB,YAAI;AACA,gBAAM,OAAO,MAAM,KAAK,iBAAiB,UAAU,KAAK,IAAI;AAC5D,gBAAM,KAAK,IAAI;AAAA,QACnB,SAAS,OAAO;AACZ,kBAAQ,MAAM,mBAAmB,QAAQ,KAAK,KAAK;AAAA,QACvD;AAAA,MACJ;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,WAAW,WAAmB,KAAkC;AAC1E,UAAM,QAAuB,CAAC;AAE9B,QAAI;AACA,YAAM,UAAU,MAAMA,IAAG,QAAQ,WAAW,EAAE,eAAe,KAAK,CAAC;AAEnE,iBAAW,SAAS,SAAS;AACzB,YAAI,CAAC,MAAM,YAAY,EAAG;AAE1B,cAAM,YAAYD,MAAK,KAAK,WAAW,MAAM,IAAI;AACjD,cAAM,gBAAgBA,MAAK,KAAK,WAAW,UAAU;AAGrD,YAAI;AACA,gBAAMC,IAAG,OAAO,aAAa;AAAA,QACjC,QAAQ;AACJ;AAAA,QACJ;AAGA,cAAM,OAAO,MAAM,KAAK,iBAAiB,eAAe,KAAK,QAAQ;AAGrE,aAAK,aAAa,MAAM,KAAK,WAAWD,MAAK,KAAK,WAAW,SAAS,CAAC;AACvE,aAAK,gBAAgB,MAAM,KAAK,WAAWA,MAAK,KAAK,WAAW,YAAY,CAAC;AAC7E,aAAK,YAAY,MAAM,KAAK,WAAWA,MAAK,KAAK,WAAW,QAAQ,CAAC;AAErE,cAAM,KAAK,IAAI;AAAA,MACnB;AAAA,IACJ,SAAS,OAAO;AACZ,cAAQ,MAAM,0BAA0B,KAAK;AAAA,IACjD;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,iBACV,UACA,KACA,MACoB;AACpB,UAAM,UAAU,MAAMC,IAAG,SAAS,UAAU,OAAO;AACnD,UAAM,OAAO,MAAMA,IAAG,KAAK,QAAQ;AAGnC,QAAI,cAAuC,CAAC;AAC5C,QAAI,cAAsB;AAC1B,QAAI;AACA,YAAM,SAASC,QAAO,OAAO;AAC7B,oBAAc,OAAO;AACrB,oBAAc,OAAO;AAAA,IACzB,SAAS,GAAG;AAER,cAAQ,KAAK,6CAAmC,QAAQ,gCAAgC;AAAA,IAC5F;AAGA,UAAM,SAAS,YAAY,GAAG;AAC9B,UAAM,cAAc,YAAY,OAAO,kBAAkB,gBAAgB;AAGzE,QAAI;AACJ,QAAI;AAEJ,QAAI,OAAO,kBAAkB,kBAAkB;AAC3C,YAAM,cAAc,YAAY,OAAO,kBAAkB,gBAAgB;AACzE,oBAAc,gBAAgB,QAAQ,gBAAgB,YAAY,gBAAgB;AAAA,IACtF;AAEA,UAAM,eAAe,YAAY,OAAO,kBAAkB,YAAY;AACtE,QAAI,OAAO,iBAAiB,UAAU;AAClC,cAAQ,CAAC,YAAY;AAAA,IACzB,WAAW,MAAM,QAAQ,YAAY,GAAG;AACpC,cAAQ;AAAA,IACZ;AAGA,UAAM,EAAE,cAAc,UAAU,IAAI,KAAK,eAAe,aAAa,EAAE;AAGvE,UAAM,eAAeF,MAAK,SAAS,KAAK,aAAa,QAAQ;AAC7D,UAAM,KAAK,GAAG,GAAG,IAAI,IAAI,IAAIA,MAAK,SAAS,UAAUA,MAAK,QAAQ,QAAQ,CAAC,CAAC;AAG5E,UAAM,OAAO,YAAY,QAAQA,MAAK,SAAS,UAAUA,MAAK,QAAQ,QAAQ,CAAC;AAE/E,WAAO;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO,YAAY;AAAA,MACnB,UAAU,KAAK;AAAA,MACf,YAAY,KAAK;AAAA,MACjB;AAAA,MACA;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,SAAiB,WAAmB,IAAmD;AAC1G,UAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,UAAM,eAAe,MAAM,MAAM,GAAG,QAAQ;AAC5C,UAAM,YAAY,MAAM;AAExB,WAAO,EAAE,cAAc,UAAU;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAA6B;AAC/B,UAAM,OAAc,CAAC;AAErB,eAAW,OAAO,WAAW,GAAG;AAC5B,YAAM,SAAS,YAAY,GAAG;AAG9B,UAAI,QAAQ,QAAQ;AAChB,cAAM,WAAWA,MAAK,KAAK,KAAK,aAAa,OAAO;AACpD,cAAM,gBAAgBA,MAAK,KAAK,KAAK,aAAa,yBAAyB;AAE3E,YAAI,MAAM,KAAK,WAAW,QAAQ,KAAK,MAAM,KAAK,WAAW,aAAa,GAAG;AACzE,eAAK,KAAK,GAAG;AAAA,QACjB;AAAA,MACJ,OAAO;AACH,cAAM,UAAUA,MAAK,KAAK,KAAK,aAAa,OAAO,QAAQ;AAC3D,YAAI,MAAM,KAAK,WAAW,OAAO,GAAG;AAChC,eAAK,KAAK,GAAG;AAAA,QACjB;AAAA,MACJ;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,WAAW,UAAoC;AACzD,QAAI;AACA,YAAMC,IAAG,OAAO,QAAQ;AACxB,aAAO;AAAA,IACX,QAAQ;AACJ,aAAO;AAAA,IACX;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,OAAoC;AACvD,UAAM,SAA+C,CAAC;AAEtD,eAAW,QAAQ,OAAO;AACtB,aAAO,KAAK,IAAI,KAAK,OAAO,KAAK,IAAI,KAAK,KAAK;AAAA,IACnD;AAEA,UAAM,YAAY,MAAM,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,UAAU,CAAC;AAEpE,UAAM,eAAe,MAAM,SAAS,IAC9B,MAAM;AAAA,MAAO,CAAC,QAAQ,SACpB,KAAK,aAAa,SAAS,KAAK,aAAa;AAAA,MAC7C,MAAM,CAAC,EAAG;AAAA,IACd,IACE;AAEN,WAAO;AAAA,MACH,YAAY,MAAM;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AAAA,EACJ;AACJ;;;AL9TO,IAAM,aAAwC,CAAC,EAAE,YAAY,aAAa,OAAO,MAAM;AAC1F,QAAM,EAAE,KAAK,IAAIE,QAAO;AACxB,QAAM,CAAC,QAAQ,SAAS,IAAIC,UAAwB,MAAM;AAC1D,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAqB,cAAc,IAAI;AAC7E,QAAM,CAAC,cAAc,eAAe,IAAIA,UAA6B,eAAe,IAAI;AACxF,QAAM,CAAC,cAAc,eAAe,IAAIA,UAA6B,IAAI;AAEzE,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAuB,CAAC,CAAC;AAC/D,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,IAAI;AAC3C,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,UAAS,CAAC;AAGtD,EAAAC,WAAU,MAAM;AACZ,UAAM,UAAU,IAAI,sBAAsB;AAC1C,YAAQ,QAAQ,EAAE,KAAK,YAAU;AAC7B,qBAAe,OAAO,IAAI;AAC1B,iBAAW,KAAK;AAGhB,UAAI,YAAY;AACZ,kBAAU,UAAU;AAAA,MACxB;AAAA,IACJ,CAAC,EAAE,MAAM,WAAS;AACd,cAAQ,MAAM,2BAA2B,KAAK;AAC9C,iBAAW,KAAK;AAAA,IACpB,CAAC;AAAA,EACL,GAAG,CAAC,UAAU,CAAC;AAGf,EAAAC,UAAS,CAACC,QAAO,QAAQ;AAErB,QAAIA,WAAU,KAAK;AACf,aAAO;AACP;AAAA,IACJ;AAGA,QAAI,WAAW,aAAa,IAAI,UAAU,IAAI,YAAY;AACtD,iBAAW;AACX;AAAA,IACJ;AAAA,EACJ,CAAC;AAED,QAAM,aAAa,MAAM;AACrB,QAAI,WAAW,UAAU;AACrB,gBAAU,MAAM;AAChB,sBAAgB,IAAI;AACpB,wBAAkB,CAAC;AAAA,IACvB,WAAW,WAAW,QAAQ;AAC1B,gBAAU,UAAU;AACpB,sBAAgB,IAAI;AAAA,IACxB,WAAW,WAAW,YAAY;AAC9B,gBAAU,MAAM;AAChB,qBAAe,IAAI;AAAA,IACvB,OAAO;AACH,aAAO;AAAA,IACX;AAAA,EACJ;AAEA,QAAM,kBAAkB,CAAC,QAAa;AAClC,mBAAe,GAAG;AAClB,cAAU,UAAU;AAAA,EACxB;AAEA,QAAM,mBAAmB,CAAC,SAAsB;AAC5C,oBAAgB,IAAI;AACpB,cAAU,MAAM;AAAA,EACpB;AAEA,QAAM,mBAAmB,CAAC,SAAsB;AAC5C,oBAAgB,IAAI;AACpB,cAAU,QAAQ;AAClB,sBAAkB,CAAC;AAAA,EACvB;AAGA,QAAM,oBAAoB,YAAY,KAAK,SAAO,IAAI,QAAQ,WAAW;AAGzE,QAAM,eAAe,mBAAmB,OAAO,OAAO,UAAQ,KAAK,SAAS,YAAY,KAAK,CAAC;AAG9F,QAAM,gBAAgB,MAAM;AACxB,QAAI,SAAS;AACT,aACI,gBAAAC,QAAA,cAACC,MAAA,EAAI,SAAS,KACV,gBAAAD,QAAA,cAACE,OAAA,MAAK,8BAAoB,CAC9B;AAAA,IAER;AAEA,YAAQ,QAAQ;AAAA,MACZ,KAAK;AACD,eAAO,gBAAAF,QAAA,cAAC,gBAAa,aAA0B,UAAU,iBAAiB;AAAA,MAC9E,KAAK;AACD,eAAO,oBACH,gBAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACG,YAAY;AAAA,YACZ,cAAc;AAAA,YACd,QAAQ;AAAA;AAAA,QACZ,IACA;AAAA,MACR,KAAK;AACD,eACI,gBAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACG,OAAO;AAAA,YACP,aAAa;AAAA,YACb,UAAU;AAAA,YACV,QAAQ;AAAA;AAAA,QACZ;AAAA,MAER,KAAK;AACD,eAAO,eACH,gBAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACG,MAAM;AAAA,YACN;AAAA,YACA,QAAQ;AAAA;AAAA,QACZ,IACA;AAAA,MACR;AACI,eAAO,gBAAAA,QAAA,cAAC,gBAAa,aAA0B,UAAU,iBAAiB;AAAA,IAClF;AAAA,EACJ;AAGA,QAAM,iBAAiB,MAAM;AACzB,YAAQ,QAAQ;AAAA,MACZ,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX;AACI,eAAO;AAAA,IACf;AAAA,EACJ;AAEA,SACI,gBAAAA,QAAA,cAACC,MAAA,EAAI,eAAc,UAAS,SAAS,KAEjC,gBAAAD,QAAA,cAACC,MAAA,EAAI,cAAc,KACf,gBAAAD,QAAA,cAACE,OAAA,EAAK,MAAI,MAAC,OAAM,UAAO,wBAAe,GACvC,gBAAAF,QAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,yCAAyB,CAC5C,GAGC,cAAc,GAGf,gBAAAF,QAAA,cAACC,MAAA,EAAI,WAAW,GAAG,aAAY,UAAS,aAAY,QAAO,UAAU,KACjE,gBAAAD,QAAA,cAACE,OAAA,EAAK,UAAQ,QAAE,eAAe,CAAE,CACrC,CACJ;AAER;;;ADnKO,SAAS,0BAAmC;AAC/C,QAAM,MAAM,IAAIC,SAAQ,SAAS,EAC5B,YAAY,2DAA2D,EACvE,OAAO,kBAAkB,iEAAiE,EAC1F,OAAO,iBAAiB,wEAAwE,EAChG,OAAO,WAAW,2CAA2C,EAC7D,OAAO,OAAO,YAAiE;AAE5E,QAAI;AACJ,QAAI,QAAQ,QAAQ;AAChB,YAAM,YAAY,CAAC,UAAU,YAAY,eAAe,MAAM;AAC9D,UAAI,CAAC,UAAU,SAAS,QAAQ,MAAM,GAAG;AACrC,gBAAQ,MAAM,uBAAkB,QAAQ,MAAM,EAAE;AAChD,gBAAQ,MAAM,kBAAkB,UAAU,KAAK,IAAI,CAAC,EAAE;AACtD,gBAAQ,KAAK,CAAC;AAAA,MAClB;AACA,mBAAa,QAAQ;AAAA,IACzB;AAGA,QAAI;AACJ,QAAI,QAAQ,MAAM;AACd,YAAM,aAAa,CAAC,SAAS,aAAa,UAAU,UAAU,WAAW,SAAS;AAClF,UAAI,CAAC,WAAW,SAAS,QAAQ,IAAI,GAAG;AACpC,gBAAQ,MAAM,gCAA2B,QAAQ,IAAI,EAAE;AACvD,gBAAQ,MAAM,mBAAmB,WAAW,KAAK,IAAI,CAAC,EAAE;AACxD,gBAAQ,KAAK,CAAC;AAAA,MAClB;AACA,oBAAc,QAAQ;AAAA,IAC1B;AAGA,QAAI,QAAQ,OAAO;AACf,YAAM,WAAW;AACjB;AAAA,IACJ;AAGA,UAAM,EAAE,cAAc,IAAIC;AAAA,MACtBC,QAAM,cAAc,YAAY;AAAA,QAC5B;AAAA,QACA;AAAA,QACA,QAAQ,MAAM;AACV,kBAAQ,KAAK,CAAC;AAAA,QAClB;AAAA,MACJ,CAAC;AAAA,IACL;AAEA,UAAM,cAAc;AAAA,EACxB,CAAC;AAEL,SAAO;AACX;AAKA,eAAe,aAA4B;AACvC,QAAM,UAAU,IAAI,sBAAsB;AAE1C,UAAQ,IAAI,iCAA0B;AAEtC,MAAI;AACA,UAAM,UAAU,MAAM,QAAQ,QAAQ;AAEtC,QAAI,QAAQ,KAAK,WAAW,GAAG;AAC3B,cAAQ,IAAI,gCAAsB;AAClC,cAAQ,IAAI,wDAAwD;AACpE;AAAA,IACJ;AAEA,YAAQ,IAAI,gCAAyB;AACrC,YAAQ,IAAI,sBAAe,QAAQ,WAAW,EAAE;AAChD,YAAQ,IAAI,wBAAiB,QAAQ,SAAS,eAAe,OAAO,CAAC;AAAA,CAAI;AAEzE,eAAW,cAAc,QAAQ,MAAM;AACnC,cAAQ,IAAI,GAAG,WAAW,OAAO,IAAI,IAAI,WAAW,OAAO,IAAI,EAAE;AACjE,cAAQ,IAAI,YAAY,WAAW,OAAO,QAAQ,EAAE;AACpD,cAAQ,IAAI,aAAa,WAAW,MAAM,UAAU,EAAE;AAEtD,YAAM,QAAkB,CAAC;AACzB,UAAI,WAAW,MAAM,OAAO,MAAO,OAAM,KAAK,GAAG,WAAW,MAAM,OAAO,KAAK,QAAQ;AACtF,UAAI,WAAW,MAAM,OAAO,UAAW,OAAM,KAAK,GAAG,WAAW,MAAM,OAAO,SAAS,YAAY;AAClG,UAAI,WAAW,MAAM,OAAO,OAAQ,OAAM,KAAK,GAAG,WAAW,MAAM,OAAO,MAAM,SAAS;AACzF,UAAI,WAAW,MAAM,OAAO,OAAQ,OAAM,KAAK,GAAG,WAAW,MAAM,OAAO,MAAM,SAAS;AACzF,UAAI,WAAW,MAAM,OAAO,QAAS,OAAM,KAAK,GAAG,WAAW,MAAM,OAAO,OAAO,UAAU;AAC5F,UAAI,WAAW,MAAM,OAAO,QAAS,OAAM,KAAK,GAAG,WAAW,MAAM,OAAO,OAAO,UAAU;AAE5F,UAAI,MAAM,SAAS,GAAG;AAClB,gBAAQ,IAAI,iBAAiB,MAAM,KAAK,IAAI,CAAC,EAAE;AAAA,MACnD;AAEA,cAAQ,IAAI,EAAE;AAAA,IAClB;AAEA,YAAQ,IAAI,iBAAY,QAAQ,UAAU;AAAA,CAAU;AAAA,EACxD,SAAS,OAAO;AACZ,YAAQ,MAAM,kCAA6B,KAAK;AAChD,YAAQ,KAAK,CAAC;AAAA,EAClB;AACJ;;;AQ3GA,SAAS,WAAAC,gBAAe;AACxB,SAAS,UAAU,WAAAC,UAAS,cAAc;AAC1C,OAAOC,SAAQ;AACf,OAAOC,WAAU;AACjB,SAAS,kBAAkB;;;ACHpB,IAAM,sBAAsB,CAAC,SAAkD;AAClF,QAAM,aAAa,KAAK,IAAI,CAAC,CAAC,KAAK,MAAM,MAAM,GAAG,GAAG,IAAI,MAAM,EAAE;AACjE,aAAW,KAAK,aAAa;AAC7B,SAAO,WAAW,KAAK,UAAK;AAChC;AAKO,IAAM,gBAAgB;AAAA,EACzB,OAAO;AAAA,IACH,aAAa;AAAA,EACjB;AACJ;AAKO,IAAM,cAAc;AAAA,EACvB,OAAO;AAAA,IACH,aAAa;AAAA,EACjB;AACJ;;;ADTA,IAAM,qBAAoD;AAAA,EACtD,WAAW;AAAA,IACP,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,MACN,4BAA4B;AAAA,MAC5B,8BAA8B;AAAA,MAC9B,+BAA+B;AAAA,MAC/B,kDAAkD;AAAA,IACtD;AAAA,EACJ;AAAA,EACA,iBAAiB;AAAA,IACb,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA;AAAA,MAEN,6DAA6D;AAAA,MAC7D,8CAA8C;AAAA,MAC9C,yCAAyC;AAAA,MACzC,8BAA8B;AAAA;AAAA,MAE9B,gDAAgD;AAAA;AAAA,MAEhD,iBAAiB;AAAA;AAAA,MAEjB,mBAAmB;AAAA;AAAA,MAEnB,gBAAgB;AAAA,MAChB,yBAAyB;AAAA,MACzB,wBAAwB;AAAA;AAAA,MAExB,8BAA8B;AAAA,IAClC;AAAA,EACJ;AAAA,EACA,KAAK;AAAA,IACD,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,MACN,eAAe;AAAA,MACf,+BAA+B;AAAA,MAC/B,2BAA2B;AAAA,MAC3B,YAAY;AAAA,MACZ,uBAAuB;AAAA,IAC3B;AAAA,EACJ;AAAA,EACA,aAAa;AAAA,IACT,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,MACN,wBAAwB;AAAA,QACpB,sBAAsB;AAAA,QACtB,cAAc;AAAA,QACd,gBAAgB;AAAA,QAChB,cAAc;AAAA,QACd,eAAe;AAAA,QACf,eAAe;AAAA,QACf,aAAa;AAAA,QACb,eAAe;AAAA,QACf,gBAAgB;AAAA,QAChB,kBAAkB;AAAA,MACtB;AAAA,MACA,iBAAiB;AAAA,QACb,WAAW;AAAA,QACX,gBAAgB;AAAA,QAChB,mBAAmB;AAAA;AAAA,MACvB;AAAA,IACJ;AAAA,EACJ;AAAA,EACA,QAAQ;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,MACN,kBAAkB;AAAA,QACd,mBAAmB;AAAA,QACnB,uBAAuB;AAAA,QACvB,oBAAoB;AAAA,QACpB,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,eAAe;AAAA,QACf,aAAa;AAAA,MACjB;AAAA,MACA,yBAAyB;AAAA,IAC7B;AAAA,EACJ;AAAA,EACA,YAAY;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,MACN,yBAAyB;AAAA,MACzB,+BAA+B;AAAA,MAC/B,eAAe;AAAA,MACf,oCAAoC;AAAA,IACxC;AAAA,EACJ;AAAA,EACA,iBAAiB;AAAA,IACb,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,MACN,0BAA0B;AAAA,MAC1B,2BAA2B;AAAA,MAC3B,kCAAkC;AAAA,MAClC,8BAA8B;AAAA,MAC9B,yBAAyB;AAAA,MACzB,0BAA0B;AAAA,MAC1B,iCAAiC;AAAA,MACjC,oCAAoC;AAAA,MACpC,2BAA2B;AAAA,QACvB,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,WAAW;AAAA,MACf;AAAA,MACA,gCAAgC;AAAA,MAChC,sBAAsB;AAAA,MACtB,wBAAwB;AAAA,IAC5B;AAAA,EACJ;AAAA,EACA,YAAY;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,MACN,iCAAiC;AAAA,MACjC,+BAA+B;AAAA,MAC/B,uBAAuB;AAAA,MACvB,4BAA4B;AAAA,MAC5B,6BAA6B;AAAA;AAAA,MAC7B,2BAA2B;AAAA,IAC/B;AAAA,EACJ;AACJ;AAMO,SAAS,wBAAiC;AAC7C,QAAM,eAAe,IAAIC,SAAQ,OAAO,EACnC,YAAY,0CAA0C;AAG3D,eAAa,OAAO,YAAY;AAC5B,UAAM,gBAAgB;AAAA,EAC1B,CAAC;AAGD,eACK,QAAQ,QAAQ,EAChB,YAAY,qCAAqC,EACjD,SAAS,eAAe,8DAA8D,EACtF,OAAO,OAAO,WAAqB;AAChC,QAAI,OAAO,WAAW,GAAG;AACrB,YAAM,oBAAoB,QAAQ;AAAA,IACtC,OAAO;AACH,YAAM,YAAY,QAAQ,QAAQ;AAAA,IACtC;AAAA,EACJ,CAAC;AAGL,eACK,QAAQ,SAAS,EACjB,YAAY,2DAA2D,EACvE,SAAS,eAAe,wBAAwB,EAChD,OAAO,OAAO,WAAqB;AAChC,QAAI,OAAO,WAAW,GAAG;AACrB,YAAM,oBAAoB,SAAS;AAAA,IACvC,OAAO;AACH,YAAM,YAAY,QAAQ,SAAS;AAAA,IACvC;AAAA,EACJ,CAAC;AAGL,eACK,QAAQ,iBAAiB,EACzB,YAAY,kDAAkD,EAC9D,OAAO,YAAY;AAChB,UAAM,YAAY,OAAO,KAAK,kBAAkB;AAChD,UAAM,YAAY,WAAW,QAAQ;AAAA,EACzC,CAAC;AAGL,eACK,QAAQ,OAAO,EACf,YAAY,sDAAsD,EAClE,SAAS,eAAe,0CAA0C,EAClE,OAAO,OAAO,WAAqB;AAChC,UAAM,cAAc,MAAM;AAAA,EAC9B,CAAC;AAGL,eACK,QAAQ,MAAM,EACd,YAAY,wCAAwC,EACpD,OAAO,MAAM;AACV,YAAQ,IAAI,6CAAsC;AAClD,WAAO,QAAQ,kBAAkB,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AACzD,cAAQ,IAAI,KAAK,IAAI,OAAO,EAAE,CAAC,MAAM,MAAM,IAAI,EAAE;AACjD,cAAQ,IAAI,KAAK,IAAI,OAAO,EAAE,CAAC,MAAM,MAAM,WAAW,EAAE;AACxD,cAAQ,IAAI;AAAA,IAChB,CAAC;AAAA,EACL,CAAC;AAEL,SAAO;AACX;AAEA,eAAe,kBAAkB;AAC7B,UAAQ,IAAI,mCAA4B;AACxC,UAAQ,IAAI,4UAAyD;AACrE,UAAQ,IAAI,0EAAyD;AACrE,UAAQ,IAAI,kFAAyD;AACrE,UAAQ,IAAI,wEAAyD;AACrE,UAAQ,IAAI,wEAAyD;AACrE,UAAQ,IAAI,wEAAyD;AACrE,UAAQ,IAAI,8UAA2D;AAEvE,QAAM,SAAS,MAAM,OAAO;AAAA,IACxB,SAAS;AAAA,IACT,SAAS;AAAA,MACL,EAAE,MAAM,qCAAgC,OAAO,SAAS;AAAA,MACxD,EAAE,MAAM,sCAAiC,OAAO,UAAU;AAAA,MAC1D,EAAE,MAAM,0CAAmC,OAAO,MAAM;AAAA,MACxD,EAAE,MAAM,+BAAwB,OAAO,QAAQ;AAAA,IACnD;AAAA,IACA,OAAO;AAAA,EACX,CAAC;AAED,MAAI,WAAW,OAAO;AAClB,UAAM,YAAY,OAAO,KAAK,kBAAkB;AAChD,UAAM,YAAY,WAAW,QAAQ;AAAA,EACzC,WAAW,WAAW,SAAS;AAC3B,UAAM,cAAc,CAAC,CAAC;AAAA,EAC1B,OAAO;AACH,UAAM,oBAAoB,MAA8B;AAAA,EAC5D;AACJ;AAEA,eAAe,oBAAoB,QAA8B;AAC7D,QAAM,UAAU,OAAO,QAAQ,kBAAkB,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO;AAAA,IACtE,MAAM,GAAG,MAAM,IAAI,MAAM,MAAM,WAAW;AAAA,IAC1C,OAAO;AAAA,EACX,EAAE;AAEF,MAAI;AACA,UAAM,iBAAiB,MAAM,SAAS;AAAA,MAClC,SAAS,oBAAoB,MAAM;AAAA,MACnC;AAAA,MACA,OAAO;AAAA,IACX,CAAC;AAED,QAAI,eAAe,WAAW,GAAG;AAC7B,cAAQ,IAAI,qCAA2B;AACvC,cAAQ,IAAI,iFAA0E;AACtF;AAAA,IACJ;AAEA,UAAM,YAAY,gBAAgB,MAAM;AAAA,EAC5C,QAAQ;AACJ,YAAQ,IAAI,+BAA0B;AAAA,EAC1C;AACJ;AAEA,eAAe,YAAY,WAAqB,QAA8B;AAC1E,QAAM,YAAYC,MAAK,KAAK,QAAQ,IAAI,GAAG,SAAS;AACpD,QAAM,eAAeA,MAAK,KAAK,WAAW,eAAe;AAGzD,QAAM,gBAAgB,UAAU,OAAO,SAAO,CAAC,mBAAmB,GAAG,CAAC;AACtE,MAAI,cAAc,SAAS,GAAG;AAC1B,YAAQ,IAAI;AAAA,yBAAuB,cAAc,KAAK,IAAI,CAAC,EAAE;AAC7D,YAAQ,IAAI,iEAA0D;AACtE;AAAA,EACJ;AAGA,MAAI,CAAC,WAAW,SAAS,GAAG;AACxB,UAAMC,IAAG,MAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAC7C,YAAQ,IAAI,sCAA+B;AAAA,EAC/C;AAGA,MAAI,kBAA2C,CAAC;AAChD,MAAI,WAAW,YAAY,GAAG;AAC1B,QAAI;AACA,YAAM,UAAU,MAAMA,IAAG,SAAS,cAAc,OAAO;AACvD,wBAAkB,KAAK,MAAM,OAAO;AACpC,cAAQ,IAAI,oDAA6C;AAAA,IAC7D,QAAQ;AACJ,cAAQ,KAAK,iEAAuD;AACpE,YAAM,mBAAmB,MAAMC,SAAQ;AAAA,QACnC,SAAS;AAAA,QACT,SAAS;AAAA,MACb,CAAC;AAED,UAAI,CAAC,kBAAkB;AACnB,gBAAQ,IAAI,6BAAwB;AACpC;AAAA,MACJ;AACA,wBAAkB,CAAC;AAAA,IACvB;AAAA,EACJ;AAGA,QAAM,cAAc,EAAE,GAAG,gBAAgB;AAEzC,UAAQ,IAAI;AAAA,YAAQ,WAAW,WAAW,aAAa,WAAW;AAAA,CAAY;AAE9E,aAAW,OAAO,WAAW;AACzB,UAAM,QAAQ,mBAAmB,GAAG;AACpC,YAAQ,IAAI,MAAM,WAAW,WAAW,WAAM,QAAG,IAAI,MAAM,IAAI,EAAE;AAEjE,QAAI,WAAW,UAAU;AAErB,iBAAW,CAAC,YAAY,YAAY,KAAK,OAAO,QAAQ,MAAM,QAAQ,GAAG;AACrE,YAAI,OAAO,iBAAiB,YAAY,iBAAiB,QAAQ,CAAC,MAAM,QAAQ,YAAY,KACxF,OAAO,YAAY,UAAU,MAAM,YAAY,YAAY,UAAU,MAAM,MAAM;AACjF,sBAAY,UAAU,IAAI;AAAA,YACtB,GAAI,YAAY,UAAU;AAAA,YAC1B,GAAG;AAAA,UACP;AAAA,QACJ,OAAO;AACH,sBAAY,UAAU,IAAI;AAAA,QAC9B;AAAA,MACJ;AAAA,IACJ,OAAO;AAEH,iBAAW,cAAc,OAAO,KAAK,MAAM,QAAQ,GAAG;AAClD,eAAO,YAAY,UAAU;AAAA,MACjC;AAAA,IACJ;AAAA,EACJ;AAGA,QAAMD,IAAG,UAAU,cAAc,KAAK,UAAU,aAAa,MAAM,CAAC,CAAC;AACrE,UAAQ,IAAI;AAAA,kCAAgC,YAAY,EAAE;AAC1D,UAAQ,IAAI,mDAA4C;AAC5D;AAEA,eAAe,cAAc,WAAqB;AAC9C,QAAM,YAAYD,MAAK,KAAK,QAAQ,IAAI,GAAG,SAAS;AACpD,QAAM,eAAeA,MAAK,KAAK,WAAW,eAAe;AAEzD,MAAI,CAAC,WAAW,YAAY,GAAG;AAC3B,YAAQ,IAAI,6CAAmC;AAC/C;AAAA,EACJ;AAEA,QAAM,eAAe,MAAME,SAAQ;AAAA,IAC/B,SAAS,UAAU,WAAW,IACxB,wDACA,iBAAiB,UAAU,KAAK,IAAI,CAAC;AAAA,IAC3C,SAAS;AAAA,EACb,CAAC;AAED,MAAI,CAAC,cAAc;AACf,YAAQ,IAAI,6BAAwB;AACpC;AAAA,EACJ;AAEA,MAAI,UAAU,WAAW,GAAG;AAExB,UAAMD,IAAG,OAAO,YAAY;AAC5B,YAAQ,IAAI,qCAAgC;AAAA,EAChD,OAAO;AAEH,UAAM,YAAY,WAAW,SAAS;AAAA,EAC1C;AAEA,UAAQ,IAAI,mDAA4C;AAC5D;;;AElYA,SAAS,WAAAE,gBAAe;AACxB,SAAS,YAAAC,WAAU,WAAAC,gBAAe;AAU3B,SAAS,uBAAgC;AAC5C,QAAM,MAAM,IAAIC,SAAQ,MAAM,EACzB,YAAY,6EAA6E,EACzF,OAAO,mBAAmB,mEAAmE,EAC7F,OAAO,qBAAqB,4CAA4C,EACxE,OAAO,aAAa,uCAAuC,EAC3D,OAAO,OAAO,YAIT;AACF,UAAM,QAAQ,OAAO;AAAA,EACzB,CAAC;AAEL,SAAO;AACX;AAEA,eAAe,QAAQ,SAIpB;AACC,QAAM,UAAU,IAAI,kBAAkB;AAEtC,UAAQ,IAAI,kDAA2C;AAGvD,UAAQ,IAAI,wCAAiC;AAC7C,UAAQ,IAAI,mDAA8C;AAC1D,UAAQ,IAAI,uCAAkC;AAC9C,UAAQ,IAAI,8BAAyB;AAErC,QAAM,UAAU,MAAM,QAAQ,gBAAgB;AAE9C,MAAI,QAAQ,eAAe,GAAG;AAC1B,YAAQ,IAAI,0CAAgC;AAC5C,YAAQ,IAAI,gEAAyD;AACrE,YAAQ,IAAI,iEAA0D;AACtE,YAAQ,KAAK,CAAC;AAAA,EAClB;AAEA,UAAQ,IAAI,iBAAY,QAAQ,MAAM,MAAM,WAAW,QAAQ,UAAU,MAAM;AAAA,CAAc;AAG7F,MAAI;AACJ,MAAI,QAAQ,OAAO,QAAQ,IAAI,SAAS,GAAG;AACvC,mBAAe,QAAQ;AAAA,EAC3B,OAAO;AACH,UAAM,aAAa,iBAAiB,EAAE,IAAI,SAAO;AAC7C,YAAM,SAAS,sBAAsB,GAAG;AACxC,aAAO;AAAA,QACH,MAAM,GAAG,OAAO,IAAI,IAAI,OAAO,IAAI;AAAA,QACnC,OAAO;AAAA,MACX;AAAA,IACJ,CAAC;AAED,mBAAe,MAAMC,UAAS;AAAA,MAC1B,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA,IACX,CAAC;AAED,QAAI,aAAa,WAAW,GAAG;AAC3B,cAAQ,IAAI,kCAAwB;AACpC,cAAQ,IAAI,uCAAgC;AAC5C,cAAQ,KAAK,CAAC;AAAA,IAClB;AAAA,EACJ;AAGA,MAAI;AACJ,MAAI,QAAQ,QAAQ,QAAQ,KAAK,SAAS,GAAG;AACzC,oBAAgB,QAAQ;AAAA,EAC5B,OAAO;AACH,UAAM,cAAc;AAAA,MAChB,EAAE,MAAM,UAAU,QAAQ,MAAM,MAAM,WAAW,OAAO,QAA8B;AAAA,MACtF,EAAE,MAAM,cAAc,QAAQ,UAAU,MAAM,WAAW,OAAO,YAAkC;AAAA,MAClG,EAAE,MAAM,aAAa,QAAQ,SAAS,MAAM,WAAW,OAAO,WAAiC;AAAA,IACnG;AAEA,oBAAgB,MAAMA,UAAS;AAAA,MAC3B,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA,IACX,CAAC;AAED,QAAI,cAAc,WAAW,GAAG;AAC5B,cAAQ,IAAI,2CAAiC;AAC7C,cAAQ,IAAI,gDAAyC;AACrD,cAAQ,KAAK,CAAC;AAAA,IAClB;AAAA,EACJ;AAGA,QAAM,aAAa,cAAc,OAAO,CAAC,KAAK,SAAS;AACnD,WAAO,OAAO,SAAS,UAAU,QAAQ,MAAM,SAC3C,SAAS,cAAc,QAAQ,UAAU,SACrC,QAAQ,SAAS;AAAA,EAC7B,GAAG,CAAC;AACJ,QAAM,aAAa,aAAa,aAAa;AAG7C,UAAQ,IAAI,wBAAiB;AAC7B,UAAQ,IAAI,YAAY,aAAa,IAAI,SAAO,sBAAsB,GAAG,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC,EAAE;AAC7F,UAAQ,IAAI,qBAAqB,cAAc,KAAK,IAAI,CAAC,EAAE;AAC3D,UAAQ,IAAI,0BAA0B,UAAU;AAAA,CAAe;AAE/D,MAAI,QAAQ,QAAQ;AAChB,YAAQ,IAAI,gDAAyC;AAAA,EACzD;AAGA,QAAM,YAAY,MAAMC,SAAQ;AAAA,IAC5B,SAAS;AAAA,IACT,SAAS;AAAA,EACb,CAAC;AAED,MAAI,CAAC,WAAW;AACZ,YAAQ,IAAI,4BAAuB;AACnC,YAAQ,KAAK,CAAC;AAAA,EAClB;AAGA,UAAQ,IAAI,0BAAmB;AAC/B,MAAI,YAAY;AAEhB,QAAM,UAAU,MAAM,QAAQ;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC,WAAW;AACR;AACA,YAAM,OAAO,OAAO,WAAW,YAAY,WACvC,OAAO,WAAW,YAAY,WAC1B,OAAO,WAAW,UAAU,WAAM;AAE1C,YAAM,aAAa,KAAK,MAAO,YAAY,aAAc,GAAG;AAC5D,cAAQ,IAAI,MAAM,IAAI,KAAK,UAAU,MAAM,OAAO,UAAU,EAAE;AAE9D,UAAI,OAAO,WAAW,WAAW,OAAO,OAAO;AAC3C,gBAAQ,IAAI,gBAAgB,OAAO,KAAK,EAAE;AAAA,MAC9C;AAAA,IACJ;AAAA,EACJ;AAGA,QAAM,UAAU,QAAQ,OAAO,OAAK,EAAE,WAAW,SAAS,EAAE;AAC5D,QAAM,UAAU,QAAQ,OAAO,OAAK,EAAE,WAAW,SAAS,EAAE;AAC5D,QAAM,UAAU,QAAQ,OAAO,OAAK,EAAE,WAAW,SAAS,EAAE;AAC5D,QAAM,SAAS,QAAQ,OAAO,OAAK,EAAE,WAAW,OAAO,EAAE;AAEzD,UAAQ,IAAI,2BAAsB;AAClC,UAAQ,IAAI,eAAe,OAAO,EAAE;AACpC,UAAQ,IAAI,eAAe,OAAO,EAAE;AACpC,MAAI,UAAU,EAAG,SAAQ,IAAI,eAAe,OAAO,EAAE;AACrD,MAAI,SAAS,EAAG,SAAQ,IAAI,cAAc,MAAM,EAAE;AAClD,UAAQ,IAAI,EAAE;AAClB;;;ACxKA,SAAS,WAAAC,iBAAe;;;ACGxB,SAAS,YAAYC,WAAU;AAC/B,SAAS,QAAAC,aAAY;;;ACWd,IAAM,cAAyC;AAAA,EAClD,QAAQ;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,WAAW;AAAA,IACX,eAAe;AAAA,IACf,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,EACvB;AAAA,EAEA,UAAU;AAAA,IACN,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,WAAW;AAAA,IACX,eAAe;AAAA,IACf,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,EACvB;AAAA,EAEA,aAAa;AAAA,IACT,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,WAAW;AAAA,IACX,eAAe;AAAA,IACf,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,EACvB;AAAA,EAEA,QAAQ;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,WAAW;AAAA,IACX,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,EACvB;AAAA,EAEA,UAAU;AAAA,IACN,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,WAAW;AAAA,IACX,eAAe;AAAA,IACf,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,EACvB;AAAA,EAEA,QAAQ;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,WAAW;AAAA,IACX,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,IACnB,cAAc,CAAC,UAAU;AAAA;AAAA,EAC7B;AAAA,EAEA,UAAU;AAAA,IACN,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,WAAW;AAAA;AAAA,IACX,eAAe;AAAA,IACf,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,IACnB,cAAc,CAAC,UAAU;AAAA;AAAA,EAC7B;AACJ;;;AD1EO,IAAM,sBAAN,MAA0B;AAAA,EACrB;AAAA,EAER,YAAY,cAAsB,QAAQ,IAAI,GAAG;AAC7C,SAAK,cAAc;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAA2C;AAC7C,UAAM,WAA0B,CAAC;AAEjC,eAAW,CAAC,OAAO,MAAM,KAAK,OAAO,QAAQ,WAAW,GAAG;AACvD,YAAM,YAAY,MAAM,KAAK,UAAU,OAAO,MAAM;AACpD,eAAS,KAAK,SAAS;AAAA,IAC3B;AAEA,WAAO,SAAS,OAAO,CAAC,MAAM,EAAE,QAAQ;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,OAAe,QAAyC;AACpE,UAAM,YAAyB;AAAA,MAC3B,IAAI;AAAA,MACJ,MAAM,OAAO;AAAA,MACb,UAAU;AAAA,MACV,UAAU;AAAA,MACV,cAAc;AAAA,MACd,WAAW;AAAA,MACX,eAAe;AAAA,MACf,YAAY;AAAA,IAChB;AAGA,QAAI,UAAU,YAAY;AACtB,YAAM,SAAS,MAAM,KAAK,WAAW,WAAW;AAChD,gBAAU,WAAW;AACrB,gBAAU,WAAW;AACrB,gBAAU,YAAY,SAAS,IAAI;AACnC,gBAAU,aAAa,SAAS,SAAS;AACzC,aAAO;AAAA,IACX;AAEA,QAAI,UAAU,UAAU;AACpB,YAAM,SAAS,MAAM,KAAK,WAAW,WAAW;AAChD,gBAAU,WAAW;AACrB,gBAAU,WAAW;AACrB,gBAAU,YAAY,SAAS,IAAI;AACnC,gBAAU,aAAa,SAAS,SAAS;AACzC,aAAO;AAAA,IACX;AAGA,QAAI,UAAU,YAAY;AACtB,YAAM,YAAY,MAAM,KAAK,WAAW,WAAW;AACnD,YAAM,cAAcC,MAAK,KAAK,aAAa,mBAAmB;AAC9D,YAAM,cAAc,MAAM,KAAK,WAAW,WAAW;AAErD,gBAAU,WAAW;AACrB,gBAAU,YAAY,YAAY,IAAI;AAEtC,UAAI,aAAa;AACb,kBAAU,eAAe;AACzB,kBAAU,gBAAgB,MAAM,KAAK,WAAW,aAAa,KAAK;AAAA,MACtE;AAEA,gBAAU,WAAW,aAAc,eAAe,UAAU,gBAAgB;AAC5E,gBAAU,aAAa,UAAU,WAAY,aAAa,cAAc,SAAS,WAAY;AAC7F,aAAO;AAAA,IACX;AAGA,UAAM,YAAYA,MAAK,KAAK,aAAa,OAAO,SAAS;AACzD,UAAM,aAAa,MAAM,KAAK,WAAW,SAAS;AAElD,QAAI,YAAY;AACZ,gBAAU,WAAW;AACrB,gBAAU,YAAY,MAAM,KAAK,WAAW,WAAW,OAAO,aAAa;AAE3E,UAAI,UAAU,YAAY,GAAG;AACzB,kBAAU,WAAW;AAAA,MACzB;AAAA,IACJ;AAGA,QAAI,OAAO,eAAe;AACtB,YAAM,gBAAgBA,MAAK,KAAK,aAAa,OAAO,aAAa;AACjE,YAAM,iBAAiB,MAAM,KAAK,WAAW,aAAa;AAE1D,UAAI,gBAAgB;AAChB,kBAAU,eAAe;AACzB,kBAAU,gBAAgB,MAAM,KAAK,WAAW,eAAe,OAAO,aAAa;AAEnF,YAAI,UAAU,gBAAgB,GAAG;AAC7B,oBAAU,WAAW;AAAA,QACzB;AAAA,MACJ;AAAA,IACJ;AAGA,QAAI,UAAU,YAAY,KAAK,UAAU,gBAAgB,GAAG;AACxD,gBAAU,aAAa;AAAA,IAC3B,WAAW,UAAU,YAAY,GAAG;AAChC,gBAAU,aAAa;AAAA,IAC3B;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAA6C;AAC/C,UAAM,SAAS,MAAM,KAAK,iBAAiB;AAE3C,QAAI,OAAO,WAAW,GAAG;AACrB,aAAO;AAAA,IACX;AAGA,WAAO,KAAK,CAAC,GAAG,MAAM;AAClB,YAAM,kBAAkB,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,EAAE;AACrD,YAAM,SAAS,gBAAgB,EAAE,UAAU,IAAI,KAAK,EAAE;AACtD,YAAM,SAAS,gBAAgB,EAAE,UAAU,IAAI,KAAK,EAAE;AACtD,aAAO,SAAS;AAAA,IACpB,CAAC;AAED,WAAO,OAAO,CAAC;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAqC;AACvC,UAAM,SAAS,MAAM,KAAK,iBAAiB;AAC3C,WAAO,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,OAAiC;AAC/C,UAAM,SAAS,YAAY,KAAK;AAChC,QAAI,CAAC,QAAQ;AACT,aAAO;AAAA,IACX;AAEA,UAAM,YAAY,MAAM,KAAK,UAAU,OAAO,MAAM;AACpD,WAAO,UAAU;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAwC;AAC1C,UAAM,WAAqB,CAAC;AAE5B,eAAW,CAAC,OAAO,MAAM,KAAK,OAAO,QAAQ,WAAW,GAAG;AACvD,UAAI,UAAU,YAAY;AACtB,YAAI,MAAM,KAAK,WAAW,WAAW,GAAG;AACpC,mBAAS,KAAK,KAAK;AAAA,QACvB;AAAA,MACJ,WAAW,UAAU,UAAU;AAC3B,YAAI,MAAM,KAAK,WAAW,WAAW,GAAG;AACpC,mBAAS,KAAK,KAAK;AAAA,QACvB;AAAA,MACJ,WAAW,UAAU,YAAY;AAE7B,cAAM,YAAY,MAAM,KAAK,WAAW,WAAW;AACnD,cAAM,cAAcA,MAAK,KAAK,aAAa,mBAAmB;AAC9D,cAAM,cAAc,MAAM,KAAK,WAAW,WAAW;AACrD,YAAI,aAAa,aAAa;AAC1B,mBAAS,KAAK,KAAK;AAAA,QACvB;AAAA,MACJ,OAAO;AACH,cAAM,YAAYA,MAAK,KAAK,aAAa,OAAO,SAAS;AACzD,YAAI,MAAM,KAAK,WAAW,SAAS,GAAG;AAClC,gBAAM,QAAQ,MAAM,KAAK,WAAW,WAAW,OAAO,aAAa;AACnE,cAAI,QAAQ,GAAG;AACX,qBAAS,KAAK,KAAK;AAAA,UACvB;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAKH;AACC,UAAM,MAAM,MAAM,QAAQ;AAAA,MACtB,OAAO,QAAQ,WAAW,EAAE,IAAI,CAAC,CAAC,OAAO,MAAM,MAAM,KAAK,UAAU,OAAO,MAAM,CAAC;AAAA,IACtF;AAEA,UAAM,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,QAAQ;AAC3C,UAAM,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE;AAC/D,UAAM,UAAU,MAAM,KAAK,cAAc;AAEzC,WAAO;AAAA,MACH,OAAO,IAAI;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,WAAWC,QAAgC;AACrD,QAAI;AACA,YAAMC,IAAG,OAAOD,MAAI;AACpB,aAAO;AAAA,IACX,QAAQ;AACJ,aAAO;AAAA,IACX;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,WAAW,SAAiB,WAAoC;AAC1E,QAAI;AACA,YAAM,UAAU,MAAMC,IAAG,QAAQ,SAAS,EAAE,eAAe,KAAK,CAAC;AACjE,aAAO,QAAQ,OAAO,CAAC,UAAU,MAAM,OAAO,KAAK,MAAM,KAAK,SAAS,SAAS,CAAC,EAAE;AAAA,IACvF,QAAQ;AACJ,aAAO;AAAA,IACX;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,OAAsC;AAC/C,WAAO,YAAY,KAAK;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAOJ;AACE,UAAM,cAKD,CAAC;AAGN,QAAI,MAAM,KAAK,WAAWF,MAAK,KAAK,aAAa,SAAS,CAAC,GAAG;AAC1D,kBAAY,KAAK;AAAA,QACb,OAAO;AAAA,QACP,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,UAAU;AAAA,MACd,CAAC;AAAA,IACL;AAGA,QAAI,MAAM,KAAK,WAAWA,MAAK,KAAK,aAAa,cAAc,CAAC,GAAG;AAC/D,kBAAY,KAAK;AAAA,QACb,OAAO;AAAA,QACP,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,UAAU;AAAA,MACd,CAAC;AAAA,IACL;AAGA,gBAAY,KAAK;AAAA,MACb,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,UAAU;AAAA,IACd,CAAC;AAGD,UAAM,kBAAkB,MAAM,KAAK,WAAWA,MAAK,KAAK,aAAa,SAAS,CAAC;AAC/E,QAAI,iBAAiB;AACjB,kBAAY,KAAK;AAAA,QACb,OAAO;AAAA,QACP,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,UAAU;AAAA,MACd,CAAC;AAAA,IACL;AAGA,UAAM,oBAAoB,MAAM,KAAK,WAAWA,MAAK,KAAK,aAAa,WAAW,CAAC;AACnF,QAAI,mBAAmB;AACnB,kBAAY,KAAK;AAAA,QACb,OAAO;AAAA,QACP,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,UAAU;AAAA,MACd,CAAC;AAAA,IACL;AAEA,WAAO;AAAA,EACX;AACJ;;;ADxUO,SAAS,yBAAkC;AAC9C,QAAM,MAAM,IAAIG,UAAQ,QAAQ,EAC3B,YAAY,mDAAmD,EAC/D,OAAO,UAAU,gBAAgB,EACjC,OAAO,iBAAiB,iDAAiD,EACzE,OAAO,OAAO,YAGT;AACF,UAAM,UAAU,OAAO;AAAA,EAC3B,CAAC;AAEL,SAAO;AACX;AAEA,eAAe,UAAU,SAAoD;AACzE,QAAM,UAAU,IAAI,oBAAoB;AAExC,MAAI,QAAQ,MAAM;AACd,UAAMC,WAAU,MAAM,QAAQ,WAAW;AACzC,YAAQ,IAAI,KAAK,UAAUA,UAAS,MAAM,CAAC,CAAC;AAC5C;AAAA,EACJ;AAEA,UAAQ,IAAI,oCAA6B;AAEzC,QAAM,UAAU,MAAM,QAAQ,WAAW;AAEzC,MAAI,QAAQ,OAAO,WAAW,GAAG;AAC7B,YAAQ,IAAI,yCAA+B;AAC3C,YAAQ,IAAI,iBAAU;AACtB,YAAQ,IAAI,yDAAoD;AAChE,YAAQ,IAAI,kEAA6D;AACzE,YAAQ,IAAI,wDAAmD;AAAA,EACnE,OAAO;AACH,YAAQ,IAAI,mBAAY,QAAQ,OAAO,MAAM;AAAA,CAAmB;AAGhE,QAAI,QAAQ,SAAS;AACjB,YAAM,aAAa,mBAAmB,QAAQ,QAAQ,UAAU;AAChE,cAAQ,IAAI,0BAAmB,QAAQ,QAAQ,IAAI,IAAI,UAAU;AAAA,CAAI;AAAA,IACzE;AAGA,eAAW,OAAO,QAAQ,QAAQ;AAC9B,YAAM,aAAa,mBAAmB,IAAI,UAAU;AACpD,YAAM,YAAY,QAAQ,SAAS,OAAO,IAAI;AAC9C,YAAM,SAAS,YAAY,cAAO;AAElC,cAAQ,IAAI,GAAG,MAAM,IAAI,IAAI,IAAI,IAAI,UAAU,EAAE;AAEjD,UAAI,IAAI,UAAU;AACd,gBAAQ,IAAI,eAAe,IAAI,SAAS,UAAU;AAAA,MACtD;AAEA,UAAI,IAAI,cAAc;AAClB,gBAAQ,IAAI,mBAAmB,IAAI,aAAa,UAAU;AAAA,MAC9D;AAEA,YAAM,SAAS,QAAQ,aAAa,IAAI,EAAE;AAC1C,UAAI,QAAQ;AACR,YAAI,IAAI,OAAO,YAAY;AACvB,kBAAQ,IAAI,0BAA0B;AAAA,QAC1C,WAAW,IAAI,OAAO,UAAU;AAC5B,kBAAQ,IAAI,0BAA0B;AAAA,QAC1C,WAAW,IAAI,OAAO,YAAY;AAC9B,kBAAQ,IAAI,+CAA+C;AAAA,QAC/D,OAAO;AACH,kBAAQ,IAAI,kBAAkB,OAAO,SAAS,GAAG;AAAA,QACrD;AAAA,MACJ;AACA,cAAQ,IAAI,EAAE;AAAA,IAClB;AAAA,EACJ;AAGA,MAAI,QAAQ,SAAS,SAAS,GAAG;AAC7B,YAAQ,IAAI;AAAA,CAAuC;AACnD,eAAW,SAAS,QAAQ,UAAU;AAClC,YAAM,SAAS,QAAQ,aAAa,KAAK;AACzC,UAAI,QAAQ;AACR,gBAAQ,IAAI,aAAQ,OAAO,IAAI,MAAM,OAAO,WAAW,EAAE;AAAA,MAC7D;AAAA,IACJ;AACA,YAAQ,IAAI,EAAE;AAAA,EAClB;AAGA,MAAI,QAAQ,aAAa;AACrB,UAAM,cAAc,MAAM,QAAQ,YAAY;AAE9C,QAAI,YAAY,SAAS,GAAG;AACxB,cAAQ,IAAI,8CAAuC;AAEnD,iBAAW,cAAc,aAAa;AAClC,cAAM,gBAAgB,WAAW,aAAa,SAAS,WAClC,WAAW,aAAa,WAAW,cAAO;AAE/D,gBAAQ,IAAI,GAAG,aAAa,IAAI,WAAW,IAAI,EAAE;AACjD,gBAAQ,IAAI,cAAc,WAAW,MAAM;AAAA,CAAI;AAAA,MACnD;AAAA,IACJ;AAAA,EACJ;AAGA,UAAQ,IAAI,uBAAgB;AAC5B,UAAQ,IAAI,yDAAoD;AAChE,UAAQ,IAAI,sDAAiD;AAC7D,UAAQ,IAAI,yDAAoD;AAChE,UAAQ,IAAI,uEAAkE;AAClF;AAKA,SAAS,mBAAmB,YAA+C;AACvE,UAAQ,YAAY;AAAA,IAChB,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AACD,aAAO;AAAA,IACX;AACI,aAAO;AAAA,EACf;AACJ;;;AZ9HA,SAAS,cAAoB;AACzB,UAAQ,IAAIC,OAAM,KAAK,KAAK,2BAAe,IAAIA,OAAM,IAAI,2CAAgC,CAAC;AAC1F,UAAQ,IAAI;AACZ,UAAQ,IAAIA,OAAM,KAAK,mBAAW,CAAC;AACnC,UAAQ,IAAI,KAAKA,OAAM,KAAK,SAAS,CAAC,gDAAkC;AACxE,UAAQ,IAAI,KAAKA,OAAM,KAAK,OAAO,CAAC,2DAAmD;AACvF,UAAQ,IAAI,KAAKA,OAAM,KAAK,MAAM,CAAC,0EAAiD;AACpF,UAAQ,IAAI,KAAKA,OAAM,KAAK,QAAQ,CAAC,kGAAmD;AACxF,UAAQ,IAAI;AACZ,UAAQ,IAAIA,OAAM,KAAK,4CAAmB,CAAC;AAC3C,UAAQ,IAAIA,OAAM,IAAI,0CAA0C,CAAC;AACjE,UAAQ,IAAI;AACZ,UAAQ,IAAIA,OAAM,KAAK,gBAAQ,CAAC;AAChC,UAAQ,IAAIA,OAAM,IAAI,qBAAqB,CAAC;AAC5C,UAAQ,IAAIA,OAAM,IAAI,+BAA+B,CAAC;AACtD,UAAQ,IAAIA,OAAM,IAAI,mBAAmB,CAAC;AAC1C,UAAQ,IAAIA,OAAM,IAAI,sBAAsB,CAAC;AAC7C,UAAQ,IAAI;AACZ,UAAQ,IAAIA,OAAM,IAAI,wEAA+C,CAAC;AAC1E;AAKO,SAAS,mBAA4B;AACxC,QAAM,aAAa,IAAIC,UAAQ,KAAK,EAC/B,YAAY,4CAA4C,EACxD,OAAO,MAAM;AACV,gBAAY;AAAA,EAChB,CAAC;AAGL,aAAW,WAAW,wBAAwB,CAAC;AAC/C,aAAW,WAAW,sBAAsB,CAAC;AAC7C,aAAW,WAAW,qBAAqB,CAAC;AAC5C,aAAW,WAAW,uBAAuB,CAAC;AAE9C,SAAO;AACX;;;Ae3CA,OAAOC,aAAW;AAClB,SAAS,UAAAC,eAAc;AACvB,SAAS,WAAAC,iBAAe;;;ACHxB,OAAOC,WAAS,YAAAC,YAAU,aAAAC,YAAW,eAAAC,oBAAmB;AACxD,SAAS,OAAAC,OAAK,QAAAC,QAAM,YAAAC,WAAU,UAAAC,eAAc;;;ACD5C,OAAOC,aAAW;AAClB,SAAS,OAAAC,OAAW,iBAAiB;;;ACD9B,IAAMC,UAAS;AAAA;AAAA,EAEpB,SAAS;AAAA,EACT,WAAW;AAAA,EACX,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AAAA,EACP,OAAO;AAAA;AAAA,EAGP,MAAM;AAAA,IACJ,SAAS;AAAA,IACT,WAAW;AAAA,IACX,SAAS;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA;AAAA,EAGA,SAAS;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,SAAS;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EAEA,SAAS;AAAA,IACP,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,YAAY;AAAA,EACd;AAAA,EAEA,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AAAA,EAEA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,KAAK;AAAA,EACP;AAAA,EAEA,QAAQ;AAAA,IACN,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,UAAU;AAAA,EACZ;AACF;AAEO,IAAM,UAAU;AAAA,EACrB,QAAQ,EAAE,OAAO,UAAmB,OAAOA,QAAO,QAAQ;AAAA,EAC1D,SAAS,EAAE,OAAO,UAAmB,OAAOA,QAAO,QAAQ,OAAO;AAAA,EAClE,SAAS,EAAE,OAAO,SAAkB,OAAOA,QAAO,QAAQ,OAAO;AAAA,EACjE,KAAK,EAAE,OAAO,SAAkB,OAAOA,QAAO,QAAQ;AAAA,EACtD,SAAS,EAAE,OAAO,SAAkB,OAAOA,QAAO,QAAQ;AAAA,EAC1D,OAAO,EAAE,OAAO,SAAkB,OAAOA,QAAO,MAAM;AAAA,EACtD,MAAM,EAAE,OAAO,UAAmB,OAAOA,QAAO,MAAM;AAAA,EACtD,QAAQ,EAAE,OAAO,SAAkB,OAAOA,QAAO,OAAO,OAAO;AACjE;AAEO,IAAM,QAAQ;AAAA;AAAA,EAEnB,MAAM;AAAA,IACJ,OAAO;AAAA,IACP,OAAO;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,IACT,QAAQ;AAAA,EACV;AAAA;AAAA,EAGA,IAAI;AAAA,IACF,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,KAAK;AAAA,IACL,SAAS;AAAA,IACT,MAAM;AAAA,IACN,UAAU;AAAA,IACV,YAAY;AAAA,EACd;AACF;AAEO,IAAM,SAAS;AAAA;AAAA,EAEpB,UAAU;AAAA;AAAA,EAGV,cAAc;AAAA;AAAA,EAGd,SAAS;AAAA,IACP,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAQ;AAAA,EACV;AAAA;AAAA,EAGA,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,wBAAwB;AAC1B;;;AC7GA,OAAOC,aAAW;AAClB,SAAS,OAAAC,MAAK,QAAAC,cAAY;AAOnB,IAAM,SAAgC,CAAC,EAAE,aAAa,KAAK,MAAM;AACtE,SACE,gBAAAC,QAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,aAAa,QAAQ,OAAO;AAAA,MAC5B,aAAa,QAAQ,OAAO;AAAA,MAC5B,UAAU;AAAA,MACV,gBAAe;AAAA;AAAA,IAEf,gBAAAD,QAAA,cAACC,MAAA,MACC,gBAAAD,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAOC,QAAO,OAAO,SAAO,sBAEvC,GACA,gBAAAH,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAC,yDAAqC,CACtD;AAAA,IAEA,gBAAAF,QAAA,cAACC,MAAA,MACE,cACC,gBAAAD,QAAA,cAACE,QAAA,EAAK,UAAQ,QACZ,gBAAAF,QAAA,cAACE,QAAA,EAAK,OAAOC,QAAO,OAAO,OAAK,KAAG,GAAO,WAAQ,GACpD,GAEF,gBAAAH,QAAA,cAACE,QAAA,EAAK,UAAQ,QACZ,gBAAAF,QAAA,cAACE,QAAA,EAAK,OAAOC,QAAO,OAAO,OAAK,KAAG,GAAO,OAC5C,CACF;AAAA,EACF;AAEJ;;;AClCA,OAAOC,aAAW;AAClB,SAAS,OAAAC,OAAK,QAAAC,cAAY;AASnB,IAAM,SAAgC,CAAC,EAAE,WAAW,eAAe,MAAM,MAAM;AACpF,QAAM,eAAe,MAAM;AACzB,QAAI,cAAc;AAChB,aAAO;AAAA,QACL,EAAE,KAAK,gBAAM,QAAQ,WAAW;AAAA,QAChC,EAAE,KAAK,SAAS,QAAQ,SAAS;AAAA,QACjC,EAAE,KAAK,OAAO,QAAQ,QAAQ;AAAA,MAChC;AAAA,IACF;AAEA,QAAI,cAAc,WAAW;AAC3B,aAAO;AAAA,QACL,EAAE,KAAK,mBAAS,QAAQ,WAAW;AAAA,QACnC,EAAE,KAAK,SAAS,QAAQ,SAAS;AAAA,QACjC,EAAE,KAAK,cAAS,QAAQ,UAAU;AAAA,QAClC,EAAE,KAAK,KAAK,QAAQ,SAAS;AAAA,QAC7B,EAAE,KAAK,UAAU,QAAQ,OAAO;AAAA,MAClC;AAAA,IACF;AAGA,WAAO;AAAA,MACL,EAAE,KAAK,mBAAS,QAAQ,SAAS;AAAA,MACjC,EAAE,KAAK,OAAO,QAAQ,aAAa;AAAA,MACnC,EAAE,KAAK,cAAS,QAAQ,UAAU;AAAA,MAClC,EAAE,KAAK,OAAO,QAAQ,OAAO;AAAA,MAC7B,EAAE,KAAK,KAAK,QAAQ,SAAS;AAAA,IAC/B;AAAA,EACF;AAEA,QAAM,YAAY,aAAa;AAE/B,SACE,gBAAAC,QAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,aAAY;AAAA,MACZ,aAAaC,QAAO;AAAA,MACpB,UAAU;AAAA,MACV,gBAAe;AAAA;AAAA,IAEf,gBAAAF,QAAA,cAACC,OAAA,MACE,UAAU,IAAI,CAAC,UAAU,UACxB,gBAAAD,QAAA,cAACA,QAAM,UAAN,EAAe,KAAK,SAAS,OAC3B,QAAQ,KAAK,gBAAAA,QAAA,cAACG,QAAA,EAAK,UAAQ,QAAC,QAAG,GAChC,gBAAAH,QAAA,cAACG,QAAA,EAAK,OAAOD,QAAO,OAAO,OAAK,KAAE,SAAS,KAAI,GAAC,GAChD,gBAAAF,QAAA,cAACG,QAAA,EAAK,UAAQ,QAAC,KAAE,SAAS,MAAO,CACnC,CACD,CACH;AAAA,EACF;AAEJ;;;AH7CO,IAAM,SAAgC,CAAC;AAAA,EAC5C;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,EAAE,OAAO,IAAI,UAAU;AAC7B,QAAM,gBAAgB,QAAQ,WAAW;AACzC,QAAM,iBAAiB,QAAQ,QAAQ;AAGvC,QAAM,eAAe,KAAK,IAAI,OAAO,cAAc,KAAK,MAAM,gBAAgB,GAAG,CAAC;AAClF,QAAM,eAAe,gBAAgB,eAAe;AAGpD,QAAM,aAAa,KAAK,IAAI,IAAI,iBAAiB,CAAC;AAElD,SACE,gBAAAC,QAAA,cAACC,OAAA,EAAI,eAAc,UAAS,OAAO,iBAEjC,gBAAAD,QAAA,cAAC,UAAO,YAAY,CAAC,cAAc,GAGnC,gBAAAA,QAAA,cAACC,OAAA,EAAI,QAAQ,cAEX,gBAAAD,QAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,eAAc;AAAA,MACd,OAAO;AAAA,MACP,aAAY;AAAA,MACZ,aAAa,cAAc,YAAYC,QAAO,YAAYA,QAAO;AAAA,MACjE,UAAU;AAAA;AAAA,IAET;AAAA,EACH,GAGA,gBAAAF,QAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,eAAc;AAAA,MACd,UAAU;AAAA,MACV,aAAY;AAAA,MACZ,aAAa,cAAc,YAAYC,QAAO,YAAYA,QAAO;AAAA,MACjE,UAAU;AAAA,MACV,YAAY;AAAA;AAAA,IAEX;AAAA,EACH,CACF,GAGA,gBAAAF,QAAA,cAAC,UAAO,WAAsB,cAA4B,GAGzD,gBAAgB,iBACf,gBAAAA,QAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,UAAS;AAAA,MACT,WAAW;AAAA,MACX,YAAY,KAAK,OAAO,gBAAgB,MAAM,CAAC;AAAA,MAC/C,OAAO;AAAA,MACP,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAaC,QAAO,OAAO;AAAA,MAC3B,SAAS;AAAA;AAAA,IAER;AAAA,EACH,CAEJ;AAEJ;;;AIrFA,OAAOC,aAAW;AAClB,SAAS,OAAAC,aAAW;;;ACDpB,OAAOC,aAAW;AAClB,SAAS,OAAAC,OAAK,QAAAC,cAAY;AAW1B,IAAM,aAAyB;AAAA,EAC7B,EAAE,IAAI,SAAS,MAAM,MAAM,KAAK,OAAO,OAAO,uBAAa;AAAA,EAC3D,EAAE,IAAI,SAAS,MAAM,MAAM,KAAK,OAAO,OAAO,YAAY;AAAA,EAC1D,EAAE,IAAI,aAAa,MAAM,MAAM,KAAK,WAAW,OAAO,YAAY;AAAA,EAClE,EAAE,IAAI,WAAW,MAAM,MAAM,KAAK,SAAS,OAAO,UAAU;AAAA,EAC5D,EAAE,IAAI,UAAU,MAAM,MAAM,KAAK,QAAQ,OAAO,SAAS;AAC3D;AASO,IAAM,WAAoC,CAAC;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,SACE,gBAAAC,QAAA,cAACC,OAAA,EAAI,eAAc,YAEjB,gBAAAD,QAAA,cAACC,OAAA,EAAI,cAAc,KACjB,gBAAAD,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAOC,QAAO,QAAQ,WAAS,gBAE1C,CACF,GAGC,WAAW,IAAI,CAAC,MAAM,UAAU;AAC/B,UAAM,aAAa,aAAa,UAAU;AAC1C,UAAM,WAAW,KAAK,OAAO;AAE7B,WACE,gBAAAH,QAAA,cAACC,OAAA,EAAI,KAAK,KAAK,MAEb,gBAAAD,QAAA,cAACE,QAAA,EAAK,OAAO,aAAaC,QAAO,QAAQ,WAAW,UACjD,aAAa,MAAM,GAAG,WAAW,MAAM,GAAG,UAC7C,GAGA,gBAAAH,QAAA;AAAA,MAACE;AAAA,MAAA;AAAA,QACC,OACE,WACIC,QAAO,QAAQ,SACf,aACEA,QAAO,QAAQ,WACf;AAAA,QAER,MAAM;AAAA;AAAA,MAEL;AAAA,MACA,KAAK;AAAA,MAAK;AAAA,MAAE,KAAK;AAAA,IACpB,GAGC,KAAK,SACJ,gBAAAH,QAAA,cAACE,QAAA,EAAK,OAAM,UAAS,UAAQ,QAC1B,KAAI,KACH,KAAK,OAAM,GACf,GAID,YACC,gBAAAF,QAAA,cAACE,QAAA,EAAK,OAAOC,QAAO,QAAQ,UAAQ,SAAE,CAE1C;AAAA,EAEJ,CAAC,CACH;AAEJ;;;ACtFA,OAAOC,aAAW;AAClB,SAAS,OAAAC,OAAK,QAAAC,cAAY;AAYnB,IAAM,kBAAkD,CAAC;AAAA,EAC9D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AAEJ,QAAM,WAAW,IAAI,OAAO,CAAC,UAAU,MAAM,UAAU,CAAC;AAExD,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO;AAAA,EACT;AAGA,QAAM,aAAa,OAAO;AAC1B,QAAM,aAAa,KAAK;AAAA,IACtB;AAAA,IACA,KAAK,IAAI,gBAAgB,KAAK,MAAM,aAAa,CAAC,GAAG,SAAS,SAAS,UAAU;AAAA,EACnF;AACA,QAAM,kBAAkB,SAAS,MAAM,YAAY,aAAa,UAAU;AAE1E,SACE,gBAAAC,QAAA,cAACC,OAAA,EAAI,eAAc,UAAS,WAAW,KAErC,gBAAAD,QAAA,cAACC,OAAA,EAAI,cAAc,KACjB,gBAAAD,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAE,SAAI,OAAO,EAAE,CAAE,CACjC,GAGA,gBAAAF,QAAA,cAACC,OAAA,EAAI,cAAc,KACjB,gBAAAD,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAOC,QAAO,QAAQ,WAAS,cACpC,cAAc,UACpB,CACF,GAGC,aAAa,KACZ,gBAAAH,QAAA,cAACC,OAAA,EAAI,gBAAe,YAClB,gBAAAD,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAE,MAAM,GAAG,QAAS,CACpC,GAID,gBAAgB,IAAI,CAAC,OAAO,iBAAiB;AAC5C,UAAM,cAAc,aAAa;AACjC,UAAM,aAAa,aAAa,gBAAgB;AAChD,UAAM,WAAW,MAAM,OAAO;AAG9B,UAAM,SAAS,KAAK,OAAO,MAAM,QAAQ,CAAC;AAG1C,UAAM,YAAY;AAClB,UAAM,cACJ,MAAM,KAAK,SAAS,YAChB,MAAM,KAAK,UAAU,GAAG,YAAY,CAAC,IAAI,WACzC,MAAM;AAEZ,WACE,gBAAAF,QAAA,cAACC,OAAA,EAAI,KAAK,MAAM,MACd,gBAAAD,QAAA,cAACE,QAAA,EAAK,OAAO,aAAaC,QAAO,QAAQ,WAAW,UACjD,aAAa,MAAM,GAAG,WAAW,MAAM,GAAG,UAC7C,GACA,gBAAAH,QAAA;AAAA,MAACE;AAAA,MAAA;AAAA,QACC,OACE,WACIC,QAAO,QAAQ,SACf,aACEA,QAAO,QAAQ,WACfA,QAAO;AAAA;AAAA,MAGd;AAAA,MACA,MAAM,GAAG;AAAA,MAAO;AAAA,MAAE;AAAA,IACrB,GACC,YAAY,gBAAAH,QAAA,cAACE,QAAA,EAAK,OAAOC,QAAO,QAAQ,UAAQ,SAAE,CACrD;AAAA,EAEJ,CAAC,GAGA,aAAa,aAAa,SAAS,UAClC,gBAAAH,QAAA,cAACC,OAAA,EAAI,gBAAe,YAClB,gBAAAD,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAE,MAAM,GAAG,UAAW,CACtC,CAEJ;AAEJ;;;AFjFO,IAAM,UAAkC,CAAC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,SACE,gBAAAE,QAAA,cAACC,OAAA,EAAI,eAAc,UAAS,QAAO,UAEjC,gBAAAD,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,eAAe;AAAA,MACf;AAAA,MACA,UAAU;AAAA,MACV,WAAW,aAAa,SAAS;AAAA;AAAA,EACnC,GAGC,gBAAgB,IAAI,SAAS,KAC5B,gBAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,eAAe;AAAA,MACf;AAAA,MACA,WAAW,aAAa,SAAS;AAAA;AAAA,EACnC,CAEJ;AAEJ;;;AGrDA,OAAOE,aAAW;AAClB,SAAS,OAAAC,OAAK,QAAAC,cAAY;;;ACD1B,OAAOC,aAAW;AAClB,SAAS,OAAAC,OAAK,QAAAC,cAAY;AAOnB,IAAM,aAAwC,CAAC,EAAE,MAAM,MAAM;AAClE,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AAEA,SACE,gBAAAC,QAAA,cAACC,OAAA,EAAI,cAAc,KACjB,gBAAAD,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAC,eAAG,GACjB,MAAM,IAAI,CAAC,MAAM,UAChB,gBAAAF,QAAA,cAACA,QAAM,UAAN,EAAe,KAAK,SAClB,QAAQ,KACP,gBAAAA,QAAA,cAACE,QAAA,EAAK,OAAOC,QAAO,SAAO,KAAE,KAAI,GAAC,GAEpC,gBAAAH,QAAA;AAAA,IAACE;AAAA,IAAA;AAAA,MACC,OAAO,UAAU,MAAM,SAAS,IAAIC,QAAO,YAAYA,QAAO;AAAA,MAC9D,MAAM,UAAU,MAAM,SAAS;AAAA;AAAA,IAE9B;AAAA,EACH,CACF,CACD,CACH;AAEJ;;;AC/BA,OAAOC,aAAW;AAClB,SAAS,OAAAC,OAAK,QAAAC,cAAY;AAa1B,IAAM,kBAAyD,CAAC,EAAE,QAAQ,MAAM;AAC9E,UAAQ,QAAQ,MAAM;AAAA,IACpB,KAAK;AACH,UAAI,QAAQ,UAAU,GAAG;AACvB,eACE,gBAAAC,QAAA;AAAA,UAACC;AAAA,UAAA;AAAA,YACC,eAAc;AAAA,YACd,cAAc;AAAA,YACd,aAAa,QAAQ,OAAO;AAAA,YAC5B,aAAa,QAAQ,OAAO;AAAA,YAC5B,UAAU;AAAA;AAAA,UAEV,gBAAAD,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAOC,QAAO,QAAQ,WAC9B,QAAQ,OACX;AAAA,QACF;AAAA,MAEJ,WAAW,QAAQ,UAAU,GAAG;AAC9B,eACE,gBAAAH,QAAA,cAACC,OAAA,EAAI,WAAW,GAAG,cAAc,KAC/B,gBAAAD,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAOC,QAAO,QAAQ,cAAY,OACvC,QAAQ,OACd,CACF;AAAA,MAEJ,OAAO;AACL,eACE,gBAAAH,QAAA,cAACC,OAAA,EAAI,WAAW,KACd,gBAAAD,QAAA,cAACE,QAAA,EAAK,MAAI,QAAC,QAAK,QAAQ,OAAQ,CAClC;AAAA,MAEJ;AAAA,IAEF,KAAK;AACH,aACE,gBAAAF,QAAA,cAACC,OAAA,EAAI,cAAc,GAAG,eAAc,YACjC,QAAQ,QAAQ,MAAM,IAAI,EAAE,IAAI,CAAC,MAAM,MACtC,gBAAAD,QAAA,cAACE,QAAA,EAAK,KAAK,KAAI,IAAK,CACrB,CACH;AAAA,IAGJ,KAAK;AACH,aACE,gBAAAF,QAAA;AAAA,QAACC;AAAA,QAAA;AAAA,UACC,eAAc;AAAA,UACd,SAAS;AAAA,UACT,aAAa,QAAQ,KAAK;AAAA,UAC1B,aAAa,QAAQ,KAAK;AAAA,UAC1B,UAAU;AAAA;AAAA,QAET,QAAQ,YACP,gBAAAD,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAC,KAAE,QAAQ,UAAS,GAAC;AAAA,QAEpC,QAAQ,QAAQ,MAAM,IAAI,EAAE,IAAI,CAAC,MAAM,MACtC,gBAAAF,QAAA,cAACE,QAAA,EAAK,KAAK,GAAG,OAAOC,QAAO,QAAQ,QACjC,IACH,CACD;AAAA,MACH;AAAA,IAGJ,KAAK;AACH,aACE,gBAAAH,QAAA;AAAA,QAACC;AAAA,QAAA;AAAA,UACC,SAAS;AAAA,UACT,aAAa,QAAQ,IAAI;AAAA,UACzB,aAAa,QAAQ,IAAI;AAAA,UACzB,UAAU;AAAA;AAAA,QAEV,gBAAAD,QAAA,cAACE,QAAA,EAAK,OAAOC,QAAO,WACjB,MAAM,GAAG,KAAI,KAAC,gBAAAH,QAAA,cAACE,QAAA,EAAK,MAAI,QAAC,MAAI,GAAO,KAAE,QAAQ,OACjD;AAAA,MACF;AAAA,IAGJ,KAAK;AACH,aACE,gBAAAF,QAAA;AAAA,QAACC;AAAA,QAAA;AAAA,UACC,SAAS;AAAA,UACT,aAAa,QAAQ,QAAQ;AAAA,UAC7B,aAAa,QAAQ,QAAQ;AAAA,UAC7B,UAAU;AAAA;AAAA,QAEV,gBAAAD,QAAA,cAACE,QAAA,EAAK,OAAOC,QAAO,WACjB,MAAM,GAAG,SAAQ,KAAC,gBAAAH,QAAA,cAACE,QAAA,EAAK,MAAI,QAAC,UAAQ,GAAO,KAAE,QAAQ,OACzD;AAAA,MACF;AAAA,IAGJ,KAAK;AACH,aACE,gBAAAF,QAAA,cAACC,OAAA,EAAI,SAAS,GAAG,aAAa,KAC5B,gBAAAD,QAAA,cAACE,QAAA,EAAK,OAAOC,QAAO,SAAO,SAAE,GAC7B,gBAAAH,QAAA,cAACE,QAAA,EAAK,QAAM,MAAC,OAAOC,QAAO,QAAQ,cAChC,QAAQ,OACX,CACF;AAAA,IAGJ,KAAK;AACH,aACE,gBAAAH,QAAA,cAACC,OAAA,EAAI,eAAc,UAAS,SAAS,MACjC,QAAQ,SAAS,CAAC,GAAG,IAAI,CAAC,MAAM,MAChC,gBAAAD,QAAA,cAACC,OAAA,EAAI,KAAK,KACR,gBAAAD,QAAA,cAACE,QAAA,MAAK,MAAG,MAAM,GAAG,QAAO,KAAE,IAAK,CAClC,CACD,CACH;AAAA,IAGJ;AACE,aACE,gBAAAF,QAAA,cAACC,OAAA,EAAI,cAAc,KACjB,gBAAAD,QAAA,cAACE,QAAA,MAAM,QAAQ,OAAQ,CACzB;AAAA,EAEN;AACF;AAEO,IAAM,mBAAoD,CAAC;AAAA,EAChE;AAAA,EACA;AAAA,EACA;AACF,MAAM;AAEJ,QAAM,kBAAkB,SAAS;AAAA,IAC/B;AAAA,IACA,iBAAiB;AAAA,EACnB;AAEA,QAAM,UAAU,iBAAiB,WAAW,SAAS;AACrD,QAAM,cAAc,iBAAiB;AAErC,SACE,gBAAAF,QAAA,cAACC,OAAA,EAAI,eAAc,YAEhB,eACC,gBAAAD,QAAA,cAACC,OAAA,EAAI,gBAAe,YAClB,gBAAAD,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAE,MAAM,GAAG,UAAS,qBAAmB,CACvD,GAID,gBAAgB,IAAI,CAAC,SAAS,UAC7B,gBAAAF,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,KAAK,GAAG,QAAQ,IAAI,IAAI,iBAAiB,KAAK;AAAA,MAC9C;AAAA;AAAA,EACF,CACD,GAGA,WACC,gBAAAA,QAAA,cAACC,OAAA,EAAI,gBAAe,UAAS,WAAW,KACtC,gBAAAD,QAAA,cAACE,QAAA,EAAK,UAAQ,QACX,MAAM,GAAG,YAAW,2BAAwB,SAAS,SAAS,iBAAiB,UAAS,QAC3F,CACF,CAEJ;AAEJ;;;AC/KA,OAAOE,aAAW;AAClB,SAAS,OAAAC,OAAK,QAAAC,cAAY;AASnB,IAAM,kBAAkD,CAAC;AAAA,EAC9D;AAAA,EACA;AAAA,EACA,iBAAiB;AACnB,MAAM;AACJ,MAAI,SAAS,GAAG;AACd,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,KAAK,IAAI,KAAK,KAAK,MAAO,UAAU,QAAS,GAAG,CAAC;AACpE,QAAM,WAAW;AACjB,QAAM,cAAc,KAAK,MAAO,aAAa,MAAO,QAAQ;AAC5D,QAAM,aAAa,WAAW;AAE9B,SACE,gBAAAC,QAAA,cAACC,OAAA,EAAI,gBAAe,cAClB,gBAAAD,QAAA,cAACE,QAAA,EAAK,UAAQ,QACX,kBAAkB,GAAG,UAAU,MAChC,gBAAAF,QAAA,cAACE,QAAA,EAAK,OAAOC,QAAO,aAAY,SAAI,OAAO,WAAW,CAAE,GACxD,gBAAAH,QAAA,cAACE,QAAA,EAAK,OAAOC,QAAO,SAAQ,SAAI,OAAO,UAAU,CAAE,GAClD,KACA,UAAU,GAAE,KAAE,KACjB,CACF;AAEJ;;;AHlBO,IAAM,cAA0C,CAAC;AAAA,EACtD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,qBAAqB,OAAO;AAElC,SACE,gBAAAC,QAAA,cAACC,OAAA,EAAI,eAAc,UAAS,QAAO,UAEjC,gBAAAD,QAAA,cAAC,cAAW,OAAO,YAAY,GAG/B,gBAAAA,QAAA,cAACC,OAAA,EAAI,eAAc,UAAS,UAAU,KACpC,gBAAAD,QAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,UAAU;AAAA;AAAA,EACZ,CACF,GAGC,SAAS,SAAS,sBACjB,gBAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,SAAS;AAAA,MACT,OAAO,SAAS;AAAA;AAAA,EAClB,CAEJ;AAEJ;AAKO,IAAM,cAAwB,MAAM;AACzC,SACE,gBAAAA,QAAA,cAACC,OAAA,EAAI,eAAc,UAAS,SAAS,KACnC,gBAAAD,QAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAaC,QAAO;AAAA,MACpB,SAAS;AAAA,MACT,cAAc;AAAA;AAAA,IAEd,gBAAAF,QAAA,cAACG,QAAA,EAAK,MAAI,MAAC,OAAOD,QAAO,WAAS,sDAElC;AAAA,IACA,gBAAAF,QAAA,cAACG,QAAA,IAAK;AAAA,IACN,gBAAAH,QAAA,cAACG,QAAA,MAAK,4FACwC,KAC5C,gBAAAH,QAAA,cAACG,QAAA,EAAK,MAAI,MAAC,OAAOD,QAAO,aAAW,gBAAc,GAAO,IAC3D;AAAA,IACA,gBAAAF,QAAA,cAACG,QAAA,MAAK,+GAEN;AAAA,EACF,GAEA,gBAAAH,QAAA,cAACC,OAAA,EAAI,eAAc,UAAS,WAAW,KACrC,gBAAAD,QAAA,cAACG,QAAA,EAAK,MAAI,MAAC,OAAOD,QAAO,aAAW,yBAAQ,GAC5C,gBAAAF,QAAA,cAACG,QAAA,IAAK,GACN,gBAAAH,QAAA,cAACG,QAAA,MAAK,+EAAoC,GAC1C,gBAAAH,QAAA,cAACG,QAAA,IAAK,GACN,gBAAAH,QAAA,cAACG,QAAA,EAAK,UAAQ,QAAC,0BAAY,gBAAAH,QAAA,cAACG,QAAA,EAAK,OAAOD,QAAO,OAAO,OAAK,GAAC,GAAO,gCAAY,CACjF,GAEA,gBAAAF,QAAA,cAACC,OAAA,EAAI,eAAc,UAAS,WAAW,KACrC,gBAAAD,QAAA,cAACG,QAAA,EAAK,MAAI,MAAC,OAAOD,QAAO,aAAW,8BAAU,GAC9C,gBAAAF,QAAA,cAACG,QAAA,IAAK,GACN,gBAAAH,QAAA,cAACG,QAAA,MAAK,SAAK,gBAAAH,QAAA,cAACG,QAAA,EAAK,OAAOD,QAAO,WAAS,sBAAU,GAAO,qCAAyB,GAClF,gBAAAF,QAAA,cAACG,QAAA,MAAK,SAAK,gBAAAH,QAAA,cAACG,QAAA,EAAK,OAAOD,QAAO,WAAS,WAAS,GAAO,iDAA2B,GACnF,gBAAAF,QAAA,cAACG,QAAA,MAAK,SAAK,gBAAAH,QAAA,cAACG,QAAA,EAAK,OAAOD,QAAO,WAAS,WAAS,GAAO,kCAAqB,CAC/E,CACF;AAEJ;;;AI/FA,OAAOE,WAAS,YAAAC,WAAU,mBAAmB;AAC7C,SAAS,OAAAC,OAAK,QAAAC,QAAM,YAAAC,iBAAgB;AACpC,OAAOC,gBAAe;;;ACDtB,SAAS,YAAAC,WAAU,aAAAC,YAAW,WAAAC,gBAAe;AAC7C,OAAOC,aAAY;;;ACDnB,OAAOC,YAAW;AAClB,SAAS,cAA2B;AACpC,OAAO,sBAAsB;AAI7B,IAAM,WAAW,IAAI,iBAAiB;AAAA;AAAA,EAEpC,MAAMA,OAAM;AAAA,EACZ,UAAUA,OAAM,OAAO;AAAA;AAAA,EAGvB,YAAYA,OAAM,MAAM;AAAA,EACxB,MAAMA,OAAM;AAAA,EACZ,SAASA,OAAM,QAAQ;AAAA,EACvB,cAAcA,OAAM,QAAQ;AAAA,EAC5B,IAAIA,OAAM;AAAA;AAAA,EAGV,UAAUA,OAAM;AAAA,EAChB,MAAM,CAAC,SAAiB;AAAA;AAAA,EAGxB,OAAOA,OAAM;AAAA,EACb,UAAUA,OAAM;AAAA,EAChB,WAAWA,OAAM;AAAA;AAAA,EAGjB,QAAQA,OAAM;AAAA,EACd,IAAIA,OAAM;AAAA,EACV,KAAKA,OAAM;AAAA,EACX,MAAMA,OAAM,KAAK;AAAA,EACjB,MAAMA,OAAM;AAAA;AAAA,EAGZ,WAAWA,OAAM;AAAA,EACjB,OAAOA,OAAM;AAAA;AAAA,EAGb,mBAAmB;AAAA,EACnB,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,OAAO;AAAA,EACP,KAAK;AACP,CAAC;AAGD,OAAO,WAAW;AAAA,EAChB;AAAA,EACA,KAAK;AAAA,EACL,QAAQ;AACV,CAAC;AAsCM,SAAS,WAAW,UAA8B;AACvD,QAAM,MAAkB,CAAC;AACzB,QAAM,eAAe;AAErB,MAAI;AACJ,UAAQ,QAAQ,aAAa,KAAK,QAAQ,OAAO,MAAM;AACrD,UAAM,QAAQ,MAAM,CAAC,EAAG;AACxB,UAAM,OAAO,MAAM,CAAC,EAAG,KAAK;AAC5B,UAAM,KAAK,KACR,YAAY,EACZ,QAAQ,aAAa,EAAE,EACvB,QAAQ,QAAQ,GAAG;AAEtB,QAAI,KAAK,EAAE,OAAO,MAAM,GAAG,CAAC;AAAA,EAC9B;AAEA,SAAO;AACT;AAKO,SAAS,wBAAwB,UAAoC;AAC1E,QAAM,WAA6B,CAAC;AACpC,QAAM,SAAS,OAAO,MAAM,QAAQ;AAEpC,aAAW,SAAS,QAAQ;AAC1B,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK,WAAW;AACd,cAAM,eAAe;AACrB,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,OAAO,aAAa;AAAA,UACpB,SAAS,aAAa;AAAA,QACxB,CAAC;AACD;AAAA,MACF;AAAA,MAEA,KAAK,aAAa;AAChB,cAAM,YAAY;AAClB,cAAM,OAAO,UAAU;AAGvB,YAAI,KAAK,WAAW,aAAM,KAAK,KAAK,WAAW,WAAI,GAAG;AACpD,mBAAS,KAAK;AAAA,YACZ,MAAM;AAAA,YACN,SAAS,KAAK,QAAQ,cAAc,EAAE,EAAE,QAAQ,UAAU,EAAE;AAAA,UAC9D,CAAC;AAAA,QACH,WAAW,KAAK,WAAW,gBAAM,KAAK,KAAK,WAAW,cAAI,GAAG;AAC3D,mBAAS,KAAK;AAAA,YACZ,MAAM;AAAA,YACN,SAAS,KAAK,QAAQ,cAAc,EAAE,EAAE,QAAQ,UAAU,EAAE;AAAA,UAC9D,CAAC;AAAA,QACH,OAAO;AACL,mBAAS,KAAK;AAAA,YACZ,MAAM;AAAA,YACN,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AACA;AAAA,MACF;AAAA,MAEA,KAAK,QAAQ;AACX,cAAM,YAAY;AAClB,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,SAAS,UAAU;AAAA,UACnB,UAAU,UAAU,QAAQ;AAAA,QAC9B,CAAC;AACD;AAAA,MACF;AAAA,MAEA,KAAK,cAAc;AACjB,cAAM,UAAU;AAChB,cAAM,OAAO,QAAQ;AAErB,YAAI,KAAK,SAAS,WAAI,GAAG;AACvB,mBAAS,KAAK;AAAA,YACZ,MAAM;AAAA,YACN,SAAS,KAAK,QAAQ,sBAAsB,EAAE;AAAA,UAChD,CAAC;AAAA,QACH,WAAW,KAAK,SAAS,cAAI,GAAG;AAC9B,mBAAS,KAAK;AAAA,YACZ,MAAM;AAAA,YACN,SAAS,KAAK,QAAQ,0BAA0B,EAAE;AAAA,UACpD,CAAC;AAAA,QACH,OAAO;AACL,mBAAS,KAAK;AAAA,YACZ,MAAM;AAAA,YACN,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AACA;AAAA,MACF;AAAA,MAEA,KAAK,QAAQ;AACX,cAAM,YAAY;AAClB,cAAM,QAAQ,UAAU,MAAM,IAAI,CAAC,SAAS,KAAK,IAAI;AACrD,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,SAAS;AAAA,UACT;AAAA,QACF,CAAC;AACD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;AC9KO,IAAM,eAA6C;AAAA,EACxD,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoGT,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgHX,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsIT,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA6HV,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwFf;;;AFviBO,SAAS,WAAW,OAIzB;AACA,QAAM,CAAC,SAAS,UAAU,IAAIC,UAA+B,IAAI;AACjE,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAwB,IAAI;AAEtD,EAAAC,WAAU,MAAM;AACd,QAAI,CAAC,OAAO;AACV,iBAAW,IAAI;AACf;AAAA,IACF;AAEA,eAAW,IAAI;AACf,aAAS,IAAI;AAEb,QAAI;AACF,YAAM,aAAa,aAAa,KAAK;AAErC,UAAI,CAAC,YAAY;AACf,cAAM,IAAI,MAAM,gCAAgC,KAAK,EAAE;AAAA,MACzD;AAGA,YAAM,EAAE,MAAM,SAAS,SAAS,IAAIC,QAAO,UAAU;AAGrD,YAAM,OAAoB;AAAA,QACxB,OAAO,KAAK,SAAS;AAAA,QACrB,MAAM,KAAK,QAAQ;AAAA,QACnB,aAAa,KAAK,eAAe;AAAA,QACjC,OAAO,KAAK;AAAA,MACd;AAGA,YAAM,WAAW,wBAAwB,QAAQ;AAGjD,YAAM,MAAM,WAAW,QAAQ;AAE/B,iBAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA,aAAa;AAAA,MACf,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,eAAS,eAAe,QAAQ,IAAI,UAAU,eAAe;AAC7D,iBAAW,IAAI;AAAA,IACjB,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,KAAK,CAAC;AAEV,SAAO,EAAE,SAAS,SAAS,MAAM;AACnC;AAgDO,SAAS,UAAU,OAMxB;AACA,SAAOC,SAAQ,MAAM;AACnB,QAAI,CAAC,SAAS,MAAM,SAAS,GAAG;AAC9B,aAAO,EAAE,SAAS,CAAC,EAAE;AAAA,IACvB;AAEA,UAAM,UAIA,CAAC;AAEP,UAAM,aAAa,MAAM,YAAY;AAErC,eAAW,CAAC,IAAI,UAAU,KAAK,OAAO,QAAQ,YAAY,GAAG;AAC3D,YAAM,EAAE,MAAM,SAAS,SAAS,IAAIC,QAAO,UAAU;AACrD,YAAM,eAAe,SAAS,YAAY;AAE1C,UAAI,aAAa,SAAS,UAAU,GAAG;AAErC,cAAM,QAAQ,SAAS,MAAM,IAAI;AACjC,cAAM,UAA+C,CAAC;AAEtD,iBAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,cAAI,MAAM,CAAC,EAAG,YAAY,EAAE,SAAS,UAAU,GAAG;AAChD,oBAAQ,KAAK;AAAA,cACX,MAAM,MAAM,CAAC,EAAG,KAAK;AAAA,cACrB,SAAS,QAAQ,IAAI,CAAC;AAAA,YACxB,CAAC;AAGD,gBAAI,QAAQ,UAAU,EAAG;AAAA,UAC3B;AAAA,QACF;AAEA,YAAI,QAAQ,SAAS,GAAG;AACtB,kBAAQ,KAAK;AAAA,YACX,OAAO;AAAA,YACP,OAAO,KAAK,SAAS;AAAA,YACrB;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,WAAO,EAAE,QAAQ;AAAA,EACnB,GAAG,CAAC,KAAK,CAAC;AACZ;;;ADpLO,IAAM,gBAA8C,CAAC;AAAA,EAC1D;AAAA,EACA;AACF,MAAM;AACJ,QAAM,CAAC,OAAO,QAAQ,IAAIC,UAAS,EAAE;AACrC,QAAM,CAAC,eAAe,gBAAgB,IAAIA,UAAS,CAAC;AACpD,QAAM,EAAE,QAAQ,IAAI,UAAU,KAAK;AAGnC,QAAM,cAAc,QAAQ;AAAA,IAAQ,CAAC,MACnC,EAAE,QAAQ,IAAI,CAAC,OAAO;AAAA,MACpB,OAAO,EAAE;AAAA,MACT,OAAO,EAAE;AAAA,MACT,OAAO,EAAE;AAAA,MACT,SAAS,EAAE;AAAA,IACb,EAAE;AAAA,EACJ;AAEA,EAAAC,UAAS,CAACC,QAAO,QAAQ;AACvB,QAAI,IAAI,QAAQ;AACd,cAAQ;AACR;AAAA,IACF;AAEA,QAAI,IAAI,SAAS;AACf,uBAAiB,CAAC,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,CAAC;AAChD;AAAA,IACF;AAEA,QAAI,IAAI,WAAW;AACjB,uBAAiB,CAAC,SAAS,KAAK,IAAI,YAAY,SAAS,GAAG,OAAO,CAAC,CAAC;AACrE;AAAA,IACF;AAEA,QAAI,IAAI,UAAU,YAAY,SAAS,GAAG;AACxC,YAAM,SAAS,YAAY,aAAa;AACxC,UAAI,QAAQ;AACV,uBAAe,OAAO,KAAK;AAC3B,gBAAQ;AAAA,MACV;AACA;AAAA,IACF;AAAA,EACF,CAAC;AAGD,QAAM,oBAAoB,YAAY,CAAC,UAAkB;AACvD,aAAS,KAAK;AACd,qBAAiB,CAAC;AAAA,EACpB,GAAG,CAAC,CAAC;AAEL,SACE,gBAAAC,QAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,eAAc;AAAA,MACd,aAAa,QAAQ,OAAO;AAAA,MAC5B,aAAa,QAAQ,OAAO;AAAA,MAC5B,SAAS;AAAA,MACT,OAAO;AAAA;AAAA,IAGP,gBAAAD,QAAA,cAACC,OAAA,EAAI,cAAc,KACjB,gBAAAD,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAOC,QAAO,OAAO,UAC7B,MAAM,GAAG,QAAO,SACnB,GACA,gBAAAH,QAAA,cAACC,OAAA,EAAI,UAAU,GAAG,GAClB,gBAAAD,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAC,aAAW,CAC5B;AAAA,IAGA,gBAAAF,QAAA;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,aAAY;AAAA,QACZ,aAAaE,QAAO;AAAA,QACpB,UAAU;AAAA,QACV,cAAc;AAAA;AAAA,MAEd,gBAAAH,QAAA,cAACE,QAAA,EAAK,OAAOC,QAAO,aAAW,SAAE;AAAA,MACjC,gBAAAH,QAAA;AAAA,QAACI;AAAA,QAAA;AAAA,UACC,OAAO;AAAA,UACP,UAAU;AAAA,UACV,aAAY;AAAA,UACZ,OAAO;AAAA;AAAA,MACT;AAAA,IACF;AAAA,IAGA,gBAAAJ,QAAA,cAACC,OAAA,EAAI,eAAc,UAAS,WAAW,MACpC,MAAM,SAAS,IACd,gBAAAD,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAC,yCAAuC,IACpD,YAAY,WAAW,IACzB,gBAAAF,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAC,0BAAuB,OAAM,GAAC,IAE7C,gBAAAF,QAAA,cAAAA,QAAA,gBACE,gBAAAA,QAAA,cAACE,QAAA,EAAK,UAAQ,MAAC,cAAc,KAAG,UACvB,YAAY,QAAO,aAC5B,GACC,YAAY,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,QAAQ,UAAU;AAC9C,YAAM,aAAa,UAAU;AAE7B,YAAM,YACJ,OAAO,MAAM,SAAS,KAClB,OAAO,MAAM,UAAU,GAAG,EAAE,IAAI,QAChC,OAAO;AAEb,aACE,gBAAAF,QAAA,cAACC,OAAA,EAAI,KAAK,GAAG,OAAO,KAAK,IAAI,KAAK,IAAI,eAAc,YAClD,gBAAAD,QAAA,cAACC,OAAA,MACC,gBAAAD,QAAA;AAAA,QAACE;AAAA,QAAA;AAAA,UACC,OAAO,aAAaC,QAAO,OAAO,WAAW;AAAA,UAC7C,iBAAiB,aAAaA,QAAO,OAAO,WAAW;AAAA,UACvD,MAAM;AAAA;AAAA,QAEL,aAAa,WAAM;AAAA,QAAI;AAAA,QAAG,OAAO;AAAA,QAAM;AAAA,MAC1C,CACF,GACA,gBAAAH,QAAA,cAACC,OAAA,EAAI,YAAY,KACf,gBAAAD,QAAA;AAAA,QAACE;AAAA,QAAA;AAAA,UACC,OAAO,aAAaC,QAAO,OAAO,QAAQA,QAAO;AAAA,UACjD,UAAU,CAAC;AAAA;AAAA,QAEV;AAAA,MACH,CACF,CACF;AAAA,IAEJ,CAAC,GACA,YAAY,SAAS,KACpB,gBAAAH,QAAA,cAACE,QAAA,EAAK,UAAQ,MAAC,WAAW,KAAG,YAClB,YAAY,SAAS,GAAE,eAClC,CAEJ,CAEJ;AAAA,IAGA,gBAAAF,QAAA,cAACC,OAAA,EAAI,WAAW,GAAG,WAAS,MAAC,aAAaE,QAAO,OAAO,YAAY,KAClE,gBAAAH,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAC,6DAEf,CACF;AAAA,EACF;AAEJ;;;AZ5HO,IAAM,WAAoC,CAAC,EAAE,cAAc,OAAO,MAAM;AAC7E,QAAM,EAAE,KAAK,IAAIG,QAAO;AAGxB,QAAM,CAAC,cAAc,eAAe,IAAIC,WAAqB,IAAI;AACjE,QAAM,CAAC,WAAW,YAAY,IAAIA,WAAoB,SAAS;AAC/D,QAAM,CAAC,aAAa,cAAc,IAAIA,WAAsB,MAAM;AAGlE,QAAM,CAAC,WAAW,YAAY,IAAIA,WAAS,CAAC;AAC5C,QAAM,CAAC,UAAU,WAAW,IAAIA,WAAS,CAAC;AAC1C,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,WAAS,CAAC;AAGtD,QAAM,CAAC,cAAc,eAAe,IAAIA,WAAS,KAAK;AAGtD,QAAM,EAAE,SAAS,SAAS,MAAM,IAAI,WAAW,YAAY;AAG3D,EAAAC,WAAU,MAAM;AACd,QAAI,cAAc;AAChB,YAAM,cAAc,CAAC,SAAS,SAAS,aAAa,WAAW,QAAQ;AACvE,UAAI,YAAY,SAAS,YAAY,GAAG;AACtC,wBAAgB,YAA0B;AAC1C,qBAAa,SAAS;AAAA,MACxB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,YAAY,CAAC;AAGjB,QAAM,oBAAoBC,aAAY,CAAC,UAAwB;AAC7D,oBAAgB,KAAK;AACrB,sBAAkB,CAAC;AACnB,gBAAY,CAAC;AACb,iBAAa,SAAS;AACtB,mBAAe,MAAM;AAAA,EACvB,GAAG,CAAC,CAAC;AAGL,QAAM,sBAAsBA,aAAY,CAAC,cAAsB;AAE7D,QAAI,SAAS;AACX,YAAM,eAAe,QAAQ,SAAS;AAAA,QACpC,CAAC,MAAM,EAAE,SAAS,aAAa,EAAE,QAAQ,YAAY,EAAE,SAAS,SAAS;AAAA,MAC3E;AACA,UAAI,gBAAgB,GAAG;AACrB,0BAAkB,YAAY;AAAA,MAChC;AAAA,IACF;AACA,iBAAa,SAAS;AAAA,EACxB,GAAG,CAAC,OAAO,CAAC;AAGZ,QAAM,qBAAqBA,aAAY,CAAC,UAAwB;AAC9D,oBAAgB,KAAK;AACrB,sBAAkB,CAAC;AACnB,oBAAgB,KAAK;AACrB,iBAAa,SAAS;AAAA,EACxB,GAAG,CAAC,CAAC;AAGL,QAAM,aAAaA,aAAY,MAAM;AACnC,QAAI,cAAc;AAChB,sBAAgB,KAAK;AAAA,IACvB,WAAW,cAAc,aAAa,cAAc;AAClD,mBAAa,SAAS;AAAA,IACxB,WAAW,cAAc;AACvB,sBAAgB,IAAI;AACpB,mBAAa,SAAS;AACtB,qBAAe,MAAM;AAAA,IACvB,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF,GAAG,CAAC,cAAc,WAAW,cAAc,MAAM,CAAC;AAGlD,EAAAC,UAAS,CAACC,QAAO,QAAQ;AAEvB,QAAI,cAAc;AAChB;AAAA,IACF;AAGA,QAAIA,WAAU,KAAK;AACjB,aAAO;AACP;AAAA,IACF;AAGA,QAAIA,WAAU,KAAK;AACjB,sBAAgB,IAAI;AACpB;AAAA,IACF;AAGA,QAAI,IAAI,QAAQ;AACd,iBAAW;AACX;AAAA,IACF;AAGA,QAAI,IAAI,KAAK;AACX,mBAAa,CAAC,SAAU,SAAS,YAAY,YAAY,SAAU;AACnE;AAAA,IACF;AAGA,QAAI,IAAI,aAAa,cAAc,WAAW;AAC5C,mBAAa,SAAS;AACtB;AAAA,IACF;AACA,QAAI,IAAI,cAAc,cAAc,WAAW;AAC7C,mBAAa,SAAS;AACtB;AAAA,IACF;AAGA,QAAI,cAAc,WAAW;AAC3B,UAAI,gBAAgB,QAAQ;AAC1B,YAAI,IAAI,WAAWA,WAAU,KAAK;AAChC,uBAAa,CAAC,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,CAAC;AAAA,QAC9C,WAAW,IAAI,aAAaA,WAAU,KAAK;AACzC,uBAAa,CAAC,SAAS,KAAK,IAAI,WAAW,SAAS,GAAG,OAAO,CAAC,CAAC;AAAA,QAClE,WAAW,IAAI,QAAQ;AACrB,gBAAM,OAAO,WAAW,SAAS;AACjC,cAAI,MAAM;AACR,8BAAkB,KAAK,EAAE;AAAA,UAC3B;AAAA,QACF;AAAA,MACF,WAAW,gBAAgB,SAAS,SAAS;AAC3C,cAAM,WAAW,QAAQ,IAAI,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC;AACxD,YAAI,IAAI,WAAWA,WAAU,KAAK;AAChC,sBAAY,CAAC,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,CAAC;AAAA,QAC7C,WAAW,IAAI,aAAaA,WAAU,KAAK;AACzC,sBAAY,CAAC,SAAS,KAAK,IAAI,SAAS,SAAS,GAAG,OAAO,CAAC,CAAC;AAAA,QAC/D,WAAW,IAAI,QAAQ;AACrB,gBAAM,UAAU,SAAS,QAAQ;AACjC,cAAI,SAAS;AACX,gCAAoB,QAAQ,EAAE;AAAA,UAChC;AAAA,QACF;AAAA,MACF;AAGA,UAAIA,WAAU,OAAO,gBAAgB,SAAS,IAAI,QAAQ;AACxD,uBAAe,CAAC,SAAU,SAAS,SAAS,QAAQ,MAAO;AAAA,MAC7D;AAAA,IACF;AAGA,QAAI,cAAc,aAAa,cAAc;AAC3C,YAAM,YAAY,UAAU,KAAK,IAAI,GAAG,QAAQ,SAAS,SAAS,EAAE,IAAI;AAExE,UAAI,IAAI,WAAWA,WAAU,KAAK;AAChC,0BAAkB,CAAC,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,CAAC;AAAA,MACnD,WAAW,IAAI,aAAaA,WAAU,KAAK;AACzC,0BAAkB,CAAC,SAAS,KAAK,IAAI,WAAW,OAAO,CAAC,CAAC;AAAA,MAC3D,WAAW,IAAI,UAAW,IAAI,QAAQA,WAAU,KAAM;AACpD,0BAAkB,CAAC,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,CAAC;AAAA,MACnD,WAAW,IAAI,YAAa,IAAI,QAAQA,WAAU,KAAM;AACtD,0BAAkB,CAAC,SAAS,KAAK,IAAI,WAAW,OAAO,CAAC,CAAC;AAAA,MAC3D,WAAWA,WAAU,KAAK;AACxB,0BAAkB,CAAC;AAAA,MACrB,WAAWA,WAAU,KAAK;AACxB,0BAAkB,SAAS;AAAA,MAC7B;AAAA,IACF;AAAA,EACF,CAAC;AAGD,QAAM,gBAAgB,MAAM;AAE1B,QAAI,SAAS;AACX,aACE,gBAAAC,QAAA,cAACC,OAAA,EAAI,SAAS,KACZ,gBAAAD,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAC,YAAU,CAC3B;AAAA,IAEJ;AAGA,QAAI,OAAO;AACT,aACE,gBAAAF,QAAA,cAACC,OAAA,EAAI,SAAS,KACZ,gBAAAD,QAAA,cAACE,QAAA,EAAK,OAAM,SAAM,WAAQ,KAAM,CAClC;AAAA,IAEJ;AAGA,QAAI,WAAW,cAAc;AAC3B,aACE,gBAAAF,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,QAAQ,KAAK;AAAA,UACpB,MAAM,QAAQ,KAAK;AAAA,UACnB,YAAY,CAAC,SAAS,QAAQ,KAAK,KAAK;AAAA,UACxC,UAAU,QAAQ;AAAA,UAClB;AAAA,UACA,WAAW,cAAc;AAAA;AAAA,MAC3B;AAAA,IAEJ;AAGA,WAAO,gBAAAA,QAAA,cAAC,iBAAY;AAAA,EACtB;AAGA,QAAM,gBAAgB,MACpB,gBAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA,KAAK,SAAS,OAAO,CAAC;AAAA,MACtB,YAAY,SAAS,KAAK;AAAA,MAC1B,WAAW,cAAc;AAAA,MACzB,eAAe;AAAA,MACf,iBAAiB;AAAA;AAAA,EACnB;AAIF,QAAM,eAAe,MACnB,gBAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,SAAS,MAAM,gBAAgB,KAAK;AAAA,MACpC,gBAAgB;AAAA;AAAA,EAClB;AAGF,SACE,gBAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,SAAS,cAAc;AAAA,MACvB,SAAS,cAAc;AAAA,MACvB,eAAe,eAAe,aAAa,IAAI;AAAA;AAAA,EACjD;AAEJ;;;ADnQO,SAAS,qBAA8B;AAC5C,QAAM,MAAM,IAAIG,UAAQ,OAAO,EAC5B,YAAY,oDAA4C,EACxD;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,OAAO,OAAO,YAAgC;AAC7C,UAAM,EAAE,cAAc,IAAIC;AAAA,MACxBC,QAAM,cAAc,UAAU;AAAA,QAC5B,cAAc,QAAQ;AAAA,QACtB,QAAQ,MAAM;AACZ,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,cAAc;AAAA,EACtB,CAAC;AAEH,SAAO;AACT;;;AiB9BA,SAAS,WAAAC,iBAAe;AACxB,OAAOC,aAAW;AAClB,SAAS,UAAAC,eAAc;;;ACOhB,IAAM,kBAAN,MAAsB;AAAA,EACR;AAAA,EACA;AAAA,EAEjB,YAAY,QAAoB;AAE5B,SAAK,UAAU,OAAO,OAAO,QAAQ,OAAO,EAAE;AAC9C,SAAK,SAAS,OAAO;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,aAAqB;AACjB,WAAO,GAAG,KAAK,OAAO;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,YAAoB;AAChB,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAqC;AACvC,UAAM,WAAW,MAAM,MAAM,GAAG,KAAK,OAAO,cAAc;AAAA,MACtD,SAAS;AAAA,QACL,eAAe,UAAU,KAAK,MAAM;AAAA,MACxC;AAAA,IACJ,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AACd,YAAM,IAAI,MAAM,2BAA2B,SAAS,UAAU,EAAE;AAAA,IACpE;AAEA,UAAM,SAAS,MAAM,SAAS,KAAK;AACnC,WAAO,UAAU,EAAE,MAAM,CAAC,EAAE;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAiC;AACnC,UAAM,WAAW,MAAM,MAAM,GAAG,KAAK,OAAO,iBAAiB;AAAA,MACzD,SAAS;AAAA,QACL,eAAe,UAAU,KAAK,MAAM;AAAA,MACxC;AAAA,IACJ,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AACd,YAAM,IAAI,MAAM,2BAA2B,SAAS,UAAU,EAAE;AAAA,IACpE;AAEA,UAAM,SAAS,MAAM,SAAS,KAAK;AACnC,WAAO,QAAQ,QAAQ,EAAE,wBAAwB,CAAC,GAAG,qBAAqB,CAAC,EAAE;AAAA,EACjF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,OAAO,GAAwB;AAC1C,UAAM,WAAW,MAAM,MAAM,GAAG,KAAK,OAAO,qBAAqB,IAAI,IAAI;AAAA,MACrE,SAAS;AAAA,QACL,eAAe,UAAU,KAAK,MAAM;AAAA,MACxC;AAAA,IACJ,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AACd,YAAM,IAAI,MAAM,0BAA0B,SAAS,UAAU,EAAE;AAAA,IACnE;AAEA,UAAM,SAAS,MAAM,SAAS,KAAK;AACnC,WAAO,UAAU,EAAE,MAAM,CAAC,EAAE;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAgD;AAClD,UAAM,CAAC,WAAW,QAAQ,KAAK,IAAI,MAAM,QAAQ,IAAI;AAAA,MACjD,KAAK,UAAU;AAAA,MACf,KAAK,UAAU;AAAA,MACf,KAAK,SAAS,CAAC;AAAA;AAAA,IACnB,CAAC;AAGD,UAAM,SAAQ,oBAAI,KAAK,GAAE,mBAAmB,SAAS,EAAE,UAAU,mBAAmB,CAAC;AACrF,UAAM,aAAa,UAAU,QAAQ,CAAC;AAEtC,WAAO,WAAW,IAAI,CAAC,UAAU;AAC7B,YAAM,UAAU,OAAO,wBAAwB,SAAS,MAAM,EAAE,KAAK;AACrE,YAAM,aAAa,OAAO,sBAAsB,MAAM,EAAE,KAAK,OAAO,sBAAsB,MAAM,GAAG,YAAY,CAAC;AAGhH,YAAM,YAAY,MAAM,QAAQ,CAAC;AACjC,YAAM,cAAc,UAAU;AAAA,QAC1B,CAAC,MAAM,EAAE,UAAU,MAAM,MAAM,EAAE,SAAS;AAAA,MAC9C,KAAK,UAAU;AAAA,QACX,CAAC,MAAM,EAAE,MAAM,YAAY,MAAM,MAAM,GAAG,YAAY,KAAK,EAAE,SAAS;AAAA,MAC1E;AACA,YAAM,YAAY,aAAa,SAAS;AAExC,aAAO;AAAA,QACH,GAAG;AAAA,QACH;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAAA,IACJ,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,KACF,UACA,OACA,QACe;AACf,UAAM,WAAW,MAAM,MAAM,GAAG,KAAK,OAAO,wBAAwB;AAAA,MAChE,QAAQ;AAAA,MACR,SAAS;AAAA,QACL,gBAAgB;AAAA,QAChB,eAAe,UAAU,KAAK,MAAM;AAAA,MACxC;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACjB;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,MACZ,CAAC;AAAA,MACD;AAAA,IACJ,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AACd,YAAM,QAAQ,MAAM,SAAS,KAAK;AAClC,YAAM,IAAI,MAAM,2BAA2B,KAAK,EAAE;AAAA,IACtD;AAEA,UAAM,SAAS,MAAM,SAAS,KAAK;AACnC,WAAO,OAAO,QAAQ,CAAC,GAAG,SAAS,WAAW;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,WACH,UACA,OACA,QACsB;AACtB,UAAM,WAAW,MAAM,MAAM,GAAG,KAAK,OAAO,wBAAwB;AAAA,MAChE,QAAQ;AAAA,MACR,SAAS;AAAA,QACL,gBAAgB;AAAA,QAChB,eAAe,UAAU,KAAK,MAAM;AAAA,MACxC;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACjB;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,MACZ,CAAC;AAAA,MACD;AAAA,IACJ,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AACd,YAAM,QAAQ,MAAM,SAAS,KAAK;AAClC,YAAM,IAAI,MAAM,2BAA2B,KAAK,EAAE;AAAA,IACtD;AAEA,QAAI,CAAC,SAAS,MAAM;AAChB,YAAM,IAAI,MAAM,uBAAuB;AAAA,IAC3C;AAEA,UAAM,SAAS,SAAS,KAAK,UAAU;AACvC,UAAM,UAAU,IAAI,YAAY;AAChC,QAAI,SAAS;AAEb,QAAI;AACA,aAAO,MAAM;AACT,cAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,YAAI,KAAM;AAGV,kBAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAGhD,cAAM,QAAQ,OAAO,MAAM,IAAI;AAE/B,iBAAS,MAAM,IAAI,KAAK;AAExB,mBAAW,QAAQ,OAAO;AACtB,gBAAM,cAAc,KAAK,KAAK;AAC9B,cAAI,CAAC,YAAa;AAElB,cAAI,YAAY,WAAW,QAAQ,GAAG;AAClC,kBAAM,OAAO,YAAY,MAAM,CAAC;AAChC,gBAAI,SAAS,UAAU;AACnB;AAAA,YACJ;AAEA,gBAAI;AACA,oBAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,oBAAM,UAAU,OAAO,QAAQ,CAAC,GAAG,OAAO;AAC1C,kBAAI,SAAS;AACT,sBAAM;AAAA,cACV;AAAA,YACJ,SAAS,GAAG;AAAA,YAEZ;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAGA,UAAI,OAAO,KAAK,GAAG;AACf,cAAM,cAAc,OAAO,KAAK;AAChC,YAAI,YAAY,WAAW,QAAQ,GAAG;AAClC,gBAAM,OAAO,YAAY,MAAM,CAAC;AAChC,cAAI,SAAS,UAAU;AACnB,gBAAI;AACA,oBAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,oBAAM,UAAU,OAAO,QAAQ,CAAC,GAAG,OAAO;AAC1C,kBAAI,SAAS;AACT,sBAAM;AAAA,cACV;AAAA,YACJ,SAAS,GAAG;AAAA,YAEZ;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ,UAAE;AACE,aAAO,YAAY;AAAA,IACvB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmB,OAAuB;AACtC,WAAO,QAAQ,KAAK,WAAW,CAAC;AAAA,8BACV,KAAK,OAAO,MAAM,GAAG,EAAE,CAAC;AAAA;AAAA;AAAA,gBAGtC,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,EAKjB;AAAA;AAAA;AAAA;AAAA,EAKA,uBAAuB,OAAuB;AAC1C,WAAO,QAAQ,KAAK,WAAW,CAAC;AAAA,8BACV,KAAK,MAAM;AAAA;AAAA;AAAA,gBAGzB,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,EAKjB;AACJ;;;ACvRA,OAAOC,WAAS,YAAAC,YAAU,aAAAC,YAAW,WAAAC,UAAS,eAAAC,cAAa,UAAAC,eAAc;AACzE,SAAS,OAAAC,OAAK,QAAAC,QAAM,YAAAC,YAAU,UAAAC,SAAQ,aAAAC,kBAAiB;AACvD,OAAOC,cAAa;;;ACHpB,SAAS,YAAAC,YAAU,eAAAC,oBAAmB;AAI/B,SAAS,QAAQ,SAA0B;AAC9C,QAAM,CAAC,UAAU,WAAW,IAAID,WAAwB,CAAC,CAAC;AAC1D,QAAM,CAAC,aAAa,cAAc,IAAIA,WAAS,KAAK;AACpD,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAwB,IAAI;AAEtD,QAAM,cAAcC;AAAA,IAChB,OAAO,SAAiB,UAAkB;AACtC,UAAI,CAAC,QAAQ,KAAK,KAAK,YAAa;AAGpC,YAAM,cAA2B;AAAA,QAC7B,IAAI,QAAQ,KAAK,IAAI,CAAC;AAAA,QACtB,MAAM;AAAA,QACN,SAAS,QAAQ,KAAK;AAAA,QACtB,WAAW,oBAAI,KAAK;AAAA,MACxB;AAEA,kBAAY,CAAC,SAAS,CAAC,GAAG,MAAM,WAAW,CAAC;AAC5C,eAAS,IAAI;AACb,qBAAe,IAAI;AAGnB,YAAM,qBAAqB,aAAa,KAAK,IAAI,CAAC;AAClD,YAAM,mBAAgC;AAAA,QAClC,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,WAAW,oBAAI,KAAK;AAAA,MACxB;AAEA,kBAAY,CAAC,SAAS,CAAC,GAAG,MAAM,gBAAgB,CAAC;AAEjD,UAAI;AAEA,cAAM,qBAA0C;AAAA,UAC5C,GAAG,SAAS,IAAI,CAAC,OAAO;AAAA,YACpB,MAAM,EAAE;AAAA,YACR,SAAS,EAAE;AAAA,UACf,EAAE;AAAA,UACF;AAAA,YACI,MAAM;AAAA,YACN,SAAS,QAAQ,KAAK;AAAA,UAC1B;AAAA,QACJ;AAGA,YAAI,cAAc;AAClB,yBAAiB,SAAS,QAAQ,WAAW,oBAAoB,KAAK,GAAG;AACrE,yBAAe;AAGf;AAAA,YAAY,CAAC,SACT,KAAK;AAAA,cAAI,CAAC,QACN,IAAI,OAAO,qBACL,EAAE,GAAG,KAAK,SAAS,YAAY,IAC/B;AAAA,YACV;AAAA,UACJ;AAAA,QACJ;AAEA,uBAAe,KAAK;AAAA,MACxB,SAAS,KAAK;AACV,cAAM,eAAe,eAAe,QAAQ,IAAI,UAAU;AAC1D,iBAAS,YAAY;AAGrB;AAAA,UAAY,CAAC,SACT,KAAK;AAAA,YAAI,CAAC,QACN,IAAI,OAAO,qBACL,EAAE,GAAG,KAAK,SAAS,UAAU,YAAY,GAAG,IAC5C;AAAA,UACV;AAAA,QACJ;AAEA,uBAAe,KAAK;AAAA,MACxB;AAAA,IACJ;AAAA,IACA,CAAC,SAAS,UAAU,WAAW;AAAA,EACnC;AAEA,QAAM,gBAAgBA,aAAY,MAAM;AACpC,gBAAY,CAAC,CAAC;AACd,aAAS,IAAI;AAAA,EACjB,GAAG,CAAC,CAAC;AAEL,SAAO;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACJ;;;AC/FA,SAAS,YAAAC,YAAU,aAAAC,YAAW,eAAAC,cAAa,cAAc;AAYlD,SAAS,UAAU,SAA0B;AAChD,QAAM,CAAC,OAAO,QAAQ,IAAIF,WAAsB;AAAA,IAC5C,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,SAAS;AAAA,IACT,OAAO;AAAA,EACX,CAAC;AAGD,QAAM,aAAa,OAAO,KAAK;AAE/B,QAAM,YAAYE,aAAY,OAAO,cAAc,UAAU;AAEzD,QAAI,aAAa;AACb,eAAS,CAAC,UAAU,EAAE,GAAG,MAAM,SAAS,MAAM,OAAO,KAAK,EAAE;AAAA,IAChE;AAEA,QAAI;AACA,YAAM,CAAC,QAAQ,QAAQ,KAAK,IAAI,MAAM,QAAQ,IAAI;AAAA,QAC9C,QAAQ,mBAAmB;AAAA,QAC3B,QAAQ,UAAU;AAAA,QAClB,QAAQ,SAAS,CAAC;AAAA,MACtB,CAAC;AAED,eAAS;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT,OAAO;AAAA,MACX,CAAC;AAAA,IACL,SAAS,KAAK;AACV,eAAS,CAAC,UAAU;AAAA,QAChB,GAAG;AAAA,QACH,SAAS;AAAA,QACT,OAAO,eAAe,QAAQ,IAAI,UAAU;AAAA,MAChD,EAAE;AAAA,IACN;AAAA,EACJ,GAAG,CAAC,OAAO,CAAC;AAGZ,EAAAD,WAAU,MAAM;AACZ,QAAI,CAAC,WAAW,SAAS;AACrB,iBAAW,UAAU;AACrB,gBAAU,IAAI;AAAA,IAClB;AAAA,EACJ,GAAG,CAAC,CAAC;AAGL,QAAM,UAAUC,aAAY,MAAM;AAC9B,cAAU,IAAI;AAAA,EAClB,GAAG,CAAC,SAAS,CAAC;AAEd,SAAO;AAAA,IACH,GAAG;AAAA,IACH;AAAA,EACJ;AACJ;;;ACvEA,OAAOC,WAAS,QAAAC,aAAY;AAC5B,SAAS,OAAAC,OAAK,QAAAC,cAAY;AAC1B,OAAOC,cAAa;;;ACFpB,OAAOC,WAAS,YAAY;AAC5B,SAAS,OAAAC,OAAK,QAAAC,cAAY;AAOnB,IAAM,cAAc,KAAuB,CAAC,EAAE,QAAQ,MAAM;AAC/D,MAAI,QAAQ,SAAS,QAAQ;AACzB,WACI,gBAAAF,QAAA,cAACC,OAAA,EAAI,eAAc,UAAS,cAAc,KACtC,gBAAAD,QAAA,cAACE,QAAA,EAAK,OAAM,QAAO,MAAI,QAAC,MAAI,GAC5B,gBAAAF,QAAA,cAACE,QAAA,EAAK,MAAK,UAAQ,QAAQ,OAAQ,CACvC;AAAA,EAER;AAEA,MAAI,QAAQ,SAAS,aAAa;AAC9B,WACI,gBAAAF,QAAA,cAACC,OAAA,EAAI,eAAc,UAAS,cAAc,KACtC,gBAAAD,QAAA,cAACE,QAAA,EAAK,OAAM,SAAQ,MAAI,QAAC,OAAK,GAC9B,gBAAAF,QAAA,cAACE,QAAA,EAAK,MAAK,UAAQ,QAAQ,OAAQ,CACvC;AAAA,EAER;AAEA,SACI,gBAAAF,QAAA,cAACC,OAAA,EAAI,cAAc,KACf,gBAAAD,QAAA,cAACE,QAAA,EAAK,UAAQ,MAAC,QAAM,QAAE,QAAQ,OAAQ,CAC3C;AAER,CAAC;;;AChCD,OAAOC,WAAS,QAAAC,aAAY;AAC5B,SAAS,OAAAC,OAAK,QAAAC,cAAY;AAC1B,OAAOC,gBAAe;AAUf,IAAM,WAAWH,MAAoB,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,UAAU;AACd,MACI,gBAAAD,QAAA,cAACE,OAAA,EAAI,aAAY,SAAQ,aAAY,QAAO,UAAU,KAClD,gBAAAF,QAAA,cAACG,QAAA,EAAK,OAAM,UAAO,SAAE,GACpB,CAAC,WACE,gBAAAH,QAAA;AAAA,EAACI;AAAA,EAAA;AAAA,IACG;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAY;AAAA,IACZ,OAAO;AAAA;AACX,IAEA,gBAAAJ,QAAA,cAACG,QAAA,EAAK,UAAQ,QAAC,YAAU,CAEjC,CACH;;;AFXD,IAAM,cAAcE,MAAK,CAAC,EAAE,SAAS,MAAmC;AACpE,QAAM,UAAU,SAAS,MAAM,EAAE;AACjC,QAAM,SAAS,SAAS,SAAS,QAAQ;AAEzC,MAAI,QAAQ,WAAW,GAAG;AACtB,WACI,gBAAAC,QAAA,cAACC,OAAA,EAAI,eAAc,UAAS,YAAW,UAAS,SAAS,KACrD,gBAAAD,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAC,yBAAuB,GACtC,gBAAAF,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAC,qBAAmB,CACtC;AAAA,EAER;AAEA,SACI,gBAAAF,QAAA,cAAAA,QAAA,gBACK,SAAS,KAAK,gBAAAA,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAC,KAAE,QAAO,WAAS,GAC/C,QAAQ,IAAI,CAAC,MAAM,gBAAAF,QAAA,cAAC,eAAY,KAAK,EAAE,IAAI,SAAS,GAAG,CAAE,CAC9D;AAER,CAAC;AAGD,IAAM,YAAYD,MAAK,CAAC,EAAE,UAAU,MAAM,MACtC,gBAAAC,QAAA,cAACC,OAAA,EAAI,eAAc,UAAS,aAAY,SAAQ,aAAY,QAAO,UAAU,KACzE,gBAAAD,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAM,UAAO,UAAQ,GAC/B,SAAS,IAAI,CAAC,KAAK,MAChB,gBAAAF,QAAA;AAAA,EAACE;AAAA,EAAA;AAAA,IACG,KAAK,IAAI;AAAA,IACT,iBAAiB,MAAM,QAAQ,SAAS;AAAA,IACxC,OAAO,MAAM,QAAQ,UAAU;AAAA;AAAA,EAE9B,MAAM,QAAQ,YAAO;AAAA,EAAK;AAAA,EAAE,IAAI;AAAA,EAAK;AAAA,EAAI,IAAI;AAClD,CACH,CACL,CACH;AAEM,IAAM,YAAsC,CAAC;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,gBAAgB,CAAC;AAAA,EACjB,iBAAiB;AAAA,EACjB,YAAY;AAChB,MAAM;AAEF,QAAM,oBAAoB,KAAK,IAAI,GAAG,YAAY,KAAK,gBAAgB,IAAI,EAAE;AAE7E,SACI,gBAAAF,QAAA,cAACC,OAAA,EAAI,eAAc,YAEf,gBAAAD,QAAA,cAACC,OAAA,EAAI,eAAc,UAAS,aAAY,SAAQ,aAAY,QAAO,SAAS,GAAG,WAAW,qBACtF,gBAAAD,QAAA,cAAC,eAAY,UAAoB,GAChC,eACG,gBAAAA,QAAA,cAACE,QAAA,EAAK,OAAM,WAAQ,gBAAAF,QAAA,cAACG,UAAA,EAAQ,MAAK,QAAO,GAAE,gBAAc,CAEjE,GAGC,iBAAiB,cAAc,SAAS,KACrC,gBAAAH,QAAA,cAAC,aAAU,UAAU,eAAe,OAAO,gBAAgB,GAI/D,gBAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACG,OAAO;AAAA,MACP,UAAU;AAAA,MACV;AAAA,MACA,UAAU;AAAA,MACV,SAAS;AAAA;AAAA,EACb,CACJ;AAER;;;AGnGA,OAAOI,WAAS,YAAAC,kBAAgB;AAChC,SAAS,OAAAC,OAAK,QAAAC,QAAM,YAAAC,kBAAgB;AAU7B,IAAM,gBAA8C,CAAC;AAAA,EACxD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MAAM;AACF,QAAM,gBAAgB,OAAO,OAAO,CAAC,MAAM,EAAE,OAAO;AACpD,QAAM,eAAe,cAAc,UAAU,CAAC,MAAM,EAAE,OAAO,YAAY;AACzE,QAAM,CAAC,eAAe,gBAAgB,IAAIH,WAAS,KAAK,IAAI,GAAG,YAAY,CAAC;AAE5E,EAAAG,WAAS,CAACC,QAAO,QAAQ;AACrB,QAAI,IAAI,QAAQ;AACZ,eAAS;AACT;AAAA,IACJ;AAEA,QAAI,IAAI,SAAS;AACb,uBAAiB,CAAC,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,CAAC;AAAA,IACpD,WAAW,IAAI,WAAW;AACtB,uBAAiB,CAAC,SAAS,KAAK,IAAI,cAAc,SAAS,GAAG,OAAO,CAAC,CAAC;AAAA,IAC3E,WAAW,IAAI,QAAQ;AACnB,YAAM,WAAW,cAAc,aAAa;AAC5C,UAAI,UAAU;AACV,iBAAS,SAAS,EAAE;AAAA,MACxB;AAAA,IACJ;AAAA,EACJ,CAAC;AAED,MAAI,cAAc,WAAW,GAAG;AAC5B,WACI,gBAAAL,QAAA;AAAA,MAACE;AAAA,MAAA;AAAA,QACG,eAAc;AAAA,QACd,aAAY;AAAA,QACZ,aAAY;AAAA,QACZ,SAAS;AAAA,QACT,OAAO;AAAA;AAAA,MAEP,gBAAAF,QAAA,cAACG,QAAA,EAAK,OAAM,OAAM,MAAI,QAAC,qBAEvB;AAAA,MACA,gBAAAH,QAAA,cAACG,QAAA,EAAK,UAAQ,QAAC,oBAAkB;AAAA,IACrC;AAAA,EAER;AAEA,SACI,gBAAAH,QAAA;AAAA,IAACE;AAAA,IAAA;AAAA,MACG,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,SAAS;AAAA,MACT,OAAO;AAAA;AAAA,IAEP,gBAAAF,QAAA,cAACE,OAAA,EAAI,cAAc,KACf,gBAAAF,QAAA,cAACG,QAAA,EAAK,MAAI,MAAC,OAAM,UAAO,4BAExB,CACJ;AAAA,IAEA,gBAAAH,QAAA,cAACE,OAAA,EAAI,eAAc,UAAS,cAAc,KACrC,cAAc,IAAI,CAAC,OAAO,MAAM;AAC7B,YAAM,aAAa,MAAM;AACzB,YAAM,YAAY,MAAM,OAAO;AAC/B,YAAM,OAAO,aAAa,WAAM;AAEhC,UAAI,YAAY;AAChB,UAAI,MAAM,eAAe,UAAa,MAAM,cAAc,QAAW;AACjE,oBAAY,KAAK,MAAM,SAAS,IAAI,MAAM,UAAU;AAAA,MACxD;AAEA,aACI,gBAAAF,QAAA,cAACE,OAAA,EAAI,KAAK,MAAM,IAAI,SAAS,KACzB,gBAAAF,QAAA;AAAA,QAACG;AAAA,QAAA;AAAA,UACG,iBAAiB,aAAa,SAAS;AAAA,UACvC,OAAO,aAAa,UAAU;AAAA;AAAA,QAE7B,aAAa,YAAO;AAAA,QACpB;AAAA,QAAK;AAAA,QAAE,MAAM;AAAA,QACb,YAAY,YAAO;AAAA,QACnB;AAAA,MACL,CACJ;AAAA,IAER,CAAC,CACL;AAAA,IAEA,gBAAAH,QAAA,cAACE,OAAA,EAAI,aAAY,UAAS,aAAY,QAAO,UAAU,KACnD,gBAAAF,QAAA,cAACG,QAAA,EAAK,UAAQ,QAAC,uDAA2C,CAC9D;AAAA,EACJ;AAER;;;AN1FA,IAAM,iBAAiC;AAAA,EACnC,EAAE,MAAM,SAAS,aAAa,uBAAuB,SAAS,CAAC,GAAG,EAAE;AAAA,EACpE,EAAE,MAAM,SAAS,aAAa,+BAA+B,SAAS,CAAC,GAAG,EAAE;AAAA,EAC5E,EAAE,MAAM,QAAQ,aAAa,iBAAiB,SAAS,CAAC,KAAK,MAAM,EAAE;AACzE;AASO,IAAM,UAAkC,CAAC,EAAE,SAAS,aAAa,MAAM;AAC1E,QAAM,EAAE,KAAK,IAAIG,QAAO;AACxB,QAAM,EAAE,OAAO,IAAIC,WAAU;AAG7B,QAAM,gBAAgBC,QAAO,KAAK,IAAI,KAAK,QAAQ,QAAQ,MAAM,CAAC,CAAC;AAGnE,QAAM,CAAC,aAAa,cAAc,IAAIC,WAAmB,SAAS;AAClE,QAAM,CAAC,eAAe,gBAAgB,IAAIA,WAAS,KAAK;AACxD,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,WAAS,CAAC;AACtD,QAAM,CAAC,YAAY,aAAa,IAAIA,WAAS,EAAE;AAC/C,QAAM,CAAC,eAAe,gBAAgB,IAAIA,WAAiB,EAAE;AAG7D,QAAM,EAAE,QAAQ,SAAS,OAAO,QAAQ,IAAI,UAAU,OAAO;AAG7D,QAAM,EAAE,UAAU,aAAa,YAAY,IAAI,QAAQ,OAAO;AAG9D,EAAAC,WAAU,MAAM;AACZ,QAAI,SAAS,CAAC,SAAS;AACnB,qBAAe,OAAO;AACtB;AAAA,IACJ;AACA,QAAI,OAAO,SAAS,KAAK,CAAC,eAAe;AACrC,YAAM,QAAQ,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO;AAC1C,UAAI,OAAO;AACP,yBAAiB,gBAAgB,MAAM,EAAE;AACzC,uBAAe,MAAM;AAAA,MACzB;AAAA,IACJ;AAAA,EACJ,GAAG,CAAC,QAAQ,eAAe,cAAc,OAAO,OAAO,CAAC;AAGxD,QAAM,mBAAmBC,SAAQ,MAAM;AACnC,QAAI,CAAC,WAAW,WAAW,GAAG,EAAG,QAAO;AACxC,UAAM,SAAS,WAAW,MAAM,CAAC,EAAE,YAAY;AAC/C,WAAO,eAAe;AAAA,MAClB,CAAC,QAAQ,IAAI,KAAK,SAAS,MAAM,KAAK,IAAI,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM,CAAC;AAAA,IACrF;AAAA,EACJ,GAAG,CAAC,UAAU,CAAC;AAGf,QAAM,aAAaC,aAAY,MAAM;AACjC,UAAM,UAAU,OAAO,OAAO,CAAC,MAAM,EAAE,OAAO;AAC9C,QAAI,QAAQ,WAAW,EAAG;AAC1B,UAAM,MAAM,QAAQ,UAAU,CAAC,MAAM,EAAE,OAAO,aAAa;AAC3D,qBAAiB,SAAS,MAAM,KAAK,QAAQ,MAAM,EAAG,EAAE;AAAA,EAC5D,GAAG,CAAC,QAAQ,aAAa,CAAC;AAE1B,QAAM,cAAcA,aAAY,CAAC,QAAgB;AAC7C,UAAM,IAAI,IAAI,YAAY,EAAE,QAAQ,OAAO,EAAE;AAC7C,QAAI,MAAM,WAAW,MAAM,KAAK;AAAE,qBAAe,OAAO;AAAG,aAAO;AAAA,IAAM;AACxE,QAAI,MAAM,WAAW,MAAM,KAAK;AAAE,qBAAe,OAAO;AAAG,cAAQ;AAAG,aAAO;AAAA,IAAM;AACnF,QAAI,MAAM,UAAU,MAAM,OAAO,MAAM,QAAQ;AAAE,WAAK;AAAG,aAAO;AAAA,IAAM;AACtE,WAAO;AAAA,EACX,GAAG,CAAC,SAAS,IAAI,CAAC;AAGlB,EAAAC,WAAS,CAACC,QAAO,QAAQ;AACrB,QAAI,eAAe;AACf,UAAI,IAAI,SAAS;AAAE,0BAAkB,CAAC,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC,CAAC;AAAG;AAAA,MAAQ;AACzE,UAAI,IAAI,WAAW;AAAE,0BAAkB,CAAC,MAAM,KAAK,IAAI,iBAAiB,SAAS,GAAG,IAAI,CAAC,CAAC;AAAG;AAAA,MAAQ;AACrG,UAAI,IAAI,UAAU,iBAAiB,cAAc,GAAG;AAChD,yBAAiB,KAAK;AACtB,oBAAY,iBAAiB,cAAc,EAAE,IAAI;AACjD,sBAAc,EAAE;AAChB;AAAA,MACJ;AAAA,IACJ;AACA,QAAI,IAAI,QAAQ;AACZ,UAAI,eAAe;AAAE,yBAAiB,KAAK;AAAG,sBAAc,EAAE;AAAA,MAAG,WACxD,gBAAgB,UAAU,gBAAgB,aAAa,gBAAgB,SAAS;AAAE,uBAAe,MAAM;AAAA,MAAG,OAC9G;AAAE,aAAK;AAAA,MAAG;AACf;AAAA,IACJ;AAEA,QAAI,gBAAgB,YAAY,IAAI,UAAUA,WAAU,MAAM;AAC1D,qBAAe,SAAS;AACxB,cAAQ;AACR;AAAA,IACJ;AACA,QAAI,IAAI,OAAO,gBAAgB,UAAU,CAAC,iBAAiB,CAAC,aAAa;AACrE,iBAAW;AAAA,IACf;AAAA,EACJ,GAAG,EAAE,UAAU,KAAK,CAAC;AAErB,QAAM,gBAAgBF,aAAY,CAAC,MAAc;AAC7C,kBAAc,CAAC;AACf,UAAM,OAAO,EAAE,WAAW,GAAG;AAC7B,qBAAiB,IAAI;AACrB,QAAI,QAAQ,MAAM,IAAK,mBAAkB,CAAC;AAAA,EAC9C,GAAG,CAAC,CAAC;AAEL,QAAM,WAAWA,aAAY,CAAC,MAAc;AACxC,UAAM,IAAI,EAAE,KAAK;AACjB,qBAAiB,KAAK;AACtB,QAAI,EAAE,WAAW,GAAG,KAAK,YAAY,CAAC,GAAG;AAAE,oBAAc,EAAE;AAAG;AAAA,IAAQ;AACtE,QAAI,KAAK,CAAC,eAAe,eAAe;AAAE,kBAAY,GAAG,aAAa;AAAG,oBAAc,EAAE;AAAA,IAAG;AAAA,EAChG,GAAG,CAAC,aAAa,aAAa,eAAe,WAAW,CAAC;AAEzD,QAAM,gBAAgBA,aAAY,CAAC,OAAe;AAC9C,qBAAiB,EAAE;AACnB,mBAAe,MAAM;AAAA,EACzB,GAAG,CAAC,CAAC;AAGL,QAAM,YAAYD,SAAQ,MAAM;AAC5B,UAAM,UAAU,OAAO,OAAO,CAAC,MAAM,EAAE,OAAO;AAC9C,WACI,gBAAAI,QAAA,cAACC,OAAA,EAAI,eAAc,UAAS,aAAY,SAAQ,aAAY,QAAO,SAAS,KACxE,gBAAAD,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAM,UAAO,kCAAyB,GAChD,QAAQ,IAAI,CAAC,MAAM;AAChB,YAAM,QAAQ,EAAE,cAAc;AAC9B,YAAM,OAAO,EAAE,aAAa;AAC5B,YAAM,MAAM,QAAQ,IAAI,KAAK,MAAO,OAAO,QAAS,GAAG,IAAI;AAC3D,YAAM,MAAM,SAAI,OAAO,KAAK,MAAM,MAAM,CAAC,CAAC,IAAI,SAAI,OAAO,KAAK,KAAK,MAAM,MAAM,CAAC,CAAC;AACjF,aACI,gBAAAF,QAAA,cAACC,OAAA,EAAI,KAAK,EAAE,IAAI,eAAc,YAC1B,gBAAAD,QAAA,cAACE,QAAA,EAAK,OAAO,EAAE,OAAO,gBAAgB,WAAW,WAC5C,EAAE,OAAO,gBAAgB,YAAO,MAAM,EAAE,EAC7C,GACA,gBAAAF,QAAA,cAACE,QAAA,EAAK,OAAO,MAAM,KAAK,QAAQ,MAAM,KAAK,WAAW,WACjD,QAAQ,KAAI,KAAC,gBAAAF,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAE,MAAK,KAAE,KAAM,CAC/C,CACJ;AAAA,IAER,CAAC,GACD,gBAAAF,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAC,YAAU,CAC7B;AAAA,EAER,GAAG,CAAC,QAAQ,aAAa,CAAC;AAG1B,QAAM,SAAS,gBAAgB,UACzB,sCACA,gBAAgB,WAAW,gBAAgB,UAC3C,oEACA,gBACA,sEACA;AAEN,SACI,gBAAAF,QAAA,cAACC,OAAA,EAAI,eAAc,YAEf,gBAAAD,QAAA,cAACC,OAAA,EAAI,aAAY,UAAS,aAAY,WAAU,UAAU,KACtD,gBAAAD,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAM,aAAU,qBAAY,GACvC,gBAAAF,QAAA,cAACC,OAAA,EAAI,UAAU,GAAG,GAClB,gBAAAD,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAC,SAAO,GACtB,gBAAAF,QAAA,cAACE,QAAA,EAAK,OAAM,UAAS,MAAI,QAAE,iBAAiB,KAAM,CACtD,GAGC,gBAAgB,YACb,gBAAAF,QAAA,cAACC,OAAA,EAAI,SAAS,GAAG,WAAW,cAAc,SAAS,YAAW,UAAS,gBAAe,YAClF,gBAAAD,QAAA,cAACE,QAAA,MAAK,gBAAAF,QAAA,cAACG,UAAA,EAAQ,MAAK,QAAO,GAAE,aAAW,CAC5C,IACA,gBAAgB,UAChB,gBAAAH,QAAA,cAACC,OAAA,EAAI,SAAS,GAAG,WAAW,cAAc,SAAS,YAAW,UAAS,gBAAe,UAAS,eAAc,YACzG,gBAAAD,QAAA,cAACE,QAAA,EAAK,OAAM,OAAM,MAAI,QAAC,kBAAgB,GACvC,gBAAAF,QAAA,cAACE,QAAA,EAAK,OAAM,SAAO,KAAM,GACzB,gBAAAF,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAC,GAAC,GAChB,gBAAAF,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAC,6BAA2B,CAC9C,IACA,gBAAgB,UAChB,gBAAAF,QAAA,cAACC,OAAA,EAAI,SAAS,GAAG,WAAW,cAAc,SAAS,gBAAe,UAAS,YAAW,YAClF,gBAAAD,QAAA;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA,cAAc;AAAA,MACd,UAAU;AAAA,MACV,UAAU,MAAM,eAAe,MAAM;AAAA;AAAA,EACzC,CACJ,IACA,gBAAgB,UAChB,gBAAAA,QAAA,cAACC,OAAA,EAAI,SAAS,GAAG,WAAW,cAAc,SAAS,gBAAe,UAAS,YAAW,YACjF,SACL,IAEA,gBAAAD,QAAA;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc,CAAC;AAAA,MACf;AAAA,MACA,eAAe;AAAA,MACf;AAAA,MACA,WAAW,cAAc;AAAA;AAAA,EAC7B,GAIJ,gBAAAA,QAAA,cAACC,OAAA,EAAI,aAAY,UAAS,aAAY,QAAO,UAAU,KACnD,gBAAAD,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAE,MAAO,CAC3B,CACJ;AAER;;;AOhOA,OAAO,UAAU;AACjB,OAAOE,UAAQ;AACf,OAAOC,WAAU;AACjB,SAAS,qBAAqB;;;ACJ9B,OAAO,YAAY;AAiBnB,IAAM,iBAAiB;AACvB,IAAM,sBAAsB;AAErB,IAAM,iBAAN,MAAqB;AAAA,EAChB,WAAiC,oBAAI,IAAI;AAAA,EACzC,kBAAyC;AAAA,EAEjD,cAAc;AAEV,SAAK,aAAa;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAwB;AACpB,UAAM,cAAc,OAAO,YAAY,EAAE,EAAE,SAAS,KAAK;AACzD,WAAO,GAAG,cAAc,GAAG,WAAW;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,QAAgC;AAC1C,UAAM,QAAQ,KAAK,cAAc;AACjC,UAAM,MAAM,oBAAI,KAAK;AACrB,UAAM,aAAa,OAAO,cAAc;AAExC,UAAM,UAAmB;AAAA,MACrB;AAAA,MACA,WAAW,OAAO;AAAA,MAClB,QAAQ,OAAO;AAAA,MACf,WAAW;AAAA,MACX,WAAW,IAAI,KAAK,IAAI,QAAQ,IAAI,aAAa,KAAK,GAAI;AAAA,MAC1D,cAAc;AAAA,IAClB;AAEA,SAAK,SAAS,IAAI,OAAO,OAAO;AAChC,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAgB,OAA+B;AAC3C,QAAI,CAAC,SAAS,CAAC,MAAM,WAAW,cAAc,GAAG;AAC7C,aAAO;AAAA,IACX;AAEA,UAAM,UAAU,KAAK,SAAS,IAAI,KAAK;AACvC,QAAI,CAAC,SAAS;AACV,aAAO;AAAA,IACX;AAGA,QAAI,oBAAI,KAAK,IAAI,QAAQ,WAAW;AAChC,WAAK,SAAS,OAAO,KAAK;AAC1B,aAAO;AAAA,IACX;AAGA,YAAQ,eAAe,oBAAI,KAAK;AAChC,YAAQ,YAAY,IAAI;AAAA,MACpB,QAAQ,aAAa,QAAQ,IAAI,sBAAsB,KAAK;AAAA,IAChE;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,OAA+B;AACtC,QAAI,CAAC,SAAS,CAAC,MAAM,WAAW,cAAc,GAAG;AAC7C,aAAO;AAAA,IACX;AAEA,UAAM,UAAU,KAAK,SAAS,IAAI,KAAK;AACvC,QAAI,CAAC,SAAS;AACV,aAAO;AAAA,IACX;AAEA,QAAI,oBAAI,KAAK,IAAI,QAAQ,WAAW;AAChC,WAAK,SAAS,OAAO,KAAK;AAC1B,aAAO;AAAA,IACX;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,OAAqB;AACnC,SAAK,SAAS,OAAO,KAAK;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,OAAuB;AACjC,UAAM,UAAU,KAAK,WAAW,KAAK;AACrC,QAAI,CAAC,SAAS;AACV,aAAO;AAAA,IACX;AAEA,UAAM,YAAY,QAAQ,UAAU,QAAQ,IAAI,KAAK,IAAI;AACzD,WAAO,KAAK,IAAI,GAAG,KAAK,MAAM,YAAY,GAAI,CAAC;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAqB;AAEzB,SAAK,kBAAkB,YAAY,MAAM;AACrC,YAAM,MAAM,oBAAI,KAAK;AACrB,iBAAW,CAAC,OAAO,OAAO,KAAK,KAAK,SAAS,QAAQ,GAAG;AACpD,YAAI,MAAM,QAAQ,WAAW;AACzB,eAAK,SAAS,OAAO,KAAK;AAAA,QAC9B;AAAA,MACJ;AAAA,IACJ,GAAG,IAAI,KAAK,GAAI;AAGhB,SAAK,gBAAgB,MAAM;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,cAAoB;AAChB,QAAI,KAAK,iBAAiB;AACtB,oBAAc,KAAK,eAAe;AAClC,WAAK,kBAAkB;AAAA,IAC3B;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,WAAiB;AACb,SAAK,SAAS,MAAM;AACpB,SAAK,YAAY;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,wBAAgC;AAC5B,WAAO,KAAK,SAAS;AAAA,EACzB;AACJ;;;ACzKA,OAAOC,SAAQ;AACf,OAAOC,WAAU;AACjB,OAAO,YAAwB;AAG/B,IAAM,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;AAGA,IAAM,kBAAkB,oBAAI,IAAI;AAAA;AAAA,EAE5B;AAAA,EAAS;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAS;AAAA,EAAS;AAAA,EAC3C;AAAA,EAAO;AAAA,EAAQ;AAAA,EAAO;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACtC;AAAA,EAAQ;AAAA,EAAW;AAAA;AAAA,EAEnB;AAAA,EAAS;AAAA,EAAS;AAAA,EAAQ;AAAA,EAAS;AAAA,EAAQ;AAAA;AAAA,EAE3C;AAAA,EAAO;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA;AAAA,EAE/B;AAAA,EAAgB;AAAA,EAAc;AAAA,EAAiB;AAAA,EAAU;AAAA,EACzD;AAAA,EAAiB;AAAA,EAAe;AAAA,EAAa;AAAA;AAAA,EAE7C;AAAA,EAAQ;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAS;AAAA,EAAO;AAAA,EAC7C;AAAA,EAAO;AAAA,EAAU;AAAA,EAAM;AAAA,EAAQ;AAAA,EAAM;AAAA,EAAQ;AAAA;AAAA,EAE7C;AAAA,EAAO;AAAA,EAAS;AAAA,EAAQ;AAAA,EAAS;AAAA,EAAQ;AAAA,EAAQ;AAAA;AAAA,EAEjD;AAAA,EAAQ;AAAA,EAAW;AAAA,EAAY;AAAA;AAAA,EAE/B;AAAA,EAAe;AAAA,EAAa;AAAA,EAAS;AACzC,CAAC;AAGD,IAAM,aAAa,oBAAI,IAAI;AAAA,EACvB;AAAA,EAAY;AAAA,EAAc;AAAA,EAAe;AAAA,EAAW;AAAA,EACpD;AAAA,EAAY;AAAA,EAAY;AAAA,EAAc;AAAA,EAAiB;AAAA,EACvD;AAAA,EAAU;AAAA,EAAgB;AAAA,EAAW;AAAA,EAAU;AAAA,EAC/C;AAAA,EAAgB;AAAA,EAAW;AAC/B,CAAC;AA2BD,SAAS,YAAY,UAA0B;AAC3C,QAAM,MAAMA,MAAK,QAAQ,QAAQ,EAAE,YAAY;AAC/C,QAAM,UAAkC;AAAA,IACpC,OAAO;AAAA,IAAc,QAAQ;AAAA,IAC7B,OAAO;AAAA,IAAc,QAAQ;AAAA,IAC7B,QAAQ;AAAA,IAAc,QAAQ;AAAA,IAC9B,OAAO;AAAA,IACP,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,UAAU;AAAA,IACV,MAAM;AAAA,IAAK,MAAM;AAAA,IACjB,QAAQ;AAAA,IAAO,QAAQ;AAAA,IACvB,OAAO;AAAA,IACP,QAAQ;AAAA,IAAO,SAAS;AAAA,IAAQ,SAAS;AAAA,IAAQ,SAAS;AAAA,IAC1D,SAAS;AAAA,IAAQ,QAAQ;AAAA,IACzB,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,SAAS;AAAA,IACT,SAAS;AAAA,IAAQ,QAAQ;AAAA,IACzB,QAAQ;AAAA,IACR,OAAO;AAAA,IAAY,QAAQ;AAAA,IAC3B,QAAQ;AAAA,IACR,YAAY;AAAA,IAAW,QAAQ;AAAA,IAC/B,OAAO;AAAA,IAAQ,SAAS;AAAA,IAAQ,QAAQ;AAAA,IACxC,eAAe;AAAA,IACf,WAAW;AAAA,EACf;AACA,SAAO,QAAQ,GAAG,KAAK;AAC3B;AAKA,SAAS,WAAW,UAA2B;AAC3C,QAAM,MAAMA,MAAK,QAAQ,QAAQ,EAAE,YAAY;AAC/C,QAAM,OAAOA,MAAK,SAAS,QAAQ;AAEnC,MAAI,WAAW,IAAI,IAAI,EAAG,QAAO;AACjC,MAAI,OAAO,gBAAgB,IAAI,GAAG,EAAG,QAAO;AAG5C,MAAI,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,QAAQ,EAAG,QAAO;AAE3D,SAAO;AACX;AAEO,IAAM,cAAN,MAAkB;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,SAA6B;AACrC,SAAK,aAAaA,MAAK,QAAQ,QAAQ,UAAU;AACjD,SAAK,cAAc,QAAQ,eAAe,OAAO;AACjD,SAAK,qBAAqB,QAAQ,sBAAsB;AACxD,SAAK,mBAAmB,QAAQ,oBAAoB;AAGpD,SAAK,eAAe,OAAO;AAC3B,SAAK,mBAAmB;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAA2B;AAE/B,SAAK,aAAa,IAAI,eAAe;AAGrC,UAAM,gBAAgBA,MAAK,KAAK,KAAK,YAAY,YAAY;AAC7D,QAAI;AACA,UAAID,IAAG,WAAW,aAAa,GAAG;AAC9B,cAAM,UAAUA,IAAG,aAAa,eAAe,OAAO;AACtD,aAAK,aAAa,IAAI,OAAO;AAAA,MACjC;AAAA,IACJ,QAAQ;AAAA,IAER;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKQ,UAAU,cAA+B;AAE7C,UAAM,iBAAiB,aAAa,QAAQ,OAAO,GAAG;AACtD,WAAO,KAAK,aAAa,QAAQ,cAAc;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,cAA8B;AAE/C,UAAM,YAAY,aAAa,QAAQ,QAAQ,EAAE;AAGjD,UAAM,eAAeC,MAAK,QAAQ,KAAK,YAAY,SAAS;AAG5D,QAAI,CAAC,aAAa,WAAW,KAAK,aAAaA,MAAK,GAAG,KAAK,iBAAiB,KAAK,YAAY;AAC1F,YAAM,IAAI,MAAM,yBAAyB;AAAA,IAC7C;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,cAA8B;AAClD,WAAOA,MAAK,SAAS,KAAK,YAAY,YAAY;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,YAAY,OAAe,OAAqC;AAClE,UAAM,aAAa,KAAK,IAAI,SAAS,KAAK,kBAAkB,EAAE;AAC9D,UAAM,UAAsB,CAAC;AAC7B,UAAM,kBAAkB,MAAM,YAAY,EAAE,QAAQ,OAAO,GAAG;AAG9D,UAAM,YAAY,OAAO,SAAiB,QAAgB,MAAqB;AAE3E,UAAI,QAAQ,MAAM,QAAQ,UAAU,WAAY;AAEhD,UAAI;AACA,cAAM,UAAU,MAAMD,IAAG,SAAS,QAAQ,SAAS,EAAE,eAAe,KAAK,CAAC;AAE1E,mBAAW,SAAS,SAAS;AACzB,cAAI,QAAQ,UAAU,WAAY;AAElC,gBAAM,YAAYC,MAAK,KAAK,SAAS,MAAM,IAAI;AAC/C,gBAAM,eAAe,KAAK,gBAAgB,SAAS;AAGnD,cAAI,KAAK,UAAU,YAAY,EAAG;AAGlC,gBAAM,oBAAoB,aAAa,YAAY,EAAE,QAAQ,OAAO,GAAG;AACvE,cAAI,kBAAkB,SAAS,eAAe,GAAG;AAE7C,gBAAI,MAAM,OAAO,KAAK,WAAW,MAAM,IAAI,GAAG;AAC1C,kBAAI;AACA,sBAAM,OAAO,MAAMD,IAAG,SAAS,KAAK,SAAS;AAC7C,wBAAQ,KAAK;AAAA,kBACT,MAAM;AAAA,kBACN,MAAM,MAAM;AAAA,kBACZ,MAAM,KAAK;AAAA,kBACX,MAAM;AAAA,kBACN,WAAWC,MAAK,QAAQ,MAAM,IAAI,EAAE,MAAM,CAAC,KAAK;AAAA,gBACpD,CAAC;AAAA,cACL,QAAQ;AAAA,cAER;AAAA,YACJ;AAAA,UACJ;AAGA,cAAI,MAAM,YAAY,GAAG;AACrB,kBAAM,UAAU,WAAW,QAAQ,CAAC;AAAA,UACxC;AAAA,QACJ;AAAA,MACJ,QAAQ;AAAA,MAER;AAAA,IACJ;AAEA,UAAM,UAAU,KAAK,UAAU;AAG/B,YAAQ,KAAK,CAAC,GAAG,MAAM;AACnB,UAAI,EAAE,KAAK,WAAW,EAAE,KAAK,QAAQ;AACjC,eAAO,EAAE,KAAK,SAAS,EAAE,KAAK;AAAA,MAClC;AACA,aAAO,EAAE,KAAK,cAAc,EAAE,IAAI;AAAA,IACtC,CAAC;AAED,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,cAA4C;AACvD,UAAM,eAAe,KAAK,aAAa,YAAY;AACnD,UAAM,oBAAoB,KAAK,gBAAgB,YAAY;AAG3D,QAAI,KAAK,UAAU,iBAAiB,GAAG;AACnC,YAAM,IAAI,MAAM,kCAAkC;AAAA,IACtD;AAGA,QAAI,CAAC,WAAW,YAAY,GAAG;AAC3B,YAAM,IAAI,MAAM,6BAA6B;AAAA,IACjD;AAGA,UAAM,OAAO,MAAMD,IAAG,SAAS,KAAK,YAAY;AAEhD,QAAI,CAAC,KAAK,OAAO,GAAG;AAChB,YAAM,IAAI,MAAM,oBAAoB;AAAA,IACxC;AAGA,QAAI,KAAK,OAAO,KAAK,aAAa;AAC9B,YAAM,IAAI,MAAM,gCAAgC,KAAK,MAAM,KAAK,cAAc,IAAI,CAAC,IAAI;AAAA,IAC3F;AAGA,UAAM,UAAU,MAAMA,IAAG,SAAS,SAAS,cAAc,OAAO;AAEhE,WAAO;AAAA,MACH,MAAM;AAAA,MACN;AAAA,MACA,MAAM,KAAK;AAAA,MACX,UAAU,YAAY,YAAY;AAAA,IACtC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,eAA2E;AAEvF,UAAM,QAAQ,cAAc,MAAM,GAAG,KAAK,kBAAkB;AAE5D,UAAM,UAAU,MAAM,QAAQ;AAAA,MAC1B,MAAM,IAAI,OAAO,aAAa;AAC1B,YAAI;AACA,gBAAM,UAAU,MAAM,KAAK,SAAS,QAAQ;AAC5C,iBAAO;AAAA,QACX,SAAS,OAAO;AACZ,iBAAO;AAAA,YACH,MAAM;AAAA,YACN,SAAS;AAAA,YACT,MAAM;AAAA,YACN,UAAU;AAAA,YACV,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,UACpD;AAAA,QACJ;AAAA,MACJ,CAAC;AAAA,IACL;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAwB;AACpB,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,mBAA2B;AACvB,WAAO,KAAK;AAAA,EAChB;AACJ;;;AFxWA,IAAM,aAAa,cAAc,YAAY,GAAG;AAChD,IAAM,YAAYE,MAAK,QAAQ,UAAU;AAGzC,IAAM,aAAqC;AAAA,EACvC,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AACZ;AAiBA,eAAe,kBAAkB,WAAmB,SAAkC;AAClF,WAAS,OAAO,WAAW,QAAQ,SAAS,QAAQ;AAChD,QAAI;AACA,YAAM,IAAI,QAAc,CAACC,UAAS,WAAW;AACzC,cAAM,SAAS,KAAK,aAAa;AACjC,eAAO,OAAO,MAAM,WAAW;AAC/B,eAAO,KAAK,aAAa,MAAM;AAC3B,iBAAO,MAAM,MAAMA,SAAQ,CAAC;AAAA,QAChC,CAAC;AACD,eAAO,KAAK,SAAS,MAAM;AAAA,MAC/B,CAAC;AACD,aAAO;AAAA,IACX,QAAQ;AACJ;AAAA,IACJ;AAAA,EACJ;AACA,QAAM,IAAI,MAAM,oCAAoC,SAAS,IAAI,OAAO,EAAE;AAC9E;AAKA,eAAe,cAAc,KAA6C;AACtE,SAAO,IAAI,QAAQ,CAACA,UAAS,WAAW;AACpC,QAAI,OAAO;AACX,QAAI,GAAG,QAAQ,CAAC,UAAU;AACtB,cAAQ,MAAM,SAAS;AAAA,IAC3B,CAAC;AACD,QAAI,GAAG,OAAO,MAAM;AAChB,UAAI;AACA,QAAAA,SAAQ,OAAO,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC;AAAA,MACxC,SAAS,GAAG;AACR,eAAO,IAAI,MAAM,mBAAmB,CAAC;AAAA,MACzC;AAAA,IACJ,CAAC;AACD,QAAI,GAAG,SAAS,MAAM;AAAA,EAC1B,CAAC;AACL;AAKA,SAAS,SACL,KACA,YACA,MACI;AACJ,MAAI,UAAU,YAAY;AAAA,IACtB,gBAAgB;AAAA,IAChB,+BAA+B;AAAA,IAC/B,gCAAgC;AAAA,IAChC,gCAAgC;AAAA,EACpC,CAAC;AACD,MAAI,IAAI,KAAK,UAAU,IAAI,CAAC;AAChC;AAKA,SAAS,UACL,KACA,YACA,MACA,SACI;AACJ,WAAS,KAAK,YAAY;AAAA,IACtB,SAAS;AAAA,IACT,OAAO,EAAE,MAAM,QAAQ;AAAA,EAC3B,CAAC;AACL;AAKA,SAAS,gBAAgB,KAA0C;AAE/D,QAAM,cAAc,IAAI,QAAQ,iBAAiB;AACjD,MAAI,eAAe,OAAO,gBAAgB,UAAU;AAChD,WAAO;AAAA,EACX;AAGA,QAAM,MAAM,IAAI,IAAI,IAAI,OAAO,KAAK,UAAU,IAAI,QAAQ,IAAI,EAAE;AAChE,SAAO,IAAI,aAAa,IAAI,SAAS;AACzC;AAKO,SAAS,oBAAoB,SAA6C;AAC7E,QAAM,EAAE,OAAO,IAAI;AACnB,QAAM,OAAO,QAAQ,QAAQ;AAC7B,MAAI,OAAO,QAAQ,QAAQ;AAE3B,QAAM,iBAAiB,IAAI,eAAe;AAC1C,MAAI,SAA6B;AACjC,MAAI,UAA0B;AAI9B,QAAM,cAAc,IAAI,YAAY,EAAE,YAAY,QAAQ,IAAI,EAAE,CAAC;AAKjE,QAAM,YAAYD,MAAK,KAAK,WAAW,UAAU;AAKjD,iBAAe,gBACX,KACA,UACa;AACb,UAAM,WAAWA,MAAK,KAAK,WAAW,QAAQ;AAG9C,QAAI,CAAC,SAAS,WAAW,SAAS,GAAG;AACjC,gBAAU,KAAK,KAAK,cAAc,WAAW;AAC7C;AAAA,IACJ;AAEA,QAAI;AACA,YAAM,OAAO,MAAME,KAAG,SAAS,KAAK,QAAQ;AAC5C,UAAI,CAAC,KAAK,OAAO,GAAG;AAChB,kBAAU,KAAK,KAAK,cAAc,WAAW;AAC7C;AAAA,MACJ;AAEA,YAAM,MAAMF,MAAK,QAAQ,QAAQ;AACjC,YAAM,cAAc,WAAW,GAAG,KAAK;AAEvC,YAAM,UAAU,MAAME,KAAG,SAAS,SAAS,QAAQ;AACnD,UAAI,UAAU,KAAK,EAAE,gBAAgB,YAAY,CAAC;AAClD,UAAI,IAAI,OAAO;AAAA,IACnB,SAAS,OAAgB;AACrB,UAAI,SAAS,OAAO,UAAU,YAAY,UAAU,SAAS,MAAM,SAAS,UAAU;AAClF,kBAAU,KAAK,KAAK,cAAc,WAAW;AAAA,MACjD,OAAO;AACH,kBAAU,KAAK,KAAK,cAAc,uBAAuB;AAAA,MAC7D;AAAA,IACJ;AAAA,EACJ;AAKA,iBAAe,UACX,KACA,KACA,UACa;AAEb,QAAI,IAAI,WAAW,WAAW;AAC1B,UAAI,UAAU,KAAK;AAAA,QACf,+BAA+B;AAAA,QAC/B,gCAAgC;AAAA,QAChC,gCAAgC;AAAA,MACpC,CAAC;AACD,UAAI,IAAI;AACR;AAAA,IACJ;AAGA,QAAI,aAAa,WAAW;AACxB,eAAS,KAAK,KAAK,EAAE,QAAQ,KAAK,CAAC;AACnC;AAAA,IACJ;AAGA,UAAM,QAAQ,gBAAgB,GAAG;AACjC,UAAM,eAAe,QAAQ,eAAe,gBAAgB,KAAK,IAAI;AAErE,QAAI,CAAC,cAAc;AACf;AAAA,QACI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AACA;AAAA,IACJ;AAGA,UAAM,aAAa,IAAI,gBAAgB;AAAA,MACnC,WAAW,aAAa;AAAA,MACxB,QAAQ,aAAa;AAAA,IACzB,CAAC;AAGD,QAAI,aAAa,kBAAkB,IAAI,WAAW,OAAO;AAErD,UAAI;AACA,cAAM,SAAS,MAAM,WAAW,mBAAmB;AACnD,cAAM,gBAAgB,OACjB,OAAO,CAAC,MAAM,EAAE,OAAO,EACvB,IAAI,CAAC,MAAM,EAAE,EAAE;AAEpB,iBAAS,KAAK,KAAK;AAAA,UACf,SAAS;AAAA,UACT,MAAM;AAAA,YACF,WAAW,aAAa,UAAU,YAAY;AAAA,YAC9C,QAAQ;AAAA,UACZ;AAAA,QACJ,CAAC;AAAA,MACL,SAAS,OAAgB;AACrB,kBAAU,KAAK,KAAK,cAAc,mCAAmC;AAAA,MACzE;AACA;AAAA,IACJ;AAEA,QAAI,aAAa,iBAAiB,IAAI,WAAW,OAAO;AAEpD,UAAI;AACA,cAAM,SAAS,MAAM,WAAW,mBAAmB;AACnD,iBAAS,KAAK,KAAK;AAAA,UACf,SAAS;AAAA,UACT,MAAM,OAAO,OAAO,CAAC,MAAM,EAAE,OAAO;AAAA,QACxC,CAAC;AAAA,MACL,SAAS,OAAgB;AACrB,kBAAU,KAAK,KAAK,cAAc,mCAAmC;AAAA,MACzE;AACA;AAAA,IACJ;AAEA,QAAI,aAAa,gBAAgB,IAAI,WAAW,OAAO;AAEnD,UAAI;AACA,cAAM,CAAC,QAAQ,KAAK,IAAI,MAAM,QAAQ,IAAI;AAAA,UACtC,WAAW,UAAU;AAAA,UACrB,WAAW,SAAS,CAAC;AAAA;AAAA,QACzB,CAAC;AAGD,cAAM,SAAQ,oBAAI,KAAK,GAAE,mBAAmB,SAAS,EAAE,UAAU,mBAAmB,CAAC;AAGrF,cAAM,aAAiF,CAAC;AACxF,cAAM,gBAAgB,OAAO,0BAA0B,CAAC;AACxD,cAAM,aAAa,OAAO,uBAAuB,CAAC;AAElD,sBAAc,QAAQ,CAAC,YAAoB;AACvC,gBAAM,QAAQ,WAAW,OAAO,KAAK,WAAW,QAAQ,YAAY,CAAC,KAAK;AAC1E,gBAAM,eAAe,MAAM,QAAQ,CAAC,GAAG;AAAA,YACnC,CAAC,OAAO,EAAE,UAAU,WAAW,EAAE,MAAM,YAAY,MAAM,QAAQ,YAAY,MAAM,EAAE,SAAS;AAAA,UAClG;AACA,gBAAM,OAAO,aAAa,SAAS;AAEnC,qBAAW,OAAO,IAAI;AAAA,YAClB;AAAA,YACA;AAAA,YACA,WAAW,KAAK,IAAI,GAAG,QAAQ,IAAI;AAAA,UACvC;AAAA,QACJ,CAAC;AAED,iBAAS,KAAK,KAAK;AAAA,UACf,SAAS;AAAA,UACT,MAAM;AAAA,YACF,MAAM;AAAA,YACN,QAAQ;AAAA,UACZ;AAAA,QACJ,CAAC;AAAA,MACL,SAAS,OAAgB;AACrB,kBAAU,KAAK,KAAK,cAAc,mCAAmC;AAAA,MACzE;AACA;AAAA,IACJ;AAIA,QAAI,aAAa,uBAAuB,IAAI,WAAW,OAAO;AAE1D,UAAI;AACA,cAAM,MAAM,IAAI,IAAI,IAAI,OAAO,KAAK,UAAU,IAAI,QAAQ,IAAI,EAAE;AAChE,cAAM,QAAQ,IAAI,aAAa,IAAI,GAAG,KAAK;AAC3C,cAAM,QAAQ,SAAS,IAAI,aAAa,IAAI,OAAO,KAAK,MAAM,EAAE;AAEhE,YAAI,CAAC,SAAS,MAAM,SAAS,GAAG;AAC5B,mBAAS,KAAK,KAAK,EAAE,SAAS,MAAM,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC;AACzD;AAAA,QACJ;AAEA,cAAM,QAAQ,MAAM,YAAY,YAAY,OAAO,KAAK,IAAI,OAAO,EAAE,CAAC;AACtE,iBAAS,KAAK,KAAK;AAAA,UACf,SAAS;AAAA,UACT,MAAM,EAAE,MAAM;AAAA,QAClB,CAAC;AAAA,MACL,SAAS,OAAgB;AACrB,cAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU;AAC9D,kBAAU,KAAK,KAAK,cAAc,uBAAuB,YAAY,EAAE;AAAA,MAC3E;AACA;AAAA,IACJ;AAEA,QAAI,aAAa,qBAAqB,IAAI,WAAW,OAAO;AAExD,UAAI;AACA,cAAM,MAAM,IAAI,IAAI,IAAI,OAAO,KAAK,UAAU,IAAI,QAAQ,IAAI,EAAE;AAChE,cAAM,WAAW,IAAI,aAAa,IAAI,MAAM;AAE5C,YAAI,CAAC,UAAU;AACX,oBAAU,KAAK,KAAK,cAAc,mBAAmB;AACrD;AAAA,QACJ;AAEA,cAAM,cAAc,MAAM,YAAY,SAAS,QAAQ;AACvD,iBAAS,KAAK,KAAK;AAAA,UACf,SAAS;AAAA,UACT,MAAM;AAAA,QACV,CAAC;AAAA,MACL,SAAS,OAAgB;AACrB,cAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU;AAC9D,YAAI,aAAa,SAAS,gBAAgB,GAAG;AACzC,oBAAU,KAAK,KAAK,cAAc,eAAe;AAAA,QACrD,WAAW,aAAa,SAAS,QAAQ,GAAG;AACxC,oBAAU,KAAK,KAAK,cAAc,gBAAgB;AAAA,QACtD,OAAO;AACH,oBAAU,KAAK,KAAK,cAAc,YAAY;AAAA,QAClD;AAAA,MACJ;AACA;AAAA,IACJ;AAEA,QAAI,aAAa,sBAAsB,IAAI,WAAW,QAAQ;AAE1D,UAAI;AACA,cAAM,OAAQ,MAAM,cAAc,GAAG;AAErC,YAAI,CAAC,KAAK,SAAS,CAAC,MAAM,QAAQ,KAAK,KAAK,KAAK,KAAK,MAAM,WAAW,GAAG;AACtE,oBAAU,KAAK,KAAK,cAAc,gCAAgC;AAClE;AAAA,QACJ;AAEA,YAAI,KAAK,MAAM,SAAS,YAAY,iBAAiB,GAAG;AACpD,oBAAU,KAAK,KAAK,cAAc,WAAW,YAAY,iBAAiB,CAAC,4BAA4B;AACvG;AAAA,QACJ;AAEA,cAAM,QAAQ,MAAM,YAAY,UAAU,KAAK,KAAK;AACpD,iBAAS,KAAK,KAAK;AAAA,UACf,SAAS;AAAA,UACT,MAAM,EAAE,MAAM;AAAA,QAClB,CAAC;AAAA,MACL,SAAS,OAAgB;AACrB,cAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU;AAC9D,kBAAU,KAAK,KAAK,cAAc,sBAAsB,YAAY,EAAE;AAAA,MAC1E;AACA;AAAA,IACJ;AAEA,QAAI,aAAa,qBAAqB,IAAI,WAAW,OAAO;AAExD,eAAS,KAAK,KAAK;AAAA,QACf,SAAS;AAAA,QACT,MAAM;AAAA,UACF,YAAY,YAAY,cAAc;AAAA,UACtC,UAAU,YAAY,iBAAiB;AAAA,QAC3C;AAAA,MACJ,CAAC;AACD;AAAA,IACJ;AAEA,QAAI,aAAa,eAAe,IAAI,WAAW,QAAQ;AAEnD,UAAI;AACA,cAAM,OAAQ,MAAM,cAAc,GAAG;AAOrC,YAAI,CAAC,KAAK,WAAW,CAAC,KAAK,OAAO;AAC9B,oBAAU,KAAK,KAAK,cAAc,0BAA0B;AAC5D;AAAA,QACJ;AAGA,cAAM,WAA8E,CAAC;AAGrF,YAAI,KAAK,cAAc;AACnB,mBAAS,KAAK,EAAE,MAAM,UAAU,SAAS,KAAK,aAAa,CAAC;AAAA,QAChE;AAGA,iBAAS;AAAA,UACL,IAAI,KAAK,WAAW,CAAC,GAAG,IAAI,CAAC,OAAO;AAAA,YAChC,MAAM,EAAE;AAAA,YACR,SAAS,EAAE;AAAA,UACf,EAAE;AAAA,UACF,EAAE,MAAM,QAAiB,SAAS,KAAK,QAAQ;AAAA,QACnD;AAGA,YAAI,UAAU,KAAK;AAAA,UACf,gBAAgB;AAAA,UAChB,iBAAiB;AAAA,UACjB,YAAY;AAAA,UACZ,+BAA+B;AAAA,QACnC,CAAC;AAED,YAAI;AAEA,2BAAiB,SAAS,WAAW;AAAA,YACjC;AAAA,YACA,KAAK;AAAA,UACT,GAAG;AACC,gBAAI;AAAA,cACA,SAAS,KAAK,UAAU,EAAE,MAAM,SAAS,SAAS,MAAM,CAAC,CAAC;AAAA;AAAA;AAAA,YAC9D;AAAA,UACJ;AAEA,cAAI,MAAM,SAAS,KAAK,UAAU,EAAE,MAAM,OAAO,CAAC,CAAC;AAAA;AAAA,CAAM;AAAA,QAC7D,SAAS,aAAsB;AAC3B,gBAAM,eACF,uBAAuB,QACjB,YAAY,UACZ;AAGV,cAAI,aAAa,SAAS,aAAa,GAAG;AACtC,gBAAI;AAAA,cACA,SAAS,KAAK,UAAU,EAAE,MAAM,SAAS,MAAM,cAAc,SAAS,uCAAuC,CAAC,CAAC;AAAA;AAAA;AAAA,YACnH;AAAA,UACJ,WAAW,aAAa,SAAS,YAAY,GAAG;AAC5C,gBAAI;AAAA,cACA,SAAS,KAAK,UAAU,EAAE,MAAM,SAAS,MAAM,cAAc,SAAS,oCAAoC,CAAC,CAAC;AAAA;AAAA;AAAA,YAChH;AAAA,UACJ,OAAO;AACH,gBAAI;AAAA,cACA,SAAS,KAAK,UAAU,EAAE,MAAM,SAAS,MAAM,cAAc,SAAS,aAAa,CAAC,CAAC;AAAA;AAAA;AAAA,YACzF;AAAA,UACJ;AAAA,QACJ;AAEA,YAAI,IAAI;AAAA,MACZ,SAAS,OAAgB;AACrB,kBAAU,KAAK,KAAK,cAAc,uBAAuB;AAAA,MAC7D;AACA;AAAA,IACJ;AAGA,cAAU,KAAK,KAAK,cAAc,wBAAwB;AAAA,EAC9D;AAKA,iBAAe,cACX,KACA,KACa;AACb,UAAM,MAAM,IAAI,IAAI,IAAI,OAAO,KAAK,UAAU,IAAI,QAAQ,IAAI,EAAE;AAChE,UAAM,WAAW,IAAI;AAErB,QAAI;AAEA,UAAI,SAAS,WAAW,OAAO,KAAK,aAAa,WAAW;AACxD,cAAM,UAAU,KAAK,KAAK,QAAQ;AAClC;AAAA,MACJ;AAGA,UAAI,WAAW,aAAa,MAAM,gBAAgB;AAGlD,iBAAW,SAAS,QAAQ,OAAO,EAAE;AAErC,YAAM,gBAAgB,KAAK,QAAQ;AAAA,IACvC,SAAS,OAAO;AACZ,cAAQ,MAAM,0BAA0B,KAAK;AAC7C,gBAAU,KAAK,KAAK,cAAc,uBAAuB;AAAA,IAC7D;AAAA,EACJ;AAEA,SAAO;AAAA,IACH,MAAM,QAAyD;AAE3D,UAAI,CAAC,QAAQ,SAAS,GAAG;AACrB,eAAO,MAAM,kBAAkB,OAAO,KAAK;AAAA,MAC/C;AAGA,gBAAU,eAAe,cAAc;AAAA,QACnC,WAAW,OAAO;AAAA,QAClB,QAAQ,OAAO;AAAA,MACnB,CAAC;AAGD,eAAS,KAAK,aAAa,aAAa;AAExC,aAAO,IAAI,QAAQ,CAACD,UAAS,WAAW;AACpC,eAAQ,OAAO,MAAM,MAAM,MAAM;AAC7B,kBAAQ,IAAI;AAAA,8CAA0C,IAAI,IAAI,IAAI,EAAE;AACpE,kBAAQ,IAAI,4BAAqB,QAAS,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK;AACjE,kBAAQ,IAAI;AAAA,CAAmC;AAE/C,UAAAA,SAAQ;AAAA,YACJ;AAAA,YACA,cAAc,QAAS;AAAA,UAC3B,CAAC;AAAA,QACL,CAAC;AAED,eAAQ,KAAK,SAAS,CAAC,QAA+B;AAClD,cAAI,IAAI,SAAS,cAAc;AAC3B,mBAAO,IAAI,MAAM,QAAQ,IAAI,qBAAqB,CAAC;AAAA,UACvD,OAAO;AACH,mBAAO,GAAG;AAAA,UACd;AAAA,QACJ,CAAC;AAAA,MACL,CAAC;AAAA,IACL;AAAA,IAEA,MAAM,OAAsB;AACxB,UAAI,QAAQ;AACR,eAAO,IAAI,QAAQ,CAACA,aAAY;AAC5B,iBAAQ,MAAM,MAAM;AAChB,2BAAe,SAAS;AACxB,oBAAQ,IAAI,qCAA8B;AAC1C,YAAAA,SAAQ;AAAA,UACZ,CAAC;AAAA,QACL,CAAC;AAAA,MACL;AAAA,IACJ;AAAA,IAEA,SAAiB;AACb,aAAO,UAAU,IAAI,IAAI,IAAI,aAAa,SAAS,SAAS,EAAE;AAAA,IAClE;AAAA,EACJ;AACJ;;;ATtiBA,eAAe,mBAAmB,SAA4C;AAC1E,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,SAAS,MAAM,cAAc,KAAK;AAExC,MAAI,CAAC,QAAQ;AACT,UAAM,IAAI,gBAAgB,yCAAyC;AAAA,EACvE;AAEA,QAAM,UAAU,IAAI,gBAAgB,MAAM;AAG1C,QAAM,EAAE,eAAe,MAAM,IAAIE;AAAA,IAC7BC,QAAM,cAAc,SAAS;AAAA,MACzB;AAAA,MACA,cAAc,QAAQ;AAAA,IAC1B,CAAC;AAAA,IACD;AAAA;AAAA,MAEI,aAAa;AAAA;AAAA,IACjB;AAAA,EACJ;AAEA,QAAM,cAAc;AAGpB,QAAM;AACV;AAKA,eAAe,cAAc,SAA4C;AACrE,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,SAAS,MAAM,cAAc,KAAK;AAExC,MAAI,CAAC,QAAQ;AACT,UAAM,IAAI,gBAAgB,yCAAyC;AAAA,EACvE;AAEA,QAAM,OAAO,QAAQ,OAAO,SAAS,QAAQ,MAAM,EAAE,IAAI;AAGzD,QAAM,SAAS,oBAAoB;AAAA,IAC/B;AAAA,IACA;AAAA,EACJ,CAAC;AAED,MAAI;AACA,UAAM,EAAE,MAAM,YAAY,aAAa,IAAI,MAAM,OAAO,MAAM;AAC9D,UAAM,MAAM,OAAO,OAAO;AAG1B,QAAI,CAAC,QAAQ,QAAQ;AACjB,YAAM,EAAE,SAAS,KAAK,IAAI,MAAM,OAAO,MAAM;AAC7C,YAAM,KAAK,GAAG;AACd,cAAQ,IAAI,8CAAuC;AAAA,IACvD,OAAO;AACH,cAAQ,IAAI;AAAA;AAAA,KAA2C,GAAG;AAAA,CAAI;AAAA,IAClE;AAEA,YAAQ,IAAI,mCAAmC;AAG/C,UAAM,IAAI,QAAc,CAACC,aAAY;AACjC,cAAQ,GAAG,UAAU,YAAY;AAC7B,gBAAQ,IAAI,gCAAyB;AACrC,cAAM,OAAO,KAAK;AAClB,QAAAA,SAAQ;AAAA,MACZ,CAAC;AAED,cAAQ,GAAG,WAAW,YAAY;AAC9B,cAAM,OAAO,KAAK;AAClB,QAAAA,SAAQ;AAAA,MACZ,CAAC;AAAA,IACL,CAAC;AAAA,EACL,SAAS,OAAO;AACZ,QAAI,iBAAiB,SAAS,MAAM,QAAQ,SAAS,MAAM,GAAG;AAC1D,YAAM,IAAI,gBAAgB,MAAM,UAAU,+CAA+C;AAAA,IAC7F;AACA,UAAM;AAAA,EACV;AACJ;AAMA,eAAe,kBAAkB,SAA4C;AACzE,MAAI,QAAQ,UAAU;AAClB,UAAM,mBAAmB,OAAO;AAAA,EACpC,OAAO;AACH,UAAM,cAAc,OAAO;AAAA,EAC/B;AACJ;AAKO,SAAS,oBAA6B;AACzC,QAAM,MAAM,IAAIC,UAAQ,MAAM,EACzB,YAAY,oDAAoD,EAChE,OAAO,mBAAmB,oDAAoD,EAC9E,OAAO,kBAAkB,8CAA8C,EACvE,OAAO,iBAAiB,yDAAyD,EACjF,OAAO,aAAa,yCAAyC,EAC7D,OAAO,OAAO,YAAgC;AAC3C,UAAM,kBAAkB,OAAO;AAAA,EACnC,CAAC;AAEL,SAAO;AACX;;;AYlIA,SAAS,WAAAC,iBAAe;AACxB,OAAOC,YAAW;AAClB,OAAOC,YAAW;AAKlB,SAASC,SAAQ,KAAqB;AAClC,MAAI,IAAI,UAAU,EAAG,QAAO;AAC5B,SAAO,IAAI,MAAM,GAAG,CAAC,IAAI,SAAS,IAAI,MAAM,EAAE;AAClD;AAKA,eAAe,wBAAwB,SAA4C;AAC/E,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,SAAS,MAAM,cAAc,KAAK;AAExC,MAAI,CAAC,QAAQ;AACT,UAAM,IAAI,gBAAgB,yCAAyC;AAAA,EACvE;AAEA,QAAM,UAAU,IAAI,gBAAgB,MAAM;AAG1C,UAAQ;AAAA,IACJC,OAAMC,OAAM,KAAK,KAAK,kDAA2C,GAAG;AAAA,MAChE,SAAS,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,EAAE;AAAA,MAChD,aAAa;AAAA,MACb,aAAa;AAAA,IACjB,CAAC;AAAA,EACL;AACA,UAAQ,IAAI;AAGZ,UAAQ,IAAIA,OAAM,KAAK,2BAAoB,CAAC;AAC5C,UAAQ,IAAI,MAAMA,OAAM,IAAI,WAAW,CAAC,IAAIA,OAAM,MAAM,QAAQ,WAAW,CAAC,CAAC,EAAE;AAC/E,UAAQ;AAAA,IACJ,MAAMA,OAAM,IAAI,UAAU,CAAC,KAAK,QAAQ,OAAOA,OAAM,MAAM,QAAQ,UAAU,CAAC,IAAIA,OAAM,OAAOF,SAAQ,QAAQ,UAAU,CAAC,CAAC,CAAC;AAAA,EAChI;AACA,UAAQ,IAAI;AAEZ,MAAI;AACA,UAAM,CAAC,QAAQ,MAAM,IAAI,MAAM,QAAQ,IAAI;AAAA,MACvC,QAAQ,mBAAmB;AAAA,MAC3B,QAAQ,UAAU;AAAA,IACtB,CAAC;AAED,UAAM,gBAAgB,OAAO,OAAO,CAAC,MAAM,EAAE,OAAO;AAGpD,YAAQ,IAAIE,OAAM,KAAK,4BAAqB,CAAC;AAC7C,QAAI,cAAc,WAAW,GAAG;AAC5B,cAAQ,IAAIA,OAAM,IAAI,6CAA6B,CAAC;AAAA,IACxD,OAAO;AACH,iBAAW,SAAS,eAAe;AAC/B,cAAM,YACF,MAAM,eAAe,UAAa,MAAM,cAAc,SAChDA,OAAM,IAAI,KAAK,MAAM,SAAS,IAAI,MAAM,UAAU,cAAW,IAC7D;AACV,gBAAQ,IAAI,MAAMA,OAAM,MAAM,QAAG,CAAC,IAAIA,OAAM,MAAM,MAAM,EAAE,CAAC,GAAG,SAAS,EAAE;AAAA,MAC7E;AAAA,IACJ;AACA,YAAQ,IAAI;AAGZ,UAAM,eAAe,cAAc,CAAC,GAAG,MAAM;AAC7C,YAAQ,IAAIA,OAAM,KAAK,uBAAgB,CAAC;AACxC,YAAQ,IAAI;AACZ,UAAM,aAAa,QAAQ,OACrB,QAAQ,uBAAuB,YAAY,IAC3C,QAAQ,mBAAmB,YAAY;AAC7C,UAAM,YAAY,WAAW,MAAM,IAAI;AACvC,eAAW,QAAQ,WAAW;AAC1B,cAAQ,IAAIA,OAAM,IAAI,MAAM,IAAI,EAAE,CAAC;AAAA,IACvC;AACA,YAAQ,IAAI;AAGZ,YAAQ,IAAIA,OAAM,KAAK,qCAAiB,CAAC;AACzC,YAAQ,IAAIA,OAAM,IAAI,iDAAyC,CAAC;AAChE,YAAQ,IAAIA,OAAM,IAAI,wEAA2D,CAAC;AAClF,YAAQ,IAAIA,OAAM,IAAI,kEAAyC,CAAC;AAChE,QAAI,CAAC,QAAQ,MAAM;AACf,cAAQ,IAAIA,OAAM,IAAI,6GAAgE,CAAC;AAAA,IAC3F;AAAA,EACJ,SAAS,OAAO;AACZ,YAAQ,IAAI;AACZ,YAAQ;AAAA,MACJA,OAAM,IAAI,gDAA8B;AAAA,MACxCA,OAAM,IAAI,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IACpE;AACA,YAAQ,IAAIA,OAAM,IAAI,2EAAuD,CAAC;AAAA,EAClF;AACJ;AAKO,SAAS,0BAAmC;AAC/C,QAAM,MAAM,IAAIC,UAAQ,aAAa,EAChC,YAAY,iDAAiD,EAC7D,OAAO,UAAU,8BAA8B,EAC/C,OAAO,OAAO,YAAgC;AAC3C,UAAM,wBAAwB,OAAO;AAAA,EACzC,CAAC;AAEL,SAAO;AACX;;;AC7GA,SAAS,WAAAC,iBAAe;AACxB,OAAOC,YAAW;AAClB,OAAOC,YAAW;AASlB,eAAe,qBAAoC;AACjD,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,SAAS,MAAM,cAAc,KAAK;AAExC,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAU,IAAI,gBAAgB,MAAM;AAE1C,UAAQ,IAAIC,OAAM,KAAK,oDAA2B,CAAC;AACnD,UAAQ,IAAIA,OAAM,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AAErC,MAAI;AAEF,UAAM,CAAC,QAAQ,YAAY,UAAU,IAAI,MAAM,QAAQ,IAAI;AAAA,MACzD,QAAQ,UAAU;AAAA,MAClB,QAAQ,SAAS,CAAC;AAAA,MAClB,QAAQ,SAAS,CAAC;AAAA,IACpB,CAAC;AAGD,UAAM,SAAQ,oBAAI,KAAK,GAAE,mBAAmB,SAAS;AAAA,MACnD,UAAU;AAAA,IACZ,CAAC;AAED,YAAQ,IAAIA,OAAM,KAAK,yDAAqC,CAAC;AAG7D,UAAM,eAAe,oBAAI,IAAmD;AAG5E,QAAI,qBAAqB;AACzB,eAAW,MAAM,QAAQ,CAAC,WAAwB;AAChD,UAAI,CAAC,aAAa,IAAI,OAAO,KAAK,GAAG;AACnC,qBAAa,IAAI,OAAO,OAAO,EAAE,OAAO,GAAG,YAAY,EAAE,CAAC;AAAA,MAC5D;AACA,YAAM,YAAY,aAAa,IAAI,OAAO,KAAK;AAC/C,gBAAU,cAAc,OAAO;AAC/B,4BAAsB,OAAO;AAAA,IAC/B,CAAC;AAGD,eAAW,MAAM,QAAQ,CAAC,WAAwB;AAChD,UAAI,OAAO,SAAS,OAAO;AACzB,YAAI,CAAC,aAAa,IAAI,OAAO,KAAK,GAAG;AACnC,uBAAa,IAAI,OAAO,OAAO,EAAE,OAAO,GAAG,YAAY,EAAE,CAAC;AAAA,QAC5D;AACA,cAAM,YAAY,aAAa,IAAI,OAAO,KAAK;AAC/C,kBAAU,QAAQ,OAAO;AAAA,MAC3B;AAAA,IACF,CAAC;AAGD,YAAQ,IAAIA,OAAM,KAAK,4CAAsB,CAAC;AAC9C,YAAQ,IAAI,qDAAgCA,OAAM,MAAM,kBAAkB,CAAC;AAAA,CAAI;AAG/E,YAAQ,IAAIA,OAAM,KAAK,yCAA0B,CAAC;AAGlD,UAAM,QAAQ,IAAIC,OAAM;AAAA,MACtB,MAAM;AAAA,QACJD,OAAM,KAAK,OAAO;AAAA,QAClBA,OAAM,KAAK,YAAS;AAAA,QACpBA,OAAM,KAAK,oBAAU;AAAA,QACrBA,OAAM,KAAK,qBAAa;AAAA,MAC1B;AAAA,MACA,OAAO;AAAA,QACL,MAAM,CAAC,MAAM;AAAA,QACb,QAAQ,CAAC,MAAM;AAAA,MACjB;AAAA,MACA,WAAW,CAAC,IAAI,IAAI,IAAI,EAAE;AAAA,IAC5B,CAAC;AAGD,UAAM,gBAAgB,OAAO,0BAA0B,CAAC;AACxD,UAAM,aAAa,OAAO,uBAAuB,CAAC;AAElD,QAAI,cAAc,WAAW,GAAG;AAC9B,YAAM,KAAK;AAAA,QACT,EAAE,SAAS,GAAG,SAASA,OAAM,OAAO,gDAA6B,EAAE;AAAA,MACrE,CAAC;AAAA,IACH,OAAO;AACL,oBAAc,QAAQ,CAAC,YAAoB;AACzC,cAAM,QAAQ,aAAa,IAAI,OAAO,KAAK,EAAE,OAAO,GAAG,YAAY,EAAE;AACrE,cAAM,QACJ,WAAW,OAAO,KAAK,WAAW,QAAQ,YAAY,CAAC,KAAK;AAG9D,cAAM,eAAe,QAAQ,IAAI,MAAM,QAAQ,QAAQ;AACvD,YAAI,eAAe,GAAG,MAAM,KAAK,IAAI,KAAK;AAC1C,YAAI,gBAAgB,KAAK;AACvB,yBAAeA,OAAM,IAAI,YAAY;AAAA,QACvC,WAAW,gBAAgB,KAAK;AAC9B,yBAAeA,OAAM,OAAO,YAAY;AAAA,QAC1C,OAAO;AACL,yBAAeA,OAAM,MAAM,YAAY;AAAA,QACzC;AAEA,cAAM,KAAK,CAAC,SAAS,cAAc,GAAG,KAAK,YAAS,OAAO,MAAM,UAAU,CAAC,CAAC;AAAA,MAC/E,CAAC;AAAA,IACH;AAEA,YAAQ,IAAI,MAAM,SAAS,CAAC;AAC5B,YAAQ;AAAA,MACNA,OAAM,IAAI,2GAAmE;AAAA,IAC/E;AAAA,EACF,SAAS,OAAO;AACd,YAAQ;AAAA,MACNA,OAAM,IAAI,uDAA6B;AAAA,MACvC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IACvD;AACA,YAAQ,IAAIA,OAAM,IAAI,wEAA6C,CAAC;AAAA,EACtE;AACF;AAKO,SAAS,qBAA8B;AAC5C,QAAM,MAAM,IAAIE,UAAQ,OAAO,EAC5B,YAAY,oFAA2C,EACvD,OAAO,YAAY;AAClB,UAAM,mBAAmB;AAAA,EAC3B,CAAC;AAEH,SAAO;AACT;;;AC7IA,SAAS,WAAAC,iBAAe;;;ACAxB,SAAS,YAAYC,YAAU;AAC/B,OAAOC,WAAU;AACjB,OAAO,YAAY;AACnB,OAAO,YAAY;AAanB,IAAM,oBAAoB,CAAC,OAAO,QAAQ,SAAS,SAAS,MAAM;AAE3D,IAAM,qBAAN,MAAyB;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,YAA6B,SAA2B,OAAgB;AAChF,SAAK,aAAa;AAClB,SAAK,UAAU;AACf,SAAK,QAAQ,SAAS;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgBC,QAAoD;AACtE,QAAI;AACA,YAAM,OAAO,MAAMF,KAAG,KAAKE,MAAK;AAChC,UAAI,KAAK,YAAY,EAAG,QAAO;AAC/B,UAAI,KAAK,OAAO,EAAG,QAAO;AAAA,IAC9B,QAAQ;AAAA,IAER;AACA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,MAA0C;AAC1D,QAAI;AACA,YAAM,oBAAoB,MAAM,KAAK,mBAAmB,MAAM,MAAM;AACpE,aAAO;AAAA,QACH,SAAS;AAAA,QACT,WAAW;AAAA,QACX,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,gBAAgB,KAAK,QAAQ;AAAA,QAC7B;AAAA,MACJ;AAAA,IACJ,SAAS,OAAO;AACZ,aAAO;AAAA,QACH,SAAS;AAAA,QACT,WAAW;AAAA,QACX,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,gBAAgB,KAAK,QAAQ;AAAA,QAC7B,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MACpD;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,UAAkD;AAClE,QAAI;AAEA,YAAM,UAAU,MAAMF,KAAG,SAAS,UAAU,OAAO;AAGnD,YAAM,MAAMC,MAAK,QAAQ,QAAQ,EAAE,YAAY;AAC/C,YAAM,WAAW,KAAK,YAAY,GAAG;AAGrC,YAAM,oBAAoB,MAAM,KAAK,mBAAmB,SAAS,QAAQ;AAGzE,YAAM,aAAa,KAAK,mBAAmB,QAAQ;AAGnD,UAAI,CAAC,KAAK,QAAQ,QAAQ;AACtB,cAAMD,KAAG,UAAU,YAAY,mBAAmB,OAAO;AAAA,MAC7D;AAEA,aAAO;AAAA,QACH,WAAW;AAAA,QACX;AAAA,QACA,SAAS;AAAA,MACb;AAAA,IACJ,SAAS,OAAO;AACZ,aAAO;AAAA,QACH,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,SAAS;AAAA,QACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MACpD;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBACF,YACA,YACgC;AAChC,UAAM,QAAQ,MAAM,KAAK,cAAc,UAAU;AACjD,UAAM,cAAc,SAAS,KAAK,QAAQ,eAAe,KAAK,EAAE;AAChE,UAAM,QAAQ,OAAO,WAAW;AAEhC,UAAM,UAAmC,CAAC;AAC1C,QAAI,UAAU;AAEd,UAAM,QAAQ,MAAM;AAAA,MAAI,CAAC,SACrB,MAAM,YAAY;AACd;AACA,qBAAa;AAAA,UACT;AAAA,UACA,OAAO,MAAM;AAAA,UACb,aAAa;AAAA,UACb,QAAQ;AAAA,QACZ,CAAC;AAED,cAAM,SAAS,MAAM,KAAK,cAAc,IAAI;AAC5C,gBAAQ,KAAK,MAAM;AAEnB,qBAAa;AAAA,UACT;AAAA,UACA,OAAO,MAAM;AAAA,UACb,aAAa;AAAA,UACb,QAAQ,OAAO,UAAU,SAAS;AAAA,QACtC,CAAC;AAED,eAAO;AAAA,MACX,CAAC;AAAA,IACL;AAEA,UAAM,QAAQ,IAAI,KAAK;AAEvB,WAAO,KAAK,iBAAiB,YAAY,OAAO;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,WAA2B;AAClD,QAAI,KAAK,QAAQ,QAAQ;AACrB,aAAO,KAAK,QAAQ;AAAA,IACxB;AAEA,UAAM,MAAMC,MAAK,QAAQ,SAAS;AAClC,UAAM,OAAOA,MAAK,SAAS,WAAW,GAAG;AACzC,UAAM,MAAMA,MAAK,QAAQ,SAAS;AAClC,UAAM,OAAO,KAAK,QAAQ;AAE1B,WAAOA,MAAK,KAAK,KAAK,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,EAAE;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,cAAc,YAAuC;AAC/D,UAAM,UAAU,MAAMD,KAAG,QAAQ,YAAY,EAAE,eAAe,KAAK,CAAC;AACpE,UAAM,QAAkB,CAAC;AAEzB,eAAW,SAAS,SAAS;AACzB,YAAM,WAAWC,MAAK,KAAK,YAAY,MAAM,IAAI;AAEjD,UAAI,MAAM,YAAY,GAAG;AAErB,YAAI,CAAC,MAAM,KAAK,WAAW,GAAG,KAAK,MAAM,SAAS,gBAAgB;AAC9D,gBAAM,WAAW,MAAM,KAAK,cAAc,QAAQ;AAClD,gBAAM,KAAK,GAAG,QAAQ;AAAA,QAC1B;AAAA,MACJ,WAAW,MAAM,OAAO,GAAG;AACvB,cAAM,MAAMA,MAAK,QAAQ,MAAM,IAAI,EAAE,YAAY;AACjD,YAAI,kBAAkB,SAAS,GAA4B,GAAG;AAE1D,cAAI,CAAC,KAAK,iBAAiB,MAAM,IAAI,GAAG;AACpC,kBAAM,KAAK,QAAQ;AAAA,UACvB;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,UAA2B;AAEhD,UAAM,UAAU;AAChB,WAAO,QAAQ,KAAK,QAAQ;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,SAAiB,UAAuC;AACxE,UAAM,aAAa,KAAK,QAAQ;AAChC,QAAI,eAAe;AAEnB,YAAQ,UAAU;AAAA,MACd,KAAK;AACD,uBAAe;AAAA,8CACe,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQxC;AAAA,MAEJ,KAAK;AACD,uBAAe;AAAA,iCACE,UAAU;AAAA;AAAA;AAG3B;AAAA,MAEJ,KAAK;AACD,uBAAe;AAAA,iCACE,UAAU;AAAA;AAAA;AAG3B;AAAA,MAEJ;AACI,uBAAe;AAAA,kCACG,UAAU;AAAA;AAAA;AAAA,IAGpC;AAEA,WAAO;AAAA,MACH,EAAE,MAAM,UAAU,SAAS,aAAa;AAAA,MACxC,EAAE,MAAM,QAAQ,QAAiB;AAAA,IACrC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,KAAqB;AACrC,YAAQ,IAAI,YAAY,GAAG;AAAA,MACvB,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AAAA,MACL,KAAK;AACD,eAAO;AAAA,MACX;AACI,eAAO;AAAA,IACf;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,mBAAmB,SAAiB,UAAmC;AACjF,WAAO;AAAA,MACH,YAAY;AACR,cAAM,WAAW,KAAK,YAAY,SAAS,QAAQ;AACnD,cAAM,SAAS,MAAM,KAAK,WAAW,KAAK,UAAU,KAAK,KAAK;AAC9D,eAAO;AAAA,MACX;AAAA,MACA;AAAA,QACI,SAAS;AAAA,QACT,iBAAiB,CAAC,UAAU;AACxB,cAAI,MAAM,QAAQ,SAAS,YAAY,GAAG;AACtC,oBAAQ,IAAI,0DAAiC;AAAA,UACjD;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKQ,iBACJ,YACA,SACuB;AACvB,UAAM,UAAU;AAAA,MACZ,OAAO,QAAQ;AAAA,MACf,SAAS,QAAQ,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE;AAAA,MAC1C,QAAQ,QAAQ,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE;AAAA,MAC1C,SAAS;AAAA,IACb;AAEA,WAAO;AAAA,MACH,aAAa;AAAA,MACb,cAAc,KAAK,QAAQ,UAAU;AAAA,MACrC;AAAA,MACA;AAAA,IACJ;AAAA,EACJ;AACJ;;;ADzSA,eAAe,gBAAgBE,QAAe,SAAiD;AAC3F,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,SAAS,MAAM,cAAc,KAAK;AAExC,MAAI,CAAC,QAAQ;AACT,UAAM,IAAI,gBAAgB,oEAAwC;AAAA,EACtE;AAEA,QAAM,aAAa,IAAI,gBAAgB,MAAM;AAC7C,QAAM,qBAAqB,IAAI,mBAAmB,YAAY,SAAS,QAAQ,KAAK;AAGpF,QAAM,YAAY,MAAM,mBAAmB,gBAAgBA,MAAK;AAGhE,UAAQ,WAAW;AAAA,IACf,KAAK;AACD,YAAM,sBAAsB,oBAAoBA,QAAO,OAAO;AAC9D;AAAA,IACJ,KAAK;AACD,YAAM,sBAAsB,oBAAoBA,QAAO,OAAO;AAC9D;AAAA,IACJ,KAAK;AACD,YAAM,wBAAwB,oBAAoBA,QAAO,OAAO;AAChE;AAAA,EACR;AACJ;AAKA,eAAe,sBACX,SACA,MACA,SACa;AACb,MAAI,CAAC,QAAQ,MAAM;AACf,YAAQ,IAAI,oDAAyB;AAAA,EACzC;AAEA,QAAM,SAAS,MAAM,QAAQ,cAAc,IAAI;AAE/C,MAAI,QAAQ,MAAM;AACd,YAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC3C;AAAA,EACJ;AAEA,MAAI,OAAO,WAAW,OAAO,mBAAmB;AAC5C,YAAQ,IAAI,8CAAyB,OAAO,cAAc;AAAA,CAAI;AAC9D,YAAQ,IAAI,OAAO,iBAAiB;AAAA,EACxC,OAAO;AACH,YAAQ,MAAM,oBAAU,OAAO,KAAK,EAAE;AACtC,YAAQ,KAAK,CAAC;AAAA,EAClB;AACJ;AAKA,eAAe,sBACX,SACA,UACA,SACa;AACb,MAAI,CAAC,QAAQ,MAAM;AACf,YAAQ,IAAI,uCAAsB,QAAQ,EAAE;AAAA,EAChD;AAEA,QAAM,SAAS,MAAM,QAAQ,cAAc,QAAQ;AAEnD,MAAI,QAAQ,MAAM;AACd,YAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC3C;AAAA,EACJ;AAEA,MAAI,OAAO,SAAS;AAChB,QAAI,QAAQ,QAAQ;AAChB,cAAQ,IAAI,2CAA4B,OAAO,UAAU,EAAE;AAAA,IAC/D,OAAO;AACH,cAAQ,IAAI,+BAAa,OAAO,UAAU,EAAE;AAAA,IAChD;AAAA,EACJ,OAAO;AACH,YAAQ,MAAM,oBAAU,OAAO,KAAK,EAAE;AACtC,YAAQ,KAAK,CAAC;AAAA,EAClB;AACJ;AAKA,eAAe,wBACX,SACA,YACA,SACa;AACb,MAAI,CAAC,QAAQ,MAAM;AACf,YAAQ,IAAI,kDAAyB,UAAU;AAAA,CAAI;AAAA,EACvD;AAEA,QAAM,SAAS,MAAM,QAAQ,gBAAgB,YAAY,CAAC,aAAa;AACnE,QAAI,CAAC,QAAQ,MAAM;AACf,YAAM,WAAW,SAAS,YAAY,MAAM,GAAG,EAAE,IAAI,KAAK,SAAS;AACnE,cAAQ,OAAO;AAAA,QACX,wCAAoB,SAAS,OAAO,IAAI,SAAS,KAAK,MAAM,QAAQ,GAAG,IAAI,OAAO,EAAE,CAAC;AAAA,MACzF;AAAA,IACJ;AAAA,EACJ,CAAC;AAED,MAAI,CAAC,QAAQ,MAAM;AAEf,YAAQ,OAAO,MAAM,OAAO,IAAI,OAAO,GAAG,IAAI,IAAI;AAAA,EACtD;AAEA,MAAI,QAAQ,MAAM;AACd,YAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC3C;AAAA,EACJ;AAGA,UAAQ,IAAI;AAAA,2BAAiB,OAAO,QAAQ,OAAO,IAAI,OAAO,QAAQ,KAAK,4BAAe;AAE1F,MAAI,OAAO,QAAQ,SAAS,GAAG;AAC3B,YAAQ,IAAI;AAAA,gBAAS,OAAO,QAAQ,MAAM,0BAAgB;AAC1D,WAAO,QACF,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO,EACxB,QAAQ,CAAC,MAAM;AACZ,YAAM,WAAW,EAAE,UAAU,MAAM,GAAG,EAAE,IAAI,KAAK,EAAE;AACnD,cAAQ,IAAI,aAAQ,QAAQ,KAAK,EAAE,KAAK,EAAE;AAAA,IAC9C,CAAC;AAAA,EACT;AAEA,MAAI,QAAQ,QAAQ;AAChB,YAAQ,IAAI,4EAA2C;AAAA,EAC3D;AACJ;AAKO,SAAS,yBAAkC;AAC9C,QAAM,MAAM,IAAIC,UAAQ,WAAW,EAC9B,YAAY,4EAAyC,EACrD,SAAS,WAAW,8FAA4C,EAChE,OAAO,mBAAmB,qEAAmC,IAAI,EACjE,OAAO,uBAAuB,+DAAiC,EAC/D,OAAO,aAAa,4CAA0B,EAC9C,OAAO,0BAA0B,qEAAyC,GAAG,EAC7E,OAAO,mBAAmB,yDAA0C,EACpE,OAAO,UAAU,4CAAwB,EACzC,OAAO,OAAOD,QAAe,YAAqC;AAC/D,UAAM,gBAAgBA,QAAO,OAAO;AAAA,EACxC,CAAC;AAEL,SAAO;AACX;;;AE5KA,SAAS,WAAAE,iBAAe;AACxB,OAAOC,aAAW;;;ACDlB,SAAS,WAAAC,iBAAe;;;ACiDjB,IAAM,eAAN,MAAmB;AAAA;AAAA;AAAA;AAAA,EAItB,MAAM,SAAS,QAAoB,SAAqD;AACpF,UAAM,WAAW,MAAM,MAAM,GAAG,OAAO,MAAM,uBAAuB;AAAA,MAChE,QAAQ;AAAA,MACR,SAAS;AAAA,QACL,gBAAgB;AAAA,QAChB,mBAAmB,OAAO;AAAA,MAC9B;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACjB,QAAQ,QAAQ;AAAA,QAChB,OAAO,QAAQ;AAAA,QACf,MAAM,QAAQ,QAAQ;AAAA,QACtB,SAAS,QAAQ,WAAW;AAAA,MAChC,CAAC;AAAA,IACL,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AACd,UAAI,eAAe,QAAQ,SAAS,MAAM;AAC1C,UAAI;AACA,cAAM,QAAQ,MAAM,SAAS,KAAK;AAClC,uBAAe,MAAM,WAAW;AAAA,MACpC,SAAS,GAAG;AAAA,MAEZ;AACA,YAAM,IAAI,aAAa,YAAY;AAAA,IACvC;AAEA,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAK,QAAoB,SAAuD;AAClF,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,QAAQ,MAAO,QAAO,IAAI,SAAS,QAAQ,KAAK;AACpD,QAAI,QAAQ,MAAO,QAAO,IAAI,SAAS,QAAQ,MAAM,SAAS,CAAC;AAC/D,QAAI,QAAQ,OAAQ,QAAO,IAAI,UAAU,QAAQ,OAAO,SAAS,CAAC;AAElE,UAAM,MAAM,GAAG,OAAO,MAAM,mBAAmB,MAAM;AAErD,UAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAC9B,SAAS;AAAA,QACL,mBAAmB,OAAO;AAAA,MAC9B;AAAA,IACJ,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AACd,YAAM,IAAI,aAAa,+BAA+B,SAAS,MAAM,EAAE;AAAA,IAC3E;AAEA,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,QAAoB,IAA0B;AACxD,UAAM,WAAW,MAAM,MAAM,GAAG,OAAO,MAAM,cAAc,EAAE,IAAI;AAAA,MAC7D,SAAS;AAAA,QACL,mBAAmB,OAAO;AAAA,MAC9B;AAAA,IACJ,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AACd,UAAI,SAAS,WAAW,KAAK;AACzB,cAAM,IAAI,MAAM,iBAAiB;AAAA,MACrC;AACA,YAAM,IAAI,aAAa,6BAA6B,SAAS,MAAM,EAAE;AAAA,IACzE;AAEA,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,QAAoB,IAA2B;AACxD,UAAM,WAAW,MAAM,MAAM,GAAG,OAAO,MAAM,cAAc,EAAE,IAAI;AAAA,MAC7D,QAAQ;AAAA,MACR,SAAS;AAAA,QACL,mBAAmB,OAAO;AAAA,MAC9B;AAAA,IACJ,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AACd,UAAI,SAAS,WAAW,KAAK;AACzB,cAAM,IAAI,MAAM,iBAAiB;AAAA,MACrC;AACA,YAAM,IAAI,aAAa,gCAAgC,SAAS,MAAM,EAAE;AAAA,IAC5E;AAAA,EACJ;AACJ;;;AD/IA,OAAO,mBAAmB;AAG1B,IAAM,kBAAkB;AAAA,EACpB;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AACJ;AAIO,SAAS,wBAAiC;AAC7C,SAAO,IAAIC,UAAQ,KAAK,EACnB,YAAY,oCAAoC,EAChD,SAAS,YAAY,0BAA0B,EAC/C,OAAO,uBAAuB,gBAAgB,4BAA4B,EAC1E,OAAO,qBAAqB,eAAe,gBAAgB,KAAK,IAAI,CAAC,IAAI,WAAW,EACpF,OAAO,2BAA2B,+BAA+B,IAAI,EACrE,OAAO,gBAAgB,iCAAkC,EACzD,OAAO,OAAO,QAAQ,YAAY;AAC/B,UAAM,gBAAgB,IAAI,cAAc;AACxC,UAAM,SAAS,MAAM,cAAc,KAAK;AAExC,QAAI,CAAC,QAAQ;AACT,YAAM,IAAI,gBAAgB,yCAAyC;AAAA,IACvE;AAGA,UAAM,OAAO,QAAQ;AACrB,QAAI,CAAC,gBAAgB,SAAS,IAAI,GAAG;AACjC,cAAQ,MAAM;AAAA,uBAAqB,IAAI,EAAE;AACzC,cAAQ,MAAM,uBAAuB,gBAAgB,KAAK,IAAI,CAAC,EAAE;AACjE,cAAQ,MAAM,sBAAsB;AACpC,cAAQ,MAAM,+BAA+B;AAC7C,cAAQ,MAAM,wCAAwC;AACtD,cAAQ,MAAM,uCAAuC;AACrD,cAAQ,MAAM,kCAAkC;AAChD,cAAQ,MAAM,iCAAiC;AAC/C,cAAQ,KAAK,CAAC;AAAA,IAClB;AAEA,UAAM,eAAe,IAAI,aAAa;AAEtC,YAAQ,IAAI,+BAAwB;AACpC,YAAQ,IAAI,cAAc,MAAM,EAAE;AAClC,YAAQ,IAAI,aAAa,QAAQ,KAAK,EAAE;AACxC,YAAQ,IAAI,YAAY,IAAI,EAAE;AAC9B,YAAQ,IAAI,eAAe,QAAQ,OAAO,EAAE;AAE5C,QAAI;AACA,YAAM,SAAS,MAAM,aAAa,SAAS,QAAQ;AAAA,QAC/C;AAAA,QACA,OAAO,QAAQ;AAAA,QACf;AAAA,QACA,SAAS,QAAQ;AAAA,MACrB,CAAC;AAED,cAAQ,IAAI,wCAAmC;AAC/C,cAAQ,IAAI,WAAW,OAAO,GAAG,EAAE;AACnC,cAAQ,IAAI,aAAa,OAAO,cAAc,MAAM,QAAQ,CAAC,CAAC,KAAK;AACnE,cAAQ,IAAI,UAAU,OAAO,EAAE,EAAE;AAGjC,UAAI,QAAQ,YAAY,OAAO;AAC3B,YAAI;AACA,gBAAM,gBAAgB,MAAM,MAAM,OAAO,GAAG;AAC5C,gBAAM,cAAc,MAAM,cAAc,YAAY;AACpD,gBAAM,cAAc,OAAO,KAAK,WAAW;AAC3C,gBAAM,WAAW,MAAM,cAAc,OAAO,aAAa;AAAA,YACrD,OAAO;AAAA,YACP,QAAQ;AAAA,UACZ,CAAC;AACD,kBAAQ,IAAI,OAAO,QAAQ;AAAA,QAC/B,SAAS,cAAc;AAAA,QAEvB;AAAA,MACJ;AAEA,cAAQ,IAAI,gEAAyD;AACrE,cAAQ,IAAI,gDAAgD;AAAA,IAEhE,SAAS,OAAO;AACZ,UAAI,iBAAiB,OAAO;AACxB,YAAI,MAAM,QAAQ,SAAS,YAAY,GAAG;AACtC,kBAAQ,MAAM,qCAA2B;AACzC,kBAAQ,MAAM,iDAAiD;AAAA,QACnE,OAAO;AACH,gBAAM;AAAA,QACV;AAAA,MACJ;AACA,YAAM;AAAA,IACV;AAAA,EACJ,CAAC;AACT;;;AEnGA,SAAS,WAAAC,iBAAe;AAKjB,SAAS,yBAAkC;AAC9C,SAAO,IAAIC,UAAQ,MAAM,EACpB,YAAY,uBAAuB,EACnC,OAAO,uBAAuB,iBAAiB,EAC/C,OAAO,wBAAwB,qBAAqB,IAAI,EACxD,OAAO,yBAAyB,yBAAyB,GAAG,EAC5D,OAAO,OAAO,YAAY;AACvB,UAAM,gBAAgB,IAAI,cAAc;AACxC,UAAM,SAAS,MAAM,cAAc,KAAK;AAExC,QAAI,CAAC,QAAQ;AACT,YAAM,IAAI,gBAAgB,yCAAyC;AAAA,IACvE;AAEA,UAAM,eAAe,IAAI,aAAa;AACtC,UAAM,SAAS,MAAM,aAAa,KAAK,QAAQ;AAAA,MAC3C,OAAO,QAAQ;AAAA,MACf,OAAO,SAAS,QAAQ,KAAK;AAAA,MAC7B,QAAQ,SAAS,QAAQ,MAAM;AAAA,IACnC,CAAC;AAED,QAAI,OAAO,OAAO,WAAW,GAAG;AAC5B,cAAQ,IAAI,kBAAkB;AAC9B;AAAA,IACJ;AAEA,YAAQ,IAAI;AAAA,mCAA+B,OAAO,KAAK;AAAA,CAAY;AAEnE,eAAW,OAAO,OAAO,QAAQ;AAC7B,YAAM,OAAO,IAAI,KAAK,IAAI,SAAS,EAAE,eAAe;AACpD,YAAM,gBAAgB,IAAI,OAAO,SAAS,KACpC,IAAI,OAAO,MAAM,GAAG,EAAE,IAAI,QAC1B,IAAI;AAEV,cAAQ,IAAI,OAAO,IAAI,GAAG,SAAS,EAAE,OAAO,CAAC,CAAC,MAAM,IAAI,EAAE;AAC1D,cAAQ,IAAI,aAAa,IAAI,KAAK,EAAE;AACpC,cAAQ,IAAI,cAAc,aAAa,EAAE;AACzC,cAAQ,IAAI,WAAW,IAAI,GAAG,EAAE;AAChC,cAAQ,IAAI;AAAA,IAChB;AAEA,QAAI,OAAO,QAAQ,OAAO,SAAS,OAAO,OAAO;AAC7C,YAAM,aAAa,OAAO,SAAS,OAAO;AAC1C,cAAQ,IAAI,2CAAoC,UAAU,EAAE;AAAA,IAChE;AAAA,EACJ,CAAC;AACT;;;ACnDA,SAAS,WAAAC,iBAAe;AAKjB,SAAS,yBAAkC;AAC9C,SAAO,IAAIC,UAAQ,MAAM,EACpB,YAAY,kCAAkC,EAC9C,SAAS,QAAQ,UAAU,EAC3B,OAAO,OAAO,OAAO;AAClB,UAAM,gBAAgB,IAAI,cAAc;AACxC,UAAM,SAAS,MAAM,cAAc,KAAK;AAExC,QAAI,CAAC,QAAQ;AACT,YAAM,IAAI,gBAAgB,yCAAyC;AAAA,IACvE;AAEA,UAAM,eAAe,IAAI,aAAa;AACtC,UAAM,QAAQ,MAAM,aAAa,QAAQ,QAAQ,SAAS,EAAE,CAAC;AAE7D,YAAQ,IAAI,8BAAuB;AACnC,YAAQ,IAAI,gBAAgB,MAAM,EAAE,EAAE;AACtC,YAAQ,IAAI,gBAAgB,MAAM,KAAK,EAAE;AACzC,YAAQ,IAAI,gBAAgB,MAAM,MAAM,EAAE;AAC1C,YAAQ,IAAI,gBAAgB,MAAM,GAAG,EAAE;AACvC,YAAQ,IAAI,iBAAiB,MAAM,cAAc,MAAM,QAAQ,CAAC,CAAC,KAAK;AACtE,QAAI,MAAM,SAAS,MAAM,QAAQ;AAC7B,cAAQ,IAAI,gBAAgB,MAAM,KAAK,IAAI,MAAM,MAAM,EAAE;AAAA,IAC7D;AACA,YAAQ,IAAI,gBAAgB,IAAI,KAAK,MAAM,SAAS,EAAE,eAAe,CAAC,EAAE;AAExE,QAAI,MAAM,UAAU;AAChB,YAAM,OAAO,OAAO,MAAM,aAAa,WAAW,KAAK,MAAM,MAAM,QAAQ,IAAI,MAAM;AACrF,UAAI,KAAK,aAAa;AAClB,gBAAQ,IAAI,gBAAgB,KAAK,WAAW,EAAE;AAAA,MAClD;AACA,UAAI,KAAK,gBAAgB;AACrB,gBAAQ,IAAI,gBAAgB,KAAK,cAAc,EAAE;AAAA,MACrD;AACA,UAAI,KAAK,MAAM;AACX,gBAAQ,IAAI,gBAAgB,KAAK,IAAI,EAAE;AAAA,MAC3C;AAAA,IACJ;AAAA,EACJ,CAAC;AACT;;;AC5CA,SAAS,WAAAC,iBAAe;AACxB,SAAS,WAAAC,gBAAe;AAKjB,SAAS,2BAAoC;AAChD,SAAO,IAAIC,UAAQ,QAAQ,EACtB,YAAY,0BAA0B,EACtC,SAAS,QAAQ,UAAU,EAC3B,OAAO,aAAa,mBAAmB,EACvC,OAAO,OAAO,IAAI,YAAY;AAC3B,UAAM,gBAAgB,IAAI,cAAc;AACxC,UAAM,SAAS,MAAM,cAAc,KAAK;AAExC,QAAI,CAAC,QAAQ;AACT,YAAM,IAAI,gBAAgB,yCAAyC;AAAA,IACvE;AAEA,QAAI,CAAC,QAAQ,KAAK;AACd,YAAM,YAAY,MAAMC,SAAQ;AAAA,QAC5B,SAAS,0CAA0C,EAAE;AAAA,QACrD,SAAS;AAAA,MACb,CAAC;AAED,UAAI,CAAC,WAAW;AACZ,gBAAQ,IAAI,YAAY;AACxB;AAAA,MACJ;AAAA,IACJ;AAEA,UAAM,eAAe,IAAI,aAAa;AACtC,UAAM,aAAa,OAAO,QAAQ,SAAS,EAAE,CAAC;AAE9C,YAAQ,IAAI,iBAAY,EAAE,wBAAwB;AAAA,EACtD,CAAC;AACT;;;AL7BA,SAAS,gBAAsB;AAC3B,UAAQ,IAAIC,QAAM,KAAK,KAAK,sBAAe,IAAIA,QAAM,IAAI,8BAA8B,CAAC;AACxF,UAAQ,IAAI;AACZ,UAAQ,IAAIA,QAAM,OAAO,4EAA6C,CAAC;AACvE,UAAQ,IAAI;AACZ,UAAQ,IAAIA,QAAM,KAAK,mBAAW,CAAC;AACnC,UAAQ,IAAI,KAAKA,QAAM,KAAK,KAAK,CAAC,yCAA0B;AAC5D,UAAQ,IAAI,KAAKA,QAAM,KAAK,MAAM,CAAC,2DAA8B;AACjE,UAAQ,IAAI,KAAKA,QAAM,KAAK,MAAM,CAAC,iCAAyB;AAC5D,UAAQ,IAAI,KAAKA,QAAM,KAAK,QAAQ,CAAC,qBAAa;AAClD,UAAQ,IAAI;AACZ,UAAQ,IAAIA,QAAM,KAAK,gBAAQ,CAAC;AAChC,UAAQ,IAAIA,QAAM,IAAI,iCAAiC,CAAC;AACxD,UAAQ,IAAIA,QAAM,IAAI,qBAAqB,CAAC;AAC5C,UAAQ,IAAIA,QAAM,IAAI,gCAAgC,CAAC;AACvD,UAAQ,IAAI;AACZ,UAAQ,IAAIA,QAAM,IAAI,0EAAiD,CAAC;AAC5E;AAEO,SAAS,qBAA8B;AAC1C,QAAM,MAAM,IAAIC,UAAQ,OAAO,EAC1B,YAAY,yCAAyC,EACrD,OAAO,MAAM;AACV,kBAAc;AAAA,EAClB,CAAC;AAEL,MAAI,WAAW,sBAAsB,CAAC;AACtC,MAAI,WAAW,uBAAuB,CAAC;AACvC,MAAI,WAAW,uBAAuB,CAAC;AACvC,MAAI,WAAW,yBAAyB,CAAC;AAEzC,SAAO;AACX;;;AMlCA,SAAS,WAAAC,iBAAe;AACxB,SAAS,UAAAC,SAAQ,OAAO,WAAAC,gBAAe;AAGvC,OAAO,QAAQ;AACf,SAAS,YAAYC,YAAU;AAC/B,SAAS,QAAAC,aAAY;AAsBrB,eAAe,iBAA2C;AACtD,QAAM,UAA2B;AAAA,IAC7B,IAAI,GAAG,GAAG,SAAS,CAAC,IAAI,GAAG,QAAQ,CAAC;AAAA,EACxC;AAGA,MAAI;AACA,UAAM,kBAAkB,IAAI,IAAI,sBAAsB,YAAY,GAAG;AACrE,UAAM,cAAc,KAAK,MAAM,MAAMC,KAAG,SAAS,iBAAiB,OAAO,CAAC;AAC1E,YAAQ,cAAc,YAAY;AAAA,EACtC,QAAQ;AAAA,EAER;AAGA,MAAI;AACA,UAAM,qBAAqB,MAAMA,KAAG,SAASC,MAAK,QAAQ,IAAI,GAAG,cAAc,GAAG,OAAO;AACzF,UAAM,cAAc,KAAK,MAAM,kBAAkB;AACjD,YAAQ,eAAe,YAAY;AAAA,EACvC,QAAQ;AAAA,EAER;AAEA,SAAO;AACX;AAKA,eAAe,eACX,QACA,WACA,MAMmE;AACnE,QAAM,WAAW,MAAM,MAAM,GAAG,MAAM,iBAAiB;AAAA,IACnD,QAAQ;AAAA,IACR,SAAS;AAAA,MACL,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,IACvB;AAAA,IACA,MAAM,KAAK,UAAU;AAAA,MACjB,MAAM,KAAK;AAAA,MACX,OAAO,KAAK;AAAA,MACZ,SAAS,KAAK;AAAA,MACd,SAAS,KAAK;AAAA,MACd,QAAQ;AAAA,IACZ,CAAC;AAAA,EACL,CAAC;AAED,QAAM,SAAS,MAAM,SAAS,KAAK;AAEnC,MAAI,CAAC,SAAS,IAAI;AACd,WAAO,EAAE,SAAS,OAAO,OAAO,OAAO,SAAS,4BAA4B;AAAA,EAChF;AAEA,SAAO,EAAE,SAAS,MAAM,aAAa,OAAO,KAAK,YAAY;AACjE;AAKA,eAAe,0BAA0B,QAA4B;AACjE,UAAQ,IAAI,qCAA8B;AAG1C,QAAM,OAAO,MAAMC,QAAO;AAAA,IACtB,SAAS;AAAA,IACT,SAAS;AAAA,MACL;AAAA,QACI,MAAM;AAAA,QACN,OAAO;AAAA,MACX;AAAA,MACA;AAAA,QACI,MAAM;AAAA,QACN,OAAO;AAAA,MACX;AAAA,MACA;AAAA,QACI,MAAM;AAAA,QACN,OAAO;AAAA,MACX;AAAA,IACJ;AAAA,IACA,OAAO;AAAA,EACX,CAAC;AAGD,QAAM,QAAQ,MAAM,MAAM;AAAA,IACtB,SAAS;AAAA,IACT,UAAU,CAAC,UAAU;AACjB,UAAI,CAAC,SAAS,MAAM,KAAK,EAAE,WAAW,GAAG;AACrC,eAAO;AAAA,MACX;AACA,UAAI,MAAM,SAAS,KAAK;AACpB,eAAO;AAAA,MACX;AACA,aAAO;AAAA,IACX;AAAA,EACJ,CAAC;AAGD,QAAM,UAAU,MAAM,MAAM;AAAA,IACxB,SAAS;AAAA,IACT,UAAU,CAAC,UAAU;AACjB,UAAI,CAAC,SAAS,MAAM,KAAK,EAAE,WAAW,GAAG;AACrC,eAAO;AAAA,MACX;AACA,UAAI,MAAM,SAAS,KAAM;AACrB,eAAO;AAAA,MACX;AACA,aAAO;AAAA,IACX;AAAA,EACJ,CAAC;AAGD,QAAM,UAAU,MAAM,eAAe;AAGrC,UAAQ,IAAI,wBAAiB;AAC7B,UAAQ,IAAI,gBAAgB,IAAI,EAAE;AAClC,UAAQ,IAAI,gBAAgB,KAAK,EAAE;AACnC,UAAQ,IAAI,gBAAgB,QAAQ,UAAU,GAAG,GAAG,CAAC,GAAG,QAAQ,SAAS,MAAM,QAAQ,EAAE,EAAE;AAC3F,MAAI,SAAS;AACT,YAAQ,IAAI,oBAAoB,QAAQ,EAAE,UAAU,QAAQ,eAAe,SAAS,EAAE;AAAA,EAC1F;AAEA,QAAM,YAAY,MAAMC,SAAQ;AAAA,IAC5B,SAAS;AAAA,IACT,SAAS;AAAA,EACb,CAAC;AAED,MAAI,CAAC,WAAW;AACZ,YAAQ,IAAI,qBAAgB;AAC5B;AAAA,EACJ;AAGA,UAAQ,IAAI,iCAA4B;AAExC,MAAI;AACA,UAAM,SAAS,MAAM,eAAe,OAAO,QAAQ,OAAO,WAAW;AAAA,MACjE;AAAA,MACA,OAAO,MAAM,KAAK;AAAA,MAClB,SAAS,QAAQ,KAAK;AAAA,MACtB;AAAA,IACJ,CAAC;AAED,QAAI,OAAO,SAAS;AAChB,cAAQ,IAAI;AAAA,wCAAsC;AAClD,cAAQ,IAAI,mBAAmB,OAAO,WAAW;AAAA,CAAI;AACrD,cAAQ,IAAI,yDAAyD;AAAA,IACzE,OAAO;AACH,cAAQ,MAAM;AAAA,oCAAkC,OAAO,KAAK,EAAE;AAC9D,cAAQ,KAAK,CAAC;AAAA,IAClB;AAAA,EACJ,SAAS,OAAO;AACZ,YAAQ,MAAM,2BAAsB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAC1F,YAAQ,KAAK,CAAC;AAAA,EAClB;AACJ;AAKA,eAAe,6BAA6B,QAAa,SAAyC;AAE9F,MAAI,CAAC,QAAQ,QAAQ,CAAC,QAAQ,SAAS,CAAC,QAAQ,SAAS;AACrD,UAAM,IAAI,gBAAgB,qDAAqD;AAAA,EACnF;AAGA,QAAM,aAAa,CAAC,OAAO,WAAW,YAAY;AAClD,MAAI,CAAC,WAAW,SAAS,QAAQ,IAAI,GAAG;AACpC,UAAM,IAAI,gBAAgB,iCAAiC,WAAW,KAAK,IAAI,CAAC,EAAE;AAAA,EACtF;AAGA,MAAI,QAAQ,MAAM,SAAS,KAAK;AAC5B,UAAM,IAAI,gBAAgB,sCAAsC;AAAA,EACpE;AAEA,MAAI,QAAQ,QAAQ,SAAS,KAAM;AAC/B,UAAM,IAAI,gBAAgB,yCAAyC;AAAA,EACvE;AAGA,MAAI;AACJ,MAAI,CAAC,QAAQ,WAAW;AACpB,cAAU,MAAM,eAAe;AAG/B,QAAI,QAAQ,SAAS;AACjB,UAAI;AACA,cAAM,gBAAgB,KAAK,MAAM,QAAQ,OAAO;AAChD,kBAAU,EAAE,GAAG,SAAS,GAAG,cAAc;AAAA,MAC7C,QAAQ;AACJ,cAAM,IAAI,gBAAgB,2BAA2B;AAAA,MACzD;AAAA,IACJ;AAAA,EACJ;AAGA,MAAI;AACA,UAAM,SAAS,MAAM,eAAe,OAAO,QAAQ,OAAO,WAAW;AAAA,MACjE,MAAM,QAAQ;AAAA,MACd,OAAO,QAAQ,MAAM,KAAK;AAAA,MAC1B,SAAS,QAAQ,QAAQ,KAAK;AAAA,MAC9B;AAAA,IACJ,CAAC;AAED,QAAI,OAAO,SAAS;AAChB,UAAI,QAAQ,MAAM;AACd,gBAAQ,IAAI,KAAK,UAAU,EAAE,SAAS,MAAM,aAAa,OAAO,YAAY,CAAC,CAAC;AAAA,MAClF,OAAO;AACH,gBAAQ,IAAI,8BAAyB,OAAO,WAAW,EAAE;AAAA,MAC7D;AAAA,IACJ,OAAO;AACH,UAAI,QAAQ,MAAM;AACd,gBAAQ,IAAI,KAAK,UAAU,EAAE,SAAS,OAAO,OAAO,OAAO,MAAM,CAAC,CAAC;AAAA,MACvE,OAAO;AACH,gBAAQ,MAAM,iBAAY,OAAO,KAAK,EAAE;AAAA,MAC5C;AACA,cAAQ,KAAK,CAAC;AAAA,IAClB;AAAA,EACJ,SAAS,OAAO;AACZ,QAAI,QAAQ,MAAM;AACd,cAAQ,IAAI,KAAK,UAAU,EAAE,SAAS,OAAO,OAAO,iBAAiB,QAAQ,MAAM,UAAU,gBAAgB,CAAC,CAAC;AAAA,IACnH,OAAO;AACH,cAAQ,MAAM,iBAAY,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IACpF;AACA,YAAQ,KAAK,CAAC;AAAA,EAClB;AACJ;AAKA,eAAe,sBAAsB,SAAyC;AAC1E,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,SAAS,MAAM,cAAc,KAAK;AAExC,MAAI,CAAC,QAAQ;AACT,UAAM,IAAI,gBAAgB,yCAAyC;AAAA,EACvE;AAGA,MAAI,eAAe;AACnB,MAAI,CAAC,QAAQ,MAAM,SAAS,CAAC,QAAQ,SAAS;AAE1C,UAAM,SAAmB,CAAC;AAC1B,qBAAiB,SAAS,QAAQ,OAAO;AACrC,aAAO,KAAK,KAAK;AAAA,IACrB;AACA,mBAAe,OAAO,OAAO,MAAM,EAAE,SAAS,OAAO,EAAE,KAAK;AAAA,EAChE;AAGA,MAAI,cAAc;AACd,YAAQ,UAAU;AAAA,EACtB;AAGA,QAAM,gBAAgB,CAAC,QAAQ,QAAQ,CAAC,QAAQ,SAAS,CAAC,QAAQ;AAElE,MAAI,eAAe;AACf,UAAM,0BAA0B,MAAM;AAAA,EAC1C,OAAO;AACH,UAAM,6BAA6B,QAAQ,OAAO;AAAA,EACtD;AACJ;AAKO,SAAS,wBAAiC;AAC7C,QAAM,MAAM,IAAIC,UAAQ,UAAU,EAC7B,MAAM,QAAQ,EACd,YAAY,sDAAsD,EAClE,OAAO,iBAAiB,yCAAyC,EACjE,OAAO,mBAAmB,gCAAgC,EAC1D,OAAO,uBAAuB,mCAAmC,EACjE,OAAO,oBAAoB,4BAA4B,EACvD,OAAO,gBAAgB,kCAAkC,EACzD,OAAO,UAAU,oBAAoB,EACrC,OAAO,OAAO,YAA6B;AACxC,UAAM,sBAAsB,OAAO;AAAA,EACvC,CAAC;AAEL,SAAO;AACX;;;ACjUA,SAAS,WAAAC,iBAAe;AAOxB,SAAS,WAAAC,gBAAe;AACxB,OAAOC,SAAQ;AACf,SAAS,YAAYC,YAAU;AAC/B,SAAS,YAAAC,WAAU,QAAAC,aAAY;AAC/B,SAAS,WAAWC,oBAAmB;AA+ChC,SAAS,0BAAmC;AACjD,QAAM,MAAM,IAAIC,UAAQ,aAAa,EAClC,YAAY,0FAAiD,EAC7D,OAAO,UAAU,gBAAgB,EACjC,OAAO,UAAU,iCAAiC,EAClD,OAAO,YAAY,8CAA8C,EACjE,OAAO,oBAAoB,oCAAoC,EAC/D,OAAO,gBAAgB,2BAA2B,EAClD,OAAO,OAAO,YAA+B;AAC5C,UAAM,iBAAiB,OAAO;AAAA,EAChC,CAAC;AAEH,SAAO;AACT;AAEA,eAAe,iBAAiB,SAA2C;AAEzE,QAAM,aAAa,QAAQ,KAAK,SAAS,QAAQ;AACjD,QAAM,gBAAgB,QAAQ,QAAQ;AACtC,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,SAAS,MAAM,cAAc,KAAK;AAExC,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,gBAAgB,yCAAyC;AAAA,EACrE;AAEA,QAAM,UAAU,MAAM,kBAAkB,QAAQ,OAAO;AAEvD,MAAI,eAAe;AACjB,QAAI,CAAC,QAAQ,QAAQ;AACnB,cAAQ,IAAI,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAC5C;AAAA,IACF;AAAA,EACF,OAAO;AACL,qBAAiB,SAAS,QAAQ,SAAS,IAAI;AAAA,EACjD;AAEA,MAAI,QAAQ,QAAQ;AAClB,UAAM,kBAAkB,IAAI,gBAAgB;AAC5C,UAAM,cAAc,MAAM,gBAAgB,cAAc,EAAE,YAAY,GAAG,YAAY,IAAO,CAAC;AAC7F,UAAM,YAA6B,YAAY,MAAM,IAAI,CAAC,MAAM,EAAE,KAAK;AAEvE,UAAM,UAAU,QAAQ,KAAK,SAAS,WAAW;AACjD,UAAM,UAAU,MAAM,kBAAkB,QAAQ,SAAS,WAAW,OAAO;AAC3E,UAAM,WAAW,MAAM,cAAc,SAAS,aAAa;AAC3D,QAAI,CAAC,UAAU;AACb,UAAI,CAAC,eAAe;AAClB,gBAAQ,IAAI,oDAA6B;AAAA,MAC3C,OAAO;AACL,gBAAQ,IAAI,KAAK,UAAU,EAAE,SAAS,OAAO,WAAW,KAAK,GAAG,MAAM,CAAC,CAAC;AAAA,MAC1E;AACA;AAAA,IACF;AAEA,UAAM,SAAS,MAAM,iBAAiB,OAAO,QAAQ,OAAO,WAAW,SAAS,WAAW,OAAO;AAElG,QAAI,OAAO,SAAS;AAClB,YAAM,gBAAgB,MAAM,YAAY,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AAAA,IAClE;AAEA,QAAI,eAAe;AACjB,cAAQ,IAAI,KAAK,UAAU,EAAE,GAAG,QAAQ,iBAAiB,UAAU,OAAO,GAAG,MAAM,CAAC,CAAC;AACrF;AAAA,IACF;AAEA,QAAI,OAAO,SAAS;AAClB,cAAQ,IAAI;AAAA,+DAA0C,OAAO,WAAW,EAAE;AAC1E,UAAI,UAAU,SAAS,GAAG;AACxB,gBAAQ,IAAI,+BAAa,UAAU,MAAM,iCAA4B;AAAA,MACvE;AAAA,IACF,OAAO;AACL,cAAQ,MAAM;AAAA,kDAAiC,OAAO,KAAK,EAAE;AAC7D,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF;AAEA,eAAe,kBACb,QACA,SAC4B;AAC5B,QAAM,aAAa,gBAAY,WAAW;AAC1C,QAAM,aAAY,oBAAI,KAAK,GAAE,YAAY;AAEzC,QAAM,oBAAoB,IAAI,kBAAkB;AAChD,QAAM,sBAAsB,MAAM,kBAAkB,aAAa;AACjE,QAAM,mBAAmB,OAAO,OAAO,mBAAmB;AAE1D,QAAM,UAAU,MAAM,eAAe;AACrC,QAAM,aAAa,QAAQ,IAAI;AAE/B,QAAM,eAAe,IAAI,oBAAoB,QAAQ,IAAI,CAAC;AAC1D,QAAM,aAAa,MAAM,aAAa,WAAW;AAEjD,QAAM,UAA6B;AAAA,IACjC;AAAA,IACA,QAAQ;AAAA,MACN,IAAI,GAAGC,IAAG,SAAS,CAAC,IAAIA,IAAG,QAAQ,CAAC;AAAA,MACpC,MAAMA,IAAG,KAAK;AAAA,MACd,MAAMC;AAAA,MACN;AAAA,IACF;AAAA,IACA,QAAQ;AAAA,MACN,QAAQ,OAAO;AAAA,MACf,iBAAiBC,SAAQ,OAAO,SAAS;AAAA,MACzC,kBAAkB,OAAO;AAAA,MACzB,aAAa,OAAO;AAAA,IACtB;AAAA,IACA,SAAS;AAAA,MACP,SAASC,UAAS,UAAU;AAAA,MAC5B;AAAA,MACA,gBAAgB,iBAAiB;AAAA,IACnC;AAAA,IACA,KAAK;AAAA,MACH,SAAS,WAAW,UAChB,EAAE,IAAI,WAAW,QAAQ,IAAI,MAAM,WAAW,QAAQ,KAAK,IAC3D;AAAA,MACJ,QAAQ,WAAW,OAAO,IAAI,CAAC,SAAS;AAAA,QACtC,IAAI,IAAI;AAAA,QACR,MAAM,IAAI;AAAA,QACV,WAAW,IAAI;AAAA,QACf,eAAe,IAAI;AAAA,QACnB,YAAY,IAAI;AAAA,MAClB,EAAE;AAAA,IACJ;AAAA,EACF;AAEA,MAAI,QAAQ,WAAW;AACrB,YAAQ,QAAQ,UAAU;AAAA,EAC5B;AAEA,MAAI,QAAQ,MAAM;AAChB,UAAM,gBAAgB,iBACnB,KAAK,CAAC,GAAG,MAAM,EAAE,SAAS,cAAc,EAAE,QAAQ,CAAC,EACnD,MAAM,GAAG,EAAE,EACX,IAAI,CAAC,UAAU;AAAA,MACd,UAAU,KAAK;AAAA,MACf,SAAS,KAAK;AAAA,MACd,UAAU,KAAK;AAAA,IACjB,EAAE;AAEJ,YAAQ,aAAa;AAAA,EACvB;AAEA,SAAO;AACT;AAEA,eAAe,iBAAmC;AAChD,QAAM,cAAcC,MAAK,QAAQ,IAAI,GAAG,OAAO;AAC/C,MAAI;AACF,UAAMC,KAAG,OAAO,WAAW;AAC3B,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAASH,SAAQ,KAAqB;AACpC,MAAI,IAAI,UAAU,EAAG,QAAO;AAC5B,SAAO,SAAS,IAAI,MAAM,EAAE;AAC9B;AAEA,SAAS,iBAAiB,SAA4B,mBAAkC;AACtF,UAAQ,IAAI,kBAAkB;AAC9B,UAAQ,IAAI,kBAAkB;AAC9B,UAAQ,IAAI,cAAc,QAAQ,SAAS,EAAE;AAE7C,UAAQ,IAAI,WAAW;AACvB,UAAQ,IAAI,SAAS,QAAQ,OAAO,EAAE,EAAE;AACxC,UAAQ,IAAI,WAAW,QAAQ,OAAO,IAAI,EAAE;AAC5C,UAAQ,IAAI,WAAW,QAAQ,OAAO,IAAI,EAAE;AAC5C,UAAQ,IAAI,kBAAkB,QAAQ,OAAO,cAAc,SAAS,EAAE;AAEtE,UAAQ,IAAI,WAAW;AACvB,UAAQ,IAAI,cAAc,QAAQ,OAAO,MAAM,EAAE;AACjD,UAAQ,IAAI,iBAAiB,QAAQ,OAAO,eAAe,EAAE;AAC7D,UAAQ,IAAI,wBAAwB,QAAQ,OAAO,oBAAoB,SAAS,EAAE;AAClF,UAAQ,IAAI,mBAAmB,QAAQ,OAAO,eAAe,SAAS,EAAE;AAExE,UAAQ,IAAI,YAAY;AACxB,UAAQ,IAAI,UAAU,QAAQ,QAAQ,OAAO,EAAE;AAC/C,MAAI,QAAQ,QAAQ,SAAS;AAC3B,YAAQ,IAAI,eAAe,QAAQ,QAAQ,OAAO,EAAE;AAAA,EACtD;AACA,UAAQ,IAAI,mBAAmB,QAAQ,QAAQ,OAAO,EAAE;AACxD,UAAQ,IAAI,sBAAsB,QAAQ,QAAQ,cAAc,EAAE;AAElE,UAAQ,IAAI,QAAQ;AACpB,MAAI,QAAQ,IAAI,SAAS;AACvB,YAAQ,IAAI,cAAc,QAAQ,IAAI,QAAQ,EAAE,KAAK,QAAQ,IAAI,QAAQ,IAAI,GAAG;AAAA,EAClF,OAAO;AACL,YAAQ,IAAI,iBAAiB;AAAA,EAC/B;AACA,MAAI,QAAQ,IAAI,OAAO,WAAW,GAAG;AACnC,YAAQ,IAAI,gBAAgB;AAAA,EAC9B,OAAO;AACL,YAAQ,IAAI,WAAW;AACvB,eAAW,OAAO,QAAQ,IAAI,QAAQ;AACpC,cAAQ;AAAA,QACN,SAAS,IAAI,EAAE,KAAK,IAAI,IAAI,WAAW,IAAI,SAAS,cAAc,IAAI,aAAa,eAAe,IAAI,UAAU;AAAA,MAClH;AAAA,IACF;AAAA,EACF;AAEA,MAAI,qBAAqB,QAAQ,YAAY;AAC3C,YAAQ,IAAI,eAAe;AAC3B,QAAI,QAAQ,WAAW,WAAW,GAAG;AACnC,cAAQ,IAAI,QAAQ;AAAA,IACtB,OAAO;AACL,iBAAW,aAAa,QAAQ,YAAY;AAC1C,cAAM,gBAAgB,UAAU,WAAW,cAAc;AACzD,gBAAQ,IAAI,OAAO,UAAU,QAAQ,IAAI,UAAU,OAAO,GAAG,aAAa,EAAE;AAAA,MAC9E;AAAA,IACF;AAAA,EACF;AACF;AAQA,IAAM,mBAAkC;AAAA,EACtC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AACX;AAEA,eAAe,iBACb,QACA,WACA,SACA,WACA,SACqE;AACrE,QAAM,WAAW,MAAM,MAAM,GAAG,MAAM,iBAAiB;AAAA,IACrD,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,IACrB;AAAA,IACA,MAAM,KAAK,UAAU;AAAA,MACnB,MAAM,QAAQ;AAAA,MACd,OAAO,QAAQ;AAAA,MACf,SAAS,QAAQ;AAAA,MACjB,SAAS;AAAA,QACP,aAAa;AAAA,QACb,YAAY;AAAA,MACd;AAAA,MACA,QAAQ;AAAA,IACV,CAAC;AAAA,EACH,CAAC;AAED,QAAM,SAAS,MAAM,SAAS,KAAK;AAEnC,MAAI,CAAC,SAAS,IAAI;AAChB,WAAO,EAAE,SAAS,OAAO,OAAO,OAAO,SAAS,+BAA+B;AAAA,EACjF;AAEA,SAAO,EAAE,SAAS,MAAM,aAAa,OAAO,MAAM,YAAY;AAChE;AAEA,SAAS,mBAAmB,SAA4B,WAAoC;AAC1F,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK,UAAU,EAAE,aAAa,SAAS,YAAY,UAAU,GAAG,MAAM,CAAC;AAAA,EACzE,EAAE,KAAK,IAAI;AACb;AAEA,SAAS,kBAAkB,KAAmC;AAC5D,MAAI;AACF,UAAM,UAAU,IAAI,KAAK,EAAE,QAAQ,gBAAgB,EAAE,EAAE,QAAQ,SAAS,EAAE;AAC1E,UAAM,SAAS,KAAK,MAAM,OAAO;AACjC,QAAI,CAAC,UAAU,OAAO,WAAW,SAAU,QAAO;AAClD,QAAI,CAAC,CAAC,OAAO,WAAW,YAAY,EAAE,SAAS,OAAO,IAAI,EAAG,QAAO;AACpE,QAAI,CAAC,OAAO,SAAS,OAAO,MAAM,SAAS,IAAK,QAAO;AACvD,QAAI,CAAC,OAAO,WAAW,OAAO,QAAQ,SAAS,IAAM,QAAO;AAC5D,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,kBACb,QACA,SACA,WACA,SACwB;AACxB,QAAM,MAAM,IAAI,gBAAgB,EAAE,QAAQ,OAAO,QAAQ,WAAW,OAAO,UAAU,CAAQ;AAC7F,QAAM,SAAS,mBAAmB,SAAS,SAAS;AACpD,MAAI;AACF,UAAM,UAAU,MAAM,IAAI,KAAK;AAAA,MAC7B,EAAE,MAAM,UAAU,SAAS,qDAAqD;AAAA,MAChF,EAAE,MAAM,QAAQ,SAAS,OAAO;AAAA,IAClC,GAAG,gBAAgB;AAEnB,UAAM,SAAS,kBAAkB,OAAO;AACxC,QAAI,OAAQ,QAAO;AAEnB,QAAI,SAAS;AACX,cAAQ,MAAM,iEAA0C;AACxD,cAAQ,MAAM,QAAQ,MAAM,GAAG,GAAI,CAAC;AAAA,IACtC;AAAA,EACF,SAAS,OAAO;AACd,QAAI,SAAS;AACX,cAAQ,MAAM,sBAAsB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IAC5F;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAe,cAAc,SAAwB,UAAqC;AACxF,MAAI,UAAU;AACZ,WAAO;AAAA,EACT;AAEA,UAAQ,IAAI,wBAAwB;AACpC,UAAQ,IAAI,uBAAuB;AACnC,UAAQ,IAAI,SAAS,QAAQ,IAAI,EAAE;AACnC,UAAQ,IAAI,UAAU,QAAQ,KAAK,EAAE;AACrC,UAAQ,IAAI,UAAU;AACtB,UAAQ,IAAI,QAAQ,OAAO;AAE3B,SAAOI,SAAQ,EAAE,SAAS,wDAAsC,SAAS,KAAK,CAAC;AACjF;;;ACxYA,SAAS,WAAAC,iBAAe;AACxB,OAAOC,aAAW;;;ACFlB,SAAS,WAAAC,iBAAe;AACxB,OAAOC,aAAW;AAClB,OAAOC,YAAW;AAGX,SAAS,6BAAsC;AACpD,SAAO,IAAIC,UAAQ,MAAM,EACtB,YAAY,yBAAsB,EAClC,OAAO,UAAU,oBAAoB,EACrC,OAAO,OAAO,YAAgC;AAC7C,UAAM,UAAU,IAAI,gBAAgB;AACpC,UAAM,QAAQ,MAAM,QAAQ,KAAK;AAEjC,QAAI,MAAM,WAAW,GAAG;AACtB,UAAI,QAAQ,MAAM;AAChB,gBAAQ,IAAI,KAAK,UAAU,EAAE,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC;AAAA,MACnD,OAAO;AACL,gBAAQ,IAAI,0CAA4B;AAAA,MAC1C;AACA;AAAA,IACF;AAEA,UAAM,OAAO,CAAC;AACd,eAAWC,UAAQ,OAAO;AACxB,YAAM,OAAO,MAAM,QAAQ,QAAQA,MAAI;AACvC,UAAI,MAAM;AACR,aAAK,KAAK;AAAA,UACR,IAAIA,OAAK,MAAM,GAAG,EAAE,IAAI,GAAG,QAAQ,WAAW,EAAE,KAAKA;AAAA,UACrD,WAAW,KAAK,MAAM;AAAA,UACtB,SAAS,KAAK,MAAM;AAAA,UACpB,SAAS,KAAK,MAAM;AAAA,QACtB,CAAC;AAAA,MACH;AAAA,IACF;AAEA,QAAI,QAAQ,MAAM;AAChB,cAAQ,IAAI,KAAK,UAAU,EAAE,KAAK,GAAG,MAAM,CAAC,CAAC;AAC7C;AAAA,IACF;AAEA,UAAM,QAAQ,IAAIC,OAAM;AAAA,MACtB,MAAM,CAAC,MAAM,aAAa,WAAW,SAAS;AAAA,MAC9C,WAAW,CAAC,IAAI,IAAI,IAAI,EAAE;AAAA,MAC1B,UAAU;AAAA,IACZ,CAAC;AAED,eAAW,OAAO,MAAM;AACtB,YAAM,KAAK;AAAA,QACTC,QAAM,KAAK,IAAI,EAAE;AAAA,QACjB,IAAI,aAAa;AAAA,QACjB,IAAI,WAAW;AAAA,QACf,IAAI,WAAW;AAAA,MACjB,CAAC;AAAA,IACH;AAEA,YAAQ,IAAI,MAAM,SAAS,CAAC;AAAA,EAC9B,CAAC;AACL;;;ACzDA,SAAS,WAAAC,iBAAe;AAGjB,SAAS,6BAAsC;AACpD,SAAO,IAAIC,UAAQ,MAAM,EACtB,YAAY,6BAAwB,EACpC,SAAS,QAAQ,gCAAgC,EACjD,OAAO,UAAU,oBAAoB,EACrC,OAAO,OAAO,IAAwB,YAAgC;AACrE,UAAM,UAAU,IAAI,gBAAgB;AACpC,UAAM,QAAQ,MAAM,QAAQ,KAAK;AAEjC,QAAI,MAAM,WAAW,GAAG;AACtB,cAAQ,IAAI,0CAA4B;AACxC;AAAA,IACF;AAEA,QAAI;AACJ,QAAI,CAAC,IAAI;AACP,mBAAa,MAAM,CAAC;AAAA,IACtB,OAAO;AACL,mBAAa,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,GAAG,EAAE,OAAO,CAAC;AAAA,IACzD;AAEA,QAAI,CAAC,YAAY;AACf,cAAQ,MAAM,yCAAyB,EAAE,EAAE;AAC3C,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,OAAO,MAAM,QAAQ,QAAQ,UAAU;AAC7C,QAAI,CAAC,MAAM;AACT,cAAQ,MAAM,kDAA2B;AACzC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,YAAQ,IAAI,KAAK,UAAU,KAAK,OAAO,MAAM,CAAC,CAAC;AAAA,EACjD,CAAC;AACL;;;ACrCA,SAAS,WAAAC,iBAAe;AACxB,SAAS,WAAAC,gBAAe;AASjB,SAAS,8BAAuC;AACrD,SAAO,IAAIC,UAAQ,OAAO,EACvB,YAAY,mBAAgB,EAC5B,OAAO,SAAS,uBAAuB,EACvC,OAAO,aAAa,4BAA4B,EAChD,OAAO,aAAa,mBAAmB,EACvC,OAAO,OAAO,YAA0B;AACvC,UAAM,UAAU,IAAI,gBAAgB;AACpC,UAAM,QAAQ,MAAM,QAAQ,KAAK;AAEjC,QAAI,MAAM,WAAW,GAAG;AACtB,cAAQ,IAAI,8DAAmC;AAC/C;AAAA,IACF;AAEA,QAAI,QAAQ,KAAK;AACf,UAAI,EAAE,QAAQ,OAAQ,MAAMC,SAAQ,EAAE,SAAS,uCAA0B,SAAS,MAAM,CAAC,IAAK;AAC5F,gBAAQ,IAAI,6BAAW;AACvB;AAAA,MACF;AACA,YAAM,QAAQ,MAAM,KAAK;AACzB,cAAQ,IAAI,4BAAY,MAAM,MAAM,cAAc;AAClD;AAAA,IACF;AAEA,QAAI,CAAC,QAAQ,IAAI;AACf,cAAQ,MAAM,uDAAuC;AACrD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,aAAa,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,GAAG,QAAQ,EAAE,OAAO,CAAC;AACrE,QAAI,CAAC,YAAY;AACf,cAAQ,MAAM,yCAAyB,QAAQ,EAAE,EAAE;AACnD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,QAAI,EAAE,QAAQ,OAAQ,MAAMA,SAAQ,EAAE,SAAS,cAAW,QAAQ,EAAE,KAAK,SAAS,MAAM,CAAC,IAAK;AAC5F,cAAQ,IAAI,6BAAW;AACvB;AAAA,IACF;AAEA,UAAM,QAAQ,MAAM,CAAC,UAAU,CAAC;AAChC,YAAQ,IAAI,gCAAgB,QAAQ,EAAE,GAAG;AAAA,EAC3C,CAAC;AACL;;;AH/CA,SAAS,iBAAuB;AAC9B,UAAQ,IAAIC,QAAM,KAAK,KAAK,uBAAgB,IAAIA,QAAM,IAAI,gDAA8B,CAAC;AACzF,UAAQ,IAAI;AACZ,UAAQ,IAAIA,QAAM,KAAK,mBAAW,CAAC;AACnC,UAAQ,IAAI,KAAKA,QAAM,KAAK,MAAM,CAAC,+BAA4B;AAC/D,UAAQ,IAAI,KAAKA,QAAM,KAAK,MAAM,CAAC,mCAA8B;AACjE,UAAQ,IAAI,KAAKA,QAAM,KAAK,OAAO,CAAC,wBAAqB;AACzD,UAAQ,IAAI;AACZ,UAAQ,IAAIA,QAAM,KAAK,gBAAQ,CAAC;AAChC,UAAQ,IAAIA,QAAM,IAAI,sBAAsB,CAAC;AAC7C,UAAQ,IAAIA,QAAM,IAAI,2BAA2B,CAAC;AAClD,UAAQ,IAAIA,QAAM,IAAI,6BAA6B,CAAC;AACpD,UAAQ,IAAI;AACZ,UAAQ,IAAIA,QAAM,IAAI,2EAAkD,CAAC;AAC3E;AAEO,SAAS,sBAA+B;AAC7C,QAAM,gBAAgB,IAAIC,UAAQ,QAAQ,EACvC,YAAY,yBAAyB,EACrC,OAAO,MAAM;AACZ,mBAAe;AAAA,EACjB,CAAC;AAEH,gBAAc,WAAW,2BAA2B,CAAC;AACrD,gBAAc,WAAW,2BAA2B,CAAC;AACrD,gBAAc,WAAW,4BAA4B,CAAC;AAEtD,SAAO;AACT;;;AIlCA,SAAS,WAAAC,iBAAe;AACxB,OAAOC,aAAW;;;ACDlB,SAAS,WAAAC,iBAAe;;;ACAxB,OAAOC,aAAY;AACnB,OAAO,YAAY;AACnB,SAAS,gBAAgB;AA2ClB,IAAM,eAAN,MAAmB;AAAA;AAAA;AAAA;AAAA,EAItB,iBAAiB,SAAkC;AAC/C,UAAM;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc;AAAA,IAClB,IAAI;AAEJ,QAAI,UAAU;AACd,QAAI,UAAW,YAAW;AAC1B,QAAI,UAAW,YAAW;AAC1B,QAAI,OAAQ,YAAW;AACvB,QAAI,QAAS,YAAW;AAExB,QAAI,QAAQ,WAAW,GAAG;AACtB,YAAM,IAAI,MAAM,6CAA6C;AAAA,IACjE;AAEA,UAAM,cAAcA,QAAO,YAAY,MAAM;AAC7C,QAAI,WAAW;AAEf,aAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC7B,YAAM,cAAc,YAAY,CAAC,IAAI,QAAQ;AAC7C,kBAAY,QAAQ,WAAW;AAAA,IACnC;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,SAA+B;AACxC,QAAI,OAAOA,QAAO,WAAW;AAE7B,QAAI,SAAS,WAAW;AACpB,aAAO,KAAK,YAAY;AAAA,IAC5B;AAEA,QAAI,SAAS,WAAW;AACpB,aAAO,KAAK,QAAQ,MAAM,EAAE;AAAA,IAChC;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAKC,QAAwB,WAA2C;AAC1E,QAAI,cAAc,UAAU;AACxB,YAAM,IAAI,MAAM,qCAAqC;AAAA,IACzD;AAEA,UAAM,OAAOD,QAAO,WAAW,SAAS;AACxC,SAAK,OAAOC,MAAK;AACjB,WAAO,KAAK,OAAO,KAAK;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,UAAkB,WAA2C;AACxE,UAAM,UAAU,MAAM,SAAS,QAAQ;AACvC,WAAO,KAAK,KAAK,SAAS,SAAS;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAWA,QAAe,SAAiB,IAAqB;AAClE,WAAO,OAAO,KAAKA,QAAO,MAAM;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,aAAaA,QAAwB,UAAmB,OAAe;AACnE,UAAM,SAAS,OAAOA,WAAU,WAAW,OAAO,KAAKA,QAAO,OAAO,IAAIA;AACzE,QAAI,UAAU,OAAO,SAAS,QAAQ;AAEtC,QAAI,SAAS;AACT,gBAAU,QAAQ,QAAQ,OAAO,GAAG,EAAE,QAAQ,OAAO,GAAG,EAAE,QAAQ,MAAM,EAAE;AAAA,IAC9E;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,aAAaA,QAAuB;AAEhC,QAAI,aAAaA,OAAM,QAAQ,MAAM,GAAG,EAAE,QAAQ,MAAM,GAAG;AAG3D,WAAO,WAAW,SAAS,GAAG;AAC1B,oBAAc;AAAA,IAClB;AAEA,WAAO,OAAO,KAAK,YAAY,QAAQ;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,KAAa,SAAoD;AAC/E,UAAM,YAAY,YAAY,IAAI;AAElC,UAAM,eAA4B;AAAA,MAC9B,QAAQ,QAAQ;AAAA,MAChB,SAAS,QAAQ;AAAA,MACjB,MAAM,QAAQ;AAAA,MACd,QAAQ,QAAQ,UAAU,YAAY,QAAQ,QAAQ,OAAO,IAAI;AAAA,MACjE,UAAU,QAAQ,oBAAoB,QAAQ,WAAW;AAAA,IAC7D;AAEA,UAAM,WAAW,MAAM,MAAM,KAAK,YAAY;AAC9C,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,UAAM,UAAU,YAAY,IAAI;AAEhC,UAAM,UAAkC,CAAC;AACzC,aAAS,QAAQ,QAAQ,CAAC,OAAO,QAAQ;AACrC,cAAQ,GAAG,IAAI;AAAA,IACnB,CAAC;AAED,WAAO;AAAA,MACH,QAAQ,SAAS;AAAA,MACjB,YAAY,SAAS;AAAA,MACrB;AAAA,MACA;AAAA,MACA,QAAQ,KAAK,MAAM,UAAU,SAAS;AAAA,MACtC,MAAM,OAAO,WAAW,MAAM,OAAO;AAAA,IACzC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,OAAuE;AAC7E,UAAM,QAAQ,MAAM,MAAM,GAAG;AAC7B,QAAI,MAAM,WAAW,GAAG;AACpB,YAAM,IAAI,MAAM,oBAAoB;AAAA,IACxC;AAEA,UAAM,CAAC,WAAW,YAAY,SAAS,IAAI;AAE3C,UAAM,SAAS,KAAK,MAAM,KAAK,aAAa,SAAS,EAAE,SAAS,OAAO,CAAC;AACxE,UAAM,UAAU,KAAK,MAAM,KAAK,aAAa,UAAU,EAAE,SAAS,OAAO,CAAC;AAE1E,WAAO,EAAE,QAAQ,SAAS,UAAU;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,SAAiB,QAAgB,QAAyB;AAChE,UAAM,gBAAgB,EAAE,KAAK,SAAS,KAAK,MAAM;AACjD,UAAM,cAAc,EAAE,GAAG,eAAe,GAAG,OAAO;AAElD,UAAM,YAAY,KAAK,aAAa,KAAK,UAAU,WAAW,GAAG,IAAI;AACrE,UAAM,aAAa,KAAK,aAAa,KAAK,UAAU,OAAO,GAAG,IAAI;AAElE,UAAM,iBAAiB,GAAG,SAAS,IAAI,UAAU;AACjD,UAAM,YAAYD,QACb,WAAW,UAAU,MAAM,EAC3B,OAAO,cAAc,EACrB,OAAO,QAAQ,EACf,QAAQ,OAAO,GAAG,EAClB,QAAQ,OAAO,GAAG,EAClB,QAAQ,MAAM,EAAE;AAErB,WAAO,GAAG,SAAS,IAAI,UAAU,IAAI,SAAS;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,WAAmB,eAAwB,OAAa;AAC/D,WAAO,IAAI,KAAK,eAAe,YAAY,YAAY,GAAI;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,MAAY,eAAwB,OAAe;AAC1D,UAAM,YAAY,KAAK,QAAQ;AAC/B,WAAO,eAAe,YAAY,KAAK,MAAM,YAAY,GAAI;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA,EAKA,gBACI,MACA,cACA,YAC6B;AAC7B,UAAM,OAAO,OAAO,SAAS,WAAW,IAAI,KAAK,IAAI,IAAI;AAGzD,UAAM,YAAY,IAAI,KAAK,eAAe,SAAS;AAAA,MAC/C,UAAU;AAAA,MACV,MAAM;AAAA,MACN,OAAO;AAAA,MACP,KAAK;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,IACZ,CAAC;AAED,UAAM,QAAQ,UAAU,cAAc,IAAI;AAC1C,UAAM,YAAY,MAAM,OAAO,CAAC,KAAK,SAAS;AAC1C,UAAI,KAAK,SAAS,WAAW;AACzB,YAAI,KAAK,IAAI,IAAI,KAAK;AAAA,MAC1B;AACA,aAAO;AAAA,IACX,GAAG,CAAC,CAA2B;AAE/B,UAAM,SAAS,GAAG,UAAU,IAAI,IAAI,UAAU,KAAK,IAAI,UAAU,GAAG,IAAI,UAAU,IAAI,IAAI,UAAU,MAAM,IAAI,UAAU,MAAM;AAE9H,WAAO;AAAA,MACH,MAAM;AAAA,MACN,KAAK,KAAK,YAAY;AAAA,IAC1B;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,eAAyB;AAErB,WAAO;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,UAAUC,QAAe,OAAgB,OAAe;AACpD,WAAO,OAAO,UAAUA,MAAK,IAAI,mBAAmBA,MAAK;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA,EAKA,UAAUA,QAAe,OAAgB,OAAe;AACpD,WAAO,OAAO,UAAUA,MAAK,IAAI,mBAAmBA,MAAK;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,OAAuB;AAC/B,QAAI,UAAU,EAAG,QAAO;AAExB,UAAM,IAAI;AACV,UAAM,QAAQ,CAAC,KAAK,MAAM,MAAM,IAAI;AACpC,UAAM,IAAI,KAAK,MAAM,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,CAAC,CAAC;AAElD,WAAO,IAAI,QAAQ,KAAK,IAAI,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC;AAAA,EAC7D;AACJ;;;AD1UA,eAAe,yBAAyB,SAQtB;AACd,QAAM,UAAU,IAAI,aAAa;AAEjC,MAAI;AACA,UAAM,YAAsB,CAAC;AAE7B,aAAS,IAAI,GAAG,IAAI,QAAQ,OAAO,KAAK;AACpC,YAAM,WAAW,QAAQ,iBAAiB;AAAA,QACtC,QAAQ,QAAQ;AAAA,QAChB,WAAW,QAAQ;AAAA,QACnB,WAAW,QAAQ;AAAA,QACnB,QAAQ,QAAQ;AAAA,QAChB,SAAS,QAAQ;AAAA,QACjB,aAAa,QAAQ;AAAA,MACzB,CAAC;AACD,gBAAU,KAAK,QAAQ;AAAA,IAC3B;AAEA,YAAQ,IAAI,kCAA2B;AACvC,YAAQ,IAAI,oPAA4C;AAExD,cAAU,QAAQ,CAAC,UAAU,UAAU;AACnC,UAAI,QAAQ,QAAQ,GAAG;AACnB,gBAAQ,IAAI,MAAM,QAAQ,CAAC,KAAK,QAAQ,EAAE;AAAA,MAC9C,OAAO;AACH,gBAAQ,IAAI,MAAM,QAAQ,EAAE;AAAA,MAChC;AAAA,IACJ,CAAC;AAED,YAAQ,IAAI;AAAA,EAChB,SAAS,OAAO;AACZ,YAAQ,MAAM,iBAAY,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAChF,YAAQ,KAAK,CAAC;AAAA,EAClB;AACJ;AAEO,SAAS,wBAAiC;AAC7C,QAAM,MAAM,IAAIC,UAAQ,UAAU,EAC7B,YAAY,iCAAiC,EAC7C,OAAO,yBAAyB,mBAAmB,IAAI,EACvD,OAAO,kBAAkB,2BAA2B,EACpD,OAAO,kBAAkB,2BAA2B,EACpD,OAAO,eAAe,gBAAgB,EACtC,OAAO,gBAAgB,iBAAiB,EACxC,OAAO,0BAA0B,0BAA0B,EAC3D,OAAO,wBAAwB,mCAAmC,GAAG,EACrE,YAAY,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAO7B,EACQ,OAAO,OAAO,YAAY;AACvB,UAAM,yBAAyB;AAAA,MAC3B,GAAG;AAAA,MACH,QAAQ,SAAS,QAAQ,QAAQ,EAAE;AAAA,MACnC,OAAO,SAAS,QAAQ,OAAO,EAAE;AAAA,IACrC,CAAC;AAAA,EACL,CAAC;AAEL,SAAO;AACX;;;AE1EA,SAAS,WAAAC,iBAAe;AAGxB,eAAe,qBAAqB,SAIlB;AACd,QAAM,UAAU,IAAI,aAAa;AAEjC,MAAI;AACA,UAAM,QAAkB,CAAC;AAEzB,aAAS,IAAI,GAAG,IAAI,QAAQ,OAAO,KAAK;AACpC,YAAM,OAAO,QAAQ,aAAa;AAAA,QAC9B,WAAW,QAAQ;AAAA,QACnB,WAAW,QAAQ;AAAA,MACvB,CAAC;AACD,YAAM,KAAK,IAAI;AAAA,IACnB;AAEA,YAAQ,IAAI,8BAAuB;AACnC,YAAQ,IAAI,oPAA4C;AAExD,UAAM,QAAQ,CAAC,MAAM,UAAU;AAC3B,UAAI,QAAQ,QAAQ,GAAG;AACnB,gBAAQ,IAAI,MAAM,QAAQ,CAAC,KAAK,IAAI,EAAE;AAAA,MAC1C,OAAO;AACH,gBAAQ,IAAI,MAAM,IAAI,EAAE;AAAA,MAC5B;AAAA,IACJ,CAAC;AAED,YAAQ,IAAI;AAAA,EAChB,SAAS,OAAO;AACZ,YAAQ,MAAM,iBAAY,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAChF,YAAQ,KAAK,CAAC;AAAA,EAClB;AACJ;AAEO,SAAS,oBAA6B;AACzC,QAAM,MAAM,IAAIC,UAAQ,MAAM,EACzB,YAAY,6BAA6B,EACzC,OAAO,wBAAwB,+BAA+B,GAAG,EACjE,OAAO,eAAe,qBAAqB,EAC3C,OAAO,gBAAgB,4BAA4B,EACnD,YAAY,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAO7B,EACQ,OAAO,OAAO,YAAY;AACvB,UAAM,qBAAqB;AAAA,MACvB,GAAG;AAAA,MACH,OAAO,SAAS,QAAQ,OAAO,EAAE;AAAA,IACrC,CAAC;AAAA,EACL,CAAC;AAEL,SAAO;AACX;;;AC7DA,SAAS,WAAAC,iBAAe;AAGxB,eAAe,qBACXC,QACA,SAKa;AACb,QAAM,UAAU,IAAI,aAAa;AAEjC,MAAI;AACA,QAAI;AAEJ,QAAI,QAAQ,MAAM;AAEd,UAAI,QAAQ,cAAc,UAAU;AAChC,gBAAQ,MAAM,oEAA+D;AAC7E,gBAAQ,KAAK,CAAC;AAAA,MAClB;AACA,aAAO,MAAM,QAAQ,SAAS,QAAQ,MAAM,QAAQ,SAAS;AAAA,IACjE,OAAO;AAEH,UAAI,CAACA,QAAO;AACR,gBAAQ,MAAM,uDAAkD;AAChE,gBAAQ,KAAK,CAAC;AAAA,MAClB;AAEA,UAAI,QAAQ,cAAc,UAAU;AAChC,eAAO,MAAM,QAAQ,WAAWA,QAAO,QAAQ,MAAM;AAAA,MACzD,OAAO;AACH,eAAO,MAAM,QAAQ,KAAKA,QAAO,QAAQ,SAAS;AAAA,MACtD;AAAA,IACJ;AAEA,YAAQ,IAAI,wBAAiB;AAC7B,YAAQ,IAAI,kPAA0C;AACtD,YAAQ,IAAI,iBAAiB,QAAQ,UAAU,YAAY,CAAC,EAAE;AAC9D,QAAI,QAAQ,MAAM;AACd,cAAQ,IAAI,YAAY,QAAQ,IAAI,EAAE;AAAA,IAC1C;AACA,QAAI,QAAQ,cAAc,UAAU;AAChC,cAAQ,IAAI,cAAc,QAAQ,MAAM,EAAE;AAAA,IAC9C;AACA,YAAQ,IAAI;AACZ,YAAQ,IAAI,MAAM,IAAI,EAAE;AACxB,YAAQ,IAAI;AAAA,EAChB,SAAS,OAAO;AACZ,YAAQ,MAAM,iBAAY,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAChF,YAAQ,KAAK,CAAC;AAAA,EAClB;AACJ;AAEO,SAAS,oBAA6B;AACzC,QAAM,MAAM,IAAIC,UAAQ,MAAM,EACzB,YAAY,kCAAkC,EAC9C,SAAS,WAAW,cAAc,EAClC;AAAA,IACG;AAAA,IACA;AAAA,IACA;AAAA,EACJ,EACC,OAAO,qBAAqB,oCAAoC,EAChE,OAAO,yBAAyB,mCAAmC,IAAI,EACvE,YAAY,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAQ7B,EACQ,OAAO,OAAOD,QAAO,YAAY;AAC9B,UAAM,qBAAqBA,QAAO;AAAA,MAC9B,GAAG;AAAA,MACH,QAAQ,SAAS,QAAQ,QAAQ,EAAE;AAAA,IACvC,CAAC;AAAA,EACL,CAAC;AAEL,SAAO;AACX;;;ACnFA,SAAS,WAAAE,iBAAe;AACxB,SAAS,YAAAC,iBAAgB;AAGzB,eAAe,mBACXC,QACA,SAIa;AACb,QAAM,UAAU,IAAI,aAAa;AAEjC,MAAI;AACA,QAAI;AAEJ,QAAI,QAAQ,MAAM;AACd,YAAM,UAAU,MAAMC,UAAS,QAAQ,IAAI;AAC3C,gBAAU,QAAQ,aAAa,SAAS,QAAQ,OAAO;AAAA,IAC3D,OAAO;AACH,UAAI,CAACD,QAAO;AACR,gBAAQ,MAAM,uDAAkD;AAChE,gBAAQ,KAAK,CAAC;AAAA,MAClB;AACA,gBAAU,QAAQ,aAAaA,QAAO,QAAQ,OAAO;AAAA,IACzD;AAEA,YAAQ,IAAI,2BAAoB;AAChC,YAAQ,IAAI,kPAA0C;AACtD,QAAI,QAAQ,MAAM;AACd,cAAQ,IAAI,YAAY,QAAQ,IAAI,EAAE;AAAA,IAC1C;AACA,QAAI,QAAQ,SAAS;AACjB,cAAQ,IAAI,qBAAqB;AAAA,IACrC;AACA,YAAQ,IAAI;AACZ,YAAQ,IAAI,MAAM,OAAO,EAAE;AAC3B,YAAQ,IAAI;AAAA,EAChB,SAAS,OAAO;AACZ,YAAQ,MAAM,iBAAY,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAChF,YAAQ,KAAK,CAAC;AAAA,EAClB;AACJ;AAEO,SAAS,4BAAqC;AACjD,QAAM,MAAM,IAAIE,UAAQ,eAAe,EAClC,YAAY,+BAA+B,EAC3C,SAAS,WAAW,gBAAgB,EACpC,OAAO,qBAAqB,sBAAsB,EAClD,OAAO,cAAc,8BAA8B,EACnD,YAAY,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAM7B,EACQ,OAAO,OAAOF,QAAO,YAAY;AAC9B,UAAM,mBAAmBA,QAAO,OAAO;AAAA,EAC3C,CAAC;AAEL,SAAO;AACX;;;AC9DA,SAAS,WAAAG,iBAAe;AACxB,SAAS,YAAAC,WAAU,iBAAiB;AAGpC,eAAe,mBACXC,QACA,SAIa;AACb,QAAM,UAAU,IAAI,aAAa;AAEjC,MAAI;AACA,QAAI;AAEJ,QAAI,QAAQ,MAAM;AACd,qBAAe,MAAMC,UAAS,QAAQ,MAAM,OAAO;AAAA,IACvD,OAAO;AACH,UAAI,CAACD,QAAO;AACR,gBAAQ,MAAM,yDAAoD;AAClE,gBAAQ,KAAK,CAAC;AAAA,MAClB;AACA,qBAAeA;AAAA,IACnB;AAEA,UAAM,UAAU,QAAQ,aAAa,aAAa,KAAK,CAAC;AAExD,QAAI,QAAQ,QAAQ;AAChB,YAAM,UAAU,QAAQ,QAAQ,OAAO;AACvC,cAAQ,IAAI,gCAA2B,QAAQ,MAAM;AAAA,IACzD,OAAO;AACH,cAAQ,IAAI,2BAAoB;AAChC,cAAQ,IAAI,kPAA0C;AACtD,cAAQ,IAAI;AACZ,cAAQ,IAAI,MAAM,QAAQ,SAAS,OAAO,CAAC,EAAE;AAC7C,cAAQ,IAAI;AAAA,IAChB;AAAA,EACJ,SAAS,OAAO;AACZ,YAAQ,MAAM,iBAAY,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAChF,YAAQ,KAAK,CAAC;AAAA,EAClB;AACJ;AAEO,SAAS,4BAAqC;AACjD,QAAM,MAAM,IAAIE,UAAQ,eAAe,EAClC,YAAY,sBAAsB,EAClC,SAAS,WAAW,yBAAyB,EAC7C,OAAO,qBAAqB,kBAAkB,EAC9C,OAAO,uBAAuB,8BAA8B,EAC5D,YAAY,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAM7B,EACQ,OAAO,OAAOF,QAAO,YAAY;AAC9B,UAAM,mBAAmBA,QAAO,OAAO;AAAA,EAC3C,CAAC;AAEL,SAAO;AACX;;;AC9DA,SAAS,WAAAG,iBAAe;AACxB,SAAS,YAAAC,iBAAgB;AAGzB,eAAe,kBACX,KACA,SAUa;AACb,QAAM,UAAU,IAAI,aAAa;AAEjC,MAAI;AAEA,UAAM,UAAkC,CAAC;AACzC,QAAI,QAAQ,QAAQ;AAChB,cAAQ,OAAO,QAAQ,CAAC,WAAW;AAC/B,cAAM,CAAC,KAAK,GAAG,UAAU,IAAI,OAAO,MAAM,GAAG;AAC7C,YAAI,OAAO,WAAW,SAAS,GAAG;AAC9B,kBAAQ,IAAI,KAAK,CAAC,IAAI,WAAW,KAAK,GAAG,EAAE,KAAK;AAAA,QACpD;AAAA,MACJ,CAAC;AAAA,IACL;AAGA,QAAI;AACJ,QAAI,QAAQ,MAAM;AACd,aAAO,MAAMC,UAAS,QAAQ,MAAM,OAAO;AAAA,IAC/C,WAAW,QAAQ,MAAM;AACrB,aAAO,QAAQ;AAAA,IACnB;AAGA,UAAM,WAAW,MAAM,QAAQ,YAAY,KAAK;AAAA,MAC5C,QAAQ,QAAQ,OAAO,YAAY;AAAA,MACnC;AAAA,MACA;AAAA,MACA,SAAS,QAAQ;AAAA,MACjB,iBAAiB,CAAC,QAAQ;AAAA,IAC9B,CAAC;AAGD,QAAI,CAAC,QAAQ,UAAU;AACnB,cAAQ,IAAI,QAAQ,SAAS,UAAU,OAAO,SAAS,SAAS,MAAM,QAAQ,KAAK,IAAI,SAAS,MAAM,IAAI,SAAS,UAAU,EAAE;AAC/H,cAAQ,IAAI,oQAA6C;AACzD,cAAQ,IAAI,qBAAc,SAAS,MAAM,IAAI,SAAS,UAAU,EAAE;AAClE,cAAQ,IAAI,uBAAa,SAAS,MAAM,IAAI;AAC5C,cAAQ,IAAI,mBAAY,QAAQ,YAAY,SAAS,IAAI,CAAC,EAAE;AAC5D,cAAQ,IAAI;AAAA,IAChB;AAEA,QAAI,CAAC,QAAQ,YAAY,CAAC,QAAQ,aAAa;AAC3C,cAAQ,IAAI,oBAAa;AACzB,aAAO,QAAQ,SAAS,OAAO,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AACvD,gBAAQ,IAAI,MAAM,GAAG,KAAK,KAAK,EAAE;AAAA,MACrC,CAAC;AACD,cAAQ,IAAI;AAAA,IAChB;AAEA,QAAI,QAAQ,aAAa;AACrB,aAAO,QAAQ,SAAS,OAAO,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AACvD,gBAAQ,IAAI,GAAG,GAAG,KAAK,KAAK,EAAE;AAAA,MAClC,CAAC;AACD;AAAA,IACJ;AAEA,QAAI,CAAC,QAAQ,aAAa;AACtB,UAAI,CAAC,QAAQ,UAAU;AACnB,gBAAQ,IAAI,iBAAU;AAAA,MAC1B;AAGA,UAAI;AACA,cAAM,OAAO,KAAK,MAAM,SAAS,IAAI;AACrC,gBAAQ,IAAI,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA,MAC7C,QAAQ;AACJ,gBAAQ,IAAI,SAAS,IAAI;AAAA,MAC7B;AACA,cAAQ,IAAI;AAAA,IAChB;AAAA,EACJ,SAAS,OAAO;AACZ,YAAQ,MAAM,iBAAY,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAChF,YAAQ,KAAK,CAAC;AAAA,EAClB;AACJ;AAEO,SAAS,oBAA6B;AACzC,QAAM,MAAM,IAAIC,UAAQ,MAAM,EACzB,YAAY,yCAAyC,EACrD,SAAS,SAAS,YAAY,EAC9B,OAAO,yBAAyB,eAAe,KAAK,EACpD,OAAO,4BAA4B,8BAA8B,EACjE,OAAO,qBAAqB,4BAA4B,EACxD,OAAO,iBAAiB,qBAAqB,EAC7C,OAAO,kBAAkB,mCAAmC,OAAO,EACnE,OAAO,eAAe,yBAAyB,EAC/C,OAAO,kBAAkB,4BAA4B,EACrD,OAAO,eAAe,yBAAyB,EAC/C,YAAY,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAQ7B,EACQ,mBAAmB,sCAAsC,EACzD,OAAO,OAAO,KAAK,YAAY;AAC5B,UAAM,kBAAkB,KAAK;AAAA,MACzB,GAAG;AAAA,MACH,SAAS,SAAS,QAAQ,SAAS,EAAE;AAAA,IACzC,CAAC;AAAA,EACL,CAAC;AAEL,SAAO;AACX;;;AC3HA,SAAS,WAAAC,iBAAe;AAGxB,eAAe,gBAAgB,OAA8B;AACzD,QAAM,UAAU,IAAI,aAAa;AAEjC,MAAI;AACA,UAAM,EAAE,QAAQ,SAAS,UAAU,IAAI,QAAQ,UAAU,KAAK;AAE9D,YAAQ,IAAI,wBAAiB;AAC7B,YAAQ,IAAI,oPAA4C;AAExD,YAAQ,IAAI,mBAAY;AACxB,YAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC3C,YAAQ,IAAI;AAEZ,YAAQ,IAAI,oBAAa;AACzB,YAAQ,IAAI,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAC5C,YAAQ,IAAI;AAEZ,YAAQ,IAAI,sBAAe;AAC3B,YAAQ,IAAI,MAAM,SAAS,EAAE;AAC7B,YAAQ,IAAI;AAEZ,YAAQ,IAAI,qDAA2C;AACvD,YAAQ,IAAI;AAAA,EAChB,SAAS,OAAO;AACZ,YAAQ,MAAM,iBAAY,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAChF,YAAQ,KAAK,CAAC;AAAA,EAClB;AACJ;AAEA,eAAe,gBAAgB,SAIb;AACd,QAAM,UAAU,IAAI,aAAa;AAEjC,MAAI;AACA,UAAM,UAAU,KAAK,MAAM,QAAQ,OAAO;AAC1C,UAAM,SAAS,QAAQ,SAAS,KAAK,MAAM,QAAQ,MAAM,IAAI;AAE7D,UAAM,QAAQ,QAAQ,UAAU,SAAS,QAAQ,QAAQ,MAAM;AAE/D,YAAQ,IAAI,wBAAiB;AAC7B,YAAQ,IAAI,oPAA4C;AACxD,YAAQ,IAAI,MAAM,KAAK,EAAE;AACzB,YAAQ,IAAI;AAAA,EAChB,SAAS,OAAO;AACZ,YAAQ,MAAM,iBAAY,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAChF,YAAQ,KAAK,CAAC;AAAA,EAClB;AACJ;AAEO,SAAS,mBAA4B;AACxC,QAAM,aAAa,IAAIC,UAAQ,KAAK,EAC/B,YAAY,8BAA8B;AAG/C,aACK,QAAQ,QAAQ,EAChB,YAAY,kBAAkB,EAC9B,SAAS,WAAW,qBAAqB,EACzC,YAAY,SAAS;AAAA;AAAA;AAAA;AAAA,CAI7B,EACQ,OAAO,OAAO,UAAU;AACrB,UAAM,gBAAgB,KAAK;AAAA,EAC/B,CAAC;AAGL,QAAM,gBAAgB,WACjB,QAAQ,QAAQ,EAChB,YAAY,0BAA0B,EACtC,eAAe,wBAAwB,wBAAwB,EAC/D,eAAe,yBAAyB,wBAAwB,EAChE,OAAO,uBAAuB,8BAA8B,EAC5D,YAAY,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,CAK7B,EACQ,OAAO,OAAO,YAAY;AACvB,UAAM,gBAAgB,OAAO;AAAA,EACjC,CAAC;AAGL,gBAAc,mBAAmB,sCAAsC;AAEvE,SAAO;AACX;;;AC9FA,SAAS,WAAAC,iBAAe;AAGxB,eAAe,eACXC,QACA,SAIa;AACb,QAAM,UAAU,IAAI,aAAa;AAEjC,MAAI;AACA,QAAI,CAACA,QAAO;AAER,YAAM,MAAM,oBAAI,KAAK;AACrB,YAAM,YAAY,QAAQ,WAAW,KAAK,QAAQ,EAAE;AAEpD,cAAQ,IAAI,mCAA4B;AACxC,cAAQ,IAAI,kPAA0C;AACtD,cAAQ,IAAI,MAAM,SAAS,GAAG,QAAQ,KAAK,oBAAoB,EAAE,EAAE;AACnE,cAAQ,IAAI;AACZ,cAAQ,IAAI,WAAW,IAAI,YAAY,CAAC,EAAE;AAC1C,cAAQ,IAAI,aAAa,IAAI,eAAe,CAAC,EAAE;AAC/C,cAAQ,IAAI;AAAA,IAChB,WAAW,QAAQ,KAAKA,MAAK,GAAG;AAE5B,YAAM,YAAY,SAASA,QAAO,EAAE;AACpC,YAAM,OAAO,QAAQ,WAAW,WAAW,QAAQ,EAAE;AAErD,cAAQ,IAAI,mCAA4B;AACxC,cAAQ,IAAI,kPAA0C;AACtD,cAAQ,IAAI,aAAa,SAAS,GAAG,QAAQ,KAAK,UAAU,EAAE,EAAE;AAChE,cAAQ,IAAI;AAEZ,UAAI,QAAQ,WAAW,SAAS,QAAQ,WAAW,OAAO;AACtD,gBAAQ,IAAI,MAAM,KAAK,YAAY,CAAC,EAAE;AAAA,MAC1C,OAAO;AACH,gBAAQ,IAAI,MAAM,KAAK,eAAe,CAAC,EAAE;AAAA,MAC7C;AACA,cAAQ,IAAI;AAAA,IAChB,OAAO;AAEH,YAAM,OAAO,IAAI,KAAKA,MAAK;AAE3B,UAAI,MAAM,KAAK,QAAQ,CAAC,GAAG;AACvB,gBAAQ,MAAM,4BAAuB;AACrC,gBAAQ,KAAK,CAAC;AAAA,MAClB;AAEA,YAAM,YAAY,QAAQ,WAAW,MAAM,QAAQ,EAAE;AAErD,cAAQ,IAAI,mCAA4B;AACxC,cAAQ,IAAI,kPAA0C;AACtD,cAAQ,IAAI,aAAaA,MAAK,EAAE;AAChC,cAAQ,IAAI,cAAc,KAAK,YAAY,CAAC,EAAE;AAC9C,cAAQ,IAAI;AACZ,cAAQ,IAAI,MAAM,SAAS,GAAG,QAAQ,KAAK,UAAU,EAAE,EAAE;AACzD,cAAQ,IAAI;AAAA,IAChB;AAAA,EACJ,SAAS,OAAO;AACZ,YAAQ,MAAM,iBAAY,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAChF,YAAQ,KAAK,CAAC;AAAA,EAClB;AACJ;AAEO,SAAS,wBAAiC;AAC7C,QAAM,MAAM,IAAIC,UAAQ,WAAW,EAC9B,YAAY,uCAAuC,EACnD,SAAS,WAAW,+BAA+B,EACnD,OAAO,yBAAyB,mCAAmC,KAAK,EACxE,OAAO,QAAQ,qCAAqC,EACpD,YAAY,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAQ7B,EACQ,OAAO,OAAOD,QAAO,YAAY;AAC9B,UAAM,eAAeA,QAAO,OAAO;AAAA,EACvC,CAAC;AAEL,SAAO;AACX;;;ACtFA,SAAS,WAAAE,iBAAe;AAGxB,eAAe,yBACX,MACA,SAKa;AACb,QAAM,UAAU,IAAI,aAAa;AAEjC,MAAI;AACA,QAAI,QAAQ,MAAM;AACd,cAAQ,IAAI,gCAAyB;AACrC,cAAQ,IAAI,oPAA4C;AAExD,YAAM,YAAY,QAAQ,aAAa;AACvC,gBAAU,QAAQ,CAAC,OAAO;AACtB,gBAAQ,IAAI,MAAM,EAAE,EAAE;AAAA,MAC1B,CAAC;AACD,cAAQ,IAAI;AACZ;AAAA,IACJ;AAEA,QAAI,CAAC,MAAM;AACP,cAAQ,MAAM,gFAA2E;AACzF,cAAQ,KAAK,CAAC;AAAA,IAClB;AAEA,QAAI,CAAC,QAAQ,QAAQ,CAAC,QAAQ,IAAI;AAC9B,cAAQ,MAAM,sDAAiD;AAC/D,cAAQ,KAAK,CAAC;AAAA,IAClB;AAEA,UAAM,SAAS,QAAQ,gBAAgB,MAAM,QAAQ,MAAM,QAAQ,EAAE;AAErE,YAAQ,IAAI,gCAAyB;AACrC,YAAQ,IAAI,kPAA0C;AACtD,YAAQ,IAAI,YAAY,QAAQ,IAAI,EAAE;AACtC,YAAQ,IAAI,UAAU,QAAQ,EAAE,EAAE;AAClC,YAAQ,IAAI;AACZ,YAAQ,IAAI,MAAM,OAAO,IAAI,EAAE;AAC/B,YAAQ,IAAI,WAAW,OAAO,GAAG,EAAE;AACnC,YAAQ,IAAI;AAAA,EAChB,SAAS,OAAO;AACZ,YAAQ,MAAM,iBAAY,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAChF,YAAQ,KAAK,CAAC;AAAA,EAClB;AACJ;AAEO,SAAS,wBAAiC;AAC7C,QAAM,MAAM,IAAIC,UAAQ,UAAU,EAC7B,YAAY,gCAAgC,EAC5C,SAAS,UAAU,4CAA4C,EAC/D,OAAO,qBAAqB,iBAAiB,EAC7C,OAAO,mBAAmB,iBAAiB,EAC3C,OAAO,UAAU,0BAA0B,EAC3C,YAAY,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAM7B,EACQ,OAAO,OAAO,MAAM,YAAY;AAC7B,UAAM,yBAAyB,MAAM,OAAO;AAAA,EAChD,CAAC;AAEL,SAAO;AACX;;;ACvEA,SAAS,WAAAC,iBAAe;AAGxB,eAAe,gBACXC,QACA,SAGa;AACb,QAAM,UAAU,IAAI,aAAa;AAEjC,MAAI;AACA,UAAM,UAAU,QAAQ,UAAUA,QAAO,QAAQ,IAAI;AAErD,YAAQ,IAAI,wBAAiB;AAC7B,YAAQ,IAAI,kPAA0C;AACtD,QAAI,QAAQ,MAAM;AACd,cAAQ,IAAI,+BAA+B;AAAA,IAC/C,OAAO;AACH,cAAQ,IAAI,yCAAyC;AAAA,IACzD;AACA,YAAQ,IAAI;AACZ,YAAQ,IAAI,MAAM,OAAO,EAAE;AAC3B,YAAQ,IAAI;AAAA,EAChB,SAAS,OAAO;AACZ,YAAQ,MAAM,iBAAY,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAChF,YAAQ,KAAK,CAAC;AAAA,EAClB;AACJ;AAEO,SAAS,yBAAkC;AAC9C,QAAM,MAAM,IAAIC,UAAQ,YAAY,EAC/B,YAAY,kCAAkC,EAC9C,SAAS,WAAW,gBAAgB,EACpC,OAAO,UAAU,+DAA+D,EAChF,YAAY,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAM7B,EACQ,mBAAmB,sCAAsC,EACzD,OAAO,OAAOD,QAAO,YAAY;AAC9B,UAAM,gBAAgBA,QAAO,OAAO;AAAA,EACxC,CAAC;AAEL,SAAO;AACX;;;AChDA,SAAS,WAAAE,iBAAe;AAGxB,eAAe,gBACXC,QACA,SAGa;AACb,QAAM,UAAU,IAAI,aAAa;AAEjC,MAAI;AACA,UAAM,UAAU,QAAQ,UAAUA,QAAO,QAAQ,IAAI;AAErD,YAAQ,IAAI,wBAAiB;AAC7B,YAAQ,IAAI,kPAA0C;AACtD,QAAI,QAAQ,MAAM;AACd,cAAQ,IAAI,+BAA+B;AAAA,IAC/C,OAAO;AACH,cAAQ,IAAI,yCAAyC;AAAA,IACzD;AACA,YAAQ,IAAI;AACZ,YAAQ,IAAI,MAAM,OAAO,EAAE;AAC3B,YAAQ,IAAI;AAAA,EAChB,SAAS,OAAO;AACZ,YAAQ,MAAM,iBAAY,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAChF,YAAQ,KAAK,CAAC;AAAA,EAClB;AACJ;AAEO,SAAS,yBAAkC;AAC9C,QAAM,MAAM,IAAIC,UAAQ,YAAY,EAC/B,YAAY,2BAA2B,EACvC,SAAS,WAAW,gBAAgB,EACpC,OAAO,UAAU,+DAA+D,EAChF,YAAY,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAM7B,EACQ,mBAAmB,sCAAsC,EACzD,OAAO,OAAOD,QAAO,YAAY;AAC9B,UAAM,gBAAgBA,QAAO,OAAO;AAAA,EACxC,CAAC;AAEL,SAAO;AACX;;;AChDA,SAAS,WAAAE,iBAAe;AACxB,OAAO,eAAe;AAEtB,eAAe,gBAAgB,YAAmC;AAC9D,MAAI;AAEA,UAAM,cAAc,UAAU,SAAS,UAAU;AAEjD,YAAQ,IAAI,gCAA2B;AACvC,YAAQ,IAAI,kPAA0C;AACtD,YAAQ,IAAI,kBAAkB,UAAU,EAAE;AAC1C,YAAQ,IAAI,eAAe,WAAW,EAAE;AACxC,YAAQ,IAAI;AAGZ,YAAQ,IAAI,8BAAuB;AAEnC,UAAM,QAAQ,WAAW,KAAK,EAAE,MAAM,KAAK;AAC3C,QAAI,MAAM,SAAS,KAAK,MAAM,SAAS,GAAG;AACtC,cAAQ,IAAI,iDAAuC;AACnD;AAAA,IACJ;AAGA,UAAM,MAAM,oBAAI,KAAK;AACrB,UAAM,aAAuB,CAAC;AAE9B,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AACxB,YAAM,WAAW,IAAI,KAAK,GAAG;AAC7B,eAAS,QAAQ,SAAS,QAAQ,IAAI,CAAC;AAGvC,YAAM,CAAC,QAAQ,IAAI,IAAI,MAAM,MAAM,MAAM,WAAW,IAAI,IAAI,GAAG,MAAM,WAAW,IAAI,IAAI,CAAC;AAEzF,UAAI,WAAW,OAAO,CAAC,OAAO,SAAS,GAAG,KAAK,CAAC,OAAO,SAAS,GAAG,GAAG;AAClE,iBAAS,WAAW,SAAS,QAAQ,EAAE,CAAC;AAAA,MAC5C;AAEA,UAAI,SAAS,OAAO,CAAC,KAAK,SAAS,GAAG,KAAK,CAAC,KAAK,SAAS,GAAG,GAAG;AAC5D,iBAAS,SAAS,SAAS,MAAM,EAAE,CAAC;AAAA,MACxC;AAEA,iBAAW;AAAA,QACP,MAAM,IAAI,CAAC,KAAK,SAAS,YAAY,EAAE,QAAQ,KAAK,GAAG,EAAE,UAAU,GAAG,EAAE,CAAC;AAAA,MAC7E;AAAA,IACJ;AAEA,eAAW,QAAQ,CAAC,SAAS,QAAQ,IAAI,IAAI,CAAC;AAC9C,YAAQ,IAAI;AAEZ,YAAQ,IAAI,oDAA6C;AACzD,YAAQ,IAAI,oDAAoD;AAChE,YAAQ,IAAI;AAAA,EAChB,SAAS,OAAO;AACZ,YAAQ,MAAM,iBAAY,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAChF,YAAQ,KAAK,CAAC;AAAA,EAClB;AACJ;AAEO,SAAS,oBAA6B;AACzC,QAAM,MAAM,IAAIA,UAAQ,MAAM,EACzB,YAAY,mCAAmC,EAC/C,SAAS,gBAAgB,qCAAqC,EAC9D,YAAY,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAO7B,EACQ,mBAAmB,sCAAsC,EACzD,OAAO,OAAO,eAAe;AAC1B,UAAM,gBAAgB,UAAU;AAAA,EACpC,CAAC;AAEL,SAAO;AACX;;;AC7EA,SAAS,WAAAC,iBAAe;AACxB,SAAS,YAAAC,iBAAgB;AACzB,SAAS,UAAAC,eAAc;AACvB,OAAOC,uBAAsB;AAE7B,eAAe,sBACX,MACA,SAGa;AACb,MAAI;AACA,QAAI,UAAU,MAAMF,UAAS,MAAM,OAAO;AAE1C,QAAI,QAAQ,KAAK;AAEb,cAAQ,IAAI,gCAAyB;AACrC,cAAQ,IAAI,oPAA4C;AACxD,cAAQ,IAAI,OAAO;AACnB,cAAQ,IAAI;AAAA,IAChB,OAAO;AAEH,gBAAU,QAAQ,QAAQ,8BAA8B,CAAC,OAAO,SAAS;AACrE,eAAO;AAAA;AAAA;AAAA;AAAA,EAAuC,KAAK,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,MAC7D,CAAC;AAGD,MAAAC,QAAO,WAAW;AAAA;AAAA,QAEd,UAAU,IAAIC,kBAAiB;AAAA,MACnC,CAAC;AAED,YAAM,WAAWD,QAAO,OAAO;AAE/B,cAAQ,IAAI,6BAAsB;AAClC,cAAQ,IAAI,oPAA4C;AACxD,cAAQ,IAAI,QAAQ;AAAA,IACxB;AAAA,EACJ,SAAS,OAAO;AACZ,YAAQ,MAAM,iBAAY,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAChF,YAAQ,KAAK,CAAC;AAAA,EAClB;AACJ;AAEO,SAAS,+BAAwC;AACpD,QAAM,MAAM,IAAIF,UAAQ,kBAAkB,EACrC,YAAY,mCAAmC,EAC/C,SAAS,UAAU,oBAAoB,EACvC,OAAO,SAAS,uCAAuC,EACvD,YAAY,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAM7B,EACQ,mBAAmB,sCAAsC,EACzD,OAAO,OAAO,MAAM,YAAY;AAC7B,UAAM,sBAAsB,MAAM,OAAO;AAAA,EAC7C,CAAC;AAEL,SAAO;AACX;;;AC9DA,OAAOI,aAAW;AAClB,SAAS,UAAAC,eAAc;;;ACDvB,OAAOC,WAAS,YAAAC,kBAAgB;AAChC,SAAS,OAAAC,OAAK,QAAAC,QAAM,YAAAC,YAAU,UAAAC,eAAc;;;ACD5C,OAAOC,WAAS,YAAAC,kBAAgB;AAChC,SAAS,OAAAC,OAAK,QAAAC,QAAM,YAAAC,kBAAgB;AACpC,OAAOC,gBAAe;AAGf,IAAM,eAAyB,MAAM;AACxC,QAAM,CAAC,QAAQ,SAAS,IAAIC,WAAS,IAAI;AACzC,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAS,GAAG;AACtC,QAAM,CAAC,WAAW,YAAY,IAAIA,WAAmB,CAAC,CAAC;AACvD,QAAM,CAAC,cAAc,eAAe,IAAIA,WAA0C,QAAQ;AAC1F,QAAM,CAAC,aAAa,cAAc,IAAIA,WAAwB,IAAI;AAElE,QAAM,UAAU,IAAI,aAAa;AAGjC,EAAAC,QAAM,UAAU,MAAM;AAClB,mBAAe;AAAA,EACnB,GAAG,CAAC,CAAC;AAEL,EAAAC,WAAS,CAACC,QAAO,QAAQ;AACrB,QAAI,IAAI,KAAK;AAET,UAAI,iBAAiB,SAAU,iBAAgB,OAAO;AAAA,eAC7C,iBAAiB,QAAS,iBAAgB,UAAU;AAAA,UACxD,iBAAgB,QAAQ;AAAA,IACjC,WAAW,IAAI,QAAQ;AAEnB,qBAAe;AAAA,IACnB,WAAWA,WAAU,OAAO,UAAU,SAAS,GAAG;AAE9C,iBAAW,CAAC;AAAA,IAChB;AAAA,EACJ,CAAC;AAED,QAAM,iBAAiB,MAAM;AACzB,UAAM,eAAyB,CAAC;AAChC,UAAM,YAAY,SAAS,QAAQ,EAAE,KAAK;AAC1C,UAAM,WAAW,SAAS,OAAO,EAAE,KAAK;AAExC,aAAS,IAAI,GAAG,IAAI,UAAU,KAAK;AAC/B,mBAAa;AAAA,QACT,QAAQ,iBAAiB;AAAA,UACrB,QAAQ;AAAA,UACR,WAAW;AAAA,UACX,WAAW;AAAA,UACX,QAAQ;AAAA,UACR,SAAS;AAAA,QACb,CAAC;AAAA,MACL;AAAA,IACJ;AACA,iBAAa,YAAY;AACzB,mBAAe,IAAI;AAAA,EACvB;AAEA,QAAM,aAAa,OAAO,UAAkB;AACxC,QAAI;AACA,YAAM,EAAE,SAAS,WAAW,IAAI,MAAM,OAAO,YAAY;AACzD,YAAM,WAAW,MAAM,UAAU,KAAK,CAAC;AACvC,qBAAe,KAAK;AACpB,iBAAW,MAAM,eAAe,IAAI,GAAG,GAAI;AAAA,IAC/C,SAAS,OAAO;AAAA,IAEhB;AAAA,EACJ;AAEA,SACI,gBAAAF,QAAA,cAACG,OAAA,EAAI,eAAc,YACf,gBAAAH,QAAA,cAACG,OAAA,EAAI,cAAc,KACf,gBAAAH,QAAA,cAACI,QAAA,EAAK,MAAI,MAAC,OAAM,UAAO,8BAExB,CACJ,GAGA,gBAAAJ,QAAA;AAAA,IAACG;AAAA,IAAA;AAAA,MACG,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,UAAU;AAAA,MACV,UAAU;AAAA,MACV,cAAc;AAAA;AAAA,IAEd,gBAAAH,QAAA,cAACI,QAAA,EAAK,MAAI,MAAC,OAAM,UAAS,cAAc,KAAG,UAE3C;AAAA,IAGA,gBAAAJ,QAAA,cAACG,OAAA,EAAI,cAAc,KACf,gBAAAH,QAAA,cAACG,OAAA,EAAI,OAAO,MACR,gBAAAH,QAAA,cAACI,QAAA,EAAK,OAAO,iBAAiB,WAAW,UAAU,UAC9C,iBAAiB,WAAW,YAAO,MAAK,SAC7C,CACJ,GACA,gBAAAJ,QAAA,cAACG,OAAA,EAAI,OAAO,MACP,iBAAiB,WACd,gBAAAH,QAAA,cAACK,YAAA,EAAU,OAAO,QAAQ,UAAU,WAAW,IAE/C,gBAAAL,QAAA,cAACI,QAAA,MAAM,MAAO,CAEtB,GACA,gBAAAJ,QAAA,cAACI,QAAA,EAAK,UAAQ,QAAC,cAAY,CAC/B;AAAA,IAGA,gBAAAJ,QAAA,cAACG,OAAA,EAAI,cAAc,KACf,gBAAAH,QAAA,cAACG,OAAA,EAAI,OAAO,MACR,gBAAAH,QAAA,cAACI,QAAA,EAAK,OAAO,iBAAiB,UAAU,UAAU,UAC7C,iBAAiB,UAAU,YAAO,MAAK,QAC5C,CACJ,GACA,gBAAAJ,QAAA,cAACG,OAAA,EAAI,OAAO,MACP,iBAAiB,UACd,gBAAAH,QAAA,cAACK,YAAA,EAAU,OAAO,OAAO,UAAU,UAAU,IAE7C,gBAAAL,QAAA,cAACI,QAAA,MAAM,KAAM,CAErB,GACA,gBAAAJ,QAAA,cAACI,QAAA,EAAK,UAAQ,QAAC,yBAAuB,CAC1C;AAAA,IAGA,gBAAAJ,QAAA,cAACG,OAAA,EAAI,WAAW,KACZ,gBAAAH,QAAA;AAAA,MAACI;AAAA,MAAA;AAAA,QACG,MAAI;AAAA,QACJ,iBAAiB,iBAAiB,aAAa,UAAU;AAAA,QACzD,OAAO,iBAAiB,aAAa,UAAU;AAAA;AAAA,MAE9C,iBAAiB,aAAa,YAAO;AAAA,MAAK;AAAA,IAE/C,CACJ;AAAA,EACJ,GAGC,UAAU,SAAS,KAChB,gBAAAJ,QAAA;AAAA,IAACG;AAAA,IAAA;AAAA,MACG,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,UAAU;AAAA,MACV,UAAU;AAAA;AAAA,IAEV,gBAAAH,QAAA,cAACI,QAAA,EAAK,MAAI,MAAC,OAAM,SAAQ,cAAc,KAAG,6BAE1C;AAAA,IAEC,UAAU,IAAI,CAAC,UAAU,UACtB,gBAAAJ,QAAA,cAACG,OAAA,EAAI,KAAK,OAAO,cAAc,KAC3B,gBAAAH,QAAA,cAACG,OAAA,EAAI,OAAO,KACR,gBAAAH,QAAA,cAACI,QAAA,EAAK,UAAQ,QAAE,QAAQ,GAAE,GAAC,CAC/B,GACA,gBAAAJ,QAAA,cAACG,OAAA,EAAI,UAAU,KACX,gBAAAH,QAAA,cAACI,QAAA,MAAM,QAAS,CACpB,GACC,gBAAgB,SACb,gBAAAJ,QAAA,cAACI,QAAA,EAAK,OAAM,WAAQ,iBAAU,CAEtC,CACH;AAAA,EACL,GAIJ,gBAAAJ,QAAA,cAACG,OAAA,EAAI,WAAW,GAAG,aAAY,UAAS,aAAY,QAAO,UAAU,KACjE,gBAAAH,QAAA,cAACI,QAAA,EAAK,UAAQ,QAAC,yDAEf,CACJ,CACJ;AAER;;;AC1KA,OAAOE,WAAS,YAAAC,kBAAgB;AAChC,SAAS,OAAAC,OAAK,QAAAC,QAAM,YAAAC,kBAAgB;AACpC,OAAOC,gBAAe;AAGf,IAAM,WAAqB,MAAM;AACpC,QAAM,CAAC,OAAO,QAAQ,IAAIC,WAAS,GAAG;AACtC,QAAM,CAAC,WAAW,YAAY,IAAIA,WAAS,KAAK;AAChD,QAAM,CAAC,WAAW,YAAY,IAAIA,WAAS,KAAK;AAChD,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAmB,CAAC,CAAC;AAC/C,QAAM,CAAC,cAAc,eAAe,IAAIA,WAAyD,OAAO;AACxG,QAAM,CAAC,aAAa,cAAc,IAAIA,WAAwB,IAAI;AAElE,QAAM,UAAU,IAAI,aAAa;AAGjC,EAAAC,QAAM,UAAU,MAAM;AAClB,mBAAe;AAAA,EACnB,GAAG,CAAC,CAAC;AAEL,EAAAC,WAAS,CAACC,QAAO,QAAQ;AACrB,QAAI,IAAI,KAAK;AACT,YAAM,SAAgC,CAAC,SAAS,aAAa,WAAW,UAAU;AAClF,YAAM,eAAe,OAAO,QAAQ,YAAY;AAChD,sBAAgB,QAAQ,eAAe,KAAK,OAAO,MAAM,CAAC;AAAA,IAC9D,WAAW,IAAI,QAAQ;AACnB,UAAI,iBAAiB,aAAa;AAC9B,qBAAa,CAAC,SAAS;AAAA,MAC3B,WAAW,iBAAiB,WAAW;AACnC,qBAAa,CAAC,SAAS;AAAA,MAC3B,OAAO;AAEH,uBAAe;AAAA,MACnB;AAAA,IACJ,WAAWA,WAAU,OAAO,MAAM,SAAS,GAAG;AAC1C,iBAAW,CAAC;AAAA,IAChB;AAAA,EACJ,CAAC;AAED,QAAM,iBAAiB,MAAM;AACzB,UAAM,WAAqB,CAAC;AAC5B,UAAM,WAAW,SAAS,OAAO,EAAE,KAAK;AAExC,aAAS,IAAI,GAAG,IAAI,UAAU,KAAK;AAC/B,eAAS,KAAK,QAAQ,aAAa,EAAE,WAAW,UAAU,CAAC,CAAC;AAAA,IAChE;AACA,aAAS,QAAQ;AACjB,mBAAe,IAAI;AAAA,EACvB;AAEA,QAAM,aAAa,OAAO,UAAkB;AACxC,QAAI;AACA,YAAM,EAAE,SAAS,WAAW,IAAI,MAAM,OAAO,YAAY;AACzD,YAAM,WAAW,MAAM,MAAM,KAAK,CAAC;AACnC,qBAAe,KAAK;AACpB,iBAAW,MAAM,eAAe,IAAI,GAAG,GAAI;AAAA,IAC/C,SAAS,OAAO;AAAA,IAEhB;AAAA,EACJ;AAEA,SACI,gBAAAF,QAAA,cAACG,OAAA,EAAI,eAAc,YACf,gBAAAH,QAAA,cAACG,OAAA,EAAI,cAAc,KACf,gBAAAH,QAAA,cAACI,QAAA,EAAK,MAAI,MAAC,OAAM,UAAO,0BAExB,CACJ,GAEA,gBAAAJ,QAAA;AAAA,IAACG;AAAA,IAAA;AAAA,MACG,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,UAAU;AAAA,MACV,UAAU;AAAA,MACV,cAAc;AAAA;AAAA,IAEd,gBAAAH,QAAA,cAACI,QAAA,EAAK,MAAI,MAAC,OAAM,UAAS,cAAc,KAAG,UAE3C;AAAA,IAEA,gBAAAJ,QAAA,cAACG,OAAA,EAAI,cAAc,KACf,gBAAAH,QAAA,cAACG,OAAA,EAAI,OAAO,MACR,gBAAAH,QAAA,cAACI,QAAA,EAAK,OAAO,iBAAiB,UAAU,UAAU,UAC7C,iBAAiB,UAAU,YAAO,MAAK,QAC5C,CACJ,GACA,gBAAAJ,QAAA,cAACG,OAAA,EAAI,OAAO,MACP,iBAAiB,UACd,gBAAAH,QAAA,cAACK,YAAA,EAAU,OAAO,OAAO,UAAU,UAAU,IAE7C,gBAAAL,QAAA,cAACI,QAAA,MAAM,KAAM,CAErB,CACJ;AAAA,IAEA,gBAAAJ,QAAA,cAACG,OAAA,EAAI,cAAc,KACf,gBAAAH,QAAA,cAACI,QAAA,EAAK,OAAO,iBAAiB,cAAc,UAAU,UACjD,iBAAiB,cAAc,YAAO,MAAK,KAC1C,YAAY,WAAM,KAAI,aAC5B,CACJ;AAAA,IAEA,gBAAAJ,QAAA,cAACG,OAAA,EAAI,cAAc,KACf,gBAAAH,QAAA,cAACI,QAAA,EAAK,OAAO,iBAAiB,YAAY,UAAU,UAC/C,iBAAiB,YAAY,YAAO,MAAK,KACxC,YAAY,WAAM,KAAI,cAC5B,CACJ;AAAA,IAEA,gBAAAJ,QAAA,cAACG,OAAA,EAAI,WAAW,KACZ,gBAAAH,QAAA;AAAA,MAACI;AAAA,MAAA;AAAA,QACG,MAAI;AAAA,QACJ,iBAAiB,iBAAiB,aAAa,UAAU;AAAA,QACzD,OAAO,iBAAiB,aAAa,UAAU;AAAA;AAAA,MAE9C,iBAAiB,aAAa,YAAO;AAAA,MAAK;AAAA,IAE/C,CACJ;AAAA,EACJ,GAEC,MAAM,SAAS,KACZ,gBAAAJ,QAAA;AAAA,IAACG;AAAA,IAAA;AAAA,MACG,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,UAAU;AAAA,MACV,UAAU;AAAA;AAAA,IAEV,gBAAAH,QAAA,cAACI,QAAA,EAAK,MAAI,MAAC,OAAM,SAAQ,cAAc,KAAG,yBAE1C;AAAA,IAEC,MAAM,IAAI,CAAC,MAAM,UACd,gBAAAJ,QAAA,cAACG,OAAA,EAAI,KAAK,OAAO,cAAc,KAC3B,gBAAAH,QAAA,cAACG,OAAA,EAAI,OAAO,KACR,gBAAAH,QAAA,cAACI,QAAA,EAAK,UAAQ,QAAE,QAAQ,GAAE,GAAC,CAC/B,GACA,gBAAAJ,QAAA,cAACG,OAAA,EAAI,UAAU,KACX,gBAAAH,QAAA,cAACI,QAAA,MAAM,IAAK,CAChB,GACC,gBAAgB,SACb,gBAAAJ,QAAA,cAACI,QAAA,EAAK,OAAM,WAAQ,iBAAU,CAEtC,CACH;AAAA,EACL,GAGJ,gBAAAJ,QAAA,cAACG,OAAA,EAAI,WAAW,GAAG,aAAY,UAAS,aAAY,QAAO,UAAU,KACjE,gBAAAH,QAAA,cAACI,QAAA,EAAK,UAAQ,QAAC,0DAEf,CACJ,CACJ;AAER;;;AC7JA,OAAOE,WAAS,YAAAC,kBAAgB;AAChC,SAAS,OAAAC,OAAK,QAAAC,QAAM,YAAAC,kBAAgB;AACpC,OAAOC,gBAAe;AAGtB,IAAM,aAA8B,CAAC,UAAU,UAAU,QAAQ,OAAO,QAAQ;AAEzE,IAAM,WAAqB,MAAM;AACpC,QAAM,CAAC,MAAM,OAAO,IAAIC,WAAS,aAAa;AAC9C,QAAM,CAAC,WAAW,YAAY,IAAIA,WAAwB,QAAQ;AAClE,QAAM,CAAC,MAAM,OAAO,IAAIA,WAAS,EAAE;AACnC,QAAM,CAAC,cAAc,eAAe,IAAIA,WAA4C,MAAM;AAC1F,QAAM,CAAC,QAAQ,SAAS,IAAIA,WAAS,KAAK;AAE1C,QAAM,UAAU,IAAI,aAAa;AAGjC,EAAAC,QAAM,UAAU,MAAM;AAClB,mBAAe;AAAA,EACnB,GAAG,CAAC,CAAC;AAEL,EAAAC,WAAS,CAACC,QAAO,QAAQ;AACrB,QAAI,IAAI,KAAK;AACT,YAAM,SAAgC,CAAC,QAAQ,aAAa,UAAU;AACtE,YAAM,eAAe,OAAO,QAAQ,YAAY;AAChD,sBAAgB,QAAQ,eAAe,KAAK,OAAO,MAAM,CAAC;AAAA,IAC9D,WAAW,IAAI,QAAQ;AAEnB,qBAAe;AAAA,IACnB,WAAW,IAAI,aAAa,iBAAiB,aAAa;AACtD,YAAM,eAAe,WAAW,QAAQ,SAAS;AACjD,mBAAa,WAAW,eAAe,IAAI,eAAe,IAAI,WAAW,SAAS,CAAC,CAAC;AAAA,IACxF,WAAW,IAAI,cAAc,iBAAiB,aAAa;AACvD,YAAM,eAAe,WAAW,QAAQ,SAAS;AACjD,mBAAa,YAAY,eAAe,KAAK,WAAW,MAAM,CAAC;AAAA,IACnE,WAAWA,WAAU,OAAO,MAAM;AAC9B,iBAAW;AAAA,IACf;AAAA,EACJ,CAAC;AAED,QAAM,iBAAiB,YAAY;AAC/B,QAAI,CAAC,KAAM;AAEX,QAAI;AACJ,QAAI,cAAc,UAAU;AACxB,eAAS,MAAM,QAAQ,WAAW,MAAM,EAAE;AAAA,IAC9C,OAAO;AACH,eAAS,MAAM,QAAQ,KAAK,MAAM,SAAS;AAAA,IAC/C;AACA,YAAQ,MAAM;AACd,cAAU,KAAK;AAAA,EACnB;AAEA,QAAM,aAAa,YAAY;AAC3B,QAAI;AACA,YAAM,EAAE,SAAS,WAAW,IAAI,MAAM,OAAO,YAAY;AACzD,YAAM,WAAW,MAAM,IAAI;AAC3B,gBAAU,IAAI;AACd,iBAAW,MAAM,UAAU,KAAK,GAAG,GAAI;AAAA,IAC3C,SAAS,OAAO;AAAA,IAEhB;AAAA,EACJ;AAEA,SACI,gBAAAF,QAAA,cAACG,OAAA,EAAI,eAAc,YACf,gBAAAH,QAAA,cAACG,OAAA,EAAI,cAAc,KACf,gBAAAH,QAAA,cAACI,QAAA,EAAK,MAAI,MAAC,OAAM,UAAO,0BAExB,CACJ,GAEA,gBAAAJ,QAAA;AAAA,IAACG;AAAA,IAAA;AAAA,MACG,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,UAAU;AAAA,MACV,UAAU;AAAA,MACV,cAAc;AAAA;AAAA,IAEd,gBAAAH,QAAA,cAACI,QAAA,EAAK,MAAI,MAAC,OAAM,UAAS,cAAc,KAAG,UAE3C;AAAA,IAEA,gBAAAJ,QAAA,cAACG,OAAA,EAAI,cAAc,GAAG,eAAc,YAChC,gBAAAH,QAAA,cAACG,OAAA,EAAI,cAAc,KACf,gBAAAH,QAAA,cAACI,QAAA,EAAK,OAAO,iBAAiB,SAAS,UAAU,UAC5C,iBAAiB,SAAS,YAAO,MAAK,eAC3C,CACJ,GACA,gBAAAJ,QAAA,cAACG,OAAA,EAAI,YAAY,GAAG,OAAO,MACtB,iBAAiB,SACd,gBAAAH,QAAA,cAACK,YAAA,EAAU,OAAO,MAAM,UAAU,SAAS,aAAY,iBAAgB,IAEvE,gBAAAL,QAAA,cAACI,QAAA,EAAK,UAAU,CAAC,QAAO,QAAQ,SAAU,CAElD,CACJ;AAAA,IAEA,gBAAAJ,QAAA,cAACG,OAAA,EAAI,cAAc,KACf,gBAAAH,QAAA,cAACG,OAAA,EAAI,OAAO,MACR,gBAAAH,QAAA,cAACI,QAAA,EAAK,OAAO,iBAAiB,cAAc,UAAU,UACjD,iBAAiB,cAAc,YAAO,MAAK,YAChD,CACJ,GACA,gBAAAJ,QAAA,cAACI,QAAA,EAAK,MAAI,MAAC,OAAO,iBAAiB,cAAc,WAAW,UACvD,UAAU,YAAY,CAC3B,GACC,iBAAiB,eACd,gBAAAJ,QAAA,cAACI,QAAA,EAAK,UAAQ,QAAC,4BAAgB,CAEvC;AAAA,IAEA,gBAAAJ,QAAA,cAACG,OAAA,EAAI,WAAW,KACZ,gBAAAH,QAAA;AAAA,MAACI;AAAA,MAAA;AAAA,QACG,MAAI;AAAA,QACJ,iBAAiB,iBAAiB,aAAa,UAAU;AAAA,QACzD,OAAO,iBAAiB,aAAa,UAAU;AAAA;AAAA,MAE9C,iBAAiB,aAAa,YAAO;AAAA,MAAK;AAAA,IAE/C,CACJ;AAAA,EACJ,GAEC,QACG,gBAAAJ,QAAA;AAAA,IAACG;AAAA,IAAA;AAAA,MACG,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,UAAU;AAAA,MACV,UAAU;AAAA;AAAA,IAEV,gBAAAH,QAAA,cAACG,OAAA,EAAI,cAAc,KACf,gBAAAH,QAAA,cAACI,QAAA,EAAK,MAAI,MAAC,OAAM,WAAQ,qBAEzB,GACC,UACG,gBAAAJ,QAAA,cAACG,OAAA,EAAI,YAAY,KACb,gBAAAH,QAAA,cAACI,QAAA,EAAK,OAAM,WAAQ,6BAAsB,CAC9C,CAER;AAAA,IAEA,gBAAAJ,QAAA,cAACG,OAAA,EAAI,eAAc,YACf,gBAAAH,QAAA,cAACI,QAAA,EAAK,UAAQ,QAAC,eAAY,UAAU,YAAY,CAAE,GACnD,gBAAAJ,QAAA,cAACG,OAAA,EAAI,WAAW,KACZ,gBAAAH,QAAA,cAACI,QAAA,EAAK,MAAK,UAAQ,IAAK,CAC5B,CACJ;AAAA,EACJ,GAGJ,gBAAAJ,QAAA,cAACG,OAAA,EAAI,WAAW,GAAG,aAAY,UAAS,aAAY,QAAO,UAAU,KACjE,gBAAAH,QAAA,cAACI,QAAA,EAAK,UAAQ,QAAC,qFAEf,CACJ,CACJ;AAER;;;AChKA,OAAOE,WAAS,YAAAC,kBAAgB;AAChC,SAAS,OAAAC,OAAK,QAAAC,QAAM,YAAAC,kBAAgB;AACpC,OAAOC,gBAAe;AAKf,IAAM,aAAuB,MAAM;AACtC,QAAM,CAACC,QAAO,QAAQ,IAAIC,WAAS,EAAE;AACrC,QAAM,CAAC,MAAM,OAAO,IAAIA,WAAe,QAAQ;AAC/C,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAS,KAAK;AAC5C,QAAM,CAAC,QAAQ,SAAS,IAAIA,WAAS,EAAE;AACvC,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAS,EAAE;AACrC,QAAM,CAAC,cAAc,eAAe,IAAIA,WAAmD,OAAO;AAClG,QAAM,CAAC,QAAQ,SAAS,IAAIA,WAAS,KAAK;AAE1C,QAAM,UAAU,IAAI,aAAa;AAEjC,EAAAC,WAAS,CAACF,QAAO,QAAQ;AACrB,QAAI,IAAI,KAAK;AACT,YAAM,SAAgC,CAAC,SAAS,QAAQ,WAAW,SAAS;AAC5E,YAAM,eAAe,OAAO,QAAQ,YAAY;AAChD,sBAAgB,QAAQ,eAAe,KAAK,OAAO,MAAM,CAAC;AAAA,IAC9D,WAAW,IAAI,QAAQ;AACnB,UAAI,iBAAiB,QAAQ;AACzB,gBAAQ,SAAS,WAAW,WAAW,QAAQ;AAC/C,kBAAU,EAAE;AACZ,iBAAS,EAAE;AAAA,MACf,WAAW,iBAAiB,WAAW;AACnC,mBAAW,CAAC,OAAO;AAAA,MACvB,OAAO;AAEH,sBAAc;AAAA,MAClB;AAAA,IACJ,WAAWA,WAAU,OAAO,QAAQ;AAChC,iBAAW;AAAA,IACf;AAAA,EACJ,CAAC;AAED,QAAM,gBAAgB,MAAM;AACxB,QAAI,CAACA,QAAO;AACR,eAAS,uBAAuB;AAChC;AAAA,IACJ;AAEA,QAAI;AACA,eAAS,EAAE;AACX,UAAI,SAAS,UAAU;AACnB,cAAM,UAAU,QAAQ,aAAaA,QAAO,OAAO;AACnD,kBAAU,OAAO;AAAA,MACrB,OAAO;AACH,cAAM,UAAU,QAAQ,aAAaA,MAAK;AAC1C,kBAAU,QAAQ,SAAS,OAAO,CAAC;AAAA,MACvC;AACA,gBAAU,KAAK;AAAA,IACnB,SAAS,KAAK;AACV,eAAS,aAAa,IAAI,KAAK,eAAe,QAAQ,IAAI,UAAU,eAAe,EAAE;AACrF,gBAAU,EAAE;AAAA,IAChB;AAAA,EACJ;AAEA,QAAM,aAAa,YAAY;AAC3B,QAAI;AACA,YAAM,EAAE,SAAS,WAAW,IAAI,MAAM,OAAO,YAAY;AACzD,YAAM,WAAW,MAAM,MAAM;AAC7B,gBAAU,IAAI;AACd,iBAAW,MAAM,UAAU,KAAK,GAAG,GAAI;AAAA,IAC3C,SAASG,QAAO;AAAA,IAEhB;AAAA,EACJ;AAEA,SACI,gBAAAC,QAAA,cAACC,OAAA,EAAI,eAAc,YACf,gBAAAD,QAAA,cAACC,OAAA,EAAI,cAAc,KACf,gBAAAD,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAM,UAAO,kCAExB,CACJ,GAEA,gBAAAF,QAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACG,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,UAAU;AAAA,MACV,UAAU;AAAA,MACV,cAAc;AAAA;AAAA,IAEd,gBAAAD,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAM,UAAS,cAAc,KAAG,UAE3C;AAAA,IAEA,gBAAAF,QAAA,cAACC,OAAA,EAAI,cAAc,GAAG,eAAc,YAChC,gBAAAD,QAAA,cAACC,OAAA,EAAI,cAAc,KACf,gBAAAD,QAAA,cAACE,QAAA,EAAK,OAAO,iBAAiB,UAAU,UAAU,UAC7C,iBAAiB,UAAU,YAAO,MAAK,aAC5C,CACJ,GACA,gBAAAF,QAAA,cAACC,OAAA,EAAI,YAAY,GAAG,OAAO,MACtB,iBAAiB,UACd,gBAAAD,QAAA,cAACG,YAAA,EAAU,OAAOP,QAAO,UAAU,UAAU,aAAY,iBAAgB,IAEzE,gBAAAI,QAAA,cAACE,QAAA,EAAK,UAAU,CAACN,UAAQA,UAAS,SAAU,CAEpD,CACJ;AAAA,IAEA,gBAAAI,QAAA,cAACC,OAAA,EAAI,cAAc,KACf,gBAAAD,QAAA,cAACC,OAAA,EAAI,OAAO,MACR,gBAAAD,QAAA,cAACE,QAAA,EAAK,OAAO,iBAAiB,SAAS,UAAU,UAC5C,iBAAiB,SAAS,YAAO,MAAK,OAC3C,CACJ,GACA,gBAAAF,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAO,iBAAiB,SAAS,WAAW,UAClD,SAAS,WAAW,WAAW,QACpC,GACC,iBAAiB,UACd,gBAAAF,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAC,oBAAkB,CAEzC;AAAA,IAEC,SAAS,YACN,gBAAAF,QAAA,cAACC,OAAA,EAAI,cAAc,KACf,gBAAAD,QAAA,cAACE,QAAA,EAAK,OAAO,iBAAiB,YAAY,UAAU,UAC/C,iBAAiB,YAAY,YAAO,MAAK,KACxC,UAAU,WAAM,KAAI,qCAC1B,CACJ;AAAA,IAGJ,gBAAAF,QAAA,cAACC,OAAA,EAAI,WAAW,KACZ,gBAAAD,QAAA;AAAA,MAACE;AAAA,MAAA;AAAA,QACG,MAAI;AAAA,QACJ,iBAAiB,iBAAiB,YAAY,UAAU;AAAA,QACxD,OAAO,iBAAiB,YAAY,UAAU;AAAA;AAAA,MAE7C,iBAAiB,YAAY,YAAO;AAAA,MAAK;AAAA,MACvC,SAAS,WAAW,WAAW;AAAA,MAAS;AAAA,IAC/C,CACJ;AAAA,EACJ,GAEC,SACG,gBAAAF,QAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACG,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,UAAU;AAAA,MACV,UAAU;AAAA,MACV,cAAc;AAAA;AAAA,IAEd,gBAAAD,QAAA,cAACE,QAAA,EAAK,OAAM,SAAM,kBAAU,KAAM;AAAA,EACtC,GAGH,UACG,gBAAAF,QAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACG,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,UAAU;AAAA,MACV,UAAU;AAAA;AAAA,IAEV,gBAAAD,QAAA,cAACC,OAAA,EAAI,cAAc,KACf,gBAAAD,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAM,WAAQ,gBAEzB,GACC,UACG,gBAAAF,QAAA,cAACC,OAAA,EAAI,YAAY,KACb,gBAAAD,QAAA,cAACE,QAAA,EAAK,OAAM,WAAQ,6BAAsB,CAC9C,CAER;AAAA,IAEA,gBAAAF,QAAA,cAACC,OAAA,EAAI,eAAc,YACf,gBAAAD,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAC,UAAO,KAAK,YAAY,CAAE,GACzC,gBAAAF,QAAA,cAACC,OAAA,EAAI,WAAW,KACZ,gBAAAD,QAAA,cAACE,QAAA,EAAK,MAAK,UAAQ,MAAO,CAC9B,CACJ;AAAA,EACJ,GAGJ,gBAAAF,QAAA,cAACC,OAAA,EAAI,WAAW,GAAG,aAAY,UAAS,aAAY,QAAO,UAAU,KACjE,gBAAAD,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAC,yDAEf,CACJ,CACJ;AAER;;;AC9LA,OAAOE,WAAS,YAAAC,kBAAgB;AAChC,SAAS,OAAAC,OAAK,QAAAC,QAAM,YAAAC,kBAAgB;AACpC,OAAOC,gBAAe;AAKf,IAAM,UAAoB,MAAM;AACnC,QAAM,CAACC,QAAO,QAAQ,IAAIC,WAAS,EAAE;AACrC,QAAM,CAAC,MAAM,OAAO,IAAIA,WAAe,QAAQ;AAC/C,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAS,KAAK;AAC5C,QAAM,CAAC,QAAQ,SAAS,IAAIA,WAAS,EAAE;AACvC,QAAM,CAAC,cAAc,eAAe,IAAIA,WAAgD,OAAO;AAC/F,QAAM,CAAC,QAAQ,SAAS,IAAIA,WAAS,KAAK;AAE1C,QAAM,UAAU,IAAI,aAAa;AAEjC,EAAAC,WAAS,CAACF,QAAO,QAAQ;AACrB,QAAI,IAAI,KAAK;AACT,YAAM,SAAgC,CAAC,SAAS,QAAQ,QAAQ,SAAS;AACzE,YAAM,eAAe,OAAO,QAAQ,YAAY;AAChD,sBAAgB,QAAQ,eAAe,KAAK,OAAO,MAAM,CAAC;AAAA,IAC9D,WAAW,IAAI,QAAQ;AACnB,UAAI,iBAAiB,QAAQ;AACzB,gBAAQ,SAAS,WAAW,WAAW,QAAQ;AAC/C,kBAAU,EAAE;AAAA,MAChB,WAAW,iBAAiB,QAAQ;AAChC,mBAAW,CAAC,OAAO;AAAA,MACvB,OAAO;AAEH,sBAAc;AAAA,MAClB;AAAA,IACJ,WAAWA,WAAU,OAAO,QAAQ;AAChC,iBAAW;AAAA,IACf;AAAA,EACJ,CAAC;AAED,QAAM,gBAAgB,MAAM;AACxB,QAAI,CAACA,OAAO;AAEZ,QAAI,SAAS,UAAU;AACnB,YAAM,UAAU,UACV,QAAQ,UAAUA,QAAO,IAAI,IAC7B,QAAQ,UAAUA,QAAO,KAAK;AACpC,gBAAU,OAAO;AAAA,IACrB,OAAO;AACH,YAAM,UAAU,UACV,QAAQ,UAAUA,QAAO,IAAI,IAC7B,QAAQ,UAAUA,QAAO,KAAK;AACpC,gBAAU,OAAO;AAAA,IACrB;AACA,cAAU,KAAK;AAAA,EACnB;AAEA,QAAM,aAAa,YAAY;AAC3B,QAAI;AACA,YAAM,EAAE,SAAS,WAAW,IAAI,MAAM,OAAO,YAAY;AACzD,YAAM,WAAW,MAAM,MAAM;AAC7B,gBAAU,IAAI;AACd,iBAAW,MAAM,UAAU,KAAK,GAAG,GAAI;AAAA,IAC3C,SAAS,OAAO;AAAA,IAEhB;AAAA,EACJ;AAEA,SACI,gBAAAG,QAAA,cAACC,OAAA,EAAI,eAAc,YACf,gBAAAD,QAAA,cAACC,OAAA,EAAI,cAAc,KACf,gBAAAD,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAM,UAAO,+BAExB,CACJ,GAEA,gBAAAF,QAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACG,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,UAAU;AAAA,MACV,UAAU;AAAA,MACV,cAAc;AAAA;AAAA,IAEd,gBAAAD,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAM,UAAS,cAAc,KAAG,UAE3C;AAAA,IAEA,gBAAAF,QAAA,cAACC,OAAA,EAAI,cAAc,GAAG,eAAc,YAChC,gBAAAD,QAAA,cAACC,OAAA,EAAI,cAAc,KACf,gBAAAD,QAAA,cAACE,QAAA,EAAK,OAAO,iBAAiB,UAAU,UAAU,UAC7C,iBAAiB,UAAU,YAAO,MAAK,aAC5C,CACJ,GACA,gBAAAF,QAAA,cAACC,OAAA,EAAI,YAAY,GAAG,OAAO,MACtB,iBAAiB,UACd,gBAAAD,QAAA,cAACG,YAAA,EAAU,OAAON,QAAO,UAAU,UAAU,aAAY,wBAAuB,IAEhF,gBAAAG,QAAA,cAACE,QAAA,EAAK,UAAU,CAACL,UAAQA,UAAS,SAAU,CAEpD,CACJ;AAAA,IAEA,gBAAAG,QAAA,cAACC,OAAA,EAAI,cAAc,KACf,gBAAAD,QAAA,cAACC,OAAA,EAAI,OAAO,MACR,gBAAAD,QAAA,cAACE,QAAA,EAAK,OAAO,iBAAiB,SAAS,UAAU,UAC5C,iBAAiB,SAAS,YAAO,MAAK,OAC3C,CACJ,GACA,gBAAAF,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAO,iBAAiB,SAAS,WAAW,UAClD,SAAS,WAAW,WAAW,QACpC,GACC,iBAAiB,UACd,gBAAAF,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAC,oBAAkB,CAEzC;AAAA,IAEA,gBAAAF,QAAA,cAACC,OAAA,EAAI,cAAc,KACf,gBAAAD,QAAA,cAACE,QAAA,EAAK,OAAO,iBAAiB,SAAS,UAAU,UAC5C,iBAAiB,SAAS,YAAO,MAAK,KACrC,UAAU,WAAM,KAAI,uCAC1B,CACJ;AAAA,IAEA,gBAAAF,QAAA,cAACC,OAAA,EAAI,WAAW,KACZ,gBAAAD,QAAA;AAAA,MAACE;AAAA,MAAA;AAAA,QACG,MAAI;AAAA,QACJ,iBAAiB,iBAAiB,YAAY,UAAU;AAAA,QACxD,OAAO,iBAAiB,YAAY,UAAU;AAAA;AAAA,MAE7C,iBAAiB,YAAY,YAAO;AAAA,MAAK;AAAA,MACvC,SAAS,WAAW,WAAW;AAAA,MAAS;AAAA,IAC/C,CACJ;AAAA,EACJ,GAEC,UACG,gBAAAF,QAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACG,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,UAAU;AAAA,MACV,UAAU;AAAA;AAAA,IAEV,gBAAAD,QAAA,cAACC,OAAA,EAAI,cAAc,KACf,gBAAAD,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAM,WAAQ,gBAEzB,GACC,UACG,gBAAAF,QAAA,cAACC,OAAA,EAAI,YAAY,KACb,gBAAAD,QAAA,cAACE,QAAA,EAAK,OAAM,WAAQ,6BAAsB,CAC9C,CAER;AAAA,IAEA,gBAAAF,QAAA,cAACC,OAAA,EAAI,eAAc,YACf,gBAAAD,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAC,UAAO,KAAK,YAAY,GAAE,KAAE,UAAU,eAAe,aAAc,GAClF,gBAAAF,QAAA,cAACC,OAAA,EAAI,WAAW,KACZ,gBAAAD,QAAA,cAACE,QAAA,EAAK,MAAK,UAAQ,MAAO,CAC9B,CACJ;AAAA,EACJ,GAGJ,gBAAAF,QAAA,cAACC,OAAA,EAAI,WAAW,GAAG,aAAY,UAAS,aAAY,QAAO,UAAU,KACjE,gBAAAD,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAC,yDAEf,CACJ,CACJ;AAER;;;ACxKA,OAAOE,WAAS,YAAAC,kBAAgB;AAChC,SAAS,OAAAC,OAAK,QAAAC,QAAM,YAAAC,kBAAgB;AACpC,OAAOC,iBAAe;AAKf,IAAM,eAAyB,MAAM;AACxC,QAAM,CAACC,QAAO,QAAQ,IAAIC,WAAS,EAAE;AACrC,QAAM,CAAC,MAAM,OAAO,IAAIA,WAAe,KAAK;AAC5C,QAAM,CAAC,QAAQ,SAAS,IAAIA,WAAkC,KAAK;AACnE,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAS,KAAK;AACxC,QAAM,CAAC,QAAQ,SAAS,IAAIA,WAAS,EAAE;AACvC,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAS,EAAE;AACrC,QAAM,CAAC,cAAc,eAAe,IAAIA,WAAyD,MAAM;AACvG,QAAM,CAAC,QAAQ,SAAS,IAAIA,WAAS,KAAK;AAE1C,QAAM,UAAU,IAAI,aAAa;AAEjC,EAAAC,WAAS,CAACF,QAAO,QAAQ;AACrB,QAAI,IAAI,KAAK;AACT,YAAM,SAAgC,SAAS,QACzC,CAAC,QAAQ,MAAM,SAAS,IACxB,SAAS,aACT,CAAC,QAAQ,SAAS,UAAU,SAAS,IACrC,CAAC,QAAQ,SAAS,SAAS;AACjC,YAAM,eAAe,OAAO,QAAQ,YAAY;AAChD,sBAAgB,QAAQ,eAAe,KAAK,OAAO,MAAM,CAAC;AAAA,IAC9D,WAAW,IAAI,QAAQ;AACnB,UAAI,iBAAiB,QAAQ;AACzB,cAAM,QAAgB,CAAC,OAAO,YAAY,SAAS;AACnD,cAAM,eAAe,MAAM,QAAQ,IAAI;AACvC,gBAAQ,OAAO,eAAe,KAAK,MAAM,MAAM,CAAC;AAChD,kBAAU,EAAE;AACZ,iBAAS,EAAE;AAAA,MACf,WAAW,iBAAiB,UAAU;AAClC,cAAM,UAA2B,CAAC,OAAO,SAAS,KAAK;AACvD,cAAM,eAAe,QAAQ,QAAQ,MAAM;AAC3C,kBAAU,SAAS,eAAe,KAAK,QAAQ,MAAM,CAAC;AAAA,MAC1D,WAAW,iBAAiB,MAAM;AAC9B,iBAAS,CAAC,KAAK;AAAA,MACnB,OAAO;AAEH,sBAAc;AAAA,MAClB;AAAA,IACJ,WAAWA,WAAU,OAAO,QAAQ;AAChC,iBAAW;AAAA,IACf;AAAA,EACJ,CAAC;AAED,QAAM,gBAAgB,MAAM;AACxB,QAAI;AACA,eAAS,EAAE;AACX,UAAI,SAAS,OAAO;AAChB,cAAM,YAAY,QAAQ,gBAAgB,KAAK;AAC/C,kBAAU,UAAU,SAAS,CAAC;AAAA,MAClC,WAAW,SAAS,YAAY;AAC5B,YAAI,CAACA,QAAO;AACR,mBAAS,0BAA0B;AACnC;AAAA,QACJ;AACA,cAAM,QAAQ,QAAQ,gBAAgB,SAASA,QAAO,EAAE,GAAG,MAAM;AACjE,kBAAU,KAAK;AAAA,MACnB,OAAO;AACH,YAAI,CAACA,QAAO;AACR,mBAAS,4BAA4B;AACrC;AAAA,QACJ;AACA,cAAM,YAAY,QAAQ,mBAAmBA,MAAK;AAClD,kBAAU,UAAU,SAAS,CAAC;AAAA,MAClC;AACA,gBAAU,KAAK;AAAA,IACnB,SAAS,KAAK;AACV,eAAS,eAAe,QAAQ,IAAI,UAAU,mBAAmB;AACjE,gBAAU,EAAE;AAAA,IAChB;AAAA,EACJ;AAEA,QAAM,aAAa,YAAY;AAC3B,QAAI;AACA,YAAM,EAAE,SAAS,WAAW,IAAI,MAAM,OAAO,YAAY;AACzD,YAAM,WAAW,MAAM,MAAM;AAC7B,gBAAU,IAAI;AACd,iBAAW,MAAM,UAAU,KAAK,GAAG,GAAI;AAAA,IAC3C,SAASG,QAAO;AAAA,IAEhB;AAAA,EACJ;AAEA,SACI,gBAAAC,QAAA,cAACC,OAAA,EAAI,eAAc,YACf,gBAAAD,QAAA,cAACC,OAAA,EAAI,cAAc,KACf,gBAAAD,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAM,UAAO,+BAExB,CACJ,GAEA,gBAAAF,QAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACG,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,UAAU;AAAA,MACV,UAAU;AAAA,MACV,cAAc;AAAA;AAAA,IAEd,gBAAAD,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAM,UAAS,cAAc,KAAG,UAE3C;AAAA,IAEA,gBAAAF,QAAA,cAACC,OAAA,EAAI,cAAc,KACf,gBAAAD,QAAA,cAACC,OAAA,EAAI,OAAO,MACR,gBAAAD,QAAA,cAACE,QAAA,EAAK,OAAO,iBAAiB,SAAS,UAAU,UAC5C,iBAAiB,SAAS,YAAO,MAAK,OAC3C,CACJ,GACA,gBAAAF,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAO,iBAAiB,SAAS,WAAW,UAClD,SAAS,QAAQ,iBAAiB,SAAS,aAAa,2BAAsB,wBACnF,GACC,iBAAiB,UACd,gBAAAF,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAC,mBAAiB,CAExC;AAAA,IAEC,SAAS,SACN,gBAAAF,QAAA,cAACC,OAAA,EAAI,cAAc,GAAG,eAAc,YAChC,gBAAAD,QAAA,cAACC,OAAA,EAAI,cAAc,KACf,gBAAAD,QAAA,cAACE,QAAA,EAAK,OAAO,iBAAiB,UAAU,UAAU,UAC7C,iBAAiB,UAAU,YAAO,MAClC,SAAS,aAAa,eAAe,cAC1C,CACJ,GACA,gBAAAF,QAAA,cAACC,OAAA,EAAI,YAAY,GAAG,OAAO,MACtB,iBAAiB,UACd,gBAAAD,QAAA;AAAA,MAACG;AAAA,MAAA;AAAA,QACG,OAAOP;AAAA,QACP,UAAU;AAAA,QACV,aAAa,SAAS,aAAa,eAAe;AAAA;AAAA,IACtD,IAEA,gBAAAI,QAAA,cAACE,QAAA,EAAK,UAAU,CAACN,UAAQA,UAAS,SAAU,CAEpD,CACJ;AAAA,IAGH,SAAS,cACN,gBAAAI,QAAA,cAACC,OAAA,EAAI,cAAc,KACf,gBAAAD,QAAA,cAACC,OAAA,EAAI,OAAO,MACR,gBAAAD,QAAA,cAACE,QAAA,EAAK,OAAO,iBAAiB,WAAW,UAAU,UAC9C,iBAAiB,WAAW,YAAO,MAAK,SAC7C,CACJ,GACA,gBAAAF,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAO,iBAAiB,WAAW,WAAW,UACpD,OAAO,YAAY,CACxB,GACC,iBAAiB,YACd,gBAAAF,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAC,mBAAiB,CAExC;AAAA,IAGH,SAAS,SACN,gBAAAF,QAAA,cAACC,OAAA,EAAI,cAAc,KACf,gBAAAD,QAAA,cAACE,QAAA,EAAK,OAAO,iBAAiB,OAAO,UAAU,UAC1C,iBAAiB,OAAO,YAAO,MAAK,KACnC,QAAQ,WAAM,KAAI,gBACxB,CACJ;AAAA,IAGJ,gBAAAF,QAAA,cAACC,OAAA,EAAI,WAAW,KACZ,gBAAAD,QAAA;AAAA,MAACE;AAAA,MAAA;AAAA,QACG,MAAI;AAAA,QACJ,iBAAiB,iBAAiB,YAAY,UAAU;AAAA,QACxD,OAAO,iBAAiB,YAAY,UAAU;AAAA;AAAA,MAE7C,iBAAiB,YAAY,YAAO;AAAA,MAAK;AAAA,MACvC,SAAS,QAAQ,gBAAgB;AAAA,MAAU;AAAA,IAClD,CACJ;AAAA,EACJ,GAEC,SACG,gBAAAF,QAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACG,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,UAAU;AAAA,MACV,UAAU;AAAA,MACV,cAAc;AAAA;AAAA,IAEd,gBAAAD,QAAA,cAACE,QAAA,EAAK,OAAM,SAAM,kBAAU,KAAM;AAAA,EACtC,GAGH,UACG,gBAAAF,QAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACG,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,UAAU;AAAA,MACV,UAAU;AAAA;AAAA,IAEV,gBAAAD,QAAA,cAACC,OAAA,EAAI,cAAc,KACf,gBAAAD,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAM,WAAQ,gBAEzB,GACC,UACG,gBAAAF,QAAA,cAACC,OAAA,EAAI,YAAY,KACb,gBAAAD,QAAA,cAACE,QAAA,EAAK,OAAM,WAAQ,6BAAsB,CAC9C,CAER;AAAA,IAEA,gBAAAF,QAAA,cAACC,OAAA,EAAI,eAAc,YACf,gBAAAD,QAAA,cAACC,OAAA,EAAI,WAAW,KACZ,gBAAAD,QAAA,cAACE,QAAA,EAAK,MAAK,UAAQ,MAAO,CAC9B,CACJ;AAAA,EACJ,GAGJ,gBAAAF,QAAA,cAACC,OAAA,EAAI,WAAW,GAAG,aAAY,UAAS,aAAY,QAAO,UAAU,KACjE,gBAAAD,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAC,yDAEf,CACJ,CACJ;AAER;;;ACrOA,OAAOE,WAAS,YAAAC,kBAAgB;AAChC,SAAS,OAAAC,OAAK,QAAAC,QAAM,YAAAC,kBAAgB;AACpC,OAAOC,iBAAe;AAKf,IAAM,UAAoB,MAAM;AACnC,QAAM,CAAC,MAAM,OAAO,IAAIC,WAAe,QAAQ;AAC/C,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAS,EAAE;AACrC,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAS,EAAE;AACzC,QAAM,CAAC,QAAQ,SAAS,IAAIA,WAAS,EAAE;AACvC,QAAM,CAAC,QAAQ,SAAS,IAAIA,WAAoF,CAAC,CAAC;AAClH,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAS,EAAE;AACrC,QAAM,CAAC,cAAc,eAAe,IAAIA,WAA8D,MAAM;AAC5G,QAAM,CAAC,QAAQ,SAAS,IAAIA,WAAS,KAAK;AAE1C,QAAM,UAAU,IAAI,aAAa;AAEjC,EAAAC,WAAS,CAACC,QAAO,QAAQ;AACrB,QAAI,IAAI,KAAK;AACT,YAAM,SAAgC,SAAS,WACzC,CAAC,QAAQ,SAAS,SAAS,IAC3B,CAAC,QAAQ,WAAW,UAAU,SAAS;AAC7C,YAAM,eAAe,OAAO,QAAQ,YAAY;AAChD,sBAAgB,QAAQ,eAAe,KAAK,OAAO,MAAM,CAAC;AAAA,IAC9D,WAAW,IAAI,QAAQ;AACnB,UAAI,iBAAiB,QAAQ;AACzB,gBAAQ,SAAS,WAAW,WAAW,QAAQ;AAC/C,kBAAU,CAAC,CAAC;AACZ,iBAAS,EAAE;AAAA,MACf,OAAO;AAEH,sBAAc;AAAA,MAClB;AAAA,IACJ,WAAWA,WAAU,OAAO,OAAO,OAAO;AACtC,iBAAW;AAAA,IACf;AAAA,EACJ,CAAC;AAED,QAAM,gBAAgB,MAAM;AACxB,QAAI;AACA,eAAS,EAAE;AACX,UAAI,SAAS,UAAU;AACnB,YAAI,CAAC,OAAO;AACR,mBAAS,0BAA0B;AACnC;AAAA,QACJ;AACA,cAAM,UAAU,QAAQ,UAAU,KAAK;AACvC,kBAAU,OAAO;AAAA,MACrB,OAAO;AACH,YAAI,CAAC,SAAS;AACV,mBAAS,2BAA2B;AACpC;AAAA,QACJ;AACA,YAAI,CAAC,QAAQ;AACT,mBAAS,2BAA2B;AACpC;AAAA,QACJ;AACA,cAAM,aAAa,KAAK,MAAM,OAAO;AACrC,cAAM,UAAU,QAAQ,UAAU,YAAY,MAAM;AACpD,kBAAU,EAAE,OAAO,QAAQ,CAAC;AAAA,MAChC;AACA,gBAAU,KAAK;AAAA,IACnB,SAAS,KAAK;AACV,eAAS,eAAe,QAAQ,IAAI,UAAU,mBAAmB;AACjE,gBAAU,CAAC,CAAC;AAAA,IAChB;AAAA,EACJ;AAEA,QAAM,aAAa,YAAY;AAC3B,QAAI;AACA,YAAM,EAAE,SAAS,WAAW,IAAI,MAAM,OAAO,YAAY;AACzD,YAAM,WAAW,MAAM,OAAO,SAAS,EAAE;AACzC,gBAAU,IAAI;AACd,iBAAW,MAAM,UAAU,KAAK,GAAG,GAAI;AAAA,IAC3C,SAASC,QAAO;AAAA,IAEhB;AAAA,EACJ;AAEA,SACI,gBAAAC,QAAA,cAACC,OAAA,EAAI,eAAc,YACf,gBAAAD,QAAA,cAACC,OAAA,EAAI,cAAc,KACf,gBAAAD,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAM,UAAO,+BAExB,CACJ,GAEA,gBAAAF,QAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACG,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,UAAU;AAAA,MACV,UAAU;AAAA,MACV,cAAc;AAAA;AAAA,IAEd,gBAAAD,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAM,UAAS,cAAc,KAAG,UAE3C;AAAA,IAEA,gBAAAF,QAAA,cAACC,OAAA,EAAI,cAAc,KACf,gBAAAD,QAAA,cAACC,OAAA,EAAI,OAAO,MACR,gBAAAD,QAAA,cAACE,QAAA,EAAK,OAAO,iBAAiB,SAAS,UAAU,UAC5C,iBAAiB,SAAS,YAAO,MAAK,OAC3C,CACJ,GACA,gBAAAF,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAO,iBAAiB,SAAS,WAAW,UAClD,SAAS,WAAW,WAAW,QACpC,GACC,iBAAiB,UACd,gBAAAF,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAC,oBAAkB,CAEzC;AAAA,IAEC,SAAS,WACN,gBAAAF,QAAA,cAACC,OAAA,EAAI,cAAc,GAAG,eAAc,YAChC,gBAAAD,QAAA,cAACC,OAAA,EAAI,cAAc,KACf,gBAAAD,QAAA,cAACE,QAAA,EAAK,OAAO,iBAAiB,UAAU,UAAU,UAC7C,iBAAiB,UAAU,YAAO,MAAK,YAC5C,CACJ,GACA,gBAAAF,QAAA,cAACC,OAAA,EAAI,YAAY,GAAG,OAAO,MACtB,iBAAiB,UACd,gBAAAD,QAAA;AAAA,MAACG;AAAA,MAAA;AAAA,QACG,OAAO;AAAA,QACP,UAAU;AAAA,QACV,aAAY;AAAA;AAAA,IAChB,IAEA,gBAAAH,QAAA,cAACE,QAAA,EAAK,UAAU,CAAC,SAAQ,SAAS,SAAU,CAEpD,CACJ,IAEA,gBAAAF,QAAA,cAAAA,QAAA,gBACI,gBAAAA,QAAA,cAACC,OAAA,EAAI,cAAc,GAAG,eAAc,YAChC,gBAAAD,QAAA,cAACC,OAAA,EAAI,cAAc,KACf,gBAAAD,QAAA,cAACE,QAAA,EAAK,OAAO,iBAAiB,YAAY,UAAU,UAC/C,iBAAiB,YAAY,YAAO,MAAK,iBAC9C,CACJ,GACA,gBAAAF,QAAA,cAACC,OAAA,EAAI,YAAY,GAAG,OAAO,MACtB,iBAAiB,YACd,gBAAAD,QAAA;AAAA,MAACG;AAAA,MAAA;AAAA,QACG,OAAO;AAAA,QACP,UAAU;AAAA,QACV,aAAY;AAAA;AAAA,IAChB,IAEA,gBAAAH,QAAA,cAACE,QAAA,EAAK,UAAU,CAAC,WAAU,WAAW,SAAU,CAExD,CACJ,GAEA,gBAAAF,QAAA,cAACC,OAAA,EAAI,cAAc,GAAG,eAAc,YAChC,gBAAAD,QAAA,cAACC,OAAA,EAAI,cAAc,KACf,gBAAAD,QAAA,cAACE,QAAA,EAAK,OAAO,iBAAiB,WAAW,UAAU,UAC9C,iBAAiB,WAAW,YAAO,MAAK,aAC7C,CACJ,GACA,gBAAAF,QAAA,cAACC,OAAA,EAAI,YAAY,GAAG,OAAO,MACtB,iBAAiB,WACd,gBAAAD,QAAA;AAAA,MAACG;AAAA,MAAA;AAAA,QACG,OAAO;AAAA,QACP,UAAU;AAAA,QACV,aAAY;AAAA,QACZ,MAAK;AAAA;AAAA,IACT,IAEA,gBAAAH,QAAA,cAACE,QAAA,EAAK,UAAU,CAAC,UACZ,SAAS,IAAI,OAAO,OAAO,MAAM,IAAI,SAC1C,CAER,CACJ,CACJ;AAAA,IAGJ,gBAAAF,QAAA,cAACC,OAAA,EAAI,WAAW,KACZ,gBAAAD,QAAA;AAAA,MAACE;AAAA,MAAA;AAAA,QACG,MAAI;AAAA,QACJ,iBAAiB,iBAAiB,YAAY,UAAU;AAAA,QACxD,OAAO,iBAAiB,YAAY,UAAU;AAAA;AAAA,MAE7C,iBAAiB,YAAY,YAAO;AAAA,MAAK;AAAA,MACvC,SAAS,WAAW,WAAW;AAAA,MAAS;AAAA,IAC/C,CACJ;AAAA,EACJ,GAEC,SACG,gBAAAF,QAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACG,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,UAAU;AAAA,MACV,UAAU;AAAA,MACV,cAAc;AAAA;AAAA,IAEd,gBAAAD,QAAA,cAACE,QAAA,EAAK,OAAM,SAAM,kBAAU,KAAM;AAAA,EACtC,IAGF,OAAO,UAAU,OAAO,UACtB,gBAAAF,QAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACG,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,UAAU;AAAA,MACV,UAAU;AAAA;AAAA,IAEV,gBAAAD,QAAA,cAACC,OAAA,EAAI,cAAc,KACf,gBAAAD,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAM,WAAQ,gBAEzB,GACC,UAAU,OAAO,SACd,gBAAAF,QAAA,cAACC,OAAA,EAAI,YAAY,KACb,gBAAAD,QAAA,cAACE,QAAA,EAAK,OAAM,WAAQ,6BAAsB,CAC9C,CAER;AAAA,IAEA,gBAAAF,QAAA,cAACC,OAAA,EAAI,eAAc,YACd,OAAO,UACJ,gBAAAD,QAAA,cAAAA,QAAA,gBACI,gBAAAA,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAM,YAAS,SAAO,GACjC,gBAAAF,QAAA,cAACE,QAAA,MAAM,KAAK,UAAU,OAAO,QAAQ,MAAM,CAAC,CAAE,GAC9C,gBAAAF,QAAA,cAACE,QAAA,MAAK,GAAC,GACP,gBAAAF,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAM,YAAS,UAAQ,GAClC,gBAAAF,QAAA,cAACE,QAAA,MAAM,KAAK,UAAU,OAAO,SAAS,MAAM,CAAC,CAAE,GAC/C,gBAAAF,QAAA,cAACE,QAAA,MAAK,GAAC,GACP,gBAAAF,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAM,YAAS,YAAU,GACpC,gBAAAF,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAE,OAAO,SAAU,CACrC,GAEH,OAAO,SACJ,gBAAAF,QAAA,cAAAA,QAAA,gBACI,gBAAAA,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAM,YAAS,QAAM,GAChC,gBAAAF,QAAA,cAACE,QAAA,EAAK,MAAK,UAAQ,OAAO,KAAM,CACpC,CAER;AAAA,EACJ,GAGJ,gBAAAF,QAAA,cAACC,OAAA,EAAI,WAAW,GAAG,aAAY,UAAS,aAAY,QAAO,UAAU,KACjE,gBAAAD,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAC,8BACgB,SAAS,WAAW,WAAW,UAAS,wBACvE,CACJ,CACJ;AAER;;;AC7PA,OAAOE,WAAS,YAAAC,kBAAgB;AAChC,SAAS,OAAAC,OAAK,QAAAC,QAAM,YAAAC,kBAAgB;AACpC,OAAOC,iBAAe;AAGf,IAAM,WAAqB,MAAM;AACpC,QAAM,CAAC,YAAY,aAAa,IAAIC,WAAS,EAAE;AAC/C,QAAM,CAAC,QAAQ,SAAS,IAAIA,WAA6D,IAAI;AAC7F,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAS,EAAE;AACrC,QAAM,CAAC,cAAc,eAAe,IAAIA,WAAiC,YAAY;AACrF,QAAM,CAAC,QAAQ,SAAS,IAAIA,WAAS,KAAK;AAE1C,QAAM,UAAU,IAAI,aAAa;AAEjC,EAAAC,WAAS,CAACC,QAAO,QAAQ;AACrB,QAAI,IAAI,KAAK;AACT,sBAAgB,iBAAiB,eAAe,UAAU,YAAY;AAAA,IAC1E,WAAW,IAAI,QAAQ;AAEnB,kBAAY;AAAA,IAChB,WAAWA,WAAU,OAAO,QAAQ;AAChC,iBAAW;AAAA,IACf;AAAA,EACJ,CAAC;AAED,QAAM,cAAc,MAAM;AACtB,QAAI,CAAC,YAAY;AACb,eAAS,gCAAgC;AACzC;AAAA,IACJ;AAEA,QAAI;AACA,eAAS,EAAE;AACX,YAAM,SAAS,QAAQ,UAAU,UAAU;AAC3C,gBAAU,MAAM;AAChB,gBAAU,KAAK;AAAA,IACnB,SAAS,KAAK;AACV,eAAS,eAAe,QAAQ,IAAI,UAAU,iCAAiC;AAC/E,gBAAU,IAAI;AAAA,IAClB;AAAA,EACJ;AAEA,QAAM,aAAa,YAAY;AAC3B,QAAI,CAAC,OAAQ;AACb,QAAI;AACA,YAAM,EAAE,SAAS,WAAW,IAAI,MAAM,OAAO,YAAY;AACzD,YAAM,WAAW,GAAG,OAAO,WAAW;AAAA;AAAA;AAAA,EAAmB,OAAO,SAAS,KAAK,IAAI,CAAC;AACnF,YAAM,WAAW,MAAM,QAAQ;AAC/B,gBAAU,IAAI;AACd,iBAAW,MAAM,UAAU,KAAK,GAAG,GAAI;AAAA,IAC3C,SAASC,QAAO;AAAA,IAEhB;AAAA,EACJ;AAEA,SACI,gBAAAC,QAAA,cAACC,OAAA,EAAI,eAAc,YACf,gBAAAD,QAAA,cAACC,OAAA,EAAI,cAAc,KACf,gBAAAD,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAM,UAAO,+BAExB,CACJ,GAEA,gBAAAF,QAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACG,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,UAAU;AAAA,MACV,UAAU;AAAA,MACV,cAAc;AAAA;AAAA,IAEd,gBAAAD,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAM,UAAS,cAAc,KAAG,UAE3C;AAAA,IAEA,gBAAAF,QAAA,cAACC,OAAA,EAAI,cAAc,GAAG,eAAc,YAChC,gBAAAD,QAAA,cAACC,OAAA,EAAI,cAAc,KACf,gBAAAD,QAAA,cAACE,QAAA,EAAK,OAAO,iBAAiB,eAAe,UAAU,UAClD,iBAAiB,eAAe,YAAO,MAAK,kBACjD,CACJ,GACA,gBAAAF,QAAA,cAACC,OAAA,EAAI,YAAY,GAAG,OAAO,MACtB,iBAAiB,eACd,gBAAAD,QAAA;AAAA,MAACG;AAAA,MAAA;AAAA,QACG,OAAO;AAAA,QACP,UAAU;AAAA,QACV,aAAY;AAAA;AAAA,IAChB,IAEA,gBAAAH,QAAA,cAACE,QAAA,EAAK,UAAU,CAAC,cAAa,cAAc,SAAU,CAE9D,CACJ;AAAA,IAEA,gBAAAF,QAAA,cAACC,OAAA,EAAI,WAAW,GAAG,cAAc,KAC7B,gBAAAD,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAC,qEAEf,CACJ;AAAA,IAEA,gBAAAF,QAAA,cAACC,OAAA,EAAI,WAAW,KACZ,gBAAAD,QAAA;AAAA,MAACE;AAAA,MAAA;AAAA,QACG,MAAI;AAAA,QACJ,iBAAiB,iBAAiB,UAAU,UAAU;AAAA,QACtD,OAAO,iBAAiB,UAAU,UAAU;AAAA;AAAA,MAE3C,iBAAiB,UAAU,YAAO;AAAA,MAAK;AAAA,IAE5C,CACJ;AAAA,EACJ,GAEC,SACG,gBAAAF,QAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACG,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,UAAU;AAAA,MACV,UAAU;AAAA,MACV,cAAc;AAAA;AAAA,IAEd,gBAAAD,QAAA,cAACE,QAAA,EAAK,OAAM,SAAM,kBAAU,KAAM;AAAA,EACtC,GAGH,UACG,gBAAAF,QAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACG,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,UAAU;AAAA,MACV,UAAU;AAAA;AAAA,IAEV,gBAAAD,QAAA,cAACC,OAAA,EAAI,cAAc,KACf,gBAAAD,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAM,WAAQ,gBAEzB,GACC,UACG,gBAAAF,QAAA,cAACC,OAAA,EAAI,YAAY,KACb,gBAAAD,QAAA,cAACE,QAAA,EAAK,OAAM,WAAQ,6BAAsB,CAC9C,CAER;AAAA,IAEA,gBAAAF,QAAA,cAACC,OAAA,EAAI,eAAc,YACf,gBAAAD,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAM,YAAS,aAAW,GACrC,gBAAAF,QAAA,cAACE,QAAA,MAAM,UAAW,GAClB,gBAAAF,QAAA,cAACE,QAAA,MAAK,GAAC,GAEP,gBAAAF,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAM,YAAS,UAAQ,GAClC,gBAAAF,QAAA,cAACE,QAAA,MAAM,OAAO,WAAY,GAC1B,gBAAAF,QAAA,cAACE,QAAA,MAAK,GAAC,GAEP,gBAAAF,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAM,YAAS,oBAAkB,GAC3C,OAAO,SAAS,IAAI,CAAC,KAAK,UACvB,gBAAAF,QAAA,cAACE,QAAA,EAAK,KAAK,SAAO,MAAG,QAAQ,GAAE,MAAG,GAAI,CACzC,CACL;AAAA,EACJ,GAGJ,gBAAAF,QAAA,cAACC,OAAA,EAAI,WAAW,GAAG,aAAY,UAAS,aAAY,QAAO,UAAU,KACjE,gBAAAD,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAC,gDAEf,CACJ,CACJ;AAER;;;ACxKA,OAAOE,WAAS,YAAAC,kBAAgB;AAChC,SAAS,OAAAC,OAAK,QAAAC,QAAM,YAAAC,kBAAgB;AACpC,OAAOC,iBAAe;AAGf,IAAM,eAAyB,MAAM;AACxC,QAAM,CAAC,MAAM,OAAO,IAAIC,WAAS,EAAE;AACnC,QAAM,CAAC,QAAQ,SAAS,IAAIA,WAAS,KAAK;AAC1C,QAAM,CAAC,MAAM,OAAO,IAAIA,WAAS,kBAAkB;AACnD,QAAM,CAAC,QAAQ,SAAS,IAAIA,WAAS,EAAE;AACvC,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAS,EAAE;AACrC,QAAM,CAAC,cAAc,eAAe,IAAIA,WAA6C,MAAM;AAC3F,QAAM,CAAC,QAAQ,SAAS,IAAIA,WAAS,KAAK;AAE1C,QAAM,UAAU,IAAI,aAAa;AAEjC,EAAAC,WAAS,CAACC,QAAO,QAAQ;AACrB,QAAI,IAAI,KAAK;AACT,YAAM,SAAgC,CAAC,QAAQ,QAAQ,MAAM,SAAS;AACtE,YAAM,eAAe,OAAO,QAAQ,YAAY;AAChD,sBAAgB,QAAQ,eAAe,KAAK,OAAO,MAAM,CAAC;AAAA,IAC9D,WAAW,IAAI,QAAQ;AAEnB,oBAAc;AAAA,IAClB,WAAWA,WAAU,OAAO,QAAQ;AAChC,iBAAW;AAAA,IACf;AAAA,EACJ,CAAC;AAED,QAAM,gBAAgB,MAAM;AACxB,QAAI,CAAC,MAAM;AACP,eAAS,qBAAqB;AAC9B;AAAA,IACJ;AACA,QAAI,CAAC,UAAU,CAAC,MAAM;AAClB,eAAS,6BAA6B;AACtC;AAAA,IACJ;AAEA,QAAI;AACA,eAAS,EAAE;AACX,YAAM,YAAY,QAAQ,gBAAgB,MAAM,QAAQ,IAAI;AAC5D,gBAAU,SAAS;AACnB,gBAAU,KAAK;AAAA,IACnB,SAAS,KAAK;AACV,eAAS,eAAe,QAAQ,IAAI,UAAU,mBAAmB;AACjE,gBAAU,EAAE;AAAA,IAChB;AAAA,EACJ;AAEA,QAAM,aAAa,YAAY;AAC3B,QAAI;AACA,YAAM,EAAE,SAAS,WAAW,IAAI,MAAM,OAAO,YAAY;AACzD,YAAM,WAAW,MAAM,MAAM;AAC7B,gBAAU,IAAI;AACd,iBAAW,MAAM,UAAU,KAAK,GAAG,GAAI;AAAA,IAC3C,SAASC,QAAO;AAAA,IAEhB;AAAA,EACJ;AAEA,SACI,gBAAAC,QAAA,cAACC,OAAA,EAAI,eAAc,YACf,gBAAAD,QAAA,cAACC,OAAA,EAAI,cAAc,KACf,gBAAAD,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAM,UAAO,8BAExB,CACJ,GAEA,gBAAAF,QAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACG,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,UAAU;AAAA,MACV,UAAU;AAAA,MACV,cAAc;AAAA;AAAA,IAEd,gBAAAD,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAM,UAAS,cAAc,KAAG,UAE3C;AAAA,IAEA,gBAAAF,QAAA,cAACC,OAAA,EAAI,cAAc,GAAG,eAAc,YAChC,gBAAAD,QAAA,cAACC,OAAA,EAAI,cAAc,KACf,gBAAAD,QAAA,cAACE,QAAA,EAAK,OAAO,iBAAiB,SAAS,UAAU,UAC5C,iBAAiB,SAAS,YAAO,MAAK,OAC3C,CACJ,GACA,gBAAAF,QAAA,cAACC,OAAA,EAAI,YAAY,GAAG,OAAO,MACtB,iBAAiB,SACd,gBAAAD,QAAA;AAAA,MAACG;AAAA,MAAA;AAAA,QACG,OAAO;AAAA,QACP,UAAU;AAAA,QACV,aAAY;AAAA;AAAA,IAChB,IAEA,gBAAAH,QAAA,cAACE,QAAA,EAAK,UAAU,CAAC,QAAO,QAAQ,SAAU,CAElD,CACJ;AAAA,IAEA,gBAAAF,QAAA,cAACC,OAAA,EAAI,cAAc,GAAG,eAAc,YAChC,gBAAAD,QAAA,cAACC,OAAA,EAAI,cAAc,KACf,gBAAAD,QAAA,cAACE,QAAA,EAAK,OAAO,iBAAiB,SAAS,UAAU,UAC5C,iBAAiB,SAAS,YAAO,MAAK,gBAC3C,CACJ,GACA,gBAAAF,QAAA,cAACC,OAAA,EAAI,YAAY,GAAG,OAAO,MACtB,iBAAiB,SACd,gBAAAD,QAAA;AAAA,MAACG;AAAA,MAAA;AAAA,QACG,OAAO;AAAA,QACP,UAAU;AAAA,QACV,aAAY;AAAA;AAAA,IAChB,IAEA,gBAAAH,QAAA,cAACE,QAAA,EAAK,UAAU,CAAC,UAAS,UAAU,SAAU,CAEtD,CACJ;AAAA,IAEA,gBAAAF,QAAA,cAACC,OAAA,EAAI,cAAc,GAAG,eAAc,YAChC,gBAAAD,QAAA,cAACC,OAAA,EAAI,cAAc,KACf,gBAAAD,QAAA,cAACE,QAAA,EAAK,OAAO,iBAAiB,OAAO,UAAU,UAC1C,iBAAiB,OAAO,YAAO,MAAK,cACzC,CACJ,GACA,gBAAAF,QAAA,cAACC,OAAA,EAAI,YAAY,GAAG,OAAO,MACtB,iBAAiB,OACd,gBAAAD,QAAA;AAAA,MAACG;AAAA,MAAA;AAAA,QACG,OAAO;AAAA,QACP,UAAU;AAAA,QACV,aAAY;AAAA;AAAA,IAChB,IAEA,gBAAAH,QAAA,cAACE,QAAA,EAAK,UAAU,CAAC,QAAO,QAAQ,SAAU,CAElD,CACJ;AAAA,IAEA,gBAAAF,QAAA,cAACC,OAAA,EAAI,cAAc,KACf,gBAAAD,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAC,0DAEf,CACJ;AAAA,IAEA,gBAAAF,QAAA,cAACC,OAAA,EAAI,WAAW,KACZ,gBAAAD,QAAA;AAAA,MAACE;AAAA,MAAA;AAAA,QACG,MAAI;AAAA,QACJ,iBAAiB,iBAAiB,YAAY,UAAU;AAAA,QACxD,OAAO,iBAAiB,YAAY,UAAU;AAAA;AAAA,MAE7C,iBAAiB,YAAY,YAAO;AAAA,MAAK;AAAA,IAE9C,CACJ;AAAA,EACJ,GAEC,SACG,gBAAAF,QAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACG,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,UAAU;AAAA,MACV,UAAU;AAAA,MACV,cAAc;AAAA;AAAA,IAEd,gBAAAD,QAAA,cAACE,QAAA,EAAK,OAAM,SAAM,kBAAU,KAAM;AAAA,EACtC,GAGH,UACG,gBAAAF,QAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACG,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,UAAU;AAAA,MACV,UAAU;AAAA;AAAA,IAEV,gBAAAD,QAAA,cAACC,OAAA,EAAI,cAAc,KACf,gBAAAD,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAM,WAAQ,gBAEzB,GACC,UACG,gBAAAF,QAAA,cAACC,OAAA,EAAI,YAAY,KACb,gBAAAD,QAAA,cAACE,QAAA,EAAK,OAAM,WAAQ,6BAAsB,CAC9C,CAER;AAAA,IAEA,gBAAAF,QAAA,cAACC,OAAA,EAAI,eAAc,YACf,gBAAAD,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAC,UAAO,MAAO,GAC7B,gBAAAF,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAC,QAAK,IAAK,GACzB,gBAAAF,QAAA,cAACC,OAAA,EAAI,WAAW,KACZ,gBAAAD,QAAA,cAACE,QAAA,EAAK,MAAK,UAAQ,MAAO,CAC9B,CACJ;AAAA,EACJ,GAGJ,gBAAAF,QAAA,cAACC,OAAA,EAAI,WAAW,GAAG,aAAY,UAAS,aAAY,QAAO,UAAU,KACjE,gBAAAD,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAC,kDAEf,CACJ,CACJ;AAER;;;AC7MA,OAAOE,WAAS,YAAAC,kBAAgB;AAChC,SAAS,OAAAC,OAAK,QAAAC,QAAM,YAAAC,kBAAgB;AACpC,OAAOC,iBAAe;AAGtB,IAAM,UAAU,CAAC,OAAO,QAAQ,OAAO,SAAS,QAAQ;AAEjD,IAAM,WAAqB,MAAM;AACpC,QAAM,CAAC,KAAK,MAAM,IAAIC,WAAS,EAAE;AACjC,QAAM,CAAC,QAAQ,SAAS,IAAIA,WAAiB,KAAK;AAClD,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAS,EAAE;AACzC,QAAM,CAAC,MAAM,OAAO,IAAIA,WAAS,EAAE;AACnC,QAAM,CAAC,UAAU,WAAW,IAAIA,WAA8B,IAAI;AAClE,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAS,EAAE;AACrC,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAS,KAAK;AAC5C,QAAM,CAAC,cAAc,eAAe,IAAIA,WAAyD,KAAK;AACtG,QAAM,CAAC,QAAQ,SAAS,IAAIA,WAAS,KAAK;AAE1C,QAAM,UAAU,IAAI,aAAa;AAEjC,EAAAC,WAAS,CAACC,QAAO,QAAQ;AACrB,QAAI,QAAS;AAEb,QAAI,IAAI,KAAK;AACT,YAAM,SAAgC,CAAC,OAAO,UAAU,WAAW,QAAQ,MAAM;AACjF,YAAM,eAAe,OAAO,QAAQ,YAAY;AAChD,sBAAgB,QAAQ,eAAe,KAAK,OAAO,MAAM,CAAC;AAAA,IAC9D,WAAW,IAAI,aAAa,iBAAiB,UAAU;AACnD,YAAM,eAAe,QAAQ,QAAQ,MAAM;AAC3C,gBAAU,QAAQ,eAAe,IAAI,eAAe,IAAI,QAAQ,SAAS,CAAC,CAAC;AAAA,IAC/E,WAAW,IAAI,cAAc,iBAAiB,UAAU;AACpD,YAAM,eAAe,QAAQ,QAAQ,MAAM;AAC3C,gBAAU,SAAS,eAAe,KAAK,QAAQ,MAAM,CAAC;AAAA,IAC1D,WAAW,IAAI,UAAU,iBAAiB,QAAQ;AAC9C,iBAAW;AAAA,IACf,WAAWA,WAAU,OAAO,UAAU;AAClC,iBAAW;AAAA,IACf;AAAA,EACJ,CAAC;AAED,QAAM,aAAa,YAAY;AAC3B,QAAI,CAAC,KAAK;AACN,eAAS,oBAAoB;AAC7B;AAAA,IACJ;AAEA,QAAI;AACA,eAAS,EAAE;AACX,iBAAW,IAAI;AAEf,YAAM,aAAqC,CAAC;AAC5C,UAAI,SAAS;AACT,cAAM,cAAc,QAAQ,MAAM,IAAI;AACtC,mBAAW,QAAQ,aAAa;AAC5B,gBAAM,CAAC,KAAK,GAAG,UAAU,IAAI,KAAK,MAAM,GAAG;AAC3C,cAAI,OAAO,WAAW,SAAS,GAAG;AAC9B,uBAAW,IAAI,KAAK,CAAC,IAAI,WAAW,KAAK,GAAG,EAAE,KAAK;AAAA,UACvD;AAAA,QACJ;AAAA,MACJ;AAEA,YAAM,SAAS,MAAM,QAAQ,YAAY,KAAK;AAAA,QAC1C;AAAA,QACA,SAAS;AAAA,QACT,MAAM,QAAQ;AAAA,MAClB,CAAC;AAED,kBAAY,MAAM;AAClB,gBAAU,KAAK;AAAA,IACnB,SAAS,KAAK;AACV,eAAS,eAAe,QAAQ,IAAI,UAAU,gBAAgB;AAC9D,kBAAY,IAAI;AAAA,IACpB,UAAE;AACE,iBAAW,KAAK;AAAA,IACpB;AAAA,EACJ;AAEA,QAAM,aAAa,YAAY;AAC3B,QAAI,CAAC,SAAU;AACf,QAAI;AACA,YAAM,EAAE,SAAS,WAAW,IAAI,MAAM,OAAO,YAAY;AACzD,YAAM,WAAW,OAAO,SAAS,SAAS,WACpC,SAAS,OACT,KAAK,UAAU,SAAS,MAAM,MAAM,CAAC;AAC3C,YAAM,WAAW,MAAM,QAAQ;AAC/B,gBAAU,IAAI;AACd,iBAAW,MAAM,UAAU,KAAK,GAAG,GAAI;AAAA,IAC3C,SAASC,QAAO;AAAA,IAEhB;AAAA,EACJ;AAEA,SACI,gBAAAC,QAAA,cAACC,OAAA,EAAI,eAAc,YACf,gBAAAD,QAAA,cAACC,OAAA,EAAI,cAAc,KACf,gBAAAD,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAM,UAAO,wBAExB,CACJ,GAEA,gBAAAF,QAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACG,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,UAAU;AAAA,MACV,UAAU;AAAA,MACV,cAAc;AAAA;AAAA,IAEd,gBAAAD,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAM,UAAS,cAAc,KAAG,UAE3C;AAAA,IAEA,gBAAAF,QAAA,cAACC,OAAA,EAAI,cAAc,GAAG,eAAc,YAChC,gBAAAD,QAAA,cAACC,OAAA,EAAI,cAAc,KACf,gBAAAD,QAAA,cAACE,QAAA,EAAK,OAAO,iBAAiB,QAAQ,UAAU,UAC3C,iBAAiB,QAAQ,YAAO,MAAK,MAC1C,CACJ,GACA,gBAAAF,QAAA,cAACC,OAAA,EAAI,YAAY,GAAG,OAAO,MACtB,iBAAiB,QACd,gBAAAD,QAAA;AAAA,MAACG;AAAA,MAAA;AAAA,QACG,OAAO;AAAA,QACP,UAAU;AAAA,QACV,aAAY;AAAA;AAAA,IAChB,IAEA,gBAAAH,QAAA,cAACE,QAAA,EAAK,UAAU,CAAC,OAAM,OAAO,SAAU,CAEhD,CACJ;AAAA,IAEA,gBAAAF,QAAA,cAACC,OAAA,EAAI,cAAc,KACf,gBAAAD,QAAA,cAACC,OAAA,EAAI,OAAO,MACR,gBAAAD,QAAA,cAACE,QAAA,EAAK,OAAO,iBAAiB,WAAW,UAAU,UAC9C,iBAAiB,WAAW,YAAO,MAAK,SAC7C,CACJ,GACA,gBAAAF,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAO,iBAAiB,WAAW,WAAW,UACpD,MACL,GACC,iBAAiB,YACd,gBAAAF,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAC,4BAAgB,CAEvC;AAAA,IAEA,gBAAAF,QAAA,cAACC,OAAA,EAAI,cAAc,GAAG,eAAc,YAChC,gBAAAD,QAAA,cAACC,OAAA,EAAI,cAAc,KACf,gBAAAD,QAAA,cAACE,QAAA,EAAK,OAAO,iBAAiB,YAAY,UAAU,UAC/C,iBAAiB,YAAY,YAAO,MAAK,qCAC9C,CACJ,GACA,gBAAAF,QAAA,cAACC,OAAA,EAAI,YAAY,GAAG,OAAO,MACtB,iBAAiB,YACd,gBAAAD,QAAA;AAAA,MAACG;AAAA,MAAA;AAAA,QACG,OAAO;AAAA,QACP,UAAU;AAAA,QACV,aAAY;AAAA;AAAA,IAChB,IAEA,gBAAAH,QAAA,cAACE,QAAA,EAAK,UAAU,CAAC,WAAU,WAAW,QAAS,CAEvD,CACJ;AAAA,KAEE,WAAW,UAAU,WAAW,SAAS,WAAW,YAClD,gBAAAF,QAAA,cAACC,OAAA,EAAI,cAAc,GAAG,eAAc,YAChC,gBAAAD,QAAA,cAACC,OAAA,EAAI,cAAc,KACf,gBAAAD,QAAA,cAACE,QAAA,EAAK,OAAO,iBAAiB,SAAS,UAAU,UAC5C,iBAAiB,SAAS,YAAO,MAAK,cAC3C,CACJ,GACA,gBAAAF,QAAA,cAACC,OAAA,EAAI,YAAY,GAAG,OAAO,MACtB,iBAAiB,SACd,gBAAAD,QAAA;AAAA,MAACG;AAAA,MAAA;AAAA,QACG,OAAO;AAAA,QACP,UAAU;AAAA,QACV,aAAY;AAAA;AAAA,IAChB,IAEA,gBAAAH,QAAA,cAACE,QAAA,EAAK,UAAU,CAAC,QAAO,QAAQ,SAAU,CAElD,CACJ;AAAA,IAGJ,gBAAAF,QAAA,cAACC,OAAA,EAAI,WAAW,KACZ,gBAAAD,QAAA;AAAA,MAACE;AAAA,MAAA;AAAA,QACG,MAAI;AAAA,QACJ,iBAAiB,iBAAiB,SAAS,UAAU;AAAA,QACrD,OAAO,iBAAiB,SAAS,UAAU;AAAA;AAAA,MAE1C,iBAAiB,SAAS,YAAO;AAAA,MAAK;AAAA,MACpC,UAAU,eAAe;AAAA,MAAe;AAAA,IAC/C,CACJ;AAAA,EACJ,GAEC,SACG,gBAAAF,QAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACG,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,UAAU;AAAA,MACV,UAAU;AAAA,MACV,cAAc;AAAA;AAAA,IAEd,gBAAAD,QAAA,cAACE,QAAA,EAAK,OAAM,SAAM,kBAAU,KAAM;AAAA,EACtC,GAGH,YACG,gBAAAF,QAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACG,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,UAAU;AAAA,MACV,UAAU;AAAA;AAAA,IAEV,gBAAAD,QAAA,cAACC,OAAA,EAAI,cAAc,KACf,gBAAAD,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAM,WAAQ,kBAEzB,GACC,UACG,gBAAAF,QAAA,cAACC,OAAA,EAAI,YAAY,KACb,gBAAAD,QAAA,cAACE,QAAA,EAAK,OAAM,WAAQ,kCAA2B,CACnD,CAER;AAAA,IAEA,gBAAAF,QAAA,cAACC,OAAA,EAAI,eAAc,YACf,gBAAAD,QAAA,cAACE,QAAA,MAAK,YACM,gBAAAF,QAAA,cAACE,QAAA,EAAK,OAAO,SAAS,SAAS,MAAM,UAAU,SAAQ,SAAS,MAAO,CACnF,GACA,gBAAAF,QAAA,cAACE,QAAA,MAAK,UAAO,SAAS,MAAK,IAAE,GAC7B,gBAAAF,QAAA,cAACE,QAAA,MAAK,UAAO,SAAS,IAAK,GAC3B,gBAAAF,QAAA,cAACE,QAAA,MAAK,GAAC,GAEP,gBAAAF,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAM,YAAS,UAAQ,GACjC,OAAO,QAAQ,SAAS,OAAO,EAAE,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAC1D,gBAAAF,QAAA,cAACE,QAAA,EAAK,KAAU,UAAQ,QAAC,MAAG,KAAI,MAAG,KAAM,CAC5C,GACD,gBAAAF,QAAA,cAACE,QAAA,MAAK,GAAC,GAEP,gBAAAF,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAM,YAAS,OAAK,GAC/B,gBAAAF,QAAA,cAACE,QAAA,MACI,OAAO,SAAS,SAAS,WACpB,SAAS,KAAK,MAAM,GAAG,GAAG,IAC1B,KAAK,UAAU,SAAS,MAAM,MAAM,CAAC,EAAE,MAAM,GAAG,GAAG,CAC7D,CACJ;AAAA,EACJ,GAGJ,gBAAAF,QAAA,cAACC,OAAA,EAAI,WAAW,GAAG,aAAY,UAAS,aAAY,QAAO,UAAU,KACjE,gBAAAD,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAC,mFAEf,CACJ,CACJ;AAER;;;ACpQA,OAAOE,WAAS,YAAAC,kBAAgB;AAChC,SAAS,OAAAC,OAAK,QAAAC,QAAM,YAAAC,kBAAgB;AACpC,OAAOC,iBAAe;AACtB,YAAYC,UAAQ;AACpB,YAAYC,WAAU;AAEf,IAAM,eAAyB,MAAM;AACxC,QAAM,CAAC,UAAU,WAAW,IAAIN,WAAS,EAAE;AAC3C,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAS,EAAE;AACzC,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAS,EAAE;AACrC,QAAM,CAAC,cAAc,eAAe,IAAIA,WAA6B,MAAM;AAE3E,EAAAG,WAAS,CAACI,QAAO,QAAQ;AACrB,QAAI,IAAI,KAAK;AACT,sBAAgB,iBAAiB,SAAS,YAAY,MAAM;AAAA,IAChE,WAAW,IAAI,QAAQ;AAEnB,oBAAc;AAAA,IAClB;AAAA,EACJ,CAAC;AAED,QAAM,gBAAgB,YAAY;AAC9B,QAAI,CAAC,UAAU;AACX,eAAS,0BAA0B;AACnC;AAAA,IACJ;AAEA,QAAI;AACA,eAAS,EAAE;AAEX,YAAM,eAAoB,cAAQ,QAAQ;AAC1C,UAAI,CAAI,gBAAW,YAAY,GAAG;AAC9B,iBAAS,mBAAmB,YAAY,EAAE;AAC1C;AAAA,MACJ;AAEA,UAAI,cAAiB,kBAAa,cAAc,OAAO;AAGvD,oBAAc,YAAY,QAAQ,8BAA8B,CAAC,OAAO,SAAS;AAC7E,eAAO;AAAA;AAAA;AAAA;AAAA,EAAuC,KAAK,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,MAC7D,CAAC;AAGD,YAAM,EAAE,QAAAC,QAAO,IAAI,MAAM,OAAO,QAAQ;AACxC,YAAM,EAAE,SAAS,eAAe,IAAI,MAAM,OAAO,iBAAiB;AAGlE,MAAAA,QAAO,IAAI,eAAe,CAAQ;AAGlC,YAAM,WAAWA,QAAO,WAAW;AACnC,iBAAW,QAAQ;AAAA,IACvB,SAAS,KAAK;AACV,eAAS,eAAe,QAAQ,IAAI,UAAU,wBAAwB;AACtE,iBAAW,EAAE;AAAA,IACjB;AAAA,EACJ;AAEA,SACI,gBAAAT,QAAA,cAACE,OAAA,EAAI,eAAc,YACf,gBAAAF,QAAA,cAACE,OAAA,EAAI,cAAc,KACf,gBAAAF,QAAA,cAACG,QAAA,EAAK,MAAI,MAAC,OAAM,UAAO,4BAExB,CACJ,GAEA,gBAAAH,QAAA;AAAA,IAACE;AAAA,IAAA;AAAA,MACG,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,UAAU;AAAA,MACV,UAAU;AAAA,MACV,cAAc;AAAA;AAAA,IAEd,gBAAAF,QAAA,cAACG,QAAA,EAAK,MAAI,MAAC,OAAM,UAAS,cAAc,KAAG,UAE3C;AAAA,IAEA,gBAAAH,QAAA,cAACE,OAAA,EAAI,cAAc,GAAG,eAAc,YAChC,gBAAAF,QAAA,cAACE,OAAA,EAAI,cAAc,KACf,gBAAAF,QAAA,cAACG,QAAA,EAAK,OAAO,iBAAiB,SAAS,UAAU,UAC5C,iBAAiB,SAAS,YAAO,MAAK,YAC3C,CACJ,GACA,gBAAAH,QAAA,cAACE,OAAA,EAAI,YAAY,GAAG,OAAO,MACtB,iBAAiB,SACd,gBAAAF,QAAA;AAAA,MAACK;AAAA,MAAA;AAAA,QACG,OAAO;AAAA,QACP,UAAU;AAAA,QACV,aAAY;AAAA;AAAA,IAChB,IAEA,gBAAAL,QAAA,cAACG,QAAA,EAAK,UAAU,CAAC,YAAW,YAAY,SAAU,CAE1D,CACJ;AAAA,IAEA,gBAAAH,QAAA,cAACE,OAAA,EAAI,WAAW,KACZ,gBAAAF,QAAA;AAAA,MAACG;AAAA,MAAA;AAAA,QACG,MAAI;AAAA,QACJ,iBAAiB,iBAAiB,YAAY,UAAU;AAAA,QACxD,OAAO,iBAAiB,YAAY,UAAU;AAAA;AAAA,MAE7C,iBAAiB,YAAY,YAAO;AAAA,MAAK;AAAA,IAE9C,CACJ;AAAA,EACJ,GAEC,SACG,gBAAAH,QAAA;AAAA,IAACE;AAAA,IAAA;AAAA,MACG,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,UAAU;AAAA,MACV,UAAU;AAAA,MACV,cAAc;AAAA;AAAA,IAEd,gBAAAF,QAAA,cAACG,QAAA,EAAK,OAAM,SAAM,kBAAU,KAAM;AAAA,EACtC,GAGH,WACG,gBAAAH,QAAA;AAAA,IAACE;AAAA,IAAA;AAAA,MACG,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,UAAU;AAAA,MACV,UAAU;AAAA;AAAA,IAEV,gBAAAF,QAAA,cAACE,OAAA,EAAI,cAAc,KACf,gBAAAF,QAAA,cAACG,QAAA,EAAK,MAAI,MAAC,OAAM,WAAQ,iBAEzB,CACJ;AAAA,IAEA,gBAAAH,QAAA,cAACE,OAAA,EAAI,eAAc,YACf,gBAAAF,QAAA,cAACG,QAAA,MAAM,OAAQ,CACnB;AAAA,EACJ,GAGJ,gBAAAH,QAAA,cAACE,OAAA,EAAI,WAAW,GAAG,aAAY,UAAS,aAAY,QAAO,UAAU,KACjE,gBAAAF,QAAA,cAACG,QAAA,EAAK,UAAQ,QAAC,wCAEf,CACJ,CACJ;AAER;;;AXlHA,IAAMO,cAAyB;AAAA,EAC3B,EAAE,IAAI,YAAY,MAAM,aAAM,OAAO,YAAY,aAAa,4BAA4B;AAAA,EAC1F,EAAE,IAAI,QAAQ,MAAM,aAAM,OAAO,QAAQ,aAAa,mBAAmB;AAAA,EACzE,EAAE,IAAI,QAAQ,MAAM,aAAM,OAAO,QAAQ,aAAa,2BAA2B;AAAA,EACjF,EAAE,IAAI,iBAAiB,MAAM,aAAM,OAAO,iBAAiB,aAAa,mBAAmB;AAAA,EAC3F,EAAE,IAAI,iBAAiB,MAAM,aAAM,OAAO,iBAAiB,aAAa,gBAAgB;AAAA,EACxF,EAAE,IAAI,QAAQ,MAAM,aAAM,OAAO,gBAAgB,aAAa,qBAAqB;AAAA,EACnF,EAAE,IAAI,OAAO,MAAM,aAAM,OAAO,OAAO,aAAa,oBAAoB;AAAA,EACxE,EAAE,IAAI,aAAa,MAAM,aAAM,OAAO,aAAa,aAAa,qBAAqB;AAAA,EACrF,EAAE,IAAI,YAAY,MAAM,aAAM,OAAO,YAAY,aAAa,oBAAoB;AAAA,EAClF,EAAE,IAAI,cAAc,MAAM,aAAM,OAAO,cAAc,aAAa,cAAc;AAAA,EAChF,EAAE,IAAI,cAAc,MAAM,aAAM,OAAO,cAAc,aAAa,cAAc;AAAA,EAChF,EAAE,IAAI,QAAQ,MAAM,UAAK,OAAO,eAAe,aAAa,yBAAyB;AAAA,EACrF,EAAE,IAAI,YAAY,MAAM,aAAM,OAAO,YAAY,aAAa,mBAAmB;AACrF;AAMO,IAAM,WAAoC,CAAC,EAAE,OAAO,MAAM;AAC7D,QAAM,CAAC,eAAe,gBAAgB,IAAIC,WAAS,CAAC;AACpD,QAAM,CAAC,YAAY,aAAa,IAAIA,WAA6B,IAAI;AACrE,QAAM,EAAE,KAAK,IAAIC,QAAO;AAExB,EAAAC,WAAS,CAACC,QAAO,QAAQ;AACrB,QAAI,YAAY;AAEZ,UAAI,IAAI,QAAQ;AACZ,sBAAc,IAAI;AAAA,MACtB;AACA;AAAA,IACJ;AAGA,QAAI,IAAI,WAAWA,WAAU,KAAK;AAC9B,uBAAiB,CAAC,SAAU,OAAO,IAAI,OAAO,IAAIJ,YAAW,SAAS,CAAE;AAAA,IAC5E,WAAW,IAAI,aAAaI,WAAU,KAAK;AACvC,uBAAiB,CAAC,SAAU,OAAOJ,YAAW,SAAS,IAAI,OAAO,IAAI,CAAE;AAAA,IAC5E,WAAW,IAAI,QAAQ;AACnB,oBAAcA,YAAW,aAAa,EAAE,EAAE;AAAA,IAC9C,WAAYI,WAAU,OAAO,IAAI,QAAS,IAAI,QAAQ;AAClD,aAAO;AACP,WAAK;AAAA,IACT;AAAA,EACJ,CAAC;AAED,SACI,gBAAAC,QAAA,cAACC,OAAA,EAAI,eAAc,UAAS,OAAM,QAAO,QAAO,UAE5C,gBAAAD,QAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACG,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,UAAU;AAAA,MACV,UAAU;AAAA,MACV,cAAc;AAAA;AAAA,IAEd,gBAAAD,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAM,UAAO,yDAExB;AAAA,IACA,gBAAAF,QAAA,cAACC,OAAA,EAAI,YAAW,UACZ,gBAAAD,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAC,sBAAoB,CACvC;AAAA,EACJ,GAGA,gBAAAF,QAAA,cAACC,OAAA,EAAI,UAAU,KAEX,gBAAAD,QAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACG,eAAc;AAAA,MACd,OAAO;AAAA,MACP,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,UAAU;AAAA,MACV,UAAU;AAAA,MACV,aAAa;AAAA;AAAA,IAEb,gBAAAD,QAAA,cAACC,OAAA,EAAI,cAAc,KACf,gBAAAD,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAM,YAAS,iBAE1B,CACJ;AAAA,IAECP,YAAW,IAAI,CAAC,MAAM,UACnB,gBAAAK,QAAA,cAACC,OAAA,EAAI,KAAK,KAAK,IAAI,cAAc,KAC7B,gBAAAD,QAAA;AAAA,MAACE;AAAA,MAAA;AAAA,QACG,OAAO,kBAAkB,SAAS,CAAC,aAAa,UAAU;AAAA,QAC1D,MAAM,kBAAkB,SAAS,CAAC;AAAA,QAClC,UAAU,eAAe,QAAQ,eAAe,KAAK;AAAA;AAAA,MAEpD,kBAAkB,SAAS,CAAC,aAAa,YAAO;AAAA,MAChD,KAAK;AAAA,MAAK;AAAA,MAAE,KAAK;AAAA,IACtB,CACJ,CACH;AAAA,IAED,gBAAAF,QAAA,cAACC,OAAA,EAAI,WAAW,GAAG,aAAY,UAAS,aAAY,QAAO,UAAU,KACjE,gBAAAD,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAC,2BACG,MAAK,iBACL,MAAK,gBAEvB,CACJ;AAAA,EACJ,GAGA,gBAAAF,QAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACG,eAAc;AAAA,MACd,UAAU;AAAA,MACV,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,UAAU;AAAA,MACV,UAAU;AAAA;AAAA,IAET,aACG,gBAAAD,QAAA,cAAC,qBAAkB,aAAa,YAAY,IAE5C,gBAAAA,QAAA,cAAC,eAAY,cAAcL,YAAW,aAAa,GAAG;AAAA,EAE9D,CACJ,GAGA,gBAAAK,QAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACG,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,UAAU;AAAA,MACV,WAAW;AAAA;AAAA,IAEX,gBAAAD,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAC,8CAEf;AAAA,EACJ,CACJ;AAER;AAGA,IAAM,cAAoD,CAAC,EAAE,aAAa,MAAM;AAC5E,SACI,gBAAAF,QAAA,cAACC,OAAA,EAAI,eAAc,YACf,gBAAAD,QAAA,cAACC,OAAA,EAAI,cAAc,KACf,gBAAAD,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAM,UAAO,gCAExB,CACJ,GAEA,gBAAAF,QAAA,cAACC,OAAA,EAAI,cAAc,KACf,gBAAAD,QAAA,cAACE,QAAA,MAAK,qDAEN,CACJ,GAEA,gBAAAF,QAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACG,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,UAAU;AAAA,MACV,UAAU;AAAA,MACV,cAAc;AAAA;AAAA,IAEd,gBAAAD,QAAA,cAACC,OAAA,EAAI,eAAc,YACf,gBAAAD,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAM,YACZ,aAAa,MAAK,KAAE,aAAa,KACtC,GACA,gBAAAF,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAE,aAAa,WAAY,CAC7C;AAAA,EACJ,GAEA,gBAAAF,QAAA,cAACC,OAAA,EAAI,cAAc,KACf,gBAAAD,QAAA,cAACE,QAAA,EAAK,MAAI,QAAC,gBAAc,CAC7B,GAEA,gBAAAF,QAAA,cAACC,OAAA,EAAI,eAAc,UAAS,YAAY,KACpC,gBAAAD,QAAA,cAACE,QAAA,MAAK,iBAAQ,gBAAAF,QAAA,cAACE,QAAA,EAAK,OAAM,WAAQ,OAAK,GAAO,2BAAyB,GACvE,gBAAAF,QAAA,cAACE,QAAA,MAAK,eAAM,gBAAAF,QAAA,cAACE,QAAA,EAAK,OAAM,WAAQ,eAAG,GAAO,QAAI,gBAAAF,QAAA,cAACE,QAAA,EAAK,OAAM,WAAQ,KAAG,GAAO,cAAY,GACxF,gBAAAF,QAAA,cAACE,QAAA,MAAK,iBAAQ,gBAAAF,QAAA,cAACE,QAAA,EAAK,OAAM,WAAQ,KAAG,GAAO,qBAAmB,GAC/D,gBAAAF,QAAA,cAACE,QAAA,MAAK,iBAAQ,gBAAAF,QAAA,cAACE,QAAA,EAAK,OAAM,WAAQ,QAAM,GAAO,kBAAgB,CACnE,GAEA,gBAAAF,QAAA,cAACC,OAAA,EAAI,WAAW,KACZ,gBAAAD,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAC,+EAEf,CACJ,CACJ;AAER;AAGA,IAAM,oBAA4D,CAAC,EAAE,YAAY,MAAM;AACnF,UAAQ,aAAa;AAAA,IACjB,KAAK;AACD,aAAO,gBAAAF,QAAA,cAAC,kBAAa;AAAA,IACzB,KAAK;AACD,aAAO,gBAAAA,QAAA,cAAC,cAAS;AAAA,IACrB,KAAK;AACD,aAAO,gBAAAA,QAAA,cAAC,cAAS;AAAA,IACrB,KAAK;AAAA,IACL,KAAK;AACD,aAAO,gBAAAA,QAAA,cAAC,gBAAW;AAAA,IACvB,KAAK;AAAA,IACL,KAAK;AACD,aAAO,gBAAAA,QAAA,cAAC,aAAQ;AAAA,IACpB,KAAK;AACD,aAAO,gBAAAA,QAAA,cAAC,kBAAa;AAAA,IACzB,KAAK;AACD,aAAO,gBAAAA,QAAA,cAAC,aAAQ;AAAA,IACpB,KAAK;AACD,aAAO,gBAAAA,QAAA,cAAC,cAAS;AAAA,IACrB,KAAK;AACD,aAAO,gBAAAA,QAAA,cAAC,kBAAa;AAAA,IACzB,KAAK;AACD,aAAO,gBAAAA,QAAA,cAAC,cAAS;AAAA,IACrB,KAAK;AACD,aAAO,gBAAAA,QAAA,cAAC,kBAAa;AAAA,IACzB;AACI,aAAO,gBAAAA,QAAA,cAAC,mBAAgB,aAA0B;AAAA,EAC1D;AACJ;AAGA,IAAM,kBAA0D,CAAC,EAAE,YAAY,MAAM;AACjF,QAAM,OAAOL,YAAW,KAAK,CAAC,MAAM,EAAE,OAAO,WAAW;AAExD,SACI,gBAAAK,QAAA,cAACC,OAAA,EAAI,eAAc,YACf,gBAAAD,QAAA,cAACC,OAAA,EAAI,cAAc,KACf,gBAAAD,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAM,UACZ,MAAM,MAAK,KAAE,MAAM,KACxB,CACJ,GAEA,gBAAAF,QAAA,cAACC,OAAA,EAAI,aAAY,UAAS,aAAY,UAAS,UAAU,GAAG,UAAU,KAClE,gBAAAD,QAAA,cAACE,QAAA,MAAK,sDAC0C,MAC3C,MAAK,0CACiC,MACvC,gBAAAF,QAAA,cAACE,QAAA,EAAK,OAAM,WAAQ,iBAAc,aAAY,SAAO,GACpD,MACA,MAAK,UACA,gBAAAF,QAAA,cAACE,QAAA,EAAK,OAAM,YAAS,KAAG,GAAO,yBACzC,CACJ,CACJ;AAER;;;ADrRA,eAAsB,qBAAoC;AACtD,SAAO,IAAI,QAAQ,CAACC,aAAY;AAC5B,UAAM,EAAE,SAAS,cAAc,IAAIC;AAAA,MAC/BC,QAAM,cAAc,UAAU;AAAA,QAC1B,QAAQ,MAAM;AACV,kBAAQ;AACR,UAAAF,SAAQ;AAAA,QACZ;AAAA,MACJ,CAAC;AAAA,IACL;AAGA,kBAAc,EAAE,KAAK,MAAM;AACvB,MAAAA,SAAQ;AAAA,IACZ,CAAC;AAAA,EACL,CAAC;AACL;;;AfHA,SAAS,gBAAsB;AAC3B,UAAQ,IAAIG,QAAM,KAAK,KAAK,6BAAiB,IAAIA,QAAM,IAAI,wBAAwB,CAAC;AACpF,UAAQ,IAAI;AACZ,UAAQ,IAAIA,QAAM,KAAK,mCAAmB,CAAC;AAC3C,UAAQ,IAAI,KAAKA,QAAM,KAAK,UAAU,CAAC,yDAAkC;AACzE,UAAQ,IAAI,KAAKA,QAAM,KAAK,MAAM,CAAC,+BAA0B;AAC7D,UAAQ,IAAI,KAAKA,QAAM,KAAK,MAAM,CAAC,yCAAyC;AAC5E,UAAQ,IAAI,KAAKA,QAAM,KAAK,KAAK,CAAC,wCAAwC;AAC1E,UAAQ,IAAI;AACZ,UAAQ,IAAIA,QAAM,KAAK,WAAW,CAAC;AACnC,UAAQ,IAAI,KAAKA,QAAM,KAAK,eAAe,CAAC,wBAAwB;AACpE,UAAQ,IAAI,KAAKA,QAAM,KAAK,eAAe,CAAC,2BAAsB;AAClE,UAAQ,IAAI,KAAKA,QAAM,KAAK,YAAY,CAAC,8BAA8B;AACvE,UAAQ,IAAI,KAAKA,QAAM,KAAK,YAAY,CAAC,8BAA8B;AACvE,UAAQ,IAAI;AACZ,UAAQ,IAAIA,QAAM,KAAK,iBAAY,CAAC;AACpC,UAAQ,IAAI,KAAKA,QAAM,KAAK,WAAW,CAAC,kDAAmC;AAC3E,UAAQ,IAAI,KAAKA,QAAM,KAAK,UAAU,CAAC,oDAA6B;AACpE,UAAQ,IAAI,KAAKA,QAAM,KAAK,MAAM,CAAC,qCAAqC;AACxE,UAAQ,IAAI;AACZ,UAAQ,IAAIA,QAAM,KAAK,UAAO,CAAC;AAC/B,UAAQ,IAAI,KAAKA,QAAM,KAAK,MAAM,CAAC,qCAAgC;AACnE,UAAQ,IAAI,KAAKA,QAAM,KAAK,kBAAkB,CAAC,oCAA0B;AACzE,UAAQ,IAAI;AACZ,UAAQ,IAAIA,QAAM,KAAK,oCAAqB,CAAC;AAC7C,UAAQ,IAAIA,QAAM,IAAI,mBAAmB,CAAC;AAC1C,UAAQ,IAAIA,QAAM,IAAI,8BAA8B,CAAC;AACrD,UAAQ,IAAI;AACZ,UAAQ,IAAIA,QAAM,KAAK,gBAAQ,CAAC;AAChC,UAAQ,IAAIA,QAAM,IAAI,qCAAqC,CAAC;AAC5D,UAAQ,IAAIA,QAAM,IAAI,+BAA+B,CAAC;AACtD,UAAQ,IAAIA,QAAM,IAAI,+CAA+C,CAAC;AACtE,UAAQ,IAAIA,QAAM,IAAI,6CAA6C,CAAC;AACpE,UAAQ,IAAI;AACZ,UAAQ,IAAIA,QAAM,IAAI,0EAAiD,CAAC;AAC5E;AAKO,SAAS,qBAA8B;AAC1C,QAAM,eAAe,IAAIC,UAAQ,OAAO,EACnC,YAAY,sCAAsC,EAClD,OAAO,qBAAqB,yBAAyB;AAG1D,eAAa,WAAW,sBAAsB,CAAC;AAC/C,eAAa,WAAW,kBAAkB,CAAC;AAC3C,eAAa,WAAW,kBAAkB,CAAC;AAC3C,eAAa,WAAW,0BAA0B,CAAC;AACnD,eAAa,WAAW,0BAA0B,CAAC;AACnD,eAAa,WAAW,kBAAkB,CAAC;AAC3C,eAAa,WAAW,iBAAiB,CAAC;AAC1C,eAAa,WAAW,sBAAsB,CAAC;AAC/C,eAAa,WAAW,sBAAsB,CAAC;AAC/C,eAAa,WAAW,uBAAuB,CAAC;AAChD,eAAa,WAAW,uBAAuB,CAAC;AAChD,eAAa,WAAW,kBAAkB,CAAC;AAC3C,eAAa,WAAW,6BAA6B,CAAC;AAGtD,eAAa,OAAO,OAAO,YAAY;AACnC,QAAI,QAAQ,aAAa;AACrB,YAAM,mBAAmB;AAAA,IAC7B,OAAO;AACH,oBAAc;AAAA,IAClB;AAAA,EACJ,CAAC;AAED,SAAO;AACX;;;A4BvFA,SAAS,WAAAC,iBAAe;AACxB,OAAOC,aAAW;;;ACDlB,SAAS,WAAAC,iBAAe;AACxB,OAAOC,aAAW;AAClB,OAAOC,YAAW;AAClB,OAAO,SAAS;;;ACHhB,YAAYC,UAAQ;AACpB,YAAYC,WAAU;AAGf,IAAM,sBAAN,MAA0B;AAAA;AAAA;AAAA;AAAA,EAI7B,MAAM,eAAe,KAAyC;AAC1D,UAAM,WAA8B,CAAC;AAGrC,QAAI,MAAM,KAAK,WAAW,KAAK,cAAc,GAAG;AAC5C,YAAM,UAAU,MAAM,KAAK,yBAAyB,GAAG;AACvD,eAAS,KAAK;AAAA,QACV,WAAW;AAAA,QACX;AAAA,QACA,YAAY;AAAA,MAChB,CAAC;AAAA,IACL;AAGA,QAAI,MAAM,KAAK,WAAW,KAAK,eAAe,KAAK,MAAM,KAAK,WAAW,KAAK,eAAe,GAAG;AAC5F,YAAM,YAAY,MAAM,KAAK,cAAc,GAAG;AAC9C,eAAS,KAAK;AAAA,QACV,WAAW;AAAA,QACX,SAAS;AAAA,QACT;AAAA,QACA,YAAY;AAAA,MAChB,CAAC;AAAA,IACL;AAGA,QAAI,MAAM,KAAK,WAAW,KAAK,SAAS,GAAG;AACvC,eAAS,KAAK;AAAA,QACV,WAAW;AAAA,QACX,SAAS;AAAA,QACT,YAAY;AAAA,MAChB,CAAC;AAAA,IACL,WAAW,MAAM,KAAK,WAAW,KAAK,kBAAkB,GAAG;AACvD,eAAS,KAAK;AAAA,QACV,WAAW;AAAA,QACX,SAAS;AAAA,QACT,YAAY;AAAA,MAChB,CAAC;AAAA,IACL;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,yBAAyB,KAAsC;AAEzE,QAAI,MAAM,KAAK,WAAW,KAAK,gBAAgB,GAAG;AAC9C,aAAO;AAAA,IACX;AACA,QAAI,MAAM,KAAK,WAAW,KAAK,WAAW,GAAG;AACzC,aAAO;AAAA,IACX;AACA,QAAI,MAAM,KAAK,WAAW,KAAK,WAAW,GAAG;AACzC,aAAO;AAAA,IACX;AACA,QAAI,MAAM,KAAK,WAAW,KAAK,mBAAmB,GAAG;AACjD,aAAO;AAAA,IACX;AAGA,UAAM,YAAY,QAAQ,IAAI,yBAAyB;AACvD,QAAI,UAAU,SAAS,MAAM,EAAG,QAAO;AACvC,QAAI,UAAU,SAAS,MAAM,EAAG,QAAO;AACvC,QAAI,UAAU,SAAS,KAAK,EAAG,QAAO;AAGtC,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,cAAc,KAA+B;AACvD,QAAI;AACA,YAAM,eAAoB,WAAK,KAAK,eAAe;AACnD,YAAM,UAAU,MAAS,cAAS,cAAc,OAAO;AACvD,YAAM,eAAe,KAAK,MAAM,OAAO;AAEvC,YAAM,OAAO;AAAA,QACT,GAAG,aAAa;AAAA,QAChB,GAAG,aAAa,aAAa;AAAA,MACjC;AAEA,aAAO,uBAAuB;AAAA,IAClC,QAAQ;AACJ,aAAO;AAAA,IACX;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,WAAW,KAAa,UAAoC;AACtE,QAAI;AACA,YAAS,YAAY,WAAK,KAAK,QAAQ,CAAC;AACxC,aAAO;AAAA,IACX,QAAQ;AACJ,aAAO;AAAA,IACX;AAAA,EACJ;AACJ;;;AC9GA,SAAS,YAAYC,YAAU;AAC/B,OAAOC,WAAU;AACjB,SAAS,gBAAgB;AACzB,OAAOC,aAAY;AAiBZ,IAAM,cAAN,MAAkD;AAAA,EAC5C,YAAY;AAAA,EACb,eAAoC,oBAAI,IAAI;AAAA,EAEpD,MAAM,MAAM,KAAa,YAA+E;AACpG,UAAM,UAAU,MAAM,KAAK,gBAAgB,GAAG;AAC9C,UAAM,UAAU,MAAM,KAAK,qBAAqB,GAAG;AACnD,UAAM,WAA0E,CAAC;AAEjF,QAAI,QAAQ,cAAc;AACtB,iBAAW,CAAC,MAAM,OAAO,KAAK,OAAO,QAAQ,QAAQ,YAAY,GAAG;AAChE,YAAI,KAAK,qBAAqB,OAAO,GAAG;AACpC,mBAAS,KAAK,EAAE,MAAM,SAAS,SAAS,MAAM,MAAM,CAAC;AAAA,QACzD;AAAA,MACJ;AAAA,IACJ;AAEA,QAAI,QAAQ,iBAAiB;AACzB,iBAAW,CAAC,MAAM,OAAO,KAAK,OAAO,QAAQ,QAAQ,eAAe,GAAG;AACnE,YAAI,KAAK,qBAAqB,OAAO,GAAG;AACpC,mBAAS,KAAK,EAAE,MAAM,SAAS,SAAS,MAAM,MAAM,CAAC;AAAA,QACzD;AAAA,MACJ;AAAA,IACJ;AAEA,UAAM,qBAAqB,MAAM,KAAK,kBAAkB,UAAU,UAAU;AAC5E,WAAO,EAAE,WAAW,KAAK,WAAW,SAAS,UAAU,mBAAmB;AAAA,EAC9E;AAAA,EAEA,MAAM,QAAQ,KAAa,SAAwC;AAC/D,UAAM,UAAU,MAAM,KAAK,qBAAqB,GAAG;AACnD,UAAM,WAAW,KAAK,qBAAqB,QAAQ,UAAU,OAAO;AACpE,QAAI,SAAS,KAAM,MAAK,eAAe,SAAS,IAAI;AACpD,QAAI,SAAS,QAAS,MAAK,eAAe,SAAS,OAAO;AAAA,EAC9D;AAAA,EAEA,MAAM,gBAAgB,KAAmC;AACrD,UAAM,UAAUD,MAAK,KAAK,KAAK,cAAc;AAC7C,QAAI;AACA,YAAM,UAAU,MAAMD,KAAG,SAAS,SAAS,OAAO;AAClD,aAAO,KAAK,MAAM,OAAO;AAAA,IAC7B,SAAS,OAAO;AACZ,UAAK,MAAgC,SAAS,UAAU;AACpD,cAAM,IAAI,MAAM,mFAAoD;AAAA,MACxE;AACA,YAAM,IAAI,MAAM,wCAA0B,MAAgB,OAAO,EAAE;AAAA,IACvE;AAAA,EACJ;AAAA,EAEA,MAAM,mBAAmB,aAA6C;AAClE,QAAI,KAAK,aAAa,IAAI,WAAW,GAAG;AACpC,aAAO,KAAK,aAAa,IAAI,WAAW;AAAA,IAC5C;AAEA,QAAI;AACA,YAAM,WAAW,MAAM;AAAA,QACnB,8BAA8B,mBAAmB,WAAW,CAAC;AAAA,QAC7D,EAAE,QAAQ,YAAY,QAAQ,GAAK,EAAE;AAAA,MACzC;AAEA,UAAI,CAAC,SAAS,GAAI,QAAO;AACzB,YAAM,OAAO,MAAM,SAAS,KAAK;AACjC,WAAK,aAAa,IAAI,aAAa,KAAK,OAAO;AAC/C,aAAO,KAAK;AAAA,IAChB,QAAQ;AACJ,aAAO;AAAA,IACX;AAAA,EACJ;AAAA,EAEA,MAAM,kBACF,UACA,YACsB;AACtB,UAAM,QAAQE,QAAO,EAAE;AACvB,UAAM,QAAQ,SAAS;AACvB,QAAI,YAAY;AAEhB,UAAM,UAAU,MAAM,QAAQ;AAAA,MAC1B,SAAS,IAAI,SAAO,MAAM,YAAY;AAClC,cAAM,SAAS,MAAM,KAAK,mBAAmB,IAAI,IAAI;AACrD;AACA,qBAAa,WAAW,KAAK;AAE7B,YAAI,CAAC,OAAQ,QAAO;AACpB,cAAM,eAAe,KAAK,kBAAkB,IAAI,OAAO;AACvD,cAAM,aAAa,KAAK,eAAe,QAAQ,YAAY;AAC3D,cAAM,cAAc,KAAK,eAAe,cAAc,MAAM;AAE5D,eAAO;AAAA,UACH,MAAM,IAAI;AAAA,UACV,SAAS,IAAI;AAAA,UACb;AAAA,UACA,kBAAkB,KAAK,qBAAqB,IAAI,SAAS,MAAM;AAAA,UAC/D,MAAM,IAAI;AAAA,UACV;AAAA,UACA;AAAA,QACJ;AAAA,MACJ,CAAC,CAAC;AAAA,IACN;AAEA,WAAO,QAAQ,OAAO,CAAC,MAAwB,MAAM,QAAQ,EAAE,UAAU;AAAA,EAC7E;AAAA,EAEQ,qBAAqB,SAA0B;AACnD,UAAM,kBAAkB,CAAC,QAAQ,QAAQ,SAAS,SAAS,YAAY;AACvE,WAAO,CAAC,gBAAgB,KAAK,YAAU,QAAQ,WAAW,MAAM,CAAC;AAAA,EACrE;AAAA,EAEQ,eAAe,SAAiB,QAA6B;AACjE,UAAM,eAAe,QAAQ,MAAM,GAAG,EAAE,IAAI,MAAM;AAClD,UAAM,cAAc,OAAO,MAAM,GAAG,EAAE,IAAI,MAAM;AAChD,SAAK,YAAY,CAAC,KAAK,MAAM,aAAa,CAAC,KAAK,GAAI,QAAO;AAC3D,SAAK,YAAY,CAAC,KAAK,MAAM,aAAa,CAAC,KAAK,GAAI,QAAO;AAC3D,WAAO;AAAA,EACX;AAAA,EAEA,kBAAkB,SAAyB;AACvC,WAAO,QAAQ,QAAQ,aAAa,EAAE;AAAA,EAC1C;AAAA,EAEA,qBAAqB,SAAiB,QAAwB;AAC1D,UAAM,QAAQ,QAAQ,MAAM,aAAa;AACzC,UAAM,SAAS,QAAQ,CAAC,KAAK;AAC7B,WAAO,SAAS;AAAA,EACpB;AAAA,EAEA,eAAe,QAAgB,OAAwB;AACnD,UAAM,cAAc,OAAO,MAAM,GAAG,EAAE,IAAI,MAAM;AAChD,UAAM,aAAa,MAAM,MAAM,GAAG,EAAE,IAAI,MAAM;AAE9C,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AACxB,YAAM,IAAI,YAAY,CAAC,KAAK;AAC5B,YAAM,IAAI,WAAW,CAAC,KAAK;AAC3B,UAAI,IAAI,EAAG,QAAO;AAClB,UAAI,IAAI,EAAG,QAAO;AAAA,IACtB;AACA,WAAO;AAAA,EACX;AAAA,EAEA,MAAM,qBAAqB,KAAsC;AAC7D,UAAM,YAAyD;AAAA,MAC3D,EAAE,MAAM,kBAAkB,IAAI,OAAO;AAAA,MACrC,EAAE,MAAM,aAAa,IAAI,OAAO;AAAA,MAChC,EAAE,MAAM,aAAa,IAAI,MAAM;AAAA,MAC/B,EAAE,MAAM,qBAAqB,IAAI,MAAM;AAAA,IAC3C;AAEA,eAAW,EAAE,MAAM,GAAG,KAAK,WAAW;AAClC,UAAI;AACA,cAAMF,KAAG,OAAOC,MAAK,KAAK,KAAK,IAAI,CAAC;AACpC,eAAO;AAAA,MACX,QAAQ;AAAA,MAAC;AAAA,IACb;AAEA,UAAM,YAAY,QAAQ,IAAI,yBAAyB;AACvD,QAAI,UAAU,SAAS,MAAM,EAAG,QAAO;AACvC,QAAI,UAAU,SAAS,MAAM,EAAG,QAAO;AACvC,QAAI,UAAU,SAAS,KAAK,EAAG,QAAO;AACtC,QAAI,KAAK,mBAAmB,MAAM,EAAG,QAAO;AAC5C,WAAO;AAAA,EACX;AAAA,EAEQ,mBAAmB,SAA0B;AACjD,QAAI;AACA,eAAS,GAAG,OAAO,cAAc,EAAE,OAAO,CAAC,QAAQ,QAAQ,MAAM,EAAE,CAAC;AACpE,aAAO;AAAA,IACX,QAAQ;AACJ,aAAO;AAAA,IACX;AAAA,EACJ;AAAA,EAEA,mBAAmB,UAA0E;AACzF,UAAM,KAAK,QAAQ,IAAI,uBAAuB,SAAS,MAAM,IAAI,SAAS;AAC1E,WAAO,KAAK,qBAAqB,UAAU,EAAoB;AAAA,EACnE;AAAA,EAEQ,qBAAqB,UAAyB,IAAqE;AACvH,UAAM,OAAO,SAAS,OAAO,OAAK,EAAE,SAAS,KAAK;AAClD,UAAM,UAAU,SAAS,OAAO,OAAK,EAAE,SAAS,KAAK;AAErD,UAAM,iBAAiB,CAAC,SAAwB,KAAK,IAAI,OAAK,GAAG,EAAE,IAAI,IAAI,EAAE,gBAAgB,EAAE,EAAE,KAAK,GAAG;AAEzG,QAAI,UAAyB;AAC7B,QAAI,aAA4B;AAEhC,QAAI,KAAK,SAAS,GAAG;AACjB,YAAM,UAAU,eAAe,IAAI;AACnC,cAAQ,IAAI;AAAA,QACR,KAAK;AAAQ,oBAAU,YAAY,OAAO;AAAI;AAAA,QAC9C,KAAK;AAAQ,oBAAU,YAAY,OAAO;AAAI;AAAA,QAC9C,KAAK;AAAO,oBAAU,WAAW,OAAO;AAAI;AAAA,QAC5C;AAAS,oBAAU,eAAe,OAAO;AAAA,MAC7C;AAAA,IACJ;AAEA,QAAI,QAAQ,SAAS,GAAG;AACpB,YAAM,UAAU,eAAe,OAAO;AACtC,cAAQ,IAAI;AAAA,QACR,KAAK;AAAQ,uBAAa,eAAe,OAAO;AAAI;AAAA,QACpD,KAAK;AAAQ,uBAAa,eAAe,OAAO;AAAI;AAAA,QACpD,KAAK;AAAO,uBAAa,cAAc,OAAO;AAAI;AAAA,QAClD;AAAS,uBAAa,kBAAkB,OAAO;AAAA,MACnD;AAAA,IACJ;AAEA,WAAO,EAAE,MAAM,SAAS,SAAS,WAAW;AAAA,EAChD;AAAA,EAEA,eAAe,SAAuB;AAClC,aAAS,SAAS,EAAE,OAAO,WAAW,KAAK,EAAE,GAAG,QAAQ,KAAK,aAAa,IAAI,EAAE,CAAC;AAAA,EACrF;AACJ;;;ACvOA,SAAS,YAAAE,iBAAgB;AACzB,SAAS,YAAYC,YAAU;AAC/B,OAAOC,YAAU;AA2BjB,IAAM,6BAA6B;AAE5B,IAAM,iBAAN,MAAqD;AAAA,EAC/C,YAAY;AAAA,EACb,YAAY;AAAA,EAEpB,MAAM,MAAM,KAAa,YAA+E;AACpG,SAAK,YAAY,MAAM,KAAK,cAAc,GAAG;AAC7C,UAAM,WAAW,MAAM,KAAK,sBAAsB,GAAG;AACrD,UAAM,eAAe,MAAM,KAAK,iBAAiB,GAAG;AAEpD,UAAM,WAA0B,CAAC;AACjC,QAAI,YAAY;AAEhB,eAAW,OAAO,UAAU;AACxB,YAAM,QAAQ,IAAI,SAAS,aAAa,aAAa,KAAK,CAAC;AAC3D,YAAM,cAAc,KAAK,eAAe,IAAI,SAAS,IAAI,MAAM;AAC/D,YAAM,aAAa,KAAK,kBAAkB,IAAI,MAAM,WAAW;AAC/D,YAAM,gBAAgB,CAAC,aAAa,kCAAkC;AAEtE,eAAS,KAAK;AAAA,QACV,MAAM,IAAI;AAAA,QACV,SAAS,IAAI;AAAA,QACb,QAAQ,IAAI;AAAA,QACZ,kBAAkB,IAAI;AAAA,QACtB,MAAM,QAAQ,QAAQ;AAAA,QACtB;AAAA,QACA;AAAA,QACA;AAAA,MACJ,CAAC;AAED;AACA,mBAAa,WAAW,SAAS,MAAM;AAAA,IAC3C;AAEA,WAAO;AAAA,MACH,WAAW,KAAK;AAAA,MAChB,SAAS;AAAA,MACT,UAAU,SAAS,OAAO,OAAK,EAAE,UAAU;AAAA,MAC3C,WAAW,KAAK;AAAA,IACpB;AAAA,EACJ;AAAA,EAEA,MAAM,QAAQ,KAAa,SAAwC;AAC/D,UAAM,WAAW,KAAK,mBAAmB,QAAQ,QAAQ;AACzD,QAAI,SAAS,KAAM,MAAK,eAAe,SAAS,MAAM,GAAG;AACzD,QAAI,SAAS,QAAS,MAAK,eAAe,SAAS,SAAS,GAAG;AAAA,EACnE;AAAA,EAEA,mBAAmB,UAA0E;AACzF,UAAM,OAAO,SAAS,OAAO,OAAK,EAAE,SAAS,KAAK;AAClD,UAAM,UAAU,SAAS,OAAO,OAAK,EAAE,SAAS,KAAK;AAErD,QAAI,UAAyB;AAC7B,QAAI,aAA4B;AAEhC,QAAI,KAAK,SAAS,GAAG;AACjB,YAAM,UAAU,KAAK,IAAI,OAAK,GAAG,EAAE,IAAI,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,GAAG;AAC/D,gBAAU,uBAAuB,OAAO;AAAA,IAC5C;AAEA,QAAI,QAAQ,SAAS,GAAG;AACpB,YAAM,UAAU,QAAQ,IAAI,OAAK,GAAG,EAAE,IAAI,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,GAAG;AAClE,mBAAa,6BAA6B,OAAO;AAAA,IACrD;AAEA,WAAO,EAAE,MAAM,SAAS,SAAS,WAAW;AAAA,EAChD;AAAA,EAEA,MAAc,iBAAiB,KAAoC;AAC/D,UAAM,eAAeA,OAAK,KAAK,KAAK,eAAe;AACnD,QAAI;AACA,YAAM,UAAU,MAAMD,KAAG,SAAS,cAAc,OAAO;AACvD,aAAO,KAAK,MAAM,OAAO;AAAA,IAC7B,SAAS,OAAO;AACZ,UAAK,MAAgC,SAAS,UAAU;AACpD,cAAM,IAAI,MAAM,oFAAqD;AAAA,MACzE;AACA,YAAM,IAAI,MAAM,yCAA2B,MAAgB,OAAO,EAAE;AAAA,IACxE;AAAA,EACJ;AAAA,EAEA,MAAc,cAAc,KAA+B;AACvD,QAAI;AACA,YAAM,eAAe,MAAM,KAAK,iBAAiB,GAAG;AACpD,YAAM,OAAO,EAAE,GAAG,aAAa,SAAS,GAAG,aAAa,aAAa,EAAE;AACvE,aAAO,uBAAuB;AAAA,IAClC,QAAQ;AACJ,aAAO;AAAA,IACX;AAAA,EACJ;AAAA,EAEA,MAAc,sBAAsB,KAAiD;AACjF,QAAI;AACA,YAAM,SAASD,UAAS,4CAA4C;AAAA,QAChE;AAAA,QACA,UAAU;AAAA,QACV,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,MAClC,CAAC;AACD,YAAM,SAAS,KAAK,MAAM,MAAM;AAChC,aAAO,OAAO,aAAa,CAAC;AAAA,IAChC,SAAS,OAAO;AACZ,UAAK,MAAc,QAAQ;AACvB,YAAI;AACA,gBAAM,SAAS,KAAK,MAAO,MAAc,MAAM;AAC/C,iBAAO,OAAO,aAAa,CAAC;AAAA,QAChC,QAAQ;AAAA,QAAC;AAAA,MACb;AACA,YAAM,IAAI,MAAM,6CAAoC,MAAgB,OAAO,EAAE;AAAA,IACjF;AAAA,EACJ;AAAA,EAEQ,eAAe,SAAiB,QAA6B;AACjE,UAAM,eAAe,QAAQ,MAAM,GAAG,EAAE,IAAI,MAAM;AAClD,UAAM,cAAc,OAAO,MAAM,GAAG,EAAE,IAAI,MAAM;AAChD,SAAK,YAAY,CAAC,KAAK,MAAM,aAAa,CAAC,KAAK,GAAI,QAAO;AAC3D,SAAK,YAAY,CAAC,KAAK,MAAM,aAAa,CAAC,KAAK,GAAI,QAAO;AAC3D,WAAO;AAAA,EACX;AAAA,EAEQ,kBAAkB,aAAqB,aAAmC;AAC9E,QAAI,KAAK,aAAa,2BAA2B,KAAK,WAAW,KAAK,gBAAgB,SAAS;AAC3F,aAAO;AAAA,IACX;AACA,WAAO;AAAA,EACX;AAAA,EAEQ,eAAe,SAAiB,KAAmB;AACvD,IAAAA,UAAS,SAAS;AAAA,MACd;AAAA,MACA,OAAO;AAAA,MACP,KAAK,EAAE,GAAG,QAAQ,KAAK,aAAa,IAAI;AAAA,IAC5C,CAAC;AAAA,EACL;AACJ;;;ACnKA,SAAS,YAAAG,iBAAgB;AACzB,SAAS,YAAYC,YAAU;AAC/B,OAAOC,YAAU;AACjB,OAAOC,aAAY;AAcZ,IAAM,oBAAN,MAAwD;AAAA,EAClD,YAAY;AAAA,EACb,eAAoC,oBAAI,IAAI;AAAA,EAEpD,MAAM,MAAM,KAAa,YAA+E;AACpG,UAAM,UAAU,MAAM,KAAK,qBAAqB,GAAG;AACnD,QAAI;AAEJ,QAAI,YAAY,UAAU;AACtB,iBAAW,MAAM,KAAK,YAAY,KAAK,UAAU;AAAA,IACrD,OAAO;AACH,iBAAW,MAAM,KAAK,SAAS,KAAK,UAAU;AAAA,IAClD;AAEA,WAAO,EAAE,WAAW,KAAK,WAAW,SAAS,SAAS;AAAA,EAC1D;AAAA,EAEA,MAAM,QAAQ,KAAa,SAAwC;AAC/D,UAAM,UAAU,MAAM,KAAK,qBAAqB,GAAG;AACnD,UAAM,WAAW,KAAK,mBAAmB,QAAQ,QAAQ;AAEzD,QAAI,YAAY,UAAU;AACtB,UAAI,SAAS,QAAQ,SAAS,SAAS;AACnC,cAAM,cAAc,QAAQ,SAAS,IAAI,OAAK,EAAE,IAAI,EAAE,KAAK,GAAG;AAC9D,aAAK,eAAe,iBAAiB,WAAW,IAAI,GAAG;AAAA,MAC3D;AAAA,IACJ,OAAO;AACH,UAAI,SAAS,KAAM,MAAK,eAAe,SAAS,MAAM,GAAG;AACzD,UAAI,SAAS,QAAS,MAAK,eAAe,SAAS,SAAS,GAAG;AAAA,IACnE;AAAA,EACJ;AAAA,EAEA,mBAAmB,UAA0E;AACzF,UAAM,OAAO,SAAS,OAAO,OAAK,EAAE,SAAS,KAAK;AAClD,UAAM,UAAU,SAAS,OAAO,OAAK,EAAE,SAAS,KAAK;AAErD,QAAI,UAAyB;AAC7B,QAAI,aAA4B;AAEhC,QAAI,KAAK,SAAS,GAAG;AACjB,YAAM,UAAU,KAAK,IAAI,OAAK,GAAG,EAAE,IAAI,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,GAAG;AAChE,gBAAU,yBAAyB,OAAO;AAAA,IAC9C;AAEA,QAAI,QAAQ,SAAS,GAAG;AACpB,YAAM,UAAU,QAAQ,IAAI,OAAK,GAAG,EAAE,IAAI,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,GAAG;AACnE,mBAAa,yBAAyB,OAAO;AAAA,IACjD;AAEA,WAAO,EAAE,MAAM,SAAS,SAAS,WAAW;AAAA,EAChD;AAAA,EAEA,MAAc,qBAAqB,KAAsC;AACrE,QAAI,MAAM,KAAK,WAAW,KAAK,SAAS,EAAG,QAAO;AAClD,WAAO;AAAA,EACX;AAAA,EAEA,MAAc,SAAS,KAAa,YAAiF;AACjH,UAAM,mBAAmBD,OAAK,KAAK,KAAK,kBAAkB;AAC1D,QAAI;AACA,YAAM,UAAU,MAAMD,KAAG,SAAS,kBAAkB,OAAO;AAC3D,YAAM,WAAW,KAAK,qBAAqB,OAAO;AAClD,aAAO,MAAM,KAAK,kBAAkB,UAAU,UAAU;AAAA,IAC5D,SAAS,OAAO;AACZ,UAAK,MAAgC,SAAS,UAAU;AACpD,cAAM,IAAI,MAAM,uFAAwD;AAAA,MAC5E;AACA,YAAM,IAAI,MAAM,4CAA8B,MAAgB,OAAO,EAAE;AAAA,IAC3E;AAAA,EACJ;AAAA,EAEA,MAAc,YAAY,KAAa,YAAiF;AACpH,QAAI;AACA,YAAM,SAASD,UAAS,gDAAgD;AAAA,QACpE;AAAA,QAAK,UAAU;AAAA,QAAS,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,MAC1D,CAAC;AAED,YAAM,WAAW,KAAK,MAAM,MAAM;AAClC,YAAM,QAAQ,SAAS;AACvB,UAAI,YAAY;AAEhB,YAAM,WAA0B,SAAS,IAAI,SAAO;AAChD;AACA,qBAAa,WAAW,KAAK;AAC7B,eAAO;AAAA,UACH,MAAM,IAAI;AAAA,UACV,SAAS,IAAI;AAAA,UACb,QAAQ,IAAI;AAAA,UACZ,kBAAkB,IAAI;AAAA,UACtB,MAAM;AAAA,UACN,aAAa,KAAK,eAAe,IAAI,SAAS,IAAI,cAAc;AAAA,UAChE,YAAY;AAAA,QAChB;AAAA,MACJ,CAAC;AAED,aAAO;AAAA,IACX,SAAS,OAAO;AACZ,YAAM,IAAI,MAAM,2CAAkC,MAAgB,OAAO,EAAE;AAAA,IAC/E;AAAA,EACJ;AAAA,EAEQ,qBAAqB,SAAgF;AACzG,UAAM,WAA0E,CAAC;AACjF,UAAM,QAAQ,QAAQ,MAAM,IAAI;AAEhC,eAAW,QAAQ,OAAO;AACtB,YAAM,UAAU,KAAK,KAAK;AAC1B,UAAI,CAAC,WAAW,QAAQ,WAAW,GAAG,EAAG;AAEzC,YAAM,QAAQ,QAAQ,MAAM,2CAA2C;AACvE,UAAI,OAAO;AACP,cAAM,CAAC,EAAE,MAAM,EAAE,OAAO,IAAI;AAC5B,iBAAS,KAAK,EAAE,MAAM,KAAK,YAAY,GAAG,SAAS,SAAS,MAAM,MAAM,CAAC;AAAA,MAC7E;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAAA,EAEA,MAAc,kBACV,UACA,YACsB;AACtB,UAAM,QAAQG,QAAO,EAAE;AACvB,UAAM,QAAQ,SAAS;AACvB,QAAI,YAAY;AAEhB,UAAM,UAAU,MAAM,QAAQ;AAAA,MAC1B,SAAS,IAAI,SAAO,MAAM,YAAY;AAClC,cAAM,SAAS,MAAM,KAAK,mBAAmB,IAAI,IAAI;AACrD;AACA,qBAAa,WAAW,KAAK;AAE7B,YAAI,CAAC,OAAQ,QAAO;AACpB,cAAM,aAAa,KAAK,eAAe,QAAQ,IAAI,OAAO;AAC1D,YAAI,CAAC,WAAY,QAAO;AAExB,eAAO;AAAA,UACH,MAAM,IAAI;AAAA,UACV,SAAS,IAAI;AAAA,UACb;AAAA,UACA,kBAAkB;AAAA,UAClB,MAAM,IAAI;AAAA,UACV,aAAa,KAAK,eAAe,IAAI,SAAS,MAAM;AAAA,UACpD,YAAY;AAAA,QAChB;AAAA,MACJ,CAAC,CAAC;AAAA,IACN;AAEA,WAAO,QAAQ,OAAO,CAAC,MAAwB,MAAM,IAAI;AAAA,EAC7D;AAAA,EAEA,MAAc,mBAAmB,aAA6C;AAC1E,QAAI,KAAK,aAAa,IAAI,WAAW,EAAG,QAAO,KAAK,aAAa,IAAI,WAAW;AAEhF,QAAI;AACA,YAAM,WAAW,MAAM;AAAA,QACnB,yBAAyB,mBAAmB,WAAW,CAAC;AAAA,QACxD,EAAE,QAAQ,YAAY,QAAQ,GAAK,EAAE;AAAA,MACzC;AAEA,UAAI,CAAC,SAAS,GAAI,QAAO;AACzB,YAAM,OAAO,MAAM,SAAS,KAAK;AACjC,WAAK,aAAa,IAAI,aAAa,KAAK,KAAK,OAAO;AACpD,aAAO,KAAK,KAAK;AAAA,IACrB,QAAQ;AACJ,aAAO;AAAA,IACX;AAAA,EACJ;AAAA,EAEQ,eAAe,SAAiB,QAA6B;AACjE,UAAM,eAAe,QAAQ,MAAM,GAAG,EAAE,IAAI,MAAM;AAClD,UAAM,cAAc,OAAO,MAAM,GAAG,EAAE,IAAI,MAAM;AAChD,SAAK,YAAY,CAAC,KAAK,MAAM,aAAa,CAAC,KAAK,GAAI,QAAO;AAC3D,SAAK,YAAY,CAAC,KAAK,MAAM,aAAa,CAAC,KAAK,GAAI,QAAO;AAC3D,WAAO;AAAA,EACX;AAAA,EAEQ,eAAe,QAAgB,OAAwB;AAC3D,UAAM,cAAc,OAAO,MAAM,GAAG,EAAE,IAAI,MAAM;AAChD,UAAM,aAAa,MAAM,MAAM,GAAG,EAAE,IAAI,MAAM;AAE9C,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AACxB,YAAM,IAAI,YAAY,CAAC,KAAK;AAC5B,YAAM,IAAI,WAAW,CAAC,KAAK;AAC3B,UAAI,IAAI,EAAG,QAAO;AAClB,UAAI,IAAI,EAAG,QAAO;AAAA,IACtB;AAEA,WAAO;AAAA,EACX;AAAA,EAEA,MAAc,WAAW,KAAa,UAAoC;AACtE,QAAI;AACA,YAAMF,KAAG,OAAOC,OAAK,KAAK,KAAK,QAAQ,CAAC;AACxC,aAAO;AAAA,IACX,QAAQ;AACJ,aAAO;AAAA,IACX;AAAA,EACJ;AAAA,EAEQ,eAAe,SAAiB,KAAmB;AACvD,IAAAF,UAAS,SAAS,EAAE,KAAK,OAAO,WAAW,KAAK,EAAE,GAAG,QAAQ,KAAK,aAAa,IAAI,EAAE,CAAC;AAAA,EAC1F;AACJ;;;AJlNO,SAAS,yBAAkC;AAC9C,QAAM,eAAe,IAAII,UAAQ,OAAO,EACnC,YAAY,gDAAmC,EAC/C,OAAO,YAAY;AAChB,UAAM,MAAM,QAAQ,IAAI;AACxB,UAAM,WAAW,IAAI,oBAAoB;AAGzC,UAAM,UAAU,IAAI,kDAAgC,EAAE,MAAM;AAC5D,UAAM,WAAW,MAAM,SAAS,eAAe,GAAG;AAElD,QAAI,SAAS,WAAW,GAAG;AACvB,cAAQ,KAAK,+EAAwC;AACrD,cAAQ,IAAI;AACZ,cAAQ,IAAIC,QAAM,IAAI,kGAAwF,CAAC;AAC/G,cAAQ,KAAK,CAAC;AAAA,IAClB;AAEA,YAAQ,QAAQ,qBAAa,SAAS,MAAM,WAAW;AACvD,eAAW,WAAW,UAAU;AAC5B,YAAM,OAAO,QAAQ,cAAc,SAAS,cAAO,QAAQ,cAAc,QAAQ,cAAO;AACxF,YAAM,QAAQ,QAAQ,cAAc,SAAS,YAChC,QAAQ,cAAc,QAAQ,iBAAiB;AAC5D,cAAQ,IAAI,MAAM,IAAI,IAAI,KAAK,KAAK,QAAQ,OAAO,GAAG;AAAA,IAC1D;AACA,YAAQ,IAAI;AAGZ,eAAW,WAAW,UAAU;AAC5B,YAAM,eAAe,QAAQ,WAAW,QAAQ,SAAS,GAAG;AAAA,IAChE;AAEA,YAAQ,IAAI;AACZ,YAAQ,IAAIA,QAAM,IAAI,iFAAmD,CAAC;AAAA,EAC9E,CAAC;AAEL,SAAO;AACX;AAEA,eAAe,eACX,WACA,SACA,KACa;AAEb,MAAI;AACJ,MAAI;AACJ,MAAI;AAEJ,UAAQ,WAAW;AAAA,IACf,KAAK;AACD,gBAAU,IAAI,YAAY;AAC1B,aAAO;AACP,cAAQ,YAAY,OAAO;AAC3B;AAAA,IACJ,KAAK;AACD,gBAAU,IAAI,eAAe;AAC7B,aAAO;AACP,cAAQ;AACR;AAAA,IACJ,KAAK;AACD,gBAAU,IAAI,kBAAkB;AAChC,aAAO;AACP,cAAQ,WAAW,OAAO;AAC1B;AAAA,EACR;AAGA,QAAM,UAAU,IAAI,2BAAiB,KAAK,KAAK,EAAE,MAAM;AAEvD,MAAI;AACJ,MAAI;AACA,aAAS,MAAM,QAAQ,MAAM,KAAK,CAAC,WAAW,UAAU;AACpD,cAAQ,OAAO,2BAAiB,KAAK,QAAQ,SAAS,IAAI,KAAK;AAAA,IACnE,CAAC;AAAA,EACL,SAAS,OAAO;AACZ,YAAQ,KAAK,0BAAgB,KAAK,EAAE;AACpC,YAAQ,IAAIA,QAAM,IAAK,MAAgB,OAAO,CAAC;AAC/C,YAAQ,IAAI;AACZ;AAAA,EACJ;AAEA,MAAI,OAAO,SAAS,WAAW,GAAG;AAC9B,YAAQ,QAAQ,GAAG,KAAK,4DAAgC;AACxD,YAAQ,IAAI;AACZ;AAAA,EACJ;AAEA,UAAQ,QAAQ,GAAG,KAAK,MAAM,OAAO,SAAS,MAAM,2CAA2B;AAC/E,UAAQ,IAAI;AAGZ,QAAM,QAAQ,IAAIC,OAAM;AAAA,IACpB,MAAM;AAAA,MACFD,QAAM,KAAK,SAAS;AAAA,MACpBA,QAAM,KAAK,oBAAU;AAAA,MACrBA,QAAM,KAAK,oBAAU;AAAA,MACrBA,QAAM,KAAK,WAAM;AAAA,IACrB;AAAA,IACA,OAAO;AAAA,MACH,MAAM,CAAC;AAAA,MACP,QAAQ,CAAC,KAAK;AAAA,IAClB;AAAA,EACJ,CAAC;AAED,aAAW,OAAO,OAAO,UAAU;AAC/B,UAAM,cAAc,IAAI,gBAAgB,UAAU,cAC/B,IAAI,gBAAgB,UAAU,cAAO;AAExD,UAAM,KAAK;AAAA,MACP,GAAG,WAAW,IAAI,IAAI,IAAI;AAAA,MAC1BA,QAAM,IAAI,IAAI,OAAO;AAAA,MACrBA,QAAM,MAAM,IAAI,MAAM;AAAA,MACtB,IAAI,SAAS,QAAQA,QAAM,IAAI,KAAK,IAAI;AAAA,IAC5C,CAAC;AAAA,EACL;AAEA,UAAQ,IAAI,MAAM,SAAS,CAAC;AAC5B,UAAQ,IAAI;AAGZ,MAAI,OAAO,WAAW;AAElB,UAAM,kBAAkB,OAAO,SAAS,OAAO,OAAK,EAAE,aAAa;AACnE,QAAI,gBAAgB,SAAS,GAAG;AAC5B,cAAQ,IAAIA,QAAM,OAAO,wEAAyD,CAAC;AACnF,iBAAW,OAAO,iBAAiB;AAC/B,gBAAQ,IAAIA,QAAM,IAAI,QAAQ,IAAI,IAAI,KAAK,IAAI,OAAO,WAAM,IAAI,MAAM,EAAE,CAAC;AAAA,MAC7E;AACA,cAAQ,IAAI;AACZ,cAAQ,IAAIA,QAAM,IAAI,4FAAsD,CAAC;AAC7E,cAAQ,IAAIA,QAAM,IAAI,uBAAuB,gBAAgB,CAAC,EAAE,IAAI,KAAK,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;AACrG,cAAQ,IAAI;AAAA,IAChB;AAAA,EACJ;AACJ;;;AKjJA,SAAS,WAAAE,iBAAe;AACxB,SAAS,YAAAC,WAAU,WAAAC,gBAAe;AAClC,OAAOC,aAAW;AAClB,OAAOC,UAAS;AAChB,OAAOC,YAAW;AAgBX,SAAS,2BAAoC;AAChD,SAAO,IAAIC,UAAQ,SAAS,EACvB,YAAY,oDAAuC,EACnD,OAAO,SAAS,sDAA+B,EAC/C,OAAO,OAAO,YAA4B;AACvC,UAAM,kBAAkB,OAAO;AAAA,EACnC,CAAC;AACT;AAEA,eAAe,kBAAkB,SAAwC;AACrE,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,WAAW,IAAI,oBAAoB;AAEzC,MAAI;AACA,UAAM,UAAUC,KAAI,kDAAgC,EAAE,MAAM;AAC5D,UAAM,WAAW,MAAM,SAAS,eAAe,GAAG;AAElD,QAAI,SAAS,WAAW,GAAG;AACvB,cAAQ,KAAK,+EAAwC;AACrD,cAAQ,IAAI;AACZ,cAAQ,IAAIC,QAAM,IAAI,kGAAwF,CAAC;AAC/G,cAAQ,KAAK,CAAC;AAAA,IAClB;AAEA,YAAQ,QAAQ,qBAAa,SAAS,MAAM,WAAW;AACvD,eAAW,WAAW,UAAU;AAC5B,YAAM,OAAO,iBAAiB,QAAQ,SAAS;AAC/C,YAAM,QAAQ,kBAAkB,QAAQ,SAAS;AACjD,cAAQ,IAAI,MAAM,IAAI,IAAI,KAAK,KAAK,QAAQ,OAAO,GAAG;AAAA,IAC1D;AACA,YAAQ,IAAI;AAGZ,eAAW,WAAW,UAAU;AAC5B,YAAM,iBAAiB,SAAS,KAAK,OAAO;AAAA,IAChD;AAEA,YAAQ,IAAI;AACZ,YAAQ,IAAIA,QAAM,MAAM,0BAAe,CAAC;AAAA,EAC5C,SAAS,OAAO;AACZ,YAAQ,MAAMA,QAAM,IAAI;AAAA,SAAQ,MAAgB,OAAO;AAAA,CAAI,CAAC;AAC5D,YAAQ,KAAK,CAAC;AAAA,EAClB;AACJ;AAEA,eAAe,iBACX,SACA,KACA,SACa;AACb,QAAM,UAAU,WAAW,QAAQ,SAAS;AAC5C,QAAM,QAAQ,GAAG,iBAAiB,QAAQ,SAAS,CAAC,IAAI,kBAAkB,QAAQ,SAAS,CAAC;AAE5F,UAAQ,IAAIA,QAAM,KAAK,KAAK;AAAA,EAAK,SAAI,OAAO,EAAE,CAAC,EAAE,CAAC;AAClD,UAAQ,IAAIA,QAAM,KAAK,KAAK,GAAG,KAAK,EAAE,CAAC;AACvC,UAAQ,IAAIA,QAAM,KAAK,KAAK,SAAI,OAAO,EAAE,CAAC,CAAC;AAC3C,UAAQ,IAAI;AAEZ,QAAM,UAAUD,KAAI,qCAA2B,EAAE,MAAM;AAEvD,MAAI;AACJ,MAAI;AACA,UAAM,SAAS,MAAM,QAAQ,MAAM,KAAK,CAAC,WAAW,UAAU;AAC1D,cAAQ,OAAO,wCAA8B,SAAS,IAAI,KAAK;AAAA,IACnE,CAAC;AACD,eAAW,OAAO;AAAA,EACtB,SAAS,OAAO;AACZ,YAAQ,KAAK,iCAAuB;AACpC,YAAQ,IAAIC,QAAM,IAAK,MAAgB,OAAO,CAAC;AAC/C;AAAA,EACJ;AAEA,MAAI,SAAS,WAAW,GAAG;AACvB,YAAQ,QAAQ,yDAA6B;AAC7C;AAAA,EACJ;AAEA,UAAQ,QAAQ,oBAAY,SAAS,MAAM,2CAA2B;AACtE,UAAQ,IAAI;AAEZ,sBAAoB,QAAQ;AAE5B,MAAI;AAEJ,MAAI,QAAQ,KAAK;AACb,uBAAmB;AACnB,YAAQ,IAAIA,QAAM,KAAK,mDAAqB,iBAAiB,MAAM;AAAA,CAAa,CAAC;AAAA,EACrF,OAAO;AACH,QAAI;AACA,YAAM,WAAW,MAAMC,UAAS;AAAA,QAC5B,SAAS;AAAA,QACT,SAAS,SAAS,IAAI,SAAO;AACzB,gBAAM,OAAO,IAAI,gBAAgB,UAAU,cAC/B,IAAI,gBAAgB,UAAU,cAAO;AACjD,iBAAO;AAAA,YACH,MAAM,GAAG,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,OAAO,WAAM,IAAI,MAAM,MAAM,IAAI,IAAI;AAAA,YACvE,OAAO,IAAI;AAAA,YACX,SAAS;AAAA,UACb;AAAA,QACJ,CAAC;AAAA,QACD,UAAU;AAAA,QACV,OAAO;AAAA,MACX,CAAC;AAED,UAAI,SAAS,WAAW,GAAG;AACvB,gBAAQ,IAAID,QAAM,OAAO,8EAAuC,CAAC;AACjE;AAAA,MACJ;AAEA,yBAAmB,SAAS,OAAO,OAAK,SAAS,SAAS,EAAE,IAAI,CAAC;AAAA,IACrE,QAAQ;AACJ,cAAQ,IAAIA,QAAM,OAAO,uCAAgB,CAAC;AAC1C;AAAA,IACJ;AAAA,EACJ;AAEA,MAAI;AACJ,MAAI;AACA,oBAAgB,MAAME,SAAQ;AAAA,MAC1B,SAAS,6BAAqB,iBAAiB,MAAM;AAAA,MACrD,SAAS;AAAA,IACb,CAAC;AAAA,EACL,QAAQ;AACJ,YAAQ,IAAIF,QAAM,OAAO,uCAAgB,CAAC;AAC1C;AAAA,EACJ;AAEA,MAAI,CAAC,eAAe;AAChB,YAAQ,IAAIA,QAAM,OAAO,6CAAsB,CAAC;AAChD;AAAA,EACJ;AAEA,UAAQ,IAAI;AACZ,UAAQ,IAAIA,QAAM,KAAK,8BAAuB,QAAQ,OAAO,EAAE,CAAC;AAChE,UAAQ,IAAIA,QAAM,KAAK,kCAAsB,CAAC;AAE9C,QAAM,WAAW,QAAQ,mBAAmB,gBAAgB;AAE5D,MAAI;AACA,QAAI,SAAS,MAAM;AACf,cAAQ,IAAIA,QAAM,IAAI,KAAK,SAAS,IAAI;AAAA,CAAI,CAAC;AAAA,IACjD;AACA,QAAI,SAAS,SAAS;AAClB,cAAQ,IAAIA,QAAM,IAAI,KAAK,SAAS,OAAO;AAAA,CAAI,CAAC;AAAA,IACpD;AAEA,UAAM,QAAQ,QAAQ,KAAK,EAAE,UAAU,iBAAiB,CAAC;AAEzD,YAAQ,IAAIA,QAAM,MAAM;AAAA,4BAAkB,iBAAiB,MAAM,6BAAuB,CAAC;AAAA,EAC7F,SAAS,OAAO;AACZ,YAAQ,MAAMA,QAAM,IAAI,gCAAsB,CAAC;AAC/C,YAAQ,MAAMA,QAAM,IAAK,MAAgB,OAAO,CAAC;AAEjD,YAAQ,IAAIA,QAAM,OAAO,wEAAuC,CAAC;AACjE,QAAI,SAAS,KAAM,SAAQ,IAAIA,QAAM,KAAK,MAAM,SAAS,IAAI,EAAE,CAAC;AAChE,QAAI,SAAS,QAAS,SAAQ,IAAIA,QAAM,KAAK,MAAM,SAAS,OAAO,EAAE,CAAC;AACtE,YAAQ,IAAI;AAEZ,UAAM;AAAA,EACV;AACJ;AAEA,SAAS,oBAAoB,UAA+B;AACxD,QAAM,QAAQ,IAAIG,OAAM;AAAA,IACpB,MAAM;AAAA,MACFH,QAAM,KAAK,SAAS;AAAA,MACpBA,QAAM,KAAK,oBAAU;AAAA,MACrBA,QAAM,KAAK,oBAAU;AAAA,MACrBA,QAAM,KAAK,WAAM;AAAA,IACrB;AAAA,IACA,OAAO;AAAA,MACH,MAAM,CAAC;AAAA,MACP,QAAQ,CAAC,KAAK;AAAA,IAClB;AAAA,EACJ,CAAC;AAED,aAAW,OAAO,UAAU;AACxB,UAAM,cAAc,IAAI,gBAAgB,UAAU,cAC/B,IAAI,gBAAgB,UAAU,cAAO;AAExD,UAAM,KAAK;AAAA,MACP,GAAG,WAAW,IAAI,IAAI,IAAI;AAAA,MAC1BA,QAAM,IAAI,IAAI,OAAO;AAAA,MACrBA,QAAM,MAAM,IAAI,MAAM;AAAA,MACtB,IAAI,SAAS,QAAQA,QAAM,IAAI,KAAK,IAAI;AAAA,IAC5C,CAAC;AAAA,EACL;AAEA,UAAQ,IAAI,MAAM,SAAS,CAAC;AAC5B,UAAQ,IAAI;AAChB;AAEA,SAAS,WAAW,WAA4D;AAC5E,UAAQ,WAAW;AAAA,IACf,KAAK;AACD,aAAO,IAAI,YAAY;AAAA,IAC3B,KAAK;AACD,aAAO,IAAI,eAAe;AAAA,IAC9B,KAAK;AACD,aAAO,IAAI,kBAAkB;AAAA,EACrC;AACJ;AAEA,SAAS,iBAAiB,WAA2B;AACjD,UAAQ,WAAW;AAAA,IACf,KAAK;AAAQ,aAAO;AAAA,IACpB,KAAK;AAAO,aAAO;AAAA,IACnB,KAAK;AAAU,aAAO;AAAA,IACtB;AAAS,aAAO;AAAA,EACpB;AACJ;AAEA,SAAS,kBAAkB,WAA2B;AAClD,UAAQ,WAAW;AAAA,IACf,KAAK;AAAQ,aAAO;AAAA,IACpB,KAAK;AAAO,aAAO;AAAA,IACnB,KAAK;AAAU,aAAO;AAAA,IACtB;AAAS,aAAO;AAAA,EACpB;AACJ;;;AN1OA,SAAS,eAAqB;AAC1B,UAAQ,IAAII,QAAM,KAAK,KAAK,qBAAc,IAAIA,QAAM,IAAI,+CAAuC,CAAC;AAChG,UAAQ,IAAI;AACZ,UAAQ,IAAIA,QAAM,KAAK,mBAAW,CAAC;AACnC,UAAQ,IAAI,KAAKA,QAAM,KAAK,OAAO,CAAC,qDAAwC;AAC5E,UAAQ,IAAI,KAAKA,QAAM,KAAK,SAAS,CAAC,8EAAiD;AACvF,UAAQ,IAAI;AACZ,UAAQ,IAAIA,QAAM,KAAK,mBAAS,CAAC;AACjC,UAAQ,IAAIA,QAAM,IAAI,yCAAoC,CAAC;AAC3D,UAAQ,IAAIA,QAAM,IAAI,yEAAqD,CAAC;AAC5E,UAAQ,IAAIA,QAAM,IAAI,+BAA0B,CAAC;AACjD,UAAQ,IAAI;AACZ,UAAQ,IAAIA,QAAM,KAAK,gBAAQ,CAAC;AAChC,UAAQ,IAAIA,QAAM,IAAI,qBAAqB,CAAC;AAC5C,UAAQ,IAAIA,QAAM,IAAI,uBAAuB,CAAC;AAC9C,UAAQ,IAAIA,QAAM,IAAI,6BAA6B,CAAC;AACpD,UAAQ,IAAI;AACZ,UAAQ,IAAIA,QAAM,IAAI,yEAAgD,CAAC;AAC3E;AAEO,SAAS,oBAA6B;AACzC,QAAM,cAAc,IAAIC,UAAQ,MAAM,EACjC,YAAY,4CAAoC,EAChD,OAAO,MAAM;AACV,iBAAa;AAAA,EACjB,CAAC;AAGL,cAAY,WAAW,uBAAuB,CAAC;AAC/C,cAAY,WAAW,yBAAyB,CAAC;AAEjD,SAAO;AACX;;;AOrCA,SAAS,WAAAC,iBAAe;;;ACDxB,SAAS,WAAAC,iBAAe;AACxB,OAAOC,aAAW;AAKX,SAAS,uBAAgC;AAC5C,SAAO,IAAIC,UAAQ,KAAK,EACnB,YAAY,gBAAgB,EAC5B,SAAS,WAAW,YAAY,EAChC,OAAO,sBAAsB,iDAAiD,GAAG,EACjF,OAAO,yBAAyB,wCAAwC,EACxE,OAAO,qBAAqB,sBAAsB,EAClD,OAAO,cAAc,aAAa,EAClC,OAAO,OAAO,OAAe,YAA4B;AACtD,UAAM,UAAU,IAAI,YAAY;AAChC,UAAM,WAAW,OAAO,QAAQ,YAAY,CAAC;AAE7C,QAAI,WAAW,KAAK,WAAW,GAAG;AAC9B,cAAQ,MAAMC,QAAM,IAAI,6BAAwB,CAAC;AACjD,cAAQ,KAAK,CAAC;AAAA,IAClB;AAEA,UAAM,OAAO,QAAQ,OACf,QAAQ,KAAK,MAAM,GAAG,EAAE,IAAI,CAAC,MAAc,EAAE,KAAK,CAAC,IACnD,CAAC;AAEP,UAAM,OAAO,MAAM,QAAQ,IAAI;AAAA,MAC3B;AAAA,MACA,QAAQ,QAAQ,UAAU;AAAA,MAC1B;AAAA,MACA;AAAA,IACJ,CAAC;AAED,QAAI,QAAQ,MAAM;AACd,cAAQ,IAAI,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AACzC;AAAA,IACJ;AAEA,UAAM,OAAO,eAAe,KAAK,QAAQ,KAAK;AAC9C,UAAM,QAAQ,gBAAgB,KAAK,QAAQ,KAAK;AAEhD,YAAQ,IAAIA,QAAM,MAAM,sBAAiBA,QAAM,KAAK,KAAK,EAAE,CAAC,EAAE,CAAC;AAC/D,YAAQ,IAAI,MAAMA,QAAM,IAAI,QAAQ,CAAC,OAAO,KAAK,KAAK,EAAE;AACxD,YAAQ,IAAI,MAAMA,QAAM,IAAI,WAAW,CAAC,IAAI,IAAI,IAAI,KAAK,EAAE;AAC3D,QAAI,KAAK,QAAQ;AACb,cAAQ,IAAI,MAAMA,QAAM,IAAI,SAAS,CAAC,MAAM,KAAK,MAAM,EAAE;AAAA,IAC7D;AACA,QAAI,KAAK,KAAK,SAAS,GAAG;AACtB,cAAQ,IAAI,MAAMA,QAAM,IAAI,OAAO,CAAC,QAAQ,KAAK,KAAK,KAAK,IAAI,CAAC,EAAE;AAAA,IACtE;AAAA,EACJ,CAAC;AACT;;;ACpDA,SAAS,WAAAC,iBAAe;AACxB,OAAOC,aAAW;AAWX,SAAS,wBAAiC;AAC7C,SAAO,IAAIC,UAAQ,MAAM,EACpB,MAAM,IAAI,EACV,YAAY,YAAY,EACxB,OAAO,yBAAyB,sDAAsD,EACtF,OAAO,yBAAyB,yCAAyC,EACzE,OAAO,cAAc,aAAa,EAClC,OAAO,OAAO,YAA6B;AACxC,UAAM,eAAe,OAAO;AAAA,EAChC,CAAC;AACT;AAEA,eAAe,eAAe,SAAyC;AACnE,QAAM,UAAU,IAAI,YAAY;AAChC,QAAM,WAAW,MAAM,QAAQ,QAAQ;AAEvC,MAAI,QAAQ;AAEZ,MAAI,QAAQ,QAAQ;AAChB,YAAQ,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,QAAQ,MAAM;AAAA,EAC3D;AACA,MAAI,QAAQ,QAAQ;AAChB,YAAQ,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,QAAQ,MAAM;AAAA,EAC3D;AAEA,MAAI,QAAQ,MAAM;AACd,YAAQ,IAAI,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAC1C;AAAA,EACJ;AAEA,MAAI,MAAM,WAAW,GAAG;AACpB,YAAQ,IAAIC,QAAM,IAAI,iBAAiB,CAAC;AACxC;AAAA,EACJ;AAGA,QAAM,UAAU,IAAI,IAAI,SAAS,OAAO,CAAC,MAAM,EAAE,WAAW,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAEpF,QAAM,SAAS,QAAQ,SACjB,aAAM,QAAQ,MAAM,KAAK,MAAM,MAAM,YACrC,wBAAiB,MAAM,MAAM;AACnC,UAAQ,IAAIA,QAAM,KAAK,MAAM,CAAC;AAC9B,UAAQ,IAAI;AAEZ,aAAW,QAAQ,OAAO;AACtB,kBAAc,MAAM,OAAO;AAAA,EAC/B;AACJ;AAEA,SAAS,cAAc,MAAY,SAA4B;AAC3D,QAAM,YACF,KAAK,WAAW,UAChB,KAAK,WAAW,SAAS,KACzB,CAAC,KAAK,WAAW,MAAM,CAAC,OAAO,QAAQ,IAAI,EAAE,CAAC;AAElD,QAAM,aAAa,YAAY,eAAe,aAAa,KAAK,MAAwB,KAAK;AAC7F,QAAM,eAAe,eAAe,KAAK,QAAQ,KAAK;AAEtD,MAAI,OAAO,KAAK,UAAU,KAAKA,QAAM,IAAI,KAAK,EAAE,CAAC,MAAM,KAAK,QAAQ,GAAG,YAAY,KAAK,KAAK,KAAK;AAElG,MAAI,KAAK,WAAW,iBAAiB,KAAK,aAAa;AACnD,YAAQA,QAAM,KAAK,KAAK,KAAK,WAAW,EAAE;AAAA,EAC9C;AAEA,MAAI,WAAW;AACX,UAAM,YAAY,KAAK,WAAW,OAAO,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;AACjE,YAAQA,QAAM,IAAI,cAAc,UAAU,KAAK,IAAI,CAAC,GAAG;AAAA,EAC3D;AAEA,MAAI,KAAK,QAAQ;AACb,YAAQA,QAAM,IAAI,KAAK,KAAK,MAAM,GAAG;AAAA,EACzC;AAEA,UAAQ,IAAI,IAAI;AACpB;;;ACtFA,SAAS,WAAAC,iBAAe;AACxB,OAAOC,aAAW;AAIX,SAAS,yBAAkC;AAC9C,SAAO,IAAIC,UAAQ,OAAO,EACrB,YAAY,sDAAsD,EAClE,OAAO,yBAAyB,kBAAkB,EAClD,OAAO,cAAc,aAAa,EAClC,OAAO,OAAO,YAA8B;AACzC,UAAM,UAAU,IAAI,YAAY;AAChC,UAAM,QAAQ,MAAM,QAAQ,SAAS,QAAQ,MAAM;AAEnD,QAAI,QAAQ,MAAM;AACd,cAAQ,IAAI,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAC1C;AAAA,IACJ;AAEA,QAAI,MAAM,WAAW,GAAG;AACpB,cAAQ,IAAIC,QAAM,IAAI,yBAAyB,CAAC;AAChD,cAAQ,IAAIA,QAAM,IAAI,oDAA6C,CAAC;AACpE;AAAA,IACJ;AAEA,YAAQ,IAAIA,QAAM,KAAK,4BAAqB,MAAM,MAAM,UAAU,CAAC;AACnE,YAAQ,IAAI;AAEZ,eAAW,QAAQ,OAAO;AACtB,YAAM,OAAO,eAAe,KAAK,QAAQ,KAAK;AAC9C,UAAI,OAAO,MAAM,KAAK,QAAQ,GAAG,IAAI,KAAKA,QAAM,IAAI,KAAK,EAAE,CAAC,KAAK,KAAK,KAAK;AAC3E,UAAI,KAAK,QAAQ;AACb,gBAAQA,QAAM,IAAI,MAAM,KAAK,MAAM,GAAG;AAAA,MAC1C;AACA,cAAQ,IAAI,IAAI;AAAA,IACpB;AAEA,YAAQ,IAAI;AACZ,YAAQ,IAAIA,QAAM,IAAI,4BAAqB,CAAC;AAAA,EAChD,CAAC;AACT;;;ACxCA,SAAS,WAAAC,iBAAe;AACxB,OAAOC,aAAW;AAIlB,IAAM,iBAAiB,CAAC,QAAQ,eAAe,QAAQ,WAAW;AAE3D,SAAS,0BAAmC;AAC/C,SAAO,IAAIC,UAAQ,QAAQ,EACtB,YAAY,oBAAoB,EAChC,SAAS,QAAQ,sBAAsB,EACvC,eAAe,yBAAyB,gDAAgD,EACxF,OAAO,cAAc,aAAa,EAClC,OAAO,OAAO,IAAY,YAA+B;AACtD,QAAI,CAAC,eAAe,SAAS,QAAQ,MAAM,GAAG;AAC1C,cAAQ,MAAMC,QAAM,IAAI,mCAA8B,eAAe,KAAK,IAAI,CAAC,EAAE,CAAC;AAClF,cAAQ,KAAK,CAAC;AAAA,IAClB;AAEA,UAAM,UAAU,IAAI,YAAY;AAEhC,QAAI;AACA,YAAM,OAAO,MAAM,QAAQ,OAAO,IAAI,EAAE,QAAQ,QAAQ,OAAO,CAAC;AAEhE,UAAI,QAAQ,MAAM;AACd,gBAAQ,IAAI,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AACzC;AAAA,MACJ;AAEA,YAAM,OAAO,aAAa,KAAK,MAAwB,KAAK;AAC5D,cAAQ,IAAIA,QAAM,MAAM,UAAK,KAAK,EAAE,WAAM,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;AAAA,IACpE,SAAS,OAAO;AACZ,cAAQ,MAAMA,QAAM,IAAI,UAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE,CAAC;AACtF,cAAQ,KAAK,CAAC;AAAA,IAClB;AAAA,EACJ,CAAC;AACT;;;ACpCA,SAAS,WAAAC,iBAAe;AACxB,OAAOC,aAAW;AAWX,SAAS,wBAAiC;AAC7C,SAAO,IAAIC,UAAQ,MAAM,EACpB,YAAY,8CAA8C,EAC1D,SAAS,WAAW,yCAAyC,EAC7D,OAAO,cAAc,aAAa,EAClC,OAAO,OAAO,OAAe,YAA6B;AACvD,UAAM,UAAU,IAAI,YAAY;AAEhC,QAAI,MAAM,WAAW,IAAI,GAAG;AAExB,YAAM,OAAO,MAAM,QAAQ,SAAS,KAAK;AACzC,UAAI,CAAC,MAAM;AACP,gBAAQ,MAAMC,QAAM,IAAI,eAAU,KAAK,YAAY,CAAC;AACpD,gBAAQ,KAAK,CAAC;AAAA,MAClB;AAEA,UAAI,QAAQ,MAAM;AACd,gBAAQ,IAAI,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AACzC;AAAA,MACJ;AAEA,YAAM,EAAE,SAAS,UAAU,IAAI,MAAM,QAAQ,UAAU,IAAI;AAC3D,YAAM,aAAa,UACb,eACA,aAAa,KAAK,MAAwB,KAAK;AACrD,YAAM,UAAU,eAAe,KAAK,QAAQ,KAAK;AACjD,YAAM,WAAW,gBAAgB,KAAK,QAAQ,KAAK;AAEnD,cAAQ,IAAIA,QAAM,KAAK;AAAA,YAAQ,KAAK,EAAE,KAAK,KAAK,KAAK;AAAA,CAAI,CAAC;AAC1D,cAAQ,IAAI,KAAKA,QAAM,IAAI,SAAS,CAAC,QAAQ,UAAU,IAAI,KAAK,MAAM,GAAG,UAAUA,QAAM,IAAI,YAAY,IAAI,EAAE,EAAE;AACjH,cAAQ,IAAI,KAAKA,QAAM,IAAI,WAAW,CAAC,MAAM,OAAO,KAAK,KAAK,QAAQ,IAAI,QAAQ,EAAE;AACpF,UAAI,KAAK,QAAQ;AACb,gBAAQ,IAAI,KAAKA,QAAM,IAAI,SAAS,CAAC,QAAQ,KAAK,MAAM,EAAE;AAAA,MAC9D;AACA,UAAI,KAAK,aAAa;AAClB,gBAAQ,IAAI,KAAKA,QAAM,IAAI,WAAW,CAAC,OAAO,KAAK,WAAW,KAAK,KAAK,UAAU,GAAG;AAAA,MACzF;AACA,UAAI,KAAK,WAAW,SAAS,GAAG;AAC5B,gBAAQ,IAAI,KAAKA,QAAM,IAAI,aAAa,CAAC,IAAI,KAAK,WAAW,KAAK,IAAI,CAAC,EAAE;AACzE,YAAI,SAAS;AACT,kBAAQ,IAAI,KAAKA,QAAM,IAAI,aAAa,CAAC,IAAIA,QAAM,IAAI,UAAU,KAAK,IAAI,CAAC,CAAC,EAAE;AAAA,QAClF;AAAA,MACJ;AACA,UAAI,KAAK,KAAK,SAAS,GAAG;AACtB,gBAAQ,IAAI,KAAKA,QAAM,IAAI,OAAO,CAAC,UAAU,KAAK,KAAK,KAAK,IAAI,CAAC,EAAE;AAAA,MACvE;AACA,UAAI,KAAK,QAAQ;AACb,gBAAQ,IAAI,KAAKA,QAAM,IAAI,SAAS,CAAC,QAAQ,KAAK,MAAM,EAAE;AAAA,MAC9D;AACA,UAAI,KAAK,OAAO;AACZ,gBAAQ,IAAI,KAAKA,QAAM,IAAI,QAAQ,CAAC,SAAS,KAAK,KAAK,EAAE;AAAA,MAC7D;AACA,cAAQ,IAAI,KAAKA,QAAM,IAAI,UAAU,CAAC,OAAO,KAAK,OAAO,EAAE;AAC3D,cAAQ,IAAI,KAAKA,QAAM,IAAI,UAAU,CAAC,OAAO,KAAK,OAAO,EAAE;AAC3D,cAAQ,IAAI;AAAA,IAChB,OAAO;AAEH,YAAM,QAAQ,MAAM,QAAQ,OAAO,EAAE,QAAQ,MAAM,CAAC;AAEpD,UAAI,QAAQ,MAAM;AACd,gBAAQ,IAAI,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAC1C;AAAA,MACJ;AAEA,UAAI,MAAM,WAAW,GAAG;AACpB,gBAAQ,IAAIA,QAAM,IAAI,wBAAwB,KAAK,EAAE,CAAC;AACtD;AAAA,MACJ;AAEA,cAAQ,IAAIA,QAAM,KAAK;AAAA,YAAQ,KAAK,KAAK,MAAM,MAAM;AAAA,CAAW,CAAC;AAEjE,YAAM,WAAW,MAAM,QAAQ,QAAQ;AACvC,YAAM,UAAU,IAAI,IAAI,SAAS,OAAO,CAAC,MAAM,EAAE,WAAW,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAEpF,iBAAW,QAAQ,OAAO;AACtB,cAAM,YACF,KAAK,WAAW,UAChB,KAAK,WAAW,SAAS,KACzB,CAAC,KAAK,WAAW,MAAM,CAAC,OAAO,QAAQ,IAAI,EAAE,CAAC;AAElD,cAAM,OAAO,YAAY,eAAe,aAAa,KAAK,MAAwB,KAAK;AACvF,YAAI,OAAO,KAAK,IAAI,KAAKA,QAAM,IAAI,KAAK,EAAE,CAAC,MAAM,KAAK,QAAQ,KAAK,KAAK,KAAK;AAC7E,YAAI,KAAK,YAAa,SAAQA,QAAM,KAAK,KAAK,KAAK,WAAW,EAAE;AAChE,YAAI,WAAW;AACX,gBAAM,KAAK,KAAK,WAAW,OAAO,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;AAC1D,kBAAQA,QAAM,IAAI,cAAc,GAAG,KAAK,IAAI,CAAC,GAAG;AAAA,QACpD;AACA,gBAAQ,IAAI,IAAI;AAAA,MACpB;AACA,cAAQ,IAAI;AAAA,IAChB;AAAA,EACJ,CAAC;AACT;;;ACxGA,SAAS,WAAAC,iBAAe;AACxB,OAAOC,aAAW;AAClB,SAAS,WAAAC,gBAAe;AAIjB,SAAS,wBAAiC;AAC7C,SAAO,IAAIC,UAAQ,MAAM,EACpB,YAAY,+BAA+B,EAC3C,OAAO,cAAc,aAAa,EAClC,OAAO,OAAO,YAA6B;AACxC,UAAM,UAAU,IAAI,YAAY;AAChC,UAAM,QAAQ,MAAM,QAAQ,SAAS;AAErC,QAAI,MAAM,WAAW,GAAG;AACpB,UAAI,QAAQ,MAAM;AACd,gBAAQ,IAAI,KAAK,UAAU,EAAE,QAAQ,MAAM,SAAS,iBAAiB,CAAC,CAAC;AACvE;AAAA,MACJ;AACA,cAAQ,IAAIC,QAAM,IAAI,yBAAyB,CAAC;AAChD,cAAQ,IAAIA,QAAM,IAAI,6CAAsC,CAAC;AAC7D;AAAA,IACJ;AAEA,UAAM,MAAM,MAAM,CAAC;AACnB,UAAM,OAAO,eAAe,IAAI,QAAQ,KAAK;AAE7C,QAAI,QAAQ,MAAM;AAEd,YAAMC,UAAS,MAAM,QAAQ,KAAK,IAAI,EAAE;AACxC,cAAQ,IAAI,KAAK,UAAUA,SAAQ,MAAM,CAAC,CAAC;AAC3C;AAAA,IACJ;AAEA,YAAQ,IAAID,QAAM,KAAK,kCAA2B,CAAC;AACnD,YAAQ,IAAI,MAAMA,QAAM,KAAK,IAAI,EAAE,CAAC,MAAM,IAAI,QAAQ,GAAG,IAAI,KAAK,IAAI,KAAK,EAAE;AAC7E,QAAI,IAAI,QAAQ;AACZ,cAAQ,IAAI,MAAMA,QAAM,IAAI,SAAS,CAAC,IAAI,IAAI,MAAM,EAAE;AAAA,IAC1D;AAEA,QAAI,MAAM,SAAS,GAAG;AAClB,cAAQ,IAAIA,QAAM,IAAI;AAAA,MAAS,MAAM,SAAS,CAAC,mBAAmB,CAAC;AAAA,IACvE;AAEA,UAAM,UAAU,MAAME,SAAQ;AAAA,MAC1B,SAAS;AAAA,MACT,SAAS;AAAA,IACb,CAAC;AAED,QAAI,CAAC,SAAS;AACV,cAAQ,IAAIF,QAAM,IAAI,cAAc,CAAC;AACrC;AAAA,IACJ;AAEA,UAAM,SAAS,MAAM,QAAQ,KAAK,IAAI,EAAE;AACxC,YAAQ,IAAIA,QAAM,MAAM;AAAA,SAAO,OAAO,EAAE,iBAAiB,OAAO,WAAW,6BAAwB,CAAC;AAAA,EACxG,CAAC;AACT;;;ACzDA,SAAS,WAAAG,iBAAe;AACxB,OAAOC,aAAW;AAIX,SAAS,wBAAiC;AAC7C,SAAO,IAAIC,UAAQ,MAAM,EACpB,YAAY,mBAAmB,EAC/B,SAAS,QAAQ,sBAAsB,EACvC,OAAO,cAAc,aAAa,EAClC,OAAO,OAAO,IAAY,YAA6B;AACpD,UAAM,UAAU,IAAI,YAAY;AAEhC,QAAI;AACA,YAAM,OAAO,MAAM,QAAQ,SAAS,EAAE;AAEtC,UAAI,QAAQ,MAAM;AACd,gBAAQ,IAAI,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AACzC;AAAA,MACJ;AAEA,cAAQ,IAAIC,QAAM,MAAM,UAAK,KAAK,EAAE,KAAK,KAAK,KAAK,cAAS,CAAC;AAAA,IACjE,SAAS,OAAO;AACZ,cAAQ,MAAMA,QAAM,IAAI,UAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE,CAAC;AACtF,cAAQ,KAAK,CAAC;AAAA,IAClB;AAAA,EACJ,CAAC;AACT;;;AC3BA,SAAS,WAAAC,iBAAe;AACxB,OAAOC,aAAW;AAIX,SAAS,uBAAgC;AAC5C,SAAO,IAAIC,UAAQ,KAAK,EACnB,YAAY,yCAAyC,EACrD,SAAS,aAAa,oCAAoC,EAC1D,SAAS,cAAc,qCAAqC,EAC5D,OAAO,cAAc,aAAa,EAClC,OAAO,OAAO,SAAiB,UAAkB,YAA4B;AAC1E,UAAM,UAAU,IAAI,YAAY;AAEhC,QAAI;AACA,YAAM,OAAO,MAAM,QAAQ,cAAc,SAAS,QAAQ;AAE1D,UAAI,QAAQ,MAAM;AACd,gBAAQ,IAAI,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AACzC;AAAA,MACJ;AAEA,cAAQ,IAAIC,QAAM,MAAM,UAAK,OAAO,mBAAmB,QAAQ,EAAE,CAAC;AAClE,cAAQ,IAAIA,QAAM,IAAI,MAAM,KAAK,KAAK,qBAAgB,QAAQ,EAAE,CAAC;AAAA,IACrE,SAAS,OAAO;AACZ,cAAQ,MAAMA,QAAM,IAAI,UAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE,CAAC;AACtF,cAAQ,KAAK,CAAC;AAAA,IAClB;AAAA,EACJ,CAAC;AACT;;;AC7BA,SAAS,WAAAC,iBAAe;AACxB,OAAOC,aAAW;AAIX,SAAS,wBAAiC;AAC7C,SAAO,IAAIC,UAAQ,MAAM,EACpB,YAAY,qDAAqD,EACjE,OAAO,UAAU,uCAAuC,EACxD,OAAO,UAAU,4BAA4B,EAC7C,OAAO,OAAO,YAA6B;AACxC,UAAM,UAAU,IAAI,YAAY;AAEhC,QAAI,QAAQ,MAAM;AACd,cAAQ,IAAIC,QAAM,IAAI,0CAAqC,CAAC;AAC5D,UAAI;AACA,cAAM,SAAS,MAAM,QAAQ,SAAS;AACtC,gBAAQ,IAAIA,QAAM,MAAM,8BAAyB,OAAO,MAAM,eAAe,CAAC;AAAA,MAClF,SAAS,OAAO;AACZ,gBAAQ,MAAMA,QAAM,IAAI,UAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE,CAAC;AACtF,gBAAQ,KAAK,CAAC;AAAA,MAClB;AACA;AAAA,IACJ;AAGA,YAAQ,IAAIA,QAAM,IAAI,gCAA2B,CAAC;AAClD,QAAI;AACA,YAAM,QAAQ,SAAS;AACvB,cAAQ,IAAIA,QAAM,MAAM,4BAAuB,CAAC;AAAA,IACpD,SAAS,OAAO;AACZ,cAAQ,MAAMA,QAAM,IAAI,UAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE,CAAC;AACtF,cAAQ,KAAK,CAAC;AAAA,IAClB;AAAA,EACJ,CAAC;AACT;;;AClCA,SAAS,WAAAC,iBAAe;AACxB,OAAOC,aAAW;AAElB,IAAM,aAAa;AAAA,EACjBA,QAAM,KAAK,KAAK,sCAA+B,CAAC;AAAA;AAAA,EAEhDA,QAAM,KAAK,gDAAkB,CAAC;AAAA,IAC5BA,QAAM,IAAI,MAAM,CAAC;AAAA,IACjBA,QAAM,IAAI,aAAa,CAAC;AAAA,IACxBA,QAAM,IAAI,MAAM,CAAC;AAAA,IACjBA,QAAM,IAAI,WAAW,CAAC;AAAA,IACtBA,QAAM,IAAI,WAAW,CAAC;AAAA;AAAA,EAExBA,QAAM,KAAK,gDAAkB,CAAC;AAAA,IAC5BA,QAAM,IAAI,GAAG,CAAC;AAAA,IACdA,QAAM,IAAI,GAAG,CAAC;AAAA,IACdA,QAAM,IAAI,GAAG,CAAC;AAAA,IACdA,QAAM,IAAI,GAAG,CAAC;AAAA;AAAA,EAEhBA,QAAM,KAAK,mDAAqB,CAAC;AAAA,IAC/BA,QAAM,KAAK,YAAY,CAAC;AAAA,IACxBA,QAAM,KAAK,cAAc,CAAC;AAAA,IAC1BA,QAAM,KAAK,aAAa,CAAC;AAAA,IACzBA,QAAM,KAAK,aAAa,CAAC;AAAA;AAAA,EAE3BA,QAAM,KAAK,sDAAwB,CAAC;AAAA,IAClCA,QAAM,KAAK,oBAAoB,CAAC;AAAA,IAChCA,QAAM,KAAK,gBAAgB,CAAC;AAAA,IAC5BA,QAAM,KAAK,cAAc,CAAC;AAAA,IAC1BA,QAAM,KAAK,aAAa,CAAC;AAAA,IACzBA,QAAM,KAAK,aAAa,CAAC;AAAA,IACzBA,QAAM,KAAK,oBAAoB,CAAC;AAAA;AAAA,EAElCA,QAAM,KAAK,oDAAsB,CAAC;AAAA,IAChCA,QAAM,OAAO,iEAA0C,CAAC;AAAA,MACtDA,QAAM,KAAK,gBAAgB,CAAC;AAAA;AAAA,IAE9BA,QAAM,IAAI,kBAAkB,CAAC;AAAA,MAC3BA,QAAM,KAAK,YAAY,CAAC;AAAA,MACxBA,QAAM,KAAK,YAAY,CAAC;AAAA,MACxBA,QAAM,KAAK,YAAY,CAAC;AAAA;AAAA,IAE1BA,QAAM,IAAI,eAAe,CAAC;AAAA,MACxBA,QAAM,KAAK,YAAY,CAAC;AAAA;AAAA,IAE1BA,QAAM,IAAI,iBAAiB,CAAC;AAAA,MAC1BA,QAAM,KAAK,YAAY,CAAC;AAAA;AAAA,IAE1BA,QAAM,IAAI,cAAc,CAAC;AAAA,MACvBA,QAAM,KAAK,YAAY,CAAC;AAAA;AAAA,EAE5BA,QAAM,KAAK,kDAAoB,CAAC;AAAA,IAC9BA,QAAM,IAAI,kBAAkB,CAAC;AAAA,MAC3BA,QAAM,KAAK,YAAY,CAAC;AAAA,MACxBA,QAAM,KAAK,YAAY,CAAC;AAAA;AAAA,IAE1BA,QAAM,IAAI,2BAA2B,CAAC;AAAA,MACpCA,QAAM,IAAI,iEAAkD,CAAC;AAAA,MAC7DA,QAAM,KAAK,YAAY,CAAC;AAAA,MACxBA,QAAM,IAAI,mEAA4C,CAAC;AAAA;AAAA,IAEzDA,QAAM,IAAI,YAAY,CAAC;AAAA,MACrBA,QAAM,KAAK,aAAa,CAAC;AAAA;AAAA,EAE7BA,QAAM,KAAK,0DAA4B,CAAC;AAAA,IACtCA,QAAM,OAAO,2EAAiD,CAAC;AAAA,IAC/DA,QAAM,IAAI,0FAAiD,CAAC;AAAA;AAAA,IAE5DA,QAAM,IAAI,eAAe,CAAC,KAAKA,QAAM,KAAK,oBAAoB,CAAC;AAAA,IAC/DA,QAAM,IAAI,eAAe,CAAC,KAAKA,QAAM,KAAK,oBAAoB,CAAC;AAAA;AAAA,EAEjEA,QAAM,KAAK,4EAA8C,CAAC;AAAA,IACxDA,QAAM,IAAI,0CAAgC,CAAC;AAAA,OACxCA,QAAM,KAAK,gBAAgB,CAAC;AAAA,OAC5BA,QAAM,KAAK,YAAY,CAAC;AAAA,OACxBA,QAAM,KAAK,YAAY,CAAC;AAAA,OACxBA,QAAM,KAAK,aAAa,CAAC;AAAA;AAAA,IAE5BA,QAAM,IAAI,oCAA+B,CAAC;AAAA,OACvCA,QAAM,KAAK,aAAa,CAAC,gBAAWA,QAAM,KAAK,iBAAiB,CAAC;AAAA;AAAA,OAEjEA,QAAM,KAAK,aAAa,CAAC;AAAA;AAAA,IAE5BA,QAAM,IAAI,qBAAqB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMlCA,QAAM,KAAK,oDAAsB,CAAC;AAAA,IAChCA,QAAM,KAAK,aAAa,CAAC;AAAA,IACzBA,QAAM,KAAK,cAAc,CAAC;AAAA,IAC1BA,QAAM,KAAK,YAAY,CAAC;AAAA,IACxBA,QAAM,KAAK,eAAe,CAAC;AAAA,IAC3BA,QAAM,KAAK,aAAa,CAAC;AAAA,IACzBA,QAAM,KAAK,aAAa,CAAC;AAAA,IACzBA,QAAM,KAAK,aAAa,CAAC;AAAA,IACzBA,QAAM,KAAK,YAAY,CAAC;AAAA,IACxBA,QAAM,KAAK,aAAa,CAAC;AAAA,IACzBA,QAAM,KAAK,gBAAgB,CAAC;AAAA,IAC5BA,QAAM,KAAK,cAAc,CAAC;AAAA;AAAA,IAE1BA,QAAM,IAAI,4DAA4D,CAAC;AAAA;AAGpE,SAAS,yBAAkC;AAC9C,SAAO,IAAID,UAAQ,OAAO,EACrB,YAAY,iCAAiC,EAC7C,OAAO,MAAM;AACV,YAAQ,IAAI,UAAU;AAAA,EAC1B,CAAC;AACT;;;AVlGO,SAAS,qBAA8B;AAC1C,QAAM,MAAM,IAAIE,UAAQ,OAAO,EAC1B,MAAM,GAAG,EACT,YAAY,oEAA+D;AAEhF,MAAI,WAAW,sBAAsB,CAAC;AACtC,MAAI,WAAW,uBAAuB,CAAC;AACvC,MAAI,WAAW,qBAAqB,CAAC;AACrC,MAAI,WAAW,wBAAwB,CAAC;AACxC,MAAI,WAAW,sBAAsB,CAAC;AACtC,MAAI,WAAW,sBAAsB,CAAC;AACtC,MAAI,WAAW,sBAAsB,CAAC;AACtC,MAAI,WAAW,qBAAqB,CAAC;AACrC,MAAI,WAAW,sBAAsB,CAAC;AACtC,MAAI,WAAW,yBAAyB,CAAC;AACzC,MAAI,WAAW,uBAAuB,CAAC;AAGvC,MAAI,OAAO,YAAY;AACnB,UAAM,EAAE,kBAAkB,IAAI,MAAM,OAAO,uBAAc;AACzD,UAAM,kBAAkB,EAAE,MAAM,MAAM,CAAC;AAAA,EAC3C,CAAC;AAED,SAAO;AACX;;;AWzCA,SAAS,WAAAC,iBAAe;AACxB,OAAOC,aAAW;;;ACDlB,SAAS,WAAAC,iBAAe;AACxB,OAAOC,aAAW;AAClB,OAAOC,YAAW;;;ACFlB,SAAS,YAAYC,YAAU;AAC/B,SAAS,QAAAC,aAAY;AACrB,OAAO,YAAY;AA2DZ,IAAM,oBAAN,MAAwB;AAAA;AAAA;AAAA;AAAA,EAI3B,MAAM,KACF,QACA,SACqB;AACrB,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,SAAS,SAAU,QAAO,IAAI,YAAY,QAAQ,QAAQ;AAC9D,QAAI,SAAS,OAAQ,QAAO,IAAI,UAAU,QAAQ,MAAM;AAExD,UAAM,MAAM,GAAG,OAAO,MAAM,oBAAoB,OAAO,SAAS,IAAI,MAAM,SAAS,EAAE;AAErF,UAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAC9B,SAAS,EAAE,mBAAmB,OAAO,UAAU;AAAA,IACnD,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AACd,YAAM,IAAI,aAAa,qCAAqC,SAAS,MAAM,EAAE;AAAA,IACjF;AAEA,UAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAI,QAAoB,MAAuC;AACjE,UAAM,WAAW,MAAM,MAAM,GAAG,OAAO,MAAM,qBAAqB,IAAI,IAAI;AAAA,MACtE,SAAS,EAAE,mBAAmB,OAAO,UAAU;AAAA,IACnD,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AACd,UAAI,SAAS,WAAW,KAAK;AACzB,cAAM,IAAI,MAAM,0BAA0B,IAAI,EAAE;AAAA,MACpD;AACA,YAAM,IAAI,aAAa,mCAAmC,SAAS,MAAM,EAAE;AAAA,IAC/E;AAEA,WAAQ,MAAM,SAAS,KAAK;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBACF,QACA,MACA,WACA,YACa;AACb,QAAI,WAAY,YAAW,EAAE;AAG7B,UAAM,WAAW,MAAM,MAAM,GAAG,OAAO,MAAM,qBAAqB,IAAI,aAAa;AAAA,MAC/E,SAAS,EAAE,mBAAmB,OAAO,UAAU;AAAA,IACnD,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AACd,YAAM,IAAI,aAAa,gCAAgC,SAAS,MAAM,EAAE;AAAA,IAC5E;AAEA,QAAI,WAAY,YAAW,EAAE;AAG7B,UAAM,SAASC,MAAK,QAAQ,IAAI,UAAU,QAAQ,WAAW;AAC7D,UAAMC,KAAG,MAAM,QAAQ,EAAE,WAAW,KAAK,CAAC;AAC1C,UAAM,UAAUD,MAAK,QAAQ,GAAG,IAAI,MAAM;AAE1C,UAAM,SAAS,MAAM,SAAS,YAAY;AAC1C,UAAMC,KAAG,UAAU,SAAS,OAAO,KAAK,MAAM,CAAC;AAE/C,QAAI,WAAY,YAAW,EAAE;AAG7B,UAAM,MAAM,IAAI,OAAO,OAAO;AAC9B,UAAMA,KAAG,MAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAC7C,QAAI,aAAa,WAAW,IAAI;AAEhC,QAAI,WAAY,YAAW,GAAG;AAG9B,UAAMA,KAAG,OAAO,OAAO;AAAA,EAC3B;AACJ;;;AD5IO,SAAS,uBAAgC;AAC5C,SAAO,IAAIC,UAAQ,MAAM,EACpB,YAAY,6BAA6B,EACzC,OAAO,6BAA6B,mDAAmD,EACvF,OAAO,uBAAuB,oCAAoC,EAClE,OAAO,OAAO,YAAY;AACvB,UAAM,gBAAgB,IAAI,cAAc;AACxC,UAAM,SAAS,MAAM,cAAc,KAAK;AAExC,QAAI,CAAC,QAAQ;AACT,YAAM,IAAI,gBAAgB,yCAAyC;AAAA,IACvE;AAEA,YAAQ,IAAIC,QAAM,KAAK,2DAAuC,CAAC;AAC/D,YAAQ,IAAI;AAEZ,UAAM,aAAa,IAAI,kBAAkB;AACzC,UAAM,OAAO,MAAM,WAAW,KAAK,QAAQ;AAAA,MACvC,UAAU,QAAQ;AAAA,MAClB,QAAQ,QAAQ;AAAA,IACpB,CAAC;AAED,QAAI,KAAK,WAAW,GAAG;AACnB,cAAQ,IAAIA,QAAM,OAAO,gDAAkC,CAAC;AAC5D,UAAI,QAAQ,YAAY,QAAQ,QAAQ;AACpC,gBAAQ,IAAIA,QAAM,IAAI,4DAA8B,CAAC;AAAA,MACzD;AACA;AAAA,IACJ;AAGA,UAAM,aAA0C,CAAC;AACjD,eAAW,OAAO,MAAM;AACpB,UAAI,CAAC,WAAW,IAAI,QAAQ,GAAG;AAC3B,mBAAW,IAAI,QAAQ,IAAI,CAAC;AAAA,MAChC;AACA,iBAAW,IAAI,QAAQ,EAAE,KAAK,GAAG;AAAA,IACrC;AAEA,UAAM,gBAAgB,CAAC,YAAY,WAAW,WAAW;AACzD,UAAM,mBAAmB,OAAO,KAAK,UAAU,EAAE,KAAK,CAAC,GAAG,MAAM;AAC5D,YAAM,SAAS,cAAc,QAAQ,CAAC;AACtC,YAAM,SAAS,cAAc,QAAQ,CAAC;AACtC,UAAI,WAAW,MAAM,WAAW,GAAI,QAAO,EAAE,cAAc,CAAC;AAC5D,UAAI,WAAW,GAAI,QAAO;AAC1B,UAAI,WAAW,GAAI,QAAO;AAC1B,aAAO,SAAS;AAAA,IACpB,CAAC;AAED,eAAW,YAAY,kBAAkB;AACrC,YAAM,eAAe,WAAW,QAAQ;AACxC,YAAM,eACF,aAAa,aAAa,cAC1B,aAAa,YAAY,iBACzB,aAAa,cAAc,cAAO;AAEtC,cAAQ;AAAA,QACJA,QAAM,KAAK,GAAG,YAAY,IAAI,SAAS,OAAO,CAAC,EAAE,YAAY,IAAI,SAAS,MAAM,CAAC,CAAC,EAAE;AAAA,MACxF;AAEA,YAAM,QAAQ,IAAIC,OAAM;AAAA,QACpB,MAAM;AAAA,UACFD,QAAM,KAAK,MAAM;AAAA,UACjBA,QAAM,KAAK,eAAO;AAAA,UAClBA,QAAM,KAAK,SAAS;AAAA,QACxB;AAAA,QACA,OAAO,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE;AAAA,MACxC,CAAC;AAED,iBAAW,OAAO,cAAc;AAC5B,cAAM,KAAK;AAAA,UACPA,QAAM,MAAM,IAAI,IAAI;AAAA,UACpBA,QAAM,IAAI,IAAI,YAAY,MAAM,GAAG,EAAE,CAAC;AAAA,UACtCA,QAAM,MAAM,IAAI,IAAI,OAAO,EAAE;AAAA,QACjC,CAAC;AAAA,MACL;AAEA,cAAQ,IAAI,MAAM,SAAS,CAAC;AAC5B,cAAQ,IAAI;AAAA,IAChB;AAEA,YAAQ,IAAIA,QAAM,IAAI,wBAAc,KAAK,MAAM,iBAAiB,CAAC;AACjE,YAAQ,IAAIA,QAAM,IAAI,uFAAuD,CAAC;AAAA,EAClF,CAAC;AACT;;;AE3FA,SAAS,WAAAE,iBAAe;AAKjB,SAAS,uBAAgC;AAC5C,SAAO,IAAIC,UAAQ,MAAM,EACpB,YAAY,+CAA+C,EAC3D,SAAS,UAAU,kBAAkB,EACrC,OAAO,OAAO,SAAS;AACpB,UAAM,gBAAgB,IAAI,cAAc;AACxC,UAAM,SAAS,MAAM,cAAc,KAAK;AAExC,QAAI,CAAC,QAAQ;AACT,YAAM,IAAI,gBAAgB,yCAAyC;AAAA,IACvE;AAEA,UAAM,aAAa,IAAI,kBAAkB;AACzC,UAAM,MAAM,MAAM,WAAW,IAAI,QAAQ,IAAI;AAE7C,YAAQ,IAAI,aAAM,IAAI,IAAI;AAAA,CAAI;AAC9B,YAAQ,IAAI,gBAAgB,IAAI,WAAW,EAAE;AAC7C,YAAQ,IAAI,gBAAgB,IAAI,QAAQ,EAAE;AAC1C,YAAQ,IAAI,gBAAgB,IAAI,OAAO,EAAE;AACzC,YAAQ,IAAI,gBAAgB,IAAI,SAAS,EAAE;AAE3C,QAAI,IAAI,KAAK,SAAS,GAAG;AACrB,cAAQ,IAAI,gBAAgB,IAAI,KAAK,KAAK,IAAI,CAAC,EAAE;AAAA,IACrD;AAEA,QAAI,IAAI,OAAO,iBAAiB,IAAI,OAAO,cAAc,SAAS,GAAG;AACjE,cAAQ,IAAI;AAAA,gBAAmB;AAC/B,UAAI,OAAO,cAAc,QAAQ,CAAC,SAAS;AACvC,gBAAQ,IAAI,OAAO,IAAI,EAAE;AAAA,MAC7B,CAAC;AAAA,IACL;AAEA,QAAI,IAAI,OAAO,WAAW,SAAS,IAAI,OAAO,UAAU,WAAW,SAAS,GAAG;AAC3E,cAAQ,IAAI;AAAA,+BAAkC;AAC9C,UAAI,OAAO,UAAU,WAAW,QAAQ,CAAC,SAAS;AAC9C,gBAAQ,IAAI,OAAO,IAAI,EAAE;AAAA,MAC7B,CAAC;AAAA,IACL;AAEA,QAAI,IAAI,OAAO,aAAa,IAAI,OAAO,UAAU,SAAS,GAAG;AACzD,cAAQ,IAAI;AAAA,sCAAyC;AACrD,UAAI,OAAO,UAAU,QAAQ,CAAC,MAAM;AAChC,gBAAQ,IAAI,OAAO,EAAE,IAAI,KAAK,EAAE,MAAM,GAAG,EAAE,UAAU,cAAc,EAAE,OAAO,MAAM,EAAE,EAAE;AAAA,MAC1F,CAAC;AAAA,IACL;AAEA,QAAI,IAAI,OAAO,OAAO,YAAY,IAAI,OAAO,MAAM,SAAS,SAAS,GAAG;AACpE,cAAQ,IAAI;AAAA,oBAAuB;AACnC,UAAI,OAAO,MAAM,SAAS,QAAQ,CAAC,QAAQ;AACvC,gBAAQ,IAAI,OAAO,GAAG,EAAE;AAAA,MAC5B,CAAC;AAAA,IACL;AAAA,EACJ,CAAC;AACT;;;AC1DA,SAAS,WAAAC,iBAAe;AACxB,SAAS,YAAYC,YAAU;AAC/B,SAAS,QAAAC,cAAY;AACrB,SAAS,UAAAC,SAAQ,SAAAC,QAAO,YAAAC,iBAAgB;AACxC,SAAS,SAAAC,cAAa;;;ACJtB,SAAS,aAAa;AAKf,IAAM,eAAN,MAAmB;AAAA,EACtB,YACY,KACA,WACV;AAFU;AACA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKH,MAAM,IAAI,OAAgC;AACtC,eAAW,QAAQ,OAAO;AACtB,YAAM,MAAM,KAAK,iBAAiB,IAAI;AACtC,cAAQ,IAAI,QAAQ,GAAG,EAAE;AAEzB,UAAI;AACA,cAAM,MAAM,KAAK;AAAA,UACb,KAAK,KAAK;AAAA,UACV,OAAO;AAAA,UACP,OAAO;AAAA,QACX,CAAC;AAAA,MACL,SAAS,OAAO;AACZ,cAAM,IAAI,MAAM,gBAAgB,GAAG,EAAE;AAAA,MACzC;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,KAAqB;AAC1C,QAAI,SAAS;AACb,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,SAAS,GAAG;AACvD,eAAS,OAAO,QAAQ,IAAI,OAAO,SAAS,GAAG,UAAU,GAAG,GAAG,KAAK;AAAA,IACxE;AACA,WAAO;AAAA,EACX;AACJ;;;AD7BO,SAAS,yBAAkC;AAC9C,SAAO,IAAIC,UAAQ,QAAQ,EACtB,YAAY,yCAAyC,EACrD,SAAS,UAAU,kBAAkB,EACrC,SAAS,eAAe,uCAAuC,EAC/D,OAAO,aAAa,sCAAsC,EAC1D,OAAO,iBAAiB,cAAc,EACtC,OAAO,kBAAkB,8BAA8B,EACvD,OAAO,cAAc,yBAAyB,EAC9C,OAAO,oBAAoB,sBAAsB,EACjD,OAAO,cAAc,eAAe,EACpC,OAAO,OAAO,MAAM,WAAW,YAAY;AACxC,UAAM,gBAAgB,IAAI,cAAc;AACxC,UAAM,SAAS,MAAM,cAAc,KAAK;AAExC,QAAI,CAAC,QAAQ;AACT,YAAM,IAAI,gBAAgB,yCAAyC;AAAA,IACvE;AAEA,UAAM,aAAa,QAAQ,QAAQ;AACnC,UAAM,aAAa,IAAI,kBAAkB;AAGzC,YAAQ,IAAI,mCAA4B,IAAI,KAAK;AACjD,UAAM,MAAM,MAAM,WAAW,IAAI,QAAQ,IAAI;AAG7C,QAAI,IAAI,OAAO,iBAAiB,IAAI,OAAO,cAAc,SAAS,GAAG;AACjE,cAAQ,IAAI,sCAA+B;AAC3C,iBAAW,QAAQ,IAAI,OAAO,eAAe;AACzC,YAAI;AACA,gBAAMC,OAAM,SAAS,CAAC,IAAI,CAAC;AAAA,QAC/B,QAAQ;AACJ,kBAAQ,KAAK,yCAA+B,IAAI,aAAa;AAAA,QACjE;AAAA,MACJ;AAAA,IACJ;AAGA,UAAM,YAAY,aAAaC,OAAK,QAAQ,IAAI,GAAG,QAAQ,QAAQ,IAAI;AAGvE,QAAI;AACA,YAAMC,KAAG,OAAO,SAAS;AACzB,YAAM,IAAI,MAAM,6BAA6B,SAAS,EAAE;AAAA,IAC5D,SAAS,OAAO;AACZ,UAAK,MAAgC,SAAS,UAAU;AACpD,cAAM;AAAA,MACV;AAAA,IACJ;AAGA,QAAI,IAAI,OAAO,OAAO,WAAW,IAAI,OAAO,MAAM,QAAQ,SAAS,GAAG;AAClE,cAAQ,IAAI,qCAA8B;AAC1C,YAAM,eAAe,IAAI,aAAa,QAAQ,IAAI,GAAG,CAAC,CAAC;AACvD,YAAM,aAAa,IAAI,IAAI,OAAO,MAAM,OAAO;AAAA,IACnD;AAGA,YAAQ,IAAI,mCAA4B;AACxC,UAAM,WAAW,mBAAmB,QAAQ,MAAM,WAAW,CAAC,YAAY;AACtE,UAAI,YAAY,KAAK;AACjB,gBAAQ,IAAI,oCAA+B;AAAA,MAC/C;AAAA,IACJ,CAAC;AAGD,QAAI,IAAI,OAAO,OAAO,eAAe,IAAI,OAAO,MAAM,YAAY,SAAS,GAAG;AAC1E,cAAQ,IAAI,qCAA8B;AAC1C,YAAM,eAAe,IAAI,aAAa,WAAW,CAAC,CAAC;AACnD,YAAM,aAAa,IAAI,IAAI,OAAO,MAAM,WAAW;AAAA,IACvD;AAGA,UAAM,YAAoC,CAAC;AAE3C,QAAI,IAAI,OAAO,aAAa,IAAI,OAAO,UAAU,SAAS,GAAG;AACzD,UAAI,YAAY;AACZ,gBAAQ,IAAI,4CAAqC;AACjD,mBAAW,KAAK,IAAI,OAAO,WAAW;AAClC,oBAAU,EAAE,IAAI,IACZ,QAAQ,QAAQ,EAAE,SAAS,iBACrB,QAAQ,OACR,EAAE,WAAW;AAAA,QAC3B;AAAA,MACJ,OAAO;AACH,gBAAQ,IAAI,2CAAoC;AAChD,mBAAW,KAAK,IAAI,OAAO,WAAW;AAClC,cAAI,EAAE,SAAS,YAAY,EAAE,SAAS;AAClC,kBAAM,SAAS,MAAMC,QAAO;AAAA,cACxB,SAAS,EAAE;AAAA,cACX,SAAS,EAAE,QAAQ,IAAI,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,IAAI,EAAE;AAAA,cAC3D,SAAS,EAAE;AAAA,cACX,OAAO;AAAA,YACX,CAAC;AACD,sBAAU,EAAE,IAAI,IAAI;AAAA,UACxB,OAAO;AACH,kBAAM,SAAS,MAAMC,OAAM;AAAA,cACvB,SAAS,EAAE;AAAA,cACX,SAAS,EAAE;AAAA,YACf,CAAC;AACD,sBAAU,EAAE,IAAI,IAAI;AAAA,UACxB;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAGA,QAAI,OAAO,KAAK,SAAS,EAAE,SAAS,GAAG;AACnC,YAAM,0BAA0B,WAAW,SAAS;AAAA,IACxD;AAGA,QAAI,CAAC,QAAQ,iBAAiB,IAAI,OAAO,WAAW,OAAO;AACvD,cAAQ,IAAI,sCAA+B;AAC3C,YAAM,oBAAoB,IAAI,kBAAkB,SAAS;AAGzD,YAAM,gBAAgB,MAAM,kBAAkB;AAAA,QAC1C;AAAA,QACA,IAAI,OAAO,UAAU;AAAA,MACzB;AAEA,iBAAW,YAAY,eAAe;AAClC,gBAAQ,IAAI,2BAAoB,QAAQ,KAAK;AAC7C,cAAM,kBAAkB,QAAQ,QAAQ,UAAUH,OAAK,WAAW,OAAO,CAAC;AAAA,MAC9E;AAEA,cAAQ,IAAI,wCAAmC;AAAA,IACnD;AAGA,QAAI,CAAC,QAAQ,WAAW,IAAI,OAAO,KAAK,MAAM;AAC1C,cAAQ,IAAI,0CAAmC;AAC/C,YAAMD,OAAM,OAAO,CAAC,MAAM,GAAG,EAAE,KAAK,UAAU,CAAC;AAC/C,YAAMA,OAAM,OAAO,CAAC,OAAO,GAAG,GAAG,EAAE,KAAK,UAAU,CAAC;AACnD,YAAM,YAAY,IAAI,OAAO,IAAI,iBAAiB;AAClD,YAAMA,OAAM,OAAO,CAAC,UAAU,MAAM,SAAS,GAAG,EAAE,KAAK,UAAU,CAAC;AAClE,cAAQ,IAAI,2BAAsB;AAAA,IACtC;AAGA,QAAI,CAAC,QAAQ,eAAe,IAAI,OAAO,OAAO,UAAU;AACpD,cAAQ,IAAI,4BAAqB;AACjC,YAAM,eAAe,IAAI,aAAa,WAAW,SAAS;AAC1D,YAAM,aAAa,IAAI,IAAI,OAAO,MAAM,QAAQ;AAAA,IACpD;AAGA,UAAM,sBAAsB,IAAI,OAAO,KAAK,eAAe;AAC3D,QAAI,CAAC,QAAQ,WAAW,qBAAqB;AACzC,YAAM,aAAa;AAAA,QACf,EAAE,MAAM,UAAU,OAAO,SAAS;AAAA,QAClC,EAAE,MAAM,YAAY,OAAO,WAAW;AAAA,QACtC,EAAE,MAAM,eAAe,OAAO,aAAa;AAAA,QAC3C,EAAE,MAAM,eAAe,OAAO,cAAc;AAAA,QAC5C,EAAE,MAAM,YAAY,OAAO,WAAW;AAAA,MAC1C;AAEA,UAAI,eAAyB,CAAC;AAE9B,UAAI,YAAY;AACZ,uBAAe,IAAI,OAAO,KAAK,kBAAkB,CAAC;AAClD,YAAI,aAAa,SAAS,GAAG;AACzB,kBAAQ,IAAI,qCAAyB,aAAa,KAAK,IAAI,CAAC,EAAE;AAAA,QAClE;AAAA,MACJ,OAAO;AACH,cAAM,iBAAiB,IAAI,OAAO,KAAK,kBAAkB,CAAC;AAC1D,cAAM,SAAS,MAAMK,UAAS;AAAA,UAC1B,SAAS;AAAA,UACT,SAAS,WAAW,IAAI,CAAC,OAAO;AAAA,YAC5B,GAAG;AAAA,YACH,SAAS,eAAe,SAAS,EAAE,KAAK;AAAA,UAC5C,EAAE;AAAA,UACF,OAAO;AAAA,QACX,CAAC;AACD,uBAAe;AAAA,MACnB;AAEA,UAAI,aAAa,SAAS,GAAG;AACzB,cAAML,OAAM,QAAQ,CAAC,OAAO,QAAQ,SAAS,GAAG,cAAc,UAAU,SAAS,aAAa,UAAU,GAAG;AAAA,UACvG,KAAK;AAAA,UACL,OAAO;AAAA,QACX,CAAC;AAAA,MACL;AAAA,IACJ;AAGA,YAAQ,IAAI,wCAAmC;AAC/C,YAAQ,IAAI,uBAAgB,SAAS,EAAE;AACvC,YAAQ,IAAI,yBAAkB;AAC9B,YAAQ,IAAI,SAAS,SAAS,EAAE;AAChC,YAAQ,IAAI,2DAA2D;AACvE,YAAQ,IAAI,kDAAkD;AAAA,EAClE,CAAC;AACT;AAKA,eAAe,0BACX,KACA,WACa;AACb,QAAM,QAAQ,MAAM,YAAY,GAAG;AAEnC,aAAW,QAAQ,OAAO;AACtB,QAAI,UAAU,MAAME,KAAG,SAAS,MAAM,OAAO;AAC7C,QAAI,WAAW;AAEf,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,SAAS,GAAG;AAClD,YAAM,QAAQ,IAAI,OAAO,SAAS,GAAG,UAAU,GAAG;AAClD,UAAI,MAAM,KAAK,OAAO,GAAG;AACrB,kBAAU,QAAQ,QAAQ,OAAO,KAAK;AACtC,mBAAW;AAAA,MACf;AAAA,IACJ;AAEA,QAAI,UAAU;AACV,YAAMA,KAAG,UAAU,MAAM,SAAS,OAAO;AAAA,IAC7C;AAAA,EACJ;AACJ;AAKA,eAAe,YAAY,KAAgC;AACvD,QAAM,QAAkB,CAAC;AACzB,QAAM,UAAU,MAAMA,KAAG,QAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAE7D,aAAW,SAAS,SAAS;AACzB,UAAM,WAAWD,OAAK,KAAK,MAAM,IAAI;AACrC,QAAI,MAAM,YAAY,GAAG;AACrB,UAAI,CAAC,MAAM,KAAK,WAAW,GAAG,KAAK,MAAM,SAAS,gBAAgB;AAC9D,cAAM,KAAK,GAAI,MAAM,YAAY,QAAQ,CAAE;AAAA,MAC/C;AAAA,IACJ,OAAO;AACH,YAAM,KAAK,QAAQ;AAAA,IACvB;AAAA,EACJ;AAEA,SAAO;AACX;;;AJzPA,SAAS,cAAoB;AACzB,UAAQ,IAAIK,QAAM,KAAK,KAAK,oBAAa,IAAIA,QAAM,IAAI,iCAAyB,CAAC;AACjF,UAAQ,IAAI;AACZ,UAAQ,IAAIA,QAAM,KAAK,mBAAW,CAAC;AACnC,UAAQ,IAAI,KAAKA,QAAM,KAAK,MAAM,CAAC,yDAAsC;AACzE,UAAQ,IAAI,KAAKA,QAAM,KAAK,MAAM,CAAC,6CAAmC;AACtE,UAAQ,IAAI,KAAKA,QAAM,KAAK,QAAQ,CAAC,kDAAmC;AACxE,UAAQ,IAAI;AACZ,UAAQ,IAAIA,QAAM,KAAK,gBAAQ,CAAC;AAChC,UAAQ,IAAIA,QAAM,IAAI,mBAAmB,CAAC;AAC1C,UAAQ,IAAIA,QAAM,IAAI,uCAAuC,CAAC;AAC9D,UAAQ,IAAIA,QAAM,IAAI,mCAAmC,CAAC;AAC1D,UAAQ,IAAIA,QAAM,IAAI,gDAAgD,CAAC;AACvE,UAAQ,IAAI;AACZ,UAAQ,IAAIA,QAAM,IAAI,wEAA+C,CAAC;AAC1E;AAEO,SAAS,mBAA4B;AACxC,QAAM,MAAM,IAAIC,UAAQ,KAAK,EACxB,YAAY,sCAAsC,EAClD,OAAO,MAAM;AACV,gBAAY;AAAA,EAChB,CAAC;AAEL,MAAI,WAAW,qBAAqB,CAAC;AACrC,MAAI,WAAW,qBAAqB,CAAC;AACrC,MAAI,WAAW,uBAAuB,CAAC;AAEvC,SAAO;AACX;;;AMnCA,SAAS,WAAAC,iBAAe;AACxB,OAAOC,aAAW;;;ACDlB,SAAS,WAAAC,iBAAe;AACxB,OAAOC,aAAW;AAClB,OAAOC,YAAW;AAyBX,SAAS,yBAAkC;AAC9C,SAAO,IAAIC,UAAQ,MAAM,EACpB,YAAY,6BAA6B,EACzC,OAAO,UAAU,gBAAgB,EACjC,OAAO,OAAO,YAAY;AACvB,UAAM,gBAAgB,IAAI,cAAc;AACxC,UAAM,SAAS,MAAM,cAAc,KAAK;AAExC,QAAI,CAAC,QAAQ;AACT,YAAM,IAAI,gBAAgB,yCAAyC;AAAA,IACvE;AAEA,YAAQ,IAAIC,QAAM,KAAK,2DAAuC,CAAC;AAC/D,YAAQ,IAAI;AAEZ,QAAI;AACA,YAAM,WAAW,MAAM,MAAM,GAAG,OAAO,MAAM,sBAAsB;AAAA,QAC/D,SAAS;AAAA,UACL,mBAAmB,OAAO;AAAA,QAC9B;AAAA,MACJ,CAAC;AAED,UAAI,CAAC,SAAS,IAAI;AACd,cAAM,IAAI,MAAM,4BAA4B,SAAS,UAAU,EAAE;AAAA,MACrE;AAEA,YAAM,OAAQ,MAAM,SAAS,KAAK;AAElC,UAAI,QAAQ,MAAM;AACd,gBAAQ,IAAI,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AACzC;AAAA,MACJ;AAEA,UAAI,KAAK,UAAU,GAAG;AAClB,gBAAQ,IAAIA,QAAM,OAAO,gCAAuB,CAAC;AACjD;AAAA,MACJ;AAEA,cAAQ;AAAA,QACJA,QAAM,MAAM,2BAAcA,QAAM,KAAK,KAAK,KAAK,CAAC,UAAU,KAAK,QAAQ,IAAI,MAAM,EAAE,EAAE;AAAA,MACzF;AACA,cAAQ,IAAI;AAEZ,iBAAW,UAAU,KAAK,SAAS;AAE/B,gBAAQ,IAAIA,QAAM,KAAK,KAAK,aAAM,OAAO,IAAI,EAAE,CAAC;AAGhD,cAAM,QAAQ,IAAIC,OAAM;AAAA,UACpB,OAAO,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,SAAS,KAAK;AAAA,UACnD,WAAW,CAAC,IAAI,EAAE;AAAA,QACtB,CAAC;AAED,cAAM;AAAA,UACF,CAACD,QAAM,IAAI,QAAK,GAAGA,QAAM,MAAM,OAAO,IAAI,CAAC;AAAA,UAC3C,CAACA,QAAM,IAAI,eAAO,GAAGA,QAAM,MAAM,OAAO,WAAW,CAAC;AAAA,UACpD,CAACA,QAAM,IAAI,SAAS,GAAGA,QAAM,MAAM,IAAI,OAAO,OAAO,EAAE,CAAC;AAAA,QAC5D;AAGA,cAAM,aAAuB,CAAC;AAC9B,YAAI,OAAO,MAAM,SAAU,YAAW,KAAK,OAAO,MAAM,QAAQ;AAChE,YAAI,OAAO,MAAM,QAAS,YAAW,KAAK,OAAO,MAAM,OAAO;AAC9D,YAAI,OAAO,MAAM,IAAK,YAAW,KAAK,OAAO,MAAM,GAAG;AACtD,YAAI,OAAO,MAAM,SAAU,YAAW,KAAK,OAAO,MAAM,QAAQ;AAChE,YAAI,WAAW,SAAS,GAAG;AACvB,gBAAM,KAAK,CAACA,QAAM,IAAI,OAAO,GAAGA,QAAM,OAAO,WAAW,KAAK,KAAK,CAAC,CAAC,CAAC;AAAA,QACzE;AAEA,cAAM;AAAA,UACF,CAACA,QAAM,IAAI,MAAM,GAAGA,QAAM,IAAI,OAAO,KAAK,KAAK,IAAI,KAAK,GAAG,CAAC;AAAA,UAC5D,CAACA,QAAM,IAAI,WAAW,GAAGA,QAAM,MAAM,OAAO,UAAU,SAAS,CAAC,CAAC;AAAA,QACrE;AAEA,gBAAQ,IAAI,MAAM,SAAS,CAAC;AAC5B,gBAAQ,IAAI;AAAA,MAChB;AAEA,cAAQ,IAAIA,QAAM,IAAI,mFAAqD,CAAC;AAAA,IAChF,SAAS,OAAO;AACZ,YAAM,IAAI;AAAA,QACN,kCAAwB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MAClF;AAAA,IACJ;AAAA,EACJ,CAAC;AACT;;;AChHA,SAAS,WAAAE,iBAAe;AACxB,SAAS,YAAYC,YAAU;AAC/B,SAAS,QAAAC,cAAY;AACrB,SAAS,UAAAC,SAAQ,WAAAC,iBAAsB;;;ACHvC,SAAS,YAAYC,YAAU;AAC/B,SAAS,QAAAC,cAAY;AAiCd,IAAM,uBAAN,MAA2B;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,cAAsB,QAAQ,IAAI,GAAG;AAC7C,SAAK,cAAc;AACnB,SAAK,YAAYA,OAAK,KAAK,aAAa,OAAO;AAC/C,SAAK,aAAaA,OAAK,KAAK,WAAW,cAAc;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAA2B;AAC7B,QAAI;AACA,YAAMD,KAAG,OAAO,KAAK,UAAU;AAC/B,aAAO;AAAA,IACX,QAAQ;AACJ,aAAO;AAAA,IACX;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAA0C;AAC5C,QAAI,CAAE,MAAM,KAAK,OAAO,GAAI;AACxB,aAAO;AAAA,IACX;AAEA,QAAI;AACA,YAAM,UAAU,MAAMA,KAAG,SAAS,KAAK,YAAY,OAAO;AAC1D,aAAO,KAAK,MAAM,OAAO;AAAA,IAC7B,SAAS,OAAO;AACZ,YAAM,IAAI;AAAA,QACN,kCAAkC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MAC5F;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,KAAK,QAA0C;AACjD,QAAI;AACA,YAAMA,KAAG,MAAM,KAAK,WAAW,EAAE,WAAW,KAAK,CAAC;AAClD,YAAMA,KAAG,UAAU,KAAK,YAAY,KAAK,UAAU,QAAQ,MAAM,CAAC,GAAG,OAAO;AAAA,IAChF,SAAS,OAAO;AACZ,YAAM,IAAI;AAAA,QACN,kCAAkC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MAC5F;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,YAAyC;AAC3C,UAAM,SAAS,MAAM,KAAK,KAAK;AAC/B,WAAO,QAAQ,SAAS;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,UAAU,aAAyC;AACrD,UAAM,iBAAkB,MAAM,KAAK,KAAK,KAAM,CAAC;AAC/C,mBAAe,QAAQ;AACvB,UAAM,KAAK,KAAK,cAAc;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,YAAY,oBAAyD;AACvE,UAAM,gBAAgB,MAAM,KAAK,UAAU;AAC3C,QAAI,CAAC,eAAe;AAChB,YAAM,IAAI,MAAM,6DAA6D;AAAA,IACjF;AAEA,UAAM,eAA4B;AAAA,MAC9B,GAAG;AAAA,MACH,GAAG;AAAA,IACP;AACA,UAAM,KAAK,UAAU,YAAY;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,UAAU,QAA4E;AACxF,UAAM,QAAQ,MAAM,KAAK,UAAU;AACnC,QAAI,CAAC,OAAO;AACR,YAAM,IAAI,MAAM,+BAA+B;AAAA,IACnD;AAEA,UAAM,UAAU,CAAC,QAAQ,GAAI,MAAM,WAAW,CAAC,CAAE,EAAE,MAAM,GAAG,CAAC;AAC7D,UAAM,KAAK,YAAY,EAAE,QAAQ,CAAC;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAwB;AACpB,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,eAAuB;AACnB,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAyB;AACrB,WAAO,KAAK;AAAA,EAChB;AACJ;;;ADjHO,SAAS,yBAAkC;AAC9C,SAAO,IAAIE,UAAQ,MAAM,EACpB,YAAY,8BAA8B,EAC1C,OAAO,mBAAmB,sBAAsB,EAChD,OAAO,qBAAqB,4DAA4D,QAAQ,EAChG,OAAO,aAAa,oBAAoB,EACxC,OAAO,OAAO,YAAY;AACvB,UAAM,gBAAgB,IAAI,cAAc;AACxC,UAAM,SAAS,MAAM,cAAc,KAAK;AAExC,QAAI,CAAC,QAAQ;AACT,YAAM,IAAI,gBAAgB,yCAAyC;AAAA,IACvE;AAEA,QAAI,aAAa,QAAQ;AAGzB,QAAI,CAAC,YAAY;AACb,cAAQ,IAAI,2CAAoC;AAEhD,YAAM,WAAW,MAAM,MAAM,GAAG,OAAO,MAAM,sBAAsB;AAAA,QAC/D,SAAS;AAAA,UACL,mBAAmB,OAAO;AAAA,QAC9B;AAAA,MACJ,CAAC;AAED,UAAI,CAAC,SAAS,IAAI;AACd,cAAM,IAAI,MAAM,4BAA4B,SAAS,UAAU,EAAE;AAAA,MACrE;AAEA,YAAM,OAAQ,MAAM,SAAS,KAAK;AAElC,UAAI,KAAK,UAAU,GAAG;AAClB,gBAAQ,IAAI,uBAAuB;AACnC;AAAA,MACJ;AAEA,mBAAa,MAAMC,QAAO;AAAA,QACtB,SAAS;AAAA,QACT,SAAS,KAAK,QAAQ,IAAI,CAAC,OAAO;AAAA,UAC9B,MAAM,GAAG,EAAE,IAAI,MAAM,EAAE,WAAW;AAAA,UAClC,OAAO,EAAE;AAAA,UACT,aAAa,IAAI,EAAE,OAAO,MAAM,EAAE,KAAK,KAAK,IAAI,CAAC;AAAA,QACrD,EAAE;AAAA,QACF,OAAO;AAAA,MACX,CAAC;AAAA,IACL;AAGA,YAAQ,IAAI;AAAA,6BAAyB,UAAU;AAAA,CAAO;AAEtD,UAAM,iBAAiB,MAAM,MAAM,GAAG,OAAO,MAAM,sBAAsB,UAAU,IAAI;AAAA,MACnF,SAAS;AAAA,QACL,mBAAmB,OAAO;AAAA,MAC9B;AAAA,IACJ,CAAC;AAED,QAAI,CAAC,eAAe,IAAI;AACpB,UAAI,eAAe,WAAW,KAAK;AAC/B,cAAM,IAAI,MAAM,WAAW,UAAU,aAAa;AAAA,MACtD;AACA,YAAM,IAAI,MAAM,2BAA2B,eAAe,UAAU,EAAE;AAAA,IAC1E;AAEA,UAAM,SAAU,MAAM,eAAe,KAAK;AAE1C,YAAQ,IAAI,kBAAa,OAAO,OAAO,IAAI,KAAK,OAAO,OAAO,OAAO,EAAE;AACvE,YAAQ,IAAI,YAAY,OAAO,KAAK,OAAO,KAAK,EAAE,MAAM,EAAE;AAG1D,QAAI,eAAe,QAAQ;AAC3B,QAAI,CAAC,CAAC,UAAU,aAAa,MAAM,EAAE,SAAS,YAAY,GAAG;AACzD,qBAAe,MAAMA,QAAO;AAAA,QACxB,SAAS;AAAA,QACT,SAAS;AAAA,UACL,EAAE,MAAM,2BAA2B,OAAO,SAAS;AAAA,UACnD,EAAE,MAAM,2BAA2B,OAAO,YAAY;AAAA,UACtD,EAAE,MAAM,QAAQ,OAAO,OAAO;AAAA,QAClC;AAAA,QACA,OAAO;AAAA,MACX,CAAC;AAAA,IACL;AAGA,QAAI,CAAC,QAAQ,KAAK;AACd,YAAM,UAAU,MAAMC,UAAQ;AAAA,QAC1B,SAAS,iBAAiB,OAAO,OAAO,IAAI;AAAA,QAC5C,SAAS;AAAA,MACb,CAAC;AAED,UAAI,CAAC,SAAS;AACV,gBAAQ,IAAI,YAAY;AACxB;AAAA,MACJ;AAAA,IACJ;AAEA,YAAQ,IAAI,kCAA2B;AAGvC,QAAI,iBAAiB,YAAY,iBAAiB,QAAQ;AACtD,YAAM,kBAAkB,MAAM;AAAA,IAClC;AAEA,QAAI,iBAAiB,eAAe,iBAAiB,QAAQ;AACzD,YAAM,oBAAoB,MAAM;AAAA,IACpC;AAGA,UAAM,uBAAuB,IAAI,qBAAqB;AACtD,UAAM,cAA2B;AAAA,MAC7B,QAAQ,OAAO,OAAO;AAAA,MACtB,SAAS,OAAO,OAAO;AAAA,MACvB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,MAAM,CAAC;AAAA,MACP,eAAe;AAAA,IACnB;AAEA,UAAM,qBAAqB,UAAU,WAAW;AAChD,YAAQ,IAAI,mCAA8B;AAE1C,YAAQ,IAAI,yCAAoC;AAChD,YAAQ,IAAI,aAAa;AACzB,YAAQ,IAAI,uDAAuD;AACnE,YAAQ,IAAI,8BAA8B;AAC1C,YAAQ,IAAI,kEAAkE;AAAA,EAClF,CAAC;AACT;AAEA,eAAe,kBAAkB,QAAqC;AAClE,QAAM,WAAWC,OAAK,QAAQ,IAAI,GAAG,WAAW,OAAO;AAGvD,QAAMC,KAAG,MAAM,UAAU,EAAE,WAAW,KAAK,CAAC;AAG5C,aAAW,CAAC,UAAU,OAAO,KAAK,OAAO,QAAQ,OAAO,KAAK,GAAG;AAC5D,UAAM,WAAWD,OAAK,UAAU,QAAQ;AACxC,UAAMC,KAAG,UAAU,UAAU,SAAS,OAAO;AAC7C,YAAQ,IAAI,gCAA2B,QAAQ,EAAE;AAAA,EACrD;AACJ;AAEA,eAAe,oBAAoB,QAAqC;AACpE,QAAM,WAAqB,CAAC;AAG5B,WAAS,KAAK,eAAe;AAC7B,WAAS,KAAK,0CAA0C,OAAO,OAAO,IAAI,KAAK,OAAO,OAAO,OAAO;AAAA,CAAQ;AAG5G,QAAM,YAAY;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AAEA,aAAW,YAAY,WAAW;AAC9B,QAAI,OAAO,MAAM,QAAQ,GAAG;AACxB,YAAM,UAAU,OAAO,MAAM,QAAQ;AAErC,YAAM,qBAAqB,QAAQ,QAAQ,yBAAyB,EAAE;AACtE,eAAS,KAAK,mBAAmB,KAAK,CAAC;AACvC,eAAS,KAAK,IAAI;AAAA,IACtB;AAAA,EACJ;AAEA,QAAM,WAAW,SAAS,KAAK,IAAI;AACnC,QAAMA,KAAG,UAAU,aAAa,UAAU,OAAO;AACjD,UAAQ,IAAI,0BAAqB;AACrC;;;AEtNA,SAAS,WAAAC,iBAAe;AACxB,SAAS,YAAYC,YAAU;AAC/B,SAAS,QAAAC,cAAY;AACrB,SAAS,UAAAC,SAAQ,WAAAC,WAAgB,YAAAC,iBAAgB;;;AC+B1C,IAAM,wBAAN,MAA4B;AAAA;AAAA;AAAA;AAAA,EAI/B,eAAe,QAAsB,OAAgC;AACjE,UAAM,SAAS,YAAY,KAAK;AAChC,QAAI,CAAC,QAAQ;AACT,YAAM,IAAI,MAAM,uBAAuB,KAAK,EAAE;AAAA,IAClD;AAEA,YAAQ,OAAO;AAAA,MACX,KAAK;AACD,eAAO,KAAK,oBAAoB,QAAQ,MAAM;AAAA,MAClD,KAAK;AACD,eAAO,KAAK,sBAAsB,QAAQ,MAAM;AAAA,MACpD,KAAK;AACD,eAAO,KAAK,yBAAyB,QAAQ,MAAM;AAAA,MACvD,KAAK;AACD,eAAO,KAAK,oBAAoB,QAAQ,MAAM;AAAA,MAClD,KAAK;AACD,eAAO,KAAK,iBAAiB,QAAQ,MAAM;AAAA,MAC/C,KAAK;AACD,eAAO,KAAK,iBAAiB,QAAQ,MAAM;AAAA,MAC/C;AACI,cAAM,IAAI,MAAM,2BAA2B,KAAK,EAAE;AAAA,IAC1D;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,QAAsB,QAAoC;AAClF,UAAM,QAAyB,CAAC;AAGhC,eAAW,CAAC,UAAU,OAAO,KAAK,OAAO,QAAQ,OAAO,KAAK,GAAG;AAC5D,YAAM,KAAK;AAAA,QACP,MAAM,GAAG,OAAO,SAAS,IAAI,QAAQ;AAAA,QACrC;AAAA;AAAA,QACA,aAAa,gBAAgB,QAAQ;AAAA,MACzC,CAAC;AAAA,IACL;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAAsB,QAAsB,QAAoC;AACpF,UAAM,QAAyB,CAAC;AAGhC,eAAW,CAAC,UAAU,OAAO,KAAK,OAAO,QAAQ,OAAO,KAAK,GAAG;AAC5D,YAAM,YAAY,KAAK,kBAAkB,SAAS,QAAQ;AAC1D,YAAM,cAAc,SAAS,QAAQ,UAAU,KAAK;AAEpD,YAAM,KAAK;AAAA,QACP,MAAM,GAAG,OAAO,SAAS,IAAI,WAAW;AAAA,QACxC,SAAS;AAAA,QACT,aAAa,gBAAgB,WAAW;AAAA,MAC5C,CAAC;AAAA,IACL;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,SAAiB,UAA0B;AAEjE,UAAM,mBAAmB,QAAQ,MAAM,mCAAmC;AAC1E,QAAI,CAAC,kBAAkB;AACnB,aAAO;AAAA,IACX;AAEA,UAAM,CAAC,EAAE,aAAa,IAAI,IAAI;AAC9B,UAAM,SAAS,KAAK,iBAAiB,WAAW;AAGhD,QAAI,UAAU;AACd,QAAI,OAAO,gBAAgB,UAAU,OAAO,gBAAgB,MAAM;AAC9D,gBAAU;AAAA,IACd,WAAW,OAAO,SAAS,OAAO,MAAM,SAAS,GAAG;AAChD,gBAAU,OAAO,MAAM,KAAK,IAAI;AAAA,IACpC;AAGA,UAAM,sBAAsB;AAAA,WACzB,OAAO;AAAA;AAGV,WAAO,GAAG,mBAAmB;AAAA;AAAA,EAAO,KAAK,KAAK,CAAC;AAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKQ,yBAAyB,QAAsB,QAAoC;AACvF,UAAM,QAAyB,CAAC;AAGhC,eAAW,CAAC,UAAU,OAAO,KAAK,OAAO,QAAQ,OAAO,KAAK,GAAG;AAC5D,YAAM,YAAY,KAAK,qBAAqB,SAAS,QAAQ;AAC7D,YAAM,cAAc,SAAS,QAAQ,UAAU,KAAK;AAEpD,YAAM,KAAK;AAAA,QACP,MAAM,GAAG,OAAO,SAAS,IAAI,WAAW;AAAA,QACxC,SAAS;AAAA,QACT,aAAa,gBAAgB,WAAW;AAAA,MAC5C,CAAC;AAAA,IACL;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAqB,SAAiB,UAA0B;AAEpE,UAAM,mBAAmB,QAAQ,MAAM,mCAAmC;AAC1E,QAAI,CAAC,kBAAkB;AACnB,aAAO;AAAA,IACX;AAEA,UAAM,CAAC,EAAE,aAAa,IAAI,IAAI;AAC9B,UAAM,SAAS,KAAK,iBAAiB,WAAW;AAGhD,QAAI,UAAU;AACd,QAAI,OAAO,gBAAgB,UAAU,OAAO,gBAAgB,MAAM;AAC9D,gBAAU;AAAA,IACd;AAGA,UAAM,yBAAyB;AAAA,WAC5B,OAAO;AAAA;AAAA;AAAA;AAKV,WAAO,GAAG,sBAAsB;AAAA;AAAA,EAAO,KAAK,KAAK,CAAC;AAAA;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,QAAsB,QAAoC;AAClF,UAAM,QAAyB,CAAC;AAGhC,eAAW,CAAC,UAAU,OAAO,KAAK,OAAO,QAAQ,OAAO,KAAK,GAAG;AAC5D,YAAM,YAAY,KAAK,gBAAgB,SAAS,QAAQ;AACxD,YAAM,cAAc,SAAS,QAAQ,UAAU,KAAK;AAEpD,YAAM,KAAK;AAAA,QACP,MAAM,GAAG,OAAO,SAAS,IAAI,WAAW;AAAA,QACxC,SAAS;AAAA,QACT,aAAa,gBAAgB,WAAW;AAAA,MAC5C,CAAC;AAAA,IACL;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,SAAiB,UAA0B;AAE/D,UAAM,mBAAmB,QAAQ,MAAM,mCAAmC;AAC1E,QAAI,CAAC,kBAAkB;AACnB,aAAO;AAAA,IACX;AAEA,UAAM,CAAC,EAAE,aAAa,IAAI,IAAI;AAC9B,UAAM,SAAS,KAAK,iBAAiB,WAAW;AAGhD,QAAI,WAAW;AAAA,eACR,OAAO,eAAe,MAAM;AAEnC,QAAI,OAAO,SAAS,OAAO,MAAM,SAAS,GAAG;AAEzC,YAAM,QAAQ,OAAO,MAAM,IAAI,CAAC,MAAc,EAAE,QAAQ,YAAY,EAAE,CAAC,EAAE,KAAK,IAAI;AAClF,kBAAY;AAAA,SAAY,KAAK;AAAA,IACjC;AAEA,gBAAY;AAEZ,WAAO,GAAG,QAAQ;AAAA;AAAA,EAAO,KAAK,KAAK,CAAC;AAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,QAAsB,QAAoC;AAC/E,UAAM,WAAqB,CAAC;AAG5B,aAAS,KAAK,eAAe;AAC7B,aAAS,KAAK,0CAA0C,OAAO,OAAO,IAAI,KAAK,OAAO,OAAO,OAAO;AAAA,CAAQ;AAG5G,UAAM,YAAY;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AAEA,eAAW,YAAY,WAAW;AAC9B,UAAI,OAAO,MAAM,QAAQ,GAAG;AACxB,cAAM,UAAU,OAAO,MAAM,QAAQ;AACrC,cAAM,qBAAqB,KAAK,kBAAkB,OAAO;AAEzD,YAAI,mBAAmB,KAAK,GAAG;AAC3B,mBAAS,KAAK,mBAAmB,KAAK,CAAC;AACvC,mBAAS,KAAK,IAAI;AAAA,QACtB;AAAA,MACJ;AAAA,IACJ;AAEA,UAAM,WAAW,SAAS,KAAK,IAAI;AAEnC,WAAO;AAAA,MACH;AAAA,QACI,MAAM;AAAA,QACN,SAAS;AAAA,QACT,aAAa;AAAA,MACjB;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,QAAsB,QAAoC;AAC/E,UAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yCAciB,OAAO,OAAO,IAAI,KAAK,OAAO,OAAO,OAAO;AAAA;AAG7E,WAAO;AAAA,MACH;AAAA,QACI,MAAM;AAAA,QACN;AAAA,QACA,aAAa;AAAA,MACjB;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,SAAyB;AAC/C,WAAO,QAAQ,QAAQ,yBAAyB,EAAE;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,aAA0C;AAC/D,UAAM,SAA8B,CAAC;AACrC,UAAM,QAAQ,YAAY,MAAM,IAAI;AAEpC,eAAW,QAAQ,OAAO;AACtB,YAAM,QAAQ,KAAK,MAAM,iBAAiB;AAC1C,UAAI,OAAO;AACP,cAAM,CAAC,EAAE,KAAK,KAAK,IAAI;AAGvB,YAAI,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,GAAG,GAAG;AAC9C,iBAAO,GAAG,IAAI,MACT,MAAM,GAAG,EAAE,EACX,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,gBAAgB,EAAE,CAAC;AAAA,QACxD,WAAW,UAAU,UAAU,UAAU,SAAS;AAC9C,iBAAO,GAAG,IAAI,UAAU;AAAA,QAC5B,OAAO;AACH,iBAAO,GAAG,IAAI,MAAM,QAAQ,gBAAgB,EAAE;AAAA,QAClD;AAAA,MACJ;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,mBAA6B;AACzB,WAAO,OAAO,KAAK,WAAW;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,OAAwB;AAC/B,WAAO,SAAS;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,OAAsC;AAC/C,WAAO,YAAY,KAAK;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,uBAAuB,MAA0B;AAC7C,UAAM,WAAW,IAAI,IAAY,IAAI;AAErC,eAAW,OAAO,MAAM;AACpB,YAAM,SAAS,YAAY,GAAG;AAC9B,UAAI,QAAQ,cAAc;AACtB,eAAO,aAAa,QAAQ,CAAC,QAAQ,SAAS,IAAI,GAAG,CAAC;AAAA,MAC1D;AAAA,IACJ;AAEA,WAAO,MAAM,KAAK,QAAQ;AAAA,EAC9B;AACJ;;;AC3XA,SAAS,YAAYC,YAAU;AAC/B,SAAS,QAAAC,QAAM,eAAyB;AAejC,IAAM,gBAAN,MAAoB;AAAA,EACf,YAAY;AAAA;AAAA;AAAA;AAAA,EAKpB,MAAM,aAAa,MAAgB,YAA6C;AAC5E,UAAM,aAAY,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,SAAS,GAAG;AAC/D,UAAM,aAAaC,OAAK,KAAK,WAAW,SAAS;AAEjD,UAAM,gBAID,CAAC;AAEN,QAAI,aAAa;AAEjB,eAAW,SAAS,MAAM;AACtB,YAAM,SAAS,YAAY,KAAK;AAChC,UAAI,CAAC,QAAQ;AACT,gBAAQ,KAAK,uBAAuB,KAAK,mBAAmB;AAC5D;AAAA,MACJ;AAGA,YAAM,YAAY,OAAO,cAAc,MAAM,QAAQ,IAAI,IAAIA,OAAK,QAAQ,IAAI,GAAG,OAAO,SAAS;AAEjG,UAAI;AACA,cAAM,SAAS,MAAM,KAAK,WAAW,SAAS;AAE9C,YAAI,CAAC,QAAQ;AACT;AAAA,QACJ;AAGA,YAAI,UAAU,YAAY;AACtB,gBAAM,KAAK,iBAAiB,aAAa,YAAY,OAAO,aAAa;AACzE,uBAAa;AAAA,QACjB,WAAW,UAAU,UAAU;AAC3B,gBAAM,KAAK,iBAAiB,aAAa,YAAY,OAAO,aAAa;AACzE,uBAAa;AAAA,QACjB,OAAO;AAEH,gBAAM,QAAQ,MAAMC,KAAG,KAAK,SAAS;AACrC,cAAI,MAAM,YAAY,GAAG;AACrB,kBAAM,QAAQ,MAAMA,KAAG,QAAQ,SAAS;AAExC,uBAAW,QAAQ,OAAO;AACtB,kBAAI,KAAK,SAAS,OAAO,aAAa,GAAG;AACrC,sBAAM,eAAeD,OAAK,WAAW,IAAI;AACzC,sBAAM,eAAeA,OAAK,OAAO,WAAW,IAAI;AAChD,sBAAM,WAAWA,OAAK,YAAY,OAAO,IAAI;AAE7C,sBAAMC,KAAG,MAAM,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AACrD,sBAAMA,KAAG,SAAS,cAAc,QAAQ;AAExC,8BAAc,KAAK;AAAA,kBACf,cAAc;AAAA,kBACd,YAAYD,OAAK,OAAO,IAAI;AAAA,kBAC5B,KAAK;AAAA,gBACT,CAAC;AAED,6BAAa;AAAA,cACjB;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ,SAAS,OAAO;AAEZ;AAAA,MACJ;AAAA,IACJ;AAGA,QAAI,CAAC,YAAY;AACb,aAAO;AAAA,IACX;AAGA,UAAM,WAA2B;AAAA,MAC7B;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA,OAAO;AAAA,IACX;AAEA,UAAMC,KAAG,MAAM,YAAY,EAAE,WAAW,KAAK,CAAC;AAC9C,UAAMA,KAAG;AAAA,MACLD,OAAK,YAAY,eAAe;AAAA,MAChC,KAAK,UAAU,UAAU,MAAM,CAAC;AAAA,MAChC;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,iBACV,UACA,YACA,OACA,eACa;AACb,UAAM,eAAeA,OAAK,QAAQ,IAAI,GAAG,QAAQ;AAEjD,QAAI;AACA,YAAM,SAAS,MAAM,KAAK,WAAW,YAAY;AACjD,UAAI,CAAC,QAAQ;AACT;AAAA,MACJ;AAEA,YAAM,WAAWA,OAAK,YAAY,OAAO,QAAQ;AACjD,YAAMC,KAAG,MAAM,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AACrD,YAAMA,KAAG,SAAS,cAAc,QAAQ;AAExC,oBAAc,KAAK;AAAA,QACf,cAAc;AAAA,QACd,YAAYD,OAAK,OAAO,QAAQ;AAAA,QAChC,KAAK;AAAA,MACT,CAAC;AAAA,IACL,SAAS,OAAO;AAAA,IAEhB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,YAAmC;AACnD,UAAM,eAAeA,OAAK,YAAY,eAAe;AACrD,UAAM,kBAAkB,MAAMC,KAAG,SAAS,cAAc,OAAO;AAC/D,UAAM,WAA2B,KAAK,MAAM,eAAe;AAE3D,YAAQ,IAAI;AAAA,wBAA2B,SAAS,SAAS,KAAK;AAE9D,eAAW,QAAQ,SAAS,OAAO;AAC/B,YAAM,aAAaD,OAAK,YAAY,KAAK,UAAU;AACnD,YAAM,WAAWA,OAAK,QAAQ,IAAI,GAAG,KAAK,YAAY;AAEtD,YAAMC,KAAG,MAAM,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AACrD,YAAMA,KAAG,SAAS,YAAY,QAAQ;AAEtC,cAAQ,IAAI,mBAAc,KAAK,YAAY,EAAE;AAAA,IACjD;AAEA,YAAQ,IAAI,wCAAmC;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAyC;AAC3C,QAAI;AACA,YAAM,gBAAgBD,OAAK,QAAQ,IAAI,GAAG,KAAK,SAAS;AACxD,YAAM,SAAS,MAAM,KAAK,WAAW,aAAa;AAElD,UAAI,CAAC,QAAQ;AACT,eAAO,CAAC;AAAA,MACZ;AAEA,YAAM,UAAU,MAAMC,KAAG,QAAQ,eAAe,EAAE,eAAe,KAAK,CAAC;AACvE,YAAM,UAA4B,CAAC;AAEnC,iBAAW,SAAS,SAAS;AACzB,YAAI,MAAM,YAAY,GAAG;AACrB,gBAAM,eAAeD,OAAK,eAAe,MAAM,MAAM,eAAe;AAEpE,cAAI;AACA,kBAAM,kBAAkB,MAAMC,KAAG,SAAS,cAAc,OAAO;AAC/D,kBAAM,WAA2B,KAAK,MAAM,eAAe;AAC3D,oBAAQ,KAAK,QAAQ;AAAA,UACzB,QAAQ;AAEJ;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAGA,aAAO,QAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,UAAU,cAAc,EAAE,SAAS,CAAC;AAAA,IACxE,QAAQ;AACJ,aAAO,CAAC;AAAA,IACZ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,WAAkC;AACjD,UAAM,aAAaD,OAAK,QAAQ,IAAI,GAAG,KAAK,WAAW,SAAS;AAChE,UAAM,KAAK,gBAAgB,UAAU;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,aAAqB,IAAqB;AAC9D,UAAM,UAAU,MAAM,KAAK,YAAY;AACvC,UAAM,aAAa,oBAAI,KAAK;AAC5B,eAAW,QAAQ,WAAW,QAAQ,IAAI,UAAU;AAEpD,QAAI,eAAe;AAEnB,eAAW,UAAU,SAAS;AAC1B,YAAM,aAAa,IAAI,KAAK,OAAO,SAAS;AAE5C,UAAI,aAAa,YAAY;AACzB,cAAM,KAAK,aAAa,OAAO,SAAS;AACxC;AAAA,MACJ;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkD;AACpD,UAAM,UAAU,MAAM,KAAK,YAAY;AACvC,WAAO,QAAQ,SAAS,IAAI,QAAQ,CAAC,IAAI;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,WAAWE,QAAgC;AACrD,QAAI;AACA,YAAMD,KAAG,OAAOC,MAAI;AACpB,aAAO;AAAA,IACX,QAAQ;AACJ,aAAO;AAAA,IACX;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,gBAAgBA,QAA6B;AACvD,QAAI;AACA,YAAM,SAAS,MAAM,KAAK,WAAWA,MAAI;AACzC,UAAI,CAAC,QAAQ;AACT;AAAA,MACJ;AAEA,YAAM,UAAU,MAAMD,KAAG,QAAQC,QAAM,EAAE,eAAe,KAAK,CAAC;AAE9D,iBAAW,SAAS,SAAS;AACzB,cAAM,WAAWF,OAAKE,QAAM,MAAM,IAAI;AAEtC,YAAI,MAAM,YAAY,GAAG;AACrB,gBAAM,KAAK,gBAAgB,QAAQ;AAAA,QACvC,OAAO;AACH,gBAAMD,KAAG,OAAO,QAAQ;AAAA,QAC5B;AAAA,MACJ;AAEA,YAAMA,KAAG,MAAMC,MAAI;AAAA,IACvB,SAAS,OAAO;AAAA,IAEhB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,eAAuB;AACnB,WAAOF,OAAK,QAAQ,IAAI,GAAG,KAAK,SAAS;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAiC;AACnC,UAAM,gBAAgBA,OAAK,QAAQ,IAAI,GAAG,KAAK,SAAS;AACxD,UAAMC,KAAG,MAAM,eAAe,EAAE,WAAW,KAAK,CAAC;AAAA,EACrD;AACJ;;;AF9OO,SAAS,0BAAmC;AAC/C,SAAO,IAAIE,UAAQ,OAAO,EACrB,YAAY,qDAAqD,EACjE,SAAS,YAAY,iCAAiC,EACtD,OAAO,iBAAiB,0FAA0F,EAClH,OAAO,iBAAiB,sBAAsB,EAC9C,OAAO,aAAa,oCAAoC,EACxD,OAAO,OAAO,YAAgC,YAAY;AACvD,UAAM,gBAAgB,IAAI,cAAc;AACxC,UAAM,SAAS,MAAM,cAAc,KAAK;AAExC,QAAI,CAAC,QAAQ;AACT,YAAM,IAAI,gBAAgB,yCAAyC;AAAA,IACvE;AAEA,UAAM,mBAAmB,IAAI,sBAAsB;AACnD,UAAM,gBAAgB,IAAI,cAAc;AAGxC,UAAM,WAAW,QAAQ,QAAQ;AACjC,UAAM,aAAa,QAAQ,eAAe;AAC1C,QAAI,eAAyB,CAAC;AAE9B,QAAI,QAAQ,MAAM;AACd,qBAAgB,QAAQ,KACnB,MAAM,GAAG,EACT,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,EACvB,OAAO,CAAC,QAAQ,iBAAiB,WAAW,GAAG,CAAC;AAErD,UAAI,aAAa,WAAW,GAAG;AAC3B,cAAM,IAAI,gBAAgB,gCAAgC;AAAA,MAC9D;AAAA,IACJ;AAGA,QAAI,CAAC,YAAY;AACb,cAAQ,IAAI,2CAAoC;AAEhD,YAAM,WAAW,MAAM,MAAM,GAAG,OAAO,MAAM,sBAAsB;AAAA,QAC/D,SAAS;AAAA,UACL,mBAAmB,OAAO;AAAA,QAC9B;AAAA,MACJ,CAAC;AAED,UAAI,CAAC,SAAS,IAAI;AACd,cAAM,IAAI,MAAM,4BAA4B,SAAS,UAAU,EAAE;AAAA,MACrE;AAEA,YAAM,OAAQ,MAAM,SAAS,KAAK;AAElC,UAAI,KAAK,UAAU,GAAG;AAClB,gBAAQ,IAAI,uBAAuB;AACnC;AAAA,MACJ;AAEA,mBAAa,MAAMC,QAAO;AAAA,QACtB,SAAS;AAAA,QACT,SAAS,KAAK,QAAQ,IAAI,CAAC,OAAO;AAAA,UAC9B,MAAM,GAAG,EAAE,IAAI,MAAM,EAAE,WAAW;AAAA,UAClC,OAAO,EAAE;AAAA,UACT,aAAa,IAAI,EAAE,OAAO,MAAM,EAAE,KAAK,KAAK,IAAI,CAAC;AAAA,QACrD,EAAE;AAAA,QACF,OAAO;AAAA,MACX,CAAC;AAAA,IACL;AAGA,YAAQ,IAAI;AAAA,6BAAyB,UAAU;AAAA,CAAO;AAEtD,UAAM,iBAAiB,MAAM,MAAM,GAAG,OAAO,MAAM,sBAAsB,UAAU,IAAI;AAAA,MACnF,SAAS;AAAA,QACL,mBAAmB,OAAO;AAAA,MAC9B;AAAA,IACJ,CAAC;AAED,QAAI,CAAC,eAAe,IAAI;AACpB,UAAI,eAAe,WAAW,KAAK;AAC/B,cAAM,IAAI,MAAM,WAAW,UAAU,aAAa;AAAA,MACtD;AACA,YAAM,IAAI,MAAM,2BAA2B,eAAe,UAAU,EAAE;AAAA,IAC1E;AAEA,UAAM,SAAU,MAAM,eAAe,KAAK;AAE1C,YAAQ,IAAI,kBAAa,OAAO,OAAO,IAAI,KAAK,OAAO,OAAO,OAAO,EAAE;AACvE,YAAQ,IAAI,YAAY,OAAO,KAAK,OAAO,KAAK,EAAE,MAAM,EAAE;AAG1D,QAAI,aAAa,WAAW,GAAG;AAC3B,UAAI,UAAU;AAEV,uBAAe,CAAC,QAAQ;AAAA,MAC5B,OAAO;AAEH,cAAM,mBAAmB,IAAI,oBAAoB;AACjD,cAAM,cAAc,MAAM,iBAAiB,YAAY;AACvD,cAAM,WAAW,MAAM,iBAAiB,iBAAiB;AAGzD,YAAI,YAAY,SAAS,GAAG;AACxB,kBAAQ,IAAI,wDAAiD;AAC7D,sBAAY,MAAM,GAAG,CAAC,EAAE,QAAQ,OAAK;AACjC,kBAAM,WAAW,EAAE,aAAa,SAAS,WAAM,EAAE,aAAa,WAAW,cAAO;AAChF,oBAAQ,IAAI,GAAG,QAAQ,IAAI,EAAE,IAAI,MAAM,EAAE,MAAM,EAAE;AAAA,UACrD,CAAC;AACD,kBAAQ,IAAI,EAAE;AAAA,QAClB;AAGA,cAAM,UAAU;AAAA,UACZ;AAAA,YACI,MAAM;AAAA,YACN,OAAO;AAAA,YACP,SAAS,YAAY,KAAK,OAAK,EAAE,UAAU,QAAQ,KAAK,SAAS,KAAK,OAAK,EAAE,OAAO,QAAQ;AAAA,UAChG;AAAA,UACA;AAAA,YACI,MAAM;AAAA,YACN,OAAO;AAAA,YACP,SAAS,SAAS,KAAK,OAAK,EAAE,OAAO,UAAU;AAAA,UACnD;AAAA,UACA;AAAA,YACI,MAAM;AAAA,YACN,OAAO;AAAA,YACP,SAAS,SAAS,KAAK,OAAK,EAAE,OAAO,aAAa;AAAA,UACtD;AAAA,UACA;AAAA,YACI,MAAM;AAAA,YACN,OAAO;AAAA,YACP,SAAS,YAAY,KAAK,OAAK,EAAE,UAAU,QAAQ,KAAK,SAAS,KAAK,OAAK,EAAE,OAAO,QAAQ;AAAA,UAChG;AAAA,UACA;AAAA,YACI,MAAM;AAAA,YACN,OAAO;AAAA,YACP,SAAS,YAAY,KAAK,OAAK,EAAE,UAAU,UAAU;AAAA,UACzD;AAAA,UACA;AAAA,YACI,MAAM;AAAA,YACN,OAAO;AAAA,YACP,SAAS,SAAS,KAAK,OAAK,EAAE,OAAO,QAAQ;AAAA,UACjD;AAAA,QACJ;AAEA,uBAAe,MAAMC,UAAS;AAAA,UAC1B,SAAS;AAAA,UACT;AAAA,UACA,UAAU;AAAA,UACV,OAAO;AAAA,QACX,CAAC;AAAA,MACL;AAAA,IACJ;AAGA,UAAM,eAAe,iBAAiB,uBAAuB,YAAY;AAEzE,QAAI,aAAa,SAAS,aAAa,QAAQ;AAC3C,YAAM,YAAY,aAAa,OAAO,CAAC,QAAQ,CAAC,aAAa,SAAS,GAAG,CAAC;AAC1E,cAAQ,IAAI;AAAA,qCAAiC,UAAU,KAAK,IAAI,CAAC,EAAE;AAAA,IACvE;AAGA,QAAI,aAA4B;AAEhC,QAAI,CAAC,YAAY;AACb,cAAQ,IAAI,kDAA2C;AAEvD,UAAI;AACA,qBAAa,MAAM,cAAc,aAAa,cAAc,UAAU;AAEtE,YAAI,YAAY;AACZ,kBAAQ,IAAI,0BAAqB,UAAU,EAAE;AAAA,QACjD,OAAO;AACH,kBAAQ,IAAI,oCAA+B;AAAA,QAC/C;AAAA,MACJ,SAAS,OAAO;AACZ,gBAAQ,KAAK,gDAAsC;AAAA,MACvD;AAAA,IACJ;AAGA,QAAI,CAAC,UAAU;AACX,cAAQ,IAAI,sBAAe;AAC3B,cAAQ,IAAI,aAAa,OAAO,OAAO,IAAI,KAAK,OAAO,OAAO,OAAO,EAAE;AACvE,cAAQ,IAAI,WAAW,aAAa,KAAK,IAAI,CAAC,EAAE;AAChD,cAAQ,IAAI,YAAY,OAAO,KAAK,OAAO,KAAK,EAAE,MAAM,aAAa;AACrE,UAAI,YAAY;AACZ,gBAAQ,IAAI,aAAa,UAAU,EAAE;AAAA,MACzC;AAEA,YAAM,UAAU,MAAMC,UAAQ;AAAA,QAC1B,SAAS;AAAA,QACT,SAAS;AAAA,MACb,CAAC;AAED,UAAI,CAAC,SAAS;AACV,gBAAQ,IAAI,YAAY;AACxB;AAAA,MACJ;AAAA,IACJ;AAGA,YAAQ,IAAI,kCAA2B;AAGvC,UAAM,gBAAgBC,OAAK,QAAQ,IAAI,GAAG,SAAS,aAAa;AAGhE,QAAI;AACA,YAAMC,KAAG,GAAG,eAAe,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,IAC/D,QAAQ;AAAA,IAER;AAGA,UAAMA,KAAG,MAAM,eAAe,EAAE,WAAW,KAAK,CAAC;AAGjD,UAAMA,KAAG;AAAA,MACLD,OAAK,eAAe,aAAa;AAAA,MACjC,KAAK,UAAU,OAAO,QAAQ,MAAM,CAAC;AAAA,MACrC;AAAA,IACJ;AAGA,eAAW,CAAC,UAAU,OAAO,KAAK,OAAO,QAAQ,OAAO,KAAK,GAAG;AAC5D,YAAM,WAAWA,OAAK,eAAe,QAAQ;AAC7C,YAAMC,KAAG,MAAMD,OAAK,UAAU,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AACxD,YAAMC,KAAG,UAAU,UAAU,SAAS,OAAO;AAAA,IACjD;AAEA,YAAQ,IAAI,2CAAsC;AAElD,UAAM,oBAA+E,CAAC;AAEtF,eAAW,SAAS,cAAc;AAC9B,UAAI;AACA,cAAM,QAAQ,iBAAiB,eAAe,QAAQ,KAAK;AAE3D,mBAAW,QAAQ,OAAO;AACtB,gBAAM,WAAWD,OAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;AAC9C,gBAAMC,KAAG,MAAMD,OAAK,UAAU,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AACxD,gBAAMC,KAAG,UAAU,UAAU,KAAK,SAAS,OAAO;AAElD,kBAAQ,IAAI,WAAM,KAAK,KAAK,KAAK,IAAI,EAAE;AAEvC,4BAAkB,KAAK;AAAA,YACnB,KAAK;AAAA,YACL,MAAM,KAAK;AAAA,YACX,aAAa,KAAK;AAAA,UACtB,CAAC;AAAA,QACL;AAAA,MACJ,SAAS,OAAO;AACZ,gBAAQ,MAAM,6BAAwB,KAAK,WAAW,KAAK;AAAA,MAC/D;AAAA,IACJ;AAGA,UAAM,uBAAuB,IAAI,qBAAqB;AACtD,UAAM,cAA2B;AAAA,MAC7B,QAAQ,OAAO,OAAO;AAAA,MACtB,SAAS,OAAO,OAAO;AAAA,MACvB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,MAAM;AAAA,MACN,eAAe;AAAA,MACf,SAAS,aACH;AAAA,QACI;AAAA,UACI,MAAM;AAAA,UACN,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,UAClC,MAAM;AAAA,QACV;AAAA,MACJ,IACA,CAAC;AAAA,IACX;AAGA,QAAI;AACA,YAAM,gBAAgB,MAAM,qBAAqB,UAAU;AAG3D,UAAI,eAAe,WAAW,cAAc,QAAQ,SAAS,GAAG;AAC5D,oBAAY,UAAU;AAAA,UAClB,GAAG,YAAY;AAAA,UACf,GAAG,cAAc,QAAQ,MAAM,GAAG,CAAC;AAAA;AAAA,QACvC;AAAA,MACJ;AAAA,IACJ,QAAQ;AAAA,IAER;AAEA,UAAM,qBAAqB,UAAU,WAAW;AAChD,YAAQ,IAAI,qCAAgC;AAG5C,YAAQ,IAAI,yCAAoC;AAChD,YAAQ,IAAI,oBAAa;AACzB,YAAQ,IAAI,eAAe,kBAAkB,MAAM,iBAAiB,aAAa,MAAM,SAAS;AAGhG,UAAM,aAAa,aAAa,OAAO,CAAC,KAAK,QAAQ;AACjD,UAAI,GAAG,IAAI,kBAAkB,OAAO,CAAC,MAAM,EAAE,QAAQ,GAAG,EAAE;AAC1D,aAAO;AAAA,IACX,GAAG,CAAC,CAA2B;AAE/B,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,UAAU,GAAG;AACnD,YAAM,SAAS,YAAY,GAAG;AAC9B,cAAQ,IAAI,OAAO,QAAQ,IAAI,KAAK,KAAK,QAAQ;AAAA,IACrD;AAEA,QAAI,YAAY;AACZ,cAAQ,IAAI;AAAA,6BAAyB,UAAU,EAAE;AACjD,cAAQ,IAAI,kDAAkD;AAAA,IAClE;AAEA,YAAQ,IAAI,yBAAkB;AAC9B,YAAQ,IAAI,yCAAyC;AACrD,YAAQ,IAAI,yDAAyD;AACrE,YAAQ,IAAI,sDAAsD;AAClE,YAAQ,IAAI,8BAA8B;AAC1C,YAAQ,IAAI,yDAAyD;AAAA,EACzE,CAAC;AACT;;;AG3XA,SAAS,WAAAC,iBAAe;AAExB,SAAS,QAAAC,cAAY;AACrB,SAAS,UAAAC,SAAQ,WAAAC,iBAAe;AAKzB,SAAS,4BAAqC;AACjD,SAAO,IAAIC,UAAQ,SAAS,EACvB,YAAY,6BAA6B,EACzC,OAAO,YAAY,gCAAgC,EACnD,OAAO,aAAa,mBAAmB,EACvC,OAAO,OAAO,YAAY;AACvB,UAAM,gBAAgB,IAAI,cAAc;AAGxC,UAAM,UAAU,MAAM,cAAc,YAAY;AAEhD,QAAI,QAAQ,WAAW,GAAG;AACtB,cAAQ,IAAI,uBAAuB;AACnC;AAAA,IACJ;AAEA,QAAI;AAEJ,QAAI,QAAQ,QAAQ;AAChB,uBAAiB,QAAQ,CAAC;AAC1B,cAAQ,IAAI,qCAA8B,eAAe,SAAS,EAAE;AAAA,IACxE,OAAO;AAEH,cAAQ,IAAI,gCAAyB;AAErC,YAAM,kBAAkB,MAAMC,QAAO;AAAA,QACjC,SAAS;AAAA,QACT,SAAS,QAAQ,IAAI,CAAC,YAAY;AAAA,UAC9B,MAAM,iBAAiB,MAAM;AAAA,UAC7B,OAAO,OAAO;AAAA,UACd,aAAa,GAAG,OAAO,MAAM,MAAM,kBAAkB,OAAO,KAAK,KAAK,IAAI,CAAC;AAAA,QAC/E,EAAE;AAAA,QACF,OAAO;AAAA,MACX,CAAC;AAED,uBAAiB,QAAQ,KAAK,CAAC,MAAM,EAAE,cAAc,eAAe;AAEpE,UAAI,CAAC,gBAAgB;AACjB,cAAM,IAAI,gBAAgB,kBAAkB;AAAA,MAChD;AAAA,IACJ;AAGA,YAAQ,IAAI,6BAAsB;AAClC,YAAQ,IAAI,gBAAgB,gBAAgB,eAAe,SAAS,CAAC,EAAE;AACvE,YAAQ,IAAI,aAAa,eAAe,UAAU,KAAK,EAAE;AACzD,YAAQ,IAAI,WAAW,eAAe,KAAK,KAAK,IAAI,CAAC,EAAE;AACvD,YAAQ,IAAI,YAAY,eAAe,MAAM,MAAM,EAAE;AAGrD,QAAI,CAAC,QAAQ,KAAK;AACd,YAAM,UAAU,MAAMC,UAAQ;AAAA,QAC1B,SAAS;AAAA,QACT,SAAS;AAAA,MACb,CAAC;AAED,UAAI,CAAC,SAAS;AACV,gBAAQ,IAAI,YAAY;AACxB;AAAA,MACJ;AAAA,IACJ;AAGA,YAAQ,IAAI,mCAA4B;AAExC,QAAI;AACA,YAAM,aAAaC,OAAK,cAAc,aAAa,GAAG,eAAe,SAAS;AAC9E,YAAM,cAAc,cAAc,UAAU;AAE5C,cAAQ,IAAI,0CAAqC;AACjD,cAAQ,IAAI,0EAAmE;AAAA,IACnF,SAAS,OAAO;AACZ,cAAQ,MAAM,sCAAiC,KAAK;AACpD,YAAM;AAAA,IACV;AAAA,EACJ,CAAC;AACT;AAKA,SAAS,iBAAiB,QAAqB;AAC3C,QAAM,YAAY,gBAAgB,OAAO,SAAS;AAClD,QAAM,SAAS,OAAO,SAAS,KAAK,OAAO,MAAM,MAAM;AACvD,SAAO,GAAG,SAAS,GAAG,MAAM;AAChC;AAKA,SAAS,gBAAgB,WAA2B;AAChD,MAAI;AACA,UAAM,OAAO,IAAI,KAAK,SAAS;AAC/B,WAAO,KAAK,eAAe;AAAA,EAC/B,QAAQ;AACJ,WAAO;AAAA,EACX;AACJ;;;AC/GA,SAAS,WAAAC,iBAAe;AACxB,SAAS,YAAYC,YAAU;AAC/B,SAAS,QAAAC,cAAY;AACrB,SAAS,YAAAC,WAAU,WAAAC,WAAS,iBAAiB;AA8BtC,SAAS,yBAAkC;AAC9C,SAAO,IAAIC,UAAQ,MAAM,EACpB,YAAY,iDAAiD,EAC7D,OAAO,iBAAiB,gEAAgE,EACxF,OAAO,YAAY,iDAAiD,EACpE,OAAO,aAAa,oBAAoB,EACxC,OAAO,OAAO,YAAY;AAEvB,UAAM,gBAAgBC,OAAK,QAAQ,IAAI,GAAG,SAAS,aAAa;AAChE,UAAM,iBAAiBA,OAAK,eAAe,aAAa;AAExD,QAAI,eAAe;AACnB,QAAI,aAAkB;AAEtB,QAAI;AACA,YAAM,gBAAgB,MAAMC,KAAG,SAAS,gBAAgB,OAAO;AAC/D,mBAAa,KAAK,MAAM,aAAa;AACrC,qBAAe;AAAA,IACnB,QAAQ;AAAA,IAER;AAEA,QAAI,CAAC,cAAc;AACf,YAAM,IAAI;AAAA,QACN;AAAA,MAEJ;AAAA,IACJ;AAGA,UAAM,uBAAuB,IAAI,qBAAqB;AACtD,QAAI,cAAc,MAAM,qBAAqB,UAAU;AAEvD,QAAI,CAAC,aAAa;AAEd,cAAQ,IAAI,sEAA4D;AACxE,oBAAc;AAAA,QACV,QAAQ,WAAW;AAAA,QACnB,SAAS,WAAW;AAAA,QACpB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QAClC,MAAM,CAAC;AAAA,QACP,eAAe;AAAA,QACf,SAAS,CAAC;AAAA,MACd;AAAA,IACJ;AAEA,YAAQ,IAAI,8BAAuB;AACnC,YAAQ,IAAI,WAAW,YAAY,MAAM,KAAK,YAAY,OAAO,EAAE;AAGnE,QAAI,aAAuB,CAAC;AAG5B,QAAI,QAAQ,QAAQ;AAChB,cAAQ,IAAI,2CAAoC;AAChD,YAAM,mBAAmB,IAAI,oBAAoB;AACjD,YAAM,WAAW,MAAM,iBAAiB,iBAAiB;AAEzD,UAAI,SAAS,WAAW,GAAG;AACvB,cAAM,IAAI;AAAA,UACN;AAAA,QACJ;AAAA,MACJ;AAEA,cAAQ,IAAI;AAAA,WAAc,SAAS,MAAM;AAAA,CAAmB;AAC5D,eAAS,QAAQ,OAAK;AAClB,cAAM,aAAa,EAAE,eAAe,SAAS,cAAO,EAAE,eAAe,WAAW,cAAO;AACvF,gBAAQ,IAAI,KAAK,UAAU,IAAI,EAAE,IAAI,MAAM,EAAE,SAAS,QAAQ;AAAA,MAClE,CAAC;AAED,UAAI,CAAC,QAAQ,KAAK;AACd,cAAM,UAAU,MAAMC,UAAQ;AAAA,UAC1B,SAAS;AAAA,UACT,SAAS;AAAA,QACb,CAAC;AAED,YAAI,CAAC,SAAS;AACV,kBAAQ,IAAI,YAAY;AACxB;AAAA,QACJ;AAAA,MACJ;AAEA,mBAAa,SAAS,IAAI,OAAK,EAAE,EAAE;AAAA,IACvC,WAES,QAAQ,MAAM;AACnB,YAAM,YAAa,QAAQ,KAAgB,MAAM,GAAG,EAAE,IAAI,SAAO,IAAI,KAAK,CAAC;AAC3E,YAAM,aAAa,YAAY,QAAQ,CAAC;AAGxC,mBAAa;AACb,YAAM,gBAAgB,UAAU,OAAO,SAAO,CAAC,WAAW,SAAS,GAAG,CAAC;AAEvE,UAAI,cAAc,SAAS,GAAG;AAC1B,gBAAQ,IAAI;AAAA,oCAA6B,cAAc,KAAK,IAAI,CAAC,EAAE;AACnE,gBAAQ,IAAI,oEAAoE;AAAA,MACpF;AAAA,IACJ,WAES,CAAC,QAAQ,KAAK;AACnB,YAAM,cAAc,YAAY,QAAQ,CAAC;AAGzC,cAAQ,IAAI;AAAA,kBAAqB,YAAY,KAAK,IAAI,KAAK,MAAM,EAAE;AAGnE,YAAM,mBAAmB,IAAI,oBAAoB;AACjD,YAAM,WAAW,MAAM,iBAAiB,iBAAiB;AACzD,YAAM,cAAc,MAAM,iBAAiB,YAAY;AAGvD,UAAI,SAAS,SAAS,GAAG;AACrB,cAAM,gBAAgB,SAAS,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,YAAY,EAAE,eAAe,CAAC;AACxF,gBAAQ,IAAI,MAAM,aAAa,kBAAkB;AAAA,MACrD;AAGA,UAAI,YAAY,SAAS,GAAG;AACxB,gBAAQ,IAAI,wDAAiD;AAC7D,oBAAY,MAAM,GAAG,CAAC,EAAE,QAAQ,OAAK;AACjC,gBAAM,WAAW,EAAE,aAAa,SAAS,WAAM,EAAE,aAAa,WAAW,cAAO;AAChF,kBAAQ,IAAI,GAAG,QAAQ,IAAI,EAAE,IAAI,MAAM,EAAE,MAAM,EAAE;AAAA,QACrD,CAAC;AACD,gBAAQ,IAAI,EAAE;AAAA,MAClB;AAGA,YAAM,UAAU,gBAAgB,aAAa,UAAU,WAAW;AAGlE,mBAAa,MAAMC,UAAS;AAAA,QACxB,SAAS;AAAA,QACT;AAAA,QACA,UAAU;AAAA,QACV,OAAO;AAAA,MACX,CAAC;AAGD,UAAI,WAAW,SAAS,UAAU,GAAG;AACjC,gBAAQ,IAAI,YAAY;AACxB;AAAA,MACJ;AAGA,UAAI,WAAW,WAAW,GAAG;AACzB,gBAAQ,IAAI,YAAY;AACxB;AAAA,MACJ;AAAA,IACJ,OAEK;AACD,mBAAa,YAAY,QAAQ,CAAC;AAGlC,UAAI,WAAW,WAAW,GAAG;AACzB,gBAAQ,IAAI,0DAAgD;AAC5D,gBAAQ,IAAI,uCAAuC;AAEnD,cAAM,mBAAmB,IAAI,oBAAoB;AACjD,qBAAa,MAAM,iBAAiB,mBAAmB;AAEvD,YAAI,WAAW,WAAW,GAAG;AACzB,gBAAM,IAAI;AAAA,YACN;AAAA,UACJ;AAAA,QACJ;AAEA,gBAAQ,IAAI,aAAa,WAAW,KAAK,IAAI,CAAC;AAAA,CAAI;AAAA,MACtD;AAAA,IACJ;AAEA,YAAQ,IAAI;AAAA,oBAAgB,WAAW,MAAM,YAAY,WAAW,KAAK,IAAI,CAAC;AAAA,CAAI;AAGlF,UAAM,gBAAgB,IAAI,cAAc;AACxC,UAAM,SAAS,MAAM,cAAc,KAAK;AAExC,QAAI,CAAC,QAAQ;AACT,YAAM,IAAI,gBAAgB,yCAAyC;AAAA,IACvE;AAEA,UAAM,iBAAiB,MAAM,MAAM,GAAG,OAAO,MAAM,sBAAsB,YAAY,MAAM,IAAI;AAAA,MAC3F,SAAS;AAAA,QACL,mBAAmB,OAAO;AAAA,MAC9B;AAAA,IACJ,CAAC;AAED,QAAI,CAAC,eAAe,IAAI;AACpB,YAAM,IAAI,MAAM,2BAA2B,eAAe,UAAU,EAAE;AAAA,IAC1E;AAEA,UAAM,SAAU,MAAM,eAAe,KAAK;AAI1C,UAAM,QAAQ,MAAMF,KAAG,QAAQ,aAAa;AAE5C,eAAW,QAAQ,OAAO;AACtB,UAAI,KAAK,SAAS,MAAM,KAAK,KAAK,SAAS,KAAK,GAAG;AAC/C,cAAM,WAAWD,OAAK,eAAe,IAAI;AACzC,cAAM,UAAU,MAAMC,KAAG,SAAS,UAAU,OAAO;AACnD,eAAO,MAAM,IAAI,IAAI;AAAA,MACzB;AAAA,IACJ;AAGA,UAAM,mBAAmB,IAAI,sBAAsB;AAEnD,eAAW,SAAS,YAAY;AAC5B,UAAI;AACA,cAAM,SAAS,YAAY,KAAK;AAChC,YAAI,CAAC,QAAQ;AACT,kBAAQ,IAAI,qCAA2B,KAAK,YAAY;AACxD;AAAA,QACJ;AAEA,cAAMG,SAAQ,iBAAiB,eAAe,QAAQ,KAAK;AAE3D,mBAAW,QAAQA,QAAO;AACtB,gBAAM,WAAWJ,OAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;AAC9C,gBAAMC,KAAG,MAAMD,OAAK,UAAU,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AACxD,gBAAMC,KAAG,UAAU,UAAU,KAAK,SAAS,OAAO;AAAA,QACtD;AAEA,gBAAQ,IAAI,UAAK,OAAO,IAAI,MAAMG,OAAM,MAAM,oBAAoB;AAAA,MACtE,SAAS,OAAO;AACZ,gBAAQ,MAAM,yBAAoB,KAAK,KAAK,KAAK;AAAA,MACrD;AAAA,IACJ;AAGA,QAAI,KAAK,UAAU,YAAY,IAAI,MAAM,KAAK,UAAU,UAAU,GAAG;AACjE,kBAAY,OAAO;AACnB,YAAM,qBAAqB,UAAU,WAAW;AAChD,cAAQ,IAAI,sDAAiD;AAAA,IACjE;AAEA,YAAQ,IAAI,uCAAkC;AAC9C,YAAQ,IAAI,uBAAgB;AAC5B,YAAQ,IAAI,gEAA2D;AACvE,YAAQ,IAAI,6DAAwD;AACpE,YAAQ,IAAI,oEAA+D;AAAA,EAC/E,CAAC;AACT;AAKA,SAAS,gBACL,aACA,UACA,aACoE;AACpE,QAAM,UAAgF;AAAA,IAClF;AAAA,MACI,MAAM;AAAA,MACN,OAAO;AAAA,MACP,SAAS,YAAY,SAAS,QAAQ,KAAK,SAAS,KAAK,OAAK,EAAE,OAAO,QAAQ;AAAA,IACnF;AAAA,IACA;AAAA,MACI,MAAM;AAAA,MACN,OAAO;AAAA,MACP,SAAS,YAAY,SAAS,UAAU,KAAK,SAAS,KAAK,OAAK,EAAE,OAAO,UAAU;AAAA,IACvF;AAAA,IACA;AAAA,MACI,MAAM;AAAA,MACN,OAAO;AAAA,MACP,SAAS,YAAY,SAAS,aAAa,KAAK,SAAS,KAAK,OAAK,EAAE,OAAO,aAAa;AAAA,IAC7F;AAAA,IACA;AAAA,MACI,MAAM;AAAA,MACN,OAAO;AAAA,MACP,SAAS,YAAY,SAAS,QAAQ,KAAK,SAAS,KAAK,OAAK,EAAE,OAAO,QAAQ;AAAA,IACnF;AAAA,IACA;AAAA,MACI,MAAM;AAAA,MACN,OAAO;AAAA,MACP,SAAS,YAAY,SAAS,UAAU,KAAK,SAAS,KAAK,OAAK,EAAE,OAAO,UAAU;AAAA,IACvF;AAAA,IACA;AAAA,MACI,MAAM;AAAA,MACN,OAAO;AAAA,MACP,SAAS,YAAY,SAAS,QAAQ,KAAK,SAAS,KAAK,OAAK,EAAE,OAAO,QAAQ;AAAA,IACnF;AAAA,IACA,IAAI,UAAU;AAAA,IACd;AAAA,MACI,MAAM;AAAA,MACN,OAAO;AAAA,MACP,SAAS;AAAA,IACb;AAAA,EACJ;AAEA,SAAO;AACX;;;ACtUA,SAAS,WAAAC,iBAAe;AACxB,SAAS,YAAYC,YAAU;AAC/B,SAAS,QAAAC,cAAY;AAcd,SAAS,yBAAkC;AAC9C,SAAO,IAAIC,UAAQ,MAAM,EACpB,YAAY,iCAAiC,EAC7C,OAAO,UAAU,gBAAgB,EACjC,OAAO,OAAO,YAAY;AAEvB,UAAM,uBAAuB,IAAI,qBAAqB;AACtD,UAAM,cAAc,MAAM,qBAAqB,UAAU;AAEzD,QAAI,CAAC,aAAa;AACd,YAAM,IAAI;AAAA,QACN;AAAA,MACJ;AAAA,IACJ;AAEA,QAAI,QAAQ,MAAM;AACd,cAAQ,IAAI,KAAK,UAAU,aAAa,MAAM,CAAC,CAAC;AAChD;AAAA,IACJ;AAEA,YAAQ,IAAI,wCAAiC;AAG7C,UAAM,gBAAgBC,OAAK,QAAQ,IAAI,GAAG,SAAS,aAAa;AAChE,UAAM,iBAAiBA,OAAK,eAAe,aAAa;AACxD,QAAI,iBAAwC;AAC5C,QAAI,cAAwB,CAAC;AAE7B,QAAI;AACA,YAAM,gBAAgB,MAAMC,KAAG,SAAS,gBAAgB,OAAO;AAC/D,uBAAiB,KAAK,MAAM,aAAa;AAGzC,YAAM,QAAQ,MAAMA,KAAG,QAAQ,aAAa;AAC5C,oBAAc,MAAM,OAAO,OAAK,EAAE,SAAS,MAAM,CAAC;AAAA,IACtD,QAAQ;AAAA,IAER;AAGA,QAAI,gBAAgB;AAChB,cAAQ,IAAI,iBAAiB,eAAe,IAAI,KAAK,eAAe,IAAI,GAAG;AAC3E,cAAQ,IAAI,iBAAiB,eAAe,OAAO,EAAE;AACrD,cAAQ,IAAI,iBAAiB,eAAe,WAAW,EAAE;AACzD,UAAI,eAAe,QAAQ,eAAe,KAAK,SAAS,GAAG;AACvD,gBAAQ,IAAI,iBAAiB,eAAe,KAAK,KAAK,IAAI,CAAC,EAAE;AAAA,MACjE;AAAA,IACJ,OAAO;AACH,cAAQ,IAAI,iBAAiB,YAAY,MAAM,EAAE;AACjD,cAAQ,IAAI,iBAAiB,YAAY,OAAO,EAAE;AAAA,IACtD;AAEA,YAAQ,IAAI,iBAAiB,IAAI,KAAK,YAAY,SAAS,EAAE,eAAe,CAAC,EAAE;AAG/E,YAAQ,IAAI;AAAA,iBAAoB;AAChC,QAAI,YAAY,SAAS,GAAG;AACxB,cAAQ,IAAI,mCAA4B,YAAY,MAAM,SAAS;AACnE,iBAAW,QAAQ,YAAY,MAAM,GAAG,CAAC,GAAG;AACxC,gBAAQ,IAAI,eAAU,IAAI,EAAE;AAAA,MAChC;AACA,UAAI,YAAY,SAAS,GAAG;AACxB,gBAAQ,IAAI,gBAAgB,YAAY,SAAS,CAAC,OAAO;AAAA,MAC7D;AAAA,IACJ,OAAO;AACH,cAAQ,IAAI,8CAAoC;AAChD,cAAQ,IAAI,0CAA0C;AAAA,IAC1D;AAGA,QAAI,YAAY,QAAQ,YAAY,KAAK,SAAS,GAAG;AACjD,cAAQ,IAAI;AAAA,mBAAsB,YAAY,KAAK,MAAM,IAAI;AAC7D,iBAAW,SAAS,YAAY,MAAM;AAClC,cAAM,SAAS,YAAY,KAAK;AAChC,YAAI,QAAQ;AACR,gBAAM,SAAS,MAAM,mBAAmB,OAAO,MAAM;AACrD,gBAAM,SAAS,SAAS,WAAM;AAC9B,kBAAQ,IAAI,KAAK,MAAM,IAAI,OAAO,IAAI,KAAK,OAAO,WAAW,GAAG;AAAA,QACpE;AAAA,MACJ;AAAA,IACJ;AAGA,QAAI,YAAY,WAAW,YAAY,QAAQ,SAAS,GAAG;AACvD,cAAQ,IAAI;AAAA,qBAAwB,YAAY,QAAQ,MAAM,IAAI;AAClE,iBAAW,UAAU,YAAY,QAAQ,MAAM,GAAG,CAAC,GAAG;AAClD,cAAM,YAAY,IAAI,KAAK,OAAO,SAAS,EAAE,eAAe;AAC5D,gBAAQ,IAAI,YAAO,SAAS,YAAY,OAAO,KAAK,KAAK,IAAI,CAAC,EAAE;AAAA,MACpE;AACA,UAAI,YAAY,QAAQ,SAAS,GAAG;AAChC,gBAAQ,IAAI,aAAa,YAAY,QAAQ,SAAS,CAAC,OAAO;AAAA,MAClE;AAAA,IACJ;AAEA,YAAQ,IAAI,2BAAiB;AAC7B,YAAQ,IAAI,sFAAiF;AAC7F,YAAQ,IAAI,qDAAgD;AAC5D,YAAQ,IAAI,2EAAsE;AAAA,EACtF,CAAC;AACT;AAEA,eAAe,gBAAgBC,QAAgC;AAC3D,MAAI;AACA,UAAMD,KAAG,OAAOD,OAAK,QAAQ,IAAI,GAAGE,MAAI,CAAC;AACzC,WAAO;AAAA,EACX,QAAQ;AACJ,WAAO;AAAA,EACX;AACJ;AAEA,eAAe,mBAAmB,OAAe,QAA+B;AAC5E,MAAI;AACA,QAAI,UAAU,YAAY;AACtB,aAAO,MAAM,gBAAgB,WAAW;AAAA,IAC5C,WAAW,UAAU,UAAU;AAC3B,aAAO,MAAM,gBAAgB,WAAW;AAAA,IAC5C,OAAO;AACH,aAAO,MAAM,gBAAgB,OAAO,SAAS;AAAA,IACjD;AAAA,EACJ,QAAQ;AACJ,WAAO;AAAA,EACX;AACJ;;;ATjIA,SAAS,gBAAsB;AAC3B,UAAQ,IAAIC,QAAM,KAAK,KAAK,sBAAe,IAAIA,QAAM,IAAI,+CAAuC,CAAC;AACjG,UAAQ,IAAI;AACZ,UAAQ,IAAIA,QAAM,KAAK,mBAAW,CAAC;AACnC,UAAQ,IAAI,KAAKA,QAAM,KAAK,MAAM,CAAC,qDAAkC;AACrE,UAAQ,IAAI,KAAKA,QAAM,KAAK,MAAM,CAAC,yCAA+B;AAClE,UAAQ,IAAI,KAAKA,QAAM,KAAK,MAAM,CAAC,+CAAgC;AACnE,UAAQ,IAAI,KAAKA,QAAM,KAAK,OAAO,CAAC,4CAAiC;AACrE,UAAQ,IAAI,KAAKA,QAAM,KAAK,MAAM,CAAC,6EAA4C;AAC/E,UAAQ,IAAI,KAAKA,QAAM,KAAK,SAAS,CAAC,2CAA8B;AACpE,UAAQ,IAAI;AACZ,UAAQ,IAAIA,QAAM,KAAK,gBAAQ,CAAC;AAChC,UAAQ,IAAIA,QAAM,IAAI,qBAAqB,CAAC;AAC5C,UAAQ,IAAIA,QAAM,IAAI,sCAAsC,CAAC;AAC7D,UAAQ,IAAIA,QAAM,IAAI,+CAA+C,CAAC;AACtE,UAAQ,IAAIA,QAAM,IAAI,uCAAuC,CAAC;AAC9D,UAAQ,IAAI;AACZ,UAAQ,IAAIA,QAAM,IAAI,0EAAiD,CAAC;AAC5E;AAEO,SAAS,qBAA8B;AAC1C,QAAM,eAAe,IAAIC,UAAQ,OAAO,EACnC,YAAY,mCAAmC,EAC/C,OAAO,MAAM;AACV,kBAAc;AAAA,EAClB,CAAC;AAGL,eAAa,WAAW,uBAAuB,CAAC;AAChD,eAAa,WAAW,uBAAuB,CAAC;AAChD,eAAa,WAAW,wBAAwB,CAAC;AACjD,eAAa,WAAW,0BAA0B,CAAC;AACnD,eAAa,WAAW,uBAAuB,CAAC;AAChD,eAAa,WAAW,uBAAuB,CAAC;AAEhD,SAAO;AACX;;;AUrCA,SAAS,WAAAC,iBAAe;AACxB,SAAS,WAAAC,iBAAe;AACxB,SAAS,YAAAC,iBAAgB;AASzB,IAAMC,UAAS;AAAA,EACX,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,KAAK;AAAA,EACL,OAAO;AAAA,EACP,MAAM;AACV;AAKO,SAAS,uBAAgC;AAC5C,SAAO,IAAIC,UAAQ,SAAS,EACvB,YAAY,0CAA0C,EACtD,OAAO,WAAW,2CAA2C,EAC7D,OAAO,WAAW,oCAAoC,EACtD,OAAO,OAAO,YAAkD;AAC7D,UAAM,cAAc,OAAO;AAAA,EAC/B,CAAC;AACT;AAEA,eAAe,cAAc,SAA+C;AACxE,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,SAAS,MAAM,cAAc,KAAK;AAExC,MAAI,CAAC,QAAQ;AACT,UAAM,IAAI,gBAAgB,yBAAyB,WAAW,CAAC,eAAe;AAAA,EAClF;AAEA,MAAI;AAEA,YAAQ,IAAI,GAAGD,QAAO,IAAI,oCAA6BA,QAAO,KAAK,EAAE;AAErE,UAAM,WAAW,MAAM,MAAM,GAAG,OAAO,MAAM,wBAAwB;AAAA,MACjE,SAAS;AAAA,QACL,mBAAmB,OAAO;AAAA,MAC9B;AAAA,MACA,QAAQ,YAAY,QAAQ,GAAK;AAAA;AAAA,IACrC,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AACd,YAAM,IAAI,MAAM,gCAAgC,SAAS,UAAU,EAAE;AAAA,IACzE;AAEA,UAAM,OAAO,MAAM,SAAS,KAAK;AAOjC,UAAM,gBAAgB,KAAK;AAC3B,UAAM,iBAAiB,gBAAY;AAEnC,YAAQ,IAAI;AAAA,EAAKA,QAAO,IAAI,mBAAmBA,QAAO,KAAK,IAAI,cAAc,EAAE;AAC/E,YAAQ,IAAI,GAAGA,QAAO,IAAI,kBAAkBA,QAAO,KAAK,KAAK,aAAa;AAAA,CAAI;AAE9E,QAAI,CAACE,gBAAe,eAAe,cAAc,GAAG;AAChD,cAAQ,IAAI,GAAGF,QAAO,KAAK,+CAA0CA,QAAO,KAAK;AAAA,CAAI;AACrF;AAAA,IACJ;AAGA,YAAQ,IAAI,GAAGA,QAAO,MAAM,2WAA+DA,QAAO,KAAK,EAAE;AACzG,YAAQ,IAAI,GAAGA,QAAO,MAAM,SAAIA,QAAO,KAAK,KAAKA,QAAO,IAAI,kCAAwBA,QAAO,KAAK,IAAI,cAAc,WAAMA,QAAO,IAAI,GAAG,aAAa,GAAGA,QAAO,KAAK,qBAAqBA,QAAO,MAAM,SAAIA,QAAO,KAAK,EAAE;AACtN,YAAQ,IAAI,GAAGA,QAAO,MAAM,2WAA+DA,QAAO,KAAK;AAAA,CAAI;AAG3G,QAAI,QAAQ,OAAO;AACf,cAAQ,IAAI,GAAGA,QAAO,IAAI,QAAQ,WAAW,CAAC,2CAA2CA,QAAO,KAAK;AAAA,CAAI;AACzG;AAAA,IACJ;AAGA,QAAI,CAAC,QAAQ,OAAO;AAChB,YAAM,eAAe,MAAMG,UAAQ;AAAA,QAC/B,SAAS;AAAA,QACT,SAAS;AAAA,MACb,CAAC;AAED,UAAI,CAAC,cAAc;AACf,gBAAQ,IAAI,GAAGH,QAAO,MAAM,mCAAyBA,QAAO,KAAK;AAAA,CAAI;AACrE;AAAA,MACJ;AAAA,IACJ;AAGA,YAAQ,IAAI;AAAA,EAAKA,QAAO,IAAI,yCAAkCA,QAAO,KAAK;AAAA,CAAI;AAE9E,QAAI;AAEA,YAAMI,kBAAiB,qBAAqB;AAC5C,YAAM,iBAAiB,kBAAkBA,eAAc;AAEvD,cAAQ,IAAI,GAAGJ,QAAO,IAAI,SAASI,eAAc,MAAMJ,QAAO,KAAK,EAAE;AAGrE,MAAAK,UAAS,gBAAgB;AAAA,QACrB,OAAO;AAAA,QACP,KAAK,EAAE,GAAG,QAAQ,KAAK,aAAa,IAAI;AAAA,MAC5C,CAAC;AAED,cAAQ,IAAI;AAAA,EAAKL,QAAO,KAAK,2CAAsC,aAAa,IAAIA,QAAO,KAAK;AAAA,CAAI;AAGpG,kBAAY,WAAW;AAAA,QACnB,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,iBAAiBI;AAAA,MACrB,CAAC;AAGD,yBAAmB;AAAA,IAEvB,SAAS,OAAO;AACZ,cAAQ,MAAM;AAAA,EAAKJ,QAAO,GAAG,yBAAoBA,QAAO,KAAK,EAAE;AAC/D,cAAQ,MAAM,GAAGA,QAAO,GAAG,UAAU,iBAAiB,QAAQ,MAAM,UAAU,eAAe,GAAGA,QAAO,KAAK;AAAA,CAAI;AAChH,cAAQ,MAAM,GAAGA,QAAO,MAAM,iDAA0CA,QAAO,KAAK,EAAE;AAGtF,YAAM,iBAAiB;AAAA,QACnB,KAAK;AAAA,QACL,MAAM;AAAA,QACN,MAAM;AAAA,QACN,KAAK;AAAA,MACT;AAEA,cAAQ,MAAM,MAAMA,QAAO,IAAI,GAAG,eAAe,cAAc,CAAC,GAAGA,QAAO,KAAK;AAAA,CAAI;AACnF,YAAM;AAAA,IACV;AAAA,EAEJ,SAAS,OAAO;AACZ,QAAI,iBAAiB,SAAS,MAAM,QAAQ,SAAS,iBAAiB,GAAG;AACrE,YAAM,IAAI,gBAAgB,yEAAyE;AAAA,IACvG;AACA,UAAM;AAAA,EACV;AACJ;AAKA,SAASE,gBAAe,QAAgB,OAAwB;AAC5D,QAAM,cAAc,OAAO,MAAM,GAAG,EAAE,IAAI,MAAM;AAChD,QAAM,aAAa,MAAM,MAAM,GAAG,EAAE,IAAI,MAAM;AAE9C,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AACxB,UAAM,IAAI,YAAY,CAAC,KAAK;AAC5B,UAAM,IAAI,WAAW,CAAC,KAAK;AAE3B,QAAI,IAAI,EAAG,QAAO;AAClB,QAAI,IAAI,EAAG,QAAO;AAAA,EACtB;AAEA,SAAO;AACX;AAWA,SAAS,uBAAwD;AAE7D,MAAI;AACA,UAAM,WAAWG,UAAS,kDAAkD;AAAA,MACxE,UAAU;AAAA,MACV,OAAO,CAAC,QAAQ,QAAQ,QAAQ;AAAA,IACpC,CAAC,EAAE,KAAK;AAER,QAAI,UAAU;AAEV,YAAM,iBAAiB,SAAS,YAAY,EAAE,QAAQ,OAAO,GAAG;AAKhE,UAAI,eAAe,SAAS,QAAQ,EAAG,QAAO;AAK9C,UAAI,eAAe,SAAS,SAAS,KAAK,eAAe,SAAS,QAAQ,EAAG,QAAO;AAKpF,UAAI,eAAe,SAAS,QAAQ,EAAG,QAAO;AAY9C,UAAI,eAAe,SAAS,QAAQ,KAChC,eAAe,SAAS,gBAAgB,KACxC,eAAe,SAAS,oBAAoB,KAC5C,eAAe,SAAS,cAAc,KACtC,eAAe,SAAS,iBAAiB,KACzC,eAAe,SAAS,WAAW,KACnC,eAAe,SAAS,uBAAuB,KAC/C,eAAe,SAAS,wBAAwB,GAAG;AACnD,eAAO;AAAA,MACX;AAAA,IACJ;AAAA,EACJ,QAAQ;AAAA,EAER;AAGA,QAAM,YAAY,QAAQ,IAAI,yBAAyB;AAEvD,MAAI,UAAU,SAAS,MAAM,EAAG,QAAO;AACvC,MAAI,UAAU,SAAS,MAAM,EAAG,QAAO;AACvC,MAAI,UAAU,SAAS,KAAK,EAAG,QAAO;AACtC,MAAI,UAAU,SAAS,KAAK,EAAG,QAAO;AAKtC,SAAO;AACX;AAKA,SAAS,kBAAkBD,iBAAyD;AAChF,QAAM,cAAc;AAEpB,UAAQA,iBAAgB;AAAA,IACpB,KAAK;AACD,aAAO,eAAe,WAAW;AAAA,IACrC,KAAK;AACD,aAAO,mBAAmB,WAAW;AAAA,IACzC,KAAK;AACD,aAAO,cAAc,WAAW;AAAA,IACpC,KAAK;AAAA,IACL;AACI,aAAO,kBAAkB,WAAW;AAAA,EAC5C;AACJ;;;ACvQA,SAAS,WAAAE,iBAAe;AACxB,SAAS,WAAAC,WAAS,UAAAC,eAAc;AAGhC,SAAS,QAAAC,cAAY;AAed,SAAS,qBAA8B;AAC1C,SAAO,IAAIC,UAAQ,OAAO,EACrB,YAAY,8CAA8C,EAC1D,OAAO,aAAa,mBAAmB,EACvC,OAAO,aAAa,yBAAyB,EAC7C,OAAO,SAAS,6BAA6B,EAC7C,OAAO,OAAO,YAAiE;AAC5E,UAAM,YAAY,OAAO;AAAA,EAC7B,CAAC;AACT;AAEA,eAAe,YAAY,SAA8D;AACrF,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,UAAU,IAAI,kBAAkB;AAGtC,QAAM,UAAyB;AAAA,IAC3B;AAAA,MACI,MAAM;AAAA,MACN,aAAa;AAAA,MACb,MAAMC,OAAK,KAAK,cAAc;AAAA,MAC9B,OAAO,YAAY;AACf,cAAM,UAAU,MAAM,QAAQ,YAAY,GAAG;AAC7C,eAAO,EAAE,QAAQ,QAAQ,SAAS,GAAG,OAAO,QAAQ,OAAO;AAAA,MAC/D;AAAA,MACA,OAAO,YAAY;AACf,cAAM,QAAQ,aAAa,GAAG;AAAA,MAClC;AAAA,IACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQJ;AAEA,UAAQ,IAAI,uCAAgC;AAG5C,QAAM,mBAA8F,CAAC;AAErG,aAAW,UAAU,SAAS;AAC1B,UAAM,OAAO,MAAM,OAAO,MAAM;AAChC,QAAI,KAAK,QAAQ;AACb,uBAAiB,KAAK,EAAE,QAAQ,KAAK,CAAC;AAAA,IAC1C;AAAA,EACJ;AAEA,MAAI,iBAAiB,WAAW,GAAG;AAC/B,YAAQ,IAAI,6BAAwB;AACpC;AAAA,EACJ;AAGA,MAAI,QAAQ,SAAS;AACjB,UAAM,eAAe,QAAQ,KAAK,OAAK,EAAE,SAAS,SAAS;AAC3D,QAAI,cAAc;AACd,YAAM,YAAY,cAAc,QAAQ,GAAG;AAAA,IAC/C;AACA;AAAA,EACJ;AAEA,MAAI,QAAQ,KAAK;AACb,eAAW,EAAE,OAAO,KAAK,kBAAkB;AACvC,YAAM,YAAY,QAAQ,QAAQ,GAAG;AAAA,IACzC;AACA;AAAA,EACJ;AAGA,UAAQ,IAAI,8BAA8B;AAC1C,aAAW,EAAE,QAAQ,KAAK,KAAK,kBAAkB;AAC7C,UAAM,WAAW,KAAK,QAAQ,KAAK,KAAK,KAAK,YAAY;AACzD,YAAQ,IAAI,eAAQ,OAAO,IAAI,GAAG,QAAQ,EAAE;AAC5C,YAAQ,IAAI,QAAQ,OAAO,WAAW,EAAE;AACxC,YAAQ,IAAI,cAAc,OAAO,IAAI;AAAA,CAAI;AAAA,EAC7C;AAEA,QAAM,SAAS,MAAMC,QAAO;AAAA,IACxB,SAAS;AAAA,IACT,SAAS;AAAA,MACL,GAAG,iBAAiB,IAAI,CAAC,EAAE,QAAQ,KAAK,OAAO;AAAA,QAC3C,MAAM,GAAG,OAAO,IAAI,GAAG,KAAK,QAAQ,KAAK,KAAK,KAAK,YAAY,EAAE;AAAA,QACjE,OAAO,OAAO;AAAA,MAClB,EAAE;AAAA,MACF,EAAE,MAAM,uBAAgB,OAAO,MAAM;AAAA,MACrC,EAAE,MAAM,iBAAY,OAAO,SAAS;AAAA,IACxC;AAAA,IACA,OAAO;AAAA,EACX,CAAC;AAED,MAAI,WAAW,UAAU;AACrB,YAAQ,IAAI,+BAA0B;AACtC;AAAA,EACJ;AAEA,MAAI,WAAW,OAAO;AAClB,eAAW,EAAE,OAAO,KAAK,kBAAkB;AACvC,YAAM,YAAY,QAAQ,QAAQ,GAAG;AAAA,IACzC;AAAA,EACJ,OAAO;AACH,UAAM,SAAS,QAAQ,KAAK,OAAK,EAAE,SAAS,MAAM;AAClD,QAAI,QAAQ;AACR,YAAM,YAAY,QAAQ,QAAQ,GAAG;AAAA,IACzC;AAAA,EACJ;AACJ;AAEA,eAAe,YAAY,QAAqB,aAAsC;AAClF,QAAM,OAAO,MAAM,OAAO,MAAM;AAEhC,MAAI,CAAC,KAAK,QAAQ;AACd,YAAQ,IAAI,UAAK,OAAO,IAAI,qBAAqB;AACjD;AAAA,EACJ;AAEA,QAAM,WAAW,KAAK,QAAQ,KAAK,KAAK,KAAK,YAAY;AAEzD,MAAI,CAAC,aAAa;AACd,UAAM,YAAY,MAAMC,UAAQ;AAAA,MAC5B,SAAS,UAAU,OAAO,IAAI,GAAG,QAAQ;AAAA,MACzC,SAAS;AAAA,IACb,CAAC;AAED,QAAI,CAAC,WAAW;AACZ,cAAQ,IAAI,yBAAe,OAAO,IAAI,EAAE;AACxC;AAAA,IACJ;AAAA,EACJ;AAEA,MAAI;AACA,UAAM,OAAO,MAAM;AACnB,YAAQ,IAAI,kBAAa,OAAO,IAAI,GAAG,QAAQ,EAAE;AAAA,EACrD,SAAS,OAAO;AACZ,YAAQ,MAAM,0BAAqB,OAAO,IAAI,KAAK,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AAAA,EACjH;AACJ;;;ACnKA,SAAS,WAAAC,iBAAe;;;ACAxB,SAAS,YAAAC,iBAAgB;AACzB,SAAS,WAAAC,gBAAe;;;ACExB,SAAS,SAAS;AAElB,IAAM,oBAAoB,EAAE,OAAO;AAAA,EACjC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA,EACpC,QAAQ,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,QAAQ,GAAG;AACzC,CAAC;AAED,IAAM,uBAAuB,EAAE,OAAO;AAAA,EACpC,SAAS,EAAE,OAAO,EAAE,QAAQ,qBAAqB;AAAA,EACjD,MAAM,EAAE,OAAO;AAAA,IACb,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE;AAAA,IACxC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,IAChC,WAAW,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,EACrC,CAAC;AAAA,EACD,qBAAqB,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAChD,CAAC;AAED,IAAM,uBAAuB,EAAE,OAAO;AAAA,EACpC,SAAS,EAAE,OAAO;AAAA,IAChB,OAAO,EAAE,OAAO,EAAE,QAAQ,iCAAiC;AAAA,IAC3D,KAAK,EAAE,OAAO,EAAE,QAAQ,+BAA+B;AAAA,EACzD,CAAC;AAAA,EACD,SAAS,EAAE,KAAK,CAAC,aAAa,WAAW,CAAC,EAAE,QAAQ,WAAW;AACjE,CAAC;AAED,IAAM,uBAAuB,EAAE,OAAO;AAAA,EACpC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,YAAY,aAAa,aAAa,CAAC,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC;AAAA,EACvF,QAAQ,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,EAC9B,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,QAAQ,GAAG;AAAA,EAChD,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ,CAAC;AAAA,EAChD,OAAO,kBAAkB,QAAQ,CAAC,CAAC;AACrC,CAAC;AAED,IAAM,sBAAsB,EAAE,OAAO;AAAA,EACnC,IAAI,EAAE,OAAO;AAAA,EACb,YAAY,EAAE,OAAO;AACvB,CAAC;AAED,IAAM,sBAAsB,EAAE,OAAO;AAAA,EACnC,SAAS,EAAE,OAAO,EAAE,IAAI;AAAA,EACxB,gBAAgB,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAChC,SAAS;AAAA,EACT,WAAW,EAAE,OAAO,EAAE,QAAQ,eAAe;AAAA,EAC7C,UAAU,qBAAqB,QAAQ,CAAC,CAAC;AAAA,EACzC,UAAU,qBAAqB,QAAQ,CAAC,CAAC;AAAA,EACzC,UAAU,qBAAqB,QAAQ,CAAC,CAAC;AAC3C,CAAC;;;AD7CD,SAAS,aAAa;AACtB,SAAS,KAAAC,UAAS;AAMX,IAAM,uBAAN,MAA2B;AAAA,EACtB;AAAA,EAER,YAAY,YAAqB;AAC7B,SAAK,aAAa,cAAcC,SAAQ,QAAQ,IAAI,GAAG,qBAAqB;AAAA,EAChF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAA+B;AACjC,QAAI;AACA,YAAM,UAAU,MAAMC,UAAS,KAAK,YAAY,OAAO;AACvD,YAAM,YAAY,MAAM,OAAO;AAE/B,aAAO,oBAAoB,MAAM,SAAS;AAAA,IAC9C,SAAS,OAAO;AACZ,UAAI,iBAAiBC,GAAE,UAAU;AAC7B,cAAM,IAAI,gBAAgB,oCAAoC,MAAM,OAAO,EAAE;AAAA,MACjF;AAEA,UAAI,iBAAiB,SAAS,UAAU,SAAS,MAAM,SAAS,UAAU;AACtE,cAAM,IAAI,cAAc,iCAAiC,KAAK,UAAU,EAAE;AAAA,MAC9E;AAEA,YAAM,IAAI;AAAA,QACN,iCAAiC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MAC3F;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,QAAgC;AACrC,QAAI;AACA,aAAO,oBAAoB,MAAM,MAAM;AAAA,IAC3C,SAAS,OAAO;AACZ,UAAI,iBAAiBA,GAAE,UAAU;AAC7B,cAAM,IAAI,gBAAgB,oCAAoC,MAAM,OAAO,EAAE;AAAA,MACjF;AACA,YAAM;AAAA,IACV;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAwB;AACpB,WAAO,KAAK;AAAA,EAChB;AACJ;;;AE9DA,SAAS,SAAAC,cAAa;AACtB,OAAOC,aAAY;AACnB,OAAOC,aAAY;AAsEZ,IAAM,kBAAN,cAA8B,MAAM;AAAA,EACzC,YACE,SACO,QACA,UACP;AACA,UAAM,OAAO;AAHN;AACA;AAGP,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,mBAAN,MAAuB;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,QAAuB;AACjC,SAAK,UAAU,OAAO,QAAQ,QAAQ,OAAO,EAAE;AAC/C,SAAK,iBAAiB,OAAO;AAC7B,SAAK,cAAc,OAAO,SAAS;AACnC,SAAK,mBAAmBA,QAAO,OAAO,SAAS,WAAW;AAAA,EAC5D;AAAA,EAEA,MAAc,QAAWC,QAAc,UAAuB,CAAC,GAAe;AAC5E,UAAM,MAAM,GAAG,KAAK,OAAO,GAAGA,MAAI;AAElC,UAAM,UAAU;AAAA,MACd,qBAAqB,KAAK;AAAA,MAC1B,gBAAgB;AAAA,MAChB,GAAG,QAAQ;AAAA,IACb;AAEA,UAAM,UAAU,YAAwB;AACtC,YAAM,WAAW,MAAMH,OAAM,KAAK;AAAA,QAChC,GAAG;AAAA,QACH;AAAA,MACF,CAAC;AAED,UAAI,CAAC,SAAS,IAAI;AAChB,YAAI,eAAe,QAAQ,SAAS,MAAM,KAAK,SAAS,UAAU;AAElE,YAAI;AACF,gBAAM,YAAa,MAAM,SAAS,KAAK;AACvC,cAAI,UAAU,UAAU,MAAM,QAAQ,UAAU,MAAM,GAAG;AACvD,2BAAe,UAAU,OAAO,KAAK,IAAI;AAAA,UAC3C;AAAA,QACF,QAAQ;AAAA,QAER;AAEA,cAAM,IAAI,gBAAgB,cAAc,SAAS,MAAM;AAAA,MACzD;AAEA,YAAM,cAAc,SAAS,QAAQ,IAAI,cAAc;AACvD,UAAI,eAAe,YAAY,SAAS,kBAAkB,GAAG;AAC3D,eAAO,SAAS,KAAK;AAAA,MACvB;AAEA,aAAO,SAAS,KAAK;AAAA,IACvB;AAEA,WAAOC,QAAO,SAAS;AAAA,MACrB,SAAS,KAAK,YAAY;AAAA,MAC1B,iBAAiB,CAAC,UAAU;AAC1B,gBAAQ;AAAA,UACN,2BAA2B,MAAM,aAAa,IAAI,MAAM,cAAc,CAAC,MAAM,MAAM,OAAO;AAAA,QAC5F;AAAA,MACF;AAAA,MACA,QAAQ;AAAA,MACR,YAAY,KAAK,YAAY;AAAA,MAC7B,YAAY,KAAK,YAAY,SAAS;AAAA,IACxC,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,oBAAsC;AAC1C,QAAI;AACF,YAAM,KAAK,QAAgC,wBAAwB;AACnE,aAAO;AAAA,IACT,SAAS,OAAO;AACd,UAAI,iBAAiB,iBAAiB;AACpC,cAAM;AAAA,MACR;AACA,YAAM,IAAI;AAAA,QACR,8BAA8B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MACtF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,YAAqD;AACpE,WAAO,KAAK,QAAgC,aAAa,UAAU,OAAO;AAAA,EAC5E;AAAA,EAEA,MAAM,SAAS,SAAiB,SAAmD;AACjF,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,WAAW,QAAQ,SAAS,GAAG;AACjC,aAAO,OAAO,WAAW,QAAQ,KAAK,GAAG,CAAC;AAAA,IAC5C;AAEA,UAAME,SAAO,WAAW,OAAO,QAAQ,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;AACvF,WAAO,KAAK,QAA8BA,MAAI;AAAA,EAChD;AAAA,EAEA,MAAM,UACJ,WACA,UAMI,CAAC,GAC2B;AAChC,UAAM,SAAS,IAAI,gBAAgB;AACnC,WAAO,OAAO,cAAc,UAAU,SAAS,CAAC;AAEhD,QAAI,QAAQ,UAAU,QAAQ,WAAW,KAAK;AAC5C,aAAO,OAAO,aAAa,QAAQ,MAAM;AAAA,IAC3C;AAEA,QAAI,QAAQ,UAAU;AACpB,aAAO,OAAO,SAAS,QAAQ,SAAS,SAAS,CAAC;AAAA,IACpD;AAEA,QAAI,QAAQ,QAAQ;AAClB,aAAO,OAAO,UAAU,QAAQ,OAAO,SAAS,CAAC;AAAA,IACnD;AAEA,QAAI,QAAQ,WAAW,QAAQ,QAAQ,SAAS,GAAG;AACjD,aAAO,OAAO,WAAW,QAAQ,QAAQ,KAAK,GAAG,CAAC;AAAA,IACpD;AAEA,QAAI,QAAQ,cAAc;AACxB,aAAO,OAAO,cAAc,KAAK,QAAQ,YAAY,EAAE;AAAA,IACzD;AAEA,UAAMA,SAAO,gBAAgB,OAAO,SAAS,CAAC;AAC9C,WAAO,KAAK,QAA+BA,MAAI;AAAA,EACjD;AAAA,EAEA,MAAM,aACJ,WACA,UAMI,CAAC,GACoB;AACzB,UAAM,WAAW,QAAQ,YAAY;AACrC,UAAM,YAA4B,CAAC;AACnC,QAAI,SAAS;AACb,QAAI,UAAU;AAEd,WAAO,SAAS;AACd,YAAM,WAAW,MAAM,KAAK,UAAU,WAAW;AAAA,QAC/C,GAAG;AAAA,QACH;AAAA,QACA;AAAA,MACF,CAAC;AAED,gBAAU,KAAK,GAAG,SAAS,MAAM;AAEjC,UAAI,QAAQ,YAAY;AACtB,gBAAQ,WAAW,UAAU,QAAQ,SAAS,WAAW;AAAA,MAC3D;AAEA,gBAAU,UAAU,SAAS,SAAS;AACtC,gBAAU;AAAA,IACZ;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,sBACJ,WACA,UAMI,CAAC,GACoB;AACzB,UAAM,WAAW,QAAQ,YAAY;AAGrC,UAAM,kBAAkB,MAAM,KAAK,UAAU,WAAW;AAAA,MACtD,GAAG;AAAA,MACH,UAAU;AAAA,IACZ,CAAC;AAED,UAAM,aAAa,gBAAgB;AACnC,UAAM,aAAa,KAAK,KAAK,aAAa,QAAQ;AAElD,UAAM,eAAe,MAAM,KAAK,EAAE,QAAQ,WAAW,GAAG,CAAC,GAAG,UAAU;AACpE,YAAM,SAAS,QAAQ;AAEvB,aAAO,KAAK,iBAAiB,YAAY;AACvC,cAAM,WAAW,MAAM,KAAK,UAAU,WAAW;AAAA,UAC/C,GAAG;AAAA,UACH;AAAA,UACA;AAAA,QACF,CAAC;AAED,YAAI,QAAQ,YAAY;AACtB,kBAAQ,WAAW,SAAS,SAAS,OAAO,QAAQ,UAAU;AAAA,QAChE;AAEA,eAAO,SAAS;AAAA,MAClB,CAAC;AAAA,IACH,CAAC;AAED,UAAM,cAAc,MAAM,QAAQ,IAAI,YAAY;AAClD,WAAO,YAAY,KAAK;AAAA,EAC1B;AACF;;;ACjRA,eAAsB,kBAAkB,QAAoD;AAC1F,QAAM,SAAS,IAAI,iBAAiB,MAAM;AAE1C,MAAI;AACF,UAAM,cAAc,MAAM,OAAO,kBAAkB;AAEnD,QAAI,CAAC,aAAa;AAChB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS;AAAA,QACT,SAAS;AAAA,UACP,SAAS,OAAO;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAEA,UAAM,kBAAkB,MAAM,OAAO,WAAW,OAAO,QAAQ,UAAU;AAEzE,WAAO;AAAA,MACL,SAAS;AAAA,MACT,SAAS,wDAAwD,gBAAgB,QAAQ,IAAI;AAAA,MAC7F,SAAS;AAAA,QACP,SAAS,OAAO;AAAA,QAChB,SAAS,gBAAgB;AAAA,MAC3B;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,QAAI,iBAAiB,iBAAiB;AACpC,UAAI,UAAU,sBAAsB,MAAM,OAAO;AAEjD,UAAI,MAAM,WAAW,KAAK;AACxB,kBAAU;AAAA,MACZ,WAAW,MAAM,WAAW,KAAK;AAC/B,kBAAU;AAAA,MACZ,WAAW,MAAM,WAAW,KAAK;AAC/B,kBAAU,YAAY,OAAO,QAAQ,UAAU;AAAA,MACjD;AAEA,aAAO;AAAA,QACL,SAAS;AAAA,QACT;AAAA,QACA,SAAS;AAAA,UACP,SAAS,OAAO;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,SAAS,sBAAsB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MACrF,SAAS;AAAA,QACP,SAAS,OAAO;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AACF;;;AJ3DO,SAAS,4BAAqC;AACjD,QAAM,MAAM,IAAIC,UAAQ,OAAO,EAC1B,YAAY,4BAA4B,EACxC,OAAO,uBAAuB,oBAAoB,qBAAqB,EACvE,OAAO,UAAU,gBAAgB,EACjC,OAAO,OAAO,YAA0B;AACrC,UAAM,mBAAmB,OAAO;AAAA,EACpC,CAAC;AAEL,SAAO;AACX;AAEA,eAAe,mBAAmB,SAAsC;AACpE,QAAM,gBAAgB,IAAI,qBAAqB,QAAQ,MAAM;AAC7D,QAAM,SAAS,MAAM,cAAc,KAAK;AAExC,QAAM,SAAS,MAAM,kBAAkB,MAAM;AAE7C,MAAI,QAAQ,MAAM;AACd,YAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,EAC/C,OAAO;AACH,QAAI,OAAO,SAAS;AAChB,cAAQ,IAAI,UAAK,OAAO,OAAO;AAC/B,UAAI,OAAO,SAAS,SAAS;AACzB,gBAAQ;AAAA,UACJ,eAAe,OAAO,QAAQ,QAAQ,IAAI,KAAK,OAAO,QAAQ,QAAQ,UAAU;AAAA,QACpF;AACA,gBAAQ,IAAI,kBAAkB,OAAO,QAAQ,QAAQ,EAAE,EAAE;AAAA,MAC7D;AAAA,IACJ,OAAO;AACH,cAAQ,MAAM,UAAK,OAAO,OAAO;AACjC,cAAQ,KAAK,CAAC;AAAA,IAClB;AAAA,EACJ;AACJ;;;AK9CA,SAAS,WAAAC,iBAAe;;;ACAxB,SAAS,WAAAC,UAAS,gBAAgB;;;AC+B3B,SAAS,sBAAsB,OAAuC;AAC3E,QAAM,cAAgC;AAAA,IACpC,IAAI,MAAM;AAAA,IACV,SAAS,MAAM;AAAA,IACf,QAAQ,MAAM,OAAO;AAAA,IACrB,UAAU,MAAM,SAAS;AAAA,IACzB,QAAQ,MAAM,OAAO;AAAA,IACrB,YAAY,MAAM;AAAA,IAClB,YAAY,MAAM;AAAA,IAClB,SAAS,MAAM,QAAQ;AAAA,IACvB,SAAS,MAAM,QAAQ;AAAA,EACzB;AAEA,MAAI,MAAM,aAAa;AACrB,gBAAY,cAAc,MAAM,YAAY;AAAA,EAC9C;AAEA,MAAI,MAAM,aAAa,MAAM,UAAU,SAAS,GAAG;AACjD,gBAAY,YAAY,MAAM,UAAU,IAAI,CAAC,cAAc;AAAA,MACzD,MAAM,SAAS;AAAA,MACf,UAAU,SAAS;AAAA,MACnB,OAAO,SAAS;AAAA,IAClB,EAAE;AAAA,EACJ;AAEA,MAAI,MAAM,eAAe,MAAM,YAAY,SAAS,GAAG;AACrD,gBAAY,cAAc,MAAM,YAAY,IAAI,CAAC,gBAAgB;AAAA,MAC/D,IAAI,WAAW;AAAA,MACf,UAAU,WAAW;AAAA,MACrB,UAAU,WAAW;AAAA,MACrB,cAAc,WAAW;AAAA,MACzB,QAAQ,WAAW,OAAO;AAAA,MAC1B,YAAY,WAAW;AAAA,MACvB,aAAa,WAAW;AAAA,IAC1B,EAAE;AAAA,EACJ;AAEA,MAAI,MAAM,YAAY,MAAM,SAAS,SAAS,GAAG;AAC/C,UAAM,cAAc,MAAM,SAAS;AAAA,MAAO,CAAC,QAAQ,YACjD,QAAQ,KAAK,OAAO,KAAK,UAAU;AAAA,IACrC;AACA,gBAAY,gBAAgB,YAAY;AAAA,EAC1C;AAEA,SAAO;AACT;AAEO,SAAS,kBAAkB,OAA6B;AAC7D,MAAI,UAAU;AAEd,MAAI,MAAM,aAAa;AACrB,eAAW,MAAM;AAAA,EACnB;AAEA,SAAO;AACT;AAEO,SAAS,sBAAsB,UAA4B,QAAgC;AAChG,MAAI,CAAC,YAAY,SAAS,WAAW,GAAG;AACtC,WAAO;AAAA,EACT;AAEA,MAAI,WAAW;AAEf,QAAM,iBAAiB,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,GAAG,MAAM;AAClD,QAAI,OAAO,YAAY,aAAa;AAClC,aAAO,EAAE,KAAK,EAAE;AAAA,IAClB;AACA,WAAO,IAAI,KAAK,EAAE,UAAU,EAAE,QAAQ,IAAI,IAAI,KAAK,EAAE,UAAU,EAAE,QAAQ;AAAA,EAC3E,CAAC;AAED,aAAW,WAAW,gBAAgB;AACpC,QAAI,CAAC,QAAQ,SAAS,QAAQ,MAAM,KAAK,MAAM,IAAI;AACjD;AAAA,IACF;AAEA,UAAM,OAAO,IAAI,KAAK,QAAQ,UAAU,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;AACpE,UAAM,OAAO,IAAI,KAAK,QAAQ,UAAU,EAAE,aAAa,EAAE,MAAM,GAAG,EAAE,CAAC,EAAE,UAAU,GAAG,CAAC;AAErF,gBAAY,MAAM,QAAQ,KAAK,IAAI,MAAM,IAAI,IAAI,IAAI;AAAA;AAAA;AACrD,gBAAY,GAAG,QAAQ,KAAK;AAAA;AAAA;AAE5B,QAAI,QAAQ,WAAW,QAAQ,QAAQ,SAAS,GAAG;AACjD,kBAAY;AACZ,iBAAW,UAAU,QAAQ,SAAS;AACpC,cAAM,WAAW,OAAO,aAAa;AACrC,cAAM,WAAW,OAAO,aAAa;AACrC,oBAAY,KAAK,OAAO,IAAI,KAAK,QAAQ,WAAM,QAAQ;AAAA;AAAA,MACzD;AACA,kBAAY;AAAA,IACd;AAEA,gBAAY;AAAA,EACd;AAEA,SAAO,SAAS,KAAK;AACvB;AAEO,SAAS,mBACd,aACA,eACkB;AAClB,MAAI,CAAC,eAAe;AAClB,WAAO;AAAA,EACT;AAEA,SAAO,YAAY,OAAO,CAAC,YAAY,QAAQ,KAAK,aAAa;AACnE;AAEO,SAAS,kBACd,aACA,kBACS;AACT,QAAM,iBAAiB,iBAAiB;AACxC,QAAM,kBAAkB,YAAY;AAEpC,MAAI,CAAC,gBAAgB;AACnB,WAAO;AAAA,EACT;AAEA,SAAO,IAAI,KAAK,eAAe,IAAI,IAAI,KAAK,cAAc;AAC5D;AAEO,SAAS,qBACd,gBACA,kBACS;AACT,QAAM,qBAAqB,iBAAiB;AAE5C,MAAI,CAAC,oBAAoB;AACvB,WAAO,eAAe,SAAS;AAAA,EACjC;AAEA,SAAO,eAAe,KAAK,CAAC,YAAY,QAAQ,KAAK,kBAAkB;AACzE;;;ACrKA,OAAO,aAAa;AAGb,SAAS,aACd,OACA,QACA,gBAA6B,oBAAI,IAAI,GAC7B;AACR,MAAI,OAAO,QAAQ,OAAO;AAAA,IACxB,OAAO,OAAO;AAAA,IACd,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV,CAAC;AAED,SAAO,KAAK,UAAU,GAAG,OAAO,SAAS;AAEzC,MAAI,CAAC,OAAO,QAAQ;AAClB,WAAO;AAAA,EACT;AAEA,MAAI,YAAY;AAChB,MAAI,UAAU;AAEd,SAAO,cAAc,IAAI,SAAS,GAAG;AACnC,UAAM,SAAS,IAAI,OAAO;AAC1B,UAAM,YAAY,OAAO,YAAY,OAAO;AAC5C,gBAAY,GAAG,KAAK,UAAU,GAAG,SAAS,CAAC,GAAG,MAAM;AACpD;AAAA,EACF;AAEA,gBAAc,IAAI,SAAS;AAC3B,SAAO;AACT;AAEO,SAAS,iBACd,SACA,OACA,QACA,gBAA6B,oBAAI,IAAI,GAC7B;AACR,QAAM,OAAO,aAAa,OAAO,OAAO,MAAM,aAAa;AAE3D,SAAO,OAAO,QAAQ,QAAQ,aAAa,QAAQ,SAAS,CAAC,EAAE,QAAQ,UAAU,IAAI;AACvF;;;AC3CA,SAAS,YAAAC,WAAU,aAAAC,YAAW,aAAa;AAC3C,SAAS,WAAAC,gBAAe;AACxB,OAAOC,aAAY;AAgBnB,eAAsB,UAAU,UAAiC;AAC/D,QAAM,MAAMD,SAAQ,QAAQ;AAC5B,QAAM,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AACtC;AAEA,eAAsB,iBAAiB,UAA2C;AAChF,MAAI;AACF,UAAM,UAAU,MAAMF,UAAS,UAAU,OAAO;AAChD,WAAO,qBAAqB,OAAO;AAAA,EACrC,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,UAAU;AACtD,aAAO;AAAA,QACL,aAAa,CAAC;AAAA,QACd,SAAS;AAAA,QACT,UAAU;AAAA,QACV,YAAY;AAAA,MACd;AAAA,IACF;AACA,UAAM;AAAA,EACR;AACF;AAEO,SAAS,qBAAqB,SAAiC;AACpE,MAAI,CAAC,QAAQ,KAAK,GAAG;AACnB,WAAO;AAAA,MACL,aAAa,CAAC;AAAA,MACd,SAAS;AAAA,MACT,UAAU;AAAA,MACV,YAAY;AAAA,IACd;AAAA,EACF;AAEA,MAAI,cAAuC,CAAC;AAC5C,MAAI,OAAe;AACnB,MAAI;AACF,UAAM,SAASG,QAAO,OAAO;AAC7B,kBAAc,OAAO;AACrB,WAAO,OAAO;AAAA,EAChB,SAAS,GAAG;AAEV,YAAQ,KAAK,sEAA4D;AAAA,EAC3E;AAEA,QAAM,WAAW,uBAAuB,IAAI;AAC5C,QAAM,cAAc,sBAAsB,IAAI;AAE9C,SAAO;AAAA,IACL;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA,YAAY;AAAA,EACd;AACF;AAEO,SAAS,uBAAuB,SAAgC;AACrE,QAAM,aAAa,QAAQ,MAAM,iCAAiC;AAClE,QAAM,WAAW,QAAQ,MAAM,+BAA+B;AAE9D,MAAI,CAAC,cAAc,CAAC,UAAU;AAC5B,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,QAAQ,QAAQ,WAAW,CAAC,CAAC,IAAI,WAAW,CAAC,EAAE;AAClE,QAAM,WAAW,QAAQ,QAAQ,SAAS,CAAC,CAAC;AAE5C,MAAI,cAAc,UAAU;AAC1B,WAAO;AAAA,EACT;AAEA,SAAO,QAAQ,UAAU,YAAY,QAAQ,EAAE,KAAK;AACtD;AAEO,SAAS,sBAAsB,SAAyB;AAC7D,QAAM,aAAa,QAAQ,MAAM,iCAAiC;AAClE,QAAM,WAAW,QAAQ,MAAM,+BAA+B;AAE9D,MAAI,CAAC,cAAc,CAAC,UAAU;AAC5B,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,QAAQ,QAAQ,WAAW,CAAC,CAAC;AAChD,QAAM,WAAW,QAAQ,QAAQ,SAAS,CAAC,CAAC,IAAI,SAAS,CAAC,EAAE;AAE5D,SAAO,QAAQ,UAAU,GAAG,UAAU,IAAI,QAAQ,UAAU,QAAQ,EAAE,KAAK;AAC7E;AAEO,SAAS,qBAAqB,MAAoB,QAAgC;AACvF,MAAI,UAAU;AAEd,MAAI,OAAO,KAAK,KAAK,WAAW,EAAE,SAAS,GAAG;AAC5C,UAAM,kBAAkBA,QAAO,UAAU,IAAI,KAAK,WAAW,EAAE,QAAQ,qBAAqB,EAAE;AAC9F,eAAW;AAAA,EAAQ,eAAe;AAAA;AAAA;AAAA,EACpC;AAEA,aAAW,KAAK;AAEhB,MAAI,KAAK,UAAU;AACjB,eAAW;AAAA;AAAA,EAAO,OAAO,QAAQ,KAAK;AAAA,EAAK,KAAK,QAAQ;AAAA,EAAK,OAAO,QAAQ,GAAG;AAAA,EACjF;AAEA,SAAO;AACT;AAEA,eAAsB,kBACpB,UACA,MACA,QACe;AACf,QAAM,UAAU,QAAQ;AACxB,QAAM,UAAU,qBAAqB,MAAM,MAAM;AACjD,QAAMF,WAAU,UAAU,SAAS,OAAO;AAC5C;AAEO,SAAS,8BAA8B,aAAqD;AACjG,QAAM,KAAK,YAAY;AACvB,MAAI,OAAO,OAAO,UAAU;AAC1B,WAAO;AAAA,EACT;AACA,MAAI,OAAO,OAAO,UAAU;AAC1B,UAAM,SAAS,SAAS,IAAI,EAAE;AAC9B,WAAO,MAAM,MAAM,IAAI,OAAO;AAAA,EAChC;AACA,SAAO;AACT;AAEO,SAAS,qBAAqB,aAAqD;AACxF,QAAM,gBAAgB,YAAY;AAClC,MAAI,OAAO,kBAAkB,UAAU;AACrC,WAAO;AAAA,EACT;AACA,MAAI,OAAO,kBAAkB,UAAU;AACrC,UAAM,SAAS,SAAS,eAAe,EAAE;AACzC,WAAO,MAAM,MAAM,IAAI,OAAO;AAAA,EAChC;AACA,SAAO;AACT;;;AHnHA,eAAsB,UACpB,SACA,QACA,UAA4B,CAAC,GACH;AAC1B,QAAM,SAAS,IAAI,iBAAiB,MAAM;AAC1C,QAAM,YAAY,QAAQ,aAAa,OAAO;AAE9C,MAAI;AACF,UAAM,UAAU,OAAO,SAAS;AAChC,UAAM,WAAW,MAAM,OAAO,SAAS,SAAS,OAAO;AACvD,UAAM,QAAQ,SAAS;AAEvB,UAAM,WAAW,iBAAiB,MAAM,IAAI,MAAM,SAAS,OAAO,QAAQ;AAC1E,UAAM,WAAWG,SAAQ,WAAW,QAAQ;AAC5C,UAAM,eAAe,SAAS,QAAQ,IAAI,GAAG,QAAQ;AAErD,UAAM,eAAe,MAAM,iBAAiB,QAAQ;AACpD,UAAM,kBAAkB,8BAA8B,aAAa,WAAW;AAC9E,UAAM,wBAAwB,qBAAqB,aAAa,WAAW;AAE3E,QAAI,mBAAmB,oBAAoB,MAAM,IAAI;AACnD,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,MAAM;AAAA,QACf;AAAA,QACA,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,SAAS,QAAQ,QAAQ,mBAAmB,eAAe,SAAS,MAAM,EAAE;AAAA,MAC9E;AAAA,IACF;AAEA,UAAM,cAAc,kBAAkB,OAAO,aAAa,WAAW;AACrE,UAAM,sBAAsB;AAAA,MAC1B,MAAM,YAAY,CAAC;AAAA,MACnB,aAAa;AAAA,IACf;AAEA,QAAI,CAAC,eAAe,CAAC,qBAAqB;AACxC,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,MAAM;AAAA,QACf;AAAA,QACA,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,SAAS,SAAS,OAAO;AAAA,MAC3B;AAAA,IACF;AAEA,UAAM,cAAc,sBAAsB,KAAK;AAC/C,UAAM,UAAU,kBAAkB,KAAK;AAEvC,QAAI;AACJ,QAAI,uBAAuB,MAAM,UAAU;AACzC,YAAM,cAAc,mBAAmB,MAAM,UAAU,qBAAqB;AAC5E,UAAI,YAAY,SAAS,GAAG;AAC1B,cAAM,cAAc,sBAAsB,aAAa,OAAO,QAAQ;AACtE,YAAI,aAAa,UAAU;AACzB,qBAAW,GAAG,aAAa,QAAQ;AAAA;AAAA;AAAA;AAAA,EAAc,WAAW;AAAA,QAC9D,OAAO;AACL,qBAAW;AAAA,QACb;AAAA,MACF,OAAO;AACL,mBAAW,aAAa,YAAY;AAAA,MACtC;AAAA,IACF,OAAO;AACL,iBAAW,aAAa,YAAY;AAAA,IACtC;AAEA,UAAM,UAAsC,CAAC;AAC7C,QAAI,aAAa;AACf,cAAQ,cAAc;AACtB,cAAQ,UAAU;AAAA,IACpB;AACA,QAAI,qBAAqB;AACvB,cAAQ,WAAW;AAAA,IACrB;AAEA,QAAI,QAAQ,QAAQ;AAClB,YAAMC,UAAS,kBAAkB,YAAY;AAC7C,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,MAAM;AAAA,QACf;AAAA,QACA,UAAU;AAAA,QACV,QAAAA;AAAA,QACA,SAAS,SAASA,OAAM,UAAU,OAAO;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AAEA,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAO;AAAA,IACT;AAEA,UAAM,SAAS,kBAAkB,YAAY;AAC7C,WAAO;AAAA,MACL,SAAS;AAAA,MACT,SAAS,MAAM;AAAA,MACf;AAAA,MACA,UAAU;AAAA,MACV;AAAA,MACA,SAAS,gBAAgB,MAAM,UAAU,OAAO;AAAA,MAChD;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,SAAS;AAAA,MACT;AAAA,MACA,UAAU;AAAA,MACV,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,SAAS,wBAAwB,OAAO,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IACrG;AAAA,EACF;AACF;AAEO,SAAS,sBAAsB,KAA4B;AAChE,QAAM,QAAQ,IAAI,MAAM,yBAAyB;AACjD,MAAI,OAAO;AACT,UAAM,UAAU,SAAS,MAAM,CAAC,GAAG,EAAE;AACrC,WAAO,MAAM,OAAO,IAAI,OAAO;AAAA,EACjC;AACA,SAAO;AACT;;;ADvJO,SAAS,yBAAkC;AAC9C,QAAM,MAAM,IAAIC,UAAQ,OAAO,EAC1B,YAAY,qBAAqB,EACjC,OAAO,qBAAqB,UAAU,EACtC,OAAO,mBAAmB,WAAW,EACrC,OAAO,aAAa,gCAAgC,EACpD,OAAO,uBAAuB,kBAAkB,EAChD,OAAO,2BAA2B,kBAAkB,EACpD,OAAO,UAAU,gBAAgB,EACjC,OAAO,OAAO,YAA8B;AACzC,UAAM,gBAAgB,OAAO;AAAA,EACjC,CAAC;AAEL,SAAO;AACX;AAEA,eAAe,gBAAgB,SAA0C;AACrE,QAAM,gBAAgB,IAAI,qBAAqB,QAAQ,MAAM;AAC7D,QAAM,SAAS,MAAM,cAAc,KAAK;AAExC,MAAI;AAEJ,MAAI,QAAQ,IAAI;AACZ,cAAU,SAAS,QAAQ,IAAI,EAAE;AACjC,QAAI,MAAM,OAAO,GAAG;AAChB,YAAM,IAAI,gBAAgB,kBAAkB;AAAA,IAChD;AAAA,EACJ,WAAW,QAAQ,KAAK;AACpB,UAAM,cAAc,sBAAsB,QAAQ,GAAG;AACrD,QAAI,CAAC,aAAa;AACd,YAAM,IAAI,gBAAgB,qCAAqC;AAAA,IACnE;AACA,cAAU;AAAA,EACd,OAAO;AACH,UAAM,IAAI,gBAAgB,uCAAuC;AAAA,EACrE;AAEA,QAAM,SAAS,MAAM,UAAU,SAAS,QAAQ;AAAA,IAC5C,QAAQ,QAAQ;AAAA,IAChB,WAAW,QAAQ;AAAA,EACvB,CAAC;AAED,MAAI,QAAQ,MAAM;AACd,YAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,EAC/C,OAAO;AACH,QAAI,OAAO,SAAS;AAChB,YAAM,OAAO,OAAO,WAAW,YAAY,iBAAO;AAClD,cAAQ,IAAI,GAAG,IAAI,IAAI,OAAO,OAAO,EAAE;AACvC,UAAI,OAAO,UAAU;AACjB,gBAAQ,IAAI,YAAY,OAAO,QAAQ,EAAE;AAAA,MAC7C;AAAA,IACJ,OAAO;AACH,cAAQ,MAAM,UAAK,OAAO,OAAO;AACjC,cAAQ,KAAK,CAAC;AAAA,IAClB;AAAA,EACJ;AACJ;;;AKzEA,SAAS,WAAAC,iBAAe;;;AC4BxB,eAAsB,YACpB,QACA,UAA8B,CAAC,GACH;AAC5B,QAAM,SAAS,IAAI,iBAAiB,MAAM;AAC1C,QAAM,WAAW,QAAQ,YAAY,OAAO,SAAS;AAErD,QAAM,SAA4B;AAAA,IAChC,SAAS;AAAA,IACT,aAAa;AAAA,IACb,WAAW;AAAA,IACX,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,QAAQ,CAAC;AAAA,EACX;AAEA,MAAI;AACF,UAAM,SAAS,MAAM,OAAO,sBAAsB,OAAO,QAAQ,IAAI;AAAA,MACnE,QAAQ,QAAQ,UAAU,OAAO,SAAS;AAAA,MAC1C;AAAA,MACA,SAAS,OAAO,SAAS;AAAA,MACzB,cAAc,QAAQ;AAAA,MACtB,YAAY,QAAQ;AAAA,IACtB,CAAC;AAED,WAAO,cAAc,OAAO;AAE5B,QAAI,OAAO,WAAW,GAAG;AACvB,aAAO;AAAA,IACT;AAEA,UAAM,eAAe,OAAO,IAAI,OAAO,UAAU;AAC/C,YAAM,aAAa,MAAM,UAAU,MAAM,IAAI,QAAQ;AAAA,QACnD,QAAQ,QAAQ;AAAA,QAChB,WAAW,QAAQ;AAAA,MACrB,CAAC;AAED,aAAO;AAEP,UAAI,WAAW,SAAS;AACtB,gBAAQ,WAAW,QAAQ;AAAA,UACzB,KAAK;AACH,mBAAO;AACP;AAAA,UACF,KAAK;AACH,mBAAO;AACP;AAAA,UACF,KAAK;AACH,mBAAO;AACP;AAAA,QACJ;AAAA,MACF,OAAO;AACL,eAAO;AACP,eAAO,OAAO,KAAK;AAAA,UACjB,SAAS,WAAW;AAAA,UACpB,OAAO,WAAW;AAAA,QACpB,CAAC;AAAA,MACH;AAEA,aAAO;AAAA,IACT,CAAC;AAED,UAAM,QAAQ,IAAI,YAAY;AAE9B,WAAO,UAAU,OAAO,WAAW;AACnC,WAAO;AAAA,EACT,SAAS,OAAO;AACd,WAAO,UAAU;AACjB,WAAO,OAAO,KAAK;AAAA,MACjB,SAAS;AAAA,MACT,OAAO,2BAA2B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IAC1F,CAAC;AACD,WAAO;AAAA,EACT;AACF;;;ADtFO,SAAS,2BAAoC;AAChD,QAAM,MAAM,IAAIC,UAAQ,SAAS,EAC5B,YAAY,8BAA8B,EAC1C,OAAO,yBAAyB,iCAAiC,GAAG,EACpE,OAAO,0BAA0B,2CAA2C,EAC5E,OAAO,0BAA0B,+BAA+B,EAChE,OAAO,wBAAwB,4BAA4B,EAC3D,OAAO,aAAa,gCAAgC,EACpD,OAAO,uBAAuB,kBAAkB,EAChD,OAAO,2BAA2B,kBAAkB,EACpD,OAAO,UAAU,gBAAgB,EACjC,OAAO,OAAO,YAAgC;AAC3C,UAAM,kBAAkB,OAAO;AAAA,EACnC,CAAC;AAEL,SAAO;AACX;AAEA,eAAe,kBAAkB,SAA4C;AACzE,QAAM,gBAAgB,IAAI,qBAAqB,QAAQ,MAAM;AAC7D,QAAM,SAAS,MAAM,cAAc,KAAK;AAExC,QAAM,cAAiD;AAAA,IACnD,QAAQ,QAAQ;AAAA,IAChB,cAAc,QAAQ;AAAA,IACtB,QAAQ,QAAQ;AAAA,IAChB,WAAW,QAAQ;AAAA,IACnB,GAAI,QAAQ,eAAe,EAAE,aAAa,SAAS,QAAQ,aAAa,EAAE,EAAE;AAAA,IAC5E,GAAI,QAAQ,YAAY,EAAE,UAAU,SAAS,QAAQ,UAAU,EAAE,EAAE;AAAA,IACnE,YAAY,QAAQ,OACd,SACA,CAAC,SAAiB,UAAkB;AAClC,cAAQ,OAAO,MAAM,eAAe,OAAO,IAAI,KAAK,SAAS;AAAA,IACjE;AAAA,EACR;AAEA,QAAM,SAAS,MAAM,YAAY,QAAQ,WAAW;AAEpD,MAAI,CAAC,QAAQ,MAAM;AACf,YAAQ,OAAO,MAAM,IAAI;AAAA,EAC7B;AAEA,MAAI,QAAQ,MAAM;AACd,YAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,EAC/C,OAAO;AACH,QAAI,OAAO,SAAS;AAChB,cAAQ,IAAI,oCAA+B;AAC3C,cAAQ,IAAI,oBAAoB,OAAO,WAAW,EAAE;AACpD,cAAQ,IAAI,eAAe,OAAO,OAAO,EAAE;AAC3C,cAAQ,IAAI,eAAe,OAAO,OAAO,EAAE;AAC3C,cAAQ,IAAI,eAAe,OAAO,OAAO,EAAE;AAC3C,UAAI,OAAO,SAAS,GAAG;AACnB,gBAAQ,IAAI,cAAc,OAAO,MAAM,EAAE;AAAA,MAC7C;AAAA,IACJ,OAAO;AACH,cAAQ,IAAI,mCAA8B;AAC1C,cAAQ,IAAI,oBAAoB,OAAO,WAAW,EAAE;AACpD,cAAQ,IAAI,iBAAiB,OAAO,SAAS,EAAE;AAC/C,cAAQ,IAAI,eAAe,OAAO,OAAO,EAAE;AAC3C,cAAQ,IAAI,eAAe,OAAO,OAAO,EAAE;AAC3C,cAAQ,IAAI,eAAe,OAAO,OAAO,EAAE;AAC3C,cAAQ,IAAI,cAAc,OAAO,MAAM,EAAE;AAEzC,UAAI,OAAO,OAAO,SAAS,GAAG;AAC1B,gBAAQ,IAAI,WAAW;AACvB,eAAO,OAAO,QAAQ,CAAC,UAAU;AAC7B,kBAAQ,IAAI,YAAY,MAAM,OAAO,KAAK,MAAM,KAAK,EAAE;AAAA,QAC3D,CAAC;AAAA,MACL;AAEA,cAAQ,KAAK,CAAC;AAAA,IAClB;AAAA,EACJ;AACJ;;;AE3FA,SAAS,WAAAC,iBAAe;AAGxB,SAAS,YAAYC,YAAU;AAC/B,SAAS,QAAAC,cAAY;AACrB,SAAS,WAAAC,gBAAe;AAQjB,SAAS,oBAA6B;AACzC,QAAM,MAAM,IAAIC,UAAQ,MAAM,EACzB,YAAY,sCAAsC,EAClD,OAAO,UAAU,gBAAgB,EACjC,OAAO,aAAa,2BAA2B,EAC/C,OAAO,OAAO,YAAyB;AACpC,UAAM,WAAW,OAAO;AAAA,EAC5B,CAAC;AAEL,SAAO;AACX;AAEA,eAAe,WAAW,SAAqC;AAC3D,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,SAAS,MAAM,cAAc,KAAK;AAExC,MAAI,CAAC,QAAQ;AACT,UAAM,IAAI,gBAAgB,yBAAyB,WAAW,CAAC,eAAe;AAAA,EAClF;AAEA,QAAM,gBAAgBC,OAAKC,SAAQ,GAAG,SAAS,WAAW;AAC1D,QAAM,gBAAgB,MAAMC,kBAAiB;AAE7C,QAAM,OAAO;AAAA,IACT,YAAY,cAAc,cAAc;AAAA,IACxC,QAAQ,OAAO;AAAA,IACf,WAAWC,SAAQ,OAAO,SAAS;AAAA,IACnC,SAAS,OAAO,WAAW;AAAA,IAC3B,aAAa,OAAO,eAAe;AAAA,IACnC;AAAA,IACA;AAAA,EACJ;AAEA,MAAI,QAAQ,MAAM;AACd,YAAQ,IAAI,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AACzC;AAAA,EACJ;AAEA,UAAQ,IAAI,kBAAkB;AAC9B,UAAQ,IAAI,oGAAoB;AAChC,UAAQ,IAAI,uBAAuB,KAAK,UAAU,EAAE;AACpD,UAAQ,IAAI,uBAAuB,KAAK,MAAM,EAAE;AAChD,UAAQ,IAAI,uBAAuB,KAAK,SAAS,EAAE;AACnD,UAAQ,IAAI,uBAAuB,KAAK,OAAO,EAAE;AACjD,UAAQ,IAAI,uBAAuB,KAAK,WAAW,EAAE;AACrD,UAAQ,IAAI,uBAAuB,KAAK,aAAa,EAAE;AACvD,UAAQ,IAAI;AACZ,UAAQ,IAAI,iBAAiB;AAC7B,UAAQ,IAAI,uBAAuB,KAAK,cAAc,SAAS,WAAM,QAAG,EAAE;AAC1E,MAAI,KAAK,cAAc,QAAQ;AAC3B,YAAQ,IAAI,uBAAuB,KAAK,cAAc,WAAW,SAAS,EAAE;AAAA,EAChF;AACJ;AAEA,SAASA,SAAQ,KAAqB;AAClC,MAAI,IAAI,UAAU,EAAG,QAAO;AAC5B,SAAO,SAAS,IAAI,MAAM,EAAE;AAChC;AAEA,eAAeD,oBAAmE;AAC9E,QAAM,cAAcF,OAAK,QAAQ,IAAI,GAAG,OAAO;AAC/C,MAAI;AACA,UAAMI,KAAG,OAAO,WAAW;AAE3B,WAAO,EAAE,QAAQ,MAAM,SAAS,SAAS;AAAA,EAC7C,QAAQ;AACJ,WAAO,EAAE,QAAQ,MAAM;AAAA,EAC3B;AACJ;;;ACjFA,SAAS,WAAAC,iBAAe;AACxB,SAAS,WAAAC,iBAAe;AACxB,SAAS,YAAAC,iBAAgB;AASzB,IAAMC,UAAS;AAAA,EACX,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,KAAK;AAAA,EACL,OAAO;AAAA,EACP,MAAM;AACV;AAKO,SAAS,0BAAmC;AAC/C,SAAO,IAAIC,UAAQ,aAAa,EAC3B,YAAY,yCAAyC,EACrD,OAAO,WAAW,2CAA2C,EAC7D,OAAO,WAAW,mCAAmC,EACrD,OAAO,OAAO,YAAkD;AAC7D,UAAM,iBAAiB,OAAO;AAAA,EAClC,CAAC;AACT;AAEA,eAAe,iBAAiB,SAA+C;AAC3E,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,SAAS,MAAM,cAAc,KAAK;AAExC,MAAI,CAAC,QAAQ;AACT,UAAM,IAAI,gBAAgB,yBAAyB,WAAW,CAAC,eAAe;AAAA,EAClF;AAEA,MAAI;AAEA,YAAQ,IAAI,GAAGD,QAAO,IAAI,oCAA6BA,QAAO,KAAK,EAAE;AAErE,UAAM,WAAW,MAAM,MAAM,GAAG,OAAO,MAAM,wBAAwB;AAAA,MACjE,SAAS;AAAA,QACL,mBAAmB,OAAO;AAAA,MAC9B;AAAA,MACA,QAAQ,YAAY,QAAQ,GAAK;AAAA;AAAA,IACrC,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AACd,YAAM,IAAI,MAAM,gCAAgC,SAAS,UAAU,EAAE;AAAA,IACzE;AAEA,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,UAAM,gBAAgB,KAAK;AAC3B,UAAM,iBAAiB,gBAAY;AAEnC,YAAQ,IAAI;AAAA,EAAKA,QAAO,IAAI,mBAAmBA,QAAO,KAAK,IAAI,cAAc,EAAE;AAC/E,YAAQ,IAAI,GAAGA,QAAO,IAAI,kBAAkBA,QAAO,KAAK,KAAK,aAAa;AAAA,CAAI;AAE9E,QAAI,CAACE,gBAAe,eAAe,cAAc,GAAG;AAChD,cAAQ,IAAI,GAAGF,QAAO,KAAK,+CAA0CA,QAAO,KAAK;AAAA,CAAI;AACrF;AAAA,IACJ;AAGA,YAAQ,IAAI,GAAGA,QAAO,MAAM,2WAA+DA,QAAO,KAAK,EAAE;AACzG,YAAQ,IAAI,GAAGA,QAAO,MAAM,SAAIA,QAAO,KAAK,KAAKA,QAAO,IAAI,kCAAwBA,QAAO,KAAK,IAAI,cAAc,WAAMA,QAAO,IAAI,GAAG,aAAa,GAAGA,QAAO,KAAK,qBAAqBA,QAAO,MAAM,SAAIA,QAAO,KAAK,EAAE;AACtN,YAAQ,IAAI,GAAGA,QAAO,MAAM,2WAA+DA,QAAO,KAAK;AAAA,CAAI;AAG3G,QAAI,QAAQ,OAAO;AACf,cAAQ,IAAI,GAAGA,QAAO,IAAI,QAAQ,WAAW,CAAC,+CAA+CA,QAAO,KAAK;AAAA,CAAI;AAC7G;AAAA,IACJ;AAGA,QAAI,CAAC,QAAQ,OAAO;AAChB,YAAM,eAAe,MAAMG,UAAQ;AAAA,QAC/B,SAAS;AAAA,QACT,SAAS;AAAA,MACb,CAAC;AAED,UAAI,CAAC,cAAc;AACf,gBAAQ,IAAI,GAAGH,QAAO,MAAM,kCAAwBA,QAAO,KAAK;AAAA,CAAI;AACpE;AAAA,MACJ;AAAA,IACJ;AAGA,YAAQ,IAAI;AAAA,EAAKA,QAAO,IAAI,yCAAkCA,QAAO,KAAK;AAAA,CAAI;AAE9E,QAAI;AAEA,YAAMI,kBAAiBC,sBAAqB;AAC5C,YAAM,iBAAiBC,mBAAkBF,eAAc;AAEvD,cAAQ,IAAI,GAAGJ,QAAO,IAAI,SAASI,eAAc,MAAMJ,QAAO,KAAK,EAAE;AAGrE,MAAAO,UAAS,gBAAgB;AAAA,QACrB,OAAO;AAAA,QACP,KAAK,EAAE,GAAG,QAAQ,KAAK,aAAa,IAAI;AAAA,MAC5C,CAAC;AAED,cAAQ,IAAI;AAAA,EAAKP,QAAO,KAAK,0CAAqC,aAAa,IAAIA,QAAO,KAAK;AAAA,CAAI;AAGnG,kBAAY,eAAe;AAAA,QACvB,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,iBAAiBI;AAAA,MACrB,CAAC;AAGD,yBAAmB;AAAA,IAEvB,SAAS,OAAO;AACZ,cAAQ,MAAM;AAAA,EAAKJ,QAAO,GAAG,wBAAmBA,QAAO,KAAK,EAAE;AAC9D,cAAQ,MAAM,GAAGA,QAAO,GAAG,UAAU,iBAAiB,QAAQ,MAAM,UAAU,eAAe,GAAGA,QAAO,KAAK;AAAA,CAAI;AAChH,cAAQ,MAAM,GAAGA,QAAO,MAAM,gDAAyCA,QAAO,KAAK,EAAE;AACrF,cAAQ,MAAM,MAAMA,QAAO,IAAI,qCAAqCA,QAAO,KAAK;AAAA,CAAI;AACpF,YAAM;AAAA,IACV;AAAA,EAEJ,SAAS,OAAO;AACZ,QAAI,iBAAiB,SAAS,MAAM,QAAQ,SAAS,iBAAiB,GAAG;AACrE,YAAM,IAAI,gBAAgB,yEAAyE;AAAA,IACvG;AACA,UAAM;AAAA,EACV;AACJ;AAKA,SAASE,gBAAe,QAAgB,OAAwB;AAC5D,QAAM,cAAc,OAAO,MAAM,GAAG,EAAE,IAAI,MAAM;AAChD,QAAM,aAAa,MAAM,MAAM,GAAG,EAAE,IAAI,MAAM;AAE9C,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AACxB,UAAM,IAAI,YAAY,CAAC,KAAK;AAC5B,UAAM,IAAI,WAAW,CAAC,KAAK;AAE3B,QAAI,IAAI,EAAG,QAAO;AAClB,QAAI,IAAI,EAAG,QAAO;AAAA,EACtB;AAEA,SAAO;AACX;AAKA,SAASG,wBAAwD;AAE7D,QAAM,YAAY,QAAQ,IAAI,yBAAyB;AAEvD,MAAI,UAAU,SAAS,MAAM,EAAG,QAAO;AACvC,MAAI,UAAU,SAAS,MAAM,EAAG,QAAO;AACvC,MAAI,UAAU,SAAS,KAAK,EAAG,QAAO;AAGtC,MAAI;AACA,IAAAE,UAAS,kBAAkB,EAAE,OAAO,SAAS,CAAC;AAC9C,WAAO;AAAA,EACX,QAAQ;AAAA,EAER;AAEA,MAAI;AACA,IAAAA,UAAS,kBAAkB,EAAE,OAAO,SAAS,CAAC;AAC9C,WAAO;AAAA,EACX,QAAQ;AAAA,EAER;AAEA,MAAI;AACA,IAAAA,UAAS,iBAAiB,EAAE,OAAO,SAAS,CAAC;AAC7C,WAAO;AAAA,EACX,QAAQ;AAAA,EAER;AAGA,SAAO;AACX;AAKA,SAASD,mBAAkBF,iBAAyD;AAChF,QAAM,cAAc;AAEpB,UAAQA,iBAAgB;AAAA,IACpB,KAAK;AACD,aAAO,eAAe,WAAW;AAAA,IACrC,KAAK;AACD,aAAO,mBAAmB,WAAW;AAAA,IACzC,KAAK;AACD,aAAO,cAAc,WAAW;AAAA,IACpC,KAAK;AAAA,IACL;AACI,aAAO,kBAAkB,WAAW;AAAA,EAC5C;AACJ;;;AChNA,SAAS,WAAAI,iBAAe;AACxB,SAAS,WAAAC,iBAAe;AAGjB,SAAS,4BAAqC;AACjD,SAAO,IAAIC,UAAQ,eAAe,EAC7B,YAAY,oBAAoB,EAChC,OAAO,aAAa,mBAAmB,EACvC,OAAO,OAAO,YAAY;AACvB,UAAM,UAAU,IAAI,kBAAkB;AACtC,UAAM,UAAU,MAAM,QAAQ,YAAY,QAAQ,IAAI,CAAC;AAEvD,QAAI,QAAQ,WAAW,GAAG;AACtB,cAAQ,IAAI,mBAAmB;AAC/B;AAAA,IACJ;AAEA,YAAQ,IAAI,SAAS,QAAQ,MAAM,aAAa;AAChD,QAAI,QAAQ,UAAU,GAAG;AACrB,cAAQ,QAAQ,OAAK,QAAQ,IAAI,MAAM,CAAC,EAAE,CAAC;AAAA,IAC/C,OAAO;AACH,cAAQ,MAAM,GAAG,CAAC,EAAE,QAAQ,OAAK,QAAQ,IAAI,MAAM,CAAC,EAAE,CAAC;AACvD,cAAQ,IAAI,aAAa,QAAQ,SAAS,CAAC,OAAO;AAAA,IACtD;AACA,YAAQ,IAAI;AAEZ,QAAI,CAAC,QAAQ,KAAK;AACd,YAAM,KAAK,MAAMC,UAAQ,EAAE,SAAS,uBAAuB,SAAS,MAAM,CAAC;AAC3E,UAAI,CAAC,GAAI;AAAA,IACb;AAEA,UAAM,QAAQ,aAAa,QAAQ,IAAI,CAAC;AACxC,YAAQ,IAAI,yBAAoB;AAAA,EACpC,CAAC;AACT;;;AClCA,SAAS,WAAAC,iBAAe;AACxB,SAAS,YAAAC,WAAU,WAAAC,WAAS,UAAAC,eAAc;AAC1C,OAAOC,UAAQ;AACf,OAAOC,YAAU;AACjB,SAAS,cAAAC,mBAAkB;AAU3B,IAAMC,sBAAoD;AAAA,EACtD,WAAW;AAAA,IACP,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,MACN,4BAA4B;AAAA,MAC5B,8BAA8B;AAAA,MAC9B,+BAA+B;AAAA,MAC/B,kDAAkD;AAAA,IACtD;AAAA,EACJ;AAAA,EACA,iBAAiB;AAAA,IACb,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA;AAAA,MAEN,6DAA6D;AAAA,MAC7D,8CAA8C;AAAA,MAC9C,yCAAyC;AAAA,MACzC,8BAA8B;AAAA;AAAA,MAE9B,gDAAgD;AAAA;AAAA,MAEhD,iBAAiB;AAAA;AAAA,MAEjB,mBAAmB;AAAA;AAAA,MAEnB,gBAAgB;AAAA,MAChB,yBAAyB;AAAA,MACzB,wBAAwB;AAAA;AAAA,MAExB,8BAA8B;AAAA,IAClC;AAAA,EACJ;AAAA,EACA,KAAK;AAAA,IACD,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,MACN,eAAe;AAAA,MACf,+BAA+B;AAAA,MAC/B,2BAA2B;AAAA,MAC3B,YAAY;AAAA,MACZ,uBAAuB;AAAA,IAC3B;AAAA,EACJ;AAAA,EACA,aAAa;AAAA,IACT,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,MACN,wBAAwB;AAAA,QACpB,sBAAsB;AAAA,QACtB,cAAc;AAAA,QACd,gBAAgB;AAAA,QAChB,cAAc;AAAA,QACd,eAAe;AAAA,QACf,eAAe;AAAA,QACf,aAAa;AAAA,QACb,eAAe;AAAA,QACf,gBAAgB;AAAA,QAChB,kBAAkB;AAAA,MACtB;AAAA,MACA,iBAAiB;AAAA,QACb,WAAW;AAAA,QACX,gBAAgB;AAAA,QAChB,mBAAmB;AAAA;AAAA,MACvB;AAAA,IACJ;AAAA,EACJ;AAAA,EACA,QAAQ;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,MACN,kBAAkB;AAAA,QACd,mBAAmB;AAAA,QACnB,uBAAuB;AAAA,QACvB,oBAAoB;AAAA,QACpB,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,eAAe;AAAA,QACf,aAAa;AAAA,MACjB;AAAA,MACA,yBAAyB;AAAA,IAC7B;AAAA,EACJ;AAAA,EACA,YAAY;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,MACN,yBAAyB;AAAA,MACzB,+BAA+B;AAAA,MAC/B,eAAe;AAAA,MACf,oCAAoC;AAAA,IACxC;AAAA,EACJ;AAAA,EACA,iBAAiB;AAAA,IACb,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,MACN,0BAA0B;AAAA,MAC1B,2BAA2B;AAAA,MAC3B,kCAAkC;AAAA,MAClC,8BAA8B;AAAA,MAC9B,yBAAyB;AAAA,MACzB,0BAA0B;AAAA,MAC1B,iCAAiC;AAAA,MACjC,oCAAoC;AAAA,MACpC,2BAA2B;AAAA,QACvB,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,WAAW;AAAA,MACf;AAAA,MACA,gCAAgC;AAAA,MAChC,sBAAsB;AAAA,MACtB,wBAAwB;AAAA,IAC5B;AAAA,EACJ;AAAA,EACA,YAAY;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,MACN,iCAAiC;AAAA,MACjC,+BAA+B;AAAA,MAC/B,uBAAuB;AAAA,MACvB,4BAA4B;AAAA,MAC5B,6BAA6B;AAAA;AAAA,MAC7B,2BAA2B;AAAA,IAC/B;AAAA,EACJ;AACJ;AAEO,SAAS,sBAA+B;AAC3C,QAAM,gBAAgB,IAAIC,UAAQ,QAAQ,EACrC,YAAY,kFAA2C;AAG5D,gBAAc,OAAO,YAAY;AAC7B,UAAMC,iBAAgB;AAAA,EAC1B,CAAC;AAGD,gBACK,QAAQ,QAAQ,EAChB,YAAY,yDAA+B,EAC3C,SAAS,eAAe,8EAAgE,EACxF,OAAO,OAAO,WAAqB;AAChC,QAAI,OAAO,WAAW,GAAG;AACrB,YAAMC,qBAAoB,QAAQ;AAAA,IACtC,OAAO;AACH,YAAMC,aAAY,QAAQ,QAAQ;AAAA,IACtC;AAAA,EACJ,CAAC;AAGL,gBACK,QAAQ,SAAS,EACjB,YAAY,oFAAqD,EACjE,SAAS,eAAe,wCAA0B,EAClD,OAAO,OAAO,WAAqB;AAChC,QAAI,OAAO,WAAW,GAAG;AACrB,YAAMD,qBAAoB,SAAS;AAAA,IACvC,OAAO;AACH,YAAMC,aAAY,QAAQ,SAAS;AAAA,IACvC;AAAA,EACJ,CAAC;AAGL,gBACK,QAAQ,iBAAiB,EACzB,YAAY,iHAAkD,EAC9D,OAAO,YAAY;AAChB,UAAM,YAAY,OAAO,KAAKJ,mBAAkB;AAChD,UAAMI,aAAY,WAAW,QAAQ;AAAA,EACzC,CAAC;AAGL,gBACK,QAAQ,OAAO,EACf,YAAY,2FAAgD,EAC5D,SAAS,eAAe,yFAAkD,EAC1E,OAAO,OAAO,WAAqB;AAChC,UAAMC,eAAc,MAAM;AAAA,EAC9B,CAAC;AAGL,gBACK,QAAQ,MAAM,EACd,YAAY,iFAAuC,EACnD,OAAO,MAAM;AACV,YAAQ,IAAI,8DAA+B;AAC3C,WAAO,QAAQL,mBAAkB,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AACzD,cAAQ,IAAI,KAAK,IAAI,OAAO,EAAE,CAAC,MAAM,MAAM,IAAI,EAAE;AACjD,cAAQ,IAAI,KAAK,IAAI,OAAO,EAAE,CAAC,MAAM,MAAM,WAAW,EAAE;AACxD,cAAQ,IAAI;AAAA,IAChB,CAAC;AAAA,EACL,CAAC;AAEL,SAAO;AACX;AAEA,eAAeE,mBAAkB;AAC7B,UAAQ,IAAI,0DAA8B;AAC1C,UAAQ,IAAI,4UAAyD;AACrE,UAAQ,IAAI,mGAAyD;AACrE,UAAQ,IAAI,uGAAyD;AACrE,UAAQ,IAAI,yGAAyD;AACrE,UAAQ,IAAI,0GAAyD;AACrE,UAAQ,IAAI,4FAAyD;AACrE,UAAQ,IAAI,8UAA2D;AAEvE,QAAM,SAAS,MAAMI,QAAO;AAAA,IACxB,SAAS;AAAA,IACT,SAAS;AAAA,MACL,EAAE,MAAM,iDAA4B,OAAO,SAAS;AAAA,MACpD,EAAE,MAAM,kDAA6B,OAAO,UAAU;AAAA,MACtD,EAAE,MAAM,uDAAsC,OAAO,MAAM;AAAA,MAC3D,EAAE,MAAM,mDAAwB,OAAO,QAAQ;AAAA,IACnD;AAAA,IACA,OAAO;AAAA,EACX,CAAC;AAED,MAAI,WAAW,OAAO;AAClB,UAAM,YAAY,OAAO,KAAKN,mBAAkB;AAChD,UAAMI,aAAY,WAAW,QAAQ;AAAA,EACzC,WAAW,WAAW,SAAS;AAC3B,UAAMC,eAAc,CAAC,CAAC;AAAA,EAC1B,OAAO;AACH,UAAMF,qBAAoB,MAA8B;AAAA,EAC5D;AACJ;AAEA,eAAeA,qBAAoB,QAA8B;AAC7D,QAAM,UAAU,OAAO,QAAQH,mBAAkB,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO;AAAA,IACtE,MAAM,GAAG,MAAM,IAAI,MAAM,MAAM,WAAW;AAAA,IAC1C,OAAO;AAAA,EACX,EAAE;AAEF,MAAI;AACA,UAAM,iBAAiB,MAAMO,UAAS;AAAA,MAClC,SAAS,yCAAoB,WAAW,WAAW,WAAW,SAAS;AAAA,MACvE;AAAA,MACA,OAAO;AAAA,IACX,CAAC;AAED,QAAI,eAAe,WAAW,GAAG;AAC7B,cAAQ,IAAI,8DAA+B;AAC3C,cAAQ,IAAI,qIAAwE;AACpF;AAAA,IACJ;AAEA,UAAMH,aAAY,gBAAgB,MAAM;AAAA,EAC5C,QAAQ;AACJ,YAAQ,IAAI,2CAAsB;AAAA,EACtC;AACJ;AAEA,eAAeA,aAAY,WAAqB,QAA8B;AAC1E,QAAM,YAAYI,OAAK,KAAK,QAAQ,IAAI,GAAG,SAAS;AACpD,QAAM,eAAeA,OAAK,KAAK,WAAW,eAAe;AAGzD,QAAM,gBAAgB,UAAU,OAAO,SAAO,CAACR,oBAAmB,GAAG,CAAC;AACtE,MAAI,cAAc,SAAS,GAAG;AAC1B,YAAQ,IAAI;AAAA,4CAA0B,cAAc,KAAK,IAAI,CAAC,EAAE;AAChE,YAAQ,IAAI,iGAA6D;AACzE;AAAA,EACJ;AAGA,MAAI,CAACS,YAAW,SAAS,GAAG;AACxB,UAAMC,KAAG,MAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAC7C,YAAQ,IAAI,0DAA4B;AAAA,EAC5C;AAGA,MAAI,kBAA2C,CAAC;AAChD,MAAID,YAAW,YAAY,GAAG;AAC1B,QAAI;AACA,YAAM,UAAU,MAAMC,KAAG,SAAS,cAAc,OAAO;AACvD,wBAAkB,KAAK,MAAM,OAAO;AACpC,cAAQ,IAAI,kGAA6C;AAAA,IAC7D,QAAQ;AACJ,cAAQ,KAAK,kGAAyD;AACtE,YAAM,mBAAmB,MAAMC,UAAQ;AAAA,QACnC,SAAS;AAAA,QACT,SAAS;AAAA,MACb,CAAC;AAED,UAAI,CAAC,kBAAkB;AACnB,gBAAQ,IAAI,yCAAoB;AAChC;AAAA,MACJ;AACA,wBAAkB,CAAC;AAAA,IACvB;AAAA,EACJ;AAGA,QAAM,cAAc,EAAE,GAAG,gBAAgB;AAEzC,UAAQ,IAAI;AAAA,sBAAa,WAAW,WAAW,WAAW,SAAS;AAAA,CAAc;AAEjF,aAAW,OAAO,WAAW;AACzB,UAAM,QAAQX,oBAAmB,GAAG;AACpC,YAAQ,IAAI,MAAM,WAAW,WAAW,WAAM,QAAG,IAAI,MAAM,IAAI,EAAE;AAEjE,QAAI,WAAW,UAAU;AAErB,iBAAW,CAAC,YAAY,YAAY,KAAK,OAAO,QAAQ,MAAM,QAAQ,GAAG;AACrE,YAAI,OAAO,iBAAiB,YAAY,iBAAiB,QAAQ,CAAC,MAAM,QAAQ,YAAY,KACxF,OAAO,YAAY,UAAU,MAAM,YAAY,YAAY,UAAU,MAAM,MAAM;AACjF,sBAAY,UAAU,IAAI;AAAA,YACtB,GAAI,YAAY,UAAU;AAAA,YAC1B,GAAG;AAAA,UACP;AAAA,QACJ,OAAO;AACH,sBAAY,UAAU,IAAI;AAAA,QAC9B;AAAA,MACJ;AAAA,IACJ,OAAO;AAEH,iBAAW,cAAc,OAAO,KAAK,MAAM,QAAQ,GAAG;AAClD,eAAO,YAAY,UAAU;AAAA,MACjC;AAAA,IACJ;AAAA,EACJ;AAGA,QAAMU,KAAG,UAAU,cAAc,KAAK,UAAU,aAAa,MAAM,CAAC,CAAC;AACrE,UAAQ,IAAI;AAAA,6EAAuC,YAAY,EAAE;AACjE,UAAQ,IAAI,sHAAuD;AACvE;AAEA,eAAeL,eAAc,WAAqB;AAC9C,QAAM,YAAYG,OAAK,KAAK,QAAQ,IAAI,GAAG,SAAS;AACpD,QAAM,eAAeA,OAAK,KAAK,WAAW,eAAe;AAEzD,MAAI,CAACC,YAAW,YAAY,GAAG;AAC3B,YAAQ,IAAI,8DAAyC;AACrD;AAAA,EACJ;AAEA,QAAM,eAAe,MAAME,UAAQ;AAAA,IAC/B,SAAS,UAAU,WAAW,IACxB,mGACA,yBAAmB,UAAU,KAAK,IAAI,CAAC;AAAA,IAC7C,SAAS;AAAA,EACb,CAAC;AAED,MAAI,CAAC,cAAc;AACf,YAAQ,IAAI,yCAAoB;AAChC;AAAA,EACJ;AAEA,MAAI,UAAU,WAAW,GAAG;AAExB,UAAMD,KAAG,OAAO,YAAY;AAC5B,YAAQ,IAAI,+CAA+B;AAAA,EAC/C,OAAO;AAEH,UAAMN,aAAY,WAAW,SAAS;AAAA,EAC1C;AAEA,UAAQ,IAAI,sHAAuD;AACvE;;;AC3XA,OAAOQ,aAAW;AAClB,SAAS,UAAAC,eAAc;AACvB,SAAS,WAAAC,iBAAe;AAQjB,SAAS,uBAAgC;AAC5C,QAAM,MAAM,IAAIC,UAAQ,SAAS,EAC5B,YAAY,2EAA+C,EAC3D,OAAO,eAAe,wFAA+D,EACrF,OAAO,iBAAiB,mGAA0E,EAClG,OAAO,WAAW,+DAA6C,EAC/D,OAAO,OAAO,YAA8D;AAEzE,QAAI;AACJ,QAAI,QAAQ,KAAK;AACb,YAAM,YAAY,CAAC,UAAU,YAAY,eAAe,MAAM;AAC9D,UAAI,CAAC,UAAU,SAAS,QAAQ,GAAG,GAAG;AAClC,gBAAQ,MAAM,yCAAuB,QAAQ,GAAG,EAAE;AAClD,gBAAQ,MAAM,4BAAkB,UAAU,KAAK,IAAI,CAAC,EAAE;AACtD,gBAAQ,KAAK,CAAC;AAAA,MAClB;AACA,mBAAa,QAAQ;AAAA,IACzB;AAGA,QAAI;AACJ,QAAI,QAAQ,MAAM;AACd,YAAM,aAAa,CAAC,SAAS,aAAa,UAAU,UAAU,WAAW,SAAS;AAClF,UAAI,CAAC,WAAW,SAAS,QAAQ,IAAI,GAAG;AACpC,gBAAQ,MAAM,uDAAgC,QAAQ,IAAI,EAAE;AAC5D,gBAAQ,MAAM,kCAAmB,WAAW,KAAK,IAAI,CAAC,EAAE;AACxD,gBAAQ,KAAK,CAAC;AAAA,MAClB;AACA,oBAAc,QAAQ;AAAA,IAC1B;AAGA,QAAI,QAAQ,OAAO;AACf,YAAMC,YAAW;AACjB;AAAA,IACJ;AAGA,UAAM,EAAE,cAAc,IAAIC;AAAA,MACtBC,QAAM,cAAc,YAAY;AAAA,QAC5B;AAAA,QACA;AAAA,QACA,QAAQ,MAAM;AACV,kBAAQ,KAAK,CAAC;AAAA,QAClB;AAAA,MACJ,CAAC;AAAA,IACL;AAEA,UAAM,cAAc;AAAA,EACxB,CAAC;AAEL,SAAO;AACX;AAKA,eAAeF,cAA4B;AACvC,QAAM,UAAU,IAAI,sBAAsB;AAE1C,UAAQ,IAAI,0CAA2B;AAEvC,MAAI;AACA,UAAM,UAAU,MAAM,QAAQ,QAAQ;AAEtC,QAAI,QAAQ,KAAK,WAAW,GAAG;AAC3B,cAAQ,IAAI,wDAAgC;AAC5C,cAAQ,IAAI,yGAAgE;AAC5E;AAAA,IACJ;AAEA,YAAQ,IAAI,sCAAuB;AACnC,YAAQ,IAAI,sBAAe,QAAQ,WAAW,EAAE;AAChD,YAAQ,IAAI,wBAAiB,QAAQ,SAAS,eAAe,OAAO,CAAC;AAAA,CAAI;AAEzE,eAAW,cAAc,QAAQ,MAAM;AACnC,cAAQ,IAAI,GAAG,WAAW,OAAO,IAAI,IAAI,WAAW,OAAO,IAAI,EAAE;AACjE,cAAQ,IAAI,YAAY,WAAW,OAAO,QAAQ,EAAE;AACpD,cAAQ,IAAI,aAAa,WAAW,MAAM,UAAU,EAAE;AAEtD,YAAM,QAAkB,CAAC;AACzB,UAAI,WAAW,MAAM,OAAO,MAAO,OAAM,KAAK,GAAG,WAAW,MAAM,OAAO,KAAK,QAAQ;AACtF,UAAI,WAAW,MAAM,OAAO,UAAW,OAAM,KAAK,GAAG,WAAW,MAAM,OAAO,SAAS,YAAY;AAClG,UAAI,WAAW,MAAM,OAAO,OAAQ,OAAM,KAAK,GAAG,WAAW,MAAM,OAAO,MAAM,SAAS;AACzF,UAAI,WAAW,MAAM,OAAO,OAAQ,OAAM,KAAK,GAAG,WAAW,MAAM,OAAO,MAAM,SAAS;AACzF,UAAI,WAAW,MAAM,OAAO,QAAS,OAAM,KAAK,GAAG,WAAW,MAAM,OAAO,OAAO,UAAU;AAC5F,UAAI,WAAW,MAAM,OAAO,QAAS,OAAM,KAAK,GAAG,WAAW,MAAM,OAAO,OAAO,UAAU;AAE5F,UAAI,MAAM,SAAS,GAAG;AAClB,gBAAQ,IAAI,iBAAiB,MAAM,KAAK,IAAI,CAAC,EAAE;AAAA,MACnD;AAEA,cAAQ,IAAI,EAAE;AAAA,IAClB;AAEA,YAAQ,IAAI,qBAAW,QAAQ,UAAU;AAAA,CAAU;AAAA,EACvD,SAAS,OAAO;AACZ,YAAQ,MAAM,wCAA2B,KAAK;AAC9C,YAAQ,KAAK,CAAC;AAAA,EAClB;AACJ;;;AC3GA,SAAS,WAAAG,iBAAe;AACxB,SAAS,YAAAC,WAAU,WAAAC,iBAAe;AAS3B,SAAS,0BAAmC;AAC/C,QAAM,MAAM,IAAIC,UAAQ,aAAa,EAChC,YAAY,qFAAkF,EAC9F,OAAO,mBAAmB,mEAAmE,EAC7F,OAAO,qBAAqB,4CAA4C,EACxE,OAAO,aAAa,uCAAuC,EAC3D,OAAO,OAAO,YAIT;AACF,UAAM,cAAc,OAAO;AAAA,EAC/B,CAAC;AAEL,SAAO;AACX;AAEA,eAAe,cAAc,SAI1B;AACC,QAAM,UAAU,IAAI,kBAAkB;AAEtC,UAAQ,IAAI,yDAA+C;AAG3D,UAAQ,IAAI,wCAAiC;AAC7C,QAAM,UAAU,MAAM,QAAQ,gBAAgB;AAE9C,MAAI,QAAQ,eAAe,GAAG;AAC1B,YAAQ,IAAI,gEAA2C;AACvD,YAAQ,IAAI,qGAAuE;AACnF,YAAQ,KAAK,CAAC;AAAA,EAClB;AAEA,UAAQ,IAAI,aAAa,QAAQ,MAAM,MAAM,WAAW,QAAQ,UAAU,MAAM;AAAA,CAAc;AAG9F,MAAI;AACJ,MAAI,QAAQ,OAAO,QAAQ,IAAI,SAAS,GAAG;AACvC,mBAAe,QAAQ;AAAA,EAC3B,OAAO;AACH,UAAM,aAAa,iBAAiB,EAAE,IAAI,SAAO;AAC7C,YAAM,SAAS,sBAAsB,GAAG;AACxC,aAAO;AAAA,QACH,MAAM,GAAG,OAAO,IAAI,IAAI,OAAO,IAAI;AAAA,QACnC,OAAO;AAAA,MACX;AAAA,IACJ,CAAC;AAED,mBAAe,MAAMC,UAAS;AAAA,MAC1B,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA,IACX,CAAC;AAED,QAAI,aAAa,WAAW,GAAG;AAC3B,cAAQ,IAAI,0DAA8B;AAC1C,cAAQ,IAAI,wDAAiC;AAC7C,cAAQ,KAAK,CAAC;AAAA,IAClB;AAAA,EACJ;AAGA,MAAI;AACJ,MAAI,QAAQ,QAAQ,QAAQ,KAAK,SAAS,GAAG;AACzC,oBAAgB,QAAQ;AAAA,EAC5B,OAAO;AACH,UAAM,cAAc;AAAA,MAChB,EAAE,MAAM,UAAU,QAAQ,MAAM,MAAM,WAAW,OAAO,QAA8B;AAAA,MACtF,EAAE,MAAM,cAAc,QAAQ,UAAU,MAAM,WAAW,OAAO,YAAkC;AAAA,MAClG,EAAE,MAAM,aAAa,QAAQ,SAAS,MAAM,WAAW,OAAO,WAAiC;AAAA,IACnG;AAEA,oBAAgB,MAAMA,UAAS;AAAA,MAC3B,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA,IACX,CAAC;AAED,QAAI,cAAc,WAAW,GAAG;AAC5B,cAAQ,IAAI,mEAAuC;AACnD,cAAQ,IAAI,iEAA0C;AACtD,cAAQ,KAAK,CAAC;AAAA,IAClB;AAAA,EACJ;AAGA,QAAM,aAAa,cAAc,OAAO,CAAC,KAAK,SAAS;AACnD,WAAO,OAAO,SAAS,UAAU,QAAQ,MAAM,SAClC,SAAS,cAAc,QAAQ,UAAU,SACzC,QAAQ,SAAS;AAAA,EAClC,GAAG,CAAC;AACJ,QAAM,aAAa,aAAa,aAAa;AAG7C,UAAQ,IAAI,wBAAiB;AAC7B,UAAQ,IAAI,YAAY,aAAa,IAAI,SAAO,sBAAsB,GAAG,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC,EAAE;AAC7F,UAAQ,IAAI,qBAAqB,cAAc,KAAK,IAAI,CAAC,EAAE;AAC3D,UAAQ,IAAI,0BAA0B,UAAU;AAAA,CAAe;AAE/D,MAAI,QAAQ,QAAQ;AAChB,YAAQ,IAAI,gDAAyC;AAAA,EACzD;AAGA,QAAM,YAAY,MAAMC,UAAQ;AAAA,IAC5B,SAAS;AAAA,IACT,SAAS;AAAA,EACb,CAAC;AAED,MAAI,CAAC,WAAW;AACZ,YAAQ,IAAI,iCAA4B;AACxC,YAAQ,KAAK,CAAC;AAAA,EAClB;AAGA,UAAQ,IAAI,4BAAqB;AACjC,MAAI,YAAY;AAEhB,QAAM,UAAU,MAAM,QAAQ;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC,WAAW;AACR;AACA,YAAM,OAAO,OAAO,WAAW,YAAY,WAC/B,OAAO,WAAW,YAAY,WAC9B,OAAO,WAAW,UAAU,WAAM;AAE9C,YAAM,aAAa,KAAK,MAAO,YAAY,aAAc,GAAG;AAC5D,cAAQ,IAAI,MAAM,IAAI,KAAK,UAAU,MAAM,OAAO,UAAU,EAAE;AAE9D,UAAI,OAAO,WAAW,WAAW,OAAO,OAAO;AAC3C,gBAAQ,IAAI,gBAAgB,OAAO,KAAK,EAAE;AAAA,MAC9C;AAAA,IACJ;AAAA,EACJ;AAGA,QAAM,UAAU,QAAQ,OAAO,OAAK,EAAE,WAAW,SAAS,EAAE;AAC5D,QAAM,UAAU,QAAQ,OAAO,OAAK,EAAE,WAAW,SAAS,EAAE;AAC5D,QAAM,UAAU,QAAQ,OAAO,OAAK,EAAE,WAAW,SAAS,EAAE;AAC5D,QAAM,SAAS,QAAQ,OAAO,OAAK,EAAE,WAAW,OAAO,EAAE;AAEzD,UAAQ,IAAI,gCAA2B;AACvC,UAAQ,IAAI,eAAe,OAAO,EAAE;AACpC,UAAQ,IAAI,eAAe,OAAO,EAAE;AACpC,MAAI,UAAU,EAAG,SAAQ,IAAI,eAAe,OAAO,EAAE;AACrD,MAAI,SAAS,EAAG,SAAQ,IAAI,cAAc,MAAM,EAAE;AAClD,UAAQ,IAAI,EAAE;AAClB;;;ACrKA,OAAOC,YAAW;AAClB,OAAOC,aAAW;AAClB,OAAO,cAAc;AACrB,OAAO,YAAY;AAMZ,SAAS,eAAe,SAAuB;AAEpD,QAAM,QAAQ,OAAO,SAAS,QAAQ,EAAE,MAAM,QAAQ,CAAC;AACvD,UAAQ,IAAI,SAAS,OAAO,KAAK,CAAC;AAGlC,UAAQ;AAAA,IACNC,OAAMC,QAAM,KAAK,uBAAuB,OAAO,EAAE,GAAG;AAAA,MAClD,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,QAAQ,EAAE;AAAA,MAChD,aAAa;AAAA,MACb,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AAGA,UAAQ,IAAIA,QAAM,KAAK,gDAA4B,CAAC;AACpD,UAAQ,IAAI,kEAA+C;AAC3D,UAAQ,IAAI,0EAAgD;AAC5D,UAAQ,IAAI,uGAA8D;AAC1E,UAAQ,IAAI,+DAA6C;AACzD,UAAQ,IAAI,wDAAgD;AAE5D,UAAQ,IAAIA,QAAM,KAAK,wCAAyB,CAAC;AACjD,UAAQ,IAAI,iEAAoD;AAChE,UAAQ,IAAI,mEAA8C;AAC1D,UAAQ,IAAI,mEAA+C;AAE3D,UAAQ,IAAIA,QAAM,KAAK,2CAAuB,CAAC;AAC/C,UAAQ,IAAI,kDAAqC;AACjD,UAAQ,IAAI,mDAA8C;AAC1D,UAAQ,IAAI,gDAA6C;AAEzD,UAAQ,IAAIA,QAAM,KAAK,sBAAe,CAAC;AACvC,UAAQ,IAAI,iEAA6C;AACzD,UAAQ,IAAI,mDAAyC;AACrD,UAAQ,IAAI,0DAAwC;AACpD,UAAQ,IAAI,iEAAuC;AAEnD,UAAQ,IAAIA,QAAM,KAAK,qBAAc,CAAC;AACtC,UAAQ,IAAI,gDAAwC;AACpD,UAAQ,IAAI,gDAAwC;AACpD,UAAQ,IAAI,gDAAwC;AACpD,UAAQ,IAAI,wCAAwC;AAEpD,UAAQ,IAAIA,QAAM,KAAK,iCAAe,CAAC;AACvC,UAAQ,IAAI,iDAAuC;AACnD,UAAQ,IAAI,kDAAwC;AACpD,UAAQ,IAAI,uCAAuC;AAEnD,QAAM,OAAO,WAAW;AACxB,UAAQ,IAAIA,QAAM,IAAI;AAAA,qBAAc,IAAI,oDAAgC,CAAC;AAC3E;AAKO,SAAS,mBAAmB,aAA2B;AAC5D,UAAQ,MAAMA,QAAM,IAAI,gDAAyB,WAAW,EAAE,CAAC;AAC/D,QAAM,OAAO,WAAW;AACxB,UAAQ,MAAMA,QAAM,IAAI;AAAA,2BAAiB,IAAI,iDAA+B,CAAC;AAC/E;;;ApKjEA,iBAAiB;AA8FjB,IAAM,UAAU,IAAIC,UAAQ;AAG5B,IAAI,QAAQ,KAAK,SAAS,IAAI,KAAK,QAAQ,KAAK,SAAS,WAAW,GAAG;AACrE,UAAQ,IAAI,gBAAY,OAAO;AAE/B,MAAI,CAAC,QAAQ,KAAK,SAAS,qBAAqB,GAAG;AACjD,UAAM,qBAAqB;AAAA,EAC7B;AACA,UAAQ,KAAK,CAAC;AAChB;AAEA,QACG,KAAK,WAAW,CAAC,EACjB,YAAY,+BAA+B,EAC3C,cAAc;AAAA,EACb,YAAY,MAAM;AAChB,mBAAe,gBAAY,OAAO;AAClC,WAAO;AAAA,EACT;AACF,CAAC;AAIH,QAEG,OAAO,aAAa,0BAA0B,KAAK,EACnD,OAAO,UAAU,0BAA0B,KAAK,EAChD,OAAO,uBAAuB,oCAAoC,KAAK;AAK1E,QAAQ,WAAW,kBAAkB,CAAC;AACtC,QAAQ,WAAW,oBAAoB,CAAC;AAKxC,QAAQ,WAAW,mBAAmB,CAAC;AACvC,QAAQ,WAAW,sBAAsB,CAAC;AAC1C,QAAQ,WAAW,oBAAoB,CAAC;AACxC,QAAQ,WAAW,mBAAmB,CAAC;AAKvC,QAAQ,WAAW,iBAAiB,CAAC;AAKrC,QAAQ,WAAW,mBAAmB,CAAC;AAKvC,QAAQ,WAAW,kBAAkB,CAAC;AACtC,QAAQ,WAAW,wBAAwB,CAAC;AAC5C,QAAQ,WAAW,mBAAmB,CAAC;AACvC,QAAQ,WAAW,uBAAuB,CAAC;AAC3C,QAAQ,WAAW,mBAAmB,CAAC;AACvC,QAAQ,WAAW,sBAAsB,CAAC;AAC1C,QAAQ,WAAW,wBAAwB,CAAC;AAC5C,QAAQ,WAAW,oBAAoB,CAAC;AAKxC,QAAQ,WAAW,mBAAmB,CAAC;AACvC,QAAQ,WAAW,kBAAkB,CAAC;AAKtC,QAAQ,WAAW,mBAAmB,CAAC;AAKvC,QAAQ,WAAW,iBAAiB,CAAC;AAIrC,QAAQ,WAAW,mBAAmB,CAAC;AAMvC,QAAQ,WAAW,qBAAqB,CAAC;AACzC,QAAQ,WAAW,mBAAmB,CAAC;AAKvC,IAAM,iBAAiB,IAAIA,UAAQ,SAAS,EACzC,YAAY,+BAA+B;AAE9C,eAAe,WAAW,0BAA0B,CAAC;AAErD,IAAM,cAAc,IAAIA,UAAQ,MAAM,EACnC,YAAY,uCAAuC;AAEtD,YAAY,WAAW,uBAAuB,CAAC;AAC/C,YAAY,WAAW,yBAAyB,CAAC;AAEjD,eAAe,WAAW,WAAW;AAErC,QAAQ,WAAW,cAAc;AASjC,QAAQ,WAAW,kBAAkB,GAAG,EAAE,QAAQ,KAAK,CAAC;AAGxD,QAAQ,WAAW,wBAAwB,GAAG,EAAE,QAAQ,KAAK,CAAC;AAG9D,QAAQ,WAAW,0BAA0B,GAAG,EAAE,QAAQ,KAAK,CAAC;AAGhE,QAAQ,WAAW,oBAAoB,GAAG,EAAE,QAAQ,KAAK,CAAC;AAG1D,QAAQ,WAAW,qBAAqB,GAAG,EAAE,QAAQ,KAAK,CAAC;AAG3D,QAAQ,WAAW,wBAAwB,GAAG,EAAE,QAAQ,KAAK,CAAC;AAI9D,QAAQ,GAAG,aAAa,CAAC,aAAa;AACpC,qBAAmB,SAAS,CAAC,CAAC;AAC9B,UAAQ,KAAK,CAAC;AAChB,CAAC;AAGD,QAAQ,GAAG,sBAAsB,CAAC,UAAU;AAE1C,OAAK,IAAI,gBAAgB,EAAE,SAAS,OAAO;AAAA,IACzC,SAAS,QAAQ,KAAK,MAAM,CAAC,EAAE,KAAK,GAAG;AAAA,IACvC,SAASC,UAAS,QAAQ,IAAI,CAAC;AAAA,EACjC,CAAC;AAED,MAAI,iBAAiB,WAAW;AAC9B,YAAQ,MAAM,UAAK,MAAM,OAAO;AAChC,YAAQ,KAAK,MAAM,QAAQ;AAAA,EAC7B,WAAW,iBAAiB,OAAO;AACjC,YAAQ,MAAM,4BAAuB,MAAM,OAAO;AAClD,QAAI,QAAQ,KAAK,EAAE,SAAS;AAC1B,cAAQ,MAAM,MAAM,KAAK;AAAA,IAC3B;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAGD,QAAQ,WAAW,QAAQ,IAAI,EAAE,KAAK,YAAY;AAChD,QAAM,OAAO,QAAQ,KAAK;AAG1B,MAAI,CAAC,KAAK,iBAAiB;AACzB,UAAM,qBAAqB;AAAA,EAC7B;AACF,CAAC,EAAE,MAAM,CAAC,UAAU;AAElB,OAAK,IAAI,gBAAgB,EAAE,SAAS,OAAO;AAAA,IACzC,SAAS,QAAQ,KAAK,MAAM,CAAC,EAAE,KAAK,GAAG;AAAA,IACvC,SAASA,UAAS,QAAQ,IAAI,CAAC;AAAA,EACjC,CAAC;AAED,UAAQ,MAAM,UAAK,MAAM,OAAO;AAChC,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":["Command","path","basename","fs","join","homedir","chalk","homedir","homedir","chalk","resolve","Command","chalk","boxen","fs","join","homedir","join","homedir","path","fs","fs","join","homedir","Command","join","homedir","boxen","chalk","fs","React","Command","React","Box","Text","fs","fs","React","Text","React","Text","selectedPackage","input","React","Box","Text","Command","React","React","render","Command","React","useState","useEffect","useMemo","Box","Text","useInput","useApp","Spinner","TextInput","useApp","useState","useMemo","useEffect","selectedPackage","useInput","input","React","Box","Text","Spinner","TextInput","Command","render","React","Command","chalk","Command","chalk","Command","chalk","Command","chalk","Command","chalk","React","render","Command","React","useState","useEffect","Box","Text","useInput","useApp","React","useState","Box","Text","useInput","input","React","useState","Box","Text","useInput","input","React","useState","Box","Text","useInput","input","React","useState","Box","Text","useInput","input","fs","path","matter","path","fs","matter","useApp","useState","useEffect","useInput","input","React","Box","Text","Command","render","React","Command","confirm","fs","path","Command","path","fs","confirm","Command","checkbox","confirm","Command","checkbox","confirm","Command","fs","join","join","path","fs","Command","summary","chalk","Command","React","render","Command","React","useState","useEffect","useCallback","Box","Text","useInput","useApp","React","Box","colors","React","Box","Text","React","Box","Text","colors","React","Box","Text","React","Box","colors","Text","React","Box","colors","React","Box","React","Box","Text","React","Box","Text","colors","React","Box","Text","React","Box","Text","colors","React","Box","React","Box","Text","React","Box","Text","React","Box","Text","colors","React","Box","Text","React","Box","Text","colors","React","Box","Text","React","Box","Text","colors","React","Box","colors","Text","React","useState","Box","Text","useInput","TextInput","useState","useEffect","useMemo","matter","chalk","useState","useEffect","matter","useMemo","matter","useState","useInput","input","React","Box","Text","colors","TextInput","useApp","useState","useEffect","useCallback","useInput","input","React","Box","Text","Command","render","React","Command","React","render","React","useState","useEffect","useMemo","useCallback","useRef","Box","Text","useInput","useApp","useStdout","Spinner","useState","useCallback","useState","useEffect","useCallback","React","memo","Box","Text","Spinner","React","Box","Text","React","memo","Box","Text","TextInput","memo","React","Box","Text","Spinner","React","useState","Box","Text","useInput","input","useApp","useStdout","useRef","useState","useEffect","useMemo","useCallback","useInput","input","React","Box","Text","Spinner","fs","path","fs","path","path","resolve","fs","render","React","resolve","Command","Command","chalk","boxen","maskKey","boxen","chalk","Command","Command","Table","chalk","chalk","Table","Command","Command","fs","path","input","input","Command","Command","chalk","Command","Command","Command","Command","Command","Command","Command","confirm","Command","confirm","chalk","Command","Command","select","confirm","fs","join","fs","join","select","confirm","Command","Command","confirm","os","fs","basename","join","nodeVersion","Command","os","nodeVersion","maskKey","basename","join","fs","confirm","Command","chalk","Command","chalk","Table","Command","path","Table","chalk","Command","Command","Command","confirm","Command","confirm","chalk","Command","Command","chalk","Command","crypto","input","Command","Command","Command","Command","input","Command","Command","readFile","input","readFile","Command","Command","readFile","input","readFile","Command","Command","readFile","readFile","Command","Command","Command","Command","input","Command","Command","Command","Command","input","Command","Command","input","Command","Command","Command","readFile","marked","TerminalRenderer","React","render","React","useState","Box","Text","useInput","useApp","React","useState","Box","Text","useInput","TextInput","useState","React","useInput","input","Box","Text","TextInput","React","useState","Box","Text","useInput","TextInput","useState","React","useInput","input","Box","Text","TextInput","React","useState","Box","Text","useInput","TextInput","useState","React","useInput","input","Box","Text","TextInput","React","useState","Box","Text","useInput","TextInput","input","useState","useInput","error","React","Box","Text","TextInput","React","useState","Box","Text","useInput","TextInput","input","useState","useInput","React","Box","Text","TextInput","React","useState","Box","Text","useInput","TextInput","input","useState","useInput","error","React","Box","Text","TextInput","React","useState","Box","Text","useInput","TextInput","useState","useInput","input","error","React","Box","Text","TextInput","React","useState","Box","Text","useInput","TextInput","useState","useInput","input","error","React","Box","Text","TextInput","React","useState","Box","Text","useInput","TextInput","useState","useInput","input","error","React","Box","Text","TextInput","React","useState","Box","Text","useInput","TextInput","useState","useInput","input","error","React","Box","Text","TextInput","React","useState","Box","Text","useInput","TextInput","fs","path","input","marked","MENU_ITEMS","useState","useApp","useInput","input","React","Box","Text","resolve","render","React","chalk","Command","Command","chalk","Command","chalk","Table","fs","path","fs","path","pLimit","execSync","fs","path","execSync","fs","path","pLimit","Command","chalk","Table","Command","checkbox","confirm","chalk","ora","Table","Command","ora","chalk","checkbox","confirm","Table","chalk","Command","Command","Command","chalk","Command","chalk","Command","chalk","Command","chalk","Command","chalk","Command","chalk","Command","chalk","Command","chalk","Command","chalk","Command","chalk","Command","chalk","confirm","Command","chalk","picked","confirm","Command","chalk","Command","chalk","Command","chalk","Command","chalk","Command","chalk","Command","chalk","Command","chalk","Command","Command","chalk","Command","chalk","Table","fs","join","join","fs","Command","chalk","Table","Command","Command","Command","fs","join","select","input","checkbox","execa","Command","execa","join","fs","select","input","checkbox","chalk","Command","Command","chalk","Command","chalk","Table","Command","chalk","Table","Command","fs","join","select","confirm","fs","join","Command","select","confirm","join","fs","Command","fs","join","select","confirm","checkbox","fs","join","join","fs","path","Command","select","checkbox","confirm","join","fs","Command","join","select","confirm","Command","select","confirm","join","Command","fs","join","checkbox","confirm","Command","join","fs","confirm","checkbox","files","Command","fs","join","Command","join","fs","path","chalk","Command","Command","confirm","execSync","colors","Command","isNewerVersion","confirm","packageManager","execSync","Command","confirm","select","join","Command","join","select","confirm","Command","readFile","resolve","z","resolve","readFile","z","fetch","pRetry","pLimit","path","Command","Command","resolve","readFile","writeFile","dirname","matter","resolve","action","Command","Command","Command","Command","fs","join","homedir","Command","join","homedir","getProjectStatus","maskKey","fs","Command","confirm","execSync","colors","Command","isNewerVersion","confirm","packageManager","detectPackageManager","getInstallCommand","execSync","Command","confirm","Command","confirm","Command","checkbox","confirm","select","fs","path","existsSync","PERFORMANCE_GROUPS","Command","interactiveMode","selectGroupsToApply","applyGroups","resetSettings","select","checkbox","path","existsSync","fs","confirm","React","render","Command","Command","printStats","render","React","Command","checkbox","confirm","Command","checkbox","confirm","boxen","chalk","boxen","chalk","Command","basename"]}