@tabbio-technologies/cli 1.2.8
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.
- package/README.md +763 -0
- package/dist/chunks/chunk-7LNC3FIV.js +2019 -0
- package/dist/chunks/chunk-7LNC3FIV.js.map +7 -0
- package/dist/chunks/chunk-NAWA6NCZ.js +259 -0
- package/dist/chunks/chunk-NAWA6NCZ.js.map +7 -0
- package/dist/chunks/chunk-NK5RPNSV.js +15 -0
- package/dist/chunks/chunk-NK5RPNSV.js.map +7 -0
- package/dist/chunks/chunk-QVR5KIEQ.js +1976 -0
- package/dist/chunks/chunk-QVR5KIEQ.js.map +7 -0
- package/dist/chunks/chunk-VHHZFMIF.js +162 -0
- package/dist/chunks/chunk-VHHZFMIF.js.map +7 -0
- package/dist/chunks/chunk-Y6GWIFHI.js +227 -0
- package/dist/chunks/chunk-Y6GWIFHI.js.map +7 -0
- package/dist/chunks/entry-WENOOT6W.js +3492 -0
- package/dist/chunks/entry-WENOOT6W.js.map +7 -0
- package/dist/chunks/mount-NGUARMCL.js +79 -0
- package/dist/chunks/mount-NGUARMCL.js.map +7 -0
- package/dist/chunks/program-O2BA5L6Z.js +2755 -0
- package/dist/chunks/program-O2BA5L6Z.js.map +7 -0
- package/dist/chunks/status-I5UAQPBY.js +16 -0
- package/dist/chunks/status-I5UAQPBY.js.map +7 -0
- package/dist/cli.js +66 -0
- package/dist/cli.js.map +7 -0
- package/package.json +65 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/ui/entry.tsx", "../../src/ui/components/ApprovalCard.tsx", "../../src/ui/components/KeyHints.tsx", "../../src/ui/components/KeyValue.tsx", "../../src/ui/components/Rail.tsx", "../../src/ui/components/approval-model.ts", "../../src/ui/components/Form.tsx", "../../src/ui/fuzzy.ts", "../../src/ui/components/form-model.ts", "../../src/ui/screens/chat/Chat.tsx", "../../src/ui/components/editor-model.ts", "../../src/ui/components/SelectList.tsx", "../../src/ui/components/select-model.ts", "../../src/ui/components/StatusBar.tsx", "../../src/ui/components/TextInput.tsx", "../../src/ui/screens/Palette.tsx", "../../src/ui/screens/chat/commands.ts", "../../src/ui/screens/chat/Transcript.tsx", "../../src/ui/components/ArtifactRow.tsx", "../../src/ui/components/Markdown.tsx", "../../src/ui/components/markdown-inline.ts", "../../src/ui/components/Table.tsx", "../../src/ui/components/table-layout.ts", "../../src/ui/components/SourcesList.tsx", "../../src/ui/components/ToolCallRow.tsx", "../../src/ui/screens/chat/useChatCommands.ts", "../../src/ui/screens/chat/useChatSession.ts", "../../src/ui/screens/chat/useArtifactFollowUp.ts", "../../src/ui/screens/home/Home.tsx", "../../src/ui/screens/Approvals.tsx", "../../src/ui/screens/ResultPanel.tsx", "../../src/ui/components/Panel.tsx", "../../src/ui/result-model.ts", "../../src/ui/screens/ToolBrowser.tsx", "../../src/ui/screens/ToolRun.tsx", "../../src/ui/screens/tool-browser-model.ts", "../../src/ui/screens/home/home-model.ts", "../../src/ui/screens/home/HomeView.tsx", "../../src/ui/components/Header.tsx", "../../src/ui/components/Wordmark.tsx", "../../src/ui/services.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Ink entry points, loaded lazily by `ui/index.ts` (hooks) and by the\n * `home` / `chat` commands. Each one renders a screen, waits for it to\n * resolve, and unmounts; Ctrl+C becomes the CANCELLED error (exit 130).\n */\nimport type { AgentMode } from '@tabbio/types';\nimport { Box, Static, Text } from 'ink';\nimport { type ReactNode, useEffect } from 'react';\nimport type { ChatCapabilities } from '../core/capabilities';\nimport type { CatalogTool } from '../core/catalog';\nimport { isDestructiveTool } from '../core/chat-model';\nimport type { CommandContext } from '../core/context';\nimport { interruptedError } from '../core/errors';\nimport type { ApprovalInfo } from '../core/mcp';\nimport { autoFilledProperties } from '../core/schema-flags';\nimport { ApprovalCard } from './components/ApprovalCard';\nimport { approvalOutcomeText } from './components/approval-model';\nimport { Form } from './components/Form';\nimport { createFormState, equivalentCommand } from './components/form-model';\nimport type { ApprovalDecision, ToolRunMeta } from './hooks';\nimport { Page, useTerminalSize } from './layout';\nimport { renderScreen } from './render';\nimport { Chat } from './screens/chat/Chat';\nimport { Home } from './screens/home/Home';\nimport { ResultPanel } from './screens/ResultPanel';\nimport { ToolBrowser } from './screens/ToolBrowser';\nimport { toolLabel } from './screens/ToolRun';\nimport { createUiServices } from './services';\nimport { theme } from './theme';\nimport { oneLine, sentenceCase } from './text';\n\nfunction unwrap<T>(outcome: { status: 'done'; value: T } | { status: 'interrupted' }): T {\n if (outcome.status === 'interrupted') throw interruptedError();\n return outcome.value;\n}\n\nexport async function runBrowseTools(ctx: CommandContext, tools: CatalogTool[], options: { query?: string; group?: string }): Promise<void> {\n const services = createUiServices(ctx);\n unwrap(\n await renderScreen<void>('The tool browser', ({ finish, width, height }) => (\n <ToolBrowser\n tools={tools}\n services={services}\n width={width}\n height={height}\n initialQuery={options.query}\n initialGroup={options.group}\n onExit={() => finish(undefined)}\n />\n )),\n );\n}\n\nexport async function runToolForm(\n _ctx: CommandContext,\n tool: CatalogTool,\n initial: Record<string, unknown>,\n options: { missingRequired: string[] },\n): Promise<Record<string, unknown> | null> {\n const skip = autoFilledProperties(tool, tool.inputSchema);\n const state = createFormState(tool.inputSchema, initial, { skip, missingRequired: options.missingRequired });\n return unwrap(\n await renderScreen<Record<string, unknown> | null>('The input form', ({ finish, width, height }) => (\n <Box flexDirection=\"column\" width={width}>\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text wrap=\"truncate-end\">\n {theme.bold(toolLabel(tool))} {theme.dim(`${theme.symbols.middot} ${oneLine(tool.title)}`)}\n </Text>\n {options.missingRequired.length ? (\n <Text wrap=\"truncate-end\">{theme.dim(`Missing: ${options.missingRequired.join(', ')}`)}</Text>\n ) : null}\n </Box>\n <Form\n initial={state}\n width={width}\n height={Math.max(3, height - 5)}\n isActive\n onSubmit={(input) => finish(input, <Text wrap=\"truncate-end\">{theme.dim(`${theme.symbols.pointer} ${equivalentCommand(tool, input, skip)}`)}</Text>)}\n onCancel={() => finish(null)}\n />\n </Box>\n )),\n );\n}\n\nexport async function runApprovalPrompt(\n ctx: CommandContext,\n approval: ApprovalInfo & { args: Record<string, unknown> },\n): Promise<ApprovalDecision> {\n const shownAt = Date.now();\n const title = sentenceCase(approval.toolName || 'this action');\n return unwrap(\n await renderScreen<ApprovalDecision>('The approval prompt', ({ finish, width }) => (\n <ApprovalCard\n approvalId={approval.approvalId}\n title={title}\n message={approval.message}\n args={approval.args}\n destructive={isDestructiveTool(approval.toolName)}\n context={`Writes to your account ${theme.symbols.middot} profile ${ctx.profile.name}`}\n isActive\n width={width}\n onDecision={(decision) =>\n finish(decision, <Text>{approvalOutcomeText(decision, title, approval.approvalId, Date.now() - shownAt)}</Text>)\n }\n />\n )),\n );\n}\n\n/** Prints its children once into the scrollback via <Static>, then resolves. */\nexport function PrintOnce({ children, onPrinted }: { children: ReactNode; onPrinted(): void }) {\n const { columns } = useTerminalSize();\n useEffect(() => {\n onPrinted();\n }, [onPrinted]);\n return (\n <Static items={['once']}>\n {(key) => (\n <Page key={key} columns={columns}>\n {children}\n </Page>\n )}\n </Static>\n );\n}\n\n/**\n * Result panel for tool commands. It prints and returns (no key wait), so\n * `tabbio cv list` behaves like any CLI command; the interactive panel with\n * j/r/q lives in the tool browser.\n */\nexport async function runShowResult(_ctx: CommandContext, tool: CatalogTool, result: unknown, meta: ToolRunMeta): Promise<void> {\n unwrap(\n await renderScreen<void>('The result panel', ({ finish, width, height }) => (\n <PrintOnce onPrinted={() => finish(undefined)}>\n <ResultPanel\n title={toolLabel(tool)}\n result={result}\n durationMs={meta.durationMs}\n requestId={meta.requestId}\n width={width}\n height={height}\n interactive={false}\n />\n </PrintOnce>\n )),\n );\n}\n\nexport async function runHome(ctx: CommandContext, opts: { mode?: AgentMode; companyId?: string } = {}): Promise<void> {\n const services = createUiServices(ctx);\n await renderScreen<void>(\n 'The home screen',\n ({ finish, width, height }) => (\n <Home services={services} width={width} height={height} mode={opts.mode} companyId={opts.companyId} onExit={() => finish(undefined)} />\n ),\n { ctrlC: 'screen' },\n );\n}\n\nexport type RunChatOptions = {\n mode: AgentMode;\n companyId?: string;\n threadId?: string;\n modelId?: string;\n message?: string;\n /** Research / Image / Result for this chat (flags over the saved choice). */\n capabilities?: ChatCapabilities;\n};\n\nexport async function runChat(ctx: CommandContext, opts: RunChatOptions): Promise<void> {\n const services = createUiServices(ctx);\n await renderScreen<void>(\n 'Chat',\n ({ finish, width, height }) => (\n <Chat\n services={services}\n mode={opts.mode}\n companyId={opts.companyId}\n threadId={opts.threadId}\n modelId={opts.modelId}\n initialMessage={opts.message}\n capabilities={opts.capabilities}\n width={width}\n height={height}\n onExit={() => finish(undefined)}\n />\n ),\n { ctrlC: 'screen' },\n );\n}\n", "import { Box, Text, useInput } from 'ink';\nimport { useEffect, useState } from 'react';\nimport { theme } from '../theme';\nimport { oneLine, padEnd, safeJson, shortId } from '../text';\nimport { KeyHints } from './KeyHints';\nimport { KeyValue, type KeyValueRow } from './KeyValue';\nimport { Rail } from './Rail';\nimport { Spinner } from './Spinner';\nimport { APPROVAL_OPTIONS, type ApprovalCardState, approvalKeyReducer, initialApprovalState } from './approval-model';\nimport type { ApprovalChoice } from '../../core/chat-model';\n\nexport type ApprovalCardProps = {\n approvalId: string;\n /** Tool title, e.g. \"Cv tailor\". */\n title: string;\n message?: string;\n args: Record<string, unknown>;\n destructive?: boolean;\n /** Context line under the args (e.g. \"Writes to your account \u00B7 profile default\"). */\n context?: string;\n /** While the decision is being sent. */\n busy?: ApprovalChoice | null;\n error?: string | null;\n isActive: boolean;\n width: number;\n onDecision(decision: ApprovalChoice): void;\n};\n\nconst MAX_ARGS = 8;\n\nfunction argRows(args: Record<string, unknown>, expanded: boolean): KeyValueRow[] {\n const rows = Object.entries(args)\n .filter(([key]) => key !== 'userId')\n .map(([key, value]) => ({\n label: key.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase(),\n value: typeof value === 'string' ? oneLine(value) : safeJson(value, 0),\n }));\n if (expanded || rows.length <= MAX_ARGS) return rows;\n return [...rows.slice(0, MAX_ARGS), { label: '', value: theme.dim(`+${rows.length - MAX_ARGS} more (ctrl+o)`) }];\n}\n\n/**\n * Yellow `\u25C6` rail (red for destructive tools), the arguments, and numbered\n * options with y/n/l hotkeys. Esc leaves the approval pending, never rejects.\n */\nexport function ApprovalCard(props: ApprovalCardProps) {\n const { approvalId, title, message, args, destructive = false, context, busy, error, isActive, width, onDecision } = props;\n const [state, setState] = useState<ApprovalCardState>(initialApprovalState);\n\n useInput(\n (input, key) => {\n setState((current) => approvalKeyReducer(current, input, key));\n },\n { isActive: isActive && !busy },\n );\n\n useEffect(() => {\n if (state.decision) {\n onDecision(state.decision);\n setState((current) => ({ ...current, decision: undefined }));\n }\n }, [state.decision, onDecision]);\n\n const inner = Math.max(20, width - 2);\n const optionWidth = Math.max(10, Math.min(inner - 4, 52));\n return (\n <Rail tone={destructive ? 'danger' : 'attention'} width={width}>\n <Box width={inner}>\n <Box flexGrow={1}>\n <Text>\n {(destructive ? theme.danger : theme.attention)(theme.symbols.attention)} {theme.bold('Approval needed')}\n </Text>\n </Box>\n <Text>{theme.dim(shortId(approvalId))}</Text>\n </Box>\n <Text> </Text>\n <Text wrap=\"wrap\">{message ? oneLine(message) : `${theme.bold(title)} wants to run with these inputs`}</Text>\n <Text> </Text>\n <Box marginLeft={2}>\n <KeyValue rows={argRows(args, state.expanded)} width={Math.max(16, inner - 2)} wrap={state.expanded} />\n </Box>\n <Text> </Text>\n <Text wrap=\"truncate-end\">\n {destructive ? theme.danger('This cannot be undone') : theme.dim(context ?? 'Writes to your account')}\n </Text>\n <Text> </Text>\n {APPROVAL_OPTIONS.map((option, i) => {\n const selected = i === state.selected;\n const pointer = selected ? theme.accent(theme.symbols.pointer) : ' ';\n const label = `${i + 1}. ${option.label}`;\n return (\n <Text key={option.decision} wrap=\"truncate-end\">\n {pointer} {selected ? theme.accent(padEnd(label, optionWidth)) : padEnd(label, optionWidth)} {theme.dim(option.hotkey)}\n </Text>\n );\n })}\n <Text> </Text>\n {busy ? (\n <Spinner label={theme.dim(busy === 'approve' ? 'Approving\u2026' : busy === 'reject' ? 'Rejecting\u2026' : 'Leaving it pending\u2026')} />\n ) : error ? (\n <Text wrap=\"wrap\">{theme.error(`${theme.symbols.error} ${error}`)}</Text>\n ) : (\n <KeyHints\n width={inner}\n hints={[\n { key: theme.symbols.upDown, label: 'select' },\n { key: 'enter', label: 'confirm' },\n { key: 'esc', label: 'leave pending' },\n { key: 'ctrl+o', label: 'all inputs' },\n ]}\n />\n )}\n </Rail>\n );\n}\n", "import { Text } from 'ink';\nimport { memo } from 'react';\nimport { theme } from '../theme';\nimport { displayWidth } from '../text';\n\nexport type KeyHint = { key: string; label: string };\n\n/** `enter send \u00B7 / commands` with keys in the accent and labels dim. */\nexport function formatHints(hints: readonly KeyHint[]): string {\n const sep = theme.dim(` ${theme.symbols.middot} `);\n return hints.map((h) => `${theme.accent(h.key)} ${theme.dim(h.label)}`).join(sep);\n}\n\n/** Drops hints from the end until the row fits `width`. */\nexport function fitHints(hints: readonly KeyHint[], width: number): KeyHint[] {\n const out = [...hints];\n while (out.length > 1 && displayWidth(formatHints(out)) > width) out.pop();\n return out;\n}\n\n/** One contextual row of key hints; never wraps. */\nexport const KeyHints = memo(function KeyHints({ hints, width }: { hints: readonly KeyHint[]; width: number }) {\n return <Text wrap=\"truncate-end\">{formatHints(fitHints(hints, width))}</Text>;\n});\n", "import { Box, Text } from 'ink';\nimport { memo } from 'react';\nimport { theme } from '../theme';\nimport { displayWidth, padEnd, truncate } from '../text';\n\nexport type KeyValueRow = { label: string; value: string; note?: string };\n\nexport type KeyValueProps = {\n rows: readonly KeyValueRow[];\n width: number;\n /** Wrap long values instead of truncating them with `\u2026`. */\n wrap?: boolean;\n maxLabelWidth?: number;\n};\n\n/** Aligned `label value note` rows; labels and notes dim. */\nexport const KeyValue = memo(function KeyValue({ rows, width, wrap = false, maxLabelWidth = 24 }: KeyValueProps) {\n const labelWidth = Math.min(maxLabelWidth, Math.max(0, ...rows.map((r) => displayWidth(r.label))));\n const valueWidth = Math.max(8, width - labelWidth - 2);\n return (\n <Box flexDirection=\"column\" width={width}>\n {rows.map((row, i) => {\n const note = row.note ? ` ${row.note}` : '';\n const value = wrap ? row.value : truncate(row.value.replace(/\\n/g, ' '), Math.max(4, valueWidth - displayWidth(note)));\n return (\n <Box key={`${row.label}-${i}`}>\n <Text>{theme.dim(padEnd(truncate(row.label, labelWidth), labelWidth))} </Text>\n <Box width={valueWidth}>\n <Text wrap={wrap ? 'wrap' : 'truncate-end'}>\n {value}\n {note ? theme.dim(note) : ''}\n </Text>\n </Box>\n </Box>\n );\n })}\n </Box>\n );\n});\n", "import { Box } from 'ink';\nimport type { ReactNode } from 'react';\nimport { theme } from '../theme';\n\nexport type RailTone = 'accent' | 'attention' | 'danger' | 'success' | 'muted';\n\nfunction railColor(tone: RailTone): string | undefined {\n switch (tone) {\n case 'accent':\n return theme.accentInk;\n case 'attention':\n return 'yellow';\n case 'danger':\n return 'red';\n case 'success':\n return 'green';\n default:\n return undefined;\n }\n}\n\n/** Left `\u2503` rail (`|` without Unicode) in a status colour; content indented by one. */\nexport function Rail({ tone = 'accent', children, width }: { tone?: RailTone; children?: ReactNode; width?: number }) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle={theme.railStyle}\n borderTop={false}\n borderRight={false}\n borderBottom={false}\n borderLeftColor={railColor(tone)}\n borderLeftDimColor={tone === 'muted'}\n paddingLeft={1}\n width={width}\n >\n {children}\n </Box>\n );\n}\n", "import type { Key } from 'ink';\nimport type { ApprovalChoice } from '../../core/chat-model';\nimport { theme } from '../theme';\nimport { formatElapsed, shortId } from '../text';\n\nexport type ApprovalOption = { decision: ApprovalChoice; label: string; hotkey: string };\n\nexport const APPROVAL_OPTIONS: readonly ApprovalOption[] = [\n { decision: 'approve', label: 'Approve', hotkey: 'y' },\n { decision: 'reject', label: 'Reject', hotkey: 'n' },\n { decision: 'leave', label: 'Leave pending (decide later in the app)', hotkey: 'l' },\n];\n\nexport type ApprovalCardState = { selected: number; expanded: boolean; decision?: ApprovalChoice };\n\nexport const initialApprovalState: ApprovalCardState = { selected: 0, expanded: false };\n\n/**\n * Keys \u2192 state (pure, for tests): \u2191\u2193/j/k move, 1\u20133 and y/n/l decide at once,\n * Enter confirms the selection, Esc is the safe option (leave pending),\n * ctrl+o expands the arguments.\n */\nexport function approvalKeyReducer(state: ApprovalCardState, input: string, key: Partial<Key>): ApprovalCardState {\n if (state.decision) return state;\n const count = APPROVAL_OPTIONS.length;\n if (key.escape) return { ...state, decision: 'leave' };\n if (key.ctrl && input === 'o') return { ...state, expanded: !state.expanded };\n if (key.upArrow || (!key.ctrl && input === 'k')) return { ...state, selected: (state.selected - 1 + count) % count };\n if (key.downArrow || (!key.ctrl && input === 'j')) return { ...state, selected: (state.selected + 1) % count };\n if (key.return) return { ...state, decision: (APPROVAL_OPTIONS[state.selected] as ApprovalOption).decision };\n const byNumber = /^[1-9]$/.test(input) ? APPROVAL_OPTIONS[Number(input) - 1] : undefined;\n const byHotkey = APPROVAL_OPTIONS.find((o) => o.hotkey === input.toLowerCase());\n const chosen = byNumber ?? (key.ctrl || key.meta ? undefined : byHotkey);\n return chosen ? { ...state, selected: APPROVAL_OPTIONS.indexOf(chosen), decision: chosen.decision } : state;\n}\n\n/** The one-row collapsed form: `\u2713 Approved cv tailor \u00B7 2.1s` (research \u00A75.8). */\nexport function approvalOutcomeText(decision: ApprovalChoice, title: string, approvalId: string, durationMs?: number): string {\n const time = durationMs !== undefined ? theme.dim(` ${theme.symbols.middot} ${formatElapsed(durationMs)}`) : '';\n if (decision === 'approve') return `${theme.success(theme.symbols.success)} Approved ${title}${time}`;\n if (decision === 'reject') return `${theme.error(theme.symbols.error)} Rejected ${title}${time}`;\n return `${theme.attention(theme.symbols.attention)} Left pending ${title} ${theme.dim(shortId(approvalId))}`;\n}\n", "import { Box, Text, useInput } from 'ink';\nimport { memo, useEffect, useReducer } from 'react';\nimport { windowAround } from '../fuzzy';\nimport { theme } from '../theme';\nimport { displayWidth, padEnd, truncate, truncateStart } from '../text';\nimport { KeyHints } from './KeyHints';\nimport { type FormField, type FormState, formKeyAction, formReducer } from './form-model';\n\nexport type FormProps = {\n initial: FormState;\n width: number;\n /** Rows available for fields. */\n height: number;\n isActive: boolean;\n submitLabel?: string;\n onSubmit(input: Record<string, unknown>): void;\n onCancel(): void;\n};\n\nfunction valueText(field: FormField, raw: string, focused: boolean): string {\n const kind = field.spec.kind;\n if (kind === 'boolean') {\n const on = raw === 'true';\n const unset = raw === '';\n const box = unset ? '[ ]' : on ? '[x]' : '[-]';\n const label = unset ? theme.dim('unset') : on ? 'yes' : 'no';\n return `${focused ? theme.accent(box) : box} ${label}`;\n }\n if (kind === 'enum') {\n const text = raw || theme.dim('none');\n return focused ? `${theme.accent('\u2039')} ${text} ${theme.accent('\u203A')}` : text;\n }\n return raw;\n}\n\nconst FieldRow = memo(function FieldRow(props: {\n field: FormField;\n raw: string;\n focused: boolean;\n error?: string;\n labelWidth: number;\n width: number;\n}) {\n const { field, raw, focused, error, labelWidth, width } = props;\n const marker = field.spec.required ? theme.attention('*') : ' ';\n const label = padEnd(truncate(field.label, labelWidth), labelWidth);\n const valueWidth = Math.max(8, Math.floor((width - labelWidth - 6) * 0.6));\n const textLike = field.spec.kind !== 'boolean' && field.spec.kind !== 'enum';\n const shown = textLike ? truncateStart(raw, valueWidth - 1) : valueText(field, raw, focused);\n const cursor = focused && textLike ? theme.accent(theme.symbols.cursor) : '';\n const descBudget = width - labelWidth - 6 - valueWidth - 2;\n const hint =\n field.spec.kind === 'enum' && field.spec.enumValues?.length\n ? field.spec.enumValues.join(' | ')\n : field.spec.kind === 'array'\n ? 'comma-separated'\n : field.spec.kind === 'json'\n ? 'JSON'\n : field.spec.description;\n return (\n <Box flexDirection=\"column\">\n <Text wrap=\"truncate-end\">\n {focused ? theme.accent(theme.symbols.pointer) : ' '} {focused ? theme.bold(label) : label} {marker}{' '}\n {padEnd(`${shown}${cursor}`, valueWidth)}\n {descBudget > 8 && hint ? ` ${theme.dim(truncate(hint, descBudget))}` : ''}\n </Text>\n {error ? (\n <Text wrap=\"truncate-end\">\n {' '}\n {theme.error(`${theme.symbols.error} ${error}`)}\n </Text>\n ) : null}\n </Box>\n );\n});\n\n/** Fields from a JSON Schema; Tab/Shift-Tab move, Enter on the last submits, Esc cancels. */\nexport function Form(props: FormProps) {\n const { width, height, isActive, submitLabel = 'run' } = props;\n const [state, dispatch] = useReducer(formReducer, props.initial);\n\n useInput(\n (input, key) => {\n const action = formKeyAction(state, input, key);\n if (action) dispatch(action);\n },\n { isActive: isActive && state.status === 'editing' },\n );\n\n const { onSubmit, onCancel } = props;\n useEffect(() => {\n if (state.status === 'submitted' && state.result) onSubmit(state.result);\n if (state.status === 'cancelled') onCancel();\n }, [state.status, state.result, onSubmit, onCancel]);\n\n const labelWidth = Math.min(24, Math.max(6, ...state.fields.map((f) => displayWidth(f.label))));\n const errorRows = Object.keys(state.errors).length;\n const rows = Math.max(1, height - errorRows);\n const { start, end } = windowAround(state.fields.length, state.focus, rows);\n return (\n <Box flexDirection=\"column\" width={width}>\n {state.fields.length === 0 ? <Text>{theme.dim(' This tool takes no input.')}</Text> : null}\n {start > 0 ? <Text>{theme.dim(` ${theme.symbols.ellipsis} ${start} above`)}</Text> : null}\n {state.fields.slice(start, end).map((field, i) => (\n <FieldRow\n key={field.spec.property}\n field={field}\n raw={state.values[field.spec.property] ?? ''}\n focused={start + i === state.focus}\n error={state.errors[field.spec.property]}\n labelWidth={labelWidth}\n width={width}\n />\n ))}\n {end < state.fields.length ? <Text>{theme.dim(` ${theme.symbols.ellipsis} ${state.fields.length - end} more`)}</Text> : null}\n <Text> </Text>\n <KeyHints\n width={width}\n hints={[\n { key: 'tab', label: 'next' },\n { key: 'shift+tab', label: 'back' },\n { key: 'enter', label: state.focus >= state.fields.length - 1 ? submitLabel : 'next' },\n { key: 'ctrl+s', label: submitLabel },\n { key: 'esc', label: 'cancel' },\n ]}\n />\n </Box>\n );\n}\n", "/**\n * Fuzzy ranking shared by the command palette, SelectList and the tool\n * browser (research \u00A71.2 order): exact \u2192 prefix \u2192 word prefix \u2192 substring \u2192\n * subsequence \u2192 description substring. Lower rank is better; null = no match.\n */\nexport function rankMatch(query: string, primary: string, secondary = ''): number | null {\n const q = query.trim().toLowerCase();\n if (!q) return 0;\n const p = primary.toLowerCase();\n if (p === q) return 0;\n if (p.startsWith(q)) return 1;\n if (p.split(/[\\s._/-]+/).some((word) => word.startsWith(q))) return 2;\n if (p.includes(q)) return 3;\n if (isSubsequence(q, p)) return 4;\n // Descriptions only for 3+ letters: two letters match nearly every sentence.\n if (secondary && q.length >= 3 && secondary.toLowerCase().includes(q)) return 5;\n return null;\n}\n\nexport function isSubsequence(needle: string, haystack: string): boolean {\n let i = 0;\n for (const char of haystack) {\n if (char === needle[i]) i += 1;\n if (i === needle.length) return true;\n }\n return needle.length === 0;\n}\n\n/** Stable filter + sort by rank. */\nexport function fuzzyFilter<T>(items: readonly T[], query: string, fields: (item: T) => [string, string?]): T[] {\n if (!query.trim()) return [...items];\n return items\n .map((item, index) => {\n const [primary, secondary] = fields(item);\n return { item, index, rank: rankMatch(query, primary, secondary) };\n })\n .filter((entry): entry is { item: T; index: number; rank: number } => entry.rank !== null)\n .sort((a, b) => a.rank - b.rank || a.index - b.index)\n .map((entry) => entry.item);\n}\n\n/** Window of `size` rows that keeps `cursor` visible. */\nexport function windowAround(count: number, cursor: number, size: number): { start: number; end: number } {\n if (count <= size) return { start: 0, end: count };\n const half = Math.floor(size / 2);\n const start = Math.max(0, Math.min(count - size, cursor - half));\n return { start, end: start + size };\n}\n", "/**\n * Tool input form model (pure, for tests). Fields come from the same\n * schema \u2192 flag mapping as the generated commands (`core/schema-flags.ts`),\n * and values are validated with the same parser, so the form accepts exactly\n * what `--flags` accept.\n */\nimport type { Key } from 'ink';\nimport type { JsonSchema } from '../../core/catalog';\nimport { isCliError } from '../../core/errors';\nimport { type FlagSpec, parseToolInput, schemaToFlags } from '../../core/schema-flags';\n\nexport type FormField = { spec: FlagSpec; label: string };\n\nexport type FormState = {\n schema: JsonSchema;\n fields: FormField[];\n /** Raw text per property. */\n values: Record<string, string>;\n focus: number;\n errors: Record<string, string>;\n status: 'editing' | 'submitted' | 'cancelled';\n /** Values passed in that have no field (nested, auto-filled): kept as is. */\n base: Record<string, unknown>;\n result?: Record<string, unknown>;\n};\n\nexport type FormAction =\n | { type: 'type'; text: string }\n | { type: 'backspace' }\n | { type: 'clear-field' }\n | { type: 'next' }\n | { type: 'prev' }\n | { type: 'toggle' }\n | { type: 'cycle'; delta: number }\n | { type: 'enter' }\n | { type: 'submit' }\n | { type: 'cancel' };\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/** Initial value \u2192 the raw text a user would type. */\nexport function rawFromValue(spec: FlagSpec, value: unknown): string {\n if (value === undefined) return '';\n if (value === null) return spec.nullable ? 'null' : '';\n if (spec.kind === 'array' && Array.isArray(value) && value.every((v) => typeof v !== 'object')) return value.join(', ');\n if (typeof value === 'object') return JSON.stringify(value);\n return String(value);\n}\n\nexport function createFormState(\n schema: JsonSchema,\n initial: Record<string, unknown> = {},\n opts: { skip?: readonly string[]; missingRequired?: readonly string[] } = {},\n): FormState {\n const skip = new Set(opts.skip ?? []);\n const specs = schemaToFlags(schema).filter((spec) => !skip.has(spec.property));\n const ordered = [...specs.filter((s) => s.required), ...specs.filter((s) => !s.required)];\n const fields = ordered.map((spec) => ({ spec, label: spec.flag }));\n const values: Record<string, string> = {};\n for (const field of fields) values[field.spec.property] = rawFromValue(field.spec, initial[field.spec.property]);\n const missing = new Set(opts.missingRequired ?? []);\n const firstMissing = fields.findIndex((f) => missing.has(f.spec.property) || (f.spec.required && !values[f.spec.property]));\n return {\n schema,\n fields,\n values,\n focus: Math.max(0, firstMissing),\n errors: {},\n status: 'editing',\n base: isRecord(initial) ? { ...initial } : {},\n };\n}\n\n/** Parses one raw value with the flag parser: `{ value }`, `{ error }`, or `{}` for empty. */\nexport function validateField(schema: JsonSchema, spec: FlagSpec, raw: string): { value?: unknown; error?: string } {\n if (raw.trim() === '') return spec.required ? { error: 'Required' } : {};\n try {\n const { input } = parseToolInput(schema, { [spec.attr]: raw });\n return { value: input[spec.property] };\n } catch (error) {\n if (isCliError(error)) return { error: error.hint ? `${error.message}. ${error.hint}` : error.message };\n return { error: error instanceof Error ? error.message : String(error) };\n }\n}\n\nfunction withError(state: FormState, property: string, error: string | undefined): FormState {\n const errors = { ...state.errors };\n if (error) errors[property] = error;\n else delete errors[property];\n return { ...state, errors };\n}\n\nfunction focused(state: FormState): FormField | undefined {\n return state.fields[state.focus];\n}\n\nfunction setValue(state: FormState, value: string): FormState {\n const field = focused(state);\n if (!field) return state;\n return withError({ ...state, values: { ...state.values, [field.spec.property]: value } }, field.spec.property, undefined);\n}\n\nfunction choices(spec: FlagSpec): string[] {\n if (spec.kind === 'boolean') return spec.required ? ['true', 'false'] : ['', 'true', 'false'];\n const values = spec.enumValues ?? [];\n return spec.required ? values : ['', ...values];\n}\n\nfunction submit(state: FormState): FormState {\n let next = { ...state, errors: {} as Record<string, string> };\n const result: Record<string, unknown> = { ...state.base };\n for (const field of state.fields) {\n const property = field.spec.property;\n const checked = validateField(state.schema, field.spec, state.values[property] ?? '');\n if (checked.error) next = withError(next, property, checked.error);\n else if (checked.value === undefined) delete result[property];\n else result[property] = checked.value;\n }\n const firstError = state.fields.findIndex((f) => next.errors[f.spec.property]);\n if (firstError >= 0) return { ...next, focus: firstError };\n return { ...next, status: 'submitted', result };\n}\n\nexport function formReducer(state: FormState, action: FormAction): FormState {\n if (state.status !== 'editing') return state;\n const field = focused(state);\n const raw = field ? (state.values[field.spec.property] ?? '') : '';\n switch (action.type) {\n case 'type':\n if (field?.spec.kind === 'boolean') {\n const c = action.text.toLowerCase();\n if (c === 'y' || c === 't') return setValue(state, 'true');\n if (c === 'n' || c === 'f') return setValue(state, 'false');\n if (c === ' ') return formReducer(state, { type: 'toggle' });\n return state;\n }\n return field ? setValue(state, raw + action.text.replace(/\\r\\n?|\\n/g, ' ')) : state;\n case 'backspace':\n return field ? setValue(state, field.spec.kind === 'boolean' ? '' : [...raw].slice(0, -1).join('')) : state;\n case 'clear-field':\n return setValue(state, '');\n case 'toggle':\n case 'cycle': {\n if (!field || (field.spec.kind !== 'boolean' && field.spec.kind !== 'enum')) return state;\n const options = choices(field.spec);\n const delta = action.type === 'cycle' ? action.delta : 1;\n const index = Math.max(0, options.indexOf(raw));\n return setValue(state, options[(index + delta + options.length) % options.length] ?? '');\n }\n case 'next':\n case 'prev': {\n if (state.fields.length === 0) return state;\n const checked = field ? validateField(state.schema, field.spec, raw) : {};\n const next = field && raw.trim() ? withError(state, field.spec.property, checked.error) : state;\n const delta = action.type === 'next' ? 1 : -1;\n return { ...next, focus: (state.focus + delta + state.fields.length) % state.fields.length };\n }\n case 'enter':\n if (state.fields.length === 0 || state.focus >= state.fields.length - 1) return submit(state);\n return formReducer(state, { type: 'next' });\n case 'submit':\n return submit(state);\n case 'cancel':\n return { ...state, status: 'cancelled' };\n default:\n return state;\n }\n}\n\n/** Keys: Tab / Shift-Tab / \u2191\u2193 move, \u2190\u2192 and Space pick choices, Enter next (submits on the last), Ctrl+S submits, Esc cancels. */\nexport function formKeyAction(state: FormState, input: string, key: Partial<Key>): FormAction | null {\n const kind = focused(state)?.spec.kind;\n if (key.escape) return { type: 'cancel' };\n if (key.tab) return key.shift ? { type: 'prev' } : { type: 'next' };\n if (key.downArrow) return { type: 'next' };\n if (key.upArrow) return { type: 'prev' };\n if (key.return) return { type: 'enter' };\n if (key.ctrl && input === 's') return { type: 'submit' };\n if (key.ctrl && input === 'u') return { type: 'clear-field' };\n if ((kind === 'enum' || kind === 'boolean') && (key.leftArrow || key.rightArrow)) {\n return { type: 'cycle', delta: key.leftArrow ? -1 : 1 };\n }\n if (key.backspace || key.delete) return { type: 'backspace' };\n if (key.ctrl || key.meta) return null;\n return input ? { type: 'type', text: input } : null;\n}\n\nfunction shellQuote(text: string): string {\n return /^[\\w@%+=:,./-]+$/.test(text) ? text : `'${text.replace(/'/g, `'\\\\''`)}'`;\n}\n\n/** The flags form of a submitted input (`tabbio cv tailor --cv-id cv_8f2 --tone formal`). */\nexport function equivalentCommand(\n tool: { commandPath: readonly string[]; inputSchema: JsonSchema },\n input: Record<string, unknown>,\n skip: readonly string[] = [],\n): string {\n const parts = ['tabbio', ...tool.commandPath];\n for (const spec of schemaToFlags(tool.inputSchema)) {\n const value = input[spec.property];\n if (value === undefined || skip.includes(spec.property)) continue;\n if (spec.kind === 'boolean' && typeof value === 'boolean') {\n parts.push(value ? `--${spec.flag}` : `--${spec.flag}=false`);\n continue;\n }\n const text =\n spec.kind === 'array' && Array.isArray(value) && value.every((v) => typeof v !== 'object')\n ? value.join(',')\n : typeof value === 'object' && value !== null\n ? JSON.stringify(value)\n : String(value);\n parts.push(`--${spec.flag}`, shellQuote(text));\n }\n return parts.join(' ');\n}\n", "import type { AgentMode, AgentThreadSummary } from '@tabbio/types';\nimport { Box, type Key, Static, Text, useInput } from 'ink';\nimport { memo, useCallback, useEffect, useMemo, useReducer, useRef, useState } from 'react';\nimport { type ChatCapabilities, DEFAULT_CAPABILITIES } from '../../../core/capabilities';\nimport { isDestructiveTool } from '../../../core/chat';\nimport { toCliError } from '../../../core/errors';\nimport { relativeTime } from '../../../core/io';\nimport { ApprovalCard } from '../../components/ApprovalCard';\nimport { editorReducer, emptyEditor } from '../../components/editor-model';\nimport { SelectList } from '../../components/SelectList';\nimport { Working, useClockTick } from '../../components/Spinner';\nimport { StatusBar } from '../../components/StatusBar';\nimport { TextInput } from '../../components/TextInput';\nimport { pageMargin, useTerminalSize } from '../../layout';\nimport type { UiServices } from '../../services';\nimport { theme } from '../../theme';\nimport { formatElapsed, shortId } from '../../text';\nimport { Palette, paletteArgMatches, paletteMatches, parseSlash } from '../Palette';\nimport { chatCommands } from './commands';\nimport { EntryView, LiveTurn, type StaticItem } from './Transcript';\nimport { useChatCommands } from './useChatCommands';\nimport { useChatSession } from './useChatSession';\n\nexport type ChatExitReason = 'exit' | 'home';\n\nexport type ChatProps = {\n services: UiServices;\n mode: AgentMode;\n companyId?: string;\n threadId?: string;\n modelId?: string;\n initialMessage?: string;\n /** Research / Image / Result for this chat; defaults to the profile's saved choice. */\n capabilities?: ChatCapabilities;\n width: number;\n height: number;\n hostedByHome?: boolean;\n onExit(reason: ChatExitReason): void;\n};\n\ntype Overlay = { kind: 'threads'; since: number; threads?: AgentThreadSummary[]; error?: string } | null;\n\nconst DOUBLE_PRESS_MS = 2000;\n\nconst ChatStatus = memo(function ChatStatus(props: {\n width: number;\n segments: string[];\n since: number | null;\n streaming: boolean;\n approval: boolean;\n}) {\n useClockTick(props.since !== null);\n const elapsed = props.since !== null ? formatElapsed(Date.now() - props.since) : null;\n const hints = props.approval\n ? [\n { key: 'y', label: 'approve' },\n { key: 'n', label: 'reject' },\n { key: 'l', label: 'later' },\n ]\n : props.streaming\n ? [\n { key: 'enter', label: 'queue' },\n { key: 'esc', label: 'interrupt' },\n { key: '/', label: 'commands' },\n ]\n : [\n { key: 'enter', label: 'send' },\n { key: '/', label: 'commands' },\n { key: 'ctrl+c', label: 'quit' },\n ];\n return <StatusBar width={props.width} segments={[...props.segments, elapsed]} hints={hints} />;\n});\n\n/**\n * Streaming chat (research \u00A75.9): finished items go through `<Static>` into\n * scrollback; the live region is the current turn, any approval card, the\n * composer and the status bar. Ctrl+C stops the turn, twice quits.\n */\nexport function Chat(props: ChatProps) {\n const { services, width, height, hostedByHome = false, onExit } = props;\n // <Static> output is laid out outside the page frame, so it carries its own gutter.\n const gutter = pageMargin(useTerminalSize().columns);\n const session = useChatSession(props);\n const { state } = session;\n const [editor, dispatchEditor] = useReducer(editorReducer, emptyEditor);\n const [paletteIndex, setPaletteIndex] = useState(0);\n const [overlay, setOverlay] = useState<Overlay>(null);\n const [expandTools, setExpandTools] = useState(false);\n const [hint, setHint] = useState<string | null>(null);\n const lastCtrlC = useRef(0);\n const lastEsc = useRef(0);\n\n const commands = useMemo(() => chatCommands({ hostedByHome }), [hostedByHome]);\n const commandMatches = overlay ? [] : paletteMatches(commands, editor.value);\n const argMatches = overlay || commandMatches.length ? [] : paletteArgMatches(commands, editor.value);\n const matches = commandMatches.length ? commandMatches : argMatches;\n const selected = Math.min(paletteIndex, Math.max(0, matches.length - 1));\n const approval = !state.streaming ? state.approvals[0] : undefined;\n const composerActive = !overlay && !approval;\n\n const [header] = useState<StaticItem>(() => ({\n kind: 'header',\n id: 'chat-header',\n text: `${theme.bold('Chat')} ${theme.dim(`${theme.symbols.middot} ${props.mode}${props.threadId ? ` ${theme.symbols.middot} resumed` : ''}`)}`,\n right: `profile ${services.profileName}`,\n }));\n const staticItems = useMemo<StaticItem[]>(() => [header, ...state.entries], [header, state.entries]);\n\n useEffect(() => {\n if (!hint) return undefined;\n const timer = setTimeout(() => setHint(null), DOUBLE_PRESS_MS);\n return () => clearTimeout(timer);\n }, [hint]);\n\n const openThreads = useCallback(() => {\n setOverlay({ kind: 'threads', since: Date.now() });\n services\n .listThreads({ mode: state.mode, companyId: props.companyId })\n .then((threads) => setOverlay((o) => (o ? { ...o, threads } : o)))\n .catch((error: unknown) => setOverlay((o) => (o ? { ...o, error: toCliError(error).message } : o)));\n }, [services, state.mode, props.companyId]);\n\n const runCommand = useChatCommands({ session, services, companyId: props.companyId, hostedByHome, onExit, openThreads });\n\n const submit = useCallback(\n (value: string) => {\n const text = value.trim();\n if (!text) return;\n const slash = parseSlash(text);\n if (slash) {\n const exact = commands.find((c) => c.name === slash.name);\n const choice = exact ?? commandMatches[selected];\n // The highlighted argument when the palette lists them (`/research ` or `/research o`).\n const picked = exact?.args ? argMatches[selected]?.completion : undefined;\n if (choice?.args && !slash.arg && !picked) {\n // `/research` + enter opens its choices, like `/mode`.\n dispatchEditor({ type: 'set', value: `/${choice.name} ` });\n setPaletteIndex(0);\n return;\n }\n let arg = exact ? slash.arg : '';\n const known = exact?.args?.some((a) => a.value === arg.toLowerCase());\n if (exact?.args && !known && picked) arg = parseSlash(picked)?.arg ?? arg;\n dispatchEditor({ type: 'remember', value: text });\n dispatchEditor({ type: 'clear' });\n setPaletteIndex(0);\n runCommand(choice?.name ?? slash.name, arg);\n return;\n }\n dispatchEditor({ type: 'remember', value: text });\n dispatchEditor({ type: 'clear' });\n session.send(text);\n },\n [commandMatches, argMatches, selected, commands, runCommand, session],\n );\n\n const onCtrlC = useCallback(() => {\n const now = Date.now();\n if (now - lastCtrlC.current < DOUBLE_PRESS_MS) {\n session.interrupt();\n onExit('exit');\n return;\n }\n lastCtrlC.current = now;\n if (session.interrupt()) setHint('Stopped. Press ctrl+c again to quit.');\n else {\n if (editor.value) dispatchEditor({ type: 'clear' });\n setHint('Press ctrl+c again to quit.');\n }\n }, [session, onExit, editor.value]);\n\n useInput((input, key) => {\n if (key.ctrl && input === 'c') onCtrlC();\n });\n\n const onComposerKey = useCallback(\n (input: string, key: Key): boolean => {\n if (key.ctrl && input === 'c') return true;\n if (matches.length > 0) {\n if (key.upArrow || key.downArrow) {\n setPaletteIndex((i) => (key.upArrow ? Math.max(0, i - 1) : Math.min(matches.length - 1, i + 1)));\n return true;\n }\n if (key.tab) {\n const choice = matches[selected];\n if (choice?.completion) dispatchEditor({ type: 'set', value: choice.completion });\n else if (choice) dispatchEditor({ type: 'set', value: `/${choice.name}${choice.usage ? ' ' : ''}` });\n setPaletteIndex(0);\n return true;\n }\n }\n if (key.escape) {\n if (session.interrupt()) return true;\n const now = Date.now();\n if (!editor.value) {\n if (hostedByHome) onExit('home');\n else setHint('Type /exit or press ctrl+c twice to quit.');\n } else if (matches.length > 0 || now - lastEsc.current < 600) dispatchEditor({ type: 'clear' });\n lastEsc.current = now;\n return true;\n }\n if (key.tab && key.shift) {\n if (!state.streaming) runCommand('mode', state.mode === 'seeker' ? 'employer' : 'seeker');\n return true;\n }\n if (key.ctrl && input === 'o') {\n const liveTools = state.turn?.items.some((item) => item.kind === 'tool');\n if (liveTools) setExpandTools((v) => !v);\n else session.dispatch({ type: 'expand-last-tool' });\n return true;\n }\n return false;\n },\n [matches, selected, session, editor.value, state.streaming, state.mode, state.turn, runCommand, hostedByHome, onExit],\n );\n\n // Height budget: the live region must stay shorter than the terminal.\n const cardRows = approval ? 14 + Math.min(9, Object.keys(approval.args).length) : 0;\n const fixedRows = 4 + 1 + (hint ? 1 : 0) + session.queue.length + (matches.length ? Math.min(6, matches.length) : 0) + (overlay ? 12 : 0) + cardRows + 2;\n const liveBudget = Math.max(3, height - fixedRows - 1);\n\n const placeholder = approval\n ? 'Decide the approval above first'\n : state.streaming\n ? `Queue a follow-up${theme.symbols.ellipsis} (esc to interrupt)`\n : 'Ask Tabbio anything, or / for commands';\n const segments = [\n `profile ${services.profileName}`,\n state.mode,\n state.modelId ?? 'auto',\n ...capabilitySegments(state.mode, state.capabilities),\n state.threadId ? shortId(state.threadId, 6, 3) : 'new chat',\n ];\n\n return (\n <Box flexDirection=\"column\" width={width}>\n <Static items={staticItems}>\n {(item) => (\n <Box key={item.id} paddingLeft={gutter}>\n <EntryView entry={item} width={width} />\n </Box>\n )}\n </Static>\n {state.turn ? (\n <LiveTurn turn={state.turn} width={width} expandTools={expandTools} maxLines={liveBudget} streaming={state.streaming} />\n ) : null}\n {session.loading ? (\n <Box marginTop={1}>\n <Working label={session.loading.label} since={session.loading.since} />\n </Box>\n ) : null}\n {approval ? (\n <Box marginTop={1}>\n <ApprovalCard\n approvalId={approval.approvalId}\n title={approval.title}\n args={approval.args}\n destructive={isDestructiveTool(approval.name)}\n context={`Writes to your account ${theme.symbols.middot} profile ${services.profileName}`}\n busy={session.deciding}\n isActive={!session.deciding && !overlay}\n width={width}\n onDecision={(decision) => void session.decide(approval, decision)}\n />\n </Box>\n ) : null}\n {overlay ? (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text>{theme.bold('Recent chats')}</Text>\n {overlay.error ? (\n <Text>{theme.error(`${theme.symbols.error} ${overlay.error}`)}</Text>\n ) : !overlay.threads ? (\n <Working label=\"Loading chats\u2026\" since={overlay.since} />\n ) : (\n <SelectList\n items={overlay.threads.map((t) => ({\n id: t.id,\n label: t.title?.trim() || 'Untitled chat',\n meta: relativeTime(new Date(t.lastMessageAt ?? t.updatedAt)),\n }))}\n width={width}\n height={8}\n isActive\n emptyText=\"No chats yet\"\n onSelect={(item) => {\n setOverlay(null);\n void session.resume(item.id, item.label);\n }}\n onCancel={() => setOverlay(null)}\n />\n )}\n {overlay.error || !overlay.threads ? <SelectEscape onClose={() => setOverlay(null)} /> : null}\n </Box>\n ) : null}\n {session.queue.map((queued, i) => (\n <Text key={`q-${i}`} wrap=\"truncate-end\">\n {theme.dim(`${theme.symbols.arrowRight} queued: ${queued}`)}\n </Text>\n ))}\n {matches.length > 0 ? (\n <Box marginTop={1}>\n <Palette commands={matches} selected={selected} width={width} />\n </Box>\n ) : null}\n <Box marginTop={matches.length > 0 ? 0 : 1}>\n <TextInput\n editor={editor}\n dispatch={dispatchEditor}\n onSubmit={submit}\n onKey={onComposerKey}\n isActive={composerActive}\n width={width}\n placeholder={placeholder}\n boxed\n />\n </Box>\n {hint ? <Text>{theme.attention(hint)}</Text> : null}\n <ChatStatus\n width={width}\n segments={segments}\n since={state.streaming && state.turn ? state.turn.startedAt : null}\n streaming={state.streaming}\n approval={Boolean(approval)}\n />\n </Box>\n );\n}\n\n/** Status bar: the Research / Image / Result modes changed from auto (seeker chats only). */\nexport function capabilitySegments(mode: string, capabilities: ChatCapabilities): string[] {\n if (mode === 'employer') return [];\n return (['research', 'image', 'result'] as const)\n .filter((key) => capabilities[key] !== DEFAULT_CAPABILITIES[key])\n .map((key) => `${key} ${capabilities[key]}`);\n}\n\n/** Esc/q closes an overlay that has no list of its own (loading or error). */\nfunction SelectEscape({ onClose }: { onClose(): void }) {\n useInput((input, key) => {\n if (key.escape || input === 'q') onClose();\n });\n return null;\n}\n", "import type { Key } from 'ink';\n\n/**\n * Composer state (pure, for tests). Values may contain newlines (Ctrl+J, or\n * `\\` then Enter, or a multi-line paste); the input renders them on one line.\n */\nexport type EditorState = {\n value: string;\n /** Cursor as an index into the code points of `value`. */\n cursor: number;\n history: string[];\n /** Position while browsing history (null = editing the draft). */\n historyIndex: number | null;\n draft: string;\n};\n\nexport type EditorAction =\n | { type: 'insert'; text: string }\n | { type: 'backspace' }\n | { type: 'left' }\n | { type: 'right' }\n | { type: 'home' }\n | { type: 'end' }\n | { type: 'kill-line' }\n | { type: 'kill-word' }\n | { type: 'newline' }\n /** `\\` then Enter: the backslash becomes a newline. */\n | { type: 'backslash-newline' }\n | { type: 'set'; value: string }\n | { type: 'clear' }\n | { type: 'history-prev' }\n | { type: 'history-next' }\n | { type: 'remember'; value: string };\n\nexport const emptyEditor: EditorState = { value: '', cursor: 0, history: [], historyIndex: null, draft: '' };\n\nexport function editorWith(value: string): EditorState {\n return { ...emptyEditor, value, cursor: [...value].length };\n}\n\nfunction chars(value: string): string[] {\n return [...value];\n}\n\nfunction place(state: EditorState, next: string[], cursor: number): EditorState {\n return { ...state, value: next.join(''), cursor: Math.max(0, Math.min(next.length, cursor)), historyIndex: null };\n}\n\nexport function editorReducer(state: EditorState, action: EditorAction): EditorState {\n const list = chars(state.value);\n switch (action.type) {\n case 'insert': {\n const text = action.text.replace(/\\r\\n?/g, '\\n');\n const inserted = chars(text);\n return place(state, [...list.slice(0, state.cursor), ...inserted, ...list.slice(state.cursor)], state.cursor + inserted.length);\n }\n case 'newline':\n return editorReducer(state, { type: 'insert', text: '\\n' });\n case 'backslash-newline':\n if (state.cursor === 0 || list[state.cursor - 1] !== '\\\\') return editorReducer(state, { type: 'newline' });\n return place(state, [...list.slice(0, state.cursor - 1), '\\n', ...list.slice(state.cursor)], state.cursor);\n case 'backspace':\n if (state.cursor === 0) return state;\n return place(state, [...list.slice(0, state.cursor - 1), ...list.slice(state.cursor)], state.cursor - 1);\n case 'left':\n return { ...state, cursor: Math.max(0, state.cursor - 1) };\n case 'right':\n return { ...state, cursor: Math.min(list.length, state.cursor + 1) };\n case 'home':\n return { ...state, cursor: 0 };\n case 'end':\n return { ...state, cursor: list.length };\n case 'kill-line':\n return place(state, list.slice(state.cursor), 0);\n case 'kill-word': {\n let i = state.cursor;\n while (i > 0 && /\\s/.test(list[i - 1] as string)) i -= 1;\n while (i > 0 && !/\\s/.test(list[i - 1] as string)) i -= 1;\n return place(state, [...list.slice(0, i), ...list.slice(state.cursor)], i);\n }\n case 'set':\n return { ...state, value: action.value, cursor: chars(action.value).length, historyIndex: null };\n case 'clear':\n return { ...state, value: '', cursor: 0, historyIndex: null, draft: '' };\n case 'remember': {\n const value = action.value.trim();\n if (!value || state.history[state.history.length - 1] === value) return state;\n return { ...state, history: [...state.history, value].slice(-100) };\n }\n case 'history-prev': {\n if (state.history.length === 0) return state;\n const index = state.historyIndex === null ? state.history.length - 1 : Math.max(0, state.historyIndex - 1);\n const value = state.history[index] as string;\n return { ...state, value, cursor: chars(value).length, historyIndex: index, draft: state.historyIndex === null ? state.value : state.draft };\n }\n case 'history-next': {\n if (state.historyIndex === null) return state;\n const index = state.historyIndex + 1;\n if (index >= state.history.length) {\n return { ...state, value: state.draft, cursor: chars(state.draft).length, historyIndex: null };\n }\n const value = state.history[index] as string;\n return { ...state, value, cursor: chars(value).length, historyIndex: index };\n }\n default:\n return state;\n }\n}\n\nexport type EditorKeyResult = EditorAction | { type: 'submit' } | null;\n\n/**\n * Maps a keypress to an editor action. Enter submits unless the character\n * before the cursor is `\\` (then it becomes a newline); Ctrl+J inserts a\n * newline. Ink 6 reports the Backspace key as `delete`, so both erase.\n * Keys the editor does not own (Esc, Tab, Ctrl+C, \u2026) return null.\n */\nexport function editorKeyAction(state: EditorState, input: string, key: Partial<Key>): EditorKeyResult {\n if (key.return) {\n const list = chars(state.value);\n if (state.cursor > 0 && list[state.cursor - 1] === '\\\\') return { type: 'backslash-newline' };\n return { type: 'submit' };\n }\n if (input === '\\n' && !key.ctrl) return { type: 'newline' };\n if (key.backspace || key.delete) return { type: 'backspace' };\n if (key.leftArrow) return { type: 'left' };\n if (key.rightArrow) return { type: 'right' };\n if (key.upArrow) return { type: 'history-prev' };\n if (key.downArrow) return { type: 'history-next' };\n if (key.ctrl) {\n if (input === 'a') return { type: 'home' };\n if (input === 'e') return { type: 'end' };\n if (input === 'u') return { type: 'kill-line' };\n if (input === 'w') return { type: 'kill-word' };\n return null;\n }\n if (key.escape || key.tab || key.meta) return null;\n if (input) return { type: 'insert', text: input };\n return null;\n}\n", "import { Box, Text, useInput } from 'ink';\nimport { memo, useMemo, useState } from 'react';\nimport { windowAround } from '../fuzzy';\nimport { theme } from '../theme';\nimport { displayWidth, truncate } from '../text';\nimport { KeyHints } from './KeyHints';\nimport { type SelectItem, type SelectState, initialSelectState, selectKeyAction, selectReducer, visibleItems } from './select-model';\n\nexport type { SelectItem } from './select-model';\n\nexport type SelectListProps = {\n items: readonly SelectItem[];\n width: number;\n /** Rows available for items (the filter line and hints are extra). */\n height: number;\n isActive: boolean;\n filterable?: boolean;\n emptyText?: string;\n showHints?: boolean;\n onSelect(item: SelectItem): void;\n onCancel(): void;\n onHighlight?(item: SelectItem | undefined): void;\n};\n\nconst Row = memo(function Row({ item, selected, width }: { item: SelectItem; selected: boolean; width: number }) {\n const meta = item.meta ? ` ${item.meta}` : '';\n const labelBudget = Math.max(4, width - 2 - displayWidth(meta));\n const label = truncate(item.label, labelBudget);\n const descBudget = labelBudget - displayWidth(label) - 2;\n const desc = item.description && descBudget > 6 ? ` ${truncate(item.description, descBudget)}` : '';\n const fill = ' '.repeat(Math.max(0, width - 2 - displayWidth(label) - displayWidth(desc) - displayWidth(meta)));\n return (\n <Text wrap=\"truncate-end\">\n {selected ? theme.accent(theme.symbols.pointer) : ' '} {selected ? theme.accent(label) : label}\n {theme.dim(desc)}\n {fill}\n {theme.dim(meta)}\n </Text>\n );\n});\n\n/** Filterable list (`/` filters with fuzzy match), j/k + arrows, Enter, q/Esc. */\nexport function SelectList(props: SelectListProps) {\n const { items, width, height, isActive, filterable = true, emptyText = 'Nothing here', showHints = true } = props;\n const [state, setState] = useState<SelectState>(initialSelectState);\n const shown = useMemo(() => visibleItems(items, state.query), [items, state.query]);\n const cursor = Math.min(state.cursor, Math.max(0, shown.length - 1));\n\n useInput(\n (input, key) => {\n const outcome = selectKeyAction(state, input, key, filterable);\n if (!outcome) return;\n if (outcome.type === 'select') {\n const item = shown[cursor];\n if (item) props.onSelect(item);\n return;\n }\n if (outcome.type === 'cancel') {\n props.onCancel();\n return;\n }\n const next = selectReducer(state, outcome, outcome.type === 'move' ? shown.length : visibleItems(items, state.query).length);\n setState(next);\n props.onHighlight?.(visibleItems(items, next.query)[next.cursor]);\n },\n { isActive },\n );\n\n const rows = Math.max(1, height);\n const { start, end } = windowAround(shown.length, cursor, rows);\n return (\n <Box flexDirection=\"column\" width={width}>\n {state.filtering ? (\n <Text>\n {theme.accent('/')} {state.query}\n {theme.accent(theme.symbols.cursor)}\n </Text>\n ) : null}\n {shown.length === 0 ? <Text>{theme.dim(` ${emptyText}`)}</Text> : null}\n {shown.slice(start, end).map((item, i) => (\n <Row key={item.id} item={item} selected={isActive && start + i === cursor} width={width} />\n ))}\n {shown.length > rows ? <Text>{theme.dim(` ${cursor + 1} of ${shown.length}`)}</Text> : null}\n {showHints ? (\n <KeyHints\n width={width}\n hints={[\n { key: theme.symbols.upDown, label: 'move' },\n { key: 'enter', label: 'open' },\n ...(filterable ? [{ key: '/', label: 'filter' }] : []),\n { key: 'esc', label: 'back' },\n ]}\n />\n ) : null}\n </Box>\n );\n}\n", "import type { Key } from 'ink';\nimport { fuzzyFilter } from '../fuzzy';\n\nexport type SelectItem = {\n id: string;\n label: string;\n description?: string;\n /** Dim text on the right (time, count). */\n meta?: string;\n};\n\nexport type SelectState = { cursor: number; query: string; filtering: boolean };\n\nexport const initialSelectState: SelectState = { cursor: 0, query: '', filtering: false };\n\nexport type SelectAction =\n | { type: 'move'; delta: number }\n | { type: 'start-filter' }\n | { type: 'type'; text: string }\n | { type: 'backspace' }\n | { type: 'stop-filter' };\n\nexport type SelectOutcome = SelectAction | { type: 'select' } | { type: 'cancel' } | null;\n\nexport function visibleItems(items: readonly SelectItem[], query: string): SelectItem[] {\n return fuzzyFilter(items, query, (item) => [item.label, item.description]);\n}\n\nexport function selectReducer(state: SelectState, action: SelectAction, count: number): SelectState {\n switch (action.type) {\n case 'move':\n return count === 0 ? { ...state, cursor: 0 } : { ...state, cursor: Math.max(0, Math.min(count - 1, state.cursor + action.delta)) };\n case 'start-filter':\n return { ...state, filtering: true };\n case 'type':\n return { ...state, query: state.query + action.text, cursor: 0 };\n case 'backspace':\n return state.query ? { ...state, query: [...state.query].slice(0, -1).join(''), cursor: 0 } : { ...state, filtering: false };\n case 'stop-filter':\n return { ...state, filtering: false, query: '', cursor: 0 };\n default:\n return state;\n }\n}\n\n/**\n * Keys (pure): \u2191\u2193 always move, j/k move outside filter mode, `/` starts\n * filtering (when filterable), Enter selects, Esc leaves filter mode and\n * then cancels, q cancels outside filter mode.\n */\nexport function selectKeyAction(state: SelectState, input: string, key: Partial<Key>, filterable: boolean): SelectOutcome {\n if (key.upArrow || (key.ctrl && input === 'p')) return { type: 'move', delta: -1 };\n if (key.downArrow || (key.ctrl && input === 'n')) return { type: 'move', delta: 1 };\n if (key.pageUp) return { type: 'move', delta: -10 };\n if (key.pageDown) return { type: 'move', delta: 10 };\n if (key.return) return { type: 'select' };\n if (key.escape) return state.filtering ? { type: 'stop-filter' } : { type: 'cancel' };\n if (state.filtering) {\n if (key.backspace || key.delete) return { type: 'backspace' };\n if (input && !key.ctrl && !key.meta && !key.tab) return { type: 'type', text: input };\n return null;\n }\n if (input === 'j') return { type: 'move', delta: 1 };\n if (input === 'k') return { type: 'move', delta: -1 };\n if (input === 'q') return { type: 'cancel' };\n if (input === '/' && filterable) return { type: 'start-filter' };\n return null;\n}\n", "import { Box, Text } from 'ink';\nimport { memo } from 'react';\nimport { theme } from '../theme';\nimport { displayWidth } from '../text';\nimport { type KeyHint, fitHints, formatHints } from './KeyHints';\n\nexport type StatusBarProps = {\n /** Ordered by priority: the last ones are dropped first when narrow. */\n segments: ReadonlyArray<string | null | undefined | false>;\n hints?: readonly KeyHint[];\n width: number;\n};\n\n/** Pure fit: hints shrink first (down to one), then segments drop from the end. */\nexport function fitStatusBar(\n segments: readonly string[],\n hints: readonly KeyHint[],\n width: number,\n): { left: string; right: string } {\n const sep = ` ${theme.symbols.middot} `;\n let segs = [...segments];\n let fitted = [...hints];\n const measure = () => displayWidth(segs.join(sep)) + (fitted.length ? displayWidth(formatHints(fitted)) + 2 : 0);\n while (measure() > width && fitted.length > 1) fitted = fitHints(fitted, displayWidth(formatHints(fitted)) - 1);\n while (measure() > width && segs.length > 1) segs = segs.slice(0, -1);\n if (measure() > width) fitted = [];\n return { left: theme.dim(segs.join(sep)), right: fitted.length ? formatHints(fitted) : '' };\n}\n\n/** `profile \u00B7 mode \u00B7 model \u00B7 thread \u00B7 elapsed` (dim) with hints on the right. One line. */\nexport const StatusBar = memo(function StatusBar({ segments, hints = [], width }: StatusBarProps) {\n const clean = segments.filter((s): s is string => typeof s === 'string' && s.length > 0);\n const { left, right } = fitStatusBar(clean, hints, width);\n return (\n <Box width={width}>\n <Box flexGrow={1}>\n <Text wrap=\"truncate-end\">{left}</Text>\n </Box>\n {right ? <Text wrap=\"truncate-end\">{right}</Text> : null}\n </Box>\n );\n});\n", "import { Box, type Key, Text, useInput } from 'ink';\nimport { memo } from 'react';\nimport { theme } from '../theme';\nimport { displayWidth, truncate } from '../text';\nimport { type EditorAction, type EditorState, editorKeyAction } from './editor-model';\n\nexport type TextInputProps = {\n editor: EditorState;\n dispatch(action: EditorAction): void;\n onSubmit(value: string): void;\n /** Runs first; return true when the parent handled the key (palette, Esc, \u2026). */\n onKey?(input: string, key: Key): boolean;\n isActive: boolean;\n width: number;\n placeholder?: string;\n boxed?: boolean;\n prompt?: string;\n};\n\nfunction cursorCell(char: string): string {\n if (theme.chalk.level > 0) return theme.inverse(char);\n return `${theme.symbols.cursor}${char === ' ' ? '' : char}`;\n}\n\n/**\n * The visible line (pure, for tests): newlines as a dim `\u21B5`, scrolled so the\n * cursor stays in view, cursor in inverse video (a `\u258D` without colour).\n */\nexport function renderComposerLine(state: EditorState, width: number, placeholder: string, showCursor: boolean): string {\n const budget = Math.max(4, width);\n const chars = [...state.value];\n if (chars.length === 0) {\n const hint = theme.dim(truncate(placeholder, Math.max(1, budget - 1)));\n return showCursor ? `${cursorCell(' ')}${hint}` : hint;\n }\n const cells = chars.map((char) => (char === '\\n' ? { text: theme.dim(theme.symbols.newline), width: displayWidth(theme.symbols.newline) } : { text: char, width: displayWidth(char) }));\n cells.push({ text: ' ', width: 1 });\n const cursor = Math.min(state.cursor, chars.length);\n let start = 0;\n let used = cells.slice(0, cursor + 1).reduce((sum, c) => sum + c.width, 0);\n while (used > budget - 1 && start < cursor) {\n used -= (cells[start] as { width: number }).width;\n start += 1;\n }\n let end = cursor + 1;\n let total = used;\n while (end < cells.length && total + (cells[end] as { width: number }).width <= budget - (start > 0 ? 1 : 0)) {\n total += (cells[end] as { width: number }).width;\n end += 1;\n }\n const out = cells.slice(start, end).map((cell, i) => {\n const index = start + i;\n if (index === cursor && showCursor) return cursorCell(index < chars.length && chars[index] !== '\\n' ? cell.text : ' ');\n return cell.text;\n });\n if (end === cells.length && !showCursor) out.pop();\n return `${start > 0 ? theme.dim(theme.symbols.ellipsis) : ''}${out.join('')}`;\n}\n\n/** Single-line, multi-line-safe composer (`\u203A` prompt; boxed = rounded dim border). */\nexport const TextInput = memo(function TextInput(props: TextInputProps) {\n const { editor, dispatch, onSubmit, onKey, isActive, width, placeholder = '', boxed = false, prompt } = props;\n\n useInput(\n (input, key) => {\n if (onKey?.(input, key)) return;\n const action = editorKeyAction(editor, input, key);\n if (!action) return;\n if (action.type === 'submit') onSubmit(editor.value);\n else dispatch(action);\n },\n { isActive },\n );\n\n const promptText = prompt ?? theme.symbols.pointer;\n const inner = boxed ? width - 4 : width;\n const line = renderComposerLine(editor, Math.max(4, inner - displayWidth(promptText) - 1), placeholder, isActive);\n const content = (\n <Text wrap=\"truncate-end\">\n {isActive ? theme.accent(promptText) : theme.dim(promptText)} {line}\n </Text>\n );\n if (!boxed) return content;\n return (\n <Box borderStyle={theme.boxStyle} borderDimColor paddingX={1} width={width}>\n {content}\n </Box>\n );\n});\n", "import { Box, Text } from 'ink';\nimport { memo } from 'react';\nimport { fuzzyFilter, windowAround } from '../fuzzy';\nimport { theme } from '../theme';\nimport { displayWidth, padEnd, truncate } from '../text';\n\nexport type PaletteCommand = {\n name: string;\n usage?: string;\n description: string;\n hint?: string;\n /** Fixed argument choices (`/research on`), completed in the palette after a space. */\n args?: ReadonlyArray<{ value: string; description: string }>;\n /** Set on an argument suggestion: the full text Tab completes to. */\n completion?: string;\n};\n\n/** Commands matching a composer draft that starts with `/` and has no space yet. */\nexport function paletteMatches(commands: readonly PaletteCommand[], draft: string): PaletteCommand[] {\n if (!draft.startsWith('/') || /\\s/.test(draft)) return [];\n return fuzzyFilter(commands, draft.slice(1), (c) => [c.name, c.description]);\n}\n\n/**\n * Argument suggestions for a draft like `/research o`: the command's fixed\n * choices that start with what was typed (all of them after `/research `).\n * Empty once the draft has a second space or the command takes free text.\n */\nexport function paletteArgMatches(commands: readonly PaletteCommand[], draft: string): PaletteCommand[] {\n const match = /^\\/([a-z][\\w-]*) (\\S*)$/i.exec(draft);\n if (!match) return [];\n const command = commands.find((c) => c.name === (match[1] as string).toLowerCase());\n if (!command?.args?.length) return [];\n const typed = (match[2] ?? '').toLowerCase();\n return command.args\n .filter((arg) => arg.value.startsWith(typed))\n .map((arg) => ({\n name: `${command.name} ${arg.value}`,\n usage: `/${command.name} ${arg.value}`,\n description: arg.description,\n completion: `/${command.name} ${arg.value}`,\n }));\n}\n\n/** Parses `/name rest\u2026` (null when the text is not a slash command). */\nexport function parseSlash(text: string): { name: string; arg: string } | null {\n const match = /^\\/([a-z][\\w-]*)\\s*([\\s\\S]*)$/i.exec(text.trim());\n return match ? { name: (match[1] as string).toLowerCase(), arg: (match[2] ?? '').trim() } : null;\n}\n\n/** Bottom-aligned command palette: `/name description`, selection in the accent. */\nexport const Palette = memo(function Palette(props: {\n commands: readonly PaletteCommand[];\n selected: number;\n width: number;\n maxRows?: number;\n}) {\n const { commands, selected, width, maxRows = 6 } = props;\n const nameWidth = Math.min(22, Math.max(8, ...commands.map((c) => displayWidth(c.usage ?? `/${c.name}`)))) + 2;\n const { start, end } = windowAround(commands.length, selected, maxRows);\n if (commands.length === 0) return <Text>{theme.dim(' No commands match')}</Text>;\n return (\n <Box flexDirection=\"column\" width={width}>\n {commands.slice(start, end).map((command, i) => {\n const active = start + i === selected;\n const name = padEnd(truncate(command.usage ?? `/${command.name}`, nameWidth - 1), nameWidth);\n return (\n <Text key={command.name} wrap=\"truncate-end\">\n {active ? theme.accent(theme.symbols.pointer) : ' '} {active ? theme.accent(name) : name}\n {theme.dim(command.description)}\n {command.hint ? ` ${command.hint}` : ''}\n </Text>\n );\n })}\n </Box>\n );\n});\n", "import type { AgentMode } from '@tabbio/types';\nimport { CAPABILITY_CHOICES, CAPABILITY_CHOICE_HELP, type CapabilityKey } from '../../../core/capabilities';\nimport type { PaletteCommand } from '../Palette';\n\nfunction choices(key: CapabilityKey): PaletteCommand['args'] {\n return CAPABILITY_CHOICES[key].map((value) => ({ value, description: CAPABILITY_CHOICE_HELP[key][value] ?? '' }));\n}\n\n/** The capability slash commands (seeker chats; employer chats ignore them, as the server does). */\nexport const CAPABILITY_COMMANDS: ReadonlySet<string> = new Set(['research', 'image', 'result']);\n\nexport function chatCommands(opts: { hostedByHome: boolean }): PaletteCommand[] {\n return [\n { name: 'new', description: 'Start a new chat' },\n { name: 'threads', description: 'Resume a recent chat' },\n {\n name: 'mode',\n usage: '/mode seeker|employer',\n description: 'Switch workspace',\n args: [\n { value: 'seeker', description: 'Your own career' },\n { value: 'employer', description: 'Hiring for a company' },\n ],\n },\n { name: 'model', usage: '/model <id|auto>', description: 'Pick the model' },\n { name: 'research', usage: '/research auto|on|off', description: 'Web research for the next messages', args: choices('research') },\n { name: 'image', usage: '/image auto|on|off', description: 'Image generation', args: choices('image') },\n { name: 'result', usage: '/result auto|summary|document|\u2026', description: 'What to make: answer, document, slides, page, image', args: choices('result') },\n { name: 'help', description: 'Keys and commands' },\n ...(opts.hostedByHome ? [{ name: 'home', description: 'Back to the home screen' }] : []),\n { name: 'exit', description: 'Quit tabbio' },\n ];\n}\n\nexport function parseMode(value: string): AgentMode | null {\n const v = value.trim().toLowerCase();\n return v === 'seeker' || v === 'employer' ? v : null;\n}\n\nexport const CHAT_HELP = [\n 'Commands: /new \u00B7 /threads \u00B7 /mode seeker|employer \u00B7 /model <id|auto> \u00B7 /help \u00B7 /exit',\n ' /research auto|on|off \u00B7 /image auto|on|off \u00B7 /result auto|summary|document|slides|page|image',\n ' (saved for this profile; sent with every message in seeker mode)',\n 'Keys: enter send (queues while streaming) \u00B7 ctrl+j or \\\\ then enter newline \u00B7 esc interrupt',\n ' \u2191\u2193 history \u00B7 shift+tab switch mode \u00B7 ctrl+o expand the last tool \u00B7 ctrl+c twice quit',\n].join('\\n');\n", "import { Box, Text } from 'ink';\nimport { memo } from 'react';\nimport type { ChatTurn, LiveItem, TranscriptEntry } from '../../../core/chat';\nimport { ArtifactRow } from '../../components/ArtifactRow';\nimport { Markdown } from '../../components/Markdown';\nimport { Rail } from '../../components/Rail';\nimport { Spinner, useClockTick } from '../../components/Spinner';\nimport { SourcesList } from '../../components/SourcesList';\nimport { ToolCallDetail, ToolCallRow } from '../../components/ToolCallRow';\nimport { theme } from '../../theme';\nimport { displayWidth, estimateHeight, formatElapsed } from '../../text';\n\n/** Assistant content sits under `\u25CF Tabbio`, indented by two. */\nexport const ASSISTANT_INDENT = 2;\nconst USER_MAX_LINES = 6;\nconst WAITING_AFTER_MS = 10_000;\n\nexport type StaticItem = TranscriptEntry | { kind: 'header'; id: string; text: string; right: string };\n\nfunction noticeGlyph(tone: Extract<TranscriptEntry, { kind: 'notice' }>['tone']): string {\n if (tone === 'error') return theme.error(theme.symbols.error);\n if (tone === 'success') return theme.success(theme.symbols.success);\n if (tone === 'attention') return theme.attention(theme.symbols.attention);\n return theme.dim(theme.symbols.dot);\n}\n\nfunction UserTurn({ text, width }: { text: string; width: number }) {\n const lines = text.split('\\n');\n const shown = lines.slice(0, USER_MAX_LINES);\n return (\n <Box marginTop={1}>\n <Rail tone=\"accent\" width={width}>\n {shown.map((line, i) => (\n <Text key={i} wrap=\"wrap\">\n {line || ' '}\n </Text>\n ))}\n {lines.length > USER_MAX_LINES ? <Text>{theme.dim(`+${lines.length - USER_MAX_LINES} lines`)}</Text> : null}\n </Rail>\n </Box>\n );\n}\n\n/** One committed transcript item, printed once through `<Static>`. */\nexport const EntryView = memo(function EntryView({ entry, width }: { entry: StaticItem; width: number }) {\n const inner = Math.max(10, width - ASSISTANT_INDENT);\n switch (entry.kind) {\n case 'header': {\n const fill = Math.max(1, width - displayWidth(entry.text) - displayWidth(entry.right));\n return (\n <Box flexDirection=\"column\" width={width}>\n <Text wrap=\"truncate-end\">\n {entry.text}\n {' '.repeat(fill)}\n {theme.dim(entry.right)}\n </Text>\n <Text>{theme.dim(theme.symbols.line.repeat(width))}</Text>\n </Box>\n );\n }\n case 'user':\n return <UserTurn text={entry.text} width={width} />;\n case 'assistant':\n return (\n <Box marginTop={1}>\n <Text>\n {theme.accent(theme.symbols.dot)} {theme.bold('Tabbio')}\n </Text>\n </Box>\n );\n case 'markdown':\n return (\n <Box paddingLeft={ASSISTANT_INDENT} marginTop={entry.gap ? 1 : 0} width={width}>\n <Markdown text={entry.text} width={inner} />\n </Box>\n );\n case 'tool':\n return (\n <Box paddingLeft={ASSISTANT_INDENT} marginTop={entry.gap ? 1 : 0} width={width}>\n <ToolCallRow call={entry.call} width={inner} />\n </Box>\n );\n case 'tool-detail':\n return (\n <Box paddingLeft={ASSISTANT_INDENT} flexDirection=\"column\" width={width}>\n <Text>{theme.dim(`${theme.symbols.expanded} ${entry.call.title}`)}</Text>\n <ToolCallDetail call={entry.call} width={inner} />\n </Box>\n );\n case 'artifact':\n return (\n <Box paddingLeft={ASSISTANT_INDENT} width={width}>\n <ArtifactRow artifact={entry.artifact} width={inner} />\n </Box>\n );\n case 'sources':\n return (\n <Box paddingLeft={ASSISTANT_INDENT} marginTop={1} width={width}>\n <SourcesList sources={entry.sources} width={inner} />\n </Box>\n );\n case 'notice':\n return (\n <Box paddingLeft={ASSISTANT_INDENT} marginTop={1} flexDirection=\"column\" width={width}>\n <Text wrap=\"wrap\">\n {noticeGlyph(entry.tone)} {entry.tone === 'error' ? theme.error(entry.text) : entry.tone === 'info' ? theme.dim(entry.text) : entry.text}\n </Text>\n {entry.hint ? <Text wrap=\"wrap\">{theme.dim(` ${theme.symbols.arrowRight} ${entry.hint}`)}</Text> : null}\n </Box>\n );\n default:\n return null;\n }\n});\n\n/** Keeps the end of a long live block so the live region never outgrows the terminal. */\nexport function clipLiveText(text: string, width: number, maxLines: number): { text: string; hidden: number } {\n if (estimateHeight(text, width) <= maxLines) return { text, hidden: 0 };\n const lines = text.split('\\n');\n const kept: string[] = [];\n let used = 1;\n for (let i = lines.length - 1; i >= 0; i -= 1) {\n const h = estimateHeight(lines[i] as string, width);\n if (used + h > maxLines) break;\n kept.unshift(lines[i] as string);\n used += h;\n }\n return { text: kept.join('\\n'), hidden: lines.length - kept.length };\n}\n\nfunction WaitingLine({ turn }: { turn: ChatTurn }) {\n useClockTick(true);\n const idleFor = Date.now() - turn.lastEventAt;\n const empty = turn.items.length === 0;\n if (!empty && idleFor < WAITING_AFTER_MS) return null;\n const label = empty && idleFor < WAITING_AFTER_MS ? 'Thinking\u2026' : 'waiting for Tabbio\u2026';\n return (\n <Box paddingLeft={ASSISTANT_INDENT}>\n <Spinner label={theme.dim(`${label} ${formatElapsed(Date.now() - (empty ? turn.startedAt : turn.lastEventAt))}`)} />\n </Box>\n );\n}\n\n/** Blank line between a tool block and a text block, and between text blocks. */\nexport function liveGap(prev: 'label' | 'markdown' | 'tool' | 'text', item: LiveItem): boolean {\n if (item.kind === 'tool') return prev === 'markdown' || prev === 'text';\n return prev === 'tool' || prev === 'markdown' || item.committed > 0;\n}\n\nconst LiveItemView = memo(function LiveItemView(props: {\n item: LiveItem;\n width: number;\n expanded: boolean;\n cursor: boolean;\n maxLines: number;\n gap: boolean;\n}) {\n const { item, width, expanded, cursor, maxLines, gap } = props;\n if (item.kind === 'tool') {\n return (\n <Box marginTop={gap ? 1 : 0}>\n <ToolCallRow call={item.call} width={width} expanded={expanded} />\n </Box>\n );\n }\n const pending = item.text.slice(item.committed);\n if (!pending && !cursor) return null;\n const clipped = clipLiveText(pending, width, maxLines);\n return (\n <Box flexDirection=\"column\" width={width} marginTop={gap ? 1 : 0}>\n {clipped.hidden > 0 ? <Text>{theme.dim(`${theme.symbols.ellipsis} ${clipped.hidden} more lines above (streaming)`)}</Text> : null}\n <Markdown text={clipped.text} width={width} trailing={cursor ? theme.accent(theme.symbols.cursor) : undefined} />\n </Box>\n );\n});\n\n/** The live tail of the current turn: running tools, streaming markdown with `\u258D`, waiting line. */\nexport function LiveTurn(props: { turn: ChatTurn; width: number; expandTools: boolean; maxLines: number; streaming: boolean }) {\n const { turn, width, expandTools, maxLines, streaming } = props;\n const inner = Math.max(10, width - ASSISTANT_INDENT);\n const last = turn.items[turn.items.length - 1];\n const tools = turn.items.filter((i) => i.kind === 'tool').length;\n const textBudget = Math.max(3, maxLines - tools - 1);\n return (\n <Box flexDirection=\"column\" width={width}>\n <Box flexDirection=\"column\" paddingLeft={ASSISTANT_INDENT} width={width}>\n {turn.items.map((item, i) => {\n const before = turn.items[i - 1];\n const prev = before ? (before.kind === 'tool' ? 'tool' : 'text') : turn.lastKind;\n return (\n <LiveItemView\n key={item.id}\n item={item}\n width={inner}\n expanded={expandTools}\n cursor={streaming && item === last && item.kind === 'text'}\n maxLines={textBudget}\n gap={liveGap(prev, item)}\n />\n );\n })}\n </Box>\n {streaming ? <WaitingLine turn={turn} /> : null}\n </Box>\n );\n}\n", "import { Box, Text } from 'ink';\nimport { memo } from 'react';\nimport { type ChatArtifact, type DraftProgress, draftSummary } from '../../core/chat-artifacts';\nimport { hyperlink } from '../hyperlink';\nimport { theme } from '../theme';\nimport { displayWidth, shortId, truncate } from '../text';\nimport { Spinner } from './Spinner';\n\nexport function kindGlyph(kind: string): string {\n switch (kind) {\n case 'document':\n return theme.symbols.kindDocument;\n case 'slides':\n return theme.symbols.kindSlides;\n case 'image':\n return theme.symbols.kindImage;\n case 'page':\n return theme.symbols.kindPage;\n default:\n return theme.symbols.kindFile;\n }\n}\n\nexport function kindLabel(kind: string): string {\n return kind === 'slides' ? 'Slides' : kind.charAt(0).toUpperCase() + kind.slice(1);\n}\n\n/** `rendering`, `ready`, `failed`, or the writer's progress while it builds. */\nexport function artifactStatusText(artifact: Pick<ChatArtifact, 'status' | 'previewAvailable'>, draft?: DraftProgress): string {\n if (artifact.status === 'pending') {\n if (draft && draft.phase !== 'end') return draftSummary(draft);\n return artifact.previewAvailable ? 'preview ready, rendering files' : 'rendering';\n }\n return artifact.status;\n}\n\nexport type ArtifactRowProps = {\n artifact: ChatArtifact;\n draft?: DraftProgress;\n width: number;\n /** Show the `tabbio artifacts open <id>` hint (off in narrow places). */\n hint?: boolean;\n};\n\n/**\n * One artifact card row (research \u00A75.7 grammar): status glyph, kind glyph,\n * title (an OSC 8 link to the preview once ready, when the terminal supports\n * it), then dim `kind \u00B7 status \u00B7 id \u00B7 tabbio artifacts open <id>`. A failed\n * card adds its reason on a second line.\n */\nexport const ArtifactRow = memo(function ArtifactRow({ artifact, draft, width, hint = true }: ArtifactRowProps) {\n const status = artifactStatusText(artifact, draft);\n const tone = artifact.status === 'failed' ? theme.error : artifact.status === 'ready' ? theme.success : theme.dim;\n const meta = [kindLabel(artifact.kind).toLowerCase(), status, shortId(artifact.id, 6, 4)];\n if (artifact.versionNumber && artifact.versionNumber > 1) meta.push(`v${artifact.versionNumber}`);\n const openHint = hint && artifact.status !== 'failed' ? `tabbio artifacts open ${artifact.id}` : '';\n const titleBudget = Math.max(8, Math.min(48, width - 4 - displayWidth(meta.join(' \u00B7 ')) - 6));\n const title = truncate(artifact.title || 'Untitled', titleBudget);\n const linked = artifact.status === 'ready' && artifact.previewUrl;\n return (\n <Box flexDirection=\"column\" width={width}>\n <Box width={width}>\n {artifact.status === 'pending' ? (\n <Spinner />\n ) : (\n <Text>{artifact.status === 'ready' ? theme.success(theme.symbols.success) : theme.error(theme.symbols.error)}</Text>\n )}\n <Box flexShrink={0} marginLeft={1}>\n <Text>\n {theme.accent(kindGlyph(artifact.kind))} {linked ? hyperlink(theme.bold(title), artifact.previewUrl as string) : theme.bold(title)}\n </Text>\n </Box>\n <Box flexGrow={1} flexShrink={1}>\n <Text wrap=\"truncate-end\">\n {theme.dim(` ${theme.symbols.middot} `)}\n {tone(meta.join(` ${theme.symbols.middot} `))}\n {openHint ? theme.dim(` ${openHint}`) : ''}\n </Text>\n </Box>\n </Box>\n {artifact.failure?.message ? (\n <Text wrap=\"truncate-end\">{theme.dim(` ${theme.symbols.arrowRight} ${artifact.failure.message}`)}</Text>\n ) : null}\n </Box>\n );\n});\n", "import { Box, Text } from 'ink';\nimport { type Token, type Tokens, marked } from 'marked';\nimport { type ReactNode, memo, useMemo } from 'react';\nimport { theme } from '../theme';\nimport { stripAnsi } from '../text';\nimport { renderInline } from './markdown-inline';\nimport { Rail } from './Rail';\nimport { Table, type TableColumn } from './Table';\n\n/** Lexes without ever throwing (odd input falls back to one paragraph). */\nexport function lexMarkdown(text: string): Token[] {\n try {\n return marked.lexer(text.replace(/\\r\\n?/g, '\\n'), { gfm: true });\n } catch {\n return [{ type: 'paragraph', raw: text, text, tokens: [{ type: 'text', raw: text, text }] } as Tokens.Paragraph];\n }\n}\n\ntype RenderCtx = { width: number; trailing?: string };\n\nfunction tokensOf(token: Token): Token[] | undefined {\n const tokens = (token as { tokens?: unknown }).tokens;\n return Array.isArray(tokens) ? (tokens as Token[]) : undefined;\n}\n\nfunction textOf(token: Token): string {\n const text = (token as { text?: unknown }).text;\n return typeof text === 'string' ? text : typeof token.raw === 'string' ? token.raw : '';\n}\n\nfunction renderList(list: Tokens.List, ctx: RenderCtx, key: string, trailing = ''): ReactNode {\n const start = typeof list.start === 'number' ? list.start : 1;\n const markers = list.items.map((item, i) =>\n list.ordered ? `${start + i}.` : item.task ? (item.checked ? '[x]' : '[ ]') : theme.symbols.bullet,\n );\n const markerWidth = Math.max(...markers.map((m) => stripAnsi(m).length)) + 1;\n return (\n <Box key={key} flexDirection=\"column\">\n {list.items.map((item, i) => (\n <Box key={`${key}-${i}`}>\n <Box width={markerWidth} flexShrink={0}>\n <Text>{list.ordered ? markers[i] : theme.dim(markers[i] as string)}</Text>\n </Box>\n <Box flexDirection=\"column\" width={Math.max(8, ctx.width - markerWidth)}>\n {renderBlocks(\n item.tokens,\n { width: Math.max(8, ctx.width - markerWidth), trailing: i === list.items.length - 1 && trailing ? trailing : undefined },\n `${key}-${i}`,\n false,\n )}\n </Box>\n </Box>\n ))}\n </Box>\n );\n}\n\nfunction renderTable(table: Tokens.Table, ctx: RenderCtx, key: string): ReactNode {\n const columns: TableColumn[] = table.header.map((cell, i) => ({\n key: String(i),\n header: stripAnsi(renderInline(cell.tokens, cell.text)),\n align: table.align[i] === 'right' ? 'right' : 'left',\n }));\n const rows = table.rows.map((row) => {\n const record: Record<string, string> = {};\n row.forEach((cell, i) => {\n record[String(i)] = stripAnsi(renderInline(cell.tokens, cell.text));\n });\n return record;\n });\n return <Table key={key} columns={columns} rows={rows} width={ctx.width} />;\n}\n\nfunction renderBlock(token: Token, ctx: RenderCtx, key: string, trailing: string): ReactNode {\n switch (token.type) {\n case 'heading':\n return (\n <Text key={key} bold>\n {renderInline(tokensOf(token), textOf(token))}\n {trailing}\n </Text>\n );\n case 'paragraph':\n case 'text':\n return (\n <Text key={key}>\n {renderInline(tokensOf(token), textOf(token))}\n {trailing}\n </Text>\n );\n case 'list':\n return renderList(token as Tokens.List, ctx, key, trailing);\n case 'code': {\n const lines = textOf(token).replace(/\\n$/, '').split('\\n');\n return (\n <Box\n key={key}\n flexDirection=\"column\"\n marginLeft={2}\n borderStyle={theme.unicode ? 'single' : 'classic'}\n borderTop={false}\n borderRight={false}\n borderBottom={false}\n borderLeftDimColor\n paddingLeft={1}\n >\n {lines.map((line, i) => (\n <Text key={i}>{line || ' '}</Text>\n ))}\n </Box>\n );\n }\n case 'blockquote':\n return (\n <Rail key={key} tone=\"muted\">\n {renderBlocks(tokensOf(token) ?? [], { width: Math.max(8, ctx.width - 2) }, key, false)}\n </Rail>\n );\n case 'hr':\n return <Text key={key}>{theme.dim(theme.symbols.line.repeat(Math.max(3, Math.min(ctx.width, 60))))}</Text>;\n case 'table':\n return renderTable(token as Tokens.Table, ctx, key);\n case 'html':\n return <Text key={key}>{theme.dim(textOf(token).trim())}</Text>;\n case 'space':\n case 'def':\n return null;\n default:\n return <Text key={key}>{textOf(token)}</Text>;\n }\n}\n\nconst INLINE_TAIL = new Set(['paragraph', 'text', 'heading', 'list']);\n\n/** Renders block tokens with one blank line between blocks (tight inside list items). */\nfunction renderBlocks(tokens: Token[], ctx: RenderCtx, keyPrefix: string, spaced = true): ReactNode[] {\n const blocks = tokens.filter((t) => t.type !== 'space' && t.type !== 'def');\n const out: ReactNode[] = [];\n blocks.forEach((token, i) => {\n const isLast = i === blocks.length - 1;\n const trailing = isLast && ctx.trailing && INLINE_TAIL.has(token.type) ? ctx.trailing : '';\n let node: ReactNode;\n try {\n node = renderBlock(token, ctx, `${keyPrefix}-${i}`, trailing);\n } catch {\n node = <Text key={`${keyPrefix}-${i}`}>{token.raw}</Text>;\n }\n if (spaced && i > 0) out.push(<Text key={`${keyPrefix}-${i}-gap`}> </Text>);\n out.push(node);\n if (isLast && ctx.trailing && !trailing) out.push(<Text key={`${keyPrefix}-tail`}>{ctx.trailing}</Text>);\n });\n if (blocks.length === 0 && ctx.trailing) out.push(<Text key={`${keyPrefix}-tail`}>{ctx.trailing}</Text>);\n return out;\n}\n\nexport type MarkdownProps = {\n text: string;\n width: number;\n /** Appended to the last paragraph (the streaming cursor `\u258D`). */\n trailing?: string;\n};\n\n/**\n * Own renderer on the `marked@15` lexer (research \u00A75.10): headings bold, `\u2022`\n * and numbered lists, inline code in `theme.code`, fenced code indented with a\n * dim gutter, links as text + dim url, blockquotes on a rail, tables aligned.\n */\nexport const Markdown = memo(function Markdown({ text, width, trailing }: MarkdownProps) {\n const tokens = useMemo(() => lexMarkdown(text), [text]);\n return (\n <Box flexDirection=\"column\" width={width}>\n {renderBlocks(tokens, { width, trailing }, 'md')}\n </Box>\n );\n});\n", "/**\n * Inline markdown \u2192 one styled string (bold, italic, inline code, links as\n * text + dim url, strikethrough). Never throws: unknown tokens fall back to\n * their raw text.\n */\nimport type { Token, Tokens } from 'marked';\nimport { theme } from '../theme';\nimport { stripAnsi } from '../text';\n\nconst ENTITIES: Record<string, string> = {\n '&': '&',\n '<': '<',\n '>': '>',\n '"': '\"',\n ''': \"'\",\n ''': \"'\",\n ' ': ' ',\n};\n\nexport function decodeEntities(text: string): string {\n return text\n .replace(/&(?:amp|lt|gt|quot|apos|nbsp|#39);/g, (m) => ENTITIES[m] ?? m)\n .replace(/&#(\\d{1,6});/g, (m, code: string) => {\n const n = Number(code);\n return n > 0 && n < 0x10ffff ? String.fromCodePoint(n) : m;\n });\n}\n\nfunction childTokens(token: Token): Token[] | undefined {\n const tokens = (token as { tokens?: unknown }).tokens;\n return Array.isArray(tokens) ? (tokens as Token[]) : undefined;\n}\n\nfunction textOf(token: Token): string {\n const text = (token as { text?: unknown }).text;\n if (typeof text === 'string') return text;\n const raw = (token as { raw?: unknown }).raw;\n return typeof raw === 'string' ? raw : '';\n}\n\nfunction renderLink(token: Tokens.Link): string {\n const label = renderInline(token.tokens, token.text);\n const href = token.href ?? '';\n const plain = stripAnsi(label).trim();\n if (!href || plain === href || `mailto:${plain}` === href) return theme.link(label || href);\n return `${label} ${theme.dim(`(${href})`)}`;\n}\n\nfunction renderToken(token: Token): string {\n switch (token.type) {\n case 'text': {\n const children = childTokens(token);\n return children ? renderInline(children, textOf(token)) : decodeEntities(textOf(token));\n }\n case 'escape':\n return textOf(token);\n case 'strong':\n return theme.bold(renderInline(childTokens(token), textOf(token)));\n case 'em':\n return theme.italic(renderInline(childTokens(token), textOf(token)));\n case 'del':\n return theme.strike(renderInline(childTokens(token), textOf(token)));\n case 'codespan':\n return theme.code(decodeEntities(textOf(token)));\n case 'br':\n return '\\n';\n case 'link':\n return renderLink(token as Tokens.Link);\n case 'image': {\n const image = token as Tokens.Image;\n return `${theme.dim('[image]')} ${image.text || ''}${image.href ? ` ${theme.dim(`(${image.href})`)}` : ''}`.trim();\n }\n case 'html': {\n const text = textOf(token);\n return /^<br\\s*\\/?>$/i.test(text.trim()) ? '\\n' : '';\n }\n case 'checkbox':\n return '';\n default:\n return decodeEntities(textOf(token));\n }\n}\n\n/** Styled string for a list of inline tokens; `fallback` when there are none. */\nexport function renderInline(tokens: Token[] | undefined, fallback = ''): string {\n if (!tokens || tokens.length === 0) return decodeEntities(fallback);\n let out = '';\n for (const token of tokens) {\n try {\n out += renderToken(token);\n } catch {\n out += textOf(token);\n }\n }\n return out;\n}\n", "import { Box, Text } from 'ink';\nimport { memo, useMemo } from 'react';\nimport { theme } from '../theme';\nimport { type TableColumn, formatTableHeader, formatTableRow, layoutTable } from './table-layout';\n\nexport type { TableColumn } from './table-layout';\n\nexport type TableProps = {\n columns: readonly TableColumn[];\n rows: ReadonlyArray<Record<string, string>>;\n width: number;\n /** First row index to show (scrolling) and how many. */\n offset?: number;\n limit?: number;\n};\n\n/** Aligned columns, dim header, one line per row, truncation instead of wrapping. */\nexport const Table = memo(function Table({ columns, rows, width, offset = 0, limit }: TableProps) {\n const layout = useMemo(() => layoutTable(columns, rows, width), [columns, rows, width]);\n const shown = rows.slice(offset, limit === undefined ? undefined : offset + limit);\n return (\n <Box flexDirection=\"column\" width={width}>\n <Text wrap=\"truncate-end\">{theme.dim(formatTableHeader(layout))}</Text>\n {shown.map((row, i) => (\n <Text key={offset + i} wrap=\"truncate-end\">\n {formatTableRow(layout, row)}\n </Text>\n ))}\n </Box>\n );\n});\n", "/**\n * Pure table layout: natural widths, shrink-to-fit, then drop low-priority\n * columns. Rows are one line each; cells truncate with `\u2026`, never wrap.\n */\nimport { displayWidth, padEnd, padStart, truncate } from '../text';\n\nexport type TableColumn = {\n key: string;\n header: string;\n align?: 'left' | 'right';\n /** Cap on the natural width (default 48). */\n maxWidth?: number;\n};\n\nexport type TableLayout = { columns: TableColumn[]; widths: number[] };\n\nexport const TABLE_GAP = 2;\nconst MIN_CELL = 4;\n\nfunction minWidth(column: TableColumn): number {\n return Math.min(Math.max(MIN_CELL, displayWidth(column.header)), 10);\n}\n\nexport function layoutTable(\n columns: readonly TableColumn[],\n rows: ReadonlyArray<Record<string, string>>,\n width: number,\n gap = TABLE_GAP,\n): TableLayout {\n let visible = [...columns];\n const natural = (column: TableColumn) =>\n Math.min(\n column.maxWidth ?? 48,\n Math.max(displayWidth(column.header), ...rows.map((row) => displayWidth(row[column.key] ?? ''))),\n );\n let widths = visible.map(natural);\n const total = () => widths.reduce((a, b) => a + b, 0) + gap * Math.max(0, widths.length - 1);\n\n for (;;) {\n while (total() > width) {\n let widest = -1;\n for (let i = 0; i < widths.length; i += 1) {\n const column = visible[i] as TableColumn;\n if ((widths[i] as number) > minWidth(column) && (widest < 0 || (widths[i] as number) > (widths[widest] as number))) {\n widest = i;\n }\n }\n if (widest < 0) break;\n widths[widest] = (widths[widest] as number) - 1;\n }\n if (total() <= width || visible.length <= 1) break;\n // Still too wide at minimum widths: drop the last (lowest-priority) column and re-fit.\n visible = visible.slice(0, -1);\n widths = visible.map(natural);\n }\n if (visible.length === 1 && total() > width) widths = [Math.max(1, width)];\n return { columns: visible, widths };\n}\n\n/** One formatted row: padded, truncated, joined by the gap, right-trimmed. */\nexport function formatTableRow(\n layout: TableLayout,\n cells: Record<string, string>,\n gap = TABLE_GAP,\n): string {\n return layout.columns\n .map((column, i) => {\n const w = layout.widths[i] as number;\n const text = truncate((cells[column.key] ?? '').replace(/\\s+/g, ' '), w);\n return column.align === 'right' ? padStart(text, w) : padEnd(text, w);\n })\n .join(' '.repeat(gap))\n .trimEnd();\n}\n\nexport function formatTableHeader(layout: TableLayout, gap = TABLE_GAP): string {\n const cells: Record<string, string> = {};\n for (const column of layout.columns) cells[column.key] = column.header;\n return formatTableRow(layout, cells, gap);\n}\n", "import { Box, Text } from 'ink';\nimport { memo } from 'react';\nimport type { ChatSource } from '../../core/chat-artifacts';\nimport { hyperlink, supportsHyperlinks } from '../hyperlink';\nimport { theme } from '../theme';\nimport { displayWidth, truncate } from '../text';\n\nconst MAX_SOURCES = 8;\n\nfunction hostOf(source: ChatSource): string {\n if (source.domain) return source.domain;\n try {\n return new URL(source.url).host;\n } catch {\n return '';\n }\n}\n\n/**\n * The answer's research sources, numbered in the order research found them:\n * `1 Title \u00B7 domain`. The title links to the page where OSC 8 works;\n * elsewhere the URL follows, dim, so it can be copied.\n */\nexport const SourcesList = memo(function SourcesList(props: { sources: readonly ChatSource[]; width: number; links?: boolean }) {\n const { sources, width } = props;\n const links = props.links ?? supportsHyperlinks();\n const shown = sources.slice(0, MAX_SOURCES);\n const numberWidth = String(shown.length).length;\n return (\n <Box flexDirection=\"column\" width={width}>\n <Text>{theme.dim('Sources')}</Text>\n {shown.map((source, i) => {\n const host = hostOf(source);\n const title = truncate(source.title, Math.max(10, Math.min(60, width - numberWidth - displayWidth(host) - 8)));\n return (\n <Box key={`${i}-${source.url}`} width={width}>\n <Box flexShrink={0}>\n <Text>\n {theme.dim(String(i + 1).padStart(numberWidth))} {links ? hyperlink(title, source.url) : title}\n </Text>\n </Box>\n <Box flexGrow={1} flexShrink={1}>\n <Text wrap=\"truncate-end\">\n {host && host !== source.title ? theme.dim(` ${theme.symbols.middot} ${host}`) : ''}\n {links ? '' : theme.dim(` ${source.url}`)}\n </Text>\n </Box>\n </Box>\n );\n })}\n {sources.length > shown.length ? <Text>{theme.dim(`+${sources.length - shown.length} more`)}</Text> : null}\n </Box>\n );\n});\n", "import { Box, Text } from 'ink';\nimport { memo } from 'react';\nimport type { ChatArtifact } from '../../core/chat-artifacts';\nimport type { ChatToolCall } from '../../core/chat-model';\nimport { theme } from '../theme';\nimport { clipLines, displayWidth, formatElapsed, safeJson, shortId, summarizeArgs } from '../text';\nimport { ArtifactRow } from './ArtifactRow';\nimport { Spinner, useClockTick } from './Spinner';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/** Short right-hand summary of a tool result (`12 found`, `failed`). */\nexport function resultSummary(result: unknown): string {\n if (Array.isArray(result)) return `${result.length} found`;\n if (!isRecord(result)) return '';\n if (result.ok === false || result.error === true) return 'failed';\n for (const key of ['total', 'totalCount', 'count']) {\n if (typeof result[key] === 'number') return `${result[key]} found`;\n }\n const arrays = Object.values(result).filter(Array.isArray);\n return arrays.length === 1 ? `${(arrays[0] as unknown[]).length} found` : '';\n}\n\nfunction glyph(call: ChatToolCall) {\n if (call.decision === 'approve') return <Text>{theme.success(theme.symbols.success)}</Text>;\n if (call.decision === 'reject') return <Text>{theme.error(theme.symbols.error)}</Text>;\n if (call.left) return <Text>{theme.attention(theme.symbols.attention)}</Text>;\n switch (call.stage) {\n case 'running':\n return <Spinner />;\n case 'pending_approval':\n return <Text>{theme.attention(theme.symbols.attention)}</Text>;\n case 'completed':\n return <Text>{theme.success(theme.symbols.success)}</Text>;\n case 'failed':\n return <Text>{theme.error(theme.symbols.error)}</Text>;\n default:\n return <Text>{theme.dim(theme.symbols.error)}</Text>;\n }\n}\n\nfunction titleText(call: ChatToolCall): string {\n if (call.decision === 'approve') return `Approved ${call.title}`;\n if (call.decision === 'reject') return `Rejected ${call.title}`;\n if (call.left) return `Left pending ${call.title}`;\n if (call.stage === 'running') return `${call.title}${theme.symbols.ellipsis}`;\n if (call.stage === 'declined') return `${call.title} ${theme.dim('declined')}`;\n return call.title;\n}\n\n/** Finished duration: `<0.1s` only when it really was, else `0.8s`, `12s`, `1m 04s`; nothing when unmeasured. */\nexport function formatToolDuration(ms: number | undefined): string | null {\n if (ms === undefined) return null;\n return ms < 100 ? '<0.1s' : formatElapsed(ms);\n}\n\n/** While running, the time stays hidden for the first second, then counts on the shared clock. */\nexport const RunningTime = memo(function RunningTime({ since }: { since: number }) {\n useClockTick(true);\n const elapsed = Date.now() - since;\n return elapsed >= 1000 ? <Text>{theme.dim(formatElapsed(elapsed))}</Text> : null;\n});\n\nexport type ToolCallRowProps = { call: ChatToolCall; width: number; expanded?: boolean };\n\n/**\n * One line per tool call: glyph by stage, verb title, dim args summary,\n * right-aligned result summary and duration. `expanded` shows args/result JSON.\n */\nexport const ToolCallRow = memo(function ToolCallRow({ call, width, expanded = false }: ToolCallRowProps) {\n const card = cardOf(call);\n if (card && !(call.stage === 'pending_approval' && !call.decision)) {\n return (\n <Box flexDirection=\"column\" width={width}>\n <ArtifactRow artifact={card} draft={call.draft} width={width} />\n {expanded ? <ToolCallDetail call={call} width={width} /> : null}\n </Box>\n );\n }\n const waiting = call.stage === 'pending_approval' && !call.decision && !call.left;\n const summary = waiting\n ? theme.attention('waiting for approval')\n : call.left && call.approvalId\n ? theme.dim(shortId(call.approvalId))\n : theme.dim(call.denial ? 'unavailable' : call.stage === 'failed' ? 'failed' : call.research ? sourcesSummary(call) : resultSummary(call.result));\n const measured = formatToolDuration(call.durationMs);\n const duration = measured ? theme.dim(measured) : null;\n const running = call.stage === 'running' && call.endedAt === undefined;\n const rightWidth = displayWidth(summary) + 2 + (duration ? displayWidth(duration) : 6);\n const args = summarizeArgs(call.args, Math.max(8, width - displayWidth(titleText(call)) - rightWidth - 7));\n return (\n <Box flexDirection=\"column\" width={width}>\n <Box width={width}>\n {glyph(call)}\n <Box flexGrow={1} flexShrink={1} marginLeft={1}>\n <Text wrap=\"truncate-end\">\n {titleText(call)}\n {args ? theme.dim(` ${theme.symbols.middot} ${args}`) : ''}\n </Text>\n </Box>\n <Box flexShrink={0} marginLeft={1}>\n {summary ? <Text>{summary} </Text> : null}\n {duration ? <Text>{duration}</Text> : running ? <RunningTime since={call.startedAt} /> : null}\n </Box>\n </Box>\n {call.denial ? (\n <Text wrap=\"truncate-end\">\n {theme.dim(` ${theme.symbols.arrowRight} ${call.denial.message}${call.denial.reason ? ` (${call.denial.reason})` : ''}`)}\n </Text>\n ) : null}\n {expanded ? <ToolCallDetail call={call} width={width} /> : null}\n </Box>\n );\n});\n\n/** The artifact card of a call: its result, or the writer's draft while it builds. */\nfunction cardOf(call: ChatToolCall): ChatArtifact | null {\n if (call.artifact) return call.artifact;\n if (!call.draft || call.stage !== 'running') return null;\n const title = typeof call.args.title === 'string' && call.args.title ? call.args.title : call.title;\n return { id: call.draft.artifactId, kind: call.draft.kind, title, status: 'pending' };\n}\n\nfunction sourcesSummary(call: ChatToolCall): string {\n const n = call.sources?.length ?? 0;\n if (call.stage === 'running') return '';\n return n ? `${n} ${n === 1 ? 'source' : 'sources'}` : 'no sources';\n}\n\n/** Research detail: the queries it ran and the sources it read. */\nfunction researchLines(call: ChatToolCall): string[] {\n const result = isRecord(call.result) ? call.result : {};\n const queries = Array.isArray(result.queries) ? result.queries.filter((q): q is string => typeof q === 'string') : [];\n const lines = queries.map((q) => `query ${q}`);\n (call.sources ?? []).forEach((source, i) => lines.push(`${i + 1} ${source.title} ${theme.dim(source.url)}`));\n return lines;\n}\n\n/** `ctrl+o` detail: args and result JSON, clipped with `+N lines`. */\nexport const ToolCallDetail = memo(function ToolCallDetail({ call, width }: { call: ChatToolCall; width: number }) {\n if (call.research && call.result !== undefined && !call.denial) {\n const { lines, hidden } = clipLines(researchLines(call).join('\\n'), 16);\n return (\n <Box flexDirection=\"column\" marginLeft={2} width={Math.max(10, width - 2)}>\n {lines.map((line, i) => (\n <Text key={i} wrap=\"truncate-end\">\n {theme.dim(theme.symbols.gutter)} {line}\n </Text>\n ))}\n {hidden > 0 ? <Text>{theme.dim(` +${hidden} lines`)}</Text> : null}\n </Box>\n );\n }\n const blocks: Array<[string, unknown]> = [['args', call.args]];\n if (call.result !== undefined) blocks.push(['result', call.result]);\n return (\n <Box flexDirection=\"column\" marginLeft={2} width={Math.max(10, width - 2)}>\n {blocks.map(([label, value]) => {\n const { lines, hidden } = clipLines(safeJson(value), 16);\n return (\n <Box key={label} flexDirection=\"column\">\n <Text>{theme.dim(label)}</Text>\n {lines.map((line, i) => (\n <Text key={i} wrap=\"truncate-end\">\n {theme.dim(theme.symbols.gutter)} {line}\n </Text>\n ))}\n {hidden > 0 ? <Text>{theme.dim(` +${hidden} lines`)}</Text> : null}\n </Box>\n );\n })}\n </Box>\n );\n});\n", "/**\n * Slash commands of the chat screen (`/new`, `/threads`, `/mode`, `/model`,\n * `/research`, `/image`, `/result`, `/help`, `/home`, `/exit`). The\n * capability commands save the choice for the profile (sticky, like the\n * app's composer) and warn when the account cannot use it.\n */\nimport { useCallback, useRef } from 'react';\nimport {\n type CapabilityAvailability,\n type CapabilityKey,\n type ChatCapabilities,\n parseCapabilityMode,\n unavailableNotices,\n} from '../../../core/capabilities';\nimport { toCliError } from '../../../core/errors';\nimport type { UiServices } from '../../services';\nimport { theme } from '../../theme';\nimport { CHAT_HELP, parseMode } from './commands';\nimport type { ChatSession } from './useChatSession';\n\nexport type ChatCommandDeps = {\n session: ChatSession;\n services: UiServices;\n companyId?: string;\n hostedByHome: boolean;\n onExit(reason: 'exit' | 'home'): void;\n openThreads(): void;\n};\n\nexport function useChatCommands(deps: ChatCommandDeps): (name: string, arg: string) => void {\n const { session, services, companyId, hostedByHome, onExit, openThreads } = deps;\n const { state } = session;\n const availability = useRef<Promise<CapabilityAvailability | null> | null>(null);\n\n const warnIfUnavailable = useCallback(\n (capabilities: ChatCapabilities) => {\n if (!services.loadCapabilities) return;\n availability.current ??= services.loadCapabilities().catch(() => null);\n void availability.current.then((answer) => {\n for (const text of unavailableNotices(capabilities, answer)) session.dispatch({ type: 'notice', tone: 'info', text });\n });\n },\n [services, session],\n );\n\n const setCapability = useCallback(\n (key: CapabilityKey, arg: string) => {\n if (!arg) {\n session.dispatch({ type: 'notice', tone: 'info', text: `${key} ${state.capabilities[key]} ${theme.symbols.middot} /${key} <mode> to change it` });\n return;\n }\n let value: ChatCapabilities[CapabilityKey];\n try {\n value = parseCapabilityMode(key, arg);\n } catch (error) {\n session.dispatch({ type: 'notice', tone: 'error', text: toCliError(error).message.replace(/^--/, '/') });\n return;\n }\n const next = { ...state.capabilities, [key]: value } as ChatCapabilities;\n session.dispatch({ type: 'set-capability', key, value });\n let saved = false;\n try {\n services.saveCapabilityPrefs?.(next);\n saved = Boolean(services.saveCapabilityPrefs);\n } catch {\n saved = false;\n }\n const scope = state.mode === 'employer' ? ' (employer chats ignore it)' : '';\n session.dispatch({\n type: 'notice',\n tone: 'info',\n text: `${key} ${value}${scope}${saved ? ` ${theme.symbols.middot} saved for profile ${services.profileName}` : ''}`,\n });\n if (state.mode !== 'employer') warnIfUnavailable(next);\n },\n [session, services, state.capabilities, state.mode, warnIfUnavailable],\n );\n\n return useCallback(\n (name: string, arg: string) => {\n switch (name) {\n case 'new':\n session.dispatch({ type: 'new-thread' });\n session.dispatch({ type: 'notice', tone: 'info', text: `New chat ${theme.symbols.middot} ${state.mode}` });\n return;\n case 'threads':\n openThreads();\n return;\n case 'mode': {\n const mode = parseMode(arg);\n if (!mode) session.dispatch({ type: 'notice', tone: 'error', text: 'Use /mode seeker or /mode employer' });\n else {\n session.dispatch({ type: 'set-mode', mode });\n session.dispatch({ type: 'notice', tone: 'info', text: `Mode ${mode} ${theme.symbols.middot} new chat` });\n }\n return;\n }\n case 'model': {\n if (!arg) {\n const current = state.modelId ?? 'auto';\n services\n .listModels({ mode: state.mode, companyId })\n .then(({ models }) => {\n const list = models.map((m) => `${m.id === current ? `${theme.symbols.pointer} ` : ' '}${m.id} ${m.displayName}${m.locked ? ` (${m.minimumTier} plan)` : ''}`);\n session.dispatch({ type: 'notice', tone: 'info', text: [`Model: ${current} \u00B7 /model <id> to switch`, ...list].join('\\n') });\n })\n .catch(() => session.dispatch({ type: 'notice', tone: 'info', text: `Model: ${current} ${theme.symbols.middot} /model <id> or /model auto` }));\n return;\n }\n const modelId = arg === 'auto' ? undefined : arg;\n session.dispatch({ type: 'set-model', modelId });\n session.dispatch({ type: 'notice', tone: 'info', text: `Model ${modelId ?? 'auto'} for the next messages` });\n return;\n }\n case 'research':\n case 'image':\n case 'result':\n setCapability(name, arg);\n return;\n case 'help':\n session.dispatch({ type: 'notice', tone: 'info', text: CHAT_HELP });\n return;\n case 'home':\n onExit(hostedByHome ? 'home' : 'exit');\n return;\n case 'exit':\n case 'quit':\n onExit('exit');\n return;\n default:\n session.dispatch({ type: 'notice', tone: 'error', text: `Unknown command /${name}`, hint: 'Type / to see the commands.' });\n }\n },\n [session, state.mode, state.modelId, openThreads, onExit, hostedByHome, services, companyId, setCapability],\n );\n}\n", "/**\n * Chat controller: owns the transcript reducer, the in-flight stream (with\n * its AbortController), the 50 ms event flush + stable-block promotion, the\n * follow-up queue and approval decisions. Rendering lives in Chat.tsx.\n */\nimport type { AgentMode } from '@tabbio/types';\nimport { useCallback, useEffect, useReducer, useRef, useState } from 'react';\nimport { type ChatCapabilities, DEFAULT_CAPABILITIES, capabilityRequestFields } from '../../../core/capabilities';\nimport { type ApprovalChoice, type ChatAction, type PendingApproval, chatReducer, initialChatState, messageText } from '../../../core/chat';\nimport { isCliError, toCliError } from '../../../core/errors';\nimport type { UiServices } from '../../services';\nimport { useArtifactFollowUp } from './useArtifactFollowUp';\n\nexport const FLUSH_INTERVAL_MS = 50;\nconst HISTORY_LIMIT = 20;\n\nexport type ChatSessionOptions = {\n services: UiServices;\n mode: AgentMode;\n companyId?: string;\n threadId?: string;\n modelId?: string;\n initialMessage?: string;\n /** Research / Image / Result; defaults to the profile's saved choice. */\n capabilities?: ChatCapabilities;\n};\n\nexport function useChatSession(opts: ChatSessionOptions) {\n const { services, companyId } = opts;\n const [state, dispatch] = useReducer(chatReducer, opts, (o) =>\n initialChatState({\n mode: o.mode,\n threadId: o.threadId,\n modelId: o.modelId,\n capabilities: o.capabilities ?? o.services.capabilityPrefs ?? DEFAULT_CAPABILITIES,\n links: Boolean(o.services.hyperlinks),\n }),\n );\n const stateRef = useRef(state);\n stateRef.current = state;\n const buffer = useRef<ChatAction[]>([]);\n const abortRef = useRef<AbortController | null>(null);\n const mounted = useRef(true);\n const [queue, setQueue] = useState<string[]>([]);\n const [deciding, setDeciding] = useState<ApprovalChoice | null>(null);\n const [loading, setLoading] = useState<{ label: string; since: number } | null>(\n opts.threadId ? { label: 'Loading the thread\u2026', since: Date.now() } : null,\n );\n\n const flush = useCallback(() => {\n const events = buffer.current.splice(0);\n for (const event of events) dispatch(event);\n }, []);\n\n // Stream events are buffered and applied every 50 ms, then stable blocks are promoted.\n useEffect(() => {\n if (!state.streaming) return undefined;\n const id = setInterval(() => {\n flush();\n dispatch({ type: 'tick' });\n }, FLUSH_INTERVAL_MS);\n return () => clearInterval(id);\n }, [state.streaming, flush]);\n\n useEffect(\n () => () => {\n mounted.current = false;\n abortRef.current?.abort();\n },\n [],\n );\n\n const send = useCallback(\n (text: string) => {\n const message = text.trim();\n if (!message) return;\n if (stateRef.current.streaming) {\n setQueue((q) => [...q, message]);\n return;\n }\n dispatch({ type: 'submit', text: message, at: Date.now() });\n const controller = new AbortController();\n abortRef.current = controller;\n const { mode, threadId, modelId, capabilities } = stateRef.current;\n void (async () => {\n try {\n const request = { mode, message, threadId, modelId, companyId, ...capabilityRequestFields(mode, capabilities) };\n const stream = services.streamChat(request, controller.signal);\n for await (const event of stream) buffer.current.push({ ...event, at: Date.now() });\n if (!mounted.current) return;\n flush();\n dispatch({ type: 'tick' });\n } catch (error) {\n if (!mounted.current) return;\n flush();\n const cancelled = controller.signal.aborted || (isCliError(error) && error.exitCode === 130);\n const cli = toCliError(error);\n dispatch({\n type: 'stream-failed',\n message: cancelled ? 'Stopped' : cli.message,\n hint: cancelled ? undefined : cli.hint,\n cancelled,\n at: Date.now(),\n });\n } finally {\n if (abortRef.current === controller) abortRef.current = null;\n }\n })();\n },\n [services, companyId, flush],\n );\n\n const interrupt = useCallback((): boolean => {\n if (!abortRef.current) return false;\n abortRef.current.abort();\n return true;\n }, []);\n\n // Queued follow-ups go out once the turn and any approval are done.\n useEffect(() => {\n if (state.streaming || state.approvals.length > 0 || queue.length === 0) return;\n const [next, ...rest] = queue;\n setQueue(rest);\n if (next) send(next);\n }, [state.streaming, state.approvals.length, queue, send]);\n\n const decide = useCallback(\n async (approval: PendingApproval, decision: ApprovalChoice) => {\n if (decision === 'leave') {\n dispatch({ type: 'approval-decided', approvalId: approval.approvalId, decision, at: Date.now() });\n return;\n }\n setDeciding(decision);\n try {\n const data = await services.decideApproval(approval.approvalId, decision, { mode: stateRef.current.mode, companyId });\n if (!mounted.current) return;\n dispatch({ type: 'approval-decided', approvalId: approval.approvalId, decision, text: data.assistant?.text, at: Date.now() });\n } catch (error) {\n if (!mounted.current) return;\n const cli = toCliError(error);\n dispatch({\n type: 'approval-decided',\n approvalId: approval.approvalId,\n decision,\n error: cli.hint ? `${cli.message}. ${cli.hint}` : cli.message,\n at: Date.now(),\n });\n } finally {\n if (mounted.current) setDeciding(null);\n }\n },\n [services, companyId],\n );\n\n const resume = useCallback(\n async (threadId: string, title?: string) => {\n setLoading({ label: 'Loading the thread\u2026', since: Date.now() });\n try {\n const data = await services.getThreadMessages(threadId, { mode: stateRef.current.mode, companyId });\n if (!mounted.current) return;\n const messages = data.messages\n .map((m) => ({ role: m.role, text: messageText(m.content) }))\n .filter((m) => m.text.trim())\n .slice(-HISTORY_LIMIT);\n dispatch({ type: 'notice', tone: 'info', text: `Resumed ${title ? `\u201C${title}\u201D` : 'thread'} \u00B7 last ${messages.length} messages` });\n dispatch({ type: 'history', threadId, messages });\n } catch (error) {\n if (!mounted.current) return;\n const cli = toCliError(error);\n dispatch({ type: 'notice', tone: 'error', text: `Could not load the thread: ${cli.message}`, hint: cli.hint });\n } finally {\n if (mounted.current) setLoading(null);\n }\n },\n [services, companyId],\n );\n\n // Mount: resume the thread (if any), then send the first message (if any).\n const booted = useRef(false);\n useEffect(() => {\n if (booted.current) return;\n booted.current = true;\n void (async () => {\n if (opts.threadId) await resume(opts.threadId);\n if (opts.initialMessage && mounted.current) send(opts.initialMessage);\n })();\n }, [opts.threadId, opts.initialMessage, resume, send]);\n\n useArtifactFollowUp(state, dispatch, services);\n\n return { state, dispatch, send, interrupt, decide, deciding, queue, setQueue, resume, loading };\n}\n\nexport type ChatSession = ReturnType<typeof useChatSession>;\n", "/**\n * Follows the artifact cards of the live turn (PR #512): a `pending` card is\n * polled (`GET /api/artifacts/:id`, 2 s backing off to 5 s, up to 5 min)\n * until it is ready or failed; a ready card gets a signed preview URL for\n * its OSC 8 title link. Results go back to the reducer as `artifact-status`\n * actions; a card that never settles is released so the transcript moves on.\n */\nimport { type Dispatch, useEffect, useRef } from 'react';\nimport { waitForArtifact } from '../../../core/artifacts';\nimport type { ChatAction, ChatState } from '../../../core/chat';\nimport type { ChatArtifact } from '../../../core/chat-artifacts';\nimport type { UiServices } from '../../services';\n\nconst FOLLOW_TIMEOUT_MS = 5 * 60_000;\n\nfunction liveArtifacts(state: ChatState): ChatArtifact[] {\n const items = state.turn?.items ?? [];\n return items.flatMap((item) => (item.kind === 'tool' && item.call.artifact ? [item.call.artifact] : []));\n}\n\nexport function useArtifactFollowUp(state: ChatState, dispatch: Dispatch<ChatAction>, services: UiServices): void {\n const followed = useRef(new Map<string, 'poll' | 'link'>());\n const alive = useRef(true);\n useEffect(\n () => () => {\n alive.current = false;\n },\n [],\n );\n\n const cards = liveArtifacts(state);\n const key = cards.map((c) => `${c.id}:${c.status}:${c.linkPending ? 1 : 0}:${c.released ? 1 : 0}`).join('|');\n\n useEffect(() => {\n const send = (action: ChatAction) => {\n if (alive.current) dispatch(action);\n };\n const mintLink = async (card: ChatArtifact) => {\n try {\n const url = services.artifactPreviewUrl ? await services.artifactPreviewUrl(card.id, card.kind) : undefined;\n send({ type: 'artifact-status', artifactId: card.id, ...(url ? { previewUrl: url } : {}) });\n } catch {\n send({ type: 'artifact-status', artifactId: card.id });\n }\n };\n for (const card of cards) {\n if (card.released) continue;\n const task = followed.current.get(card.id);\n if (card.status === 'pending' && task !== 'poll') {\n followed.current.set(card.id, 'poll');\n const getArtifact = services.getArtifact;\n if (!getArtifact) {\n send({ type: 'artifact-status', artifactId: card.id, release: true });\n continue;\n }\n void (async () => {\n try {\n const { artifact, timedOut } = await waitForArtifact(() => getArtifact(card.id), { timeoutMs: FOLLOW_TIMEOUT_MS });\n if (!artifact || timedOut) {\n send({ type: 'artifact-status', artifactId: card.id, release: true });\n return;\n }\n const url =\n artifact.status === 'ready' && services.hyperlinks && services.artifactPreviewUrl\n ? await services.artifactPreviewUrl(card.id, card.kind).catch(() => undefined)\n : undefined;\n send({\n type: 'artifact-status',\n artifactId: card.id,\n status: artifact.status,\n title: artifact.title,\n ...(url ? { previewUrl: url } : {}),\n ...(artifact.error ? { failure: artifact.error } : {}),\n });\n } catch {\n send({ type: 'artifact-status', artifactId: card.id, release: true });\n }\n })();\n } else if (card.status === 'ready' && card.linkPending && !task) {\n followed.current.set(card.id, 'link');\n void mintLink(card);\n }\n }\n // `key` summarizes the cards; the list itself is recomputed every render.\n }, [key, dispatch, services]);\n}\n", "import type { AgentMode } from '@tabbio/types';\nimport { Box, type Key, Text, useInput } from 'ink';\nimport { useCallback, useEffect, useMemo, useReducer, useRef, useState } from 'react';\nimport type { CatalogTool } from '../../../core/catalog';\nimport { toCliError } from '../../../core/errors';\nimport { relativeTime } from '../../../core/io';\nimport { editorReducer, emptyEditor } from '../../components/editor-model';\nimport { KeyHints } from '../../components/KeyHints';\nimport { KeyValue } from '../../components/KeyValue';\nimport { Working } from '../../components/Spinner';\nimport type { StatusRow, UiServices } from '../../services';\nimport { theme } from '../../theme';\nimport { Approvals } from '../Approvals';\nimport { Chat } from '../chat/Chat';\nimport { paletteMatches, parseSlash } from '../Palette';\nimport { ToolBrowser } from '../ToolBrowser';\nimport { HOME_HELP_ROWS, type HomeData, emptyHomeData, homeCommands, isHomeCommand } from './home-model';\nimport { HomeView } from './HomeView';\n\ntype Route =\n | { name: 'home' }\n | { name: 'chat'; initialMessage?: string; threadId?: string }\n | { name: 'tools'; since: number; tools?: CatalogTool[]; error?: string }\n | { name: 'approvals' }\n | { name: 'status'; since: number; rows?: StatusRow[]; error?: string }\n | { name: 'help' };\n\nexport type HomeProps = {\n services: UiServices;\n width: number;\n height: number;\n mode?: AgentMode;\n companyId?: string;\n /** Skip the network calls (tests, smoke renders). */\n initialData?: HomeData;\n onExit(): void;\n};\n\nconst DOUBLE_PRESS_MS = 2000;\n\n/** Back/quit keys for the simple sub-views (status, help, loading, errors). */\nfunction BackKeys({ onBack }: { onBack(): void }) {\n useInput((input, key) => {\n if (key.escape || input === 'q' || key.return) onBack();\n });\n return null;\n}\n\nexport function Home(props: HomeProps) {\n const { services, width, height, onExit, mode = 'seeker' } = props;\n const [route, setRoute] = useState<Route>({ name: 'home' });\n const [data, setData] = useState<HomeData>(props.initialData ?? emptyHomeData);\n const [editor, dispatchEditor] = useReducer(editorReducer, emptyEditor);\n const [paletteIndex, setPaletteIndex] = useState(0);\n const [focus, setFocus] = useState<'composer' | 'recent'>('composer');\n const [notice, setNotice] = useState<string | null>(null);\n const lastCtrlC = useRef(0);\n const mounted = useRef(true);\n useEffect(\n () => () => {\n mounted.current = false;\n },\n [],\n );\n\n const loadData = useCallback(async () => {\n if (props.initialData || !services.account.hasSession) return;\n const [plan, approvals, threads] = await Promise.allSettled([\n services.loadPlan(),\n services.loadPendingApprovals(),\n services.listThreads({ mode, companyId: props.companyId }),\n ]);\n if (!mounted.current) return;\n setData({\n plan: plan.status === 'fulfilled' ? plan.value : null,\n pendingApprovals: approvals.status === 'fulfilled' ? approvals.value.length : null,\n recent:\n threads.status === 'fulfilled'\n ? threads.value.slice(0, 5).map((t) => ({\n id: t.id,\n title: t.title?.trim() || 'Untitled chat',\n when: relativeTime(new Date(t.lastMessageAt ?? t.updatedAt)),\n }))\n : null,\n error: threads.status === 'rejected' ? toCliError(threads.reason).message : undefined,\n });\n }, [props.initialData, props.companyId, services, mode]);\n\n useEffect(() => {\n if (route.name === 'home') void loadData();\n }, [route.name, loadData]);\n\n useEffect(() => {\n if (!notice) return undefined;\n const timer = setTimeout(() => setNotice(null), 4000);\n return () => clearTimeout(timer);\n }, [notice]);\n\n const commands = useMemo(() => homeCommands(data, services.cachedToolCount), [data, services.cachedToolCount]);\n const matches = paletteMatches(commands, editor.value);\n const selected = Math.min(paletteIndex, Math.max(0, matches.length - 1));\n const goHome = useCallback(() => setRoute({ name: 'home' }), []);\n\n const needSession = useCallback(\n (what: string): boolean => {\n if (services.account.hasSession) return true;\n setNotice(theme.attention(`${theme.symbols.attention} ${what} needs a full sign-in. Run \\`tabbio login\\`.`));\n return false;\n },\n [services.account.hasSession],\n );\n\n const open = useCallback(\n (name: string) => {\n switch (name) {\n case 'chat':\n if (needSession('Chat')) setRoute({ name: 'chat' });\n return;\n case 'tools': {\n if (!services.account.signedIn) {\n setNotice(theme.attention(`${theme.symbols.attention} Sign in first: run \\`tabbio login\\`.`));\n return;\n }\n const since = Date.now();\n setRoute({ name: 'tools', since });\n services\n .listTools()\n .then((tools) => mounted.current && setRoute((r) => (r.name === 'tools' ? { ...r, tools } : r)))\n .catch((error: unknown) => mounted.current && setRoute((r) => (r.name === 'tools' ? { ...r, error: toCliError(error).message } : r)));\n return;\n }\n case 'approvals':\n if (needSession('Approvals')) setRoute({ name: 'approvals' });\n return;\n case 'status': {\n setRoute({ name: 'status', since: Date.now() });\n services\n .loadStatus()\n .then((rows) => mounted.current && setRoute((r) => (r.name === 'status' ? { ...r, rows } : r)))\n .catch((error: unknown) => mounted.current && setRoute((r) => (r.name === 'status' ? { ...r, error: toCliError(error).message } : r)));\n return;\n }\n case 'help':\n setRoute({ name: 'help' });\n return;\n case 'exit':\n case 'quit':\n onExit();\n return;\n default:\n setNotice(theme.error(`${theme.symbols.error} Unknown command /${name}`));\n }\n },\n [needSession, services, onExit],\n );\n\n const submit = useCallback(\n (value: string) => {\n const text = value.trim();\n if (!text) return;\n const slash = parseSlash(text);\n dispatchEditor({ type: 'remember', value: text });\n dispatchEditor({ type: 'clear' });\n setPaletteIndex(0);\n if (slash) {\n const exact = isHomeCommand(slash.name) ? slash.name : undefined;\n open(exact ?? matches[selected]?.name ?? slash.name);\n return;\n }\n if (needSession('Chat')) setRoute({ name: 'chat', initialMessage: text });\n },\n [open, matches, selected, needSession],\n );\n\n const onComposerKey = useCallback(\n (input: string, key: Key): boolean => {\n if (key.ctrl && input === 'c') return true;\n if (matches.length > 0 && (key.upArrow || key.downArrow)) {\n setPaletteIndex((i) => (key.upArrow ? Math.max(0, i - 1) : Math.min(matches.length - 1, i + 1)));\n return true;\n }\n if (key.tab) {\n if (matches.length > 0) {\n const choice = matches[selected];\n if (choice) dispatchEditor({ type: 'set', value: `/${choice.name}` });\n } else if (data.recent?.length) setFocus('recent');\n return true;\n }\n if (key.escape) {\n dispatchEditor({ type: 'clear' });\n return true;\n }\n return false;\n },\n [matches, selected, data.recent],\n );\n\n // Ctrl+C: everywhere except chat (which owns it), press twice to quit.\n useInput(\n (input, key) => {\n if (!(key.ctrl && input === 'c')) return;\n const now = Date.now();\n if (now - lastCtrlC.current < DOUBLE_PRESS_MS) {\n onExit();\n return;\n }\n lastCtrlC.current = now;\n if (editor.value) dispatchEditor({ type: 'clear' });\n setNotice(theme.attention('Press ctrl+c again to quit.'));\n },\n { isActive: route.name !== 'chat' },\n );\n\n switch (route.name) {\n case 'chat':\n return (\n <Chat\n services={services}\n mode={mode}\n companyId={props.companyId}\n threadId={route.threadId}\n initialMessage={route.initialMessage}\n width={width}\n height={height}\n hostedByHome\n onExit={(reason) => (reason === 'home' ? goHome() : onExit())}\n />\n );\n case 'tools':\n if (route.tools) return <ToolBrowser tools={route.tools} services={services} width={width} height={height} onExit={goHome} />;\n return (\n <Box flexDirection=\"column\" width={width}>\n {route.error ? <Text>{theme.error(`${theme.symbols.error} ${route.error}`)}</Text> : <Working label=\"Loading tools\u2026\" since={route.since} />}\n <BackKeys onBack={goHome} />\n </Box>\n );\n case 'approvals':\n return <Approvals services={services} width={width} height={height} onExit={goHome} />;\n case 'status':\n return (\n <Box flexDirection=\"column\" width={width}>\n <Text>{theme.bold('Status')}</Text>\n <Box marginTop={1} flexDirection=\"column\">\n {route.rows ? (\n <KeyValue rows={route.rows} width={width} />\n ) : route.error ? (\n <Text>{theme.error(`${theme.symbols.error} ${route.error}`)}</Text>\n ) : (\n <Working label=\"Checking\u2026\" since={route.since} />\n )}\n </Box>\n <Box marginTop={1}>\n <KeyHints width={width} hints={[{ key: 'q', label: 'back' }]} />\n </Box>\n <BackKeys onBack={goHome} />\n </Box>\n );\n case 'help':\n return (\n <Box flexDirection=\"column\" width={width}>\n <Text>{theme.bold('Keys and commands')}</Text>\n <Box marginTop={1}>\n <KeyValue rows={HOME_HELP_ROWS.map(([label, value]) => ({ label, value }))} width={width} />\n </Box>\n <Box marginTop={1}>\n <KeyHints width={width} hints={[{ key: 'q', label: 'back' }]} />\n </Box>\n <BackKeys onBack={goHome} />\n </Box>\n );\n default:\n return (\n <HomeView\n services={services}\n data={data}\n commands={commands}\n matches={matches}\n paletteIndex={selected}\n editor={editor}\n dispatchEditor={dispatchEditor}\n onSubmit={submit}\n onComposerKey={onComposerKey}\n focus={focus}\n onRecentSelect={(id) => {\n setFocus('composer');\n setRoute({ name: 'chat', threadId: id });\n }}\n onRecentCancel={() => setFocus('composer')}\n notice={notice}\n width={width}\n height={height}\n />\n );\n }\n}\n", "import { Box, Text, useInput } from 'ink';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type { McpPendingApproval } from '../../core/auth';\nimport { type ApprovalChoice, isDestructiveTool } from '../../core/chat-model';\nimport { toCliError } from '../../core/errors';\nimport { relativeTime } from '../../core/io';\nimport { ApprovalCard } from '../components/ApprovalCard';\nimport { approvalOutcomeText } from '../components/approval-model';\nimport { KeyHints } from '../components/KeyHints';\nimport { SelectList } from '../components/SelectList';\nimport { Working } from '../components/Spinner';\nimport type { UiServices } from '../services';\nimport { theme } from '../theme';\nimport { sentenceCase, shortId, summarizeArgs } from '../text';\nimport { ResultPanel } from './ResultPanel';\n\ntype Phase =\n | { name: 'loading'; since: number }\n | { name: 'list'; items: McpPendingApproval[] }\n | { name: 'card'; items: McpPendingApproval[]; item: McpPendingApproval; shownAt: number; busy: ApprovalChoice | null; error: string | null }\n | { name: 'done'; item: McpPendingApproval; decision: ApprovalChoice; result: unknown; durationMs: number }\n | { name: 'failed'; message: string; hint?: string };\n\nexport type ApprovalsProps = { services: UiServices; width: number; height: number; onExit(): void };\n\nfunction argsOf(item: McpPendingApproval): Record<string, unknown> {\n return typeof item.args === 'object' && item.args !== null && !Array.isArray(item.args) ? (item.args as Record<string, unknown>) : {};\n}\n\n/** Pending MCP approvals (`GET /api/integrations/mcp`) \u2192 card \u2192 confirm/reject. */\nexport function Approvals({ services, width, height, onExit }: ApprovalsProps) {\n const [phase, setPhase] = useState<Phase>({ name: 'loading', since: Date.now() });\n const mounted = useRef(true);\n useEffect(\n () => () => {\n mounted.current = false;\n },\n [],\n );\n\n const load = useCallback(async () => {\n if (!services.account.hasSession) {\n setPhase({ name: 'failed', message: 'Approvals need a full sign-in', hint: 'Run `tabbio login`; a personal MCP token cannot approve.' });\n return;\n }\n setPhase({ name: 'loading', since: Date.now() });\n try {\n const items = await services.loadPendingApprovals();\n if (mounted.current) setPhase({ name: 'list', items });\n } catch (error) {\n const cli = toCliError(error);\n if (mounted.current) setPhase({ name: 'failed', message: cli.message, hint: cli.hint });\n }\n }, [services]);\n\n useEffect(() => {\n void load();\n }, [load]);\n\n const decide = useCallback(\n async (decision: ApprovalChoice) => {\n if (phase.name !== 'card') return;\n if (decision === 'leave') {\n setPhase({ name: 'list', items: phase.items });\n return;\n }\n setPhase({ ...phase, busy: decision, error: null });\n try {\n const data = await services.decideApproval(phase.item.id, decision);\n if (!mounted.current) return;\n setPhase({\n name: 'done',\n item: phase.item,\n decision,\n result: decision === 'approve' ? (data.mcp?.result ?? data.assistant?.text ?? null) : null,\n durationMs: Date.now() - phase.shownAt,\n });\n } catch (error) {\n if (mounted.current) setPhase({ ...phase, busy: null, error: toCliError(error).message });\n }\n },\n [phase, services],\n );\n\n useInput(\n (input, key) => {\n if (phase.name === 'done' && phase.decision !== 'approve' && (key.return || key.escape || input === 'q')) void load();\n else if (phase.name === 'failed' && (key.escape || input === 'q' || key.return)) onExit();\n else if (phase.name === 'loading' && (key.escape || input === 'q')) onExit();\n },\n { isActive: (phase.name === 'done' && phase.decision !== 'approve') || phase.name === 'failed' || phase.name === 'loading' },\n );\n\n const count = phase.name === 'list' || phase.name === 'card' ? phase.items.length : null;\n const header = (\n <Box marginBottom={1}>\n <Text>\n {theme.bold('Approvals')}\n {count !== null ? theme.dim(` ${theme.symbols.middot} ${count} waiting`) : ''}\n </Text>\n </Box>\n );\n\n switch (phase.name) {\n case 'loading':\n return (\n <Box flexDirection=\"column\" width={width}>\n {header}\n <Working label=\"Loading approvals\u2026\" since={phase.since} />\n </Box>\n );\n case 'failed':\n return (\n <Box flexDirection=\"column\" width={width}>\n {header}\n <Text>{theme.error(`${theme.symbols.error} ${phase.message}`)}</Text>\n {phase.hint ? <Text wrap=\"wrap\">{theme.dim(` ${theme.symbols.arrowRight} ${phase.hint}`)}</Text> : null}\n <Box marginTop={1}>\n <KeyHints width={width} hints={[{ key: 'q', label: 'back' }]} />\n </Box>\n </Box>\n );\n case 'list':\n return (\n <Box flexDirection=\"column\" width={width}>\n {header}\n <SelectList\n items={phase.items.map((item) => ({\n id: item.id,\n label: `${theme.symbols.attention} ${sentenceCase(item.toolName)}`,\n description: summarizeArgs(argsOf(item), 40),\n meta: `${relativeTime(new Date(item.createdAt))} ${shortId(item.id)}`,\n }))}\n width={width}\n height={Math.max(3, height - 5)}\n isActive\n emptyText=\"No approvals waiting\"\n onSelect={(selected) => {\n const item = phase.items.find((i) => i.id === selected.id);\n if (item) setPhase({ name: 'card', items: phase.items, item, shownAt: Date.now(), busy: null, error: null });\n }}\n onCancel={onExit}\n />\n </Box>\n );\n case 'card':\n return (\n <Box flexDirection=\"column\" width={width}>\n {header}\n <ApprovalCard\n approvalId={phase.item.id}\n title={sentenceCase(phase.item.toolName)}\n args={argsOf(phase.item)}\n destructive={isDestructiveTool(phase.item.toolName)}\n context={`Requested over MCP ${theme.symbols.middot} ${relativeTime(new Date(phase.item.createdAt))} ${theme.symbols.middot} profile ${services.profileName}`}\n busy={phase.busy}\n error={phase.error}\n isActive={!phase.busy}\n width={width}\n onDecision={(decision) => void decide(decision)}\n />\n </Box>\n );\n case 'done':\n return (\n <Box flexDirection=\"column\" width={width}>\n {header}\n {phase.decision === 'approve' ? (\n <ResultPanel\n title={sentenceCase(phase.item.toolName)}\n result={phase.result}\n durationMs={phase.durationMs}\n note={approvalOutcomeText('approve', sentenceCase(phase.item.toolName), phase.item.id, phase.durationMs)}\n width={width}\n height={Math.max(6, height - 2)}\n interactive\n onBack={() => void load()}\n />\n ) : (\n <Box flexDirection=\"column\">\n <Text>{approvalOutcomeText(phase.decision, sentenceCase(phase.item.toolName), phase.item.id, phase.durationMs)}</Text>\n <Box marginTop={1}>\n <KeyHints width={width} hints={[{ key: 'enter', label: 'back to approvals' }]} />\n </Box>\n </Box>\n )}\n </Box>\n );\n }\n}\n", "import { Box, Text, useInput } from 'ink';\nimport { useMemo, useState } from 'react';\nimport type { CliError } from '../../core/errors';\nimport { KeyHints, type KeyHint } from '../components/KeyHints';\nimport { KeyValue } from '../components/KeyValue';\nimport { Markdown } from '../components/Markdown';\nimport { Panel } from '../components/Panel';\nimport { Table } from '../components/Table';\nimport { type ResultBody, bodyLength, describeResult } from '../result-model';\nimport { theme } from '../theme';\nimport { formatElapsed, safeJson, shortId } from '../text';\n\nexport type ResultPanelProps = {\n /** Tool label for the header (`cv list`). */\n title: string;\n result?: unknown;\n error?: CliError | null;\n durationMs: number;\n requestId?: string;\n /** One-row note above the body (e.g. an approval outcome). */\n note?: string;\n width: number;\n /** Rows available; only used when interactive (static output prints everything). */\n height: number;\n interactive: boolean;\n onBack?(): void;\n onRerun?(): void;\n onEdit?(): void;\n};\n\nfunction summaryLine(body: ResultBody): string {\n switch (body.kind) {\n case 'table':\n return [`${body.total} result${body.total === 1 ? '' : 's'}`, ...body.summary].join(` ${theme.symbols.middot} `);\n case 'kv':\n return `${body.rows.length} field${body.rows.length === 1 ? '' : 's'}`;\n case 'text':\n return 'Text result';\n default:\n return 'No output';\n }\n}\n\nfunction ErrorBody({ error }: { error: CliError }) {\n return (\n <Box flexDirection=\"column\">\n {error.hint ? <Text wrap=\"wrap\">{theme.dim(`${theme.symbols.arrowRight} ${error.hint}`)}</Text> : null}\n <Text>\n {theme.dim([error.requestId ? `request id ${error.requestId}` : null, `exit ${error.exitCode}`].filter(Boolean).join(` ${theme.symbols.middot} `))}\n </Text>\n </Box>\n );\n}\n\n/**\n * Tool result (research \u00A75.7): header box with glyph, tool, duration and\n * request id; body as table / key-value / text; `j` toggles raw JSON.\n * Non-interactive (hook `showResult`) prints the whole body once.\n */\nexport function ResultPanel(props: ResultPanelProps) {\n const { title, result, error, durationMs, requestId, note, width, height, interactive } = props;\n const body = useMemo(() => describeResult(result), [result]);\n const jsonLines = useMemo(() => safeJson(result ?? null).split('\\n'), [result]);\n const [view, setView] = useState<'human' | 'json'>('human');\n const [offset, setOffset] = useState(0);\n\n const total = view === 'json' ? jsonLines.length : bodyLength(body);\n const chrome = 3 + (note ? 1 : 0) + 3;\n const window = interactive ? Math.max(3, height - chrome - (body.kind === 'table' ? 1 : 0)) : total;\n const maxOffset = Math.max(0, total - window);\n const clamped = Math.min(offset, maxOffset);\n\n useInput(\n (input, key) => {\n if (key.escape || input === 'q') props.onBack?.();\n else if (input === 'j') {\n setView((v) => (v === 'json' ? 'human' : 'json'));\n setOffset(0);\n } else if (input === 'r') props.onRerun?.();\n else if (input === 'e') props.onEdit?.();\n else if (key.upArrow) setOffset((o) => Math.max(0, Math.min(o, maxOffset) - 1));\n else if (key.downArrow) setOffset((o) => Math.min(maxOffset, o + 1));\n else if (key.pageUp) setOffset((o) => Math.max(0, Math.min(o, maxOffset) - window));\n else if (key.pageDown) setOffset((o) => Math.min(maxOffset, o + window));\n else if (input === 'g') setOffset(0);\n else if (input === 'G') setOffset(maxOffset);\n },\n { isActive: interactive },\n );\n\n const ok = !error;\n const heading = `${ok ? theme.success(theme.symbols.success) : theme.error(theme.symbols.error)} ${theme.bold(title)}`;\n const right = [formatElapsed(durationMs), requestId ? `req ${shortId(requestId, 4, 3)}` : null].filter(Boolean).join(` ${theme.symbols.middot} `);\n const inner = Math.max(10, width - 4);\n const hints: KeyHint[] = [\n { key: 'j', label: view === 'json' ? 'table' : 'json' },\n ...(props.onRerun ? [{ key: 'r', label: 're-run' }] : []),\n ...(props.onEdit ? [{ key: 'e', label: 'edit input' }] : []),\n ...(total > window ? [{ key: theme.symbols.upDown, label: 'scroll' }] : []),\n { key: 'q', label: 'back' },\n ];\n\n return (\n <Box flexDirection=\"column\" width={width}>\n <Panel title={heading} right={right} width={width} tone={ok ? 'muted' : 'danger'}>\n <Text wrap=\"truncate-end\">{error ? theme.error(error.message) : theme.dim(summaryLine(body))}</Text>\n </Panel>\n {note ? <Text wrap=\"truncate-end\">{note}</Text> : null}\n <Box flexDirection=\"column\" paddingLeft={2} width={width}>\n {error ? (\n <ErrorBody error={error} />\n ) : view === 'json' ? (\n jsonLines.slice(clamped, clamped + window).map((line, i) => (\n <Text key={clamped + i} wrap=\"truncate-end\">\n {line}\n </Text>\n ))\n ) : body.kind === 'table' ? (\n <Table columns={body.columns} rows={body.rows} width={inner} offset={clamped} limit={window} />\n ) : body.kind === 'kv' ? (\n <KeyValue rows={body.rows.slice(clamped, clamped + window)} width={inner} />\n ) : body.kind === 'text' ? (\n interactive ? (\n body.text\n .split('\\n')\n .slice(clamped, clamped + window)\n .map((line, i) => (\n <Text key={clamped + i} wrap=\"truncate-end\">\n {line}\n </Text>\n ))\n ) : (\n <Markdown text={body.text} width={inner} />\n )\n ) : (\n <Text>{theme.dim('No output')}</Text>\n )}\n {interactive && total > window ? (\n <Text>{theme.dim(`${clamped + 1}\u2013${Math.min(total, clamped + window)} of ${total}`)}</Text>\n ) : null}\n </Box>\n {interactive ? (\n <Box marginTop={1}>\n <KeyHints width={width} hints={hints} />\n </Box>\n ) : null}\n </Box>\n );\n}\n", "import { Box, Text } from 'ink';\nimport type { ReactNode } from 'react';\nimport { theme } from '../theme';\nimport { displayWidth, truncate } from '../text';\n\nexport type PanelTone = 'muted' | 'accent' | 'success' | 'danger' | 'attention';\n\nconst BORDER = {\n round: { tl: '\u256D', tr: '\u256E', h: '\u2500' },\n classic: { tl: '+', tr: '+', h: '-' },\n} as const;\n\nfunction toneColor(tone: PanelTone): string | undefined {\n if (tone === 'accent') return theme.accentInk;\n if (tone === 'success') return 'green';\n if (tone === 'danger') return 'red';\n if (tone === 'attention') return 'yellow';\n return undefined;\n}\n\nfunction paintBorder(tone: PanelTone, text: string): string {\n if (tone === 'accent') return theme.accent(text);\n if (tone === 'success') return theme.success(text);\n if (tone === 'danger') return theme.danger(text);\n if (tone === 'attention') return theme.attention(text);\n return theme.dim(text);\n}\n\n/**\n * The top border with an inline title and right-hand meta:\n * `\u256D\u2500 \u2713 jobs search \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 0.84s \u00B7 req 7f3a\u2026c21 \u2500\u256E`. Pure, for tests.\n * `title` may carry ANSI styling; `right` is plain (painted dim).\n */\nexport function panelTopLine(width: number, title = '', right = '', tone: PanelTone = 'muted'): string {\n const chars = BORDER[theme.boxStyle];\n const inner = Math.max(0, width - 2);\n const titleText = title ? ` ${title} ` : '';\n let rightText = right ? ` ${right} ` : '';\n // The title wins: the right-hand meta goes first when both do not fit.\n if (2 + displayWidth(titleText) + displayWidth(rightText) > inner) rightText = '';\n const fittedTitle =\n titleText && 2 + displayWidth(titleText) > inner ? ` ${truncate(title, Math.max(1, inner - 4))} ` : titleText;\n const used = 1 + displayWidth(fittedTitle) + displayWidth(rightText) + 1;\n const fill = chars.h.repeat(Math.max(0, inner - used));\n return (\n paintBorder(tone, `${chars.tl}${chars.h}`) +\n fittedTitle +\n paintBorder(tone, fill) +\n (rightText ? theme.dim(rightText) : '') +\n paintBorder(tone, `${chars.h}${chars.tr}`)\n );\n}\n\n/** Rounded box (classic without Unicode) with a title in the top border. No fill. */\nexport function Panel({\n title,\n right,\n width,\n tone = 'muted',\n children,\n}: {\n title?: string;\n right?: string;\n width: number;\n tone?: PanelTone;\n children?: ReactNode;\n}) {\n const color = toneColor(tone);\n return (\n <Box flexDirection=\"column\" width={width}>\n <Text>{panelTopLine(width, title, right, tone)}</Text>\n <Box\n borderStyle={theme.boxStyle}\n borderTop={false}\n borderColor={color}\n borderDimColor={tone === 'muted'}\n paddingX={1}\n flexDirection=\"column\"\n width={width}\n >\n {children}\n </Box>\n </Box>\n );\n}\n", "/**\n * Shapes a tool result for the result panel. Column choice and cell text\n * come from `core/output.ts` so the panel matches `--output table`.\n */\nimport { findListWrapper, getPath, humanCell, pickColumns } from '../core/output';\nimport type { KeyValueRow } from './components/KeyValue';\nimport type { TableColumn } from './components/table-layout';\nimport { safeJson } from './text';\n\nexport type ResultBody =\n | { kind: 'table'; columns: TableColumn[]; rows: Array<Record<string, string>>; total: number; summary: string[] }\n | { kind: 'kv'; rows: KeyValueRow[] }\n | { kind: 'text'; text: string }\n | { kind: 'empty' };\n\ntype Row = Record<string, unknown>;\n\nfunction isRecord(value: unknown): value is Row {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isRowList(value: unknown): value is Row[] {\n return Array.isArray(value) && value.length > 0 && value.every(isRecord);\n}\n\nfunction tableBody(rows: Row[], summary: string[], now: number): ResultBody {\n const picked = pickColumns(rows);\n const columns: TableColumn[] = picked.map((c) => ({ key: c.key, header: c.label, align: c.align }));\n const cells = rows.map((row) => {\n const record: Record<string, string> = {};\n for (const column of picked) record[column.key] = humanCell(getPath(row, column.key), now);\n return record;\n });\n return { kind: 'table', columns, rows: cells, total: rows.length, summary };\n}\n\nfunction kvValue(value: unknown, now: number): string {\n if (Array.isArray(value) && value.some((v) => typeof v === 'object' && v !== null)) {\n return `${value.length} item${value.length === 1 ? '' : 's'}`;\n }\n if (isRecord(value)) {\n const json = safeJson(value, 0);\n return json.length > 100 ? `${json.slice(0, 99)}\u2026` : json;\n }\n return humanCell(value, now);\n}\n\nexport function describeResult(result: unknown, now = Date.now()): ResultBody {\n if (result === null || result === undefined || result === '') return { kind: 'empty' };\n if (typeof result === 'string') return { kind: 'text', text: result };\n if (typeof result !== 'object') return { kind: 'text', text: String(result) };\n if (isRowList(result)) return tableBody(result, [], now);\n if (Array.isArray(result)) {\n return result.length === 0 ? { kind: 'empty' } : { kind: 'text', text: result.map((v) => humanCell(v, now)).join('\\n') };\n }\n const wrapper = findListWrapper(result);\n if (wrapper) {\n const summary = Object.entries(result as Row)\n .filter(([key, value]) => key !== wrapper.key && (typeof value !== 'object' || value === null) && value !== undefined)\n .map(([key, value]) => `${key} ${humanCell(value, now)}`);\n if (wrapper.rows.length === 0) return { kind: 'kv', rows: [{ label: wrapper.key, value: 'none' }] };\n return tableBody(wrapper.rows, summary, now);\n }\n const rows = Object.entries(result as Row)\n .filter(([, value]) => value !== undefined)\n .map(([label, value]) => ({ label, value: kvValue(value, now) }));\n return rows.length ? { kind: 'kv', rows } : { kind: 'empty' };\n}\n\n/** Line count of the human body (for scrolling budgets). */\nexport function bodyLength(body: ResultBody): number {\n switch (body.kind) {\n case 'table':\n return body.rows.length;\n case 'kv':\n return body.rows.length;\n case 'text':\n return body.text.split('\\n').length;\n default:\n return 1;\n }\n}\n", "import { Box, Text, useInput } from 'ink';\nimport { memo, useMemo, useState } from 'react';\nimport type { CatalogTool } from '../../core/catalog';\nimport { describeSchema, exampleInvocation } from '../../core/schema-flags';\nimport { KeyHints } from '../components/KeyHints';\nimport { windowAround } from '../fuzzy';\nimport { fromTerminal } from '../layout';\nimport type { UiServices } from '../services';\nimport { theme } from '../theme';\nimport { displayWidth, oneLine, padEnd, truncate, wrapWords } from '../text';\nimport { ToolRun } from './ToolRun';\nimport { type BrowserRow, type BrowserState, applyBrowserAction, browserKeyAction, browserRows, initialBrowserState } from './tool-browser-model';\n\nexport type ToolBrowserProps = {\n tools: readonly CatalogTool[];\n services: UiServices;\n width: number;\n height: number;\n initialQuery?: string;\n initialGroup?: string;\n onExit(): void;\n};\n\n/** Two panes from 90 terminal columns (research \u00A75.6). */\nexport const TWO_PANE_MIN = fromTerminal(90);\n\nfunction badge(tool: CatalogTool): string {\n if (tool.kind === 'workflow') return theme.dim('workflow');\n if (tool.kind === 'agent') return theme.dim('agent');\n if (tool.annotations.destructiveHint === true) return theme.danger('write');\n return tool.readOnly ? theme.dim('read') : 'write';\n}\n\nconst ListRow = memo(function ListRow({ row, selected, width }: { row: BrowserRow; selected: boolean; width: number }) {\n const pointer = selected ? theme.accent(theme.symbols.pointer) : ' ';\n if (row.kind === 'group') {\n const glyph = row.expanded ? theme.symbols.expanded : theme.symbols.collapsed;\n const count = theme.dim(row.matched === row.total ? String(row.total) : `${row.matched} of ${row.total}`);\n const name = truncate(row.group, Math.max(4, width - 12));\n const fill = Math.max(1, width - 4 - displayWidth(name) - displayWidth(count));\n return (\n <Text wrap=\"truncate-end\">\n {pointer} {theme.dim(glyph)} {selected ? theme.accent(theme.bold(name)) : theme.bold(name)}\n {' '.repeat(fill)}\n {count}\n </Text>\n );\n }\n const label = row.tool.kind === 'workflow' ? row.tool.action : row.tool.commandPath.join(' ');\n const tag = badge(row.tool);\n const labelWidth = Math.max(4, width - 4 - displayWidth(tag) - 1);\n const text = padEnd(truncate(label, labelWidth), labelWidth);\n return (\n <Text wrap=\"truncate-end\">\n {pointer} {selected ? theme.accent(text) : text} {tag}\n </Text>\n );\n});\n\n/** Right pane (or bottom block): title, description, flags table, example. */\nexport const ToolDetail = memo(function ToolDetail({ tool, width, height }: { tool: CatalogTool; width: number; height: number }) {\n const flags = useMemo(() => describeSchema(tool.inputSchema), [tool]);\n const example = useMemo(() => exampleInvocation(tool, tool.inputSchema), [tool]);\n const flagWidth = Math.min(28, Math.max(8, ...flags.map((f) => displayWidth(`${f.flag} <${f.type}>`))));\n const descLines = Math.max(1, Math.min(4, height - flags.length - 8));\n const lines = wrapWords(tool.description, width, descLines);\n const shownFlags = flags.slice(0, Math.max(1, height - 7 - lines.length));\n return (\n <Box flexDirection=\"column\" width={width}>\n <Box width={width}>\n <Box flexGrow={1}>\n <Text wrap=\"truncate-end\">{theme.bold(tool.commandPath.join(' '))}</Text>\n </Box>\n <Text>{badge(tool)}</Text>\n </Box>\n <Text wrap=\"truncate-end\">{oneLine(tool.title)}</Text>\n <Text> </Text>\n {lines.map((line, i) => (\n <Text key={i} wrap=\"truncate-end\">\n {theme.dim(line)}\n </Text>\n ))}\n <Text> </Text>\n <Text>{theme.dim('FLAGS')}</Text>\n {flags.length === 0 ? <Text>{theme.dim(' none')}</Text> : null}\n {shownFlags.map((flag) => (\n <Text key={flag.flag} wrap=\"truncate-end\">\n {' '}\n {padEnd(truncate(`${flag.flag} <${flag.type}>`, flagWidth), flagWidth)} {flag.required ? theme.attention('required') : ' '}{' '}\n {theme.dim(flag.description)}\n </Text>\n ))}\n {flags.length > shownFlags.length ? <Text>{theme.dim(` +${flags.length - shownFlags.length} more`)}</Text> : null}\n <Text> </Text>\n <Text>{theme.dim('EXAMPLE')}</Text>\n <Text wrap=\"truncate-end\"> {example}</Text>\n </Box>\n );\n});\n\n/**\n * Tool browser (research \u00A75.6): filter box + grouped list with read/write\n * badges on the left, detail on the right (one pane below 90 columns).\n * Enter opens the form, then runs the tool and shows the result panel.\n */\nexport function ToolBrowser(props: ToolBrowserProps) {\n const { tools, services, width, height, onExit } = props;\n const [state, setState] = useState<BrowserState>(() => {\n const initial = initialBrowserState({ query: props.initialQuery, group: props.initialGroup });\n return initial.query ? applyBrowserAction(tools, { ...initial, query: '' }, { type: 'type', text: initial.query }) : initial;\n });\n const [running, setRunning] = useState<CatalogTool | null>(null);\n const rows = useMemo(() => browserRows(tools, state), [tools, state]);\n const cursor = Math.min(state.cursor, Math.max(0, rows.length - 1));\n const current = rows[cursor];\n\n useInput(\n (input, key) => {\n const outcome = browserKeyAction({ ...state, cursor }, input, key, rows);\n if (!outcome) return;\n if (outcome.type === 'exit') onExit();\n else if (outcome.type === 'open') setRunning(outcome.tool);\n else setState((s) => applyBrowserAction(tools, { ...s, cursor }, outcome));\n },\n { isActive: !running },\n );\n\n if (running) {\n return <ToolRun tool={running} services={services} width={width} height={height} start=\"form\" onExit={() => setRunning(null)} />;\n }\n\n const visibleCount = tools.filter((t) => !t.hidden).length;\n const groupCount = new Set(tools.filter((t) => !t.hidden).map((t) => t.group)).size;\n const twoPane = width >= TWO_PANE_MIN;\n const leftWidth = twoPane ? Math.min(46, Math.floor(width * 0.42)) : width;\n const rightWidth = width - leftWidth - 3;\n const listHeight = Math.max(3, height - (twoPane ? 5 : 9));\n const { start, end } = windowAround(rows.length, cursor, listHeight);\n const filter = `${theme.dim('filter')} ${theme.accent(theme.symbols.pointer)} ${state.query}${theme.accent(theme.symbols.cursor)}`;\n const title = `${theme.bold('Tools')} ${theme.dim(`${theme.symbols.middot} ${visibleCount} in ${groupCount} groups`)}`;\n const rule = theme.dim(\n twoPane ? `${theme.symbols.line.repeat(leftWidth + 1)}\u252C${theme.symbols.line.repeat(Math.max(0, rightWidth + 1))}` : theme.symbols.line.repeat(width),\n );\n const detailTool = current?.kind === 'tool' ? current.tool : null;\n\n return (\n <Box flexDirection=\"column\" width={width}>\n <Box width={width}>\n <Box flexGrow={1}>\n <Text wrap=\"truncate-end\">{title}</Text>\n </Box>\n <Text wrap=\"truncate-end\">{filter}</Text>\n </Box>\n <Text wrap=\"truncate-end\">{theme.unicode ? rule : theme.dim('-'.repeat(width))}</Text>\n <Box width={width}>\n <Box flexDirection=\"column\" width={leftWidth}>\n {rows.length === 0 ? <Text>{theme.dim(` No tools match \"${state.query}\"`)}</Text> : null}\n {rows.slice(start, end).map((row, i) => (\n <ListRow\n key={row.kind === 'group' ? `g:${row.group}` : `t:${row.tool.id}`}\n row={row}\n selected={start + i === cursor}\n width={leftWidth}\n />\n ))}\n </Box>\n {twoPane ? (\n <Box flexDirection=\"column\" marginLeft={1} paddingLeft={1} borderStyle={theme.unicode ? 'single' : 'classic'} borderTop={false} borderRight={false} borderBottom={false} borderDimColor width={rightWidth + 2}>\n {detailTool ? (\n <ToolDetail tool={detailTool} width={rightWidth} height={listHeight} />\n ) : (\n <Text>{theme.dim(current?.kind === 'group' ? `${current.group}: enter or \u2192 to open the group` : 'Select a tool')}</Text>\n )}\n </Box>\n ) : null}\n </Box>\n {!twoPane && detailTool ? (\n <Box marginTop={1}>\n <Text wrap=\"truncate-end\">{theme.dim(oneLine(detailTool.description || detailTool.title))}</Text>\n </Box>\n ) : null}\n <Text wrap=\"truncate-end\">{theme.dim(theme.symbols.line.repeat(width))}</Text>\n <KeyHints\n width={width}\n hints={[\n { key: theme.symbols.upDown, label: 'move' },\n { key: theme.symbols.leftRight, label: 'fold' },\n { key: 'enter', label: 'run' },\n { key: 'type', label: 'filter' },\n { key: 'esc', label: state.query ? 'clear' : 'back' },\n ]}\n />\n </Box>\n );\n}\n", "import { Box, Text, useInput } from 'ink';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type { ApprovalChoice } from '../../core/chat-model';\nimport { isDestructiveTool } from '../../core/chat-model';\nimport type { CatalogTool } from '../../core/catalog';\nimport { type CliError, toCliError } from '../../core/errors';\nimport type { ApprovalInfo } from '../../core/mcp';\nimport { autoFilledProperties } from '../../core/schema-flags';\nimport { ApprovalCard } from '../components/ApprovalCard';\nimport { approvalOutcomeText } from '../components/approval-model';\nimport { Form } from '../components/Form';\nimport { createFormState } from '../components/form-model';\nimport { KeyHints } from '../components/KeyHints';\nimport { Working } from '../components/Spinner';\nimport type { UiServices } from '../services';\nimport { theme } from '../theme';\nimport { oneLine, sentenceCase, shortId } from '../text';\nimport { ResultPanel } from './ResultPanel';\n\ntype Input = Record<string, unknown>;\n\ntype Phase =\n | { name: 'form'; input: Input }\n | { name: 'running'; input: Input; startedAt: number }\n | { name: 'approval'; input: Input; approval: ApprovalInfo; requestedAt: number; busy: ApprovalChoice | null; error: string | null }\n | { name: 'result'; input: Input; result: unknown; durationMs: number; requestId?: string; note?: string }\n | { name: 'error'; input: Input; error: CliError; durationMs: number }\n | { name: 'left'; input: Input; approval: ApprovalInfo };\n\nexport type ToolRunProps = {\n tool: CatalogTool;\n services: UiServices;\n width: number;\n height: number;\n initialInput?: Input;\n /** Open the form first, or run straight away with `initialInput`. */\n start: 'form' | 'run';\n onExit(): void;\n};\n\nexport function toolLabel(tool: CatalogTool): string {\n return tool.commandPath.join(' ') || tool.id;\n}\n\n/** Form \u2192 run \u2192 (approval) \u2192 result, with re-run and edit from the result. */\nexport function ToolRun({ tool, services, width, height, initialInput = {}, start, onExit }: ToolRunProps) {\n const [phase, setPhase] = useState<Phase>({ name: 'form', input: initialInput });\n const mounted = useRef(true);\n const controller = useRef<AbortController | null>(null);\n useEffect(\n () => () => {\n mounted.current = false;\n controller.current?.abort();\n },\n [],\n );\n\n const withDefaults = useCallback(\n (input: Input): Input =>\n autoFilledProperties(tool, tool.inputSchema).includes('userId') && input.userId === undefined && services.account.userId\n ? { ...input, userId: services.account.userId }\n : input,\n [tool, services.account.userId],\n );\n\n const run = useCallback(\n async (input: Input) => {\n const startedAt = Date.now();\n controller.current?.abort();\n const abort = new AbortController();\n controller.current = abort;\n setPhase({ name: 'running', input, startedAt });\n try {\n const outcome = await services.callTool(tool.id, withDefaults(input), { signal: abort.signal });\n if (!mounted.current || abort.signal.aborted) return;\n if (!outcome.ok) setPhase({ name: 'error', input, error: outcome.error, durationMs: outcome.durationMs });\n else if (outcome.approval) {\n setPhase(\n services.account.hasSession\n ? { name: 'approval', input, approval: outcome.approval, requestedAt: Date.now(), busy: null, error: null }\n : { name: 'left', input, approval: outcome.approval },\n );\n } else setPhase({ name: 'result', input, result: outcome.result, durationMs: outcome.durationMs, requestId: outcome.requestId });\n } catch (error) {\n if (!mounted.current || abort.signal.aborted) return;\n setPhase({ name: 'error', input, error: toCliError(error), durationMs: Date.now() - startedAt });\n }\n },\n [services, tool.id, withDefaults],\n );\n\n // Run once on mount when asked to (later runs come from the form or `r`).\n const started = useRef(false);\n useEffect(() => {\n if (started.current || start !== 'run') return;\n started.current = true;\n void run(initialInput);\n }, [start, run, initialInput]);\n\n const decide = useCallback(\n async (decision: ApprovalChoice) => {\n if (phase.name !== 'approval') return;\n const { approval, input, requestedAt } = phase;\n const title = sentenceCase(approval.toolName || tool.title);\n if (decision === 'leave') {\n setPhase({ name: 'left', input, approval });\n return;\n }\n setPhase({ ...phase, busy: decision, error: null });\n try {\n const data = await services.decideApproval(approval.approvalId, decision);\n if (!mounted.current) return;\n setPhase({\n name: 'result',\n input,\n result: decision === 'approve' ? (data.mcp?.result ?? data.assistant?.text ?? null) : null,\n durationMs: Date.now() - requestedAt,\n note: approvalOutcomeText(decision, title, approval.approvalId, Date.now() - requestedAt),\n });\n } catch (error) {\n if (!mounted.current) return;\n setPhase({ ...phase, busy: null, error: toCliError(error).message });\n }\n },\n [phase, services, tool.title],\n );\n\n useInput(\n (input, key) => {\n if (phase.name === 'running' && key.escape) {\n controller.current?.abort();\n setPhase({ name: 'form', input: phase.input });\n } else if (phase.name === 'error' || phase.name === 'left') {\n if (key.escape || input === 'q') onExit();\n else if (input === 'r') void run(phase.input);\n else if (input === 'e') setPhase({ name: 'form', input: phase.input });\n }\n },\n { isActive: phase.name === 'running' || phase.name === 'error' || phase.name === 'left' },\n );\n\n const label = toolLabel(tool);\n const header = (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text wrap=\"truncate-end\">\n {theme.bold(label)} {theme.dim(`${theme.symbols.middot} ${oneLine(tool.title)}`)}\n </Text>\n {tool.description ? <Text wrap=\"truncate-end\">{theme.dim(oneLine(tool.description))}</Text> : null}\n </Box>\n );\n\n switch (phase.name) {\n case 'form':\n return (\n <Box flexDirection=\"column\" width={width}>\n {header}\n <Form\n initial={createFormState(tool.inputSchema, phase.input, { skip: autoFilledProperties(tool, tool.inputSchema) })}\n width={width}\n height={Math.max(3, height - 6)}\n isActive\n onSubmit={(input) => void run(input)}\n onCancel={onExit}\n />\n </Box>\n );\n case 'running':\n return (\n <Box flexDirection=\"column\" width={width}>\n {header}\n <Working label={`Running ${label}${theme.symbols.ellipsis}`} since={phase.startedAt} />\n <Box marginTop={1}>\n <KeyHints width={width} hints={[{ key: 'esc', label: 'cancel' }]} />\n </Box>\n </Box>\n );\n case 'approval':\n return (\n <Box flexDirection=\"column\" width={width}>\n {header}\n <ApprovalCard\n approvalId={phase.approval.approvalId}\n title={sentenceCase(phase.approval.toolName || tool.title)}\n message={phase.approval.message}\n args={withDefaults(phase.input)}\n destructive={isDestructiveTool(phase.approval.toolName || tool.id)}\n context={`Writes to your account ${theme.symbols.middot} profile ${services.profileName}`}\n busy={phase.busy}\n error={phase.error}\n isActive={!phase.busy}\n width={width}\n onDecision={(decision) => void decide(decision)}\n />\n </Box>\n );\n case 'result':\n return (\n <ResultPanel\n title={label}\n result={phase.result}\n durationMs={phase.durationMs}\n requestId={phase.requestId}\n note={phase.note}\n width={width}\n height={height}\n interactive\n onBack={onExit}\n onRerun={() => void run(phase.input)}\n onEdit={() => setPhase({ name: 'form', input: phase.input })}\n />\n );\n case 'error':\n return (\n <Box flexDirection=\"column\" width={width}>\n <ResultPanel title={label} error={phase.error} durationMs={phase.durationMs} width={width} height={height} interactive={false} />\n <Box marginTop={1}>\n <KeyHints width={width} hints={[{ key: 'r', label: 'retry' }, { key: 'e', label: 'edit input' }, { key: 'q', label: 'back' }]} />\n </Box>\n </Box>\n );\n case 'left':\n return (\n <Box flexDirection=\"column\" width={width}>\n {header}\n <Text>{approvalOutcomeText('leave', sentenceCase(phase.approval.toolName || tool.title), phase.approval.approvalId)}</Text>\n <Text wrap=\"wrap\">\n {theme.dim(\n services.account.hasSession\n ? 'Decide later in the Tabbio app or with `tabbio approvals`.'\n : `Approve it in the Tabbio app, or run \\`tabbio approvals wait ${shortId(phase.approval.approvalId, 12, 4)}\\`.`,\n )}\n </Text>\n <Box marginTop={1}>\n <KeyHints width={width} hints={[{ key: 'r', label: 'run again' }, { key: 'e', label: 'edit input' }, { key: 'q', label: 'back' }]} />\n </Box>\n </Box>\n );\n }\n}\n", "/**\n * Tool browser state (pure, for tests): filter-as-you-type across id, title\n * and description with per-group match counts; groups fold with \u2190\u2192.\n */\nimport type { Key } from 'ink';\nimport type { CatalogTool } from '../../core/catalog';\nimport { rankMatch } from '../fuzzy';\n\nexport type BrowserRow =\n | { kind: 'group'; group: string; matched: number; total: number; expanded: boolean }\n | { kind: 'tool'; tool: CatalogTool; group: string };\n\nexport type BrowserState = {\n query: string;\n cursor: number;\n /** Explicit fold state per group; unset = collapsed without a query, expanded with one. */\n expanded: Record<string, boolean>;\n};\n\nexport type BrowserAction =\n | { type: 'type'; text: string }\n | { type: 'backspace' }\n | { type: 'clear' }\n | { type: 'move'; delta: number }\n | { type: 'fold'; expand: boolean };\n\nexport type BrowserOutcome = BrowserAction | { type: 'open'; tool: CatalogTool } | { type: 'exit' } | null;\n\nexport function initialBrowserState(opts: { query?: string; group?: string } = {}): BrowserState {\n return { query: opts.query ?? '', cursor: 0, expanded: opts.group ? { [opts.group]: true } : {} };\n}\n\n/**\n * Rank of a tool for a filter (lower is better, null = no match):\n * 0 exact group name / command path / id \u00B7 1 prefix of the group, action or\n * path \u00B7 2 word-boundary \u00B7 3 substring \u00B7 4 subsequence fuzz \u00B7 5 description.\n * Typing `cv` therefore lists the `cv` group before `candidate view`.\n */\nexport function toolRank(tool: CatalogTool, query: string): number | null {\n const q = query.trim().toLowerCase();\n if (!q) return 0;\n const group = tool.group.toLowerCase();\n const path = tool.commandPath.join(' ').toLowerCase();\n const id = tool.id.toLowerCase();\n if (q === group || q === path || q === id) return 0;\n if (group.startsWith(q) || tool.action.toLowerCase().startsWith(q) || path.startsWith(q) || id.startsWith(q)) return 1;\n const ranks = [rankMatch(q, path), rankMatch(q, id), rankMatch(q, tool.title, tool.description)].filter(\n (r): r is number => r !== null,\n );\n return ranks.length ? Math.max(2, Math.min(...ranks)) : null;\n}\n\n/** Rows to display: groups (sorted) and, for expanded groups, their matching tools. */\nexport function browserRows(tools: readonly CatalogTool[], state: BrowserState): BrowserRow[] {\n const visible = tools.filter((t) => !t.hidden);\n const groups = new Map<string, { total: number; hits: Array<{ tool: CatalogTool; rank: number }> }>();\n for (const tool of visible) {\n const entry = groups.get(tool.group) ?? { total: 0, hits: [] };\n entry.total += 1;\n const rank = toolRank(tool, state.query);\n if (rank !== null) entry.hits.push({ tool, rank });\n groups.set(tool.group, entry);\n }\n const filtering = state.query.trim().length > 0;\n const rows: BrowserRow[] = [];\n // While filtering, groups follow their best match (exact group name first); otherwise A\u2013Z.\n const best = (group: string) => Math.min(...(groups.get(group)?.hits.map((h) => h.rank) ?? [Infinity]));\n const names = [...groups.keys()].sort((a, b) => (filtering ? best(a) - best(b) : 0) || a.localeCompare(b));\n for (const group of names) {\n const entry = groups.get(group) as { total: number; hits: Array<{ tool: CatalogTool; rank: number }> };\n if (filtering && entry.hits.length === 0) continue;\n const expanded = state.expanded[group] ?? filtering;\n rows.push({ kind: 'group', group, matched: entry.hits.length, total: entry.total, expanded });\n if (!expanded) continue;\n const hits = filtering ? [...entry.hits].sort((a, b) => a.rank - b.rank) : entry.hits;\n for (const hit of hits) rows.push({ kind: 'tool', tool: hit.tool, group });\n }\n return rows;\n}\n\nexport function browserReducer(state: BrowserState, action: BrowserAction, rows: readonly BrowserRow[]): BrowserState {\n switch (action.type) {\n case 'type':\n return { ...state, query: state.query + action.text, cursor: 0, expanded: {} };\n case 'backspace':\n return { ...state, query: [...state.query].slice(0, -1).join(''), cursor: 0, expanded: {} };\n case 'clear':\n return { ...state, query: '', cursor: 0, expanded: {} };\n case 'move':\n return { ...state, cursor: Math.max(0, Math.min(rows.length - 1, state.cursor + action.delta)) };\n case 'fold': {\n const row = rows[state.cursor];\n if (!row) return state;\n const group = row.group;\n const expanded = { ...state.expanded, [group]: action.expand };\n // Collapsing from a tool row moves the cursor to its group row.\n const groupIndex = rows.findIndex((r) => r.kind === 'group' && r.group === group);\n return { ...state, expanded, cursor: !action.expand && groupIndex >= 0 ? groupIndex : state.cursor };\n }\n default:\n return state;\n }\n}\n\n/**\n * Reducer plus cursor snapping: after the filter changes, the cursor lands on\n * the best-matching tool so Enter runs it (instead of folding its group).\n */\nexport function applyBrowserAction(tools: readonly CatalogTool[], state: BrowserState, action: BrowserAction): BrowserState {\n const next = browserReducer(state, action, browserRows(tools, state));\n if (action.type !== 'type' && action.type !== 'backspace' && action.type !== 'clear') return next;\n if (!next.query) return next;\n const index = browserRows(tools, next).findIndex((row) => row.kind === 'tool');\n return index >= 0 ? { ...next, cursor: index } : next;\n}\n\n/**\n * Keys: typing filters, \u2191\u2193 move, \u2190\u2192 fold, Enter opens a tool or toggles a\n * group, Esc clears the filter then leaves, `q` leaves when the filter is empty.\n */\nexport function browserKeyAction(state: BrowserState, input: string, key: Partial<Key>, rows: readonly BrowserRow[]): BrowserOutcome {\n const row = rows[Math.min(state.cursor, rows.length - 1)];\n if (key.upArrow) return { type: 'move', delta: -1 };\n if (key.downArrow) return { type: 'move', delta: 1 };\n if (key.pageUp) return { type: 'move', delta: -10 };\n if (key.pageDown) return { type: 'move', delta: 10 };\n if (key.leftArrow) return { type: 'fold', expand: false };\n if (key.rightArrow) return { type: 'fold', expand: true };\n if (key.return) {\n if (!row) return null;\n if (row.kind === 'tool') return { type: 'open', tool: row.tool };\n return { type: 'fold', expand: !row.expanded };\n }\n if (key.escape) return state.query ? { type: 'clear' } : { type: 'exit' };\n if (key.backspace || key.delete) return { type: 'backspace' };\n if (key.ctrl && input === 'u') return { type: 'clear' };\n if (key.ctrl || key.meta || key.tab) return null;\n if (input === 'q' && !state.query) return { type: 'exit' };\n return input ? { type: 'type', text: input } : null;\n}\n", "import type { PaletteCommand } from '../Palette';\n\nexport type HomeCommand = 'chat' | 'tools' | 'approvals' | 'status' | 'help' | 'exit';\n\nexport type HomeData = {\n plan: string | null;\n pendingApprovals: number | null;\n recent: Array<{ id: string; title: string; when: string }> | null;\n error?: string;\n};\n\nexport const emptyHomeData: HomeData = { plan: null, pendingApprovals: null, recent: null };\n\nexport function homeCommands(data: HomeData, toolCount: number | null): Array<PaletteCommand & { name: HomeCommand }> {\n const waiting = data.pendingApprovals;\n return [\n { name: 'chat', description: 'Chat with Tabbio' },\n { name: 'tools', description: toolCount ? `Browse ${toolCount} tools` : 'Browse every tool' },\n { name: 'approvals', description: waiting === null ? 'Approve or reject actions' : waiting > 0 ? `${waiting} waiting` : 'None waiting' },\n { name: 'status', description: 'Account, tokens, catalog' },\n { name: 'help', description: 'Keys and commands' },\n { name: 'exit', description: 'Quit tabbio' },\n ];\n}\n\nexport function isHomeCommand(name: string): name is HomeCommand {\n return ['chat', 'tools', 'approvals', 'status', 'help', 'exit', 'quit'].includes(name);\n}\n\nexport const HOME_HELP_ROWS: ReadonlyArray<[string, string]> = [\n ['type + enter', 'Start a chat with that message'],\n ['/', 'Command palette (chat, tools, approvals, status, help, exit)'],\n ['tab', 'Jump to recent chats'],\n ['esc', 'Close, go back, or interrupt'],\n ['ctrl+j', 'New line in the composer (or \\\\ then enter)'],\n ['\u2191 \u2193', 'Composer history, or move in lists'],\n ['ctrl+c \u00D72', 'Quit'],\n];\n", "import { Box, type Key, Text } from 'ink';\nimport { memo } from 'react';\nimport type { EditorAction, EditorState } from '../../components/editor-model';\nimport { Header, WIDE_HEADER_MIN, capitalize } from '../../components/Header';\nimport { KeyHints } from '../../components/KeyHints';\nimport { SelectList } from '../../components/SelectList';\nimport { TextInput } from '../../components/TextInput';\nimport { fromTerminal } from '../../layout';\nimport type { UiServices } from '../../services';\nimport { theme } from '../../theme';\nimport { displayWidth, padEnd, truncate } from '../../text';\nimport { Palette, type PaletteCommand } from '../Palette';\nimport type { HomeData } from './home-model';\n\n/** START and RECENT side by side from 100 terminal columns; stacked below. */\nexport const TWO_COLUMN_MIN = fromTerminal(100);\n\nexport type HomeViewProps = {\n services: UiServices;\n data: HomeData;\n commands: PaletteCommand[];\n matches: PaletteCommand[];\n paletteIndex: number;\n editor: EditorState;\n dispatchEditor(action: EditorAction): void;\n onSubmit(value: string): void;\n onComposerKey(input: string, key: Key): boolean;\n focus: 'composer' | 'recent';\n onRecentSelect(id: string, title: string): void;\n onRecentCancel(): void;\n notice: string | null;\n width: number;\n height: number;\n};\n\nfunction AccountLine({ services, plan, width }: { services: UiServices; plan: string | null; width: number }) {\n const { account } = services;\n const sep = theme.dim(` ${theme.symbols.middot} `);\n const who = account.signedIn\n ? [account.name, account.email, plan ? capitalize(plan) : null].filter(Boolean).join(sep) || theme.dim('personal MCP token')\n : theme.attention('Not signed in');\n const left = `${account.signedIn ? theme.success(theme.symbols.dot) : theme.attention(theme.symbols.dot)} ${who}`;\n const right = theme.dim(`profile ${services.profileName} ${theme.symbols.middot} ${services.apiHost}`);\n const fill = width - displayWidth(left) - displayWidth(right);\n return <Text wrap=\"truncate-end\">{fill >= 2 ? `${left}${' '.repeat(fill)}${right}` : left}</Text>;\n}\n\nconst QuickActions = memo(function QuickActions({ commands, width, pending }: { commands: PaletteCommand[]; width: number; pending: number | null }) {\n const nameWidth = 13;\n return (\n <Box flexDirection=\"column\" width={width}>\n <Text>{theme.dim('START')}</Text>\n {commands\n .filter((c) => c.name !== 'exit')\n .map((c) => (\n <Text key={c.name} wrap=\"truncate-end\">\n {theme.accent(padEnd(`/${c.name}`, nameWidth))}\n {truncate(c.description, Math.max(4, width - nameWidth - 3))}\n {c.name === 'approvals' && pending ? ` ${theme.attention(theme.symbols.dot)}` : ''}\n </Text>\n ))}\n </Box>\n );\n});\n\nfunction Recent(props: Pick<HomeViewProps, 'data' | 'focus' | 'onRecentSelect' | 'onRecentCancel' | 'services'> & { width: number; rows: number }) {\n const { data, focus, width, rows, services } = props;\n const title = <Text>{theme.dim('RECENT CHATS')}</Text>;\n if (!services.account.hasSession) {\n return (\n <Box flexDirection=\"column\" width={width}>\n {title}\n <Text wrap=\"truncate-end\">{theme.dim('Sign in with `tabbio login` to see your chats')}</Text>\n </Box>\n );\n }\n if (data.recent === null) {\n return (\n <Box flexDirection=\"column\" width={width}>\n {title}\n <Text>{theme.dim(data.error ? `Could not load: ${data.error}` : `Loading${theme.symbols.ellipsis}`)}</Text>\n </Box>\n );\n }\n return (\n <Box flexDirection=\"column\" width={width}>\n {title}\n {data.recent.length === 0 ? <Text>{theme.dim('No chats yet. Type below to start one.')}</Text> : null}\n {data.recent.length > 0 ? (\n <SelectList\n items={data.recent.map((r) => ({ id: r.id, label: r.title, meta: r.when }))}\n width={width}\n height={rows}\n isActive={focus === 'recent'}\n filterable={false}\n showHints={false}\n onSelect={(item) => props.onRecentSelect(item.id, item.label)}\n onCancel={props.onRecentCancel}\n />\n ) : null}\n </Box>\n );\n}\n\n/** Composer-first home (research \u00A75.5): header, account, START + RECENT, composer, hints. */\nexport function HomeView(props: HomeViewProps) {\n const { services, data, commands, matches, width, height } = props;\n const wide = width >= TWO_COLUMN_MIN;\n const tall = height >= 26;\n const showWordmark = width >= WIDE_HEADER_MIN && tall;\n const showAccount = width >= WIDE_HEADER_MIN;\n const recentRows = wide ? 5 : height >= 30 ? 3 : 0;\n const colWidth = wide ? Math.floor((width - 4) / 2) : width;\n const account = { name: services.account.name, email: services.account.email, plan: data.plan };\n\n return (\n <Box flexDirection=\"column\" width={width}>\n {showWordmark ? (\n <Header version={services.version} profile={services.profileName} width={width} account={account} />\n ) : (\n <Header version={services.version} profile={services.profileName} width={Math.min(width, WIDE_HEADER_MIN - 1)} account={account} />\n )}\n {showAccount ? (\n <Box marginTop={1}>\n <AccountLine services={services} plan={data.plan} width={width} />\n </Box>\n ) : null}\n <Box marginTop={1} flexDirection={wide ? 'row' : 'column'} width={width}>\n <QuickActions commands={commands} width={colWidth} pending={data.pendingApprovals} />\n {recentRows > 0 ? (\n <Box marginLeft={wide ? 4 : 0} marginTop={wide ? 0 : 1}>\n <Recent {...props} width={colWidth} rows={recentRows} />\n </Box>\n ) : null}\n </Box>\n {matches.length > 0 ? (\n <Box marginTop={1}>\n <Palette commands={matches} selected={props.paletteIndex} width={width} />\n </Box>\n ) : null}\n <Box marginTop={1}>\n <TextInput\n editor={props.editor}\n dispatch={props.dispatchEditor}\n onSubmit={props.onSubmit}\n onKey={props.onComposerKey}\n isActive={props.focus === 'composer'}\n width={width}\n placeholder={width < WIDE_HEADER_MIN ? 'Ask Tabbio anything, or / for commands' : 'Ask Tabbio anything, or type / for commands'}\n boxed\n />\n </Box>\n {props.notice ? <Text wrap=\"truncate-end\">{props.notice}</Text> : null}\n <KeyHints\n width={width}\n hints={[\n { key: 'enter', label: 'send' },\n { key: '/', label: 'commands' },\n ...(services.account.hasSession && recentRows > 0 ? [{ key: 'tab', label: 'recent chats' }] : []),\n { key: 'ctrl+c', label: 'quit' },\n ]}\n />\n </Box>\n );\n}\n", "import { Box, Text } from 'ink';\nimport { memo } from 'react';\nimport { fromTerminal } from '../layout';\nimport { theme } from '../theme';\nimport { WORDMARK_WIDTH, Wordmark } from './Wordmark';\n\nexport type HeaderAccount = { name?: string | null; email?: string | null; plan?: string | null };\n\nexport type HeaderProps = {\n version: string;\n profile: string;\n width: number;\n account?: HeaderAccount | null;\n tagline?: string;\n};\n\n/** Wordmark + version from 60 terminal columns with Unicode; otherwise one line. */\nexport const WIDE_HEADER_MIN = fromTerminal(60);\n\nexport function oneLineHeader({ version, profile, account }: Omit<HeaderProps, 'width'>): string {\n const sep = theme.dim(` ${theme.symbols.middot} `);\n const who = account?.name || account?.email;\n const parts = [\n theme.accentBold(`tabbio ${version}`),\n who ?? null,\n account?.plan ? capitalize(account.plan) : null,\n theme.dim(profile),\n ].filter((p): p is string => Boolean(p));\n return parts.join(sep);\n}\n\nexport function capitalize(value: string): string {\n return value ? value.charAt(0).toUpperCase() + value.slice(1) : value;\n}\n\nexport const Header = memo(function Header(props: HeaderProps) {\n const { version, width, tagline = 'Your career, from the terminal' } = props;\n if (width < WIDE_HEADER_MIN || !theme.unicode) {\n return <Text wrap=\"truncate-end\">{oneLineHeader(props)}</Text>;\n }\n const showTagline = width >= WORDMARK_WIDTH + 3 + tagline.length;\n return (\n <Box>\n <Wordmark />\n <Box flexDirection=\"column\" marginLeft={3}>\n <Text> </Text>\n <Text>{theme.bold(`tabbio ${version}`)}</Text>\n <Text wrap=\"truncate-end\">{showTagline ? theme.dim(tagline) : ''}</Text>\n </Box>\n </Box>\n );\n});\n", "import { Box, Text } from 'ink';\nimport Gradient from 'ink-gradient';\nimport { theme } from '../theme';\n\n/** Hand-drawn half-block wordmark (research \u00A75.4), 25 columns \u00D7 3 rows. */\nexport const WORDMARK_ROWS = [\n ' \u2588 \u2588 \u2588 \u2580',\n '\u2580\u2588\u2580 \u2584\u2580\u2580\u2588 \u2588\u2580\u2580\u2584 \u2588\u2580\u2580\u2584 \u2588 \u2584\u2580\u2580\u2584',\n ' \u2588\u2584 \u2580\u2584\u2584\u2588 \u2588\u2584\u2584\u2580 \u2588\u2584\u2584\u2580 \u2588 \u2580\u2584\u2584\u2580',\n] as const;\nexport const WORDMARK_WIDTH = 25;\n\n/**\n * The wordmark needs Unicode; below that the caller shows the one-line\n * variant. Gradient only on truecolor with a known background, solid accent\n * otherwise (hex values come from theme.ts).\n */\nexport function Wordmark() {\n if (!theme.unicode) return <Text>{theme.accentBold('tabbio')}</Text>;\n const rows = WORDMARK_ROWS.map((row) => row.padEnd(WORDMARK_WIDTH));\n const gradient = theme.wordmarkGradient;\n if (gradient) {\n return (\n <Gradient colors={[...gradient]}>\n <Text>{rows.join('\\n')}</Text>\n </Gradient>\n );\n }\n return (\n <Box flexDirection=\"column\">\n {rows.map((row, i) => (\n <Text key={i}>{theme.accent(row)}</Text>\n ))}\n </Box>\n );\n}\n", "/**\n * Everything the screens need from the outside world, behind one seam so\n * tests and `scripts/ui-smoke.mjs` can render every screen with fakes.\n * `createUiServices(ctx)` is the real implementation.\n */\nimport type { AgentModelsResponse, AgentThreadSummary, SubscriptionStateResult } from '@tabbio/types';\nimport { type ArtifactSummary, getArtifact, previewUrl } from '../core/artifacts';\nimport { type McpPendingApproval, getMcpAccessState } from '../core/auth';\nimport {\n type CapabilityAvailability,\n type ChatCapabilities,\n loadCapabilityPrefs,\n saveCapabilityPrefs,\n} from '../core/capabilities';\nimport { previewVariantFor } from '../core/chat-artifacts';\nimport type { CatalogTool } from '../core/catalog';\nimport {\n type AgentStreamEvent,\n type ApprovalDecisionResult,\n type ChatRequest,\n type ChatScope,\n type ThreadMessages,\n confirmApproval,\n getThreadMessages,\n listModels,\n listThreads,\n rejectApproval,\n streamChat,\n} from '../core/chat';\nimport type { CommandContext } from '../core/context';\nimport { type CallToolOptions, type ToolCallResult, readCachedCatalog } from '../core/mcp';\nimport { CLI_VERSION } from '../core/version';\nimport { supportsHyperlinks } from './hyperlink';\n\nexport type UiAccount = {\n name?: string | null;\n email?: string | null;\n signedIn: boolean;\n /** An app session (JWT): chat, approvals and plan need it. */\n hasSession: boolean;\n /** Filled into workflow `userId` inputs, like `tabbio run`. */\n userId?: string;\n};\n\nexport type TimedToolResult = ToolCallResult & { durationMs: number; requestId?: string };\n\nexport type StatusRow = { label: string; value: string };\n\nexport type UiServices = {\n version: string;\n profileName: string;\n apiHost: string;\n account: UiAccount;\n /** Tool count from the on-disk catalog cache (no network), if any. */\n cachedToolCount: number | null;\n loadPlan(): Promise<string | null>;\n loadPendingApprovals(): Promise<McpPendingApproval[]>;\n listThreads(scope: ChatScope): Promise<AgentThreadSummary[]>;\n listModels(scope: ChatScope): Promise<AgentModelsResponse>;\n getThreadMessages(threadId: string, scope: ChatScope): Promise<ThreadMessages>;\n streamChat(request: ChatRequest, signal: AbortSignal): AsyncIterable<AgentStreamEvent>;\n decideApproval(approvalId: string, decision: 'approve' | 'reject', scope?: Partial<ChatScope>): Promise<ApprovalDecisionResult>;\n listTools(opts?: { refresh?: boolean }): Promise<CatalogTool[]>;\n callTool(toolId: string, input: Record<string, unknown>, opts?: CallToolOptions): Promise<TimedToolResult>;\n loadStatus(): Promise<StatusRow[]>;\n // PR #512 (optional so older fakes and scripts keep working).\n /** The profile's saved Research / Image / Result choice. */\n capabilityPrefs?: ChatCapabilities;\n saveCapabilityPrefs?(capabilities: ChatCapabilities): void;\n /** `GET /api/agent/capabilities`: what this account may use. */\n loadCapabilities?(): Promise<CapabilityAvailability>;\n /** `GET /api/artifacts/:id` (status polling for chat cards). */\n getArtifact?(artifactId: string): Promise<ArtifactSummary>;\n /** A 15-minute preview URL for an OSC 8 link on a ready card. */\n artifactPreviewUrl?(artifactId: string, kind: string): Promise<string>;\n /** The terminal shows OSC 8 hyperlinks. */\n hyperlinks?: boolean;\n};\n\nfunction hostOf(url: string): string {\n try {\n return new URL(url).host;\n } catch {\n return url;\n }\n}\n\nexport function createUiServices(ctx: CommandContext): UiServices {\n const creds = ctx.api.credentials ?? ctx.credentials;\n const cached = readCachedCatalog(ctx.profile, creds);\n return {\n version: CLI_VERSION,\n profileName: ctx.profile.name,\n apiHost: hostOf(ctx.profile.apiUrl),\n account: {\n name: creds?.user?.name ?? null,\n email: creds?.user?.email ?? null,\n signedIn: Boolean(creds?.accessToken || creds?.mcpToken),\n hasSession: Boolean(creds?.accessToken),\n userId: creds?.user?.id,\n },\n cachedToolCount: cached ? cached.tools.filter((t) => !t.hidden).length : null,\n async loadPlan() {\n if (!creds?.accessToken) return null;\n const state = await ctx.api.json<SubscriptionStateResult>('/api/subscription/state');\n return state?.snapshot?.tier ?? null;\n },\n async loadPendingApprovals() {\n const state = await getMcpAccessState(ctx.api);\n return state?.pendingApprovals ?? [];\n },\n listThreads: (scope) => listThreads(ctx, scope),\n listModels: (scope) => listModels(ctx, scope),\n getThreadMessages: (threadId, scope) => getThreadMessages(ctx, threadId, scope),\n streamChat: (request, signal) => streamChat(ctx, request, { signal }),\n decideApproval: (approvalId, decision, scope) =>\n decision === 'approve' ? confirmApproval(ctx, approvalId, scope) : rejectApproval(ctx, approvalId, scope),\n async listTools(opts) {\n const session = await ctx.mcp();\n return session.listTools(opts);\n },\n async callTool(toolId, input, opts) {\n const session = await ctx.mcp();\n const started = Date.now();\n const result = await session.callTool(toolId, input, opts);\n return { ...result, durationMs: Date.now() - started };\n },\n capabilityPrefs: loadCapabilityPrefs(ctx.profile.name),\n saveCapabilityPrefs: (capabilities) => saveCapabilityPrefs(ctx.profile.name, capabilities),\n loadCapabilities: () => ctx.api.json<CapabilityAvailability>('/api/agent/capabilities'),\n getArtifact: (artifactId) => getArtifact(ctx.api, artifactId),\n async artifactPreviewUrl(artifactId, kind) {\n return (await previewUrl(ctx.api, artifactId, { variant: previewVariantFor(kind) })).url;\n },\n hyperlinks: supportsHyperlinks(),\n async loadStatus() {\n const { collectStatus } = await import('../commands/status');\n const report = await collectStatus(ctx);\n const who = report.user ? (report.user.name ? `${report.user.name} <${report.user.email}>` : report.user.email) : 'not signed in';\n const rows: Array<[string, string | null | undefined]> = [\n ['Profile', `${report.profile.name} (${report.profile.source})`],\n ['API', report.profile.apiUrl],\n ['Account', who],\n ['Plan', report.plan],\n ['Session', report.session ? `${report.session.token}${report.session.refreshable ? ' \u00B7 auto-refresh' : ''}` : null],\n ['Tools via', report.mcp?.label],\n ['Approvals', report.pendingApprovals === null ? null : `${report.pendingApprovals} pending`],\n ['Catalog', report.catalog ? `${report.catalog.tools} tools${report.catalog.fresh ? '' : ' (stale)'}` : null],\n ...report.problems.map((p): [string, string] => ['Problem', p]),\n ];\n return rows.filter((r): r is [string, string] => Boolean(r[1])).map(([label, value]) => ({ label, value }));\n },\n };\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,SAAS,OAAAA,OAAK,UAAAC,SAAQ,QAAAC,cAAY;AAClC,SAAyB,aAAAC,kBAAiB;;;ACP1C,SAAS,OAAAC,MAAK,QAAAC,OAAM,gBAAgB;AACpC,SAAS,WAAW,gBAAgB;;;ACDpC,SAAS,YAAY;AACrB,SAAS,YAAY;AAqBZ;AAdF,SAAS,YAAY,OAAmC;AAC7D,QAAM,MAAM,MAAM,IAAI,IAAI,MAAM,QAAQ,MAAM,GAAG;AACjD,SAAO,MAAM,IAAI,CAAC,MAAM,GAAG,MAAM,OAAO,EAAE,GAAG,CAAC,IAAI,MAAM,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,GAAG;AAClF;AAGO,SAAS,SAAS,OAA2B,OAA0B;AAC5E,QAAM,MAAM,CAAC,GAAG,KAAK;AACrB,SAAO,IAAI,SAAS,KAAK,aAAa,YAAY,GAAG,CAAC,IAAI,MAAO,KAAI,IAAI;AACzE,SAAO;AACT;AAGO,IAAM,WAAW,KAAK,SAASC,UAAS,EAAE,OAAO,MAAM,GAAiD;AAC7G,SAAO,oBAAC,QAAK,MAAK,gBAAgB,sBAAY,SAAS,OAAO,KAAK,CAAC,GAAE;AACxE,CAAC;;;ACvBD,SAAS,KAAK,QAAAC,aAAY;AAC1B,SAAS,QAAAC,aAAY;AAyBT,SACA,OAAAC,MADA;AAVL,IAAM,WAAWC,MAAK,SAASC,UAAS,EAAE,MAAM,OAAO,OAAO,OAAO,gBAAgB,GAAG,GAAkB;AAC/G,QAAM,aAAa,KAAK,IAAI,eAAe,KAAK,IAAI,GAAG,GAAG,KAAK,IAAI,CAAC,MAAM,aAAa,EAAE,KAAK,CAAC,CAAC,CAAC;AACjG,QAAM,aAAa,KAAK,IAAI,GAAG,QAAQ,aAAa,CAAC;AACrD,SACE,gBAAAF,KAAC,OAAI,eAAc,UAAS,OACzB,eAAK,IAAI,CAAC,KAAK,MAAM;AACpB,UAAM,OAAO,IAAI,OAAO,KAAK,IAAI,IAAI,KAAK;AAC1C,UAAM,QAAQ,OAAO,IAAI,QAAQ,SAAS,IAAI,MAAM,QAAQ,OAAO,GAAG,GAAG,KAAK,IAAI,GAAG,aAAa,aAAa,IAAI,CAAC,CAAC;AACrH,WACE,qBAAC,OACC;AAAA,2BAACG,OAAA,EAAM;AAAA,cAAM,IAAI,OAAO,SAAS,IAAI,OAAO,UAAU,GAAG,UAAU,CAAC;AAAA,QAAE;AAAA,SAAE;AAAA,MACxE,gBAAAH,KAAC,OAAI,OAAO,YACV,+BAACG,OAAA,EAAK,MAAM,OAAO,SAAS,gBACzB;AAAA;AAAA,QACA,OAAO,MAAM,IAAI,IAAI,IAAI;AAAA,SAC5B,GACF;AAAA,SAPQ,GAAG,IAAI,KAAK,IAAI,CAAC,EAQ3B;AAAA,EAEJ,CAAC,GACH;AAEJ,CAAC;;;ACtCD,SAAS,OAAAC,YAAW;AAwBhB,gBAAAC,YAAA;AAlBJ,SAAS,UAAU,MAAoC;AACrD,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,MAAM;AAAA,IACf,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAGO,SAAS,KAAK,EAAE,OAAO,UAAU,UAAU,MAAM,GAA8D;AACpH,SACE,gBAAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,eAAc;AAAA,MACd,aAAa,MAAM;AAAA,MACnB,WAAW;AAAA,MACX,aAAa;AAAA,MACb,cAAc;AAAA,MACd,iBAAiB,UAAU,IAAI;AAAA,MAC/B,oBAAoB,SAAS;AAAA,MAC7B,aAAa;AAAA,MACb;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;;;AC/BO,IAAM,mBAA8C;AAAA,EACzD,EAAE,UAAU,WAAW,OAAO,WAAW,QAAQ,IAAI;AAAA,EACrD,EAAE,UAAU,UAAU,OAAO,UAAU,QAAQ,IAAI;AAAA,EACnD,EAAE,UAAU,SAAS,OAAO,2CAA2C,QAAQ,IAAI;AACrF;AAIO,IAAM,uBAA0C,EAAE,UAAU,GAAG,UAAU,MAAM;AAO/E,SAAS,mBAAmB,OAA0B,OAAe,KAAsC;AAChH,MAAI,MAAM,SAAU,QAAO;AAC3B,QAAM,QAAQ,iBAAiB;AAC/B,MAAI,IAAI,OAAQ,QAAO,EAAE,GAAG,OAAO,UAAU,QAAQ;AACrD,MAAI,IAAI,QAAQ,UAAU,IAAK,QAAO,EAAE,GAAG,OAAO,UAAU,CAAC,MAAM,SAAS;AAC5E,MAAI,IAAI,WAAY,CAAC,IAAI,QAAQ,UAAU,IAAM,QAAO,EAAE,GAAG,OAAO,WAAW,MAAM,WAAW,IAAI,SAAS,MAAM;AACnH,MAAI,IAAI,aAAc,CAAC,IAAI,QAAQ,UAAU,IAAM,QAAO,EAAE,GAAG,OAAO,WAAW,MAAM,WAAW,KAAK,MAAM;AAC7G,MAAI,IAAI,OAAQ,QAAO,EAAE,GAAG,OAAO,UAAW,iBAAiB,MAAM,QAAQ,EAAqB,SAAS;AAC3G,QAAM,WAAW,UAAU,KAAK,KAAK,IAAI,iBAAiB,OAAO,KAAK,IAAI,CAAC,IAAI;AAC/E,QAAM,WAAW,iBAAiB,KAAK,CAAC,MAAM,EAAE,WAAW,MAAM,YAAY,CAAC;AAC9E,QAAM,SAAS,aAAa,IAAI,QAAQ,IAAI,OAAO,SAAY;AAC/D,SAAO,SAAS,EAAE,GAAG,OAAO,UAAU,iBAAiB,QAAQ,MAAM,GAAG,UAAU,OAAO,SAAS,IAAI;AACxG;AAGO,SAAS,oBAAoB,UAA0B,OAAe,YAAoB,YAA6B;AAC5H,QAAM,OAAO,eAAe,SAAY,MAAM,IAAI,IAAI,MAAM,QAAQ,MAAM,IAAI,cAAc,UAAU,CAAC,EAAE,IAAI;AAC7G,MAAI,aAAa,UAAW,QAAO,GAAG,MAAM,QAAQ,MAAM,QAAQ,OAAO,CAAC,aAAa,KAAK,GAAG,IAAI;AACnG,MAAI,aAAa,SAAU,QAAO,GAAG,MAAM,MAAM,MAAM,QAAQ,KAAK,CAAC,aAAa,KAAK,GAAG,IAAI;AAC9F,SAAO,GAAG,MAAM,UAAU,MAAM,QAAQ,SAAS,CAAC,iBAAiB,KAAK,IAAI,MAAM,IAAI,QAAQ,UAAU,CAAC,CAAC;AAC5G;;;AJ0BQ,gBAAAC,MACE,QAAAC,aADF;AAxCR,IAAM,WAAW;AAEjB,SAAS,QAAQ,MAA+B,UAAkC;AAChF,QAAM,OAAO,OAAO,QAAQ,IAAI,EAC7B,OAAO,CAAC,CAAC,GAAG,MAAM,QAAQ,QAAQ,EAClC,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO;AAAA,IACtB,OAAO,IAAI,QAAQ,sBAAsB,OAAO,EAAE,YAAY;AAAA,IAC9D,OAAO,OAAO,UAAU,WAAW,QAAQ,KAAK,IAAI,SAAS,OAAO,CAAC;AAAA,EACvE,EAAE;AACJ,MAAI,YAAY,KAAK,UAAU,SAAU,QAAO;AAChD,SAAO,CAAC,GAAG,KAAK,MAAM,GAAG,QAAQ,GAAG,EAAE,OAAO,IAAI,OAAO,MAAM,IAAI,IAAI,KAAK,SAAS,QAAQ,gBAAgB,EAAE,CAAC;AACjH;AAMO,SAAS,aAAa,OAA0B;AACrD,QAAM,EAAE,YAAY,OAAO,SAAS,MAAM,cAAc,OAAO,SAAS,MAAM,OAAO,UAAU,OAAO,WAAW,IAAI;AACrH,QAAM,CAAC,OAAO,QAAQ,IAAI,SAA4B,oBAAoB;AAE1E;AAAA,IACE,CAAC,OAAO,QAAQ;AACd,eAAS,CAAC,YAAY,mBAAmB,SAAS,OAAO,GAAG,CAAC;AAAA,IAC/D;AAAA,IACA,EAAE,UAAU,YAAY,CAAC,KAAK;AAAA,EAChC;AAEA,YAAU,MAAM;AACd,QAAI,MAAM,UAAU;AAClB,iBAAW,MAAM,QAAQ;AACzB,eAAS,CAAC,aAAa,EAAE,GAAG,SAAS,UAAU,OAAU,EAAE;AAAA,IAC7D;AAAA,EACF,GAAG,CAAC,MAAM,UAAU,UAAU,CAAC;AAE/B,QAAM,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC;AACpC,QAAM,cAAc,KAAK,IAAI,IAAI,KAAK,IAAI,QAAQ,GAAG,EAAE,CAAC;AACxD,SACE,gBAAAA,MAAC,QAAK,MAAM,cAAc,WAAW,aAAa,OAChD;AAAA,oBAAAA,MAACC,MAAA,EAAI,OAAO,OACV;AAAA,sBAAAF,KAACE,MAAA,EAAI,UAAU,GACb,0BAAAD,MAACE,OAAA,EACG;AAAA,uBAAc,MAAM,SAAS,MAAM,WAAW,MAAM,QAAQ,SAAS;AAAA,QAAE;AAAA,QAAE,MAAM,KAAK,iBAAiB;AAAA,SACzG,GACF;AAAA,MACA,gBAAAH,KAACG,OAAA,EAAM,gBAAM,IAAI,QAAQ,UAAU,CAAC,GAAE;AAAA,OACxC;AAAA,IACA,gBAAAH,KAACG,OAAA,EAAK,eAAC;AAAA,IACP,gBAAAH,KAACG,OAAA,EAAK,MAAK,QAAQ,oBAAU,QAAQ,OAAO,IAAI,GAAG,MAAM,KAAK,KAAK,CAAC,mCAAkC;AAAA,IACtG,gBAAAH,KAACG,OAAA,EAAK,eAAC;AAAA,IACP,gBAAAH,KAACE,MAAA,EAAI,YAAY,GACf,0BAAAF,KAAC,YAAS,MAAM,QAAQ,MAAM,MAAM,QAAQ,GAAG,OAAO,KAAK,IAAI,IAAI,QAAQ,CAAC,GAAG,MAAM,MAAM,UAAU,GACvG;AAAA,IACA,gBAAAA,KAACG,OAAA,EAAK,eAAC;AAAA,IACP,gBAAAH,KAACG,OAAA,EAAK,MAAK,gBACR,wBAAc,MAAM,OAAO,uBAAuB,IAAI,MAAM,IAAI,WAAW,wBAAwB,GACtG;AAAA,IACA,gBAAAH,KAACG,OAAA,EAAK,eAAC;AAAA,IACN,iBAAiB,IAAI,CAAC,QAAQ,MAAM;AACnC,YAAM,WAAW,MAAM,MAAM;AAC7B,YAAM,UAAU,WAAW,MAAM,OAAO,MAAM,QAAQ,OAAO,IAAI;AACjE,YAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,OAAO,KAAK;AACvC,aACE,gBAAAF,MAACE,OAAA,EAA2B,MAAK,gBAC9B;AAAA;AAAA,QAAQ;AAAA,QAAE,WAAW,MAAM,OAAO,OAAO,OAAO,WAAW,CAAC,IAAI,OAAO,OAAO,WAAW;AAAA,QAAE;AAAA,QAAE,MAAM,IAAI,OAAO,MAAM;AAAA,WAD5G,OAAO,QAElB;AAAA,IAEJ,CAAC;AAAA,IACD,gBAAAH,KAACG,OAAA,EAAK,eAAC;AAAA,IACN,OACC,gBAAAH,KAAC,WAAQ,OAAO,MAAM,IAAI,SAAS,YAAY,oBAAe,SAAS,WAAW,oBAAe,0BAAqB,GAAG,IACvH,QACF,gBAAAA,KAACG,OAAA,EAAK,MAAK,QAAQ,gBAAM,MAAM,GAAG,MAAM,QAAQ,KAAK,IAAI,KAAK,EAAE,GAAE,IAElE,gBAAAH;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,QACP,OAAO;AAAA,UACL,EAAE,KAAK,MAAM,QAAQ,QAAQ,OAAO,SAAS;AAAA,UAC7C,EAAE,KAAK,SAAS,OAAO,UAAU;AAAA,UACjC,EAAE,KAAK,OAAO,OAAO,gBAAgB;AAAA,UACrC,EAAE,KAAK,UAAU,OAAO,aAAa;AAAA,QACvC;AAAA;AAAA,IACF;AAAA,KAEJ;AAEJ;;;AKlHA,SAAS,OAAAI,MAAK,QAAAC,OAAM,YAAAC,iBAAgB;AACpC,SAAS,QAAAC,OAAM,aAAAC,YAAW,kBAAkB;;;ACIrC,SAAS,UAAU,OAAe,SAAiB,YAAY,IAAmB;AACvF,QAAM,IAAI,MAAM,KAAK,EAAE,YAAY;AACnC,MAAI,CAAC,EAAG,QAAO;AACf,QAAM,IAAI,QAAQ,YAAY;AAC9B,MAAI,MAAM,EAAG,QAAO;AACpB,MAAI,EAAE,WAAW,CAAC,EAAG,QAAO;AAC5B,MAAI,EAAE,MAAM,WAAW,EAAE,KAAK,CAAC,SAAS,KAAK,WAAW,CAAC,CAAC,EAAG,QAAO;AACpE,MAAI,EAAE,SAAS,CAAC,EAAG,QAAO;AAC1B,MAAI,cAAc,GAAG,CAAC,EAAG,QAAO;AAEhC,MAAI,aAAa,EAAE,UAAU,KAAK,UAAU,YAAY,EAAE,SAAS,CAAC,EAAG,QAAO;AAC9E,SAAO;AACT;AAEO,SAAS,cAAc,QAAgB,UAA2B;AACvE,MAAI,IAAI;AACR,aAAW,QAAQ,UAAU;AAC3B,QAAI,SAAS,OAAO,CAAC,EAAG,MAAK;AAC7B,QAAI,MAAM,OAAO,OAAQ,QAAO;AAAA,EAClC;AACA,SAAO,OAAO,WAAW;AAC3B;AAGO,SAAS,YAAe,OAAqB,OAAe,QAA6C;AAC9G,MAAI,CAAC,MAAM,KAAK,EAAG,QAAO,CAAC,GAAG,KAAK;AACnC,SAAO,MACJ,IAAI,CAAC,MAAM,UAAU;AACpB,UAAM,CAAC,SAAS,SAAS,IAAI,OAAO,IAAI;AACxC,WAAO,EAAE,MAAM,OAAO,MAAM,UAAU,OAAO,SAAS,SAAS,EAAE;AAAA,EACnE,CAAC,EACA,OAAO,CAAC,UAA6D,MAAM,SAAS,IAAI,EACxF,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EACnD,IAAI,CAAC,UAAU,MAAM,IAAI;AAC9B;AAGO,SAAS,aAAa,OAAe,QAAgB,MAA8C;AACxG,MAAI,SAAS,KAAM,QAAO,EAAE,OAAO,GAAG,KAAK,MAAM;AACjD,QAAM,OAAO,KAAK,MAAM,OAAO,CAAC;AAChC,QAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,QAAQ,MAAM,SAAS,IAAI,CAAC;AAC/D,SAAO,EAAE,OAAO,KAAK,QAAQ,KAAK;AACpC;;;ACTA,SAAS,SAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAGO,SAAS,aAAa,MAAgB,OAAwB;AACnE,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,UAAU,KAAM,QAAO,KAAK,WAAW,SAAS;AACpD,MAAI,KAAK,SAAS,WAAW,MAAM,QAAQ,KAAK,KAAK,MAAM,MAAM,CAAC,MAAM,OAAO,MAAM,QAAQ,EAAG,QAAO,MAAM,KAAK,IAAI;AACtH,MAAI,OAAO,UAAU,SAAU,QAAO,KAAK,UAAU,KAAK;AAC1D,SAAO,OAAO,KAAK;AACrB;AAEO,SAAS,gBACd,QACA,UAAmC,CAAC,GACpC,OAA0E,CAAC,GAChE;AACX,QAAM,OAAO,IAAI,IAAI,KAAK,QAAQ,CAAC,CAAC;AACpC,QAAM,QAAQ,cAAc,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,KAAK,IAAI,KAAK,QAAQ,CAAC;AAC7E,QAAM,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,QAAQ,GAAG,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC;AACxF,QAAM,SAAS,QAAQ,IAAI,CAAC,UAAU,EAAE,MAAM,OAAO,KAAK,KAAK,EAAE;AACjE,QAAM,SAAiC,CAAC;AACxC,aAAW,SAAS,OAAQ,QAAO,MAAM,KAAK,QAAQ,IAAI,aAAa,MAAM,MAAM,QAAQ,MAAM,KAAK,QAAQ,CAAC;AAC/G,QAAM,UAAU,IAAI,IAAI,KAAK,mBAAmB,CAAC,CAAC;AAClD,QAAM,eAAe,OAAO,UAAU,CAAC,MAAM,QAAQ,IAAI,EAAE,KAAK,QAAQ,KAAM,EAAE,KAAK,YAAY,CAAC,OAAO,EAAE,KAAK,QAAQ,CAAE;AAC1H,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,KAAK,IAAI,GAAG,YAAY;AAAA,IAC/B,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,IACR,MAAM,SAAS,OAAO,IAAI,EAAE,GAAG,QAAQ,IAAI,CAAC;AAAA,EAC9C;AACF;AAGO,SAAS,cAAc,QAAoB,MAAgB,KAAkD;AAClH,MAAI,IAAI,KAAK,MAAM,GAAI,QAAO,KAAK,WAAW,EAAE,OAAO,WAAW,IAAI,CAAC;AACvE,MAAI;AACF,UAAM,EAAE,MAAM,IAAI,eAAe,QAAQ,EAAE,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;AAC7D,WAAO,EAAE,OAAO,MAAM,KAAK,QAAQ,EAAE;AAAA,EACvC,SAAS,OAAO;AACd,QAAI,WAAW,KAAK,EAAG,QAAO,EAAE,OAAO,MAAM,OAAO,GAAG,MAAM,OAAO,KAAK,MAAM,IAAI,KAAK,MAAM,QAAQ;AACtG,WAAO,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE;AAAA,EACzE;AACF;AAEA,SAAS,UAAU,OAAkB,UAAkB,OAAsC;AAC3F,QAAM,SAAS,EAAE,GAAG,MAAM,OAAO;AACjC,MAAI,MAAO,QAAO,QAAQ,IAAI;AAAA,MACzB,QAAO,OAAO,QAAQ;AAC3B,SAAO,EAAE,GAAG,OAAO,OAAO;AAC5B;AAEA,SAAS,QAAQ,OAAyC;AACxD,SAAO,MAAM,OAAO,MAAM,KAAK;AACjC;AAEA,SAAS,SAAS,OAAkB,OAA0B;AAC5D,QAAM,QAAQ,QAAQ,KAAK;AAC3B,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,UAAU,EAAE,GAAG,OAAO,QAAQ,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,KAAK,QAAQ,GAAG,MAAM,EAAE,GAAG,MAAM,KAAK,UAAU,MAAS;AAC1H;AAEA,SAAS,QAAQ,MAA0B;AACzC,MAAI,KAAK,SAAS,UAAW,QAAO,KAAK,WAAW,CAAC,QAAQ,OAAO,IAAI,CAAC,IAAI,QAAQ,OAAO;AAC5F,QAAM,SAAS,KAAK,cAAc,CAAC;AACnC,SAAO,KAAK,WAAW,SAAS,CAAC,IAAI,GAAG,MAAM;AAChD;AAEA,SAAS,OAAO,OAA6B;AAC3C,MAAI,OAAO,EAAE,GAAG,OAAO,QAAQ,CAAC,EAA4B;AAC5D,QAAM,SAAkC,EAAE,GAAG,MAAM,KAAK;AACxD,aAAW,SAAS,MAAM,QAAQ;AAChC,UAAM,WAAW,MAAM,KAAK;AAC5B,UAAM,UAAU,cAAc,MAAM,QAAQ,MAAM,MAAM,MAAM,OAAO,QAAQ,KAAK,EAAE;AACpF,QAAI,QAAQ,MAAO,QAAO,UAAU,MAAM,UAAU,QAAQ,KAAK;AAAA,aACxD,QAAQ,UAAU,OAAW,QAAO,OAAO,QAAQ;AAAA,QACvD,QAAO,QAAQ,IAAI,QAAQ;AAAA,EAClC;AACA,QAAM,aAAa,MAAM,OAAO,UAAU,CAAC,MAAM,KAAK,OAAO,EAAE,KAAK,QAAQ,CAAC;AAC7E,MAAI,cAAc,EAAG,QAAO,EAAE,GAAG,MAAM,OAAO,WAAW;AACzD,SAAO,EAAE,GAAG,MAAM,QAAQ,aAAa,OAAO;AAChD;AAEO,SAAS,YAAY,OAAkB,QAA+B;AAC3E,MAAI,MAAM,WAAW,UAAW,QAAO;AACvC,QAAM,QAAQ,QAAQ,KAAK;AAC3B,QAAM,MAAM,QAAS,MAAM,OAAO,MAAM,KAAK,QAAQ,KAAK,KAAM;AAChE,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,UAAI,OAAO,KAAK,SAAS,WAAW;AAClC,cAAM,IAAI,OAAO,KAAK,YAAY;AAClC,YAAI,MAAM,OAAO,MAAM,IAAK,QAAO,SAAS,OAAO,MAAM;AACzD,YAAI,MAAM,OAAO,MAAM,IAAK,QAAO,SAAS,OAAO,OAAO;AAC1D,YAAI,MAAM,IAAK,QAAO,YAAY,OAAO,EAAE,MAAM,SAAS,CAAC;AAC3D,eAAO;AAAA,MACT;AACA,aAAO,QAAQ,SAAS,OAAO,MAAM,OAAO,KAAK,QAAQ,aAAa,GAAG,CAAC,IAAI;AAAA,IAChF,KAAK;AACH,aAAO,QAAQ,SAAS,OAAO,MAAM,KAAK,SAAS,YAAY,KAAK,CAAC,GAAG,GAAG,EAAE,MAAM,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,IAAI;AAAA,IACxG,KAAK;AACH,aAAO,SAAS,OAAO,EAAE;AAAA,IAC3B,KAAK;AAAA,IACL,KAAK,SAAS;AACZ,UAAI,CAAC,SAAU,MAAM,KAAK,SAAS,aAAa,MAAM,KAAK,SAAS,OAAS,QAAO;AACpF,YAAM,UAAU,QAAQ,MAAM,IAAI;AAClC,YAAM,QAAQ,OAAO,SAAS,UAAU,OAAO,QAAQ;AACvD,YAAM,QAAQ,KAAK,IAAI,GAAG,QAAQ,QAAQ,GAAG,CAAC;AAC9C,aAAO,SAAS,OAAO,SAAS,QAAQ,QAAQ,QAAQ,UAAU,QAAQ,MAAM,KAAK,EAAE;AAAA,IACzF;AAAA,IACA,KAAK;AAAA,IACL,KAAK,QAAQ;AACX,UAAI,MAAM,OAAO,WAAW,EAAG,QAAO;AACtC,YAAM,UAAU,QAAQ,cAAc,MAAM,QAAQ,MAAM,MAAM,GAAG,IAAI,CAAC;AACxE,YAAM,OAAO,SAAS,IAAI,KAAK,IAAI,UAAU,OAAO,MAAM,KAAK,UAAU,QAAQ,KAAK,IAAI;AAC1F,YAAM,QAAQ,OAAO,SAAS,SAAS,IAAI;AAC3C,aAAO,EAAE,GAAG,MAAM,QAAQ,MAAM,QAAQ,QAAQ,MAAM,OAAO,UAAU,MAAM,OAAO,OAAO;AAAA,IAC7F;AAAA,IACA,KAAK;AACH,UAAI,MAAM,OAAO,WAAW,KAAK,MAAM,SAAS,MAAM,OAAO,SAAS,EAAG,QAAO,OAAO,KAAK;AAC5F,aAAO,YAAY,OAAO,EAAE,MAAM,OAAO,CAAC;AAAA,IAC5C,KAAK;AACH,aAAO,OAAO,KAAK;AAAA,IACrB,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,QAAQ,YAAY;AAAA,IACzC;AACE,aAAO;AAAA,EACX;AACF;AAGO,SAAS,cAAc,OAAkB,OAAe,KAAsC;AACnG,QAAM,OAAO,QAAQ,KAAK,GAAG,KAAK;AAClC,MAAI,IAAI,OAAQ,QAAO,EAAE,MAAM,SAAS;AACxC,MAAI,IAAI,IAAK,QAAO,IAAI,QAAQ,EAAE,MAAM,OAAO,IAAI,EAAE,MAAM,OAAO;AAClE,MAAI,IAAI,UAAW,QAAO,EAAE,MAAM,OAAO;AACzC,MAAI,IAAI,QAAS,QAAO,EAAE,MAAM,OAAO;AACvC,MAAI,IAAI,OAAQ,QAAO,EAAE,MAAM,QAAQ;AACvC,MAAI,IAAI,QAAQ,UAAU,IAAK,QAAO,EAAE,MAAM,SAAS;AACvD,MAAI,IAAI,QAAQ,UAAU,IAAK,QAAO,EAAE,MAAM,cAAc;AAC5D,OAAK,SAAS,UAAU,SAAS,eAAe,IAAI,aAAa,IAAI,aAAa;AAChF,WAAO,EAAE,MAAM,SAAS,OAAO,IAAI,YAAY,KAAK,EAAE;AAAA,EACxD;AACA,MAAI,IAAI,aAAa,IAAI,OAAQ,QAAO,EAAE,MAAM,YAAY;AAC5D,MAAI,IAAI,QAAQ,IAAI,KAAM,QAAO;AACjC,SAAO,QAAQ,EAAE,MAAM,QAAQ,MAAM,MAAM,IAAI;AACjD;AAEA,SAAS,WAAW,MAAsB;AACxC,SAAO,mBAAmB,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,MAAM,OAAO,CAAC;AAC/E;AAGO,SAAS,kBACd,MACA,OACA,OAA0B,CAAC,GACnB;AACR,QAAM,QAAQ,CAAC,UAAU,GAAG,KAAK,WAAW;AAC5C,aAAW,QAAQ,cAAc,KAAK,WAAW,GAAG;AAClD,UAAM,QAAQ,MAAM,KAAK,QAAQ;AACjC,QAAI,UAAU,UAAa,KAAK,SAAS,KAAK,QAAQ,EAAG;AACzD,QAAI,KAAK,SAAS,aAAa,OAAO,UAAU,WAAW;AACzD,YAAM,KAAK,QAAQ,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,IAAI,QAAQ;AAC5D;AAAA,IACF;AACA,UAAM,OACJ,KAAK,SAAS,WAAW,MAAM,QAAQ,KAAK,KAAK,MAAM,MAAM,CAAC,MAAM,OAAO,MAAM,QAAQ,IACrF,MAAM,KAAK,GAAG,IACd,OAAO,UAAU,YAAY,UAAU,OACrC,KAAK,UAAU,KAAK,IACpB,OAAO,KAAK;AACpB,UAAM,KAAK,KAAK,KAAK,IAAI,IAAI,WAAW,IAAI,CAAC;AAAA,EAC/C;AACA,SAAO,MAAM,KAAK,GAAG;AACvB;;;AF3JM,SAwC6B,OAAAC,MAxC7B,QAAAC,aAAA;AA1CN,SAAS,UAAU,OAAkB,KAAaC,UAA0B;AAC1E,QAAM,OAAO,MAAM,KAAK;AACxB,MAAI,SAAS,WAAW;AACtB,UAAM,KAAK,QAAQ;AACnB,UAAM,QAAQ,QAAQ;AACtB,UAAM,MAAM,QAAQ,QAAQ,KAAK,QAAQ;AACzC,UAAM,QAAQ,QAAQ,MAAM,IAAI,OAAO,IAAI,KAAK,QAAQ;AACxD,WAAO,GAAGA,WAAU,MAAM,OAAO,GAAG,IAAI,GAAG,IAAI,KAAK;AAAA,EACtD;AACA,MAAI,SAAS,QAAQ;AACnB,UAAM,OAAO,OAAO,MAAM,IAAI,MAAM;AACpC,WAAOA,WAAU,GAAG,MAAM,OAAO,QAAG,CAAC,IAAI,IAAI,IAAI,MAAM,OAAO,QAAG,CAAC,KAAK;AAAA,EACzE;AACA,SAAO;AACT;AAEA,IAAM,WAAWC,MAAK,SAASC,UAAS,OAOrC;AACD,QAAM,EAAE,OAAO,KAAK,SAAAF,UAAS,OAAO,YAAY,MAAM,IAAI;AAC1D,QAAM,SAAS,MAAM,KAAK,WAAW,MAAM,UAAU,GAAG,IAAI;AAC5D,QAAM,QAAQ,OAAO,SAAS,MAAM,OAAO,UAAU,GAAG,UAAU;AAClE,QAAM,aAAa,KAAK,IAAI,GAAG,KAAK,OAAO,QAAQ,aAAa,KAAK,GAAG,CAAC;AACzE,QAAM,WAAW,MAAM,KAAK,SAAS,aAAa,MAAM,KAAK,SAAS;AACtE,QAAM,QAAQ,WAAW,cAAc,KAAK,aAAa,CAAC,IAAI,UAAU,OAAO,KAAKA,QAAO;AAC3F,QAAM,SAASA,YAAW,WAAW,MAAM,OAAO,MAAM,QAAQ,MAAM,IAAI;AAC1E,QAAM,aAAa,QAAQ,aAAa,IAAI,aAAa;AACzD,QAAM,OACJ,MAAM,KAAK,SAAS,UAAU,MAAM,KAAK,YAAY,SACjD,MAAM,KAAK,WAAW,KAAK,KAAK,IAChC,MAAM,KAAK,SAAS,UAClB,oBACA,MAAM,KAAK,SAAS,SAClB,SACA,MAAM,KAAK;AACrB,SACE,gBAAAD,MAACI,MAAA,EAAI,eAAc,UACjB;AAAA,oBAAAJ,MAACK,OAAA,EAAK,MAAK,gBACR;AAAA,MAAAJ,WAAU,MAAM,OAAO,MAAM,QAAQ,OAAO,IAAI;AAAA,MAAI;AAAA,MAAEA,WAAU,MAAM,KAAK,KAAK,IAAI;AAAA,MAAM;AAAA,MAAE;AAAA,MAAQ;AAAA,MACpG,OAAO,GAAG,KAAK,GAAG,MAAM,IAAI,UAAU;AAAA,MACtC,aAAa,KAAK,OAAO,KAAK,MAAM,IAAI,SAAS,MAAM,UAAU,CAAC,CAAC,KAAK;AAAA,OAC3E;AAAA,IACC,QACC,gBAAAD,MAACK,OAAA,EAAK,MAAK,gBACR;AAAA;AAAA,MACA,MAAM,MAAM,GAAG,MAAM,QAAQ,KAAK,IAAI,KAAK,EAAE;AAAA,OAChD,IACE;AAAA,KACN;AAEJ,CAAC;AAGM,SAAS,KAAK,OAAkB;AACrC,QAAM,EAAE,OAAO,QAAQ,UAAU,cAAc,MAAM,IAAI;AACzD,QAAM,CAAC,OAAO,QAAQ,IAAI,WAAW,aAAa,MAAM,OAAO;AAE/D,EAAAC;AAAA,IACE,CAAC,OAAO,QAAQ;AACd,YAAM,SAAS,cAAc,OAAO,OAAO,GAAG;AAC9C,UAAI,OAAQ,UAAS,MAAM;AAAA,IAC7B;AAAA,IACA,EAAE,UAAU,YAAY,MAAM,WAAW,UAAU;AAAA,EACrD;AAEA,QAAM,EAAE,UAAU,SAAS,IAAI;AAC/B,EAAAC,WAAU,MAAM;AACd,QAAI,MAAM,WAAW,eAAe,MAAM,OAAQ,UAAS,MAAM,MAAM;AACvE,QAAI,MAAM,WAAW,YAAa,UAAS;AAAA,EAC7C,GAAG,CAAC,MAAM,QAAQ,MAAM,QAAQ,UAAU,QAAQ,CAAC;AAEnD,QAAM,aAAa,KAAK,IAAI,IAAI,KAAK,IAAI,GAAG,GAAG,MAAM,OAAO,IAAI,CAAC,MAAM,aAAa,EAAE,KAAK,CAAC,CAAC,CAAC;AAC9F,QAAM,YAAY,OAAO,KAAK,MAAM,MAAM,EAAE;AAC5C,QAAM,OAAO,KAAK,IAAI,GAAG,SAAS,SAAS;AAC3C,QAAM,EAAE,OAAO,IAAI,IAAI,aAAa,MAAM,OAAO,QAAQ,MAAM,OAAO,IAAI;AAC1E,SACE,gBAAAP,MAACI,MAAA,EAAI,eAAc,UAAS,OACzB;AAAA,UAAM,OAAO,WAAW,IAAI,gBAAAL,KAACM,OAAA,EAAM,gBAAM,IAAI,6BAA6B,GAAE,IAAU;AAAA,IACtF,QAAQ,IAAI,gBAAAN,KAACM,OAAA,EAAM,gBAAM,IAAI,KAAK,MAAM,QAAQ,QAAQ,IAAI,KAAK,QAAQ,GAAE,IAAU;AAAA,IACrF,MAAM,OAAO,MAAM,OAAO,GAAG,EAAE,IAAI,CAAC,OAAO,MAC1C,gBAAAN;AAAA,MAAC;AAAA;AAAA,QAEC;AAAA,QACA,KAAK,MAAM,OAAO,MAAM,KAAK,QAAQ,KAAK;AAAA,QAC1C,SAAS,QAAQ,MAAM,MAAM;AAAA,QAC7B,OAAO,MAAM,OAAO,MAAM,KAAK,QAAQ;AAAA,QACvC;AAAA,QACA;AAAA;AAAA,MANK,MAAM,KAAK;AAAA,IAOlB,CACD;AAAA,IACA,MAAM,MAAM,OAAO,SAAS,gBAAAA,KAACM,OAAA,EAAM,gBAAM,IAAI,KAAK,MAAM,QAAQ,QAAQ,IAAI,MAAM,OAAO,SAAS,GAAG,OAAO,GAAE,IAAU;AAAA,IACzH,gBAAAN,KAACM,OAAA,EAAK,eAAC;AAAA,IACP,gBAAAN;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,OAAO;AAAA,UACL,EAAE,KAAK,OAAO,OAAO,OAAO;AAAA,UAC5B,EAAE,KAAK,aAAa,OAAO,OAAO;AAAA,UAClC,EAAE,KAAK,SAAS,OAAO,MAAM,SAAS,MAAM,OAAO,SAAS,IAAI,cAAc,OAAO;AAAA,UACrF,EAAE,KAAK,UAAU,OAAO,YAAY;AAAA,UACpC,EAAE,KAAK,OAAO,OAAO,SAAS;AAAA,QAChC;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;;;AG/HA,SAAS,OAAAS,OAAe,QAAQ,QAAAC,QAAM,YAAAC,iBAAgB;AACtD,SAAS,QAAAC,QAAM,eAAAC,cAAa,aAAAC,YAAW,WAAAC,UAAS,cAAAC,aAAY,UAAAC,SAAQ,YAAAC,iBAAgB;;;ACgC7E,IAAM,cAA2B,EAAE,OAAO,IAAI,QAAQ,GAAG,SAAS,CAAC,GAAG,cAAc,MAAM,OAAO,GAAG;AAM3G,SAAS,MAAM,OAAyB;AACtC,SAAO,CAAC,GAAG,KAAK;AAClB;AAEA,SAAS,MAAM,OAAoB,MAAgB,QAA6B;AAC9E,SAAO,EAAE,GAAG,OAAO,OAAO,KAAK,KAAK,EAAE,GAAG,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,QAAQ,MAAM,CAAC,GAAG,cAAc,KAAK;AAClH;AAEO,SAAS,cAAc,OAAoB,QAAmC;AACnF,QAAM,OAAO,MAAM,MAAM,KAAK;AAC9B,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK,UAAU;AACb,YAAM,OAAO,OAAO,KAAK,QAAQ,UAAU,IAAI;AAC/C,YAAM,WAAW,MAAM,IAAI;AAC3B,aAAO,MAAM,OAAO,CAAC,GAAG,KAAK,MAAM,GAAG,MAAM,MAAM,GAAG,GAAG,UAAU,GAAG,KAAK,MAAM,MAAM,MAAM,CAAC,GAAG,MAAM,SAAS,SAAS,MAAM;AAAA,IAChI;AAAA,IACA,KAAK;AACH,aAAO,cAAc,OAAO,EAAE,MAAM,UAAU,MAAM,KAAK,CAAC;AAAA,IAC5D,KAAK;AACH,UAAI,MAAM,WAAW,KAAK,KAAK,MAAM,SAAS,CAAC,MAAM,KAAM,QAAO,cAAc,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1G,aAAO,MAAM,OAAO,CAAC,GAAG,KAAK,MAAM,GAAG,MAAM,SAAS,CAAC,GAAG,MAAM,GAAG,KAAK,MAAM,MAAM,MAAM,CAAC,GAAG,MAAM,MAAM;AAAA,IAC3G,KAAK;AACH,UAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,aAAO,MAAM,OAAO,CAAC,GAAG,KAAK,MAAM,GAAG,MAAM,SAAS,CAAC,GAAG,GAAG,KAAK,MAAM,MAAM,MAAM,CAAC,GAAG,MAAM,SAAS,CAAC;AAAA,IACzG,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,QAAQ,KAAK,IAAI,GAAG,MAAM,SAAS,CAAC,EAAE;AAAA,IAC3D,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,QAAQ,KAAK,IAAI,KAAK,QAAQ,MAAM,SAAS,CAAC,EAAE;AAAA,IACrE,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,QAAQ,EAAE;AAAA,IAC/B,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,QAAQ,KAAK,OAAO;AAAA,IACzC,KAAK;AACH,aAAO,MAAM,OAAO,KAAK,MAAM,MAAM,MAAM,GAAG,CAAC;AAAA,IACjD,KAAK,aAAa;AAChB,UAAI,IAAI,MAAM;AACd,aAAO,IAAI,KAAK,KAAK,KAAK,KAAK,IAAI,CAAC,CAAW,EAAG,MAAK;AACvD,aAAO,IAAI,KAAK,CAAC,KAAK,KAAK,KAAK,IAAI,CAAC,CAAW,EAAG,MAAK;AACxD,aAAO,MAAM,OAAO,CAAC,GAAG,KAAK,MAAM,GAAG,CAAC,GAAG,GAAG,KAAK,MAAM,MAAM,MAAM,CAAC,GAAG,CAAC;AAAA,IAC3E;AAAA,IACA,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,OAAO,OAAO,OAAO,QAAQ,MAAM,OAAO,KAAK,EAAE,QAAQ,cAAc,KAAK;AAAA,IACjG,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,OAAO,IAAI,QAAQ,GAAG,cAAc,MAAM,OAAO,GAAG;AAAA,IACzE,KAAK,YAAY;AACf,YAAM,QAAQ,OAAO,MAAM,KAAK;AAChC,UAAI,CAAC,SAAS,MAAM,QAAQ,MAAM,QAAQ,SAAS,CAAC,MAAM,MAAO,QAAO;AACxE,aAAO,EAAE,GAAG,OAAO,SAAS,CAAC,GAAG,MAAM,SAAS,KAAK,EAAE,MAAM,IAAI,EAAE;AAAA,IACpE;AAAA,IACA,KAAK,gBAAgB;AACnB,UAAI,MAAM,QAAQ,WAAW,EAAG,QAAO;AACvC,YAAM,QAAQ,MAAM,iBAAiB,OAAO,MAAM,QAAQ,SAAS,IAAI,KAAK,IAAI,GAAG,MAAM,eAAe,CAAC;AACzG,YAAM,QAAQ,MAAM,QAAQ,KAAK;AACjC,aAAO,EAAE,GAAG,OAAO,OAAO,QAAQ,MAAM,KAAK,EAAE,QAAQ,cAAc,OAAO,OAAO,MAAM,iBAAiB,OAAO,MAAM,QAAQ,MAAM,MAAM;AAAA,IAC7I;AAAA,IACA,KAAK,gBAAgB;AACnB,UAAI,MAAM,iBAAiB,KAAM,QAAO;AACxC,YAAM,QAAQ,MAAM,eAAe;AACnC,UAAI,SAAS,MAAM,QAAQ,QAAQ;AACjC,eAAO,EAAE,GAAG,OAAO,OAAO,MAAM,OAAO,QAAQ,MAAM,MAAM,KAAK,EAAE,QAAQ,cAAc,KAAK;AAAA,MAC/F;AACA,YAAM,QAAQ,MAAM,QAAQ,KAAK;AACjC,aAAO,EAAE,GAAG,OAAO,OAAO,QAAQ,MAAM,KAAK,EAAE,QAAQ,cAAc,MAAM;AAAA,IAC7E;AAAA,IACA;AACE,aAAO;AAAA,EACX;AACF;AAUO,SAAS,gBAAgB,OAAoB,OAAe,KAAoC;AACrG,MAAI,IAAI,QAAQ;AACd,UAAM,OAAO,MAAM,MAAM,KAAK;AAC9B,QAAI,MAAM,SAAS,KAAK,KAAK,MAAM,SAAS,CAAC,MAAM,KAAM,QAAO,EAAE,MAAM,oBAAoB;AAC5F,WAAO,EAAE,MAAM,SAAS;AAAA,EAC1B;AACA,MAAI,UAAU,QAAQ,CAAC,IAAI,KAAM,QAAO,EAAE,MAAM,UAAU;AAC1D,MAAI,IAAI,aAAa,IAAI,OAAQ,QAAO,EAAE,MAAM,YAAY;AAC5D,MAAI,IAAI,UAAW,QAAO,EAAE,MAAM,OAAO;AACzC,MAAI,IAAI,WAAY,QAAO,EAAE,MAAM,QAAQ;AAC3C,MAAI,IAAI,QAAS,QAAO,EAAE,MAAM,eAAe;AAC/C,MAAI,IAAI,UAAW,QAAO,EAAE,MAAM,eAAe;AACjD,MAAI,IAAI,MAAM;AACZ,QAAI,UAAU,IAAK,QAAO,EAAE,MAAM,OAAO;AACzC,QAAI,UAAU,IAAK,QAAO,EAAE,MAAM,MAAM;AACxC,QAAI,UAAU,IAAK,QAAO,EAAE,MAAM,YAAY;AAC9C,QAAI,UAAU,IAAK,QAAO,EAAE,MAAM,YAAY;AAC9C,WAAO;AAAA,EACT;AACA,MAAI,IAAI,UAAU,IAAI,OAAO,IAAI,KAAM,QAAO;AAC9C,MAAI,MAAO,QAAO,EAAE,MAAM,UAAU,MAAM,MAAM;AAChD,SAAO;AACT;;;AC3IA,SAAS,OAAAC,MAAK,QAAAC,OAAM,YAAAC,iBAAgB;AACpC,SAAS,QAAAC,OAAM,SAAS,YAAAC,iBAAgB;;;ACYjC,IAAM,qBAAkC,EAAE,QAAQ,GAAG,OAAO,IAAI,WAAW,MAAM;AAWjF,SAAS,aAAa,OAA8B,OAA6B;AACtF,SAAO,YAAY,OAAO,OAAO,CAAC,SAAS,CAAC,KAAK,OAAO,KAAK,WAAW,CAAC;AAC3E;AAEO,SAAS,cAAc,OAAoB,QAAsB,OAA4B;AAClG,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO,UAAU,IAAI,EAAE,GAAG,OAAO,QAAQ,EAAE,IAAI,EAAE,GAAG,OAAO,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,QAAQ,GAAG,MAAM,SAAS,OAAO,KAAK,CAAC,EAAE;AAAA,IACnI,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,WAAW,KAAK;AAAA,IACrC,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,OAAO,MAAM,QAAQ,OAAO,MAAM,QAAQ,EAAE;AAAA,IACjE,KAAK;AACH,aAAO,MAAM,QAAQ,EAAE,GAAG,OAAO,OAAO,CAAC,GAAG,MAAM,KAAK,EAAE,MAAM,GAAG,EAAE,EAAE,KAAK,EAAE,GAAG,QAAQ,EAAE,IAAI,EAAE,GAAG,OAAO,WAAW,MAAM;AAAA,IAC7H,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,WAAW,OAAO,OAAO,IAAI,QAAQ,EAAE;AAAA,IAC5D;AACE,aAAO;AAAA,EACX;AACF;AAOO,SAAS,gBAAgB,OAAoB,OAAe,KAAmB,YAAoC;AACxH,MAAI,IAAI,WAAY,IAAI,QAAQ,UAAU,IAAM,QAAO,EAAE,MAAM,QAAQ,OAAO,GAAG;AACjF,MAAI,IAAI,aAAc,IAAI,QAAQ,UAAU,IAAM,QAAO,EAAE,MAAM,QAAQ,OAAO,EAAE;AAClF,MAAI,IAAI,OAAQ,QAAO,EAAE,MAAM,QAAQ,OAAO,IAAI;AAClD,MAAI,IAAI,SAAU,QAAO,EAAE,MAAM,QAAQ,OAAO,GAAG;AACnD,MAAI,IAAI,OAAQ,QAAO,EAAE,MAAM,SAAS;AACxC,MAAI,IAAI,OAAQ,QAAO,MAAM,YAAY,EAAE,MAAM,cAAc,IAAI,EAAE,MAAM,SAAS;AACpF,MAAI,MAAM,WAAW;AACnB,QAAI,IAAI,aAAa,IAAI,OAAQ,QAAO,EAAE,MAAM,YAAY;AAC5D,QAAI,SAAS,CAAC,IAAI,QAAQ,CAAC,IAAI,QAAQ,CAAC,IAAI,IAAK,QAAO,EAAE,MAAM,QAAQ,MAAM,MAAM;AACpF,WAAO;AAAA,EACT;AACA,MAAI,UAAU,IAAK,QAAO,EAAE,MAAM,QAAQ,OAAO,EAAE;AACnD,MAAI,UAAU,IAAK,QAAO,EAAE,MAAM,QAAQ,OAAO,GAAG;AACpD,MAAI,UAAU,IAAK,QAAO,EAAE,MAAM,SAAS;AAC3C,MAAI,UAAU,OAAO,WAAY,QAAO,EAAE,MAAM,eAAe;AAC/D,SAAO;AACT;;;ADnCI,SA8CwB,OAAAC,MA9CxB,QAAAC,aAAA;AARJ,IAAM,MAAMC,MAAK,SAASC,KAAI,EAAE,MAAM,UAAU,MAAM,GAA2D;AAC/G,QAAM,OAAO,KAAK,OAAO,KAAK,KAAK,IAAI,KAAK;AAC5C,QAAM,cAAc,KAAK,IAAI,GAAG,QAAQ,IAAI,aAAa,IAAI,CAAC;AAC9D,QAAM,QAAQ,SAAS,KAAK,OAAO,WAAW;AAC9C,QAAM,aAAa,cAAc,aAAa,KAAK,IAAI;AACvD,QAAM,OAAO,KAAK,eAAe,aAAa,IAAI,KAAK,SAAS,KAAK,aAAa,UAAU,CAAC,KAAK;AAClG,QAAM,OAAO,IAAI,OAAO,KAAK,IAAI,GAAG,QAAQ,IAAI,aAAa,KAAK,IAAI,aAAa,IAAI,IAAI,aAAa,IAAI,CAAC,CAAC;AAC9G,SACE,gBAAAF,MAACG,OAAA,EAAK,MAAK,gBACR;AAAA,eAAW,MAAM,OAAO,MAAM,QAAQ,OAAO,IAAI;AAAA,IAAI;AAAA,IAAE,WAAW,MAAM,OAAO,KAAK,IAAI;AAAA,IACxF,MAAM,IAAI,IAAI;AAAA,IACd;AAAA,IACA,MAAM,IAAI,IAAI;AAAA,KACjB;AAEJ,CAAC;AAGM,SAAS,WAAW,OAAwB;AACjD,QAAM,EAAE,OAAO,OAAO,QAAQ,UAAU,aAAa,MAAM,YAAY,gBAAgB,YAAY,KAAK,IAAI;AAC5G,QAAM,CAAC,OAAO,QAAQ,IAAIC,UAAsB,kBAAkB;AAClE,QAAM,QAAQ,QAAQ,MAAM,aAAa,OAAO,MAAM,KAAK,GAAG,CAAC,OAAO,MAAM,KAAK,CAAC;AAClF,QAAM,SAAS,KAAK,IAAI,MAAM,QAAQ,KAAK,IAAI,GAAG,MAAM,SAAS,CAAC,CAAC;AAEnE,EAAAC;AAAA,IACE,CAAC,OAAO,QAAQ;AACd,YAAM,UAAU,gBAAgB,OAAO,OAAO,KAAK,UAAU;AAC7D,UAAI,CAAC,QAAS;AACd,UAAI,QAAQ,SAAS,UAAU;AAC7B,cAAM,OAAO,MAAM,MAAM;AACzB,YAAI,KAAM,OAAM,SAAS,IAAI;AAC7B;AAAA,MACF;AACA,UAAI,QAAQ,SAAS,UAAU;AAC7B,cAAM,SAAS;AACf;AAAA,MACF;AACA,YAAM,OAAO,cAAc,OAAO,SAAS,QAAQ,SAAS,SAAS,MAAM,SAAS,aAAa,OAAO,MAAM,KAAK,EAAE,MAAM;AAC3H,eAAS,IAAI;AACb,YAAM,cAAc,aAAa,OAAO,KAAK,KAAK,EAAE,KAAK,MAAM,CAAC;AAAA,IAClE;AAAA,IACA,EAAE,SAAS;AAAA,EACb;AAEA,QAAM,OAAO,KAAK,IAAI,GAAG,MAAM;AAC/B,QAAM,EAAE,OAAO,IAAI,IAAI,aAAa,MAAM,QAAQ,QAAQ,IAAI;AAC9D,SACE,gBAAAL,MAACM,MAAA,EAAI,eAAc,UAAS,OACzB;AAAA,UAAM,YACL,gBAAAN,MAACG,OAAA,EACE;AAAA,YAAM,OAAO,GAAG;AAAA,MAAE;AAAA,MAAE,MAAM;AAAA,MAC1B,MAAM,OAAO,MAAM,QAAQ,MAAM;AAAA,OACpC,IACE;AAAA,IACH,MAAM,WAAW,IAAI,gBAAAJ,KAACI,OAAA,EAAM,gBAAM,IAAI,KAAK,SAAS,EAAE,GAAE,IAAU;AAAA,IAClE,MAAM,MAAM,OAAO,GAAG,EAAE,IAAI,CAAC,MAAM,MAClC,gBAAAJ,KAAC,OAAkB,MAAY,UAAU,YAAY,QAAQ,MAAM,QAAQ,SAAjE,KAAK,EAA0E,CAC1F;AAAA,IACA,MAAM,SAAS,OAAO,gBAAAA,KAACI,OAAA,EAAM,gBAAM,IAAI,KAAK,SAAS,CAAC,OAAO,MAAM,MAAM,EAAE,GAAE,IAAU;AAAA,IACvF,YACC,gBAAAJ;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,OAAO;AAAA,UACL,EAAE,KAAK,MAAM,QAAQ,QAAQ,OAAO,OAAO;AAAA,UAC3C,EAAE,KAAK,SAAS,OAAO,OAAO;AAAA,UAC9B,GAAI,aAAa,CAAC,EAAE,KAAK,KAAK,OAAO,SAAS,CAAC,IAAI,CAAC;AAAA,UACpD,EAAE,KAAK,OAAO,OAAO,OAAO;AAAA,QAC9B;AAAA;AAAA,IACF,IACE;AAAA,KACN;AAEJ;;;AEhGA,SAAS,OAAAQ,MAAK,QAAAC,aAAY;AAC1B,SAAS,QAAAC,aAAY;AAiCjB,SAEI,OAAAC,MAFJ,QAAAC,aAAA;AApBG,SAAS,aACd,UACA,OACA,OACiC;AACjC,QAAM,MAAM,IAAI,MAAM,QAAQ,MAAM;AACpC,MAAI,OAAO,CAAC,GAAG,QAAQ;AACvB,MAAI,SAAS,CAAC,GAAG,KAAK;AACtB,QAAM,UAAU,MAAM,aAAa,KAAK,KAAK,GAAG,CAAC,KAAK,OAAO,SAAS,aAAa,YAAY,MAAM,CAAC,IAAI,IAAI;AAC9G,SAAO,QAAQ,IAAI,SAAS,OAAO,SAAS,EAAG,UAAS,SAAS,QAAQ,aAAa,YAAY,MAAM,CAAC,IAAI,CAAC;AAC9G,SAAO,QAAQ,IAAI,SAAS,KAAK,SAAS,EAAG,QAAO,KAAK,MAAM,GAAG,EAAE;AACpE,MAAI,QAAQ,IAAI,MAAO,UAAS,CAAC;AACjC,SAAO,EAAE,MAAM,MAAM,IAAI,KAAK,KAAK,GAAG,CAAC,GAAG,OAAO,OAAO,SAAS,YAAY,MAAM,IAAI,GAAG;AAC5F;AAGO,IAAM,YAAYC,MAAK,SAASC,WAAU,EAAE,UAAU,QAAQ,CAAC,GAAG,MAAM,GAAmB;AAChG,QAAM,QAAQ,SAAS,OAAO,CAAC,MAAmB,OAAO,MAAM,YAAY,EAAE,SAAS,CAAC;AACvF,QAAM,EAAE,MAAM,MAAM,IAAI,aAAa,OAAO,OAAO,KAAK;AACxD,SACE,gBAAAF,MAACG,MAAA,EAAI,OACH;AAAA,oBAAAJ,KAACI,MAAA,EAAI,UAAU,GACb,0BAAAJ,KAACK,OAAA,EAAK,MAAK,gBAAgB,gBAAK,GAClC;AAAA,IACC,QAAQ,gBAAAL,KAACK,OAAA,EAAK,MAAK,gBAAgB,iBAAM,IAAU;AAAA,KACtD;AAEJ,CAAC;;;ACzCD,SAAS,OAAAC,MAAe,QAAAC,OAAM,YAAAC,iBAAgB;AAC9C,SAAS,QAAAC,aAAY;AA6EjB,SAMA,OAAAC,MANA,QAAAC,aAAA;AA3DJ,SAAS,WAAW,MAAsB;AACxC,MAAI,MAAM,MAAM,QAAQ,EAAG,QAAO,MAAM,QAAQ,IAAI;AACpD,SAAO,GAAG,MAAM,QAAQ,MAAM,GAAG,SAAS,MAAM,KAAK,IAAI;AAC3D;AAMO,SAAS,mBAAmB,OAAoB,OAAe,aAAqB,YAA6B;AACtH,QAAM,SAAS,KAAK,IAAI,GAAG,KAAK;AAChC,QAAMC,SAAQ,CAAC,GAAG,MAAM,KAAK;AAC7B,MAAIA,OAAM,WAAW,GAAG;AACtB,UAAM,OAAO,MAAM,IAAI,SAAS,aAAa,KAAK,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC;AACrE,WAAO,aAAa,GAAG,WAAW,GAAG,CAAC,GAAG,IAAI,KAAK;AAAA,EACpD;AACA,QAAM,QAAQA,OAAM,IAAI,CAAC,SAAU,SAAS,OAAO,EAAE,MAAM,MAAM,IAAI,MAAM,QAAQ,OAAO,GAAG,OAAO,aAAa,MAAM,QAAQ,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,OAAO,aAAa,IAAI,EAAE,CAAE;AACtL,QAAM,KAAK,EAAE,MAAM,KAAK,OAAO,EAAE,CAAC;AAClC,QAAM,SAAS,KAAK,IAAI,MAAM,QAAQA,OAAM,MAAM;AAClD,MAAI,QAAQ;AACZ,MAAI,OAAO,MAAM,MAAM,GAAG,SAAS,CAAC,EAAE,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,OAAO,CAAC;AACzE,SAAO,OAAO,SAAS,KAAK,QAAQ,QAAQ;AAC1C,YAAS,MAAM,KAAK,EAAwB;AAC5C,aAAS;AAAA,EACX;AACA,MAAI,MAAM,SAAS;AACnB,MAAI,QAAQ;AACZ,SAAO,MAAM,MAAM,UAAU,QAAS,MAAM,GAAG,EAAwB,SAAS,UAAU,QAAQ,IAAI,IAAI,IAAI;AAC5G,aAAU,MAAM,GAAG,EAAwB;AAC3C,WAAO;AAAA,EACT;AACA,QAAM,MAAM,MAAM,MAAM,OAAO,GAAG,EAAE,IAAI,CAAC,MAAM,MAAM;AACnD,UAAM,QAAQ,QAAQ;AACtB,QAAI,UAAU,UAAU,WAAY,QAAO,WAAW,QAAQA,OAAM,UAAUA,OAAM,KAAK,MAAM,OAAO,KAAK,OAAO,GAAG;AACrH,WAAO,KAAK;AAAA,EACd,CAAC;AACD,MAAI,QAAQ,MAAM,UAAU,CAAC,WAAY,KAAI,IAAI;AACjD,SAAO,GAAG,QAAQ,IAAI,MAAM,IAAI,MAAM,QAAQ,QAAQ,IAAI,EAAE,GAAG,IAAI,KAAK,EAAE,CAAC;AAC7E;AAGO,IAAM,YAAYC,MAAK,SAASC,WAAU,OAAuB;AACtE,QAAM,EAAE,QAAQ,UAAU,UAAU,OAAO,UAAU,OAAO,cAAc,IAAI,QAAQ,OAAO,OAAO,IAAI;AAExG,EAAAC;AAAA,IACE,CAAC,OAAO,QAAQ;AACd,UAAI,QAAQ,OAAO,GAAG,EAAG;AACzB,YAAM,SAAS,gBAAgB,QAAQ,OAAO,GAAG;AACjD,UAAI,CAAC,OAAQ;AACb,UAAI,OAAO,SAAS,SAAU,UAAS,OAAO,KAAK;AAAA,UAC9C,UAAS,MAAM;AAAA,IACtB;AAAA,IACA,EAAE,SAAS;AAAA,EACb;AAEA,QAAM,aAAa,UAAU,MAAM,QAAQ;AAC3C,QAAM,QAAQ,QAAQ,QAAQ,IAAI;AAClC,QAAM,OAAO,mBAAmB,QAAQ,KAAK,IAAI,GAAG,QAAQ,aAAa,UAAU,IAAI,CAAC,GAAG,aAAa,QAAQ;AAChH,QAAM,UACJ,gBAAAJ,MAACK,OAAA,EAAK,MAAK,gBACR;AAAA,eAAW,MAAM,OAAO,UAAU,IAAI,MAAM,IAAI,UAAU;AAAA,IAAE;AAAA,IAAE;AAAA,KACjE;AAEF,MAAI,CAAC,MAAO,QAAO;AACnB,SACE,gBAAAN,KAACO,MAAA,EAAI,aAAa,MAAM,UAAU,gBAAc,MAAC,UAAU,GAAG,OAC3D,mBACH;AAEJ,CAAC;;;ACxFD,SAAS,OAAAC,MAAK,QAAAC,aAAY;AAC1B,SAAS,QAAAC,aAAY;AA2De,gBAAAC,MAO1B,QAAAC,aAP0B;AA1C7B,SAAS,eAAe,UAAqC,OAAiC;AACnG,MAAI,CAAC,MAAM,WAAW,GAAG,KAAK,KAAK,KAAK,KAAK,EAAG,QAAO,CAAC;AACxD,SAAO,YAAY,UAAU,MAAM,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC;AAC7E;AAOO,SAAS,kBAAkB,UAAqC,OAAiC;AACtG,QAAM,QAAQ,2BAA2B,KAAK,KAAK;AACnD,MAAI,CAAC,MAAO,QAAO,CAAC;AACpB,QAAM,UAAU,SAAS,KAAK,CAAC,MAAM,EAAE,SAAU,MAAM,CAAC,EAAa,YAAY,CAAC;AAClF,MAAI,CAAC,SAAS,MAAM,OAAQ,QAAO,CAAC;AACpC,QAAM,SAAS,MAAM,CAAC,KAAK,IAAI,YAAY;AAC3C,SAAO,QAAQ,KACZ,OAAO,CAAC,QAAQ,IAAI,MAAM,WAAW,KAAK,CAAC,EAC3C,IAAI,CAAC,SAAS;AAAA,IACb,MAAM,GAAG,QAAQ,IAAI,IAAI,IAAI,KAAK;AAAA,IAClC,OAAO,IAAI,QAAQ,IAAI,IAAI,IAAI,KAAK;AAAA,IACpC,aAAa,IAAI;AAAA,IACjB,YAAY,IAAI,QAAQ,IAAI,IAAI,IAAI,KAAK;AAAA,EAC3C,EAAE;AACN;AAGO,SAAS,WAAW,MAAoD;AAC7E,QAAM,QAAQ,iCAAiC,KAAK,KAAK,KAAK,CAAC;AAC/D,SAAO,QAAQ,EAAE,MAAO,MAAM,CAAC,EAAa,YAAY,GAAG,MAAM,MAAM,CAAC,KAAK,IAAI,KAAK,EAAE,IAAI;AAC9F;AAGO,IAAM,UAAUC,MAAK,SAASC,SAAQ,OAK1C;AACD,QAAM,EAAE,UAAU,UAAU,OAAO,UAAU,EAAE,IAAI;AACnD,QAAM,YAAY,KAAK,IAAI,IAAI,KAAK,IAAI,GAAG,GAAG,SAAS,IAAI,CAAC,MAAM,aAAa,EAAE,SAAS,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI;AAC7G,QAAM,EAAE,OAAO,IAAI,IAAI,aAAa,SAAS,QAAQ,UAAU,OAAO;AACtE,MAAI,SAAS,WAAW,EAAG,QAAO,gBAAAH,KAACI,OAAA,EAAM,gBAAM,IAAI,qBAAqB,GAAE;AAC1E,SACE,gBAAAJ,KAACK,MAAA,EAAI,eAAc,UAAS,OACzB,mBAAS,MAAM,OAAO,GAAG,EAAE,IAAI,CAAC,SAAS,MAAM;AAC9C,UAAM,SAAS,QAAQ,MAAM;AAC7B,UAAM,OAAO,OAAO,SAAS,QAAQ,SAAS,IAAI,QAAQ,IAAI,IAAI,YAAY,CAAC,GAAG,SAAS;AAC3F,WACE,gBAAAJ,MAACG,OAAA,EAAwB,MAAK,gBAC3B;AAAA,eAAS,MAAM,OAAO,MAAM,QAAQ,OAAO,IAAI;AAAA,MAAI;AAAA,MAAE,SAAS,MAAM,OAAO,IAAI,IAAI;AAAA,MACnF,MAAM,IAAI,QAAQ,WAAW;AAAA,MAC7B,QAAQ,OAAO,KAAK,QAAQ,IAAI,KAAK;AAAA,SAH7B,QAAQ,IAInB;AAAA,EAEJ,CAAC,GACH;AAEJ,CAAC;;;ACxED,SAASE,SAAQ,KAA4C;AAC3D,SAAO,mBAAmB,GAAG,EAAE,IAAI,CAAC,WAAW,EAAE,OAAO,aAAa,uBAAuB,GAAG,EAAE,KAAK,KAAK,GAAG,EAAE;AAClH;AAKO,SAAS,aAAa,MAAmD;AAC9E,SAAO;AAAA,IACL,EAAE,MAAM,OAAO,aAAa,mBAAmB;AAAA,IAC/C,EAAE,MAAM,WAAW,aAAa,uBAAuB;AAAA,IACvD;AAAA,MACE,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,MAAM;AAAA,QACJ,EAAE,OAAO,UAAU,aAAa,kBAAkB;AAAA,QAClD,EAAE,OAAO,YAAY,aAAa,uBAAuB;AAAA,MAC3D;AAAA,IACF;AAAA,IACA,EAAE,MAAM,SAAS,OAAO,oBAAoB,aAAa,iBAAiB;AAAA,IAC1E,EAAE,MAAM,YAAY,OAAO,yBAAyB,aAAa,sCAAsC,MAAMC,SAAQ,UAAU,EAAE;AAAA,IACjI,EAAE,MAAM,SAAS,OAAO,sBAAsB,aAAa,oBAAoB,MAAMA,SAAQ,OAAO,EAAE;AAAA,IACtG,EAAE,MAAM,UAAU,OAAO,wCAAmC,aAAa,uDAAuD,MAAMA,SAAQ,QAAQ,EAAE;AAAA,IACxJ,EAAE,MAAM,QAAQ,aAAa,oBAAoB;AAAA,IACjD,GAAI,KAAK,eAAe,CAAC,EAAE,MAAM,QAAQ,aAAa,0BAA0B,CAAC,IAAI,CAAC;AAAA,IACtF,EAAE,MAAM,QAAQ,aAAa,cAAc;AAAA,EAC7C;AACF;AAEO,SAAS,UAAU,OAAiC;AACzD,QAAM,IAAI,MAAM,KAAK,EAAE,YAAY;AACnC,SAAO,MAAM,YAAY,MAAM,aAAa,IAAI;AAClD;AAEO,IAAM,YAAY;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,IAAI;;;AC7CX,SAAS,OAAAC,OAAK,QAAAC,cAAY;AAC1B,SAAS,QAAAC,cAAY;;;ACDrB,SAAS,OAAAC,MAAK,QAAAC,aAAY;AAC1B,SAAS,QAAAC,aAAY;AA8DX,gBAAAC,OAKA,QAAAC,aALA;AAvDH,SAAS,UAAU,MAAsB;AAC9C,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,MAAM,QAAQ;AAAA,IACvB,KAAK;AACH,aAAO,MAAM,QAAQ;AAAA,IACvB,KAAK;AACH,aAAO,MAAM,QAAQ;AAAA,IACvB,KAAK;AACH,aAAO,MAAM,QAAQ;AAAA,IACvB;AACE,aAAO,MAAM,QAAQ;AAAA,EACzB;AACF;AAEO,SAAS,UAAU,MAAsB;AAC9C,SAAO,SAAS,WAAW,WAAW,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC;AACnF;AAGO,SAAS,mBAAmB,UAA6D,OAA+B;AAC7H,MAAI,SAAS,WAAW,WAAW;AACjC,QAAI,SAAS,MAAM,UAAU,MAAO,QAAO,aAAa,KAAK;AAC7D,WAAO,SAAS,mBAAmB,mCAAmC;AAAA,EACxE;AACA,SAAO,SAAS;AAClB;AAgBO,IAAM,cAAcC,MAAK,SAASC,aAAY,EAAE,UAAU,OAAO,OAAO,OAAO,KAAK,GAAqB;AAC9G,QAAM,SAAS,mBAAmB,UAAU,KAAK;AACjD,QAAM,OAAO,SAAS,WAAW,WAAW,MAAM,QAAQ,SAAS,WAAW,UAAU,MAAM,UAAU,MAAM;AAC9G,QAAM,OAAO,CAAC,UAAU,SAAS,IAAI,EAAE,YAAY,GAAG,QAAQ,QAAQ,SAAS,IAAI,GAAG,CAAC,CAAC;AACxF,MAAI,SAAS,iBAAiB,SAAS,gBAAgB,EAAG,MAAK,KAAK,IAAI,SAAS,aAAa,EAAE;AAChG,QAAM,WAAW,QAAQ,SAAS,WAAW,WAAW,yBAAyB,SAAS,EAAE,KAAK;AACjG,QAAM,cAAc,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,QAAQ,IAAI,aAAa,KAAK,KAAK,QAAK,CAAC,IAAI,CAAC,CAAC;AAC5F,QAAM,QAAQ,SAAS,SAAS,SAAS,YAAY,WAAW;AAChE,QAAM,SAAS,SAAS,WAAW,WAAW,SAAS;AACvD,SACE,gBAAAF,MAACG,MAAA,EAAI,eAAc,UAAS,OAC1B;AAAA,oBAAAH,MAACG,MAAA,EAAI,OACF;AAAA,eAAS,WAAW,YACnB,gBAAAJ,MAAC,WAAQ,IAET,gBAAAA,MAACK,OAAA,EAAM,mBAAS,WAAW,UAAU,MAAM,QAAQ,MAAM,QAAQ,OAAO,IAAI,MAAM,MAAM,MAAM,QAAQ,KAAK,GAAE;AAAA,MAE/G,gBAAAL,MAACI,MAAA,EAAI,YAAY,GAAG,YAAY,GAC9B,0BAAAH,MAACI,OAAA,EACE;AAAA,cAAM,OAAO,UAAU,SAAS,IAAI,CAAC;AAAA,QAAE;AAAA,QAAE,SAAS,UAAU,MAAM,KAAK,KAAK,GAAG,SAAS,UAAoB,IAAI,MAAM,KAAK,KAAK;AAAA,SACnI,GACF;AAAA,MACA,gBAAAL,MAACI,MAAA,EAAI,UAAU,GAAG,YAAY,GAC5B,0BAAAH,MAACI,OAAA,EAAK,MAAK,gBACR;AAAA,cAAM,IAAI,IAAI,MAAM,QAAQ,MAAM,GAAG;AAAA,QACrC,KAAK,KAAK,KAAK,IAAI,MAAM,QAAQ,MAAM,GAAG,CAAC;AAAA,QAC3C,WAAW,MAAM,IAAI,KAAK,QAAQ,EAAE,IAAI;AAAA,SAC3C,GACF;AAAA,OACF;AAAA,IACC,SAAS,SAAS,UACjB,gBAAAL,MAACK,OAAA,EAAK,MAAK,gBAAgB,gBAAM,IAAI,KAAK,MAAM,QAAQ,UAAU,IAAI,SAAS,QAAQ,OAAO,EAAE,GAAE,IAChG;AAAA,KACN;AAEJ,CAAC;;;ACrFD,SAAS,OAAAC,OAAK,QAAAC,cAAY;AAC1B,SAAkC,cAAc;AAChD,SAAyB,QAAAC,QAAM,WAAAC,gBAAe;;;ACO9C,IAAM,WAAmC;AAAA,EACvC,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,SAAS;AAAA,EACT,UAAU;AAAA,EACV,UAAU;AACZ;AAEO,SAAS,eAAe,MAAsB;AACnD,SAAO,KACJ,QAAQ,uCAAuC,CAAC,MAAM,SAAS,CAAC,KAAK,CAAC,EACtE,QAAQ,iBAAiB,CAAC,GAAG,SAAiB;AAC7C,UAAM,IAAI,OAAO,IAAI;AACrB,WAAO,IAAI,KAAK,IAAI,UAAW,OAAO,cAAc,CAAC,IAAI;AAAA,EAC3D,CAAC;AACL;AAEA,SAAS,YAAY,OAAmC;AACtD,QAAM,SAAU,MAA+B;AAC/C,SAAO,MAAM,QAAQ,MAAM,IAAK,SAAqB;AACvD;AAEA,SAAS,OAAO,OAAsB;AACpC,QAAM,OAAQ,MAA6B;AAC3C,MAAI,OAAO,SAAS,SAAU,QAAO;AACrC,QAAM,MAAO,MAA4B;AACzC,SAAO,OAAO,QAAQ,WAAW,MAAM;AACzC;AAEA,SAAS,WAAW,OAA4B;AAC9C,QAAM,QAAQ,aAAa,MAAM,QAAQ,MAAM,IAAI;AACnD,QAAM,OAAO,MAAM,QAAQ;AAC3B,QAAM,QAAQ,UAAU,KAAK,EAAE,KAAK;AACpC,MAAI,CAAC,QAAQ,UAAU,QAAQ,UAAU,KAAK,OAAO,KAAM,QAAO,MAAM,KAAK,SAAS,IAAI;AAC1F,SAAO,GAAG,KAAK,IAAI,MAAM,IAAI,IAAI,IAAI,GAAG,CAAC;AAC3C;AAEA,SAAS,YAAY,OAAsB;AACzC,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK,QAAQ;AACX,YAAM,WAAW,YAAY,KAAK;AAClC,aAAO,WAAW,aAAa,UAAU,OAAO,KAAK,CAAC,IAAI,eAAe,OAAO,KAAK,CAAC;AAAA,IACxF;AAAA,IACA,KAAK;AACH,aAAO,OAAO,KAAK;AAAA,IACrB,KAAK;AACH,aAAO,MAAM,KAAK,aAAa,YAAY,KAAK,GAAG,OAAO,KAAK,CAAC,CAAC;AAAA,IACnE,KAAK;AACH,aAAO,MAAM,OAAO,aAAa,YAAY,KAAK,GAAG,OAAO,KAAK,CAAC,CAAC;AAAA,IACrE,KAAK;AACH,aAAO,MAAM,OAAO,aAAa,YAAY,KAAK,GAAG,OAAO,KAAK,CAAC,CAAC;AAAA,IACrE,KAAK;AACH,aAAO,MAAM,KAAK,eAAe,OAAO,KAAK,CAAC,CAAC;AAAA,IACjD,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,WAAW,KAAoB;AAAA,IACxC,KAAK,SAAS;AACZ,YAAM,QAAQ;AACd,aAAO,GAAG,MAAM,IAAI,SAAS,CAAC,IAAI,MAAM,QAAQ,EAAE,GAAG,MAAM,OAAO,IAAI,MAAM,IAAI,IAAI,MAAM,IAAI,GAAG,CAAC,KAAK,EAAE,GAAG,KAAK;AAAA,IACnH;AAAA,IACA,KAAK,QAAQ;AACX,YAAM,OAAO,OAAO,KAAK;AACzB,aAAO,gBAAgB,KAAK,KAAK,KAAK,CAAC,IAAI,OAAO;AAAA,IACpD;AAAA,IACA,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO,eAAe,OAAO,KAAK,CAAC;AAAA,EACvC;AACF;AAGO,SAAS,aAAa,QAA6B,WAAW,IAAY;AAC/E,MAAI,CAAC,UAAU,OAAO,WAAW,EAAG,QAAO,eAAe,QAAQ;AAClE,MAAI,MAAM;AACV,aAAW,SAAS,QAAQ;AAC1B,QAAI;AACF,aAAO,YAAY,KAAK;AAAA,IAC1B,QAAQ;AACN,aAAO,OAAO,KAAK;AAAA,IACrB;AAAA,EACF;AACA,SAAO;AACT;;;AC/FA,SAAS,OAAAC,OAAK,QAAAC,cAAY;AAC1B,SAAS,QAAAC,OAAM,WAAAC,gBAAe;;;ACevB,IAAM,YAAY;AACzB,IAAM,WAAW;AAEjB,SAAS,SAAS,QAA6B;AAC7C,SAAO,KAAK,IAAI,KAAK,IAAI,UAAU,aAAa,OAAO,MAAM,CAAC,GAAG,EAAE;AACrE;AAEO,SAAS,YACd,SACA,MACA,OACA,MAAM,WACO;AACb,MAAI,UAAU,CAAC,GAAG,OAAO;AACzB,QAAM,UAAU,CAAC,WACf,KAAK;AAAA,IACH,OAAO,YAAY;AAAA,IACnB,KAAK,IAAI,aAAa,OAAO,MAAM,GAAG,GAAG,KAAK,IAAI,CAAC,QAAQ,aAAa,IAAI,OAAO,GAAG,KAAK,EAAE,CAAC,CAAC;AAAA,EACjG;AACF,MAAI,SAAS,QAAQ,IAAI,OAAO;AAChC,QAAM,QAAQ,MAAM,OAAO,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC,IAAI,MAAM,KAAK,IAAI,GAAG,OAAO,SAAS,CAAC;AAE3F,aAAS;AACP,WAAO,MAAM,IAAI,OAAO;AACtB,UAAI,SAAS;AACb,eAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK,GAAG;AACzC,cAAM,SAAS,QAAQ,CAAC;AACxB,YAAK,OAAO,CAAC,IAAe,SAAS,MAAM,MAAM,SAAS,KAAM,OAAO,CAAC,IAAgB,OAAO,MAAM,IAAe;AAClH,mBAAS;AAAA,QACX;AAAA,MACF;AACA,UAAI,SAAS,EAAG;AAChB,aAAO,MAAM,IAAK,OAAO,MAAM,IAAe;AAAA,IAChD;AACA,QAAI,MAAM,KAAK,SAAS,QAAQ,UAAU,EAAG;AAE7C,cAAU,QAAQ,MAAM,GAAG,EAAE;AAC7B,aAAS,QAAQ,IAAI,OAAO;AAAA,EAC9B;AACA,MAAI,QAAQ,WAAW,KAAK,MAAM,IAAI,MAAO,UAAS,CAAC,KAAK,IAAI,GAAG,KAAK,CAAC;AACzE,SAAO,EAAE,SAAS,SAAS,OAAO;AACpC;AAGO,SAAS,eACd,QACA,OACA,MAAM,WACE;AACR,SAAO,OAAO,QACX,IAAI,CAAC,QAAQ,MAAM;AAClB,UAAM,IAAI,OAAO,OAAO,CAAC;AACzB,UAAM,OAAO,UAAU,MAAM,OAAO,GAAG,KAAK,IAAI,QAAQ,QAAQ,GAAG,GAAG,CAAC;AACvE,WAAO,OAAO,UAAU,UAAU,SAAS,MAAM,CAAC,IAAI,OAAO,MAAM,CAAC;AAAA,EACtE,CAAC,EACA,KAAK,IAAI,OAAO,GAAG,CAAC,EACpB,QAAQ;AACb;AAEO,SAAS,kBAAkB,QAAqB,MAAM,WAAmB;AAC9E,QAAM,QAAgC,CAAC;AACvC,aAAW,UAAU,OAAO,QAAS,OAAM,OAAO,GAAG,IAAI,OAAO;AAChE,SAAO,eAAe,QAAQ,OAAO,GAAG;AAC1C;;;AD1DI,SACE,OAAAC,OADF,QAAAC,aAAA;AAJG,IAAM,QAAQC,MAAK,SAASC,OAAM,EAAE,SAAS,MAAM,OAAO,SAAS,GAAG,MAAM,GAAe;AAChG,QAAM,SAASC,SAAQ,MAAM,YAAY,SAAS,MAAM,KAAK,GAAG,CAAC,SAAS,MAAM,KAAK,CAAC;AACtF,QAAM,QAAQ,KAAK,MAAM,QAAQ,UAAU,SAAY,SAAY,SAAS,KAAK;AACjF,SACE,gBAAAH,MAACI,OAAA,EAAI,eAAc,UAAS,OAC1B;AAAA,oBAAAL,MAACM,QAAA,EAAK,MAAK,gBAAgB,gBAAM,IAAI,kBAAkB,MAAM,CAAC,GAAE;AAAA,IAC/D,MAAM,IAAI,CAAC,KAAK,MACf,gBAAAN,MAACM,QAAA,EAAsB,MAAK,gBACzB,yBAAe,QAAQ,GAAG,KADlB,SAAS,CAEpB,CACD;AAAA,KACH;AAEJ,CAAC;;;AFSO,SAEI,OAAAC,OAFJ,QAAAC,cAAA;AA7BD,SAAS,YAAY,MAAuB;AACjD,MAAI;AACF,WAAO,OAAO,MAAM,KAAK,QAAQ,UAAU,IAAI,GAAG,EAAE,KAAK,KAAK,CAAC;AAAA,EACjE,QAAQ;AACN,WAAO,CAAC,EAAE,MAAM,aAAa,KAAK,MAAM,MAAM,QAAQ,CAAC,EAAE,MAAM,QAAQ,KAAK,MAAM,KAAK,CAAC,EAAE,CAAqB;AAAA,EACjH;AACF;AAIA,SAAS,SAAS,OAAmC;AACnD,QAAM,SAAU,MAA+B;AAC/C,SAAO,MAAM,QAAQ,MAAM,IAAK,SAAqB;AACvD;AAEA,SAASC,QAAO,OAAsB;AACpC,QAAM,OAAQ,MAA6B;AAC3C,SAAO,OAAO,SAAS,WAAW,OAAO,OAAO,MAAM,QAAQ,WAAW,MAAM,MAAM;AACvF;AAEA,SAAS,WAAW,MAAmB,KAAgB,KAAa,WAAW,IAAe;AAC5F,QAAM,QAAQ,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ;AAC5D,QAAM,UAAU,KAAK,MAAM;AAAA,IAAI,CAAC,MAAM,MACpC,KAAK,UAAU,GAAG,QAAQ,CAAC,MAAM,KAAK,OAAQ,KAAK,UAAU,QAAQ,QAAS,MAAM,QAAQ;AAAA,EAC9F;AACA,QAAM,cAAc,KAAK,IAAI,GAAG,QAAQ,IAAI,CAAC,MAAM,UAAU,CAAC,EAAE,MAAM,CAAC,IAAI;AAC3E,SACE,gBAAAF,MAACG,OAAA,EAAc,eAAc,UAC1B,eAAK,MAAM,IAAI,CAAC,MAAM,MACrB,gBAAAF,OAACE,OAAA,EACC;AAAA,oBAAAH,MAACG,OAAA,EAAI,OAAO,aAAa,YAAY,GACnC,0BAAAH,MAACI,QAAA,EAAM,eAAK,UAAU,QAAQ,CAAC,IAAI,MAAM,IAAI,QAAQ,CAAC,CAAW,GAAE,GACrE;AAAA,IACA,gBAAAJ,MAACG,OAAA,EAAI,eAAc,UAAS,OAAO,KAAK,IAAI,GAAG,IAAI,QAAQ,WAAW,GACnE;AAAA,MACC,KAAK;AAAA,MACL,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI,QAAQ,WAAW,GAAG,UAAU,MAAM,KAAK,MAAM,SAAS,KAAK,WAAW,WAAW,OAAU;AAAA,MACxH,GAAG,GAAG,IAAI,CAAC;AAAA,MACX;AAAA,IACF,GACF;AAAA,OAXQ,GAAG,GAAG,IAAI,CAAC,EAYrB,CACD,KAfO,GAgBV;AAEJ;AAEA,SAAS,YAAY,OAAqB,KAAgB,KAAwB;AAChF,QAAM,UAAyB,MAAM,OAAO,IAAI,CAAC,MAAM,OAAO;AAAA,IAC5D,KAAK,OAAO,CAAC;AAAA,IACb,QAAQ,UAAU,aAAa,KAAK,QAAQ,KAAK,IAAI,CAAC;AAAA,IACtD,OAAO,MAAM,MAAM,CAAC,MAAM,UAAU,UAAU;AAAA,EAChD,EAAE;AACF,QAAM,OAAO,MAAM,KAAK,IAAI,CAAC,QAAQ;AACnC,UAAM,SAAiC,CAAC;AACxC,QAAI,QAAQ,CAAC,MAAM,MAAM;AACvB,aAAO,OAAO,CAAC,CAAC,IAAI,UAAU,aAAa,KAAK,QAAQ,KAAK,IAAI,CAAC;AAAA,IACpE,CAAC;AACD,WAAO;AAAA,EACT,CAAC;AACD,SAAO,gBAAAH,MAAC,SAAgB,SAAkB,MAAY,OAAO,IAAI,SAA9C,GAAqD;AAC1E;AAEA,SAAS,YAAY,OAAc,KAAgB,KAAa,UAA6B;AAC3F,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AACH,aACE,gBAAAC,OAACG,QAAA,EAAe,MAAI,MACjB;AAAA,qBAAa,SAAS,KAAK,GAAGF,QAAO,KAAK,CAAC;AAAA,QAC3C;AAAA,WAFQ,GAGX;AAAA,IAEJ,KAAK;AAAA,IACL,KAAK;AACH,aACE,gBAAAD,OAACG,QAAA,EACE;AAAA,qBAAa,SAAS,KAAK,GAAGF,QAAO,KAAK,CAAC;AAAA,QAC3C;AAAA,WAFQ,GAGX;AAAA,IAEJ,KAAK;AACH,aAAO,WAAW,OAAsB,KAAK,KAAK,QAAQ;AAAA,IAC5D,KAAK,QAAQ;AACX,YAAM,QAAQA,QAAO,KAAK,EAAE,QAAQ,OAAO,EAAE,EAAE,MAAM,IAAI;AACzD,aACE,gBAAAF;AAAA,QAACG;AAAA,QAAA;AAAA,UAEC,eAAc;AAAA,UACd,YAAY;AAAA,UACZ,aAAa,MAAM,UAAU,WAAW;AAAA,UACxC,WAAW;AAAA,UACX,aAAa;AAAA,UACb,cAAc;AAAA,UACd,oBAAkB;AAAA,UAClB,aAAa;AAAA,UAEZ,gBAAM,IAAI,CAAC,MAAM,MAChB,gBAAAH,MAACI,QAAA,EAAc,kBAAQ,OAAZ,CAAgB,CAC5B;AAAA;AAAA,QAZI;AAAA,MAaP;AAAA,IAEJ;AAAA,IACA,KAAK;AACH,aACE,gBAAAJ,MAAC,QAAe,MAAK,SAClB,uBAAa,SAAS,KAAK,KAAK,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI,QAAQ,CAAC,EAAE,GAAG,KAAK,KAAK,KAD7E,GAEX;AAAA,IAEJ,KAAK;AACH,aAAO,gBAAAA,MAACI,QAAA,EAAgB,gBAAM,IAAI,MAAM,QAAQ,KAAK,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,KAA/E,GAAiF;AAAA,IACrG,KAAK;AACH,aAAO,YAAY,OAAuB,KAAK,GAAG;AAAA,IACpD,KAAK;AACH,aAAO,gBAAAJ,MAACI,QAAA,EAAgB,gBAAM,IAAIF,QAAO,KAAK,EAAE,KAAK,CAAC,KAApC,GAAsC;AAAA,IAC1D,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO,gBAAAF,MAACI,QAAA,EAAgB,UAAAF,QAAO,KAAK,KAAlB,GAAoB;AAAA,EAC1C;AACF;AAEA,IAAM,cAAc,oBAAI,IAAI,CAAC,aAAa,QAAQ,WAAW,MAAM,CAAC;AAGpE,SAAS,aAAa,QAAiB,KAAgB,WAAmB,SAAS,MAAmB;AACpG,QAAM,SAAS,OAAO,OAAO,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,SAAS,KAAK;AAC1E,QAAM,MAAmB,CAAC;AAC1B,SAAO,QAAQ,CAAC,OAAO,MAAM;AAC3B,UAAM,SAAS,MAAM,OAAO,SAAS;AACrC,UAAM,WAAW,UAAU,IAAI,YAAY,YAAY,IAAI,MAAM,IAAI,IAAI,IAAI,WAAW;AACxF,QAAI;AACJ,QAAI;AACF,aAAO,YAAY,OAAO,KAAK,GAAG,SAAS,IAAI,CAAC,IAAI,QAAQ;AAAA,IAC9D,QAAQ;AACN,aAAO,gBAAAF,MAACI,QAAA,EAAgC,gBAAM,OAA5B,GAAG,SAAS,IAAI,CAAC,EAAe;AAAA,IACpD;AACA,QAAI,UAAU,IAAI,EAAG,KAAI,KAAK,gBAAAJ,MAACI,QAAA,EAAmC,iBAAzB,GAAG,SAAS,IAAI,CAAC,MAAS,CAAO;AAC1E,QAAI,KAAK,IAAI;AACb,QAAI,UAAU,IAAI,YAAY,CAAC,SAAU,KAAI,KAAK,gBAAAJ,MAACI,QAAA,EAAgC,cAAI,YAA1B,GAAG,SAAS,OAAuB,CAAO;AAAA,EACzG,CAAC;AACD,MAAI,OAAO,WAAW,KAAK,IAAI,SAAU,KAAI,KAAK,gBAAAJ,MAACI,QAAA,EAAgC,cAAI,YAA1B,GAAG,SAAS,OAAuB,CAAO;AACvG,SAAO;AACT;AAcO,IAAM,WAAWC,OAAK,SAASC,UAAS,EAAE,MAAM,OAAO,SAAS,GAAkB;AACvF,QAAM,SAASC,SAAQ,MAAM,YAAY,IAAI,GAAG,CAAC,IAAI,CAAC;AACtD,SACE,gBAAAP,MAACG,OAAA,EAAI,eAAc,UAAS,OACzB,uBAAa,QAAQ,EAAE,OAAO,SAAS,GAAG,IAAI,GACjD;AAEJ,CAAC;;;AI9KD,SAAS,OAAAK,OAAK,QAAAC,cAAY;AAC1B,SAAS,QAAAC,cAAY;AA6Bf,gBAAAC,OAOQ,QAAAC,cAPR;AAvBN,IAAM,cAAc;AAEpB,SAAS,OAAO,QAA4B;AAC1C,MAAI,OAAO,OAAQ,QAAO,OAAO;AACjC,MAAI;AACF,WAAO,IAAI,IAAI,OAAO,GAAG,EAAE;AAAA,EAC7B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAOO,IAAM,cAAcC,OAAK,SAASC,aAAY,OAA2E;AAC9H,QAAM,EAAE,SAAS,MAAM,IAAI;AAC3B,QAAM,QAAQ,MAAM,SAAS,mBAAmB;AAChD,QAAM,QAAQ,QAAQ,MAAM,GAAG,WAAW;AAC1C,QAAM,cAAc,OAAO,MAAM,MAAM,EAAE;AACzC,SACE,gBAAAF,OAACG,OAAA,EAAI,eAAc,UAAS,OAC1B;AAAA,oBAAAJ,MAACK,QAAA,EAAM,gBAAM,IAAI,SAAS,GAAE;AAAA,IAC3B,MAAM,IAAI,CAAC,QAAQ,MAAM;AACxB,YAAM,OAAO,OAAO,MAAM;AAC1B,YAAM,QAAQ,SAAS,OAAO,OAAO,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI,QAAQ,cAAc,aAAa,IAAI,IAAI,CAAC,CAAC,CAAC;AAC7G,aACE,gBAAAJ,OAACG,OAAA,EAA+B,OAC9B;AAAA,wBAAAJ,MAACI,OAAA,EAAI,YAAY,GACf,0BAAAH,OAACI,QAAA,EACE;AAAA,gBAAM,IAAI,OAAO,IAAI,CAAC,EAAE,SAAS,WAAW,CAAC;AAAA,UAAE;AAAA,UAAE,QAAQ,UAAU,OAAO,OAAO,GAAG,IAAI;AAAA,WAC3F,GACF;AAAA,QACA,gBAAAL,MAACI,OAAA,EAAI,UAAU,GAAG,YAAY,GAC5B,0BAAAH,OAACI,QAAA,EAAK,MAAK,gBACR;AAAA,kBAAQ,SAAS,OAAO,QAAQ,MAAM,IAAI,IAAI,MAAM,QAAQ,MAAM,IAAI,IAAI,EAAE,IAAI;AAAA,UAChF,QAAQ,KAAK,MAAM,IAAI,KAAK,OAAO,GAAG,EAAE;AAAA,WAC3C,GACF;AAAA,WAXQ,GAAG,CAAC,IAAI,OAAO,GAAG,EAY5B;AAAA,IAEJ,CAAC;AAAA,IACA,QAAQ,SAAS,MAAM,SAAS,gBAAAL,MAACK,QAAA,EAAM,gBAAM,IAAI,IAAI,QAAQ,SAAS,MAAM,MAAM,OAAO,GAAE,IAAU;AAAA,KACxG;AAEJ,CAAC;;;ACrDD,SAAS,OAAAC,OAAK,QAAAC,cAAY;AAC1B,SAAS,QAAAC,cAAY;AAyBqB,gBAAAC,OAiDpC,QAAAC,cAjDoC;AAjB1C,SAASC,UAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAGO,SAAS,cAAc,QAAyB;AACrD,MAAI,MAAM,QAAQ,MAAM,EAAG,QAAO,GAAG,OAAO,MAAM;AAClD,MAAI,CAACA,UAAS,MAAM,EAAG,QAAO;AAC9B,MAAI,OAAO,OAAO,SAAS,OAAO,UAAU,KAAM,QAAO;AACzD,aAAW,OAAO,CAAC,SAAS,cAAc,OAAO,GAAG;AAClD,QAAI,OAAO,OAAO,GAAG,MAAM,SAAU,QAAO,GAAG,OAAO,GAAG,CAAC;AAAA,EAC5D;AACA,QAAM,SAAS,OAAO,OAAO,MAAM,EAAE,OAAO,MAAM,OAAO;AACzD,SAAO,OAAO,WAAW,IAAI,GAAI,OAAO,CAAC,EAAgB,MAAM,WAAW;AAC5E;AAEA,SAAS,MAAM,MAAoB;AACjC,MAAI,KAAK,aAAa,UAAW,QAAO,gBAAAF,MAACG,QAAA,EAAM,gBAAM,QAAQ,MAAM,QAAQ,OAAO,GAAE;AACpF,MAAI,KAAK,aAAa,SAAU,QAAO,gBAAAH,MAACG,QAAA,EAAM,gBAAM,MAAM,MAAM,QAAQ,KAAK,GAAE;AAC/E,MAAI,KAAK,KAAM,QAAO,gBAAAH,MAACG,QAAA,EAAM,gBAAM,UAAU,MAAM,QAAQ,SAAS,GAAE;AACtE,UAAQ,KAAK,OAAO;AAAA,IAClB,KAAK;AACH,aAAO,gBAAAH,MAAC,WAAQ;AAAA,IAClB,KAAK;AACH,aAAO,gBAAAA,MAACG,QAAA,EAAM,gBAAM,UAAU,MAAM,QAAQ,SAAS,GAAE;AAAA,IACzD,KAAK;AACH,aAAO,gBAAAH,MAACG,QAAA,EAAM,gBAAM,QAAQ,MAAM,QAAQ,OAAO,GAAE;AAAA,IACrD,KAAK;AACH,aAAO,gBAAAH,MAACG,QAAA,EAAM,gBAAM,MAAM,MAAM,QAAQ,KAAK,GAAE;AAAA,IACjD;AACE,aAAO,gBAAAH,MAACG,QAAA,EAAM,gBAAM,IAAI,MAAM,QAAQ,KAAK,GAAE;AAAA,EACjD;AACF;AAEA,SAAS,UAAU,MAA4B;AAC7C,MAAI,KAAK,aAAa,UAAW,QAAO,YAAY,KAAK,KAAK;AAC9D,MAAI,KAAK,aAAa,SAAU,QAAO,YAAY,KAAK,KAAK;AAC7D,MAAI,KAAK,KAAM,QAAO,gBAAgB,KAAK,KAAK;AAChD,MAAI,KAAK,UAAU,UAAW,QAAO,GAAG,KAAK,KAAK,GAAG,MAAM,QAAQ,QAAQ;AAC3E,MAAI,KAAK,UAAU,WAAY,QAAO,GAAG,KAAK,KAAK,IAAI,MAAM,IAAI,UAAU,CAAC;AAC5E,SAAO,KAAK;AACd;AAGO,SAAS,mBAAmB,IAAuC;AACxE,MAAI,OAAO,OAAW,QAAO;AAC7B,SAAO,KAAK,MAAM,UAAU,cAAc,EAAE;AAC9C;AAGO,IAAM,cAAcC,OAAK,SAASC,aAAY,EAAE,MAAM,GAAsB;AACjF,eAAa,IAAI;AACjB,QAAM,UAAU,KAAK,IAAI,IAAI;AAC7B,SAAO,WAAW,MAAO,gBAAAL,MAACG,QAAA,EAAM,gBAAM,IAAI,cAAc,OAAO,CAAC,GAAE,IAAU;AAC9E,CAAC;AAQM,IAAM,cAAcC,OAAK,SAASE,aAAY,EAAE,MAAM,OAAO,WAAW,MAAM,GAAqB;AACxG,QAAM,OAAO,OAAO,IAAI;AACxB,MAAI,QAAQ,EAAE,KAAK,UAAU,sBAAsB,CAAC,KAAK,WAAW;AAClE,WACE,gBAAAL,OAACM,OAAA,EAAI,eAAc,UAAS,OAC1B;AAAA,sBAAAP,MAAC,eAAY,UAAU,MAAM,OAAO,KAAK,OAAO,OAAc;AAAA,MAC7D,WAAW,gBAAAA,MAAC,kBAAe,MAAY,OAAc,IAAK;AAAA,OAC7D;AAAA,EAEJ;AACA,QAAM,UAAU,KAAK,UAAU,sBAAsB,CAAC,KAAK,YAAY,CAAC,KAAK;AAC7E,QAAM,UAAU,UACZ,MAAM,UAAU,sBAAsB,IACtC,KAAK,QAAQ,KAAK,aAChB,MAAM,IAAI,QAAQ,KAAK,UAAU,CAAC,IAClC,MAAM,IAAI,KAAK,SAAS,gBAAgB,KAAK,UAAU,WAAW,WAAW,KAAK,WAAW,eAAe,IAAI,IAAI,cAAc,KAAK,MAAM,CAAC;AACpJ,QAAM,WAAW,mBAAmB,KAAK,UAAU;AACnD,QAAM,WAAW,WAAW,MAAM,IAAI,QAAQ,IAAI;AAClD,QAAM,UAAU,KAAK,UAAU,aAAa,KAAK,YAAY;AAC7D,QAAM,aAAa,aAAa,OAAO,IAAI,KAAK,WAAW,aAAa,QAAQ,IAAI;AACpF,QAAM,OAAO,cAAc,KAAK,MAAM,KAAK,IAAI,GAAG,QAAQ,aAAa,UAAU,IAAI,CAAC,IAAI,aAAa,CAAC,CAAC;AACzG,SACE,gBAAAC,OAACM,OAAA,EAAI,eAAc,UAAS,OAC1B;AAAA,oBAAAN,OAACM,OAAA,EAAI,OACF;AAAA,YAAM,IAAI;AAAA,MACX,gBAAAP,MAACO,OAAA,EAAI,UAAU,GAAG,YAAY,GAAG,YAAY,GAC3C,0BAAAN,OAACE,QAAA,EAAK,MAAK,gBACR;AAAA,kBAAU,IAAI;AAAA,QACd,OAAO,MAAM,IAAI,IAAI,MAAM,QAAQ,MAAM,IAAI,IAAI,EAAE,IAAI;AAAA,SAC1D,GACF;AAAA,MACA,gBAAAF,OAACM,OAAA,EAAI,YAAY,GAAG,YAAY,GAC7B;AAAA,kBAAU,gBAAAN,OAACE,QAAA,EAAM;AAAA;AAAA,UAAQ;AAAA,WAAE,IAAU;AAAA,QACrC,WAAW,gBAAAH,MAACG,QAAA,EAAM,oBAAS,IAAU,UAAU,gBAAAH,MAAC,eAAY,OAAO,KAAK,WAAW,IAAK;AAAA,SAC3F;AAAA,OACF;AAAA,IACC,KAAK,SACJ,gBAAAA,MAACG,QAAA,EAAK,MAAK,gBACR,gBAAM,IAAI,KAAK,MAAM,QAAQ,UAAU,IAAI,KAAK,OAAO,OAAO,GAAG,KAAK,OAAO,SAAS,KAAK,KAAK,OAAO,MAAM,MAAM,EAAE,EAAE,GAC1H,IACE;AAAA,IACH,WAAW,gBAAAH,MAAC,kBAAe,MAAY,OAAc,IAAK;AAAA,KAC7D;AAEJ,CAAC;AAGD,SAAS,OAAO,MAAyC;AACvD,MAAI,KAAK,SAAU,QAAO,KAAK;AAC/B,MAAI,CAAC,KAAK,SAAS,KAAK,UAAU,UAAW,QAAO;AACpD,QAAM,QAAQ,OAAO,KAAK,KAAK,UAAU,YAAY,KAAK,KAAK,QAAQ,KAAK,KAAK,QAAQ,KAAK;AAC9F,SAAO,EAAE,IAAI,KAAK,MAAM,YAAY,MAAM,KAAK,MAAM,MAAM,OAAO,QAAQ,UAAU;AACtF;AAEA,SAAS,eAAe,MAA4B;AAClD,QAAM,IAAI,KAAK,SAAS,UAAU;AAClC,MAAI,KAAK,UAAU,UAAW,QAAO;AACrC,SAAO,IAAI,GAAG,CAAC,IAAI,MAAM,IAAI,WAAW,SAAS,KAAK;AACxD;AAGA,SAAS,cAAc,MAA8B;AACnD,QAAM,SAASE,UAAS,KAAK,MAAM,IAAI,KAAK,SAAS,CAAC;AACtD,QAAM,UAAU,MAAM,QAAQ,OAAO,OAAO,IAAI,OAAO,QAAQ,OAAO,CAAC,MAAmB,OAAO,MAAM,QAAQ,IAAI,CAAC;AACpH,QAAM,QAAQ,QAAQ,IAAI,CAAC,MAAM,UAAU,CAAC,EAAE;AAC9C,GAAC,KAAK,WAAW,CAAC,GAAG,QAAQ,CAAC,QAAQ,MAAM,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,OAAO,KAAK,KAAK,MAAM,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;AAC7G,SAAO;AACT;AAGO,IAAM,iBAAiBE,OAAK,SAASI,gBAAe,EAAE,MAAM,MAAM,GAA0C;AACjH,MAAI,KAAK,YAAY,KAAK,WAAW,UAAa,CAAC,KAAK,QAAQ;AAC9D,UAAM,EAAE,OAAO,OAAO,IAAI,UAAU,cAAc,IAAI,EAAE,KAAK,IAAI,GAAG,EAAE;AACtE,WACE,gBAAAP,OAACM,OAAA,EAAI,eAAc,UAAS,YAAY,GAAG,OAAO,KAAK,IAAI,IAAI,QAAQ,CAAC,GACrE;AAAA,YAAM,IAAI,CAAC,MAAM,MAChB,gBAAAN,OAACE,QAAA,EAAa,MAAK,gBAChB;AAAA,cAAM,IAAI,MAAM,QAAQ,MAAM;AAAA,QAAE;AAAA,QAAE;AAAA,WAD1B,CAEX,CACD;AAAA,MACA,SAAS,IAAI,gBAAAH,MAACG,QAAA,EAAM,gBAAM,IAAI,MAAM,MAAM,QAAQ,GAAE,IAAU;AAAA,OACjE;AAAA,EAEJ;AACA,QAAM,SAAmC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC;AAC7D,MAAI,KAAK,WAAW,OAAW,QAAO,KAAK,CAAC,UAAU,KAAK,MAAM,CAAC;AAClE,SACE,gBAAAH,MAACO,OAAA,EAAI,eAAc,UAAS,YAAY,GAAG,OAAO,KAAK,IAAI,IAAI,QAAQ,CAAC,GACrE,iBAAO,IAAI,CAAC,CAAC,OAAO,KAAK,MAAM;AAC9B,UAAM,EAAE,OAAO,OAAO,IAAI,UAAU,SAAS,KAAK,GAAG,EAAE;AACvD,WACE,gBAAAN,OAACM,OAAA,EAAgB,eAAc,UAC7B;AAAA,sBAAAP,MAACG,QAAA,EAAM,gBAAM,IAAI,KAAK,GAAE;AAAA,MACvB,MAAM,IAAI,CAAC,MAAM,MAChB,gBAAAF,OAACE,QAAA,EAAa,MAAK,gBAChB;AAAA,cAAM,IAAI,MAAM,QAAQ,MAAM;AAAA,QAAE;AAAA,QAAE;AAAA,WAD1B,CAEX,CACD;AAAA,MACA,SAAS,IAAI,gBAAAH,MAACG,QAAA,EAAM,gBAAM,IAAI,MAAM,MAAM,QAAQ,GAAE,IAAU;AAAA,SAPvD,KAQV;AAAA,EAEJ,CAAC,GACH;AAEJ,CAAC;;;APhJK,SAEI,OAAAM,OAFJ,QAAAC,cAAA;AAlBC,IAAM,mBAAmB;AAChC,IAAM,iBAAiB;AACvB,IAAM,mBAAmB;AAIzB,SAAS,YAAY,MAAoE;AACvF,MAAI,SAAS,QAAS,QAAO,MAAM,MAAM,MAAM,QAAQ,KAAK;AAC5D,MAAI,SAAS,UAAW,QAAO,MAAM,QAAQ,MAAM,QAAQ,OAAO;AAClE,MAAI,SAAS,YAAa,QAAO,MAAM,UAAU,MAAM,QAAQ,SAAS;AACxE,SAAO,MAAM,IAAI,MAAM,QAAQ,GAAG;AACpC;AAEA,SAAS,SAAS,EAAE,MAAM,MAAM,GAAoC;AAClE,QAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,QAAM,QAAQ,MAAM,MAAM,GAAG,cAAc;AAC3C,SACE,gBAAAD,MAACE,OAAA,EAAI,WAAW,GACd,0BAAAD,OAAC,QAAK,MAAK,UAAS,OACjB;AAAA,UAAM,IAAI,CAAC,MAAM,MAChB,gBAAAD,MAACG,QAAA,EAAa,MAAK,QAChB,kBAAQ,OADA,CAEX,CACD;AAAA,IACA,MAAM,SAAS,iBAAiB,gBAAAH,MAACG,QAAA,EAAM,gBAAM,IAAI,IAAI,MAAM,SAAS,cAAc,QAAQ,GAAE,IAAU;AAAA,KACzG,GACF;AAEJ;AAGO,IAAM,YAAYC,OAAK,SAASC,WAAU,EAAE,OAAO,MAAM,GAAyC;AACvG,QAAM,QAAQ,KAAK,IAAI,IAAI,QAAQ,gBAAgB;AACnD,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK,UAAU;AACb,YAAM,OAAO,KAAK,IAAI,GAAG,QAAQ,aAAa,MAAM,IAAI,IAAI,aAAa,MAAM,KAAK,CAAC;AACrF,aACE,gBAAAJ,OAACC,OAAA,EAAI,eAAc,UAAS,OAC1B;AAAA,wBAAAD,OAACE,QAAA,EAAK,MAAK,gBACR;AAAA,gBAAM;AAAA,UACN,IAAI,OAAO,IAAI;AAAA,UACf,MAAM,IAAI,MAAM,KAAK;AAAA,WACxB;AAAA,QACA,gBAAAH,MAACG,QAAA,EAAM,gBAAM,IAAI,MAAM,QAAQ,KAAK,OAAO,KAAK,CAAC,GAAE;AAAA,SACrD;AAAA,IAEJ;AAAA,IACA,KAAK;AACH,aAAO,gBAAAH,MAAC,YAAS,MAAM,MAAM,MAAM,OAAc;AAAA,IACnD,KAAK;AACH,aACE,gBAAAA,MAACE,OAAA,EAAI,WAAW,GACd,0BAAAD,OAACE,QAAA,EACE;AAAA,cAAM,OAAO,MAAM,QAAQ,GAAG;AAAA,QAAE;AAAA,QAAE,MAAM,KAAK,QAAQ;AAAA,SACxD,GACF;AAAA,IAEJ,KAAK;AACH,aACE,gBAAAH,MAACE,OAAA,EAAI,aAAa,kBAAkB,WAAW,MAAM,MAAM,IAAI,GAAG,OAChE,0BAAAF,MAAC,YAAS,MAAM,MAAM,MAAM,OAAO,OAAO,GAC5C;AAAA,IAEJ,KAAK;AACH,aACE,gBAAAA,MAACE,OAAA,EAAI,aAAa,kBAAkB,WAAW,MAAM,MAAM,IAAI,GAAG,OAChE,0BAAAF,MAAC,eAAY,MAAM,MAAM,MAAM,OAAO,OAAO,GAC/C;AAAA,IAEJ,KAAK;AACH,aACE,gBAAAC,OAACC,OAAA,EAAI,aAAa,kBAAkB,eAAc,UAAS,OACzD;AAAA,wBAAAF,MAACG,QAAA,EAAM,gBAAM,IAAI,GAAG,MAAM,QAAQ,QAAQ,IAAI,MAAM,KAAK,KAAK,EAAE,GAAE;AAAA,QAClE,gBAAAH,MAAC,kBAAe,MAAM,MAAM,MAAM,OAAO,OAAO;AAAA,SAClD;AAAA,IAEJ,KAAK;AACH,aACE,gBAAAA,MAACE,OAAA,EAAI,aAAa,kBAAkB,OAClC,0BAAAF,MAAC,eAAY,UAAU,MAAM,UAAU,OAAO,OAAO,GACvD;AAAA,IAEJ,KAAK;AACH,aACE,gBAAAA,MAACE,OAAA,EAAI,aAAa,kBAAkB,WAAW,GAAG,OAChD,0BAAAF,MAAC,eAAY,SAAS,MAAM,SAAS,OAAO,OAAO,GACrD;AAAA,IAEJ,KAAK;AACH,aACE,gBAAAC,OAACC,OAAA,EAAI,aAAa,kBAAkB,WAAW,GAAG,eAAc,UAAS,OACvE;AAAA,wBAAAD,OAACE,QAAA,EAAK,MAAK,QACR;AAAA,sBAAY,MAAM,IAAI;AAAA,UAAE;AAAA,UAAE,MAAM,SAAS,UAAU,MAAM,MAAM,MAAM,IAAI,IAAI,MAAM,SAAS,SAAS,MAAM,IAAI,MAAM,IAAI,IAAI,MAAM;AAAA,WACtI;AAAA,QACC,MAAM,OAAO,gBAAAH,MAACG,QAAA,EAAK,MAAK,QAAQ,gBAAM,IAAI,KAAK,MAAM,QAAQ,UAAU,IAAI,MAAM,IAAI,EAAE,GAAE,IAAU;AAAA,SACtG;AAAA,IAEJ;AACE,aAAO;AAAA,EACX;AACF,CAAC;AAGM,SAAS,aAAa,MAAc,OAAe,UAAoD;AAC5G,MAAI,eAAe,MAAM,KAAK,KAAK,SAAU,QAAO,EAAE,MAAM,QAAQ,EAAE;AACtE,QAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,QAAM,OAAiB,CAAC;AACxB,MAAI,OAAO;AACX,WAAS,IAAI,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG;AAC7C,UAAM,IAAI,eAAe,MAAM,CAAC,GAAa,KAAK;AAClD,QAAI,OAAO,IAAI,SAAU;AACzB,SAAK,QAAQ,MAAM,CAAC,CAAW;AAC/B,YAAQ;AAAA,EACV;AACA,SAAO,EAAE,MAAM,KAAK,KAAK,IAAI,GAAG,QAAQ,MAAM,SAAS,KAAK,OAAO;AACrE;AAEA,SAAS,YAAY,EAAE,KAAK,GAAuB;AACjD,eAAa,IAAI;AACjB,QAAM,UAAU,KAAK,IAAI,IAAI,KAAK;AAClC,QAAM,QAAQ,KAAK,MAAM,WAAW;AACpC,MAAI,CAAC,SAAS,UAAU,iBAAkB,QAAO;AACjD,QAAM,QAAQ,SAAS,UAAU,mBAAmB,mBAAc;AAClE,SACE,gBAAAH,MAACE,OAAA,EAAI,aAAa,kBAChB,0BAAAF,MAAC,WAAQ,OAAO,MAAM,IAAI,GAAG,KAAK,IAAI,cAAc,KAAK,IAAI,KAAK,QAAQ,KAAK,YAAY,KAAK,YAAY,CAAC,EAAE,GAAG,GACpH;AAEJ;AAGO,SAAS,QAAQ,MAA8C,MAAyB;AAC7F,MAAI,KAAK,SAAS,OAAQ,QAAO,SAAS,cAAc,SAAS;AACjE,SAAO,SAAS,UAAU,SAAS,cAAc,KAAK,YAAY;AACpE;AAEA,IAAM,eAAeI,OAAK,SAASE,cAAa,OAO7C;AACD,QAAM,EAAE,MAAM,OAAO,UAAU,QAAQ,UAAU,IAAI,IAAI;AACzD,MAAI,KAAK,SAAS,QAAQ;AACxB,WACE,gBAAAN,MAACE,OAAA,EAAI,WAAW,MAAM,IAAI,GACxB,0BAAAF,MAAC,eAAY,MAAM,KAAK,MAAM,OAAc,UAAoB,GAClE;AAAA,EAEJ;AACA,QAAM,UAAU,KAAK,KAAK,MAAM,KAAK,SAAS;AAC9C,MAAI,CAAC,WAAW,CAAC,OAAQ,QAAO;AAChC,QAAM,UAAU,aAAa,SAAS,OAAO,QAAQ;AACrD,SACE,gBAAAC,OAACC,OAAA,EAAI,eAAc,UAAS,OAAc,WAAW,MAAM,IAAI,GAC5D;AAAA,YAAQ,SAAS,IAAI,gBAAAF,MAACG,QAAA,EAAM,gBAAM,IAAI,GAAG,MAAM,QAAQ,QAAQ,IAAI,QAAQ,MAAM,+BAA+B,GAAE,IAAU;AAAA,IAC7H,gBAAAH,MAAC,YAAS,MAAM,QAAQ,MAAM,OAAc,UAAU,SAAS,MAAM,OAAO,MAAM,QAAQ,MAAM,IAAI,QAAW;AAAA,KACjH;AAEJ,CAAC;AAGM,SAAS,SAAS,OAAsG;AAC7H,QAAM,EAAE,MAAM,OAAO,aAAa,UAAU,UAAU,IAAI;AAC1D,QAAM,QAAQ,KAAK,IAAI,IAAI,QAAQ,gBAAgB;AACnD,QAAM,OAAO,KAAK,MAAM,KAAK,MAAM,SAAS,CAAC;AAC7C,QAAM,QAAQ,KAAK,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE;AAC1D,QAAM,aAAa,KAAK,IAAI,GAAG,WAAW,QAAQ,CAAC;AACnD,SACE,gBAAAC,OAACC,OAAA,EAAI,eAAc,UAAS,OAC1B;AAAA,oBAAAF,MAACE,OAAA,EAAI,eAAc,UAAS,aAAa,kBAAkB,OACxD,eAAK,MAAM,IAAI,CAAC,MAAM,MAAM;AAC3B,YAAM,SAAS,KAAK,MAAM,IAAI,CAAC;AAC/B,YAAM,OAAO,SAAU,OAAO,SAAS,SAAS,SAAS,SAAU,KAAK;AACxE,aACE,gBAAAF;AAAA,QAAC;AAAA;AAAA,UAEC;AAAA,UACA,OAAO;AAAA,UACP,UAAU;AAAA,UACV,QAAQ,aAAa,SAAS,QAAQ,KAAK,SAAS;AAAA,UACpD,UAAU;AAAA,UACV,KAAK,QAAQ,MAAM,IAAI;AAAA;AAAA,QANlB,KAAK;AAAA,MAOZ;AAAA,IAEJ,CAAC,GACH;AAAA,IACC,YAAY,gBAAAA,MAAC,eAAY,MAAY,IAAK;AAAA,KAC7C;AAEJ;;;AQvMA,SAAS,aAAa,cAAc;AAuB7B,SAAS,gBAAgB,MAA4D;AAC1F,QAAM,EAAE,SAAS,UAAU,WAAW,cAAc,QAAQ,YAAY,IAAI;AAC5E,QAAM,EAAE,MAAM,IAAI;AAClB,QAAM,eAAe,OAAsD,IAAI;AAE/E,QAAM,oBAAoB;AAAA,IACxB,CAAC,iBAAmC;AAClC,UAAI,CAAC,SAAS,iBAAkB;AAChC,mBAAa,YAAY,SAAS,iBAAiB,EAAE,MAAM,MAAM,IAAI;AACrE,WAAK,aAAa,QAAQ,KAAK,CAAC,WAAW;AACzC,mBAAW,QAAQ,mBAAmB,cAAc,MAAM,EAAG,SAAQ,SAAS,EAAE,MAAM,UAAU,MAAM,QAAQ,KAAK,CAAC;AAAA,MACtH,CAAC;AAAA,IACH;AAAA,IACA,CAAC,UAAU,OAAO;AAAA,EACpB;AAEA,QAAM,gBAAgB;AAAA,IACpB,CAAC,KAAoB,QAAgB;AACnC,UAAI,CAAC,KAAK;AACR,gBAAQ,SAAS,EAAE,MAAM,UAAU,MAAM,QAAQ,MAAM,GAAG,GAAG,IAAI,MAAM,aAAa,GAAG,CAAC,IAAI,MAAM,QAAQ,MAAM,KAAK,GAAG,uBAAuB,CAAC;AAChJ;AAAA,MACF;AACA,UAAI;AACJ,UAAI;AACF,gBAAQ,oBAAoB,KAAK,GAAG;AAAA,MACtC,SAAS,OAAO;AACd,gBAAQ,SAAS,EAAE,MAAM,UAAU,MAAM,SAAS,MAAM,WAAW,KAAK,EAAE,QAAQ,QAAQ,OAAO,GAAG,EAAE,CAAC;AACvG;AAAA,MACF;AACA,YAAM,OAAO,EAAE,GAAG,MAAM,cAAc,CAAC,GAAG,GAAG,MAAM;AACnD,cAAQ,SAAS,EAAE,MAAM,kBAAkB,KAAK,MAAM,CAAC;AACvD,UAAI,QAAQ;AACZ,UAAI;AACF,iBAAS,sBAAsB,IAAI;AACnC,gBAAQ,QAAQ,SAAS,mBAAmB;AAAA,MAC9C,QAAQ;AACN,gBAAQ;AAAA,MACV;AACA,YAAM,QAAQ,MAAM,SAAS,aAAa,gCAAgC;AAC1E,cAAQ,SAAS;AAAA,QACf,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM,GAAG,GAAG,IAAI,KAAK,GAAG,KAAK,GAAG,QAAQ,IAAI,MAAM,QAAQ,MAAM,sBAAsB,SAAS,WAAW,KAAK,EAAE;AAAA,MACnH,CAAC;AACD,UAAI,MAAM,SAAS,WAAY,mBAAkB,IAAI;AAAA,IACvD;AAAA,IACA,CAAC,SAAS,UAAU,MAAM,cAAc,MAAM,MAAM,iBAAiB;AAAA,EACvE;AAEA,SAAO;AAAA,IACL,CAAC,MAAc,QAAgB;AAC7B,cAAQ,MAAM;AAAA,QACZ,KAAK;AACH,kBAAQ,SAAS,EAAE,MAAM,aAAa,CAAC;AACvC,kBAAQ,SAAS,EAAE,MAAM,UAAU,MAAM,QAAQ,MAAM,YAAY,MAAM,QAAQ,MAAM,IAAI,MAAM,IAAI,GAAG,CAAC;AACzG;AAAA,QACF,KAAK;AACH,sBAAY;AACZ;AAAA,QACF,KAAK,QAAQ;AACX,gBAAM,OAAO,UAAU,GAAG;AAC1B,cAAI,CAAC,KAAM,SAAQ,SAAS,EAAE,MAAM,UAAU,MAAM,SAAS,MAAM,qCAAqC,CAAC;AAAA,eACpG;AACH,oBAAQ,SAAS,EAAE,MAAM,YAAY,KAAK,CAAC;AAC3C,oBAAQ,SAAS,EAAE,MAAM,UAAU,MAAM,QAAQ,MAAM,QAAQ,IAAI,IAAI,MAAM,QAAQ,MAAM,YAAY,CAAC;AAAA,UAC1G;AACA;AAAA,QACF;AAAA,QACA,KAAK,SAAS;AACZ,cAAI,CAAC,KAAK;AACR,kBAAM,UAAU,MAAM,WAAW;AACjC,qBACG,WAAW,EAAE,MAAM,MAAM,MAAM,UAAU,CAAC,EAC1C,KAAK,CAAC,EAAE,OAAO,MAAM;AACpB,oBAAM,OAAO,OAAO,IAAI,CAAC,MAAM,GAAG,EAAE,OAAO,UAAU,GAAG,MAAM,QAAQ,OAAO,MAAM,IAAI,GAAG,EAAE,EAAE,KAAK,EAAE,WAAW,GAAG,EAAE,SAAS,KAAK,EAAE,WAAW,WAAW,EAAE,EAAE;AAC/J,sBAAQ,SAAS,EAAE,MAAM,UAAU,MAAM,QAAQ,MAAM,CAAC,UAAU,OAAO,+BAA4B,GAAG,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;AAAA,YAC5H,CAAC,EACA,MAAM,MAAM,QAAQ,SAAS,EAAE,MAAM,UAAU,MAAM,QAAQ,MAAM,UAAU,OAAO,IAAI,MAAM,QAAQ,MAAM,8BAA8B,CAAC,CAAC;AAC/I;AAAA,UACF;AACA,gBAAM,UAAU,QAAQ,SAAS,SAAY;AAC7C,kBAAQ,SAAS,EAAE,MAAM,aAAa,QAAQ,CAAC;AAC/C,kBAAQ,SAAS,EAAE,MAAM,UAAU,MAAM,QAAQ,MAAM,SAAS,WAAW,MAAM,yBAAyB,CAAC;AAC3G;AAAA,QACF;AAAA,QACA,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AACH,wBAAc,MAAM,GAAG;AACvB;AAAA,QACF,KAAK;AACH,kBAAQ,SAAS,EAAE,MAAM,UAAU,MAAM,QAAQ,MAAM,UAAU,CAAC;AAClE;AAAA,QACF,KAAK;AACH,iBAAO,eAAe,SAAS,MAAM;AACrC;AAAA,QACF,KAAK;AAAA,QACL,KAAK;AACH,iBAAO,MAAM;AACb;AAAA,QACF;AACE,kBAAQ,SAAS,EAAE,MAAM,UAAU,MAAM,SAAS,MAAM,oBAAoB,IAAI,IAAI,MAAM,8BAA8B,CAAC;AAAA,MAC7H;AAAA,IACF;AAAA,IACA,CAAC,SAAS,MAAM,MAAM,MAAM,SAAS,aAAa,QAAQ,cAAc,UAAU,WAAW,aAAa;AAAA,EAC5G;AACF;;;ACjIA,SAAS,eAAAO,cAAa,aAAAC,YAAW,cAAAC,aAAY,UAAAC,SAAQ,YAAAC,iBAAgB;;;ACCrE,SAAwB,aAAAC,YAAW,UAAAC,eAAc;AAMjD,IAAM,oBAAoB,IAAI;AAE9B,SAAS,cAAc,OAAkC;AACvD,QAAM,QAAQ,MAAM,MAAM,SAAS,CAAC;AACpC,SAAO,MAAM,QAAQ,CAAC,SAAU,KAAK,SAAS,UAAU,KAAK,KAAK,WAAW,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAE;AACzG;AAEO,SAAS,oBAAoB,OAAkB,UAAgC,UAA4B;AAChH,QAAM,WAAWC,QAAO,oBAAI,IAA6B,CAAC;AAC1D,QAAM,QAAQA,QAAO,IAAI;AACzB,EAAAC;AAAA,IACE,MAAM,MAAM;AACV,YAAM,UAAU;AAAA,IAClB;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,QAAQ,cAAc,KAAK;AACjC,QAAM,MAAM,MAAM,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,IAAI,EAAE,cAAc,IAAI,CAAC,IAAI,EAAE,WAAW,IAAI,CAAC,EAAE,EAAE,KAAK,GAAG;AAE3G,EAAAA,WAAU,MAAM;AACd,UAAM,OAAO,CAAC,WAAuB;AACnC,UAAI,MAAM,QAAS,UAAS,MAAM;AAAA,IACpC;AACA,UAAM,WAAW,OAAO,SAAuB;AAC7C,UAAI;AACF,cAAM,MAAM,SAAS,qBAAqB,MAAM,SAAS,mBAAmB,KAAK,IAAI,KAAK,IAAI,IAAI;AAClG,aAAK,EAAE,MAAM,mBAAmB,YAAY,KAAK,IAAI,GAAI,MAAM,EAAE,YAAY,IAAI,IAAI,CAAC,EAAG,CAAC;AAAA,MAC5F,QAAQ;AACN,aAAK,EAAE,MAAM,mBAAmB,YAAY,KAAK,GAAG,CAAC;AAAA,MACvD;AAAA,IACF;AACA,eAAW,QAAQ,OAAO;AACxB,UAAI,KAAK,SAAU;AACnB,YAAM,OAAO,SAAS,QAAQ,IAAI,KAAK,EAAE;AACzC,UAAI,KAAK,WAAW,aAAa,SAAS,QAAQ;AAChD,iBAAS,QAAQ,IAAI,KAAK,IAAI,MAAM;AACpC,cAAMC,eAAc,SAAS;AAC7B,YAAI,CAACA,cAAa;AAChB,eAAK,EAAE,MAAM,mBAAmB,YAAY,KAAK,IAAI,SAAS,KAAK,CAAC;AACpE;AAAA,QACF;AACA,cAAM,YAAY;AAChB,cAAI;AACF,kBAAM,EAAE,UAAU,SAAS,IAAI,MAAM,gBAAgB,MAAMA,aAAY,KAAK,EAAE,GAAG,EAAE,WAAW,kBAAkB,CAAC;AACjH,gBAAI,CAAC,YAAY,UAAU;AACzB,mBAAK,EAAE,MAAM,mBAAmB,YAAY,KAAK,IAAI,SAAS,KAAK,CAAC;AACpE;AAAA,YACF;AACA,kBAAM,MACJ,SAAS,WAAW,WAAW,SAAS,cAAc,SAAS,qBAC3D,MAAM,SAAS,mBAAmB,KAAK,IAAI,KAAK,IAAI,EAAE,MAAM,MAAM,MAAS,IAC3E;AACN,iBAAK;AAAA,cACH,MAAM;AAAA,cACN,YAAY,KAAK;AAAA,cACjB,QAAQ,SAAS;AAAA,cACjB,OAAO,SAAS;AAAA,cAChB,GAAI,MAAM,EAAE,YAAY,IAAI,IAAI,CAAC;AAAA,cACjC,GAAI,SAAS,QAAQ,EAAE,SAAS,SAAS,MAAM,IAAI,CAAC;AAAA,YACtD,CAAC;AAAA,UACH,QAAQ;AACN,iBAAK,EAAE,MAAM,mBAAmB,YAAY,KAAK,IAAI,SAAS,KAAK,CAAC;AAAA,UACtE;AAAA,QACF,GAAG;AAAA,MACL,WAAW,KAAK,WAAW,WAAW,KAAK,eAAe,CAAC,MAAM;AAC/D,iBAAS,QAAQ,IAAI,KAAK,IAAI,MAAM;AACpC,aAAK,SAAS,IAAI;AAAA,MACpB;AAAA,IACF;AAAA,EAEF,GAAG,CAAC,KAAK,UAAU,QAAQ,CAAC;AAC9B;;;ADxEO,IAAM,oBAAoB;AACjC,IAAM,gBAAgB;AAaf,SAAS,eAAe,MAA0B;AACvD,QAAM,EAAE,UAAU,UAAU,IAAI;AAChC,QAAM,CAAC,OAAO,QAAQ,IAAIC;AAAA,IAAW;AAAA,IAAa;AAAA,IAAM,CAAC,MACvD,iBAAiB;AAAA,MACf,MAAM,EAAE;AAAA,MACR,UAAU,EAAE;AAAA,MACZ,SAAS,EAAE;AAAA,MACX,cAAc,EAAE,gBAAgB,EAAE,SAAS,mBAAmB;AAAA,MAC9D,OAAO,QAAQ,EAAE,SAAS,UAAU;AAAA,IACtC,CAAC;AAAA,EACH;AACA,QAAM,WAAWC,QAAO,KAAK;AAC7B,WAAS,UAAU;AACnB,QAAM,SAASA,QAAqB,CAAC,CAAC;AACtC,QAAM,WAAWA,QAA+B,IAAI;AACpD,QAAM,UAAUA,QAAO,IAAI;AAC3B,QAAM,CAAC,OAAO,QAAQ,IAAIC,UAAmB,CAAC,CAAC;AAC/C,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAgC,IAAI;AACpE,QAAM,CAAC,SAAS,UAAU,IAAIA;AAAA,IAC5B,KAAK,WAAW,EAAE,OAAO,4BAAuB,OAAO,KAAK,IAAI,EAAE,IAAI;AAAA,EACxE;AAEA,QAAM,QAAQC,aAAY,MAAM;AAC9B,UAAM,SAAS,OAAO,QAAQ,OAAO,CAAC;AACtC,eAAW,SAAS,OAAQ,UAAS,KAAK;AAAA,EAC5C,GAAG,CAAC,CAAC;AAGL,EAAAC,WAAU,MAAM;AACd,QAAI,CAAC,MAAM,UAAW,QAAO;AAC7B,UAAM,KAAK,YAAY,MAAM;AAC3B,YAAM;AACN,eAAS,EAAE,MAAM,OAAO,CAAC;AAAA,IAC3B,GAAG,iBAAiB;AACpB,WAAO,MAAM,cAAc,EAAE;AAAA,EAC/B,GAAG,CAAC,MAAM,WAAW,KAAK,CAAC;AAE3B,EAAAA;AAAA,IACE,MAAM,MAAM;AACV,cAAQ,UAAU;AAClB,eAAS,SAAS,MAAM;AAAA,IAC1B;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,OAAOD;AAAA,IACX,CAAC,SAAiB;AAChB,YAAM,UAAU,KAAK,KAAK;AAC1B,UAAI,CAAC,QAAS;AACd,UAAI,SAAS,QAAQ,WAAW;AAC9B,iBAAS,CAAC,MAAM,CAAC,GAAG,GAAG,OAAO,CAAC;AAC/B;AAAA,MACF;AACA,eAAS,EAAE,MAAM,UAAU,MAAM,SAAS,IAAI,KAAK,IAAI,EAAE,CAAC;AAC1D,YAAM,aAAa,IAAI,gBAAgB;AACvC,eAAS,UAAU;AACnB,YAAM,EAAE,MAAM,UAAU,SAAS,aAAa,IAAI,SAAS;AAC3D,YAAM,YAAY;AAChB,YAAI;AACF,gBAAM,UAAU,EAAE,MAAM,SAAS,UAAU,SAAS,WAAW,GAAG,wBAAwB,MAAM,YAAY,EAAE;AAC9G,gBAAM,SAAS,SAAS,WAAW,SAAS,WAAW,MAAM;AAC7D,2BAAiB,SAAS,OAAQ,QAAO,QAAQ,KAAK,EAAE,GAAG,OAAO,IAAI,KAAK,IAAI,EAAE,CAAC;AAClF,cAAI,CAAC,QAAQ,QAAS;AACtB,gBAAM;AACN,mBAAS,EAAE,MAAM,OAAO,CAAC;AAAA,QAC3B,SAAS,OAAO;AACd,cAAI,CAAC,QAAQ,QAAS;AACtB,gBAAM;AACN,gBAAM,YAAY,WAAW,OAAO,WAAY,WAAW,KAAK,KAAK,MAAM,aAAa;AACxF,gBAAM,MAAM,WAAW,KAAK;AAC5B,mBAAS;AAAA,YACP,MAAM;AAAA,YACN,SAAS,YAAY,YAAY,IAAI;AAAA,YACrC,MAAM,YAAY,SAAY,IAAI;AAAA,YAClC;AAAA,YACA,IAAI,KAAK,IAAI;AAAA,UACf,CAAC;AAAA,QACH,UAAE;AACA,cAAI,SAAS,YAAY,WAAY,UAAS,UAAU;AAAA,QAC1D;AAAA,MACF,GAAG;AAAA,IACL;AAAA,IACA,CAAC,UAAU,WAAW,KAAK;AAAA,EAC7B;AAEA,QAAM,YAAYA,aAAY,MAAe;AAC3C,QAAI,CAAC,SAAS,QAAS,QAAO;AAC9B,aAAS,QAAQ,MAAM;AACvB,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AAGL,EAAAC,WAAU,MAAM;AACd,QAAI,MAAM,aAAa,MAAM,UAAU,SAAS,KAAK,MAAM,WAAW,EAAG;AACzE,UAAM,CAAC,MAAM,GAAG,IAAI,IAAI;AACxB,aAAS,IAAI;AACb,QAAI,KAAM,MAAK,IAAI;AAAA,EACrB,GAAG,CAAC,MAAM,WAAW,MAAM,UAAU,QAAQ,OAAO,IAAI,CAAC;AAEzD,QAAM,SAASD;AAAA,IACb,OAAO,UAA2B,aAA6B;AAC7D,UAAI,aAAa,SAAS;AACxB,iBAAS,EAAE,MAAM,oBAAoB,YAAY,SAAS,YAAY,UAAU,IAAI,KAAK,IAAI,EAAE,CAAC;AAChG;AAAA,MACF;AACA,kBAAY,QAAQ;AACpB,UAAI;AACF,cAAM,OAAO,MAAM,SAAS,eAAe,SAAS,YAAY,UAAU,EAAE,MAAM,SAAS,QAAQ,MAAM,UAAU,CAAC;AACpH,YAAI,CAAC,QAAQ,QAAS;AACtB,iBAAS,EAAE,MAAM,oBAAoB,YAAY,SAAS,YAAY,UAAU,MAAM,KAAK,WAAW,MAAM,IAAI,KAAK,IAAI,EAAE,CAAC;AAAA,MAC9H,SAAS,OAAO;AACd,YAAI,CAAC,QAAQ,QAAS;AACtB,cAAM,MAAM,WAAW,KAAK;AAC5B,iBAAS;AAAA,UACP,MAAM;AAAA,UACN,YAAY,SAAS;AAAA,UACrB;AAAA,UACA,OAAO,IAAI,OAAO,GAAG,IAAI,OAAO,KAAK,IAAI,IAAI,KAAK,IAAI;AAAA,UACtD,IAAI,KAAK,IAAI;AAAA,QACf,CAAC;AAAA,MACH,UAAE;AACA,YAAI,QAAQ,QAAS,aAAY,IAAI;AAAA,MACvC;AAAA,IACF;AAAA,IACA,CAAC,UAAU,SAAS;AAAA,EACtB;AAEA,QAAM,SAASA;AAAA,IACb,OAAO,UAAkB,UAAmB;AAC1C,iBAAW,EAAE,OAAO,4BAAuB,OAAO,KAAK,IAAI,EAAE,CAAC;AAC9D,UAAI;AACF,cAAM,OAAO,MAAM,SAAS,kBAAkB,UAAU,EAAE,MAAM,SAAS,QAAQ,MAAM,UAAU,CAAC;AAClG,YAAI,CAAC,QAAQ,QAAS;AACtB,cAAM,WAAW,KAAK,SACnB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,YAAY,EAAE,OAAO,EAAE,EAAE,EAC3D,OAAO,CAAC,MAAM,EAAE,KAAK,KAAK,CAAC,EAC3B,MAAM,CAAC,aAAa;AACvB,iBAAS,EAAE,MAAM,UAAU,MAAM,QAAQ,MAAM,WAAW,QAAQ,SAAI,KAAK,WAAM,QAAQ,cAAW,SAAS,MAAM,YAAY,CAAC;AAChI,iBAAS,EAAE,MAAM,WAAW,UAAU,SAAS,CAAC;AAAA,MAClD,SAAS,OAAO;AACd,YAAI,CAAC,QAAQ,QAAS;AACtB,cAAM,MAAM,WAAW,KAAK;AAC5B,iBAAS,EAAE,MAAM,UAAU,MAAM,SAAS,MAAM,8BAA8B,IAAI,OAAO,IAAI,MAAM,IAAI,KAAK,CAAC;AAAA,MAC/G,UAAE;AACA,YAAI,QAAQ,QAAS,YAAW,IAAI;AAAA,MACtC;AAAA,IACF;AAAA,IACA,CAAC,UAAU,SAAS;AAAA,EACtB;AAGA,QAAM,SAASF,QAAO,KAAK;AAC3B,EAAAG,WAAU,MAAM;AACd,QAAI,OAAO,QAAS;AACpB,WAAO,UAAU;AACjB,UAAM,YAAY;AAChB,UAAI,KAAK,SAAU,OAAM,OAAO,KAAK,QAAQ;AAC7C,UAAI,KAAK,kBAAkB,QAAQ,QAAS,MAAK,KAAK,cAAc;AAAA,IACtE,GAAG;AAAA,EACL,GAAG,CAAC,KAAK,UAAU,KAAK,gBAAgB,QAAQ,IAAI,CAAC;AAErD,sBAAoB,OAAO,UAAU,QAAQ;AAE7C,SAAO,EAAE,OAAO,UAAU,MAAM,WAAW,QAAQ,UAAU,OAAO,UAAU,QAAQ,QAAQ;AAChG;;;AjBzHS,gBAAAC,OAqMD,QAAAC,cArMC;AA5BT,IAAM,kBAAkB;AAExB,IAAM,aAAaC,OAAK,SAASC,YAAW,OAMzC;AACD,eAAa,MAAM,UAAU,IAAI;AACjC,QAAM,UAAU,MAAM,UAAU,OAAO,cAAc,KAAK,IAAI,IAAI,MAAM,KAAK,IAAI;AACjF,QAAM,QAAQ,MAAM,WAChB;AAAA,IACE,EAAE,KAAK,KAAK,OAAO,UAAU;AAAA,IAC7B,EAAE,KAAK,KAAK,OAAO,SAAS;AAAA,IAC5B,EAAE,KAAK,KAAK,OAAO,QAAQ;AAAA,EAC7B,IACA,MAAM,YACJ;AAAA,IACE,EAAE,KAAK,SAAS,OAAO,QAAQ;AAAA,IAC/B,EAAE,KAAK,OAAO,OAAO,YAAY;AAAA,IACjC,EAAE,KAAK,KAAK,OAAO,WAAW;AAAA,EAChC,IACA;AAAA,IACE,EAAE,KAAK,SAAS,OAAO,OAAO;AAAA,IAC9B,EAAE,KAAK,KAAK,OAAO,WAAW;AAAA,IAC9B,EAAE,KAAK,UAAU,OAAO,OAAO;AAAA,EACjC;AACN,SAAO,gBAAAH,MAAC,aAAU,OAAO,MAAM,OAAO,UAAU,CAAC,GAAG,MAAM,UAAU,OAAO,GAAG,OAAc;AAC9F,CAAC;AAOM,SAAS,KAAK,OAAkB;AACrC,QAAM,EAAE,UAAU,OAAO,QAAQ,eAAe,OAAO,OAAO,IAAI;AAElE,QAAM,SAAS,WAAW,gBAAgB,EAAE,OAAO;AACnD,QAAM,UAAU,eAAe,KAAK;AACpC,QAAM,EAAE,MAAM,IAAI;AAClB,QAAM,CAAC,QAAQ,cAAc,IAAII,YAAW,eAAe,WAAW;AACtE,QAAM,CAAC,cAAc,eAAe,IAAIC,UAAS,CAAC;AAClD,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAkB,IAAI;AACpD,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAS,KAAK;AACpD,QAAM,CAAC,MAAM,OAAO,IAAIA,UAAwB,IAAI;AACpD,QAAM,YAAYC,QAAO,CAAC;AAC1B,QAAM,UAAUA,QAAO,CAAC;AAExB,QAAM,WAAWC,SAAQ,MAAM,aAAa,EAAE,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC;AAC7E,QAAM,iBAAiB,UAAU,CAAC,IAAI,eAAe,UAAU,OAAO,KAAK;AAC3E,QAAM,aAAa,WAAW,eAAe,SAAS,CAAC,IAAI,kBAAkB,UAAU,OAAO,KAAK;AACnG,QAAM,UAAU,eAAe,SAAS,iBAAiB;AACzD,QAAM,WAAW,KAAK,IAAI,cAAc,KAAK,IAAI,GAAG,QAAQ,SAAS,CAAC,CAAC;AACvE,QAAM,WAAW,CAAC,MAAM,YAAY,MAAM,UAAU,CAAC,IAAI;AACzD,QAAM,iBAAiB,CAAC,WAAW,CAAC;AAEpC,QAAM,CAAC,MAAM,IAAIF,UAAqB,OAAO;AAAA,IAC3C,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,MAAM,GAAG,MAAM,KAAK,MAAM,CAAC,IAAI,MAAM,IAAI,GAAG,MAAM,QAAQ,MAAM,IAAI,MAAM,IAAI,GAAG,MAAM,WAAW,IAAI,MAAM,QAAQ,MAAM,aAAa,EAAE,EAAE,CAAC;AAAA,IAC5I,OAAO,WAAW,SAAS,WAAW;AAAA,EACxC,EAAE;AACF,QAAM,cAAcE,SAAsB,MAAM,CAAC,QAAQ,GAAG,MAAM,OAAO,GAAG,CAAC,QAAQ,MAAM,OAAO,CAAC;AAEnG,EAAAC,WAAU,MAAM;AACd,QAAI,CAAC,KAAM,QAAO;AAClB,UAAM,QAAQ,WAAW,MAAM,QAAQ,IAAI,GAAG,eAAe;AAC7D,WAAO,MAAM,aAAa,KAAK;AAAA,EACjC,GAAG,CAAC,IAAI,CAAC;AAET,QAAM,cAAcC,aAAY,MAAM;AACpC,eAAW,EAAE,MAAM,WAAW,OAAO,KAAK,IAAI,EAAE,CAAC;AACjD,aACG,YAAY,EAAE,MAAM,MAAM,MAAM,WAAW,MAAM,UAAU,CAAC,EAC5D,KAAK,CAAC,YAAY,WAAW,CAAC,MAAO,IAAI,EAAE,GAAG,GAAG,QAAQ,IAAI,CAAE,CAAC,EAChE,MAAM,CAAC,UAAmB,WAAW,CAAC,MAAO,IAAI,EAAE,GAAG,GAAG,OAAO,WAAW,KAAK,EAAE,QAAQ,IAAI,CAAE,CAAC;AAAA,EACtG,GAAG,CAAC,UAAU,MAAM,MAAM,MAAM,SAAS,CAAC;AAE1C,QAAM,aAAa,gBAAgB,EAAE,SAAS,UAAU,WAAW,MAAM,WAAW,cAAc,QAAQ,YAAY,CAAC;AAEvH,QAAMC,UAASD;AAAA,IACb,CAAC,UAAkB;AACjB,YAAM,OAAO,MAAM,KAAK;AACxB,UAAI,CAAC,KAAM;AACX,YAAM,QAAQ,WAAW,IAAI;AAC7B,UAAI,OAAO;AACT,cAAM,QAAQ,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM,IAAI;AACxD,cAAM,SAAS,SAAS,eAAe,QAAQ;AAE/C,cAAM,SAAS,OAAO,OAAO,WAAW,QAAQ,GAAG,aAAa;AAChE,YAAI,QAAQ,QAAQ,CAAC,MAAM,OAAO,CAAC,QAAQ;AAEzC,yBAAe,EAAE,MAAM,OAAO,OAAO,IAAI,OAAO,IAAI,IAAI,CAAC;AACzD,0BAAgB,CAAC;AACjB;AAAA,QACF;AACA,YAAI,MAAM,QAAQ,MAAM,MAAM;AAC9B,cAAM,QAAQ,OAAO,MAAM,KAAK,CAAC,MAAM,EAAE,UAAU,IAAI,YAAY,CAAC;AACpE,YAAI,OAAO,QAAQ,CAAC,SAAS,OAAQ,OAAM,WAAW,MAAM,GAAG,OAAO;AACtE,uBAAe,EAAE,MAAM,YAAY,OAAO,KAAK,CAAC;AAChD,uBAAe,EAAE,MAAM,QAAQ,CAAC;AAChC,wBAAgB,CAAC;AACjB,mBAAW,QAAQ,QAAQ,MAAM,MAAM,GAAG;AAC1C;AAAA,MACF;AACA,qBAAe,EAAE,MAAM,YAAY,OAAO,KAAK,CAAC;AAChD,qBAAe,EAAE,MAAM,QAAQ,CAAC;AAChC,cAAQ,KAAK,IAAI;AAAA,IACnB;AAAA,IACA,CAAC,gBAAgB,YAAY,UAAU,UAAU,YAAY,OAAO;AAAA,EACtE;AAEA,QAAM,UAAUA,aAAY,MAAM;AAChC,UAAM,MAAM,KAAK,IAAI;AACrB,QAAI,MAAM,UAAU,UAAU,iBAAiB;AAC7C,cAAQ,UAAU;AAClB,aAAO,MAAM;AACb;AAAA,IACF;AACA,cAAU,UAAU;AACpB,QAAI,QAAQ,UAAU,EAAG,SAAQ,sCAAsC;AAAA,SAClE;AACH,UAAI,OAAO,MAAO,gBAAe,EAAE,MAAM,QAAQ,CAAC;AAClD,cAAQ,6BAA6B;AAAA,IACvC;AAAA,EACF,GAAG,CAAC,SAAS,QAAQ,OAAO,KAAK,CAAC;AAElC,EAAAE,UAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,IAAI,QAAQ,UAAU,IAAK,SAAQ;AAAA,EACzC,CAAC;AAED,QAAM,gBAAgBF;AAAA,IACpB,CAAC,OAAe,QAAsB;AACpC,UAAI,IAAI,QAAQ,UAAU,IAAK,QAAO;AACtC,UAAI,QAAQ,SAAS,GAAG;AACtB,YAAI,IAAI,WAAW,IAAI,WAAW;AAChC,0BAAgB,CAAC,MAAO,IAAI,UAAU,KAAK,IAAI,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,QAAQ,SAAS,GAAG,IAAI,CAAC,CAAE;AAC/F,iBAAO;AAAA,QACT;AACA,YAAI,IAAI,KAAK;AACX,gBAAM,SAAS,QAAQ,QAAQ;AAC/B,cAAI,QAAQ,WAAY,gBAAe,EAAE,MAAM,OAAO,OAAO,OAAO,WAAW,CAAC;AAAA,mBACvE,OAAQ,gBAAe,EAAE,MAAM,OAAO,OAAO,IAAI,OAAO,IAAI,GAAG,OAAO,QAAQ,MAAM,EAAE,GAAG,CAAC;AACnG,0BAAgB,CAAC;AACjB,iBAAO;AAAA,QACT;AAAA,MACF;AACA,UAAI,IAAI,QAAQ;AACd,YAAI,QAAQ,UAAU,EAAG,QAAO;AAChC,cAAM,MAAM,KAAK,IAAI;AACrB,YAAI,CAAC,OAAO,OAAO;AACjB,cAAI,aAAc,QAAO,MAAM;AAAA,cAC1B,SAAQ,2CAA2C;AAAA,QAC1D,WAAW,QAAQ,SAAS,KAAK,MAAM,QAAQ,UAAU,IAAK,gBAAe,EAAE,MAAM,QAAQ,CAAC;AAC9F,gBAAQ,UAAU;AAClB,eAAO;AAAA,MACT;AACA,UAAI,IAAI,OAAO,IAAI,OAAO;AACxB,YAAI,CAAC,MAAM,UAAW,YAAW,QAAQ,MAAM,SAAS,WAAW,aAAa,QAAQ;AACxF,eAAO;AAAA,MACT;AACA,UAAI,IAAI,QAAQ,UAAU,KAAK;AAC7B,cAAM,YAAY,MAAM,MAAM,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,MAAM;AACvE,YAAI,UAAW,gBAAe,CAAC,MAAM,CAAC,CAAC;AAAA,YAClC,SAAQ,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAClD,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAAA,IACA,CAAC,SAAS,UAAU,SAAS,OAAO,OAAO,MAAM,WAAW,MAAM,MAAM,MAAM,MAAM,YAAY,cAAc,MAAM;AAAA,EACtH;AAGA,QAAM,WAAW,WAAW,KAAK,KAAK,IAAI,GAAG,OAAO,KAAK,SAAS,IAAI,EAAE,MAAM,IAAI;AAClF,QAAM,YAAY,IAAI,KAAK,OAAO,IAAI,KAAK,QAAQ,MAAM,UAAU,QAAQ,SAAS,KAAK,IAAI,GAAG,QAAQ,MAAM,IAAI,MAAM,UAAU,KAAK,KAAK,WAAW;AACvJ,QAAM,aAAa,KAAK,IAAI,GAAG,SAAS,YAAY,CAAC;AAErD,QAAM,cAAc,WAChB,oCACA,MAAM,YACJ,oBAAoB,MAAM,QAAQ,QAAQ,wBAC1C;AACN,QAAM,WAAW;AAAA,IACf,WAAW,SAAS,WAAW;AAAA,IAC/B,MAAM;AAAA,IACN,MAAM,WAAW;AAAA,IACjB,GAAG,mBAAmB,MAAM,MAAM,MAAM,YAAY;AAAA,IACpD,MAAM,WAAW,QAAQ,MAAM,UAAU,GAAG,CAAC,IAAI;AAAA,EACnD;AAEA,SACE,gBAAAR,OAACW,OAAA,EAAI,eAAc,UAAS,OAC1B;AAAA,oBAAAZ,MAAC,UAAO,OAAO,aACZ,WAAC,SACA,gBAAAA,MAACY,OAAA,EAAkB,aAAa,QAC9B,0BAAAZ,MAAC,aAAU,OAAO,MAAM,OAAc,KAD9B,KAAK,EAEf,GAEJ;AAAA,IACC,MAAM,OACL,gBAAAA,MAAC,YAAS,MAAM,MAAM,MAAM,OAAc,aAA0B,UAAU,YAAY,WAAW,MAAM,WAAW,IACpH;AAAA,IACH,QAAQ,UACP,gBAAAA,MAACY,OAAA,EAAI,WAAW,GACd,0BAAAZ,MAAC,WAAQ,OAAO,QAAQ,QAAQ,OAAO,OAAO,QAAQ,QAAQ,OAAO,GACvE,IACE;AAAA,IACH,WACC,gBAAAA,MAACY,OAAA,EAAI,WAAW,GACd,0BAAAZ;AAAA,MAAC;AAAA;AAAA,QACC,YAAY,SAAS;AAAA,QACrB,OAAO,SAAS;AAAA,QAChB,MAAM,SAAS;AAAA,QACf,aAAa,kBAAkB,SAAS,IAAI;AAAA,QAC5C,SAAS,0BAA0B,MAAM,QAAQ,MAAM,YAAY,SAAS,WAAW;AAAA,QACvF,MAAM,QAAQ;AAAA,QACd,UAAU,CAAC,QAAQ,YAAY,CAAC;AAAA,QAChC;AAAA,QACA,YAAY,CAAC,aAAa,KAAK,QAAQ,OAAO,UAAU,QAAQ;AAAA;AAAA,IAClE,GACF,IACE;AAAA,IACH,UACC,gBAAAC,OAACW,OAAA,EAAI,eAAc,UAAS,WAAW,GACrC;AAAA,sBAAAZ,MAACa,QAAA,EAAM,gBAAM,KAAK,cAAc,GAAE;AAAA,MACjC,QAAQ,QACP,gBAAAb,MAACa,QAAA,EAAM,gBAAM,MAAM,GAAG,MAAM,QAAQ,KAAK,IAAI,QAAQ,KAAK,EAAE,GAAE,IAC5D,CAAC,QAAQ,UACX,gBAAAb,MAAC,WAAQ,OAAM,uBAAiB,OAAO,QAAQ,OAAO,IAEtD,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,QAAQ,QAAQ,IAAI,CAAC,OAAO;AAAA,YACjC,IAAI,EAAE;AAAA,YACN,OAAO,EAAE,OAAO,KAAK,KAAK;AAAA,YAC1B,MAAM,aAAa,IAAI,KAAK,EAAE,iBAAiB,EAAE,SAAS,CAAC;AAAA,UAC7D,EAAE;AAAA,UACF;AAAA,UACA,QAAQ;AAAA,UACR,UAAQ;AAAA,UACR,WAAU;AAAA,UACV,UAAU,CAAC,SAAS;AAClB,uBAAW,IAAI;AACf,iBAAK,QAAQ,OAAO,KAAK,IAAI,KAAK,KAAK;AAAA,UACzC;AAAA,UACA,UAAU,MAAM,WAAW,IAAI;AAAA;AAAA,MACjC;AAAA,MAED,QAAQ,SAAS,CAAC,QAAQ,UAAU,gBAAAA,MAAC,gBAAa,SAAS,MAAM,WAAW,IAAI,GAAG,IAAK;AAAA,OAC3F,IACE;AAAA,IACH,QAAQ,MAAM,IAAI,CAAC,QAAQ,MAC1B,gBAAAA,MAACa,QAAA,EAAoB,MAAK,gBACvB,gBAAM,IAAI,GAAG,MAAM,QAAQ,UAAU,YAAY,MAAM,EAAE,KADjD,KAAK,CAAC,EAEjB,CACD;AAAA,IACA,QAAQ,SAAS,IAChB,gBAAAb,MAACY,OAAA,EAAI,WAAW,GACd,0BAAAZ,MAAC,WAAQ,UAAU,SAAS,UAAoB,OAAc,GAChE,IACE;AAAA,IACJ,gBAAAA,MAACY,OAAA,EAAI,WAAW,QAAQ,SAAS,IAAI,IAAI,GACvC,0BAAAZ;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,UAAU;AAAA,QACV,UAAUU;AAAA,QACV,OAAO;AAAA,QACP,UAAU;AAAA,QACV;AAAA,QACA;AAAA,QACA,OAAK;AAAA;AAAA,IACP,GACF;AAAA,IACC,OAAO,gBAAAV,MAACa,QAAA,EAAM,gBAAM,UAAU,IAAI,GAAE,IAAU;AAAA,IAC/C,gBAAAb;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,OAAO,MAAM,aAAa,MAAM,OAAO,MAAM,KAAK,YAAY;AAAA,QAC9D,WAAW,MAAM;AAAA,QACjB,UAAU,QAAQ,QAAQ;AAAA;AAAA,IAC5B;AAAA,KACF;AAEJ;AAGO,SAAS,mBAAmB,MAAc,cAA0C;AACzF,MAAI,SAAS,WAAY,QAAO,CAAC;AACjC,SAAQ,CAAC,YAAY,SAAS,QAAQ,EACnC,OAAO,CAAC,QAAQ,aAAa,GAAG,MAAM,qBAAqB,GAAG,CAAC,EAC/D,IAAI,CAAC,QAAQ,GAAG,GAAG,IAAI,aAAa,GAAG,CAAC,EAAE;AAC/C;AAGA,SAAS,aAAa,EAAE,QAAQ,GAAwB;AACtD,EAAAW,UAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,IAAI,UAAU,UAAU,IAAK,SAAQ;AAAA,EAC3C,CAAC;AACD,SAAO;AACT;;;AmBrVA,SAAS,OAAAG,OAAe,QAAAC,QAAM,YAAAC,kBAAgB;AAC9C,SAAS,eAAAC,cAAa,aAAAC,YAAW,WAAAC,UAAS,cAAAC,aAAY,UAAAC,SAAQ,YAAAC,iBAAgB;;;ACF9E,SAAS,OAAAC,OAAK,QAAAC,QAAM,YAAAC,iBAAgB;AACpC,SAAS,eAAAC,cAAa,aAAAC,YAAW,UAAAC,SAAQ,YAAAC,iBAAgB;;;ACDzD,SAAS,OAAAC,OAAK,QAAAC,QAAM,YAAAC,iBAAgB;AACpC,SAAS,WAAAC,UAAS,YAAAC,iBAAgB;;;ACDlC,SAAS,OAAAC,OAAK,QAAAC,cAAY;AAqEtB,SACE,OAAAC,OADF,QAAAC,cAAA;AA9DJ,IAAM,SAAS;AAAA,EACb,OAAO,EAAE,IAAI,UAAK,IAAI,UAAK,GAAG,SAAI;AAAA,EAClC,SAAS,EAAE,IAAI,KAAK,IAAI,KAAK,GAAG,IAAI;AACtC;AAEA,SAAS,UAAU,MAAqC;AACtD,MAAI,SAAS,SAAU,QAAO,MAAM;AACpC,MAAI,SAAS,UAAW,QAAO;AAC/B,MAAI,SAAS,SAAU,QAAO;AAC9B,MAAI,SAAS,YAAa,QAAO;AACjC,SAAO;AACT;AAEA,SAAS,YAAY,MAAiB,MAAsB;AAC1D,MAAI,SAAS,SAAU,QAAO,MAAM,OAAO,IAAI;AAC/C,MAAI,SAAS,UAAW,QAAO,MAAM,QAAQ,IAAI;AACjD,MAAI,SAAS,SAAU,QAAO,MAAM,OAAO,IAAI;AAC/C,MAAI,SAAS,YAAa,QAAO,MAAM,UAAU,IAAI;AACrD,SAAO,MAAM,IAAI,IAAI;AACvB;AAOO,SAAS,aAAa,OAAe,QAAQ,IAAI,QAAQ,IAAI,OAAkB,SAAiB;AACrG,QAAMC,SAAQ,OAAO,MAAM,QAAQ;AACnC,QAAM,QAAQ,KAAK,IAAI,GAAG,QAAQ,CAAC;AACnC,QAAMC,aAAY,QAAQ,IAAI,KAAK,MAAM;AACzC,MAAI,YAAY,QAAQ,IAAI,KAAK,MAAM;AAEvC,MAAI,IAAI,aAAaA,UAAS,IAAI,aAAa,SAAS,IAAI,MAAO,aAAY;AAC/E,QAAM,cACJA,cAAa,IAAI,aAAaA,UAAS,IAAI,QAAQ,IAAI,SAAS,OAAO,KAAK,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAMA;AACtG,QAAM,OAAO,IAAI,aAAa,WAAW,IAAI,aAAa,SAAS,IAAI;AACvE,QAAM,OAAOD,OAAM,EAAE,OAAO,KAAK,IAAI,GAAG,QAAQ,IAAI,CAAC;AACrD,SACE,YAAY,MAAM,GAAGA,OAAM,EAAE,GAAGA,OAAM,CAAC,EAAE,IACzC,cACA,YAAY,MAAM,IAAI,KACrB,YAAY,MAAM,IAAI,SAAS,IAAI,MACpC,YAAY,MAAM,GAAGA,OAAM,CAAC,GAAGA,OAAM,EAAE,EAAE;AAE7C;AAGO,SAAS,MAAM;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AACF,GAMG;AACD,QAAM,QAAQ,UAAU,IAAI;AAC5B,SACE,gBAAAD,OAACG,OAAA,EAAI,eAAc,UAAS,OAC1B;AAAA,oBAAAJ,MAACK,QAAA,EAAM,uBAAa,OAAO,OAAO,OAAO,IAAI,GAAE;AAAA,IAC/C,gBAAAL;AAAA,MAACI;AAAA,MAAA;AAAA,QACC,aAAa,MAAM;AAAA,QACnB,WAAW;AAAA,QACX,aAAa;AAAA,QACb,gBAAgB,SAAS;AAAA,QACzB,UAAU;AAAA,QACV,eAAc;AAAA,QACd;AAAA,QAEC;AAAA;AAAA,IACH;AAAA,KACF;AAEJ;;;ACnEA,SAASE,UAAS,OAA8B;AAC9C,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,UAAU,OAAgC;AACjD,SAAO,MAAM,QAAQ,KAAK,KAAK,MAAM,SAAS,KAAK,MAAM,MAAMA,SAAQ;AACzE;AAEA,SAAS,UAAU,MAAa,SAAmB,KAAyB;AAC1E,QAAM,SAAS,YAAY,IAAI;AAC/B,QAAM,UAAyB,OAAO,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,QAAQ,EAAE,OAAO,OAAO,EAAE,MAAM,EAAE;AAClG,QAAM,QAAQ,KAAK,IAAI,CAAC,QAAQ;AAC9B,UAAM,SAAiC,CAAC;AACxC,eAAW,UAAU,OAAQ,QAAO,OAAO,GAAG,IAAI,UAAU,QAAQ,KAAK,OAAO,GAAG,GAAG,GAAG;AACzF,WAAO;AAAA,EACT,CAAC;AACD,SAAO,EAAE,MAAM,SAAS,SAAS,MAAM,OAAO,OAAO,KAAK,QAAQ,QAAQ;AAC5E;AAEA,SAAS,QAAQ,OAAgB,KAAqB;AACpD,MAAI,MAAM,QAAQ,KAAK,KAAK,MAAM,KAAK,CAAC,MAAM,OAAO,MAAM,YAAY,MAAM,IAAI,GAAG;AAClF,WAAO,GAAG,MAAM,MAAM,QAAQ,MAAM,WAAW,IAAI,KAAK,GAAG;AAAA,EAC7D;AACA,MAAIA,UAAS,KAAK,GAAG;AACnB,UAAM,OAAO,SAAS,OAAO,CAAC;AAC9B,WAAO,KAAK,SAAS,MAAM,GAAG,KAAK,MAAM,GAAG,EAAE,CAAC,WAAM;AAAA,EACvD;AACA,SAAO,UAAU,OAAO,GAAG;AAC7B;AAEO,SAAS,eAAe,QAAiB,MAAM,KAAK,IAAI,GAAe;AAC5E,MAAI,WAAW,QAAQ,WAAW,UAAa,WAAW,GAAI,QAAO,EAAE,MAAM,QAAQ;AACrF,MAAI,OAAO,WAAW,SAAU,QAAO,EAAE,MAAM,QAAQ,MAAM,OAAO;AACpE,MAAI,OAAO,WAAW,SAAU,QAAO,EAAE,MAAM,QAAQ,MAAM,OAAO,MAAM,EAAE;AAC5E,MAAI,UAAU,MAAM,EAAG,QAAO,UAAU,QAAQ,CAAC,GAAG,GAAG;AACvD,MAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,WAAO,OAAO,WAAW,IAAI,EAAE,MAAM,QAAQ,IAAI,EAAE,MAAM,QAAQ,MAAM,OAAO,IAAI,CAAC,MAAM,UAAU,GAAG,GAAG,CAAC,EAAE,KAAK,IAAI,EAAE;AAAA,EACzH;AACA,QAAM,UAAU,gBAAgB,MAAM;AACtC,MAAI,SAAS;AACX,UAAM,UAAU,OAAO,QAAQ,MAAa,EACzC,OAAO,CAAC,CAAC,KAAK,KAAK,MAAM,QAAQ,QAAQ,QAAQ,OAAO,UAAU,YAAY,UAAU,SAAS,UAAU,MAAS,EACpH,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,GAAG,GAAG,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AAC1D,QAAI,QAAQ,KAAK,WAAW,EAAG,QAAO,EAAE,MAAM,MAAM,MAAM,CAAC,EAAE,OAAO,QAAQ,KAAK,OAAO,OAAO,CAAC,EAAE;AAClG,WAAO,UAAU,QAAQ,MAAM,SAAS,GAAG;AAAA,EAC7C;AACA,QAAM,OAAO,OAAO,QAAQ,MAAa,EACtC,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,UAAU,MAAS,EACzC,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO,EAAE,OAAO,OAAO,QAAQ,OAAO,GAAG,EAAE,EAAE;AAClE,SAAO,KAAK,SAAS,EAAE,MAAM,MAAM,KAAK,IAAI,EAAE,MAAM,QAAQ;AAC9D;AAGO,SAAS,WAAW,MAA0B;AACnD,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAO,KAAK,KAAK;AAAA,IACnB,KAAK;AACH,aAAO,KAAK,KAAK;AAAA,IACnB,KAAK;AACH,aAAO,KAAK,KAAK,MAAM,IAAI,EAAE;AAAA,IAC/B;AACE,aAAO;AAAA,EACX;AACF;;;AFpCI,SACgB,OAAAC,OADhB,QAAAC,cAAA;AAfJ,SAAS,YAAY,MAA0B;AAC7C,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAO,CAAC,GAAG,KAAK,KAAK,UAAU,KAAK,UAAU,IAAI,KAAK,GAAG,IAAI,GAAG,KAAK,OAAO,EAAE,KAAK,IAAI,MAAM,QAAQ,MAAM,GAAG;AAAA,IACjH,KAAK;AACH,aAAO,GAAG,KAAK,KAAK,MAAM,SAAS,KAAK,KAAK,WAAW,IAAI,KAAK,GAAG;AAAA,IACtE,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,UAAU,EAAE,MAAM,GAAwB;AACjD,SACE,gBAAAA,OAACC,OAAA,EAAI,eAAc,UAChB;AAAA,UAAM,OAAO,gBAAAF,MAACG,QAAA,EAAK,MAAK,QAAQ,gBAAM,IAAI,GAAG,MAAM,QAAQ,UAAU,IAAI,MAAM,IAAI,EAAE,GAAE,IAAU;AAAA,IAClG,gBAAAH,MAACG,QAAA,EACE,gBAAM,IAAI,CAAC,MAAM,YAAY,cAAc,MAAM,SAAS,KAAK,MAAM,QAAQ,MAAM,QAAQ,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI,MAAM,QAAQ,MAAM,GAAG,CAAC,GACnJ;AAAA,KACF;AAEJ;AAOO,SAAS,YAAY,OAAyB;AACnD,QAAM,EAAE,OAAO,QAAQ,OAAO,YAAY,WAAW,MAAM,OAAO,QAAQ,YAAY,IAAI;AAC1F,QAAM,OAAOC,SAAQ,MAAM,eAAe,MAAM,GAAG,CAAC,MAAM,CAAC;AAC3D,QAAM,YAAYA,SAAQ,MAAM,SAAS,UAAU,IAAI,EAAE,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC;AAC9E,QAAM,CAAC,MAAM,OAAO,IAAIC,UAA2B,OAAO;AAC1D,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAS,CAAC;AAEtC,QAAM,QAAQ,SAAS,SAAS,UAAU,SAAS,WAAW,IAAI;AAClE,QAAM,SAAS,KAAK,OAAO,IAAI,KAAK;AACpC,QAAM,SAAS,cAAc,KAAK,IAAI,GAAG,SAAS,UAAU,KAAK,SAAS,UAAU,IAAI,EAAE,IAAI;AAC9F,QAAM,YAAY,KAAK,IAAI,GAAG,QAAQ,MAAM;AAC5C,QAAM,UAAU,KAAK,IAAI,QAAQ,SAAS;AAE1C,EAAAC;AAAA,IACE,CAAC,OAAO,QAAQ;AACd,UAAI,IAAI,UAAU,UAAU,IAAK,OAAM,SAAS;AAAA,eACvC,UAAU,KAAK;AACtB,gBAAQ,CAAC,MAAO,MAAM,SAAS,UAAU,MAAO;AAChD,kBAAU,CAAC;AAAA,MACb,WAAW,UAAU,IAAK,OAAM,UAAU;AAAA,eACjC,UAAU,IAAK,OAAM,SAAS;AAAA,eAC9B,IAAI,QAAS,WAAU,CAAC,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,SAAS,IAAI,CAAC,CAAC;AAAA,eACrE,IAAI,UAAW,WAAU,CAAC,MAAM,KAAK,IAAI,WAAW,IAAI,CAAC,CAAC;AAAA,eAC1D,IAAI,OAAQ,WAAU,CAAC,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,SAAS,IAAI,MAAM,CAAC;AAAA,eACzE,IAAI,SAAU,WAAU,CAAC,MAAM,KAAK,IAAI,WAAW,IAAI,MAAM,CAAC;AAAA,eAC9D,UAAU,IAAK,WAAU,CAAC;AAAA,eAC1B,UAAU,IAAK,WAAU,SAAS;AAAA,IAC7C;AAAA,IACA,EAAE,UAAU,YAAY;AAAA,EAC1B;AAEA,QAAM,KAAK,CAAC;AACZ,QAAM,UAAU,GAAG,KAAK,MAAM,QAAQ,MAAM,QAAQ,OAAO,IAAI,MAAM,MAAM,MAAM,QAAQ,KAAK,CAAC,IAAI,MAAM,KAAK,KAAK,CAAC;AACpH,QAAM,QAAQ,CAAC,cAAc,UAAU,GAAG,YAAY,OAAO,QAAQ,WAAW,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI,MAAM,QAAQ,MAAM,GAAG;AAChJ,QAAM,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC;AACpC,QAAM,QAAmB;AAAA,IACvB,EAAE,KAAK,KAAK,OAAO,SAAS,SAAS,UAAU,OAAO;AAAA,IACtD,GAAI,MAAM,UAAU,CAAC,EAAE,KAAK,KAAK,OAAO,SAAS,CAAC,IAAI,CAAC;AAAA,IACvD,GAAI,MAAM,SAAS,CAAC,EAAE,KAAK,KAAK,OAAO,aAAa,CAAC,IAAI,CAAC;AAAA,IAC1D,GAAI,QAAQ,SAAS,CAAC,EAAE,KAAK,MAAM,QAAQ,QAAQ,OAAO,SAAS,CAAC,IAAI,CAAC;AAAA,IACzE,EAAE,KAAK,KAAK,OAAO,OAAO;AAAA,EAC5B;AAEA,SACE,gBAAAL,OAACC,OAAA,EAAI,eAAc,UAAS,OAC1B;AAAA,oBAAAF,MAAC,SAAM,OAAO,SAAS,OAAc,OAAc,MAAM,KAAK,UAAU,UACtE,0BAAAA,MAACG,QAAA,EAAK,MAAK,gBAAgB,kBAAQ,MAAM,MAAM,MAAM,OAAO,IAAI,MAAM,IAAI,YAAY,IAAI,CAAC,GAAE,GAC/F;AAAA,IACC,OAAO,gBAAAH,MAACG,QAAA,EAAK,MAAK,gBAAgB,gBAAK,IAAU;AAAA,IAClD,gBAAAF,OAACC,OAAA,EAAI,eAAc,UAAS,aAAa,GAAG,OACzC;AAAA,cACC,gBAAAF,MAAC,aAAU,OAAc,IACvB,SAAS,SACX,UAAU,MAAM,SAAS,UAAU,MAAM,EAAE,IAAI,CAAC,MAAM,MACpD,gBAAAA,MAACG,QAAA,EAAuB,MAAK,gBAC1B,kBADQ,UAAU,CAErB,CACD,IACC,KAAK,SAAS,UAChB,gBAAAH,MAAC,SAAM,SAAS,KAAK,SAAS,MAAM,KAAK,MAAM,OAAO,OAAO,QAAQ,SAAS,OAAO,QAAQ,IAC3F,KAAK,SAAS,OAChB,gBAAAA,MAAC,YAAS,MAAM,KAAK,KAAK,MAAM,SAAS,UAAU,MAAM,GAAG,OAAO,OAAO,IACxE,KAAK,SAAS,SAChB,cACE,KAAK,KACF,MAAM,IAAI,EACV,MAAM,SAAS,UAAU,MAAM,EAC/B,IAAI,CAAC,MAAM,MACV,gBAAAA,MAACG,QAAA,EAAuB,MAAK,gBAC1B,kBADQ,UAAU,CAErB,CACD,IAEH,gBAAAH,MAAC,YAAS,MAAM,KAAK,MAAM,OAAO,OAAO,IAG3C,gBAAAA,MAACG,QAAA,EAAM,gBAAM,IAAI,WAAW,GAAE;AAAA,MAE/B,eAAe,QAAQ,SACtB,gBAAAH,MAACG,QAAA,EAAM,gBAAM,IAAI,GAAG,UAAU,CAAC,SAAI,KAAK,IAAI,OAAO,UAAU,MAAM,CAAC,OAAO,KAAK,EAAE,GAAE,IAClF;AAAA,OACN;AAAA,IACC,cACC,gBAAAH,MAACE,OAAA,EAAI,WAAW,GACd,0BAAAF,MAAC,YAAS,OAAc,OAAc,GACxC,IACE;AAAA,KACN;AAEJ;;;ADrDI,gBAAAO,OACE,QAAAC,cADF;AAtEJ,SAAS,OAAO,MAAmD;AACjE,SAAO,OAAO,KAAK,SAAS,YAAY,KAAK,SAAS,QAAQ,CAAC,MAAM,QAAQ,KAAK,IAAI,IAAK,KAAK,OAAmC,CAAC;AACtI;AAGO,SAAS,UAAU,EAAE,UAAU,OAAO,QAAQ,OAAO,GAAmB;AAC7E,QAAM,CAAC,OAAO,QAAQ,IAAIC,UAAgB,EAAE,MAAM,WAAW,OAAO,KAAK,IAAI,EAAE,CAAC;AAChF,QAAM,UAAUC,QAAO,IAAI;AAC3B,EAAAC;AAAA,IACE,MAAM,MAAM;AACV,cAAQ,UAAU;AAAA,IACpB;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,OAAOC,aAAY,YAAY;AACnC,QAAI,CAAC,SAAS,QAAQ,YAAY;AAChC,eAAS,EAAE,MAAM,UAAU,SAAS,iCAAiC,MAAM,2DAA2D,CAAC;AACvI;AAAA,IACF;AACA,aAAS,EAAE,MAAM,WAAW,OAAO,KAAK,IAAI,EAAE,CAAC;AAC/C,QAAI;AACF,YAAM,QAAQ,MAAM,SAAS,qBAAqB;AAClD,UAAI,QAAQ,QAAS,UAAS,EAAE,MAAM,QAAQ,MAAM,CAAC;AAAA,IACvD,SAAS,OAAO;AACd,YAAM,MAAM,WAAW,KAAK;AAC5B,UAAI,QAAQ,QAAS,UAAS,EAAE,MAAM,UAAU,SAAS,IAAI,SAAS,MAAM,IAAI,KAAK,CAAC;AAAA,IACxF;AAAA,EACF,GAAG,CAAC,QAAQ,CAAC;AAEb,EAAAD,WAAU,MAAM;AACd,SAAK,KAAK;AAAA,EACZ,GAAG,CAAC,IAAI,CAAC;AAET,QAAM,SAASC;AAAA,IACb,OAAO,aAA6B;AAClC,UAAI,MAAM,SAAS,OAAQ;AAC3B,UAAI,aAAa,SAAS;AACxB,iBAAS,EAAE,MAAM,QAAQ,OAAO,MAAM,MAAM,CAAC;AAC7C;AAAA,MACF;AACA,eAAS,EAAE,GAAG,OAAO,MAAM,UAAU,OAAO,KAAK,CAAC;AAClD,UAAI;AACF,cAAM,OAAO,MAAM,SAAS,eAAe,MAAM,KAAK,IAAI,QAAQ;AAClE,YAAI,CAAC,QAAQ,QAAS;AACtB,iBAAS;AAAA,UACP,MAAM;AAAA,UACN,MAAM,MAAM;AAAA,UACZ;AAAA,UACA,QAAQ,aAAa,YAAa,KAAK,KAAK,UAAU,KAAK,WAAW,QAAQ,OAAQ;AAAA,UACtF,YAAY,KAAK,IAAI,IAAI,MAAM;AAAA,QACjC,CAAC;AAAA,MACH,SAAS,OAAO;AACd,YAAI,QAAQ,QAAS,UAAS,EAAE,GAAG,OAAO,MAAM,MAAM,OAAO,WAAW,KAAK,EAAE,QAAQ,CAAC;AAAA,MAC1F;AAAA,IACF;AAAA,IACA,CAAC,OAAO,QAAQ;AAAA,EAClB;AAEA,EAAAC;AAAA,IACE,CAAC,OAAO,QAAQ;AACd,UAAI,MAAM,SAAS,UAAU,MAAM,aAAa,cAAc,IAAI,UAAU,IAAI,UAAU,UAAU,KAAM,MAAK,KAAK;AAAA,eAC3G,MAAM,SAAS,aAAa,IAAI,UAAU,UAAU,OAAO,IAAI,QAAS,QAAO;AAAA,eAC/E,MAAM,SAAS,cAAc,IAAI,UAAU,UAAU,KAAM,QAAO;AAAA,IAC7E;AAAA,IACA,EAAE,UAAW,MAAM,SAAS,UAAU,MAAM,aAAa,aAAc,MAAM,SAAS,YAAY,MAAM,SAAS,UAAU;AAAA,EAC7H;AAEA,QAAM,QAAQ,MAAM,SAAS,UAAU,MAAM,SAAS,SAAS,MAAM,MAAM,SAAS;AACpF,QAAM,SACJ,gBAAAN,MAACO,OAAA,EAAI,cAAc,GACjB,0BAAAN,OAACO,QAAA,EACE;AAAA,UAAM,KAAK,WAAW;AAAA,IACtB,UAAU,OAAO,MAAM,IAAI,IAAI,MAAM,QAAQ,MAAM,IAAI,KAAK,UAAU,IAAI;AAAA,KAC7E,GACF;AAGF,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AACH,aACE,gBAAAP,OAACM,OAAA,EAAI,eAAc,UAAS,OACzB;AAAA;AAAA,QACD,gBAAAP,MAAC,WAAQ,OAAM,2BAAqB,OAAO,MAAM,OAAO;AAAA,SAC1D;AAAA,IAEJ,KAAK;AACH,aACE,gBAAAC,OAACM,OAAA,EAAI,eAAc,UAAS,OACzB;AAAA;AAAA,QACD,gBAAAP,MAACQ,QAAA,EAAM,gBAAM,MAAM,GAAG,MAAM,QAAQ,KAAK,IAAI,MAAM,OAAO,EAAE,GAAE;AAAA,QAC7D,MAAM,OAAO,gBAAAR,MAACQ,QAAA,EAAK,MAAK,QAAQ,gBAAM,IAAI,KAAK,MAAM,QAAQ,UAAU,IAAI,MAAM,IAAI,EAAE,GAAE,IAAU;AAAA,QACpG,gBAAAR,MAACO,OAAA,EAAI,WAAW,GACd,0BAAAP,MAAC,YAAS,OAAc,OAAO,CAAC,EAAE,KAAK,KAAK,OAAO,OAAO,CAAC,GAAG,GAChE;AAAA,SACF;AAAA,IAEJ,KAAK;AACH,aACE,gBAAAC,OAACM,OAAA,EAAI,eAAc,UAAS,OACzB;AAAA;AAAA,QACD,gBAAAP;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,MAAM,MAAM,IAAI,CAAC,UAAU;AAAA,cAChC,IAAI,KAAK;AAAA,cACT,OAAO,GAAG,MAAM,QAAQ,SAAS,IAAI,aAAa,KAAK,QAAQ,CAAC;AAAA,cAChE,aAAa,cAAc,OAAO,IAAI,GAAG,EAAE;AAAA,cAC3C,MAAM,GAAG,aAAa,IAAI,KAAK,KAAK,SAAS,CAAC,CAAC,KAAK,QAAQ,KAAK,EAAE,CAAC;AAAA,YACtE,EAAE;AAAA,YACF;AAAA,YACA,QAAQ,KAAK,IAAI,GAAG,SAAS,CAAC;AAAA,YAC9B,UAAQ;AAAA,YACR,WAAU;AAAA,YACV,UAAU,CAAC,aAAa;AACtB,oBAAM,OAAO,MAAM,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,SAAS,EAAE;AACzD,kBAAI,KAAM,UAAS,EAAE,MAAM,QAAQ,OAAO,MAAM,OAAO,MAAM,SAAS,KAAK,IAAI,GAAG,MAAM,MAAM,OAAO,KAAK,CAAC;AAAA,YAC7G;AAAA,YACA,UAAU;AAAA;AAAA,QACZ;AAAA,SACF;AAAA,IAEJ,KAAK;AACH,aACE,gBAAAC,OAACM,OAAA,EAAI,eAAc,UAAS,OACzB;AAAA;AAAA,QACD,gBAAAP;AAAA,UAAC;AAAA;AAAA,YACC,YAAY,MAAM,KAAK;AAAA,YACvB,OAAO,aAAa,MAAM,KAAK,QAAQ;AAAA,YACvC,MAAM,OAAO,MAAM,IAAI;AAAA,YACvB,aAAa,kBAAkB,MAAM,KAAK,QAAQ;AAAA,YAClD,SAAS,sBAAsB,MAAM,QAAQ,MAAM,IAAI,aAAa,IAAI,KAAK,MAAM,KAAK,SAAS,CAAC,CAAC,IAAI,MAAM,QAAQ,MAAM,YAAY,SAAS,WAAW;AAAA,YAC3J,MAAM,MAAM;AAAA,YACZ,OAAO,MAAM;AAAA,YACb,UAAU,CAAC,MAAM;AAAA,YACjB;AAAA,YACA,YAAY,CAAC,aAAa,KAAK,OAAO,QAAQ;AAAA;AAAA,QAChD;AAAA,SACF;AAAA,IAEJ,KAAK;AACH,aACE,gBAAAC,OAACM,OAAA,EAAI,eAAc,UAAS,OACzB;AAAA;AAAA,QACA,MAAM,aAAa,YAClB,gBAAAP;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,aAAa,MAAM,KAAK,QAAQ;AAAA,YACvC,QAAQ,MAAM;AAAA,YACd,YAAY,MAAM;AAAA,YAClB,MAAM,oBAAoB,WAAW,aAAa,MAAM,KAAK,QAAQ,GAAG,MAAM,KAAK,IAAI,MAAM,UAAU;AAAA,YACvG;AAAA,YACA,QAAQ,KAAK,IAAI,GAAG,SAAS,CAAC;AAAA,YAC9B,aAAW;AAAA,YACX,QAAQ,MAAM,KAAK,KAAK;AAAA;AAAA,QAC1B,IAEA,gBAAAC,OAACM,OAAA,EAAI,eAAc,UACjB;AAAA,0BAAAP,MAACQ,QAAA,EAAM,8BAAoB,MAAM,UAAU,aAAa,MAAM,KAAK,QAAQ,GAAG,MAAM,KAAK,IAAI,MAAM,UAAU,GAAE;AAAA,UAC/G,gBAAAR,MAACO,OAAA,EAAI,WAAW,GACd,0BAAAP,MAAC,YAAS,OAAc,OAAO,CAAC,EAAE,KAAK,SAAS,OAAO,oBAAoB,CAAC,GAAG,GACjF;AAAA,WACF;AAAA,SAEJ;AAAA,EAEN;AACF;;;AI7LA,SAAS,OAAAS,OAAK,QAAAC,QAAM,YAAAC,iBAAgB;AACpC,SAAS,QAAAC,QAAM,WAAAC,UAAS,YAAAC,iBAAgB;;;ACDxC,SAAS,OAAAC,OAAK,QAAAC,QAAM,YAAAC,iBAAgB;AACpC,SAAS,eAAAC,cAAa,aAAAC,YAAW,UAAAC,SAAQ,YAAAC,iBAAgB;AA+InD,SAGoB,OAAAC,OAHpB,QAAAC,cAAA;AAxGC,SAAS,UAAU,MAA2B;AACnD,SAAO,KAAK,YAAY,KAAK,GAAG,KAAK,KAAK;AAC5C;AAGO,SAAS,QAAQ,EAAE,MAAM,UAAU,OAAO,QAAQ,eAAe,CAAC,GAAG,OAAO,OAAO,GAAiB;AACzG,QAAM,CAAC,OAAO,QAAQ,IAAIC,UAAgB,EAAE,MAAM,QAAQ,OAAO,aAAa,CAAC;AAC/E,QAAM,UAAUC,QAAO,IAAI;AAC3B,QAAM,aAAaA,QAA+B,IAAI;AACtD,EAAAC;AAAA,IACE,MAAM,MAAM;AACV,cAAQ,UAAU;AAClB,iBAAW,SAAS,MAAM;AAAA,IAC5B;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,eAAeC;AAAA,IACnB,CAAC,UACC,qBAAqB,MAAM,KAAK,WAAW,EAAE,SAAS,QAAQ,KAAK,MAAM,WAAW,UAAa,SAAS,QAAQ,SAC9G,EAAE,GAAG,OAAO,QAAQ,SAAS,QAAQ,OAAO,IAC5C;AAAA,IACN,CAAC,MAAM,SAAS,QAAQ,MAAM;AAAA,EAChC;AAEA,QAAM,MAAMA;AAAA,IACV,OAAO,UAAiB;AACtB,YAAM,YAAY,KAAK,IAAI;AAC3B,iBAAW,SAAS,MAAM;AAC1B,YAAM,QAAQ,IAAI,gBAAgB;AAClC,iBAAW,UAAU;AACrB,eAAS,EAAE,MAAM,WAAW,OAAO,UAAU,CAAC;AAC9C,UAAI;AACF,cAAM,UAAU,MAAM,SAAS,SAAS,KAAK,IAAI,aAAa,KAAK,GAAG,EAAE,QAAQ,MAAM,OAAO,CAAC;AAC9F,YAAI,CAAC,QAAQ,WAAW,MAAM,OAAO,QAAS;AAC9C,YAAI,CAAC,QAAQ,GAAI,UAAS,EAAE,MAAM,SAAS,OAAO,OAAO,QAAQ,OAAO,YAAY,QAAQ,WAAW,CAAC;AAAA,iBAC/F,QAAQ,UAAU;AACzB;AAAA,YACE,SAAS,QAAQ,aACb,EAAE,MAAM,YAAY,OAAO,UAAU,QAAQ,UAAU,aAAa,KAAK,IAAI,GAAG,MAAM,MAAM,OAAO,KAAK,IACxG,EAAE,MAAM,QAAQ,OAAO,UAAU,QAAQ,SAAS;AAAA,UACxD;AAAA,QACF,MAAO,UAAS,EAAE,MAAM,UAAU,OAAO,QAAQ,QAAQ,QAAQ,YAAY,QAAQ,YAAY,WAAW,QAAQ,UAAU,CAAC;AAAA,MACjI,SAAS,OAAO;AACd,YAAI,CAAC,QAAQ,WAAW,MAAM,OAAO,QAAS;AAC9C,iBAAS,EAAE,MAAM,SAAS,OAAO,OAAO,WAAW,KAAK,GAAG,YAAY,KAAK,IAAI,IAAI,UAAU,CAAC;AAAA,MACjG;AAAA,IACF;AAAA,IACA,CAAC,UAAU,KAAK,IAAI,YAAY;AAAA,EAClC;AAGA,QAAM,UAAUF,QAAO,KAAK;AAC5B,EAAAC,WAAU,MAAM;AACd,QAAI,QAAQ,WAAW,UAAU,MAAO;AACxC,YAAQ,UAAU;AAClB,SAAK,IAAI,YAAY;AAAA,EACvB,GAAG,CAAC,OAAO,KAAK,YAAY,CAAC;AAE7B,QAAM,SAASC;AAAA,IACb,OAAO,aAA6B;AAClC,UAAI,MAAM,SAAS,WAAY;AAC/B,YAAM,EAAE,UAAU,OAAO,YAAY,IAAI;AACzC,YAAM,QAAQ,aAAa,SAAS,YAAY,KAAK,KAAK;AAC1D,UAAI,aAAa,SAAS;AACxB,iBAAS,EAAE,MAAM,QAAQ,OAAO,SAAS,CAAC;AAC1C;AAAA,MACF;AACA,eAAS,EAAE,GAAG,OAAO,MAAM,UAAU,OAAO,KAAK,CAAC;AAClD,UAAI;AACF,cAAM,OAAO,MAAM,SAAS,eAAe,SAAS,YAAY,QAAQ;AACxE,YAAI,CAAC,QAAQ,QAAS;AACtB,iBAAS;AAAA,UACP,MAAM;AAAA,UACN;AAAA,UACA,QAAQ,aAAa,YAAa,KAAK,KAAK,UAAU,KAAK,WAAW,QAAQ,OAAQ;AAAA,UACtF,YAAY,KAAK,IAAI,IAAI;AAAA,UACzB,MAAM,oBAAoB,UAAU,OAAO,SAAS,YAAY,KAAK,IAAI,IAAI,WAAW;AAAA,QAC1F,CAAC;AAAA,MACH,SAAS,OAAO;AACd,YAAI,CAAC,QAAQ,QAAS;AACtB,iBAAS,EAAE,GAAG,OAAO,MAAM,MAAM,OAAO,WAAW,KAAK,EAAE,QAAQ,CAAC;AAAA,MACrE;AAAA,IACF;AAAA,IACA,CAAC,OAAO,UAAU,KAAK,KAAK;AAAA,EAC9B;AAEA,EAAAC;AAAA,IACE,CAAC,OAAO,QAAQ;AACd,UAAI,MAAM,SAAS,aAAa,IAAI,QAAQ;AAC1C,mBAAW,SAAS,MAAM;AAC1B,iBAAS,EAAE,MAAM,QAAQ,OAAO,MAAM,MAAM,CAAC;AAAA,MAC/C,WAAW,MAAM,SAAS,WAAW,MAAM,SAAS,QAAQ;AAC1D,YAAI,IAAI,UAAU,UAAU,IAAK,QAAO;AAAA,iBAC/B,UAAU,IAAK,MAAK,IAAI,MAAM,KAAK;AAAA,iBACnC,UAAU,IAAK,UAAS,EAAE,MAAM,QAAQ,OAAO,MAAM,MAAM,CAAC;AAAA,MACvE;AAAA,IACF;AAAA,IACA,EAAE,UAAU,MAAM,SAAS,aAAa,MAAM,SAAS,WAAW,MAAM,SAAS,OAAO;AAAA,EAC1F;AAEA,QAAM,QAAQ,UAAU,IAAI;AAC5B,QAAM,SACJ,gBAAAL,OAACM,OAAA,EAAI,eAAc,UAAS,cAAc,GACxC;AAAA,oBAAAN,OAACO,QAAA,EAAK,MAAK,gBACR;AAAA,YAAM,KAAK,KAAK;AAAA,MAAE;AAAA,MAAE,MAAM,IAAI,GAAG,MAAM,QAAQ,MAAM,IAAI,QAAQ,KAAK,KAAK,CAAC,EAAE;AAAA,OACjF;AAAA,IACC,KAAK,cAAc,gBAAAR,MAACQ,QAAA,EAAK,MAAK,gBAAgB,gBAAM,IAAI,QAAQ,KAAK,WAAW,CAAC,GAAE,IAAU;AAAA,KAChG;AAGF,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AACH,aACE,gBAAAP,OAACM,OAAA,EAAI,eAAc,UAAS,OACzB;AAAA;AAAA,QACD,gBAAAP;AAAA,UAAC;AAAA;AAAA,YACC,SAAS,gBAAgB,KAAK,aAAa,MAAM,OAAO,EAAE,MAAM,qBAAqB,MAAM,KAAK,WAAW,EAAE,CAAC;AAAA,YAC9G;AAAA,YACA,QAAQ,KAAK,IAAI,GAAG,SAAS,CAAC;AAAA,YAC9B,UAAQ;AAAA,YACR,UAAU,CAAC,UAAU,KAAK,IAAI,KAAK;AAAA,YACnC,UAAU;AAAA;AAAA,QACZ;AAAA,SACF;AAAA,IAEJ,KAAK;AACH,aACE,gBAAAC,OAACM,OAAA,EAAI,eAAc,UAAS,OACzB;AAAA;AAAA,QACD,gBAAAP,MAAC,WAAQ,OAAO,WAAW,KAAK,GAAG,MAAM,QAAQ,QAAQ,IAAI,OAAO,MAAM,WAAW;AAAA,QACrF,gBAAAA,MAACO,OAAA,EAAI,WAAW,GACd,0BAAAP,MAAC,YAAS,OAAc,OAAO,CAAC,EAAE,KAAK,OAAO,OAAO,SAAS,CAAC,GAAG,GACpE;AAAA,SACF;AAAA,IAEJ,KAAK;AACH,aACE,gBAAAC,OAACM,OAAA,EAAI,eAAc,UAAS,OACzB;AAAA;AAAA,QACD,gBAAAP;AAAA,UAAC;AAAA;AAAA,YACC,YAAY,MAAM,SAAS;AAAA,YAC3B,OAAO,aAAa,MAAM,SAAS,YAAY,KAAK,KAAK;AAAA,YACzD,SAAS,MAAM,SAAS;AAAA,YACxB,MAAM,aAAa,MAAM,KAAK;AAAA,YAC9B,aAAa,kBAAkB,MAAM,SAAS,YAAY,KAAK,EAAE;AAAA,YACjE,SAAS,0BAA0B,MAAM,QAAQ,MAAM,YAAY,SAAS,WAAW;AAAA,YACvF,MAAM,MAAM;AAAA,YACZ,OAAO,MAAM;AAAA,YACb,UAAU,CAAC,MAAM;AAAA,YACjB;AAAA,YACA,YAAY,CAAC,aAAa,KAAK,OAAO,QAAQ;AAAA;AAAA,QAChD;AAAA,SACF;AAAA,IAEJ,KAAK;AACH,aACE,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,UACP,QAAQ,MAAM;AAAA,UACd,YAAY,MAAM;AAAA,UAClB,WAAW,MAAM;AAAA,UACjB,MAAM,MAAM;AAAA,UACZ;AAAA,UACA;AAAA,UACA,aAAW;AAAA,UACX,QAAQ;AAAA,UACR,SAAS,MAAM,KAAK,IAAI,MAAM,KAAK;AAAA,UACnC,QAAQ,MAAM,SAAS,EAAE,MAAM,QAAQ,OAAO,MAAM,MAAM,CAAC;AAAA;AAAA,MAC7D;AAAA,IAEJ,KAAK;AACH,aACE,gBAAAC,OAACM,OAAA,EAAI,eAAc,UAAS,OAC1B;AAAA,wBAAAP,MAAC,eAAY,OAAO,OAAO,OAAO,MAAM,OAAO,YAAY,MAAM,YAAY,OAAc,QAAgB,aAAa,OAAO;AAAA,QAC/H,gBAAAA,MAACO,OAAA,EAAI,WAAW,GACd,0BAAAP,MAAC,YAAS,OAAc,OAAO,CAAC,EAAE,KAAK,KAAK,OAAO,QAAQ,GAAG,EAAE,KAAK,KAAK,OAAO,aAAa,GAAG,EAAE,KAAK,KAAK,OAAO,OAAO,CAAC,GAAG,GACjI;AAAA,SACF;AAAA,IAEJ,KAAK;AACH,aACE,gBAAAC,OAACM,OAAA,EAAI,eAAc,UAAS,OACzB;AAAA;AAAA,QACD,gBAAAP,MAACQ,QAAA,EAAM,8BAAoB,SAAS,aAAa,MAAM,SAAS,YAAY,KAAK,KAAK,GAAG,MAAM,SAAS,UAAU,GAAE;AAAA,QACpH,gBAAAR,MAACQ,QAAA,EAAK,MAAK,QACR,gBAAM;AAAA,UACL,SAAS,QAAQ,aACb,+DACA,gEAAgE,QAAQ,MAAM,SAAS,YAAY,IAAI,CAAC,CAAC;AAAA,QAC/G,GACF;AAAA,QACA,gBAAAR,MAACO,OAAA,EAAI,WAAW,GACd,0BAAAP,MAAC,YAAS,OAAc,OAAO,CAAC,EAAE,KAAK,KAAK,OAAO,YAAY,GAAG,EAAE,KAAK,KAAK,OAAO,aAAa,GAAG,EAAE,KAAK,KAAK,OAAO,OAAO,CAAC,GAAG,GACrI;AAAA,SACF;AAAA,EAEN;AACF;;;AClNO,SAAS,oBAAoB,OAA2C,CAAC,GAAiB;AAC/F,SAAO,EAAE,OAAO,KAAK,SAAS,IAAI,QAAQ,GAAG,UAAU,KAAK,QAAQ,EAAE,CAAC,KAAK,KAAK,GAAG,KAAK,IAAI,CAAC,EAAE;AAClG;AAQO,SAAS,SAAS,MAAmB,OAA8B;AACxE,QAAM,IAAI,MAAM,KAAK,EAAE,YAAY;AACnC,MAAI,CAAC,EAAG,QAAO;AACf,QAAM,QAAQ,KAAK,MAAM,YAAY;AACrC,QAAM,OAAO,KAAK,YAAY,KAAK,GAAG,EAAE,YAAY;AACpD,QAAM,KAAK,KAAK,GAAG,YAAY;AAC/B,MAAI,MAAM,SAAS,MAAM,QAAQ,MAAM,GAAI,QAAO;AAClD,MAAI,MAAM,WAAW,CAAC,KAAK,KAAK,OAAO,YAAY,EAAE,WAAW,CAAC,KAAK,KAAK,WAAW,CAAC,KAAK,GAAG,WAAW,CAAC,EAAG,QAAO;AACrH,QAAM,QAAQ,CAAC,UAAU,GAAG,IAAI,GAAG,UAAU,GAAG,EAAE,GAAG,UAAU,GAAG,KAAK,OAAO,KAAK,WAAW,CAAC,EAAE;AAAA,IAC/F,CAAC,MAAmB,MAAM;AAAA,EAC5B;AACA,SAAO,MAAM,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC,IAAI;AAC1D;AAGO,SAAS,YAAY,OAA+B,OAAmC;AAC5F,QAAM,UAAU,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM;AAC7C,QAAM,SAAS,oBAAI,IAAiF;AACpG,aAAW,QAAQ,SAAS;AAC1B,UAAM,QAAQ,OAAO,IAAI,KAAK,KAAK,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,EAAE;AAC7D,UAAM,SAAS;AACf,UAAM,OAAO,SAAS,MAAM,MAAM,KAAK;AACvC,QAAI,SAAS,KAAM,OAAM,KAAK,KAAK,EAAE,MAAM,KAAK,CAAC;AACjD,WAAO,IAAI,KAAK,OAAO,KAAK;AAAA,EAC9B;AACA,QAAM,YAAY,MAAM,MAAM,KAAK,EAAE,SAAS;AAC9C,QAAM,OAAqB,CAAC;AAE5B,QAAM,OAAO,CAAC,UAAkB,KAAK,IAAI,GAAI,OAAO,IAAI,KAAK,GAAG,KAAK,IAAI,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,QAAQ,CAAE;AACtG,QAAM,QAAQ,CAAC,GAAG,OAAO,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,OAAO,YAAY,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,MAAM,EAAE,cAAc,CAAC,CAAC;AACzG,aAAW,SAAS,OAAO;AACzB,UAAM,QAAQ,OAAO,IAAI,KAAK;AAC9B,QAAI,aAAa,MAAM,KAAK,WAAW,EAAG;AAC1C,UAAM,WAAW,MAAM,SAAS,KAAK,KAAK;AAC1C,SAAK,KAAK,EAAE,MAAM,SAAS,OAAO,SAAS,MAAM,KAAK,QAAQ,OAAO,MAAM,OAAO,SAAS,CAAC;AAC5F,QAAI,CAAC,SAAU;AACf,UAAM,OAAO,YAAY,CAAC,GAAG,MAAM,IAAI,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI,IAAI,MAAM;AACjF,eAAW,OAAO,KAAM,MAAK,KAAK,EAAE,MAAM,QAAQ,MAAM,IAAI,MAAM,MAAM,CAAC;AAAA,EAC3E;AACA,SAAO;AACT;AAEO,SAAS,eAAe,OAAqB,QAAuB,MAA2C;AACpH,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,OAAO,MAAM,QAAQ,OAAO,MAAM,QAAQ,GAAG,UAAU,CAAC,EAAE;AAAA,IAC/E,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,OAAO,CAAC,GAAG,MAAM,KAAK,EAAE,MAAM,GAAG,EAAE,EAAE,KAAK,EAAE,GAAG,QAAQ,GAAG,UAAU,CAAC,EAAE;AAAA,IAC5F,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,OAAO,IAAI,QAAQ,GAAG,UAAU,CAAC,EAAE;AAAA,IACxD,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,SAAS,GAAG,MAAM,SAAS,OAAO,KAAK,CAAC,EAAE;AAAA,IACjG,KAAK,QAAQ;AACX,YAAM,MAAM,KAAK,MAAM,MAAM;AAC7B,UAAI,CAAC,IAAK,QAAO;AACjB,YAAM,QAAQ,IAAI;AAClB,YAAM,WAAW,EAAE,GAAG,MAAM,UAAU,CAAC,KAAK,GAAG,OAAO,OAAO;AAE7D,YAAM,aAAa,KAAK,UAAU,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,UAAU,KAAK;AAChF,aAAO,EAAE,GAAG,OAAO,UAAU,QAAQ,CAAC,OAAO,UAAU,cAAc,IAAI,aAAa,MAAM,OAAO;AAAA,IACrG;AAAA,IACA;AACE,aAAO;AAAA,EACX;AACF;AAMO,SAAS,mBAAmB,OAA+B,OAAqB,QAAqC;AAC1H,QAAM,OAAO,eAAe,OAAO,QAAQ,YAAY,OAAO,KAAK,CAAC;AACpE,MAAI,OAAO,SAAS,UAAU,OAAO,SAAS,eAAe,OAAO,SAAS,QAAS,QAAO;AAC7F,MAAI,CAAC,KAAK,MAAO,QAAO;AACxB,QAAM,QAAQ,YAAY,OAAO,IAAI,EAAE,UAAU,CAAC,QAAQ,IAAI,SAAS,MAAM;AAC7E,SAAO,SAAS,IAAI,EAAE,GAAG,MAAM,QAAQ,MAAM,IAAI;AACnD;AAMO,SAAS,iBAAiB,OAAqB,OAAe,KAAmB,MAA6C;AACnI,QAAM,MAAM,KAAK,KAAK,IAAI,MAAM,QAAQ,KAAK,SAAS,CAAC,CAAC;AACxD,MAAI,IAAI,QAAS,QAAO,EAAE,MAAM,QAAQ,OAAO,GAAG;AAClD,MAAI,IAAI,UAAW,QAAO,EAAE,MAAM,QAAQ,OAAO,EAAE;AACnD,MAAI,IAAI,OAAQ,QAAO,EAAE,MAAM,QAAQ,OAAO,IAAI;AAClD,MAAI,IAAI,SAAU,QAAO,EAAE,MAAM,QAAQ,OAAO,GAAG;AACnD,MAAI,IAAI,UAAW,QAAO,EAAE,MAAM,QAAQ,QAAQ,MAAM;AACxD,MAAI,IAAI,WAAY,QAAO,EAAE,MAAM,QAAQ,QAAQ,KAAK;AACxD,MAAI,IAAI,QAAQ;AACd,QAAI,CAAC,IAAK,QAAO;AACjB,QAAI,IAAI,SAAS,OAAQ,QAAO,EAAE,MAAM,QAAQ,MAAM,IAAI,KAAK;AAC/D,WAAO,EAAE,MAAM,QAAQ,QAAQ,CAAC,IAAI,SAAS;AAAA,EAC/C;AACA,MAAI,IAAI,OAAQ,QAAO,MAAM,QAAQ,EAAE,MAAM,QAAQ,IAAI,EAAE,MAAM,OAAO;AACxE,MAAI,IAAI,aAAa,IAAI,OAAQ,QAAO,EAAE,MAAM,YAAY;AAC5D,MAAI,IAAI,QAAQ,UAAU,IAAK,QAAO,EAAE,MAAM,QAAQ;AACtD,MAAI,IAAI,QAAQ,IAAI,QAAQ,IAAI,IAAK,QAAO;AAC5C,MAAI,UAAU,OAAO,CAAC,MAAM,MAAO,QAAO,EAAE,MAAM,OAAO;AACzD,SAAO,QAAQ,EAAE,MAAM,QAAQ,MAAM,MAAM,IAAI;AACjD;;;AFlGM,SA8BI,OAAAS,OA9BJ,QAAAC,cAAA;AAjBC,IAAM,eAAe,aAAa,EAAE;AAE3C,SAAS,MAAM,MAA2B;AACxC,MAAI,KAAK,SAAS,WAAY,QAAO,MAAM,IAAI,UAAU;AACzD,MAAI,KAAK,SAAS,QAAS,QAAO,MAAM,IAAI,OAAO;AACnD,MAAI,KAAK,YAAY,oBAAoB,KAAM,QAAO,MAAM,OAAO,OAAO;AAC1E,SAAO,KAAK,WAAW,MAAM,IAAI,MAAM,IAAI;AAC7C;AAEA,IAAM,UAAUC,OAAK,SAASC,SAAQ,EAAE,KAAK,UAAU,MAAM,GAA0D;AACrH,QAAM,UAAU,WAAW,MAAM,OAAO,MAAM,QAAQ,OAAO,IAAI;AACjE,MAAI,IAAI,SAAS,SAAS;AACxB,UAAMC,SAAQ,IAAI,WAAW,MAAM,QAAQ,WAAW,MAAM,QAAQ;AACpE,UAAM,QAAQ,MAAM,IAAI,IAAI,YAAY,IAAI,QAAQ,OAAO,IAAI,KAAK,IAAI,GAAG,IAAI,OAAO,OAAO,IAAI,KAAK,EAAE;AACxG,UAAM,OAAO,SAAS,IAAI,OAAO,KAAK,IAAI,GAAG,QAAQ,EAAE,CAAC;AACxD,UAAM,OAAO,KAAK,IAAI,GAAG,QAAQ,IAAI,aAAa,IAAI,IAAI,aAAa,KAAK,CAAC;AAC7E,WACE,gBAAAH,OAACI,QAAA,EAAK,MAAK,gBACR;AAAA;AAAA,MAAQ;AAAA,MAAE,MAAM,IAAID,MAAK;AAAA,MAAE;AAAA,MAAE,WAAW,MAAM,OAAO,MAAM,KAAK,IAAI,CAAC,IAAI,MAAM,KAAK,IAAI;AAAA,MACxF,IAAI,OAAO,IAAI;AAAA,MACf;AAAA,OACH;AAAA,EAEJ;AACA,QAAM,QAAQ,IAAI,KAAK,SAAS,aAAa,IAAI,KAAK,SAAS,IAAI,KAAK,YAAY,KAAK,GAAG;AAC5F,QAAM,MAAM,MAAM,IAAI,IAAI;AAC1B,QAAM,aAAa,KAAK,IAAI,GAAG,QAAQ,IAAI,aAAa,GAAG,IAAI,CAAC;AAChE,QAAM,OAAO,OAAO,SAAS,OAAO,UAAU,GAAG,UAAU;AAC3D,SACE,gBAAAH,OAACI,QAAA,EAAK,MAAK,gBACR;AAAA;AAAA,IAAQ;AAAA,IAAI,WAAW,MAAM,OAAO,IAAI,IAAI;AAAA,IAAK;AAAA,IAAE;AAAA,KACtD;AAEJ,CAAC;AAGM,IAAM,aAAaH,OAAK,SAASI,YAAW,EAAE,MAAM,OAAO,OAAO,GAAyD;AAChI,QAAM,QAAQC,SAAQ,MAAM,eAAe,KAAK,WAAW,GAAG,CAAC,IAAI,CAAC;AACpE,QAAM,UAAUA,SAAQ,MAAM,kBAAkB,MAAM,KAAK,WAAW,GAAG,CAAC,IAAI,CAAC;AAC/E,QAAM,YAAY,KAAK,IAAI,IAAI,KAAK,IAAI,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,aAAa,GAAG,EAAE,IAAI,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;AACtG,QAAM,YAAY,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,SAAS,MAAM,SAAS,CAAC,CAAC;AACpE,QAAM,QAAQ,UAAU,KAAK,aAAa,OAAO,SAAS;AAC1D,QAAM,aAAa,MAAM,MAAM,GAAG,KAAK,IAAI,GAAG,SAAS,IAAI,MAAM,MAAM,CAAC;AACxE,SACE,gBAAAN,OAACO,OAAA,EAAI,eAAc,UAAS,OAC1B;AAAA,oBAAAP,OAACO,OAAA,EAAI,OACH;AAAA,sBAAAR,MAACQ,OAAA,EAAI,UAAU,GACb,0BAAAR,MAACK,QAAA,EAAK,MAAK,gBAAgB,gBAAM,KAAK,KAAK,YAAY,KAAK,GAAG,CAAC,GAAE,GACpE;AAAA,MACA,gBAAAL,MAACK,QAAA,EAAM,gBAAM,IAAI,GAAE;AAAA,OACrB;AAAA,IACA,gBAAAL,MAACK,QAAA,EAAK,MAAK,gBAAgB,kBAAQ,KAAK,KAAK,GAAE;AAAA,IAC/C,gBAAAL,MAACK,QAAA,EAAK,eAAC;AAAA,IACN,MAAM,IAAI,CAAC,MAAM,MAChB,gBAAAL,MAACK,QAAA,EAAa,MAAK,gBAChB,gBAAM,IAAI,IAAI,KADN,CAEX,CACD;AAAA,IACD,gBAAAL,MAACK,QAAA,EAAK,eAAC;AAAA,IACP,gBAAAL,MAACK,QAAA,EAAM,gBAAM,IAAI,OAAO,GAAE;AAAA,IACzB,MAAM,WAAW,IAAI,gBAAAL,MAACK,QAAA,EAAM,gBAAM,IAAI,QAAQ,GAAE,IAAU;AAAA,IAC1D,WAAW,IAAI,CAAC,SACf,gBAAAJ,OAACI,QAAA,EAAqB,MAAK,gBACxB;AAAA;AAAA,MACA,OAAO,SAAS,GAAG,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,SAAS,GAAG,SAAS;AAAA,MAAE;AAAA,MAAE,KAAK,WAAW,MAAM,UAAU,UAAU,IAAI;AAAA,MAAY;AAAA,MAClI,MAAM,IAAI,KAAK,WAAW;AAAA,SAHlB,KAAK,IAIhB,CACD;AAAA,IACA,MAAM,SAAS,WAAW,SAAS,gBAAAL,MAACK,QAAA,EAAM,gBAAM,IAAI,MAAM,MAAM,SAAS,WAAW,MAAM,OAAO,GAAE,IAAU;AAAA,IAC9G,gBAAAL,MAACK,QAAA,EAAK,eAAC;AAAA,IACP,gBAAAL,MAACK,QAAA,EAAM,gBAAM,IAAI,SAAS,GAAE;AAAA,IAC5B,gBAAAJ,OAACI,QAAA,EAAK,MAAK,gBAAe;AAAA;AAAA,MAAG;AAAA,OAAQ;AAAA,KACvC;AAEJ,CAAC;AAOM,SAAS,YAAY,OAAyB;AACnD,QAAM,EAAE,OAAO,UAAU,OAAO,QAAQ,OAAO,IAAI;AACnD,QAAM,CAAC,OAAO,QAAQ,IAAII,UAAuB,MAAM;AACrD,UAAM,UAAU,oBAAoB,EAAE,OAAO,MAAM,cAAc,OAAO,MAAM,aAAa,CAAC;AAC5F,WAAO,QAAQ,QAAQ,mBAAmB,OAAO,EAAE,GAAG,SAAS,OAAO,GAAG,GAAG,EAAE,MAAM,QAAQ,MAAM,QAAQ,MAAM,CAAC,IAAI;AAAA,EACvH,CAAC;AACD,QAAM,CAAC,SAAS,UAAU,IAAIA,UAA6B,IAAI;AAC/D,QAAM,OAAOF,SAAQ,MAAM,YAAY,OAAO,KAAK,GAAG,CAAC,OAAO,KAAK,CAAC;AACpE,QAAM,SAAS,KAAK,IAAI,MAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,SAAS,CAAC,CAAC;AAClE,QAAM,UAAU,KAAK,MAAM;AAE3B,EAAAG;AAAA,IACE,CAAC,OAAO,QAAQ;AACd,YAAM,UAAU,iBAAiB,EAAE,GAAG,OAAO,OAAO,GAAG,OAAO,KAAK,IAAI;AACvE,UAAI,CAAC,QAAS;AACd,UAAI,QAAQ,SAAS,OAAQ,QAAO;AAAA,eAC3B,QAAQ,SAAS,OAAQ,YAAW,QAAQ,IAAI;AAAA,UACpD,UAAS,CAAC,MAAM,mBAAmB,OAAO,EAAE,GAAG,GAAG,OAAO,GAAG,OAAO,CAAC;AAAA,IAC3E;AAAA,IACA,EAAE,UAAU,CAAC,QAAQ;AAAA,EACvB;AAEA,MAAI,SAAS;AACX,WAAO,gBAAAV,MAAC,WAAQ,MAAM,SAAS,UAAoB,OAAc,QAAgB,OAAM,QAAO,QAAQ,MAAM,WAAW,IAAI,GAAG;AAAA,EAChI;AAEA,QAAM,eAAe,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE;AACpD,QAAM,aAAa,IAAI,IAAI,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE;AAC/E,QAAM,UAAU,SAAS;AACzB,QAAM,YAAY,UAAU,KAAK,IAAI,IAAI,KAAK,MAAM,QAAQ,IAAI,CAAC,IAAI;AACrE,QAAM,aAAa,QAAQ,YAAY;AACvC,QAAM,aAAa,KAAK,IAAI,GAAG,UAAU,UAAU,IAAI,EAAE;AACzD,QAAM,EAAE,OAAO,IAAI,IAAI,aAAa,KAAK,QAAQ,QAAQ,UAAU;AACnE,QAAM,SAAS,GAAG,MAAM,IAAI,QAAQ,CAAC,IAAI,MAAM,OAAO,MAAM,QAAQ,OAAO,CAAC,IAAI,MAAM,KAAK,GAAG,MAAM,OAAO,MAAM,QAAQ,MAAM,CAAC;AAChI,QAAM,QAAQ,GAAG,MAAM,KAAK,OAAO,CAAC,IAAI,MAAM,IAAI,GAAG,MAAM,QAAQ,MAAM,IAAI,YAAY,OAAO,UAAU,SAAS,CAAC;AACpH,QAAM,OAAO,MAAM;AAAA,IACjB,UAAU,GAAG,MAAM,QAAQ,KAAK,OAAO,YAAY,CAAC,CAAC,SAAI,MAAM,QAAQ,KAAK,OAAO,KAAK,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,KAAK,MAAM,QAAQ,KAAK,OAAO,KAAK;AAAA,EACrJ;AACA,QAAM,aAAa,SAAS,SAAS,SAAS,QAAQ,OAAO;AAE7D,SACE,gBAAAC,OAACO,OAAA,EAAI,eAAc,UAAS,OAC1B;AAAA,oBAAAP,OAACO,OAAA,EAAI,OACH;AAAA,sBAAAR,MAACQ,OAAA,EAAI,UAAU,GACb,0BAAAR,MAACK,QAAA,EAAK,MAAK,gBAAgB,iBAAM,GACnC;AAAA,MACA,gBAAAL,MAACK,QAAA,EAAK,MAAK,gBAAgB,kBAAO;AAAA,OACpC;AAAA,IACA,gBAAAL,MAACK,QAAA,EAAK,MAAK,gBAAgB,gBAAM,UAAU,OAAO,MAAM,IAAI,IAAI,OAAO,KAAK,CAAC,GAAE;AAAA,IAC/E,gBAAAJ,OAACO,OAAA,EAAI,OACH;AAAA,sBAAAP,OAACO,OAAA,EAAI,eAAc,UAAS,OAAO,WAChC;AAAA,aAAK,WAAW,IAAI,gBAAAR,MAACK,QAAA,EAAM,gBAAM,IAAI,qBAAqB,MAAM,KAAK,GAAG,GAAE,IAAU;AAAA,QACpF,KAAK,MAAM,OAAO,GAAG,EAAE,IAAI,CAAC,KAAK,MAChC,gBAAAL;AAAA,UAAC;AAAA;AAAA,YAEC;AAAA,YACA,UAAU,QAAQ,MAAM;AAAA,YACxB,OAAO;AAAA;AAAA,UAHF,IAAI,SAAS,UAAU,KAAK,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,EAAE;AAAA,QAIjE,CACD;AAAA,SACH;AAAA,MACC,UACC,gBAAAA,MAACQ,OAAA,EAAI,eAAc,UAAS,YAAY,GAAG,aAAa,GAAG,aAAa,MAAM,UAAU,WAAW,WAAW,WAAW,OAAO,aAAa,OAAO,cAAc,OAAO,gBAAc,MAAC,OAAO,aAAa,GACzM,uBACC,gBAAAR,MAAC,cAAW,MAAM,YAAY,OAAO,YAAY,QAAQ,YAAY,IAErE,gBAAAA,MAACK,QAAA,EAAM,gBAAM,IAAI,SAAS,SAAS,UAAU,GAAG,QAAQ,KAAK,wCAAmC,eAAe,GAAE,GAErH,IACE;AAAA,OACN;AAAA,IACC,CAAC,WAAW,aACX,gBAAAL,MAACQ,OAAA,EAAI,WAAW,GACd,0BAAAR,MAACK,QAAA,EAAK,MAAK,gBAAgB,gBAAM,IAAI,QAAQ,WAAW,eAAe,WAAW,KAAK,CAAC,GAAE,GAC5F,IACE;AAAA,IACJ,gBAAAL,MAACK,QAAA,EAAK,MAAK,gBAAgB,gBAAM,IAAI,MAAM,QAAQ,KAAK,OAAO,KAAK,CAAC,GAAE;AAAA,IACvE,gBAAAL;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,OAAO;AAAA,UACL,EAAE,KAAK,MAAM,QAAQ,QAAQ,OAAO,OAAO;AAAA,UAC3C,EAAE,KAAK,MAAM,QAAQ,WAAW,OAAO,OAAO;AAAA,UAC9C,EAAE,KAAK,SAAS,OAAO,MAAM;AAAA,UAC7B,EAAE,KAAK,QAAQ,OAAO,SAAS;AAAA,UAC/B,EAAE,KAAK,OAAO,OAAO,MAAM,QAAQ,UAAU,OAAO;AAAA,QACtD;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;;;AGvLO,IAAM,gBAA0B,EAAE,MAAM,MAAM,kBAAkB,MAAM,QAAQ,KAAK;AAEnF,SAAS,aAAa,MAAgB,WAAyE;AACpH,QAAM,UAAU,KAAK;AACrB,SAAO;AAAA,IACL,EAAE,MAAM,QAAQ,aAAa,mBAAmB;AAAA,IAChD,EAAE,MAAM,SAAS,aAAa,YAAY,UAAU,SAAS,WAAW,oBAAoB;AAAA,IAC5F,EAAE,MAAM,aAAa,aAAa,YAAY,OAAO,8BAA8B,UAAU,IAAI,GAAG,OAAO,aAAa,eAAe;AAAA,IACvI,EAAE,MAAM,UAAU,aAAa,2BAA2B;AAAA,IAC1D,EAAE,MAAM,QAAQ,aAAa,oBAAoB;AAAA,IACjD,EAAE,MAAM,QAAQ,aAAa,cAAc;AAAA,EAC7C;AACF;AAEO,SAAS,cAAc,MAAmC;AAC/D,SAAO,CAAC,QAAQ,SAAS,aAAa,UAAU,QAAQ,QAAQ,MAAM,EAAE,SAAS,IAAI;AACvF;AAEO,IAAM,iBAAkD;AAAA,EAC7D,CAAC,gBAAgB,gCAAgC;AAAA,EACjD,CAAC,KAAK,8DAA8D;AAAA,EACpE,CAAC,OAAO,sBAAsB;AAAA,EAC9B,CAAC,OAAO,8BAA8B;AAAA,EACtC,CAAC,UAAU,6CAA6C;AAAA,EACxD,CAAC,iBAAO,oCAAoC;AAAA,EAC5C,CAAC,gBAAa,MAAM;AACtB;;;ACrCA,SAAS,OAAAW,OAAe,QAAAC,cAAY;AACpC,SAAS,QAAAC,cAAY;;;ACDrB,SAAS,OAAAC,OAAK,QAAAC,cAAY;AAC1B,SAAS,QAAAC,cAAY;;;ACDrB,SAAS,OAAAC,OAAK,QAAAC,cAAY;AAC1B,OAAO,cAAc;AAiBQ,gBAAAC,aAAA;AAbtB,IAAM,gBAAgB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AACF;AACO,IAAM,iBAAiB;AAOvB,SAAS,WAAW;AACzB,MAAI,CAAC,MAAM,QAAS,QAAO,gBAAAA,MAACC,QAAA,EAAM,gBAAM,WAAW,QAAQ,GAAE;AAC7D,QAAM,OAAO,cAAc,IAAI,CAAC,QAAQ,IAAI,OAAO,cAAc,CAAC;AAClE,QAAM,WAAW,MAAM;AACvB,MAAI,UAAU;AACZ,WACE,gBAAAD,MAAC,YAAS,QAAQ,CAAC,GAAG,QAAQ,GAC5B,0BAAAA,MAACC,QAAA,EAAM,eAAK,KAAK,IAAI,GAAE,GACzB;AAAA,EAEJ;AACA,SACE,gBAAAD,MAACE,OAAA,EAAI,eAAc,UAChB,eAAK,IAAI,CAAC,KAAK,MACd,gBAAAF,MAACC,QAAA,EAAc,gBAAM,OAAO,GAAG,KAApB,CAAsB,CAClC,GACH;AAEJ;;;ADGW,gBAAAE,OAML,QAAAC,cANK;AArBJ,IAAM,kBAAkB,aAAa,EAAE;AAEvC,SAAS,cAAc,EAAE,SAAS,SAAS,QAAQ,GAAuC;AAC/F,QAAM,MAAM,MAAM,IAAI,IAAI,MAAM,QAAQ,MAAM,GAAG;AACjD,QAAM,MAAM,SAAS,QAAQ,SAAS;AACtC,QAAM,QAAQ;AAAA,IACZ,MAAM,WAAW,UAAU,OAAO,EAAE;AAAA,IACpC,OAAO;AAAA,IACP,SAAS,OAAO,WAAW,QAAQ,IAAI,IAAI;AAAA,IAC3C,MAAM,IAAI,OAAO;AAAA,EACnB,EAAE,OAAO,CAAC,MAAmB,QAAQ,CAAC,CAAC;AACvC,SAAO,MAAM,KAAK,GAAG;AACvB;AAEO,SAAS,WAAW,OAAuB;AAChD,SAAO,QAAQ,MAAM,OAAO,CAAC,EAAE,YAAY,IAAI,MAAM,MAAM,CAAC,IAAI;AAClE;AAEO,IAAM,SAASC,OAAK,SAASC,QAAO,OAAoB;AAC7D,QAAM,EAAE,SAAS,OAAO,UAAU,iCAAiC,IAAI;AACvE,MAAI,QAAQ,mBAAmB,CAAC,MAAM,SAAS;AAC7C,WAAO,gBAAAH,MAACI,QAAA,EAAK,MAAK,gBAAgB,wBAAc,KAAK,GAAE;AAAA,EACzD;AACA,QAAM,cAAc,SAAS,iBAAiB,IAAI,QAAQ;AAC1D,SACE,gBAAAH,OAACI,OAAA,EACC;AAAA,oBAAAL,MAAC,YAAS;AAAA,IACV,gBAAAC,OAACI,OAAA,EAAI,eAAc,UAAS,YAAY,GACtC;AAAA,sBAAAL,MAACI,QAAA,EAAK,eAAC;AAAA,MACP,gBAAAJ,MAACI,QAAA,EAAM,gBAAM,KAAK,UAAU,OAAO,EAAE,GAAE;AAAA,MACvC,gBAAAJ,MAACI,QAAA,EAAK,MAAK,gBAAgB,wBAAc,MAAM,IAAI,OAAO,IAAI,IAAG;AAAA,OACnE;AAAA,KACF;AAEJ,CAAC;;;ADPQ,gBAAAE,OAWC,QAAAC,cAXD;AA7BF,IAAM,iBAAiB,aAAa,GAAG;AAoB9C,SAAS,YAAY,EAAE,UAAU,MAAM,MAAM,GAAiE;AAC5G,QAAM,EAAE,QAAQ,IAAI;AACpB,QAAM,MAAM,MAAM,IAAI,IAAI,MAAM,QAAQ,MAAM,GAAG;AACjD,QAAM,MAAM,QAAQ,WAChB,CAAC,QAAQ,MAAM,QAAQ,OAAO,OAAO,WAAW,IAAI,IAAI,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,KAAK,MAAM,IAAI,oBAAoB,IACzH,MAAM,UAAU,eAAe;AACnC,QAAM,OAAO,GAAG,QAAQ,WAAW,MAAM,QAAQ,MAAM,QAAQ,GAAG,IAAI,MAAM,UAAU,MAAM,QAAQ,GAAG,CAAC,IAAI,GAAG;AAC/G,QAAM,QAAQ,MAAM,IAAI,WAAW,SAAS,WAAW,IAAI,MAAM,QAAQ,MAAM,IAAI,SAAS,OAAO,EAAE;AACrG,QAAM,OAAO,QAAQ,aAAa,IAAI,IAAI,aAAa,KAAK;AAC5D,SAAO,gBAAAD,MAACE,QAAA,EAAK,MAAK,gBAAgB,kBAAQ,IAAI,GAAG,IAAI,GAAG,IAAI,OAAO,IAAI,CAAC,GAAG,KAAK,KAAK,MAAK;AAC5F;AAEA,IAAM,eAAeC,OAAK,SAASC,cAAa,EAAE,UAAU,OAAO,QAAQ,GAA0E;AACnJ,QAAM,YAAY;AAClB,SACE,gBAAAH,OAACI,OAAA,EAAI,eAAc,UAAS,OAC1B;AAAA,oBAAAL,MAACE,QAAA,EAAM,gBAAM,IAAI,OAAO,GAAE;AAAA,IACzB,SACE,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM,EAC/B,IAAI,CAAC,MACJ,gBAAAD,OAACC,QAAA,EAAkB,MAAK,gBACrB;AAAA,YAAM,OAAO,OAAO,IAAI,EAAE,IAAI,IAAI,SAAS,CAAC;AAAA,MAC5C,SAAS,EAAE,aAAa,KAAK,IAAI,GAAG,QAAQ,YAAY,CAAC,CAAC;AAAA,MAC1D,EAAE,SAAS,eAAe,UAAU,IAAI,MAAM,UAAU,MAAM,QAAQ,GAAG,CAAC,KAAK;AAAA,SAHvE,EAAE,IAIb,CACD;AAAA,KACL;AAEJ,CAAC;AAED,SAAS,OAAO,OAAmI;AACjJ,QAAM,EAAE,MAAM,OAAO,OAAO,MAAM,SAAS,IAAI;AAC/C,QAAM,QAAQ,gBAAAF,MAACE,QAAA,EAAM,gBAAM,IAAI,cAAc,GAAE;AAC/C,MAAI,CAAC,SAAS,QAAQ,YAAY;AAChC,WACE,gBAAAD,OAACI,OAAA,EAAI,eAAc,UAAS,OACzB;AAAA;AAAA,MACD,gBAAAL,MAACE,QAAA,EAAK,MAAK,gBAAgB,gBAAM,IAAI,+CAA+C,GAAE;AAAA,OACxF;AAAA,EAEJ;AACA,MAAI,KAAK,WAAW,MAAM;AACxB,WACE,gBAAAD,OAACI,OAAA,EAAI,eAAc,UAAS,OACzB;AAAA;AAAA,MACD,gBAAAL,MAACE,QAAA,EAAM,gBAAM,IAAI,KAAK,QAAQ,mBAAmB,KAAK,KAAK,KAAK,UAAU,MAAM,QAAQ,QAAQ,EAAE,GAAE;AAAA,OACtG;AAAA,EAEJ;AACA,SACE,gBAAAD,OAACI,OAAA,EAAI,eAAc,UAAS,OACzB;AAAA;AAAA,IACA,KAAK,OAAO,WAAW,IAAI,gBAAAL,MAACE,QAAA,EAAM,gBAAM,IAAI,wCAAwC,GAAE,IAAU;AAAA,IAChG,KAAK,OAAO,SAAS,IACpB,gBAAAF;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,KAAK,OAAO,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,OAAO,EAAE,OAAO,MAAM,EAAE,KAAK,EAAE;AAAA,QAC1E;AAAA,QACA,QAAQ;AAAA,QACR,UAAU,UAAU;AAAA,QACpB,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,UAAU,CAAC,SAAS,MAAM,eAAe,KAAK,IAAI,KAAK,KAAK;AAAA,QAC5D,UAAU,MAAM;AAAA;AAAA,IAClB,IACE;AAAA,KACN;AAEJ;AAGO,SAAS,SAAS,OAAsB;AAC7C,QAAM,EAAE,UAAU,MAAM,UAAU,SAAS,OAAO,OAAO,IAAI;AAC7D,QAAM,OAAO,SAAS;AACtB,QAAM,OAAO,UAAU;AACvB,QAAM,eAAe,SAAS,mBAAmB;AACjD,QAAM,cAAc,SAAS;AAC7B,QAAM,aAAa,OAAO,IAAI,UAAU,KAAK,IAAI;AACjD,QAAM,WAAW,OAAO,KAAK,OAAO,QAAQ,KAAK,CAAC,IAAI;AACtD,QAAM,UAAU,EAAE,MAAM,SAAS,QAAQ,MAAM,OAAO,SAAS,QAAQ,OAAO,MAAM,KAAK,KAAK;AAE9F,SACE,gBAAAC,OAACI,OAAA,EAAI,eAAc,UAAS,OACzB;AAAA,mBACC,gBAAAL,MAAC,UAAO,SAAS,SAAS,SAAS,SAAS,SAAS,aAAa,OAAc,SAAkB,IAElG,gBAAAA,MAAC,UAAO,SAAS,SAAS,SAAS,SAAS,SAAS,aAAa,OAAO,KAAK,IAAI,OAAO,kBAAkB,CAAC,GAAG,SAAkB;AAAA,IAElI,cACC,gBAAAA,MAACK,OAAA,EAAI,WAAW,GACd,0BAAAL,MAAC,eAAY,UAAoB,MAAM,KAAK,MAAM,OAAc,GAClE,IACE;AAAA,IACJ,gBAAAC,OAACI,OAAA,EAAI,WAAW,GAAG,eAAe,OAAO,QAAQ,UAAU,OACzD;AAAA,sBAAAL,MAAC,gBAAa,UAAoB,OAAO,UAAU,SAAS,KAAK,kBAAkB;AAAA,MAClF,aAAa,IACZ,gBAAAA,MAACK,OAAA,EAAI,YAAY,OAAO,IAAI,GAAG,WAAW,OAAO,IAAI,GACnD,0BAAAL,MAAC,UAAQ,GAAG,OAAO,OAAO,UAAU,MAAM,YAAY,GACxD,IACE;AAAA,OACN;AAAA,IACC,QAAQ,SAAS,IAChB,gBAAAA,MAACK,OAAA,EAAI,WAAW,GACd,0BAAAL,MAAC,WAAQ,UAAU,SAAS,UAAU,MAAM,cAAc,OAAc,GAC1E,IACE;AAAA,IACJ,gBAAAA,MAACK,OAAA,EAAI,WAAW,GACd,0BAAAL;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ,MAAM;AAAA,QACd,UAAU,MAAM;AAAA,QAChB,UAAU,MAAM;AAAA,QAChB,OAAO,MAAM;AAAA,QACb,UAAU,MAAM,UAAU;AAAA,QAC1B;AAAA,QACA,aAAa,QAAQ,kBAAkB,2CAA2C;AAAA,QAClF,OAAK;AAAA;AAAA,IACP,GACF;AAAA,IACC,MAAM,SAAS,gBAAAA,MAACE,QAAA,EAAK,MAAK,gBAAgB,gBAAM,QAAO,IAAU;AAAA,IAClE,gBAAAF;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,OAAO;AAAA,UACL,EAAE,KAAK,SAAS,OAAO,OAAO;AAAA,UAC9B,EAAE,KAAK,KAAK,OAAO,WAAW;AAAA,UAC9B,GAAI,SAAS,QAAQ,cAAc,aAAa,IAAI,CAAC,EAAE,KAAK,OAAO,OAAO,eAAe,CAAC,IAAI,CAAC;AAAA,UAC/F,EAAE,KAAK,UAAU,OAAO,OAAO;AAAA,QACjC;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;;;AToDQ,gBAAAM,OAeA,QAAAC,cAfA;AAlLR,IAAMC,mBAAkB;AAGxB,SAAS,SAAS,EAAE,OAAO,GAAuB;AAChD,EAAAC,WAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,IAAI,UAAU,UAAU,OAAO,IAAI,OAAQ,QAAO;AAAA,EACxD,CAAC;AACD,SAAO;AACT;AAEO,SAAS,KAAK,OAAkB;AACrC,QAAM,EAAE,UAAU,OAAO,QAAQ,QAAQ,OAAO,SAAS,IAAI;AAC7D,QAAM,CAAC,OAAO,QAAQ,IAAIC,UAAgB,EAAE,MAAM,OAAO,CAAC;AAC1D,QAAM,CAAC,MAAM,OAAO,IAAIA,UAAmB,MAAM,eAAe,aAAa;AAC7E,QAAM,CAAC,QAAQ,cAAc,IAAIC,YAAW,eAAe,WAAW;AACtE,QAAM,CAAC,cAAc,eAAe,IAAID,UAAS,CAAC;AAClD,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAgC,UAAU;AACpE,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAwB,IAAI;AACxD,QAAM,YAAYE,QAAO,CAAC;AAC1B,QAAM,UAAUA,QAAO,IAAI;AAC3B,EAAAC;AAAA,IACE,MAAM,MAAM;AACV,cAAQ,UAAU;AAAA,IACpB;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,WAAWC,aAAY,YAAY;AACvC,QAAI,MAAM,eAAe,CAAC,SAAS,QAAQ,WAAY;AACvD,UAAM,CAAC,MAAM,WAAW,OAAO,IAAI,MAAM,QAAQ,WAAW;AAAA,MAC1D,SAAS,SAAS;AAAA,MAClB,SAAS,qBAAqB;AAAA,MAC9B,SAAS,YAAY,EAAE,MAAM,WAAW,MAAM,UAAU,CAAC;AAAA,IAC3D,CAAC;AACD,QAAI,CAAC,QAAQ,QAAS;AACtB,YAAQ;AAAA,MACN,MAAM,KAAK,WAAW,cAAc,KAAK,QAAQ;AAAA,MACjD,kBAAkB,UAAU,WAAW,cAAc,UAAU,MAAM,SAAS;AAAA,MAC9E,QACE,QAAQ,WAAW,cACf,QAAQ,MAAM,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,OAAO;AAAA,QACpC,IAAI,EAAE;AAAA,QACN,OAAO,EAAE,OAAO,KAAK,KAAK;AAAA,QAC1B,MAAM,aAAa,IAAI,KAAK,EAAE,iBAAiB,EAAE,SAAS,CAAC;AAAA,MAC7D,EAAE,IACF;AAAA,MACN,OAAO,QAAQ,WAAW,aAAa,WAAW,QAAQ,MAAM,EAAE,UAAU;AAAA,IAC9E,CAAC;AAAA,EACH,GAAG,CAAC,MAAM,aAAa,MAAM,WAAW,UAAU,IAAI,CAAC;AAEvD,EAAAD,WAAU,MAAM;AACd,QAAI,MAAM,SAAS,OAAQ,MAAK,SAAS;AAAA,EAC3C,GAAG,CAAC,MAAM,MAAM,QAAQ,CAAC;AAEzB,EAAAA,WAAU,MAAM;AACd,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,QAAQ,WAAW,MAAM,UAAU,IAAI,GAAG,GAAI;AACpD,WAAO,MAAM,aAAa,KAAK;AAAA,EACjC,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,WAAWE,SAAQ,MAAM,aAAa,MAAM,SAAS,eAAe,GAAG,CAAC,MAAM,SAAS,eAAe,CAAC;AAC7G,QAAM,UAAU,eAAe,UAAU,OAAO,KAAK;AACrD,QAAM,WAAW,KAAK,IAAI,cAAc,KAAK,IAAI,GAAG,QAAQ,SAAS,CAAC,CAAC;AACvE,QAAM,SAASD,aAAY,MAAM,SAAS,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;AAE/D,QAAM,cAAcA;AAAA,IAClB,CAAC,SAA0B;AACzB,UAAI,SAAS,QAAQ,WAAY,QAAO;AACxC,gBAAU,MAAM,UAAU,GAAG,MAAM,QAAQ,SAAS,IAAI,IAAI,8CAA8C,CAAC;AAC3G,aAAO;AAAA,IACT;AAAA,IACA,CAAC,SAAS,QAAQ,UAAU;AAAA,EAC9B;AAEA,QAAM,OAAOA;AAAA,IACX,CAAC,SAAiB;AAChB,cAAQ,MAAM;AAAA,QACZ,KAAK;AACH,cAAI,YAAY,MAAM,EAAG,UAAS,EAAE,MAAM,OAAO,CAAC;AAClD;AAAA,QACF,KAAK,SAAS;AACZ,cAAI,CAAC,SAAS,QAAQ,UAAU;AAC9B,sBAAU,MAAM,UAAU,GAAG,MAAM,QAAQ,SAAS,uCAAuC,CAAC;AAC5F;AAAA,UACF;AACA,gBAAM,QAAQ,KAAK,IAAI;AACvB,mBAAS,EAAE,MAAM,SAAS,MAAM,CAAC;AACjC,mBACG,UAAU,EACV,KAAK,CAAC,UAAU,QAAQ,WAAW,SAAS,CAAC,MAAO,EAAE,SAAS,UAAU,EAAE,GAAG,GAAG,MAAM,IAAI,CAAE,CAAC,EAC9F,MAAM,CAAC,UAAmB,QAAQ,WAAW,SAAS,CAAC,MAAO,EAAE,SAAS,UAAU,EAAE,GAAG,GAAG,OAAO,WAAW,KAAK,EAAE,QAAQ,IAAI,CAAE,CAAC;AACtI;AAAA,QACF;AAAA,QACA,KAAK;AACH,cAAI,YAAY,WAAW,EAAG,UAAS,EAAE,MAAM,YAAY,CAAC;AAC5D;AAAA,QACF,KAAK,UAAU;AACb,mBAAS,EAAE,MAAM,UAAU,OAAO,KAAK,IAAI,EAAE,CAAC;AAC9C,mBACG,WAAW,EACX,KAAK,CAAC,SAAS,QAAQ,WAAW,SAAS,CAAC,MAAO,EAAE,SAAS,WAAW,EAAE,GAAG,GAAG,KAAK,IAAI,CAAE,CAAC,EAC7F,MAAM,CAAC,UAAmB,QAAQ,WAAW,SAAS,CAAC,MAAO,EAAE,SAAS,WAAW,EAAE,GAAG,GAAG,OAAO,WAAW,KAAK,EAAE,QAAQ,IAAI,CAAE,CAAC;AACvI;AAAA,QACF;AAAA,QACA,KAAK;AACH,mBAAS,EAAE,MAAM,OAAO,CAAC;AACzB;AAAA,QACF,KAAK;AAAA,QACL,KAAK;AACH,iBAAO;AACP;AAAA,QACF;AACE,oBAAU,MAAM,MAAM,GAAG,MAAM,QAAQ,KAAK,qBAAqB,IAAI,EAAE,CAAC;AAAA,MAC5E;AAAA,IACF;AAAA,IACA,CAAC,aAAa,UAAU,MAAM;AAAA,EAChC;AAEA,QAAME,UAASF;AAAA,IACb,CAAC,UAAkB;AACjB,YAAM,OAAO,MAAM,KAAK;AACxB,UAAI,CAAC,KAAM;AACX,YAAM,QAAQ,WAAW,IAAI;AAC7B,qBAAe,EAAE,MAAM,YAAY,OAAO,KAAK,CAAC;AAChD,qBAAe,EAAE,MAAM,QAAQ,CAAC;AAChC,sBAAgB,CAAC;AACjB,UAAI,OAAO;AACT,cAAM,QAAQ,cAAc,MAAM,IAAI,IAAI,MAAM,OAAO;AACvD,aAAK,SAAS,QAAQ,QAAQ,GAAG,QAAQ,MAAM,IAAI;AACnD;AAAA,MACF;AACA,UAAI,YAAY,MAAM,EAAG,UAAS,EAAE,MAAM,QAAQ,gBAAgB,KAAK,CAAC;AAAA,IAC1E;AAAA,IACA,CAAC,MAAM,SAAS,UAAU,WAAW;AAAA,EACvC;AAEA,QAAM,gBAAgBA;AAAA,IACpB,CAAC,OAAe,QAAsB;AACpC,UAAI,IAAI,QAAQ,UAAU,IAAK,QAAO;AACtC,UAAI,QAAQ,SAAS,MAAM,IAAI,WAAW,IAAI,YAAY;AACxD,wBAAgB,CAAC,MAAO,IAAI,UAAU,KAAK,IAAI,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,QAAQ,SAAS,GAAG,IAAI,CAAC,CAAE;AAC/F,eAAO;AAAA,MACT;AACA,UAAI,IAAI,KAAK;AACX,YAAI,QAAQ,SAAS,GAAG;AACtB,gBAAM,SAAS,QAAQ,QAAQ;AAC/B,cAAI,OAAQ,gBAAe,EAAE,MAAM,OAAO,OAAO,IAAI,OAAO,IAAI,GAAG,CAAC;AAAA,QACtE,WAAW,KAAK,QAAQ,OAAQ,UAAS,QAAQ;AACjD,eAAO;AAAA,MACT;AACA,UAAI,IAAI,QAAQ;AACd,uBAAe,EAAE,MAAM,QAAQ,CAAC;AAChC,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAAA,IACA,CAAC,SAAS,UAAU,KAAK,MAAM;AAAA,EACjC;AAGA,EAAAL;AAAA,IACE,CAAC,OAAO,QAAQ;AACd,UAAI,EAAE,IAAI,QAAQ,UAAU,KAAM;AAClC,YAAM,MAAM,KAAK,IAAI;AACrB,UAAI,MAAM,UAAU,UAAUD,kBAAiB;AAC7C,eAAO;AACP;AAAA,MACF;AACA,gBAAU,UAAU;AACpB,UAAI,OAAO,MAAO,gBAAe,EAAE,MAAM,QAAQ,CAAC;AAClD,gBAAU,MAAM,UAAU,6BAA6B,CAAC;AAAA,IAC1D;AAAA,IACA,EAAE,UAAU,MAAM,SAAS,OAAO;AAAA,EACpC;AAEA,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AACH,aACE,gBAAAF;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA,WAAW,MAAM;AAAA,UACjB,UAAU,MAAM;AAAA,UAChB,gBAAgB,MAAM;AAAA,UACtB;AAAA,UACA;AAAA,UACA,cAAY;AAAA,UACZ,QAAQ,CAAC,WAAY,WAAW,SAAS,OAAO,IAAI,OAAO;AAAA;AAAA,MAC7D;AAAA,IAEJ,KAAK;AACH,UAAI,MAAM,MAAO,QAAO,gBAAAA,MAAC,eAAY,OAAO,MAAM,OAAO,UAAoB,OAAc,QAAgB,QAAQ,QAAQ;AAC3H,aACE,gBAAAC,OAACU,OAAA,EAAI,eAAc,UAAS,OACzB;AAAA,cAAM,QAAQ,gBAAAX,MAACY,QAAA,EAAM,gBAAM,MAAM,GAAG,MAAM,QAAQ,KAAK,IAAI,MAAM,KAAK,EAAE,GAAE,IAAU,gBAAAZ,MAAC,WAAQ,OAAM,uBAAiB,OAAO,MAAM,OAAO;AAAA,QACzI,gBAAAA,MAAC,YAAS,QAAQ,QAAQ;AAAA,SAC5B;AAAA,IAEJ,KAAK;AACH,aAAO,gBAAAA,MAAC,aAAU,UAAoB,OAAc,QAAgB,QAAQ,QAAQ;AAAA,IACtF,KAAK;AACH,aACE,gBAAAC,OAACU,OAAA,EAAI,eAAc,UAAS,OAC1B;AAAA,wBAAAX,MAACY,QAAA,EAAM,gBAAM,KAAK,QAAQ,GAAE;AAAA,QAC5B,gBAAAZ,MAACW,OAAA,EAAI,WAAW,GAAG,eAAc,UAC9B,gBAAM,OACL,gBAAAX,MAAC,YAAS,MAAM,MAAM,MAAM,OAAc,IACxC,MAAM,QACR,gBAAAA,MAACY,QAAA,EAAM,gBAAM,MAAM,GAAG,MAAM,QAAQ,KAAK,IAAI,MAAM,KAAK,EAAE,GAAE,IAE5D,gBAAAZ,MAAC,WAAQ,OAAM,kBAAY,OAAO,MAAM,OAAO,GAEnD;AAAA,QACA,gBAAAA,MAACW,OAAA,EAAI,WAAW,GACd,0BAAAX,MAAC,YAAS,OAAc,OAAO,CAAC,EAAE,KAAK,KAAK,OAAO,OAAO,CAAC,GAAG,GAChE;AAAA,QACA,gBAAAA,MAAC,YAAS,QAAQ,QAAQ;AAAA,SAC5B;AAAA,IAEJ,KAAK;AACH,aACE,gBAAAC,OAACU,OAAA,EAAI,eAAc,UAAS,OAC1B;AAAA,wBAAAX,MAACY,QAAA,EAAM,gBAAM,KAAK,mBAAmB,GAAE;AAAA,QACvC,gBAAAZ,MAACW,OAAA,EAAI,WAAW,GACd,0BAAAX,MAAC,YAAS,MAAM,eAAe,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO,EAAE,OAAO,MAAM,EAAE,GAAG,OAAc,GAC5F;AAAA,QACA,gBAAAA,MAACW,OAAA,EAAI,WAAW,GACd,0BAAAX,MAAC,YAAS,OAAc,OAAO,CAAC,EAAE,KAAK,KAAK,OAAO,OAAO,CAAC,GAAG,GAChE;AAAA,QACA,gBAAAA,MAAC,YAAS,QAAQ,QAAQ;AAAA,SAC5B;AAAA,IAEJ;AACE,aACE,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,cAAc;AAAA,UACd;AAAA,UACA;AAAA,UACA,UAAUU;AAAA,UACV;AAAA,UACA;AAAA,UACA,gBAAgB,CAAC,OAAO;AACtB,qBAAS,UAAU;AACnB,qBAAS,EAAE,MAAM,QAAQ,UAAU,GAAG,CAAC;AAAA,UACzC;AAAA,UACA,gBAAgB,MAAM,SAAS,UAAU;AAAA,UACzC;AAAA,UACA;AAAA,UACA;AAAA;AAAA,MACF;AAAA,EAEN;AACF;;;AYvNA,SAASG,QAAO,KAAqB;AACnC,MAAI;AACF,WAAO,IAAI,IAAI,GAAG,EAAE;AAAA,EACtB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,iBAAiB,KAAiC;AAChE,QAAM,QAAQ,IAAI,IAAI,eAAe,IAAI;AACzC,QAAM,SAAS,kBAAkB,IAAI,SAAS,KAAK;AACnD,SAAO;AAAA,IACL,SAAS;AAAA,IACT,aAAa,IAAI,QAAQ;AAAA,IACzB,SAASA,QAAO,IAAI,QAAQ,MAAM;AAAA,IAClC,SAAS;AAAA,MACP,MAAM,OAAO,MAAM,QAAQ;AAAA,MAC3B,OAAO,OAAO,MAAM,SAAS;AAAA,MAC7B,UAAU,QAAQ,OAAO,eAAe,OAAO,QAAQ;AAAA,MACvD,YAAY,QAAQ,OAAO,WAAW;AAAA,MACtC,QAAQ,OAAO,MAAM;AAAA,IACvB;AAAA,IACA,iBAAiB,SAAS,OAAO,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,SAAS;AAAA,IACzE,MAAM,WAAW;AACf,UAAI,CAAC,OAAO,YAAa,QAAO;AAChC,YAAM,QAAQ,MAAM,IAAI,IAAI,KAA8B,yBAAyB;AACnF,aAAO,OAAO,UAAU,QAAQ;AAAA,IAClC;AAAA,IACA,MAAM,uBAAuB;AAC3B,YAAM,QAAQ,MAAM,kBAAkB,IAAI,GAAG;AAC7C,aAAO,OAAO,oBAAoB,CAAC;AAAA,IACrC;AAAA,IACA,aAAa,CAAC,UAAU,YAAY,KAAK,KAAK;AAAA,IAC9C,YAAY,CAAC,UAAU,WAAW,KAAK,KAAK;AAAA,IAC5C,mBAAmB,CAAC,UAAU,UAAU,kBAAkB,KAAK,UAAU,KAAK;AAAA,IAC9E,YAAY,CAAC,SAAS,WAAW,WAAW,KAAK,SAAS,EAAE,OAAO,CAAC;AAAA,IACpE,gBAAgB,CAAC,YAAY,UAAU,UACrC,aAAa,YAAY,gBAAgB,KAAK,YAAY,KAAK,IAAI,eAAe,KAAK,YAAY,KAAK;AAAA,IAC1G,MAAM,UAAU,MAAM;AACpB,YAAM,UAAU,MAAM,IAAI,IAAI;AAC9B,aAAO,QAAQ,UAAU,IAAI;AAAA,IAC/B;AAAA,IACA,MAAM,SAAS,QAAQ,OAAO,MAAM;AAClC,YAAM,UAAU,MAAM,IAAI,IAAI;AAC9B,YAAM,UAAU,KAAK,IAAI;AACzB,YAAM,SAAS,MAAM,QAAQ,SAAS,QAAQ,OAAO,IAAI;AACzD,aAAO,EAAE,GAAG,QAAQ,YAAY,KAAK,IAAI,IAAI,QAAQ;AAAA,IACvD;AAAA,IACA,iBAAiB,oBAAoB,IAAI,QAAQ,IAAI;AAAA,IACrD,qBAAqB,CAAC,iBAAiB,oBAAoB,IAAI,QAAQ,MAAM,YAAY;AAAA,IACzF,kBAAkB,MAAM,IAAI,IAAI,KAA6B,yBAAyB;AAAA,IACtF,aAAa,CAAC,eAAe,YAAY,IAAI,KAAK,UAAU;AAAA,IAC5D,MAAM,mBAAmB,YAAY,MAAM;AACzC,cAAQ,MAAM,WAAW,IAAI,KAAK,YAAY,EAAE,SAAS,kBAAkB,IAAI,EAAE,CAAC,GAAG;AAAA,IACvF;AAAA,IACA,YAAY,mBAAmB;AAAA,IAC/B,MAAM,aAAa;AACjB,YAAM,EAAE,cAAc,IAAI,MAAM,OAAO,sBAAoB;AAC3D,YAAM,SAAS,MAAM,cAAc,GAAG;AACtC,YAAM,MAAM,OAAO,OAAQ,OAAO,KAAK,OAAO,GAAG,OAAO,KAAK,IAAI,KAAK,OAAO,KAAK,KAAK,MAAM,OAAO,KAAK,QAAS;AAClH,YAAM,OAAmD;AAAA,QACvD,CAAC,WAAW,GAAG,OAAO,QAAQ,IAAI,KAAK,OAAO,QAAQ,MAAM,GAAG;AAAA,QAC/D,CAAC,OAAO,OAAO,QAAQ,MAAM;AAAA,QAC7B,CAAC,WAAW,GAAG;AAAA,QACf,CAAC,QAAQ,OAAO,IAAI;AAAA,QACpB,CAAC,WAAW,OAAO,UAAU,GAAG,OAAO,QAAQ,KAAK,GAAG,OAAO,QAAQ,cAAc,uBAAoB,EAAE,KAAK,IAAI;AAAA,QACnH,CAAC,aAAa,OAAO,KAAK,KAAK;AAAA,QAC/B,CAAC,aAAa,OAAO,qBAAqB,OAAO,OAAO,GAAG,OAAO,gBAAgB,UAAU;AAAA,QAC5F,CAAC,WAAW,OAAO,UAAU,GAAG,OAAO,QAAQ,KAAK,SAAS,OAAO,QAAQ,QAAQ,KAAK,UAAU,KAAK,IAAI;AAAA,QAC5G,GAAG,OAAO,SAAS,IAAI,CAAC,MAAwB,CAAC,WAAW,CAAC,CAAC;AAAA,MAChE;AACA,aAAO,KAAK,OAAO,CAAC,MAA6B,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO,EAAE,OAAO,MAAM,EAAE;AAAA,IAC5G;AAAA,EACF;AACF;;;AxCjHM,gBAAAC,OAyBI,QAAAC,cAzBJ;AATN,SAAS,OAAU,SAAsE;AACvF,MAAI,QAAQ,WAAW,cAAe,OAAM,iBAAiB;AAC7D,SAAO,QAAQ;AACjB;AAEA,eAAsB,eAAe,KAAqB,OAAsB,SAA4D;AAC1I,QAAM,WAAW,iBAAiB,GAAG;AACrC;AAAA,IACE,MAAM,aAAmB,oBAAoB,CAAC,EAAE,QAAQ,OAAO,OAAO,MACpE,gBAAAD;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,cAAc,QAAQ;AAAA,QACtB,cAAc,QAAQ;AAAA,QACtB,QAAQ,MAAM,OAAO,MAAS;AAAA;AAAA,IAChC,CACD;AAAA,EACH;AACF;AAEA,eAAsB,YACpB,MACA,MACA,SACA,SACyC;AACzC,QAAM,OAAO,qBAAqB,MAAM,KAAK,WAAW;AACxD,QAAM,QAAQ,gBAAgB,KAAK,aAAa,SAAS,EAAE,MAAM,iBAAiB,QAAQ,gBAAgB,CAAC;AAC3G,SAAO;AAAA,IACL,MAAM,aAA6C,kBAAkB,CAAC,EAAE,QAAQ,OAAO,OAAO,MAC5F,gBAAAC,OAACC,OAAA,EAAI,eAAc,UAAS,OAC1B;AAAA,sBAAAD,OAACC,OAAA,EAAI,eAAc,UAAS,cAAc,GACxC;AAAA,wBAAAD,OAACE,QAAA,EAAK,MAAK,gBACR;AAAA,gBAAM,KAAK,UAAU,IAAI,CAAC;AAAA,UAAE;AAAA,UAAE,MAAM,IAAI,GAAG,MAAM,QAAQ,MAAM,IAAI,QAAQ,KAAK,KAAK,CAAC,EAAE;AAAA,WAC3F;AAAA,QACC,QAAQ,gBAAgB,SACvB,gBAAAH,MAACG,QAAA,EAAK,MAAK,gBAAgB,gBAAM,IAAI,YAAY,QAAQ,gBAAgB,KAAK,IAAI,CAAC,EAAE,GAAE,IACrF;AAAA,SACN;AAAA,MACA,gBAAAH;AAAA,QAAC;AAAA;AAAA,UACC,SAAS;AAAA,UACT;AAAA,UACA,QAAQ,KAAK,IAAI,GAAG,SAAS,CAAC;AAAA,UAC9B,UAAQ;AAAA,UACR,UAAU,CAAC,UAAU,OAAO,OAAO,gBAAAA,MAACG,QAAA,EAAK,MAAK,gBAAgB,gBAAM,IAAI,GAAG,MAAM,QAAQ,OAAO,IAAI,kBAAkB,MAAM,OAAO,IAAI,CAAC,EAAE,GAAE,CAAO;AAAA,UACnJ,UAAU,MAAM,OAAO,IAAI;AAAA;AAAA,MAC7B;AAAA,OACF,CACD;AAAA,EACH;AACF;AAEA,eAAsB,kBACpB,KACA,UAC2B;AAC3B,QAAM,UAAU,KAAK,IAAI;AACzB,QAAM,QAAQ,aAAa,SAAS,YAAY,aAAa;AAC7D,SAAO;AAAA,IACL,MAAM,aAA+B,uBAAuB,CAAC,EAAE,QAAQ,MAAM,MAC3E,gBAAAH;AAAA,MAAC;AAAA;AAAA,QACC,YAAY,SAAS;AAAA,QACrB;AAAA,QACA,SAAS,SAAS;AAAA,QAClB,MAAM,SAAS;AAAA,QACf,aAAa,kBAAkB,SAAS,QAAQ;AAAA,QAChD,SAAS,0BAA0B,MAAM,QAAQ,MAAM,YAAY,IAAI,QAAQ,IAAI;AAAA,QACnF,UAAQ;AAAA,QACR;AAAA,QACA,YAAY,CAAC,aACX,OAAO,UAAU,gBAAAA,MAACG,QAAA,EAAM,8BAAoB,UAAU,OAAO,SAAS,YAAY,KAAK,IAAI,IAAI,OAAO,GAAE,CAAO;AAAA;AAAA,IAEnH,CACD;AAAA,EACH;AACF;AAGO,SAAS,UAAU,EAAE,UAAU,UAAU,GAA+C;AAC7F,QAAM,EAAE,QAAQ,IAAI,gBAAgB;AACpC,EAAAC,WAAU,MAAM;AACd,cAAU;AAAA,EACZ,GAAG,CAAC,SAAS,CAAC;AACd,SACE,gBAAAJ,MAACK,SAAA,EAAO,OAAO,CAAC,MAAM,GACnB,WAAC,QACA,gBAAAL,MAAC,QAAe,SACb,YADQ,GAEX,GAEJ;AAEJ;AAOA,eAAsB,cAAc,MAAsB,MAAmB,QAAiB,MAAkC;AAC9H;AAAA,IACE,MAAM,aAAmB,oBAAoB,CAAC,EAAE,QAAQ,OAAO,OAAO,MACpE,gBAAAA,MAAC,aAAU,WAAW,MAAM,OAAO,MAAS,GAC1C,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,UAAU,IAAI;AAAA,QACrB;AAAA,QACA,YAAY,KAAK;AAAA,QACjB,WAAW,KAAK;AAAA,QAChB;AAAA,QACA;AAAA,QACA,aAAa;AAAA;AAAA,IACf,GACF,CACD;AAAA,EACH;AACF;AAEA,eAAsB,QAAQ,KAAqB,OAAiD,CAAC,GAAkB;AACrH,QAAM,WAAW,iBAAiB,GAAG;AACrC,QAAM;AAAA,IACJ;AAAA,IACA,CAAC,EAAE,QAAQ,OAAO,OAAO,MACvB,gBAAAA,MAAC,QAAK,UAAoB,OAAc,QAAgB,MAAM,KAAK,MAAM,WAAW,KAAK,WAAW,QAAQ,MAAM,OAAO,MAAS,GAAG;AAAA,IAEvI,EAAE,OAAO,SAAS;AAAA,EACpB;AACF;AAYA,eAAsB,QAAQ,KAAqB,MAAqC;AACtF,QAAM,WAAW,iBAAiB,GAAG;AACrC,QAAM;AAAA,IACJ;AAAA,IACA,CAAC,EAAE,QAAQ,OAAO,OAAO,MACvB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,MAAM,KAAK;AAAA,QACX,WAAW,KAAK;AAAA,QAChB,UAAU,KAAK;AAAA,QACf,SAAS,KAAK;AAAA,QACd,gBAAgB,KAAK;AAAA,QACrB,cAAc,KAAK;AAAA,QACnB;AAAA,QACA;AAAA,QACA,QAAQ,MAAM,OAAO,MAAS;AAAA;AAAA,IAChC;AAAA,IAEF,EAAE,OAAO,SAAS;AAAA,EACpB;AACF;",
|
|
6
|
+
"names": ["Box", "Static", "Text", "useEffect", "Box", "Text", "KeyHints", "Text", "memo", "jsx", "memo", "KeyValue", "Text", "Box", "jsx", "Box", "jsx", "jsxs", "Box", "Text", "Box", "Text", "useInput", "memo", "useEffect", "jsx", "jsxs", "focused", "memo", "FieldRow", "Box", "Text", "useInput", "useEffect", "Box", "Text", "useInput", "memo", "useCallback", "useEffect", "useMemo", "useReducer", "useRef", "useState", "Box", "Text", "useInput", "memo", "useState", "jsx", "jsxs", "memo", "Row", "Text", "useState", "useInput", "Box", "Box", "Text", "memo", "jsx", "jsxs", "memo", "StatusBar", "Box", "Text", "Box", "Text", "useInput", "memo", "jsx", "jsxs", "chars", "memo", "TextInput", "useInput", "Text", "Box", "Box", "Text", "memo", "jsx", "jsxs", "memo", "Palette", "Text", "Box", "choices", "choices", "Box", "Text", "memo", "Box", "Text", "memo", "jsx", "jsxs", "memo", "ArtifactRow", "Box", "Text", "Box", "Text", "memo", "useMemo", "Box", "Text", "memo", "useMemo", "jsx", "jsxs", "memo", "Table", "useMemo", "Box", "Text", "jsx", "jsxs", "textOf", "Box", "Text", "memo", "Markdown", "useMemo", "Box", "Text", "memo", "jsx", "jsxs", "memo", "SourcesList", "Box", "Text", "Box", "Text", "memo", "jsx", "jsxs", "isRecord", "Text", "memo", "RunningTime", "ToolCallRow", "Box", "ToolCallDetail", "jsx", "jsxs", "Box", "Text", "memo", "EntryView", "LiveItemView", "useCallback", "useEffect", "useReducer", "useRef", "useState", "useEffect", "useRef", "useRef", "useEffect", "getArtifact", "useReducer", "useRef", "useState", "useCallback", "useEffect", "jsx", "jsxs", "memo", "ChatStatus", "useReducer", "useState", "useRef", "useMemo", "useEffect", "useCallback", "submit", "useInput", "Box", "Text", "Box", "Text", "useInput", "useCallback", "useEffect", "useMemo", "useReducer", "useRef", "useState", "Box", "Text", "useInput", "useCallback", "useEffect", "useRef", "useState", "Box", "Text", "useInput", "useMemo", "useState", "Box", "Text", "jsx", "jsxs", "chars", "titleText", "Box", "Text", "isRecord", "jsx", "jsxs", "Box", "Text", "useMemo", "useState", "useInput", "jsx", "jsxs", "useState", "useRef", "useEffect", "useCallback", "useInput", "Box", "Text", "Box", "Text", "useInput", "memo", "useMemo", "useState", "Box", "Text", "useInput", "useCallback", "useEffect", "useRef", "useState", "jsx", "jsxs", "useState", "useRef", "useEffect", "useCallback", "useInput", "Box", "Text", "jsx", "jsxs", "memo", "ListRow", "glyph", "Text", "ToolDetail", "useMemo", "Box", "useState", "useInput", "Box", "Text", "memo", "Box", "Text", "memo", "Box", "Text", "jsx", "Text", "Box", "jsx", "jsxs", "memo", "Header", "Text", "Box", "jsx", "jsxs", "Text", "memo", "QuickActions", "Box", "jsx", "jsxs", "DOUBLE_PRESS_MS", "useInput", "useState", "useReducer", "useRef", "useEffect", "useCallback", "useMemo", "submit", "Box", "Text", "hostOf", "jsx", "jsxs", "Box", "Text", "useEffect", "Static"]
|
|
7
|
+
}
|