@stephendolan/ynab-cli 2.8.0 → 2.8.1

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/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/lib/errors.ts","../src/lib/utils.ts","../src/lib/output.ts","../src/commands/auth.ts","../src/lib/auth.ts","../src/lib/config.ts","../src/lib/api-client.ts","../src/lib/command-utils.ts","../src/commands/user.ts","../src/commands/budgets.ts","../src/commands/accounts.ts","../src/lib/dates.ts","../src/commands/categories.ts","../src/commands/transactions.ts","../src/lib/schemas.ts","../src/commands/scheduled.ts","../src/commands/payees.ts","../src/commands/months.ts","../src/commands/api.ts","../src/commands/mcp.ts","../src/mcp/server.ts"],"sourcesContent":["#!/usr/bin/env bun\n\nimport { Command } from 'commander';\nimport { setOutputOptions } from './lib/output.js';\nimport { createAuthCommand } from './commands/auth.js';\nimport { createUserCommand } from './commands/user.js';\nimport { createBudgetsCommand } from './commands/budgets.js';\nimport { createAccountsCommand } from './commands/accounts.js';\nimport { createCategoriesCommand } from './commands/categories.js';\nimport { createTransactionsCommand } from './commands/transactions.js';\nimport { createScheduledCommand } from './commands/scheduled.js';\nimport { createPayeesCommand } from './commands/payees.js';\nimport { createMonthsCommand } from './commands/months.js';\nimport { createApiCommand } from './commands/api.js';\nimport { createMcpCommand } from './commands/mcp.js';\n\ndeclare const __VERSION__: string;\n\nconst program = new Command();\n\nprogram\n .name('ynab')\n .description('A command-line interface for You Need a Budget (YNAB)')\n .version(__VERSION__)\n .option('-c, --compact', 'Minified JSON output (single line)')\n .hook('preAction', (thisCommand) => {\n const options = thisCommand.opts();\n setOutputOptions({\n compact: options.compact,\n });\n });\n\nprogram.addCommand(createAuthCommand());\nprogram.addCommand(createUserCommand());\nprogram.addCommand(createBudgetsCommand());\nprogram.addCommand(createAccountsCommand());\nprogram.addCommand(createCategoriesCommand());\nprogram.addCommand(createTransactionsCommand());\nprogram.addCommand(createScheduledCommand());\nprogram.addCommand(createPayeesCommand());\nprogram.addCommand(createMonthsCommand());\nprogram.addCommand(createApiCommand());\nprogram.addCommand(createMcpCommand());\n\nprogram.parse();\n","import type { YnabError } from '../types/index.js';\nimport { outputJson } from './output.js';\n\nexport class YnabCliError extends Error {\n constructor(\n message: string,\n public statusCode?: number\n ) {\n super(message);\n this.name = 'YnabCliError';\n }\n}\n\nconst ERROR_STATUS_CODES: Record<string, number> = {\n bad_request: 400,\n not_authorized: 401,\n subscription_lapsed: 403,\n trial_expired: 403,\n unauthorized_scope: 403,\n data_limit_reached: 403,\n not_found: 404,\n resource_not_found: 404,\n conflict: 409,\n too_many_requests: 429,\n internal_server_error: 500,\n service_unavailable: 503,\n};\n\nexport function sanitizeErrorMessage(message: string): string {\n const sensitivePatterns = [\n /Bearer\\s+[\\w\\-._~+/]+=*/gi,\n /token[=:]\\s*[\\w\\-._~+/]+=*/gi,\n /api[_-]?key[=:]\\s*[\\w\\-._~+/]+=*/gi,\n /authorization:\\s*bearer\\s+[\\w\\-._~+/]+=*/gi,\n ];\n\n let sanitized = message;\n for (const pattern of sensitivePatterns) {\n sanitized = sanitized.replace(pattern, '[REDACTED]');\n }\n\n return sanitized.length > 500 ? sanitized.substring(0, 500) + '...' : sanitized;\n}\n\ninterface YnabApiError {\n name?: string;\n detail?: string;\n message?: string;\n id?: string;\n}\n\nfunction isErrorObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nexport function sanitizeApiError(error: unknown): YnabError {\n if (!isErrorObject(error)) {\n return {\n name: 'api_error',\n detail: 'An error occurred',\n id: undefined,\n };\n }\n\n const apiError = error as YnabApiError;\n const detail = sanitizeErrorMessage(\n String(apiError.detail || apiError.message || 'An error occurred')\n );\n\n return {\n name: apiError.name || 'api_error',\n detail,\n id: apiError.id,\n };\n}\n\nfunction enhanceRateLimitMessage(detail: string): string {\n return `${detail}\\n\\nYNAB API limit: 200 requests/hour (rolling window). Wait a few minutes and retry.`;\n}\n\nfunction formatErrorResponse(name: string, detail: string, statusCode: number): never {\n const enhancedDetail = name === 'too_many_requests' ? enhanceRateLimitMessage(detail) : detail;\n\n outputJson({ error: { name, detail: enhancedDetail, statusCode } });\n process.exit(1);\n}\n\nexport function handleYnabError(error: unknown): never {\n if (!isErrorObject(error)) {\n formatErrorResponse('unknown_error', 'An unexpected error occurred', 1);\n }\n\n const errorObj = error as { error?: unknown; message?: string };\n\n if (errorObj.error) {\n const ynabError: YnabError = sanitizeApiError(errorObj.error);\n formatErrorResponse(\n ynabError.name,\n ynabError.detail,\n ERROR_STATUS_CODES[ynabError.name] || 500\n );\n }\n\n if (error instanceof YnabCliError) {\n const sanitized = sanitizeErrorMessage(error.message);\n formatErrorResponse('cli_error', sanitized, error.statusCode || 1);\n }\n\n const sanitized = sanitizeErrorMessage(errorObj.message || 'An unexpected error occurred');\n formatErrorResponse('unknown_error', sanitized, 1);\n}\n","import { YnabCliError } from './errors.js';\n\nexport function milliunitsToAmount(milliunits: number): number {\n return milliunits / 1000;\n}\n\nexport function amountToMilliunits(amount: number): number {\n return Math.round(amount * 1000);\n}\n\nexport function convertMilliunitsToAmounts(data: unknown): unknown {\n if (data === null || data === undefined) return data;\n if (Array.isArray(data)) return data.map(convertMilliunitsToAmounts);\n if (typeof data !== 'object') return data;\n\n const converted: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data)) {\n if (isAmountField(key) && typeof value === 'number') {\n converted[key] = milliunitsToAmount(value);\n } else if (\n isDebtAmountMapField(key) &&\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value)\n ) {\n const convertedMap: Record<string, unknown> = {};\n for (const [dateKey, amountValue] of Object.entries(value)) {\n convertedMap[dateKey] =\n typeof amountValue === 'number' ? milliunitsToAmount(amountValue) : amountValue;\n }\n converted[key] = convertedMap;\n } else {\n converted[key] = convertMilliunitsToAmounts(value);\n }\n }\n return converted;\n}\n\nfunction isAmountField(fieldName: string): boolean {\n const amountFields = [\n 'amount',\n 'balance',\n 'cleared_balance',\n 'uncleared_balance',\n 'budgeted',\n 'activity',\n 'available',\n 'goal_target',\n 'goal_under_funded',\n 'goal_overall_funded',\n 'goal_overall_left',\n 'income',\n 'to_be_budgeted',\n 'debt_original_balance',\n ];\n\n return amountFields.includes(fieldName) || fieldName.endsWith('_amount');\n}\n\nfunction isDebtAmountMapField(fieldName: string): boolean {\n const debtAmountMapFields = [\n 'debt_minimum_payments',\n 'debt_escrow_amounts',\n 'debt_interest_rates',\n ];\n\n return debtAmountMapFields.includes(fieldName);\n}\n\nexport function parseApprovedFilter(value: string): boolean {\n const normalized = value.toLowerCase();\n if (normalized !== 'true' && normalized !== 'false') {\n throw new YnabCliError(`--approved must be 'true' or 'false', got '${value}'`, 400);\n }\n return normalized === 'true';\n}\n\nexport function parseStatusFilter(value: string): string[] {\n const statuses = value.split(',').map((s) => s.trim().toLowerCase());\n const validStatuses = ['cleared', 'uncleared', 'reconciled'];\n\n for (const status of statuses) {\n if (!validStatuses.includes(status)) {\n throw new YnabCliError(\n `Invalid status '${status}'. Must be one of: ${validStatuses.join(', ')}`,\n 400\n );\n }\n }\n\n return statuses;\n}\n\nexport type TransactionLike = {\n date: string;\n amount: number;\n approved: boolean;\n cleared: string;\n};\n\nexport function applyTransactionFilters<T extends TransactionLike>(\n transactions: T[],\n filters: {\n until?: string;\n approved?: string;\n status?: string;\n minAmount?: number;\n maxAmount?: number;\n }\n): T[] {\n let filtered = transactions;\n\n if (filters.until) {\n filtered = filtered.filter((t) => t.date <= filters.until!);\n }\n\n if (filters.approved !== undefined) {\n const approvedValue = parseApprovedFilter(filters.approved);\n filtered = filtered.filter((t) => t.approved === approvedValue);\n }\n\n if (filters.status) {\n const statuses = parseStatusFilter(filters.status);\n filtered = filtered.filter((t) => statuses.includes(t.cleared.toLowerCase()));\n }\n\n if (filters.minAmount !== undefined) {\n const minMilliunits = amountToMilliunits(filters.minAmount);\n filtered = filtered.filter((t) => t.amount >= minMilliunits);\n }\n\n if (filters.maxAmount !== undefined) {\n const maxMilliunits = amountToMilliunits(filters.maxAmount);\n filtered = filtered.filter((t) => t.amount <= maxMilliunits);\n }\n\n return filtered;\n}\n\nexport type SummaryTransaction = TransactionLike & {\n payee_id?: string | null;\n payee_name?: string | null;\n category_id?: string | null;\n category_name?: string | null;\n account_id: string;\n transfer_account_id?: string | null;\n transfer_transaction_id?: string | null;\n};\n\ninterface BreakdownEntry {\n count: number;\n total_amount: number;\n}\n\nexport function summarizeTransactions(\n transactions: SummaryTransaction[],\n options?: { top?: number }\n) {\n let totalAmount = 0;\n const dates: string[] = [];\n const byPayee = new Map<string, { payee_id: string | null; payee_name: string | null } & BreakdownEntry>();\n const byCategory = new Map<string, { category_id: string | null; category_name: string | null } & BreakdownEntry>();\n const byCleared = new Map<string, BreakdownEntry>();\n const byApproval = new Map<string, BreakdownEntry>();\n\n for (const t of transactions) {\n totalAmount += t.amount;\n dates.push(t.date);\n\n const payeeKey = t.payee_id || t.payee_name || '(none)';\n const payeeEntry = byPayee.get(payeeKey) || {\n payee_id: t.payee_id || null,\n payee_name: t.payee_name || null,\n count: 0,\n total_amount: 0,\n };\n payeeEntry.count++;\n payeeEntry.total_amount += t.amount;\n byPayee.set(payeeKey, payeeEntry);\n\n const catKey = t.category_id || t.category_name || '(uncategorized)';\n const catEntry = byCategory.get(catKey) || {\n category_id: t.category_id || null,\n category_name: t.category_name || null,\n count: 0,\n total_amount: 0,\n };\n catEntry.count++;\n catEntry.total_amount += t.amount;\n byCategory.set(catKey, catEntry);\n\n const clearedEntry = byCleared.get(t.cleared) || { count: 0, total_amount: 0 };\n clearedEntry.count++;\n clearedEntry.total_amount += t.amount;\n byCleared.set(t.cleared, clearedEntry);\n\n const approvalKey = String(t.approved);\n const approvalEntry = byApproval.get(approvalKey) || { count: 0, total_amount: 0 };\n approvalEntry.count++;\n approvalEntry.total_amount += t.amount;\n byApproval.set(approvalKey, approvalEntry);\n }\n\n const sortByAbsAmount = <T extends BreakdownEntry>(entries: T[]): T[] =>\n entries.sort((a, b) => Math.abs(b.total_amount) - Math.abs(a.total_amount));\n\n const truncate = <T extends BreakdownEntry>(entries: T[], rollupFactory: (entry: BreakdownEntry) => T): T[] => {\n const top = options?.top;\n if (!top || top <= 0 || entries.length <= top) return entries;\n const kept = entries.slice(0, top);\n const rest = entries.slice(top);\n const rollup = rollupFactory({\n count: rest.reduce((sum, e) => sum + e.count, 0),\n total_amount: rest.reduce((sum, e) => sum + e.total_amount, 0),\n });\n return [...kept, rollup];\n };\n\n const payeeBreakdown = sortByAbsAmount([...byPayee.values()]);\n const categoryBreakdown = sortByAbsAmount([...byCategory.values()]);\n\n return {\n total_count: transactions.length,\n total_amount: totalAmount,\n date_range: dates.length > 0\n ? {\n from: dates.reduce((a, b) => (a < b ? a : b)),\n to: dates.reduce((a, b) => (a > b ? a : b)),\n }\n : null,\n by_payee: truncate(payeeBreakdown, (e) => ({ payee_id: null, payee_name: '(other)', ...e })),\n by_category: truncate(categoryBreakdown, (e) => ({ category_id: null, category_name: '(other)', ...e })),\n by_cleared_status: [...byCleared.entries()].map(([status, entry]) => ({ status, ...entry })),\n by_approval_status: [...byApproval.entries()].map(([approved, entry]) => ({ approved: approved === 'true', ...entry })),\n };\n}\n\nexport function findTransferCandidates(\n source: SummaryTransaction,\n allTransactions: SummaryTransaction[],\n options: { maxDays: number }\n) {\n const sourceAmount = Math.abs(source.amount);\n const sourceDateMs = new Date(source.date).getTime();\n const msPerDay = 86400000;\n\n function daysBetween(t: SummaryTransaction): number {\n return Math.abs(new Date(t.date).getTime() - sourceDateMs) / msPerDay;\n }\n\n return allTransactions\n .filter((t) => {\n if (t.account_id === source.account_id) return false;\n if (Math.abs(t.amount) !== sourceAmount) return false;\n if (Math.sign(t.amount) === Math.sign(source.amount)) return false;\n return daysBetween(t) <= options.maxDays;\n })\n .map((t) => ({\n transaction: t,\n already_linked: !!t.transfer_transaction_id,\n date_difference_days: Math.round(daysBetween(t)),\n has_transfer_payee: !!t.payee_name?.startsWith('Transfer :'),\n }))\n .sort((a, b) => a.date_difference_days - b.date_difference_days);\n}\n\nexport function applyFieldSelection<T>(items: T[], fields?: string): Partial<T>[] {\n if (!fields) return items;\n\n const fieldList = fields.split(',').map((f) => f.trim());\n return items.map((item) => {\n const filtered: Partial<T> = {};\n const itemRecord = item as Record<string, unknown>;\n for (const field of fieldList) {\n if (field in itemRecord) {\n (filtered as Record<string, unknown>)[field] = itemRecord[field];\n }\n }\n return filtered;\n });\n}\n","import type { OutputOptions } from '../types/index.js';\nimport { convertMilliunitsToAmounts } from './utils.js';\n\nlet globalOutputOptions: OutputOptions = {};\n\nexport function setOutputOptions(options: OutputOptions): void {\n globalOutputOptions = options;\n}\n\nexport function outputJson(data: unknown, options: OutputOptions = {}): void {\n const convertedData = convertMilliunitsToAmounts(data);\n const mergedOptions = { ...globalOutputOptions, ...options };\n const jsonString = mergedOptions.compact\n ? JSON.stringify(convertedData)\n : JSON.stringify(convertedData, null, 2);\n\n console.log(jsonString);\n}\n","import { Command } from 'commander';\nimport { createInterface } from 'readline';\nimport { auth } from '../lib/auth.js';\nimport { outputJson } from '../lib/output.js';\nimport { client } from '../lib/api-client.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\nimport { YnabCliError } from '../lib/errors.js';\n\nfunction readTokenFromStdin(): Promise<string> {\n return new Promise((resolve, reject) => {\n let data = '';\n process.stdin.setEncoding('utf8');\n process.stdin.on('data', (chunk) => { data += chunk; });\n process.stdin.on('end', () => resolve(data.trim()));\n process.stdin.on('error', reject);\n });\n}\n\nfunction promptForToken(): Promise<string> {\n return new Promise((resolve) => {\n const rl = createInterface({\n input: process.stdin,\n output: process.stderr,\n });\n process.stderr.write('Enter YNAB Personal Access Token: ');\n rl.question('', (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\nexport function createAuthCommand(): Command {\n const cmd = new Command('auth').description('Authentication management');\n\n cmd\n .command('login')\n .description('Configure access token')\n .option('-t, --token <token>', 'YNAB Personal Access Token')\n .action(\n withErrorHandling(async (options: { token?: string }) => {\n let token: string;\n\n if (options.token) {\n token = options.token.trim();\n } else if (!process.stdin.isTTY) {\n token = await readTokenFromStdin();\n } else {\n token = await promptForToken();\n }\n\n if (!token) {\n throw new YnabCliError('Access token cannot be empty', 400);\n }\n await auth.setAccessToken(token);\n client.clearApi();\n\n try {\n const user = await client.getUser();\n outputJson({\n message: 'Successfully authenticated',\n user: { id: user?.id },\n });\n } catch (error) {\n await auth.deleteAccessToken();\n client.clearApi();\n throw error;\n }\n })\n );\n\n cmd\n .command('status')\n .description('Check authentication status')\n .action(\n withErrorHandling(async () => {\n const isAuthenticated = await auth.isAuthenticated();\n\n if (!isAuthenticated) {\n outputJson({ authenticated: false, message: 'Not authenticated' });\n return;\n }\n\n try {\n const user = await client.getUser();\n outputJson({ authenticated: true, user: { id: user?.id } });\n } catch {\n outputJson({ authenticated: false, message: 'Token exists but is invalid' });\n }\n })\n );\n\n cmd\n .command('logout')\n .description('Remove stored credentials')\n .action(\n withErrorHandling(async () => {\n await auth.logout();\n client.clearApi();\n outputJson({ message: 'Successfully logged out' });\n })\n );\n\n return cmd;\n}\n","import { Entry } from '@napi-rs/keyring';\nimport { config } from './config.js';\n\nconst SERVICE_NAME = 'ynab-cli';\nconst ACCOUNT_NAME = 'access-token';\n\nconst KEYRING_UNAVAILABLE_ERROR =\n 'Keychain storage unavailable. Cannot store credentials securely.\\n' +\n 'On Linux, install libsecret: sudo apt-get install libsecret-1-dev\\n' +\n 'Then reinstall: bun install -g @stephendolan/ynab-cli\\n' +\n 'Alternatively, use the YNAB_API_KEY environment variable.';\n\nlet keyring: Entry | null | undefined = undefined;\n\nfunction getKeyring(): Entry | null {\n if (keyring !== undefined) {\n return keyring;\n }\n try {\n keyring = new Entry(SERVICE_NAME, ACCOUNT_NAME);\n } catch {\n keyring = null;\n }\n return keyring;\n}\n\nexport function resetKeyringForTesting(): void {\n keyring = undefined;\n}\n\nexport class AuthManager {\n async getAccessToken(): Promise<string | null> {\n const entry = getKeyring();\n if (entry) {\n try {\n return entry.getPassword();\n } catch {\n return null;\n }\n }\n return null;\n }\n\n async setAccessToken(token: string): Promise<void> {\n const entry = getKeyring();\n if (!entry) {\n throw new Error(KEYRING_UNAVAILABLE_ERROR);\n }\n try {\n entry.setPassword(token);\n } catch (error) {\n throw new Error(\n `Failed to store token in keychain: ${error instanceof Error ? error.message : error}\\n\\n` +\n 'On Linux, ensure the Secret Service is running and unlocked.\\n' +\n 'Try: gnome-keyring-daemon --unlock\\n' +\n 'Or use the YNAB_API_KEY environment variable instead.'\n );\n }\n }\n\n async deleteAccessToken(): Promise<boolean> {\n const entry = getKeyring();\n if (entry) {\n return entry.deletePassword();\n }\n return false;\n }\n\n async isAuthenticated(): Promise<boolean> {\n return (await this.getAccessToken()) !== null;\n }\n\n async logout(): Promise<void> {\n await this.deleteAccessToken();\n config.clearDefaultBudget();\n }\n}\n\nexport const auth = new AuthManager();\n","import Conf from 'conf';\nimport type { Config } from '../types/index.js';\n\nclass ConfigManager {\n private conf: Conf<Config>;\n\n constructor() {\n this.conf = new Conf<Config>({\n projectName: 'ynab-cli',\n schema: {\n defaultBudget: { type: 'string' },\n version: { type: 'string', default: '1.0.0' },\n },\n defaults: { version: '1.0.0' },\n });\n }\n\n getDefaultBudget(): string | undefined {\n return this.conf.get('defaultBudget');\n }\n\n setDefaultBudget(budgetId: string): void {\n this.conf.set('defaultBudget', budgetId);\n }\n\n clearDefaultBudget(): void {\n this.conf.delete('defaultBudget');\n }\n\n clear(): void {\n this.conf.clear();\n }\n}\n\nexport const config = new ConfigManager();\n","import * as ynab from 'ynab';\nimport { config } from './config.js';\nimport { YnabCliError, handleYnabError, sanitizeApiError } from './errors.js';\nimport { auth } from './auth.js';\n\ntype TransactionTypeFilter = 'uncategorized' | 'unapproved' | undefined;\n\nexport class YnabClient {\n private api: ynab.API | null = null;\n private envVarWarningShown = false;\n\n clearApi(): void {\n this.api = null;\n this.envVarWarningShown = false;\n }\n\n async getApi(): Promise<ynab.API> {\n if (this.api) {\n return this.api;\n }\n\n const keychainToken = await auth.getAccessToken();\n const accessToken = keychainToken || process.env.YNAB_API_KEY || null;\n\n if (!accessToken) {\n throw new YnabCliError(\n 'Not authenticated. Please run: ynab auth login or set YNAB_API_KEY environment variable',\n 401\n );\n }\n\n if (!keychainToken && process.env.YNAB_API_KEY && !this.envVarWarningShown) {\n console.warn(\n '\\x1b[33m⚠️ WARNING: Using YNAB_API_KEY environment variable.\\n' +\n 'Environment variables may be visible to other processes.\\n' +\n 'For better security, use: ynab auth login\\x1b[0m\\n'\n );\n this.envVarWarningShown = true;\n }\n\n this.api = new ynab.API(accessToken);\n return this.api;\n }\n\n async getBudgetId(budgetIdOrDefault?: string): Promise<string> {\n const budgetId = budgetIdOrDefault || config.getDefaultBudget() || process.env.YNAB_BUDGET_ID;\n\n if (!budgetId) {\n throw new YnabCliError(\n 'No budget specified. Use --budget flag, set default with \"ynab budgets set-default\", or set YNAB_BUDGET_ID environment variable',\n 400\n );\n }\n\n return budgetId;\n }\n\n private async withErrorHandling<T>(fn: () => Promise<T>): Promise<T> {\n try {\n return await fn();\n } catch (error) {\n handleYnabError(error);\n }\n }\n\n async getUser() {\n return this.withErrorHandling(async () => {\n const api = await this.getApi();\n const response = await api.user.getUser();\n return response.data.user;\n });\n }\n\n async getBudgets(includeAccounts = false) {\n return this.withErrorHandling(async () => {\n const api = await this.getApi();\n const response = await api.budgets.getBudgets(includeAccounts);\n return {\n budgets: response.data.budgets,\n server_knowledge: 0,\n };\n });\n }\n\n async getBudget(budgetId?: string, lastKnowledgeOfServer?: number) {\n return this.withErrorHandling(async () => {\n const api = await this.getApi();\n const id = await this.getBudgetId(budgetId);\n const response = await api.budgets.getBudgetById(id, lastKnowledgeOfServer);\n return {\n budget: response.data.budget,\n server_knowledge: response.data.server_knowledge,\n };\n });\n }\n\n async getBudgetSettings(budgetId?: string) {\n return this.withErrorHandling(async () => {\n const api = await this.getApi();\n const id = await this.getBudgetId(budgetId);\n const response = await api.budgets.getBudgetSettingsById(id);\n return response.data.settings;\n });\n }\n\n async getAccounts(budgetId?: string, lastKnowledgeOfServer?: number) {\n return this.withErrorHandling(async () => {\n const api = await this.getApi();\n const id = await this.getBudgetId(budgetId);\n const response = await api.accounts.getAccounts(id, lastKnowledgeOfServer);\n return {\n accounts: response.data.accounts,\n server_knowledge: response.data.server_knowledge,\n };\n });\n }\n\n async getAccount(accountId: string, budgetId?: string) {\n return this.withErrorHandling(async () => {\n const api = await this.getApi();\n const id = await this.getBudgetId(budgetId);\n const response = await api.accounts.getAccountById(id, accountId);\n return response.data.account;\n });\n }\n\n async getCategories(budgetId?: string, lastKnowledgeOfServer?: number) {\n return this.withErrorHandling(async () => {\n const api = await this.getApi();\n const id = await this.getBudgetId(budgetId);\n const response = await api.categories.getCategories(id, lastKnowledgeOfServer);\n return {\n category_groups: response.data.category_groups,\n server_knowledge: response.data.server_knowledge,\n };\n });\n }\n\n async getCategory(categoryId: string, budgetId?: string) {\n return this.withErrorHandling(async () => {\n const api = await this.getApi();\n const id = await this.getBudgetId(budgetId);\n const response = await api.categories.getCategoryById(id, categoryId);\n return response.data.category;\n });\n }\n\n async updateMonthCategory(\n month: string,\n categoryId: string,\n data: ynab.PatchMonthCategoryWrapper,\n budgetId?: string\n ) {\n return this.withErrorHandling(async () => {\n const api = await this.getApi();\n const id = await this.getBudgetId(budgetId);\n const response = await api.categories.updateMonthCategory(id, month, categoryId, data);\n return response.data.category;\n });\n }\n\n async updateCategory(categoryId: string, data: ynab.PatchCategoryWrapper, budgetId?: string) {\n return this.withErrorHandling(async () => {\n const api = await this.getApi();\n const id = await this.getBudgetId(budgetId);\n const response = await api.categories.updateCategory(id, categoryId, data);\n return response.data.category;\n });\n }\n\n async getPayees(budgetId?: string, lastKnowledgeOfServer?: number) {\n return this.withErrorHandling(async () => {\n const api = await this.getApi();\n const id = await this.getBudgetId(budgetId);\n const response = await api.payees.getPayees(id, lastKnowledgeOfServer);\n return {\n payees: response.data.payees,\n server_knowledge: response.data.server_knowledge,\n };\n });\n }\n\n async getPayee(payeeId: string, budgetId?: string) {\n return this.withErrorHandling(async () => {\n const api = await this.getApi();\n const id = await this.getBudgetId(budgetId);\n const response = await api.payees.getPayeeById(id, payeeId);\n return response.data.payee;\n });\n }\n\n async updatePayee(payeeId: string, data: ynab.PatchPayeeWrapper, budgetId?: string) {\n return this.withErrorHandling(async () => {\n const api = await this.getApi();\n const id = await this.getBudgetId(budgetId);\n const response = await api.payees.updatePayee(id, payeeId, data);\n return response.data.payee;\n });\n }\n\n async getPayeeLocationsByPayee(payeeId: string, budgetId?: string) {\n return this.withErrorHandling(async () => {\n const api = await this.getApi();\n const id = await this.getBudgetId(budgetId);\n const response = await api.payeeLocations.getPayeeLocationsByPayee(id, payeeId);\n return response.data.payee_locations;\n });\n }\n\n async getBudgetMonths(budgetId?: string, lastKnowledgeOfServer?: number) {\n return this.withErrorHandling(async () => {\n const api = await this.getApi();\n const id = await this.getBudgetId(budgetId);\n const response = await api.months.getBudgetMonths(id, lastKnowledgeOfServer);\n return {\n months: response.data.months,\n server_knowledge: response.data.server_knowledge,\n };\n });\n }\n\n async getBudgetMonth(month: string, budgetId?: string) {\n return this.withErrorHandling(async () => {\n const api = await this.getApi();\n const id = await this.getBudgetId(budgetId);\n const response = await api.months.getBudgetMonth(id, month);\n return response.data.month;\n });\n }\n\n async getTransactions(params: {\n budgetId?: string;\n sinceDate?: string;\n type?: string;\n lastKnowledgeOfServer?: number;\n }) {\n return this.withErrorHandling(async () => {\n const api = await this.getApi();\n const id = await this.getBudgetId(params.budgetId);\n const response = await api.transactions.getTransactions(\n id,\n params.sinceDate,\n params.type as TransactionTypeFilter,\n params.lastKnowledgeOfServer\n );\n return {\n transactions: response.data.transactions,\n server_knowledge: response.data.server_knowledge,\n };\n });\n }\n\n async getTransactionsByAccount(\n accountId: string,\n params: {\n budgetId?: string;\n sinceDate?: string;\n type?: string;\n lastKnowledgeOfServer?: number;\n }\n ) {\n return this.withErrorHandling(async () => {\n const api = await this.getApi();\n const id = await this.getBudgetId(params.budgetId);\n const response = await api.transactions.getTransactionsByAccount(\n id,\n accountId,\n params.sinceDate,\n params.type as TransactionTypeFilter,\n params.lastKnowledgeOfServer\n );\n return {\n transactions: response.data.transactions,\n server_knowledge: response.data.server_knowledge,\n };\n });\n }\n\n async getTransactionsByCategory(\n categoryId: string,\n params: {\n budgetId?: string;\n sinceDate?: string;\n type?: string;\n lastKnowledgeOfServer?: number;\n }\n ) {\n return this.withErrorHandling(async () => {\n const api = await this.getApi();\n const id = await this.getBudgetId(params.budgetId);\n const response = await api.transactions.getTransactionsByCategory(\n id,\n categoryId,\n params.sinceDate,\n params.type as TransactionTypeFilter,\n params.lastKnowledgeOfServer\n );\n return {\n transactions: response.data.transactions,\n server_knowledge: response.data.server_knowledge,\n };\n });\n }\n\n async getTransactionsByPayee(\n payeeId: string,\n params: {\n budgetId?: string;\n sinceDate?: string;\n type?: string;\n lastKnowledgeOfServer?: number;\n }\n ) {\n return this.withErrorHandling(async () => {\n const api = await this.getApi();\n const id = await this.getBudgetId(params.budgetId);\n const response = await api.transactions.getTransactionsByPayee(\n id,\n payeeId,\n params.sinceDate,\n params.type as TransactionTypeFilter,\n params.lastKnowledgeOfServer\n );\n return {\n transactions: response.data.transactions,\n server_knowledge: response.data.server_knowledge,\n };\n });\n }\n\n async getTransaction(transactionId: string, budgetId?: string) {\n return this.withErrorHandling(async () => {\n const api = await this.getApi();\n const id = await this.getBudgetId(budgetId);\n const response = await api.transactions.getTransactionById(id, transactionId);\n return response.data.transaction;\n });\n }\n\n async createTransaction(transactionData: ynab.PostTransactionsWrapper, budgetId?: string) {\n return this.withErrorHandling(async () => {\n const api = await this.getApi();\n const id = await this.getBudgetId(budgetId);\n const response = await api.transactions.createTransaction(id, transactionData);\n return response.data.transaction;\n });\n }\n\n async updateTransaction(\n transactionId: string,\n transactionData: ynab.PutTransactionWrapper,\n budgetId?: string\n ) {\n return this.withErrorHandling(async () => {\n const api = await this.getApi();\n const id = await this.getBudgetId(budgetId);\n const response = await api.transactions.updateTransaction(id, transactionId, transactionData);\n return response.data.transaction;\n });\n }\n\n async updateTransactions(\n transactions: ynab.PatchTransactionsWrapper,\n budgetId?: string\n ) {\n return this.withErrorHandling(async () => {\n const api = await this.getApi();\n const id = await this.getBudgetId(budgetId);\n const response = await api.transactions.updateTransactions(id, transactions);\n return {\n transactions: response.data.transactions,\n transaction_ids: response.data.transaction_ids,\n server_knowledge: response.data.server_knowledge,\n };\n });\n }\n\n async deleteTransaction(transactionId: string, budgetId?: string) {\n return this.withErrorHandling(async () => {\n const api = await this.getApi();\n const id = await this.getBudgetId(budgetId);\n const response = await api.transactions.deleteTransaction(id, transactionId);\n return response.data.transaction;\n });\n }\n\n async importTransactions(budgetId?: string) {\n return this.withErrorHandling(async () => {\n const api = await this.getApi();\n const id = await this.getBudgetId(budgetId);\n const response = await api.transactions.importTransactions(id);\n return response.data.transaction_ids;\n });\n }\n\n async getScheduledTransactions(budgetId?: string, lastKnowledgeOfServer?: number) {\n return this.withErrorHandling(async () => {\n const api = await this.getApi();\n const id = await this.getBudgetId(budgetId);\n const response = await api.scheduledTransactions.getScheduledTransactions(\n id,\n lastKnowledgeOfServer\n );\n return {\n scheduled_transactions: response.data.scheduled_transactions,\n server_knowledge: response.data.server_knowledge,\n };\n });\n }\n\n async getScheduledTransaction(scheduledTransactionId: string, budgetId?: string) {\n return this.withErrorHandling(async () => {\n const api = await this.getApi();\n const id = await this.getBudgetId(budgetId);\n const response = await api.scheduledTransactions.getScheduledTransactionById(\n id,\n scheduledTransactionId\n );\n return response.data.scheduled_transaction;\n });\n }\n\n async deleteScheduledTransaction(scheduledTransactionId: string, budgetId?: string) {\n return this.withErrorHandling(async () => {\n const api = await this.getApi();\n const id = await this.getBudgetId(budgetId);\n const response = await api.scheduledTransactions.deleteScheduledTransaction(\n id,\n scheduledTransactionId\n );\n return response.data.scheduled_transaction;\n });\n }\n\n async rawApiCall(method: string, path: string, data?: unknown, budgetId?: string) {\n return this.withErrorHandling(async () => {\n await this.getApi();\n\n const fullPath = path.includes('{budget_id}')\n ? path.replace('{budget_id}', await this.getBudgetId(budgetId))\n : path;\n\n const url = `https://api.ynab.com/v1${fullPath}`;\n const accessToken = (await auth.getAccessToken()) || process.env.YNAB_API_KEY;\n const headers = {\n Authorization: `Bearer ${accessToken}`,\n 'Content-Type': 'application/json',\n };\n\n const httpMethod = method.toUpperCase();\n const hasBody = ['POST', 'PUT', 'PATCH'].includes(httpMethod);\n\n if (!['GET', 'POST', 'PUT', 'PATCH', 'DELETE'].includes(httpMethod)) {\n throw new YnabCliError(`Unsupported HTTP method: ${method}`, 400);\n }\n\n const response = await fetch(url, {\n method: httpMethod,\n headers,\n ...(hasBody && { body: JSON.stringify(data) }),\n });\n\n if (!response.ok) {\n const errorData = (await response.json()) as Record<string, unknown>;\n throw { error: sanitizeApiError(errorData.error || errorData) };\n }\n\n return await response.json();\n });\n }\n}\n\nexport const client = new YnabClient();\n","import { handleYnabError, YnabCliError } from './errors.js';\n\nexport function withErrorHandling<TArgs extends unknown[], R>(\n fn: (...args: TArgs) => Promise<R>\n): (...args: TArgs) => Promise<void> {\n return async (...args: TArgs) => {\n try {\n await fn(...args);\n } catch (error) {\n handleYnabError(error);\n }\n };\n}\n\nexport function requireConfirmation(itemType: string, confirmed: boolean = false): void {\n if (!confirmed) {\n throw new YnabCliError(\n `Deleting ${itemType} requires --yes flag to confirm`,\n 400\n );\n }\n}\n\nexport function buildUpdateObject<T>(\n options: T,\n mapping: Record<string, string>\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n const optionsRecord = options as Record<string, unknown>;\n\n for (const [optionKey, targetKey] of Object.entries(mapping)) {\n if (optionsRecord[optionKey] !== undefined) {\n result[targetKey] = optionsRecord[optionKey];\n }\n }\n\n return result;\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\n\nexport function createUserCommand(): Command {\n const cmd = new Command('user').description('User information');\n\n cmd\n .command('info')\n .description('Get authenticated user information')\n .action(\n withErrorHandling(async () => {\n const user = await client.getUser();\n outputJson(user);\n })\n );\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { config } from '../lib/config.js';\nimport { outputJson } from '../lib/output.js';\nimport { YnabCliError } from '../lib/errors.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\n\nexport function createBudgetsCommand(): Command {\n const cmd = new Command('budgets').description('Budget operations');\n\n cmd\n .command('list')\n .description('List all budgets')\n .option('--include-accounts', 'Include accounts in response')\n .action(\n withErrorHandling(async (options: { includeAccounts?: boolean }) => {\n const result = await client.getBudgets(options.includeAccounts);\n outputJson(result?.budgets);\n })\n );\n\n cmd\n .command('view')\n .description('View budget details (uses default if no id provided)')\n .argument('[id]', 'Budget ID')\n .action(\n withErrorHandling(async (id: string | undefined) => {\n const result = await client.getBudget(id);\n outputJson(result?.budget);\n })\n );\n\n cmd\n .command('settings')\n .description('View budget settings')\n .argument('[id]', 'Budget ID')\n .action(\n withErrorHandling(async (id: string | undefined) => {\n const settings = await client.getBudgetSettings(id);\n outputJson(settings);\n })\n );\n\n cmd\n .command('set-default')\n .description('Set default budget for commands')\n .argument('<id>', 'Budget ID')\n .action(\n withErrorHandling(async (id: string) => {\n const result = await client.getBudgets();\n const budget = result?.budgets.find((b) => b.id === id);\n\n if (!budget) {\n throw new YnabCliError(`Budget with ID ${id} not found`, 404);\n }\n\n config.setDefaultBudget(id);\n outputJson({\n message: 'Default budget set',\n budget: { id: budget.id, name: budget.name },\n });\n })\n );\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\nimport { applyFieldSelection } from '../lib/utils.js';\nimport { parseDate } from '../lib/dates.js';\nimport type { CommandOptions } from '../types/index.js';\n\nexport function createAccountsCommand(): Command {\n const cmd = new Command('accounts').description('Account operations');\n\n cmd\n .command('list')\n .description('List all accounts')\n .option('-b, --budget <id>', 'Budget ID')\n .action(\n withErrorHandling(async (options: CommandOptions) => {\n const result = await client.getAccounts(options.budget);\n outputJson(result?.accounts);\n })\n );\n\n cmd\n .command('view')\n .description('View account details')\n .argument('<id>', 'Account ID')\n .option('-b, --budget <id>', 'Budget ID')\n .action(\n withErrorHandling(async (id: string, options: CommandOptions) => {\n const account = await client.getAccount(id, options.budget);\n outputJson(account);\n })\n );\n\n cmd\n .command('transactions')\n .description('List transactions for account')\n .argument('<id>', 'Account ID')\n .option('-b, --budget <id>', 'Budget ID')\n .option('--since <date>', 'Filter transactions since date')\n .option('--type <type>', 'Filter by transaction type')\n .option(\n '--fields <fields>',\n 'Comma-separated list of fields to include (e.g., id,date,amount,memo)'\n )\n .action(\n withErrorHandling(\n async (\n id: string,\n options: {\n budget?: string;\n since?: string;\n type?: string;\n fields?: string;\n } & CommandOptions\n ) => {\n const result = await client.getTransactionsByAccount(id, {\n budgetId: options.budget,\n sinceDate: options.since ? parseDate(options.since) : undefined,\n type: options.type,\n });\n const transactions = result?.transactions || [];\n outputJson(applyFieldSelection(transactions, options.fields));\n }\n )\n );\n\n return cmd;\n}\n","import dayjs from 'dayjs';\nimport { YnabCliError } from './errors.js';\n\nexport function parseDate(input: string): string {\n const d = dayjs(input);\n if (!d.isValid()) {\n throw new YnabCliError(`Invalid date: ${input}`, 400);\n }\n return d.format('YYYY-MM-DD');\n}\n\nexport function todayDate(): string {\n return dayjs().format('YYYY-MM-DD');\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { outputJson } from '../lib/output.js';\nimport { YnabCliError } from '../lib/errors.js';\nimport { amountToMilliunits, applyFieldSelection } from '../lib/utils.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\nimport { parseDate } from '../lib/dates.js';\nimport type { CommandOptions } from '../types/index.js';\n\nexport function createCategoriesCommand(): Command {\n const cmd = new Command('categories').description('Category operations');\n\n cmd\n .command('list')\n .description('List all categories')\n .option('-b, --budget <id>', 'Budget ID')\n .option('--last-knowledge <number>', 'Last knowledge of server', parseInt)\n .action(\n withErrorHandling(\n async (options: { budget?: string; lastKnowledge?: number } & CommandOptions) => {\n const result = await client.getCategories(options.budget, options.lastKnowledge);\n outputJson(result?.category_groups);\n }\n )\n );\n\n cmd\n .command('view')\n .description('View category details')\n .argument('<id>', 'Category ID')\n .option('-b, --budget <id>', 'Budget ID')\n .action(\n withErrorHandling(async (id: string, options: CommandOptions) => {\n const category = await client.getCategory(id, options.budget);\n outputJson(category);\n })\n );\n\n cmd\n .command('update')\n .description('Update category details')\n .argument('<id>', 'Category ID')\n .option('--name <name>', 'New category name')\n .option('--note <note>', 'Category note (use empty string to clear)')\n .option('--category-group-id <id>', 'Move to a different category group')\n .option('--goal-target <amount>', 'Goal target amount in dollars (ignored if category has no goal)', parseFloat)\n .option('-b, --budget <id>', 'Budget ID')\n .action(\n withErrorHandling(\n async (\n id: string,\n options: {\n name?: string;\n note?: string;\n categoryGroupId?: string;\n goalTarget?: number;\n budget?: string;\n } & CommandOptions\n ) => {\n if (options.name === undefined && options.note === undefined && options.categoryGroupId === undefined && options.goalTarget === undefined) {\n throw new YnabCliError(\n 'At least one field to update must be provided (--name, --note, --category-group-id, or --goal-target)',\n 400\n );\n }\n\n if (options.name !== undefined && options.name.trim() === '') {\n throw new YnabCliError('Category name cannot be empty or whitespace', 400);\n }\n\n const updateData: {\n name?: string;\n note?: string | null;\n category_group_id?: string;\n goal_target?: number | null;\n } = {};\n\n if (options.name !== undefined) {\n updateData.name = options.name.trim();\n }\n if (options.note !== undefined) {\n updateData.note = options.note.trim() || null;\n }\n if (options.categoryGroupId !== undefined) {\n updateData.category_group_id = options.categoryGroupId;\n }\n if (options.goalTarget !== undefined) {\n updateData.goal_target = amountToMilliunits(options.goalTarget);\n }\n\n const category = await client.updateCategory(id, { category: updateData }, options.budget);\n outputJson(category);\n }\n )\n );\n\n cmd\n .command('budget')\n .description('Set category budgeted amount for a month (overrides existing amount)')\n .argument('<id>', 'Category ID')\n .requiredOption('--month <month>', 'Budget month (e.g., 2025-07-01)')\n .requiredOption('--amount <amount>', 'Total budgeted amount to set (e.g., 100.50)', parseFloat)\n .option('-b, --budget <id>', 'Budget ID')\n .action(\n withErrorHandling(\n async (\n id: string,\n options: {\n month: string;\n amount: number;\n budget?: string;\n } & CommandOptions\n ) => {\n if (isNaN(options.amount)) {\n throw new YnabCliError('Amount must be a valid number', 400);\n }\n\n const milliunits = amountToMilliunits(options.amount);\n const category = await client.updateMonthCategory(\n parseDate(options.month),\n id,\n { category: { budgeted: milliunits } },\n options.budget\n );\n outputJson(category);\n }\n )\n );\n\n cmd\n .command('transactions')\n .description('List transactions for category')\n .argument('<id>', 'Category ID')\n .option('-b, --budget <id>', 'Budget ID')\n .option('--since <date>', 'Filter transactions since date')\n .option('--type <type>', 'Filter by transaction type')\n .option('--last-knowledge <number>', 'Last knowledge of server', parseInt)\n .option(\n '--fields <fields>',\n 'Comma-separated list of fields to include (e.g., id,date,amount,memo)'\n )\n .action(\n withErrorHandling(\n async (\n id: string,\n options: {\n budget?: string;\n since?: string;\n type?: string;\n lastKnowledge?: number;\n fields?: string;\n } & CommandOptions\n ) => {\n const result = await client.getTransactionsByCategory(id, {\n budgetId: options.budget,\n sinceDate: options.since ? parseDate(options.since) : undefined,\n type: options.type,\n lastKnowledgeOfServer: options.lastKnowledge,\n });\n const transactions = result?.transactions || [];\n outputJson(applyFieldSelection(transactions, options.fields));\n }\n )\n );\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { outputJson } from '../lib/output.js';\nimport { YnabCliError } from '../lib/errors.js';\nimport dayjs from 'dayjs';\nimport {\n amountToMilliunits,\n applyTransactionFilters,\n applyFieldSelection,\n summarizeTransactions,\n findTransferCandidates,\n type TransactionLike,\n type SummaryTransaction,\n} from '../lib/utils.js';\nimport { withErrorHandling, requireConfirmation, buildUpdateObject } from '../lib/command-utils.js';\nimport { validateTransactionSplits, validateBatchUpdates } from '../lib/schemas.js';\nimport { parseDate, todayDate } from '../lib/dates.js';\nimport type { CommandOptions } from '../types/index.js';\n\nasync function fetchTransactions(options: {\n budget?: string;\n account?: string;\n category?: string;\n payee?: string;\n since?: string;\n type?: string;\n lastKnowledge?: number;\n}) {\n const params = {\n budgetId: options.budget,\n sinceDate: options.since ? parseDate(options.since) : undefined,\n type: options.type,\n lastKnowledgeOfServer: options.lastKnowledge,\n };\n\n if (options.account) return client.getTransactionsByAccount(options.account, params);\n if (options.category) return client.getTransactionsByCategory(options.category, params);\n if (options.payee) return client.getTransactionsByPayee(options.payee, params);\n return client.getTransactions(params);\n}\n\ninterface TransactionOptions {\n account?: string;\n date?: string;\n amount?: number;\n payeeName?: string;\n payeeId?: string;\n categoryId?: string;\n memo?: string;\n cleared?: string;\n approved?: boolean;\n}\n\nfunction buildTransactionData(options: TransactionOptions): Record<string, unknown> {\n if (!options.account) {\n throw new YnabCliError('--account is required in non-interactive mode', 400);\n }\n if (options.amount === undefined) {\n throw new YnabCliError('--amount is required in non-interactive mode', 400);\n }\n\n return {\n account_id: options.account,\n date: options.date ? parseDate(options.date) : todayDate(),\n amount: amountToMilliunits(options.amount),\n payee_name: options.payeeName,\n payee_id: options.payeeId,\n category_id: options.categoryId,\n memo: options.memo,\n cleared: options.cleared,\n approved: options.approved,\n };\n}\n\nexport function createTransactionsCommand(): Command {\n const cmd = new Command('transactions').description('Transaction operations');\n\n cmd\n .command('list')\n .description('List transactions')\n .option('-b, --budget <id>', 'Budget ID')\n .option('--account <id>', 'Filter by account ID')\n .option('--category <id>', 'Filter by category ID')\n .option('--payee <id>', 'Filter by payee ID')\n .option('--since <date>', 'Filter transactions since date')\n .option('--until <date>', 'Filter transactions until date')\n .option('--type <type>', 'Filter by transaction type')\n .option('--approved <value>', 'Filter by approval status: true or false')\n .option(\n '--status <statuses>',\n 'Filter by cleared status: cleared, uncleared, reconciled (comma-separated for multiple)'\n )\n .option('--min-amount <amount>', 'Minimum amount in currency units (e.g., 10.50)', parseFloat)\n .option('--max-amount <amount>', 'Maximum amount in currency units (e.g., 100.00)', parseFloat)\n .option(\n '--fields <fields>',\n 'Comma-separated list of fields to include (e.g., id,date,amount,memo)'\n )\n .option('--last-knowledge <number>', 'Last server knowledge for delta requests. When used, output includes server_knowledge.', parseInt)\n .option('--limit <number>', 'Maximum number of transactions to return', parseInt)\n .action(\n withErrorHandling(\n async (\n options: {\n budget?: string;\n account?: string;\n category?: string;\n payee?: string;\n since?: string;\n until?: string;\n type?: string;\n approved?: string;\n status?: string;\n minAmount?: number;\n maxAmount?: number;\n fields?: string;\n lastKnowledge?: number;\n limit?: number;\n } & CommandOptions\n ) => {\n const result = await fetchTransactions(options);\n const transactions = result?.transactions || [];\n\n let filtered = applyTransactionFilters(transactions as TransactionLike[], {\n until: options.until ? parseDate(options.until) : undefined,\n approved: options.approved,\n status: options.status,\n minAmount: options.minAmount,\n maxAmount: options.maxAmount,\n });\n\n if (options.limit && options.limit > 0) {\n filtered = filtered.slice(0, options.limit);\n }\n\n const selected = applyFieldSelection(filtered, options.fields);\n\n if (options.lastKnowledge !== undefined) {\n outputJson({ transactions: selected, server_knowledge: result?.server_knowledge });\n } else {\n outputJson(selected);\n }\n }\n )\n );\n\n cmd\n .command('view')\n .description('View single transaction')\n .argument('<id>', 'Transaction ID')\n .option('-b, --budget <id>', 'Budget ID')\n .action(\n withErrorHandling(async (id: string, options: CommandOptions) => {\n const transaction = await client.getTransaction(id, options.budget);\n outputJson(transaction);\n })\n );\n\n cmd\n .command('create')\n .description('Create transaction')\n .option('-b, --budget <id>', 'Budget ID')\n .option('--account <id>', 'Account ID')\n .option('--date <date>', 'Transaction date')\n .option('--amount <amount>', 'Amount in currency units (e.g., 10.50)', parseFloat)\n .option('--payee-name <name>', 'Payee name')\n .option('--payee-id <id>', 'Payee ID')\n .option('--category-id <id>', 'Category ID')\n .option('--memo <memo>', 'Memo')\n .option('--cleared <status>', 'Cleared status (cleared, uncleared, reconciled)')\n .option('--approved', 'Mark as approved')\n .action(\n withErrorHandling(\n async (\n options: {\n budget?: string;\n account?: string;\n date?: string;\n amount?: number;\n payeeName?: string;\n payeeId?: string;\n categoryId?: string;\n memo?: string;\n cleared?: string;\n approved?: boolean;\n } & CommandOptions\n ) => {\n const transactionData = buildTransactionData(options);\n const transaction = await client.createTransaction(\n { transaction: transactionData },\n options.budget\n );\n outputJson(transaction);\n }\n )\n );\n\n cmd\n .command('update')\n .description('Update transaction')\n .argument('<id>', 'Transaction ID')\n .option('-b, --budget <id>', 'Budget ID')\n .option('--account <id>', 'Account ID')\n .option('--date <date>', 'Transaction date')\n .option('--amount <amount>', 'Amount in currency units', parseFloat)\n .option('--payee-name <name>', 'Payee name')\n .option('--payee-id <id>', 'Payee ID')\n .option('--category-id <id>', 'Category ID')\n .option('--memo <memo>', 'Memo')\n .option('--cleared <status>', 'Cleared status')\n .option('--approved', 'Mark as approved')\n .action(\n withErrorHandling(\n async (id: string, options: TransactionOptions & { budget?: string } & CommandOptions) => {\n const transactionData = buildUpdateObject(options, {\n account: 'account_id',\n date: 'date',\n payeeName: 'payee_name',\n payeeId: 'payee_id',\n categoryId: 'category_id',\n memo: 'memo',\n cleared: 'cleared',\n approved: 'approved',\n });\n\n if (options.amount !== undefined) {\n transactionData.amount = amountToMilliunits(options.amount);\n }\n\n const transaction = await client.updateTransaction(\n id,\n { transaction: transactionData },\n options.budget\n );\n outputJson(transaction);\n }\n )\n );\n\n cmd\n .command('delete')\n .description('Delete transaction')\n .argument('<id>', 'Transaction ID')\n .option('-b, --budget <id>', 'Budget ID')\n .option('-y, --yes', 'Skip confirmation')\n .action(\n withErrorHandling(\n async (id: string, options: { budget?: string; yes?: boolean } & CommandOptions) => {\n requireConfirmation('transaction', options.yes);\n const transaction = await client.deleteTransaction(id, options.budget);\n outputJson({ message: 'Transaction deleted', transaction });\n }\n )\n );\n\n cmd\n .command('import')\n .description('Import transactions')\n .option('-b, --budget <id>', 'Budget ID')\n .action(\n withErrorHandling(async (options: CommandOptions) => {\n const transactionIds = await client.importTransactions(options.budget);\n outputJson({ transaction_ids: transactionIds });\n })\n );\n\n cmd\n .command('split')\n .description(\n 'Split transaction into multiple categories. Amounts should be in dollars (e.g., 10.50).'\n )\n .argument('<id>', 'Transaction ID')\n .requiredOption(\n '--splits <json>',\n 'JSON array of splits with dollar amounts: [{\"amount\": -21.40, \"category_id\": \"xxx\", \"memo\": \"...\"}]'\n )\n .option('-b, --budget <id>', 'Budget ID')\n .option('-f, --force', 'Force update of already-split transactions by deleting and recreating')\n .action(\n withErrorHandling(\n async (\n id: string,\n options: { splits: string; budget?: string; force?: boolean } & CommandOptions\n ) => {\n let parsedSplits;\n try {\n parsedSplits = JSON.parse(options.splits);\n } catch {\n throw new YnabCliError('Invalid JSON in --splits parameter', 400);\n }\n\n const splits = validateTransactionSplits(parsedSplits);\n\n const splitsInMilliunits = splits.map((split) => ({\n ...split,\n amount: amountToMilliunits(split.amount),\n }));\n\n const existingTransaction = await client.getTransaction(id, options.budget);\n const isAlreadySplit =\n existingTransaction.subtransactions && existingTransaction.subtransactions.length > 0;\n\n if (isAlreadySplit && !options.force) {\n throw new YnabCliError(\n 'Transaction is already split. YNAB API does not support updating split transactions. ' +\n 'Use --force to delete and recreate the transaction with new splits.',\n 400\n );\n }\n\n if (isAlreadySplit) {\n await client.deleteTransaction(id, options.budget);\n\n const recreatedTransaction = await client.createTransaction(\n {\n transaction: {\n account_id: existingTransaction.account_id,\n date: existingTransaction.date,\n amount: existingTransaction.amount,\n payee_id: existingTransaction.payee_id,\n payee_name: existingTransaction.payee_name,\n category_id: null,\n memo: existingTransaction.memo,\n cleared: existingTransaction.cleared,\n approved: existingTransaction.approved,\n flag_color: existingTransaction.flag_color,\n subtransactions: splitsInMilliunits,\n },\n },\n options.budget\n );\n outputJson(recreatedTransaction);\n } else {\n const transaction = await client.updateTransaction(\n id,\n {\n transaction: {\n category_id: null,\n subtransactions: splitsInMilliunits,\n },\n },\n options.budget\n );\n outputJson(transaction);\n }\n }\n )\n );\n\n cmd\n .command('batch-update')\n .description(\n 'Update multiple transactions in a single API call. Amounts should be in dollars (e.g., -21.40).'\n )\n .requiredOption(\n '--transactions <json>',\n 'JSON array of transaction updates. Each must have \"id\" or \"import_id\". Example: [{\"id\": \"tx1\", \"approved\": true, \"category_id\": \"cat1\"}]'\n )\n .option('-b, --budget <id>', 'Budget ID')\n .action(\n withErrorHandling(\n async (options: { transactions: string; budget?: string } & CommandOptions) => {\n let parsed;\n try {\n parsed = JSON.parse(options.transactions);\n } catch {\n throw new YnabCliError('Invalid JSON in --transactions parameter', 400);\n }\n\n const updates = validateBatchUpdates(parsed);\n\n const transactionsInMilliunits = updates.map((update) => ({\n ...update,\n ...(update.amount !== undefined\n ? { amount: amountToMilliunits(update.amount) }\n : {}),\n }));\n\n const result = await client.updateTransactions(\n { transactions: transactionsInMilliunits as Parameters<typeof client.updateTransactions>[0]['transactions'] },\n options.budget\n );\n outputJson(result);\n }\n )\n );\n\n cmd\n .command('search')\n .description('Search transactions')\n .option('-b, --budget <id>', 'Budget ID')\n .option('--memo <text>', 'Search in memo field')\n .option('--payee-name <name>', 'Search in payee name')\n .option('--amount <amount>', 'Search for exact amount in currency units', parseFloat)\n .option('--since <date>', 'Search transactions since date')\n .option('--until <date>', 'Search transactions until date')\n .option('--approved <value>', 'Filter by approval status: true or false')\n .option(\n '--status <statuses>',\n 'Filter by cleared status: cleared, uncleared, reconciled (comma-separated)'\n )\n .option('--fields <fields>', 'Comma-separated list of fields to include')\n .action(\n withErrorHandling(\n async (\n options: {\n budget?: string;\n memo?: string;\n payeeName?: string;\n amount?: number;\n since?: string;\n until?: string;\n approved?: string;\n status?: string;\n fields?: string;\n } & CommandOptions\n ) => {\n if (!options.memo && !options.payeeName && options.amount === undefined) {\n throw new YnabCliError(\n 'At least one search criteria required: --memo, --payee-name, or --amount',\n 400\n );\n }\n\n const params = {\n budgetId: options.budget,\n sinceDate: options.since ? parseDate(options.since) : undefined,\n };\n\n const result = await client.getTransactions(params);\n let transactions = result?.transactions || [];\n\n if (options.memo) {\n const searchTerm = options.memo.toLowerCase();\n transactions = transactions.filter((t) => t.memo?.toLowerCase().includes(searchTerm));\n }\n\n if (options.payeeName) {\n const searchTerm = options.payeeName.toLowerCase();\n transactions = transactions.filter((t) =>\n t.payee_name?.toLowerCase().includes(searchTerm)\n );\n }\n\n if (options.amount !== undefined) {\n const amountMilliunits = amountToMilliunits(options.amount);\n transactions = transactions.filter((t) => t.amount === amountMilliunits);\n }\n\n transactions = applyTransactionFilters(transactions, {\n until: options.until ? parseDate(options.until) : undefined,\n approved: options.approved,\n status: options.status,\n });\n\n const filteredTransactions = applyFieldSelection(transactions, options.fields);\n\n outputJson(filteredTransactions);\n }\n )\n );\n\n cmd\n .command('summary')\n .description('Summarize transactions with aggregate counts by payee, category, and status')\n .option('-b, --budget <id>', 'Budget ID')\n .option('--account <id>', 'Filter by account ID')\n .option('--category <id>', 'Filter by category ID')\n .option('--payee <id>', 'Filter by payee ID')\n .option('--since <date>', 'Filter transactions since date')\n .option('--until <date>', 'Filter transactions until date')\n .option('--type <type>', 'Filter by transaction type')\n .option('--approved <value>', 'Filter by approval status: true or false')\n .option(\n '--status <statuses>',\n 'Filter by cleared status: cleared, uncleared, reconciled (comma-separated)'\n )\n .option('--min-amount <amount>', 'Minimum amount in currency units', parseFloat)\n .option('--max-amount <amount>', 'Maximum amount in currency units', parseFloat)\n .option('--top <number>', 'Limit payee/category breakdowns to top N entries', parseInt)\n .action(\n withErrorHandling(\n async (\n options: {\n budget?: string;\n account?: string;\n category?: string;\n payee?: string;\n since?: string;\n until?: string;\n type?: string;\n approved?: string;\n status?: string;\n minAmount?: number;\n maxAmount?: number;\n top?: number;\n } & CommandOptions\n ) => {\n const result = await fetchTransactions(options);\n const transactions = result?.transactions || [];\n\n const filtered = applyTransactionFilters(transactions as TransactionLike[], {\n until: options.until ? parseDate(options.until) : undefined,\n approved: options.approved,\n status: options.status,\n minAmount: options.minAmount,\n maxAmount: options.maxAmount,\n });\n\n const summary = summarizeTransactions(\n filtered as SummaryTransaction[],\n options.top ? { top: options.top } : undefined\n );\n outputJson(summary);\n }\n )\n );\n\n cmd\n .command('find-transfers')\n .description('Find candidate transfer matches for a transaction across accounts')\n .argument('<id>', 'Transaction ID')\n .option('-b, --budget <id>', 'Budget ID')\n .option('--days <number>', 'Maximum date difference in days (default: 3)', parseInt)\n .option('--since <date>', 'Search transactions since date (defaults to source date minus --days)')\n .action(\n withErrorHandling(\n async (\n id: string,\n options: {\n budget?: string;\n days?: number;\n since?: string;\n } & CommandOptions\n ) => {\n const maxDays = options.days ?? 3;\n const source = await client.getTransaction(id, options.budget);\n\n const sinceDate = options.since\n ? parseDate(options.since)\n : dayjs(source.date).subtract(maxDays, 'day').format('YYYY-MM-DD');\n\n const result = await client.getTransactions({\n budgetId: options.budget,\n sinceDate,\n });\n\n const allTransactions = result?.transactions || [];\n const candidates = findTransferCandidates(\n source as SummaryTransaction,\n allTransactions as SummaryTransaction[],\n { maxDays }\n );\n\n outputJson({ source, candidates });\n }\n )\n );\n\n return cmd;\n}\n","import { YnabCliError } from './errors.js';\n\nexport interface TransactionSplit {\n amount: number;\n category_id?: string | null;\n memo?: string;\n payee_id?: string;\n}\n\nexport function validateTransactionSplits(data: unknown): TransactionSplit[] {\n if (!Array.isArray(data)) {\n throw new YnabCliError('Transaction splits must be an array', 400);\n }\n\n return data.map((item, index) => {\n if (typeof item !== 'object' || item === null) {\n throw new YnabCliError(`Split at index ${index} must be an object`, 400);\n }\n\n const split = item as Record<string, unknown>;\n\n if (typeof split.amount !== 'number') {\n throw new YnabCliError(`Split at index ${index} must have a numeric amount`, 400);\n }\n\n return {\n amount: split.amount,\n category_id: split.category_id as string | null | undefined,\n memo: split.memo as string | undefined,\n payee_id: split.payee_id as string | undefined,\n };\n });\n}\n\nexport interface BatchTransactionUpdate {\n id?: string | null;\n import_id?: string | null;\n account_id?: string;\n date?: string;\n amount?: number;\n payee_id?: string | null;\n payee_name?: string | null;\n category_id?: string | null;\n memo?: string | null;\n cleared?: string;\n approved?: boolean;\n flag_color?: string | null;\n}\n\nconst BATCH_UPDATE_FIELDS: (keyof BatchTransactionUpdate)[] = [\n 'id', 'import_id', 'account_id', 'date', 'amount',\n 'payee_id', 'payee_name', 'category_id', 'memo',\n 'cleared', 'approved', 'flag_color',\n];\n\nexport function validateBatchUpdates(data: unknown): BatchTransactionUpdate[] {\n if (!Array.isArray(data)) {\n throw new YnabCliError('Batch updates must be an array', 400);\n }\n\n return data.map((item, index) => {\n if (typeof item !== 'object' || item === null) {\n throw new YnabCliError(`Update at index ${index} must be an object`, 400);\n }\n\n const update = item as Record<string, unknown>;\n\n if (!update.id && !update.import_id) {\n throw new YnabCliError(\n `Update at index ${index} must have either \"id\" or \"import_id\"`,\n 400\n );\n }\n\n const result: Record<string, unknown> = {};\n for (const field of BATCH_UPDATE_FIELDS) {\n if (update[field] !== undefined) {\n result[field] = update[field];\n }\n }\n return result as BatchTransactionUpdate;\n });\n}\n\nexport function validateApiData(data: unknown): Record<string, unknown> {\n if (typeof data !== 'object' || data === null || Array.isArray(data)) {\n throw new YnabCliError('API data must be an object', 400);\n }\n return data as Record<string, unknown>;\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling, requireConfirmation } from '../lib/command-utils.js';\nimport type { CommandOptions } from '../types/index.js';\n\nexport function createScheduledCommand(): Command {\n const cmd = new Command('scheduled').description('Scheduled transaction operations');\n\n cmd\n .command('list')\n .description('List all scheduled transactions')\n .option('-b, --budget <id>', 'Budget ID')\n .option('--last-knowledge <number>', 'Last knowledge of server', parseInt)\n .action(\n withErrorHandling(\n async (options: { budget?: string; lastKnowledge?: number } & CommandOptions) => {\n const result = await client.getScheduledTransactions(\n options.budget,\n options.lastKnowledge\n );\n outputJson(result?.scheduled_transactions);\n }\n )\n );\n\n cmd\n .command('view')\n .description('View scheduled transaction')\n .argument('<id>', 'Scheduled transaction ID')\n .option('-b, --budget <id>', 'Budget ID')\n .action(\n withErrorHandling(async (id: string, options: CommandOptions) => {\n const scheduledTransaction = await client.getScheduledTransaction(id, options.budget);\n outputJson(scheduledTransaction);\n })\n );\n\n cmd\n .command('delete')\n .description('Delete scheduled transaction')\n .argument('<id>', 'Scheduled transaction ID')\n .option('-b, --budget <id>', 'Budget ID')\n .option('-y, --yes', 'Skip confirmation')\n .action(\n withErrorHandling(\n async (id: string, options: { budget?: string; yes?: boolean } & CommandOptions) => {\n requireConfirmation('scheduled transaction', options.yes);\n const scheduledTransaction = await client.deleteScheduledTransaction(id, options.budget);\n outputJson({\n message: 'Scheduled transaction deleted',\n scheduled_transaction: scheduledTransaction,\n });\n }\n )\n );\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { outputJson } from '../lib/output.js';\nimport { YnabCliError } from '../lib/errors.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\nimport { applyFieldSelection } from '../lib/utils.js';\nimport { parseDate } from '../lib/dates.js';\nimport type { CommandOptions } from '../types/index.js';\n\nexport function createPayeesCommand(): Command {\n const cmd = new Command('payees').description('Payee operations');\n\n cmd\n .command('list')\n .description('List all payees')\n .option('-b, --budget <id>', 'Budget ID')\n .option('--last-knowledge <number>', 'Last knowledge of server', parseInt)\n .action(\n withErrorHandling(\n async (options: { budget?: string; lastKnowledge?: number } & CommandOptions) => {\n const result = await client.getPayees(options.budget, options.lastKnowledge);\n outputJson(result?.payees);\n }\n )\n );\n\n cmd\n .command('view')\n .description('View payee details')\n .argument('<id>', 'Payee ID')\n .option('-b, --budget <id>', 'Budget ID')\n .action(\n withErrorHandling(async (id: string, options: CommandOptions) => {\n const payee = await client.getPayee(id, options.budget);\n outputJson(payee);\n })\n );\n\n cmd\n .command('update')\n .description('Rename payee')\n .argument('<id>', 'Payee ID')\n .requiredOption('--name <name>', 'New payee name')\n .option('-b, --budget <id>', 'Budget ID')\n .action(\n withErrorHandling(\n async (id: string, options: { name: string; budget?: string } & CommandOptions) => {\n if (!options.name?.trim()) {\n throw new YnabCliError('Name cannot be empty', 400);\n }\n\n const payee = await client.updatePayee(\n id,\n { payee: { name: options.name } },\n options.budget\n );\n outputJson(payee);\n }\n )\n );\n\n cmd\n .command('locations')\n .description('List locations for payee')\n .argument('<id>', 'Payee ID')\n .option('-b, --budget <id>', 'Budget ID')\n .action(\n withErrorHandling(async (id: string, options: CommandOptions) => {\n const locations = await client.getPayeeLocationsByPayee(id, options.budget);\n outputJson(locations);\n })\n );\n\n cmd\n .command('transactions')\n .description('List transactions for payee')\n .argument('<id>', 'Payee ID')\n .option('-b, --budget <id>', 'Budget ID')\n .option('--since <date>', 'Filter transactions since date')\n .option('--type <type>', 'Filter by transaction type')\n .option('--last-knowledge <number>', 'Last knowledge of server', parseInt)\n .option(\n '--fields <fields>',\n 'Comma-separated list of fields to include (e.g., id,date,amount,memo)'\n )\n .action(\n withErrorHandling(\n async (\n id: string,\n options: {\n budget?: string;\n since?: string;\n type?: string;\n lastKnowledge?: number;\n fields?: string;\n } & CommandOptions\n ) => {\n const result = await client.getTransactionsByPayee(id, {\n budgetId: options.budget,\n sinceDate: options.since ? parseDate(options.since) : undefined,\n type: options.type,\n lastKnowledgeOfServer: options.lastKnowledge,\n });\n const transactions = result?.transactions || [];\n outputJson(applyFieldSelection(transactions, options.fields));\n }\n )\n );\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\nimport { parseDate } from '../lib/dates.js';\nimport type { CommandOptions } from '../types/index.js';\n\nexport function createMonthsCommand(): Command {\n const cmd = new Command('months').description('Monthly budget operations');\n\n cmd\n .command('list')\n .description('List all budget months')\n .option('-b, --budget <id>', 'Budget ID')\n .option('--last-knowledge <number>', 'Last knowledge of server', parseInt)\n .action(\n withErrorHandling(\n async (options: { budget?: string; lastKnowledge?: number } & CommandOptions) => {\n const result = await client.getBudgetMonths(options.budget, options.lastKnowledge);\n outputJson(result?.months);\n }\n )\n );\n\n cmd\n .command('view')\n .description('View specific month details')\n .argument('<month>', 'Budget month (e.g., 2025-07-01)')\n .option('-b, --budget <id>', 'Budget ID')\n .action(\n withErrorHandling(async (month: string, options: CommandOptions) => {\n const monthData = await client.getBudgetMonth(parseDate(month), options.budget);\n outputJson(monthData);\n })\n );\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { outputJson } from '../lib/output.js';\nimport { YnabCliError } from '../lib/errors.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\nimport { validateApiData } from '../lib/schemas.js';\nimport type { CommandOptions } from '../types/index.js';\n\nconst VALID_HTTP_METHODS = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'];\n\nexport function createApiCommand(): Command {\n const cmd = new Command('api').description('Raw API access');\n\n cmd\n .argument('<method>', 'HTTP method (GET, POST, PUT, PATCH, DELETE)')\n .argument('<path>', 'API path (e.g., /budgets or /budgets/{budget_id}/transactions)')\n .option('-b, --budget <id>', 'Budget ID (used to replace {budget_id} in path)')\n .option('--data <json>', 'JSON data for POST/PUT/PATCH requests')\n .description('Make raw API calls to YNAB')\n .action(\n withErrorHandling(\n async (\n method: string,\n path: string,\n options: { budget?: string; data?: string } & CommandOptions\n ) => {\n const upperMethod = method.toUpperCase();\n\n if (!VALID_HTTP_METHODS.includes(upperMethod)) {\n throw new YnabCliError(\n `Invalid HTTP method: ${method}. Must be one of: ${VALID_HTTP_METHODS.join(', ')}`,\n 400\n );\n }\n\n let data: Record<string, unknown> | undefined;\n if (options.data) {\n let parsedData: unknown;\n try {\n parsedData = JSON.parse(options.data);\n } catch {\n throw new YnabCliError('Invalid JSON in --data parameter', 400);\n }\n data = validateApiData(parsedData);\n }\n\n const result = await client.rawApiCall(upperMethod, path, data, options.budget);\n outputJson(result);\n }\n )\n );\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { runMcpServer } from '../mcp/server.js';\n\nexport function createMcpCommand(): Command {\n const cmd = new Command('mcp').description('Run YNAB MCP server');\n\n cmd.action(async () => {\n await runMcpServer();\n });\n\n return cmd;\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { z } from 'zod';\nimport { client } from '../lib/api-client.js';\nimport { auth } from '../lib/auth.js';\nimport { amountToMilliunits, applyFieldSelection, applyTransactionFilters, convertMilliunitsToAmounts, summarizeTransactions, findTransferCandidates, type SummaryTransaction, type TransactionLike } from '../lib/utils.js';\n\nconst toolRegistry = [\n { name: 'list_budgets', description: 'List all budgets in the YNAB account' },\n { name: 'get_budget', description: 'Get detailed information about a specific budget' },\n { name: 'get_budget_settings', description: 'Get budget settings (date format, currency format, etc.)' },\n { name: 'list_accounts', description: 'List all accounts in a budget' },\n { name: 'get_account', description: 'Get detailed information about a specific account' },\n { name: 'list_categories', description: 'List all category groups and categories in a budget' },\n { name: 'get_category', description: 'Get detailed information about a specific category' },\n { name: 'update_category', description: 'Update category name, note, group, or goal target' },\n { name: 'update_month_category', description: 'Set the budgeted amount for a category in a specific month' },\n { name: 'list_transactions', description: 'List transactions with optional filtering' },\n { name: 'get_transaction', description: 'Get detailed information about a specific transaction' },\n { name: 'create_transaction', description: 'Create a new transaction' },\n { name: 'update_transaction', description: 'Update an existing transaction' },\n { name: 'delete_transaction', description: 'Delete a transaction' },\n { name: 'import_transactions', description: 'Trigger import of linked bank transactions' },\n { name: 'batch_update_transactions', description: 'Update multiple transactions in a single API call' },\n { name: 'summarize_transactions', description: 'Get aggregate summary of transactions by payee, category, and status' },\n { name: 'find_transfer_candidates', description: 'Find candidate transfer matches for a transaction across accounts' },\n { name: 'list_transactions_by_account', description: 'List transactions for a specific account' },\n { name: 'list_transactions_by_category', description: 'List transactions for a specific category' },\n { name: 'list_transactions_by_payee', description: 'List transactions for a specific payee' },\n { name: 'list_payees', description: 'List all payees in a budget' },\n { name: 'update_payee', description: 'Rename a payee' },\n { name: 'list_payee_locations', description: 'List locations for a specific payee' },\n { name: 'list_budget_months', description: 'List all budget months' },\n { name: 'get_budget_month', description: 'Get budget details for a specific month' },\n { name: 'list_scheduled_transactions', description: 'List all scheduled transactions in a budget' },\n { name: 'get_scheduled_transaction', description: 'Get a single scheduled transaction' },\n { name: 'delete_scheduled_transaction', description: 'Delete a scheduled transaction' },\n { name: 'raw_api_call', description: 'Make a direct YNAB API call' },\n { name: 'get_user', description: 'Get information about the authenticated user' },\n { name: 'check_auth', description: 'Check if YNAB authentication is configured' },\n];\n\nconst server = new McpServer({\n name: 'ynab',\n version: '1.0.0',\n});\n\nfunction jsonResponse(data: unknown) {\n return { content: [{ type: 'text' as const, text: JSON.stringify(data, null, 2) }] };\n}\n\nfunction currencyResponse(data: unknown) {\n return jsonResponse(convertMilliunitsToAmounts(data));\n}\n\nserver.tool(\n 'list_budgets',\n 'List all budgets in the YNAB account',\n { includeAccounts: z.boolean().optional().describe('Include account details') },\n async ({ includeAccounts }) => currencyResponse(await client.getBudgets(includeAccounts))\n);\n\nserver.tool(\n 'get_budget',\n 'Get detailed information about a specific budget',\n { budgetId: z.string().optional().describe('Budget ID (uses default if not specified)') },\n async ({ budgetId }) => currencyResponse(await client.getBudget(budgetId))\n);\n\nserver.tool(\n 'get_budget_settings',\n 'Get budget settings (date format, currency format, etc.)',\n { budgetId: z.string().optional().describe('Budget ID (uses default if not specified)') },\n async ({ budgetId }) => jsonResponse(await client.getBudgetSettings(budgetId))\n);\n\nserver.tool(\n 'list_accounts',\n 'List all accounts in a budget',\n { budgetId: z.string().optional().describe('Budget ID (uses default if not specified)') },\n async ({ budgetId }) => currencyResponse(await client.getAccounts(budgetId))\n);\n\nserver.tool(\n 'get_account',\n 'Get detailed information about a specific account',\n {\n accountId: z.string().describe('Account ID'),\n budgetId: z.string().optional().describe('Budget ID (uses default if not specified)'),\n },\n async ({ accountId, budgetId }) => currencyResponse(await client.getAccount(accountId, budgetId))\n);\n\nserver.tool(\n 'list_categories',\n 'List all category groups and categories in a budget',\n { budgetId: z.string().optional().describe('Budget ID (uses default if not specified)') },\n async ({ budgetId }) => currencyResponse(await client.getCategories(budgetId))\n);\n\nserver.tool(\n 'get_category',\n 'Get detailed information about a specific category',\n {\n categoryId: z.string().describe('Category ID'),\n budgetId: z.string().optional().describe('Budget ID (uses default if not specified)'),\n },\n async ({ categoryId, budgetId }) => currencyResponse(await client.getCategory(categoryId, budgetId))\n);\n\nserver.tool(\n 'update_category',\n 'Update category name, note, group, or goal target',\n {\n categoryId: z.string().describe('Category ID'),\n name: z.string().optional().describe('New category name'),\n note: z.string().optional().describe('Category note (use empty string to clear)'),\n categoryGroupId: z.string().optional().describe('Move to a different category group'),\n goalTarget: z.number().optional().describe('Goal target amount in dollars (ignored if category has no goal)'),\n budgetId: z.string().optional().describe('Budget ID (uses default if not specified)'),\n },\n async ({ categoryId, name, note, categoryGroupId, goalTarget, budgetId }) => {\n const updateData: Record<string, unknown> = {};\n if (name !== undefined) updateData.name = name.trim();\n if (note !== undefined) updateData.note = note.trim() || null;\n if (categoryGroupId !== undefined) updateData.category_group_id = categoryGroupId;\n if (goalTarget !== undefined) updateData.goal_target = amountToMilliunits(goalTarget);\n return currencyResponse(await client.updateCategory(categoryId, { category: updateData }, budgetId));\n }\n);\n\nserver.tool(\n 'update_month_category',\n 'Set the budgeted amount for a category in a specific month',\n {\n categoryId: z.string().describe('Category ID'),\n month: z.string().describe('Budget month (YYYY-MM-DD, day is ignored)'),\n budgeted: z.number().describe('Budgeted amount in dollars'),\n budgetId: z.string().optional().describe('Budget ID (uses default if not specified)'),\n },\n async ({ categoryId, month, budgeted, budgetId }) =>\n currencyResponse(\n await client.updateMonthCategory(month, categoryId, { category: { budgeted: amountToMilliunits(budgeted) } }, budgetId)\n )\n);\n\nserver.tool(\n 'list_transactions',\n 'List transactions with optional filtering',\n {\n budgetId: z.string().optional().describe('Budget ID (uses default if not specified)'),\n sinceDate: z.string().optional().describe('Only return transactions on or after this date (YYYY-MM-DD)'),\n type: z.enum(['uncategorized', 'unapproved']).optional().describe('Filter by transaction type'),\n lastKnowledgeOfServer: z.number().optional().describe('Delta sync: only return changes since this server knowledge value. Response includes server_knowledge for next call.'),\n limit: z.number().optional().describe('Maximum number of transactions to return'),\n fields: z.string().optional().describe('Comma-separated list of fields to include (e.g., id,date,amount,memo)'),\n },\n async ({ budgetId, sinceDate, type, lastKnowledgeOfServer, limit, fields }) => {\n const result = await client.getTransactions({ budgetId, sinceDate, type, lastKnowledgeOfServer });\n let transactions = result?.transactions || [];\n if (limit && limit > 0) transactions = transactions.slice(0, limit);\n const selected = fields ? applyFieldSelection(transactions, fields) : transactions;\n return currencyResponse({ transactions: selected, server_knowledge: result?.server_knowledge });\n }\n);\n\nserver.tool(\n 'get_transaction',\n 'Get detailed information about a specific transaction',\n {\n transactionId: z.string().describe('Transaction ID'),\n budgetId: z.string().optional().describe('Budget ID (uses default if not specified)'),\n },\n async ({ transactionId, budgetId }) => currencyResponse(await client.getTransaction(transactionId, budgetId))\n);\n\nserver.tool(\n 'create_transaction',\n 'Create a new transaction',\n {\n accountId: z.string().describe('Account ID'),\n date: z.string().describe('Transaction date (YYYY-MM-DD)'),\n amount: z.number().describe('Amount in dollars (negative for outflow, positive for inflow)'),\n payeeName: z.string().optional().describe('Payee name (creates new payee if not found)'),\n payeeId: z.string().optional().describe('Payee ID'),\n categoryId: z.string().optional().describe('Category ID'),\n memo: z.string().optional().describe('Transaction memo'),\n cleared: z.enum(['cleared', 'uncleared', 'reconciled']).optional().describe('Cleared status'),\n approved: z.boolean().optional().describe('Whether the transaction is approved'),\n budgetId: z.string().optional().describe('Budget ID (uses default if not specified)'),\n },\n async ({ accountId, date, amount, payeeName, payeeId, categoryId, memo, cleared, approved, budgetId }) => {\n const transaction: Record<string, unknown> = {\n account_id: accountId,\n date,\n amount: amountToMilliunits(amount),\n };\n if (payeeName !== undefined) transaction.payee_name = payeeName;\n if (payeeId !== undefined) transaction.payee_id = payeeId;\n if (categoryId !== undefined) transaction.category_id = categoryId;\n if (memo !== undefined) transaction.memo = memo;\n if (cleared !== undefined) transaction.cleared = cleared;\n if (approved !== undefined) transaction.approved = approved;\n return currencyResponse(await client.createTransaction({ transaction }, budgetId));\n }\n);\n\nserver.tool(\n 'update_transaction',\n 'Update an existing transaction',\n {\n transactionId: z.string().describe('Transaction ID'),\n accountId: z.string().optional().describe('Account ID'),\n date: z.string().optional().describe('Transaction date (YYYY-MM-DD)'),\n amount: z.number().optional().describe('Amount in dollars (negative for outflow, positive for inflow)'),\n payeeName: z.string().optional().describe('Payee name'),\n payeeId: z.string().optional().describe('Payee ID'),\n categoryId: z.string().optional().describe('Category ID'),\n memo: z.string().optional().describe('Transaction memo'),\n cleared: z.enum(['cleared', 'uncleared', 'reconciled']).optional().describe('Cleared status'),\n approved: z.boolean().optional().describe('Whether the transaction is approved'),\n budgetId: z.string().optional().describe('Budget ID (uses default if not specified)'),\n },\n async ({ transactionId, accountId, date, amount, payeeName, payeeId, categoryId, memo, cleared, approved, budgetId }) => {\n const transaction: Record<string, unknown> = {};\n if (accountId !== undefined) transaction.account_id = accountId;\n if (date !== undefined) transaction.date = date;\n if (amount !== undefined) transaction.amount = amountToMilliunits(amount);\n if (payeeName !== undefined) transaction.payee_name = payeeName;\n if (payeeId !== undefined) transaction.payee_id = payeeId;\n if (categoryId !== undefined) transaction.category_id = categoryId;\n if (memo !== undefined) transaction.memo = memo;\n if (cleared !== undefined) transaction.cleared = cleared;\n if (approved !== undefined) transaction.approved = approved;\n return currencyResponse(await client.updateTransaction(transactionId, { transaction }, budgetId));\n }\n);\n\nserver.tool(\n 'delete_transaction',\n 'Delete a transaction',\n {\n transactionId: z.string().describe('Transaction ID'),\n budgetId: z.string().optional().describe('Budget ID (uses default if not specified)'),\n },\n async ({ transactionId, budgetId }) =>\n currencyResponse(await client.deleteTransaction(transactionId, budgetId))\n);\n\nserver.tool(\n 'import_transactions',\n 'Trigger import of linked bank transactions',\n { budgetId: z.string().optional().describe('Budget ID (uses default if not specified)') },\n async ({ budgetId }) => jsonResponse(await client.importTransactions(budgetId))\n);\n\nserver.tool(\n 'batch_update_transactions',\n 'Update multiple transactions in a single API call. Amounts in dollars.',\n {\n transactions: z.array(z.object({\n id: z.string().optional().nullable().describe('Transaction ID (required if no import_id)'),\n import_id: z.string().optional().nullable().describe('Import ID (required if no id)'),\n account_id: z.string().optional().describe('Account ID'),\n date: z.string().optional().describe('Transaction date (YYYY-MM-DD)'),\n amount: z.number().optional().describe('Amount in dollars (negative for outflow)'),\n payee_id: z.string().optional().nullable().describe('Payee ID'),\n payee_name: z.string().optional().nullable().describe('Payee name'),\n category_id: z.string().optional().nullable().describe('Category ID'),\n memo: z.string().optional().nullable().describe('Transaction memo'),\n cleared: z.enum(['cleared', 'uncleared', 'reconciled']).optional().describe('Cleared status'),\n approved: z.boolean().optional().describe('Whether the transaction is approved'),\n flag_color: z.enum(['red', 'orange', 'yellow', 'green', 'blue', 'purple']).optional().nullable().describe('Flag color'),\n })).describe('Array of transaction updates'),\n budgetId: z.string().optional().describe('Budget ID (uses default if not specified)'),\n },\n async ({ transactions, budgetId }) => {\n const transactionsInMilliunits = transactions.map((update) => ({\n ...update,\n ...(update.amount !== undefined ? { amount: amountToMilliunits(update.amount) } : {}),\n }));\n return currencyResponse(\n await client.updateTransactions(\n { transactions: transactionsInMilliunits as Parameters<typeof client.updateTransactions>[0]['transactions'] },\n budgetId\n )\n );\n }\n);\n\nserver.tool(\n 'summarize_transactions',\n 'Get aggregate summary of transactions by payee, category, and status',\n {\n budgetId: z.string().optional().describe('Budget ID (uses default if not specified)'),\n sinceDate: z.string().optional().describe('Only return transactions on or after this date (YYYY-MM-DD)'),\n untilDate: z.string().optional().describe('Only return transactions on or before this date (YYYY-MM-DD)'),\n type: z.enum(['uncategorized', 'unapproved']).optional().describe('Filter by transaction type'),\n approved: z.enum(['true', 'false']).optional().describe('Filter by approval status'),\n status: z.string().optional().describe('Filter by cleared status: cleared, uncleared, reconciled (comma-separated)'),\n minAmount: z.number().optional().describe('Minimum amount in dollars'),\n maxAmount: z.number().optional().describe('Maximum amount in dollars'),\n top: z.number().optional().describe('Limit payee/category breakdowns to top N entries'),\n },\n async ({ budgetId, sinceDate, untilDate, type, approved, status, minAmount, maxAmount, top }) => {\n const result = await client.getTransactions({ budgetId, sinceDate, type });\n const transactions = result?.transactions || [];\n const filtered = applyTransactionFilters(transactions as TransactionLike[], {\n until: untilDate,\n approved,\n status,\n minAmount,\n maxAmount,\n });\n const summary = summarizeTransactions(\n filtered as SummaryTransaction[],\n top ? { top } : undefined\n );\n return currencyResponse(summary);\n }\n);\n\nserver.tool(\n 'find_transfer_candidates',\n 'Find candidate transfer matches for a transaction across accounts',\n {\n transactionId: z.string().describe('Transaction ID to find transfers for'),\n budgetId: z.string().optional().describe('Budget ID (uses default if not specified)'),\n maxDays: z.number().optional().describe('Maximum date difference in days (default: 3)'),\n sinceDate: z.string().optional().describe('Search transactions since date (defaults to source date minus maxDays)'),\n },\n async ({ transactionId, budgetId, maxDays: maxDaysParam, sinceDate }) => {\n const days = maxDaysParam ?? 3;\n const source = await client.getTransaction(transactionId, budgetId);\n if (!sinceDate) {\n const d = new Date(source.date);\n d.setDate(d.getDate() - days);\n sinceDate = d.toISOString().split('T')[0];\n }\n const result = await client.getTransactions({ budgetId, sinceDate });\n const allTransactions = result?.transactions || [];\n const candidates = findTransferCandidates(\n source as SummaryTransaction,\n allTransactions as SummaryTransaction[],\n { maxDays: days }\n );\n return currencyResponse({ source, candidates });\n }\n);\n\nserver.tool(\n 'list_transactions_by_account',\n 'List transactions for a specific account',\n {\n accountId: z.string().describe('Account ID'),\n budgetId: z.string().optional().describe('Budget ID (uses default if not specified)'),\n sinceDate: z.string().optional().describe('Only return transactions on or after this date (YYYY-MM-DD)'),\n fields: z.string().optional().describe('Comma-separated list of fields to include (e.g., id,date,amount,memo)'),\n },\n async ({ accountId, budgetId, sinceDate, fields }) => {\n const result = await client.getTransactionsByAccount(accountId, { budgetId, sinceDate });\n if (!fields) return currencyResponse(result);\n return currencyResponse(applyFieldSelection(result?.transactions || [], fields));\n }\n);\n\nserver.tool(\n 'list_transactions_by_category',\n 'List transactions for a specific category',\n {\n categoryId: z.string().describe('Category ID'),\n budgetId: z.string().optional().describe('Budget ID (uses default if not specified)'),\n sinceDate: z.string().optional().describe('Only return transactions on or after this date (YYYY-MM-DD)'),\n fields: z.string().optional().describe('Comma-separated list of fields to include (e.g., id,date,amount,memo)'),\n },\n async ({ categoryId, budgetId, sinceDate, fields }) => {\n const result = await client.getTransactionsByCategory(categoryId, { budgetId, sinceDate });\n if (!fields) return currencyResponse(result);\n return currencyResponse(applyFieldSelection(result?.transactions || [], fields));\n }\n);\n\nserver.tool(\n 'list_transactions_by_payee',\n 'List transactions for a specific payee',\n {\n payeeId: z.string().describe('Payee ID'),\n budgetId: z.string().optional().describe('Budget ID (uses default if not specified)'),\n sinceDate: z.string().optional().describe('Only return transactions on or after this date (YYYY-MM-DD)'),\n fields: z.string().optional().describe('Comma-separated list of fields to include (e.g., id,date,amount,memo)'),\n },\n async ({ payeeId, budgetId, sinceDate, fields }) => {\n const result = await client.getTransactionsByPayee(payeeId, { budgetId, sinceDate });\n if (!fields) return currencyResponse(result);\n return currencyResponse(applyFieldSelection(result?.transactions || [], fields));\n }\n);\n\nserver.tool(\n 'list_payees',\n 'List all payees in a budget',\n { budgetId: z.string().optional().describe('Budget ID (uses default if not specified)') },\n async ({ budgetId }) => jsonResponse(await client.getPayees(budgetId))\n);\n\nserver.tool(\n 'update_payee',\n 'Rename a payee',\n {\n payeeId: z.string().describe('Payee ID'),\n name: z.string().describe('New payee name'),\n budgetId: z.string().optional().describe('Budget ID (uses default if not specified)'),\n },\n async ({ payeeId, name, budgetId }) =>\n jsonResponse(await client.updatePayee(payeeId, { payee: { name } }, budgetId))\n);\n\nserver.tool(\n 'list_payee_locations',\n 'List locations for a specific payee',\n {\n payeeId: z.string().describe('Payee ID'),\n budgetId: z.string().optional().describe('Budget ID (uses default if not specified)'),\n },\n async ({ payeeId, budgetId }) =>\n jsonResponse(await client.getPayeeLocationsByPayee(payeeId, budgetId))\n);\n\nserver.tool(\n 'list_budget_months',\n 'List all budget months',\n { budgetId: z.string().optional().describe('Budget ID (uses default if not specified)') },\n async ({ budgetId }) => currencyResponse(await client.getBudgetMonths(budgetId))\n);\n\nserver.tool(\n 'get_budget_month',\n 'Get budget details for a specific month',\n {\n month: z.string().describe('Month in YYYY-MM-DD format (day is ignored, use first of month)'),\n budgetId: z.string().optional().describe('Budget ID (uses default if not specified)'),\n },\n async ({ month, budgetId }) => currencyResponse(await client.getBudgetMonth(month, budgetId))\n);\n\nserver.tool(\n 'list_scheduled_transactions',\n 'List all scheduled transactions in a budget',\n { budgetId: z.string().optional().describe('Budget ID (uses default if not specified)') },\n async ({ budgetId }) => currencyResponse(await client.getScheduledTransactions(budgetId))\n);\n\nserver.tool(\n 'get_scheduled_transaction',\n 'Get a single scheduled transaction',\n {\n scheduledTransactionId: z.string().describe('Scheduled transaction ID'),\n budgetId: z.string().optional().describe('Budget ID (uses default if not specified)'),\n },\n async ({ scheduledTransactionId, budgetId }) =>\n currencyResponse(await client.getScheduledTransaction(scheduledTransactionId, budgetId))\n);\n\nserver.tool(\n 'delete_scheduled_transaction',\n 'Delete a scheduled transaction',\n {\n scheduledTransactionId: z.string().describe('Scheduled transaction ID'),\n budgetId: z.string().optional().describe('Budget ID (uses default if not specified)'),\n },\n async ({ scheduledTransactionId, budgetId }) =>\n currencyResponse(await client.deleteScheduledTransaction(scheduledTransactionId, budgetId))\n);\n\nserver.tool(\n 'raw_api_call',\n 'Make a direct YNAB API call',\n {\n method: z.enum(['GET', 'POST', 'PUT', 'PATCH', 'DELETE']).describe('HTTP method'),\n path: z.string().describe('API path (e.g., /budgets/{budget_id}/accounts). {budget_id} is replaced with the default budget.'),\n data: z.record(z.unknown()).optional().describe('Request body for POST/PUT/PATCH'),\n budgetId: z.string().optional().describe('Budget ID for {budget_id} replacement (uses default if not specified)'),\n },\n async ({ method, path, data, budgetId }) =>\n jsonResponse(await client.rawApiCall(method, path, data, budgetId))\n);\n\nserver.tool(\n 'get_user',\n 'Get information about the authenticated user',\n {},\n async () => jsonResponse(await client.getUser())\n);\n\nserver.tool(\n 'check_auth',\n 'Check if YNAB authentication is configured',\n {},\n async () => jsonResponse({ authenticated: await auth.isAuthenticated() })\n);\n\nserver.tool(\n 'search_tools',\n 'Search for available tools by name or description using regex. Returns matching tool names.',\n {\n query: z.string().describe('Regex pattern to match against tool names and descriptions (case-insensitive)'),\n },\n async ({ query }) => {\n try {\n const pattern = new RegExp(query, 'i');\n const matches = toolRegistry.filter((t) => pattern.test(t.name) || pattern.test(t.description));\n return jsonResponse({ tools: matches });\n } catch {\n return jsonResponse({ error: 'Invalid regex pattern' });\n }\n }\n);\n\nexport async function runMcpServer() {\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n"],"mappings":";;;AAEA,SAAS,WAAAA,iBAAe;;;ACCjB,IAAM,eAAN,cAA2B,MAAM;AAAA,EACtC,YACE,SACO,YACP;AACA,UAAM,OAAO;AAFN;AAGP,SAAK,OAAO;AAAA,EACd;AACF;AAEA,IAAM,qBAA6C;AAAA,EACjD,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,qBAAqB;AAAA,EACrB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,WAAW;AAAA,EACX,oBAAoB;AAAA,EACpB,UAAU;AAAA,EACV,mBAAmB;AAAA,EACnB,uBAAuB;AAAA,EACvB,qBAAqB;AACvB;AAEO,SAAS,qBAAqB,SAAyB;AAC5D,QAAM,oBAAoB;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI,YAAY;AAChB,aAAW,WAAW,mBAAmB;AACvC,gBAAY,UAAU,QAAQ,SAAS,YAAY;AAAA,EACrD;AAEA,SAAO,UAAU,SAAS,MAAM,UAAU,UAAU,GAAG,GAAG,IAAI,QAAQ;AACxE;AASA,SAAS,cAAc,OAAkD;AACvE,SAAO,OAAO,UAAU,YAAY,UAAU;AAChD;AAEO,SAAS,iBAAiB,OAA2B;AAC1D,MAAI,CAAC,cAAc,KAAK,GAAG;AACzB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,IAAI;AAAA,IACN;AAAA,EACF;AAEA,QAAM,WAAW;AACjB,QAAM,SAAS;AAAA,IACb,OAAO,SAAS,UAAU,SAAS,WAAW,mBAAmB;AAAA,EACnE;AAEA,SAAO;AAAA,IACL,MAAM,SAAS,QAAQ;AAAA,IACvB;AAAA,IACA,IAAI,SAAS;AAAA,EACf;AACF;AAEA,SAAS,wBAAwB,QAAwB;AACvD,SAAO,GAAG,MAAM;AAAA;AAAA;AAClB;AAEA,SAAS,oBAAoB,MAAc,QAAgB,YAA2B;AACpF,QAAM,iBAAiB,SAAS,sBAAsB,wBAAwB,MAAM,IAAI;AAExF,aAAW,EAAE,OAAO,EAAE,MAAM,QAAQ,gBAAgB,WAAW,EAAE,CAAC;AAClE,UAAQ,KAAK,CAAC;AAChB;AAEO,SAAS,gBAAgB,OAAuB;AACrD,MAAI,CAAC,cAAc,KAAK,GAAG;AACzB,wBAAoB,iBAAiB,gCAAgC,CAAC;AAAA,EACxE;AAEA,QAAM,WAAW;AAEjB,MAAI,SAAS,OAAO;AAClB,UAAM,YAAuB,iBAAiB,SAAS,KAAK;AAC5D;AAAA,MACE,UAAU;AAAA,MACV,UAAU;AAAA,MACV,mBAAmB,UAAU,IAAI,KAAK;AAAA,IACxC;AAAA,EACF;AAEA,MAAI,iBAAiB,cAAc;AACjC,UAAMC,aAAY,qBAAqB,MAAM,OAAO;AACpD,wBAAoB,aAAaA,YAAW,MAAM,cAAc,CAAC;AAAA,EACnE;AAEA,QAAM,YAAY,qBAAqB,SAAS,WAAW,8BAA8B;AACzF,sBAAoB,iBAAiB,WAAW,CAAC;AACnD;;;AC5GO,SAAS,mBAAmB,YAA4B;AAC7D,SAAO,aAAa;AACtB;AAEO,SAAS,mBAAmB,QAAwB;AACzD,SAAO,KAAK,MAAM,SAAS,GAAI;AACjC;AAEO,SAAS,2BAA2B,MAAwB;AACjE,MAAI,SAAS,QAAQ,SAAS,OAAW,QAAO;AAChD,MAAI,MAAM,QAAQ,IAAI,EAAG,QAAO,KAAK,IAAI,0BAA0B;AACnE,MAAI,OAAO,SAAS,SAAU,QAAO;AAErC,QAAM,YAAqC,CAAC;AAC5C,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC/C,QAAI,cAAc,GAAG,KAAK,OAAO,UAAU,UAAU;AACnD,gBAAU,GAAG,IAAI,mBAAmB,KAAK;AAAA,IAC3C,WACE,qBAAqB,GAAG,KACxB,OAAO,UAAU,YACjB,UAAU,QACV,CAAC,MAAM,QAAQ,KAAK,GACpB;AACA,YAAM,eAAwC,CAAC;AAC/C,iBAAW,CAAC,SAAS,WAAW,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC1D,qBAAa,OAAO,IAClB,OAAO,gBAAgB,WAAW,mBAAmB,WAAW,IAAI;AAAA,MACxE;AACA,gBAAU,GAAG,IAAI;AAAA,IACnB,OAAO;AACL,gBAAU,GAAG,IAAI,2BAA2B,KAAK;AAAA,IACnD;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,cAAc,WAA4B;AACjD,QAAM,eAAe;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO,aAAa,SAAS,SAAS,KAAK,UAAU,SAAS,SAAS;AACzE;AAEA,SAAS,qBAAqB,WAA4B;AACxD,QAAM,sBAAsB;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO,oBAAoB,SAAS,SAAS;AAC/C;AAEO,SAAS,oBAAoB,OAAwB;AAC1D,QAAM,aAAa,MAAM,YAAY;AACrC,MAAI,eAAe,UAAU,eAAe,SAAS;AACnD,UAAM,IAAI,aAAa,8CAA8C,KAAK,KAAK,GAAG;AAAA,EACpF;AACA,SAAO,eAAe;AACxB;AAEO,SAAS,kBAAkB,OAAyB;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC;AACnE,QAAM,gBAAgB,CAAC,WAAW,aAAa,YAAY;AAE3D,aAAW,UAAU,UAAU;AAC7B,QAAI,CAAC,cAAc,SAAS,MAAM,GAAG;AACnC,YAAM,IAAI;AAAA,QACR,mBAAmB,MAAM,sBAAsB,cAAc,KAAK,IAAI,CAAC;AAAA,QACvE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AASO,SAAS,wBACd,cACA,SAOK;AACL,MAAI,WAAW;AAEf,MAAI,QAAQ,OAAO;AACjB,eAAW,SAAS,OAAO,CAAC,MAAM,EAAE,QAAQ,QAAQ,KAAM;AAAA,EAC5D;AAEA,MAAI,QAAQ,aAAa,QAAW;AAClC,UAAM,gBAAgB,oBAAoB,QAAQ,QAAQ;AAC1D,eAAW,SAAS,OAAO,CAAC,MAAM,EAAE,aAAa,aAAa;AAAA,EAChE;AAEA,MAAI,QAAQ,QAAQ;AAClB,UAAM,WAAW,kBAAkB,QAAQ,MAAM;AACjD,eAAW,SAAS,OAAO,CAAC,MAAM,SAAS,SAAS,EAAE,QAAQ,YAAY,CAAC,CAAC;AAAA,EAC9E;AAEA,MAAI,QAAQ,cAAc,QAAW;AACnC,UAAM,gBAAgB,mBAAmB,QAAQ,SAAS;AAC1D,eAAW,SAAS,OAAO,CAAC,MAAM,EAAE,UAAU,aAAa;AAAA,EAC7D;AAEA,MAAI,QAAQ,cAAc,QAAW;AACnC,UAAM,gBAAgB,mBAAmB,QAAQ,SAAS;AAC1D,eAAW,SAAS,OAAO,CAAC,MAAM,EAAE,UAAU,aAAa;AAAA,EAC7D;AAEA,SAAO;AACT;AAiBO,SAAS,sBACd,cACA,SACA;AACA,MAAI,cAAc;AAClB,QAAM,QAAkB,CAAC;AACzB,QAAM,UAAU,oBAAI,IAAqF;AACzG,QAAM,aAAa,oBAAI,IAA2F;AAClH,QAAM,YAAY,oBAAI,IAA4B;AAClD,QAAM,aAAa,oBAAI,IAA4B;AAEnD,aAAW,KAAK,cAAc;AAC5B,mBAAe,EAAE;AACjB,UAAM,KAAK,EAAE,IAAI;AAEjB,UAAM,WAAW,EAAE,YAAY,EAAE,cAAc;AAC/C,UAAM,aAAa,QAAQ,IAAI,QAAQ,KAAK;AAAA,MAC1C,UAAU,EAAE,YAAY;AAAA,MACxB,YAAY,EAAE,cAAc;AAAA,MAC5B,OAAO;AAAA,MACP,cAAc;AAAA,IAChB;AACA,eAAW;AACX,eAAW,gBAAgB,EAAE;AAC7B,YAAQ,IAAI,UAAU,UAAU;AAEhC,UAAM,SAAS,EAAE,eAAe,EAAE,iBAAiB;AACnD,UAAM,WAAW,WAAW,IAAI,MAAM,KAAK;AAAA,MACzC,aAAa,EAAE,eAAe;AAAA,MAC9B,eAAe,EAAE,iBAAiB;AAAA,MAClC,OAAO;AAAA,MACP,cAAc;AAAA,IAChB;AACA,aAAS;AACT,aAAS,gBAAgB,EAAE;AAC3B,eAAW,IAAI,QAAQ,QAAQ;AAE/B,UAAM,eAAe,UAAU,IAAI,EAAE,OAAO,KAAK,EAAE,OAAO,GAAG,cAAc,EAAE;AAC7E,iBAAa;AACb,iBAAa,gBAAgB,EAAE;AAC/B,cAAU,IAAI,EAAE,SAAS,YAAY;AAErC,UAAM,cAAc,OAAO,EAAE,QAAQ;AACrC,UAAM,gBAAgB,WAAW,IAAI,WAAW,KAAK,EAAE,OAAO,GAAG,cAAc,EAAE;AACjF,kBAAc;AACd,kBAAc,gBAAgB,EAAE;AAChC,eAAW,IAAI,aAAa,aAAa;AAAA,EAC3C;AAEA,QAAM,kBAAkB,CAA2B,YACjD,QAAQ,KAAK,CAAC,GAAG,MAAM,KAAK,IAAI,EAAE,YAAY,IAAI,KAAK,IAAI,EAAE,YAAY,CAAC;AAE5E,QAAM,WAAW,CAA2B,SAAc,kBAAqD;AAC7G,UAAM,MAAM,SAAS;AACrB,QAAI,CAAC,OAAO,OAAO,KAAK,QAAQ,UAAU,IAAK,QAAO;AACtD,UAAM,OAAO,QAAQ,MAAM,GAAG,GAAG;AACjC,UAAM,OAAO,QAAQ,MAAM,GAAG;AAC9B,UAAM,SAAS,cAAc;AAAA,MAC3B,OAAO,KAAK,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,OAAO,CAAC;AAAA,MAC/C,cAAc,KAAK,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,cAAc,CAAC;AAAA,IAC/D,CAAC;AACD,WAAO,CAAC,GAAG,MAAM,MAAM;AAAA,EACzB;AAEA,QAAM,iBAAiB,gBAAgB,CAAC,GAAG,QAAQ,OAAO,CAAC,CAAC;AAC5D,QAAM,oBAAoB,gBAAgB,CAAC,GAAG,WAAW,OAAO,CAAC,CAAC;AAElE,SAAO;AAAA,IACL,aAAa,aAAa;AAAA,IAC1B,cAAc;AAAA,IACd,YAAY,MAAM,SAAS,IACvB;AAAA,MACE,MAAM,MAAM,OAAO,CAAC,GAAG,MAAO,IAAI,IAAI,IAAI,CAAE;AAAA,MAC5C,IAAI,MAAM,OAAO,CAAC,GAAG,MAAO,IAAI,IAAI,IAAI,CAAE;AAAA,IAC5C,IACA;AAAA,IACJ,UAAU,SAAS,gBAAgB,CAAC,OAAO,EAAE,UAAU,MAAM,YAAY,WAAW,GAAG,EAAE,EAAE;AAAA,IAC3F,aAAa,SAAS,mBAAmB,CAAC,OAAO,EAAE,aAAa,MAAM,eAAe,WAAW,GAAG,EAAE,EAAE;AAAA,IACvG,mBAAmB,CAAC,GAAG,UAAU,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,QAAQ,KAAK,OAAO,EAAE,QAAQ,GAAG,MAAM,EAAE;AAAA,IAC3F,oBAAoB,CAAC,GAAG,WAAW,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,UAAU,KAAK,OAAO,EAAE,UAAU,aAAa,QAAQ,GAAG,MAAM,EAAE;AAAA,EACxH;AACF;AAEO,SAAS,uBACd,QACA,iBACA,SACA;AACA,QAAM,eAAe,KAAK,IAAI,OAAO,MAAM;AAC3C,QAAM,eAAe,IAAI,KAAK,OAAO,IAAI,EAAE,QAAQ;AACnD,QAAM,WAAW;AAEjB,WAAS,YAAY,GAA+B;AAClD,WAAO,KAAK,IAAI,IAAI,KAAK,EAAE,IAAI,EAAE,QAAQ,IAAI,YAAY,IAAI;AAAA,EAC/D;AAEA,SAAO,gBACJ,OAAO,CAAC,MAAM;AACb,QAAI,EAAE,eAAe,OAAO,WAAY,QAAO;AAC/C,QAAI,KAAK,IAAI,EAAE,MAAM,MAAM,aAAc,QAAO;AAChD,QAAI,KAAK,KAAK,EAAE,MAAM,MAAM,KAAK,KAAK,OAAO,MAAM,EAAG,QAAO;AAC7D,WAAO,YAAY,CAAC,KAAK,QAAQ;AAAA,EACnC,CAAC,EACA,IAAI,CAAC,OAAO;AAAA,IACX,aAAa;AAAA,IACb,gBAAgB,CAAC,CAAC,EAAE;AAAA,IACpB,sBAAsB,KAAK,MAAM,YAAY,CAAC,CAAC;AAAA,IAC/C,oBAAoB,CAAC,CAAC,EAAE,YAAY,WAAW,YAAY;AAAA,EAC7D,EAAE,EACD,KAAK,CAAC,GAAG,MAAM,EAAE,uBAAuB,EAAE,oBAAoB;AACnE;AAEO,SAAS,oBAAuB,OAAY,QAA+B;AAChF,MAAI,CAAC,OAAQ,QAAO;AAEpB,QAAM,YAAY,OAAO,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AACvD,SAAO,MAAM,IAAI,CAAC,SAAS;AACzB,UAAM,WAAuB,CAAC;AAC9B,UAAM,aAAa;AACnB,eAAW,SAAS,WAAW;AAC7B,UAAI,SAAS,YAAY;AACvB,QAAC,SAAqC,KAAK,IAAI,WAAW,KAAK;AAAA,MACjE;AAAA,IACF;AACA,WAAO;AAAA,EACT,CAAC;AACH;;;ACrRA,IAAI,sBAAqC,CAAC;AAEnC,SAAS,iBAAiB,SAA8B;AAC7D,wBAAsB;AACxB;AAEO,SAAS,WAAW,MAAe,UAAyB,CAAC,GAAS;AAC3E,QAAM,gBAAgB,2BAA2B,IAAI;AACrD,QAAM,gBAAgB,EAAE,GAAG,qBAAqB,GAAG,QAAQ;AAC3D,QAAM,aAAa,cAAc,UAC7B,KAAK,UAAU,aAAa,IAC5B,KAAK,UAAU,eAAe,MAAM,CAAC;AAEzC,UAAQ,IAAI,UAAU;AACxB;;;ACjBA,SAAS,eAAe;AACxB,SAAS,uBAAuB;;;ACDhC,SAAS,aAAa;;;ACAtB,OAAO,UAAU;AAGjB,IAAM,gBAAN,MAAoB;AAAA,EACV;AAAA,EAER,cAAc;AACZ,SAAK,OAAO,IAAI,KAAa;AAAA,MAC3B,aAAa;AAAA,MACb,QAAQ;AAAA,QACN,eAAe,EAAE,MAAM,SAAS;AAAA,QAChC,SAAS,EAAE,MAAM,UAAU,SAAS,QAAQ;AAAA,MAC9C;AAAA,MACA,UAAU,EAAE,SAAS,QAAQ;AAAA,IAC/B,CAAC;AAAA,EACH;AAAA,EAEA,mBAAuC;AACrC,WAAO,KAAK,KAAK,IAAI,eAAe;AAAA,EACtC;AAAA,EAEA,iBAAiB,UAAwB;AACvC,SAAK,KAAK,IAAI,iBAAiB,QAAQ;AAAA,EACzC;AAAA,EAEA,qBAA2B;AACzB,SAAK,KAAK,OAAO,eAAe;AAAA,EAClC;AAAA,EAEA,QAAc;AACZ,SAAK,KAAK,MAAM;AAAA,EAClB;AACF;AAEO,IAAM,SAAS,IAAI,cAAc;;;AD/BxC,IAAM,eAAe;AACrB,IAAM,eAAe;AAErB,IAAM,4BACJ;AAKF,IAAI,UAAoC;AAExC,SAAS,aAA2B;AAClC,MAAI,YAAY,QAAW;AACzB,WAAO;AAAA,EACT;AACA,MAAI;AACF,cAAU,IAAI,MAAM,cAAc,YAAY;AAAA,EAChD,QAAQ;AACN,cAAU;AAAA,EACZ;AACA,SAAO;AACT;AAMO,IAAM,cAAN,MAAkB;AAAA,EACvB,MAAM,iBAAyC;AAC7C,UAAM,QAAQ,WAAW;AACzB,QAAI,OAAO;AACT,UAAI;AACF,eAAO,MAAM,YAAY;AAAA,MAC3B,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,eAAe,OAA8B;AACjD,UAAM,QAAQ,WAAW;AACzB,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,MAAM,yBAAyB;AAAA,IAC3C;AACA,QAAI;AACF,YAAM,YAAY,KAAK;AAAA,IACzB,SAAS,OAAO;AACd,YAAM,IAAI;AAAA,QACR,sCAAsC,iBAAiB,QAAQ,MAAM,UAAU,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,MAItF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,oBAAsC;AAC1C,UAAM,QAAQ,WAAW;AACzB,QAAI,OAAO;AACT,aAAO,MAAM,eAAe;AAAA,IAC9B;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,kBAAoC;AACxC,WAAQ,MAAM,KAAK,eAAe,MAAO;AAAA,EAC3C;AAAA,EAEA,MAAM,SAAwB;AAC5B,UAAM,KAAK,kBAAkB;AAC7B,WAAO,mBAAmB;AAAA,EAC5B;AACF;AAEO,IAAM,OAAO,IAAI,YAAY;;;AE9EpC,YAAY,UAAU;AAOf,IAAM,aAAN,MAAiB;AAAA,EACd,MAAuB;AAAA,EACvB,qBAAqB;AAAA,EAE7B,WAAiB;AACf,SAAK,MAAM;AACX,SAAK,qBAAqB;AAAA,EAC5B;AAAA,EAEA,MAAM,SAA4B;AAChC,QAAI,KAAK,KAAK;AACZ,aAAO,KAAK;AAAA,IACd;AAEA,UAAM,gBAAgB,MAAM,KAAK,eAAe;AAChD,UAAM,cAAc,iBAAiB,QAAQ,IAAI,gBAAgB;AAEjE,QAAI,CAAC,aAAa;AAChB,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,iBAAiB,QAAQ,IAAI,gBAAgB,CAAC,KAAK,oBAAoB;AAC1E,cAAQ;AAAA,QACN;AAAA,MAGF;AACA,WAAK,qBAAqB;AAAA,IAC5B;AAEA,SAAK,MAAM,IAAS,SAAI,WAAW;AACnC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,YAAY,mBAA6C;AAC7D,UAAM,WAAW,qBAAqB,OAAO,iBAAiB,KAAK,QAAQ,IAAI;AAE/E,QAAI,CAAC,UAAU;AACb,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,kBAAqB,IAAkC;AACnE,QAAI;AACF,aAAO,MAAM,GAAG;AAAA,IAClB,SAAS,OAAO;AACd,sBAAgB,KAAK;AAAA,IACvB;AAAA,EACF;AAAA,EAEA,MAAM,UAAU;AACd,WAAO,KAAK,kBAAkB,YAAY;AACxC,YAAM,MAAM,MAAM,KAAK,OAAO;AAC9B,YAAM,WAAW,MAAM,IAAI,KAAK,QAAQ;AACxC,aAAO,SAAS,KAAK;AAAA,IACvB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,WAAW,kBAAkB,OAAO;AACxC,WAAO,KAAK,kBAAkB,YAAY;AACxC,YAAM,MAAM,MAAM,KAAK,OAAO;AAC9B,YAAM,WAAW,MAAM,IAAI,QAAQ,WAAW,eAAe;AAC7D,aAAO;AAAA,QACL,SAAS,SAAS,KAAK;AAAA,QACvB,kBAAkB;AAAA,MACpB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,UAAU,UAAmB,uBAAgC;AACjE,WAAO,KAAK,kBAAkB,YAAY;AACxC,YAAM,MAAM,MAAM,KAAK,OAAO;AAC9B,YAAM,KAAK,MAAM,KAAK,YAAY,QAAQ;AAC1C,YAAM,WAAW,MAAM,IAAI,QAAQ,cAAc,IAAI,qBAAqB;AAC1E,aAAO;AAAA,QACL,QAAQ,SAAS,KAAK;AAAA,QACtB,kBAAkB,SAAS,KAAK;AAAA,MAClC;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,kBAAkB,UAAmB;AACzC,WAAO,KAAK,kBAAkB,YAAY;AACxC,YAAM,MAAM,MAAM,KAAK,OAAO;AAC9B,YAAM,KAAK,MAAM,KAAK,YAAY,QAAQ;AAC1C,YAAM,WAAW,MAAM,IAAI,QAAQ,sBAAsB,EAAE;AAC3D,aAAO,SAAS,KAAK;AAAA,IACvB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,YAAY,UAAmB,uBAAgC;AACnE,WAAO,KAAK,kBAAkB,YAAY;AACxC,YAAM,MAAM,MAAM,KAAK,OAAO;AAC9B,YAAM,KAAK,MAAM,KAAK,YAAY,QAAQ;AAC1C,YAAM,WAAW,MAAM,IAAI,SAAS,YAAY,IAAI,qBAAqB;AACzE,aAAO;AAAA,QACL,UAAU,SAAS,KAAK;AAAA,QACxB,kBAAkB,SAAS,KAAK;AAAA,MAClC;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,WAAW,WAAmB,UAAmB;AACrD,WAAO,KAAK,kBAAkB,YAAY;AACxC,YAAM,MAAM,MAAM,KAAK,OAAO;AAC9B,YAAM,KAAK,MAAM,KAAK,YAAY,QAAQ;AAC1C,YAAM,WAAW,MAAM,IAAI,SAAS,eAAe,IAAI,SAAS;AAChE,aAAO,SAAS,KAAK;AAAA,IACvB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,cAAc,UAAmB,uBAAgC;AACrE,WAAO,KAAK,kBAAkB,YAAY;AACxC,YAAM,MAAM,MAAM,KAAK,OAAO;AAC9B,YAAM,KAAK,MAAM,KAAK,YAAY,QAAQ;AAC1C,YAAM,WAAW,MAAM,IAAI,WAAW,cAAc,IAAI,qBAAqB;AAC7E,aAAO;AAAA,QACL,iBAAiB,SAAS,KAAK;AAAA,QAC/B,kBAAkB,SAAS,KAAK;AAAA,MAClC;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,YAAY,YAAoB,UAAmB;AACvD,WAAO,KAAK,kBAAkB,YAAY;AACxC,YAAM,MAAM,MAAM,KAAK,OAAO;AAC9B,YAAM,KAAK,MAAM,KAAK,YAAY,QAAQ;AAC1C,YAAM,WAAW,MAAM,IAAI,WAAW,gBAAgB,IAAI,UAAU;AACpE,aAAO,SAAS,KAAK;AAAA,IACvB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,oBACJ,OACA,YACA,MACA,UACA;AACA,WAAO,KAAK,kBAAkB,YAAY;AACxC,YAAM,MAAM,MAAM,KAAK,OAAO;AAC9B,YAAM,KAAK,MAAM,KAAK,YAAY,QAAQ;AAC1C,YAAM,WAAW,MAAM,IAAI,WAAW,oBAAoB,IAAI,OAAO,YAAY,IAAI;AACrF,aAAO,SAAS,KAAK;AAAA,IACvB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,eAAe,YAAoB,MAAiC,UAAmB;AAC3F,WAAO,KAAK,kBAAkB,YAAY;AACxC,YAAM,MAAM,MAAM,KAAK,OAAO;AAC9B,YAAM,KAAK,MAAM,KAAK,YAAY,QAAQ;AAC1C,YAAM,WAAW,MAAM,IAAI,WAAW,eAAe,IAAI,YAAY,IAAI;AACzE,aAAO,SAAS,KAAK;AAAA,IACvB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,UAAU,UAAmB,uBAAgC;AACjE,WAAO,KAAK,kBAAkB,YAAY;AACxC,YAAM,MAAM,MAAM,KAAK,OAAO;AAC9B,YAAM,KAAK,MAAM,KAAK,YAAY,QAAQ;AAC1C,YAAM,WAAW,MAAM,IAAI,OAAO,UAAU,IAAI,qBAAqB;AACrE,aAAO;AAAA,QACL,QAAQ,SAAS,KAAK;AAAA,QACtB,kBAAkB,SAAS,KAAK;AAAA,MAClC;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,SAAS,SAAiB,UAAmB;AACjD,WAAO,KAAK,kBAAkB,YAAY;AACxC,YAAM,MAAM,MAAM,KAAK,OAAO;AAC9B,YAAM,KAAK,MAAM,KAAK,YAAY,QAAQ;AAC1C,YAAM,WAAW,MAAM,IAAI,OAAO,aAAa,IAAI,OAAO;AAC1D,aAAO,SAAS,KAAK;AAAA,IACvB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,YAAY,SAAiB,MAA8B,UAAmB;AAClF,WAAO,KAAK,kBAAkB,YAAY;AACxC,YAAM,MAAM,MAAM,KAAK,OAAO;AAC9B,YAAM,KAAK,MAAM,KAAK,YAAY,QAAQ;AAC1C,YAAM,WAAW,MAAM,IAAI,OAAO,YAAY,IAAI,SAAS,IAAI;AAC/D,aAAO,SAAS,KAAK;AAAA,IACvB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,yBAAyB,SAAiB,UAAmB;AACjE,WAAO,KAAK,kBAAkB,YAAY;AACxC,YAAM,MAAM,MAAM,KAAK,OAAO;AAC9B,YAAM,KAAK,MAAM,KAAK,YAAY,QAAQ;AAC1C,YAAM,WAAW,MAAM,IAAI,eAAe,yBAAyB,IAAI,OAAO;AAC9E,aAAO,SAAS,KAAK;AAAA,IACvB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,gBAAgB,UAAmB,uBAAgC;AACvE,WAAO,KAAK,kBAAkB,YAAY;AACxC,YAAM,MAAM,MAAM,KAAK,OAAO;AAC9B,YAAM,KAAK,MAAM,KAAK,YAAY,QAAQ;AAC1C,YAAM,WAAW,MAAM,IAAI,OAAO,gBAAgB,IAAI,qBAAqB;AAC3E,aAAO;AAAA,QACL,QAAQ,SAAS,KAAK;AAAA,QACtB,kBAAkB,SAAS,KAAK;AAAA,MAClC;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,eAAe,OAAe,UAAmB;AACrD,WAAO,KAAK,kBAAkB,YAAY;AACxC,YAAM,MAAM,MAAM,KAAK,OAAO;AAC9B,YAAM,KAAK,MAAM,KAAK,YAAY,QAAQ;AAC1C,YAAM,WAAW,MAAM,IAAI,OAAO,eAAe,IAAI,KAAK;AAC1D,aAAO,SAAS,KAAK;AAAA,IACvB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,gBAAgB,QAKnB;AACD,WAAO,KAAK,kBAAkB,YAAY;AACxC,YAAM,MAAM,MAAM,KAAK,OAAO;AAC9B,YAAM,KAAK,MAAM,KAAK,YAAY,OAAO,QAAQ;AACjD,YAAM,WAAW,MAAM,IAAI,aAAa;AAAA,QACtC;AAAA,QACA,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,MACT;AACA,aAAO;AAAA,QACL,cAAc,SAAS,KAAK;AAAA,QAC5B,kBAAkB,SAAS,KAAK;AAAA,MAClC;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,yBACJ,WACA,QAMA;AACA,WAAO,KAAK,kBAAkB,YAAY;AACxC,YAAM,MAAM,MAAM,KAAK,OAAO;AAC9B,YAAM,KAAK,MAAM,KAAK,YAAY,OAAO,QAAQ;AACjD,YAAM,WAAW,MAAM,IAAI,aAAa;AAAA,QACtC;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,MACT;AACA,aAAO;AAAA,QACL,cAAc,SAAS,KAAK;AAAA,QAC5B,kBAAkB,SAAS,KAAK;AAAA,MAClC;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,0BACJ,YACA,QAMA;AACA,WAAO,KAAK,kBAAkB,YAAY;AACxC,YAAM,MAAM,MAAM,KAAK,OAAO;AAC9B,YAAM,KAAK,MAAM,KAAK,YAAY,OAAO,QAAQ;AACjD,YAAM,WAAW,MAAM,IAAI,aAAa;AAAA,QACtC;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,MACT;AACA,aAAO;AAAA,QACL,cAAc,SAAS,KAAK;AAAA,QAC5B,kBAAkB,SAAS,KAAK;AAAA,MAClC;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,uBACJ,SACA,QAMA;AACA,WAAO,KAAK,kBAAkB,YAAY;AACxC,YAAM,MAAM,MAAM,KAAK,OAAO;AAC9B,YAAM,KAAK,MAAM,KAAK,YAAY,OAAO,QAAQ;AACjD,YAAM,WAAW,MAAM,IAAI,aAAa;AAAA,QACtC;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,MACT;AACA,aAAO;AAAA,QACL,cAAc,SAAS,KAAK;AAAA,QAC5B,kBAAkB,SAAS,KAAK;AAAA,MAClC;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,eAAe,eAAuB,UAAmB;AAC7D,WAAO,KAAK,kBAAkB,YAAY;AACxC,YAAM,MAAM,MAAM,KAAK,OAAO;AAC9B,YAAM,KAAK,MAAM,KAAK,YAAY,QAAQ;AAC1C,YAAM,WAAW,MAAM,IAAI,aAAa,mBAAmB,IAAI,aAAa;AAC5E,aAAO,SAAS,KAAK;AAAA,IACvB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,kBAAkB,iBAA+C,UAAmB;AACxF,WAAO,KAAK,kBAAkB,YAAY;AACxC,YAAM,MAAM,MAAM,KAAK,OAAO;AAC9B,YAAM,KAAK,MAAM,KAAK,YAAY,QAAQ;AAC1C,YAAM,WAAW,MAAM,IAAI,aAAa,kBAAkB,IAAI,eAAe;AAC7E,aAAO,SAAS,KAAK;AAAA,IACvB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,kBACJ,eACA,iBACA,UACA;AACA,WAAO,KAAK,kBAAkB,YAAY;AACxC,YAAM,MAAM,MAAM,KAAK,OAAO;AAC9B,YAAM,KAAK,MAAM,KAAK,YAAY,QAAQ;AAC1C,YAAM,WAAW,MAAM,IAAI,aAAa,kBAAkB,IAAI,eAAe,eAAe;AAC5F,aAAO,SAAS,KAAK;AAAA,IACvB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,mBACJ,cACA,UACA;AACA,WAAO,KAAK,kBAAkB,YAAY;AACxC,YAAM,MAAM,MAAM,KAAK,OAAO;AAC9B,YAAM,KAAK,MAAM,KAAK,YAAY,QAAQ;AAC1C,YAAM,WAAW,MAAM,IAAI,aAAa,mBAAmB,IAAI,YAAY;AAC3E,aAAO;AAAA,QACL,cAAc,SAAS,KAAK;AAAA,QAC5B,iBAAiB,SAAS,KAAK;AAAA,QAC/B,kBAAkB,SAAS,KAAK;AAAA,MAClC;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,kBAAkB,eAAuB,UAAmB;AAChE,WAAO,KAAK,kBAAkB,YAAY;AACxC,YAAM,MAAM,MAAM,KAAK,OAAO;AAC9B,YAAM,KAAK,MAAM,KAAK,YAAY,QAAQ;AAC1C,YAAM,WAAW,MAAM,IAAI,aAAa,kBAAkB,IAAI,aAAa;AAC3E,aAAO,SAAS,KAAK;AAAA,IACvB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,mBAAmB,UAAmB;AAC1C,WAAO,KAAK,kBAAkB,YAAY;AACxC,YAAM,MAAM,MAAM,KAAK,OAAO;AAC9B,YAAM,KAAK,MAAM,KAAK,YAAY,QAAQ;AAC1C,YAAM,WAAW,MAAM,IAAI,aAAa,mBAAmB,EAAE;AAC7D,aAAO,SAAS,KAAK;AAAA,IACvB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,yBAAyB,UAAmB,uBAAgC;AAChF,WAAO,KAAK,kBAAkB,YAAY;AACxC,YAAM,MAAM,MAAM,KAAK,OAAO;AAC9B,YAAM,KAAK,MAAM,KAAK,YAAY,QAAQ;AAC1C,YAAM,WAAW,MAAM,IAAI,sBAAsB;AAAA,QAC/C;AAAA,QACA;AAAA,MACF;AACA,aAAO;AAAA,QACL,wBAAwB,SAAS,KAAK;AAAA,QACtC,kBAAkB,SAAS,KAAK;AAAA,MAClC;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,wBAAwB,wBAAgC,UAAmB;AAC/E,WAAO,KAAK,kBAAkB,YAAY;AACxC,YAAM,MAAM,MAAM,KAAK,OAAO;AAC9B,YAAM,KAAK,MAAM,KAAK,YAAY,QAAQ;AAC1C,YAAM,WAAW,MAAM,IAAI,sBAAsB;AAAA,QAC/C;AAAA,QACA;AAAA,MACF;AACA,aAAO,SAAS,KAAK;AAAA,IACvB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,2BAA2B,wBAAgC,UAAmB;AAClF,WAAO,KAAK,kBAAkB,YAAY;AACxC,YAAM,MAAM,MAAM,KAAK,OAAO;AAC9B,YAAM,KAAK,MAAM,KAAK,YAAY,QAAQ;AAC1C,YAAM,WAAW,MAAM,IAAI,sBAAsB;AAAA,QAC/C;AAAA,QACA;AAAA,MACF;AACA,aAAO,SAAS,KAAK;AAAA,IACvB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,WAAW,QAAgB,MAAc,MAAgB,UAAmB;AAChF,WAAO,KAAK,kBAAkB,YAAY;AACxC,YAAM,KAAK,OAAO;AAElB,YAAM,WAAW,KAAK,SAAS,aAAa,IACxC,KAAK,QAAQ,eAAe,MAAM,KAAK,YAAY,QAAQ,CAAC,IAC5D;AAEJ,YAAM,MAAM,0BAA0B,QAAQ;AAC9C,YAAM,cAAe,MAAM,KAAK,eAAe,KAAM,QAAQ,IAAI;AACjE,YAAM,UAAU;AAAA,QACd,eAAe,UAAU,WAAW;AAAA,QACpC,gBAAgB;AAAA,MAClB;AAEA,YAAM,aAAa,OAAO,YAAY;AACtC,YAAM,UAAU,CAAC,QAAQ,OAAO,OAAO,EAAE,SAAS,UAAU;AAE5D,UAAI,CAAC,CAAC,OAAO,QAAQ,OAAO,SAAS,QAAQ,EAAE,SAAS,UAAU,GAAG;AACnE,cAAM,IAAI,aAAa,4BAA4B,MAAM,IAAI,GAAG;AAAA,MAClE;AAEA,YAAM,WAAW,MAAM,MAAM,KAAK;AAAA,QAChC,QAAQ;AAAA,QACR;AAAA,QACA,GAAI,WAAW,EAAE,MAAM,KAAK,UAAU,IAAI,EAAE;AAAA,MAC9C,CAAC;AAED,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,YAAa,MAAM,SAAS,KAAK;AACvC,cAAM,EAAE,OAAO,iBAAiB,UAAU,SAAS,SAAS,EAAE;AAAA,MAChE;AAEA,aAAO,MAAM,SAAS,KAAK;AAAA,IAC7B,CAAC;AAAA,EACH;AACF;AAEO,IAAM,SAAS,IAAI,WAAW;;;ACtd9B,SAAS,kBACd,IACmC;AACnC,SAAO,UAAU,SAAgB;AAC/B,QAAI;AACF,YAAM,GAAG,GAAG,IAAI;AAAA,IAClB,SAAS,OAAO;AACd,sBAAgB,KAAK;AAAA,IACvB;AAAA,EACF;AACF;AAEO,SAAS,oBAAoB,UAAkB,YAAqB,OAAa;AACtF,MAAI,CAAC,WAAW;AACd,UAAM,IAAI;AAAA,MACR,YAAY,QAAQ;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,kBACd,SACA,SACyB;AACzB,QAAM,SAAkC,CAAC;AACzC,QAAM,gBAAgB;AAEtB,aAAW,CAAC,WAAW,SAAS,KAAK,OAAO,QAAQ,OAAO,GAAG;AAC5D,QAAI,cAAc,SAAS,MAAM,QAAW;AAC1C,aAAO,SAAS,IAAI,cAAc,SAAS;AAAA,IAC7C;AAAA,EACF;AAEA,SAAO;AACT;;;AJ7BA,SAAS,qBAAsC;AAC7C,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,QAAI,OAAO;AACX,YAAQ,MAAM,YAAY,MAAM;AAChC,YAAQ,MAAM,GAAG,QAAQ,CAAC,UAAU;AAAE,cAAQ;AAAA,IAAO,CAAC;AACtD,YAAQ,MAAM,GAAG,OAAO,MAAM,QAAQ,KAAK,KAAK,CAAC,CAAC;AAClD,YAAQ,MAAM,GAAG,SAAS,MAAM;AAAA,EAClC,CAAC;AACH;AAEA,SAAS,iBAAkC;AACzC,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAM,KAAK,gBAAgB;AAAA,MACzB,OAAO,QAAQ;AAAA,MACf,QAAQ,QAAQ;AAAA,IAClB,CAAC;AACD,YAAQ,OAAO,MAAM,oCAAoC;AACzD,OAAG,SAAS,IAAI,CAAC,WAAW;AAC1B,SAAG,MAAM;AACT,cAAQ,OAAO,KAAK,CAAC;AAAA,IACvB,CAAC;AAAA,EACH,CAAC;AACH;AAEO,SAAS,oBAA6B;AAC3C,QAAM,MAAM,IAAI,QAAQ,MAAM,EAAE,YAAY,2BAA2B;AAEvE,MACG,QAAQ,OAAO,EACf,YAAY,wBAAwB,EACpC,OAAO,uBAAuB,4BAA4B,EAC1D;AAAA,IACC,kBAAkB,OAAO,YAAgC;AACvD,UAAI;AAEJ,UAAI,QAAQ,OAAO;AACjB,gBAAQ,QAAQ,MAAM,KAAK;AAAA,MAC7B,WAAW,CAAC,QAAQ,MAAM,OAAO;AAC/B,gBAAQ,MAAM,mBAAmB;AAAA,MACnC,OAAO;AACL,gBAAQ,MAAM,eAAe;AAAA,MAC/B;AAEA,UAAI,CAAC,OAAO;AACV,cAAM,IAAI,aAAa,gCAAgC,GAAG;AAAA,MAC5D;AACA,YAAM,KAAK,eAAe,KAAK;AAC/B,aAAO,SAAS;AAEhB,UAAI;AACF,cAAM,OAAO,MAAM,OAAO,QAAQ;AAClC,mBAAW;AAAA,UACT,SAAS;AAAA,UACT,MAAM,EAAE,IAAI,MAAM,GAAG;AAAA,QACvB,CAAC;AAAA,MACH,SAAS,OAAO;AACd,cAAM,KAAK,kBAAkB;AAC7B,eAAO,SAAS;AAChB,cAAM;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH;AAEF,MACG,QAAQ,QAAQ,EAChB,YAAY,6BAA6B,EACzC;AAAA,IACC,kBAAkB,YAAY;AAC5B,YAAM,kBAAkB,MAAM,KAAK,gBAAgB;AAEnD,UAAI,CAAC,iBAAiB;AACpB,mBAAW,EAAE,eAAe,OAAO,SAAS,oBAAoB,CAAC;AACjE;AAAA,MACF;AAEA,UAAI;AACF,cAAM,OAAO,MAAM,OAAO,QAAQ;AAClC,mBAAW,EAAE,eAAe,MAAM,MAAM,EAAE,IAAI,MAAM,GAAG,EAAE,CAAC;AAAA,MAC5D,QAAQ;AACN,mBAAW,EAAE,eAAe,OAAO,SAAS,8BAA8B,CAAC;AAAA,MAC7E;AAAA,IACF,CAAC;AAAA,EACH;AAEF,MACG,QAAQ,QAAQ,EAChB,YAAY,2BAA2B,EACvC;AAAA,IACC,kBAAkB,YAAY;AAC5B,YAAM,KAAK,OAAO;AAClB,aAAO,SAAS;AAChB,iBAAW,EAAE,SAAS,0BAA0B,CAAC;AAAA,IACnD,CAAC;AAAA,EACH;AAEF,SAAO;AACT;;;AKxGA,SAAS,WAAAC,gBAAe;AAKjB,SAAS,oBAA6B;AAC3C,QAAM,MAAM,IAAIC,SAAQ,MAAM,EAAE,YAAY,kBAAkB;AAE9D,MACG,QAAQ,MAAM,EACd,YAAY,oCAAoC,EAChD;AAAA,IACC,kBAAkB,YAAY;AAC5B,YAAM,OAAO,MAAM,OAAO,QAAQ;AAClC,iBAAW,IAAI;AAAA,IACjB,CAAC;AAAA,EACH;AAEF,SAAO;AACT;;;ACnBA,SAAS,WAAAC,gBAAe;AAOjB,SAAS,uBAAgC;AAC9C,QAAM,MAAM,IAAIC,SAAQ,SAAS,EAAE,YAAY,mBAAmB;AAElE,MACG,QAAQ,MAAM,EACd,YAAY,kBAAkB,EAC9B,OAAO,sBAAsB,8BAA8B,EAC3D;AAAA,IACC,kBAAkB,OAAO,YAA2C;AAClE,YAAM,SAAS,MAAM,OAAO,WAAW,QAAQ,eAAe;AAC9D,iBAAW,QAAQ,OAAO;AAAA,IAC5B,CAAC;AAAA,EACH;AAEF,MACG,QAAQ,MAAM,EACd,YAAY,sDAAsD,EAClE,SAAS,QAAQ,WAAW,EAC5B;AAAA,IACC,kBAAkB,OAAO,OAA2B;AAClD,YAAM,SAAS,MAAM,OAAO,UAAU,EAAE;AACxC,iBAAW,QAAQ,MAAM;AAAA,IAC3B,CAAC;AAAA,EACH;AAEF,MACG,QAAQ,UAAU,EAClB,YAAY,sBAAsB,EAClC,SAAS,QAAQ,WAAW,EAC5B;AAAA,IACC,kBAAkB,OAAO,OAA2B;AAClD,YAAM,WAAW,MAAM,OAAO,kBAAkB,EAAE;AAClD,iBAAW,QAAQ;AAAA,IACrB,CAAC;AAAA,EACH;AAEF,MACG,QAAQ,aAAa,EACrB,YAAY,iCAAiC,EAC7C,SAAS,QAAQ,WAAW,EAC5B;AAAA,IACC,kBAAkB,OAAO,OAAe;AACtC,YAAM,SAAS,MAAM,OAAO,WAAW;AACvC,YAAM,SAAS,QAAQ,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAEtD,UAAI,CAAC,QAAQ;AACX,cAAM,IAAI,aAAa,kBAAkB,EAAE,cAAc,GAAG;AAAA,MAC9D;AAEA,aAAO,iBAAiB,EAAE;AAC1B,iBAAW;AAAA,QACT,SAAS;AAAA,QACT,QAAQ,EAAE,IAAI,OAAO,IAAI,MAAM,OAAO,KAAK;AAAA,MAC7C,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAEF,SAAO;AACT;;;ACjEA,SAAS,WAAAC,gBAAe;;;ACAxB,OAAO,WAAW;AAGX,SAAS,UAAU,OAAuB;AAC/C,QAAM,IAAI,MAAM,KAAK;AACrB,MAAI,CAAC,EAAE,QAAQ,GAAG;AAChB,UAAM,IAAI,aAAa,iBAAiB,KAAK,IAAI,GAAG;AAAA,EACtD;AACA,SAAO,EAAE,OAAO,YAAY;AAC9B;AAEO,SAAS,YAAoB;AAClC,SAAO,MAAM,EAAE,OAAO,YAAY;AACpC;;;ADLO,SAAS,wBAAiC;AAC/C,QAAM,MAAM,IAAIC,SAAQ,UAAU,EAAE,YAAY,oBAAoB;AAEpE,MACG,QAAQ,MAAM,EACd,YAAY,mBAAmB,EAC/B,OAAO,qBAAqB,WAAW,EACvC;AAAA,IACC,kBAAkB,OAAO,YAA4B;AACnD,YAAM,SAAS,MAAM,OAAO,YAAY,QAAQ,MAAM;AACtD,iBAAW,QAAQ,QAAQ;AAAA,IAC7B,CAAC;AAAA,EACH;AAEF,MACG,QAAQ,MAAM,EACd,YAAY,sBAAsB,EAClC,SAAS,QAAQ,YAAY,EAC7B,OAAO,qBAAqB,WAAW,EACvC;AAAA,IACC,kBAAkB,OAAO,IAAY,YAA4B;AAC/D,YAAM,UAAU,MAAM,OAAO,WAAW,IAAI,QAAQ,MAAM;AAC1D,iBAAW,OAAO;AAAA,IACpB,CAAC;AAAA,EACH;AAEF,MACG,QAAQ,cAAc,EACtB,YAAY,+BAA+B,EAC3C,SAAS,QAAQ,YAAY,EAC7B,OAAO,qBAAqB,WAAW,EACvC,OAAO,kBAAkB,gCAAgC,EACzD,OAAO,iBAAiB,4BAA4B,EACpD;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC;AAAA,MACE,OACE,IACA,YAMG;AACH,cAAM,SAAS,MAAM,OAAO,yBAAyB,IAAI;AAAA,UACvD,UAAU,QAAQ;AAAA,UAClB,WAAW,QAAQ,QAAQ,UAAU,QAAQ,KAAK,IAAI;AAAA,UACtD,MAAM,QAAQ;AAAA,QAChB,CAAC;AACD,cAAM,eAAe,QAAQ,gBAAgB,CAAC;AAC9C,mBAAW,oBAAoB,cAAc,QAAQ,MAAM,CAAC;AAAA,MAC9D;AAAA,IACF;AAAA,EACF;AAEF,SAAO;AACT;;;AEpEA,SAAS,WAAAC,gBAAe;AASjB,SAAS,0BAAmC;AACjD,QAAM,MAAM,IAAIC,SAAQ,YAAY,EAAE,YAAY,qBAAqB;AAEvE,MACG,QAAQ,MAAM,EACd,YAAY,qBAAqB,EACjC,OAAO,qBAAqB,WAAW,EACvC,OAAO,6BAA6B,4BAA4B,QAAQ,EACxE;AAAA,IACC;AAAA,MACE,OAAO,YAA0E;AAC/E,cAAM,SAAS,MAAM,OAAO,cAAc,QAAQ,QAAQ,QAAQ,aAAa;AAC/E,mBAAW,QAAQ,eAAe;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AAEF,MACG,QAAQ,MAAM,EACd,YAAY,uBAAuB,EACnC,SAAS,QAAQ,aAAa,EAC9B,OAAO,qBAAqB,WAAW,EACvC;AAAA,IACC,kBAAkB,OAAO,IAAY,YAA4B;AAC/D,YAAM,WAAW,MAAM,OAAO,YAAY,IAAI,QAAQ,MAAM;AAC5D,iBAAW,QAAQ;AAAA,IACrB,CAAC;AAAA,EACH;AAEF,MACG,QAAQ,QAAQ,EAChB,YAAY,yBAAyB,EACrC,SAAS,QAAQ,aAAa,EAC9B,OAAO,iBAAiB,mBAAmB,EAC3C,OAAO,iBAAiB,2CAA2C,EACnE,OAAO,4BAA4B,oCAAoC,EACvE,OAAO,0BAA0B,mEAAmE,UAAU,EAC9G,OAAO,qBAAqB,WAAW,EACvC;AAAA,IACC;AAAA,MACE,OACE,IACA,YAOG;AACH,YAAI,QAAQ,SAAS,UAAa,QAAQ,SAAS,UAAa,QAAQ,oBAAoB,UAAa,QAAQ,eAAe,QAAW;AACzI,gBAAM,IAAI;AAAA,YACR;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAEA,YAAI,QAAQ,SAAS,UAAa,QAAQ,KAAK,KAAK,MAAM,IAAI;AAC5D,gBAAM,IAAI,aAAa,+CAA+C,GAAG;AAAA,QAC3E;AAEA,cAAM,aAKF,CAAC;AAEL,YAAI,QAAQ,SAAS,QAAW;AAC9B,qBAAW,OAAO,QAAQ,KAAK,KAAK;AAAA,QACtC;AACA,YAAI,QAAQ,SAAS,QAAW;AAC9B,qBAAW,OAAO,QAAQ,KAAK,KAAK,KAAK;AAAA,QAC3C;AACA,YAAI,QAAQ,oBAAoB,QAAW;AACzC,qBAAW,oBAAoB,QAAQ;AAAA,QACzC;AACA,YAAI,QAAQ,eAAe,QAAW;AACpC,qBAAW,cAAc,mBAAmB,QAAQ,UAAU;AAAA,QAChE;AAEA,cAAM,WAAW,MAAM,OAAO,eAAe,IAAI,EAAE,UAAU,WAAW,GAAG,QAAQ,MAAM;AACzF,mBAAW,QAAQ;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAEF,MACG,QAAQ,QAAQ,EAChB,YAAY,sEAAsE,EAClF,SAAS,QAAQ,aAAa,EAC9B,eAAe,mBAAmB,iCAAiC,EACnE,eAAe,qBAAqB,+CAA+C,UAAU,EAC7F,OAAO,qBAAqB,WAAW,EACvC;AAAA,IACC;AAAA,MACE,OACE,IACA,YAKG;AACH,YAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,gBAAM,IAAI,aAAa,iCAAiC,GAAG;AAAA,QAC7D;AAEA,cAAM,aAAa,mBAAmB,QAAQ,MAAM;AACpD,cAAM,WAAW,MAAM,OAAO;AAAA,UAC5B,UAAU,QAAQ,KAAK;AAAA,UACvB;AAAA,UACA,EAAE,UAAU,EAAE,UAAU,WAAW,EAAE;AAAA,UACrC,QAAQ;AAAA,QACV;AACA,mBAAW,QAAQ;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAEF,MACG,QAAQ,cAAc,EACtB,YAAY,gCAAgC,EAC5C,SAAS,QAAQ,aAAa,EAC9B,OAAO,qBAAqB,WAAW,EACvC,OAAO,kBAAkB,gCAAgC,EACzD,OAAO,iBAAiB,4BAA4B,EACpD,OAAO,6BAA6B,4BAA4B,QAAQ,EACxE;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC;AAAA,MACE,OACE,IACA,YAOG;AACH,cAAM,SAAS,MAAM,OAAO,0BAA0B,IAAI;AAAA,UACxD,UAAU,QAAQ;AAAA,UAClB,WAAW,QAAQ,QAAQ,UAAU,QAAQ,KAAK,IAAI;AAAA,UACtD,MAAM,QAAQ;AAAA,UACd,uBAAuB,QAAQ;AAAA,QACjC,CAAC;AACD,cAAM,eAAe,QAAQ,gBAAgB,CAAC;AAC9C,mBAAW,oBAAoB,cAAc,QAAQ,MAAM,CAAC;AAAA,MAC9D;AAAA,IACF;AAAA,EACF;AAEF,SAAO;AACT;;;ACtKA,SAAS,WAAAC,gBAAe;AAIxB,OAAOC,YAAW;;;ACKX,SAAS,0BAA0B,MAAmC;AAC3E,MAAI,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxB,UAAM,IAAI,aAAa,uCAAuC,GAAG;AAAA,EACnE;AAEA,SAAO,KAAK,IAAI,CAAC,MAAM,UAAU;AAC/B,QAAI,OAAO,SAAS,YAAY,SAAS,MAAM;AAC7C,YAAM,IAAI,aAAa,kBAAkB,KAAK,sBAAsB,GAAG;AAAA,IACzE;AAEA,UAAM,QAAQ;AAEd,QAAI,OAAO,MAAM,WAAW,UAAU;AACpC,YAAM,IAAI,aAAa,kBAAkB,KAAK,+BAA+B,GAAG;AAAA,IAClF;AAEA,WAAO;AAAA,MACL,QAAQ,MAAM;AAAA,MACd,aAAa,MAAM;AAAA,MACnB,MAAM,MAAM;AAAA,MACZ,UAAU,MAAM;AAAA,IAClB;AAAA,EACF,CAAC;AACH;AAiBA,IAAM,sBAAwD;AAAA,EAC5D;AAAA,EAAM;AAAA,EAAa;AAAA,EAAc;AAAA,EAAQ;AAAA,EACzC;AAAA,EAAY;AAAA,EAAc;AAAA,EAAe;AAAA,EACzC;AAAA,EAAW;AAAA,EAAY;AACzB;AAEO,SAAS,qBAAqB,MAAyC;AAC5E,MAAI,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxB,UAAM,IAAI,aAAa,kCAAkC,GAAG;AAAA,EAC9D;AAEA,SAAO,KAAK,IAAI,CAAC,MAAM,UAAU;AAC/B,QAAI,OAAO,SAAS,YAAY,SAAS,MAAM;AAC7C,YAAM,IAAI,aAAa,mBAAmB,KAAK,sBAAsB,GAAG;AAAA,IAC1E;AAEA,UAAM,SAAS;AAEf,QAAI,CAAC,OAAO,MAAM,CAAC,OAAO,WAAW;AACnC,YAAM,IAAI;AAAA,QACR,mBAAmB,KAAK;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAEA,UAAM,SAAkC,CAAC;AACzC,eAAW,SAAS,qBAAqB;AACvC,UAAI,OAAO,KAAK,MAAM,QAAW;AAC/B,eAAO,KAAK,IAAI,OAAO,KAAK;AAAA,MAC9B;AAAA,IACF;AACA,WAAO;AAAA,EACT,CAAC;AACH;AAEO,SAAS,gBAAgB,MAAwC;AACtE,MAAI,OAAO,SAAS,YAAY,SAAS,QAAQ,MAAM,QAAQ,IAAI,GAAG;AACpE,UAAM,IAAI,aAAa,8BAA8B,GAAG;AAAA,EAC1D;AACA,SAAO;AACT;;;ADtEA,eAAe,kBAAkB,SAQ9B;AACD,QAAM,SAAS;AAAA,IACb,UAAU,QAAQ;AAAA,IAClB,WAAW,QAAQ,QAAQ,UAAU,QAAQ,KAAK,IAAI;AAAA,IACtD,MAAM,QAAQ;AAAA,IACd,uBAAuB,QAAQ;AAAA,EACjC;AAEA,MAAI,QAAQ,QAAS,QAAO,OAAO,yBAAyB,QAAQ,SAAS,MAAM;AACnF,MAAI,QAAQ,SAAU,QAAO,OAAO,0BAA0B,QAAQ,UAAU,MAAM;AACtF,MAAI,QAAQ,MAAO,QAAO,OAAO,uBAAuB,QAAQ,OAAO,MAAM;AAC7E,SAAO,OAAO,gBAAgB,MAAM;AACtC;AAcA,SAAS,qBAAqB,SAAsD;AAClF,MAAI,CAAC,QAAQ,SAAS;AACpB,UAAM,IAAI,aAAa,iDAAiD,GAAG;AAAA,EAC7E;AACA,MAAI,QAAQ,WAAW,QAAW;AAChC,UAAM,IAAI,aAAa,gDAAgD,GAAG;AAAA,EAC5E;AAEA,SAAO;AAAA,IACL,YAAY,QAAQ;AAAA,IACpB,MAAM,QAAQ,OAAO,UAAU,QAAQ,IAAI,IAAI,UAAU;AAAA,IACzD,QAAQ,mBAAmB,QAAQ,MAAM;AAAA,IACzC,YAAY,QAAQ;AAAA,IACpB,UAAU,QAAQ;AAAA,IAClB,aAAa,QAAQ;AAAA,IACrB,MAAM,QAAQ;AAAA,IACd,SAAS,QAAQ;AAAA,IACjB,UAAU,QAAQ;AAAA,EACpB;AACF;AAEO,SAAS,4BAAqC;AACnD,QAAM,MAAM,IAAIC,SAAQ,cAAc,EAAE,YAAY,wBAAwB;AAE5E,MACG,QAAQ,MAAM,EACd,YAAY,mBAAmB,EAC/B,OAAO,qBAAqB,WAAW,EACvC,OAAO,kBAAkB,sBAAsB,EAC/C,OAAO,mBAAmB,uBAAuB,EACjD,OAAO,gBAAgB,oBAAoB,EAC3C,OAAO,kBAAkB,gCAAgC,EACzD,OAAO,kBAAkB,gCAAgC,EACzD,OAAO,iBAAiB,4BAA4B,EACpD,OAAO,sBAAsB,0CAA0C,EACvE;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,OAAO,yBAAyB,kDAAkD,UAAU,EAC5F,OAAO,yBAAyB,mDAAmD,UAAU,EAC7F;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,OAAO,6BAA6B,0FAA0F,QAAQ,EACtI,OAAO,oBAAoB,4CAA4C,QAAQ,EAC/E;AAAA,IACC;AAAA,MACE,OACE,YAgBG;AACH,cAAM,SAAS,MAAM,kBAAkB,OAAO;AAC9C,cAAM,eAAe,QAAQ,gBAAgB,CAAC;AAE9C,YAAI,WAAW,wBAAwB,cAAmC;AAAA,UACxE,OAAO,QAAQ,QAAQ,UAAU,QAAQ,KAAK,IAAI;AAAA,UAClD,UAAU,QAAQ;AAAA,UAClB,QAAQ,QAAQ;AAAA,UAChB,WAAW,QAAQ;AAAA,UACnB,WAAW,QAAQ;AAAA,QACrB,CAAC;AAED,YAAI,QAAQ,SAAS,QAAQ,QAAQ,GAAG;AACtC,qBAAW,SAAS,MAAM,GAAG,QAAQ,KAAK;AAAA,QAC5C;AAEA,cAAM,WAAW,oBAAoB,UAAU,QAAQ,MAAM;AAE7D,YAAI,QAAQ,kBAAkB,QAAW;AACvC,qBAAW,EAAE,cAAc,UAAU,kBAAkB,QAAQ,iBAAiB,CAAC;AAAA,QACnF,OAAO;AACL,qBAAW,QAAQ;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEF,MACG,QAAQ,MAAM,EACd,YAAY,yBAAyB,EACrC,SAAS,QAAQ,gBAAgB,EACjC,OAAO,qBAAqB,WAAW,EACvC;AAAA,IACC,kBAAkB,OAAO,IAAY,YAA4B;AAC/D,YAAM,cAAc,MAAM,OAAO,eAAe,IAAI,QAAQ,MAAM;AAClE,iBAAW,WAAW;AAAA,IACxB,CAAC;AAAA,EACH;AAEF,MACG,QAAQ,QAAQ,EAChB,YAAY,oBAAoB,EAChC,OAAO,qBAAqB,WAAW,EACvC,OAAO,kBAAkB,YAAY,EACrC,OAAO,iBAAiB,kBAAkB,EAC1C,OAAO,qBAAqB,0CAA0C,UAAU,EAChF,OAAO,uBAAuB,YAAY,EAC1C,OAAO,mBAAmB,UAAU,EACpC,OAAO,sBAAsB,aAAa,EAC1C,OAAO,iBAAiB,MAAM,EAC9B,OAAO,sBAAsB,iDAAiD,EAC9E,OAAO,cAAc,kBAAkB,EACvC;AAAA,IACC;AAAA,MACE,OACE,YAYG;AACH,cAAM,kBAAkB,qBAAqB,OAAO;AACpD,cAAM,cAAc,MAAM,OAAO;AAAA,UAC/B,EAAE,aAAa,gBAAgB;AAAA,UAC/B,QAAQ;AAAA,QACV;AACA,mBAAW,WAAW;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAEF,MACG,QAAQ,QAAQ,EAChB,YAAY,oBAAoB,EAChC,SAAS,QAAQ,gBAAgB,EACjC,OAAO,qBAAqB,WAAW,EACvC,OAAO,kBAAkB,YAAY,EACrC,OAAO,iBAAiB,kBAAkB,EAC1C,OAAO,qBAAqB,4BAA4B,UAAU,EAClE,OAAO,uBAAuB,YAAY,EAC1C,OAAO,mBAAmB,UAAU,EACpC,OAAO,sBAAsB,aAAa,EAC1C,OAAO,iBAAiB,MAAM,EAC9B,OAAO,sBAAsB,gBAAgB,EAC7C,OAAO,cAAc,kBAAkB,EACvC;AAAA,IACC;AAAA,MACE,OAAO,IAAY,YAAuE;AACxF,cAAM,kBAAkB,kBAAkB,SAAS;AAAA,UACjD,SAAS;AAAA,UACT,MAAM;AAAA,UACN,WAAW;AAAA,UACX,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,MAAM;AAAA,UACN,SAAS;AAAA,UACT,UAAU;AAAA,QACZ,CAAC;AAED,YAAI,QAAQ,WAAW,QAAW;AAChC,0BAAgB,SAAS,mBAAmB,QAAQ,MAAM;AAAA,QAC5D;AAEA,cAAM,cAAc,MAAM,OAAO;AAAA,UAC/B;AAAA,UACA,EAAE,aAAa,gBAAgB;AAAA,UAC/B,QAAQ;AAAA,QACV;AACA,mBAAW,WAAW;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAEF,MACG,QAAQ,QAAQ,EAChB,YAAY,oBAAoB,EAChC,SAAS,QAAQ,gBAAgB,EACjC,OAAO,qBAAqB,WAAW,EACvC,OAAO,aAAa,mBAAmB,EACvC;AAAA,IACC;AAAA,MACE,OAAO,IAAY,YAAiE;AAClF,4BAAoB,eAAe,QAAQ,GAAG;AAC9C,cAAM,cAAc,MAAM,OAAO,kBAAkB,IAAI,QAAQ,MAAM;AACrE,mBAAW,EAAE,SAAS,uBAAuB,YAAY,CAAC;AAAA,MAC5D;AAAA,IACF;AAAA,EACF;AAEF,MACG,QAAQ,QAAQ,EAChB,YAAY,qBAAqB,EACjC,OAAO,qBAAqB,WAAW,EACvC;AAAA,IACC,kBAAkB,OAAO,YAA4B;AACnD,YAAM,iBAAiB,MAAM,OAAO,mBAAmB,QAAQ,MAAM;AACrE,iBAAW,EAAE,iBAAiB,eAAe,CAAC;AAAA,IAChD,CAAC;AAAA,EACH;AAEF,MACG,QAAQ,OAAO,EACf;AAAA,IACC;AAAA,EACF,EACC,SAAS,QAAQ,gBAAgB,EACjC;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,OAAO,qBAAqB,WAAW,EACvC,OAAO,eAAe,uEAAuE,EAC7F;AAAA,IACC;AAAA,MACE,OACE,IACA,YACG;AACH,YAAI;AACJ,YAAI;AACF,yBAAe,KAAK,MAAM,QAAQ,MAAM;AAAA,QAC1C,QAAQ;AACN,gBAAM,IAAI,aAAa,sCAAsC,GAAG;AAAA,QAClE;AAEA,cAAM,SAAS,0BAA0B,YAAY;AAErD,cAAM,qBAAqB,OAAO,IAAI,CAAC,WAAW;AAAA,UAChD,GAAG;AAAA,UACH,QAAQ,mBAAmB,MAAM,MAAM;AAAA,QACzC,EAAE;AAEF,cAAM,sBAAsB,MAAM,OAAO,eAAe,IAAI,QAAQ,MAAM;AAC1E,cAAM,iBACJ,oBAAoB,mBAAmB,oBAAoB,gBAAgB,SAAS;AAEtF,YAAI,kBAAkB,CAAC,QAAQ,OAAO;AACpC,gBAAM,IAAI;AAAA,YACR;AAAA,YAEA;AAAA,UACF;AAAA,QACF;AAEA,YAAI,gBAAgB;AAClB,gBAAM,OAAO,kBAAkB,IAAI,QAAQ,MAAM;AAEjD,gBAAM,uBAAuB,MAAM,OAAO;AAAA,YACxC;AAAA,cACE,aAAa;AAAA,gBACX,YAAY,oBAAoB;AAAA,gBAChC,MAAM,oBAAoB;AAAA,gBAC1B,QAAQ,oBAAoB;AAAA,gBAC5B,UAAU,oBAAoB;AAAA,gBAC9B,YAAY,oBAAoB;AAAA,gBAChC,aAAa;AAAA,gBACb,MAAM,oBAAoB;AAAA,gBAC1B,SAAS,oBAAoB;AAAA,gBAC7B,UAAU,oBAAoB;AAAA,gBAC9B,YAAY,oBAAoB;AAAA,gBAChC,iBAAiB;AAAA,cACnB;AAAA,YACF;AAAA,YACA,QAAQ;AAAA,UACV;AACA,qBAAW,oBAAoB;AAAA,QACjC,OAAO;AACL,gBAAM,cAAc,MAAM,OAAO;AAAA,YAC/B;AAAA,YACA;AAAA,cACE,aAAa;AAAA,gBACX,aAAa;AAAA,gBACb,iBAAiB;AAAA,cACnB;AAAA,YACF;AAAA,YACA,QAAQ;AAAA,UACV;AACA,qBAAW,WAAW;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEF,MACG,QAAQ,cAAc,EACtB;AAAA,IACC;AAAA,EACF,EACC;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,OAAO,qBAAqB,WAAW,EACvC;AAAA,IACC;AAAA,MACE,OAAO,YAAwE;AAC7E,YAAI;AACJ,YAAI;AACF,mBAAS,KAAK,MAAM,QAAQ,YAAY;AAAA,QAC1C,QAAQ;AACN,gBAAM,IAAI,aAAa,4CAA4C,GAAG;AAAA,QACxE;AAEA,cAAM,UAAU,qBAAqB,MAAM;AAE3C,cAAM,2BAA2B,QAAQ,IAAI,CAAC,YAAY;AAAA,UACxD,GAAG;AAAA,UACH,GAAI,OAAO,WAAW,SAClB,EAAE,QAAQ,mBAAmB,OAAO,MAAM,EAAE,IAC5C,CAAC;AAAA,QACP,EAAE;AAEF,cAAM,SAAS,MAAM,OAAO;AAAA,UAC1B,EAAE,cAAc,yBAA4F;AAAA,UAC5G,QAAQ;AAAA,QACV;AACA,mBAAW,MAAM;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAEF,MACG,QAAQ,QAAQ,EAChB,YAAY,qBAAqB,EACjC,OAAO,qBAAqB,WAAW,EACvC,OAAO,iBAAiB,sBAAsB,EAC9C,OAAO,uBAAuB,sBAAsB,EACpD,OAAO,qBAAqB,6CAA6C,UAAU,EACnF,OAAO,kBAAkB,gCAAgC,EACzD,OAAO,kBAAkB,gCAAgC,EACzD,OAAO,sBAAsB,0CAA0C,EACvE;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,OAAO,qBAAqB,2CAA2C,EACvE;AAAA,IACC;AAAA,MACE,OACE,YAWG;AACH,YAAI,CAAC,QAAQ,QAAQ,CAAC,QAAQ,aAAa,QAAQ,WAAW,QAAW;AACvE,gBAAM,IAAI;AAAA,YACR;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAEA,cAAM,SAAS;AAAA,UACb,UAAU,QAAQ;AAAA,UAClB,WAAW,QAAQ,QAAQ,UAAU,QAAQ,KAAK,IAAI;AAAA,QACxD;AAEA,cAAM,SAAS,MAAM,OAAO,gBAAgB,MAAM;AAClD,YAAI,eAAe,QAAQ,gBAAgB,CAAC;AAE5C,YAAI,QAAQ,MAAM;AAChB,gBAAM,aAAa,QAAQ,KAAK,YAAY;AAC5C,yBAAe,aAAa,OAAO,CAAC,MAAM,EAAE,MAAM,YAAY,EAAE,SAAS,UAAU,CAAC;AAAA,QACtF;AAEA,YAAI,QAAQ,WAAW;AACrB,gBAAM,aAAa,QAAQ,UAAU,YAAY;AACjD,yBAAe,aAAa;AAAA,YAAO,CAAC,MAClC,EAAE,YAAY,YAAY,EAAE,SAAS,UAAU;AAAA,UACjD;AAAA,QACF;AAEA,YAAI,QAAQ,WAAW,QAAW;AAChC,gBAAM,mBAAmB,mBAAmB,QAAQ,MAAM;AAC1D,yBAAe,aAAa,OAAO,CAAC,MAAM,EAAE,WAAW,gBAAgB;AAAA,QACzE;AAEA,uBAAe,wBAAwB,cAAc;AAAA,UACnD,OAAO,QAAQ,QAAQ,UAAU,QAAQ,KAAK,IAAI;AAAA,UAClD,UAAU,QAAQ;AAAA,UAClB,QAAQ,QAAQ;AAAA,QAClB,CAAC;AAED,cAAM,uBAAuB,oBAAoB,cAAc,QAAQ,MAAM;AAE7E,mBAAW,oBAAoB;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAEF,MACG,QAAQ,SAAS,EACjB,YAAY,6EAA6E,EACzF,OAAO,qBAAqB,WAAW,EACvC,OAAO,kBAAkB,sBAAsB,EAC/C,OAAO,mBAAmB,uBAAuB,EACjD,OAAO,gBAAgB,oBAAoB,EAC3C,OAAO,kBAAkB,gCAAgC,EACzD,OAAO,kBAAkB,gCAAgC,EACzD,OAAO,iBAAiB,4BAA4B,EACpD,OAAO,sBAAsB,0CAA0C,EACvE;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,OAAO,yBAAyB,oCAAoC,UAAU,EAC9E,OAAO,yBAAyB,oCAAoC,UAAU,EAC9E,OAAO,kBAAkB,oDAAoD,QAAQ,EACrF;AAAA,IACC;AAAA,MACE,OACE,YAcG;AACH,cAAM,SAAS,MAAM,kBAAkB,OAAO;AAC9C,cAAM,eAAe,QAAQ,gBAAgB,CAAC;AAE9C,cAAM,WAAW,wBAAwB,cAAmC;AAAA,UAC1E,OAAO,QAAQ,QAAQ,UAAU,QAAQ,KAAK,IAAI;AAAA,UAClD,UAAU,QAAQ;AAAA,UAClB,QAAQ,QAAQ;AAAA,UAChB,WAAW,QAAQ;AAAA,UACnB,WAAW,QAAQ;AAAA,QACrB,CAAC;AAED,cAAM,UAAU;AAAA,UACd;AAAA,UACA,QAAQ,MAAM,EAAE,KAAK,QAAQ,IAAI,IAAI;AAAA,QACvC;AACA,mBAAW,OAAO;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AAEF,MACG,QAAQ,gBAAgB,EACxB,YAAY,mEAAmE,EAC/E,SAAS,QAAQ,gBAAgB,EACjC,OAAO,qBAAqB,WAAW,EACvC,OAAO,mBAAmB,gDAAgD,QAAQ,EAClF,OAAO,kBAAkB,uEAAuE,EAChG;AAAA,IACC;AAAA,MACE,OACE,IACA,YAKG;AACH,cAAM,UAAU,QAAQ,QAAQ;AAChC,cAAM,SAAS,MAAM,OAAO,eAAe,IAAI,QAAQ,MAAM;AAE7D,cAAM,YAAY,QAAQ,QACtB,UAAU,QAAQ,KAAK,IACvBC,OAAM,OAAO,IAAI,EAAE,SAAS,SAAS,KAAK,EAAE,OAAO,YAAY;AAEnE,cAAM,SAAS,MAAM,OAAO,gBAAgB;AAAA,UAC1C,UAAU,QAAQ;AAAA,UAClB;AAAA,QACF,CAAC;AAED,cAAM,kBAAkB,QAAQ,gBAAgB,CAAC;AACjD,cAAM,aAAa;AAAA,UACjB;AAAA,UACA;AAAA,UACA,EAAE,QAAQ;AAAA,QACZ;AAEA,mBAAW,EAAE,QAAQ,WAAW,CAAC;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAEF,SAAO;AACT;;;AEhjBA,SAAS,WAAAC,gBAAe;AAMjB,SAAS,yBAAkC;AAChD,QAAM,MAAM,IAAIC,SAAQ,WAAW,EAAE,YAAY,kCAAkC;AAEnF,MACG,QAAQ,MAAM,EACd,YAAY,iCAAiC,EAC7C,OAAO,qBAAqB,WAAW,EACvC,OAAO,6BAA6B,4BAA4B,QAAQ,EACxE;AAAA,IACC;AAAA,MACE,OAAO,YAA0E;AAC/E,cAAM,SAAS,MAAM,OAAO;AAAA,UAC1B,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV;AACA,mBAAW,QAAQ,sBAAsB;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AAEF,MACG,QAAQ,MAAM,EACd,YAAY,4BAA4B,EACxC,SAAS,QAAQ,0BAA0B,EAC3C,OAAO,qBAAqB,WAAW,EACvC;AAAA,IACC,kBAAkB,OAAO,IAAY,YAA4B;AAC/D,YAAM,uBAAuB,MAAM,OAAO,wBAAwB,IAAI,QAAQ,MAAM;AACpF,iBAAW,oBAAoB;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,MACG,QAAQ,QAAQ,EAChB,YAAY,8BAA8B,EAC1C,SAAS,QAAQ,0BAA0B,EAC3C,OAAO,qBAAqB,WAAW,EACvC,OAAO,aAAa,mBAAmB,EACvC;AAAA,IACC;AAAA,MACE,OAAO,IAAY,YAAiE;AAClF,4BAAoB,yBAAyB,QAAQ,GAAG;AACxD,cAAM,uBAAuB,MAAM,OAAO,2BAA2B,IAAI,QAAQ,MAAM;AACvF,mBAAW;AAAA,UACT,SAAS;AAAA,UACT,uBAAuB;AAAA,QACzB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEF,SAAO;AACT;;;AC1DA,SAAS,WAAAC,gBAAe;AASjB,SAAS,sBAA+B;AAC7C,QAAM,MAAM,IAAIC,SAAQ,QAAQ,EAAE,YAAY,kBAAkB;AAEhE,MACG,QAAQ,MAAM,EACd,YAAY,iBAAiB,EAC7B,OAAO,qBAAqB,WAAW,EACvC,OAAO,6BAA6B,4BAA4B,QAAQ,EACxE;AAAA,IACC;AAAA,MACE,OAAO,YAA0E;AAC/E,cAAM,SAAS,MAAM,OAAO,UAAU,QAAQ,QAAQ,QAAQ,aAAa;AAC3E,mBAAW,QAAQ,MAAM;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAEF,MACG,QAAQ,MAAM,EACd,YAAY,oBAAoB,EAChC,SAAS,QAAQ,UAAU,EAC3B,OAAO,qBAAqB,WAAW,EACvC;AAAA,IACC,kBAAkB,OAAO,IAAY,YAA4B;AAC/D,YAAM,QAAQ,MAAM,OAAO,SAAS,IAAI,QAAQ,MAAM;AACtD,iBAAW,KAAK;AAAA,IAClB,CAAC;AAAA,EACH;AAEF,MACG,QAAQ,QAAQ,EAChB,YAAY,cAAc,EAC1B,SAAS,QAAQ,UAAU,EAC3B,eAAe,iBAAiB,gBAAgB,EAChD,OAAO,qBAAqB,WAAW,EACvC;AAAA,IACC;AAAA,MACE,OAAO,IAAY,YAAgE;AACjF,YAAI,CAAC,QAAQ,MAAM,KAAK,GAAG;AACzB,gBAAM,IAAI,aAAa,wBAAwB,GAAG;AAAA,QACpD;AAEA,cAAM,QAAQ,MAAM,OAAO;AAAA,UACzB;AAAA,UACA,EAAE,OAAO,EAAE,MAAM,QAAQ,KAAK,EAAE;AAAA,UAChC,QAAQ;AAAA,QACV;AACA,mBAAW,KAAK;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAEF,MACG,QAAQ,WAAW,EACnB,YAAY,0BAA0B,EACtC,SAAS,QAAQ,UAAU,EAC3B,OAAO,qBAAqB,WAAW,EACvC;AAAA,IACC,kBAAkB,OAAO,IAAY,YAA4B;AAC/D,YAAM,YAAY,MAAM,OAAO,yBAAyB,IAAI,QAAQ,MAAM;AAC1E,iBAAW,SAAS;AAAA,IACtB,CAAC;AAAA,EACH;AAEF,MACG,QAAQ,cAAc,EACtB,YAAY,6BAA6B,EACzC,SAAS,QAAQ,UAAU,EAC3B,OAAO,qBAAqB,WAAW,EACvC,OAAO,kBAAkB,gCAAgC,EACzD,OAAO,iBAAiB,4BAA4B,EACpD,OAAO,6BAA6B,4BAA4B,QAAQ,EACxE;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC;AAAA,MACE,OACE,IACA,YAOG;AACH,cAAM,SAAS,MAAM,OAAO,uBAAuB,IAAI;AAAA,UACrD,UAAU,QAAQ;AAAA,UAClB,WAAW,QAAQ,QAAQ,UAAU,QAAQ,KAAK,IAAI;AAAA,UACtD,MAAM,QAAQ;AAAA,UACd,uBAAuB,QAAQ;AAAA,QACjC,CAAC;AACD,cAAM,eAAe,QAAQ,gBAAgB,CAAC;AAC9C,mBAAW,oBAAoB,cAAc,QAAQ,MAAM,CAAC;AAAA,MAC9D;AAAA,IACF;AAAA,EACF;AAEF,SAAO;AACT;;;AC9GA,SAAS,WAAAC,gBAAe;AAOjB,SAAS,sBAA+B;AAC7C,QAAM,MAAM,IAAIC,SAAQ,QAAQ,EAAE,YAAY,2BAA2B;AAEzE,MACG,QAAQ,MAAM,EACd,YAAY,wBAAwB,EACpC,OAAO,qBAAqB,WAAW,EACvC,OAAO,6BAA6B,4BAA4B,QAAQ,EACxE;AAAA,IACC;AAAA,MACE,OAAO,YAA0E;AAC/E,cAAM,SAAS,MAAM,OAAO,gBAAgB,QAAQ,QAAQ,QAAQ,aAAa;AACjF,mBAAW,QAAQ,MAAM;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAEF,MACG,QAAQ,MAAM,EACd,YAAY,6BAA6B,EACzC,SAAS,WAAW,iCAAiC,EACrD,OAAO,qBAAqB,WAAW,EACvC;AAAA,IACC,kBAAkB,OAAO,OAAe,YAA4B;AAClE,YAAM,YAAY,MAAM,OAAO,eAAe,UAAU,KAAK,GAAG,QAAQ,MAAM;AAC9E,iBAAW,SAAS;AAAA,IACtB,CAAC;AAAA,EACH;AAEF,SAAO;AACT;;;ACrCA,SAAS,WAAAC,iBAAe;AAQxB,IAAM,qBAAqB,CAAC,OAAO,QAAQ,OAAO,SAAS,QAAQ;AAE5D,SAAS,mBAA4B;AAC1C,QAAM,MAAM,IAAIC,UAAQ,KAAK,EAAE,YAAY,gBAAgB;AAE3D,MACG,SAAS,YAAY,6CAA6C,EAClE,SAAS,UAAU,gEAAgE,EACnF,OAAO,qBAAqB,iDAAiD,EAC7E,OAAO,iBAAiB,uCAAuC,EAC/D,YAAY,4BAA4B,EACxC;AAAA,IACC;AAAA,MACE,OACE,QACA,MACA,YACG;AACH,cAAM,cAAc,OAAO,YAAY;AAEvC,YAAI,CAAC,mBAAmB,SAAS,WAAW,GAAG;AAC7C,gBAAM,IAAI;AAAA,YACR,wBAAwB,MAAM,qBAAqB,mBAAmB,KAAK,IAAI,CAAC;AAAA,YAChF;AAAA,UACF;AAAA,QACF;AAEA,YAAI;AACJ,YAAI,QAAQ,MAAM;AAChB,cAAI;AACJ,cAAI;AACF,yBAAa,KAAK,MAAM,QAAQ,IAAI;AAAA,UACtC,QAAQ;AACN,kBAAM,IAAI,aAAa,oCAAoC,GAAG;AAAA,UAChE;AACA,iBAAO,gBAAgB,UAAU;AAAA,QACnC;AAEA,cAAM,SAAS,MAAM,OAAO,WAAW,aAAa,MAAM,MAAM,QAAQ,MAAM;AAC9E,mBAAW,MAAM;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAEF,SAAO;AACT;;;ACrDA,SAAS,WAAAC,iBAAe;;;ACAxB,SAAS,iBAAiB;AAC1B,SAAS,4BAA4B;AACrC,SAAS,SAAS;AAKlB,IAAM,eAAe;AAAA,EACnB,EAAE,MAAM,gBAAgB,aAAa,uCAAuC;AAAA,EAC5E,EAAE,MAAM,cAAc,aAAa,mDAAmD;AAAA,EACtF,EAAE,MAAM,uBAAuB,aAAa,2DAA2D;AAAA,EACvG,EAAE,MAAM,iBAAiB,aAAa,gCAAgC;AAAA,EACtE,EAAE,MAAM,eAAe,aAAa,oDAAoD;AAAA,EACxF,EAAE,MAAM,mBAAmB,aAAa,sDAAsD;AAAA,EAC9F,EAAE,MAAM,gBAAgB,aAAa,qDAAqD;AAAA,EAC1F,EAAE,MAAM,mBAAmB,aAAa,oDAAoD;AAAA,EAC5F,EAAE,MAAM,yBAAyB,aAAa,6DAA6D;AAAA,EAC3G,EAAE,MAAM,qBAAqB,aAAa,4CAA4C;AAAA,EACtF,EAAE,MAAM,mBAAmB,aAAa,wDAAwD;AAAA,EAChG,EAAE,MAAM,sBAAsB,aAAa,2BAA2B;AAAA,EACtE,EAAE,MAAM,sBAAsB,aAAa,iCAAiC;AAAA,EAC5E,EAAE,MAAM,sBAAsB,aAAa,uBAAuB;AAAA,EAClE,EAAE,MAAM,uBAAuB,aAAa,6CAA6C;AAAA,EACzF,EAAE,MAAM,6BAA6B,aAAa,oDAAoD;AAAA,EACtG,EAAE,MAAM,0BAA0B,aAAa,uEAAuE;AAAA,EACtH,EAAE,MAAM,4BAA4B,aAAa,oEAAoE;AAAA,EACrH,EAAE,MAAM,gCAAgC,aAAa,2CAA2C;AAAA,EAChG,EAAE,MAAM,iCAAiC,aAAa,4CAA4C;AAAA,EAClG,EAAE,MAAM,8BAA8B,aAAa,yCAAyC;AAAA,EAC5F,EAAE,MAAM,eAAe,aAAa,8BAA8B;AAAA,EAClE,EAAE,MAAM,gBAAgB,aAAa,iBAAiB;AAAA,EACtD,EAAE,MAAM,wBAAwB,aAAa,sCAAsC;AAAA,EACnF,EAAE,MAAM,sBAAsB,aAAa,yBAAyB;AAAA,EACpE,EAAE,MAAM,oBAAoB,aAAa,0CAA0C;AAAA,EACnF,EAAE,MAAM,+BAA+B,aAAa,8CAA8C;AAAA,EAClG,EAAE,MAAM,6BAA6B,aAAa,qCAAqC;AAAA,EACvF,EAAE,MAAM,gCAAgC,aAAa,iCAAiC;AAAA,EACtF,EAAE,MAAM,gBAAgB,aAAa,8BAA8B;AAAA,EACnE,EAAE,MAAM,YAAY,aAAa,+CAA+C;AAAA,EAChF,EAAE,MAAM,cAAc,aAAa,6CAA6C;AAClF;AAEA,IAAM,SAAS,IAAI,UAAU;AAAA,EAC3B,MAAM;AAAA,EACN,SAAS;AACX,CAAC;AAED,SAAS,aAAa,MAAe;AACnC,SAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,MAAM,MAAM,CAAC,EAAE,CAAC,EAAE;AACrF;AAEA,SAAS,iBAAiB,MAAe;AACvC,SAAO,aAAa,2BAA2B,IAAI,CAAC;AACtD;AAEA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA,EAAE,iBAAiB,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,yBAAyB,EAAE;AAAA,EAC9E,OAAO,EAAE,gBAAgB,MAAM,iBAAiB,MAAM,OAAO,WAAW,eAAe,CAAC;AAC1F;AAEA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2CAA2C,EAAE;AAAA,EACxF,OAAO,EAAE,SAAS,MAAM,iBAAiB,MAAM,OAAO,UAAU,QAAQ,CAAC;AAC3E;AAEA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2CAA2C,EAAE;AAAA,EACxF,OAAO,EAAE,SAAS,MAAM,aAAa,MAAM,OAAO,kBAAkB,QAAQ,CAAC;AAC/E;AAEA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2CAA2C,EAAE;AAAA,EACxF,OAAO,EAAE,SAAS,MAAM,iBAAiB,MAAM,OAAO,YAAY,QAAQ,CAAC;AAC7E;AAEA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,IACE,WAAW,EAAE,OAAO,EAAE,SAAS,YAAY;AAAA,IAC3C,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2CAA2C;AAAA,EACtF;AAAA,EACA,OAAO,EAAE,WAAW,SAAS,MAAM,iBAAiB,MAAM,OAAO,WAAW,WAAW,QAAQ,CAAC;AAClG;AAEA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2CAA2C,EAAE;AAAA,EACxF,OAAO,EAAE,SAAS,MAAM,iBAAiB,MAAM,OAAO,cAAc,QAAQ,CAAC;AAC/E;AAEA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,IACE,YAAY,EAAE,OAAO,EAAE,SAAS,aAAa;AAAA,IAC7C,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2CAA2C;AAAA,EACtF;AAAA,EACA,OAAO,EAAE,YAAY,SAAS,MAAM,iBAAiB,MAAM,OAAO,YAAY,YAAY,QAAQ,CAAC;AACrG;AAEA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,IACE,YAAY,EAAE,OAAO,EAAE,SAAS,aAAa;AAAA,IAC7C,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,mBAAmB;AAAA,IACxD,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2CAA2C;AAAA,IAChF,iBAAiB,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,oCAAoC;AAAA,IACpF,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,iEAAiE;AAAA,IAC5G,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2CAA2C;AAAA,EACtF;AAAA,EACA,OAAO,EAAE,YAAY,MAAM,MAAM,iBAAiB,YAAY,SAAS,MAAM;AAC3E,UAAM,aAAsC,CAAC;AAC7C,QAAI,SAAS,OAAW,YAAW,OAAO,KAAK,KAAK;AACpD,QAAI,SAAS,OAAW,YAAW,OAAO,KAAK,KAAK,KAAK;AACzD,QAAI,oBAAoB,OAAW,YAAW,oBAAoB;AAClE,QAAI,eAAe,OAAW,YAAW,cAAc,mBAAmB,UAAU;AACpF,WAAO,iBAAiB,MAAM,OAAO,eAAe,YAAY,EAAE,UAAU,WAAW,GAAG,QAAQ,CAAC;AAAA,EACrG;AACF;AAEA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,IACE,YAAY,EAAE,OAAO,EAAE,SAAS,aAAa;AAAA,IAC7C,OAAO,EAAE,OAAO,EAAE,SAAS,2CAA2C;AAAA,IACtE,UAAU,EAAE,OAAO,EAAE,SAAS,4BAA4B;AAAA,IAC1D,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2CAA2C;AAAA,EACtF;AAAA,EACA,OAAO,EAAE,YAAY,OAAO,UAAU,SAAS,MAC7C;AAAA,IACE,MAAM,OAAO,oBAAoB,OAAO,YAAY,EAAE,UAAU,EAAE,UAAU,mBAAmB,QAAQ,EAAE,EAAE,GAAG,QAAQ;AAAA,EACxH;AACJ;AAEA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,IACE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2CAA2C;AAAA,IACpF,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,6DAA6D;AAAA,IACvG,MAAM,EAAE,KAAK,CAAC,iBAAiB,YAAY,CAAC,EAAE,SAAS,EAAE,SAAS,4BAA4B;AAAA,IAC9F,uBAAuB,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,sHAAsH;AAAA,IAC5K,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,0CAA0C;AAAA,IAChF,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,uEAAuE;AAAA,EAChH;AAAA,EACA,OAAO,EAAE,UAAU,WAAW,MAAM,uBAAuB,OAAO,OAAO,MAAM;AAC7E,UAAM,SAAS,MAAM,OAAO,gBAAgB,EAAE,UAAU,WAAW,MAAM,sBAAsB,CAAC;AAChG,QAAI,eAAe,QAAQ,gBAAgB,CAAC;AAC5C,QAAI,SAAS,QAAQ,EAAG,gBAAe,aAAa,MAAM,GAAG,KAAK;AAClE,UAAM,WAAW,SAAS,oBAAoB,cAAc,MAAM,IAAI;AACtE,WAAO,iBAAiB,EAAE,cAAc,UAAU,kBAAkB,QAAQ,iBAAiB,CAAC;AAAA,EAChG;AACF;AAEA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,IACE,eAAe,EAAE,OAAO,EAAE,SAAS,gBAAgB;AAAA,IACnD,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2CAA2C;AAAA,EACtF;AAAA,EACA,OAAO,EAAE,eAAe,SAAS,MAAM,iBAAiB,MAAM,OAAO,eAAe,eAAe,QAAQ,CAAC;AAC9G;AAEA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,IACE,WAAW,EAAE,OAAO,EAAE,SAAS,YAAY;AAAA,IAC3C,MAAM,EAAE,OAAO,EAAE,SAAS,+BAA+B;AAAA,IACzD,QAAQ,EAAE,OAAO,EAAE,SAAS,+DAA+D;AAAA,IAC3F,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,6CAA6C;AAAA,IACvF,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,UAAU;AAAA,IAClD,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,aAAa;AAAA,IACxD,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,kBAAkB;AAAA,IACvD,SAAS,EAAE,KAAK,CAAC,WAAW,aAAa,YAAY,CAAC,EAAE,SAAS,EAAE,SAAS,gBAAgB;AAAA,IAC5F,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,qCAAqC;AAAA,IAC/E,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2CAA2C;AAAA,EACtF;AAAA,EACA,OAAO,EAAE,WAAW,MAAM,QAAQ,WAAW,SAAS,YAAY,MAAM,SAAS,UAAU,SAAS,MAAM;AACxG,UAAM,cAAuC;AAAA,MAC3C,YAAY;AAAA,MACZ;AAAA,MACA,QAAQ,mBAAmB,MAAM;AAAA,IACnC;AACA,QAAI,cAAc,OAAW,aAAY,aAAa;AACtD,QAAI,YAAY,OAAW,aAAY,WAAW;AAClD,QAAI,eAAe,OAAW,aAAY,cAAc;AACxD,QAAI,SAAS,OAAW,aAAY,OAAO;AAC3C,QAAI,YAAY,OAAW,aAAY,UAAU;AACjD,QAAI,aAAa,OAAW,aAAY,WAAW;AACnD,WAAO,iBAAiB,MAAM,OAAO,kBAAkB,EAAE,YAAY,GAAG,QAAQ,CAAC;AAAA,EACnF;AACF;AAEA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,IACE,eAAe,EAAE,OAAO,EAAE,SAAS,gBAAgB;AAAA,IACnD,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,YAAY;AAAA,IACtD,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,+BAA+B;AAAA,IACpE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,+DAA+D;AAAA,IACtG,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,YAAY;AAAA,IACtD,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,UAAU;AAAA,IAClD,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,aAAa;AAAA,IACxD,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,kBAAkB;AAAA,IACvD,SAAS,EAAE,KAAK,CAAC,WAAW,aAAa,YAAY,CAAC,EAAE,SAAS,EAAE,SAAS,gBAAgB;AAAA,IAC5F,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,qCAAqC;AAAA,IAC/E,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2CAA2C;AAAA,EACtF;AAAA,EACA,OAAO,EAAE,eAAe,WAAW,MAAM,QAAQ,WAAW,SAAS,YAAY,MAAM,SAAS,UAAU,SAAS,MAAM;AACvH,UAAM,cAAuC,CAAC;AAC9C,QAAI,cAAc,OAAW,aAAY,aAAa;AACtD,QAAI,SAAS,OAAW,aAAY,OAAO;AAC3C,QAAI,WAAW,OAAW,aAAY,SAAS,mBAAmB,MAAM;AACxE,QAAI,cAAc,OAAW,aAAY,aAAa;AACtD,QAAI,YAAY,OAAW,aAAY,WAAW;AAClD,QAAI,eAAe,OAAW,aAAY,cAAc;AACxD,QAAI,SAAS,OAAW,aAAY,OAAO;AAC3C,QAAI,YAAY,OAAW,aAAY,UAAU;AACjD,QAAI,aAAa,OAAW,aAAY,WAAW;AACnD,WAAO,iBAAiB,MAAM,OAAO,kBAAkB,eAAe,EAAE,YAAY,GAAG,QAAQ,CAAC;AAAA,EAClG;AACF;AAEA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,IACE,eAAe,EAAE,OAAO,EAAE,SAAS,gBAAgB;AAAA,IACnD,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2CAA2C;AAAA,EACtF;AAAA,EACA,OAAO,EAAE,eAAe,SAAS,MAC/B,iBAAiB,MAAM,OAAO,kBAAkB,eAAe,QAAQ,CAAC;AAC5E;AAEA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2CAA2C,EAAE;AAAA,EACxF,OAAO,EAAE,SAAS,MAAM,aAAa,MAAM,OAAO,mBAAmB,QAAQ,CAAC;AAChF;AAEA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,IACE,cAAc,EAAE,MAAM,EAAE,OAAO;AAAA,MAC7B,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,2CAA2C;AAAA,MACzF,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,+BAA+B;AAAA,MACpF,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,YAAY;AAAA,MACvD,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,+BAA+B;AAAA,MACpE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,0CAA0C;AAAA,MACjF,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,UAAU;AAAA,MAC9D,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,YAAY;AAAA,MAClE,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,aAAa;AAAA,MACpE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,kBAAkB;AAAA,MAClE,SAAS,EAAE,KAAK,CAAC,WAAW,aAAa,YAAY,CAAC,EAAE,SAAS,EAAE,SAAS,gBAAgB;AAAA,MAC5F,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,qCAAqC;AAAA,MAC/E,YAAY,EAAE,KAAK,CAAC,OAAO,UAAU,UAAU,SAAS,QAAQ,QAAQ,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,YAAY;AAAA,IACxH,CAAC,CAAC,EAAE,SAAS,8BAA8B;AAAA,IAC3C,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2CAA2C;AAAA,EACtF;AAAA,EACA,OAAO,EAAE,cAAc,SAAS,MAAM;AACpC,UAAM,2BAA2B,aAAa,IAAI,CAAC,YAAY;AAAA,MAC7D,GAAG;AAAA,MACH,GAAI,OAAO,WAAW,SAAY,EAAE,QAAQ,mBAAmB,OAAO,MAAM,EAAE,IAAI,CAAC;AAAA,IACrF,EAAE;AACF,WAAO;AAAA,MACL,MAAM,OAAO;AAAA,QACX,EAAE,cAAc,yBAA4F;AAAA,QAC5G;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,IACE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2CAA2C;AAAA,IACpF,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,6DAA6D;AAAA,IACvG,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,8DAA8D;AAAA,IACxG,MAAM,EAAE,KAAK,CAAC,iBAAiB,YAAY,CAAC,EAAE,SAAS,EAAE,SAAS,4BAA4B;AAAA,IAC9F,UAAU,EAAE,KAAK,CAAC,QAAQ,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,2BAA2B;AAAA,IACnF,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,4EAA4E;AAAA,IACnH,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2BAA2B;AAAA,IACrE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2BAA2B;AAAA,IACrE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,kDAAkD;AAAA,EACxF;AAAA,EACA,OAAO,EAAE,UAAU,WAAW,WAAW,MAAM,UAAU,QAAQ,WAAW,WAAW,IAAI,MAAM;AAC/F,UAAM,SAAS,MAAM,OAAO,gBAAgB,EAAE,UAAU,WAAW,KAAK,CAAC;AACzE,UAAM,eAAe,QAAQ,gBAAgB,CAAC;AAC9C,UAAM,WAAW,wBAAwB,cAAmC;AAAA,MAC1E,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AACD,UAAM,UAAU;AAAA,MACd;AAAA,MACA,MAAM,EAAE,IAAI,IAAI;AAAA,IAClB;AACA,WAAO,iBAAiB,OAAO;AAAA,EACjC;AACF;AAEA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,IACE,eAAe,EAAE,OAAO,EAAE,SAAS,sCAAsC;AAAA,IACzE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2CAA2C;AAAA,IACpF,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,8CAA8C;AAAA,IACtF,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,wEAAwE;AAAA,EACpH;AAAA,EACA,OAAO,EAAE,eAAe,UAAU,SAAS,cAAc,UAAU,MAAM;AACvE,UAAM,OAAO,gBAAgB;AAC7B,UAAM,SAAS,MAAM,OAAO,eAAe,eAAe,QAAQ;AAClE,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,IAAI,KAAK,OAAO,IAAI;AAC9B,QAAE,QAAQ,EAAE,QAAQ,IAAI,IAAI;AAC5B,kBAAY,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;AAAA,IAC1C;AACA,UAAM,SAAS,MAAM,OAAO,gBAAgB,EAAE,UAAU,UAAU,CAAC;AACnE,UAAM,kBAAkB,QAAQ,gBAAgB,CAAC;AACjD,UAAM,aAAa;AAAA,MACjB;AAAA,MACA;AAAA,MACA,EAAE,SAAS,KAAK;AAAA,IAClB;AACA,WAAO,iBAAiB,EAAE,QAAQ,WAAW,CAAC;AAAA,EAChD;AACF;AAEA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,IACE,WAAW,EAAE,OAAO,EAAE,SAAS,YAAY;AAAA,IAC3C,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2CAA2C;AAAA,IACpF,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,6DAA6D;AAAA,IACvG,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,uEAAuE;AAAA,EAChH;AAAA,EACA,OAAO,EAAE,WAAW,UAAU,WAAW,OAAO,MAAM;AACpD,UAAM,SAAS,MAAM,OAAO,yBAAyB,WAAW,EAAE,UAAU,UAAU,CAAC;AACvF,QAAI,CAAC,OAAQ,QAAO,iBAAiB,MAAM;AAC3C,WAAO,iBAAiB,oBAAoB,QAAQ,gBAAgB,CAAC,GAAG,MAAM,CAAC;AAAA,EACjF;AACF;AAEA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,IACE,YAAY,EAAE,OAAO,EAAE,SAAS,aAAa;AAAA,IAC7C,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2CAA2C;AAAA,IACpF,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,6DAA6D;AAAA,IACvG,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,uEAAuE;AAAA,EAChH;AAAA,EACA,OAAO,EAAE,YAAY,UAAU,WAAW,OAAO,MAAM;AACrD,UAAM,SAAS,MAAM,OAAO,0BAA0B,YAAY,EAAE,UAAU,UAAU,CAAC;AACzF,QAAI,CAAC,OAAQ,QAAO,iBAAiB,MAAM;AAC3C,WAAO,iBAAiB,oBAAoB,QAAQ,gBAAgB,CAAC,GAAG,MAAM,CAAC;AAAA,EACjF;AACF;AAEA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,IACE,SAAS,EAAE,OAAO,EAAE,SAAS,UAAU;AAAA,IACvC,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2CAA2C;AAAA,IACpF,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,6DAA6D;AAAA,IACvG,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,uEAAuE;AAAA,EAChH;AAAA,EACA,OAAO,EAAE,SAAS,UAAU,WAAW,OAAO,MAAM;AAClD,UAAM,SAAS,MAAM,OAAO,uBAAuB,SAAS,EAAE,UAAU,UAAU,CAAC;AACnF,QAAI,CAAC,OAAQ,QAAO,iBAAiB,MAAM;AAC3C,WAAO,iBAAiB,oBAAoB,QAAQ,gBAAgB,CAAC,GAAG,MAAM,CAAC;AAAA,EACjF;AACF;AAEA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2CAA2C,EAAE;AAAA,EACxF,OAAO,EAAE,SAAS,MAAM,aAAa,MAAM,OAAO,UAAU,QAAQ,CAAC;AACvE;AAEA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,IACE,SAAS,EAAE,OAAO,EAAE,SAAS,UAAU;AAAA,IACvC,MAAM,EAAE,OAAO,EAAE,SAAS,gBAAgB;AAAA,IAC1C,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2CAA2C;AAAA,EACtF;AAAA,EACA,OAAO,EAAE,SAAS,MAAM,SAAS,MAC/B,aAAa,MAAM,OAAO,YAAY,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC;AACjF;AAEA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,IACE,SAAS,EAAE,OAAO,EAAE,SAAS,UAAU;AAAA,IACvC,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2CAA2C;AAAA,EACtF;AAAA,EACA,OAAO,EAAE,SAAS,SAAS,MACzB,aAAa,MAAM,OAAO,yBAAyB,SAAS,QAAQ,CAAC;AACzE;AAEA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2CAA2C,EAAE;AAAA,EACxF,OAAO,EAAE,SAAS,MAAM,iBAAiB,MAAM,OAAO,gBAAgB,QAAQ,CAAC;AACjF;AAEA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,IACE,OAAO,EAAE,OAAO,EAAE,SAAS,iEAAiE;AAAA,IAC5F,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2CAA2C;AAAA,EACtF;AAAA,EACA,OAAO,EAAE,OAAO,SAAS,MAAM,iBAAiB,MAAM,OAAO,eAAe,OAAO,QAAQ,CAAC;AAC9F;AAEA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2CAA2C,EAAE;AAAA,EACxF,OAAO,EAAE,SAAS,MAAM,iBAAiB,MAAM,OAAO,yBAAyB,QAAQ,CAAC;AAC1F;AAEA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,IACE,wBAAwB,EAAE,OAAO,EAAE,SAAS,0BAA0B;AAAA,IACtE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2CAA2C;AAAA,EACtF;AAAA,EACA,OAAO,EAAE,wBAAwB,SAAS,MACxC,iBAAiB,MAAM,OAAO,wBAAwB,wBAAwB,QAAQ,CAAC;AAC3F;AAEA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,IACE,wBAAwB,EAAE,OAAO,EAAE,SAAS,0BAA0B;AAAA,IACtE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2CAA2C;AAAA,EACtF;AAAA,EACA,OAAO,EAAE,wBAAwB,SAAS,MACxC,iBAAiB,MAAM,OAAO,2BAA2B,wBAAwB,QAAQ,CAAC;AAC9F;AAEA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,IACE,QAAQ,EAAE,KAAK,CAAC,OAAO,QAAQ,OAAO,SAAS,QAAQ,CAAC,EAAE,SAAS,aAAa;AAAA,IAChF,MAAM,EAAE,OAAO,EAAE,SAAS,kGAAkG;AAAA,IAC5H,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS,EAAE,SAAS,iCAAiC;AAAA,IACjF,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,uEAAuE;AAAA,EAClH;AAAA,EACA,OAAO,EAAE,QAAQ,MAAM,MAAM,SAAS,MACpC,aAAa,MAAM,OAAO,WAAW,QAAQ,MAAM,MAAM,QAAQ,CAAC;AACtE;AAEA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD,YAAY,aAAa,MAAM,OAAO,QAAQ,CAAC;AACjD;AAEA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD,YAAY,aAAa,EAAE,eAAe,MAAM,KAAK,gBAAgB,EAAE,CAAC;AAC1E;AAEA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,IACE,OAAO,EAAE,OAAO,EAAE,SAAS,+EAA+E;AAAA,EAC5G;AAAA,EACA,OAAO,EAAE,MAAM,MAAM;AACnB,QAAI;AACF,YAAM,UAAU,IAAI,OAAO,OAAO,GAAG;AACrC,YAAM,UAAU,aAAa,OAAO,CAAC,MAAM,QAAQ,KAAK,EAAE,IAAI,KAAK,QAAQ,KAAK,EAAE,WAAW,CAAC;AAC9F,aAAO,aAAa,EAAE,OAAO,QAAQ,CAAC;AAAA,IACxC,QAAQ;AACN,aAAO,aAAa,EAAE,OAAO,wBAAwB,CAAC;AAAA,IACxD;AAAA,EACF;AACF;AAEA,eAAsB,eAAe;AACnC,QAAM,YAAY,IAAI,qBAAqB;AAC3C,QAAM,OAAO,QAAQ,SAAS;AAChC;;;ADtgBO,SAAS,mBAA4B;AAC1C,QAAM,MAAM,IAAIC,UAAQ,KAAK,EAAE,YAAY,qBAAqB;AAEhE,MAAI,OAAO,YAAY;AACrB,UAAM,aAAa;AAAA,EACrB,CAAC;AAED,SAAO;AACT;;;ApBOA,IAAM,UAAU,IAAIC,UAAQ;AAE5B,QACG,KAAK,MAAM,EACX,YAAY,uDAAuD,EACnE,QAAQ,OAAW,EACnB,OAAO,iBAAiB,oCAAoC,EAC5D,KAAK,aAAa,CAAC,gBAAgB;AAClC,QAAM,UAAU,YAAY,KAAK;AACjC,mBAAiB;AAAA,IACf,SAAS,QAAQ;AAAA,EACnB,CAAC;AACH,CAAC;AAEH,QAAQ,WAAW,kBAAkB,CAAC;AACtC,QAAQ,WAAW,kBAAkB,CAAC;AACtC,QAAQ,WAAW,qBAAqB,CAAC;AACzC,QAAQ,WAAW,sBAAsB,CAAC;AAC1C,QAAQ,WAAW,wBAAwB,CAAC;AAC5C,QAAQ,WAAW,0BAA0B,CAAC;AAC9C,QAAQ,WAAW,uBAAuB,CAAC;AAC3C,QAAQ,WAAW,oBAAoB,CAAC;AACxC,QAAQ,WAAW,oBAAoB,CAAC;AACxC,QAAQ,WAAW,iBAAiB,CAAC;AACrC,QAAQ,WAAW,iBAAiB,CAAC;AAErC,QAAQ,MAAM;","names":["Command","sanitized","Command","Command","Command","Command","Command","Command","Command","Command","Command","dayjs","Command","dayjs","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/lib/errors.ts","../src/lib/utils.ts","../src/lib/output.ts","../src/commands/auth.ts","../src/lib/auth.ts","../src/lib/config.ts","../src/lib/api-client.ts","../src/lib/command-utils.ts","../src/commands/user.ts","../src/commands/budgets.ts","../src/commands/accounts.ts","../src/lib/dates.ts","../src/commands/categories.ts","../src/commands/transactions.ts","../src/lib/schemas.ts","../src/commands/scheduled.ts","../src/commands/payees.ts","../src/commands/months.ts","../src/commands/api.ts","../src/commands/mcp.ts","../src/mcp/server.ts"],"sourcesContent":["#!/usr/bin/env bun\n\nimport { Command } from 'commander';\nimport { setOutputOptions } from './lib/output.js';\nimport { createAuthCommand } from './commands/auth.js';\nimport { createUserCommand } from './commands/user.js';\nimport { createBudgetsCommand } from './commands/budgets.js';\nimport { createAccountsCommand } from './commands/accounts.js';\nimport { createCategoriesCommand } from './commands/categories.js';\nimport { createTransactionsCommand } from './commands/transactions.js';\nimport { createScheduledCommand } from './commands/scheduled.js';\nimport { createPayeesCommand } from './commands/payees.js';\nimport { createMonthsCommand } from './commands/months.js';\nimport { createApiCommand } from './commands/api.js';\nimport { createMcpCommand } from './commands/mcp.js';\n\ndeclare const __VERSION__: string;\n\nconst program = new Command();\n\nprogram\n .name('ynab')\n .description('A command-line interface for You Need a Budget (YNAB)')\n .version(__VERSION__)\n .option('-c, --compact', 'Minified JSON output (single line)')\n .hook('preAction', (thisCommand) => {\n const options = thisCommand.opts();\n setOutputOptions({\n compact: options.compact,\n });\n });\n\nprogram.addCommand(createAuthCommand());\nprogram.addCommand(createUserCommand());\nprogram.addCommand(createBudgetsCommand());\nprogram.addCommand(createAccountsCommand());\nprogram.addCommand(createCategoriesCommand());\nprogram.addCommand(createTransactionsCommand());\nprogram.addCommand(createScheduledCommand());\nprogram.addCommand(createPayeesCommand());\nprogram.addCommand(createMonthsCommand());\nprogram.addCommand(createApiCommand());\nprogram.addCommand(createMcpCommand());\n\nprogram.parse();\n","import type { YnabError } from '../types/index.js';\nimport { outputJson } from './output.js';\n\nexport class YnabCliError extends Error {\n constructor(\n message: string,\n public statusCode?: number\n ) {\n super(message);\n this.name = 'YnabCliError';\n }\n}\n\nconst ERROR_STATUS_CODES: Record<string, number> = {\n bad_request: 400,\n not_authorized: 401,\n subscription_lapsed: 403,\n trial_expired: 403,\n unauthorized_scope: 403,\n data_limit_reached: 403,\n not_found: 404,\n resource_not_found: 404,\n conflict: 409,\n too_many_requests: 429,\n internal_server_error: 500,\n service_unavailable: 503,\n};\n\nexport function sanitizeErrorMessage(message: string): string {\n const sensitivePatterns = [\n /Bearer\\s+[\\w\\-._~+/]+=*/gi,\n /token[=:]\\s*[\\w\\-._~+/]+=*/gi,\n /api[_-]?key[=:]\\s*[\\w\\-._~+/]+=*/gi,\n /authorization:\\s*bearer\\s+[\\w\\-._~+/]+=*/gi,\n ];\n\n let sanitized = message;\n for (const pattern of sensitivePatterns) {\n sanitized = sanitized.replace(pattern, '[REDACTED]');\n }\n\n return sanitized.length > 500 ? sanitized.substring(0, 500) + '...' : sanitized;\n}\n\ninterface YnabApiError {\n name?: string;\n detail?: string;\n message?: string;\n id?: string;\n}\n\nfunction isErrorObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nexport function sanitizeApiError(error: unknown): YnabError {\n if (!isErrorObject(error)) {\n return {\n name: 'api_error',\n detail: 'An error occurred',\n id: undefined,\n };\n }\n\n const apiError = error as YnabApiError;\n const detail = sanitizeErrorMessage(\n String(apiError.detail || apiError.message || 'An error occurred')\n );\n\n return {\n name: apiError.name || 'api_error',\n detail,\n id: apiError.id,\n };\n}\n\nfunction enhanceRateLimitMessage(detail: string): string {\n return `${detail}\\n\\nYNAB API limit: 200 requests/hour (rolling window). Wait a few minutes and retry.`;\n}\n\nfunction formatErrorResponse(name: string, detail: string, statusCode: number): never {\n const enhancedDetail = name === 'too_many_requests' ? enhanceRateLimitMessage(detail) : detail;\n\n outputJson({ error: { name, detail: enhancedDetail, statusCode } });\n process.exit(1);\n}\n\nexport function handleYnabError(error: unknown): never {\n if (!isErrorObject(error)) {\n formatErrorResponse('unknown_error', 'An unexpected error occurred', 1);\n }\n\n const errorObj = error as { error?: unknown; message?: string };\n\n if (errorObj.error) {\n const ynabError: YnabError = sanitizeApiError(errorObj.error);\n formatErrorResponse(\n ynabError.name,\n ynabError.detail,\n ERROR_STATUS_CODES[ynabError.name] || 500\n );\n }\n\n if (error instanceof YnabCliError) {\n const sanitized = sanitizeErrorMessage(error.message);\n formatErrorResponse('cli_error', sanitized, error.statusCode || 1);\n }\n\n const sanitized = sanitizeErrorMessage(errorObj.message || 'An unexpected error occurred');\n formatErrorResponse('unknown_error', sanitized, 1);\n}\n","import { YnabCliError } from './errors.js';\n\nexport function milliunitsToAmount(milliunits: number): number {\n return milliunits / 1000;\n}\n\nexport function amountToMilliunits(amount: number): number {\n return Math.round(amount * 1000);\n}\n\nexport function convertMilliunitsToAmounts(data: unknown): unknown {\n if (data === null || data === undefined) return data;\n if (Array.isArray(data)) return data.map(convertMilliunitsToAmounts);\n if (typeof data !== 'object') return data;\n\n const converted: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data)) {\n if (isAmountField(key) && typeof value === 'number') {\n converted[key] = milliunitsToAmount(value);\n } else if (\n isDebtAmountMapField(key) &&\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value)\n ) {\n const convertedMap: Record<string, unknown> = {};\n for (const [dateKey, amountValue] of Object.entries(value)) {\n convertedMap[dateKey] =\n typeof amountValue === 'number' ? milliunitsToAmount(amountValue) : amountValue;\n }\n converted[key] = convertedMap;\n } else {\n converted[key] = convertMilliunitsToAmounts(value);\n }\n }\n return converted;\n}\n\nfunction isAmountField(fieldName: string): boolean {\n const amountFields = [\n 'amount',\n 'balance',\n 'cleared_balance',\n 'uncleared_balance',\n 'budgeted',\n 'activity',\n 'available',\n 'goal_target',\n 'goal_under_funded',\n 'goal_overall_funded',\n 'goal_overall_left',\n 'income',\n 'to_be_budgeted',\n 'debt_original_balance',\n ];\n\n return amountFields.includes(fieldName) || fieldName.endsWith('_amount');\n}\n\nfunction isDebtAmountMapField(fieldName: string): boolean {\n const debtAmountMapFields = [\n 'debt_minimum_payments',\n 'debt_escrow_amounts',\n 'debt_interest_rates',\n ];\n\n return debtAmountMapFields.includes(fieldName);\n}\n\nexport function parseApprovedFilter(value: string): boolean {\n const normalized = value.toLowerCase();\n if (normalized !== 'true' && normalized !== 'false') {\n throw new YnabCliError(`--approved must be 'true' or 'false', got '${value}'`, 400);\n }\n return normalized === 'true';\n}\n\nexport function parseStatusFilter(value: string): string[] {\n const statuses = value.split(',').map((s) => s.trim().toLowerCase());\n const validStatuses = ['cleared', 'uncleared', 'reconciled'];\n\n for (const status of statuses) {\n if (!validStatuses.includes(status)) {\n throw new YnabCliError(\n `Invalid status '${status}'. Must be one of: ${validStatuses.join(', ')}`,\n 400\n );\n }\n }\n\n return statuses;\n}\n\nexport type TransactionLike = {\n date: string;\n amount: number;\n approved: boolean;\n cleared: string;\n};\n\nexport function applyTransactionFilters<T extends TransactionLike>(\n transactions: T[],\n filters: {\n until?: string;\n approved?: string;\n status?: string;\n minAmount?: number;\n maxAmount?: number;\n }\n): T[] {\n let filtered = transactions;\n\n if (filters.until) {\n filtered = filtered.filter((t) => t.date <= filters.until!);\n }\n\n if (filters.approved !== undefined) {\n const approvedValue = parseApprovedFilter(filters.approved);\n filtered = filtered.filter((t) => t.approved === approvedValue);\n }\n\n if (filters.status) {\n const statuses = parseStatusFilter(filters.status);\n filtered = filtered.filter((t) => statuses.includes(t.cleared.toLowerCase()));\n }\n\n if (filters.minAmount !== undefined) {\n const minMilliunits = amountToMilliunits(filters.minAmount);\n filtered = filtered.filter((t) => t.amount >= minMilliunits);\n }\n\n if (filters.maxAmount !== undefined) {\n const maxMilliunits = amountToMilliunits(filters.maxAmount);\n filtered = filtered.filter((t) => t.amount <= maxMilliunits);\n }\n\n return filtered;\n}\n\nexport type SummaryTransaction = TransactionLike & {\n payee_id?: string | null;\n payee_name?: string | null;\n category_id?: string | null;\n category_name?: string | null;\n account_id: string;\n transfer_account_id?: string | null;\n transfer_transaction_id?: string | null;\n};\n\ninterface BreakdownEntry {\n count: number;\n total_amount: number;\n}\n\nexport function summarizeTransactions(\n transactions: SummaryTransaction[],\n options?: { top?: number }\n) {\n let totalAmount = 0;\n const dates: string[] = [];\n const byPayee = new Map<string, { payee_id: string | null; payee_name: string | null } & BreakdownEntry>();\n const byCategory = new Map<string, { category_id: string | null; category_name: string | null } & BreakdownEntry>();\n const byCleared = new Map<string, BreakdownEntry>();\n const byApproval = new Map<string, BreakdownEntry>();\n\n for (const t of transactions) {\n totalAmount += t.amount;\n dates.push(t.date);\n\n const payeeKey = t.payee_id || t.payee_name || '(none)';\n const payeeEntry = byPayee.get(payeeKey) || {\n payee_id: t.payee_id || null,\n payee_name: t.payee_name || null,\n count: 0,\n total_amount: 0,\n };\n payeeEntry.count++;\n payeeEntry.total_amount += t.amount;\n byPayee.set(payeeKey, payeeEntry);\n\n const catKey = t.category_id || t.category_name || '(uncategorized)';\n const catEntry = byCategory.get(catKey) || {\n category_id: t.category_id || null,\n category_name: t.category_name || null,\n count: 0,\n total_amount: 0,\n };\n catEntry.count++;\n catEntry.total_amount += t.amount;\n byCategory.set(catKey, catEntry);\n\n const clearedEntry = byCleared.get(t.cleared) || { count: 0, total_amount: 0 };\n clearedEntry.count++;\n clearedEntry.total_amount += t.amount;\n byCleared.set(t.cleared, clearedEntry);\n\n const approvalKey = String(t.approved);\n const approvalEntry = byApproval.get(approvalKey) || { count: 0, total_amount: 0 };\n approvalEntry.count++;\n approvalEntry.total_amount += t.amount;\n byApproval.set(approvalKey, approvalEntry);\n }\n\n const sortByAbsAmount = <T extends BreakdownEntry>(entries: T[]): T[] =>\n entries.sort((a, b) => Math.abs(b.total_amount) - Math.abs(a.total_amount));\n\n const truncate = <T extends BreakdownEntry>(entries: T[], rollupFactory: (entry: BreakdownEntry) => T): T[] => {\n const top = options?.top;\n if (!top || top <= 0 || entries.length <= top) return entries;\n const kept = entries.slice(0, top);\n const rest = entries.slice(top);\n const rollup = rollupFactory({\n count: rest.reduce((sum, e) => sum + e.count, 0),\n total_amount: rest.reduce((sum, e) => sum + e.total_amount, 0),\n });\n return [...kept, rollup];\n };\n\n const payeeBreakdown = sortByAbsAmount([...byPayee.values()]);\n const categoryBreakdown = sortByAbsAmount([...byCategory.values()]);\n\n return {\n total_count: transactions.length,\n total_amount: totalAmount,\n date_range: dates.length > 0\n ? {\n from: dates.reduce((a, b) => (a < b ? a : b)),\n to: dates.reduce((a, b) => (a > b ? a : b)),\n }\n : null,\n by_payee: truncate(payeeBreakdown, (e) => ({ payee_id: null, payee_name: '(other)', ...e })),\n by_category: truncate(categoryBreakdown, (e) => ({ category_id: null, category_name: '(other)', ...e })),\n by_cleared_status: [...byCleared.entries()].map(([status, entry]) => ({ status, ...entry })),\n by_approval_status: [...byApproval.entries()].map(([approved, entry]) => ({ approved: approved === 'true', ...entry })),\n };\n}\n\nexport function findTransferCandidates(\n source: SummaryTransaction,\n allTransactions: SummaryTransaction[],\n options: { maxDays: number }\n) {\n const sourceAmount = Math.abs(source.amount);\n const sourceDateMs = new Date(source.date).getTime();\n const msPerDay = 86400000;\n\n function daysBetween(t: SummaryTransaction): number {\n return Math.abs(new Date(t.date).getTime() - sourceDateMs) / msPerDay;\n }\n\n return allTransactions\n .filter((t) => {\n if (t.account_id === source.account_id) return false;\n if (Math.abs(t.amount) !== sourceAmount) return false;\n if (Math.sign(t.amount) === Math.sign(source.amount)) return false;\n return daysBetween(t) <= options.maxDays;\n })\n .map((t) => ({\n transaction: t,\n already_linked: !!t.transfer_transaction_id,\n date_difference_days: Math.round(daysBetween(t)),\n has_transfer_payee: !!t.payee_name?.startsWith('Transfer :'),\n }))\n .sort((a, b) => a.date_difference_days - b.date_difference_days);\n}\n\nexport function applyFieldSelection<T>(items: T[], fields?: string): Partial<T>[] {\n if (!fields) return items;\n\n const fieldList = fields.split(',').map((f) => f.trim());\n return items.map((item) => {\n const filtered: Partial<T> = {};\n const itemRecord = item as Record<string, unknown>;\n for (const field of fieldList) {\n if (field in itemRecord) {\n (filtered as Record<string, unknown>)[field] = itemRecord[field];\n }\n }\n return filtered;\n });\n}\n","import type { OutputOptions } from '../types/index.js';\nimport { convertMilliunitsToAmounts } from './utils.js';\n\nlet globalOutputOptions: OutputOptions = {};\n\nexport function setOutputOptions(options: OutputOptions): void {\n globalOutputOptions = options;\n}\n\nexport function outputJson(data: unknown, options: OutputOptions = {}): void {\n const convertedData = convertMilliunitsToAmounts(data);\n const mergedOptions = { ...globalOutputOptions, ...options };\n const jsonString = mergedOptions.compact\n ? JSON.stringify(convertedData)\n : JSON.stringify(convertedData, null, 2);\n\n console.log(jsonString);\n}\n","import { Command } from 'commander';\nimport { createInterface } from 'readline';\nimport { auth } from '../lib/auth.js';\nimport { outputJson } from '../lib/output.js';\nimport { client } from '../lib/api-client.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\nimport { YnabCliError } from '../lib/errors.js';\n\nfunction readTokenFromStdin(): Promise<string> {\n return new Promise((resolve, reject) => {\n let data = '';\n process.stdin.setEncoding('utf8');\n process.stdin.on('data', (chunk) => { data += chunk; });\n process.stdin.on('end', () => resolve(data.trim()));\n process.stdin.on('error', reject);\n });\n}\n\nfunction promptForToken(): Promise<string> {\n return new Promise((resolve) => {\n const rl = createInterface({\n input: process.stdin,\n output: process.stderr,\n });\n process.stderr.write('Enter YNAB Personal Access Token: ');\n rl.question('', (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\nexport function createAuthCommand(): Command {\n const cmd = new Command('auth').description('Authentication management');\n\n cmd\n .command('login')\n .description('Configure access token')\n .option('-t, --token <token>', 'YNAB Personal Access Token')\n .action(\n withErrorHandling(async (options: { token?: string }) => {\n let token: string;\n\n if (options.token) {\n token = options.token.trim();\n } else if (!process.stdin.isTTY) {\n token = await readTokenFromStdin();\n } else {\n token = await promptForToken();\n }\n\n if (!token) {\n throw new YnabCliError('Access token cannot be empty', 400);\n }\n await auth.setAccessToken(token);\n client.clearApi();\n\n try {\n const user = await client.getUser();\n outputJson({\n message: 'Successfully authenticated',\n user: { id: user?.id },\n });\n } catch (error) {\n await auth.deleteAccessToken();\n client.clearApi();\n throw error;\n }\n })\n );\n\n cmd\n .command('status')\n .description('Check authentication status')\n .action(\n withErrorHandling(async () => {\n const isAuthenticated = await auth.isAuthenticated();\n\n if (!isAuthenticated) {\n outputJson({ authenticated: false, message: 'Not authenticated' });\n return;\n }\n\n try {\n const user = await client.getUser();\n outputJson({ authenticated: true, user: { id: user?.id } });\n } catch {\n outputJson({ authenticated: false, message: 'Token exists but is invalid' });\n }\n })\n );\n\n cmd\n .command('logout')\n .description('Remove stored credentials')\n .action(\n withErrorHandling(async () => {\n await auth.logout();\n client.clearApi();\n outputJson({ message: 'Successfully logged out' });\n })\n );\n\n return cmd;\n}\n","import { Entry } from '@napi-rs/keyring';\nimport { config } from './config.js';\n\nconst SERVICE_NAME = 'ynab-cli';\nconst ACCOUNT_NAME = 'access-token';\n\nconst KEYRING_UNAVAILABLE_ERROR =\n 'Keychain storage unavailable. Cannot store credentials securely.\\n' +\n 'On Linux, install libsecret: sudo apt-get install libsecret-1-dev\\n' +\n 'Then reinstall: bun install -g @stephendolan/ynab-cli\\n' +\n 'Alternatively, use the YNAB_API_KEY environment variable.';\n\nlet keyring: Entry | null | undefined = undefined;\n\nfunction getKeyring(): Entry | null {\n if (keyring !== undefined) {\n return keyring;\n }\n try {\n keyring = new Entry(SERVICE_NAME, ACCOUNT_NAME);\n } catch {\n keyring = null;\n }\n return keyring;\n}\n\nexport function resetKeyringForTesting(): void {\n keyring = undefined;\n}\n\nexport class AuthManager {\n async getAccessToken(): Promise<string | null> {\n const entry = getKeyring();\n if (entry) {\n try {\n return entry.getPassword();\n } catch {\n return null;\n }\n }\n return null;\n }\n\n async setAccessToken(token: string): Promise<void> {\n const entry = getKeyring();\n if (!entry) {\n throw new Error(KEYRING_UNAVAILABLE_ERROR);\n }\n try {\n entry.setPassword(token);\n } catch (error) {\n throw new Error(\n `Failed to store token in keychain: ${error instanceof Error ? error.message : error}\\n\\n` +\n 'On Linux, ensure the Secret Service is running and unlocked.\\n' +\n 'Try: gnome-keyring-daemon --unlock\\n' +\n 'Or use the YNAB_API_KEY environment variable instead.'\n );\n }\n }\n\n async deleteAccessToken(): Promise<boolean> {\n const entry = getKeyring();\n if (entry) {\n return entry.deletePassword();\n }\n return false;\n }\n\n async isAuthenticated(): Promise<boolean> {\n return (await this.getAccessToken()) !== null;\n }\n\n async logout(): Promise<void> {\n await this.deleteAccessToken();\n config.clearDefaultBudget();\n }\n}\n\nexport const auth = new AuthManager();\n","import Conf from 'conf';\nimport type { Config } from '../types/index.js';\n\nclass ConfigManager {\n private conf: Conf<Config>;\n\n constructor() {\n this.conf = new Conf<Config>({\n projectName: 'ynab-cli',\n schema: {\n defaultBudget: { type: 'string' },\n version: { type: 'string', default: '1.0.0' },\n },\n defaults: { version: '1.0.0' },\n });\n }\n\n getDefaultBudget(): string | undefined {\n return this.conf.get('defaultBudget');\n }\n\n setDefaultBudget(budgetId: string): void {\n this.conf.set('defaultBudget', budgetId);\n }\n\n clearDefaultBudget(): void {\n this.conf.delete('defaultBudget');\n }\n\n clear(): void {\n this.conf.clear();\n }\n}\n\nexport const config = new ConfigManager();\n","import * as ynab from 'ynab';\nimport { config } from './config.js';\nimport { YnabCliError, sanitizeApiError } from './errors.js';\nimport { auth } from './auth.js';\n\ntype TransactionTypeFilter = 'uncategorized' | 'unapproved' | undefined;\n\nexport class YnabClient {\n private api: ynab.API | null = null;\n private envVarWarningShown = false;\n\n clearApi(): void {\n this.api = null;\n this.envVarWarningShown = false;\n }\n\n async getApi(): Promise<ynab.API> {\n if (this.api) {\n return this.api;\n }\n\n const keychainToken = await auth.getAccessToken();\n const accessToken = keychainToken || process.env.YNAB_API_KEY || null;\n\n if (!accessToken) {\n throw new YnabCliError(\n 'Not authenticated. Please run: ynab auth login or set YNAB_API_KEY environment variable',\n 401\n );\n }\n\n if (!keychainToken && process.env.YNAB_API_KEY && !this.envVarWarningShown) {\n console.warn(\n '\\x1b[33m⚠️ WARNING: Using YNAB_API_KEY environment variable.\\n' +\n 'Environment variables may be visible to other processes.\\n' +\n 'For better security, use: ynab auth login\\x1b[0m\\n'\n );\n this.envVarWarningShown = true;\n }\n\n this.api = new ynab.API(accessToken);\n return this.api;\n }\n\n async getBudgetId(budgetIdOrDefault?: string): Promise<string> {\n const budgetId = budgetIdOrDefault || config.getDefaultBudget() || process.env.YNAB_BUDGET_ID;\n\n if (!budgetId) {\n throw new YnabCliError(\n 'No budget specified. Use --budget flag, set default with \"ynab budgets set-default\", or set YNAB_BUDGET_ID environment variable',\n 400\n );\n }\n\n return budgetId;\n }\n\n async getUser() {\n const api = await this.getApi();\n const response = await api.user.getUser();\n return response.data.user;\n }\n\n async getBudgets(includeAccounts = false) {\n const api = await this.getApi();\n const response = await api.budgets.getBudgets(includeAccounts);\n return {\n budgets: response.data.budgets,\n server_knowledge: 0,\n };\n }\n\n async getBudget(budgetId?: string, lastKnowledgeOfServer?: number) {\n const api = await this.getApi();\n const id = await this.getBudgetId(budgetId);\n const response = await api.budgets.getBudgetById(id, lastKnowledgeOfServer);\n return {\n budget: response.data.budget,\n server_knowledge: response.data.server_knowledge,\n };\n }\n\n async getBudgetSettings(budgetId?: string) {\n const api = await this.getApi();\n const id = await this.getBudgetId(budgetId);\n const response = await api.budgets.getBudgetSettingsById(id);\n return response.data.settings;\n }\n\n async getAccounts(budgetId?: string, lastKnowledgeOfServer?: number) {\n const api = await this.getApi();\n const id = await this.getBudgetId(budgetId);\n const response = await api.accounts.getAccounts(id, lastKnowledgeOfServer);\n return {\n accounts: response.data.accounts,\n server_knowledge: response.data.server_knowledge,\n };\n }\n\n async getAccount(accountId: string, budgetId?: string) {\n const api = await this.getApi();\n const id = await this.getBudgetId(budgetId);\n const response = await api.accounts.getAccountById(id, accountId);\n return response.data.account;\n }\n\n async getCategories(budgetId?: string, lastKnowledgeOfServer?: number) {\n const api = await this.getApi();\n const id = await this.getBudgetId(budgetId);\n const response = await api.categories.getCategories(id, lastKnowledgeOfServer);\n return {\n category_groups: response.data.category_groups,\n server_knowledge: response.data.server_knowledge,\n };\n }\n\n async getCategory(categoryId: string, budgetId?: string) {\n const api = await this.getApi();\n const id = await this.getBudgetId(budgetId);\n const response = await api.categories.getCategoryById(id, categoryId);\n return response.data.category;\n }\n\n async updateMonthCategory(\n month: string,\n categoryId: string,\n data: ynab.PatchMonthCategoryWrapper,\n budgetId?: string\n ) {\n const api = await this.getApi();\n const id = await this.getBudgetId(budgetId);\n const response = await api.categories.updateMonthCategory(id, month, categoryId, data);\n return response.data.category;\n }\n\n async updateCategory(categoryId: string, data: ynab.PatchCategoryWrapper, budgetId?: string) {\n const api = await this.getApi();\n const id = await this.getBudgetId(budgetId);\n const response = await api.categories.updateCategory(id, categoryId, data);\n return response.data.category;\n }\n\n async getPayees(budgetId?: string, lastKnowledgeOfServer?: number) {\n const api = await this.getApi();\n const id = await this.getBudgetId(budgetId);\n const response = await api.payees.getPayees(id, lastKnowledgeOfServer);\n return {\n payees: response.data.payees,\n server_knowledge: response.data.server_knowledge,\n };\n }\n\n async getPayee(payeeId: string, budgetId?: string) {\n const api = await this.getApi();\n const id = await this.getBudgetId(budgetId);\n const response = await api.payees.getPayeeById(id, payeeId);\n return response.data.payee;\n }\n\n async updatePayee(payeeId: string, data: ynab.PatchPayeeWrapper, budgetId?: string) {\n const api = await this.getApi();\n const id = await this.getBudgetId(budgetId);\n const response = await api.payees.updatePayee(id, payeeId, data);\n return response.data.payee;\n }\n\n async getPayeeLocationsByPayee(payeeId: string, budgetId?: string) {\n const api = await this.getApi();\n const id = await this.getBudgetId(budgetId);\n const response = await api.payeeLocations.getPayeeLocationsByPayee(id, payeeId);\n return response.data.payee_locations;\n }\n\n async getBudgetMonths(budgetId?: string, lastKnowledgeOfServer?: number) {\n const api = await this.getApi();\n const id = await this.getBudgetId(budgetId);\n const response = await api.months.getBudgetMonths(id, lastKnowledgeOfServer);\n return {\n months: response.data.months,\n server_knowledge: response.data.server_knowledge,\n };\n }\n\n async getBudgetMonth(month: string, budgetId?: string) {\n const api = await this.getApi();\n const id = await this.getBudgetId(budgetId);\n const response = await api.months.getBudgetMonth(id, month);\n return response.data.month;\n }\n\n async getTransactions(params: {\n budgetId?: string;\n sinceDate?: string;\n type?: string;\n lastKnowledgeOfServer?: number;\n }) {\n const api = await this.getApi();\n const id = await this.getBudgetId(params.budgetId);\n const response = await api.transactions.getTransactions(\n id,\n params.sinceDate,\n params.type as TransactionTypeFilter,\n params.lastKnowledgeOfServer\n );\n return {\n transactions: response.data.transactions,\n server_knowledge: response.data.server_knowledge,\n };\n }\n\n async getTransactionsByAccount(\n accountId: string,\n params: {\n budgetId?: string;\n sinceDate?: string;\n type?: string;\n lastKnowledgeOfServer?: number;\n }\n ) {\n const api = await this.getApi();\n const id = await this.getBudgetId(params.budgetId);\n const response = await api.transactions.getTransactionsByAccount(\n id,\n accountId,\n params.sinceDate,\n params.type as TransactionTypeFilter,\n params.lastKnowledgeOfServer\n );\n return {\n transactions: response.data.transactions,\n server_knowledge: response.data.server_knowledge,\n };\n }\n\n async getTransactionsByCategory(\n categoryId: string,\n params: {\n budgetId?: string;\n sinceDate?: string;\n type?: string;\n lastKnowledgeOfServer?: number;\n }\n ) {\n const api = await this.getApi();\n const id = await this.getBudgetId(params.budgetId);\n const response = await api.transactions.getTransactionsByCategory(\n id,\n categoryId,\n params.sinceDate,\n params.type as TransactionTypeFilter,\n params.lastKnowledgeOfServer\n );\n return {\n transactions: response.data.transactions,\n server_knowledge: response.data.server_knowledge,\n };\n }\n\n async getTransactionsByPayee(\n payeeId: string,\n params: {\n budgetId?: string;\n sinceDate?: string;\n type?: string;\n lastKnowledgeOfServer?: number;\n }\n ) {\n const api = await this.getApi();\n const id = await this.getBudgetId(params.budgetId);\n const response = await api.transactions.getTransactionsByPayee(\n id,\n payeeId,\n params.sinceDate,\n params.type as TransactionTypeFilter,\n params.lastKnowledgeOfServer\n );\n return {\n transactions: response.data.transactions,\n server_knowledge: response.data.server_knowledge,\n };\n }\n\n async getTransaction(transactionId: string, budgetId?: string) {\n const api = await this.getApi();\n const id = await this.getBudgetId(budgetId);\n const response = await api.transactions.getTransactionById(id, transactionId);\n return response.data.transaction;\n }\n\n async createTransaction(transactionData: ynab.PostTransactionsWrapper, budgetId?: string) {\n const api = await this.getApi();\n const id = await this.getBudgetId(budgetId);\n const response = await api.transactions.createTransaction(id, transactionData);\n return response.data.transaction;\n }\n\n async updateTransaction(\n transactionId: string,\n transactionData: ynab.PutTransactionWrapper,\n budgetId?: string\n ) {\n const api = await this.getApi();\n const id = await this.getBudgetId(budgetId);\n const response = await api.transactions.updateTransaction(id, transactionId, transactionData);\n return response.data.transaction;\n }\n\n async updateTransactions(\n transactions: ynab.PatchTransactionsWrapper,\n budgetId?: string\n ) {\n const api = await this.getApi();\n const id = await this.getBudgetId(budgetId);\n const response = await api.transactions.updateTransactions(id, transactions);\n return {\n transactions: response.data.transactions,\n transaction_ids: response.data.transaction_ids,\n server_knowledge: response.data.server_knowledge,\n };\n }\n\n async deleteTransaction(transactionId: string, budgetId?: string) {\n const api = await this.getApi();\n const id = await this.getBudgetId(budgetId);\n const response = await api.transactions.deleteTransaction(id, transactionId);\n return response.data.transaction;\n }\n\n async importTransactions(budgetId?: string) {\n const api = await this.getApi();\n const id = await this.getBudgetId(budgetId);\n const response = await api.transactions.importTransactions(id);\n return response.data.transaction_ids;\n }\n\n async getScheduledTransactions(budgetId?: string, lastKnowledgeOfServer?: number) {\n const api = await this.getApi();\n const id = await this.getBudgetId(budgetId);\n const response = await api.scheduledTransactions.getScheduledTransactions(\n id,\n lastKnowledgeOfServer\n );\n return {\n scheduled_transactions: response.data.scheduled_transactions,\n server_knowledge: response.data.server_knowledge,\n };\n }\n\n async getScheduledTransaction(scheduledTransactionId: string, budgetId?: string) {\n const api = await this.getApi();\n const id = await this.getBudgetId(budgetId);\n const response = await api.scheduledTransactions.getScheduledTransactionById(\n id,\n scheduledTransactionId\n );\n return response.data.scheduled_transaction;\n }\n\n async deleteScheduledTransaction(scheduledTransactionId: string, budgetId?: string) {\n const api = await this.getApi();\n const id = await this.getBudgetId(budgetId);\n const response = await api.scheduledTransactions.deleteScheduledTransaction(\n id,\n scheduledTransactionId\n );\n return response.data.scheduled_transaction;\n }\n\n async rawApiCall(method: string, path: string, data?: unknown, budgetId?: string) {\n await this.getApi();\n\n const fullPath = path.includes('{budget_id}')\n ? path.replace('{budget_id}', await this.getBudgetId(budgetId))\n : path;\n\n const url = `https://api.ynab.com/v1${fullPath}`;\n const accessToken = (await auth.getAccessToken()) || process.env.YNAB_API_KEY;\n const headers = {\n Authorization: `Bearer ${accessToken}`,\n 'Content-Type': 'application/json',\n };\n\n const httpMethod = method.toUpperCase();\n const hasBody = ['POST', 'PUT', 'PATCH'].includes(httpMethod);\n\n if (!['GET', 'POST', 'PUT', 'PATCH', 'DELETE'].includes(httpMethod)) {\n throw new YnabCliError(`Unsupported HTTP method: ${method}`, 400);\n }\n\n const response = await fetch(url, {\n method: httpMethod,\n headers,\n ...(hasBody && { body: JSON.stringify(data) }),\n });\n\n if (!response.ok) {\n const errorData = (await response.json()) as Record<string, unknown>;\n throw { error: sanitizeApiError(errorData.error || errorData) };\n }\n\n return await response.json();\n }\n}\n\nexport const client = new YnabClient();\n","import { handleYnabError, YnabCliError } from './errors.js';\n\nexport function withErrorHandling<TArgs extends unknown[], R>(\n fn: (...args: TArgs) => Promise<R>\n): (...args: TArgs) => Promise<void> {\n return async (...args: TArgs) => {\n try {\n await fn(...args);\n } catch (error) {\n handleYnabError(error);\n }\n };\n}\n\nexport function requireConfirmation(itemType: string, confirmed: boolean = false): void {\n if (!confirmed) {\n throw new YnabCliError(\n `Deleting ${itemType} requires --yes flag to confirm`,\n 400\n );\n }\n}\n\nexport function buildUpdateObject<T>(\n options: T,\n mapping: Record<string, string>\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n const optionsRecord = options as Record<string, unknown>;\n\n for (const [optionKey, targetKey] of Object.entries(mapping)) {\n if (optionsRecord[optionKey] !== undefined) {\n result[targetKey] = optionsRecord[optionKey];\n }\n }\n\n return result;\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\n\nexport function createUserCommand(): Command {\n const cmd = new Command('user').description('User information');\n\n cmd\n .command('info')\n .description('Get authenticated user information')\n .action(\n withErrorHandling(async () => {\n const user = await client.getUser();\n outputJson(user);\n })\n );\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { config } from '../lib/config.js';\nimport { outputJson } from '../lib/output.js';\nimport { YnabCliError } from '../lib/errors.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\n\nexport function createBudgetsCommand(): Command {\n const cmd = new Command('budgets').description('Budget operations');\n\n cmd\n .command('list')\n .description('List all budgets')\n .option('--include-accounts', 'Include accounts in response')\n .action(\n withErrorHandling(async (options: { includeAccounts?: boolean }) => {\n const result = await client.getBudgets(options.includeAccounts);\n outputJson(result?.budgets);\n })\n );\n\n cmd\n .command('view')\n .description('View budget details (uses default if no id provided)')\n .argument('[id]', 'Budget ID')\n .action(\n withErrorHandling(async (id: string | undefined) => {\n const result = await client.getBudget(id);\n outputJson(result?.budget);\n })\n );\n\n cmd\n .command('settings')\n .description('View budget settings')\n .argument('[id]', 'Budget ID')\n .action(\n withErrorHandling(async (id: string | undefined) => {\n const settings = await client.getBudgetSettings(id);\n outputJson(settings);\n })\n );\n\n cmd\n .command('set-default')\n .description('Set default budget for commands')\n .argument('<id>', 'Budget ID')\n .action(\n withErrorHandling(async (id: string) => {\n const result = await client.getBudgets();\n const budget = result?.budgets.find((b) => b.id === id);\n\n if (!budget) {\n throw new YnabCliError(`Budget with ID ${id} not found`, 404);\n }\n\n config.setDefaultBudget(id);\n outputJson({\n message: 'Default budget set',\n budget: { id: budget.id, name: budget.name },\n });\n })\n );\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\nimport { applyFieldSelection } from '../lib/utils.js';\nimport { parseDate } from '../lib/dates.js';\nimport type { CommandOptions } from '../types/index.js';\n\nexport function createAccountsCommand(): Command {\n const cmd = new Command('accounts').description('Account operations');\n\n cmd\n .command('list')\n .description('List all accounts')\n .option('-b, --budget <id>', 'Budget ID')\n .action(\n withErrorHandling(async (options: CommandOptions) => {\n const result = await client.getAccounts(options.budget);\n outputJson(result?.accounts);\n })\n );\n\n cmd\n .command('view')\n .description('View account details')\n .argument('<id>', 'Account ID')\n .option('-b, --budget <id>', 'Budget ID')\n .action(\n withErrorHandling(async (id: string, options: CommandOptions) => {\n const account = await client.getAccount(id, options.budget);\n outputJson(account);\n })\n );\n\n cmd\n .command('transactions')\n .description('List transactions for account')\n .argument('<id>', 'Account ID')\n .option('-b, --budget <id>', 'Budget ID')\n .option('--since <date>', 'Filter transactions since date')\n .option('--type <type>', 'Filter by transaction type')\n .option(\n '--fields <fields>',\n 'Comma-separated list of fields to include (e.g., id,date,amount,memo)'\n )\n .action(\n withErrorHandling(\n async (\n id: string,\n options: {\n budget?: string;\n since?: string;\n type?: string;\n fields?: string;\n } & CommandOptions\n ) => {\n const result = await client.getTransactionsByAccount(id, {\n budgetId: options.budget,\n sinceDate: options.since ? parseDate(options.since) : undefined,\n type: options.type,\n });\n const transactions = result?.transactions || [];\n outputJson(applyFieldSelection(transactions, options.fields));\n }\n )\n );\n\n return cmd;\n}\n","import dayjs from 'dayjs';\nimport { YnabCliError } from './errors.js';\n\nexport function parseDate(input: string): string {\n const d = dayjs(input);\n if (!d.isValid()) {\n throw new YnabCliError(`Invalid date: ${input}`, 400);\n }\n return d.format('YYYY-MM-DD');\n}\n\nexport function todayDate(): string {\n return dayjs().format('YYYY-MM-DD');\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { outputJson } from '../lib/output.js';\nimport { YnabCliError } from '../lib/errors.js';\nimport { amountToMilliunits, applyFieldSelection } from '../lib/utils.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\nimport { parseDate } from '../lib/dates.js';\nimport type { CommandOptions } from '../types/index.js';\n\nexport function createCategoriesCommand(): Command {\n const cmd = new Command('categories').description('Category operations');\n\n cmd\n .command('list')\n .description('List all categories')\n .option('-b, --budget <id>', 'Budget ID')\n .option('--last-knowledge <number>', 'Last knowledge of server', parseInt)\n .action(\n withErrorHandling(\n async (options: { budget?: string; lastKnowledge?: number } & CommandOptions) => {\n const result = await client.getCategories(options.budget, options.lastKnowledge);\n outputJson(result?.category_groups);\n }\n )\n );\n\n cmd\n .command('view')\n .description('View category details')\n .argument('<id>', 'Category ID')\n .option('-b, --budget <id>', 'Budget ID')\n .action(\n withErrorHandling(async (id: string, options: CommandOptions) => {\n const category = await client.getCategory(id, options.budget);\n outputJson(category);\n })\n );\n\n cmd\n .command('update')\n .description('Update category details')\n .argument('<id>', 'Category ID')\n .option('--name <name>', 'New category name')\n .option('--note <note>', 'Category note (use empty string to clear)')\n .option('--category-group-id <id>', 'Move to a different category group')\n .option('--goal-target <amount>', 'Goal target amount in dollars (ignored if category has no goal)', parseFloat)\n .option('-b, --budget <id>', 'Budget ID')\n .action(\n withErrorHandling(\n async (\n id: string,\n options: {\n name?: string;\n note?: string;\n categoryGroupId?: string;\n goalTarget?: number;\n budget?: string;\n } & CommandOptions\n ) => {\n if (options.name === undefined && options.note === undefined && options.categoryGroupId === undefined && options.goalTarget === undefined) {\n throw new YnabCliError(\n 'At least one field to update must be provided (--name, --note, --category-group-id, or --goal-target)',\n 400\n );\n }\n\n if (options.name !== undefined && options.name.trim() === '') {\n throw new YnabCliError('Category name cannot be empty or whitespace', 400);\n }\n\n const updateData: {\n name?: string;\n note?: string | null;\n category_group_id?: string;\n goal_target?: number | null;\n } = {};\n\n if (options.name !== undefined) {\n updateData.name = options.name.trim();\n }\n if (options.note !== undefined) {\n updateData.note = options.note.trim() || null;\n }\n if (options.categoryGroupId !== undefined) {\n updateData.category_group_id = options.categoryGroupId;\n }\n if (options.goalTarget !== undefined) {\n updateData.goal_target = amountToMilliunits(options.goalTarget);\n }\n\n const category = await client.updateCategory(id, { category: updateData }, options.budget);\n outputJson(category);\n }\n )\n );\n\n cmd\n .command('budget')\n .description('Set category budgeted amount for a month (overrides existing amount)')\n .argument('<id>', 'Category ID')\n .requiredOption('--month <month>', 'Budget month (e.g., 2025-07-01)')\n .requiredOption('--amount <amount>', 'Total budgeted amount to set (e.g., 100.50)', parseFloat)\n .option('-b, --budget <id>', 'Budget ID')\n .action(\n withErrorHandling(\n async (\n id: string,\n options: {\n month: string;\n amount: number;\n budget?: string;\n } & CommandOptions\n ) => {\n if (isNaN(options.amount)) {\n throw new YnabCliError('Amount must be a valid number', 400);\n }\n\n const milliunits = amountToMilliunits(options.amount);\n const category = await client.updateMonthCategory(\n parseDate(options.month),\n id,\n { category: { budgeted: milliunits } },\n options.budget\n );\n outputJson(category);\n }\n )\n );\n\n cmd\n .command('transactions')\n .description('List transactions for category')\n .argument('<id>', 'Category ID')\n .option('-b, --budget <id>', 'Budget ID')\n .option('--since <date>', 'Filter transactions since date')\n .option('--type <type>', 'Filter by transaction type')\n .option('--last-knowledge <number>', 'Last knowledge of server', parseInt)\n .option(\n '--fields <fields>',\n 'Comma-separated list of fields to include (e.g., id,date,amount,memo)'\n )\n .action(\n withErrorHandling(\n async (\n id: string,\n options: {\n budget?: string;\n since?: string;\n type?: string;\n lastKnowledge?: number;\n fields?: string;\n } & CommandOptions\n ) => {\n const result = await client.getTransactionsByCategory(id, {\n budgetId: options.budget,\n sinceDate: options.since ? parseDate(options.since) : undefined,\n type: options.type,\n lastKnowledgeOfServer: options.lastKnowledge,\n });\n const transactions = result?.transactions || [];\n outputJson(applyFieldSelection(transactions, options.fields));\n }\n )\n );\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { outputJson } from '../lib/output.js';\nimport { YnabCliError } from '../lib/errors.js';\nimport dayjs from 'dayjs';\nimport {\n amountToMilliunits,\n applyTransactionFilters,\n applyFieldSelection,\n summarizeTransactions,\n findTransferCandidates,\n type TransactionLike,\n type SummaryTransaction,\n} from '../lib/utils.js';\nimport { withErrorHandling, requireConfirmation, buildUpdateObject } from '../lib/command-utils.js';\nimport { validateTransactionSplits, validateBatchUpdates } from '../lib/schemas.js';\nimport { parseDate, todayDate } from '../lib/dates.js';\nimport type { CommandOptions } from '../types/index.js';\n\nasync function fetchTransactions(options: {\n budget?: string;\n account?: string;\n category?: string;\n payee?: string;\n since?: string;\n type?: string;\n lastKnowledge?: number;\n}) {\n const params = {\n budgetId: options.budget,\n sinceDate: options.since ? parseDate(options.since) : undefined,\n type: options.type,\n lastKnowledgeOfServer: options.lastKnowledge,\n };\n\n if (options.account) return client.getTransactionsByAccount(options.account, params);\n if (options.category) return client.getTransactionsByCategory(options.category, params);\n if (options.payee) return client.getTransactionsByPayee(options.payee, params);\n return client.getTransactions(params);\n}\n\ninterface TransactionOptions {\n account?: string;\n date?: string;\n amount?: number;\n payeeName?: string;\n payeeId?: string;\n categoryId?: string;\n memo?: string;\n cleared?: string;\n approved?: boolean;\n}\n\nfunction buildTransactionData(options: TransactionOptions): Record<string, unknown> {\n if (!options.account) {\n throw new YnabCliError('--account is required in non-interactive mode', 400);\n }\n if (options.amount === undefined) {\n throw new YnabCliError('--amount is required in non-interactive mode', 400);\n }\n\n return {\n account_id: options.account,\n date: options.date ? parseDate(options.date) : todayDate(),\n amount: amountToMilliunits(options.amount),\n payee_name: options.payeeName,\n payee_id: options.payeeId,\n category_id: options.categoryId,\n memo: options.memo,\n cleared: options.cleared,\n approved: options.approved,\n };\n}\n\nexport function createTransactionsCommand(): Command {\n const cmd = new Command('transactions').description('Transaction operations');\n\n cmd\n .command('list')\n .description('List transactions')\n .option('-b, --budget <id>', 'Budget ID')\n .option('--account <id>', 'Filter by account ID')\n .option('--category <id>', 'Filter by category ID')\n .option('--payee <id>', 'Filter by payee ID')\n .option('--since <date>', 'Filter transactions since date')\n .option('--until <date>', 'Filter transactions until date')\n .option('--type <type>', 'Filter by transaction type')\n .option('--approved <value>', 'Filter by approval status: true or false')\n .option(\n '--status <statuses>',\n 'Filter by cleared status: cleared, uncleared, reconciled (comma-separated for multiple)'\n )\n .option('--min-amount <amount>', 'Minimum amount in currency units (e.g., 10.50)', parseFloat)\n .option('--max-amount <amount>', 'Maximum amount in currency units (e.g., 100.00)', parseFloat)\n .option(\n '--fields <fields>',\n 'Comma-separated list of fields to include (e.g., id,date,amount,memo)'\n )\n .option('--last-knowledge <number>', 'Last server knowledge for delta requests. When used, output includes server_knowledge.', parseInt)\n .option('--limit <number>', 'Maximum number of transactions to return', parseInt)\n .action(\n withErrorHandling(\n async (\n options: {\n budget?: string;\n account?: string;\n category?: string;\n payee?: string;\n since?: string;\n until?: string;\n type?: string;\n approved?: string;\n status?: string;\n minAmount?: number;\n maxAmount?: number;\n fields?: string;\n lastKnowledge?: number;\n limit?: number;\n } & CommandOptions\n ) => {\n const result = await fetchTransactions(options);\n const transactions = result?.transactions || [];\n\n let filtered = applyTransactionFilters(transactions as TransactionLike[], {\n until: options.until ? parseDate(options.until) : undefined,\n approved: options.approved,\n status: options.status,\n minAmount: options.minAmount,\n maxAmount: options.maxAmount,\n });\n\n if (options.limit && options.limit > 0) {\n filtered = filtered.slice(0, options.limit);\n }\n\n const selected = applyFieldSelection(filtered, options.fields);\n\n if (options.lastKnowledge !== undefined) {\n outputJson({ transactions: selected, server_knowledge: result?.server_knowledge });\n } else {\n outputJson(selected);\n }\n }\n )\n );\n\n cmd\n .command('view')\n .description('View single transaction')\n .argument('<id>', 'Transaction ID')\n .option('-b, --budget <id>', 'Budget ID')\n .action(\n withErrorHandling(async (id: string, options: CommandOptions) => {\n const transaction = await client.getTransaction(id, options.budget);\n outputJson(transaction);\n })\n );\n\n cmd\n .command('create')\n .description('Create transaction')\n .option('-b, --budget <id>', 'Budget ID')\n .option('--account <id>', 'Account ID')\n .option('--date <date>', 'Transaction date')\n .option('--amount <amount>', 'Amount in currency units (e.g., 10.50)', parseFloat)\n .option('--payee-name <name>', 'Payee name')\n .option('--payee-id <id>', 'Payee ID')\n .option('--category-id <id>', 'Category ID')\n .option('--memo <memo>', 'Memo')\n .option('--cleared <status>', 'Cleared status (cleared, uncleared, reconciled)')\n .option('--approved', 'Mark as approved')\n .action(\n withErrorHandling(\n async (\n options: {\n budget?: string;\n account?: string;\n date?: string;\n amount?: number;\n payeeName?: string;\n payeeId?: string;\n categoryId?: string;\n memo?: string;\n cleared?: string;\n approved?: boolean;\n } & CommandOptions\n ) => {\n const transactionData = buildTransactionData(options);\n const transaction = await client.createTransaction(\n { transaction: transactionData },\n options.budget\n );\n outputJson(transaction);\n }\n )\n );\n\n cmd\n .command('update')\n .description('Update transaction')\n .argument('<id>', 'Transaction ID')\n .option('-b, --budget <id>', 'Budget ID')\n .option('--account <id>', 'Account ID')\n .option('--date <date>', 'Transaction date')\n .option('--amount <amount>', 'Amount in currency units', parseFloat)\n .option('--payee-name <name>', 'Payee name')\n .option('--payee-id <id>', 'Payee ID')\n .option('--category-id <id>', 'Category ID')\n .option('--memo <memo>', 'Memo')\n .option('--cleared <status>', 'Cleared status')\n .option('--approved', 'Mark as approved')\n .action(\n withErrorHandling(\n async (id: string, options: TransactionOptions & { budget?: string } & CommandOptions) => {\n const transactionData = buildUpdateObject(options, {\n account: 'account_id',\n date: 'date',\n payeeName: 'payee_name',\n payeeId: 'payee_id',\n categoryId: 'category_id',\n memo: 'memo',\n cleared: 'cleared',\n approved: 'approved',\n });\n\n if (options.amount !== undefined) {\n transactionData.amount = amountToMilliunits(options.amount);\n }\n\n const transaction = await client.updateTransaction(\n id,\n { transaction: transactionData },\n options.budget\n );\n outputJson(transaction);\n }\n )\n );\n\n cmd\n .command('delete')\n .description('Delete transaction')\n .argument('<id>', 'Transaction ID')\n .option('-b, --budget <id>', 'Budget ID')\n .option('-y, --yes', 'Skip confirmation')\n .action(\n withErrorHandling(\n async (id: string, options: { budget?: string; yes?: boolean } & CommandOptions) => {\n requireConfirmation('transaction', options.yes);\n const transaction = await client.deleteTransaction(id, options.budget);\n outputJson({ message: 'Transaction deleted', transaction });\n }\n )\n );\n\n cmd\n .command('import')\n .description('Import transactions')\n .option('-b, --budget <id>', 'Budget ID')\n .action(\n withErrorHandling(async (options: CommandOptions) => {\n const transactionIds = await client.importTransactions(options.budget);\n outputJson({ transaction_ids: transactionIds });\n })\n );\n\n cmd\n .command('split')\n .description(\n 'Split transaction into multiple categories. Amounts should be in dollars (e.g., 10.50).'\n )\n .argument('<id>', 'Transaction ID')\n .requiredOption(\n '--splits <json>',\n 'JSON array of splits with dollar amounts: [{\"amount\": -21.40, \"category_id\": \"xxx\", \"memo\": \"...\"}]'\n )\n .option('-b, --budget <id>', 'Budget ID')\n .option('-f, --force', 'Force update of already-split transactions by deleting and recreating')\n .action(\n withErrorHandling(\n async (\n id: string,\n options: { splits: string; budget?: string; force?: boolean } & CommandOptions\n ) => {\n let parsedSplits;\n try {\n parsedSplits = JSON.parse(options.splits);\n } catch {\n throw new YnabCliError('Invalid JSON in --splits parameter', 400);\n }\n\n const splits = validateTransactionSplits(parsedSplits);\n\n const splitsInMilliunits = splits.map((split) => ({\n ...split,\n amount: amountToMilliunits(split.amount),\n }));\n\n const existingTransaction = await client.getTransaction(id, options.budget);\n const isAlreadySplit =\n existingTransaction.subtransactions && existingTransaction.subtransactions.length > 0;\n\n if (isAlreadySplit && !options.force) {\n throw new YnabCliError(\n 'Transaction is already split. YNAB API does not support updating split transactions. ' +\n 'Use --force to delete and recreate the transaction with new splits.',\n 400\n );\n }\n\n if (isAlreadySplit) {\n await client.deleteTransaction(id, options.budget);\n\n const recreatedTransaction = await client.createTransaction(\n {\n transaction: {\n account_id: existingTransaction.account_id,\n date: existingTransaction.date,\n amount: existingTransaction.amount,\n payee_id: existingTransaction.payee_id,\n payee_name: existingTransaction.payee_name,\n category_id: null,\n memo: existingTransaction.memo,\n cleared: existingTransaction.cleared,\n approved: existingTransaction.approved,\n flag_color: existingTransaction.flag_color,\n subtransactions: splitsInMilliunits,\n },\n },\n options.budget\n );\n outputJson(recreatedTransaction);\n } else {\n const transaction = await client.updateTransaction(\n id,\n {\n transaction: {\n category_id: null,\n subtransactions: splitsInMilliunits,\n },\n },\n options.budget\n );\n outputJson(transaction);\n }\n }\n )\n );\n\n cmd\n .command('batch-update')\n .description(\n 'Update multiple transactions in a single API call. Amounts should be in dollars (e.g., -21.40).'\n )\n .requiredOption(\n '--transactions <json>',\n 'JSON array of transaction updates. Each must have \"id\" or \"import_id\". Example: [{\"id\": \"tx1\", \"approved\": true, \"category_id\": \"cat1\"}]'\n )\n .option('-b, --budget <id>', 'Budget ID')\n .action(\n withErrorHandling(\n async (options: { transactions: string; budget?: string } & CommandOptions) => {\n let parsed;\n try {\n parsed = JSON.parse(options.transactions);\n } catch {\n throw new YnabCliError('Invalid JSON in --transactions parameter', 400);\n }\n\n const updates = validateBatchUpdates(parsed);\n\n const transactionsInMilliunits = updates.map((update) => ({\n ...update,\n ...(update.amount !== undefined\n ? { amount: amountToMilliunits(update.amount) }\n : {}),\n }));\n\n const result = await client.updateTransactions(\n { transactions: transactionsInMilliunits as Parameters<typeof client.updateTransactions>[0]['transactions'] },\n options.budget\n );\n outputJson(result);\n }\n )\n );\n\n cmd\n .command('search')\n .description('Search transactions')\n .option('-b, --budget <id>', 'Budget ID')\n .option('--memo <text>', 'Search in memo field')\n .option('--payee-name <name>', 'Search in payee name')\n .option('--amount <amount>', 'Search for exact amount in currency units', parseFloat)\n .option('--since <date>', 'Search transactions since date')\n .option('--until <date>', 'Search transactions until date')\n .option('--approved <value>', 'Filter by approval status: true or false')\n .option(\n '--status <statuses>',\n 'Filter by cleared status: cleared, uncleared, reconciled (comma-separated)'\n )\n .option('--fields <fields>', 'Comma-separated list of fields to include')\n .action(\n withErrorHandling(\n async (\n options: {\n budget?: string;\n memo?: string;\n payeeName?: string;\n amount?: number;\n since?: string;\n until?: string;\n approved?: string;\n status?: string;\n fields?: string;\n } & CommandOptions\n ) => {\n if (!options.memo && !options.payeeName && options.amount === undefined) {\n throw new YnabCliError(\n 'At least one search criteria required: --memo, --payee-name, or --amount',\n 400\n );\n }\n\n const params = {\n budgetId: options.budget,\n sinceDate: options.since ? parseDate(options.since) : undefined,\n };\n\n const result = await client.getTransactions(params);\n let transactions = result?.transactions || [];\n\n if (options.memo) {\n const searchTerm = options.memo.toLowerCase();\n transactions = transactions.filter((t) => t.memo?.toLowerCase().includes(searchTerm));\n }\n\n if (options.payeeName) {\n const searchTerm = options.payeeName.toLowerCase();\n transactions = transactions.filter((t) =>\n t.payee_name?.toLowerCase().includes(searchTerm)\n );\n }\n\n if (options.amount !== undefined) {\n const amountMilliunits = amountToMilliunits(options.amount);\n transactions = transactions.filter((t) => t.amount === amountMilliunits);\n }\n\n transactions = applyTransactionFilters(transactions, {\n until: options.until ? parseDate(options.until) : undefined,\n approved: options.approved,\n status: options.status,\n });\n\n const filteredTransactions = applyFieldSelection(transactions, options.fields);\n\n outputJson(filteredTransactions);\n }\n )\n );\n\n cmd\n .command('summary')\n .description('Summarize transactions with aggregate counts by payee, category, and status')\n .option('-b, --budget <id>', 'Budget ID')\n .option('--account <id>', 'Filter by account ID')\n .option('--category <id>', 'Filter by category ID')\n .option('--payee <id>', 'Filter by payee ID')\n .option('--since <date>', 'Filter transactions since date')\n .option('--until <date>', 'Filter transactions until date')\n .option('--type <type>', 'Filter by transaction type')\n .option('--approved <value>', 'Filter by approval status: true or false')\n .option(\n '--status <statuses>',\n 'Filter by cleared status: cleared, uncleared, reconciled (comma-separated)'\n )\n .option('--min-amount <amount>', 'Minimum amount in currency units', parseFloat)\n .option('--max-amount <amount>', 'Maximum amount in currency units', parseFloat)\n .option('--top <number>', 'Limit payee/category breakdowns to top N entries', parseInt)\n .action(\n withErrorHandling(\n async (\n options: {\n budget?: string;\n account?: string;\n category?: string;\n payee?: string;\n since?: string;\n until?: string;\n type?: string;\n approved?: string;\n status?: string;\n minAmount?: number;\n maxAmount?: number;\n top?: number;\n } & CommandOptions\n ) => {\n const result = await fetchTransactions(options);\n const transactions = result?.transactions || [];\n\n const filtered = applyTransactionFilters(transactions as TransactionLike[], {\n until: options.until ? parseDate(options.until) : undefined,\n approved: options.approved,\n status: options.status,\n minAmount: options.minAmount,\n maxAmount: options.maxAmount,\n });\n\n const summary = summarizeTransactions(\n filtered as SummaryTransaction[],\n options.top ? { top: options.top } : undefined\n );\n outputJson(summary);\n }\n )\n );\n\n cmd\n .command('find-transfers')\n .description('Find candidate transfer matches for a transaction across accounts')\n .argument('<id>', 'Transaction ID')\n .option('-b, --budget <id>', 'Budget ID')\n .option('--days <number>', 'Maximum date difference in days (default: 3)', parseInt)\n .option('--since <date>', 'Search transactions since date (defaults to source date minus --days)')\n .action(\n withErrorHandling(\n async (\n id: string,\n options: {\n budget?: string;\n days?: number;\n since?: string;\n } & CommandOptions\n ) => {\n const maxDays = options.days ?? 3;\n const source = await client.getTransaction(id, options.budget);\n\n const sinceDate = options.since\n ? parseDate(options.since)\n : dayjs(source.date).subtract(maxDays, 'day').format('YYYY-MM-DD');\n\n const result = await client.getTransactions({\n budgetId: options.budget,\n sinceDate,\n });\n\n const allTransactions = result?.transactions || [];\n const candidates = findTransferCandidates(\n source as SummaryTransaction,\n allTransactions as SummaryTransaction[],\n { maxDays }\n );\n\n outputJson({ source, candidates });\n }\n )\n );\n\n return cmd;\n}\n","import { YnabCliError } from './errors.js';\n\nexport interface TransactionSplit {\n amount: number;\n category_id?: string | null;\n memo?: string;\n payee_id?: string;\n}\n\nexport function validateTransactionSplits(data: unknown): TransactionSplit[] {\n if (!Array.isArray(data)) {\n throw new YnabCliError('Transaction splits must be an array', 400);\n }\n\n return data.map((item, index) => {\n if (typeof item !== 'object' || item === null) {\n throw new YnabCliError(`Split at index ${index} must be an object`, 400);\n }\n\n const split = item as Record<string, unknown>;\n\n if (typeof split.amount !== 'number') {\n throw new YnabCliError(`Split at index ${index} must have a numeric amount`, 400);\n }\n\n return {\n amount: split.amount,\n category_id: split.category_id as string | null | undefined,\n memo: split.memo as string | undefined,\n payee_id: split.payee_id as string | undefined,\n };\n });\n}\n\nexport interface BatchTransactionUpdate {\n id?: string | null;\n import_id?: string | null;\n account_id?: string;\n date?: string;\n amount?: number;\n payee_id?: string | null;\n payee_name?: string | null;\n category_id?: string | null;\n memo?: string | null;\n cleared?: string;\n approved?: boolean;\n flag_color?: string | null;\n}\n\nconst BATCH_UPDATE_FIELDS: (keyof BatchTransactionUpdate)[] = [\n 'id', 'import_id', 'account_id', 'date', 'amount',\n 'payee_id', 'payee_name', 'category_id', 'memo',\n 'cleared', 'approved', 'flag_color',\n];\n\nexport function validateBatchUpdates(data: unknown): BatchTransactionUpdate[] {\n if (!Array.isArray(data)) {\n throw new YnabCliError('Batch updates must be an array', 400);\n }\n\n return data.map((item, index) => {\n if (typeof item !== 'object' || item === null) {\n throw new YnabCliError(`Update at index ${index} must be an object`, 400);\n }\n\n const update = item as Record<string, unknown>;\n\n if (!update.id && !update.import_id) {\n throw new YnabCliError(\n `Update at index ${index} must have either \"id\" or \"import_id\"`,\n 400\n );\n }\n\n const result: Record<string, unknown> = {};\n for (const field of BATCH_UPDATE_FIELDS) {\n if (update[field] !== undefined) {\n result[field] = update[field];\n }\n }\n return result as BatchTransactionUpdate;\n });\n}\n\nexport function validateApiData(data: unknown): Record<string, unknown> {\n if (typeof data !== 'object' || data === null || Array.isArray(data)) {\n throw new YnabCliError('API data must be an object', 400);\n }\n return data as Record<string, unknown>;\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling, requireConfirmation } from '../lib/command-utils.js';\nimport type { CommandOptions } from '../types/index.js';\n\nexport function createScheduledCommand(): Command {\n const cmd = new Command('scheduled').description('Scheduled transaction operations');\n\n cmd\n .command('list')\n .description('List all scheduled transactions')\n .option('-b, --budget <id>', 'Budget ID')\n .option('--last-knowledge <number>', 'Last knowledge of server', parseInt)\n .action(\n withErrorHandling(\n async (options: { budget?: string; lastKnowledge?: number } & CommandOptions) => {\n const result = await client.getScheduledTransactions(\n options.budget,\n options.lastKnowledge\n );\n outputJson(result?.scheduled_transactions);\n }\n )\n );\n\n cmd\n .command('view')\n .description('View scheduled transaction')\n .argument('<id>', 'Scheduled transaction ID')\n .option('-b, --budget <id>', 'Budget ID')\n .action(\n withErrorHandling(async (id: string, options: CommandOptions) => {\n const scheduledTransaction = await client.getScheduledTransaction(id, options.budget);\n outputJson(scheduledTransaction);\n })\n );\n\n cmd\n .command('delete')\n .description('Delete scheduled transaction')\n .argument('<id>', 'Scheduled transaction ID')\n .option('-b, --budget <id>', 'Budget ID')\n .option('-y, --yes', 'Skip confirmation')\n .action(\n withErrorHandling(\n async (id: string, options: { budget?: string; yes?: boolean } & CommandOptions) => {\n requireConfirmation('scheduled transaction', options.yes);\n const scheduledTransaction = await client.deleteScheduledTransaction(id, options.budget);\n outputJson({\n message: 'Scheduled transaction deleted',\n scheduled_transaction: scheduledTransaction,\n });\n }\n )\n );\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { outputJson } from '../lib/output.js';\nimport { YnabCliError } from '../lib/errors.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\nimport { applyFieldSelection } from '../lib/utils.js';\nimport { parseDate } from '../lib/dates.js';\nimport type { CommandOptions } from '../types/index.js';\n\nexport function createPayeesCommand(): Command {\n const cmd = new Command('payees').description('Payee operations');\n\n cmd\n .command('list')\n .description('List all payees')\n .option('-b, --budget <id>', 'Budget ID')\n .option('--last-knowledge <number>', 'Last knowledge of server', parseInt)\n .action(\n withErrorHandling(\n async (options: { budget?: string; lastKnowledge?: number } & CommandOptions) => {\n const result = await client.getPayees(options.budget, options.lastKnowledge);\n outputJson(result?.payees);\n }\n )\n );\n\n cmd\n .command('view')\n .description('View payee details')\n .argument('<id>', 'Payee ID')\n .option('-b, --budget <id>', 'Budget ID')\n .action(\n withErrorHandling(async (id: string, options: CommandOptions) => {\n const payee = await client.getPayee(id, options.budget);\n outputJson(payee);\n })\n );\n\n cmd\n .command('update')\n .description('Rename payee')\n .argument('<id>', 'Payee ID')\n .requiredOption('--name <name>', 'New payee name')\n .option('-b, --budget <id>', 'Budget ID')\n .action(\n withErrorHandling(\n async (id: string, options: { name: string; budget?: string } & CommandOptions) => {\n if (!options.name?.trim()) {\n throw new YnabCliError('Name cannot be empty', 400);\n }\n\n const payee = await client.updatePayee(\n id,\n { payee: { name: options.name } },\n options.budget\n );\n outputJson(payee);\n }\n )\n );\n\n cmd\n .command('locations')\n .description('List locations for payee')\n .argument('<id>', 'Payee ID')\n .option('-b, --budget <id>', 'Budget ID')\n .action(\n withErrorHandling(async (id: string, options: CommandOptions) => {\n const locations = await client.getPayeeLocationsByPayee(id, options.budget);\n outputJson(locations);\n })\n );\n\n cmd\n .command('transactions')\n .description('List transactions for payee')\n .argument('<id>', 'Payee ID')\n .option('-b, --budget <id>', 'Budget ID')\n .option('--since <date>', 'Filter transactions since date')\n .option('--type <type>', 'Filter by transaction type')\n .option('--last-knowledge <number>', 'Last knowledge of server', parseInt)\n .option(\n '--fields <fields>',\n 'Comma-separated list of fields to include (e.g., id,date,amount,memo)'\n )\n .action(\n withErrorHandling(\n async (\n id: string,\n options: {\n budget?: string;\n since?: string;\n type?: string;\n lastKnowledge?: number;\n fields?: string;\n } & CommandOptions\n ) => {\n const result = await client.getTransactionsByPayee(id, {\n budgetId: options.budget,\n sinceDate: options.since ? parseDate(options.since) : undefined,\n type: options.type,\n lastKnowledgeOfServer: options.lastKnowledge,\n });\n const transactions = result?.transactions || [];\n outputJson(applyFieldSelection(transactions, options.fields));\n }\n )\n );\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\nimport { parseDate } from '../lib/dates.js';\nimport type { CommandOptions } from '../types/index.js';\n\nexport function createMonthsCommand(): Command {\n const cmd = new Command('months').description('Monthly budget operations');\n\n cmd\n .command('list')\n .description('List all budget months')\n .option('-b, --budget <id>', 'Budget ID')\n .option('--last-knowledge <number>', 'Last knowledge of server', parseInt)\n .action(\n withErrorHandling(\n async (options: { budget?: string; lastKnowledge?: number } & CommandOptions) => {\n const result = await client.getBudgetMonths(options.budget, options.lastKnowledge);\n outputJson(result?.months);\n }\n )\n );\n\n cmd\n .command('view')\n .description('View specific month details')\n .argument('<month>', 'Budget month (e.g., 2025-07-01)')\n .option('-b, --budget <id>', 'Budget ID')\n .action(\n withErrorHandling(async (month: string, options: CommandOptions) => {\n const monthData = await client.getBudgetMonth(parseDate(month), options.budget);\n outputJson(monthData);\n })\n );\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { outputJson } from '../lib/output.js';\nimport { YnabCliError } from '../lib/errors.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\nimport { validateApiData } from '../lib/schemas.js';\nimport type { CommandOptions } from '../types/index.js';\n\nconst VALID_HTTP_METHODS = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'];\n\nexport function createApiCommand(): Command {\n const cmd = new Command('api').description('Raw API access');\n\n cmd\n .argument('<method>', 'HTTP method (GET, POST, PUT, PATCH, DELETE)')\n .argument('<path>', 'API path (e.g., /budgets or /budgets/{budget_id}/transactions)')\n .option('-b, --budget <id>', 'Budget ID (used to replace {budget_id} in path)')\n .option('--data <json>', 'JSON data for POST/PUT/PATCH requests')\n .description('Make raw API calls to YNAB')\n .action(\n withErrorHandling(\n async (\n method: string,\n path: string,\n options: { budget?: string; data?: string } & CommandOptions\n ) => {\n const upperMethod = method.toUpperCase();\n\n if (!VALID_HTTP_METHODS.includes(upperMethod)) {\n throw new YnabCliError(\n `Invalid HTTP method: ${method}. Must be one of: ${VALID_HTTP_METHODS.join(', ')}`,\n 400\n );\n }\n\n let data: Record<string, unknown> | undefined;\n if (options.data) {\n let parsedData: unknown;\n try {\n parsedData = JSON.parse(options.data);\n } catch {\n throw new YnabCliError('Invalid JSON in --data parameter', 400);\n }\n data = validateApiData(parsedData);\n }\n\n const result = await client.rawApiCall(upperMethod, path, data, options.budget);\n outputJson(result);\n }\n )\n );\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { runMcpServer } from '../mcp/server.js';\n\nexport function createMcpCommand(): Command {\n const cmd = new Command('mcp').description('Run YNAB MCP server');\n\n cmd.action(async () => {\n await runMcpServer();\n });\n\n return cmd;\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { z } from 'zod';\nimport { client } from '../lib/api-client.js';\nimport { auth } from '../lib/auth.js';\nimport { YnabCliError, sanitizeApiError, sanitizeErrorMessage } from '../lib/errors.js';\nimport { amountToMilliunits, applyFieldSelection, applyTransactionFilters, convertMilliunitsToAmounts, summarizeTransactions, findTransferCandidates, type SummaryTransaction, type TransactionLike } from '../lib/utils.js';\n\nconst toolRegistry = [\n { name: 'list_budgets', description: 'List all budgets in the YNAB account' },\n { name: 'get_budget', description: 'Get detailed information about a specific budget' },\n { name: 'get_budget_settings', description: 'Get budget settings (date format, currency format, etc.)' },\n { name: 'list_accounts', description: 'List all accounts in a budget' },\n { name: 'get_account', description: 'Get detailed information about a specific account' },\n { name: 'list_categories', description: 'List all category groups and categories in a budget' },\n { name: 'get_category', description: 'Get detailed information about a specific category' },\n { name: 'update_category', description: 'Update category name, note, group, or goal target' },\n { name: 'update_month_category', description: 'Set the budgeted amount for a category in a specific month' },\n { name: 'list_transactions', description: 'List transactions with optional filtering' },\n { name: 'get_transaction', description: 'Get detailed information about a specific transaction' },\n { name: 'create_transaction', description: 'Create a new transaction' },\n { name: 'update_transaction', description: 'Update an existing transaction' },\n { name: 'delete_transaction', description: 'Delete a transaction' },\n { name: 'import_transactions', description: 'Trigger import of linked bank transactions' },\n { name: 'batch_update_transactions', description: 'Update multiple transactions in a single API call' },\n { name: 'summarize_transactions', description: 'Get aggregate summary of transactions by payee, category, and status' },\n { name: 'find_transfer_candidates', description: 'Find candidate transfer matches for a transaction across accounts' },\n { name: 'list_transactions_by_account', description: 'List transactions for a specific account' },\n { name: 'list_transactions_by_category', description: 'List transactions for a specific category' },\n { name: 'list_transactions_by_payee', description: 'List transactions for a specific payee' },\n { name: 'list_payees', description: 'List all payees in a budget' },\n { name: 'update_payee', description: 'Rename a payee' },\n { name: 'list_payee_locations', description: 'List locations for a specific payee' },\n { name: 'list_budget_months', description: 'List all budget months' },\n { name: 'get_budget_month', description: 'Get budget details for a specific month' },\n { name: 'list_scheduled_transactions', description: 'List all scheduled transactions in a budget' },\n { name: 'get_scheduled_transaction', description: 'Get a single scheduled transaction' },\n { name: 'delete_scheduled_transaction', description: 'Delete a scheduled transaction' },\n { name: 'raw_api_call', description: 'Make a direct YNAB API call' },\n { name: 'get_user', description: 'Get information about the authenticated user' },\n { name: 'check_auth', description: 'Check if YNAB authentication is configured' },\n];\n\nconst server = new McpServer({\n name: 'ynab',\n version: '1.0.0',\n});\n\nfunction mcpErrorResult(error: unknown) {\n let errorBody: Record<string, unknown>;\n\n if (typeof error === 'object' && error !== null && 'error' in error) {\n const apiError = sanitizeApiError((error as { error: unknown }).error);\n errorBody = { name: apiError.name, detail: apiError.detail };\n } else if (error instanceof YnabCliError) {\n errorBody = { name: 'cli_error', detail: sanitizeErrorMessage(error.message) };\n } else if (error instanceof Error) {\n errorBody = { name: error.name, detail: sanitizeErrorMessage(error.message) };\n } else {\n errorBody = { name: 'unknown_error', detail: 'An unexpected error occurred' };\n }\n\n return {\n content: [{ type: 'text' as const, text: JSON.stringify({ error: errorBody }) }],\n isError: true as const,\n };\n}\n\n// Wrap all tool handlers so errors become structured MCP error results\n// instead of propagating as unhandled exceptions\nconst _serverTool = server.tool.bind(server);\n(server.tool as unknown) = (...args: unknown[]) => {\n const handler = args[args.length - 1];\n if (typeof handler === 'function') {\n args[args.length - 1] = async (...handlerArgs: unknown[]) => {\n try {\n return await (handler as Function)(...handlerArgs);\n } catch (error) {\n return mcpErrorResult(error);\n }\n };\n }\n return (_serverTool as Function).apply(null, args);\n};\n\nfunction jsonResponse(data: unknown) {\n return { content: [{ type: 'text' as const, text: JSON.stringify(data, null, 2) }] };\n}\n\nfunction currencyResponse(data: unknown) {\n return jsonResponse(convertMilliunitsToAmounts(data));\n}\n\nserver.tool(\n 'list_budgets',\n 'List all budgets in the YNAB account',\n { includeAccounts: z.boolean().optional().describe('Include account details') },\n async ({ includeAccounts }) => currencyResponse(await client.getBudgets(includeAccounts))\n);\n\nserver.tool(\n 'get_budget',\n 'Get detailed information about a specific budget',\n { budgetId: z.string().optional().describe('Budget ID (uses default if not specified)') },\n async ({ budgetId }) => currencyResponse(await client.getBudget(budgetId))\n);\n\nserver.tool(\n 'get_budget_settings',\n 'Get budget settings (date format, currency format, etc.)',\n { budgetId: z.string().optional().describe('Budget ID (uses default if not specified)') },\n async ({ budgetId }) => jsonResponse(await client.getBudgetSettings(budgetId))\n);\n\nserver.tool(\n 'list_accounts',\n 'List all accounts in a budget',\n { budgetId: z.string().optional().describe('Budget ID (uses default if not specified)') },\n async ({ budgetId }) => currencyResponse(await client.getAccounts(budgetId))\n);\n\nserver.tool(\n 'get_account',\n 'Get detailed information about a specific account',\n {\n accountId: z.string().describe('Account ID'),\n budgetId: z.string().optional().describe('Budget ID (uses default if not specified)'),\n },\n async ({ accountId, budgetId }) => currencyResponse(await client.getAccount(accountId, budgetId))\n);\n\nserver.tool(\n 'list_categories',\n 'List all category groups and categories in a budget',\n { budgetId: z.string().optional().describe('Budget ID (uses default if not specified)') },\n async ({ budgetId }) => currencyResponse(await client.getCategories(budgetId))\n);\n\nserver.tool(\n 'get_category',\n 'Get detailed information about a specific category',\n {\n categoryId: z.string().describe('Category ID'),\n budgetId: z.string().optional().describe('Budget ID (uses default if not specified)'),\n },\n async ({ categoryId, budgetId }) => currencyResponse(await client.getCategory(categoryId, budgetId))\n);\n\nserver.tool(\n 'update_category',\n 'Update category name, note, group, or goal target',\n {\n categoryId: z.string().describe('Category ID'),\n name: z.string().optional().describe('New category name'),\n note: z.string().optional().describe('Category note (use empty string to clear)'),\n categoryGroupId: z.string().optional().describe('Move to a different category group'),\n goalTarget: z.number().optional().describe('Goal target amount in dollars (ignored if category has no goal)'),\n budgetId: z.string().optional().describe('Budget ID (uses default if not specified)'),\n },\n async ({ categoryId, name, note, categoryGroupId, goalTarget, budgetId }) => {\n const updateData: Record<string, unknown> = {};\n if (name !== undefined) updateData.name = name.trim();\n if (note !== undefined) updateData.note = note.trim() || null;\n if (categoryGroupId !== undefined) updateData.category_group_id = categoryGroupId;\n if (goalTarget !== undefined) updateData.goal_target = amountToMilliunits(goalTarget);\n return currencyResponse(await client.updateCategory(categoryId, { category: updateData }, budgetId));\n }\n);\n\nserver.tool(\n 'update_month_category',\n 'Set the budgeted amount for a category in a specific month',\n {\n categoryId: z.string().describe('Category ID'),\n month: z.string().describe('Budget month (YYYY-MM-DD, day is ignored)'),\n budgeted: z.number().describe('Budgeted amount in dollars'),\n budgetId: z.string().optional().describe('Budget ID (uses default if not specified)'),\n },\n async ({ categoryId, month, budgeted, budgetId }) =>\n currencyResponse(\n await client.updateMonthCategory(month, categoryId, { category: { budgeted: amountToMilliunits(budgeted) } }, budgetId)\n )\n);\n\nserver.tool(\n 'list_transactions',\n 'List transactions with optional filtering',\n {\n budgetId: z.string().optional().describe('Budget ID (uses default if not specified)'),\n sinceDate: z.string().optional().describe('Only return transactions on or after this date (YYYY-MM-DD)'),\n type: z.enum(['uncategorized', 'unapproved']).optional().describe('Filter by transaction type'),\n lastKnowledgeOfServer: z.number().optional().describe('Delta sync: only return changes since this server knowledge value. Response includes server_knowledge for next call.'),\n limit: z.number().optional().describe('Maximum number of transactions to return'),\n fields: z.string().optional().describe('Comma-separated list of fields to include (e.g., id,date,amount,memo)'),\n },\n async ({ budgetId, sinceDate, type, lastKnowledgeOfServer, limit, fields }) => {\n const result = await client.getTransactions({ budgetId, sinceDate, type, lastKnowledgeOfServer });\n let transactions = result?.transactions || [];\n if (limit && limit > 0) transactions = transactions.slice(0, limit);\n const selected = fields ? applyFieldSelection(transactions, fields) : transactions;\n return currencyResponse({ transactions: selected, server_knowledge: result?.server_knowledge });\n }\n);\n\nserver.tool(\n 'get_transaction',\n 'Get detailed information about a specific transaction',\n {\n transactionId: z.string().describe('Transaction ID'),\n budgetId: z.string().optional().describe('Budget ID (uses default if not specified)'),\n },\n async ({ transactionId, budgetId }) => currencyResponse(await client.getTransaction(transactionId, budgetId))\n);\n\nserver.tool(\n 'create_transaction',\n 'Create a new transaction',\n {\n accountId: z.string().describe('Account ID'),\n date: z.string().describe('Transaction date (YYYY-MM-DD)'),\n amount: z.number().describe('Amount in dollars (negative for outflow, positive for inflow)'),\n payeeName: z.string().optional().describe('Payee name (creates new payee if not found)'),\n payeeId: z.string().optional().describe('Payee ID'),\n categoryId: z.string().optional().describe('Category ID'),\n memo: z.string().optional().describe('Transaction memo'),\n cleared: z.enum(['cleared', 'uncleared', 'reconciled']).optional().describe('Cleared status'),\n approved: z.boolean().optional().describe('Whether the transaction is approved'),\n budgetId: z.string().optional().describe('Budget ID (uses default if not specified)'),\n },\n async ({ accountId, date, amount, payeeName, payeeId, categoryId, memo, cleared, approved, budgetId }) => {\n const transaction: Record<string, unknown> = {\n account_id: accountId,\n date,\n amount: amountToMilliunits(amount),\n };\n if (payeeName !== undefined) transaction.payee_name = payeeName;\n if (payeeId !== undefined) transaction.payee_id = payeeId;\n if (categoryId !== undefined) transaction.category_id = categoryId;\n if (memo !== undefined) transaction.memo = memo;\n if (cleared !== undefined) transaction.cleared = cleared;\n if (approved !== undefined) transaction.approved = approved;\n return currencyResponse(await client.createTransaction({ transaction }, budgetId));\n }\n);\n\nserver.tool(\n 'update_transaction',\n 'Update an existing transaction',\n {\n transactionId: z.string().describe('Transaction ID'),\n accountId: z.string().optional().describe('Account ID'),\n date: z.string().optional().describe('Transaction date (YYYY-MM-DD)'),\n amount: z.number().optional().describe('Amount in dollars (negative for outflow, positive for inflow)'),\n payeeName: z.string().optional().describe('Payee name'),\n payeeId: z.string().optional().describe('Payee ID'),\n categoryId: z.string().optional().describe('Category ID'),\n memo: z.string().optional().describe('Transaction memo'),\n cleared: z.enum(['cleared', 'uncleared', 'reconciled']).optional().describe('Cleared status'),\n approved: z.boolean().optional().describe('Whether the transaction is approved'),\n budgetId: z.string().optional().describe('Budget ID (uses default if not specified)'),\n },\n async ({ transactionId, accountId, date, amount, payeeName, payeeId, categoryId, memo, cleared, approved, budgetId }) => {\n const transaction: Record<string, unknown> = {};\n if (accountId !== undefined) transaction.account_id = accountId;\n if (date !== undefined) transaction.date = date;\n if (amount !== undefined) transaction.amount = amountToMilliunits(amount);\n if (payeeName !== undefined) transaction.payee_name = payeeName;\n if (payeeId !== undefined) transaction.payee_id = payeeId;\n if (categoryId !== undefined) transaction.category_id = categoryId;\n if (memo !== undefined) transaction.memo = memo;\n if (cleared !== undefined) transaction.cleared = cleared;\n if (approved !== undefined) transaction.approved = approved;\n return currencyResponse(await client.updateTransaction(transactionId, { transaction }, budgetId));\n }\n);\n\nserver.tool(\n 'delete_transaction',\n 'Delete a transaction',\n {\n transactionId: z.string().describe('Transaction ID'),\n budgetId: z.string().optional().describe('Budget ID (uses default if not specified)'),\n },\n async ({ transactionId, budgetId }) =>\n currencyResponse(await client.deleteTransaction(transactionId, budgetId))\n);\n\nserver.tool(\n 'import_transactions',\n 'Trigger import of linked bank transactions',\n { budgetId: z.string().optional().describe('Budget ID (uses default if not specified)') },\n async ({ budgetId }) => jsonResponse(await client.importTransactions(budgetId))\n);\n\nserver.tool(\n 'batch_update_transactions',\n 'Update multiple transactions in a single API call. Amounts in dollars.',\n {\n transactions: z.array(z.object({\n id: z.string().optional().nullable().describe('Transaction ID (required if no import_id)'),\n import_id: z.string().optional().nullable().describe('Import ID (required if no id)'),\n account_id: z.string().optional().describe('Account ID'),\n date: z.string().optional().describe('Transaction date (YYYY-MM-DD)'),\n amount: z.number().optional().describe('Amount in dollars (negative for outflow)'),\n payee_id: z.string().optional().nullable().describe('Payee ID'),\n payee_name: z.string().optional().nullable().describe('Payee name'),\n category_id: z.string().optional().nullable().describe('Category ID'),\n memo: z.string().optional().nullable().describe('Transaction memo'),\n cleared: z.enum(['cleared', 'uncleared', 'reconciled']).optional().describe('Cleared status'),\n approved: z.boolean().optional().describe('Whether the transaction is approved'),\n flag_color: z.enum(['red', 'orange', 'yellow', 'green', 'blue', 'purple']).optional().nullable().describe('Flag color'),\n })).describe('Array of transaction updates'),\n budgetId: z.string().optional().describe('Budget ID (uses default if not specified)'),\n },\n async ({ transactions, budgetId }) => {\n const transactionsInMilliunits = transactions.map((update) => ({\n ...update,\n ...(update.amount !== undefined ? { amount: amountToMilliunits(update.amount) } : {}),\n }));\n return currencyResponse(\n await client.updateTransactions(\n { transactions: transactionsInMilliunits as Parameters<typeof client.updateTransactions>[0]['transactions'] },\n budgetId\n )\n );\n }\n);\n\nserver.tool(\n 'summarize_transactions',\n 'Get aggregate summary of transactions by payee, category, and status',\n {\n budgetId: z.string().optional().describe('Budget ID (uses default if not specified)'),\n sinceDate: z.string().optional().describe('Only return transactions on or after this date (YYYY-MM-DD)'),\n untilDate: z.string().optional().describe('Only return transactions on or before this date (YYYY-MM-DD)'),\n type: z.enum(['uncategorized', 'unapproved']).optional().describe('Filter by transaction type'),\n approved: z.enum(['true', 'false']).optional().describe('Filter by approval status'),\n status: z.string().optional().describe('Filter by cleared status: cleared, uncleared, reconciled (comma-separated)'),\n minAmount: z.number().optional().describe('Minimum amount in dollars'),\n maxAmount: z.number().optional().describe('Maximum amount in dollars'),\n top: z.number().optional().describe('Limit payee/category breakdowns to top N entries'),\n },\n async ({ budgetId, sinceDate, untilDate, type, approved, status, minAmount, maxAmount, top }) => {\n const result = await client.getTransactions({ budgetId, sinceDate, type });\n const transactions = result?.transactions || [];\n const filtered = applyTransactionFilters(transactions as TransactionLike[], {\n until: untilDate,\n approved,\n status,\n minAmount,\n maxAmount,\n });\n const summary = summarizeTransactions(\n filtered as SummaryTransaction[],\n top ? { top } : undefined\n );\n return currencyResponse(summary);\n }\n);\n\nserver.tool(\n 'find_transfer_candidates',\n 'Find candidate transfer matches for a transaction across accounts',\n {\n transactionId: z.string().describe('Transaction ID to find transfers for'),\n budgetId: z.string().optional().describe('Budget ID (uses default if not specified)'),\n maxDays: z.number().optional().describe('Maximum date difference in days (default: 3)'),\n sinceDate: z.string().optional().describe('Search transactions since date (defaults to source date minus maxDays)'),\n },\n async ({ transactionId, budgetId, maxDays: maxDaysParam, sinceDate }) => {\n const days = maxDaysParam ?? 3;\n const source = await client.getTransaction(transactionId, budgetId);\n if (!sinceDate) {\n const d = new Date(source.date);\n d.setDate(d.getDate() - days);\n sinceDate = d.toISOString().split('T')[0];\n }\n const result = await client.getTransactions({ budgetId, sinceDate });\n const allTransactions = result?.transactions || [];\n const candidates = findTransferCandidates(\n source as SummaryTransaction,\n allTransactions as SummaryTransaction[],\n { maxDays: days }\n );\n return currencyResponse({ source, candidates });\n }\n);\n\nserver.tool(\n 'list_transactions_by_account',\n 'List transactions for a specific account',\n {\n accountId: z.string().describe('Account ID'),\n budgetId: z.string().optional().describe('Budget ID (uses default if not specified)'),\n sinceDate: z.string().optional().describe('Only return transactions on or after this date (YYYY-MM-DD)'),\n fields: z.string().optional().describe('Comma-separated list of fields to include (e.g., id,date,amount,memo)'),\n },\n async ({ accountId, budgetId, sinceDate, fields }) => {\n const result = await client.getTransactionsByAccount(accountId, { budgetId, sinceDate });\n if (!fields) return currencyResponse(result);\n return currencyResponse(applyFieldSelection(result?.transactions || [], fields));\n }\n);\n\nserver.tool(\n 'list_transactions_by_category',\n 'List transactions for a specific category',\n {\n categoryId: z.string().describe('Category ID'),\n budgetId: z.string().optional().describe('Budget ID (uses default if not specified)'),\n sinceDate: z.string().optional().describe('Only return transactions on or after this date (YYYY-MM-DD)'),\n fields: z.string().optional().describe('Comma-separated list of fields to include (e.g., id,date,amount,memo)'),\n },\n async ({ categoryId, budgetId, sinceDate, fields }) => {\n const result = await client.getTransactionsByCategory(categoryId, { budgetId, sinceDate });\n if (!fields) return currencyResponse(result);\n return currencyResponse(applyFieldSelection(result?.transactions || [], fields));\n }\n);\n\nserver.tool(\n 'list_transactions_by_payee',\n 'List transactions for a specific payee',\n {\n payeeId: z.string().describe('Payee ID'),\n budgetId: z.string().optional().describe('Budget ID (uses default if not specified)'),\n sinceDate: z.string().optional().describe('Only return transactions on or after this date (YYYY-MM-DD)'),\n fields: z.string().optional().describe('Comma-separated list of fields to include (e.g., id,date,amount,memo)'),\n },\n async ({ payeeId, budgetId, sinceDate, fields }) => {\n const result = await client.getTransactionsByPayee(payeeId, { budgetId, sinceDate });\n if (!fields) return currencyResponse(result);\n return currencyResponse(applyFieldSelection(result?.transactions || [], fields));\n }\n);\n\nserver.tool(\n 'list_payees',\n 'List all payees in a budget',\n { budgetId: z.string().optional().describe('Budget ID (uses default if not specified)') },\n async ({ budgetId }) => jsonResponse(await client.getPayees(budgetId))\n);\n\nserver.tool(\n 'update_payee',\n 'Rename a payee',\n {\n payeeId: z.string().describe('Payee ID'),\n name: z.string().describe('New payee name'),\n budgetId: z.string().optional().describe('Budget ID (uses default if not specified)'),\n },\n async ({ payeeId, name, budgetId }) =>\n jsonResponse(await client.updatePayee(payeeId, { payee: { name } }, budgetId))\n);\n\nserver.tool(\n 'list_payee_locations',\n 'List locations for a specific payee',\n {\n payeeId: z.string().describe('Payee ID'),\n budgetId: z.string().optional().describe('Budget ID (uses default if not specified)'),\n },\n async ({ payeeId, budgetId }) =>\n jsonResponse(await client.getPayeeLocationsByPayee(payeeId, budgetId))\n);\n\nserver.tool(\n 'list_budget_months',\n 'List all budget months',\n { budgetId: z.string().optional().describe('Budget ID (uses default if not specified)') },\n async ({ budgetId }) => currencyResponse(await client.getBudgetMonths(budgetId))\n);\n\nserver.tool(\n 'get_budget_month',\n 'Get budget details for a specific month',\n {\n month: z.string().describe('Month in YYYY-MM-DD format (day is ignored, use first of month)'),\n budgetId: z.string().optional().describe('Budget ID (uses default if not specified)'),\n },\n async ({ month, budgetId }) => currencyResponse(await client.getBudgetMonth(month, budgetId))\n);\n\nserver.tool(\n 'list_scheduled_transactions',\n 'List all scheduled transactions in a budget',\n { budgetId: z.string().optional().describe('Budget ID (uses default if not specified)') },\n async ({ budgetId }) => currencyResponse(await client.getScheduledTransactions(budgetId))\n);\n\nserver.tool(\n 'get_scheduled_transaction',\n 'Get a single scheduled transaction',\n {\n scheduledTransactionId: z.string().describe('Scheduled transaction ID'),\n budgetId: z.string().optional().describe('Budget ID (uses default if not specified)'),\n },\n async ({ scheduledTransactionId, budgetId }) =>\n currencyResponse(await client.getScheduledTransaction(scheduledTransactionId, budgetId))\n);\n\nserver.tool(\n 'delete_scheduled_transaction',\n 'Delete a scheduled transaction',\n {\n scheduledTransactionId: z.string().describe('Scheduled transaction ID'),\n budgetId: z.string().optional().describe('Budget ID (uses default if not specified)'),\n },\n async ({ scheduledTransactionId, budgetId }) =>\n currencyResponse(await client.deleteScheduledTransaction(scheduledTransactionId, budgetId))\n);\n\nserver.tool(\n 'raw_api_call',\n 'Make a direct YNAB API call',\n {\n method: z.enum(['GET', 'POST', 'PUT', 'PATCH', 'DELETE']).describe('HTTP method'),\n path: z.string().describe('API path (e.g., /budgets/{budget_id}/accounts). {budget_id} is replaced with the default budget.'),\n data: z.record(z.unknown()).optional().describe('Request body for POST/PUT/PATCH'),\n budgetId: z.string().optional().describe('Budget ID for {budget_id} replacement (uses default if not specified)'),\n },\n async ({ method, path, data, budgetId }) =>\n jsonResponse(await client.rawApiCall(method, path, data, budgetId))\n);\n\nserver.tool(\n 'get_user',\n 'Get information about the authenticated user',\n {},\n async () => jsonResponse(await client.getUser())\n);\n\nserver.tool(\n 'check_auth',\n 'Check if YNAB authentication is configured',\n {},\n async () => jsonResponse({ authenticated: await auth.isAuthenticated() })\n);\n\nserver.tool(\n 'search_tools',\n 'Search for available tools by name or description using regex. Returns matching tool names.',\n {\n query: z.string().describe('Regex pattern to match against tool names and descriptions (case-insensitive)'),\n },\n async ({ query }) => {\n try {\n const pattern = new RegExp(query, 'i');\n const matches = toolRegistry.filter((t) => pattern.test(t.name) || pattern.test(t.description));\n return jsonResponse({ tools: matches });\n } catch {\n return jsonResponse({ error: 'Invalid regex pattern' });\n }\n }\n);\n\nexport async function runMcpServer() {\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n"],"mappings":"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","names":["Command","sanitized","Command","Command","Command","Command","Command","Command","Command","Command","Command","dayjs","Command","dayjs","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command"]}