brew-tui 1.2.0 → 1.2.2

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.
Files changed (36) hide show
  1. package/build/{brewbar-installer-GWJ76J6G.js → brewbar-installer-BKE6Z7OI.js} +5 -3
  2. package/build/{brewbar-installer-GWJ76J6G.js.map → brewbar-installer-BKE6Z7OI.js.map} +1 -1
  3. package/build/{brewfile-manager-G7Q4IOG3.js → brewfile-manager-CPVXIVZC.js} +4 -3
  4. package/build/{chunk-KN4GCMIE.js → chunk-5PJWI4XS.js} +20 -1
  5. package/build/chunk-5PJWI4XS.js.map +1 -0
  6. package/build/{chunk-BRXZG7ZL.js → chunk-CMIC4N74.js} +11 -3
  7. package/build/chunk-CMIC4N74.js.map +1 -0
  8. package/build/{chunk-KDKXGXN2.js → chunk-EDQPT5EF.js} +15 -8
  9. package/build/chunk-EDQPT5EF.js.map +1 -0
  10. package/build/{chunk-J6HCX7RG.js → chunk-JNEIP2LJ.js} +2 -2
  11. package/build/chunk-NRRQECXA.js +63 -0
  12. package/build/chunk-NRRQECXA.js.map +1 -0
  13. package/build/{chunk-WDRT6G63.js → chunk-WX7MPVPH.js} +6 -46
  14. package/build/chunk-WX7MPVPH.js.map +1 -0
  15. package/build/{chunk-QX5DEW3S.js → chunk-XI743B6D.js} +408 -2
  16. package/build/chunk-XI743B6D.js.map +1 -0
  17. package/build/{compliance-checker-IXZHIMQG.js → compliance-checker-3FDEX4OI.js} +3 -3
  18. package/build/index.js +299 -566
  19. package/build/index.js.map +1 -1
  20. package/build/{policy-io-EECGRKNA.js → policy-io-P5YIH6C7.js} +2 -2
  21. package/build/{snapshot-ZOJETCED.js → snapshot-RQ444U5L.js} +2 -2
  22. package/build/{sync-engine-76YMONYH.js → sync-engine-Q4B2PPQS.js} +5 -4
  23. package/build/{version-check-MJZDQG73.js → version-check-FKY5HGSI.js} +2 -2
  24. package/package.json +1 -1
  25. package/build/chunk-BRXZG7ZL.js.map +0 -1
  26. package/build/chunk-KDKXGXN2.js.map +0 -1
  27. package/build/chunk-KN4GCMIE.js.map +0 -1
  28. package/build/chunk-QX5DEW3S.js.map +0 -1
  29. package/build/chunk-WDRT6G63.js.map +0 -1
  30. /package/build/{brewfile-manager-G7Q4IOG3.js.map → brewfile-manager-CPVXIVZC.js.map} +0 -0
  31. /package/build/{chunk-J6HCX7RG.js.map → chunk-JNEIP2LJ.js.map} +0 -0
  32. /package/build/{compliance-checker-IXZHIMQG.js.map → compliance-checker-3FDEX4OI.js.map} +0 -0
  33. /package/build/{policy-io-EECGRKNA.js.map → policy-io-P5YIH6C7.js.map} +0 -0
  34. /package/build/{snapshot-ZOJETCED.js.map → snapshot-RQ444U5L.js.map} +0 -0
  35. /package/build/{sync-engine-76YMONYH.js.map → sync-engine-Q4B2PPQS.js.map} +0 -0
  36. /package/build/{version-check-MJZDQG73.js.map → version-check-FKY5HGSI.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.tsx","../src/app.tsx","../src/components/layout/app-layout.tsx","../src/components/layout/header.tsx","../src/hooks/use-terminal-size.ts","../src/stores/navigation-store.ts","../src/lib/license/feature-gate.ts","../src/utils/colors.ts","../src/utils/gradient.tsx","../src/components/common/blinking-text.tsx","../src/utils/spacing.ts","../src/components/layout/footer.tsx","../src/hooks/use-container-size.ts","../src/components/layout/content-size-context.tsx","../src/stores/license-store.ts","../src/lib/license/anti-tamper.ts","../src/hooks/use-keyboard.ts","../src/stores/modal-store.ts","../src/lib/onboarding.ts","../src/views/welcome.tsx","../src/hooks/use-view-input.ts","../src/components/common/upgrade-prompt.tsx","../src/views/dashboard.tsx","../src/hooks/use-visible-rows.ts","../src/stores/brew-store.ts","../src/lib/brew-api.ts","../src/lib/parsers/json-parser.ts","../src/lib/parsers/text-parser.ts","../src/lib/impact/impact-analyzer.ts","../src/stores/security-store.ts","../src/lib/security/osv-api.ts","../src/lib/security/audit-runner.ts","../src/lib/license/anti-debug.ts","../src/lib/license/canary.ts","../src/lib/license/integrity.ts","../src/lib/license/pro-guard.ts","../src/stores/brewfile-store.ts","../src/stores/sync-store.ts","../src/stores/compliance-store.ts","../src/components/common/stat-card.tsx","../src/components/common/loading.tsx","../src/components/common/status-badge.tsx","../src/components/common/section-header.tsx","../src/components/common/version-arrow.tsx","../src/utils/format.ts","../src/views/installed.tsx","../src/hooks/use-debounce.ts","../src/hooks/use-brew-stream.ts","../src/components/common/search-input.tsx","../src/components/common/confirm-dialog.tsx","../src/components/common/progress-log.tsx","../src/components/common/result-banner.tsx","../src/components/common/selectable-row.tsx","../src/views/search.tsx","../src/views/outdated.tsx","../src/views/package-info.tsx","../src/views/services.tsx","../src/views/doctor.tsx","../src/views/profiles.tsx","../src/stores/profile-store.ts","../src/lib/profiles/profile-manager.ts","../src/lib/license/watermark.ts","../src/views/profiles/profile-list-mode.tsx","../src/views/profiles/profile-detail-mode.tsx","../src/views/profiles/profile-create-flow.tsx","../src/views/profiles/profile-edit-flow.tsx","../src/views/smart-cleanup.tsx","../src/stores/cleanup-store.ts","../src/lib/cleanup/cleanup-analyzer.ts","../src/views/history.tsx","../src/stores/history-store.ts","../src/views/security-audit.tsx","../src/views/account.tsx","../src/lib/license/promo.ts","../src/views/rollback.tsx","../src/stores/rollback-store.ts","../src/lib/rollback/rollback-engine.ts","../src/views/brewfile.tsx","../src/views/sync.tsx","../src/views/compliance.tsx","../src/lib/compliance/compliance-remediator.ts","../src/lib/crash-reporter.ts"],"sourcesContent":["import React from 'react';\nimport { createInterface } from 'node:readline/promises';\nimport { rm } from 'node:fs/promises';\nimport { render } from 'ink';\nimport { App } from './app.js';\nimport { activate, deactivate, loadLicense, revalidate } from './lib/license/license-manager.js';\nimport { ensureDataDirs, DATA_DIR } from './lib/data-dir.js';\nimport { t } from './i18n/index.js';\nimport { useLicenseStore } from './stores/license-store.js';\nimport { formatDate } from './utils/format.js';\nimport { installCrashReporter, reportError } from './lib/crash-reporter.js';\n\nconst [,, command, arg] = process.argv;\n\nasync function runCli() {\n // --version / -v: print and exit before any TUI/Ink/data-dir setup so that\n // BrewBar (and any tooling) can read the version cheaply via execFile.\n if (command === '--version' || command === '-v' || command === 'version') {\n process.stdout.write((process.env.APP_VERSION ?? '0.0.0') + '\\n');\n return;\n }\n\n await ensureDataDirs();\n await installCrashReporter();\n\n if (command === 'activate') {\n const key = arg?.trim() ?? '';\n if (!key) {\n console.error(t('cli_usageActivate'));\n process.exit(1);\n }\n try {\n const license = await activate(key);\n console.log(t('cli_activated', { email: license.customerEmail }));\n console.log(t('cli_planPro'));\n if (license.expiresAt) {\n console.log(t('cli_expires', { date: formatDate(license.expiresAt) }));\n }\n } catch (err) {\n console.error(t('cli_activationFailed', { error: err instanceof Error ? err.message : String(err) }));\n process.exit(1);\n }\n return;\n }\n\n if (command === 'deactivate') {\n const license = await loadLicense();\n if (!license) {\n console.log(t('cli_noLicense'));\n return;\n }\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const answer = await rl.question(t('cli_confirmDeactivate'));\n rl.close();\n if (answer.toLowerCase() !== 'y' && answer.toLowerCase() !== 's') {\n console.log(t('cli_deactivateCancelled'));\n return;\n }\n const { remoteSuccess } = await deactivate(license);\n console.log(t('cli_deactivated'));\n if (!remoteSuccess) {\n console.warn(t('cli_deactivateRemoteFailed'));\n }\n return;\n }\n\n if (command === 'revalidate') {\n const license = await loadLicense();\n if (!license) {\n console.log(t('cli_noLicense'));\n process.exit(1);\n }\n\n const result = await revalidate(license);\n if (result === 'expired') {\n console.error(t('cli_revalidateFailed'));\n process.exit(1);\n }\n\n const updated = await loadLicense();\n if (result === 'grace') {\n console.warn(t('cli_revalidateGrace'));\n } else {\n console.log(t('cli_revalidated'));\n }\n if (updated?.expiresAt) {\n console.log(t('cli_expires', { date: formatDate(updated.expiresAt) }));\n }\n return;\n }\n\n if (command === 'status') {\n await useLicenseStore.getState().initialize();\n const { status, license, degradation } = useLicenseStore.getState();\n const isPro = useLicenseStore.getState().isPro();\n\n if (status === 'free') {\n console.log(t('cli_planFree'));\n console.log(t('cli_upgradeHint'));\n } else {\n const planLabel = status === 'expired' ? t('cli_planExpired') : t('cli_planPro');\n console.log(planLabel);\n if (license) {\n console.log(t('cli_email', { email: license.customerEmail }));\n }\n\n const statusText = status === 'pro'\n ? (degradation === 'none' ? (license?.status ?? 'active') : degradation)\n : status;\n console.log(t('cli_status', { status: statusText }));\n\n if (license?.expiresAt) {\n console.log(t('cli_expires', { date: formatDate(license.expiresAt) }));\n }\n if (status === 'expired') {\n console.log(t('cli_revalidateHint'));\n }\n if (status === 'pro' && degradation !== 'none' && license) {\n const days = Math.floor((Date.now() - new Date(license.lastValidatedAt).getTime()) / (24 * 60 * 60 * 1000));\n console.log(t('license_offlineWarning', { days }));\n console.log(t('cli_revalidateHint'));\n }\n }\n\n // Pro-only status sections\n if (isPro) {\n // Snapshots\n try {\n const { loadSnapshots } = await import('./lib/state-snapshot/snapshot.js');\n const snapshots = await loadSnapshots();\n if (snapshots.length > 0) {\n const latest = snapshots[0];\n console.log(`\\nSnapshots: ${snapshots.length} (latest: ${latest ? formatDate(latest.capturedAt) : '—'})`);\n } else {\n console.log('\\nSnapshots: none');\n }\n } catch {\n // Non-fatal: snapshot dir may not exist yet\n }\n\n // Brewfile drift\n try {\n const { loadBrewfile, computeDrift } = await import('./lib/brewfile/brewfile-manager.js');\n const schema = await loadBrewfile();\n if (schema) {\n const drift = await computeDrift(schema);\n console.log(`Brewfile: ${drift.score}% compliant (${drift.missingPackages.length} missing, ${drift.extraPackages.length} extra)`);\n }\n } catch {\n // Non-fatal\n }\n\n // Sync last sync date\n try {\n const { loadSyncConfig } = await import('./lib/sync/sync-engine.js');\n const syncConfig = await loadSyncConfig();\n if (syncConfig?.lastSync) {\n console.log(`Sync: last sync ${formatDate(syncConfig.lastSync)}`);\n }\n } catch {\n // Non-fatal\n }\n\n // Compliance score\n try {\n const { loadPolicy } = await import('./lib/compliance/policy-io.js');\n const { checkCompliance } = await import('./lib/compliance/compliance-checker.js');\n // Try loading from default location\n const policy = await loadPolicy(`${process.env['HOME'] ?? '~'}/.brew-tui/policy.yaml`).catch(() => null);\n if (policy) {\n const report = await checkCompliance(policy, true);\n console.log(`Compliance: ${report.score}% (${report.violations.length} violation(s))`);\n }\n } catch {\n // Non-fatal: no policy loaded\n }\n }\n\n return;\n }\n\n if (command === 'install-brewbar') {\n await useLicenseStore.getState().initialize();\n const isPro = useLicenseStore.getState().isPro();\n const { installBrewBar } = await import('./lib/brewbar-installer.js');\n try {\n console.log(t('cli_brewbarInstalling'));\n await installBrewBar(isPro, arg === '--force');\n console.log(t('cli_brewbarInstalled'));\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n return;\n }\n\n if (command === 'uninstall-brewbar') {\n const { uninstallBrewBar } = await import('./lib/brewbar-installer.js');\n try {\n await uninstallBrewBar();\n console.log(t('cli_brewbarUninstalled'));\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n return;\n }\n\n // SEG-007: delete-account subcommand\n if (command === 'delete-account') {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const answer = await rl.question(t('delete_account_confirm') + ' (y/N): ');\n rl.close();\n if (answer.toLowerCase() !== 'y' && answer.toLowerCase() !== 's') {\n console.log(t('cli_deactivateCancelled'));\n return;\n }\n await rm(DATA_DIR, { recursive: true, force: true });\n console.log(t('delete_account_success'));\n return;\n }\n\n // Auto-install + auto-launch BrewBar for Pro users on macOS.\n // Runs before the TUI clears the screen so progress messages are visible on cold install.\n await ensureBrewBarRunning();\n\n // Default: launch TUI. Mark TUI mode so the logger redirects to a file\n // instead of stdout/stderr (which would corrupt the Ink-rendered frame).\n process.env.BREW_TUI_TUI_MODE = '1';\n process.stdout.write('\\x1B[2J\\x1B[3J\\x1B[H');\n render(<App />);\n}\n\nasync function ensureBrewBarRunning() {\n if (process.platform !== 'darwin') return;\n\n await useLicenseStore.getState().initialize();\n if (!useLicenseStore.getState().isPro()) return;\n\n const { isBrewBarInstalled, installBrewBar, launchBrewBar } = await import('./lib/brewbar-installer.js');\n const { checkBrewBarVersion } = await import('./lib/version-check.js');\n\n try {\n if (!await isBrewBarInstalled()) {\n console.log(t('cli_brewbarInstalling'));\n await installBrewBar(true, false);\n console.log(t('cli_brewbarInstalled'));\n } else {\n // Cross-platform contract: BrewBar must match Brew-TUI's version so\n // license decryption and any future IPC stay compatible. If the user's\n // BrewBar is older than this CLI (e.g. they upgraded brew-tui via\n // Homebrew/npm but never re-ran install-brewbar), reinstall in place.\n const status = await checkBrewBarVersion();\n if (status.kind === 'outdated') {\n console.log(t('cli_brewbarUpdating', { installed: status.installed, expected: status.expected }));\n await installBrewBar(true, true);\n console.log(t('cli_brewbarInstalled'));\n }\n }\n await launchBrewBar();\n } catch (err) {\n // Non-fatal: log a single line and continue to TUI so brew-tui stays usable.\n console.warn(t('cli_brewbarAutoFailed', { error: err instanceof Error ? err.message : String(err) }));\n }\n}\n\nrunCli().catch((err) => {\n console.error(err instanceof Error ? err.message : String(err));\n void reportError(err, { kind: 'runCli-rejection' }).finally(() => process.exit(1));\n});\n","import React, { useEffect, useState } from 'react';\nimport { useApp } from 'ink';\nimport { AppLayout } from './components/layout/app-layout.js';\nimport { useNavigationStore } from './stores/navigation-store.js';\nimport { useLicenseStore } from './stores/license-store.js';\nimport { useGlobalKeyboard } from './hooks/use-keyboard.js';\nimport { hasCompletedOnboarding } from './lib/onboarding.js';\nimport { WelcomeView } from './views/welcome.js';\nimport { isProView, isTeamView } from './lib/license/feature-gate.js';\nimport { UpgradePrompt } from './components/common/upgrade-prompt.js';\nimport { DashboardView } from './views/dashboard.js';\nimport { InstalledView } from './views/installed.js';\nimport { SearchView } from './views/search.js';\nimport { OutdatedView } from './views/outdated.js';\nimport { PackageInfoView } from './views/package-info.js';\nimport { ServicesView } from './views/services.js';\nimport { DoctorView } from './views/doctor.js';\nimport { ProfilesView } from './views/profiles.js';\nimport { SmartCleanupView } from './views/smart-cleanup.js';\nimport { HistoryView } from './views/history.js';\nimport { SecurityAuditView } from './views/security-audit.js';\nimport { AccountView } from './views/account.js';\nimport { RollbackView } from './views/rollback.js';\nimport { BrewfileView } from './views/brewfile.js';\nimport { SyncView } from './views/sync.js';\nimport { ComplianceView } from './views/compliance.js';\nimport type { ViewId } from './lib/types.js';\n\n// FE-009: Extracted LicenseInitializer component\nfunction LicenseInitializer() {\n const initLicense = useLicenseStore((s) => s.initialize);\n useEffect(() => { initLicense(); }, []);\n return null;\n}\n\n// FE-009: Extracted ViewRouter component\nfunction ViewRouter({ currentView }: { currentView: ViewId }) {\n const isPro = useLicenseStore((s) => s.isPro);\n const isTeam = useLicenseStore((s) => s.isTeam);\n\n // Gate Pro views\n if (isProView(currentView) && !isPro()) {\n return <UpgradePrompt viewId={currentView} />;\n }\n\n // Gate Team views\n if (isTeamView(currentView) && !isTeam()) {\n return <UpgradePrompt viewId={currentView} />;\n }\n\n switch (currentView) {\n case 'dashboard': return <DashboardView />;\n case 'installed': return <InstalledView />;\n case 'search': return <SearchView />;\n case 'outdated': return <OutdatedView />;\n case 'package-info': return <PackageInfoView />;\n case 'services': return <ServicesView />;\n case 'doctor': return <DoctorView />;\n case 'profiles': return <ProfilesView />;\n case 'smart-cleanup': return <SmartCleanupView />;\n case 'history': return <HistoryView />;\n case 'rollback': return <RollbackView />;\n case 'brewfile': return <BrewfileView />;\n case 'sync': return <SyncView />;\n case 'security-audit': return <SecurityAuditView />;\n case 'compliance': return <ComplianceView />;\n case 'account': return <AccountView />;\n }\n}\n\nexport function App() {\n const { exit } = useApp();\n const currentView = useNavigationStore((s) => s.currentView);\n\n // UX-002: gate the whole app behind a one-shot welcome screen on first run.\n // Loading state is `null` until the disk check finishes — we render nothing\n // for that frame so a returning user never sees the welcome flash. In Vitest\n // (NODE_ENV=test) we skip the disk hop so render-tests keep their semantics.\n const isTestEnv = typeof process !== 'undefined' && process.env?.['NODE_ENV'] === 'test';\n const [showWelcome, setShowWelcome] = useState<boolean | null>(isTestEnv ? false : null);\n useEffect(() => {\n if (isTestEnv) return;\n void hasCompletedOnboarding().then((done) => setShowWelcome(!done));\n }, []);\n\n useGlobalKeyboard({ onQuit: exit });\n\n if (showWelcome === null) {\n return <AppLayout><></></AppLayout>;\n }\n\n if (showWelcome) {\n return (\n <AppLayout>\n <WelcomeView onContinue={() => setShowWelcome(false)} />\n </AppLayout>\n );\n }\n\n return (\n <AppLayout>\n <LicenseInitializer />\n <ViewRouter currentView={currentView} />\n </AppLayout>\n );\n}\n","import React, { useRef } from 'react';\nimport { Box, type DOMElement } from 'ink';\nimport { Header } from './header.js';\nimport { Footer } from './footer.js';\nimport { SPACING } from '../../utils/spacing.js';\nimport { useTerminalSize } from '../../hooks/use-terminal-size.js';\nimport { useContainerSize } from '../../hooks/use-container-size.js';\nimport { ContentSizeProvider } from './content-size-context.js';\n\ninterface AppLayoutProps {\n children: React.ReactNode;\n}\n\nexport function AppLayout({ children }: AppLayoutProps) {\n const { rows } = useTerminalSize();\n const contentRef = useRef<DOMElement>(null);\n const contentSize = useContainerSize(contentRef);\n const innerContentSize = {\n width: Math.max(0, contentSize.width - SPACING.sm * 2),\n height: Math.max(0, contentSize.height - SPACING.xs * 2),\n };\n\n return (\n <Box flexDirection=\"column\" width=\"100%\" height={rows} overflow=\"hidden\">\n <Box flexShrink={0}>\n <Header />\n </Box>\n <Box\n ref={contentRef}\n flexDirection=\"column\"\n flexGrow={1}\n flexShrink={1}\n minHeight={0}\n overflow=\"hidden\"\n paddingX={SPACING.sm}\n paddingY={SPACING.xs}\n >\n <ContentSizeProvider value={innerContentSize}>\n {children}\n </ContentSizeProvider>\n </Box>\n <Box flexShrink={0}>\n <Footer />\n </Box>\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { useTerminalSize } from '../../hooks/use-terminal-size.js';\nimport { useNavigationStore, MENU_VIEWS } from '../../stores/navigation-store.js';\nimport { isProView, isTeamView } from '../../lib/license/feature-gate.js';\nimport { COLORS } from '../../utils/colors.js';\nimport { t, useLocaleStore } from '../../i18n/index.js';\nimport { GradientText, GRADIENTS } from '../../utils/gradient.js';\nimport { BlinkingText } from '../common/blinking-text.js';\nimport type { ViewId } from '../../lib/types.js';\nimport type { TranslationKey } from '../../i18n/en.js';\nimport { SPACING } from '../../utils/spacing.js';\n\n// BREW portion (cols 0-27) and TUI portion (cols 28+) rendered in different colors\nconst LOGO_BREW = [\n '╭━━╮╱╭━━━╮╭━━━╮╭╮╭╮╭╮╱╱╱╱╱╱╱',\n '┃╭╮┃╱┃╭━╮┃┃╭━━╯┃┃┃┃┃┃╱╱╱╱╱╱╱',\n '┃╰╯╰╮┃╰━╯┃┃╰━━╮┃┃┃┃┃┃╱╱╱╱╱╱╱',\n '┃╭━╮┃┃╭╮╭╯┃╭━━╯┃╰╯╰╯┃╭━━┳━━╮',\n '┃╰━╯┃┃┃┃╰╮┃╰━━╮╰╮╭╮╭╯╰━━┻━━╯',\n '╰━━━╯╰╯╰━╯╰━━━╯╱╰╯╰╯╱╱╱╱╱╱╱╱',\n];\nconst LOGO_TUI = [\n '╭━━━━╮╭╮╱╭╮╭━━╮',\n '┃╭╮╭╮┃┃┃╱┃┃╰┫┣╯',\n '╰╯┃┃╰╯┃┃╱┃┃╱┃┃',\n '╱╱┃┃╱╱┃┃╱┃┃╱┃┃',\n '╱╱┃┃╱╱┃╰━╯┃╭┫┣╮',\n '╱╱╰╯╱╱╰━━━╯╰━━╯',\n];\n\nconst VIEW_LABEL_KEYS: Record<ViewId, TranslationKey> = {\n dashboard: 'view_dashboard',\n installed: 'view_installed',\n search: 'view_search',\n outdated: 'view_outdated',\n 'package-info': 'view_packageInfo',\n services: 'view_services',\n doctor: 'view_doctor',\n profiles: 'view_profiles',\n 'smart-cleanup': 'view_smartCleanup',\n history: 'view_history',\n rollback: 'view_rollback',\n brewfile: 'view_brewfile',\n sync: 'view_sync',\n 'security-audit': 'view_securityAudit',\n compliance: 'view_compliance',\n account: 'view_account',\n};\n\ninterface MenuItemProps {\n view: ViewId;\n currentView: ViewId;\n cursorView: ViewId | null;\n menuMode: boolean;\n}\n\nfunction MenuItem({ view, currentView, cursorView, menuMode }: MenuItemProps) {\n const viewLabel = t(VIEW_LABEL_KEYS[view]);\n const isPro = isProView(view) || isTeamView(view);\n const isCurrent = view === currentView;\n const isCursor = menuMode && view === cursorView;\n const isAccount = view === 'account';\n\n const indicatorColor = isCursor ? COLORS.brand : COLORS.success;\n const labelColor = isCursor\n ? COLORS.brand\n : isCurrent\n ? COLORS.success\n : isAccount\n ? COLORS.gold\n : COLORS.textSecondary;\n\n // Show only one arrow at a time: cursor while in menu mode, otherwise the\n // current view. Two arrows make the highlight ambiguous.\n const showArrow = menuMode ? isCursor : isCurrent;\n\n return (\n <Box>\n {showArrow ? (\n <Text color={indicatorColor} bold>{'▶'} </Text>\n ) : (\n <Text> </Text>\n )}\n <Text bold={showArrow} underline={!menuMode && isCurrent} color={labelColor}>{viewLabel}</Text>\n {isPro && <Text color={COLORS.brand} bold> {t('pro_badge')}</Text>}\n </Box>\n );\n}\n\nconst COL1_VIEWS = MENU_VIEWS.slice(0, 6);\nconst COL2_VIEWS = MENU_VIEWS.slice(6);\n\nexport function Header() {\n const currentView = useNavigationStore((s) => s.currentView);\n const menuMode = useNavigationStore((s) => s.menuMode);\n const menuCursor = useNavigationStore((s) => s.menuCursor);\n useLocaleStore((s) => s.locale);\n const { columns, rows } = useTerminalSize();\n const isNarrow = columns < 95;\n const hideLogoByWidth = columns < 45;\n // Vertical breakpoints. The full menu is 10 rows (8 entries + bottom hint +\n // borders); the logo is 6 rows; leave at least 8 rows for content + footer.\n // - rows >= 32: logo + menu (full)\n // - 22..31: drop logo, keep menu\n // - rows < 22 and not in menuMode: collapse menu to a single status line\n // - rows < 22 and menuMode: show the menu anyway (user is navigating)\n const hideLogoByHeight = rows < 32;\n const collapseMenu = rows < 22 && !menuMode;\n const cursorView = menuMode ? (MENU_VIEWS[menuCursor] ?? null) : null;\n\n const logoBlock = (\n <Box flexDirection=\"column\" flexShrink={0}>\n {LOGO_BREW.map((brew, i) => (\n <Box key={`logo-${i}`}>\n <GradientText colors={GRADIENTS.gold}>{brew}</GradientText>\n <GradientText colors={GRADIENTS.darkGold}>{LOGO_TUI[i]}</GradientText>\n </Box>\n ))}\n </Box>\n );\n\n const menuBorderColor = menuMode ? COLORS.brand : COLORS.lavender;\n\n const menuBlock = (\n <Box borderStyle=\"round\" borderColor={menuBorderColor} paddingX={SPACING.xs} flexDirection=\"column\" alignSelf={isNarrow ? 'flex-start' : 'center'}>\n <Box flexDirection=\"row\">\n <Box flexDirection=\"column\">\n {COL1_VIEWS.map((view) => (\n <MenuItem key={view} view={view} currentView={currentView} cursorView={cursorView} menuMode={menuMode} />\n ))}\n </Box>\n <Box flexDirection=\"column\" marginLeft={SPACING.sm}>\n {COL2_VIEWS.map((view) => (\n <MenuItem key={view} view={view} currentView={currentView} cursorView={cursorView} menuMode={menuMode} />\n ))}\n </Box>\n </Box>\n <Box borderStyle=\"single\" borderTop borderBottom={false} borderLeft={false} borderRight={false} borderColor={menuBorderColor} marginTop={SPACING.none}>\n {menuMode ? (\n <Text color={COLORS.brand}>\n {t('hint_menuMode_prefix')}\n <BlinkingText color={COLORS.brand}>m</BlinkingText>\n {t('hint_menuMode_suffix')}\n </Text>\n ) : (\n <Text color={COLORS.textSecondary}>\n <BlinkingText color={COLORS.brand}>M</BlinkingText>\n {t('hint_menuOpen_suffix')}\n </Text>\n )}\n </Box>\n </Box>\n );\n\n // Single-row collapsed header. Shows the current view and the global hint\n // line so the user always sees both context and how to expand the menu.\n if (collapseMenu) {\n const currentLabel = t(VIEW_LABEL_KEYS[currentView]);\n const currentIsPro = isProView(currentView) || isTeamView(currentView);\n return (\n <Box paddingX={SPACING.xs}>\n <Text color={COLORS.success} bold>{'▶ '}</Text>\n <Text color={COLORS.success} bold>{currentLabel}</Text>\n {currentIsPro && <Text color={COLORS.brand} bold> {t('pro_badge')}</Text>}\n <Text color={COLORS.textSecondary}> </Text>\n <BlinkingText color={COLORS.brand}>M</BlinkingText>\n <Text color={COLORS.textSecondary}>{t('hint_menuOpen_suffix')}</Text>\n </Box>\n );\n }\n\n if (isNarrow) {\n return (\n <Box flexDirection=\"column\" paddingX={SPACING.xs}>\n {!hideLogoByWidth && !hideLogoByHeight && logoBlock}\n <Box marginTop={hideLogoByWidth || hideLogoByHeight ? SPACING.none : SPACING.xs}>{menuBlock}</Box>\n </Box>\n );\n }\n\n // Wide terminal but short: stack vertically and drop the logo.\n if (hideLogoByHeight) {\n return (\n <Box flexDirection=\"column\" paddingX={SPACING.xs}>\n {menuBlock}\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"row\" paddingX={SPACING.xs} alignItems=\"center\">\n {logoBlock}\n <Box marginLeft={SPACING.sm}>{menuBlock}</Box>\n </Box>\n );\n}\n","import { useEffect, useState } from 'react';\nimport { useStdout } from 'ink';\n\nexport interface TerminalSize {\n columns: number;\n rows: number;\n}\n\n// Reactive viewport hook. Equivalent of `100vw` / `100vh` in CSS.\n//\n// `stdout.columns` / `stdout.rows` are mutable properties that change on\n// SIGWINCH but do not trigger React re-renders. We listen for `resize` and\n// snapshot the values into state so consumers re-render naturally.\n//\n// The listener is registered once per mount and removed on unmount. We do not\n// debounce: terminal resizes are user-driven and infrequent, and any debounce\n// would introduce a perceptible lag during window drag.\nexport function useTerminalSize(): TerminalSize {\n const { stdout } = useStdout();\n const [size, setSize] = useState<TerminalSize>(() => ({\n columns: stdout?.columns ?? 80,\n rows: stdout?.rows ?? 24,\n }));\n\n useEffect(() => {\n if (!stdout) return;\n const onResize = () => {\n setSize({\n columns: stdout.columns ?? 80,\n rows: stdout.rows ?? 24,\n });\n };\n stdout.on('resize', onResize);\n return () => {\n stdout.off('resize', onResize);\n };\n }, [stdout]);\n\n return size;\n}\n","import { create } from 'zustand';\nimport type { ViewId } from '../lib/types.js';\n\ninterface NavigationState {\n currentView: ViewId;\n selectedPackage: string | null;\n selectedPackageType: 'formula' | 'cask' | null;\n viewHistory: ViewId[];\n menuMode: boolean;\n menuCursor: number;\n navigate: (view: ViewId) => void;\n goBack: () => void;\n selectPackage: (name: string | null, type?: 'formula' | 'cask' | null) => void;\n enterMenuMode: () => void;\n exitMenuMode: () => void;\n moveMenuCursor: (delta: 1 | -1) => void;\n selectMenuItem: () => void;\n}\n\nconst VIEWS: ViewId[] = [\n 'dashboard', 'installed', 'outdated', 'package-info', 'search', 'services', 'doctor',\n 'profiles', 'smart-cleanup', 'history', 'rollback', 'brewfile', 'sync', 'security-audit', 'compliance', 'account',\n];\n\n// MENU_VIEWS is the ordered list rendered in the side menu. Excludes `search`\n// (contextual entry via S) but keeps `package-info` because the header shows it.\n// menuCursor indexes into this list.\nconst MENU_VIEWS: ViewId[] = [\n 'dashboard', 'installed', 'outdated', 'package-info', 'services', 'doctor',\n 'profiles', 'smart-cleanup', 'history', 'rollback', 'brewfile', 'sync', 'security-audit', 'compliance', 'account',\n];\n\nexport const useNavigationStore = create<NavigationState>((set, get) => ({\n currentView: 'dashboard',\n selectedPackage: null,\n selectedPackageType: null,\n viewHistory: [],\n // menuMode starts ON so the side menu owns arrows from the first frame —\n // users can navigate with ↑/↓/↵ without having to press M first.\n menuMode: true,\n menuCursor: 0,\n\n navigate: (view) => {\n const { currentView, viewHistory } = get();\n if (view === currentView) return;\n set({\n currentView: view,\n viewHistory: [...viewHistory.slice(-19), currentView],\n });\n },\n\n goBack: () => {\n const { viewHistory, menuMode } = get();\n if (menuMode) {\n set({ menuMode: false });\n return;\n }\n if (viewHistory.length === 0) return;\n const prev = viewHistory[viewHistory.length - 1];\n set({\n currentView: prev,\n viewHistory: viewHistory.slice(0, -1),\n });\n },\n\n selectPackage: (name, type = null) => set({ selectedPackage: name, selectedPackageType: type }),\n\n enterMenuMode: () => {\n const { currentView } = get();\n const idx = MENU_VIEWS.indexOf(currentView);\n set({ menuMode: true, menuCursor: idx >= 0 ? idx : 0 });\n },\n\n exitMenuMode: () => set({ menuMode: false }),\n\n moveMenuCursor: (delta) => {\n const { menuCursor } = get();\n const next = menuCursor + delta;\n if (next < 0 || next >= MENU_VIEWS.length) return;\n set({ menuCursor: next });\n },\n\n selectMenuItem: () => {\n const { menuCursor, currentView, viewHistory } = get();\n const target = MENU_VIEWS[menuCursor];\n if (!target) {\n set({ menuMode: false });\n return;\n }\n if (target === currentView) {\n set({ menuMode: false });\n return;\n }\n set({\n currentView: target,\n viewHistory: [...viewHistory.slice(-19), currentView],\n menuMode: false,\n });\n },\n}));\n\nexport function getNextView(current: ViewId): ViewId {\n const idx = VIEWS.indexOf(current);\n return VIEWS[(idx + 1) % VIEWS.length]!;\n}\n\nexport function getPrevView(current: ViewId): ViewId {\n const idx = VIEWS.indexOf(current);\n return VIEWS[(idx - 1 + VIEWS.length) % VIEWS.length]!;\n}\n\nexport { VIEWS, MENU_VIEWS };\n","import type { ViewId } from '../types.js';\n\nconst PRO_VIEWS = new Set<ViewId>([\n 'profiles',\n 'smart-cleanup',\n 'history',\n 'rollback',\n 'brewfile',\n 'sync',\n 'security-audit',\n]);\n\n// Team-tier views — superset de Pro, requieren licencia Team (o Pro durante lanzamiento)\nconst TEAM_VIEWS = new Set<ViewId>(['compliance']);\n\nexport function isProView(viewId: ViewId): boolean {\n return PRO_VIEWS.has(viewId);\n}\n\nexport function isTeamView(viewId: ViewId): boolean {\n return TEAM_VIEWS.has(viewId);\n}\n","/**\n * Semantic color tokens for Brew-TUI.\n *\n * These constants provide a single source of truth for UI colors.\n * Views should gradually adopt these instead of hardcoded hex strings.\n *\n * NO_COLOR support: when the standard NO_COLOR env var is set to any\n * non-empty value (https://no-color.org), every token is replaced by\n * the empty string so Ink renders plain text without ANSI escapes.\n * Callers continue to pass `color={COLORS.success}` unchanged.\n *\n * DS-005 light-terminal support: COLORFGBG is the de-facto signal terminals\n * publish about their fg/bg luminosity. When the bg is light we swap in a\n * second palette tuned for legibility on white. Override with\n * BREW_TUI_THEME=dark|light if the heuristic is wrong.\n */\nconst DARK_PALETTE = {\n success: '#22C55E',\n error: '#EF4444',\n warning: '#F59E0B',\n info: '#06B6D4',\n brand: '#FF6B2B',\n muted: '#9CA3AF',\n text: '#F9FAFB',\n textSecondary: '#6B7280',\n teal: '#2DD4BF',\n sky: '#38BDF8',\n gold: '#FFD700',\n goldOrange: '#FFA500',\n goldDeep: '#B8860B',\n goldDark: '#8B6914',\n goldDeepest: '#6B4F10',\n purple: '#A855F7',\n blue: '#3B82F6',\n lavender: '#C4B5FD',\n border: '#4B5563',\n white: '#FFFFFF',\n} as const;\n\nconst LIGHT_PALETTE = {\n success: '#15803D',\n error: '#B91C1C',\n warning: '#B45309',\n info: '#0E7490',\n brand: '#C2410C',\n muted: '#4B5563',\n text: '#111827',\n textSecondary: '#374151',\n teal: '#0F766E',\n sky: '#0369A1',\n gold: '#A16207',\n goldOrange: '#9A3412',\n goldDeep: '#7C2D12',\n goldDark: '#5B2509',\n goldDeepest: '#3F1A06',\n purple: '#6B21A8',\n blue: '#1D4ED8',\n lavender: '#6D28D9',\n border: '#D1D5DB',\n white: '#000000', // intentional: \"white-on-light\" reads as black ink\n} as const;\n\ntype ColorKey = keyof typeof DARK_PALETTE;\n\nfunction detectTheme(): 'dark' | 'light' {\n const override = process.env['BREW_TUI_THEME'];\n if (override === 'dark' || override === 'light') return override;\n\n // COLORFGBG is \"<fg>;<bg>\" or \"<fg>;<default>;<bg>\" — the bg index decides.\n const cfb = process.env['COLORFGBG'];\n if (cfb) {\n const parts = cfb.split(';');\n const bg = Number(parts[parts.length - 1]);\n if (!isNaN(bg) && bg >= 7) return 'light';\n if (!isNaN(bg) && bg <= 6) return 'dark';\n }\n return 'dark';\n}\n\nconst PALETTE = detectTheme() === 'light' ? LIGHT_PALETTE : DARK_PALETTE;\n\nfunction isNoColorRequested(): boolean {\n const v = process.env['NO_COLOR'];\n return typeof v === 'string' && v.length > 0;\n}\n\nexport const NO_COLOR = isNoColorRequested();\nexport const THEME = detectTheme();\n\nexport const COLORS: Record<ColorKey, string> = NO_COLOR\n ? (Object.fromEntries(\n (Object.keys(PALETTE) as ColorKey[]).map((k) => [k, '']),\n ) as Record<ColorKey, string>)\n : (PALETTE as Record<ColorKey, string>);\n","import React, { useMemo } from 'react';\nimport { Text } from 'ink';\nimport { COLORS, NO_COLOR } from './colors.js';\n\nfunction hexToRgb(hex: string): [number, number, number] {\n const n = parseInt(hex.slice(1), 16);\n return [(n >> 16) & 255, (n >> 8) & 255, n & 255];\n}\n\nfunction rgbToHex(r: number, g: number, b: number): string {\n return '#' + ((1 << 24) | (r << 16) | (g << 8) | b).toString(16).slice(1).toUpperCase();\n}\n\nfunction lerp(a: number, b: number, t: number): number {\n return Math.round(a + (b - a) * t);\n}\n\nfunction interpolateColor(c1: string, c2: string, t: number): string {\n const [r1, g1, b1] = hexToRgb(c1);\n const [r2, g2, b2] = hexToRgb(c2);\n return rgbToHex(lerp(r1, r2, t), lerp(g1, g2, t), lerp(b1, b2, t));\n}\n\ninterface GradientTextProps {\n children: string;\n colors: string[];\n bold?: boolean;\n}\n\nexport const GradientText = React.memo(function GradientText({ children, colors, bold }: GradientTextProps) {\n // NO_COLOR: skip the per-character coloring and emit a single plain Text.\n // The character-by-character rendering would still produce correct output\n // visually, but each <Text/> element with empty color still ships ANSI\n // resets that some screen readers narrate noisily.\n if (NO_COLOR) {\n return <Text bold={bold}>{children}</Text>;\n }\n if (colors.length < 2) {\n return <Text color={colors[0]} bold={bold}>{children}</Text>;\n }\n\n const coloredChars = useMemo(() => {\n const chars = [...children];\n const maxIdx = Math.max(chars.length - 1, 1);\n\n return chars.map((char, i) => {\n const t = i / maxIdx;\n const segment = t * (colors.length - 1);\n const lower = Math.floor(segment);\n const upper = Math.min(lower + 1, colors.length - 1);\n const frac = segment - lower;\n const color = interpolateColor(colors[lower]!, colors[upper]!, frac);\n return { char, color, key: `${i}-${color}` };\n });\n }, [children, colors]);\n\n return (\n <>\n {coloredChars.map(({ char, color, key }) => (\n <Text key={key} color={color} bold={bold}>{char}</Text>\n ))}\n </>\n );\n});\n\n// DS-003: derive every gradient stop from the COLORS palette so a token edit\n// fans out to all gradients. Keeping the export as a plain object preserves\n// import sites that read GRADIENTS.gold etc.\nexport const GRADIENTS = {\n gold: [COLORS.gold, COLORS.goldOrange, COLORS.goldDeep],\n sunset: [COLORS.brand, COLORS.gold, COLORS.brand],\n ocean: [COLORS.info, COLORS.blue, COLORS.purple],\n emerald: [COLORS.success, COLORS.teal, COLORS.info],\n fire: [COLORS.error, COLORS.warning, COLORS.gold],\n version: [COLORS.error, COLORS.muted, COLORS.teal],\n pro: [COLORS.brand, COLORS.gold, COLORS.brand],\n darkGold:[COLORS.goldDeep, COLORS.goldDark, COLORS.goldDeepest],\n};\n","import React, { useEffect, useState } from 'react';\nimport { Text } from 'ink';\n\ninterface BlinkingTextProps {\n color: string;\n intervalMs?: number;\n bold?: boolean;\n children: React.ReactNode;\n}\n\n// Alternates between bright (full color, bold) and dim (same color, dimColor)\n// on a fixed interval. Used to draw the eye to a keyboard shortcut indicator\n// (e.g. the `M` that opens the side menu) without changing its hue.\nexport function BlinkingText({\n color,\n intervalMs = 600,\n bold = true,\n children,\n}: BlinkingTextProps) {\n const [bright, setBright] = useState(true);\n\n useEffect(() => {\n const id = setInterval(() => setBright((b) => !b), intervalMs);\n return () => clearInterval(id);\n }, [intervalMs]);\n\n return (\n <Text color={color} bold={bold} dimColor={!bright}>\n {children}\n </Text>\n );\n}\n","export const SPACING = {\n none: 0,\n xs: 1,\n sm: 2,\n md: 3,\n lg: 4,\n xl: 6,\n xxl: 8,\n} as const;\n\n// Width breakpoints in columns. Single source of truth for \"is the terminal\n// narrow / mid / wide\" decisions across views. Picked from observed real-world\n// terminal sizes: half-screen iTerm panes hover ~60, full-screen ~120-160.\nexport const BREAKPOINTS = {\n /** Below this we collapse to single-column rows (only the name fits). */\n narrow: 50,\n /** Below this we drop the description column but keep version. */\n mid: 80,\n /** At or above this we render every column comfortably. */\n wide: 120,\n} as const;\n\nexport type LayoutMode = 'single' | 'compact' | 'comfortable' | 'wide';\n\n/** Map a container width (in columns) to a layout mode. Use this in views to\n * decide how many columns to render, instead of comparing magic numbers in-line. */\nexport function getLayoutMode(columns: number): LayoutMode {\n if (columns < BREAKPOINTS.narrow) return 'single';\n if (columns < BREAKPOINTS.mid) return 'compact';\n if (columns < BREAKPOINTS.wide) return 'comfortable';\n return 'wide';\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { useNavigationStore } from '../../stores/navigation-store.js';\nimport { useTerminalSize } from '../../hooks/use-terminal-size.js';\nimport { COLORS } from '../../utils/colors.js';\nimport { t, useLocaleStore } from '../../i18n/index.js';\nimport type { ViewId } from '../../lib/types.js';\nimport type { TranslationKey } from '../../i18n/en.js';\nimport { SPACING } from '../../utils/spacing.js';\n\n// HintDef: numbered actions render as `1:label`; named keys (enter, esc, /,\n// j/k, etc.) render literally so the contextual semantics survive.\ntype HintDef = [key: string, action: TranslationKey];\n\nconst VIEW_HINT_DEFS: Record<ViewId, HintDef[]> = {\n dashboard: [['1', 'hint_refresh']],\n installed: [['/', 'hint_filter'], ['enter', 'hint_info'], ['1', 'hint_uninstall'], ['2', 'hint_switchTab']],\n search: [['enter', 'hint_details'], ['1', 'hint_install']],\n outdated: [['enter', 'hint_upgrade'], ['1', 'hint_upgradeAll'], ['2', 'hint_pin'], ['3', 'hint_refresh']],\n 'package-info': [['1', 'hint_install'], ['2', 'hint_uninstall'], ['3', 'hint_upgrade']],\n services: [['1', 'hint_start'], ['2', 'hint_stop'], ['3', 'hint_restart'], ['4', 'hint_refresh']],\n doctor: [['1', 'hint_refresh']],\n profiles: [['enter', 'hint_details'], ['1', 'hint_new'], ['2', 'hint_edit'], ['3', 'hint_import'], ['4', 'hint_delete']],\n 'smart-cleanup': [['enter', 'hint_toggle'], ['1', 'hint_all'], ['2', 'hint_clean'], ['3', 'hint_force'], ['4', 'hint_refresh']],\n history: [['/', 'hint_search'], ['enter', 'hint_replay'], ['1', 'hint_filter'], ['2', 'hint_clear']],\n 'security-audit': [['enter', 'hint_details'], ['1', 'hint_scan'], ['2', 'hint_upgrade']],\n rollback: [['j/k', 'hint_navigate'], ['enter', 'hint_select'], ['1', 'hint_rollback_confirm']],\n brewfile: [['1', 'hint_new'], ['2', 'hint_refresh'], ['3', 'hint_reconcile']],\n sync: [['1', 'hint_sync'], ['2', 'hint_refresh'], ['3', 'hint_conflict'], ['4', 'hint_useLocal']],\n compliance: [['1', 'hint_scan'], ['2', 'hint_import'], ['3', 'hint_export'], ['4', 'hint_clean']],\n account: [['1', 'hint_promo'], ['2', 'hint_deactivate']],\n};\n\n// Views with no per-view actions only show globals + the chooser line is\n// suppressed because there is nothing to choose from.\nfunction hasNumberedActions(defs: HintDef[]): boolean {\n return defs.some(([key]) => /^\\d+$/.test(key));\n}\n\nfunction HintItem({ def }: { def: HintDef }) {\n return (\n <>\n <Text color={COLORS.text} bold>{def[0]}</Text>\n <Text color={COLORS.textSecondary}>:</Text>\n <Text color={COLORS.gold} dimColor>{t(def[1])}</Text>\n </>\n );\n}\n\nexport function Footer() {\n const currentView = useNavigationStore((s) => s.currentView);\n const menuMode = useNavigationStore((s) => s.menuMode);\n const locale = useLocaleStore((s) => s.locale);\n const { rows } = useTerminalSize();\n const defs = VIEW_HINT_DEFS[currentView] ?? [];\n // Drop the explanatory \"choose a number\" line on short terminals — the hint\n // bar below already shows `1:`, `2:` etc. so the extra row is redundant.\n const showChoose = hasNumberedActions(defs) && !menuMode && rows >= 26;\n\n return (\n <Box flexDirection=\"column\">\n {showChoose && (\n <Box paddingX={SPACING.xs}>\n <Text color={COLORS.text}>{t('hint_chooseNumber')}</Text>\n </Box>\n )}\n <Box borderStyle=\"single\" borderTop borderBottom={false} borderLeft={false} borderRight={false} borderColor={COLORS.gold} paddingX={SPACING.xs} flexWrap=\"wrap\">\n {!menuMode && defs.map((def, i) => (\n <React.Fragment key={`${def[0]}:${def[1]}`}>\n {i > 0 && <Text color={COLORS.border}> {'│'} </Text>}\n <HintItem def={def} />\n </React.Fragment>\n ))}\n {!menuMode && defs.length > 0 && <Text color={COLORS.border}> {'│'} </Text>}\n <Text color={COLORS.text} bold>esc</Text>\n <Text color={COLORS.textSecondary}>:</Text>\n <Text color={COLORS.gold} dimColor>{t('hint_back')}</Text>\n <Text color={COLORS.border}> {'│'} </Text>\n <Text color={COLORS.text} bold>q</Text>\n <Text color={COLORS.textSecondary}>:</Text>\n <Text color={COLORS.gold} dimColor>{t('hint_quit')}</Text>\n <Text color={COLORS.lavender}> {'┃'} </Text>\n <Text color={COLORS.text} bold>L</Text>\n <Text color={COLORS.textSecondary}>:</Text>\n <Text color={COLORS.gold} dimColor>{t('hint_lang')}({locale})</Text>\n </Box>\n </Box>\n );\n}\n","import { useEffect, useState, type RefObject } from 'react';\nimport { measureElement, type DOMElement } from 'ink';\nimport { useTerminalSize } from './use-terminal-size.js';\n\nexport interface ContainerSize {\n width: number;\n height: number;\n}\n\n// Container-size hook. Equivalent of CSS `100cqi` / `100cqb`.\n//\n// Returns the real post-layout dimensions of the referenced <Box>. The first\n// render reports { width: 0, height: 0 } because measureElement requires\n// layout to have run; the effect re-measures synchronously after mount and on\n// every terminal resize, so the second frame onwards is accurate.\n//\n// Consumers MUST attach the returned `ref` to a <Box>, not to a <Text> — Yoga\n// only computes a box for the former.\n//\n// Example:\n// const ref = useRef<DOMElement>(null);\n// const { width } = useContainerSize(ref);\n// return <Box ref={ref}>{width >= 100 ? <Wide /> : <Narrow />}</Box>;\nexport function useContainerSize(\n ref: RefObject<DOMElement | null>,\n): ContainerSize {\n const terminal = useTerminalSize();\n const [size, setSize] = useState<ContainerSize>({ width: 0, height: 0 });\n\n useEffect(() => {\n if (!ref.current) return;\n const measured = measureElement(ref.current);\n // Avoid an extra render when nothing changed (resize on unrelated dim).\n setSize((prev) =>\n prev.width === measured.width && prev.height === measured.height\n ? prev\n : measured,\n );\n // Re-measure on every terminal resize — that's when container width can\n // change, since Yoga reflows from the root.\n }, [ref, terminal.columns, terminal.rows]);\n\n return size;\n}\n","import React, { createContext, useContext } from 'react';\nimport type { ContainerSize } from '../../hooks/use-container-size.js';\n\nconst EMPTY_CONTENT_SIZE: ContainerSize = { width: 0, height: 0 };\n\nconst ContentSizeContext = createContext<ContainerSize>(EMPTY_CONTENT_SIZE);\n\nexport function ContentSizeProvider({\n children,\n value,\n}: {\n children: React.ReactNode;\n value: ContainerSize;\n}) {\n return (\n <ContentSizeContext.Provider value={value}>\n {children}\n </ContentSizeContext.Provider>\n );\n}\n\nexport function useContentSize(): ContainerSize {\n return useContext(ContentSizeContext);\n}\n","import { create } from 'zustand';\nimport type { LicenseData, LicenseStatus } from '../lib/license/types.js';\nimport * as manager from '../lib/license/license-manager.js';\nimport { getDegradationLevel } from '../lib/license/license-manager.js';\nimport type { DegradationLevel } from '../lib/license/license-manager.js';\nimport { ensureDataDirs } from '../lib/data-dir.js';\nimport { initStoreIntegrity } from '../lib/license/anti-tamper.js';\n\nconst REVALIDATION_CHECK_MS = 60 * 60 * 1000; // Check every hour\n\n// ARQ-002: Promise-based mutex for revalidation\nlet _revalidatingPromise: Promise<void> | null = null;\nlet _revalidationInterval: ReturnType<typeof setInterval> | null = null;\n\ninterface LicenseState {\n status: LicenseStatus;\n license: LicenseData | null;\n error: string | null;\n degradation: DegradationLevel;\n\n initialize: () => Promise<void>;\n activate: (key: string) => Promise<boolean>;\n deactivate: () => Promise<void>;\n revalidate: () => Promise<void>;\n isPro: () => boolean;\n isTeam: () => boolean;\n}\n\nasync function doRevalidation(\n license: LicenseData,\n set: (partial: Partial<LicenseState>) => void,\n): Promise<void> {\n const result = await manager.revalidate(license);\n if (result === 'expired') {\n set({ status: 'expired', license: { ...license, status: 'expired' }, degradation: 'expired' });\n } else {\n const updated = await manager.loadLicense();\n const effective = updated ?? license;\n set({ license: effective, degradation: getDegradationLevel(effective) });\n }\n}\n\nexport const useLicenseStore = create<LicenseState>((set, get) => ({\n status: 'validating',\n license: null,\n error: null,\n degradation: 'none',\n\n initialize: async () => {\n initStoreIntegrity(useLicenseStore);\n await ensureDataDirs();\n const license = await manager.loadLicense();\n\n if (!license) {\n set({ status: 'free', license: null, degradation: 'none' });\n return;\n }\n\n // SEG-009: built-in perennial accounts removed; every license — including\n // operator/admin — is validated against Polar like a normal customer.\n\n if (manager.isExpired(license)) {\n set({ status: 'expired', license, degradation: 'expired' });\n return;\n }\n\n // Layer 15: Check degradation level based on offline time\n const level = getDegradationLevel(license);\n if (level === 'expired') {\n set({ status: 'expired', license, degradation: 'expired' });\n return;\n }\n\n // Set tier immediately (warning/limited still shown as the licensed tier, but pro-guard checks degradation)\n set({ status: license.plan, license, degradation: level });\n\n if (manager.needsRevalidation(license)) {\n if (!_revalidatingPromise) {\n _revalidatingPromise = doRevalidation(license, set)\n .finally(() => { _revalidatingPromise = null; });\n }\n await _revalidatingPromise;\n }\n\n // Periodically re-check license validity during the session\n if (_revalidationInterval) clearInterval(_revalidationInterval);\n _revalidationInterval = setInterval(() => {\n const current = get().license;\n const status = get().status;\n if (!current || (status !== 'pro' && status !== 'team')) return;\n if (!manager.needsRevalidation(current)) return;\n if (_revalidatingPromise) return;\n _revalidatingPromise = doRevalidation(current, set)\n .finally(() => { _revalidatingPromise = null; });\n }, REVALIDATION_CHECK_MS);\n _revalidationInterval.unref();\n },\n\n activate: async (key) => {\n set({ error: null });\n try {\n const license = await manager.activate(key);\n set({ status: license.plan, license, degradation: 'none' });\n return true;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n set({ error: msg });\n return false;\n }\n },\n\n deactivate: async () => {\n const { license } = get();\n if (license) {\n const { remoteSuccess } = await manager.deactivate(license);\n if (!remoteSuccess) {\n set({ status: 'free', license: null, degradation: 'none', error: 'License removed locally but server deactivation failed. It may remain active remotely.' });\n return;\n }\n }\n set({ status: 'free', license: null, degradation: 'none', error: null });\n },\n\n revalidate: async () => {\n const { license } = get();\n if (!license) return;\n try {\n await doRevalidation(license, set);\n } catch (err) {\n set({ error: err instanceof Error ? err.message : String(err) });\n }\n },\n\n // Team is a superset of Pro — team users have full Pro access plus team features.\n // Pro users do NOT get Team features (Compliance) without paying for the Team tier.\n isPro: () => { const s = get().status; return s === 'pro' || s === 'team'; },\n isTeam: () => get().status === 'team',\n}));\n","import type { LicenseStatus } from './types.js';\n\ninterface LicenseStoreSnapshot {\n status: LicenseStatus;\n isPro: () => boolean;\n}\n\ninterface LicenseStoreApi {\n getState: () => LicenseStoreSnapshot;\n}\n\n// Lazy-captured references: initialized on first call to initStoreIntegrity()\nlet _originalIsPro: (() => boolean) | null = null;\nlet _originalGetState: (() => LicenseStoreSnapshot) | null = null;\nlet _storeApi: LicenseStoreApi | null = null;\n\n/**\n * Capture the original store function references for later integrity checks.\n * Call this once during license store initialization.\n */\nexport function initStoreIntegrity(store: LicenseStoreApi): void {\n _storeApi = store;\n _originalIsPro = store.getState().isPro;\n _originalGetState = store.getState;\n}\n\n/**\n * Verify that the license store's isPro function hasn't been replaced\n * with a function that always returns true.\n */\nexport function verifyStoreIntegrity(): boolean {\n if (!_storeApi || !_originalIsPro || !_originalGetState) return false;\n\n const state = _storeApi.getState();\n\n // Check 1: isPro function reference hasn't changed\n if (state.isPro !== _originalIsPro) return false;\n\n // Check 2: getState itself hasn't been replaced\n if (_storeApi.getState !== _originalGetState) return false;\n\n // Check 3: If status is 'free', isPro() must return false\n // (catches patches that make isPro() always return true regardless of status)\n if (state.status === 'free' && state.isPro()) return false;\n\n return true;\n}\n","import { useInput } from 'ink';\nimport { useNavigationStore } from '../stores/navigation-store.js';\nimport { useLocaleStore } from '../i18n/index.js';\nimport { useModalStore } from '../stores/modal-store.js';\n\nexport function useGlobalKeyboard(opts?: { onQuit?: () => void; disabled?: boolean }) {\n const navigate = useNavigationStore((s) => s.navigate);\n const goBack = useNavigationStore((s) => s.goBack);\n const menuMode = useNavigationStore((s) => s.menuMode);\n const enterMenuMode = useNavigationStore((s) => s.enterMenuMode);\n const exitMenuMode = useNavigationStore((s) => s.exitMenuMode);\n const moveMenuCursor = useNavigationStore((s) => s.moveMenuCursor);\n const selectMenuItem = useNavigationStore((s) => s.selectMenuItem);\n const { locale, setLocale } = useLocaleStore();\n const modalOpen = useModalStore((s) => s.isOpen);\n\n useInput((input, key) => {\n if (opts?.disabled) return;\n if (modalOpen) return;\n\n // Menu mode: arrows + enter operate the side menu, esc/m/q exit.\n if (menuMode) {\n if (input === 'q' || (key.ctrl && input === 'c')) {\n opts?.onQuit?.();\n return;\n }\n if (key.escape || input === 'm') {\n exitMenuMode();\n return;\n }\n if (key.upArrow) {\n moveMenuCursor(-1);\n return;\n }\n if (key.downArrow) {\n moveMenuCursor(1);\n return;\n }\n if (key.return) {\n selectMenuItem();\n return;\n }\n return;\n }\n\n if (input === 'q' || (key.ctrl && input === 'c')) {\n opts?.onQuit?.();\n return;\n }\n\n if (key.escape) {\n goBack();\n return;\n }\n\n if (input === 'm') {\n enterMenuMode();\n return;\n }\n\n if (input === 'S') {\n navigate('search');\n return;\n }\n\n if (input === 'L') {\n setLocale(locale === 'en' ? 'es' : 'en');\n return;\n }\n }, { isActive: !opts?.disabled });\n}\n","import { create } from 'zustand';\n\ninterface ModalState {\n // Reference counter: >0 means at least one suppressor is active.\n // Using a counter (not a boolean) prevents a nested suppressor's cleanup\n // from prematurely unblocking global keyboard when a sibling suppressor is\n // still active (e.g. SearchView holds results open while a ConfirmDialog\n // mounts and then dismisses).\n _count: number;\n isOpen: boolean;\n openModal: () => void;\n closeModal: () => void;\n}\n\nexport const useModalStore = create<ModalState>((set) => ({\n _count: 0,\n isOpen: false,\n openModal: () =>\n set((s) => {\n const next = s._count + 1;\n return { _count: next, isOpen: next > 0 };\n }),\n closeModal: () =>\n set((s) => {\n const next = Math.max(0, s._count - 1);\n return { _count: next, isOpen: next > 0 };\n }),\n}));\n","import { access, writeFile, mkdir } from 'node:fs/promises';\nimport { ensureDataDirs, ONBOARDING_FLAG_PATH, DATA_DIR } from './data-dir.js';\n\n// UX-002: a minimal first-run flag. The TUI flips this once the user dismisses\n// the welcome screen so subsequent launches go straight to the dashboard. The\n// file's *existence* is the signal — we never read its contents — which keeps\n// migration cost zero if we later decide to track richer state.\n\nlet cached: boolean | null = null;\n\nexport async function hasCompletedOnboarding(): Promise<boolean> {\n if (cached !== null) return cached;\n try {\n await access(ONBOARDING_FLAG_PATH);\n cached = true;\n } catch {\n cached = false;\n }\n return cached;\n}\n\nexport async function markOnboardingComplete(): Promise<void> {\n await ensureDataDirs();\n await mkdir(DATA_DIR, { recursive: true, mode: 0o700 });\n await writeFile(ONBOARDING_FLAG_PATH, new Date().toISOString(), {\n encoding: 'utf-8',\n mode: 0o600,\n });\n cached = true;\n}\n\n// Test seam — never call from production code.\nexport function _resetOnboardingCacheForTests(): void {\n cached = null;\n}\n","import React, { useEffect } from 'react';\nimport { Box, Text } from 'ink';\nimport { useViewInput } from '../hooks/use-view-input.js';\nimport { COLORS } from '../utils/colors.js';\nimport { GRADIENTS } from '../utils/gradient.js';\nimport { GradientText } from '../utils/gradient.js';\nimport { SPACING } from '../utils/spacing.js';\nimport { t } from '../i18n/index.js';\nimport { markOnboardingComplete } from '../lib/onboarding.js';\n\ninterface WelcomeViewProps {\n onContinue: () => void;\n}\n\n// UX-002: shown once on first run. The list mirrors the keys the footer hint\n// bar surfaces, so the user's mental model on entry matches the running app.\nexport function WelcomeView({ onContinue }: WelcomeViewProps) {\n useEffect(() => {\n return () => { /* cleanup not required */ };\n }, []);\n\n useViewInput((input, key) => {\n if (key.return || input === ' ' || key.escape) {\n void markOnboardingComplete().finally(onContinue);\n }\n });\n\n return (\n <Box flexDirection=\"column\" paddingY={SPACING.xs} paddingX={SPACING.sm} flexShrink={1}>\n <Box>\n <GradientText colors={GRADIENTS.gold} bold>{t('welcome_title')}</GradientText>\n </Box>\n\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.text} wrap=\"wrap\">{t('welcome_intro')}</Text>\n </Box>\n\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n <Text color={COLORS.muted}>{t('welcome_keysHeader')}</Text>\n <Box flexDirection=\"column\" paddingLeft={SPACING.sm}>\n <Text><Text color={COLORS.gold} bold>m</Text> {t('welcome_keyMenu')}</Text>\n <Text><Text color={COLORS.gold} bold>{'↑ ↓'}</Text> {t('welcome_keyMove')}</Text>\n <Text><Text color={COLORS.gold} bold>1-9</Text> {t('welcome_keyAction')}</Text>\n <Text><Text color={COLORS.gold} bold>Enter</Text> {t('welcome_keySelect')}</Text>\n <Text><Text color={COLORS.gold} bold>S</Text> {t('welcome_keySearch')}</Text>\n <Text><Text color={COLORS.gold} bold>Esc</Text> {t('welcome_keyBack')}</Text>\n <Text><Text color={COLORS.gold} bold>L</Text> {t('welcome_keyLocale')}</Text>\n <Text><Text color={COLORS.gold} bold>q</Text> {t('welcome_keyQuit')}</Text>\n </Box>\n </Box>\n\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n <Text color={COLORS.muted}>{t('welcome_proHeader')}</Text>\n <Box paddingLeft={SPACING.sm}>\n <Text color={COLORS.textSecondary} wrap=\"wrap\">{t('welcome_proIntro')}</Text>\n </Box>\n </Box>\n\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.success} bold>{t('welcome_continueHint')}</Text>\n </Box>\n </Box>\n );\n}\n","import { useInput } from 'ink';\nimport { useNavigationStore } from '../stores/navigation-store.js';\n\ntype InputHandler = Parameters<typeof useInput>[0];\ntype InputOptions = NonNullable<Parameters<typeof useInput>[1]>;\n\n// useInput wrapper that suppresses keypresses while the side menu is open.\n// All view-level useInput calls go through this so menu navigation owns\n// the arrow keys / enter without each view duplicating the gate.\nexport function useViewInput(handler: InputHandler, opts?: InputOptions) {\n const menuMode = useNavigationStore((s) => s.menuMode);\n const baseActive = opts?.isActive ?? true;\n useInput(handler, { ...opts, isActive: baseActive && !menuMode });\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { COLORS } from '../../utils/colors.js';\nimport { t } from '../../i18n/index.js';\nimport type { ViewId } from '../../lib/types.js';\nimport type { TranslationKey } from '../../i18n/en.js';\nimport { isTeamView } from '../../lib/license/feature-gate.js';\nimport { SPACING } from '../../utils/spacing.js';\n\nconst FEATURE_KEYS: Record<string, { title: TranslationKey; desc: TranslationKey }> = {\n profiles: { title: 'upgrade_profiles', desc: 'upgrade_profilesDesc' },\n 'smart-cleanup': { title: 'upgrade_cleanup', desc: 'upgrade_cleanupDesc' },\n history: { title: 'upgrade_history', desc: 'upgrade_historyDesc' },\n 'security-audit': { title: 'upgrade_security', desc: 'upgrade_securityDesc' },\n sync: { title: 'upgrade_sync', desc: 'upgrade_syncDesc' },\n compliance: { title: 'upgrade_compliance', desc: 'upgrade_complianceDesc' },\n rollback: { title: 'upgrade_rollback', desc: 'upgrade_rollbackDesc' },\n brewfile: { title: 'upgrade_brewfile', desc: 'upgrade_brewfileDesc' },\n};\n\ninterface UpgradePromptProps {\n viewId: ViewId;\n}\n\nexport function UpgradePrompt({ viewId }: UpgradePromptProps) {\n const keys = FEATURE_KEYS[viewId];\n if (!keys) return null;\n\n const title = t(keys.title);\n const team = isTeamView(viewId);\n const headerKey: TranslationKey = team ? 'upgrade_teamFeature' : 'upgrade_proFeature';\n const pricingKey: TranslationKey = team ? 'upgrade_teamPricing' : 'upgrade_pricing';\n const buyUrlKey: TranslationKey = team ? 'upgrade_buyUrlTeam' : 'upgrade_buyUrl';\n const labelKey: TranslationKey = team ? 'upgrade_teamLabel' : 'upgrade_proLabel';\n\n return (\n <Box flexDirection=\"column\" alignItems=\"center\" paddingY={SPACING.xs}>\n <Box\n borderStyle=\"double\"\n borderColor={COLORS.brand}\n paddingX={SPACING.sm}\n paddingY={SPACING.none}\n flexDirection=\"column\"\n alignItems=\"center\"\n flexShrink={1}\n width=\"80%\"\n >\n <Text bold color={COLORS.brand}>{'\\u2B50'} {t(headerKey, { title })}</Text>\n <Text color={COLORS.text} wrap=\"wrap\">{t(keys.desc)}</Text>\n <Box flexDirection=\"column\" alignItems=\"center\" marginTop={SPACING.xs}>\n <Text color={COLORS.info} bold>{t(pricingKey)}</Text>\n <Text color={COLORS.muted}>{t('upgrade_buyAt')}</Text>\n <Text color={COLORS.sky} bold>{t(buyUrlKey)}</Text>\n <Text color={COLORS.muted}>{t('upgrade_activateWith')}</Text>\n <Text color={COLORS.success} bold>{t('upgrade_activateCmd')}</Text>\n <Text color={COLORS.brand}>{t(labelKey)}</Text>\n </Box>\n </Box>\n </Box>\n );\n}\n","import React, { useEffect, useMemo } from 'react';\nimport { Box, Text } from 'ink';\nimport { useViewInput } from '../hooks/use-view-input.js';\nimport { useTerminalSize } from '../hooks/use-terminal-size.js';\nimport { useVisibleRows } from '../hooks/use-visible-rows.js';\nimport { useBrewStore } from '../stores/brew-store.js';\nimport { useSecurityStore } from '../stores/security-store.js';\nimport { useBrewfileStore } from '../stores/brewfile-store.js';\nimport { useSyncStore } from '../stores/sync-store.js';\nimport { useComplianceStore } from '../stores/compliance-store.js';\nimport { useLicenseStore } from '../stores/license-store.js';\nimport { StatCard } from '../components/common/stat-card.js';\nimport { Loading, ErrorMessage } from '../components/common/loading.js';\nimport { StatusBadge } from '../components/common/status-badge.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { VersionArrow } from '../components/common/version-arrow.js';\nimport { COLORS } from '../utils/colors.js';\nimport { GRADIENTS } from '../utils/gradient.js';\nimport { t } from '../i18n/index.js';\nimport { formatRelativeTime } from '../utils/format.js';\nimport { SPACING } from '../utils/spacing.js';\n\nfunction ProStatusPanel() {\n const security = useSecurityStore((s) => s.summary);\n const drift = useBrewfileStore((s) => s.drift);\n const syncConfig = useSyncStore((s) => s.config);\n const complianceReport = useComplianceStore((s) => s.report);\n\n const cveCount = security ? security.vulnerablePackages : null;\n const criticalCount = security ? security.criticalCount : null;\n\n const driftScore = drift ? drift.score : null;\n\n const lastSync = syncConfig?.lastSync ?? null;\n const syncAgo = lastSync ? formatRelativeTime(new Date(lastSync).getTime() / 1000) : null;\n\n const violationCount = complianceReport ? complianceReport.violations.length : null;\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={COLORS.purple} paddingX={SPACING.sm} paddingY={SPACING.none} marginTop={SPACING.xs}>\n <Text bold color={COLORS.purple}>{t('dashboard_pro_status')}</Text>\n <Box gap={SPACING.xs}>\n <Text color={COLORS.muted}>{t('dashboard_security')}</Text>\n {cveCount === null ? (\n <Text color={COLORS.muted}>—</Text>\n ) : cveCount === 0 ? (\n <Text color={COLORS.success}>{t('dashboard_no_cves')}</Text>\n ) : (\n <Text color={COLORS.error}>\n {t('dashboard_cves', { count: String(cveCount) })}\n {criticalCount && criticalCount > 0 ? ` (${criticalCount} critical)` : ''}\n </Text>\n )}\n </Box>\n <Box gap={SPACING.xs}>\n <Text color={COLORS.muted}>{t('dashboard_brewfile')}</Text>\n {driftScore === null ? (\n <Text color={COLORS.muted}>—</Text>\n ) : (\n <Text color={driftScore >= 80 ? COLORS.success : COLORS.warning}>{driftScore}%</Text>\n )}\n </Box>\n <Box gap={SPACING.xs}>\n <Text color={COLORS.muted}>{t('dashboard_sync')}</Text>\n {syncAgo === null ? (\n <Text color={COLORS.muted}>{t('dashboard_sync_never')}</Text>\n ) : (\n <Text color={COLORS.info}>{t('dashboard_sync_ago', { time: syncAgo })}</Text>\n )}\n </Box>\n <Box gap={SPACING.xs}>\n <Text color={COLORS.muted}>{t('dashboard_compliance')}</Text>\n {violationCount === null ? (\n <Text color={COLORS.muted}>—</Text>\n ) : violationCount === 0 ? (\n <Text color={COLORS.success}>{t('dashboard_compliance_ok')}</Text>\n ) : (\n <Text color={COLORS.warning}>{t('dashboard_compliance_violations', { count: String(violationCount) })}</Text>\n )}\n </Box>\n </Box>\n );\n}\n\nexport function DashboardView() {\n // PERF-004: granular selectors so a `loading` map mutation for an unrelated\n // key does not re-render the entire dashboard.\n const formulae = useBrewStore((s) => s.formulae);\n const casks = useBrewStore((s) => s.casks);\n const outdated = useBrewStore((s) => s.outdated);\n const services = useBrewStore((s) => s.services);\n const config = useBrewStore((s) => s.config);\n const loading = useBrewStore((s) => s.loading);\n const errors = useBrewStore((s) => s.errors);\n const lastFetchedAt = useBrewStore((s) => s.lastFetchedAt);\n const fetchAll = useBrewStore((s) => s.fetchAll);\n const isPro = useLicenseStore((s) => s.isPro);\n const { columns } = useTerminalSize();\n // Two split lists (outdated + service errors) share the remaining rows.\n // Reserve title, statcards (3 rows), system info block (~5 rows), and footers.\n const splitRows = useVisibleRows({\n reservedRows: 18,\n fallbackReservedRows: 22,\n minRows: 2,\n });\n const halfRows = Math.max(1, Math.floor(splitRows / 2));\n\n useEffect(() => { fetchAll(); }, []);\n\n // UX-008: `r` triggers a refetch from any state — error or not — so the\n // user can refresh the dashboard without leaving the view.\n useViewInput((input) => {\n if (input === 'r' || input === 'R' || input === '1') {\n void fetchAll();\n }\n });\n\n const errorServiceList = useMemo(\n () => services.filter((s) => s.status === 'error'),\n [services]\n );\n const runningServices = useMemo(\n () => services.filter((s) => s.status === 'started').length,\n [services]\n );\n const errorServices = errorServiceList.length;\n const partialErrors = [\n errors.outdated ? { label: t('dashboard_outdated'), message: errors.outdated } : null,\n errors.services ? { label: t('dashboard_services'), message: errors.services } : null,\n errors.config ? { label: t('dashboard_systemInfo'), message: errors.config } : null,\n ].filter((item): item is { label: string; message: string } => item !== null);\n const outdatedValue = loading.outdated\n ? '...'\n : errors.outdated\n ? t('dashboard_statError')\n : outdated.formulae.length + outdated.casks.length;\n const servicesValue = loading.services\n ? '...'\n : errors.services\n ? t('dashboard_statError')\n : `${runningServices}/${services.length}`;\n\n // ARQ-004: Last updated timestamp\n const lastUpdated = lastFetchedAt.installed\n ? formatRelativeTime(lastFetchedAt.installed / 1000)\n : null;\n\n if (loading.installed) return <Loading message={t('loading_fetchingBrew')} />;\n if (errors.installed) {\n return (\n <Box flexDirection=\"column\">\n <ErrorMessage message={errors.installed} />\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.textSecondary}>r:{t('hint_refresh')}</Text>\n </Box>\n </Box>\n );\n }\n\n // SCR-018: Responsive layout\n const isNarrow = columns < 60;\n\n return (\n <Box flexDirection=\"column\" gap={SPACING.sm}>\n <SectionHeader emoji={'\\u{1F4CA}'} title={t('dashboard_overview')} gradient={GRADIENTS.gold} />\n\n <Box gap={SPACING.xs} flexWrap=\"wrap\" flexDirection={isNarrow ? 'column' : 'row'}>\n <StatCard label={t('dashboard_formulae')} value={formulae.length} color={COLORS.info} />\n <StatCard label={t('dashboard_casks')} value={casks.length} color={COLORS.purple} />\n <StatCard\n label={t('dashboard_outdated')}\n value={outdatedValue}\n color={typeof outdatedValue === 'number' && outdatedValue > 0 ? COLORS.warning : (errors.outdated ? COLORS.error : COLORS.success)}\n />\n <StatCard\n label={t('dashboard_services')}\n value={servicesValue}\n color={errors.services || errorServices > 0 ? COLORS.error : COLORS.success}\n />\n </Box>\n\n {/* ARQ-004: Show last updated */}\n {lastUpdated && (\n <Text color={COLORS.muted}>{t('dashboard_lastUpdated', { time: lastUpdated })}</Text>\n )}\n\n {partialErrors.length > 0 && (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={COLORS.warning} paddingX={SPACING.sm} paddingY={SPACING.none}>\n <Text color={COLORS.warning} bold>{t('dashboard_partialData')}</Text>\n {partialErrors.map((item) => (\n <Text key={item.label} color={COLORS.muted}>\n {item.label}: {item.message}\n </Text>\n ))}\n </Box>\n )}\n\n {config && !errors.config && (\n <Box flexDirection=\"column\">\n <SectionHeader emoji={'\\u2139\\uFE0F'} title={t('dashboard_systemInfo')} gradient={[COLORS.text, COLORS.muted]} />\n <Box borderStyle=\"round\" borderColor={COLORS.blue} paddingX={SPACING.sm} paddingY={SPACING.none} flexDirection=\"column\" marginTop={SPACING.xs}>\n <Text><Text color={COLORS.muted}>{t('dashboard_homebrew')}</Text> {config.HOMEBREW_VERSION}</Text>\n <Text><Text color={COLORS.muted}>{t('dashboard_prefix')}</Text> {config.HOMEBREW_PREFIX}</Text>\n <Text><Text color={COLORS.muted}>{t('dashboard_updated')}</Text> {config.coreUpdated}</Text>\n </Box>\n </Box>\n )}\n\n {!errors.outdated && outdated.formulae.length > 0 && (\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n <SectionHeader emoji={'\\u{1F4E6}'} title={t('dashboard_outdatedPackages')} gradient={GRADIENTS.fire} />\n <Box paddingLeft={SPACING.sm} flexDirection=\"column\">\n {outdated.formulae.slice(0, halfRows).map((pkg) => (\n <Box key={pkg.name} gap={SPACING.xs}>\n <Text color={COLORS.text}>{pkg.name}</Text>\n <VersionArrow current={pkg.installed_versions[0] ?? ''} latest={pkg.current_version} />\n </Box>\n ))}\n {outdated.formulae.length > halfRows && (\n <Text color={COLORS.textSecondary} italic>{t('common_andMore', { count: outdated.formulae.length - halfRows })}</Text>\n )}\n </Box>\n </Box>\n )}\n\n {!errors.services && errorServices > 0 && (\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n <SectionHeader emoji={'\\u26A0\\uFE0F'} title={t('dashboard_serviceErrors')} color={COLORS.error} />\n <Box paddingLeft={SPACING.sm} flexDirection=\"column\">\n {errorServiceList.slice(0, halfRows).map((s) => (\n <Box key={s.name} gap={SPACING.xs}>\n <StatusBadge label={t('badge_error')} variant=\"error\" />\n <Text>{s.name}</Text>\n {s.exit_code != null && <Text color={COLORS.muted}>{t('common_exit', { code: s.exit_code })}</Text>}\n </Box>\n ))}\n {errorServiceList.length > halfRows && (\n <Text color={COLORS.textSecondary} italic>{t('common_andMore', { count: errorServiceList.length - halfRows })}</Text>\n )}\n </Box>\n </Box>\n )}\n\n {isPro() && <ProStatusPanel />}\n </Box>\n );\n}\n","import { useContentSize } from '../components/layout/content-size-context.js';\nimport { useTerminalSize } from './use-terminal-size.js';\n\ninterface VisibleRowsOptions {\n reservedRows: number;\n fallbackReservedRows?: number;\n minRows?: number;\n}\n\nexport function useVisibleRows({\n reservedRows,\n fallbackReservedRows = reservedRows,\n minRows = 3,\n}: VisibleRowsOptions): number {\n const { height: contentHeight } = useContentSize();\n const { rows: terminalRows } = useTerminalSize();\n const availableRows =\n contentHeight > 0\n ? contentHeight - reservedRows\n : terminalRows - fallbackReservedRows;\n\n return Math.max(minRows, Math.floor(availableRows));\n}\n","import { create } from 'zustand';\nimport type { Formula, Cask, OutdatedPackage, BrewService, BrewConfig } from '../lib/types.js';\nimport * as api from '../lib/brew-api.js';\nimport { logger } from '../utils/logger.js';\n\nconst BREW_UPDATE_COOLDOWN_MS = 5 * 60 * 1000;\n\nlet fetchAllInFlight: Promise<void> | null = null;\nlet brewUpdateInFlight: Promise<void> | null = null;\nlet lastBrewUpdateStartedAt = 0;\n\ninterface BrewState {\n formulae: Formula[];\n casks: Cask[];\n outdated: { formulae: OutdatedPackage[]; casks: OutdatedPackage[] };\n services: BrewService[];\n config: BrewConfig | null;\n leaves: string[];\n doctorWarnings: string[];\n doctorClean: boolean | null;\n\n loading: Record<string, boolean>;\n errors: Record<string, string | null>;\n lastFetchedAt: Record<string, number>;\n\n fetchInstalled: () => Promise<void>;\n fetchOutdated: () => Promise<void>;\n fetchServices: () => Promise<void>;\n fetchConfig: () => Promise<void>;\n fetchLeaves: () => Promise<void>;\n fetchDoctor: () => Promise<void>;\n fetchAll: () => Promise<void>;\n\n uninstallPackage: (name: string) => Promise<void>;\n serviceAction: (name: string, action: 'start' | 'stop' | 'restart') => Promise<void>;\n}\n\nfunction setLoading(set: (fn: (s: BrewState) => Partial<BrewState>) => void, key: string, value: boolean) {\n set((s) => ({ loading: { ...s.loading, [key]: value } }));\n}\n\nfunction setError(set: (fn: (s: BrewState) => Partial<BrewState>) => void, key: string, error: string | null) {\n set((s) => ({ errors: { ...s.errors, [key]: error } }));\n}\n\nfunction recordFetchTime(set: (fn: (s: BrewState) => Partial<BrewState>) => void, key: string) {\n set((s) => ({ lastFetchedAt: { ...s.lastFetchedAt, [key]: Date.now() } }));\n}\n\nexport const useBrewStore = create<BrewState>((set, get) => ({\n formulae: [],\n casks: [],\n outdated: { formulae: [], casks: [] },\n services: [],\n config: null,\n leaves: [],\n doctorWarnings: [],\n doctorClean: null,\n // Pre-initialize loading flags for keys that fetchAll always triggers so\n // views that check loading.X get a spinner on first render rather than\n // flashing empty/zeroed content for one frame before the fetch starts.\n // SCR-013: Pre-initialize doctor loading to true\n loading: { installed: true, outdated: true, services: true, config: true, doctor: true },\n errors: {},\n lastFetchedAt: {},\n\n fetchInstalled: async () => {\n setLoading(set, 'installed', true);\n setError(set, 'installed', null);\n try {\n const result = await api.getInstalled();\n set({ formulae: result.formulae, casks: result.casks });\n } catch (err) {\n setError(set, 'installed', err instanceof Error ? err.message : String(err));\n } finally {\n setLoading(set, 'installed', false);\n recordFetchTime(set, 'installed');\n }\n },\n\n fetchOutdated: async () => {\n setLoading(set, 'outdated', true);\n setError(set, 'outdated', null);\n try {\n const result = await api.getOutdated();\n set({ outdated: result });\n } catch (err) {\n setError(set, 'outdated', err instanceof Error ? err.message : String(err));\n } finally {\n setLoading(set, 'outdated', false);\n recordFetchTime(set, 'outdated');\n }\n },\n\n fetchServices: async () => {\n setLoading(set, 'services', true);\n setError(set, 'services', null);\n try {\n const result = await api.getServices();\n set({ services: result });\n } catch (err) {\n setError(set, 'services', err instanceof Error ? err.message : String(err));\n } finally {\n setLoading(set, 'services', false);\n recordFetchTime(set, 'services');\n }\n },\n\n fetchConfig: async () => {\n setLoading(set, 'config', true);\n try {\n const result = await api.getConfig();\n set({ config: result });\n } catch (err) {\n setError(set, 'config', err instanceof Error ? err.message : String(err));\n } finally {\n setLoading(set, 'config', false);\n recordFetchTime(set, 'config');\n }\n },\n\n fetchLeaves: async () => {\n try {\n const result = await api.getLeaves();\n set({ leaves: result });\n } catch (err) {\n // QA-021: Use structured logger unconditionally\n logger.error('fetchLeaves failed', { error: err instanceof Error ? err.message : String(err) });\n } finally {\n recordFetchTime(set, 'leaves');\n }\n },\n\n fetchDoctor: async () => {\n setLoading(set, 'doctor', true);\n setError(set, 'doctor', null);\n try {\n const result = await api.getDoctor();\n set({ doctorWarnings: result.warnings, doctorClean: result.isClean });\n } catch (err) {\n setError(set, 'doctor', err instanceof Error ? err.message : String(err));\n } finally {\n setLoading(set, 'doctor', false);\n recordFetchTime(set, 'doctor');\n }\n },\n\n fetchAll: async (): Promise<void> => {\n if (fetchAllInFlight) {\n return fetchAllInFlight;\n }\n\n const now = Date.now();\n if (!brewUpdateInFlight && now - lastBrewUpdateStartedAt > BREW_UPDATE_COOLDOWN_MS) {\n lastBrewUpdateStartedAt = now;\n // Don't block on brew update — run in background.\n // This is equivalent to the auto-update that `brew` does by default,\n // which we disable per-command with HOMEBREW_NO_AUTO_UPDATE=1.\n // ARQ-003: Capture brew update errors in store\n brewUpdateInFlight = api.brewUpdate()\n .catch((err) => { set((s) => ({ errors: { ...s.errors, update: String(err) } })); })\n .finally(() => {\n brewUpdateInFlight = null;\n });\n }\n\n const store = get();\n fetchAllInFlight = Promise.all([\n store.fetchInstalled(),\n store.fetchOutdated(),\n store.fetchServices(),\n store.fetchConfig(),\n store.fetchLeaves(),\n store.fetchDoctor(),\n ]).then(() => undefined)\n .finally(() => {\n fetchAllInFlight = null;\n });\n\n return fetchAllInFlight;\n },\n\n uninstallPackage: async (name) => {\n setLoading(set, 'action', true);\n try {\n await api.uninstallPackage(name);\n await get().fetchInstalled();\n } catch (err) {\n setError(set, 'action', err instanceof Error ? err.message : String(err));\n } finally {\n setLoading(set, 'action', false);\n }\n },\n\n serviceAction: async (name, action) => {\n setLoading(set, 'service-action', true);\n try {\n await api.serviceAction(name, action);\n await get().fetchServices();\n } catch (err) {\n setError(set, 'service-action', err instanceof Error ? err.message : String(err));\n } finally {\n setLoading(set, 'service-action', false);\n }\n },\n}));\n","import { spawn } from 'node:child_process';\nimport { execBrew, streamBrew } from './brew-cli.js';\nimport { parseInstalledJson, parseOutdatedJson, parseServicesJson, parseFormulaInfoJson } from './parsers/json-parser.js';\nimport { parseSearchResults, parseDoctorOutput, parseBrewConfig, parseLeavesOutput } from './parsers/text-parser.js';\nimport type { Formula, Cask, OutdatedPackage, BrewService, BrewConfig, PackageListItem } from './types.js';\nimport { analyzeUpgradeImpact } from './impact/impact-analyzer.js';\nimport type { UpgradeImpact } from './impact/types.js';\n\n// EP-011: Package name validation\nconst PKG_PATTERN = /^[\\w@./+-]+$/;\n\nfunction validatePackageName(name: string): void {\n if (!PKG_PATTERN.test(name)) throw new Error('Invalid package name: ' + name);\n}\n\nexport async function brewUpdate(): Promise<void> {\n // Run brew update WITHOUT HOMEBREW_NO_AUTO_UPDATE so it actually fetches.\n // BK-016: enforce a 120s ceiling — without one, a stalled brew tap fetch\n // could hang fetchAll() indefinitely.\n return new Promise((resolve, reject) => {\n const proc = spawn('brew', ['update'], { stdio: 'ignore' });\n let settled = false;\n const timeout = setTimeout(() => {\n if (settled) return;\n settled = true;\n proc.kill('SIGTERM');\n reject(new Error('brew update timed out after 120s'));\n }, 120_000);\n proc.on('close', (code) => {\n if (settled) return;\n settled = true;\n clearTimeout(timeout);\n if (code === 0) resolve();\n else reject(new Error(`brew update exited with code ${code}`));\n });\n proc.on('error', (err) => {\n if (settled) return;\n settled = true;\n clearTimeout(timeout);\n reject(err);\n });\n });\n}\n\nexport async function getInstalled(): Promise<{ formulae: Formula[]; casks: Cask[] }> {\n const raw = await execBrew(['info', '--json=v2', '--installed']);\n return parseInstalledJson(raw);\n}\n\nexport async function getOutdated(): Promise<{ formulae: OutdatedPackage[]; casks: OutdatedPackage[] }> {\n // Match `brew outdated` exactly: skip `--greedy`. Auto-updating casks\n // (Firefox, Docker, Warp, …) carry stale Homebrew metadata and would\n // otherwise show as outdated even when the app already updated itself.\n const raw = await execBrew(['outdated', '--json=v2']);\n return parseOutdatedJson(raw);\n}\n\nexport async function getServices(): Promise<BrewService[]> {\n const raw = await execBrew(['services', 'list', '--json']);\n return parseServicesJson(raw);\n}\n\nexport async function getFormulaInfo(name: string): Promise<Formula | null> {\n validatePackageName(name);\n const raw = await execBrew(['info', '--json=v2', name]);\n return parseFormulaInfoJson(raw);\n}\n\n// SCR-008: Cask-specific info endpoint\nexport async function getCaskInfo(name: string): Promise<Cask | null> {\n validatePackageName(name);\n try {\n const raw = await execBrew(['info', '--json=v2', '--cask', name]);\n const data = JSON.parse(raw) as { casks?: Cask[] };\n return data.casks?.[0] ?? null;\n } catch {\n return null;\n }\n}\n\n// UI-013: cask → formula-shape adaptor lives next to the canonical Cask type\n// instead of inside a view, so any future formula field added to the type is\n// reflected here once and not in N callers.\nexport function formulaeFromCask(cask: Cask): Formula {\n return {\n name: cask.token,\n full_name: cask.full_token,\n tap: '',\n desc: cask.desc,\n license: '',\n homepage: cask.homepage,\n versions: { stable: cask.version, head: null, bottle: false },\n dependencies: [],\n build_dependencies: [],\n installed: cask.installed\n ? [{\n version: cask.installed,\n used_options: [],\n built_as_bottle: false,\n poured_from_bottle: false,\n time: cask.installed_time ?? 0,\n runtime_dependencies: [],\n installed_as_dependency: false,\n installed_on_request: true,\n }]\n : [],\n linked_keg: null,\n pinned: false,\n outdated: cask.outdated,\n deprecated: false,\n keg_only: false,\n caveats: null,\n };\n}\n\nexport async function search(term: string): Promise<{ formulae: string[]; casks: string[] }> {\n // Strip leading dashes to prevent flag injection into `brew search`\n // (e.g. \"--desc\" would be parsed by brew as an option, not a search term).\n const safeTerm = term.replace(/^-+/, '');\n if (!safeTerm) return { formulae: [], casks: [] };\n const raw = await execBrew(['search', safeTerm]);\n return parseSearchResults(raw);\n}\n\nexport async function getDoctor(): Promise<{ warnings: string[]; isClean: boolean }> {\n try {\n const raw = await execBrew(['doctor']);\n return parseDoctorOutput(raw);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return parseDoctorOutput(msg);\n }\n}\n\nexport async function getConfig(): Promise<BrewConfig> {\n const raw = await execBrew(['config']);\n return parseBrewConfig(raw);\n}\n\nexport async function getLeaves(): Promise<string[]> {\n const raw = await execBrew(['leaves']);\n return parseLeavesOutput(raw);\n}\n\nexport function installPackage(name: string): AsyncGenerator<string> {\n validatePackageName(name);\n return streamBrew(['install', name]);\n}\n\nexport function upgradePackage(name: string): AsyncGenerator<string> {\n validatePackageName(name);\n return streamBrew(['upgrade', name]);\n}\n\nexport function upgradeAll(): AsyncGenerator<string> {\n return streamBrew(['upgrade']);\n}\n\nexport async function uninstallPackage(name: string): Promise<string> {\n validatePackageName(name);\n return execBrew(['uninstall', name]);\n}\n\nexport async function serviceAction(name: string, action: 'start' | 'stop' | 'restart'): Promise<string> {\n validatePackageName(name);\n return execBrew(['services', action, name]);\n}\n\n// ARQ-008: Pin/unpin operations moved from outdated view\nexport async function pinPackage(name: string): Promise<string> {\n validatePackageName(name);\n return execBrew(['pin', name]);\n}\n\nexport async function unpinPackage(name: string): Promise<string> {\n validatePackageName(name);\n return execBrew(['unpin', name]);\n}\n\nexport function formulaeToListItems(formulae: Formula[]): PackageListItem[] {\n return formulae.map((f) => {\n const installed = f.installed[0];\n return {\n name: f.name,\n version: installed?.version ?? f.versions.stable,\n desc: f.desc,\n type: 'formula',\n outdated: f.outdated,\n pinned: f.pinned,\n kegOnly: f.keg_only,\n installedAsDependency: installed?.installed_as_dependency ?? false,\n installedTime: installed?.time ?? null,\n };\n });\n}\n\n// PERF-007: cache impact analyses keyed by name+version pair. Cursor moves\n// in the OutdatedView debounce, but a stable list still re-runs deps/uses\n// for the same package every time it gets focus. The version pair guarantees\n// a fresh analysis when a refetch updates the outdated info.\nconst impactCache = new Map<string, UpgradeImpact>();\nconst IMPACT_CACHE_LIMIT = 64;\n\nfunction impactKey(name: string, from: string, to: string, type: 'formula' | 'cask'): string {\n return `${type}::${name}::${from}::${to}`;\n}\n\nexport async function getUpgradeImpact(\n packageName: string,\n fromVersion: string,\n toVersion: string,\n packageType: 'formula' | 'cask',\n): Promise<UpgradeImpact> {\n validatePackageName(packageName);\n const key = impactKey(packageName, fromVersion, toVersion, packageType);\n const cached = impactCache.get(key);\n if (cached) return cached;\n\n const result = await analyzeUpgradeImpact(packageName, fromVersion, toVersion, packageType);\n\n if (impactCache.size >= IMPACT_CACHE_LIMIT) {\n const firstKey = impactCache.keys().next().value;\n if (firstKey !== undefined) impactCache.delete(firstKey);\n }\n impactCache.set(key, result);\n return result;\n}\n\n// Test seam: drop cache between scenarios.\nexport function _resetImpactCacheForTests(): void {\n impactCache.clear();\n}\n\nexport function casksToListItems(casks: Cask[]): PackageListItem[] {\n return casks.map((c) => ({\n name: c.token,\n version: c.installed ?? c.version,\n desc: c.desc,\n type: 'cask',\n outdated: c.outdated,\n pinned: false,\n kegOnly: false,\n installedAsDependency: false,\n installedTime: c.installed_time ?? null,\n }));\n}\n","import type { BrewInfoResponse, BrewOutdatedResponse, BrewService, Formula, Cask, OutdatedPackage } from '../types.js';\n\nfunction safeParse<T>(raw: string, context: string): T {\n try {\n const result = JSON.parse(raw);\n if (result === null || result === undefined) {\n throw new Error(`${context} returned null or empty response`);\n }\n return result as T;\n } catch (err) {\n throw new Error(`Failed to parse ${context} JSON: ${err instanceof Error ? err.message : String(err)}`, { cause: err });\n }\n}\n\nexport function parseInstalledJson(raw: string): { formulae: Formula[]; casks: Cask[] } {\n const data = safeParse<BrewInfoResponse>(raw, 'brew info --installed');\n return {\n formulae: Array.isArray(data.formulae) ? data.formulae : [],\n casks: Array.isArray(data.casks) ? data.casks : [],\n };\n}\n\nexport function parseOutdatedJson(raw: string): { formulae: OutdatedPackage[]; casks: OutdatedPackage[] } {\n const data = safeParse<BrewOutdatedResponse>(raw, 'brew outdated');\n return {\n formulae: Array.isArray(data.formulae) ? data.formulae : [],\n casks: Array.isArray(data.casks) ? data.casks : [],\n };\n}\n\nexport function parseServicesJson(raw: string): BrewService[] {\n const data = safeParse<BrewService[]>(raw, 'brew services list');\n if (!Array.isArray(data)) return [];\n return data.map((s) => ({\n name: s.name,\n status: s.status ?? 'none',\n user: s.user ?? null,\n file: s.file ?? null,\n exit_code: s.exit_code ?? null,\n }));\n}\n\nexport function parseFormulaInfoJson(raw: string): Formula | null {\n const data = safeParse<BrewInfoResponse>(raw, 'brew info');\n return data.formulae?.[0] ?? null;\n}\n","import type { BrewConfig } from '../types.js';\n\nexport function parseSearchResults(raw: string): { formulae: string[]; casks: string[] } {\n const lines = raw.split('\\n').map((l) => l.trim()).filter(Boolean);\n const formulae: string[] = [];\n const casks: string[] = [];\n let section: 'formulae' | 'casks' = 'formulae';\n\n for (const line of lines) {\n if (line.startsWith('==> Formulae')) {\n section = 'formulae';\n continue;\n }\n if (line.startsWith('==> Casks')) {\n section = 'casks';\n continue;\n }\n if (line.startsWith('==>')) continue;\n\n if (section === 'formulae') formulae.push(line);\n else casks.push(line);\n }\n\n return { formulae, casks };\n}\n\nexport function parseDoctorOutput(raw: string): { warnings: string[]; isClean: boolean } {\n const cleaned = raw.trim();\n if (cleaned.includes('Your system is ready to brew')) {\n return { warnings: [], isClean: true };\n }\n\n const warnings: string[] = [];\n let current = '';\n\n for (const line of cleaned.split('\\n')) {\n if (line.startsWith('Warning:')) {\n if (current) warnings.push(current.trim());\n current = line;\n } else if (current) {\n current += '\\n' + line;\n }\n }\n if (current) warnings.push(current.trim());\n\n return { warnings, isClean: false };\n}\n\nexport function parseBrewConfig(raw: string): BrewConfig {\n const lines = raw.split('\\n');\n const get = (key: string): string => {\n const line = lines.find((l) => l.startsWith(key));\n return line?.split(':').slice(1).join(':').trim() ?? '';\n };\n\n return {\n HOMEBREW_VERSION: get('HOMEBREW_VERSION'),\n HOMEBREW_PREFIX: get('HOMEBREW_PREFIX'),\n coreUpdated: get('Core tap last commit') || get('Core tap JSON'),\n };\n}\n\nexport function parseLeavesOutput(raw: string): string[] {\n return raw.split('\\n').map((l) => l.trim()).filter(Boolean);\n}\n","import { execBrew } from '../brew-cli.js';\nimport { logger } from '../../utils/logger.js';\nimport { t } from '../../i18n/index.js';\nimport type { UpgradeImpact, RiskLevel } from './types.js';\n\n// Packages whose upgrade is always considered high risk\nconst HIGH_RISK_PACKAGES = new Set([\n 'openssl', 'openssl@3', 'openssl@1.1',\n 'python', 'python@3', 'python@3.11', 'python@3.12', 'python@3.13',\n 'node', 'node@18', 'node@20', 'ruby', 'ruby@3',\n 'sqlite', 'sqlite3', 'libpq', 'postgresql', 'postgresql@16',\n 'glibc', 'gcc', 'llvm',\n]);\n\nfunction isMajorVersionBump(from: string, to: string): boolean {\n const fromMajor = parseInt(from.split('.')[0] ?? '0', 10);\n const toMajor = parseInt(to.split('.')[0] ?? '0', 10);\n return !isNaN(fromMajor) && !isNaN(toMajor) && toMajor > fromMajor;\n}\n\nfunction calculateRisk(\n name: string,\n reverseDeps: string[],\n fromVersion: string,\n toVersion: string,\n): { risk: RiskLevel; reasons: string[] } {\n const reasons: string[] = [];\n\n // HIGH_RISK packages are sticky — always 'high' regardless of other factors\n if (HIGH_RISK_PACKAGES.has(name)) {\n reasons.push(t('impact_reason_critical_package'));\n return { risk: 'high', reasons };\n }\n\n // >10 reverse deps forces high directly\n if (reverseDeps.length > 10) {\n reasons.push(t('impact_reason_many_deps', { count: reverseDeps.length }));\n return { risk: 'high', reasons };\n }\n\n let factorCount = 0;\n\n if (reverseDeps.length >= 3) {\n factorCount++;\n reasons.push(t('impact_reason_many_deps', { count: reverseDeps.length }));\n }\n\n if (isMajorVersionBump(fromVersion, toVersion)) {\n factorCount++;\n reasons.push(t('impact_reason_major_bump'));\n }\n\n const risk: RiskLevel = factorCount >= 2 ? 'high' : factorCount === 1 ? 'medium' : 'low';\n return { risk, reasons };\n}\n\nexport async function analyzeUpgradeImpact(\n packageName: string,\n fromVersion: string,\n toVersion: string,\n packageType: 'formula' | 'cask',\n): Promise<UpgradeImpact> {\n // Casks are self-contained — no dependency graph to analyze\n if (packageType === 'cask') {\n return {\n packageName,\n fromVersion,\n toVersion,\n packageType,\n directDeps: [],\n reverseDeps: [],\n risk: 'low',\n riskReasons: [],\n };\n }\n\n let directDeps: string[] = [];\n let reverseDeps: string[] = [];\n\n try {\n const depsOutput = await execBrew(['deps', '--1', packageName]);\n directDeps = depsOutput.split('\\n').filter((l) => l.trim() !== '');\n } catch (err) {\n logger.warn(`impact-analyzer: deps failed for ${packageName}: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n try {\n const usesOutput = await execBrew(['uses', '--installed', packageName]);\n reverseDeps = usesOutput.split('\\n').filter((l) => l.trim() !== '');\n } catch (err) {\n logger.warn(`impact-analyzer: uses failed for ${packageName}: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n const { risk, reasons } = calculateRisk(packageName, reverseDeps, fromVersion, toVersion);\n\n return {\n packageName,\n fromVersion,\n toVersion,\n packageType,\n directDeps,\n reverseDeps,\n risk,\n riskReasons: reasons,\n };\n}\n\nexport { isMajorVersionBump };\n","import { create } from 'zustand';\nimport type { SecurityAuditSummary } from '../lib/security/types.js';\nimport { runSecurityAudit } from '../lib/security/audit-runner.js';\nimport { useBrewStore } from './brew-store.js';\nimport { useLicenseStore } from './license-store.js';\nimport { verifyPro } from '../lib/license/pro-guard.js';\n\nconst CACHE_TTL_MS = 30 * 60 * 1000; // 30 minutes\n\ninterface SecurityState {\n summary: SecurityAuditSummary | null;\n loading: boolean;\n error: string | null;\n cachedAt: number | null;\n\n scan: (forceRefresh?: boolean) => Promise<void>;\n}\n\nexport const useSecurityStore = create<SecurityState>((set, get) => ({\n summary: null,\n loading: false,\n error: null,\n cachedAt: null,\n\n scan: async (forceRefresh = false) => {\n // ARQ-005: Use cached results if available and fresh\n const { summary, cachedAt } = get();\n if (!forceRefresh && summary && cachedAt && Date.now() - cachedAt < CACHE_TTL_MS) {\n return;\n }\n\n set({ loading: true, error: null });\n try {\n const brewState = useBrewStore.getState();\n if (brewState.formulae.length === 0) {\n await brewState.fetchInstalled();\n }\n const { formulae, casks } = useBrewStore.getState();\n const { license, status } = useLicenseStore.getState();\n const isPro = verifyPro(license, status);\n const result = await runSecurityAudit(isPro, formulae, casks);\n set({ summary: result, loading: false, cachedAt: Date.now() });\n } catch (err) {\n set({ error: err instanceof Error ? err.message : String(err), loading: false });\n }\n },\n}));\n","import type { Vulnerability, Severity } from './types.js';\nimport { fetchWithRetry } from '../fetch-timeout.js';\nimport { logger } from '../../utils/logger.js';\n\nconst OSV_BATCH_URL = 'https://api.osv.dev/v1/querybatch';\n\ninterface OsvQuery {\n package: { name: string; ecosystem: string };\n version: string;\n}\n\ninterface OsvVulnerability {\n id: string;\n summary?: string;\n severity?: Array<{ type: string; score: string }>;\n affected?: Array<{\n ranges?: Array<{\n events?: Array<{ fixed?: string }>;\n }>;\n }>;\n references?: Array<{ url: string }>;\n database_specific?: { severity?: string };\n}\n\ninterface OsvBatchResponse {\n results: Array<{ vulns?: OsvVulnerability[] }>;\n}\n\nfunction mapSeverity(vuln: OsvVulnerability): Severity {\n // Check database_specific severity first\n const dbSev = vuln.database_specific?.severity?.toUpperCase();\n if (dbSev && ['CRITICAL', 'HIGH', 'MEDIUM', 'LOW'].includes(dbSev)) {\n return dbSev as Severity;\n }\n\n // Check CVSS score\n const cvss = vuln.severity?.find((s) => s.type === 'CVSS_V3');\n if (cvss) {\n const score = parseFloat(cvss.score);\n if (score >= 9.0) return 'CRITICAL';\n if (score >= 7.0) return 'HIGH';\n if (score >= 4.0) return 'MEDIUM';\n return 'LOW';\n }\n\n return 'UNKNOWN';\n}\n\nfunction getFixedVersion(vuln: OsvVulnerability): string | null {\n for (const affected of vuln.affected ?? []) {\n for (const range of affected.ranges ?? []) {\n for (const event of range.events ?? []) {\n if (event.fixed) return event.fixed;\n }\n }\n }\n return null;\n}\n\nconst BATCH_SIZE = 100;\n\nasync function queryBatch(\n packages: Array<{ name: string; version: string }>,\n queries: OsvQuery[],\n): Promise<Map<string, Vulnerability[]>> {\n // 400 means a bad query (don't retry); 5xx/network errors are retried with backoff.\n // 429 (rate limit) is handled separately in queryOneByOne, so don't retry it here.\n const res = await fetchWithRetry(OSV_BATCH_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ queries }),\n }, 15_000, {\n retryOn: (r) => r.status >= 500 && r.status < 600,\n });\n\n if (!res.ok) {\n // On 400, try individual queries to isolate bad packages\n if (res.status === 400 && queries.length > 1) {\n return queryOneByOne(packages);\n }\n throw new Error(`OSV API error: ${res.status} ${res.statusText}`);\n }\n\n const data = (await res.json()) as OsvBatchResponse;\n\n // EP-003: Validate response structure\n if (!data || !Array.isArray(data.results)) {\n throw new Error('Invalid OSV API response: missing results array');\n }\n if (data.results.length !== packages.length) {\n throw new Error(`OSV API response mismatch: expected ${packages.length} results, got ${data.results.length}`);\n }\n\n const result = new Map<string, Vulnerability[]>();\n\n for (let i = 0; i < packages.length; i++) {\n const vulns = data.results[i]?.vulns;\n if (!vulns || vulns.length === 0) continue;\n\n result.set(\n packages[i]!.name,\n vulns.map((v) => ({\n id: v.id,\n summary: v.summary ?? 'No description available',\n severity: mapSeverity(v),\n fixedVersion: getFixedVersion(v),\n references: v.references?.map((r) => r.url) ?? [],\n })),\n );\n }\n\n return result;\n}\n\nasync function queryOneByOne(\n packages: Array<{ name: string; version: string }>,\n): Promise<Map<string, Vulnerability[]>> {\n const result = new Map<string, Vulnerability[]>();\n const errors: string[] = [];\n\n for (const pkg of packages) {\n try {\n const partial = await queryBatch(\n [pkg],\n [{ package: { name: pkg.name, ecosystem: 'Bitnami' }, version: pkg.version }],\n );\n for (const [k, v] of partial) result.set(k, v);\n } catch (err) {\n // EP-004: Only skip on 400 (bad request for that package). Re-throw on 5xx or network errors.\n const msg = err instanceof Error ? err.message : String(err);\n if (msg.includes('400')) {\n errors.push(`Skipped ${pkg.name}: ${msg}`);\n continue;\n }\n // For rate limiting (429), apply backoff\n if (msg.includes('429')) {\n logger.warn(`Rate limited by OSV API, backing off`, { package: pkg.name });\n await new Promise(r => setTimeout(r, 2000));\n // Retry once after backoff\n try {\n const retryResult = await queryBatch(\n [pkg],\n [{ package: { name: pkg.name, ecosystem: 'Bitnami' }, version: pkg.version }],\n );\n for (const [k, v] of retryResult) result.set(k, v);\n } catch {\n errors.push(`Failed after retry ${pkg.name}: ${msg}`);\n }\n continue;\n }\n // Network/server errors: log and continue instead of failing entire scan\n logger.error(`OSV query failed for ${pkg.name}: ${msg}`);\n errors.push(`${pkg.name}: ${msg}`);\n }\n\n // EP-008: Rate limit protection — small delay between individual requests\n await new Promise(r => setTimeout(r, 75));\n }\n\n if (errors.length > 0) {\n logger.warn(`OSV query errors for ${errors.length} packages`, { errors: errors.slice(0, 5) });\n }\n\n return result;\n}\n\nexport async function queryVulnerabilities(\n packages: Array<{ name: string; version: string }>,\n): Promise<Map<string, Vulnerability[]>> {\n // EP-007: Filter out packages with empty/undefined/null versions\n const validPackages = packages.filter(\n (p) => p.version && typeof p.version === 'string' && p.version.trim().length > 0,\n );\n\n const result = new Map<string, Vulnerability[]>();\n\n // Split into batches to stay within OSV API limits\n for (let i = 0; i < validPackages.length; i += BATCH_SIZE) {\n const batch = validPackages.slice(i, i + BATCH_SIZE);\n // OSV.dev no soporta \"Homebrew\" como ecosystem (HTTP 400).\n // \"Bitnami\" cubre la mayoría de OSS comunes; paquetes fuera de su catálogo\n // simplemente devuelven vulns vacíos. Mismo enfoque que SecurityMonitor.swift.\n const queries: OsvQuery[] = batch.map((p) => ({\n package: { name: p.name, ecosystem: 'Bitnami' },\n version: p.version,\n }));\n\n const partial = await queryBatch(batch, queries);\n for (const [k, v] of partial) result.set(k, v);\n }\n\n return result;\n}\n","import { queryVulnerabilities } from './osv-api.js';\nimport type { Formula, Cask } from '../types.js';\nimport type { PackageAuditResult, SecurityAuditSummary, Severity } from './types.js';\n\nconst SEVERITY_ORDER: Record<Severity, number> = {\n CRITICAL: 4,\n HIGH: 3,\n MEDIUM: 2,\n LOW: 1,\n UNKNOWN: 0,\n};\n\nexport async function runSecurityAudit(\n isPro: boolean,\n formulae: Formula[],\n casks: Cask[],\n): Promise<SecurityAuditSummary> {\n if (!isPro) throw new Error('Pro license required');\n\n const packages: Array<{ name: string; version: string }> = [];\n\n for (const f of formulae) {\n const version = f.installed[0]?.version ?? f.versions.stable;\n packages.push({ name: f.name, version });\n }\n\n for (const c of casks) {\n if (c.installed) {\n packages.push({ name: c.token, version: c.installed });\n }\n }\n\n // Batch query (OSV supports up to 1000)\n const vulnMap = await queryVulnerabilities(packages);\n\n const results: PackageAuditResult[] = [];\n let criticalCount = 0;\n let highCount = 0;\n let mediumCount = 0;\n let lowCount = 0;\n\n for (const [name, vulns] of vulnMap) {\n const pkg = packages.find((p) => p.name === name);\n if (!pkg) continue;\n\n const maxSeverity = vulns.reduce<Severity>((max, v) =>\n SEVERITY_ORDER[v.severity] > SEVERITY_ORDER[max] ? v.severity : max,\n 'UNKNOWN',\n );\n\n results.push({\n packageName: name,\n installedVersion: pkg.version,\n vulnerabilities: vulns,\n maxSeverity,\n });\n\n for (const v of vulns) {\n if (v.severity === 'CRITICAL') criticalCount++;\n else if (v.severity === 'HIGH') highCount++;\n else if (v.severity === 'MEDIUM') mediumCount++;\n else if (v.severity === 'LOW') lowCount++;\n }\n }\n\n // Sort by severity (most severe first)\n results.sort((a, b) => SEVERITY_ORDER[b.maxSeverity] - SEVERITY_ORDER[a.maxSeverity]);\n\n return {\n scannedAt: new Date().toISOString(),\n totalPackages: packages.length,\n vulnerablePackages: results.length,\n criticalCount,\n highCount,\n mediumCount,\n lowCount,\n results,\n };\n}\n","import inspector from 'node:inspector';\n\ndeclare const __TEST_MODE__: boolean;\n\n/**\n * Detect if a debugger/inspector is attached.\n * If detected, Pro features are disabled as a precaution.\n * In test builds (__TEST_MODE__ is replaced at compile time by tsup),\n * detection is skipped to avoid false-positives with vitest --inspect-brk.\n */\nexport function isDebuggerAttached(): boolean {\n // Compile-time flag — replaced to `false` in production builds\n if (typeof __TEST_MODE__ !== 'undefined' && __TEST_MODE__) return false;\n\n // Node.js inspector protocol active\n if (inspector.url()) return true;\n\n // Debug flags in process arguments\n if (process.execArgv.some((a) => a.includes('--inspect') || a.includes('--debug'))) return true;\n\n // Debug environment variables\n if (process.env.NODE_OPTIONS?.includes('--inspect')) return true;\n\n return false;\n}\n","/**\n * Canary functions for detecting license bypass attempts.\n *\n * These functions LOOK like they gate Pro features but are actually\n * trap checks. They should always return false in normal operation.\n * If they return true, it means someone patched the code to bypass\n * license checks indiscriminately.\n */\n\n// Looks like a Pro check but should NEVER be true in production\n// If someone does a global find-replace to make all license checks return true,\n// this will also return true, triggering the tamper detection.\nlet _canaryTripped = false;\n\nexport function isProUnlocked(): boolean {\n // This function name looks like a legitimate license gate.\n // If someone patches it to return true, we detect the tamper.\n return false;\n}\n\nexport function hasProAccess(): boolean {\n // Another decoy. Should always return false.\n return false;\n}\n\nexport function isLicenseValid(): boolean {\n // Decoy #3\n return false;\n}\n\n/**\n * Check if any canary has been tripped (patched to return true).\n * If so, the binary has been tampered with.\n */\nexport function checkCanaries(): boolean {\n // If ANY of these return true, someone did a blanket patch\n if (isProUnlocked()) { _canaryTripped = true; return false; }\n if (hasProAccess()) { _canaryTripped = true; return false; }\n if (isLicenseValid()) { _canaryTripped = true; return false; }\n return !_canaryTripped;\n}\n","import { readFileSync } from 'node:fs';\nimport { createHash } from 'node:crypto';\nimport { fileURLToPath } from 'node:url';\n\n// Hash captured at module-load time (earliest possible moment in this process).\n// This detects file modification that occurs AFTER the module has already been\n// loaded into the process — i.e. an attacker who patches the file on-disk while\n// the TUI is running. It does NOT detect patches applied before or during\n// module load. For that, a signed bundle with an external manifest would be required.\nlet _baselineHash: string | null = null;\n\n// In dev (`tsx`), `import.meta.url` points at the live TS source which can be\n// re-transpiled; baseline capture is unreliable and must fail-open so devs can\n// run the TUI. In production (`NODE_ENV !== 'development'`) the bundle is a\n// static .js file and any failure to read it is treated as tampering.\nconst _isProduction = process.env.NODE_ENV !== 'development'\n && process.env.NODE_ENV !== 'test';\n\nfunction _captureBaseline(): string | null {\n try {\n const bundlePath = fileURLToPath(import.meta.url);\n const content = readFileSync(bundlePath, 'utf-8');\n return createHash('sha256').update(content).digest('hex');\n } catch {\n return null;\n }\n}\n\n// Capture immediately at module load — do not defer.\n_baselineHash = _captureBaseline();\n\n/**\n * Detect on-disk modification of the running bundle after process start.\n * Returns false only if the file was verifiably changed since module load.\n *\n * Dev mode (NODE_ENV=development|test): fails open if the baseline could not\n * be captured or the file cannot be re-read, so `npm run dev` and the test\n * runner are not blocked by tsx-relative paths.\n *\n * Production: fail-closed in both code paths — a missing baseline or an\n * unreadable bundle both mean we cannot prove integrity, so we deny access.\n */\nexport function checkBundleIntegrity(): boolean {\n if (_baselineHash === null) {\n return !_isProduction;\n }\n try {\n const bundlePath = fileURLToPath(import.meta.url);\n const content = readFileSync(bundlePath, 'utf-8');\n const current = createHash('sha256').update(content).digest('hex');\n return current === _baselineHash;\n } catch {\n // SEG-006: Fail closed in production; in dev keep the TUI usable.\n return !_isProduction;\n }\n}\n","import { isDebuggerAttached } from './anti-debug.js';\nimport { verifyStoreIntegrity } from './anti-tamper.js';\nimport { checkCanaries } from './canary.js';\nimport { checkBundleIntegrity } from './integrity.js';\nimport { getDegradationLevel } from './license-manager.js';\nimport type { LicenseData, LicenseStatus } from './types.js';\n\n// ── Layer 14: Obfuscated secondary verification ──\n// Secondary verification using indirect property access.\n// Resists simple string-search bypass (searching for \"status\" or \"pro\").\nconst _P = String.fromCharCode(112, 114, 111); // \"pro\"\n\nexport function _verify(status: string): boolean {\n return status === _P;\n}\n\n/**\n * Multi-layered Pro license verification. Call this inside Pro feature logic\n * (not just at the view gate) as a defense-in-depth check.\n * Combines direct store check, bundle integrity, debugger detection,\n * obfuscated indirect check, store integrity, canary checks, and\n * degradation level.\n * Returns true if Pro, false otherwise.\n */\nexport function verifyPro(license: LicenseData | null, status: LicenseStatus): boolean {\n if (isDebuggerAttached()) return false;\n if (!checkBundleIntegrity()) return false;\n if (!verifyStoreIntegrity()) return false;\n if (!checkCanaries()) return false;\n\n const directCheck = status === 'pro';\n const indirectCheck = _verify(status);\n\n // Both must agree — if someone patched one, the other catches it\n if (!directCheck || !indirectCheck) return false;\n\n // Layer 15: Check degradation level (time-bomb for extended offline)\n if (license) {\n const level = getDegradationLevel(license);\n if (level === 'expired' || level === 'limited') return false;\n }\n\n return true;\n}\n\n/**\n * Throws if not Pro. Use in critical Pro-only operations.\n */\nexport function requirePro(license: LicenseData | null, status: LicenseStatus): void {\n if (!verifyPro(license, status)) {\n throw new Error('Pro license required');\n }\n}\n","import { create } from 'zustand';\nimport type { BrewfileSchema, DriftReport } from '../lib/brewfile/types.js';\nimport {\n loadBrewfile,\n saveBrewfile,\n computeDrift,\n createDefaultBrewfile,\n} from '../lib/brewfile/brewfile-manager.js';\n\ninterface BrewfileState {\n schema: BrewfileSchema | null;\n drift: DriftReport | null;\n loading: boolean;\n driftLoading: boolean;\n error: string | null;\n\n load: () => Promise<void>;\n save: (schema: BrewfileSchema) => Promise<void>;\n refreshDrift: () => Promise<void>;\n createFromCurrent: (name: string) => Promise<void>;\n}\n\nexport const useBrewfileStore = create<BrewfileState>((set, get) => ({\n schema: null,\n drift: null,\n loading: false,\n driftLoading: false,\n error: null,\n\n load: async () => {\n set({ loading: true, error: null });\n try {\n const schema = await loadBrewfile();\n set({ schema, loading: false });\n if (schema) {\n void get().refreshDrift();\n }\n } catch (err) {\n set({ error: err instanceof Error ? err.message : String(err), loading: false });\n }\n },\n\n save: async (schema) => {\n set({ error: null });\n try {\n await saveBrewfile(schema);\n set({ schema });\n } catch (err) {\n set({ error: err instanceof Error ? err.message : String(err) });\n }\n },\n\n refreshDrift: async () => {\n const { schema } = get();\n if (!schema) return;\n set({ driftLoading: true, error: null });\n try {\n const drift = await computeDrift(schema);\n set({ drift, driftLoading: false });\n } catch (err) {\n set({ error: err instanceof Error ? err.message : String(err), driftLoading: false });\n }\n },\n\n createFromCurrent: async (name) => {\n set({ loading: true, error: null });\n try {\n const schema = await createDefaultBrewfile(name);\n await saveBrewfile(schema);\n set({ schema, loading: false });\n void get().refreshDrift();\n } catch (err) {\n set({ error: err instanceof Error ? err.message : String(err), loading: false });\n }\n },\n}));\n","import { create } from 'zustand';\nimport type { SyncConfig, SyncConflict, SyncResult } from '../lib/sync/types.js';\nimport {\n sync,\n loadSyncConfig,\n applyConflictResolutions,\n} from '../lib/sync/sync-engine.js';\nimport { readSyncEnvelope } from '../lib/sync/backends/icloud-backend.js';\nimport { decryptPayload } from '../lib/sync/crypto.js';\nimport { loadLicense } from '../lib/license/license-manager.js';\nimport { logger } from '../utils/logger.js';\nimport type { BrewfileSchema } from '../lib/brewfile/types.js';\n\ninterface SyncState {\n config: SyncConfig | null;\n lastResult: SyncResult | null;\n conflicts: SyncConflict[];\n loading: boolean;\n error: string | null;\n\n initialize: (isPro: boolean) => Promise<void>;\n syncNow: (isPro: boolean, brewfile?: BrewfileSchema) => Promise<void>;\n resolveConflicts: (\n resolutions: Array<{ conflict: SyncConflict; resolution: 'use-local' | 'use-remote' }>,\n ) => Promise<void>;\n}\n\nexport const useSyncStore = create<SyncState>((set, get) => ({\n config: null,\n lastResult: null,\n conflicts: [],\n loading: false,\n error: null,\n\n initialize: async (isPro: boolean) => {\n if (!isPro) return;\n try {\n const config = await loadSyncConfig();\n set({ config });\n } catch (err) {\n logger.warn('sync-store: could not load config', { error: String(err) });\n }\n },\n\n syncNow: async (isPro: boolean, brewfile?: BrewfileSchema) => {\n set({ loading: true, error: null });\n try {\n const result = await sync(isPro, brewfile);\n if (result.conflicts.length > 0) {\n set({ conflicts: result.conflicts, lastResult: result, loading: false });\n } else {\n const config = await loadSyncConfig();\n set({ config, lastResult: result, conflicts: [], loading: false });\n }\n } catch (err) {\n const error = err instanceof Error ? err.message : String(err);\n set({ error, loading: false });\n }\n },\n\n resolveConflicts: async (resolutions) => {\n set({ loading: true, error: null });\n try {\n const config = get().config;\n if (!config) throw new Error('Sync not initialized');\n\n // Load current payload from iCloud\n const envelope = await readSyncEnvelope();\n if (!envelope) throw new Error('No sync data found');\n\n const license = await loadLicense();\n if (!license) throw new Error('License missing');\n const payload = decryptPayload(envelope.encrypted, envelope.iv, envelope.tag, license.key);\n await applyConflictResolutions(payload, resolutions, config.machineId);\n\n const updatedConfig = await loadSyncConfig();\n set({ config: updatedConfig, conflicts: [], loading: false });\n } catch (err) {\n const error = err instanceof Error ? err.message : String(err);\n set({ error, loading: false });\n }\n },\n}));\n","import { create } from 'zustand';\nimport type { PolicyFile, ComplianceReport } from '../lib/compliance/types.js';\nimport { checkCompliance } from '../lib/compliance/compliance-checker.js';\nimport { loadPolicy } from '../lib/compliance/policy-io.js';\n\ninterface ComplianceState {\n policy: PolicyFile | null;\n report: ComplianceReport | null;\n loading: boolean;\n error: string | null;\n\n importPolicy: (filePath: string, isPro: boolean) => Promise<void>;\n runCheck: (isPro: boolean) => Promise<void>;\n clearPolicy: () => void;\n}\n\nexport const useComplianceStore = create<ComplianceState>((set, get) => ({\n policy: null,\n report: null,\n loading: false,\n error: null,\n\n importPolicy: async (filePath: string, isPro: boolean) => {\n if (!isPro) {\n set({ error: 'Pro license required' });\n return;\n }\n set({ loading: true, error: null });\n try {\n const policy = await loadPolicy(filePath);\n set({ policy, loading: false });\n } catch (err) {\n const error = err instanceof Error ? err.message : String(err);\n set({ error, loading: false });\n }\n },\n\n runCheck: async (isPro: boolean) => {\n const { policy } = get();\n if (!policy) return;\n set({ loading: true, error: null });\n try {\n const report = await checkCompliance(policy, isPro);\n set({ report, loading: false });\n } catch (err) {\n const error = err instanceof Error ? err.message : String(err);\n set({ error, loading: false });\n }\n },\n\n clearPolicy: () => set({ policy: null, report: null, error: null }),\n}));\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { useTerminalSize } from '../../hooks/use-terminal-size.js';\nimport { COLORS } from '../../utils/colors.js';\nimport { SPACING } from '../../utils/spacing.js';\n\ninterface StatCardProps {\n label: string;\n value: string | number;\n color?: string;\n}\n\nexport function StatCard({ label, value, color = COLORS.white }: StatCardProps) {\n const { columns } = useTerminalSize();\n // Adapt min width to terminal: tight on narrow, comfortable on wide\n const minW = columns < 60 ? 12 : columns < 100 ? 14 : 16;\n\n return (\n <Box\n borderStyle=\"round\"\n borderColor={color}\n paddingX={SPACING.sm}\n paddingY={SPACING.none}\n flexDirection=\"column\"\n alignItems=\"center\"\n flexShrink={1}\n minWidth={minW}\n >\n <Text bold color={color}>{value}</Text>\n <Text color={COLORS.muted}>{label}</Text>\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { Spinner } from '@inkjs/ui';\nimport { COLORS } from '../../utils/colors.js';\nimport { t, useLocaleStore } from '../../i18n/index.js';\nimport { SPACING } from '../../utils/spacing.js';\n\ninterface LoadingProps {\n message?: string;\n}\n\nexport function Loading({ message }: LoadingProps) {\n useLocaleStore((s) => s.locale); // re-render on locale change\n return (\n <Box paddingY={SPACING.xs}>\n <Spinner label={message ?? t('loading_default')} />\n </Box>\n );\n}\n\ninterface ErrorMessageProps {\n message: string;\n}\n\nexport function ErrorMessage({ message }: ErrorMessageProps) {\n useLocaleStore((s) => s.locale); // re-render on locale change\n return (\n <Box paddingY={SPACING.xs}>\n <Text color={COLORS.error} bold>{'\\u2718'} {t('error_prefix')}</Text>\n <Text color={COLORS.error}>{message}</Text>\n </Box>\n );\n}\n","import React from 'react';\nimport { Text } from 'ink';\nimport { COLORS } from '../../utils/colors.js';\n\ntype BadgeVariant = 'success' | 'warning' | 'error' | 'info' | 'muted';\n\nconst BADGE_STYLES: Record<BadgeVariant, { icon: string; color: string }> = {\n success: { icon: '\\u2714', color: COLORS.success },\n warning: { icon: '\\u25B2', color: COLORS.warning },\n error: { icon: '\\u2718', color: COLORS.error },\n info: { icon: '\\u25C6', color: COLORS.blue },\n muted: { icon: '\\u25CB', color: COLORS.textSecondary },\n};\n\ninterface StatusBadgeProps {\n label: string;\n variant: BadgeVariant;\n}\n\nexport function StatusBadge({ label, variant }: StatusBadgeProps) {\n const { icon, color } = BADGE_STYLES[variant];\n return <Text color={color}>{icon} {label}</Text>;\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { COLORS } from '../../utils/colors.js';\nimport { GradientText } from '../../utils/gradient.js';\nimport { SPACING } from '../../utils/spacing.js';\n\ninterface SectionHeaderProps {\n emoji: string;\n title: string;\n color?: string;\n gradient?: string[];\n count?: number | string;\n}\n\nexport function SectionHeader({ emoji, title, color = COLORS.gold, gradient, count }: SectionHeaderProps) {\n return (\n <Box gap={SPACING.xs}>\n <Text>{emoji} </Text>\n {gradient ? (\n <GradientText colors={gradient} bold>{title}</GradientText>\n ) : (\n <Text bold color={color}>{title}</Text>\n )}\n {count !== undefined && (\n <Text color={COLORS.textSecondary}>({count})</Text>\n )}\n </Box>\n );\n}\n","import React from 'react';\nimport { Text } from 'ink';\nimport { COLORS } from '../../utils/colors.js';\nimport { t } from '../../i18n/index.js';\n\ninterface VersionArrowProps {\n current: string;\n latest: string;\n}\n\nexport function VersionArrow({ current, latest }: VersionArrowProps) {\n return (\n <>\n <Text color={COLORS.muted}>{t('version_installed')} </Text>\n <Text color={COLORS.error}>{current}</Text>\n <Text color={COLORS.warning}>{' \\u2500\\u2500 '}</Text>\n <Text color={COLORS.gold}>{'\\u25B6'}</Text>\n <Text color={COLORS.muted}> {t('version_available')} </Text>\n <Text color={COLORS.teal}>{latest}</Text>\n </>\n );\n}\n","import { getLocale, t } from '../i18n/index.js';\n\nexport function formatBytes(bytes: number): string {\n if (!isFinite(bytes) || bytes <= 0) return '0 B';\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.min(Math.floor(Math.log(bytes) / Math.log(1024)), units.length - 1);\n return `${(bytes / Math.pow(1024, i)).toFixed(1)} ${units[i]}`;\n}\n\nexport function formatRelativeTime(timestamp: number): string {\n if (!timestamp || !isFinite(timestamp)) return t('time_justNow');\n const diff = Date.now() / 1000 - timestamp;\n if (diff < 0) return t('time_justNow');\n if (diff < 60) return t('time_justNow');\n if (diff < 3600) return t('time_minutesAgo', { n: Math.floor(diff / 60) });\n if (diff < 86400) return t('time_hoursAgo', { n: Math.floor(diff / 3600) });\n if (diff < 2592000) return t('time_daysAgo', { n: Math.floor(diff / 86400) });\n return t('time_monthsAgo', { n: Math.floor(diff / 2592000) });\n}\n\nexport function formatDate(value: string | number | Date): string {\n const date = value instanceof Date ? value : new Date(value);\n const locale = getLocale();\n return date.toLocaleDateString(locale === 'es' ? 'es-ES' : 'en-US');\n}\n\nexport function truncate(str: string, maxLen: number): string {\n if (str.length <= maxLen) return str;\n return str.slice(0, maxLen - 1) + '\\u2026';\n}\n","import React, { useState, useMemo, useEffect, useRef } from 'react';\nimport { Box, Text, type DOMElement } from 'ink';\nimport { useViewInput } from '../hooks/use-view-input.js';\nimport { useBrewStore } from '../stores/brew-store.js';\nimport { useNavigationStore } from '../stores/navigation-store.js';\nimport { useDebounce } from '../hooks/use-debounce.js';\nimport { useBrewStream } from '../hooks/use-brew-stream.js';\nimport { formulaeToListItems, casksToListItems } from '../lib/brew-api.js';\nimport { SearchInput } from '../components/common/search-input.js';\nimport { StatusBadge } from '../components/common/status-badge.js';\nimport { ConfirmDialog } from '../components/common/confirm-dialog.js';\nimport { ProgressLog } from '../components/common/progress-log.js';\nimport { ResultBanner } from '../components/common/result-banner.js';\nimport { SelectableRow } from '../components/common/selectable-row.js';\nimport { Loading, ErrorMessage } from '../components/common/loading.js';\nimport { COLORS } from '../utils/colors.js';\nimport { t } from '../i18n/index.js';\nimport { useModalStore } from '../stores/modal-store.js';\nimport { useContainerSize } from '../hooks/use-container-size.js';\nimport { useVisibleRows } from '../hooks/use-visible-rows.js';\nimport type { PackageListItem } from '../lib/types.js';\nimport { SPACING, getLayoutMode } from '../utils/spacing.js';\n\nexport function InstalledView() {\n const formulae = useBrewStore((s) => s.formulae);\n const casks = useBrewStore((s) => s.casks);\n const loading = useBrewStore((s) => s.loading);\n const errors = useBrewStore((s) => s.errors);\n const fetchInstalled = useBrewStore((s) => s.fetchInstalled);\n const navigate = useNavigationStore((s) => s.navigate);\n const selectPackage = useNavigationStore((s) => s.selectPackage);\n const { openModal, closeModal } = useModalStore();\n\n const containerRef = useRef<DOMElement>(null);\n const { width: containerWidth } = useContainerSize(containerRef);\n // Fallback to viewport width on first frame, before measureElement runs.\n const columns = containerWidth > 0 ? containerWidth : 80;\n const mode = getLayoutMode(columns);\n // Column widths are passed to <Box width=...> and Yoga handles the truncate\n // via <Text wrap=\"truncate\">. We do NOT call String.padEnd — that builds the\n // row as a string and bypasses the flex layout, which is why narrow widths\n // used to cut words / overflow. minWidth=0 + flexShrink=1 on each <Box>\n // lets Yoga shrink the cell below its content size (the canonical CSS\n // `min-width: 0` pattern). The last column (desc/badges) uses flexGrow=1 so\n // it eats the remainder regardless of gap arithmetic.\n const nameWidth = mode === 'single'\n ? Math.max(8, columns - 2 /* cursor + gap */)\n : Math.max(12, Math.floor(columns * 0.35));\n const versionWidth = Math.max(8, Math.floor(columns * 0.15));\n\n const [filter, setFilter] = useState('');\n const [cursor, setCursor] = useState(0);\n const [tab, setTab] = useState<'formulae' | 'casks'>('formulae');\n const [isSearching, setIsSearching] = useState(false);\n const [confirmUninstall, setConfirmUninstall] = useState<string | null>(null);\n const debouncedFilter = useDebounce(filter, 200);\n const stream = useBrewStream();\n\n const listRows = useVisibleRows({\n reservedRows: isSearching ? 14 : 10,\n fallbackReservedRows: isSearching ? 18 : 14,\n minRows: 1,\n });\n const streamRows = useVisibleRows({\n reservedRows: 5,\n fallbackReservedRows: 14,\n minRows: 1,\n });\n\n useEffect(() => { fetchInstalled(); }, []);\n\n useEffect(() => {\n if (isSearching) {\n openModal();\n return () => { closeModal(); };\n }\n return undefined;\n }, [isSearching]);\n\n const allItems: PackageListItem[] = useMemo(() => {\n const items = tab === 'formulae'\n ? formulaeToListItems(formulae)\n : casksToListItems(casks);\n\n if (!debouncedFilter) return items;\n const lower = debouncedFilter.toLowerCase();\n return items.filter((p) =>\n p.name.toLowerCase().includes(lower) || p.desc.toLowerCase().includes(lower)\n );\n }, [formulae, casks, tab, debouncedFilter]);\n\n useViewInput((input, key) => {\n if (confirmUninstall) return;\n\n // SCR-12-I1: while a brew uninstall is streaming we promised \"esc:cancel\"\n // in the hint bar. Honour it by intercepting Esc here so it tears down the\n // child process instead of bubbling up to global navigation.\n if (stream.isRunning) {\n if (key.escape) stream.cancel();\n return;\n }\n\n // Stream finished but still showing — Esc dismisses and refreshes\n if (stream.lines.length > 0) {\n if (key.escape) {\n stream.clear();\n void fetchInstalled();\n }\n return;\n }\n\n if (isSearching) {\n if (key.escape) {\n setIsSearching(false);\n setFilter('');\n }\n return;\n }\n\n if (input === '/') {\n setIsSearching(true);\n return;\n }\n\n if ((input === 'u' || input === '1') && allItems[cursor]) {\n setConfirmUninstall(allItems[cursor].name);\n return;\n }\n\n if (input === 'j' || key.downArrow) {\n setCursor((c) => Math.min(c + 1, Math.max(0, allItems.length - 1)));\n } else if (input === 'k' || key.upArrow) {\n setCursor((c) => Math.max(c - 1, 0));\n } else if (input === 'g') {\n setCursor(0);\n } else if (input === 'G') {\n setCursor(Math.max(allItems.length - 1, 0));\n } else if (key.return && allItems[cursor]) {\n selectPackage(allItems[cursor].name, tab === 'formulae' ? 'formula' : 'cask');\n navigate('package-info');\n } else if (input === 'f' || input === '2') {\n setTab((t) => t === 'formulae' ? 'casks' : 'formulae');\n setCursor(0);\n }\n }, { isActive: true });\n\n if (loading.installed) return <Loading message={t('loading_installed')} />;\n if (errors.installed) return <ErrorMessage message={errors.installed} />;\n\n if (stream.isRunning || stream.lines.length > 0) {\n return (\n <Box flexDirection=\"column\">\n <ProgressLog\n lines={stream.lines}\n isRunning={stream.isRunning}\n title={t('pkgInfo_uninstalling', { name: '...' })}\n maxVisible={streamRows}\n />\n {stream.isRunning && (\n <Text color={COLORS.textSecondary}>esc:{t('hint_cancel')}</Text>\n )}\n {!stream.isRunning && (\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n <ResultBanner\n status={stream.error ? 'error' : 'success'}\n message={stream.error ? `\\u2718 ${stream.error}` : `\\u2714 ${t('pkgInfo_done')}`}\n />\n <Text color={COLORS.textSecondary}>esc:{t('hint_back')}</Text>\n </Box>\n )}\n </Box>\n );\n }\n\n const MAX_VISIBLE_ROWS = listRows;\n const start = Math.max(0, cursor - Math.floor(MAX_VISIBLE_ROWS / 2));\n const visible = allItems.slice(start, start + MAX_VISIBLE_ROWS);\n\n return (\n <Box flexDirection=\"column\" ref={containerRef}>\n {/* Tab selector — both tabs always have a round border so the tab bar\n height stays constant when switching (prevents content jump). The\n inactive tab uses a dim gray border to signal it is not selected. */}\n <Box marginBottom={SPACING.xs} gap={SPACING.xs}>\n <Box\n borderStyle=\"round\"\n borderColor={tab === 'formulae' ? COLORS.info : COLORS.textSecondary}\n paddingX={SPACING.xs}\n >\n <Text bold={tab === 'formulae'} color={tab === 'formulae' ? COLORS.info : COLORS.textSecondary}>\n {'\\u{1F4E6}'} {t('installed_formulaeCount', { count: formulae.length })}\n </Text>\n </Box>\n <Box\n borderStyle=\"round\"\n borderColor={tab === 'casks' ? COLORS.purple : COLORS.textSecondary}\n paddingX={SPACING.xs}\n >\n <Text bold={tab === 'casks'} color={tab === 'casks' ? COLORS.purple : COLORS.textSecondary}>\n {'\\u{1F37A}'} {t('installed_casksCount', { count: casks.length })}\n </Text>\n </Box>\n </Box>\n\n {/* Uninstall confirmation */}\n {confirmUninstall && (\n <ConfirmDialog\n message={t('installed_confirmUninstall', { name: confirmUninstall })}\n onConfirm={() => {\n const name = confirmUninstall;\n setConfirmUninstall(null);\n void stream.run(['uninstall', name]).then(() => { fetchInstalled(); });\n }}\n onCancel={() => setConfirmUninstall(null)}\n />\n )}\n\n {/* Search bar */}\n {isSearching && (\n <Box marginBottom={SPACING.xs} borderStyle=\"round\" borderColor={COLORS.gold} paddingX={SPACING.xs}>\n <SearchInput defaultValue={filter} onChange={setFilter} isActive={isSearching} />\n </Box>\n )}\n\n {/* Column header — widths match the data rows below. Both share the same\n gap={SPACING.xs} parent Box plus a 1-char cursor glyph in front. We\n do NOT pad strings here: Yoga handles alignment via <Box width=…>. */}\n <Box gap={SPACING.xs} borderStyle=\"single\" borderBottom borderTop={false} borderLeft={false} borderRight={false} borderColor={COLORS.border}>\n <Text color={COLORS.text}>{' '}</Text>\n <Box width={nameWidth} flexShrink={1} minWidth={0}>\n <Text color={COLORS.text} bold wrap=\"truncate\">{t('installed_col_package')}</Text>\n </Box>\n {mode !== 'single' && (\n <Box width={versionWidth} flexShrink={1} minWidth={0}>\n <Text color={COLORS.text} bold wrap=\"truncate\">{t('installed_col_version')}</Text>\n </Box>\n )}\n {mode !== 'single' && mode !== 'compact' && (\n <Box flexGrow={1} flexShrink={1} minWidth={0}>\n <Text color={COLORS.text} bold wrap=\"truncate\">{t('installed_col_status')}</Text>\n </Box>\n )}\n </Box>\n\n {/* Package list */}\n <Box flexDirection=\"column\">\n {visible.length === 0 && (\n <Box paddingY={SPACING.xs} justifyContent=\"center\">\n <Text color={COLORS.textSecondary} italic>{t('installed_noPackages')}</Text>\n </Box>\n )}\n {start > 0 && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreAbove', { count: start })}</Text>\n )}\n {visible.map((item, i) => {\n const idx = start + i;\n const isCurrent = idx === cursor;\n const hasBadge = item.outdated || item.pinned || item.kegOnly || item.installedAsDependency;\n return (\n <SelectableRow key={item.name} isCurrent={isCurrent}>\n <Box width={nameWidth} flexShrink={1} minWidth={0}>\n <Text\n bold={isCurrent}\n inverse={isCurrent}\n color={isCurrent ? COLORS.text : COLORS.muted}\n // truncate-middle preserves @version / ::tap suffixes that\n // identify a formula uniquely (e.g. `python@3.12`).\n wrap=\"truncate-middle\"\n >\n {item.name}\n </Text>\n </Box>\n {mode !== 'single' && (\n <Box width={versionWidth} flexShrink={1} minWidth={0}>\n <Text color={COLORS.teal} wrap=\"truncate\">{item.version}</Text>\n </Box>\n )}\n {mode !== 'single' && mode !== 'compact' && (\n <Box flexGrow={1} flexShrink={1} minWidth={0}>\n {hasBadge ? (\n <Box gap={SPACING.xs}>\n {item.outdated && <StatusBadge label={t('badge_outdated')} variant=\"warning\" />}\n {item.pinned && <StatusBadge label={t('badge_pinned')} variant=\"info\" />}\n {item.kegOnly && <StatusBadge label={t('badge_kegOnly')} variant=\"muted\" />}\n {item.installedAsDependency && <StatusBadge label={t('badge_dep')} variant=\"muted\" />}\n </Box>\n ) : (\n <Text color={COLORS.textSecondary} dimColor wrap=\"truncate\">{item.desc}</Text>\n )}\n </Box>\n )}\n </SelectableRow>\n );\n })}\n {start + MAX_VISIBLE_ROWS < allItems.length && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreBelow', { count: allItems.length - start - MAX_VISIBLE_ROWS })}</Text>\n )}\n </Box>\n\n {/* Status bar */}\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.text} bold>\n {allItems.length > 0 ? `${cursor + 1}/${allItems.length}` : '0/0'}\n </Text>\n </Box>\n </Box>\n );\n}\n","import { useState, useEffect } from 'react';\n\nexport function useDebounce<T>(value: T, delayMs: number): T {\n const [debounced, setDebounced] = useState(value);\n\n useEffect(() => {\n const timer = setTimeout(() => setDebounced(value), delayMs);\n return () => clearTimeout(timer);\n }, [value, delayMs]);\n\n return debounced;\n}\n","import { useState, useCallback, useRef, useEffect } from 'react';\nimport { streamBrew } from '../lib/brew-cli.js';\nimport { detectAction } from '../lib/history/history-logger.js';\nimport { useLicenseStore } from '../stores/license-store.js';\nimport { logger } from '../utils/logger.js';\n\nconst MAX_LINES = 100;\n\nasync function logToHistory(args: string[], success: boolean, error: string | null): Promise<void> {\n const detected = detectAction(args);\n if (!detected) return;\n\n try {\n const isPro = useLicenseStore.getState().isPro();\n const { appendEntry } = await import('../lib/history/history-logger.js');\n await appendEntry(isPro, detected.action, detected.packageName, success, error);\n } catch {\n // Free user or file error — silently skip logging\n }\n}\n\ninterface BrewStreamState {\n lines: string[];\n isRunning: boolean;\n error: string | null;\n run: (args: string[]) => Promise<void>;\n cancel: () => void;\n clear: () => void;\n}\n\nexport function useBrewStream(): BrewStreamState {\n const [lines, setLines] = useState<string[]>([]);\n const [isRunning, setIsRunning] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const cancelRef = useRef(false);\n const generatorRef = useRef<AsyncGenerator<string> | null>(null);\n const mountedRef = useRef(true);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n generatorRef.current?.return(undefined);\n generatorRef.current = null;\n };\n }, []);\n\n const run = useCallback(async (args: string[]) => {\n if (!mountedRef.current) return;\n setIsRunning(true);\n setError(null);\n setLines([]);\n cancelRef.current = false;\n\n const gen = streamBrew(args);\n generatorRef.current = gen;\n\n let streamError: string | null = null;\n\n try {\n for await (const line of gen) {\n if (cancelRef.current) break;\n if (mountedRef.current) {\n setLines((prev) => [...prev.slice(-(MAX_LINES - 1)), line]);\n }\n }\n } catch (err) {\n streamError = err instanceof Error ? err.message : String(err);\n if (!cancelRef.current && mountedRef.current) {\n setError(streamError);\n }\n } finally {\n generatorRef.current = null;\n if (mountedRef.current) {\n setIsRunning(false);\n }\n }\n\n // Log to history (Pro users only, silently skipped for free)\n if (!cancelRef.current) {\n void logToHistory(args, streamError === null, streamError);\n }\n\n // Auto-capture snapshot after mutating brew operations\n const MUTATING_COMMANDS = new Set(['install', 'uninstall', 'upgrade', 'pin', 'unpin', 'tap', 'untap']);\n if (!cancelRef.current && MUTATING_COMMANDS.has(args[0] ?? '')) {\n void import('../lib/state-snapshot/snapshot.js').then(({ captureSnapshot, saveSnapshot }) => {\n captureSnapshot()\n .then((s) => saveSnapshot(s))\n .catch((err) => logger.warn('snapshot: capture/save failed', { error: String(err) }));\n });\n }\n }, []);\n\n const cancel = useCallback(() => {\n cancelRef.current = true;\n generatorRef.current?.return(undefined);\n generatorRef.current = null;\n }, []);\n\n const clear = useCallback(() => {\n setLines([]);\n setError(null);\n }, []);\n\n return { lines, isRunning, error, run, cancel, clear };\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { TextInput } from '@inkjs/ui';\nimport { COLORS } from '../../utils/colors.js';\nimport { t } from '../../i18n/index.js';\n\ninterface SearchInputProps {\n defaultValue?: string;\n onChange: (value: string) => void;\n placeholder?: string;\n isActive?: boolean;\n}\n\nexport function SearchInput({ defaultValue, onChange, placeholder, isActive = true }: SearchInputProps) {\n const resolvedPlaceholder = placeholder ?? t('searchInput_placeholder');\n return (\n <Box>\n <Text color={COLORS.gold}>{'\\u{1F50D}'} </Text>\n {isActive ? (\n <TextInput\n placeholder={resolvedPlaceholder}\n defaultValue={defaultValue}\n onChange={onChange}\n />\n ) : (\n <Text color={COLORS.textSecondary}>{defaultValue || placeholder}</Text>\n )}\n </Box>\n );\n}\n","import React, { useEffect } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { COLORS } from '../../utils/colors.js';\nimport { t, useLocaleStore } from '../../i18n/index.js';\nimport { useModalStore } from '../../stores/modal-store.js';\nimport { SPACING } from '../../utils/spacing.js';\n\ninterface ConfirmDialogProps {\n message: string;\n onConfirm: () => void;\n onCancel: () => void;\n}\n\nexport function ConfirmDialog({ message, onConfirm, onCancel }: ConfirmDialogProps) {\n const locale = useLocaleStore((s) => s.locale);\n const { openModal, closeModal } = useModalStore();\n\n useEffect(() => {\n openModal();\n return () => { closeModal(); };\n }, []);\n\n useInput((input, key) => {\n if (input === 'y' || input === 'Y') onConfirm();\n else if (locale === 'es' && (input === 's' || input === 'S')) onConfirm();\n else if (input === 'n' || input === 'N') onCancel();\n else if (key.escape) onCancel();\n });\n\n return (\n <Box borderStyle=\"double\" borderColor={COLORS.purple} paddingX={SPACING.sm} paddingY={SPACING.xs} flexDirection=\"column\" flexShrink={1}>\n <Text bold color={COLORS.text} wrap=\"wrap\">{message}</Text>\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.success}>{t('confirm_yes')}</Text>\n <Text> / </Text>\n <Text color={COLORS.error}>{t('confirm_no')}</Text>\n </Box>\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { Spinner } from '@inkjs/ui';\nimport { COLORS } from '../../utils/colors.js';\nimport { t } from '../../i18n/index.js';\nimport { SPACING } from '../../utils/spacing.js';\n\ninterface ProgressLogProps {\n lines: string[];\n isRunning: boolean;\n title?: string;\n maxVisible?: number;\n}\n\nexport function ProgressLog({ lines, isRunning, title, maxVisible = 15 }: ProgressLogProps) {\n const start = Math.max(0, lines.length - maxVisible);\n const visible = lines.slice(start);\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={COLORS.sky} paddingX={SPACING.xs}>\n {title && (\n <Box marginBottom={SPACING.xs}>\n {isRunning && <Spinner label=\"\" />}\n <Text bold color={COLORS.sky}> {title}</Text>\n </Box>\n )}\n {visible.map((line, i) => (\n // UI-006: keys are absolute indices, so a line that scrolls off-screen\n // does not change the key of remaining lines. Stable identity prevents\n // React from treating the whole list as new on every append.\n <Text key={`log-${start + i}`} color={COLORS.muted} wrap=\"wrap\">{line}</Text>\n ))}\n {lines.length === 0 && !isRunning && (\n <Text color={COLORS.textSecondary} italic>{t('progress_noOutput')}</Text>\n )}\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { COLORS } from '../../utils/colors.js';\nimport { SPACING } from '../../utils/spacing.js';\n\ninterface ResultBannerProps {\n status: 'success' | 'error' | 'warning' | 'info';\n message: string;\n}\n\nconst STATUS_COLORS: Record<string, string> = {\n success: COLORS.success,\n error: COLORS.error,\n warning: COLORS.warning,\n info: COLORS.info,\n};\n\nexport function ResultBanner({ status, message }: ResultBannerProps) {\n return (\n <Box borderStyle=\"round\" borderColor={STATUS_COLORS[status]} paddingX={SPACING.sm} paddingY={SPACING.none}>\n <Text color={STATUS_COLORS[status]} bold>{message}</Text>\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { COLORS } from '../../utils/colors.js';\n\ninterface SelectableRowProps {\n isCurrent: boolean;\n children: React.ReactNode;\n gap?: number;\n}\n\nexport function SelectableRow({ isCurrent, children, gap = 1 }: SelectableRowProps) {\n return (\n <Box gap={gap}>\n <Text color={isCurrent ? COLORS.success : COLORS.muted}>\n {isCurrent ? '\\u25B6' : ' '}\n </Text>\n {children}\n </Box>\n );\n}\n","import React, { useState, useCallback, useEffect, useRef } from 'react';\nimport { Box, Text } from 'ink';\nimport { useViewInput } from '../hooks/use-view-input.js';\nimport { TextInput } from '@inkjs/ui';\nimport { useBrewStore } from '../stores/brew-store.js';\nimport { useBrewStream } from '../hooks/use-brew-stream.js';\nimport { Loading } from '../components/common/loading.js';\nimport { ProgressLog } from '../components/common/progress-log.js';\nimport { ConfirmDialog } from '../components/common/confirm-dialog.js';\nimport { ResultBanner } from '../components/common/result-banner.js';\nimport { COLORS } from '../utils/colors.js';\nimport { SelectableRow } from '../components/common/selectable-row.js';\nimport { StatusBadge } from '../components/common/status-badge.js';\nimport { t } from '../i18n/index.js';\nimport { useModalStore } from '../stores/modal-store.js';\nimport { useNavigationStore } from '../stores/navigation-store.js';\nimport * as api from '../lib/brew-api.js';\nimport { SPACING } from '../utils/spacing.js';\nimport { useVisibleRows } from '../hooks/use-visible-rows.js';\n\ntype SearchResult = {\n name: string;\n type: 'formula' | 'cask';\n};\n\nexport function SearchView() {\n const [query, setQuery] = useState('');\n const [results, setResults] = useState<{ formulae: string[]; casks: string[] } | null>(null);\n const [searching, setSearching] = useState(false);\n const [searchError, setSearchError] = useState<string | null>(null);\n const [cursor, setCursor] = useState(0);\n const [confirmInstall, setConfirmInstall] = useState<string | null>(null);\n const stream = useBrewStream();\n const { openModal, closeModal } = useModalStore();\n const navigate = useNavigationStore((s) => s.navigate);\n const selectPackage = useNavigationStore((s) => s.selectPackage);\n const fetchInstalled = useBrewStore((s) => s.fetchInstalled);\n const hasRefreshed = useRef(false);\n const resultRows = useVisibleRows({\n reservedRows: searchError ? 8 : 6,\n fallbackReservedRows: searchError ? 18 : 16,\n minRows: 1,\n });\n const streamRows = useVisibleRows({\n reservedRows: 5,\n fallbackReservedRows: 14,\n minRows: 1,\n });\n\n // Suppress global Escape while results are showing so Escape clears results\n // rather than navigating away from this view.\n useEffect(() => {\n if (results !== null) {\n openModal();\n return () => { closeModal(); };\n }\n return undefined;\n }, [results]);\n\n const doSearch = useCallback(async (term: string) => {\n if (term.length < 2) {\n setResults(null);\n setSearchError(t('search_minChars'));\n return;\n }\n setSearching(true);\n setSearchError(null);\n try {\n const r = await api.search(term);\n setResults(r);\n setCursor(0);\n } catch (err) {\n setResults({ formulae: [], casks: [] });\n setSearchError(err instanceof Error ? err.message : t('search_failed'));\n } finally {\n setSearching(false);\n }\n }, []);\n\n useEffect(() => {\n if (!stream.isRunning && !stream.error && stream.lines.length > 0 && !hasRefreshed.current) {\n hasRefreshed.current = true;\n void fetchInstalled();\n }\n }, [stream.isRunning, stream.error]);\n\n const allResults: SearchResult[] = results\n ? [\n ...results.formulae.map((name) => ({ name, type: 'formula' as const })),\n ...results.casks.map((name) => ({ name, type: 'cask' as const })),\n ]\n : [];\n const start = Math.min(\n Math.max(0, cursor - Math.floor(resultRows / 2)),\n Math.max(0, allResults.length - resultRows),\n );\n const visibleResults = allResults.slice(start, start + resultRows);\n\n useEffect(() => {\n setCursor((current) => Math.min(current, Math.max(0, allResults.length - 1)));\n }, [allResults.length]);\n\n useViewInput((input, key) => {\n if (stream.isRunning) {\n if (key.escape) stream.cancel();\n return;\n }\n if (stream.lines.length > 0) {\n if (key.escape) {\n stream.clear();\n }\n return;\n }\n if (confirmInstall) return;\n\n if (key.return && !results) {\n void doSearch(query);\n return;\n }\n\n // Enter → navigate to package-info view (preview details, deps, caveats)\n if (key.return && allResults[cursor]) {\n const result = allResults[cursor];\n selectPackage(result.name, result.type);\n navigate('package-info');\n return;\n }\n\n // 'i' or '1' → install directly (with confirmation)\n if ((input === 'i' || input === '1') && allResults[cursor]) {\n setConfirmInstall(allResults[cursor].name);\n return;\n }\n\n if (input === 'j' || key.downArrow) {\n setCursor((c) => Math.min(c + 1, Math.max(0, allResults.length - 1)));\n } else if (input === 'k' || key.upArrow) {\n setCursor((c) => Math.max(c - 1, 0));\n } else if (key.escape) {\n setResults(null);\n setQuery('');\n }\n });\n\n if (stream.isRunning || stream.lines.length > 0) {\n return (\n <Box flexDirection=\"column\">\n <ProgressLog\n lines={stream.lines}\n isRunning={stream.isRunning}\n title={t('search_installing')}\n maxVisible={streamRows}\n />\n {stream.isRunning && (\n <Text color={COLORS.textSecondary}>esc:{t('hint_cancel')}</Text>\n )}\n {!stream.isRunning && (\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n <ResultBanner\n status={stream.error ? 'error' : 'success'}\n message={stream.error ? `\\u2718 ${stream.error}` : `\\u2714 ${t('search_installComplete')}`}\n />\n <Text color={COLORS.textSecondary}>esc:{t('hint_clear')}</Text>\n </Box>\n )}\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={SPACING.xs}>\n <Text color={COLORS.gold}>{'\\u{1F50D}'} </Text>\n {!results ? (\n <TextInput\n placeholder={t('search_placeholder')}\n defaultValue={query}\n onChange={setQuery}\n onSubmit={() => void doSearch(query)}\n />\n ) : (\n <Text>{t('search_resultsFor')} \"<Text bold color={COLORS.text}>{query}</Text>\" <Text color={COLORS.textSecondary}>{t('search_escToClear')}</Text></Text>\n )}\n </Box>\n\n {searching && <Loading message={t('loading_searching')} />}\n\n {searchError && (\n <Box marginBottom={SPACING.xs}>\n <Text color={COLORS.error}>{searchError}</Text>\n </Box>\n )}\n\n {confirmInstall && (\n <ConfirmDialog\n message={t('search_confirmInstall', { name: confirmInstall })}\n onConfirm={() => {\n const name = confirmInstall;\n hasRefreshed.current = false;\n setConfirmInstall(null);\n void stream.run(['install', name]);\n }}\n onCancel={() => setConfirmInstall(null)}\n />\n )}\n\n {results && !searching && !confirmInstall && (\n <Box flexDirection=\"column\">\n {allResults.length > 0 && (\n <Text color={COLORS.textSecondary}>\n {t('search_formulaeHeader', { count: results.formulae.length })} {t('search_casksHeader', { count: results.casks.length })}\n </Text>\n )}\n\n {allResults.length > 0 && (\n <Box flexDirection=\"column\">\n {start > 0 && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreAbove', { count: start })}</Text>\n )}\n {visibleResults.map((result, i) => {\n const idx = start + i;\n const isCurrent = idx === cursor;\n return (\n <SelectableRow key={`${result.type}:${result.name}`} isCurrent={isCurrent}>\n <Box flexGrow={1} flexShrink={1} minWidth={0}>\n <Text bold={isCurrent} inverse={isCurrent} wrap=\"truncate-middle\">{result.name}</Text>\n </Box>\n <StatusBadge\n label={result.type === 'formula' ? 'Formula' : 'Cask'}\n variant={result.type === 'formula' ? 'info' : 'muted'}\n />\n </SelectableRow>\n );\n })}\n {start + resultRows < allResults.length && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreBelow', { count: allResults.length - start - resultRows })}</Text>\n )}\n </Box>\n )}\n\n {allResults.length === 0 && (\n <Box borderStyle=\"round\" borderColor={COLORS.textSecondary} paddingX={SPACING.sm}>\n <Text color={COLORS.textSecondary} italic>{t('search_noResults')}</Text>\n </Box>\n )}\n\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.text} bold>\n {allResults.length > 0 ? `${cursor + 1}/${allResults.length}` : ''}\n </Text>\n </Box>\n </Box>\n )}\n </Box>\n );\n}\n","import React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { Box, Text } from 'ink';\nimport { useViewInput } from '../hooks/use-view-input.js';\nimport { useBrewStore } from '../stores/brew-store.js';\nimport { useBrewStream } from '../hooks/use-brew-stream.js';\nimport { pinPackage, unpinPackage, getUpgradeImpact } from '../lib/brew-api.js';\nimport { Loading, ErrorMessage } from '../components/common/loading.js';\nimport { StatusBadge } from '../components/common/status-badge.js';\nimport { ProgressLog } from '../components/common/progress-log.js';\nimport { ConfirmDialog } from '../components/common/confirm-dialog.js';\nimport { ResultBanner } from '../components/common/result-banner.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { VersionArrow } from '../components/common/version-arrow.js';\nimport { SelectableRow } from '../components/common/selectable-row.js';\nimport { COLORS } from '../utils/colors.js';\nimport { GRADIENTS } from '../utils/gradient.js';\nimport { t } from '../i18n/index.js';\nimport { useDebounce } from '../hooks/use-debounce.js';\nimport type { UpgradeImpact } from '../lib/impact/types.js';\nimport { SPACING } from '../utils/spacing.js';\nimport { writeLastAction } from '../lib/data-dir.js';\nimport { logger } from '../utils/logger.js';\nimport { useVisibleRows } from '../hooks/use-visible-rows.js';\n\nfunction ImpactPanel({ impact }: { impact: UpgradeImpact }) {\n const riskColor =\n impact.risk === 'high' ? COLORS.error\n : impact.risk === 'medium' ? COLORS.warning\n : COLORS.success;\n\n const riskLabel =\n impact.risk === 'high' ? t('impact_high')\n : impact.risk === 'medium' ? t('impact_medium')\n : t('impact_low');\n\n const riskIcon =\n impact.risk === 'high' ? '\\u26A0'\n : impact.risk === 'medium' ? '~'\n : '\\u2713';\n\n return (\n <Box flexDirection=\"column\" marginTop={SPACING.xs} borderStyle=\"round\" borderColor={riskColor} paddingX={SPACING.sm} paddingY={SPACING.none}>\n <Box>\n <Text bold color={riskColor}>{riskIcon} {riskLabel}</Text>\n {impact.reverseDeps.length > 0 && (\n <Text color={COLORS.textSecondary}> \\u2014 {t('impact_affects', { count: impact.reverseDeps.length })}</Text>\n )}\n </Box>\n {impact.riskReasons.length > 0 && (\n <Text color={COLORS.textSecondary}>{impact.riskReasons.join(' \\u00B7 ')}</Text>\n )}\n {impact.reverseDeps.length > 0 && impact.reverseDeps.length <= 5 && (\n <Text color={COLORS.muted} dimColor>\n {t('impact_usedBy', { packages: impact.reverseDeps.join(', ') })}\n </Text>\n )}\n {impact.risk === 'high' && (\n <Text color={COLORS.info}>{t('impact_brewfile_hint')}</Text>\n )}\n </Box>\n );\n}\n\nexport function OutdatedView() {\n const { outdated, loading, errors, fetchOutdated } = useBrewStore();\n const stream = useBrewStream();\n const [cursor, setCursor] = useState(0);\n const [confirmAction, setConfirmAction] = useState<\n | { type: 'single'; name: string }\n | { type: 'all' }\n | null\n >(null);\n const hasRefreshed = useRef(false);\n // Names submitted to `brew upgrade` so that, once the stream finishes and the\n // outdated list is refreshed, we can write the BrewBar handoff with what was\n // actually upgraded plus the remaining outdated count.\n const pendingUpgradeRef = useRef<string[] | null>(null);\n const [impact, setImpact] = useState<UpgradeImpact | null>(null);\n const [impactLoading, setImpactLoading] = useState(false);\n const listRows = useVisibleRows({\n reservedRows: impact || impactLoading ? 11 : 7,\n fallbackReservedRows: impact || impactLoading ? 18 : 14,\n minRows: 1,\n });\n const streamRows = useVisibleRows({\n reservedRows: 5,\n fallbackReservedRows: 14,\n minRows: 1,\n });\n\n useEffect(() => { fetchOutdated(); }, []);\n\n useEffect(() => {\n if (!stream.isRunning && !stream.error && stream.lines.length > 0 && !hasRefreshed.current) {\n hasRefreshed.current = true;\n void fetchOutdated().then(() => {\n const pkgs = pendingUpgradeRef.current;\n if (!pkgs) return;\n pendingUpgradeRef.current = null;\n const state = useBrewStore.getState().outdated;\n const remaining = state.formulae.length + state.casks.length;\n void writeLastAction({\n timestamp: new Date().toISOString(),\n action: 'upgrade',\n packages: pkgs,\n remainingOutdated: remaining,\n source: 'brew-tui',\n }).catch((err) => logger.warn('Failed to write last-action.json', err));\n });\n }\n }, [stream.isRunning, stream.error]);\n\n // Enrich packages with type so formula/cask distinction is available.\n // useMemo: this list is read on every render to compute cursor bounds and\n // the visible window; the underlying outdated arrays only change on refetch.\n const allOutdated = useMemo(\n () => [\n ...outdated.formulae.map((p) => ({ ...p, type: 'formula' as const })),\n ...outdated.casks.map((p) => ({ ...p, type: 'cask' as const })),\n ],\n [outdated.formulae, outdated.casks],\n );\n\n const debouncedCursor = useDebounce(cursor, 150);\n\n useEffect(() => {\n const pkg = allOutdated[debouncedCursor];\n if (!pkg || stream.isRunning) {\n setImpact(null);\n return;\n }\n // SCR-12-O1: each cursor move should invalidate the previous in-flight\n // analysis so a slower one cannot land after a faster newer one and\n // overwrite the panel with stale data.\n let cancelled = false;\n setImpactLoading(true);\n void getUpgradeImpact(\n pkg.name,\n pkg.installed_versions[0] ?? '',\n pkg.current_version,\n pkg.type,\n )\n .then((result) => { if (!cancelled) setImpact(result); })\n .catch(() => { if (!cancelled) setImpact(null); })\n .finally(() => { if (!cancelled) setImpactLoading(false); });\n return () => { cancelled = true; };\n }, [debouncedCursor, stream.isRunning]);\n\n useViewInput((input, key) => {\n if (stream.isRunning) {\n if (key.escape) stream.cancel();\n return;\n }\n if (stream.lines.length > 0) {\n if (key.escape) {\n stream.clear();\n return;\n }\n if (input === 'r' || input === '3') {\n stream.clear();\n void fetchOutdated();\n }\n return;\n }\n if (confirmAction) return;\n\n if (input === 'j' || key.downArrow) {\n setCursor((c) => Math.min(c + 1, Math.max(0, allOutdated.length - 1)));\n } else if (input === 'k' || key.upArrow) {\n setCursor((c) => Math.max(c - 1, 0));\n } else if (key.return && allOutdated[cursor]) {\n setConfirmAction({ type: 'single', name: allOutdated[cursor].name });\n } else if ((input === 'A' || input === '1') && allOutdated.length > 0) {\n setConfirmAction({ type: 'all' });\n } else if ((input === 'p' || input === '2') && allOutdated[cursor]) {\n // ARQ-008: Use brew-api functions instead of direct execBrew\n const pkg = allOutdated[cursor];\n void (pkg.pinned ? unpinPackage(pkg.name) : pinPackage(pkg.name)).then(() => void fetchOutdated());\n return;\n } else if (input === 'r' || input === '3') {\n void fetchOutdated();\n }\n });\n\n const MAX_VISIBLE_ROWS = listRows;\n const start = Math.max(0, cursor - Math.floor(MAX_VISIBLE_ROWS / 2));\n const visible = allOutdated.slice(start, start + MAX_VISIBLE_ROWS);\n\n if (loading.outdated) return <Loading message={t('loading_outdated')} />;\n if (errors.outdated) return <ErrorMessage message={errors.outdated} />;\n\n if (stream.isRunning || stream.lines.length > 0) {\n return (\n <Box flexDirection=\"column\">\n <ProgressLog\n lines={stream.lines}\n isRunning={stream.isRunning}\n title={t('outdated_upgrading')}\n maxVisible={streamRows}\n />\n {stream.isRunning && (\n <Text color={COLORS.textSecondary}>esc:{t('hint_cancel')}</Text>\n )}\n {!stream.isRunning && (\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n <Box borderStyle=\"round\" borderColor={stream.error ? COLORS.error : COLORS.success} paddingX={SPACING.sm} paddingY={SPACING.none}>\n <Text color={stream.error ? COLORS.error : COLORS.success} bold>\n {stream.error ? `\\u2718 ${stream.error}` : `\\u2714 ${t('outdated_upgradeComplete')}`}\n </Text>\n <Text color={COLORS.muted}> {t('outdated_pressRefresh')}</Text>\n </Box>\n <Text color={COLORS.textSecondary}>r:{t('hint_refresh')} esc:{t('hint_clear')}</Text>\n </Box>\n )}\n </Box>\n );\n }\n\n // SCR-012: Build package list for upgrade-all confirmation\n const upgradeAllMessage = confirmAction?.type === 'all'\n ? `${t('outdated_confirmAll', { count: allOutdated.length })}\\n${t('outdated_upgradeAllList', { list: allOutdated.map(p => p.name).join(', ') })}`\n : '';\n\n return (\n <Box flexDirection=\"column\">\n <SectionHeader emoji={'\\u{1F4E6}'} title={t('outdated_title', { count: allOutdated.length })} gradient={GRADIENTS.fire} />\n\n {confirmAction && (\n <Box marginY={SPACING.xs}>\n <ConfirmDialog\n message={\n confirmAction.type === 'all'\n ? upgradeAllMessage\n : t('outdated_confirmSingle', { name: confirmAction.type === 'single' ? confirmAction.name : '' })\n }\n onConfirm={() => {\n hasRefreshed.current = false;\n if (confirmAction.type === 'all') {\n pendingUpgradeRef.current = allOutdated.map((p) => p.name);\n void stream.run(['upgrade']);\n } else if (confirmAction.name) {\n pendingUpgradeRef.current = [confirmAction.name];\n void stream.run(['upgrade', confirmAction.name]);\n }\n setConfirmAction(null);\n }}\n onCancel={() => setConfirmAction(null)}\n />\n </Box>\n )}\n\n {allOutdated.length === 0 && !confirmAction && (\n <Box marginTop={SPACING.xs}>\n <ResultBanner status=\"success\" message={`\\u2714 ${t('outdated_upToDate')}`} />\n </Box>\n )}\n\n {allOutdated.length > 0 && !confirmAction && (\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n {start > 0 && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreAbove', { count: start })}</Text>\n )}\n {visible.map((pkg, i) => {\n const idx = start + i;\n const isCurrent = idx === cursor;\n return (\n <SelectableRow key={pkg.name} isCurrent={isCurrent}>\n {/* Name takes the remaining row width and truncates in the\n middle to preserve @suffix tags. flexGrow=1 lets it eat\n leftover space; flexShrink=1 + minWidth=0 lets it shrink\n below its content (CSS `min-width: 0`). */}\n <Box flexGrow={1} flexShrink={1} minWidth={0}>\n <Text\n bold={isCurrent}\n inverse={isCurrent}\n color={isCurrent ? COLORS.text : COLORS.muted}\n wrap=\"truncate-middle\"\n >\n {pkg.name}\n </Text>\n </Box>\n <VersionArrow current={pkg.installed_versions[0] ?? ''} latest={pkg.current_version} />\n {pkg.pinned && <StatusBadge label={t('outdated_pinned')} variant=\"info\" />}\n </SelectableRow>\n );\n })}\n {start + MAX_VISIBLE_ROWS < allOutdated.length && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreBelow', { count: allOutdated.length - start - MAX_VISIBLE_ROWS })}</Text>\n )}\n\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.text} bold>\n {cursor + 1}/{allOutdated.length}\n </Text>\n </Box>\n\n {impact && !stream.isRunning && !confirmAction && (\n <ImpactPanel impact={impact} />\n )}\n {impactLoading && !stream.isRunning && !confirmAction && (\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.textSecondary}>{t('impact_analyzing')}</Text>\n </Box>\n )}\n\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.textSecondary}>{t('impact_hint')}</Text>\n </Box>\n </Box>\n )}\n </Box>\n );\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport { Box, Text } from 'ink';\nimport { useViewInput } from '../hooks/use-view-input.js';\nimport { useNavigationStore } from '../stores/navigation-store.js';\nimport { useBrewStream } from '../hooks/use-brew-stream.js';\nimport { Loading, ErrorMessage } from '../components/common/loading.js';\nimport { StatusBadge } from '../components/common/status-badge.js';\nimport { ProgressLog } from '../components/common/progress-log.js';\nimport { ConfirmDialog } from '../components/common/confirm-dialog.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { GradientText, GRADIENTS } from '../utils/gradient.js';\nimport { COLORS } from '../utils/colors.js';\nimport { formatRelativeTime } from '../utils/format.js';\nimport { t } from '../i18n/index.js';\nimport type { TranslationKey } from '../i18n/en.js';\nimport * as api from '../lib/brew-api.js';\nimport type { Formula } from '../lib/types.js';\nimport { SPACING } from '../utils/spacing.js';\nimport { writeLastAction } from '../lib/data-dir.js';\nimport { useBrewStore } from '../stores/brew-store.js';\nimport { logger } from '../utils/logger.js';\n\nconst ACTION_PROGRESS_KEYS: Record<string, TranslationKey> = {\n install: 'pkgInfo_installing',\n uninstall: 'pkgInfo_uninstalling',\n upgrade: 'pkgInfo_upgrading',\n};\n\nconst ACTION_CONFIRM_KEYS: Record<string, TranslationKey> = {\n install: 'pkgInfo_confirmInstall',\n uninstall: 'pkgInfo_confirmUninstall',\n upgrade: 'pkgInfo_confirmUpgrade',\n};\n\nexport function PackageInfoView() {\n const packageName = useNavigationStore((s) => s.selectedPackage);\n const packageType = useNavigationStore((s) => s.selectedPackageType);\n const [formula, setFormula] = useState<Formula | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [confirmAction, setConfirmAction] = useState<string | null>(null);\n const activeActionRef = useRef<string>('install');\n const mountedRef = useRef(true);\n const hasRefreshed = useRef(false);\n const stream = useBrewStream();\n\n useEffect(() => {\n mountedRef.current = true;\n return () => { mountedRef.current = false; };\n }, []);\n\n useEffect(() => {\n if (!packageName) return;\n setLoading(true);\n\n // SCR-008: Try cask-specific info if we know it's a cask\n const fetchInfo = async () => {\n if (packageType === 'cask') {\n // Try cask first, fall back to formula\n const caskInfo = await api.getCaskInfo(packageName);\n if (caskInfo && mountedRef.current) {\n setFormula(api.formulaeFromCask(caskInfo));\n setLoading(false);\n return;\n }\n }\n // Default: try formula info\n const f = await api.getFormulaInfo(packageName);\n if (mountedRef.current) { setFormula(f); setLoading(false); }\n };\n\n fetchInfo().catch((err) => {\n if (mountedRef.current) { setError(err.message); setLoading(false); }\n });\n }, [packageName, packageType]);\n\n useEffect(() => {\n if (!stream.isRunning && !stream.error && stream.lines.length > 0 && !hasRefreshed.current && packageName) {\n hasRefreshed.current = true;\n const refreshFn = packageType === 'cask'\n ? api.getCaskInfo(packageName).then((c) => c ? { ...c, installed: c.installed ? [{ version: c.installed }] : [] } as unknown as import('../lib/types.js').Formula : null)\n : api.getFormulaInfo(packageName);\n refreshFn\n .then((f) => { if (mountedRef.current) { setFormula(f); } })\n .catch(() => { /* ignore refresh errors */ });\n\n // BrewBar handoff for upgrade/install/uninstall actions started here.\n // Refetch the outdated list so remainingOutdated is accurate, then write.\n const action = activeActionRef.current;\n if (action === 'upgrade' || action === 'install' || action === 'uninstall') {\n void useBrewStore.getState().fetchOutdated().then(() => {\n const out = useBrewStore.getState().outdated;\n const remaining = out.formulae.length + out.casks.length;\n void writeLastAction({\n timestamp: new Date().toISOString(),\n action,\n packages: [packageName],\n remainingOutdated: remaining,\n source: 'brew-tui',\n }).catch((err) => logger.warn('Failed to write last-action.json', err));\n });\n }\n }\n }, [stream.isRunning, stream.error]);\n\n useViewInput((input, key) => {\n if (stream.isRunning) {\n if (key.escape) stream.cancel();\n return;\n }\n if (confirmAction) return;\n\n if (!formula) return;\n\n const isInstalled = formula.installed.length > 0;\n if ((input === 'i' || input === '1') && !isInstalled) {\n setConfirmAction('install');\n } else if ((input === 'u' || input === '2') && isInstalled) {\n setConfirmAction('uninstall');\n } else if ((input === 'U' || input === '3') && isInstalled && formula.outdated) {\n setConfirmAction('upgrade');\n }\n });\n\n if (!packageName) {\n return <Text color={COLORS.textSecondary} italic>{t('pkgInfo_noPackage')}</Text>;\n }\n\n if (loading) return <Loading message={t('loading_package', { name: packageName })} />;\n if (error) return <ErrorMessage message={error} />;\n if (!formula) return <ErrorMessage message={t('pkgInfo_notFound')} />;\n\n if (stream.isRunning || stream.lines.length > 0) {\n return (\n <Box flexDirection=\"column\">\n <ProgressLog lines={stream.lines} isRunning={stream.isRunning} title={t(ACTION_PROGRESS_KEYS[activeActionRef.current] ?? ACTION_PROGRESS_KEYS['install']!, { name: formula.name })} />\n {stream.isRunning && (\n <Text color={COLORS.textSecondary}>esc:{t('hint_cancel')}</Text>\n )}\n {!stream.isRunning && (\n <>\n <Text color={stream.error ? COLORS.error : COLORS.success} bold>\n {stream.error ? `\\u2718 ${stream.error}` : `\\u2714 ${t('pkgInfo_done')}`}\n </Text>\n <Text color={COLORS.textSecondary}>esc:{t('hint_back')}</Text>\n </>\n )}\n </Box>\n );\n }\n\n const installed = formula.installed[0];\n const isInstalled = formula.installed.length > 0;\n\n return (\n <Box flexDirection=\"column\">\n {confirmAction && (\n <ConfirmDialog\n message={t(ACTION_CONFIRM_KEYS[confirmAction], { name: formula.name })}\n onConfirm={() => {\n const action = confirmAction;\n activeActionRef.current = action ?? 'install';\n hasRefreshed.current = false;\n setConfirmAction(null);\n if (action === 'install') void stream.run(['install', formula.name]);\n else if (action === 'uninstall') void stream.run(['uninstall', formula.name]);\n else if (action === 'upgrade') void stream.run(['upgrade', formula.name]);\n }}\n onCancel={() => setConfirmAction(null)}\n />\n )}\n\n <Box gap={SPACING.sm} marginBottom={SPACING.xs}>\n <GradientText colors={GRADIENTS.gold} bold>{formula.name}</GradientText>\n <Text color={COLORS.teal}>{installed?.version ?? formula.versions.stable}</Text>\n {isInstalled && <StatusBadge label={t('badge_installed')} variant=\"success\" />}\n {formula.outdated && <StatusBadge label={t('badge_outdated')} variant=\"warning\" />}\n {formula.pinned && <StatusBadge label={t('badge_pinned')} variant=\"info\" />}\n {formula.keg_only && <StatusBadge label={t('badge_kegOnly')} variant=\"muted\" />}\n {formula.deprecated && <StatusBadge label={t('badge_deprecated')} variant=\"error\" />}\n </Box>\n\n <Box flexDirection=\"column\" gap={SPACING.xs}>\n <Text>{formula.desc}</Text>\n\n <Box flexDirection=\"column\">\n <SectionHeader emoji={'\\u{1F4CB}'} title={t('pkgInfo_details')} gradient={[COLORS.text, COLORS.muted]} />\n <Box borderStyle=\"round\" borderColor={COLORS.border} paddingX={SPACING.sm} flexDirection=\"column\">\n <Text><Text color={COLORS.muted}>{t('pkgInfo_homepage')}</Text> {formula.homepage}</Text>\n <Text><Text color={COLORS.muted}>{t('pkgInfo_license')}</Text> {formula.license}</Text>\n <Text><Text color={COLORS.muted}>{t('pkgInfo_tap')}</Text> {formula.tap}</Text>\n <Text><Text color={COLORS.muted}>{t('pkgInfo_stable')}</Text> {formula.versions.stable}</Text>\n {installed && (\n <>\n <Text><Text color={COLORS.muted}>{t('pkgInfo_installed')}</Text> {installed.version} ({formatRelativeTime(installed.time)})</Text>\n <Text><Text color={COLORS.muted}>{t('pkgInfo_bottle')}</Text> {installed.poured_from_bottle ? t('common_yes') : t('common_no')}</Text>\n <Text><Text color={COLORS.muted}>{t('pkgInfo_onRequest')}</Text> {installed.installed_on_request ? t('common_yes') : t('pkgInfo_noDependency')}</Text>\n </>\n )}\n </Box>\n </Box>\n\n {formula.dependencies.length > 0 && (\n <Box flexDirection=\"column\">\n <SectionHeader emoji={'\\u{1F517}'} title={t('pkgInfo_dependencies', { count: formula.dependencies.length })} gradient={GRADIENTS.ocean} />\n <Box paddingLeft={SPACING.sm} flexWrap=\"wrap\" columnGap={2}>\n {/* Cap deps shown to avoid blowing the viewport; rest summarised. */}\n {formula.dependencies.slice(0, 30).map((dep) => (\n <Text key={dep} color={COLORS.muted}>{dep}</Text>\n ))}\n {formula.dependencies.length > 30 && (\n <Text color={COLORS.textSecondary} italic>{t('common_andMore', { count: formula.dependencies.length - 30 })}</Text>\n )}\n </Box>\n </Box>\n )}\n\n {formula.caveats && (\n <Box flexDirection=\"column\">\n <SectionHeader emoji={'\\u26A0\\uFE0F'} title={t('pkgInfo_caveats')} color={COLORS.warning} />\n <Box borderStyle=\"round\" borderColor={COLORS.warning} paddingX={SPACING.sm}>\n <Text color={COLORS.warning} wrap=\"wrap\">{formula.caveats}</Text>\n </Box>\n </Box>\n )}\n </Box>\n\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.textSecondary}>\n {isInstalled ? `u:${t('hint_uninstall')}` : `i:${t('hint_install')}`}\n {isInstalled && formula.outdated ? ` U:${t('hint_upgrade')}` : ''}\n {` esc:${t('hint_back')}`}\n </Text>\n </Box>\n </Box>\n );\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport { Box, Text, type DOMElement } from 'ink';\nimport { useViewInput } from '../hooks/use-view-input.js';\nimport { useContainerSize } from '../hooks/use-container-size.js';\nimport { useBrewStore } from '../stores/brew-store.js';\nimport { Loading, ErrorMessage } from '../components/common/loading.js';\nimport { StatusBadge } from '../components/common/status-badge.js';\nimport { SelectableRow } from '../components/common/selectable-row.js';\nimport { ConfirmDialog } from '../components/common/confirm-dialog.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { COLORS } from '../utils/colors.js';\nimport { GRADIENTS } from '../utils/gradient.js';\nimport { t } from '../i18n/index.js';\nimport { SPACING, getLayoutMode } from '../utils/spacing.js';\nimport { useVisibleRows } from '../hooks/use-visible-rows.js';\n\nconst STATUS_VARIANTS = {\n started: 'success',\n stopped: 'muted',\n error: 'error',\n none: 'muted',\n} as const;\n\n// UI-007: brew services that need root surface as EACCES / \"Operation not\n// permitted\" / \"sudo required\" — translate that into actionable feedback.\nfunction humaniseServiceError(message: string): string {\n if (/EACCES|operation not permitted|permission denied|sudo/i.test(message)) {\n return t('services_errorPermission');\n }\n return message;\n}\n\nexport function ServicesView() {\n const { services, loading, errors, fetchServices, serviceAction } = useBrewStore();\n const [cursor, setCursor] = useState(0);\n const [actionInProgress, setActionInProgress] = useState(false);\n const [confirmAction, setConfirmAction] = useState<{ type: 'stop' | 'restart'; name: string } | null>(null);\n // SCR-014: Persist last error until explicitly cleared\n const [lastError, setLastError] = useState<string | null>(null);\n const containerRef = useRef<DOMElement>(null);\n const { width: containerWidth } = useContainerSize(containerRef);\n const cols = containerWidth > 0 ? containerWidth : 80;\n const mode = getLayoutMode(cols);\n // Widths are passed to <Box width=...>; Yoga handles truncation via\n // <Text wrap=\"truncate\">. No padEnd string-building (the old approach\n // misaligned header vs row by -2). minWidth=0 + flexShrink=1 enable\n // shrink-below-content (the CSS `min-width: 0` pattern).\n const svcNameWidth = mode === 'single'\n ? Math.max(8, cols - 2 /* cursor + gap */)\n : Math.max(12, Math.floor(cols * 0.35));\n const svcStatusWidth = Math.max(8, Math.floor(cols * 0.15));\n const MAX_VISIBLE_ROWS = useVisibleRows({\n reservedRows: lastError || actionInProgress ? 8 : 6,\n fallbackReservedRows: lastError || actionInProgress ? 16 : 14,\n minRows: 1,\n });\n\n useEffect(() => { fetchServices(); }, []);\n\n useViewInput((input, key) => {\n if (actionInProgress) return;\n if (confirmAction) return;\n\n // Clear last error on any key press\n if (lastError) { setLastError(null); }\n\n if (input === 'j' || key.downArrow) {\n setCursor((c) => Math.min(c + 1, Math.max(0, services.length - 1)));\n } else if (input === 'k' || key.upArrow) {\n setCursor((c) => Math.max(c - 1, 0));\n } else if (input === 'r' || input === '4') {\n void fetchServices();\n }\n\n const svc = services[cursor];\n if (!svc) return;\n\n const doAction = (action: 'start' | 'stop' | 'restart') => {\n setActionInProgress(true);\n void serviceAction(svc.name, action)\n .catch((err) => {\n setLastError(humaniseServiceError(err instanceof Error ? err.message : String(err)));\n })\n .finally(() => {\n setActionInProgress(false);\n // SCR-014: Check store for errors after action\n const storeError = useBrewStore.getState().errors['service-action'];\n if (storeError) setLastError(humaniseServiceError(storeError));\n });\n };\n\n if (input === 's' || input === '1') doAction('start');\n else if (input === 'x' || input === '2') setConfirmAction({ type: 'stop', name: svc.name });\n else if (input === 'R' || input === '3') setConfirmAction({ type: 'restart', name: svc.name });\n });\n\n if (loading.services) return <Loading message={t('loading_services')} />;\n if (errors.services) return <ErrorMessage message={errors.services} />;\n\n if (services.length === 0) {\n return (\n <Box flexDirection=\"column\">\n <SectionHeader emoji={'\\u2699\\uFE0F'} title={t('services_title')} gradient={GRADIENTS.ocean} />\n <Text color={COLORS.textSecondary} italic>{t('services_noServices')}</Text>\n </Box>\n );\n }\n\n const start = Math.max(0, cursor - Math.floor(MAX_VISIBLE_ROWS / 2));\n const visible = services.slice(start, start + MAX_VISIBLE_ROWS);\n\n return (\n <Box flexDirection=\"column\" ref={containerRef}>\n <SectionHeader emoji={'\\u2699\\uFE0F'} title={t('services_titleCount', { count: services.length })} gradient={GRADIENTS.ocean} />\n\n {confirmAction && (\n <Box marginY={SPACING.xs}>\n <ConfirmDialog\n message={\n confirmAction.type === 'stop'\n ? t('services_confirmStop', { name: confirmAction.name })\n : t('services_confirmRestart', { name: confirmAction.name })\n }\n onConfirm={() => {\n const { type, name } = confirmAction;\n setConfirmAction(null);\n setActionInProgress(true);\n void serviceAction(name, type)\n .catch((err) => {\n setLastError(err instanceof Error ? err.message : String(err));\n })\n .finally(() => {\n setActionInProgress(false);\n const storeError = useBrewStore.getState().errors['service-action'];\n if (storeError) setLastError(storeError);\n });\n }}\n onCancel={() => setConfirmAction(null)}\n />\n </Box>\n )}\n\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n <Box gap={SPACING.xs} borderStyle=\"single\" borderBottom borderTop={false} borderLeft={false} borderRight={false} borderColor={COLORS.border} paddingBottom={SPACING.none}>\n <Text bold color={COLORS.text}>{' '}</Text>\n <Box width={svcNameWidth} flexShrink={1} minWidth={0}>\n <Text bold color={COLORS.text} wrap=\"truncate\">{t('services_name')}</Text>\n </Box>\n {mode !== 'single' && (\n <Box width={svcStatusWidth} flexShrink={1} minWidth={0}>\n <Text bold color={COLORS.text} wrap=\"truncate\">{t('services_status')}</Text>\n </Box>\n )}\n {mode !== 'single' && mode !== 'compact' && (\n <Box flexGrow={1} flexShrink={1} minWidth={0}>\n <Text bold color={COLORS.text} wrap=\"truncate\">{t('services_user')}</Text>\n </Box>\n )}\n </Box>\n\n {start > 0 && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreAbove', { count: start })}</Text>\n )}\n\n {visible.map((svc, i) => {\n const idx = start + i;\n const isCurrent = idx === cursor;\n return (\n <SelectableRow key={svc.name} isCurrent={isCurrent}>\n <Box width={svcNameWidth} flexShrink={1} minWidth={0}>\n <Text\n bold={isCurrent}\n inverse={isCurrent}\n color={isCurrent ? COLORS.text : COLORS.muted}\n wrap=\"truncate-middle\"\n >\n {svc.name}\n </Text>\n </Box>\n {mode !== 'single' && (\n <Box width={svcStatusWidth} flexShrink={1} minWidth={0}>\n <StatusBadge label={svc.status} variant={STATUS_VARIANTS[svc.status]} />\n </Box>\n )}\n {mode !== 'single' && mode !== 'compact' && (\n <Box flexGrow={1} flexShrink={1} minWidth={0} gap={SPACING.xs}>\n <Text color={COLORS.muted} wrap=\"truncate\">{svc.user ?? '-'}</Text>\n {svc.exit_code != null && svc.exit_code !== 0 && (\n <Text color={COLORS.error}>{t('common_exit', { code: svc.exit_code })}</Text>\n )}\n </Box>\n )}\n </SelectableRow>\n );\n })}\n\n {start + MAX_VISIBLE_ROWS < services.length && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreBelow', { count: services.length - start - MAX_VISIBLE_ROWS })}</Text>\n )}\n </Box>\n\n {actionInProgress && <Text color={COLORS.sky}>{t('services_processing')}</Text>}\n\n {/* SCR-014: Persistent error display */}\n {lastError && (\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.error}>{lastError}</Text>\n </Box>\n )}\n\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.text} bold>\n {cursor + 1}/{services.length}\n </Text>\n </Box>\n </Box>\n );\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport { Box, Text } from 'ink';\nimport { useViewInput } from '../hooks/use-view-input.js';\nimport { useBrewStore } from '../stores/brew-store.js';\nimport { Loading, ErrorMessage } from '../components/common/loading.js';\nimport { ResultBanner } from '../components/common/result-banner.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { COLORS } from '../utils/colors.js';\nimport { GRADIENTS } from '../utils/gradient.js';\nimport { t, tp } from '../i18n/index.js';\nimport { SPACING } from '../utils/spacing.js';\nimport { useVisibleRows } from '../hooks/use-visible-rows.js';\n\nexport function DoctorView() {\n const { doctorWarnings, doctorClean, loading, errors, fetchDoctor } = useBrewStore();\n // Each warning renders as a bordered box of several lines. Treat each warning\n // as one logical row for paging; long multi-line warnings still wrap inside.\n const [cursor, setCursor] = useState(0);\n const visibleWarnings = useVisibleRows({\n reservedRows: 6,\n fallbackReservedRows: 14,\n minRows: 1,\n });\n\n // FE-006: Mounted ref for cleanup\n const mountedRef = useRef(true);\n useEffect(() => {\n mountedRef.current = true;\n return () => { mountedRef.current = false; };\n }, []);\n\n useEffect(() => { fetchDoctor(); }, []);\n\n useViewInput((input, key) => {\n if (input === 'r' || input === '1') { void fetchDoctor(); return; }\n if (input === 'j' || key.downArrow) setCursor((c) => Math.min(c + 1, Math.max(0, doctorWarnings.length - 1)));\n else if (input === 'k' || key.upArrow) setCursor((c) => Math.max(c - 1, 0));\n });\n\n if (loading.doctor) return <Loading message={t('loading_doctor')} />;\n if (errors.doctor) return <ErrorMessage message={errors.doctor} />;\n\n const start = Math.max(0, cursor - Math.floor(visibleWarnings / 2));\n const visible = doctorWarnings.slice(start, start + visibleWarnings);\n\n return (\n <Box flexDirection=\"column\">\n <SectionHeader emoji={'\\u{1FA7A}'} title={t('doctor_title')} gradient={GRADIENTS.emerald} />\n\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n {doctorClean && (\n <ResultBanner status=\"success\" message={`\\u2714 ${t('doctor_clean')}`} />\n )}\n\n {doctorClean === false && doctorWarnings.length === 0 && (\n <Text color={COLORS.warning}>{t('doctor_warningsNotCaptured')}</Text>\n )}\n\n {start > 0 && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreAbove', { count: start })}</Text>\n )}\n {visible.map((warning, i) => {\n const idx = start + i;\n return (\n <Box key={`warning-${idx}-${warning.slice(0, 20)}`} flexDirection=\"column\" marginBottom={SPACING.xs} borderStyle=\"single\" borderColor={idx === cursor ? COLORS.gold : COLORS.warning} paddingX={SPACING.xs}>\n {warning.split('\\n').map((line, j) => (\n <Text key={`warning-${idx}-${j}-${line.slice(0, 20)}`} color={j === 0 ? COLORS.warning : COLORS.muted} wrap=\"wrap\">{line}</Text>\n ))}\n </Box>\n );\n })}\n {start + visibleWarnings < doctorWarnings.length && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreBelow', { count: doctorWarnings.length - start - visibleWarnings })}</Text>\n )}\n </Box>\n\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.text} bold>\n {doctorWarnings.length > 0 ? tp('plural_warnings', doctorWarnings.length) : ''}\n </Text>\n </Box>\n </Box>\n );\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport { Box } from 'ink';\nimport { useViewInput } from '../hooks/use-view-input.js';\nimport { useProfileStore } from '../stores/profile-store.js';\nimport { useLicenseStore } from '../stores/license-store.js';\nimport { Loading } from '../components/common/loading.js';\nimport { ConfirmDialog } from '../components/common/confirm-dialog.js';\nimport { ProgressLog } from '../components/common/progress-log.js';\nimport { ResultBanner } from '../components/common/result-banner.js';\nimport { t } from '../i18n/index.js';\nimport { useModalStore } from '../stores/modal-store.js';\nimport * as manager from '../lib/profiles/profile-manager.js';\nimport { ProfileListMode } from './profiles/profile-list-mode.js';\nimport { ProfileDetailMode } from './profiles/profile-detail-mode.js';\nimport { ProfileCreateName, ProfileCreateDesc } from './profiles/profile-create-flow.js';\nimport { ProfileEditName, ProfileEditDesc } from './profiles/profile-edit-flow.js';\nimport { SPACING } from '../utils/spacing.js';\n\ntype Mode = 'list' | 'detail' | 'create-name' | 'create-desc' | 'confirm-import' | 'importing' | 'edit-name' | 'edit-desc';\n\nexport function ProfilesView() {\n const { profileNames, selectedProfile, loading, loadError, fetchProfiles, loadProfile, exportCurrent, deleteProfile, updateProfile } = useProfileStore();\n const [cursor, setCursor] = useState(0);\n const [mode, setMode] = useState<Mode>('list');\n const [newName, setNewName] = useState('');\n const [confirmDelete, setConfirmDelete] = useState(false);\n const [editName, setEditName] = useState('');\n const [editDesc, setEditDesc] = useState('');\n const [importLines, setImportLines] = useState<string[]>([]);\n const [importRunning, setImportRunning] = useState(false);\n const [importHadError, setImportHadError] = useState(false);\n const [importProfile, setImportProfile] = useState<Awaited<ReturnType<typeof manager.loadProfile>> | null>(null);\n const { openModal, closeModal } = useModalStore();\n const importGenRef = useRef<AsyncGenerator<string> | null>(null);\n const mountedRef = useRef(true);\n\n useEffect(() => { fetchProfiles(); }, []);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n importGenRef.current?.return(undefined);\n importGenRef.current = null;\n };\n }, []);\n\n useEffect(() => {\n if (mode !== 'list') {\n openModal();\n return () => { closeModal(); };\n }\n return undefined;\n }, [mode]);\n\n useViewInput((input, key) => {\n if (mode !== 'list' || confirmDelete) return;\n\n if (input === 'n' || input === '1') { setMode('create-name'); return; }\n if ((input === 'd' || input === '4') && profileNames[cursor]) { setConfirmDelete(true); return; }\n if (key.return && profileNames[cursor]) {\n void loadProfile(profileNames[cursor]);\n setMode('detail');\n return;\n }\n if ((input === 'i' || input === '3') && profileNames[cursor]) {\n void prepareImport(profileNames[cursor]);\n return;\n }\n\n if (input === 'j' || key.downArrow) setCursor((c) => Math.min(c + 1, Math.max(0, profileNames.length - 1)));\n else if (input === 'k' || key.upArrow) setCursor((c) => Math.max(c - 1, 0));\n });\n\n useViewInput((input, key) => {\n if (key.escape || input === 'q') {\n setMode('list');\n return;\n }\n if ((input === 'e' || input === '2') && selectedProfile) {\n setEditName(selectedProfile.name);\n setEditDesc(selectedProfile.description);\n setMode('edit-name');\n }\n }, { isActive: mode === 'detail' });\n\n useViewInput(() => {\n setMode('list');\n }, { isActive: mode === 'importing' && !importRunning });\n\n // SCR-005: Show import summary before starting\n const prepareImport = async (name: string) => {\n try {\n const isPro = useLicenseStore.getState().isPro();\n const profile = await manager.loadProfile(isPro, name);\n setImportProfile(profile);\n setMode('confirm-import');\n } catch (err) {\n setImportLines([`${t('error_prefix')}${err instanceof Error ? err.message : err}`]);\n setMode('importing');\n setImportRunning(false);\n }\n };\n\n const startImport = async (profile: Awaited<ReturnType<typeof manager.loadProfile>>) => {\n setMode('importing');\n setImportLines([]);\n setImportRunning(true);\n setImportHadError(false);\n try {\n const isPro = useLicenseStore.getState().isPro();\n const gen = manager.importProfile(isPro, profile);\n importGenRef.current = gen;\n for await (const line of gen) {\n if (!mountedRef.current) break;\n setImportLines((prev) => [...prev.slice(-99), line]);\n }\n } catch (err) {\n if (mountedRef.current) {\n setImportHadError(true);\n setImportLines((prev) => [...prev, `${t('error_prefix')}${err instanceof Error ? err.message : err}`]);\n }\n } finally {\n importGenRef.current = null;\n if (mountedRef.current) {\n setImportRunning(false);\n }\n }\n };\n\n if (loading) return <Loading message={t('loading_profiles')} />;\n\n if (mode === 'confirm-import' && importProfile) {\n return (\n <Box flexDirection=\"column\">\n <ConfirmDialog\n message={t('profiles_importSummary', {\n formulae: String(importProfile.formulae.length),\n casks: String(importProfile.casks.length),\n })}\n onConfirm={() => {\n const profile = importProfile;\n setImportProfile(null);\n void startImport(profile);\n }}\n onCancel={() => {\n setImportProfile(null);\n setMode('list');\n }}\n />\n </Box>\n );\n }\n\n if (mode === 'importing') {\n return (\n <Box flexDirection=\"column\">\n <ProgressLog lines={importLines} isRunning={importRunning} title={t('profiles_importTitle')} />\n {!importRunning && (\n <Box marginTop={SPACING.xs}>\n <ResultBanner status={importHadError ? 'error' : 'success'} message={importHadError ? t('profiles_importPartial') : `\\u2714 ${t('profiles_importComplete')}`} />\n </Box>\n )}\n </Box>\n );\n }\n\n if (mode === 'create-name') {\n return <ProfileCreateName onSubmit={(val) => { setNewName(val); setMode('create-desc'); }} />;\n }\n\n if (mode === 'create-desc') {\n return (\n <ProfileCreateDesc\n name={newName}\n loadError={loadError}\n onSubmit={async (val) => {\n try {\n await exportCurrent(newName, val);\n } finally {\n setMode('list');\n setNewName('');\n }\n }}\n />\n );\n }\n\n if (mode === 'edit-name') {\n return <ProfileEditName defaultName={editName} onSubmit={(val) => { setEditName(val); setMode('edit-desc'); }} />;\n }\n\n if (mode === 'edit-desc') {\n return (\n <ProfileEditDesc\n name={editName}\n defaultDesc={editDesc}\n loadError={loadError}\n onSubmit={async (val) => {\n if (selectedProfile) {\n await updateProfile(selectedProfile.name, editName, val);\n }\n setMode('detail');\n setEditName('');\n setEditDesc('');\n }}\n />\n );\n }\n\n if (mode === 'detail' && selectedProfile) {\n return <ProfileDetailMode profile={selectedProfile} />;\n }\n\n return (\n <ProfileListMode\n profileNames={profileNames}\n cursor={cursor}\n confirmDelete={confirmDelete}\n loadError={loadError}\n onConfirmDelete={() => { void deleteProfile(profileNames[cursor]); setConfirmDelete(false); }}\n onCancelDelete={() => setConfirmDelete(false)}\n />\n );\n}\n","import { create } from 'zustand';\nimport type { Profile } from '../lib/profiles/types.js';\nimport * as manager from '../lib/profiles/profile-manager.js';\nimport { useLicenseStore } from './license-store.js';\nimport { verifyPro } from '../lib/license/pro-guard.js';\n\ninterface ProfileState {\n profileNames: string[];\n selectedProfile: Profile | null;\n loading: boolean;\n loadError: string | null;\n\n fetchProfiles: () => Promise<void>;\n loadProfile: (name: string) => Promise<void>;\n exportCurrent: (name: string, description: string) => Promise<void>;\n deleteProfile: (name: string) => Promise<void>;\n updateProfile: (oldName: string, newName: string, newDescription: string) => Promise<void>;\n}\n\n// Defense-in-depth: verifyPro runs canaries, integrity, anti-tamper and\n// degradation checks beyond the simple store flag. lib/ still receives a\n// plain boolean per project convention (CLAUDE.md: lib/ must not import stores).\nfunction getIsPro(): boolean {\n const { license, status } = useLicenseStore.getState();\n return verifyPro(license, status);\n}\n\nexport const useProfileStore = create<ProfileState>((set) => ({\n profileNames: [],\n selectedProfile: null,\n loading: false,\n loadError: null,\n\n fetchProfiles: async () => {\n set({ loading: true });\n const names = await manager.listProfiles(getIsPro());\n set({ profileNames: names, loading: false });\n },\n\n loadProfile: async (name) => {\n set({ loadError: null });\n try {\n const profile = await manager.loadProfile(getIsPro(), name);\n set({ selectedProfile: profile });\n } catch (err) {\n set({ loadError: err instanceof Error ? err.message : String(err) });\n }\n },\n\n exportCurrent: async (name, description) => {\n set({ loading: true, loadError: null });\n try {\n const license = useLicenseStore.getState().license;\n await manager.exportCurrentSetup(getIsPro(), name, description, license);\n const names = await manager.listProfiles(getIsPro());\n set({ profileNames: names, loading: false });\n } catch (err) {\n set({ loading: false, loadError: err instanceof Error ? err.message : String(err) });\n throw err;\n }\n },\n\n deleteProfile: async (name) => {\n await manager.deleteProfile(getIsPro(), name);\n const names = await manager.listProfiles(getIsPro());\n set({ profileNames: names, selectedProfile: null });\n },\n\n updateProfile: async (oldName, newName, newDescription) => {\n set({ loadError: null });\n try {\n await manager.updateProfile(getIsPro(), oldName, newName, newDescription);\n const names = await manager.listProfiles(getIsPro());\n const updated = await manager.loadProfile(getIsPro(), newName);\n set({ profileNames: names, selectedProfile: updated });\n } catch (err) {\n set({ loadError: err instanceof Error ? err.message : String(err) });\n }\n },\n}));\n","import { readFile, writeFile, readdir, rm, rename } from 'node:fs/promises';\nimport { join, basename } from 'node:path';\nimport { PROFILES_DIR, ensureDataDirs } from '../data-dir.js';\nimport { execBrew, streamBrew } from '../brew-cli.js';\nimport { getInstalled, getLeaves } from '../brew-api.js';\nimport { t } from '../../i18n/index.js';\nimport { getWatermark } from '../license/watermark.js';\nimport type { LicenseData } from '../license/types.js';\nimport type { Profile, ProfileFile } from './types.js';\n\nfunction proCheck(isPro: boolean): void {\n if (!isPro) throw new Error('Pro license required');\n}\n\n/**\n * Validate a profile name to prevent path traversal.\n * Only allows alphanumeric characters, hyphens, underscores, and spaces.\n * Throws if the name contains path separators or traversal sequences.\n */\nconst MAX_PROFILE_NAME_LENGTH = 100;\n\nfunction validateProfileName(name: string): void {\n if (!name || name.trim().length === 0) {\n throw new Error('Profile name cannot be empty');\n }\n if (name.length > MAX_PROFILE_NAME_LENGTH) {\n throw new Error(`Profile name is too long (max ${MAX_PROFILE_NAME_LENGTH} characters)`);\n }\n if (!/^[\\w\\s-]+$/.test(name)) {\n throw new Error(`Invalid profile name: \"${name}\". Only letters, numbers, spaces, hyphens, and underscores are allowed.`);\n }\n}\n\nfunction profilePath(name: string): string {\n validateProfileName(name);\n // Use basename as an additional defense-in-depth guard: strips any directory\n // component that might survive the regex check on edge-case OS behavior.\n return join(PROFILES_DIR, `${basename(name)}.json`);\n}\n\nexport async function listProfiles(isPro: boolean): Promise<string[]> {\n proCheck(isPro);\n await ensureDataDirs();\n try {\n const files = await readdir(PROFILES_DIR);\n return files.filter((f) => f.endsWith('.json')).map((f) => f.replace('.json', ''));\n } catch {\n return [];\n }\n}\n\nexport async function loadProfile(isPro: boolean, name: string): Promise<Profile> {\n proCheck(isPro);\n const raw = await readFile(profilePath(name), 'utf-8');\n let file: ProfileFile;\n try {\n file = JSON.parse(raw) as ProfileFile;\n } catch (err) {\n throw new Error(`Profile \"${name}\" is corrupted: ${err instanceof Error ? err.message : String(err)}`, { cause: err });\n }\n if (file.version !== 1) {\n // Future: add migration logic here\n throw new Error('Unsupported data version');\n }\n if (!file.profile) {\n throw new Error(`Profile \"${name}\" is missing required data`);\n }\n return file.profile;\n}\n\nexport async function saveProfile(isPro: boolean, profile: Profile): Promise<void> {\n proCheck(isPro);\n await ensureDataDirs();\n\n // BK-002: Atomic write via temp file + rename\n const filePath = profilePath(profile.name);\n const tmpPath = filePath + '.tmp';\n const file: ProfileFile = { version: 1, profile };\n await writeFile(tmpPath, JSON.stringify(file, null, 2), { encoding: 'utf-8', mode: 0o600 });\n await rename(tmpPath, filePath);\n}\n\nexport async function deleteProfile(isPro: boolean, name: string): Promise<void> {\n proCheck(isPro);\n try {\n await rm(profilePath(name));\n } catch { /* may not exist */ }\n}\n\nexport async function exportCurrentSetup(isPro: boolean, name: string, description: string, license: LicenseData | null = null, consent = true): Promise<Profile> {\n proCheck(isPro);\n\n // BK-007: Check if profile already exists\n const existingNames = await listProfiles(isPro);\n if (existingNames.includes(name)) {\n throw new Error('Profile already exists: ' + name);\n }\n\n const [installed, leaves, tapsRaw] = await Promise.all([\n getInstalled(),\n getLeaves(),\n execBrew(['tap']),\n ]);\n\n const taps = tapsRaw.split('\\n').map((l) => l.trim()).filter(Boolean);\n const casks = installed.casks\n .filter((c) => c.installed)\n .map((c) => c.token);\n\n const now = new Date().toISOString();\n const profile: Profile = {\n name,\n description,\n createdAt: now,\n updatedAt: now,\n formulae: leaves,\n casks,\n taps,\n exportedBy: getWatermark(license, consent), // BK-014: explicit consent required (default false)\n };\n\n await saveProfile(isPro, profile);\n return profile;\n}\n\nexport async function updateProfile(isPro: boolean, oldName: string, newName: string, newDescription: string): Promise<void> {\n proCheck(isPro);\n const profile = await loadProfile(isPro, oldName);\n if (oldName !== newName) {\n await deleteProfile(isPro, oldName);\n }\n const updated: Profile = {\n ...profile,\n name: newName,\n description: newDescription,\n updatedAt: new Date().toISOString(),\n };\n await saveProfile(isPro, updated);\n}\n\n// Validation patterns for brew package/tap names to prevent command injection\nconst TAP_PATTERN = /^[a-z0-9][-a-z0-9]*\\/[a-z0-9][-a-z0-9]*$/;\nconst PKG_PATTERN = /^[a-z0-9][-a-z0-9_.@+]*$/;\n\nexport async function* importProfile(isPro: boolean, profile: Profile): AsyncGenerator<string> {\n proCheck(isPro);\n\n const installed = await getInstalled();\n const installedFormulae = new Set(installed.formulae.map((f) => f.name));\n const installedCasks = new Set(installed.casks.filter((c) => c.installed).map((c) => c.token));\n\n // Add missing taps (validated)\n for (const tap of profile.taps) {\n if (!TAP_PATTERN.test(tap)) {\n yield `Skipping invalid tap name: ${tap}`;\n continue;\n }\n yield t('profileMgr_tapping', { name: tap });\n try {\n await execBrew(['tap', tap]);\n } catch { /* may already be tapped */ }\n }\n\n // Install missing formulae (validated)\n const missingFormulae = profile.formulae.filter((f) => !installedFormulae.has(f));\n for (const name of missingFormulae) {\n if (!PKG_PATTERN.test(name)) {\n yield `Skipping invalid formula name: ${name}`;\n continue;\n }\n yield t('profileMgr_installing', { name });\n for await (const line of streamBrew(['install', name])) {\n yield line;\n }\n }\n\n // Install missing casks (validated)\n const missingCasks = profile.casks.filter((c) => !installedCasks.has(c));\n for (const name of missingCasks) {\n if (!PKG_PATTERN.test(name)) {\n yield `Skipping invalid cask name: ${name}`;\n continue;\n }\n yield t('profileMgr_installingCask', { name });\n for await (const line of streamBrew(['install', '--cask', name])) {\n yield line;\n }\n }\n\n const totalInstalled = missingFormulae.length + missingCasks.length;\n yield t('profileMgr_importDone', { count: totalInstalled });\n}\n","import type { LicenseData } from './types.js';\n\n/**\n * Get a watermark string containing the license holder's email.\n * Used subtly in Pro feature output for traceability.\n *\n * BK-014: `consent` defaults to FALSE. Embedding the customer email in\n * exported artefacts is privacy-sensitive (the export may be shared,\n * pasted into a public PR, etc.). Callers must explicitly opt in by\n * passing `true`.\n */\nexport function getWatermark(license: LicenseData | null, consent = false): string {\n if (!consent) return '';\n if (!license?.customerEmail) return '';\n // Create a subtle, non-obvious watermark\n // Embed as zero-width characters or as a comment in exported data\n return `Licensed to: ${license.customerEmail}`;\n}\n\n/**\n * Embed invisible watermark in a string using zero-width characters.\n * Each bit of the email is encoded as either a zero-width space (0) or\n * zero-width non-joiner (1).\n */\nexport function embedInvisibleWatermark(text: string, email: string): string {\n const encoded = [...email].map(c => {\n const cp = c.codePointAt(0) ?? 0;\n // Use 21 bits to cover the full Unicode range (max code point U+10FFFF)\n const bits = cp.toString(2).padStart(21, '0');\n return [...bits].map(b => b === '0' ? '\\u200B' : '\\u200C').join('');\n }).join('\\u200D'); // zero-width joiner as separator\n\n // Insert at the end of the first line\n const lines = text.split('\\n');\n if (lines.length > 0) {\n lines[0] = lines[0] + encoded;\n }\n return lines.join('\\n');\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { ConfirmDialog } from '../../components/common/confirm-dialog.js';\nimport { SectionHeader } from '../../components/common/section-header.js';\nimport { COLORS } from '../../utils/colors.js';\nimport { SelectableRow } from '../../components/common/selectable-row.js';\nimport { GRADIENTS } from '../../utils/gradient.js';\nimport { t } from '../../i18n/index.js';\nimport { SPACING } from '../../utils/spacing.js';\n\ninterface ProfileListModeProps {\n profileNames: string[];\n cursor: number;\n confirmDelete: boolean;\n loadError: string | null;\n onConfirmDelete: () => void;\n onCancelDelete: () => void;\n}\n\nexport function ProfileListMode({ profileNames, cursor, confirmDelete, loadError, onConfirmDelete, onCancelDelete }: ProfileListModeProps) {\n return (\n <Box flexDirection=\"column\">\n <SectionHeader emoji={'\\u{1F4C1}'} title={t('profiles_title', { count: profileNames.length })} gradient={GRADIENTS.gold} />\n\n {/* SCR-004: Display load errors */}\n {loadError && (\n <Box marginY={SPACING.xs}>\n <Text color={COLORS.error}>{loadError}</Text>\n </Box>\n )}\n\n {confirmDelete && profileNames[cursor] && (\n <Box marginY={SPACING.xs}>\n <ConfirmDialog\n message={t('profiles_confirmDelete', { name: profileNames[cursor] })}\n onConfirm={onConfirmDelete}\n onCancel={onCancelDelete}\n />\n </Box>\n )}\n\n {profileNames.length === 0 && !confirmDelete && (\n <Box marginTop={SPACING.xs} borderStyle=\"round\" borderColor={COLORS.textSecondary} paddingX={SPACING.sm} paddingY={SPACING.none}>\n <Box flexDirection=\"column\">\n <Text color={COLORS.textSecondary} italic>{t('profiles_noProfiles')}</Text>\n <Text color={COLORS.muted}>{t('profiles_press')} <Text color={COLORS.gold} bold>n</Text> {t('profiles_exportHint')}</Text>\n </Box>\n </Box>\n )}\n\n {profileNames.length > 0 && !confirmDelete && (\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n {profileNames.map((name, i) => {\n const isCurrent = i === cursor;\n return (\n <SelectableRow key={name} isCurrent={isCurrent}>\n <Text bold={isCurrent} inverse={isCurrent}>{name}</Text>\n </SelectableRow>\n );\n })}\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.text} bold>{cursor + 1}/{profileNames.length}</Text>\n </Box>\n </Box>\n )}\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { COLORS } from '../../utils/colors.js';\nimport { t } from '../../i18n/index.js';\nimport { formatDate } from '../../utils/format.js';\nimport type { Profile } from '../../lib/profiles/types.js';\nimport { SPACING } from '../../utils/spacing.js';\nimport { useVisibleRows } from '../../hooks/use-visible-rows.js';\n\ninterface ProfileDetailModeProps {\n profile: Profile;\n}\n\nexport function ProfileDetailMode({ profile }: ProfileDetailModeProps) {\n // Header (~3 lines) + 2 section titles + hint row. Split remaining rows\n // proportionally between formulae and casks so neither hides the other.\n const totalRows = useVisibleRows({\n reservedRows: 7,\n fallbackReservedRows: 14,\n minRows: 2,\n });\n const total = profile.formulae.length + profile.casks.length;\n const formulaeBudget = total === 0\n ? 0\n : Math.min(profile.formulae.length, Math.max(1, Math.round((profile.formulae.length / total) * totalRows)));\n const casksBudget = Math.max(0, totalRows - formulaeBudget);\n const visibleFormulae = profile.formulae.slice(0, formulaeBudget);\n const visibleCasks = profile.casks.slice(0, casksBudget);\n const formulaeHidden = profile.formulae.length - visibleFormulae.length;\n const casksHidden = profile.casks.length - visibleCasks.length;\n\n return (\n <Box flexDirection=\"column\">\n <Text bold color={COLORS.gold}>{profile.name}</Text>\n <Text color={COLORS.muted} wrap=\"wrap\">{profile.description}</Text>\n <Text color={COLORS.muted}>{t('profiles_created', { date: formatDate(profile.createdAt) })}</Text>\n <Box marginTop={SPACING.xs} flexDirection=\"column\">\n <Text bold>{t('profiles_formulaeCount', { count: profile.formulae.length })}</Text>\n <Box paddingLeft={SPACING.sm} flexDirection=\"column\">\n {visibleFormulae.map((f) => (\n <Text key={f} color={COLORS.muted}>{f}</Text>\n ))}\n {formulaeHidden > 0 && (\n <Text color={COLORS.textSecondary} italic>{t('common_andMore', { count: formulaeHidden })}</Text>\n )}\n </Box>\n <Text bold>{t('profiles_casksCount', { count: profile.casks.length })}</Text>\n <Box paddingLeft={SPACING.sm} flexDirection=\"column\">\n {visibleCasks.map((c) => (\n <Text key={c} color={COLORS.muted}>{c}</Text>\n ))}\n {casksHidden > 0 && (\n <Text color={COLORS.textSecondary} italic>{t('common_andMore', { count: casksHidden })}</Text>\n )}\n </Box>\n </Box>\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.textSecondary}>esc:{t('hint_back')} e:{t('hint_edit')} i:{t('hint_importProfile')}</Text>\n </Box>\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { TextInput } from '@inkjs/ui';\nimport { COLORS } from '../../utils/colors.js';\nimport { t } from '../../i18n/index.js';\n\ninterface ProfileCreateNameProps {\n onSubmit: (name: string) => void;\n}\n\nexport function ProfileCreateName({ onSubmit }: ProfileCreateNameProps) {\n return (\n <Box flexDirection=\"column\">\n <Text bold>{t('profiles_createName')}</Text>\n <TextInput\n placeholder={t('profiles_namePlaceholder')}\n onSubmit={onSubmit}\n />\n </Box>\n );\n}\n\ninterface ProfileCreateDescProps {\n name: string;\n loadError: string | null;\n onSubmit: (desc: string) => void;\n}\n\nexport function ProfileCreateDesc({ name, loadError, onSubmit }: ProfileCreateDescProps) {\n return (\n <Box flexDirection=\"column\">\n <Text bold>{t('profiles_createDesc', { name })}</Text>\n {loadError && <Text color={COLORS.error}>{t('error_prefix')}{loadError}</Text>}\n <TextInput\n placeholder={t('profiles_descPlaceholder')}\n onSubmit={onSubmit}\n />\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { TextInput } from '@inkjs/ui';\nimport { COLORS } from '../../utils/colors.js';\nimport { t } from '../../i18n/index.js';\n\ninterface ProfileEditNameProps {\n defaultName: string;\n onSubmit: (name: string) => void;\n}\n\nexport function ProfileEditName({ defaultName, onSubmit }: ProfileEditNameProps) {\n return (\n <Box flexDirection=\"column\">\n <Text bold>{t('profiles_editName')}</Text>\n <TextInput\n defaultValue={defaultName}\n onSubmit={onSubmit}\n />\n </Box>\n );\n}\n\ninterface ProfileEditDescProps {\n name: string;\n defaultDesc: string;\n loadError: string | null;\n onSubmit: (desc: string) => void;\n}\n\nexport function ProfileEditDesc({ name, defaultDesc, loadError, onSubmit }: ProfileEditDescProps) {\n return (\n <Box flexDirection=\"column\">\n <Text bold>{t('profiles_editDesc', { name })}</Text>\n {loadError && <Text color={COLORS.error}>{t('error_prefix')}{loadError}</Text>}\n <TextInput\n defaultValue={defaultDesc}\n onSubmit={onSubmit}\n />\n </Box>\n );\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport { Box, Text } from 'ink';\nimport { useViewInput } from '../hooks/use-view-input.js';\nimport { useCleanupStore } from '../stores/cleanup-store.js';\nimport { useBrewStream } from '../hooks/use-brew-stream.js';\nimport { Loading, ErrorMessage } from '../components/common/loading.js';\nimport { ConfirmDialog } from '../components/common/confirm-dialog.js';\nimport { ProgressLog } from '../components/common/progress-log.js';\nimport { ResultBanner } from '../components/common/result-banner.js';\nimport { StatCard } from '../components/common/stat-card.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { COLORS } from '../utils/colors.js';\nimport { SelectableRow } from '../components/common/selectable-row.js';\nimport { GRADIENTS } from '../utils/gradient.js';\nimport { t } from '../i18n/index.js';\nimport { SPACING } from '../utils/spacing.js';\nimport { useVisibleRows } from '../hooks/use-visible-rows.js';\n\nexport function SmartCleanupView() {\n const { summary, selected, loading, error, analyze, toggleSelect, selectAll } = useCleanupStore();\n const [cursor, setCursor] = useState(0);\n const [confirmClean, setConfirmClean] = useState(false);\n const [confirmForce, setConfirmForce] = useState(false);\n const [failedNames, setFailedNames] = useState<string[]>([]);\n const stream = useBrewStream();\n const hasRefreshed = useRef(false);\n // StatCards (3 rows) + title + warning/confirm dialog + footer hints.\n const listRows = useVisibleRows({\n reservedRows: confirmClean || confirmForce ? 12 : 9,\n fallbackReservedRows: confirmClean || confirmForce ? 18 : 14,\n minRows: 1,\n });\n\n useEffect(() => { analyze(); }, []);\n\n useEffect(() => {\n if (!stream.isRunning && !stream.error && stream.lines.length > 0 && !hasRefreshed.current) {\n hasRefreshed.current = true;\n void analyze();\n }\n }, [stream.isRunning, stream.error]);\n\n const candidates = summary?.candidates ?? [];\n\n const isDependencyError = stream.error != null &&\n stream.lines.some((l) => l.includes('Refusing to uninstall') || l.includes('required by'));\n\n useViewInput((input, key) => {\n if (stream.isRunning) {\n if (key.escape) stream.cancel();\n return;\n }\n if (confirmClean || confirmForce) return;\n\n // After a dependency error, offer F (or 3) to force\n if ((input === 'F' || input === '3') && isDependencyError && failedNames.length > 0) {\n setConfirmForce(true);\n return;\n }\n\n if (input === 'r' || input === '4') { stream.clear(); setFailedNames([]); void analyze(); return; }\n if (key.return && candidates[cursor]) {\n toggleSelect(candidates[cursor].name);\n return;\n }\n if (input === 'a' || input === '1') { selectAll(); return; }\n if ((input === 'c' || input === '2') && selected.size > 0) { setConfirmClean(true); return; }\n\n if (input === 'j' || key.downArrow) setCursor((c) => Math.min(c + 1, Math.max(0, candidates.length - 1)));\n else if (input === 'k' || key.upArrow) setCursor((c) => Math.max(c - 1, 0));\n });\n\n if (loading) return <Loading message={t('loading_cleanup')} />;\n if (error) return <ErrorMessage message={error} />;\n\n if (stream.isRunning || stream.lines.length > 0) {\n return (\n <Box flexDirection=\"column\">\n <ProgressLog lines={stream.lines} isRunning={stream.isRunning} title={t('cleanup_cleaning')} />\n {stream.isRunning && (\n <Text color={COLORS.muted}>esc:{t('hint_cancel')}</Text>\n )}\n\n {!stream.isRunning && !stream.error && (\n <ResultBanner status=\"success\" message={`\\u2714 ${t('cleanup_complete')}`} />\n )}\n\n {!stream.isRunning && stream.error && (\n <Box flexDirection=\"column\" gap={SPACING.xs}>\n <ResultBanner status=\"error\" message={`\\u2718 ${t('cleanup_depError')}`} />\n {isDependencyError && failedNames.length > 0 && (\n <Text color={COLORS.warning}>\n F:{t('hint_force')} r:{t('hint_refresh')}\n </Text>\n )}\n </Box>\n )}\n\n {confirmForce && (\n <Box marginY={SPACING.xs}>\n <ConfirmDialog\n message={t('cleanup_confirmForce', { count: failedNames.length })}\n onConfirm={() => {\n setConfirmForce(false);\n hasRefreshed.current = false;\n stream.clear();\n void stream.run(['uninstall', '--ignore-dependencies', ...failedNames]);\n }}\n onCancel={() => setConfirmForce(false)}\n />\n </Box>\n )}\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\">\n <SectionHeader emoji={'\\u{1F9F9}'} title={t('cleanup_title')} gradient={GRADIENTS.emerald} />\n\n {summary && (\n <Box gap={SPACING.xs} marginY={SPACING.xs}>\n <StatCard label={t('cleanup_orphans')} value={candidates.length} color={candidates.length > 0 ? COLORS.warning : COLORS.success} />\n <StatCard label={t('cleanup_reclaimable')} value={summary.totalReclaimableFormatted} color={COLORS.sky} />\n <StatCard label={t('cleanup_selected')} value={selected.size} color={selected.size > 0 ? COLORS.success : COLORS.muted} />\n </Box>\n )}\n\n {/* SCR-001: Two-step confirmation with system tools warning */}\n {confirmClean && (\n <Box flexDirection=\"column\" marginY={SPACING.xs} gap={SPACING.xs}>\n <Box borderStyle=\"round\" borderColor={COLORS.warning} paddingX={SPACING.sm} paddingY={SPACING.none}>\n <Text color={COLORS.warning}>{t('cleanup_warning_system_tools')}</Text>\n </Box>\n <ConfirmDialog\n message={t('cleanup_confirmUninstall', { count: selected.size })}\n onConfirm={() => {\n setConfirmClean(false);\n hasRefreshed.current = false;\n const names = Array.from(selected);\n setFailedNames(names);\n void stream.run(['uninstall', ...names]);\n }}\n onCancel={() => setConfirmClean(false)}\n />\n </Box>\n )}\n\n {candidates.length === 0 && !confirmClean && (\n <ResultBanner status=\"success\" message={`\\u2714 ${t('cleanup_systemClean')}`} />\n )}\n\n {candidates.length > 0 && !confirmClean && (() => {\n const start = Math.max(0, cursor - Math.floor(listRows / 2));\n const visible = candidates.slice(start, start + listRows);\n return (\n <Box flexDirection=\"column\">\n {start > 0 && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreAbove', { count: start })}</Text>\n )}\n {visible.map((c, i) => {\n const idx = start + i;\n const isCurrent = idx === cursor;\n const isSelected = selected.has(c.name);\n return (\n <SelectableRow key={c.name} isCurrent={isCurrent}>\n <Text color={isSelected ? COLORS.success : COLORS.muted}>{isSelected ? '\\u2611' : '\\u2610'}</Text>\n <Text bold={isCurrent} inverse={isCurrent} color={isCurrent ? COLORS.text : COLORS.muted}>{c.name}</Text>\n <Text color={COLORS.warning}>{c.diskUsageFormatted}</Text>\n <Text color={COLORS.textSecondary}>[{c.reason}]</Text>\n </SelectableRow>\n );\n })}\n {start + listRows < candidates.length && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreBelow', { count: candidates.length - start - listRows })}</Text>\n )}\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.text} bold>\n {cursor + 1}/{candidates.length}\n </Text>\n </Box>\n </Box>\n );\n })()}\n </Box>\n );\n}\n","import { create } from 'zustand';\nimport type { CleanupSummary } from '../lib/cleanup/types.js';\nimport { analyzeCleanup } from '../lib/cleanup/cleanup-analyzer.js';\nimport { useBrewStore } from './brew-store.js';\nimport { useLicenseStore } from './license-store.js';\nimport { verifyPro } from '../lib/license/pro-guard.js';\n\ninterface CleanupState {\n summary: CleanupSummary | null;\n selected: Set<string>;\n loading: boolean;\n error: string | null;\n\n analyze: () => Promise<void>;\n toggleSelect: (name: string) => void;\n selectAll: () => void;\n deselectAll: () => void;\n}\n\nexport const useCleanupStore = create<CleanupState>((set, get) => ({\n summary: null,\n selected: new Set(),\n loading: false,\n error: null,\n\n analyze: async () => {\n set({ loading: true, error: null });\n try {\n const brewState = useBrewStore.getState();\n if (brewState.formulae.length === 0) {\n await brewState.fetchInstalled();\n await brewState.fetchLeaves();\n }\n const { formulae, leaves } = useBrewStore.getState();\n const { license, status } = useLicenseStore.getState();\n const isPro = verifyPro(license, status);\n const summary = await analyzeCleanup(isPro, formulae, leaves);\n set({ summary, selected: new Set(), loading: false });\n } catch (err) {\n set({ error: err instanceof Error ? err.message : String(err), loading: false });\n }\n },\n\n toggleSelect: (name) => {\n const selected = new Set(get().selected);\n if (selected.has(name)) selected.delete(name);\n else selected.add(name);\n set({ selected });\n },\n\n selectAll: () => {\n const names = get().summary?.candidates.map((c) => c.name) ?? [];\n set({ selected: new Set(names) });\n },\n\n deselectAll: () => set({ selected: new Set() }),\n}));\n","import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { execBrew } from '../brew-cli.js';\nimport { formatBytes } from '../../utils/format.js';\nimport type { Formula } from '../types.js';\nimport type { CleanupCandidate, CleanupSummary } from './types.js';\n\nconst execFileAsync = promisify(execFile);\n\nasync function getDiskUsage(cellarPath: string): Promise<number> {\n try {\n const { stdout } = await execFileAsync('du', ['-sk', cellarPath]);\n const kb = parseInt(stdout.split('\\t')[0] ?? '0', 10);\n return kb * 1024;\n } catch {\n return 0;\n }\n}\n\nasync function getCellarPath(name: string): Promise<string | null> {\n try {\n const raw = await execBrew(['--cellar', name]);\n return raw.trim() || null;\n } catch {\n return null;\n }\n}\n\nexport async function analyzeCleanup(\n isPro: boolean,\n formulae: Formula[],\n leaves: string[],\n): Promise<CleanupSummary> {\n if (!isPro) throw new Error('Pro license required');\n\n const leavesSet = new Set(leaves);\n\n // Build reverse dependency map\n const reverseDeps = new Map<string, number>();\n for (const f of formulae) {\n for (const dep of f.dependencies) {\n reverseDeps.set(dep, (reverseDeps.get(dep) ?? 0) + 1);\n }\n }\n\n // Find orphans: installed as dependency but not a leaf and has 0 reverse deps from installed packages\n const orphans: string[] = [];\n\n for (const f of formulae) {\n const installed = f.installed[0];\n if (!installed) continue;\n\n if (installed.installed_as_dependency && !installed.installed_on_request && !leavesSet.has(f.name)) {\n // Check if any installed package still depends on this\n // Actually, we need to check if any installed package lists THIS package as a dependency\n let isNeeded = false;\n for (const other of formulae) {\n if (other.name === f.name) continue;\n if (other.dependencies.includes(f.name)) {\n isNeeded = true;\n break;\n }\n }\n if (!isNeeded) {\n orphans.push(f.name);\n }\n }\n }\n\n // Get disk usage for orphans (parallel, limited concurrency)\n const candidates: CleanupCandidate[] = [];\n const concurrency = 5;\n\n for (let i = 0; i < orphans.length; i += concurrency) {\n const batch = orphans.slice(i, i + concurrency);\n const results = await Promise.all(\n batch.map(async (name) => {\n const cellarPath = await getCellarPath(name);\n const bytes = cellarPath ? await getDiskUsage(cellarPath) : 0;\n return {\n name,\n reason: 'orphan' as const,\n diskUsageBytes: bytes,\n diskUsageFormatted: formatBytes(bytes),\n installedAsDependency: true,\n dependentsCount: 0,\n };\n }),\n );\n candidates.push(...results);\n }\n\n // Sort by disk usage descending\n candidates.sort((a, b) => b.diskUsageBytes - a.diskUsageBytes);\n\n const totalBytes = candidates.reduce((sum, c) => sum + c.diskUsageBytes, 0);\n\n return {\n totalReclaimableBytes: totalBytes,\n totalReclaimableFormatted: formatBytes(totalBytes),\n candidates,\n analyzedAt: new Date().toISOString(),\n };\n}\n","import React, { useEffect, useState, useMemo } from 'react';\nimport { Box, Text } from 'ink';\nimport { useViewInput } from '../hooks/use-view-input.js';\nimport { useHistoryStore } from '../stores/history-store.js';\nimport { useBrewStream } from '../hooks/use-brew-stream.js';\nimport { useDebounce } from '../hooks/use-debounce.js';\nimport { Loading, ErrorMessage } from '../components/common/loading.js';\nimport { StatusBadge } from '../components/common/status-badge.js';\nimport { SelectableRow } from '../components/common/selectable-row.js';\nimport { SearchInput } from '../components/common/search-input.js';\nimport { ConfirmDialog } from '../components/common/confirm-dialog.js';\nimport { ProgressLog } from '../components/common/progress-log.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { COLORS } from '../utils/colors.js';\nimport { GRADIENTS } from '../utils/gradient.js';\nimport { formatRelativeTime } from '../utils/format.js';\nimport { t } from '../i18n/index.js';\nimport { useModalStore } from '../stores/modal-store.js';\nimport type { TranslationKey } from '../i18n/en.js';\nimport type { HistoryAction, HistoryEntry } from '../lib/history/types.js';\nimport { SPACING } from '../utils/spacing.js';\nimport { useVisibleRows } from '../hooks/use-visible-rows.js';\n\nconst ACTION_ICONS: Record<HistoryAction, { icon: string; color: string }> = {\n install: { icon: '+', color: COLORS.success },\n uninstall: { icon: '-', color: COLORS.error },\n upgrade: { icon: '\\u2191', color: COLORS.info },\n 'upgrade-all': { icon: '\\u21C8', color: COLORS.info },\n};\n\nconst ACTION_LABEL_KEYS: Record<HistoryAction, TranslationKey> = {\n install: 'history_actionInstall',\n uninstall: 'history_actionUninstall',\n upgrade: 'history_actionUpgrade',\n 'upgrade-all': 'history_actionUpgradeAll',\n};\n\nconst FILTERS: (HistoryAction | 'all')[] = ['all', 'install', 'uninstall', 'upgrade', 'upgrade-all'];\n\nexport function HistoryView() {\n const { entries, loading, error, fetchHistory, clearHistory } = useHistoryStore();\n const [cursor, setCursor] = useState(0);\n const [filter, setFilter] = useState<HistoryAction | 'all'>('all');\n const [searchQuery, setSearchQuery] = useState('');\n const [isSearching, setIsSearching] = useState(false);\n const [confirmClear, setConfirmClear] = useState(false);\n const [confirmReplay, setConfirmReplay] = useState<HistoryEntry | null>(null);\n const stream = useBrewStream();\n const debouncedQuery = useDebounce(searchQuery, 200);\n const { openModal, closeModal } = useModalStore();\n const MAX_VISIBLE_ROWS = useVisibleRows({\n reservedRows: isSearching || stream.lines.length > 0 || stream.isRunning ? 8 : 5,\n fallbackReservedRows: isSearching || stream.lines.length > 0 || stream.isRunning ? 16 : 13,\n minRows: 1,\n });\n const streamRows = useVisibleRows({\n reservedRows: 7,\n fallbackReservedRows: 16,\n minRows: 1,\n });\n\n useEffect(() => { fetchHistory(); }, []);\n\n // Suppress global Escape while search bar is active so Escape clears the\n // search bar rather than navigating away from the history view.\n useEffect(() => {\n if (isSearching) {\n openModal();\n return () => { closeModal(); };\n }\n return undefined;\n }, [isSearching]);\n\n const filtered = useMemo(() => {\n let result = entries;\n if (filter !== 'all') {\n result = result.filter((e) => e.action === filter);\n }\n if (debouncedQuery) {\n const q = debouncedQuery.toLowerCase();\n result = result.filter((e) => e.packageName?.toLowerCase().includes(q));\n }\n return result;\n }, [entries, filter, debouncedQuery]);\n\n useViewInput((input, key) => {\n if (confirmClear || confirmReplay || stream.isRunning) return;\n\n if (isSearching) {\n if (key.escape) {\n setIsSearching(false);\n setSearchQuery('');\n }\n return;\n }\n\n if (input === '/') { setIsSearching(true); return; }\n if (input === 'f' || input === '1') {\n const idx = FILTERS.indexOf(filter);\n setFilter(FILTERS[(idx + 1) % FILTERS.length]!);\n setCursor(0);\n return;\n }\n if ((input === 'c' || input === '2') && entries.length > 0) { setConfirmClear(true); return; }\n if (key.return && filtered[cursor]) {\n setConfirmReplay(filtered[cursor]);\n return;\n }\n\n if (input === 'j' || key.downArrow) setCursor((c) => Math.min(c + 1, Math.max(0, filtered.length - 1)));\n else if (input === 'k' || key.upArrow) setCursor((c) => Math.max(c - 1, 0));\n });\n\n if (loading) return <Loading message={t('loading_history')} />;\n if (error) return <ErrorMessage message={error} />;\n\n const start = Math.max(0, cursor - Math.floor(MAX_VISIBLE_ROWS / 2));\n const visible = filtered.slice(start, start + MAX_VISIBLE_ROWS);\n\n return (\n <Box flexDirection=\"column\">\n <Box gap={SPACING.sm} marginBottom={SPACING.xs}>\n <SectionHeader emoji={'\\u{1F4DC}'} title={t('history_title', { count: filtered.length })} gradient={GRADIENTS.gold} />\n <Text color={filter === 'all' ? COLORS.text : COLORS.gold}>\n {t('history_filterLabel', { filter })}\n </Text>\n </Box>\n\n {isSearching && (\n <Box marginBottom={SPACING.xs}>\n <SearchInput defaultValue={searchQuery} onChange={setSearchQuery} placeholder={t('history_searchPlaceholder')} isActive />\n </Box>\n )}\n\n {confirmClear && (\n <ConfirmDialog\n message={t('history_confirmClear', { count: entries.length })}\n onConfirm={() => { void clearHistory(); setConfirmClear(false); }}\n onCancel={() => setConfirmClear(false)}\n />\n )}\n\n {confirmReplay && (\n <ConfirmDialog\n message={\n confirmReplay.action === 'upgrade-all'\n ? t('history_replayAll') + '\\n' + t('upgrade_all_warning')\n : t('history_confirmReplay', { action: t(ACTION_LABEL_KEYS[confirmReplay.action]), name: confirmReplay.packageName ?? '' })\n }\n onConfirm={async () => {\n const entry = confirmReplay;\n setConfirmReplay(null);\n let args: string[];\n switch (entry.action) {\n case 'install': args = ['install', entry.packageName!]; break;\n case 'uninstall': args = ['uninstall', entry.packageName!]; break;\n case 'upgrade': args = ['upgrade', entry.packageName!]; break;\n case 'upgrade-all': args = ['upgrade']; break;\n }\n await stream.run(args);\n void fetchHistory();\n }}\n onCancel={() => setConfirmReplay(null)}\n />\n )}\n\n {(stream.isRunning || stream.lines.length > 0) && (\n <Box marginY={SPACING.xs}>\n <ProgressLog\n lines={stream.lines}\n isRunning={stream.isRunning}\n title={t('hint_replay')}\n maxVisible={streamRows}\n />\n </Box>\n )}\n\n {filtered.length === 0 && !confirmClear && (\n <Text color={COLORS.textSecondary} italic>\n {filter !== 'all' ? t('history_noEntriesFor', { filter }) : t('history_noEntries')}\n </Text>\n )}\n\n {filtered.length > 0 && !confirmClear && (\n <Box flexDirection=\"column\">\n {start > 0 && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreAbove', { count: start })}</Text>\n )}\n {visible.map((entry, i) => {\n const idx = start + i;\n const isCurrent = idx === cursor;\n const { icon, color } = ACTION_ICONS[entry.action];\n const ts = new Date(entry.timestamp).getTime() / 1000;\n\n return (\n <SelectableRow key={entry.id} isCurrent={isCurrent}>\n <Text color={color} bold>{icon}</Text>\n {/* Action label: fixed-width cell with truncate, instead of\n `padEnd(12)` which only worked when the localised label\n happened to fit. Spanish \"instalación\" / \"desinstalación\"\n bust the old hardcoded width. */}\n <Box width={14} flexShrink={1} minWidth={0}>\n <Text bold={isCurrent} inverse={isCurrent} color={isCurrent ? COLORS.text : COLORS.muted} wrap=\"truncate\">\n {t(ACTION_LABEL_KEYS[entry.action])}\n </Text>\n </Box>\n {/* Package name takes the remaining space and truncates middle\n to preserve @version suffixes. */}\n <Box flexGrow={1} flexShrink={1} minWidth={0}>\n <Text color={COLORS.text} wrap=\"truncate-middle\">{entry.packageName ?? t('history_all')}</Text>\n </Box>\n {entry.success\n ? <StatusBadge label={t('badge_ok')} variant=\"success\" />\n : <StatusBadge label={t('badge_fail')} variant=\"error\" />}\n <Text color={COLORS.muted}>{formatRelativeTime(ts)}</Text>\n </SelectableRow>\n );\n })}\n {start + MAX_VISIBLE_ROWS < filtered.length && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreBelow', { count: filtered.length - start - MAX_VISIBLE_ROWS })}</Text>\n )}\n\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.text} bold>\n {cursor + 1}/{filtered.length}\n </Text>\n </Box>\n </Box>\n )}\n </Box>\n );\n}\n","import { create } from 'zustand';\nimport type { HistoryEntry, HistoryAction } from '../lib/history/types.js';\nimport * as historyLogger from '../lib/history/history-logger.js';\nimport { useLicenseStore } from './license-store.js';\nimport { verifyPro } from '../lib/license/pro-guard.js';\n\nfunction getStrongIsPro(): boolean {\n const { license, status } = useLicenseStore.getState();\n return verifyPro(license, status);\n}\n\ninterface HistoryState {\n entries: HistoryEntry[];\n loading: boolean;\n error: string | null;\n\n fetchHistory: () => Promise<void>;\n logAction: (action: HistoryAction, packageName: string | null, success: boolean, error?: string | null) => Promise<void>;\n clearHistory: () => Promise<void>;\n}\n\nexport const useHistoryStore = create<HistoryState>((set) => ({\n entries: [],\n loading: false,\n error: null,\n\n fetchHistory: async () => {\n set({ loading: true, error: null });\n try {\n const isPro = getStrongIsPro();\n const entries = await historyLogger.loadHistory(isPro);\n set({ entries, loading: false });\n } catch (err) {\n set({ loading: false, error: err instanceof Error ? err.message : String(err) });\n }\n },\n\n logAction: async (action, packageName, success, error = null) => {\n const isPro = getStrongIsPro();\n await historyLogger.appendEntry(isPro, action, packageName, success, error);\n const entries = await historyLogger.loadHistory(isPro);\n set({ entries });\n },\n\n clearHistory: async () => {\n const isPro = getStrongIsPro();\n await historyLogger.clearHistory(isPro);\n set({ entries: [] });\n },\n}));\n","import React, { useEffect, useState } from 'react';\nimport { Box, Text } from 'ink';\nimport { useViewInput } from '../hooks/use-view-input.js';\nimport { useSecurityStore } from '../stores/security-store.js';\nimport { useNavigationStore } from '../stores/navigation-store.js';\nimport { useBrewStream } from '../hooks/use-brew-stream.js';\nimport { Loading, ErrorMessage } from '../components/common/loading.js';\nimport { StatCard } from '../components/common/stat-card.js';\nimport { StatusBadge } from '../components/common/status-badge.js';\nimport { ConfirmDialog } from '../components/common/confirm-dialog.js';\nimport { ProgressLog } from '../components/common/progress-log.js';\nimport { ResultBanner } from '../components/common/result-banner.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { COLORS } from '../utils/colors.js';\nimport { SelectableRow } from '../components/common/selectable-row.js';\nimport { GRADIENTS } from '../utils/gradient.js';\nimport { t, tp } from '../i18n/index.js';\nimport { formatRelativeTime } from '../utils/format.js';\nimport type { Severity } from '../lib/security/types.js';\nimport { SPACING } from '../utils/spacing.js';\n\nconst SEVERITY_COLORS: Record<Severity, string> = {\n CRITICAL: COLORS.error,\n HIGH: COLORS.error,\n MEDIUM: COLORS.warning,\n LOW: COLORS.textSecondary,\n UNKNOWN: COLORS.textSecondary,\n};\n\nconst SEVERITY_BADGE: Record<Severity, 'error' | 'warning' | 'muted'> = {\n CRITICAL: 'error',\n HIGH: 'error',\n MEDIUM: 'warning',\n LOW: 'muted',\n UNKNOWN: 'muted',\n};\n\n// SCR-017: Detect network-related errors\nfunction isNetworkError(msg: string): boolean {\n return /fetch failed|ECONNREFUSED|ENOTFOUND|ETIMEDOUT|network|abort/i.test(msg);\n}\n\nexport function SecurityAuditView() {\n const { summary, loading, error, scan, cachedAt } = useSecurityStore();\n const navigate = useNavigationStore((s) => s.navigate);\n const [cursor, setCursor] = useState(0);\n const [expandedPkg, setExpandedPkg] = useState<string | null>(null);\n const [confirmUpgrade, setConfirmUpgrade] = useState<string | null>(null);\n const stream = useBrewStream();\n\n useEffect(() => { scan(); }, []);\n\n const results = summary?.results ?? [];\n\n useViewInput((input, key) => {\n if (confirmUpgrade || stream.isRunning) return;\n\n // ARQ-005: Manual refresh forces cache invalidation\n if (input === 'r' || input === '1') { void scan(true); return; }\n // Navigate to rollback view (capital R to avoid conflict with rescan)\n if (input === 'R') { navigate('rollback'); return; }\n if ((input === 'u' || input === '2') && results[cursor]) {\n setConfirmUpgrade(results[cursor].packageName);\n return;\n }\n\n if (input === 'j' || key.downArrow) setCursor((c) => Math.min(c + 1, Math.max(0, results.length - 1)));\n else if (input === 'k' || key.upArrow) setCursor((c) => Math.max(c - 1, 0));\n else if (key.return && results[cursor]) {\n setExpandedPkg(expandedPkg === results[cursor].packageName ? null : results[cursor].packageName);\n }\n });\n\n if (loading) return <Loading message={t('loading_security')} />;\n\n // SCR-017: Show user-friendly message for network errors\n if (error) {\n const displayError = isNetworkError(error) ? t('security_networkError') : error;\n return <ErrorMessage message={displayError} />;\n }\n\n // ARQ-005: Show cache indicator\n const cacheAge = cachedAt ? formatRelativeTime(cachedAt / 1000) : null;\n\n return (\n <Box flexDirection=\"column\">\n <SectionHeader emoji={'\\u{1F6E1}\\uFE0F'} title={t('security_title')} gradient={GRADIENTS.ocean} />\n\n {summary && (\n <Box gap={SPACING.xs} marginY={SPACING.xs}>\n <StatCard label={t('security_scanned')} value={summary.totalPackages} color={COLORS.info} />\n <StatCard\n label={t('security_vulnerable')}\n value={summary.vulnerablePackages}\n color={summary.vulnerablePackages > 0 ? COLORS.error : COLORS.success}\n />\n {summary.criticalCount > 0 && <StatCard label={t('security_critical')} value={summary.criticalCount} color={COLORS.error} />}\n {summary.highCount > 0 && <StatCard label={t('security_high')} value={summary.highCount} color={COLORS.error} />}\n {summary.mediumCount > 0 && <StatCard label={t('security_medium')} value={summary.mediumCount} color={COLORS.warning} />}\n </Box>\n )}\n\n {/* ARQ-005: Cache indicator */}\n {cacheAge && (\n <Text color={COLORS.muted}>{t('security_cachedResults', { time: cacheAge })}</Text>\n )}\n\n {/* UI-014: be honest about coverage \\u2014 OSV's Bitnami dataset does not\n map every Homebrew formula, so \"0 CVEs\" is not the same as \"safe\". */}\n {summary && (\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.textSecondary} italic>{t('security_coverage_warning')}</Text>\n </Box>\n )}\n\n {results.length === 0 && summary && (\n <Box marginTop={SPACING.xs}>\n <ResultBanner status=\"success\" message={`\\u2714 ${t('security_noVulns')}`} />\n </Box>\n )}\n\n {confirmUpgrade && (\n <Box marginY={SPACING.xs}>\n <ConfirmDialog\n message={t('security_confirmUpgrade', { name: confirmUpgrade })}\n onConfirm={async () => {\n const name = confirmUpgrade;\n setConfirmUpgrade(null);\n await stream.run(['upgrade', name]);\n void scan(true);\n }}\n onCancel={() => setConfirmUpgrade(null)}\n />\n </Box>\n )}\n\n {(stream.isRunning || stream.lines.length > 0) && (\n <Box marginY={SPACING.xs}>\n <ProgressLog lines={stream.lines} isRunning={stream.isRunning} title={t('hint_upgrade')} />\n </Box>\n )}\n\n {results.length > 0 && (\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n {results.map((pkg, i) => {\n const isCurrent = i === cursor;\n const isExpanded = expandedPkg === pkg.packageName;\n\n return (\n <Box key={pkg.packageName} flexDirection=\"column\">\n <SelectableRow isCurrent={isCurrent}>\n <StatusBadge label={pkg.maxSeverity} variant={SEVERITY_BADGE[pkg.maxSeverity]} />\n <Text bold={isCurrent} inverse={isCurrent} color={isCurrent ? COLORS.text : COLORS.muted}>\n {pkg.packageName}\n </Text>\n <Text color={COLORS.muted}>{pkg.installedVersion}</Text>\n <Text color={COLORS.muted}>{tp('plural_vulns', pkg.vulnerabilities.length)}</Text>\n {pkg.vulnerabilities.some((v) => v.fixedVersion) && (\n <Text color={COLORS.textSecondary}>[R:{t('hint_rollback')}]</Text>\n )}\n <Text color={COLORS.muted}>{isExpanded ? '\\u25BC' : '\\u25B6'}</Text>\n </SelectableRow>\n\n {isExpanded && (\n <Box flexDirection=\"column\" paddingLeft={SPACING.lg} marginBottom={SPACING.xs}>\n {pkg.vulnerabilities.map((vuln) => (\n <Box key={vuln.id} flexDirection=\"column\" marginBottom={SPACING.xs}>\n <Box gap={SPACING.xs}>\n <Text color={SEVERITY_COLORS[vuln.severity]} bold>{vuln.id}</Text>\n <Text color={COLORS.muted}>[{vuln.severity}]</Text>\n </Box>\n <Text color={COLORS.muted} wrap=\"wrap\">{vuln.summary}</Text>\n {vuln.fixedVersion && (\n <Text color={COLORS.success}>{t('security_fixedIn', { version: vuln.fixedVersion })}</Text>\n )}\n </Box>\n ))}\n </Box>\n )}\n </Box>\n );\n })}\n\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.text} bold>\n {cursor + 1}/{results.length}\n </Text>\n </Box>\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.textSecondary}>{t('security_rollback_hint')}</Text>\n </Box>\n </Box>\n )}\n </Box>\n );\n}\n","import React, { useState } from 'react';\nimport { Box, Text } from 'ink';\nimport { useViewInput } from '../hooks/use-view-input.js';\nimport { TextInput } from '@inkjs/ui';\nimport { useLicenseStore } from '../stores/license-store.js';\nimport { ConfirmDialog } from '../components/common/confirm-dialog.js';\nimport { Loading } from '../components/common/loading.js';\nimport { ResultBanner } from '../components/common/result-banner.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { COLORS } from '../utils/colors.js';\nimport { GRADIENTS } from '../utils/gradient.js';\nimport { t } from '../i18n/index.js';\nimport { formatDate } from '../utils/format.js';\nimport { redeemPromoCode } from '../lib/license/promo.js';\nimport { SPACING } from '../utils/spacing.js';\n\nexport function AccountView() {\n const { status, license, deactivate, revalidate, degradation } = useLicenseStore();\n const [confirmDeactivate, setConfirmDeactivate] = useState(false);\n const [deactivating, setDeactivating] = useState(false);\n const [deactivateError, setDeactivateError] = useState<string | null>(null);\n const [promoMode, setPromoMode] = useState(false);\n const [promoLoading, setPromoLoading] = useState(false);\n const [promoResult, setPromoResult] = useState<{ success: boolean; message: string } | null>(null);\n const [revalidating, setRevalidating] = useState(false);\n\n useViewInput((input, key) => {\n if (confirmDeactivate || deactivating || promoMode || revalidating) {\n if (key.escape && promoMode) {\n setPromoMode(false);\n setPromoResult(null);\n }\n return;\n }\n\n if ((input === 'd' || input === '2') && status === 'pro') {\n setConfirmDeactivate(true);\n }\n if (input === 'p' || input === '1') {\n setPromoMode(true);\n setPromoResult(null);\n }\n if ((input === 'v' || input === 'V') && (status === 'pro' || status === 'team' || status === 'expired')) {\n setRevalidating(true);\n void revalidate().finally(() => setRevalidating(false));\n }\n });\n\n const maskKey = (key: string) => {\n if (key.length <= 8) return key;\n return key.slice(0, 4) + '-****-****-' + key.slice(-4);\n };\n\n if (status === 'validating') {\n return <Loading message={t('account_loading')} />;\n }\n\n return (\n <Box flexDirection=\"column\">\n <SectionHeader emoji={'\\u{1F464}'} title={t('account_title')} gradient={GRADIENTS.gold} />\n\n {confirmDeactivate && (\n <Box marginY={SPACING.xs}>\n <ConfirmDialog\n message={t('account_confirmDeactivate')}\n onConfirm={async () => {\n setConfirmDeactivate(false);\n setDeactivating(true);\n setDeactivateError(null);\n try {\n await deactivate();\n } catch (err) {\n // SCR-007: Display deactivation errors\n setDeactivateError(t('deactivate_failed') + ': ' + String(err));\n } finally {\n setDeactivating(false);\n }\n }}\n onCancel={() => setConfirmDeactivate(false)}\n />\n </Box>\n )}\n\n <Box flexDirection=\"column\" marginTop={SPACING.xs} paddingLeft={SPACING.sm}>\n <Box gap={SPACING.xs}>\n <Text color={COLORS.muted}>{t('account_statusLabel')}</Text>\n {status === 'pro' && <Text color={COLORS.success} bold>{t('account_pro')}</Text>}\n {status === 'free' && <Text color={COLORS.muted}>{t('account_free')}</Text>}\n {status === 'expired' && <Text color={COLORS.error}>{t('account_expired')}</Text>}\n </Box>\n\n {(degradation === 'warning' || degradation === 'limited') && license && (\n <Box marginTop={SPACING.xs} borderStyle=\"round\" borderColor={COLORS.warning} paddingX={SPACING.sm} paddingY={SPACING.none}>\n <Text color={COLORS.warning}>\n {t('license_offlineWarning', {\n days: Math.floor((Date.now() - new Date(license.lastValidatedAt).getTime()) / (24 * 60 * 60 * 1000)),\n })}\n </Text>\n </Box>\n )}\n\n {license && (\n <>\n <Box gap={SPACING.xs}>\n <Text color={COLORS.muted}>{t('account_emailLabel')}</Text>\n <Text>{license.customerEmail}</Text>\n </Box>\n <Box gap={SPACING.xs}>\n <Text color={COLORS.muted}>{t('account_nameLabel')}</Text>\n <Text>{license.customerName}</Text>\n </Box>\n <Box gap={SPACING.xs}>\n <Text color={COLORS.muted}>{t('account_planLabel')}</Text>\n <Text color={COLORS.success} bold>Pro</Text>\n </Box>\n <Box gap={SPACING.xs}>\n <Text color={COLORS.muted}>{t('account_keyLabel')}</Text>\n <Text>{maskKey(license.key)}</Text>\n </Box>\n {license.expiresAt && (\n <Box gap={SPACING.xs}>\n <Text color={COLORS.muted}>{t('account_expiresLabel')}</Text>\n <Text>{formatDate(license.expiresAt)}</Text>\n </Box>\n )}\n <Box gap={SPACING.xs}>\n <Text color={COLORS.muted}>{t('account_activatedLabel')}</Text>\n <Text>{formatDate(license.activatedAt)}</Text>\n </Box>\n </>\n )}\n\n {status === 'free' && (\n <Box flexDirection=\"column\" marginTop={SPACING.xs} borderStyle=\"round\" borderColor={COLORS.brand} paddingX={SPACING.sm} paddingY={SPACING.none} flexShrink={1}>\n <Text bold color={COLORS.brand}>{'\\u2B50'} {t('account_upgradeTitle')}</Text>\n <Text wrap=\"wrap\">{t('account_unlockDesc')}</Text>\n <Text color={COLORS.info} bold>{t('account_pricing')}</Text>\n <Text color={COLORS.muted}>{t('upgrade_buyAt')} <Text color={COLORS.sky} bold>{t('upgrade_buyUrl')}</Text></Text>\n <Text color={COLORS.muted}>{t('account_runActivate')} <Text color={COLORS.success} bold>{t('account_activateCmd')}</Text></Text>\n </Box>\n )}\n\n {status === 'expired' && (\n <Box marginTop={SPACING.xs}>\n <Box borderStyle=\"round\" borderColor={COLORS.error} paddingX={SPACING.sm} paddingY={SPACING.none}>\n <Text color={COLORS.error}>{t('account_licenseExpired')}</Text>\n </Box>\n </Box>\n )}\n\n {deactivating && <Text color={COLORS.sky}>{t('account_deactivating')}</Text>}\n {deactivateError && <Text color={COLORS.error}>{deactivateError}</Text>}\n </Box>\n\n {/* Promo code section */}\n <Box flexDirection=\"column\" marginTop={SPACING.xs} paddingLeft={SPACING.sm}>\n {promoMode ? (\n <Box flexDirection=\"column\" gap={SPACING.xs}>\n <Text bold color={COLORS.gold}>{t('account_promoTitle')}</Text>\n {promoLoading ? (\n <Text color={COLORS.sky}>{t('account_promoValidating')}</Text>\n ) : (\n <Box gap={SPACING.xs}>\n <Text color={COLORS.muted}>{t('account_promoLabel')}</Text>\n <TextInput\n defaultValue=\"\"\n placeholder=\"BREW-XXXX-XXXX\"\n onSubmit={async (value: string) => {\n if (!value.trim()) return;\n setPromoLoading(true);\n try {\n const result = await redeemPromoCode(value);\n if (result.success) {\n setPromoResult({ success: true, message: t('account_promoSuccess', { expires: formatDate(result.expiresAt!) }) });\n } else {\n setPromoResult({ success: false, message: result.error ?? t('account_promoInvalid') });\n }\n } catch {\n setPromoResult({ success: false, message: t('account_promoError') });\n } finally {\n setPromoLoading(false);\n }\n }}\n />\n </Box>\n )}\n {promoResult && (\n <ResultBanner status={promoResult.success ? 'success' : 'error'} message={promoResult.message} />\n )}\n <Text color={COLORS.textSecondary} dimColor>{t('account_promoEsc')}</Text>\n </Box>\n ) : (\n <Text color={COLORS.textSecondary}>{t('account_promoHint')}</Text>\n )}\n </Box>\n\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.textSecondary}>\n {(status === 'pro' || status === 'team') ? `d ${t('hint_deactivate')} ` : ''}\n {(status === 'pro' || status === 'team' || status === 'expired')\n ? `v ${t('hint_revalidate')} `\n : ''}\n {revalidating ? t('account_revalidating') : ''}\n {' '}{t('app_version', { version: process.env.APP_VERSION ?? '0.1.0' })}\n </Text>\n </Box>\n </Box>\n );\n}\n","import { readFile, writeFile, rename } from 'node:fs/promises';\nimport { randomBytes, randomUUID } from 'node:crypto';\nimport { join } from 'node:path';\nimport { DATA_DIR, ensureDataDirs, getMachineId } from '../data-dir.js';\nimport { fetchWithTimeout } from '../fetch-timeout.js';\nimport { logger } from '../../utils/logger.js';\n\nconst PROMO_PATH = join(DATA_DIR, 'promo.json');\n\n// Promo API endpoint (self-hosted or Polar webhook)\nconst PROMO_API_URL = 'https://api.molinesdesigns.com/api/promo';\n\n// BK-015: validate the promo URL before fetch — same defensive guardrail\n// the polar-api.ts path has had since SEG-001. Reject any non-HTTPS or any\n// host that isn't on the molinesdesigns.com domain.\nfunction validatePromoApiUrl(url: string): void {\n const parsed = new URL(url);\n if (parsed.protocol !== 'https:') {\n throw new Error('HTTPS required for promo API');\n }\n if (!parsed.hostname.endsWith('molinesdesigns.com')) {\n throw new Error('Invalid promo API host');\n }\n}\n\nexport interface PromoCode {\n code: string;\n type: 'trial' | 'discount' | 'full';\n durationDays: number;\n maxRedemptions: number;\n currentRedemptions: number;\n createdAt: string;\n expiresAt: string | null;\n active: boolean;\n}\n\ninterface PromoRedemption {\n code: string;\n redeemedAt: string;\n expiresAt: string;\n type: 'trial' | 'discount' | 'full';\n}\n\ninterface PromoFile {\n version: 1;\n redemptions: PromoRedemption[];\n}\n\n// ── Generate promo codes (admin/CLI use) ──\n\nexport function generatePromoCode(prefix = 'BREW'): string {\n const random = randomBytes(4).toString('hex').toUpperCase();\n return `${prefix}-${random.slice(0, 4)}-${random.slice(4, 8)}`;\n}\n\nexport function generatePromoBatch(count: number, options: {\n type: 'trial' | 'discount' | 'full';\n durationDays: number;\n maxRedemptions: number;\n expiresAt?: string | null;\n prefix?: string;\n}): PromoCode[] {\n const codes: PromoCode[] = [];\n for (let i = 0; i < count; i++) {\n codes.push({\n code: generatePromoCode(options.prefix),\n type: options.type,\n durationDays: options.durationDays,\n maxRedemptions: options.maxRedemptions,\n currentRedemptions: 0,\n createdAt: new Date().toISOString(),\n expiresAt: options.expiresAt ?? null,\n active: true,\n });\n }\n return codes;\n}\n\n// ── Validate promo code against API ──\n\nexport async function validatePromoCode(code: string): Promise<{\n valid: boolean;\n type?: 'trial' | 'discount' | 'full';\n durationDays?: number;\n error?: string;\n}> {\n const normalized = code.trim().toUpperCase();\n if (!normalized || normalized.length < 8) {\n return { valid: false, error: 'Invalid promo code format' };\n }\n\n validatePromoApiUrl(`${PROMO_API_URL}/validate`);\n try {\n const res = await fetchWithTimeout(`${PROMO_API_URL}/validate`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ code: normalized }),\n }, 10_000);\n\n if (!res.ok) {\n const body = await res.json().catch(() => ({})) as { error?: string };\n return { valid: false, error: body.error ?? 'Invalid or expired promo code' };\n }\n\n const data = await res.json() as unknown;\n if (\n !data || typeof data !== 'object' ||\n typeof (data as { type?: unknown }).type !== 'string' ||\n typeof (data as { durationDays?: unknown }).durationDays !== 'number'\n ) {\n return { valid: false, error: 'Unexpected promo validation response' };\n }\n const { type, durationDays } = data as { type: string; durationDays: number };\n if (type !== 'trial' && type !== 'discount' && type !== 'full') {\n return { valid: false, error: 'Unsupported promo type' };\n }\n return {\n valid: true,\n type,\n durationDays,\n };\n } catch (err) {\n logger.error('Promo validation failed', { error: String(err) });\n return { valid: false, error: 'Could not validate promo code. Check your connection.' };\n }\n}\n\n// ── Redeem promo code locally ──\n\nexport async function redeemPromoCode(code: string): Promise<{\n success: boolean;\n expiresAt?: string;\n error?: string;\n}> {\n const normalized = code.trim().toUpperCase();\n const machineId = await getMachineId();\n\n // Call backend to validate + redeem in one step\n validatePromoApiUrl(`${PROMO_API_URL}/redeem`);\n let serverExpiresAt: string;\n let serverType: 'trial' | 'discount' | 'full';\n // EP-002: idempotency key — accidental double-clicks or retries on a flaky\n // network must not consume the promo twice. The backend dedupes on this.\n const idempotencyKey = randomUUID();\n try {\n const res = await fetchWithTimeout(`${PROMO_API_URL}/redeem`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Idempotency-Key': idempotencyKey,\n },\n body: JSON.stringify({ code: normalized, machineId, idempotencyKey }),\n }, 10_000);\n\n if (!res.ok) {\n const body = await res.json().catch(() => ({})) as { error?: string };\n return { success: false, error: body.error ?? 'Invalid or expired promo code' };\n }\n\n const data = await res.json() as unknown;\n const inner = (data as { data?: unknown })?.data;\n if (\n !inner || typeof inner !== 'object' ||\n typeof (inner as { expiresAt?: unknown }).expiresAt !== 'string' ||\n typeof (inner as { type?: unknown }).type !== 'string'\n ) {\n return { success: false, error: 'Unexpected promo redeem response' };\n }\n const expiresAt = (inner as { expiresAt: string }).expiresAt;\n const type = (inner as { type: string }).type;\n if (type !== 'trial' && type !== 'discount' && type !== 'full') {\n return { success: false, error: 'Unsupported promo type' };\n }\n serverExpiresAt = expiresAt;\n serverType = type;\n } catch (err) {\n logger.error('Promo redeem failed', { error: String(err) });\n return { success: false, error: 'Could not reach promo server. Check your connection.' };\n }\n\n // Save locally as well\n await ensureDataDirs();\n\n const redemption: PromoRedemption = {\n code: normalized,\n redeemedAt: new Date().toISOString(),\n expiresAt: serverExpiresAt,\n type: serverType,\n };\n\n let file: PromoFile = { version: 1, redemptions: [] };\n try {\n const raw = await readFile(PROMO_PATH, 'utf-8');\n file = JSON.parse(raw) as PromoFile;\n } catch { /* no existing file */ }\n\n // Check for duplicate redemption\n if (file.redemptions.some((r) => r.code === redemption.code)) {\n return { success: false, error: 'This promo code has already been redeemed' };\n }\n\n file.redemptions.push(redemption);\n\n // Atomic write\n const tmpPath = PROMO_PATH + '.tmp';\n await writeFile(tmpPath, JSON.stringify(file, null, 2), { encoding: 'utf-8', mode: 0o600 });\n await rename(tmpPath, PROMO_PATH);\n\n return { success: true, expiresAt: redemption.expiresAt };\n}\n\n// ── Check if an active promo is in effect ──\n\nexport async function getActivePromo(): Promise<PromoRedemption | null> {\n try {\n const raw = await readFile(PROMO_PATH, 'utf-8');\n const file = JSON.parse(raw) as PromoFile;\n const now = Date.now();\n\n // Find the most recent non-expired redemption\n const active = file.redemptions\n .filter((r) => new Date(r.expiresAt).getTime() > now)\n .sort((a, b) => new Date(b.expiresAt).getTime() - new Date(a.expiresAt).getTime())[0];\n\n return active ?? null;\n } catch {\n return null;\n }\n}\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { Box, Text } from 'ink';\nimport { useViewInput } from '../hooks/use-view-input.js';\nimport { useRollbackStore } from '../stores/rollback-store.js';\nimport { useLicenseStore } from '../stores/license-store.js';\nimport { executeRollbackPlan } from '../lib/rollback/rollback-engine.js';\nimport { Loading, ErrorMessage } from '../components/common/loading.js';\nimport { ConfirmDialog } from '../components/common/confirm-dialog.js';\nimport { ProgressLog } from '../components/common/progress-log.js';\nimport { ResultBanner } from '../components/common/result-banner.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { SelectableRow } from '../components/common/selectable-row.js';\nimport { COLORS } from '../utils/colors.js';\nimport { GRADIENTS } from '../utils/gradient.js';\nimport { t, tp } from '../i18n/index.js';\nimport type { RollbackAction, RollbackPlan } from '../lib/rollback/types.js';\nimport { SPACING } from '../utils/spacing.js';\nimport { useVisibleRows } from '../hooks/use-visible-rows.js';\n\ntype Phase = 'list' | 'plan' | 'confirm' | 'executing' | 'result';\n\nfunction strategyLabel(action: RollbackAction): string {\n switch (action.strategy) {\n case 'versioned-formula': return t('rollback_strategy_versioned');\n case 'bottle-cache': return t('rollback_strategy_bottle');\n case 'pin-only': return t('rollback_strategy_pin');\n case 'unavailable': return t('rollback_strategy_unavailable');\n }\n}\n\nfunction actionColor(action: RollbackAction): string {\n if (action.strategy === 'unavailable') return COLORS.muted;\n if (action.action === 'remove') return COLORS.muted;\n if (action.action === 'downgrade') return COLORS.warning;\n if (action.action === 'install') return COLORS.success;\n return COLORS.info;\n}\n\nfunction actionPrefix(action: RollbackAction): string {\n if (action.strategy === 'unavailable' || action.action === 'remove') return '⊗';\n if (action.strategy === 'pin-only') return '📌';\n if (action.action === 'downgrade') return '⬇';\n return '⬆';\n}\n\nfunction PlanView({ plan }: { plan: RollbackPlan }) {\n const executableCount = plan.actions.filter((a) => a.strategy !== 'unavailable' && a.action !== 'remove').length;\n // Reserve title + label row + hint row + warning rows (cap 3).\n const reservedForWarnings = Math.min(plan.warnings.length, 3) * 2;\n const actionsBudget = useVisibleRows({\n reservedRows: 6 + reservedForWarnings,\n fallbackReservedRows: 14 + reservedForWarnings,\n minRows: 2,\n });\n const visibleActions = plan.actions.slice(0, actionsBudget);\n const hiddenActions = plan.actions.length - visibleActions.length;\n\n return (\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n <Box marginBottom={SPACING.xs}>\n <Text color={COLORS.text} bold>{plan.snapshotLabel} </Text>\n <Text color={COLORS.textSecondary}>{plan.snapshotDate}</Text>\n </Box>\n\n {plan.actions.length === 0 && (\n <ResultBanner status=\"success\" message={t('rollback_diff_empty')} />\n )}\n\n {visibleActions.map((a) => (\n <Box key={a.packageName + a.action}>\n <Text color={actionColor(a)}>{actionPrefix(a)} </Text>\n <Text color={actionColor(a)} bold>{a.packageName}</Text>\n {a.fromVersion !== '' && a.toVersion !== '' && (\n <Text color={COLORS.textSecondary}>{' '}{a.fromVersion} → {a.toVersion}</Text>\n )}\n {a.fromVersion === '' && a.toVersion !== '' && (\n <Text color={COLORS.textSecondary}> install {a.toVersion}</Text>\n )}\n {a.fromVersion !== '' && a.toVersion === '' && (\n <Text color={COLORS.textSecondary}> remove</Text>\n )}\n <Text color={COLORS.muted} dimColor> [{strategyLabel(a)}]</Text>\n </Box>\n ))}\n {hiddenActions > 0 && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreBelow', { count: hiddenActions })}</Text>\n )}\n\n {plan.warnings.slice(0, 3).map((w) => (\n <Box key={w} marginTop={SPACING.xs}>\n <Text color={COLORS.warning} wrap=\"wrap\">⚠ {w}</Text>\n </Box>\n ))}\n {plan.warnings.length > 3 && (\n <Text color={COLORS.textSecondary} dimColor> {t('common_andMore', { count: plan.warnings.length - 3 })}</Text>\n )}\n\n <Box marginTop={SPACING.xs}>\n {plan.canExecute ? (\n <Text color={COLORS.textSecondary}>\n enter:{t('rollback_confirm', { count: String(executableCount) })} esc:{t('hint_back')}\n </Text>\n ) : (\n <Text color={COLORS.muted}>{t('rollback_strategy_unavailable')} esc:{t('hint_back')}</Text>\n )}\n </Box>\n </Box>\n );\n}\n\nexport function RollbackView() {\n const isPro = useLicenseStore((s) => s.isPro);\n const { snapshots, loading, error, plan, planLoading, planError, fetchSnapshots, selectSnapshot, clearPlan } = useRollbackStore();\n\n const [cursor, setCursor] = useState(0);\n const [phase, setPhase] = useState<Phase>('list');\n const [streamLines, setStreamLines] = useState<string[]>([]);\n const [streamRunning, setStreamRunning] = useState(false);\n const [streamError, setStreamError] = useState<string | null>(null);\n const generatorRef = useRef<AsyncGenerator<string> | null>(null);\n const mountedRef = useRef(true);\n const snapshotRows = useVisibleRows({\n reservedRows: 6,\n fallbackReservedRows: 14,\n minRows: 1,\n });\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n void generatorRef.current?.return(undefined);\n };\n }, []);\n\n useEffect(() => { void fetchSnapshots(isPro()); }, []);\n\n const runRollback = useCallback(async (p: RollbackPlan) => {\n setPhase('executing');\n setStreamLines([]);\n setStreamError(null);\n setStreamRunning(true);\n\n const gen = executeRollbackPlan(p, isPro());\n generatorRef.current = gen;\n\n try {\n for await (const line of gen) {\n if (!mountedRef.current) break;\n setStreamLines((prev) => [...prev.slice(-99), line]);\n }\n } catch (err) {\n if (mountedRef.current) {\n setStreamError(err instanceof Error ? err.message : String(err));\n }\n } finally {\n generatorRef.current = null;\n if (mountedRef.current) {\n setStreamRunning(false);\n setPhase('result');\n }\n }\n }, [isPro]);\n\n useViewInput((input, key) => {\n if (phase === 'executing') return;\n\n if (phase === 'result') {\n if (key.escape || input === 'r') {\n setPhase('list');\n clearPlan();\n void fetchSnapshots(isPro());\n }\n return;\n }\n\n if (phase === 'confirm') return;\n\n if (phase === 'plan') {\n if (key.escape) { clearPlan(); setPhase('list'); return; }\n if (key.return && plan?.canExecute) { setPhase('confirm'); }\n return;\n }\n\n // phase === 'list'\n if (input === 'j' || key.downArrow) {\n setCursor((c) => Math.min(c + 1, Math.max(0, snapshots.length - 1)));\n } else if (input === 'k' || key.upArrow) {\n setCursor((c) => Math.max(c - 1, 0));\n } else if (key.return && snapshots[cursor]) {\n void selectSnapshot(snapshots[cursor]!, isPro());\n setPhase('plan');\n } else if (input === 'r' || input === '1') {\n void fetchSnapshots(isPro());\n }\n });\n\n if (loading) return <Loading message={t('rollback_select_snapshot')} />;\n if (error) return <ErrorMessage message={error} />;\n\n if (phase === 'executing') {\n return (\n <Box flexDirection=\"column\">\n <ProgressLog lines={streamLines} isRunning={streamRunning} title={t('rollback_executing')} />\n </Box>\n );\n }\n\n if (phase === 'result') {\n return (\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n <ResultBanner\n status={streamError ? 'error' : 'success'}\n message={streamError ? t('rollback_error', { error: streamError }) : t('rollback_success')}\n />\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.textSecondary}>r:{t('hint_refresh')} esc:{t('hint_back')}</Text>\n </Box>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\">\n <SectionHeader emoji=\"⏪\" title={t('rollback_title')} gradient={GRADIENTS.gold} />\n\n {snapshots.length === 0 && (\n <Box marginTop={SPACING.xs}>\n <ResultBanner status=\"info\" message={t('rollback_no_snapshots')} />\n </Box>\n )}\n\n {phase === 'list' && snapshots.length > 0 && (() => {\n const start = Math.max(0, cursor - Math.floor(snapshotRows / 2));\n const visible = snapshots.slice(start, start + snapshotRows);\n return (\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n <Text color={COLORS.textSecondary} dimColor>{t('rollback_select_snapshot')}</Text>\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n {start > 0 && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreAbove', { count: start })}</Text>\n )}\n {visible.map((s, vi) => {\n const i = start + vi;\n return (\n <SelectableRow key={s.capturedAt} isCurrent={i === cursor}>\n <Text bold={i === cursor} color={i === cursor ? COLORS.text : COLORS.muted}>\n {s.label ?? t('rollback_snapshot_auto')}\n </Text>\n <Text color={COLORS.textSecondary}>\n {' — '}{new Date(s.capturedAt).toLocaleString()}\n </Text>\n <Text color={COLORS.muted} dimColor>\n {' '}({tp('packages', s.formulae.length + s.casks.length)})\n </Text>\n </SelectableRow>\n );\n })}\n {start + snapshotRows < snapshots.length && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreBelow', { count: snapshots.length - start - snapshotRows })}</Text>\n )}\n </Box>\n </Box>\n );\n })()}\n\n {phase === 'plan' && (\n <Box flexDirection=\"column\">\n {planLoading && <Loading message={t('rollback_capturing')} />}\n {planError && <ErrorMessage message={planError} />}\n {plan && !planLoading && <PlanView plan={plan} />}\n </Box>\n )}\n\n {phase === 'confirm' && plan && (\n <Box marginTop={SPACING.xs}>\n <ConfirmDialog\n message={t('rollback_confirm', {\n count: String(plan.actions.filter((a) => a.strategy !== 'unavailable' && a.action !== 'remove').length),\n })}\n onConfirm={() => void runRollback(plan)}\n onCancel={() => setPhase('plan')}\n />\n </Box>\n )}\n </Box>\n );\n}\n","import { create } from 'zustand';\nimport type { BrewSnapshot } from '../lib/state-snapshot/snapshot.js';\nimport { loadSnapshots, buildRollbackPlan } from '../lib/rollback/rollback-engine.js';\nimport type { RollbackPlan } from '../lib/rollback/types.js';\n\ninterface RollbackState {\n snapshots: BrewSnapshot[];\n loading: boolean;\n error: string | null;\n selectedSnapshot: BrewSnapshot | null;\n plan: RollbackPlan | null;\n planLoading: boolean;\n planError: string | null;\n\n fetchSnapshots: (isPro: boolean) => Promise<void>;\n selectSnapshot: (s: BrewSnapshot | null, isPro: boolean) => Promise<void>;\n clearPlan: () => void;\n}\n\nexport const useRollbackStore = create<RollbackState>((set) => ({\n snapshots: [],\n loading: false,\n error: null,\n selectedSnapshot: null,\n plan: null,\n planLoading: false,\n planError: null,\n\n fetchSnapshots: async (isPro) => {\n if (!isPro) return;\n set({ loading: true, error: null });\n try {\n const snapshots = await loadSnapshots();\n set({ snapshots, loading: false });\n } catch (err) {\n set({ error: err instanceof Error ? err.message : String(err), loading: false });\n }\n },\n\n selectSnapshot: async (snapshot, isPro) => {\n if (!snapshot) {\n set({ selectedSnapshot: null, plan: null, planError: null });\n return;\n }\n set({ selectedSnapshot: snapshot, plan: null, planLoading: true, planError: null });\n try {\n const plan = await buildRollbackPlan(snapshot, isPro);\n set({ plan, planLoading: false });\n } catch (err) {\n set({ planError: err instanceof Error ? err.message : String(err), planLoading: false });\n }\n },\n\n clearPlan: () => set({ selectedSnapshot: null, plan: null, planError: null }),\n}));\n","import { readdir } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { captureSnapshot, loadSnapshots, saveSnapshot } from '../state-snapshot/snapshot.js';\nimport type { BrewSnapshot } from '../state-snapshot/snapshot.js';\nimport { diffSnapshots } from '../diff-engine/diff.js';\nimport { execBrew, streamBrew } from '../brew-cli.js';\nimport { logger } from '../../utils/logger.js';\nimport type { RollbackAction, RollbackPlan, RollbackStrategy } from './types.js';\n\nasync function detectStrategy(\n name: string,\n targetVersion: string,\n packageType: 'formula' | 'cask',\n): Promise<{ strategy: RollbackStrategy; versionedFormula?: string }> {\n // Casks cannot be restored to a specific version\n if (packageType === 'cask') {\n return { strategy: 'pin-only' };\n }\n\n // Try versioned formula (e.g. node@20)\n try {\n const major = targetVersion.split('.')[0] ?? '';\n if (major !== '' && !isNaN(parseInt(major, 10))) {\n const versionedFormula = `${name}@${major}`;\n await execBrew(['info', '--json=v2', versionedFormula]);\n return { strategy: 'versioned-formula', versionedFormula };\n }\n } catch {\n // Not available — fall through\n }\n\n // Try bottle cache\n try {\n const brewCache = (await execBrew(['--cache'])).trim();\n const downloadsDir = join(brewCache, 'downloads');\n const entries = await readdir(downloadsDir);\n const found = entries.some(\n (entry) => entry.includes(name) && entry.includes(targetVersion),\n );\n if (found) {\n return { strategy: 'bottle-cache' };\n }\n } catch {\n // Cache not readable — fall through\n }\n\n return { strategy: 'pin-only' };\n}\n\nexport async function buildRollbackPlan(\n snapshot: BrewSnapshot,\n isPro: boolean,\n): Promise<RollbackPlan> {\n if (!isPro) throw new Error('Pro license required');\n\n const current = await captureSnapshot();\n const diff = diffSnapshots(snapshot, current);\n\n const actions: RollbackAction[] = [];\n const warnings: string[] = [];\n\n // Packages that were upgraded (current > snapshot) → need downgrade\n for (const entry of diff.upgraded) {\n const type = entry.type;\n const { strategy, versionedFormula } = await detectStrategy(entry.name, entry.from, type);\n actions.push({\n packageName: entry.name,\n packageType: type,\n action: 'downgrade',\n fromVersion: entry.to, // current version\n toVersion: entry.from, // snapshot (target) version\n strategy,\n versionedFormula,\n });\n }\n\n // Packages that were downgraded (current < snapshot) → need to restore up\n for (const entry of diff.downgraded) {\n const type = entry.type;\n const { strategy, versionedFormula } = await detectStrategy(entry.name, entry.from, type);\n actions.push({\n packageName: entry.name,\n packageType: type,\n action: 'downgrade',\n fromVersion: entry.to, // current version\n toVersion: entry.from, // snapshot (target) version\n strategy,\n versionedFormula,\n });\n }\n\n // Packages added since snapshot (in current, not in snapshot) → would need removal\n // Security: never auto-remove. Mark as unavailable with warning.\n for (const entry of diff.added) {\n if (entry.type === 'tap') continue;\n const type = entry.type;\n actions.push({\n packageName: entry.name,\n packageType: type,\n action: 'remove',\n fromVersion: entry.version,\n toVersion: '',\n strategy: 'unavailable',\n });\n }\n\n // Packages removed since snapshot (in snapshot, not in current) → need re-install\n for (const entry of diff.removed) {\n if (entry.type === 'tap') continue;\n const type = entry.type;\n const { strategy, versionedFormula } = await detectStrategy(entry.name, entry.version, type);\n actions.push({\n packageName: entry.name,\n packageType: type,\n action: 'install',\n fromVersion: '',\n toVersion: entry.version,\n strategy,\n versionedFormula,\n });\n }\n\n // Build warnings\n const caskPinCount = actions.filter(\n (a) => a.packageType === 'cask' && a.action !== 'remove' && a.strategy === 'pin-only',\n ).length;\n if (caskPinCount > 0) {\n warnings.push(`${caskPinCount} cask(s) will be pinned only (version restoration not supported)`);\n }\n\n const canExecute = actions.some((a) => a.strategy !== 'unavailable');\n\n const snapshotLabel = snapshot.label ?? 'Auto';\n const snapshotDate = new Date(snapshot.capturedAt).toLocaleString();\n\n logger.debug('Built rollback plan', { actionCount: actions.length, canExecute });\n\n return {\n snapshotLabel,\n snapshotDate,\n actions,\n warnings,\n canExecute,\n };\n}\n\nexport async function* executeRollbackPlan(\n plan: RollbackPlan,\n isPro: boolean,\n): AsyncGenerator<string> {\n if (!isPro) throw new Error('Pro license required');\n\n for (const action of plan.actions) {\n if (action.strategy === 'unavailable') {\n yield `[skip] ${action.packageName}: cannot restore automatically — manual action required`;\n continue;\n }\n\n if (action.action === 'remove') {\n yield `[skip] ${action.packageName}: removal skipped for safety — remove manually if needed`;\n continue;\n }\n\n if (action.action === 'install') {\n if (action.strategy === 'pin-only') {\n yield `[warn] ${action.packageName}: cannot install specific version — skipping`;\n continue;\n }\n if (action.strategy === 'versioned-formula' && action.versionedFormula) {\n yield `[install] ${action.packageName} via ${action.versionedFormula}`;\n for await (const line of streamBrew(['install', action.versionedFormula])) {\n yield line;\n }\n continue;\n }\n if (action.strategy === 'bottle-cache') {\n yield `[install] ${action.packageName} from bottle cache`;\n for await (const line of streamBrew(['install', '--force-bottle', action.packageName])) {\n yield line;\n }\n continue;\n }\n continue;\n }\n\n // action === 'downgrade'\n if (action.strategy === 'versioned-formula' && action.versionedFormula) {\n yield `[downgrade] ${action.packageName}: ${action.fromVersion} → ${action.toVersion} via ${action.versionedFormula}`;\n for await (const line of streamBrew(['install', action.versionedFormula])) {\n yield line;\n }\n } else if (action.strategy === 'bottle-cache') {\n yield `[downgrade] ${action.packageName}: ${action.fromVersion} → ${action.toVersion} from bottle cache`;\n for await (const line of streamBrew(['install', '--force-bottle', action.packageName])) {\n yield line;\n }\n } else if (action.strategy === 'pin-only') {\n yield `[pin] ${action.packageName}: pinning at current version (target version not restorable)`;\n await execBrew(['pin', action.packageName]);\n yield `✓ Pinned ${action.packageName}`;\n }\n }\n\n // Capture post-rollback snapshot\n yield '[snapshot] Capturing post-rollback snapshot...';\n try {\n const postSnapshot = await captureSnapshot();\n await saveSnapshot(postSnapshot, 'post-rollback');\n yield '[snapshot] Snapshot saved.';\n } catch (err) {\n logger.warn('Failed to save post-rollback snapshot', { err });\n yield '[snapshot] Warning: could not save snapshot.';\n }\n}\n\nexport { loadSnapshots };\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { Box, Text } from 'ink';\nimport { useViewInput } from '../hooks/use-view-input.js';\nimport { TextInput } from '@inkjs/ui';\nimport { useBrewfileStore } from '../stores/brewfile-store.js';\nimport { useLicenseStore } from '../stores/license-store.js';\nimport { reconcile } from '../lib/brewfile/brewfile-manager.js';\nimport { Loading, ErrorMessage } from '../components/common/loading.js';\nimport { ProgressLog } from '../components/common/progress-log.js';\nimport { ResultBanner } from '../components/common/result-banner.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { ConfirmDialog } from '../components/common/confirm-dialog.js';\nimport { COLORS } from '../utils/colors.js';\nimport { GRADIENTS } from '../utils/gradient.js';\nimport { t } from '../i18n/index.js';\nimport type { DriftReport } from '../lib/brewfile/types.js';\nimport { SPACING } from '../utils/spacing.js';\n\ntype Phase = 'overview' | 'creating' | 'confirming-reconcile' | 'reconciling' | 'result';\n\n// ── DriftScore ────────────────────────────────────────────────────────────────\n\nfunction DriftScore({ score }: { score: number }) {\n const color = score >= 80 ? COLORS.success : score >= 50 ? COLORS.warning : COLORS.error;\n const bars = Math.round(score / 10);\n const filled = '▓'.repeat(bars);\n const empty = '░'.repeat(10 - bars);\n return (\n <Box>\n <Text color={color}>{filled}{empty}</Text>\n <Text color={color} bold> {score}% </Text>\n <Text color={COLORS.textSecondary}>{t('brewfile_compliant')}</Text>\n </Box>\n );\n}\n\n// ── DriftSummary ──────────────────────────────────────────────────────────────\n\nfunction DriftSummary({ drift }: { drift: DriftReport }) {\n return (\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n {drift.missingPackages.length > 0 && (\n <Box>\n <Text color={COLORS.error}>● </Text>\n <Text color={COLORS.error}>\n {t('brewfile_drift_missing', { count: drift.missingPackages.length })}\n </Text>\n <Text color={COLORS.textSecondary}>\n {': ' + drift.missingPackages.slice(0, 3).join(', ')}\n {drift.missingPackages.length > 3 ? '...' : ''}\n </Text>\n </Box>\n )}\n {drift.extraPackages.length > 0 && (\n <Box>\n <Text color={COLORS.warning}>● </Text>\n <Text color={COLORS.warning}>\n {t('brewfile_drift_extra', { count: drift.extraPackages.length })}\n </Text>\n </Box>\n )}\n {drift.wrongVersions.length > 0 && (\n <Box>\n <Text color={COLORS.info}>● </Text>\n <Text color={COLORS.info}>\n {t('brewfile_drift_wrong', { count: drift.wrongVersions.length })}\n </Text>\n </Box>\n )}\n {drift.missingPackages.length === 0 &&\n drift.extraPackages.length === 0 &&\n drift.wrongVersions.length === 0 && (\n <ResultBanner status=\"success\" message={t('brewfile_in_sync')} />\n )}\n </Box>\n );\n}\n\n// ── Main View ─────────────────────────────────────────────────────────────────\n\nexport function BrewfileView() {\n const isPro = useLicenseStore((s) => s.isPro);\n const { schema, drift, loading, driftLoading, error, load, createFromCurrent } = useBrewfileStore();\n\n const [phase, setPhase] = useState<Phase>('overview');\n const [streamLines, setStreamLines] = useState<string[]>([]);\n const [streamRunning, setStreamRunning] = useState(false);\n const [streamError, setStreamError] = useState<string | null>(null);\n const [resultMessage, setResultMessage] = useState('');\n const generatorRef = useRef<AsyncGenerator<string> | null>(null);\n const mountedRef = useRef(true);\n\n useEffect(() => {\n mountedRef.current = true;\n void load();\n return () => {\n mountedRef.current = false;\n void generatorRef.current?.return(undefined);\n };\n }, []);\n\n const startReconcile = useCallback(async () => {\n if (!schema) return;\n setPhase('reconciling');\n setStreamLines([]);\n setStreamError(null);\n setStreamRunning(true);\n\n const gen = reconcile(schema, isPro());\n generatorRef.current = gen;\n\n try {\n for await (const line of gen) {\n if (!mountedRef.current) break;\n setStreamLines((prev) => [...prev.slice(-99), line]);\n }\n if (mountedRef.current) {\n setResultMessage(t('brewfile_reconcile_success'));\n }\n } catch (err) {\n if (mountedRef.current) {\n const msg = err instanceof Error ? err.message : String(err);\n setStreamError(msg);\n setResultMessage(t('brewfile_reconcile_error', { error: msg }));\n }\n } finally {\n generatorRef.current = null;\n if (mountedRef.current) {\n setStreamRunning(false);\n setPhase('result');\n }\n }\n }, [schema, isPro]);\n\n useViewInput((input, key) => {\n if (phase === 'reconciling') return;\n if (phase === 'confirming-reconcile') return; // ConfirmDialog handles input\n\n if (phase === 'result') {\n if (key.escape || input === 'r') {\n setPhase('overview');\n void load();\n }\n return;\n }\n\n if (phase === 'creating') return; // TextInput handles input\n\n // phase === 'overview'\n if (input === 'n' || input === '1') {\n setPhase('creating');\n return;\n }\n if (input === 'r' || input === '2') {\n void load();\n return;\n }\n if (input === 'c' || input === '3') {\n const needsReconcile =\n drift && (\n drift.missingPackages.length > 0 ||\n drift.wrongVersions.length > 0\n );\n if (needsReconcile) {\n setPhase('confirming-reconcile');\n }\n return;\n }\n if (key.escape) {\n // back handled by global navigation\n }\n });\n\n if (loading) return <Loading message={t('loading_default')} />;\n if (error) return <ErrorMessage message={error} />;\n\n // ── Phase: confirming-reconcile ──\n if (phase === 'confirming-reconcile' && drift) {\n return (\n <ConfirmDialog\n message={t('confirm_brewfile_reconcile', {\n missing: String(drift.missingPackages.length),\n wrongVer: String(drift.wrongVersions.length),\n })}\n onConfirm={() => { void startReconcile(); }}\n onCancel={() => { setPhase('overview'); }}\n />\n );\n }\n\n // ── Phase: creating ──\n if (phase === 'creating') {\n return (\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n <SectionHeader emoji=\"📦\" title={t('brewfile_title')} gradient={GRADIENTS.ocean} />\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.textSecondary}>{t('brewfile_create_name')} </Text>\n <TextInput\n defaultValue=\"My Environment\"\n onSubmit={(value) => {\n const name = value.trim() || 'My Environment';\n setPhase('overview');\n void createFromCurrent(name).then(() => {\n // drift will auto-refresh via store\n });\n }}\n />\n </Box>\n </Box>\n );\n }\n\n // ── Phase: reconciling ──\n if (phase === 'reconciling') {\n return (\n <Box flexDirection=\"column\">\n <ProgressLog\n lines={streamLines}\n isRunning={streamRunning}\n title={t('brewfile_reconciling')}\n />\n </Box>\n );\n }\n\n // ── Phase: result ──\n if (phase === 'result') {\n return (\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n <ResultBanner\n status={streamError ? 'error' : 'success'}\n message={resultMessage}\n />\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.textSecondary}>r:{t('hint_refresh')} esc:{t('hint_back')}</Text>\n </Box>\n </Box>\n );\n }\n\n // ── Phase: overview ──\n return (\n <Box flexDirection=\"column\">\n <SectionHeader emoji=\"📦\" title={t('brewfile_title')} gradient={GRADIENTS.ocean} />\n\n {schema === null ? (\n <Box marginTop={SPACING.xs} flexDirection=\"column\">\n <ResultBanner status=\"info\" message={t('brewfile_no_brewfile')} />\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.textSecondary}>n:{t('hint_new')}</Text>\n </Box>\n </Box>\n ) : (\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n {/* Brewfile metadata */}\n <Box gap={SPACING.sm}>\n <Text color={COLORS.text} bold>{schema.meta.name}</Text>\n {schema.meta.description && (\n <Text color={COLORS.textSecondary}>{schema.meta.description}</Text>\n )}\n {schema.strictMode && (\n <Text color={COLORS.warning}>[{t('brewfile_strict_mode')}]</Text>\n )}\n </Box>\n\n {/* Package counts */}\n <Box gap={SPACING.md} marginTop={SPACING.xs}>\n <Text color={COLORS.sky}>\n {t('brewfile_formulae_count', { count: schema.formulae.length })}\n </Text>\n <Text color={COLORS.teal}>\n {t('brewfile_casks_count', { count: schema.casks.length })}\n </Text>\n </Box>\n\n {/* Drift score */}\n {driftLoading && (\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.muted}>{t('brewfile_computing_drift')}</Text>\n </Box>\n )}\n {drift && !driftLoading && (\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n <DriftScore score={drift.score} />\n <DriftSummary drift={drift} />\n </Box>\n )}\n\n {/* Keyboard hints */}\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.textSecondary}>\n r:{t('hint_refresh')}\n {drift && (drift.missingPackages.length > 0 || drift.wrongVersions.length > 0)\n ? ` c:${t('hint_reconcile')}`\n : ''}\n {' '}n:{t('hint_new')}\n </Text>\n </Box>\n </Box>\n )}\n </Box>\n );\n}\n","import React, { useCallback, useEffect, useState } from 'react';\nimport { Box, Text } from 'ink';\nimport { useViewInput } from '../hooks/use-view-input.js';\nimport { useSyncStore } from '../stores/sync-store.js';\nimport { useLicenseStore } from '../stores/license-store.js';\nimport { useNavigationStore } from '../stores/navigation-store.js';\nimport { ResultBanner } from '../components/common/result-banner.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { SelectableRow } from '../components/common/selectable-row.js';\nimport { Loading } from '../components/common/loading.js';\nimport { ConfirmDialog } from '../components/common/confirm-dialog.js';\nimport { COLORS } from '../utils/colors.js';\nimport { GRADIENTS } from '../utils/gradient.js';\nimport { t } from '../i18n/index.js';\nimport type { SyncConflict } from '../lib/sync/types.js';\nimport { SPACING } from '../utils/spacing.js';\nimport { useVisibleRows } from '../hooks/use-visible-rows.js';\n\ntype Phase = 'overview' | 'confirming-sync' | 'syncing' | 'conflicts' | 'confirming-apply' | 'result';\n\ntype ConflictResolution = 'use-local' | 'use-remote' | 'pending';\n\ninterface ConflictEntry {\n conflict: SyncConflict;\n resolution: ConflictResolution;\n}\n\nfunction OverviewSection({\n config,\n lastResult,\n conflicts,\n onSyncNow: _onSyncNow,\n onGoToConflicts: _onGoToConflicts,\n}: {\n config: ReturnType<typeof useSyncStore.getState>['config'];\n lastResult: ReturnType<typeof useSyncStore.getState>['lastResult'];\n conflicts: SyncConflict[];\n onSyncNow: () => void;\n onGoToConflicts: () => void;\n}) {\n const hasConflicts = conflicts.length > 0;\n const showComplianceHint = !hasConflicts && !!lastResult?.success;\n\n return (\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n {config ? (\n <>\n <Box marginBottom={SPACING.xs}>\n <Text color={COLORS.textSecondary}>{t('sync_machine', { name: config.machineName })}</Text>\n </Box>\n {config.lastSync && (\n <Box marginBottom={SPACING.xs}>\n <Text color={COLORS.textSecondary}>\n {t('sync_last_sync', { date: new Date(config.lastSync).toLocaleString() })}\n </Text>\n </Box>\n )}\n {hasConflicts ? (\n <ResultBanner\n status=\"error\"\n message={t('sync_status_conflict', { count: String(conflicts.length) })}\n />\n ) : lastResult?.success ? (\n <ResultBanner status=\"success\" message={t('sync_status_ok')} />\n ) : null}\n </>\n ) : (\n <Box marginBottom={SPACING.xs}>\n <Text color={COLORS.textSecondary}>{t('sync_disabled')}</Text>\n </Box>\n )}\n\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.textSecondary}>\n {'s'}<Text color={COLORS.gold}>:{t('hint_sync')}</Text>\n {hasConflicts && (\n <>\n {' c'}<Text color={COLORS.gold}>:{t('hint_conflict')}</Text>\n </>\n )}\n {showComplianceHint && (\n <>\n {' c'}<Text color={COLORS.gold}>:{t('hint_check_compliance')}</Text>\n </>\n )}\n </Text>\n </Box>\n </Box>\n );\n}\n\nfunction ConflictsList({\n entries,\n cursor,\n}: {\n entries: ConflictEntry[];\n cursor: number;\n}) {\n // Each conflict entry uses ~4 rows. Pick window from available rows / 4.\n const availableRows = useVisibleRows({\n reservedRows: 8,\n fallbackReservedRows: 14,\n minRows: 4,\n });\n const perEntryRows = 4;\n const maxEntries = Math.max(1, Math.floor(availableRows / perEntryRows));\n const start = Math.max(0, cursor - Math.floor(maxEntries / 2));\n const visible = entries.slice(start, start + maxEntries);\n return (\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n {start > 0 && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreAbove', { count: start })}</Text>\n )}\n {visible.map((entry, vi) => {\n const i = start + vi;\n const { conflict, resolution } = entry;\n const isActive = i === cursor;\n return (\n <Box key={`${conflict.packageName}-${conflict.remoteMachine}`} flexDirection=\"column\" marginBottom={SPACING.xs}>\n <SelectableRow isCurrent={isActive}>\n <Text bold color={isActive ? COLORS.text : COLORS.textSecondary}>\n {t('sync_conflict_title', { package: conflict.packageName })}\n </Text>\n <Text color={COLORS.muted}> ({conflict.packageType})</Text>\n </SelectableRow>\n <Box marginLeft={SPACING.sm} flexDirection=\"column\">\n <Text\n color={resolution === 'use-local' ? COLORS.success : COLORS.textSecondary}\n >\n {'l '}{t('sync_conflict_local', { version: conflict.localVersion })}\n {resolution === 'use-local' && ' ✓'}\n </Text>\n <Text\n color={resolution === 'use-remote' ? COLORS.success : COLORS.textSecondary}\n >\n {'r '}{t('sync_conflict_remote', { machine: conflict.remoteMachine, version: conflict.remoteVersion })}\n {resolution === 'use-remote' && ' ✓'}\n </Text>\n </Box>\n </Box>\n );\n })}\n {start + maxEntries < entries.length && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreBelow', { count: entries.length - start - maxEntries })}</Text>\n )}\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.textSecondary}>\n j/k:{t('hint_navigate')} l:{t('sync_conflict_use_local')} r:{t('sync_conflict_use_remote')} enter:{t('hint_apply')} esc:{t('hint_back')}\n </Text>\n </Box>\n </Box>\n );\n}\n\nexport function SyncView() {\n const isPro = useLicenseStore((s) => s.isPro);\n const navigate = useNavigationStore((s) => s.navigate);\n const { config, lastResult, conflicts, loading, error, initialize, syncNow, resolveConflicts } =\n useSyncStore();\n\n const [phase, setPhase] = useState<Phase>('overview');\n const [syncError, setSyncError] = useState<string | null>(null);\n const [conflictEntries, setConflictEntries] = useState<ConflictEntry[]>([]);\n const [cursor, setCursor] = useState(0);\n\n useEffect(() => {\n void initialize(isPro());\n }, []);\n\n // When store conflicts change, populate entries\n useEffect(() => {\n if (conflicts.length > 0) {\n setConflictEntries(\n conflicts.map((c) => ({ conflict: c, resolution: 'pending' as ConflictResolution })),\n );\n }\n }, [conflicts]);\n\n const handleSyncNow = useCallback(async () => {\n setPhase('syncing');\n setSyncError(null);\n await syncNow(isPro());\n // After sync, check for conflicts or success\n const state = useSyncStore.getState();\n if (state.conflicts.length > 0) {\n setPhase('conflicts');\n } else if (state.error) {\n setSyncError(state.error);\n setPhase('result');\n } else {\n setPhase('result');\n }\n }, [isPro, syncNow]);\n\n const handleApplyResolutions = useCallback(async () => {\n const pending = conflictEntries.filter((e) => e.resolution === 'pending');\n if (pending.length > 0) return; // All must be resolved before applying\n\n const resolutions = conflictEntries.map((e) => ({\n conflict: e.conflict,\n resolution: e.resolution as 'use-local' | 'use-remote',\n }));\n\n await resolveConflicts(resolutions);\n setPhase('result');\n }, [conflictEntries, resolveConflicts]);\n\n useViewInput((input, key) => {\n if (phase === 'syncing') return;\n if (phase === 'confirming-sync' || phase === 'confirming-apply') return;\n\n if (phase === 'result') {\n if (key.escape || input === 'r') {\n setPhase('overview');\n setSyncError(null);\n void initialize(isPro());\n }\n return;\n }\n\n if (phase === 'conflicts') {\n if (key.escape) { setPhase('overview'); return; }\n\n if (input === 'j' || key.downArrow) {\n setCursor((c) => Math.min(c + 1, conflictEntries.length - 1));\n return;\n }\n if (input === 'k' || key.upArrow) {\n setCursor((c) => Math.max(c - 1, 0));\n return;\n }\n\n if (input === 'l') {\n setConflictEntries((prev) =>\n prev.map((e, i) => (i === cursor ? { ...e, resolution: 'use-local' } : e)),\n );\n return;\n }\n if (input === 'r') {\n setConflictEntries((prev) =>\n prev.map((e, i) => (i === cursor ? { ...e, resolution: 'use-remote' } : e)),\n );\n return;\n }\n\n if (key.return) {\n const pending = conflictEntries.filter((e) => e.resolution === 'pending');\n if (pending.length === 0) setPhase('confirming-apply');\n return;\n }\n }\n\n // phase === 'overview'\n if (input === 's' || input === '1') {\n setPhase('confirming-sync');\n return;\n }\n if ((input === 'c' || input === '3') && conflicts.length > 0) {\n setCursor(0);\n setPhase('conflicts');\n return;\n }\n if ((input === 'c' || input === '3') && lastResult?.success) {\n navigate('compliance');\n return;\n }\n if (input === 'r' || input === '2') {\n void initialize(isPro());\n return;\n }\n });\n\n if (phase === 'confirming-sync') {\n return (\n <ConfirmDialog\n message={t('confirm_sync_now')}\n onConfirm={() => { void handleSyncNow(); }}\n onCancel={() => { setPhase('overview'); }}\n />\n );\n }\n\n if (phase === 'confirming-apply') {\n return (\n <ConfirmDialog\n message={t('confirm_sync_apply', { count: String(conflictEntries.length) })}\n onConfirm={() => { void handleApplyResolutions(); }}\n onCancel={() => { setPhase('conflicts'); }}\n />\n );\n }\n\n if (phase === 'syncing' || loading) {\n return <Loading message={t('sync_syncing')} />;\n }\n\n if (phase === 'result') {\n const isError = !!(syncError ?? error);\n return (\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n <SectionHeader emoji=\"🔄\" title={t('sync_title')} gradient={GRADIENTS.gold} />\n <Box marginTop={SPACING.xs}>\n <ResultBanner\n status={isError ? 'error' : 'success'}\n message={\n isError\n ? t('sync_error', { error: syncError ?? error ?? '' })\n : t('sync_success')\n }\n />\n </Box>\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.textSecondary}>r:{t('hint_refresh')} esc:{t('hint_back')}</Text>\n </Box>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\">\n <SectionHeader emoji=\"🔄\" title={t('sync_title')} gradient={GRADIENTS.gold} />\n\n {error && phase === 'overview' && (\n <Box marginTop={SPACING.xs}>\n <ResultBanner status=\"error\" message={t('sync_error', { error })} />\n </Box>\n )}\n\n {phase === 'overview' && (\n <OverviewSection\n config={config}\n lastResult={lastResult}\n conflicts={conflicts}\n onSyncNow={() => void handleSyncNow()}\n onGoToConflicts={() => { setCursor(0); setPhase('conflicts'); }}\n />\n )}\n\n {phase === 'conflicts' && (\n <Box flexDirection=\"column\">\n <SectionHeader emoji=\"⚠\" title={t('sync_status_conflict', { count: String(conflictEntries.length) })} gradient={GRADIENTS.gold} />\n <ConflictsList entries={conflictEntries} cursor={cursor} />\n </Box>\n )}\n </Box>\n );\n}\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { Box, Text } from 'ink';\nimport { useViewInput } from '../hooks/use-view-input.js';\nimport { TextInput } from '@inkjs/ui';\nimport { useComplianceStore } from '../stores/compliance-store.js';\nimport { useLicenseStore } from '../stores/license-store.js';\nimport { remediateViolations } from '../lib/compliance/compliance-remediator.js';\nimport { exportReport } from '../lib/compliance/policy-io.js';\nimport { ResultBanner } from '../components/common/result-banner.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { ProgressLog } from '../components/common/progress-log.js';\nimport { Loading } from '../components/common/loading.js';\nimport { ConfirmDialog } from '../components/common/confirm-dialog.js';\nimport { COLORS } from '../utils/colors.js';\nimport { GRADIENTS } from '../utils/gradient.js';\nimport { t } from '../i18n/index.js';\nimport { DATA_DIR } from '../lib/data-dir.js';\nimport { join } from 'node:path';\nimport type { ComplianceReport, ComplianceViolation } from '../lib/compliance/types.js';\nimport { SPACING } from '../utils/spacing.js';\nimport { useVisibleRows } from '../hooks/use-visible-rows.js';\n\ntype Phase = 'overview' | 'importing' | 'confirming-remediate' | 'remediating' | 'result';\n\nfunction ComplianceScore({ report }: { report: ComplianceReport }) {\n const color =\n report.score >= 80 ? COLORS.success : report.score >= 50 ? COLORS.warning : COLORS.error;\n const bars = Math.round(report.score / 10);\n\n return (\n <Box flexDirection=\"column\" marginBottom={SPACING.xs}>\n <Box>\n <Text color={color}>{'▓'.repeat(bars)}{'░'.repeat(10 - bars)}</Text>\n <Text color={color} bold> {report.score}%</Text>\n <Text color={COLORS.textSecondary}> {t('compliance_score', { score: String(report.score) })}</Text>\n </Box>\n <Text color={COLORS.muted} dimColor>\n {t('compliance_policy_name', { name: report.policyName })} · {t('compliance_machine', { name: report.machineName })}\n </Text>\n </Box>\n );\n}\n\nfunction ViolationItem({ violation }: { violation: ComplianceViolation }) {\n const color = violation.severity === 'error' ? COLORS.error : COLORS.warning;\n const prefix = violation.severity === 'error' ? '✗' : '⚠';\n\n return (\n <Box marginBottom={SPACING.none}>\n <Text color={color}>{prefix} </Text>\n <Text color={color} wrap=\"wrap\">{violation.detail}</Text>\n </Box>\n );\n}\n\nfunction ViolationList({ violations }: { violations: ComplianceViolation[] }) {\n const errors = violations.filter((v) => v.severity === 'error');\n const warnings = violations.filter((v) => v.severity === 'warning');\n // Reserve title + score (~5 rows) + section headers (2) + key hints (2).\n const totalRows = useVisibleRows({\n reservedRows: 11,\n fallbackReservedRows: 18,\n minRows: 2,\n });\n // Split rows proportionally between the two sections; +1 per section header.\n const total = errors.length + warnings.length;\n const errorBudget = total === 0\n ? 0\n : Math.min(errors.length, Math.max(1, Math.round((errors.length / total) * totalRows)));\n const warningBudget = Math.max(0, totalRows - errorBudget);\n const visibleErrors = errors.slice(0, errorBudget);\n const visibleWarnings = warnings.slice(0, warningBudget);\n const errorsHidden = errors.length - visibleErrors.length;\n const warningsHidden = warnings.length - visibleWarnings.length;\n\n return (\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n {errors.length > 0 && (\n <Box flexDirection=\"column\" marginBottom={SPACING.xs}>\n <Text color={COLORS.error} bold>{t('compliance_violations', { count: String(errors.length) })} (errors)</Text>\n {visibleErrors.map((v) => (\n <ViolationItem key={`${v.type}-${v.packageName}`} violation={v} />\n ))}\n {errorsHidden > 0 && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreBelow', { count: errorsHidden })}</Text>\n )}\n </Box>\n )}\n {warnings.length > 0 && (\n <Box flexDirection=\"column\">\n <Text color={COLORS.warning} bold>{t('compliance_violations', { count: String(warnings.length) })} (warnings)</Text>\n {visibleWarnings.map((v) => (\n <ViolationItem key={`${v.type}-${v.packageName}`} violation={v} />\n ))}\n {warningsHidden > 0 && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreBelow', { count: warningsHidden })}</Text>\n )}\n </Box>\n )}\n </Box>\n );\n}\n\nexport function ComplianceView() {\n const isPro = useLicenseStore((s) => s.isPro);\n const { policy, report, loading, error, importPolicy, runCheck } =\n useComplianceStore();\n\n const [phase, setPhase] = useState<Phase>('overview');\n const [resultMessage, setResultMessage] = useState<{ ok: boolean; text: string } | null>(null);\n const [streamLines, setStreamLines] = useState<string[]>([]);\n const [streamRunning, setStreamRunning] = useState(false);\n const generatorRef = useRef<AsyncGenerator<string> | null>(null);\n const mountedRef = useRef(true);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n void generatorRef.current?.return(undefined);\n };\n }, []);\n\n const handleImportSubmit = useCallback(\n async (filePath: string) => {\n if (!filePath.trim()) { setPhase('overview'); return; }\n await importPolicy(filePath.trim(), isPro());\n // importPolicy actualiza el store; runCheck si no hubo error\n const state = useComplianceStore.getState();\n if (!state.error && state.policy) {\n await runCheck(isPro());\n }\n setPhase('overview');\n },\n [isPro, importPolicy, runCheck],\n );\n\n const handleRecheck = useCallback(() => {\n void runCheck(isPro());\n }, [isPro, runCheck]);\n\n const handleExport = useCallback(async () => {\n if (!report) return;\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const outputPath = join(DATA_DIR, `compliance-report-${timestamp}.json`);\n try {\n await exportReport(report, outputPath);\n setResultMessage({ ok: true, text: t('compliance_export_done', { path: outputPath }) });\n setPhase('result');\n } catch (err) {\n setResultMessage({\n ok: false,\n text: t('compliance_remediate_error', { error: err instanceof Error ? err.message : String(err) }),\n });\n setPhase('result');\n }\n }, [report]);\n\n const handleRemediate = useCallback(async () => {\n if (!report) return;\n const actionable = report.violations.filter(\n (v) => v.type === 'missing' || v.type === 'wrong-version',\n );\n if (actionable.length === 0) return;\n\n setPhase('remediating');\n setStreamLines([]);\n setStreamRunning(true);\n\n const gen = remediateViolations(actionable, isPro());\n generatorRef.current = gen;\n\n try {\n for await (const line of gen) {\n if (!mountedRef.current) break;\n setStreamLines((prev) => [...prev.slice(-99), line]);\n }\n if (mountedRef.current) {\n setResultMessage({ ok: true, text: t('compliance_remediate_success') });\n // Re-check after remediation\n await runCheck(isPro());\n }\n } catch (err) {\n if (mountedRef.current) {\n setResultMessage({\n ok: false,\n text: t('compliance_remediate_error', { error: err instanceof Error ? err.message : String(err) }),\n });\n }\n } finally {\n generatorRef.current = null;\n if (mountedRef.current) {\n setStreamRunning(false);\n setPhase('result');\n }\n }\n }, [report, isPro, runCheck]);\n\n useViewInput((input, key) => {\n if (phase === 'remediating' || phase === 'importing') return;\n if (phase === 'confirming-remediate') return;\n\n if (phase === 'result') {\n if (key.escape || input === 'r') {\n setPhase('overview');\n setResultMessage(null);\n }\n return;\n }\n\n // phase === 'overview'\n if (input === 'i' || input === '2') {\n setPhase('importing');\n return;\n }\n if ((input === 'r' || input === '1') && policy) {\n handleRecheck();\n return;\n }\n if ((input === 'e' || input === '3') && report) {\n void handleExport();\n return;\n }\n if ((input === 'c' || input === '4') && report) {\n const actionable = report.violations.filter(\n (v) => v.type === 'missing' || v.type === 'wrong-version',\n );\n if (actionable.length > 0) {\n setPhase('confirming-remediate');\n }\n return;\n }\n });\n\n if (phase === 'confirming-remediate' && report) {\n const actionable = report.violations.filter(\n (v) => v.type === 'missing' || v.type === 'wrong-version',\n );\n return (\n <ConfirmDialog\n message={t('confirm_compliance_remediate', { count: String(actionable.length) })}\n onConfirm={() => { void handleRemediate(); }}\n onCancel={() => { setPhase('overview'); }}\n />\n );\n }\n\n if (phase === 'remediating' || (loading && phase !== 'importing')) {\n if (phase === 'remediating') {\n return (\n <Box flexDirection=\"column\">\n <SectionHeader emoji=\"🔍\" title={t('compliance_title')} gradient={GRADIENTS.gold} />\n <Box marginTop={SPACING.xs}>\n <ProgressLog lines={streamLines} isRunning={streamRunning} title={t('compliance_remediating')} />\n </Box>\n </Box>\n );\n }\n return <Loading message={t('compliance_title')} />;\n }\n\n if (phase === 'result' && resultMessage) {\n return (\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n <SectionHeader emoji=\"🔍\" title={t('compliance_title')} gradient={GRADIENTS.gold} />\n <Box marginTop={SPACING.xs}>\n <ResultBanner\n status={resultMessage.ok ? 'success' : 'error'}\n message={resultMessage.text}\n />\n </Box>\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.textSecondary}>r:{t('hint_refresh')} esc:{t('hint_back')}</Text>\n </Box>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\">\n <SectionHeader emoji=\"🔍\" title={t('compliance_title')} gradient={GRADIENTS.gold} />\n\n {error && (\n <Box marginTop={SPACING.xs}>\n <ResultBanner status=\"error\" message={t('compliance_import_error', { error })} />\n </Box>\n )}\n\n {phase === 'importing' && (\n <Box marginTop={SPACING.xs} flexDirection=\"column\">\n <Text color={COLORS.textSecondary}>{t('compliance_import_prompt')}</Text>\n <Box marginTop={SPACING.xs}>\n <TextInput\n defaultValue=\"\"\n onSubmit={(val) => { void handleImportSubmit(val); }}\n />\n </Box>\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.muted} dimColor>esc:{t('hint_back')}</Text>\n </Box>\n </Box>\n )}\n\n {phase === 'overview' && (\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n {!policy ? (\n <Box flexDirection=\"column\">\n <Text color={COLORS.textSecondary}>{t('compliance_no_policy')}</Text>\n </Box>\n ) : (\n <Box flexDirection=\"column\">\n <Text color={COLORS.textSecondary} bold>\n {t('compliance_policy_by', { maintainer: policy.meta.maintainer })}\n </Text>\n\n {report ? (\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n <ComplianceScore report={report} />\n {report.compliant ? (\n <ResultBanner status=\"success\" message={t('compliance_ok')} />\n ) : (\n <ViolationList violations={report.violations} />\n )}\n </Box>\n ) : (\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.muted} dimColor>{t('compliance_press_r_hint')}</Text>\n </Box>\n )}\n </Box>\n )}\n\n <Box marginTop={SPACING.sm} flexWrap=\"wrap\">\n <Text color={COLORS.textSecondary}>\n i:{t('hint_import')}\n {policy && <Text> r:{t('hint_scan')}</Text>}\n {report && <Text> e:{t('hint_export')}</Text>}\n {report && report.violations.some((v) => v.type === 'missing' || v.type === 'wrong-version') && (\n <Text> c:{t('hint_clean')}</Text>\n )}\n {' q:'}{t('hint_quit')}\n </Text>\n </Box>\n </Box>\n )}\n </Box>\n );\n}\n","import { streamBrew } from '../brew-cli.js';\nimport type { ComplianceViolation } from './types.js';\n\nexport async function* remediateViolations(\n violations: ComplianceViolation[],\n isPro: boolean,\n): AsyncGenerator<string> {\n if (!isPro) throw new Error('Pro license required');\n\n let installed = 0;\n let upgraded = 0;\n let skipped = 0;\n\n for (const v of violations) {\n if (v.type === 'missing') {\n yield `Installing ${v.packageName}...`;\n try {\n for await (const line of streamBrew(['install', v.packageName])) {\n yield line;\n }\n installed++;\n } catch (err) {\n yield ` ✗ Failed to install ${v.packageName}: ${err instanceof Error ? err.message : String(err)}`;\n skipped++;\n }\n } else if (v.type === 'wrong-version') {\n yield `Upgrading ${v.packageName}${v.required ? ` to ${v.required}+` : ''}...`;\n try {\n for await (const line of streamBrew(['upgrade', v.packageName])) {\n yield line;\n }\n upgraded++;\n } catch (err) {\n yield ` ✗ Failed to upgrade ${v.packageName}: ${err instanceof Error ? err.message : String(err)}`;\n skipped++;\n }\n } else if (v.type === 'forbidden') {\n yield ` ⚠ Forbidden package detected: ${v.packageName} — manual removal required`;\n skipped++;\n } else if (v.type === 'extra') {\n yield ` ⚠ Extra package in strict mode: ${v.packageName} — manual removal required`;\n skipped++;\n }\n }\n\n yield `Remediation complete: ${installed} installed, ${upgraded} upgraded, ${skipped} skipped (manual action required)`;\n}\n","import { readFile } from 'node:fs/promises';\nimport { homedir, platform, release, arch } from 'node:os';\nimport { join } from 'node:path';\nimport { logger } from '../utils/logger.js';\nimport { getMachineId } from './data-dir.js';\n\n// Opt-in crash reporting. The TUI never sends data unless the user has\n// configured an endpoint, either via the env var below or via the persisted\n// config file at ~/.brew-tui/crash-reporter.json. The dashboard backend is\n// expected to live on the user's own infrastructure (NAS).\nconst ENDPOINT_ENV = 'BREW_TUI_CRASH_ENDPOINT';\nconst TOKEN_ENV = 'BREW_TUI_CRASH_TOKEN';\nconst CONFIG_PATH = join(homedir(), '.brew-tui', 'crash-reporter.json');\nconst POST_TIMEOUT_MS = 5_000;\n\ninterface CrashReporterConfig {\n endpoint: string | null;\n token: string | null;\n enabled: boolean;\n}\n\ninterface CrashReport {\n app: 'brew-tui';\n version: string;\n platform: string;\n os: string;\n arch: string;\n machineId: string;\n timestamp: string;\n level: 'fatal' | 'error';\n message: string;\n stack: string | null;\n context: Record<string, unknown>;\n}\n\nlet _installed = false;\n\nasync function loadConfigFromDisk(): Promise<CrashReporterConfig> {\n try {\n const raw = await readFile(CONFIG_PATH, 'utf-8');\n const parsed = JSON.parse(raw) as Partial<CrashReporterConfig>;\n return {\n endpoint: typeof parsed.endpoint === 'string' ? parsed.endpoint : null,\n token: typeof parsed.token === 'string' ? parsed.token : null,\n enabled: parsed.enabled === true,\n };\n } catch {\n return { endpoint: null, token: null, enabled: false };\n }\n}\n\nasync function resolveConfig(): Promise<CrashReporterConfig> {\n const envEndpoint = process.env[ENDPOINT_ENV]?.trim();\n const envToken = process.env[TOKEN_ENV]?.trim();\n if (envEndpoint) {\n return { endpoint: envEndpoint, token: envToken ?? null, enabled: true };\n }\n return loadConfigFromDisk();\n}\n\nfunction isHttpsOrLocal(url: string): boolean {\n try {\n const parsed = new URL(url);\n if (parsed.protocol === 'https:') return true;\n // Allow plain http only for loopback/LAN destinations (NAS).\n if (parsed.protocol === 'http:') {\n const host = parsed.hostname;\n return /^(localhost|127\\.\\d+\\.\\d+\\.\\d+|10\\.|192\\.168\\.|172\\.(1[6-9]|2\\d|3[0-1])\\.|::1$)/i.test(host);\n }\n return false;\n } catch {\n return false;\n }\n}\n\nasync function postReport(report: CrashReport, config: CrashReporterConfig): Promise<void> {\n if (!config.endpoint || !isHttpsOrLocal(config.endpoint)) return;\n try {\n await fetch(config.endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(config.token ? { 'Authorization': `Bearer ${config.token}` } : {}),\n },\n body: JSON.stringify(report),\n signal: AbortSignal.timeout(POST_TIMEOUT_MS),\n });\n } catch (err) {\n // Never let the reporter itself crash the host process.\n logger.warn('crash-reporter: POST failed', { error: String(err) });\n }\n}\n\nfunction buildReport(level: 'fatal' | 'error', err: unknown, context: Record<string, unknown>, machineId: string, version: string): CrashReport {\n const message = err instanceof Error ? err.message : String(err);\n const stack = err instanceof Error && typeof err.stack === 'string' ? err.stack : null;\n return {\n app: 'brew-tui',\n version,\n platform: platform(),\n os: release(),\n arch: arch(),\n machineId,\n timestamp: new Date().toISOString(),\n level,\n message,\n stack,\n context,\n };\n}\n\n/**\n * Manually report a non-fatal error. No-op if reporting is not enabled.\n */\nexport async function reportError(err: unknown, context: Record<string, unknown> = {}): Promise<void> {\n const config = await resolveConfig();\n if (!config.enabled || !config.endpoint) return;\n const machineId = await getMachineId();\n const version = typeof process.env.APP_VERSION === 'string' ? process.env.APP_VERSION : 'unknown';\n await postReport(buildReport('error', err, context, machineId, version), config);\n}\n\n/**\n * Install global handlers for uncaughtException / unhandledRejection.\n * No-op when the reporter is not enabled. Safe to call multiple times.\n */\nexport async function installCrashReporter(): Promise<void> {\n if (_installed) return;\n const config = await resolveConfig();\n if (!config.enabled || !config.endpoint) return;\n _installed = true;\n\n const machineId = await getMachineId();\n const version = typeof process.env.APP_VERSION === 'string' ? process.env.APP_VERSION : 'unknown';\n\n process.on('uncaughtException', (err) => {\n void postReport(buildReport('fatal', err, { kind: 'uncaughtException' }, machineId, version), config);\n });\n\n process.on('unhandledRejection', (reason) => {\n void postReport(buildReport('error', reason, { kind: 'unhandledRejection' }, machineId, version), config);\n });\n\n logger.info('crash-reporter: enabled', { endpoint: config.endpoint });\n}\n"],"mappings":"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","names":["rm","useEffect","useState","Box","Text","t","GradientText","useEffect","useState","Text","jsx","jsx","Text","React","Box","Text","Fragment","jsx","jsxs","Text","Box","React","useEffect","useState","useState","useEffect","jsx","jsx","jsxs","Box","create","create","create","useEffect","Box","Text","useInput","useInput","jsx","jsxs","useEffect","Box","Text","Box","Text","jsx","jsxs","Box","Text","useEffect","useMemo","Box","Text","create","cached","create","create","create","create","create","create","create","create","create","Box","Text","jsx","jsxs","Box","Text","Box","Text","jsx","jsxs","Box","Text","Text","jsxs","Text","Box","Text","jsx","jsxs","Box","Text","Text","Fragment","jsx","jsxs","Text","jsx","jsxs","Box","Text","useEffect","useMemo","useState","useMemo","useEffect","useRef","Box","Text","useState","useEffect","useState","useRef","useEffect","appendEntry","useState","setError","useRef","useEffect","captureSnapshot","saveSnapshot","Box","Text","jsx","jsxs","Box","Text","useEffect","Box","Text","useInput","jsx","jsxs","useEffect","useInput","Box","Text","Box","Text","Spinner","jsx","jsxs","Box","Spinner","Text","Box","Text","jsx","Box","Text","Box","Text","jsx","jsxs","Box","Text","jsx","jsxs","useRef","useState","useEffect","useMemo","t","Box","Text","useState","useCallback","useEffect","useRef","Box","Text","TextInput","jsx","jsxs","useState","useRef","useEffect","useCallback","Box","Text","TextInput","useEffect","useMemo","useRef","useState","Box","Text","jsx","jsxs","Box","Text","useState","useRef","useEffect","useMemo","useEffect","useRef","useState","Box","Text","Fragment","jsx","jsxs","useState","setLoading","setError","useRef","useEffect","isInstalled","Text","Box","useEffect","useRef","useState","Box","Text","jsx","jsxs","serviceAction","useState","useRef","useEffect","Box","Text","useEffect","useRef","useState","Box","Text","jsx","jsxs","useState","useRef","useEffect","Box","Text","useEffect","useRef","useState","Box","create","writeFile","writeFile","PKG_PATTERN","create","Box","Text","jsx","jsxs","Box","Text","Box","Text","jsx","jsxs","Box","Text","Box","Text","TextInput","jsx","jsxs","Box","Text","TextInput","Box","Text","TextInput","jsx","jsxs","Box","Text","TextInput","jsx","jsxs","loadProfile","deleteProfile","updateProfile","useState","importProfile","useRef","useEffect","Box","useEffect","useRef","useState","Box","Text","create","create","jsx","jsxs","useState","useRef","useEffect","Box","Text","useEffect","useState","useMemo","Box","Text","create","create","jsx","jsxs","clearHistory","useState","useEffect","useMemo","Box","Text","useEffect","useState","Box","Text","jsx","jsxs","useState","useEffect","Box","Text","useState","Box","Text","TextInput","readFile","writeFile","rename","join","join","readFile","writeFile","rename","Fragment","jsx","jsxs","deactivate","revalidate","useState","Box","Text","TextInput","useCallback","useEffect","useRef","useState","Box","Text","create","readdir","join","join","readdir","create","jsx","jsxs","Box","Text","useState","useRef","useEffect","useCallback","useCallback","useEffect","useRef","useState","Box","Text","TextInput","jsx","jsxs","Box","Text","useState","useRef","useEffect","useCallback","TextInput","useCallback","useEffect","useState","Box","Text","Fragment","jsx","jsxs","Box","Text","useState","useEffect","useCallback","useCallback","useEffect","useRef","useState","Box","Text","TextInput","join","jsx","jsxs","Box","Text","useState","useRef","useEffect","useCallback","join","TextInput","Fragment","jsx","jsxs","useEffect","useState","readFile","join","join","readFile","jsx","loadSnapshots","loadBrewfile","computeDrift","loadSyncConfig","loadPolicy","checkCompliance","rm"]}
1
+ {"version":3,"sources":["../src/index.tsx","../src/app.tsx","../src/components/layout/app-layout.tsx","../src/components/layout/header.tsx","../src/hooks/use-terminal-size.ts","../src/stores/navigation-store.ts","../src/lib/license/feature-gate.ts","../src/utils/colors.ts","../src/utils/gradient.tsx","../src/components/common/blinking-text.tsx","../src/utils/spacing.ts","../src/components/layout/footer.tsx","../src/hooks/use-container-size.ts","../src/components/layout/content-size-context.tsx","../src/stores/license-store.ts","../src/lib/license/anti-tamper.ts","../src/hooks/use-keyboard.ts","../src/stores/modal-store.ts","../src/lib/onboarding.ts","../src/views/welcome.tsx","../src/hooks/use-view-input.ts","../src/components/common/upgrade-prompt.tsx","../src/views/dashboard.tsx","../src/hooks/use-visible-rows.ts","../src/stores/brew-store.ts","../src/stores/security-store.ts","../src/lib/security/osv-api.ts","../src/lib/security/audit-runner.ts","../src/lib/license/anti-debug.ts","../src/lib/license/canary.ts","../src/lib/license/integrity.ts","../src/lib/license/pro-guard.ts","../src/stores/brewfile-store.ts","../src/stores/sync-store.ts","../src/stores/compliance-store.ts","../src/components/common/stat-card.tsx","../src/components/common/loading.tsx","../src/components/common/status-badge.tsx","../src/components/common/section-header.tsx","../src/components/common/version-arrow.tsx","../src/utils/format.ts","../src/views/installed.tsx","../src/hooks/use-debounce.ts","../src/hooks/use-brew-stream.ts","../src/components/common/search-input.tsx","../src/components/common/confirm-dialog.tsx","../src/components/common/progress-log.tsx","../src/components/common/result-banner.tsx","../src/components/common/selectable-row.tsx","../src/views/search.tsx","../src/views/outdated.tsx","../src/views/package-info.tsx","../src/views/services.tsx","../src/views/doctor.tsx","../src/views/profiles.tsx","../src/stores/profile-store.ts","../src/lib/profiles/profile-manager.ts","../src/lib/license/watermark.ts","../src/views/profiles/profile-list-mode.tsx","../src/views/profiles/profile-detail-mode.tsx","../src/views/profiles/profile-create-flow.tsx","../src/views/profiles/profile-edit-flow.tsx","../src/views/smart-cleanup.tsx","../src/stores/cleanup-store.ts","../src/lib/cleanup/cleanup-analyzer.ts","../src/views/history.tsx","../src/stores/history-store.ts","../src/views/security-audit.tsx","../src/views/account.tsx","../src/lib/license/promo.ts","../src/views/rollback.tsx","../src/stores/rollback-store.ts","../src/lib/rollback/rollback-engine.ts","../src/views/brewfile.tsx","../src/views/sync.tsx","../src/views/compliance.tsx","../src/lib/compliance/compliance-remediator.ts","../src/lib/crash-reporter.ts"],"sourcesContent":["import React from 'react';\nimport { createInterface } from 'node:readline/promises';\nimport { rm } from 'node:fs/promises';\nimport { render } from 'ink';\nimport { App } from './app.js';\nimport { activate, deactivate, loadLicense, revalidate } from './lib/license/license-manager.js';\nimport { ensureDataDirs, DATA_DIR } from './lib/data-dir.js';\nimport { t } from './i18n/index.js';\nimport { useLicenseStore } from './stores/license-store.js';\nimport { formatDate } from './utils/format.js';\nimport { installCrashReporter, reportError } from './lib/crash-reporter.js';\n\nconst [,, command, arg] = process.argv;\n\nasync function runCli() {\n // --version / -v: print and exit before any TUI/Ink/data-dir setup so that\n // BrewBar (and any tooling) can read the version cheaply via execFile.\n if (command === '--version' || command === '-v' || command === 'version') {\n process.stdout.write((process.env.APP_VERSION ?? '0.0.0') + '\\n');\n return;\n }\n\n await ensureDataDirs();\n await installCrashReporter();\n\n if (command === 'activate') {\n const key = arg?.trim() ?? '';\n if (!key) {\n console.error(t('cli_usageActivate'));\n process.exit(1);\n }\n try {\n const license = await activate(key);\n console.log(t('cli_activated', { email: license.customerEmail }));\n console.log(t('cli_planPro'));\n if (license.expiresAt) {\n console.log(t('cli_expires', { date: formatDate(license.expiresAt) }));\n }\n } catch (err) {\n console.error(t('cli_activationFailed', { error: err instanceof Error ? err.message : String(err) }));\n process.exit(1);\n }\n return;\n }\n\n if (command === 'deactivate') {\n const license = await loadLicense();\n if (!license) {\n console.log(t('cli_noLicense'));\n return;\n }\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const answer = await rl.question(t('cli_confirmDeactivate'));\n rl.close();\n if (answer.toLowerCase() !== 'y' && answer.toLowerCase() !== 's') {\n console.log(t('cli_deactivateCancelled'));\n return;\n }\n const { remoteSuccess } = await deactivate(license);\n console.log(t('cli_deactivated'));\n if (!remoteSuccess) {\n console.warn(t('cli_deactivateRemoteFailed'));\n }\n return;\n }\n\n if (command === 'revalidate') {\n const license = await loadLicense();\n if (!license) {\n console.log(t('cli_noLicense'));\n process.exit(1);\n }\n\n const result = await revalidate(license);\n if (result === 'expired') {\n console.error(t('cli_revalidateFailed'));\n process.exit(1);\n }\n\n const updated = await loadLicense();\n if (result === 'grace') {\n console.warn(t('cli_revalidateGrace'));\n } else {\n console.log(t('cli_revalidated'));\n }\n if (updated?.expiresAt) {\n console.log(t('cli_expires', { date: formatDate(updated.expiresAt) }));\n }\n return;\n }\n\n if (command === 'status') {\n await useLicenseStore.getState().initialize();\n const { status, license, degradation } = useLicenseStore.getState();\n const isPro = useLicenseStore.getState().isPro();\n\n if (status === 'free') {\n console.log(t('cli_planFree'));\n console.log(t('cli_upgradeHint'));\n } else {\n const planLabel = status === 'expired' ? t('cli_planExpired') : t('cli_planPro');\n console.log(planLabel);\n if (license) {\n console.log(t('cli_email', { email: license.customerEmail }));\n }\n\n const statusText = status === 'pro'\n ? (degradation === 'none' ? (license?.status ?? 'active') : degradation)\n : status;\n console.log(t('cli_status', { status: statusText }));\n\n if (license?.expiresAt) {\n console.log(t('cli_expires', { date: formatDate(license.expiresAt) }));\n }\n if (status === 'expired') {\n console.log(t('cli_revalidateHint'));\n }\n if (status === 'pro' && degradation !== 'none' && license) {\n const days = Math.floor((Date.now() - new Date(license.lastValidatedAt).getTime()) / (24 * 60 * 60 * 1000));\n console.log(t('license_offlineWarning', { days }));\n console.log(t('cli_revalidateHint'));\n }\n }\n\n // Pro-only status sections\n if (isPro) {\n // Snapshots\n try {\n const { loadSnapshots } = await import('./lib/state-snapshot/snapshot.js');\n const snapshots = await loadSnapshots();\n if (snapshots.length > 0) {\n const latest = snapshots[0];\n console.log(`\\nSnapshots: ${snapshots.length} (latest: ${latest ? formatDate(latest.capturedAt) : '—'})`);\n } else {\n console.log('\\nSnapshots: none');\n }\n } catch {\n // Non-fatal: snapshot dir may not exist yet\n }\n\n // Brewfile drift\n try {\n const { loadBrewfile, computeDrift } = await import('./lib/brewfile/brewfile-manager.js');\n const schema = await loadBrewfile();\n if (schema) {\n const drift = await computeDrift(schema);\n console.log(`Brewfile: ${drift.score}% compliant (${drift.missingPackages.length} missing, ${drift.extraPackages.length} extra)`);\n }\n } catch {\n // Non-fatal\n }\n\n // Sync last sync date\n try {\n const { loadSyncConfig } = await import('./lib/sync/sync-engine.js');\n const syncConfig = await loadSyncConfig();\n if (syncConfig?.lastSync) {\n console.log(`Sync: last sync ${formatDate(syncConfig.lastSync)}`);\n }\n } catch {\n // Non-fatal\n }\n\n // Compliance score\n try {\n const { loadPolicy } = await import('./lib/compliance/policy-io.js');\n const { checkCompliance } = await import('./lib/compliance/compliance-checker.js');\n // Try loading from default location\n const policy = await loadPolicy(`${process.env['HOME'] ?? '~'}/.brew-tui/policy.yaml`).catch(() => null);\n if (policy) {\n const report = await checkCompliance(policy, true);\n console.log(`Compliance: ${report.score}% (${report.violations.length} violation(s))`);\n }\n } catch {\n // Non-fatal: no policy loaded\n }\n }\n\n return;\n }\n\n if (command === 'install-brewbar') {\n await useLicenseStore.getState().initialize();\n const isPro = useLicenseStore.getState().isPro();\n const { installBrewBar } = await import('./lib/brewbar-installer.js');\n try {\n console.log(t('cli_brewbarInstalling'));\n await installBrewBar(isPro, arg === '--force');\n console.log(t('cli_brewbarInstalled'));\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n return;\n }\n\n if (command === 'uninstall-brewbar') {\n const { uninstallBrewBar } = await import('./lib/brewbar-installer.js');\n try {\n await uninstallBrewBar();\n console.log(t('cli_brewbarUninstalled'));\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n return;\n }\n\n // SEG-007: delete-account subcommand\n if (command === 'delete-account') {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const answer = await rl.question(t('delete_account_confirm') + ' (y/N): ');\n rl.close();\n if (answer.toLowerCase() !== 'y' && answer.toLowerCase() !== 's') {\n console.log(t('cli_deactivateCancelled'));\n return;\n }\n await rm(DATA_DIR, { recursive: true, force: true });\n console.log(t('delete_account_success'));\n return;\n }\n\n // Auto-install + auto-launch BrewBar for Pro users on macOS.\n // Runs before the TUI clears the screen so progress messages are visible on cold install.\n await ensureBrewBarRunning();\n\n // Default: launch TUI. Mark TUI mode so the logger redirects to a file\n // instead of stdout/stderr (which would corrupt the Ink-rendered frame).\n process.env.BREW_TUI_TUI_MODE = '1';\n process.stdout.write('\\x1B[2J\\x1B[3J\\x1B[H');\n render(<App />);\n}\n\nasync function ensureBrewBarRunning() {\n if (process.platform !== 'darwin') return;\n\n await useLicenseStore.getState().initialize();\n if (!useLicenseStore.getState().isPro()) return;\n\n const { isBrewBarInstalled, installBrewBar, launchBrewBar } = await import('./lib/brewbar-installer.js');\n const { checkBrewBarVersion } = await import('./lib/version-check.js');\n\n try {\n if (!await isBrewBarInstalled()) {\n console.log(t('cli_brewbarInstalling'));\n await installBrewBar(true, false);\n console.log(t('cli_brewbarInstalled'));\n } else {\n // Cross-platform contract: BrewBar must match Brew-TUI's version so\n // license decryption and any future IPC stay compatible. If the user's\n // BrewBar is older than this CLI (e.g. they upgraded brew-tui via\n // Homebrew/npm but never re-ran install-brewbar), reinstall in place.\n const status = await checkBrewBarVersion();\n if (status.kind === 'outdated') {\n console.log(t('cli_brewbarUpdating', { installed: status.installed, expected: status.expected }));\n await installBrewBar(true, true);\n console.log(t('cli_brewbarInstalled'));\n }\n }\n await launchBrewBar();\n } catch (err) {\n // Non-fatal: log a single line and continue to TUI so brew-tui stays usable.\n console.warn(t('cli_brewbarAutoFailed', { error: err instanceof Error ? err.message : String(err) }));\n }\n}\n\nrunCli().catch((err) => {\n console.error(err instanceof Error ? err.message : String(err));\n void reportError(err, { kind: 'runCli-rejection' }).finally(() => process.exit(1));\n});\n","import React, { useEffect, useState } from 'react';\nimport { useApp } from 'ink';\nimport { AppLayout } from './components/layout/app-layout.js';\nimport { useNavigationStore } from './stores/navigation-store.js';\nimport { useLicenseStore } from './stores/license-store.js';\nimport { useGlobalKeyboard } from './hooks/use-keyboard.js';\nimport { hasCompletedOnboarding } from './lib/onboarding.js';\nimport { WelcomeView } from './views/welcome.js';\nimport { isProView, isTeamView } from './lib/license/feature-gate.js';\nimport { UpgradePrompt } from './components/common/upgrade-prompt.js';\nimport { DashboardView } from './views/dashboard.js';\nimport { InstalledView } from './views/installed.js';\nimport { SearchView } from './views/search.js';\nimport { OutdatedView } from './views/outdated.js';\nimport { PackageInfoView } from './views/package-info.js';\nimport { ServicesView } from './views/services.js';\nimport { DoctorView } from './views/doctor.js';\nimport { ProfilesView } from './views/profiles.js';\nimport { SmartCleanupView } from './views/smart-cleanup.js';\nimport { HistoryView } from './views/history.js';\nimport { SecurityAuditView } from './views/security-audit.js';\nimport { AccountView } from './views/account.js';\nimport { RollbackView } from './views/rollback.js';\nimport { BrewfileView } from './views/brewfile.js';\nimport { SyncView } from './views/sync.js';\nimport { ComplianceView } from './views/compliance.js';\nimport type { ViewId } from './lib/types.js';\n\n// FE-009: Extracted LicenseInitializer component\nfunction LicenseInitializer() {\n const initLicense = useLicenseStore((s) => s.initialize);\n useEffect(() => { initLicense(); }, []);\n return null;\n}\n\n// FE-009: Extracted ViewRouter component\nfunction ViewRouter({ currentView }: { currentView: ViewId }) {\n const isPro = useLicenseStore((s) => s.isPro);\n const isTeam = useLicenseStore((s) => s.isTeam);\n\n // Gate Pro views\n if (isProView(currentView) && !isPro()) {\n return <UpgradePrompt viewId={currentView} />;\n }\n\n // Gate Team views\n if (isTeamView(currentView) && !isTeam()) {\n return <UpgradePrompt viewId={currentView} />;\n }\n\n switch (currentView) {\n case 'dashboard': return <DashboardView />;\n case 'installed': return <InstalledView />;\n case 'search': return <SearchView />;\n case 'outdated': return <OutdatedView />;\n case 'package-info': return <PackageInfoView />;\n case 'services': return <ServicesView />;\n case 'doctor': return <DoctorView />;\n case 'profiles': return <ProfilesView />;\n case 'smart-cleanup': return <SmartCleanupView />;\n case 'history': return <HistoryView />;\n case 'rollback': return <RollbackView />;\n case 'brewfile': return <BrewfileView />;\n case 'sync': return <SyncView />;\n case 'security-audit': return <SecurityAuditView />;\n case 'compliance': return <ComplianceView />;\n case 'account': return <AccountView />;\n }\n}\n\nexport function App() {\n const { exit } = useApp();\n const currentView = useNavigationStore((s) => s.currentView);\n\n // UX-002: gate the whole app behind a one-shot welcome screen on first run.\n // Loading state is `null` until the disk check finishes — we render nothing\n // for that frame so a returning user never sees the welcome flash. In Vitest\n // (NODE_ENV=test) we skip the disk hop so render-tests keep their semantics.\n const isTestEnv = typeof process !== 'undefined' && process.env?.['NODE_ENV'] === 'test';\n const [showWelcome, setShowWelcome] = useState<boolean | null>(isTestEnv ? false : null);\n useEffect(() => {\n if (isTestEnv) return;\n void hasCompletedOnboarding().then((done) => setShowWelcome(!done));\n }, []);\n\n useGlobalKeyboard({ onQuit: exit });\n\n if (showWelcome === null) {\n return <AppLayout><></></AppLayout>;\n }\n\n if (showWelcome) {\n return (\n <AppLayout>\n <WelcomeView onContinue={() => setShowWelcome(false)} />\n </AppLayout>\n );\n }\n\n return (\n <AppLayout>\n <LicenseInitializer />\n <ViewRouter currentView={currentView} />\n </AppLayout>\n );\n}\n","import React, { useRef } from 'react';\nimport { Box, type DOMElement } from 'ink';\nimport { Header } from './header.js';\nimport { Footer } from './footer.js';\nimport { SPACING } from '../../utils/spacing.js';\nimport { useTerminalSize } from '../../hooks/use-terminal-size.js';\nimport { useContainerSize } from '../../hooks/use-container-size.js';\nimport { ContentSizeProvider } from './content-size-context.js';\n\ninterface AppLayoutProps {\n children: React.ReactNode;\n}\n\nexport function AppLayout({ children }: AppLayoutProps) {\n const { rows } = useTerminalSize();\n const contentRef = useRef<DOMElement>(null);\n const contentSize = useContainerSize(contentRef);\n const innerContentSize = {\n width: Math.max(0, contentSize.width - SPACING.sm * 2),\n height: Math.max(0, contentSize.height - SPACING.xs * 2),\n };\n\n return (\n <Box flexDirection=\"column\" width=\"100%\" height={rows} overflow=\"hidden\">\n <Box flexShrink={0}>\n <Header />\n </Box>\n <Box\n ref={contentRef}\n flexDirection=\"column\"\n flexGrow={1}\n flexShrink={1}\n minHeight={0}\n overflow=\"hidden\"\n paddingX={SPACING.sm}\n paddingY={SPACING.xs}\n >\n <ContentSizeProvider value={innerContentSize}>\n {children}\n </ContentSizeProvider>\n </Box>\n <Box flexShrink={0}>\n <Footer />\n </Box>\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { useTerminalSize } from '../../hooks/use-terminal-size.js';\nimport { useNavigationStore, MENU_VIEWS } from '../../stores/navigation-store.js';\nimport { isProView, isTeamView } from '../../lib/license/feature-gate.js';\nimport { COLORS } from '../../utils/colors.js';\nimport { t, useLocaleStore } from '../../i18n/index.js';\nimport { GradientText, GRADIENTS } from '../../utils/gradient.js';\nimport { BlinkingText } from '../common/blinking-text.js';\nimport type { ViewId } from '../../lib/types.js';\nimport type { TranslationKey } from '../../i18n/en.js';\nimport { SPACING } from '../../utils/spacing.js';\n\n// BREW portion (cols 0-27) and TUI portion (cols 28+) rendered in different colors\nconst LOGO_BREW = [\n '╭━━╮╱╭━━━╮╭━━━╮╭╮╭╮╭╮╱╱╱╱╱╱╱',\n '┃╭╮┃╱┃╭━╮┃┃╭━━╯┃┃┃┃┃┃╱╱╱╱╱╱╱',\n '┃╰╯╰╮┃╰━╯┃┃╰━━╮┃┃┃┃┃┃╱╱╱╱╱╱╱',\n '┃╭━╮┃┃╭╮╭╯┃╭━━╯┃╰╯╰╯┃╭━━┳━━╮',\n '┃╰━╯┃┃┃┃╰╮┃╰━━╮╰╮╭╮╭╯╰━━┻━━╯',\n '╰━━━╯╰╯╰━╯╰━━━╯╱╰╯╰╯╱╱╱╱╱╱╱╱',\n];\nconst LOGO_TUI = [\n '╭━━━━╮╭╮╱╭╮╭━━╮',\n '┃╭╮╭╮┃┃┃╱┃┃╰┫┣╯',\n '╰╯┃┃╰╯┃┃╱┃┃╱┃┃',\n '╱╱┃┃╱╱┃┃╱┃┃╱┃┃',\n '╱╱┃┃╱╱┃╰━╯┃╭┫┣╮',\n '╱╱╰╯╱╱╰━━━╯╰━━╯',\n];\n\nconst VIEW_LABEL_KEYS: Record<ViewId, TranslationKey> = {\n dashboard: 'view_dashboard',\n installed: 'view_installed',\n search: 'view_search',\n outdated: 'view_outdated',\n 'package-info': 'view_packageInfo',\n services: 'view_services',\n doctor: 'view_doctor',\n profiles: 'view_profiles',\n 'smart-cleanup': 'view_smartCleanup',\n history: 'view_history',\n rollback: 'view_rollback',\n brewfile: 'view_brewfile',\n sync: 'view_sync',\n 'security-audit': 'view_securityAudit',\n compliance: 'view_compliance',\n account: 'view_account',\n};\n\ninterface MenuItemProps {\n view: ViewId;\n currentView: ViewId;\n cursorView: ViewId | null;\n menuMode: boolean;\n}\n\nfunction MenuItem({ view, currentView, cursorView, menuMode }: MenuItemProps) {\n const viewLabel = t(VIEW_LABEL_KEYS[view]);\n const isPro = isProView(view) || isTeamView(view);\n const isCurrent = view === currentView;\n const isCursor = menuMode && view === cursorView;\n const isAccount = view === 'account';\n\n const indicatorColor = isCursor ? COLORS.brand : COLORS.success;\n const labelColor = isCursor\n ? COLORS.brand\n : isCurrent\n ? COLORS.success\n : isAccount\n ? COLORS.gold\n : COLORS.textSecondary;\n\n // Show only one arrow at a time: cursor while in menu mode, otherwise the\n // current view. Two arrows make the highlight ambiguous.\n const showArrow = menuMode ? isCursor : isCurrent;\n\n return (\n <Box>\n {showArrow ? (\n <Text color={indicatorColor} bold>{'▶'} </Text>\n ) : (\n <Text> </Text>\n )}\n <Text bold={showArrow} underline={!menuMode && isCurrent} color={labelColor}>{viewLabel}</Text>\n {isPro && <Text color={COLORS.brand} bold> {t('pro_badge')}</Text>}\n </Box>\n );\n}\n\nconst COL1_VIEWS = MENU_VIEWS.slice(0, 6);\nconst COL2_VIEWS = MENU_VIEWS.slice(6);\n\nexport function Header() {\n const currentView = useNavigationStore((s) => s.currentView);\n const menuMode = useNavigationStore((s) => s.menuMode);\n const menuCursor = useNavigationStore((s) => s.menuCursor);\n useLocaleStore((s) => s.locale);\n const { columns, rows } = useTerminalSize();\n const isNarrow = columns < 95;\n const hideLogoByWidth = columns < 45;\n // Vertical breakpoints. The full menu is 10 rows (8 entries + bottom hint +\n // borders); the logo is 6 rows; leave at least 8 rows for content + footer.\n // - rows >= 32: logo + menu (full)\n // - 22..31: drop logo, keep menu\n // - rows < 22 and not in menuMode: collapse menu to a single status line\n // - rows < 22 and menuMode: show the menu anyway (user is navigating)\n const hideLogoByHeight = rows < 32;\n const collapseMenu = rows < 22 && !menuMode;\n const cursorView = menuMode ? (MENU_VIEWS[menuCursor] ?? null) : null;\n\n const logoBlock = (\n <Box flexDirection=\"column\" flexShrink={0}>\n {LOGO_BREW.map((brew, i) => (\n <Box key={`logo-${i}`}>\n <GradientText colors={GRADIENTS.gold}>{brew}</GradientText>\n <GradientText colors={GRADIENTS.darkGold}>{LOGO_TUI[i]}</GradientText>\n </Box>\n ))}\n </Box>\n );\n\n const menuBorderColor = menuMode ? COLORS.brand : COLORS.lavender;\n\n const menuBlock = (\n <Box borderStyle=\"round\" borderColor={menuBorderColor} paddingX={SPACING.xs} flexDirection=\"column\" alignSelf={isNarrow ? 'flex-start' : 'center'}>\n <Box flexDirection=\"row\">\n <Box flexDirection=\"column\">\n {COL1_VIEWS.map((view) => (\n <MenuItem key={view} view={view} currentView={currentView} cursorView={cursorView} menuMode={menuMode} />\n ))}\n </Box>\n <Box flexDirection=\"column\" marginLeft={SPACING.sm}>\n {COL2_VIEWS.map((view) => (\n <MenuItem key={view} view={view} currentView={currentView} cursorView={cursorView} menuMode={menuMode} />\n ))}\n </Box>\n </Box>\n <Box borderStyle=\"single\" borderTop borderBottom={false} borderLeft={false} borderRight={false} borderColor={menuBorderColor} marginTop={SPACING.none}>\n {menuMode ? (\n <Text color={COLORS.brand}>\n {t('hint_menuMode_prefix')}\n <BlinkingText color={COLORS.brand}>m</BlinkingText>\n {t('hint_menuMode_suffix')}\n </Text>\n ) : (\n <Text color={COLORS.textSecondary}>\n <BlinkingText color={COLORS.brand}>M</BlinkingText>\n {t('hint_menuOpen_suffix')}\n </Text>\n )}\n </Box>\n </Box>\n );\n\n // Single-row collapsed header. Shows the current view and the global hint\n // line so the user always sees both context and how to expand the menu.\n if (collapseMenu) {\n const currentLabel = t(VIEW_LABEL_KEYS[currentView]);\n const currentIsPro = isProView(currentView) || isTeamView(currentView);\n return (\n <Box paddingX={SPACING.xs}>\n <Text color={COLORS.success} bold>{'▶ '}</Text>\n <Text color={COLORS.success} bold>{currentLabel}</Text>\n {currentIsPro && <Text color={COLORS.brand} bold> {t('pro_badge')}</Text>}\n <Text color={COLORS.textSecondary}> </Text>\n <BlinkingText color={COLORS.brand}>M</BlinkingText>\n <Text color={COLORS.textSecondary}>{t('hint_menuOpen_suffix')}</Text>\n </Box>\n );\n }\n\n if (isNarrow) {\n return (\n <Box flexDirection=\"column\" paddingX={SPACING.xs}>\n {!hideLogoByWidth && !hideLogoByHeight && logoBlock}\n <Box marginTop={hideLogoByWidth || hideLogoByHeight ? SPACING.none : SPACING.xs}>{menuBlock}</Box>\n </Box>\n );\n }\n\n // Wide terminal but short: stack vertically and drop the logo.\n if (hideLogoByHeight) {\n return (\n <Box flexDirection=\"column\" paddingX={SPACING.xs}>\n {menuBlock}\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"row\" paddingX={SPACING.xs} alignItems=\"center\">\n {logoBlock}\n <Box marginLeft={SPACING.sm}>{menuBlock}</Box>\n </Box>\n );\n}\n","import { useSyncExternalStore } from 'react';\nimport { useStdout } from 'ink';\n\nexport interface TerminalSize {\n columns: number;\n rows: number;\n}\n\n// Reactive viewport hook. Equivalent of `100vw` / `100vh` in CSS.\n//\n// `stdout.columns` / `stdout.rows` are mutable properties that change on\n// SIGWINCH but do not trigger React re-renders. We listen for `resize` and\n// snapshot the values into a per-stdout shared store, so:\n//\n// - At most ONE `resize` listener is registered per stdout, regardless of\n// how many React components call `useTerminalSize`. The previous\n// per-component listener model triggered Node's\n// `MaxListenersExceededWarning` once enough views/components mounted\n// simultaneously (each useVisibleRows / useContainerSize call piles up\n// because they transitively use this hook).\n// - The cache is keyed by the stdout reference itself via WeakMap so test\n// stdouts and the production process.stdout do not share state.\n// - We do NOT debounce: terminal resizes are user-driven and infrequent;\n// debounce would introduce perceptible lag during window drag.\n\nconst FALLBACK: TerminalSize = { columns: 80, rows: 24 };\n\ninterface StdoutLike {\n columns?: number;\n rows?: number;\n on(event: 'resize', listener: () => void): unknown;\n off(event: 'resize', listener: () => void): unknown;\n}\n\ninterface CacheEntry {\n current: TerminalSize;\n subscribers: Set<() => void>;\n}\n\nconst cache = new WeakMap<StdoutLike, CacheEntry>();\n\nfunction snapshot(stdout: StdoutLike): TerminalSize {\n return {\n columns: stdout.columns ?? FALLBACK.columns,\n rows: stdout.rows ?? FALLBACK.rows,\n };\n}\n\nfunction getCache(stdout: StdoutLike): CacheEntry {\n const existing = cache.get(stdout);\n if (existing) return existing;\n const entry: CacheEntry = {\n current: snapshot(stdout),\n subscribers: new Set(),\n };\n cache.set(stdout, entry);\n // One listener per stdout, lives for the stdout's lifetime. It does not\n // need to be removed — when the stdout is GC'd the listener goes with it.\n stdout.on('resize', () => {\n entry.current = snapshot(stdout);\n entry.subscribers.forEach((cb) => cb());\n });\n return entry;\n}\n\nexport function useTerminalSize(): TerminalSize {\n const { stdout } = useStdout() as { stdout: StdoutLike | undefined };\n return useSyncExternalStore(\n (cb) => {\n if (!stdout) return () => {};\n const entry = getCache(stdout);\n entry.subscribers.add(cb);\n return () => {\n entry.subscribers.delete(cb);\n };\n },\n () => (stdout ? getCache(stdout).current : FALLBACK),\n // Server snapshot — not used in CLI, but useSyncExternalStore requires it.\n () => FALLBACK,\n );\n}\n","import { create } from 'zustand';\nimport type { ViewId } from '../lib/types.js';\n\ninterface NavigationState {\n currentView: ViewId;\n selectedPackage: string | null;\n selectedPackageType: 'formula' | 'cask' | null;\n viewHistory: ViewId[];\n menuMode: boolean;\n menuCursor: number;\n navigate: (view: ViewId) => void;\n goBack: () => void;\n selectPackage: (name: string | null, type?: 'formula' | 'cask' | null) => void;\n enterMenuMode: () => void;\n exitMenuMode: () => void;\n moveMenuCursor: (delta: 1 | -1) => void;\n selectMenuItem: () => void;\n}\n\nconst VIEWS: ViewId[] = [\n 'dashboard', 'installed', 'outdated', 'package-info', 'search', 'services', 'doctor',\n 'profiles', 'smart-cleanup', 'history', 'rollback', 'brewfile', 'sync', 'security-audit', 'compliance', 'account',\n];\n\n// MENU_VIEWS is the ordered list rendered in the side menu. Excludes `search`\n// (contextual entry via S) but keeps `package-info` because the header shows it.\n// menuCursor indexes into this list.\nconst MENU_VIEWS: ViewId[] = [\n 'dashboard', 'installed', 'outdated', 'package-info', 'services', 'doctor',\n 'profiles', 'smart-cleanup', 'history', 'rollback', 'brewfile', 'sync', 'security-audit', 'compliance', 'account',\n];\n\nexport const useNavigationStore = create<NavigationState>((set, get) => ({\n currentView: 'dashboard',\n selectedPackage: null,\n selectedPackageType: null,\n viewHistory: [],\n // menuMode starts ON so the side menu owns arrows from the first frame —\n // users can navigate with ↑/↓/↵ without having to press M first.\n menuMode: true,\n menuCursor: 0,\n\n navigate: (view) => {\n const { currentView, viewHistory } = get();\n if (view === currentView) return;\n set({\n currentView: view,\n viewHistory: [...viewHistory.slice(-19), currentView],\n });\n },\n\n goBack: () => {\n const { viewHistory, menuMode } = get();\n if (menuMode) {\n set({ menuMode: false });\n return;\n }\n if (viewHistory.length === 0) return;\n const prev = viewHistory[viewHistory.length - 1];\n set({\n currentView: prev,\n viewHistory: viewHistory.slice(0, -1),\n });\n },\n\n selectPackage: (name, type = null) => set({ selectedPackage: name, selectedPackageType: type }),\n\n enterMenuMode: () => {\n const { currentView } = get();\n const idx = MENU_VIEWS.indexOf(currentView);\n set({ menuMode: true, menuCursor: idx >= 0 ? idx : 0 });\n },\n\n exitMenuMode: () => set({ menuMode: false }),\n\n moveMenuCursor: (delta) => {\n const { menuCursor } = get();\n const next = menuCursor + delta;\n if (next < 0 || next >= MENU_VIEWS.length) return;\n set({ menuCursor: next });\n },\n\n selectMenuItem: () => {\n const { menuCursor, currentView, viewHistory } = get();\n const target = MENU_VIEWS[menuCursor];\n if (!target) {\n set({ menuMode: false });\n return;\n }\n if (target === currentView) {\n set({ menuMode: false });\n return;\n }\n set({\n currentView: target,\n viewHistory: [...viewHistory.slice(-19), currentView],\n menuMode: false,\n });\n },\n}));\n\nexport function getNextView(current: ViewId): ViewId {\n const idx = VIEWS.indexOf(current);\n return VIEWS[(idx + 1) % VIEWS.length]!;\n}\n\nexport function getPrevView(current: ViewId): ViewId {\n const idx = VIEWS.indexOf(current);\n return VIEWS[(idx - 1 + VIEWS.length) % VIEWS.length]!;\n}\n\nexport { VIEWS, MENU_VIEWS };\n","import type { ViewId } from '../types.js';\n\nconst PRO_VIEWS = new Set<ViewId>([\n 'profiles',\n 'smart-cleanup',\n 'history',\n 'rollback',\n 'brewfile',\n 'sync',\n 'security-audit',\n]);\n\n// Team-tier views — superset de Pro, requieren licencia Team (o Pro durante lanzamiento)\nconst TEAM_VIEWS = new Set<ViewId>(['compliance']);\n\nexport function isProView(viewId: ViewId): boolean {\n return PRO_VIEWS.has(viewId);\n}\n\nexport function isTeamView(viewId: ViewId): boolean {\n return TEAM_VIEWS.has(viewId);\n}\n","/**\n * Semantic color tokens for Brew-TUI.\n *\n * These constants provide a single source of truth for UI colors.\n * Views should gradually adopt these instead of hardcoded hex strings.\n *\n * NO_COLOR support: when the standard NO_COLOR env var is set to any\n * non-empty value (https://no-color.org), every token is replaced by\n * the empty string so Ink renders plain text without ANSI escapes.\n * Callers continue to pass `color={COLORS.success}` unchanged.\n *\n * DS-005 light-terminal support: COLORFGBG is the de-facto signal terminals\n * publish about their fg/bg luminosity. When the bg is light we swap in a\n * second palette tuned for legibility on white. Override with\n * BREW_TUI_THEME=dark|light if the heuristic is wrong.\n */\nconst DARK_PALETTE = {\n success: '#22C55E',\n error: '#EF4444',\n warning: '#F59E0B',\n info: '#06B6D4',\n brand: '#FF6B2B',\n muted: '#9CA3AF',\n text: '#F9FAFB',\n textSecondary: '#6B7280',\n teal: '#2DD4BF',\n sky: '#38BDF8',\n gold: '#FFD700',\n goldOrange: '#FFA500',\n goldDeep: '#B8860B',\n goldDark: '#8B6914',\n goldDeepest: '#6B4F10',\n purple: '#A855F7',\n blue: '#3B82F6',\n lavender: '#C4B5FD',\n border: '#4B5563',\n white: '#FFFFFF',\n} as const;\n\nconst LIGHT_PALETTE = {\n success: '#15803D',\n error: '#B91C1C',\n warning: '#B45309',\n info: '#0E7490',\n brand: '#C2410C',\n muted: '#4B5563',\n text: '#111827',\n textSecondary: '#374151',\n teal: '#0F766E',\n sky: '#0369A1',\n gold: '#A16207',\n goldOrange: '#9A3412',\n goldDeep: '#7C2D12',\n goldDark: '#5B2509',\n goldDeepest: '#3F1A06',\n purple: '#6B21A8',\n blue: '#1D4ED8',\n lavender: '#6D28D9',\n border: '#D1D5DB',\n white: '#000000', // intentional: \"white-on-light\" reads as black ink\n} as const;\n\ntype ColorKey = keyof typeof DARK_PALETTE;\n\nfunction detectTheme(): 'dark' | 'light' {\n const override = process.env['BREW_TUI_THEME'];\n if (override === 'dark' || override === 'light') return override;\n\n // COLORFGBG is \"<fg>;<bg>\" or \"<fg>;<default>;<bg>\" — the bg index decides.\n const cfb = process.env['COLORFGBG'];\n if (cfb) {\n const parts = cfb.split(';');\n const bg = Number(parts[parts.length - 1]);\n if (!isNaN(bg) && bg >= 7) return 'light';\n if (!isNaN(bg) && bg <= 6) return 'dark';\n }\n return 'dark';\n}\n\nconst PALETTE = detectTheme() === 'light' ? LIGHT_PALETTE : DARK_PALETTE;\n\nfunction isNoColorRequested(): boolean {\n const v = process.env['NO_COLOR'];\n return typeof v === 'string' && v.length > 0;\n}\n\nexport const NO_COLOR = isNoColorRequested();\nexport const THEME = detectTheme();\n\nexport const COLORS: Record<ColorKey, string> = NO_COLOR\n ? (Object.fromEntries(\n (Object.keys(PALETTE) as ColorKey[]).map((k) => [k, '']),\n ) as Record<ColorKey, string>)\n : (PALETTE as Record<ColorKey, string>);\n","import React, { useMemo } from 'react';\nimport { Text } from 'ink';\nimport { COLORS, NO_COLOR } from './colors.js';\n\nfunction hexToRgb(hex: string): [number, number, number] {\n const n = parseInt(hex.slice(1), 16);\n return [(n >> 16) & 255, (n >> 8) & 255, n & 255];\n}\n\nfunction rgbToHex(r: number, g: number, b: number): string {\n return '#' + ((1 << 24) | (r << 16) | (g << 8) | b).toString(16).slice(1).toUpperCase();\n}\n\nfunction lerp(a: number, b: number, t: number): number {\n return Math.round(a + (b - a) * t);\n}\n\nfunction interpolateColor(c1: string, c2: string, t: number): string {\n const [r1, g1, b1] = hexToRgb(c1);\n const [r2, g2, b2] = hexToRgb(c2);\n return rgbToHex(lerp(r1, r2, t), lerp(g1, g2, t), lerp(b1, b2, t));\n}\n\ninterface GradientTextProps {\n children: string;\n colors: string[];\n bold?: boolean;\n}\n\nexport const GradientText = React.memo(function GradientText({ children, colors, bold }: GradientTextProps) {\n // NO_COLOR: skip the per-character coloring and emit a single plain Text.\n // The character-by-character rendering would still produce correct output\n // visually, but each <Text/> element with empty color still ships ANSI\n // resets that some screen readers narrate noisily.\n if (NO_COLOR) {\n return <Text bold={bold}>{children}</Text>;\n }\n if (colors.length < 2) {\n return <Text color={colors[0]} bold={bold}>{children}</Text>;\n }\n\n const coloredChars = useMemo(() => {\n const chars = [...children];\n const maxIdx = Math.max(chars.length - 1, 1);\n\n return chars.map((char, i) => {\n const t = i / maxIdx;\n const segment = t * (colors.length - 1);\n const lower = Math.floor(segment);\n const upper = Math.min(lower + 1, colors.length - 1);\n const frac = segment - lower;\n const color = interpolateColor(colors[lower]!, colors[upper]!, frac);\n return { char, color, key: `${i}-${color}` };\n });\n }, [children, colors]);\n\n return (\n <>\n {coloredChars.map(({ char, color, key }) => (\n <Text key={key} color={color} bold={bold}>{char}</Text>\n ))}\n </>\n );\n});\n\n// DS-003: derive every gradient stop from the COLORS palette so a token edit\n// fans out to all gradients. Keeping the export as a plain object preserves\n// import sites that read GRADIENTS.gold etc.\nexport const GRADIENTS = {\n gold: [COLORS.gold, COLORS.goldOrange, COLORS.goldDeep],\n sunset: [COLORS.brand, COLORS.gold, COLORS.brand],\n ocean: [COLORS.info, COLORS.blue, COLORS.purple],\n emerald: [COLORS.success, COLORS.teal, COLORS.info],\n fire: [COLORS.error, COLORS.warning, COLORS.gold],\n version: [COLORS.error, COLORS.muted, COLORS.teal],\n pro: [COLORS.brand, COLORS.gold, COLORS.brand],\n darkGold:[COLORS.goldDeep, COLORS.goldDark, COLORS.goldDeepest],\n};\n","import React, { useEffect, useState } from 'react';\nimport { Text } from 'ink';\n\ninterface BlinkingTextProps {\n color: string;\n intervalMs?: number;\n bold?: boolean;\n children: React.ReactNode;\n}\n\n// DS-001: gate accesibilidad — respetar NO_COLOR (freedesktop.org) y la\n// senal REDUCE_MOTION (extendida desde sistemas grandes). Si cualquiera\n// esta activa, no parpadear: renderizar texto estatico en bright.\n//\n// NO_COLOR=1 desactiva todo color en TUI; un Text dimmed sigue siendo\n// parpadeo visual aunque el color sea uniforme. Mejor desactivar el\n// efecto completamente en ese modo.\n//\n// REDUCE_MOTION lo respetan algunos terminales (iTerm respeta el system\n// flag via env). En su ausencia, fallback a NO_COLOR como proxy razonable\n// — un usuario con sensibilidad a parpadeos probablemente ya tiene NO_COLOR.\nfunction shouldDisableBlink(): boolean {\n return (\n Boolean(process.env.NO_COLOR) ||\n process.env.REDUCE_MOTION === '1' ||\n process.env.ACCESSIBILITY_REDUCE_MOTION === '1'\n );\n}\n\n// Alternates between bright (full color, bold) and dim (same color, dimColor)\n// on a fixed interval. Used to draw the eye to a keyboard shortcut indicator\n// (e.g. the `M` that opens the side menu) without changing its hue.\nexport function BlinkingText({\n color,\n intervalMs = 600,\n bold = true,\n children,\n}: BlinkingTextProps) {\n const blinkDisabled = shouldDisableBlink();\n const [bright, setBright] = useState(true);\n\n useEffect(() => {\n if (blinkDisabled) return;\n const id = setInterval(() => setBright((b) => !b), intervalMs);\n return () => clearInterval(id);\n }, [intervalMs, blinkDisabled]);\n\n return (\n <Text color={color} bold={bold} dimColor={!bright && !blinkDisabled}>\n {children}\n </Text>\n );\n}\n","export const SPACING = {\n none: 0,\n xs: 1,\n sm: 2,\n md: 3,\n lg: 4,\n xl: 6,\n xxl: 8,\n} as const;\n\n// Width breakpoints in columns. Single source of truth for \"is the terminal\n// narrow / mid / wide\" decisions across views. Picked from observed real-world\n// terminal sizes: half-screen iTerm panes hover ~60, full-screen ~120-160.\nexport const BREAKPOINTS = {\n /** Below this we collapse to single-column rows (only the name fits). */\n narrow: 50,\n /** Below this we drop the description column but keep version. */\n mid: 80,\n /** At or above this we render every column comfortably. */\n wide: 120,\n} as const;\n\nexport type LayoutMode = 'single' | 'compact' | 'comfortable' | 'wide';\n\n/** Map a container width (in columns) to a layout mode. Use this in views to\n * decide how many columns to render, instead of comparing magic numbers in-line. */\nexport function getLayoutMode(columns: number): LayoutMode {\n if (columns < BREAKPOINTS.narrow) return 'single';\n if (columns < BREAKPOINTS.mid) return 'compact';\n if (columns < BREAKPOINTS.wide) return 'comfortable';\n return 'wide';\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { useNavigationStore } from '../../stores/navigation-store.js';\nimport { useTerminalSize } from '../../hooks/use-terminal-size.js';\nimport { COLORS } from '../../utils/colors.js';\nimport { t, useLocaleStore } from '../../i18n/index.js';\nimport type { ViewId } from '../../lib/types.js';\nimport type { TranslationKey } from '../../i18n/en.js';\nimport { SPACING } from '../../utils/spacing.js';\n\n// HintDef: numbered actions render as `1:label`; named keys (enter, esc, /,\n// j/k, etc.) render literally so the contextual semantics survive.\ntype HintDef = [key: string, action: TranslationKey];\n\nconst VIEW_HINT_DEFS: Record<ViewId, HintDef[]> = {\n dashboard: [['1', 'hint_refresh']],\n installed: [['/', 'hint_filter'], ['enter', 'hint_info'], ['1', 'hint_uninstall'], ['2', 'hint_switchTab']],\n search: [['enter', 'hint_details'], ['1', 'hint_install']],\n outdated: [['enter', 'hint_upgrade'], ['1', 'hint_upgradeAll'], ['2', 'hint_pin'], ['3', 'hint_refresh']],\n 'package-info': [['1', 'hint_install'], ['2', 'hint_uninstall'], ['3', 'hint_upgrade']],\n services: [['1', 'hint_start'], ['2', 'hint_stop'], ['3', 'hint_restart'], ['4', 'hint_refresh']],\n doctor: [['1', 'hint_refresh']],\n profiles: [['enter', 'hint_details'], ['1', 'hint_new'], ['2', 'hint_edit'], ['3', 'hint_import'], ['4', 'hint_delete']],\n 'smart-cleanup': [['enter', 'hint_toggle'], ['1', 'hint_all'], ['2', 'hint_clean'], ['3', 'hint_force'], ['4', 'hint_refresh']],\n history: [['/', 'hint_search'], ['enter', 'hint_replay'], ['1', 'hint_filter'], ['2', 'hint_clear']],\n 'security-audit': [['enter', 'hint_details'], ['1', 'hint_scan'], ['2', 'hint_upgrade']],\n rollback: [['j/k', 'hint_navigate'], ['enter', 'hint_select'], ['1', 'hint_rollback_confirm']],\n brewfile: [['1', 'hint_new'], ['2', 'hint_refresh'], ['3', 'hint_reconcile']],\n sync: [['1', 'hint_sync'], ['2', 'hint_refresh'], ['3', 'hint_conflict'], ['4', 'hint_useLocal']],\n compliance: [['1', 'hint_scan'], ['2', 'hint_import'], ['3', 'hint_export'], ['4', 'hint_clean']],\n account: [['1', 'hint_promo'], ['2', 'hint_deactivate']],\n};\n\n// Views with no per-view actions only show globals + the chooser line is\n// suppressed because there is nothing to choose from.\nfunction hasNumberedActions(defs: HintDef[]): boolean {\n return defs.some(([key]) => /^\\d+$/.test(key));\n}\n\nfunction HintItem({ def }: { def: HintDef }) {\n return (\n <>\n <Text color={COLORS.text} bold>{def[0]}</Text>\n <Text color={COLORS.textSecondary}>:</Text>\n <Text color={COLORS.gold} dimColor>{t(def[1])}</Text>\n </>\n );\n}\n\nexport function Footer() {\n const currentView = useNavigationStore((s) => s.currentView);\n const menuMode = useNavigationStore((s) => s.menuMode);\n const locale = useLocaleStore((s) => s.locale);\n const { rows } = useTerminalSize();\n const defs = VIEW_HINT_DEFS[currentView] ?? [];\n // Drop the explanatory \"choose a number\" line on short terminals — the hint\n // bar below already shows `1:`, `2:` etc. so the extra row is redundant.\n const showChoose = hasNumberedActions(defs) && !menuMode && rows >= 26;\n\n return (\n <Box flexDirection=\"column\">\n {showChoose && (\n <Box paddingX={SPACING.xs}>\n <Text color={COLORS.text}>{t('hint_chooseNumber')}</Text>\n </Box>\n )}\n <Box borderStyle=\"single\" borderTop borderBottom={false} borderLeft={false} borderRight={false} borderColor={COLORS.gold} paddingX={SPACING.xs} flexWrap=\"wrap\">\n {!menuMode && defs.map((def, i) => (\n <React.Fragment key={`${def[0]}:${def[1]}`}>\n {i > 0 && <Text color={COLORS.border}> {'│'} </Text>}\n <HintItem def={def} />\n </React.Fragment>\n ))}\n {!menuMode && defs.length > 0 && <Text color={COLORS.border}> {'│'} </Text>}\n <Text color={COLORS.text} bold>esc</Text>\n <Text color={COLORS.textSecondary}>:</Text>\n <Text color={COLORS.gold} dimColor>{t('hint_back')}</Text>\n <Text color={COLORS.border}> {'│'} </Text>\n <Text color={COLORS.text} bold>q</Text>\n <Text color={COLORS.textSecondary}>:</Text>\n <Text color={COLORS.gold} dimColor>{t('hint_quit')}</Text>\n <Text color={COLORS.lavender}> {'┃'} </Text>\n <Text color={COLORS.text} bold>L</Text>\n <Text color={COLORS.textSecondary}>:</Text>\n <Text color={COLORS.gold} dimColor>{t('hint_lang')}({locale})</Text>\n </Box>\n </Box>\n );\n}\n","import { useEffect, useState, type RefObject } from 'react';\nimport { measureElement, type DOMElement } from 'ink';\nimport { useTerminalSize } from './use-terminal-size.js';\n\nexport interface ContainerSize {\n width: number;\n height: number;\n}\n\n// Container-size hook. Equivalent of CSS `100cqi` / `100cqb`.\n//\n// Returns the real post-layout dimensions of the referenced <Box>. The first\n// render reports { width: 0, height: 0 } because measureElement requires\n// layout to have run; the effect re-measures synchronously after mount and on\n// every terminal resize, so the second frame onwards is accurate.\n//\n// Consumers MUST attach the returned `ref` to a <Box>, not to a <Text> — Yoga\n// only computes a box for the former.\n//\n// Example:\n// const ref = useRef<DOMElement>(null);\n// const { width } = useContainerSize(ref);\n// return <Box ref={ref}>{width >= 100 ? <Wide /> : <Narrow />}</Box>;\nexport function useContainerSize(\n ref: RefObject<DOMElement | null>,\n): ContainerSize {\n const terminal = useTerminalSize();\n const [size, setSize] = useState<ContainerSize>({ width: 0, height: 0 });\n\n useEffect(() => {\n if (!ref.current) return;\n const measured = measureElement(ref.current);\n // Avoid an extra render when nothing changed (resize on unrelated dim).\n setSize((prev) =>\n prev.width === measured.width && prev.height === measured.height\n ? prev\n : measured,\n );\n // Re-measure on every terminal resize — that's when container width can\n // change, since Yoga reflows from the root.\n }, [ref, terminal.columns, terminal.rows]);\n\n return size;\n}\n","import React, { createContext, useContext } from 'react';\nimport type { ContainerSize } from '../../hooks/use-container-size.js';\n\nconst EMPTY_CONTENT_SIZE: ContainerSize = { width: 0, height: 0 };\n\nconst ContentSizeContext = createContext<ContainerSize>(EMPTY_CONTENT_SIZE);\n\nexport function ContentSizeProvider({\n children,\n value,\n}: {\n children: React.ReactNode;\n value: ContainerSize;\n}) {\n return (\n <ContentSizeContext.Provider value={value}>\n {children}\n </ContentSizeContext.Provider>\n );\n}\n\nexport function useContentSize(): ContainerSize {\n return useContext(ContentSizeContext);\n}\n","import { create } from 'zustand';\nimport type { LicenseData, LicenseStatus } from '../lib/license/types.js';\nimport * as manager from '../lib/license/license-manager.js';\nimport { getDegradationLevel } from '../lib/license/license-manager.js';\nimport type { DegradationLevel } from '../lib/license/license-manager.js';\nimport { ensureDataDirs } from '../lib/data-dir.js';\nimport { initStoreIntegrity } from '../lib/license/anti-tamper.js';\n\nconst REVALIDATION_CHECK_MS = 60 * 60 * 1000; // Check every hour\n\n// ARQ-002: Promise-based mutex for revalidation\nlet _revalidatingPromise: Promise<void> | null = null;\nlet _revalidationInterval: ReturnType<typeof setInterval> | null = null;\n\ninterface LicenseState {\n status: LicenseStatus;\n license: LicenseData | null;\n error: string | null;\n degradation: DegradationLevel;\n\n initialize: () => Promise<void>;\n activate: (key: string) => Promise<boolean>;\n deactivate: () => Promise<void>;\n revalidate: () => Promise<void>;\n isPro: () => boolean;\n isTeam: () => boolean;\n}\n\nasync function doRevalidation(\n license: LicenseData,\n set: (partial: Partial<LicenseState>) => void,\n): Promise<void> {\n const result = await manager.revalidate(license);\n if (result === 'expired') {\n set({ status: 'expired', license: { ...license, status: 'expired' }, degradation: 'expired' });\n } else {\n const updated = await manager.loadLicense();\n const effective = updated ?? license;\n set({ license: effective, degradation: getDegradationLevel(effective) });\n }\n}\n\nexport const useLicenseStore = create<LicenseState>((set, get) => ({\n status: 'validating',\n license: null,\n error: null,\n degradation: 'none',\n\n initialize: async () => {\n initStoreIntegrity(useLicenseStore);\n await ensureDataDirs();\n const license = await manager.loadLicense();\n\n if (!license) {\n set({ status: 'free', license: null, degradation: 'none' });\n return;\n }\n\n // SEG-009: built-in perennial accounts removed; every license — including\n // operator/admin — is validated against Polar like a normal customer.\n\n if (manager.isExpired(license)) {\n set({ status: 'expired', license, degradation: 'expired' });\n return;\n }\n\n // Layer 15: Check degradation level based on offline time\n const level = getDegradationLevel(license);\n if (level === 'expired') {\n set({ status: 'expired', license, degradation: 'expired' });\n return;\n }\n\n // Set tier immediately (warning/limited still shown as the licensed tier, but pro-guard checks degradation)\n set({ status: license.plan, license, degradation: level });\n\n if (manager.needsRevalidation(license)) {\n if (!_revalidatingPromise) {\n _revalidatingPromise = doRevalidation(license, set)\n .finally(() => { _revalidatingPromise = null; });\n }\n await _revalidatingPromise;\n }\n\n // Periodically re-check license validity during the session\n if (_revalidationInterval) clearInterval(_revalidationInterval);\n _revalidationInterval = setInterval(() => {\n const current = get().license;\n const status = get().status;\n if (!current || (status !== 'pro' && status !== 'team')) return;\n if (!manager.needsRevalidation(current)) return;\n if (_revalidatingPromise) return;\n _revalidatingPromise = doRevalidation(current, set)\n .finally(() => { _revalidatingPromise = null; });\n }, REVALIDATION_CHECK_MS);\n _revalidationInterval.unref();\n },\n\n activate: async (key) => {\n set({ error: null });\n try {\n const license = await manager.activate(key);\n set({ status: license.plan, license, degradation: 'none' });\n return true;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n set({ error: msg });\n return false;\n }\n },\n\n deactivate: async () => {\n const { license } = get();\n if (license) {\n const { remoteSuccess } = await manager.deactivate(license);\n if (!remoteSuccess) {\n set({ status: 'free', license: null, degradation: 'none', error: 'License removed locally but server deactivation failed. It may remain active remotely.' });\n return;\n }\n }\n set({ status: 'free', license: null, degradation: 'none', error: null });\n },\n\n revalidate: async () => {\n const { license } = get();\n if (!license) return;\n try {\n await doRevalidation(license, set);\n } catch (err) {\n set({ error: err instanceof Error ? err.message : String(err) });\n }\n },\n\n // Team is a superset of Pro — team users have full Pro access plus team features.\n // Pro users do NOT get Team features (Compliance) without paying for the Team tier.\n isPro: () => { const s = get().status; return s === 'pro' || s === 'team'; },\n isTeam: () => get().status === 'team',\n}));\n","import type { LicenseStatus } from './types.js';\n\ninterface LicenseStoreSnapshot {\n status: LicenseStatus;\n isPro: () => boolean;\n}\n\ninterface LicenseStoreApi {\n getState: () => LicenseStoreSnapshot;\n}\n\n// Lazy-captured references: initialized on first call to initStoreIntegrity()\nlet _originalIsPro: (() => boolean) | null = null;\nlet _originalGetState: (() => LicenseStoreSnapshot) | null = null;\nlet _storeApi: LicenseStoreApi | null = null;\n\n/**\n * Capture the original store function references for later integrity checks.\n * Call this once during license store initialization.\n */\nexport function initStoreIntegrity(store: LicenseStoreApi): void {\n _storeApi = store;\n _originalIsPro = store.getState().isPro;\n _originalGetState = store.getState;\n}\n\n/**\n * Verify that the license store's isPro function hasn't been replaced\n * with a function that always returns true.\n */\nexport function verifyStoreIntegrity(): boolean {\n if (!_storeApi || !_originalIsPro || !_originalGetState) return false;\n\n const state = _storeApi.getState();\n\n // Check 1: isPro function reference hasn't changed\n if (state.isPro !== _originalIsPro) return false;\n\n // Check 2: getState itself hasn't been replaced\n if (_storeApi.getState !== _originalGetState) return false;\n\n // Check 3: If status is 'free', isPro() must return false\n // (catches patches that make isPro() always return true regardless of status)\n if (state.status === 'free' && state.isPro()) return false;\n\n return true;\n}\n","import { useInput } from 'ink';\nimport { useNavigationStore } from '../stores/navigation-store.js';\nimport { useLocaleStore } from '../i18n/index.js';\nimport { useModalStore } from '../stores/modal-store.js';\n\nexport function useGlobalKeyboard(opts?: { onQuit?: () => void; disabled?: boolean }) {\n const navigate = useNavigationStore((s) => s.navigate);\n const goBack = useNavigationStore((s) => s.goBack);\n const menuMode = useNavigationStore((s) => s.menuMode);\n const enterMenuMode = useNavigationStore((s) => s.enterMenuMode);\n const exitMenuMode = useNavigationStore((s) => s.exitMenuMode);\n const moveMenuCursor = useNavigationStore((s) => s.moveMenuCursor);\n const selectMenuItem = useNavigationStore((s) => s.selectMenuItem);\n const { locale, setLocale } = useLocaleStore();\n const modalOpen = useModalStore((s) => s.isOpen);\n\n useInput((input, key) => {\n if (opts?.disabled) return;\n if (modalOpen) return;\n\n // Menu mode: arrows + enter operate the side menu, esc/m/q exit.\n if (menuMode) {\n if (input === 'q' || (key.ctrl && input === 'c')) {\n opts?.onQuit?.();\n return;\n }\n if (key.escape || input === 'm') {\n exitMenuMode();\n return;\n }\n if (key.upArrow) {\n moveMenuCursor(-1);\n return;\n }\n if (key.downArrow) {\n moveMenuCursor(1);\n return;\n }\n if (key.return) {\n selectMenuItem();\n return;\n }\n return;\n }\n\n if (input === 'q' || (key.ctrl && input === 'c')) {\n opts?.onQuit?.();\n return;\n }\n\n if (key.escape) {\n goBack();\n return;\n }\n\n if (input === 'm') {\n enterMenuMode();\n return;\n }\n\n if (input === 'S') {\n navigate('search');\n return;\n }\n\n if (input === 'L') {\n setLocale(locale === 'en' ? 'es' : 'en');\n return;\n }\n }, { isActive: !opts?.disabled });\n}\n","import { create } from 'zustand';\n\ninterface ModalState {\n // Reference counter: >0 means at least one suppressor is active.\n // Using a counter (not a boolean) prevents a nested suppressor's cleanup\n // from prematurely unblocking global keyboard when a sibling suppressor is\n // still active (e.g. SearchView holds results open while a ConfirmDialog\n // mounts and then dismisses).\n _count: number;\n isOpen: boolean;\n openModal: () => void;\n closeModal: () => void;\n}\n\nexport const useModalStore = create<ModalState>((set) => ({\n _count: 0,\n isOpen: false,\n openModal: () =>\n set((s) => {\n const next = s._count + 1;\n return { _count: next, isOpen: next > 0 };\n }),\n closeModal: () =>\n set((s) => {\n const next = Math.max(0, s._count - 1);\n return { _count: next, isOpen: next > 0 };\n }),\n}));\n","import { access, writeFile, mkdir } from 'node:fs/promises';\nimport { ensureDataDirs, ONBOARDING_FLAG_PATH, DATA_DIR } from './data-dir.js';\n\n// UX-002: a minimal first-run flag. The TUI flips this once the user dismisses\n// the welcome screen so subsequent launches go straight to the dashboard. The\n// file's *existence* is the signal — we never read its contents — which keeps\n// migration cost zero if we later decide to track richer state.\n\nlet cached: boolean | null = null;\n\nexport async function hasCompletedOnboarding(): Promise<boolean> {\n if (cached !== null) return cached;\n try {\n await access(ONBOARDING_FLAG_PATH);\n cached = true;\n } catch {\n cached = false;\n }\n return cached;\n}\n\nexport async function markOnboardingComplete(): Promise<void> {\n await ensureDataDirs();\n await mkdir(DATA_DIR, { recursive: true, mode: 0o700 });\n await writeFile(ONBOARDING_FLAG_PATH, new Date().toISOString(), {\n encoding: 'utf-8',\n mode: 0o600,\n });\n cached = true;\n}\n\n// Test seam — never call from production code.\nexport function _resetOnboardingCacheForTests(): void {\n cached = null;\n}\n","import React, { useEffect } from 'react';\nimport { Box, Text } from 'ink';\nimport { useViewInput } from '../hooks/use-view-input.js';\nimport { COLORS } from '../utils/colors.js';\nimport { GRADIENTS } from '../utils/gradient.js';\nimport { GradientText } from '../utils/gradient.js';\nimport { SPACING } from '../utils/spacing.js';\nimport { t } from '../i18n/index.js';\nimport { markOnboardingComplete } from '../lib/onboarding.js';\n\ninterface WelcomeViewProps {\n onContinue: () => void;\n}\n\n// UX-002: shown once on first run. The list mirrors the keys the footer hint\n// bar surfaces, so the user's mental model on entry matches the running app.\nexport function WelcomeView({ onContinue }: WelcomeViewProps) {\n useEffect(() => {\n return () => { /* cleanup not required */ };\n }, []);\n\n useViewInput((input, key) => {\n if (key.return || input === ' ' || key.escape) {\n void markOnboardingComplete().finally(onContinue);\n }\n });\n\n return (\n <Box flexDirection=\"column\" paddingY={SPACING.xs} paddingX={SPACING.sm} flexShrink={1}>\n <Box>\n <GradientText colors={GRADIENTS.gold} bold>{t('welcome_title')}</GradientText>\n </Box>\n\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.text} wrap=\"wrap\">{t('welcome_intro')}</Text>\n </Box>\n\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n <Text color={COLORS.muted}>{t('welcome_keysHeader')}</Text>\n <Box flexDirection=\"column\" paddingLeft={SPACING.sm}>\n <Text><Text color={COLORS.gold} bold>m</Text> {t('welcome_keyMenu')}</Text>\n <Text><Text color={COLORS.gold} bold>{'↑ ↓'}</Text> {t('welcome_keyMove')}</Text>\n <Text><Text color={COLORS.gold} bold>1-9</Text> {t('welcome_keyAction')}</Text>\n <Text><Text color={COLORS.gold} bold>Enter</Text> {t('welcome_keySelect')}</Text>\n <Text><Text color={COLORS.gold} bold>S</Text> {t('welcome_keySearch')}</Text>\n <Text><Text color={COLORS.gold} bold>Esc</Text> {t('welcome_keyBack')}</Text>\n <Text><Text color={COLORS.gold} bold>L</Text> {t('welcome_keyLocale')}</Text>\n <Text><Text color={COLORS.gold} bold>q</Text> {t('welcome_keyQuit')}</Text>\n </Box>\n </Box>\n\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n <Text color={COLORS.muted}>{t('welcome_proHeader')}</Text>\n <Box paddingLeft={SPACING.sm}>\n <Text color={COLORS.textSecondary} wrap=\"wrap\">{t('welcome_proIntro')}</Text>\n </Box>\n </Box>\n\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.success} bold>{t('welcome_continueHint')}</Text>\n </Box>\n </Box>\n );\n}\n","import { useInput } from 'ink';\nimport { useNavigationStore } from '../stores/navigation-store.js';\n\ntype InputHandler = Parameters<typeof useInput>[0];\ntype InputOptions = NonNullable<Parameters<typeof useInput>[1]>;\n\n// useInput wrapper that suppresses keypresses while the side menu is open.\n// All view-level useInput calls go through this so menu navigation owns\n// the arrow keys / enter without each view duplicating the gate.\nexport function useViewInput(handler: InputHandler, opts?: InputOptions) {\n const menuMode = useNavigationStore((s) => s.menuMode);\n const baseActive = opts?.isActive ?? true;\n useInput(handler, { ...opts, isActive: baseActive && !menuMode });\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { COLORS } from '../../utils/colors.js';\nimport { t } from '../../i18n/index.js';\nimport type { ViewId } from '../../lib/types.js';\nimport type { TranslationKey } from '../../i18n/en.js';\nimport { isTeamView } from '../../lib/license/feature-gate.js';\nimport { SPACING } from '../../utils/spacing.js';\n\nconst FEATURE_KEYS: Record<string, { title: TranslationKey; desc: TranslationKey }> = {\n profiles: { title: 'upgrade_profiles', desc: 'upgrade_profilesDesc' },\n 'smart-cleanup': { title: 'upgrade_cleanup', desc: 'upgrade_cleanupDesc' },\n history: { title: 'upgrade_history', desc: 'upgrade_historyDesc' },\n 'security-audit': { title: 'upgrade_security', desc: 'upgrade_securityDesc' },\n sync: { title: 'upgrade_sync', desc: 'upgrade_syncDesc' },\n compliance: { title: 'upgrade_compliance', desc: 'upgrade_complianceDesc' },\n rollback: { title: 'upgrade_rollback', desc: 'upgrade_rollbackDesc' },\n brewfile: { title: 'upgrade_brewfile', desc: 'upgrade_brewfileDesc' },\n};\n\ninterface UpgradePromptProps {\n viewId: ViewId;\n}\n\nexport function UpgradePrompt({ viewId }: UpgradePromptProps) {\n const keys = FEATURE_KEYS[viewId];\n if (!keys) return null;\n\n const title = t(keys.title);\n const team = isTeamView(viewId);\n const headerKey: TranslationKey = team ? 'upgrade_teamFeature' : 'upgrade_proFeature';\n const pricingKey: TranslationKey = team ? 'upgrade_teamPricing' : 'upgrade_pricing';\n const buyUrlKey: TranslationKey = team ? 'upgrade_buyUrlTeam' : 'upgrade_buyUrl';\n const labelKey: TranslationKey = team ? 'upgrade_teamLabel' : 'upgrade_proLabel';\n\n return (\n <Box flexDirection=\"column\" alignItems=\"center\" paddingY={SPACING.xs}>\n <Box\n borderStyle=\"double\"\n borderColor={COLORS.brand}\n paddingX={SPACING.sm}\n paddingY={SPACING.none}\n flexDirection=\"column\"\n alignItems=\"center\"\n flexShrink={1}\n width=\"80%\"\n >\n <Text bold color={COLORS.brand}>{'\\u2B50'} {t(headerKey, { title })}</Text>\n <Text color={COLORS.text} wrap=\"wrap\">{t(keys.desc)}</Text>\n <Box flexDirection=\"column\" alignItems=\"center\" marginTop={SPACING.xs}>\n <Text color={COLORS.info} bold>{t(pricingKey)}</Text>\n <Text color={COLORS.muted}>{t('upgrade_buyAt')}</Text>\n <Text color={COLORS.sky} bold>{t(buyUrlKey)}</Text>\n <Text color={COLORS.muted}>{t('upgrade_activateWith')}</Text>\n <Text color={COLORS.success} bold>{t('upgrade_activateCmd')}</Text>\n <Text color={COLORS.brand}>{t(labelKey)}</Text>\n </Box>\n </Box>\n </Box>\n );\n}\n","import React, { useEffect, useMemo } from 'react';\nimport { Box, Text } from 'ink';\nimport { useViewInput } from '../hooks/use-view-input.js';\nimport { useTerminalSize } from '../hooks/use-terminal-size.js';\nimport { useVisibleRows } from '../hooks/use-visible-rows.js';\nimport { useBrewStore } from '../stores/brew-store.js';\nimport { useSecurityStore } from '../stores/security-store.js';\nimport { useBrewfileStore } from '../stores/brewfile-store.js';\nimport { useSyncStore } from '../stores/sync-store.js';\nimport { useComplianceStore } from '../stores/compliance-store.js';\nimport { useLicenseStore } from '../stores/license-store.js';\nimport { StatCard } from '../components/common/stat-card.js';\nimport { Loading, ErrorMessage } from '../components/common/loading.js';\nimport { StatusBadge } from '../components/common/status-badge.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { VersionArrow } from '../components/common/version-arrow.js';\nimport { COLORS } from '../utils/colors.js';\nimport { GRADIENTS } from '../utils/gradient.js';\nimport { t } from '../i18n/index.js';\nimport { formatRelativeTime } from '../utils/format.js';\nimport { SPACING } from '../utils/spacing.js';\n\nfunction ProStatusPanel() {\n const security = useSecurityStore((s) => s.summary);\n const drift = useBrewfileStore((s) => s.drift);\n const syncConfig = useSyncStore((s) => s.config);\n const complianceReport = useComplianceStore((s) => s.report);\n\n const cveCount = security ? security.vulnerablePackages : null;\n const criticalCount = security ? security.criticalCount : null;\n\n const driftScore = drift ? drift.score : null;\n\n const lastSync = syncConfig?.lastSync ?? null;\n const syncAgo = lastSync ? formatRelativeTime(new Date(lastSync).getTime() / 1000) : null;\n\n const violationCount = complianceReport ? complianceReport.violations.length : null;\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={COLORS.purple} paddingX={SPACING.sm} paddingY={SPACING.none} marginTop={SPACING.xs}>\n <Text bold color={COLORS.purple}>{t('dashboard_pro_status')}</Text>\n <Box gap={SPACING.xs}>\n <Text color={COLORS.muted}>{t('dashboard_security')}</Text>\n {cveCount === null ? (\n <Text color={COLORS.muted}>—</Text>\n ) : cveCount === 0 ? (\n <Text color={COLORS.success}>{t('dashboard_no_cves')}</Text>\n ) : (\n <Text color={COLORS.error}>\n {t('dashboard_cves', { count: String(cveCount) })}\n {criticalCount && criticalCount > 0 ? ` (${criticalCount} critical)` : ''}\n </Text>\n )}\n </Box>\n <Box gap={SPACING.xs}>\n <Text color={COLORS.muted}>{t('dashboard_brewfile')}</Text>\n {driftScore === null ? (\n <Text color={COLORS.muted}>—</Text>\n ) : (\n <Text color={driftScore >= 80 ? COLORS.success : COLORS.warning}>{driftScore}%</Text>\n )}\n </Box>\n <Box gap={SPACING.xs}>\n <Text color={COLORS.muted}>{t('dashboard_sync')}</Text>\n {syncAgo === null ? (\n <Text color={COLORS.muted}>{t('dashboard_sync_never')}</Text>\n ) : (\n <Text color={COLORS.info}>{t('dashboard_sync_ago', { time: syncAgo })}</Text>\n )}\n </Box>\n <Box gap={SPACING.xs}>\n <Text color={COLORS.muted}>{t('dashboard_compliance')}</Text>\n {violationCount === null ? (\n <Text color={COLORS.muted}>—</Text>\n ) : violationCount === 0 ? (\n <Text color={COLORS.success}>{t('dashboard_compliance_ok')}</Text>\n ) : (\n <Text color={COLORS.warning}>{t('dashboard_compliance_violations', { count: String(violationCount) })}</Text>\n )}\n </Box>\n </Box>\n );\n}\n\nexport function DashboardView() {\n // PERF-004: granular selectors so a `loading` map mutation for an unrelated\n // key does not re-render the entire dashboard.\n const formulae = useBrewStore((s) => s.formulae);\n const casks = useBrewStore((s) => s.casks);\n const outdated = useBrewStore((s) => s.outdated);\n const services = useBrewStore((s) => s.services);\n const config = useBrewStore((s) => s.config);\n const loading = useBrewStore((s) => s.loading);\n const errors = useBrewStore((s) => s.errors);\n const lastFetchedAt = useBrewStore((s) => s.lastFetchedAt);\n const fetchAll = useBrewStore((s) => s.fetchAll);\n const isPro = useLicenseStore((s) => s.isPro);\n const { columns } = useTerminalSize();\n // Two split lists (outdated + service errors) share the remaining rows.\n // Reserve title, statcards (3 rows), system info block (~5 rows), and footers.\n const splitRows = useVisibleRows({\n reservedRows: 18,\n fallbackReservedRows: 22,\n minRows: 2,\n });\n const halfRows = Math.max(1, Math.floor(splitRows / 2));\n\n useEffect(() => { fetchAll(); }, []);\n\n // UX-008: `r` triggers a refetch from any state — error or not — so the\n // user can refresh the dashboard without leaving the view.\n useViewInput((input) => {\n if (input === 'r' || input === 'R' || input === '1') {\n void fetchAll();\n }\n });\n\n const errorServiceList = useMemo(\n () => services.filter((s) => s.status === 'error'),\n [services]\n );\n const runningServices = useMemo(\n () => services.filter((s) => s.status === 'started').length,\n [services]\n );\n const errorServices = errorServiceList.length;\n const partialErrors = [\n errors.outdated ? { label: t('dashboard_outdated'), message: errors.outdated } : null,\n errors.services ? { label: t('dashboard_services'), message: errors.services } : null,\n errors.config ? { label: t('dashboard_systemInfo'), message: errors.config } : null,\n ].filter((item): item is { label: string; message: string } => item !== null);\n const outdatedValue = loading.outdated\n ? '...'\n : errors.outdated\n ? t('dashboard_statError')\n : outdated.formulae.length + outdated.casks.length;\n const servicesValue = loading.services\n ? '...'\n : errors.services\n ? t('dashboard_statError')\n : `${runningServices}/${services.length}`;\n\n // ARQ-004: Last updated timestamp\n const lastUpdated = lastFetchedAt.installed\n ? formatRelativeTime(lastFetchedAt.installed / 1000)\n : null;\n\n if (loading.installed) return <Loading message={t('loading_fetchingBrew')} />;\n if (errors.installed) {\n return (\n <Box flexDirection=\"column\">\n <ErrorMessage message={errors.installed} />\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.textSecondary}>r:{t('hint_refresh')}</Text>\n </Box>\n </Box>\n );\n }\n\n // SCR-018: Responsive layout\n const isNarrow = columns < 60;\n\n return (\n <Box flexDirection=\"column\" gap={SPACING.sm}>\n <SectionHeader emoji={'\\u{1F4CA}'} title={t('dashboard_overview')} gradient={GRADIENTS.gold} />\n\n <Box gap={SPACING.xs} flexWrap=\"wrap\" flexDirection={isNarrow ? 'column' : 'row'}>\n <StatCard label={t('dashboard_formulae')} value={formulae.length} color={COLORS.info} />\n <StatCard label={t('dashboard_casks')} value={casks.length} color={COLORS.purple} />\n <StatCard\n label={t('dashboard_outdated')}\n value={outdatedValue}\n color={typeof outdatedValue === 'number' && outdatedValue > 0 ? COLORS.warning : (errors.outdated ? COLORS.error : COLORS.success)}\n />\n <StatCard\n label={t('dashboard_services')}\n value={servicesValue}\n color={errors.services || errorServices > 0 ? COLORS.error : COLORS.success}\n />\n </Box>\n\n {/* ARQ-004: Show last updated */}\n {lastUpdated && (\n <Text color={COLORS.muted}>{t('dashboard_lastUpdated', { time: lastUpdated })}</Text>\n )}\n\n {partialErrors.length > 0 && (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={COLORS.warning} paddingX={SPACING.sm} paddingY={SPACING.none}>\n <Text color={COLORS.warning} bold>{t('dashboard_partialData')}</Text>\n {partialErrors.map((item) => (\n <Text key={item.label} color={COLORS.muted}>\n {item.label}: {item.message}\n </Text>\n ))}\n </Box>\n )}\n\n {config && !errors.config && (\n <Box flexDirection=\"column\">\n <SectionHeader emoji={'\\u2139\\uFE0F'} title={t('dashboard_systemInfo')} gradient={[COLORS.text, COLORS.muted]} />\n <Box borderStyle=\"round\" borderColor={COLORS.blue} paddingX={SPACING.sm} paddingY={SPACING.none} flexDirection=\"column\" marginTop={SPACING.xs}>\n <Text><Text color={COLORS.muted}>{t('dashboard_homebrew')}</Text> {config.HOMEBREW_VERSION}</Text>\n <Text><Text color={COLORS.muted}>{t('dashboard_prefix')}</Text> {config.HOMEBREW_PREFIX}</Text>\n <Text><Text color={COLORS.muted}>{t('dashboard_updated')}</Text> {config.coreUpdated}</Text>\n </Box>\n </Box>\n )}\n\n {!errors.outdated && outdated.formulae.length > 0 && (\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n <SectionHeader emoji={'\\u{1F4E6}'} title={t('dashboard_outdatedPackages')} gradient={GRADIENTS.fire} />\n <Box paddingLeft={SPACING.sm} flexDirection=\"column\">\n {outdated.formulae.slice(0, halfRows).map((pkg) => (\n <Box key={pkg.name} gap={SPACING.xs}>\n <Text color={COLORS.text}>{pkg.name}</Text>\n <VersionArrow current={pkg.installed_versions[0] ?? ''} latest={pkg.current_version} />\n </Box>\n ))}\n {outdated.formulae.length > halfRows && (\n <Text color={COLORS.textSecondary} italic>{t('common_andMore', { count: outdated.formulae.length - halfRows })}</Text>\n )}\n </Box>\n </Box>\n )}\n\n {!errors.services && errorServices > 0 && (\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n <SectionHeader emoji={'\\u26A0\\uFE0F'} title={t('dashboard_serviceErrors')} color={COLORS.error} />\n <Box paddingLeft={SPACING.sm} flexDirection=\"column\">\n {errorServiceList.slice(0, halfRows).map((s) => (\n <Box key={s.name} gap={SPACING.xs}>\n <StatusBadge label={t('badge_error')} variant=\"error\" />\n <Text>{s.name}</Text>\n {s.exit_code != null && <Text color={COLORS.muted}>{t('common_exit', { code: s.exit_code })}</Text>}\n </Box>\n ))}\n {errorServiceList.length > halfRows && (\n <Text color={COLORS.textSecondary} italic>{t('common_andMore', { count: errorServiceList.length - halfRows })}</Text>\n )}\n </Box>\n </Box>\n )}\n\n {isPro() && <ProStatusPanel />}\n </Box>\n );\n}\n","import { useContentSize } from '../components/layout/content-size-context.js';\nimport { useTerminalSize } from './use-terminal-size.js';\n\ninterface VisibleRowsOptions {\n reservedRows: number;\n fallbackReservedRows?: number;\n minRows?: number;\n}\n\nexport function useVisibleRows({\n reservedRows,\n fallbackReservedRows = reservedRows,\n minRows = 3,\n}: VisibleRowsOptions): number {\n const { height: contentHeight } = useContentSize();\n const { rows: terminalRows } = useTerminalSize();\n const availableRows =\n contentHeight > 0\n ? contentHeight - reservedRows\n : terminalRows - fallbackReservedRows;\n\n return Math.max(minRows, Math.floor(availableRows));\n}\n","import { create } from 'zustand';\nimport type { Formula, Cask, OutdatedPackage, BrewService, BrewConfig } from '../lib/types.js';\nimport * as api from '../lib/brew-api.js';\nimport { logger } from '../utils/logger.js';\n\nconst BREW_UPDATE_COOLDOWN_MS = 5 * 60 * 1000;\n\nlet fetchAllInFlight: Promise<void> | null = null;\nlet brewUpdateInFlight: Promise<void> | null = null;\nlet lastBrewUpdateStartedAt = 0;\n\ninterface BrewState {\n formulae: Formula[];\n casks: Cask[];\n outdated: { formulae: OutdatedPackage[]; casks: OutdatedPackage[] };\n services: BrewService[];\n config: BrewConfig | null;\n leaves: string[];\n doctorWarnings: string[];\n doctorClean: boolean | null;\n\n loading: Record<string, boolean>;\n errors: Record<string, string | null>;\n lastFetchedAt: Record<string, number>;\n\n fetchInstalled: () => Promise<void>;\n fetchOutdated: () => Promise<void>;\n fetchServices: () => Promise<void>;\n fetchConfig: () => Promise<void>;\n fetchLeaves: () => Promise<void>;\n fetchDoctor: () => Promise<void>;\n fetchAll: () => Promise<void>;\n\n uninstallPackage: (name: string) => Promise<void>;\n serviceAction: (name: string, action: 'start' | 'stop' | 'restart') => Promise<void>;\n}\n\nfunction setLoading(set: (fn: (s: BrewState) => Partial<BrewState>) => void, key: string, value: boolean) {\n set((s) => ({ loading: { ...s.loading, [key]: value } }));\n}\n\nfunction setError(set: (fn: (s: BrewState) => Partial<BrewState>) => void, key: string, error: string | null) {\n set((s) => ({ errors: { ...s.errors, [key]: error } }));\n}\n\nfunction recordFetchTime(set: (fn: (s: BrewState) => Partial<BrewState>) => void, key: string) {\n set((s) => ({ lastFetchedAt: { ...s.lastFetchedAt, [key]: Date.now() } }));\n}\n\nexport const useBrewStore = create<BrewState>((set, get) => ({\n formulae: [],\n casks: [],\n outdated: { formulae: [], casks: [] },\n services: [],\n config: null,\n leaves: [],\n doctorWarnings: [],\n doctorClean: null,\n // Pre-initialize loading flags for keys that fetchAll always triggers so\n // views that check loading.X get a spinner on first render rather than\n // flashing empty/zeroed content for one frame before the fetch starts.\n // SCR-013: Pre-initialize doctor loading to true\n loading: { installed: true, outdated: true, services: true, config: true, doctor: true },\n errors: {},\n lastFetchedAt: {},\n\n fetchInstalled: async () => {\n setLoading(set, 'installed', true);\n setError(set, 'installed', null);\n try {\n const result = await api.getInstalled();\n set({ formulae: result.formulae, casks: result.casks });\n } catch (err) {\n setError(set, 'installed', err instanceof Error ? err.message : String(err));\n } finally {\n setLoading(set, 'installed', false);\n recordFetchTime(set, 'installed');\n }\n },\n\n fetchOutdated: async () => {\n setLoading(set, 'outdated', true);\n setError(set, 'outdated', null);\n try {\n const result = await api.getOutdated();\n set({ outdated: result });\n } catch (err) {\n setError(set, 'outdated', err instanceof Error ? err.message : String(err));\n } finally {\n setLoading(set, 'outdated', false);\n recordFetchTime(set, 'outdated');\n }\n },\n\n fetchServices: async () => {\n setLoading(set, 'services', true);\n setError(set, 'services', null);\n try {\n const result = await api.getServices();\n set({ services: result });\n } catch (err) {\n setError(set, 'services', err instanceof Error ? err.message : String(err));\n } finally {\n setLoading(set, 'services', false);\n recordFetchTime(set, 'services');\n }\n },\n\n fetchConfig: async () => {\n setLoading(set, 'config', true);\n try {\n const result = await api.getConfig();\n set({ config: result });\n } catch (err) {\n setError(set, 'config', err instanceof Error ? err.message : String(err));\n } finally {\n setLoading(set, 'config', false);\n recordFetchTime(set, 'config');\n }\n },\n\n fetchLeaves: async () => {\n try {\n const result = await api.getLeaves();\n set({ leaves: result });\n } catch (err) {\n // QA-021: Use structured logger unconditionally\n logger.error('fetchLeaves failed', { error: err instanceof Error ? err.message : String(err) });\n } finally {\n recordFetchTime(set, 'leaves');\n }\n },\n\n fetchDoctor: async () => {\n setLoading(set, 'doctor', true);\n setError(set, 'doctor', null);\n try {\n const result = await api.getDoctor();\n set({ doctorWarnings: result.warnings, doctorClean: result.isClean });\n } catch (err) {\n setError(set, 'doctor', err instanceof Error ? err.message : String(err));\n } finally {\n setLoading(set, 'doctor', false);\n recordFetchTime(set, 'doctor');\n }\n },\n\n fetchAll: async (): Promise<void> => {\n if (fetchAllInFlight) {\n return fetchAllInFlight;\n }\n\n const now = Date.now();\n if (!brewUpdateInFlight && now - lastBrewUpdateStartedAt > BREW_UPDATE_COOLDOWN_MS) {\n lastBrewUpdateStartedAt = now;\n // Don't block on brew update — run in background.\n // This is equivalent to the auto-update that `brew` does by default,\n // which we disable per-command with HOMEBREW_NO_AUTO_UPDATE=1.\n // ARQ-003: Capture brew update errors in store\n brewUpdateInFlight = api.brewUpdate()\n .catch((err) => { set((s) => ({ errors: { ...s.errors, update: String(err) } })); })\n .finally(() => {\n brewUpdateInFlight = null;\n });\n }\n\n const store = get();\n fetchAllInFlight = Promise.all([\n store.fetchInstalled(),\n store.fetchOutdated(),\n store.fetchServices(),\n store.fetchConfig(),\n store.fetchLeaves(),\n store.fetchDoctor(),\n ]).then(() => undefined)\n .finally(() => {\n fetchAllInFlight = null;\n });\n\n return fetchAllInFlight;\n },\n\n uninstallPackage: async (name) => {\n setLoading(set, 'action', true);\n try {\n await api.uninstallPackage(name);\n await get().fetchInstalled();\n } catch (err) {\n setError(set, 'action', err instanceof Error ? err.message : String(err));\n } finally {\n setLoading(set, 'action', false);\n }\n },\n\n serviceAction: async (name, action) => {\n setLoading(set, 'service-action', true);\n try {\n await api.serviceAction(name, action);\n await get().fetchServices();\n } catch (err) {\n setError(set, 'service-action', err instanceof Error ? err.message : String(err));\n } finally {\n setLoading(set, 'service-action', false);\n }\n },\n}));\n","import { create } from 'zustand';\nimport type { SecurityAuditSummary } from '../lib/security/types.js';\nimport { runSecurityAudit } from '../lib/security/audit-runner.js';\nimport { useBrewStore } from './brew-store.js';\nimport { useLicenseStore } from './license-store.js';\nimport { verifyPro } from '../lib/license/pro-guard.js';\n\nconst CACHE_TTL_MS = 30 * 60 * 1000; // 30 minutes\n\ninterface SecurityState {\n summary: SecurityAuditSummary | null;\n loading: boolean;\n error: string | null;\n cachedAt: number | null;\n\n scan: (forceRefresh?: boolean) => Promise<void>;\n}\n\nexport const useSecurityStore = create<SecurityState>((set, get) => ({\n summary: null,\n loading: false,\n error: null,\n cachedAt: null,\n\n scan: async (forceRefresh = false) => {\n // ARQ-005: Use cached results if available and fresh\n const { summary, cachedAt } = get();\n if (!forceRefresh && summary && cachedAt && Date.now() - cachedAt < CACHE_TTL_MS) {\n return;\n }\n\n set({ loading: true, error: null });\n try {\n const brewState = useBrewStore.getState();\n if (brewState.formulae.length === 0) {\n await brewState.fetchInstalled();\n }\n const { formulae, casks } = useBrewStore.getState();\n const { license, status } = useLicenseStore.getState();\n const isPro = verifyPro(license, status);\n const result = await runSecurityAudit(isPro, formulae, casks);\n set({ summary: result, loading: false, cachedAt: Date.now() });\n } catch (err) {\n set({ error: err instanceof Error ? err.message : String(err), loading: false });\n }\n },\n}));\n","import type { Vulnerability, Severity } from './types.js';\nimport { fetchWithRetry } from '../fetch-timeout.js';\nimport { logger } from '../../utils/logger.js';\n\nconst OSV_BATCH_URL = 'https://api.osv.dev/v1/querybatch';\n\ninterface OsvQuery {\n package: { name: string; ecosystem: string };\n version: string;\n}\n\ninterface OsvVulnerability {\n id: string;\n summary?: string;\n severity?: Array<{ type: string; score: string }>;\n affected?: Array<{\n ranges?: Array<{\n events?: Array<{ fixed?: string }>;\n }>;\n }>;\n references?: Array<{ url: string }>;\n database_specific?: { severity?: string };\n}\n\ninterface OsvBatchResponse {\n results: Array<{ vulns?: OsvVulnerability[] }>;\n}\n\nfunction mapSeverity(vuln: OsvVulnerability): Severity {\n // Check database_specific severity first\n const dbSev = vuln.database_specific?.severity?.toUpperCase();\n if (dbSev && ['CRITICAL', 'HIGH', 'MEDIUM', 'LOW'].includes(dbSev)) {\n return dbSev as Severity;\n }\n\n // Check CVSS score\n const cvss = vuln.severity?.find((s) => s.type === 'CVSS_V3');\n if (cvss) {\n const score = parseFloat(cvss.score);\n if (score >= 9.0) return 'CRITICAL';\n if (score >= 7.0) return 'HIGH';\n if (score >= 4.0) return 'MEDIUM';\n return 'LOW';\n }\n\n return 'UNKNOWN';\n}\n\nfunction getFixedVersion(vuln: OsvVulnerability): string | null {\n for (const affected of vuln.affected ?? []) {\n for (const range of affected.ranges ?? []) {\n for (const event of range.events ?? []) {\n if (event.fixed) return event.fixed;\n }\n }\n }\n return null;\n}\n\nconst BATCH_SIZE = 100;\n\nasync function queryBatch(\n packages: Array<{ name: string; version: string }>,\n queries: OsvQuery[],\n): Promise<Map<string, Vulnerability[]>> {\n // 400 means a bad query (don't retry); 5xx/network errors are retried with backoff.\n // 429 (rate limit) is handled separately in queryOneByOne, so don't retry it here.\n const res = await fetchWithRetry(OSV_BATCH_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ queries }),\n }, 15_000, {\n retryOn: (r) => r.status >= 500 && r.status < 600,\n });\n\n if (!res.ok) {\n // On 400, try individual queries to isolate bad packages\n if (res.status === 400 && queries.length > 1) {\n return queryOneByOne(packages);\n }\n throw new Error(`OSV API error: ${res.status} ${res.statusText}`);\n }\n\n const data = (await res.json()) as OsvBatchResponse;\n\n // EP-003: Validate response structure\n if (!data || !Array.isArray(data.results)) {\n throw new Error('Invalid OSV API response: missing results array');\n }\n if (data.results.length !== packages.length) {\n throw new Error(`OSV API response mismatch: expected ${packages.length} results, got ${data.results.length}`);\n }\n\n const result = new Map<string, Vulnerability[]>();\n\n for (let i = 0; i < packages.length; i++) {\n const vulns = data.results[i]?.vulns;\n if (!vulns || vulns.length === 0) continue;\n\n result.set(\n packages[i]!.name,\n vulns.map((v) => ({\n id: v.id,\n summary: v.summary ?? 'No description available',\n severity: mapSeverity(v),\n fixedVersion: getFixedVersion(v),\n references: v.references?.map((r) => r.url) ?? [],\n })),\n );\n }\n\n return result;\n}\n\nasync function queryOneByOne(\n packages: Array<{ name: string; version: string }>,\n): Promise<Map<string, Vulnerability[]>> {\n const result = new Map<string, Vulnerability[]>();\n const errors: string[] = [];\n\n for (const pkg of packages) {\n try {\n const partial = await queryBatch(\n [pkg],\n [{ package: { name: pkg.name, ecosystem: 'Bitnami' }, version: pkg.version }],\n );\n for (const [k, v] of partial) result.set(k, v);\n } catch (err) {\n // EP-004: Only skip on 400 (bad request for that package). Re-throw on 5xx or network errors.\n const msg = err instanceof Error ? err.message : String(err);\n if (msg.includes('400')) {\n errors.push(`Skipped ${pkg.name}: ${msg}`);\n continue;\n }\n // For rate limiting (429), apply backoff\n if (msg.includes('429')) {\n logger.warn(`Rate limited by OSV API, backing off`, { package: pkg.name });\n await new Promise(r => setTimeout(r, 2000));\n // Retry once after backoff\n try {\n const retryResult = await queryBatch(\n [pkg],\n [{ package: { name: pkg.name, ecosystem: 'Bitnami' }, version: pkg.version }],\n );\n for (const [k, v] of retryResult) result.set(k, v);\n } catch {\n errors.push(`Failed after retry ${pkg.name}: ${msg}`);\n }\n continue;\n }\n // Network/server errors: log and continue instead of failing entire scan\n logger.error(`OSV query failed for ${pkg.name}: ${msg}`);\n errors.push(`${pkg.name}: ${msg}`);\n }\n\n // EP-008: Rate limit protection — small delay between individual requests\n await new Promise(r => setTimeout(r, 75));\n }\n\n if (errors.length > 0) {\n logger.warn(`OSV query errors for ${errors.length} packages`, { errors: errors.slice(0, 5) });\n }\n\n return result;\n}\n\nexport async function queryVulnerabilities(\n packages: Array<{ name: string; version: string }>,\n): Promise<Map<string, Vulnerability[]>> {\n // EP-007: Filter out packages with empty/undefined/null versions\n const validPackages = packages.filter(\n (p) => p.version && typeof p.version === 'string' && p.version.trim().length > 0,\n );\n\n const result = new Map<string, Vulnerability[]>();\n\n // Split into batches to stay within OSV API limits\n for (let i = 0; i < validPackages.length; i += BATCH_SIZE) {\n const batch = validPackages.slice(i, i + BATCH_SIZE);\n // OSV.dev no soporta \"Homebrew\" como ecosystem (HTTP 400).\n // \"Bitnami\" cubre la mayoría de OSS comunes; paquetes fuera de su catálogo\n // simplemente devuelven vulns vacíos. Mismo enfoque que SecurityMonitor.swift.\n const queries: OsvQuery[] = batch.map((p) => ({\n package: { name: p.name, ecosystem: 'Bitnami' },\n version: p.version,\n }));\n\n const partial = await queryBatch(batch, queries);\n for (const [k, v] of partial) result.set(k, v);\n }\n\n return result;\n}\n","import { queryVulnerabilities } from './osv-api.js';\nimport type { Formula, Cask } from '../types.js';\nimport type { PackageAuditResult, SecurityAuditSummary, Severity } from './types.js';\n\nconst SEVERITY_ORDER: Record<Severity, number> = {\n CRITICAL: 4,\n HIGH: 3,\n MEDIUM: 2,\n LOW: 1,\n UNKNOWN: 0,\n};\n\nexport async function runSecurityAudit(\n isPro: boolean,\n formulae: Formula[],\n casks: Cask[],\n): Promise<SecurityAuditSummary> {\n if (!isPro) throw new Error('Pro license required');\n\n const packages: Array<{ name: string; version: string }> = [];\n\n for (const f of formulae) {\n const version = f.installed[0]?.version ?? f.versions.stable;\n packages.push({ name: f.name, version });\n }\n\n for (const c of casks) {\n if (c.installed) {\n packages.push({ name: c.token, version: c.installed });\n }\n }\n\n // Batch query (OSV supports up to 1000)\n const vulnMap = await queryVulnerabilities(packages);\n\n const results: PackageAuditResult[] = [];\n let criticalCount = 0;\n let highCount = 0;\n let mediumCount = 0;\n let lowCount = 0;\n\n for (const [name, vulns] of vulnMap) {\n const pkg = packages.find((p) => p.name === name);\n if (!pkg) continue;\n\n const maxSeverity = vulns.reduce<Severity>((max, v) =>\n SEVERITY_ORDER[v.severity] > SEVERITY_ORDER[max] ? v.severity : max,\n 'UNKNOWN',\n );\n\n results.push({\n packageName: name,\n installedVersion: pkg.version,\n vulnerabilities: vulns,\n maxSeverity,\n });\n\n for (const v of vulns) {\n if (v.severity === 'CRITICAL') criticalCount++;\n else if (v.severity === 'HIGH') highCount++;\n else if (v.severity === 'MEDIUM') mediumCount++;\n else if (v.severity === 'LOW') lowCount++;\n }\n }\n\n // Sort by severity (most severe first)\n results.sort((a, b) => SEVERITY_ORDER[b.maxSeverity] - SEVERITY_ORDER[a.maxSeverity]);\n\n return {\n scannedAt: new Date().toISOString(),\n totalPackages: packages.length,\n vulnerablePackages: results.length,\n criticalCount,\n highCount,\n mediumCount,\n lowCount,\n results,\n };\n}\n","import inspector from 'node:inspector';\n\ndeclare const __TEST_MODE__: boolean;\n\n/**\n * Detect if a debugger/inspector is attached.\n * If detected, Pro features are disabled as a precaution.\n * In test builds (__TEST_MODE__ is replaced at compile time by tsup),\n * detection is skipped to avoid false-positives with vitest --inspect-brk.\n */\nexport function isDebuggerAttached(): boolean {\n // Compile-time flag — replaced to `false` in production builds\n if (typeof __TEST_MODE__ !== 'undefined' && __TEST_MODE__) return false;\n\n // Node.js inspector protocol active\n if (inspector.url()) return true;\n\n // Debug flags in process arguments\n if (process.execArgv.some((a) => a.includes('--inspect') || a.includes('--debug'))) return true;\n\n // Debug environment variables\n if (process.env.NODE_OPTIONS?.includes('--inspect')) return true;\n\n return false;\n}\n","/**\n * Canary functions for detecting license bypass attempts.\n *\n * These functions LOOK like they gate Pro features but are actually\n * trap checks. They should always return false in normal operation.\n * If they return true, it means someone patched the code to bypass\n * license checks indiscriminately.\n */\n\n// Looks like a Pro check but should NEVER be true in production\n// If someone does a global find-replace to make all license checks return true,\n// this will also return true, triggering the tamper detection.\nlet _canaryTripped = false;\n\nexport function isProUnlocked(): boolean {\n // This function name looks like a legitimate license gate.\n // If someone patches it to return true, we detect the tamper.\n return false;\n}\n\nexport function hasProAccess(): boolean {\n // Another decoy. Should always return false.\n return false;\n}\n\nexport function isLicenseValid(): boolean {\n // Decoy #3\n return false;\n}\n\n/**\n * Check if any canary has been tripped (patched to return true).\n * If so, the binary has been tampered with.\n */\nexport function checkCanaries(): boolean {\n // If ANY of these return true, someone did a blanket patch\n if (isProUnlocked()) { _canaryTripped = true; return false; }\n if (hasProAccess()) { _canaryTripped = true; return false; }\n if (isLicenseValid()) { _canaryTripped = true; return false; }\n return !_canaryTripped;\n}\n","import { readFileSync } from 'node:fs';\nimport { createHash } from 'node:crypto';\nimport { fileURLToPath } from 'node:url';\n\n// Hash captured at module-load time (earliest possible moment in this process).\n// This detects file modification that occurs AFTER the module has already been\n// loaded into the process — i.e. an attacker who patches the file on-disk while\n// the TUI is running. It does NOT detect patches applied before or during\n// module load. For that, a signed bundle with an external manifest would be required.\nlet _baselineHash: string | null = null;\n\n// In dev (`tsx`), `import.meta.url` points at the live TS source which can be\n// re-transpiled; baseline capture is unreliable and must fail-open so devs can\n// run the TUI. In production (`NODE_ENV !== 'development'`) the bundle is a\n// static .js file and any failure to read it is treated as tampering.\nconst _isProduction = process.env.NODE_ENV !== 'development'\n && process.env.NODE_ENV !== 'test';\n\nfunction _captureBaseline(): string | null {\n try {\n const bundlePath = fileURLToPath(import.meta.url);\n const content = readFileSync(bundlePath, 'utf-8');\n return createHash('sha256').update(content).digest('hex');\n } catch {\n return null;\n }\n}\n\n// Capture immediately at module load — do not defer.\n_baselineHash = _captureBaseline();\n\n/**\n * Detect on-disk modification of the running bundle after process start.\n * Returns false only if the file was verifiably changed since module load.\n *\n * Dev mode (NODE_ENV=development|test): fails open if the baseline could not\n * be captured or the file cannot be re-read, so `npm run dev` and the test\n * runner are not blocked by tsx-relative paths.\n *\n * Production: fail-closed in both code paths — a missing baseline or an\n * unreadable bundle both mean we cannot prove integrity, so we deny access.\n */\nexport function checkBundleIntegrity(): boolean {\n if (_baselineHash === null) {\n return !_isProduction;\n }\n try {\n const bundlePath = fileURLToPath(import.meta.url);\n const content = readFileSync(bundlePath, 'utf-8');\n const current = createHash('sha256').update(content).digest('hex');\n return current === _baselineHash;\n } catch {\n // SEG-006: Fail closed in production; in dev keep the TUI usable.\n return !_isProduction;\n }\n}\n","import { isDebuggerAttached } from './anti-debug.js';\nimport { verifyStoreIntegrity } from './anti-tamper.js';\nimport { checkCanaries } from './canary.js';\nimport { checkBundleIntegrity } from './integrity.js';\nimport { getDegradationLevel } from './license-manager.js';\nimport type { LicenseData, LicenseStatus } from './types.js';\n\n// ── Layer 14: Obfuscated secondary verification ──\n// Secondary verification using indirect property access.\n// Resists simple string-search bypass (searching for \"status\" or \"pro\").\nconst _P = String.fromCharCode(112, 114, 111); // \"pro\"\n\nexport function _verify(status: string): boolean {\n return status === _P;\n}\n\n/**\n * Multi-layered Pro license verification. Call this inside Pro feature logic\n * (not just at the view gate) as a defense-in-depth check.\n * Combines direct store check, bundle integrity, debugger detection,\n * obfuscated indirect check, store integrity, canary checks, and\n * degradation level.\n * Returns true if Pro, false otherwise.\n */\nexport function verifyPro(license: LicenseData | null, status: LicenseStatus): boolean {\n if (isDebuggerAttached()) return false;\n if (!checkBundleIntegrity()) return false;\n if (!verifyStoreIntegrity()) return false;\n if (!checkCanaries()) return false;\n\n const directCheck = status === 'pro';\n const indirectCheck = _verify(status);\n\n // Both must agree — if someone patched one, the other catches it\n if (!directCheck || !indirectCheck) return false;\n\n // Layer 15: Check degradation level (time-bomb for extended offline)\n if (license) {\n const level = getDegradationLevel(license);\n if (level === 'expired' || level === 'limited') return false;\n }\n\n return true;\n}\n\n/**\n * Throws if not Pro. Use in critical Pro-only operations.\n */\nexport function requirePro(license: LicenseData | null, status: LicenseStatus): void {\n if (!verifyPro(license, status)) {\n throw new Error('Pro license required');\n }\n}\n","import { create } from 'zustand';\nimport type { BrewfileSchema, DriftReport } from '../lib/brewfile/types.js';\nimport {\n loadBrewfile,\n saveBrewfile,\n computeDrift,\n createDefaultBrewfile,\n} from '../lib/brewfile/brewfile-manager.js';\n\ninterface BrewfileState {\n schema: BrewfileSchema | null;\n drift: DriftReport | null;\n loading: boolean;\n driftLoading: boolean;\n error: string | null;\n\n load: () => Promise<void>;\n save: (schema: BrewfileSchema) => Promise<void>;\n refreshDrift: () => Promise<void>;\n createFromCurrent: (name: string) => Promise<void>;\n}\n\nexport const useBrewfileStore = create<BrewfileState>((set, get) => ({\n schema: null,\n drift: null,\n loading: false,\n driftLoading: false,\n error: null,\n\n load: async () => {\n set({ loading: true, error: null });\n try {\n const schema = await loadBrewfile();\n set({ schema, loading: false });\n if (schema) {\n void get().refreshDrift();\n }\n } catch (err) {\n set({ error: err instanceof Error ? err.message : String(err), loading: false });\n }\n },\n\n save: async (schema) => {\n set({ error: null });\n try {\n await saveBrewfile(schema);\n set({ schema });\n } catch (err) {\n set({ error: err instanceof Error ? err.message : String(err) });\n }\n },\n\n refreshDrift: async () => {\n const { schema } = get();\n if (!schema) return;\n set({ driftLoading: true, error: null });\n try {\n const drift = await computeDrift(schema);\n set({ drift, driftLoading: false });\n } catch (err) {\n set({ error: err instanceof Error ? err.message : String(err), driftLoading: false });\n }\n },\n\n createFromCurrent: async (name) => {\n set({ loading: true, error: null });\n try {\n const schema = await createDefaultBrewfile(name);\n await saveBrewfile(schema);\n set({ schema, loading: false });\n void get().refreshDrift();\n } catch (err) {\n set({ error: err instanceof Error ? err.message : String(err), loading: false });\n }\n },\n}));\n","import { create } from 'zustand';\nimport type { SyncConfig, SyncConflict, SyncResult } from '../lib/sync/types.js';\nimport {\n sync,\n loadSyncConfig,\n applyConflictResolutions,\n} from '../lib/sync/sync-engine.js';\nimport { readSyncEnvelope } from '../lib/sync/backends/icloud-backend.js';\nimport { decryptPayload } from '../lib/sync/crypto.js';\nimport { loadLicense } from '../lib/license/license-manager.js';\nimport { logger } from '../utils/logger.js';\nimport type { BrewfileSchema } from '../lib/brewfile/types.js';\n\ninterface SyncState {\n config: SyncConfig | null;\n lastResult: SyncResult | null;\n conflicts: SyncConflict[];\n loading: boolean;\n error: string | null;\n\n initialize: (isPro: boolean) => Promise<void>;\n syncNow: (isPro: boolean, brewfile?: BrewfileSchema) => Promise<void>;\n resolveConflicts: (\n resolutions: Array<{ conflict: SyncConflict; resolution: 'use-local' | 'use-remote' }>,\n ) => Promise<void>;\n}\n\nexport const useSyncStore = create<SyncState>((set, get) => ({\n config: null,\n lastResult: null,\n conflicts: [],\n loading: false,\n error: null,\n\n initialize: async (isPro: boolean) => {\n if (!isPro) return;\n try {\n const config = await loadSyncConfig();\n set({ config });\n } catch (err) {\n logger.warn('sync-store: could not load config', { error: String(err) });\n }\n },\n\n syncNow: async (isPro: boolean, brewfile?: BrewfileSchema) => {\n set({ loading: true, error: null });\n try {\n const result = await sync(isPro, brewfile);\n if (result.conflicts.length > 0) {\n set({ conflicts: result.conflicts, lastResult: result, loading: false });\n } else {\n const config = await loadSyncConfig();\n set({ config, lastResult: result, conflicts: [], loading: false });\n }\n } catch (err) {\n const error = err instanceof Error ? err.message : String(err);\n set({ error, loading: false });\n }\n },\n\n resolveConflicts: async (resolutions) => {\n set({ loading: true, error: null });\n try {\n const config = get().config;\n if (!config) throw new Error('Sync not initialized');\n\n // Load current payload from iCloud\n const envelope = await readSyncEnvelope();\n if (!envelope) throw new Error('No sync data found');\n\n const license = await loadLicense();\n if (!license) throw new Error('License missing');\n const payload = decryptPayload(envelope.encrypted, envelope.iv, envelope.tag, license.key);\n await applyConflictResolutions(payload, resolutions, config.machineId);\n\n const updatedConfig = await loadSyncConfig();\n set({ config: updatedConfig, conflicts: [], loading: false });\n } catch (err) {\n const error = err instanceof Error ? err.message : String(err);\n set({ error, loading: false });\n }\n },\n}));\n","import { create } from 'zustand';\nimport type { PolicyFile, ComplianceReport } from '../lib/compliance/types.js';\nimport { checkCompliance } from '../lib/compliance/compliance-checker.js';\nimport { loadPolicy } from '../lib/compliance/policy-io.js';\n\ninterface ComplianceState {\n policy: PolicyFile | null;\n report: ComplianceReport | null;\n loading: boolean;\n error: string | null;\n\n importPolicy: (filePath: string, isPro: boolean) => Promise<void>;\n runCheck: (isPro: boolean) => Promise<void>;\n clearPolicy: () => void;\n}\n\nexport const useComplianceStore = create<ComplianceState>((set, get) => ({\n policy: null,\n report: null,\n loading: false,\n error: null,\n\n importPolicy: async (filePath: string, isPro: boolean) => {\n if (!isPro) {\n set({ error: 'Pro license required' });\n return;\n }\n set({ loading: true, error: null });\n try {\n const policy = await loadPolicy(filePath);\n set({ policy, loading: false });\n } catch (err) {\n const error = err instanceof Error ? err.message : String(err);\n set({ error, loading: false });\n }\n },\n\n runCheck: async (isPro: boolean) => {\n const { policy } = get();\n if (!policy) return;\n set({ loading: true, error: null });\n try {\n const report = await checkCompliance(policy, isPro);\n set({ report, loading: false });\n } catch (err) {\n const error = err instanceof Error ? err.message : String(err);\n set({ error, loading: false });\n }\n },\n\n clearPolicy: () => set({ policy: null, report: null, error: null }),\n}));\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { useTerminalSize } from '../../hooks/use-terminal-size.js';\nimport { COLORS } from '../../utils/colors.js';\nimport { SPACING } from '../../utils/spacing.js';\n\ninterface StatCardProps {\n label: string;\n value: string | number;\n color?: string;\n}\n\nexport function StatCard({ label, value, color = COLORS.white }: StatCardProps) {\n const { columns } = useTerminalSize();\n // Adapt min width to terminal: tight on narrow, comfortable on wide\n const minW = columns < 60 ? 12 : columns < 100 ? 14 : 16;\n\n return (\n <Box\n borderStyle=\"round\"\n borderColor={color}\n paddingX={SPACING.sm}\n paddingY={SPACING.none}\n flexDirection=\"column\"\n alignItems=\"center\"\n flexShrink={1}\n minWidth={minW}\n >\n <Text bold color={color}>{value}</Text>\n <Text color={COLORS.muted}>{label}</Text>\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { Spinner } from '@inkjs/ui';\nimport { COLORS } from '../../utils/colors.js';\nimport { t, useLocaleStore } from '../../i18n/index.js';\nimport { SPACING } from '../../utils/spacing.js';\n\ninterface LoadingProps {\n message?: string;\n}\n\nexport function Loading({ message }: LoadingProps) {\n useLocaleStore((s) => s.locale); // re-render on locale change\n return (\n <Box paddingY={SPACING.xs}>\n <Spinner label={message ?? t('loading_default')} />\n </Box>\n );\n}\n\ninterface ErrorMessageProps {\n message: string;\n}\n\nexport function ErrorMessage({ message }: ErrorMessageProps) {\n useLocaleStore((s) => s.locale); // re-render on locale change\n return (\n <Box paddingY={SPACING.xs}>\n <Text color={COLORS.error} bold>{'\\u2718'} {t('error_prefix')}</Text>\n <Text color={COLORS.error}>{message}</Text>\n </Box>\n );\n}\n","import React from 'react';\nimport { Text } from 'ink';\nimport { COLORS } from '../../utils/colors.js';\n\ntype BadgeVariant = 'success' | 'warning' | 'error' | 'info' | 'muted';\n\nconst BADGE_STYLES: Record<BadgeVariant, { icon: string; color: string }> = {\n success: { icon: '\\u2714', color: COLORS.success },\n warning: { icon: '\\u25B2', color: COLORS.warning },\n error: { icon: '\\u2718', color: COLORS.error },\n info: { icon: '\\u25C6', color: COLORS.blue },\n muted: { icon: '\\u25CB', color: COLORS.textSecondary },\n};\n\ninterface StatusBadgeProps {\n label: string;\n variant: BadgeVariant;\n}\n\nexport function StatusBadge({ label, variant }: StatusBadgeProps) {\n const { icon, color } = BADGE_STYLES[variant];\n return <Text color={color}>{icon} {label}</Text>;\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { COLORS } from '../../utils/colors.js';\nimport { GradientText } from '../../utils/gradient.js';\nimport { SPACING } from '../../utils/spacing.js';\n\ninterface SectionHeaderProps {\n emoji: string;\n title: string;\n color?: string;\n gradient?: string[];\n count?: number | string;\n}\n\nexport function SectionHeader({ emoji, title, color = COLORS.gold, gradient, count }: SectionHeaderProps) {\n return (\n <Box gap={SPACING.xs}>\n <Text>{emoji} </Text>\n {gradient ? (\n <GradientText colors={gradient} bold>{title}</GradientText>\n ) : (\n <Text bold color={color}>{title}</Text>\n )}\n {count !== undefined && (\n <Text color={COLORS.textSecondary}>({count})</Text>\n )}\n </Box>\n );\n}\n","import React from 'react';\nimport { Text } from 'ink';\nimport { COLORS } from '../../utils/colors.js';\nimport { t } from '../../i18n/index.js';\n\ninterface VersionArrowProps {\n current: string;\n latest: string;\n}\n\nexport function VersionArrow({ current, latest }: VersionArrowProps) {\n return (\n <>\n <Text color={COLORS.muted}>{t('version_installed')} </Text>\n <Text color={COLORS.error}>{current}</Text>\n <Text color={COLORS.warning}>{' \\u2500\\u2500 '}</Text>\n <Text color={COLORS.gold}>{'\\u25B6'}</Text>\n <Text color={COLORS.muted}> {t('version_available')} </Text>\n <Text color={COLORS.teal}>{latest}</Text>\n </>\n );\n}\n","import { getLocale, t } from '../i18n/index.js';\n\nexport function formatBytes(bytes: number): string {\n if (!isFinite(bytes) || bytes <= 0) return '0 B';\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.min(Math.floor(Math.log(bytes) / Math.log(1024)), units.length - 1);\n return `${(bytes / Math.pow(1024, i)).toFixed(1)} ${units[i]}`;\n}\n\nexport function formatRelativeTime(timestamp: number): string {\n if (!timestamp || !isFinite(timestamp)) return t('time_justNow');\n const diff = Date.now() / 1000 - timestamp;\n if (diff < 0) return t('time_justNow');\n if (diff < 60) return t('time_justNow');\n if (diff < 3600) return t('time_minutesAgo', { n: Math.floor(diff / 60) });\n if (diff < 86400) return t('time_hoursAgo', { n: Math.floor(diff / 3600) });\n if (diff < 2592000) return t('time_daysAgo', { n: Math.floor(diff / 86400) });\n return t('time_monthsAgo', { n: Math.floor(diff / 2592000) });\n}\n\nexport function formatDate(value: string | number | Date): string {\n const date = value instanceof Date ? value : new Date(value);\n const locale = getLocale();\n return date.toLocaleDateString(locale === 'es' ? 'es-ES' : 'en-US');\n}\n\nexport function truncate(str: string, maxLen: number): string {\n if (str.length <= maxLen) return str;\n return str.slice(0, maxLen - 1) + '\\u2026';\n}\n","import React, { useState, useMemo, useEffect, useRef } from 'react';\nimport { Box, Text, type DOMElement } from 'ink';\nimport { useViewInput } from '../hooks/use-view-input.js';\nimport { useBrewStore } from '../stores/brew-store.js';\nimport { useNavigationStore } from '../stores/navigation-store.js';\nimport { useDebounce } from '../hooks/use-debounce.js';\nimport { useBrewStream } from '../hooks/use-brew-stream.js';\nimport { formulaeToListItems, casksToListItems } from '../lib/brew-api.js';\nimport { writeLastAction } from '../lib/data-dir.js';\nimport { SearchInput } from '../components/common/search-input.js';\nimport { StatusBadge } from '../components/common/status-badge.js';\nimport { ConfirmDialog } from '../components/common/confirm-dialog.js';\nimport { ProgressLog } from '../components/common/progress-log.js';\nimport { ResultBanner } from '../components/common/result-banner.js';\nimport { SelectableRow } from '../components/common/selectable-row.js';\nimport { Loading, ErrorMessage } from '../components/common/loading.js';\nimport { COLORS } from '../utils/colors.js';\nimport { t } from '../i18n/index.js';\nimport { useModalStore } from '../stores/modal-store.js';\nimport { useContainerSize } from '../hooks/use-container-size.js';\nimport { useVisibleRows } from '../hooks/use-visible-rows.js';\nimport type { PackageListItem } from '../lib/types.js';\nimport { SPACING, getLayoutMode } from '../utils/spacing.js';\n\nexport function InstalledView() {\n const formulae = useBrewStore((s) => s.formulae);\n const casks = useBrewStore((s) => s.casks);\n const loading = useBrewStore((s) => s.loading);\n const errors = useBrewStore((s) => s.errors);\n const fetchInstalled = useBrewStore((s) => s.fetchInstalled);\n const navigate = useNavigationStore((s) => s.navigate);\n const selectPackage = useNavigationStore((s) => s.selectPackage);\n const { openModal, closeModal } = useModalStore();\n\n const containerRef = useRef<DOMElement>(null);\n const { width: containerWidth } = useContainerSize(containerRef);\n // Fallback to viewport width on first frame, before measureElement runs.\n const columns = containerWidth > 0 ? containerWidth : 80;\n const mode = getLayoutMode(columns);\n // Column widths are passed to <Box width=...> and Yoga handles the truncate\n // via <Text wrap=\"truncate\">. We do NOT call String.padEnd — that builds the\n // row as a string and bypasses the flex layout, which is why narrow widths\n // used to cut words / overflow. minWidth=0 + flexShrink=1 on each <Box>\n // lets Yoga shrink the cell below its content size (the canonical CSS\n // `min-width: 0` pattern). The last column (desc/badges) uses flexGrow=1 so\n // it eats the remainder regardless of gap arithmetic.\n const nameWidth = mode === 'single'\n ? Math.max(8, columns - 2 /* cursor + gap */)\n : Math.max(12, Math.floor(columns * 0.35));\n const versionWidth = Math.max(8, Math.floor(columns * 0.15));\n\n const [filter, setFilter] = useState('');\n const [cursor, setCursor] = useState(0);\n const [tab, setTab] = useState<'formulae' | 'casks'>('formulae');\n const [isSearching, setIsSearching] = useState(false);\n const [confirmUninstall, setConfirmUninstall] = useState<string | null>(null);\n const debouncedFilter = useDebounce(filter, 200);\n const stream = useBrewStream();\n\n const listRows = useVisibleRows({\n reservedRows: isSearching ? 14 : 10,\n fallbackReservedRows: isSearching ? 18 : 14,\n minRows: 1,\n });\n const streamRows = useVisibleRows({\n reservedRows: 5,\n fallbackReservedRows: 14,\n minRows: 1,\n });\n\n useEffect(() => { fetchInstalled(); }, []);\n\n useEffect(() => {\n if (isSearching) {\n openModal();\n return () => { closeModal(); };\n }\n return undefined;\n }, [isSearching]);\n\n const allItems: PackageListItem[] = useMemo(() => {\n const items = tab === 'formulae'\n ? formulaeToListItems(formulae)\n : casksToListItems(casks);\n\n if (!debouncedFilter) return items;\n const lower = debouncedFilter.toLowerCase();\n return items.filter((p) =>\n p.name.toLowerCase().includes(lower) || p.desc.toLowerCase().includes(lower)\n );\n }, [formulae, casks, tab, debouncedFilter]);\n\n useViewInput((input, key) => {\n if (confirmUninstall) return;\n\n // SCR-12-I1: while a brew uninstall is streaming we promised \"esc:cancel\"\n // in the hint bar. Honour it by intercepting Esc here so it tears down the\n // child process instead of bubbling up to global navigation.\n if (stream.isRunning) {\n if (key.escape) stream.cancel();\n return;\n }\n\n // Stream finished but still showing — Esc dismisses and refreshes\n if (stream.lines.length > 0) {\n if (key.escape) {\n stream.clear();\n void fetchInstalled();\n }\n return;\n }\n\n if (isSearching) {\n if (key.escape) {\n setIsSearching(false);\n setFilter('');\n }\n return;\n }\n\n if (input === '/') {\n setIsSearching(true);\n return;\n }\n\n if ((input === 'u' || input === '1') && allItems[cursor]) {\n setConfirmUninstall(allItems[cursor].name);\n return;\n }\n\n if (input === 'j' || key.downArrow) {\n setCursor((c) => Math.min(c + 1, Math.max(0, allItems.length - 1)));\n } else if (input === 'k' || key.upArrow) {\n setCursor((c) => Math.max(c - 1, 0));\n } else if (input === 'g') {\n setCursor(0);\n } else if (input === 'G') {\n setCursor(Math.max(allItems.length - 1, 0));\n } else if (key.return && allItems[cursor]) {\n selectPackage(allItems[cursor].name, tab === 'formulae' ? 'formula' : 'cask');\n navigate('package-info');\n } else if (input === 'f' || input === '2') {\n setTab((t) => t === 'formulae' ? 'casks' : 'formulae');\n setCursor(0);\n }\n }, { isActive: true });\n\n if (loading.installed) return <Loading message={t('loading_installed')} />;\n if (errors.installed) return <ErrorMessage message={errors.installed} />;\n\n if (stream.isRunning || stream.lines.length > 0) {\n return (\n <Box flexDirection=\"column\">\n <ProgressLog\n lines={stream.lines}\n isRunning={stream.isRunning}\n title={t('pkgInfo_uninstalling', { name: '...' })}\n maxVisible={streamRows}\n />\n {stream.isRunning && (\n <Text color={COLORS.textSecondary}>esc:{t('hint_cancel')}</Text>\n )}\n {!stream.isRunning && (\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n <ResultBanner\n status={stream.error ? 'error' : 'success'}\n message={stream.error ? `\\u2718 ${stream.error}` : `\\u2714 ${t('pkgInfo_done')}`}\n />\n <Text color={COLORS.textSecondary}>esc:{t('hint_back')}</Text>\n </Box>\n )}\n </Box>\n );\n }\n\n const MAX_VISIBLE_ROWS = listRows;\n const start = Math.max(0, cursor - Math.floor(MAX_VISIBLE_ROWS / 2));\n const visible = allItems.slice(start, start + MAX_VISIBLE_ROWS);\n\n return (\n <Box flexDirection=\"column\" ref={containerRef}>\n {/* Tab selector — both tabs always have a round border so the tab bar\n height stays constant when switching (prevents content jump). The\n inactive tab uses a dim gray border to signal it is not selected. */}\n <Box marginBottom={SPACING.xs} gap={SPACING.xs}>\n <Box\n borderStyle=\"round\"\n borderColor={tab === 'formulae' ? COLORS.info : COLORS.textSecondary}\n paddingX={SPACING.xs}\n >\n <Text bold={tab === 'formulae'} color={tab === 'formulae' ? COLORS.info : COLORS.textSecondary}>\n {'\\u{1F4E6}'} {t('installed_formulaeCount', { count: formulae.length })}\n </Text>\n </Box>\n <Box\n borderStyle=\"round\"\n borderColor={tab === 'casks' ? COLORS.purple : COLORS.textSecondary}\n paddingX={SPACING.xs}\n >\n <Text bold={tab === 'casks'} color={tab === 'casks' ? COLORS.purple : COLORS.textSecondary}>\n {'\\u{1F37A}'} {t('installed_casksCount', { count: casks.length })}\n </Text>\n </Box>\n </Box>\n\n {/* Uninstall confirmation */}\n {confirmUninstall && (\n <ConfirmDialog\n message={t('installed_confirmUninstall', { name: confirmUninstall })}\n onConfirm={() => {\n const name = confirmUninstall;\n setConfirmUninstall(null);\n void stream.run(['uninstall', name]).then(() => {\n fetchInstalled();\n // BK-001: notificar a BrewBar via IPC del paquete desinstalado\n // para que su banner y contador de outdated se actualicen.\n void writeLastAction({\n timestamp: new Date().toISOString(),\n action: 'uninstall',\n packages: [name],\n remainingOutdated: 0,\n source: 'brew-tui',\n });\n });\n }}\n onCancel={() => setConfirmUninstall(null)}\n />\n )}\n\n {/* Search bar */}\n {isSearching && (\n <Box marginBottom={SPACING.xs} borderStyle=\"round\" borderColor={COLORS.gold} paddingX={SPACING.xs}>\n <SearchInput defaultValue={filter} onChange={setFilter} isActive={isSearching} />\n </Box>\n )}\n\n {/* Column header — widths match the data rows below. Both share the same\n gap={SPACING.xs} parent Box plus a 1-char cursor glyph in front. We\n do NOT pad strings here: Yoga handles alignment via <Box width=…>. */}\n <Box gap={SPACING.xs} borderStyle=\"single\" borderBottom borderTop={false} borderLeft={false} borderRight={false} borderColor={COLORS.border}>\n <Text color={COLORS.text}>{' '}</Text>\n <Box width={nameWidth} flexShrink={1} minWidth={0}>\n <Text color={COLORS.text} bold wrap=\"truncate\">{t('installed_col_package')}</Text>\n </Box>\n {mode !== 'single' && (\n <Box width={versionWidth} flexShrink={1} minWidth={0}>\n <Text color={COLORS.text} bold wrap=\"truncate\">{t('installed_col_version')}</Text>\n </Box>\n )}\n {mode !== 'single' && mode !== 'compact' && (\n <Box flexGrow={1} flexShrink={1} minWidth={0}>\n <Text color={COLORS.text} bold wrap=\"truncate\">{t('installed_col_status')}</Text>\n </Box>\n )}\n </Box>\n\n {/* Package list */}\n <Box flexDirection=\"column\">\n {visible.length === 0 && (\n <Box paddingY={SPACING.xs} justifyContent=\"center\">\n <Text color={COLORS.textSecondary} italic>{t('installed_noPackages')}</Text>\n </Box>\n )}\n {start > 0 && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreAbove', { count: start })}</Text>\n )}\n {visible.map((item, i) => {\n const idx = start + i;\n const isCurrent = idx === cursor;\n const hasBadge = item.outdated || item.pinned || item.kegOnly || item.installedAsDependency;\n return (\n <SelectableRow key={item.name} isCurrent={isCurrent}>\n <Box width={nameWidth} flexShrink={1} minWidth={0}>\n <Text\n bold={isCurrent}\n inverse={isCurrent}\n color={isCurrent ? COLORS.text : COLORS.muted}\n // truncate-middle preserves @version / ::tap suffixes that\n // identify a formula uniquely (e.g. `python@3.12`).\n wrap=\"truncate-middle\"\n >\n {item.name}\n </Text>\n </Box>\n {mode !== 'single' && (\n <Box width={versionWidth} flexShrink={1} minWidth={0}>\n <Text color={COLORS.teal} wrap=\"truncate\">{item.version}</Text>\n </Box>\n )}\n {mode !== 'single' && mode !== 'compact' && (\n <Box flexGrow={1} flexShrink={1} minWidth={0}>\n {hasBadge ? (\n <Box gap={SPACING.xs}>\n {item.outdated && <StatusBadge label={t('badge_outdated')} variant=\"warning\" />}\n {item.pinned && <StatusBadge label={t('badge_pinned')} variant=\"info\" />}\n {item.kegOnly && <StatusBadge label={t('badge_kegOnly')} variant=\"muted\" />}\n {item.installedAsDependency && <StatusBadge label={t('badge_dep')} variant=\"muted\" />}\n </Box>\n ) : (\n <Text color={COLORS.textSecondary} dimColor wrap=\"truncate\">{item.desc}</Text>\n )}\n </Box>\n )}\n </SelectableRow>\n );\n })}\n {start + MAX_VISIBLE_ROWS < allItems.length && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreBelow', { count: allItems.length - start - MAX_VISIBLE_ROWS })}</Text>\n )}\n </Box>\n\n {/* Status bar */}\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.text} bold>\n {allItems.length > 0 ? `${cursor + 1}/${allItems.length}` : '0/0'}\n </Text>\n </Box>\n </Box>\n );\n}\n","import { useState, useEffect } from 'react';\n\nexport function useDebounce<T>(value: T, delayMs: number): T {\n const [debounced, setDebounced] = useState(value);\n\n useEffect(() => {\n const timer = setTimeout(() => setDebounced(value), delayMs);\n return () => clearTimeout(timer);\n }, [value, delayMs]);\n\n return debounced;\n}\n","import { useState, useCallback, useRef, useEffect } from 'react';\nimport { streamBrew } from '../lib/brew-cli.js';\nimport { detectAction } from '../lib/history/history-logger.js';\nimport { useLicenseStore } from '../stores/license-store.js';\nimport { logger } from '../utils/logger.js';\n\nconst MAX_LINES = 100;\n\nasync function logToHistory(args: string[], success: boolean, error: string | null): Promise<void> {\n const detected = detectAction(args);\n if (!detected) return;\n\n try {\n const isPro = useLicenseStore.getState().isPro();\n const { appendEntry } = await import('../lib/history/history-logger.js');\n await appendEntry(isPro, detected.action, detected.packageName, success, error);\n } catch {\n // Free user or file error — silently skip logging\n }\n}\n\ninterface BrewStreamState {\n lines: string[];\n isRunning: boolean;\n error: string | null;\n run: (args: string[]) => Promise<void>;\n cancel: () => void;\n clear: () => void;\n}\n\nexport function useBrewStream(): BrewStreamState {\n const [lines, setLines] = useState<string[]>([]);\n const [isRunning, setIsRunning] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const cancelRef = useRef(false);\n const generatorRef = useRef<AsyncGenerator<string> | null>(null);\n const mountedRef = useRef(true);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n generatorRef.current?.return(undefined);\n generatorRef.current = null;\n };\n }, []);\n\n const run = useCallback(async (args: string[]) => {\n if (!mountedRef.current) return;\n setIsRunning(true);\n setError(null);\n setLines([]);\n cancelRef.current = false;\n\n const gen = streamBrew(args);\n generatorRef.current = gen;\n\n let streamError: string | null = null;\n\n try {\n for await (const line of gen) {\n if (cancelRef.current) break;\n if (mountedRef.current) {\n setLines((prev) => [...prev.slice(-(MAX_LINES - 1)), line]);\n }\n }\n } catch (err) {\n streamError = err instanceof Error ? err.message : String(err);\n if (!cancelRef.current && mountedRef.current) {\n setError(streamError);\n }\n } finally {\n generatorRef.current = null;\n if (mountedRef.current) {\n setIsRunning(false);\n }\n }\n\n // Log to history (Pro users only, silently skipped for free)\n if (!cancelRef.current) {\n void logToHistory(args, streamError === null, streamError);\n }\n\n // Auto-capture snapshot after mutating brew operations\n const MUTATING_COMMANDS = new Set(['install', 'uninstall', 'upgrade', 'pin', 'unpin', 'tap', 'untap']);\n if (!cancelRef.current && MUTATING_COMMANDS.has(args[0] ?? '')) {\n void import('../lib/state-snapshot/snapshot.js').then(({ captureSnapshot, saveSnapshot }) => {\n captureSnapshot()\n .then((s) => saveSnapshot(s))\n .catch((err) => logger.warn('snapshot: capture/save failed', { error: String(err) }));\n });\n }\n }, []);\n\n const cancel = useCallback(() => {\n cancelRef.current = true;\n generatorRef.current?.return(undefined);\n generatorRef.current = null;\n }, []);\n\n const clear = useCallback(() => {\n setLines([]);\n setError(null);\n }, []);\n\n return { lines, isRunning, error, run, cancel, clear };\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { TextInput } from '@inkjs/ui';\nimport { COLORS } from '../../utils/colors.js';\nimport { t } from '../../i18n/index.js';\n\ninterface SearchInputProps {\n defaultValue?: string;\n onChange: (value: string) => void;\n placeholder?: string;\n isActive?: boolean;\n}\n\nexport function SearchInput({ defaultValue, onChange, placeholder, isActive = true }: SearchInputProps) {\n const resolvedPlaceholder = placeholder ?? t('searchInput_placeholder');\n return (\n <Box>\n <Text color={COLORS.gold}>{'\\u{1F50D}'} </Text>\n {isActive ? (\n <TextInput\n placeholder={resolvedPlaceholder}\n defaultValue={defaultValue}\n onChange={onChange}\n />\n ) : (\n <Text color={COLORS.textSecondary}>{defaultValue || placeholder}</Text>\n )}\n </Box>\n );\n}\n","import React, { useEffect } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { COLORS } from '../../utils/colors.js';\nimport { t, useLocaleStore } from '../../i18n/index.js';\nimport { useModalStore } from '../../stores/modal-store.js';\nimport { SPACING } from '../../utils/spacing.js';\n\ninterface ConfirmDialogProps {\n message: string;\n onConfirm: () => void;\n onCancel: () => void;\n}\n\nexport function ConfirmDialog({ message, onConfirm, onCancel }: ConfirmDialogProps) {\n const locale = useLocaleStore((s) => s.locale);\n const { openModal, closeModal } = useModalStore();\n\n useEffect(() => {\n openModal();\n return () => { closeModal(); };\n }, []);\n\n useInput((input, key) => {\n if (input === 'y' || input === 'Y') onConfirm();\n else if (locale === 'es' && (input === 's' || input === 'S')) onConfirm();\n else if (input === 'n' || input === 'N') onCancel();\n else if (key.escape) onCancel();\n });\n\n return (\n <Box borderStyle=\"double\" borderColor={COLORS.purple} paddingX={SPACING.sm} paddingY={SPACING.xs} flexDirection=\"column\" flexShrink={1}>\n <Text bold color={COLORS.text} wrap=\"wrap\">{message}</Text>\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.success}>{t('confirm_yes')}</Text>\n <Text> / </Text>\n <Text color={COLORS.error}>{t('confirm_no')}</Text>\n </Box>\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { Spinner } from '@inkjs/ui';\nimport { COLORS } from '../../utils/colors.js';\nimport { t } from '../../i18n/index.js';\nimport { SPACING } from '../../utils/spacing.js';\n\ninterface ProgressLogProps {\n lines: string[];\n isRunning: boolean;\n title?: string;\n maxVisible?: number;\n}\n\nexport function ProgressLog({ lines, isRunning, title, maxVisible = 15 }: ProgressLogProps) {\n const start = Math.max(0, lines.length - maxVisible);\n const visible = lines.slice(start);\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={COLORS.sky} paddingX={SPACING.xs}>\n {title && (\n <Box marginBottom={SPACING.xs}>\n {isRunning && <Spinner label=\"\" />}\n <Text bold color={COLORS.sky}> {title}</Text>\n </Box>\n )}\n {visible.map((line, i) => (\n // UI-006: keys are absolute indices, so a line that scrolls off-screen\n // does not change the key of remaining lines. Stable identity prevents\n // React from treating the whole list as new on every append.\n <Text key={`log-${start + i}`} color={COLORS.muted} wrap=\"wrap\">{line}</Text>\n ))}\n {lines.length === 0 && !isRunning && (\n <Text color={COLORS.textSecondary} italic>{t('progress_noOutput')}</Text>\n )}\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { COLORS } from '../../utils/colors.js';\nimport { SPACING } from '../../utils/spacing.js';\n\ninterface ResultBannerProps {\n status: 'success' | 'error' | 'warning' | 'info';\n message: string;\n}\n\nconst STATUS_COLORS: Record<string, string> = {\n success: COLORS.success,\n error: COLORS.error,\n warning: COLORS.warning,\n info: COLORS.info,\n};\n\nexport function ResultBanner({ status, message }: ResultBannerProps) {\n return (\n <Box borderStyle=\"round\" borderColor={STATUS_COLORS[status]} paddingX={SPACING.sm} paddingY={SPACING.none}>\n <Text color={STATUS_COLORS[status]} bold>{message}</Text>\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { COLORS } from '../../utils/colors.js';\n\ninterface SelectableRowProps {\n isCurrent: boolean;\n children: React.ReactNode;\n gap?: number;\n}\n\nexport function SelectableRow({ isCurrent, children, gap = 1 }: SelectableRowProps) {\n return (\n <Box gap={gap}>\n <Text color={isCurrent ? COLORS.success : COLORS.muted}>\n {isCurrent ? '\\u25B6' : ' '}\n </Text>\n {children}\n </Box>\n );\n}\n","import React, { useState, useCallback, useEffect, useRef } from 'react';\nimport { Box, Text } from 'ink';\nimport { useViewInput } from '../hooks/use-view-input.js';\nimport { TextInput } from '@inkjs/ui';\nimport { useBrewStore } from '../stores/brew-store.js';\nimport { useBrewStream } from '../hooks/use-brew-stream.js';\nimport { Loading } from '../components/common/loading.js';\nimport { ProgressLog } from '../components/common/progress-log.js';\nimport { ConfirmDialog } from '../components/common/confirm-dialog.js';\nimport { ResultBanner } from '../components/common/result-banner.js';\nimport { COLORS } from '../utils/colors.js';\nimport { SelectableRow } from '../components/common/selectable-row.js';\nimport { StatusBadge } from '../components/common/status-badge.js';\nimport { t } from '../i18n/index.js';\nimport { useModalStore } from '../stores/modal-store.js';\nimport { useNavigationStore } from '../stores/navigation-store.js';\nimport * as api from '../lib/brew-api.js';\nimport { SPACING } from '../utils/spacing.js';\nimport { useVisibleRows } from '../hooks/use-visible-rows.js';\nimport { writeLastAction } from '../lib/data-dir.js';\n\ntype SearchResult = {\n name: string;\n type: 'formula' | 'cask';\n};\n\nexport function SearchView() {\n const [query, setQuery] = useState('');\n const [results, setResults] = useState<{ formulae: string[]; casks: string[] } | null>(null);\n const [searching, setSearching] = useState(false);\n const [searchError, setSearchError] = useState<string | null>(null);\n const [cursor, setCursor] = useState(0);\n const [confirmInstall, setConfirmInstall] = useState<string | null>(null);\n const stream = useBrewStream();\n const { openModal, closeModal } = useModalStore();\n const navigate = useNavigationStore((s) => s.navigate);\n const selectPackage = useNavigationStore((s) => s.selectPackage);\n const fetchInstalled = useBrewStore((s) => s.fetchInstalled);\n const hasRefreshed = useRef(false);\n // BK-001: nombre del ultimo paquete instalado desde search, para escribir\n // el handoff IPC a BrewBar cuando el stream finalice exitosamente.\n const pendingInstallRef = useRef<string | null>(null);\n const resultRows = useVisibleRows({\n reservedRows: searchError ? 8 : 6,\n fallbackReservedRows: searchError ? 18 : 16,\n minRows: 1,\n });\n const streamRows = useVisibleRows({\n reservedRows: 5,\n fallbackReservedRows: 14,\n minRows: 1,\n });\n\n // Suppress global Escape while results are showing so Escape clears results\n // rather than navigating away from this view.\n useEffect(() => {\n if (results !== null) {\n openModal();\n return () => { closeModal(); };\n }\n return undefined;\n }, [results]);\n\n const doSearch = useCallback(async (term: string) => {\n if (term.length < 2) {\n setResults(null);\n setSearchError(t('search_minChars'));\n return;\n }\n setSearching(true);\n setSearchError(null);\n try {\n const r = await api.search(term);\n setResults(r);\n setCursor(0);\n } catch (err) {\n setResults({ formulae: [], casks: [] });\n setSearchError(err instanceof Error ? err.message : t('search_failed'));\n } finally {\n setSearching(false);\n }\n }, []);\n\n useEffect(() => {\n if (!stream.isRunning && !stream.error && stream.lines.length > 0 && !hasRefreshed.current) {\n hasRefreshed.current = true;\n void fetchInstalled();\n // BK-001: notificar a BrewBar via IPC del paquete recien instalado.\n const installed = pendingInstallRef.current;\n if (installed) {\n pendingInstallRef.current = null;\n void writeLastAction({\n timestamp: new Date().toISOString(),\n action: 'install',\n packages: [installed],\n remainingOutdated: 0,\n source: 'brew-tui',\n });\n }\n }\n }, [stream.isRunning, stream.error]);\n\n const allResults: SearchResult[] = results\n ? [\n ...results.formulae.map((name) => ({ name, type: 'formula' as const })),\n ...results.casks.map((name) => ({ name, type: 'cask' as const })),\n ]\n : [];\n const start = Math.min(\n Math.max(0, cursor - Math.floor(resultRows / 2)),\n Math.max(0, allResults.length - resultRows),\n );\n const visibleResults = allResults.slice(start, start + resultRows);\n\n useEffect(() => {\n setCursor((current) => Math.min(current, Math.max(0, allResults.length - 1)));\n }, [allResults.length]);\n\n useViewInput((input, key) => {\n if (stream.isRunning) {\n if (key.escape) stream.cancel();\n return;\n }\n if (stream.lines.length > 0) {\n if (key.escape) {\n stream.clear();\n }\n return;\n }\n if (confirmInstall) return;\n\n if (key.return && !results) {\n void doSearch(query);\n return;\n }\n\n // Enter → navigate to package-info view (preview details, deps, caveats)\n if (key.return && allResults[cursor]) {\n const result = allResults[cursor];\n selectPackage(result.name, result.type);\n navigate('package-info');\n return;\n }\n\n // 'i' or '1' → install directly (with confirmation)\n if ((input === 'i' || input === '1') && allResults[cursor]) {\n setConfirmInstall(allResults[cursor].name);\n return;\n }\n\n if (input === 'j' || key.downArrow) {\n setCursor((c) => Math.min(c + 1, Math.max(0, allResults.length - 1)));\n } else if (input === 'k' || key.upArrow) {\n setCursor((c) => Math.max(c - 1, 0));\n } else if (key.escape) {\n setResults(null);\n setQuery('');\n }\n });\n\n if (stream.isRunning || stream.lines.length > 0) {\n return (\n <Box flexDirection=\"column\">\n <ProgressLog\n lines={stream.lines}\n isRunning={stream.isRunning}\n title={t('search_installing')}\n maxVisible={streamRows}\n />\n {stream.isRunning && (\n <Text color={COLORS.textSecondary}>esc:{t('hint_cancel')}</Text>\n )}\n {!stream.isRunning && (\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n <ResultBanner\n status={stream.error ? 'error' : 'success'}\n message={stream.error ? `\\u2718 ${stream.error}` : `\\u2714 ${t('search_installComplete')}`}\n />\n <Text color={COLORS.textSecondary}>esc:{t('hint_clear')}</Text>\n </Box>\n )}\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={SPACING.xs}>\n <Text color={COLORS.gold}>{'\\u{1F50D}'} </Text>\n {!results ? (\n <TextInput\n placeholder={t('search_placeholder')}\n defaultValue={query}\n onChange={setQuery}\n onSubmit={() => void doSearch(query)}\n />\n ) : (\n <Text>{t('search_resultsFor')} \"<Text bold color={COLORS.text}>{query}</Text>\" <Text color={COLORS.textSecondary}>{t('search_escToClear')}</Text></Text>\n )}\n </Box>\n\n {searching && <Loading message={t('loading_searching')} />}\n\n {searchError && (\n <Box marginBottom={SPACING.xs}>\n <Text color={COLORS.error}>{searchError}</Text>\n </Box>\n )}\n\n {confirmInstall && (\n <ConfirmDialog\n message={t('search_confirmInstall', { name: confirmInstall })}\n onConfirm={() => {\n const name = confirmInstall;\n hasRefreshed.current = false;\n pendingInstallRef.current = name;\n setConfirmInstall(null);\n void stream.run(['install', name]);\n }}\n onCancel={() => setConfirmInstall(null)}\n />\n )}\n\n {results && !searching && !confirmInstall && (\n <Box flexDirection=\"column\">\n {allResults.length > 0 && (\n <Text color={COLORS.textSecondary}>\n {t('search_formulaeHeader', { count: results.formulae.length })} {t('search_casksHeader', { count: results.casks.length })}\n </Text>\n )}\n\n {allResults.length > 0 && (\n <Box flexDirection=\"column\">\n {start > 0 && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreAbove', { count: start })}</Text>\n )}\n {visibleResults.map((result, i) => {\n const idx = start + i;\n const isCurrent = idx === cursor;\n return (\n <SelectableRow key={`${result.type}:${result.name}`} isCurrent={isCurrent}>\n <Box flexGrow={1} flexShrink={1} minWidth={0}>\n <Text bold={isCurrent} inverse={isCurrent} wrap=\"truncate-middle\">{result.name}</Text>\n </Box>\n <StatusBadge\n label={result.type === 'formula' ? 'Formula' : 'Cask'}\n variant={result.type === 'formula' ? 'info' : 'muted'}\n />\n </SelectableRow>\n );\n })}\n {start + resultRows < allResults.length && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreBelow', { count: allResults.length - start - resultRows })}</Text>\n )}\n </Box>\n )}\n\n {allResults.length === 0 && (\n <Box borderStyle=\"round\" borderColor={COLORS.textSecondary} paddingX={SPACING.sm}>\n <Text color={COLORS.textSecondary} italic>{t('search_noResults')}</Text>\n </Box>\n )}\n\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.text} bold>\n {allResults.length > 0 ? `${cursor + 1}/${allResults.length}` : ''}\n </Text>\n </Box>\n </Box>\n )}\n </Box>\n );\n}\n","import React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { Box, Text } from 'ink';\nimport { useViewInput } from '../hooks/use-view-input.js';\nimport { useBrewStore } from '../stores/brew-store.js';\nimport { useBrewStream } from '../hooks/use-brew-stream.js';\nimport { pinPackage, unpinPackage, getUpgradeImpact } from '../lib/brew-api.js';\nimport { Loading, ErrorMessage } from '../components/common/loading.js';\nimport { StatusBadge } from '../components/common/status-badge.js';\nimport { ProgressLog } from '../components/common/progress-log.js';\nimport { ConfirmDialog } from '../components/common/confirm-dialog.js';\nimport { ResultBanner } from '../components/common/result-banner.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { VersionArrow } from '../components/common/version-arrow.js';\nimport { SelectableRow } from '../components/common/selectable-row.js';\nimport { COLORS } from '../utils/colors.js';\nimport { GRADIENTS } from '../utils/gradient.js';\nimport { t } from '../i18n/index.js';\nimport { useDebounce } from '../hooks/use-debounce.js';\nimport type { UpgradeImpact } from '../lib/impact/types.js';\nimport { SPACING } from '../utils/spacing.js';\nimport { writeLastAction } from '../lib/data-dir.js';\nimport { logger } from '../utils/logger.js';\nimport { useVisibleRows } from '../hooks/use-visible-rows.js';\n\nfunction ImpactPanel({ impact }: { impact: UpgradeImpact }) {\n const riskColor =\n impact.risk === 'high' ? COLORS.error\n : impact.risk === 'medium' ? COLORS.warning\n : COLORS.success;\n\n const riskLabel =\n impact.risk === 'high' ? t('impact_high')\n : impact.risk === 'medium' ? t('impact_medium')\n : t('impact_low');\n\n const riskIcon =\n impact.risk === 'high' ? '\\u26A0'\n : impact.risk === 'medium' ? '~'\n : '\\u2713';\n\n return (\n <Box flexDirection=\"column\" marginTop={SPACING.xs} borderStyle=\"round\" borderColor={riskColor} paddingX={SPACING.sm} paddingY={SPACING.none}>\n <Box>\n <Text bold color={riskColor}>{riskIcon} {riskLabel}</Text>\n {impact.reverseDeps.length > 0 && (\n <Text color={COLORS.textSecondary}> \\u2014 {t('impact_affects', { count: impact.reverseDeps.length })}</Text>\n )}\n </Box>\n {impact.riskReasons.length > 0 && (\n <Text color={COLORS.textSecondary}>{impact.riskReasons.join(' \\u00B7 ')}</Text>\n )}\n {impact.reverseDeps.length > 0 && impact.reverseDeps.length <= 5 && (\n <Text color={COLORS.muted} dimColor>\n {t('impact_usedBy', { packages: impact.reverseDeps.join(', ') })}\n </Text>\n )}\n {impact.risk === 'high' && (\n <Text color={COLORS.info}>{t('impact_brewfile_hint')}</Text>\n )}\n </Box>\n );\n}\n\nexport function OutdatedView() {\n // PERF-001: selectors granulares — evita re-render con cualquier fetch del store.\n const outdated = useBrewStore((s) => s.outdated);\n const loading = useBrewStore((s) => s.loading);\n const errors = useBrewStore((s) => s.errors);\n const fetchOutdated = useBrewStore((s) => s.fetchOutdated);\n const stream = useBrewStream();\n const [cursor, setCursor] = useState(0);\n const [confirmAction, setConfirmAction] = useState<\n | { type: 'single'; name: string }\n | { type: 'all' }\n | null\n >(null);\n const hasRefreshed = useRef(false);\n // Names submitted to `brew upgrade` so that, once the stream finishes and the\n // outdated list is refreshed, we can write the BrewBar handoff with what was\n // actually upgraded plus the remaining outdated count.\n const pendingUpgradeRef = useRef<string[] | null>(null);\n const [impact, setImpact] = useState<UpgradeImpact | null>(null);\n const [impactLoading, setImpactLoading] = useState(false);\n const listRows = useVisibleRows({\n reservedRows: impact || impactLoading ? 11 : 7,\n fallbackReservedRows: impact || impactLoading ? 18 : 14,\n minRows: 1,\n });\n const streamRows = useVisibleRows({\n reservedRows: 5,\n fallbackReservedRows: 14,\n minRows: 1,\n });\n\n useEffect(() => { fetchOutdated(); }, []);\n\n useEffect(() => {\n if (!stream.isRunning && !stream.error && stream.lines.length > 0 && !hasRefreshed.current) {\n hasRefreshed.current = true;\n void fetchOutdated().then(() => {\n const pkgs = pendingUpgradeRef.current;\n if (!pkgs) return;\n pendingUpgradeRef.current = null;\n const state = useBrewStore.getState().outdated;\n const remaining = state.formulae.length + state.casks.length;\n void writeLastAction({\n timestamp: new Date().toISOString(),\n action: 'upgrade',\n packages: pkgs,\n remainingOutdated: remaining,\n source: 'brew-tui',\n }).catch((err) => logger.warn('Failed to write last-action.json', err));\n });\n }\n }, [stream.isRunning, stream.error]);\n\n // Enrich packages with type so formula/cask distinction is available.\n // useMemo: this list is read on every render to compute cursor bounds and\n // the visible window; the underlying outdated arrays only change on refetch.\n const allOutdated = useMemo(\n () => [\n ...outdated.formulae.map((p) => ({ ...p, type: 'formula' as const })),\n ...outdated.casks.map((p) => ({ ...p, type: 'cask' as const })),\n ],\n [outdated.formulae, outdated.casks],\n );\n\n const debouncedCursor = useDebounce(cursor, 150);\n\n useEffect(() => {\n const pkg = allOutdated[debouncedCursor];\n if (!pkg || stream.isRunning) {\n setImpact(null);\n return;\n }\n // SCR-12-O1: each cursor move should invalidate the previous in-flight\n // analysis so a slower one cannot land after a faster newer one and\n // overwrite the panel with stale data.\n let cancelled = false;\n setImpactLoading(true);\n void getUpgradeImpact(\n pkg.name,\n pkg.installed_versions[0] ?? '',\n pkg.current_version,\n pkg.type,\n )\n .then((result) => { if (!cancelled) setImpact(result); })\n .catch(() => { if (!cancelled) setImpact(null); })\n .finally(() => { if (!cancelled) setImpactLoading(false); });\n return () => { cancelled = true; };\n }, [debouncedCursor, stream.isRunning]);\n\n useViewInput((input, key) => {\n if (stream.isRunning) {\n if (key.escape) stream.cancel();\n return;\n }\n if (stream.lines.length > 0) {\n if (key.escape) {\n stream.clear();\n return;\n }\n if (input === 'r' || input === '3') {\n stream.clear();\n void fetchOutdated();\n }\n return;\n }\n if (confirmAction) return;\n\n if (input === 'j' || key.downArrow) {\n setCursor((c) => Math.min(c + 1, Math.max(0, allOutdated.length - 1)));\n } else if (input === 'k' || key.upArrow) {\n setCursor((c) => Math.max(c - 1, 0));\n } else if (key.return && allOutdated[cursor]) {\n setConfirmAction({ type: 'single', name: allOutdated[cursor].name });\n } else if ((input === 'A' || input === '1') && allOutdated.length > 0) {\n setConfirmAction({ type: 'all' });\n } else if ((input === 'p' || input === '2') && allOutdated[cursor]) {\n // ARQ-008: Use brew-api functions instead of direct execBrew\n const pkg = allOutdated[cursor];\n void (pkg.pinned ? unpinPackage(pkg.name) : pinPackage(pkg.name)).then(() => void fetchOutdated());\n return;\n } else if (input === 'r' || input === '3') {\n void fetchOutdated();\n }\n });\n\n const MAX_VISIBLE_ROWS = listRows;\n const start = Math.max(0, cursor - Math.floor(MAX_VISIBLE_ROWS / 2));\n const visible = allOutdated.slice(start, start + MAX_VISIBLE_ROWS);\n\n if (loading.outdated) return <Loading message={t('loading_outdated')} />;\n if (errors.outdated) return <ErrorMessage message={errors.outdated} />;\n\n if (stream.isRunning || stream.lines.length > 0) {\n return (\n <Box flexDirection=\"column\">\n <ProgressLog\n lines={stream.lines}\n isRunning={stream.isRunning}\n title={t('outdated_upgrading')}\n maxVisible={streamRows}\n />\n {stream.isRunning && (\n <Text color={COLORS.textSecondary}>esc:{t('hint_cancel')}</Text>\n )}\n {!stream.isRunning && (\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n <Box borderStyle=\"round\" borderColor={stream.error ? COLORS.error : COLORS.success} paddingX={SPACING.sm} paddingY={SPACING.none}>\n <Text color={stream.error ? COLORS.error : COLORS.success} bold>\n {stream.error ? `\\u2718 ${stream.error}` : `\\u2714 ${t('outdated_upgradeComplete')}`}\n </Text>\n <Text color={COLORS.muted}> {t('outdated_pressRefresh')}</Text>\n </Box>\n <Text color={COLORS.textSecondary}>r:{t('hint_refresh')} esc:{t('hint_clear')}</Text>\n </Box>\n )}\n </Box>\n );\n }\n\n // SCR-012: Build package list for upgrade-all confirmation\n const upgradeAllMessage = confirmAction?.type === 'all'\n ? `${t('outdated_confirmAll', { count: allOutdated.length })}\\n${t('outdated_upgradeAllList', { list: allOutdated.map(p => p.name).join(', ') })}`\n : '';\n\n return (\n <Box flexDirection=\"column\">\n <SectionHeader emoji={'\\u{1F4E6}'} title={t('outdated_title', { count: allOutdated.length })} gradient={GRADIENTS.fire} />\n\n {confirmAction && (\n <Box marginY={SPACING.xs}>\n <ConfirmDialog\n message={\n confirmAction.type === 'all'\n ? upgradeAllMessage\n : t('outdated_confirmSingle', { name: confirmAction.type === 'single' ? confirmAction.name : '' })\n }\n onConfirm={() => {\n hasRefreshed.current = false;\n if (confirmAction.type === 'all') {\n pendingUpgradeRef.current = allOutdated.map((p) => p.name);\n void stream.run(['upgrade']);\n } else if (confirmAction.name) {\n pendingUpgradeRef.current = [confirmAction.name];\n void stream.run(['upgrade', confirmAction.name]);\n }\n setConfirmAction(null);\n }}\n onCancel={() => setConfirmAction(null)}\n />\n </Box>\n )}\n\n {allOutdated.length === 0 && !confirmAction && (\n <Box marginTop={SPACING.xs}>\n <ResultBanner status=\"success\" message={`\\u2714 ${t('outdated_upToDate')}`} />\n </Box>\n )}\n\n {allOutdated.length > 0 && !confirmAction && (\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n {start > 0 && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreAbove', { count: start })}</Text>\n )}\n {visible.map((pkg, i) => {\n const idx = start + i;\n const isCurrent = idx === cursor;\n return (\n <SelectableRow key={pkg.name} isCurrent={isCurrent}>\n {/* Name takes the remaining row width and truncates in the\n middle to preserve @suffix tags. flexGrow=1 lets it eat\n leftover space; flexShrink=1 + minWidth=0 lets it shrink\n below its content (CSS `min-width: 0`). */}\n <Box flexGrow={1} flexShrink={1} minWidth={0}>\n <Text\n bold={isCurrent}\n inverse={isCurrent}\n color={isCurrent ? COLORS.text : COLORS.muted}\n wrap=\"truncate-middle\"\n >\n {pkg.name}\n </Text>\n </Box>\n <VersionArrow current={pkg.installed_versions[0] ?? ''} latest={pkg.current_version} />\n {pkg.pinned && <StatusBadge label={t('outdated_pinned')} variant=\"info\" />}\n </SelectableRow>\n );\n })}\n {start + MAX_VISIBLE_ROWS < allOutdated.length && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreBelow', { count: allOutdated.length - start - MAX_VISIBLE_ROWS })}</Text>\n )}\n\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.text} bold>\n {cursor + 1}/{allOutdated.length}\n </Text>\n </Box>\n\n {impact && !stream.isRunning && !confirmAction && (\n <ImpactPanel impact={impact} />\n )}\n {impactLoading && !stream.isRunning && !confirmAction && (\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.textSecondary}>{t('impact_analyzing')}</Text>\n </Box>\n )}\n\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.textSecondary}>{t('impact_hint')}</Text>\n </Box>\n </Box>\n )}\n </Box>\n );\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport { Box, Text } from 'ink';\nimport { useViewInput } from '../hooks/use-view-input.js';\nimport { useNavigationStore } from '../stores/navigation-store.js';\nimport { useBrewStream } from '../hooks/use-brew-stream.js';\nimport { Loading, ErrorMessage } from '../components/common/loading.js';\nimport { StatusBadge } from '../components/common/status-badge.js';\nimport { ProgressLog } from '../components/common/progress-log.js';\nimport { ConfirmDialog } from '../components/common/confirm-dialog.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { GradientText, GRADIENTS } from '../utils/gradient.js';\nimport { COLORS } from '../utils/colors.js';\nimport { formatRelativeTime } from '../utils/format.js';\nimport { t } from '../i18n/index.js';\nimport type { TranslationKey } from '../i18n/en.js';\nimport * as api from '../lib/brew-api.js';\nimport type { Formula } from '../lib/types.js';\nimport { SPACING } from '../utils/spacing.js';\nimport { writeLastAction } from '../lib/data-dir.js';\nimport { useBrewStore } from '../stores/brew-store.js';\nimport { logger } from '../utils/logger.js';\n\nconst ACTION_PROGRESS_KEYS: Record<string, TranslationKey> = {\n install: 'pkgInfo_installing',\n uninstall: 'pkgInfo_uninstalling',\n upgrade: 'pkgInfo_upgrading',\n};\n\nconst ACTION_CONFIRM_KEYS: Record<string, TranslationKey> = {\n install: 'pkgInfo_confirmInstall',\n uninstall: 'pkgInfo_confirmUninstall',\n upgrade: 'pkgInfo_confirmUpgrade',\n};\n\nexport function PackageInfoView() {\n const packageName = useNavigationStore((s) => s.selectedPackage);\n const packageType = useNavigationStore((s) => s.selectedPackageType);\n const [formula, setFormula] = useState<Formula | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [confirmAction, setConfirmAction] = useState<string | null>(null);\n const activeActionRef = useRef<string>('install');\n const mountedRef = useRef(true);\n const hasRefreshed = useRef(false);\n const stream = useBrewStream();\n\n useEffect(() => {\n mountedRef.current = true;\n return () => { mountedRef.current = false; };\n }, []);\n\n useEffect(() => {\n if (!packageName) return;\n setLoading(true);\n\n // SCR-008: Try cask-specific info if we know it's a cask\n const fetchInfo = async () => {\n if (packageType === 'cask') {\n // Try cask first, fall back to formula\n const caskInfo = await api.getCaskInfo(packageName);\n if (caskInfo && mountedRef.current) {\n setFormula(api.formulaeFromCask(caskInfo));\n setLoading(false);\n return;\n }\n }\n // Default: try formula info\n const f = await api.getFormulaInfo(packageName);\n if (mountedRef.current) { setFormula(f); setLoading(false); }\n };\n\n fetchInfo().catch((err) => {\n if (mountedRef.current) { setError(err.message); setLoading(false); }\n });\n }, [packageName, packageType]);\n\n useEffect(() => {\n if (!stream.isRunning && !stream.error && stream.lines.length > 0 && !hasRefreshed.current && packageName) {\n hasRefreshed.current = true;\n const refreshFn = packageType === 'cask'\n ? api.getCaskInfo(packageName).then((c) => c ? { ...c, installed: c.installed ? [{ version: c.installed }] : [] } as unknown as import('../lib/types.js').Formula : null)\n : api.getFormulaInfo(packageName);\n refreshFn\n .then((f) => { if (mountedRef.current) { setFormula(f); } })\n .catch(() => { /* ignore refresh errors */ });\n\n // BrewBar handoff for upgrade/install/uninstall actions started here.\n // Refetch the outdated list so remainingOutdated is accurate, then write.\n const action = activeActionRef.current;\n if (action === 'upgrade' || action === 'install' || action === 'uninstall') {\n void useBrewStore.getState().fetchOutdated().then(() => {\n const out = useBrewStore.getState().outdated;\n const remaining = out.formulae.length + out.casks.length;\n void writeLastAction({\n timestamp: new Date().toISOString(),\n action,\n packages: [packageName],\n remainingOutdated: remaining,\n source: 'brew-tui',\n }).catch((err) => logger.warn('Failed to write last-action.json', err));\n });\n }\n }\n }, [stream.isRunning, stream.error]);\n\n useViewInput((input, key) => {\n if (stream.isRunning) {\n if (key.escape) stream.cancel();\n return;\n }\n if (confirmAction) return;\n\n if (!formula) return;\n\n const isInstalled = formula.installed.length > 0;\n if ((input === 'i' || input === '1') && !isInstalled) {\n setConfirmAction('install');\n } else if ((input === 'u' || input === '2') && isInstalled) {\n setConfirmAction('uninstall');\n } else if ((input === 'U' || input === '3') && isInstalled && formula.outdated) {\n setConfirmAction('upgrade');\n }\n });\n\n if (!packageName) {\n return <Text color={COLORS.textSecondary} italic>{t('pkgInfo_noPackage')}</Text>;\n }\n\n if (loading) return <Loading message={t('loading_package', { name: packageName })} />;\n if (error) return <ErrorMessage message={error} />;\n if (!formula) return <ErrorMessage message={t('pkgInfo_notFound')} />;\n\n if (stream.isRunning || stream.lines.length > 0) {\n return (\n <Box flexDirection=\"column\">\n <ProgressLog lines={stream.lines} isRunning={stream.isRunning} title={t(ACTION_PROGRESS_KEYS[activeActionRef.current] ?? ACTION_PROGRESS_KEYS['install']!, { name: formula.name })} />\n {stream.isRunning && (\n <Text color={COLORS.textSecondary}>esc:{t('hint_cancel')}</Text>\n )}\n {!stream.isRunning && (\n <>\n <Text color={stream.error ? COLORS.error : COLORS.success} bold>\n {stream.error ? `\\u2718 ${stream.error}` : `\\u2714 ${t('pkgInfo_done')}`}\n </Text>\n <Text color={COLORS.textSecondary}>esc:{t('hint_back')}</Text>\n </>\n )}\n </Box>\n );\n }\n\n const installed = formula.installed[0];\n const isInstalled = formula.installed.length > 0;\n\n return (\n <Box flexDirection=\"column\">\n {confirmAction && (\n <ConfirmDialog\n message={t(ACTION_CONFIRM_KEYS[confirmAction], { name: formula.name })}\n onConfirm={() => {\n const action = confirmAction;\n activeActionRef.current = action ?? 'install';\n hasRefreshed.current = false;\n setConfirmAction(null);\n if (action === 'install') void stream.run(['install', formula.name]);\n else if (action === 'uninstall') void stream.run(['uninstall', formula.name]);\n else if (action === 'upgrade') void stream.run(['upgrade', formula.name]);\n }}\n onCancel={() => setConfirmAction(null)}\n />\n )}\n\n <Box gap={SPACING.sm} marginBottom={SPACING.xs}>\n <GradientText colors={GRADIENTS.gold} bold>{formula.name}</GradientText>\n <Text color={COLORS.teal}>{installed?.version ?? formula.versions.stable}</Text>\n {isInstalled && <StatusBadge label={t('badge_installed')} variant=\"success\" />}\n {formula.outdated && <StatusBadge label={t('badge_outdated')} variant=\"warning\" />}\n {formula.pinned && <StatusBadge label={t('badge_pinned')} variant=\"info\" />}\n {formula.keg_only && <StatusBadge label={t('badge_kegOnly')} variant=\"muted\" />}\n {formula.deprecated && <StatusBadge label={t('badge_deprecated')} variant=\"error\" />}\n </Box>\n\n <Box flexDirection=\"column\" gap={SPACING.xs}>\n <Text>{formula.desc}</Text>\n\n <Box flexDirection=\"column\">\n <SectionHeader emoji={'\\u{1F4CB}'} title={t('pkgInfo_details')} gradient={[COLORS.text, COLORS.muted]} />\n <Box borderStyle=\"round\" borderColor={COLORS.border} paddingX={SPACING.sm} flexDirection=\"column\">\n <Text><Text color={COLORS.muted}>{t('pkgInfo_homepage')}</Text> {formula.homepage}</Text>\n <Text><Text color={COLORS.muted}>{t('pkgInfo_license')}</Text> {formula.license}</Text>\n <Text><Text color={COLORS.muted}>{t('pkgInfo_tap')}</Text> {formula.tap}</Text>\n <Text><Text color={COLORS.muted}>{t('pkgInfo_stable')}</Text> {formula.versions.stable}</Text>\n {installed && (\n <>\n <Text><Text color={COLORS.muted}>{t('pkgInfo_installed')}</Text> {installed.version} ({formatRelativeTime(installed.time)})</Text>\n <Text><Text color={COLORS.muted}>{t('pkgInfo_bottle')}</Text> {installed.poured_from_bottle ? t('common_yes') : t('common_no')}</Text>\n <Text><Text color={COLORS.muted}>{t('pkgInfo_onRequest')}</Text> {installed.installed_on_request ? t('common_yes') : t('pkgInfo_noDependency')}</Text>\n </>\n )}\n </Box>\n </Box>\n\n {formula.dependencies.length > 0 && (\n <Box flexDirection=\"column\">\n <SectionHeader emoji={'\\u{1F517}'} title={t('pkgInfo_dependencies', { count: formula.dependencies.length })} gradient={GRADIENTS.ocean} />\n <Box paddingLeft={SPACING.sm} flexWrap=\"wrap\" columnGap={2}>\n {/* Cap deps shown to avoid blowing the viewport; rest summarised. */}\n {formula.dependencies.slice(0, 30).map((dep) => (\n <Text key={dep} color={COLORS.muted}>{dep}</Text>\n ))}\n {formula.dependencies.length > 30 && (\n <Text color={COLORS.textSecondary} italic>{t('common_andMore', { count: formula.dependencies.length - 30 })}</Text>\n )}\n </Box>\n </Box>\n )}\n\n {formula.caveats && (\n <Box flexDirection=\"column\">\n <SectionHeader emoji={'\\u26A0\\uFE0F'} title={t('pkgInfo_caveats')} color={COLORS.warning} />\n <Box borderStyle=\"round\" borderColor={COLORS.warning} paddingX={SPACING.sm}>\n <Text color={COLORS.warning} wrap=\"wrap\">{formula.caveats}</Text>\n </Box>\n </Box>\n )}\n </Box>\n\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.textSecondary}>\n {isInstalled ? `u:${t('hint_uninstall')}` : `i:${t('hint_install')}`}\n {isInstalled && formula.outdated ? ` U:${t('hint_upgrade')}` : ''}\n {` esc:${t('hint_back')}`}\n </Text>\n </Box>\n </Box>\n );\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport { Box, Text, type DOMElement } from 'ink';\nimport { useViewInput } from '../hooks/use-view-input.js';\nimport { useContainerSize } from '../hooks/use-container-size.js';\nimport { useBrewStore } from '../stores/brew-store.js';\nimport { Loading, ErrorMessage } from '../components/common/loading.js';\nimport { StatusBadge } from '../components/common/status-badge.js';\nimport { SelectableRow } from '../components/common/selectable-row.js';\nimport { ConfirmDialog } from '../components/common/confirm-dialog.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { COLORS } from '../utils/colors.js';\nimport { GRADIENTS } from '../utils/gradient.js';\nimport { t } from '../i18n/index.js';\nimport { SPACING, getLayoutMode } from '../utils/spacing.js';\nimport { useVisibleRows } from '../hooks/use-visible-rows.js';\n\nconst STATUS_VARIANTS = {\n started: 'success',\n stopped: 'muted',\n error: 'error',\n none: 'muted',\n} as const;\n\n// UI-007: brew services that need root surface as EACCES / \"Operation not\n// permitted\" / \"sudo required\" — translate that into actionable feedback.\nfunction humaniseServiceError(message: string): string {\n if (/EACCES|operation not permitted|permission denied|sudo/i.test(message)) {\n return t('services_errorPermission');\n }\n return message;\n}\n\nexport function ServicesView() {\n // PERF-001: selectors granulares — antes el componente se re-renderizaba ante\n // cualquier cambio de `brew-store` (incluso fetches de paquetes no usados).\n const services = useBrewStore((s) => s.services);\n const loading = useBrewStore((s) => s.loading);\n const errors = useBrewStore((s) => s.errors);\n const fetchServices = useBrewStore((s) => s.fetchServices);\n const serviceAction = useBrewStore((s) => s.serviceAction);\n const [cursor, setCursor] = useState(0);\n const [actionInProgress, setActionInProgress] = useState(false);\n const [confirmAction, setConfirmAction] = useState<{ type: 'stop' | 'restart'; name: string } | null>(null);\n // SCR-014: Persist last error until explicitly cleared\n const [lastError, setLastError] = useState<string | null>(null);\n const containerRef = useRef<DOMElement>(null);\n const { width: containerWidth } = useContainerSize(containerRef);\n const cols = containerWidth > 0 ? containerWidth : 80;\n const mode = getLayoutMode(cols);\n // Widths are passed to <Box width=...>; Yoga handles truncation via\n // <Text wrap=\"truncate\">. No padEnd string-building (the old approach\n // misaligned header vs row by -2). minWidth=0 + flexShrink=1 enable\n // shrink-below-content (the CSS `min-width: 0` pattern).\n const svcNameWidth = mode === 'single'\n ? Math.max(8, cols - 2 /* cursor + gap */)\n : Math.max(12, Math.floor(cols * 0.35));\n const svcStatusWidth = Math.max(8, Math.floor(cols * 0.15));\n const MAX_VISIBLE_ROWS = useVisibleRows({\n reservedRows: lastError || actionInProgress ? 8 : 6,\n fallbackReservedRows: lastError || actionInProgress ? 16 : 14,\n minRows: 1,\n });\n\n useEffect(() => { fetchServices(); }, []);\n\n useViewInput((input, key) => {\n if (actionInProgress) return;\n if (confirmAction) return;\n\n // Clear last error on any key press\n if (lastError) { setLastError(null); }\n\n if (input === 'j' || key.downArrow) {\n setCursor((c) => Math.min(c + 1, Math.max(0, services.length - 1)));\n } else if (input === 'k' || key.upArrow) {\n setCursor((c) => Math.max(c - 1, 0));\n } else if (input === 'r' || input === '4') {\n void fetchServices();\n }\n\n const svc = services[cursor];\n if (!svc) return;\n\n const doAction = (action: 'start' | 'stop' | 'restart') => {\n setActionInProgress(true);\n void serviceAction(svc.name, action)\n .catch((err) => {\n setLastError(humaniseServiceError(err instanceof Error ? err.message : String(err)));\n })\n .finally(() => {\n setActionInProgress(false);\n // SCR-014: Check store for errors after action\n const storeError = useBrewStore.getState().errors['service-action'];\n if (storeError) setLastError(humaniseServiceError(storeError));\n });\n };\n\n if (input === 's' || input === '1') doAction('start');\n else if (input === 'x' || input === '2') setConfirmAction({ type: 'stop', name: svc.name });\n else if (input === 'R' || input === '3') setConfirmAction({ type: 'restart', name: svc.name });\n });\n\n if (loading.services) return <Loading message={t('loading_services')} />;\n if (errors.services) return <ErrorMessage message={errors.services} />;\n\n if (services.length === 0) {\n return (\n <Box flexDirection=\"column\">\n <SectionHeader emoji={'\\u2699\\uFE0F'} title={t('services_title')} gradient={GRADIENTS.ocean} />\n <Text color={COLORS.textSecondary} italic>{t('services_noServices')}</Text>\n </Box>\n );\n }\n\n const start = Math.max(0, cursor - Math.floor(MAX_VISIBLE_ROWS / 2));\n const visible = services.slice(start, start + MAX_VISIBLE_ROWS);\n\n return (\n <Box flexDirection=\"column\" ref={containerRef}>\n <SectionHeader emoji={'\\u2699\\uFE0F'} title={t('services_titleCount', { count: services.length })} gradient={GRADIENTS.ocean} />\n\n {confirmAction && (\n <Box marginY={SPACING.xs}>\n <ConfirmDialog\n message={\n confirmAction.type === 'stop'\n ? t('services_confirmStop', { name: confirmAction.name })\n : t('services_confirmRestart', { name: confirmAction.name })\n }\n onConfirm={() => {\n const { type, name } = confirmAction;\n setConfirmAction(null);\n setActionInProgress(true);\n void serviceAction(name, type)\n .catch((err) => {\n setLastError(err instanceof Error ? err.message : String(err));\n })\n .finally(() => {\n setActionInProgress(false);\n const storeError = useBrewStore.getState().errors['service-action'];\n if (storeError) setLastError(storeError);\n });\n }}\n onCancel={() => setConfirmAction(null)}\n />\n </Box>\n )}\n\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n <Box gap={SPACING.xs} borderStyle=\"single\" borderBottom borderTop={false} borderLeft={false} borderRight={false} borderColor={COLORS.border} paddingBottom={SPACING.none}>\n <Text bold color={COLORS.text}>{' '}</Text>\n <Box width={svcNameWidth} flexShrink={1} minWidth={0}>\n <Text bold color={COLORS.text} wrap=\"truncate\">{t('services_name')}</Text>\n </Box>\n {mode !== 'single' && (\n <Box width={svcStatusWidth} flexShrink={1} minWidth={0}>\n <Text bold color={COLORS.text} wrap=\"truncate\">{t('services_status')}</Text>\n </Box>\n )}\n {mode !== 'single' && mode !== 'compact' && (\n <Box flexGrow={1} flexShrink={1} minWidth={0}>\n <Text bold color={COLORS.text} wrap=\"truncate\">{t('services_user')}</Text>\n </Box>\n )}\n </Box>\n\n {start > 0 && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreAbove', { count: start })}</Text>\n )}\n\n {visible.map((svc, i) => {\n const idx = start + i;\n const isCurrent = idx === cursor;\n return (\n <SelectableRow key={svc.name} isCurrent={isCurrent}>\n <Box width={svcNameWidth} flexShrink={1} minWidth={0}>\n <Text\n bold={isCurrent}\n inverse={isCurrent}\n color={isCurrent ? COLORS.text : COLORS.muted}\n wrap=\"truncate-middle\"\n >\n {svc.name}\n </Text>\n </Box>\n {mode !== 'single' && (\n <Box width={svcStatusWidth} flexShrink={1} minWidth={0}>\n <StatusBadge label={svc.status} variant={STATUS_VARIANTS[svc.status]} />\n </Box>\n )}\n {mode !== 'single' && mode !== 'compact' && (\n <Box flexGrow={1} flexShrink={1} minWidth={0} gap={SPACING.xs}>\n <Text color={COLORS.muted} wrap=\"truncate\">{svc.user ?? '-'}</Text>\n {svc.exit_code != null && svc.exit_code !== 0 && (\n <Text color={COLORS.error}>{t('common_exit', { code: svc.exit_code })}</Text>\n )}\n </Box>\n )}\n </SelectableRow>\n );\n })}\n\n {start + MAX_VISIBLE_ROWS < services.length && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreBelow', { count: services.length - start - MAX_VISIBLE_ROWS })}</Text>\n )}\n </Box>\n\n {actionInProgress && <Text color={COLORS.sky}>{t('services_processing')}</Text>}\n\n {/* SCR-014: Persistent error display */}\n {lastError && (\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.error}>{lastError}</Text>\n </Box>\n )}\n\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.text} bold>\n {cursor + 1}/{services.length}\n </Text>\n </Box>\n </Box>\n );\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport { Box, Text } from 'ink';\nimport { useViewInput } from '../hooks/use-view-input.js';\nimport { useBrewStore } from '../stores/brew-store.js';\nimport { Loading, ErrorMessage } from '../components/common/loading.js';\nimport { ResultBanner } from '../components/common/result-banner.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { COLORS } from '../utils/colors.js';\nimport { GRADIENTS } from '../utils/gradient.js';\nimport { t, tp } from '../i18n/index.js';\nimport { SPACING } from '../utils/spacing.js';\nimport { useVisibleRows } from '../hooks/use-visible-rows.js';\n\nexport function DoctorView() {\n // PERF-001: selectors granulares — evita re-render ante fetches no usados.\n const doctorWarnings = useBrewStore((s) => s.doctorWarnings);\n const doctorClean = useBrewStore((s) => s.doctorClean);\n const loading = useBrewStore((s) => s.loading);\n const errors = useBrewStore((s) => s.errors);\n const fetchDoctor = useBrewStore((s) => s.fetchDoctor);\n // Each warning renders as a bordered box of several lines. Treat each warning\n // as one logical row for paging; long multi-line warnings still wrap inside.\n const [cursor, setCursor] = useState(0);\n const visibleWarnings = useVisibleRows({\n reservedRows: 6,\n fallbackReservedRows: 14,\n minRows: 1,\n });\n\n // FE-006: Mounted ref for cleanup\n const mountedRef = useRef(true);\n useEffect(() => {\n mountedRef.current = true;\n return () => { mountedRef.current = false; };\n }, []);\n\n useEffect(() => { fetchDoctor(); }, []);\n\n useViewInput((input, key) => {\n if (input === 'r' || input === '1') { void fetchDoctor(); return; }\n if (input === 'j' || key.downArrow) setCursor((c) => Math.min(c + 1, Math.max(0, doctorWarnings.length - 1)));\n else if (input === 'k' || key.upArrow) setCursor((c) => Math.max(c - 1, 0));\n });\n\n if (loading.doctor) return <Loading message={t('loading_doctor')} />;\n if (errors.doctor) return <ErrorMessage message={errors.doctor} />;\n\n const start = Math.max(0, cursor - Math.floor(visibleWarnings / 2));\n const visible = doctorWarnings.slice(start, start + visibleWarnings);\n\n return (\n <Box flexDirection=\"column\">\n <SectionHeader emoji={'\\u{1FA7A}'} title={t('doctor_title')} gradient={GRADIENTS.emerald} />\n\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n {doctorClean && (\n <ResultBanner status=\"success\" message={`\\u2714 ${t('doctor_clean')}`} />\n )}\n\n {doctorClean === false && doctorWarnings.length === 0 && (\n <Text color={COLORS.warning}>{t('doctor_warningsNotCaptured')}</Text>\n )}\n\n {start > 0 && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreAbove', { count: start })}</Text>\n )}\n {visible.map((warning, i) => {\n const idx = start + i;\n return (\n <Box key={`warning-${idx}-${warning.slice(0, 20)}`} flexDirection=\"column\" marginBottom={SPACING.xs} borderStyle=\"single\" borderColor={idx === cursor ? COLORS.gold : COLORS.warning} paddingX={SPACING.xs}>\n {warning.split('\\n').map((line, j) => (\n <Text key={`warning-${idx}-${j}-${line.slice(0, 20)}`} color={j === 0 ? COLORS.warning : COLORS.muted} wrap=\"wrap\">{line}</Text>\n ))}\n </Box>\n );\n })}\n {start + visibleWarnings < doctorWarnings.length && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreBelow', { count: doctorWarnings.length - start - visibleWarnings })}</Text>\n )}\n </Box>\n\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.text} bold>\n {doctorWarnings.length > 0 ? tp('plural_warnings', doctorWarnings.length) : ''}\n </Text>\n </Box>\n </Box>\n );\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport { Box } from 'ink';\nimport { useViewInput } from '../hooks/use-view-input.js';\nimport { useProfileStore } from '../stores/profile-store.js';\nimport { useLicenseStore } from '../stores/license-store.js';\nimport { Loading } from '../components/common/loading.js';\nimport { ConfirmDialog } from '../components/common/confirm-dialog.js';\nimport { ProgressLog } from '../components/common/progress-log.js';\nimport { ResultBanner } from '../components/common/result-banner.js';\nimport { t } from '../i18n/index.js';\nimport { useModalStore } from '../stores/modal-store.js';\nimport * as manager from '../lib/profiles/profile-manager.js';\nimport { ProfileListMode } from './profiles/profile-list-mode.js';\nimport { ProfileDetailMode } from './profiles/profile-detail-mode.js';\nimport { ProfileCreateName, ProfileCreateDesc } from './profiles/profile-create-flow.js';\nimport { ProfileEditName, ProfileEditDesc } from './profiles/profile-edit-flow.js';\nimport { SPACING } from '../utils/spacing.js';\n\ntype Mode = 'list' | 'detail' | 'create-name' | 'create-desc' | 'confirm-import' | 'importing' | 'edit-name' | 'edit-desc';\n\nexport function ProfilesView() {\n const { profileNames, selectedProfile, loading, loadError, fetchProfiles, loadProfile, exportCurrent, deleteProfile, updateProfile } = useProfileStore();\n const [cursor, setCursor] = useState(0);\n const [mode, setMode] = useState<Mode>('list');\n const [newName, setNewName] = useState('');\n const [confirmDelete, setConfirmDelete] = useState(false);\n const [editName, setEditName] = useState('');\n const [editDesc, setEditDesc] = useState('');\n const [importLines, setImportLines] = useState<string[]>([]);\n const [importRunning, setImportRunning] = useState(false);\n const [importHadError, setImportHadError] = useState(false);\n const [importProfile, setImportProfile] = useState<Awaited<ReturnType<typeof manager.loadProfile>> | null>(null);\n const { openModal, closeModal } = useModalStore();\n const importGenRef = useRef<AsyncGenerator<string> | null>(null);\n const mountedRef = useRef(true);\n\n useEffect(() => { fetchProfiles(); }, []);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n importGenRef.current?.return(undefined);\n importGenRef.current = null;\n };\n }, []);\n\n useEffect(() => {\n if (mode !== 'list') {\n openModal();\n return () => { closeModal(); };\n }\n return undefined;\n }, [mode]);\n\n useViewInput((input, key) => {\n if (mode !== 'list' || confirmDelete) return;\n\n if (input === 'n' || input === '1') { setMode('create-name'); return; }\n if ((input === 'd' || input === '4') && profileNames[cursor]) { setConfirmDelete(true); return; }\n if (key.return && profileNames[cursor]) {\n void loadProfile(profileNames[cursor]);\n setMode('detail');\n return;\n }\n if ((input === 'i' || input === '3') && profileNames[cursor]) {\n void prepareImport(profileNames[cursor]);\n return;\n }\n\n if (input === 'j' || key.downArrow) setCursor((c) => Math.min(c + 1, Math.max(0, profileNames.length - 1)));\n else if (input === 'k' || key.upArrow) setCursor((c) => Math.max(c - 1, 0));\n });\n\n useViewInput((input, key) => {\n if (key.escape || input === 'q') {\n setMode('list');\n return;\n }\n if ((input === 'e' || input === '2') && selectedProfile) {\n setEditName(selectedProfile.name);\n setEditDesc(selectedProfile.description);\n setMode('edit-name');\n }\n }, { isActive: mode === 'detail' });\n\n useViewInput(() => {\n setMode('list');\n }, { isActive: mode === 'importing' && !importRunning });\n\n // SCR-005: Show import summary before starting\n const prepareImport = async (name: string) => {\n try {\n const isPro = useLicenseStore.getState().isPro();\n const profile = await manager.loadProfile(isPro, name);\n setImportProfile(profile);\n setMode('confirm-import');\n } catch (err) {\n setImportLines([`${t('error_prefix')}${err instanceof Error ? err.message : err}`]);\n setMode('importing');\n setImportRunning(false);\n }\n };\n\n const startImport = async (profile: Awaited<ReturnType<typeof manager.loadProfile>>) => {\n setMode('importing');\n setImportLines([]);\n setImportRunning(true);\n setImportHadError(false);\n try {\n const isPro = useLicenseStore.getState().isPro();\n const gen = manager.importProfile(isPro, profile);\n importGenRef.current = gen;\n for await (const line of gen) {\n if (!mountedRef.current) break;\n setImportLines((prev) => [...prev.slice(-99), line]);\n }\n } catch (err) {\n if (mountedRef.current) {\n setImportHadError(true);\n setImportLines((prev) => [...prev, `${t('error_prefix')}${err instanceof Error ? err.message : err}`]);\n }\n } finally {\n importGenRef.current = null;\n if (mountedRef.current) {\n setImportRunning(false);\n }\n }\n };\n\n if (loading) return <Loading message={t('loading_profiles')} />;\n\n if (mode === 'confirm-import' && importProfile) {\n return (\n <Box flexDirection=\"column\">\n <ConfirmDialog\n message={t('profiles_importSummary', {\n formulae: String(importProfile.formulae.length),\n casks: String(importProfile.casks.length),\n })}\n onConfirm={() => {\n const profile = importProfile;\n setImportProfile(null);\n void startImport(profile);\n }}\n onCancel={() => {\n setImportProfile(null);\n setMode('list');\n }}\n />\n </Box>\n );\n }\n\n if (mode === 'importing') {\n return (\n <Box flexDirection=\"column\">\n <ProgressLog lines={importLines} isRunning={importRunning} title={t('profiles_importTitle')} />\n {!importRunning && (\n <Box marginTop={SPACING.xs}>\n <ResultBanner status={importHadError ? 'error' : 'success'} message={importHadError ? t('profiles_importPartial') : `\\u2714 ${t('profiles_importComplete')}`} />\n </Box>\n )}\n </Box>\n );\n }\n\n if (mode === 'create-name') {\n return <ProfileCreateName onSubmit={(val) => { setNewName(val); setMode('create-desc'); }} />;\n }\n\n if (mode === 'create-desc') {\n return (\n <ProfileCreateDesc\n name={newName}\n loadError={loadError}\n onSubmit={async (val) => {\n try {\n await exportCurrent(newName, val);\n } finally {\n setMode('list');\n setNewName('');\n }\n }}\n />\n );\n }\n\n if (mode === 'edit-name') {\n return <ProfileEditName defaultName={editName} onSubmit={(val) => { setEditName(val); setMode('edit-desc'); }} />;\n }\n\n if (mode === 'edit-desc') {\n return (\n <ProfileEditDesc\n name={editName}\n defaultDesc={editDesc}\n loadError={loadError}\n onSubmit={async (val) => {\n if (selectedProfile) {\n await updateProfile(selectedProfile.name, editName, val);\n }\n setMode('detail');\n setEditName('');\n setEditDesc('');\n }}\n />\n );\n }\n\n if (mode === 'detail' && selectedProfile) {\n return <ProfileDetailMode profile={selectedProfile} />;\n }\n\n return (\n <ProfileListMode\n profileNames={profileNames}\n cursor={cursor}\n confirmDelete={confirmDelete}\n loadError={loadError}\n onConfirmDelete={() => { void deleteProfile(profileNames[cursor]); setConfirmDelete(false); }}\n onCancelDelete={() => setConfirmDelete(false)}\n />\n );\n}\n","import { create } from 'zustand';\nimport type { Profile } from '../lib/profiles/types.js';\nimport * as manager from '../lib/profiles/profile-manager.js';\nimport { useLicenseStore } from './license-store.js';\nimport { verifyPro } from '../lib/license/pro-guard.js';\n\ninterface ProfileState {\n profileNames: string[];\n selectedProfile: Profile | null;\n loading: boolean;\n loadError: string | null;\n\n fetchProfiles: () => Promise<void>;\n loadProfile: (name: string) => Promise<void>;\n exportCurrent: (name: string, description: string) => Promise<void>;\n deleteProfile: (name: string) => Promise<void>;\n updateProfile: (oldName: string, newName: string, newDescription: string) => Promise<void>;\n}\n\n// Defense-in-depth: verifyPro runs canaries, integrity, anti-tamper and\n// degradation checks beyond the simple store flag. lib/ still receives a\n// plain boolean per project convention (CLAUDE.md: lib/ must not import stores).\nfunction getIsPro(): boolean {\n const { license, status } = useLicenseStore.getState();\n return verifyPro(license, status);\n}\n\nexport const useProfileStore = create<ProfileState>((set) => ({\n profileNames: [],\n selectedProfile: null,\n loading: false,\n loadError: null,\n\n fetchProfiles: async () => {\n set({ loading: true });\n const names = await manager.listProfiles(getIsPro());\n set({ profileNames: names, loading: false });\n },\n\n loadProfile: async (name) => {\n set({ loadError: null });\n try {\n const profile = await manager.loadProfile(getIsPro(), name);\n set({ selectedProfile: profile });\n } catch (err) {\n set({ loadError: err instanceof Error ? err.message : String(err) });\n }\n },\n\n exportCurrent: async (name, description) => {\n set({ loading: true, loadError: null });\n try {\n const license = useLicenseStore.getState().license;\n await manager.exportCurrentSetup(getIsPro(), name, description, license);\n const names = await manager.listProfiles(getIsPro());\n set({ profileNames: names, loading: false });\n } catch (err) {\n set({ loading: false, loadError: err instanceof Error ? err.message : String(err) });\n throw err;\n }\n },\n\n deleteProfile: async (name) => {\n await manager.deleteProfile(getIsPro(), name);\n const names = await manager.listProfiles(getIsPro());\n set({ profileNames: names, selectedProfile: null });\n },\n\n updateProfile: async (oldName, newName, newDescription) => {\n set({ loadError: null });\n try {\n await manager.updateProfile(getIsPro(), oldName, newName, newDescription);\n const names = await manager.listProfiles(getIsPro());\n const updated = await manager.loadProfile(getIsPro(), newName);\n set({ profileNames: names, selectedProfile: updated });\n } catch (err) {\n set({ loadError: err instanceof Error ? err.message : String(err) });\n }\n },\n}));\n","import { readFile, writeFile, readdir, rm, rename } from 'node:fs/promises';\nimport { join, basename } from 'node:path';\nimport { PROFILES_DIR, ensureDataDirs } from '../data-dir.js';\nimport { execBrew, streamBrew } from '../brew-cli.js';\nimport { getInstalled, getLeaves } from '../brew-api.js';\nimport { t } from '../../i18n/index.js';\nimport { getWatermark } from '../license/watermark.js';\nimport type { LicenseData } from '../license/types.js';\nimport type { Profile, ProfileFile } from './types.js';\n\nfunction proCheck(isPro: boolean): void {\n if (!isPro) throw new Error('Pro license required');\n}\n\n/**\n * Validate a profile name to prevent path traversal.\n * Only allows alphanumeric characters, hyphens, underscores, and spaces.\n * Throws if the name contains path separators or traversal sequences.\n */\nconst MAX_PROFILE_NAME_LENGTH = 100;\n\nfunction validateProfileName(name: string): void {\n if (!name || name.trim().length === 0) {\n throw new Error('Profile name cannot be empty');\n }\n if (name.length > MAX_PROFILE_NAME_LENGTH) {\n throw new Error(`Profile name is too long (max ${MAX_PROFILE_NAME_LENGTH} characters)`);\n }\n if (!/^[\\w\\s-]+$/.test(name)) {\n throw new Error(`Invalid profile name: \"${name}\". Only letters, numbers, spaces, hyphens, and underscores are allowed.`);\n }\n}\n\nfunction profilePath(name: string): string {\n validateProfileName(name);\n // Use basename as an additional defense-in-depth guard: strips any directory\n // component that might survive the regex check on edge-case OS behavior.\n return join(PROFILES_DIR, `${basename(name)}.json`);\n}\n\nexport async function listProfiles(isPro: boolean): Promise<string[]> {\n proCheck(isPro);\n await ensureDataDirs();\n try {\n const files = await readdir(PROFILES_DIR);\n return files.filter((f) => f.endsWith('.json')).map((f) => f.replace('.json', ''));\n } catch {\n return [];\n }\n}\n\nexport async function loadProfile(isPro: boolean, name: string): Promise<Profile> {\n proCheck(isPro);\n const raw = await readFile(profilePath(name), 'utf-8');\n let file: ProfileFile;\n try {\n file = JSON.parse(raw) as ProfileFile;\n } catch (err) {\n throw new Error(`Profile \"${name}\" is corrupted: ${err instanceof Error ? err.message : String(err)}`, { cause: err });\n }\n if (file.version !== 1) {\n // Future: add migration logic here\n throw new Error('Unsupported data version');\n }\n if (!file.profile) {\n throw new Error(`Profile \"${name}\" is missing required data`);\n }\n return file.profile;\n}\n\nexport async function saveProfile(isPro: boolean, profile: Profile): Promise<void> {\n proCheck(isPro);\n await ensureDataDirs();\n\n // BK-002: Atomic write via temp file + rename\n const filePath = profilePath(profile.name);\n const tmpPath = filePath + '.tmp';\n const file: ProfileFile = { version: 1, profile };\n await writeFile(tmpPath, JSON.stringify(file, null, 2), { encoding: 'utf-8', mode: 0o600 });\n await rename(tmpPath, filePath);\n}\n\nexport async function deleteProfile(isPro: boolean, name: string): Promise<void> {\n proCheck(isPro);\n try {\n await rm(profilePath(name));\n } catch { /* may not exist */ }\n}\n\nexport async function exportCurrentSetup(isPro: boolean, name: string, description: string, license: LicenseData | null = null, consent = true): Promise<Profile> {\n proCheck(isPro);\n\n // BK-007: Check if profile already exists\n const existingNames = await listProfiles(isPro);\n if (existingNames.includes(name)) {\n throw new Error('Profile already exists: ' + name);\n }\n\n const [installed, leaves, tapsRaw] = await Promise.all([\n getInstalled(),\n getLeaves(),\n execBrew(['tap']),\n ]);\n\n const taps = tapsRaw.split('\\n').map((l) => l.trim()).filter(Boolean);\n const casks = installed.casks\n .filter((c) => c.installed)\n .map((c) => c.token);\n\n const now = new Date().toISOString();\n const profile: Profile = {\n name,\n description,\n createdAt: now,\n updatedAt: now,\n formulae: leaves,\n casks,\n taps,\n exportedBy: getWatermark(license, consent), // BK-014: explicit consent required (default false)\n };\n\n await saveProfile(isPro, profile);\n return profile;\n}\n\nexport async function updateProfile(isPro: boolean, oldName: string, newName: string, newDescription: string): Promise<void> {\n proCheck(isPro);\n const profile = await loadProfile(isPro, oldName);\n if (oldName !== newName) {\n await deleteProfile(isPro, oldName);\n }\n const updated: Profile = {\n ...profile,\n name: newName,\n description: newDescription,\n updatedAt: new Date().toISOString(),\n };\n await saveProfile(isPro, updated);\n}\n\n// ARQ-004: divergencia INTENCIONAL respecto al PKG_PATTERN canonico de\n// `brew-api.ts` (que es permisivo `/^[\\w@./+-]+$/`). Aqui validamos paquetes\n// importados desde un Profile externo (no controlado por nuestra UI), por lo\n// que aplicamos un patron mas estricto: minusculas, sin `/`, sin mayusculas.\n// Razon: un Profile artesanal no deberia poder instalar formulae con nombres\n// poco canonicos. El tradeoff es que algunos nombres validos para brew (taps\n// que incluyen `/`, paquetes con mayusculas) seran rechazados — uso voluntario.\nconst TAP_PATTERN = /^[a-z0-9][-a-z0-9]*\\/[a-z0-9][-a-z0-9]*$/;\nconst PKG_PATTERN = /^[a-z0-9][-a-z0-9_.@+]*$/;\n\nexport async function* importProfile(isPro: boolean, profile: Profile): AsyncGenerator<string> {\n proCheck(isPro);\n\n const installed = await getInstalled();\n const installedFormulae = new Set(installed.formulae.map((f) => f.name));\n const installedCasks = new Set(installed.casks.filter((c) => c.installed).map((c) => c.token));\n\n // Add missing taps (validated)\n for (const tap of profile.taps) {\n if (!TAP_PATTERN.test(tap)) {\n yield `Skipping invalid tap name: ${tap}`;\n continue;\n }\n yield t('profileMgr_tapping', { name: tap });\n try {\n await execBrew(['tap', tap]);\n } catch { /* may already be tapped */ }\n }\n\n // Install missing formulae (validated)\n const missingFormulae = profile.formulae.filter((f) => !installedFormulae.has(f));\n for (const name of missingFormulae) {\n if (!PKG_PATTERN.test(name)) {\n yield `Skipping invalid formula name: ${name}`;\n continue;\n }\n yield t('profileMgr_installing', { name });\n for await (const line of streamBrew(['install', name])) {\n yield line;\n }\n }\n\n // Install missing casks (validated)\n const missingCasks = profile.casks.filter((c) => !installedCasks.has(c));\n for (const name of missingCasks) {\n if (!PKG_PATTERN.test(name)) {\n yield `Skipping invalid cask name: ${name}`;\n continue;\n }\n yield t('profileMgr_installingCask', { name });\n for await (const line of streamBrew(['install', '--cask', name])) {\n yield line;\n }\n }\n\n const totalInstalled = missingFormulae.length + missingCasks.length;\n yield t('profileMgr_importDone', { count: totalInstalled });\n}\n","import type { LicenseData } from './types.js';\n\n/**\n * Get a watermark string containing the license holder's email.\n * Used subtly in Pro feature output for traceability.\n *\n * BK-014: `consent` defaults to FALSE. Embedding the customer email in\n * exported artefacts is privacy-sensitive (the export may be shared,\n * pasted into a public PR, etc.). Callers must explicitly opt in by\n * passing `true`.\n */\nexport function getWatermark(license: LicenseData | null, consent = false): string {\n if (!consent) return '';\n if (!license?.customerEmail) return '';\n // Create a subtle, non-obvious watermark\n // Embed as zero-width characters or as a comment in exported data\n return `Licensed to: ${license.customerEmail}`;\n}\n\n/**\n * Embed invisible watermark in a string using zero-width characters.\n * Each bit of the email is encoded as either a zero-width space (0) or\n * zero-width non-joiner (1).\n */\nexport function embedInvisibleWatermark(text: string, email: string): string {\n const encoded = [...email].map(c => {\n const cp = c.codePointAt(0) ?? 0;\n // Use 21 bits to cover the full Unicode range (max code point U+10FFFF)\n const bits = cp.toString(2).padStart(21, '0');\n return [...bits].map(b => b === '0' ? '\\u200B' : '\\u200C').join('');\n }).join('\\u200D'); // zero-width joiner as separator\n\n // Insert at the end of the first line\n const lines = text.split('\\n');\n if (lines.length > 0) {\n lines[0] = lines[0] + encoded;\n }\n return lines.join('\\n');\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { ConfirmDialog } from '../../components/common/confirm-dialog.js';\nimport { SectionHeader } from '../../components/common/section-header.js';\nimport { COLORS } from '../../utils/colors.js';\nimport { SelectableRow } from '../../components/common/selectable-row.js';\nimport { GRADIENTS } from '../../utils/gradient.js';\nimport { t } from '../../i18n/index.js';\nimport { SPACING } from '../../utils/spacing.js';\n\ninterface ProfileListModeProps {\n profileNames: string[];\n cursor: number;\n confirmDelete: boolean;\n loadError: string | null;\n onConfirmDelete: () => void;\n onCancelDelete: () => void;\n}\n\nexport function ProfileListMode({ profileNames, cursor, confirmDelete, loadError, onConfirmDelete, onCancelDelete }: ProfileListModeProps) {\n return (\n <Box flexDirection=\"column\">\n <SectionHeader emoji={'\\u{1F4C1}'} title={t('profiles_title', { count: profileNames.length })} gradient={GRADIENTS.gold} />\n\n {/* SCR-004: Display load errors */}\n {loadError && (\n <Box marginY={SPACING.xs}>\n <Text color={COLORS.error}>{loadError}</Text>\n </Box>\n )}\n\n {confirmDelete && profileNames[cursor] && (\n <Box marginY={SPACING.xs}>\n <ConfirmDialog\n message={t('profiles_confirmDelete', { name: profileNames[cursor] })}\n onConfirm={onConfirmDelete}\n onCancel={onCancelDelete}\n />\n </Box>\n )}\n\n {profileNames.length === 0 && !confirmDelete && (\n <Box marginTop={SPACING.xs} borderStyle=\"round\" borderColor={COLORS.textSecondary} paddingX={SPACING.sm} paddingY={SPACING.none}>\n <Box flexDirection=\"column\">\n <Text color={COLORS.textSecondary} italic>{t('profiles_noProfiles')}</Text>\n <Text color={COLORS.muted}>{t('profiles_press')} <Text color={COLORS.gold} bold>n</Text> {t('profiles_exportHint')}</Text>\n </Box>\n </Box>\n )}\n\n {profileNames.length > 0 && !confirmDelete && (\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n {profileNames.map((name, i) => {\n const isCurrent = i === cursor;\n return (\n <SelectableRow key={name} isCurrent={isCurrent}>\n <Text bold={isCurrent} inverse={isCurrent}>{name}</Text>\n </SelectableRow>\n );\n })}\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.text} bold>{cursor + 1}/{profileNames.length}</Text>\n </Box>\n </Box>\n )}\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { COLORS } from '../../utils/colors.js';\nimport { t } from '../../i18n/index.js';\nimport { formatDate } from '../../utils/format.js';\nimport type { Profile } from '../../lib/profiles/types.js';\nimport { SPACING } from '../../utils/spacing.js';\nimport { useVisibleRows } from '../../hooks/use-visible-rows.js';\n\ninterface ProfileDetailModeProps {\n profile: Profile;\n}\n\nexport function ProfileDetailMode({ profile }: ProfileDetailModeProps) {\n // Header (~3 lines) + 2 section titles + hint row. Split remaining rows\n // proportionally between formulae and casks so neither hides the other.\n const totalRows = useVisibleRows({\n reservedRows: 7,\n fallbackReservedRows: 14,\n minRows: 2,\n });\n const total = profile.formulae.length + profile.casks.length;\n const formulaeBudget = total === 0\n ? 0\n : Math.min(profile.formulae.length, Math.max(1, Math.round((profile.formulae.length / total) * totalRows)));\n const casksBudget = Math.max(0, totalRows - formulaeBudget);\n const visibleFormulae = profile.formulae.slice(0, formulaeBudget);\n const visibleCasks = profile.casks.slice(0, casksBudget);\n const formulaeHidden = profile.formulae.length - visibleFormulae.length;\n const casksHidden = profile.casks.length - visibleCasks.length;\n\n return (\n <Box flexDirection=\"column\">\n <Text bold color={COLORS.gold}>{profile.name}</Text>\n <Text color={COLORS.muted} wrap=\"wrap\">{profile.description}</Text>\n <Text color={COLORS.muted}>{t('profiles_created', { date: formatDate(profile.createdAt) })}</Text>\n <Box marginTop={SPACING.xs} flexDirection=\"column\">\n <Text bold>{t('profiles_formulaeCount', { count: profile.formulae.length })}</Text>\n <Box paddingLeft={SPACING.sm} flexDirection=\"column\">\n {visibleFormulae.map((f) => (\n <Text key={f} color={COLORS.muted}>{f}</Text>\n ))}\n {formulaeHidden > 0 && (\n <Text color={COLORS.textSecondary} italic>{t('common_andMore', { count: formulaeHidden })}</Text>\n )}\n </Box>\n <Text bold>{t('profiles_casksCount', { count: profile.casks.length })}</Text>\n <Box paddingLeft={SPACING.sm} flexDirection=\"column\">\n {visibleCasks.map((c) => (\n <Text key={c} color={COLORS.muted}>{c}</Text>\n ))}\n {casksHidden > 0 && (\n <Text color={COLORS.textSecondary} italic>{t('common_andMore', { count: casksHidden })}</Text>\n )}\n </Box>\n </Box>\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.textSecondary}>esc:{t('hint_back')} e:{t('hint_edit')} i:{t('hint_importProfile')}</Text>\n </Box>\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { TextInput } from '@inkjs/ui';\nimport { COLORS } from '../../utils/colors.js';\nimport { t } from '../../i18n/index.js';\n\ninterface ProfileCreateNameProps {\n onSubmit: (name: string) => void;\n}\n\nexport function ProfileCreateName({ onSubmit }: ProfileCreateNameProps) {\n return (\n <Box flexDirection=\"column\">\n <Text bold>{t('profiles_createName')}</Text>\n <TextInput\n placeholder={t('profiles_namePlaceholder')}\n onSubmit={onSubmit}\n />\n </Box>\n );\n}\n\ninterface ProfileCreateDescProps {\n name: string;\n loadError: string | null;\n onSubmit: (desc: string) => void;\n}\n\nexport function ProfileCreateDesc({ name, loadError, onSubmit }: ProfileCreateDescProps) {\n return (\n <Box flexDirection=\"column\">\n <Text bold>{t('profiles_createDesc', { name })}</Text>\n {loadError && <Text color={COLORS.error}>{t('error_prefix')}{loadError}</Text>}\n <TextInput\n placeholder={t('profiles_descPlaceholder')}\n onSubmit={onSubmit}\n />\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { TextInput } from '@inkjs/ui';\nimport { COLORS } from '../../utils/colors.js';\nimport { t } from '../../i18n/index.js';\n\ninterface ProfileEditNameProps {\n defaultName: string;\n onSubmit: (name: string) => void;\n}\n\nexport function ProfileEditName({ defaultName, onSubmit }: ProfileEditNameProps) {\n return (\n <Box flexDirection=\"column\">\n <Text bold>{t('profiles_editName')}</Text>\n <TextInput\n defaultValue={defaultName}\n onSubmit={onSubmit}\n />\n </Box>\n );\n}\n\ninterface ProfileEditDescProps {\n name: string;\n defaultDesc: string;\n loadError: string | null;\n onSubmit: (desc: string) => void;\n}\n\nexport function ProfileEditDesc({ name, defaultDesc, loadError, onSubmit }: ProfileEditDescProps) {\n return (\n <Box flexDirection=\"column\">\n <Text bold>{t('profiles_editDesc', { name })}</Text>\n {loadError && <Text color={COLORS.error}>{t('error_prefix')}{loadError}</Text>}\n <TextInput\n defaultValue={defaultDesc}\n onSubmit={onSubmit}\n />\n </Box>\n );\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport { Box, Text } from 'ink';\nimport { useViewInput } from '../hooks/use-view-input.js';\nimport { useCleanupStore } from '../stores/cleanup-store.js';\nimport { useBrewStream } from '../hooks/use-brew-stream.js';\nimport { Loading, ErrorMessage } from '../components/common/loading.js';\nimport { ConfirmDialog } from '../components/common/confirm-dialog.js';\nimport { ProgressLog } from '../components/common/progress-log.js';\nimport { ResultBanner } from '../components/common/result-banner.js';\nimport { StatCard } from '../components/common/stat-card.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { COLORS } from '../utils/colors.js';\nimport { SelectableRow } from '../components/common/selectable-row.js';\nimport { GRADIENTS } from '../utils/gradient.js';\nimport { t } from '../i18n/index.js';\nimport { SPACING } from '../utils/spacing.js';\nimport { useVisibleRows } from '../hooks/use-visible-rows.js';\n\nexport function SmartCleanupView() {\n const { summary, selected, loading, error, analyze, toggleSelect, selectAll } = useCleanupStore();\n const [cursor, setCursor] = useState(0);\n const [confirmClean, setConfirmClean] = useState(false);\n const [confirmForce, setConfirmForce] = useState(false);\n const [failedNames, setFailedNames] = useState<string[]>([]);\n const stream = useBrewStream();\n const hasRefreshed = useRef(false);\n // StatCards (3 rows) + title + warning/confirm dialog + footer hints.\n const listRows = useVisibleRows({\n reservedRows: confirmClean || confirmForce ? 12 : 9,\n fallbackReservedRows: confirmClean || confirmForce ? 18 : 14,\n minRows: 1,\n });\n\n useEffect(() => { analyze(); }, []);\n\n useEffect(() => {\n if (!stream.isRunning && !stream.error && stream.lines.length > 0 && !hasRefreshed.current) {\n hasRefreshed.current = true;\n void analyze();\n }\n }, [stream.isRunning, stream.error]);\n\n const candidates = summary?.candidates ?? [];\n\n const isDependencyError = stream.error != null &&\n stream.lines.some((l) => l.includes('Refusing to uninstall') || l.includes('required by'));\n\n useViewInput((input, key) => {\n if (stream.isRunning) {\n if (key.escape) stream.cancel();\n return;\n }\n if (confirmClean || confirmForce) return;\n\n // After a dependency error, offer F (or 3) to force\n if ((input === 'F' || input === '3') && isDependencyError && failedNames.length > 0) {\n setConfirmForce(true);\n return;\n }\n\n if (input === 'r' || input === '4') { stream.clear(); setFailedNames([]); void analyze(); return; }\n if (key.return && candidates[cursor]) {\n toggleSelect(candidates[cursor].name);\n return;\n }\n if (input === 'a' || input === '1') { selectAll(); return; }\n if ((input === 'c' || input === '2') && selected.size > 0) { setConfirmClean(true); return; }\n\n if (input === 'j' || key.downArrow) setCursor((c) => Math.min(c + 1, Math.max(0, candidates.length - 1)));\n else if (input === 'k' || key.upArrow) setCursor((c) => Math.max(c - 1, 0));\n });\n\n if (loading) return <Loading message={t('loading_cleanup')} />;\n if (error) return <ErrorMessage message={error} />;\n\n if (stream.isRunning || stream.lines.length > 0) {\n return (\n <Box flexDirection=\"column\">\n <ProgressLog lines={stream.lines} isRunning={stream.isRunning} title={t('cleanup_cleaning')} />\n {stream.isRunning && (\n <Text color={COLORS.muted}>esc:{t('hint_cancel')}</Text>\n )}\n\n {!stream.isRunning && !stream.error && (\n <ResultBanner status=\"success\" message={`\\u2714 ${t('cleanup_complete')}`} />\n )}\n\n {!stream.isRunning && stream.error && (\n <Box flexDirection=\"column\" gap={SPACING.xs}>\n <ResultBanner status=\"error\" message={`\\u2718 ${t('cleanup_depError')}`} />\n {isDependencyError && failedNames.length > 0 && (\n <Text color={COLORS.warning}>\n F:{t('hint_force')} r:{t('hint_refresh')}\n </Text>\n )}\n </Box>\n )}\n\n {confirmForce && (\n <Box marginY={SPACING.xs}>\n <ConfirmDialog\n message={t('cleanup_confirmForce', { count: failedNames.length })}\n onConfirm={() => {\n setConfirmForce(false);\n hasRefreshed.current = false;\n stream.clear();\n void stream.run(['uninstall', '--ignore-dependencies', ...failedNames]);\n }}\n onCancel={() => setConfirmForce(false)}\n />\n </Box>\n )}\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\">\n <SectionHeader emoji={'\\u{1F9F9}'} title={t('cleanup_title')} gradient={GRADIENTS.emerald} />\n\n {summary && (\n <Box gap={SPACING.xs} marginY={SPACING.xs}>\n <StatCard label={t('cleanup_orphans')} value={candidates.length} color={candidates.length > 0 ? COLORS.warning : COLORS.success} />\n <StatCard label={t('cleanup_reclaimable')} value={summary.totalReclaimableFormatted} color={COLORS.sky} />\n <StatCard label={t('cleanup_selected')} value={selected.size} color={selected.size > 0 ? COLORS.success : COLORS.muted} />\n </Box>\n )}\n\n {/* SCR-001: Two-step confirmation with system tools warning */}\n {confirmClean && (\n <Box flexDirection=\"column\" marginY={SPACING.xs} gap={SPACING.xs}>\n <Box borderStyle=\"round\" borderColor={COLORS.warning} paddingX={SPACING.sm} paddingY={SPACING.none}>\n <Text color={COLORS.warning}>{t('cleanup_warning_system_tools')}</Text>\n </Box>\n <ConfirmDialog\n message={t('cleanup_confirmUninstall', { count: selected.size })}\n onConfirm={() => {\n setConfirmClean(false);\n hasRefreshed.current = false;\n const names = Array.from(selected);\n setFailedNames(names);\n void stream.run(['uninstall', ...names]);\n }}\n onCancel={() => setConfirmClean(false)}\n />\n </Box>\n )}\n\n {candidates.length === 0 && !confirmClean && (\n <ResultBanner status=\"success\" message={`\\u2714 ${t('cleanup_systemClean')}`} />\n )}\n\n {candidates.length > 0 && !confirmClean && (() => {\n const start = Math.max(0, cursor - Math.floor(listRows / 2));\n const visible = candidates.slice(start, start + listRows);\n return (\n <Box flexDirection=\"column\">\n {start > 0 && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreAbove', { count: start })}</Text>\n )}\n {visible.map((c, i) => {\n const idx = start + i;\n const isCurrent = idx === cursor;\n const isSelected = selected.has(c.name);\n return (\n <SelectableRow key={c.name} isCurrent={isCurrent}>\n <Text color={isSelected ? COLORS.success : COLORS.muted}>{isSelected ? '\\u2611' : '\\u2610'}</Text>\n <Text bold={isCurrent} inverse={isCurrent} color={isCurrent ? COLORS.text : COLORS.muted}>{c.name}</Text>\n <Text color={COLORS.warning}>{c.diskUsageFormatted}</Text>\n <Text color={COLORS.textSecondary}>[{c.reason}]</Text>\n </SelectableRow>\n );\n })}\n {start + listRows < candidates.length && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreBelow', { count: candidates.length - start - listRows })}</Text>\n )}\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.text} bold>\n {cursor + 1}/{candidates.length}\n </Text>\n </Box>\n </Box>\n );\n })()}\n </Box>\n );\n}\n","import { create } from 'zustand';\nimport type { CleanupSummary } from '../lib/cleanup/types.js';\nimport { analyzeCleanup } from '../lib/cleanup/cleanup-analyzer.js';\nimport { useBrewStore } from './brew-store.js';\nimport { useLicenseStore } from './license-store.js';\nimport { verifyPro } from '../lib/license/pro-guard.js';\n\ninterface CleanupState {\n summary: CleanupSummary | null;\n selected: Set<string>;\n loading: boolean;\n error: string | null;\n\n analyze: () => Promise<void>;\n toggleSelect: (name: string) => void;\n selectAll: () => void;\n deselectAll: () => void;\n}\n\nexport const useCleanupStore = create<CleanupState>((set, get) => ({\n summary: null,\n selected: new Set(),\n loading: false,\n error: null,\n\n analyze: async () => {\n set({ loading: true, error: null });\n try {\n const brewState = useBrewStore.getState();\n if (brewState.formulae.length === 0) {\n await brewState.fetchInstalled();\n await brewState.fetchLeaves();\n }\n const { formulae, leaves } = useBrewStore.getState();\n const { license, status } = useLicenseStore.getState();\n const isPro = verifyPro(license, status);\n const summary = await analyzeCleanup(isPro, formulae, leaves);\n set({ summary, selected: new Set(), loading: false });\n } catch (err) {\n set({ error: err instanceof Error ? err.message : String(err), loading: false });\n }\n },\n\n toggleSelect: (name) => {\n const selected = new Set(get().selected);\n if (selected.has(name)) selected.delete(name);\n else selected.add(name);\n set({ selected });\n },\n\n selectAll: () => {\n const names = get().summary?.candidates.map((c) => c.name) ?? [];\n set({ selected: new Set(names) });\n },\n\n deselectAll: () => set({ selected: new Set() }),\n}));\n","import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { execBrew } from '../brew-cli.js';\nimport { formatBytes } from '../../utils/format.js';\nimport type { Formula } from '../types.js';\nimport type { CleanupCandidate, CleanupSummary } from './types.js';\n\nconst execFileAsync = promisify(execFile);\n\nasync function getDiskUsage(cellarPath: string): Promise<number> {\n try {\n const { stdout } = await execFileAsync('du', ['-sk', cellarPath]);\n const kb = parseInt(stdout.split('\\t')[0] ?? '0', 10);\n return kb * 1024;\n } catch {\n return 0;\n }\n}\n\nasync function getCellarPath(name: string): Promise<string | null> {\n try {\n const raw = await execBrew(['--cellar', name]);\n return raw.trim() || null;\n } catch {\n return null;\n }\n}\n\nexport async function analyzeCleanup(\n isPro: boolean,\n formulae: Formula[],\n leaves: string[],\n): Promise<CleanupSummary> {\n if (!isPro) throw new Error('Pro license required');\n\n const leavesSet = new Set(leaves);\n\n // Build reverse dependency map\n const reverseDeps = new Map<string, number>();\n for (const f of formulae) {\n for (const dep of f.dependencies) {\n reverseDeps.set(dep, (reverseDeps.get(dep) ?? 0) + 1);\n }\n }\n\n // Find orphans: installed as dependency but not a leaf and has 0 reverse deps from installed packages\n const orphans: string[] = [];\n\n for (const f of formulae) {\n const installed = f.installed[0];\n if (!installed) continue;\n\n if (installed.installed_as_dependency && !installed.installed_on_request && !leavesSet.has(f.name)) {\n // Check if any installed package still depends on this\n // Actually, we need to check if any installed package lists THIS package as a dependency\n let isNeeded = false;\n for (const other of formulae) {\n if (other.name === f.name) continue;\n if (other.dependencies.includes(f.name)) {\n isNeeded = true;\n break;\n }\n }\n if (!isNeeded) {\n orphans.push(f.name);\n }\n }\n }\n\n // Get disk usage for orphans (parallel, limited concurrency)\n const candidates: CleanupCandidate[] = [];\n const concurrency = 5;\n\n for (let i = 0; i < orphans.length; i += concurrency) {\n const batch = orphans.slice(i, i + concurrency);\n const results = await Promise.all(\n batch.map(async (name) => {\n const cellarPath = await getCellarPath(name);\n const bytes = cellarPath ? await getDiskUsage(cellarPath) : 0;\n return {\n name,\n reason: 'orphan' as const,\n diskUsageBytes: bytes,\n diskUsageFormatted: formatBytes(bytes),\n installedAsDependency: true,\n dependentsCount: 0,\n };\n }),\n );\n candidates.push(...results);\n }\n\n // Sort by disk usage descending\n candidates.sort((a, b) => b.diskUsageBytes - a.diskUsageBytes);\n\n const totalBytes = candidates.reduce((sum, c) => sum + c.diskUsageBytes, 0);\n\n return {\n totalReclaimableBytes: totalBytes,\n totalReclaimableFormatted: formatBytes(totalBytes),\n candidates,\n analyzedAt: new Date().toISOString(),\n };\n}\n","import React, { useEffect, useState, useMemo } from 'react';\nimport { Box, Text } from 'ink';\nimport { useViewInput } from '../hooks/use-view-input.js';\nimport { useHistoryStore } from '../stores/history-store.js';\nimport { useBrewStream } from '../hooks/use-brew-stream.js';\nimport { useDebounce } from '../hooks/use-debounce.js';\nimport { Loading, ErrorMessage } from '../components/common/loading.js';\nimport { StatusBadge } from '../components/common/status-badge.js';\nimport { SelectableRow } from '../components/common/selectable-row.js';\nimport { SearchInput } from '../components/common/search-input.js';\nimport { ConfirmDialog } from '../components/common/confirm-dialog.js';\nimport { ProgressLog } from '../components/common/progress-log.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { COLORS } from '../utils/colors.js';\nimport { GRADIENTS } from '../utils/gradient.js';\nimport { formatRelativeTime } from '../utils/format.js';\nimport { t } from '../i18n/index.js';\nimport { useModalStore } from '../stores/modal-store.js';\nimport type { TranslationKey } from '../i18n/en.js';\nimport type { HistoryAction, HistoryEntry } from '../lib/history/types.js';\nimport { SPACING } from '../utils/spacing.js';\nimport { useVisibleRows } from '../hooks/use-visible-rows.js';\n\nconst ACTION_ICONS: Record<HistoryAction, { icon: string; color: string }> = {\n install: { icon: '+', color: COLORS.success },\n uninstall: { icon: '-', color: COLORS.error },\n upgrade: { icon: '\\u2191', color: COLORS.info },\n 'upgrade-all': { icon: '\\u21C8', color: COLORS.info },\n};\n\nconst ACTION_LABEL_KEYS: Record<HistoryAction, TranslationKey> = {\n install: 'history_actionInstall',\n uninstall: 'history_actionUninstall',\n upgrade: 'history_actionUpgrade',\n 'upgrade-all': 'history_actionUpgradeAll',\n};\n\nconst FILTERS: (HistoryAction | 'all')[] = ['all', 'install', 'uninstall', 'upgrade', 'upgrade-all'];\n\nexport function HistoryView() {\n const { entries, loading, error, fetchHistory, clearHistory } = useHistoryStore();\n const [cursor, setCursor] = useState(0);\n const [filter, setFilter] = useState<HistoryAction | 'all'>('all');\n const [searchQuery, setSearchQuery] = useState('');\n const [isSearching, setIsSearching] = useState(false);\n const [confirmClear, setConfirmClear] = useState(false);\n const [confirmReplay, setConfirmReplay] = useState<HistoryEntry | null>(null);\n const stream = useBrewStream();\n const debouncedQuery = useDebounce(searchQuery, 200);\n const { openModal, closeModal } = useModalStore();\n const MAX_VISIBLE_ROWS = useVisibleRows({\n reservedRows: isSearching || stream.lines.length > 0 || stream.isRunning ? 8 : 5,\n fallbackReservedRows: isSearching || stream.lines.length > 0 || stream.isRunning ? 16 : 13,\n minRows: 1,\n });\n const streamRows = useVisibleRows({\n reservedRows: 7,\n fallbackReservedRows: 16,\n minRows: 1,\n });\n\n useEffect(() => { fetchHistory(); }, []);\n\n // Suppress global Escape while search bar is active so Escape clears the\n // search bar rather than navigating away from the history view.\n useEffect(() => {\n if (isSearching) {\n openModal();\n return () => { closeModal(); };\n }\n return undefined;\n }, [isSearching]);\n\n const filtered = useMemo(() => {\n let result = entries;\n if (filter !== 'all') {\n result = result.filter((e) => e.action === filter);\n }\n if (debouncedQuery) {\n const q = debouncedQuery.toLowerCase();\n result = result.filter((e) => e.packageName?.toLowerCase().includes(q));\n }\n return result;\n }, [entries, filter, debouncedQuery]);\n\n useViewInput((input, key) => {\n if (confirmClear || confirmReplay || stream.isRunning) return;\n\n if (isSearching) {\n if (key.escape) {\n setIsSearching(false);\n setSearchQuery('');\n }\n return;\n }\n\n if (input === '/') { setIsSearching(true); return; }\n if (input === 'f' || input === '1') {\n const idx = FILTERS.indexOf(filter);\n setFilter(FILTERS[(idx + 1) % FILTERS.length]!);\n setCursor(0);\n return;\n }\n if ((input === 'c' || input === '2') && entries.length > 0) { setConfirmClear(true); return; }\n if (key.return && filtered[cursor]) {\n setConfirmReplay(filtered[cursor]);\n return;\n }\n\n if (input === 'j' || key.downArrow) setCursor((c) => Math.min(c + 1, Math.max(0, filtered.length - 1)));\n else if (input === 'k' || key.upArrow) setCursor((c) => Math.max(c - 1, 0));\n });\n\n if (loading) return <Loading message={t('loading_history')} />;\n if (error) return <ErrorMessage message={error} />;\n\n const start = Math.max(0, cursor - Math.floor(MAX_VISIBLE_ROWS / 2));\n const visible = filtered.slice(start, start + MAX_VISIBLE_ROWS);\n\n return (\n <Box flexDirection=\"column\">\n <Box gap={SPACING.sm} marginBottom={SPACING.xs}>\n <SectionHeader emoji={'\\u{1F4DC}'} title={t('history_title', { count: filtered.length })} gradient={GRADIENTS.gold} />\n <Text color={filter === 'all' ? COLORS.text : COLORS.gold}>\n {t('history_filterLabel', { filter })}\n </Text>\n </Box>\n\n {isSearching && (\n <Box marginBottom={SPACING.xs}>\n <SearchInput defaultValue={searchQuery} onChange={setSearchQuery} placeholder={t('history_searchPlaceholder')} isActive />\n </Box>\n )}\n\n {confirmClear && (\n <ConfirmDialog\n message={t('history_confirmClear', { count: entries.length })}\n onConfirm={() => { void clearHistory(); setConfirmClear(false); }}\n onCancel={() => setConfirmClear(false)}\n />\n )}\n\n {confirmReplay && (\n <ConfirmDialog\n message={\n confirmReplay.action === 'upgrade-all'\n ? t('history_replayAll') + '\\n' + t('upgrade_all_warning')\n : t('history_confirmReplay', { action: t(ACTION_LABEL_KEYS[confirmReplay.action]), name: confirmReplay.packageName ?? '' })\n }\n onConfirm={async () => {\n const entry = confirmReplay;\n setConfirmReplay(null);\n let args: string[];\n switch (entry.action) {\n case 'install': args = ['install', entry.packageName!]; break;\n case 'uninstall': args = ['uninstall', entry.packageName!]; break;\n case 'upgrade': args = ['upgrade', entry.packageName!]; break;\n case 'upgrade-all': args = ['upgrade']; break;\n }\n await stream.run(args);\n void fetchHistory();\n }}\n onCancel={() => setConfirmReplay(null)}\n />\n )}\n\n {(stream.isRunning || stream.lines.length > 0) && (\n <Box marginY={SPACING.xs}>\n <ProgressLog\n lines={stream.lines}\n isRunning={stream.isRunning}\n title={t('hint_replay')}\n maxVisible={streamRows}\n />\n </Box>\n )}\n\n {filtered.length === 0 && !confirmClear && (\n <Text color={COLORS.textSecondary} italic>\n {filter !== 'all' ? t('history_noEntriesFor', { filter }) : t('history_noEntries')}\n </Text>\n )}\n\n {filtered.length > 0 && !confirmClear && (\n <Box flexDirection=\"column\">\n {start > 0 && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreAbove', { count: start })}</Text>\n )}\n {visible.map((entry, i) => {\n const idx = start + i;\n const isCurrent = idx === cursor;\n const { icon, color } = ACTION_ICONS[entry.action];\n const ts = new Date(entry.timestamp).getTime() / 1000;\n\n return (\n <SelectableRow key={entry.id} isCurrent={isCurrent}>\n <Text color={color} bold>{icon}</Text>\n {/* Action label: fixed-width cell with truncate, instead of\n `padEnd(12)` which only worked when the localised label\n happened to fit. Spanish \"instalación\" / \"desinstalación\"\n bust the old hardcoded width. */}\n <Box width={14} flexShrink={1} minWidth={0}>\n <Text bold={isCurrent} inverse={isCurrent} color={isCurrent ? COLORS.text : COLORS.muted} wrap=\"truncate\">\n {t(ACTION_LABEL_KEYS[entry.action])}\n </Text>\n </Box>\n {/* Package name takes the remaining space and truncates middle\n to preserve @version suffixes. */}\n <Box flexGrow={1} flexShrink={1} minWidth={0}>\n <Text color={COLORS.text} wrap=\"truncate-middle\">{entry.packageName ?? t('history_all')}</Text>\n </Box>\n {entry.success\n ? <StatusBadge label={t('badge_ok')} variant=\"success\" />\n : <StatusBadge label={t('badge_fail')} variant=\"error\" />}\n <Text color={COLORS.muted}>{formatRelativeTime(ts)}</Text>\n </SelectableRow>\n );\n })}\n {start + MAX_VISIBLE_ROWS < filtered.length && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreBelow', { count: filtered.length - start - MAX_VISIBLE_ROWS })}</Text>\n )}\n\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.text} bold>\n {cursor + 1}/{filtered.length}\n </Text>\n </Box>\n </Box>\n )}\n </Box>\n );\n}\n","import { create } from 'zustand';\nimport type { HistoryEntry, HistoryAction } from '../lib/history/types.js';\nimport * as historyLogger from '../lib/history/history-logger.js';\nimport { useLicenseStore } from './license-store.js';\nimport { verifyPro } from '../lib/license/pro-guard.js';\n\nfunction getStrongIsPro(): boolean {\n const { license, status } = useLicenseStore.getState();\n return verifyPro(license, status);\n}\n\ninterface HistoryState {\n entries: HistoryEntry[];\n loading: boolean;\n error: string | null;\n\n fetchHistory: () => Promise<void>;\n logAction: (action: HistoryAction, packageName: string | null, success: boolean, error?: string | null) => Promise<void>;\n clearHistory: () => Promise<void>;\n}\n\nexport const useHistoryStore = create<HistoryState>((set) => ({\n entries: [],\n loading: false,\n error: null,\n\n fetchHistory: async () => {\n set({ loading: true, error: null });\n try {\n const isPro = getStrongIsPro();\n const entries = await historyLogger.loadHistory(isPro);\n set({ entries, loading: false });\n } catch (err) {\n set({ loading: false, error: err instanceof Error ? err.message : String(err) });\n }\n },\n\n logAction: async (action, packageName, success, error = null) => {\n const isPro = getStrongIsPro();\n await historyLogger.appendEntry(isPro, action, packageName, success, error);\n const entries = await historyLogger.loadHistory(isPro);\n set({ entries });\n },\n\n clearHistory: async () => {\n const isPro = getStrongIsPro();\n await historyLogger.clearHistory(isPro);\n set({ entries: [] });\n },\n}));\n","import React, { useEffect, useState } from 'react';\nimport { Box, Text } from 'ink';\nimport { useViewInput } from '../hooks/use-view-input.js';\nimport { useSecurityStore } from '../stores/security-store.js';\nimport { useNavigationStore } from '../stores/navigation-store.js';\nimport { useBrewStream } from '../hooks/use-brew-stream.js';\nimport { Loading, ErrorMessage } from '../components/common/loading.js';\nimport { StatCard } from '../components/common/stat-card.js';\nimport { StatusBadge } from '../components/common/status-badge.js';\nimport { ConfirmDialog } from '../components/common/confirm-dialog.js';\nimport { ProgressLog } from '../components/common/progress-log.js';\nimport { ResultBanner } from '../components/common/result-banner.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { COLORS } from '../utils/colors.js';\nimport { SelectableRow } from '../components/common/selectable-row.js';\nimport { GRADIENTS } from '../utils/gradient.js';\nimport { t, tp } from '../i18n/index.js';\nimport { formatRelativeTime } from '../utils/format.js';\nimport type { Severity } from '../lib/security/types.js';\nimport { SPACING } from '../utils/spacing.js';\n\nconst SEVERITY_COLORS: Record<Severity, string> = {\n CRITICAL: COLORS.error,\n HIGH: COLORS.error,\n MEDIUM: COLORS.warning,\n LOW: COLORS.textSecondary,\n UNKNOWN: COLORS.textSecondary,\n};\n\nconst SEVERITY_BADGE: Record<Severity, 'error' | 'warning' | 'muted'> = {\n CRITICAL: 'error',\n HIGH: 'error',\n MEDIUM: 'warning',\n LOW: 'muted',\n UNKNOWN: 'muted',\n};\n\n// SCR-017: Detect network-related errors\nfunction isNetworkError(msg: string): boolean {\n return /fetch failed|ECONNREFUSED|ENOTFOUND|ETIMEDOUT|network|abort/i.test(msg);\n}\n\nexport function SecurityAuditView() {\n const { summary, loading, error, scan, cachedAt } = useSecurityStore();\n const navigate = useNavigationStore((s) => s.navigate);\n const [cursor, setCursor] = useState(0);\n const [expandedPkg, setExpandedPkg] = useState<string | null>(null);\n const [confirmUpgrade, setConfirmUpgrade] = useState<string | null>(null);\n const stream = useBrewStream();\n\n useEffect(() => { scan(); }, []);\n\n const results = summary?.results ?? [];\n\n useViewInput((input, key) => {\n if (confirmUpgrade || stream.isRunning) return;\n\n // ARQ-005: Manual refresh forces cache invalidation\n if (input === 'r' || input === '1') { void scan(true); return; }\n // Navigate to rollback view (capital R to avoid conflict with rescan)\n if (input === 'R') { navigate('rollback'); return; }\n if ((input === 'u' || input === '2') && results[cursor]) {\n setConfirmUpgrade(results[cursor].packageName);\n return;\n }\n\n if (input === 'j' || key.downArrow) setCursor((c) => Math.min(c + 1, Math.max(0, results.length - 1)));\n else if (input === 'k' || key.upArrow) setCursor((c) => Math.max(c - 1, 0));\n else if (key.return && results[cursor]) {\n setExpandedPkg(expandedPkg === results[cursor].packageName ? null : results[cursor].packageName);\n }\n });\n\n if (loading) return <Loading message={t('loading_security')} />;\n\n // SCR-017: Show user-friendly message for network errors\n if (error) {\n const displayError = isNetworkError(error) ? t('security_networkError') : error;\n return <ErrorMessage message={displayError} />;\n }\n\n // ARQ-005: Show cache indicator\n const cacheAge = cachedAt ? formatRelativeTime(cachedAt / 1000) : null;\n\n return (\n <Box flexDirection=\"column\">\n <SectionHeader emoji={'\\u{1F6E1}\\uFE0F'} title={t('security_title')} gradient={GRADIENTS.ocean} />\n\n {summary && (\n <Box gap={SPACING.xs} marginY={SPACING.xs}>\n <StatCard label={t('security_scanned')} value={summary.totalPackages} color={COLORS.info} />\n <StatCard\n label={t('security_vulnerable')}\n value={summary.vulnerablePackages}\n color={summary.vulnerablePackages > 0 ? COLORS.error : COLORS.success}\n />\n {summary.criticalCount > 0 && <StatCard label={t('security_critical')} value={summary.criticalCount} color={COLORS.error} />}\n {summary.highCount > 0 && <StatCard label={t('security_high')} value={summary.highCount} color={COLORS.error} />}\n {summary.mediumCount > 0 && <StatCard label={t('security_medium')} value={summary.mediumCount} color={COLORS.warning} />}\n </Box>\n )}\n\n {/* ARQ-005: Cache indicator */}\n {cacheAge && (\n <Text color={COLORS.muted}>{t('security_cachedResults', { time: cacheAge })}</Text>\n )}\n\n {/* UI-014: be honest about coverage \\u2014 OSV's Bitnami dataset does not\n map every Homebrew formula, so \"0 CVEs\" is not the same as \"safe\". */}\n {summary && (\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.textSecondary} italic>{t('security_coverage_warning')}</Text>\n </Box>\n )}\n\n {results.length === 0 && summary && (\n <Box marginTop={SPACING.xs}>\n <ResultBanner status=\"success\" message={`\\u2714 ${t('security_noVulns')}`} />\n </Box>\n )}\n\n {confirmUpgrade && (\n <Box marginY={SPACING.xs}>\n <ConfirmDialog\n message={t('security_confirmUpgrade', { name: confirmUpgrade })}\n onConfirm={async () => {\n const name = confirmUpgrade;\n setConfirmUpgrade(null);\n await stream.run(['upgrade', name]);\n void scan(true);\n }}\n onCancel={() => setConfirmUpgrade(null)}\n />\n </Box>\n )}\n\n {(stream.isRunning || stream.lines.length > 0) && (\n <Box marginY={SPACING.xs}>\n <ProgressLog lines={stream.lines} isRunning={stream.isRunning} title={t('hint_upgrade')} />\n </Box>\n )}\n\n {results.length > 0 && (\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n {results.map((pkg, i) => {\n const isCurrent = i === cursor;\n const isExpanded = expandedPkg === pkg.packageName;\n\n return (\n <Box key={pkg.packageName} flexDirection=\"column\">\n <SelectableRow isCurrent={isCurrent}>\n <StatusBadge label={pkg.maxSeverity} variant={SEVERITY_BADGE[pkg.maxSeverity]} />\n <Text bold={isCurrent} inverse={isCurrent} color={isCurrent ? COLORS.text : COLORS.muted}>\n {pkg.packageName}\n </Text>\n <Text color={COLORS.muted}>{pkg.installedVersion}</Text>\n <Text color={COLORS.muted}>{tp('plural_vulns', pkg.vulnerabilities.length)}</Text>\n {pkg.vulnerabilities.some((v) => v.fixedVersion) && (\n <Text color={COLORS.textSecondary}>[R:{t('hint_rollback')}]</Text>\n )}\n <Text color={COLORS.muted}>{isExpanded ? '\\u25BC' : '\\u25B6'}</Text>\n </SelectableRow>\n\n {isExpanded && (\n <Box flexDirection=\"column\" paddingLeft={SPACING.lg} marginBottom={SPACING.xs}>\n {pkg.vulnerabilities.map((vuln) => (\n <Box key={vuln.id} flexDirection=\"column\" marginBottom={SPACING.xs}>\n <Box gap={SPACING.xs}>\n <Text color={SEVERITY_COLORS[vuln.severity]} bold>{vuln.id}</Text>\n <Text color={COLORS.muted}>[{vuln.severity}]</Text>\n </Box>\n <Text color={COLORS.muted} wrap=\"wrap\">{vuln.summary}</Text>\n {vuln.fixedVersion && (\n <Text color={COLORS.success}>{t('security_fixedIn', { version: vuln.fixedVersion })}</Text>\n )}\n </Box>\n ))}\n </Box>\n )}\n </Box>\n );\n })}\n\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.text} bold>\n {cursor + 1}/{results.length}\n </Text>\n </Box>\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.textSecondary}>{t('security_rollback_hint')}</Text>\n </Box>\n </Box>\n )}\n </Box>\n );\n}\n","import React, { useState } from 'react';\nimport { Box, Text } from 'ink';\nimport { useViewInput } from '../hooks/use-view-input.js';\nimport { TextInput } from '@inkjs/ui';\nimport { useLicenseStore } from '../stores/license-store.js';\nimport { ConfirmDialog } from '../components/common/confirm-dialog.js';\nimport { Loading } from '../components/common/loading.js';\nimport { ResultBanner } from '../components/common/result-banner.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { COLORS } from '../utils/colors.js';\nimport { GRADIENTS } from '../utils/gradient.js';\nimport { t } from '../i18n/index.js';\nimport { formatDate } from '../utils/format.js';\nimport { redeemPromoCode } from '../lib/license/promo.js';\nimport { SPACING } from '../utils/spacing.js';\n\nexport function AccountView() {\n const { status, license, deactivate, revalidate, degradation } = useLicenseStore();\n const [confirmDeactivate, setConfirmDeactivate] = useState(false);\n const [deactivating, setDeactivating] = useState(false);\n const [deactivateError, setDeactivateError] = useState<string | null>(null);\n const [promoMode, setPromoMode] = useState(false);\n const [promoLoading, setPromoLoading] = useState(false);\n const [promoResult, setPromoResult] = useState<{ success: boolean; message: string } | null>(null);\n const [revalidating, setRevalidating] = useState(false);\n\n useViewInput((input, key) => {\n if (confirmDeactivate || deactivating || promoMode || revalidating) {\n if (key.escape && promoMode) {\n setPromoMode(false);\n setPromoResult(null);\n }\n return;\n }\n\n if ((input === 'd' || input === '2') && (status === 'pro' || status === 'team')) {\n setConfirmDeactivate(true);\n }\n if (input === 'p' || input === '1') {\n setPromoMode(true);\n setPromoResult(null);\n }\n if ((input === 'v' || input === 'V') && (status === 'pro' || status === 'team' || status === 'expired')) {\n setRevalidating(true);\n void revalidate().finally(() => setRevalidating(false));\n }\n });\n\n const maskKey = (key: string) => {\n if (key.length <= 8) return key;\n return key.slice(0, 4) + '-****-****-' + key.slice(-4);\n };\n\n if (status === 'validating') {\n return <Loading message={t('account_loading')} />;\n }\n\n return (\n <Box flexDirection=\"column\">\n <SectionHeader emoji={'\\u{1F464}'} title={t('account_title')} gradient={GRADIENTS.gold} />\n\n {confirmDeactivate && (\n <Box marginY={SPACING.xs}>\n <ConfirmDialog\n message={t('account_confirmDeactivate')}\n onConfirm={async () => {\n setConfirmDeactivate(false);\n setDeactivating(true);\n setDeactivateError(null);\n try {\n await deactivate();\n } catch (err) {\n // SCR-007: Display deactivation errors\n setDeactivateError(t('deactivate_failed') + ': ' + String(err));\n } finally {\n setDeactivating(false);\n }\n }}\n onCancel={() => setConfirmDeactivate(false)}\n />\n </Box>\n )}\n\n <Box flexDirection=\"column\" marginTop={SPACING.xs} paddingLeft={SPACING.sm}>\n <Box gap={SPACING.xs}>\n <Text color={COLORS.muted}>{t('account_statusLabel')}</Text>\n {status === 'pro' && <Text color={COLORS.success} bold>{t('account_pro')}</Text>}\n {status === 'team' && <Text color={COLORS.success} bold>{t('account_team')}</Text>}\n {status === 'free' && <Text color={COLORS.muted}>{t('account_free')}</Text>}\n {status === 'expired' && <Text color={COLORS.error}>{t('account_expired')}</Text>}\n </Box>\n\n {(degradation === 'warning' || degradation === 'limited') && license && (\n <Box marginTop={SPACING.xs} borderStyle=\"round\" borderColor={COLORS.warning} paddingX={SPACING.sm} paddingY={SPACING.none}>\n <Text color={COLORS.warning}>\n {t('license_offlineWarning', {\n days: Math.floor((Date.now() - new Date(license.lastValidatedAt).getTime()) / (24 * 60 * 60 * 1000)),\n })}\n </Text>\n </Box>\n )}\n\n {license && (\n <>\n <Box gap={SPACING.xs}>\n <Text color={COLORS.muted}>{t('account_emailLabel')}</Text>\n <Text>{license.customerEmail}</Text>\n </Box>\n <Box gap={SPACING.xs}>\n <Text color={COLORS.muted}>{t('account_nameLabel')}</Text>\n <Text>{license.customerName}</Text>\n </Box>\n <Box gap={SPACING.xs}>\n <Text color={COLORS.muted}>{t('account_planLabel')}</Text>\n <Text color={COLORS.success} bold>Pro</Text>\n </Box>\n <Box gap={SPACING.xs}>\n <Text color={COLORS.muted}>{t('account_keyLabel')}</Text>\n <Text>{maskKey(license.key)}</Text>\n </Box>\n {license.expiresAt && (\n <Box gap={SPACING.xs}>\n <Text color={COLORS.muted}>{t('account_expiresLabel')}</Text>\n <Text>{formatDate(license.expiresAt)}</Text>\n </Box>\n )}\n <Box gap={SPACING.xs}>\n <Text color={COLORS.muted}>{t('account_activatedLabel')}</Text>\n <Text>{formatDate(license.activatedAt)}</Text>\n </Box>\n </>\n )}\n\n {status === 'free' && (\n <Box flexDirection=\"column\" marginTop={SPACING.xs} borderStyle=\"round\" borderColor={COLORS.brand} paddingX={SPACING.sm} paddingY={SPACING.none} flexShrink={1}>\n <Text bold color={COLORS.brand}>{'\\u2B50'} {t('account_upgradeTitle')}</Text>\n <Text wrap=\"wrap\">{t('account_unlockDesc')}</Text>\n <Text color={COLORS.info} bold>{t('account_pricing')}</Text>\n <Text color={COLORS.muted}>{t('upgrade_buyAt')} <Text color={COLORS.sky} bold>{t('upgrade_buyUrl')}</Text></Text>\n <Text color={COLORS.muted}>{t('account_runActivate')} <Text color={COLORS.success} bold>{t('account_activateCmd')}</Text></Text>\n </Box>\n )}\n\n {status === 'expired' && (\n <Box marginTop={SPACING.xs}>\n <Box borderStyle=\"round\" borderColor={COLORS.error} paddingX={SPACING.sm} paddingY={SPACING.none}>\n <Text color={COLORS.error}>{t('account_licenseExpired')}</Text>\n </Box>\n </Box>\n )}\n\n {deactivating && <Text color={COLORS.sky}>{t('account_deactivating')}</Text>}\n {deactivateError && <Text color={COLORS.error}>{deactivateError}</Text>}\n </Box>\n\n {/* Promo code section */}\n <Box flexDirection=\"column\" marginTop={SPACING.xs} paddingLeft={SPACING.sm}>\n {promoMode ? (\n <Box flexDirection=\"column\" gap={SPACING.xs}>\n <Text bold color={COLORS.gold}>{t('account_promoTitle')}</Text>\n {promoLoading ? (\n <Text color={COLORS.sky}>{t('account_promoValidating')}</Text>\n ) : (\n <Box gap={SPACING.xs}>\n <Text color={COLORS.muted}>{t('account_promoLabel')}</Text>\n <TextInput\n defaultValue=\"\"\n placeholder=\"BREW-XXXX-XXXX\"\n onSubmit={async (value: string) => {\n if (!value.trim()) return;\n setPromoLoading(true);\n try {\n const result = await redeemPromoCode(value);\n if (result.success) {\n setPromoResult({ success: true, message: t('account_promoSuccess', { expires: formatDate(result.expiresAt!) }) });\n } else {\n setPromoResult({ success: false, message: result.error ?? t('account_promoInvalid') });\n }\n } catch {\n setPromoResult({ success: false, message: t('account_promoError') });\n } finally {\n setPromoLoading(false);\n }\n }}\n />\n </Box>\n )}\n {promoResult && (\n <ResultBanner status={promoResult.success ? 'success' : 'error'} message={promoResult.message} />\n )}\n <Text color={COLORS.textSecondary} dimColor>{t('account_promoEsc')}</Text>\n </Box>\n ) : (\n <Text color={COLORS.textSecondary}>{t('account_promoHint')}</Text>\n )}\n </Box>\n\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.textSecondary}>\n {(status === 'pro' || status === 'team') ? `d ${t('hint_deactivate')} ` : ''}\n {(status === 'pro' || status === 'team' || status === 'expired')\n ? `v ${t('hint_revalidate')} `\n : ''}\n {revalidating ? t('account_revalidating') : ''}\n {' '}{t('app_version', { version: process.env.APP_VERSION ?? '0.1.0' })}\n </Text>\n </Box>\n </Box>\n );\n}\n","import { readFile, writeFile, rename } from 'node:fs/promises';\nimport { randomBytes, randomUUID } from 'node:crypto';\nimport { join } from 'node:path';\nimport { DATA_DIR, ensureDataDirs, getMachineId } from '../data-dir.js';\n// BK-003: usar fetchWithRetry — un 5xx transitorio o un 429 en validate/redeem\n// invalidaba antes el canje sin reintento. La capa de retry ya respeta\n// Retry-After y backoff exponencial.\nimport { fetchWithRetry } from '../fetch-timeout.js';\nimport { logger } from '../../utils/logger.js';\n\nconst PROMO_PATH = join(DATA_DIR, 'promo.json');\n\n// Promo API endpoint (self-hosted or Polar webhook)\nconst PROMO_API_URL = 'https://api.molinesdesigns.com/api/promo';\n\n// BK-015: validate the promo URL before fetch — same defensive guardrail\n// the polar-api.ts path has had since SEG-001. Reject any non-HTTPS or any\n// host that isn't on the molinesdesigns.com domain.\nfunction validatePromoApiUrl(url: string): void {\n const parsed = new URL(url);\n if (parsed.protocol !== 'https:') {\n throw new Error('HTTPS required for promo API');\n }\n if (!parsed.hostname.endsWith('molinesdesigns.com')) {\n throw new Error('Invalid promo API host');\n }\n}\n\nexport interface PromoCode {\n code: string;\n type: 'trial' | 'discount' | 'full';\n durationDays: number;\n maxRedemptions: number;\n currentRedemptions: number;\n createdAt: string;\n expiresAt: string | null;\n active: boolean;\n}\n\ninterface PromoRedemption {\n code: string;\n redeemedAt: string;\n expiresAt: string;\n type: 'trial' | 'discount' | 'full';\n}\n\ninterface PromoFile {\n version: 1;\n redemptions: PromoRedemption[];\n}\n\n// ── Generate promo codes (admin/CLI use) ──\n\nexport function generatePromoCode(prefix = 'BREW'): string {\n const random = randomBytes(4).toString('hex').toUpperCase();\n return `${prefix}-${random.slice(0, 4)}-${random.slice(4, 8)}`;\n}\n\nexport function generatePromoBatch(count: number, options: {\n type: 'trial' | 'discount' | 'full';\n durationDays: number;\n maxRedemptions: number;\n expiresAt?: string | null;\n prefix?: string;\n}): PromoCode[] {\n const codes: PromoCode[] = [];\n for (let i = 0; i < count; i++) {\n codes.push({\n code: generatePromoCode(options.prefix),\n type: options.type,\n durationDays: options.durationDays,\n maxRedemptions: options.maxRedemptions,\n currentRedemptions: 0,\n createdAt: new Date().toISOString(),\n expiresAt: options.expiresAt ?? null,\n active: true,\n });\n }\n return codes;\n}\n\n// ── Validate promo code against API ──\n\nexport async function validatePromoCode(code: string): Promise<{\n valid: boolean;\n type?: 'trial' | 'discount' | 'full';\n durationDays?: number;\n error?: string;\n}> {\n const normalized = code.trim().toUpperCase();\n if (!normalized || normalized.length < 8) {\n return { valid: false, error: 'Invalid promo code format' };\n }\n\n validatePromoApiUrl(`${PROMO_API_URL}/validate`);\n try {\n const res = await fetchWithRetry(`${PROMO_API_URL}/validate`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ code: normalized }),\n }, 10_000);\n\n if (!res.ok) {\n const body = await res.json().catch(() => ({})) as { error?: string };\n return { valid: false, error: body.error ?? 'Invalid or expired promo code' };\n }\n\n const data = await res.json() as unknown;\n if (\n !data || typeof data !== 'object' ||\n typeof (data as { type?: unknown }).type !== 'string' ||\n typeof (data as { durationDays?: unknown }).durationDays !== 'number'\n ) {\n return { valid: false, error: 'Unexpected promo validation response' };\n }\n const { type, durationDays } = data as { type: string; durationDays: number };\n if (type !== 'trial' && type !== 'discount' && type !== 'full') {\n return { valid: false, error: 'Unsupported promo type' };\n }\n return {\n valid: true,\n type,\n durationDays,\n };\n } catch (err) {\n logger.error('Promo validation failed', { error: String(err) });\n return { valid: false, error: 'Could not validate promo code. Check your connection.' };\n }\n}\n\n// ── Redeem promo code locally ──\n\nexport async function redeemPromoCode(code: string): Promise<{\n success: boolean;\n expiresAt?: string;\n error?: string;\n}> {\n const normalized = code.trim().toUpperCase();\n const machineId = await getMachineId();\n\n // Call backend to validate + redeem in one step\n validatePromoApiUrl(`${PROMO_API_URL}/redeem`);\n let serverExpiresAt: string;\n let serverType: 'trial' | 'discount' | 'full';\n // EP-002: idempotency key — accidental double-clicks or retries on a flaky\n // network must not consume the promo twice. The backend dedupes on this.\n const idempotencyKey = randomUUID();\n try {\n const res = await fetchWithRetry(`${PROMO_API_URL}/redeem`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Idempotency-Key': idempotencyKey,\n },\n body: JSON.stringify({ code: normalized, machineId, idempotencyKey }),\n }, 10_000);\n\n if (!res.ok) {\n const body = await res.json().catch(() => ({})) as { error?: string };\n return { success: false, error: body.error ?? 'Invalid or expired promo code' };\n }\n\n const data = await res.json() as unknown;\n const inner = (data as { data?: unknown })?.data;\n if (\n !inner || typeof inner !== 'object' ||\n typeof (inner as { expiresAt?: unknown }).expiresAt !== 'string' ||\n typeof (inner as { type?: unknown }).type !== 'string'\n ) {\n return { success: false, error: 'Unexpected promo redeem response' };\n }\n const expiresAt = (inner as { expiresAt: string }).expiresAt;\n const type = (inner as { type: string }).type;\n if (type !== 'trial' && type !== 'discount' && type !== 'full') {\n return { success: false, error: 'Unsupported promo type' };\n }\n serverExpiresAt = expiresAt;\n serverType = type;\n } catch (err) {\n logger.error('Promo redeem failed', { error: String(err) });\n return { success: false, error: 'Could not reach promo server. Check your connection.' };\n }\n\n // Save locally as well\n await ensureDataDirs();\n\n const redemption: PromoRedemption = {\n code: normalized,\n redeemedAt: new Date().toISOString(),\n expiresAt: serverExpiresAt,\n type: serverType,\n };\n\n let file: PromoFile = { version: 1, redemptions: [] };\n try {\n const raw = await readFile(PROMO_PATH, 'utf-8');\n file = JSON.parse(raw) as PromoFile;\n } catch { /* no existing file */ }\n\n // Check for duplicate redemption\n if (file.redemptions.some((r) => r.code === redemption.code)) {\n return { success: false, error: 'This promo code has already been redeemed' };\n }\n\n file.redemptions.push(redemption);\n\n // Atomic write\n const tmpPath = PROMO_PATH + '.tmp';\n await writeFile(tmpPath, JSON.stringify(file, null, 2), { encoding: 'utf-8', mode: 0o600 });\n await rename(tmpPath, PROMO_PATH);\n\n return { success: true, expiresAt: redemption.expiresAt };\n}\n\n// ── Check if an active promo is in effect ──\n\nexport async function getActivePromo(): Promise<PromoRedemption | null> {\n try {\n const raw = await readFile(PROMO_PATH, 'utf-8');\n const file = JSON.parse(raw) as PromoFile;\n const now = Date.now();\n\n // Find the most recent non-expired redemption\n const active = file.redemptions\n .filter((r) => new Date(r.expiresAt).getTime() > now)\n .sort((a, b) => new Date(b.expiresAt).getTime() - new Date(a.expiresAt).getTime())[0];\n\n return active ?? null;\n } catch {\n return null;\n }\n}\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { Box, Text } from 'ink';\nimport { useViewInput } from '../hooks/use-view-input.js';\nimport { useRollbackStore } from '../stores/rollback-store.js';\nimport { useLicenseStore } from '../stores/license-store.js';\nimport { executeRollbackPlan } from '../lib/rollback/rollback-engine.js';\nimport { Loading, ErrorMessage } from '../components/common/loading.js';\nimport { ConfirmDialog } from '../components/common/confirm-dialog.js';\nimport { ProgressLog } from '../components/common/progress-log.js';\nimport { ResultBanner } from '../components/common/result-banner.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { SelectableRow } from '../components/common/selectable-row.js';\nimport { COLORS } from '../utils/colors.js';\nimport { GRADIENTS } from '../utils/gradient.js';\nimport { t, tp } from '../i18n/index.js';\nimport type { RollbackAction, RollbackPlan } from '../lib/rollback/types.js';\nimport { SPACING } from '../utils/spacing.js';\nimport { useVisibleRows } from '../hooks/use-visible-rows.js';\n\ntype Phase = 'list' | 'plan' | 'confirm' | 'executing' | 'result';\n\nfunction strategyLabel(action: RollbackAction): string {\n switch (action.strategy) {\n case 'versioned-formula': return t('rollback_strategy_versioned');\n case 'bottle-cache': return t('rollback_strategy_bottle');\n case 'pin-only': return t('rollback_strategy_pin');\n case 'unavailable': return t('rollback_strategy_unavailable');\n }\n}\n\nfunction actionColor(action: RollbackAction): string {\n if (action.strategy === 'unavailable') return COLORS.muted;\n if (action.action === 'remove') return COLORS.muted;\n if (action.action === 'downgrade') return COLORS.warning;\n if (action.action === 'install') return COLORS.success;\n return COLORS.info;\n}\n\nfunction actionPrefix(action: RollbackAction): string {\n if (action.strategy === 'unavailable' || action.action === 'remove') return '⊗';\n if (action.strategy === 'pin-only') return '📌';\n if (action.action === 'downgrade') return '⬇';\n return '⬆';\n}\n\nfunction PlanView({ plan }: { plan: RollbackPlan }) {\n const executableCount = plan.actions.filter((a) => a.strategy !== 'unavailable' && a.action !== 'remove').length;\n // Reserve title + label row + hint row + warning rows (cap 3).\n const reservedForWarnings = Math.min(plan.warnings.length, 3) * 2;\n const actionsBudget = useVisibleRows({\n reservedRows: 6 + reservedForWarnings,\n fallbackReservedRows: 14 + reservedForWarnings,\n minRows: 2,\n });\n const visibleActions = plan.actions.slice(0, actionsBudget);\n const hiddenActions = plan.actions.length - visibleActions.length;\n\n return (\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n <Box marginBottom={SPACING.xs}>\n <Text color={COLORS.text} bold>{plan.snapshotLabel} </Text>\n <Text color={COLORS.textSecondary}>{plan.snapshotDate}</Text>\n </Box>\n\n {plan.actions.length === 0 && (\n <ResultBanner status=\"success\" message={t('rollback_diff_empty')} />\n )}\n\n {visibleActions.map((a) => (\n <Box key={a.packageName + a.action}>\n <Text color={actionColor(a)}>{actionPrefix(a)} </Text>\n <Text color={actionColor(a)} bold>{a.packageName}</Text>\n {a.fromVersion !== '' && a.toVersion !== '' && (\n <Text color={COLORS.textSecondary}>{' '}{a.fromVersion} → {a.toVersion}</Text>\n )}\n {a.fromVersion === '' && a.toVersion !== '' && (\n <Text color={COLORS.textSecondary}> install {a.toVersion}</Text>\n )}\n {a.fromVersion !== '' && a.toVersion === '' && (\n <Text color={COLORS.textSecondary}> remove</Text>\n )}\n <Text color={COLORS.muted} dimColor> [{strategyLabel(a)}]</Text>\n </Box>\n ))}\n {hiddenActions > 0 && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreBelow', { count: hiddenActions })}</Text>\n )}\n\n {plan.warnings.slice(0, 3).map((w) => (\n <Box key={w} marginTop={SPACING.xs}>\n <Text color={COLORS.warning} wrap=\"wrap\">⚠ {w}</Text>\n </Box>\n ))}\n {plan.warnings.length > 3 && (\n <Text color={COLORS.textSecondary} dimColor> {t('common_andMore', { count: plan.warnings.length - 3 })}</Text>\n )}\n\n <Box marginTop={SPACING.xs}>\n {plan.canExecute ? (\n <Text color={COLORS.textSecondary}>\n enter:{t('rollback_confirm', { count: String(executableCount) })} esc:{t('hint_back')}\n </Text>\n ) : (\n <Text color={COLORS.muted}>{t('rollback_strategy_unavailable')} esc:{t('hint_back')}</Text>\n )}\n </Box>\n </Box>\n );\n}\n\nexport function RollbackView() {\n const isPro = useLicenseStore((s) => s.isPro);\n const { snapshots, loading, error, plan, planLoading, planError, fetchSnapshots, selectSnapshot, clearPlan } = useRollbackStore();\n\n const [cursor, setCursor] = useState(0);\n const [phase, setPhase] = useState<Phase>('list');\n const [streamLines, setStreamLines] = useState<string[]>([]);\n const [streamRunning, setStreamRunning] = useState(false);\n const [streamError, setStreamError] = useState<string | null>(null);\n const generatorRef = useRef<AsyncGenerator<string> | null>(null);\n const mountedRef = useRef(true);\n const snapshotRows = useVisibleRows({\n reservedRows: 6,\n fallbackReservedRows: 14,\n minRows: 1,\n });\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n void generatorRef.current?.return(undefined);\n };\n }, []);\n\n useEffect(() => { void fetchSnapshots(isPro()); }, []);\n\n const runRollback = useCallback(async (p: RollbackPlan) => {\n setPhase('executing');\n setStreamLines([]);\n setStreamError(null);\n setStreamRunning(true);\n\n const gen = executeRollbackPlan(p, isPro());\n generatorRef.current = gen;\n\n try {\n for await (const line of gen) {\n if (!mountedRef.current) break;\n setStreamLines((prev) => [...prev.slice(-99), line]);\n }\n } catch (err) {\n if (mountedRef.current) {\n setStreamError(err instanceof Error ? err.message : String(err));\n }\n } finally {\n generatorRef.current = null;\n if (mountedRef.current) {\n setStreamRunning(false);\n setPhase('result');\n }\n }\n }, [isPro]);\n\n useViewInput((input, key) => {\n if (phase === 'executing') return;\n\n if (phase === 'result') {\n if (key.escape || input === 'r') {\n setPhase('list');\n clearPlan();\n void fetchSnapshots(isPro());\n }\n return;\n }\n\n if (phase === 'confirm') return;\n\n if (phase === 'plan') {\n if (key.escape) { clearPlan(); setPhase('list'); return; }\n if (key.return && plan?.canExecute) { setPhase('confirm'); }\n return;\n }\n\n // phase === 'list'\n if (input === 'j' || key.downArrow) {\n setCursor((c) => Math.min(c + 1, Math.max(0, snapshots.length - 1)));\n } else if (input === 'k' || key.upArrow) {\n setCursor((c) => Math.max(c - 1, 0));\n } else if (key.return && snapshots[cursor]) {\n void selectSnapshot(snapshots[cursor]!, isPro());\n setPhase('plan');\n } else if (input === 'r' || input === '1') {\n void fetchSnapshots(isPro());\n }\n });\n\n if (loading) return <Loading message={t('rollback_select_snapshot')} />;\n if (error) return <ErrorMessage message={error} />;\n\n if (phase === 'executing') {\n return (\n <Box flexDirection=\"column\">\n <ProgressLog lines={streamLines} isRunning={streamRunning} title={t('rollback_executing')} />\n {/* UX-001: indicar explicitamente que Esc esta suprimido durante la\n ejecucion para que el usuario no piense que la app se colgo. */}\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.warning}>{t('rollback_executing_no_cancel')}</Text>\n </Box>\n </Box>\n );\n }\n\n if (phase === 'result') {\n return (\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n <ResultBanner\n status={streamError ? 'error' : 'success'}\n message={streamError ? t('rollback_error', { error: streamError }) : t('rollback_success')}\n />\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.textSecondary}>r:{t('hint_refresh')} esc:{t('hint_back')}</Text>\n </Box>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\">\n <SectionHeader emoji=\"⏪\" title={t('rollback_title')} gradient={GRADIENTS.gold} />\n\n {snapshots.length === 0 && (\n <Box marginTop={SPACING.xs}>\n <ResultBanner status=\"info\" message={t('rollback_no_snapshots')} />\n </Box>\n )}\n\n {phase === 'list' && snapshots.length > 0 && (() => {\n const start = Math.max(0, cursor - Math.floor(snapshotRows / 2));\n const visible = snapshots.slice(start, start + snapshotRows);\n return (\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n <Text color={COLORS.textSecondary} dimColor>{t('rollback_select_snapshot')}</Text>\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n {start > 0 && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreAbove', { count: start })}</Text>\n )}\n {visible.map((s, vi) => {\n const i = start + vi;\n return (\n <SelectableRow key={s.capturedAt} isCurrent={i === cursor}>\n <Text bold={i === cursor} color={i === cursor ? COLORS.text : COLORS.muted}>\n {s.label ?? t('rollback_snapshot_auto')}\n </Text>\n <Text color={COLORS.textSecondary}>\n {' — '}{new Date(s.capturedAt).toLocaleString()}\n </Text>\n <Text color={COLORS.muted} dimColor>\n {' '}({tp('packages', s.formulae.length + s.casks.length)})\n </Text>\n </SelectableRow>\n );\n })}\n {start + snapshotRows < snapshots.length && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreBelow', { count: snapshots.length - start - snapshotRows })}</Text>\n )}\n </Box>\n </Box>\n );\n })()}\n\n {phase === 'plan' && (\n <Box flexDirection=\"column\">\n {planLoading && <Loading message={t('rollback_capturing')} />}\n {planError && <ErrorMessage message={planError} />}\n {plan && !planLoading && <PlanView plan={plan} />}\n </Box>\n )}\n\n {phase === 'confirm' && plan && (\n <Box marginTop={SPACING.xs}>\n <ConfirmDialog\n message={t('rollback_confirm', {\n count: String(plan.actions.filter((a) => a.strategy !== 'unavailable' && a.action !== 'remove').length),\n })}\n onConfirm={() => void runRollback(plan)}\n onCancel={() => setPhase('plan')}\n />\n </Box>\n )}\n </Box>\n );\n}\n","import { create } from 'zustand';\nimport type { BrewSnapshot } from '../lib/state-snapshot/snapshot.js';\nimport { loadSnapshots, buildRollbackPlan } from '../lib/rollback/rollback-engine.js';\nimport type { RollbackPlan } from '../lib/rollback/types.js';\n\ninterface RollbackState {\n snapshots: BrewSnapshot[];\n loading: boolean;\n error: string | null;\n selectedSnapshot: BrewSnapshot | null;\n plan: RollbackPlan | null;\n planLoading: boolean;\n planError: string | null;\n\n fetchSnapshots: (isPro: boolean) => Promise<void>;\n selectSnapshot: (s: BrewSnapshot | null, isPro: boolean) => Promise<void>;\n clearPlan: () => void;\n}\n\nexport const useRollbackStore = create<RollbackState>((set) => ({\n snapshots: [],\n loading: false,\n error: null,\n selectedSnapshot: null,\n plan: null,\n planLoading: false,\n planError: null,\n\n fetchSnapshots: async (isPro) => {\n if (!isPro) return;\n set({ loading: true, error: null });\n try {\n const snapshots = await loadSnapshots();\n set({ snapshots, loading: false });\n } catch (err) {\n set({ error: err instanceof Error ? err.message : String(err), loading: false });\n }\n },\n\n selectSnapshot: async (snapshot, isPro) => {\n if (!snapshot) {\n set({ selectedSnapshot: null, plan: null, planError: null });\n return;\n }\n set({ selectedSnapshot: snapshot, plan: null, planLoading: true, planError: null });\n try {\n const plan = await buildRollbackPlan(snapshot, isPro);\n set({ plan, planLoading: false });\n } catch (err) {\n set({ planError: err instanceof Error ? err.message : String(err), planLoading: false });\n }\n },\n\n clearPlan: () => set({ selectedSnapshot: null, plan: null, planError: null }),\n}));\n","import { readdir } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { captureSnapshot, loadSnapshots, saveSnapshot } from '../state-snapshot/snapshot.js';\nimport type { BrewSnapshot } from '../state-snapshot/snapshot.js';\nimport { diffSnapshots } from '../diff-engine/diff.js';\nimport { execBrew, streamBrew } from '../brew-cli.js';\nimport { validatePackageName } from '../brew-api.js';\nimport { logger } from '../../utils/logger.js';\nimport type { RollbackAction, RollbackPlan, RollbackStrategy } from './types.js';\n\nasync function detectStrategy(\n name: string,\n targetVersion: string,\n packageType: 'formula' | 'cask',\n): Promise<{ strategy: RollbackStrategy; versionedFormula?: string }> {\n // Casks cannot be restored to a specific version\n if (packageType === 'cask') {\n return { strategy: 'pin-only' };\n }\n\n // Try versioned formula (e.g. node@20)\n try {\n const major = targetVersion.split('.')[0] ?? '';\n if (major !== '' && !isNaN(parseInt(major, 10))) {\n const versionedFormula = `${name}@${major}`;\n await execBrew(['info', '--json=v2', versionedFormula]);\n return { strategy: 'versioned-formula', versionedFormula };\n }\n } catch {\n // Not available — fall through\n }\n\n // Try bottle cache\n try {\n const brewCache = (await execBrew(['--cache'])).trim();\n const downloadsDir = join(brewCache, 'downloads');\n const entries = await readdir(downloadsDir);\n const found = entries.some(\n (entry) => entry.includes(name) && entry.includes(targetVersion),\n );\n if (found) {\n return { strategy: 'bottle-cache' };\n }\n } catch {\n // Cache not readable — fall through\n }\n\n return { strategy: 'pin-only' };\n}\n\nexport async function buildRollbackPlan(\n snapshot: BrewSnapshot,\n isPro: boolean,\n): Promise<RollbackPlan> {\n if (!isPro) throw new Error('Pro license required');\n\n const current = await captureSnapshot();\n const diff = diffSnapshots(snapshot, current);\n\n const actions: RollbackAction[] = [];\n const warnings: string[] = [];\n\n // Packages that were upgraded (current > snapshot) → need downgrade\n for (const entry of diff.upgraded) {\n const type = entry.type;\n const { strategy, versionedFormula } = await detectStrategy(entry.name, entry.from, type);\n actions.push({\n packageName: entry.name,\n packageType: type,\n action: 'downgrade',\n fromVersion: entry.to, // current version\n toVersion: entry.from, // snapshot (target) version\n strategy,\n versionedFormula,\n });\n }\n\n // Packages that were downgraded (current < snapshot) → need to restore up\n for (const entry of diff.downgraded) {\n const type = entry.type;\n const { strategy, versionedFormula } = await detectStrategy(entry.name, entry.from, type);\n actions.push({\n packageName: entry.name,\n packageType: type,\n action: 'downgrade',\n fromVersion: entry.to, // current version\n toVersion: entry.from, // snapshot (target) version\n strategy,\n versionedFormula,\n });\n }\n\n // Packages added since snapshot (in current, not in snapshot) → would need removal\n // Security: never auto-remove. Mark as unavailable with warning.\n for (const entry of diff.added) {\n if (entry.type === 'tap') continue;\n const type = entry.type;\n actions.push({\n packageName: entry.name,\n packageType: type,\n action: 'remove',\n fromVersion: entry.version,\n toVersion: '',\n strategy: 'unavailable',\n });\n }\n\n // Packages removed since snapshot (in snapshot, not in current) → need re-install\n for (const entry of diff.removed) {\n if (entry.type === 'tap') continue;\n const type = entry.type;\n const { strategy, versionedFormula } = await detectStrategy(entry.name, entry.version, type);\n actions.push({\n packageName: entry.name,\n packageType: type,\n action: 'install',\n fromVersion: '',\n toVersion: entry.version,\n strategy,\n versionedFormula,\n });\n }\n\n // Build warnings\n const caskPinCount = actions.filter(\n (a) => a.packageType === 'cask' && a.action !== 'remove' && a.strategy === 'pin-only',\n ).length;\n if (caskPinCount > 0) {\n warnings.push(`${caskPinCount} cask(s) will be pinned only (version restoration not supported)`);\n }\n\n const canExecute = actions.some((a) => a.strategy !== 'unavailable');\n\n const snapshotLabel = snapshot.label ?? 'Auto';\n const snapshotDate = new Date(snapshot.capturedAt).toLocaleString();\n\n logger.debug('Built rollback plan', { actionCount: actions.length, canExecute });\n\n return {\n snapshotLabel,\n snapshotDate,\n actions,\n warnings,\n canExecute,\n };\n}\n\nexport async function* executeRollbackPlan(\n plan: RollbackPlan,\n isPro: boolean,\n): AsyncGenerator<string> {\n if (!isPro) throw new Error('Pro license required');\n\n for (const action of plan.actions) {\n if (action.strategy === 'unavailable') {\n yield `[skip] ${action.packageName}: cannot restore automatically — manual action required`;\n continue;\n }\n\n if (action.action === 'remove') {\n yield `[skip] ${action.packageName}: removal skipped for safety — remove manually if needed`;\n continue;\n }\n\n // SEG-001 sister fix: el snapshot proviene de disco; un snapshot manipulado\n // podria contener nombres con flags. Validar antes de cualquier spawn.\n try {\n validatePackageName(action.packageName);\n if (action.versionedFormula) validatePackageName(action.versionedFormula);\n } catch (err) {\n yield `[reject] ${action.packageName}: ${err instanceof Error ? err.message : String(err)}`;\n continue;\n }\n\n if (action.action === 'install') {\n if (action.strategy === 'pin-only') {\n yield `[warn] ${action.packageName}: cannot install specific version — skipping`;\n continue;\n }\n if (action.strategy === 'versioned-formula' && action.versionedFormula) {\n yield `[install] ${action.packageName} via ${action.versionedFormula}`;\n for await (const line of streamBrew(['install', action.versionedFormula])) {\n yield line;\n }\n continue;\n }\n if (action.strategy === 'bottle-cache') {\n yield `[install] ${action.packageName} from bottle cache`;\n for await (const line of streamBrew(['install', '--force-bottle', action.packageName])) {\n yield line;\n }\n continue;\n }\n continue;\n }\n\n // action === 'downgrade'\n if (action.strategy === 'versioned-formula' && action.versionedFormula) {\n yield `[downgrade] ${action.packageName}: ${action.fromVersion} → ${action.toVersion} via ${action.versionedFormula}`;\n for await (const line of streamBrew(['install', action.versionedFormula])) {\n yield line;\n }\n } else if (action.strategy === 'bottle-cache') {\n yield `[downgrade] ${action.packageName}: ${action.fromVersion} → ${action.toVersion} from bottle cache`;\n for await (const line of streamBrew(['install', '--force-bottle', action.packageName])) {\n yield line;\n }\n } else if (action.strategy === 'pin-only') {\n yield `[pin] ${action.packageName}: pinning at current version (target version not restorable)`;\n await execBrew(['pin', action.packageName]);\n yield `✓ Pinned ${action.packageName}`;\n }\n }\n\n // Capture post-rollback snapshot\n yield '[snapshot] Capturing post-rollback snapshot...';\n try {\n const postSnapshot = await captureSnapshot();\n await saveSnapshot(postSnapshot, 'post-rollback');\n yield '[snapshot] Snapshot saved.';\n } catch (err) {\n logger.warn('Failed to save post-rollback snapshot', { err });\n yield '[snapshot] Warning: could not save snapshot.';\n }\n}\n\nexport { loadSnapshots };\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { Box, Text } from 'ink';\nimport { useViewInput } from '../hooks/use-view-input.js';\nimport { TextInput } from '@inkjs/ui';\nimport { useBrewfileStore } from '../stores/brewfile-store.js';\nimport { useLicenseStore } from '../stores/license-store.js';\nimport { reconcile } from '../lib/brewfile/brewfile-manager.js';\nimport { Loading, ErrorMessage } from '../components/common/loading.js';\nimport { ProgressLog } from '../components/common/progress-log.js';\nimport { ResultBanner } from '../components/common/result-banner.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { ConfirmDialog } from '../components/common/confirm-dialog.js';\nimport { COLORS } from '../utils/colors.js';\nimport { GRADIENTS } from '../utils/gradient.js';\nimport { t } from '../i18n/index.js';\nimport type { DriftReport } from '../lib/brewfile/types.js';\nimport { SPACING } from '../utils/spacing.js';\n\ntype Phase = 'overview' | 'creating' | 'confirming-reconcile' | 'reconciling' | 'result';\n\n// ── DriftScore ────────────────────────────────────────────────────────────────\n\nfunction DriftScore({ score }: { score: number }) {\n const color = score >= 80 ? COLORS.success : score >= 50 ? COLORS.warning : COLORS.error;\n const bars = Math.round(score / 10);\n const filled = '▓'.repeat(bars);\n const empty = '░'.repeat(10 - bars);\n return (\n <Box>\n <Text color={color}>{filled}{empty}</Text>\n <Text color={color} bold> {score}% </Text>\n <Text color={COLORS.textSecondary}>{t('brewfile_compliant')}</Text>\n </Box>\n );\n}\n\n// ── DriftSummary ──────────────────────────────────────────────────────────────\n\nfunction DriftSummary({ drift }: { drift: DriftReport }) {\n return (\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n {drift.missingPackages.length > 0 && (\n <Box>\n <Text color={COLORS.error}>● </Text>\n <Text color={COLORS.error}>\n {t('brewfile_drift_missing', { count: drift.missingPackages.length })}\n </Text>\n <Text color={COLORS.textSecondary}>\n {': ' + drift.missingPackages.slice(0, 3).join(', ')}\n {drift.missingPackages.length > 3 ? '...' : ''}\n </Text>\n </Box>\n )}\n {drift.extraPackages.length > 0 && (\n <Box>\n <Text color={COLORS.warning}>● </Text>\n <Text color={COLORS.warning}>\n {t('brewfile_drift_extra', { count: drift.extraPackages.length })}\n </Text>\n </Box>\n )}\n {drift.wrongVersions.length > 0 && (\n <Box>\n <Text color={COLORS.info}>● </Text>\n <Text color={COLORS.info}>\n {t('brewfile_drift_wrong', { count: drift.wrongVersions.length })}\n </Text>\n </Box>\n )}\n {drift.missingPackages.length === 0 &&\n drift.extraPackages.length === 0 &&\n drift.wrongVersions.length === 0 && (\n <ResultBanner status=\"success\" message={t('brewfile_in_sync')} />\n )}\n </Box>\n );\n}\n\n// ── Main View ─────────────────────────────────────────────────────────────────\n\nexport function BrewfileView() {\n const isPro = useLicenseStore((s) => s.isPro);\n const { schema, drift, loading, driftLoading, error, load, createFromCurrent } = useBrewfileStore();\n\n const [phase, setPhase] = useState<Phase>('overview');\n const [streamLines, setStreamLines] = useState<string[]>([]);\n const [streamRunning, setStreamRunning] = useState(false);\n const [streamError, setStreamError] = useState<string | null>(null);\n const [resultMessage, setResultMessage] = useState('');\n const generatorRef = useRef<AsyncGenerator<string> | null>(null);\n const mountedRef = useRef(true);\n\n useEffect(() => {\n mountedRef.current = true;\n void load();\n return () => {\n mountedRef.current = false;\n void generatorRef.current?.return(undefined);\n };\n }, []);\n\n const startReconcile = useCallback(async () => {\n if (!schema) return;\n setPhase('reconciling');\n setStreamLines([]);\n setStreamError(null);\n setStreamRunning(true);\n\n const gen = reconcile(schema, isPro());\n generatorRef.current = gen;\n\n try {\n for await (const line of gen) {\n if (!mountedRef.current) break;\n setStreamLines((prev) => [...prev.slice(-99), line]);\n }\n if (mountedRef.current) {\n setResultMessage(t('brewfile_reconcile_success'));\n }\n } catch (err) {\n if (mountedRef.current) {\n const msg = err instanceof Error ? err.message : String(err);\n setStreamError(msg);\n setResultMessage(t('brewfile_reconcile_error', { error: msg }));\n }\n } finally {\n generatorRef.current = null;\n if (mountedRef.current) {\n setStreamRunning(false);\n setPhase('result');\n }\n }\n }, [schema, isPro]);\n\n useViewInput((input, key) => {\n if (phase === 'reconciling') return;\n if (phase === 'confirming-reconcile') return; // ConfirmDialog handles input\n\n if (phase === 'result') {\n if (key.escape || input === 'r') {\n setPhase('overview');\n void load();\n }\n return;\n }\n\n if (phase === 'creating') return; // TextInput handles input\n\n // phase === 'overview'\n if (input === 'n' || input === '1') {\n setPhase('creating');\n return;\n }\n if (input === 'r' || input === '2') {\n void load();\n return;\n }\n if (input === 'c' || input === '3') {\n const needsReconcile =\n drift && (\n drift.missingPackages.length > 0 ||\n drift.wrongVersions.length > 0\n );\n if (needsReconcile) {\n setPhase('confirming-reconcile');\n }\n return;\n }\n if (key.escape) {\n // back handled by global navigation\n }\n });\n\n if (loading) return <Loading message={t('loading_default')} />;\n if (error) return <ErrorMessage message={error} />;\n\n // ── Phase: confirming-reconcile ──\n if (phase === 'confirming-reconcile' && drift) {\n return (\n <ConfirmDialog\n message={t('confirm_brewfile_reconcile', {\n missing: String(drift.missingPackages.length),\n wrongVer: String(drift.wrongVersions.length),\n })}\n onConfirm={() => { void startReconcile(); }}\n onCancel={() => { setPhase('overview'); }}\n />\n );\n }\n\n // ── Phase: creating ──\n if (phase === 'creating') {\n return (\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n <SectionHeader emoji=\"📦\" title={t('brewfile_title')} gradient={GRADIENTS.ocean} />\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.textSecondary}>{t('brewfile_create_name')} </Text>\n <TextInput\n defaultValue=\"My Environment\"\n onSubmit={(value) => {\n const name = value.trim() || 'My Environment';\n setPhase('overview');\n void createFromCurrent(name).then(() => {\n // drift will auto-refresh via store\n });\n }}\n />\n </Box>\n </Box>\n );\n }\n\n // ── Phase: reconciling ──\n if (phase === 'reconciling') {\n return (\n <Box flexDirection=\"column\">\n <ProgressLog\n lines={streamLines}\n isRunning={streamRunning}\n title={t('brewfile_reconciling')}\n />\n </Box>\n );\n }\n\n // ── Phase: result ──\n if (phase === 'result') {\n return (\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n <ResultBanner\n status={streamError ? 'error' : 'success'}\n message={resultMessage}\n />\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.textSecondary}>r:{t('hint_refresh')} esc:{t('hint_back')}</Text>\n </Box>\n </Box>\n );\n }\n\n // ── Phase: overview ──\n return (\n <Box flexDirection=\"column\">\n <SectionHeader emoji=\"📦\" title={t('brewfile_title')} gradient={GRADIENTS.ocean} />\n\n {schema === null ? (\n <Box marginTop={SPACING.xs} flexDirection=\"column\">\n <ResultBanner status=\"info\" message={t('brewfile_no_brewfile')} />\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.textSecondary}>n:{t('hint_new')}</Text>\n </Box>\n </Box>\n ) : (\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n {/* Brewfile metadata */}\n <Box gap={SPACING.sm}>\n <Text color={COLORS.text} bold>{schema.meta.name}</Text>\n {schema.meta.description && (\n <Text color={COLORS.textSecondary}>{schema.meta.description}</Text>\n )}\n {schema.strictMode && (\n <Text color={COLORS.warning}>[{t('brewfile_strict_mode')}]</Text>\n )}\n </Box>\n\n {/* Package counts */}\n <Box gap={SPACING.md} marginTop={SPACING.xs}>\n <Text color={COLORS.sky}>\n {t('brewfile_formulae_count', { count: schema.formulae.length })}\n </Text>\n <Text color={COLORS.teal}>\n {t('brewfile_casks_count', { count: schema.casks.length })}\n </Text>\n </Box>\n\n {/* Drift score */}\n {driftLoading && (\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.muted}>{t('brewfile_computing_drift')}</Text>\n </Box>\n )}\n {drift && !driftLoading && (\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n <DriftScore score={drift.score} />\n <DriftSummary drift={drift} />\n </Box>\n )}\n\n {/* Keyboard hints */}\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.textSecondary}>\n r:{t('hint_refresh')}\n {drift && (drift.missingPackages.length > 0 || drift.wrongVersions.length > 0)\n ? ` c:${t('hint_reconcile')}`\n : ''}\n {' '}n:{t('hint_new')}\n </Text>\n </Box>\n </Box>\n )}\n </Box>\n );\n}\n","import React, { useCallback, useEffect, useState } from 'react';\nimport { Box, Text } from 'ink';\nimport { useViewInput } from '../hooks/use-view-input.js';\nimport { useSyncStore } from '../stores/sync-store.js';\nimport { useLicenseStore } from '../stores/license-store.js';\nimport { useNavigationStore } from '../stores/navigation-store.js';\nimport { ResultBanner } from '../components/common/result-banner.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { SelectableRow } from '../components/common/selectable-row.js';\nimport { Loading } from '../components/common/loading.js';\nimport { ConfirmDialog } from '../components/common/confirm-dialog.js';\nimport { COLORS } from '../utils/colors.js';\nimport { GRADIENTS } from '../utils/gradient.js';\nimport { t } from '../i18n/index.js';\nimport type { SyncConflict } from '../lib/sync/types.js';\nimport { SPACING } from '../utils/spacing.js';\nimport { useVisibleRows } from '../hooks/use-visible-rows.js';\n\ntype Phase = 'overview' | 'confirming-sync' | 'syncing' | 'conflicts' | 'confirming-apply' | 'result';\n\ntype ConflictResolution = 'use-local' | 'use-remote' | 'pending';\n\ninterface ConflictEntry {\n conflict: SyncConflict;\n resolution: ConflictResolution;\n}\n\nfunction OverviewSection({\n config,\n lastResult,\n conflicts,\n onSyncNow: _onSyncNow,\n onGoToConflicts: _onGoToConflicts,\n}: {\n config: ReturnType<typeof useSyncStore.getState>['config'];\n lastResult: ReturnType<typeof useSyncStore.getState>['lastResult'];\n conflicts: SyncConflict[];\n onSyncNow: () => void;\n onGoToConflicts: () => void;\n}) {\n const hasConflicts = conflicts.length > 0;\n const showComplianceHint = !hasConflicts && !!lastResult?.success;\n\n return (\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n {config ? (\n <>\n <Box marginBottom={SPACING.xs}>\n <Text color={COLORS.textSecondary}>{t('sync_machine', { name: config.machineName })}</Text>\n </Box>\n {config.lastSync && (\n <Box marginBottom={SPACING.xs}>\n <Text color={COLORS.textSecondary}>\n {t('sync_last_sync', { date: new Date(config.lastSync).toLocaleString() })}\n </Text>\n </Box>\n )}\n {hasConflicts ? (\n <ResultBanner\n status=\"error\"\n message={t('sync_status_conflict', { count: String(conflicts.length) })}\n />\n ) : lastResult?.success ? (\n <ResultBanner status=\"success\" message={t('sync_status_ok')} />\n ) : null}\n </>\n ) : (\n <Box marginBottom={SPACING.xs}>\n <Text color={COLORS.textSecondary}>{t('sync_disabled')}</Text>\n </Box>\n )}\n\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.textSecondary}>\n {'s'}<Text color={COLORS.gold}>:{t('hint_sync')}</Text>\n {hasConflicts && (\n <>\n {' c'}<Text color={COLORS.gold}>:{t('hint_conflict')}</Text>\n </>\n )}\n {showComplianceHint && (\n <>\n {' c'}<Text color={COLORS.gold}>:{t('hint_check_compliance')}</Text>\n </>\n )}\n </Text>\n </Box>\n </Box>\n );\n}\n\nfunction ConflictsList({\n entries,\n cursor,\n}: {\n entries: ConflictEntry[];\n cursor: number;\n}) {\n // Each conflict entry uses ~4 rows. Pick window from available rows / 4.\n const availableRows = useVisibleRows({\n reservedRows: 8,\n fallbackReservedRows: 14,\n minRows: 4,\n });\n const perEntryRows = 4;\n const maxEntries = Math.max(1, Math.floor(availableRows / perEntryRows));\n const start = Math.max(0, cursor - Math.floor(maxEntries / 2));\n const visible = entries.slice(start, start + maxEntries);\n return (\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n {start > 0 && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreAbove', { count: start })}</Text>\n )}\n {visible.map((entry, vi) => {\n const i = start + vi;\n const { conflict, resolution } = entry;\n const isActive = i === cursor;\n return (\n <Box key={`${conflict.packageName}-${conflict.remoteMachine}`} flexDirection=\"column\" marginBottom={SPACING.xs}>\n <SelectableRow isCurrent={isActive}>\n <Text bold color={isActive ? COLORS.text : COLORS.textSecondary}>\n {t('sync_conflict_title', { package: conflict.packageName })}\n </Text>\n <Text color={COLORS.muted}> ({conflict.packageType})</Text>\n </SelectableRow>\n <Box marginLeft={SPACING.sm} flexDirection=\"column\">\n <Text\n color={resolution === 'use-local' ? COLORS.success : COLORS.textSecondary}\n >\n {'l '}{t('sync_conflict_local', { version: conflict.localVersion })}\n {resolution === 'use-local' && ' ✓'}\n </Text>\n <Text\n color={resolution === 'use-remote' ? COLORS.success : COLORS.textSecondary}\n >\n {'r '}{t('sync_conflict_remote', { machine: conflict.remoteMachine, version: conflict.remoteVersion })}\n {resolution === 'use-remote' && ' ✓'}\n </Text>\n </Box>\n </Box>\n );\n })}\n {start + maxEntries < entries.length && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreBelow', { count: entries.length - start - maxEntries })}</Text>\n )}\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.textSecondary}>\n j/k:{t('hint_navigate')} l:{t('sync_conflict_use_local')} r:{t('sync_conflict_use_remote')} enter:{t('hint_apply')} esc:{t('hint_back')}\n </Text>\n </Box>\n </Box>\n );\n}\n\nexport function SyncView() {\n const isPro = useLicenseStore((s) => s.isPro);\n const navigate = useNavigationStore((s) => s.navigate);\n const { config, lastResult, conflicts, loading, error, initialize, syncNow, resolveConflicts } =\n useSyncStore();\n\n const [phase, setPhase] = useState<Phase>('overview');\n const [syncError, setSyncError] = useState<string | null>(null);\n const [conflictEntries, setConflictEntries] = useState<ConflictEntry[]>([]);\n const [cursor, setCursor] = useState(0);\n\n useEffect(() => {\n void initialize(isPro());\n }, []);\n\n // When store conflicts change, populate entries\n useEffect(() => {\n if (conflicts.length > 0) {\n setConflictEntries(\n conflicts.map((c) => ({ conflict: c, resolution: 'pending' as ConflictResolution })),\n );\n }\n }, [conflicts]);\n\n const handleSyncNow = useCallback(async () => {\n setPhase('syncing');\n setSyncError(null);\n await syncNow(isPro());\n // After sync, check for conflicts or success\n const state = useSyncStore.getState();\n if (state.conflicts.length > 0) {\n setPhase('conflicts');\n } else if (state.error) {\n setSyncError(state.error);\n setPhase('result');\n } else {\n setPhase('result');\n }\n }, [isPro, syncNow]);\n\n const handleApplyResolutions = useCallback(async () => {\n const pending = conflictEntries.filter((e) => e.resolution === 'pending');\n if (pending.length > 0) return; // All must be resolved before applying\n\n const resolutions = conflictEntries.map((e) => ({\n conflict: e.conflict,\n resolution: e.resolution as 'use-local' | 'use-remote',\n }));\n\n await resolveConflicts(resolutions);\n setPhase('result');\n }, [conflictEntries, resolveConflicts]);\n\n useViewInput((input, key) => {\n if (phase === 'syncing') return;\n if (phase === 'confirming-sync' || phase === 'confirming-apply') return;\n\n if (phase === 'result') {\n if (key.escape || input === 'r') {\n setPhase('overview');\n setSyncError(null);\n void initialize(isPro());\n }\n return;\n }\n\n if (phase === 'conflicts') {\n if (key.escape) { setPhase('overview'); return; }\n\n if (input === 'j' || key.downArrow) {\n setCursor((c) => Math.min(c + 1, conflictEntries.length - 1));\n return;\n }\n if (input === 'k' || key.upArrow) {\n setCursor((c) => Math.max(c - 1, 0));\n return;\n }\n\n if (input === 'l') {\n setConflictEntries((prev) =>\n prev.map((e, i) => (i === cursor ? { ...e, resolution: 'use-local' } : e)),\n );\n return;\n }\n if (input === 'r') {\n setConflictEntries((prev) =>\n prev.map((e, i) => (i === cursor ? { ...e, resolution: 'use-remote' } : e)),\n );\n return;\n }\n\n if (key.return) {\n const pending = conflictEntries.filter((e) => e.resolution === 'pending');\n if (pending.length === 0) setPhase('confirming-apply');\n return;\n }\n }\n\n // phase === 'overview'\n if (input === 's' || input === '1') {\n setPhase('confirming-sync');\n return;\n }\n if ((input === 'c' || input === '3') && conflicts.length > 0) {\n setCursor(0);\n setPhase('conflicts');\n return;\n }\n if ((input === 'c' || input === '3') && lastResult?.success) {\n navigate('compliance');\n return;\n }\n if (input === 'r' || input === '2') {\n void initialize(isPro());\n return;\n }\n });\n\n if (phase === 'confirming-sync') {\n return (\n <ConfirmDialog\n message={t('confirm_sync_now')}\n onConfirm={() => { void handleSyncNow(); }}\n onCancel={() => { setPhase('overview'); }}\n />\n );\n }\n\n if (phase === 'confirming-apply') {\n return (\n <ConfirmDialog\n message={t('confirm_sync_apply', { count: String(conflictEntries.length) })}\n onConfirm={() => { void handleApplyResolutions(); }}\n onCancel={() => { setPhase('conflicts'); }}\n />\n );\n }\n\n if (phase === 'syncing' || loading) {\n return <Loading message={t('sync_syncing')} />;\n }\n\n if (phase === 'result') {\n const isError = !!(syncError ?? error);\n return (\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n <SectionHeader emoji=\"🔄\" title={t('sync_title')} gradient={GRADIENTS.gold} />\n <Box marginTop={SPACING.xs}>\n <ResultBanner\n status={isError ? 'error' : 'success'}\n message={\n isError\n ? t('sync_error', { error: syncError ?? error ?? '' })\n : t('sync_success')\n }\n />\n </Box>\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.textSecondary}>r:{t('hint_refresh')} esc:{t('hint_back')}</Text>\n </Box>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\">\n <SectionHeader emoji=\"🔄\" title={t('sync_title')} gradient={GRADIENTS.gold} />\n\n {error && phase === 'overview' && (\n <Box marginTop={SPACING.xs}>\n <ResultBanner status=\"error\" message={t('sync_error', { error })} />\n </Box>\n )}\n\n {phase === 'overview' && (\n <OverviewSection\n config={config}\n lastResult={lastResult}\n conflicts={conflicts}\n onSyncNow={() => void handleSyncNow()}\n onGoToConflicts={() => { setCursor(0); setPhase('conflicts'); }}\n />\n )}\n\n {phase === 'conflicts' && (\n <Box flexDirection=\"column\">\n <SectionHeader emoji=\"⚠\" title={t('sync_status_conflict', { count: String(conflictEntries.length) })} gradient={GRADIENTS.gold} />\n <ConflictsList entries={conflictEntries} cursor={cursor} />\n </Box>\n )}\n </Box>\n );\n}\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { Box, Text } from 'ink';\nimport { useViewInput } from '../hooks/use-view-input.js';\nimport { TextInput } from '@inkjs/ui';\nimport { useComplianceStore } from '../stores/compliance-store.js';\nimport { useLicenseStore } from '../stores/license-store.js';\nimport { remediateViolations } from '../lib/compliance/compliance-remediator.js';\nimport { exportReport } from '../lib/compliance/policy-io.js';\nimport { ResultBanner } from '../components/common/result-banner.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { ProgressLog } from '../components/common/progress-log.js';\nimport { Loading } from '../components/common/loading.js';\nimport { ConfirmDialog } from '../components/common/confirm-dialog.js';\nimport { COLORS } from '../utils/colors.js';\nimport { GRADIENTS } from '../utils/gradient.js';\nimport { t } from '../i18n/index.js';\nimport { DATA_DIR } from '../lib/data-dir.js';\nimport { join } from 'node:path';\nimport type { ComplianceReport, ComplianceViolation } from '../lib/compliance/types.js';\nimport { SPACING } from '../utils/spacing.js';\nimport { useVisibleRows } from '../hooks/use-visible-rows.js';\n\ntype Phase = 'overview' | 'importing' | 'confirming-remediate' | 'remediating' | 'result';\n\nfunction ComplianceScore({ report }: { report: ComplianceReport }) {\n const color =\n report.score >= 80 ? COLORS.success : report.score >= 50 ? COLORS.warning : COLORS.error;\n const bars = Math.round(report.score / 10);\n\n return (\n <Box flexDirection=\"column\" marginBottom={SPACING.xs}>\n <Box>\n <Text color={color}>{'▓'.repeat(bars)}{'░'.repeat(10 - bars)}</Text>\n <Text color={color} bold> {report.score}%</Text>\n <Text color={COLORS.textSecondary}> {t('compliance_score', { score: String(report.score) })}</Text>\n </Box>\n <Text color={COLORS.muted} dimColor>\n {t('compliance_policy_name', { name: report.policyName })} · {t('compliance_machine', { name: report.machineName })}\n </Text>\n </Box>\n );\n}\n\nfunction ViolationItem({ violation }: { violation: ComplianceViolation }) {\n const color = violation.severity === 'error' ? COLORS.error : COLORS.warning;\n const prefix = violation.severity === 'error' ? '✗' : '⚠';\n\n return (\n <Box marginBottom={SPACING.none}>\n <Text color={color}>{prefix} </Text>\n <Text color={color} wrap=\"wrap\">{violation.detail}</Text>\n </Box>\n );\n}\n\nfunction ViolationList({ violations }: { violations: ComplianceViolation[] }) {\n const errors = violations.filter((v) => v.severity === 'error');\n const warnings = violations.filter((v) => v.severity === 'warning');\n // Reserve title + score (~5 rows) + section headers (2) + key hints (2).\n const totalRows = useVisibleRows({\n reservedRows: 11,\n fallbackReservedRows: 18,\n minRows: 2,\n });\n // Split rows proportionally between the two sections; +1 per section header.\n const total = errors.length + warnings.length;\n const errorBudget = total === 0\n ? 0\n : Math.min(errors.length, Math.max(1, Math.round((errors.length / total) * totalRows)));\n const warningBudget = Math.max(0, totalRows - errorBudget);\n const visibleErrors = errors.slice(0, errorBudget);\n const visibleWarnings = warnings.slice(0, warningBudget);\n const errorsHidden = errors.length - visibleErrors.length;\n const warningsHidden = warnings.length - visibleWarnings.length;\n\n return (\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n {errors.length > 0 && (\n <Box flexDirection=\"column\" marginBottom={SPACING.xs}>\n <Text color={COLORS.error} bold>{t('compliance_violations', { count: String(errors.length) })} (errors)</Text>\n {visibleErrors.map((v) => (\n <ViolationItem key={`${v.type}-${v.packageName}`} violation={v} />\n ))}\n {errorsHidden > 0 && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreBelow', { count: errorsHidden })}</Text>\n )}\n </Box>\n )}\n {warnings.length > 0 && (\n <Box flexDirection=\"column\">\n <Text color={COLORS.warning} bold>{t('compliance_violations', { count: String(warnings.length) })} (warnings)</Text>\n {visibleWarnings.map((v) => (\n <ViolationItem key={`${v.type}-${v.packageName}`} violation={v} />\n ))}\n {warningsHidden > 0 && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreBelow', { count: warningsHidden })}</Text>\n )}\n </Box>\n )}\n </Box>\n );\n}\n\nexport function ComplianceView() {\n const isPro = useLicenseStore((s) => s.isPro);\n const { policy, report, loading, error, importPolicy, runCheck } =\n useComplianceStore();\n\n const [phase, setPhase] = useState<Phase>('overview');\n const [resultMessage, setResultMessage] = useState<{ ok: boolean; text: string } | null>(null);\n const [streamLines, setStreamLines] = useState<string[]>([]);\n const [streamRunning, setStreamRunning] = useState(false);\n const generatorRef = useRef<AsyncGenerator<string> | null>(null);\n const mountedRef = useRef(true);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n void generatorRef.current?.return(undefined);\n };\n }, []);\n\n const handleImportSubmit = useCallback(\n async (filePath: string) => {\n if (!filePath.trim()) { setPhase('overview'); return; }\n await importPolicy(filePath.trim(), isPro());\n // importPolicy actualiza el store; runCheck si no hubo error\n const state = useComplianceStore.getState();\n if (!state.error && state.policy) {\n await runCheck(isPro());\n }\n setPhase('overview');\n },\n [isPro, importPolicy, runCheck],\n );\n\n const handleRecheck = useCallback(() => {\n void runCheck(isPro());\n }, [isPro, runCheck]);\n\n const handleExport = useCallback(async () => {\n if (!report) return;\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const outputPath = join(DATA_DIR, `compliance-report-${timestamp}.json`);\n try {\n await exportReport(report, outputPath);\n setResultMessage({ ok: true, text: t('compliance_export_done', { path: outputPath }) });\n setPhase('result');\n } catch (err) {\n setResultMessage({\n ok: false,\n text: t('compliance_remediate_error', { error: err instanceof Error ? err.message : String(err) }),\n });\n setPhase('result');\n }\n }, [report]);\n\n const handleRemediate = useCallback(async () => {\n if (!report) return;\n const actionable = report.violations.filter(\n (v) => v.type === 'missing' || v.type === 'wrong-version',\n );\n if (actionable.length === 0) return;\n\n setPhase('remediating');\n setStreamLines([]);\n setStreamRunning(true);\n\n const gen = remediateViolations(actionable, isPro());\n generatorRef.current = gen;\n\n try {\n for await (const line of gen) {\n if (!mountedRef.current) break;\n setStreamLines((prev) => [...prev.slice(-99), line]);\n }\n if (mountedRef.current) {\n setResultMessage({ ok: true, text: t('compliance_remediate_success') });\n // Re-check after remediation\n await runCheck(isPro());\n }\n } catch (err) {\n if (mountedRef.current) {\n setResultMessage({\n ok: false,\n text: t('compliance_remediate_error', { error: err instanceof Error ? err.message : String(err) }),\n });\n }\n } finally {\n generatorRef.current = null;\n if (mountedRef.current) {\n setStreamRunning(false);\n setPhase('result');\n }\n }\n }, [report, isPro, runCheck]);\n\n useViewInput((input, key) => {\n if (phase === 'remediating' || phase === 'importing') return;\n if (phase === 'confirming-remediate') return;\n\n if (phase === 'result') {\n if (key.escape || input === 'r') {\n setPhase('overview');\n setResultMessage(null);\n }\n return;\n }\n\n // phase === 'overview'\n if (input === 'i' || input === '2') {\n setPhase('importing');\n return;\n }\n if ((input === 'r' || input === '1') && policy) {\n handleRecheck();\n return;\n }\n if ((input === 'e' || input === '3') && report) {\n void handleExport();\n return;\n }\n if ((input === 'c' || input === '4') && report) {\n const actionable = report.violations.filter(\n (v) => v.type === 'missing' || v.type === 'wrong-version',\n );\n if (actionable.length > 0) {\n setPhase('confirming-remediate');\n }\n return;\n }\n });\n\n if (phase === 'confirming-remediate' && report) {\n const actionable = report.violations.filter(\n (v) => v.type === 'missing' || v.type === 'wrong-version',\n );\n return (\n <ConfirmDialog\n message={t('confirm_compliance_remediate', { count: String(actionable.length) })}\n onConfirm={() => { void handleRemediate(); }}\n onCancel={() => { setPhase('overview'); }}\n />\n );\n }\n\n if (phase === 'remediating' || (loading && phase !== 'importing')) {\n if (phase === 'remediating') {\n return (\n <Box flexDirection=\"column\">\n <SectionHeader emoji=\"🔍\" title={t('compliance_title')} gradient={GRADIENTS.gold} />\n <Box marginTop={SPACING.xs}>\n <ProgressLog lines={streamLines} isRunning={streamRunning} title={t('compliance_remediating')} />\n </Box>\n </Box>\n );\n }\n return <Loading message={t('compliance_title')} />;\n }\n\n if (phase === 'result' && resultMessage) {\n return (\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n <SectionHeader emoji=\"🔍\" title={t('compliance_title')} gradient={GRADIENTS.gold} />\n <Box marginTop={SPACING.xs}>\n <ResultBanner\n status={resultMessage.ok ? 'success' : 'error'}\n message={resultMessage.text}\n />\n </Box>\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.textSecondary}>r:{t('hint_refresh')} esc:{t('hint_back')}</Text>\n </Box>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\">\n <SectionHeader emoji=\"🔍\" title={t('compliance_title')} gradient={GRADIENTS.gold} />\n\n {error && (\n <Box marginTop={SPACING.xs}>\n <ResultBanner status=\"error\" message={t('compliance_import_error', { error })} />\n </Box>\n )}\n\n {phase === 'importing' && (\n <Box marginTop={SPACING.xs} flexDirection=\"column\">\n <Text color={COLORS.textSecondary}>{t('compliance_import_prompt')}</Text>\n <Box marginTop={SPACING.xs}>\n <TextInput\n defaultValue=\"\"\n onSubmit={(val) => { void handleImportSubmit(val); }}\n />\n </Box>\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.muted} dimColor>esc:{t('hint_back')}</Text>\n </Box>\n </Box>\n )}\n\n {phase === 'overview' && (\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n {!policy ? (\n <Box flexDirection=\"column\">\n <Text color={COLORS.textSecondary}>{t('compliance_no_policy')}</Text>\n </Box>\n ) : (\n <Box flexDirection=\"column\">\n <Text color={COLORS.textSecondary} bold>\n {t('compliance_policy_by', { maintainer: policy.meta.maintainer })}\n </Text>\n\n {report ? (\n <Box flexDirection=\"column\" marginTop={SPACING.xs}>\n <ComplianceScore report={report} />\n {report.compliant ? (\n <ResultBanner status=\"success\" message={t('compliance_ok')} />\n ) : (\n <ViolationList violations={report.violations} />\n )}\n </Box>\n ) : (\n <Box marginTop={SPACING.xs}>\n <Text color={COLORS.muted} dimColor>{t('compliance_press_r_hint')}</Text>\n </Box>\n )}\n </Box>\n )}\n\n <Box marginTop={SPACING.sm} flexWrap=\"wrap\">\n <Text color={COLORS.textSecondary}>\n i:{t('hint_import')}\n {policy && <Text> r:{t('hint_scan')}</Text>}\n {report && <Text> e:{t('hint_export')}</Text>}\n {report && report.violations.some((v) => v.type === 'missing' || v.type === 'wrong-version') && (\n <Text> c:{t('hint_clean')}</Text>\n )}\n {' q:'}{t('hint_quit')}\n </Text>\n </Box>\n </Box>\n )}\n </Box>\n );\n}\n","import { streamBrew } from '../brew-cli.js';\nimport { validatePackageName } from '../brew-api.js';\nimport type { ComplianceViolation } from './types.js';\n\nexport async function* remediateViolations(\n violations: ComplianceViolation[],\n isPro: boolean,\n): AsyncGenerator<string> {\n if (!isPro) throw new Error('Pro license required');\n\n let installed = 0;\n let upgraded = 0;\n let skipped = 0;\n\n for (const v of violations) {\n if (v.type === 'missing') {\n // SEG-001: validar antes del spawn para que un PolicyFile artesanal no\n // inyecte flags (`--HEAD`, taps privados) via el nombre del paquete.\n try {\n validatePackageName(v.packageName);\n } catch (err) {\n yield ` ✗ Rejected ${v.packageName}: ${err instanceof Error ? err.message : String(err)}`;\n skipped++;\n continue;\n }\n yield `Installing ${v.packageName}...`;\n try {\n for await (const line of streamBrew(['install', v.packageName])) {\n yield line;\n }\n installed++;\n } catch (err) {\n yield ` ✗ Failed to install ${v.packageName}: ${err instanceof Error ? err.message : String(err)}`;\n skipped++;\n }\n } else if (v.type === 'wrong-version') {\n try {\n validatePackageName(v.packageName);\n } catch (err) {\n yield ` ✗ Rejected ${v.packageName}: ${err instanceof Error ? err.message : String(err)}`;\n skipped++;\n continue;\n }\n yield `Upgrading ${v.packageName}${v.required ? ` to ${v.required}+` : ''}...`;\n try {\n for await (const line of streamBrew(['upgrade', v.packageName])) {\n yield line;\n }\n upgraded++;\n } catch (err) {\n yield ` ✗ Failed to upgrade ${v.packageName}: ${err instanceof Error ? err.message : String(err)}`;\n skipped++;\n }\n } else if (v.type === 'forbidden') {\n yield ` ⚠ Forbidden package detected: ${v.packageName} — manual removal required`;\n skipped++;\n } else if (v.type === 'extra') {\n yield ` ⚠ Extra package in strict mode: ${v.packageName} — manual removal required`;\n skipped++;\n }\n }\n\n yield `Remediation complete: ${installed} installed, ${upgraded} upgraded, ${skipped} skipped (manual action required)`;\n}\n","import { readFile } from 'node:fs/promises';\nimport { homedir, platform, release, arch } from 'node:os';\nimport { join } from 'node:path';\nimport { logger } from '../utils/logger.js';\nimport { getMachineId } from './data-dir.js';\n\n// Opt-in crash reporting. The TUI never sends data unless the user has\n// configured an endpoint, either via the env var below or via the persisted\n// config file at ~/.brew-tui/crash-reporter.json. The dashboard backend is\n// expected to live on the user's own infrastructure (NAS).\nconst ENDPOINT_ENV = 'BREW_TUI_CRASH_ENDPOINT';\nconst TOKEN_ENV = 'BREW_TUI_CRASH_TOKEN';\nconst CONFIG_PATH = join(homedir(), '.brew-tui', 'crash-reporter.json');\nconst POST_TIMEOUT_MS = 5_000;\n\ninterface CrashReporterConfig {\n endpoint: string | null;\n token: string | null;\n enabled: boolean;\n}\n\ninterface CrashReport {\n app: 'brew-tui';\n version: string;\n platform: string;\n os: string;\n arch: string;\n machineId: string;\n timestamp: string;\n level: 'fatal' | 'error';\n message: string;\n stack: string | null;\n context: Record<string, unknown>;\n}\n\nlet _installed = false;\n\nasync function loadConfigFromDisk(): Promise<CrashReporterConfig> {\n try {\n const raw = await readFile(CONFIG_PATH, 'utf-8');\n const parsed = JSON.parse(raw) as Partial<CrashReporterConfig>;\n return {\n endpoint: typeof parsed.endpoint === 'string' ? parsed.endpoint : null,\n token: typeof parsed.token === 'string' ? parsed.token : null,\n enabled: parsed.enabled === true,\n };\n } catch {\n return { endpoint: null, token: null, enabled: false };\n }\n}\n\nasync function resolveConfig(): Promise<CrashReporterConfig> {\n const envEndpoint = process.env[ENDPOINT_ENV]?.trim();\n const envToken = process.env[TOKEN_ENV]?.trim();\n if (envEndpoint) {\n return { endpoint: envEndpoint, token: envToken ?? null, enabled: true };\n }\n return loadConfigFromDisk();\n}\n\nfunction isHttpsOrLocal(url: string): boolean {\n try {\n const parsed = new URL(url);\n if (parsed.protocol === 'https:') return true;\n // Allow plain http only for loopback/LAN destinations (NAS).\n if (parsed.protocol === 'http:') {\n const host = parsed.hostname;\n return /^(localhost|127\\.\\d+\\.\\d+\\.\\d+|10\\.|192\\.168\\.|172\\.(1[6-9]|2\\d|3[0-1])\\.|::1$)/i.test(host);\n }\n return false;\n } catch {\n return false;\n }\n}\n\nasync function postReport(report: CrashReport, config: CrashReporterConfig): Promise<void> {\n if (!config.endpoint || !isHttpsOrLocal(config.endpoint)) return;\n try {\n await fetch(config.endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(config.token ? { 'Authorization': `Bearer ${config.token}` } : {}),\n },\n body: JSON.stringify(report),\n signal: AbortSignal.timeout(POST_TIMEOUT_MS),\n });\n } catch (err) {\n // Never let the reporter itself crash the host process.\n logger.warn('crash-reporter: POST failed', { error: String(err) });\n }\n}\n\nfunction buildReport(level: 'fatal' | 'error', err: unknown, context: Record<string, unknown>, machineId: string, version: string): CrashReport {\n const message = err instanceof Error ? err.message : String(err);\n const stack = err instanceof Error && typeof err.stack === 'string' ? err.stack : null;\n return {\n app: 'brew-tui',\n version,\n platform: platform(),\n os: release(),\n arch: arch(),\n machineId,\n timestamp: new Date().toISOString(),\n level,\n message,\n stack,\n context,\n };\n}\n\n/**\n * Manually report a non-fatal error. No-op if reporting is not enabled.\n */\nexport async function reportError(err: unknown, context: Record<string, unknown> = {}): Promise<void> {\n const config = await resolveConfig();\n if (!config.enabled || !config.endpoint) return;\n const machineId = await getMachineId();\n const version = typeof process.env.APP_VERSION === 'string' ? process.env.APP_VERSION : 'unknown';\n await postReport(buildReport('error', err, context, machineId, version), config);\n}\n\n/**\n * Install global handlers for uncaughtException / unhandledRejection.\n * No-op when the reporter is not enabled. Safe to call multiple times.\n */\nexport async function installCrashReporter(): Promise<void> {\n if (_installed) return;\n const config = await resolveConfig();\n if (!config.enabled || !config.endpoint) return;\n _installed = true;\n\n const machineId = await getMachineId();\n const version = typeof process.env.APP_VERSION === 'string' ? process.env.APP_VERSION : 'unknown';\n\n process.on('uncaughtException', (err) => {\n void postReport(buildReport('fatal', err, { kind: 'uncaughtException' }, machineId, version), config);\n });\n\n process.on('unhandledRejection', (reason) => {\n void postReport(buildReport('error', reason, { kind: 'unhandledRejection' }, machineId, version), config);\n });\n\n logger.info('crash-reporter: enabled', { endpoint: config.endpoint });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,SAAS,uBAAuB;AAChC,SAAS,MAAAA,WAAU;AACnB,SAAS,cAAc;;;ACHvB,SAAgB,aAAAC,aAAW,YAAAC,kBAAgB;AAC3C,SAAS,cAAc;;;ACDvB,SAAgB,cAAc;AAC9B,SAAS,OAAAC,YAA4B;;;ACArC,SAAS,KAAK,QAAAC,aAAY;;;ACD1B,SAAS,4BAA4B;AACrC,SAAS,iBAAiB;AAwB1B,IAAM,WAAyB,EAAE,SAAS,IAAI,MAAM,GAAG;AAcvD,IAAM,QAAQ,oBAAI,QAAgC;AAElD,SAAS,SAAS,QAAkC;AAClD,SAAO;AAAA,IACL,SAAS,OAAO,WAAW,SAAS;AAAA,IACpC,MAAM,OAAO,QAAQ,SAAS;AAAA,EAChC;AACF;AAEA,SAAS,SAAS,QAAgC;AAChD,QAAM,WAAW,MAAM,IAAI,MAAM;AACjC,MAAI,SAAU,QAAO;AACrB,QAAM,QAAoB;AAAA,IACxB,SAAS,SAAS,MAAM;AAAA,IACxB,aAAa,oBAAI,IAAI;AAAA,EACvB;AACA,QAAM,IAAI,QAAQ,KAAK;AAGvB,SAAO,GAAG,UAAU,MAAM;AACxB,UAAM,UAAU,SAAS,MAAM;AAC/B,UAAM,YAAY,QAAQ,CAAC,OAAO,GAAG,CAAC;AAAA,EACxC,CAAC;AACD,SAAO;AACT;AAEO,SAAS,kBAAgC;AAC9C,QAAM,EAAE,OAAO,IAAI,UAAU;AAC7B,SAAO;AAAA,IACL,CAAC,OAAO;AACN,UAAI,CAAC,OAAQ,QAAO,MAAM;AAAA,MAAC;AAC3B,YAAM,QAAQ,SAAS,MAAM;AAC7B,YAAM,YAAY,IAAI,EAAE;AACxB,aAAO,MAAM;AACX,cAAM,YAAY,OAAO,EAAE;AAAA,MAC7B;AAAA,IACF;AAAA,IACA,MAAO,SAAS,SAAS,MAAM,EAAE,UAAU;AAAA;AAAA,IAE3C,MAAM;AAAA,EACR;AACF;;;AChFA,SAAS,cAAc;AA2BvB,IAAM,aAAuB;AAAA,EAC3B;AAAA,EAAa;AAAA,EAAa;AAAA,EAAY;AAAA,EAAgB;AAAA,EAAY;AAAA,EAClE;AAAA,EAAY;AAAA,EAAiB;AAAA,EAAW;AAAA,EAAY;AAAA,EAAY;AAAA,EAAQ;AAAA,EAAkB;AAAA,EAAc;AAC1G;AAEO,IAAM,qBAAqB,OAAwB,CAAC,KAAK,SAAS;AAAA,EACvE,aAAa;AAAA,EACb,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,aAAa,CAAC;AAAA;AAAA;AAAA,EAGd,UAAU;AAAA,EACV,YAAY;AAAA,EAEZ,UAAU,CAAC,SAAS;AAClB,UAAM,EAAE,aAAa,YAAY,IAAI,IAAI;AACzC,QAAI,SAAS,YAAa;AAC1B,QAAI;AAAA,MACF,aAAa;AAAA,MACb,aAAa,CAAC,GAAG,YAAY,MAAM,GAAG,GAAG,WAAW;AAAA,IACtD,CAAC;AAAA,EACH;AAAA,EAEA,QAAQ,MAAM;AACZ,UAAM,EAAE,aAAa,SAAS,IAAI,IAAI;AACtC,QAAI,UAAU;AACZ,UAAI,EAAE,UAAU,MAAM,CAAC;AACvB;AAAA,IACF;AACA,QAAI,YAAY,WAAW,EAAG;AAC9B,UAAM,OAAO,YAAY,YAAY,SAAS,CAAC;AAC/C,QAAI;AAAA,MACF,aAAa;AAAA,MACb,aAAa,YAAY,MAAM,GAAG,EAAE;AAAA,IACtC,CAAC;AAAA,EACH;AAAA,EAEA,eAAe,CAAC,MAAM,OAAO,SAAS,IAAI,EAAE,iBAAiB,MAAM,qBAAqB,KAAK,CAAC;AAAA,EAE9F,eAAe,MAAM;AACnB,UAAM,EAAE,YAAY,IAAI,IAAI;AAC5B,UAAM,MAAM,WAAW,QAAQ,WAAW;AAC1C,QAAI,EAAE,UAAU,MAAM,YAAY,OAAO,IAAI,MAAM,EAAE,CAAC;AAAA,EACxD;AAAA,EAEA,cAAc,MAAM,IAAI,EAAE,UAAU,MAAM,CAAC;AAAA,EAE3C,gBAAgB,CAAC,UAAU;AACzB,UAAM,EAAE,WAAW,IAAI,IAAI;AAC3B,UAAM,OAAO,aAAa;AAC1B,QAAI,OAAO,KAAK,QAAQ,WAAW,OAAQ;AAC3C,QAAI,EAAE,YAAY,KAAK,CAAC;AAAA,EAC1B;AAAA,EAEA,gBAAgB,MAAM;AACpB,UAAM,EAAE,YAAY,aAAa,YAAY,IAAI,IAAI;AACrD,UAAM,SAAS,WAAW,UAAU;AACpC,QAAI,CAAC,QAAQ;AACX,UAAI,EAAE,UAAU,MAAM,CAAC;AACvB;AAAA,IACF;AACA,QAAI,WAAW,aAAa;AAC1B,UAAI,EAAE,UAAU,MAAM,CAAC;AACvB;AAAA,IACF;AACA,QAAI;AAAA,MACF,aAAa;AAAA,MACb,aAAa,CAAC,GAAG,YAAY,MAAM,GAAG,GAAG,WAAW;AAAA,MACpD,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AACF,EAAE;;;ACjGF,IAAM,YAAY,oBAAI,IAAY;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGD,IAAM,aAAa,oBAAI,IAAY,CAAC,YAAY,CAAC;AAE1C,SAAS,UAAU,QAAyB;AACjD,SAAO,UAAU,IAAI,MAAM;AAC7B;AAEO,SAAS,WAAW,QAAyB;AAClD,SAAO,WAAW,IAAI,MAAM;AAC9B;;;ACLA,IAAM,eAAe;AAAA,EACnB,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,eAAe;AAAA,EACf,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,UAAU;AAAA,EACV,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,OAAO;AACT;AAEA,IAAM,gBAAgB;AAAA,EACpB,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,eAAe;AAAA,EACf,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,UAAU;AAAA,EACV,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,OAAO;AAAA;AACT;AAIA,SAAS,cAAgC;AACvC,QAAM,WAAW,QAAQ,IAAI,gBAAgB;AAC7C,MAAI,aAAa,UAAU,aAAa,QAAS,QAAO;AAGxD,QAAM,MAAM,QAAQ,IAAI,WAAW;AACnC,MAAI,KAAK;AACP,UAAM,QAAQ,IAAI,MAAM,GAAG;AAC3B,UAAM,KAAK,OAAO,MAAM,MAAM,SAAS,CAAC,CAAC;AACzC,QAAI,CAAC,MAAM,EAAE,KAAK,MAAM,EAAG,QAAO;AAClC,QAAI,CAAC,MAAM,EAAE,KAAK,MAAM,EAAG,QAAO;AAAA,EACpC;AACA,SAAO;AACT;AAEA,IAAM,UAAU,YAAY,MAAM,UAAU,gBAAgB;AAE5D,SAAS,qBAA8B;AACrC,QAAM,IAAI,QAAQ,IAAI,UAAU;AAChC,SAAO,OAAO,MAAM,YAAY,EAAE,SAAS;AAC7C;AAEO,IAAM,WAAW,mBAAmB;AACpC,IAAM,QAAQ,YAAY;AAE1B,IAAM,SAAmC,WAC3C,OAAO;AAAA,EACL,OAAO,KAAK,OAAO,EAAiB,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;AACzD,IACC;;;AC7FL,OAAO,SAAS,eAAe;AAC/B,SAAS,YAAY;AAkCV,SAsBP,UAtBO;AA/BX,SAAS,SAAS,KAAuC;AACvD,QAAM,IAAI,SAAS,IAAI,MAAM,CAAC,GAAG,EAAE;AACnC,SAAO,CAAE,KAAK,KAAM,KAAM,KAAK,IAAK,KAAK,IAAI,GAAG;AAClD;AAEA,SAAS,SAAS,GAAW,GAAW,GAAmB;AACzD,SAAO,OAAQ,KAAK,KAAO,KAAK,KAAO,KAAK,IAAK,GAAG,SAAS,EAAE,EAAE,MAAM,CAAC,EAAE,YAAY;AACxF;AAEA,SAAS,KAAK,GAAW,GAAWC,IAAmB;AACrD,SAAO,KAAK,MAAM,KAAK,IAAI,KAAKA,EAAC;AACnC;AAEA,SAAS,iBAAiB,IAAY,IAAYA,IAAmB;AACnE,QAAM,CAAC,IAAI,IAAI,EAAE,IAAI,SAAS,EAAE;AAChC,QAAM,CAAC,IAAI,IAAI,EAAE,IAAI,SAAS,EAAE;AAChC,SAAO,SAAS,KAAK,IAAI,IAAIA,EAAC,GAAG,KAAK,IAAI,IAAIA,EAAC,GAAG,KAAK,IAAI,IAAIA,EAAC,CAAC;AACnE;AAQO,IAAM,eAAe,MAAM,KAAK,SAASC,cAAa,EAAE,UAAU,QAAQ,KAAK,GAAsB;AAK1G,MAAI,UAAU;AACZ,WAAO,oBAAC,QAAK,MAAa,UAAS;AAAA,EACrC;AACA,MAAI,OAAO,SAAS,GAAG;AACrB,WAAO,oBAAC,QAAK,OAAO,OAAO,CAAC,GAAG,MAAa,UAAS;AAAA,EACvD;AAEA,QAAM,eAAe,QAAQ,MAAM;AACjC,UAAM,QAAQ,CAAC,GAAG,QAAQ;AAC1B,UAAM,SAAS,KAAK,IAAI,MAAM,SAAS,GAAG,CAAC;AAE3C,WAAO,MAAM,IAAI,CAAC,MAAM,MAAM;AAC5B,YAAMD,KAAI,IAAI;AACd,YAAM,UAAUA,MAAK,OAAO,SAAS;AACrC,YAAM,QAAQ,KAAK,MAAM,OAAO;AAChC,YAAM,QAAQ,KAAK,IAAI,QAAQ,GAAG,OAAO,SAAS,CAAC;AACnD,YAAM,OAAO,UAAU;AACvB,YAAM,QAAQ,iBAAiB,OAAO,KAAK,GAAI,OAAO,KAAK,GAAI,IAAI;AACnE,aAAO,EAAE,MAAM,OAAO,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG;AAAA,IAC7C,CAAC;AAAA,EACH,GAAG,CAAC,UAAU,MAAM,CAAC;AAErB,SACE,gCACG,uBAAa,IAAI,CAAC,EAAE,MAAM,OAAO,IAAI,MACpC,oBAAC,QAAe,OAAc,MAAa,kBAAhC,GAAqC,CACjD,GACH;AAEJ,CAAC;AAKM,IAAM,YAAY;AAAA,EACvB,MAAS,CAAC,OAAO,MAAS,OAAO,YAAY,OAAO,QAAQ;AAAA,EAC5D,QAAS,CAAC,OAAO,OAAS,OAAO,MAAY,OAAO,KAAK;AAAA,EACzD,OAAS,CAAC,OAAO,MAAS,OAAO,MAAY,OAAO,MAAM;AAAA,EAC1D,SAAS,CAAC,OAAO,SAAS,OAAO,MAAY,OAAO,IAAI;AAAA,EACxD,MAAS,CAAC,OAAO,OAAS,OAAO,SAAY,OAAO,IAAI;AAAA,EACxD,SAAS,CAAC,OAAO,OAAS,OAAO,OAAY,OAAO,IAAI;AAAA,EACxD,KAAS,CAAC,OAAO,OAAS,OAAO,MAAY,OAAO,KAAK;AAAA,EACzD,UAAS,CAAC,OAAO,UAAU,OAAO,UAAW,OAAO,WAAW;AACjE;;;AC7EA,SAAgB,WAAW,gBAAgB;AAC3C,SAAS,QAAAE,aAAY;AA+CjB,gBAAAC,YAAA;AA3BJ,SAAS,qBAA8B;AACrC,SACE,QAAQ,QAAQ,IAAI,QAAQ,KAC5B,QAAQ,IAAI,kBAAkB,OAC9B,QAAQ,IAAI,gCAAgC;AAEhD;AAKO,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA,aAAa;AAAA,EACb,OAAO;AAAA,EACP;AACF,GAAsB;AACpB,QAAM,gBAAgB,mBAAmB;AACzC,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,IAAI;AAEzC,YAAU,MAAM;AACd,QAAI,cAAe;AACnB,UAAM,KAAK,YAAY,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,UAAU;AAC7D,WAAO,MAAM,cAAc,EAAE;AAAA,EAC/B,GAAG,CAAC,YAAY,aAAa,CAAC;AAE9B,SACE,gBAAAA,KAACD,OAAA,EAAK,OAAc,MAAY,UAAU,CAAC,UAAU,CAAC,eACnD,UACH;AAEJ;;;ACpDO,IAAM,UAAU;AAAA,EACrB,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,KAAK;AACP;AAKO,IAAM,cAAc;AAAA;AAAA,EAEzB,QAAQ;AAAA;AAAA,EAER,KAAK;AAAA;AAAA,EAEL,MAAM;AACR;AAMO,SAAS,cAAc,SAA6B;AACzD,MAAI,UAAU,YAAY,OAAQ,QAAO;AACzC,MAAI,UAAU,YAAY,IAAK,QAAO;AACtC,MAAI,UAAU,YAAY,KAAM,QAAO;AACvC,SAAO;AACT;;;APiDQ,SAEA,OAAAE,MAFA;AAlER,IAAM,YAAY;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AACA,IAAM,WAAW;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,kBAAkD;AAAA,EACtD,WAAW;AAAA,EACX,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,UAAU;AAAA,EACV,UAAU;AAAA,EACV,MAAM;AAAA,EACN,kBAAkB;AAAA,EAClB,YAAY;AAAA,EACZ,SAAS;AACX;AASA,SAAS,SAAS,EAAE,MAAM,aAAa,YAAY,SAAS,GAAkB;AAC5E,QAAM,YAAY,EAAE,gBAAgB,IAAI,CAAC;AACzC,QAAM,QAAQ,UAAU,IAAI,KAAK,WAAW,IAAI;AAChD,QAAM,YAAY,SAAS;AAC3B,QAAM,WAAW,YAAY,SAAS;AACtC,QAAM,YAAY,SAAS;AAE3B,QAAM,iBAAiB,WAAW,OAAO,QAAQ,OAAO;AACxD,QAAM,aAAa,WACf,OAAO,QACP,YACE,OAAO,UACP,YACE,OAAO,OACP,OAAO;AAIf,QAAM,YAAY,WAAW,WAAW;AAExC,SACE,qBAAC,OACE;AAAA,gBACC,qBAACC,OAAA,EAAK,OAAO,gBAAgB,MAAI,MAAE;AAAA;AAAA,MAAI;AAAA,OAAC,IAExC,gBAAAD,KAACC,OAAA,EAAK,gBAAE;AAAA,IAEV,gBAAAD,KAACC,OAAA,EAAK,MAAM,WAAW,WAAW,CAAC,YAAY,WAAW,OAAO,YAAa,qBAAU;AAAA,IACvF,SAAS,qBAACA,OAAA,EAAK,OAAO,OAAO,OAAO,MAAI,MAAC;AAAA;AAAA,MAAE,EAAE,WAAW;AAAA,OAAE;AAAA,KAC7D;AAEJ;AAEA,IAAM,aAAa,WAAW,MAAM,GAAG,CAAC;AACxC,IAAM,aAAa,WAAW,MAAM,CAAC;AAE9B,SAAS,SAAS;AACvB,QAAM,cAAc,mBAAmB,CAAC,MAAM,EAAE,WAAW;AAC3D,QAAM,WAAW,mBAAmB,CAAC,MAAM,EAAE,QAAQ;AACrD,QAAM,aAAa,mBAAmB,CAAC,MAAM,EAAE,UAAU;AACzD,iBAAe,CAAC,MAAM,EAAE,MAAM;AAC9B,QAAM,EAAE,SAAS,KAAK,IAAI,gBAAgB;AAC1C,QAAM,WAAW,UAAU;AAC3B,QAAM,kBAAkB,UAAU;AAOlC,QAAM,mBAAmB,OAAO;AAChC,QAAM,eAAe,OAAO,MAAM,CAAC;AACnC,QAAM,aAAa,WAAY,WAAW,UAAU,KAAK,OAAQ;AAEjE,QAAM,YACJ,gBAAAD,KAAC,OAAI,eAAc,UAAS,YAAY,GACrC,oBAAU,IAAI,CAAC,MAAM,MACpB,qBAAC,OACC;AAAA,oBAAAA,KAAC,gBAAa,QAAQ,UAAU,MAAO,gBAAK;AAAA,IAC5C,gBAAAA,KAAC,gBAAa,QAAQ,UAAU,UAAW,mBAAS,CAAC,GAAE;AAAA,OAF/C,QAAQ,CAAC,EAGnB,CACD,GACH;AAGF,QAAM,kBAAkB,WAAW,OAAO,QAAQ,OAAO;AAEzD,QAAM,YACJ,qBAAC,OAAI,aAAY,SAAQ,aAAa,iBAAiB,UAAU,QAAQ,IAAI,eAAc,UAAS,WAAW,WAAW,eAAe,UACvI;AAAA,yBAAC,OAAI,eAAc,OACjB;AAAA,sBAAAA,KAAC,OAAI,eAAc,UAChB,qBAAW,IAAI,CAAC,SACf,gBAAAA,KAAC,YAAoB,MAAY,aAA0B,YAAwB,YAApE,IAAwF,CACxG,GACH;AAAA,MACA,gBAAAA,KAAC,OAAI,eAAc,UAAS,YAAY,QAAQ,IAC7C,qBAAW,IAAI,CAAC,SACf,gBAAAA,KAAC,YAAoB,MAAY,aAA0B,YAAwB,YAApE,IAAwF,CACxG,GACH;AAAA,OACF;AAAA,IACA,gBAAAA,KAAC,OAAI,aAAY,UAAS,WAAS,MAAC,cAAc,OAAO,YAAY,OAAO,aAAa,OAAO,aAAa,iBAAiB,WAAW,QAAQ,MAC9I,qBACC,qBAACC,OAAA,EAAK,OAAO,OAAO,OACjB;AAAA,QAAE,sBAAsB;AAAA,MACzB,gBAAAD,KAAC,gBAAa,OAAO,OAAO,OAAO,eAAC;AAAA,MACnC,EAAE,sBAAsB;AAAA,OAC3B,IAEA,qBAACC,OAAA,EAAK,OAAO,OAAO,eAClB;AAAA,sBAAAD,KAAC,gBAAa,OAAO,OAAO,OAAO,eAAC;AAAA,MACnC,EAAE,sBAAsB;AAAA,OAC3B,GAEJ;AAAA,KACF;AAKF,MAAI,cAAc;AAChB,UAAM,eAAe,EAAE,gBAAgB,WAAW,CAAC;AACnD,UAAM,eAAe,UAAU,WAAW,KAAK,WAAW,WAAW;AACrE,WACE,qBAAC,OAAI,UAAU,QAAQ,IACrB;AAAA,sBAAAA,KAACC,OAAA,EAAK,OAAO,OAAO,SAAS,MAAI,MAAE,qBAAK;AAAA,MACxC,gBAAAD,KAACC,OAAA,EAAK,OAAO,OAAO,SAAS,MAAI,MAAE,wBAAa;AAAA,MAC/C,gBAAgB,qBAACA,OAAA,EAAK,OAAO,OAAO,OAAO,MAAI,MAAC;AAAA;AAAA,QAAE,EAAE,WAAW;AAAA,SAAE;AAAA,MAClE,gBAAAD,KAACC,OAAA,EAAK,OAAO,OAAO,eAAe,gBAAE;AAAA,MACrC,gBAAAD,KAAC,gBAAa,OAAO,OAAO,OAAO,eAAC;AAAA,MACpC,gBAAAA,KAACC,OAAA,EAAK,OAAO,OAAO,eAAgB,YAAE,sBAAsB,GAAE;AAAA,OAChE;AAAA,EAEJ;AAEA,MAAI,UAAU;AACZ,WACE,qBAAC,OAAI,eAAc,UAAS,UAAU,QAAQ,IAC3C;AAAA,OAAC,mBAAmB,CAAC,oBAAoB;AAAA,MAC1C,gBAAAD,KAAC,OAAI,WAAW,mBAAmB,mBAAmB,QAAQ,OAAO,QAAQ,IAAK,qBAAU;AAAA,OAC9F;AAAA,EAEJ;AAGA,MAAI,kBAAkB;AACpB,WACE,gBAAAA,KAAC,OAAI,eAAc,UAAS,UAAU,QAAQ,IAC3C,qBACH;AAAA,EAEJ;AAEA,SACE,qBAAC,OAAI,eAAc,OAAM,UAAU,QAAQ,IAAI,YAAW,UACvD;AAAA;AAAA,IACD,gBAAAA,KAAC,OAAI,YAAY,QAAQ,IAAK,qBAAU;AAAA,KAC1C;AAEJ;;;AQpMA,OAAOE,YAAW;AAClB,SAAS,OAAAC,MAAK,QAAAC,aAAY;AAwCtB,qBAAAC,WACE,OAAAC,MADF,QAAAC,aAAA;AA3BJ,IAAM,iBAA4C;AAAA,EAChD,WAAW,CAAC,CAAC,KAAK,cAAc,CAAC;AAAA,EACjC,WAAW,CAAC,CAAC,KAAK,aAAa,GAAG,CAAC,SAAS,WAAW,GAAG,CAAC,KAAK,gBAAgB,GAAG,CAAC,KAAK,gBAAgB,CAAC;AAAA,EAC1G,QAAQ,CAAC,CAAC,SAAS,cAAc,GAAG,CAAC,KAAK,cAAc,CAAC;AAAA,EACzD,UAAU,CAAC,CAAC,SAAS,cAAc,GAAG,CAAC,KAAK,iBAAiB,GAAG,CAAC,KAAK,UAAU,GAAG,CAAC,KAAK,cAAc,CAAC;AAAA,EACxG,gBAAgB,CAAC,CAAC,KAAK,cAAc,GAAG,CAAC,KAAK,gBAAgB,GAAG,CAAC,KAAK,cAAc,CAAC;AAAA,EACtF,UAAU,CAAC,CAAC,KAAK,YAAY,GAAG,CAAC,KAAK,WAAW,GAAG,CAAC,KAAK,cAAc,GAAG,CAAC,KAAK,cAAc,CAAC;AAAA,EAChG,QAAQ,CAAC,CAAC,KAAK,cAAc,CAAC;AAAA,EAC9B,UAAU,CAAC,CAAC,SAAS,cAAc,GAAG,CAAC,KAAK,UAAU,GAAG,CAAC,KAAK,WAAW,GAAG,CAAC,KAAK,aAAa,GAAG,CAAC,KAAK,aAAa,CAAC;AAAA,EACvH,iBAAiB,CAAC,CAAC,SAAS,aAAa,GAAG,CAAC,KAAK,UAAU,GAAG,CAAC,KAAK,YAAY,GAAG,CAAC,KAAK,YAAY,GAAG,CAAC,KAAK,cAAc,CAAC;AAAA,EAC9H,SAAS,CAAC,CAAC,KAAK,aAAa,GAAG,CAAC,SAAS,aAAa,GAAG,CAAC,KAAK,aAAa,GAAG,CAAC,KAAK,YAAY,CAAC;AAAA,EACnG,kBAAkB,CAAC,CAAC,SAAS,cAAc,GAAG,CAAC,KAAK,WAAW,GAAG,CAAC,KAAK,cAAc,CAAC;AAAA,EACvF,UAAU,CAAC,CAAC,OAAO,eAAe,GAAG,CAAC,SAAS,aAAa,GAAG,CAAC,KAAK,uBAAuB,CAAC;AAAA,EAC7F,UAAU,CAAC,CAAC,KAAK,UAAU,GAAG,CAAC,KAAK,cAAc,GAAG,CAAC,KAAK,gBAAgB,CAAC;AAAA,EAC5E,MAAM,CAAC,CAAC,KAAK,WAAW,GAAG,CAAC,KAAK,cAAc,GAAG,CAAC,KAAK,eAAe,GAAG,CAAC,KAAK,eAAe,CAAC;AAAA,EAChG,YAAY,CAAC,CAAC,KAAK,WAAW,GAAG,CAAC,KAAK,aAAa,GAAG,CAAC,KAAK,aAAa,GAAG,CAAC,KAAK,YAAY,CAAC;AAAA,EAChG,SAAS,CAAC,CAAC,KAAK,YAAY,GAAG,CAAC,KAAK,iBAAiB,CAAC;AACzD;AAIA,SAAS,mBAAmB,MAA0B;AACpD,SAAO,KAAK,KAAK,CAAC,CAAC,GAAG,MAAM,QAAQ,KAAK,GAAG,CAAC;AAC/C;AAEA,SAAS,SAAS,EAAE,IAAI,GAAqB;AAC3C,SACE,gBAAAA,MAAAF,WAAA,EACE;AAAA,oBAAAC,KAACE,OAAA,EAAK,OAAO,OAAO,MAAM,MAAI,MAAE,cAAI,CAAC,GAAE;AAAA,IACvC,gBAAAF,KAACE,OAAA,EAAK,OAAO,OAAO,eAAe,eAAC;AAAA,IACpC,gBAAAF,KAACE,OAAA,EAAK,OAAO,OAAO,MAAM,UAAQ,MAAE,YAAE,IAAI,CAAC,CAAC,GAAE;AAAA,KAChD;AAEJ;AAEO,SAAS,SAAS;AACvB,QAAM,cAAc,mBAAmB,CAAC,MAAM,EAAE,WAAW;AAC3D,QAAM,WAAW,mBAAmB,CAAC,MAAM,EAAE,QAAQ;AACrD,QAAM,SAAS,eAAe,CAAC,MAAM,EAAE,MAAM;AAC7C,QAAM,EAAE,KAAK,IAAI,gBAAgB;AACjC,QAAM,OAAO,eAAe,WAAW,KAAK,CAAC;AAG7C,QAAM,aAAa,mBAAmB,IAAI,KAAK,CAAC,YAAY,QAAQ;AAEpE,SACE,gBAAAD,MAACE,MAAA,EAAI,eAAc,UAChB;AAAA,kBACC,gBAAAH,KAACG,MAAA,EAAI,UAAU,QAAQ,IACrB,0BAAAH,KAACE,OAAA,EAAK,OAAO,OAAO,MAAO,YAAE,mBAAmB,GAAE,GACpD;AAAA,IAEF,gBAAAD,MAACE,MAAA,EAAI,aAAY,UAAS,WAAS,MAAC,cAAc,OAAO,YAAY,OAAO,aAAa,OAAO,aAAa,OAAO,MAAM,UAAU,QAAQ,IAAI,UAAS,QACtJ;AAAA,OAAC,YAAY,KAAK,IAAI,CAAC,KAAK,MAC3B,gBAAAF,MAACG,OAAM,UAAN,EACE;AAAA,YAAI,KAAK,gBAAAH,MAACC,OAAA,EAAK,OAAO,OAAO,QAAQ;AAAA;AAAA,UAAE;AAAA,UAAI;AAAA,WAAC;AAAA,QAC7C,gBAAAF,KAAC,YAAS,KAAU;AAAA,WAFD,GAAG,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAGxC,CACD;AAAA,MACA,CAAC,YAAY,KAAK,SAAS,KAAK,gBAAAC,MAACC,OAAA,EAAK,OAAO,OAAO,QAAQ;AAAA;AAAA,QAAE;AAAA,QAAI;AAAA,SAAC;AAAA,MACpE,gBAAAF,KAACE,OAAA,EAAK,OAAO,OAAO,MAAM,MAAI,MAAC,iBAAG;AAAA,MAClC,gBAAAF,KAACE,OAAA,EAAK,OAAO,OAAO,eAAe,eAAC;AAAA,MACpC,gBAAAF,KAACE,OAAA,EAAK,OAAO,OAAO,MAAM,UAAQ,MAAE,YAAE,WAAW,GAAE;AAAA,MACnD,gBAAAD,MAACC,OAAA,EAAK,OAAO,OAAO,QAAQ;AAAA;AAAA,QAAE;AAAA,QAAI;AAAA,SAAC;AAAA,MACnC,gBAAAF,KAACE,OAAA,EAAK,OAAO,OAAO,MAAM,MAAI,MAAC,eAAC;AAAA,MAChC,gBAAAF,KAACE,OAAA,EAAK,OAAO,OAAO,eAAe,eAAC;AAAA,MACpC,gBAAAF,KAACE,OAAA,EAAK,OAAO,OAAO,MAAM,UAAQ,MAAE,YAAE,WAAW,GAAE;AAAA,MACnD,gBAAAD,MAACC,OAAA,EAAK,OAAO,OAAO,UAAU;AAAA;AAAA,QAAE;AAAA,QAAI;AAAA,SAAC;AAAA,MACrC,gBAAAF,KAACE,OAAA,EAAK,OAAO,OAAO,MAAM,MAAI,MAAC,eAAC;AAAA,MAChC,gBAAAF,KAACE,OAAA,EAAK,OAAO,OAAO,eAAe,eAAC;AAAA,MACpC,gBAAAD,MAACC,OAAA,EAAK,OAAO,OAAO,MAAM,UAAQ,MAAE;AAAA,UAAE,WAAW;AAAA,QAAE;AAAA,QAAE;AAAA,QAAO;AAAA,SAAC;AAAA,OAC/D;AAAA,KACF;AAEJ;;;ACxFA,SAAS,aAAAG,YAAW,YAAAC,iBAAgC;AACpD,SAAS,sBAAuC;AAsBzC,SAAS,iBACd,KACe;AACf,QAAM,WAAW,gBAAgB;AACjC,QAAM,CAAC,MAAM,OAAO,IAAIC,UAAwB,EAAE,OAAO,GAAG,QAAQ,EAAE,CAAC;AAEvE,EAAAC,WAAU,MAAM;AACd,QAAI,CAAC,IAAI,QAAS;AAClB,UAAM,WAAW,eAAe,IAAI,OAAO;AAE3C;AAAA,MAAQ,CAAC,SACP,KAAK,UAAU,SAAS,SAAS,KAAK,WAAW,SAAS,SACtD,OACA;AAAA,IACN;AAAA,EAGF,GAAG,CAAC,KAAK,SAAS,SAAS,SAAS,IAAI,CAAC;AAEzC,SAAO;AACT;;;AC3CA,SAAgB,eAAe,kBAAkB;AAe7C,gBAAAC,YAAA;AAZJ,IAAM,qBAAoC,EAAE,OAAO,GAAG,QAAQ,EAAE;AAEhE,IAAM,qBAAqB,cAA6B,kBAAkB;AAEnE,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AACF,GAGG;AACD,SACE,gBAAAA,KAAC,mBAAmB,UAAnB,EAA4B,OAC1B,UACH;AAEJ;AAEO,SAAS,iBAAgC;AAC9C,SAAO,WAAW,kBAAkB;AACtC;;;AXAI,SAEI,OAAAC,MAFJ,QAAAC,aAAA;AAVG,SAAS,UAAU,EAAE,SAAS,GAAmB;AACtD,QAAM,EAAE,KAAK,IAAI,gBAAgB;AACjC,QAAM,aAAa,OAAmB,IAAI;AAC1C,QAAM,cAAc,iBAAiB,UAAU;AAC/C,QAAM,mBAAmB;AAAA,IACvB,OAAO,KAAK,IAAI,GAAG,YAAY,QAAQ,QAAQ,KAAK,CAAC;AAAA,IACrD,QAAQ,KAAK,IAAI,GAAG,YAAY,SAAS,QAAQ,KAAK,CAAC;AAAA,EACzD;AAEA,SACE,gBAAAA,MAACC,MAAA,EAAI,eAAc,UAAS,OAAM,QAAO,QAAQ,MAAM,UAAS,UAC9D;AAAA,oBAAAF,KAACE,MAAA,EAAI,YAAY,GACf,0BAAAF,KAAC,UAAO,GACV;AAAA,IACA,gBAAAA;AAAA,MAACE;AAAA,MAAA;AAAA,QACC,KAAK;AAAA,QACL,eAAc;AAAA,QACd,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,UAAS;AAAA,QACT,UAAU,QAAQ;AAAA,QAClB,UAAU,QAAQ;AAAA,QAElB,0BAAAF,KAAC,uBAAoB,OAAO,kBACzB,UACH;AAAA;AAAA,IACF;AAAA,IACA,gBAAAA,KAACE,MAAA,EAAI,YAAY,GACf,0BAAAF,KAAC,UAAO,GACV;AAAA,KACF;AAEJ;;;AY9CA,SAAS,UAAAG,eAAc;;;ACYvB,IAAI,iBAAyC;AAC7C,IAAI,oBAAyD;AAC7D,IAAI,YAAoC;AAMjC,SAAS,mBAAmB,OAA8B;AAC/D,cAAY;AACZ,mBAAiB,MAAM,SAAS,EAAE;AAClC,sBAAoB,MAAM;AAC5B;AAMO,SAAS,uBAAgC;AAC9C,MAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,kBAAmB,QAAO;AAEhE,QAAM,QAAQ,UAAU,SAAS;AAGjC,MAAI,MAAM,UAAU,eAAgB,QAAO;AAG3C,MAAI,UAAU,aAAa,kBAAmB,QAAO;AAIrD,MAAI,MAAM,WAAW,UAAU,MAAM,MAAM,EAAG,QAAO;AAErD,SAAO;AACT;;;ADtCA,IAAM,wBAAwB,KAAK,KAAK;AAGxC,IAAI,uBAA6C;AACjD,IAAI,wBAA+D;AAgBnE,eAAe,eACb,SACA,KACe;AACf,QAAM,SAAS,MAAc,WAAW,OAAO;AAC/C,MAAI,WAAW,WAAW;AACxB,QAAI,EAAE,QAAQ,WAAW,SAAS,EAAE,GAAG,SAAS,QAAQ,UAAU,GAAG,aAAa,UAAU,CAAC;AAAA,EAC/F,OAAO;AACL,UAAM,UAAU,MAAc,YAAY;AAC1C,UAAM,YAAY,WAAW;AAC7B,QAAI,EAAE,SAAS,WAAW,aAAa,oBAAoB,SAAS,EAAE,CAAC;AAAA,EACzE;AACF;AAEO,IAAM,kBAAkBC,QAAqB,CAAC,KAAK,SAAS;AAAA,EACjE,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,OAAO;AAAA,EACP,aAAa;AAAA,EAEb,YAAY,YAAY;AACtB,uBAAmB,eAAe;AAClC,UAAM,eAAe;AACrB,UAAM,UAAU,MAAc,YAAY;AAE1C,QAAI,CAAC,SAAS;AACZ,UAAI,EAAE,QAAQ,QAAQ,SAAS,MAAM,aAAa,OAAO,CAAC;AAC1D;AAAA,IACF;AAKA,QAAY,UAAU,OAAO,GAAG;AAC9B,UAAI,EAAE,QAAQ,WAAW,SAAS,aAAa,UAAU,CAAC;AAC1D;AAAA,IACF;AAGA,UAAM,QAAQ,oBAAoB,OAAO;AACzC,QAAI,UAAU,WAAW;AACvB,UAAI,EAAE,QAAQ,WAAW,SAAS,aAAa,UAAU,CAAC;AAC1D;AAAA,IACF;AAGA,QAAI,EAAE,QAAQ,QAAQ,MAAM,SAAS,aAAa,MAAM,CAAC;AAEzD,QAAY,kBAAkB,OAAO,GAAG;AACtC,UAAI,CAAC,sBAAsB;AACzB,+BAAuB,eAAe,SAAS,GAAG,EAC/C,QAAQ,MAAM;AAAE,iCAAuB;AAAA,QAAM,CAAC;AAAA,MACnD;AACA,YAAM;AAAA,IACR;AAGA,QAAI,sBAAuB,eAAc,qBAAqB;AAC9D,4BAAwB,YAAY,MAAM;AACxC,YAAM,UAAU,IAAI,EAAE;AACtB,YAAM,SAAS,IAAI,EAAE;AACrB,UAAI,CAAC,WAAY,WAAW,SAAS,WAAW,OAAS;AACzD,UAAI,CAAS,kBAAkB,OAAO,EAAG;AACzC,UAAI,qBAAsB;AAC1B,6BAAuB,eAAe,SAAS,GAAG,EAC/C,QAAQ,MAAM;AAAE,+BAAuB;AAAA,MAAM,CAAC;AAAA,IACnD,GAAG,qBAAqB;AACxB,0BAAsB,MAAM;AAAA,EAC9B;AAAA,EAEA,UAAU,OAAO,QAAQ;AACvB,QAAI,EAAE,OAAO,KAAK,CAAC;AACnB,QAAI;AACF,YAAM,UAAU,MAAc,SAAS,GAAG;AAC1C,UAAI,EAAE,QAAQ,QAAQ,MAAM,SAAS,aAAa,OAAO,CAAC;AAC1D,aAAO;AAAA,IACT,SAAS,KAAK;AACZ,YAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,UAAI,EAAE,OAAO,IAAI,CAAC;AAClB,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,YAAY,YAAY;AACtB,UAAM,EAAE,QAAQ,IAAI,IAAI;AACxB,QAAI,SAAS;AACX,YAAM,EAAE,cAAc,IAAI,MAAc,WAAW,OAAO;AAC1D,UAAI,CAAC,eAAe;AAClB,YAAI,EAAE,QAAQ,QAAQ,SAAS,MAAM,aAAa,QAAQ,OAAO,yFAAyF,CAAC;AAC3J;AAAA,MACF;AAAA,IACF;AACA,QAAI,EAAE,QAAQ,QAAQ,SAAS,MAAM,aAAa,QAAQ,OAAO,KAAK,CAAC;AAAA,EACzE;AAAA,EAEA,YAAY,YAAY;AACtB,UAAM,EAAE,QAAQ,IAAI,IAAI;AACxB,QAAI,CAAC,QAAS;AACd,QAAI;AACF,YAAM,eAAe,SAAS,GAAG;AAAA,IACnC,SAAS,KAAK;AACZ,UAAI,EAAE,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE,CAAC;AAAA,IACjE;AAAA,EACF;AAAA;AAAA;AAAA,EAIA,OAAO,MAAM;AAAE,UAAM,IAAI,IAAI,EAAE;AAAQ,WAAO,MAAM,SAAS,MAAM;AAAA,EAAQ;AAAA,EAC3E,QAAQ,MAAM,IAAI,EAAE,WAAW;AACjC,EAAE;;;AEzIF,SAAS,gBAAgB;;;ACAzB,SAAS,UAAAC,eAAc;AAchB,IAAM,gBAAgBA,QAAmB,CAAC,SAAS;AAAA,EACxD,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,WAAW,MACT,IAAI,CAAC,MAAM;AACT,UAAM,OAAO,EAAE,SAAS;AACxB,WAAO,EAAE,QAAQ,MAAM,QAAQ,OAAO,EAAE;AAAA,EAC1C,CAAC;AAAA,EACH,YAAY,MACV,IAAI,CAAC,MAAM;AACT,UAAM,OAAO,KAAK,IAAI,GAAG,EAAE,SAAS,CAAC;AACrC,WAAO,EAAE,QAAQ,MAAM,QAAQ,OAAO,EAAE;AAAA,EAC1C,CAAC;AACL,EAAE;;;ADtBK,SAAS,kBAAkB,MAAoD;AACpF,QAAM,WAAW,mBAAmB,CAAC,MAAM,EAAE,QAAQ;AACrD,QAAM,SAAS,mBAAmB,CAAC,MAAM,EAAE,MAAM;AACjD,QAAM,WAAW,mBAAmB,CAAC,MAAM,EAAE,QAAQ;AACrD,QAAM,gBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa;AAC/D,QAAM,eAAe,mBAAmB,CAAC,MAAM,EAAE,YAAY;AAC7D,QAAM,iBAAiB,mBAAmB,CAAC,MAAM,EAAE,cAAc;AACjE,QAAM,iBAAiB,mBAAmB,CAAC,MAAM,EAAE,cAAc;AACjE,QAAM,EAAE,QAAQ,UAAU,IAAI,eAAe;AAC7C,QAAM,YAAY,cAAc,CAAC,MAAM,EAAE,MAAM;AAE/C,WAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,MAAM,SAAU;AACpB,QAAI,UAAW;AAGf,QAAI,UAAU;AACZ,UAAI,UAAU,OAAQ,IAAI,QAAQ,UAAU,KAAM;AAChD,cAAM,SAAS;AACf;AAAA,MACF;AACA,UAAI,IAAI,UAAU,UAAU,KAAK;AAC/B,qBAAa;AACb;AAAA,MACF;AACA,UAAI,IAAI,SAAS;AACf,uBAAe,EAAE;AACjB;AAAA,MACF;AACA,UAAI,IAAI,WAAW;AACjB,uBAAe,CAAC;AAChB;AAAA,MACF;AACA,UAAI,IAAI,QAAQ;AACd,uBAAe;AACf;AAAA,MACF;AACA;AAAA,IACF;AAEA,QAAI,UAAU,OAAQ,IAAI,QAAQ,UAAU,KAAM;AAChD,YAAM,SAAS;AACf;AAAA,IACF;AAEA,QAAI,IAAI,QAAQ;AACd,aAAO;AACP;AAAA,IACF;AAEA,QAAI,UAAU,KAAK;AACjB,oBAAc;AACd;AAAA,IACF;AAEA,QAAI,UAAU,KAAK;AACjB,eAAS,QAAQ;AACjB;AAAA,IACF;AAEA,QAAI,UAAU,KAAK;AACjB,gBAAU,WAAW,OAAO,OAAO,IAAI;AACvC;AAAA,IACF;AAAA,EACF,GAAG,EAAE,UAAU,CAAC,MAAM,SAAS,CAAC;AAClC;;;AEtEA,SAAS,QAAQ,WAAW,aAAa;AAQzC,IAAI,SAAyB;AAE7B,eAAsB,yBAA2C;AAC/D,MAAI,WAAW,KAAM,QAAO;AAC5B,MAAI;AACF,UAAM,OAAO,oBAAoB;AACjC,aAAS;AAAA,EACX,QAAQ;AACN,aAAS;AAAA,EACX;AACA,SAAO;AACT;AAEA,eAAsB,yBAAwC;AAC5D,QAAM,eAAe;AACrB,QAAM,MAAM,UAAU,EAAE,WAAW,MAAM,MAAM,IAAM,CAAC;AACtD,QAAM,UAAU,uBAAsB,oBAAI,KAAK,GAAE,YAAY,GAAG;AAAA,IAC9D,UAAU;AAAA,IACV,MAAM;AAAA,EACR,CAAC;AACD,WAAS;AACX;;;AC7BA,SAAgB,aAAAC,kBAAiB;AACjC,SAAS,OAAAC,MAAK,QAAAC,aAAY;;;ACD1B,SAAS,YAAAC,iBAAgB;AASlB,SAAS,aAAa,SAAuB,MAAqB;AACvE,QAAM,WAAW,mBAAmB,CAAC,MAAM,EAAE,QAAQ;AACrD,QAAM,aAAa,MAAM,YAAY;AACrC,EAAAC,UAAS,SAAS,EAAE,GAAG,MAAM,UAAU,cAAc,CAAC,SAAS,CAAC;AAClE;;;ADiBQ,gBAAAC,MAUE,QAAAC,aAVF;AAdD,SAAS,YAAY,EAAE,WAAW,GAAqB;AAC5D,EAAAC,WAAU,MAAM;AACd,WAAO,MAAM;AAAA,IAA6B;AAAA,EAC5C,GAAG,CAAC,CAAC;AAEL,eAAa,CAAC,OAAO,QAAQ;AAC3B,QAAI,IAAI,UAAU,UAAU,OAAO,IAAI,QAAQ;AAC7C,WAAK,uBAAuB,EAAE,QAAQ,UAAU;AAAA,IAClD;AAAA,EACF,CAAC;AAED,SACE,gBAAAD,MAACE,MAAA,EAAI,eAAc,UAAS,UAAU,QAAQ,IAAI,UAAU,QAAQ,IAAI,YAAY,GAClF;AAAA,oBAAAH,KAACG,MAAA,EACC,0BAAAH,KAAC,gBAAa,QAAQ,UAAU,MAAM,MAAI,MAAE,YAAE,eAAe,GAAE,GACjE;AAAA,IAEA,gBAAAA,KAACG,MAAA,EAAI,WAAW,QAAQ,IACtB,0BAAAH,KAACI,OAAA,EAAK,OAAO,OAAO,MAAM,MAAK,QAAQ,YAAE,eAAe,GAAE,GAC5D;AAAA,IAEA,gBAAAH,MAACE,MAAA,EAAI,eAAc,UAAS,WAAW,QAAQ,IAC7C;AAAA,sBAAAH,KAACI,OAAA,EAAK,OAAO,OAAO,OAAQ,YAAE,oBAAoB,GAAE;AAAA,MACpD,gBAAAH,MAACE,MAAA,EAAI,eAAc,UAAS,aAAa,QAAQ,IAC/C;AAAA,wBAAAF,MAACG,OAAA,EAAK;AAAA,0BAAAJ,KAACI,OAAA,EAAK,OAAO,OAAO,MAAM,MAAI,MAAC,eAAC;AAAA,UAAO;AAAA,UAAQ,EAAE,iBAAiB;AAAA,WAAE;AAAA,QAC1E,gBAAAH,MAACG,OAAA,EAAK;AAAA,0BAAAJ,KAACI,OAAA,EAAK,OAAO,OAAO,MAAM,MAAI,MAAE,2BAAM;AAAA,UAAO;AAAA,UAAM,EAAE,iBAAiB;AAAA,WAAE;AAAA,QAC9E,gBAAAH,MAACG,OAAA,EAAK;AAAA,0BAAAJ,KAACI,OAAA,EAAK,OAAO,OAAO,MAAM,MAAI,MAAC,iBAAG;AAAA,UAAO;AAAA,UAAM,EAAE,mBAAmB;AAAA,WAAE;AAAA,QAC5E,gBAAAH,MAACG,OAAA,EAAK;AAAA,0BAAAJ,KAACI,OAAA,EAAK,OAAO,OAAO,MAAM,MAAI,MAAC,mBAAK;AAAA,UAAO;AAAA,UAAI,EAAE,mBAAmB;AAAA,WAAE;AAAA,QAC5E,gBAAAH,MAACG,OAAA,EAAK;AAAA,0BAAAJ,KAACI,OAAA,EAAK,OAAO,OAAO,MAAM,MAAI,MAAC,eAAC;AAAA,UAAO;AAAA,UAAQ,EAAE,mBAAmB;AAAA,WAAE;AAAA,QAC5E,gBAAAH,MAACG,OAAA,EAAK;AAAA,0BAAAJ,KAACI,OAAA,EAAK,OAAO,OAAO,MAAM,MAAI,MAAC,iBAAG;AAAA,UAAO;AAAA,UAAM,EAAE,iBAAiB;AAAA,WAAE;AAAA,QAC1E,gBAAAH,MAACG,OAAA,EAAK;AAAA,0BAAAJ,KAACI,OAAA,EAAK,OAAO,OAAO,MAAM,MAAI,MAAC,eAAC;AAAA,UAAO;AAAA,UAAQ,EAAE,mBAAmB;AAAA,WAAE;AAAA,QAC5E,gBAAAH,MAACG,OAAA,EAAK;AAAA,0BAAAJ,KAACI,OAAA,EAAK,OAAO,OAAO,MAAM,MAAI,MAAC,eAAC;AAAA,UAAO;AAAA,UAAQ,EAAE,iBAAiB;AAAA,WAAE;AAAA,SAC5E;AAAA,OACF;AAAA,IAEA,gBAAAH,MAACE,MAAA,EAAI,eAAc,UAAS,WAAW,QAAQ,IAC7C;AAAA,sBAAAH,KAACI,OAAA,EAAK,OAAO,OAAO,OAAQ,YAAE,mBAAmB,GAAE;AAAA,MACnD,gBAAAJ,KAACG,MAAA,EAAI,aAAa,QAAQ,IACxB,0BAAAH,KAACI,OAAA,EAAK,OAAO,OAAO,eAAe,MAAK,QAAQ,YAAE,kBAAkB,GAAE,GACxE;AAAA,OACF;AAAA,IAEA,gBAAAJ,KAACG,MAAA,EAAI,WAAW,QAAQ,IACtB,0BAAAH,KAACI,OAAA,EAAK,OAAO,OAAO,SAAS,MAAI,MAAE,YAAE,sBAAsB,GAAE,GAC/D;AAAA,KACF;AAEJ;;;AE9DA,SAAS,OAAAC,MAAK,QAAAC,aAAY;AA8ClB,SACA,OAAAC,MADA,QAAAC,aAAA;AAtCR,IAAM,eAAgF;AAAA,EACpF,UAAU,EAAE,OAAO,oBAAoB,MAAM,uBAAuB;AAAA,EACpE,iBAAiB,EAAE,OAAO,mBAAmB,MAAM,sBAAsB;AAAA,EACzE,SAAS,EAAE,OAAO,mBAAmB,MAAM,sBAAsB;AAAA,EACjE,kBAAkB,EAAE,OAAO,oBAAoB,MAAM,uBAAuB;AAAA,EAC5E,MAAM,EAAE,OAAO,gBAAgB,MAAM,mBAAmB;AAAA,EACxD,YAAY,EAAE,OAAO,sBAAsB,MAAM,yBAAyB;AAAA,EAC1E,UAAU,EAAE,OAAO,oBAAoB,MAAM,uBAAuB;AAAA,EACpE,UAAU,EAAE,OAAO,oBAAoB,MAAM,uBAAuB;AACtE;AAMO,SAAS,cAAc,EAAE,OAAO,GAAuB;AAC5D,QAAM,OAAO,aAAa,MAAM;AAChC,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,QAAQ,EAAE,KAAK,KAAK;AAC1B,QAAM,OAAO,WAAW,MAAM;AAC9B,QAAM,YAA4B,OAAO,wBAAwB;AACjE,QAAM,aAA6B,OAAO,wBAAwB;AAClE,QAAM,YAA4B,OAAO,uBAAuB;AAChE,QAAM,WAA2B,OAAO,sBAAsB;AAE9D,SACE,gBAAAD,KAACE,MAAA,EAAI,eAAc,UAAS,YAAW,UAAS,UAAU,QAAQ,IAChE,0BAAAD;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,aAAY;AAAA,MACZ,aAAa,OAAO;AAAA,MACpB,UAAU,QAAQ;AAAA,MAClB,UAAU,QAAQ;AAAA,MAClB,eAAc;AAAA,MACd,YAAW;AAAA,MACX,YAAY;AAAA,MACZ,OAAM;AAAA,MAEN;AAAA,wBAAAD,MAACE,OAAA,EAAK,MAAI,MAAC,OAAO,OAAO,OAAQ;AAAA;AAAA,UAAS;AAAA,UAAE,EAAE,WAAW,EAAE,MAAM,CAAC;AAAA,WAAE;AAAA,QACpE,gBAAAH,KAACG,OAAA,EAAK,OAAO,OAAO,MAAM,MAAK,QAAQ,YAAE,KAAK,IAAI,GAAE;AAAA,QACpD,gBAAAF,MAACC,MAAA,EAAI,eAAc,UAAS,YAAW,UAAS,WAAW,QAAQ,IACjE;AAAA,0BAAAF,KAACG,OAAA,EAAK,OAAO,OAAO,MAAM,MAAI,MAAE,YAAE,UAAU,GAAE;AAAA,UAC9C,gBAAAH,KAACG,OAAA,EAAK,OAAO,OAAO,OAAQ,YAAE,eAAe,GAAE;AAAA,UAC/C,gBAAAH,KAACG,OAAA,EAAK,OAAO,OAAO,KAAK,MAAI,MAAE,YAAE,SAAS,GAAE;AAAA,UAC5C,gBAAAH,KAACG,OAAA,EAAK,OAAO,OAAO,OAAQ,YAAE,sBAAsB,GAAE;AAAA,UACtD,gBAAAH,KAACG,OAAA,EAAK,OAAO,OAAO,SAAS,MAAI,MAAE,YAAE,qBAAqB,GAAE;AAAA,UAC5D,gBAAAH,KAACG,OAAA,EAAK,OAAO,OAAO,OAAQ,YAAE,QAAQ,GAAE;AAAA,WAC1C;AAAA;AAAA;AAAA,EACF,GACF;AAEJ;;;AC5DA,SAAgB,aAAAC,YAAW,WAAAC,gBAAe;AAC1C,SAAS,OAAAC,MAAK,QAAAC,cAAY;;;ACQnB,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA,uBAAuB;AAAA,EACvB,UAAU;AACZ,GAA+B;AAC7B,QAAM,EAAE,QAAQ,cAAc,IAAI,eAAe;AACjD,QAAM,EAAE,MAAM,aAAa,IAAI,gBAAgB;AAC/C,QAAM,gBACJ,gBAAgB,IACZ,gBAAgB,eAChB,eAAe;AAErB,SAAO,KAAK,IAAI,SAAS,KAAK,MAAM,aAAa,CAAC;AACpD;;;ACtBA,SAAS,UAAAC,eAAc;AAKvB,IAAM,0BAA0B,IAAI,KAAK;AAEzC,IAAI,mBAAyC;AAC7C,IAAI,qBAA2C;AAC/C,IAAI,0BAA0B;AA4B9B,SAAS,WAAW,KAAyD,KAAa,OAAgB;AACxG,MAAI,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,CAAC,GAAG,GAAG,MAAM,EAAE,EAAE;AAC1D;AAEA,SAAS,SAAS,KAAyD,KAAa,OAAsB;AAC5G,MAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,GAAG,MAAM,EAAE,EAAE;AACxD;AAEA,SAAS,gBAAgB,KAAyD,KAAa;AAC7F,MAAI,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,EAAE,eAAe,CAAC,GAAG,GAAG,KAAK,IAAI,EAAE,EAAE,EAAE;AAC3E;AAEO,IAAM,eAAeC,QAAkB,CAAC,KAAK,SAAS;AAAA,EAC3D,UAAU,CAAC;AAAA,EACX,OAAO,CAAC;AAAA,EACR,UAAU,EAAE,UAAU,CAAC,GAAG,OAAO,CAAC,EAAE;AAAA,EACpC,UAAU,CAAC;AAAA,EACX,QAAQ;AAAA,EACR,QAAQ,CAAC;AAAA,EACT,gBAAgB,CAAC;AAAA,EACjB,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,EAKb,SAAS,EAAE,WAAW,MAAM,UAAU,MAAM,UAAU,MAAM,QAAQ,MAAM,QAAQ,KAAK;AAAA,EACvF,QAAQ,CAAC;AAAA,EACT,eAAe,CAAC;AAAA,EAEhB,gBAAgB,YAAY;AAC1B,eAAW,KAAK,aAAa,IAAI;AACjC,aAAS,KAAK,aAAa,IAAI;AAC/B,QAAI;AACF,YAAM,SAAS,MAAU,aAAa;AACtC,UAAI,EAAE,UAAU,OAAO,UAAU,OAAO,OAAO,MAAM,CAAC;AAAA,IACxD,SAAS,KAAK;AACZ,eAAS,KAAK,aAAa,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IAC7E,UAAE;AACA,iBAAW,KAAK,aAAa,KAAK;AAClC,sBAAgB,KAAK,WAAW;AAAA,IAClC;AAAA,EACF;AAAA,EAEA,eAAe,YAAY;AACzB,eAAW,KAAK,YAAY,IAAI;AAChC,aAAS,KAAK,YAAY,IAAI;AAC9B,QAAI;AACF,YAAM,SAAS,MAAU,YAAY;AACrC,UAAI,EAAE,UAAU,OAAO,CAAC;AAAA,IAC1B,SAAS,KAAK;AACZ,eAAS,KAAK,YAAY,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IAC5E,UAAE;AACA,iBAAW,KAAK,YAAY,KAAK;AACjC,sBAAgB,KAAK,UAAU;AAAA,IACjC;AAAA,EACF;AAAA,EAEA,eAAe,YAAY;AACzB,eAAW,KAAK,YAAY,IAAI;AAChC,aAAS,KAAK,YAAY,IAAI;AAC9B,QAAI;AACF,YAAM,SAAS,MAAU,YAAY;AACrC,UAAI,EAAE,UAAU,OAAO,CAAC;AAAA,IAC1B,SAAS,KAAK;AACZ,eAAS,KAAK,YAAY,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IAC5E,UAAE;AACA,iBAAW,KAAK,YAAY,KAAK;AACjC,sBAAgB,KAAK,UAAU;AAAA,IACjC;AAAA,EACF;AAAA,EAEA,aAAa,YAAY;AACvB,eAAW,KAAK,UAAU,IAAI;AAC9B,QAAI;AACF,YAAM,SAAS,MAAU,UAAU;AACnC,UAAI,EAAE,QAAQ,OAAO,CAAC;AAAA,IACxB,SAAS,KAAK;AACZ,eAAS,KAAK,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IAC1E,UAAE;AACA,iBAAW,KAAK,UAAU,KAAK;AAC/B,sBAAgB,KAAK,QAAQ;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,aAAa,YAAY;AACvB,QAAI;AACF,YAAM,SAAS,MAAU,UAAU;AACnC,UAAI,EAAE,QAAQ,OAAO,CAAC;AAAA,IACxB,SAAS,KAAK;AAEZ,aAAO,MAAM,sBAAsB,EAAE,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE,CAAC;AAAA,IAChG,UAAE;AACA,sBAAgB,KAAK,QAAQ;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,aAAa,YAAY;AACvB,eAAW,KAAK,UAAU,IAAI;AAC9B,aAAS,KAAK,UAAU,IAAI;AAC5B,QAAI;AACF,YAAM,SAAS,MAAU,UAAU;AACnC,UAAI,EAAE,gBAAgB,OAAO,UAAU,aAAa,OAAO,QAAQ,CAAC;AAAA,IACtE,SAAS,KAAK;AACZ,eAAS,KAAK,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IAC1E,UAAE;AACA,iBAAW,KAAK,UAAU,KAAK;AAC/B,sBAAgB,KAAK,QAAQ;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,UAAU,YAA2B;AACnC,QAAI,kBAAkB;AACpB,aAAO;AAAA,IACT;AAEA,UAAM,MAAM,KAAK,IAAI;AACrB,QAAI,CAAC,sBAAsB,MAAM,0BAA0B,yBAAyB;AAClF,gCAA0B;AAK1B,2BAAyB,WAAW,EACjC,MAAM,CAAC,QAAQ;AAAE,YAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,QAAQ,OAAO,GAAG,EAAE,EAAE,EAAE;AAAA,MAAG,CAAC,EAClF,QAAQ,MAAM;AACb,6BAAqB;AAAA,MACvB,CAAC;AAAA,IACL;AAEA,UAAM,QAAQ,IAAI;AAClB,uBAAmB,QAAQ,IAAI;AAAA,MAC7B,MAAM,eAAe;AAAA,MACrB,MAAM,cAAc;AAAA,MACpB,MAAM,cAAc;AAAA,MACpB,MAAM,YAAY;AAAA,MAClB,MAAM,YAAY;AAAA,MAClB,MAAM,YAAY;AAAA,IACpB,CAAC,EAAE,KAAK,MAAM,MAAS,EACpB,QAAQ,MAAM;AACb,yBAAmB;AAAA,IACrB,CAAC;AAEH,WAAO;AAAA,EACT;AAAA,EAEA,kBAAkB,OAAO,SAAS;AAChC,eAAW,KAAK,UAAU,IAAI;AAC9B,QAAI;AACF,YAAU,iBAAiB,IAAI;AAC/B,YAAM,IAAI,EAAE,eAAe;AAAA,IAC7B,SAAS,KAAK;AACZ,eAAS,KAAK,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IAC1E,UAAE;AACA,iBAAW,KAAK,UAAU,KAAK;AAAA,IACjC;AAAA,EACF;AAAA,EAEA,eAAe,OAAO,MAAM,WAAW;AACrC,eAAW,KAAK,kBAAkB,IAAI;AACtC,QAAI;AACF,YAAU,cAAc,MAAM,MAAM;AACpC,YAAM,IAAI,EAAE,cAAc;AAAA,IAC5B,SAAS,KAAK;AACZ,eAAS,KAAK,kBAAkB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IAClF,UAAE;AACA,iBAAW,KAAK,kBAAkB,KAAK;AAAA,IACzC;AAAA,EACF;AACF,EAAE;;;AC7MF,SAAS,UAAAC,eAAc;;;ACIvB,IAAM,gBAAgB;AAwBtB,SAAS,YAAY,MAAkC;AAErD,QAAM,QAAQ,KAAK,mBAAmB,UAAU,YAAY;AAC5D,MAAI,SAAS,CAAC,YAAY,QAAQ,UAAU,KAAK,EAAE,SAAS,KAAK,GAAG;AAClE,WAAO;AAAA,EACT;AAGA,QAAM,OAAO,KAAK,UAAU,KAAK,CAAC,MAAM,EAAE,SAAS,SAAS;AAC5D,MAAI,MAAM;AACR,UAAM,QAAQ,WAAW,KAAK,KAAK;AACnC,QAAI,SAAS,EAAK,QAAO;AACzB,QAAI,SAAS,EAAK,QAAO;AACzB,QAAI,SAAS,EAAK,QAAO;AACzB,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,MAAuC;AAC9D,aAAW,YAAY,KAAK,YAAY,CAAC,GAAG;AAC1C,eAAW,SAAS,SAAS,UAAU,CAAC,GAAG;AACzC,iBAAW,SAAS,MAAM,UAAU,CAAC,GAAG;AACtC,YAAI,MAAM,MAAO,QAAO,MAAM;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,IAAM,aAAa;AAEnB,eAAe,WACb,UACA,SACuC;AAGvC,QAAM,MAAM,MAAM,eAAe,eAAe;AAAA,IAC9C,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAU,EAAE,QAAQ,CAAC;AAAA,EAClC,GAAG,MAAQ;AAAA,IACT,SAAS,CAAC,MAAM,EAAE,UAAU,OAAO,EAAE,SAAS;AAAA,EAChD,CAAC;AAED,MAAI,CAAC,IAAI,IAAI;AAEX,QAAI,IAAI,WAAW,OAAO,QAAQ,SAAS,GAAG;AAC5C,aAAO,cAAc,QAAQ;AAAA,IAC/B;AACA,UAAM,IAAI,MAAM,kBAAkB,IAAI,MAAM,IAAI,IAAI,UAAU,EAAE;AAAA,EAClE;AAEA,QAAM,OAAQ,MAAM,IAAI,KAAK;AAG7B,MAAI,CAAC,QAAQ,CAAC,MAAM,QAAQ,KAAK,OAAO,GAAG;AACzC,UAAM,IAAI,MAAM,iDAAiD;AAAA,EACnE;AACA,MAAI,KAAK,QAAQ,WAAW,SAAS,QAAQ;AAC3C,UAAM,IAAI,MAAM,uCAAuC,SAAS,MAAM,iBAAiB,KAAK,QAAQ,MAAM,EAAE;AAAA,EAC9G;AAEA,QAAM,SAAS,oBAAI,IAA6B;AAEhD,WAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,UAAM,QAAQ,KAAK,QAAQ,CAAC,GAAG;AAC/B,QAAI,CAAC,SAAS,MAAM,WAAW,EAAG;AAElC,WAAO;AAAA,MACL,SAAS,CAAC,EAAG;AAAA,MACb,MAAM,IAAI,CAAC,OAAO;AAAA,QAChB,IAAI,EAAE;AAAA,QACN,SAAS,EAAE,WAAW;AAAA,QACtB,UAAU,YAAY,CAAC;AAAA,QACvB,cAAc,gBAAgB,CAAC;AAAA,QAC/B,YAAY,EAAE,YAAY,IAAI,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC;AAAA,MAClD,EAAE;AAAA,IACJ;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAe,cACb,UACuC;AACvC,QAAM,SAAS,oBAAI,IAA6B;AAChD,QAAM,SAAmB,CAAC;AAE1B,aAAW,OAAO,UAAU;AAC1B,QAAI;AACF,YAAM,UAAU,MAAM;AAAA,QACpB,CAAC,GAAG;AAAA,QACJ,CAAC,EAAE,SAAS,EAAE,MAAM,IAAI,MAAM,WAAW,UAAU,GAAG,SAAS,IAAI,QAAQ,CAAC;AAAA,MAC9E;AACA,iBAAW,CAAC,GAAG,CAAC,KAAK,QAAS,QAAO,IAAI,GAAG,CAAC;AAAA,IAC/C,SAAS,KAAK;AAEZ,YAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,UAAI,IAAI,SAAS,KAAK,GAAG;AACvB,eAAO,KAAK,WAAW,IAAI,IAAI,KAAK,GAAG,EAAE;AACzC;AAAA,MACF;AAEA,UAAI,IAAI,SAAS,KAAK,GAAG;AACvB,eAAO,KAAK,wCAAwC,EAAE,SAAS,IAAI,KAAK,CAAC;AACzE,cAAM,IAAI,QAAQ,OAAK,WAAW,GAAG,GAAI,CAAC;AAE1C,YAAI;AACF,gBAAM,cAAc,MAAM;AAAA,YACxB,CAAC,GAAG;AAAA,YACJ,CAAC,EAAE,SAAS,EAAE,MAAM,IAAI,MAAM,WAAW,UAAU,GAAG,SAAS,IAAI,QAAQ,CAAC;AAAA,UAC9E;AACA,qBAAW,CAAC,GAAG,CAAC,KAAK,YAAa,QAAO,IAAI,GAAG,CAAC;AAAA,QACnD,QAAQ;AACN,iBAAO,KAAK,sBAAsB,IAAI,IAAI,KAAK,GAAG,EAAE;AAAA,QACtD;AACA;AAAA,MACF;AAEA,aAAO,MAAM,wBAAwB,IAAI,IAAI,KAAK,GAAG,EAAE;AACvD,aAAO,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE;AAAA,IACnC;AAGA,UAAM,IAAI,QAAQ,OAAK,WAAW,GAAG,EAAE,CAAC;AAAA,EAC1C;AAEA,MAAI,OAAO,SAAS,GAAG;AACrB,WAAO,KAAK,wBAAwB,OAAO,MAAM,aAAa,EAAE,QAAQ,OAAO,MAAM,GAAG,CAAC,EAAE,CAAC;AAAA,EAC9F;AAEA,SAAO;AACT;AAEA,eAAsB,qBACpB,UACuC;AAEvC,QAAM,gBAAgB,SAAS;AAAA,IAC7B,CAAC,MAAM,EAAE,WAAW,OAAO,EAAE,YAAY,YAAY,EAAE,QAAQ,KAAK,EAAE,SAAS;AAAA,EACjF;AAEA,QAAM,SAAS,oBAAI,IAA6B;AAGhD,WAAS,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK,YAAY;AACzD,UAAM,QAAQ,cAAc,MAAM,GAAG,IAAI,UAAU;AAInD,UAAM,UAAsB,MAAM,IAAI,CAAC,OAAO;AAAA,MAC5C,SAAS,EAAE,MAAM,EAAE,MAAM,WAAW,UAAU;AAAA,MAC9C,SAAS,EAAE;AAAA,IACb,EAAE;AAEF,UAAM,UAAU,MAAM,WAAW,OAAO,OAAO;AAC/C,eAAW,CAAC,GAAG,CAAC,KAAK,QAAS,QAAO,IAAI,GAAG,CAAC;AAAA,EAC/C;AAEA,SAAO;AACT;;;AC5LA,IAAM,iBAA2C;AAAA,EAC/C,UAAU;AAAA,EACV,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,SAAS;AACX;AAEA,eAAsB,iBACpB,OACA,UACA,OAC+B;AAC/B,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,sBAAsB;AAElD,QAAM,WAAqD,CAAC;AAE5D,aAAW,KAAK,UAAU;AACxB,UAAM,UAAU,EAAE,UAAU,CAAC,GAAG,WAAW,EAAE,SAAS;AACtD,aAAS,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAAA,EACzC;AAEA,aAAW,KAAK,OAAO;AACrB,QAAI,EAAE,WAAW;AACf,eAAS,KAAK,EAAE,MAAM,EAAE,OAAO,SAAS,EAAE,UAAU,CAAC;AAAA,IACvD;AAAA,EACF;AAGA,QAAM,UAAU,MAAM,qBAAqB,QAAQ;AAEnD,QAAM,UAAgC,CAAC;AACvC,MAAI,gBAAgB;AACpB,MAAI,YAAY;AAChB,MAAI,cAAc;AAClB,MAAI,WAAW;AAEf,aAAW,CAAC,MAAM,KAAK,KAAK,SAAS;AACnC,UAAM,MAAM,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AAChD,QAAI,CAAC,IAAK;AAEV,UAAM,cAAc,MAAM;AAAA,MAAiB,CAAC,KAAK,MAC/C,eAAe,EAAE,QAAQ,IAAI,eAAe,GAAG,IAAI,EAAE,WAAW;AAAA,MAChE;AAAA,IACF;AAEA,YAAQ,KAAK;AAAA,MACX,aAAa;AAAA,MACb,kBAAkB,IAAI;AAAA,MACtB,iBAAiB;AAAA,MACjB;AAAA,IACF,CAAC;AAED,eAAW,KAAK,OAAO;AACrB,UAAI,EAAE,aAAa,WAAY;AAAA,eACtB,EAAE,aAAa,OAAQ;AAAA,eACvB,EAAE,aAAa,SAAU;AAAA,eACzB,EAAE,aAAa,MAAO;AAAA,IACjC;AAAA,EACF;AAGA,UAAQ,KAAK,CAAC,GAAG,MAAM,eAAe,EAAE,WAAW,IAAI,eAAe,EAAE,WAAW,CAAC;AAEpF,SAAO;AAAA,IACL,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC,eAAe,SAAS;AAAA,IACxB,oBAAoB,QAAQ;AAAA,IAC5B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AC9EA,OAAO,eAAe;AAUf,SAAS,qBAA8B;AAE5C,MAA4C,MAAe,QAAO;AAGlE,MAAI,UAAU,IAAI,EAAG,QAAO;AAG5B,MAAI,QAAQ,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,WAAW,KAAK,EAAE,SAAS,SAAS,CAAC,EAAG,QAAO;AAG3F,MAAI,QAAQ,IAAI,cAAc,SAAS,WAAW,EAAG,QAAO;AAE5D,SAAO;AACT;;;ACZA,IAAI,iBAAiB;AAEd,SAAS,gBAAyB;AAGvC,SAAO;AACT;AAEO,SAAS,eAAwB;AAEtC,SAAO;AACT;AAEO,SAAS,iBAA0B;AAExC,SAAO;AACT;AAMO,SAAS,gBAAyB;AAEvC,MAAI,cAAc,GAAG;AAAE,qBAAiB;AAAM,WAAO;AAAA,EAAO;AAC5D,MAAI,aAAa,GAAG;AAAE,qBAAiB;AAAM,WAAO;AAAA,EAAO;AAC3D,MAAI,eAAe,GAAG;AAAE,qBAAiB;AAAM,WAAO;AAAA,EAAO;AAC7D,SAAO,CAAC;AACV;;;ACxCA,SAAS,oBAAoB;AAC7B,SAAS,kBAAkB;AAC3B,SAAS,qBAAqB;AAO9B,IAAI,gBAA+B;AAMnC,IAAM,gBACD;AAEL,SAAS,mBAAkC;AACzC,MAAI;AACF,UAAM,aAAa,cAAc,YAAY,GAAG;AAChD,UAAM,UAAU,aAAa,YAAY,OAAO;AAChD,WAAO,WAAW,QAAQ,EAAE,OAAO,OAAO,EAAE,OAAO,KAAK;AAAA,EAC1D,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGA,gBAAgB,iBAAiB;AAa1B,SAAS,uBAAgC;AAC9C,MAAI,kBAAkB,MAAM;AAC1B,WAAO,CAAC;AAAA,EACV;AACA,MAAI;AACF,UAAM,aAAa,cAAc,YAAY,GAAG;AAChD,UAAM,UAAU,aAAa,YAAY,OAAO;AAChD,UAAM,UAAU,WAAW,QAAQ,EAAE,OAAO,OAAO,EAAE,OAAO,KAAK;AACjE,WAAO,YAAY;AAAA,EACrB,QAAQ;AAEN,WAAO,CAAC;AAAA,EACV;AACF;;;AC7CA,IAAM,KAAK,OAAO,aAAa,KAAK,KAAK,GAAG;AAErC,SAAS,QAAQ,QAAyB;AAC/C,SAAO,WAAW;AACpB;AAUO,SAAS,UAAU,SAA6B,QAAgC;AACrF,MAAI,mBAAmB,EAAG,QAAO;AACjC,MAAI,CAAC,qBAAqB,EAAG,QAAO;AACpC,MAAI,CAAC,qBAAqB,EAAG,QAAO;AACpC,MAAI,CAAC,cAAc,EAAG,QAAO;AAE7B,QAAM,cAAc,WAAW;AAC/B,QAAM,gBAAgB,QAAQ,MAAM;AAGpC,MAAI,CAAC,eAAe,CAAC,cAAe,QAAO;AAG3C,MAAI,SAAS;AACX,UAAM,QAAQ,oBAAoB,OAAO;AACzC,QAAI,UAAU,aAAa,UAAU,UAAW,QAAO;AAAA,EACzD;AAEA,SAAO;AACT;;;ANpCA,IAAM,eAAe,KAAK,KAAK;AAWxB,IAAM,mBAAmBC,QAAsB,CAAC,KAAK,SAAS;AAAA,EACnE,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AAAA,EACP,UAAU;AAAA,EAEV,MAAM,OAAO,eAAe,UAAU;AAEpC,UAAM,EAAE,SAAS,SAAS,IAAI,IAAI;AAClC,QAAI,CAAC,gBAAgB,WAAW,YAAY,KAAK,IAAI,IAAI,WAAW,cAAc;AAChF;AAAA,IACF;AAEA,QAAI,EAAE,SAAS,MAAM,OAAO,KAAK,CAAC;AAClC,QAAI;AACF,YAAM,YAAY,aAAa,SAAS;AACxC,UAAI,UAAU,SAAS,WAAW,GAAG;AACnC,cAAM,UAAU,eAAe;AAAA,MACjC;AACA,YAAM,EAAE,UAAU,MAAM,IAAI,aAAa,SAAS;AAClD,YAAM,EAAE,SAAS,OAAO,IAAI,gBAAgB,SAAS;AACrD,YAAM,QAAQ,UAAU,SAAS,MAAM;AACvC,YAAM,SAAS,MAAM,iBAAiB,OAAO,UAAU,KAAK;AAC5D,UAAI,EAAE,SAAS,QAAQ,SAAS,OAAO,UAAU,KAAK,IAAI,EAAE,CAAC;AAAA,IAC/D,SAAS,KAAK;AACZ,UAAI,EAAE,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,GAAG,SAAS,MAAM,CAAC;AAAA,IACjF;AAAA,EACF;AACF,EAAE;;;AO9CF,SAAS,UAAAC,eAAc;AAsBhB,IAAM,mBAAmBC,QAAsB,CAAC,KAAK,SAAS;AAAA,EACnE,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AAAA,EACT,cAAc;AAAA,EACd,OAAO;AAAA,EAEP,MAAM,YAAY;AAChB,QAAI,EAAE,SAAS,MAAM,OAAO,KAAK,CAAC;AAClC,QAAI;AACF,YAAM,SAAS,MAAM,aAAa;AAClC,UAAI,EAAE,QAAQ,SAAS,MAAM,CAAC;AAC9B,UAAI,QAAQ;AACV,aAAK,IAAI,EAAE,aAAa;AAAA,MAC1B;AAAA,IACF,SAAS,KAAK;AACZ,UAAI,EAAE,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,GAAG,SAAS,MAAM,CAAC;AAAA,IACjF;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,WAAW;AACtB,QAAI,EAAE,OAAO,KAAK,CAAC;AACnB,QAAI;AACF,YAAM,aAAa,MAAM;AACzB,UAAI,EAAE,OAAO,CAAC;AAAA,IAChB,SAAS,KAAK;AACZ,UAAI,EAAE,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE,CAAC;AAAA,IACjE;AAAA,EACF;AAAA,EAEA,cAAc,YAAY;AACxB,UAAM,EAAE,OAAO,IAAI,IAAI;AACvB,QAAI,CAAC,OAAQ;AACb,QAAI,EAAE,cAAc,MAAM,OAAO,KAAK,CAAC;AACvC,QAAI;AACF,YAAM,QAAQ,MAAM,aAAa,MAAM;AACvC,UAAI,EAAE,OAAO,cAAc,MAAM,CAAC;AAAA,IACpC,SAAS,KAAK;AACZ,UAAI,EAAE,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,GAAG,cAAc,MAAM,CAAC;AAAA,IACtF;AAAA,EACF;AAAA,EAEA,mBAAmB,OAAO,SAAS;AACjC,QAAI,EAAE,SAAS,MAAM,OAAO,KAAK,CAAC;AAClC,QAAI;AACF,YAAM,SAAS,MAAM,sBAAsB,IAAI;AAC/C,YAAM,aAAa,MAAM;AACzB,UAAI,EAAE,QAAQ,SAAS,MAAM,CAAC;AAC9B,WAAK,IAAI,EAAE,aAAa;AAAA,IAC1B,SAAS,KAAK;AACZ,UAAI,EAAE,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,GAAG,SAAS,MAAM,CAAC;AAAA,IACjF;AAAA,EACF;AACF,EAAE;;;AC3EF,SAAS,UAAAC,eAAc;AA2BhB,IAAM,eAAeC,QAAkB,CAAC,KAAK,SAAS;AAAA,EAC3D,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,WAAW,CAAC;AAAA,EACZ,SAAS;AAAA,EACT,OAAO;AAAA,EAEP,YAAY,OAAO,UAAmB;AACpC,QAAI,CAAC,MAAO;AACZ,QAAI;AACF,YAAM,SAAS,MAAM,eAAe;AACpC,UAAI,EAAE,OAAO,CAAC;AAAA,IAChB,SAAS,KAAK;AACZ,aAAO,KAAK,qCAAqC,EAAE,OAAO,OAAO,GAAG,EAAE,CAAC;AAAA,IACzE;AAAA,EACF;AAAA,EAEA,SAAS,OAAO,OAAgB,aAA8B;AAC5D,QAAI,EAAE,SAAS,MAAM,OAAO,KAAK,CAAC;AAClC,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,OAAO,QAAQ;AACzC,UAAI,OAAO,UAAU,SAAS,GAAG;AAC/B,YAAI,EAAE,WAAW,OAAO,WAAW,YAAY,QAAQ,SAAS,MAAM,CAAC;AAAA,MACzE,OAAO;AACL,cAAM,SAAS,MAAM,eAAe;AACpC,YAAI,EAAE,QAAQ,YAAY,QAAQ,WAAW,CAAC,GAAG,SAAS,MAAM,CAAC;AAAA,MACnE;AAAA,IACF,SAAS,KAAK;AACZ,YAAM,QAAQ,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC7D,UAAI,EAAE,OAAO,SAAS,MAAM,CAAC;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,kBAAkB,OAAO,gBAAgB;AACvC,QAAI,EAAE,SAAS,MAAM,OAAO,KAAK,CAAC;AAClC,QAAI;AACF,YAAM,SAAS,IAAI,EAAE;AACrB,UAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,sBAAsB;AAGnD,YAAM,WAAW,MAAM,iBAAiB;AACxC,UAAI,CAAC,SAAU,OAAM,IAAI,MAAM,oBAAoB;AAEnD,YAAM,UAAU,MAAM,YAAY;AAClC,UAAI,CAAC,QAAS,OAAM,IAAI,MAAM,iBAAiB;AAC/C,YAAM,UAAU,eAAe,SAAS,WAAW,SAAS,IAAI,SAAS,KAAK,QAAQ,GAAG;AACzF,YAAM,yBAAyB,SAAS,aAAa,OAAO,SAAS;AAErE,YAAM,gBAAgB,MAAM,eAAe;AAC3C,UAAI,EAAE,QAAQ,eAAe,WAAW,CAAC,GAAG,SAAS,MAAM,CAAC;AAAA,IAC9D,SAAS,KAAK;AACZ,YAAM,QAAQ,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC7D,UAAI,EAAE,OAAO,SAAS,MAAM,CAAC;AAAA,IAC/B;AAAA,EACF;AACF,EAAE;;;AClFF,SAAS,UAAAC,eAAc;AAgBhB,IAAM,qBAAqBC,QAAwB,CAAC,KAAK,SAAS;AAAA,EACvE,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,OAAO;AAAA,EAEP,cAAc,OAAO,UAAkB,UAAmB;AACxD,QAAI,CAAC,OAAO;AACV,UAAI,EAAE,OAAO,uBAAuB,CAAC;AACrC;AAAA,IACF;AACA,QAAI,EAAE,SAAS,MAAM,OAAO,KAAK,CAAC;AAClC,QAAI;AACF,YAAM,SAAS,MAAM,WAAW,QAAQ;AACxC,UAAI,EAAE,QAAQ,SAAS,MAAM,CAAC;AAAA,IAChC,SAAS,KAAK;AACZ,YAAM,QAAQ,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC7D,UAAI,EAAE,OAAO,SAAS,MAAM,CAAC;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,UAAU,OAAO,UAAmB;AAClC,UAAM,EAAE,OAAO,IAAI,IAAI;AACvB,QAAI,CAAC,OAAQ;AACb,QAAI,EAAE,SAAS,MAAM,OAAO,KAAK,CAAC;AAClC,QAAI;AACF,YAAM,SAAS,MAAM,gBAAgB,QAAQ,KAAK;AAClD,UAAI,EAAE,QAAQ,SAAS,MAAM,CAAC;AAAA,IAChC,SAAS,KAAK;AACZ,YAAM,QAAQ,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC7D,UAAI,EAAE,OAAO,SAAS,MAAM,CAAC;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,aAAa,MAAM,IAAI,EAAE,QAAQ,MAAM,QAAQ,MAAM,OAAO,KAAK,CAAC;AACpE,EAAE;;;AClDF,SAAS,OAAAC,MAAK,QAAAC,aAAY;AAiBtB,SAUE,OAAAC,MAVF,QAAAC,aAAA;AANG,SAAS,SAAS,EAAE,OAAO,OAAO,QAAQ,OAAO,MAAM,GAAkB;AAC9E,QAAM,EAAE,QAAQ,IAAI,gBAAgB;AAEpC,QAAM,OAAO,UAAU,KAAK,KAAK,UAAU,MAAM,KAAK;AAEtD,SACE,gBAAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,aAAY;AAAA,MACZ,aAAa;AAAA,MACb,UAAU,QAAQ;AAAA,MAClB,UAAU,QAAQ;AAAA,MAClB,eAAc;AAAA,MACd,YAAW;AAAA,MACX,YAAY;AAAA,MACZ,UAAU;AAAA,MAEV;AAAA,wBAAAF,KAACG,OAAA,EAAK,MAAI,MAAC,OAAe,iBAAM;AAAA,QAChC,gBAAAH,KAACG,OAAA,EAAK,OAAO,OAAO,OAAQ,iBAAM;AAAA;AAAA;AAAA,EACpC;AAEJ;;;AC/BA,SAAS,OAAAC,MAAK,QAAAC,aAAY;AAC1B,SAAS,eAAe;AAalB,gBAAAC,OAaA,QAAAC,aAbA;AAJC,SAAS,QAAQ,EAAE,QAAQ,GAAiB;AACjD,iBAAe,CAAC,MAAM,EAAE,MAAM;AAC9B,SACE,gBAAAD,MAACE,MAAA,EAAI,UAAU,QAAQ,IACrB,0BAAAF,MAAC,WAAQ,OAAO,WAAW,EAAE,iBAAiB,GAAG,GACnD;AAEJ;AAMO,SAAS,aAAa,EAAE,QAAQ,GAAsB;AAC3D,iBAAe,CAAC,MAAM,EAAE,MAAM;AAC9B,SACE,gBAAAC,MAACC,MAAA,EAAI,UAAU,QAAQ,IACrB;AAAA,oBAAAD,MAACE,OAAA,EAAK,OAAO,OAAO,OAAO,MAAI,MAAE;AAAA;AAAA,MAAS;AAAA,MAAE,EAAE,cAAc;AAAA,OAAE;AAAA,IAC9D,gBAAAH,MAACG,OAAA,EAAK,OAAO,OAAO,OAAQ,mBAAQ;AAAA,KACtC;AAEJ;;;AC/BA,SAAS,QAAAC,aAAY;AAoBZ,iBAAAC,aAAA;AAfT,IAAM,eAAsE;AAAA,EAC1E,SAAS,EAAE,MAAM,UAAU,OAAO,OAAO,QAAQ;AAAA,EACjD,SAAS,EAAE,MAAM,UAAU,OAAO,OAAO,QAAQ;AAAA,EACjD,OAAO,EAAE,MAAM,UAAU,OAAO,OAAO,MAAM;AAAA,EAC7C,MAAM,EAAE,MAAM,UAAU,OAAO,OAAO,KAAK;AAAA,EAC3C,OAAO,EAAE,MAAM,UAAU,OAAO,OAAO,cAAc;AACvD;AAOO,SAAS,YAAY,EAAE,OAAO,QAAQ,GAAqB;AAChE,QAAM,EAAE,MAAM,MAAM,IAAI,aAAa,OAAO;AAC5C,SAAO,gBAAAA,MAACC,OAAA,EAAK,OAAe;AAAA;AAAA,IAAK;AAAA,IAAE;AAAA,KAAM;AAC3C;;;ACrBA,SAAS,OAAAC,MAAK,QAAAC,cAAY;AAgBpB,SAEE,OAAAC,OAFF,QAAAC,aAAA;AAHC,SAAS,cAAc,EAAE,OAAO,OAAO,QAAQ,OAAO,MAAM,UAAU,MAAM,GAAuB;AACxG,SACE,gBAAAA,MAACC,MAAA,EAAI,KAAK,QAAQ,IAChB;AAAA,oBAAAD,MAACE,QAAA,EAAM;AAAA;AAAA,MAAM;AAAA,OAAC;AAAA,IACb,WACC,gBAAAH,MAAC,gBAAa,QAAQ,UAAU,MAAI,MAAE,iBAAM,IAE5C,gBAAAA,MAACG,QAAA,EAAK,MAAI,MAAC,OAAe,iBAAM;AAAA,IAEjC,UAAU,UACT,gBAAAF,MAACE,QAAA,EAAK,OAAO,OAAO,eAAe;AAAA;AAAA,MAAE;AAAA,MAAM;AAAA,OAAC;AAAA,KAEhD;AAEJ;;;AC3BA,SAAS,QAAAC,cAAY;AAWjB,qBAAAC,WAEE,OAAAC,OADA,QAAAC,cADF;AAFG,SAAS,aAAa,EAAE,SAAS,OAAO,GAAsB;AACnE,SACE,gBAAAA,OAAAF,WAAA,EACE;AAAA,oBAAAE,OAACC,QAAA,EAAK,OAAO,OAAO,OAAQ;AAAA,QAAE,mBAAmB;AAAA,MAAE;AAAA,OAAC;AAAA,IACpD,gBAAAF,MAACE,QAAA,EAAK,OAAO,OAAO,OAAQ,mBAAQ;AAAA,IACpC,gBAAAF,MAACE,QAAA,EAAK,OAAO,OAAO,SAAU,4BAAiB;AAAA,IAC/C,gBAAAF,MAACE,QAAA,EAAK,OAAO,OAAO,MAAO,oBAAS;AAAA,IACpC,gBAAAD,OAACC,QAAA,EAAK,OAAO,OAAO,OAAO;AAAA;AAAA,MAAE,EAAE,mBAAmB;AAAA,MAAE;AAAA,OAAC;AAAA,IACrD,gBAAAF,MAACE,QAAA,EAAK,OAAO,OAAO,MAAO,kBAAO;AAAA,KACpC;AAEJ;;;ACnBO,SAAS,YAAY,OAAuB;AACjD,MAAI,CAAC,SAAS,KAAK,KAAK,SAAS,EAAG,QAAO;AAC3C,QAAM,QAAQ,CAAC,KAAK,MAAM,MAAM,MAAM,IAAI;AAC1C,QAAM,IAAI,KAAK,IAAI,KAAK,MAAM,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,IAAI,CAAC,GAAG,MAAM,SAAS,CAAC;AACjF,SAAO,IAAI,QAAQ,KAAK,IAAI,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC;AAC9D;AAEO,SAAS,mBAAmB,WAA2B;AAC5D,MAAI,CAAC,aAAa,CAAC,SAAS,SAAS,EAAG,QAAO,EAAE,cAAc;AAC/D,QAAM,OAAO,KAAK,IAAI,IAAI,MAAO;AACjC,MAAI,OAAO,EAAG,QAAO,EAAE,cAAc;AACrC,MAAI,OAAO,GAAI,QAAO,EAAE,cAAc;AACtC,MAAI,OAAO,KAAM,QAAO,EAAE,mBAAmB,EAAE,GAAG,KAAK,MAAM,OAAO,EAAE,EAAE,CAAC;AACzE,MAAI,OAAO,MAAO,QAAO,EAAE,iBAAiB,EAAE,GAAG,KAAK,MAAM,OAAO,IAAI,EAAE,CAAC;AAC1E,MAAI,OAAO,OAAS,QAAO,EAAE,gBAAgB,EAAE,GAAG,KAAK,MAAM,OAAO,KAAK,EAAE,CAAC;AAC5E,SAAO,EAAE,kBAAkB,EAAE,GAAG,KAAK,MAAM,OAAO,MAAO,EAAE,CAAC;AAC9D;AAEO,SAAS,WAAW,OAAuC;AAChE,QAAM,OAAO,iBAAiB,OAAO,QAAQ,IAAI,KAAK,KAAK;AAC3D,QAAM,SAAS,UAAU;AACzB,SAAO,KAAK,mBAAmB,WAAW,OAAO,UAAU,OAAO;AACpE;;;AlBgBM,gBAAAC,OAQI,QAAAC,cARJ;AAlBN,SAAS,iBAAiB;AACxB,QAAM,WAAW,iBAAiB,CAAC,MAAM,EAAE,OAAO;AAClD,QAAM,QAAQ,iBAAiB,CAAC,MAAM,EAAE,KAAK;AAC7C,QAAM,aAAa,aAAa,CAAC,MAAM,EAAE,MAAM;AAC/C,QAAM,mBAAmB,mBAAmB,CAAC,MAAM,EAAE,MAAM;AAE3D,QAAM,WAAW,WAAW,SAAS,qBAAqB;AAC1D,QAAM,gBAAgB,WAAW,SAAS,gBAAgB;AAE1D,QAAM,aAAa,QAAQ,MAAM,QAAQ;AAEzC,QAAM,WAAW,YAAY,YAAY;AACzC,QAAM,UAAU,WAAW,mBAAmB,IAAI,KAAK,QAAQ,EAAE,QAAQ,IAAI,GAAI,IAAI;AAErF,QAAM,iBAAiB,mBAAmB,iBAAiB,WAAW,SAAS;AAE/E,SACE,gBAAAA,OAACC,MAAA,EAAI,eAAc,UAAS,aAAY,SAAQ,aAAa,OAAO,QAAQ,UAAU,QAAQ,IAAI,UAAU,QAAQ,MAAM,WAAW,QAAQ,IAC3I;AAAA,oBAAAF,MAACG,QAAA,EAAK,MAAI,MAAC,OAAO,OAAO,QAAS,YAAE,sBAAsB,GAAE;AAAA,IAC5D,gBAAAF,OAACC,MAAA,EAAI,KAAK,QAAQ,IAChB;AAAA,sBAAAF,MAACG,QAAA,EAAK,OAAO,OAAO,OAAQ,YAAE,oBAAoB,GAAE;AAAA,MACnD,aAAa,OACZ,gBAAAH,MAACG,QAAA,EAAK,OAAO,OAAO,OAAO,oBAAC,IAC1B,aAAa,IACf,gBAAAH,MAACG,QAAA,EAAK,OAAO,OAAO,SAAU,YAAE,mBAAmB,GAAE,IAErD,gBAAAF,OAACE,QAAA,EAAK,OAAO,OAAO,OACjB;AAAA,UAAE,kBAAkB,EAAE,OAAO,OAAO,QAAQ,EAAE,CAAC;AAAA,QAC/C,iBAAiB,gBAAgB,IAAI,KAAK,aAAa,eAAe;AAAA,SACzE;AAAA,OAEJ;AAAA,IACA,gBAAAF,OAACC,MAAA,EAAI,KAAK,QAAQ,IAChB;AAAA,sBAAAF,MAACG,QAAA,EAAK,OAAO,OAAO,OAAQ,YAAE,oBAAoB,GAAE;AAAA,MACnD,eAAe,OACd,gBAAAH,MAACG,QAAA,EAAK,OAAO,OAAO,OAAO,oBAAC,IAE5B,gBAAAF,OAACE,QAAA,EAAK,OAAO,cAAc,KAAK,OAAO,UAAU,OAAO,SAAU;AAAA;AAAA,QAAW;AAAA,SAAC;AAAA,OAElF;AAAA,IACA,gBAAAF,OAACC,MAAA,EAAI,KAAK,QAAQ,IAChB;AAAA,sBAAAF,MAACG,QAAA,EAAK,OAAO,OAAO,OAAQ,YAAE,gBAAgB,GAAE;AAAA,MAC/C,YAAY,OACX,gBAAAH,MAACG,QAAA,EAAK,OAAO,OAAO,OAAQ,YAAE,sBAAsB,GAAE,IAEtD,gBAAAH,MAACG,QAAA,EAAK,OAAO,OAAO,MAAO,YAAE,sBAAsB,EAAE,MAAM,QAAQ,CAAC,GAAE;AAAA,OAE1E;AAAA,IACA,gBAAAF,OAACC,MAAA,EAAI,KAAK,QAAQ,IAChB;AAAA,sBAAAF,MAACG,QAAA,EAAK,OAAO,OAAO,OAAQ,YAAE,sBAAsB,GAAE;AAAA,MACrD,mBAAmB,OAClB,gBAAAH,MAACG,QAAA,EAAK,OAAO,OAAO,OAAO,oBAAC,IAC1B,mBAAmB,IACrB,gBAAAH,MAACG,QAAA,EAAK,OAAO,OAAO,SAAU,YAAE,yBAAyB,GAAE,IAE3D,gBAAAH,MAACG,QAAA,EAAK,OAAO,OAAO,SAAU,YAAE,mCAAmC,EAAE,OAAO,OAAO,cAAc,EAAE,CAAC,GAAE;AAAA,OAE1G;AAAA,KACF;AAEJ;AAEO,SAAS,gBAAgB;AAG9B,QAAM,WAAW,aAAa,CAAC,MAAM,EAAE,QAAQ;AAC/C,QAAM,QAAQ,aAAa,CAAC,MAAM,EAAE,KAAK;AACzC,QAAM,WAAW,aAAa,CAAC,MAAM,EAAE,QAAQ;AAC/C,QAAM,WAAW,aAAa,CAAC,MAAM,EAAE,QAAQ;AAC/C,QAAM,SAAS,aAAa,CAAC,MAAM,EAAE,MAAM;AAC3C,QAAM,UAAU,aAAa,CAAC,MAAM,EAAE,OAAO;AAC7C,QAAM,SAAS,aAAa,CAAC,MAAM,EAAE,MAAM;AAC3C,QAAM,gBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa;AACzD,QAAM,WAAW,aAAa,CAAC,MAAM,EAAE,QAAQ;AAC/C,QAAM,QAAQ,gBAAgB,CAAC,MAAM,EAAE,KAAK;AAC5C,QAAM,EAAE,QAAQ,IAAI,gBAAgB;AAGpC,QAAM,YAAY,eAAe;AAAA,IAC/B,cAAc;AAAA,IACd,sBAAsB;AAAA,IACtB,SAAS;AAAA,EACX,CAAC;AACD,QAAM,WAAW,KAAK,IAAI,GAAG,KAAK,MAAM,YAAY,CAAC,CAAC;AAEtD,EAAAC,WAAU,MAAM;AAAE,aAAS;AAAA,EAAG,GAAG,CAAC,CAAC;AAInC,eAAa,CAAC,UAAU;AACtB,QAAI,UAAU,OAAO,UAAU,OAAO,UAAU,KAAK;AACnD,WAAK,SAAS;AAAA,IAChB;AAAA,EACF,CAAC;AAED,QAAM,mBAAmBC;AAAA,IACvB,MAAM,SAAS,OAAO,CAAC,MAAM,EAAE,WAAW,OAAO;AAAA,IACjD,CAAC,QAAQ;AAAA,EACX;AACA,QAAM,kBAAkBA;AAAA,IACtB,MAAM,SAAS,OAAO,CAAC,MAAM,EAAE,WAAW,SAAS,EAAE;AAAA,IACrD,CAAC,QAAQ;AAAA,EACX;AACA,QAAM,gBAAgB,iBAAiB;AACvC,QAAM,gBAAgB;AAAA,IACpB,OAAO,WAAW,EAAE,OAAO,EAAE,oBAAoB,GAAG,SAAS,OAAO,SAAS,IAAI;AAAA,IACjF,OAAO,WAAW,EAAE,OAAO,EAAE,oBAAoB,GAAG,SAAS,OAAO,SAAS,IAAI;AAAA,IACjF,OAAO,SAAS,EAAE,OAAO,EAAE,sBAAsB,GAAG,SAAS,OAAO,OAAO,IAAI;AAAA,EACjF,EAAE,OAAO,CAAC,SAAqD,SAAS,IAAI;AAC5E,QAAM,gBAAgB,QAAQ,WAC1B,QACA,OAAO,WACL,EAAE,qBAAqB,IACvB,SAAS,SAAS,SAAS,SAAS,MAAM;AAChD,QAAM,gBAAgB,QAAQ,WAC1B,QACA,OAAO,WACL,EAAE,qBAAqB,IACvB,GAAG,eAAe,IAAI,SAAS,MAAM;AAG3C,QAAM,cAAc,cAAc,YAC9B,mBAAmB,cAAc,YAAY,GAAI,IACjD;AAEJ,MAAI,QAAQ,UAAW,QAAO,gBAAAL,MAAC,WAAQ,SAAS,EAAE,sBAAsB,GAAG;AAC3E,MAAI,OAAO,WAAW;AACpB,WACE,gBAAAC,OAACC,MAAA,EAAI,eAAc,UACjB;AAAA,sBAAAF,MAAC,gBAAa,SAAS,OAAO,WAAW;AAAA,MACzC,gBAAAA,MAACE,MAAA,EAAI,WAAW,QAAQ,IACtB,0BAAAD,OAACE,QAAA,EAAK,OAAO,OAAO,eAAe;AAAA;AAAA,QAAG,EAAE,cAAc;AAAA,SAAE,GAC1D;AAAA,OACF;AAAA,EAEJ;AAGA,QAAM,WAAW,UAAU;AAE3B,SACE,gBAAAF,OAACC,MAAA,EAAI,eAAc,UAAS,KAAK,QAAQ,IACvC;AAAA,oBAAAF,MAAC,iBAAc,OAAO,aAAa,OAAO,EAAE,oBAAoB,GAAG,UAAU,UAAU,MAAM;AAAA,IAE7F,gBAAAC,OAACC,MAAA,EAAI,KAAK,QAAQ,IAAI,UAAS,QAAO,eAAe,WAAW,WAAW,OACzE;AAAA,sBAAAF,MAAC,YAAS,OAAO,EAAE,oBAAoB,GAAG,OAAO,SAAS,QAAQ,OAAO,OAAO,MAAM;AAAA,MACtF,gBAAAA,MAAC,YAAS,OAAO,EAAE,iBAAiB,GAAG,OAAO,MAAM,QAAQ,OAAO,OAAO,QAAQ;AAAA,MAClF,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,EAAE,oBAAoB;AAAA,UAC7B,OAAO;AAAA,UACP,OAAO,OAAO,kBAAkB,YAAY,gBAAgB,IAAI,OAAO,UAAW,OAAO,WAAW,OAAO,QAAQ,OAAO;AAAA;AAAA,MAC5H;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,EAAE,oBAAoB;AAAA,UAC7B,OAAO;AAAA,UACP,OAAO,OAAO,YAAY,gBAAgB,IAAI,OAAO,QAAQ,OAAO;AAAA;AAAA,MACtE;AAAA,OACF;AAAA,IAGC,eACC,gBAAAA,MAACG,QAAA,EAAK,OAAO,OAAO,OAAQ,YAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC,GAAE;AAAA,IAG/E,cAAc,SAAS,KACtB,gBAAAF,OAACC,MAAA,EAAI,eAAc,UAAS,aAAY,SAAQ,aAAa,OAAO,SAAS,UAAU,QAAQ,IAAI,UAAU,QAAQ,MACnH;AAAA,sBAAAF,MAACG,QAAA,EAAK,OAAO,OAAO,SAAS,MAAI,MAAE,YAAE,uBAAuB,GAAE;AAAA,MAC7D,cAAc,IAAI,CAAC,SAClB,gBAAAF,OAACE,QAAA,EAAsB,OAAO,OAAO,OAClC;AAAA,aAAK;AAAA,QAAM;AAAA,QAAG,KAAK;AAAA,WADX,KAAK,KAEhB,CACD;AAAA,OACH;AAAA,IAGD,UAAU,CAAC,OAAO,UACjB,gBAAAF,OAACC,MAAA,EAAI,eAAc,UACjB;AAAA,sBAAAF,MAAC,iBAAc,OAAO,gBAAgB,OAAO,EAAE,sBAAsB,GAAG,UAAU,CAAC,OAAO,MAAM,OAAO,KAAK,GAAG;AAAA,MAC/G,gBAAAC,OAACC,MAAA,EAAI,aAAY,SAAQ,aAAa,OAAO,MAAM,UAAU,QAAQ,IAAI,UAAU,QAAQ,MAAM,eAAc,UAAS,WAAW,QAAQ,IACzI;AAAA,wBAAAD,OAACE,QAAA,EAAK;AAAA,0BAAAH,MAACG,QAAA,EAAK,OAAO,OAAO,OAAQ,YAAE,oBAAoB,GAAE;AAAA,UAAO;AAAA,UAAE,OAAO;AAAA,WAAiB;AAAA,QAC3F,gBAAAF,OAACE,QAAA,EAAK;AAAA,0BAAAH,MAACG,QAAA,EAAK,OAAO,OAAO,OAAQ,YAAE,kBAAkB,GAAE;AAAA,UAAO;AAAA,UAAI,OAAO;AAAA,WAAgB;AAAA,QAC1F,gBAAAF,OAACE,QAAA,EAAK;AAAA,0BAAAH,MAACG,QAAA,EAAK,OAAO,OAAO,OAAQ,YAAE,mBAAmB,GAAE;AAAA,UAAO;AAAA,UAAG,OAAO;AAAA,WAAY;AAAA,SACxF;AAAA,OACF;AAAA,IAGD,CAAC,OAAO,YAAY,SAAS,SAAS,SAAS,KAC9C,gBAAAF,OAACC,MAAA,EAAI,eAAc,UAAS,WAAW,QAAQ,IAC7C;AAAA,sBAAAF,MAAC,iBAAc,OAAO,aAAa,OAAO,EAAE,4BAA4B,GAAG,UAAU,UAAU,MAAM;AAAA,MACrG,gBAAAC,OAACC,MAAA,EAAI,aAAa,QAAQ,IAAI,eAAc,UACzC;AAAA,iBAAS,SAAS,MAAM,GAAG,QAAQ,EAAE,IAAI,CAAC,QACzC,gBAAAD,OAACC,MAAA,EAAmB,KAAK,QAAQ,IAC/B;AAAA,0BAAAF,MAACG,QAAA,EAAK,OAAO,OAAO,MAAO,cAAI,MAAK;AAAA,UACpC,gBAAAH,MAAC,gBAAa,SAAS,IAAI,mBAAmB,CAAC,KAAK,IAAI,QAAQ,IAAI,iBAAiB;AAAA,aAF7E,IAAI,IAGd,CACD;AAAA,QACA,SAAS,SAAS,SAAS,YAC1B,gBAAAA,MAACG,QAAA,EAAK,OAAO,OAAO,eAAe,QAAM,MAAE,YAAE,kBAAkB,EAAE,OAAO,SAAS,SAAS,SAAS,SAAS,CAAC,GAAE;AAAA,SAEnH;AAAA,OACF;AAAA,IAGD,CAAC,OAAO,YAAY,gBAAgB,KACnC,gBAAAF,OAACC,MAAA,EAAI,eAAc,UAAS,WAAW,QAAQ,IAC7C;AAAA,sBAAAF,MAAC,iBAAc,OAAO,gBAAgB,OAAO,EAAE,yBAAyB,GAAG,OAAO,OAAO,OAAO;AAAA,MAChG,gBAAAC,OAACC,MAAA,EAAI,aAAa,QAAQ,IAAI,eAAc,UACzC;AAAA,yBAAiB,MAAM,GAAG,QAAQ,EAAE,IAAI,CAAC,MACxC,gBAAAD,OAACC,MAAA,EAAiB,KAAK,QAAQ,IAC7B;AAAA,0BAAAF,MAAC,eAAY,OAAO,EAAE,aAAa,GAAG,SAAQ,SAAQ;AAAA,UACtD,gBAAAA,MAACG,QAAA,EAAM,YAAE,MAAK;AAAA,UACb,EAAE,aAAa,QAAQ,gBAAAH,MAACG,QAAA,EAAK,OAAO,OAAO,OAAQ,YAAE,eAAe,EAAE,MAAM,EAAE,UAAU,CAAC,GAAE;AAAA,aAHpF,EAAE,IAIZ,CACD;AAAA,QACA,iBAAiB,SAAS,YACzB,gBAAAH,MAACG,QAAA,EAAK,OAAO,OAAO,eAAe,QAAM,MAAE,YAAE,kBAAkB,EAAE,OAAO,iBAAiB,SAAS,SAAS,CAAC,GAAE;AAAA,SAElH;AAAA,OACF;AAAA,IAGD,MAAM,KAAK,gBAAAH,MAAC,kBAAe;AAAA,KAC9B;AAEJ;;;AmBtPA,SAAgB,YAAAM,WAAU,WAAAC,UAAS,aAAAC,YAAW,UAAAC,eAAc;AAC5D,SAAS,OAAAC,OAAK,QAAAC,cAA6B;;;ACD3C,SAAS,YAAAC,WAAU,aAAAC,kBAAiB;AAE7B,SAAS,YAAe,OAAU,SAAoB;AAC3D,QAAM,CAAC,WAAW,YAAY,IAAID,UAAS,KAAK;AAEhD,EAAAC,WAAU,MAAM;AACd,UAAM,QAAQ,WAAW,MAAM,aAAa,KAAK,GAAG,OAAO;AAC3D,WAAO,MAAM,aAAa,KAAK;AAAA,EACjC,GAAG,CAAC,OAAO,OAAO,CAAC;AAEnB,SAAO;AACT;;;ACXA,SAAS,YAAAC,WAAU,aAAa,UAAAC,SAAQ,aAAAC,kBAAiB;AAMzD,IAAM,YAAY;AAElB,eAAe,aAAa,MAAgB,SAAkB,OAAqC;AACjG,QAAM,WAAW,aAAa,IAAI;AAClC,MAAI,CAAC,SAAU;AAEf,MAAI;AACF,UAAM,QAAQ,gBAAgB,SAAS,EAAE,MAAM;AAC/C,UAAM,EAAE,aAAAC,aAAY,IAAI,MAAM,OAAO,8BAAkC;AACvE,UAAMA,aAAY,OAAO,SAAS,QAAQ,SAAS,aAAa,SAAS,KAAK;AAAA,EAChF,QAAQ;AAAA,EAER;AACF;AAWO,SAAS,gBAAiC;AAC/C,QAAM,CAAC,OAAO,QAAQ,IAAIC,UAAmB,CAAC,CAAC;AAC/C,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAS,KAAK;AAChD,QAAM,CAAC,OAAOC,SAAQ,IAAID,UAAwB,IAAI;AACtD,QAAM,YAAYE,QAAO,KAAK;AAC9B,QAAM,eAAeA,QAAsC,IAAI;AAC/D,QAAM,aAAaA,QAAO,IAAI;AAE9B,EAAAC,WAAU,MAAM;AACd,eAAW,UAAU;AACrB,WAAO,MAAM;AACX,iBAAW,UAAU;AACrB,mBAAa,SAAS,OAAO,MAAS;AACtC,mBAAa,UAAU;AAAA,IACzB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,MAAM,YAAY,OAAO,SAAmB;AAChD,QAAI,CAAC,WAAW,QAAS;AACzB,iBAAa,IAAI;AACjB,IAAAF,UAAS,IAAI;AACb,aAAS,CAAC,CAAC;AACX,cAAU,UAAU;AAEpB,UAAM,MAAM,WAAW,IAAI;AAC3B,iBAAa,UAAU;AAEvB,QAAI,cAA6B;AAEjC,QAAI;AACF,uBAAiB,QAAQ,KAAK;AAC5B,YAAI,UAAU,QAAS;AACvB,YAAI,WAAW,SAAS;AACtB,mBAAS,CAAC,SAAS,CAAC,GAAG,KAAK,MAAM,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;AAAA,QAC5D;AAAA,MACF;AAAA,IACF,SAAS,KAAK;AACZ,oBAAc,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC7D,UAAI,CAAC,UAAU,WAAW,WAAW,SAAS;AAC5C,QAAAA,UAAS,WAAW;AAAA,MACtB;AAAA,IACF,UAAE;AACA,mBAAa,UAAU;AACvB,UAAI,WAAW,SAAS;AACtB,qBAAa,KAAK;AAAA,MACpB;AAAA,IACF;AAGA,QAAI,CAAC,UAAU,SAAS;AACtB,WAAK,aAAa,MAAM,gBAAgB,MAAM,WAAW;AAAA,IAC3D;AAGA,UAAM,oBAAoB,oBAAI,IAAI,CAAC,WAAW,aAAa,WAAW,OAAO,SAAS,OAAO,OAAO,CAAC;AACrG,QAAI,CAAC,UAAU,WAAW,kBAAkB,IAAI,KAAK,CAAC,KAAK,EAAE,GAAG;AAC9D,WAAK,OAAO,wBAAmC,EAAE,KAAK,CAAC,EAAE,iBAAAG,kBAAiB,cAAAC,cAAa,MAAM;AAC3F,QAAAD,iBAAgB,EACb,KAAK,CAAC,MAAMC,cAAa,CAAC,CAAC,EAC3B,MAAM,CAAC,QAAQ,OAAO,KAAK,iCAAiC,EAAE,OAAO,OAAO,GAAG,EAAE,CAAC,CAAC;AAAA,MACxF,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,SAAS,YAAY,MAAM;AAC/B,cAAU,UAAU;AACpB,iBAAa,SAAS,OAAO,MAAS;AACtC,iBAAa,UAAU;AAAA,EACzB,GAAG,CAAC,CAAC;AAEL,QAAM,QAAQ,YAAY,MAAM;AAC9B,aAAS,CAAC,CAAC;AACX,IAAAJ,UAAS,IAAI;AAAA,EACf,GAAG,CAAC,CAAC;AAEL,SAAO,EAAE,OAAO,WAAW,OAAO,KAAK,QAAQ,MAAM;AACvD;;;ACzGA,SAAS,OAAAK,OAAK,QAAAC,cAAY;AAC1B,SAAS,iBAAiB;AAepB,SAEE,OAAAC,OAFF,QAAAC,cAAA;AAJC,SAAS,YAAY,EAAE,cAAc,UAAU,aAAa,WAAW,KAAK,GAAqB;AACtG,QAAM,sBAAsB,eAAe,EAAE,yBAAyB;AACtE,SACE,gBAAAA,OAACC,OAAA,EACC;AAAA,oBAAAD,OAACE,QAAA,EAAK,OAAO,OAAO,MAAO;AAAA;AAAA,MAAY;AAAA,OAAC;AAAA,IACvC,WACC,gBAAAH;AAAA,MAAC;AAAA;AAAA,QACC,aAAa;AAAA,QACb;AAAA,QACA;AAAA;AAAA,IACF,IAEA,gBAAAA,MAACG,QAAA,EAAK,OAAO,OAAO,eAAgB,0BAAgB,aAAY;AAAA,KAEpE;AAEJ;;;AC7BA,SAAgB,aAAAC,kBAAiB;AACjC,SAAS,OAAAC,OAAK,QAAAC,QAAM,YAAAC,iBAAgB;AA8B9B,gBAAAC,OACA,QAAAC,cADA;AAlBC,SAAS,cAAc,EAAE,SAAS,WAAW,SAAS,GAAuB;AAClF,QAAM,SAAS,eAAe,CAAC,MAAM,EAAE,MAAM;AAC7C,QAAM,EAAE,WAAW,WAAW,IAAI,cAAc;AAEhD,EAAAC,WAAU,MAAM;AACd,cAAU;AACV,WAAO,MAAM;AAAE,iBAAW;AAAA,IAAG;AAAA,EAC/B,GAAG,CAAC,CAAC;AAEL,EAAAC,UAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,UAAU,OAAO,UAAU,IAAK,WAAU;AAAA,aACrC,WAAW,SAAS,UAAU,OAAO,UAAU,KAAM,WAAU;AAAA,aAC/D,UAAU,OAAO,UAAU,IAAK,UAAS;AAAA,aACzC,IAAI,OAAQ,UAAS;AAAA,EAChC,CAAC;AAED,SACE,gBAAAF,OAACG,OAAA,EAAI,aAAY,UAAS,aAAa,OAAO,QAAQ,UAAU,QAAQ,IAAI,UAAU,QAAQ,IAAI,eAAc,UAAS,YAAY,GACnI;AAAA,oBAAAJ,MAACK,QAAA,EAAK,MAAI,MAAC,OAAO,OAAO,MAAM,MAAK,QAAQ,mBAAQ;AAAA,IACpD,gBAAAJ,OAACG,OAAA,EAAI,WAAW,QAAQ,IACtB;AAAA,sBAAAJ,MAACK,QAAA,EAAK,OAAO,OAAO,SAAU,YAAE,aAAa,GAAE;AAAA,MAC/C,gBAAAL,MAACK,QAAA,EAAK,iBAAG;AAAA,MACT,gBAAAL,MAACK,QAAA,EAAK,OAAO,OAAO,OAAQ,YAAE,YAAY,GAAE;AAAA,OAC9C;AAAA,KACF;AAEJ;;;ACtCA,SAAS,OAAAC,OAAK,QAAAC,cAAY;AAC1B,SAAS,WAAAC,gBAAe;AAoBA,gBAAAC,OACd,QAAAC,cADc;AARjB,SAAS,YAAY,EAAE,OAAO,WAAW,OAAO,aAAa,GAAG,GAAqB;AAC1F,QAAM,QAAQ,KAAK,IAAI,GAAG,MAAM,SAAS,UAAU;AACnD,QAAM,UAAU,MAAM,MAAM,KAAK;AAEjC,SACE,gBAAAA,OAACC,OAAA,EAAI,eAAc,UAAS,aAAY,SAAQ,aAAa,OAAO,KAAK,UAAU,QAAQ,IACxF;AAAA,aACC,gBAAAD,OAACC,OAAA,EAAI,cAAc,QAAQ,IACxB;AAAA,mBAAa,gBAAAF,MAACG,UAAA,EAAQ,OAAM,IAAG;AAAA,MAChC,gBAAAF,OAACG,QAAA,EAAK,MAAI,MAAC,OAAO,OAAO,KAAK;AAAA;AAAA,QAAE;AAAA,SAAM;AAAA,OACxC;AAAA,IAED,QAAQ,IAAI,CAAC,MAAM;AAAA;AAAA;AAAA;AAAA,MAIlB,gBAAAJ,MAACI,QAAA,EAA8B,OAAO,OAAO,OAAO,MAAK,QAAQ,kBAAtD,OAAO,QAAQ,CAAC,EAA2C;AAAA,KACvE;AAAA,IACA,MAAM,WAAW,KAAK,CAAC,aACtB,gBAAAJ,MAACI,QAAA,EAAK,OAAO,OAAO,eAAe,QAAM,MAAE,YAAE,mBAAmB,GAAE;AAAA,KAEtE;AAEJ;;;ACpCA,SAAS,OAAAC,OAAK,QAAAC,cAAY;AAmBpB,gBAAAC,aAAA;AAVN,IAAM,gBAAwC;AAAA,EAC5C,SAAS,OAAO;AAAA,EAChB,OAAO,OAAO;AAAA,EACd,SAAS,OAAO;AAAA,EAChB,MAAM,OAAO;AACf;AAEO,SAAS,aAAa,EAAE,QAAQ,QAAQ,GAAsB;AACnE,SACE,gBAAAA,MAACC,OAAA,EAAI,aAAY,SAAQ,aAAa,cAAc,MAAM,GAAG,UAAU,QAAQ,IAAI,UAAU,QAAQ,MACnG,0BAAAD,MAACE,QAAA,EAAK,OAAO,cAAc,MAAM,GAAG,MAAI,MAAE,mBAAQ,GACpD;AAEJ;;;ACtBA,SAAS,OAAAC,OAAK,QAAAC,cAAY;AAWtB,SACE,OAAAC,OADF,QAAAC,cAAA;AAFG,SAAS,cAAc,EAAE,WAAW,UAAU,MAAM,EAAE,GAAuB;AAClF,SACE,gBAAAA,OAACC,OAAA,EAAI,KACH;AAAA,oBAAAF,MAACG,QAAA,EAAK,OAAO,YAAY,OAAO,UAAU,OAAO,OAC9C,sBAAY,WAAW,KAC1B;AAAA,IACC;AAAA,KACH;AAEJ;;;APgIgC,gBAAAC,OAatB,QAAAC,cAbsB;AA3HzB,SAAS,gBAAgB;AAC9B,QAAM,WAAW,aAAa,CAAC,MAAM,EAAE,QAAQ;AAC/C,QAAM,QAAQ,aAAa,CAAC,MAAM,EAAE,KAAK;AACzC,QAAM,UAAU,aAAa,CAAC,MAAM,EAAE,OAAO;AAC7C,QAAM,SAAS,aAAa,CAAC,MAAM,EAAE,MAAM;AAC3C,QAAM,iBAAiB,aAAa,CAAC,MAAM,EAAE,cAAc;AAC3D,QAAM,WAAW,mBAAmB,CAAC,MAAM,EAAE,QAAQ;AACrD,QAAM,gBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa;AAC/D,QAAM,EAAE,WAAW,WAAW,IAAI,cAAc;AAEhD,QAAM,eAAeC,QAAmB,IAAI;AAC5C,QAAM,EAAE,OAAO,eAAe,IAAI,iBAAiB,YAAY;AAE/D,QAAM,UAAU,iBAAiB,IAAI,iBAAiB;AACtD,QAAM,OAAO,cAAc,OAAO;AAQlC,QAAM,YAAY,SAAS,WACvB,KAAK;AAAA,IAAI;AAAA,IAAG,UAAU;AAAA;AAAA,EAAoB,IAC1C,KAAK,IAAI,IAAI,KAAK,MAAM,UAAU,IAAI,CAAC;AAC3C,QAAM,eAAe,KAAK,IAAI,GAAG,KAAK,MAAM,UAAU,IAAI,CAAC;AAE3D,QAAM,CAAC,QAAQ,SAAS,IAAIC,UAAS,EAAE;AACvC,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAS,CAAC;AACtC,QAAM,CAAC,KAAK,MAAM,IAAIA,UAA+B,UAAU;AAC/D,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAS,KAAK;AACpD,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA,UAAwB,IAAI;AAC5E,QAAM,kBAAkB,YAAY,QAAQ,GAAG;AAC/C,QAAM,SAAS,cAAc;AAE7B,QAAM,WAAW,eAAe;AAAA,IAC9B,cAAc,cAAc,KAAK;AAAA,IACjC,sBAAsB,cAAc,KAAK;AAAA,IACzC,SAAS;AAAA,EACX,CAAC;AACD,QAAM,aAAa,eAAe;AAAA,IAChC,cAAc;AAAA,IACd,sBAAsB;AAAA,IACtB,SAAS;AAAA,EACX,CAAC;AAED,EAAAC,WAAU,MAAM;AAAE,mBAAe;AAAA,EAAG,GAAG,CAAC,CAAC;AAEzC,EAAAA,WAAU,MAAM;AACd,QAAI,aAAa;AACf,gBAAU;AACV,aAAO,MAAM;AAAE,mBAAW;AAAA,MAAG;AAAA,IAC/B;AACA,WAAO;AAAA,EACT,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,WAA8BC,SAAQ,MAAM;AAChD,UAAM,QAAQ,QAAQ,aAClB,oBAAoB,QAAQ,IAC5B,iBAAiB,KAAK;AAE1B,QAAI,CAAC,gBAAiB,QAAO;AAC7B,UAAM,QAAQ,gBAAgB,YAAY;AAC1C,WAAO,MAAM;AAAA,MAAO,CAAC,MACnB,EAAE,KAAK,YAAY,EAAE,SAAS,KAAK,KAAK,EAAE,KAAK,YAAY,EAAE,SAAS,KAAK;AAAA,IAC7E;AAAA,EACF,GAAG,CAAC,UAAU,OAAO,KAAK,eAAe,CAAC;AAE1C,eAAa,CAAC,OAAO,QAAQ;AAC3B,QAAI,iBAAkB;AAKtB,QAAI,OAAO,WAAW;AACpB,UAAI,IAAI,OAAQ,QAAO,OAAO;AAC9B;AAAA,IACF;AAGA,QAAI,OAAO,MAAM,SAAS,GAAG;AAC3B,UAAI,IAAI,QAAQ;AACd,eAAO,MAAM;AACb,aAAK,eAAe;AAAA,MACtB;AACA;AAAA,IACF;AAEA,QAAI,aAAa;AACf,UAAI,IAAI,QAAQ;AACd,uBAAe,KAAK;AACpB,kBAAU,EAAE;AAAA,MACd;AACA;AAAA,IACF;AAEA,QAAI,UAAU,KAAK;AACjB,qBAAe,IAAI;AACnB;AAAA,IACF;AAEA,SAAK,UAAU,OAAO,UAAU,QAAQ,SAAS,MAAM,GAAG;AACxD,0BAAoB,SAAS,MAAM,EAAE,IAAI;AACzC;AAAA,IACF;AAEA,QAAI,UAAU,OAAO,IAAI,WAAW;AAClC,gBAAU,CAAC,MAAM,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,GAAG,SAAS,SAAS,CAAC,CAAC,CAAC;AAAA,IACpE,WAAW,UAAU,OAAO,IAAI,SAAS;AACvC,gBAAU,CAAC,MAAM,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC;AAAA,IACrC,WAAW,UAAU,KAAK;AACxB,gBAAU,CAAC;AAAA,IACb,WAAW,UAAU,KAAK;AACxB,gBAAU,KAAK,IAAI,SAAS,SAAS,GAAG,CAAC,CAAC;AAAA,IAC5C,WAAW,IAAI,UAAU,SAAS,MAAM,GAAG;AACzC,oBAAc,SAAS,MAAM,EAAE,MAAM,QAAQ,aAAa,YAAY,MAAM;AAC5E,eAAS,cAAc;AAAA,IACzB,WAAW,UAAU,OAAO,UAAU,KAAK;AACzC,aAAO,CAACC,OAAMA,OAAM,aAAa,UAAU,UAAU;AACrD,gBAAU,CAAC;AAAA,IACb;AAAA,EACF,GAAG,EAAE,UAAU,KAAK,CAAC;AAErB,MAAI,QAAQ,UAAW,QAAO,gBAAAN,MAAC,WAAQ,SAAS,EAAE,mBAAmB,GAAG;AACxE,MAAI,OAAO,UAAW,QAAO,gBAAAA,MAAC,gBAAa,SAAS,OAAO,WAAW;AAEtE,MAAI,OAAO,aAAa,OAAO,MAAM,SAAS,GAAG;AAC/C,WACE,gBAAAC,OAACM,OAAA,EAAI,eAAc,UACjB;AAAA,sBAAAP;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,OAAO;AAAA,UACd,WAAW,OAAO;AAAA,UAClB,OAAO,EAAE,wBAAwB,EAAE,MAAM,MAAM,CAAC;AAAA,UAChD,YAAY;AAAA;AAAA,MACd;AAAA,MACC,OAAO,aACN,gBAAAC,OAACO,QAAA,EAAK,OAAO,OAAO,eAAe;AAAA;AAAA,QAAK,EAAE,aAAa;AAAA,SAAE;AAAA,MAE1D,CAAC,OAAO,aACP,gBAAAP,OAACM,OAAA,EAAI,eAAc,UAAS,WAAW,QAAQ,IAC7C;AAAA,wBAAAP;AAAA,UAAC;AAAA;AAAA,YACC,QAAQ,OAAO,QAAQ,UAAU;AAAA,YACjC,SAAS,OAAO,QAAQ,UAAU,OAAO,KAAK,KAAK,UAAU,EAAE,cAAc,CAAC;AAAA;AAAA,QAChF;AAAA,QACA,gBAAAC,OAACO,QAAA,EAAK,OAAO,OAAO,eAAe;AAAA;AAAA,UAAK,EAAE,WAAW;AAAA,WAAE;AAAA,SACzD;AAAA,OAEJ;AAAA,EAEJ;AAEA,QAAM,mBAAmB;AACzB,QAAM,QAAQ,KAAK,IAAI,GAAG,SAAS,KAAK,MAAM,mBAAmB,CAAC,CAAC;AACnE,QAAM,UAAU,SAAS,MAAM,OAAO,QAAQ,gBAAgB;AAE9D,SACE,gBAAAP,OAACM,OAAA,EAAI,eAAc,UAAS,KAAK,cAI/B;AAAA,oBAAAN,OAACM,OAAA,EAAI,cAAc,QAAQ,IAAI,KAAK,QAAQ,IAC1C;AAAA,sBAAAP;AAAA,QAACO;AAAA,QAAA;AAAA,UACC,aAAY;AAAA,UACZ,aAAa,QAAQ,aAAa,OAAO,OAAO,OAAO;AAAA,UACvD,UAAU,QAAQ;AAAA,UAElB,0BAAAN,OAACO,QAAA,EAAK,MAAM,QAAQ,YAAY,OAAO,QAAQ,aAAa,OAAO,OAAO,OAAO,eAC9E;AAAA;AAAA,YAAY;AAAA,YAAE,EAAE,2BAA2B,EAAE,OAAO,SAAS,OAAO,CAAC;AAAA,aACxE;AAAA;AAAA,MACF;AAAA,MACA,gBAAAR;AAAA,QAACO;AAAA,QAAA;AAAA,UACC,aAAY;AAAA,UACZ,aAAa,QAAQ,UAAU,OAAO,SAAS,OAAO;AAAA,UACtD,UAAU,QAAQ;AAAA,UAElB,0BAAAN,OAACO,QAAA,EAAK,MAAM,QAAQ,SAAS,OAAO,QAAQ,UAAU,OAAO,SAAS,OAAO,eAC1E;AAAA;AAAA,YAAY;AAAA,YAAE,EAAE,wBAAwB,EAAE,OAAO,MAAM,OAAO,CAAC;AAAA,aAClE;AAAA;AAAA,MACF;AAAA,OACF;AAAA,IAGC,oBACC,gBAAAR;AAAA,MAAC;AAAA;AAAA,QACC,SAAS,EAAE,8BAA8B,EAAE,MAAM,iBAAiB,CAAC;AAAA,QACnE,WAAW,MAAM;AACf,gBAAM,OAAO;AACb,8BAAoB,IAAI;AACxB,eAAK,OAAO,IAAI,CAAC,aAAa,IAAI,CAAC,EAAE,KAAK,MAAM;AAC9C,2BAAe;AAGf,iBAAK,gBAAgB;AAAA,cACnB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,cAClC,QAAQ;AAAA,cACR,UAAU,CAAC,IAAI;AAAA,cACf,mBAAmB;AAAA,cACnB,QAAQ;AAAA,YACV,CAAC;AAAA,UACH,CAAC;AAAA,QACH;AAAA,QACA,UAAU,MAAM,oBAAoB,IAAI;AAAA;AAAA,IAC1C;AAAA,IAID,eACC,gBAAAA,MAACO,OAAA,EAAI,cAAc,QAAQ,IAAI,aAAY,SAAQ,aAAa,OAAO,MAAM,UAAU,QAAQ,IAC7F,0BAAAP,MAAC,eAAY,cAAc,QAAQ,UAAU,WAAW,UAAU,aAAa,GACjF;AAAA,IAMF,gBAAAC,OAACM,OAAA,EAAI,KAAK,QAAQ,IAAI,aAAY,UAAS,cAAY,MAAC,WAAW,OAAO,YAAY,OAAO,aAAa,OAAO,aAAa,OAAO,QACnI;AAAA,sBAAAP,MAACQ,QAAA,EAAK,OAAO,OAAO,MAAO,eAAI;AAAA,MAC/B,gBAAAR,MAACO,OAAA,EAAI,OAAO,WAAW,YAAY,GAAG,UAAU,GAC9C,0BAAAP,MAACQ,QAAA,EAAK,OAAO,OAAO,MAAM,MAAI,MAAC,MAAK,YAAY,YAAE,uBAAuB,GAAE,GAC7E;AAAA,MACC,SAAS,YACR,gBAAAR,MAACO,OAAA,EAAI,OAAO,cAAc,YAAY,GAAG,UAAU,GACjD,0BAAAP,MAACQ,QAAA,EAAK,OAAO,OAAO,MAAM,MAAI,MAAC,MAAK,YAAY,YAAE,uBAAuB,GAAE,GAC7E;AAAA,MAED,SAAS,YAAY,SAAS,aAC7B,gBAAAR,MAACO,OAAA,EAAI,UAAU,GAAG,YAAY,GAAG,UAAU,GACzC,0BAAAP,MAACQ,QAAA,EAAK,OAAO,OAAO,MAAM,MAAI,MAAC,MAAK,YAAY,YAAE,sBAAsB,GAAE,GAC5E;AAAA,OAEJ;AAAA,IAGA,gBAAAP,OAACM,OAAA,EAAI,eAAc,UAChB;AAAA,cAAQ,WAAW,KAClB,gBAAAP,MAACO,OAAA,EAAI,UAAU,QAAQ,IAAI,gBAAe,UACxC,0BAAAP,MAACQ,QAAA,EAAK,OAAO,OAAO,eAAe,QAAM,MAAE,YAAE,sBAAsB,GAAE,GACvE;AAAA,MAED,QAAQ,KACP,gBAAAP,OAACO,QAAA,EAAK,OAAO,OAAO,eAAe,UAAQ,MAAC;AAAA;AAAA,QAAG,EAAE,oBAAoB,EAAE,OAAO,MAAM,CAAC;AAAA,SAAE;AAAA,MAExF,QAAQ,IAAI,CAAC,MAAM,MAAM;AACxB,cAAM,MAAM,QAAQ;AACpB,cAAM,YAAY,QAAQ;AAC1B,cAAM,WAAW,KAAK,YAAY,KAAK,UAAU,KAAK,WAAW,KAAK;AACtE,eACE,gBAAAP,OAAC,iBAA8B,WAC7B;AAAA,0BAAAD,MAACO,OAAA,EAAI,OAAO,WAAW,YAAY,GAAG,UAAU,GAC9C,0BAAAP;AAAA,YAACQ;AAAA,YAAA;AAAA,cACC,MAAM;AAAA,cACN,SAAS;AAAA,cACT,OAAO,YAAY,OAAO,OAAO,OAAO;AAAA,cAGxC,MAAK;AAAA,cAEJ,eAAK;AAAA;AAAA,UACR,GACF;AAAA,UACC,SAAS,YACR,gBAAAR,MAACO,OAAA,EAAI,OAAO,cAAc,YAAY,GAAG,UAAU,GACjD,0BAAAP,MAACQ,QAAA,EAAK,OAAO,OAAO,MAAM,MAAK,YAAY,eAAK,SAAQ,GAC1D;AAAA,UAED,SAAS,YAAY,SAAS,aAC7B,gBAAAR,MAACO,OAAA,EAAI,UAAU,GAAG,YAAY,GAAG,UAAU,GACxC,qBACC,gBAAAN,OAACM,OAAA,EAAI,KAAK,QAAQ,IACf;AAAA,iBAAK,YAAY,gBAAAP,MAAC,eAAY,OAAO,EAAE,gBAAgB,GAAG,SAAQ,WAAU;AAAA,YAC5E,KAAK,UAAU,gBAAAA,MAAC,eAAY,OAAO,EAAE,cAAc,GAAG,SAAQ,QAAO;AAAA,YACrE,KAAK,WAAW,gBAAAA,MAAC,eAAY,OAAO,EAAE,eAAe,GAAG,SAAQ,SAAQ;AAAA,YACxE,KAAK,yBAAyB,gBAAAA,MAAC,eAAY,OAAO,EAAE,WAAW,GAAG,SAAQ,SAAQ;AAAA,aACrF,IAEA,gBAAAA,MAACQ,QAAA,EAAK,OAAO,OAAO,eAAe,UAAQ,MAAC,MAAK,YAAY,eAAK,MAAK,GAE3E;AAAA,aA9BgB,KAAK,IAgCzB;AAAA,MAEJ,CAAC;AAAA,MACA,QAAQ,mBAAmB,SAAS,UACnC,gBAAAP,OAACO,QAAA,EAAK,OAAO,OAAO,eAAe,UAAQ,MAAC;AAAA;AAAA,QAAG,EAAE,oBAAoB,EAAE,OAAO,SAAS,SAAS,QAAQ,iBAAiB,CAAC;AAAA,SAAE;AAAA,OAEhI;AAAA,IAGA,gBAAAR,MAACO,OAAA,EAAI,WAAW,QAAQ,IACtB,0BAAAP,MAACQ,QAAA,EAAK,OAAO,OAAO,MAAM,MAAI,MAC3B,mBAAS,SAAS,IAAI,GAAG,SAAS,CAAC,IAAI,SAAS,MAAM,KAAK,OAC9D,GACF;AAAA,KACF;AAEJ;;;AQ/TA,SAAgB,YAAAC,WAAU,eAAAC,cAAa,aAAAC,YAAW,UAAAC,eAAc;AAChE,SAAS,OAAAC,OAAK,QAAAC,cAAY;AAE1B,SAAS,aAAAC,kBAAiB;AAgKlB,gBAAAC,OAOE,QAAAC,cAPF;AAzID,SAAS,aAAa;AAC3B,QAAM,CAAC,OAAO,QAAQ,IAAIC,UAAS,EAAE;AACrC,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAyD,IAAI;AAC3F,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAS,KAAK;AAChD,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAwB,IAAI;AAClE,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAS,CAAC;AACtC,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,UAAwB,IAAI;AACxE,QAAM,SAAS,cAAc;AAC7B,QAAM,EAAE,WAAW,WAAW,IAAI,cAAc;AAChD,QAAM,WAAW,mBAAmB,CAAC,MAAM,EAAE,QAAQ;AACrD,QAAM,gBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa;AAC/D,QAAM,iBAAiB,aAAa,CAAC,MAAM,EAAE,cAAc;AAC3D,QAAM,eAAeC,QAAO,KAAK;AAGjC,QAAM,oBAAoBA,QAAsB,IAAI;AACpD,QAAM,aAAa,eAAe;AAAA,IAChC,cAAc,cAAc,IAAI;AAAA,IAChC,sBAAsB,cAAc,KAAK;AAAA,IACzC,SAAS;AAAA,EACX,CAAC;AACD,QAAM,aAAa,eAAe;AAAA,IAChC,cAAc;AAAA,IACd,sBAAsB;AAAA,IACtB,SAAS;AAAA,EACX,CAAC;AAID,EAAAC,WAAU,MAAM;AACd,QAAI,YAAY,MAAM;AACpB,gBAAU;AACV,aAAO,MAAM;AAAE,mBAAW;AAAA,MAAG;AAAA,IAC/B;AACA,WAAO;AAAA,EACT,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,WAAWC,aAAY,OAAO,SAAiB;AACnD,QAAI,KAAK,SAAS,GAAG;AACnB,iBAAW,IAAI;AACf,qBAAe,EAAE,iBAAiB,CAAC;AACnC;AAAA,IACF;AACA,iBAAa,IAAI;AACjB,mBAAe,IAAI;AACnB,QAAI;AACF,YAAM,IAAI,MAAU,OAAO,IAAI;AAC/B,iBAAW,CAAC;AACZ,gBAAU,CAAC;AAAA,IACb,SAAS,KAAK;AACZ,iBAAW,EAAE,UAAU,CAAC,GAAG,OAAO,CAAC,EAAE,CAAC;AACtC,qBAAe,eAAe,QAAQ,IAAI,UAAU,EAAE,eAAe,CAAC;AAAA,IACxE,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,EAAAD,WAAU,MAAM;AACd,QAAI,CAAC,OAAO,aAAa,CAAC,OAAO,SAAS,OAAO,MAAM,SAAS,KAAK,CAAC,aAAa,SAAS;AAC1F,mBAAa,UAAU;AACvB,WAAK,eAAe;AAEpB,YAAM,YAAY,kBAAkB;AACpC,UAAI,WAAW;AACb,0BAAkB,UAAU;AAC5B,aAAK,gBAAgB;AAAA,UACnB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,UAClC,QAAQ;AAAA,UACR,UAAU,CAAC,SAAS;AAAA,UACpB,mBAAmB;AAAA,UACnB,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,GAAG,CAAC,OAAO,WAAW,OAAO,KAAK,CAAC;AAEnC,QAAM,aAA6B,UAC/B;AAAA,IACA,GAAG,QAAQ,SAAS,IAAI,CAAC,UAAU,EAAE,MAAM,MAAM,UAAmB,EAAE;AAAA,IACtE,GAAG,QAAQ,MAAM,IAAI,CAAC,UAAU,EAAE,MAAM,MAAM,OAAgB,EAAE;AAAA,EAClE,IACE,CAAC;AACL,QAAM,QAAQ,KAAK;AAAA,IACjB,KAAK,IAAI,GAAG,SAAS,KAAK,MAAM,aAAa,CAAC,CAAC;AAAA,IAC/C,KAAK,IAAI,GAAG,WAAW,SAAS,UAAU;AAAA,EAC5C;AACA,QAAM,iBAAiB,WAAW,MAAM,OAAO,QAAQ,UAAU;AAEjE,EAAAA,WAAU,MAAM;AACd,cAAU,CAAC,YAAY,KAAK,IAAI,SAAS,KAAK,IAAI,GAAG,WAAW,SAAS,CAAC,CAAC,CAAC;AAAA,EAC9E,GAAG,CAAC,WAAW,MAAM,CAAC;AAEtB,eAAa,CAAC,OAAO,QAAQ;AAC3B,QAAI,OAAO,WAAW;AACpB,UAAI,IAAI,OAAQ,QAAO,OAAO;AAC9B;AAAA,IACF;AACA,QAAI,OAAO,MAAM,SAAS,GAAG;AAC3B,UAAI,IAAI,QAAQ;AACd,eAAO,MAAM;AAAA,MACf;AACA;AAAA,IACF;AACA,QAAI,eAAgB;AAEpB,QAAI,IAAI,UAAU,CAAC,SAAS;AAC1B,WAAK,SAAS,KAAK;AACnB;AAAA,IACF;AAGA,QAAI,IAAI,UAAU,WAAW,MAAM,GAAG;AACpC,YAAM,SAAS,WAAW,MAAM;AAChC,oBAAc,OAAO,MAAM,OAAO,IAAI;AACtC,eAAS,cAAc;AACvB;AAAA,IACF;AAGA,SAAK,UAAU,OAAO,UAAU,QAAQ,WAAW,MAAM,GAAG;AAC1D,wBAAkB,WAAW,MAAM,EAAE,IAAI;AACzC;AAAA,IACF;AAEA,QAAI,UAAU,OAAO,IAAI,WAAW;AAClC,gBAAU,CAAC,MAAM,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,GAAG,WAAW,SAAS,CAAC,CAAC,CAAC;AAAA,IACtE,WAAW,UAAU,OAAO,IAAI,SAAS;AACvC,gBAAU,CAAC,MAAM,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC;AAAA,IACrC,WAAW,IAAI,QAAQ;AACrB,iBAAW,IAAI;AACf,eAAS,EAAE;AAAA,IACb;AAAA,EACF,CAAC;AAED,MAAI,OAAO,aAAa,OAAO,MAAM,SAAS,GAAG;AAC/C,WACE,gBAAAH,OAACK,OAAA,EAAI,eAAc,UACjB;AAAA,sBAAAN;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,OAAO;AAAA,UACd,WAAW,OAAO;AAAA,UAClB,OAAO,EAAE,mBAAmB;AAAA,UAC5B,YAAY;AAAA;AAAA,MACd;AAAA,MACC,OAAO,aACN,gBAAAC,OAACM,QAAA,EAAK,OAAO,OAAO,eAAe;AAAA;AAAA,QAAK,EAAE,aAAa;AAAA,SAAE;AAAA,MAE1D,CAAC,OAAO,aACP,gBAAAN,OAACK,OAAA,EAAI,eAAc,UAAS,WAAW,QAAQ,IAC7C;AAAA,wBAAAN;AAAA,UAAC;AAAA;AAAA,YACC,QAAQ,OAAO,QAAQ,UAAU;AAAA,YACjC,SAAS,OAAO,QAAQ,UAAU,OAAO,KAAK,KAAK,UAAU,EAAE,wBAAwB,CAAC;AAAA;AAAA,QAC1F;AAAA,QACA,gBAAAC,OAACM,QAAA,EAAK,OAAO,OAAO,eAAe;AAAA;AAAA,UAAK,EAAE,YAAY;AAAA,WAAE;AAAA,SAC1D;AAAA,OAEJ;AAAA,EAEJ;AAEA,SACE,gBAAAN,OAACK,OAAA,EAAI,eAAc,UACjB;AAAA,oBAAAL,OAACK,OAAA,EAAI,cAAc,QAAQ,IACzB;AAAA,sBAAAL,OAACM,QAAA,EAAK,OAAO,OAAO,MAAO;AAAA;AAAA,QAAY;AAAA,SAAC;AAAA,MACvC,CAAC,UACA,gBAAAP;AAAA,QAACQ;AAAA,QAAA;AAAA,UACC,aAAa,EAAE,oBAAoB;AAAA,UACnC,cAAc;AAAA,UACd,UAAU;AAAA,UACV,UAAU,MAAM,KAAK,SAAS,KAAK;AAAA;AAAA,MACrC,IAEA,gBAAAP,OAACM,QAAA,EAAM;AAAA,UAAE,mBAAmB;AAAA,QAAE;AAAA,QAAE,gBAAAP,MAACO,QAAA,EAAK,MAAI,MAAC,OAAO,OAAO,MAAO,iBAAM;AAAA,QAAO;AAAA,QAAE,gBAAAP,MAACO,QAAA,EAAK,OAAO,OAAO,eAAgB,YAAE,mBAAmB,GAAE;AAAA,SAAO;AAAA,OAErJ;AAAA,IAEC,aAAa,gBAAAP,MAAC,WAAQ,SAAS,EAAE,mBAAmB,GAAG;AAAA,IAEvD,eACC,gBAAAA,MAACM,OAAA,EAAI,cAAc,QAAQ,IACzB,0BAAAN,MAACO,QAAA,EAAK,OAAO,OAAO,OAAQ,uBAAY,GAC1C;AAAA,IAGD,kBACC,gBAAAP;AAAA,MAAC;AAAA;AAAA,QACC,SAAS,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAAA,QAC5D,WAAW,MAAM;AACf,gBAAM,OAAO;AACb,uBAAa,UAAU;AACvB,4BAAkB,UAAU;AAC5B,4BAAkB,IAAI;AACtB,eAAK,OAAO,IAAI,CAAC,WAAW,IAAI,CAAC;AAAA,QACnC;AAAA,QACA,UAAU,MAAM,kBAAkB,IAAI;AAAA;AAAA,IACxC;AAAA,IAGD,WAAW,CAAC,aAAa,CAAC,kBACzB,gBAAAC,OAACK,OAAA,EAAI,eAAc,UAChB;AAAA,iBAAW,SAAS,KACnB,gBAAAL,OAACM,QAAA,EAAK,OAAO,OAAO,eACjB;AAAA,UAAE,yBAAyB,EAAE,OAAO,QAAQ,SAAS,OAAO,CAAC;AAAA,QAAE;AAAA,QAAG,EAAE,sBAAsB,EAAE,OAAO,QAAQ,MAAM,OAAO,CAAC;AAAA,SAC5H;AAAA,MAGD,WAAW,SAAS,KACnB,gBAAAN,OAACK,OAAA,EAAI,eAAc,UAChB;AAAA,gBAAQ,KACP,gBAAAL,OAACM,QAAA,EAAK,OAAO,OAAO,eAAe,UAAQ,MAAC;AAAA;AAAA,UAAG,EAAE,oBAAoB,EAAE,OAAO,MAAM,CAAC;AAAA,WAAE;AAAA,QAExF,eAAe,IAAI,CAAC,QAAQ,MAAM;AACjC,gBAAM,MAAM,QAAQ;AACpB,gBAAM,YAAY,QAAQ;AAC1B,iBACE,gBAAAN,OAAC,iBAAoD,WACnD;AAAA,4BAAAD,MAACM,OAAA,EAAI,UAAU,GAAG,YAAY,GAAG,UAAU,GACzC,0BAAAN,MAACO,QAAA,EAAK,MAAM,WAAW,SAAS,WAAW,MAAK,mBAAmB,iBAAO,MAAK,GACjF;AAAA,YACA,gBAAAP;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO,OAAO,SAAS,YAAY,YAAY;AAAA,gBAC/C,SAAS,OAAO,SAAS,YAAY,SAAS;AAAA;AAAA,YAChD;AAAA,eAPkB,GAAG,OAAO,IAAI,IAAI,OAAO,IAAI,EAQjD;AAAA,QAEJ,CAAC;AAAA,QACA,QAAQ,aAAa,WAAW,UAC/B,gBAAAC,OAACM,QAAA,EAAK,OAAO,OAAO,eAAe,UAAQ,MAAC;AAAA;AAAA,UAAG,EAAE,oBAAoB,EAAE,OAAO,WAAW,SAAS,QAAQ,WAAW,CAAC;AAAA,WAAE;AAAA,SAE5H;AAAA,MAGD,WAAW,WAAW,KACrB,gBAAAP,MAACM,OAAA,EAAI,aAAY,SAAQ,aAAa,OAAO,eAAe,UAAU,QAAQ,IAC5E,0BAAAN,MAACO,QAAA,EAAK,OAAO,OAAO,eAAe,QAAM,MAAE,YAAE,kBAAkB,GAAE,GACnE;AAAA,MAGF,gBAAAP,MAACM,OAAA,EAAI,WAAW,QAAQ,IACtB,0BAAAN,MAACO,QAAA,EAAK,OAAO,OAAO,MAAM,MAAI,MAC3B,qBAAW,SAAS,IAAI,GAAG,SAAS,CAAC,IAAI,WAAW,MAAM,KAAK,IAClE,GACF;AAAA,OACF;AAAA,KAEJ;AAEJ;;;AChRA,SAAgB,aAAAE,aAAW,WAAAC,UAAS,UAAAC,SAAQ,YAAAC,iBAAgB;AAC5D,SAAS,OAAAC,OAAK,QAAAC,cAAY;AA0ClB,SAMA,OAAAC,OANA,QAAAC,cAAA;AAnBR,SAAS,YAAY,EAAE,OAAO,GAA8B;AAC1D,QAAM,YACJ,OAAO,SAAS,SAAS,OAAO,QAC9B,OAAO,SAAS,WAAW,OAAO,UAClC,OAAO;AAEX,QAAM,YACJ,OAAO,SAAS,SAAS,EAAE,aAAa,IACtC,OAAO,SAAS,WAAW,EAAE,eAAe,IAC5C,EAAE,YAAY;AAElB,QAAM,WACJ,OAAO,SAAS,SAAS,WACvB,OAAO,SAAS,WAAW,MAC3B;AAEJ,SACE,gBAAAA,OAACC,OAAA,EAAI,eAAc,UAAS,WAAW,QAAQ,IAAI,aAAY,SAAQ,aAAa,WAAW,UAAU,QAAQ,IAAI,UAAU,QAAQ,MACrI;AAAA,oBAAAD,OAACC,OAAA,EACC;AAAA,sBAAAD,OAACE,QAAA,EAAK,MAAI,MAAC,OAAO,WAAY;AAAA;AAAA,QAAS;AAAA,QAAE;AAAA,SAAU;AAAA,MAClD,OAAO,YAAY,SAAS,KAC3B,gBAAAF,OAACE,QAAA,EAAK,OAAO,OAAO,eAAe;AAAA;AAAA,QAAS,EAAE,kBAAkB,EAAE,OAAO,OAAO,YAAY,OAAO,CAAC;AAAA,SAAE;AAAA,OAE1G;AAAA,IACC,OAAO,YAAY,SAAS,KAC3B,gBAAAH,MAACG,QAAA,EAAK,OAAO,OAAO,eAAgB,iBAAO,YAAY,KAAK,QAAU,GAAE;AAAA,IAEzE,OAAO,YAAY,SAAS,KAAK,OAAO,YAAY,UAAU,KAC7D,gBAAAH,MAACG,QAAA,EAAK,OAAO,OAAO,OAAO,UAAQ,MAChC,YAAE,iBAAiB,EAAE,UAAU,OAAO,YAAY,KAAK,IAAI,EAAE,CAAC,GACjE;AAAA,IAED,OAAO,SAAS,UACf,gBAAAH,MAACG,QAAA,EAAK,OAAO,OAAO,MAAO,YAAE,sBAAsB,GAAE;AAAA,KAEzD;AAEJ;AAEO,SAAS,eAAe;AAE7B,QAAM,WAAW,aAAa,CAAC,MAAM,EAAE,QAAQ;AAC/C,QAAM,UAAU,aAAa,CAAC,MAAM,EAAE,OAAO;AAC7C,QAAM,SAAS,aAAa,CAAC,MAAM,EAAE,MAAM;AAC3C,QAAM,gBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa;AACzD,QAAM,SAAS,cAAc;AAC7B,QAAM,CAAC,QAAQ,SAAS,IAAIC,UAAS,CAAC;AACtC,QAAM,CAAC,eAAe,gBAAgB,IAAIA,UAIxC,IAAI;AACN,QAAM,eAAeC,QAAO,KAAK;AAIjC,QAAM,oBAAoBA,QAAwB,IAAI;AACtD,QAAM,CAAC,QAAQ,SAAS,IAAID,UAA+B,IAAI;AAC/D,QAAM,CAAC,eAAe,gBAAgB,IAAIA,UAAS,KAAK;AACxD,QAAM,WAAW,eAAe;AAAA,IAC9B,cAAc,UAAU,gBAAgB,KAAK;AAAA,IAC7C,sBAAsB,UAAU,gBAAgB,KAAK;AAAA,IACrD,SAAS;AAAA,EACX,CAAC;AACD,QAAM,aAAa,eAAe;AAAA,IAChC,cAAc;AAAA,IACd,sBAAsB;AAAA,IACtB,SAAS;AAAA,EACX,CAAC;AAED,EAAAE,YAAU,MAAM;AAAE,kBAAc;AAAA,EAAG,GAAG,CAAC,CAAC;AAExC,EAAAA,YAAU,MAAM;AACd,QAAI,CAAC,OAAO,aAAa,CAAC,OAAO,SAAS,OAAO,MAAM,SAAS,KAAK,CAAC,aAAa,SAAS;AAC1F,mBAAa,UAAU;AACvB,WAAK,cAAc,EAAE,KAAK,MAAM;AAC9B,cAAM,OAAO,kBAAkB;AAC/B,YAAI,CAAC,KAAM;AACX,0BAAkB,UAAU;AAC5B,cAAM,QAAQ,aAAa,SAAS,EAAE;AACtC,cAAM,YAAY,MAAM,SAAS,SAAS,MAAM,MAAM;AACtD,aAAK,gBAAgB;AAAA,UACnB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,UAClC,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,mBAAmB;AAAA,UACnB,QAAQ;AAAA,QACV,CAAC,EAAE,MAAM,CAAC,QAAQ,OAAO,KAAK,oCAAoC,GAAG,CAAC;AAAA,MACxE,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,OAAO,WAAW,OAAO,KAAK,CAAC;AAKnC,QAAM,cAAcC;AAAA,IAClB,MAAM;AAAA,MACJ,GAAG,SAAS,SAAS,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,MAAM,UAAmB,EAAE;AAAA,MACpE,GAAG,SAAS,MAAM,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,MAAM,OAAgB,EAAE;AAAA,IAChE;AAAA,IACA,CAAC,SAAS,UAAU,SAAS,KAAK;AAAA,EACpC;AAEA,QAAM,kBAAkB,YAAY,QAAQ,GAAG;AAE/C,EAAAD,YAAU,MAAM;AACd,UAAM,MAAM,YAAY,eAAe;AACvC,QAAI,CAAC,OAAO,OAAO,WAAW;AAC5B,gBAAU,IAAI;AACd;AAAA,IACF;AAIA,QAAI,YAAY;AAChB,qBAAiB,IAAI;AACrB,SAAK;AAAA,MACH,IAAI;AAAA,MACJ,IAAI,mBAAmB,CAAC,KAAK;AAAA,MAC7B,IAAI;AAAA,MACJ,IAAI;AAAA,IACN,EACG,KAAK,CAAC,WAAW;AAAE,UAAI,CAAC,UAAW,WAAU,MAAM;AAAA,IAAG,CAAC,EACvD,MAAM,MAAM;AAAE,UAAI,CAAC,UAAW,WAAU,IAAI;AAAA,IAAG,CAAC,EAChD,QAAQ,MAAM;AAAE,UAAI,CAAC,UAAW,kBAAiB,KAAK;AAAA,IAAG,CAAC;AAC7D,WAAO,MAAM;AAAE,kBAAY;AAAA,IAAM;AAAA,EACnC,GAAG,CAAC,iBAAiB,OAAO,SAAS,CAAC;AAEtC,eAAa,CAAC,OAAO,QAAQ;AAC3B,QAAI,OAAO,WAAW;AACpB,UAAI,IAAI,OAAQ,QAAO,OAAO;AAC9B;AAAA,IACF;AACA,QAAI,OAAO,MAAM,SAAS,GAAG;AAC3B,UAAI,IAAI,QAAQ;AACd,eAAO,MAAM;AACb;AAAA,MACF;AACA,UAAI,UAAU,OAAO,UAAU,KAAK;AAClC,eAAO,MAAM;AACb,aAAK,cAAc;AAAA,MACrB;AACA;AAAA,IACF;AACA,QAAI,cAAe;AAEnB,QAAI,UAAU,OAAO,IAAI,WAAW;AAClC,gBAAU,CAAC,MAAM,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,GAAG,YAAY,SAAS,CAAC,CAAC,CAAC;AAAA,IACvE,WAAW,UAAU,OAAO,IAAI,SAAS;AACvC,gBAAU,CAAC,MAAM,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC;AAAA,IACrC,WAAW,IAAI,UAAU,YAAY,MAAM,GAAG;AAC5C,uBAAiB,EAAE,MAAM,UAAU,MAAM,YAAY,MAAM,EAAE,KAAK,CAAC;AAAA,IACrE,YAAY,UAAU,OAAO,UAAU,QAAQ,YAAY,SAAS,GAAG;AACrE,uBAAiB,EAAE,MAAM,MAAM,CAAC;AAAA,IAClC,YAAY,UAAU,OAAO,UAAU,QAAQ,YAAY,MAAM,GAAG;AAElE,YAAM,MAAM,YAAY,MAAM;AAC9B,YAAM,IAAI,SAAS,aAAa,IAAI,IAAI,IAAI,WAAW,IAAI,IAAI,GAAG,KAAK,MAAM,KAAK,cAAc,CAAC;AACjG;AAAA,IACF,WAAW,UAAU,OAAO,UAAU,KAAK;AACzC,WAAK,cAAc;AAAA,IACrB;AAAA,EACF,CAAC;AAED,QAAM,mBAAmB;AACzB,QAAM,QAAQ,KAAK,IAAI,GAAG,SAAS,KAAK,MAAM,mBAAmB,CAAC,CAAC;AACnE,QAAM,UAAU,YAAY,MAAM,OAAO,QAAQ,gBAAgB;AAEjE,MAAI,QAAQ,SAAU,QAAO,gBAAAN,MAAC,WAAQ,SAAS,EAAE,kBAAkB,GAAG;AACtE,MAAI,OAAO,SAAU,QAAO,gBAAAA,MAAC,gBAAa,SAAS,OAAO,UAAU;AAEpE,MAAI,OAAO,aAAa,OAAO,MAAM,SAAS,GAAG;AAC/C,WACE,gBAAAC,OAACC,OAAA,EAAI,eAAc,UACjB;AAAA,sBAAAF;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,OAAO;AAAA,UACd,WAAW,OAAO;AAAA,UAClB,OAAO,EAAE,oBAAoB;AAAA,UAC7B,YAAY;AAAA;AAAA,MACd;AAAA,MACC,OAAO,aACN,gBAAAC,OAACE,QAAA,EAAK,OAAO,OAAO,eAAe;AAAA;AAAA,QAAK,EAAE,aAAa;AAAA,SAAE;AAAA,MAE1D,CAAC,OAAO,aACP,gBAAAF,OAACC,OAAA,EAAI,eAAc,UAAS,WAAW,QAAQ,IAC7C;AAAA,wBAAAD,OAACC,OAAA,EAAI,aAAY,SAAQ,aAAa,OAAO,QAAQ,OAAO,QAAQ,OAAO,SAAS,UAAU,QAAQ,IAAI,UAAU,QAAQ,MAC1H;AAAA,0BAAAF,MAACG,QAAA,EAAK,OAAO,OAAO,QAAQ,OAAO,QAAQ,OAAO,SAAS,MAAI,MAC5D,iBAAO,QAAQ,UAAU,OAAO,KAAK,KAAK,UAAU,EAAE,0BAA0B,CAAC,IACpF;AAAA,UACA,gBAAAF,OAACE,QAAA,EAAK,OAAO,OAAO,OAAO;AAAA;AAAA,YAAE,EAAE,uBAAuB;AAAA,aAAE;AAAA,WAC1D;AAAA,QACA,gBAAAF,OAACE,QAAA,EAAK,OAAO,OAAO,eAAe;AAAA;AAAA,UAAG,EAAE,cAAc;AAAA,UAAE;AAAA,UAAM,EAAE,YAAY;AAAA,WAAE;AAAA,SAChF;AAAA,OAEJ;AAAA,EAEJ;AAGA,QAAM,oBAAoB,eAAe,SAAS,QAC9C,GAAG,EAAE,uBAAuB,EAAE,OAAO,YAAY,OAAO,CAAC,CAAC;AAAA,EAAK,EAAE,2BAA2B,EAAE,MAAM,YAAY,IAAI,OAAK,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,KAC9I;AAEJ,SACE,gBAAAF,OAACC,OAAA,EAAI,eAAc,UACjB;AAAA,oBAAAF,MAAC,iBAAc,OAAO,aAAa,OAAO,EAAE,kBAAkB,EAAE,OAAO,YAAY,OAAO,CAAC,GAAG,UAAU,UAAU,MAAM;AAAA,IAEvH,iBACC,gBAAAA,MAACE,OAAA,EAAI,SAAS,QAAQ,IACpB,0BAAAF;AAAA,MAAC;AAAA;AAAA,QACC,SACE,cAAc,SAAS,QACnB,oBACA,EAAE,0BAA0B,EAAE,MAAM,cAAc,SAAS,WAAW,cAAc,OAAO,GAAG,CAAC;AAAA,QAErG,WAAW,MAAM;AACf,uBAAa,UAAU;AACvB,cAAI,cAAc,SAAS,OAAO;AAChC,8BAAkB,UAAU,YAAY,IAAI,CAAC,MAAM,EAAE,IAAI;AACzD,iBAAK,OAAO,IAAI,CAAC,SAAS,CAAC;AAAA,UAC7B,WAAW,cAAc,MAAM;AAC7B,8BAAkB,UAAU,CAAC,cAAc,IAAI;AAC/C,iBAAK,OAAO,IAAI,CAAC,WAAW,cAAc,IAAI,CAAC;AAAA,UACjD;AACA,2BAAiB,IAAI;AAAA,QACvB;AAAA,QACA,UAAU,MAAM,iBAAiB,IAAI;AAAA;AAAA,IACvC,GACF;AAAA,IAGD,YAAY,WAAW,KAAK,CAAC,iBAC5B,gBAAAA,MAACE,OAAA,EAAI,WAAW,QAAQ,IACtB,0BAAAF,MAAC,gBAAa,QAAO,WAAU,SAAS,UAAU,EAAE,mBAAmB,CAAC,IAAI,GAC9E;AAAA,IAGD,YAAY,SAAS,KAAK,CAAC,iBAC1B,gBAAAC,OAACC,OAAA,EAAI,eAAc,UAAS,WAAW,QAAQ,IAC5C;AAAA,cAAQ,KACP,gBAAAD,OAACE,QAAA,EAAK,OAAO,OAAO,eAAe,UAAQ,MAAC;AAAA;AAAA,QAAG,EAAE,oBAAoB,EAAE,OAAO,MAAM,CAAC;AAAA,SAAE;AAAA,MAExF,QAAQ,IAAI,CAAC,KAAK,MAAM;AACvB,cAAM,MAAM,QAAQ;AACpB,cAAM,YAAY,QAAQ;AAC1B,eACE,gBAAAF,OAAC,iBAA6B,WAK5B;AAAA,0BAAAD,MAACE,OAAA,EAAI,UAAU,GAAG,YAAY,GAAG,UAAU,GACzC,0BAAAF;AAAA,YAACG;AAAA,YAAA;AAAA,cACC,MAAM;AAAA,cACN,SAAS;AAAA,cACT,OAAO,YAAY,OAAO,OAAO,OAAO;AAAA,cACxC,MAAK;AAAA,cAEJ,cAAI;AAAA;AAAA,UACP,GACF;AAAA,UACA,gBAAAH,MAAC,gBAAa,SAAS,IAAI,mBAAmB,CAAC,KAAK,IAAI,QAAQ,IAAI,iBAAiB;AAAA,UACpF,IAAI,UAAU,gBAAAA,MAAC,eAAY,OAAO,EAAE,iBAAiB,GAAG,SAAQ,QAAO;AAAA,aAhBtD,IAAI,IAiBxB;AAAA,MAEJ,CAAC;AAAA,MACA,QAAQ,mBAAmB,YAAY,UACtC,gBAAAC,OAACE,QAAA,EAAK,OAAO,OAAO,eAAe,UAAQ,MAAC;AAAA;AAAA,QAAG,EAAE,oBAAoB,EAAE,OAAO,YAAY,SAAS,QAAQ,iBAAiB,CAAC;AAAA,SAAE;AAAA,MAGjI,gBAAAH,MAACE,OAAA,EAAI,WAAW,QAAQ,IACtB,0BAAAD,OAACE,QAAA,EAAK,OAAO,OAAO,MAAM,MAAI,MAC3B;AAAA,iBAAS;AAAA,QAAE;AAAA,QAAE,YAAY;AAAA,SAC5B,GACF;AAAA,MAEC,UAAU,CAAC,OAAO,aAAa,CAAC,iBAC/B,gBAAAH,MAAC,eAAY,QAAgB;AAAA,MAE9B,iBAAiB,CAAC,OAAO,aAAa,CAAC,iBACtC,gBAAAA,MAACE,OAAA,EAAI,WAAW,QAAQ,IACtB,0BAAAF,MAACG,QAAA,EAAK,OAAO,OAAO,eAAgB,YAAE,kBAAkB,GAAE,GAC5D;AAAA,MAGF,gBAAAH,MAACE,OAAA,EAAI,WAAW,QAAQ,IACtB,0BAAAF,MAACG,QAAA,EAAK,OAAO,OAAO,eAAgB,YAAE,aAAa,GAAE,GACvD;AAAA,OACF;AAAA,KAEJ;AAEJ;;;AC5TA,SAAgB,aAAAK,aAAW,UAAAC,SAAQ,YAAAC,iBAAgB;AACnD,SAAS,OAAAC,OAAK,QAAAC,cAAY;AA4Hf,SAeD,YAAAC,WAfC,OAAAC,OAYD,QAAAC,cAZC;AAvGX,IAAM,uBAAuD;AAAA,EAC3D,SAAS;AAAA,EACT,WAAW;AAAA,EACX,SAAS;AACX;AAEA,IAAM,sBAAsD;AAAA,EAC1D,SAAS;AAAA,EACT,WAAW;AAAA,EACX,SAAS;AACX;AAEO,SAAS,kBAAkB;AAChC,QAAM,cAAc,mBAAmB,CAAC,MAAM,EAAE,eAAe;AAC/D,QAAM,cAAc,mBAAmB,CAAC,MAAM,EAAE,mBAAmB;AACnE,QAAM,CAAC,SAAS,UAAU,IAAIC,UAAyB,IAAI;AAC3D,QAAM,CAAC,SAASC,WAAU,IAAID,UAAS,IAAI;AAC3C,QAAM,CAAC,OAAOE,SAAQ,IAAIF,UAAwB,IAAI;AACtD,QAAM,CAAC,eAAe,gBAAgB,IAAIA,UAAwB,IAAI;AACtE,QAAM,kBAAkBG,QAAe,SAAS;AAChD,QAAM,aAAaA,QAAO,IAAI;AAC9B,QAAM,eAAeA,QAAO,KAAK;AACjC,QAAM,SAAS,cAAc;AAE7B,EAAAC,YAAU,MAAM;AACd,eAAW,UAAU;AACrB,WAAO,MAAM;AAAE,iBAAW,UAAU;AAAA,IAAO;AAAA,EAC7C,GAAG,CAAC,CAAC;AAEL,EAAAA,YAAU,MAAM;AACd,QAAI,CAAC,YAAa;AAClB,IAAAH,YAAW,IAAI;AAGf,UAAM,YAAY,YAAY;AAC5B,UAAI,gBAAgB,QAAQ;AAE1B,cAAM,WAAW,MAAU,YAAY,WAAW;AAClD,YAAI,YAAY,WAAW,SAAS;AAClC,qBAAe,iBAAiB,QAAQ,CAAC;AACzC,UAAAA,YAAW,KAAK;AAChB;AAAA,QACF;AAAA,MACF;AAEA,YAAM,IAAI,MAAU,eAAe,WAAW;AAC9C,UAAI,WAAW,SAAS;AAAE,mBAAW,CAAC;AAAG,QAAAA,YAAW,KAAK;AAAA,MAAG;AAAA,IAC9D;AAEA,cAAU,EAAE,MAAM,CAAC,QAAQ;AACzB,UAAI,WAAW,SAAS;AAAE,QAAAC,UAAS,IAAI,OAAO;AAAG,QAAAD,YAAW,KAAK;AAAA,MAAG;AAAA,IACtE,CAAC;AAAA,EACH,GAAG,CAAC,aAAa,WAAW,CAAC;AAE7B,EAAAG,YAAU,MAAM;AACd,QAAI,CAAC,OAAO,aAAa,CAAC,OAAO,SAAS,OAAO,MAAM,SAAS,KAAK,CAAC,aAAa,WAAW,aAAa;AACzG,mBAAa,UAAU;AACvB,YAAM,YAAY,gBAAgB,SAC1B,YAAY,WAAW,EAAE,KAAK,CAAC,MAAM,IAAI,EAAE,GAAG,GAAG,WAAW,EAAE,YAAY,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,IAAoD,IAAI,IAClK,eAAe,WAAW;AAClC,gBACG,KAAK,CAAC,MAAM;AAAE,YAAI,WAAW,SAAS;AAAE,qBAAW,CAAC;AAAA,QAAG;AAAA,MAAE,CAAC,EAC1D,MAAM,MAAM;AAAA,MAA8B,CAAC;AAI9C,YAAM,SAAS,gBAAgB;AAC/B,UAAI,WAAW,aAAa,WAAW,aAAa,WAAW,aAAa;AAC1E,aAAK,aAAa,SAAS,EAAE,cAAc,EAAE,KAAK,MAAM;AACtD,gBAAM,MAAM,aAAa,SAAS,EAAE;AACpC,gBAAM,YAAY,IAAI,SAAS,SAAS,IAAI,MAAM;AAClD,eAAK,gBAAgB;AAAA,YACnB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,YAClC;AAAA,YACA,UAAU,CAAC,WAAW;AAAA,YACtB,mBAAmB;AAAA,YACnB,QAAQ;AAAA,UACV,CAAC,EAAE,MAAM,CAAC,QAAQ,OAAO,KAAK,oCAAoC,GAAG,CAAC;AAAA,QACxE,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,GAAG,CAAC,OAAO,WAAW,OAAO,KAAK,CAAC;AAEnC,eAAa,CAAC,OAAO,QAAQ;AAC3B,QAAI,OAAO,WAAW;AACpB,UAAI,IAAI,OAAQ,QAAO,OAAO;AAC9B;AAAA,IACF;AACA,QAAI,cAAe;AAEnB,QAAI,CAAC,QAAS;AAEd,UAAMC,eAAc,QAAQ,UAAU,SAAS;AAC/C,SAAK,UAAU,OAAO,UAAU,QAAQ,CAACA,cAAa;AACpD,uBAAiB,SAAS;AAAA,IAC5B,YAAY,UAAU,OAAO,UAAU,QAAQA,cAAa;AAC1D,uBAAiB,WAAW;AAAA,IAC9B,YAAY,UAAU,OAAO,UAAU,QAAQA,gBAAe,QAAQ,UAAU;AAC9E,uBAAiB,SAAS;AAAA,IAC5B;AAAA,EACF,CAAC;AAED,MAAI,CAAC,aAAa;AAChB,WAAO,gBAAAP,MAACQ,QAAA,EAAK,OAAO,OAAO,eAAe,QAAM,MAAE,YAAE,mBAAmB,GAAE;AAAA,EAC3E;AAEA,MAAI,QAAS,QAAO,gBAAAR,MAAC,WAAQ,SAAS,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC,GAAG;AACnF,MAAI,MAAO,QAAO,gBAAAA,MAAC,gBAAa,SAAS,OAAO;AAChD,MAAI,CAAC,QAAS,QAAO,gBAAAA,MAAC,gBAAa,SAAS,EAAE,kBAAkB,GAAG;AAEnE,MAAI,OAAO,aAAa,OAAO,MAAM,SAAS,GAAG;AAC/C,WACE,gBAAAC,OAACQ,OAAA,EAAI,eAAc,UACjB;AAAA,sBAAAT,MAAC,eAAY,OAAO,OAAO,OAAO,WAAW,OAAO,WAAW,OAAO,EAAE,qBAAqB,gBAAgB,OAAO,KAAK,qBAAqB,SAAS,GAAI,EAAE,MAAM,QAAQ,KAAK,CAAC,GAAG;AAAA,MACnL,OAAO,aACN,gBAAAC,OAACO,QAAA,EAAK,OAAO,OAAO,eAAe;AAAA;AAAA,QAAK,EAAE,aAAa;AAAA,SAAE;AAAA,MAE1D,CAAC,OAAO,aACP,gBAAAP,OAAAF,WAAA,EACE;AAAA,wBAAAC,MAACQ,QAAA,EAAK,OAAO,OAAO,QAAQ,OAAO,QAAQ,OAAO,SAAS,MAAI,MAC5D,iBAAO,QAAQ,UAAU,OAAO,KAAK,KAAK,UAAU,EAAE,cAAc,CAAC,IACxE;AAAA,QACA,gBAAAP,OAACO,QAAA,EAAK,OAAO,OAAO,eAAe;AAAA;AAAA,UAAK,EAAE,WAAW;AAAA,WAAE;AAAA,SACzD;AAAA,OAEJ;AAAA,EAEJ;AAEA,QAAM,YAAY,QAAQ,UAAU,CAAC;AACrC,QAAM,cAAc,QAAQ,UAAU,SAAS;AAE/C,SACE,gBAAAP,OAACQ,OAAA,EAAI,eAAc,UAChB;AAAA,qBACC,gBAAAT;AAAA,MAAC;AAAA;AAAA,QACC,SAAS,EAAE,oBAAoB,aAAa,GAAG,EAAE,MAAM,QAAQ,KAAK,CAAC;AAAA,QACrE,WAAW,MAAM;AACf,gBAAM,SAAS;AACf,0BAAgB,UAAU,UAAU;AACpC,uBAAa,UAAU;AACvB,2BAAiB,IAAI;AACrB,cAAI,WAAW,UAAW,MAAK,OAAO,IAAI,CAAC,WAAW,QAAQ,IAAI,CAAC;AAAA,mBAC1D,WAAW,YAAa,MAAK,OAAO,IAAI,CAAC,aAAa,QAAQ,IAAI,CAAC;AAAA,mBACnE,WAAW,UAAW,MAAK,OAAO,IAAI,CAAC,WAAW,QAAQ,IAAI,CAAC;AAAA,QAC1E;AAAA,QACA,UAAU,MAAM,iBAAiB,IAAI;AAAA;AAAA,IACvC;AAAA,IAGF,gBAAAC,OAACQ,OAAA,EAAI,KAAK,QAAQ,IAAI,cAAc,QAAQ,IAC1C;AAAA,sBAAAT,MAAC,gBAAa,QAAQ,UAAU,MAAM,MAAI,MAAE,kBAAQ,MAAK;AAAA,MACzD,gBAAAA,MAACQ,QAAA,EAAK,OAAO,OAAO,MAAO,qBAAW,WAAW,QAAQ,SAAS,QAAO;AAAA,MACxE,eAAe,gBAAAR,MAAC,eAAY,OAAO,EAAE,iBAAiB,GAAG,SAAQ,WAAU;AAAA,MAC3E,QAAQ,YAAY,gBAAAA,MAAC,eAAY,OAAO,EAAE,gBAAgB,GAAG,SAAQ,WAAU;AAAA,MAC/E,QAAQ,UAAU,gBAAAA,MAAC,eAAY,OAAO,EAAE,cAAc,GAAG,SAAQ,QAAO;AAAA,MACxE,QAAQ,YAAY,gBAAAA,MAAC,eAAY,OAAO,EAAE,eAAe,GAAG,SAAQ,SAAQ;AAAA,MAC5E,QAAQ,cAAc,gBAAAA,MAAC,eAAY,OAAO,EAAE,kBAAkB,GAAG,SAAQ,SAAQ;AAAA,OACpF;AAAA,IAEA,gBAAAC,OAACQ,OAAA,EAAI,eAAc,UAAS,KAAK,QAAQ,IACvC;AAAA,sBAAAT,MAACQ,QAAA,EAAM,kBAAQ,MAAK;AAAA,MAEpB,gBAAAP,OAACQ,OAAA,EAAI,eAAc,UACjB;AAAA,wBAAAT,MAAC,iBAAc,OAAO,aAAa,OAAO,EAAE,iBAAiB,GAAG,UAAU,CAAC,OAAO,MAAM,OAAO,KAAK,GAAG;AAAA,QACvG,gBAAAC,OAACQ,OAAA,EAAI,aAAY,SAAQ,aAAa,OAAO,QAAQ,UAAU,QAAQ,IAAI,eAAc,UACvF;AAAA,0BAAAR,OAACO,QAAA,EAAK;AAAA,4BAAAR,MAACQ,QAAA,EAAK,OAAO,OAAO,OAAQ,YAAE,kBAAkB,GAAE;AAAA,YAAO;AAAA,YAAE,QAAQ;AAAA,aAAS;AAAA,UAClF,gBAAAP,OAACO,QAAA,EAAK;AAAA,4BAAAR,MAACQ,QAAA,EAAK,OAAO,OAAO,OAAQ,YAAE,iBAAiB,GAAE;AAAA,YAAO;AAAA,YAAG,QAAQ;AAAA,aAAQ;AAAA,UACjF,gBAAAP,OAACO,QAAA,EAAK;AAAA,4BAAAR,MAACQ,QAAA,EAAK,OAAO,OAAO,OAAQ,YAAE,aAAa,GAAE;AAAA,YAAO;AAAA,YAAO,QAAQ;AAAA,aAAI;AAAA,UAC7E,gBAAAP,OAACO,QAAA,EAAK;AAAA,4BAAAR,MAACQ,QAAA,EAAK,OAAO,OAAO,OAAQ,YAAE,gBAAgB,GAAE;AAAA,YAAO;AAAA,YAAI,QAAQ,SAAS;AAAA,aAAO;AAAA,UACxF,aACC,gBAAAP,OAAAF,WAAA,EACE;AAAA,4BAAAE,OAACO,QAAA,EAAK;AAAA,8BAAAR,MAACQ,QAAA,EAAK,OAAO,OAAO,OAAQ,YAAE,mBAAmB,GAAE;AAAA,cAAO;AAAA,cAAE,UAAU;AAAA,cAAQ;AAAA,cAAG,mBAAmB,UAAU,IAAI;AAAA,cAAE;AAAA,eAAC;AAAA,YAC3H,gBAAAP,OAACO,QAAA,EAAK;AAAA,8BAAAR,MAACQ,QAAA,EAAK,OAAO,OAAO,OAAQ,YAAE,gBAAgB,GAAE;AAAA,cAAO;AAAA,cAAK,UAAU,qBAAqB,EAAE,YAAY,IAAI,EAAE,WAAW;AAAA,eAAE;AAAA,YAClI,gBAAAP,OAACO,QAAA,EAAK;AAAA,8BAAAR,MAACQ,QAAA,EAAK,OAAO,OAAO,OAAQ,YAAE,mBAAmB,GAAE;AAAA,cAAO;AAAA,cAAE,UAAU,uBAAuB,EAAE,YAAY,IAAI,EAAE,sBAAsB;AAAA,eAAE;AAAA,aACjJ;AAAA,WAEJ;AAAA,SACF;AAAA,MAEC,QAAQ,aAAa,SAAS,KAC7B,gBAAAP,OAACQ,OAAA,EAAI,eAAc,UACjB;AAAA,wBAAAT,MAAC,iBAAc,OAAO,aAAa,OAAO,EAAE,wBAAwB,EAAE,OAAO,QAAQ,aAAa,OAAO,CAAC,GAAG,UAAU,UAAU,OAAO;AAAA,QACxI,gBAAAC,OAACQ,OAAA,EAAI,aAAa,QAAQ,IAAI,UAAS,QAAO,WAAW,GAEtD;AAAA,kBAAQ,aAAa,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC,QACtC,gBAAAT,MAACQ,QAAA,EAAe,OAAO,OAAO,OAAQ,iBAA3B,GAA+B,CAC3C;AAAA,UACA,QAAQ,aAAa,SAAS,MAC7B,gBAAAR,MAACQ,QAAA,EAAK,OAAO,OAAO,eAAe,QAAM,MAAE,YAAE,kBAAkB,EAAE,OAAO,QAAQ,aAAa,SAAS,GAAG,CAAC,GAAE;AAAA,WAEhH;AAAA,SACF;AAAA,MAGD,QAAQ,WACP,gBAAAP,OAACQ,OAAA,EAAI,eAAc,UACjB;AAAA,wBAAAT,MAAC,iBAAc,OAAO,gBAAgB,OAAO,EAAE,iBAAiB,GAAG,OAAO,OAAO,SAAS;AAAA,QAC1F,gBAAAA,MAACS,OAAA,EAAI,aAAY,SAAQ,aAAa,OAAO,SAAS,UAAU,QAAQ,IACtE,0BAAAT,MAACQ,QAAA,EAAK,OAAO,OAAO,SAAS,MAAK,QAAQ,kBAAQ,SAAQ,GAC5D;AAAA,SACF;AAAA,OAEJ;AAAA,IAEA,gBAAAR,MAACS,OAAA,EAAI,WAAW,QAAQ,IACtB,0BAAAR,OAACO,QAAA,EAAK,OAAO,OAAO,eACjB;AAAA,oBAAc,KAAK,EAAE,gBAAgB,CAAC,KAAK,KAAK,EAAE,cAAc,CAAC;AAAA,MACjE,eAAe,QAAQ,WAAW,MAAM,EAAE,cAAc,CAAC,KAAK;AAAA,MAC9D,QAAQ,EAAE,WAAW,CAAC;AAAA,OACzB,GACF;AAAA,KACF;AAEJ;;;AC5OA,SAAgB,aAAAE,aAAW,UAAAC,SAAQ,YAAAC,iBAAgB;AACnD,SAAS,OAAAC,OAAK,QAAAC,cAA6B;AAqGZ,gBAAAC,OAKzB,QAAAC,cALyB;AAtF/B,IAAM,kBAAkB;AAAA,EACtB,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AAAA,EACP,MAAM;AACR;AAIA,SAAS,qBAAqB,SAAyB;AACrD,MAAI,yDAAyD,KAAK,OAAO,GAAG;AAC1E,WAAO,EAAE,0BAA0B;AAAA,EACrC;AACA,SAAO;AACT;AAEO,SAAS,eAAe;AAG7B,QAAM,WAAW,aAAa,CAAC,MAAM,EAAE,QAAQ;AAC/C,QAAM,UAAU,aAAa,CAAC,MAAM,EAAE,OAAO;AAC7C,QAAM,SAAS,aAAa,CAAC,MAAM,EAAE,MAAM;AAC3C,QAAM,gBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa;AACzD,QAAMC,iBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa;AACzD,QAAM,CAAC,QAAQ,SAAS,IAAIC,UAAS,CAAC;AACtC,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA,UAAS,KAAK;AAC9D,QAAM,CAAC,eAAe,gBAAgB,IAAIA,UAA4D,IAAI;AAE1G,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAwB,IAAI;AAC9D,QAAM,eAAeC,QAAmB,IAAI;AAC5C,QAAM,EAAE,OAAO,eAAe,IAAI,iBAAiB,YAAY;AAC/D,QAAM,OAAO,iBAAiB,IAAI,iBAAiB;AACnD,QAAM,OAAO,cAAc,IAAI;AAK/B,QAAM,eAAe,SAAS,WAC1B,KAAK;AAAA,IAAI;AAAA,IAAG,OAAO;AAAA;AAAA,EAAoB,IACvC,KAAK,IAAI,IAAI,KAAK,MAAM,OAAO,IAAI,CAAC;AACxC,QAAM,iBAAiB,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,IAAI,CAAC;AAC1D,QAAM,mBAAmB,eAAe;AAAA,IACtC,cAAc,aAAa,mBAAmB,IAAI;AAAA,IAClD,sBAAsB,aAAa,mBAAmB,KAAK;AAAA,IAC3D,SAAS;AAAA,EACX,CAAC;AAED,EAAAC,YAAU,MAAM;AAAE,kBAAc;AAAA,EAAG,GAAG,CAAC,CAAC;AAExC,eAAa,CAAC,OAAO,QAAQ;AAC3B,QAAI,iBAAkB;AACtB,QAAI,cAAe;AAGnB,QAAI,WAAW;AAAE,mBAAa,IAAI;AAAA,IAAG;AAErC,QAAI,UAAU,OAAO,IAAI,WAAW;AAClC,gBAAU,CAAC,MAAM,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,GAAG,SAAS,SAAS,CAAC,CAAC,CAAC;AAAA,IACpE,WAAW,UAAU,OAAO,IAAI,SAAS;AACvC,gBAAU,CAAC,MAAM,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC;AAAA,IACrC,WAAW,UAAU,OAAO,UAAU,KAAK;AACzC,WAAK,cAAc;AAAA,IACrB;AAEA,UAAM,MAAM,SAAS,MAAM;AAC3B,QAAI,CAAC,IAAK;AAEV,UAAM,WAAW,CAAC,WAAyC;AACzD,0BAAoB,IAAI;AACxB,WAAKH,eAAc,IAAI,MAAM,MAAM,EAChC,MAAM,CAAC,QAAQ;AACd,qBAAa,qBAAqB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;AAAA,MACrF,CAAC,EACA,QAAQ,MAAM;AACb,4BAAoB,KAAK;AAEzB,cAAM,aAAa,aAAa,SAAS,EAAE,OAAO,gBAAgB;AAClE,YAAI,WAAY,cAAa,qBAAqB,UAAU,CAAC;AAAA,MAC/D,CAAC;AAAA,IACL;AAEA,QAAI,UAAU,OAAO,UAAU,IAAK,UAAS,OAAO;AAAA,aAC3C,UAAU,OAAO,UAAU,IAAK,kBAAiB,EAAE,MAAM,QAAQ,MAAM,IAAI,KAAK,CAAC;AAAA,aACjF,UAAU,OAAO,UAAU,IAAK,kBAAiB,EAAE,MAAM,WAAW,MAAM,IAAI,KAAK,CAAC;AAAA,EAC/F,CAAC;AAED,MAAI,QAAQ,SAAU,QAAO,gBAAAF,MAAC,WAAQ,SAAS,EAAE,kBAAkB,GAAG;AACtE,MAAI,OAAO,SAAU,QAAO,gBAAAA,MAAC,gBAAa,SAAS,OAAO,UAAU;AAEpE,MAAI,SAAS,WAAW,GAAG;AACzB,WACE,gBAAAC,OAACK,OAAA,EAAI,eAAc,UACjB;AAAA,sBAAAN,MAAC,iBAAc,OAAO,gBAAgB,OAAO,EAAE,gBAAgB,GAAG,UAAU,UAAU,OAAO;AAAA,MAC7F,gBAAAA,MAACO,QAAA,EAAK,OAAO,OAAO,eAAe,QAAM,MAAE,YAAE,qBAAqB,GAAE;AAAA,OACtE;AAAA,EAEJ;AAEA,QAAM,QAAQ,KAAK,IAAI,GAAG,SAAS,KAAK,MAAM,mBAAmB,CAAC,CAAC;AACnE,QAAM,UAAU,SAAS,MAAM,OAAO,QAAQ,gBAAgB;AAE9D,SACE,gBAAAN,OAACK,OAAA,EAAI,eAAc,UAAS,KAAK,cAC/B;AAAA,oBAAAN,MAAC,iBAAc,OAAO,gBAAgB,OAAO,EAAE,uBAAuB,EAAE,OAAO,SAAS,OAAO,CAAC,GAAG,UAAU,UAAU,OAAO;AAAA,IAE7H,iBACC,gBAAAA,MAACM,OAAA,EAAI,SAAS,QAAQ,IACpB,0BAAAN;AAAA,MAAC;AAAA;AAAA,QACC,SACE,cAAc,SAAS,SACnB,EAAE,wBAAwB,EAAE,MAAM,cAAc,KAAK,CAAC,IACtD,EAAE,2BAA2B,EAAE,MAAM,cAAc,KAAK,CAAC;AAAA,QAE/D,WAAW,MAAM;AACf,gBAAM,EAAE,MAAM,KAAK,IAAI;AACvB,2BAAiB,IAAI;AACrB,8BAAoB,IAAI;AACxB,eAAKE,eAAc,MAAM,IAAI,EAC1B,MAAM,CAAC,QAAQ;AACd,yBAAa,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,UAC/D,CAAC,EACA,QAAQ,MAAM;AACb,gCAAoB,KAAK;AACzB,kBAAM,aAAa,aAAa,SAAS,EAAE,OAAO,gBAAgB;AAClE,gBAAI,WAAY,cAAa,UAAU;AAAA,UACzC,CAAC;AAAA,QACL;AAAA,QACA,UAAU,MAAM,iBAAiB,IAAI;AAAA;AAAA,IACvC,GACF;AAAA,IAGF,gBAAAD,OAACK,OAAA,EAAI,eAAc,UAAS,WAAW,QAAQ,IAC7C;AAAA,sBAAAL,OAACK,OAAA,EAAI,KAAK,QAAQ,IAAI,aAAY,UAAS,cAAY,MAAC,WAAW,OAAO,YAAY,OAAO,aAAa,OAAO,aAAa,OAAO,QAAQ,eAAe,QAAQ,MAClK;AAAA,wBAAAN,MAACO,QAAA,EAAK,MAAI,MAAC,OAAO,OAAO,MAAO,eAAI;AAAA,QACpC,gBAAAP,MAACM,OAAA,EAAI,OAAO,cAAc,YAAY,GAAG,UAAU,GACjD,0BAAAN,MAACO,QAAA,EAAK,MAAI,MAAC,OAAO,OAAO,MAAM,MAAK,YAAY,YAAE,eAAe,GAAE,GACrE;AAAA,QACC,SAAS,YACR,gBAAAP,MAACM,OAAA,EAAI,OAAO,gBAAgB,YAAY,GAAG,UAAU,GACnD,0BAAAN,MAACO,QAAA,EAAK,MAAI,MAAC,OAAO,OAAO,MAAM,MAAK,YAAY,YAAE,iBAAiB,GAAE,GACvE;AAAA,QAED,SAAS,YAAY,SAAS,aAC7B,gBAAAP,MAACM,OAAA,EAAI,UAAU,GAAG,YAAY,GAAG,UAAU,GACzC,0BAAAN,MAACO,QAAA,EAAK,MAAI,MAAC,OAAO,OAAO,MAAM,MAAK,YAAY,YAAE,eAAe,GAAE,GACrE;AAAA,SAEJ;AAAA,MAEC,QAAQ,KACP,gBAAAN,OAACM,QAAA,EAAK,OAAO,OAAO,eAAe,UAAQ,MAAC;AAAA;AAAA,QAAG,EAAE,oBAAoB,EAAE,OAAO,MAAM,CAAC;AAAA,SAAE;AAAA,MAGxF,QAAQ,IAAI,CAAC,KAAK,MAAM;AACvB,cAAM,MAAM,QAAQ;AACpB,cAAM,YAAY,QAAQ;AAC1B,eACE,gBAAAN,OAAC,iBAA6B,WAC5B;AAAA,0BAAAD,MAACM,OAAA,EAAI,OAAO,cAAc,YAAY,GAAG,UAAU,GACjD,0BAAAN;AAAA,YAACO;AAAA,YAAA;AAAA,cACC,MAAM;AAAA,cACN,SAAS;AAAA,cACT,OAAO,YAAY,OAAO,OAAO,OAAO;AAAA,cACxC,MAAK;AAAA,cAEJ,cAAI;AAAA;AAAA,UACP,GACF;AAAA,UACC,SAAS,YACR,gBAAAP,MAACM,OAAA,EAAI,OAAO,gBAAgB,YAAY,GAAG,UAAU,GACnD,0BAAAN,MAAC,eAAY,OAAO,IAAI,QAAQ,SAAS,gBAAgB,IAAI,MAAM,GAAG,GACxE;AAAA,UAED,SAAS,YAAY,SAAS,aAC7B,gBAAAC,OAACK,OAAA,EAAI,UAAU,GAAG,YAAY,GAAG,UAAU,GAAG,KAAK,QAAQ,IACzD;AAAA,4BAAAN,MAACO,QAAA,EAAK,OAAO,OAAO,OAAO,MAAK,YAAY,cAAI,QAAQ,KAAI;AAAA,YAC3D,IAAI,aAAa,QAAQ,IAAI,cAAc,KAC1C,gBAAAP,MAACO,QAAA,EAAK,OAAO,OAAO,OAAQ,YAAE,eAAe,EAAE,MAAM,IAAI,UAAU,CAAC,GAAE;AAAA,aAE1E;AAAA,aAtBgB,IAAI,IAwBxB;AAAA,MAEJ,CAAC;AAAA,MAEA,QAAQ,mBAAmB,SAAS,UACnC,gBAAAN,OAACM,QAAA,EAAK,OAAO,OAAO,eAAe,UAAQ,MAAC;AAAA;AAAA,QAAG,EAAE,oBAAoB,EAAE,OAAO,SAAS,SAAS,QAAQ,iBAAiB,CAAC;AAAA,SAAE;AAAA,OAEhI;AAAA,IAEC,oBAAoB,gBAAAP,MAACO,QAAA,EAAK,OAAO,OAAO,KAAM,YAAE,qBAAqB,GAAE;AAAA,IAGvE,aACC,gBAAAP,MAACM,OAAA,EAAI,WAAW,QAAQ,IACtB,0BAAAN,MAACO,QAAA,EAAK,OAAO,OAAO,OAAQ,qBAAU,GACxC;AAAA,IAGF,gBAAAP,MAACM,OAAA,EAAI,WAAW,QAAQ,IACtB,0BAAAL,OAACM,QAAA,EAAK,OAAO,OAAO,MAAM,MAAI,MAC3B;AAAA,eAAS;AAAA,MAAE;AAAA,MAAE,SAAS;AAAA,OACzB,GACF;AAAA,KACF;AAEJ;;;AC/NA,SAAgB,aAAAC,aAAW,UAAAC,SAAQ,YAAAC,kBAAgB;AACnD,SAAS,OAAAC,OAAK,QAAAC,cAAY;AA2CG,gBAAAC,OAoBnB,QAAAC,cApBmB;AA/BtB,SAAS,aAAa;AAE3B,QAAM,iBAAiB,aAAa,CAAC,MAAM,EAAE,cAAc;AAC3D,QAAM,cAAc,aAAa,CAAC,MAAM,EAAE,WAAW;AACrD,QAAM,UAAU,aAAa,CAAC,MAAM,EAAE,OAAO;AAC7C,QAAM,SAAS,aAAa,CAAC,MAAM,EAAE,MAAM;AAC3C,QAAM,cAAc,aAAa,CAAC,MAAM,EAAE,WAAW;AAGrD,QAAM,CAAC,QAAQ,SAAS,IAAIC,WAAS,CAAC;AACtC,QAAM,kBAAkB,eAAe;AAAA,IACrC,cAAc;AAAA,IACd,sBAAsB;AAAA,IACtB,SAAS;AAAA,EACX,CAAC;AAGD,QAAM,aAAaC,QAAO,IAAI;AAC9B,EAAAC,YAAU,MAAM;AACd,eAAW,UAAU;AACrB,WAAO,MAAM;AAAE,iBAAW,UAAU;AAAA,IAAO;AAAA,EAC7C,GAAG,CAAC,CAAC;AAEL,EAAAA,YAAU,MAAM;AAAE,gBAAY;AAAA,EAAG,GAAG,CAAC,CAAC;AAEtC,eAAa,CAAC,OAAO,QAAQ;AAC3B,QAAI,UAAU,OAAO,UAAU,KAAK;AAAE,WAAK,YAAY;AAAG;AAAA,IAAQ;AAClE,QAAI,UAAU,OAAO,IAAI,UAAW,WAAU,CAAC,MAAM,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,GAAG,eAAe,SAAS,CAAC,CAAC,CAAC;AAAA,aACnG,UAAU,OAAO,IAAI,QAAS,WAAU,CAAC,MAAM,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC;AAAA,EAC5E,CAAC;AAED,MAAI,QAAQ,OAAQ,QAAO,gBAAAJ,MAAC,WAAQ,SAAS,EAAE,gBAAgB,GAAG;AAClE,MAAI,OAAO,OAAQ,QAAO,gBAAAA,MAAC,gBAAa,SAAS,OAAO,QAAQ;AAEhE,QAAM,QAAQ,KAAK,IAAI,GAAG,SAAS,KAAK,MAAM,kBAAkB,CAAC,CAAC;AAClE,QAAM,UAAU,eAAe,MAAM,OAAO,QAAQ,eAAe;AAEnE,SACE,gBAAAC,OAACI,OAAA,EAAI,eAAc,UACjB;AAAA,oBAAAL,MAAC,iBAAc,OAAO,aAAa,OAAO,EAAE,cAAc,GAAG,UAAU,UAAU,SAAS;AAAA,IAE1F,gBAAAC,OAACI,OAAA,EAAI,eAAc,UAAS,WAAW,QAAQ,IAC5C;AAAA,qBACC,gBAAAL,MAAC,gBAAa,QAAO,WAAU,SAAS,UAAU,EAAE,cAAc,CAAC,IAAI;AAAA,MAGxE,gBAAgB,SAAS,eAAe,WAAW,KAClD,gBAAAA,MAACM,QAAA,EAAK,OAAO,OAAO,SAAU,YAAE,4BAA4B,GAAE;AAAA,MAG/D,QAAQ,KACP,gBAAAL,OAACK,QAAA,EAAK,OAAO,OAAO,eAAe,UAAQ,MAAC;AAAA;AAAA,QAAG,EAAE,oBAAoB,EAAE,OAAO,MAAM,CAAC;AAAA,SAAE;AAAA,MAExF,QAAQ,IAAI,CAAC,SAAS,MAAM;AAC3B,cAAM,MAAM,QAAQ;AACpB,eACE,gBAAAN,MAACK,OAAA,EAAmD,eAAc,UAAS,cAAc,QAAQ,IAAI,aAAY,UAAS,aAAa,QAAQ,SAAS,OAAO,OAAO,OAAO,SAAS,UAAU,QAAQ,IACrM,kBAAQ,MAAM,IAAI,EAAE,IAAI,CAAC,MAAM,MAC9B,gBAAAL,MAACM,QAAA,EAAsD,OAAO,MAAM,IAAI,OAAO,UAAU,OAAO,OAAO,MAAK,QAAQ,kBAAzG,WAAW,GAAG,IAAI,CAAC,IAAI,KAAK,MAAM,GAAG,EAAE,CAAC,EAAsE,CAC1H,KAHO,WAAW,GAAG,IAAI,QAAQ,MAAM,GAAG,EAAE,CAAC,EAIhD;AAAA,MAEJ,CAAC;AAAA,MACA,QAAQ,kBAAkB,eAAe,UACxC,gBAAAL,OAACK,QAAA,EAAK,OAAO,OAAO,eAAe,UAAQ,MAAC;AAAA;AAAA,QAAG,EAAE,oBAAoB,EAAE,OAAO,eAAe,SAAS,QAAQ,gBAAgB,CAAC;AAAA,SAAE;AAAA,OAErI;AAAA,IAEA,gBAAAN,MAACK,OAAA,EAAI,WAAW,QAAQ,IACtB,0BAAAL,MAACM,QAAA,EAAK,OAAO,OAAO,MAAM,MAAI,MAC3B,yBAAe,SAAS,IAAI,GAAG,mBAAmB,eAAe,MAAM,IAAI,IAC9E,GACF;AAAA,KACF;AAEJ;;;ACxFA,SAAgB,aAAAC,aAAW,UAAAC,SAAQ,YAAAC,kBAAgB;AACnD,SAAS,OAAAC,aAAW;;;ACDpB,SAAS,UAAAC,eAAc;;;ACAvB,SAAS,UAAU,aAAAC,YAAW,SAAS,IAAI,cAAc;AACzD,SAAS,MAAM,gBAAgB;;;ACUxB,SAAS,aAAa,SAA6B,UAAU,OAAe;AACjF,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI,CAAC,SAAS,cAAe,QAAO;AAGpC,SAAO,gBAAgB,QAAQ,aAAa;AAC9C;;;ADPA,SAAS,SAAS,OAAsB;AACtC,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,sBAAsB;AACpD;AAOA,IAAM,0BAA0B;AAEhC,SAAS,oBAAoB,MAAoB;AAC/C,MAAI,CAAC,QAAQ,KAAK,KAAK,EAAE,WAAW,GAAG;AACrC,UAAM,IAAI,MAAM,8BAA8B;AAAA,EAChD;AACA,MAAI,KAAK,SAAS,yBAAyB;AACzC,UAAM,IAAI,MAAM,iCAAiC,uBAAuB,cAAc;AAAA,EACxF;AACA,MAAI,CAAC,aAAa,KAAK,IAAI,GAAG;AAC5B,UAAM,IAAI,MAAM,0BAA0B,IAAI,yEAAyE;AAAA,EACzH;AACF;AAEA,SAAS,YAAY,MAAsB;AACzC,sBAAoB,IAAI;AAGxB,SAAO,KAAK,cAAc,GAAG,SAAS,IAAI,CAAC,OAAO;AACpD;AAEA,eAAsB,aAAa,OAAmC;AACpE,WAAS,KAAK;AACd,QAAM,eAAe;AACrB,MAAI;AACF,UAAM,QAAQ,MAAM,QAAQ,YAAY;AACxC,WAAO,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS,OAAO,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,SAAS,EAAE,CAAC;AAAA,EACnF,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,eAAsB,YAAY,OAAgB,MAAgC;AAChF,WAAS,KAAK;AACd,QAAM,MAAM,MAAM,SAAS,YAAY,IAAI,GAAG,OAAO;AACrD,MAAI;AACJ,MAAI;AACF,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,SAAS,KAAK;AACZ,UAAM,IAAI,MAAM,YAAY,IAAI,mBAAmB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,IAAI,EAAE,OAAO,IAAI,CAAC;AAAA,EACvH;AACA,MAAI,KAAK,YAAY,GAAG;AAEtB,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC5C;AACA,MAAI,CAAC,KAAK,SAAS;AACjB,UAAM,IAAI,MAAM,YAAY,IAAI,4BAA4B;AAAA,EAC9D;AACA,SAAO,KAAK;AACd;AAEA,eAAsB,YAAY,OAAgB,SAAiC;AACjF,WAAS,KAAK;AACd,QAAM,eAAe;AAGrB,QAAM,WAAW,YAAY,QAAQ,IAAI;AACzC,QAAM,UAAU,WAAW;AAC3B,QAAM,OAAoB,EAAE,SAAS,GAAG,QAAQ;AAChD,QAAMC,WAAU,SAAS,KAAK,UAAU,MAAM,MAAM,CAAC,GAAG,EAAE,UAAU,SAAS,MAAM,IAAM,CAAC;AAC1F,QAAM,OAAO,SAAS,QAAQ;AAChC;AAEA,eAAsB,cAAc,OAAgB,MAA6B;AAC/E,WAAS,KAAK;AACd,MAAI;AACF,UAAM,GAAG,YAAY,IAAI,CAAC;AAAA,EAC5B,QAAQ;AAAA,EAAsB;AAChC;AAEA,eAAsB,mBAAmB,OAAgB,MAAc,aAAqB,UAA8B,MAAM,UAAU,MAAwB;AAChK,WAAS,KAAK;AAGd,QAAM,gBAAgB,MAAM,aAAa,KAAK;AAC9C,MAAI,cAAc,SAAS,IAAI,GAAG;AAChC,UAAM,IAAI,MAAM,6BAA6B,IAAI;AAAA,EACnD;AAEA,QAAM,CAAC,WAAW,QAAQ,OAAO,IAAI,MAAM,QAAQ,IAAI;AAAA,IACrD,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC,KAAK,CAAC;AAAA,EAClB,CAAC;AAED,QAAM,OAAO,QAAQ,MAAM,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO;AACpE,QAAM,QAAQ,UAAU,MACrB,OAAO,CAAC,MAAM,EAAE,SAAS,EACzB,IAAI,CAAC,MAAM,EAAE,KAAK;AAErB,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,QAAM,UAAmB;AAAA,IACvB;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA,YAAY,aAAa,SAAS,OAAO;AAAA;AAAA,EAC3C;AAEA,QAAM,YAAY,OAAO,OAAO;AAChC,SAAO;AACT;AAEA,eAAsB,cAAc,OAAgB,SAAiB,SAAiB,gBAAuC;AAC3H,WAAS,KAAK;AACd,QAAM,UAAU,MAAM,YAAY,OAAO,OAAO;AAChD,MAAI,YAAY,SAAS;AACvB,UAAM,cAAc,OAAO,OAAO;AAAA,EACpC;AACA,QAAM,UAAmB;AAAA,IACvB,GAAG;AAAA,IACH,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC;AACA,QAAM,YAAY,OAAO,OAAO;AAClC;AASA,IAAM,cAAc;AACpB,IAAM,cAAc;AAEpB,gBAAuB,cAAc,OAAgB,SAA0C;AAC7F,WAAS,KAAK;AAEd,QAAM,YAAY,MAAM,aAAa;AACrC,QAAM,oBAAoB,IAAI,IAAI,UAAU,SAAS,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AACvE,QAAM,iBAAiB,IAAI,IAAI,UAAU,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAG7F,aAAW,OAAO,QAAQ,MAAM;AAC9B,QAAI,CAAC,YAAY,KAAK,GAAG,GAAG;AAC1B,YAAM,8BAA8B,GAAG;AACvC;AAAA,IACF;AACA,UAAM,EAAE,sBAAsB,EAAE,MAAM,IAAI,CAAC;AAC3C,QAAI;AACF,YAAM,SAAS,CAAC,OAAO,GAAG,CAAC;AAAA,IAC7B,QAAQ;AAAA,IAA8B;AAAA,EACxC;AAGA,QAAM,kBAAkB,QAAQ,SAAS,OAAO,CAAC,MAAM,CAAC,kBAAkB,IAAI,CAAC,CAAC;AAChF,aAAW,QAAQ,iBAAiB;AAClC,QAAI,CAAC,YAAY,KAAK,IAAI,GAAG;AAC3B,YAAM,kCAAkC,IAAI;AAC5C;AAAA,IACF;AACA,UAAM,EAAE,yBAAyB,EAAE,KAAK,CAAC;AACzC,qBAAiB,QAAQ,WAAW,CAAC,WAAW,IAAI,CAAC,GAAG;AACtD,YAAM;AAAA,IACR;AAAA,EACF;AAGA,QAAM,eAAe,QAAQ,MAAM,OAAO,CAAC,MAAM,CAAC,eAAe,IAAI,CAAC,CAAC;AACvE,aAAW,QAAQ,cAAc;AAC/B,QAAI,CAAC,YAAY,KAAK,IAAI,GAAG;AAC3B,YAAM,+BAA+B,IAAI;AACzC;AAAA,IACF;AACA,UAAM,EAAE,6BAA6B,EAAE,KAAK,CAAC;AAC7C,qBAAiB,QAAQ,WAAW,CAAC,WAAW,UAAU,IAAI,CAAC,GAAG;AAChE,YAAM;AAAA,IACR;AAAA,EACF;AAEA,QAAM,iBAAiB,gBAAgB,SAAS,aAAa;AAC7D,QAAM,EAAE,yBAAyB,EAAE,OAAO,eAAe,CAAC;AAC5D;;;AD/KA,SAAS,WAAoB;AAC3B,QAAM,EAAE,SAAS,OAAO,IAAI,gBAAgB,SAAS;AACrD,SAAO,UAAU,SAAS,MAAM;AAClC;AAEO,IAAM,kBAAkBC,QAAqB,CAAC,SAAS;AAAA,EAC5D,cAAc,CAAC;AAAA,EACf,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,WAAW;AAAA,EAEX,eAAe,YAAY;AACzB,QAAI,EAAE,SAAS,KAAK,CAAC;AACrB,UAAM,QAAQ,MAAc,aAAa,SAAS,CAAC;AACnD,QAAI,EAAE,cAAc,OAAO,SAAS,MAAM,CAAC;AAAA,EAC7C;AAAA,EAEA,aAAa,OAAO,SAAS;AAC3B,QAAI,EAAE,WAAW,KAAK,CAAC;AACvB,QAAI;AACF,YAAM,UAAU,MAAc,YAAY,SAAS,GAAG,IAAI;AAC1D,UAAI,EAAE,iBAAiB,QAAQ,CAAC;AAAA,IAClC,SAAS,KAAK;AACZ,UAAI,EAAE,WAAW,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE,CAAC;AAAA,IACrE;AAAA,EACF;AAAA,EAEA,eAAe,OAAO,MAAM,gBAAgB;AAC1C,QAAI,EAAE,SAAS,MAAM,WAAW,KAAK,CAAC;AACtC,QAAI;AACF,YAAM,UAAU,gBAAgB,SAAS,EAAE;AAC3C,YAAc,mBAAmB,SAAS,GAAG,MAAM,aAAa,OAAO;AACvE,YAAM,QAAQ,MAAc,aAAa,SAAS,CAAC;AACnD,UAAI,EAAE,cAAc,OAAO,SAAS,MAAM,CAAC;AAAA,IAC7C,SAAS,KAAK;AACZ,UAAI,EAAE,SAAS,OAAO,WAAW,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE,CAAC;AACnF,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,eAAe,OAAO,SAAS;AAC7B,UAAc,cAAc,SAAS,GAAG,IAAI;AAC5C,UAAM,QAAQ,MAAc,aAAa,SAAS,CAAC;AACnD,QAAI,EAAE,cAAc,OAAO,iBAAiB,KAAK,CAAC;AAAA,EACpD;AAAA,EAEA,eAAe,OAAO,SAAS,SAAS,mBAAmB;AACzD,QAAI,EAAE,WAAW,KAAK,CAAC;AACvB,QAAI;AACF,YAAc,cAAc,SAAS,GAAG,SAAS,SAAS,cAAc;AACxE,YAAM,QAAQ,MAAc,aAAa,SAAS,CAAC;AACnD,YAAM,UAAU,MAAc,YAAY,SAAS,GAAG,OAAO;AAC7D,UAAI,EAAE,cAAc,OAAO,iBAAiB,QAAQ,CAAC;AAAA,IACvD,SAAS,KAAK;AACZ,UAAI,EAAE,WAAW,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE,CAAC;AAAA,IACrE;AAAA,EACF;AACF,EAAE;;;AG9EF,SAAS,OAAAC,OAAK,QAAAC,cAAY;AAqBpB,gBAAAC,OAuBM,QAAAC,cAvBN;AAHC,SAAS,gBAAgB,EAAE,cAAc,QAAQ,eAAe,WAAW,iBAAiB,eAAe,GAAyB;AACzI,SACE,gBAAAA,OAACC,OAAA,EAAI,eAAc,UACjB;AAAA,oBAAAF,MAAC,iBAAc,OAAO,aAAa,OAAO,EAAE,kBAAkB,EAAE,OAAO,aAAa,OAAO,CAAC,GAAG,UAAU,UAAU,MAAM;AAAA,IAGxH,aACC,gBAAAA,MAACE,OAAA,EAAI,SAAS,QAAQ,IACpB,0BAAAF,MAACG,QAAA,EAAK,OAAO,OAAO,OAAQ,qBAAU,GACxC;AAAA,IAGD,iBAAiB,aAAa,MAAM,KACnC,gBAAAH,MAACE,OAAA,EAAI,SAAS,QAAQ,IACpB,0BAAAF;AAAA,MAAC;AAAA;AAAA,QACC,SAAS,EAAE,0BAA0B,EAAE,MAAM,aAAa,MAAM,EAAE,CAAC;AAAA,QACnE,WAAW;AAAA,QACX,UAAU;AAAA;AAAA,IACZ,GACF;AAAA,IAGD,aAAa,WAAW,KAAK,CAAC,iBAC7B,gBAAAA,MAACE,OAAA,EAAI,WAAW,QAAQ,IAAI,aAAY,SAAQ,aAAa,OAAO,eAAe,UAAU,QAAQ,IAAI,UAAU,QAAQ,MACzH,0BAAAD,OAACC,OAAA,EAAI,eAAc,UACjB;AAAA,sBAAAF,MAACG,QAAA,EAAK,OAAO,OAAO,eAAe,QAAM,MAAE,YAAE,qBAAqB,GAAE;AAAA,MACpE,gBAAAF,OAACE,QAAA,EAAK,OAAO,OAAO,OAAQ;AAAA,UAAE,gBAAgB;AAAA,QAAE;AAAA,QAAC,gBAAAH,MAACG,QAAA,EAAK,OAAO,OAAO,MAAM,MAAI,MAAC,eAAC;AAAA,QAAO;AAAA,QAAE,EAAE,qBAAqB;AAAA,SAAE;AAAA,OACrH,GACF;AAAA,IAGD,aAAa,SAAS,KAAK,CAAC,iBAC3B,gBAAAF,OAACC,OAAA,EAAI,eAAc,UAAS,WAAW,QAAQ,IAC5C;AAAA,mBAAa,IAAI,CAAC,MAAM,MAAM;AAC7B,cAAM,YAAY,MAAM;AACxB,eACE,gBAAAF,MAAC,iBAAyB,WACxB,0BAAAA,MAACG,QAAA,EAAK,MAAM,WAAW,SAAS,WAAY,gBAAK,KAD/B,IAEpB;AAAA,MAEJ,CAAC;AAAA,MACD,gBAAAH,MAACE,OAAA,EAAI,WAAW,QAAQ,IACtB,0BAAAD,OAACE,QAAA,EAAK,OAAO,OAAO,MAAM,MAAI,MAAE;AAAA,iBAAS;AAAA,QAAE;AAAA,QAAE,aAAa;AAAA,SAAO,GACnE;AAAA,OACF;AAAA,KAEJ;AAEJ;;;AClEA,SAAS,OAAAC,OAAK,QAAAC,cAAY;AAgCpB,gBAAAC,OAKE,QAAAC,cALF;AApBC,SAAS,kBAAkB,EAAE,QAAQ,GAA2B;AAGrE,QAAM,YAAY,eAAe;AAAA,IAC/B,cAAc;AAAA,IACd,sBAAsB;AAAA,IACtB,SAAS;AAAA,EACX,CAAC;AACD,QAAM,QAAQ,QAAQ,SAAS,SAAS,QAAQ,MAAM;AACtD,QAAM,iBAAiB,UAAU,IAC7B,IACA,KAAK,IAAI,QAAQ,SAAS,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAO,QAAQ,SAAS,SAAS,QAAS,SAAS,CAAC,CAAC;AAC5G,QAAM,cAAc,KAAK,IAAI,GAAG,YAAY,cAAc;AAC1D,QAAM,kBAAkB,QAAQ,SAAS,MAAM,GAAG,cAAc;AAChE,QAAM,eAAe,QAAQ,MAAM,MAAM,GAAG,WAAW;AACvD,QAAM,iBAAiB,QAAQ,SAAS,SAAS,gBAAgB;AACjE,QAAM,cAAc,QAAQ,MAAM,SAAS,aAAa;AAExD,SACE,gBAAAA,OAACC,OAAA,EAAI,eAAc,UACjB;AAAA,oBAAAF,MAACG,QAAA,EAAK,MAAI,MAAC,OAAO,OAAO,MAAO,kBAAQ,MAAK;AAAA,IAC7C,gBAAAH,MAACG,QAAA,EAAK,OAAO,OAAO,OAAO,MAAK,QAAQ,kBAAQ,aAAY;AAAA,IAC5D,gBAAAH,MAACG,QAAA,EAAK,OAAO,OAAO,OAAQ,YAAE,oBAAoB,EAAE,MAAM,WAAW,QAAQ,SAAS,EAAE,CAAC,GAAE;AAAA,IAC3F,gBAAAF,OAACC,OAAA,EAAI,WAAW,QAAQ,IAAI,eAAc,UACxC;AAAA,sBAAAF,MAACG,QAAA,EAAK,MAAI,MAAE,YAAE,0BAA0B,EAAE,OAAO,QAAQ,SAAS,OAAO,CAAC,GAAE;AAAA,MAC5E,gBAAAF,OAACC,OAAA,EAAI,aAAa,QAAQ,IAAI,eAAc,UACzC;AAAA,wBAAgB,IAAI,CAAC,MACpB,gBAAAF,MAACG,QAAA,EAAa,OAAO,OAAO,OAAQ,eAAzB,CAA2B,CACvC;AAAA,QACA,iBAAiB,KAChB,gBAAAH,MAACG,QAAA,EAAK,OAAO,OAAO,eAAe,QAAM,MAAE,YAAE,kBAAkB,EAAE,OAAO,eAAe,CAAC,GAAE;AAAA,SAE9F;AAAA,MACA,gBAAAH,MAACG,QAAA,EAAK,MAAI,MAAE,YAAE,uBAAuB,EAAE,OAAO,QAAQ,MAAM,OAAO,CAAC,GAAE;AAAA,MACtE,gBAAAF,OAACC,OAAA,EAAI,aAAa,QAAQ,IAAI,eAAc,UACzC;AAAA,qBAAa,IAAI,CAAC,MACjB,gBAAAF,MAACG,QAAA,EAAa,OAAO,OAAO,OAAQ,eAAzB,CAA2B,CACvC;AAAA,QACA,cAAc,KACb,gBAAAH,MAACG,QAAA,EAAK,OAAO,OAAO,eAAe,QAAM,MAAE,YAAE,kBAAkB,EAAE,OAAO,YAAY,CAAC,GAAE;AAAA,SAE3F;AAAA,OACF;AAAA,IACA,gBAAAH,MAACE,OAAA,EAAI,WAAW,QAAQ,IACtB,0BAAAD,OAACE,QAAA,EAAK,OAAO,OAAO,eAAe;AAAA;AAAA,MAAK,EAAE,WAAW;AAAA,MAAE;AAAA,MAAI,EAAE,WAAW;AAAA,MAAE;AAAA,MAAI,EAAE,oBAAoB;AAAA,OAAE,GACxG;AAAA,KACF;AAEJ;;;AC5DA,SAAS,OAAAC,OAAK,QAAAC,cAAY;AAC1B,SAAS,aAAAC,kBAAiB;AAUtB,SACE,OAAAC,OADF,QAAAC,cAAA;AAFG,SAAS,kBAAkB,EAAE,SAAS,GAA2B;AACtE,SACE,gBAAAA,OAACC,OAAA,EAAI,eAAc,UACjB;AAAA,oBAAAF,MAACG,QAAA,EAAK,MAAI,MAAE,YAAE,qBAAqB,GAAE;AAAA,IACrC,gBAAAH;AAAA,MAACI;AAAA,MAAA;AAAA,QACC,aAAa,EAAE,0BAA0B;AAAA,QACzC;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;AAQO,SAAS,kBAAkB,EAAE,MAAM,WAAW,SAAS,GAA2B;AACvF,SACE,gBAAAH,OAACC,OAAA,EAAI,eAAc,UACjB;AAAA,oBAAAF,MAACG,QAAA,EAAK,MAAI,MAAE,YAAE,uBAAuB,EAAE,KAAK,CAAC,GAAE;AAAA,IAC9C,aAAa,gBAAAF,OAACE,QAAA,EAAK,OAAO,OAAO,OAAQ;AAAA,QAAE,cAAc;AAAA,MAAG;AAAA,OAAU;AAAA,IACvE,gBAAAH;AAAA,MAACI;AAAA,MAAA;AAAA,QACC,aAAa,EAAE,0BAA0B;AAAA,QACzC;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;;;ACtCA,SAAS,OAAAC,OAAK,QAAAC,cAAY;AAC1B,SAAS,aAAAC,kBAAiB;AAWtB,SACE,OAAAC,OADF,QAAAC,cAAA;AAFG,SAAS,gBAAgB,EAAE,aAAa,SAAS,GAAyB;AAC/E,SACE,gBAAAA,OAACC,OAAA,EAAI,eAAc,UACjB;AAAA,oBAAAF,MAACG,QAAA,EAAK,MAAI,MAAE,YAAE,mBAAmB,GAAE;AAAA,IACnC,gBAAAH;AAAA,MAACI;AAAA,MAAA;AAAA,QACC,cAAc;AAAA,QACd;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;AASO,SAAS,gBAAgB,EAAE,MAAM,aAAa,WAAW,SAAS,GAAyB;AAChG,SACE,gBAAAH,OAACC,OAAA,EAAI,eAAc,UACjB;AAAA,oBAAAF,MAACG,QAAA,EAAK,MAAI,MAAE,YAAE,qBAAqB,EAAE,KAAK,CAAC,GAAE;AAAA,IAC5C,aAAa,gBAAAF,OAACE,QAAA,EAAK,OAAO,OAAO,OAAQ;AAAA,QAAE,cAAc;AAAA,MAAG;AAAA,OAAU;AAAA,IACvE,gBAAAH;AAAA,MAACI;AAAA,MAAA;AAAA,QACC,cAAc;AAAA,QACd;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;;;APyFsB,gBAAAC,OA0BhB,QAAAC,cA1BgB;AA9Gf,SAAS,eAAe;AAC7B,QAAM,EAAE,cAAc,iBAAiB,SAAS,WAAW,eAAe,aAAAC,cAAa,eAAe,eAAAC,gBAAe,eAAAC,eAAc,IAAI,gBAAgB;AACvJ,QAAM,CAAC,QAAQ,SAAS,IAAIC,WAAS,CAAC;AACtC,QAAM,CAAC,MAAM,OAAO,IAAIA,WAAe,MAAM;AAC7C,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAS,EAAE;AACzC,QAAM,CAAC,eAAe,gBAAgB,IAAIA,WAAS,KAAK;AACxD,QAAM,CAAC,UAAU,WAAW,IAAIA,WAAS,EAAE;AAC3C,QAAM,CAAC,UAAU,WAAW,IAAIA,WAAS,EAAE;AAC3C,QAAM,CAAC,aAAa,cAAc,IAAIA,WAAmB,CAAC,CAAC;AAC3D,QAAM,CAAC,eAAe,gBAAgB,IAAIA,WAAS,KAAK;AACxD,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,WAAS,KAAK;AAC1D,QAAM,CAACC,gBAAe,gBAAgB,IAAID,WAAiE,IAAI;AAC/G,QAAM,EAAE,WAAW,WAAW,IAAI,cAAc;AAChD,QAAM,eAAeE,QAAsC,IAAI;AAC/D,QAAM,aAAaA,QAAO,IAAI;AAE9B,EAAAC,YAAU,MAAM;AAAE,kBAAc;AAAA,EAAG,GAAG,CAAC,CAAC;AAExC,EAAAA,YAAU,MAAM;AACd,eAAW,UAAU;AACrB,WAAO,MAAM;AACX,iBAAW,UAAU;AACrB,mBAAa,SAAS,OAAO,MAAS;AACtC,mBAAa,UAAU;AAAA,IACzB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,EAAAA,YAAU,MAAM;AACd,QAAI,SAAS,QAAQ;AACnB,gBAAU;AACV,aAAO,MAAM;AAAE,mBAAW;AAAA,MAAG;AAAA,IAC/B;AACA,WAAO;AAAA,EACT,GAAG,CAAC,IAAI,CAAC;AAET,eAAa,CAAC,OAAO,QAAQ;AAC3B,QAAI,SAAS,UAAU,cAAe;AAEtC,QAAI,UAAU,OAAO,UAAU,KAAK;AAAE,cAAQ,aAAa;AAAG;AAAA,IAAQ;AACtE,SAAK,UAAU,OAAO,UAAU,QAAQ,aAAa,MAAM,GAAG;AAAE,uBAAiB,IAAI;AAAG;AAAA,IAAQ;AAChG,QAAI,IAAI,UAAU,aAAa,MAAM,GAAG;AACtC,WAAKN,aAAY,aAAa,MAAM,CAAC;AACrC,cAAQ,QAAQ;AAChB;AAAA,IACF;AACA,SAAK,UAAU,OAAO,UAAU,QAAQ,aAAa,MAAM,GAAG;AAC5D,WAAK,cAAc,aAAa,MAAM,CAAC;AACvC;AAAA,IACF;AAEA,QAAI,UAAU,OAAO,IAAI,UAAW,WAAU,CAAC,MAAM,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,GAAG,aAAa,SAAS,CAAC,CAAC,CAAC;AAAA,aACjG,UAAU,OAAO,IAAI,QAAS,WAAU,CAAC,MAAM,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC;AAAA,EAC5E,CAAC;AAED,eAAa,CAAC,OAAO,QAAQ;AAC3B,QAAI,IAAI,UAAU,UAAU,KAAK;AAC/B,cAAQ,MAAM;AACd;AAAA,IACF;AACA,SAAK,UAAU,OAAO,UAAU,QAAQ,iBAAiB;AACvD,kBAAY,gBAAgB,IAAI;AAChC,kBAAY,gBAAgB,WAAW;AACvC,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF,GAAG,EAAE,UAAU,SAAS,SAAS,CAAC;AAElC,eAAa,MAAM;AACjB,YAAQ,MAAM;AAAA,EAChB,GAAG,EAAE,UAAU,SAAS,eAAe,CAAC,cAAc,CAAC;AAGvD,QAAM,gBAAgB,OAAO,SAAiB;AAC5C,QAAI;AACF,YAAM,QAAQ,gBAAgB,SAAS,EAAE,MAAM;AAC/C,YAAM,UAAU,MAAc,YAAY,OAAO,IAAI;AACrD,uBAAiB,OAAO;AACxB,cAAQ,gBAAgB;AAAA,IAC1B,SAAS,KAAK;AACZ,qBAAe,CAAC,GAAG,EAAE,cAAc,CAAC,GAAG,eAAe,QAAQ,IAAI,UAAU,GAAG,EAAE,CAAC;AAClF,cAAQ,WAAW;AACnB,uBAAiB,KAAK;AAAA,IACxB;AAAA,EACF;AAEA,QAAM,cAAc,OAAO,YAA6D;AACtF,YAAQ,WAAW;AACnB,mBAAe,CAAC,CAAC;AACjB,qBAAiB,IAAI;AACrB,sBAAkB,KAAK;AACvB,QAAI;AACF,YAAM,QAAQ,gBAAgB,SAAS,EAAE,MAAM;AAC/C,YAAM,MAAc,cAAc,OAAO,OAAO;AAChD,mBAAa,UAAU;AACvB,uBAAiB,QAAQ,KAAK;AAC5B,YAAI,CAAC,WAAW,QAAS;AACzB,uBAAe,CAAC,SAAS,CAAC,GAAG,KAAK,MAAM,GAAG,GAAG,IAAI,CAAC;AAAA,MACrD;AAAA,IACF,SAAS,KAAK;AACZ,UAAI,WAAW,SAAS;AACtB,0BAAkB,IAAI;AACtB,uBAAe,CAAC,SAAS,CAAC,GAAG,MAAM,GAAG,EAAE,cAAc,CAAC,GAAG,eAAe,QAAQ,IAAI,UAAU,GAAG,EAAE,CAAC;AAAA,MACvG;AAAA,IACF,UAAE;AACA,mBAAa,UAAU;AACvB,UAAI,WAAW,SAAS;AACtB,yBAAiB,KAAK;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAS,QAAO,gBAAAF,MAAC,WAAQ,SAAS,EAAE,kBAAkB,GAAG;AAE7D,MAAI,SAAS,oBAAoBM,gBAAe;AAC9C,WACE,gBAAAN,MAACS,OAAA,EAAI,eAAc,UACjB,0BAAAT;AAAA,MAAC;AAAA;AAAA,QACC,SAAS,EAAE,0BAA0B;AAAA,UACnC,UAAU,OAAOM,eAAc,SAAS,MAAM;AAAA,UAC9C,OAAO,OAAOA,eAAc,MAAM,MAAM;AAAA,QAC1C,CAAC;AAAA,QACD,WAAW,MAAM;AACf,gBAAM,UAAUA;AAChB,2BAAiB,IAAI;AACrB,eAAK,YAAY,OAAO;AAAA,QAC1B;AAAA,QACA,UAAU,MAAM;AACd,2BAAiB,IAAI;AACrB,kBAAQ,MAAM;AAAA,QAChB;AAAA;AAAA,IACF,GACF;AAAA,EAEJ;AAEA,MAAI,SAAS,aAAa;AACxB,WACE,gBAAAL,OAACQ,OAAA,EAAI,eAAc,UACjB;AAAA,sBAAAT,MAAC,eAAY,OAAO,aAAa,WAAW,eAAe,OAAO,EAAE,sBAAsB,GAAG;AAAA,MAC5F,CAAC,iBACA,gBAAAA,MAACS,OAAA,EAAI,WAAW,QAAQ,IACtB,0BAAAT,MAAC,gBAAa,QAAQ,iBAAiB,UAAU,WAAW,SAAS,iBAAiB,EAAE,wBAAwB,IAAI,UAAU,EAAE,yBAAyB,CAAC,IAAI,GAChK;AAAA,OAEJ;AAAA,EAEJ;AAEA,MAAI,SAAS,eAAe;AAC1B,WAAO,gBAAAA,MAAC,qBAAkB,UAAU,CAAC,QAAQ;AAAE,iBAAW,GAAG;AAAG,cAAQ,aAAa;AAAA,IAAG,GAAG;AAAA,EAC7F;AAEA,MAAI,SAAS,eAAe;AAC1B,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN;AAAA,QACA,UAAU,OAAO,QAAQ;AACvB,cAAI;AACF,kBAAM,cAAc,SAAS,GAAG;AAAA,UAClC,UAAE;AACA,oBAAQ,MAAM;AACd,uBAAW,EAAE;AAAA,UACf;AAAA,QACF;AAAA;AAAA,IACF;AAAA,EAEJ;AAEA,MAAI,SAAS,aAAa;AACxB,WAAO,gBAAAA,MAAC,mBAAgB,aAAa,UAAU,UAAU,CAAC,QAAQ;AAAE,kBAAY,GAAG;AAAG,cAAQ,WAAW;AAAA,IAAG,GAAG;AAAA,EACjH;AAEA,MAAI,SAAS,aAAa;AACxB,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN,aAAa;AAAA,QACb;AAAA,QACA,UAAU,OAAO,QAAQ;AACvB,cAAI,iBAAiB;AACnB,kBAAMI,eAAc,gBAAgB,MAAM,UAAU,GAAG;AAAA,UACzD;AACA,kBAAQ,QAAQ;AAChB,sBAAY,EAAE;AACd,sBAAY,EAAE;AAAA,QAChB;AAAA;AAAA,IACF;AAAA,EAEJ;AAEA,MAAI,SAAS,YAAY,iBAAiB;AACxC,WAAO,gBAAAJ,MAAC,qBAAkB,SAAS,iBAAiB;AAAA,EACtD;AAEA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,iBAAiB,MAAM;AAAE,aAAKG,eAAc,aAAa,MAAM,CAAC;AAAG,yBAAiB,KAAK;AAAA,MAAG;AAAA,MAC5F,gBAAgB,MAAM,iBAAiB,KAAK;AAAA;AAAA,EAC9C;AAEJ;;;AQhOA,SAAgB,aAAAO,aAAW,UAAAC,UAAQ,YAAAC,kBAAgB;AACnD,SAAS,OAAAC,OAAK,QAAAC,cAAY;;;ACD1B,SAAS,UAAAC,gBAAc;;;ACAvB,SAAS,gBAAgB;AACzB,SAAS,iBAAiB;AAM1B,IAAM,gBAAgB,UAAU,QAAQ;AAExC,eAAe,aAAa,YAAqC;AAC/D,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,MAAM,cAAc,MAAM,CAAC,OAAO,UAAU,CAAC;AAChE,UAAM,KAAK,SAAS,OAAO,MAAM,GAAI,EAAE,CAAC,KAAK,KAAK,EAAE;AACpD,WAAO,KAAK;AAAA,EACd,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,cAAc,MAAsC;AACjE,MAAI;AACF,UAAM,MAAM,MAAM,SAAS,CAAC,YAAY,IAAI,CAAC;AAC7C,WAAO,IAAI,KAAK,KAAK;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,eACpB,OACA,UACA,QACyB;AACzB,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,sBAAsB;AAElD,QAAM,YAAY,IAAI,IAAI,MAAM;AAGhC,QAAM,cAAc,oBAAI,IAAoB;AAC5C,aAAW,KAAK,UAAU;AACxB,eAAW,OAAO,EAAE,cAAc;AAChC,kBAAY,IAAI,MAAM,YAAY,IAAI,GAAG,KAAK,KAAK,CAAC;AAAA,IACtD;AAAA,EACF;AAGA,QAAM,UAAoB,CAAC;AAE3B,aAAW,KAAK,UAAU;AACxB,UAAM,YAAY,EAAE,UAAU,CAAC;AAC/B,QAAI,CAAC,UAAW;AAEhB,QAAI,UAAU,2BAA2B,CAAC,UAAU,wBAAwB,CAAC,UAAU,IAAI,EAAE,IAAI,GAAG;AAGlG,UAAI,WAAW;AACf,iBAAW,SAAS,UAAU;AAC5B,YAAI,MAAM,SAAS,EAAE,KAAM;AAC3B,YAAI,MAAM,aAAa,SAAS,EAAE,IAAI,GAAG;AACvC,qBAAW;AACX;AAAA,QACF;AAAA,MACF;AACA,UAAI,CAAC,UAAU;AACb,gBAAQ,KAAK,EAAE,IAAI;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAGA,QAAM,aAAiC,CAAC;AACxC,QAAM,cAAc;AAEpB,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK,aAAa;AACpD,UAAM,QAAQ,QAAQ,MAAM,GAAG,IAAI,WAAW;AAC9C,UAAM,UAAU,MAAM,QAAQ;AAAA,MAC5B,MAAM,IAAI,OAAO,SAAS;AACxB,cAAM,aAAa,MAAM,cAAc,IAAI;AAC3C,cAAM,QAAQ,aAAa,MAAM,aAAa,UAAU,IAAI;AAC5D,eAAO;AAAA,UACL;AAAA,UACA,QAAQ;AAAA,UACR,gBAAgB;AAAA,UAChB,oBAAoB,YAAY,KAAK;AAAA,UACrC,uBAAuB;AAAA,UACvB,iBAAiB;AAAA,QACnB;AAAA,MACF,CAAC;AAAA,IACH;AACA,eAAW,KAAK,GAAG,OAAO;AAAA,EAC5B;AAGA,aAAW,KAAK,CAAC,GAAG,MAAM,EAAE,iBAAiB,EAAE,cAAc;AAE7D,QAAM,aAAa,WAAW,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,gBAAgB,CAAC;AAE1E,SAAO;AAAA,IACL,uBAAuB;AAAA,IACvB,2BAA2B,YAAY,UAAU;AAAA,IACjD;AAAA,IACA,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,EACrC;AACF;;;ADpFO,IAAM,kBAAkBC,SAAqB,CAAC,KAAK,SAAS;AAAA,EACjE,SAAS;AAAA,EACT,UAAU,oBAAI,IAAI;AAAA,EAClB,SAAS;AAAA,EACT,OAAO;AAAA,EAEP,SAAS,YAAY;AACnB,QAAI,EAAE,SAAS,MAAM,OAAO,KAAK,CAAC;AAClC,QAAI;AACF,YAAM,YAAY,aAAa,SAAS;AACxC,UAAI,UAAU,SAAS,WAAW,GAAG;AACnC,cAAM,UAAU,eAAe;AAC/B,cAAM,UAAU,YAAY;AAAA,MAC9B;AACA,YAAM,EAAE,UAAU,OAAO,IAAI,aAAa,SAAS;AACnD,YAAM,EAAE,SAAS,OAAO,IAAI,gBAAgB,SAAS;AACrD,YAAM,QAAQ,UAAU,SAAS,MAAM;AACvC,YAAM,UAAU,MAAM,eAAe,OAAO,UAAU,MAAM;AAC5D,UAAI,EAAE,SAAS,UAAU,oBAAI,IAAI,GAAG,SAAS,MAAM,CAAC;AAAA,IACtD,SAAS,KAAK;AACZ,UAAI,EAAE,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,GAAG,SAAS,MAAM,CAAC;AAAA,IACjF;AAAA,EACF;AAAA,EAEA,cAAc,CAAC,SAAS;AACtB,UAAM,WAAW,IAAI,IAAI,IAAI,EAAE,QAAQ;AACvC,QAAI,SAAS,IAAI,IAAI,EAAG,UAAS,OAAO,IAAI;AAAA,QACvC,UAAS,IAAI,IAAI;AACtB,QAAI,EAAE,SAAS,CAAC;AAAA,EAClB;AAAA,EAEA,WAAW,MAAM;AACf,UAAM,QAAQ,IAAI,EAAE,SAAS,WAAW,IAAI,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC;AAC/D,QAAI,EAAE,UAAU,IAAI,IAAI,KAAK,EAAE,CAAC;AAAA,EAClC;AAAA,EAEA,aAAa,MAAM,IAAI,EAAE,UAAU,oBAAI,IAAI,EAAE,CAAC;AAChD,EAAE;;;ADgBoB,gBAAAC,OAQZ,QAAAC,cARY;AAtDf,SAAS,mBAAmB;AACjC,QAAM,EAAE,SAAS,UAAU,SAAS,OAAO,SAAS,cAAc,UAAU,IAAI,gBAAgB;AAChG,QAAM,CAAC,QAAQ,SAAS,IAAIC,WAAS,CAAC;AACtC,QAAM,CAAC,cAAc,eAAe,IAAIA,WAAS,KAAK;AACtD,QAAM,CAAC,cAAc,eAAe,IAAIA,WAAS,KAAK;AACtD,QAAM,CAAC,aAAa,cAAc,IAAIA,WAAmB,CAAC,CAAC;AAC3D,QAAM,SAAS,cAAc;AAC7B,QAAM,eAAeC,SAAO,KAAK;AAEjC,QAAM,WAAW,eAAe;AAAA,IAC9B,cAAc,gBAAgB,eAAe,KAAK;AAAA,IAClD,sBAAsB,gBAAgB,eAAe,KAAK;AAAA,IAC1D,SAAS;AAAA,EACX,CAAC;AAED,EAAAC,YAAU,MAAM;AAAE,YAAQ;AAAA,EAAG,GAAG,CAAC,CAAC;AAElC,EAAAA,YAAU,MAAM;AACd,QAAI,CAAC,OAAO,aAAa,CAAC,OAAO,SAAS,OAAO,MAAM,SAAS,KAAK,CAAC,aAAa,SAAS;AAC1F,mBAAa,UAAU;AACvB,WAAK,QAAQ;AAAA,IACf;AAAA,EACF,GAAG,CAAC,OAAO,WAAW,OAAO,KAAK,CAAC;AAEnC,QAAM,aAAa,SAAS,cAAc,CAAC;AAE3C,QAAM,oBAAoB,OAAO,SAAS,QACxC,OAAO,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,uBAAuB,KAAK,EAAE,SAAS,aAAa,CAAC;AAE3F,eAAa,CAAC,OAAO,QAAQ;AAC3B,QAAI,OAAO,WAAW;AACpB,UAAI,IAAI,OAAQ,QAAO,OAAO;AAC9B;AAAA,IACF;AACA,QAAI,gBAAgB,aAAc;AAGlC,SAAK,UAAU,OAAO,UAAU,QAAQ,qBAAqB,YAAY,SAAS,GAAG;AACnF,sBAAgB,IAAI;AACpB;AAAA,IACF;AAEA,QAAI,UAAU,OAAO,UAAU,KAAK;AAAE,aAAO,MAAM;AAAG,qBAAe,CAAC,CAAC;AAAG,WAAK,QAAQ;AAAG;AAAA,IAAQ;AAClG,QAAI,IAAI,UAAU,WAAW,MAAM,GAAG;AACpC,mBAAa,WAAW,MAAM,EAAE,IAAI;AACpC;AAAA,IACF;AACA,QAAI,UAAU,OAAO,UAAU,KAAK;AAAE,gBAAU;AAAG;AAAA,IAAQ;AAC3D,SAAK,UAAU,OAAO,UAAU,QAAQ,SAAS,OAAO,GAAG;AAAE,sBAAgB,IAAI;AAAG;AAAA,IAAQ;AAE5F,QAAI,UAAU,OAAO,IAAI,UAAW,WAAU,CAAC,MAAM,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,GAAG,WAAW,SAAS,CAAC,CAAC,CAAC;AAAA,aAC/F,UAAU,OAAO,IAAI,QAAS,WAAU,CAAC,MAAM,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC;AAAA,EAC5E,CAAC;AAED,MAAI,QAAS,QAAO,gBAAAJ,MAAC,WAAQ,SAAS,EAAE,iBAAiB,GAAG;AAC5D,MAAI,MAAO,QAAO,gBAAAA,MAAC,gBAAa,SAAS,OAAO;AAEhD,MAAI,OAAO,aAAa,OAAO,MAAM,SAAS,GAAG;AAC/C,WACE,gBAAAC,OAACI,OAAA,EAAI,eAAc,UACjB;AAAA,sBAAAL,MAAC,eAAY,OAAO,OAAO,OAAO,WAAW,OAAO,WAAW,OAAO,EAAE,kBAAkB,GAAG;AAAA,MAC5F,OAAO,aACN,gBAAAC,OAACK,QAAA,EAAK,OAAO,OAAO,OAAO;AAAA;AAAA,QAAK,EAAE,aAAa;AAAA,SAAE;AAAA,MAGlD,CAAC,OAAO,aAAa,CAAC,OAAO,SAC5B,gBAAAN,MAAC,gBAAa,QAAO,WAAU,SAAS,UAAU,EAAE,kBAAkB,CAAC,IAAI;AAAA,MAG5E,CAAC,OAAO,aAAa,OAAO,SAC3B,gBAAAC,OAACI,OAAA,EAAI,eAAc,UAAS,KAAK,QAAQ,IACvC;AAAA,wBAAAL,MAAC,gBAAa,QAAO,SAAQ,SAAS,UAAU,EAAE,kBAAkB,CAAC,IAAI;AAAA,QACxE,qBAAqB,YAAY,SAAS,KACzC,gBAAAC,OAACK,QAAA,EAAK,OAAO,OAAO,SAAS;AAAA;AAAA,UACxB,EAAE,YAAY;AAAA,UAAE;AAAA,UAAI,EAAE,cAAc;AAAA,WACzC;AAAA,SAEJ;AAAA,MAGD,gBACC,gBAAAN,MAACK,OAAA,EAAI,SAAS,QAAQ,IACpB,0BAAAL;AAAA,QAAC;AAAA;AAAA,UACC,SAAS,EAAE,wBAAwB,EAAE,OAAO,YAAY,OAAO,CAAC;AAAA,UAChE,WAAW,MAAM;AACf,4BAAgB,KAAK;AACrB,yBAAa,UAAU;AACvB,mBAAO,MAAM;AACb,iBAAK,OAAO,IAAI,CAAC,aAAa,yBAAyB,GAAG,WAAW,CAAC;AAAA,UACxE;AAAA,UACA,UAAU,MAAM,gBAAgB,KAAK;AAAA;AAAA,MACvC,GACF;AAAA,OAEJ;AAAA,EAEJ;AAEA,SACE,gBAAAC,OAACI,OAAA,EAAI,eAAc,UACjB;AAAA,oBAAAL,MAAC,iBAAc,OAAO,aAAa,OAAO,EAAE,eAAe,GAAG,UAAU,UAAU,SAAS;AAAA,IAE1F,WACC,gBAAAC,OAACI,OAAA,EAAI,KAAK,QAAQ,IAAI,SAAS,QAAQ,IACrC;AAAA,sBAAAL,MAAC,YAAS,OAAO,EAAE,iBAAiB,GAAG,OAAO,WAAW,QAAQ,OAAO,WAAW,SAAS,IAAI,OAAO,UAAU,OAAO,SAAS;AAAA,MACjI,gBAAAA,MAAC,YAAS,OAAO,EAAE,qBAAqB,GAAG,OAAO,QAAQ,2BAA2B,OAAO,OAAO,KAAK;AAAA,MACxG,gBAAAA,MAAC,YAAS,OAAO,EAAE,kBAAkB,GAAG,OAAO,SAAS,MAAM,OAAO,SAAS,OAAO,IAAI,OAAO,UAAU,OAAO,OAAO;AAAA,OAC1H;AAAA,IAID,gBACC,gBAAAC,OAACI,OAAA,EAAI,eAAc,UAAS,SAAS,QAAQ,IAAI,KAAK,QAAQ,IAC5D;AAAA,sBAAAL,MAACK,OAAA,EAAI,aAAY,SAAQ,aAAa,OAAO,SAAS,UAAU,QAAQ,IAAI,UAAU,QAAQ,MAC5F,0BAAAL,MAACM,QAAA,EAAK,OAAO,OAAO,SAAU,YAAE,8BAA8B,GAAE,GAClE;AAAA,MACA,gBAAAN;AAAA,QAAC;AAAA;AAAA,UACC,SAAS,EAAE,4BAA4B,EAAE,OAAO,SAAS,KAAK,CAAC;AAAA,UAC/D,WAAW,MAAM;AACf,4BAAgB,KAAK;AACrB,yBAAa,UAAU;AACvB,kBAAM,QAAQ,MAAM,KAAK,QAAQ;AACjC,2BAAe,KAAK;AACpB,iBAAK,OAAO,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;AAAA,UACzC;AAAA,UACA,UAAU,MAAM,gBAAgB,KAAK;AAAA;AAAA,MACvC;AAAA,OACF;AAAA,IAGD,WAAW,WAAW,KAAK,CAAC,gBAC3B,gBAAAA,MAAC,gBAAa,QAAO,WAAU,SAAS,UAAU,EAAE,qBAAqB,CAAC,IAAI;AAAA,IAG/E,WAAW,SAAS,KAAK,CAAC,iBAAiB,MAAM;AAChD,YAAM,QAAQ,KAAK,IAAI,GAAG,SAAS,KAAK,MAAM,WAAW,CAAC,CAAC;AAC3D,YAAM,UAAU,WAAW,MAAM,OAAO,QAAQ,QAAQ;AACxD,aACE,gBAAAC,OAACI,OAAA,EAAI,eAAc,UAChB;AAAA,gBAAQ,KACP,gBAAAJ,OAACK,QAAA,EAAK,OAAO,OAAO,eAAe,UAAQ,MAAC;AAAA;AAAA,UAAG,EAAE,oBAAoB,EAAE,OAAO,MAAM,CAAC;AAAA,WAAE;AAAA,QAExF,QAAQ,IAAI,CAAC,GAAG,MAAM;AACrB,gBAAM,MAAM,QAAQ;AACpB,gBAAM,YAAY,QAAQ;AAC1B,gBAAM,aAAa,SAAS,IAAI,EAAE,IAAI;AACtC,iBACE,gBAAAL,OAAC,iBAA2B,WAC1B;AAAA,4BAAAD,MAACM,QAAA,EAAK,OAAO,aAAa,OAAO,UAAU,OAAO,OAAQ,uBAAa,WAAW,UAAS;AAAA,YAC3F,gBAAAN,MAACM,QAAA,EAAK,MAAM,WAAW,SAAS,WAAW,OAAO,YAAY,OAAO,OAAO,OAAO,OAAQ,YAAE,MAAK;AAAA,YAClG,gBAAAN,MAACM,QAAA,EAAK,OAAO,OAAO,SAAU,YAAE,oBAAmB;AAAA,YACnD,gBAAAL,OAACK,QAAA,EAAK,OAAO,OAAO,eAAe;AAAA;AAAA,cAAE,EAAE;AAAA,cAAO;AAAA,eAAC;AAAA,eAJ7B,EAAE,IAKtB;AAAA,QAEJ,CAAC;AAAA,QACA,QAAQ,WAAW,WAAW,UAC7B,gBAAAL,OAACK,QAAA,EAAK,OAAO,OAAO,eAAe,UAAQ,MAAC;AAAA;AAAA,UAAG,EAAE,oBAAoB,EAAE,OAAO,WAAW,SAAS,QAAQ,SAAS,CAAC;AAAA,WAAE;AAAA,QAExH,gBAAAN,MAACK,OAAA,EAAI,WAAW,QAAQ,IACtB,0BAAAJ,OAACK,QAAA,EAAK,OAAO,OAAO,MAAM,MAAI,MAC3B;AAAA,mBAAS;AAAA,UAAE;AAAA,UAAE,WAAW;AAAA,WAC3B,GACF;AAAA,SACF;AAAA,IAEJ,GAAG;AAAA,KACL;AAEJ;;;AG1LA,SAAgB,aAAAC,aAAW,YAAAC,YAAU,WAAAC,gBAAe;AACpD,SAAS,OAAAC,OAAK,QAAAC,cAAY;;;ACD1B,SAAS,UAAAC,gBAAc;AAMvB,SAAS,iBAA0B;AACjC,QAAM,EAAE,SAAS,OAAO,IAAI,gBAAgB,SAAS;AACrD,SAAO,UAAU,SAAS,MAAM;AAClC;AAYO,IAAM,kBAAkBC,SAAqB,CAAC,SAAS;AAAA,EAC5D,SAAS,CAAC;AAAA,EACV,SAAS;AAAA,EACT,OAAO;AAAA,EAEP,cAAc,YAAY;AACxB,QAAI,EAAE,SAAS,MAAM,OAAO,KAAK,CAAC;AAClC,QAAI;AACF,YAAM,QAAQ,eAAe;AAC7B,YAAM,UAAU,MAAoB,YAAY,KAAK;AACrD,UAAI,EAAE,SAAS,SAAS,MAAM,CAAC;AAAA,IACjC,SAAS,KAAK;AACZ,UAAI,EAAE,SAAS,OAAO,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE,CAAC;AAAA,IACjF;AAAA,EACF;AAAA,EAEA,WAAW,OAAO,QAAQ,aAAa,SAAS,QAAQ,SAAS;AAC/D,UAAM,QAAQ,eAAe;AAC7B,UAAoB,YAAY,OAAO,QAAQ,aAAa,SAAS,KAAK;AAC1E,UAAM,UAAU,MAAoB,YAAY,KAAK;AACrD,QAAI,EAAE,QAAQ,CAAC;AAAA,EACjB;AAAA,EAEA,cAAc,YAAY;AACxB,UAAM,QAAQ,eAAe;AAC7B,UAAoB,aAAa,KAAK;AACtC,QAAI,EAAE,SAAS,CAAC,EAAE,CAAC;AAAA,EACrB;AACF,EAAE;;;ADgEoB,gBAAAC,OAQhB,QAAAC,cARgB;AA1FtB,IAAM,eAAuE;AAAA,EAC3E,SAAS,EAAE,MAAM,KAAK,OAAO,OAAO,QAAQ;AAAA,EAC5C,WAAW,EAAE,MAAM,KAAK,OAAO,OAAO,MAAM;AAAA,EAC5C,SAAS,EAAE,MAAM,UAAU,OAAO,OAAO,KAAK;AAAA,EAC9C,eAAe,EAAE,MAAM,UAAU,OAAO,OAAO,KAAK;AACtD;AAEA,IAAM,oBAA2D;AAAA,EAC/D,SAAS;AAAA,EACT,WAAW;AAAA,EACX,SAAS;AAAA,EACT,eAAe;AACjB;AAEA,IAAM,UAAqC,CAAC,OAAO,WAAW,aAAa,WAAW,aAAa;AAE5F,SAAS,cAAc;AAC5B,QAAM,EAAE,SAAS,SAAS,OAAO,cAAc,cAAAC,cAAa,IAAI,gBAAgB;AAChF,QAAM,CAAC,QAAQ,SAAS,IAAIC,WAAS,CAAC;AACtC,QAAM,CAAC,QAAQ,SAAS,IAAIA,WAAgC,KAAK;AACjE,QAAM,CAAC,aAAa,cAAc,IAAIA,WAAS,EAAE;AACjD,QAAM,CAAC,aAAa,cAAc,IAAIA,WAAS,KAAK;AACpD,QAAM,CAAC,cAAc,eAAe,IAAIA,WAAS,KAAK;AACtD,QAAM,CAAC,eAAe,gBAAgB,IAAIA,WAA8B,IAAI;AAC5E,QAAM,SAAS,cAAc;AAC7B,QAAM,iBAAiB,YAAY,aAAa,GAAG;AACnD,QAAM,EAAE,WAAW,WAAW,IAAI,cAAc;AAChD,QAAM,mBAAmB,eAAe;AAAA,IACtC,cAAc,eAAe,OAAO,MAAM,SAAS,KAAK,OAAO,YAAY,IAAI;AAAA,IAC/E,sBAAsB,eAAe,OAAO,MAAM,SAAS,KAAK,OAAO,YAAY,KAAK;AAAA,IACxF,SAAS;AAAA,EACX,CAAC;AACD,QAAM,aAAa,eAAe;AAAA,IAChC,cAAc;AAAA,IACd,sBAAsB;AAAA,IACtB,SAAS;AAAA,EACX,CAAC;AAED,EAAAC,YAAU,MAAM;AAAE,iBAAa;AAAA,EAAG,GAAG,CAAC,CAAC;AAIvC,EAAAA,YAAU,MAAM;AACd,QAAI,aAAa;AACf,gBAAU;AACV,aAAO,MAAM;AAAE,mBAAW;AAAA,MAAG;AAAA,IAC/B;AACA,WAAO;AAAA,EACT,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,WAAWC,SAAQ,MAAM;AAC7B,QAAI,SAAS;AACb,QAAI,WAAW,OAAO;AACpB,eAAS,OAAO,OAAO,CAAC,MAAM,EAAE,WAAW,MAAM;AAAA,IACnD;AACA,QAAI,gBAAgB;AAClB,YAAM,IAAI,eAAe,YAAY;AACrC,eAAS,OAAO,OAAO,CAAC,MAAM,EAAE,aAAa,YAAY,EAAE,SAAS,CAAC,CAAC;AAAA,IACxE;AACA,WAAO;AAAA,EACT,GAAG,CAAC,SAAS,QAAQ,cAAc,CAAC;AAEpC,eAAa,CAAC,OAAO,QAAQ;AAC3B,QAAI,gBAAgB,iBAAiB,OAAO,UAAW;AAEvD,QAAI,aAAa;AACf,UAAI,IAAI,QAAQ;AACd,uBAAe,KAAK;AACpB,uBAAe,EAAE;AAAA,MACnB;AACA;AAAA,IACF;AAEA,QAAI,UAAU,KAAK;AAAE,qBAAe,IAAI;AAAG;AAAA,IAAQ;AACnD,QAAI,UAAU,OAAO,UAAU,KAAK;AAClC,YAAM,MAAM,QAAQ,QAAQ,MAAM;AAClC,gBAAU,SAAS,MAAM,KAAK,QAAQ,MAAM,CAAE;AAC9C,gBAAU,CAAC;AACX;AAAA,IACF;AACA,SAAK,UAAU,OAAO,UAAU,QAAQ,QAAQ,SAAS,GAAG;AAAE,sBAAgB,IAAI;AAAG;AAAA,IAAQ;AAC7F,QAAI,IAAI,UAAU,SAAS,MAAM,GAAG;AAClC,uBAAiB,SAAS,MAAM,CAAC;AACjC;AAAA,IACF;AAEA,QAAI,UAAU,OAAO,IAAI,UAAW,WAAU,CAAC,MAAM,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,GAAG,SAAS,SAAS,CAAC,CAAC,CAAC;AAAA,aAC7F,UAAU,OAAO,IAAI,QAAS,WAAU,CAAC,MAAM,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC;AAAA,EAC5E,CAAC;AAED,MAAI,QAAS,QAAO,gBAAAL,MAAC,WAAQ,SAAS,EAAE,iBAAiB,GAAG;AAC5D,MAAI,MAAO,QAAO,gBAAAA,MAAC,gBAAa,SAAS,OAAO;AAEhD,QAAM,QAAQ,KAAK,IAAI,GAAG,SAAS,KAAK,MAAM,mBAAmB,CAAC,CAAC;AACnE,QAAM,UAAU,SAAS,MAAM,OAAO,QAAQ,gBAAgB;AAE9D,SACE,gBAAAC,OAACK,OAAA,EAAI,eAAc,UACjB;AAAA,oBAAAL,OAACK,OAAA,EAAI,KAAK,QAAQ,IAAI,cAAc,QAAQ,IAC1C;AAAA,sBAAAN,MAAC,iBAAc,OAAO,aAAa,OAAO,EAAE,iBAAiB,EAAE,OAAO,SAAS,OAAO,CAAC,GAAG,UAAU,UAAU,MAAM;AAAA,MACpH,gBAAAA,MAACO,QAAA,EAAK,OAAO,WAAW,QAAQ,OAAO,OAAO,OAAO,MAClD,YAAE,uBAAuB,EAAE,OAAO,CAAC,GACtC;AAAA,OACF;AAAA,IAEC,eACC,gBAAAP,MAACM,OAAA,EAAI,cAAc,QAAQ,IACzB,0BAAAN,MAAC,eAAY,cAAc,aAAa,UAAU,gBAAgB,aAAa,EAAE,2BAA2B,GAAG,UAAQ,MAAC,GAC1H;AAAA,IAGD,gBACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,SAAS,EAAE,wBAAwB,EAAE,OAAO,QAAQ,OAAO,CAAC;AAAA,QAC5D,WAAW,MAAM;AAAE,eAAKE,cAAa;AAAG,0BAAgB,KAAK;AAAA,QAAG;AAAA,QAChE,UAAU,MAAM,gBAAgB,KAAK;AAAA;AAAA,IACvC;AAAA,IAGD,iBACC,gBAAAF;AAAA,MAAC;AAAA;AAAA,QACC,SACE,cAAc,WAAW,gBACrB,EAAE,mBAAmB,IAAI,OAAO,EAAE,qBAAqB,IACvD,EAAE,yBAAyB,EAAE,QAAQ,EAAE,kBAAkB,cAAc,MAAM,CAAC,GAAG,MAAM,cAAc,eAAe,GAAG,CAAC;AAAA,QAE9H,WAAW,YAAY;AACrB,gBAAM,QAAQ;AACd,2BAAiB,IAAI;AACrB,cAAI;AACJ,kBAAQ,MAAM,QAAQ;AAAA,YACpB,KAAK;AAAW,qBAAO,CAAC,WAAW,MAAM,WAAY;AAAG;AAAA,YACxD,KAAK;AAAa,qBAAO,CAAC,aAAa,MAAM,WAAY;AAAG;AAAA,YAC5D,KAAK;AAAW,qBAAO,CAAC,WAAW,MAAM,WAAY;AAAG;AAAA,YACxD,KAAK;AAAe,qBAAO,CAAC,SAAS;AAAG;AAAA,UAC1C;AACA,gBAAM,OAAO,IAAI,IAAI;AACrB,eAAK,aAAa;AAAA,QACpB;AAAA,QACA,UAAU,MAAM,iBAAiB,IAAI;AAAA;AAAA,IACvC;AAAA,KAGA,OAAO,aAAa,OAAO,MAAM,SAAS,MAC1C,gBAAAA,MAACM,OAAA,EAAI,SAAS,QAAQ,IACpB,0BAAAN;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,OAAO;AAAA,QACd,WAAW,OAAO;AAAA,QAClB,OAAO,EAAE,aAAa;AAAA,QACtB,YAAY;AAAA;AAAA,IACd,GACF;AAAA,IAGD,SAAS,WAAW,KAAK,CAAC,gBACzB,gBAAAA,MAACO,QAAA,EAAK,OAAO,OAAO,eAAe,QAAM,MACtC,qBAAW,QAAQ,EAAE,wBAAwB,EAAE,OAAO,CAAC,IAAI,EAAE,mBAAmB,GACnF;AAAA,IAGD,SAAS,SAAS,KAAK,CAAC,gBACvB,gBAAAN,OAACK,OAAA,EAAI,eAAc,UAChB;AAAA,cAAQ,KACP,gBAAAL,OAACM,QAAA,EAAK,OAAO,OAAO,eAAe,UAAQ,MAAC;AAAA;AAAA,QAAG,EAAE,oBAAoB,EAAE,OAAO,MAAM,CAAC;AAAA,SAAE;AAAA,MAExF,QAAQ,IAAI,CAAC,OAAO,MAAM;AACzB,cAAM,MAAM,QAAQ;AACpB,cAAM,YAAY,QAAQ;AAC1B,cAAM,EAAE,MAAM,MAAM,IAAI,aAAa,MAAM,MAAM;AACjD,cAAM,KAAK,IAAI,KAAK,MAAM,SAAS,EAAE,QAAQ,IAAI;AAEjD,eACE,gBAAAN,OAAC,iBAA6B,WAC5B;AAAA,0BAAAD,MAACO,QAAA,EAAK,OAAc,MAAI,MAAE,gBAAK;AAAA,UAK/B,gBAAAP,MAACM,OAAA,EAAI,OAAO,IAAI,YAAY,GAAG,UAAU,GACvC,0BAAAN,MAACO,QAAA,EAAK,MAAM,WAAW,SAAS,WAAW,OAAO,YAAY,OAAO,OAAO,OAAO,OAAO,MAAK,YAC5F,YAAE,kBAAkB,MAAM,MAAM,CAAC,GACpC,GACF;AAAA,UAGA,gBAAAP,MAACM,OAAA,EAAI,UAAU,GAAG,YAAY,GAAG,UAAU,GACzC,0BAAAN,MAACO,QAAA,EAAK,OAAO,OAAO,MAAM,MAAK,mBAAmB,gBAAM,eAAe,EAAE,aAAa,GAAE,GAC1F;AAAA,UACC,MAAM,UACH,gBAAAP,MAAC,eAAY,OAAO,EAAE,UAAU,GAAG,SAAQ,WAAU,IACrD,gBAAAA,MAAC,eAAY,OAAO,EAAE,YAAY,GAAG,SAAQ,SAAQ;AAAA,UACzD,gBAAAA,MAACO,QAAA,EAAK,OAAO,OAAO,OAAQ,6BAAmB,EAAE,GAAE;AAAA,aAnBjC,MAAM,EAoB1B;AAAA,MAEJ,CAAC;AAAA,MACA,QAAQ,mBAAmB,SAAS,UACnC,gBAAAN,OAACM,QAAA,EAAK,OAAO,OAAO,eAAe,UAAQ,MAAC;AAAA;AAAA,QAAG,EAAE,oBAAoB,EAAE,OAAO,SAAS,SAAS,QAAQ,iBAAiB,CAAC;AAAA,SAAE;AAAA,MAG9H,gBAAAP,MAACM,OAAA,EAAI,WAAW,QAAQ,IACtB,0BAAAL,OAACM,QAAA,EAAK,OAAO,OAAO,MAAM,MAAI,MAC3B;AAAA,iBAAS;AAAA,QAAE;AAAA,QAAE,SAAS;AAAA,SACzB,GACF;AAAA,OACF;AAAA,KAEJ;AAEJ;;;AEvOA,SAAgB,aAAAC,aAAW,YAAAC,kBAAgB;AAC3C,SAAS,OAAAC,OAAK,QAAAC,cAAY;AAwEJ,gBAAAC,OAgBd,QAAAC,cAhBc;AApDtB,IAAM,kBAA4C;AAAA,EAChD,UAAU,OAAO;AAAA,EACjB,MAAM,OAAO;AAAA,EACb,QAAQ,OAAO;AAAA,EACf,KAAK,OAAO;AAAA,EACZ,SAAS,OAAO;AAClB;AAEA,IAAM,iBAAkE;AAAA,EACtE,UAAU;AAAA,EACV,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,SAAS;AACX;AAGA,SAAS,eAAe,KAAsB;AAC5C,SAAO,+DAA+D,KAAK,GAAG;AAChF;AAEO,SAAS,oBAAoB;AAClC,QAAM,EAAE,SAAS,SAAS,OAAO,MAAM,SAAS,IAAI,iBAAiB;AACrE,QAAM,WAAW,mBAAmB,CAAC,MAAM,EAAE,QAAQ;AACrD,QAAM,CAAC,QAAQ,SAAS,IAAIC,WAAS,CAAC;AACtC,QAAM,CAAC,aAAa,cAAc,IAAIA,WAAwB,IAAI;AAClE,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,WAAwB,IAAI;AACxE,QAAM,SAAS,cAAc;AAE7B,EAAAC,YAAU,MAAM;AAAE,SAAK;AAAA,EAAG,GAAG,CAAC,CAAC;AAE/B,QAAM,UAAU,SAAS,WAAW,CAAC;AAErC,eAAa,CAAC,OAAO,QAAQ;AAC3B,QAAI,kBAAkB,OAAO,UAAW;AAGxC,QAAI,UAAU,OAAO,UAAU,KAAK;AAAE,WAAK,KAAK,IAAI;AAAG;AAAA,IAAQ;AAE/D,QAAI,UAAU,KAAK;AAAE,eAAS,UAAU;AAAG;AAAA,IAAQ;AACnD,SAAK,UAAU,OAAO,UAAU,QAAQ,QAAQ,MAAM,GAAG;AACvD,wBAAkB,QAAQ,MAAM,EAAE,WAAW;AAC7C;AAAA,IACF;AAEA,QAAI,UAAU,OAAO,IAAI,UAAW,WAAU,CAAC,MAAM,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,GAAG,QAAQ,SAAS,CAAC,CAAC,CAAC;AAAA,aAC5F,UAAU,OAAO,IAAI,QAAS,WAAU,CAAC,MAAM,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC;AAAA,aACjE,IAAI,UAAU,QAAQ,MAAM,GAAG;AACtC,qBAAe,gBAAgB,QAAQ,MAAM,EAAE,cAAc,OAAO,QAAQ,MAAM,EAAE,WAAW;AAAA,IACjG;AAAA,EACF,CAAC;AAED,MAAI,QAAS,QAAO,gBAAAH,MAAC,WAAQ,SAAS,EAAE,kBAAkB,GAAG;AAG7D,MAAI,OAAO;AACT,UAAM,eAAe,eAAe,KAAK,IAAI,EAAE,uBAAuB,IAAI;AAC1E,WAAO,gBAAAA,MAAC,gBAAa,SAAS,cAAc;AAAA,EAC9C;AAGA,QAAM,WAAW,WAAW,mBAAmB,WAAW,GAAI,IAAI;AAElE,SACE,gBAAAC,OAACG,OAAA,EAAI,eAAc,UACjB;AAAA,oBAAAJ,MAAC,iBAAc,OAAO,mBAAmB,OAAO,EAAE,gBAAgB,GAAG,UAAU,UAAU,OAAO;AAAA,IAE/F,WACC,gBAAAC,OAACG,OAAA,EAAI,KAAK,QAAQ,IAAI,SAAS,QAAQ,IACrC;AAAA,sBAAAJ,MAAC,YAAS,OAAO,EAAE,kBAAkB,GAAG,OAAO,QAAQ,eAAe,OAAO,OAAO,MAAM;AAAA,MAC1F,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,EAAE,qBAAqB;AAAA,UAC9B,OAAO,QAAQ;AAAA,UACf,OAAO,QAAQ,qBAAqB,IAAI,OAAO,QAAQ,OAAO;AAAA;AAAA,MAChE;AAAA,MACC,QAAQ,gBAAgB,KAAK,gBAAAA,MAAC,YAAS,OAAO,EAAE,mBAAmB,GAAG,OAAO,QAAQ,eAAe,OAAO,OAAO,OAAO;AAAA,MACzH,QAAQ,YAAY,KAAK,gBAAAA,MAAC,YAAS,OAAO,EAAE,eAAe,GAAG,OAAO,QAAQ,WAAW,OAAO,OAAO,OAAO;AAAA,MAC7G,QAAQ,cAAc,KAAK,gBAAAA,MAAC,YAAS,OAAO,EAAE,iBAAiB,GAAG,OAAO,QAAQ,aAAa,OAAO,OAAO,SAAS;AAAA,OACxH;AAAA,IAID,YACC,gBAAAA,MAACK,QAAA,EAAK,OAAO,OAAO,OAAQ,YAAE,0BAA0B,EAAE,MAAM,SAAS,CAAC,GAAE;AAAA,IAK7E,WACC,gBAAAL,MAACI,OAAA,EAAI,WAAW,QAAQ,IACtB,0BAAAJ,MAACK,QAAA,EAAK,OAAO,OAAO,eAAe,QAAM,MAAE,YAAE,2BAA2B,GAAE,GAC5E;AAAA,IAGD,QAAQ,WAAW,KAAK,WACvB,gBAAAL,MAACI,OAAA,EAAI,WAAW,QAAQ,IACtB,0BAAAJ,MAAC,gBAAa,QAAO,WAAU,SAAS,UAAU,EAAE,kBAAkB,CAAC,IAAI,GAC7E;AAAA,IAGD,kBACC,gBAAAA,MAACI,OAAA,EAAI,SAAS,QAAQ,IACpB,0BAAAJ;AAAA,MAAC;AAAA;AAAA,QACC,SAAS,EAAE,2BAA2B,EAAE,MAAM,eAAe,CAAC;AAAA,QAC9D,WAAW,YAAY;AACrB,gBAAM,OAAO;AACb,4BAAkB,IAAI;AACtB,gBAAM,OAAO,IAAI,CAAC,WAAW,IAAI,CAAC;AAClC,eAAK,KAAK,IAAI;AAAA,QAChB;AAAA,QACA,UAAU,MAAM,kBAAkB,IAAI;AAAA;AAAA,IACxC,GACF;AAAA,KAGA,OAAO,aAAa,OAAO,MAAM,SAAS,MAC1C,gBAAAA,MAACI,OAAA,EAAI,SAAS,QAAQ,IACpB,0BAAAJ,MAAC,eAAY,OAAO,OAAO,OAAO,WAAW,OAAO,WAAW,OAAO,EAAE,cAAc,GAAG,GAC3F;AAAA,IAGD,QAAQ,SAAS,KAChB,gBAAAC,OAACG,OAAA,EAAI,eAAc,UAAS,WAAW,QAAQ,IAC5C;AAAA,cAAQ,IAAI,CAAC,KAAK,MAAM;AACvB,cAAM,YAAY,MAAM;AACxB,cAAM,aAAa,gBAAgB,IAAI;AAEvC,eACE,gBAAAH,OAACG,OAAA,EAA0B,eAAc,UACvC;AAAA,0BAAAH,OAAC,iBAAc,WACb;AAAA,4BAAAD,MAAC,eAAY,OAAO,IAAI,aAAa,SAAS,eAAe,IAAI,WAAW,GAAG;AAAA,YAC/E,gBAAAA,MAACK,QAAA,EAAK,MAAM,WAAW,SAAS,WAAW,OAAO,YAAY,OAAO,OAAO,OAAO,OAChF,cAAI,aACP;AAAA,YACA,gBAAAL,MAACK,QAAA,EAAK,OAAO,OAAO,OAAQ,cAAI,kBAAiB;AAAA,YACjD,gBAAAL,MAACK,QAAA,EAAK,OAAO,OAAO,OAAQ,aAAG,gBAAgB,IAAI,gBAAgB,MAAM,GAAE;AAAA,YAC1E,IAAI,gBAAgB,KAAK,CAAC,MAAM,EAAE,YAAY,KAC7C,gBAAAJ,OAACI,QAAA,EAAK,OAAO,OAAO,eAAe;AAAA;AAAA,cAAI,EAAE,eAAe;AAAA,cAAE;AAAA,eAAC;AAAA,YAE7D,gBAAAL,MAACK,QAAA,EAAK,OAAO,OAAO,OAAQ,uBAAa,WAAW,UAAS;AAAA,aAC/D;AAAA,UAEC,cACC,gBAAAL,MAACI,OAAA,EAAI,eAAc,UAAS,aAAa,QAAQ,IAAI,cAAc,QAAQ,IACxE,cAAI,gBAAgB,IAAI,CAAC,SACxB,gBAAAH,OAACG,OAAA,EAAkB,eAAc,UAAS,cAAc,QAAQ,IAC9D;AAAA,4BAAAH,OAACG,OAAA,EAAI,KAAK,QAAQ,IAChB;AAAA,8BAAAJ,MAACK,QAAA,EAAK,OAAO,gBAAgB,KAAK,QAAQ,GAAG,MAAI,MAAE,eAAK,IAAG;AAAA,cAC3D,gBAAAJ,OAACI,QAAA,EAAK,OAAO,OAAO,OAAO;AAAA;AAAA,gBAAE,KAAK;AAAA,gBAAS;AAAA,iBAAC;AAAA,eAC9C;AAAA,YACA,gBAAAL,MAACK,QAAA,EAAK,OAAO,OAAO,OAAO,MAAK,QAAQ,eAAK,SAAQ;AAAA,YACpD,KAAK,gBACJ,gBAAAL,MAACK,QAAA,EAAK,OAAO,OAAO,SAAU,YAAE,oBAAoB,EAAE,SAAS,KAAK,aAAa,CAAC,GAAE;AAAA,eAP9E,KAAK,EASf,CACD,GACH;AAAA,aA5BM,IAAI,WA8Bd;AAAA,MAEJ,CAAC;AAAA,MAED,gBAAAL,MAACI,OAAA,EAAI,WAAW,QAAQ,IACtB,0BAAAH,OAACI,QAAA,EAAK,OAAO,OAAO,MAAM,MAAI,MAC3B;AAAA,iBAAS;AAAA,QAAE;AAAA,QAAE,QAAQ;AAAA,SACxB,GACF;AAAA,MACA,gBAAAL,MAACI,OAAA,EAAI,WAAW,QAAQ,IACtB,0BAAAJ,MAACK,QAAA,EAAK,OAAO,OAAO,eAAgB,YAAE,wBAAwB,GAAE,GAClE;AAAA,OACF;AAAA,KAEJ;AAEJ;;;ACnMA,SAAgB,YAAAC,kBAAgB;AAChC,SAAS,OAAAC,OAAK,QAAAC,cAAY;AAE1B,SAAS,aAAAC,kBAAiB;;;ACH1B,SAAS,YAAAC,WAAU,aAAAC,YAAW,UAAAC,eAAc;AAC5C,SAAS,aAAa,kBAAkB;AACxC,SAAS,QAAAC,aAAY;AAQrB,IAAM,aAAaC,MAAK,UAAU,YAAY;AAG9C,IAAM,gBAAgB;AAKtB,SAAS,oBAAoB,KAAmB;AAC9C,QAAM,SAAS,IAAI,IAAI,GAAG;AAC1B,MAAI,OAAO,aAAa,UAAU;AAChC,UAAM,IAAI,MAAM,8BAA8B;AAAA,EAChD;AACA,MAAI,CAAC,OAAO,SAAS,SAAS,oBAAoB,GAAG;AACnD,UAAM,IAAI,MAAM,wBAAwB;AAAA,EAC1C;AACF;AA0GA,eAAsB,gBAAgB,MAInC;AACD,QAAM,aAAa,KAAK,KAAK,EAAE,YAAY;AAC3C,QAAM,YAAY,MAAM,aAAa;AAGrC,sBAAoB,GAAG,aAAa,SAAS;AAC7C,MAAI;AACJ,MAAI;AAGJ,QAAM,iBAAiB,WAAW;AAClC,MAAI;AACF,UAAM,MAAM,MAAM,eAAe,GAAG,aAAa,WAAW;AAAA,MAC1D,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,mBAAmB;AAAA,MACrB;AAAA,MACA,MAAM,KAAK,UAAU,EAAE,MAAM,YAAY,WAAW,eAAe,CAAC;AAAA,IACtE,GAAG,GAAM;AAET,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,OAAO,MAAM,IAAI,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AAC9C,aAAO,EAAE,SAAS,OAAO,OAAO,KAAK,SAAS,gCAAgC;AAAA,IAChF;AAEA,UAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,UAAM,QAAS,MAA6B;AAC5C,QACE,CAAC,SAAS,OAAO,UAAU,YAC3B,OAAQ,MAAkC,cAAc,YACxD,OAAQ,MAA6B,SAAS,UAC9C;AACA,aAAO,EAAE,SAAS,OAAO,OAAO,mCAAmC;AAAA,IACrE;AACA,UAAM,YAAa,MAAgC;AACnD,UAAM,OAAQ,MAA2B;AACzC,QAAI,SAAS,WAAW,SAAS,cAAc,SAAS,QAAQ;AAC9D,aAAO,EAAE,SAAS,OAAO,OAAO,yBAAyB;AAAA,IAC3D;AACA,sBAAkB;AAClB,iBAAa;AAAA,EACf,SAAS,KAAK;AACZ,WAAO,MAAM,uBAAuB,EAAE,OAAO,OAAO,GAAG,EAAE,CAAC;AAC1D,WAAO,EAAE,SAAS,OAAO,OAAO,uDAAuD;AAAA,EACzF;AAGA,QAAM,eAAe;AAErB,QAAM,aAA8B;AAAA,IAClC,MAAM;AAAA,IACN,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,IACnC,WAAW;AAAA,IACX,MAAM;AAAA,EACR;AAEA,MAAI,OAAkB,EAAE,SAAS,GAAG,aAAa,CAAC,EAAE;AACpD,MAAI;AACF,UAAM,MAAM,MAAMC,UAAS,YAAY,OAAO;AAC9C,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AAAA,EAAyB;AAGjC,MAAI,KAAK,YAAY,KAAK,CAAC,MAAM,EAAE,SAAS,WAAW,IAAI,GAAG;AAC5D,WAAO,EAAE,SAAS,OAAO,OAAO,4CAA4C;AAAA,EAC9E;AAEA,OAAK,YAAY,KAAK,UAAU;AAGhC,QAAM,UAAU,aAAa;AAC7B,QAAMC,WAAU,SAAS,KAAK,UAAU,MAAM,MAAM,CAAC,GAAG,EAAE,UAAU,SAAS,MAAM,IAAM,CAAC;AAC1F,QAAMC,QAAO,SAAS,UAAU;AAEhC,SAAO,EAAE,SAAS,MAAM,WAAW,WAAW,UAAU;AAC1D;;;AD9JW,SAiDD,YAAAC,WAjDC,OAAAC,OA8BH,QAAAC,cA9BG;AAtCJ,SAAS,cAAc;AAC5B,QAAM,EAAE,QAAQ,SAAS,YAAAC,aAAY,YAAAC,aAAY,YAAY,IAAI,gBAAgB;AACjF,QAAM,CAAC,mBAAmB,oBAAoB,IAAIC,WAAS,KAAK;AAChE,QAAM,CAAC,cAAc,eAAe,IAAIA,WAAS,KAAK;AACtD,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,WAAwB,IAAI;AAC1E,QAAM,CAAC,WAAW,YAAY,IAAIA,WAAS,KAAK;AAChD,QAAM,CAAC,cAAc,eAAe,IAAIA,WAAS,KAAK;AACtD,QAAM,CAAC,aAAa,cAAc,IAAIA,WAAuD,IAAI;AACjG,QAAM,CAAC,cAAc,eAAe,IAAIA,WAAS,KAAK;AAEtD,eAAa,CAAC,OAAO,QAAQ;AAC3B,QAAI,qBAAqB,gBAAgB,aAAa,cAAc;AAClE,UAAI,IAAI,UAAU,WAAW;AAC3B,qBAAa,KAAK;AAClB,uBAAe,IAAI;AAAA,MACrB;AACA;AAAA,IACF;AAEA,SAAK,UAAU,OAAO,UAAU,SAAS,WAAW,SAAS,WAAW,SAAS;AAC/E,2BAAqB,IAAI;AAAA,IAC3B;AACA,QAAI,UAAU,OAAO,UAAU,KAAK;AAClC,mBAAa,IAAI;AACjB,qBAAe,IAAI;AAAA,IACrB;AACA,SAAK,UAAU,OAAO,UAAU,SAAS,WAAW,SAAS,WAAW,UAAU,WAAW,YAAY;AACvG,sBAAgB,IAAI;AACpB,WAAKD,YAAW,EAAE,QAAQ,MAAM,gBAAgB,KAAK,CAAC;AAAA,IACxD;AAAA,EACF,CAAC;AAED,QAAM,UAAU,CAAC,QAAgB;AAC/B,QAAI,IAAI,UAAU,EAAG,QAAO;AAC5B,WAAO,IAAI,MAAM,GAAG,CAAC,IAAI,gBAAgB,IAAI,MAAM,EAAE;AAAA,EACvD;AAEA,MAAI,WAAW,cAAc;AAC3B,WAAO,gBAAAH,MAAC,WAAQ,SAAS,EAAE,iBAAiB,GAAG;AAAA,EACjD;AAEA,SACE,gBAAAC,OAACI,OAAA,EAAI,eAAc,UACjB;AAAA,oBAAAL,MAAC,iBAAc,OAAO,aAAa,OAAO,EAAE,eAAe,GAAG,UAAU,UAAU,MAAM;AAAA,IAEvF,qBACC,gBAAAA,MAACK,OAAA,EAAI,SAAS,QAAQ,IACpB,0BAAAL;AAAA,MAAC;AAAA;AAAA,QACC,SAAS,EAAE,2BAA2B;AAAA,QACtC,WAAW,YAAY;AACrB,+BAAqB,KAAK;AAC1B,0BAAgB,IAAI;AACpB,6BAAmB,IAAI;AACvB,cAAI;AACF,kBAAME,YAAW;AAAA,UACnB,SAAS,KAAK;AAEZ,+BAAmB,EAAE,mBAAmB,IAAI,OAAO,OAAO,GAAG,CAAC;AAAA,UAChE,UAAE;AACA,4BAAgB,KAAK;AAAA,UACvB;AAAA,QACF;AAAA,QACA,UAAU,MAAM,qBAAqB,KAAK;AAAA;AAAA,IAC5C,GACF;AAAA,IAGF,gBAAAD,OAACI,OAAA,EAAI,eAAc,UAAS,WAAW,QAAQ,IAAI,aAAa,QAAQ,IACtE;AAAA,sBAAAJ,OAACI,OAAA,EAAI,KAAK,QAAQ,IAChB;AAAA,wBAAAL,MAACM,QAAA,EAAK,OAAO,OAAO,OAAQ,YAAE,qBAAqB,GAAE;AAAA,QACpD,WAAW,SAAS,gBAAAN,MAACM,QAAA,EAAK,OAAO,OAAO,SAAS,MAAI,MAAE,YAAE,aAAa,GAAE;AAAA,QACxE,WAAW,UAAU,gBAAAN,MAACM,QAAA,EAAK,OAAO,OAAO,SAAS,MAAI,MAAE,YAAE,cAAc,GAAE;AAAA,QAC1E,WAAW,UAAU,gBAAAN,MAACM,QAAA,EAAK,OAAO,OAAO,OAAQ,YAAE,cAAc,GAAE;AAAA,QACnE,WAAW,aAAa,gBAAAN,MAACM,QAAA,EAAK,OAAO,OAAO,OAAQ,YAAE,iBAAiB,GAAE;AAAA,SAC5E;AAAA,OAEE,gBAAgB,aAAa,gBAAgB,cAAc,WAC3D,gBAAAN,MAACK,OAAA,EAAI,WAAW,QAAQ,IAAI,aAAY,SAAQ,aAAa,OAAO,SAAS,UAAU,QAAQ,IAAI,UAAU,QAAQ,MACnH,0BAAAL,MAACM,QAAA,EAAK,OAAO,OAAO,SACjB,YAAE,0BAA0B;AAAA,QAC3B,MAAM,KAAK,OAAO,KAAK,IAAI,IAAI,IAAI,KAAK,QAAQ,eAAe,EAAE,QAAQ,MAAM,KAAK,KAAK,KAAK,IAAK;AAAA,MACrG,CAAC,GACH,GACF;AAAA,MAGD,WACC,gBAAAL,OAAAF,WAAA,EACE;AAAA,wBAAAE,OAACI,OAAA,EAAI,KAAK,QAAQ,IAChB;AAAA,0BAAAL,MAACM,QAAA,EAAK,OAAO,OAAO,OAAQ,YAAE,oBAAoB,GAAE;AAAA,UACpD,gBAAAN,MAACM,QAAA,EAAM,kBAAQ,eAAc;AAAA,WAC/B;AAAA,QACA,gBAAAL,OAACI,OAAA,EAAI,KAAK,QAAQ,IAChB;AAAA,0BAAAL,MAACM,QAAA,EAAK,OAAO,OAAO,OAAQ,YAAE,mBAAmB,GAAE;AAAA,UACnD,gBAAAN,MAACM,QAAA,EAAM,kBAAQ,cAAa;AAAA,WAC9B;AAAA,QACA,gBAAAL,OAACI,OAAA,EAAI,KAAK,QAAQ,IAChB;AAAA,0BAAAL,MAACM,QAAA,EAAK,OAAO,OAAO,OAAQ,YAAE,mBAAmB,GAAE;AAAA,UACnD,gBAAAN,MAACM,QAAA,EAAK,OAAO,OAAO,SAAS,MAAI,MAAC,iBAAG;AAAA,WACvC;AAAA,QACA,gBAAAL,OAACI,OAAA,EAAI,KAAK,QAAQ,IAChB;AAAA,0BAAAL,MAACM,QAAA,EAAK,OAAO,OAAO,OAAQ,YAAE,kBAAkB,GAAE;AAAA,UAClD,gBAAAN,MAACM,QAAA,EAAM,kBAAQ,QAAQ,GAAG,GAAE;AAAA,WAC9B;AAAA,QACC,QAAQ,aACP,gBAAAL,OAACI,OAAA,EAAI,KAAK,QAAQ,IAChB;AAAA,0BAAAL,MAACM,QAAA,EAAK,OAAO,OAAO,OAAQ,YAAE,sBAAsB,GAAE;AAAA,UACtD,gBAAAN,MAACM,QAAA,EAAM,qBAAW,QAAQ,SAAS,GAAE;AAAA,WACvC;AAAA,QAEF,gBAAAL,OAACI,OAAA,EAAI,KAAK,QAAQ,IAChB;AAAA,0BAAAL,MAACM,QAAA,EAAK,OAAO,OAAO,OAAQ,YAAE,wBAAwB,GAAE;AAAA,UACxD,gBAAAN,MAACM,QAAA,EAAM,qBAAW,QAAQ,WAAW,GAAE;AAAA,WACzC;AAAA,SACF;AAAA,MAGD,WAAW,UACV,gBAAAL,OAACI,OAAA,EAAI,eAAc,UAAS,WAAW,QAAQ,IAAI,aAAY,SAAQ,aAAa,OAAO,OAAO,UAAU,QAAQ,IAAI,UAAU,QAAQ,MAAM,YAAY,GAC1J;AAAA,wBAAAJ,OAACK,QAAA,EAAK,MAAI,MAAC,OAAO,OAAO,OAAQ;AAAA;AAAA,UAAS;AAAA,UAAE,EAAE,sBAAsB;AAAA,WAAE;AAAA,QACtE,gBAAAN,MAACM,QAAA,EAAK,MAAK,QAAQ,YAAE,oBAAoB,GAAE;AAAA,QAC3C,gBAAAN,MAACM,QAAA,EAAK,OAAO,OAAO,MAAM,MAAI,MAAE,YAAE,iBAAiB,GAAE;AAAA,QACrD,gBAAAL,OAACK,QAAA,EAAK,OAAO,OAAO,OAAQ;AAAA,YAAE,eAAe;AAAA,UAAE;AAAA,UAAC,gBAAAN,MAACM,QAAA,EAAK,OAAO,OAAO,KAAK,MAAI,MAAE,YAAE,gBAAgB,GAAE;AAAA,WAAO;AAAA,QAC1G,gBAAAL,OAACK,QAAA,EAAK,OAAO,OAAO,OAAQ;AAAA,YAAE,qBAAqB;AAAA,UAAE;AAAA,UAAC,gBAAAN,MAACM,QAAA,EAAK,OAAO,OAAO,SAAS,MAAI,MAAE,YAAE,qBAAqB,GAAE;AAAA,WAAO;AAAA,SAC3H;AAAA,MAGD,WAAW,aACV,gBAAAN,MAACK,OAAA,EAAI,WAAW,QAAQ,IACtB,0BAAAL,MAACK,OAAA,EAAI,aAAY,SAAQ,aAAa,OAAO,OAAO,UAAU,QAAQ,IAAI,UAAU,QAAQ,MAC1F,0BAAAL,MAACM,QAAA,EAAK,OAAO,OAAO,OAAQ,YAAE,wBAAwB,GAAE,GAC1D,GACF;AAAA,MAGD,gBAAgB,gBAAAN,MAACM,QAAA,EAAK,OAAO,OAAO,KAAM,YAAE,sBAAsB,GAAE;AAAA,MACpE,mBAAmB,gBAAAN,MAACM,QAAA,EAAK,OAAO,OAAO,OAAQ,2BAAgB;AAAA,OAClE;AAAA,IAGA,gBAAAN,MAACK,OAAA,EAAI,eAAc,UAAS,WAAW,QAAQ,IAAI,aAAa,QAAQ,IACrE,sBACC,gBAAAJ,OAACI,OAAA,EAAI,eAAc,UAAS,KAAK,QAAQ,IACvC;AAAA,sBAAAL,MAACM,QAAA,EAAK,MAAI,MAAC,OAAO,OAAO,MAAO,YAAE,oBAAoB,GAAE;AAAA,MACvD,eACC,gBAAAN,MAACM,QAAA,EAAK,OAAO,OAAO,KAAM,YAAE,yBAAyB,GAAE,IAEvD,gBAAAL,OAACI,OAAA,EAAI,KAAK,QAAQ,IAChB;AAAA,wBAAAL,MAACM,QAAA,EAAK,OAAO,OAAO,OAAQ,YAAE,oBAAoB,GAAE;AAAA,QACpD,gBAAAN;AAAA,UAACO;AAAA,UAAA;AAAA,YACC,cAAa;AAAA,YACb,aAAY;AAAA,YACZ,UAAU,OAAO,UAAkB;AACjC,kBAAI,CAAC,MAAM,KAAK,EAAG;AACnB,8BAAgB,IAAI;AACpB,kBAAI;AACF,sBAAM,SAAS,MAAM,gBAAgB,KAAK;AAC1C,oBAAI,OAAO,SAAS;AAClB,iCAAe,EAAE,SAAS,MAAM,SAAS,EAAE,wBAAwB,EAAE,SAAS,WAAW,OAAO,SAAU,EAAE,CAAC,EAAE,CAAC;AAAA,gBAClH,OAAO;AACL,iCAAe,EAAE,SAAS,OAAO,SAAS,OAAO,SAAS,EAAE,sBAAsB,EAAE,CAAC;AAAA,gBACvF;AAAA,cACF,QAAQ;AACN,+BAAe,EAAE,SAAS,OAAO,SAAS,EAAE,oBAAoB,EAAE,CAAC;AAAA,cACrE,UAAE;AACA,gCAAgB,KAAK;AAAA,cACvB;AAAA,YACF;AAAA;AAAA,QACF;AAAA,SACF;AAAA,MAED,eACC,gBAAAP,MAAC,gBAAa,QAAQ,YAAY,UAAU,YAAY,SAAS,SAAS,YAAY,SAAS;AAAA,MAEjG,gBAAAA,MAACM,QAAA,EAAK,OAAO,OAAO,eAAe,UAAQ,MAAE,YAAE,kBAAkB,GAAE;AAAA,OACrE,IAEA,gBAAAN,MAACM,QAAA,EAAK,OAAO,OAAO,eAAgB,YAAE,mBAAmB,GAAE,GAE/D;AAAA,IAEA,gBAAAN,MAACK,OAAA,EAAI,WAAW,QAAQ,IACtB,0BAAAJ,OAACK,QAAA,EAAK,OAAO,OAAO,eAChB;AAAA,iBAAW,SAAS,WAAW,SAAU,KAAK,EAAE,iBAAiB,CAAC,OAAO;AAAA,MACzE,WAAW,SAAS,WAAW,UAAU,WAAW,YAClD,KAAK,EAAE,iBAAiB,CAAC,OACzB;AAAA,MACH,eAAe,EAAE,sBAAsB,IAAI;AAAA,MAC3C;AAAA,MAAK,EAAE,eAAe,EAAE,SAAS,QAAmC,CAAC;AAAA,OACxE,GACF;AAAA,KACF;AAEJ;;;AEjNA,SAAgB,eAAAE,cAAa,aAAAC,aAAW,UAAAC,UAAQ,YAAAC,kBAAgB;AAChE,SAAS,OAAAC,OAAK,QAAAC,cAAY;;;ACD1B,SAAS,UAAAC,gBAAc;;;ACAvB,SAAS,WAAAC,gBAAe;AACxB,SAAS,QAAAC,aAAY;AASrB,eAAe,eACb,MACA,eACA,aACoE;AAEpE,MAAI,gBAAgB,QAAQ;AAC1B,WAAO,EAAE,UAAU,WAAW;AAAA,EAChC;AAGA,MAAI;AACF,UAAM,QAAQ,cAAc,MAAM,GAAG,EAAE,CAAC,KAAK;AAC7C,QAAI,UAAU,MAAM,CAAC,MAAM,SAAS,OAAO,EAAE,CAAC,GAAG;AAC/C,YAAM,mBAAmB,GAAG,IAAI,IAAI,KAAK;AACzC,YAAM,SAAS,CAAC,QAAQ,aAAa,gBAAgB,CAAC;AACtD,aAAO,EAAE,UAAU,qBAAqB,iBAAiB;AAAA,IAC3D;AAAA,EACF,QAAQ;AAAA,EAER;AAGA,MAAI;AACF,UAAM,aAAa,MAAM,SAAS,CAAC,SAAS,CAAC,GAAG,KAAK;AACrD,UAAM,eAAeC,MAAK,WAAW,WAAW;AAChD,UAAM,UAAU,MAAMC,SAAQ,YAAY;AAC1C,UAAM,QAAQ,QAAQ;AAAA,MACpB,CAAC,UAAU,MAAM,SAAS,IAAI,KAAK,MAAM,SAAS,aAAa;AAAA,IACjE;AACA,QAAI,OAAO;AACT,aAAO,EAAE,UAAU,eAAe;AAAA,IACpC;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,SAAO,EAAE,UAAU,WAAW;AAChC;AAEA,eAAsB,kBACpBC,WACA,OACuB;AACvB,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,sBAAsB;AAElD,QAAM,UAAU,MAAM,gBAAgB;AACtC,QAAM,OAAO,cAAcA,WAAU,OAAO;AAE5C,QAAM,UAA4B,CAAC;AACnC,QAAM,WAAqB,CAAC;AAG5B,aAAW,SAAS,KAAK,UAAU;AACjC,UAAM,OAAO,MAAM;AACnB,UAAM,EAAE,UAAU,iBAAiB,IAAI,MAAM,eAAe,MAAM,MAAM,MAAM,MAAM,IAAI;AACxF,YAAQ,KAAK;AAAA,MACX,aAAa,MAAM;AAAA,MACnB,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,aAAa,MAAM;AAAA;AAAA,MACnB,WAAW,MAAM;AAAA;AAAA,MACjB;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAGA,aAAW,SAAS,KAAK,YAAY;AACnC,UAAM,OAAO,MAAM;AACnB,UAAM,EAAE,UAAU,iBAAiB,IAAI,MAAM,eAAe,MAAM,MAAM,MAAM,MAAM,IAAI;AACxF,YAAQ,KAAK;AAAA,MACX,aAAa,MAAM;AAAA,MACnB,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,aAAa,MAAM;AAAA;AAAA,MACnB,WAAW,MAAM;AAAA;AAAA,MACjB;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAIA,aAAW,SAAS,KAAK,OAAO;AAC9B,QAAI,MAAM,SAAS,MAAO;AAC1B,UAAM,OAAO,MAAM;AACnB,YAAQ,KAAK;AAAA,MACX,aAAa,MAAM;AAAA,MACnB,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,aAAa,MAAM;AAAA,MACnB,WAAW;AAAA,MACX,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAGA,aAAW,SAAS,KAAK,SAAS;AAChC,QAAI,MAAM,SAAS,MAAO;AAC1B,UAAM,OAAO,MAAM;AACnB,UAAM,EAAE,UAAU,iBAAiB,IAAI,MAAM,eAAe,MAAM,MAAM,MAAM,SAAS,IAAI;AAC3F,YAAQ,KAAK;AAAA,MACX,aAAa,MAAM;AAAA,MACnB,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,WAAW,MAAM;AAAA,MACjB;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAGA,QAAM,eAAe,QAAQ;AAAA,IAC3B,CAAC,MAAM,EAAE,gBAAgB,UAAU,EAAE,WAAW,YAAY,EAAE,aAAa;AAAA,EAC7E,EAAE;AACF,MAAI,eAAe,GAAG;AACpB,aAAS,KAAK,GAAG,YAAY,kEAAkE;AAAA,EACjG;AAEA,QAAM,aAAa,QAAQ,KAAK,CAAC,MAAM,EAAE,aAAa,aAAa;AAEnE,QAAM,gBAAgBA,UAAS,SAAS;AACxC,QAAM,eAAe,IAAI,KAAKA,UAAS,UAAU,EAAE,eAAe;AAElE,SAAO,MAAM,uBAAuB,EAAE,aAAa,QAAQ,QAAQ,WAAW,CAAC;AAE/E,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,gBAAuB,oBACrB,MACA,OACwB;AACxB,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,sBAAsB;AAElD,aAAW,UAAU,KAAK,SAAS;AACjC,QAAI,OAAO,aAAa,eAAe;AACrC,YAAM,UAAU,OAAO,WAAW;AAClC;AAAA,IACF;AAEA,QAAI,OAAO,WAAW,UAAU;AAC9B,YAAM,UAAU,OAAO,WAAW;AAClC;AAAA,IACF;AAIA,QAAI;AACF,0BAAoB,OAAO,WAAW;AACtC,UAAI,OAAO,iBAAkB,qBAAoB,OAAO,gBAAgB;AAAA,IAC1E,SAAS,KAAK;AACZ,YAAM,YAAY,OAAO,WAAW,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AACzF;AAAA,IACF;AAEA,QAAI,OAAO,WAAW,WAAW;AAC/B,UAAI,OAAO,aAAa,YAAY;AAClC,cAAM,UAAU,OAAO,WAAW;AAClC;AAAA,MACF;AACA,UAAI,OAAO,aAAa,uBAAuB,OAAO,kBAAkB;AACtE,cAAM,aAAa,OAAO,WAAW,QAAQ,OAAO,gBAAgB;AACpE,yBAAiB,QAAQ,WAAW,CAAC,WAAW,OAAO,gBAAgB,CAAC,GAAG;AACzE,gBAAM;AAAA,QACR;AACA;AAAA,MACF;AACA,UAAI,OAAO,aAAa,gBAAgB;AACtC,cAAM,aAAa,OAAO,WAAW;AACrC,yBAAiB,QAAQ,WAAW,CAAC,WAAW,kBAAkB,OAAO,WAAW,CAAC,GAAG;AACtF,gBAAM;AAAA,QACR;AACA;AAAA,MACF;AACA;AAAA,IACF;AAGA,QAAI,OAAO,aAAa,uBAAuB,OAAO,kBAAkB;AACtE,YAAM,eAAe,OAAO,WAAW,KAAK,OAAO,WAAW,WAAM,OAAO,SAAS,QAAQ,OAAO,gBAAgB;AACnH,uBAAiB,QAAQ,WAAW,CAAC,WAAW,OAAO,gBAAgB,CAAC,GAAG;AACzE,cAAM;AAAA,MACR;AAAA,IACF,WAAW,OAAO,aAAa,gBAAgB;AAC7C,YAAM,eAAe,OAAO,WAAW,KAAK,OAAO,WAAW,WAAM,OAAO,SAAS;AACpF,uBAAiB,QAAQ,WAAW,CAAC,WAAW,kBAAkB,OAAO,WAAW,CAAC,GAAG;AACtF,cAAM;AAAA,MACR;AAAA,IACF,WAAW,OAAO,aAAa,YAAY;AACzC,YAAM,SAAS,OAAO,WAAW;AACjC,YAAM,SAAS,CAAC,OAAO,OAAO,WAAW,CAAC;AAC1C,YAAM,iBAAY,OAAO,WAAW;AAAA,IACtC;AAAA,EACF;AAGA,QAAM;AACN,MAAI;AACF,UAAM,eAAe,MAAM,gBAAgB;AAC3C,UAAM,aAAa,cAAc,eAAe;AAChD,UAAM;AAAA,EACR,SAAS,KAAK;AACZ,WAAO,KAAK,yCAAyC,EAAE,IAAI,CAAC;AAC5D,UAAM;AAAA,EACR;AACF;;;AD7MO,IAAM,mBAAmBC,SAAsB,CAAC,SAAS;AAAA,EAC9D,WAAW,CAAC;AAAA,EACZ,SAAS;AAAA,EACT,OAAO;AAAA,EACP,kBAAkB;AAAA,EAClB,MAAM;AAAA,EACN,aAAa;AAAA,EACb,WAAW;AAAA,EAEX,gBAAgB,OAAO,UAAU;AAC/B,QAAI,CAAC,MAAO;AACZ,QAAI,EAAE,SAAS,MAAM,OAAO,KAAK,CAAC;AAClC,QAAI;AACF,YAAM,YAAY,MAAM,cAAc;AACtC,UAAI,EAAE,WAAW,SAAS,MAAM,CAAC;AAAA,IACnC,SAAS,KAAK;AACZ,UAAI,EAAE,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,GAAG,SAAS,MAAM,CAAC;AAAA,IACjF;AAAA,EACF;AAAA,EAEA,gBAAgB,OAAOC,WAAU,UAAU;AACzC,QAAI,CAACA,WAAU;AACb,UAAI,EAAE,kBAAkB,MAAM,MAAM,MAAM,WAAW,KAAK,CAAC;AAC3D;AAAA,IACF;AACA,QAAI,EAAE,kBAAkBA,WAAU,MAAM,MAAM,aAAa,MAAM,WAAW,KAAK,CAAC;AAClF,QAAI;AACF,YAAM,OAAO,MAAM,kBAAkBA,WAAU,KAAK;AACpD,UAAI,EAAE,MAAM,aAAa,MAAM,CAAC;AAAA,IAClC,SAAS,KAAK;AACZ,UAAI,EAAE,WAAW,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,GAAG,aAAa,MAAM,CAAC;AAAA,IACzF;AAAA,EACF;AAAA,EAEA,WAAW,MAAM,IAAI,EAAE,kBAAkB,MAAM,MAAM,MAAM,WAAW,KAAK,CAAC;AAC9E,EAAE;;;ADMM,SACA,OAAAC,OADA,QAAAC,cAAA;AAvCR,SAAS,cAAc,QAAgC;AACrD,UAAQ,OAAO,UAAU;AAAA,IACvB,KAAK;AAAqB,aAAO,EAAE,6BAA6B;AAAA,IAChE,KAAK;AAAqB,aAAO,EAAE,0BAA0B;AAAA,IAC7D,KAAK;AAAqB,aAAO,EAAE,uBAAuB;AAAA,IAC1D,KAAK;AAAqB,aAAO,EAAE,+BAA+B;AAAA,EACpE;AACF;AAEA,SAAS,YAAY,QAAgC;AACnD,MAAI,OAAO,aAAa,cAAe,QAAO,OAAO;AACrD,MAAI,OAAO,WAAW,SAAiB,QAAO,OAAO;AACrD,MAAI,OAAO,WAAW,YAAiB,QAAO,OAAO;AACrD,MAAI,OAAO,WAAW,UAAiB,QAAO,OAAO;AACrD,SAAO,OAAO;AAChB;AAEA,SAAS,aAAa,QAAgC;AACpD,MAAI,OAAO,aAAa,iBAAiB,OAAO,WAAW,SAAU,QAAO;AAC5E,MAAI,OAAO,aAAa,WAAY,QAAO;AAC3C,MAAI,OAAO,WAAW,YAAa,QAAO;AAC1C,SAAO;AACT;AAEA,SAAS,SAAS,EAAE,KAAK,GAA2B;AAClD,QAAM,kBAAkB,KAAK,QAAQ,OAAO,CAAC,MAAM,EAAE,aAAa,iBAAiB,EAAE,WAAW,QAAQ,EAAE;AAE1G,QAAM,sBAAsB,KAAK,IAAI,KAAK,SAAS,QAAQ,CAAC,IAAI;AAChE,QAAM,gBAAgB,eAAe;AAAA,IACnC,cAAc,IAAI;AAAA,IAClB,sBAAsB,KAAK;AAAA,IAC3B,SAAS;AAAA,EACX,CAAC;AACD,QAAM,iBAAiB,KAAK,QAAQ,MAAM,GAAG,aAAa;AAC1D,QAAM,gBAAgB,KAAK,QAAQ,SAAS,eAAe;AAE3D,SACE,gBAAAA,OAACC,OAAA,EAAI,eAAc,UAAS,WAAW,QAAQ,IAC7C;AAAA,oBAAAD,OAACC,OAAA,EAAI,cAAc,QAAQ,IACzB;AAAA,sBAAAD,OAACE,QAAA,EAAK,OAAO,OAAO,MAAM,MAAI,MAAE;AAAA,aAAK;AAAA,QAAc;AAAA,SAAC;AAAA,MACpD,gBAAAH,MAACG,QAAA,EAAK,OAAO,OAAO,eAAgB,eAAK,cAAa;AAAA,OACxD;AAAA,IAEC,KAAK,QAAQ,WAAW,KACvB,gBAAAH,MAAC,gBAAa,QAAO,WAAU,SAAS,EAAE,qBAAqB,GAAG;AAAA,IAGnE,eAAe,IAAI,CAAC,MACnB,gBAAAC,OAACC,OAAA,EACC;AAAA,sBAAAD,OAACE,QAAA,EAAK,OAAO,YAAY,CAAC,GAAI;AAAA,qBAAa,CAAC;AAAA,QAAE;AAAA,SAAC;AAAA,MAC/C,gBAAAH,MAACG,QAAA,EAAK,OAAO,YAAY,CAAC,GAAG,MAAI,MAAE,YAAE,aAAY;AAAA,MAChD,EAAE,gBAAgB,MAAM,EAAE,cAAc,MACvC,gBAAAF,OAACE,QAAA,EAAK,OAAO,OAAO,eAAgB;AAAA;AAAA,QAAK,EAAE;AAAA,QAAY;AAAA,QAAI,EAAE;AAAA,SAAU;AAAA,MAExE,EAAE,gBAAgB,MAAM,EAAE,cAAc,MACvC,gBAAAF,OAACE,QAAA,EAAK,OAAO,OAAO,eAAe;AAAA;AAAA,QAAU,EAAE;AAAA,SAAU;AAAA,MAE1D,EAAE,gBAAgB,MAAM,EAAE,cAAc,MACvC,gBAAAH,MAACG,QAAA,EAAK,OAAO,OAAO,eAAe,qBAAO;AAAA,MAE5C,gBAAAF,OAACE,QAAA,EAAK,OAAO,OAAO,OAAO,UAAQ,MAAC;AAAA;AAAA,QAAI,cAAc,CAAC;AAAA,QAAE;AAAA,SAAC;AAAA,SAZlD,EAAE,cAAc,EAAE,MAa5B,CACD;AAAA,IACA,gBAAgB,KACf,gBAAAF,OAACE,QAAA,EAAK,OAAO,OAAO,eAAe,UAAQ,MAAC;AAAA;AAAA,MAAG,EAAE,oBAAoB,EAAE,OAAO,cAAc,CAAC;AAAA,OAAE;AAAA,IAGhG,KAAK,SAAS,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,MAC9B,gBAAAH,MAACE,OAAA,EAAY,WAAW,QAAQ,IAC9B,0BAAAD,OAACE,QAAA,EAAK,OAAO,OAAO,SAAS,MAAK,QAAO;AAAA;AAAA,MAAG;AAAA,OAAE,KADtC,CAEV,CACD;AAAA,IACA,KAAK,SAAS,SAAS,KACtB,gBAAAF,OAACE,QAAA,EAAK,OAAO,OAAO,eAAe,UAAQ,MAAC;AAAA;AAAA,MAAG,EAAE,kBAAkB,EAAE,OAAO,KAAK,SAAS,SAAS,EAAE,CAAC;AAAA,OAAE;AAAA,IAG1G,gBAAAH,MAACE,OAAA,EAAI,WAAW,QAAQ,IACrB,eAAK,aACJ,gBAAAD,OAACE,QAAA,EAAK,OAAO,OAAO,eAAe;AAAA;AAAA,MAC1B,EAAE,oBAAoB,EAAE,OAAO,OAAO,eAAe,EAAE,CAAC;AAAA,MAAE;AAAA,MAAO,EAAE,WAAW;AAAA,OACvF,IAEA,gBAAAF,OAACE,QAAA,EAAK,OAAO,OAAO,OAAQ;AAAA,QAAE,+BAA+B;AAAA,MAAE;AAAA,MAAO,EAAE,WAAW;AAAA,OAAE,GAEzF;AAAA,KACF;AAEJ;AAEO,SAAS,eAAe;AAC7B,QAAM,QAAQ,gBAAgB,CAAC,MAAM,EAAE,KAAK;AAC5C,QAAM,EAAE,WAAW,SAAS,OAAO,MAAM,aAAa,WAAW,gBAAgB,gBAAgB,UAAU,IAAI,iBAAiB;AAEhI,QAAM,CAAC,QAAQ,SAAS,IAAIC,WAAS,CAAC;AACtC,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAgB,MAAM;AAChD,QAAM,CAAC,aAAa,cAAc,IAAIA,WAAmB,CAAC,CAAC;AAC3D,QAAM,CAAC,eAAe,gBAAgB,IAAIA,WAAS,KAAK;AACxD,QAAM,CAAC,aAAa,cAAc,IAAIA,WAAwB,IAAI;AAClE,QAAM,eAAeC,SAAsC,IAAI;AAC/D,QAAM,aAAaA,SAAO,IAAI;AAC9B,QAAM,eAAe,eAAe;AAAA,IAClC,cAAc;AAAA,IACd,sBAAsB;AAAA,IACtB,SAAS;AAAA,EACX,CAAC;AAED,EAAAC,YAAU,MAAM;AACd,eAAW,UAAU;AACrB,WAAO,MAAM;AACX,iBAAW,UAAU;AACrB,WAAK,aAAa,SAAS,OAAO,MAAS;AAAA,IAC7C;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,EAAAA,YAAU,MAAM;AAAE,SAAK,eAAe,MAAM,CAAC;AAAA,EAAG,GAAG,CAAC,CAAC;AAErD,QAAM,cAAcC,aAAY,OAAO,MAAoB;AACzD,aAAS,WAAW;AACpB,mBAAe,CAAC,CAAC;AACjB,mBAAe,IAAI;AACnB,qBAAiB,IAAI;AAErB,UAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC;AAC1C,iBAAa,UAAU;AAEvB,QAAI;AACF,uBAAiB,QAAQ,KAAK;AAC5B,YAAI,CAAC,WAAW,QAAS;AACzB,uBAAe,CAAC,SAAS,CAAC,GAAG,KAAK,MAAM,GAAG,GAAG,IAAI,CAAC;AAAA,MACrD;AAAA,IACF,SAAS,KAAK;AACZ,UAAI,WAAW,SAAS;AACtB,uBAAe,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,MACjE;AAAA,IACF,UAAE;AACA,mBAAa,UAAU;AACvB,UAAI,WAAW,SAAS;AACtB,yBAAiB,KAAK;AACtB,iBAAS,QAAQ;AAAA,MACnB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,KAAK,CAAC;AAEV,eAAa,CAAC,OAAO,QAAQ;AAC3B,QAAI,UAAU,YAAa;AAE3B,QAAI,UAAU,UAAU;AACtB,UAAI,IAAI,UAAU,UAAU,KAAK;AAC/B,iBAAS,MAAM;AACf,kBAAU;AACV,aAAK,eAAe,MAAM,CAAC;AAAA,MAC7B;AACA;AAAA,IACF;AAEA,QAAI,UAAU,UAAW;AAEzB,QAAI,UAAU,QAAQ;AACpB,UAAI,IAAI,QAAQ;AAAE,kBAAU;AAAG,iBAAS,MAAM;AAAG;AAAA,MAAQ;AACzD,UAAI,IAAI,UAAU,MAAM,YAAY;AAAE,iBAAS,SAAS;AAAA,MAAG;AAC3D;AAAA,IACF;AAGA,QAAI,UAAU,OAAO,IAAI,WAAW;AAClC,gBAAU,CAAC,MAAM,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,GAAG,UAAU,SAAS,CAAC,CAAC,CAAC;AAAA,IACrE,WAAW,UAAU,OAAO,IAAI,SAAS;AACvC,gBAAU,CAAC,MAAM,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC;AAAA,IACrC,WAAW,IAAI,UAAU,UAAU,MAAM,GAAG;AAC1C,WAAK,eAAe,UAAU,MAAM,GAAI,MAAM,CAAC;AAC/C,eAAS,MAAM;AAAA,IACjB,WAAW,UAAU,OAAO,UAAU,KAAK;AACzC,WAAK,eAAe,MAAM,CAAC;AAAA,IAC7B;AAAA,EACF,CAAC;AAED,MAAI,QAAS,QAAO,gBAAAP,MAAC,WAAQ,SAAS,EAAE,0BAA0B,GAAG;AACrE,MAAI,MAAO,QAAO,gBAAAA,MAAC,gBAAa,SAAS,OAAO;AAEhD,MAAI,UAAU,aAAa;AACzB,WACE,gBAAAC,OAACC,OAAA,EAAI,eAAc,UACjB;AAAA,sBAAAF,MAAC,eAAY,OAAO,aAAa,WAAW,eAAe,OAAO,EAAE,oBAAoB,GAAG;AAAA,MAG3F,gBAAAA,MAACE,OAAA,EAAI,WAAW,QAAQ,IACtB,0BAAAF,MAACG,QAAA,EAAK,OAAO,OAAO,SAAU,YAAE,8BAA8B,GAAE,GAClE;AAAA,OACF;AAAA,EAEJ;AAEA,MAAI,UAAU,UAAU;AACtB,WACE,gBAAAF,OAACC,OAAA,EAAI,eAAc,UAAS,WAAW,QAAQ,IAC7C;AAAA,sBAAAF;AAAA,QAAC;AAAA;AAAA,UACC,QAAQ,cAAc,UAAU;AAAA,UAChC,SAAS,cAAc,EAAE,kBAAkB,EAAE,OAAO,YAAY,CAAC,IAAI,EAAE,kBAAkB;AAAA;AAAA,MAC3F;AAAA,MACA,gBAAAA,MAACE,OAAA,EAAI,WAAW,QAAQ,IACtB,0BAAAD,OAACE,QAAA,EAAK,OAAO,OAAO,eAAe;AAAA;AAAA,QAAG,EAAE,cAAc;AAAA,QAAE;AAAA,QAAO,EAAE,WAAW;AAAA,SAAE,GAChF;AAAA,OACF;AAAA,EAEJ;AAEA,SACE,gBAAAF,OAACC,OAAA,EAAI,eAAc,UACjB;AAAA,oBAAAF,MAAC,iBAAc,OAAM,UAAI,OAAO,EAAE,gBAAgB,GAAG,UAAU,UAAU,MAAM;AAAA,IAE9E,UAAU,WAAW,KACpB,gBAAAA,MAACE,OAAA,EAAI,WAAW,QAAQ,IACtB,0BAAAF,MAAC,gBAAa,QAAO,QAAO,SAAS,EAAE,uBAAuB,GAAG,GACnE;AAAA,IAGD,UAAU,UAAU,UAAU,SAAS,MAAM,MAAM;AAClD,YAAM,QAAQ,KAAK,IAAI,GAAG,SAAS,KAAK,MAAM,eAAe,CAAC,CAAC;AAC/D,YAAM,UAAU,UAAU,MAAM,OAAO,QAAQ,YAAY;AAC3D,aACE,gBAAAC,OAACC,OAAA,EAAI,eAAc,UAAS,WAAW,QAAQ,IAC7C;AAAA,wBAAAF,MAACG,QAAA,EAAK,OAAO,OAAO,eAAe,UAAQ,MAAE,YAAE,0BAA0B,GAAE;AAAA,QAC3E,gBAAAF,OAACC,OAAA,EAAI,eAAc,UAAS,WAAW,QAAQ,IAC5C;AAAA,kBAAQ,KACP,gBAAAD,OAACE,QAAA,EAAK,OAAO,OAAO,eAAe,UAAQ,MAAC;AAAA;AAAA,YAAG,EAAE,oBAAoB,EAAE,OAAO,MAAM,CAAC;AAAA,aAAE;AAAA,UAExF,QAAQ,IAAI,CAAC,GAAG,OAAO;AACtB,kBAAM,IAAI,QAAQ;AAClB,mBACE,gBAAAF,OAAC,iBAAiC,WAAW,MAAM,QACjD;AAAA,8BAAAD,MAACG,QAAA,EAAK,MAAM,MAAM,QAAQ,OAAO,MAAM,SAAS,OAAO,OAAO,OAAO,OAClE,YAAE,SAAS,EAAE,wBAAwB,GACxC;AAAA,cACA,gBAAAF,OAACE,QAAA,EAAK,OAAO,OAAO,eACjB;AAAA;AAAA,gBAAO,IAAI,KAAK,EAAE,UAAU,EAAE,eAAe;AAAA,iBAChD;AAAA,cACA,gBAAAF,OAACE,QAAA,EAAK,OAAO,OAAO,OAAO,UAAQ,MAChC;AAAA;AAAA,gBAAI;AAAA,gBAAE,GAAG,YAAY,EAAE,SAAS,SAAS,EAAE,MAAM,MAAM;AAAA,gBAAE;AAAA,iBAC5D;AAAA,iBATkB,EAAE,UAUtB;AAAA,UAEJ,CAAC;AAAA,UACA,QAAQ,eAAe,UAAU,UAChC,gBAAAF,OAACE,QAAA,EAAK,OAAO,OAAO,eAAe,UAAQ,MAAC;AAAA;AAAA,YAAG,EAAE,oBAAoB,EAAE,OAAO,UAAU,SAAS,QAAQ,aAAa,CAAC;AAAA,aAAE;AAAA,WAE7H;AAAA,SACF;AAAA,IAEJ,GAAG;AAAA,IAEF,UAAU,UACT,gBAAAF,OAACC,OAAA,EAAI,eAAc,UAChB;AAAA,qBAAe,gBAAAF,MAAC,WAAQ,SAAS,EAAE,oBAAoB,GAAG;AAAA,MAC1D,aAAa,gBAAAA,MAAC,gBAAa,SAAS,WAAW;AAAA,MAC/C,QAAQ,CAAC,eAAe,gBAAAA,MAAC,YAAS,MAAY;AAAA,OACjD;AAAA,IAGD,UAAU,aAAa,QACtB,gBAAAA,MAACE,OAAA,EAAI,WAAW,QAAQ,IACtB,0BAAAF;AAAA,MAAC;AAAA;AAAA,QACC,SAAS,EAAE,oBAAoB;AAAA,UAC7B,OAAO,OAAO,KAAK,QAAQ,OAAO,CAAC,MAAM,EAAE,aAAa,iBAAiB,EAAE,WAAW,QAAQ,EAAE,MAAM;AAAA,QACxG,CAAC;AAAA,QACD,WAAW,MAAM,KAAK,YAAY,IAAI;AAAA,QACtC,UAAU,MAAM,SAAS,MAAM;AAAA;AAAA,IACjC,GACF;AAAA,KAEJ;AAEJ;;;AGpSA,SAAgB,eAAAQ,cAAa,aAAAC,aAAW,UAAAC,UAAQ,YAAAC,kBAAgB;AAChE,SAAS,OAAAC,OAAK,QAAAC,cAAY;AAE1B,SAAS,aAAAC,kBAAiB;AA0BpB,SAEA,OAAAC,OAFA,QAAAC,cAAA;AAPN,SAAS,WAAW,EAAE,MAAM,GAAsB;AAChD,QAAM,QAAQ,SAAS,KAAK,OAAO,UAAU,SAAS,KAAK,OAAO,UAAU,OAAO;AACnF,QAAM,OAAO,KAAK,MAAM,QAAQ,EAAE;AAClC,QAAM,SAAS,SAAI,OAAO,IAAI;AAC9B,QAAM,QAAQ,SAAI,OAAO,KAAK,IAAI;AAClC,SACE,gBAAAA,OAACC,OAAA,EACC;AAAA,oBAAAD,OAACE,QAAA,EAAK,OAAe;AAAA;AAAA,MAAQ;AAAA,OAAM;AAAA,IACnC,gBAAAF,OAACE,QAAA,EAAK,OAAc,MAAI,MAAC;AAAA;AAAA,MAAE;AAAA,MAAM;AAAA,OAAE;AAAA,IACnC,gBAAAH,MAACG,QAAA,EAAK,OAAO,OAAO,eAAgB,YAAE,oBAAoB,GAAE;AAAA,KAC9D;AAEJ;AAIA,SAAS,aAAa,EAAE,MAAM,GAA2B;AACvD,SACE,gBAAAF,OAACC,OAAA,EAAI,eAAc,UAAS,WAAW,QAAQ,IAC5C;AAAA,UAAM,gBAAgB,SAAS,KAC9B,gBAAAD,OAACC,OAAA,EACC;AAAA,sBAAAF,MAACG,QAAA,EAAK,OAAO,OAAO,OAAO,qBAAE;AAAA,MAC7B,gBAAAH,MAACG,QAAA,EAAK,OAAO,OAAO,OACjB,YAAE,0BAA0B,EAAE,OAAO,MAAM,gBAAgB,OAAO,CAAC,GACtE;AAAA,MACA,gBAAAF,OAACE,QAAA,EAAK,OAAO,OAAO,eACjB;AAAA,eAAO,MAAM,gBAAgB,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI;AAAA,QAClD,MAAM,gBAAgB,SAAS,IAAI,QAAQ;AAAA,SAC9C;AAAA,OACF;AAAA,IAED,MAAM,cAAc,SAAS,KAC5B,gBAAAF,OAACC,OAAA,EACC;AAAA,sBAAAF,MAACG,QAAA,EAAK,OAAO,OAAO,SAAS,qBAAE;AAAA,MAC/B,gBAAAH,MAACG,QAAA,EAAK,OAAO,OAAO,SACjB,YAAE,wBAAwB,EAAE,OAAO,MAAM,cAAc,OAAO,CAAC,GAClE;AAAA,OACF;AAAA,IAED,MAAM,cAAc,SAAS,KAC5B,gBAAAF,OAACC,OAAA,EACC;AAAA,sBAAAF,MAACG,QAAA,EAAK,OAAO,OAAO,MAAM,qBAAE;AAAA,MAC5B,gBAAAH,MAACG,QAAA,EAAK,OAAO,OAAO,MACjB,YAAE,wBAAwB,EAAE,OAAO,MAAM,cAAc,OAAO,CAAC,GAClE;AAAA,OACF;AAAA,IAED,MAAM,gBAAgB,WAAW,KAChC,MAAM,cAAc,WAAW,KAC/B,MAAM,cAAc,WAAW,KAC7B,gBAAAH,MAAC,gBAAa,QAAO,WAAU,SAAS,EAAE,kBAAkB,GAAG;AAAA,KAErE;AAEJ;AAIO,SAAS,eAAe;AAC7B,QAAM,QAAQ,gBAAgB,CAAC,MAAM,EAAE,KAAK;AAC5C,QAAM,EAAE,QAAQ,OAAO,SAAS,cAAc,OAAO,MAAM,kBAAkB,IAAI,iBAAiB;AAElG,QAAM,CAAC,OAAO,QAAQ,IAAII,WAAgB,UAAU;AACpD,QAAM,CAAC,aAAa,cAAc,IAAIA,WAAmB,CAAC,CAAC;AAC3D,QAAM,CAAC,eAAe,gBAAgB,IAAIA,WAAS,KAAK;AACxD,QAAM,CAAC,aAAa,cAAc,IAAIA,WAAwB,IAAI;AAClE,QAAM,CAAC,eAAe,gBAAgB,IAAIA,WAAS,EAAE;AACrD,QAAM,eAAeC,SAAsC,IAAI;AAC/D,QAAM,aAAaA,SAAO,IAAI;AAE9B,EAAAC,YAAU,MAAM;AACd,eAAW,UAAU;AACrB,SAAK,KAAK;AACV,WAAO,MAAM;AACX,iBAAW,UAAU;AACrB,WAAK,aAAa,SAAS,OAAO,MAAS;AAAA,IAC7C;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,iBAAiBC,aAAY,YAAY;AAC7C,QAAI,CAAC,OAAQ;AACb,aAAS,aAAa;AACtB,mBAAe,CAAC,CAAC;AACjB,mBAAe,IAAI;AACnB,qBAAiB,IAAI;AAErB,UAAM,MAAM,UAAU,QAAQ,MAAM,CAAC;AACrC,iBAAa,UAAU;AAEvB,QAAI;AACF,uBAAiB,QAAQ,KAAK;AAC5B,YAAI,CAAC,WAAW,QAAS;AACzB,uBAAe,CAAC,SAAS,CAAC,GAAG,KAAK,MAAM,GAAG,GAAG,IAAI,CAAC;AAAA,MACrD;AACA,UAAI,WAAW,SAAS;AACtB,yBAAiB,EAAE,4BAA4B,CAAC;AAAA,MAClD;AAAA,IACF,SAAS,KAAK;AACZ,UAAI,WAAW,SAAS;AACtB,cAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,uBAAe,GAAG;AAClB,yBAAiB,EAAE,4BAA4B,EAAE,OAAO,IAAI,CAAC,CAAC;AAAA,MAChE;AAAA,IACF,UAAE;AACA,mBAAa,UAAU;AACvB,UAAI,WAAW,SAAS;AACtB,yBAAiB,KAAK;AACtB,iBAAS,QAAQ;AAAA,MACnB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,QAAQ,KAAK,CAAC;AAElB,eAAa,CAAC,OAAO,QAAQ;AAC3B,QAAI,UAAU,cAAe;AAC7B,QAAI,UAAU,uBAAwB;AAEtC,QAAI,UAAU,UAAU;AACtB,UAAI,IAAI,UAAU,UAAU,KAAK;AAC/B,iBAAS,UAAU;AACnB,aAAK,KAAK;AAAA,MACZ;AACA;AAAA,IACF;AAEA,QAAI,UAAU,WAAY;AAG1B,QAAI,UAAU,OAAO,UAAU,KAAK;AAClC,eAAS,UAAU;AACnB;AAAA,IACF;AACA,QAAI,UAAU,OAAO,UAAU,KAAK;AAClC,WAAK,KAAK;AACV;AAAA,IACF;AACA,QAAI,UAAU,OAAO,UAAU,KAAK;AAClC,YAAM,iBACJ,UACE,MAAM,gBAAgB,SAAS,KAC/B,MAAM,cAAc,SAAS;AAEjC,UAAI,gBAAgB;AAClB,iBAAS,sBAAsB;AAAA,MACjC;AACA;AAAA,IACF;AACA,QAAI,IAAI,QAAQ;AAAA,IAEhB;AAAA,EACF,CAAC;AAED,MAAI,QAAS,QAAO,gBAAAP,MAAC,WAAQ,SAAS,EAAE,iBAAiB,GAAG;AAC5D,MAAI,MAAO,QAAO,gBAAAA,MAAC,gBAAa,SAAS,OAAO;AAGhD,MAAI,UAAU,0BAA0B,OAAO;AAC7C,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,SAAS,EAAE,8BAA8B;AAAA,UACvC,SAAS,OAAO,MAAM,gBAAgB,MAAM;AAAA,UAC5C,UAAU,OAAO,MAAM,cAAc,MAAM;AAAA,QAC7C,CAAC;AAAA,QACD,WAAW,MAAM;AAAE,eAAK,eAAe;AAAA,QAAG;AAAA,QAC1C,UAAU,MAAM;AAAE,mBAAS,UAAU;AAAA,QAAG;AAAA;AAAA,IAC1C;AAAA,EAEJ;AAGA,MAAI,UAAU,YAAY;AACxB,WACE,gBAAAC,OAACC,OAAA,EAAI,eAAc,UAAS,WAAW,QAAQ,IAC7C;AAAA,sBAAAF,MAAC,iBAAc,OAAM,aAAK,OAAO,EAAE,gBAAgB,GAAG,UAAU,UAAU,OAAO;AAAA,MACjF,gBAAAC,OAACC,OAAA,EAAI,WAAW,QAAQ,IACtB;AAAA,wBAAAD,OAACE,QAAA,EAAK,OAAO,OAAO,eAAgB;AAAA,YAAE,sBAAsB;AAAA,UAAE;AAAA,WAAC;AAAA,QAC/D,gBAAAH;AAAA,UAACQ;AAAA,UAAA;AAAA,YACC,cAAa;AAAA,YACb,UAAU,CAAC,UAAU;AACnB,oBAAM,OAAO,MAAM,KAAK,KAAK;AAC7B,uBAAS,UAAU;AACnB,mBAAK,kBAAkB,IAAI,EAAE,KAAK,MAAM;AAAA,cAExC,CAAC;AAAA,YACH;AAAA;AAAA,QACF;AAAA,SACF;AAAA,OACF;AAAA,EAEJ;AAGA,MAAI,UAAU,eAAe;AAC3B,WACE,gBAAAR,MAACE,OAAA,EAAI,eAAc,UACjB,0BAAAF;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,QACP,WAAW;AAAA,QACX,OAAO,EAAE,sBAAsB;AAAA;AAAA,IACjC,GACF;AAAA,EAEJ;AAGA,MAAI,UAAU,UAAU;AACtB,WACE,gBAAAC,OAACC,OAAA,EAAI,eAAc,UAAS,WAAW,QAAQ,IAC7C;AAAA,sBAAAF;AAAA,QAAC;AAAA;AAAA,UACC,QAAQ,cAAc,UAAU;AAAA,UAChC,SAAS;AAAA;AAAA,MACX;AAAA,MACA,gBAAAA,MAACE,OAAA,EAAI,WAAW,QAAQ,IACtB,0BAAAD,OAACE,QAAA,EAAK,OAAO,OAAO,eAAe;AAAA;AAAA,QAAG,EAAE,cAAc;AAAA,QAAE;AAAA,QAAO,EAAE,WAAW;AAAA,SAAE,GAChF;AAAA,OACF;AAAA,EAEJ;AAGA,SACE,gBAAAF,OAACC,OAAA,EAAI,eAAc,UACjB;AAAA,oBAAAF,MAAC,iBAAc,OAAM,aAAK,OAAO,EAAE,gBAAgB,GAAG,UAAU,UAAU,OAAO;AAAA,IAEhF,WAAW,OACV,gBAAAC,OAACC,OAAA,EAAI,WAAW,QAAQ,IAAI,eAAc,UACxC;AAAA,sBAAAF,MAAC,gBAAa,QAAO,QAAO,SAAS,EAAE,sBAAsB,GAAG;AAAA,MAChE,gBAAAA,MAACE,OAAA,EAAI,WAAW,QAAQ,IACtB,0BAAAD,OAACE,QAAA,EAAK,OAAO,OAAO,eAAe;AAAA;AAAA,QAAG,EAAE,UAAU;AAAA,SAAE,GACtD;AAAA,OACF,IAEA,gBAAAF,OAACC,OAAA,EAAI,eAAc,UAAS,WAAW,QAAQ,IAE7C;AAAA,sBAAAD,OAACC,OAAA,EAAI,KAAK,QAAQ,IAChB;AAAA,wBAAAF,MAACG,QAAA,EAAK,OAAO,OAAO,MAAM,MAAI,MAAE,iBAAO,KAAK,MAAK;AAAA,QAChD,OAAO,KAAK,eACX,gBAAAH,MAACG,QAAA,EAAK,OAAO,OAAO,eAAgB,iBAAO,KAAK,aAAY;AAAA,QAE7D,OAAO,cACN,gBAAAF,OAACE,QAAA,EAAK,OAAO,OAAO,SAAS;AAAA;AAAA,UAAE,EAAE,sBAAsB;AAAA,UAAE;AAAA,WAAC;AAAA,SAE9D;AAAA,MAGA,gBAAAF,OAACC,OAAA,EAAI,KAAK,QAAQ,IAAI,WAAW,QAAQ,IACvC;AAAA,wBAAAF,MAACG,QAAA,EAAK,OAAO,OAAO,KACjB,YAAE,2BAA2B,EAAE,OAAO,OAAO,SAAS,OAAO,CAAC,GACjE;AAAA,QACA,gBAAAH,MAACG,QAAA,EAAK,OAAO,OAAO,MACjB,YAAE,wBAAwB,EAAE,OAAO,OAAO,MAAM,OAAO,CAAC,GAC3D;AAAA,SACF;AAAA,MAGC,gBACC,gBAAAH,MAACE,OAAA,EAAI,WAAW,QAAQ,IACtB,0BAAAF,MAACG,QAAA,EAAK,OAAO,OAAO,OAAQ,YAAE,0BAA0B,GAAE,GAC5D;AAAA,MAED,SAAS,CAAC,gBACT,gBAAAF,OAACC,OAAA,EAAI,eAAc,UAAS,WAAW,QAAQ,IAC7C;AAAA,wBAAAF,MAAC,cAAW,OAAO,MAAM,OAAO;AAAA,QAChC,gBAAAA,MAAC,gBAAa,OAAc;AAAA,SAC9B;AAAA,MAIF,gBAAAA,MAACE,OAAA,EAAI,WAAW,QAAQ,IACtB,0BAAAD,OAACE,QAAA,EAAK,OAAO,OAAO,eAAe;AAAA;AAAA,QAC9B,EAAE,cAAc;AAAA,QAClB,UAAU,MAAM,gBAAgB,SAAS,KAAK,MAAM,cAAc,SAAS,KACxE,OAAO,EAAE,gBAAgB,CAAC,KAC1B;AAAA,QACH;AAAA,QAAK;AAAA,QAAG,EAAE,UAAU;AAAA,SACvB,GACF;AAAA,OACF;AAAA,KAEJ;AAEJ;;;AC9SA,SAAgB,eAAAM,cAAa,aAAAC,aAAW,YAAAC,kBAAgB;AACxD,SAAS,OAAAC,OAAK,QAAAC,cAAY;AA6ClB,qBAAAC,WAEI,OAAAC,OAFJ,QAAAC,cAAA;AAnBR,SAAS,gBAAgB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,iBAAiB;AACnB,GAMG;AACD,QAAM,eAAe,UAAU,SAAS;AACxC,QAAM,qBAAqB,CAAC,gBAAgB,CAAC,CAAC,YAAY;AAE1D,SACE,gBAAAA,OAACC,OAAA,EAAI,eAAc,UAAS,WAAW,QAAQ,IAC5C;AAAA,aACC,gBAAAD,OAAAF,WAAA,EACE;AAAA,sBAAAC,MAACE,OAAA,EAAI,cAAc,QAAQ,IACzB,0BAAAF,MAACG,QAAA,EAAK,OAAO,OAAO,eAAgB,YAAE,gBAAgB,EAAE,MAAM,OAAO,YAAY,CAAC,GAAE,GACtF;AAAA,MACC,OAAO,YACN,gBAAAH,MAACE,OAAA,EAAI,cAAc,QAAQ,IACzB,0BAAAF,MAACG,QAAA,EAAK,OAAO,OAAO,eACjB,YAAE,kBAAkB,EAAE,MAAM,IAAI,KAAK,OAAO,QAAQ,EAAE,eAAe,EAAE,CAAC,GAC3E,GACF;AAAA,MAED,eACC,gBAAAH;AAAA,QAAC;AAAA;AAAA,UACC,QAAO;AAAA,UACP,SAAS,EAAE,wBAAwB,EAAE,OAAO,OAAO,UAAU,MAAM,EAAE,CAAC;AAAA;AAAA,MACxE,IACE,YAAY,UACd,gBAAAA,MAAC,gBAAa,QAAO,WAAU,SAAS,EAAE,gBAAgB,GAAG,IAC3D;AAAA,OACN,IAEA,gBAAAA,MAACE,OAAA,EAAI,cAAc,QAAQ,IACzB,0BAAAF,MAACG,QAAA,EAAK,OAAO,OAAO,eAAgB,YAAE,eAAe,GAAE,GACzD;AAAA,IAGF,gBAAAH,MAACE,OAAA,EAAI,WAAW,QAAQ,IACtB,0BAAAD,OAACE,QAAA,EAAK,OAAO,OAAO,eACjB;AAAA;AAAA,MAAI,gBAAAF,OAACE,QAAA,EAAK,OAAO,OAAO,MAAM;AAAA;AAAA,QAAE,EAAE,WAAW;AAAA,SAAE;AAAA,MAC/C,gBACC,gBAAAF,OAAAF,WAAA,EACG;AAAA;AAAA,QAAM,gBAAAE,OAACE,QAAA,EAAK,OAAO,OAAO,MAAM;AAAA;AAAA,UAAE,EAAE,eAAe;AAAA,WAAE;AAAA,SACxD;AAAA,MAED,sBACC,gBAAAF,OAAAF,WAAA,EACG;AAAA;AAAA,QAAM,gBAAAE,OAACE,QAAA,EAAK,OAAO,OAAO,MAAM;AAAA;AAAA,UAAE,EAAE,uBAAuB;AAAA,WAAE;AAAA,SAChE;AAAA,OAEJ,GACF;AAAA,KACF;AAEJ;AAEA,SAAS,cAAc;AAAA,EACrB;AAAA,EACA;AACF,GAGG;AAED,QAAM,gBAAgB,eAAe;AAAA,IACnC,cAAc;AAAA,IACd,sBAAsB;AAAA,IACtB,SAAS;AAAA,EACX,CAAC;AACD,QAAM,eAAe;AACrB,QAAM,aAAa,KAAK,IAAI,GAAG,KAAK,MAAM,gBAAgB,YAAY,CAAC;AACvE,QAAM,QAAQ,KAAK,IAAI,GAAG,SAAS,KAAK,MAAM,aAAa,CAAC,CAAC;AAC7D,QAAM,UAAU,QAAQ,MAAM,OAAO,QAAQ,UAAU;AACvD,SACE,gBAAAF,OAACC,OAAA,EAAI,eAAc,UAAS,WAAW,QAAQ,IAC5C;AAAA,YAAQ,KACP,gBAAAD,OAACE,QAAA,EAAK,OAAO,OAAO,eAAe,UAAQ,MAAC;AAAA;AAAA,MAAG,EAAE,oBAAoB,EAAE,OAAO,MAAM,CAAC;AAAA,OAAE;AAAA,IAExF,QAAQ,IAAI,CAAC,OAAO,OAAO;AAC1B,YAAM,IAAI,QAAQ;AAClB,YAAM,EAAE,UAAU,WAAW,IAAI;AACjC,YAAM,WAAW,MAAM;AACvB,aACE,gBAAAF,OAACC,OAAA,EAA8D,eAAc,UAAS,cAAc,QAAQ,IAC1G;AAAA,wBAAAD,OAAC,iBAAc,WAAW,UACxB;AAAA,0BAAAD,MAACG,QAAA,EAAK,MAAI,MAAC,OAAO,WAAW,OAAO,OAAO,OAAO,eAC/C,YAAE,uBAAuB,EAAE,SAAS,SAAS,YAAY,CAAC,GAC7D;AAAA,UACA,gBAAAF,OAACE,QAAA,EAAK,OAAO,OAAO,OAAO;AAAA;AAAA,YAAG,SAAS;AAAA,YAAY;AAAA,aAAC;AAAA,WACtD;AAAA,QACA,gBAAAF,OAACC,OAAA,EAAI,YAAY,QAAQ,IAAI,eAAc,UACzC;AAAA,0BAAAD;AAAA,YAACE;AAAA,YAAA;AAAA,cACC,OAAO,eAAe,cAAc,OAAO,UAAU,OAAO;AAAA,cAE3D;AAAA;AAAA,gBAAM,EAAE,uBAAuB,EAAE,SAAS,SAAS,aAAa,CAAC;AAAA,gBACjE,eAAe,eAAe;AAAA;AAAA;AAAA,UACjC;AAAA,UACA,gBAAAF;AAAA,YAACE;AAAA,YAAA;AAAA,cACC,OAAO,eAAe,eAAe,OAAO,UAAU,OAAO;AAAA,cAE5D;AAAA;AAAA,gBAAM,EAAE,wBAAwB,EAAE,SAAS,SAAS,eAAe,SAAS,SAAS,cAAc,CAAC;AAAA,gBACpG,eAAe,gBAAgB;AAAA;AAAA;AAAA,UAClC;AAAA,WACF;AAAA,WApBQ,GAAG,SAAS,WAAW,IAAI,SAAS,aAAa,EAqB3D;AAAA,IAEJ,CAAC;AAAA,IACA,QAAQ,aAAa,QAAQ,UAC5B,gBAAAF,OAACE,QAAA,EAAK,OAAO,OAAO,eAAe,UAAQ,MAAC;AAAA;AAAA,MAAG,EAAE,oBAAoB,EAAE,OAAO,QAAQ,SAAS,QAAQ,WAAW,CAAC;AAAA,OAAE;AAAA,IAEvH,gBAAAH,MAACE,OAAA,EAAI,WAAW,QAAQ,IACtB,0BAAAD,OAACE,QAAA,EAAK,OAAO,OAAO,eAAe;AAAA;AAAA,MAC5B,EAAE,eAAe;AAAA,MAAE;AAAA,MAAK,EAAE,yBAAyB;AAAA,MAAE;AAAA,MAAK,EAAE,0BAA0B;AAAA,MAAE;AAAA,MAAS,EAAE,YAAY;AAAA,MAAE;AAAA,MAAO,EAAE,WAAW;AAAA,OAC5I,GACF;AAAA,KACF;AAEJ;AAEO,SAAS,WAAW;AACzB,QAAM,QAAQ,gBAAgB,CAAC,MAAM,EAAE,KAAK;AAC5C,QAAM,WAAW,mBAAmB,CAAC,MAAM,EAAE,QAAQ;AACrD,QAAM,EAAE,QAAQ,YAAY,WAAW,SAAS,OAAO,YAAY,SAAS,iBAAiB,IAC3F,aAAa;AAEf,QAAM,CAAC,OAAO,QAAQ,IAAIC,WAAgB,UAAU;AACpD,QAAM,CAAC,WAAW,YAAY,IAAIA,WAAwB,IAAI;AAC9D,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,WAA0B,CAAC,CAAC;AAC1E,QAAM,CAAC,QAAQ,SAAS,IAAIA,WAAS,CAAC;AAEtC,EAAAC,YAAU,MAAM;AACd,SAAK,WAAW,MAAM,CAAC;AAAA,EACzB,GAAG,CAAC,CAAC;AAGL,EAAAA,YAAU,MAAM;AACd,QAAI,UAAU,SAAS,GAAG;AACxB;AAAA,QACE,UAAU,IAAI,CAAC,OAAO,EAAE,UAAU,GAAG,YAAY,UAAgC,EAAE;AAAA,MACrF;AAAA,IACF;AAAA,EACF,GAAG,CAAC,SAAS,CAAC;AAEd,QAAM,gBAAgBC,aAAY,YAAY;AAC5C,aAAS,SAAS;AAClB,iBAAa,IAAI;AACjB,UAAM,QAAQ,MAAM,CAAC;AAErB,UAAM,QAAQ,aAAa,SAAS;AACpC,QAAI,MAAM,UAAU,SAAS,GAAG;AAC9B,eAAS,WAAW;AAAA,IACtB,WAAW,MAAM,OAAO;AACtB,mBAAa,MAAM,KAAK;AACxB,eAAS,QAAQ;AAAA,IACnB,OAAO;AACL,eAAS,QAAQ;AAAA,IACnB;AAAA,EACF,GAAG,CAAC,OAAO,OAAO,CAAC;AAEnB,QAAM,yBAAyBA,aAAY,YAAY;AACrD,UAAM,UAAU,gBAAgB,OAAO,CAAC,MAAM,EAAE,eAAe,SAAS;AACxE,QAAI,QAAQ,SAAS,EAAG;AAExB,UAAM,cAAc,gBAAgB,IAAI,CAAC,OAAO;AAAA,MAC9C,UAAU,EAAE;AAAA,MACZ,YAAY,EAAE;AAAA,IAChB,EAAE;AAEF,UAAM,iBAAiB,WAAW;AAClC,aAAS,QAAQ;AAAA,EACnB,GAAG,CAAC,iBAAiB,gBAAgB,CAAC;AAEtC,eAAa,CAAC,OAAO,QAAQ;AAC3B,QAAI,UAAU,UAAW;AACzB,QAAI,UAAU,qBAAqB,UAAU,mBAAoB;AAEjE,QAAI,UAAU,UAAU;AACtB,UAAI,IAAI,UAAU,UAAU,KAAK;AAC/B,iBAAS,UAAU;AACnB,qBAAa,IAAI;AACjB,aAAK,WAAW,MAAM,CAAC;AAAA,MACzB;AACA;AAAA,IACF;AAEA,QAAI,UAAU,aAAa;AACzB,UAAI,IAAI,QAAQ;AAAE,iBAAS,UAAU;AAAG;AAAA,MAAQ;AAEhD,UAAI,UAAU,OAAO,IAAI,WAAW;AAClC,kBAAU,CAAC,MAAM,KAAK,IAAI,IAAI,GAAG,gBAAgB,SAAS,CAAC,CAAC;AAC5D;AAAA,MACF;AACA,UAAI,UAAU,OAAO,IAAI,SAAS;AAChC,kBAAU,CAAC,MAAM,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC;AACnC;AAAA,MACF;AAEA,UAAI,UAAU,KAAK;AACjB;AAAA,UAAmB,CAAC,SAClB,KAAK,IAAI,CAAC,GAAG,MAAO,MAAM,SAAS,EAAE,GAAG,GAAG,YAAY,YAAY,IAAI,CAAE;AAAA,QAC3E;AACA;AAAA,MACF;AACA,UAAI,UAAU,KAAK;AACjB;AAAA,UAAmB,CAAC,SAClB,KAAK,IAAI,CAAC,GAAG,MAAO,MAAM,SAAS,EAAE,GAAG,GAAG,YAAY,aAAa,IAAI,CAAE;AAAA,QAC5E;AACA;AAAA,MACF;AAEA,UAAI,IAAI,QAAQ;AACd,cAAM,UAAU,gBAAgB,OAAO,CAAC,MAAM,EAAE,eAAe,SAAS;AACxE,YAAI,QAAQ,WAAW,EAAG,UAAS,kBAAkB;AACrD;AAAA,MACF;AAAA,IACF;AAGA,QAAI,UAAU,OAAO,UAAU,KAAK;AAClC,eAAS,iBAAiB;AAC1B;AAAA,IACF;AACA,SAAK,UAAU,OAAO,UAAU,QAAQ,UAAU,SAAS,GAAG;AAC5D,gBAAU,CAAC;AACX,eAAS,WAAW;AACpB;AAAA,IACF;AACA,SAAK,UAAU,OAAO,UAAU,QAAQ,YAAY,SAAS;AAC3D,eAAS,YAAY;AACrB;AAAA,IACF;AACA,QAAI,UAAU,OAAO,UAAU,KAAK;AAClC,WAAK,WAAW,MAAM,CAAC;AACvB;AAAA,IACF;AAAA,EACF,CAAC;AAED,MAAI,UAAU,mBAAmB;AAC/B,WACE,gBAAAN;AAAA,MAAC;AAAA;AAAA,QACC,SAAS,EAAE,kBAAkB;AAAA,QAC7B,WAAW,MAAM;AAAE,eAAK,cAAc;AAAA,QAAG;AAAA,QACzC,UAAU,MAAM;AAAE,mBAAS,UAAU;AAAA,QAAG;AAAA;AAAA,IAC1C;AAAA,EAEJ;AAEA,MAAI,UAAU,oBAAoB;AAChC,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,SAAS,EAAE,sBAAsB,EAAE,OAAO,OAAO,gBAAgB,MAAM,EAAE,CAAC;AAAA,QAC1E,WAAW,MAAM;AAAE,eAAK,uBAAuB;AAAA,QAAG;AAAA,QAClD,UAAU,MAAM;AAAE,mBAAS,WAAW;AAAA,QAAG;AAAA;AAAA,IAC3C;AAAA,EAEJ;AAEA,MAAI,UAAU,aAAa,SAAS;AAClC,WAAO,gBAAAA,MAAC,WAAQ,SAAS,EAAE,cAAc,GAAG;AAAA,EAC9C;AAEA,MAAI,UAAU,UAAU;AACtB,UAAM,UAAU,CAAC,EAAE,aAAa;AAChC,WACE,gBAAAC,OAACC,OAAA,EAAI,eAAc,UAAS,WAAW,QAAQ,IAC7C;AAAA,sBAAAF,MAAC,iBAAc,OAAM,aAAK,OAAO,EAAE,YAAY,GAAG,UAAU,UAAU,MAAM;AAAA,MAC5E,gBAAAA,MAACE,OAAA,EAAI,WAAW,QAAQ,IACtB,0BAAAF;AAAA,QAAC;AAAA;AAAA,UACC,QAAQ,UAAU,UAAU;AAAA,UAC5B,SACE,UACI,EAAE,cAAc,EAAE,OAAO,aAAa,SAAS,GAAG,CAAC,IACnD,EAAE,cAAc;AAAA;AAAA,MAExB,GACF;AAAA,MACA,gBAAAA,MAACE,OAAA,EAAI,WAAW,QAAQ,IACtB,0BAAAD,OAACE,QAAA,EAAK,OAAO,OAAO,eAAe;AAAA;AAAA,QAAG,EAAE,cAAc;AAAA,QAAE;AAAA,QAAO,EAAE,WAAW;AAAA,SAAE,GAChF;AAAA,OACF;AAAA,EAEJ;AAEA,SACE,gBAAAF,OAACC,OAAA,EAAI,eAAc,UACjB;AAAA,oBAAAF,MAAC,iBAAc,OAAM,aAAK,OAAO,EAAE,YAAY,GAAG,UAAU,UAAU,MAAM;AAAA,IAE3E,SAAS,UAAU,cAClB,gBAAAA,MAACE,OAAA,EAAI,WAAW,QAAQ,IACtB,0BAAAF,MAAC,gBAAa,QAAO,SAAQ,SAAS,EAAE,cAAc,EAAE,MAAM,CAAC,GAAG,GACpE;AAAA,IAGD,UAAU,cACT,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAW,MAAM,KAAK,cAAc;AAAA,QACpC,iBAAiB,MAAM;AAAE,oBAAU,CAAC;AAAG,mBAAS,WAAW;AAAA,QAAG;AAAA;AAAA,IAChE;AAAA,IAGD,UAAU,eACT,gBAAAC,OAACC,OAAA,EAAI,eAAc,UACjB;AAAA,sBAAAF,MAAC,iBAAc,OAAM,UAAI,OAAO,EAAE,wBAAwB,EAAE,OAAO,OAAO,gBAAgB,MAAM,EAAE,CAAC,GAAG,UAAU,UAAU,MAAM;AAAA,MAChI,gBAAAA,MAAC,iBAAc,SAAS,iBAAiB,QAAgB;AAAA,OAC3D;AAAA,KAEJ;AAEJ;;;AC1VA,SAAgB,eAAAO,cAAa,aAAAC,aAAW,UAAAC,UAAQ,YAAAC,kBAAgB;AAChE,SAAS,OAAAC,OAAK,QAAAC,cAAY;AAE1B,SAAS,aAAAC,kBAAiB;;;ACC1B,gBAAuB,oBACrB,YACA,OACwB;AACxB,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,sBAAsB;AAElD,MAAI,YAAY;AAChB,MAAI,WAAW;AACf,MAAI,UAAU;AAEd,aAAW,KAAK,YAAY;AAC1B,QAAI,EAAE,SAAS,WAAW;AAGxB,UAAI;AACF,4BAAoB,EAAE,WAAW;AAAA,MACnC,SAAS,KAAK;AACZ,cAAM,qBAAgB,EAAE,WAAW,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AACxF;AACA;AAAA,MACF;AACA,YAAM,cAAc,EAAE,WAAW;AACjC,UAAI;AACF,yBAAiB,QAAQ,WAAW,CAAC,WAAW,EAAE,WAAW,CAAC,GAAG;AAC/D,gBAAM;AAAA,QACR;AACA;AAAA,MACF,SAAS,KAAK;AACZ,cAAM,8BAAyB,EAAE,WAAW,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AACjG;AAAA,MACF;AAAA,IACF,WAAW,EAAE,SAAS,iBAAiB;AACrC,UAAI;AACF,4BAAoB,EAAE,WAAW;AAAA,MACnC,SAAS,KAAK;AACZ,cAAM,qBAAgB,EAAE,WAAW,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AACxF;AACA;AAAA,MACF;AACA,YAAM,aAAa,EAAE,WAAW,GAAG,EAAE,WAAW,OAAO,EAAE,QAAQ,MAAM,EAAE;AACzE,UAAI;AACF,yBAAiB,QAAQ,WAAW,CAAC,WAAW,EAAE,WAAW,CAAC,GAAG;AAC/D,gBAAM;AAAA,QACR;AACA;AAAA,MACF,SAAS,KAAK;AACZ,cAAM,8BAAyB,EAAE,WAAW,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AACjG;AAAA,MACF;AAAA,IACF,WAAW,EAAE,SAAS,aAAa;AACjC,YAAM,wCAAmC,EAAE,WAAW;AACtD;AAAA,IACF,WAAW,EAAE,SAAS,SAAS;AAC7B,YAAM,0CAAqC,EAAE,WAAW;AACxD;AAAA,IACF;AAAA,EACF;AAEA,QAAM,yBAAyB,SAAS,eAAe,QAAQ,cAAc,OAAO;AACtF;;;AD9CA,SAAS,QAAAC,aAAY;AAeb,SAkBF,OAAAC,OAlBE,QAAAC,cAAA;AARR,SAAS,gBAAgB,EAAE,OAAO,GAAiC;AACjE,QAAM,QACJ,OAAO,SAAS,KAAK,OAAO,UAAU,OAAO,SAAS,KAAK,OAAO,UAAU,OAAO;AACrF,QAAM,OAAO,KAAK,MAAM,OAAO,QAAQ,EAAE;AAEzC,SACE,gBAAAA,OAACC,OAAA,EAAI,eAAc,UAAS,cAAc,QAAQ,IAChD;AAAA,oBAAAD,OAACC,OAAA,EACC;AAAA,sBAAAD,OAACE,QAAA,EAAK,OAAe;AAAA,iBAAI,OAAO,IAAI;AAAA,QAAG,SAAI,OAAO,KAAK,IAAI;AAAA,SAAE;AAAA,MAC7D,gBAAAF,OAACE,QAAA,EAAK,OAAc,MAAI,MAAC;AAAA;AAAA,QAAE,OAAO;AAAA,QAAM;AAAA,SAAC;AAAA,MACzC,gBAAAF,OAACE,QAAA,EAAK,OAAO,OAAO,eAAe;AAAA;AAAA,QAAE,EAAE,oBAAoB,EAAE,OAAO,OAAO,OAAO,KAAK,EAAE,CAAC;AAAA,SAAE;AAAA,OAC9F;AAAA,IACA,gBAAAF,OAACE,QAAA,EAAK,OAAO,OAAO,OAAO,UAAQ,MAChC;AAAA,QAAE,0BAA0B,EAAE,MAAM,OAAO,WAAW,CAAC;AAAA,MAAE;AAAA,MAAI,EAAE,sBAAsB,EAAE,MAAM,OAAO,YAAY,CAAC;AAAA,OACpH;AAAA,KACF;AAEJ;AAEA,SAAS,cAAc,EAAE,UAAU,GAAuC;AACxE,QAAM,QAAQ,UAAU,aAAa,UAAU,OAAO,QAAQ,OAAO;AACrE,QAAM,SAAS,UAAU,aAAa,UAAU,WAAM;AAEtD,SACE,gBAAAF,OAACC,OAAA,EAAI,cAAc,QAAQ,MACzB;AAAA,oBAAAD,OAACE,QAAA,EAAK,OAAe;AAAA;AAAA,MAAO;AAAA,OAAC;AAAA,IAC7B,gBAAAH,MAACG,QAAA,EAAK,OAAc,MAAK,QAAQ,oBAAU,QAAO;AAAA,KACpD;AAEJ;AAEA,SAAS,cAAc,EAAE,WAAW,GAA0C;AAC5E,QAAM,SAAS,WAAW,OAAO,CAAC,MAAM,EAAE,aAAa,OAAO;AAC9D,QAAM,WAAW,WAAW,OAAO,CAAC,MAAM,EAAE,aAAa,SAAS;AAElE,QAAM,YAAY,eAAe;AAAA,IAC/B,cAAc;AAAA,IACd,sBAAsB;AAAA,IACtB,SAAS;AAAA,EACX,CAAC;AAED,QAAM,QAAQ,OAAO,SAAS,SAAS;AACvC,QAAM,cAAc,UAAU,IAC1B,IACA,KAAK,IAAI,OAAO,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAO,OAAO,SAAS,QAAS,SAAS,CAAC,CAAC;AACxF,QAAM,gBAAgB,KAAK,IAAI,GAAG,YAAY,WAAW;AACzD,QAAM,gBAAgB,OAAO,MAAM,GAAG,WAAW;AACjD,QAAM,kBAAkB,SAAS,MAAM,GAAG,aAAa;AACvD,QAAM,eAAe,OAAO,SAAS,cAAc;AACnD,QAAM,iBAAiB,SAAS,SAAS,gBAAgB;AAEzD,SACE,gBAAAF,OAACC,OAAA,EAAI,eAAc,UAAS,WAAW,QAAQ,IAC5C;AAAA,WAAO,SAAS,KACf,gBAAAD,OAACC,OAAA,EAAI,eAAc,UAAS,cAAc,QAAQ,IAChD;AAAA,sBAAAD,OAACE,QAAA,EAAK,OAAO,OAAO,OAAO,MAAI,MAAE;AAAA,UAAE,yBAAyB,EAAE,OAAO,OAAO,OAAO,MAAM,EAAE,CAAC;AAAA,QAAE;AAAA,SAAS;AAAA,MACtG,cAAc,IAAI,CAAC,MAClB,gBAAAH,MAAC,iBAAiD,WAAW,KAAzC,GAAG,EAAE,IAAI,IAAI,EAAE,WAAW,EAAkB,CACjE;AAAA,MACA,eAAe,KACd,gBAAAC,OAACE,QAAA,EAAK,OAAO,OAAO,eAAe,UAAQ,MAAC;AAAA;AAAA,QAAG,EAAE,oBAAoB,EAAE,OAAO,aAAa,CAAC;AAAA,SAAE;AAAA,OAElG;AAAA,IAED,SAAS,SAAS,KACjB,gBAAAF,OAACC,OAAA,EAAI,eAAc,UACjB;AAAA,sBAAAD,OAACE,QAAA,EAAK,OAAO,OAAO,SAAS,MAAI,MAAE;AAAA,UAAE,yBAAyB,EAAE,OAAO,OAAO,SAAS,MAAM,EAAE,CAAC;AAAA,QAAE;AAAA,SAAW;AAAA,MAC5G,gBAAgB,IAAI,CAAC,MACpB,gBAAAH,MAAC,iBAAiD,WAAW,KAAzC,GAAG,EAAE,IAAI,IAAI,EAAE,WAAW,EAAkB,CACjE;AAAA,MACA,iBAAiB,KAChB,gBAAAC,OAACE,QAAA,EAAK,OAAO,OAAO,eAAe,UAAQ,MAAC;AAAA;AAAA,QAAG,EAAE,oBAAoB,EAAE,OAAO,eAAe,CAAC;AAAA,SAAE;AAAA,OAEpG;AAAA,KAEJ;AAEJ;AAEO,SAAS,iBAAiB;AAC/B,QAAM,QAAQ,gBAAgB,CAAC,MAAM,EAAE,KAAK;AAC5C,QAAM,EAAE,QAAQ,QAAQ,SAAS,OAAO,cAAc,SAAS,IAC7D,mBAAmB;AAErB,QAAM,CAAC,OAAO,QAAQ,IAAIC,WAAgB,UAAU;AACpD,QAAM,CAAC,eAAe,gBAAgB,IAAIA,WAA+C,IAAI;AAC7F,QAAM,CAAC,aAAa,cAAc,IAAIA,WAAmB,CAAC,CAAC;AAC3D,QAAM,CAAC,eAAe,gBAAgB,IAAIA,WAAS,KAAK;AACxD,QAAM,eAAeC,SAAsC,IAAI;AAC/D,QAAM,aAAaA,SAAO,IAAI;AAE9B,EAAAC,YAAU,MAAM;AACd,eAAW,UAAU;AACrB,WAAO,MAAM;AACX,iBAAW,UAAU;AACrB,WAAK,aAAa,SAAS,OAAO,MAAS;AAAA,IAC7C;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,qBAAqBC;AAAA,IACzB,OAAO,aAAqB;AAC1B,UAAI,CAAC,SAAS,KAAK,GAAG;AAAE,iBAAS,UAAU;AAAG;AAAA,MAAQ;AACtD,YAAM,aAAa,SAAS,KAAK,GAAG,MAAM,CAAC;AAE3C,YAAM,QAAQ,mBAAmB,SAAS;AAC1C,UAAI,CAAC,MAAM,SAAS,MAAM,QAAQ;AAChC,cAAM,SAAS,MAAM,CAAC;AAAA,MACxB;AACA,eAAS,UAAU;AAAA,IACrB;AAAA,IACA,CAAC,OAAO,cAAc,QAAQ;AAAA,EAChC;AAEA,QAAM,gBAAgBA,aAAY,MAAM;AACtC,SAAK,SAAS,MAAM,CAAC;AAAA,EACvB,GAAG,CAAC,OAAO,QAAQ,CAAC;AAEpB,QAAM,eAAeA,aAAY,YAAY;AAC3C,QAAI,CAAC,OAAQ;AACb,UAAM,aAAY,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,SAAS,GAAG;AAC/D,UAAM,aAAaC,MAAK,UAAU,qBAAqB,SAAS,OAAO;AACvE,QAAI;AACF,YAAM,aAAa,QAAQ,UAAU;AACrC,uBAAiB,EAAE,IAAI,MAAM,MAAM,EAAE,0BAA0B,EAAE,MAAM,WAAW,CAAC,EAAE,CAAC;AACtF,eAAS,QAAQ;AAAA,IACnB,SAAS,KAAK;AACZ,uBAAiB;AAAA,QACf,IAAI;AAAA,QACJ,MAAM,EAAE,8BAA8B,EAAE,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE,CAAC;AAAA,MACnG,CAAC;AACD,eAAS,QAAQ;AAAA,IACnB;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,kBAAkBD,aAAY,YAAY;AAC9C,QAAI,CAAC,OAAQ;AACb,UAAM,aAAa,OAAO,WAAW;AAAA,MACnC,CAAC,MAAM,EAAE,SAAS,aAAa,EAAE,SAAS;AAAA,IAC5C;AACA,QAAI,WAAW,WAAW,EAAG;AAE7B,aAAS,aAAa;AACtB,mBAAe,CAAC,CAAC;AACjB,qBAAiB,IAAI;AAErB,UAAM,MAAM,oBAAoB,YAAY,MAAM,CAAC;AACnD,iBAAa,UAAU;AAEvB,QAAI;AACF,uBAAiB,QAAQ,KAAK;AAC5B,YAAI,CAAC,WAAW,QAAS;AACzB,uBAAe,CAAC,SAAS,CAAC,GAAG,KAAK,MAAM,GAAG,GAAG,IAAI,CAAC;AAAA,MACrD;AACA,UAAI,WAAW,SAAS;AACtB,yBAAiB,EAAE,IAAI,MAAM,MAAM,EAAE,8BAA8B,EAAE,CAAC;AAEtE,cAAM,SAAS,MAAM,CAAC;AAAA,MACxB;AAAA,IACF,SAAS,KAAK;AACZ,UAAI,WAAW,SAAS;AACtB,yBAAiB;AAAA,UACf,IAAI;AAAA,UACJ,MAAM,EAAE,8BAA8B,EAAE,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE,CAAC;AAAA,QACnG,CAAC;AAAA,MACH;AAAA,IACF,UAAE;AACA,mBAAa,UAAU;AACvB,UAAI,WAAW,SAAS;AACtB,yBAAiB,KAAK;AACtB,iBAAS,QAAQ;AAAA,MACnB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,QAAQ,OAAO,QAAQ,CAAC;AAE5B,eAAa,CAAC,OAAO,QAAQ;AAC3B,QAAI,UAAU,iBAAiB,UAAU,YAAa;AACtD,QAAI,UAAU,uBAAwB;AAEtC,QAAI,UAAU,UAAU;AACtB,UAAI,IAAI,UAAU,UAAU,KAAK;AAC/B,iBAAS,UAAU;AACnB,yBAAiB,IAAI;AAAA,MACvB;AACA;AAAA,IACF;AAGA,QAAI,UAAU,OAAO,UAAU,KAAK;AAClC,eAAS,WAAW;AACpB;AAAA,IACF;AACA,SAAK,UAAU,OAAO,UAAU,QAAQ,QAAQ;AAC9C,oBAAc;AACd;AAAA,IACF;AACA,SAAK,UAAU,OAAO,UAAU,QAAQ,QAAQ;AAC9C,WAAK,aAAa;AAClB;AAAA,IACF;AACA,SAAK,UAAU,OAAO,UAAU,QAAQ,QAAQ;AAC9C,YAAM,aAAa,OAAO,WAAW;AAAA,QACnC,CAAC,MAAM,EAAE,SAAS,aAAa,EAAE,SAAS;AAAA,MAC5C;AACA,UAAI,WAAW,SAAS,GAAG;AACzB,iBAAS,sBAAsB;AAAA,MACjC;AACA;AAAA,IACF;AAAA,EACF,CAAC;AAED,MAAI,UAAU,0BAA0B,QAAQ;AAC9C,UAAM,aAAa,OAAO,WAAW;AAAA,MACnC,CAAC,MAAM,EAAE,SAAS,aAAa,EAAE,SAAS;AAAA,IAC5C;AACA,WACE,gBAAAP;AAAA,MAAC;AAAA;AAAA,QACC,SAAS,EAAE,gCAAgC,EAAE,OAAO,OAAO,WAAW,MAAM,EAAE,CAAC;AAAA,QAC/E,WAAW,MAAM;AAAE,eAAK,gBAAgB;AAAA,QAAG;AAAA,QAC3C,UAAU,MAAM;AAAE,mBAAS,UAAU;AAAA,QAAG;AAAA;AAAA,IAC1C;AAAA,EAEJ;AAEA,MAAI,UAAU,iBAAkB,WAAW,UAAU,aAAc;AACjE,QAAI,UAAU,eAAe;AAC3B,aACE,gBAAAC,OAACC,OAAA,EAAI,eAAc,UACjB;AAAA,wBAAAF,MAAC,iBAAc,OAAM,aAAK,OAAO,EAAE,kBAAkB,GAAG,UAAU,UAAU,MAAM;AAAA,QAClF,gBAAAA,MAACE,OAAA,EAAI,WAAW,QAAQ,IACtB,0BAAAF,MAAC,eAAY,OAAO,aAAa,WAAW,eAAe,OAAO,EAAE,wBAAwB,GAAG,GACjG;AAAA,SACF;AAAA,IAEJ;AACA,WAAO,gBAAAA,MAAC,WAAQ,SAAS,EAAE,kBAAkB,GAAG;AAAA,EAClD;AAEA,MAAI,UAAU,YAAY,eAAe;AACvC,WACE,gBAAAC,OAACC,OAAA,EAAI,eAAc,UAAS,WAAW,QAAQ,IAC7C;AAAA,sBAAAF,MAAC,iBAAc,OAAM,aAAK,OAAO,EAAE,kBAAkB,GAAG,UAAU,UAAU,MAAM;AAAA,MAClF,gBAAAA,MAACE,OAAA,EAAI,WAAW,QAAQ,IACtB,0BAAAF;AAAA,QAAC;AAAA;AAAA,UACC,QAAQ,cAAc,KAAK,YAAY;AAAA,UACvC,SAAS,cAAc;AAAA;AAAA,MACzB,GACF;AAAA,MACA,gBAAAA,MAACE,OAAA,EAAI,WAAW,QAAQ,IACtB,0BAAAD,OAACE,QAAA,EAAK,OAAO,OAAO,eAAe;AAAA;AAAA,QAAG,EAAE,cAAc;AAAA,QAAE;AAAA,QAAO,EAAE,WAAW;AAAA,SAAE,GAChF;AAAA,OACF;AAAA,EAEJ;AAEA,SACE,gBAAAF,OAACC,OAAA,EAAI,eAAc,UACjB;AAAA,oBAAAF,MAAC,iBAAc,OAAM,aAAK,OAAO,EAAE,kBAAkB,GAAG,UAAU,UAAU,MAAM;AAAA,IAEjF,SACC,gBAAAA,MAACE,OAAA,EAAI,WAAW,QAAQ,IACtB,0BAAAF,MAAC,gBAAa,QAAO,SAAQ,SAAS,EAAE,2BAA2B,EAAE,MAAM,CAAC,GAAG,GACjF;AAAA,IAGD,UAAU,eACT,gBAAAC,OAACC,OAAA,EAAI,WAAW,QAAQ,IAAI,eAAc,UACxC;AAAA,sBAAAF,MAACG,QAAA,EAAK,OAAO,OAAO,eAAgB,YAAE,0BAA0B,GAAE;AAAA,MAClE,gBAAAH,MAACE,OAAA,EAAI,WAAW,QAAQ,IACtB,0BAAAF;AAAA,QAACS;AAAA,QAAA;AAAA,UACC,cAAa;AAAA,UACb,UAAU,CAAC,QAAQ;AAAE,iBAAK,mBAAmB,GAAG;AAAA,UAAG;AAAA;AAAA,MACrD,GACF;AAAA,MACA,gBAAAT,MAACE,OAAA,EAAI,WAAW,QAAQ,IACtB,0BAAAD,OAACE,QAAA,EAAK,OAAO,OAAO,OAAO,UAAQ,MAAC;AAAA;AAAA,QAAK,EAAE,WAAW;AAAA,SAAE,GAC1D;AAAA,OACF;AAAA,IAGD,UAAU,cACT,gBAAAF,OAACC,OAAA,EAAI,eAAc,UAAS,WAAW,QAAQ,IAC5C;AAAA,OAAC,SACA,gBAAAF,MAACE,OAAA,EAAI,eAAc,UACjB,0BAAAF,MAACG,QAAA,EAAK,OAAO,OAAO,eAAgB,YAAE,sBAAsB,GAAE,GAChE,IAEA,gBAAAF,OAACC,OAAA,EAAI,eAAc,UACjB;AAAA,wBAAAF,MAACG,QAAA,EAAK,OAAO,OAAO,eAAe,MAAI,MACpC,YAAE,wBAAwB,EAAE,YAAY,OAAO,KAAK,WAAW,CAAC,GACnE;AAAA,QAEC,SACC,gBAAAF,OAACC,OAAA,EAAI,eAAc,UAAS,WAAW,QAAQ,IAC7C;AAAA,0BAAAF,MAAC,mBAAgB,QAAgB;AAAA,UAChC,OAAO,YACN,gBAAAA,MAAC,gBAAa,QAAO,WAAU,SAAS,EAAE,eAAe,GAAG,IAE5D,gBAAAA,MAAC,iBAAc,YAAY,OAAO,YAAY;AAAA,WAElD,IAEA,gBAAAA,MAACE,OAAA,EAAI,WAAW,QAAQ,IACtB,0BAAAF,MAACG,QAAA,EAAK,OAAO,OAAO,OAAO,UAAQ,MAAE,YAAE,yBAAyB,GAAE,GACpE;AAAA,SAEJ;AAAA,MAGF,gBAAAH,MAACE,OAAA,EAAI,WAAW,QAAQ,IAAI,UAAS,QACnC,0BAAAD,OAACE,QAAA,EAAK,OAAO,OAAO,eAAe;AAAA;AAAA,QAC9B,EAAE,aAAa;AAAA,QACjB,UAAU,gBAAAF,OAACE,QAAA,EAAK;AAAA;AAAA,UAAK,EAAE,WAAW;AAAA,WAAE;AAAA,QACpC,UAAU,gBAAAF,OAACE,QAAA,EAAK;AAAA;AAAA,UAAK,EAAE,aAAa;AAAA,WAAE;AAAA,QACtC,UAAU,OAAO,WAAW,KAAK,CAAC,MAAM,EAAE,SAAS,aAAa,EAAE,SAAS,eAAe,KACzF,gBAAAF,OAACE,QAAA,EAAK;AAAA;AAAA,UAAK,EAAE,YAAY;AAAA,WAAE;AAAA,QAE5B;AAAA,QAAQ,EAAE,WAAW;AAAA,SACxB,GACF;AAAA,OACF;AAAA,KAEJ;AAEJ;;;A1EjTW,SA8CW,YAAAO,WA9CX,OAAAC,OA0DP,QAAAC,cA1DO;AAbX,SAAS,qBAAqB;AAC5B,QAAM,cAAc,gBAAgB,CAAC,MAAM,EAAE,UAAU;AACvD,EAAAC,YAAU,MAAM;AAAE,gBAAY;AAAA,EAAG,GAAG,CAAC,CAAC;AACtC,SAAO;AACT;AAGA,SAAS,WAAW,EAAE,YAAY,GAA4B;AAC5D,QAAM,QAAQ,gBAAgB,CAAC,MAAM,EAAE,KAAK;AAC5C,QAAM,SAAS,gBAAgB,CAAC,MAAM,EAAE,MAAM;AAG9C,MAAI,UAAU,WAAW,KAAK,CAAC,MAAM,GAAG;AACtC,WAAO,gBAAAF,MAAC,iBAAc,QAAQ,aAAa;AAAA,EAC7C;AAGA,MAAI,WAAW,WAAW,KAAK,CAAC,OAAO,GAAG;AACxC,WAAO,gBAAAA,MAAC,iBAAc,QAAQ,aAAa;AAAA,EAC7C;AAEA,UAAQ,aAAa;AAAA,IACnB,KAAK;AAAa,aAAO,gBAAAA,MAAC,iBAAc;AAAA,IACxC,KAAK;AAAa,aAAO,gBAAAA,MAAC,iBAAc;AAAA,IACxC,KAAK;AAAU,aAAO,gBAAAA,MAAC,cAAW;AAAA,IAClC,KAAK;AAAY,aAAO,gBAAAA,MAAC,gBAAa;AAAA,IACtC,KAAK;AAAgB,aAAO,gBAAAA,MAAC,mBAAgB;AAAA,IAC7C,KAAK;AAAY,aAAO,gBAAAA,MAAC,gBAAa;AAAA,IACtC,KAAK;AAAU,aAAO,gBAAAA,MAAC,cAAW;AAAA,IAClC,KAAK;AAAY,aAAO,gBAAAA,MAAC,gBAAa;AAAA,IACtC,KAAK;AAAiB,aAAO,gBAAAA,MAAC,oBAAiB;AAAA,IAC/C,KAAK;AAAW,aAAO,gBAAAA,MAAC,eAAY;AAAA,IACpC,KAAK;AAAY,aAAO,gBAAAA,MAAC,gBAAa;AAAA,IACtC,KAAK;AAAY,aAAO,gBAAAA,MAAC,gBAAa;AAAA,IACtC,KAAK;AAAQ,aAAO,gBAAAA,MAAC,YAAS;AAAA,IAC9B,KAAK;AAAkB,aAAO,gBAAAA,MAAC,qBAAkB;AAAA,IACjD,KAAK;AAAc,aAAO,gBAAAA,MAAC,kBAAe;AAAA,IAC1C,KAAK;AAAW,aAAO,gBAAAA,MAAC,eAAY;AAAA,EACtC;AACF;AAEO,SAAS,MAAM;AACpB,QAAM,EAAE,KAAK,IAAI,OAAO;AACxB,QAAM,cAAc,mBAAmB,CAAC,MAAM,EAAE,WAAW;AAM3D,QAAM,YAAY,OAAO,YAAY,eAAe;AACpD,QAAM,CAAC,aAAa,cAAc,IAAIG,WAAyB,YAAY,QAAQ,IAAI;AACvF,EAAAD,YAAU,MAAM;AACd,QAAI,UAAW;AACf,SAAK,uBAAuB,EAAE,KAAK,CAAC,SAAS,eAAe,CAAC,IAAI,CAAC;AAAA,EACpE,GAAG,CAAC,CAAC;AAEL,oBAAkB,EAAE,QAAQ,KAAK,CAAC;AAElC,MAAI,gBAAgB,MAAM;AACxB,WAAO,gBAAAF,MAAC,aAAU,0BAAAA,MAAAD,WAAA,EAAE,GAAG;AAAA,EACzB;AAEA,MAAI,aAAa;AACf,WACE,gBAAAC,MAAC,aACC,0BAAAA,MAAC,eAAY,YAAY,MAAM,eAAe,KAAK,GAAG,GACxD;AAAA,EAEJ;AAEA,SACE,gBAAAC,OAAC,aACC;AAAA,oBAAAD,MAAC,sBAAmB;AAAA,IACpB,gBAAAA,MAAC,cAAW,aAA0B;AAAA,KACxC;AAEJ;;;A4EzGA,SAAS,YAAAI,iBAAgB;AACzB,SAAS,SAAS,UAAU,SAAS,YAAY;AACjD,SAAS,QAAAC,aAAY;AAQrB,IAAM,eAAe;AACrB,IAAM,YAAY;AAClB,IAAM,cAAcC,MAAK,QAAQ,GAAG,aAAa,qBAAqB;AACtE,IAAM,kBAAkB;AAsBxB,IAAI,aAAa;AAEjB,eAAe,qBAAmD;AAChE,MAAI;AACF,UAAM,MAAM,MAAMC,UAAS,aAAa,OAAO;AAC/C,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,WAAO;AAAA,MACL,UAAU,OAAO,OAAO,aAAa,WAAW,OAAO,WAAW;AAAA,MAClE,OAAO,OAAO,OAAO,UAAU,WAAW,OAAO,QAAQ;AAAA,MACzD,SAAS,OAAO,YAAY;AAAA,IAC9B;AAAA,EACF,QAAQ;AACN,WAAO,EAAE,UAAU,MAAM,OAAO,MAAM,SAAS,MAAM;AAAA,EACvD;AACF;AAEA,eAAe,gBAA8C;AAC3D,QAAM,cAAc,QAAQ,IAAI,YAAY,GAAG,KAAK;AACpD,QAAM,WAAW,QAAQ,IAAI,SAAS,GAAG,KAAK;AAC9C,MAAI,aAAa;AACf,WAAO,EAAE,UAAU,aAAa,OAAO,YAAY,MAAM,SAAS,KAAK;AAAA,EACzE;AACA,SAAO,mBAAmB;AAC5B;AAEA,SAAS,eAAe,KAAsB;AAC5C,MAAI;AACF,UAAM,SAAS,IAAI,IAAI,GAAG;AAC1B,QAAI,OAAO,aAAa,SAAU,QAAO;AAEzC,QAAI,OAAO,aAAa,SAAS;AAC/B,YAAM,OAAO,OAAO;AACpB,aAAO,mFAAmF,KAAK,IAAI;AAAA,IACrG;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,WAAW,QAAqB,QAA4C;AACzF,MAAI,CAAC,OAAO,YAAY,CAAC,eAAe,OAAO,QAAQ,EAAG;AAC1D,MAAI;AACF,UAAM,MAAM,OAAO,UAAU;AAAA,MAC3B,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,GAAI,OAAO,QAAQ,EAAE,iBAAiB,UAAU,OAAO,KAAK,GAAG,IAAI,CAAC;AAAA,MACtE;AAAA,MACA,MAAM,KAAK,UAAU,MAAM;AAAA,MAC3B,QAAQ,YAAY,QAAQ,eAAe;AAAA,IAC7C,CAAC;AAAA,EACH,SAAS,KAAK;AAEZ,WAAO,KAAK,+BAA+B,EAAE,OAAO,OAAO,GAAG,EAAE,CAAC;AAAA,EACnE;AACF;AAEA,SAAS,YAAY,OAA0B,KAAc,SAAkC,WAAmB,SAA8B;AAC9I,QAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,QAAM,QAAQ,eAAe,SAAS,OAAO,IAAI,UAAU,WAAW,IAAI,QAAQ;AAClF,SAAO;AAAA,IACL,KAAK;AAAA,IACL;AAAA,IACA,UAAU,SAAS;AAAA,IACnB,IAAI,QAAQ;AAAA,IACZ,MAAM,KAAK;AAAA,IACX;AAAA,IACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAKA,eAAsB,YAAY,KAAc,UAAmC,CAAC,GAAkB;AACpG,QAAM,SAAS,MAAM,cAAc;AACnC,MAAI,CAAC,OAAO,WAAW,CAAC,OAAO,SAAU;AACzC,QAAM,YAAY,MAAM,aAAa;AACrC,QAAM,UAAU,OAA8C,UAA0B;AACxF,QAAM,WAAW,YAAY,SAAS,KAAK,SAAS,WAAW,OAAO,GAAG,MAAM;AACjF;AAMA,eAAsB,uBAAsC;AAC1D,MAAI,WAAY;AAChB,QAAM,SAAS,MAAM,cAAc;AACnC,MAAI,CAAC,OAAO,WAAW,CAAC,OAAO,SAAU;AACzC,eAAa;AAEb,QAAM,YAAY,MAAM,aAAa;AACrC,QAAM,UAAU,OAA8C,UAA0B;AAExF,UAAQ,GAAG,qBAAqB,CAAC,QAAQ;AACvC,SAAK,WAAW,YAAY,SAAS,KAAK,EAAE,MAAM,oBAAoB,GAAG,WAAW,OAAO,GAAG,MAAM;AAAA,EACtG,CAAC;AAED,UAAQ,GAAG,sBAAsB,CAAC,WAAW;AAC3C,SAAK,WAAW,YAAY,SAAS,QAAQ,EAAE,MAAM,qBAAqB,GAAG,WAAW,OAAO,GAAG,MAAM;AAAA,EAC1G,CAAC;AAED,SAAO,KAAK,2BAA2B,EAAE,UAAU,OAAO,SAAS,CAAC;AACtE;;;A7EsFS,gBAAAC,aAAA;AA1NT,IAAM,CAAC,EAAC,EAAE,SAAS,GAAG,IAAI,QAAQ;AAElC,eAAe,SAAS;AAGtB,MAAI,YAAY,eAAe,YAAY,QAAQ,YAAY,WAAW;AACxE,YAAQ,OAAO,MAAO,SAA0C;AAChE;AAAA,EACF;AAEA,QAAM,eAAe;AACrB,QAAM,qBAAqB;AAE3B,MAAI,YAAY,YAAY;AAC1B,UAAM,MAAM,KAAK,KAAK,KAAK;AAC3B,QAAI,CAAC,KAAK;AACR,cAAQ,MAAM,EAAE,mBAAmB,CAAC;AACpC,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,QAAI;AACF,YAAM,UAAU,MAAM,SAAS,GAAG;AAClC,cAAQ,IAAI,EAAE,iBAAiB,EAAE,OAAO,QAAQ,cAAc,CAAC,CAAC;AAChE,cAAQ,IAAI,EAAE,aAAa,CAAC;AAC5B,UAAI,QAAQ,WAAW;AACrB,gBAAQ,IAAI,EAAE,eAAe,EAAE,MAAM,WAAW,QAAQ,SAAS,EAAE,CAAC,CAAC;AAAA,MACvE;AAAA,IACF,SAAS,KAAK;AACZ,cAAQ,MAAM,EAAE,wBAAwB,EAAE,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE,CAAC,CAAC;AACpG,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA;AAAA,EACF;AAEA,MAAI,YAAY,cAAc;AAC5B,UAAM,UAAU,MAAM,YAAY;AAClC,QAAI,CAAC,SAAS;AACZ,cAAQ,IAAI,EAAE,eAAe,CAAC;AAC9B;AAAA,IACF;AACA,UAAM,KAAK,gBAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AAC3E,UAAM,SAAS,MAAM,GAAG,SAAS,EAAE,uBAAuB,CAAC;AAC3D,OAAG,MAAM;AACT,QAAI,OAAO,YAAY,MAAM,OAAO,OAAO,YAAY,MAAM,KAAK;AAChE,cAAQ,IAAI,EAAE,yBAAyB,CAAC;AACxC;AAAA,IACF;AACA,UAAM,EAAE,cAAc,IAAI,MAAM,WAAW,OAAO;AAClD,YAAQ,IAAI,EAAE,iBAAiB,CAAC;AAChC,QAAI,CAAC,eAAe;AAClB,cAAQ,KAAK,EAAE,4BAA4B,CAAC;AAAA,IAC9C;AACA;AAAA,EACF;AAEA,MAAI,YAAY,cAAc;AAC5B,UAAM,UAAU,MAAM,YAAY;AAClC,QAAI,CAAC,SAAS;AACZ,cAAQ,IAAI,EAAE,eAAe,CAAC;AAC9B,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,SAAS,MAAM,WAAW,OAAO;AACvC,QAAI,WAAW,WAAW;AACxB,cAAQ,MAAM,EAAE,sBAAsB,CAAC;AACvC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,UAAU,MAAM,YAAY;AAClC,QAAI,WAAW,SAAS;AACtB,cAAQ,KAAK,EAAE,qBAAqB,CAAC;AAAA,IACvC,OAAO;AACL,cAAQ,IAAI,EAAE,iBAAiB,CAAC;AAAA,IAClC;AACA,QAAI,SAAS,WAAW;AACtB,cAAQ,IAAI,EAAE,eAAe,EAAE,MAAM,WAAW,QAAQ,SAAS,EAAE,CAAC,CAAC;AAAA,IACvE;AACA;AAAA,EACF;AAEA,MAAI,YAAY,UAAU;AACxB,UAAM,gBAAgB,SAAS,EAAE,WAAW;AAC5C,UAAM,EAAE,QAAQ,SAAS,YAAY,IAAI,gBAAgB,SAAS;AAClE,UAAM,QAAQ,gBAAgB,SAAS,EAAE,MAAM;AAE/C,QAAI,WAAW,QAAQ;AACrB,cAAQ,IAAI,EAAE,cAAc,CAAC;AAC7B,cAAQ,IAAI,EAAE,iBAAiB,CAAC;AAAA,IAClC,OAAO;AACL,YAAM,YAAY,WAAW,YAAY,EAAE,iBAAiB,IAAI,EAAE,aAAa;AAC/E,cAAQ,IAAI,SAAS;AACrB,UAAI,SAAS;AACX,gBAAQ,IAAI,EAAE,aAAa,EAAE,OAAO,QAAQ,cAAc,CAAC,CAAC;AAAA,MAC9D;AAEA,YAAM,aAAa,WAAW,QACzB,gBAAgB,SAAU,SAAS,UAAU,WAAY,cAC1D;AACJ,cAAQ,IAAI,EAAE,cAAc,EAAE,QAAQ,WAAW,CAAC,CAAC;AAEnD,UAAI,SAAS,WAAW;AACtB,gBAAQ,IAAI,EAAE,eAAe,EAAE,MAAM,WAAW,QAAQ,SAAS,EAAE,CAAC,CAAC;AAAA,MACvE;AACA,UAAI,WAAW,WAAW;AACxB,gBAAQ,IAAI,EAAE,oBAAoB,CAAC;AAAA,MACrC;AACA,UAAI,WAAW,SAAS,gBAAgB,UAAU,SAAS;AACzD,cAAM,OAAO,KAAK,OAAO,KAAK,IAAI,IAAI,IAAI,KAAK,QAAQ,eAAe,EAAE,QAAQ,MAAM,KAAK,KAAK,KAAK,IAAK;AAC1G,gBAAQ,IAAI,EAAE,0BAA0B,EAAE,KAAK,CAAC,CAAC;AACjD,gBAAQ,IAAI,EAAE,oBAAoB,CAAC;AAAA,MACrC;AAAA,IACF;AAGA,QAAI,OAAO;AAET,UAAI;AACF,cAAM,EAAE,eAAAC,eAAc,IAAI,MAAM,OAAO,wBAAkC;AACzE,cAAM,YAAY,MAAMA,eAAc;AACtC,YAAI,UAAU,SAAS,GAAG;AACxB,gBAAM,SAAS,UAAU,CAAC;AAC1B,kBAAQ,IAAI;AAAA,aAAgB,UAAU,MAAM,aAAa,SAAS,WAAW,OAAO,UAAU,IAAI,QAAG,GAAG;AAAA,QAC1G,OAAO;AACL,kBAAQ,IAAI,mBAAmB;AAAA,QACjC;AAAA,MACF,QAAQ;AAAA,MAER;AAGA,UAAI;AACF,cAAM,EAAE,cAAAC,eAAc,cAAAC,cAAa,IAAI,MAAM,OAAO,gCAAoC;AACxF,cAAM,SAAS,MAAMD,cAAa;AAClC,YAAI,QAAQ;AACV,gBAAM,QAAQ,MAAMC,cAAa,MAAM;AACvC,kBAAQ,IAAI,aAAa,MAAM,KAAK,gBAAgB,MAAM,gBAAgB,MAAM,aAAa,MAAM,cAAc,MAAM,SAAS;AAAA,QAClI;AAAA,MACF,QAAQ;AAAA,MAER;AAGA,UAAI;AACF,cAAM,EAAE,gBAAAC,gBAAe,IAAI,MAAM,OAAO,2BAA2B;AACnE,cAAM,aAAa,MAAMA,gBAAe;AACxC,YAAI,YAAY,UAAU;AACxB,kBAAQ,IAAI,mBAAmB,WAAW,WAAW,QAAQ,CAAC,EAAE;AAAA,QAClE;AAAA,MACF,QAAQ;AAAA,MAER;AAGA,UAAI;AACF,cAAM,EAAE,YAAAC,YAAW,IAAI,MAAM,OAAO,yBAA+B;AACnE,cAAM,EAAE,iBAAAC,iBAAgB,IAAI,MAAM,OAAO,kCAAwC;AAEjF,cAAM,SAAS,MAAMD,YAAW,GAAG,QAAQ,IAAI,MAAM,KAAK,GAAG,wBAAwB,EAAE,MAAM,MAAM,IAAI;AACvG,YAAI,QAAQ;AACV,gBAAM,SAAS,MAAMC,iBAAgB,QAAQ,IAAI;AACjD,kBAAQ,IAAI,eAAe,OAAO,KAAK,MAAM,OAAO,WAAW,MAAM,gBAAgB;AAAA,QACvF;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAEA;AAAA,EACF;AAEA,MAAI,YAAY,mBAAmB;AACjC,UAAM,gBAAgB,SAAS,EAAE,WAAW;AAC5C,UAAM,QAAQ,gBAAgB,SAAS,EAAE,MAAM;AAC/C,UAAM,EAAE,eAAe,IAAI,MAAM,OAAO,iCAA4B;AACpE,QAAI;AACF,cAAQ,IAAI,EAAE,uBAAuB,CAAC;AACtC,YAAM,eAAe,OAAO,QAAQ,SAAS;AAC7C,cAAQ,IAAI,EAAE,sBAAsB,CAAC;AAAA,IACvC,SAAS,KAAK;AACZ,cAAQ,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAC9D,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA;AAAA,EACF;AAEA,MAAI,YAAY,qBAAqB;AACnC,UAAM,EAAE,iBAAiB,IAAI,MAAM,OAAO,iCAA4B;AACtE,QAAI;AACF,YAAM,iBAAiB;AACvB,cAAQ,IAAI,EAAE,wBAAwB,CAAC;AAAA,IACzC,SAAS,KAAK;AACZ,cAAQ,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAC9D,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA;AAAA,EACF;AAGA,MAAI,YAAY,kBAAkB;AAChC,UAAM,KAAK,gBAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AAC3E,UAAM,SAAS,MAAM,GAAG,SAAS,EAAE,wBAAwB,IAAI,UAAU;AACzE,OAAG,MAAM;AACT,QAAI,OAAO,YAAY,MAAM,OAAO,OAAO,YAAY,MAAM,KAAK;AAChE,cAAQ,IAAI,EAAE,yBAAyB,CAAC;AACxC;AAAA,IACF;AACA,UAAMC,IAAG,UAAU,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AACnD,YAAQ,IAAI,EAAE,wBAAwB,CAAC;AACvC;AAAA,EACF;AAIA,QAAM,qBAAqB;AAI3B,UAAQ,IAAI,oBAAoB;AAChC,UAAQ,OAAO,MAAM,sBAAsB;AAC3C,SAAO,gBAAAP,MAAC,OAAI,CAAE;AAChB;AAEA,eAAe,uBAAuB;AACpC,MAAI,QAAQ,aAAa,SAAU;AAEnC,QAAM,gBAAgB,SAAS,EAAE,WAAW;AAC5C,MAAI,CAAC,gBAAgB,SAAS,EAAE,MAAM,EAAG;AAEzC,QAAM,EAAE,oBAAoB,gBAAgB,cAAc,IAAI,MAAM,OAAO,iCAA4B;AACvG,QAAM,EAAE,oBAAoB,IAAI,MAAM,OAAO,6BAAwB;AAErE,MAAI;AACF,QAAI,CAAC,MAAM,mBAAmB,GAAG;AAC/B,cAAQ,IAAI,EAAE,uBAAuB,CAAC;AACtC,YAAM,eAAe,MAAM,KAAK;AAChC,cAAQ,IAAI,EAAE,sBAAsB,CAAC;AAAA,IACvC,OAAO;AAKL,YAAM,SAAS,MAAM,oBAAoB;AACzC,UAAI,OAAO,SAAS,YAAY;AAC9B,gBAAQ,IAAI,EAAE,uBAAuB,EAAE,WAAW,OAAO,WAAW,UAAU,OAAO,SAAS,CAAC,CAAC;AAChG,cAAM,eAAe,MAAM,IAAI;AAC/B,gBAAQ,IAAI,EAAE,sBAAsB,CAAC;AAAA,MACvC;AAAA,IACF;AACA,UAAM,cAAc;AAAA,EACtB,SAAS,KAAK;AAEZ,YAAQ,KAAK,EAAE,yBAAyB,EAAE,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE,CAAC,CAAC;AAAA,EACtG;AACF;AAEA,OAAO,EAAE,MAAM,CAAC,QAAQ;AACtB,UAAQ,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAC9D,OAAK,YAAY,KAAK,EAAE,MAAM,mBAAmB,CAAC,EAAE,QAAQ,MAAM,QAAQ,KAAK,CAAC,CAAC;AACnF,CAAC;","names":["rm","useEffect","useState","Box","Text","t","GradientText","Text","jsx","jsx","Text","React","Box","Text","Fragment","jsx","jsxs","Text","Box","React","useEffect","useState","useState","useEffect","jsx","jsx","jsxs","Box","create","create","create","useEffect","Box","Text","useInput","useInput","jsx","jsxs","useEffect","Box","Text","Box","Text","jsx","jsxs","Box","Text","useEffect","useMemo","Box","Text","create","create","create","create","create","create","create","create","create","create","Box","Text","jsx","jsxs","Box","Text","Box","Text","jsx","jsxs","Box","Text","Text","jsxs","Text","Box","Text","jsx","jsxs","Box","Text","Text","Fragment","jsx","jsxs","Text","jsx","jsxs","Box","Text","useEffect","useMemo","useState","useMemo","useEffect","useRef","Box","Text","useState","useEffect","useState","useRef","useEffect","appendEntry","useState","setError","useRef","useEffect","captureSnapshot","saveSnapshot","Box","Text","jsx","jsxs","Box","Text","useEffect","Box","Text","useInput","jsx","jsxs","useEffect","useInput","Box","Text","Box","Text","Spinner","jsx","jsxs","Box","Spinner","Text","Box","Text","jsx","Box","Text","Box","Text","jsx","jsxs","Box","Text","jsx","jsxs","useRef","useState","useEffect","useMemo","t","Box","Text","useState","useCallback","useEffect","useRef","Box","Text","TextInput","jsx","jsxs","useState","useRef","useEffect","useCallback","Box","Text","TextInput","useEffect","useMemo","useRef","useState","Box","Text","jsx","jsxs","Box","Text","useState","useRef","useEffect","useMemo","useEffect","useRef","useState","Box","Text","Fragment","jsx","jsxs","useState","setLoading","setError","useRef","useEffect","isInstalled","Text","Box","useEffect","useRef","useState","Box","Text","jsx","jsxs","serviceAction","useState","useRef","useEffect","Box","Text","useEffect","useRef","useState","Box","Text","jsx","jsxs","useState","useRef","useEffect","Box","Text","useEffect","useRef","useState","Box","create","writeFile","writeFile","create","Box","Text","jsx","jsxs","Box","Text","Box","Text","jsx","jsxs","Box","Text","Box","Text","TextInput","jsx","jsxs","Box","Text","TextInput","Box","Text","TextInput","jsx","jsxs","Box","Text","TextInput","jsx","jsxs","loadProfile","deleteProfile","updateProfile","useState","importProfile","useRef","useEffect","Box","useEffect","useRef","useState","Box","Text","create","create","jsx","jsxs","useState","useRef","useEffect","Box","Text","useEffect","useState","useMemo","Box","Text","create","create","jsx","jsxs","clearHistory","useState","useEffect","useMemo","Box","Text","useEffect","useState","Box","Text","jsx","jsxs","useState","useEffect","Box","Text","useState","Box","Text","TextInput","readFile","writeFile","rename","join","join","readFile","writeFile","rename","Fragment","jsx","jsxs","deactivate","revalidate","useState","Box","Text","TextInput","useCallback","useEffect","useRef","useState","Box","Text","create","readdir","join","join","readdir","snapshot","create","snapshot","jsx","jsxs","Box","Text","useState","useRef","useEffect","useCallback","useCallback","useEffect","useRef","useState","Box","Text","TextInput","jsx","jsxs","Box","Text","useState","useRef","useEffect","useCallback","TextInput","useCallback","useEffect","useState","Box","Text","Fragment","jsx","jsxs","Box","Text","useState","useEffect","useCallback","useCallback","useEffect","useRef","useState","Box","Text","TextInput","join","jsx","jsxs","Box","Text","useState","useRef","useEffect","useCallback","join","TextInput","Fragment","jsx","jsxs","useEffect","useState","readFile","join","join","readFile","jsx","loadSnapshots","loadBrewfile","computeDrift","loadSyncConfig","loadPolicy","checkCompliance","rm"]}