@siphoyawe/mina-cli 1.1.0 → 1.2.0
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/index.js +1050 -671
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.tsx","../src/commands/wizard.tsx","../src/ui/theme.ts","../src/ui/Box.tsx","../src/ui/Header.tsx","../src/ui/Select.tsx","../src/ui/ProgressSteps.tsx","../src/ui/Spinner.tsx","../src/ui/Table.tsx","../src/commands/quote.tsx","../src/commands/chains.tsx","../src/commands/tokens.tsx","../src/commands/status.tsx","../src/commands/bridge.tsx","../src/lib/wallet.ts","../src/commands/history.tsx","../src/lib/history.ts","../src/commands/balance.tsx","../src/commands/config.tsx","../src/lib/config.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport React from 'react';\nimport { render } from 'ink';\nimport { Wizard } from './commands/wizard.js';\nimport { QuoteDisplay } from './commands/quote.js';\nimport { ChainsCommand } from './commands/chains.js';\nimport { TokensCommand } from './commands/tokens.js';\nimport { Status } from './commands/status.js';\nimport { bridgeCommand, type BridgeCommandOptions } from './commands/bridge.js';\nimport { HistoryCommand } from './commands/history.js';\nimport { BalanceCommand } from './commands/balance.js';\nimport { ConfigCommand } from './commands/config.js';\n\nconst VERSION = '1.0.0';\n\nconst program = new Command();\n\nprogram\n .name('mina')\n .description('Mina Bridge CLI - Bridge assets from any chain to Hyperliquid')\n .version(VERSION, '-v, --version', 'Display the current version')\n .helpOption('-h, --help', 'Display help information');\n\n// Wizard command (can be explicitly called)\nprogram\n .command('wizard')\n .description('Launch the interactive bridge wizard')\n .action(() => {\n render(React.createElement(Wizard));\n });\n\n// Quote command - get a bridge quote\nprogram\n .command('quote')\n .description('Get a bridge quote')\n .requiredOption('--from <chain>', 'Source chain (e.g., ethereum, arbitrum, polygon)')\n .option('--to <chain>', 'Destination chain', 'hyperliquid')\n .requiredOption('--token <symbol>', 'Token to bridge (e.g., USDC, ETH)')\n .requiredOption('--amount <number>', 'Amount to bridge')\n .option('--json', 'Output as JSON for machine-readable format')\n .action((options) => {\n render(\n React.createElement(QuoteDisplay, {\n fromChain: options.from,\n toChain: options.to,\n token: options.token,\n amount: options.amount,\n jsonOutput: options.json || false,\n })\n );\n });\n\n// Status command - check bridge transaction status\nprogram\n .command('status <txHash>')\n .description('Check bridge status')\n .option('--watch', 'Poll for updates')\n .action((txHash, options) => {\n render(\n React.createElement(Status, {\n txHash,\n watch: options.watch || false,\n })\n );\n });\n\n// Chains command - list supported chains\nprogram\n .command('chains')\n .description('List supported chains')\n .option('--json', 'Output as JSON')\n .action((options) => {\n render(\n React.createElement(ChainsCommand, {\n json: options.json || false,\n })\n );\n });\n\n// Tokens command - list bridgeable tokens\nprogram\n .command('tokens')\n .description('List bridgeable tokens')\n .option('--chain <chain>', 'Filter by chain (name or ID)')\n .option('--json', 'Output as JSON')\n .action((options) => {\n render(\n React.createElement(TokensCommand, {\n chain: options.chain,\n json: options.json || false,\n })\n );\n });\n\n// Bridge command - execute a bridge transaction\nprogram\n .command('bridge')\n .description('Execute a bridge transaction')\n .requiredOption('--from <chain>', 'Source chain (e.g., arbitrum, ethereum, polygon)')\n .requiredOption('--token <symbol>', 'Token to bridge (e.g., USDC, ETH)')\n .requiredOption('--amount <number>', 'Amount to bridge')\n .option('--key <path>', 'Path to private key file (JSON or plain text)')\n .option('--yes', 'Skip confirmation prompt')\n .option('--auto-deposit', 'Auto-deposit to Hyperliquid L1', true)\n .action((options) => {\n bridgeCommand(options as BridgeCommandOptions);\n });\n\n// History command - view bridge transaction history\nprogram\n .command('history')\n .description('View bridge transaction history')\n .option('--limit <number>', 'Number of entries to show', '10')\n .option('--address <address>', 'Filter by wallet address')\n .option('--json', 'Output as JSON')\n .action((options) => {\n render(\n React.createElement(HistoryCommand, {\n limit: parseInt(options.limit, 10) || 10,\n address: options.address,\n json: options.json || false,\n })\n );\n });\n\n// Balance command - check wallet balances\nprogram\n .command('balance')\n .description('Check wallet balances')\n .requiredOption('--address <address>', 'Wallet address')\n .option('--chain <chain>', 'Specific chain (name or ID)')\n .option('--all', 'Show all tokens including zero balance')\n .option('--json', 'Output as JSON')\n .action((options) => {\n render(\n React.createElement(BalanceCommand, {\n address: options.address,\n chain: options.chain,\n showAll: options.all || false,\n json: options.json || false,\n })\n );\n });\n\n// Config command - manage CLI configuration\nprogram\n .command('config [action] [key] [value]')\n .description('Manage CLI configuration')\n .action((action, key, value) => {\n render(\n React.createElement(ConfigCommand, {\n action,\n key,\n value,\n })\n );\n });\n\nprogram.addHelpText('after', `\n${chalk.bold('Examples:')}\n ${chalk.dim('# Launch interactive wizard (default when no command given)')}\n $ mina\n\n ${chalk.dim('# Get a bridge quote')}\n $ mina quote --from arbitrum --token USDC --amount 100\n $ mina quote --from ethereum --token ETH --amount 0.5 --json\n\n ${chalk.dim('# Bridge USDC from Ethereum to Hyperliquid')}\n $ mina bridge --from arbitrum --token USDC --amount 100 --key ./key.json\n $ mina bridge --from ethereum --token ETH --amount 0.5 --yes\n\n ${chalk.dim('# Check transaction status')}\n $ mina status 0x1234...abcd\n $ mina status 0x1234...abcd --watch\n\n ${chalk.dim('# View supported chains and tokens')}\n $ mina chains\n $ mina tokens --chain arbitrum\n $ mina tokens --chain 1\n\n ${chalk.dim('# View bridge transaction history')}\n $ mina history\n $ mina history --limit 20\n $ mina history --address 0x1234...abcd\n $ mina history --json\n\n ${chalk.dim('# Check wallet balances')}\n $ mina balance --address 0x1234...abcd\n $ mina balance --address 0x1234...abcd --chain arbitrum\n $ mina balance --address 0x1234...abcd --all\n $ mina balance --address 0x1234...abcd --json\n\n ${chalk.dim('# Manage configuration')}\n $ mina config list\n $ mina config get slippage\n $ mina config set slippage 0.5\n $ mina config set rpc.arbitrum https://arb1.example.com\n\n${chalk.bold('Documentation:')}\n https://github.com/siphoyawe/mina-sdk\n`);\n\n// Check if no command is provided - launch wizard\nconst args = process.argv.slice(2);\nconst hasCommand = args.length > 0 && !args[0]?.startsWith('-');\nconst isHelpOrVersion = args.some(arg => ['-h', '--help', '-v', '--version'].includes(arg));\n\nif (!hasCommand && !isHelpOrVersion) {\n // No command provided, launch interactive wizard\n render(React.createElement(Wizard));\n} else {\n // Parse command normally\n program.parse(process.argv);\n}\n","import React, { useState, useEffect, useCallback } from 'react'\nimport { Box, Text, useApp, useInput } from 'ink'\nimport {\n getChains,\n getBridgeableTokens,\n type Chain,\n type Token,\n type Quote,\n HYPEREVM_CHAIN_ID,\n} from '@siphoyawe/mina-sdk'\nimport {\n Header,\n theme,\n symbols,\n ChainSelect,\n TokenSelect,\n Spinner,\n ProgressSteps,\n KeyValue,\n Box as StyledBox,\n Divider,\n type ChainSelectItem,\n type TokenSelectItem,\n type Step as ProgressStep,\n} from '../ui/index.js'\n\n/**\n * Wizard step types\n */\ntype WizardStep = 'chain' | 'token' | 'amount' | 'confirm' | 'execute'\n\n/**\n * Wizard state interface\n */\ninterface WizardState {\n step: WizardStep\n chain: Chain | null\n token: Token | null\n amount: string\n quote: Quote | null\n error: string | null\n}\n\n/**\n * Initial wizard state\n */\nconst initialState: WizardState = {\n step: 'chain',\n chain: null,\n token: null,\n amount: '',\n quote: null,\n error: null,\n}\n\n/**\n * Navigation hints component\n */\nfunction NavigationHints({ step }: { step: WizardStep }) {\n const hints: Record<WizardStep, string> = {\n chain: 'up/down Select Enter Confirm q Quit',\n token: 'up/down Select Enter Confirm b Back q Quit',\n amount: 'Enter Confirm b Back q Quit',\n confirm: 'Enter Execute b Back q Quit',\n execute: 'Please wait...',\n }\n\n return (\n <Box marginTop={1}>\n <Text color={theme.muted} dimColor>\n {hints[step]}\n </Text>\n </Box>\n )\n}\n\n/**\n * Step indicator component showing current position in wizard\n */\nfunction StepIndicator({ currentStep }: { currentStep: WizardStep }) {\n const steps: WizardStep[] = ['chain', 'token', 'amount', 'confirm', 'execute']\n const stepLabels: Record<WizardStep, string> = {\n chain: 'Chain',\n token: 'Token',\n amount: 'Amount',\n confirm: 'Confirm',\n execute: 'Execute',\n }\n\n const currentIndex = steps.indexOf(currentStep)\n\n return (\n <Box marginBottom={1}>\n {steps.map((step, index) => {\n const isActive = index === currentIndex\n const isCompleted = index < currentIndex\n const separator = index < steps.length - 1 ? ' > ' : ''\n\n return (\n <Text key={step}>\n <Text\n color={isActive ? theme.primary : isCompleted ? theme.success : theme.muted}\n bold={isActive}\n dimColor={!isActive && !isCompleted}\n >\n {isCompleted ? symbols.check : isActive ? symbols.arrow : symbols.pending} {stepLabels[step]}\n </Text>\n <Text color={theme.muted} dimColor>{separator}</Text>\n </Text>\n )\n })}\n </Box>\n )\n}\n\n/**\n * Chain selection step\n */\nfunction ChainSelectionStep({\n onSelect,\n selectedChain,\n}: {\n onSelect: (chain: Chain) => void\n selectedChain: Chain | null\n}) {\n const [chains, setChains] = useState<Chain[]>([])\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n async function loadChains() {\n try {\n setLoading(true)\n setError(null)\n const response = await getChains()\n // Filter out HyperEVM as it's the destination\n const originChains = response.chains.filter(c => c.id !== HYPEREVM_CHAIN_ID)\n setChains(originChains)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load chains')\n } finally {\n setLoading(false)\n }\n }\n loadChains()\n }, [])\n\n if (loading) {\n return <Spinner text=\"Loading available chains...\" />\n }\n\n if (error) {\n return (\n <Box flexDirection=\"column\">\n <Text color={theme.error}>{symbols.failed} Error: {error}</Text>\n <Text color={theme.muted}>Press q to quit and try again</Text>\n </Box>\n )\n }\n\n const chainItems: ChainSelectItem[] = chains.map(chain => ({\n label: chain.name,\n value: chain.id,\n chainId: chain.id,\n type: 'origin' as const,\n description: `Chain ID: ${chain.id}`,\n }))\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text color={theme.secondary} bold>\n Select source chain to bridge from:\n </Text>\n </Box>\n <ChainSelect\n chains={chainItems}\n onSelect={(item) => {\n const chain = chains.find(c => c.id === item.chainId)\n if (chain) onSelect(chain)\n }}\n label=\"\"\n />\n <Box marginTop={1}>\n <Text color={theme.muted} dimColor>\n Destination: HyperEVM (Chain ID: {HYPEREVM_CHAIN_ID})\n </Text>\n </Box>\n </Box>\n )\n}\n\n/**\n * Token selection step\n */\nfunction TokenSelectionStep({\n chain,\n onSelect,\n selectedToken,\n}: {\n chain: Chain\n onSelect: (token: Token) => void\n selectedToken: Token | null\n}) {\n const [tokens, setTokens] = useState<Token[]>([])\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n async function loadTokens() {\n try {\n setLoading(true)\n setError(null)\n const response = await getBridgeableTokens(chain.id)\n setTokens(response.tokens)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load tokens')\n } finally {\n setLoading(false)\n }\n }\n loadTokens()\n }, [chain.id])\n\n if (loading) {\n return <Spinner text={`Loading bridgeable tokens for ${chain.name}...`} />\n }\n\n if (error) {\n return (\n <Box flexDirection=\"column\">\n <Text color={theme.error}>{symbols.failed} Error: {error}</Text>\n <Text color={theme.muted}>Press b to go back or q to quit</Text>\n </Box>\n )\n }\n\n if (tokens.length === 0) {\n return (\n <Box flexDirection=\"column\">\n <Text color={theme.warning}>{symbols.pending} No bridgeable tokens found for {chain.name}</Text>\n <Text color={theme.muted}>Press b to go back and select another chain</Text>\n </Box>\n )\n }\n\n const tokenItems: TokenSelectItem[] = tokens.map(token => ({\n label: token.symbol,\n value: token.address,\n symbol: token.symbol,\n description: token.name,\n }))\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text color={theme.secondary} bold>\n Select token to bridge from {chain.name}:\n </Text>\n </Box>\n <TokenSelect\n tokens={tokenItems}\n onSelect={(item) => {\n const token = tokens.find(t => t.address === item.value)\n if (token) onSelect(token)\n }}\n label=\"\"\n />\n </Box>\n )\n}\n\n/**\n * Amount input step with blinking cursor\n */\nfunction AmountInputStep({\n token,\n chain,\n amount,\n onAmountChange,\n onConfirm,\n error,\n}: {\n token: Token\n chain: Chain\n amount: string\n onAmountChange: (amount: string) => void\n onConfirm: () => void\n error: string | null\n}) {\n const [cursorVisible, setCursorVisible] = useState(true)\n\n // Blinking cursor effect\n useEffect(() => {\n const interval = setInterval(() => {\n setCursorVisible(v => !v)\n }, 530)\n return () => clearInterval(interval)\n }, [])\n\n // Handle input\n useInput((input, key) => {\n if (key.return && amount.length > 0) {\n onConfirm()\n return\n }\n\n if (key.backspace || key.delete) {\n onAmountChange(amount.slice(0, -1))\n return\n }\n\n // Only allow numeric input and decimal point\n if (/^[0-9.]$/.test(input)) {\n // Prevent multiple decimal points\n if (input === '.' && amount.includes('.')) return\n // Prevent starting with multiple zeros\n if (input === '0' && amount === '0') return\n onAmountChange(amount + input)\n }\n })\n\n const cursor = cursorVisible ? '|' : ' '\n const displayAmount = amount || '0'\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text color={theme.secondary} bold>\n Enter amount of {token.symbol} to bridge:\n </Text>\n </Box>\n\n <StyledBox bordered padding={1}>\n <Box>\n <Text color={theme.primary} bold>\n {displayAmount}\n </Text>\n <Text color={theme.primary}>{cursor}</Text>\n <Text color={theme.muted}> {token.symbol}</Text>\n </Box>\n </StyledBox>\n\n {error && (\n <Box marginTop={1}>\n <Text color={theme.error}>{symbols.failed} {error}</Text>\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text color={theme.muted} dimColor>\n From: {chain.name} ({token.symbol})\n </Text>\n </Box>\n <Box>\n <Text color={theme.muted} dimColor>\n To: HyperEVM (USDC)\n </Text>\n </Box>\n </Box>\n )\n}\n\n/**\n * Confirmation step showing summary\n */\nfunction ConfirmationStep({\n chain,\n token,\n amount,\n onConfirm,\n}: {\n chain: Chain\n token: Token\n amount: string\n onConfirm: () => void\n}) {\n // Handle Enter key to confirm\n useInput((_input, key) => {\n if (key.return) {\n onConfirm()\n }\n })\n\n // Mock fee estimate (actual quote fetching will be in Story 12.5)\n const estimatedFees = '$1.50 - $3.00'\n const estimatedTime = '2-5 minutes'\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text color={theme.secondary} bold>\n Review your bridge transaction:\n </Text>\n </Box>\n\n <StyledBox bordered title=\"Transaction Summary\" padding={1}>\n <KeyValue\n items={[\n { key: 'From Chain', value: chain.name },\n { key: 'Token', value: token.symbol },\n { key: 'Amount', value: `${amount} ${token.symbol}` },\n { key: 'To Chain', value: 'HyperEVM' },\n { key: 'Receive', value: 'USDC' },\n ]}\n />\n\n <Box marginTop={1} marginBottom={1}>\n <Divider width={40} />\n </Box>\n\n <KeyValue\n items={[\n { key: 'Est. Fees', value: estimatedFees },\n { key: 'Est. Time', value: estimatedTime },\n ]}\n keyColor={theme.muted}\n valueColor={theme.warning}\n />\n </StyledBox>\n\n <Box marginTop={1}>\n <Text color={theme.success} bold>\n {symbols.arrow} Press Enter to execute the bridge\n </Text>\n </Box>\n <Box>\n <Text color={theme.muted} dimColor>\n Press b to go back and edit\n </Text>\n </Box>\n </Box>\n )\n}\n\n/**\n * Execution step showing progress\n */\nfunction ExecutionStep({\n chain,\n token,\n amount,\n}: {\n chain: Chain\n token: Token\n amount: string\n}) {\n const [currentStep, setCurrentStep] = useState(0)\n\n // Simulate progress for demo (actual execution in Story 12.5)\n useEffect(() => {\n const timer = setInterval(() => {\n setCurrentStep(prev => {\n if (prev >= 4) {\n clearInterval(timer)\n return prev\n }\n return prev + 1\n })\n }, 2000)\n return () => clearInterval(timer)\n }, [])\n\n const steps: ProgressStep[] = [\n {\n label: 'Connecting wallet',\n status: currentStep > 0 ? 'completed' : currentStep === 0 ? 'active' : 'pending',\n },\n {\n label: 'Fetching quote',\n status: currentStep > 1 ? 'completed' : currentStep === 1 ? 'active' : 'pending',\n },\n {\n label: 'Approving token',\n status: currentStep > 2 ? 'completed' : currentStep === 2 ? 'active' : 'pending',\n },\n {\n label: 'Executing bridge',\n status: currentStep > 3 ? 'completed' : currentStep === 3 ? 'active' : 'pending',\n },\n {\n label: 'Confirming on destination',\n status: currentStep > 4 ? 'completed' : currentStep === 4 ? 'active' : 'pending',\n },\n ]\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text color={theme.secondary} bold>\n Bridging {amount} {token.symbol} from {chain.name} to HyperEVM\n </Text>\n </Box>\n\n <ProgressSteps steps={steps} title=\"Bridge Progress\" showNumbers />\n\n {currentStep >= 4 && (\n <Box marginTop={1}>\n <Text color={theme.success} bold>\n {symbols.check} Bridge transaction submitted! Waiting for confirmation...\n </Text>\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text color={theme.muted} dimColor>\n (Demo mode - actual execution will be implemented in Story 12.5)\n </Text>\n </Box>\n </Box>\n )\n}\n\n/**\n * Main Wizard component\n */\nexport function Wizard() {\n const { exit } = useApp()\n const [state, setState] = useState<WizardState>(initialState)\n\n // Handle global navigation\n useInput((input, key) => {\n // Quit on 'q'\n if (input === 'q' && state.step !== 'execute') {\n exit()\n return\n }\n\n // Go back on 'b' or backspace (except in amount step where backspace deletes)\n if ((input === 'b') && state.step !== 'chain' && state.step !== 'execute' && state.step !== 'amount') {\n goBack()\n return\n }\n\n // In amount step, 'b' goes back\n if (input === 'b' && state.step === 'amount') {\n goBack()\n return\n }\n })\n\n const goBack = useCallback(() => {\n setState(prev => {\n switch (prev.step) {\n case 'token':\n return { ...prev, step: 'chain', token: null, error: null }\n case 'amount':\n return { ...prev, step: 'token', amount: '', error: null }\n case 'confirm':\n return { ...prev, step: 'amount', error: null }\n default:\n return prev\n }\n })\n }, [])\n\n const handleChainSelect = useCallback((chain: Chain) => {\n setState(prev => ({ ...prev, chain, step: 'token', error: null }))\n }, [])\n\n const handleTokenSelect = useCallback((token: Token) => {\n setState(prev => ({ ...prev, token, step: 'amount', error: null }))\n }, [])\n\n const handleAmountChange = useCallback((amount: string) => {\n setState(prev => ({ ...prev, amount, error: null }))\n }, [])\n\n const handleAmountConfirm = useCallback(() => {\n // Validate amount\n const numAmount = parseFloat(state.amount)\n if (isNaN(numAmount) || numAmount <= 0) {\n setState(prev => ({ ...prev, error: 'Please enter a valid positive amount' }))\n return\n }\n setState(prev => ({ ...prev, step: 'confirm', error: null }))\n }, [state.amount])\n\n const handleConfirm = useCallback(() => {\n setState(prev => ({ ...prev, step: 'execute', error: null }))\n }, [])\n\n // Render step content\n const renderStepContent = () => {\n switch (state.step) {\n case 'chain':\n return (\n <ChainSelectionStep\n onSelect={handleChainSelect}\n selectedChain={state.chain}\n />\n )\n\n case 'token':\n if (!state.chain) return null\n return (\n <TokenSelectionStep\n chain={state.chain}\n onSelect={handleTokenSelect}\n selectedToken={state.token}\n />\n )\n\n case 'amount':\n if (!state.chain || !state.token) return null\n return (\n <AmountInputStep\n chain={state.chain}\n token={state.token}\n amount={state.amount}\n onAmountChange={handleAmountChange}\n onConfirm={handleAmountConfirm}\n error={state.error}\n />\n )\n\n case 'confirm':\n if (!state.chain || !state.token) return null\n return (\n <ConfirmationStep\n chain={state.chain}\n token={state.token}\n amount={state.amount}\n onConfirm={handleConfirm}\n />\n )\n\n case 'execute':\n if (!state.chain || !state.token) return null\n return (\n <ExecutionStep\n chain={state.chain}\n token={state.token}\n amount={state.amount}\n />\n )\n\n default:\n return null\n }\n }\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n {/* Header with logo */}\n <Header showTagline tagline=\"Cross-chain bridge to Hyperliquid\" />\n\n {/* Step indicator */}\n <StepIndicator currentStep={state.step} />\n\n {/* Main content area */}\n <Box flexDirection=\"column\" marginY={1}>\n {renderStepContent()}\n </Box>\n\n {/* Navigation hints */}\n <NavigationHints step={state.step} />\n </Box>\n )\n}\n\nexport default Wizard\n","/**\n * Dark Luxe Terminal Theme for Mina Bridge CLI\n * Optimized for terminal display with ANSI color support\n */\n\nexport const theme = {\n // Primary colors\n primary: '#7DD3FC', // Sky blue - main accent\n secondary: '#A1A1AA', // Gray - supporting text\n muted: '#71717A', // Dark gray - disabled/placeholder\n\n // Status colors\n success: '#0ECC83', // Green - completed/success\n error: '#F87171', // Red - error/failed\n warning: '#FBBF24', // Yellow - warning/pending\n\n // UI elements\n border: '#3F3F46', // Border gray\n background: '#18181B', // Dark background\n\n // Additional colors for variety\n accent: '#E879F9', // Purple accent\n info: '#38BDF8', // Light blue info\n} as const\n\nexport type ThemeColor = keyof typeof theme\n\n/**\n * Unicode box-drawing characters for terminal UI\n */\nexport const borders = {\n // Single line box\n topLeft: '┌',\n topRight: '┐',\n bottomLeft: '└',\n bottomRight: '┘',\n horizontal: '─',\n vertical: '│',\n\n // Junctions\n leftT: '├',\n rightT: '┤',\n topT: '┬',\n bottomT: '┴',\n cross: '┼',\n\n // Double line (for emphasis)\n doubleHorizontal: '═',\n doubleVertical: '║',\n doubleTopLeft: '╔',\n doubleTopRight: '╗',\n doubleBottomLeft: '╚',\n doubleBottomRight: '╝',\n} as const\n\n/**\n * Status symbols for progress indicators\n */\nexport const symbols = {\n pending: '○',\n active: '→',\n completed: '✓',\n failed: '✗',\n spinner: '◐',\n bullet: '•',\n arrow: '›',\n check: '✔',\n cross: '✘',\n} as const\n\n/**\n * ASCII Art Logo for Mina Bridge\n */\nexport const MINA_LOGO = `\n __ __ ___ _ _ _\n | \\\\/ |_ _| \\\\ | | / \\\\\n | |\\\\/| || || \\\\| | / _ \\\\\n | | | || || |\\\\ |/ ___ \\\\\n |_| |_|___|_| \\\\_/_/ \\\\_\\\\\n`\n\nexport const TAGLINE = 'Cross-chain bridge to Hyperliquid'\n","import React from 'react'\nimport { Box as InkBox, Text, type BoxProps as InkBoxProps } from 'ink'\nimport { theme, borders } from './theme.js'\n\nexport interface BoxProps extends Omit<InkBoxProps, 'borderStyle' | 'borderColor'> {\n /** Title to display in the box header */\n title?: string\n /** Border color from theme */\n borderColor?: string\n /** Whether to show border */\n bordered?: boolean\n /** Padding inside the box */\n padding?: number\n children?: React.ReactNode\n}\n\n/**\n * Styled border box component with Dark Luxe theme\n */\nexport function Box({\n title,\n borderColor = theme.border,\n bordered = true,\n padding = 1,\n children,\n ...props\n}: BoxProps) {\n if (!bordered) {\n return (\n <InkBox padding={padding} {...props}>\n {children}\n </InkBox>\n )\n }\n\n return (\n <InkBox\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={borderColor}\n paddingX={padding}\n paddingY={padding > 0 ? 1 : 0}\n {...props}\n >\n {title && (\n <InkBox marginBottom={1}>\n <Text color={theme.primary} bold>\n {title}\n </Text>\n </InkBox>\n )}\n {children}\n </InkBox>\n )\n}\n\nexport interface DividerProps {\n /** Width of the divider */\n width?: number\n /** Color of the divider */\n color?: string\n /** Character to use for the divider */\n char?: string\n}\n\n/**\n * Horizontal divider component\n */\nexport function Divider({\n width = 40,\n color = theme.border,\n char = borders.horizontal\n}: DividerProps) {\n return (\n <Text color={color}>\n {char.repeat(width)}\n </Text>\n )\n}\n","import React from 'react'\nimport { Box, Text } from 'ink'\nimport { theme, MINA_LOGO, TAGLINE } from './theme.js'\n\nexport interface HeaderProps {\n /** Whether to show the tagline */\n showTagline?: boolean\n /** Custom tagline to display */\n tagline?: string\n /** Whether to show a compact version */\n compact?: boolean\n}\n\n/**\n * ASCII art Mina logo header component\n */\nexport function Header({\n showTagline = true,\n tagline = TAGLINE,\n compact = false\n}: HeaderProps) {\n if (compact) {\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text color={theme.primary} bold>\n MINA\n </Text>\n {showTagline && (\n <Text color={theme.secondary} dimColor>\n {tagline}\n </Text>\n )}\n </Box>\n )\n }\n\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text color={theme.primary} bold>\n {MINA_LOGO}\n </Text>\n {showTagline && (\n <Box justifyContent=\"center\">\n <Text color={theme.secondary} dimColor>\n {tagline}\n </Text>\n </Box>\n )}\n </Box>\n )\n}\n\nexport interface SubheaderProps {\n /** Text to display */\n text: string\n /** Icon to show before text */\n icon?: string\n}\n\n/**\n * Subheader component for section titles\n */\nexport function Subheader({ text, icon }: SubheaderProps) {\n return (\n <Box marginY={1}>\n <Text color={theme.primary} bold>\n {icon && `${icon} `}{text}\n </Text>\n </Box>\n )\n}\n","import React from 'react'\nimport { Box, Text } from 'ink'\nimport InkSelectInput from 'ink-select-input'\nimport { theme, symbols } from './theme.js'\n\n// Define InkItem type to match ink-select-input's expected format\ninterface InkItem<V> {\n key?: string\n label: string\n value: V\n}\n\nexport interface SelectItem<V = string> {\n label: string\n value: V\n description?: string\n disabled?: boolean\n}\n\nexport interface SelectProps<V = string> {\n /** Items to display in the selector */\n items: SelectItem<V>[]\n /** Callback when an item is selected */\n onSelect: (item: SelectItem<V>) => void\n /** Callback when highlighted item changes */\n onHighlight?: (item: SelectItem<V>) => void\n /** Initially selected item index */\n initialIndex?: number\n /** Whether the select is disabled */\n disabled?: boolean\n /** Label to show above the select */\n label?: string\n /** Limit visible items (for scrolling) */\n limit?: number\n}\n\n/**\n * Styled chain/token selector component\n * Wraps ink-select-input with Dark Luxe theme\n */\nexport function Select<V = string>({\n items,\n onSelect,\n onHighlight,\n initialIndex = 0,\n disabled = false,\n label,\n limit,\n}: SelectProps<V>) {\n // Transform items to ink-select-input format\n const inkItems: InkItem<SelectItem<V>>[] = items.map((item) => ({\n label: item.label,\n value: item,\n }))\n\n const handleSelect = (item: InkItem<SelectItem<V>>) => {\n if (!item.value.disabled) {\n onSelect(item.value)\n }\n }\n\n const handleHighlight = (item: InkItem<SelectItem<V>>) => {\n onHighlight?.(item.value)\n }\n\n // Custom item component for theming\n const itemComponent = ({ isSelected, label }: { isSelected?: boolean; label: string }) => {\n const item = items.find(i => i.label === label)\n const isDisabled = item?.disabled\n\n return (\n <Box>\n <Text color={isSelected ? theme.primary : isDisabled ? theme.muted : theme.secondary}>\n {isSelected ? symbols.arrow : ' '} {label}\n </Text>\n {item?.description && (\n <Text color={theme.muted} dimColor>\n {' '}— {item.description}\n </Text>\n )}\n </Box>\n )\n }\n\n // Custom indicator component\n const indicatorComponent = ({ isSelected }: { isSelected?: boolean }) => (\n <Text color={theme.primary}>\n {isSelected ? symbols.arrow : ' '}\n </Text>\n )\n\n if (disabled) {\n return (\n <Box flexDirection=\"column\">\n {label && (\n <Text color={theme.muted} dimColor>\n {label}\n </Text>\n )}\n <Text color={theme.muted} dimColor>\n (disabled)\n </Text>\n </Box>\n )\n }\n\n return (\n <Box flexDirection=\"column\">\n {label && (\n <Box marginBottom={1}>\n <Text color={theme.secondary}>{label}</Text>\n </Box>\n )}\n <InkSelectInput\n items={inkItems}\n onSelect={handleSelect}\n onHighlight={handleHighlight}\n initialIndex={initialIndex}\n itemComponent={itemComponent}\n indicatorComponent={indicatorComponent}\n limit={limit}\n />\n </Box>\n )\n}\n\nexport interface ChainSelectItem extends SelectItem<number> {\n chainId: number\n type: 'origin' | 'destination'\n}\n\n/**\n * Pre-configured chain selector\n */\nexport function ChainSelect({\n chains,\n onSelect,\n label = 'Select Chain:',\n}: {\n chains: ChainSelectItem[]\n onSelect: (chain: ChainSelectItem) => void\n label?: string\n}) {\n return (\n <Select<number>\n items={chains}\n onSelect={(item) => onSelect(item as ChainSelectItem)}\n label={label}\n />\n )\n}\n\nexport interface TokenSelectItem extends SelectItem<string> {\n symbol: string\n balance?: string\n}\n\n/**\n * Pre-configured token selector\n */\nexport function TokenSelect({\n tokens,\n onSelect,\n label = 'Select Token:',\n}: {\n tokens: TokenSelectItem[]\n onSelect: (token: TokenSelectItem) => void\n label?: string\n}) {\n return (\n <Select<string>\n items={tokens}\n onSelect={(item) => onSelect(item as TokenSelectItem)}\n label={label}\n />\n )\n}\n","import React from 'react'\nimport { Box, Text } from 'ink'\nimport InkSpinner from 'ink-spinner'\nimport { theme, symbols } from './theme.js'\n\nexport type StepStatus = 'pending' | 'active' | 'completed' | 'failed'\n\nexport interface Step {\n /** Step label */\n label: string\n /** Current status */\n status: StepStatus\n /** Optional description/details */\n description?: string\n /** Optional timestamp */\n timestamp?: string\n}\n\nexport interface ProgressStepsProps {\n /** Array of steps to display */\n steps: Step[]\n /** Whether to show step numbers */\n showNumbers?: boolean\n /** Whether to show timestamps */\n showTimestamps?: boolean\n /** Title for the progress section */\n title?: string\n}\n\n/**\n * Get the status indicator for a step\n */\nfunction getStatusIndicator(status: StepStatus): React.ReactNode {\n switch (status) {\n case 'pending':\n return <Text color={theme.muted}>{symbols.pending}</Text>\n case 'active':\n return (\n <Text color={theme.primary}>\n <InkSpinner type=\"dots\" />\n </Text>\n )\n case 'completed':\n return <Text color={theme.success}>{symbols.completed}</Text>\n case 'failed':\n return <Text color={theme.error}>{symbols.failed}</Text>\n }\n}\n\n/**\n * Get the color for a step based on status\n */\nfunction getStatusColor(status: StepStatus): string {\n switch (status) {\n case 'pending':\n return theme.muted\n case 'active':\n return theme.primary\n case 'completed':\n return theme.success\n case 'failed':\n return theme.error\n }\n}\n\n/**\n * Single step component\n */\nfunction StepItem({\n step,\n index,\n showNumber,\n showTimestamp,\n isLast,\n}: {\n step: Step\n index: number\n showNumber: boolean\n showTimestamp: boolean\n isLast: boolean\n}) {\n const color = getStatusColor(step.status)\n\n return (\n <Box flexDirection=\"column\">\n <Box>\n {/* Status indicator */}\n <Box width={3}>{getStatusIndicator(step.status)}</Box>\n\n {/* Step number (optional) */}\n {showNumber && (\n <Box width={4}>\n <Text color={color} dimColor={step.status === 'pending'}>\n {index + 1}.\n </Text>\n </Box>\n )}\n\n {/* Step label */}\n <Box flexGrow={1}>\n <Text\n color={color}\n bold={step.status === 'active'}\n dimColor={step.status === 'pending'}\n >\n {step.label}\n </Text>\n </Box>\n\n {/* Timestamp (optional) */}\n {showTimestamp && step.timestamp && (\n <Box marginLeft={2}>\n <Text color={theme.muted} dimColor>\n {step.timestamp}\n </Text>\n </Box>\n )}\n </Box>\n\n {/* Description */}\n {step.description && (\n <Box marginLeft={showNumber ? 7 : 3}>\n <Text color={theme.muted} dimColor>\n {step.description}\n </Text>\n </Box>\n )}\n\n {/* Connector line (not for last item) */}\n {!isLast && step.status !== 'pending' && (\n <Box marginLeft={1}>\n <Text color={theme.border}>│</Text>\n </Box>\n )}\n </Box>\n )\n}\n\n/**\n * Bridge progress steps component with status indicators\n *\n * Status indicators:\n * - Pending: ○\n * - Active: → (with spinner)\n * - Completed: ✓ (green)\n * - Failed: ✗ (red)\n */\nexport function ProgressSteps({\n steps,\n showNumbers = true,\n showTimestamps = false,\n title,\n}: ProgressStepsProps) {\n return (\n <Box flexDirection=\"column\">\n {title && (\n <Box marginBottom={1}>\n <Text color={theme.secondary} bold>\n {title}\n </Text>\n </Box>\n )}\n {steps.map((step, index) => (\n <StepItem\n key={index}\n step={step}\n index={index}\n showNumber={showNumbers}\n showTimestamp={showTimestamps}\n isLast={index === steps.length - 1}\n />\n ))}\n </Box>\n )\n}\n\n/**\n * Pre-configured bridge progress steps\n */\nexport function BridgeProgress({\n currentStep,\n error,\n}: {\n currentStep: number\n error?: string\n}) {\n const bridgeSteps: Step[] = [\n {\n label: 'Connecting wallet',\n status: currentStep > 0 ? 'completed' : currentStep === 0 ? 'active' : 'pending',\n },\n {\n label: 'Fetching quote',\n status: currentStep > 1 ? 'completed' : currentStep === 1 ? 'active' : 'pending',\n },\n {\n label: 'Approving token',\n status: currentStep > 2 ? 'completed' : currentStep === 2 ? 'active' : 'pending',\n },\n {\n label: 'Executing bridge',\n status: currentStep > 3 ? 'completed' : currentStep === 3 ? 'active' : 'pending',\n },\n {\n label: 'Confirming on destination',\n status: currentStep > 4 ? 'completed' : currentStep === 4 ? 'active' : 'pending',\n description: error || undefined,\n },\n ]\n\n // Mark as failed if there's an error\n if (error && currentStep >= 0 && currentStep < 5) {\n const step = bridgeSteps[currentStep]\n if (step) {\n step.status = 'failed'\n step.description = error\n }\n }\n\n return <ProgressSteps steps={bridgeSteps} title=\"Bridge Progress\" />\n}\n","import React from 'react'\nimport { Box, Text } from 'ink'\nimport InkSpinner from 'ink-spinner'\nimport { theme } from './theme.js'\n\nexport type SpinnerType =\n | 'dots'\n | 'line'\n | 'pipe'\n | 'simpleDots'\n | 'simpleDotsScrolling'\n | 'star'\n | 'flip'\n | 'hamburger'\n | 'growVertical'\n | 'growHorizontal'\n | 'balloon'\n | 'balloon2'\n | 'noise'\n | 'bounce'\n | 'boxBounce'\n | 'boxBounce2'\n | 'triangle'\n | 'arc'\n | 'circle'\n | 'squareCorners'\n | 'circleQuarters'\n | 'circleHalves'\n | 'squish'\n | 'toggle'\n | 'toggle2'\n | 'toggle3'\n | 'toggle4'\n | 'toggle5'\n | 'toggle6'\n | 'toggle7'\n | 'toggle8'\n | 'toggle9'\n | 'toggle10'\n | 'toggle11'\n | 'toggle12'\n | 'toggle13'\n | 'arrow'\n | 'arrow2'\n | 'arrow3'\n | 'bouncingBar'\n | 'bouncingBall'\n | 'smiley'\n | 'monkey'\n | 'hearts'\n | 'clock'\n | 'earth'\n | 'moon'\n | 'runner'\n | 'pong'\n | 'shark'\n | 'dqpb'\n | 'weather'\n | 'christmas'\n | 'grenade'\n | 'point'\n | 'layer'\n | 'betaWave'\n\nexport interface SpinnerProps {\n /** Text to display next to the spinner */\n text?: string\n /** Type of spinner animation */\n type?: SpinnerType\n /** Color of the spinner */\n color?: string\n /** Color of the text */\n textColor?: string\n /** Whether to show the spinner on the right */\n rightAlign?: boolean\n}\n\n/**\n * Animated loading spinner component with Dark Luxe theme\n */\nexport function Spinner({\n text,\n type = 'dots',\n color = theme.primary,\n textColor = theme.secondary,\n rightAlign = false,\n}: SpinnerProps) {\n const spinnerElement = (\n <Text color={color}>\n <InkSpinner type={type} />\n </Text>\n )\n\n if (!text) {\n return spinnerElement\n }\n\n return (\n <Box>\n {!rightAlign && spinnerElement}\n <Text color={textColor}>\n {rightAlign ? '' : ' '}{text}{rightAlign ? ' ' : ''}\n </Text>\n {rightAlign && spinnerElement}\n </Box>\n )\n}\n\n/**\n * Full-width loading state with spinner\n */\nexport function Loading({\n text = 'Loading...',\n type = 'dots',\n}: {\n text?: string\n type?: SpinnerType\n}) {\n return (\n <Box padding={1}>\n <Spinner text={text} type={type} />\n </Box>\n )\n}\n\n/**\n * Inline loading indicator (minimal)\n */\nexport function InlineSpinner({ color = theme.primary }: { color?: string }) {\n return (\n <Text color={color}>\n <InkSpinner type=\"dots\" />\n </Text>\n )\n}\n","import React from 'react'\nimport { Box, Text } from 'ink'\nimport { theme, borders } from './theme.js'\n\nexport interface Column<T> {\n /** Column header */\n header: string\n /** Key to access data or custom accessor */\n accessor: keyof T | ((row: T) => string | number)\n /** Column width (default: auto based on content) */\n width?: number\n /** Text alignment */\n align?: 'left' | 'center' | 'right'\n /** Header color */\n headerColor?: string\n /** Cell color or function to determine color */\n cellColor?: string | ((value: unknown, row: T) => string)\n}\n\nexport interface TableProps<T extends object> {\n /** Array of data rows */\n data: T[]\n /** Column definitions */\n columns: Column<T>[]\n /** Show borders around table */\n bordered?: boolean\n /** Border color */\n borderColor?: string\n /** Header background/style */\n headerBold?: boolean\n /** Striped rows */\n striped?: boolean\n /** Max width for the table */\n maxWidth?: number\n}\n\n/**\n * Get cell value from row based on accessor\n */\nfunction getCellValue<T>(row: T, accessor: Column<T>['accessor']): string {\n if (typeof accessor === 'function') {\n return String(accessor(row))\n }\n return String(row[accessor] ?? '')\n}\n\n/**\n * Calculate column widths based on content\n */\nfunction calculateColumnWidths<T extends object>(\n data: T[],\n columns: Column<T>[],\n maxWidth?: number\n): number[] {\n const widths = columns.map((col) => {\n const headerWidth = col.header.length\n const dataWidths = data.map((row) => getCellValue(row, col.accessor).length)\n const maxContentWidth = Math.max(headerWidth, ...dataWidths)\n return col.width ?? Math.min(maxContentWidth, 30) // Cap at 30 chars\n })\n\n // If maxWidth is set, proportionally reduce widths\n if (maxWidth) {\n const totalWidth = widths.reduce((a, b) => a + b, 0) + (columns.length * 3) + 1\n if (totalWidth > maxWidth) {\n const scale = maxWidth / totalWidth\n return widths.map((w) => Math.floor(w * scale))\n }\n }\n\n return widths\n}\n\n/**\n * Pad text to width with alignment\n */\nfunction padText(text: string, width: number, align: 'left' | 'center' | 'right' = 'left'): string {\n const truncated = text.length > width ? text.slice(0, width - 1) + '…' : text\n const padding = width - truncated.length\n\n switch (align) {\n case 'right':\n return ' '.repeat(padding) + truncated\n case 'center':\n const leftPad = Math.floor(padding / 2)\n const rightPad = padding - leftPad\n return ' '.repeat(leftPad) + truncated + ' '.repeat(rightPad)\n default:\n return truncated + ' '.repeat(padding)\n }\n}\n\n/**\n * Render a horizontal border line\n */\nfunction BorderLine({\n widths,\n position,\n color,\n}: {\n widths: number[]\n position: 'top' | 'middle' | 'bottom'\n color: string\n}) {\n const chars = {\n top: { left: borders.topLeft, right: borders.topRight, junction: borders.topT },\n middle: { left: borders.leftT, right: borders.rightT, junction: borders.cross },\n bottom: { left: borders.bottomLeft, right: borders.bottomRight, junction: borders.bottomT },\n }\n\n const { left, right, junction } = chars[position]\n const segments = widths.map((w) => borders.horizontal.repeat(w + 2))\n const line = left + segments.join(junction) + right\n\n return <Text color={color}>{line}</Text>\n}\n\n/**\n * Render a data row\n */\nfunction TableRow<T extends object>({\n row,\n columns,\n widths,\n bordered,\n borderColor,\n isEven,\n striped,\n}: {\n row: T\n columns: Column<T>[]\n widths: number[]\n bordered: boolean\n borderColor: string\n isEven: boolean\n striped: boolean\n}) {\n return (\n <Box>\n {bordered && <Text color={borderColor}>{borders.vertical}</Text>}\n {columns.map((col, i) => {\n const value = getCellValue(row, col.accessor)\n const colWidth = widths[i] ?? col.header.length\n const paddedValue = padText(value, colWidth, col.align)\n\n let cellColor: string = theme.secondary\n if (col.cellColor) {\n cellColor = typeof col.cellColor === 'function'\n ? col.cellColor(value, row)\n : col.cellColor\n }\n\n return (\n <React.Fragment key={i}>\n <Text> </Text>\n <Text color={cellColor} dimColor={striped && isEven}>\n {paddedValue}\n </Text>\n <Text> </Text>\n {bordered && <Text color={borderColor}>{borders.vertical}</Text>}\n </React.Fragment>\n )\n })}\n </Box>\n )\n}\n\n/**\n * Data table component with unicode borders\n *\n * Example output:\n * ```\n * ┌─────────────┬──────────┬──────────┐\n * │ Chain │ ID │ Type │\n * ├─────────────┼──────────┼──────────┤\n * │ Ethereum │ 1 │ Origin │\n * │ Arbitrum │ 42161 │ Origin │\n * └─────────────┴──────────┴──────────┘\n * ```\n */\nexport function Table<T extends object>({\n data,\n columns,\n bordered = true,\n borderColor = theme.border,\n headerBold = true,\n striped = false,\n maxWidth,\n}: TableProps<T>) {\n const widths = calculateColumnWidths(data, columns, maxWidth)\n\n return (\n <Box flexDirection=\"column\">\n {/* Top border */}\n {bordered && <BorderLine widths={widths} position=\"top\" color={borderColor} />}\n\n {/* Header row */}\n <Box>\n {bordered && <Text color={borderColor}>{borders.vertical}</Text>}\n {columns.map((col, i) => {\n const colWidth = widths[i] ?? col.header.length\n return (\n <React.Fragment key={i}>\n <Text> </Text>\n <Text color={col.headerColor ?? theme.primary} bold={headerBold}>\n {padText(col.header, colWidth, col.align)}\n </Text>\n <Text> </Text>\n {bordered && <Text color={borderColor}>{borders.vertical}</Text>}\n </React.Fragment>\n )\n })}\n </Box>\n\n {/* Header separator */}\n {bordered && <BorderLine widths={widths} position=\"middle\" color={borderColor} />}\n\n {/* Data rows */}\n {data.map((row, rowIndex) => (\n <TableRow\n key={rowIndex}\n row={row}\n columns={columns}\n widths={widths}\n bordered={bordered}\n borderColor={borderColor}\n isEven={rowIndex % 2 === 0}\n striped={striped}\n />\n ))}\n\n {/* Bottom border */}\n {bordered && <BorderLine widths={widths} position=\"bottom\" color={borderColor} />}\n </Box>\n )\n}\n\n/**\n * Simple key-value display (not a full table)\n */\nexport function KeyValue({\n items,\n keyColor = theme.muted,\n valueColor = theme.secondary,\n separator = ':',\n}: {\n items: Array<{ key: string; value: string | number }>\n keyColor?: string\n valueColor?: string\n separator?: string\n}) {\n const maxKeyWidth = Math.max(...items.map((item) => item.key.length))\n\n return (\n <Box flexDirection=\"column\">\n {items.map((item, index) => (\n <Box key={index}>\n <Text color={keyColor}>\n {item.key.padEnd(maxKeyWidth)}\n </Text>\n <Text color={theme.muted}> {separator} </Text>\n <Text color={valueColor}>{item.value}</Text>\n </Box>\n ))}\n </Box>\n )\n}\n","import React, { useState, useEffect } from 'react'\nimport { Box, Text, useApp } from 'ink'\nimport {\n Mina,\n getChains,\n getTokens,\n HYPEREVM_CHAIN_ID,\n HYPEREVM_USDC_ADDRESS,\n type Chain,\n type Token,\n type Quote,\n} from '@siphoyawe/mina-sdk'\nimport {\n Box as StyledBox,\n Divider,\n KeyValue,\n Spinner,\n theme,\n symbols,\n} from '../ui/index.js'\n\n/**\n * Props for the QuoteDisplay component\n */\ninterface QuoteDisplayProps {\n fromChain: string\n toChain: string\n token: string\n amount: string\n jsonOutput: boolean\n}\n\n/**\n * Parse amount string to smallest unit based on decimals\n */\nfunction parseAmount(amount: string, decimals: number): string {\n const [whole, fraction = ''] = amount.split('.')\n const paddedFraction = fraction.padEnd(decimals, '0').slice(0, decimals)\n return (whole || '0') + paddedFraction\n}\n\n/**\n * Format amount from smallest unit to human-readable\n */\nfunction formatAmount(amount: string, decimals: number): string {\n const padded = amount.padStart(decimals + 1, '0')\n const integerPart = padded.slice(0, -decimals) || '0'\n const decimalPart = padded.slice(-decimals)\n const trimmedDecimal = decimalPart.replace(/0+$/, '')\n return trimmedDecimal ? `${integerPart}.${trimmedDecimal}` : integerPart\n}\n\n/**\n * Format time in seconds to human-readable string\n */\nfunction formatTime(seconds: number): string {\n if (seconds < 60) {\n return `~${seconds} seconds`\n }\n const minutes = Math.ceil(seconds / 60)\n return `~${minutes} minute${minutes > 1 ? 's' : ''}`\n}\n\n/**\n * Format USD amount\n */\nfunction formatUsd(amount: number): string {\n return `$${amount.toFixed(2)}`\n}\n\n/**\n * Get route steps description\n */\nfunction getRouteDescription(quote: Quote): string {\n const stepTools = quote.steps.map(step => step.tool)\n // Remove duplicates and join\n const uniqueTools = [...new Set(stepTools)]\n return uniqueTools.join(' -> ')\n}\n\n/**\n * Quote display component (styled box)\n */\nfunction QuoteBox({\n quote,\n fromChain,\n toChain,\n sourceToken,\n destToken,\n}: {\n quote: Quote\n fromChain: Chain\n toChain: string\n sourceToken: Token\n destToken: Token\n}) {\n const inputAmount = formatAmount(quote.fromAmount, sourceToken.decimals)\n const outputAmount = formatAmount(quote.toAmount, destToken.decimals)\n const routeDescription = getRouteDescription(quote)\n const estimatedTime = formatTime(quote.estimatedTime)\n const totalFees = formatUsd(quote.fees.totalUsd)\n\n // Fee breakdown\n const gasFees = formatUsd(quote.fees.gasUsd)\n const bridgeFees = formatUsd(quote.fees.bridgeFeeUsd)\n const protocolFees = formatUsd(quote.fees.protocolFeeUsd)\n\n return (\n <Box flexDirection=\"column\">\n <StyledBox bordered title=\"Bridge Quote\" padding={1}>\n {/* From/To Section */}\n <KeyValue\n items={[\n { key: 'From', value: `${inputAmount} ${sourceToken.symbol} (${fromChain.name})` },\n { key: 'To', value: `~${outputAmount} ${destToken.symbol} (${toChain})` },\n ]}\n keyColor={theme.muted}\n valueColor={theme.primary}\n />\n\n <Box marginY={1}>\n <Divider width={45} />\n </Box>\n\n {/* Route Info */}\n <KeyValue\n items={[\n { key: 'Route', value: routeDescription },\n { key: 'Time', value: estimatedTime },\n { key: 'Fees', value: totalFees },\n ]}\n keyColor={theme.muted}\n valueColor={theme.secondary}\n />\n\n <Box marginY={1}>\n <Divider width={45} />\n </Box>\n\n {/* Fee Breakdown */}\n <Box marginBottom={1}>\n <Text color={theme.muted} bold>Fee Breakdown:</Text>\n </Box>\n <KeyValue\n items={[\n { key: ' Gas', value: gasFees },\n { key: ' Bridge', value: bridgeFees },\n { key: ' Protocol', value: protocolFees },\n { key: ' Total', value: totalFees },\n ]}\n keyColor={theme.muted}\n valueColor={theme.warning}\n />\n\n {/* Price Impact Warning */}\n {quote.highImpact && (\n <Box marginTop={1}>\n <Text color={theme.warning}>\n {symbols.pending} High price impact: {(quote.priceImpact * 100).toFixed(2)}%\n </Text>\n </Box>\n )}\n\n {/* Minimum Received */}\n <Box marginTop={1}>\n <Text color={theme.muted}>\n Min. received: {quote.minimumReceivedFormatted} {destToken.symbol}\n </Text>\n </Box>\n </StyledBox>\n </Box>\n )\n}\n\n/**\n * JSON output for machine-readable format\n */\nfunction JsonOutput({ quote, fromChain, sourceToken }: {\n quote: Quote\n fromChain: Chain\n sourceToken: Token\n}) {\n const jsonData = {\n quote: {\n id: quote.id,\n from: {\n chain: fromChain.name,\n chainId: fromChain.id,\n token: sourceToken.symbol,\n amount: formatAmount(quote.fromAmount, sourceToken.decimals),\n amountRaw: quote.fromAmount,\n },\n to: {\n chain: 'Hyperliquid',\n chainId: HYPEREVM_CHAIN_ID,\n token: quote.toToken.symbol,\n amount: formatAmount(quote.toAmount, quote.toToken.decimals),\n amountRaw: quote.toAmount,\n },\n route: {\n steps: quote.steps.map(step => ({\n type: step.type,\n tool: step.tool,\n fromChain: step.fromChainId,\n toChain: step.toChainId,\n estimatedTime: step.estimatedTime,\n })),\n totalSteps: quote.steps.length,\n },\n fees: {\n total: quote.fees.totalUsd,\n gas: quote.fees.gasUsd,\n bridge: quote.fees.bridgeFeeUsd,\n protocol: quote.fees.protocolFeeUsd,\n },\n estimatedTime: quote.estimatedTime,\n priceImpact: quote.priceImpact,\n highImpact: quote.highImpact,\n slippageTolerance: quote.slippageTolerance,\n minimumReceived: quote.minimumReceivedFormatted,\n expiresAt: quote.expiresAt,\n },\n }\n\n return <Text>{JSON.stringify(jsonData, null, 2)}</Text>\n}\n\n/**\n * Error display component\n */\nfunction ErrorDisplay({ message }: { message: string }) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Box>\n <Text color={theme.error} bold>\n {symbols.failed} Error: {message}\n </Text>\n </Box>\n <Box marginTop={1}>\n <Text color={theme.muted}>\n Usage: npx mina quote --from <chain> --token <symbol> --amount <number>\n </Text>\n </Box>\n <Box marginTop={1}>\n <Text color={theme.muted}>Example: npx mina quote --from arbitrum --token USDC --amount 100</Text>\n </Box>\n </Box>\n )\n}\n\n/**\n * Main QuoteDisplay component\n */\nexport function QuoteDisplay({\n fromChain,\n toChain,\n token,\n amount,\n jsonOutput,\n}: QuoteDisplayProps) {\n const { exit } = useApp()\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n const [quote, setQuote] = useState<Quote | null>(null)\n const [sourceChain, setSourceChain] = useState<Chain | null>(null)\n const [sourceToken, setSourceToken] = useState<Token | null>(null)\n const [destToken, setDestToken] = useState<Token | null>(null)\n\n useEffect(() => {\n async function fetchQuote() {\n try {\n setLoading(true)\n setError(null)\n\n // Validate amount\n const numAmount = parseFloat(amount)\n if (isNaN(numAmount) || numAmount <= 0) {\n throw new Error('Invalid amount. Please provide a positive number.')\n }\n\n // Find source chain by name/key (case insensitive)\n const chainsResponse = await getChains()\n const chain = chainsResponse.chains.find(\n c =>\n c.name.toLowerCase() === fromChain.toLowerCase() ||\n c.key.toLowerCase() === fromChain.toLowerCase()\n )\n\n if (!chain) {\n const availableChains = chainsResponse.chains.map(c => c.name).join(', ')\n throw new Error(\n `Unknown chain: \"${fromChain}\". Available chains: ${availableChains}`\n )\n }\n setSourceChain(chain)\n\n // Find token by symbol\n const tokensResponse = await getTokens(chain.id)\n const foundToken = tokensResponse.tokens.find(\n t => t.symbol.toLowerCase() === token.toLowerCase()\n )\n\n if (!foundToken) {\n const availableTokens = tokensResponse.tokens\n .slice(0, 10)\n .map(t => t.symbol)\n .join(', ')\n throw new Error(\n `Token \"${token}\" not found on ${chain.name}. Available tokens include: ${availableTokens}...`\n )\n }\n setSourceToken(foundToken)\n\n // Create destination token reference (HyperEVM USDC)\n const destinationToken: Token = {\n address: HYPEREVM_USDC_ADDRESS,\n symbol: 'USDC',\n name: 'USD Coin',\n decimals: 6,\n logoUrl: '',\n chainId: HYPEREVM_CHAIN_ID,\n }\n setDestToken(destinationToken)\n\n // Get quote\n const mina = new Mina({ integrator: 'mina-cli' })\n const quoteResult = await mina.getQuote({\n fromChainId: chain.id,\n toChainId: HYPEREVM_CHAIN_ID,\n fromToken: foundToken.address,\n toToken: HYPEREVM_USDC_ADDRESS,\n fromAmount: parseAmount(amount, foundToken.decimals),\n fromAddress: '0x0000000000000000000000000000000000000000', // Placeholder for quote\n })\n\n setQuote(quoteResult)\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to fetch quote'\n setError(message)\n } finally {\n setLoading(false)\n }\n }\n\n fetchQuote()\n }, [fromChain, token, amount])\n\n // Exit after rendering JSON output\n useEffect(() => {\n if (!loading && jsonOutput) {\n // Give time for output to render\n const timer = setTimeout(() => exit(), 100)\n return () => clearTimeout(timer)\n }\n }, [loading, jsonOutput, exit])\n\n if (loading) {\n return (\n <Box padding={1}>\n <Spinner text={`Fetching quote for ${amount} ${token} from ${fromChain}...`} />\n </Box>\n )\n }\n\n if (error) {\n return <ErrorDisplay message={error} />\n }\n\n if (!quote || !sourceChain || !sourceToken || !destToken) {\n return <ErrorDisplay message=\"Failed to fetch quote data\" />\n }\n\n if (jsonOutput) {\n return <JsonOutput quote={quote} fromChain={sourceChain} sourceToken={sourceToken} />\n }\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n <QuoteBox\n quote={quote}\n fromChain={sourceChain}\n toChain={toChain === 'hyperliquid' ? 'Hyperliquid' : toChain}\n sourceToken={sourceToken}\n destToken={destToken}\n />\n\n {/* Quote expiry info */}\n <Box marginTop={1}>\n <Text color={theme.muted}>\n Quote valid until: {new Date(quote.expiresAt).toLocaleTimeString()}\n </Text>\n </Box>\n </Box>\n )\n}\n\n/**\n * Quote command handler\n */\nexport interface QuoteCommandOptions {\n from: string\n to: string\n token: string\n amount: string\n json?: boolean\n}\n\nexport default QuoteDisplay\n","import React, { useState, useEffect } from 'react'\nimport { Box, Text, useApp } from 'ink'\nimport {\n getChains,\n HYPEREVM_CHAIN_ID,\n type Chain,\n} from '@siphoyawe/mina-sdk'\nimport {\n Header,\n Table,\n Spinner,\n theme,\n symbols,\n type Column,\n} from '../ui/index.js'\n\n/**\n * Chain display row type\n */\ninterface ChainRow {\n name: string\n id: number\n type: 'Origin' | 'Dest'\n}\n\n/**\n * Chains command component - displays supported chains table\n */\nexport function ChainsCommand({ json = false }: { json?: boolean }) {\n const { exit } = useApp()\n const [chains, setChains] = useState<ChainRow[]>([])\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n async function loadChains() {\n try {\n setLoading(true)\n setError(null)\n\n const response = await getChains()\n\n // Map chains to display format\n const chainRows: ChainRow[] = response.chains.map((chain: Chain) => ({\n name: chain.name,\n id: chain.id,\n type: 'Origin' as const,\n }))\n\n // Add HyperEVM as destination\n // Check if HyperEVM already exists in the list\n const hasHyperEvm = chainRows.some(c => c.id === HYPEREVM_CHAIN_ID)\n if (!hasHyperEvm) {\n chainRows.push({\n name: 'Hyperliquid',\n id: HYPEREVM_CHAIN_ID,\n type: 'Dest',\n })\n } else {\n // Mark existing HyperEVM as destination\n const hyperEvmChain = chainRows.find(c => c.id === HYPEREVM_CHAIN_ID)\n if (hyperEvmChain) {\n hyperEvmChain.type = 'Dest'\n }\n }\n\n // Sort: Origin chains first (alphabetically), then Dest\n chainRows.sort((a, b) => {\n if (a.type !== b.type) {\n return a.type === 'Origin' ? -1 : 1\n }\n return a.name.localeCompare(b.name)\n })\n\n setChains(chainRows)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load chains')\n } finally {\n setLoading(false)\n }\n }\n loadChains()\n }, [])\n\n // Exit after rendering in JSON mode\n useEffect(() => {\n if (!loading && json) {\n setTimeout(() => exit(), 100)\n }\n }, [loading, json, exit])\n\n // JSON output mode\n if (json) {\n if (loading) return null\n if (error) {\n console.error(JSON.stringify({ error }, null, 2))\n return null\n }\n console.log(JSON.stringify(chains, null, 2))\n return null\n }\n\n if (loading) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Header compact showTagline={false} />\n <Spinner text=\"Loading supported chains...\" />\n </Box>\n )\n }\n\n if (error) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Header compact showTagline={false} />\n <Box>\n <Text color={theme.error}>{symbols.failed} Error: {error}</Text>\n </Box>\n </Box>\n )\n }\n\n // Define table columns\n const columns: Column<ChainRow>[] = [\n {\n header: 'Chain',\n accessor: 'name',\n headerColor: theme.primary,\n cellColor: theme.secondary,\n },\n {\n header: 'ID',\n accessor: (row) => String(row.id),\n align: 'right',\n headerColor: theme.primary,\n cellColor: theme.muted,\n },\n {\n header: 'Type',\n accessor: 'type',\n headerColor: theme.primary,\n cellColor: (value) =>\n value === 'Origin' ? theme.success : theme.accent,\n },\n ]\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Header compact showTagline={false} />\n\n <Box marginBottom={1}>\n <Text color={theme.secondary}>\n {symbols.arrow} Supported Chains ({chains.length})\n </Text>\n </Box>\n\n <Table\n data={chains}\n columns={columns}\n bordered\n borderColor={theme.border}\n />\n\n <Box marginTop={1}>\n <Text color={theme.muted} dimColor>\n Origin = Source chains for bridging | Dest = Destination chain\n </Text>\n </Box>\n </Box>\n )\n}\n\nexport default ChainsCommand\n","import React, { useState, useEffect } from 'react'\nimport { Box, Text, useApp } from 'ink'\nimport {\n getChains,\n getBridgeableTokens,\n type Chain,\n type Token,\n} from '@siphoyawe/mina-sdk'\nimport {\n Header,\n Table,\n Spinner,\n theme,\n symbols,\n type Column,\n} from '../ui/index.js'\n\n/**\n * Truncate address for display\n */\nfunction truncateAddress(address: string): string {\n if (address.length <= 14) return address\n return `${address.slice(0, 10)}...${address.slice(-4)}`\n}\n\n/**\n * Token display row type\n */\ninterface TokenRow {\n symbol: string\n address: string\n displayAddress: string\n decimals: number\n name?: string\n}\n\n/**\n * Resolve chain name or ID to chain ID\n */\nasync function resolveChainId(chainInput: string): Promise<{ chainId: number; chainName: string } | null> {\n // Check if it's a numeric ID\n const numericId = parseInt(chainInput, 10)\n if (!isNaN(numericId)) {\n const response = await getChains()\n const chain = response.chains.find((c: Chain) => c.id === numericId)\n if (chain) {\n return { chainId: chain.id, chainName: chain.name }\n }\n // Still try with the ID even if not found\n return { chainId: numericId, chainName: chainInput }\n }\n\n // Otherwise treat as chain name/key\n const response = await getChains()\n const chainLower = chainInput.toLowerCase()\n const chain = response.chains.find((c: Chain) =>\n c.name.toLowerCase() === chainLower ||\n c.key?.toLowerCase() === chainLower\n )\n\n if (chain) {\n return { chainId: chain.id, chainName: chain.name }\n }\n\n return null\n}\n\n/**\n * Tokens command component - displays bridgeable tokens table\n */\nexport function TokensCommand({\n chain,\n json = false,\n}: {\n chain?: string\n json?: boolean\n}) {\n const { exit } = useApp()\n const [tokens, setTokens] = useState<TokenRow[]>([])\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n const [chainName, setChainName] = useState<string>('')\n const [availableChains, setAvailableChains] = useState<Chain[]>([])\n\n useEffect(() => {\n async function loadTokens() {\n try {\n setLoading(true)\n setError(null)\n\n // If no chain specified, show available chains hint\n if (!chain) {\n const chainsResponse = await getChains()\n setAvailableChains(chainsResponse.chains)\n setError('Please specify a chain with --chain <name|id>')\n setLoading(false)\n return\n }\n\n // Resolve chain name to ID\n const resolved = await resolveChainId(chain)\n if (!resolved) {\n const chainsResponse = await getChains()\n setAvailableChains(chainsResponse.chains)\n setError(`Unknown chain: \"${chain}\"`)\n setLoading(false)\n return\n }\n\n setChainName(resolved.chainName)\n\n // Fetch bridgeable tokens for the chain\n const response = await getBridgeableTokens(resolved.chainId)\n\n // Map tokens to display format\n const tokenRows: TokenRow[] = response.tokens.map((token: Token) => ({\n symbol: token.symbol,\n address: token.address,\n displayAddress: truncateAddress(token.address),\n decimals: token.decimals,\n name: token.name,\n }))\n\n // Sort alphabetically by symbol\n tokenRows.sort((a, b) => a.symbol.localeCompare(b.symbol))\n\n setTokens(tokenRows)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load tokens')\n } finally {\n setLoading(false)\n }\n }\n loadTokens()\n }, [chain])\n\n // Exit after rendering in JSON mode\n useEffect(() => {\n if (!loading && json) {\n setTimeout(() => exit(), 100)\n }\n }, [loading, json, exit])\n\n // JSON output mode\n if (json) {\n if (loading) return null\n if (error && !availableChains.length) {\n console.error(JSON.stringify({ error }, null, 2))\n return null\n }\n if (error && availableChains.length) {\n console.error(JSON.stringify({\n error,\n availableChains: availableChains.map(c => ({ name: c.name, id: c.id }))\n }, null, 2))\n return null\n }\n console.log(JSON.stringify(tokens.map(t => ({\n symbol: t.symbol,\n address: t.address,\n decimals: t.decimals,\n name: t.name,\n })), null, 2))\n return null\n }\n\n if (loading) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Header compact showTagline={false} />\n <Spinner text={chain ? `Loading tokens for ${chain}...` : 'Loading...'} />\n </Box>\n )\n }\n\n if (error) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Header compact showTagline={false} />\n <Box marginBottom={1}>\n <Text color={theme.error}>{symbols.failed} {error}</Text>\n </Box>\n\n {availableChains.length > 0 && (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text color={theme.secondary}>Available chains:</Text>\n </Box>\n {availableChains.slice(0, 10).map((c, i) => (\n <Box key={i}>\n <Text color={theme.muted}> {symbols.arrow} </Text>\n <Text color={theme.primary}>{c.name}</Text>\n <Text color={theme.muted}> (ID: {c.id})</Text>\n </Box>\n ))}\n {availableChains.length > 10 && (\n <Box marginTop={1}>\n <Text color={theme.muted} dimColor>\n ...and {availableChains.length - 10} more. Use \"mina chains\" to see all.\n </Text>\n </Box>\n )}\n <Box marginTop={1}>\n <Text color={theme.muted} dimColor>\n Example: mina tokens --chain arbitrum\n </Text>\n </Box>\n </Box>\n )}\n </Box>\n )\n }\n\n if (tokens.length === 0) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Header compact showTagline={false} />\n <Box>\n <Text color={theme.warning}>\n {symbols.pending} No bridgeable tokens found for {chainName}\n </Text>\n </Box>\n </Box>\n )\n }\n\n // Define table columns\n const columns: Column<TokenRow>[] = [\n {\n header: 'Symbol',\n accessor: 'symbol',\n headerColor: theme.primary,\n cellColor: theme.success,\n },\n {\n header: 'Address',\n accessor: 'displayAddress',\n headerColor: theme.primary,\n cellColor: theme.muted,\n width: 20,\n },\n {\n header: 'Decimals',\n accessor: (row) => String(row.decimals),\n align: 'right',\n headerColor: theme.primary,\n cellColor: theme.secondary,\n },\n ]\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Header compact showTagline={false} />\n\n <Box marginBottom={1}>\n <Text color={theme.secondary}>\n {symbols.arrow} Bridgeable Tokens on{' '}\n </Text>\n <Text color={theme.primary} bold>\n {chainName}\n </Text>\n <Text color={theme.muted}> ({tokens.length})</Text>\n </Box>\n\n <Table\n data={tokens}\n columns={columns}\n bordered\n borderColor={theme.border}\n />\n\n <Box marginTop={1}>\n <Text color={theme.muted} dimColor>\n Tokens that can be bridged to Hyperliquid via Mina\n </Text>\n </Box>\n </Box>\n )\n}\n\nexport default TokensCommand\n","import React, { useState, useEffect, useCallback, useMemo } from 'react'\nimport { Box, Text, useApp } from 'ink'\nimport {\n Mina,\n type TransactionStatus,\n type StepStatus,\n} from '@siphoyawe/mina-sdk'\nimport {\n Header,\n theme,\n symbols,\n Box as StyledBox,\n KeyValue,\n Spinner,\n} from '../ui/index.js'\n\n/**\n * Props for the Status command component\n */\ninterface StatusCommandProps {\n txHash: string\n watch?: boolean\n}\n\n/**\n * Format duration from milliseconds to human readable string\n */\nfunction formatDuration(ms: number): string {\n const seconds = Math.floor(ms / 1000)\n if (seconds < 60) return `${seconds}s`\n const minutes = Math.floor(seconds / 60)\n const remainingSeconds = seconds % 60\n return `${minutes}m ${remainingSeconds}s`\n}\n\n/**\n * Format timestamp to relative time\n */\nfunction formatRelativeTime(timestamp: number): string {\n const now = Date.now()\n const diff = now - timestamp\n return formatDuration(diff) + ' ago'\n}\n\n/**\n * Truncate transaction hash for display\n */\nfunction truncateHash(hash: string): string {\n if (hash.length <= 16) return hash\n return `${hash.slice(0, 8)}...${hash.slice(-6)}`\n}\n\n/**\n * Get status color based on status\n */\nfunction getStatusColor(status: string): string {\n switch (status) {\n case 'completed':\n return theme.success\n case 'failed':\n return theme.error\n case 'pending':\n return theme.muted\n case 'bridging':\n case 'depositing':\n case 'executing':\n return theme.primary\n default:\n return theme.secondary\n }\n}\n\n/**\n * Get step status indicator\n */\nfunction getStepIndicator(status: string): React.ReactNode {\n switch (status) {\n case 'pending':\n return <Text color={theme.muted}>{symbols.pending}</Text>\n case 'executing':\n return (\n <Text color={theme.primary}>\n <Spinner />\n </Text>\n )\n case 'completed':\n return <Text color={theme.success}>{symbols.completed}</Text>\n case 'failed':\n return <Text color={theme.error}>{symbols.failed}</Text>\n default:\n return <Text color={theme.muted}>{symbols.pending}</Text>\n }\n}\n\n/**\n * Calculate overall progress percentage based on steps\n */\nfunction calculateProgress(steps: StepStatus[]): number {\n if (steps.length === 0) return 0\n const completedSteps = steps.filter(s => s.status === 'completed').length\n const executingSteps = steps.filter(s => s.status === 'executing').length\n // Count executing steps as 50% complete\n return Math.round(((completedSteps + executingSteps * 0.5) / steps.length) * 100)\n}\n\n/**\n * Get current step info\n */\nfunction getCurrentStepInfo(steps: StepStatus[]): { current: number; total: number } {\n const total = steps.length\n const current = steps.findIndex(s => s.status === 'executing' || s.status === 'pending')\n // If all completed, return total\n if (current === -1) {\n return { current: total, total }\n }\n // Add 1 for 1-based display\n return { current: current + 1, total }\n}\n\n/**\n * Format step type for display\n */\nfunction formatStepType(stepType?: string): string {\n if (!stepType) return 'Unknown'\n const mapping: Record<string, string> = {\n approval: 'Approval',\n swap: 'Swap',\n bridge: 'Bridging',\n deposit: 'Deposit',\n }\n return mapping[stepType] || stepType.charAt(0).toUpperCase() + stepType.slice(1)\n}\n\n/**\n * Status display component\n */\nfunction StatusDisplay({\n status,\n txHash,\n elapsedTime,\n estimatedRemaining,\n}: {\n status: TransactionStatus\n txHash: string\n elapsedTime: number\n estimatedRemaining: number | null\n}) {\n const stepInfo = getCurrentStepInfo(status.steps)\n const progress = calculateProgress(status.steps)\n const statusLabel = status.status.charAt(0).toUpperCase() + status.status.slice(1)\n\n return (\n <Box flexDirection=\"column\">\n {/* Header Section */}\n <StyledBox bordered title=\"Bridge Status\" padding={1}>\n <KeyValue\n items={[\n { key: 'TX', value: truncateHash(txHash) },\n { key: 'Status', value: `${statusLabel} (Step ${stepInfo.current}/${stepInfo.total})` },\n ]}\n valueColor={getStatusColor(status.status)}\n />\n </StyledBox>\n\n {/* Progress Steps Section */}\n <Box marginTop={1}>\n <StyledBox bordered padding={1}>\n <Box flexDirection=\"column\">\n {status.steps.map((step, index) => (\n <Box key={step.stepId}>\n <Box width={3}>{getStepIndicator(step.status)}</Box>\n <Box flexGrow={1}>\n <Text\n color={getStatusColor(step.status)}\n bold={step.status === 'executing'}\n dimColor={step.status === 'pending'}\n >\n {formatStepType(step.stepType)}\n {step.status === 'executing' && progress > 0 && ` (${progress}%)`}\n </Text>\n </Box>\n {step.txHash && (\n <Box marginLeft={2}>\n <Text color={theme.muted} dimColor>\n {truncateHash(step.txHash)}\n </Text>\n </Box>\n )}\n </Box>\n ))}\n {status.steps.length === 0 && (\n <Text color={theme.muted}>No steps found</Text>\n )}\n </Box>\n </StyledBox>\n </Box>\n\n {/* Timing Section */}\n <Box marginTop={1}>\n <StyledBox bordered padding={1}>\n <KeyValue\n items={[\n { key: 'Elapsed', value: formatDuration(elapsedTime) },\n {\n key: 'Remaining',\n value: estimatedRemaining !== null ? `~${formatDuration(estimatedRemaining)}` : 'Calculating...'\n },\n ]}\n keyColor={theme.muted}\n valueColor={theme.secondary}\n />\n </StyledBox>\n </Box>\n\n {/* Error Section (if failed) */}\n {status.status === 'failed' && (\n <Box marginTop={1}>\n <StyledBox bordered borderColor={theme.error} padding={1}>\n <Box flexDirection=\"column\">\n <Text color={theme.error} bold>\n {symbols.failed} Transaction Failed\n </Text>\n {status.steps.find(s => s.status === 'failed')?.error && (\n <Box marginTop={1}>\n <Text color={theme.muted}>\n {status.steps.find(s => s.status === 'failed')?.error}\n </Text>\n </Box>\n )}\n </Box>\n </StyledBox>\n </Box>\n )}\n\n {/* Success Section */}\n {status.status === 'completed' && (\n <Box marginTop={1}>\n <StyledBox bordered borderColor={theme.success} padding={1}>\n <Box flexDirection=\"column\">\n <Text color={theme.success} bold>\n {symbols.completed} Bridge Completed Successfully\n </Text>\n {status.bridgeTxHash && (\n <Box marginTop={1}>\n <KeyValue\n items={[\n { key: 'Bridge TX', value: truncateHash(status.bridgeTxHash) },\n ...(status.depositTxHash ? [{ key: 'Deposit TX', value: truncateHash(status.depositTxHash) }] : []),\n ]}\n keyColor={theme.muted}\n valueColor={theme.success}\n />\n </Box>\n )}\n </Box>\n </StyledBox>\n </Box>\n )}\n </Box>\n )\n}\n\n/**\n * Loading state component\n */\nfunction LoadingState({ txHash }: { txHash: string }) {\n return (\n <Box flexDirection=\"column\">\n <StyledBox bordered title=\"Bridge Status\" padding={1}>\n <Box>\n <Spinner text={`Looking up ${truncateHash(txHash)}...`} />\n </Box>\n </StyledBox>\n </Box>\n )\n}\n\n/**\n * Not found state component\n */\nfunction NotFoundState({ txHash }: { txHash: string }) {\n return (\n <Box flexDirection=\"column\">\n <StyledBox bordered borderColor={theme.warning} title=\"Bridge Status\" padding={1}>\n <Box flexDirection=\"column\">\n <Text color={theme.warning}>\n {symbols.pending} Transaction not found\n </Text>\n <Box marginTop={1}>\n <Text color={theme.muted}>\n TX: {truncateHash(txHash)}\n </Text>\n </Box>\n <Box marginTop={1}>\n <Text color={theme.muted} dimColor>\n The transaction may not have been initiated via this CLI,\n or it may have expired from the local cache.\n </Text>\n </Box>\n </Box>\n </StyledBox>\n </Box>\n )\n}\n\n/**\n * Error state component\n */\nfunction ErrorState({ error }: { error: string }) {\n return (\n <Box flexDirection=\"column\">\n <StyledBox bordered borderColor={theme.error} title=\"Error\" padding={1}>\n <Text color={theme.error}>\n {symbols.failed} {error}\n </Text>\n </StyledBox>\n </Box>\n )\n}\n\n/**\n * Main Status component\n */\nexport function Status({ txHash, watch = false }: StatusCommandProps) {\n const { exit } = useApp()\n const [status, setStatus] = useState<TransactionStatus | null>(null)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n const [notFound, setNotFound] = useState(false)\n const [startTime] = useState(Date.now())\n const [elapsedTime, setElapsedTime] = useState(0)\n\n // Create Mina client (memoized to avoid recreation on each render)\n const mina = useMemo(() => new Mina({ integrator: 'mina-cli' }), [])\n\n // Fetch status\n const fetchStatus = useCallback(async () => {\n try {\n const result = await mina.getStatus(txHash)\n if (result === null) {\n setNotFound(true)\n setLoading(false)\n // Exit if not watching and not found\n if (!watch) {\n setTimeout(() => exit(), 100)\n }\n return\n }\n setStatus(result)\n setNotFound(false)\n setLoading(false)\n\n // Exit if completed/failed and not watching\n if (!watch && (result.status === 'completed' || result.status === 'failed')) {\n setTimeout(() => exit(), 100)\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to fetch status')\n setLoading(false)\n if (!watch) {\n setTimeout(() => exit(), 100)\n }\n }\n }, [txHash, watch, exit, mina])\n\n // Initial fetch\n useEffect(() => {\n fetchStatus()\n }, [fetchStatus])\n\n // Watch mode polling\n useEffect(() => {\n if (!watch) return\n\n const interval = setInterval(() => {\n fetchStatus()\n }, 5000) // Poll every 5 seconds\n\n return () => clearInterval(interval)\n }, [watch, fetchStatus])\n\n // Update elapsed time\n useEffect(() => {\n const interval = setInterval(() => {\n setElapsedTime(Date.now() - (status?.createdAt || startTime))\n }, 1000)\n\n return () => clearInterval(interval)\n }, [status?.createdAt, startTime])\n\n // Calculate estimated remaining time\n const estimatedRemaining = status\n ? (() => {\n // Estimate based on progress\n const progress = calculateProgress(status.steps)\n if (progress === 0) return null\n if (progress >= 100) return 0\n // Simple linear estimation\n const elapsed = elapsedTime\n const totalEstimated = (elapsed / progress) * 100\n return Math.max(0, totalEstimated - elapsed)\n })()\n : null\n\n // Render\n return (\n <Box flexDirection=\"column\" padding={1}>\n {/* Header */}\n <Header showTagline={false} />\n\n {/* Watch mode indicator */}\n {watch && (\n <Box marginBottom={1}>\n <Text color={theme.primary}>\n <Spinner /> Watching for updates (polling every 5s)\n </Text>\n </Box>\n )}\n\n {/* Content */}\n <Box marginTop={1}>\n {loading && <LoadingState txHash={txHash} />}\n {error && <ErrorState error={error} />}\n {notFound && !loading && <NotFoundState txHash={txHash} />}\n {status && !loading && !error && (\n <StatusDisplay\n status={status}\n txHash={txHash}\n elapsedTime={elapsedTime}\n estimatedRemaining={estimatedRemaining}\n />\n )}\n </Box>\n\n {/* Navigation hints */}\n <Box marginTop={1}>\n <Text color={theme.muted} dimColor>\n {watch ? 'Ctrl+C to stop watching' : 'Press any key to exit'}\n </Text>\n </Box>\n </Box>\n )\n}\n\n/**\n * Status command handler for commander\n */\nexport async function statusCommand(\n txHash: string,\n options: { watch?: boolean }\n): Promise<void> {\n const { render } = await import('ink')\n const React = await import('react')\n\n render(React.createElement(Status, { txHash, watch: options.watch }))\n}\n\nexport default Status\n","import React, { useState, useEffect, useCallback } from 'react'\nimport { Box, Text, useApp, useInput } from 'ink'\nimport {\n Mina,\n getChains,\n getBridgeableTokens,\n getQuote,\n type Chain,\n type Token,\n type Quote,\n type ExecutionResult,\n type StepStatusPayload,\n type TransactionStatusPayload,\n HYPEREVM_CHAIN_ID,\n HYPEREVM_USDC_ADDRESS,\n normalizeError,\n isRecoverableError,\n RECOVERY_ACTIONS,\n} from '@siphoyawe/mina-sdk'\nimport {\n Header,\n theme,\n symbols,\n Spinner,\n ProgressSteps,\n KeyValue,\n Box as StyledBox,\n Divider,\n type Step as ProgressStep,\n} from '../ui/index.js'\nimport { loadPrivateKey, createSigner, getAddressFromPrivateKey } from '../lib/wallet.js'\n\n/**\n * Bridge command options from CLI\n */\nexport interface BridgeCommandOptions {\n from: string\n token: string\n amount: string\n key?: string\n yes?: boolean\n autoDeposit?: boolean\n}\n\n/**\n * Bridge execution state\n */\ntype BridgeState =\n | 'loading'\n | 'loaded'\n | 'confirming'\n | 'executing'\n | 'completed'\n | 'failed'\n\n/**\n * Step status for progress display\n */\ninterface BridgeStepState {\n loading: 'pending' | 'active' | 'completed' | 'failed'\n quote: 'pending' | 'active' | 'completed' | 'failed'\n approval: 'pending' | 'active' | 'completed' | 'failed'\n bridge: 'pending' | 'active' | 'completed' | 'failed'\n confirm: 'pending' | 'active' | 'completed' | 'failed'\n}\n\n/**\n * Props for the Bridge component\n */\ninterface BridgeProps {\n options: BridgeCommandOptions\n}\n\n/**\n * Error display component with recovery suggestions\n */\nfunction ErrorDisplay({\n error,\n recoveryAction,\n}: {\n error: Error\n recoveryAction?: string\n}) {\n const normalizedError = normalizeError(error)\n const isRecoverable = isRecoverableError(normalizedError)\n\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <Box>\n <Text color={theme.error} bold>\n {symbols.failed} Error: {normalizedError.message}\n </Text>\n </Box>\n\n {recoveryAction && (\n <Box marginTop={1}>\n <Text color={theme.warning}>\n {symbols.arrow} Recovery suggestion: {recoveryAction}\n </Text>\n </Box>\n )}\n\n {isRecoverable && (\n <Box marginTop={1}>\n <Text color={theme.muted} dimColor>\n This error may be temporary. Try again in a few moments.\n </Text>\n </Box>\n )}\n </Box>\n )\n}\n\n/**\n * Quote display component\n */\nfunction QuoteDisplay({\n quote,\n chain,\n token,\n amount,\n}: {\n quote: Quote\n chain: Chain\n token: Token\n amount: string\n}) {\n const estimatedMinutes = Math.ceil(quote.estimatedTime / 60)\n const outputFormatted = (Number(quote.toAmount) / Math.pow(10, quote.toToken.decimals)).toFixed(2)\n\n return (\n <StyledBox bordered title=\"Bridge Quote\" padding={1}>\n <KeyValue\n items={[\n { key: 'From Chain', value: chain.name },\n { key: 'Token', value: `${amount} ${token.symbol}` },\n { key: 'To Chain', value: 'HyperEVM' },\n { key: 'You Receive', value: `~${outputFormatted} ${quote.toToken.symbol}` },\n ]}\n />\n\n <Box marginTop={1} marginBottom={1}>\n <Divider width={40} />\n </Box>\n\n <KeyValue\n items={[\n { key: 'Gas Fee', value: `$${quote.fees.gasUsd.toFixed(2)}` },\n { key: 'Bridge Fee', value: `$${quote.fees.bridgeFeeUsd.toFixed(2)}` },\n { key: 'Total Fees', value: `$${quote.fees.totalUsd.toFixed(2)}` },\n { key: 'Est. Time', value: `~${estimatedMinutes} min` },\n ]}\n keyColor={theme.muted}\n valueColor={theme.warning}\n />\n\n {quote.highImpact && (\n <Box marginTop={1}>\n <Text color={theme.warning}>\n {symbols.pending} Warning: High price impact ({(quote.priceImpact * 100).toFixed(2)}%)\n </Text>\n </Box>\n )}\n\n {quote.includesAutoDeposit && (\n <Box marginTop={1}>\n <Text color={theme.success} dimColor>\n {symbols.check} Auto-deposit to Hyperliquid L1 included\n </Text>\n </Box>\n )}\n </StyledBox>\n )\n}\n\n/**\n * Bridge progress component\n */\nfunction BridgeProgressDisplay({\n stepState,\n error,\n currentStepDescription,\n}: {\n stepState: BridgeStepState\n error?: string\n currentStepDescription?: string\n}) {\n const steps: ProgressStep[] = [\n {\n label: 'Loading wallet & chain data',\n status: stepState.loading,\n },\n {\n label: 'Fetching bridge quote',\n status: stepState.quote,\n },\n {\n label: 'Approving token spend',\n status: stepState.approval,\n description: stepState.approval === 'active' ? 'Waiting for approval transaction...' : undefined,\n },\n {\n label: 'Executing bridge transaction',\n status: stepState.bridge,\n description: stepState.bridge === 'active' ? 'Waiting for bridge transaction...' : undefined,\n },\n {\n label: 'Confirming on destination',\n status: stepState.confirm,\n description: stepState.confirm === 'active' ? currentStepDescription : error,\n },\n ]\n\n // Mark failed step\n if (error) {\n const activeIndex = steps.findIndex(s => s.status === 'active' || s.status === 'failed')\n if (activeIndex >= 0) {\n const step = steps[activeIndex]\n if (step) {\n step.status = 'failed'\n step.description = error\n }\n }\n }\n\n return <ProgressSteps steps={steps} title=\"Bridge Progress\" showNumbers />\n}\n\n/**\n * Success display component\n */\nfunction SuccessDisplay({\n result,\n chain,\n token,\n amount,\n}: {\n result: ExecutionResult\n chain: Chain\n token: Token\n amount: string\n}) {\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <Box>\n <Text color={theme.success} bold>\n {symbols.check} Bridge completed successfully!\n </Text>\n </Box>\n\n <Box marginTop={1}>\n <StyledBox bordered padding={1}>\n <KeyValue\n items={[\n { key: 'Status', value: 'Success' },\n { key: 'From', value: `${amount} ${token.symbol} on ${chain.name}` },\n { key: 'To', value: 'USDC on HyperEVM' },\n ...(result.txHash ? [{ key: 'Bridge TX', value: result.txHash.slice(0, 20) + '...' }] : []),\n ...(result.depositTxHash ? [{ key: 'Deposit TX', value: result.depositTxHash.slice(0, 20) + '...' }] : []),\n ]}\n valueColor={theme.success}\n />\n </StyledBox>\n </Box>\n\n <Box marginTop={1}>\n <Text color={theme.muted} dimColor>\n Your funds are now available on HyperEVM. Check your Hyperliquid balance.\n </Text>\n </Box>\n </Box>\n )\n}\n\n/**\n * Main Bridge Command Component\n */\nexport function Bridge({ options }: BridgeProps) {\n const { exit } = useApp()\n\n // State\n const [state, setState] = useState<BridgeState>('loading')\n const [chain, setChain] = useState<Chain | null>(null)\n const [token, setToken] = useState<Token | null>(null)\n const [quote, setQuote] = useState<Quote | null>(null)\n const [walletAddress, setWalletAddress] = useState<string | null>(null)\n const [privateKey, setPrivateKey] = useState<string | null>(null)\n const [error, setError] = useState<Error | null>(null)\n const [recoveryAction, setRecoveryAction] = useState<string | null>(null)\n const [result, setResult] = useState<ExecutionResult | null>(null)\n const [currentStepDescription, setCurrentStepDescription] = useState<string>('')\n\n // Step state for progress display\n const [stepState, setStepState] = useState<BridgeStepState>({\n loading: 'active',\n quote: 'pending',\n approval: 'pending',\n bridge: 'pending',\n confirm: 'pending',\n })\n\n // Handle confirmation input\n useInput((input, key) => {\n if (state === 'confirming') {\n if (key.return || input === 'y' || input === 'Y') {\n executeBridge()\n } else if (input === 'n' || input === 'N' || input === 'q') {\n exit()\n }\n }\n\n if (state === 'completed' || state === 'failed') {\n if (key.return || input === 'q') {\n exit()\n }\n }\n })\n\n // Load initial data\n useEffect(() => {\n loadInitialData()\n }, [])\n\n const loadInitialData = async () => {\n try {\n setStepState(prev => ({ ...prev, loading: 'active' }))\n\n // Load private key\n const key = await loadPrivateKey(options.key)\n setPrivateKey(key)\n\n // Get wallet address from key\n const address = await getAddressFromPrivateKey(key)\n setWalletAddress(address)\n\n // Load chains\n const chainsResponse = await getChains()\n const foundChain = chainsResponse.chains.find(\n c => c.key.toLowerCase() === options.from.toLowerCase() ||\n c.name.toLowerCase() === options.from.toLowerCase() ||\n c.id.toString() === options.from\n )\n\n if (!foundChain) {\n throw new Error(`Chain not found: ${options.from}. Available chains: ${chainsResponse.chains.map(c => c.key).join(', ')}`)\n }\n\n setChain(foundChain)\n\n // Load tokens for the chain\n const tokensResponse = await getBridgeableTokens(foundChain.id)\n const foundToken = tokensResponse.tokens.find(\n t => t.symbol.toLowerCase() === options.token.toLowerCase() ||\n t.address.toLowerCase() === options.token.toLowerCase()\n )\n\n if (!foundToken) {\n throw new Error(`Token not found: ${options.token}. Available tokens: ${tokensResponse.tokens.map(t => t.symbol).join(', ')}`)\n }\n\n setToken(foundToken)\n\n setStepState(prev => ({ ...prev, loading: 'completed', quote: 'active' }))\n\n // Fetch quote\n const amountInSmallestUnit = (parseFloat(options.amount) * Math.pow(10, foundToken.decimals)).toString()\n\n const quoteResult = await getQuote({\n fromChainId: foundChain.id,\n toChainId: HYPEREVM_CHAIN_ID,\n fromToken: foundToken.address,\n toToken: HYPEREVM_USDC_ADDRESS,\n fromAmount: amountInSmallestUnit,\n fromAddress: address,\n })\n\n setQuote(quoteResult)\n setStepState(prev => ({ ...prev, quote: 'completed' }))\n setState('loaded')\n\n // Auto-confirm if --yes flag\n if (options.yes) {\n setState('confirming')\n // Small delay for visual feedback\n setTimeout(() => executeBridge(), 500)\n } else {\n setState('confirming')\n }\n } catch (err) {\n const normalizedError = normalizeError(err instanceof Error ? err : new Error(String(err)))\n setError(normalizedError)\n\n // Get recovery action if available\n const action = RECOVERY_ACTIONS[normalizedError.code as keyof typeof RECOVERY_ACTIONS]\n if (action) {\n setRecoveryAction(action)\n }\n\n setStepState(prev => ({\n ...prev,\n loading: prev.loading === 'active' ? 'failed' : prev.loading,\n quote: prev.quote === 'active' ? 'failed' : prev.quote,\n }))\n setState('failed')\n }\n }\n\n const executeBridge = useCallback(async () => {\n if (!quote || !chain || !token || !privateKey || !walletAddress) return\n\n try {\n setState('executing')\n setStepState(prev => ({ ...prev, approval: 'active' }))\n\n // Create signer\n const signer = await createSigner(privateKey, chain.id)\n\n // Execute the bridge\n const mina = new Mina({\n integrator: 'mina-cli',\n autoDeposit: options.autoDeposit !== false,\n })\n\n const executeResult = await mina.execute({\n quote,\n signer,\n onStepChange: (stepStatus: StepStatusPayload) => {\n setCurrentStepDescription(`${stepStatus.step}: ${stepStatus.status}`)\n\n // Update step state based on step type\n if (stepStatus.step === 'approval') {\n if (stepStatus.status === 'completed') {\n setStepState(prev => ({ ...prev, approval: 'completed', bridge: 'active' }))\n } else if (stepStatus.status === 'failed') {\n setStepState(prev => ({ ...prev, approval: 'failed' }))\n }\n } else if (stepStatus.step === 'bridge' || stepStatus.step === 'swap') {\n if (stepStatus.status === 'completed') {\n setStepState(prev => ({ ...prev, bridge: 'completed', confirm: 'active' }))\n } else if (stepStatus.status === 'failed') {\n setStepState(prev => ({ ...prev, bridge: 'failed' }))\n }\n } else if (stepStatus.step === 'deposit') {\n if (stepStatus.status === 'completed') {\n setStepState(prev => ({ ...prev, confirm: 'completed' }))\n } else if (stepStatus.status === 'failed') {\n setStepState(prev => ({ ...prev, confirm: 'failed' }))\n }\n }\n },\n onStatusChange: (status: TransactionStatusPayload) => {\n setCurrentStepDescription(status.substatus || `Step ${status.currentStep}/${status.totalSteps}`)\n },\n })\n\n setResult(executeResult)\n\n if (executeResult.status === 'completed') {\n setStepState(prev => ({\n ...prev,\n approval: 'completed',\n bridge: 'completed',\n confirm: 'completed',\n }))\n setState('completed')\n } else if (executeResult.status === 'failed') {\n setError(executeResult.error || new Error('Bridge execution failed'))\n setState('failed')\n }\n } catch (err) {\n const normalizedError = normalizeError(err instanceof Error ? err : new Error(String(err)))\n setError(normalizedError)\n\n const action = RECOVERY_ACTIONS[normalizedError.code as keyof typeof RECOVERY_ACTIONS]\n if (action) {\n setRecoveryAction(action)\n }\n\n setState('failed')\n }\n }, [quote, chain, token, privateKey, walletAddress, options.autoDeposit])\n\n // Render based on state\n return (\n <Box flexDirection=\"column\" padding={1}>\n {/* Compact header */}\n <Header compact showTagline={false} />\n\n {/* Title */}\n <Box marginBottom={1}>\n <Text color={theme.primary} bold>\n Bridge {options.amount} {options.token} from {options.from}\n </Text>\n </Box>\n\n {/* Wallet info */}\n {walletAddress && (\n <Box marginBottom={1}>\n <Text color={theme.muted} dimColor>\n Wallet: {walletAddress.slice(0, 8)}...{walletAddress.slice(-6)}\n </Text>\n </Box>\n )}\n\n {/* Loading state */}\n {state === 'loading' && (\n <Box flexDirection=\"column\">\n <BridgeProgressDisplay stepState={stepState} />\n </Box>\n )}\n\n {/* Confirmation state */}\n {state === 'confirming' && quote && chain && token && (\n <Box flexDirection=\"column\">\n <QuoteDisplay\n quote={quote}\n chain={chain}\n token={token}\n amount={options.amount}\n />\n\n {!options.yes && (\n <Box marginTop={1}>\n <Text color={theme.warning} bold>\n {symbols.arrow} Proceed with bridge? (y/n)\n </Text>\n </Box>\n )}\n\n {options.yes && (\n <Box marginTop={1}>\n <Spinner text=\"Auto-confirming...\" />\n </Box>\n )}\n </Box>\n )}\n\n {/* Executing state */}\n {state === 'executing' && (\n <Box flexDirection=\"column\">\n <BridgeProgressDisplay\n stepState={stepState}\n currentStepDescription={currentStepDescription}\n />\n </Box>\n )}\n\n {/* Completed state */}\n {state === 'completed' && result && chain && token && (\n <Box flexDirection=\"column\">\n <BridgeProgressDisplay stepState={stepState} />\n <SuccessDisplay\n result={result}\n chain={chain}\n token={token}\n amount={options.amount}\n />\n <Box marginTop={1}>\n <Text color={theme.muted} dimColor>\n Press Enter or q to exit\n </Text>\n </Box>\n </Box>\n )}\n\n {/* Failed state */}\n {state === 'failed' && error && (\n <Box flexDirection=\"column\">\n <BridgeProgressDisplay stepState={stepState} error={error.message} />\n <ErrorDisplay error={error} recoveryAction={recoveryAction || undefined} />\n <Box marginTop={1}>\n <Text color={theme.muted} dimColor>\n Press Enter or q to exit\n </Text>\n </Box>\n </Box>\n )}\n </Box>\n )\n}\n\n/**\n * Bridge command action handler\n * Called by Commander when `mina bridge` is invoked\n */\nexport async function bridgeCommand(options: BridgeCommandOptions): Promise<void> {\n const { render } = await import('ink')\n const React = await import('react')\n\n render(React.createElement(Bridge, { options }))\n}\n\nexport default Bridge\n","/**\n * Private key handling utilities for Mina Bridge CLI\n */\nimport fs from 'fs'\nimport readline from 'readline'\nimport type { TransactionSigner, TransactionRequestData } from '@siphoyawe/mina-sdk'\nimport type { Chain } from 'viem'\n\n/**\n * Load a private key from a file path\n * Supports both JSON format ({\"privateKey\": \"0x...\"}) and plain text format\n */\nexport async function loadPrivateKey(path?: string): Promise<string> {\n if (path) {\n if (!fs.existsSync(path)) {\n throw new Error(`Key file not found: ${path}`)\n }\n\n const content = fs.readFileSync(path, 'utf-8')\n\n try {\n // Try JSON format: { \"privateKey\": \"0x...\" }\n const json = JSON.parse(content)\n const key = json.privateKey || json.private_key || json.key\n if (key) {\n return normalizePrivateKey(key)\n }\n // If parsed but no key field, treat content as plain text\n return normalizePrivateKey(content.trim())\n } catch {\n // Plain text format - just the key\n return normalizePrivateKey(content.trim())\n }\n }\n\n // Prompt for key if not provided\n return promptForPrivateKey()\n}\n\n/**\n * Prompt user for private key via stdin\n * Note: Input is visible in terminal (for hidden input, use a dedicated library)\n */\nexport function promptForPrivateKey(): Promise<string> {\n return new Promise((resolve, reject) => {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n })\n\n // Note: readline doesn't support hiding input natively\n // For production, consider using a library like 'read' or 'prompts'\n process.stdout.write('Enter private key (input will be visible): ')\n\n rl.on('line', (answer) => {\n rl.close()\n try {\n resolve(normalizePrivateKey(answer.trim()))\n } catch (err) {\n reject(err)\n }\n })\n\n rl.on('close', () => {\n // Handle Ctrl+C\n })\n })\n}\n\n/**\n * Normalize private key to ensure it has 0x prefix\n */\nfunction normalizePrivateKey(key: string): string {\n const trimmed = key.trim()\n\n // Validate it looks like a private key\n const keyWithoutPrefix = trimmed.startsWith('0x') ? trimmed.slice(2) : trimmed\n\n if (!/^[0-9a-fA-F]{64}$/.test(keyWithoutPrefix)) {\n throw new Error('Invalid private key format. Expected 64 hex characters.')\n }\n\n return trimmed.startsWith('0x') ? trimmed : `0x${trimmed}`\n}\n\n/**\n * Get address from private key using viem\n */\nexport async function getAddressFromPrivateKey(privateKey: string): Promise<string> {\n const { privateKeyToAccount } = await import('viem/accounts')\n const account = privateKeyToAccount(privateKey as `0x${string}`)\n return account.address\n}\n\n/**\n * Create a transaction signer from a private key\n * This creates a signer compatible with the SDK's TransactionSigner interface\n */\nexport async function createSigner(\n privateKey: string,\n chainId: number,\n rpcUrl?: string\n): Promise<TransactionSigner> {\n const { privateKeyToAccount } = await import('viem/accounts')\n const { createWalletClient, http } = await import('viem')\n const { arbitrum, mainnet, optimism, polygon, base, avalanche, bsc } = await import('viem/chains')\n\n // Map chain ID to viem chain config\n const chainMap: Record<number, Chain> = {\n 1: mainnet,\n 42161: arbitrum,\n 10: optimism,\n 137: polygon,\n 8453: base,\n 43114: avalanche,\n 56: bsc,\n // HyperEVM\n 999: {\n id: 999,\n name: 'HyperEVM',\n nativeCurrency: { name: 'ETH', symbol: 'ETH', decimals: 18 },\n rpcUrls: {\n default: { http: ['https://rpc.hyperliquid.xyz/evm'] },\n },\n } as Chain,\n }\n\n const chain = chainMap[chainId]\n if (!chain) {\n throw new Error(`Unsupported chain ID: ${chainId}. Supported: ${Object.keys(chainMap).join(', ')}`)\n }\n\n const account = privateKeyToAccount(privateKey as `0x${string}`)\n\n const transport = rpcUrl ? http(rpcUrl) : http()\n\n const walletClient = createWalletClient({\n account,\n chain,\n transport,\n })\n\n return {\n sendTransaction: async (request: TransactionRequestData): Promise<string> => {\n const txHash = await walletClient.sendTransaction({\n to: request.to as `0x${string}`,\n data: request.data as `0x${string}`,\n value: BigInt(request.value || '0'),\n gas: request.gasLimit ? BigInt(request.gasLimit) : undefined,\n gasPrice: request.gasPrice ? BigInt(request.gasPrice) : undefined,\n chain,\n })\n\n return txHash\n },\n\n getAddress: async (): Promise<string> => {\n return account.address\n },\n\n getChainId: async (): Promise<number> => {\n return chainId\n },\n }\n}\n\n/**\n * Validate that a wallet has sufficient balance for gas\n */\nexport async function checkGasBalance(\n address: string,\n chainId: number,\n rpcUrl?: string\n): Promise<{ balance: bigint; sufficient: boolean }> {\n const { createPublicClient, http } = await import('viem')\n const { arbitrum, mainnet, optimism, polygon, base, avalanche, bsc } = await import('viem/chains')\n\n const chainMap: Record<number, Chain> = {\n 1: mainnet,\n 42161: arbitrum,\n 10: optimism,\n 137: polygon,\n 8453: base,\n 43114: avalanche,\n 56: bsc,\n 999: {\n id: 999,\n name: 'HyperEVM',\n nativeCurrency: { name: 'ETH', symbol: 'ETH', decimals: 18 },\n rpcUrls: {\n default: { http: ['https://rpc.hyperliquid.xyz/evm'] },\n },\n } as Chain,\n }\n\n const chain = chainMap[chainId]\n if (!chain) {\n throw new Error(`Unsupported chain ID: ${chainId}`)\n }\n\n const client = createPublicClient({\n chain,\n transport: rpcUrl ? http(rpcUrl) : http(),\n })\n\n const balance = await client.getBalance({ address: address as `0x${string}` })\n\n // Consider sufficient if > 0.001 ETH (or equivalent)\n const minBalance = BigInt('1000000000000000') // 0.001 ETH in wei\n\n return {\n balance,\n sufficient: balance >= minBalance,\n }\n}\n","import React, { useState, useEffect } from 'react'\nimport { Box, Text, useApp } from 'ink'\nimport {\n Header,\n Table,\n theme,\n symbols,\n type Column,\n} from '../ui/index.js'\nimport { getHistory, type HistoryEntry } from '../lib/history.js'\n\n/**\n * Props for the History command component\n */\ninterface HistoryCommandProps {\n /** Maximum number of entries to show */\n limit: number\n /** Optional wallet address to filter by */\n address?: string\n /** Output as JSON */\n json?: boolean\n}\n\n/**\n * Format timestamp to human readable date/time\n */\nfunction formatDate(timestamp: number): string {\n return new Date(timestamp).toLocaleString('en-US', {\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n hour12: false,\n })\n}\n\n/**\n * Truncate transaction hash for display\n */\nfunction truncateHash(hash: string): string {\n if (hash.length <= 16) return hash\n return `${hash.slice(0, 8)}...${hash.slice(-6)}`\n}\n\n/**\n * Get status icon and color based on status\n */\nfunction getStatusDisplay(status: HistoryEntry['status']): {\n icon: string\n color: string\n label: string\n} {\n switch (status) {\n case 'completed':\n return { icon: symbols.completed, color: theme.success, label: 'Complete' }\n case 'pending':\n return { icon: symbols.pending, color: theme.warning, label: 'Pending' }\n case 'failed':\n return { icon: symbols.failed, color: theme.error, label: 'Failed' }\n default:\n return { icon: symbols.pending, color: theme.muted, label: 'Unknown' }\n }\n}\n\n/**\n * History row type for table display\n */\ninterface HistoryRow {\n [key: string]: unknown\n date: string\n route: string\n amount: string\n status: string\n txHash: string\n statusColor: string\n}\n\n/**\n * Transform history entries to table rows\n */\nfunction transformToRows(entries: HistoryEntry[]): HistoryRow[] {\n return entries.map((entry) => {\n const { icon, color, label } = getStatusDisplay(entry.status)\n return {\n date: formatDate(entry.timestamp),\n route: `${entry.fromChain} ${symbols.arrow} ${entry.toChain}`,\n amount: `${entry.amount} ${entry.token}`,\n status: `${icon} ${label}`,\n txHash: entry.txHash,\n statusColor: color,\n }\n })\n}\n\n/**\n * Empty state component when no history is found\n */\nfunction EmptyState({ address }: { address?: string }) {\n return (\n <Box flexDirection=\"column\">\n <Box\n borderStyle=\"round\"\n borderColor={theme.border}\n paddingX={2}\n paddingY={1}\n >\n <Box flexDirection=\"column\">\n <Text color={theme.muted}>\n {symbols.pending} No bridge history found\n </Text>\n <Box marginTop={1}>\n <Text color={theme.muted} dimColor>\n {address\n ? `No transactions found for address ${truncateHash(address)}`\n : 'Start by running a bridge transaction with: mina bridge --from <chain> --token USDC --amount 100'}\n </Text>\n </Box>\n </Box>\n </Box>\n </Box>\n )\n}\n\n/**\n * History display component\n */\nexport function HistoryCommand({\n limit,\n address,\n json = false,\n}: HistoryCommandProps) {\n const { exit } = useApp()\n const [entries, setEntries] = useState<HistoryEntry[]>([])\n const [loading, setLoading] = useState(true)\n\n useEffect(() => {\n // Load history\n const history = getHistory(limit, address)\n setEntries(history)\n setLoading(false)\n }, [limit, address])\n\n // Exit after rendering in JSON mode\n useEffect(() => {\n if (!loading && json) {\n setTimeout(() => exit(), 100)\n }\n }, [loading, json, exit])\n\n // JSON output mode\n if (json) {\n if (loading) return null\n console.log(JSON.stringify(entries, null, 2))\n return null\n }\n\n if (loading) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Header compact showTagline={false} />\n <Text color={theme.muted}>Loading history...</Text>\n </Box>\n )\n }\n\n const rows = transformToRows(entries)\n\n // Define table columns\n const columns: Column<HistoryRow>[] = [\n {\n header: 'Date',\n accessor: 'date',\n headerColor: theme.primary,\n cellColor: theme.secondary,\n },\n {\n header: 'Route',\n accessor: 'route',\n headerColor: theme.primary,\n cellColor: theme.info,\n },\n {\n header: 'Amount',\n accessor: 'amount',\n align: 'right',\n headerColor: theme.primary,\n cellColor: theme.secondary,\n },\n {\n header: 'Status',\n accessor: 'status',\n headerColor: theme.primary,\n cellColor: (_, row) => row.statusColor,\n },\n ]\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Header compact showTagline={false} />\n\n <Box marginBottom={1}>\n <Text color={theme.secondary}>\n {symbols.arrow} Bridge History\n {address && (\n <Text color={theme.muted}> ({truncateHash(address)})</Text>\n )}\n {entries.length > 0 && (\n <Text color={theme.muted}> - {entries.length} transaction{entries.length !== 1 ? 's' : ''}</Text>\n )}\n </Text>\n </Box>\n\n {entries.length === 0 ? (\n <EmptyState address={address} />\n ) : (\n <>\n <Table\n data={rows}\n columns={columns}\n bordered\n borderColor={theme.border}\n />\n\n <Box marginTop={1} flexDirection=\"column\">\n <Text color={theme.muted} dimColor>\n Use {'\"'}mina status {'<'}hash{'>\"'} for full transaction details\n </Text>\n {entries.length >= limit && (\n <Text color={theme.muted} dimColor>\n Showing last {limit} entries. Use --limit to see more.\n </Text>\n )}\n </Box>\n </>\n )}\n </Box>\n )\n}\n\n/**\n * History command handler for commander\n */\nexport async function historyCommand(options: {\n limit?: string\n address?: string\n json?: boolean\n}): Promise<void> {\n const { render } = await import('ink')\n const React = await import('react')\n\n const limit = options.limit ? parseInt(options.limit, 10) : 10\n\n render(\n React.createElement(HistoryCommand, {\n limit: isNaN(limit) ? 10 : limit,\n address: options.address,\n json: options.json || false,\n })\n )\n}\n\nexport default HistoryCommand\n","/**\n * History storage utilities for Mina Bridge CLI\n * Stores bridge transaction history locally for quick access\n */\n\nimport os from 'os'\nimport fs from 'fs'\nimport path from 'path'\n\n/**\n * Path to the history file\n */\nconst HISTORY_PATH = path.join(os.homedir(), '.mina', 'history.json')\n\n/**\n * Maximum number of history entries to keep\n */\nconst MAX_HISTORY_ENTRIES = 100\n\n/**\n * History entry type representing a bridge transaction\n */\nexport interface HistoryEntry {\n /** Transaction hash */\n txHash: string\n /** Source chain name */\n fromChain: string\n /** Destination chain name */\n toChain: string\n /** Amount bridged */\n amount: string\n /** Token symbol */\n token: string\n /** Transaction status */\n status: 'pending' | 'completed' | 'failed'\n /** Timestamp when the transaction was initiated */\n timestamp: number\n /** Wallet address that initiated the transaction */\n walletAddress?: string\n /** Bridge transaction hash (if available) */\n bridgeTxHash?: string\n /** Deposit transaction hash (if available) */\n depositTxHash?: string\n}\n\n/**\n * History data structure stored in the file\n */\ninterface HistoryData {\n entries: HistoryEntry[]\n version: number\n}\n\n/**\n * Ensures the .mina directory exists\n */\nfunction ensureDir(): void {\n const dir = path.dirname(HISTORY_PATH)\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true })\n }\n}\n\n/**\n * Gets the history file path\n */\nexport function getHistoryPath(): string {\n return HISTORY_PATH\n}\n\n/**\n * Gets bridge history entries\n * @param limit - Maximum number of entries to return (default: 10)\n * @param address - Optional wallet address to filter by\n * @returns Array of history entries, most recent first\n */\nexport function getHistory(limit = 10, address?: string): HistoryEntry[] {\n ensureDir()\n\n if (!fs.existsSync(HISTORY_PATH)) {\n return []\n }\n\n try {\n const data: HistoryData = JSON.parse(fs.readFileSync(HISTORY_PATH, 'utf-8'))\n let entries = data.entries || []\n\n // Filter by address if provided\n if (address) {\n entries = entries.filter(\n (e) => e.walletAddress?.toLowerCase() === address.toLowerCase()\n )\n }\n\n // Return most recent entries first\n return entries.slice(-limit).reverse()\n } catch {\n // If file is corrupted, return empty array\n return []\n }\n}\n\n/**\n * Adds a history entry\n * @param entry - History entry to add\n */\nexport function addHistory(entry: HistoryEntry): void {\n ensureDir()\n\n let data: HistoryData\n\n if (fs.existsSync(HISTORY_PATH)) {\n try {\n data = JSON.parse(fs.readFileSync(HISTORY_PATH, 'utf-8'))\n if (!data.entries) {\n data = { entries: [], version: 1 }\n }\n } catch {\n data = { entries: [], version: 1 }\n }\n } else {\n data = { entries: [], version: 1 }\n }\n\n // Add new entry\n data.entries.push(entry)\n\n // Trim to max entries if needed\n if (data.entries.length > MAX_HISTORY_ENTRIES) {\n data.entries = data.entries.slice(-MAX_HISTORY_ENTRIES)\n }\n\n // Write back to file\n fs.writeFileSync(HISTORY_PATH, JSON.stringify(data, null, 2))\n}\n\n/**\n * Updates a history entry by transaction hash\n * @param txHash - Transaction hash to find\n * @param updates - Partial updates to apply\n */\nexport function updateHistory(\n txHash: string,\n updates: Partial<Pick<HistoryEntry, 'status' | 'bridgeTxHash' | 'depositTxHash'>>\n): void {\n ensureDir()\n\n if (!fs.existsSync(HISTORY_PATH)) {\n return\n }\n\n try {\n const data: HistoryData = JSON.parse(fs.readFileSync(HISTORY_PATH, 'utf-8'))\n\n const index = data.entries.findIndex((e) => e.txHash === txHash)\n if (index !== -1 && data.entries[index]) {\n const entry = data.entries[index]\n data.entries[index] = {\n ...entry,\n ...updates,\n }\n fs.writeFileSync(HISTORY_PATH, JSON.stringify(data, null, 2))\n }\n } catch {\n // Silently fail if file is corrupted\n }\n}\n\n/**\n * Gets a single history entry by transaction hash\n * @param txHash - Transaction hash to find\n * @returns History entry or null if not found\n */\nexport function getHistoryEntry(txHash: string): HistoryEntry | null {\n const entries = getHistory(MAX_HISTORY_ENTRIES)\n return entries.find((e) => e.txHash === txHash) || null\n}\n\n/**\n * Clears all history\n */\nexport function clearHistory(): void {\n ensureDir()\n const data: HistoryData = { entries: [], version: 1 }\n fs.writeFileSync(HISTORY_PATH, JSON.stringify(data, null, 2))\n}\n\n/**\n * Gets history statistics\n */\nexport function getHistoryStats(): {\n total: number\n completed: number\n pending: number\n failed: number\n} {\n const entries = getHistory(MAX_HISTORY_ENTRIES)\n return {\n total: entries.length,\n completed: entries.filter((e) => e.status === 'completed').length,\n pending: entries.filter((e) => e.status === 'pending').length,\n failed: entries.filter((e) => e.status === 'failed').length,\n }\n}\n","import React, { useState, useEffect } from 'react'\nimport { Box, Text, useApp } from 'ink'\nimport {\n Mina,\n getChains,\n type Chain,\n type BalanceWithMetadata,\n} from '@siphoyawe/mina-sdk'\nimport {\n Header,\n Spinner,\n theme,\n symbols,\n borders,\n} from '../ui/index.js'\n\n/**\n * Truncate address for display\n */\nfunction truncateAddress(address: string): string {\n if (address.length <= 14) return address\n return `${address.slice(0, 6)}...${address.slice(-4)}`\n}\n\n/**\n * Format number with thousands separators\n */\nfunction formatNumber(value: number, decimals: number = 2): string {\n if (value === 0) return '0'\n\n // For very small values, show more decimals\n if (value < 0.01 && value > 0) {\n return value.toFixed(6)\n }\n\n return value.toLocaleString('en-US', {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n })\n}\n\n/**\n * Format USD value\n */\nfunction formatUsd(value?: number): string {\n if (value === undefined || value === 0) return '-'\n return `$${formatNumber(value, 2)}`\n}\n\n/**\n * Major chains for multi-chain balance lookup\n */\nconst MAJOR_CHAIN_IDS = [1, 42161, 137, 10, 8453] // ETH, ARB, POLY, OP, BASE\n\n/**\n * Chain display names\n */\nconst CHAIN_NAMES: Record<number, string> = {\n 1: 'Ethereum',\n 42161: 'Arbitrum',\n 137: 'Polygon',\n 10: 'Optimism',\n 8453: 'Base',\n 56: 'BNB Chain',\n 43114: 'Avalanche',\n 250: 'Fantom',\n 100: 'Gnosis',\n 59144: 'Linea',\n 534352: 'Scroll',\n 324: 'zkSync',\n}\n\n/**\n * Resolve chain name or ID to chain ID\n */\nasync function resolveChainId(chainInput: string): Promise<{ chainId: number; chainName: string } | null> {\n // Check if it's a numeric ID\n const numericId = parseInt(chainInput, 10)\n if (!isNaN(numericId)) {\n const response = await getChains()\n const chain = response.chains.find((c: Chain) => c.id === numericId)\n if (chain) {\n return { chainId: chain.id, chainName: chain.name }\n }\n // Still try with the ID even if not found\n return { chainId: numericId, chainName: CHAIN_NAMES[numericId] || chainInput }\n }\n\n // Otherwise treat as chain name/key\n const response = await getChains()\n const chainLower = chainInput.toLowerCase()\n const chain = response.chains.find((c: Chain) =>\n c.name.toLowerCase() === chainLower ||\n c.key?.toLowerCase() === chainLower\n )\n\n if (chain) {\n return { chainId: chain.id, chainName: chain.name }\n }\n\n return null\n}\n\n/**\n * Balance row for a single token\n */\ninterface BalanceRow {\n symbol: string\n balance: string\n balanceFormatted: string\n usdValue?: number\n hasBalance: boolean\n}\n\n/**\n * Chain balances group\n */\ninterface ChainBalances {\n chainId: number\n chainName: string\n balances: BalanceRow[]\n totalUsd: number\n}\n\n/**\n * Balance command props\n */\ninterface BalanceCommandProps {\n address: string\n chain?: string\n showAll?: boolean\n json?: boolean\n}\n\n/**\n * Balance command component - displays wallet balances\n */\nexport function BalanceCommand({\n address,\n chain,\n showAll = false,\n json = false,\n}: BalanceCommandProps) {\n const { exit } = useApp()\n const [chainBalances, setChainBalances] = useState<ChainBalances[]>([])\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n const [totalUsd, setTotalUsd] = useState(0)\n\n useEffect(() => {\n async function loadBalances() {\n try {\n setLoading(true)\n setError(null)\n\n const mina = new Mina({ integrator: 'mina-cli' })\n\n // Determine which chains to fetch\n let chainIds: number[] = []\n let chainNameMap: Record<number, string> = {}\n\n if (chain) {\n // Specific chain requested\n const resolved = await resolveChainId(chain)\n if (!resolved) {\n setError(`Unknown chain: \"${chain}\"`)\n setLoading(false)\n return\n }\n chainIds = [resolved.chainId]\n chainNameMap[resolved.chainId] = resolved.chainName\n } else {\n // Multi-chain - use major chains\n chainIds = MAJOR_CHAIN_IDS\n chainIds.forEach(id => {\n chainNameMap[id] = CHAIN_NAMES[id] || `Chain ${id}`\n })\n }\n\n // Fetch balances for all chains in parallel\n const results = await Promise.all(\n chainIds.map(async (chainId) => {\n try {\n const balances = await mina.getChainBalances(address, chainId)\n return { chainId, balances }\n } catch (err) {\n console.warn(`Failed to fetch balances for chain ${chainId}:`, err)\n return { chainId, balances: [] }\n }\n })\n )\n\n // Process results\n const processedChains: ChainBalances[] = []\n let grandTotal = 0\n\n for (const result of results) {\n const { chainId, balances } = result\n\n // Filter and map balances\n let filteredBalances = balances.filter((b: BalanceWithMetadata) => {\n // If showAll, include all. Otherwise, only include non-zero balances\n return showAll || b.hasBalance\n })\n\n // Calculate chain total\n const chainTotal = balances.reduce((sum: number, b: BalanceWithMetadata) => {\n return sum + (b.balanceUsd || 0)\n }, 0)\n grandTotal += chainTotal\n\n // Map to display format\n const balanceRows: BalanceRow[] = filteredBalances.map((b: BalanceWithMetadata) => ({\n symbol: b.token.symbol,\n balance: b.balance,\n balanceFormatted: b.formatted,\n usdValue: b.balanceUsd,\n hasBalance: b.hasBalance,\n }))\n\n // Sort: non-zero first, then by USD value\n balanceRows.sort((a, b) => {\n if (a.hasBalance !== b.hasBalance) {\n return a.hasBalance ? -1 : 1\n }\n return (b.usdValue || 0) - (a.usdValue || 0)\n })\n\n // Only add chain if it has balances to show\n if (balanceRows.length > 0 || showAll) {\n processedChains.push({\n chainId,\n chainName: chainNameMap[chainId] || `Chain ${chainId}`,\n balances: balanceRows,\n totalUsd: chainTotal,\n })\n }\n }\n\n // Sort chains by total USD value\n processedChains.sort((a, b) => b.totalUsd - a.totalUsd)\n\n setChainBalances(processedChains)\n setTotalUsd(grandTotal)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load balances')\n } finally {\n setLoading(false)\n }\n }\n loadBalances()\n }, [address, chain, showAll])\n\n // Exit after rendering in JSON mode\n useEffect(() => {\n if (!loading && json) {\n setTimeout(() => exit(), 100)\n }\n }, [loading, json, exit])\n\n // JSON output mode\n if (json) {\n if (loading) return null\n if (error) {\n console.error(JSON.stringify({ error }, null, 2))\n return null\n }\n console.log(JSON.stringify({\n address,\n chains: chainBalances.map(cb => ({\n chainId: cb.chainId,\n chainName: cb.chainName,\n balances: cb.balances,\n totalUsd: cb.totalUsd,\n })),\n totalUsd,\n }, null, 2))\n return null\n }\n\n if (loading) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Header compact showTagline={false} />\n <Spinner text={chain ? `Loading balances on ${chain}...` : 'Loading balances across chains...'} />\n </Box>\n )\n }\n\n if (error) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Header compact showTagline={false} />\n <Box>\n <Text color={theme.error}>{symbols.failed} Error: {error}</Text>\n </Box>\n </Box>\n )\n }\n\n // Calculate max width for the box\n const maxSymbolWidth = Math.max(\n 8,\n ...chainBalances.flatMap(cb => cb.balances.map(b => b.symbol.length))\n )\n const maxBalanceWidth = Math.max(\n 12,\n ...chainBalances.flatMap(cb => cb.balances.map(b => b.balanceFormatted.length))\n )\n const boxWidth = Math.max(40, maxSymbolWidth + maxBalanceWidth + 20)\n\n // Check if we have any balances\n const hasAnyBalances = chainBalances.some(cb => cb.balances.length > 0)\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Header compact showTagline={false} />\n\n {/* Box header */}\n <Box>\n <Text color={theme.border}>\n {borders.topLeft}{borders.horizontal.repeat(boxWidth - 2)}{borders.topRight}\n </Text>\n </Box>\n\n {/* Title */}\n <Box>\n <Text color={theme.border}>{borders.vertical}</Text>\n <Box width={boxWidth - 2} justifyContent=\"center\">\n <Text color={theme.primary} bold>\n Balances: {truncateAddress(address)}\n </Text>\n </Box>\n <Text color={theme.border}>{borders.vertical}</Text>\n </Box>\n\n {/* Separator */}\n <Box>\n <Text color={theme.border}>\n {borders.leftT}{borders.horizontal.repeat(boxWidth - 2)}{borders.rightT}\n </Text>\n </Box>\n\n {!hasAnyBalances ? (\n <>\n <Box>\n <Text color={theme.border}>{borders.vertical}</Text>\n <Box width={boxWidth - 2} justifyContent=\"center\">\n <Text color={theme.muted}>No balances found</Text>\n </Box>\n <Text color={theme.border}>{borders.vertical}</Text>\n </Box>\n </>\n ) : (\n chainBalances.map((chainData, chainIndex) => (\n <React.Fragment key={chainData.chainId}>\n {/* Chain name header */}\n <Box>\n <Text color={theme.border}>{borders.vertical}</Text>\n <Text> </Text>\n <Text color={theme.accent} bold>\n {chainData.chainName}\n </Text>\n <Box flexGrow={1} />\n <Text color={theme.border}>{borders.vertical}</Text>\n </Box>\n\n {/* Token balances */}\n {chainData.balances.length === 0 ? (\n <Box>\n <Text color={theme.border}>{borders.vertical}</Text>\n <Text> </Text>\n <Text color={theme.muted} dimColor>No balances</Text>\n <Box flexGrow={1} />\n <Text color={theme.border}>{borders.vertical}</Text>\n </Box>\n ) : (\n chainData.balances.map((balance, i) => (\n <Box key={`${chainData.chainId}-${balance.symbol}-${i}`}>\n <Text color={theme.border}>{borders.vertical}</Text>\n <Text> </Text>\n <Text\n color={balance.hasBalance ? theme.success : theme.muted}\n dimColor={!balance.hasBalance}\n >\n {balance.symbol.padEnd(maxSymbolWidth)}\n </Text>\n <Text> </Text>\n <Text\n color={balance.hasBalance ? theme.secondary : theme.muted}\n dimColor={!balance.hasBalance}\n >\n {balance.balanceFormatted.padStart(maxBalanceWidth)}\n </Text>\n <Text> </Text>\n <Text\n color={balance.hasBalance ? theme.muted : theme.muted}\n dimColor={!balance.hasBalance}\n >\n {formatUsd(balance.usdValue).padStart(12)}\n </Text>\n <Box flexGrow={1} />\n <Text color={theme.border}>{borders.vertical}</Text>\n </Box>\n ))\n )}\n\n {/* Chain separator (if not last) */}\n {chainIndex < chainBalances.length - 1 && (\n <Box>\n <Text color={theme.border}>\n {borders.leftT}{borders.horizontal.repeat(boxWidth - 2)}{borders.rightT}\n </Text>\n </Box>\n )}\n </React.Fragment>\n ))\n )}\n\n {/* Bottom border */}\n <Box>\n <Text color={theme.border}>\n {borders.bottomLeft}{borders.horizontal.repeat(boxWidth - 2)}{borders.bottomRight}\n </Text>\n </Box>\n\n {/* Total */}\n {hasAnyBalances && totalUsd > 0 && (\n <Box marginTop={1}>\n <Text color={theme.secondary}>\n {symbols.arrow} Total:\n </Text>\n <Text color={theme.success} bold>\n {' '}${formatNumber(totalUsd, 2)}\n </Text>\n </Box>\n )}\n\n {/* Tip */}\n <Box marginTop={1}>\n <Text color={theme.muted} dimColor>\n {chain\n ? 'Use --all to show zero balances'\n : 'Use --chain <name> for specific chain, --all for zero balances'}\n </Text>\n </Box>\n </Box>\n )\n}\n\nexport default BalanceCommand\n","import React, { useState, useEffect } from 'react'\nimport { Box, Text, useApp } from 'ink'\nimport {\n Header,\n Table,\n theme,\n symbols,\n Box as StyledBox,\n type Column,\n} from '../ui/index.js'\nimport {\n getConfig,\n getConfigValue,\n setConfig,\n getConfigList,\n parseValue,\n isValidKey,\n getConfigPath,\n} from '../lib/config.js'\n\n/**\n * Config command action types\n */\ntype ConfigAction = 'list' | 'get' | 'set' | 'path'\n\n/**\n * Props for the ConfigCommand component\n */\ninterface ConfigCommandProps {\n action?: ConfigAction\n key?: string\n value?: string\n}\n\n/**\n * Config row type for table display\n */\ninterface ConfigRow {\n setting: string\n value: string\n isDefault: boolean\n}\n\n/**\n * List all configuration values\n */\nfunction ConfigList() {\n const { exit } = useApp()\n const [items, setItems] = useState<ConfigRow[]>([])\n\n useEffect(() => {\n const configItems = getConfigList()\n setItems(\n configItems.map((item) => ({\n setting: item.key,\n value: item.value,\n isDefault: item.isDefault,\n }))\n )\n // Exit after rendering\n setTimeout(() => exit(), 100)\n }, [exit])\n\n const columns: Column<ConfigRow>[] = [\n {\n header: 'Setting',\n accessor: 'setting',\n headerColor: theme.primary,\n cellColor: theme.secondary,\n },\n {\n header: 'Value',\n accessor: 'value',\n headerColor: theme.primary,\n cellColor: (value, row) =>\n row.isDefault ? theme.muted : theme.success,\n },\n ]\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Header compact showTagline={false} />\n\n <Box marginBottom={1}>\n <Text color={theme.secondary}>\n {symbols.arrow} Configuration Settings\n </Text>\n </Box>\n\n <Table data={items} columns={columns} bordered borderColor={theme.border} />\n\n <Box marginTop={1}>\n <Text color={theme.muted} dimColor>\n Values in gray are defaults. Use 'mina config set <key> <value>' to customize.\n </Text>\n </Box>\n </Box>\n )\n}\n\n/**\n * Get a single configuration value\n */\nfunction ConfigGet({ configKey }: { configKey: string }) {\n const { exit } = useApp()\n const [value, setValue] = useState<string | null>(null)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n if (!isValidKey(configKey)) {\n setError(`Unknown config key: ${configKey}`)\n } else {\n const val = getConfigValue(configKey)\n setValue(val === undefined || val === null ? '(not set)' : String(val))\n }\n setTimeout(() => exit(), 100)\n }, [configKey, exit])\n\n if (error) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Header compact showTagline={false} />\n <Box>\n <Text color={theme.error}>{symbols.failed} {error}</Text>\n </Box>\n </Box>\n )\n }\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Header compact showTagline={false} />\n <Box>\n <Text color={theme.secondary}>{configKey}</Text>\n <Text color={theme.muted}> = </Text>\n <Text color={theme.primary}>{value}</Text>\n </Box>\n </Box>\n )\n}\n\n/**\n * Set a configuration value\n */\nfunction ConfigSet({ configKey, configValue }: { configKey: string; configValue: string }) {\n const { exit } = useApp()\n const [success, setSuccess] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [parsedValue, setParsedValue] = useState<string | number | boolean | null>(null)\n\n useEffect(() => {\n if (!isValidKey(configKey)) {\n setError(`Unknown config key: ${configKey}`)\n } else {\n try {\n const parsed = parseValue(configValue)\n setParsedValue(parsed)\n setConfig(configKey, parsed)\n setSuccess(true)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to set value')\n }\n }\n setTimeout(() => exit(), 100)\n }, [configKey, configValue, exit])\n\n if (error) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Header compact showTagline={false} />\n <Box>\n <Text color={theme.error}>{symbols.failed} {error}</Text>\n </Box>\n </Box>\n )\n }\n\n if (success) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Header compact showTagline={false} />\n <Box>\n <Text color={theme.success}>{symbols.completed} </Text>\n <Text color={theme.secondary}>Set </Text>\n <Text color={theme.primary}>{configKey}</Text>\n <Text color={theme.muted}> = </Text>\n <Text color={theme.success}>{String(parsedValue)}</Text>\n </Box>\n </Box>\n )\n }\n\n return null\n}\n\n/**\n * Show config file path\n */\nfunction ConfigPath() {\n const { exit } = useApp()\n\n useEffect(() => {\n setTimeout(() => exit(), 100)\n }, [exit])\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Header compact showTagline={false} />\n <Box>\n <Text color={theme.muted}>Config file: </Text>\n <Text color={theme.secondary}>{getConfigPath()}</Text>\n </Box>\n </Box>\n )\n}\n\n/**\n * Show config help/usage\n */\nfunction ConfigHelp() {\n const { exit } = useApp()\n\n useEffect(() => {\n setTimeout(() => exit(), 100)\n }, [exit])\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Header compact showTagline={false} />\n\n <StyledBox bordered title=\"Config Usage\" padding={1}>\n <Box flexDirection=\"column\">\n <Text color={theme.secondary}>mina config list</Text>\n <Text color={theme.muted}> Show all settings</Text>\n <Text> </Text>\n\n <Text color={theme.secondary}>mina config get <key></Text>\n <Text color={theme.muted}> Show single value</Text>\n <Text> </Text>\n\n <Text color={theme.secondary}>mina config set <key> <value></Text>\n <Text color={theme.muted}> Set a value</Text>\n <Text> </Text>\n\n <Text color={theme.secondary}>mina config path</Text>\n <Text color={theme.muted}> Show config file location</Text>\n </Box>\n </StyledBox>\n\n <Box marginTop={1}>\n <StyledBox bordered title=\"Available Settings\" padding={1}>\n <Box flexDirection=\"column\">\n <Box>\n <Text color={theme.primary} bold>slippage</Text>\n <Text color={theme.muted}> - Default slippage tolerance (e.g., 0.5)</Text>\n </Box>\n <Box>\n <Text color={theme.primary} bold>autoDeposit</Text>\n <Text color={theme.muted}> - Auto-deposit to Hyperliquid (true/false)</Text>\n </Box>\n <Box>\n <Text color={theme.primary} bold>defaultChain</Text>\n <Text color={theme.muted}> - Default source chain (e.g., arbitrum)</Text>\n </Box>\n <Box>\n <Text color={theme.primary} bold>rpc.<chain></Text>\n <Text color={theme.muted}> - Custom RPC URL for a chain</Text>\n </Box>\n </Box>\n </StyledBox>\n </Box>\n\n <Box marginTop={1}>\n <StyledBox bordered title=\"Examples\" padding={1}>\n <Box flexDirection=\"column\">\n <Text color={theme.secondary}>mina config set slippage 0.5</Text>\n <Text color={theme.secondary}>mina config set autoDeposit false</Text>\n <Text color={theme.secondary}>mina config set rpc.arbitrum https://arb1.example.com</Text>\n <Text color={theme.secondary}>mina config get slippage</Text>\n </Box>\n </StyledBox>\n </Box>\n </Box>\n )\n}\n\n/**\n * Main Config command component\n */\nexport function ConfigCommand({ action, key: configKey, value }: ConfigCommandProps) {\n // Determine what to render based on action\n switch (action) {\n case 'list':\n return <ConfigList />\n\n case 'get':\n if (!configKey) {\n return <ConfigHelp />\n }\n return <ConfigGet configKey={configKey} />\n\n case 'set':\n if (!configKey || value === undefined) {\n return <ConfigHelp />\n }\n return <ConfigSet configKey={configKey} configValue={value} />\n\n case 'path':\n return <ConfigPath />\n\n default:\n // No action or unknown action - show help\n return <ConfigHelp />\n }\n}\n\n/**\n * Config command handler for commander\n */\nexport async function configCommand(\n action?: string,\n key?: string,\n value?: string\n): Promise<void> {\n const { render } = await import('ink')\n const React = await import('react')\n\n render(\n React.createElement(ConfigCommand, {\n action: action as ConfigAction,\n key: key,\n value: value,\n })\n )\n}\n\nexport default ConfigCommand\n","/**\n * Mina Bridge CLI Configuration Management\n *\n * Stores user preferences in ~/.mina/config.json\n */\nimport os from 'os'\nimport fs from 'fs'\nimport path from 'path'\n\nconst CONFIG_PATH = path.join(os.homedir(), '.mina', 'config.json')\n\n/**\n * CLI Configuration interface\n */\nexport interface CliConfig {\n /** Default slippage tolerance (percentage) */\n slippage: number\n /** Auto-deposit to Hyperliquid L1 after bridge */\n autoDeposit: boolean\n /** Default source chain for bridging */\n defaultChain: string\n /** Custom RPC URLs per chain (null = use default) */\n rpc: Record<string, string | null>\n}\n\n/**\n * Default configuration values\n */\nconst DEFAULT_CONFIG: CliConfig = {\n slippage: 0.5,\n autoDeposit: true,\n defaultChain: 'arbitrum',\n rpc: {},\n}\n\n/**\n * List of valid top-level config keys\n */\nexport const VALID_KEYS = ['slippage', 'autoDeposit', 'defaultChain', 'rpc'] as const\nexport type ValidKey = (typeof VALID_KEYS)[number]\n\n/**\n * Ensure the config directory exists\n */\nfunction ensureDir(): void {\n const dir = path.dirname(CONFIG_PATH)\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true })\n }\n}\n\n/**\n * Get the full configuration, merging saved values with defaults\n */\nexport function getConfig(): CliConfig {\n ensureDir()\n if (!fs.existsSync(CONFIG_PATH)) {\n return { ...DEFAULT_CONFIG }\n }\n\n try {\n const data = JSON.parse(fs.readFileSync(CONFIG_PATH, 'utf-8'))\n return {\n ...DEFAULT_CONFIG,\n ...data,\n // Ensure rpc is always an object\n rpc: { ...DEFAULT_CONFIG.rpc, ...(data.rpc || {}) },\n }\n } catch {\n // If parsing fails, return defaults\n return { ...DEFAULT_CONFIG }\n }\n}\n\n/**\n * Parse a string value to the appropriate type\n */\nexport function parseValue(value: string): string | number | boolean {\n // Boolean parsing\n if (value.toLowerCase() === 'true') return true\n if (value.toLowerCase() === 'false') return false\n\n // Number parsing\n const num = Number(value)\n if (!isNaN(num) && value.trim() !== '') return num\n\n // Default to string\n return value\n}\n\n/**\n * Validate that a key is a valid config key\n */\nexport function isValidKey(key: string): boolean {\n const parts = key.split('.')\n\n // Check if it's a nested rpc key\n if (parts.length === 2 && parts[0] === 'rpc') {\n return true\n }\n\n // Check if it's a top-level key\n return VALID_KEYS.includes(key as ValidKey)\n}\n\n/**\n * Set a configuration value\n * Supports nested keys like \"rpc.arbitrum\"\n */\nexport function setConfig(key: string, value: string | number | boolean): void {\n ensureDir()\n const config = getConfig()\n\n const keys = key.split('.')\n const rpcKey = keys[1]\n if (keys.length === 2 && keys[0] === 'rpc' && rpcKey) {\n // Handle nested RPC configuration\n config.rpc[rpcKey] = value as string\n } else if (VALID_KEYS.includes(key as ValidKey)) {\n // Handle top-level keys\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (config as any)[key] = value\n } else {\n throw new Error(`Unknown config key: ${key}`)\n }\n\n fs.writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2))\n}\n\n/**\n * Get a specific configuration value\n * Supports nested keys like \"rpc.arbitrum\"\n */\nexport function getConfigValue(key: string): unknown {\n const config = getConfig()\n const keys = key.split('.')\n const rpcKey = keys[1]\n\n if (keys.length === 2 && keys[0] === 'rpc' && rpcKey) {\n return config.rpc[rpcKey] ?? null\n }\n\n if (VALID_KEYS.includes(key as ValidKey)) {\n return config[key as ValidKey]\n }\n\n return undefined\n}\n\n/**\n * Get a flattened list of all config values for display\n */\nexport function getConfigList(): Array<{ key: string; value: string; isDefault: boolean }> {\n const config = getConfig()\n const savedConfig = fs.existsSync(CONFIG_PATH)\n ? JSON.parse(fs.readFileSync(CONFIG_PATH, 'utf-8'))\n : {}\n\n const items: Array<{ key: string; value: string; isDefault: boolean }> = []\n\n // Add top-level values\n items.push({\n key: 'slippage',\n value: String(config.slippage),\n isDefault: savedConfig.slippage === undefined,\n })\n items.push({\n key: 'autoDeposit',\n value: String(config.autoDeposit),\n isDefault: savedConfig.autoDeposit === undefined,\n })\n items.push({\n key: 'defaultChain',\n value: config.defaultChain,\n isDefault: savedConfig.defaultChain === undefined,\n })\n\n // Add RPC values - show common chains\n const commonChains = ['ethereum', 'arbitrum', 'polygon', 'optimism', 'base']\n for (const chain of commonChains) {\n const customRpc = config.rpc[chain]\n items.push({\n key: `rpc.${chain}`,\n value: customRpc || '(default)',\n isDefault: !customRpc,\n })\n }\n\n // Add any additional custom RPC URLs\n for (const [chain, url] of Object.entries(config.rpc)) {\n if (!commonChains.includes(chain) && url) {\n items.push({\n key: `rpc.${chain}`,\n value: url,\n isDefault: false,\n })\n }\n }\n\n return items\n}\n\n/**\n * Reset a specific config key to default\n */\nexport function resetConfig(key: string): void {\n ensureDir()\n const config = getConfig()\n\n const keys = key.split('.')\n const rpcKey = keys[1]\n if (keys.length === 2 && keys[0] === 'rpc' && rpcKey) {\n delete config.rpc[rpcKey]\n } else if (VALID_KEYS.includes(key as ValidKey)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (config as any)[key] = DEFAULT_CONFIG[key as ValidKey]\n }\n\n fs.writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2))\n}\n\n/**\n * Reset all configuration to defaults\n */\nexport function resetAllConfig(): void {\n ensureDir()\n fs.writeFileSync(CONFIG_PATH, JSON.stringify(DEFAULT_CONFIG, null, 2))\n}\n\n/**\n * Get the config file path\n */\nexport function getConfigPath(): string {\n return CONFIG_PATH\n}\n"],"mappings":"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","names":["React","Box","Text","Box","Text","jsx","jsxs","Box","Text","Box","Text","jsx","jsxs","label","Box","Text","Box","Text","jsx","jsxs","Text","Box","Box","Text","InkSpinner","jsx","jsxs","Text","InkSpinner","Box","Box","Text","jsx","jsxs","Text","Box","jsx","jsxs","Box","Text","useState","useEffect","Box","Text","useApp","getChains","HYPEREVM_CHAIN_ID","jsx","jsxs","Box","Text","HYPEREVM_CHAIN_ID","useApp","useState","useEffect","getChains","useState","useEffect","Box","Text","useApp","getChains","HYPEREVM_CHAIN_ID","jsx","jsxs","useApp","useState","useEffect","getChains","HYPEREVM_CHAIN_ID","Box","Text","useState","useEffect","Box","Text","useApp","getChains","getBridgeableTokens","jsx","jsxs","response","getChains","chain","useApp","useState","useEffect","getBridgeableTokens","Box","Text","useState","useEffect","useCallback","Box","Text","useApp","Mina","jsx","jsxs","getStatusColor","jsx","Text","jsxs","Box","useApp","useState","Mina","useCallback","useEffect","useState","useEffect","useCallback","Box","Text","useApp","useInput","Mina","getChains","getBridgeableTokens","HYPEREVM_CHAIN_ID","HYPEREVM_USDC_ADDRESS","path","jsx","jsxs","ErrorDisplay","Box","Text","QuoteDisplay","useApp","useState","useInput","useEffect","getChains","getBridgeableTokens","HYPEREVM_CHAIN_ID","HYPEREVM_USDC_ADDRESS","useCallback","Mina","render","React","useState","useEffect","Box","Text","useApp","fs","fs","fs","jsx","jsxs","truncateHash","Box","Text","useApp","useState","useEffect","React","useState","useEffect","Box","Text","useApp","Mina","getChains","Fragment","jsx","jsxs","truncateAddress","formatUsd","resolveChainId","response","getChains","chain","useApp","useState","useEffect","Mina","Box","Text","React","useState","useEffect","Box","Text","useApp","os","fs","path","ensureDir","jsx","jsxs","useApp","useState","useEffect","Box","Text","React"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.tsx","../src/commands/wizard.tsx","../src/ui/theme.ts","../src/ui/Box.tsx","../src/ui/Header.tsx","../src/ui/Select.tsx","../src/ui/ProgressSteps.tsx","../src/ui/Spinner.tsx","../src/ui/Table.tsx","../src/ui/SearchableList.tsx","../src/lib/wallet.ts","../src/commands/quote.tsx","../src/commands/chains.tsx","../src/commands/tokens.tsx","../src/commands/status.tsx","../src/commands/bridge.tsx","../src/commands/history.tsx","../src/lib/history.ts","../src/commands/balance.tsx","../src/commands/config.tsx","../src/lib/config.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport React from 'react';\nimport { render } from 'ink';\nimport { Wizard } from './commands/wizard.js';\nimport { QuoteDisplay } from './commands/quote.js';\nimport { ChainsCommand } from './commands/chains.js';\nimport { TokensCommand } from './commands/tokens.js';\nimport { Status } from './commands/status.js';\nimport { bridgeCommand, type BridgeCommandOptions } from './commands/bridge.js';\nimport { HistoryCommand } from './commands/history.js';\nimport { BalanceCommand } from './commands/balance.js';\nimport { ConfigCommand } from './commands/config.js';\n\nconst VERSION = '1.2.0';\n\nconst program = new Command();\n\nprogram\n .name('mina')\n .description('Mina Bridge CLI - Bridge assets from any chain to Hyperliquid')\n .version(VERSION, '-v, --version', 'Display the current version')\n .helpOption('-h, --help', 'Display help information');\n\n// Wizard command (can be explicitly called)\nprogram\n .command('wizard')\n .description('Launch the interactive bridge wizard')\n .action(() => {\n render(React.createElement(Wizard));\n });\n\n// Quote command - get a bridge quote\nprogram\n .command('quote')\n .description('Get a bridge quote')\n .requiredOption('--from <chain>', 'Source chain (e.g., ethereum, arbitrum, polygon)')\n .option('--to <chain>', 'Destination chain', 'hyperliquid')\n .requiredOption('--token <symbol>', 'Token to bridge (e.g., USDC, ETH)')\n .requiredOption('--amount <number>', 'Amount to bridge')\n .option('--json', 'Output as JSON for machine-readable format')\n .action((options) => {\n render(\n React.createElement(QuoteDisplay, {\n fromChain: options.from,\n toChain: options.to,\n token: options.token,\n amount: options.amount,\n jsonOutput: options.json || false,\n })\n );\n });\n\n// Status command - check bridge transaction status\nprogram\n .command('status <txHash>')\n .description('Check bridge status')\n .option('--watch', 'Poll for updates')\n .action((txHash, options) => {\n render(\n React.createElement(Status, {\n txHash,\n watch: options.watch || false,\n })\n );\n });\n\n// Chains command - list supported chains\nprogram\n .command('chains')\n .description('List supported chains')\n .option('--json', 'Output as JSON')\n .action((options) => {\n render(\n React.createElement(ChainsCommand, {\n json: options.json || false,\n })\n );\n });\n\n// Tokens command - list bridgeable tokens\nprogram\n .command('tokens')\n .description('List bridgeable tokens')\n .option('--chain <chain>', 'Filter by chain (name or ID)')\n .option('--json', 'Output as JSON')\n .action((options) => {\n render(\n React.createElement(TokensCommand, {\n chain: options.chain,\n json: options.json || false,\n })\n );\n });\n\n// Bridge command - execute a bridge transaction\nprogram\n .command('bridge')\n .description('Execute a bridge transaction')\n .requiredOption('--from <chain>', 'Source chain (e.g., arbitrum, ethereum, polygon)')\n .requiredOption('--token <symbol>', 'Token to bridge (e.g., USDC, ETH)')\n .requiredOption('--amount <number>', 'Amount to bridge')\n .option('--key <path>', 'Path to private key file (JSON or plain text)')\n .option('--yes', 'Skip confirmation prompt')\n .option('--auto-deposit', 'Auto-deposit to Hyperliquid L1', true)\n .action((options) => {\n bridgeCommand(options as BridgeCommandOptions);\n });\n\n// History command - view bridge transaction history\nprogram\n .command('history')\n .description('View bridge transaction history')\n .option('--limit <number>', 'Number of entries to show', '10')\n .option('--address <address>', 'Filter by wallet address')\n .option('--json', 'Output as JSON')\n .action((options) => {\n render(\n React.createElement(HistoryCommand, {\n limit: parseInt(options.limit, 10) || 10,\n address: options.address,\n json: options.json || false,\n })\n );\n });\n\n// Balance command - check wallet balances\nprogram\n .command('balance')\n .description('Check wallet balances')\n .requiredOption('--address <address>', 'Wallet address')\n .option('--chain <chain>', 'Specific chain (name or ID)')\n .option('--all', 'Show all tokens including zero balance')\n .option('--json', 'Output as JSON')\n .action((options) => {\n render(\n React.createElement(BalanceCommand, {\n address: options.address,\n chain: options.chain,\n showAll: options.all || false,\n json: options.json || false,\n })\n );\n });\n\n// Config command - manage CLI configuration\nprogram\n .command('config [action] [key] [value]')\n .description('Manage CLI configuration')\n .action((action, key, value) => {\n render(\n React.createElement(ConfigCommand, {\n action,\n key,\n value,\n })\n );\n });\n\nprogram.addHelpText('after', `\n${chalk.bold('Examples:')}\n ${chalk.dim('# Launch interactive wizard (default when no command given)')}\n $ mina\n\n ${chalk.dim('# Get a bridge quote')}\n $ mina quote --from arbitrum --token USDC --amount 100\n $ mina quote --from ethereum --token ETH --amount 0.5 --json\n\n ${chalk.dim('# Bridge USDC from Ethereum to Hyperliquid')}\n $ mina bridge --from arbitrum --token USDC --amount 100 --key ./key.json\n $ mina bridge --from ethereum --token ETH --amount 0.5 --yes\n\n ${chalk.dim('# Check transaction status')}\n $ mina status 0x1234...abcd\n $ mina status 0x1234...abcd --watch\n\n ${chalk.dim('# View supported chains and tokens')}\n $ mina chains\n $ mina tokens --chain arbitrum\n $ mina tokens --chain 1\n\n ${chalk.dim('# View bridge transaction history')}\n $ mina history\n $ mina history --limit 20\n $ mina history --address 0x1234...abcd\n $ mina history --json\n\n ${chalk.dim('# Check wallet balances')}\n $ mina balance --address 0x1234...abcd\n $ mina balance --address 0x1234...abcd --chain arbitrum\n $ mina balance --address 0x1234...abcd --all\n $ mina balance --address 0x1234...abcd --json\n\n ${chalk.dim('# Manage configuration')}\n $ mina config list\n $ mina config get slippage\n $ mina config set slippage 0.5\n $ mina config set rpc.arbitrum https://arb1.example.com\n\n${chalk.bold('Documentation:')}\n https://github.com/siphoyawe/mina-sdk\n`);\n\n// Check if no command is provided - launch wizard\nconst args = process.argv.slice(2);\nconst hasCommand = args.length > 0 && !args[0]?.startsWith('-');\nconst isHelpOrVersion = args.some(arg => ['-h', '--help', '-v', '--version'].includes(arg));\n\nif (!hasCommand && !isHelpOrVersion) {\n // No command provided, launch interactive wizard\n render(React.createElement(Wizard));\n} else {\n // Parse command normally\n program.parse(process.argv);\n}\n","import React, { useState, useEffect, useCallback } from 'react'\nimport { Box, Text, useApp, useInput } from 'ink'\nimport {\n Mina,\n getChains,\n getBridgeableTokens,\n getQuote,\n type Chain,\n type Token,\n type Quote,\n type ExecutionResult,\n type StepStatusPayload,\n type TransactionStatusPayload,\n HYPEREVM_CHAIN_ID,\n HYPEREVM_USDC_ADDRESS,\n normalizeError,\n} from '@siphoyawe/mina-sdk'\nimport {\n Header,\n theme,\n symbols,\n ChainSelect,\n TokenSelect,\n Spinner,\n ProgressSteps,\n KeyValue,\n Box as StyledBox,\n Divider,\n type ChainSelectItem,\n type TokenSelectItem,\n type Step as ProgressStep,\n} from '../ui/index.js'\nimport { loadPrivateKey, createSigner, getAddressFromPrivateKey } from '../lib/wallet.js'\n\n/**\n * Wizard step types\n */\ntype WizardStep = 'chain' | 'token' | 'amount' | 'key' | 'confirm' | 'execute'\n\n/**\n * Wizard state interface\n */\ninterface WizardState {\n step: WizardStep\n chain: Chain | null\n token: Token | null\n amount: string\n quote: Quote | null\n error: string | null\n privateKey: string | null\n walletAddress: string | null\n executionResult: ExecutionResult | null\n executionStatus: string\n}\n\n/**\n * Initial wizard state\n */\nconst initialState: WizardState = {\n step: 'chain',\n chain: null,\n token: null,\n amount: '',\n quote: null,\n error: null,\n privateKey: null,\n walletAddress: null,\n executionResult: null,\n executionStatus: '',\n}\n\n/**\n * Navigation hints component\n */\nfunction NavigationHints({ step }: { step: WizardStep }) {\n const hints: Record<WizardStep, string> = {\n chain: 'up/down Select Enter Confirm q Quit',\n token: 'up/down Select Enter Confirm b Back q Quit',\n amount: 'Enter Confirm b Back q Quit',\n key: 'Enter Confirm b Back q Quit',\n confirm: 'Enter Execute b Back q Quit',\n execute: 'Please wait...',\n }\n\n return (\n <Box marginTop={1}>\n <Text color={theme.muted} dimColor>\n {hints[step]}\n </Text>\n </Box>\n )\n}\n\n/**\n * Step indicator component showing current position in wizard\n */\nfunction StepIndicator({ currentStep }: { currentStep: WizardStep }) {\n const steps: WizardStep[] = ['chain', 'token', 'amount', 'key', 'confirm', 'execute']\n const stepLabels: Record<WizardStep, string> = {\n chain: 'Chain',\n token: 'Token',\n amount: 'Amount',\n key: 'Wallet',\n confirm: 'Confirm',\n execute: 'Execute',\n }\n\n const currentIndex = steps.indexOf(currentStep)\n\n return (\n <Box marginBottom={1}>\n {steps.map((step, index) => {\n const isActive = index === currentIndex\n const isCompleted = index < currentIndex\n const separator = index < steps.length - 1 ? ' > ' : ''\n\n return (\n <Text key={step}>\n <Text\n color={isActive ? theme.primary : isCompleted ? theme.success : theme.muted}\n bold={isActive}\n dimColor={!isActive && !isCompleted}\n >\n {isCompleted ? symbols.check : isActive ? symbols.arrow : symbols.pending} {stepLabels[step]}\n </Text>\n <Text color={theme.muted} dimColor>{separator}</Text>\n </Text>\n )\n })}\n </Box>\n )\n}\n\n/**\n * Chain selection step\n */\nfunction ChainSelectionStep({\n onSelect,\n selectedChain,\n}: {\n onSelect: (chain: Chain) => void\n selectedChain: Chain | null\n}) {\n const [chains, setChains] = useState<Chain[]>([])\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n async function loadChains() {\n try {\n setLoading(true)\n setError(null)\n const response = await getChains()\n // Filter out HyperEVM as it's the destination\n const originChains = response.chains.filter(c => c.id !== HYPEREVM_CHAIN_ID)\n setChains(originChains)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load chains')\n } finally {\n setLoading(false)\n }\n }\n loadChains()\n }, [])\n\n if (loading) {\n return <Spinner text=\"Loading available chains...\" />\n }\n\n if (error) {\n return (\n <Box flexDirection=\"column\">\n <Text color={theme.error}>{symbols.failed} Error: {error}</Text>\n <Text color={theme.muted}>Press q to quit and try again</Text>\n </Box>\n )\n }\n\n const chainItems: ChainSelectItem[] = chains.map(chain => ({\n label: chain.name,\n value: chain.id,\n chainId: chain.id,\n type: 'origin' as const,\n description: `Chain ID: ${chain.id}`,\n }))\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text color={theme.secondary} bold>\n Select source chain to bridge from:\n </Text>\n </Box>\n <ChainSelect\n chains={chainItems}\n onSelect={(item) => {\n const chain = chains.find(c => c.id === item.chainId)\n if (chain) onSelect(chain)\n }}\n label=\"\"\n />\n <Box marginTop={1}>\n <Text color={theme.muted} dimColor>\n Destination: HyperEVM (Chain ID: {HYPEREVM_CHAIN_ID})\n </Text>\n </Box>\n </Box>\n )\n}\n\n/**\n * Token selection step\n */\nfunction TokenSelectionStep({\n chain,\n onSelect,\n selectedToken,\n}: {\n chain: Chain\n onSelect: (token: Token) => void\n selectedToken: Token | null\n}) {\n const [tokens, setTokens] = useState<Token[]>([])\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n async function loadTokens() {\n try {\n setLoading(true)\n setError(null)\n const response = await getBridgeableTokens(chain.id)\n setTokens(response.tokens)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load tokens')\n } finally {\n setLoading(false)\n }\n }\n loadTokens()\n }, [chain.id])\n\n if (loading) {\n return <Spinner text={`Loading bridgeable tokens for ${chain.name}...`} />\n }\n\n if (error) {\n return (\n <Box flexDirection=\"column\">\n <Text color={theme.error}>{symbols.failed} Error: {error}</Text>\n <Text color={theme.muted}>Press b to go back or q to quit</Text>\n </Box>\n )\n }\n\n if (tokens.length === 0) {\n return (\n <Box flexDirection=\"column\">\n <Text color={theme.warning}>{symbols.pending} No bridgeable tokens found for {chain.name}</Text>\n <Text color={theme.muted}>Press b to go back and select another chain</Text>\n </Box>\n )\n }\n\n const tokenItems: TokenSelectItem[] = tokens.map(token => ({\n label: token.symbol,\n value: token.address,\n symbol: token.symbol,\n description: token.name,\n }))\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text color={theme.secondary} bold>\n Select token to bridge from {chain.name}:\n </Text>\n </Box>\n <TokenSelect\n tokens={tokenItems}\n onSelect={(item) => {\n const token = tokens.find(t => t.address === item.value)\n if (token) onSelect(token)\n }}\n label=\"\"\n />\n </Box>\n )\n}\n\n/**\n * Amount input step with blinking cursor\n */\nfunction AmountInputStep({\n token,\n chain,\n amount,\n onAmountChange,\n onConfirm,\n error,\n}: {\n token: Token\n chain: Chain\n amount: string\n onAmountChange: (amount: string) => void\n onConfirm: () => void\n error: string | null\n}) {\n const [cursorVisible, setCursorVisible] = useState(true)\n\n // Blinking cursor effect\n useEffect(() => {\n const interval = setInterval(() => {\n setCursorVisible(v => !v)\n }, 530)\n return () => clearInterval(interval)\n }, [])\n\n // Handle input\n useInput((input, key) => {\n if (key.return && amount.length > 0) {\n onConfirm()\n return\n }\n\n if (key.backspace || key.delete) {\n onAmountChange(amount.slice(0, -1))\n return\n }\n\n // Only allow numeric input and decimal point\n if (/^[0-9.]$/.test(input)) {\n // Prevent multiple decimal points\n if (input === '.' && amount.includes('.')) return\n // Prevent starting with multiple zeros\n if (input === '0' && amount === '0') return\n onAmountChange(amount + input)\n }\n })\n\n const cursor = cursorVisible ? '|' : ' '\n const displayAmount = amount || '0'\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text color={theme.secondary} bold>\n Enter amount of {token.symbol} to bridge:\n </Text>\n </Box>\n\n <StyledBox bordered padding={1}>\n <Box>\n <Text color={theme.primary} bold>\n {displayAmount}\n </Text>\n <Text color={theme.primary}>{cursor}</Text>\n <Text color={theme.muted}> {token.symbol}</Text>\n </Box>\n </StyledBox>\n\n {error && (\n <Box marginTop={1}>\n <Text color={theme.error}>{symbols.failed} {error}</Text>\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text color={theme.muted} dimColor>\n From: {chain.name} ({token.symbol})\n </Text>\n </Box>\n <Box>\n <Text color={theme.muted} dimColor>\n To: HyperEVM (USDC)\n </Text>\n </Box>\n </Box>\n )\n}\n\n/**\n * Private key input step\n */\nfunction KeyInputStep({\n privateKey,\n walletAddress,\n onKeyChange,\n onConfirm,\n error,\n loading,\n}: {\n privateKey: string\n walletAddress: string | null\n onKeyChange: (key: string) => void\n onConfirm: () => void\n error: string | null\n loading: boolean\n}) {\n const [cursorVisible, setCursorVisible] = useState(true)\n\n // Blinking cursor effect\n useEffect(() => {\n const interval = setInterval(() => {\n setCursorVisible(v => !v)\n }, 530)\n return () => clearInterval(interval)\n }, [])\n\n // Handle input\n useInput((input, key) => {\n if (loading) return\n\n if (key.return && privateKey.length >= 64) {\n onConfirm()\n return\n }\n\n if (key.backspace || key.delete) {\n onKeyChange(privateKey.slice(0, -1))\n return\n }\n\n // Only allow hex characters\n if (/^[0-9a-fA-Fx]$/.test(input)) {\n onKeyChange(privateKey + input)\n }\n })\n\n const cursor = cursorVisible ? '|' : ' '\n // Mask the key for security (show first 6 and last 4 chars)\n const maskedKey = privateKey.length > 10\n ? `${privateKey.slice(0, 6)}${'*'.repeat(Math.max(0, privateKey.length - 10))}${privateKey.slice(-4)}`\n : privateKey\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text color={theme.secondary} bold>\n Enter your private key to sign the transaction:\n </Text>\n </Box>\n\n <StyledBox bordered padding={1}>\n <Box>\n <Text color={theme.primary} bold>\n {maskedKey || '0x'}\n </Text>\n <Text color={theme.primary}>{cursor}</Text>\n </Box>\n </StyledBox>\n\n {loading && (\n <Box marginTop={1}>\n <Spinner text=\"Validating key and fetching quote...\" />\n </Box>\n )}\n\n {walletAddress && !loading && (\n <Box marginTop={1}>\n <Text color={theme.success}>\n {symbols.check} Wallet: {walletAddress.slice(0, 8)}...{walletAddress.slice(-6)}\n </Text>\n </Box>\n )}\n\n {error && (\n <Box marginTop={1}>\n <Text color={theme.error}>{symbols.failed} {error}</Text>\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text color={theme.muted} dimColor>\n Your key is only used locally to sign transactions\n </Text>\n </Box>\n <Box>\n <Text color={theme.muted} dimColor>\n Tip: Paste your 64-character hex key (with or without 0x prefix)\n </Text>\n </Box>\n </Box>\n )\n}\n\n/**\n * Confirmation step showing summary with real quote\n */\nfunction ConfirmationStep({\n chain,\n token,\n amount,\n quote,\n walletAddress,\n onConfirm,\n}: {\n chain: Chain\n token: Token\n amount: string\n quote: Quote | null\n walletAddress: string | null\n onConfirm: () => void\n}) {\n // Handle Enter key to confirm\n useInput((_input, key) => {\n if (key.return && quote) {\n onConfirm()\n }\n })\n\n if (!quote) {\n return <Spinner text=\"Fetching quote...\" />\n }\n\n const estimatedMinutes = Math.ceil(quote.estimatedTime / 60)\n const outputFormatted = (Number(quote.toAmount) / Math.pow(10, quote.toToken.decimals)).toFixed(2)\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text color={theme.secondary} bold>\n Review your bridge transaction:\n </Text>\n </Box>\n\n {walletAddress && (\n <Box marginBottom={1}>\n <Text color={theme.muted} dimColor>\n Wallet: {walletAddress.slice(0, 8)}...{walletAddress.slice(-6)}\n </Text>\n </Box>\n )}\n\n <StyledBox bordered title=\"Transaction Summary\" padding={1}>\n <KeyValue\n items={[\n { key: 'From Chain', value: chain.name },\n { key: 'Token', value: token.symbol },\n { key: 'Amount', value: `${amount} ${token.symbol}` },\n { key: 'To Chain', value: 'HyperEVM' },\n { key: 'You Receive', value: `~${outputFormatted} ${quote.toToken.symbol}` },\n ]}\n />\n\n <Box marginTop={1} marginBottom={1}>\n <Divider width={40} />\n </Box>\n\n <KeyValue\n items={[\n { key: 'Gas Fee', value: `$${quote.fees.gasUsd.toFixed(2)}` },\n { key: 'Bridge Fee', value: `$${quote.fees.bridgeFeeUsd.toFixed(2)}` },\n { key: 'Total Fees', value: `$${quote.fees.totalUsd.toFixed(2)}` },\n { key: 'Est. Time', value: `~${estimatedMinutes} min` },\n ]}\n keyColor={theme.muted}\n valueColor={theme.warning}\n />\n </StyledBox>\n\n {quote.highImpact && (\n <Box marginTop={1}>\n <Text color={theme.warning}>\n {symbols.pending} Warning: High price impact ({(quote.priceImpact * 100).toFixed(2)}%)\n </Text>\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text color={theme.success} bold>\n {symbols.arrow} Press Enter to execute the bridge\n </Text>\n </Box>\n <Box>\n <Text color={theme.muted} dimColor>\n Press b to go back and edit\n </Text>\n </Box>\n </Box>\n )\n}\n\n/**\n * Step state for tracking execution progress\n */\ntype StepState = 'pending' | 'active' | 'completed' | 'failed'\n\ninterface ExecutionStepState {\n approval: StepState\n bridge: StepState\n confirm: StepState\n}\n\n/**\n * Execution step showing progress with real bridge execution\n */\nfunction ExecutionStep({\n chain,\n token,\n amount,\n quote,\n privateKey,\n onComplete,\n onError,\n}: {\n chain: Chain\n token: Token\n amount: string\n quote: Quote\n privateKey: string\n onComplete: (result: ExecutionResult) => void\n onError: (error: Error) => void\n}) {\n const [stepState, setStepState] = useState<ExecutionStepState>({\n approval: 'active',\n bridge: 'pending',\n confirm: 'pending',\n })\n const [statusMessage, setStatusMessage] = useState('Initializing...')\n const [txHash, setTxHash] = useState<string | null>(null)\n const [error, setError] = useState<string | null>(null)\n const [isExecuting, setIsExecuting] = useState(false)\n\n // Execute bridge on mount\n useEffect(() => {\n if (isExecuting) return\n setIsExecuting(true)\n\n const executeBridge = async () => {\n try {\n // Create signer\n const signer = await createSigner(privateKey, chain.id)\n\n // Create Mina client and execute\n const mina = new Mina({\n integrator: 'mina-cli-wizard',\n autoDeposit: true,\n })\n\n const result = await mina.execute({\n quote,\n signer,\n onStepChange: (stepStatus: StepStatusPayload) => {\n setStatusMessage(`${stepStatus.step}: ${stepStatus.status}`)\n\n if (stepStatus.step === 'approval') {\n if (stepStatus.status === 'completed') {\n setStepState(prev => ({ ...prev, approval: 'completed', bridge: 'active' }))\n } else if (stepStatus.status === 'failed') {\n setStepState(prev => ({ ...prev, approval: 'failed' }))\n } else if (stepStatus.status === 'active') {\n setStepState(prev => ({ ...prev, approval: 'active' }))\n }\n } else if (stepStatus.step === 'bridge' || stepStatus.step === 'swap') {\n if (stepStatus.status === 'completed') {\n setStepState(prev => ({ ...prev, bridge: 'completed', confirm: 'active' }))\n } else if (stepStatus.status === 'failed') {\n setStepState(prev => ({ ...prev, bridge: 'failed' }))\n } else if (stepStatus.status === 'active') {\n setStepState(prev => ({ ...prev, bridge: 'active' }))\n }\n if (stepStatus.txHash) {\n setTxHash(stepStatus.txHash)\n }\n } else if (stepStatus.step === 'deposit') {\n if (stepStatus.status === 'completed') {\n setStepState(prev => ({ ...prev, confirm: 'completed' }))\n } else if (stepStatus.status === 'failed') {\n setStepState(prev => ({ ...prev, confirm: 'failed' }))\n }\n }\n },\n onStatusChange: (status: TransactionStatusPayload) => {\n setStatusMessage(status.substatus || `Step ${status.currentStep}/${status.totalSteps}`)\n if (status.txHash) {\n setTxHash(status.txHash)\n }\n },\n })\n\n if (result.status === 'completed') {\n setStepState({\n approval: 'completed',\n bridge: 'completed',\n confirm: 'completed',\n })\n onComplete(result)\n } else if (result.status === 'failed') {\n setError(result.error?.message || 'Bridge execution failed')\n onError(result.error || new Error('Bridge execution failed'))\n }\n } catch (err) {\n const normalizedError = normalizeError(err instanceof Error ? err : new Error(String(err)))\n setError(normalizedError.message)\n onError(normalizedError)\n }\n }\n\n executeBridge()\n }, [])\n\n const steps: ProgressStep[] = [\n {\n label: 'Approving token spend',\n status: stepState.approval,\n description: stepState.approval === 'active' ? 'Waiting for approval...' : undefined,\n },\n {\n label: 'Executing bridge transaction',\n status: stepState.bridge,\n description: stepState.bridge === 'active' ? statusMessage : undefined,\n },\n {\n label: 'Confirming on destination',\n status: stepState.confirm,\n description: stepState.confirm === 'active' ? 'Waiting for bridge confirmation...' : undefined,\n },\n ]\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text color={theme.secondary} bold>\n Bridging {amount} {token.symbol} from {chain.name} to HyperEVM\n </Text>\n </Box>\n\n <ProgressSteps steps={steps} title=\"Bridge Progress\" showNumbers />\n\n {txHash && (\n <Box marginTop={1}>\n <Text color={theme.muted}>\n TX: {txHash.slice(0, 16)}...{txHash.slice(-8)}\n </Text>\n </Box>\n )}\n\n {stepState.confirm === 'completed' && (\n <Box marginTop={1}>\n <Text color={theme.success} bold>\n {symbols.check} Bridge completed successfully!\n </Text>\n </Box>\n )}\n\n {error && (\n <Box marginTop={1}>\n <Text color={theme.error}>\n {symbols.failed} Error: {error}\n </Text>\n </Box>\n )}\n\n {!error && stepState.confirm !== 'completed' && (\n <Box marginTop={1}>\n <Text color={theme.muted} dimColor>\n {statusMessage}\n </Text>\n </Box>\n )}\n </Box>\n )\n}\n\n/**\n * Main Wizard component\n */\nexport function Wizard() {\n const { exit } = useApp()\n const [state, setState] = useState<WizardState>(initialState)\n\n // Loading state for key validation\n const [keyLoading, setKeyLoading] = useState(false)\n\n // Handle global navigation\n useInput((input, key) => {\n // Quit on 'q'\n if (input === 'q' && state.step !== 'execute') {\n exit()\n return\n }\n\n // Go back on 'b' (except in amount/key steps where backspace deletes, and execute)\n if ((input === 'b') && state.step !== 'chain' && state.step !== 'execute' && state.step !== 'amount' && state.step !== 'key') {\n goBack()\n return\n }\n\n // In amount step, 'b' goes back\n if (input === 'b' && state.step === 'amount') {\n goBack()\n return\n }\n\n // In key step, 'b' goes back only if not loading\n if (input === 'b' && state.step === 'key' && !keyLoading) {\n goBack()\n return\n }\n })\n\n const goBack = useCallback(() => {\n setState(prev => {\n switch (prev.step) {\n case 'token':\n return { ...prev, step: 'chain', token: null, error: null }\n case 'amount':\n return { ...prev, step: 'token', amount: '', error: null }\n case 'key':\n return { ...prev, step: 'amount', privateKey: null, walletAddress: null, quote: null, error: null }\n case 'confirm':\n return { ...prev, step: 'key', error: null }\n default:\n return prev\n }\n })\n }, [])\n\n const handleChainSelect = useCallback((chain: Chain) => {\n setState(prev => ({ ...prev, chain, step: 'token', error: null }))\n }, [])\n\n const handleTokenSelect = useCallback((token: Token) => {\n setState(prev => ({ ...prev, token, step: 'amount', error: null }))\n }, [])\n\n const handleAmountChange = useCallback((amount: string) => {\n setState(prev => ({ ...prev, amount, error: null }))\n }, [])\n\n const handleAmountConfirm = useCallback(() => {\n // Validate amount\n const numAmount = parseFloat(state.amount)\n if (isNaN(numAmount) || numAmount <= 0) {\n setState(prev => ({ ...prev, error: 'Please enter a valid positive amount' }))\n return\n }\n // Go to key input step\n setState(prev => ({ ...prev, step: 'key', error: null }))\n }, [state.amount])\n\n const handleKeyChange = useCallback((key: string) => {\n setState(prev => ({ ...prev, privateKey: key, error: null }))\n }, [])\n\n const handleKeyConfirm = useCallback(async () => {\n if (!state.privateKey || !state.chain || !state.token) return\n\n // Validate key format\n const keyWithoutPrefix = state.privateKey.startsWith('0x') ? state.privateKey.slice(2) : state.privateKey\n if (!/^[0-9a-fA-F]{64}$/.test(keyWithoutPrefix)) {\n setState(prev => ({ ...prev, error: 'Invalid private key format. Expected 64 hex characters.' }))\n return\n }\n\n setKeyLoading(true)\n\n try {\n // Get wallet address from key\n const normalizedKey = state.privateKey.startsWith('0x') ? state.privateKey : `0x${state.privateKey}`\n const address = await getAddressFromPrivateKey(normalizedKey)\n setState(prev => ({ ...prev, walletAddress: address, privateKey: normalizedKey }))\n\n // Fetch quote\n const amountInSmallestUnit = (parseFloat(state.amount) * Math.pow(10, state.token!.decimals)).toString()\n\n const quote = await getQuote({\n fromChainId: state.chain!.id,\n toChainId: HYPEREVM_CHAIN_ID,\n fromToken: state.token!.address,\n toToken: HYPEREVM_USDC_ADDRESS,\n fromAmount: amountInSmallestUnit,\n fromAddress: address,\n })\n\n setState(prev => ({ ...prev, quote, step: 'confirm', error: null }))\n } catch (err) {\n const error = err instanceof Error ? err.message : 'Failed to validate key or fetch quote'\n setState(prev => ({ ...prev, error }))\n } finally {\n setKeyLoading(false)\n }\n }, [state.privateKey, state.chain, state.token, state.amount])\n\n const handleConfirm = useCallback(() => {\n setState(prev => ({ ...prev, step: 'execute', error: null }))\n }, [])\n\n const handleExecutionComplete = useCallback((result: ExecutionResult) => {\n setState(prev => ({ ...prev, executionResult: result, executionStatus: 'completed' }))\n }, [])\n\n const handleExecutionError = useCallback((error: Error) => {\n setState(prev => ({ ...prev, error: error.message, executionStatus: 'failed' }))\n }, [])\n\n // Render step content\n const renderStepContent = () => {\n switch (state.step) {\n case 'chain':\n return (\n <ChainSelectionStep\n onSelect={handleChainSelect}\n selectedChain={state.chain}\n />\n )\n\n case 'token':\n if (!state.chain) return null\n return (\n <TokenSelectionStep\n chain={state.chain}\n onSelect={handleTokenSelect}\n selectedToken={state.token}\n />\n )\n\n case 'amount':\n if (!state.chain || !state.token) return null\n return (\n <AmountInputStep\n chain={state.chain}\n token={state.token}\n amount={state.amount}\n onAmountChange={handleAmountChange}\n onConfirm={handleAmountConfirm}\n error={state.error}\n />\n )\n\n case 'key':\n if (!state.chain || !state.token) return null\n return (\n <KeyInputStep\n privateKey={state.privateKey || ''}\n walletAddress={state.walletAddress}\n onKeyChange={handleKeyChange}\n onConfirm={handleKeyConfirm}\n error={state.error}\n loading={keyLoading}\n />\n )\n\n case 'confirm':\n if (!state.chain || !state.token) return null\n return (\n <ConfirmationStep\n chain={state.chain}\n token={state.token}\n amount={state.amount}\n quote={state.quote}\n walletAddress={state.walletAddress}\n onConfirm={handleConfirm}\n />\n )\n\n case 'execute':\n if (!state.chain || !state.token || !state.quote || !state.privateKey) return null\n return (\n <ExecutionStep\n chain={state.chain}\n token={state.token}\n amount={state.amount}\n quote={state.quote}\n privateKey={state.privateKey}\n onComplete={handleExecutionComplete}\n onError={handleExecutionError}\n />\n )\n\n default:\n return null\n }\n }\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n {/* Header with logo */}\n <Header showTagline tagline=\"Cross-chain bridge to Hyperliquid\" />\n\n {/* Step indicator */}\n <StepIndicator currentStep={state.step} />\n\n {/* Main content area */}\n <Box flexDirection=\"column\" marginY={1}>\n {renderStepContent()}\n </Box>\n\n {/* Navigation hints */}\n <NavigationHints step={state.step} />\n </Box>\n )\n}\n\nexport default Wizard\n","/**\n * Dark Luxe Terminal Theme for Mina Bridge CLI\n * Optimized for terminal display with ANSI color support\n */\n\nexport const theme = {\n // Primary colors\n primary: '#7DD3FC', // Sky blue - main accent\n secondary: '#A1A1AA', // Gray - supporting text\n muted: '#71717A', // Dark gray - disabled/placeholder\n\n // Status colors\n success: '#0ECC83', // Green - completed/success\n error: '#F87171', // Red - error/failed\n warning: '#FBBF24', // Yellow - warning/pending\n\n // UI elements\n border: '#3F3F46', // Border gray\n background: '#18181B', // Dark background\n\n // Additional colors for variety\n accent: '#E879F9', // Purple accent\n info: '#38BDF8', // Light blue info\n} as const\n\nexport type ThemeColor = keyof typeof theme\n\n/**\n * Unicode box-drawing characters for terminal UI\n */\nexport const borders = {\n // Single line box\n topLeft: '┌',\n topRight: '┐',\n bottomLeft: '└',\n bottomRight: '┘',\n horizontal: '─',\n vertical: '│',\n\n // Junctions\n leftT: '├',\n rightT: '┤',\n topT: '┬',\n bottomT: '┴',\n cross: '┼',\n\n // Double line (for emphasis)\n doubleHorizontal: '═',\n doubleVertical: '║',\n doubleTopLeft: '╔',\n doubleTopRight: '╗',\n doubleBottomLeft: '╚',\n doubleBottomRight: '╝',\n} as const\n\n/**\n * Status symbols for progress indicators\n */\nexport const symbols = {\n pending: '○',\n active: '→',\n completed: '✓',\n failed: '✗',\n spinner: '◐',\n bullet: '•',\n arrow: '›',\n check: '✔',\n cross: '✘',\n search: '⌕',\n star: '★',\n} as const\n\n/**\n * ASCII Art Logo for Mina Bridge\n */\nexport const MINA_LOGO = `\n __ __ ___ _ _ _\n | \\\\/ |_ _| \\\\ | | / \\\\\n | |\\\\/| || || \\\\| | / _ \\\\\n | | | || || |\\\\ |/ ___ \\\\\n |_| |_|___|_| \\\\_/_/ \\\\_\\\\\n`\n\nexport const TAGLINE = 'Cross-chain bridge to Hyperliquid'\n","import React from 'react'\nimport { Box as InkBox, Text, type BoxProps as InkBoxProps } from 'ink'\nimport { theme, borders } from './theme.js'\n\nexport interface BoxProps extends Omit<InkBoxProps, 'borderStyle' | 'borderColor'> {\n /** Title to display in the box header */\n title?: string\n /** Border color from theme */\n borderColor?: string\n /** Whether to show border */\n bordered?: boolean\n /** Padding inside the box */\n padding?: number\n children?: React.ReactNode\n}\n\n/**\n * Styled border box component with Dark Luxe theme\n */\nexport function Box({\n title,\n borderColor = theme.border,\n bordered = true,\n padding = 1,\n children,\n ...props\n}: BoxProps) {\n if (!bordered) {\n return (\n <InkBox padding={padding} {...props}>\n {children}\n </InkBox>\n )\n }\n\n return (\n <InkBox\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={borderColor}\n paddingX={padding}\n paddingY={padding > 0 ? 1 : 0}\n {...props}\n >\n {title && (\n <InkBox marginBottom={1}>\n <Text color={theme.primary} bold>\n {title}\n </Text>\n </InkBox>\n )}\n {children}\n </InkBox>\n )\n}\n\nexport interface DividerProps {\n /** Width of the divider */\n width?: number\n /** Color of the divider */\n color?: string\n /** Character to use for the divider */\n char?: string\n}\n\n/**\n * Horizontal divider component\n */\nexport function Divider({\n width = 40,\n color = theme.border,\n char = borders.horizontal\n}: DividerProps) {\n return (\n <Text color={color}>\n {char.repeat(width)}\n </Text>\n )\n}\n","import React from 'react'\nimport { Box, Text } from 'ink'\nimport { theme, MINA_LOGO, TAGLINE } from './theme.js'\n\nexport interface HeaderProps {\n /** Whether to show the tagline */\n showTagline?: boolean\n /** Custom tagline to display */\n tagline?: string\n /** Whether to show a compact version */\n compact?: boolean\n}\n\n/**\n * ASCII art Mina logo header component\n */\nexport function Header({\n showTagline = true,\n tagline = TAGLINE,\n compact = false\n}: HeaderProps) {\n if (compact) {\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text color={theme.primary} bold>\n MINA\n </Text>\n {showTagline && (\n <Text color={theme.secondary} dimColor>\n {tagline}\n </Text>\n )}\n </Box>\n )\n }\n\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text color={theme.primary} bold>\n {MINA_LOGO}\n </Text>\n {showTagline && (\n <Box justifyContent=\"center\">\n <Text color={theme.secondary} dimColor>\n {tagline}\n </Text>\n </Box>\n )}\n </Box>\n )\n}\n\nexport interface SubheaderProps {\n /** Text to display */\n text: string\n /** Icon to show before text */\n icon?: string\n}\n\n/**\n * Subheader component for section titles\n */\nexport function Subheader({ text, icon }: SubheaderProps) {\n return (\n <Box marginY={1}>\n <Text color={theme.primary} bold>\n {icon && `${icon} `}{text}\n </Text>\n </Box>\n )\n}\n","import React from 'react'\nimport { Box, Text } from 'ink'\nimport InkSelectInput from 'ink-select-input'\nimport { theme, symbols } from './theme.js'\n\n// Define InkItem type to match ink-select-input's expected format\ninterface InkItem<V> {\n key?: string\n label: string\n value: V\n}\n\nexport interface SelectItem<V = string> {\n label: string\n value: V\n description?: string\n disabled?: boolean\n}\n\nexport interface SelectProps<V = string> {\n /** Items to display in the selector */\n items: SelectItem<V>[]\n /** Callback when an item is selected */\n onSelect: (item: SelectItem<V>) => void\n /** Callback when highlighted item changes */\n onHighlight?: (item: SelectItem<V>) => void\n /** Initially selected item index */\n initialIndex?: number\n /** Whether the select is disabled */\n disabled?: boolean\n /** Label to show above the select */\n label?: string\n /** Limit visible items (for scrolling) */\n limit?: number\n}\n\n/**\n * Styled chain/token selector component\n * Wraps ink-select-input with Dark Luxe theme\n */\nexport function Select<V = string>({\n items,\n onSelect,\n onHighlight,\n initialIndex = 0,\n disabled = false,\n label,\n limit,\n}: SelectProps<V>) {\n // Transform items to ink-select-input format\n const inkItems: InkItem<SelectItem<V>>[] = items.map((item) => ({\n label: item.label,\n value: item,\n }))\n\n const handleSelect = (item: InkItem<SelectItem<V>>) => {\n if (!item.value.disabled) {\n onSelect(item.value)\n }\n }\n\n const handleHighlight = (item: InkItem<SelectItem<V>>) => {\n onHighlight?.(item.value)\n }\n\n // Custom item component for theming\n const itemComponent = ({ isSelected, label }: { isSelected?: boolean; label: string }) => {\n const item = items.find(i => i.label === label)\n const isDisabled = item?.disabled\n\n return (\n <Box>\n <Text color={isSelected ? theme.primary : isDisabled ? theme.muted : theme.secondary}>\n {isSelected ? symbols.arrow : ' '} {label}\n </Text>\n {item?.description && (\n <Text color={theme.muted} dimColor>\n {' '}— {item.description}\n </Text>\n )}\n </Box>\n )\n }\n\n // Custom indicator component\n const indicatorComponent = ({ isSelected }: { isSelected?: boolean }) => (\n <Text color={theme.primary}>\n {isSelected ? symbols.arrow : ' '}\n </Text>\n )\n\n if (disabled) {\n return (\n <Box flexDirection=\"column\">\n {label && (\n <Text color={theme.muted} dimColor>\n {label}\n </Text>\n )}\n <Text color={theme.muted} dimColor>\n (disabled)\n </Text>\n </Box>\n )\n }\n\n return (\n <Box flexDirection=\"column\">\n {label && (\n <Box marginBottom={1}>\n <Text color={theme.secondary}>{label}</Text>\n </Box>\n )}\n <InkSelectInput\n items={inkItems}\n onSelect={handleSelect}\n onHighlight={handleHighlight}\n initialIndex={initialIndex}\n itemComponent={itemComponent}\n indicatorComponent={indicatorComponent}\n limit={limit}\n />\n </Box>\n )\n}\n\nexport interface ChainSelectItem extends SelectItem<number> {\n chainId: number\n type: 'origin' | 'destination'\n}\n\n/**\n * Pre-configured chain selector\n */\nexport function ChainSelect({\n chains,\n onSelect,\n label = 'Select Chain:',\n}: {\n chains: ChainSelectItem[]\n onSelect: (chain: ChainSelectItem) => void\n label?: string\n}) {\n return (\n <Select<number>\n items={chains}\n onSelect={(item) => onSelect(item as ChainSelectItem)}\n label={label}\n />\n )\n}\n\nexport interface TokenSelectItem extends SelectItem<string> {\n symbol: string\n balance?: string\n}\n\n/**\n * Pre-configured token selector\n */\nexport function TokenSelect({\n tokens,\n onSelect,\n label = 'Select Token:',\n}: {\n tokens: TokenSelectItem[]\n onSelect: (token: TokenSelectItem) => void\n label?: string\n}) {\n return (\n <Select<string>\n items={tokens}\n onSelect={(item) => onSelect(item as TokenSelectItem)}\n label={label}\n />\n )\n}\n","import React from 'react'\nimport { Box, Text } from 'ink'\nimport InkSpinner from 'ink-spinner'\nimport { theme, symbols } from './theme.js'\n\nexport type StepStatus = 'pending' | 'active' | 'completed' | 'failed'\n\nexport interface Step {\n /** Step label */\n label: string\n /** Current status */\n status: StepStatus\n /** Optional description/details */\n description?: string\n /** Optional timestamp */\n timestamp?: string\n}\n\nexport interface ProgressStepsProps {\n /** Array of steps to display */\n steps: Step[]\n /** Whether to show step numbers */\n showNumbers?: boolean\n /** Whether to show timestamps */\n showTimestamps?: boolean\n /** Title for the progress section */\n title?: string\n}\n\n/**\n * Get the status indicator for a step\n */\nfunction getStatusIndicator(status: StepStatus): React.ReactNode {\n switch (status) {\n case 'pending':\n return <Text color={theme.muted}>{symbols.pending}</Text>\n case 'active':\n return (\n <Text color={theme.primary}>\n <InkSpinner type=\"dots\" />\n </Text>\n )\n case 'completed':\n return <Text color={theme.success}>{symbols.completed}</Text>\n case 'failed':\n return <Text color={theme.error}>{symbols.failed}</Text>\n }\n}\n\n/**\n * Get the color for a step based on status\n */\nfunction getStatusColor(status: StepStatus): string {\n switch (status) {\n case 'pending':\n return theme.muted\n case 'active':\n return theme.primary\n case 'completed':\n return theme.success\n case 'failed':\n return theme.error\n }\n}\n\n/**\n * Single step component\n */\nfunction StepItem({\n step,\n index,\n showNumber,\n showTimestamp,\n isLast,\n}: {\n step: Step\n index: number\n showNumber: boolean\n showTimestamp: boolean\n isLast: boolean\n}) {\n const color = getStatusColor(step.status)\n\n return (\n <Box flexDirection=\"column\">\n <Box>\n {/* Status indicator */}\n <Box width={3}>{getStatusIndicator(step.status)}</Box>\n\n {/* Step number (optional) */}\n {showNumber && (\n <Box width={4}>\n <Text color={color} dimColor={step.status === 'pending'}>\n {index + 1}.\n </Text>\n </Box>\n )}\n\n {/* Step label */}\n <Box flexGrow={1}>\n <Text\n color={color}\n bold={step.status === 'active'}\n dimColor={step.status === 'pending'}\n >\n {step.label}\n </Text>\n </Box>\n\n {/* Timestamp (optional) */}\n {showTimestamp && step.timestamp && (\n <Box marginLeft={2}>\n <Text color={theme.muted} dimColor>\n {step.timestamp}\n </Text>\n </Box>\n )}\n </Box>\n\n {/* Description */}\n {step.description && (\n <Box marginLeft={showNumber ? 7 : 3}>\n <Text color={theme.muted} dimColor>\n {step.description}\n </Text>\n </Box>\n )}\n\n {/* Connector line (not for last item) */}\n {!isLast && step.status !== 'pending' && (\n <Box marginLeft={1}>\n <Text color={theme.border}>│</Text>\n </Box>\n )}\n </Box>\n )\n}\n\n/**\n * Bridge progress steps component with status indicators\n *\n * Status indicators:\n * - Pending: ○\n * - Active: → (with spinner)\n * - Completed: ✓ (green)\n * - Failed: ✗ (red)\n */\nexport function ProgressSteps({\n steps,\n showNumbers = true,\n showTimestamps = false,\n title,\n}: ProgressStepsProps) {\n return (\n <Box flexDirection=\"column\">\n {title && (\n <Box marginBottom={1}>\n <Text color={theme.secondary} bold>\n {title}\n </Text>\n </Box>\n )}\n {steps.map((step, index) => (\n <StepItem\n key={index}\n step={step}\n index={index}\n showNumber={showNumbers}\n showTimestamp={showTimestamps}\n isLast={index === steps.length - 1}\n />\n ))}\n </Box>\n )\n}\n\n/**\n * Pre-configured bridge progress steps\n */\nexport function BridgeProgress({\n currentStep,\n error,\n}: {\n currentStep: number\n error?: string\n}) {\n const bridgeSteps: Step[] = [\n {\n label: 'Connecting wallet',\n status: currentStep > 0 ? 'completed' : currentStep === 0 ? 'active' : 'pending',\n },\n {\n label: 'Fetching quote',\n status: currentStep > 1 ? 'completed' : currentStep === 1 ? 'active' : 'pending',\n },\n {\n label: 'Approving token',\n status: currentStep > 2 ? 'completed' : currentStep === 2 ? 'active' : 'pending',\n },\n {\n label: 'Executing bridge',\n status: currentStep > 3 ? 'completed' : currentStep === 3 ? 'active' : 'pending',\n },\n {\n label: 'Confirming on destination',\n status: currentStep > 4 ? 'completed' : currentStep === 4 ? 'active' : 'pending',\n description: error || undefined,\n },\n ]\n\n // Mark as failed if there's an error\n if (error && currentStep >= 0 && currentStep < 5) {\n const step = bridgeSteps[currentStep]\n if (step) {\n step.status = 'failed'\n step.description = error\n }\n }\n\n return <ProgressSteps steps={bridgeSteps} title=\"Bridge Progress\" />\n}\n","import React from 'react'\nimport { Box, Text } from 'ink'\nimport InkSpinner from 'ink-spinner'\nimport { theme } from './theme.js'\n\nexport type SpinnerType =\n | 'dots'\n | 'line'\n | 'pipe'\n | 'simpleDots'\n | 'simpleDotsScrolling'\n | 'star'\n | 'flip'\n | 'hamburger'\n | 'growVertical'\n | 'growHorizontal'\n | 'balloon'\n | 'balloon2'\n | 'noise'\n | 'bounce'\n | 'boxBounce'\n | 'boxBounce2'\n | 'triangle'\n | 'arc'\n | 'circle'\n | 'squareCorners'\n | 'circleQuarters'\n | 'circleHalves'\n | 'squish'\n | 'toggle'\n | 'toggle2'\n | 'toggle3'\n | 'toggle4'\n | 'toggle5'\n | 'toggle6'\n | 'toggle7'\n | 'toggle8'\n | 'toggle9'\n | 'toggle10'\n | 'toggle11'\n | 'toggle12'\n | 'toggle13'\n | 'arrow'\n | 'arrow2'\n | 'arrow3'\n | 'bouncingBar'\n | 'bouncingBall'\n | 'smiley'\n | 'monkey'\n | 'hearts'\n | 'clock'\n | 'earth'\n | 'moon'\n | 'runner'\n | 'pong'\n | 'shark'\n | 'dqpb'\n | 'weather'\n | 'christmas'\n | 'grenade'\n | 'point'\n | 'layer'\n | 'betaWave'\n\nexport interface SpinnerProps {\n /** Text to display next to the spinner */\n text?: string\n /** Type of spinner animation */\n type?: SpinnerType\n /** Color of the spinner */\n color?: string\n /** Color of the text */\n textColor?: string\n /** Whether to show the spinner on the right */\n rightAlign?: boolean\n}\n\n/**\n * Animated loading spinner component with Dark Luxe theme\n */\nexport function Spinner({\n text,\n type = 'dots',\n color = theme.primary,\n textColor = theme.secondary,\n rightAlign = false,\n}: SpinnerProps) {\n const spinnerElement = (\n <Text color={color}>\n <InkSpinner type={type} />\n </Text>\n )\n\n if (!text) {\n return spinnerElement\n }\n\n return (\n <Box>\n {!rightAlign && spinnerElement}\n <Text color={textColor}>\n {rightAlign ? '' : ' '}{text}{rightAlign ? ' ' : ''}\n </Text>\n {rightAlign && spinnerElement}\n </Box>\n )\n}\n\n/**\n * Full-width loading state with spinner\n */\nexport function Loading({\n text = 'Loading...',\n type = 'dots',\n}: {\n text?: string\n type?: SpinnerType\n}) {\n return (\n <Box padding={1}>\n <Spinner text={text} type={type} />\n </Box>\n )\n}\n\n/**\n * Inline loading indicator (minimal)\n */\nexport function InlineSpinner({ color = theme.primary }: { color?: string }) {\n return (\n <Text color={color}>\n <InkSpinner type=\"dots\" />\n </Text>\n )\n}\n","import React from 'react'\nimport { Box, Text } from 'ink'\nimport { theme, borders } from './theme.js'\n\nexport interface Column<T> {\n /** Column header */\n header: string\n /** Key to access data or custom accessor */\n accessor: keyof T | ((row: T) => string | number)\n /** Column width (default: auto based on content) */\n width?: number\n /** Text alignment */\n align?: 'left' | 'center' | 'right'\n /** Header color */\n headerColor?: string\n /** Cell color or function to determine color */\n cellColor?: string | ((value: unknown, row: T) => string)\n}\n\nexport interface TableProps<T extends object> {\n /** Array of data rows */\n data: T[]\n /** Column definitions */\n columns: Column<T>[]\n /** Show borders around table */\n bordered?: boolean\n /** Border color */\n borderColor?: string\n /** Header background/style */\n headerBold?: boolean\n /** Striped rows */\n striped?: boolean\n /** Max width for the table */\n maxWidth?: number\n}\n\n/**\n * Get cell value from row based on accessor\n */\nfunction getCellValue<T>(row: T, accessor: Column<T>['accessor']): string {\n if (typeof accessor === 'function') {\n return String(accessor(row))\n }\n return String(row[accessor] ?? '')\n}\n\n/**\n * Calculate column widths based on content\n */\nfunction calculateColumnWidths<T extends object>(\n data: T[],\n columns: Column<T>[],\n maxWidth?: number\n): number[] {\n const widths = columns.map((col) => {\n const headerWidth = col.header.length\n const dataWidths = data.map((row) => getCellValue(row, col.accessor).length)\n const maxContentWidth = Math.max(headerWidth, ...dataWidths)\n return col.width ?? Math.min(maxContentWidth, 30) // Cap at 30 chars\n })\n\n // If maxWidth is set, proportionally reduce widths\n if (maxWidth) {\n const totalWidth = widths.reduce((a, b) => a + b, 0) + (columns.length * 3) + 1\n if (totalWidth > maxWidth) {\n const scale = maxWidth / totalWidth\n return widths.map((w) => Math.floor(w * scale))\n }\n }\n\n return widths\n}\n\n/**\n * Pad text to width with alignment\n */\nfunction padText(text: string, width: number, align: 'left' | 'center' | 'right' = 'left'): string {\n const truncated = text.length > width ? text.slice(0, width - 1) + '…' : text\n const padding = width - truncated.length\n\n switch (align) {\n case 'right':\n return ' '.repeat(padding) + truncated\n case 'center':\n const leftPad = Math.floor(padding / 2)\n const rightPad = padding - leftPad\n return ' '.repeat(leftPad) + truncated + ' '.repeat(rightPad)\n default:\n return truncated + ' '.repeat(padding)\n }\n}\n\n/**\n * Render a horizontal border line\n */\nfunction BorderLine({\n widths,\n position,\n color,\n}: {\n widths: number[]\n position: 'top' | 'middle' | 'bottom'\n color: string\n}) {\n const chars = {\n top: { left: borders.topLeft, right: borders.topRight, junction: borders.topT },\n middle: { left: borders.leftT, right: borders.rightT, junction: borders.cross },\n bottom: { left: borders.bottomLeft, right: borders.bottomRight, junction: borders.bottomT },\n }\n\n const { left, right, junction } = chars[position]\n const segments = widths.map((w) => borders.horizontal.repeat(w + 2))\n const line = left + segments.join(junction) + right\n\n return <Text color={color}>{line}</Text>\n}\n\n/**\n * Render a data row\n */\nfunction TableRow<T extends object>({\n row,\n columns,\n widths,\n bordered,\n borderColor,\n isEven,\n striped,\n}: {\n row: T\n columns: Column<T>[]\n widths: number[]\n bordered: boolean\n borderColor: string\n isEven: boolean\n striped: boolean\n}) {\n return (\n <Box>\n {bordered && <Text color={borderColor}>{borders.vertical}</Text>}\n {columns.map((col, i) => {\n const value = getCellValue(row, col.accessor)\n const colWidth = widths[i] ?? col.header.length\n const paddedValue = padText(value, colWidth, col.align)\n\n let cellColor: string = theme.secondary\n if (col.cellColor) {\n cellColor = typeof col.cellColor === 'function'\n ? col.cellColor(value, row)\n : col.cellColor\n }\n\n return (\n <React.Fragment key={i}>\n <Text> </Text>\n <Text color={cellColor} dimColor={striped && isEven}>\n {paddedValue}\n </Text>\n <Text> </Text>\n {bordered && <Text color={borderColor}>{borders.vertical}</Text>}\n </React.Fragment>\n )\n })}\n </Box>\n )\n}\n\n/**\n * Data table component with unicode borders\n *\n * Example output:\n * ```\n * ┌─────────────┬──────────┬──────────┐\n * │ Chain │ ID │ Type │\n * ├─────────────┼──────────┼──────────┤\n * │ Ethereum │ 1 │ Origin │\n * │ Arbitrum │ 42161 │ Origin │\n * └─────────────┴──────────┴──────────┘\n * ```\n */\nexport function Table<T extends object>({\n data,\n columns,\n bordered = true,\n borderColor = theme.border,\n headerBold = true,\n striped = false,\n maxWidth,\n}: TableProps<T>) {\n const widths = calculateColumnWidths(data, columns, maxWidth)\n\n return (\n <Box flexDirection=\"column\">\n {/* Top border */}\n {bordered && <BorderLine widths={widths} position=\"top\" color={borderColor} />}\n\n {/* Header row */}\n <Box>\n {bordered && <Text color={borderColor}>{borders.vertical}</Text>}\n {columns.map((col, i) => {\n const colWidth = widths[i] ?? col.header.length\n return (\n <React.Fragment key={i}>\n <Text> </Text>\n <Text color={col.headerColor ?? theme.primary} bold={headerBold}>\n {padText(col.header, colWidth, col.align)}\n </Text>\n <Text> </Text>\n {bordered && <Text color={borderColor}>{borders.vertical}</Text>}\n </React.Fragment>\n )\n })}\n </Box>\n\n {/* Header separator */}\n {bordered && <BorderLine widths={widths} position=\"middle\" color={borderColor} />}\n\n {/* Data rows */}\n {data.map((row, rowIndex) => (\n <TableRow\n key={rowIndex}\n row={row}\n columns={columns}\n widths={widths}\n bordered={bordered}\n borderColor={borderColor}\n isEven={rowIndex % 2 === 0}\n striped={striped}\n />\n ))}\n\n {/* Bottom border */}\n {bordered && <BorderLine widths={widths} position=\"bottom\" color={borderColor} />}\n </Box>\n )\n}\n\n/**\n * Simple key-value display (not a full table)\n */\nexport function KeyValue({\n items,\n keyColor = theme.muted,\n valueColor = theme.secondary,\n separator = ':',\n}: {\n items: Array<{ key: string; value: string | number }>\n keyColor?: string\n valueColor?: string\n separator?: string\n}) {\n const maxKeyWidth = Math.max(...items.map((item) => item.key.length))\n\n return (\n <Box flexDirection=\"column\">\n {items.map((item, index) => (\n <Box key={index}>\n <Text color={keyColor}>\n {item.key.padEnd(maxKeyWidth)}\n </Text>\n <Text color={theme.muted}> {separator} </Text>\n <Text color={valueColor}>{item.value}</Text>\n </Box>\n ))}\n </Box>\n )\n}\n","import React, { useState, useMemo } from 'react'\nimport { Box, Text, useInput, useStdin } from 'ink'\nimport { theme, symbols, borders } from './theme.js'\n\nexport interface ListItem {\n id: string | number\n label: string\n sublabel?: string\n badge?: string\n badgeColor?: string\n}\n\nexport interface SearchableListProps {\n items: ListItem[]\n title?: string\n placeholder?: string\n /** Number of items to show initially */\n pageSize?: number\n /** Highlight popular items */\n popularIds?: (string | number)[]\n /** Called when user selects an item (Enter key) */\n onSelect?: (item: ListItem) => void\n /** Show search input */\n searchable?: boolean\n /** Max items to display (with \"show more\" hint) */\n maxDisplay?: number\n}\n\n/**\n * Fuzzy search filter\n */\nfunction fuzzyMatch(query: string, text: string): boolean {\n const lowerQuery = query.toLowerCase()\n const lowerText = text.toLowerCase()\n\n // Exact substring match\n if (lowerText.includes(lowerQuery)) return true\n\n // Fuzzy: check if query chars appear in order\n let queryIndex = 0\n for (const char of lowerText) {\n if (char === lowerQuery[queryIndex]) {\n queryIndex++\n if (queryIndex === lowerQuery.length) return true\n }\n }\n\n return false\n}\n\n/**\n * Sort items with popular first, then alphabetically\n */\nfunction sortItems(items: ListItem[], popularIds: (string | number)[]): ListItem[] {\n return [...items].sort((a, b) => {\n const aPopular = popularIds.includes(a.id)\n const bPopular = popularIds.includes(b.id)\n if (aPopular && !bPopular) return -1\n if (!aPopular && bPopular) return 1\n return a.label.localeCompare(b.label)\n })\n}\n\n/**\n * Interactive keyboard handler component\n * Only rendered when stdin supports raw mode\n */\nfunction KeyboardHandler({\n searchable,\n displayedItemsLength,\n selectedIndex,\n setSelectedIndex,\n setQuery,\n setShowAll,\n hasMore,\n onSelect,\n displayedItems,\n}: {\n searchable: boolean\n displayedItemsLength: number\n selectedIndex: number\n setSelectedIndex: React.Dispatch<React.SetStateAction<number>>\n setQuery: React.Dispatch<React.SetStateAction<string>>\n setShowAll: React.Dispatch<React.SetStateAction<boolean>>\n hasMore: boolean\n onSelect?: (item: ListItem) => void\n displayedItems: ListItem[]\n}) {\n useInput((input, key) => {\n if (searchable) {\n if (key.backspace || key.delete) {\n setQuery((q) => q.slice(0, -1))\n setSelectedIndex(0)\n } else if (input && !key.ctrl && !key.meta && input.length === 1 && input.match(/[a-zA-Z0-9 -]/)) {\n setQuery((q) => q + input)\n setSelectedIndex(0)\n }\n }\n\n if (key.upArrow) {\n setSelectedIndex((i) => Math.max(0, i - 1))\n } else if (key.downArrow) {\n setSelectedIndex((i) => Math.min(displayedItemsLength - 1, i + 1))\n } else if (key.return && onSelect && displayedItems[selectedIndex]) {\n onSelect(displayedItems[selectedIndex])\n } else if (input === 'm' && hasMore) {\n setShowAll(true)\n }\n })\n\n return null\n}\n\n/**\n * Interactive searchable list with keyboard navigation\n * Falls back to static list when running non-interactively\n */\nexport function SearchableList({\n items,\n title,\n placeholder = 'Type to search...',\n pageSize = 8,\n popularIds = [],\n onSelect,\n searchable = true,\n maxDisplay = 15,\n}: SearchableListProps) {\n const { isRawModeSupported } = useStdin()\n const isInteractive = isRawModeSupported\n\n const [query, setQuery] = useState('')\n const [selectedIndex, setSelectedIndex] = useState(0)\n const [showAll, setShowAll] = useState(false)\n\n // Filter and sort items\n const filteredItems = useMemo(() => {\n let result = items\n\n // Apply search filter\n if (query) {\n result = items.filter(\n (item) =>\n fuzzyMatch(query, item.label) ||\n (item.sublabel && fuzzyMatch(query, item.sublabel))\n )\n }\n\n return sortItems(result, popularIds)\n }, [items, query, popularIds])\n\n // Paginate\n const displayLimit = showAll ? filteredItems.length : Math.min(maxDisplay, filteredItems.length)\n const displayedItems = filteredItems.slice(0, displayLimit)\n const hasMore = filteredItems.length > displayLimit\n\n // Keep selected index in bounds\n const safeIndex = Math.min(selectedIndex, Math.max(0, displayedItems.length - 1))\n\n return (\n <Box flexDirection=\"column\">\n {/* Keyboard handler - only mount when interactive */}\n {isInteractive && (\n <KeyboardHandler\n searchable={searchable}\n displayedItemsLength={displayedItems.length}\n selectedIndex={selectedIndex}\n setSelectedIndex={setSelectedIndex}\n setQuery={setQuery}\n setShowAll={setShowAll}\n hasMore={hasMore}\n onSelect={onSelect}\n displayedItems={displayedItems}\n />\n )}\n\n {/* Title */}\n {title && (\n <Box marginBottom={1}>\n <Text color={theme.secondary}>\n {symbols.arrow} {title}\n </Text>\n <Text color={theme.muted}> ({filteredItems.length})</Text>\n </Box>\n )}\n\n {/* Search input - only show when interactive */}\n {searchable && isInteractive && (\n <Box marginBottom={1}>\n <Text color={theme.border}>{borders.vertical}</Text>\n <Text color={theme.muted}> {symbols.search} </Text>\n {query ? (\n <Text color={theme.primary}>{query}</Text>\n ) : (\n <Text color={theme.muted} dimColor>\n {placeholder}\n </Text>\n )}\n <Text color={theme.accent}>▌</Text>\n </Box>\n )}\n\n {/* List items */}\n <Box flexDirection=\"column\">\n {displayedItems.map((item, index) => {\n const isSelected = isInteractive && index === safeIndex\n const isPopular = popularIds.includes(item.id)\n\n return (\n <Box key={item.id}>\n {isInteractive && (\n <Text color={isSelected ? theme.accent : theme.border}>\n {isSelected ? symbols.arrow : ' '}\n </Text>\n )}\n <Text> </Text>\n\n {/* Popular indicator */}\n {isPopular && (\n <Text color={theme.warning}>★ </Text>\n )}\n\n {/* Main label */}\n <Text\n color={isSelected ? theme.primary : theme.secondary}\n bold={isSelected}\n >\n {item.label}\n </Text>\n\n {/* Sublabel */}\n {item.sublabel && (\n <Text color={theme.muted} dimColor>\n {' '}({item.sublabel})\n </Text>\n )}\n\n {/* Badge */}\n {item.badge && (\n <Text color={item.badgeColor || theme.accent}>\n {' '}[{item.badge}]\n </Text>\n )}\n </Box>\n )\n })}\n\n {/* Empty state */}\n {displayedItems.length === 0 && (\n <Box>\n <Text color={theme.muted} dimColor>\n No matches for \"{query}\"\n </Text>\n </Box>\n )}\n\n {/* Show more hint */}\n {hasMore && !showAll && (\n <Box marginTop={1}>\n <Text color={theme.muted} dimColor>\n +{filteredItems.length - displayLimit} more\n {isInteractive && ' — press '}\n </Text>\n {isInteractive && (\n <>\n <Text color={theme.accent}>m</Text>\n <Text color={theme.muted} dimColor> to show all</Text>\n </>\n )}\n </Box>\n )}\n </Box>\n\n {/* Help text - only show in interactive mode */}\n {isInteractive && (\n <Box marginTop={1}>\n <Text color={theme.muted} dimColor>\n ↑↓ navigate{onSelect ? ' • Enter select' : ''}{searchable ? ' • Type to filter' : ''}\n </Text>\n </Box>\n )}\n </Box>\n )\n}\n\n/**\n * Compact list without interactivity - for display only\n */\nexport function CompactList({\n items,\n title,\n columns = 3,\n maxItems = 12,\n popularIds = [],\n}: {\n items: ListItem[]\n title?: string\n columns?: number\n maxItems?: number\n popularIds?: (string | number)[]\n}) {\n const sortedItems = sortItems(items, popularIds)\n const displayItems = sortedItems.slice(0, maxItems)\n const hasMore = items.length > maxItems\n\n // Group into rows\n const rows: ListItem[][] = []\n for (let i = 0; i < displayItems.length; i += columns) {\n rows.push(displayItems.slice(i, i + columns))\n }\n\n return (\n <Box flexDirection=\"column\">\n {title && (\n <Box marginBottom={1}>\n <Text color={theme.secondary}>\n {symbols.arrow} {title}\n </Text>\n <Text color={theme.muted}> ({items.length})</Text>\n </Box>\n )}\n\n {rows.map((row, rowIndex) => (\n <Box key={rowIndex} gap={2}>\n {row.map((item) => {\n const isPopular = popularIds.includes(item.id)\n return (\n <Box key={item.id} minWidth={20}>\n {isPopular && <Text color={theme.warning}>★ </Text>}\n <Text color={theme.primary}>{item.label}</Text>\n {item.sublabel && (\n <Text color={theme.muted} dimColor>\n {' '}{item.sublabel}\n </Text>\n )}\n </Box>\n )\n })}\n </Box>\n ))}\n\n {hasMore && (\n <Box marginTop={1}>\n <Text color={theme.muted} dimColor>\n +{items.length - maxItems} more\n </Text>\n </Box>\n )}\n </Box>\n )\n}\n\nexport default SearchableList\n","/**\n * Private key handling utilities for Mina Bridge CLI\n */\nimport fs from 'fs'\nimport readline from 'readline'\nimport type { TransactionSigner, TransactionRequestData } from '@siphoyawe/mina-sdk'\nimport type { Chain } from 'viem'\n\n/**\n * Load a private key from a file path\n * Supports both JSON format ({\"privateKey\": \"0x...\"}) and plain text format\n */\nexport async function loadPrivateKey(path?: string): Promise<string> {\n if (path) {\n if (!fs.existsSync(path)) {\n throw new Error(`Key file not found: ${path}`)\n }\n\n const content = fs.readFileSync(path, 'utf-8')\n\n try {\n // Try JSON format: { \"privateKey\": \"0x...\" }\n const json = JSON.parse(content)\n const key = json.privateKey || json.private_key || json.key\n if (key) {\n return normalizePrivateKey(key)\n }\n // If parsed but no key field, treat content as plain text\n return normalizePrivateKey(content.trim())\n } catch {\n // Plain text format - just the key\n return normalizePrivateKey(content.trim())\n }\n }\n\n // Prompt for key if not provided\n return promptForPrivateKey()\n}\n\n/**\n * Prompt user for private key via stdin\n * Note: Input is visible in terminal (for hidden input, use a dedicated library)\n */\nexport function promptForPrivateKey(): Promise<string> {\n return new Promise((resolve, reject) => {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n })\n\n // Note: readline doesn't support hiding input natively\n // For production, consider using a library like 'read' or 'prompts'\n process.stdout.write('Enter private key (input will be visible): ')\n\n rl.on('line', (answer) => {\n rl.close()\n try {\n resolve(normalizePrivateKey(answer.trim()))\n } catch (err) {\n reject(err)\n }\n })\n\n rl.on('close', () => {\n // Handle Ctrl+C\n })\n })\n}\n\n/**\n * Normalize private key to ensure it has 0x prefix\n */\nfunction normalizePrivateKey(key: string): string {\n const trimmed = key.trim()\n\n // Validate it looks like a private key\n const keyWithoutPrefix = trimmed.startsWith('0x') ? trimmed.slice(2) : trimmed\n\n if (!/^[0-9a-fA-F]{64}$/.test(keyWithoutPrefix)) {\n throw new Error('Invalid private key format. Expected 64 hex characters.')\n }\n\n return trimmed.startsWith('0x') ? trimmed : `0x${trimmed}`\n}\n\n/**\n * Get address from private key using viem\n */\nexport async function getAddressFromPrivateKey(privateKey: string): Promise<string> {\n const { privateKeyToAccount } = await import('viem/accounts')\n const account = privateKeyToAccount(privateKey as `0x${string}`)\n return account.address\n}\n\n/**\n * Create a transaction signer from a private key\n * This creates a signer compatible with the SDK's TransactionSigner interface\n */\nexport async function createSigner(\n privateKey: string,\n chainId: number,\n rpcUrl?: string\n): Promise<TransactionSigner> {\n const { privateKeyToAccount } = await import('viem/accounts')\n const { createWalletClient, http } = await import('viem')\n const { arbitrum, mainnet, optimism, polygon, base, avalanche, bsc } = await import('viem/chains')\n\n // Map chain ID to viem chain config\n const chainMap: Record<number, Chain> = {\n 1: mainnet,\n 42161: arbitrum,\n 10: optimism,\n 137: polygon,\n 8453: base,\n 43114: avalanche,\n 56: bsc,\n // HyperEVM\n 999: {\n id: 999,\n name: 'HyperEVM',\n nativeCurrency: { name: 'ETH', symbol: 'ETH', decimals: 18 },\n rpcUrls: {\n default: { http: ['https://rpc.hyperliquid.xyz/evm'] },\n },\n } as Chain,\n }\n\n const chain = chainMap[chainId]\n if (!chain) {\n throw new Error(`Unsupported chain ID: ${chainId}. Supported: ${Object.keys(chainMap).join(', ')}`)\n }\n\n const account = privateKeyToAccount(privateKey as `0x${string}`)\n\n const transport = rpcUrl ? http(rpcUrl) : http()\n\n const walletClient = createWalletClient({\n account,\n chain,\n transport,\n })\n\n return {\n sendTransaction: async (request: TransactionRequestData): Promise<string> => {\n const txHash = await walletClient.sendTransaction({\n to: request.to as `0x${string}`,\n data: request.data as `0x${string}`,\n value: BigInt(request.value || '0'),\n gas: request.gasLimit ? BigInt(request.gasLimit) : undefined,\n gasPrice: request.gasPrice ? BigInt(request.gasPrice) : undefined,\n chain,\n })\n\n return txHash\n },\n\n getAddress: async (): Promise<string> => {\n return account.address\n },\n\n getChainId: async (): Promise<number> => {\n return chainId\n },\n }\n}\n\n/**\n * Validate that a wallet has sufficient balance for gas\n */\nexport async function checkGasBalance(\n address: string,\n chainId: number,\n rpcUrl?: string\n): Promise<{ balance: bigint; sufficient: boolean }> {\n const { createPublicClient, http } = await import('viem')\n const { arbitrum, mainnet, optimism, polygon, base, avalanche, bsc } = await import('viem/chains')\n\n const chainMap: Record<number, Chain> = {\n 1: mainnet,\n 42161: arbitrum,\n 10: optimism,\n 137: polygon,\n 8453: base,\n 43114: avalanche,\n 56: bsc,\n 999: {\n id: 999,\n name: 'HyperEVM',\n nativeCurrency: { name: 'ETH', symbol: 'ETH', decimals: 18 },\n rpcUrls: {\n default: { http: ['https://rpc.hyperliquid.xyz/evm'] },\n },\n } as Chain,\n }\n\n const chain = chainMap[chainId]\n if (!chain) {\n throw new Error(`Unsupported chain ID: ${chainId}`)\n }\n\n const client = createPublicClient({\n chain,\n transport: rpcUrl ? http(rpcUrl) : http(),\n })\n\n const balance = await client.getBalance({ address: address as `0x${string}` })\n\n // Consider sufficient if > 0.001 ETH (or equivalent)\n const minBalance = BigInt('1000000000000000') // 0.001 ETH in wei\n\n return {\n balance,\n sufficient: balance >= minBalance,\n }\n}\n","import React, { useState, useEffect } from 'react'\nimport { Box, Text, useApp } from 'ink'\nimport {\n Mina,\n getChains,\n getTokens,\n HYPEREVM_CHAIN_ID,\n HYPEREVM_USDC_ADDRESS,\n type Chain,\n type Token,\n type Quote,\n} from '@siphoyawe/mina-sdk'\nimport {\n Box as StyledBox,\n Divider,\n KeyValue,\n Spinner,\n theme,\n symbols,\n} from '../ui/index.js'\n\n/**\n * Props for the QuoteDisplay component\n */\ninterface QuoteDisplayProps {\n fromChain: string\n toChain: string\n token: string\n amount: string\n jsonOutput: boolean\n}\n\n/**\n * Parse amount string to smallest unit based on decimals\n */\nfunction parseAmount(amount: string, decimals: number): string {\n const [whole, fraction = ''] = amount.split('.')\n const paddedFraction = fraction.padEnd(decimals, '0').slice(0, decimals)\n return (whole || '0') + paddedFraction\n}\n\n/**\n * Format amount from smallest unit to human-readable\n */\nfunction formatAmount(amount: string, decimals: number): string {\n const padded = amount.padStart(decimals + 1, '0')\n const integerPart = padded.slice(0, -decimals) || '0'\n const decimalPart = padded.slice(-decimals)\n const trimmedDecimal = decimalPart.replace(/0+$/, '')\n return trimmedDecimal ? `${integerPart}.${trimmedDecimal}` : integerPart\n}\n\n/**\n * Format time in seconds to human-readable string\n */\nfunction formatTime(seconds: number): string {\n if (seconds < 60) {\n return `~${seconds} seconds`\n }\n const minutes = Math.ceil(seconds / 60)\n return `~${minutes} minute${minutes > 1 ? 's' : ''}`\n}\n\n/**\n * Format USD amount\n */\nfunction formatUsd(amount: number): string {\n return `$${amount.toFixed(2)}`\n}\n\n/**\n * Get route steps description\n */\nfunction getRouteDescription(quote: Quote): string {\n const stepTools = quote.steps.map(step => step.tool)\n // Remove duplicates and join\n const uniqueTools = [...new Set(stepTools)]\n return uniqueTools.join(' -> ')\n}\n\n/**\n * Quote display component (styled box)\n */\nfunction QuoteBox({\n quote,\n fromChain,\n toChain,\n sourceToken,\n destToken,\n}: {\n quote: Quote\n fromChain: Chain\n toChain: string\n sourceToken: Token\n destToken: Token\n}) {\n const inputAmount = formatAmount(quote.fromAmount, sourceToken.decimals)\n const outputAmount = formatAmount(quote.toAmount, destToken.decimals)\n const routeDescription = getRouteDescription(quote)\n const estimatedTime = formatTime(quote.estimatedTime)\n const totalFees = formatUsd(quote.fees.totalUsd)\n\n // Fee breakdown\n const gasFees = formatUsd(quote.fees.gasUsd)\n const bridgeFees = formatUsd(quote.fees.bridgeFeeUsd)\n const protocolFees = formatUsd(quote.fees.protocolFeeUsd)\n\n return (\n <Box flexDirection=\"column\">\n <StyledBox bordered title=\"Bridge Quote\" padding={1}>\n {/* From/To Section */}\n <KeyValue\n items={[\n { key: 'From', value: `${inputAmount} ${sourceToken.symbol} (${fromChain.name})` },\n { key: 'To', value: `~${outputAmount} ${destToken.symbol} (${toChain})` },\n ]}\n keyColor={theme.muted}\n valueColor={theme.primary}\n />\n\n <Box marginY={1}>\n <Divider width={45} />\n </Box>\n\n {/* Route Info */}\n <KeyValue\n items={[\n { key: 'Route', value: routeDescription },\n { key: 'Time', value: estimatedTime },\n { key: 'Fees', value: totalFees },\n ]}\n keyColor={theme.muted}\n valueColor={theme.secondary}\n />\n\n <Box marginY={1}>\n <Divider width={45} />\n </Box>\n\n {/* Fee Breakdown */}\n <Box marginBottom={1}>\n <Text color={theme.muted} bold>Fee Breakdown:</Text>\n </Box>\n <KeyValue\n items={[\n { key: ' Gas', value: gasFees },\n { key: ' Bridge', value: bridgeFees },\n { key: ' Protocol', value: protocolFees },\n { key: ' Total', value: totalFees },\n ]}\n keyColor={theme.muted}\n valueColor={theme.warning}\n />\n\n {/* Price Impact Warning */}\n {quote.highImpact && (\n <Box marginTop={1}>\n <Text color={theme.warning}>\n {symbols.pending} High price impact: {(quote.priceImpact * 100).toFixed(2)}%\n </Text>\n </Box>\n )}\n\n {/* Minimum Received */}\n <Box marginTop={1}>\n <Text color={theme.muted}>\n Min. received: {quote.minimumReceivedFormatted} {destToken.symbol}\n </Text>\n </Box>\n </StyledBox>\n </Box>\n )\n}\n\n/**\n * JSON output for machine-readable format\n */\nfunction JsonOutput({ quote, fromChain, sourceToken }: {\n quote: Quote\n fromChain: Chain\n sourceToken: Token\n}) {\n const jsonData = {\n quote: {\n id: quote.id,\n from: {\n chain: fromChain.name,\n chainId: fromChain.id,\n token: sourceToken.symbol,\n amount: formatAmount(quote.fromAmount, sourceToken.decimals),\n amountRaw: quote.fromAmount,\n },\n to: {\n chain: 'Hyperliquid',\n chainId: HYPEREVM_CHAIN_ID,\n token: quote.toToken.symbol,\n amount: formatAmount(quote.toAmount, quote.toToken.decimals),\n amountRaw: quote.toAmount,\n },\n route: {\n steps: quote.steps.map(step => ({\n type: step.type,\n tool: step.tool,\n fromChain: step.fromChainId,\n toChain: step.toChainId,\n estimatedTime: step.estimatedTime,\n })),\n totalSteps: quote.steps.length,\n },\n fees: {\n total: quote.fees.totalUsd,\n gas: quote.fees.gasUsd,\n bridge: quote.fees.bridgeFeeUsd,\n protocol: quote.fees.protocolFeeUsd,\n },\n estimatedTime: quote.estimatedTime,\n priceImpact: quote.priceImpact,\n highImpact: quote.highImpact,\n slippageTolerance: quote.slippageTolerance,\n minimumReceived: quote.minimumReceivedFormatted,\n expiresAt: quote.expiresAt,\n },\n }\n\n return <Text>{JSON.stringify(jsonData, null, 2)}</Text>\n}\n\n/**\n * Error display component\n */\nfunction ErrorDisplay({ message }: { message: string }) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Box>\n <Text color={theme.error} bold>\n {symbols.failed} Error: {message}\n </Text>\n </Box>\n <Box marginTop={1}>\n <Text color={theme.muted}>\n Usage: npx mina quote --from <chain> --token <symbol> --amount <number>\n </Text>\n </Box>\n <Box marginTop={1}>\n <Text color={theme.muted}>Example: npx mina quote --from arbitrum --token USDC --amount 100</Text>\n </Box>\n </Box>\n )\n}\n\n/**\n * Main QuoteDisplay component\n */\nexport function QuoteDisplay({\n fromChain,\n toChain,\n token,\n amount,\n jsonOutput,\n}: QuoteDisplayProps) {\n const { exit } = useApp()\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n const [quote, setQuote] = useState<Quote | null>(null)\n const [sourceChain, setSourceChain] = useState<Chain | null>(null)\n const [sourceToken, setSourceToken] = useState<Token | null>(null)\n const [destToken, setDestToken] = useState<Token | null>(null)\n\n useEffect(() => {\n async function fetchQuote() {\n try {\n setLoading(true)\n setError(null)\n\n // Validate amount\n const numAmount = parseFloat(amount)\n if (isNaN(numAmount) || numAmount <= 0) {\n throw new Error('Invalid amount. Please provide a positive number.')\n }\n\n // Find source chain by name/key (case insensitive)\n const chainsResponse = await getChains()\n const chain = chainsResponse.chains.find(\n c =>\n c.name.toLowerCase() === fromChain.toLowerCase() ||\n c.key.toLowerCase() === fromChain.toLowerCase()\n )\n\n if (!chain) {\n const availableChains = chainsResponse.chains.map(c => c.name).join(', ')\n throw new Error(\n `Unknown chain: \"${fromChain}\". Available chains: ${availableChains}`\n )\n }\n setSourceChain(chain)\n\n // Find token by symbol\n const tokensResponse = await getTokens(chain.id)\n const foundToken = tokensResponse.tokens.find(\n t => t.symbol.toLowerCase() === token.toLowerCase()\n )\n\n if (!foundToken) {\n const availableTokens = tokensResponse.tokens\n .slice(0, 10)\n .map(t => t.symbol)\n .join(', ')\n throw new Error(\n `Token \"${token}\" not found on ${chain.name}. Available tokens include: ${availableTokens}...`\n )\n }\n setSourceToken(foundToken)\n\n // Create destination token reference (HyperEVM USDC)\n const destinationToken: Token = {\n address: HYPEREVM_USDC_ADDRESS,\n symbol: 'USDC',\n name: 'USD Coin',\n decimals: 6,\n logoUrl: '',\n chainId: HYPEREVM_CHAIN_ID,\n }\n setDestToken(destinationToken)\n\n // Get quote\n const mina = new Mina({ integrator: 'mina-cli' })\n const quoteResult = await mina.getQuote({\n fromChainId: chain.id,\n toChainId: HYPEREVM_CHAIN_ID,\n fromToken: foundToken.address,\n toToken: HYPEREVM_USDC_ADDRESS,\n fromAmount: parseAmount(amount, foundToken.decimals),\n fromAddress: '0x0000000000000000000000000000000000000000', // Placeholder for quote\n })\n\n setQuote(quoteResult)\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to fetch quote'\n setError(message)\n } finally {\n setLoading(false)\n }\n }\n\n fetchQuote()\n }, [fromChain, token, amount])\n\n // Exit after rendering JSON output\n useEffect(() => {\n if (!loading && jsonOutput) {\n // Give time for output to render\n const timer = setTimeout(() => exit(), 100)\n return () => clearTimeout(timer)\n }\n }, [loading, jsonOutput, exit])\n\n if (loading) {\n return (\n <Box padding={1}>\n <Spinner text={`Fetching quote for ${amount} ${token} from ${fromChain}...`} />\n </Box>\n )\n }\n\n if (error) {\n return <ErrorDisplay message={error} />\n }\n\n if (!quote || !sourceChain || !sourceToken || !destToken) {\n return <ErrorDisplay message=\"Failed to fetch quote data\" />\n }\n\n if (jsonOutput) {\n return <JsonOutput quote={quote} fromChain={sourceChain} sourceToken={sourceToken} />\n }\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n <QuoteBox\n quote={quote}\n fromChain={sourceChain}\n toChain={toChain === 'hyperliquid' ? 'Hyperliquid' : toChain}\n sourceToken={sourceToken}\n destToken={destToken}\n />\n\n {/* Quote expiry info */}\n <Box marginTop={1}>\n <Text color={theme.muted}>\n Quote valid until: {new Date(quote.expiresAt).toLocaleTimeString()}\n </Text>\n </Box>\n </Box>\n )\n}\n\n/**\n * Quote command handler\n */\nexport interface QuoteCommandOptions {\n from: string\n to: string\n token: string\n amount: string\n json?: boolean\n}\n\nexport default QuoteDisplay\n","import React, { useState, useEffect } from 'react'\nimport { Box, Text, useApp } from 'ink'\nimport {\n getChains,\n HYPEREVM_CHAIN_ID,\n type Chain,\n} from '@siphoyawe/mina-sdk'\nimport {\n Header,\n SearchableList,\n Spinner,\n theme,\n symbols,\n type ListItem,\n} from '../ui/index.js'\n\n/**\n * Popular chains to highlight (by chain ID)\n * These appear first and get a star indicator\n */\nconst POPULAR_CHAIN_IDS = [\n 1, // Ethereum\n 42161, // Arbitrum\n 10, // Optimism\n 137, // Polygon\n 8453, // Base\n 43114, // Avalanche\n 56, // BNB Chain\n 999, // HyperEVM (destination)\n]\n\n/**\n * Chain display row type\n */\ninterface ChainRow {\n name: string\n id: number\n type: 'Origin' | 'Dest'\n}\n\n/**\n * Chains command component - displays supported chains with interactive search\n */\nexport function ChainsCommand({ json = false }: { json?: boolean }) {\n const { exit } = useApp()\n const [chains, setChains] = useState<ChainRow[]>([])\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n async function loadChains() {\n try {\n setLoading(true)\n setError(null)\n\n const response = await getChains()\n\n // Map chains to display format\n const chainRows: ChainRow[] = response.chains.map((chain: Chain) => ({\n name: chain.name,\n id: chain.id,\n type: 'Origin' as const,\n }))\n\n // Add HyperEVM as destination\n const hasHyperEvm = chainRows.some(c => c.id === HYPEREVM_CHAIN_ID)\n if (!hasHyperEvm) {\n chainRows.push({\n name: 'Hyperliquid',\n id: HYPEREVM_CHAIN_ID,\n type: 'Dest',\n })\n } else {\n const hyperEvmChain = chainRows.find(c => c.id === HYPEREVM_CHAIN_ID)\n if (hyperEvmChain) {\n hyperEvmChain.type = 'Dest'\n }\n }\n\n setChains(chainRows)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load chains')\n } finally {\n setLoading(false)\n }\n }\n loadChains()\n }, [])\n\n // Exit after rendering in JSON mode\n useEffect(() => {\n if (!loading && json) {\n setTimeout(() => exit(), 100)\n }\n }, [loading, json, exit])\n\n // JSON output mode\n if (json) {\n if (loading) return null\n if (error) {\n console.error(JSON.stringify({ error }, null, 2))\n return null\n }\n console.log(JSON.stringify(chains, null, 2))\n return null\n }\n\n if (loading) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Header compact showTagline={false} />\n <Spinner text=\"Loading supported chains...\" />\n </Box>\n )\n }\n\n if (error) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Header compact showTagline={false} />\n <Box>\n <Text color={theme.error}>{symbols.failed} Error: {error}</Text>\n </Box>\n </Box>\n )\n }\n\n // Convert to ListItem format\n const listItems: ListItem[] = chains.map((chain) => ({\n id: chain.id,\n label: chain.name,\n sublabel: `ID: ${chain.id}`,\n badge: chain.type,\n badgeColor: chain.type === 'Origin' ? theme.success : theme.accent,\n }))\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Header compact showTagline={false} />\n\n <SearchableList\n items={listItems}\n title=\"Supported Chains\"\n placeholder=\"Type to filter chains...\"\n popularIds={POPULAR_CHAIN_IDS}\n maxDisplay={12}\n searchable={true}\n />\n\n <Box marginTop={1}>\n <Text color={theme.muted} dimColor>\n ★ = Popular chains • Origin = Source for bridging • Dest = Destination\n </Text>\n </Box>\n </Box>\n )\n}\n\nexport default ChainsCommand\n","import React, { useState, useEffect } from 'react'\nimport { Box, Text, useApp } from 'ink'\nimport {\n getChains,\n getBridgeableTokens,\n type Chain,\n type Token,\n} from '@siphoyawe/mina-sdk'\nimport {\n Header,\n SearchableList,\n Spinner,\n theme,\n symbols,\n type ListItem,\n} from '../ui/index.js'\n\n/**\n * Popular token symbols to highlight\n * These appear first and get a star indicator\n */\nconst POPULAR_TOKEN_SYMBOLS = [\n 'USDC',\n 'USDT',\n 'ETH',\n 'WETH',\n 'WBTC',\n 'DAI',\n 'USDC.e',\n 'LINK',\n 'UNI',\n 'ARB',\n 'OP',\n 'MATIC',\n]\n\n/**\n * Truncate address for display\n */\nfunction truncateAddress(address: string): string {\n if (address.length <= 14) return address\n return `${address.slice(0, 6)}...${address.slice(-4)}`\n}\n\n/**\n * Token display row type\n */\ninterface TokenRow {\n symbol: string\n address: string\n displayAddress: string\n decimals: number\n name?: string\n}\n\n/**\n * Resolve chain name or ID to chain ID\n */\nasync function resolveChainId(chainInput: string): Promise<{ chainId: number; chainName: string } | null> {\n const response = await getChains()\n\n // Check if it's a numeric ID\n const numericId = parseInt(chainInput, 10)\n if (!isNaN(numericId)) {\n const chain = response.chains.find((c: Chain) => c.id === numericId)\n if (chain) {\n return { chainId: chain.id, chainName: chain.name }\n }\n // Still try with the ID even if not found\n return { chainId: numericId, chainName: chainInput }\n }\n\n // Otherwise treat as chain name/key\n const chainLower = chainInput.toLowerCase()\n const chain = response.chains.find((c: Chain) =>\n c.name.toLowerCase() === chainLower ||\n c.key?.toLowerCase() === chainLower\n )\n\n if (chain) {\n return { chainId: chain.id, chainName: chain.name }\n }\n\n return null\n}\n\n/**\n * Tokens command component - displays bridgeable tokens with interactive search\n */\nexport function TokensCommand({\n chain,\n json = false,\n}: {\n chain?: string\n json?: boolean\n}) {\n const { exit } = useApp()\n const [tokens, setTokens] = useState<TokenRow[]>([])\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n const [chainName, setChainName] = useState<string>('')\n const [availableChains, setAvailableChains] = useState<Chain[]>([])\n\n useEffect(() => {\n async function loadTokens() {\n try {\n setLoading(true)\n setError(null)\n\n // If no chain specified, show available chains hint\n if (!chain) {\n const chainsResponse = await getChains()\n setAvailableChains(chainsResponse.chains)\n setError('Please specify a chain with --chain <name|id>')\n setLoading(false)\n return\n }\n\n // Resolve chain name to ID\n const resolved = await resolveChainId(chain)\n if (!resolved) {\n const chainsResponse = await getChains()\n setAvailableChains(chainsResponse.chains)\n setError(`Unknown chain: \"${chain}\"`)\n setLoading(false)\n return\n }\n\n setChainName(resolved.chainName)\n\n // Fetch bridgeable tokens for the chain\n const response = await getBridgeableTokens(resolved.chainId)\n\n // Map tokens to display format, filter out tokens without symbols\n const tokenRows: TokenRow[] = response.tokens\n .filter((token: Token) => token.symbol && token.symbol.trim() !== '')\n .map((token: Token) => ({\n symbol: token.symbol,\n address: token.address,\n displayAddress: truncateAddress(token.address),\n decimals: token.decimals,\n name: token.name,\n }))\n\n setTokens(tokenRows)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load tokens')\n } finally {\n setLoading(false)\n }\n }\n loadTokens()\n }, [chain])\n\n // Exit after rendering in JSON mode\n useEffect(() => {\n if (!loading && json) {\n setTimeout(() => exit(), 100)\n }\n }, [loading, json, exit])\n\n // JSON output mode\n if (json) {\n if (loading) return null\n if (error && !availableChains.length) {\n console.error(JSON.stringify({ error }, null, 2))\n return null\n }\n if (error && availableChains.length) {\n console.error(JSON.stringify({\n error,\n availableChains: availableChains.map(c => ({ name: c.name, id: c.id }))\n }, null, 2))\n return null\n }\n console.log(JSON.stringify(tokens.map(t => ({\n symbol: t.symbol,\n address: t.address,\n decimals: t.decimals,\n name: t.name,\n })), null, 2))\n return null\n }\n\n if (loading) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Header compact showTagline={false} />\n <Spinner text={chain ? `Loading tokens for ${chain}...` : 'Loading...'} />\n </Box>\n )\n }\n\n if (error) {\n // Show top 6 popular chains as quick suggestions\n const popularChainIds = [1, 42161, 10, 137, 8453, 43114]\n const popularChains = availableChains\n .filter(c => popularChainIds.includes(c.id))\n .slice(0, 6)\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Header compact showTagline={false} />\n <Box marginBottom={1}>\n <Text color={theme.error}>{symbols.failed} {error}</Text>\n </Box>\n\n {availableChains.length > 0 && (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text color={theme.secondary}>Popular chains:</Text>\n </Box>\n <Box flexDirection=\"row\" gap={2} flexWrap=\"wrap\">\n {popularChains.map((c) => (\n <Box key={c.id}>\n <Text color={theme.primary}>{c.name.toLowerCase()}</Text>\n </Box>\n ))}\n </Box>\n <Box marginTop={1}>\n <Text color={theme.muted} dimColor>\n Example: mina tokens --chain arbitrum\n </Text>\n </Box>\n <Box marginTop={1}>\n <Text color={theme.muted} dimColor>\n Run \"mina chains\" to see all {availableChains.length} supported chains\n </Text>\n </Box>\n </Box>\n )}\n </Box>\n )\n }\n\n if (tokens.length === 0) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Header compact showTagline={false} />\n <Box>\n <Text color={theme.warning}>\n {symbols.pending} No bridgeable tokens found for {chainName}\n </Text>\n </Box>\n </Box>\n )\n }\n\n // Convert to ListItem format\n const listItems: ListItem[] = tokens.map((token) => ({\n id: token.address,\n label: token.symbol,\n sublabel: token.displayAddress,\n badge: `${token.decimals}d`,\n badgeColor: theme.muted,\n }))\n\n // Get popular token IDs (addresses) for highlighting\n const popularTokenIds = tokens\n .filter(t => POPULAR_TOKEN_SYMBOLS.includes(t.symbol.toUpperCase()))\n .map(t => t.address)\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Header compact showTagline={false} />\n\n <Box marginBottom={1}>\n <Text color={theme.secondary}>\n {symbols.arrow} Bridgeable Tokens on{' '}\n </Text>\n <Text color={theme.primary} bold>\n {chainName}\n </Text>\n </Box>\n\n <SearchableList\n items={listItems}\n placeholder=\"Type to filter tokens (e.g. USDC, ETH)...\"\n popularIds={popularTokenIds}\n maxDisplay={12}\n searchable={true}\n />\n\n <Box marginTop={1}>\n <Text color={theme.muted} dimColor>\n ★ = Popular tokens • Tokens bridgeable to Hyperliquid via Mina\n </Text>\n </Box>\n </Box>\n )\n}\n\nexport default TokensCommand\n","import React, { useState, useEffect, useCallback, useMemo } from 'react'\nimport { Box, Text, useApp } from 'ink'\nimport {\n Mina,\n type TransactionStatus,\n type StepStatus,\n} from '@siphoyawe/mina-sdk'\nimport {\n Header,\n theme,\n symbols,\n Box as StyledBox,\n KeyValue,\n Spinner,\n} from '../ui/index.js'\n\n/**\n * Props for the Status command component\n */\ninterface StatusCommandProps {\n txHash: string\n watch?: boolean\n}\n\n/**\n * Format duration from milliseconds to human readable string\n */\nfunction formatDuration(ms: number): string {\n const seconds = Math.floor(ms / 1000)\n if (seconds < 60) return `${seconds}s`\n const minutes = Math.floor(seconds / 60)\n const remainingSeconds = seconds % 60\n return `${minutes}m ${remainingSeconds}s`\n}\n\n/**\n * Format timestamp to relative time\n */\nfunction formatRelativeTime(timestamp: number): string {\n const now = Date.now()\n const diff = now - timestamp\n return formatDuration(diff) + ' ago'\n}\n\n/**\n * Truncate transaction hash for display\n */\nfunction truncateHash(hash: string): string {\n if (hash.length <= 16) return hash\n return `${hash.slice(0, 8)}...${hash.slice(-6)}`\n}\n\n/**\n * Get status color based on status\n */\nfunction getStatusColor(status: string): string {\n switch (status) {\n case 'completed':\n return theme.success\n case 'failed':\n return theme.error\n case 'pending':\n return theme.muted\n case 'bridging':\n case 'depositing':\n case 'executing':\n return theme.primary\n default:\n return theme.secondary\n }\n}\n\n/**\n * Get step status indicator\n */\nfunction getStepIndicator(status: string): React.ReactNode {\n switch (status) {\n case 'pending':\n return <Text color={theme.muted}>{symbols.pending}</Text>\n case 'executing':\n return (\n <Text color={theme.primary}>\n <Spinner />\n </Text>\n )\n case 'completed':\n return <Text color={theme.success}>{symbols.completed}</Text>\n case 'failed':\n return <Text color={theme.error}>{symbols.failed}</Text>\n default:\n return <Text color={theme.muted}>{symbols.pending}</Text>\n }\n}\n\n/**\n * Calculate overall progress percentage based on steps\n */\nfunction calculateProgress(steps: StepStatus[]): number {\n if (steps.length === 0) return 0\n const completedSteps = steps.filter(s => s.status === 'completed').length\n const executingSteps = steps.filter(s => s.status === 'executing').length\n // Count executing steps as 50% complete\n return Math.round(((completedSteps + executingSteps * 0.5) / steps.length) * 100)\n}\n\n/**\n * Get current step info\n */\nfunction getCurrentStepInfo(steps: StepStatus[]): { current: number; total: number } {\n const total = steps.length\n const current = steps.findIndex(s => s.status === 'executing' || s.status === 'pending')\n // If all completed, return total\n if (current === -1) {\n return { current: total, total }\n }\n // Add 1 for 1-based display\n return { current: current + 1, total }\n}\n\n/**\n * Format step type for display\n */\nfunction formatStepType(stepType?: string): string {\n if (!stepType) return 'Unknown'\n const mapping: Record<string, string> = {\n approval: 'Approval',\n swap: 'Swap',\n bridge: 'Bridging',\n deposit: 'Deposit',\n }\n return mapping[stepType] || stepType.charAt(0).toUpperCase() + stepType.slice(1)\n}\n\n/**\n * Status display component\n */\nfunction StatusDisplay({\n status,\n txHash,\n elapsedTime,\n estimatedRemaining,\n}: {\n status: TransactionStatus\n txHash: string\n elapsedTime: number\n estimatedRemaining: number | null\n}) {\n const stepInfo = getCurrentStepInfo(status.steps)\n const progress = calculateProgress(status.steps)\n const statusLabel = status.status.charAt(0).toUpperCase() + status.status.slice(1)\n\n return (\n <Box flexDirection=\"column\">\n {/* Header Section */}\n <StyledBox bordered title=\"Bridge Status\" padding={1}>\n <KeyValue\n items={[\n { key: 'TX', value: truncateHash(txHash) },\n { key: 'Status', value: `${statusLabel} (Step ${stepInfo.current}/${stepInfo.total})` },\n ]}\n valueColor={getStatusColor(status.status)}\n />\n </StyledBox>\n\n {/* Progress Steps Section */}\n <Box marginTop={1}>\n <StyledBox bordered padding={1}>\n <Box flexDirection=\"column\">\n {status.steps.map((step, index) => (\n <Box key={step.stepId}>\n <Box width={3}>{getStepIndicator(step.status)}</Box>\n <Box flexGrow={1}>\n <Text\n color={getStatusColor(step.status)}\n bold={step.status === 'executing'}\n dimColor={step.status === 'pending'}\n >\n {formatStepType(step.stepType)}\n {step.status === 'executing' && progress > 0 && ` (${progress}%)`}\n </Text>\n </Box>\n {step.txHash && (\n <Box marginLeft={2}>\n <Text color={theme.muted} dimColor>\n {truncateHash(step.txHash)}\n </Text>\n </Box>\n )}\n </Box>\n ))}\n {status.steps.length === 0 && (\n <Text color={theme.muted}>No steps found</Text>\n )}\n </Box>\n </StyledBox>\n </Box>\n\n {/* Timing Section */}\n <Box marginTop={1}>\n <StyledBox bordered padding={1}>\n <KeyValue\n items={[\n { key: 'Elapsed', value: formatDuration(elapsedTime) },\n {\n key: 'Remaining',\n value: estimatedRemaining !== null ? `~${formatDuration(estimatedRemaining)}` : 'Calculating...'\n },\n ]}\n keyColor={theme.muted}\n valueColor={theme.secondary}\n />\n </StyledBox>\n </Box>\n\n {/* Error Section (if failed) */}\n {status.status === 'failed' && (\n <Box marginTop={1}>\n <StyledBox bordered borderColor={theme.error} padding={1}>\n <Box flexDirection=\"column\">\n <Text color={theme.error} bold>\n {symbols.failed} Transaction Failed\n </Text>\n {status.steps.find(s => s.status === 'failed')?.error && (\n <Box marginTop={1}>\n <Text color={theme.muted}>\n {status.steps.find(s => s.status === 'failed')?.error}\n </Text>\n </Box>\n )}\n </Box>\n </StyledBox>\n </Box>\n )}\n\n {/* Success Section */}\n {status.status === 'completed' && (\n <Box marginTop={1}>\n <StyledBox bordered borderColor={theme.success} padding={1}>\n <Box flexDirection=\"column\">\n <Text color={theme.success} bold>\n {symbols.completed} Bridge Completed Successfully\n </Text>\n {status.bridgeTxHash && (\n <Box marginTop={1}>\n <KeyValue\n items={[\n { key: 'Bridge TX', value: truncateHash(status.bridgeTxHash) },\n ...(status.depositTxHash ? [{ key: 'Deposit TX', value: truncateHash(status.depositTxHash) }] : []),\n ]}\n keyColor={theme.muted}\n valueColor={theme.success}\n />\n </Box>\n )}\n </Box>\n </StyledBox>\n </Box>\n )}\n </Box>\n )\n}\n\n/**\n * Loading state component\n */\nfunction LoadingState({ txHash }: { txHash: string }) {\n return (\n <Box flexDirection=\"column\">\n <StyledBox bordered title=\"Bridge Status\" padding={1}>\n <Box>\n <Spinner text={`Looking up ${truncateHash(txHash)}...`} />\n </Box>\n </StyledBox>\n </Box>\n )\n}\n\n/**\n * Not found state component\n */\nfunction NotFoundState({ txHash }: { txHash: string }) {\n return (\n <Box flexDirection=\"column\">\n <StyledBox bordered borderColor={theme.warning} title=\"Bridge Status\" padding={1}>\n <Box flexDirection=\"column\">\n <Text color={theme.warning}>\n {symbols.pending} Transaction not found\n </Text>\n <Box marginTop={1}>\n <Text color={theme.muted}>\n TX: {truncateHash(txHash)}\n </Text>\n </Box>\n <Box marginTop={1}>\n <Text color={theme.muted} dimColor>\n The transaction may not have been initiated via this CLI,\n or it may have expired from the local cache.\n </Text>\n </Box>\n </Box>\n </StyledBox>\n </Box>\n )\n}\n\n/**\n * Error state component\n */\nfunction ErrorState({ error }: { error: string }) {\n return (\n <Box flexDirection=\"column\">\n <StyledBox bordered borderColor={theme.error} title=\"Error\" padding={1}>\n <Text color={theme.error}>\n {symbols.failed} {error}\n </Text>\n </StyledBox>\n </Box>\n )\n}\n\n/**\n * Main Status component\n */\nexport function Status({ txHash, watch = false }: StatusCommandProps) {\n const { exit } = useApp()\n const [status, setStatus] = useState<TransactionStatus | null>(null)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n const [notFound, setNotFound] = useState(false)\n const [startTime] = useState(Date.now())\n const [elapsedTime, setElapsedTime] = useState(0)\n\n // Create Mina client (memoized to avoid recreation on each render)\n const mina = useMemo(() => new Mina({ integrator: 'mina-cli' }), [])\n\n // Fetch status\n const fetchStatus = useCallback(async () => {\n try {\n const result = await mina.getStatus(txHash)\n if (result === null) {\n setNotFound(true)\n setLoading(false)\n // Exit if not watching and not found\n if (!watch) {\n setTimeout(() => exit(), 100)\n }\n return\n }\n setStatus(result)\n setNotFound(false)\n setLoading(false)\n\n // Exit if completed/failed and not watching\n if (!watch && (result.status === 'completed' || result.status === 'failed')) {\n setTimeout(() => exit(), 100)\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to fetch status')\n setLoading(false)\n if (!watch) {\n setTimeout(() => exit(), 100)\n }\n }\n }, [txHash, watch, exit, mina])\n\n // Initial fetch\n useEffect(() => {\n fetchStatus()\n }, [fetchStatus])\n\n // Watch mode polling\n useEffect(() => {\n if (!watch) return\n\n const interval = setInterval(() => {\n fetchStatus()\n }, 5000) // Poll every 5 seconds\n\n return () => clearInterval(interval)\n }, [watch, fetchStatus])\n\n // Update elapsed time\n useEffect(() => {\n const interval = setInterval(() => {\n setElapsedTime(Date.now() - (status?.createdAt || startTime))\n }, 1000)\n\n return () => clearInterval(interval)\n }, [status?.createdAt, startTime])\n\n // Calculate estimated remaining time\n const estimatedRemaining = status\n ? (() => {\n // Estimate based on progress\n const progress = calculateProgress(status.steps)\n if (progress === 0) return null\n if (progress >= 100) return 0\n // Simple linear estimation\n const elapsed = elapsedTime\n const totalEstimated = (elapsed / progress) * 100\n return Math.max(0, totalEstimated - elapsed)\n })()\n : null\n\n // Render\n return (\n <Box flexDirection=\"column\" padding={1}>\n {/* Header */}\n <Header showTagline={false} />\n\n {/* Watch mode indicator */}\n {watch && (\n <Box marginBottom={1}>\n <Text color={theme.primary}>\n <Spinner /> Watching for updates (polling every 5s)\n </Text>\n </Box>\n )}\n\n {/* Content */}\n <Box marginTop={1}>\n {loading && <LoadingState txHash={txHash} />}\n {error && <ErrorState error={error} />}\n {notFound && !loading && <NotFoundState txHash={txHash} />}\n {status && !loading && !error && (\n <StatusDisplay\n status={status}\n txHash={txHash}\n elapsedTime={elapsedTime}\n estimatedRemaining={estimatedRemaining}\n />\n )}\n </Box>\n\n {/* Navigation hints */}\n <Box marginTop={1}>\n <Text color={theme.muted} dimColor>\n {watch ? 'Ctrl+C to stop watching' : 'Press any key to exit'}\n </Text>\n </Box>\n </Box>\n )\n}\n\n/**\n * Status command handler for commander\n */\nexport async function statusCommand(\n txHash: string,\n options: { watch?: boolean }\n): Promise<void> {\n const { render } = await import('ink')\n const React = await import('react')\n\n render(React.createElement(Status, { txHash, watch: options.watch }))\n}\n\nexport default Status\n","import React, { useState, useEffect, useCallback } from 'react'\nimport { Box, Text, useApp, useInput } from 'ink'\nimport {\n Mina,\n getChains,\n getBridgeableTokens,\n getQuote,\n type Chain,\n type Token,\n type Quote,\n type ExecutionResult,\n type StepStatusPayload,\n type TransactionStatusPayload,\n HYPEREVM_CHAIN_ID,\n HYPEREVM_USDC_ADDRESS,\n normalizeError,\n isRecoverableError,\n RECOVERY_ACTIONS,\n} from '@siphoyawe/mina-sdk'\nimport {\n Header,\n theme,\n symbols,\n Spinner,\n ProgressSteps,\n KeyValue,\n Box as StyledBox,\n Divider,\n type Step as ProgressStep,\n} from '../ui/index.js'\nimport { loadPrivateKey, createSigner, getAddressFromPrivateKey } from '../lib/wallet.js'\n\n/**\n * Bridge command options from CLI\n */\nexport interface BridgeCommandOptions {\n from: string\n token: string\n amount: string\n key?: string\n yes?: boolean\n autoDeposit?: boolean\n}\n\n/**\n * Bridge execution state\n */\ntype BridgeState =\n | 'loading'\n | 'loaded'\n | 'confirming'\n | 'executing'\n | 'completed'\n | 'failed'\n\n/**\n * Step status for progress display\n */\ninterface BridgeStepState {\n loading: 'pending' | 'active' | 'completed' | 'failed'\n quote: 'pending' | 'active' | 'completed' | 'failed'\n approval: 'pending' | 'active' | 'completed' | 'failed'\n bridge: 'pending' | 'active' | 'completed' | 'failed'\n confirm: 'pending' | 'active' | 'completed' | 'failed'\n}\n\n/**\n * Props for the Bridge component\n */\ninterface BridgeProps {\n options: BridgeCommandOptions\n}\n\n/**\n * Error display component with recovery suggestions\n */\nfunction ErrorDisplay({\n error,\n recoveryAction,\n}: {\n error: Error\n recoveryAction?: string\n}) {\n const normalizedError = normalizeError(error)\n const isRecoverable = isRecoverableError(normalizedError)\n\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <Box>\n <Text color={theme.error} bold>\n {symbols.failed} Error: {normalizedError.message}\n </Text>\n </Box>\n\n {recoveryAction && (\n <Box marginTop={1}>\n <Text color={theme.warning}>\n {symbols.arrow} Recovery suggestion: {recoveryAction}\n </Text>\n </Box>\n )}\n\n {isRecoverable && (\n <Box marginTop={1}>\n <Text color={theme.muted} dimColor>\n This error may be temporary. Try again in a few moments.\n </Text>\n </Box>\n )}\n </Box>\n )\n}\n\n/**\n * Quote display component\n */\nfunction QuoteDisplay({\n quote,\n chain,\n token,\n amount,\n}: {\n quote: Quote\n chain: Chain\n token: Token\n amount: string\n}) {\n const estimatedMinutes = Math.ceil(quote.estimatedTime / 60)\n const outputFormatted = (Number(quote.toAmount) / Math.pow(10, quote.toToken.decimals)).toFixed(2)\n\n return (\n <StyledBox bordered title=\"Bridge Quote\" padding={1}>\n <KeyValue\n items={[\n { key: 'From Chain', value: chain.name },\n { key: 'Token', value: `${amount} ${token.symbol}` },\n { key: 'To Chain', value: 'HyperEVM' },\n { key: 'You Receive', value: `~${outputFormatted} ${quote.toToken.symbol}` },\n ]}\n />\n\n <Box marginTop={1} marginBottom={1}>\n <Divider width={40} />\n </Box>\n\n <KeyValue\n items={[\n { key: 'Gas Fee', value: `$${quote.fees.gasUsd.toFixed(2)}` },\n { key: 'Bridge Fee', value: `$${quote.fees.bridgeFeeUsd.toFixed(2)}` },\n { key: 'Total Fees', value: `$${quote.fees.totalUsd.toFixed(2)}` },\n { key: 'Est. Time', value: `~${estimatedMinutes} min` },\n ]}\n keyColor={theme.muted}\n valueColor={theme.warning}\n />\n\n {quote.highImpact && (\n <Box marginTop={1}>\n <Text color={theme.warning}>\n {symbols.pending} Warning: High price impact ({(quote.priceImpact * 100).toFixed(2)}%)\n </Text>\n </Box>\n )}\n\n {quote.includesAutoDeposit && (\n <Box marginTop={1}>\n <Text color={theme.success} dimColor>\n {symbols.check} Auto-deposit to Hyperliquid L1 included\n </Text>\n </Box>\n )}\n </StyledBox>\n )\n}\n\n/**\n * Bridge progress component\n */\nfunction BridgeProgressDisplay({\n stepState,\n error,\n currentStepDescription,\n}: {\n stepState: BridgeStepState\n error?: string\n currentStepDescription?: string\n}) {\n const steps: ProgressStep[] = [\n {\n label: 'Loading wallet & chain data',\n status: stepState.loading,\n },\n {\n label: 'Fetching bridge quote',\n status: stepState.quote,\n },\n {\n label: 'Approving token spend',\n status: stepState.approval,\n description: stepState.approval === 'active' ? 'Waiting for approval transaction...' : undefined,\n },\n {\n label: 'Executing bridge transaction',\n status: stepState.bridge,\n description: stepState.bridge === 'active' ? 'Waiting for bridge transaction...' : undefined,\n },\n {\n label: 'Confirming on destination',\n status: stepState.confirm,\n description: stepState.confirm === 'active' ? currentStepDescription : error,\n },\n ]\n\n // Mark failed step\n if (error) {\n const activeIndex = steps.findIndex(s => s.status === 'active' || s.status === 'failed')\n if (activeIndex >= 0) {\n const step = steps[activeIndex]\n if (step) {\n step.status = 'failed'\n step.description = error\n }\n }\n }\n\n return <ProgressSteps steps={steps} title=\"Bridge Progress\" showNumbers />\n}\n\n/**\n * Success display component\n */\nfunction SuccessDisplay({\n result,\n chain,\n token,\n amount,\n}: {\n result: ExecutionResult\n chain: Chain\n token: Token\n amount: string\n}) {\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <Box>\n <Text color={theme.success} bold>\n {symbols.check} Bridge completed successfully!\n </Text>\n </Box>\n\n <Box marginTop={1}>\n <StyledBox bordered padding={1}>\n <KeyValue\n items={[\n { key: 'Status', value: 'Success' },\n { key: 'From', value: `${amount} ${token.symbol} on ${chain.name}` },\n { key: 'To', value: 'USDC on HyperEVM' },\n ...(result.txHash ? [{ key: 'Bridge TX', value: result.txHash.slice(0, 20) + '...' }] : []),\n ...(result.depositTxHash ? [{ key: 'Deposit TX', value: result.depositTxHash.slice(0, 20) + '...' }] : []),\n ]}\n valueColor={theme.success}\n />\n </StyledBox>\n </Box>\n\n <Box marginTop={1}>\n <Text color={theme.muted} dimColor>\n Your funds are now available on HyperEVM. Check your Hyperliquid balance.\n </Text>\n </Box>\n </Box>\n )\n}\n\n/**\n * Main Bridge Command Component\n */\nexport function Bridge({ options }: BridgeProps) {\n const { exit } = useApp()\n\n // State\n const [state, setState] = useState<BridgeState>('loading')\n const [chain, setChain] = useState<Chain | null>(null)\n const [token, setToken] = useState<Token | null>(null)\n const [quote, setQuote] = useState<Quote | null>(null)\n const [walletAddress, setWalletAddress] = useState<string | null>(null)\n const [privateKey, setPrivateKey] = useState<string | null>(null)\n const [error, setError] = useState<Error | null>(null)\n const [recoveryAction, setRecoveryAction] = useState<string | null>(null)\n const [result, setResult] = useState<ExecutionResult | null>(null)\n const [currentStepDescription, setCurrentStepDescription] = useState<string>('')\n\n // Step state for progress display\n const [stepState, setStepState] = useState<BridgeStepState>({\n loading: 'active',\n quote: 'pending',\n approval: 'pending',\n bridge: 'pending',\n confirm: 'pending',\n })\n\n // Handle confirmation input\n useInput((input, key) => {\n if (state === 'confirming') {\n if (key.return || input === 'y' || input === 'Y') {\n executeBridge()\n } else if (input === 'n' || input === 'N' || input === 'q') {\n exit()\n }\n }\n\n if (state === 'completed' || state === 'failed') {\n if (key.return || input === 'q') {\n exit()\n }\n }\n })\n\n // Load initial data\n useEffect(() => {\n loadInitialData()\n }, [])\n\n const loadInitialData = async () => {\n try {\n setStepState(prev => ({ ...prev, loading: 'active' }))\n\n // Load private key\n const key = await loadPrivateKey(options.key)\n setPrivateKey(key)\n\n // Get wallet address from key\n const address = await getAddressFromPrivateKey(key)\n setWalletAddress(address)\n\n // Load chains\n const chainsResponse = await getChains()\n const foundChain = chainsResponse.chains.find(\n c => c.key.toLowerCase() === options.from.toLowerCase() ||\n c.name.toLowerCase() === options.from.toLowerCase() ||\n c.id.toString() === options.from\n )\n\n if (!foundChain) {\n throw new Error(`Chain not found: ${options.from}. Available chains: ${chainsResponse.chains.map(c => c.key).join(', ')}`)\n }\n\n setChain(foundChain)\n\n // Load tokens for the chain\n const tokensResponse = await getBridgeableTokens(foundChain.id)\n const foundToken = tokensResponse.tokens.find(\n t => t.symbol.toLowerCase() === options.token.toLowerCase() ||\n t.address.toLowerCase() === options.token.toLowerCase()\n )\n\n if (!foundToken) {\n throw new Error(`Token not found: ${options.token}. Available tokens: ${tokensResponse.tokens.map(t => t.symbol).join(', ')}`)\n }\n\n setToken(foundToken)\n\n setStepState(prev => ({ ...prev, loading: 'completed', quote: 'active' }))\n\n // Fetch quote\n const amountInSmallestUnit = (parseFloat(options.amount) * Math.pow(10, foundToken.decimals)).toString()\n\n const quoteResult = await getQuote({\n fromChainId: foundChain.id,\n toChainId: HYPEREVM_CHAIN_ID,\n fromToken: foundToken.address,\n toToken: HYPEREVM_USDC_ADDRESS,\n fromAmount: amountInSmallestUnit,\n fromAddress: address,\n })\n\n setQuote(quoteResult)\n setStepState(prev => ({ ...prev, quote: 'completed' }))\n setState('loaded')\n\n // Auto-confirm if --yes flag\n if (options.yes) {\n setState('confirming')\n // Small delay for visual feedback\n setTimeout(() => executeBridge(), 500)\n } else {\n setState('confirming')\n }\n } catch (err) {\n const normalizedError = normalizeError(err instanceof Error ? err : new Error(String(err)))\n setError(normalizedError)\n\n // Get recovery action if available\n const action = RECOVERY_ACTIONS[normalizedError.code as keyof typeof RECOVERY_ACTIONS]\n if (action) {\n setRecoveryAction(action)\n }\n\n setStepState(prev => ({\n ...prev,\n loading: prev.loading === 'active' ? 'failed' : prev.loading,\n quote: prev.quote === 'active' ? 'failed' : prev.quote,\n }))\n setState('failed')\n }\n }\n\n const executeBridge = useCallback(async () => {\n if (!quote || !chain || !token || !privateKey || !walletAddress) return\n\n try {\n setState('executing')\n setStepState(prev => ({ ...prev, approval: 'active' }))\n\n // Create signer\n const signer = await createSigner(privateKey, chain.id)\n\n // Execute the bridge\n const mina = new Mina({\n integrator: 'mina-cli',\n autoDeposit: options.autoDeposit !== false,\n })\n\n const executeResult = await mina.execute({\n quote,\n signer,\n onStepChange: (stepStatus: StepStatusPayload) => {\n setCurrentStepDescription(`${stepStatus.step}: ${stepStatus.status}`)\n\n // Update step state based on step type\n if (stepStatus.step === 'approval') {\n if (stepStatus.status === 'completed') {\n setStepState(prev => ({ ...prev, approval: 'completed', bridge: 'active' }))\n } else if (stepStatus.status === 'failed') {\n setStepState(prev => ({ ...prev, approval: 'failed' }))\n }\n } else if (stepStatus.step === 'bridge' || stepStatus.step === 'swap') {\n if (stepStatus.status === 'completed') {\n setStepState(prev => ({ ...prev, bridge: 'completed', confirm: 'active' }))\n } else if (stepStatus.status === 'failed') {\n setStepState(prev => ({ ...prev, bridge: 'failed' }))\n }\n } else if (stepStatus.step === 'deposit') {\n if (stepStatus.status === 'completed') {\n setStepState(prev => ({ ...prev, confirm: 'completed' }))\n } else if (stepStatus.status === 'failed') {\n setStepState(prev => ({ ...prev, confirm: 'failed' }))\n }\n }\n },\n onStatusChange: (status: TransactionStatusPayload) => {\n setCurrentStepDescription(status.substatus || `Step ${status.currentStep}/${status.totalSteps}`)\n },\n })\n\n setResult(executeResult)\n\n if (executeResult.status === 'completed') {\n setStepState(prev => ({\n ...prev,\n approval: 'completed',\n bridge: 'completed',\n confirm: 'completed',\n }))\n setState('completed')\n } else if (executeResult.status === 'failed') {\n setError(executeResult.error || new Error('Bridge execution failed'))\n setState('failed')\n }\n } catch (err) {\n const normalizedError = normalizeError(err instanceof Error ? err : new Error(String(err)))\n setError(normalizedError)\n\n const action = RECOVERY_ACTIONS[normalizedError.code as keyof typeof RECOVERY_ACTIONS]\n if (action) {\n setRecoveryAction(action)\n }\n\n setState('failed')\n }\n }, [quote, chain, token, privateKey, walletAddress, options.autoDeposit])\n\n // Render based on state\n return (\n <Box flexDirection=\"column\" padding={1}>\n {/* Compact header */}\n <Header compact showTagline={false} />\n\n {/* Title */}\n <Box marginBottom={1}>\n <Text color={theme.primary} bold>\n Bridge {options.amount} {options.token} from {options.from}\n </Text>\n </Box>\n\n {/* Wallet info */}\n {walletAddress && (\n <Box marginBottom={1}>\n <Text color={theme.muted} dimColor>\n Wallet: {walletAddress.slice(0, 8)}...{walletAddress.slice(-6)}\n </Text>\n </Box>\n )}\n\n {/* Loading state */}\n {state === 'loading' && (\n <Box flexDirection=\"column\">\n <BridgeProgressDisplay stepState={stepState} />\n </Box>\n )}\n\n {/* Confirmation state */}\n {state === 'confirming' && quote && chain && token && (\n <Box flexDirection=\"column\">\n <QuoteDisplay\n quote={quote}\n chain={chain}\n token={token}\n amount={options.amount}\n />\n\n {!options.yes && (\n <Box marginTop={1}>\n <Text color={theme.warning} bold>\n {symbols.arrow} Proceed with bridge? (y/n)\n </Text>\n </Box>\n )}\n\n {options.yes && (\n <Box marginTop={1}>\n <Spinner text=\"Auto-confirming...\" />\n </Box>\n )}\n </Box>\n )}\n\n {/* Executing state */}\n {state === 'executing' && (\n <Box flexDirection=\"column\">\n <BridgeProgressDisplay\n stepState={stepState}\n currentStepDescription={currentStepDescription}\n />\n </Box>\n )}\n\n {/* Completed state */}\n {state === 'completed' && result && chain && token && (\n <Box flexDirection=\"column\">\n <BridgeProgressDisplay stepState={stepState} />\n <SuccessDisplay\n result={result}\n chain={chain}\n token={token}\n amount={options.amount}\n />\n <Box marginTop={1}>\n <Text color={theme.muted} dimColor>\n Press Enter or q to exit\n </Text>\n </Box>\n </Box>\n )}\n\n {/* Failed state */}\n {state === 'failed' && error && (\n <Box flexDirection=\"column\">\n <BridgeProgressDisplay stepState={stepState} error={error.message} />\n <ErrorDisplay error={error} recoveryAction={recoveryAction || undefined} />\n <Box marginTop={1}>\n <Text color={theme.muted} dimColor>\n Press Enter or q to exit\n </Text>\n </Box>\n </Box>\n )}\n </Box>\n )\n}\n\n/**\n * Bridge command action handler\n * Called by Commander when `mina bridge` is invoked\n */\nexport async function bridgeCommand(options: BridgeCommandOptions): Promise<void> {\n const { render } = await import('ink')\n const React = await import('react')\n\n render(React.createElement(Bridge, { options }))\n}\n\nexport default Bridge\n","import React, { useState, useEffect } from 'react'\nimport { Box, Text, useApp } from 'ink'\nimport {\n Header,\n Table,\n theme,\n symbols,\n type Column,\n} from '../ui/index.js'\nimport { getHistory, type HistoryEntry } from '../lib/history.js'\n\n/**\n * Props for the History command component\n */\ninterface HistoryCommandProps {\n /** Maximum number of entries to show */\n limit: number\n /** Optional wallet address to filter by */\n address?: string\n /** Output as JSON */\n json?: boolean\n}\n\n/**\n * Format timestamp to human readable date/time\n */\nfunction formatDate(timestamp: number): string {\n return new Date(timestamp).toLocaleString('en-US', {\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n hour12: false,\n })\n}\n\n/**\n * Truncate transaction hash for display\n */\nfunction truncateHash(hash: string): string {\n if (hash.length <= 16) return hash\n return `${hash.slice(0, 8)}...${hash.slice(-6)}`\n}\n\n/**\n * Get status icon and color based on status\n */\nfunction getStatusDisplay(status: HistoryEntry['status']): {\n icon: string\n color: string\n label: string\n} {\n switch (status) {\n case 'completed':\n return { icon: symbols.completed, color: theme.success, label: 'Complete' }\n case 'pending':\n return { icon: symbols.pending, color: theme.warning, label: 'Pending' }\n case 'failed':\n return { icon: symbols.failed, color: theme.error, label: 'Failed' }\n default:\n return { icon: symbols.pending, color: theme.muted, label: 'Unknown' }\n }\n}\n\n/**\n * History row type for table display\n */\ninterface HistoryRow {\n [key: string]: unknown\n date: string\n route: string\n amount: string\n status: string\n txHash: string\n statusColor: string\n}\n\n/**\n * Transform history entries to table rows\n */\nfunction transformToRows(entries: HistoryEntry[]): HistoryRow[] {\n return entries.map((entry) => {\n const { icon, color, label } = getStatusDisplay(entry.status)\n return {\n date: formatDate(entry.timestamp),\n route: `${entry.fromChain} ${symbols.arrow} ${entry.toChain}`,\n amount: `${entry.amount} ${entry.token}`,\n status: `${icon} ${label}`,\n txHash: entry.txHash,\n statusColor: color,\n }\n })\n}\n\n/**\n * Empty state component when no history is found\n */\nfunction EmptyState({ address }: { address?: string }) {\n return (\n <Box flexDirection=\"column\">\n <Box\n borderStyle=\"round\"\n borderColor={theme.border}\n paddingX={2}\n paddingY={1}\n >\n <Box flexDirection=\"column\">\n <Text color={theme.muted}>\n {symbols.pending} No bridge history found\n </Text>\n <Box marginTop={1}>\n <Text color={theme.muted} dimColor>\n {address\n ? `No transactions found for address ${truncateHash(address)}`\n : 'Start by running a bridge transaction with: mina bridge --from <chain> --token USDC --amount 100'}\n </Text>\n </Box>\n </Box>\n </Box>\n </Box>\n )\n}\n\n/**\n * History display component\n */\nexport function HistoryCommand({\n limit,\n address,\n json = false,\n}: HistoryCommandProps) {\n const { exit } = useApp()\n const [entries, setEntries] = useState<HistoryEntry[]>([])\n const [loading, setLoading] = useState(true)\n\n useEffect(() => {\n // Load history\n const history = getHistory(limit, address)\n setEntries(history)\n setLoading(false)\n }, [limit, address])\n\n // Exit after rendering in JSON mode\n useEffect(() => {\n if (!loading && json) {\n setTimeout(() => exit(), 100)\n }\n }, [loading, json, exit])\n\n // JSON output mode\n if (json) {\n if (loading) return null\n console.log(JSON.stringify(entries, null, 2))\n return null\n }\n\n if (loading) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Header compact showTagline={false} />\n <Text color={theme.muted}>Loading history...</Text>\n </Box>\n )\n }\n\n const rows = transformToRows(entries)\n\n // Define table columns\n const columns: Column<HistoryRow>[] = [\n {\n header: 'Date',\n accessor: 'date',\n headerColor: theme.primary,\n cellColor: theme.secondary,\n },\n {\n header: 'Route',\n accessor: 'route',\n headerColor: theme.primary,\n cellColor: theme.info,\n },\n {\n header: 'Amount',\n accessor: 'amount',\n align: 'right',\n headerColor: theme.primary,\n cellColor: theme.secondary,\n },\n {\n header: 'Status',\n accessor: 'status',\n headerColor: theme.primary,\n cellColor: (_, row) => row.statusColor,\n },\n ]\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Header compact showTagline={false} />\n\n <Box marginBottom={1}>\n <Text color={theme.secondary}>\n {symbols.arrow} Bridge History\n {address && (\n <Text color={theme.muted}> ({truncateHash(address)})</Text>\n )}\n {entries.length > 0 && (\n <Text color={theme.muted}> - {entries.length} transaction{entries.length !== 1 ? 's' : ''}</Text>\n )}\n </Text>\n </Box>\n\n {entries.length === 0 ? (\n <EmptyState address={address} />\n ) : (\n <>\n <Table\n data={rows}\n columns={columns}\n bordered\n borderColor={theme.border}\n />\n\n <Box marginTop={1} flexDirection=\"column\">\n <Text color={theme.muted} dimColor>\n Use {'\"'}mina status {'<'}hash{'>\"'} for full transaction details\n </Text>\n {entries.length >= limit && (\n <Text color={theme.muted} dimColor>\n Showing last {limit} entries. Use --limit to see more.\n </Text>\n )}\n </Box>\n </>\n )}\n </Box>\n )\n}\n\n/**\n * History command handler for commander\n */\nexport async function historyCommand(options: {\n limit?: string\n address?: string\n json?: boolean\n}): Promise<void> {\n const { render } = await import('ink')\n const React = await import('react')\n\n const limit = options.limit ? parseInt(options.limit, 10) : 10\n\n render(\n React.createElement(HistoryCommand, {\n limit: isNaN(limit) ? 10 : limit,\n address: options.address,\n json: options.json || false,\n })\n )\n}\n\nexport default HistoryCommand\n","/**\n * History storage utilities for Mina Bridge CLI\n * Stores bridge transaction history locally for quick access\n */\n\nimport os from 'os'\nimport fs from 'fs'\nimport path from 'path'\n\n/**\n * Path to the history file\n */\nconst HISTORY_PATH = path.join(os.homedir(), '.mina', 'history.json')\n\n/**\n * Maximum number of history entries to keep\n */\nconst MAX_HISTORY_ENTRIES = 100\n\n/**\n * History entry type representing a bridge transaction\n */\nexport interface HistoryEntry {\n /** Transaction hash */\n txHash: string\n /** Source chain name */\n fromChain: string\n /** Destination chain name */\n toChain: string\n /** Amount bridged */\n amount: string\n /** Token symbol */\n token: string\n /** Transaction status */\n status: 'pending' | 'completed' | 'failed'\n /** Timestamp when the transaction was initiated */\n timestamp: number\n /** Wallet address that initiated the transaction */\n walletAddress?: string\n /** Bridge transaction hash (if available) */\n bridgeTxHash?: string\n /** Deposit transaction hash (if available) */\n depositTxHash?: string\n}\n\n/**\n * History data structure stored in the file\n */\ninterface HistoryData {\n entries: HistoryEntry[]\n version: number\n}\n\n/**\n * Ensures the .mina directory exists\n */\nfunction ensureDir(): void {\n const dir = path.dirname(HISTORY_PATH)\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true })\n }\n}\n\n/**\n * Gets the history file path\n */\nexport function getHistoryPath(): string {\n return HISTORY_PATH\n}\n\n/**\n * Gets bridge history entries\n * @param limit - Maximum number of entries to return (default: 10)\n * @param address - Optional wallet address to filter by\n * @returns Array of history entries, most recent first\n */\nexport function getHistory(limit = 10, address?: string): HistoryEntry[] {\n ensureDir()\n\n if (!fs.existsSync(HISTORY_PATH)) {\n return []\n }\n\n try {\n const data: HistoryData = JSON.parse(fs.readFileSync(HISTORY_PATH, 'utf-8'))\n let entries = data.entries || []\n\n // Filter by address if provided\n if (address) {\n entries = entries.filter(\n (e) => e.walletAddress?.toLowerCase() === address.toLowerCase()\n )\n }\n\n // Return most recent entries first\n return entries.slice(-limit).reverse()\n } catch {\n // If file is corrupted, return empty array\n return []\n }\n}\n\n/**\n * Adds a history entry\n * @param entry - History entry to add\n */\nexport function addHistory(entry: HistoryEntry): void {\n ensureDir()\n\n let data: HistoryData\n\n if (fs.existsSync(HISTORY_PATH)) {\n try {\n data = JSON.parse(fs.readFileSync(HISTORY_PATH, 'utf-8'))\n if (!data.entries) {\n data = { entries: [], version: 1 }\n }\n } catch {\n data = { entries: [], version: 1 }\n }\n } else {\n data = { entries: [], version: 1 }\n }\n\n // Add new entry\n data.entries.push(entry)\n\n // Trim to max entries if needed\n if (data.entries.length > MAX_HISTORY_ENTRIES) {\n data.entries = data.entries.slice(-MAX_HISTORY_ENTRIES)\n }\n\n // Write back to file\n fs.writeFileSync(HISTORY_PATH, JSON.stringify(data, null, 2))\n}\n\n/**\n * Updates a history entry by transaction hash\n * @param txHash - Transaction hash to find\n * @param updates - Partial updates to apply\n */\nexport function updateHistory(\n txHash: string,\n updates: Partial<Pick<HistoryEntry, 'status' | 'bridgeTxHash' | 'depositTxHash'>>\n): void {\n ensureDir()\n\n if (!fs.existsSync(HISTORY_PATH)) {\n return\n }\n\n try {\n const data: HistoryData = JSON.parse(fs.readFileSync(HISTORY_PATH, 'utf-8'))\n\n const index = data.entries.findIndex((e) => e.txHash === txHash)\n if (index !== -1 && data.entries[index]) {\n const entry = data.entries[index]\n data.entries[index] = {\n ...entry,\n ...updates,\n }\n fs.writeFileSync(HISTORY_PATH, JSON.stringify(data, null, 2))\n }\n } catch {\n // Silently fail if file is corrupted\n }\n}\n\n/**\n * Gets a single history entry by transaction hash\n * @param txHash - Transaction hash to find\n * @returns History entry or null if not found\n */\nexport function getHistoryEntry(txHash: string): HistoryEntry | null {\n const entries = getHistory(MAX_HISTORY_ENTRIES)\n return entries.find((e) => e.txHash === txHash) || null\n}\n\n/**\n * Clears all history\n */\nexport function clearHistory(): void {\n ensureDir()\n const data: HistoryData = { entries: [], version: 1 }\n fs.writeFileSync(HISTORY_PATH, JSON.stringify(data, null, 2))\n}\n\n/**\n * Gets history statistics\n */\nexport function getHistoryStats(): {\n total: number\n completed: number\n pending: number\n failed: number\n} {\n const entries = getHistory(MAX_HISTORY_ENTRIES)\n return {\n total: entries.length,\n completed: entries.filter((e) => e.status === 'completed').length,\n pending: entries.filter((e) => e.status === 'pending').length,\n failed: entries.filter((e) => e.status === 'failed').length,\n }\n}\n","import React, { useState, useEffect } from 'react'\nimport { Box, Text, useApp } from 'ink'\nimport {\n Mina,\n getChains,\n type Chain,\n type BalanceWithMetadata,\n} from '@siphoyawe/mina-sdk'\nimport {\n Header,\n Spinner,\n theme,\n symbols,\n borders,\n} from '../ui/index.js'\n\n/**\n * Truncate address for display\n */\nfunction truncateAddress(address: string): string {\n if (address.length <= 14) return address\n return `${address.slice(0, 6)}...${address.slice(-4)}`\n}\n\n/**\n * Format number with thousands separators\n */\nfunction formatNumber(value: number, decimals: number = 2): string {\n if (value === 0) return '0'\n\n // For very small values, show more decimals\n if (value < 0.01 && value > 0) {\n return value.toFixed(6)\n }\n\n return value.toLocaleString('en-US', {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n })\n}\n\n/**\n * Format USD value\n */\nfunction formatUsd(value?: number): string {\n if (value === undefined || value === 0) return '-'\n return `$${formatNumber(value, 2)}`\n}\n\n/**\n * Major chains for multi-chain balance lookup\n */\nconst MAJOR_CHAIN_IDS = [1, 42161, 137, 10, 8453] // ETH, ARB, POLY, OP, BASE\n\n/**\n * Chain display names\n */\nconst CHAIN_NAMES: Record<number, string> = {\n 1: 'Ethereum',\n 42161: 'Arbitrum',\n 137: 'Polygon',\n 10: 'Optimism',\n 8453: 'Base',\n 56: 'BNB Chain',\n 43114: 'Avalanche',\n 250: 'Fantom',\n 100: 'Gnosis',\n 59144: 'Linea',\n 534352: 'Scroll',\n 324: 'zkSync',\n}\n\n/**\n * Resolve chain name or ID to chain ID\n */\nasync function resolveChainId(chainInput: string): Promise<{ chainId: number; chainName: string } | null> {\n // Check if it's a numeric ID\n const numericId = parseInt(chainInput, 10)\n if (!isNaN(numericId)) {\n const response = await getChains()\n const chain = response.chains.find((c: Chain) => c.id === numericId)\n if (chain) {\n return { chainId: chain.id, chainName: chain.name }\n }\n // Still try with the ID even if not found\n return { chainId: numericId, chainName: CHAIN_NAMES[numericId] || chainInput }\n }\n\n // Otherwise treat as chain name/key\n const response = await getChains()\n const chainLower = chainInput.toLowerCase()\n const chain = response.chains.find((c: Chain) =>\n c.name.toLowerCase() === chainLower ||\n c.key?.toLowerCase() === chainLower\n )\n\n if (chain) {\n return { chainId: chain.id, chainName: chain.name }\n }\n\n return null\n}\n\n/**\n * Balance row for a single token\n */\ninterface BalanceRow {\n symbol: string\n balance: string\n balanceFormatted: string\n usdValue?: number\n hasBalance: boolean\n}\n\n/**\n * Chain balances group\n */\ninterface ChainBalances {\n chainId: number\n chainName: string\n balances: BalanceRow[]\n totalUsd: number\n}\n\n/**\n * Balance command props\n */\ninterface BalanceCommandProps {\n address: string\n chain?: string\n showAll?: boolean\n json?: boolean\n}\n\n/**\n * Balance command component - displays wallet balances\n */\nexport function BalanceCommand({\n address,\n chain,\n showAll = false,\n json = false,\n}: BalanceCommandProps) {\n const { exit } = useApp()\n const [chainBalances, setChainBalances] = useState<ChainBalances[]>([])\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n const [totalUsd, setTotalUsd] = useState(0)\n\n useEffect(() => {\n async function loadBalances() {\n try {\n setLoading(true)\n setError(null)\n\n const mina = new Mina({ integrator: 'mina-cli' })\n\n // Determine which chains to fetch\n let chainIds: number[] = []\n let chainNameMap: Record<number, string> = {}\n\n if (chain) {\n // Specific chain requested\n const resolved = await resolveChainId(chain)\n if (!resolved) {\n setError(`Unknown chain: \"${chain}\"`)\n setLoading(false)\n return\n }\n chainIds = [resolved.chainId]\n chainNameMap[resolved.chainId] = resolved.chainName\n } else {\n // Multi-chain - use major chains\n chainIds = MAJOR_CHAIN_IDS\n chainIds.forEach(id => {\n chainNameMap[id] = CHAIN_NAMES[id] || `Chain ${id}`\n })\n }\n\n // Fetch balances for all chains in parallel\n const results = await Promise.all(\n chainIds.map(async (chainId) => {\n try {\n const balances = await mina.getChainBalances(address, chainId)\n return { chainId, balances }\n } catch (err) {\n console.warn(`Failed to fetch balances for chain ${chainId}:`, err)\n return { chainId, balances: [] }\n }\n })\n )\n\n // Process results\n const processedChains: ChainBalances[] = []\n let grandTotal = 0\n\n for (const result of results) {\n const { chainId, balances } = result\n\n // Filter and map balances\n let filteredBalances = balances.filter((b: BalanceWithMetadata) => {\n // If showAll, include all. Otherwise, only include non-zero balances\n return showAll || b.hasBalance\n })\n\n // Calculate chain total\n const chainTotal = balances.reduce((sum: number, b: BalanceWithMetadata) => {\n return sum + (b.balanceUsd || 0)\n }, 0)\n grandTotal += chainTotal\n\n // Map to display format\n const balanceRows: BalanceRow[] = filteredBalances.map((b: BalanceWithMetadata) => ({\n symbol: b.token.symbol,\n balance: b.balance,\n balanceFormatted: b.formatted,\n usdValue: b.balanceUsd,\n hasBalance: b.hasBalance,\n }))\n\n // Sort: non-zero first, then by USD value\n balanceRows.sort((a, b) => {\n if (a.hasBalance !== b.hasBalance) {\n return a.hasBalance ? -1 : 1\n }\n return (b.usdValue || 0) - (a.usdValue || 0)\n })\n\n // Only add chain if it has balances to show\n if (balanceRows.length > 0 || showAll) {\n processedChains.push({\n chainId,\n chainName: chainNameMap[chainId] || `Chain ${chainId}`,\n balances: balanceRows,\n totalUsd: chainTotal,\n })\n }\n }\n\n // Sort chains by total USD value\n processedChains.sort((a, b) => b.totalUsd - a.totalUsd)\n\n setChainBalances(processedChains)\n setTotalUsd(grandTotal)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load balances')\n } finally {\n setLoading(false)\n }\n }\n loadBalances()\n }, [address, chain, showAll])\n\n // Exit after rendering in JSON mode\n useEffect(() => {\n if (!loading && json) {\n setTimeout(() => exit(), 100)\n }\n }, [loading, json, exit])\n\n // JSON output mode\n if (json) {\n if (loading) return null\n if (error) {\n console.error(JSON.stringify({ error }, null, 2))\n return null\n }\n console.log(JSON.stringify({\n address,\n chains: chainBalances.map(cb => ({\n chainId: cb.chainId,\n chainName: cb.chainName,\n balances: cb.balances,\n totalUsd: cb.totalUsd,\n })),\n totalUsd,\n }, null, 2))\n return null\n }\n\n if (loading) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Header compact showTagline={false} />\n <Spinner text={chain ? `Loading balances on ${chain}...` : 'Loading balances across chains...'} />\n </Box>\n )\n }\n\n if (error) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Header compact showTagline={false} />\n <Box>\n <Text color={theme.error}>{symbols.failed} Error: {error}</Text>\n </Box>\n </Box>\n )\n }\n\n // Calculate max width for the box\n const maxSymbolWidth = Math.max(\n 8,\n ...chainBalances.flatMap(cb => cb.balances.map(b => b.symbol.length))\n )\n const maxBalanceWidth = Math.max(\n 12,\n ...chainBalances.flatMap(cb => cb.balances.map(b => b.balanceFormatted.length))\n )\n const boxWidth = Math.max(40, maxSymbolWidth + maxBalanceWidth + 20)\n\n // Check if we have any balances\n const hasAnyBalances = chainBalances.some(cb => cb.balances.length > 0)\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Header compact showTagline={false} />\n\n {/* Box header */}\n <Box>\n <Text color={theme.border}>\n {borders.topLeft}{borders.horizontal.repeat(boxWidth - 2)}{borders.topRight}\n </Text>\n </Box>\n\n {/* Title */}\n <Box>\n <Text color={theme.border}>{borders.vertical}</Text>\n <Box width={boxWidth - 2} justifyContent=\"center\">\n <Text color={theme.primary} bold>\n Balances: {truncateAddress(address)}\n </Text>\n </Box>\n <Text color={theme.border}>{borders.vertical}</Text>\n </Box>\n\n {/* Separator */}\n <Box>\n <Text color={theme.border}>\n {borders.leftT}{borders.horizontal.repeat(boxWidth - 2)}{borders.rightT}\n </Text>\n </Box>\n\n {!hasAnyBalances ? (\n <>\n <Box>\n <Text color={theme.border}>{borders.vertical}</Text>\n <Box width={boxWidth - 2} justifyContent=\"center\">\n <Text color={theme.muted}>No balances found</Text>\n </Box>\n <Text color={theme.border}>{borders.vertical}</Text>\n </Box>\n </>\n ) : (\n chainBalances.map((chainData, chainIndex) => (\n <React.Fragment key={chainData.chainId}>\n {/* Chain name header */}\n <Box>\n <Text color={theme.border}>{borders.vertical}</Text>\n <Text> </Text>\n <Text color={theme.accent} bold>\n {chainData.chainName}\n </Text>\n <Box flexGrow={1} />\n <Text color={theme.border}>{borders.vertical}</Text>\n </Box>\n\n {/* Token balances */}\n {chainData.balances.length === 0 ? (\n <Box>\n <Text color={theme.border}>{borders.vertical}</Text>\n <Text> </Text>\n <Text color={theme.muted} dimColor>No balances</Text>\n <Box flexGrow={1} />\n <Text color={theme.border}>{borders.vertical}</Text>\n </Box>\n ) : (\n chainData.balances.map((balance, i) => (\n <Box key={`${chainData.chainId}-${balance.symbol}-${i}`}>\n <Text color={theme.border}>{borders.vertical}</Text>\n <Text> </Text>\n <Text\n color={balance.hasBalance ? theme.success : theme.muted}\n dimColor={!balance.hasBalance}\n >\n {balance.symbol.padEnd(maxSymbolWidth)}\n </Text>\n <Text> </Text>\n <Text\n color={balance.hasBalance ? theme.secondary : theme.muted}\n dimColor={!balance.hasBalance}\n >\n {balance.balanceFormatted.padStart(maxBalanceWidth)}\n </Text>\n <Text> </Text>\n <Text\n color={balance.hasBalance ? theme.muted : theme.muted}\n dimColor={!balance.hasBalance}\n >\n {formatUsd(balance.usdValue).padStart(12)}\n </Text>\n <Box flexGrow={1} />\n <Text color={theme.border}>{borders.vertical}</Text>\n </Box>\n ))\n )}\n\n {/* Chain separator (if not last) */}\n {chainIndex < chainBalances.length - 1 && (\n <Box>\n <Text color={theme.border}>\n {borders.leftT}{borders.horizontal.repeat(boxWidth - 2)}{borders.rightT}\n </Text>\n </Box>\n )}\n </React.Fragment>\n ))\n )}\n\n {/* Bottom border */}\n <Box>\n <Text color={theme.border}>\n {borders.bottomLeft}{borders.horizontal.repeat(boxWidth - 2)}{borders.bottomRight}\n </Text>\n </Box>\n\n {/* Total */}\n {hasAnyBalances && totalUsd > 0 && (\n <Box marginTop={1}>\n <Text color={theme.secondary}>\n {symbols.arrow} Total:\n </Text>\n <Text color={theme.success} bold>\n {' '}${formatNumber(totalUsd, 2)}\n </Text>\n </Box>\n )}\n\n {/* Tip */}\n <Box marginTop={1}>\n <Text color={theme.muted} dimColor>\n {chain\n ? 'Use --all to show zero balances'\n : 'Use --chain <name> for specific chain, --all for zero balances'}\n </Text>\n </Box>\n </Box>\n )\n}\n\nexport default BalanceCommand\n","import React, { useState, useEffect } from 'react'\nimport { Box, Text, useApp } from 'ink'\nimport {\n Header,\n Table,\n theme,\n symbols,\n Box as StyledBox,\n type Column,\n} from '../ui/index.js'\nimport {\n getConfig,\n getConfigValue,\n setConfig,\n getConfigList,\n parseValue,\n isValidKey,\n getConfigPath,\n} from '../lib/config.js'\n\n/**\n * Config command action types\n */\ntype ConfigAction = 'list' | 'get' | 'set' | 'path'\n\n/**\n * Props for the ConfigCommand component\n */\ninterface ConfigCommandProps {\n action?: ConfigAction\n key?: string\n value?: string\n}\n\n/**\n * Config row type for table display\n */\ninterface ConfigRow {\n setting: string\n value: string\n isDefault: boolean\n}\n\n/**\n * List all configuration values\n */\nfunction ConfigList() {\n const { exit } = useApp()\n const [items, setItems] = useState<ConfigRow[]>([])\n\n useEffect(() => {\n const configItems = getConfigList()\n setItems(\n configItems.map((item) => ({\n setting: item.key,\n value: item.value,\n isDefault: item.isDefault,\n }))\n )\n // Exit after rendering\n setTimeout(() => exit(), 100)\n }, [exit])\n\n const columns: Column<ConfigRow>[] = [\n {\n header: 'Setting',\n accessor: 'setting',\n headerColor: theme.primary,\n cellColor: theme.secondary,\n },\n {\n header: 'Value',\n accessor: 'value',\n headerColor: theme.primary,\n cellColor: (value, row) =>\n row.isDefault ? theme.muted : theme.success,\n },\n ]\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Header compact showTagline={false} />\n\n <Box marginBottom={1}>\n <Text color={theme.secondary}>\n {symbols.arrow} Configuration Settings\n </Text>\n </Box>\n\n <Table data={items} columns={columns} bordered borderColor={theme.border} />\n\n <Box marginTop={1}>\n <Text color={theme.muted} dimColor>\n Values in gray are defaults. Use 'mina config set <key> <value>' to customize.\n </Text>\n </Box>\n </Box>\n )\n}\n\n/**\n * Get a single configuration value\n */\nfunction ConfigGet({ configKey }: { configKey: string }) {\n const { exit } = useApp()\n const [value, setValue] = useState<string | null>(null)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n if (!isValidKey(configKey)) {\n setError(`Unknown config key: ${configKey}`)\n } else {\n const val = getConfigValue(configKey)\n setValue(val === undefined || val === null ? '(not set)' : String(val))\n }\n setTimeout(() => exit(), 100)\n }, [configKey, exit])\n\n if (error) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Header compact showTagline={false} />\n <Box>\n <Text color={theme.error}>{symbols.failed} {error}</Text>\n </Box>\n </Box>\n )\n }\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Header compact showTagline={false} />\n <Box>\n <Text color={theme.secondary}>{configKey}</Text>\n <Text color={theme.muted}> = </Text>\n <Text color={theme.primary}>{value}</Text>\n </Box>\n </Box>\n )\n}\n\n/**\n * Set a configuration value\n */\nfunction ConfigSet({ configKey, configValue }: { configKey: string; configValue: string }) {\n const { exit } = useApp()\n const [success, setSuccess] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [parsedValue, setParsedValue] = useState<string | number | boolean | null>(null)\n\n useEffect(() => {\n if (!isValidKey(configKey)) {\n setError(`Unknown config key: ${configKey}`)\n } else {\n try {\n const parsed = parseValue(configValue)\n setParsedValue(parsed)\n setConfig(configKey, parsed)\n setSuccess(true)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to set value')\n }\n }\n setTimeout(() => exit(), 100)\n }, [configKey, configValue, exit])\n\n if (error) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Header compact showTagline={false} />\n <Box>\n <Text color={theme.error}>{symbols.failed} {error}</Text>\n </Box>\n </Box>\n )\n }\n\n if (success) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Header compact showTagline={false} />\n <Box>\n <Text color={theme.success}>{symbols.completed} </Text>\n <Text color={theme.secondary}>Set </Text>\n <Text color={theme.primary}>{configKey}</Text>\n <Text color={theme.muted}> = </Text>\n <Text color={theme.success}>{String(parsedValue)}</Text>\n </Box>\n </Box>\n )\n }\n\n return null\n}\n\n/**\n * Show config file path\n */\nfunction ConfigPath() {\n const { exit } = useApp()\n\n useEffect(() => {\n setTimeout(() => exit(), 100)\n }, [exit])\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Header compact showTagline={false} />\n <Box>\n <Text color={theme.muted}>Config file: </Text>\n <Text color={theme.secondary}>{getConfigPath()}</Text>\n </Box>\n </Box>\n )\n}\n\n/**\n * Show config help/usage\n */\nfunction ConfigHelp() {\n const { exit } = useApp()\n\n useEffect(() => {\n setTimeout(() => exit(), 100)\n }, [exit])\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Header compact showTagline={false} />\n\n <StyledBox bordered title=\"Config Usage\" padding={1}>\n <Box flexDirection=\"column\">\n <Text color={theme.secondary}>mina config list</Text>\n <Text color={theme.muted}> Show all settings</Text>\n <Text> </Text>\n\n <Text color={theme.secondary}>mina config get <key></Text>\n <Text color={theme.muted}> Show single value</Text>\n <Text> </Text>\n\n <Text color={theme.secondary}>mina config set <key> <value></Text>\n <Text color={theme.muted}> Set a value</Text>\n <Text> </Text>\n\n <Text color={theme.secondary}>mina config path</Text>\n <Text color={theme.muted}> Show config file location</Text>\n </Box>\n </StyledBox>\n\n <Box marginTop={1}>\n <StyledBox bordered title=\"Available Settings\" padding={1}>\n <Box flexDirection=\"column\">\n <Box>\n <Text color={theme.primary} bold>slippage</Text>\n <Text color={theme.muted}> - Default slippage tolerance (e.g., 0.5)</Text>\n </Box>\n <Box>\n <Text color={theme.primary} bold>autoDeposit</Text>\n <Text color={theme.muted}> - Auto-deposit to Hyperliquid (true/false)</Text>\n </Box>\n <Box>\n <Text color={theme.primary} bold>defaultChain</Text>\n <Text color={theme.muted}> - Default source chain (e.g., arbitrum)</Text>\n </Box>\n <Box>\n <Text color={theme.primary} bold>rpc.<chain></Text>\n <Text color={theme.muted}> - Custom RPC URL for a chain</Text>\n </Box>\n </Box>\n </StyledBox>\n </Box>\n\n <Box marginTop={1}>\n <StyledBox bordered title=\"Examples\" padding={1}>\n <Box flexDirection=\"column\">\n <Text color={theme.secondary}>mina config set slippage 0.5</Text>\n <Text color={theme.secondary}>mina config set autoDeposit false</Text>\n <Text color={theme.secondary}>mina config set rpc.arbitrum https://arb1.example.com</Text>\n <Text color={theme.secondary}>mina config get slippage</Text>\n </Box>\n </StyledBox>\n </Box>\n </Box>\n )\n}\n\n/**\n * Main Config command component\n */\nexport function ConfigCommand({ action, key: configKey, value }: ConfigCommandProps) {\n // Determine what to render based on action\n switch (action) {\n case 'list':\n return <ConfigList />\n\n case 'get':\n if (!configKey) {\n return <ConfigHelp />\n }\n return <ConfigGet configKey={configKey} />\n\n case 'set':\n if (!configKey || value === undefined) {\n return <ConfigHelp />\n }\n return <ConfigSet configKey={configKey} configValue={value} />\n\n case 'path':\n return <ConfigPath />\n\n default:\n // No action or unknown action - show help\n return <ConfigHelp />\n }\n}\n\n/**\n * Config command handler for commander\n */\nexport async function configCommand(\n action?: string,\n key?: string,\n value?: string\n): Promise<void> {\n const { render } = await import('ink')\n const React = await import('react')\n\n render(\n React.createElement(ConfigCommand, {\n action: action as ConfigAction,\n key: key,\n value: value,\n })\n )\n}\n\nexport default ConfigCommand\n","/**\n * Mina Bridge CLI Configuration Management\n *\n * Stores user preferences in ~/.mina/config.json\n */\nimport os from 'os'\nimport fs from 'fs'\nimport path from 'path'\n\nconst CONFIG_PATH = path.join(os.homedir(), '.mina', 'config.json')\n\n/**\n * CLI Configuration interface\n */\nexport interface CliConfig {\n /** Default slippage tolerance (percentage) */\n slippage: number\n /** Auto-deposit to Hyperliquid L1 after bridge */\n autoDeposit: boolean\n /** Default source chain for bridging */\n defaultChain: string\n /** Custom RPC URLs per chain (null = use default) */\n rpc: Record<string, string | null>\n}\n\n/**\n * Default configuration values\n */\nconst DEFAULT_CONFIG: CliConfig = {\n slippage: 0.5,\n autoDeposit: true,\n defaultChain: 'arbitrum',\n rpc: {},\n}\n\n/**\n * List of valid top-level config keys\n */\nexport const VALID_KEYS = ['slippage', 'autoDeposit', 'defaultChain', 'rpc'] as const\nexport type ValidKey = (typeof VALID_KEYS)[number]\n\n/**\n * Ensure the config directory exists\n */\nfunction ensureDir(): void {\n const dir = path.dirname(CONFIG_PATH)\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true })\n }\n}\n\n/**\n * Get the full configuration, merging saved values with defaults\n */\nexport function getConfig(): CliConfig {\n ensureDir()\n if (!fs.existsSync(CONFIG_PATH)) {\n return { ...DEFAULT_CONFIG }\n }\n\n try {\n const data = JSON.parse(fs.readFileSync(CONFIG_PATH, 'utf-8'))\n return {\n ...DEFAULT_CONFIG,\n ...data,\n // Ensure rpc is always an object\n rpc: { ...DEFAULT_CONFIG.rpc, ...(data.rpc || {}) },\n }\n } catch {\n // If parsing fails, return defaults\n return { ...DEFAULT_CONFIG }\n }\n}\n\n/**\n * Parse a string value to the appropriate type\n */\nexport function parseValue(value: string): string | number | boolean {\n // Boolean parsing\n if (value.toLowerCase() === 'true') return true\n if (value.toLowerCase() === 'false') return false\n\n // Number parsing\n const num = Number(value)\n if (!isNaN(num) && value.trim() !== '') return num\n\n // Default to string\n return value\n}\n\n/**\n * Validate that a key is a valid config key\n */\nexport function isValidKey(key: string): boolean {\n const parts = key.split('.')\n\n // Check if it's a nested rpc key\n if (parts.length === 2 && parts[0] === 'rpc') {\n return true\n }\n\n // Check if it's a top-level key\n return VALID_KEYS.includes(key as ValidKey)\n}\n\n/**\n * Set a configuration value\n * Supports nested keys like \"rpc.arbitrum\"\n */\nexport function setConfig(key: string, value: string | number | boolean): void {\n ensureDir()\n const config = getConfig()\n\n const keys = key.split('.')\n const rpcKey = keys[1]\n if (keys.length === 2 && keys[0] === 'rpc' && rpcKey) {\n // Handle nested RPC configuration\n config.rpc[rpcKey] = value as string\n } else if (VALID_KEYS.includes(key as ValidKey)) {\n // Handle top-level keys\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (config as any)[key] = value\n } else {\n throw new Error(`Unknown config key: ${key}`)\n }\n\n fs.writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2))\n}\n\n/**\n * Get a specific configuration value\n * Supports nested keys like \"rpc.arbitrum\"\n */\nexport function getConfigValue(key: string): unknown {\n const config = getConfig()\n const keys = key.split('.')\n const rpcKey = keys[1]\n\n if (keys.length === 2 && keys[0] === 'rpc' && rpcKey) {\n return config.rpc[rpcKey] ?? null\n }\n\n if (VALID_KEYS.includes(key as ValidKey)) {\n return config[key as ValidKey]\n }\n\n return undefined\n}\n\n/**\n * Get a flattened list of all config values for display\n */\nexport function getConfigList(): Array<{ key: string; value: string; isDefault: boolean }> {\n const config = getConfig()\n const savedConfig = fs.existsSync(CONFIG_PATH)\n ? JSON.parse(fs.readFileSync(CONFIG_PATH, 'utf-8'))\n : {}\n\n const items: Array<{ key: string; value: string; isDefault: boolean }> = []\n\n // Add top-level values\n items.push({\n key: 'slippage',\n value: String(config.slippage),\n isDefault: savedConfig.slippage === undefined,\n })\n items.push({\n key: 'autoDeposit',\n value: String(config.autoDeposit),\n isDefault: savedConfig.autoDeposit === undefined,\n })\n items.push({\n key: 'defaultChain',\n value: config.defaultChain,\n isDefault: savedConfig.defaultChain === undefined,\n })\n\n // Add RPC values - show common chains\n const commonChains = ['ethereum', 'arbitrum', 'polygon', 'optimism', 'base']\n for (const chain of commonChains) {\n const customRpc = config.rpc[chain]\n items.push({\n key: `rpc.${chain}`,\n value: customRpc || '(default)',\n isDefault: !customRpc,\n })\n }\n\n // Add any additional custom RPC URLs\n for (const [chain, url] of Object.entries(config.rpc)) {\n if (!commonChains.includes(chain) && url) {\n items.push({\n key: `rpc.${chain}`,\n value: url,\n isDefault: false,\n })\n }\n }\n\n return items\n}\n\n/**\n * Reset a specific config key to default\n */\nexport function resetConfig(key: string): void {\n ensureDir()\n const config = getConfig()\n\n const keys = key.split('.')\n const rpcKey = keys[1]\n if (keys.length === 2 && keys[0] === 'rpc' && rpcKey) {\n delete config.rpc[rpcKey]\n } else if (VALID_KEYS.includes(key as ValidKey)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (config as any)[key] = DEFAULT_CONFIG[key as ValidKey]\n }\n\n fs.writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2))\n}\n\n/**\n * Reset all configuration to defaults\n */\nexport function resetAllConfig(): void {\n ensureDir()\n fs.writeFileSync(CONFIG_PATH, JSON.stringify(DEFAULT_CONFIG, null, 2))\n}\n\n/**\n * Get the config file path\n */\nexport function getConfigPath(): string {\n return CONFIG_PATH\n}\n"],"mappings":";;;AACA,SAAS,eAAe;AACxB,OAAO,WAAW;AAClB,OAAOA,aAAW;AAClB,SAAS,cAAc;;;ACJvB,SAAgB,YAAAC,WAAU,WAAW,mBAAmB;AACxD,SAAS,OAAAC,MAAK,QAAAC,OAAM,QAAQ,YAAAC,iBAAgB;AAC5C;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAOA;AAAA,EACA;AAAA,EACA;AAAA,OACK;;;ACXA,IAAM,QAAQ;AAAA;AAAA,EAEnB,SAAS;AAAA;AAAA,EACT,WAAW;AAAA;AAAA,EACX,OAAO;AAAA;AAAA;AAAA,EAGP,SAAS;AAAA;AAAA,EACT,OAAO;AAAA;AAAA,EACP,SAAS;AAAA;AAAA;AAAA,EAGT,QAAQ;AAAA;AAAA,EACR,YAAY;AAAA;AAAA;AAAA,EAGZ,QAAQ;AAAA;AAAA,EACR,MAAM;AAAA;AACR;AAOO,IAAM,UAAU;AAAA;AAAA,EAErB,SAAS;AAAA,EACT,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,UAAU;AAAA;AAAA,EAGV,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,SAAS;AAAA,EACT,OAAO;AAAA;AAAA,EAGP,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,mBAAmB;AACrB;AAKO,IAAM,UAAU;AAAA,EACrB,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AACR;AAKO,IAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQlB,IAAM,UAAU;;;AClFvB,SAAS,OAAO,QAAQ,YAA0C;AA4B5D,cAOF,YAPE;AAVC,SAAS,IAAI;AAAA,EAClB;AAAA,EACA,cAAc,MAAM;AAAA,EACpB,WAAW;AAAA,EACX,UAAU;AAAA,EACV;AAAA,EACA,GAAG;AACL,GAAa;AACX,MAAI,CAAC,UAAU;AACb,WACE,oBAAC,UAAO,SAAmB,GAAG,OAC3B,UACH;AAAA,EAEJ;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,aAAY;AAAA,MACZ;AAAA,MACA,UAAU;AAAA,MACV,UAAU,UAAU,IAAI,IAAI;AAAA,MAC3B,GAAG;AAAA,MAEH;AAAA,iBACC,oBAAC,UAAO,cAAc,GACpB,8BAAC,QAAK,OAAO,MAAM,SAAS,MAAI,MAC7B,iBACH,GACF;AAAA,QAED;AAAA;AAAA;AAAA,EACH;AAEJ;AAcO,SAAS,QAAQ;AAAA,EACtB,QAAQ;AAAA,EACR,QAAQ,MAAM;AAAA,EACd,OAAO,QAAQ;AACjB,GAAiB;AACf,SACE,oBAAC,QAAK,OACH,eAAK,OAAO,KAAK,GACpB;AAEJ;;;AC7EA,SAAS,OAAAC,MAAK,QAAAC,aAAY;AAsBpB,SACE,OAAAC,MADF,QAAAC,aAAA;AAPC,SAAS,OAAO;AAAA,EACrB,cAAc;AAAA,EACd,UAAU;AAAA,EACV,UAAU;AACZ,GAAgB;AACd,MAAI,SAAS;AACX,WACE,gBAAAA,MAACC,MAAA,EAAI,eAAc,UAAS,cAAc,GACxC;AAAA,sBAAAF,KAACG,OAAA,EAAK,OAAO,MAAM,SAAS,MAAI,MAAC,kBAEjC;AAAA,MACC,eACC,gBAAAH,KAACG,OAAA,EAAK,OAAO,MAAM,WAAW,UAAQ,MACnC,mBACH;AAAA,OAEJ;AAAA,EAEJ;AAEA,SACE,gBAAAF,MAACC,MAAA,EAAI,eAAc,UAAS,cAAc,GACxC;AAAA,oBAAAF,KAACG,OAAA,EAAK,OAAO,MAAM,SAAS,MAAI,MAC7B,qBACH;AAAA,IACC,eACC,gBAAAH,KAACE,MAAA,EAAI,gBAAe,UAClB,0BAAAF,KAACG,OAAA,EAAK,OAAO,MAAM,WAAW,UAAQ,MACnC,mBACH,GACF;AAAA,KAEJ;AAEJ;;;ACjDA,SAAS,OAAAC,MAAK,QAAAC,aAAY;AAC1B,OAAO,oBAAoB;AAsEnB,SAcJ,OAAAC,MAdI,QAAAC,aAAA;AAhCD,SAAS,OAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf,WAAW;AAAA,EACX;AAAA,EACA;AACF,GAAmB;AAEjB,QAAM,WAAqC,MAAM,IAAI,CAAC,UAAU;AAAA,IAC9D,OAAO,KAAK;AAAA,IACZ,OAAO;AAAA,EACT,EAAE;AAEF,QAAM,eAAe,CAAC,SAAiC;AACrD,QAAI,CAAC,KAAK,MAAM,UAAU;AACxB,eAAS,KAAK,KAAK;AAAA,IACrB;AAAA,EACF;AAEA,QAAM,kBAAkB,CAAC,SAAiC;AACxD,kBAAc,KAAK,KAAK;AAAA,EAC1B;AAGA,QAAM,gBAAgB,CAAC,EAAE,YAAY,OAAAC,OAAM,MAA+C;AACxF,UAAM,OAAO,MAAM,KAAK,OAAK,EAAE,UAAUA,MAAK;AAC9C,UAAM,aAAa,MAAM;AAEzB,WACE,gBAAAD,MAACE,MAAA,EACC;AAAA,sBAAAF,MAACG,OAAA,EAAK,OAAO,aAAa,MAAM,UAAU,aAAa,MAAM,QAAQ,MAAM,WACxE;AAAA,qBAAa,QAAQ,QAAQ;AAAA,QAAI;AAAA,QAAEF;AAAA,SACtC;AAAA,MACC,MAAM,eACL,gBAAAD,MAACG,OAAA,EAAK,OAAO,MAAM,OAAO,UAAQ,MAC/B;AAAA;AAAA,QAAI;AAAA,QAAG,KAAK;AAAA,SACf;AAAA,OAEJ;AAAA,EAEJ;AAGA,QAAM,qBAAqB,CAAC,EAAE,WAAW,MACvC,gBAAAJ,KAACI,OAAA,EAAK,OAAO,MAAM,SAChB,uBAAa,QAAQ,QAAQ,KAChC;AAGF,MAAI,UAAU;AACZ,WACE,gBAAAH,MAACE,MAAA,EAAI,eAAc,UAChB;AAAA,eACC,gBAAAH,KAACI,OAAA,EAAK,OAAO,MAAM,OAAO,UAAQ,MAC/B,iBACH;AAAA,MAEF,gBAAAJ,KAACI,OAAA,EAAK,OAAO,MAAM,OAAO,UAAQ,MAAC,wBAEnC;AAAA,OACF;AAAA,EAEJ;AAEA,SACE,gBAAAH,MAACE,MAAA,EAAI,eAAc,UAChB;AAAA,aACC,gBAAAH,KAACG,MAAA,EAAI,cAAc,GACjB,0BAAAH,KAACI,OAAA,EAAK,OAAO,MAAM,WAAY,iBAAM,GACvC;AAAA,IAEF,gBAAAJ;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,QACP,UAAU;AAAA,QACV,aAAa;AAAA,QACb;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;AAUO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA,QAAQ;AACV,GAIG;AACD,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,MACP,UAAU,CAAC,SAAS,SAAS,IAAuB;AAAA,MACpD;AAAA;AAAA,EACF;AAEJ;AAUO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA,QAAQ;AACV,GAIG;AACD,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,MACP,UAAU,CAAC,SAAS,SAAS,IAAuB;AAAA,MACpD;AAAA;AAAA,EACF;AAEJ;;;AC/KA,SAAS,OAAAK,MAAK,QAAAC,aAAY;AAC1B,OAAO,gBAAgB;AAiCV,gBAAAC,MAyDD,QAAAC,aAzDC;AAHb,SAAS,mBAAmB,QAAqC;AAC/D,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO,gBAAAD,KAACE,OAAA,EAAK,OAAO,MAAM,OAAQ,kBAAQ,SAAQ;AAAA,IACpD,KAAK;AACH,aACE,gBAAAF,KAACE,OAAA,EAAK,OAAO,MAAM,SACjB,0BAAAF,KAAC,cAAW,MAAK,QAAO,GAC1B;AAAA,IAEJ,KAAK;AACH,aAAO,gBAAAA,KAACE,OAAA,EAAK,OAAO,MAAM,SAAU,kBAAQ,WAAU;AAAA,IACxD,KAAK;AACH,aAAO,gBAAAF,KAACE,OAAA,EAAK,OAAO,MAAM,OAAQ,kBAAQ,QAAO;AAAA,EACrD;AACF;AAKA,SAAS,eAAe,QAA4B;AAClD,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO,MAAM;AAAA,IACf,KAAK;AACH,aAAO,MAAM;AAAA,IACf,KAAK;AACH,aAAO,MAAM;AAAA,IACf,KAAK;AACH,aAAO,MAAM;AAAA,EACjB;AACF;AAKA,SAAS,SAAS;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMG;AACD,QAAM,QAAQ,eAAe,KAAK,MAAM;AAExC,SACE,gBAAAD,MAACE,MAAA,EAAI,eAAc,UACjB;AAAA,oBAAAF,MAACE,MAAA,EAEC;AAAA,sBAAAH,KAACG,MAAA,EAAI,OAAO,GAAI,6BAAmB,KAAK,MAAM,GAAE;AAAA,MAG/C,cACC,gBAAAH,KAACG,MAAA,EAAI,OAAO,GACV,0BAAAF,MAACC,OAAA,EAAK,OAAc,UAAU,KAAK,WAAW,WAC3C;AAAA,gBAAQ;AAAA,QAAE;AAAA,SACb,GACF;AAAA,MAIF,gBAAAF,KAACG,MAAA,EAAI,UAAU,GACb,0BAAAH;AAAA,QAACE;AAAA,QAAA;AAAA,UACC;AAAA,UACA,MAAM,KAAK,WAAW;AAAA,UACtB,UAAU,KAAK,WAAW;AAAA,UAEzB,eAAK;AAAA;AAAA,MACR,GACF;AAAA,MAGC,iBAAiB,KAAK,aACrB,gBAAAF,KAACG,MAAA,EAAI,YAAY,GACf,0BAAAH,KAACE,OAAA,EAAK,OAAO,MAAM,OAAO,UAAQ,MAC/B,eAAK,WACR,GACF;AAAA,OAEJ;AAAA,IAGC,KAAK,eACJ,gBAAAF,KAACG,MAAA,EAAI,YAAY,aAAa,IAAI,GAChC,0BAAAH,KAACE,OAAA,EAAK,OAAO,MAAM,OAAO,UAAQ,MAC/B,eAAK,aACR,GACF;AAAA,IAID,CAAC,UAAU,KAAK,WAAW,aAC1B,gBAAAF,KAACG,MAAA,EAAI,YAAY,GACf,0BAAAH,KAACE,OAAA,EAAK,OAAO,MAAM,QAAQ,oBAAC,GAC9B;AAAA,KAEJ;AAEJ;AAWO,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB;AACF,GAAuB;AACrB,SACE,gBAAAD,MAACE,MAAA,EAAI,eAAc,UAChB;AAAA,aACC,gBAAAH,KAACG,MAAA,EAAI,cAAc,GACjB,0BAAAH,KAACE,OAAA,EAAK,OAAO,MAAM,WAAW,MAAI,MAC/B,iBACH,GACF;AAAA,IAED,MAAM,IAAI,CAAC,MAAM,UAChB,gBAAAF;AAAA,MAAC;AAAA;AAAA,QAEC;AAAA,QACA;AAAA,QACA,YAAY;AAAA,QACZ,eAAe;AAAA,QACf,QAAQ,UAAU,MAAM,SAAS;AAAA;AAAA,MAL5B;AAAA,IAMP,CACD;AAAA,KACH;AAEJ;;;AC7KA,SAAS,OAAAI,MAAK,QAAAC,aAAY;AAC1B,OAAOC,iBAAgB;AAuFjB,gBAAAC,MAWA,QAAAC,aAXA;AATC,SAAS,QAAQ;AAAA,EACtB;AAAA,EACA,OAAO;AAAA,EACP,QAAQ,MAAM;AAAA,EACd,YAAY,MAAM;AAAA,EAClB,aAAa;AACf,GAAiB;AACf,QAAM,iBACJ,gBAAAD,KAACE,OAAA,EAAK,OACJ,0BAAAF,KAACG,aAAA,EAAW,MAAY,GAC1B;AAGF,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AAEA,SACE,gBAAAF,MAACG,MAAA,EACE;AAAA,KAAC,cAAc;AAAA,IAChB,gBAAAH,MAACC,OAAA,EAAK,OAAO,WACV;AAAA,mBAAa,KAAK;AAAA,MAAK;AAAA,MAAM,aAAa,MAAM;AAAA,OACnD;AAAA,IACC,cAAc;AAAA,KACjB;AAEJ;;;AC1GA,OAAO,WAAW;AAClB,SAAS,OAAAG,MAAK,QAAAC,aAAY;AAiHjB,gBAAAC,MAuCC,QAAAC,aAvCD;AA3ET,SAAS,aAAgB,KAAQ,UAAyC;AACxE,MAAI,OAAO,aAAa,YAAY;AAClC,WAAO,OAAO,SAAS,GAAG,CAAC;AAAA,EAC7B;AACA,SAAO,OAAO,IAAI,QAAQ,KAAK,EAAE;AACnC;AAKA,SAAS,sBACP,MACA,SACA,UACU;AACV,QAAM,SAAS,QAAQ,IAAI,CAAC,QAAQ;AAClC,UAAM,cAAc,IAAI,OAAO;AAC/B,UAAM,aAAa,KAAK,IAAI,CAAC,QAAQ,aAAa,KAAK,IAAI,QAAQ,EAAE,MAAM;AAC3E,UAAM,kBAAkB,KAAK,IAAI,aAAa,GAAG,UAAU;AAC3D,WAAO,IAAI,SAAS,KAAK,IAAI,iBAAiB,EAAE;AAAA,EAClD,CAAC;AAGD,MAAI,UAAU;AACZ,UAAM,aAAa,OAAO,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC,IAAK,QAAQ,SAAS,IAAK;AAC9E,QAAI,aAAa,UAAU;AACzB,YAAM,QAAQ,WAAW;AACzB,aAAO,OAAO,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,KAAK,CAAC;AAAA,IAChD;AAAA,EACF;AAEA,SAAO;AACT;AAKA,SAAS,QAAQ,MAAc,OAAe,QAAqC,QAAgB;AACjG,QAAM,YAAY,KAAK,SAAS,QAAQ,KAAK,MAAM,GAAG,QAAQ,CAAC,IAAI,WAAM;AACzE,QAAM,UAAU,QAAQ,UAAU;AAElC,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO,IAAI,OAAO,OAAO,IAAI;AAAA,IAC/B,KAAK;AACH,YAAM,UAAU,KAAK,MAAM,UAAU,CAAC;AACtC,YAAM,WAAW,UAAU;AAC3B,aAAO,IAAI,OAAO,OAAO,IAAI,YAAY,IAAI,OAAO,QAAQ;AAAA,IAC9D;AACE,aAAO,YAAY,IAAI,OAAO,OAAO;AAAA,EACzC;AACF;AAKA,SAAS,WAAW;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,QAAQ;AAAA,IACZ,KAAK,EAAE,MAAM,QAAQ,SAAS,OAAO,QAAQ,UAAU,UAAU,QAAQ,KAAK;AAAA,IAC9E,QAAQ,EAAE,MAAM,QAAQ,OAAO,OAAO,QAAQ,QAAQ,UAAU,QAAQ,MAAM;AAAA,IAC9E,QAAQ,EAAE,MAAM,QAAQ,YAAY,OAAO,QAAQ,aAAa,UAAU,QAAQ,QAAQ;AAAA,EAC5F;AAEA,QAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,QAAQ;AAChD,QAAM,WAAW,OAAO,IAAI,CAAC,MAAM,QAAQ,WAAW,OAAO,IAAI,CAAC,CAAC;AACnE,QAAM,OAAO,OAAO,SAAS,KAAK,QAAQ,IAAI;AAE9C,SAAO,gBAAAD,KAACE,OAAA,EAAK,OAAe,gBAAK;AACnC;AAKA,SAAS,SAA2B;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAQG;AACD,SACE,gBAAAD,MAACE,MAAA,EACE;AAAA,gBAAY,gBAAAH,KAACE,OAAA,EAAK,OAAO,aAAc,kBAAQ,UAAS;AAAA,IACxD,QAAQ,IAAI,CAAC,KAAK,MAAM;AACvB,YAAM,QAAQ,aAAa,KAAK,IAAI,QAAQ;AAC5C,YAAM,WAAW,OAAO,CAAC,KAAK,IAAI,OAAO;AACzC,YAAM,cAAc,QAAQ,OAAO,UAAU,IAAI,KAAK;AAEtD,UAAI,YAAoB,MAAM;AAC9B,UAAI,IAAI,WAAW;AACjB,oBAAY,OAAO,IAAI,cAAc,aACjC,IAAI,UAAU,OAAO,GAAG,IACxB,IAAI;AAAA,MACV;AAEA,aACE,gBAAAD,MAAC,MAAM,UAAN,EACC;AAAA,wBAAAD,KAACE,OAAA,EAAK,eAAC;AAAA,QACP,gBAAAF,KAACE,OAAA,EAAK,OAAO,WAAW,UAAU,WAAW,QAC1C,uBACH;AAAA,QACA,gBAAAF,KAACE,OAAA,EAAK,eAAC;AAAA,QACN,YAAY,gBAAAF,KAACE,OAAA,EAAK,OAAO,aAAc,kBAAQ,UAAS;AAAA,WANtC,CAOrB;AAAA,IAEJ,CAAC;AAAA,KACH;AAEJ;AAeO,SAAS,MAAwB;AAAA,EACtC;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,cAAc,MAAM;AAAA,EACpB,aAAa;AAAA,EACb,UAAU;AAAA,EACV;AACF,GAAkB;AAChB,QAAM,SAAS,sBAAsB,MAAM,SAAS,QAAQ;AAE5D,SACE,gBAAAD,MAACE,MAAA,EAAI,eAAc,UAEhB;AAAA,gBAAY,gBAAAH,KAAC,cAAW,QAAgB,UAAS,OAAM,OAAO,aAAa;AAAA,IAG5E,gBAAAC,MAACE,MAAA,EACE;AAAA,kBAAY,gBAAAH,KAACE,OAAA,EAAK,OAAO,aAAc,kBAAQ,UAAS;AAAA,MACxD,QAAQ,IAAI,CAAC,KAAK,MAAM;AACvB,cAAM,WAAW,OAAO,CAAC,KAAK,IAAI,OAAO;AACzC,eACE,gBAAAD,MAAC,MAAM,UAAN,EACC;AAAA,0BAAAD,KAACE,OAAA,EAAK,eAAC;AAAA,UACP,gBAAAF,KAACE,OAAA,EAAK,OAAO,IAAI,eAAe,MAAM,SAAS,MAAM,YAClD,kBAAQ,IAAI,QAAQ,UAAU,IAAI,KAAK,GAC1C;AAAA,UACA,gBAAAF,KAACE,OAAA,EAAK,eAAC;AAAA,UACN,YAAY,gBAAAF,KAACE,OAAA,EAAK,OAAO,aAAc,kBAAQ,UAAS;AAAA,aANtC,CAOrB;AAAA,MAEJ,CAAC;AAAA,OACH;AAAA,IAGC,YAAY,gBAAAF,KAAC,cAAW,QAAgB,UAAS,UAAS,OAAO,aAAa;AAAA,IAG9E,KAAK,IAAI,CAAC,KAAK,aACd,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ,WAAW,MAAM;AAAA,QACzB;AAAA;AAAA,MAPK;AAAA,IAQP,CACD;AAAA,IAGA,YAAY,gBAAAA,KAAC,cAAW,QAAgB,UAAS,UAAS,OAAO,aAAa;AAAA,KACjF;AAEJ;AAKO,SAAS,SAAS;AAAA,EACvB;AAAA,EACA,WAAW,MAAM;AAAA,EACjB,aAAa,MAAM;AAAA,EACnB,YAAY;AACd,GAKG;AACD,QAAM,cAAc,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,KAAK,IAAI,MAAM,CAAC;AAEpE,SACE,gBAAAA,KAACG,MAAA,EAAI,eAAc,UAChB,gBAAM,IAAI,CAAC,MAAM,UAChB,gBAAAF,MAACE,MAAA,EACC;AAAA,oBAAAH,KAACE,OAAA,EAAK,OAAO,UACV,eAAK,IAAI,OAAO,WAAW,GAC9B;AAAA,IACA,gBAAAD,MAACC,OAAA,EAAK,OAAO,MAAM,OAAO;AAAA;AAAA,MAAE;AAAA,MAAU;AAAA,OAAC;AAAA,IACvC,gBAAAF,KAACE,OAAA,EAAK,OAAO,YAAa,eAAK,OAAM;AAAA,OAL7B,KAMV,CACD,GACH;AAEJ;;;AC1QA,SAAgB,UAAU,eAAe;AACzC,SAAS,OAAAE,MAAK,QAAAC,OAAM,UAAU,gBAAgB;AAiKtC,SAqGM,UArGN,OAAAC,MAgBE,QAAAC,aAhBF;AAnIR,SAAS,WAAW,OAAe,MAAuB;AACxD,QAAM,aAAa,MAAM,YAAY;AACrC,QAAM,YAAY,KAAK,YAAY;AAGnC,MAAI,UAAU,SAAS,UAAU,EAAG,QAAO;AAG3C,MAAI,aAAa;AACjB,aAAW,QAAQ,WAAW;AAC5B,QAAI,SAAS,WAAW,UAAU,GAAG;AACnC;AACA,UAAI,eAAe,WAAW,OAAQ,QAAO;AAAA,IAC/C;AAAA,EACF;AAEA,SAAO;AACT;AAKA,SAAS,UAAU,OAAmB,YAA6C;AACjF,SAAO,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM;AAC/B,UAAM,WAAW,WAAW,SAAS,EAAE,EAAE;AACzC,UAAM,WAAW,WAAW,SAAS,EAAE,EAAE;AACzC,QAAI,YAAY,CAAC,SAAU,QAAO;AAClC,QAAI,CAAC,YAAY,SAAU,QAAO;AAClC,WAAO,EAAE,MAAM,cAAc,EAAE,KAAK;AAAA,EACtC,CAAC;AACH;AAMA,SAAS,gBAAgB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAUG;AACD,WAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,YAAY;AACd,UAAI,IAAI,aAAa,IAAI,QAAQ;AAC/B,iBAAS,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,CAAC;AAC9B,yBAAiB,CAAC;AAAA,MACpB,WAAW,SAAS,CAAC,IAAI,QAAQ,CAAC,IAAI,QAAQ,MAAM,WAAW,KAAK,MAAM,MAAM,eAAe,GAAG;AAChG,iBAAS,CAAC,MAAM,IAAI,KAAK;AACzB,yBAAiB,CAAC;AAAA,MACpB;AAAA,IACF;AAEA,QAAI,IAAI,SAAS;AACf,uBAAiB,CAAC,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC,CAAC;AAAA,IAC5C,WAAW,IAAI,WAAW;AACxB,uBAAiB,CAAC,MAAM,KAAK,IAAI,uBAAuB,GAAG,IAAI,CAAC,CAAC;AAAA,IACnE,WAAW,IAAI,UAAU,YAAY,eAAe,aAAa,GAAG;AAClE,eAAS,eAAe,aAAa,CAAC;AAAA,IACxC,WAAW,UAAU,OAAO,SAAS;AACnC,iBAAW,IAAI;AAAA,IACjB;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAMO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,WAAW;AAAA,EACX,aAAa,CAAC;AAAA,EACd;AAAA,EACA,aAAa;AAAA,EACb,aAAa;AACf,GAAwB;AACtB,QAAM,EAAE,mBAAmB,IAAI,SAAS;AACxC,QAAM,gBAAgB;AAEtB,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,EAAE;AACrC,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAS,CAAC;AACpD,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAG5C,QAAM,gBAAgB,QAAQ,MAAM;AAClC,QAAI,SAAS;AAGb,QAAI,OAAO;AACT,eAAS,MAAM;AAAA,QACb,CAAC,SACC,WAAW,OAAO,KAAK,KAAK,KAC3B,KAAK,YAAY,WAAW,OAAO,KAAK,QAAQ;AAAA,MACrD;AAAA,IACF;AAEA,WAAO,UAAU,QAAQ,UAAU;AAAA,EACrC,GAAG,CAAC,OAAO,OAAO,UAAU,CAAC;AAG7B,QAAM,eAAe,UAAU,cAAc,SAAS,KAAK,IAAI,YAAY,cAAc,MAAM;AAC/F,QAAM,iBAAiB,cAAc,MAAM,GAAG,YAAY;AAC1D,QAAM,UAAU,cAAc,SAAS;AAGvC,QAAM,YAAY,KAAK,IAAI,eAAe,KAAK,IAAI,GAAG,eAAe,SAAS,CAAC,CAAC;AAEhF,SACE,gBAAAA,MAACC,MAAA,EAAI,eAAc,UAEhB;AAAA,qBACC,gBAAAF;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,sBAAsB,eAAe;AAAA,QACrC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACF;AAAA,IAID,SACC,gBAAAC,MAACC,MAAA,EAAI,cAAc,GACjB;AAAA,sBAAAD,MAACE,OAAA,EAAK,OAAO,MAAM,WAChB;AAAA,gBAAQ;AAAA,QAAM;AAAA,QAAE;AAAA,SACnB;AAAA,MACA,gBAAAF,MAACE,OAAA,EAAK,OAAO,MAAM,OAAO;AAAA;AAAA,QAAG,cAAc;AAAA,QAAO;AAAA,SAAC;AAAA,OACrD;AAAA,IAID,cAAc,iBACb,gBAAAF,MAACC,MAAA,EAAI,cAAc,GACjB;AAAA,sBAAAF,KAACG,OAAA,EAAK,OAAO,MAAM,QAAS,kBAAQ,UAAS;AAAA,MAC7C,gBAAAF,MAACE,OAAA,EAAK,OAAO,MAAM,OAAO;AAAA;AAAA,QAAE,QAAQ;AAAA,QAAO;AAAA,SAAC;AAAA,MAC3C,QACC,gBAAAH,KAACG,OAAA,EAAK,OAAO,MAAM,SAAU,iBAAM,IAEnC,gBAAAH,KAACG,OAAA,EAAK,OAAO,MAAM,OAAO,UAAQ,MAC/B,uBACH;AAAA,MAEF,gBAAAH,KAACG,OAAA,EAAK,OAAO,MAAM,QAAQ,oBAAC;AAAA,OAC9B;AAAA,IAIF,gBAAAF,MAACC,MAAA,EAAI,eAAc,UAChB;AAAA,qBAAe,IAAI,CAAC,MAAM,UAAU;AACnC,cAAM,aAAa,iBAAiB,UAAU;AAC9C,cAAM,YAAY,WAAW,SAAS,KAAK,EAAE;AAE7C,eACE,gBAAAD,MAACC,MAAA,EACE;AAAA,2BACC,gBAAAF,KAACG,OAAA,EAAK,OAAO,aAAa,MAAM,SAAS,MAAM,QAC5C,uBAAa,QAAQ,QAAQ,KAChC;AAAA,UAEF,gBAAAH,KAACG,OAAA,EAAK,eAAC;AAAA,UAGN,aACC,gBAAAH,KAACG,OAAA,EAAK,OAAO,MAAM,SAAS,qBAAE;AAAA,UAIhC,gBAAAH;AAAA,YAACG;AAAA,YAAA;AAAA,cACC,OAAO,aAAa,MAAM,UAAU,MAAM;AAAA,cAC1C,MAAM;AAAA,cAEL,eAAK;AAAA;AAAA,UACR;AAAA,UAGC,KAAK,YACJ,gBAAAF,MAACE,OAAA,EAAK,OAAO,MAAM,OAAO,UAAQ,MAC/B;AAAA;AAAA,YAAI;AAAA,YAAE,KAAK;AAAA,YAAS;AAAA,aACvB;AAAA,UAID,KAAK,SACJ,gBAAAF,MAACE,OAAA,EAAK,OAAO,KAAK,cAAc,MAAM,QACnC;AAAA;AAAA,YAAI;AAAA,YAAE,KAAK;AAAA,YAAM;AAAA,aACpB;AAAA,aAhCM,KAAK,EAkCf;AAAA,MAEJ,CAAC;AAAA,MAGA,eAAe,WAAW,KACzB,gBAAAH,KAACE,MAAA,EACC,0BAAAD,MAACE,OAAA,EAAK,OAAO,MAAM,OAAO,UAAQ,MAAC;AAAA;AAAA,QAChB;AAAA,QAAM;AAAA,SACzB,GACF;AAAA,MAID,WAAW,CAAC,WACX,gBAAAF,MAACC,MAAA,EAAI,WAAW,GACd;AAAA,wBAAAD,MAACE,OAAA,EAAK,OAAO,MAAM,OAAO,UAAQ,MAAC;AAAA;AAAA,UAC/B,cAAc,SAAS;AAAA,UAAa;AAAA,UACrC,iBAAiB;AAAA,WACpB;AAAA,QACC,iBACC,gBAAAF,MAAA,YACE;AAAA,0BAAAD,KAACG,OAAA,EAAK,OAAO,MAAM,QAAQ,eAAC;AAAA,UAC5B,gBAAAH,KAACG,OAAA,EAAK,OAAO,MAAM,OAAO,UAAQ,MAAC,0BAAY;AAAA,WACjD;AAAA,SAEJ;AAAA,OAEJ;AAAA,IAGC,iBACC,gBAAAH,KAACE,MAAA,EAAI,WAAW,GACd,0BAAAD,MAACE,OAAA,EAAK,OAAO,MAAM,OAAO,UAAQ,MAAC;AAAA;AAAA,MACrB,WAAW,yBAAoB;AAAA,MAAI,aAAa,2BAAsB;AAAA,OACpF,GACF;AAAA,KAEJ;AAEJ;;;ACvRA,OAAO,QAAQ;AACf,OAAO,cAAc;AAQrB,eAAsB,eAAeC,OAAgC;AACnE,MAAIA,OAAM;AACR,QAAI,CAAC,GAAG,WAAWA,KAAI,GAAG;AACxB,YAAM,IAAI,MAAM,uBAAuBA,KAAI,EAAE;AAAA,IAC/C;AAEA,UAAM,UAAU,GAAG,aAAaA,OAAM,OAAO;AAE7C,QAAI;AAEF,YAAM,OAAO,KAAK,MAAM,OAAO;AAC/B,YAAM,MAAM,KAAK,cAAc,KAAK,eAAe,KAAK;AACxD,UAAI,KAAK;AACP,eAAO,oBAAoB,GAAG;AAAA,MAChC;AAEA,aAAO,oBAAoB,QAAQ,KAAK,CAAC;AAAA,IAC3C,QAAQ;AAEN,aAAO,oBAAoB,QAAQ,KAAK,CAAC;AAAA,IAC3C;AAAA,EACF;AAGA,SAAO,oBAAoB;AAC7B;AAMO,SAAS,sBAAuC;AACrD,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,KAAK,SAAS,gBAAgB;AAAA,MAClC,OAAO,QAAQ;AAAA,MACf,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAID,YAAQ,OAAO,MAAM,6CAA6C;AAElE,OAAG,GAAG,QAAQ,CAAC,WAAW;AACxB,SAAG,MAAM;AACT,UAAI;AACF,gBAAQ,oBAAoB,OAAO,KAAK,CAAC,CAAC;AAAA,MAC5C,SAAS,KAAK;AACZ,eAAO,GAAG;AAAA,MACZ;AAAA,IACF,CAAC;AAED,OAAG,GAAG,SAAS,MAAM;AAAA,IAErB,CAAC;AAAA,EACH,CAAC;AACH;AAKA,SAAS,oBAAoB,KAAqB;AAChD,QAAM,UAAU,IAAI,KAAK;AAGzB,QAAM,mBAAmB,QAAQ,WAAW,IAAI,IAAI,QAAQ,MAAM,CAAC,IAAI;AAEvE,MAAI,CAAC,oBAAoB,KAAK,gBAAgB,GAAG;AAC/C,UAAM,IAAI,MAAM,yDAAyD;AAAA,EAC3E;AAEA,SAAO,QAAQ,WAAW,IAAI,IAAI,UAAU,KAAK,OAAO;AAC1D;AAKA,eAAsB,yBAAyB,YAAqC;AAClF,QAAM,EAAE,oBAAoB,IAAI,MAAM,OAAO,eAAe;AAC5D,QAAM,UAAU,oBAAoB,UAA2B;AAC/D,SAAO,QAAQ;AACjB;AAMA,eAAsB,aACpB,YACA,SACA,QAC4B;AAC5B,QAAM,EAAE,oBAAoB,IAAI,MAAM,OAAO,eAAe;AAC5D,QAAM,EAAE,oBAAoB,KAAK,IAAI,MAAM,OAAO,MAAM;AACxD,QAAM,EAAE,UAAU,SAAS,UAAU,SAAS,MAAM,WAAW,IAAI,IAAI,MAAM,OAAO,aAAa;AAGjG,QAAM,WAAkC;AAAA,IACtC,GAAG;AAAA,IACH,OAAO;AAAA,IACP,IAAI;AAAA,IACJ,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,IAAI;AAAA;AAAA,IAEJ,KAAK;AAAA,MACH,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,gBAAgB,EAAE,MAAM,OAAO,QAAQ,OAAO,UAAU,GAAG;AAAA,MAC3D,SAAS;AAAA,QACP,SAAS,EAAE,MAAM,CAAC,iCAAiC,EAAE;AAAA,MACvD;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAQ,SAAS,OAAO;AAC9B,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,yBAAyB,OAAO,gBAAgB,OAAO,KAAK,QAAQ,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,EACpG;AAEA,QAAM,UAAU,oBAAoB,UAA2B;AAE/D,QAAM,YAAY,SAAS,KAAK,MAAM,IAAI,KAAK;AAE/C,QAAM,eAAe,mBAAmB;AAAA,IACtC;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL,iBAAiB,OAAO,YAAqD;AAC3E,YAAM,SAAS,MAAM,aAAa,gBAAgB;AAAA,QAChD,IAAI,QAAQ;AAAA,QACZ,MAAM,QAAQ;AAAA,QACd,OAAO,OAAO,QAAQ,SAAS,GAAG;AAAA,QAClC,KAAK,QAAQ,WAAW,OAAO,QAAQ,QAAQ,IAAI;AAAA,QACnD,UAAU,QAAQ,WAAW,OAAO,QAAQ,QAAQ,IAAI;AAAA,QACxD;AAAA,MACF,CAAC;AAED,aAAO;AAAA,IACT;AAAA,IAEA,YAAY,YAA6B;AACvC,aAAO,QAAQ;AAAA,IACjB;AAAA,IAEA,YAAY,YAA6B;AACvC,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;AT9EM,gBAAAC,MAgCM,QAAAC,aAhCN;AA5BN,IAAM,eAA4B;AAAA,EAChC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,iBAAiB;AACnB;AAKA,SAAS,gBAAgB,EAAE,KAAK,GAAyB;AACvD,QAAM,QAAoC;AAAA,IACxC,OAAO;AAAA,IACP,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,KAAK;AAAA,IACL,SAAS;AAAA,IACT,SAAS;AAAA,EACX;AAEA,SACE,gBAAAD,KAACE,MAAA,EAAI,WAAW,GACd,0BAAAF,KAACG,OAAA,EAAK,OAAO,MAAM,OAAO,UAAQ,MAC/B,gBAAM,IAAI,GACb,GACF;AAEJ;AAKA,SAAS,cAAc,EAAE,YAAY,GAAgC;AACnE,QAAM,QAAsB,CAAC,SAAS,SAAS,UAAU,OAAO,WAAW,SAAS;AACpF,QAAM,aAAyC;AAAA,IAC7C,OAAO;AAAA,IACP,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,KAAK;AAAA,IACL,SAAS;AAAA,IACT,SAAS;AAAA,EACX;AAEA,QAAM,eAAe,MAAM,QAAQ,WAAW;AAE9C,SACE,gBAAAH,KAACE,MAAA,EAAI,cAAc,GAChB,gBAAM,IAAI,CAAC,MAAM,UAAU;AAC1B,UAAM,WAAW,UAAU;AAC3B,UAAM,cAAc,QAAQ;AAC5B,UAAM,YAAY,QAAQ,MAAM,SAAS,IAAI,QAAQ;AAErD,WACE,gBAAAD,MAACE,OAAA,EACC;AAAA,sBAAAF;AAAA,QAACE;AAAA,QAAA;AAAA,UACC,OAAO,WAAW,MAAM,UAAU,cAAc,MAAM,UAAU,MAAM;AAAA,UACtE,MAAM;AAAA,UACN,UAAU,CAAC,YAAY,CAAC;AAAA,UAEvB;AAAA,0BAAc,QAAQ,QAAQ,WAAW,QAAQ,QAAQ,QAAQ;AAAA,YAAQ;AAAA,YAAE,WAAW,IAAI;AAAA;AAAA;AAAA,MAC7F;AAAA,MACA,gBAAAH,KAACG,OAAA,EAAK,OAAO,MAAM,OAAO,UAAQ,MAAE,qBAAU;AAAA,SARrC,IASX;AAAA,EAEJ,CAAC,GACH;AAEJ;AAKA,SAAS,mBAAmB;AAAA,EAC1B;AAAA,EACA;AACF,GAGG;AACD,QAAM,CAAC,QAAQ,SAAS,IAAIC,UAAkB,CAAC,CAAC;AAChD,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,IAAI;AAC3C,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAwB,IAAI;AAEtD,YAAU,MAAM;AACd,mBAAe,aAAa;AAC1B,UAAI;AACF,mBAAW,IAAI;AACf,iBAAS,IAAI;AACb,cAAM,WAAW,MAAM,UAAU;AAEjC,cAAM,eAAe,SAAS,OAAO,OAAO,OAAK,EAAE,OAAO,iBAAiB;AAC3E,kBAAU,YAAY;AAAA,MACxB,SAAS,KAAK;AACZ,iBAAS,eAAe,QAAQ,IAAI,UAAU,uBAAuB;AAAA,MACvE,UAAE;AACA,mBAAW,KAAK;AAAA,MAClB;AAAA,IACF;AACA,eAAW;AAAA,EACb,GAAG,CAAC,CAAC;AAEL,MAAI,SAAS;AACX,WAAO,gBAAAJ,KAAC,WAAQ,MAAK,+BAA8B;AAAA,EACrD;AAEA,MAAI,OAAO;AACT,WACE,gBAAAC,MAACC,MAAA,EAAI,eAAc,UACjB;AAAA,sBAAAD,MAACE,OAAA,EAAK,OAAO,MAAM,OAAQ;AAAA,gBAAQ;AAAA,QAAO;AAAA,QAAS;AAAA,SAAM;AAAA,MACzD,gBAAAH,KAACG,OAAA,EAAK,OAAO,MAAM,OAAO,2CAA6B;AAAA,OACzD;AAAA,EAEJ;AAEA,QAAM,aAAgC,OAAO,IAAI,YAAU;AAAA,IACzD,OAAO,MAAM;AAAA,IACb,OAAO,MAAM;AAAA,IACb,SAAS,MAAM;AAAA,IACf,MAAM;AAAA,IACN,aAAa,aAAa,MAAM,EAAE;AAAA,EACpC,EAAE;AAEF,SACE,gBAAAF,MAACC,MAAA,EAAI,eAAc,UACjB;AAAA,oBAAAF,KAACE,MAAA,EAAI,cAAc,GACjB,0BAAAF,KAACG,OAAA,EAAK,OAAO,MAAM,WAAW,MAAI,MAAC,iDAEnC,GACF;AAAA,IACA,gBAAAH;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ;AAAA,QACR,UAAU,CAAC,SAAS;AAClB,gBAAM,QAAQ,OAAO,KAAK,OAAK,EAAE,OAAO,KAAK,OAAO;AACpD,cAAI,MAAO,UAAS,KAAK;AAAA,QAC3B;AAAA,QACA,OAAM;AAAA;AAAA,IACR;AAAA,IACA,gBAAAA,KAACE,MAAA,EAAI,WAAW,GACd,0BAAAD,MAACE,OAAA,EAAK,OAAO,MAAM,OAAO,UAAQ,MAAC;AAAA;AAAA,MACC;AAAA,MAAkB;AAAA,OACtD,GACF;AAAA,KACF;AAEJ;AAKA,SAAS,mBAAmB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,CAAC,QAAQ,SAAS,IAAIC,UAAkB,CAAC,CAAC;AAChD,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,IAAI;AAC3C,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAwB,IAAI;AAEtD,YAAU,MAAM;AACd,mBAAe,aAAa;AAC1B,UAAI;AACF,mBAAW,IAAI;AACf,iBAAS,IAAI;AACb,cAAM,WAAW,MAAM,oBAAoB,MAAM,EAAE;AACnD,kBAAU,SAAS,MAAM;AAAA,MAC3B,SAAS,KAAK;AACZ,iBAAS,eAAe,QAAQ,IAAI,UAAU,uBAAuB;AAAA,MACvE,UAAE;AACA,mBAAW,KAAK;AAAA,MAClB;AAAA,IACF;AACA,eAAW;AAAA,EACb,GAAG,CAAC,MAAM,EAAE,CAAC;AAEb,MAAI,SAAS;AACX,WAAO,gBAAAJ,KAAC,WAAQ,MAAM,iCAAiC,MAAM,IAAI,OAAO;AAAA,EAC1E;AAEA,MAAI,OAAO;AACT,WACE,gBAAAC,MAACC,MAAA,EAAI,eAAc,UACjB;AAAA,sBAAAD,MAACE,OAAA,EAAK,OAAO,MAAM,OAAQ;AAAA,gBAAQ;AAAA,QAAO;AAAA,QAAS;AAAA,SAAM;AAAA,MACzD,gBAAAH,KAACG,OAAA,EAAK,OAAO,MAAM,OAAO,6CAA+B;AAAA,OAC3D;AAAA,EAEJ;AAEA,MAAI,OAAO,WAAW,GAAG;AACvB,WACE,gBAAAF,MAACC,MAAA,EAAI,eAAc,UACjB;AAAA,sBAAAD,MAACE,OAAA,EAAK,OAAO,MAAM,SAAU;AAAA,gBAAQ;AAAA,QAAQ;AAAA,QAAiC,MAAM;AAAA,SAAK;AAAA,MACzF,gBAAAH,KAACG,OAAA,EAAK,OAAO,MAAM,OAAO,yDAA2C;AAAA,OACvE;AAAA,EAEJ;AAEA,QAAM,aAAgC,OAAO,IAAI,YAAU;AAAA,IACzD,OAAO,MAAM;AAAA,IACb,OAAO,MAAM;AAAA,IACb,QAAQ,MAAM;AAAA,IACd,aAAa,MAAM;AAAA,EACrB,EAAE;AAEF,SACE,gBAAAF,MAACC,MAAA,EAAI,eAAc,UACjB;AAAA,oBAAAF,KAACE,MAAA,EAAI,cAAc,GACjB,0BAAAD,MAACE,OAAA,EAAK,OAAO,MAAM,WAAW,MAAI,MAAC;AAAA;AAAA,MACJ,MAAM;AAAA,MAAK;AAAA,OAC1C,GACF;AAAA,IACA,gBAAAH;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ;AAAA,QACR,UAAU,CAAC,SAAS;AAClB,gBAAM,QAAQ,OAAO,KAAK,OAAK,EAAE,YAAY,KAAK,KAAK;AACvD,cAAI,MAAO,UAAS,KAAK;AAAA,QAC3B;AAAA,QACA,OAAM;AAAA;AAAA,IACR;AAAA,KACF;AAEJ;AAKA,SAAS,gBAAgB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAOG;AACD,QAAM,CAAC,eAAe,gBAAgB,IAAII,UAAS,IAAI;AAGvD,YAAU,MAAM;AACd,UAAM,WAAW,YAAY,MAAM;AACjC,uBAAiB,OAAK,CAAC,CAAC;AAAA,IAC1B,GAAG,GAAG;AACN,WAAO,MAAM,cAAc,QAAQ;AAAA,EACrC,GAAG,CAAC,CAAC;AAGL,EAAAC,UAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,IAAI,UAAU,OAAO,SAAS,GAAG;AACnC,gBAAU;AACV;AAAA,IACF;AAEA,QAAI,IAAI,aAAa,IAAI,QAAQ;AAC/B,qBAAe,OAAO,MAAM,GAAG,EAAE,CAAC;AAClC;AAAA,IACF;AAGA,QAAI,WAAW,KAAK,KAAK,GAAG;AAE1B,UAAI,UAAU,OAAO,OAAO,SAAS,GAAG,EAAG;AAE3C,UAAI,UAAU,OAAO,WAAW,IAAK;AACrC,qBAAe,SAAS,KAAK;AAAA,IAC/B;AAAA,EACF,CAAC;AAED,QAAM,SAAS,gBAAgB,MAAM;AACrC,QAAM,gBAAgB,UAAU;AAEhC,SACE,gBAAAJ,MAACC,MAAA,EAAI,eAAc,UACjB;AAAA,oBAAAF,KAACE,MAAA,EAAI,cAAc,GACjB,0BAAAD,MAACE,OAAA,EAAK,OAAO,MAAM,WAAW,MAAI,MAAC;AAAA;AAAA,MAChB,MAAM;AAAA,MAAO;AAAA,OAChC,GACF;AAAA,IAEA,gBAAAH,KAAC,OAAU,UAAQ,MAAC,SAAS,GAC3B,0BAAAC,MAACC,MAAA,EACC;AAAA,sBAAAF,KAACG,OAAA,EAAK,OAAO,MAAM,SAAS,MAAI,MAC7B,yBACH;AAAA,MACA,gBAAAH,KAACG,OAAA,EAAK,OAAO,MAAM,SAAU,kBAAO;AAAA,MACpC,gBAAAF,MAACE,OAAA,EAAK,OAAO,MAAM,OAAO;AAAA;AAAA,QAAE,MAAM;AAAA,SAAO;AAAA,OAC3C,GACF;AAAA,IAEC,SACC,gBAAAH,KAACE,MAAA,EAAI,WAAW,GACd,0BAAAD,MAACE,OAAA,EAAK,OAAO,MAAM,OAAQ;AAAA,cAAQ;AAAA,MAAO;AAAA,MAAE;AAAA,OAAM,GACpD;AAAA,IAGF,gBAAAH,KAACE,MAAA,EAAI,WAAW,GACd,0BAAAD,MAACE,OAAA,EAAK,OAAO,MAAM,OAAO,UAAQ,MAAC;AAAA;AAAA,MAC1B,MAAM;AAAA,MAAK;AAAA,MAAG,MAAM;AAAA,MAAO;AAAA,OACpC,GACF;AAAA,IACA,gBAAAH,KAACE,MAAA,EACC,0BAAAF,KAACG,OAAA,EAAK,OAAO,MAAM,OAAO,UAAQ,MAAC,iCAEnC,GACF;AAAA,KACF;AAEJ;AAKA,SAAS,aAAa;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAOG;AACD,QAAM,CAAC,eAAe,gBAAgB,IAAIC,UAAS,IAAI;AAGvD,YAAU,MAAM;AACd,UAAM,WAAW,YAAY,MAAM;AACjC,uBAAiB,OAAK,CAAC,CAAC;AAAA,IAC1B,GAAG,GAAG;AACN,WAAO,MAAM,cAAc,QAAQ;AAAA,EACrC,GAAG,CAAC,CAAC;AAGL,EAAAC,UAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,QAAS;AAEb,QAAI,IAAI,UAAU,WAAW,UAAU,IAAI;AACzC,gBAAU;AACV;AAAA,IACF;AAEA,QAAI,IAAI,aAAa,IAAI,QAAQ;AAC/B,kBAAY,WAAW,MAAM,GAAG,EAAE,CAAC;AACnC;AAAA,IACF;AAGA,QAAI,iBAAiB,KAAK,KAAK,GAAG;AAChC,kBAAY,aAAa,KAAK;AAAA,IAChC;AAAA,EACF,CAAC;AAED,QAAM,SAAS,gBAAgB,MAAM;AAErC,QAAM,YAAY,WAAW,SAAS,KAClC,GAAG,WAAW,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,OAAO,KAAK,IAAI,GAAG,WAAW,SAAS,EAAE,CAAC,CAAC,GAAG,WAAW,MAAM,EAAE,CAAC,KAClG;AAEJ,SACE,gBAAAJ,MAACC,MAAA,EAAI,eAAc,UACjB;AAAA,oBAAAF,KAACE,MAAA,EAAI,cAAc,GACjB,0BAAAF,KAACG,OAAA,EAAK,OAAO,MAAM,WAAW,MAAI,MAAC,6DAEnC,GACF;AAAA,IAEA,gBAAAH,KAAC,OAAU,UAAQ,MAAC,SAAS,GAC3B,0BAAAC,MAACC,MAAA,EACC;AAAA,sBAAAF,KAACG,OAAA,EAAK,OAAO,MAAM,SAAS,MAAI,MAC7B,uBAAa,MAChB;AAAA,MACA,gBAAAH,KAACG,OAAA,EAAK,OAAO,MAAM,SAAU,kBAAO;AAAA,OACtC,GACF;AAAA,IAEC,WACC,gBAAAH,KAACE,MAAA,EAAI,WAAW,GACd,0BAAAF,KAAC,WAAQ,MAAK,wCAAuC,GACvD;AAAA,IAGD,iBAAiB,CAAC,WACjB,gBAAAA,KAACE,MAAA,EAAI,WAAW,GACd,0BAAAD,MAACE,OAAA,EAAK,OAAO,MAAM,SAChB;AAAA,cAAQ;AAAA,MAAM;AAAA,MAAU,cAAc,MAAM,GAAG,CAAC;AAAA,MAAE;AAAA,MAAI,cAAc,MAAM,EAAE;AAAA,OAC/E,GACF;AAAA,IAGD,SACC,gBAAAH,KAACE,MAAA,EAAI,WAAW,GACd,0BAAAD,MAACE,OAAA,EAAK,OAAO,MAAM,OAAQ;AAAA,cAAQ;AAAA,MAAO;AAAA,MAAE;AAAA,OAAM,GACpD;AAAA,IAGF,gBAAAH,KAACE,MAAA,EAAI,WAAW,GACd,0BAAAF,KAACG,OAAA,EAAK,OAAO,MAAM,OAAO,UAAQ,MAAC,gEAEnC,GACF;AAAA,IACA,gBAAAH,KAACE,MAAA,EACC,0BAAAF,KAACG,OAAA,EAAK,OAAO,MAAM,OAAO,UAAQ,MAAC,8EAEnC,GACF;AAAA,KACF;AAEJ;AAKA,SAAS,iBAAiB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAOG;AAED,EAAAE,UAAS,CAAC,QAAQ,QAAQ;AACxB,QAAI,IAAI,UAAU,OAAO;AACvB,gBAAU;AAAA,IACZ;AAAA,EACF,CAAC;AAED,MAAI,CAAC,OAAO;AACV,WAAO,gBAAAL,KAAC,WAAQ,MAAK,qBAAoB;AAAA,EAC3C;AAEA,QAAM,mBAAmB,KAAK,KAAK,MAAM,gBAAgB,EAAE;AAC3D,QAAM,mBAAmB,OAAO,MAAM,QAAQ,IAAI,KAAK,IAAI,IAAI,MAAM,QAAQ,QAAQ,GAAG,QAAQ,CAAC;AAEjG,SACE,gBAAAC,MAACC,MAAA,EAAI,eAAc,UACjB;AAAA,oBAAAF,KAACE,MAAA,EAAI,cAAc,GACjB,0BAAAF,KAACG,OAAA,EAAK,OAAO,MAAM,WAAW,MAAI,MAAC,6CAEnC,GACF;AAAA,IAEC,iBACC,gBAAAH,KAACE,MAAA,EAAI,cAAc,GACjB,0BAAAD,MAACE,OAAA,EAAK,OAAO,MAAM,OAAO,UAAQ,MAAC;AAAA;AAAA,MACxB,cAAc,MAAM,GAAG,CAAC;AAAA,MAAE;AAAA,MAAI,cAAc,MAAM,EAAE;AAAA,OAC/D,GACF;AAAA,IAGF,gBAAAF,MAAC,OAAU,UAAQ,MAAC,OAAM,uBAAsB,SAAS,GACvD;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,EAAE,KAAK,cAAc,OAAO,MAAM,KAAK;AAAA,YACvC,EAAE,KAAK,SAAS,OAAO,MAAM,OAAO;AAAA,YACpC,EAAE,KAAK,UAAU,OAAO,GAAG,MAAM,IAAI,MAAM,MAAM,GAAG;AAAA,YACpD,EAAE,KAAK,YAAY,OAAO,WAAW;AAAA,YACrC,EAAE,KAAK,eAAe,OAAO,IAAI,eAAe,IAAI,MAAM,QAAQ,MAAM,GAAG;AAAA,UAC7E;AAAA;AAAA,MACF;AAAA,MAEA,gBAAAA,KAACE,MAAA,EAAI,WAAW,GAAG,cAAc,GAC/B,0BAAAF,KAAC,WAAQ,OAAO,IAAI,GACtB;AAAA,MAEA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,EAAE,KAAK,WAAW,OAAO,IAAI,MAAM,KAAK,OAAO,QAAQ,CAAC,CAAC,GAAG;AAAA,YAC5D,EAAE,KAAK,cAAc,OAAO,IAAI,MAAM,KAAK,aAAa,QAAQ,CAAC,CAAC,GAAG;AAAA,YACrE,EAAE,KAAK,cAAc,OAAO,IAAI,MAAM,KAAK,SAAS,QAAQ,CAAC,CAAC,GAAG;AAAA,YACjE,EAAE,KAAK,aAAa,OAAO,IAAI,gBAAgB,OAAO;AAAA,UACxD;AAAA,UACA,UAAU,MAAM;AAAA,UAChB,YAAY,MAAM;AAAA;AAAA,MACpB;AAAA,OACF;AAAA,IAEC,MAAM,cACL,gBAAAA,KAACE,MAAA,EAAI,WAAW,GACd,0BAAAD,MAACE,OAAA,EAAK,OAAO,MAAM,SAChB;AAAA,cAAQ;AAAA,MAAQ;AAAA,OAA+B,MAAM,cAAc,KAAK,QAAQ,CAAC;AAAA,MAAE;AAAA,OACtF,GACF;AAAA,IAGF,gBAAAH,KAACE,MAAA,EAAI,WAAW,GACd,0BAAAD,MAACE,OAAA,EAAK,OAAO,MAAM,SAAS,MAAI,MAC7B;AAAA,cAAQ;AAAA,MAAM;AAAA,OACjB,GACF;AAAA,IACA,gBAAAH,KAACE,MAAA,EACC,0BAAAF,KAACG,OAAA,EAAK,OAAO,MAAM,OAAO,UAAQ,MAAC,yCAEnC,GACF;AAAA,KACF;AAEJ;AAgBA,SAAS,cAAc;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAQG;AACD,QAAM,CAAC,WAAW,YAAY,IAAIC,UAA6B;AAAA,IAC7D,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,EACX,CAAC;AACD,QAAM,CAAC,eAAe,gBAAgB,IAAIA,UAAS,iBAAiB;AACpE,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAwB,IAAI;AACxD,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAwB,IAAI;AACtD,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAS,KAAK;AAGpD,YAAU,MAAM;AACd,QAAI,YAAa;AACjB,mBAAe,IAAI;AAEnB,UAAM,gBAAgB,YAAY;AAChC,UAAI;AAEF,cAAM,SAAS,MAAM,aAAa,YAAY,MAAM,EAAE;AAGtD,cAAM,OAAO,IAAI,KAAK;AAAA,UACpB,YAAY;AAAA,UACZ,aAAa;AAAA,QACf,CAAC;AAED,cAAM,SAAS,MAAM,KAAK,QAAQ;AAAA,UAChC;AAAA,UACA;AAAA,UACA,cAAc,CAAC,eAAkC;AAC/C,6BAAiB,GAAG,WAAW,IAAI,KAAK,WAAW,MAAM,EAAE;AAE3D,gBAAI,WAAW,SAAS,YAAY;AAClC,kBAAI,WAAW,WAAW,aAAa;AACrC,6BAAa,WAAS,EAAE,GAAG,MAAM,UAAU,aAAa,QAAQ,SAAS,EAAE;AAAA,cAC7E,WAAW,WAAW,WAAW,UAAU;AACzC,6BAAa,WAAS,EAAE,GAAG,MAAM,UAAU,SAAS,EAAE;AAAA,cACxD,WAAW,WAAW,WAAW,UAAU;AACzC,6BAAa,WAAS,EAAE,GAAG,MAAM,UAAU,SAAS,EAAE;AAAA,cACxD;AAAA,YACF,WAAW,WAAW,SAAS,YAAY,WAAW,SAAS,QAAQ;AACrE,kBAAI,WAAW,WAAW,aAAa;AACrC,6BAAa,WAAS,EAAE,GAAG,MAAM,QAAQ,aAAa,SAAS,SAAS,EAAE;AAAA,cAC5E,WAAW,WAAW,WAAW,UAAU;AACzC,6BAAa,WAAS,EAAE,GAAG,MAAM,QAAQ,SAAS,EAAE;AAAA,cACtD,WAAW,WAAW,WAAW,UAAU;AACzC,6BAAa,WAAS,EAAE,GAAG,MAAM,QAAQ,SAAS,EAAE;AAAA,cACtD;AACA,kBAAI,WAAW,QAAQ;AACrB,0BAAU,WAAW,MAAM;AAAA,cAC7B;AAAA,YACF,WAAW,WAAW,SAAS,WAAW;AACxC,kBAAI,WAAW,WAAW,aAAa;AACrC,6BAAa,WAAS,EAAE,GAAG,MAAM,SAAS,YAAY,EAAE;AAAA,cAC1D,WAAW,WAAW,WAAW,UAAU;AACzC,6BAAa,WAAS,EAAE,GAAG,MAAM,SAAS,SAAS,EAAE;AAAA,cACvD;AAAA,YACF;AAAA,UACF;AAAA,UACA,gBAAgB,CAAC,WAAqC;AACpD,6BAAiB,OAAO,aAAa,QAAQ,OAAO,WAAW,IAAI,OAAO,UAAU,EAAE;AACtF,gBAAI,OAAO,QAAQ;AACjB,wBAAU,OAAO,MAAM;AAAA,YACzB;AAAA,UACF;AAAA,QACF,CAAC;AAED,YAAI,OAAO,WAAW,aAAa;AACjC,uBAAa;AAAA,YACX,UAAU;AAAA,YACV,QAAQ;AAAA,YACR,SAAS;AAAA,UACX,CAAC;AACD,qBAAW,MAAM;AAAA,QACnB,WAAW,OAAO,WAAW,UAAU;AACrC,mBAAS,OAAO,OAAO,WAAW,yBAAyB;AAC3D,kBAAQ,OAAO,SAAS,IAAI,MAAM,yBAAyB,CAAC;AAAA,QAC9D;AAAA,MACF,SAAS,KAAK;AACZ,cAAM,kBAAkB,eAAe,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC,CAAC;AAC1F,iBAAS,gBAAgB,OAAO;AAChC,gBAAQ,eAAe;AAAA,MACzB;AAAA,IACF;AAEA,kBAAc;AAAA,EAChB,GAAG,CAAC,CAAC;AAEL,QAAM,QAAwB;AAAA,IAC5B;AAAA,MACE,OAAO;AAAA,MACP,QAAQ,UAAU;AAAA,MAClB,aAAa,UAAU,aAAa,WAAW,4BAA4B;AAAA,IAC7E;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,QAAQ,UAAU;AAAA,MAClB,aAAa,UAAU,WAAW,WAAW,gBAAgB;AAAA,IAC/D;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,QAAQ,UAAU;AAAA,MAClB,aAAa,UAAU,YAAY,WAAW,uCAAuC;AAAA,IACvF;AAAA,EACF;AAEA,SACE,gBAAAH,MAACC,MAAA,EAAI,eAAc,UACjB;AAAA,oBAAAF,KAACE,MAAA,EAAI,cAAc,GACjB,0BAAAD,MAACE,OAAA,EAAK,OAAO,MAAM,WAAW,MAAI,MAAC;AAAA;AAAA,MACvB;AAAA,MAAO;AAAA,MAAE,MAAM;AAAA,MAAO;AAAA,MAAO,MAAM;AAAA,MAAK;AAAA,OACpD,GACF;AAAA,IAEA,gBAAAH,KAAC,iBAAc,OAAc,OAAM,mBAAkB,aAAW,MAAC;AAAA,IAEhE,UACC,gBAAAA,KAACE,MAAA,EAAI,WAAW,GACd,0BAAAD,MAACE,OAAA,EAAK,OAAO,MAAM,OAAO;AAAA;AAAA,MACnB,OAAO,MAAM,GAAG,EAAE;AAAA,MAAE;AAAA,MAAI,OAAO,MAAM,EAAE;AAAA,OAC9C,GACF;AAAA,IAGD,UAAU,YAAY,eACrB,gBAAAH,KAACE,MAAA,EAAI,WAAW,GACd,0BAAAD,MAACE,OAAA,EAAK,OAAO,MAAM,SAAS,MAAI,MAC7B;AAAA,cAAQ;AAAA,MAAM;AAAA,OACjB,GACF;AAAA,IAGD,SACC,gBAAAH,KAACE,MAAA,EAAI,WAAW,GACd,0BAAAD,MAACE,OAAA,EAAK,OAAO,MAAM,OAChB;AAAA,cAAQ;AAAA,MAAO;AAAA,MAAS;AAAA,OAC3B,GACF;AAAA,IAGD,CAAC,SAAS,UAAU,YAAY,eAC/B,gBAAAH,KAACE,MAAA,EAAI,WAAW,GACd,0BAAAF,KAACG,OAAA,EAAK,OAAO,MAAM,OAAO,UAAQ,MAC/B,yBACH,GACF;AAAA,KAEJ;AAEJ;AAKO,SAAS,SAAS;AACvB,QAAM,EAAE,KAAK,IAAI,OAAO;AACxB,QAAM,CAAC,OAAO,QAAQ,IAAIC,UAAsB,YAAY;AAG5D,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,KAAK;AAGlD,EAAAC,UAAS,CAAC,OAAO,QAAQ;AAEvB,QAAI,UAAU,OAAO,MAAM,SAAS,WAAW;AAC7C,WAAK;AACL;AAAA,IACF;AAGA,QAAK,UAAU,OAAQ,MAAM,SAAS,WAAW,MAAM,SAAS,aAAa,MAAM,SAAS,YAAY,MAAM,SAAS,OAAO;AAC5H,aAAO;AACP;AAAA,IACF;AAGA,QAAI,UAAU,OAAO,MAAM,SAAS,UAAU;AAC5C,aAAO;AACP;AAAA,IACF;AAGA,QAAI,UAAU,OAAO,MAAM,SAAS,SAAS,CAAC,YAAY;AACxD,aAAO;AACP;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,SAAS,YAAY,MAAM;AAC/B,aAAS,UAAQ;AACf,cAAQ,KAAK,MAAM;AAAA,QACjB,KAAK;AACH,iBAAO,EAAE,GAAG,MAAM,MAAM,SAAS,OAAO,MAAM,OAAO,KAAK;AAAA,QAC5D,KAAK;AACH,iBAAO,EAAE,GAAG,MAAM,MAAM,SAAS,QAAQ,IAAI,OAAO,KAAK;AAAA,QAC3D,KAAK;AACH,iBAAO,EAAE,GAAG,MAAM,MAAM,UAAU,YAAY,MAAM,eAAe,MAAM,OAAO,MAAM,OAAO,KAAK;AAAA,QACpG,KAAK;AACH,iBAAO,EAAE,GAAG,MAAM,MAAM,OAAO,OAAO,KAAK;AAAA,QAC7C;AACE,iBAAO;AAAA,MACX;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,oBAAoB,YAAY,CAAC,UAAiB;AACtD,aAAS,WAAS,EAAE,GAAG,MAAM,OAAO,MAAM,SAAS,OAAO,KAAK,EAAE;AAAA,EACnE,GAAG,CAAC,CAAC;AAEL,QAAM,oBAAoB,YAAY,CAAC,UAAiB;AACtD,aAAS,WAAS,EAAE,GAAG,MAAM,OAAO,MAAM,UAAU,OAAO,KAAK,EAAE;AAAA,EACpE,GAAG,CAAC,CAAC;AAEL,QAAM,qBAAqB,YAAY,CAAC,WAAmB;AACzD,aAAS,WAAS,EAAE,GAAG,MAAM,QAAQ,OAAO,KAAK,EAAE;AAAA,EACrD,GAAG,CAAC,CAAC;AAEL,QAAM,sBAAsB,YAAY,MAAM;AAE5C,UAAM,YAAY,WAAW,MAAM,MAAM;AACzC,QAAI,MAAM,SAAS,KAAK,aAAa,GAAG;AACtC,eAAS,WAAS,EAAE,GAAG,MAAM,OAAO,uCAAuC,EAAE;AAC7E;AAAA,IACF;AAEA,aAAS,WAAS,EAAE,GAAG,MAAM,MAAM,OAAO,OAAO,KAAK,EAAE;AAAA,EAC1D,GAAG,CAAC,MAAM,MAAM,CAAC;AAEjB,QAAM,kBAAkB,YAAY,CAAC,QAAgB;AACnD,aAAS,WAAS,EAAE,GAAG,MAAM,YAAY,KAAK,OAAO,KAAK,EAAE;AAAA,EAC9D,GAAG,CAAC,CAAC;AAEL,QAAM,mBAAmB,YAAY,YAAY;AAC/C,QAAI,CAAC,MAAM,cAAc,CAAC,MAAM,SAAS,CAAC,MAAM,MAAO;AAGvD,UAAM,mBAAmB,MAAM,WAAW,WAAW,IAAI,IAAI,MAAM,WAAW,MAAM,CAAC,IAAI,MAAM;AAC/F,QAAI,CAAC,oBAAoB,KAAK,gBAAgB,GAAG;AAC/C,eAAS,WAAS,EAAE,GAAG,MAAM,OAAO,0DAA0D,EAAE;AAChG;AAAA,IACF;AAEA,kBAAc,IAAI;AAElB,QAAI;AAEF,YAAM,gBAAgB,MAAM,WAAW,WAAW,IAAI,IAAI,MAAM,aAAa,KAAK,MAAM,UAAU;AAClG,YAAM,UAAU,MAAM,yBAAyB,aAAa;AAC5D,eAAS,WAAS,EAAE,GAAG,MAAM,eAAe,SAAS,YAAY,cAAc,EAAE;AAGjF,YAAM,wBAAwB,WAAW,MAAM,MAAM,IAAI,KAAK,IAAI,IAAI,MAAM,MAAO,QAAQ,GAAG,SAAS;AAEvG,YAAM,QAAQ,MAAM,SAAS;AAAA,QAC3B,aAAa,MAAM,MAAO;AAAA,QAC1B,WAAW;AAAA,QACX,WAAW,MAAM,MAAO;AAAA,QACxB,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,aAAa;AAAA,MACf,CAAC;AAED,eAAS,WAAS,EAAE,GAAG,MAAM,OAAO,MAAM,WAAW,OAAO,KAAK,EAAE;AAAA,IACrE,SAAS,KAAK;AACZ,YAAM,QAAQ,eAAe,QAAQ,IAAI,UAAU;AACnD,eAAS,WAAS,EAAE,GAAG,MAAM,MAAM,EAAE;AAAA,IACvC,UAAE;AACA,oBAAc,KAAK;AAAA,IACrB;AAAA,EACF,GAAG,CAAC,MAAM,YAAY,MAAM,OAAO,MAAM,OAAO,MAAM,MAAM,CAAC;AAE7D,QAAM,gBAAgB,YAAY,MAAM;AACtC,aAAS,WAAS,EAAE,GAAG,MAAM,MAAM,WAAW,OAAO,KAAK,EAAE;AAAA,EAC9D,GAAG,CAAC,CAAC;AAEL,QAAM,0BAA0B,YAAY,CAAC,WAA4B;AACvE,aAAS,WAAS,EAAE,GAAG,MAAM,iBAAiB,QAAQ,iBAAiB,YAAY,EAAE;AAAA,EACvF,GAAG,CAAC,CAAC;AAEL,QAAM,uBAAuB,YAAY,CAAC,UAAiB;AACzD,aAAS,WAAS,EAAE,GAAG,MAAM,OAAO,MAAM,SAAS,iBAAiB,SAAS,EAAE;AAAA,EACjF,GAAG,CAAC,CAAC;AAGL,QAAM,oBAAoB,MAAM;AAC9B,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK;AACH,eACE,gBAAAL;AAAA,UAAC;AAAA;AAAA,YACC,UAAU;AAAA,YACV,eAAe,MAAM;AAAA;AAAA,QACvB;AAAA,MAGJ,KAAK;AACH,YAAI,CAAC,MAAM,MAAO,QAAO;AACzB,eACE,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,MAAM;AAAA,YACb,UAAU;AAAA,YACV,eAAe,MAAM;AAAA;AAAA,QACvB;AAAA,MAGJ,KAAK;AACH,YAAI,CAAC,MAAM,SAAS,CAAC,MAAM,MAAO,QAAO;AACzC,eACE,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,MAAM;AAAA,YACb,OAAO,MAAM;AAAA,YACb,QAAQ,MAAM;AAAA,YACd,gBAAgB;AAAA,YAChB,WAAW;AAAA,YACX,OAAO,MAAM;AAAA;AAAA,QACf;AAAA,MAGJ,KAAK;AACH,YAAI,CAAC,MAAM,SAAS,CAAC,MAAM,MAAO,QAAO;AACzC,eACE,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,YAAY,MAAM,cAAc;AAAA,YAChC,eAAe,MAAM;AAAA,YACrB,aAAa;AAAA,YACb,WAAW;AAAA,YACX,OAAO,MAAM;AAAA,YACb,SAAS;AAAA;AAAA,QACX;AAAA,MAGJ,KAAK;AACH,YAAI,CAAC,MAAM,SAAS,CAAC,MAAM,MAAO,QAAO;AACzC,eACE,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,MAAM;AAAA,YACb,OAAO,MAAM;AAAA,YACb,QAAQ,MAAM;AAAA,YACd,OAAO,MAAM;AAAA,YACb,eAAe,MAAM;AAAA,YACrB,WAAW;AAAA;AAAA,QACb;AAAA,MAGJ,KAAK;AACH,YAAI,CAAC,MAAM,SAAS,CAAC,MAAM,SAAS,CAAC,MAAM,SAAS,CAAC,MAAM,WAAY,QAAO;AAC9E,eACE,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,MAAM;AAAA,YACb,OAAO,MAAM;AAAA,YACb,QAAQ,MAAM;AAAA,YACd,OAAO,MAAM;AAAA,YACb,YAAY,MAAM;AAAA,YAClB,YAAY;AAAA,YACZ,SAAS;AAAA;AAAA,QACX;AAAA,MAGJ;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAEA,SACE,gBAAAC,MAACC,MAAA,EAAI,eAAc,UAAS,SAAS,GAEnC;AAAA,oBAAAF,KAAC,UAAO,aAAW,MAAC,SAAQ,qCAAoC;AAAA,IAGhE,gBAAAA,KAAC,iBAAc,aAAa,MAAM,MAAM;AAAA,IAGxC,gBAAAA,KAACE,MAAA,EAAI,eAAc,UAAS,SAAS,GAClC,4BAAkB,GACrB;AAAA,IAGA,gBAAAF,KAAC,mBAAgB,MAAM,MAAM,MAAM;AAAA,KACrC;AAEJ;;;AUj+BA,SAAgB,YAAAM,WAAU,aAAAC,kBAAiB;AAC3C,SAAS,OAAAC,MAAK,QAAAC,OAAM,UAAAC,eAAc;AAClC;AAAA,EACE,QAAAC;AAAA,EACA,aAAAC;AAAA,EACA;AAAA,EACA,qBAAAC;AAAA,EACA,yBAAAC;AAAA,OAIK;AAoGC,gBAAAC,MA8CI,QAAAC,aA9CJ;AA5ER,SAAS,YAAY,QAAgB,UAA0B;AAC7D,QAAM,CAAC,OAAO,WAAW,EAAE,IAAI,OAAO,MAAM,GAAG;AAC/C,QAAM,iBAAiB,SAAS,OAAO,UAAU,GAAG,EAAE,MAAM,GAAG,QAAQ;AACvE,UAAQ,SAAS,OAAO;AAC1B;AAKA,SAAS,aAAa,QAAgB,UAA0B;AAC9D,QAAM,SAAS,OAAO,SAAS,WAAW,GAAG,GAAG;AAChD,QAAM,cAAc,OAAO,MAAM,GAAG,CAAC,QAAQ,KAAK;AAClD,QAAM,cAAc,OAAO,MAAM,CAAC,QAAQ;AAC1C,QAAM,iBAAiB,YAAY,QAAQ,OAAO,EAAE;AACpD,SAAO,iBAAiB,GAAG,WAAW,IAAI,cAAc,KAAK;AAC/D;AAKA,SAAS,WAAW,SAAyB;AAC3C,MAAI,UAAU,IAAI;AAChB,WAAO,IAAI,OAAO;AAAA,EACpB;AACA,QAAM,UAAU,KAAK,KAAK,UAAU,EAAE;AACtC,SAAO,IAAI,OAAO,UAAU,UAAU,IAAI,MAAM,EAAE;AACpD;AAKA,SAAS,UAAU,QAAwB;AACzC,SAAO,IAAI,OAAO,QAAQ,CAAC,CAAC;AAC9B;AAKA,SAAS,oBAAoB,OAAsB;AACjD,QAAM,YAAY,MAAM,MAAM,IAAI,UAAQ,KAAK,IAAI;AAEnD,QAAM,cAAc,CAAC,GAAG,IAAI,IAAI,SAAS,CAAC;AAC1C,SAAO,YAAY,KAAK,MAAM;AAChC;AAKA,SAAS,SAAS;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMG;AACD,QAAM,cAAc,aAAa,MAAM,YAAY,YAAY,QAAQ;AACvE,QAAM,eAAe,aAAa,MAAM,UAAU,UAAU,QAAQ;AACpE,QAAM,mBAAmB,oBAAoB,KAAK;AAClD,QAAM,gBAAgB,WAAW,MAAM,aAAa;AACpD,QAAM,YAAY,UAAU,MAAM,KAAK,QAAQ;AAG/C,QAAM,UAAU,UAAU,MAAM,KAAK,MAAM;AAC3C,QAAM,aAAa,UAAU,MAAM,KAAK,YAAY;AACpD,QAAM,eAAe,UAAU,MAAM,KAAK,cAAc;AAExD,SACE,gBAAAD,KAACE,MAAA,EAAI,eAAc,UACjB,0BAAAD,MAAC,OAAU,UAAQ,MAAC,OAAM,gBAAe,SAAS,GAEhD;AAAA,oBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,EAAE,KAAK,QAAQ,OAAO,GAAG,WAAW,IAAI,YAAY,MAAM,KAAK,UAAU,IAAI,IAAI;AAAA,UACjF,EAAE,KAAK,MAAM,OAAO,IAAI,YAAY,IAAI,UAAU,MAAM,KAAK,OAAO,IAAI;AAAA,QAC1E;AAAA,QACA,UAAU,MAAM;AAAA,QAChB,YAAY,MAAM;AAAA;AAAA,IACpB;AAAA,IAEA,gBAAAA,KAACE,MAAA,EAAI,SAAS,GACZ,0BAAAF,KAAC,WAAQ,OAAO,IAAI,GACtB;AAAA,IAGA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,EAAE,KAAK,SAAS,OAAO,iBAAiB;AAAA,UACxC,EAAE,KAAK,QAAQ,OAAO,cAAc;AAAA,UACpC,EAAE,KAAK,QAAQ,OAAO,UAAU;AAAA,QAClC;AAAA,QACA,UAAU,MAAM;AAAA,QAChB,YAAY,MAAM;AAAA;AAAA,IACpB;AAAA,IAEA,gBAAAA,KAACE,MAAA,EAAI,SAAS,GACZ,0BAAAF,KAAC,WAAQ,OAAO,IAAI,GACtB;AAAA,IAGA,gBAAAA,KAACE,MAAA,EAAI,cAAc,GACjB,0BAAAF,KAACG,OAAA,EAAK,OAAO,MAAM,OAAO,MAAI,MAAC,4BAAc,GAC/C;AAAA,IACA,gBAAAH;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,EAAE,KAAK,SAAS,OAAO,QAAQ;AAAA,UAC/B,EAAE,KAAK,YAAY,OAAO,WAAW;AAAA,UACrC,EAAE,KAAK,cAAc,OAAO,aAAa;AAAA,UACzC,EAAE,KAAK,WAAW,OAAO,UAAU;AAAA,QACrC;AAAA,QACA,UAAU,MAAM;AAAA,QAChB,YAAY,MAAM;AAAA;AAAA,IACpB;AAAA,IAGC,MAAM,cACL,gBAAAA,KAACE,MAAA,EAAI,WAAW,GACd,0BAAAD,MAACE,OAAA,EAAK,OAAO,MAAM,SAChB;AAAA,cAAQ;AAAA,MAAQ;AAAA,OAAsB,MAAM,cAAc,KAAK,QAAQ,CAAC;AAAA,MAAE;AAAA,OAC7E,GACF;AAAA,IAIF,gBAAAH,KAACE,MAAA,EAAI,WAAW,GACd,0BAAAD,MAACE,OAAA,EAAK,OAAO,MAAM,OAAO;AAAA;AAAA,MACR,MAAM;AAAA,MAAyB;AAAA,MAAE,UAAU;AAAA,OAC7D,GACF;AAAA,KACF,GACF;AAEJ;AAKA,SAAS,WAAW,EAAE,OAAO,WAAW,YAAY,GAIjD;AACD,QAAM,WAAW;AAAA,IACf,OAAO;AAAA,MACL,IAAI,MAAM;AAAA,MACV,MAAM;AAAA,QACJ,OAAO,UAAU;AAAA,QACjB,SAAS,UAAU;AAAA,QACnB,OAAO,YAAY;AAAA,QACnB,QAAQ,aAAa,MAAM,YAAY,YAAY,QAAQ;AAAA,QAC3D,WAAW,MAAM;AAAA,MACnB;AAAA,MACA,IAAI;AAAA,QACF,OAAO;AAAA,QACP,SAASC;AAAA,QACT,OAAO,MAAM,QAAQ;AAAA,QACrB,QAAQ,aAAa,MAAM,UAAU,MAAM,QAAQ,QAAQ;AAAA,QAC3D,WAAW,MAAM;AAAA,MACnB;AAAA,MACA,OAAO;AAAA,QACL,OAAO,MAAM,MAAM,IAAI,WAAS;AAAA,UAC9B,MAAM,KAAK;AAAA,UACX,MAAM,KAAK;AAAA,UACX,WAAW,KAAK;AAAA,UAChB,SAAS,KAAK;AAAA,UACd,eAAe,KAAK;AAAA,QACtB,EAAE;AAAA,QACF,YAAY,MAAM,MAAM;AAAA,MAC1B;AAAA,MACA,MAAM;AAAA,QACJ,OAAO,MAAM,KAAK;AAAA,QAClB,KAAK,MAAM,KAAK;AAAA,QAChB,QAAQ,MAAM,KAAK;AAAA,QACnB,UAAU,MAAM,KAAK;AAAA,MACvB;AAAA,MACA,eAAe,MAAM;AAAA,MACrB,aAAa,MAAM;AAAA,MACnB,YAAY,MAAM;AAAA,MAClB,mBAAmB,MAAM;AAAA,MACzB,iBAAiB,MAAM;AAAA,MACvB,WAAW,MAAM;AAAA,IACnB;AAAA,EACF;AAEA,SAAO,gBAAAJ,KAACG,OAAA,EAAM,eAAK,UAAU,UAAU,MAAM,CAAC,GAAE;AAClD;AAKA,SAAS,aAAa,EAAE,QAAQ,GAAwB;AACtD,SACE,gBAAAF,MAACC,MAAA,EAAI,eAAc,UAAS,SAAS,GACnC;AAAA,oBAAAF,KAACE,MAAA,EACC,0BAAAD,MAACE,OAAA,EAAK,OAAO,MAAM,OAAO,MAAI,MAC3B;AAAA,cAAQ;AAAA,MAAO;AAAA,MAAS;AAAA,OAC3B,GACF;AAAA,IACA,gBAAAH,KAACE,MAAA,EAAI,WAAW,GACd,0BAAAF,KAACG,OAAA,EAAK,OAAO,MAAM,OAAO,qFAE1B,GACF;AAAA,IACA,gBAAAH,KAACE,MAAA,EAAI,WAAW,GACd,0BAAAF,KAACG,OAAA,EAAK,OAAO,MAAM,OAAO,+EAAiE,GAC7F;AAAA,KACF;AAEJ;AAKO,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAsB;AACpB,QAAM,EAAE,KAAK,IAAIE,QAAO;AACxB,QAAM,CAAC,SAAS,UAAU,IAAIC,UAAS,IAAI;AAC3C,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAwB,IAAI;AACtD,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAuB,IAAI;AACrD,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAuB,IAAI;AACjE,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAuB,IAAI;AACjE,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAuB,IAAI;AAE7D,EAAAC,WAAU,MAAM;AACd,mBAAe,aAAa;AAC1B,UAAI;AACF,mBAAW,IAAI;AACf,iBAAS,IAAI;AAGb,cAAM,YAAY,WAAW,MAAM;AACnC,YAAI,MAAM,SAAS,KAAK,aAAa,GAAG;AACtC,gBAAM,IAAI,MAAM,mDAAmD;AAAA,QACrE;AAGA,cAAM,iBAAiB,MAAMC,WAAU;AACvC,cAAM,QAAQ,eAAe,OAAO;AAAA,UAClC,OACE,EAAE,KAAK,YAAY,MAAM,UAAU,YAAY,KAC/C,EAAE,IAAI,YAAY,MAAM,UAAU,YAAY;AAAA,QAClD;AAEA,YAAI,CAAC,OAAO;AACV,gBAAM,kBAAkB,eAAe,OAAO,IAAI,OAAK,EAAE,IAAI,EAAE,KAAK,IAAI;AACxE,gBAAM,IAAI;AAAA,YACR,mBAAmB,SAAS,wBAAwB,eAAe;AAAA,UACrE;AAAA,QACF;AACA,uBAAe,KAAK;AAGpB,cAAM,iBAAiB,MAAM,UAAU,MAAM,EAAE;AAC/C,cAAM,aAAa,eAAe,OAAO;AAAA,UACvC,OAAK,EAAE,OAAO,YAAY,MAAM,MAAM,YAAY;AAAA,QACpD;AAEA,YAAI,CAAC,YAAY;AACf,gBAAM,kBAAkB,eAAe,OACpC,MAAM,GAAG,EAAE,EACX,IAAI,OAAK,EAAE,MAAM,EACjB,KAAK,IAAI;AACZ,gBAAM,IAAI;AAAA,YACR,UAAU,KAAK,kBAAkB,MAAM,IAAI,+BAA+B,eAAe;AAAA,UAC3F;AAAA,QACF;AACA,uBAAe,UAAU;AAGzB,cAAM,mBAA0B;AAAA,UAC9B,SAASC;AAAA,UACT,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,UAAU;AAAA,UACV,SAAS;AAAA,UACT,SAASL;AAAA,QACX;AACA,qBAAa,gBAAgB;AAG7B,cAAM,OAAO,IAAIM,MAAK,EAAE,YAAY,WAAW,CAAC;AAChD,cAAM,cAAc,MAAM,KAAK,SAAS;AAAA,UACtC,aAAa,MAAM;AAAA,UACnB,WAAWN;AAAA,UACX,WAAW,WAAW;AAAA,UACtB,SAASK;AAAA,UACT,YAAY,YAAY,QAAQ,WAAW,QAAQ;AAAA,UACnD,aAAa;AAAA;AAAA,QACf,CAAC;AAED,iBAAS,WAAW;AAAA,MACtB,SAAS,KAAK;AACZ,cAAM,UAAU,eAAe,QAAQ,IAAI,UAAU;AACrD,iBAAS,OAAO;AAAA,MAClB,UAAE;AACA,mBAAW,KAAK;AAAA,MAClB;AAAA,IACF;AAEA,eAAW;AAAA,EACb,GAAG,CAAC,WAAW,OAAO,MAAM,CAAC;AAG7B,EAAAF,WAAU,MAAM;AACd,QAAI,CAAC,WAAW,YAAY;AAE1B,YAAM,QAAQ,WAAW,MAAM,KAAK,GAAG,GAAG;AAC1C,aAAO,MAAM,aAAa,KAAK;AAAA,IACjC;AAAA,EACF,GAAG,CAAC,SAAS,YAAY,IAAI,CAAC;AAE9B,MAAI,SAAS;AACX,WACE,gBAAAP,KAACE,MAAA,EAAI,SAAS,GACZ,0BAAAF,KAAC,WAAQ,MAAM,sBAAsB,MAAM,IAAI,KAAK,SAAS,SAAS,OAAO,GAC/E;AAAA,EAEJ;AAEA,MAAI,OAAO;AACT,WAAO,gBAAAA,KAAC,gBAAa,SAAS,OAAO;AAAA,EACvC;AAEA,MAAI,CAAC,SAAS,CAAC,eAAe,CAAC,eAAe,CAAC,WAAW;AACxD,WAAO,gBAAAA,KAAC,gBAAa,SAAQ,8BAA6B;AAAA,EAC5D;AAEA,MAAI,YAAY;AACd,WAAO,gBAAAA,KAAC,cAAW,OAAc,WAAW,aAAa,aAA0B;AAAA,EACrF;AAEA,SACE,gBAAAC,MAACC,MAAA,EAAI,eAAc,UAAS,SAAS,GACnC;AAAA,oBAAAF;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW;AAAA,QACX,SAAS,YAAY,gBAAgB,gBAAgB;AAAA,QACrD;AAAA,QACA;AAAA;AAAA,IACF;AAAA,IAGA,gBAAAA,KAACE,MAAA,EAAI,WAAW,GACd,0BAAAD,MAACE,OAAA,EAAK,OAAO,MAAM,OAAO;AAAA;AAAA,MACJ,IAAI,KAAK,MAAM,SAAS,EAAE,mBAAmB;AAAA,OACnE,GACF;AAAA,KACF;AAEJ;;;AC1YA,SAAgB,YAAAQ,WAAU,aAAAC,kBAAiB;AAC3C,SAAS,OAAAC,OAAK,QAAAC,QAAM,UAAAC,eAAc;AAClC;AAAA,EACE,aAAAC;AAAA,EACA,qBAAAC;AAAA,OAEK;AAuGD,SACE,OAAAC,OADF,QAAAC,cAAA;AAzFN,IAAM,oBAAoB;AAAA,EACxB;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AACF;AAcO,SAAS,cAAc,EAAE,OAAO,MAAM,GAAuB;AAClE,QAAM,EAAE,KAAK,IAAIC,QAAO;AACxB,QAAM,CAAC,QAAQ,SAAS,IAAIC,UAAqB,CAAC,CAAC;AACnD,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,IAAI;AAC3C,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAwB,IAAI;AAEtD,EAAAC,WAAU,MAAM;AACd,mBAAe,aAAa;AAC1B,UAAI;AACF,mBAAW,IAAI;AACf,iBAAS,IAAI;AAEb,cAAM,WAAW,MAAMC,WAAU;AAGjC,cAAM,YAAwB,SAAS,OAAO,IAAI,CAAC,WAAkB;AAAA,UACnE,MAAM,MAAM;AAAA,UACZ,IAAI,MAAM;AAAA,UACV,MAAM;AAAA,QACR,EAAE;AAGF,cAAM,cAAc,UAAU,KAAK,OAAK,EAAE,OAAOC,kBAAiB;AAClE,YAAI,CAAC,aAAa;AAChB,oBAAU,KAAK;AAAA,YACb,MAAM;AAAA,YACN,IAAIA;AAAA,YACJ,MAAM;AAAA,UACR,CAAC;AAAA,QACH,OAAO;AACL,gBAAM,gBAAgB,UAAU,KAAK,OAAK,EAAE,OAAOA,kBAAiB;AACpE,cAAI,eAAe;AACjB,0BAAc,OAAO;AAAA,UACvB;AAAA,QACF;AAEA,kBAAU,SAAS;AAAA,MACrB,SAAS,KAAK;AACZ,iBAAS,eAAe,QAAQ,IAAI,UAAU,uBAAuB;AAAA,MACvE,UAAE;AACA,mBAAW,KAAK;AAAA,MAClB;AAAA,IACF;AACA,eAAW;AAAA,EACb,GAAG,CAAC,CAAC;AAGL,EAAAF,WAAU,MAAM;AACd,QAAI,CAAC,WAAW,MAAM;AACpB,iBAAW,MAAM,KAAK,GAAG,GAAG;AAAA,IAC9B;AAAA,EACF,GAAG,CAAC,SAAS,MAAM,IAAI,CAAC;AAGxB,MAAI,MAAM;AACR,QAAI,QAAS,QAAO;AACpB,QAAI,OAAO;AACT,cAAQ,MAAM,KAAK,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;AAChD,aAAO;AAAA,IACT;AACA,YAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC3C,WAAO;AAAA,EACT;AAEA,MAAI,SAAS;AACX,WACE,gBAAAH,OAACM,OAAA,EAAI,eAAc,UAAS,SAAS,GACnC;AAAA,sBAAAP,MAAC,UAAO,SAAO,MAAC,aAAa,OAAO;AAAA,MACpC,gBAAAA,MAAC,WAAQ,MAAK,+BAA8B;AAAA,OAC9C;AAAA,EAEJ;AAEA,MAAI,OAAO;AACT,WACE,gBAAAC,OAACM,OAAA,EAAI,eAAc,UAAS,SAAS,GACnC;AAAA,sBAAAP,MAAC,UAAO,SAAO,MAAC,aAAa,OAAO;AAAA,MACpC,gBAAAA,MAACO,OAAA,EACC,0BAAAN,OAACO,QAAA,EAAK,OAAO,MAAM,OAAQ;AAAA,gBAAQ;AAAA,QAAO;AAAA,QAAS;AAAA,SAAM,GAC3D;AAAA,OACF;AAAA,EAEJ;AAGA,QAAM,YAAwB,OAAO,IAAI,CAAC,WAAW;AAAA,IACnD,IAAI,MAAM;AAAA,IACV,OAAO,MAAM;AAAA,IACb,UAAU,OAAO,MAAM,EAAE;AAAA,IACzB,OAAO,MAAM;AAAA,IACb,YAAY,MAAM,SAAS,WAAW,MAAM,UAAU,MAAM;AAAA,EAC9D,EAAE;AAEF,SACE,gBAAAP,OAACM,OAAA,EAAI,eAAc,UAAS,SAAS,GACnC;AAAA,oBAAAP,MAAC,UAAO,SAAO,MAAC,aAAa,OAAO;AAAA,IAEpC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,QACP,OAAM;AAAA,QACN,aAAY;AAAA,QACZ,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,YAAY;AAAA;AAAA,IACd;AAAA,IAEA,gBAAAA,MAACO,OAAA,EAAI,WAAW,GACd,0BAAAP,MAACQ,QAAA,EAAK,OAAO,MAAM,OAAO,UAAQ,MAAC,mGAEnC,GACF;AAAA,KACF;AAEJ;;;AC5JA,SAAgB,YAAAC,WAAU,aAAAC,kBAAiB;AAC3C,SAAS,OAAAC,OAAK,QAAAC,QAAM,UAAAC,eAAc;AAClC;AAAA,EACE,aAAAC;AAAA,EACA,uBAAAC;AAAA,OAGK;AAmLD,SACE,OAAAC,OADF,QAAAC,cAAA;AArKN,IAAM,wBAAwB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAKA,SAAS,gBAAgB,SAAyB;AAChD,MAAI,QAAQ,UAAU,GAAI,QAAO;AACjC,SAAO,GAAG,QAAQ,MAAM,GAAG,CAAC,CAAC,MAAM,QAAQ,MAAM,EAAE,CAAC;AACtD;AAgBA,eAAe,eAAe,YAA4E;AACxG,QAAM,WAAW,MAAMC,WAAU;AAGjC,QAAM,YAAY,SAAS,YAAY,EAAE;AACzC,MAAI,CAAC,MAAM,SAAS,GAAG;AACrB,UAAMC,SAAQ,SAAS,OAAO,KAAK,CAAC,MAAa,EAAE,OAAO,SAAS;AACnE,QAAIA,QAAO;AACT,aAAO,EAAE,SAASA,OAAM,IAAI,WAAWA,OAAM,KAAK;AAAA,IACpD;AAEA,WAAO,EAAE,SAAS,WAAW,WAAW,WAAW;AAAA,EACrD;AAGA,QAAM,aAAa,WAAW,YAAY;AAC1C,QAAM,QAAQ,SAAS,OAAO;AAAA,IAAK,CAAC,MAClC,EAAE,KAAK,YAAY,MAAM,cACzB,EAAE,KAAK,YAAY,MAAM;AAAA,EAC3B;AAEA,MAAI,OAAO;AACT,WAAO,EAAE,SAAS,MAAM,IAAI,WAAW,MAAM,KAAK;AAAA,EACpD;AAEA,SAAO;AACT;AAKO,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA,OAAO;AACT,GAGG;AACD,QAAM,EAAE,KAAK,IAAIC,QAAO;AACxB,QAAM,CAAC,QAAQ,SAAS,IAAIC,UAAqB,CAAC,CAAC;AACnD,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,IAAI;AAC3C,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAwB,IAAI;AACtD,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAiB,EAAE;AACrD,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,UAAkB,CAAC,CAAC;AAElE,EAAAC,WAAU,MAAM;AACd,mBAAe,aAAa;AAC1B,UAAI;AACF,mBAAW,IAAI;AACf,iBAAS,IAAI;AAGb,YAAI,CAAC,OAAO;AACV,gBAAM,iBAAiB,MAAMJ,WAAU;AACvC,6BAAmB,eAAe,MAAM;AACxC,mBAAS,+CAA+C;AACxD,qBAAW,KAAK;AAChB;AAAA,QACF;AAGA,cAAM,WAAW,MAAM,eAAe,KAAK;AAC3C,YAAI,CAAC,UAAU;AACb,gBAAM,iBAAiB,MAAMA,WAAU;AACvC,6BAAmB,eAAe,MAAM;AACxC,mBAAS,mBAAmB,KAAK,GAAG;AACpC,qBAAW,KAAK;AAChB;AAAA,QACF;AAEA,qBAAa,SAAS,SAAS;AAG/B,cAAM,WAAW,MAAMK,qBAAoB,SAAS,OAAO;AAG3D,cAAM,YAAwB,SAAS,OACpC,OAAO,CAAC,UAAiB,MAAM,UAAU,MAAM,OAAO,KAAK,MAAM,EAAE,EACnE,IAAI,CAAC,WAAkB;AAAA,UACtB,QAAQ,MAAM;AAAA,UACd,SAAS,MAAM;AAAA,UACf,gBAAgB,gBAAgB,MAAM,OAAO;AAAA,UAC7C,UAAU,MAAM;AAAA,UAChB,MAAM,MAAM;AAAA,QACd,EAAE;AAEJ,kBAAU,SAAS;AAAA,MACrB,SAAS,KAAK;AACZ,iBAAS,eAAe,QAAQ,IAAI,UAAU,uBAAuB;AAAA,MACvE,UAAE;AACA,mBAAW,KAAK;AAAA,MAClB;AAAA,IACF;AACA,eAAW;AAAA,EACb,GAAG,CAAC,KAAK,CAAC;AAGV,EAAAD,WAAU,MAAM;AACd,QAAI,CAAC,WAAW,MAAM;AACpB,iBAAW,MAAM,KAAK,GAAG,GAAG;AAAA,IAC9B;AAAA,EACF,GAAG,CAAC,SAAS,MAAM,IAAI,CAAC;AAGxB,MAAI,MAAM;AACR,QAAI,QAAS,QAAO;AACpB,QAAI,SAAS,CAAC,gBAAgB,QAAQ;AACpC,cAAQ,MAAM,KAAK,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;AAChD,aAAO;AAAA,IACT;AACA,QAAI,SAAS,gBAAgB,QAAQ;AACnC,cAAQ,MAAM,KAAK,UAAU;AAAA,QAC3B;AAAA,QACA,iBAAiB,gBAAgB,IAAI,QAAM,EAAE,MAAM,EAAE,MAAM,IAAI,EAAE,GAAG,EAAE;AAAA,MACxE,GAAG,MAAM,CAAC,CAAC;AACX,aAAO;AAAA,IACT;AACA,YAAQ,IAAI,KAAK,UAAU,OAAO,IAAI,QAAM;AAAA,MAC1C,QAAQ,EAAE;AAAA,MACV,SAAS,EAAE;AAAA,MACX,UAAU,EAAE;AAAA,MACZ,MAAM,EAAE;AAAA,IACV,EAAE,GAAG,MAAM,CAAC,CAAC;AACb,WAAO;AAAA,EACT;AAEA,MAAI,SAAS;AACX,WACE,gBAAAL,OAACO,OAAA,EAAI,eAAc,UAAS,SAAS,GACnC;AAAA,sBAAAR,MAAC,UAAO,SAAO,MAAC,aAAa,OAAO;AAAA,MACpC,gBAAAA,MAAC,WAAQ,MAAM,QAAQ,sBAAsB,KAAK,QAAQ,cAAc;AAAA,OAC1E;AAAA,EAEJ;AAEA,MAAI,OAAO;AAET,UAAM,kBAAkB,CAAC,GAAG,OAAO,IAAI,KAAK,MAAM,KAAK;AACvD,UAAM,gBAAgB,gBACnB,OAAO,OAAK,gBAAgB,SAAS,EAAE,EAAE,CAAC,EAC1C,MAAM,GAAG,CAAC;AAEb,WACE,gBAAAC,OAACO,OAAA,EAAI,eAAc,UAAS,SAAS,GACnC;AAAA,sBAAAR,MAAC,UAAO,SAAO,MAAC,aAAa,OAAO;AAAA,MACpC,gBAAAA,MAACQ,OAAA,EAAI,cAAc,GACjB,0BAAAP,OAACQ,QAAA,EAAK,OAAO,MAAM,OAAQ;AAAA,gBAAQ;AAAA,QAAO;AAAA,QAAE;AAAA,SAAM,GACpD;AAAA,MAEC,gBAAgB,SAAS,KACxB,gBAAAR,OAACO,OAAA,EAAI,eAAc,UACjB;AAAA,wBAAAR,MAACQ,OAAA,EAAI,cAAc,GACjB,0BAAAR,MAACS,QAAA,EAAK,OAAO,MAAM,WAAW,6BAAe,GAC/C;AAAA,QACA,gBAAAT,MAACQ,OAAA,EAAI,eAAc,OAAM,KAAK,GAAG,UAAS,QACvC,wBAAc,IAAI,CAAC,MAClB,gBAAAR,MAACQ,OAAA,EACC,0BAAAR,MAACS,QAAA,EAAK,OAAO,MAAM,SAAU,YAAE,KAAK,YAAY,GAAE,KAD1C,EAAE,EAEZ,CACD,GACH;AAAA,QACA,gBAAAT,MAACQ,OAAA,EAAI,WAAW,GACd,0BAAAR,MAACS,QAAA,EAAK,OAAO,MAAM,OAAO,UAAQ,MAAC,mDAEnC,GACF;AAAA,QACA,gBAAAT,MAACQ,OAAA,EAAI,WAAW,GACd,0BAAAP,OAACQ,QAAA,EAAK,OAAO,MAAM,OAAO,UAAQ,MAAC;AAAA;AAAA,UACH,gBAAgB;AAAA,UAAO;AAAA,WACvD,GACF;AAAA,SACF;AAAA,OAEJ;AAAA,EAEJ;AAEA,MAAI,OAAO,WAAW,GAAG;AACvB,WACE,gBAAAR,OAACO,OAAA,EAAI,eAAc,UAAS,SAAS,GACnC;AAAA,sBAAAR,MAAC,UAAO,SAAO,MAAC,aAAa,OAAO;AAAA,MACpC,gBAAAA,MAACQ,OAAA,EACC,0BAAAP,OAACQ,QAAA,EAAK,OAAO,MAAM,SAChB;AAAA,gBAAQ;AAAA,QAAQ;AAAA,QAAiC;AAAA,SACpD,GACF;AAAA,OACF;AAAA,EAEJ;AAGA,QAAM,YAAwB,OAAO,IAAI,CAAC,WAAW;AAAA,IACnD,IAAI,MAAM;AAAA,IACV,OAAO,MAAM;AAAA,IACb,UAAU,MAAM;AAAA,IAChB,OAAO,GAAG,MAAM,QAAQ;AAAA,IACxB,YAAY,MAAM;AAAA,EACpB,EAAE;AAGF,QAAM,kBAAkB,OACrB,OAAO,OAAK,sBAAsB,SAAS,EAAE,OAAO,YAAY,CAAC,CAAC,EAClE,IAAI,OAAK,EAAE,OAAO;AAErB,SACE,gBAAAR,OAACO,OAAA,EAAI,eAAc,UAAS,SAAS,GACnC;AAAA,oBAAAR,MAAC,UAAO,SAAO,MAAC,aAAa,OAAO;AAAA,IAEpC,gBAAAC,OAACO,OAAA,EAAI,cAAc,GACjB;AAAA,sBAAAP,OAACQ,QAAA,EAAK,OAAO,MAAM,WAChB;AAAA,gBAAQ;AAAA,QAAM;AAAA,QAAsB;AAAA,SACvC;AAAA,MACA,gBAAAT,MAACS,QAAA,EAAK,OAAO,MAAM,SAAS,MAAI,MAC7B,qBACH;AAAA,OACF;AAAA,IAEA,gBAAAT;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,QACP,aAAY;AAAA,QACZ,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,YAAY;AAAA;AAAA,IACd;AAAA,IAEA,gBAAAA,MAACQ,OAAA,EAAI,WAAW,GACd,0BAAAR,MAACS,QAAA,EAAK,OAAO,MAAM,OAAO,UAAQ,MAAC,sFAEnC,GACF;AAAA,KACF;AAEJ;;;AClSA,SAAgB,YAAAC,WAAU,aAAAC,YAAW,eAAAC,cAAa,WAAAC,gBAAe;AACjE,SAAS,OAAAC,OAAK,QAAAC,QAAM,UAAAC,eAAc;AAClC;AAAA,EACE,QAAAC;AAAA,OAGK;AAwEM,gBAAAC,OA8FK,QAAAC,cA9FL;AAnDb,SAAS,eAAe,IAAoB;AAC1C,QAAM,UAAU,KAAK,MAAM,KAAK,GAAI;AACpC,MAAI,UAAU,GAAI,QAAO,GAAG,OAAO;AACnC,QAAM,UAAU,KAAK,MAAM,UAAU,EAAE;AACvC,QAAM,mBAAmB,UAAU;AACnC,SAAO,GAAG,OAAO,KAAK,gBAAgB;AACxC;AAcA,SAAS,aAAa,MAAsB;AAC1C,MAAI,KAAK,UAAU,GAAI,QAAO;AAC9B,SAAO,GAAG,KAAK,MAAM,GAAG,CAAC,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;AAChD;AAKA,SAASC,gBAAe,QAAwB;AAC9C,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO,MAAM;AAAA,IACf,KAAK;AACH,aAAO,MAAM;AAAA,IACf,KAAK;AACH,aAAO,MAAM;AAAA,IACf,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,MAAM;AAAA,IACf;AACE,aAAO,MAAM;AAAA,EACjB;AACF;AAKA,SAAS,iBAAiB,QAAiC;AACzD,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO,gBAAAC,MAACC,QAAA,EAAK,OAAO,MAAM,OAAQ,kBAAQ,SAAQ;AAAA,IACpD,KAAK;AACH,aACE,gBAAAD,MAACC,QAAA,EAAK,OAAO,MAAM,SACjB,0BAAAD,MAAC,WAAQ,GACX;AAAA,IAEJ,KAAK;AACH,aAAO,gBAAAA,MAACC,QAAA,EAAK,OAAO,MAAM,SAAU,kBAAQ,WAAU;AAAA,IACxD,KAAK;AACH,aAAO,gBAAAD,MAACC,QAAA,EAAK,OAAO,MAAM,OAAQ,kBAAQ,QAAO;AAAA,IACnD;AACE,aAAO,gBAAAD,MAACC,QAAA,EAAK,OAAO,MAAM,OAAQ,kBAAQ,SAAQ;AAAA,EACtD;AACF;AAKA,SAAS,kBAAkB,OAA6B;AACtD,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,QAAM,iBAAiB,MAAM,OAAO,OAAK,EAAE,WAAW,WAAW,EAAE;AACnE,QAAM,iBAAiB,MAAM,OAAO,OAAK,EAAE,WAAW,WAAW,EAAE;AAEnE,SAAO,KAAK,OAAQ,iBAAiB,iBAAiB,OAAO,MAAM,SAAU,GAAG;AAClF;AAKA,SAAS,mBAAmB,OAAyD;AACnF,QAAM,QAAQ,MAAM;AACpB,QAAM,UAAU,MAAM,UAAU,OAAK,EAAE,WAAW,eAAe,EAAE,WAAW,SAAS;AAEvF,MAAI,YAAY,IAAI;AAClB,WAAO,EAAE,SAAS,OAAO,MAAM;AAAA,EACjC;AAEA,SAAO,EAAE,SAAS,UAAU,GAAG,MAAM;AACvC;AAKA,SAAS,eAAe,UAA2B;AACjD,MAAI,CAAC,SAAU,QAAO;AACtB,QAAM,UAAkC;AAAA,IACtC,UAAU;AAAA,IACV,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AACA,SAAO,QAAQ,QAAQ,KAAK,SAAS,OAAO,CAAC,EAAE,YAAY,IAAI,SAAS,MAAM,CAAC;AACjF;AAKA,SAAS,cAAc;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,QAAM,WAAW,mBAAmB,OAAO,KAAK;AAChD,QAAM,WAAW,kBAAkB,OAAO,KAAK;AAC/C,QAAM,cAAc,OAAO,OAAO,OAAO,CAAC,EAAE,YAAY,IAAI,OAAO,OAAO,MAAM,CAAC;AAEjF,SACE,gBAAAC,OAACC,OAAA,EAAI,eAAc,UAEjB;AAAA,oBAAAH,MAAC,OAAU,UAAQ,MAAC,OAAM,iBAAgB,SAAS,GACjD,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,EAAE,KAAK,MAAM,OAAO,aAAa,MAAM,EAAE;AAAA,UACzC,EAAE,KAAK,UAAU,OAAO,GAAG,WAAW,UAAU,SAAS,OAAO,IAAI,SAAS,KAAK,IAAI;AAAA,QACxF;AAAA,QACA,YAAYD,gBAAe,OAAO,MAAM;AAAA;AAAA,IAC1C,GACF;AAAA,IAGA,gBAAAC,MAACG,OAAA,EAAI,WAAW,GACd,0BAAAH,MAAC,OAAU,UAAQ,MAAC,SAAS,GAC3B,0BAAAE,OAACC,OAAA,EAAI,eAAc,UAChB;AAAA,aAAO,MAAM,IAAI,CAAC,MAAM,UACvB,gBAAAD,OAACC,OAAA,EACC;AAAA,wBAAAH,MAACG,OAAA,EAAI,OAAO,GAAI,2BAAiB,KAAK,MAAM,GAAE;AAAA,QAC9C,gBAAAH,MAACG,OAAA,EAAI,UAAU,GACb,0BAAAD;AAAA,UAACD;AAAA,UAAA;AAAA,YACC,OAAOF,gBAAe,KAAK,MAAM;AAAA,YACjC,MAAM,KAAK,WAAW;AAAA,YACtB,UAAU,KAAK,WAAW;AAAA,YAEzB;AAAA,6BAAe,KAAK,QAAQ;AAAA,cAC5B,KAAK,WAAW,eAAe,WAAW,KAAK,KAAK,QAAQ;AAAA;AAAA;AAAA,QAC/D,GACF;AAAA,QACC,KAAK,UACJ,gBAAAC,MAACG,OAAA,EAAI,YAAY,GACf,0BAAAH,MAACC,QAAA,EAAK,OAAO,MAAM,OAAO,UAAQ,MAC/B,uBAAa,KAAK,MAAM,GAC3B,GACF;AAAA,WAjBM,KAAK,MAmBf,CACD;AAAA,MACA,OAAO,MAAM,WAAW,KACvB,gBAAAD,MAACC,QAAA,EAAK,OAAO,MAAM,OAAO,4BAAc;AAAA,OAE5C,GACF,GACF;AAAA,IAGA,gBAAAD,MAACG,OAAA,EAAI,WAAW,GACd,0BAAAH,MAAC,OAAU,UAAQ,MAAC,SAAS,GAC3B,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,EAAE,KAAK,WAAW,OAAO,eAAe,WAAW,EAAE;AAAA,UACrD;AAAA,YACE,KAAK;AAAA,YACL,OAAO,uBAAuB,OAAO,IAAI,eAAe,kBAAkB,CAAC,KAAK;AAAA,UAClF;AAAA,QACF;AAAA,QACA,UAAU,MAAM;AAAA,QAChB,YAAY,MAAM;AAAA;AAAA,IACpB,GACF,GACF;AAAA,IAGC,OAAO,WAAW,YACjB,gBAAAA,MAACG,OAAA,EAAI,WAAW,GACd,0BAAAH,MAAC,OAAU,UAAQ,MAAC,aAAa,MAAM,OAAO,SAAS,GACrD,0BAAAE,OAACC,OAAA,EAAI,eAAc,UACjB;AAAA,sBAAAD,OAACD,QAAA,EAAK,OAAO,MAAM,OAAO,MAAI,MAC3B;AAAA,gBAAQ;AAAA,QAAO;AAAA,SAClB;AAAA,MACC,OAAO,MAAM,KAAK,OAAK,EAAE,WAAW,QAAQ,GAAG,SAC9C,gBAAAD,MAACG,OAAA,EAAI,WAAW,GACd,0BAAAH,MAACC,QAAA,EAAK,OAAO,MAAM,OAChB,iBAAO,MAAM,KAAK,OAAK,EAAE,WAAW,QAAQ,GAAG,OAClD,GACF;AAAA,OAEJ,GACF,GACF;AAAA,IAID,OAAO,WAAW,eACjB,gBAAAD,MAACG,OAAA,EAAI,WAAW,GACd,0BAAAH,MAAC,OAAU,UAAQ,MAAC,aAAa,MAAM,SAAS,SAAS,GACvD,0BAAAE,OAACC,OAAA,EAAI,eAAc,UACjB;AAAA,sBAAAD,OAACD,QAAA,EAAK,OAAO,MAAM,SAAS,MAAI,MAC7B;AAAA,gBAAQ;AAAA,QAAU;AAAA,SACrB;AAAA,MACC,OAAO,gBACN,gBAAAD,MAACG,OAAA,EAAI,WAAW,GACd,0BAAAH;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,EAAE,KAAK,aAAa,OAAO,aAAa,OAAO,YAAY,EAAE;AAAA,YAC7D,GAAI,OAAO,gBAAgB,CAAC,EAAE,KAAK,cAAc,OAAO,aAAa,OAAO,aAAa,EAAE,CAAC,IAAI,CAAC;AAAA,UACnG;AAAA,UACA,UAAU,MAAM;AAAA,UAChB,YAAY,MAAM;AAAA;AAAA,MACpB,GACF;AAAA,OAEJ,GACF,GACF;AAAA,KAEJ;AAEJ;AAKA,SAAS,aAAa,EAAE,OAAO,GAAuB;AACpD,SACE,gBAAAA,MAACG,OAAA,EAAI,eAAc,UACjB,0BAAAH,MAAC,OAAU,UAAQ,MAAC,OAAM,iBAAgB,SAAS,GACjD,0BAAAA,MAACG,OAAA,EACC,0BAAAH,MAAC,WAAQ,MAAM,cAAc,aAAa,MAAM,CAAC,OAAO,GAC1D,GACF,GACF;AAEJ;AAKA,SAAS,cAAc,EAAE,OAAO,GAAuB;AACrD,SACE,gBAAAA,MAACG,OAAA,EAAI,eAAc,UACjB,0BAAAH,MAAC,OAAU,UAAQ,MAAC,aAAa,MAAM,SAAS,OAAM,iBAAgB,SAAS,GAC7E,0BAAAE,OAACC,OAAA,EAAI,eAAc,UACjB;AAAA,oBAAAD,OAACD,QAAA,EAAK,OAAO,MAAM,SAChB;AAAA,cAAQ;AAAA,MAAQ;AAAA,OACnB;AAAA,IACA,gBAAAD,MAACG,OAAA,EAAI,WAAW,GACd,0BAAAD,OAACD,QAAA,EAAK,OAAO,MAAM,OAAO;AAAA;AAAA,MACnB,aAAa,MAAM;AAAA,OAC1B,GACF;AAAA,IACA,gBAAAD,MAACG,OAAA,EAAI,WAAW,GACd,0BAAAH,MAACC,QAAA,EAAK,OAAO,MAAM,OAAO,UAAQ,MAAC,oHAGnC,GACF;AAAA,KACF,GACF,GACF;AAEJ;AAKA,SAAS,WAAW,EAAE,MAAM,GAAsB;AAChD,SACE,gBAAAD,MAACG,OAAA,EAAI,eAAc,UACjB,0BAAAH,MAAC,OAAU,UAAQ,MAAC,aAAa,MAAM,OAAO,OAAM,SAAQ,SAAS,GACnE,0BAAAE,OAACD,QAAA,EAAK,OAAO,MAAM,OAChB;AAAA,YAAQ;AAAA,IAAO;AAAA,IAAE;AAAA,KACpB,GACF,GACF;AAEJ;AAKO,SAAS,OAAO,EAAE,QAAQ,QAAQ,MAAM,GAAuB;AACpE,QAAM,EAAE,KAAK,IAAIG,QAAO;AACxB,QAAM,CAAC,QAAQ,SAAS,IAAIC,UAAmC,IAAI;AACnE,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,IAAI;AAC3C,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAwB,IAAI;AACtD,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAS,KAAK;AAC9C,QAAM,CAAC,SAAS,IAAIA,UAAS,KAAK,IAAI,CAAC;AACvC,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAS,CAAC;AAGhD,QAAM,OAAOC,SAAQ,MAAM,IAAIC,MAAK,EAAE,YAAY,WAAW,CAAC,GAAG,CAAC,CAAC;AAGnE,QAAM,cAAcC,aAAY,YAAY;AAC1C,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,UAAU,MAAM;AAC1C,UAAI,WAAW,MAAM;AACnB,oBAAY,IAAI;AAChB,mBAAW,KAAK;AAEhB,YAAI,CAAC,OAAO;AACV,qBAAW,MAAM,KAAK,GAAG,GAAG;AAAA,QAC9B;AACA;AAAA,MACF;AACA,gBAAU,MAAM;AAChB,kBAAY,KAAK;AACjB,iBAAW,KAAK;AAGhB,UAAI,CAAC,UAAU,OAAO,WAAW,eAAe,OAAO,WAAW,WAAW;AAC3E,mBAAW,MAAM,KAAK,GAAG,GAAG;AAAA,MAC9B;AAAA,IACF,SAAS,KAAK;AACZ,eAAS,eAAe,QAAQ,IAAI,UAAU,wBAAwB;AACtE,iBAAW,KAAK;AAChB,UAAI,CAAC,OAAO;AACV,mBAAW,MAAM,KAAK,GAAG,GAAG;AAAA,MAC9B;AAAA,IACF;AAAA,EACF,GAAG,CAAC,QAAQ,OAAO,MAAM,IAAI,CAAC;AAG9B,EAAAC,WAAU,MAAM;AACd,gBAAY;AAAA,EACd,GAAG,CAAC,WAAW,CAAC;AAGhB,EAAAA,WAAU,MAAM;AACd,QAAI,CAAC,MAAO;AAEZ,UAAM,WAAW,YAAY,MAAM;AACjC,kBAAY;AAAA,IACd,GAAG,GAAI;AAEP,WAAO,MAAM,cAAc,QAAQ;AAAA,EACrC,GAAG,CAAC,OAAO,WAAW,CAAC;AAGvB,EAAAA,WAAU,MAAM;AACd,UAAM,WAAW,YAAY,MAAM;AACjC,qBAAe,KAAK,IAAI,KAAK,QAAQ,aAAa,UAAU;AAAA,IAC9D,GAAG,GAAI;AAEP,WAAO,MAAM,cAAc,QAAQ;AAAA,EACrC,GAAG,CAAC,QAAQ,WAAW,SAAS,CAAC;AAGjC,QAAM,qBAAqB,UACtB,MAAM;AAEL,UAAM,WAAW,kBAAkB,OAAO,KAAK;AAC/C,QAAI,aAAa,EAAG,QAAO;AAC3B,QAAI,YAAY,IAAK,QAAO;AAE5B,UAAM,UAAU;AAChB,UAAM,iBAAkB,UAAU,WAAY;AAC9C,WAAO,KAAK,IAAI,GAAG,iBAAiB,OAAO;AAAA,EAC7C,GAAG,IACH;AAGJ,SACE,gBAAAP,OAACC,OAAA,EAAI,eAAc,UAAS,SAAS,GAEnC;AAAA,oBAAAH,MAAC,UAAO,aAAa,OAAO;AAAA,IAG3B,SACC,gBAAAA,MAACG,OAAA,EAAI,cAAc,GACjB,0BAAAD,OAACD,QAAA,EAAK,OAAO,MAAM,SACjB;AAAA,sBAAAD,MAAC,WAAQ;AAAA,MAAE;AAAA,OACb,GACF;AAAA,IAIF,gBAAAE,OAACC,OAAA,EAAI,WAAW,GACb;AAAA,iBAAW,gBAAAH,MAAC,gBAAa,QAAgB;AAAA,MACzC,SAAS,gBAAAA,MAAC,cAAW,OAAc;AAAA,MACnC,YAAY,CAAC,WAAW,gBAAAA,MAAC,iBAAc,QAAgB;AAAA,MACvD,UAAU,CAAC,WAAW,CAAC,SACtB,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,MACF;AAAA,OAEJ;AAAA,IAGA,gBAAAA,MAACG,OAAA,EAAI,WAAW,GACd,0BAAAH,MAACC,QAAA,EAAK,OAAO,MAAM,OAAO,UAAQ,MAC/B,kBAAQ,4BAA4B,yBACvC,GACF;AAAA,KACF;AAEJ;;;AC1bA,SAAgB,YAAAS,WAAU,aAAAC,YAAW,eAAAC,oBAAmB;AACxD,SAAS,OAAAC,OAAK,QAAAC,QAAM,UAAAC,SAAQ,YAAAC,iBAAgB;AAC5C;AAAA,EACE,QAAAC;AAAA,EACA,aAAAC;AAAA,EACA,uBAAAC;AAAA,EACA,YAAAC;AAAA,EAOA,qBAAAC;AAAA,EACA,yBAAAC;AAAA,EACA,kBAAAC;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAsED,gBAAAC,OACE,QAAAC,cADF;AAZN,SAASC,cAAa;AAAA,EACpB;AAAA,EACA;AACF,GAGG;AACD,QAAM,kBAAkBC,gBAAe,KAAK;AAC5C,QAAM,gBAAgB,mBAAmB,eAAe;AAExD,SACE,gBAAAF,OAACG,OAAA,EAAI,eAAc,UAAS,WAAW,GACrC;AAAA,oBAAAJ,MAACI,OAAA,EACC,0BAAAH,OAACI,QAAA,EAAK,OAAO,MAAM,OAAO,MAAI,MAC3B;AAAA,cAAQ;AAAA,MAAO;AAAA,MAAS,gBAAgB;AAAA,OAC3C,GACF;AAAA,IAEC,kBACC,gBAAAL,MAACI,OAAA,EAAI,WAAW,GACd,0BAAAH,OAACI,QAAA,EAAK,OAAO,MAAM,SAChB;AAAA,cAAQ;AAAA,MAAM;AAAA,MAAuB;AAAA,OACxC,GACF;AAAA,IAGD,iBACC,gBAAAL,MAACI,OAAA,EAAI,WAAW,GACd,0BAAAJ,MAACK,QAAA,EAAK,OAAO,MAAM,OAAO,UAAQ,MAAC,sEAEnC,GACF;AAAA,KAEJ;AAEJ;AAKA,SAASC,cAAa;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,QAAM,mBAAmB,KAAK,KAAK,MAAM,gBAAgB,EAAE;AAC3D,QAAM,mBAAmB,OAAO,MAAM,QAAQ,IAAI,KAAK,IAAI,IAAI,MAAM,QAAQ,QAAQ,GAAG,QAAQ,CAAC;AAEjG,SACE,gBAAAL,OAAC,OAAU,UAAQ,MAAC,OAAM,gBAAe,SAAS,GAChD;AAAA,oBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,EAAE,KAAK,cAAc,OAAO,MAAM,KAAK;AAAA,UACvC,EAAE,KAAK,SAAS,OAAO,GAAG,MAAM,IAAI,MAAM,MAAM,GAAG;AAAA,UACnD,EAAE,KAAK,YAAY,OAAO,WAAW;AAAA,UACrC,EAAE,KAAK,eAAe,OAAO,IAAI,eAAe,IAAI,MAAM,QAAQ,MAAM,GAAG;AAAA,QAC7E;AAAA;AAAA,IACF;AAAA,IAEA,gBAAAA,MAACI,OAAA,EAAI,WAAW,GAAG,cAAc,GAC/B,0BAAAJ,MAAC,WAAQ,OAAO,IAAI,GACtB;AAAA,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,EAAE,KAAK,WAAW,OAAO,IAAI,MAAM,KAAK,OAAO,QAAQ,CAAC,CAAC,GAAG;AAAA,UAC5D,EAAE,KAAK,cAAc,OAAO,IAAI,MAAM,KAAK,aAAa,QAAQ,CAAC,CAAC,GAAG;AAAA,UACrE,EAAE,KAAK,cAAc,OAAO,IAAI,MAAM,KAAK,SAAS,QAAQ,CAAC,CAAC,GAAG;AAAA,UACjE,EAAE,KAAK,aAAa,OAAO,IAAI,gBAAgB,OAAO;AAAA,QACxD;AAAA,QACA,UAAU,MAAM;AAAA,QAChB,YAAY,MAAM;AAAA;AAAA,IACpB;AAAA,IAEC,MAAM,cACL,gBAAAA,MAACI,OAAA,EAAI,WAAW,GACd,0BAAAH,OAACI,QAAA,EAAK,OAAO,MAAM,SAChB;AAAA,cAAQ;AAAA,MAAQ;AAAA,OAA+B,MAAM,cAAc,KAAK,QAAQ,CAAC;AAAA,MAAE;AAAA,OACtF,GACF;AAAA,IAGD,MAAM,uBACL,gBAAAL,MAACI,OAAA,EAAI,WAAW,GACd,0BAAAH,OAACI,QAAA,EAAK,OAAO,MAAM,SAAS,UAAQ,MACjC;AAAA,cAAQ;AAAA,MAAM;AAAA,OACjB,GACF;AAAA,KAEJ;AAEJ;AAKA,SAAS,sBAAsB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,QAAwB;AAAA,IAC5B;AAAA,MACE,OAAO;AAAA,MACP,QAAQ,UAAU;AAAA,IACpB;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,QAAQ,UAAU;AAAA,IACpB;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,QAAQ,UAAU;AAAA,MAClB,aAAa,UAAU,aAAa,WAAW,wCAAwC;AAAA,IACzF;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,QAAQ,UAAU;AAAA,MAClB,aAAa,UAAU,WAAW,WAAW,sCAAsC;AAAA,IACrF;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,QAAQ,UAAU;AAAA,MAClB,aAAa,UAAU,YAAY,WAAW,yBAAyB;AAAA,IACzE;AAAA,EACF;AAGA,MAAI,OAAO;AACT,UAAM,cAAc,MAAM,UAAU,OAAK,EAAE,WAAW,YAAY,EAAE,WAAW,QAAQ;AACvF,QAAI,eAAe,GAAG;AACpB,YAAM,OAAO,MAAM,WAAW;AAC9B,UAAI,MAAM;AACR,aAAK,SAAS;AACd,aAAK,cAAc;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAEA,SAAO,gBAAAL,MAAC,iBAAc,OAAc,OAAM,mBAAkB,aAAW,MAAC;AAC1E;AAKA,SAAS,eAAe;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,SACE,gBAAAC,OAACG,OAAA,EAAI,eAAc,UAAS,WAAW,GACrC;AAAA,oBAAAJ,MAACI,OAAA,EACC,0BAAAH,OAACI,QAAA,EAAK,OAAO,MAAM,SAAS,MAAI,MAC7B;AAAA,cAAQ;AAAA,MAAM;AAAA,OACjB,GACF;AAAA,IAEA,gBAAAL,MAACI,OAAA,EAAI,WAAW,GACd,0BAAAJ,MAAC,OAAU,UAAQ,MAAC,SAAS,GAC3B,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,EAAE,KAAK,UAAU,OAAO,UAAU;AAAA,UAClC,EAAE,KAAK,QAAQ,OAAO,GAAG,MAAM,IAAI,MAAM,MAAM,OAAO,MAAM,IAAI,GAAG;AAAA,UACnE,EAAE,KAAK,MAAM,OAAO,mBAAmB;AAAA,UACvC,GAAI,OAAO,SAAS,CAAC,EAAE,KAAK,aAAa,OAAO,OAAO,OAAO,MAAM,GAAG,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC;AAAA,UACzF,GAAI,OAAO,gBAAgB,CAAC,EAAE,KAAK,cAAc,OAAO,OAAO,cAAc,MAAM,GAAG,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC;AAAA,QAC1G;AAAA,QACA,YAAY,MAAM;AAAA;AAAA,IACpB,GACF,GACF;AAAA,IAEA,gBAAAA,MAACI,OAAA,EAAI,WAAW,GACd,0BAAAJ,MAACK,QAAA,EAAK,OAAO,MAAM,OAAO,UAAQ,MAAC,uFAEnC,GACF;AAAA,KACF;AAEJ;AAKO,SAAS,OAAO,EAAE,QAAQ,GAAgB;AAC/C,QAAM,EAAE,KAAK,IAAIE,QAAO;AAGxB,QAAM,CAAC,OAAO,QAAQ,IAAIC,UAAsB,SAAS;AACzD,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAuB,IAAI;AACrD,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAuB,IAAI;AACrD,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAuB,IAAI;AACrD,QAAM,CAAC,eAAe,gBAAgB,IAAIA,UAAwB,IAAI;AACtE,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAwB,IAAI;AAChE,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAuB,IAAI;AACrD,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,UAAwB,IAAI;AACxE,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAiC,IAAI;AACjE,QAAM,CAAC,wBAAwB,yBAAyB,IAAIA,UAAiB,EAAE;AAG/E,QAAM,CAAC,WAAW,YAAY,IAAIA,UAA0B;AAAA,IAC1D,SAAS;AAAA,IACT,OAAO;AAAA,IACP,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,EACX,CAAC;AAGD,EAAAC,UAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,UAAU,cAAc;AAC1B,UAAI,IAAI,UAAU,UAAU,OAAO,UAAU,KAAK;AAChD,sBAAc;AAAA,MAChB,WAAW,UAAU,OAAO,UAAU,OAAO,UAAU,KAAK;AAC1D,aAAK;AAAA,MACP;AAAA,IACF;AAEA,QAAI,UAAU,eAAe,UAAU,UAAU;AAC/C,UAAI,IAAI,UAAU,UAAU,KAAK;AAC/B,aAAK;AAAA,MACP;AAAA,IACF;AAAA,EACF,CAAC;AAGD,EAAAC,WAAU,MAAM;AACd,oBAAgB;AAAA,EAClB,GAAG,CAAC,CAAC;AAEL,QAAM,kBAAkB,YAAY;AAClC,QAAI;AACF,mBAAa,WAAS,EAAE,GAAG,MAAM,SAAS,SAAS,EAAE;AAGrD,YAAM,MAAM,MAAM,eAAe,QAAQ,GAAG;AAC5C,oBAAc,GAAG;AAGjB,YAAM,UAAU,MAAM,yBAAyB,GAAG;AAClD,uBAAiB,OAAO;AAGxB,YAAM,iBAAiB,MAAMC,WAAU;AACvC,YAAM,aAAa,eAAe,OAAO;AAAA,QACvC,OAAK,EAAE,IAAI,YAAY,MAAM,QAAQ,KAAK,YAAY,KACjD,EAAE,KAAK,YAAY,MAAM,QAAQ,KAAK,YAAY,KAClD,EAAE,GAAG,SAAS,MAAM,QAAQ;AAAA,MACnC;AAEA,UAAI,CAAC,YAAY;AACf,cAAM,IAAI,MAAM,oBAAoB,QAAQ,IAAI,uBAAuB,eAAe,OAAO,IAAI,OAAK,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,MAC3H;AAEA,eAAS,UAAU;AAGnB,YAAM,iBAAiB,MAAMC,qBAAoB,WAAW,EAAE;AAC9D,YAAM,aAAa,eAAe,OAAO;AAAA,QACvC,OAAK,EAAE,OAAO,YAAY,MAAM,QAAQ,MAAM,YAAY,KACrD,EAAE,QAAQ,YAAY,MAAM,QAAQ,MAAM,YAAY;AAAA,MAC7D;AAEA,UAAI,CAAC,YAAY;AACf,cAAM,IAAI,MAAM,oBAAoB,QAAQ,KAAK,uBAAuB,eAAe,OAAO,IAAI,OAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,MAC/H;AAEA,eAAS,UAAU;AAEnB,mBAAa,WAAS,EAAE,GAAG,MAAM,SAAS,aAAa,OAAO,SAAS,EAAE;AAGzE,YAAM,wBAAwB,WAAW,QAAQ,MAAM,IAAI,KAAK,IAAI,IAAI,WAAW,QAAQ,GAAG,SAAS;AAEvG,YAAM,cAAc,MAAMC,UAAS;AAAA,QACjC,aAAa,WAAW;AAAA,QACxB,WAAWC;AAAA,QACX,WAAW,WAAW;AAAA,QACtB,SAASC;AAAA,QACT,YAAY;AAAA,QACZ,aAAa;AAAA,MACf,CAAC;AAED,eAAS,WAAW;AACpB,mBAAa,WAAS,EAAE,GAAG,MAAM,OAAO,YAAY,EAAE;AACtD,eAAS,QAAQ;AAGjB,UAAI,QAAQ,KAAK;AACf,iBAAS,YAAY;AAErB,mBAAW,MAAM,cAAc,GAAG,GAAG;AAAA,MACvC,OAAO;AACL,iBAAS,YAAY;AAAA,MACvB;AAAA,IACF,SAAS,KAAK;AACZ,YAAM,kBAAkBZ,gBAAe,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC,CAAC;AAC1F,eAAS,eAAe;AAGxB,YAAM,SAAS,iBAAiB,gBAAgB,IAAqC;AACrF,UAAI,QAAQ;AACV,0BAAkB,MAAM;AAAA,MAC1B;AAEA,mBAAa,WAAS;AAAA,QACpB,GAAG;AAAA,QACH,SAAS,KAAK,YAAY,WAAW,WAAW,KAAK;AAAA,QACrD,OAAO,KAAK,UAAU,WAAW,WAAW,KAAK;AAAA,MACnD,EAAE;AACF,eAAS,QAAQ;AAAA,IACnB;AAAA,EACF;AAEA,QAAM,gBAAgBa,aAAY,YAAY;AAC5C,QAAI,CAAC,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,cAAc,CAAC,cAAe;AAEjE,QAAI;AACF,eAAS,WAAW;AACpB,mBAAa,WAAS,EAAE,GAAG,MAAM,UAAU,SAAS,EAAE;AAGtD,YAAM,SAAS,MAAM,aAAa,YAAY,MAAM,EAAE;AAGtD,YAAM,OAAO,IAAIC,MAAK;AAAA,QACpB,YAAY;AAAA,QACZ,aAAa,QAAQ,gBAAgB;AAAA,MACvC,CAAC;AAED,YAAM,gBAAgB,MAAM,KAAK,QAAQ;AAAA,QACvC;AAAA,QACA;AAAA,QACA,cAAc,CAAC,eAAkC;AAC/C,oCAA0B,GAAG,WAAW,IAAI,KAAK,WAAW,MAAM,EAAE;AAGpE,cAAI,WAAW,SAAS,YAAY;AAClC,gBAAI,WAAW,WAAW,aAAa;AACrC,2BAAa,WAAS,EAAE,GAAG,MAAM,UAAU,aAAa,QAAQ,SAAS,EAAE;AAAA,YAC7E,WAAW,WAAW,WAAW,UAAU;AACzC,2BAAa,WAAS,EAAE,GAAG,MAAM,UAAU,SAAS,EAAE;AAAA,YACxD;AAAA,UACF,WAAW,WAAW,SAAS,YAAY,WAAW,SAAS,QAAQ;AACrE,gBAAI,WAAW,WAAW,aAAa;AACrC,2BAAa,WAAS,EAAE,GAAG,MAAM,QAAQ,aAAa,SAAS,SAAS,EAAE;AAAA,YAC5E,WAAW,WAAW,WAAW,UAAU;AACzC,2BAAa,WAAS,EAAE,GAAG,MAAM,QAAQ,SAAS,EAAE;AAAA,YACtD;AAAA,UACF,WAAW,WAAW,SAAS,WAAW;AACxC,gBAAI,WAAW,WAAW,aAAa;AACrC,2BAAa,WAAS,EAAE,GAAG,MAAM,SAAS,YAAY,EAAE;AAAA,YAC1D,WAAW,WAAW,WAAW,UAAU;AACzC,2BAAa,WAAS,EAAE,GAAG,MAAM,SAAS,SAAS,EAAE;AAAA,YACvD;AAAA,UACF;AAAA,QACF;AAAA,QACA,gBAAgB,CAAC,WAAqC;AACpD,oCAA0B,OAAO,aAAa,QAAQ,OAAO,WAAW,IAAI,OAAO,UAAU,EAAE;AAAA,QACjG;AAAA,MACF,CAAC;AAED,gBAAU,aAAa;AAEvB,UAAI,cAAc,WAAW,aAAa;AACxC,qBAAa,WAAS;AAAA,UACpB,GAAG;AAAA,UACH,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,SAAS;AAAA,QACX,EAAE;AACF,iBAAS,WAAW;AAAA,MACtB,WAAW,cAAc,WAAW,UAAU;AAC5C,iBAAS,cAAc,SAAS,IAAI,MAAM,yBAAyB,CAAC;AACpE,iBAAS,QAAQ;AAAA,MACnB;AAAA,IACF,SAAS,KAAK;AACZ,YAAM,kBAAkBd,gBAAe,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC,CAAC;AAC1F,eAAS,eAAe;AAExB,YAAM,SAAS,iBAAiB,gBAAgB,IAAqC;AACrF,UAAI,QAAQ;AACV,0BAAkB,MAAM;AAAA,MAC1B;AAEA,eAAS,QAAQ;AAAA,IACnB;AAAA,EACF,GAAG,CAAC,OAAO,OAAO,OAAO,YAAY,eAAe,QAAQ,WAAW,CAAC;AAGxE,SACE,gBAAAF,OAACG,OAAA,EAAI,eAAc,UAAS,SAAS,GAEnC;AAAA,oBAAAJ,MAAC,UAAO,SAAO,MAAC,aAAa,OAAO;AAAA,IAGpC,gBAAAA,MAACI,OAAA,EAAI,cAAc,GACjB,0BAAAH,OAACI,QAAA,EAAK,OAAO,MAAM,SAAS,MAAI,MAAC;AAAA;AAAA,MACvB,QAAQ;AAAA,MAAO;AAAA,MAAE,QAAQ;AAAA,MAAM;AAAA,MAAO,QAAQ;AAAA,OACxD,GACF;AAAA,IAGC,iBACC,gBAAAL,MAACI,OAAA,EAAI,cAAc,GACjB,0BAAAH,OAACI,QAAA,EAAK,OAAO,MAAM,OAAO,UAAQ,MAAC;AAAA;AAAA,MACxB,cAAc,MAAM,GAAG,CAAC;AAAA,MAAE;AAAA,MAAI,cAAc,MAAM,EAAE;AAAA,OAC/D,GACF;AAAA,IAID,UAAU,aACT,gBAAAL,MAACI,OAAA,EAAI,eAAc,UACjB,0BAAAJ,MAAC,yBAAsB,WAAsB,GAC/C;AAAA,IAID,UAAU,gBAAgB,SAAS,SAAS,SAC3C,gBAAAC,OAACG,OAAA,EAAI,eAAc,UACjB;AAAA,sBAAAJ;AAAA,QAACM;AAAA,QAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA,UACA,QAAQ,QAAQ;AAAA;AAAA,MAClB;AAAA,MAEC,CAAC,QAAQ,OACR,gBAAAN,MAACI,OAAA,EAAI,WAAW,GACd,0BAAAH,OAACI,QAAA,EAAK,OAAO,MAAM,SAAS,MAAI,MAC7B;AAAA,gBAAQ;AAAA,QAAM;AAAA,SACjB,GACF;AAAA,MAGD,QAAQ,OACP,gBAAAL,MAACI,OAAA,EAAI,WAAW,GACd,0BAAAJ,MAAC,WAAQ,MAAK,sBAAqB,GACrC;AAAA,OAEJ;AAAA,IAID,UAAU,eACT,gBAAAA,MAACI,OAAA,EAAI,eAAc,UACjB,0BAAAJ;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA;AAAA,IACF,GACF;AAAA,IAID,UAAU,eAAe,UAAU,SAAS,SAC3C,gBAAAC,OAACG,OAAA,EAAI,eAAc,UACjB;AAAA,sBAAAJ,MAAC,yBAAsB,WAAsB;AAAA,MAC7C,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA,UACA,QAAQ,QAAQ;AAAA;AAAA,MAClB;AAAA,MACA,gBAAAA,MAACI,OAAA,EAAI,WAAW,GACd,0BAAAJ,MAACK,QAAA,EAAK,OAAO,MAAM,OAAO,UAAQ,MAAC,sCAEnC,GACF;AAAA,OACF;AAAA,IAID,UAAU,YAAY,SACrB,gBAAAJ,OAACG,OAAA,EAAI,eAAc,UACjB;AAAA,sBAAAJ,MAAC,yBAAsB,WAAsB,OAAO,MAAM,SAAS;AAAA,MACnE,gBAAAA,MAACE,eAAA,EAAa,OAAc,gBAAgB,kBAAkB,QAAW;AAAA,MACzE,gBAAAF,MAACI,OAAA,EAAI,WAAW,GACd,0BAAAJ,MAACK,QAAA,EAAK,OAAO,MAAM,OAAO,UAAQ,MAAC,sCAEnC,GACF;AAAA,OACF;AAAA,KAEJ;AAEJ;AAMA,eAAsB,cAAc,SAA8C;AAChF,QAAM,EAAE,QAAAa,QAAO,IAAI,MAAM,OAAO,KAAK;AACrC,QAAMC,UAAQ,MAAM,OAAO,OAAO;AAElC,EAAAD,QAAOC,QAAM,cAAc,QAAQ,EAAE,QAAQ,CAAC,CAAC;AACjD;;;AC9kBA,SAAgB,YAAAC,WAAU,aAAAC,kBAAiB;AAC3C,SAAS,OAAAC,OAAK,QAAAC,QAAM,UAAAC,eAAc;;;ACIlC,OAAO,QAAQ;AACf,OAAOC,SAAQ;AACf,OAAO,UAAU;AAKjB,IAAM,eAAe,KAAK,KAAK,GAAG,QAAQ,GAAG,SAAS,cAAc;AA4CpE,SAAS,YAAkB;AACzB,QAAM,MAAM,KAAK,QAAQ,YAAY;AACrC,MAAI,CAACC,IAAG,WAAW,GAAG,GAAG;AACvB,IAAAA,IAAG,UAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,EACvC;AACF;AAeO,SAAS,WAAW,QAAQ,IAAI,SAAkC;AACvE,YAAU;AAEV,MAAI,CAACC,IAAG,WAAW,YAAY,GAAG;AAChC,WAAO,CAAC;AAAA,EACV;AAEA,MAAI;AACF,UAAM,OAAoB,KAAK,MAAMA,IAAG,aAAa,cAAc,OAAO,CAAC;AAC3E,QAAI,UAAU,KAAK,WAAW,CAAC;AAG/B,QAAI,SAAS;AACX,gBAAU,QAAQ;AAAA,QAChB,CAAC,MAAM,EAAE,eAAe,YAAY,MAAM,QAAQ,YAAY;AAAA,MAChE;AAAA,IACF;AAGA,WAAO,QAAQ,MAAM,CAAC,KAAK,EAAE,QAAQ;AAAA,EACvC,QAAQ;AAEN,WAAO,CAAC;AAAA,EACV;AACF;;;ADOU,SA4GF,YAAAC,WAxGI,OAAAC,OAJF,QAAAC,cAAA;AAjFV,SAAS,WAAW,WAA2B;AAC7C,SAAO,IAAI,KAAK,SAAS,EAAE,eAAe,SAAS;AAAA,IACjD,OAAO;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV,CAAC;AACH;AAKA,SAASC,cAAa,MAAsB;AAC1C,MAAI,KAAK,UAAU,GAAI,QAAO;AAC9B,SAAO,GAAG,KAAK,MAAM,GAAG,CAAC,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;AAChD;AAKA,SAAS,iBAAiB,QAIxB;AACA,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO,EAAE,MAAM,QAAQ,WAAW,OAAO,MAAM,SAAS,OAAO,WAAW;AAAA,IAC5E,KAAK;AACH,aAAO,EAAE,MAAM,QAAQ,SAAS,OAAO,MAAM,SAAS,OAAO,UAAU;AAAA,IACzE,KAAK;AACH,aAAO,EAAE,MAAM,QAAQ,QAAQ,OAAO,MAAM,OAAO,OAAO,SAAS;AAAA,IACrE;AACE,aAAO,EAAE,MAAM,QAAQ,SAAS,OAAO,MAAM,OAAO,OAAO,UAAU;AAAA,EACzE;AACF;AAkBA,SAAS,gBAAgB,SAAuC;AAC9D,SAAO,QAAQ,IAAI,CAAC,UAAU;AAC5B,UAAM,EAAE,MAAM,OAAO,MAAM,IAAI,iBAAiB,MAAM,MAAM;AAC5D,WAAO;AAAA,MACL,MAAM,WAAW,MAAM,SAAS;AAAA,MAChC,OAAO,GAAG,MAAM,SAAS,IAAI,QAAQ,KAAK,IAAI,MAAM,OAAO;AAAA,MAC3D,QAAQ,GAAG,MAAM,MAAM,IAAI,MAAM,KAAK;AAAA,MACtC,QAAQ,GAAG,IAAI,IAAI,KAAK;AAAA,MACxB,QAAQ,MAAM;AAAA,MACd,aAAa;AAAA,IACf;AAAA,EACF,CAAC;AACH;AAKA,SAAS,WAAW,EAAE,QAAQ,GAAyB;AACrD,SACE,gBAAAF,MAACG,OAAA,EAAI,eAAc,UACjB,0BAAAH;AAAA,IAACG;AAAA,IAAA;AAAA,MACC,aAAY;AAAA,MACZ,aAAa,MAAM;AAAA,MACnB,UAAU;AAAA,MACV,UAAU;AAAA,MAEV,0BAAAF,OAACE,OAAA,EAAI,eAAc,UACjB;AAAA,wBAAAF,OAACG,QAAA,EAAK,OAAO,MAAM,OAChB;AAAA,kBAAQ;AAAA,UAAQ;AAAA,WACnB;AAAA,QACA,gBAAAJ,MAACG,OAAA,EAAI,WAAW,GACd,0BAAAH,MAACI,QAAA,EAAK,OAAO,MAAM,OAAO,UAAQ,MAC/B,oBACG,qCAAqCF,cAAa,OAAO,CAAC,KAC1D,oGACN,GACF;AAAA,SACF;AAAA;AAAA,EACF,GACF;AAEJ;AAKO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA,OAAO;AACT,GAAwB;AACtB,QAAM,EAAE,KAAK,IAAIG,QAAO;AACxB,QAAM,CAAC,SAAS,UAAU,IAAIC,UAAyB,CAAC,CAAC;AACzD,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,IAAI;AAE3C,EAAAC,WAAU,MAAM;AAEd,UAAM,UAAU,WAAW,OAAO,OAAO;AACzC,eAAW,OAAO;AAClB,eAAW,KAAK;AAAA,EAClB,GAAG,CAAC,OAAO,OAAO,CAAC;AAGnB,EAAAA,WAAU,MAAM;AACd,QAAI,CAAC,WAAW,MAAM;AACpB,iBAAW,MAAM,KAAK,GAAG,GAAG;AAAA,IAC9B;AAAA,EACF,GAAG,CAAC,SAAS,MAAM,IAAI,CAAC;AAGxB,MAAI,MAAM;AACR,QAAI,QAAS,QAAO;AACpB,YAAQ,IAAI,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAC5C,WAAO;AAAA,EACT;AAEA,MAAI,SAAS;AACX,WACE,gBAAAN,OAACE,OAAA,EAAI,eAAc,UAAS,SAAS,GACnC;AAAA,sBAAAH,MAAC,UAAO,SAAO,MAAC,aAAa,OAAO;AAAA,MACpC,gBAAAA,MAACI,QAAA,EAAK,OAAO,MAAM,OAAO,gCAAkB;AAAA,OAC9C;AAAA,EAEJ;AAEA,QAAM,OAAO,gBAAgB,OAAO;AAGpC,QAAM,UAAgC;AAAA,IACpC;AAAA,MACE,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,aAAa,MAAM;AAAA,MACnB,WAAW,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,aAAa,MAAM;AAAA,MACnB,WAAW,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,OAAO;AAAA,MACP,aAAa,MAAM;AAAA,MACnB,WAAW,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,aAAa,MAAM;AAAA,MACnB,WAAW,CAAC,GAAG,QAAQ,IAAI;AAAA,IAC7B;AAAA,EACF;AAEA,SACE,gBAAAH,OAACE,OAAA,EAAI,eAAc,UAAS,SAAS,GACnC;AAAA,oBAAAH,MAAC,UAAO,SAAO,MAAC,aAAa,OAAO;AAAA,IAEpC,gBAAAA,MAACG,OAAA,EAAI,cAAc,GACjB,0BAAAF,OAACG,QAAA,EAAK,OAAO,MAAM,WAChB;AAAA,cAAQ;AAAA,MAAM;AAAA,MACd,WACC,gBAAAH,OAACG,QAAA,EAAK,OAAO,MAAM,OAAO;AAAA;AAAA,QAAGF,cAAa,OAAO;AAAA,QAAE;AAAA,SAAC;AAAA,MAErD,QAAQ,SAAS,KAChB,gBAAAD,OAACG,QAAA,EAAK,OAAO,MAAM,OAAO;AAAA;AAAA,QAAI,QAAQ;AAAA,QAAO;AAAA,QAAa,QAAQ,WAAW,IAAI,MAAM;AAAA,SAAG;AAAA,OAE9F,GACF;AAAA,IAEC,QAAQ,WAAW,IAClB,gBAAAJ,MAAC,cAAW,SAAkB,IAE9B,gBAAAC,OAAAF,WAAA,EACE;AAAA,sBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,MAAM;AAAA,UACN;AAAA,UACA,UAAQ;AAAA,UACR,aAAa,MAAM;AAAA;AAAA,MACrB;AAAA,MAEA,gBAAAC,OAACE,OAAA,EAAI,WAAW,GAAG,eAAc,UAC/B;AAAA,wBAAAF,OAACG,QAAA,EAAK,OAAO,MAAM,OAAO,UAAQ,MAAC;AAAA;AAAA,UAC5B;AAAA,UAAI;AAAA,UAAa;AAAA,UAAI;AAAA,UAAK;AAAA,UAAK;AAAA,WACtC;AAAA,QACC,QAAQ,UAAU,SACjB,gBAAAH,OAACG,QAAA,EAAK,OAAO,MAAM,OAAO,UAAQ,MAAC;AAAA;AAAA,UACnB;AAAA,UAAM;AAAA,WACtB;AAAA,SAEJ;AAAA,OACF;AAAA,KAEJ;AAEJ;;;AE7OA,OAAOI,WAAS,YAAAC,WAAU,aAAAC,kBAAiB;AAC3C,SAAS,OAAAC,OAAK,QAAAC,QAAM,UAAAC,eAAc;AAClC;AAAA,EACE,QAAAC;AAAA,EACA,aAAAC;AAAA,OAGK;AAmRD,SA8DE,YAAAC,WA7DA,OAAAC,OADF,QAAAC,cAAA;AAvQN,SAASC,iBAAgB,SAAyB;AAChD,MAAI,QAAQ,UAAU,GAAI,QAAO;AACjC,SAAO,GAAG,QAAQ,MAAM,GAAG,CAAC,CAAC,MAAM,QAAQ,MAAM,EAAE,CAAC;AACtD;AAKA,SAAS,aAAa,OAAe,WAAmB,GAAW;AACjE,MAAI,UAAU,EAAG,QAAO;AAGxB,MAAI,QAAQ,QAAQ,QAAQ,GAAG;AAC7B,WAAO,MAAM,QAAQ,CAAC;AAAA,EACxB;AAEA,SAAO,MAAM,eAAe,SAAS;AAAA,IACnC,uBAAuB;AAAA,IACvB,uBAAuB;AAAA,EACzB,CAAC;AACH;AAKA,SAASC,WAAU,OAAwB;AACzC,MAAI,UAAU,UAAa,UAAU,EAAG,QAAO;AAC/C,SAAO,IAAI,aAAa,OAAO,CAAC,CAAC;AACnC;AAKA,IAAM,kBAAkB,CAAC,GAAG,OAAO,KAAK,IAAI,IAAI;AAKhD,IAAM,cAAsC;AAAA,EAC1C,GAAG;AAAA,EACH,OAAO;AAAA,EACP,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,KAAK;AAAA,EACL,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AACP;AAKA,eAAeC,gBAAe,YAA4E;AAExG,QAAM,YAAY,SAAS,YAAY,EAAE;AACzC,MAAI,CAAC,MAAM,SAAS,GAAG;AACrB,UAAMC,YAAW,MAAMC,WAAU;AACjC,UAAMC,SAAQF,UAAS,OAAO,KAAK,CAAC,MAAa,EAAE,OAAO,SAAS;AACnE,QAAIE,QAAO;AACT,aAAO,EAAE,SAASA,OAAM,IAAI,WAAWA,OAAM,KAAK;AAAA,IACpD;AAEA,WAAO,EAAE,SAAS,WAAW,WAAW,YAAY,SAAS,KAAK,WAAW;AAAA,EAC/E;AAGA,QAAM,WAAW,MAAMD,WAAU;AACjC,QAAM,aAAa,WAAW,YAAY;AAC1C,QAAM,QAAQ,SAAS,OAAO;AAAA,IAAK,CAAC,MAClC,EAAE,KAAK,YAAY,MAAM,cACzB,EAAE,KAAK,YAAY,MAAM;AAAA,EAC3B;AAEA,MAAI,OAAO;AACT,WAAO,EAAE,SAAS,MAAM,IAAI,WAAW,MAAM,KAAK;AAAA,EACpD;AAEA,SAAO;AACT;AAoCO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,OAAO;AACT,GAAwB;AACtB,QAAM,EAAE,KAAK,IAAIE,QAAO;AACxB,QAAM,CAAC,eAAe,gBAAgB,IAAIC,UAA0B,CAAC,CAAC;AACtE,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,IAAI;AAC3C,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAwB,IAAI;AACtD,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAS,CAAC;AAE1C,EAAAC,WAAU,MAAM;AACd,mBAAe,eAAe;AAC5B,UAAI;AACF,mBAAW,IAAI;AACf,iBAAS,IAAI;AAEb,cAAM,OAAO,IAAIC,MAAK,EAAE,YAAY,WAAW,CAAC;AAGhD,YAAI,WAAqB,CAAC;AAC1B,YAAI,eAAuC,CAAC;AAE5C,YAAI,OAAO;AAET,gBAAM,WAAW,MAAMP,gBAAe,KAAK;AAC3C,cAAI,CAAC,UAAU;AACb,qBAAS,mBAAmB,KAAK,GAAG;AACpC,uBAAW,KAAK;AAChB;AAAA,UACF;AACA,qBAAW,CAAC,SAAS,OAAO;AAC5B,uBAAa,SAAS,OAAO,IAAI,SAAS;AAAA,QAC5C,OAAO;AAEL,qBAAW;AACX,mBAAS,QAAQ,QAAM;AACrB,yBAAa,EAAE,IAAI,YAAY,EAAE,KAAK,SAAS,EAAE;AAAA,UACnD,CAAC;AAAA,QACH;AAGA,cAAM,UAAU,MAAM,QAAQ;AAAA,UAC5B,SAAS,IAAI,OAAO,YAAY;AAC9B,gBAAI;AACF,oBAAM,WAAW,MAAM,KAAK,iBAAiB,SAAS,OAAO;AAC7D,qBAAO,EAAE,SAAS,SAAS;AAAA,YAC7B,SAAS,KAAK;AACZ,sBAAQ,KAAK,sCAAsC,OAAO,KAAK,GAAG;AAClE,qBAAO,EAAE,SAAS,UAAU,CAAC,EAAE;AAAA,YACjC;AAAA,UACF,CAAC;AAAA,QACH;AAGA,cAAM,kBAAmC,CAAC;AAC1C,YAAI,aAAa;AAEjB,mBAAW,UAAU,SAAS;AAC5B,gBAAM,EAAE,SAAS,SAAS,IAAI;AAG9B,cAAI,mBAAmB,SAAS,OAAO,CAAC,MAA2B;AAEjE,mBAAO,WAAW,EAAE;AAAA,UACtB,CAAC;AAGD,gBAAM,aAAa,SAAS,OAAO,CAAC,KAAa,MAA2B;AAC1E,mBAAO,OAAO,EAAE,cAAc;AAAA,UAChC,GAAG,CAAC;AACJ,wBAAc;AAGd,gBAAM,cAA4B,iBAAiB,IAAI,CAAC,OAA4B;AAAA,YAClF,QAAQ,EAAE,MAAM;AAAA,YAChB,SAAS,EAAE;AAAA,YACX,kBAAkB,EAAE;AAAA,YACpB,UAAU,EAAE;AAAA,YACZ,YAAY,EAAE;AAAA,UAChB,EAAE;AAGF,sBAAY,KAAK,CAAC,GAAG,MAAM;AACzB,gBAAI,EAAE,eAAe,EAAE,YAAY;AACjC,qBAAO,EAAE,aAAa,KAAK;AAAA,YAC7B;AACA,oBAAQ,EAAE,YAAY,MAAM,EAAE,YAAY;AAAA,UAC5C,CAAC;AAGD,cAAI,YAAY,SAAS,KAAK,SAAS;AACrC,4BAAgB,KAAK;AAAA,cACnB;AAAA,cACA,WAAW,aAAa,OAAO,KAAK,SAAS,OAAO;AAAA,cACpD,UAAU;AAAA,cACV,UAAU;AAAA,YACZ,CAAC;AAAA,UACH;AAAA,QACF;AAGA,wBAAgB,KAAK,CAAC,GAAG,MAAM,EAAE,WAAW,EAAE,QAAQ;AAEtD,yBAAiB,eAAe;AAChC,oBAAY,UAAU;AAAA,MACxB,SAAS,KAAK;AACZ,iBAAS,eAAe,QAAQ,IAAI,UAAU,yBAAyB;AAAA,MACzE,UAAE;AACA,mBAAW,KAAK;AAAA,MAClB;AAAA,IACF;AACA,iBAAa;AAAA,EACf,GAAG,CAAC,SAAS,OAAO,OAAO,CAAC;AAG5B,EAAAM,WAAU,MAAM;AACd,QAAI,CAAC,WAAW,MAAM;AACpB,iBAAW,MAAM,KAAK,GAAG,GAAG;AAAA,IAC9B;AAAA,EACF,GAAG,CAAC,SAAS,MAAM,IAAI,CAAC;AAGxB,MAAI,MAAM;AACR,QAAI,QAAS,QAAO;AACpB,QAAI,OAAO;AACT,cAAQ,MAAM,KAAK,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;AAChD,aAAO;AAAA,IACT;AACA,YAAQ,IAAI,KAAK,UAAU;AAAA,MACzB;AAAA,MACA,QAAQ,cAAc,IAAI,SAAO;AAAA,QAC/B,SAAS,GAAG;AAAA,QACZ,WAAW,GAAG;AAAA,QACd,UAAU,GAAG;AAAA,QACb,UAAU,GAAG;AAAA,MACf,EAAE;AAAA,MACF;AAAA,IACF,GAAG,MAAM,CAAC,CAAC;AACX,WAAO;AAAA,EACT;AAEA,MAAI,SAAS;AACX,WACE,gBAAAT,OAACW,OAAA,EAAI,eAAc,UAAS,SAAS,GACnC;AAAA,sBAAAZ,MAAC,UAAO,SAAO,MAAC,aAAa,OAAO;AAAA,MACpC,gBAAAA,MAAC,WAAQ,MAAM,QAAQ,uBAAuB,KAAK,QAAQ,qCAAqC;AAAA,OAClG;AAAA,EAEJ;AAEA,MAAI,OAAO;AACT,WACE,gBAAAC,OAACW,OAAA,EAAI,eAAc,UAAS,SAAS,GACnC;AAAA,sBAAAZ,MAAC,UAAO,SAAO,MAAC,aAAa,OAAO;AAAA,MACpC,gBAAAA,MAACY,OAAA,EACC,0BAAAX,OAACY,QAAA,EAAK,OAAO,MAAM,OAAQ;AAAA,gBAAQ;AAAA,QAAO;AAAA,QAAS;AAAA,SAAM,GAC3D;AAAA,OACF;AAAA,EAEJ;AAGA,QAAM,iBAAiB,KAAK;AAAA,IAC1B;AAAA,IACA,GAAG,cAAc,QAAQ,QAAM,GAAG,SAAS,IAAI,OAAK,EAAE,OAAO,MAAM,CAAC;AAAA,EACtE;AACA,QAAM,kBAAkB,KAAK;AAAA,IAC3B;AAAA,IACA,GAAG,cAAc,QAAQ,QAAM,GAAG,SAAS,IAAI,OAAK,EAAE,iBAAiB,MAAM,CAAC;AAAA,EAChF;AACA,QAAM,WAAW,KAAK,IAAI,IAAI,iBAAiB,kBAAkB,EAAE;AAGnE,QAAM,iBAAiB,cAAc,KAAK,QAAM,GAAG,SAAS,SAAS,CAAC;AAEtE,SACE,gBAAAZ,OAACW,OAAA,EAAI,eAAc,UAAS,SAAS,GACnC;AAAA,oBAAAZ,MAAC,UAAO,SAAO,MAAC,aAAa,OAAO;AAAA,IAGpC,gBAAAA,MAACY,OAAA,EACC,0BAAAX,OAACY,QAAA,EAAK,OAAO,MAAM,QAChB;AAAA,cAAQ;AAAA,MAAS,QAAQ,WAAW,OAAO,WAAW,CAAC;AAAA,MAAG,QAAQ;AAAA,OACrE,GACF;AAAA,IAGA,gBAAAZ,OAACW,OAAA,EACC;AAAA,sBAAAZ,MAACa,QAAA,EAAK,OAAO,MAAM,QAAS,kBAAQ,UAAS;AAAA,MAC7C,gBAAAb,MAACY,OAAA,EAAI,OAAO,WAAW,GAAG,gBAAe,UACvC,0BAAAX,OAACY,QAAA,EAAK,OAAO,MAAM,SAAS,MAAI,MAAC;AAAA;AAAA,QACpBX,iBAAgB,OAAO;AAAA,SACpC,GACF;AAAA,MACA,gBAAAF,MAACa,QAAA,EAAK,OAAO,MAAM,QAAS,kBAAQ,UAAS;AAAA,OAC/C;AAAA,IAGA,gBAAAb,MAACY,OAAA,EACC,0BAAAX,OAACY,QAAA,EAAK,OAAO,MAAM,QAChB;AAAA,cAAQ;AAAA,MAAO,QAAQ,WAAW,OAAO,WAAW,CAAC;AAAA,MAAG,QAAQ;AAAA,OACnE,GACF;AAAA,IAEC,CAAC,iBACA,gBAAAb,MAAAD,WAAA,EACE,0BAAAE,OAACW,OAAA,EACC;AAAA,sBAAAZ,MAACa,QAAA,EAAK,OAAO,MAAM,QAAS,kBAAQ,UAAS;AAAA,MAC7C,gBAAAb,MAACY,OAAA,EAAI,OAAO,WAAW,GAAG,gBAAe,UACvC,0BAAAZ,MAACa,QAAA,EAAK,OAAO,MAAM,OAAO,+BAAiB,GAC7C;AAAA,MACA,gBAAAb,MAACa,QAAA,EAAK,OAAO,MAAM,QAAS,kBAAQ,UAAS;AAAA,OAC/C,GACF,IAEA,cAAc,IAAI,CAAC,WAAW,eAC5B,gBAAAZ,OAACa,QAAM,UAAN,EAEC;AAAA,sBAAAb,OAACW,OAAA,EACC;AAAA,wBAAAZ,MAACa,QAAA,EAAK,OAAO,MAAM,QAAS,kBAAQ,UAAS;AAAA,QAC7C,gBAAAb,MAACa,QAAA,EAAK,gBAAE;AAAA,QACR,gBAAAb,MAACa,QAAA,EAAK,OAAO,MAAM,QAAQ,MAAI,MAC5B,oBAAU,WACb;AAAA,QACA,gBAAAb,MAACY,OAAA,EAAI,UAAU,GAAG;AAAA,QAClB,gBAAAZ,MAACa,QAAA,EAAK,OAAO,MAAM,QAAS,kBAAQ,UAAS;AAAA,SAC/C;AAAA,MAGC,UAAU,SAAS,WAAW,IAC7B,gBAAAZ,OAACW,OAAA,EACC;AAAA,wBAAAZ,MAACa,QAAA,EAAK,OAAO,MAAM,QAAS,kBAAQ,UAAS;AAAA,QAC7C,gBAAAb,MAACa,QAAA,EAAK,kBAAI;AAAA,QACV,gBAAAb,MAACa,QAAA,EAAK,OAAO,MAAM,OAAO,UAAQ,MAAC,yBAAW;AAAA,QAC9C,gBAAAb,MAACY,OAAA,EAAI,UAAU,GAAG;AAAA,QAClB,gBAAAZ,MAACa,QAAA,EAAK,OAAO,MAAM,QAAS,kBAAQ,UAAS;AAAA,SAC/C,IAEA,UAAU,SAAS,IAAI,CAAC,SAAS,MAC/B,gBAAAZ,OAACW,OAAA,EACC;AAAA,wBAAAZ,MAACa,QAAA,EAAK,OAAO,MAAM,QAAS,kBAAQ,UAAS;AAAA,QAC7C,gBAAAb,MAACa,QAAA,EAAK,kBAAI;AAAA,QACV,gBAAAb;AAAA,UAACa;AAAA,UAAA;AAAA,YACC,OAAO,QAAQ,aAAa,MAAM,UAAU,MAAM;AAAA,YAClD,UAAU,CAAC,QAAQ;AAAA,YAElB,kBAAQ,OAAO,OAAO,cAAc;AAAA;AAAA,QACvC;AAAA,QACA,gBAAAb,MAACa,QAAA,EAAK,gBAAE;AAAA,QACR,gBAAAb;AAAA,UAACa;AAAA,UAAA;AAAA,YACC,OAAO,QAAQ,aAAa,MAAM,YAAY,MAAM;AAAA,YACpD,UAAU,CAAC,QAAQ;AAAA,YAElB,kBAAQ,iBAAiB,SAAS,eAAe;AAAA;AAAA,QACpD;AAAA,QACA,gBAAAb,MAACa,QAAA,EAAK,gBAAE;AAAA,QACR,gBAAAb;AAAA,UAACa;AAAA,UAAA;AAAA,YACC,OAAO,QAAQ,aAAa,MAAM,QAAQ,MAAM;AAAA,YAChD,UAAU,CAAC,QAAQ;AAAA,YAElB,UAAAV,WAAU,QAAQ,QAAQ,EAAE,SAAS,EAAE;AAAA;AAAA,QAC1C;AAAA,QACA,gBAAAH,MAACY,OAAA,EAAI,UAAU,GAAG;AAAA,QAClB,gBAAAZ,MAACa,QAAA,EAAK,OAAO,MAAM,QAAS,kBAAQ,UAAS;AAAA,WAxBrC,GAAG,UAAU,OAAO,IAAI,QAAQ,MAAM,IAAI,CAAC,EAyBrD,CACD;AAAA,MAIF,aAAa,cAAc,SAAS,KACnC,gBAAAb,MAACY,OAAA,EACC,0BAAAX,OAACY,QAAA,EAAK,OAAO,MAAM,QAChB;AAAA,gBAAQ;AAAA,QAAO,QAAQ,WAAW,OAAO,WAAW,CAAC;AAAA,QAAG,QAAQ;AAAA,SACnE,GACF;AAAA,SA1DiB,UAAU,OA4D/B,CACD;AAAA,IAIH,gBAAAb,MAACY,OAAA,EACC,0BAAAX,OAACY,QAAA,EAAK,OAAO,MAAM,QAChB;AAAA,cAAQ;AAAA,MAAY,QAAQ,WAAW,OAAO,WAAW,CAAC;AAAA,MAAG,QAAQ;AAAA,OACxE,GACF;AAAA,IAGC,kBAAkB,WAAW,KAC5B,gBAAAZ,OAACW,OAAA,EAAI,WAAW,GACd;AAAA,sBAAAX,OAACY,QAAA,EAAK,OAAO,MAAM,WAChB;AAAA,gBAAQ;AAAA,QAAM;AAAA,SACjB;AAAA,MACA,gBAAAZ,OAACY,QAAA,EAAK,OAAO,MAAM,SAAS,MAAI,MAC7B;AAAA;AAAA,QAAI;AAAA,QAAE,aAAa,UAAU,CAAC;AAAA,SACjC;AAAA,OACF;AAAA,IAIF,gBAAAb,MAACY,OAAA,EAAI,WAAW,GACd,0BAAAZ,MAACa,QAAA,EAAK,OAAO,MAAM,OAAO,UAAQ,MAC/B,kBACG,oCACA,kEACN,GACF;AAAA,KACF;AAEJ;;;AChcA,SAAgB,YAAAE,YAAU,aAAAC,kBAAiB;AAC3C,SAAS,OAAAC,OAAK,QAAAC,QAAM,UAAAC,eAAc;;;ACIlC,OAAOC,SAAQ;AACf,OAAOC,SAAQ;AACf,OAAOC,WAAU;AAEjB,IAAM,cAAcA,MAAK,KAAKF,IAAG,QAAQ,GAAG,SAAS,aAAa;AAmBlE,IAAM,iBAA4B;AAAA,EAChC,UAAU;AAAA,EACV,aAAa;AAAA,EACb,cAAc;AAAA,EACd,KAAK,CAAC;AACR;AAKO,IAAM,aAAa,CAAC,YAAY,eAAe,gBAAgB,KAAK;AAM3E,SAASG,aAAkB;AACzB,QAAM,MAAMD,MAAK,QAAQ,WAAW;AACpC,MAAI,CAACD,IAAG,WAAW,GAAG,GAAG;AACvB,IAAAA,IAAG,UAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,EACvC;AACF;AAKO,SAAS,YAAuB;AACrC,EAAAE,WAAU;AACV,MAAI,CAACF,IAAG,WAAW,WAAW,GAAG;AAC/B,WAAO,EAAE,GAAG,eAAe;AAAA,EAC7B;AAEA,MAAI;AACF,UAAM,OAAO,KAAK,MAAMA,IAAG,aAAa,aAAa,OAAO,CAAC;AAC7D,WAAO;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA;AAAA,MAEH,KAAK,EAAE,GAAG,eAAe,KAAK,GAAI,KAAK,OAAO,CAAC,EAAG;AAAA,IACpD;AAAA,EACF,QAAQ;AAEN,WAAO,EAAE,GAAG,eAAe;AAAA,EAC7B;AACF;AAKO,SAAS,WAAW,OAA0C;AAEnE,MAAI,MAAM,YAAY,MAAM,OAAQ,QAAO;AAC3C,MAAI,MAAM,YAAY,MAAM,QAAS,QAAO;AAG5C,QAAM,MAAM,OAAO,KAAK;AACxB,MAAI,CAAC,MAAM,GAAG,KAAK,MAAM,KAAK,MAAM,GAAI,QAAO;AAG/C,SAAO;AACT;AAKO,SAAS,WAAW,KAAsB;AAC/C,QAAM,QAAQ,IAAI,MAAM,GAAG;AAG3B,MAAI,MAAM,WAAW,KAAK,MAAM,CAAC,MAAM,OAAO;AAC5C,WAAO;AAAA,EACT;AAGA,SAAO,WAAW,SAAS,GAAe;AAC5C;AAMO,SAAS,UAAU,KAAa,OAAwC;AAC7E,EAAAE,WAAU;AACV,QAAM,SAAS,UAAU;AAEzB,QAAM,OAAO,IAAI,MAAM,GAAG;AAC1B,QAAM,SAAS,KAAK,CAAC;AACrB,MAAI,KAAK,WAAW,KAAK,KAAK,CAAC,MAAM,SAAS,QAAQ;AAEpD,WAAO,IAAI,MAAM,IAAI;AAAA,EACvB,WAAW,WAAW,SAAS,GAAe,GAAG;AAG/C,IAAC,OAAe,GAAG,IAAI;AAAA,EACzB,OAAO;AACL,UAAM,IAAI,MAAM,uBAAuB,GAAG,EAAE;AAAA,EAC9C;AAEA,EAAAF,IAAG,cAAc,aAAa,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC/D;AAMO,SAAS,eAAe,KAAsB;AACnD,QAAM,SAAS,UAAU;AACzB,QAAM,OAAO,IAAI,MAAM,GAAG;AAC1B,QAAM,SAAS,KAAK,CAAC;AAErB,MAAI,KAAK,WAAW,KAAK,KAAK,CAAC,MAAM,SAAS,QAAQ;AACpD,WAAO,OAAO,IAAI,MAAM,KAAK;AAAA,EAC/B;AAEA,MAAI,WAAW,SAAS,GAAe,GAAG;AACxC,WAAO,OAAO,GAAe;AAAA,EAC/B;AAEA,SAAO;AACT;AAKO,SAAS,gBAA2E;AACzF,QAAM,SAAS,UAAU;AACzB,QAAM,cAAcA,IAAG,WAAW,WAAW,IACzC,KAAK,MAAMA,IAAG,aAAa,aAAa,OAAO,CAAC,IAChD,CAAC;AAEL,QAAM,QAAmE,CAAC;AAG1E,QAAM,KAAK;AAAA,IACT,KAAK;AAAA,IACL,OAAO,OAAO,OAAO,QAAQ;AAAA,IAC7B,WAAW,YAAY,aAAa;AAAA,EACtC,CAAC;AACD,QAAM,KAAK;AAAA,IACT,KAAK;AAAA,IACL,OAAO,OAAO,OAAO,WAAW;AAAA,IAChC,WAAW,YAAY,gBAAgB;AAAA,EACzC,CAAC;AACD,QAAM,KAAK;AAAA,IACT,KAAK;AAAA,IACL,OAAO,OAAO;AAAA,IACd,WAAW,YAAY,iBAAiB;AAAA,EAC1C,CAAC;AAGD,QAAM,eAAe,CAAC,YAAY,YAAY,WAAW,YAAY,MAAM;AAC3E,aAAW,SAAS,cAAc;AAChC,UAAM,YAAY,OAAO,IAAI,KAAK;AAClC,UAAM,KAAK;AAAA,MACT,KAAK,OAAO,KAAK;AAAA,MACjB,OAAO,aAAa;AAAA,MACpB,WAAW,CAAC;AAAA,IACd,CAAC;AAAA,EACH;AAGA,aAAW,CAAC,OAAO,GAAG,KAAK,OAAO,QAAQ,OAAO,GAAG,GAAG;AACrD,QAAI,CAAC,aAAa,SAAS,KAAK,KAAK,KAAK;AACxC,YAAM,KAAK;AAAA,QACT,KAAK,OAAO,KAAK;AAAA,QACjB,OAAO;AAAA,QACP,WAAW;AAAA,MACb,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAgCO,SAAS,gBAAwB;AACtC,SAAO;AACT;;;ADzJM,gBAAAG,OAGE,QAAAC,cAHF;AAnCN,SAAS,aAAa;AACpB,QAAM,EAAE,KAAK,IAAIC,QAAO;AACxB,QAAM,CAAC,OAAO,QAAQ,IAAIC,WAAsB,CAAC,CAAC;AAElD,EAAAC,WAAU,MAAM;AACd,UAAM,cAAc,cAAc;AAClC;AAAA,MACE,YAAY,IAAI,CAAC,UAAU;AAAA,QACzB,SAAS,KAAK;AAAA,QACd,OAAO,KAAK;AAAA,QACZ,WAAW,KAAK;AAAA,MAClB,EAAE;AAAA,IACJ;AAEA,eAAW,MAAM,KAAK,GAAG,GAAG;AAAA,EAC9B,GAAG,CAAC,IAAI,CAAC;AAET,QAAM,UAA+B;AAAA,IACnC;AAAA,MACE,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,aAAa,MAAM;AAAA,MACnB,WAAW,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,aAAa,MAAM;AAAA,MACnB,WAAW,CAAC,OAAO,QACjB,IAAI,YAAY,MAAM,QAAQ,MAAM;AAAA,IACxC;AAAA,EACF;AAEA,SACE,gBAAAH,OAACI,OAAA,EAAI,eAAc,UAAS,SAAS,GACnC;AAAA,oBAAAL,MAAC,UAAO,SAAO,MAAC,aAAa,OAAO;AAAA,IAEpC,gBAAAA,MAACK,OAAA,EAAI,cAAc,GACjB,0BAAAJ,OAACK,QAAA,EAAK,OAAO,MAAM,WAChB;AAAA,cAAQ;AAAA,MAAM;AAAA,OACjB,GACF;AAAA,IAEA,gBAAAN,MAAC,SAAM,MAAM,OAAO,SAAkB,UAAQ,MAAC,aAAa,MAAM,QAAQ;AAAA,IAE1E,gBAAAA,MAACK,OAAA,EAAI,WAAW,GACd,0BAAAL,MAACM,QAAA,EAAK,OAAO,MAAM,OAAO,UAAQ,MAAC,4FAEnC,GACF;AAAA,KACF;AAEJ;AAKA,SAAS,UAAU,EAAE,UAAU,GAA0B;AACvD,QAAM,EAAE,KAAK,IAAIJ,QAAO;AACxB,QAAM,CAAC,OAAO,QAAQ,IAAIC,WAAwB,IAAI;AACtD,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAwB,IAAI;AAEtD,EAAAC,WAAU,MAAM;AACd,QAAI,CAAC,WAAW,SAAS,GAAG;AAC1B,eAAS,uBAAuB,SAAS,EAAE;AAAA,IAC7C,OAAO;AACL,YAAM,MAAM,eAAe,SAAS;AACpC,eAAS,QAAQ,UAAa,QAAQ,OAAO,cAAc,OAAO,GAAG,CAAC;AAAA,IACxE;AACA,eAAW,MAAM,KAAK,GAAG,GAAG;AAAA,EAC9B,GAAG,CAAC,WAAW,IAAI,CAAC;AAEpB,MAAI,OAAO;AACT,WACE,gBAAAH,OAACI,OAAA,EAAI,eAAc,UAAS,SAAS,GACnC;AAAA,sBAAAL,MAAC,UAAO,SAAO,MAAC,aAAa,OAAO;AAAA,MACpC,gBAAAA,MAACK,OAAA,EACC,0BAAAJ,OAACK,QAAA,EAAK,OAAO,MAAM,OAAQ;AAAA,gBAAQ;AAAA,QAAO;AAAA,QAAE;AAAA,SAAM,GACpD;AAAA,OACF;AAAA,EAEJ;AAEA,SACE,gBAAAL,OAACI,OAAA,EAAI,eAAc,UAAS,SAAS,GACnC;AAAA,oBAAAL,MAAC,UAAO,SAAO,MAAC,aAAa,OAAO;AAAA,IACpC,gBAAAC,OAACI,OAAA,EACC;AAAA,sBAAAL,MAACM,QAAA,EAAK,OAAO,MAAM,WAAY,qBAAU;AAAA,MACzC,gBAAAN,MAACM,QAAA,EAAK,OAAO,MAAM,OAAO,iBAAG;AAAA,MAC7B,gBAAAN,MAACM,QAAA,EAAK,OAAO,MAAM,SAAU,iBAAM;AAAA,OACrC;AAAA,KACF;AAEJ;AAKA,SAAS,UAAU,EAAE,WAAW,YAAY,GAA+C;AACzF,QAAM,EAAE,KAAK,IAAIJ,QAAO;AACxB,QAAM,CAAC,SAAS,UAAU,IAAIC,WAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAwB,IAAI;AACtD,QAAM,CAAC,aAAa,cAAc,IAAIA,WAA2C,IAAI;AAErF,EAAAC,WAAU,MAAM;AACd,QAAI,CAAC,WAAW,SAAS,GAAG;AAC1B,eAAS,uBAAuB,SAAS,EAAE;AAAA,IAC7C,OAAO;AACL,UAAI;AACF,cAAM,SAAS,WAAW,WAAW;AACrC,uBAAe,MAAM;AACrB,kBAAU,WAAW,MAAM;AAC3B,mBAAW,IAAI;AAAA,MACjB,SAAS,KAAK;AACZ,iBAAS,eAAe,QAAQ,IAAI,UAAU,qBAAqB;AAAA,MACrE;AAAA,IACF;AACA,eAAW,MAAM,KAAK,GAAG,GAAG;AAAA,EAC9B,GAAG,CAAC,WAAW,aAAa,IAAI,CAAC;AAEjC,MAAI,OAAO;AACT,WACE,gBAAAH,OAACI,OAAA,EAAI,eAAc,UAAS,SAAS,GACnC;AAAA,sBAAAL,MAAC,UAAO,SAAO,MAAC,aAAa,OAAO;AAAA,MACpC,gBAAAA,MAACK,OAAA,EACC,0BAAAJ,OAACK,QAAA,EAAK,OAAO,MAAM,OAAQ;AAAA,gBAAQ;AAAA,QAAO;AAAA,QAAE;AAAA,SAAM,GACpD;AAAA,OACF;AAAA,EAEJ;AAEA,MAAI,SAAS;AACX,WACE,gBAAAL,OAACI,OAAA,EAAI,eAAc,UAAS,SAAS,GACnC;AAAA,sBAAAL,MAAC,UAAO,SAAO,MAAC,aAAa,OAAO;AAAA,MACpC,gBAAAC,OAACI,OAAA,EACC;AAAA,wBAAAJ,OAACK,QAAA,EAAK,OAAO,MAAM,SAAU;AAAA,kBAAQ;AAAA,UAAU;AAAA,WAAC;AAAA,QAChD,gBAAAN,MAACM,QAAA,EAAK,OAAO,MAAM,WAAW,kBAAI;AAAA,QAClC,gBAAAN,MAACM,QAAA,EAAK,OAAO,MAAM,SAAU,qBAAU;AAAA,QACvC,gBAAAN,MAACM,QAAA,EAAK,OAAO,MAAM,OAAO,iBAAG;AAAA,QAC7B,gBAAAN,MAACM,QAAA,EAAK,OAAO,MAAM,SAAU,iBAAO,WAAW,GAAE;AAAA,SACnD;AAAA,OACF;AAAA,EAEJ;AAEA,SAAO;AACT;AAKA,SAAS,aAAa;AACpB,QAAM,EAAE,KAAK,IAAIJ,QAAO;AAExB,EAAAE,WAAU,MAAM;AACd,eAAW,MAAM,KAAK,GAAG,GAAG;AAAA,EAC9B,GAAG,CAAC,IAAI,CAAC;AAET,SACE,gBAAAH,OAACI,OAAA,EAAI,eAAc,UAAS,SAAS,GACnC;AAAA,oBAAAL,MAAC,UAAO,SAAO,MAAC,aAAa,OAAO;AAAA,IACpC,gBAAAC,OAACI,OAAA,EACC;AAAA,sBAAAL,MAACM,QAAA,EAAK,OAAO,MAAM,OAAO,2BAAa;AAAA,MACvC,gBAAAN,MAACM,QAAA,EAAK,OAAO,MAAM,WAAY,wBAAc,GAAE;AAAA,OACjD;AAAA,KACF;AAEJ;AAKA,SAAS,aAAa;AACpB,QAAM,EAAE,KAAK,IAAIJ,QAAO;AAExB,EAAAE,WAAU,MAAM;AACd,eAAW,MAAM,KAAK,GAAG,GAAG;AAAA,EAC9B,GAAG,CAAC,IAAI,CAAC;AAET,SACE,gBAAAH,OAACI,OAAA,EAAI,eAAc,UAAS,SAAS,GACnC;AAAA,oBAAAL,MAAC,UAAO,SAAO,MAAC,aAAa,OAAO;AAAA,IAEpC,gBAAAA,MAAC,OAAU,UAAQ,MAAC,OAAM,gBAAe,SAAS,GAChD,0BAAAC,OAACI,OAAA,EAAI,eAAc,UACjB;AAAA,sBAAAL,MAACM,QAAA,EAAK,OAAO,MAAM,WAAW,8BAAgB;AAAA,MAC9C,gBAAAN,MAACM,QAAA,EAAK,OAAO,MAAM,OAAO,iCAAmB;AAAA,MAC7C,gBAAAN,MAACM,QAAA,EAAK,eAAC;AAAA,MAEP,gBAAAN,MAACM,QAAA,EAAK,OAAO,MAAM,WAAW,mCAA2B;AAAA,MACzD,gBAAAN,MAACM,QAAA,EAAK,OAAO,MAAM,OAAO,iCAAmB;AAAA,MAC7C,gBAAAN,MAACM,QAAA,EAAK,eAAC;AAAA,MAEP,gBAAAN,MAACM,QAAA,EAAK,OAAO,MAAM,WAAW,2CAAyC;AAAA,MACvE,gBAAAN,MAACM,QAAA,EAAK,OAAO,MAAM,OAAO,2BAAa;AAAA,MACvC,gBAAAN,MAACM,QAAA,EAAK,eAAC;AAAA,MAEP,gBAAAN,MAACM,QAAA,EAAK,OAAO,MAAM,WAAW,8BAAgB;AAAA,MAC9C,gBAAAN,MAACM,QAAA,EAAK,OAAO,MAAM,OAAO,yCAA2B;AAAA,OACvD,GACF;AAAA,IAEA,gBAAAN,MAACK,OAAA,EAAI,WAAW,GACd,0BAAAL,MAAC,OAAU,UAAQ,MAAC,OAAM,sBAAqB,SAAS,GACtD,0BAAAC,OAACI,OAAA,EAAI,eAAc,UACjB;AAAA,sBAAAJ,OAACI,OAAA,EACC;AAAA,wBAAAL,MAACM,QAAA,EAAK,OAAO,MAAM,SAAS,MAAI,MAAC,sBAAQ;AAAA,QACzC,gBAAAN,MAACM,QAAA,EAAK,OAAO,MAAM,OAAO,uDAAyC;AAAA,SACrE;AAAA,MACA,gBAAAL,OAACI,OAAA,EACC;AAAA,wBAAAL,MAACM,QAAA,EAAK,OAAO,MAAM,SAAS,MAAI,MAAC,yBAAW;AAAA,QAC5C,gBAAAN,MAACM,QAAA,EAAK,OAAO,MAAM,OAAO,yDAA2C;AAAA,SACvE;AAAA,MACA,gBAAAL,OAACI,OAAA,EACC;AAAA,wBAAAL,MAACM,QAAA,EAAK,OAAO,MAAM,SAAS,MAAI,MAAC,0BAAY;AAAA,QAC7C,gBAAAN,MAACM,QAAA,EAAK,OAAO,MAAM,OAAO,sDAAwC;AAAA,SACpE;AAAA,MACA,gBAAAL,OAACI,OAAA,EACC;AAAA,wBAAAL,MAACM,QAAA,EAAK,OAAO,MAAM,SAAS,MAAI,MAAC,yBAAiB;AAAA,QAClD,gBAAAN,MAACM,QAAA,EAAK,OAAO,MAAM,OAAO,2CAA6B;AAAA,SACzD;AAAA,OACF,GACF,GACF;AAAA,IAEA,gBAAAN,MAACK,OAAA,EAAI,WAAW,GACd,0BAAAL,MAAC,OAAU,UAAQ,MAAC,OAAM,YAAW,SAAS,GAC5C,0BAAAC,OAACI,OAAA,EAAI,eAAc,UACjB;AAAA,sBAAAL,MAACM,QAAA,EAAK,OAAO,MAAM,WAAW,0CAA4B;AAAA,MAC1D,gBAAAN,MAACM,QAAA,EAAK,OAAO,MAAM,WAAW,+CAAiC;AAAA,MAC/D,gBAAAN,MAACM,QAAA,EAAK,OAAO,MAAM,WAAW,mEAAqD;AAAA,MACnF,gBAAAN,MAACM,QAAA,EAAK,OAAO,MAAM,WAAW,sCAAwB;AAAA,OACxD,GACF,GACF;AAAA,KACF;AAEJ;AAKO,SAAS,cAAc,EAAE,QAAQ,KAAK,WAAW,MAAM,GAAuB;AAEnF,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO,gBAAAN,MAAC,cAAW;AAAA,IAErB,KAAK;AACH,UAAI,CAAC,WAAW;AACd,eAAO,gBAAAA,MAAC,cAAW;AAAA,MACrB;AACA,aAAO,gBAAAA,MAAC,aAAU,WAAsB;AAAA,IAE1C,KAAK;AACH,UAAI,CAAC,aAAa,UAAU,QAAW;AACrC,eAAO,gBAAAA,MAAC,cAAW;AAAA,MACrB;AACA,aAAO,gBAAAA,MAAC,aAAU,WAAsB,aAAa,OAAO;AAAA,IAE9D,KAAK;AACH,aAAO,gBAAAA,MAAC,cAAW;AAAA,IAErB;AAEE,aAAO,gBAAAA,MAAC,cAAW;AAAA,EACvB;AACF;;;AnB3SA,IAAM,UAAU;AAEhB,IAAM,UAAU,IAAI,QAAQ;AAE5B,QACG,KAAK,MAAM,EACX,YAAY,+DAA+D,EAC3E,QAAQ,SAAS,iBAAiB,6BAA6B,EAC/D,WAAW,cAAc,0BAA0B;AAGtD,QACG,QAAQ,QAAQ,EAChB,YAAY,sCAAsC,EAClD,OAAO,MAAM;AACZ,SAAOO,QAAM,cAAc,MAAM,CAAC;AACpC,CAAC;AAGH,QACG,QAAQ,OAAO,EACf,YAAY,oBAAoB,EAChC,eAAe,kBAAkB,kDAAkD,EACnF,OAAO,gBAAgB,qBAAqB,aAAa,EACzD,eAAe,oBAAoB,mCAAmC,EACtE,eAAe,qBAAqB,kBAAkB,EACtD,OAAO,UAAU,4CAA4C,EAC7D,OAAO,CAAC,YAAY;AACnB;AAAA,IACEA,QAAM,cAAc,cAAc;AAAA,MAChC,WAAW,QAAQ;AAAA,MACnB,SAAS,QAAQ;AAAA,MACjB,OAAO,QAAQ;AAAA,MACf,QAAQ,QAAQ;AAAA,MAChB,YAAY,QAAQ,QAAQ;AAAA,IAC9B,CAAC;AAAA,EACH;AACF,CAAC;AAGH,QACG,QAAQ,iBAAiB,EACzB,YAAY,qBAAqB,EACjC,OAAO,WAAW,kBAAkB,EACpC,OAAO,CAAC,QAAQ,YAAY;AAC3B;AAAA,IACEA,QAAM,cAAc,QAAQ;AAAA,MAC1B;AAAA,MACA,OAAO,QAAQ,SAAS;AAAA,IAC1B,CAAC;AAAA,EACH;AACF,CAAC;AAGH,QACG,QAAQ,QAAQ,EAChB,YAAY,uBAAuB,EACnC,OAAO,UAAU,gBAAgB,EACjC,OAAO,CAAC,YAAY;AACnB;AAAA,IACEA,QAAM,cAAc,eAAe;AAAA,MACjC,MAAM,QAAQ,QAAQ;AAAA,IACxB,CAAC;AAAA,EACH;AACF,CAAC;AAGH,QACG,QAAQ,QAAQ,EAChB,YAAY,wBAAwB,EACpC,OAAO,mBAAmB,8BAA8B,EACxD,OAAO,UAAU,gBAAgB,EACjC,OAAO,CAAC,YAAY;AACnB;AAAA,IACEA,QAAM,cAAc,eAAe;AAAA,MACjC,OAAO,QAAQ;AAAA,MACf,MAAM,QAAQ,QAAQ;AAAA,IACxB,CAAC;AAAA,EACH;AACF,CAAC;AAGH,QACG,QAAQ,QAAQ,EAChB,YAAY,8BAA8B,EAC1C,eAAe,kBAAkB,kDAAkD,EACnF,eAAe,oBAAoB,mCAAmC,EACtE,eAAe,qBAAqB,kBAAkB,EACtD,OAAO,gBAAgB,+CAA+C,EACtE,OAAO,SAAS,0BAA0B,EAC1C,OAAO,kBAAkB,kCAAkC,IAAI,EAC/D,OAAO,CAAC,YAAY;AACnB,gBAAc,OAA+B;AAC/C,CAAC;AAGH,QACG,QAAQ,SAAS,EACjB,YAAY,iCAAiC,EAC7C,OAAO,oBAAoB,6BAA6B,IAAI,EAC5D,OAAO,uBAAuB,0BAA0B,EACxD,OAAO,UAAU,gBAAgB,EACjC,OAAO,CAAC,YAAY;AACnB;AAAA,IACEA,QAAM,cAAc,gBAAgB;AAAA,MAClC,OAAO,SAAS,QAAQ,OAAO,EAAE,KAAK;AAAA,MACtC,SAAS,QAAQ;AAAA,MACjB,MAAM,QAAQ,QAAQ;AAAA,IACxB,CAAC;AAAA,EACH;AACF,CAAC;AAGH,QACG,QAAQ,SAAS,EACjB,YAAY,uBAAuB,EACnC,eAAe,uBAAuB,gBAAgB,EACtD,OAAO,mBAAmB,6BAA6B,EACvD,OAAO,SAAS,wCAAwC,EACxD,OAAO,UAAU,gBAAgB,EACjC,OAAO,CAAC,YAAY;AACnB;AAAA,IACEA,QAAM,cAAc,gBAAgB;AAAA,MAClC,SAAS,QAAQ;AAAA,MACjB,OAAO,QAAQ;AAAA,MACf,SAAS,QAAQ,OAAO;AAAA,MACxB,MAAM,QAAQ,QAAQ;AAAA,IACxB,CAAC;AAAA,EACH;AACF,CAAC;AAGH,QACG,QAAQ,+BAA+B,EACvC,YAAY,0BAA0B,EACtC,OAAO,CAAC,QAAQ,KAAK,UAAU;AAC9B;AAAA,IACEA,QAAM,cAAc,eAAe;AAAA,MACjC;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AACF,CAAC;AAEH,QAAQ,YAAY,SAAS;AAAA,EAC3B,MAAM,KAAK,WAAW,CAAC;AAAA,IACrB,MAAM,IAAI,6DAA6D,CAAC;AAAA;AAAA;AAAA,IAGxE,MAAM,IAAI,sBAAsB,CAAC;AAAA;AAAA;AAAA;AAAA,IAIjC,MAAM,IAAI,4CAA4C,CAAC;AAAA;AAAA;AAAA;AAAA,IAIvD,MAAM,IAAI,4BAA4B,CAAC;AAAA;AAAA;AAAA;AAAA,IAIvC,MAAM,IAAI,oCAAoC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,IAK/C,MAAM,IAAI,mCAAmC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAM9C,MAAM,IAAI,yBAAyB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMpC,MAAM,IAAI,wBAAwB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMrC,MAAM,KAAK,gBAAgB,CAAC;AAAA;AAAA,CAE7B;AAGD,IAAM,OAAO,QAAQ,KAAK,MAAM,CAAC;AACjC,IAAM,aAAa,KAAK,SAAS,KAAK,CAAC,KAAK,CAAC,GAAG,WAAW,GAAG;AAC9D,IAAM,kBAAkB,KAAK,KAAK,SAAO,CAAC,MAAM,UAAU,MAAM,WAAW,EAAE,SAAS,GAAG,CAAC;AAE1F,IAAI,CAAC,cAAc,CAAC,iBAAiB;AAEnC,SAAOA,QAAM,cAAc,MAAM,CAAC;AACpC,OAAO;AAEL,UAAQ,MAAM,QAAQ,IAAI;AAC5B;","names":["React","useState","Box","Text","useInput","Box","Text","jsx","jsxs","Box","Text","Box","Text","jsx","jsxs","label","Box","Text","Box","Text","jsx","jsxs","Text","Box","Box","Text","InkSpinner","jsx","jsxs","Text","InkSpinner","Box","Box","Text","jsx","jsxs","Text","Box","Box","Text","jsx","jsxs","Box","Text","path","jsx","jsxs","Box","Text","useState","useInput","useState","useEffect","Box","Text","useApp","Mina","getChains","HYPEREVM_CHAIN_ID","HYPEREVM_USDC_ADDRESS","jsx","jsxs","Box","Text","HYPEREVM_CHAIN_ID","useApp","useState","useEffect","getChains","HYPEREVM_USDC_ADDRESS","Mina","useState","useEffect","Box","Text","useApp","getChains","HYPEREVM_CHAIN_ID","jsx","jsxs","useApp","useState","useEffect","getChains","HYPEREVM_CHAIN_ID","Box","Text","useState","useEffect","Box","Text","useApp","getChains","getBridgeableTokens","jsx","jsxs","getChains","chain","useApp","useState","useEffect","getBridgeableTokens","Box","Text","useState","useEffect","useCallback","useMemo","Box","Text","useApp","Mina","jsx","jsxs","getStatusColor","jsx","Text","jsxs","Box","useApp","useState","useMemo","Mina","useCallback","useEffect","useState","useEffect","useCallback","Box","Text","useApp","useInput","Mina","getChains","getBridgeableTokens","getQuote","HYPEREVM_CHAIN_ID","HYPEREVM_USDC_ADDRESS","normalizeError","jsx","jsxs","ErrorDisplay","normalizeError","Box","Text","QuoteDisplay","useApp","useState","useInput","useEffect","getChains","getBridgeableTokens","getQuote","HYPEREVM_CHAIN_ID","HYPEREVM_USDC_ADDRESS","useCallback","Mina","render","React","useState","useEffect","Box","Text","useApp","fs","fs","fs","Fragment","jsx","jsxs","truncateHash","Box","Text","useApp","useState","useEffect","React","useState","useEffect","Box","Text","useApp","Mina","getChains","Fragment","jsx","jsxs","truncateAddress","formatUsd","resolveChainId","response","getChains","chain","useApp","useState","useEffect","Mina","Box","Text","React","useState","useEffect","Box","Text","useApp","os","fs","path","ensureDir","jsx","jsxs","useApp","useState","useEffect","Box","Text","React"]}
|