decane-connect-kit 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +583 -0
- package/dist/index.cjs +2339 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +275 -0
- package/dist/index.d.ts +275 -0
- package/dist/index.js +2296 -0
- package/dist/index.js.map +1 -0
- package/package.json +42 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/core/emitter.ts","../src/core/registry.ts","../src/errors.ts","../src/constants.ts","../src/core/session.ts","../src/core/chainStore.ts","../src/evm/adapter.ts","../src/solana/adapter.ts","../src/core/router.ts","../src/provider.ts","../src/evm/discovery.ts","../src/solana/discovery.ts","../src/factory.ts","../src/ui/WalletSelector.tsx","../src/ui/styles.ts","../src/ui/icons.tsx","../src/ui/context.tsx","../src/ui/hooks.ts"],"sourcesContent":["export { createDecane } from \"./factory\";\n\n// Public type exports\nexport type {\n DecaneProvider,\n DecaneConfig,\n UnifiedWalletAccount,\n ChainDescriptor,\n ChainSupport,\n ChainType,\n ActiveSession,\n CAIP25SessionRequest,\n CAIP25SessionResult,\n ChainScope,\n CAIP25Method,\n} from \"./types\";\n\n// Public value exports\nexport { DecaneError, DecaneErrorCode } from \"./errors\";\nexport { BUILT_IN_CHAINS, CHAINS } from \"./constants\";\nexport type { ChainId } from \"./constants\";\n\n// UI\nexport { WalletSelector } from \"./ui/WalletSelector\";\nexport { DecaneKit } from \"./ui/context\";\nexport type { Theme } from \"./ui/context\";\n\n// React hooks\nexport {\n useDecane,\n useWalletSelector,\n useChainSwitch,\n useSignMessage,\n useSendTransaction,\n useSignTypedData,\n type TxParams,\n} from \"./ui/hooks\";\n","type Handler = (...args: unknown[]) => void;\n\nexport interface Emitter {\n on(event: string, handler: Handler): void;\n off(event: string, handler: Handler): void;\n emit(event: string, ...args: unknown[]): void;\n}\n\nexport function createEmitter(): Emitter {\n const listeners = new Map<string, Set<Handler>>();\n\n return {\n on(event, handler) {\n if (!listeners.has(event)) listeners.set(event, new Set());\n listeners.get(event)!.add(handler);\n },\n\n off(event, handler) {\n listeners.get(event)?.delete(handler);\n },\n\n emit(event, ...args) {\n listeners.get(event)?.forEach((h) => h(...args));\n },\n };\n}\n","import type {\n RawWalletEntry,\n UnifiedWalletAccount,\n ChainSupport,\n EIP1193Provider,\n StandardWallet,\n} from \"../types\";\nimport type { Emitter } from \"./emitter\";\n\nexport interface Registry {\n registerOrMerge(incoming: RawWalletEntry): void;\n unregister(provider: StandardWallet): void;\n get: {\n all(): UnifiedWalletAccount[];\n evm(): UnifiedWalletAccount[];\n solana(): UnifiedWalletAccount[];\n multiChain(): UnifiedWalletAccount[];\n byId(id: string): UnifiedWalletAccount | undefined;\n };\n}\n\nexport function createRegistry(emitter: Emitter): Registry {\n const wallets: UnifiedWalletAccount[] = [];\n\n function normaliseName(name: string): string {\n return name\n .toLowerCase()\n .replace(/\\s+/g, \"\")\n .replace(/wallet$/, \"\");\n }\n\n function toUnified(incoming: RawWalletEntry): UnifiedWalletAccount {\n const id =\n incoming.rdns ??\n incoming.uuid ??\n normaliseName(incoming.name);\n\n const account: UnifiedWalletAccount = {\n id,\n name: incoming.name,\n icon: incoming.icon,\n rdns: incoming.rdns,\n chainSupport: [incoming.chain] as unknown as ChainSupport,\n };\n\n if (incoming.chain === \"evm\") {\n account.evmProvider = incoming.provider as EIP1193Provider;\n } else {\n account.solanaProvider = incoming.provider as StandardWallet;\n }\n\n return account;\n }\n\n function mergeInto(\n existing: UnifiedWalletAccount,\n incoming: RawWalletEntry,\n ): void {\n if (!existing.chainSupport.includes(incoming.chain)) {\n existing.chainSupport = [\n ...existing.chainSupport,\n incoming.chain,\n ].sort() as ChainSupport;\n }\n if (incoming.chain === \"evm\") {\n existing.evmProvider = incoming.provider as EIP1193Provider;\n }\n if (incoming.chain === \"solana\") {\n existing.solanaProvider = incoming.provider as StandardWallet;\n }\n if (!existing.icon && incoming.icon) existing.icon = incoming.icon;\n }\n\n function registerOrMerge(incoming: RawWalletEntry): void {\n // 1. Match by rdns (primary merge key — both sides have rdns and it matches)\n if (incoming.rdns) {\n const existing = wallets.find((w) => w.rdns === incoming.rdns);\n if (existing) {\n mergeInto(existing, incoming);\n emitter.emit(\"walletUpdated\", existing);\n return;\n }\n }\n\n // 2. Match by normalised name — fallback for when rdns didn't match or\n // the incoming entry (typically a Solana Wallet Standard wallet) has no\n // rdns. Solana wallets rarely expose rdns, so this is the normal merge\n // path for multi-chain wallets like Backpack, Phantom, MetaMask.\n if (!incoming.rdns) {\n const norm = normaliseName(incoming.name);\n const existing = wallets.find(\n (w) => normaliseName(w.name) === norm,\n );\n if (existing) {\n mergeInto(existing, incoming);\n emitter.emit(\"walletUpdated\", existing);\n return;\n }\n }\n\n // 3. New wallet\n const account = toUnified(incoming);\n wallets.push(account);\n emitter.emit(\"walletRegistered\", account);\n }\n\n function unregister(provider: StandardWallet): void {\n const idx = wallets.findIndex((w) => w.solanaProvider === provider);\n if (idx === -1) return;\n const entry = wallets[idx];\n if (entry.chainSupport.length === 1) {\n wallets.splice(idx, 1);\n emitter.emit(\"walletUnregistered\", entry);\n } else {\n entry.chainSupport = [\"evm\"];\n entry.solanaProvider = undefined;\n emitter.emit(\"walletUpdated\", entry);\n }\n }\n\n return {\n registerOrMerge,\n unregister,\n get: {\n all: () => [...wallets],\n evm: () => wallets.filter((w) => w.chainSupport.includes(\"evm\")),\n solana: () => wallets.filter((w) => w.chainSupport.includes(\"solana\")),\n multiChain: () =>\n wallets.filter(\n (w) =>\n w.chainSupport.includes(\"evm\") &&\n w.chainSupport.includes(\"solana\"),\n ),\n byId: (id) => wallets.find((w) => w.id === id),\n },\n };\n}\n","export class DecaneError extends Error {\n constructor(\n public code: DecaneErrorCode,\n message: string,\n ) {\n super(message);\n this.name = \"DecaneError\";\n }\n}\n\nexport enum DecaneErrorCode {\n // CAIP-25 standard codes\n USER_REJECTED = 4001,\n UNAUTHORIZED = 4100,\n\n // Session\n NO_ACTIVE_SESSION = 5001,\n SCOPE_MISMATCH = 5002,\n SESSION_EXPIRED = 5003,\n\n // Chain\n UNSUPPORTED_CHAIN = 5010,\n CHAIN_NOT_IN_SCOPE = 5011,\n INVALID_CHAIN_CONFIG = 5012,\n\n // Wallet\n NO_WALLET_CONNECTED = 5020,\n WALLET_DISCONNECTED = 5021,\n PROVIDER_ERROR = 5022,\n\n // Method\n METHOD_NOT_SUPPORTED = 5030,\n EVM_ONLY_METHOD = 5031,\n}\n","import type { ChainDescriptor } from \"./types\";\n\n// ── Built-in chains ───────────────────────────────────────────────────────────\n\nconst ETH = { name: \"Ether\", symbol: \"ETH\", decimals: 18 };\nconst SOL = { name: \"SOL\", symbol: \"SOL\", decimals: 9 };\n\nexport const BUILT_IN_CHAINS: ChainDescriptor[] = [\n // ── Tier-1 EVM ──────────────────────────────────────────────────────────────\n {\n id: \"eip155:1\",\n type: \"evm\",\n name: \"Ethereum\",\n chainId: 1,\n nativeCurrency: ETH,\n rpcUrl: \"https://cloudflare-eth.com\",\n blockExplorerUrl: \"https://etherscan.io\",\n },\n {\n id: \"eip155:8453\",\n type: \"evm\",\n name: \"Base\",\n chainId: 8453,\n nativeCurrency: ETH,\n rpcUrl: \"https://mainnet.base.org\",\n blockExplorerUrl: \"https://basescan.org\",\n },\n {\n id: \"eip155:42161\",\n type: \"evm\",\n name: \"Arbitrum One\",\n chainId: 42161,\n nativeCurrency: ETH,\n rpcUrl: \"https://arb1.arbitrum.io/rpc\",\n blockExplorerUrl: \"https://arbiscan.io\",\n },\n {\n id: \"eip155:10\",\n type: \"evm\",\n name: \"Optimism\",\n chainId: 10,\n nativeCurrency: ETH,\n rpcUrl: \"https://mainnet.optimism.io\",\n blockExplorerUrl: \"https://optimistic.etherscan.io\",\n },\n {\n id: \"eip155:56\",\n type: \"evm\",\n name: \"BNB Chain\",\n chainId: 56,\n nativeCurrency: { name: \"BNB\", symbol: \"BNB\", decimals: 18 },\n rpcUrl: \"https://bsc-dataseed.binance.org\",\n blockExplorerUrl: \"https://bscscan.com\",\n },\n {\n id: \"eip155:137\",\n type: \"evm\",\n name: \"Polygon\",\n chainId: 137,\n nativeCurrency: { name: \"MATIC\", symbol: \"MATIC\", decimals: 18 },\n rpcUrl: \"https://polygon-rpc.com\",\n blockExplorerUrl: \"https://polygonscan.com\",\n },\n\n // ── Extended EVM ecosystem ───────────────────────────────────────────────────\n {\n id: \"eip155:2741\",\n type: \"evm\",\n name: \"Abstract\",\n chainId: 2741,\n nativeCurrency: ETH,\n rpcUrl: \"https://api.mainnet.abs.xyz\",\n blockExplorerUrl: \"https://abscan.org\",\n },\n {\n id: \"eip155:888888888\",\n type: \"evm\",\n name: \"Ancient8\",\n chainId: 888888888,\n nativeCurrency: ETH,\n rpcUrl: \"https://rpc.ancient8.gg\",\n blockExplorerUrl: \"https://scan.ancient8.gg\",\n },\n {\n id: \"eip155:69000\",\n type: \"evm\",\n name: \"Animechain\",\n chainId: 69000,\n nativeCurrency: { name: \"Anime\", symbol: \"ANIME\", decimals: 18 },\n rpcUrl: \"https://rpc.animechain.ai\",\n blockExplorerUrl: \"https://explorer.animechain.ai\",\n },\n {\n id: \"eip155:33139\",\n type: \"evm\",\n name: \"ApeChain\",\n chainId: 33139,\n nativeCurrency: { name: \"ApeCoin\", symbol: \"APE\", decimals: 18 },\n rpcUrl: \"https://rpc.apechain.com/http\",\n blockExplorerUrl: \"https://apescan.io\",\n },\n {\n id: \"eip155:42170\",\n type: \"evm\",\n name: \"Arbitrum Nova\",\n chainId: 42170,\n nativeCurrency: ETH,\n rpcUrl: \"https://nova.arbitrum.io/rpc\",\n blockExplorerUrl: \"https://nova.arbiscan.io\",\n },\n {\n id: \"eip155:43114\",\n type: \"evm\",\n name: \"Avalanche\",\n chainId: 43114,\n nativeCurrency: { name: \"Avalanche\", symbol: \"AVAX\", decimals: 18 },\n rpcUrl: \"https://api.avax.network/ext/bc/C/rpc\",\n blockExplorerUrl: \"https://snowtrace.io\",\n },\n {\n id: \"eip155:8333\",\n type: \"evm\",\n name: \"B3\",\n chainId: 8333,\n nativeCurrency: ETH,\n rpcUrl: \"https://mainnet-rpc.b3.fun/http\",\n blockExplorerUrl: \"https://explorer.b3.fun\",\n },\n {\n id: \"eip155:80094\",\n type: \"evm\",\n name: \"Berachain\",\n chainId: 80094,\n nativeCurrency: { name: \"BERA\", symbol: \"BERA\", decimals: 18 },\n rpcUrl: \"https://rpc.berachain.com\",\n blockExplorerUrl: \"https://berascan.com\",\n },\n {\n id: \"eip155:81457\",\n type: \"evm\",\n name: \"Blast\",\n chainId: 81457,\n nativeCurrency: ETH,\n rpcUrl: \"https://rpc.blast.io\",\n blockExplorerUrl: \"https://blastscan.io\",\n },\n {\n id: \"eip155:60808\",\n type: \"evm\",\n name: \"BOB\",\n chainId: 60808,\n nativeCurrency: ETH,\n rpcUrl: \"https://rpc.gobob.xyz\",\n blockExplorerUrl: \"https://explorer.gobob.xyz\",\n },\n {\n id: \"eip155:288\",\n type: \"evm\",\n name: \"Boba Network\",\n chainId: 288,\n nativeCurrency: ETH,\n rpcUrl: \"https://mainnet.boba.network\",\n blockExplorerUrl: \"https://bobascan.com\",\n },\n {\n id: \"eip155:42220\",\n type: \"evm\",\n name: \"Celo\",\n chainId: 42220,\n nativeCurrency: { name: \"CELO\", symbol: \"CELO\", decimals: 18 },\n rpcUrl: \"https://forno.celo.org\",\n blockExplorerUrl: \"https://celoscan.io\",\n },\n {\n id: \"eip155:21000000\",\n type: \"evm\",\n name: \"Corn\",\n chainId: 21000000,\n nativeCurrency: { name: \"Bitcorn\", symbol: \"BTCN\", decimals: 18 },\n rpcUrl: \"https://mainnet.corn-rpc.com\",\n blockExplorerUrl: \"https://cornscan.io\",\n },\n {\n id: \"eip155:25\",\n type: \"evm\",\n name: \"Cronos\",\n chainId: 25,\n nativeCurrency: { name: \"Cronos\", symbol: \"CRO\", decimals: 18 },\n rpcUrl: \"https://evm.cronos.org\",\n blockExplorerUrl: \"https://cronoscan.com\",\n },\n {\n id: \"eip155:7560\",\n type: \"evm\",\n name: \"Cyber\",\n chainId: 7560,\n nativeCurrency: ETH,\n rpcUrl: \"https://rpc.cyber.co\",\n blockExplorerUrl: \"https://cyberscan.co\",\n },\n {\n id: \"eip155:666666666\",\n type: \"evm\",\n name: \"Degen\",\n chainId: 666666666,\n nativeCurrency: { name: \"Degen\", symbol: \"DEGEN\", decimals: 18 },\n rpcUrl: \"https://rpc.degen.tips\",\n blockExplorerUrl: \"https://explorer.degen.tips\",\n },\n {\n id: \"eip155:747\",\n type: \"evm\",\n name: \"Flow EVM\",\n chainId: 747,\n nativeCurrency: { name: \"Flow\", symbol: \"FLOW\", decimals: 18 },\n rpcUrl: \"https://mainnet.evm.nodes.onflow.org\",\n blockExplorerUrl: \"https://flowdiver.io\",\n },\n {\n id: \"eip155:100\",\n type: \"evm\",\n name: \"Gnosis\",\n chainId: 100,\n nativeCurrency: { name: \"xDai\", symbol: \"xDAI\", decimals: 18 },\n rpcUrl: \"https://rpc.gnosischain.com\",\n blockExplorerUrl: \"https://gnosisscan.io\",\n },\n {\n id: \"eip155:49321\",\n type: \"evm\",\n name: \"Gunz\",\n chainId: 49321,\n nativeCurrency: ETH,\n rpcUrl: \"https://rpc.gunz.dev/ext/bc/evm\",\n blockExplorerUrl: \"https://explorer.gunz.dev\",\n },\n {\n id: \"eip155:43111\",\n type: \"evm\",\n name: \"Hemi\",\n chainId: 43111,\n nativeCurrency: ETH,\n rpcUrl: \"https://rpc.hemi.network/rpc\",\n blockExplorerUrl: \"https://explorer.hemi.xyz\",\n },\n {\n id: \"eip155:999\",\n type: \"evm\",\n name: \"HyperEVM\",\n chainId: 999,\n nativeCurrency: { name: \"HYPE\", symbol: \"HYPE\", decimals: 18 },\n rpcUrl: \"https://rpc.hyperliquid.xyz/evm\",\n blockExplorerUrl: \"https://hyperevm-explorer.hyperliquid.xyz\",\n },\n {\n id: \"eip155:57073\",\n type: \"evm\",\n name: \"Ink\",\n chainId: 57073,\n nativeCurrency: ETH,\n rpcUrl: \"https://rpc-gel.inkonchain.com\",\n blockExplorerUrl: \"https://explorer.inkonchain.com\",\n },\n {\n id: \"eip155:59144\",\n type: \"evm\",\n name: \"Linea\",\n chainId: 59144,\n nativeCurrency: ETH,\n rpcUrl: \"https://rpc.linea.build\",\n blockExplorerUrl: \"https://lineascan.build\",\n },\n {\n id: \"eip155:1135\",\n type: \"evm\",\n name: \"Lisk\",\n chainId: 1135,\n nativeCurrency: ETH,\n rpcUrl: \"https://rpc.api.lisk.com\",\n blockExplorerUrl: \"https://blockscout.lisk.com\",\n },\n {\n id: \"eip155:169\",\n type: \"evm\",\n name: \"Manta Pacific\",\n chainId: 169,\n nativeCurrency: ETH,\n rpcUrl: \"https://pacific-rpc.manta.network/http\",\n blockExplorerUrl: \"https://pacific-explorer.manta.network\",\n },\n {\n id: \"eip155:5000\",\n type: \"evm\",\n name: \"Mantle\",\n chainId: 5000,\n nativeCurrency: { name: \"MNT\", symbol: \"MNT\", decimals: 18 },\n rpcUrl: \"https://rpc.mantle.xyz\",\n blockExplorerUrl: \"https://explorer.mantle.xyz\",\n },\n {\n id: \"eip155:6342\",\n type: \"evm\",\n name: \"MegaETH\",\n chainId: 6342,\n nativeCurrency: ETH,\n rpcUrl: \"https://carrot.megaeth.com\",\n blockExplorerUrl: \"https://megaexplorer.xyz\",\n },\n {\n id: \"eip155:1088\",\n type: \"evm\",\n name: \"Metis\",\n chainId: 1088,\n nativeCurrency: { name: \"Metis\", symbol: \"METIS\", decimals: 18 },\n rpcUrl: \"https://andromeda.metis.io/?owner=1088\",\n blockExplorerUrl: \"https://andromeda-explorer.metis.io\",\n },\n {\n id: \"eip155:34443\",\n type: \"evm\",\n name: \"Mode\",\n chainId: 34443,\n nativeCurrency: ETH,\n rpcUrl: \"https://mainnet.mode.network\",\n blockExplorerUrl: \"https://modescan.io\",\n },\n {\n id: \"eip155:10143\",\n type: \"evm\",\n name: \"Monad\",\n chainId: 10143,\n nativeCurrency: { name: \"MON\", symbol: \"MON\", decimals: 18 },\n rpcUrl: \"https://testnet-rpc.monad.xyz\",\n blockExplorerUrl: \"https://testnet.monadexplorer.com\",\n },\n {\n id: \"eip155:2818\",\n type: \"evm\",\n name: \"Morph\",\n chainId: 2818,\n nativeCurrency: ETH,\n rpcUrl: \"https://rpc-quicknode.morphl2.io\",\n blockExplorerUrl: \"https://explorer.morphl2.io\",\n },\n {\n id: \"eip155:98866\",\n type: \"evm\",\n name: \"Plume\",\n chainId: 98866,\n nativeCurrency: { name: \"Plume\", symbol: \"PLUME\", decimals: 18 },\n rpcUrl: \"https://rpc.plume.org\",\n blockExplorerUrl: \"https://explorer.plume.org\",\n },\n {\n id: \"eip155:1380012617\",\n type: \"evm\",\n name: \"RARI\",\n chainId: 1380012617,\n nativeCurrency: ETH,\n rpcUrl: \"https://mainnet.rpc.rarichain.org/ext/bc/C/rpc\",\n blockExplorerUrl: \"https://mainnet.explorer.rarichain.org\",\n },\n {\n id: \"eip155:690\",\n type: \"evm\",\n name: \"Redstone\",\n chainId: 690,\n nativeCurrency: ETH,\n rpcUrl: \"https://rpc.redstonechain.com\",\n blockExplorerUrl: \"https://explorer.redstone.xyz\",\n },\n {\n id: \"eip155:2020\",\n type: \"evm\",\n name: \"Ronin\",\n chainId: 2020,\n nativeCurrency: { name: \"RON\", symbol: \"RON\", decimals: 18 },\n rpcUrl: \"https://api.roninchain.com/rpc\",\n blockExplorerUrl: \"https://app.roninchain.com\",\n },\n {\n id: \"eip155:534352\",\n type: \"evm\",\n name: \"Scroll\",\n chainId: 534352,\n nativeCurrency: ETH,\n rpcUrl: \"https://rpc.scroll.io\",\n blockExplorerUrl: \"https://scrollscan.com\",\n },\n {\n id: \"eip155:1329\",\n type: \"evm\",\n name: \"Sei\",\n chainId: 1329,\n nativeCurrency: { name: \"Sei\", symbol: \"SEI\", decimals: 18 },\n rpcUrl: \"https://evm-rpc.sei-apis.com\",\n blockExplorerUrl: \"https://seistream.app\",\n },\n {\n id: \"eip155:360\",\n type: \"evm\",\n name: \"Shape\",\n chainId: 360,\n nativeCurrency: ETH,\n rpcUrl: \"https://mainnet.shape.network\",\n blockExplorerUrl: \"https://shapescan.xyz\",\n },\n {\n id: \"eip155:50312\",\n type: \"evm\",\n name: \"Somnia\",\n chainId: 50312,\n nativeCurrency: { name: \"STT\", symbol: \"STT\", decimals: 18 },\n rpcUrl: \"https://dream-rpc.somnia.network\",\n blockExplorerUrl: \"https://shannon-explorer.somnia.network\",\n },\n {\n id: \"eip155:1868\",\n type: \"evm\",\n name: \"Soneium\",\n chainId: 1868,\n nativeCurrency: ETH,\n rpcUrl: \"https://rpc.soneium.org\",\n blockExplorerUrl: \"https://soneium.blockscout.com\",\n },\n {\n id: \"eip155:146\",\n type: \"evm\",\n name: \"Sonic\",\n chainId: 146,\n nativeCurrency: { name: \"Sonic\", symbol: \"S\", decimals: 18 },\n rpcUrl: \"https://rpc.soniclabs.com\",\n blockExplorerUrl: \"https://sonicscan.org\",\n },\n {\n id: \"eip155:1514\",\n type: \"evm\",\n name: \"Story\",\n chainId: 1514,\n nativeCurrency: { name: \"IP\", symbol: \"IP\", decimals: 18 },\n rpcUrl: \"https://mainnet.storyrpc.io\",\n blockExplorerUrl: \"https://storyscan.xyz\",\n },\n {\n id: \"eip155:55244\",\n type: \"evm\",\n name: \"Superposition\",\n chainId: 55244,\n nativeCurrency: ETH,\n rpcUrl: \"https://rpc.superposition.so\",\n blockExplorerUrl: \"https://explorer.superposition.so\",\n },\n {\n id: \"eip155:5330\",\n type: \"evm\",\n name: \"Superseed\",\n chainId: 5330,\n nativeCurrency: ETH,\n rpcUrl: \"https://mainnet.superseed.xyz\",\n blockExplorerUrl: \"https://explorer.superseed.xyz\",\n },\n {\n id: \"eip155:1923\",\n type: \"evm\",\n name: \"SwellChain\",\n chainId: 1923,\n nativeCurrency: ETH,\n rpcUrl: \"https://swell-mainnet.alt.technology\",\n blockExplorerUrl: \"https://explorer.swellnetwork.io\",\n },\n {\n id: \"eip155:167000\",\n type: \"evm\",\n name: \"Taiko\",\n chainId: 167000,\n nativeCurrency: ETH,\n rpcUrl: \"https://rpc.mainnet.taiko.xyz\",\n blockExplorerUrl: \"https://taikoscan.io\",\n },\n {\n id: \"eip155:130\",\n type: \"evm\",\n name: \"Unichain\",\n chainId: 130,\n nativeCurrency: ETH,\n rpcUrl: \"https://mainnet.unichain.org\",\n blockExplorerUrl: \"https://uniscan.xyz\",\n },\n {\n id: \"eip155:480\",\n type: \"evm\",\n name: \"World Chain\",\n chainId: 480,\n nativeCurrency: ETH,\n rpcUrl: \"https://worldchain-mainnet.g.alchemy.com/public\",\n blockExplorerUrl: \"https://worldchain-mainnet.explorer.alchemy.com\",\n },\n {\n id: \"eip155:543210\",\n type: \"evm\",\n name: \"ZERO\",\n chainId: 543210,\n nativeCurrency: ETH,\n rpcUrl: \"https://rpc.zerion.io/v1/zero\",\n blockExplorerUrl: \"https://explorer.zero.network\",\n },\n {\n id: \"eip155:48900\",\n type: \"evm\",\n name: \"Zircuit\",\n chainId: 48900,\n nativeCurrency: ETH,\n rpcUrl: \"https://zircuit1-mainnet.p2pify.com\",\n blockExplorerUrl: \"https://explorer.zircuit.com\",\n },\n {\n id: \"eip155:324\",\n type: \"evm\",\n name: \"zkSync Era\",\n chainId: 324,\n nativeCurrency: ETH,\n rpcUrl: \"https://mainnet.era.zksync.io\",\n blockExplorerUrl: \"https://explorer.zksync.io\",\n },\n {\n id: \"eip155:7777777\",\n type: \"evm\",\n name: \"Zora\",\n chainId: 7777777,\n nativeCurrency: ETH,\n rpcUrl: \"https://rpc.zora.energy\",\n blockExplorerUrl: \"https://explorer.zora.energy\",\n },\n\n // ── Dev / local ──────────────────────────────────────────────────────────────\n {\n id: \"eip155:31337\",\n type: \"evm\",\n name: \"Localhost\",\n chainId: 31337,\n nativeCurrency: ETH,\n rpcUrl: \"http://localhost:8545\",\n isCustom: true,\n },\n\n // ── Solana ───────────────────────────────────────────────────────────────────\n {\n id: \"solana:mainnet\",\n type: \"solana\",\n name: \"Solana\",\n nativeCurrency: SOL,\n blockExplorerUrl: \"https://solscan.io\",\n },\n {\n id: \"solana:devnet\",\n type: \"solana\",\n name: \"Solana Devnet\",\n nativeCurrency: SOL,\n blockExplorerUrl: \"https://solscan.io/?cluster=devnet\",\n },\n];\n\n// ── CAIP-2 helpers ────────────────────────────────────────────────────────────\n\nexport function toCAIP2(type: \"evm\", chainId: number): string;\nexport function toCAIP2(type: \"solana\", network: \"mainnet\" | \"devnet\"): string;\nexport function toCAIP2(type: string, id: string | number): string {\n if (type === \"evm\") return `eip155:${id}`;\n if (type === \"solana\") return `solana:${id}`;\n throw new Error(`Unknown chain type: ${type}`);\n}\n\nexport function getChainType(caip2Id: string): \"evm\" | \"solana\" {\n if (caip2Id.startsWith(\"eip155:\")) return \"evm\";\n if (caip2Id.startsWith(\"solana:\")) return \"solana\";\n throw new Error(`Cannot determine chain type from: ${caip2Id}`);\n}\n\n// ── CAIP-10 helpers ───────────────────────────────────────────────────────────\n\nexport function toCAIP10(chainId: string, address: string): string {\n return `${chainId}:${address}`;\n}\n\nexport function fromCAIP10(account: string): { chainId: string; address: string } {\n const i = account.lastIndexOf(\":\");\n return { chainId: account.slice(0, i), address: account.slice(i + 1) };\n}\n\n// ── Method sets ───────────────────────────────────────────────────────────────\n\nexport const EVM_METHODS = new Set([\n \"wallet_sendTransaction\",\n \"wallet_signMessage\",\n \"wallet_signTypedData\",\n]);\n\nexport const SOLANA_METHODS = new Set([\n \"wallet_sendTransaction\",\n \"wallet_signMessage\",\n // wallet_signTypedData is EVM-only — never included here\n]);\n\n// ── Named chain ID constants ──────────────────────────────────────────────────\n\nexport const CHAINS = {\n // Tier-1\n ETHEREUM: \"eip155:1\",\n BASE: \"eip155:8453\",\n ARBITRUM: \"eip155:42161\",\n OPTIMISM: \"eip155:10\",\n BNB: \"eip155:56\",\n POLYGON: \"eip155:137\",\n // Extended EVM\n ABSTRACT: \"eip155:2741\",\n ANCIENT8: \"eip155:888888888\",\n ANIMECHAIN: \"eip155:69000\",\n APE_CHAIN: \"eip155:33139\",\n ARBITRUM_NOVA: \"eip155:42170\",\n AVALANCHE: \"eip155:43114\",\n B3: \"eip155:8333\",\n BERACHAIN: \"eip155:80094\",\n BLAST: \"eip155:81457\",\n BOB: \"eip155:60808\",\n BOBA: \"eip155:288\",\n CELO: \"eip155:42220\",\n CORN: \"eip155:21000000\",\n CRONOS: \"eip155:25\",\n CYBER: \"eip155:7560\",\n DEGEN: \"eip155:666666666\",\n FLOW_EVM: \"eip155:747\",\n GNOSIS: \"eip155:100\",\n GUNZ: \"eip155:49321\",\n HEMI: \"eip155:43111\",\n HYPER_EVM: \"eip155:999\",\n INK: \"eip155:57073\",\n LINEA: \"eip155:59144\",\n LISK: \"eip155:1135\",\n MANTA_PACIFIC: \"eip155:169\",\n MANTLE: \"eip155:5000\",\n MEGA_ETH: \"eip155:6342\",\n METIS: \"eip155:1088\",\n MODE: \"eip155:34443\",\n MONAD: \"eip155:10143\",\n MORPH: \"eip155:2818\",\n PLUME: \"eip155:98866\",\n RARI: \"eip155:1380012617\",\n REDSTONE: \"eip155:690\",\n RONIN: \"eip155:2020\",\n SCROLL: \"eip155:534352\",\n SEI: \"eip155:1329\",\n SHAPE: \"eip155:360\",\n SOMNIA: \"eip155:50312\",\n SONEIUM: \"eip155:1868\",\n SONIC: \"eip155:146\",\n STORY: \"eip155:1514\",\n SUPERPOSITION: \"eip155:55244\",\n SUPERSEED: \"eip155:5330\",\n SWELL_CHAIN: \"eip155:1923\",\n TAIKO: \"eip155:167000\",\n UNICHAIN: \"eip155:130\",\n WORLD_CHAIN: \"eip155:480\",\n ZERO: \"eip155:543210\",\n ZIRCUIT: \"eip155:48900\",\n ZKSYNC_ERA: \"eip155:324\",\n ZORA: \"eip155:7777777\",\n // Dev\n LOCALHOST: \"eip155:31337\",\n // Solana\n SOLANA: \"solana:mainnet\",\n SOLANA_DEVNET: \"solana:devnet\",\n} as const;\n\nexport type ChainId = typeof CHAINS[keyof typeof CHAINS];\n\n// ── Custom chain validation ───────────────────────────────────────────────────\n\nexport function validateCustomChain(chain: unknown): chain is ChainDescriptor {\n if (!chain || typeof chain !== \"object\") return false;\n const c = chain as Record<string, unknown>;\n if (typeof c.id !== \"string\" || !c.id) return false;\n if (c.type !== \"evm\" && c.type !== \"solana\") return false;\n if (typeof c.name !== \"string\" || !c.name) return false;\n if (!c.nativeCurrency || typeof c.nativeCurrency !== \"object\") return false;\n if (c.type === \"evm\" && (typeof c.chainId !== \"number\" || !c.id.startsWith(\"eip155:\")))\n return false;\n if (c.type === \"solana\" && !c.id.startsWith(\"solana:\")) return false;\n return true;\n}\n","import type { ActiveSession } from \"../types\";\nimport { DecaneError, DecaneErrorCode } from \"../errors\";\nimport { toCAIP10 } from \"../constants\";\n\nconst STORAGE_KEY = \"decane:session\";\n\nfunction loadFromStorage(): ActiveSession | null {\n if (typeof localStorage === \"undefined\") return null;\n try {\n const raw = localStorage.getItem(STORAGE_KEY);\n return raw ? (JSON.parse(raw) as ActiveSession) : null;\n } catch {\n return null;\n }\n}\n\nfunction saveToStorage(session: ActiveSession | null): void {\n if (typeof localStorage === \"undefined\") return;\n try {\n if (session) {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(session));\n } else {\n localStorage.removeItem(STORAGE_KEY);\n }\n } catch {\n // Storage quota exceeded or private browsing — silently skip\n }\n}\n\nexport interface SessionManager {\n get(): ActiveSession | null;\n set(s: ActiveSession | null): void;\n clear(): void;\n isChainGranted(chainId: string): boolean;\n isAccountGranted(chainId: string, address: string): boolean;\n assertChainInScope(chainId: string): void;\n assertAccountInScope(chainId: string, address: string): void;\n}\n\nexport function createSessionManager(): SessionManager {\n // Restore persisted session on SDK init\n let _session: ActiveSession | null = loadFromStorage();\n\n return {\n get: () => _session,\n\n set(s) {\n _session = s;\n saveToStorage(s);\n },\n\n clear() {\n _session = null;\n saveToStorage(null);\n },\n\n isChainGranted(chainId) {\n return !!_session?.grantedScopes[chainId];\n },\n\n isAccountGranted(chainId, address) {\n const scope = _session?.grantedScopes[chainId];\n if (!scope) return false;\n return scope.accounts.includes(toCAIP10(chainId, address));\n },\n\n assertChainInScope(chainId) {\n if (!this.isChainGranted(chainId)) {\n throw new DecaneError(\n DecaneErrorCode.CHAIN_NOT_IN_SCOPE,\n `Chain ${chainId} is not in the current session scope. Call wallet_requestPermissions first.`,\n );\n }\n },\n\n assertAccountInScope(chainId, address) {\n if (!this.isAccountGranted(chainId, address)) {\n throw new DecaneError(\n DecaneErrorCode.SCOPE_MISMATCH,\n `Account ${address} on chain ${chainId} is not in the current session scope.`,\n );\n }\n },\n };\n}\n","import type { ChainDescriptor } from \"../types\";\nimport { DecaneError, DecaneErrorCode } from \"../errors\";\n\nexport interface ChainStore {\n get(id: string): ChainDescriptor | undefined;\n getAll(): ChainDescriptor[];\n add(chain: ChainDescriptor): void;\n remove(id: string): void;\n}\n\nexport function createChainStore(initial: ChainDescriptor[]): ChainStore {\n const chains = new Map<string, ChainDescriptor>(\n initial.map((c) => [c.id, c]),\n );\n\n return {\n get(id) {\n return chains.get(id);\n },\n\n getAll() {\n return [...chains.values()];\n },\n\n add(chain) {\n if (chains.has(chain.id)) {\n throw new DecaneError(\n DecaneErrorCode.INVALID_CHAIN_CONFIG,\n `Chain ${chain.id} is already registered`,\n );\n }\n chains.set(chain.id, chain);\n },\n\n remove(id) {\n const chain = chains.get(id);\n if (!chain) return;\n if (!chain.isCustom) {\n throw new DecaneError(\n DecaneErrorCode.INVALID_CHAIN_CONFIG,\n `Cannot remove built-in chain ${id}`,\n );\n }\n chains.delete(id);\n },\n };\n}\n","import type { EIP1193Provider, CAIP25Method, ChainDescriptor } from \"../types\";\nimport { DecaneError, DecaneErrorCode } from \"../errors\";\n\nexport async function eip1193Request(\n provider: EIP1193Provider,\n method: CAIP25Method,\n payload: unknown,\n account: string,\n): Promise<string> {\n switch (method) {\n case \"wallet_sendTransaction\":\n return provider.request({\n method: \"eth_sendTransaction\",\n params: [{ ...(payload as object), from: account }],\n }) as Promise<string>;\n\n case \"wallet_signMessage\":\n // personal_sign prepends EIP-191 prefix: \"\\x19Ethereum Signed Message:\\n\"\n return provider.request({\n method: \"personal_sign\",\n params: [payload, account],\n }) as Promise<string>;\n\n case \"wallet_signTypedData\":\n // EIP-712 typed data\n return provider.request({\n method: \"eth_signTypedData_v4\",\n params: [account, JSON.stringify(payload)],\n }) as Promise<string>;\n\n default:\n throw new DecaneError(\n DecaneErrorCode.METHOD_NOT_SUPPORTED,\n `EVM adapter: unsupported method ${method}`,\n );\n }\n}\n\nexport async function getEvmAddress(\n provider: EIP1193Provider,\n): Promise<string> {\n const accounts = (await provider.request({\n method: \"eth_requestAccounts\",\n })) as string[];\n if (!accounts?.[0]) {\n throw new DecaneError(\n DecaneErrorCode.USER_REJECTED,\n \"No EVM accounts returned\",\n );\n }\n return accounts[0];\n}\n\n// EIP-3085 — supported by MetaMask and most EVM wallets\nexport async function addEthereumChain(\n provider: EIP1193Provider,\n chain: ChainDescriptor,\n): Promise<void> {\n await provider.request({\n method: \"wallet_addEthereumChain\",\n params: [\n {\n chainId: `0x${chain.chainId!.toString(16)}`,\n chainName: chain.name,\n nativeCurrency: chain.nativeCurrency,\n rpcUrls: chain.rpcUrl ? [chain.rpcUrl] : [],\n blockExplorerUrls: chain.blockExplorerUrl\n ? [chain.blockExplorerUrl]\n : [],\n },\n ],\n });\n}\n","import { base58 } from \"@scure/base\";\nimport type { StandardWallet, CAIP25Method, StandardWalletAccount } from \"../types\";\nimport { DecaneError, DecaneErrorCode } from \"../errors\";\n\ninterface SolanaSignAndSendTx {\n signAndSendTransaction(args: {\n transaction: unknown;\n account: StandardWalletAccount;\n }): Promise<Array<{ signature: string }>>;\n}\n\ninterface SolanaSignMessage {\n signMessage(args: {\n message: Uint8Array;\n account: StandardWalletAccount;\n }): Promise<Array<{ signature: Uint8Array }>>;\n}\n\ninterface StandardConnect {\n connect(opts?: { silent?: boolean }): Promise<{\n accounts: Array<{ publicKey: Uint8Array }>;\n }>;\n}\n\nfunction deserializeSolanaTransaction(data: unknown): unknown {\n // Passthrough — wallet handles actual deserialization\n return data;\n}\n\nexport async function walletStandardRequest(\n wallet: StandardWallet,\n method: CAIP25Method,\n payload: unknown,\n account: string,\n): Promise<string> {\n switch (method) {\n case \"wallet_sendTransaction\": {\n const feature = wallet.features[\n \"solana:signAndSendTransaction\"\n ] as SolanaSignAndSendTx | undefined;\n if (!feature) {\n throw new DecaneError(\n DecaneErrorCode.METHOD_NOT_SUPPORTED,\n \"Wallet does not support solana:signAndSendTransaction\",\n );\n }\n const walletAccount = wallet.accounts.find(\n (a) => base58.encode(a.publicKey) === account,\n );\n if (!walletAccount) {\n throw new DecaneError(\n DecaneErrorCode.SCOPE_MISMATCH,\n `Account ${account} not found`,\n );\n }\n const tx = deserializeSolanaTransaction(payload);\n const [result] = await feature.signAndSendTransaction({\n transaction: tx,\n account: walletAccount,\n });\n return result.signature;\n }\n\n case \"wallet_signMessage\": {\n const feature = wallet.features[\n \"solana:signMessage\"\n ] as SolanaSignMessage | undefined;\n if (!feature) {\n throw new DecaneError(\n DecaneErrorCode.METHOD_NOT_SUPPORTED,\n \"Wallet does not support solana:signMessage\",\n );\n }\n const walletAccount = wallet.accounts.find(\n (a) => base58.encode(a.publicKey) === account,\n );\n if (!walletAccount) {\n throw new DecaneError(\n DecaneErrorCode.SCOPE_MISMATCH,\n `Account ${account} not found`,\n );\n }\n const messageBytes =\n typeof payload === \"string\"\n ? new TextEncoder().encode(payload)\n : (payload as Uint8Array);\n const [result] = await feature.signMessage({\n message: messageBytes,\n account: walletAccount,\n });\n return base58.encode(result.signature);\n }\n\n default:\n throw new DecaneError(\n DecaneErrorCode.METHOD_NOT_SUPPORTED,\n `Solana adapter: unsupported method ${method}`,\n );\n }\n}\n\nexport async function getSolanaAddress(\n wallet: StandardWallet,\n): Promise<string> {\n const connectFeature = wallet.features[\n \"standard:connect\"\n ] as StandardConnect | undefined;\n if (!connectFeature) {\n throw new DecaneError(\n DecaneErrorCode.METHOD_NOT_SUPPORTED,\n \"Wallet does not support standard:connect\",\n );\n }\n const { accounts } = await connectFeature.connect();\n if (!accounts?.[0]) {\n throw new DecaneError(\n DecaneErrorCode.USER_REJECTED,\n \"No Solana accounts returned\",\n );\n }\n return base58.encode(accounts[0].publicKey);\n}\n","import type {\n CAIP25Method,\n CAIP25SessionRequest,\n CAIP25SessionResult,\n ChainScope,\n ActiveSession,\n} from \"../types\";\nimport { DecaneError, DecaneErrorCode } from \"../errors\";\nimport {\n getChainType,\n toCAIP10,\n EVM_METHODS,\n SOLANA_METHODS,\n} from \"../constants\";\nimport { getEvmAddress, addEthereumChain } from \"../evm/adapter\";\nimport { getSolanaAddress } from \"../solana/adapter\";\nimport { eip1193Request } from \"../evm/adapter\";\nimport { walletStandardRequest } from \"../solana/adapter\";\nimport type { Registry } from \"./registry\";\nimport type { SessionManager } from \"./session\";\nimport type { ChainStore } from \"./chainStore\";\n\nexport interface Router {\n request(args: { method: string; params?: unknown[] }): Promise<unknown>;\n}\n\nexport function createRouter(opts: {\n registry: Registry;\n session: SessionManager;\n chainStore: ChainStore;\n}): Router {\n const { registry, session, chainStore } = opts;\n\n async function request(args: {\n method: string;\n params?: unknown[];\n }): Promise<unknown> {\n switch (args.method) {\n case \"wallet_requestPermissions\":\n return handleRequestPermissions(\n args.params as [CAIP25SessionRequest],\n );\n\n case \"wallet_revokePermissions\":\n return handleRevokePermissions();\n\n case \"wallet_getPermissions\":\n return handleGetPermissions();\n\n case \"wallet_sendTransaction\":\n case \"wallet_signMessage\":\n case \"wallet_signTypedData\":\n return handleSigning(args.method, args.params);\n\n default:\n throw new DecaneError(\n DecaneErrorCode.METHOD_NOT_SUPPORTED,\n `Unknown CAIP-25 method: ${args.method}`,\n );\n }\n }\n\n async function handleRequestPermissions([\n req,\n walletIdHint,\n ]: [CAIP25SessionRequest, string?]): Promise<CAIP25SessionResult> {\n const connectedWallet =\n (walletIdHint ? registry.get.byId(walletIdHint) : undefined) ??\n registry.get.all().find((w) => w.id === session.get()?.walletId) ??\n registry.get.all()[0];\n\n if (!connectedWallet) {\n throw new DecaneError(\n DecaneErrorCode.NO_WALLET_CONNECTED,\n \"No wallet connected\",\n );\n }\n\n const allScopes = { ...req.requiredScopes, ...req.optionalScopes };\n const grantedScopes: Record<string, ChainScope> = {};\n\n for (const [chainId, scope] of Object.entries(allScopes)) {\n const chain = chainStore.get(chainId);\n if (!chain) {\n throw new DecaneError(\n DecaneErrorCode.UNSUPPORTED_CHAIN,\n `Unknown chain: ${chainId}`,\n );\n }\n\n const chainType = getChainType(chainId);\n\n if (chainType === \"evm\" && !connectedWallet.evmProvider) continue;\n if (chainType === \"solana\" && !connectedWallet.solanaProvider) continue;\n\n let address: string;\n if (chainType === \"evm\") {\n address = await getEvmAddress(connectedWallet.evmProvider!);\n if (chain.isCustom) {\n await addEthereumChain(\n connectedWallet.evmProvider!,\n chain,\n ).catch(() => {\n // wallet_addEthereumChain may reject if chain already added — ignore\n });\n }\n } else {\n address = await getSolanaAddress(connectedWallet.solanaProvider!);\n }\n\n const methodSet = chainType === \"evm\" ? EVM_METHODS : SOLANA_METHODS;\n const grantedMethods = (scope?.methods ?? []).filter((m) =>\n methodSet.has(m),\n ) as CAIP25Method[];\n\n grantedScopes[chainId] = {\n methods: grantedMethods,\n accounts: [toCAIP10(chainId, address)],\n events: scope?.events ?? [],\n };\n }\n\n // Verify all required scopes were granted\n for (const chainId of Object.keys(req.requiredScopes)) {\n if (!grantedScopes[chainId]) {\n throw new DecaneError(\n DecaneErrorCode.UNSUPPORTED_CHAIN,\n `Required chain ${chainId} could not be granted`,\n );\n }\n }\n\n const newSession: ActiveSession = {\n sessionId: crypto.randomUUID(),\n grantedScopes,\n walletId: connectedWallet.id,\n walletType:\n connectedWallet.chainSupport.length === 2\n ? \"multi\"\n : connectedWallet.chainSupport[0],\n createdAt: Date.now(),\n };\n session.set(newSession);\n\n return { sessionId: newSession.sessionId, grantedScopes };\n }\n\n async function handleRevokePermissions(): Promise<null> {\n session.clear();\n return null;\n }\n\n async function handleGetPermissions(): Promise<CAIP25SessionResult | null> {\n const s = session.get();\n if (!s) return null;\n return { sessionId: s.sessionId, grantedScopes: s.grantedScopes };\n }\n\n function extractSigningContext(\n method: string,\n params: unknown[] | undefined,\n ): { chainId: string; account: string; payload: unknown } {\n if (!params || params.length < 3) {\n throw new DecaneError(\n DecaneErrorCode.METHOD_NOT_SUPPORTED,\n `${method} requires [chainId, account, payload] params`,\n );\n }\n return {\n chainId: params[0] as string,\n account: params[1] as string,\n payload: params[2],\n };\n }\n\n async function handleSigning(\n method: string,\n params: unknown[] | undefined,\n ): Promise<string> {\n const s = session.get();\n if (!s) {\n throw new DecaneError(\n DecaneErrorCode.NO_ACTIVE_SESSION,\n \"No active session. Call wallet_requestPermissions first.\",\n );\n }\n\n const { chainId, account, payload } = extractSigningContext(\n method,\n params,\n );\n const chainType = getChainType(chainId);\n\n session.assertChainInScope(chainId);\n session.assertAccountInScope(chainId, account);\n\n if (method === \"wallet_signTypedData\" && chainType !== \"evm\") {\n throw new DecaneError(\n DecaneErrorCode.EVM_ONLY_METHOD,\n \"wallet_signTypedData is only supported on EVM chains\",\n );\n }\n\n const wallet = registry.get.byId(s.walletId);\n if (!wallet) {\n throw new DecaneError(\n DecaneErrorCode.NO_WALLET_CONNECTED,\n \"Connected wallet not found\",\n );\n }\n\n if (chainType === \"evm\") {\n return eip1193Request(\n wallet.evmProvider!,\n method as CAIP25Method,\n payload,\n account,\n );\n } else {\n return walletStandardRequest(\n wallet.solanaProvider!,\n method as CAIP25Method,\n payload,\n account,\n );\n }\n }\n\n return { request };\n}\n","import type {\n DecaneProvider,\n DecaneConfig,\n UnifiedWalletAccount,\n ChainDescriptor,\n ChainType,\n ActiveSession,\n} from \"./types\";\nimport { DecaneError, DecaneErrorCode } from \"./errors\";\nimport { validateCustomChain } from \"./constants\";\nimport { addEthereumChain } from \"./evm/adapter\";\nimport type { Registry } from \"./core/registry\";\nimport type { SessionManager } from \"./core/session\";\nimport type { ChainStore } from \"./core/chainStore\";\nimport type { Emitter } from \"./core/emitter\";\nimport type { Router } from \"./core/router\";\n\nexport function createProvider(opts: {\n config: DecaneConfig;\n registry: Registry;\n session: SessionManager;\n chainStore: ChainStore;\n router: Router;\n emitter: Emitter;\n}): DecaneProvider {\n const { config, registry, session, chainStore, router, emitter } = opts;\n\n let _connectedWallet: UnifiedWalletAccount | null = null;\n let _activeChain: string | null = config.defaultChain ?? null;\n\n // Restore connected wallet from a persisted session after discovery\n function tryRestoreWallet(w: UnifiedWalletAccount): void {\n const s = session.get();\n if (!s || _connectedWallet) return;\n if (w.id !== s.walletId) return;\n _connectedWallet = w;\n const granted = Object.keys(s.grantedScopes);\n if (!_activeChain || !granted.includes(_activeChain)) {\n _activeChain = granted[0] ?? null;\n }\n emitter.emit(\"connect\", w);\n }\n\n emitter.on(\"walletRegistered\", (w) => tryRestoreWallet(w as UnifiedWalletAccount));\n // Also handle the case where the Solana provider merges in after EVM is already registered\n emitter.on(\"walletUpdated\", (w) => {\n const wallet = w as UnifiedWalletAccount;\n if (_connectedWallet?.id === wallet.id) {\n _connectedWallet = wallet; // keep reference fresh after merge\n } else {\n tryRestoreWallet(wallet);\n }\n });\n\n const provider: DecaneProvider = {\n // ── CAIP-25 request gateway ─────────────────────────────────────────────\n\n request(args) {\n return router.request(args);\n },\n\n on(event, handler) {\n emitter.on(event, handler);\n },\n\n off(event, handler) {\n emitter.off(event, handler);\n },\n\n // ── Registry views ──────────────────────────────────────────────────────\n\n get wallets() {\n return registry.get.all();\n },\n\n get evmWallets() {\n return registry.get.evm();\n },\n\n get solanaWallets() {\n return registry.get.solana();\n },\n\n get multiChainWallets() {\n return registry.get.multiChain();\n },\n\n // ── Connection ──────────────────────────────────────────────────────────\n\n async connect(wallet: UnifiedWalletAccount, preferredChain?: ChainType): Promise<void> {\n if (session.get()) {\n session.clear();\n emitter.emit(\"disconnect\");\n }\n\n _connectedWallet = wallet;\n\n const support = wallet.chainSupport as readonly string[];\n if (support.includes(\"evm\") && (preferredChain !== \"solana\")) {\n _activeChain = config.defaultChain?.startsWith(\"eip155:\")\n ? config.defaultChain\n : \"eip155:1\";\n } else {\n _activeChain = \"solana:mainnet\";\n }\n\n const hasEvm = support.includes(\"evm\") && preferredChain !== \"solana\";\n const hasSol = support.includes(\"solana\") && preferredChain !== \"evm\";\n\n const required: Record<string, { methods: string[]; accounts: string[]; events: string[] }> = {};\n const optional: Record<string, { methods: string[]; accounts: string[]; events: string[] }> = {};\n\n if (hasEvm) {\n required[_activeChain ?? \"eip155:1\"] = {\n methods: [\"wallet_sendTransaction\", \"wallet_signMessage\", \"wallet_signTypedData\"],\n accounts: [],\n events: [\"chainChanged\", \"accountsChanged\"],\n };\n }\n if (hasSol) {\n const solChain = \"solana:mainnet\";\n const scope = {\n methods: [\"wallet_sendTransaction\", \"wallet_signMessage\"],\n accounts: [],\n events: [],\n };\n if (hasEvm) {\n optional[solChain] = scope;\n } else {\n required[solChain] = scope;\n _activeChain = solChain;\n }\n }\n\n await router.request({\n method: \"wallet_requestPermissions\",\n params: [{ requiredScopes: required, optionalScopes: optional }, wallet.id],\n });\n\n const s = session.get();\n if (s) {\n const granted = Object.keys(s.grantedScopes);\n if (_activeChain && !granted.includes(_activeChain)) {\n _activeChain = granted[0] ?? null;\n }\n }\n\n emitter.emit(\"connect\", wallet);\n },\n\n async disconnect(): Promise<void> {\n session.clear();\n _connectedWallet = null;\n _activeChain = null;\n emitter.emit(\"disconnect\");\n },\n\n // ── Custom chain management ─────────────────────────────────────────────\n\n addChain(chain: ChainDescriptor): void {\n if (!validateCustomChain(chain)) {\n throw new DecaneError(\n DecaneErrorCode.INVALID_CHAIN_CONFIG,\n \"Invalid chain descriptor\",\n );\n }\n chainStore.add(chain);\n\n if (_connectedWallet?.evmProvider && chain.type === \"evm\") {\n addEthereumChain(_connectedWallet.evmProvider, chain).catch(() => {});\n }\n\n emitter.emit(\"chainAdded\", chain);\n },\n\n removeChain(chainId: string): void {\n chainStore.remove(chainId);\n\n const s = session.get();\n if (s?.grantedScopes[chainId]) {\n delete (s.grantedScopes as Record<string, unknown>)[chainId];\n session.set(s);\n }\n\n if (_activeChain === chainId) {\n const remaining = Object.keys(session.get()?.grantedScopes ?? {});\n _activeChain = remaining[0] ?? null;\n }\n\n emitter.emit(\"chainRemoved\", chainId);\n },\n\n getChain(chainId: string): ChainDescriptor | undefined {\n return chainStore.get(chainId);\n },\n\n get chains(): ChainDescriptor[] {\n return chainStore.getAll();\n },\n\n // ── State ───────────────────────────────────────────────────────────────\n\n get connectedWallet(): UnifiedWalletAccount | null {\n return _connectedWallet;\n },\n\n get activeSession(): ActiveSession | null {\n return session.get();\n },\n\n get activeChain(): string | null {\n return _activeChain;\n },\n };\n\n return provider;\n}\n","import type { EIP6963AnnounceProviderEvent } from \"../types\";\nimport type { Registry } from \"../core/registry\";\n\nexport function startEvmDiscovery(registry: Registry): void {\n if (typeof window === \"undefined\") return; // SSR guard\n\n const seenUuids = new Set<string>();\n\n window.addEventListener(\n \"eip6963:announceProvider\",\n (event: Event) => {\n const e = event as EIP6963AnnounceProviderEvent;\n const { info, provider } = e.detail;\n\n if (seenUuids.has(info.uuid)) return;\n seenUuids.add(info.uuid);\n\n registry.registerOrMerge({\n chain: \"evm\",\n name: info.name,\n icon: info.icon,\n rdns: info.rdns,\n uuid: info.uuid,\n provider,\n });\n },\n );\n\n window.dispatchEvent(new CustomEvent(\"eip6963:requestProvider\"));\n\n // Re-request after 100ms to catch wallets that load slightly after the SDK\n setTimeout(\n () => window.dispatchEvent(new CustomEvent(\"eip6963:requestProvider\")),\n 100,\n );\n}\n","import { getWallets } from \"@wallet-standard/app\";\nimport type { StandardWallet, WalletWithRdns } from \"../types\";\nimport type { Registry } from \"../core/registry\";\n\nexport function startSolanaDiscovery(registry: Registry): void {\n if (typeof window === \"undefined\") return; // SSR guard\n\n const { get, on } = getWallets();\n\n function register(wallet: StandardWallet): void {\n const required = [\n \"standard:connect\",\n \"solana:signTransaction\",\n \"solana:signMessage\",\n ];\n if (!required.every((f) => f in wallet.features)) return;\n\n registry.registerOrMerge({\n chain: \"solana\",\n name: wallet.name,\n icon: wallet.icon,\n rdns: (wallet as WalletWithRdns).rdns ?? undefined,\n provider: wallet,\n });\n }\n\n (get() as StandardWallet[]).forEach(register);\n\n on(\"register\", (...wallets) =>\n (wallets as StandardWallet[]).forEach(register),\n );\n\n on(\"unregister\", (...wallets) =>\n (wallets as StandardWallet[]).forEach((w) => registry.unregister(w)),\n );\n}\n","import { createEmitter } from \"./core/emitter\";\nimport { createRegistry } from \"./core/registry\";\nimport { createSessionManager } from \"./core/session\";\nimport { createChainStore } from \"./core/chainStore\";\nimport { createRouter } from \"./core/router\";\nimport { createProvider } from \"./provider\";\nimport { startEvmDiscovery } from \"./evm/discovery\";\nimport { startSolanaDiscovery } from \"./solana/discovery\";\nimport { BUILT_IN_CHAINS } from \"./constants\";\nimport type { DecaneConfig, DecaneProvider } from \"./types\";\n\nexport function createDecane(config: DecaneConfig = {}): DecaneProvider {\n const emitter = createEmitter();\n const registry = createRegistry(emitter);\n const session = createSessionManager();\n const builtIn = config.supportedChainIds\n ? BUILT_IN_CHAINS.filter((c) => config.supportedChainIds!.includes(c.id))\n : BUILT_IN_CHAINS;\n\n const chainStore = createChainStore([\n ...builtIn,\n ...(config.chains ?? []),\n ]);\n const router = createRouter({ registry, session, chainStore });\n\n startEvmDiscovery(registry);\n startSolanaDiscovery(registry);\n\n return createProvider({ config, registry, session, chainStore, router, emitter });\n}\n","import React, { useEffect, useCallback, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport type { DecaneProvider, UnifiedWalletAccount, ChainType } from \"../types\";\nimport { CSS_VARS } from \"./styles\";\nimport { WalletIcon } from \"./icons\";\n\ninterface WalletSelectorProps {\n provider: DecaneProvider;\n open: boolean;\n onClose: () => void;\n onConnect: (wallet: UnifiedWalletAccount, preference?: ChainType) => void;\n theme?: \"light\" | \"dark\" | \"auto\";\n networks?: \"evm\" | \"solana\" | \"all\";\n}\n\ntype FilterType = \"all\" | \"evm\" | \"solana\";\n\nconst FONT_URL =\n \"https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap\";\n\nfunction injectTokens(theme: \"light\" | \"dark\" | \"auto\"): void {\n let resolved: \"light\" | \"dark\";\n if (theme === \"auto\") {\n resolved = window.matchMedia(\"(prefers-color-scheme: dark)\").matches\n ? \"dark\"\n : \"light\";\n } else {\n resolved = theme;\n }\n let styleEl = document.getElementById(\"decane-tokens\") as HTMLStyleElement | null;\n if (!styleEl) {\n styleEl = document.createElement(\"style\");\n styleEl.id = \"decane-tokens\";\n document.head.appendChild(styleEl);\n }\n styleEl.textContent = `:root { ${CSS_VARS[resolved]} }`;\n}\n\nfunction injectFont(): void {\n if (document.getElementById(\"decane-font\")) return;\n const link = document.createElement(\"link\");\n link.id = \"decane-font\";\n link.rel = \"stylesheet\";\n link.href = FONT_URL;\n document.head.appendChild(link);\n}\n\nconst badgeBase: React.CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n padding: \"3px 8px\",\n borderRadius: 20,\n fontSize: 10,\n fontWeight: 700,\n letterSpacing: \"0.04em\",\n textTransform: \"uppercase\",\n};\n\nfunction ChainBadges({ chainSupport }: { chainSupport: readonly string[] }) {\n const hasEvm = chainSupport.includes(\"evm\");\n const hasSol = chainSupport.includes(\"solana\");\n return (\n <div style={{ display: \"flex\", gap: 4 }}>\n {hasEvm && (\n <span style={{ ...badgeBase, background: \"var(--dc-badge-evm)\", color: \"var(--dc-badge-evm-text)\" }}>\n EVM\n </span>\n )}\n {hasSol && (\n <span style={{ ...badgeBase, background: \"var(--dc-badge-sol)\", color: \"var(--dc-badge-sol-text)\", border: \"1px solid var(--dc-border)\" }}>\n SVM\n </span>\n )}\n </div>\n );\n}\n\ninterface WalletRowProps {\n wallet: UnifiedWalletAccount;\n onClick: () => void;\n}\n\nfunction WalletRow({ wallet, onClick }: WalletRowProps) {\n const [hovered, setHovered] = useState(false);\n const [focused, setFocused] = useState(false);\n\n return (\n <button\n onClick={onClick}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n onFocus={() => setFocused(true)}\n onBlur={() => setFocused(false)}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n width: \"100%\",\n padding: \"11px 14px\",\n background: hovered ? \"var(--dc-surface-hover)\" : \"transparent\",\n border: focused ? \"1px solid var(--dc-border-accent)\" : \"1px solid transparent\",\n borderRadius: 10,\n cursor: \"pointer\",\n textAlign: \"left\",\n transition: \"background 0.12s, border-color 0.12s\",\n outline: \"none\",\n fontFamily: \"inherit\",\n }}\n >\n <WalletIcon src={wallet.icon || undefined} name={wallet.name} size={38} />\n <span style={{ flex: 1, fontSize: 14, fontWeight: 600, color: \"var(--dc-text)\", letterSpacing: \"-0.01em\" }}>\n {wallet.name}\n </span>\n <ChainBadges chainSupport={wallet.chainSupport} />\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\"\n style={{ color: hovered ? \"var(--dc-text-secondary)\" : \"var(--dc-text-muted)\", flexShrink: 0, transition: \"color 0.12s\" }}>\n <path d=\"M5 2.5L9.5 7L5 11.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n );\n}\n\ninterface FilterTabProps {\n label: string;\n active: boolean;\n onClick: () => void;\n}\n\nfunction FilterTab({ label, active, onClick }: FilterTabProps) {\n const [hovered, setHovered] = useState(false);\n return (\n <button\n onClick={onClick}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n style={{\n flex: 1,\n padding: \"6px 8px\",\n borderRadius: 8,\n border: active ? \"1px solid var(--dc-border-accent)\" : \"1px solid transparent\",\n background: active ? \"rgba(245,200,0,0.1)\" : hovered ? \"var(--dc-surface-hover)\" : \"transparent\",\n color: active ? \"var(--dc-accent)\" : \"var(--dc-text-muted)\",\n fontSize: 11,\n fontWeight: 700,\n letterSpacing: \"0.04em\",\n textTransform: \"uppercase\",\n cursor: \"pointer\",\n transition: \"all 0.12s\",\n fontFamily: \"inherit\",\n outline: \"none\",\n }}\n >\n {label}\n </button>\n );\n}\n\ninterface ChainOptionProps {\n label: string;\n description: string;\n badges: React.ReactNode;\n onClick: () => void;\n}\n\nfunction ChainOption({ label, description, badges, onClick }: ChainOptionProps) {\n const [hovered, setHovered] = useState(false);\n return (\n <button\n onClick={onClick}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"flex-start\",\n gap: 6,\n width: \"100%\",\n padding: \"14px 16px\",\n background: hovered ? \"var(--dc-surface-hover)\" : \"var(--dc-surface)\",\n border: hovered ? \"1px solid var(--dc-border-accent)\" : \"1px solid var(--dc-border)\",\n borderRadius: 12,\n cursor: \"pointer\",\n textAlign: \"left\",\n transition: \"all 0.12s\",\n fontFamily: \"inherit\",\n outline: \"none\",\n }}\n >\n {badges}\n <span style={{ fontSize: 13, fontWeight: 700, color: \"var(--dc-text)\" }}>{label}</span>\n <span style={{ fontSize: 11, color: \"var(--dc-text-muted)\", lineHeight: 1.4 }}>{description}</span>\n </button>\n );\n}\n\nexport function WalletSelector({\n provider,\n open,\n onClose,\n onConnect,\n theme = \"auto\",\n networks = \"all\",\n}: WalletSelectorProps) {\n const [search, setSearch] = useState(\"\");\n const [filter, setFilter] = useState<FilterType>(\"all\");\n const [pendingWallet, setPendingWallet] = useState<UnifiedWalletAccount | null>(null);\n\n useEffect(() => {\n if (!open) return;\n injectFont();\n injectTokens(theme);\n if (theme !== \"auto\") return;\n const mq = window.matchMedia(\"(prefers-color-scheme: dark)\");\n const handler = () => injectTokens(\"auto\");\n mq.addEventListener(\"change\", handler);\n return () => mq.removeEventListener(\"change\", handler);\n }, [open, theme]);\n\n useEffect(() => {\n if (!open) {\n setSearch(\"\");\n setFilter(\"all\");\n setPendingWallet(null);\n return;\n }\n return () => {\n document.getElementById(\"decane-tokens\")?.remove();\n };\n }, [open]);\n\n const handleKey = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n if (pendingWallet) {\n setPendingWallet(null);\n } else {\n onClose();\n }\n }\n },\n [onClose, pendingWallet],\n );\n\n useEffect(() => {\n if (!open) return;\n document.addEventListener(\"keydown\", handleKey);\n return () => document.removeEventListener(\"keydown\", handleKey);\n }, [open, handleKey]);\n\n if (!open) return null;\n\n const q = search.toLowerCase();\n\n // Pre-filter by configured networks before anything else\n const networkWallets = provider.wallets.filter((w) => {\n const cs = w.chainSupport as string[];\n if (networks === \"evm\") return cs.includes(\"evm\");\n if (networks === \"solana\") return cs.includes(\"solana\");\n return true;\n });\n\n const baseWallets =\n filter === \"evm\"\n ? networkWallets.filter((w) => (w.chainSupport as string[]).includes(\"evm\"))\n : filter === \"solana\"\n ? networkWallets.filter((w) => (w.chainSupport as string[]).includes(\"solana\"))\n : networkWallets;\n const filtered = q\n ? baseWallets.filter((w) => w.name.toLowerCase().includes(q))\n : baseWallets;\n\n function handleWalletClick(wallet: UnifiedWalletAccount) {\n const cs = wallet.chainSupport as string[];\n const isMulti = cs.includes(\"evm\") && cs.includes(\"solana\");\n if (isMulti && networks === \"all\") {\n // Show chain picker only when the dApp supports both network types\n setPendingWallet(wallet);\n } else {\n const preference: ChainType | undefined =\n networks === \"evm\" ? \"evm\" :\n networks === \"solana\" ? \"solana\" :\n undefined;\n onConnect(wallet, preference);\n onClose();\n }\n }\n\n function handleChainChoice(preference?: ChainType) {\n if (!pendingWallet) return;\n onConnect(pendingWallet, preference);\n onClose();\n }\n\n const modal = (\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Connect wallet\"\n style={{\n position: \"fixed\",\n inset: 0,\n zIndex: 9999,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"16px\",\n fontFamily: \"var(--dc-font-sans)\",\n }}\n >\n {/* Backdrop */}\n <div\n onClick={() => {\n if (pendingWallet) {\n setPendingWallet(null);\n } else {\n onClose();\n }\n }}\n style={{\n position: \"absolute\",\n inset: 0,\n background: \"var(--dc-bg-overlay)\",\n backdropFilter: \"blur(8px)\",\n WebkitBackdropFilter: \"blur(8px)\",\n }}\n />\n\n {/* Modal card */}\n <div\n style={{\n position: \"relative\",\n background: \"var(--dc-bg)\",\n border: \"1px solid var(--dc-border)\",\n borderRadius: 20,\n width: \"100%\",\n maxWidth: 400,\n maxHeight: \"85vh\",\n display: \"flex\",\n flexDirection: \"column\",\n boxShadow: \"0 24px 64px rgba(0,0,0,0.6), 0 0 0 1px rgba(255,255,255,0.04)\",\n overflow: \"hidden\",\n }}\n >\n {/* Gold top accent */}\n <div\n style={{\n height: 2,\n background: \"linear-gradient(90deg, transparent, var(--dc-accent) 30%, var(--dc-accent) 70%, transparent)\",\n }}\n />\n\n {pendingWallet ? (\n /* ── Chain picker step ───────────────────────────────────────── */\n <>\n {/* Header */}\n <div style={{ padding: \"18px 20px 16px\", display: \"flex\", alignItems: \"center\", gap: 10 }}>\n <button\n onClick={() => setPendingWallet(null)}\n aria-label=\"Back\"\n style={{\n background: \"var(--dc-surface)\",\n border: \"1px solid var(--dc-border)\",\n borderRadius: 8,\n width: 28,\n height: 28,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: \"pointer\",\n color: \"var(--dc-text-muted)\",\n flexShrink: 0,\n fontFamily: \"inherit\",\n padding: 0,\n }}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M7.5 2L3 6l4.5 4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n <h2 style={{ margin: 0, fontSize: 16, fontWeight: 800, color: \"var(--dc-text)\", letterSpacing: \"-0.02em\" }}>\n Choose networks\n </h2>\n <button\n onClick={onClose}\n aria-label=\"Close\"\n style={{\n marginLeft: \"auto\",\n background: \"var(--dc-surface)\",\n border: \"1px solid var(--dc-border)\",\n borderRadius: 8,\n width: 28,\n height: 28,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: \"pointer\",\n color: \"var(--dc-text-muted)\",\n flexShrink: 0,\n fontFamily: \"inherit\",\n padding: 0,\n }}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M1.5 1.5L10.5 10.5M10.5 1.5L1.5 10.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </button>\n </div>\n\n {/* Wallet preview */}\n <div\n style={{\n margin: \"0 20px 16px\",\n padding: \"12px 14px\",\n background: \"var(--dc-surface)\",\n border: \"1px solid var(--dc-border)\",\n borderRadius: 12,\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n }}\n >\n <WalletIcon src={pendingWallet.icon || undefined} name={pendingWallet.name} size={36} />\n <div>\n <div style={{ fontSize: 14, fontWeight: 700, color: \"var(--dc-text)\" }}>{pendingWallet.name}</div>\n <div style={{ fontSize: 11, color: \"var(--dc-text-muted)\", marginTop: 2 }}>Multi-chain wallet detected</div>\n </div>\n </div>\n\n {/* Options */}\n <div style={{ padding: \"0 12px 20px\", display: \"flex\", flexDirection: \"column\", gap: 8 }}>\n <ChainOption\n label=\"EVM networks\"\n description=\"Connect your Ethereum-compatible address only\"\n badges={\n <span style={{ ...badgeBase, background: \"var(--dc-badge-evm)\", color: \"var(--dc-badge-evm-text)\" }}>EVM</span>\n }\n onClick={() => handleChainChoice(\"evm\")}\n />\n <ChainOption\n label=\"Solana network\"\n description=\"Connect your Solana address only\"\n badges={\n <span style={{ ...badgeBase, background: \"var(--dc-badge-sol)\", color: \"var(--dc-badge-sol-text)\", border: \"1px solid var(--dc-border)\" }}>SVM</span>\n }\n onClick={() => handleChainChoice(\"solana\")}\n />\n <ChainOption\n label=\"Both networks\"\n description=\"Connect EVM and Solana addresses together\"\n badges={\n <div style={{ display: \"flex\", gap: 4 }}>\n <span style={{ ...badgeBase, background: \"var(--dc-badge-evm)\", color: \"var(--dc-badge-evm-text)\" }}>EVM</span>\n <span style={{ ...badgeBase, background: \"var(--dc-badge-sol)\", color: \"var(--dc-badge-sol-text)\", border: \"1px solid var(--dc-border)\" }}>SVM</span>\n </div>\n }\n onClick={() => handleChainChoice(undefined)}\n />\n </div>\n </>\n ) : (\n /* ── Wallet list step ────────────────────────────────────────── */\n <>\n {/* Header */}\n <div style={{ padding: \"18px 20px 0\" }}>\n <div style={{ display: \"flex\", alignItems: \"flex-start\", justifyContent: \"space-between\", marginBottom: 14 }}>\n <div>\n <h2 style={{ margin: 0, fontSize: 17, fontWeight: 800, color: \"var(--dc-text)\", letterSpacing: \"-0.02em\", lineHeight: 1.2 }}>\n Connect wallet\n </h2>\n {networkWallets.length > 0 && (\n <p style={{ margin: \"3px 0 0\", fontSize: 12, color: \"var(--dc-text-muted)\" }}>\n {networkWallets.length} wallet{networkWallets.length !== 1 ? \"s\" : \"\"} detected\n </p>\n )}\n </div>\n <button\n onClick={onClose}\n aria-label=\"Close\"\n style={{\n background: \"var(--dc-surface)\",\n border: \"1px solid var(--dc-border)\",\n cursor: \"pointer\",\n padding: 0,\n width: 28,\n height: 28,\n borderRadius: 8,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: \"var(--dc-text-muted)\",\n flexShrink: 0,\n transition: \"background 0.12s, color 0.12s\",\n fontFamily: \"inherit\",\n }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLButtonElement).style.background = \"var(--dc-surface-hover)\";\n (e.currentTarget as HTMLButtonElement).style.color = \"var(--dc-text)\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLButtonElement).style.background = \"var(--dc-surface)\";\n (e.currentTarget as HTMLButtonElement).style.color = \"var(--dc-text-muted)\";\n }}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M1.5 1.5L10.5 10.5M10.5 1.5L1.5 10.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </button>\n </div>\n\n {/* Search */}\n <div style={{ position: \"relative\", marginBottom: 10 }}>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\"\n style={{ position: \"absolute\", left: 10, top: \"50%\", transform: \"translateY(-50%)\", color: \"var(--dc-text-muted)\", pointerEvents: \"none\" }}>\n <circle cx=\"6\" cy=\"6\" r=\"4\" stroke=\"currentColor\" strokeWidth=\"1.4\" />\n <path d=\"M9.5 9.5L12 12\" stroke=\"currentColor\" strokeWidth=\"1.4\" strokeLinecap=\"round\" />\n </svg>\n <input\n type=\"text\"\n placeholder=\"Search wallets…\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n style={{\n width: \"100%\",\n background: \"var(--dc-surface)\",\n border: \"1px solid var(--dc-border)\",\n borderRadius: 10,\n color: \"var(--dc-text)\",\n fontSize: 13,\n padding: \"8px 12px 8px 32px\",\n outline: \"none\",\n fontFamily: \"var(--dc-font-sans)\",\n transition: \"border-color 0.15s\",\n boxSizing: \"border-box\",\n }}\n onFocus={(e) => { e.currentTarget.style.borderColor = \"var(--dc-border-accent)\"; }}\n onBlur={(e) => { e.currentTarget.style.borderColor = \"var(--dc-border)\"; }}\n />\n </div>\n\n {/* Filter tabs — hidden when dApp is locked to one network type */}\n {networks === \"all\" && (\n <div style={{ display: \"flex\", gap: 4, marginBottom: 10 }}>\n <FilterTab label=\"All\" active={filter === \"all\"} onClick={() => setFilter(\"all\")} />\n <FilterTab label=\"EVM\" active={filter === \"evm\"} onClick={() => setFilter(\"evm\")} />\n <FilterTab label=\"Solana\" active={filter === \"solana\"} onClick={() => setFilter(\"solana\")} />\n </div>\n )}\n </div>\n\n {/* Scrollable wallet list */}\n <div style={{ overflowY: \"auto\", flex: 1, padding: \"0 12px 20px\" }}>\n {filtered.length > 0 ? (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 2 }}>\n {filtered.map((w) => (\n <WalletRow key={w.id} wallet={w} onClick={() => handleWalletClick(w)} />\n ))}\n </div>\n ) : (\n <div style={{ textAlign: \"center\", padding: \"32px 16px\", color: \"var(--dc-text-muted)\", fontSize: 13 }}>\n {q ? `No wallets matching \"${q}\"` : \"No wallets detected\"}\n </div>\n )}\n </div>\n\n {/* Footer */}\n <div style={{ padding: \"10px 20px 14px\", borderTop: \"1px solid var(--dc-border)\", textAlign: \"center\", fontSize: 11, color: \"var(--dc-text-muted)\" }}>\n Don't see your wallet? Make sure it's installed and unlocked\n </div>\n </>\n )}\n </div>\n </div>\n );\n\n return createPortal(modal, document.body);\n}\n","export const tokens = {\n // ── Gold palette ──────────────────────────────────────────────────────────\n gold: {\n 50: \"#FFFDF0\",\n 100: \"#FFF8D6\",\n 200: \"#FFEF99\",\n 300: \"#FFE04D\",\n 400: \"#F5C800\", // primary gold — buttons, accents\n 500: \"#D4A800\", // darker gold — hover states\n 600: \"#A37F00\", // deep gold — borders, active\n 700: \"#7A5E00\",\n 800: \"#4D3B00\",\n 900: \"#261D00\",\n },\n\n // ── Black / dark palette ──────────────────────────────────────────────────\n black: {\n 0: \"#FFFFFF\",\n 50: \"#F9F9F7\",\n 100: \"#F0EFEB\",\n 200: \"#DDDCDA\",\n 300: \"#BDBBB8\",\n 400: \"#8A8884\",\n 500: \"#5C5A57\",\n 600: \"#3D3C39\",\n 700: \"#2A2927\",\n 800: \"#1A1917\",\n 900: \"#0D0D0B\",\n 950: \"#070706\",\n },\n\n // ── Semantic tokens — light mode ──────────────────────────────────────────\n light: {\n bg: \"#FFFFFF\",\n bgOverlay: \"rgba(0, 0, 0, 0.55)\",\n surface: \"#F9F9F7\",\n surfaceHover: \"#F0EFEB\",\n border: \"#DDDCDA\",\n borderAccent: \"#F5C800\",\n text: \"#0D0D0B\",\n textSecondary: \"#5C5A57\",\n textMuted: \"#8A8884\",\n accent: \"#F5C800\",\n accentHover: \"#D4A800\",\n accentText: \"#0D0D0B\",\n badgeEvm: \"#1A1917\",\n badgeEvmText: \"#F5C800\",\n badgeSolana: \"#F5C800\",\n badgeSolanaText: \"#0D0D0B\",\n danger: \"#CC3300\",\n },\n\n // ── Semantic tokens — dark mode ───────────────────────────────────────────\n dark: {\n bg: \"#0D0D0B\",\n bgOverlay: \"rgba(0, 0, 0, 0.75)\",\n surface: \"#1A1917\",\n surfaceHover: \"#2A2927\",\n border: \"#3D3C39\",\n borderAccent: \"#F5C800\",\n text: \"#F9F9F7\",\n textSecondary: \"#BDBBB8\",\n textMuted: \"#8A8884\",\n accent: \"#F5C800\",\n accentHover: \"#FFE04D\",\n accentText: \"#0D0D0B\",\n badgeEvm: \"#F5C800\",\n badgeEvmText: \"#0D0D0B\",\n badgeSolana: \"#1A1917\",\n badgeSolanaText: \"#F5C800\",\n danger: \"#FF5533\",\n },\n} as const;\n\n// Font stacks — used by the modal container and all child elements via var()\nexport const FONT_SANS = \"'Plus Jakarta Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\";\nexport const FONT_MONO = \"'JetBrains Mono', 'Fira Code', ui-monospace, monospace\";\n\nexport const CSS_VARS = {\n light: `\n --dc-font-sans: ${FONT_SANS};\n --dc-font-mono: ${FONT_MONO};\n --dc-bg: ${tokens.light.bg};\n --dc-bg-overlay: ${tokens.light.bgOverlay};\n --dc-surface: ${tokens.light.surface};\n --dc-surface-hover: ${tokens.light.surfaceHover};\n --dc-border: ${tokens.light.border};\n --dc-border-accent: ${tokens.light.borderAccent};\n --dc-text: ${tokens.light.text};\n --dc-text-secondary: ${tokens.light.textSecondary};\n --dc-text-muted: ${tokens.light.textMuted};\n --dc-accent: ${tokens.light.accent};\n --dc-accent-hover: ${tokens.light.accentHover};\n --dc-accent-text: ${tokens.light.accentText};\n --dc-badge-evm: ${tokens.light.badgeEvm};\n --dc-badge-evm-text: ${tokens.light.badgeEvmText};\n --dc-badge-sol: ${tokens.light.badgeSolana};\n --dc-badge-sol-text: ${tokens.light.badgeSolanaText};\n --dc-danger: ${tokens.light.danger};\n `,\n dark: `\n --dc-font-sans: ${FONT_SANS};\n --dc-font-mono: ${FONT_MONO};\n --dc-bg: ${tokens.dark.bg};\n --dc-bg-overlay: ${tokens.dark.bgOverlay};\n --dc-surface: ${tokens.dark.surface};\n --dc-surface-hover: ${tokens.dark.surfaceHover};\n --dc-border: ${tokens.dark.border};\n --dc-border-accent: ${tokens.dark.borderAccent};\n --dc-text: ${tokens.dark.text};\n --dc-text-secondary: ${tokens.dark.textSecondary};\n --dc-text-muted: ${tokens.dark.textMuted};\n --dc-accent: ${tokens.dark.accent};\n --dc-accent-hover: ${tokens.dark.accentHover};\n --dc-accent-text: ${tokens.dark.accentText};\n --dc-badge-evm: ${tokens.dark.badgeEvm};\n --dc-badge-evm-text: ${tokens.dark.badgeEvmText};\n --dc-badge-sol: ${tokens.dark.badgeSolana};\n --dc-badge-sol-text: ${tokens.dark.badgeSolanaText};\n --dc-danger: ${tokens.dark.danger};\n `,\n} as const;\n","import React from \"react\";\n\ninterface WalletIconProps {\n src?: string;\n name: string;\n size?: number;\n}\n\nexport function WalletIcon({ src, name, size = 36 }: WalletIconProps) {\n if (src) {\n return (\n <img\n src={src}\n alt={name}\n width={size}\n height={size}\n style={{ borderRadius: size * 0.25, objectFit: \"cover\", flexShrink: 0 }}\n />\n );\n }\n\n const initial = name.charAt(0).toUpperCase();\n return (\n <div\n style={{\n width: size,\n height: size,\n borderRadius: size * 0.25,\n background: \"linear-gradient(135deg, var(--dc-surface-hover), var(--dc-surface-active, var(--dc-surface-hover)))\",\n border: \"1px solid var(--dc-border)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: size * 0.38,\n fontWeight: 800,\n color: \"var(--dc-accent)\",\n flexShrink: 0,\n fontFamily: \"var(--dc-font-sans)\",\n letterSpacing: \"-0.02em\",\n }}\n >\n {initial}\n </div>\n );\n}\n","import React, {\n createContext,\n useCallback,\n useContext,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport { createDecane } from \"../factory\";\nimport { WalletSelector } from \"./WalletSelector\";\nimport type { DecaneProvider, DecaneConfig, UnifiedWalletAccount, ChainType } from \"../types\";\n\nexport type Theme = \"light\" | \"dark\" | \"auto\";\n\ninterface DecaneContextValue {\n provider: DecaneProvider;\n selectorOpen: boolean;\n openSelector: () => void;\n closeSelector: () => void;\n theme: Theme;\n setTheme: (t: Theme) => void;\n}\n\nconst DecaneContext = createContext<DecaneContextValue | null>(null);\n\ninterface DecaneKitProps {\n config?: DecaneConfig;\n children: ReactNode;\n}\n\nexport function DecaneKit({ config, children }: DecaneKitProps) {\n const ref = useRef<DecaneProvider | null>(null);\n if (!ref.current) {\n ref.current = createDecane(config);\n }\n\n const [selectorOpen, setSelectorOpen] = useState(false);\n const [theme, setTheme] = useState<Theme>(config?.theme ?? \"auto\");\n\n const openSelector = useCallback(() => setSelectorOpen(true), []);\n const closeSelector = useCallback(() => setSelectorOpen(false), []);\n\n const handleConnect = useCallback(\n (wallet: UnifiedWalletAccount, preference?: ChainType) => {\n ref.current!.connect(wallet, preference).catch(console.error);\n },\n [],\n );\n\n return (\n <DecaneContext.Provider\n value={{ provider: ref.current, selectorOpen, openSelector, closeSelector, theme, setTheme }}\n >\n {children}\n <WalletSelector\n provider={ref.current}\n open={selectorOpen}\n onClose={closeSelector}\n onConnect={handleConnect}\n theme={theme}\n networks={config?.networks ?? \"all\"}\n />\n </DecaneContext.Provider>\n );\n}\n\nexport function useDecaneContext(): DecaneContextValue {\n const ctx = useContext(DecaneContext);\n if (!ctx) {\n throw new Error(\n \"Decane hooks must be called inside <DecaneKit>. \" +\n \"Wrap your app: <DecaneKit config={...}><App /></DecaneKit>\",\n );\n }\n return ctx;\n}\n","import { useState, useEffect, useCallback } from \"react\";\nimport { useDecaneContext } from \"./context\";\nimport type { DecaneProvider, UnifiedWalletAccount, ChainType, ChainDescriptor } from \"../types\";\nimport { DecaneError, DecaneErrorCode } from \"../errors\";\n\n// ── useDecane ─────────────────────────────────────────────────────────────────\n\nexport function useDecane() {\n const { provider, theme, setTheme } = useDecaneContext();\n const [, forceUpdate] = useState(0);\n\n useEffect(() => {\n const refresh = () => forceUpdate((n) => n + 1);\n const events = [\n \"connect\", \"disconnect\",\n \"walletRegistered\", \"walletUpdated\", \"walletUnregistered\",\n \"chainAdded\", \"chainRemoved\",\n ] as const;\n events.forEach((e) => provider.on(e, refresh));\n return () => events.forEach((e) => provider.off(e, refresh));\n }, [provider]);\n\n return {\n provider,\n wallets: provider.wallets,\n evmWallets: provider.evmWallets,\n solanaWallets: provider.solanaWallets,\n multiChainWallets: provider.multiChainWallets,\n chains: provider.chains,\n connectedWallet: provider.connectedWallet,\n activeSession: provider.activeSession,\n activeChain: provider.activeChain,\n isConnected: !!provider.connectedWallet,\n theme,\n setTheme,\n connect: (wallet: UnifiedWalletAccount, preference?: ChainType) =>\n provider.connect(wallet, preference),\n disconnect: () => provider.disconnect(),\n addChain: (chain: ChainDescriptor) => provider.addChain(chain),\n removeChain: (chainId: string) => provider.removeChain(chainId),\n };\n}\n\n// ── useWalletSelector ─────────────────────────────────────────────────────────\n// Modal is owned by <DecaneKit> — this hook just exposes open/close controls.\n\nexport function useWalletSelector() {\n const { selectorOpen, openSelector, closeSelector } = useDecaneContext();\n return { isOpen: selectorOpen, open: openSelector, close: closeSelector };\n}\n\n// ── useChainSwitch ────────────────────────────────────────────────────────────\n\nexport function useChainSwitch() {\n const { provider } = useDecaneContext();\n const [, forceUpdate] = useState(0);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<DecaneError | null>(null);\n\n useEffect(() => {\n const refresh = () => forceUpdate((n) => n + 1);\n provider.on(\"connect\", refresh);\n provider.on(\"disconnect\", refresh);\n return () => {\n provider.off(\"connect\", refresh);\n provider.off(\"disconnect\", refresh);\n };\n }, [provider]);\n\n const switchChain = useCallback(\n async (chainId: string): Promise<void> => {\n setLoading(true);\n setError(null);\n try {\n const existingScope = provider.activeSession?.grantedScopes[chainId];\n await provider.request({\n method: \"wallet_requestPermissions\",\n params: [\n {\n requiredScopes: {\n [chainId]: existingScope ?? {\n methods: [\"wallet_sendTransaction\", \"wallet_signMessage\"],\n accounts: [],\n events: [],\n },\n },\n optionalScopes: {},\n },\n ],\n });\n forceUpdate((n) => n + 1);\n } catch (err) {\n const e = err instanceof DecaneError\n ? err\n : new DecaneError(DecaneErrorCode.PROVIDER_ERROR, String(err));\n setError(e);\n throw err;\n } finally {\n setLoading(false);\n }\n },\n [provider],\n );\n\n return {\n switchChain,\n loading,\n error,\n activeChain: provider.activeChain,\n grantedChains: provider.activeSession\n ? Object.keys(provider.activeSession.grantedScopes)\n : [],\n };\n}\n\n// ── internal: resolve chain + account from active session ─────────────────────\n\nfunction resolveScope(\n provider: DecaneProvider,\n chainId?: string,\n account?: string,\n): { chain: string; account: string } {\n const chain = chainId ?? provider.activeChain;\n if (!chain) {\n throw new DecaneError(\n DecaneErrorCode.NO_ACTIVE_SESSION,\n \"No active chain — connect a wallet first.\",\n );\n }\n const scope = provider.activeSession?.grantedScopes[chain];\n const resolved = account ?? scope?.accounts[0]?.split(\":\").pop() ?? \"\";\n return { chain, account: resolved };\n}\n\n// ── useSignMessage ────────────────────────────────────────────────────────────\n\nexport function useSignMessage() {\n const { provider } = useDecaneContext();\n const [signature, setSignature] = useState<string | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<DecaneError | null>(null);\n\n const signMessage = useCallback(\n async (\n message: string,\n options?: { chainId?: string; account?: string },\n ): Promise<string> => {\n const { chain, account } = resolveScope(\n provider, options?.chainId, options?.account,\n );\n setLoading(true);\n setError(null);\n try {\n const sig = (await provider.request({\n method: \"wallet_signMessage\",\n params: [chain, account, message],\n })) as string;\n setSignature(sig);\n return sig;\n } catch (err) {\n const e = err instanceof DecaneError\n ? err\n : new DecaneError(DecaneErrorCode.PROVIDER_ERROR, String(err));\n setError(e);\n throw err;\n } finally {\n setLoading(false);\n }\n },\n [provider],\n );\n\n const reset = useCallback(() => { setSignature(null); setError(null); }, []);\n return { signMessage, signature, loading, error, reset };\n}\n\n// ── useSendTransaction ────────────────────────────────────────────────────────\n\nexport interface TxParams {\n to: string;\n value?: string; // decimal wei (\"1000000\") or hex (\"0x0f4240\")\n data?: string;\n gas?: string;\n gasPrice?: string;\n}\n\nexport function useSendTransaction() {\n const { provider } = useDecaneContext();\n const [txHash, setTxHash] = useState<string | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<DecaneError | null>(null);\n\n const sendTransaction = useCallback(\n async (\n tx: TxParams,\n options?: { chainId?: string; from?: string },\n ): Promise<string> => {\n const { chain, account } = resolveScope(\n provider, options?.chainId, options?.from,\n );\n const value = tx.value\n ? tx.value.startsWith(\"0x\")\n ? tx.value\n : `0x${parseInt(tx.value, 10).toString(16)}`\n : \"0x0\";\n\n setLoading(true);\n setError(null);\n try {\n const hash = (await provider.request({\n method: \"wallet_sendTransaction\",\n params: [chain, account, { ...tx, value }],\n })) as string;\n setTxHash(hash);\n return hash;\n } catch (err) {\n const e = err instanceof DecaneError\n ? err\n : new DecaneError(DecaneErrorCode.PROVIDER_ERROR, String(err));\n setError(e);\n throw err;\n } finally {\n setLoading(false);\n }\n },\n [provider],\n );\n\n const reset = useCallback(() => { setTxHash(null); setError(null); }, []);\n return { sendTransaction, txHash, loading, error, reset };\n}\n\n// ── useSignTypedData ──────────────────────────────────────────────────────────\n// EVM only — throws EVM_ONLY_METHOD if called on a Solana chain.\n\nexport function useSignTypedData() {\n const { provider } = useDecaneContext();\n const [signature, setSignature] = useState<string | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<DecaneError | null>(null);\n\n const signTypedData = useCallback(\n async (\n typedData: { domain: unknown; types: unknown; message: unknown },\n options?: { chainId?: string; account?: string },\n ): Promise<string> => {\n const { chain, account } = resolveScope(\n provider, options?.chainId, options?.account,\n );\n setLoading(true);\n setError(null);\n try {\n const sig = (await provider.request({\n method: \"wallet_signTypedData\",\n params: [chain, account, typedData],\n })) as string;\n setSignature(sig);\n return sig;\n } catch (err) {\n const e = err instanceof DecaneError\n ? err\n : new DecaneError(DecaneErrorCode.PROVIDER_ERROR, String(err));\n setError(e);\n throw err;\n } finally {\n setLoading(false);\n }\n },\n [provider],\n );\n\n const reset = useCallback(() => { setSignature(null); setError(null); }, []);\n return { signTypedData, signature, loading, error, reset };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACQO,SAAS,gBAAyB;AACvC,QAAM,YAAY,oBAAI,IAA0B;AAEhD,SAAO;AAAA,IACL,GAAG,OAAO,SAAS;AACjB,UAAI,CAAC,UAAU,IAAI,KAAK,EAAG,WAAU,IAAI,OAAO,oBAAI,IAAI,CAAC;AACzD,gBAAU,IAAI,KAAK,EAAG,IAAI,OAAO;AAAA,IACnC;AAAA,IAEA,IAAI,OAAO,SAAS;AAClB,gBAAU,IAAI,KAAK,GAAG,OAAO,OAAO;AAAA,IACtC;AAAA,IAEA,KAAK,UAAU,MAAM;AACnB,gBAAU,IAAI,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC;AAAA,IACjD;AAAA,EACF;AACF;;;ACJO,SAAS,eAAe,SAA4B;AACzD,QAAM,UAAkC,CAAC;AAEzC,WAAS,cAAc,MAAsB;AAC3C,WAAO,KACJ,YAAY,EACZ,QAAQ,QAAQ,EAAE,EAClB,QAAQ,WAAW,EAAE;AAAA,EAC1B;AAEA,WAAS,UAAU,UAAgD;AACjE,UAAM,KACJ,SAAS,QACT,SAAS,QACT,cAAc,SAAS,IAAI;AAE7B,UAAM,UAAgC;AAAA,MACpC;AAAA,MACA,MAAM,SAAS;AAAA,MACf,MAAM,SAAS;AAAA,MACf,MAAM,SAAS;AAAA,MACf,cAAc,CAAC,SAAS,KAAK;AAAA,IAC/B;AAEA,QAAI,SAAS,UAAU,OAAO;AAC5B,cAAQ,cAAc,SAAS;AAAA,IACjC,OAAO;AACL,cAAQ,iBAAiB,SAAS;AAAA,IACpC;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,UACP,UACA,UACM;AACN,QAAI,CAAC,SAAS,aAAa,SAAS,SAAS,KAAK,GAAG;AACnD,eAAS,eAAe;AAAA,QACtB,GAAG,SAAS;AAAA,QACZ,SAAS;AAAA,MACX,EAAE,KAAK;AAAA,IACT;AACA,QAAI,SAAS,UAAU,OAAO;AAC5B,eAAS,cAAc,SAAS;AAAA,IAClC;AACA,QAAI,SAAS,UAAU,UAAU;AAC/B,eAAS,iBAAiB,SAAS;AAAA,IACrC;AACA,QAAI,CAAC,SAAS,QAAQ,SAAS,KAAM,UAAS,OAAO,SAAS;AAAA,EAChE;AAEA,WAAS,gBAAgB,UAAgC;AAEvD,QAAI,SAAS,MAAM;AACjB,YAAM,WAAW,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,SAAS,IAAI;AAC7D,UAAI,UAAU;AACZ,kBAAU,UAAU,QAAQ;AAC5B,gBAAQ,KAAK,iBAAiB,QAAQ;AACtC;AAAA,MACF;AAAA,IACF;AAMA,QAAI,CAAC,SAAS,MAAM;AAClB,YAAM,OAAO,cAAc,SAAS,IAAI;AACxC,YAAM,WAAW,QAAQ;AAAA,QACvB,CAAC,MAAM,cAAc,EAAE,IAAI,MAAM;AAAA,MACnC;AACA,UAAI,UAAU;AACZ,kBAAU,UAAU,QAAQ;AAC5B,gBAAQ,KAAK,iBAAiB,QAAQ;AACtC;AAAA,MACF;AAAA,IACF;AAGA,UAAM,UAAU,UAAU,QAAQ;AAClC,YAAQ,KAAK,OAAO;AACpB,YAAQ,KAAK,oBAAoB,OAAO;AAAA,EAC1C;AAEA,WAAS,WAAW,UAAgC;AAClD,UAAM,MAAM,QAAQ,UAAU,CAAC,MAAM,EAAE,mBAAmB,QAAQ;AAClE,QAAI,QAAQ,GAAI;AAChB,UAAM,QAAQ,QAAQ,GAAG;AACzB,QAAI,MAAM,aAAa,WAAW,GAAG;AACnC,cAAQ,OAAO,KAAK,CAAC;AACrB,cAAQ,KAAK,sBAAsB,KAAK;AAAA,IAC1C,OAAO;AACL,YAAM,eAAe,CAAC,KAAK;AAC3B,YAAM,iBAAiB;AACvB,cAAQ,KAAK,iBAAiB,KAAK;AAAA,IACrC;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,KAAK;AAAA,MACH,KAAK,MAAM,CAAC,GAAG,OAAO;AAAA,MACtB,KAAK,MAAM,QAAQ,OAAO,CAAC,MAAM,EAAE,aAAa,SAAS,KAAK,CAAC;AAAA,MAC/D,QAAQ,MAAM,QAAQ,OAAO,CAAC,MAAM,EAAE,aAAa,SAAS,QAAQ,CAAC;AAAA,MACrE,YAAY,MACV,QAAQ;AAAA,QACN,CAAC,MACC,EAAE,aAAa,SAAS,KAAK,KAC7B,EAAE,aAAa,SAAS,QAAQ;AAAA,MACpC;AAAA,MACF,MAAM,CAAC,OAAO,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAAA,IAC/C;AAAA,EACF;AACF;;;ACxIO,IAAM,cAAN,cAA0B,MAAM;AAAA,EACrC,YACS,MACP,SACA;AACA,UAAM,OAAO;AAHN;AAIP,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAK,kBAAL,kBAAKA,qBAAL;AAEL,EAAAA,kCAAA,mBAAgB,QAAhB;AACA,EAAAA,kCAAA,kBAAe,QAAf;AAGA,EAAAA,kCAAA,uBAAoB,QAApB;AACA,EAAAA,kCAAA,oBAAiB,QAAjB;AACA,EAAAA,kCAAA,qBAAkB,QAAlB;AAGA,EAAAA,kCAAA,uBAAoB,QAApB;AACA,EAAAA,kCAAA,wBAAqB,QAArB;AACA,EAAAA,kCAAA,0BAAuB,QAAvB;AAGA,EAAAA,kCAAA,yBAAsB,QAAtB;AACA,EAAAA,kCAAA,yBAAsB,QAAtB;AACA,EAAAA,kCAAA,oBAAiB,QAAjB;AAGA,EAAAA,kCAAA,0BAAuB,QAAvB;AACA,EAAAA,kCAAA,qBAAkB,QAAlB;AAtBU,SAAAA;AAAA,GAAA;;;ACNZ,IAAM,MAAM,EAAE,MAAM,SAAS,QAAQ,OAAO,UAAU,GAAG;AACzD,IAAM,MAAM,EAAE,MAAM,OAAO,QAAQ,OAAO,UAAU,EAAE;AAE/C,IAAM,kBAAqC;AAAA;AAAA,EAEhD;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB,EAAE,MAAM,OAAO,QAAQ,OAAO,UAAU,GAAG;AAAA,IAC3D,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB,EAAE,MAAM,SAAS,QAAQ,SAAS,UAAU,GAAG;AAAA,IAC/D,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA;AAAA,EAGA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB,EAAE,MAAM,SAAS,QAAQ,SAAS,UAAU,GAAG;AAAA,IAC/D,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB,EAAE,MAAM,WAAW,QAAQ,OAAO,UAAU,GAAG;AAAA,IAC/D,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB,EAAE,MAAM,aAAa,QAAQ,QAAQ,UAAU,GAAG;AAAA,IAClE,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB,EAAE,MAAM,QAAQ,QAAQ,QAAQ,UAAU,GAAG;AAAA,IAC7D,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB,EAAE,MAAM,QAAQ,QAAQ,QAAQ,UAAU,GAAG;AAAA,IAC7D,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB,EAAE,MAAM,WAAW,QAAQ,QAAQ,UAAU,GAAG;AAAA,IAChE,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB,EAAE,MAAM,UAAU,QAAQ,OAAO,UAAU,GAAG;AAAA,IAC9D,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB,EAAE,MAAM,SAAS,QAAQ,SAAS,UAAU,GAAG;AAAA,IAC/D,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB,EAAE,MAAM,QAAQ,QAAQ,QAAQ,UAAU,GAAG;AAAA,IAC7D,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB,EAAE,MAAM,QAAQ,QAAQ,QAAQ,UAAU,GAAG;AAAA,IAC7D,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB,EAAE,MAAM,QAAQ,QAAQ,QAAQ,UAAU,GAAG;AAAA,IAC7D,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB,EAAE,MAAM,OAAO,QAAQ,OAAO,UAAU,GAAG;AAAA,IAC3D,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB,EAAE,MAAM,SAAS,QAAQ,SAAS,UAAU,GAAG;AAAA,IAC/D,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB,EAAE,MAAM,OAAO,QAAQ,OAAO,UAAU,GAAG;AAAA,IAC3D,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB,EAAE,MAAM,SAAS,QAAQ,SAAS,UAAU,GAAG;AAAA,IAC/D,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB,EAAE,MAAM,OAAO,QAAQ,OAAO,UAAU,GAAG;AAAA,IAC3D,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB,EAAE,MAAM,OAAO,QAAQ,OAAO,UAAU,GAAG;AAAA,IAC3D,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB,EAAE,MAAM,OAAO,QAAQ,OAAO,UAAU,GAAG;AAAA,IAC3D,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB,EAAE,MAAM,SAAS,QAAQ,KAAK,UAAU,GAAG;AAAA,IAC3D,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB,EAAE,MAAM,MAAM,QAAQ,MAAM,UAAU,GAAG;AAAA,IACzD,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,kBAAkB;AAAA,EACpB;AAAA;AAAA,EAGA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA;AAAA,EAGA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,EACpB;AACF;AAYO,SAAS,aAAa,SAAmC;AAC9D,MAAI,QAAQ,WAAW,SAAS,EAAG,QAAO;AAC1C,MAAI,QAAQ,WAAW,SAAS,EAAG,QAAO;AAC1C,QAAM,IAAI,MAAM,qCAAqC,OAAO,EAAE;AAChE;AAIO,SAAS,SAAS,SAAiB,SAAyB;AACjE,SAAO,GAAG,OAAO,IAAI,OAAO;AAC9B;AASO,IAAM,cAAc,oBAAI,IAAI;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,IAAM,iBAAiB,oBAAI,IAAI;AAAA,EACpC;AAAA,EACA;AAAA;AAEF,CAAC;AAIM,IAAM,SAAS;AAAA;AAAA,EAEpB,UAAgB;AAAA,EAChB,MAAgB;AAAA,EAChB,UAAgB;AAAA,EAChB,UAAgB;AAAA,EAChB,KAAgB;AAAA,EAChB,SAAgB;AAAA;AAAA,EAEhB,UAAgB;AAAA,EAChB,UAAgB;AAAA,EAChB,YAAgB;AAAA,EAChB,WAAgB;AAAA,EAChB,eAAgB;AAAA,EAChB,WAAgB;AAAA,EAChB,IAAgB;AAAA,EAChB,WAAgB;AAAA,EAChB,OAAgB;AAAA,EAChB,KAAgB;AAAA,EAChB,MAAgB;AAAA,EAChB,MAAgB;AAAA,EAChB,MAAgB;AAAA,EAChB,QAAgB;AAAA,EAChB,OAAgB;AAAA,EAChB,OAAgB;AAAA,EAChB,UAAgB;AAAA,EAChB,QAAgB;AAAA,EAChB,MAAgB;AAAA,EAChB,MAAgB;AAAA,EAChB,WAAgB;AAAA,EAChB,KAAgB;AAAA,EAChB,OAAgB;AAAA,EAChB,MAAgB;AAAA,EAChB,eAAgB;AAAA,EAChB,QAAgB;AAAA,EAChB,UAAgB;AAAA,EAChB,OAAgB;AAAA,EAChB,MAAgB;AAAA,EAChB,OAAgB;AAAA,EAChB,OAAgB;AAAA,EAChB,OAAgB;AAAA,EAChB,MAAgB;AAAA,EAChB,UAAgB;AAAA,EAChB,OAAgB;AAAA,EAChB,QAAgB;AAAA,EAChB,KAAgB;AAAA,EAChB,OAAgB;AAAA,EAChB,QAAgB;AAAA,EAChB,SAAgB;AAAA,EAChB,OAAgB;AAAA,EAChB,OAAgB;AAAA,EAChB,eAAgB;AAAA,EAChB,WAAgB;AAAA,EAChB,aAAgB;AAAA,EAChB,OAAgB;AAAA,EAChB,UAAgB;AAAA,EAChB,aAAgB;AAAA,EAChB,MAAgB;AAAA,EAChB,SAAgB;AAAA,EAChB,YAAgB;AAAA,EAChB,MAAgB;AAAA;AAAA,EAEhB,WAAgB;AAAA;AAAA,EAEhB,QAAgB;AAAA,EAChB,eAAgB;AAClB;AAMO,SAAS,oBAAoB,OAA0C;AAC5E,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,QAAM,IAAI;AACV,MAAI,OAAO,EAAE,OAAO,YAAY,CAAC,EAAE,GAAI,QAAO;AAC9C,MAAI,EAAE,SAAS,SAAS,EAAE,SAAS,SAAU,QAAO;AACpD,MAAI,OAAO,EAAE,SAAS,YAAY,CAAC,EAAE,KAAM,QAAO;AAClD,MAAI,CAAC,EAAE,kBAAkB,OAAO,EAAE,mBAAmB,SAAU,QAAO;AACtE,MAAI,EAAE,SAAS,UAAU,OAAO,EAAE,YAAY,YAAY,CAAC,EAAE,GAAG,WAAW,SAAS;AAClF,WAAO;AACT,MAAI,EAAE,SAAS,YAAY,CAAC,EAAE,GAAG,WAAW,SAAS,EAAG,QAAO;AAC/D,SAAO;AACT;;;AC5qBA,IAAM,cAAc;AAEpB,SAAS,kBAAwC;AAC/C,MAAI,OAAO,iBAAiB,YAAa,QAAO;AAChD,MAAI;AACF,UAAM,MAAM,aAAa,QAAQ,WAAW;AAC5C,WAAO,MAAO,KAAK,MAAM,GAAG,IAAsB;AAAA,EACpD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,cAAc,SAAqC;AAC1D,MAAI,OAAO,iBAAiB,YAAa;AACzC,MAAI;AACF,QAAI,SAAS;AACX,mBAAa,QAAQ,aAAa,KAAK,UAAU,OAAO,CAAC;AAAA,IAC3D,OAAO;AACL,mBAAa,WAAW,WAAW;AAAA,IACrC;AAAA,EACF,QAAQ;AAAA,EAER;AACF;AAYO,SAAS,uBAAuC;AAErD,MAAI,WAAiC,gBAAgB;AAErD,SAAO;AAAA,IACL,KAAK,MAAM;AAAA,IAEX,IAAI,GAAG;AACL,iBAAW;AACX,oBAAc,CAAC;AAAA,IACjB;AAAA,IAEA,QAAQ;AACN,iBAAW;AACX,oBAAc,IAAI;AAAA,IACpB;AAAA,IAEA,eAAe,SAAS;AACtB,aAAO,CAAC,CAAC,UAAU,cAAc,OAAO;AAAA,IAC1C;AAAA,IAEA,iBAAiB,SAAS,SAAS;AACjC,YAAM,QAAQ,UAAU,cAAc,OAAO;AAC7C,UAAI,CAAC,MAAO,QAAO;AACnB,aAAO,MAAM,SAAS,SAAS,SAAS,SAAS,OAAO,CAAC;AAAA,IAC3D;AAAA,IAEA,mBAAmB,SAAS;AAC1B,UAAI,CAAC,KAAK,eAAe,OAAO,GAAG;AACjC,cAAM,IAAI;AAAA;AAAA,UAER,SAAS,OAAO;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAAA,IAEA,qBAAqB,SAAS,SAAS;AACrC,UAAI,CAAC,KAAK,iBAAiB,SAAS,OAAO,GAAG;AAC5C,cAAM,IAAI;AAAA;AAAA,UAER,WAAW,OAAO,aAAa,OAAO;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AC1EO,SAAS,iBAAiB,SAAwC;AACvE,QAAM,SAAS,IAAI;AAAA,IACjB,QAAQ,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;AAAA,EAC9B;AAEA,SAAO;AAAA,IACL,IAAI,IAAI;AACN,aAAO,OAAO,IAAI,EAAE;AAAA,IACtB;AAAA,IAEA,SAAS;AACP,aAAO,CAAC,GAAG,OAAO,OAAO,CAAC;AAAA,IAC5B;AAAA,IAEA,IAAI,OAAO;AACT,UAAI,OAAO,IAAI,MAAM,EAAE,GAAG;AACxB,cAAM,IAAI;AAAA;AAAA,UAER,SAAS,MAAM,EAAE;AAAA,QACnB;AAAA,MACF;AACA,aAAO,IAAI,MAAM,IAAI,KAAK;AAAA,IAC5B;AAAA,IAEA,OAAO,IAAI;AACT,YAAM,QAAQ,OAAO,IAAI,EAAE;AAC3B,UAAI,CAAC,MAAO;AACZ,UAAI,CAAC,MAAM,UAAU;AACnB,cAAM,IAAI;AAAA;AAAA,UAER,gCAAgC,EAAE;AAAA,QACpC;AAAA,MACF;AACA,aAAO,OAAO,EAAE;AAAA,IAClB;AAAA,EACF;AACF;;;AC3CA,eAAsB,eACpB,UACA,QACA,SACA,SACiB;AACjB,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO,SAAS,QAAQ;AAAA,QACtB,QAAQ;AAAA,QACR,QAAQ,CAAC,EAAE,GAAI,SAAoB,MAAM,QAAQ,CAAC;AAAA,MACpD,CAAC;AAAA,IAEH,KAAK;AAEH,aAAO,SAAS,QAAQ;AAAA,QACtB,QAAQ;AAAA,QACR,QAAQ,CAAC,SAAS,OAAO;AAAA,MAC3B,CAAC;AAAA,IAEH,KAAK;AAEH,aAAO,SAAS,QAAQ;AAAA,QACtB,QAAQ;AAAA,QACR,QAAQ,CAAC,SAAS,KAAK,UAAU,OAAO,CAAC;AAAA,MAC3C,CAAC;AAAA,IAEH;AACE,YAAM,IAAI;AAAA;AAAA,QAER,mCAAmC,MAAM;AAAA,MAC3C;AAAA,EACJ;AACF;AAEA,eAAsB,cACpB,UACiB;AACjB,QAAM,WAAY,MAAM,SAAS,QAAQ;AAAA,IACvC,QAAQ;AAAA,EACV,CAAC;AACD,MAAI,CAAC,WAAW,CAAC,GAAG;AAClB,UAAM,IAAI;AAAA;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACA,SAAO,SAAS,CAAC;AACnB;AAGA,eAAsB,iBACpB,UACA,OACe;AACf,QAAM,SAAS,QAAQ;AAAA,IACrB,QAAQ;AAAA,IACR,QAAQ;AAAA,MACN;AAAA,QACE,SAAS,KAAK,MAAM,QAAS,SAAS,EAAE,CAAC;AAAA,QACzC,WAAW,MAAM;AAAA,QACjB,gBAAgB,MAAM;AAAA,QACtB,SAAS,MAAM,SAAS,CAAC,MAAM,MAAM,IAAI,CAAC;AAAA,QAC1C,mBAAmB,MAAM,mBACrB,CAAC,MAAM,gBAAgB,IACvB,CAAC;AAAA,MACP;AAAA,IACF;AAAA,EACF,CAAC;AACH;;;ACxEA,kBAAuB;AAwBvB,SAAS,6BAA6B,MAAwB;AAE5D,SAAO;AACT;AAEA,eAAsB,sBACpB,QACA,QACA,SACA,SACiB;AACjB,UAAQ,QAAQ;AAAA,IACd,KAAK,0BAA0B;AAC7B,YAAM,UAAU,OAAO,SACrB,+BACF;AACA,UAAI,CAAC,SAAS;AACZ,cAAM,IAAI;AAAA;AAAA,UAER;AAAA,QACF;AAAA,MACF;AACA,YAAM,gBAAgB,OAAO,SAAS;AAAA,QACpC,CAAC,MAAM,mBAAO,OAAO,EAAE,SAAS,MAAM;AAAA,MACxC;AACA,UAAI,CAAC,eAAe;AAClB,cAAM,IAAI;AAAA;AAAA,UAER,WAAW,OAAO;AAAA,QACpB;AAAA,MACF;AACA,YAAM,KAAK,6BAA6B,OAAO;AAC/C,YAAM,CAAC,MAAM,IAAI,MAAM,QAAQ,uBAAuB;AAAA,QACpD,aAAa;AAAA,QACb,SAAS;AAAA,MACX,CAAC;AACD,aAAO,OAAO;AAAA,IAChB;AAAA,IAEA,KAAK,sBAAsB;AACzB,YAAM,UAAU,OAAO,SACrB,oBACF;AACA,UAAI,CAAC,SAAS;AACZ,cAAM,IAAI;AAAA;AAAA,UAER;AAAA,QACF;AAAA,MACF;AACA,YAAM,gBAAgB,OAAO,SAAS;AAAA,QACpC,CAAC,MAAM,mBAAO,OAAO,EAAE,SAAS,MAAM;AAAA,MACxC;AACA,UAAI,CAAC,eAAe;AAClB,cAAM,IAAI;AAAA;AAAA,UAER,WAAW,OAAO;AAAA,QACpB;AAAA,MACF;AACA,YAAM,eACJ,OAAO,YAAY,WACf,IAAI,YAAY,EAAE,OAAO,OAAO,IAC/B;AACP,YAAM,CAAC,MAAM,IAAI,MAAM,QAAQ,YAAY;AAAA,QACzC,SAAS;AAAA,QACT,SAAS;AAAA,MACX,CAAC;AACD,aAAO,mBAAO,OAAO,OAAO,SAAS;AAAA,IACvC;AAAA,IAEA;AACE,YAAM,IAAI;AAAA;AAAA,QAER,sCAAsC,MAAM;AAAA,MAC9C;AAAA,EACJ;AACF;AAEA,eAAsB,iBACpB,QACiB;AACjB,QAAM,iBAAiB,OAAO,SAC5B,kBACF;AACA,MAAI,CAAC,gBAAgB;AACnB,UAAM,IAAI;AAAA;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACA,QAAM,EAAE,SAAS,IAAI,MAAM,eAAe,QAAQ;AAClD,MAAI,CAAC,WAAW,CAAC,GAAG;AAClB,UAAM,IAAI;AAAA;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACA,SAAO,mBAAO,OAAO,SAAS,CAAC,EAAE,SAAS;AAC5C;;;AC/FO,SAAS,aAAa,MAIlB;AACT,QAAM,EAAE,UAAU,SAAS,WAAW,IAAI;AAE1C,iBAAe,QAAQ,MAGF;AACnB,YAAQ,KAAK,QAAQ;AAAA,MACnB,KAAK;AACH,eAAO;AAAA,UACL,KAAK;AAAA,QACP;AAAA,MAEF,KAAK;AACH,eAAO,wBAAwB;AAAA,MAEjC,KAAK;AACH,eAAO,qBAAqB;AAAA,MAE9B,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,eAAO,cAAc,KAAK,QAAQ,KAAK,MAAM;AAAA,MAE/C;AACE,cAAM,IAAI;AAAA;AAAA,UAER,2BAA2B,KAAK,MAAM;AAAA,QACxC;AAAA,IACJ;AAAA,EACF;AAEA,iBAAe,yBAAyB;AAAA,IACtC;AAAA,IACA;AAAA,EACF,GAAkE;AAChE,UAAM,mBACH,eAAe,SAAS,IAAI,KAAK,YAAY,IAAI,WAClD,SAAS,IAAI,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,QAAQ,IAAI,GAAG,QAAQ,KAC/D,SAAS,IAAI,IAAI,EAAE,CAAC;AAEtB,QAAI,CAAC,iBAAiB;AACpB,YAAM,IAAI;AAAA;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAEA,UAAM,YAAY,EAAE,GAAG,IAAI,gBAAgB,GAAG,IAAI,eAAe;AACjE,UAAM,gBAA4C,CAAC;AAEnD,eAAW,CAAC,SAAS,KAAK,KAAK,OAAO,QAAQ,SAAS,GAAG;AACxD,YAAM,QAAQ,WAAW,IAAI,OAAO;AACpC,UAAI,CAAC,OAAO;AACV,cAAM,IAAI;AAAA;AAAA,UAER,kBAAkB,OAAO;AAAA,QAC3B;AAAA,MACF;AAEA,YAAM,YAAY,aAAa,OAAO;AAEtC,UAAI,cAAc,SAAS,CAAC,gBAAgB,YAAa;AACzD,UAAI,cAAc,YAAY,CAAC,gBAAgB,eAAgB;AAE/D,UAAI;AACJ,UAAI,cAAc,OAAO;AACvB,kBAAU,MAAM,cAAc,gBAAgB,WAAY;AAC1D,YAAI,MAAM,UAAU;AAClB,gBAAM;AAAA,YACJ,gBAAgB;AAAA,YAChB;AAAA,UACF,EAAE,MAAM,MAAM;AAAA,UAEd,CAAC;AAAA,QACH;AAAA,MACF,OAAO;AACL,kBAAU,MAAM,iBAAiB,gBAAgB,cAAe;AAAA,MAClE;AAEA,YAAM,YAAY,cAAc,QAAQ,cAAc;AACtD,YAAM,kBAAkB,OAAO,WAAW,CAAC,GAAG;AAAA,QAAO,CAAC,MACpD,UAAU,IAAI,CAAC;AAAA,MACjB;AAEA,oBAAc,OAAO,IAAI;AAAA,QACvB,SAAS;AAAA,QACT,UAAU,CAAC,SAAS,SAAS,OAAO,CAAC;AAAA,QACrC,QAAQ,OAAO,UAAU,CAAC;AAAA,MAC5B;AAAA,IACF;AAGA,eAAW,WAAW,OAAO,KAAK,IAAI,cAAc,GAAG;AACrD,UAAI,CAAC,cAAc,OAAO,GAAG;AAC3B,cAAM,IAAI;AAAA;AAAA,UAER,kBAAkB,OAAO;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AAEA,UAAM,aAA4B;AAAA,MAChC,WAAW,OAAO,WAAW;AAAA,MAC7B;AAAA,MACA,UAAU,gBAAgB;AAAA,MAC1B,YACE,gBAAgB,aAAa,WAAW,IACpC,UACA,gBAAgB,aAAa,CAAC;AAAA,MACpC,WAAW,KAAK,IAAI;AAAA,IACtB;AACA,YAAQ,IAAI,UAAU;AAEtB,WAAO,EAAE,WAAW,WAAW,WAAW,cAAc;AAAA,EAC1D;AAEA,iBAAe,0BAAyC;AACtD,YAAQ,MAAM;AACd,WAAO;AAAA,EACT;AAEA,iBAAe,uBAA4D;AACzE,UAAM,IAAI,QAAQ,IAAI;AACtB,QAAI,CAAC,EAAG,QAAO;AACf,WAAO,EAAE,WAAW,EAAE,WAAW,eAAe,EAAE,cAAc;AAAA,EAClE;AAEA,WAAS,sBACP,QACA,QACwD;AACxD,QAAI,CAAC,UAAU,OAAO,SAAS,GAAG;AAChC,YAAM,IAAI;AAAA;AAAA,QAER,GAAG,MAAM;AAAA,MACX;AAAA,IACF;AACA,WAAO;AAAA,MACL,SAAS,OAAO,CAAC;AAAA,MACjB,SAAS,OAAO,CAAC;AAAA,MACjB,SAAS,OAAO,CAAC;AAAA,IACnB;AAAA,EACF;AAEA,iBAAe,cACb,QACA,QACiB;AACjB,UAAM,IAAI,QAAQ,IAAI;AACtB,QAAI,CAAC,GAAG;AACN,YAAM,IAAI;AAAA;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAEA,UAAM,EAAE,SAAS,SAAS,QAAQ,IAAI;AAAA,MACpC;AAAA,MACA;AAAA,IACF;AACA,UAAM,YAAY,aAAa,OAAO;AAEtC,YAAQ,mBAAmB,OAAO;AAClC,YAAQ,qBAAqB,SAAS,OAAO;AAE7C,QAAI,WAAW,0BAA0B,cAAc,OAAO;AAC5D,YAAM,IAAI;AAAA;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAEA,UAAM,SAAS,SAAS,IAAI,KAAK,EAAE,QAAQ;AAC3C,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI;AAAA;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAEA,QAAI,cAAc,OAAO;AACvB,aAAO;AAAA,QACL,OAAO;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,OAAO;AACL,aAAO;AAAA,QACL,OAAO;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,QAAQ;AACnB;;;ACpNO,SAAS,eAAe,MAOZ;AACjB,QAAM,EAAE,QAAQ,UAAU,SAAS,YAAY,QAAQ,QAAQ,IAAI;AAEnE,MAAI,mBAAgD;AACpD,MAAI,eAA8B,OAAO,gBAAgB;AAGzD,WAAS,iBAAiB,GAA+B;AACvD,UAAM,IAAI,QAAQ,IAAI;AACtB,QAAI,CAAC,KAAK,iBAAkB;AAC5B,QAAI,EAAE,OAAO,EAAE,SAAU;AACzB,uBAAmB;AACnB,UAAM,UAAU,OAAO,KAAK,EAAE,aAAa;AAC3C,QAAI,CAAC,gBAAgB,CAAC,QAAQ,SAAS,YAAY,GAAG;AACpD,qBAAe,QAAQ,CAAC,KAAK;AAAA,IAC/B;AACA,YAAQ,KAAK,WAAW,CAAC;AAAA,EAC3B;AAEA,UAAQ,GAAG,oBAAoB,CAAC,MAAM,iBAAiB,CAAyB,CAAC;AAEjF,UAAQ,GAAG,iBAAiB,CAAC,MAAM;AACjC,UAAM,SAAS;AACf,QAAI,kBAAkB,OAAO,OAAO,IAAI;AACtC,yBAAmB;AAAA,IACrB,OAAO;AACL,uBAAiB,MAAM;AAAA,IACzB;AAAA,EACF,CAAC;AAED,QAAM,WAA2B;AAAA;AAAA,IAG/B,QAAQ,MAAM;AACZ,aAAO,OAAO,QAAQ,IAAI;AAAA,IAC5B;AAAA,IAEA,GAAG,OAAO,SAAS;AACjB,cAAQ,GAAG,OAAO,OAAO;AAAA,IAC3B;AAAA,IAEA,IAAI,OAAO,SAAS;AAClB,cAAQ,IAAI,OAAO,OAAO;AAAA,IAC5B;AAAA;AAAA,IAIA,IAAI,UAAU;AACZ,aAAO,SAAS,IAAI,IAAI;AAAA,IAC1B;AAAA,IAEA,IAAI,aAAa;AACf,aAAO,SAAS,IAAI,IAAI;AAAA,IAC1B;AAAA,IAEA,IAAI,gBAAgB;AAClB,aAAO,SAAS,IAAI,OAAO;AAAA,IAC7B;AAAA,IAEA,IAAI,oBAAoB;AACtB,aAAO,SAAS,IAAI,WAAW;AAAA,IACjC;AAAA;AAAA,IAIA,MAAM,QAAQ,QAA8B,gBAA2C;AACrF,UAAI,QAAQ,IAAI,GAAG;AACjB,gBAAQ,MAAM;AACd,gBAAQ,KAAK,YAAY;AAAA,MAC3B;AAEA,yBAAmB;AAEnB,YAAM,UAAU,OAAO;AACvB,UAAI,QAAQ,SAAS,KAAK,KAAM,mBAAmB,UAAW;AAC5D,uBAAe,OAAO,cAAc,WAAW,SAAS,IACpD,OAAO,eACP;AAAA,MACN,OAAO;AACL,uBAAe;AAAA,MACjB;AAEA,YAAM,SAAS,QAAQ,SAAS,KAAK,KAAK,mBAAmB;AAC7D,YAAM,SAAS,QAAQ,SAAS,QAAQ,KAAK,mBAAmB;AAEhE,YAAM,WAAwF,CAAC;AAC/F,YAAM,WAAwF,CAAC;AAE/F,UAAI,QAAQ;AACV,iBAAS,gBAAgB,UAAU,IAAI;AAAA,UACrC,SAAS,CAAC,0BAA0B,sBAAsB,sBAAsB;AAAA,UAChF,UAAU,CAAC;AAAA,UACX,QAAQ,CAAC,gBAAgB,iBAAiB;AAAA,QAC5C;AAAA,MACF;AACA,UAAI,QAAQ;AACV,cAAM,WAAW;AACjB,cAAM,QAAQ;AAAA,UACZ,SAAS,CAAC,0BAA0B,oBAAoB;AAAA,UACxD,UAAU,CAAC;AAAA,UACX,QAAQ,CAAC;AAAA,QACX;AACA,YAAI,QAAQ;AACV,mBAAS,QAAQ,IAAI;AAAA,QACvB,OAAO;AACL,mBAAS,QAAQ,IAAI;AACrB,yBAAe;AAAA,QACjB;AAAA,MACF;AAEA,YAAM,OAAO,QAAQ;AAAA,QACnB,QAAQ;AAAA,QACR,QAAQ,CAAC,EAAE,gBAAgB,UAAU,gBAAgB,SAAS,GAAG,OAAO,EAAE;AAAA,MAC5E,CAAC;AAED,YAAM,IAAI,QAAQ,IAAI;AACtB,UAAI,GAAG;AACL,cAAM,UAAU,OAAO,KAAK,EAAE,aAAa;AAC3C,YAAI,gBAAgB,CAAC,QAAQ,SAAS,YAAY,GAAG;AACnD,yBAAe,QAAQ,CAAC,KAAK;AAAA,QAC/B;AAAA,MACF;AAEA,cAAQ,KAAK,WAAW,MAAM;AAAA,IAChC;AAAA,IAEA,MAAM,aAA4B;AAChC,cAAQ,MAAM;AACd,yBAAmB;AACnB,qBAAe;AACf,cAAQ,KAAK,YAAY;AAAA,IAC3B;AAAA;AAAA,IAIA,SAAS,OAA8B;AACrC,UAAI,CAAC,oBAAoB,KAAK,GAAG;AAC/B,cAAM,IAAI;AAAA;AAAA,UAER;AAAA,QACF;AAAA,MACF;AACA,iBAAW,IAAI,KAAK;AAEpB,UAAI,kBAAkB,eAAe,MAAM,SAAS,OAAO;AACzD,yBAAiB,iBAAiB,aAAa,KAAK,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AAAA,MACtE;AAEA,cAAQ,KAAK,cAAc,KAAK;AAAA,IAClC;AAAA,IAEA,YAAY,SAAuB;AACjC,iBAAW,OAAO,OAAO;AAEzB,YAAM,IAAI,QAAQ,IAAI;AACtB,UAAI,GAAG,cAAc,OAAO,GAAG;AAC7B,eAAQ,EAAE,cAA0C,OAAO;AAC3D,gBAAQ,IAAI,CAAC;AAAA,MACf;AAEA,UAAI,iBAAiB,SAAS;AAC5B,cAAM,YAAY,OAAO,KAAK,QAAQ,IAAI,GAAG,iBAAiB,CAAC,CAAC;AAChE,uBAAe,UAAU,CAAC,KAAK;AAAA,MACjC;AAEA,cAAQ,KAAK,gBAAgB,OAAO;AAAA,IACtC;AAAA,IAEA,SAAS,SAA8C;AACrD,aAAO,WAAW,IAAI,OAAO;AAAA,IAC/B;AAAA,IAEA,IAAI,SAA4B;AAC9B,aAAO,WAAW,OAAO;AAAA,IAC3B;AAAA;AAAA,IAIA,IAAI,kBAA+C;AACjD,aAAO;AAAA,IACT;AAAA,IAEA,IAAI,gBAAsC;AACxC,aAAO,QAAQ,IAAI;AAAA,IACrB;AAAA,IAEA,IAAI,cAA6B;AAC/B,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;;;ACrNO,SAAS,kBAAkB,UAA0B;AAC1D,MAAI,OAAO,WAAW,YAAa;AAEnC,QAAM,YAAY,oBAAI,IAAY;AAElC,SAAO;AAAA,IACL;AAAA,IACA,CAAC,UAAiB;AAChB,YAAM,IAAI;AACV,YAAM,EAAE,MAAM,SAAS,IAAI,EAAE;AAE7B,UAAI,UAAU,IAAI,KAAK,IAAI,EAAG;AAC9B,gBAAU,IAAI,KAAK,IAAI;AAEvB,eAAS,gBAAgB;AAAA,QACvB,OAAO;AAAA,QACP,MAAM,KAAK;AAAA,QACX,MAAM,KAAK;AAAA,QACX,MAAM,KAAK;AAAA,QACX,MAAM,KAAK;AAAA,QACX;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,cAAc,IAAI,YAAY,yBAAyB,CAAC;AAG/D;AAAA,IACE,MAAM,OAAO,cAAc,IAAI,YAAY,yBAAyB,CAAC;AAAA,IACrE;AAAA,EACF;AACF;;;ACnCA,iBAA2B;AAIpB,SAAS,qBAAqB,UAA0B;AAC7D,MAAI,OAAO,WAAW,YAAa;AAEnC,QAAM,EAAE,KAAK,GAAG,QAAI,uBAAW;AAE/B,WAAS,SAAS,QAA8B;AAC9C,UAAM,WAAW;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,CAAC,SAAS,MAAM,CAAC,MAAM,KAAK,OAAO,QAAQ,EAAG;AAElD,aAAS,gBAAgB;AAAA,MACvB,OAAO;AAAA,MACP,MAAM,OAAO;AAAA,MACb,MAAM,OAAO;AAAA,MACb,MAAO,OAA0B,QAAQ;AAAA,MACzC,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAEA,EAAC,IAAI,EAAuB,QAAQ,QAAQ;AAE5C;AAAA,IAAG;AAAA,IAAY,IAAI,YAChB,QAA6B,QAAQ,QAAQ;AAAA,EAChD;AAEA;AAAA,IAAG;AAAA,IAAc,IAAI,YAClB,QAA6B,QAAQ,CAAC,MAAM,SAAS,WAAW,CAAC,CAAC;AAAA,EACrE;AACF;;;ACxBO,SAAS,aAAa,SAAuB,CAAC,GAAmB;AACtE,QAAM,UAAU,cAAc;AAC9B,QAAM,WAAW,eAAe,OAAO;AACvC,QAAM,UAAU,qBAAqB;AACrC,QAAM,UAAU,OAAO,oBACnB,gBAAgB,OAAO,CAAC,MAAM,OAAO,kBAAmB,SAAS,EAAE,EAAE,CAAC,IACtE;AAEJ,QAAM,aAAa,iBAAiB;AAAA,IAClC,GAAG;AAAA,IACH,GAAI,OAAO,UAAU,CAAC;AAAA,EACxB,CAAC;AACD,QAAM,SAAS,aAAa,EAAE,UAAU,SAAS,WAAW,CAAC;AAE7D,oBAAkB,QAAQ;AAC1B,uBAAqB,QAAQ;AAE7B,SAAO,eAAe,EAAE,QAAQ,UAAU,SAAS,YAAY,QAAQ,QAAQ,CAAC;AAClF;;;AC7BA,IAAAC,gBAAwD;AACxD,uBAA6B;;;ACDtB,IAAM,SAAS;AAAA;AAAA,EAEpB,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA;AAAA,IACL,KAAK;AAAA;AAAA,IACL,KAAK;AAAA;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,EACP;AAAA;AAAA,EAGA,OAAO;AAAA,IACL,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,EACP;AAAA;AAAA,EAGA,OAAO;AAAA,IACL,IAAI;AAAA,IACJ,WAAW;AAAA,IACX,SAAS;AAAA,IACT,cAAc;AAAA,IACd,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,MAAM;AAAA,IACN,eAAe;AAAA,IACf,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,cAAc;AAAA,IACd,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,QAAQ;AAAA,EACV;AAAA;AAAA,EAGA,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,WAAW;AAAA,IACX,SAAS;AAAA,IACT,cAAc;AAAA,IACd,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,MAAM;AAAA,IACN,eAAe;AAAA,IACf,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,cAAc;AAAA,IACd,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,QAAQ;AAAA,EACV;AACF;AAGO,IAAM,YAAY;AAClB,IAAM,YAAY;AAElB,IAAM,WAAW;AAAA,EACtB,OAAO;AAAA,4BACmB,SAAS;AAAA,4BACT,SAAS;AAAA,4BACT,OAAO,MAAM,EAAE;AAAA,4BACf,OAAO,MAAM,SAAS;AAAA,4BACtB,OAAO,MAAM,OAAO;AAAA,4BACpB,OAAO,MAAM,YAAY;AAAA,4BACzB,OAAO,MAAM,MAAM;AAAA,4BACnB,OAAO,MAAM,YAAY;AAAA,4BACzB,OAAO,MAAM,IAAI;AAAA,4BACjB,OAAO,MAAM,aAAa;AAAA,4BAC1B,OAAO,MAAM,SAAS;AAAA,4BACtB,OAAO,MAAM,MAAM;AAAA,4BACnB,OAAO,MAAM,WAAW;AAAA,4BACxB,OAAO,MAAM,UAAU;AAAA,4BACvB,OAAO,MAAM,QAAQ;AAAA,4BACrB,OAAO,MAAM,YAAY;AAAA,4BACzB,OAAO,MAAM,WAAW;AAAA,4BACxB,OAAO,MAAM,eAAe;AAAA,4BAC5B,OAAO,MAAM,MAAM;AAAA;AAAA,EAE7C,MAAM;AAAA,4BACoB,SAAS;AAAA,4BACT,SAAS;AAAA,4BACT,OAAO,KAAK,EAAE;AAAA,4BACd,OAAO,KAAK,SAAS;AAAA,4BACrB,OAAO,KAAK,OAAO;AAAA,4BACnB,OAAO,KAAK,YAAY;AAAA,4BACxB,OAAO,KAAK,MAAM;AAAA,4BAClB,OAAO,KAAK,YAAY;AAAA,4BACxB,OAAO,KAAK,IAAI;AAAA,4BAChB,OAAO,KAAK,aAAa;AAAA,4BACzB,OAAO,KAAK,SAAS;AAAA,4BACrB,OAAO,KAAK,MAAM;AAAA,4BAClB,OAAO,KAAK,WAAW;AAAA,4BACvB,OAAO,KAAK,UAAU;AAAA,4BACtB,OAAO,KAAK,QAAQ;AAAA,4BACpB,OAAO,KAAK,YAAY;AAAA,4BACxB,OAAO,KAAK,WAAW;AAAA,4BACvB,OAAO,KAAK,eAAe;AAAA,4BAC3B,OAAO,KAAK,MAAM;AAAA;AAE9C;;;ACzHA,mBAAkB;AAQX,SAAS,WAAW,EAAE,KAAK,MAAM,OAAO,GAAG,GAAoB;AACpE,MAAI,KAAK;AACP,WACE,6BAAAC,QAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,KAAK;AAAA,QACL,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,OAAO,EAAE,cAAc,OAAO,MAAM,WAAW,SAAS,YAAY,EAAE;AAAA;AAAA,IACxE;AAAA,EAEJ;AAEA,QAAM,UAAU,KAAK,OAAO,CAAC,EAAE,YAAY;AAC3C,SACE,6BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,cAAc,OAAO;AAAA,QACrB,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,UAAU,OAAO;AAAA,QACjB,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,eAAe;AAAA,MACjB;AAAA;AAAA,IAEC;AAAA,EACH;AAEJ;;;AF3BA,IAAM,WACJ;AAEF,SAAS,aAAa,OAAwC;AAC5D,MAAI;AACJ,MAAI,UAAU,QAAQ;AACpB,eAAW,OAAO,WAAW,8BAA8B,EAAE,UACzD,SACA;AAAA,EACN,OAAO;AACL,eAAW;AAAA,EACb;AACA,MAAI,UAAU,SAAS,eAAe,eAAe;AACrD,MAAI,CAAC,SAAS;AACZ,cAAU,SAAS,cAAc,OAAO;AACxC,YAAQ,KAAK;AACb,aAAS,KAAK,YAAY,OAAO;AAAA,EACnC;AACA,UAAQ,cAAc,WAAW,SAAS,QAAQ,CAAC;AACrD;AAEA,SAAS,aAAmB;AAC1B,MAAI,SAAS,eAAe,aAAa,EAAG;AAC5C,QAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,OAAK,KAAK;AACV,OAAK,MAAM;AACX,OAAK,OAAO;AACZ,WAAS,KAAK,YAAY,IAAI;AAChC;AAEA,IAAM,YAAiC;AAAA,EACrC,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,cAAc;AAAA,EACd,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,eAAe;AACjB;AAEA,SAAS,YAAY,EAAE,aAAa,GAAwC;AAC1E,QAAM,SAAS,aAAa,SAAS,KAAK;AAC1C,QAAM,SAAS,aAAa,SAAS,QAAQ;AAC7C,SACE,8BAAAC,QAAA,cAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,EAAE,KACnC,UACC,8BAAAA,QAAA,cAAC,UAAK,OAAO,EAAE,GAAG,WAAW,YAAY,uBAAuB,OAAO,2BAA2B,KAAG,KAErG,GAED,UACC,8BAAAA,QAAA,cAAC,UAAK,OAAO,EAAE,GAAG,WAAW,YAAY,uBAAuB,OAAO,4BAA4B,QAAQ,6BAA6B,KAAG,KAE3I,CAEJ;AAEJ;AAOA,SAAS,UAAU,EAAE,QAAQ,QAAQ,GAAmB;AACtD,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,KAAK;AAC5C,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,KAAK;AAE5C,SACE,8BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,cAAc,MAAM,WAAW,IAAI;AAAA,MACnC,cAAc,MAAM,WAAW,KAAK;AAAA,MACpC,SAAS,MAAM,WAAW,IAAI;AAAA,MAC9B,QAAQ,MAAM,WAAW,KAAK;AAAA,MAC9B,OAAO;AAAA,QACL,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,KAAK;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,QACT,YAAY,UAAU,4BAA4B;AAAA,QAClD,QAAQ,UAAU,sCAAsC;AAAA,QACxD,cAAc;AAAA,QACd,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,SAAS;AAAA,QACT,YAAY;AAAA,MACd;AAAA;AAAA,IAEA,8BAAAA,QAAA,cAAC,cAAW,KAAK,OAAO,QAAQ,QAAW,MAAM,OAAO,MAAM,MAAM,IAAI;AAAA,IACxE,8BAAAA,QAAA,cAAC,UAAK,OAAO,EAAE,MAAM,GAAG,UAAU,IAAI,YAAY,KAAK,OAAO,kBAAkB,eAAe,UAAU,KACtG,OAAO,IACV;AAAA,IACA,8BAAAA,QAAA,cAAC,eAAY,cAAc,OAAO,cAAc;AAAA,IAChD,8BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QAAI,OAAM;AAAA,QAAK,QAAO;AAAA,QAAK,SAAQ;AAAA,QAAY,MAAK;AAAA,QACnD,OAAO,EAAE,OAAO,UAAU,6BAA6B,wBAAwB,YAAY,GAAG,YAAY,cAAc;AAAA;AAAA,MACxH,8BAAAA,QAAA,cAAC,UAAK,GAAE,uBAAsB,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SAAQ;AAAA,IACrH;AAAA,EACF;AAEJ;AAQA,SAAS,UAAU,EAAE,OAAO,QAAQ,QAAQ,GAAmB;AAC7D,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,KAAK;AAC5C,SACE,8BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,cAAc,MAAM,WAAW,IAAI;AAAA,MACnC,cAAc,MAAM,WAAW,KAAK;AAAA,MACpC,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,QACT,cAAc;AAAA,QACd,QAAQ,SAAS,sCAAsC;AAAA,QACvD,YAAY,SAAS,wBAAwB,UAAU,4BAA4B;AAAA,QACnF,OAAO,SAAS,qBAAqB;AAAA,QACrC,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,eAAe;AAAA,QACf,eAAe;AAAA,QACf,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,SAAS;AAAA,MACX;AAAA;AAAA,IAEC;AAAA,EACH;AAEJ;AASA,SAAS,YAAY,EAAE,OAAO,aAAa,QAAQ,QAAQ,GAAqB;AAC9E,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,KAAK;AAC5C,SACE,8BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,cAAc,MAAM,WAAW,IAAI;AAAA,MACnC,cAAc,MAAM,WAAW,KAAK;AAAA,MACpC,OAAO;AAAA,QACL,SAAS;AAAA,QACT,eAAe;AAAA,QACf,YAAY;AAAA,QACZ,KAAK;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,QACT,YAAY,UAAU,4BAA4B;AAAA,QAClD,QAAQ,UAAU,sCAAsC;AAAA,QACxD,cAAc;AAAA,QACd,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,SAAS;AAAA,MACX;AAAA;AAAA,IAEC;AAAA,IACD,8BAAAA,QAAA,cAAC,UAAK,OAAO,EAAE,UAAU,IAAI,YAAY,KAAK,OAAO,iBAAiB,KAAI,KAAM;AAAA,IAChF,8BAAAA,QAAA,cAAC,UAAK,OAAO,EAAE,UAAU,IAAI,OAAO,wBAAwB,YAAY,IAAI,KAAI,WAAY;AAAA,EAC9F;AAEJ;AAEO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,WAAW;AACb,GAAwB;AACtB,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAAS,EAAE;AACvC,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAAqB,KAAK;AACtD,QAAM,CAAC,eAAe,gBAAgB,QAAI,wBAAsC,IAAI;AAEpF,+BAAU,MAAM;AACd,QAAI,CAAC,KAAM;AACX,eAAW;AACX,iBAAa,KAAK;AAClB,QAAI,UAAU,OAAQ;AACtB,UAAM,KAAK,OAAO,WAAW,8BAA8B;AAC3D,UAAM,UAAU,MAAM,aAAa,MAAM;AACzC,OAAG,iBAAiB,UAAU,OAAO;AACrC,WAAO,MAAM,GAAG,oBAAoB,UAAU,OAAO;AAAA,EACvD,GAAG,CAAC,MAAM,KAAK,CAAC;AAEhB,+BAAU,MAAM;AACd,QAAI,CAAC,MAAM;AACT,gBAAU,EAAE;AACZ,gBAAU,KAAK;AACf,uBAAiB,IAAI;AACrB;AAAA,IACF;AACA,WAAO,MAAM;AACX,eAAS,eAAe,eAAe,GAAG,OAAO;AAAA,IACnD;AAAA,EACF,GAAG,CAAC,IAAI,CAAC;AAET,QAAM,gBAAY;AAAA,IAChB,CAAC,MAAqB;AACpB,UAAI,EAAE,QAAQ,UAAU;AACtB,YAAI,eAAe;AACjB,2BAAiB,IAAI;AAAA,QACvB,OAAO;AACL,kBAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,SAAS,aAAa;AAAA,EACzB;AAEA,+BAAU,MAAM;AACd,QAAI,CAAC,KAAM;AACX,aAAS,iBAAiB,WAAW,SAAS;AAC9C,WAAO,MAAM,SAAS,oBAAoB,WAAW,SAAS;AAAA,EAChE,GAAG,CAAC,MAAM,SAAS,CAAC;AAEpB,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,IAAI,OAAO,YAAY;AAG7B,QAAM,iBAAiB,SAAS,QAAQ,OAAO,CAAC,MAAM;AACpD,UAAM,KAAK,EAAE;AACb,QAAI,aAAa,MAAU,QAAO,GAAG,SAAS,KAAK;AACnD,QAAI,aAAa,SAAU,QAAO,GAAG,SAAS,QAAQ;AACtD,WAAO;AAAA,EACT,CAAC;AAED,QAAM,cACJ,WAAW,QACP,eAAe,OAAO,CAAC,MAAO,EAAE,aAA0B,SAAS,KAAK,CAAC,IACzE,WAAW,WACT,eAAe,OAAO,CAAC,MAAO,EAAE,aAA0B,SAAS,QAAQ,CAAC,IAC5E;AACR,QAAM,WAAW,IACb,YAAY,OAAO,CAAC,MAAM,EAAE,KAAK,YAAY,EAAE,SAAS,CAAC,CAAC,IAC1D;AAEJ,WAAS,kBAAkB,QAA8B;AACvD,UAAM,KAAK,OAAO;AAClB,UAAM,UAAU,GAAG,SAAS,KAAK,KAAK,GAAG,SAAS,QAAQ;AAC1D,QAAI,WAAW,aAAa,OAAO;AAEjC,uBAAiB,MAAM;AAAA,IACzB,OAAO;AACL,YAAM,aACJ,aAAa,QAAW,QACxB,aAAa,WAAW,WACxB;AACF,gBAAU,QAAQ,UAAU;AAC5B,cAAQ;AAAA,IACV;AAAA,EACF;AAEA,WAAS,kBAAkB,YAAwB;AACjD,QAAI,CAAC,cAAe;AACpB,cAAU,eAAe,UAAU;AACnC,YAAQ;AAAA,EACV;AAEA,QAAM,QACJ,8BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,cAAW;AAAA,MACX,cAAW;AAAA,MACX,OAAO;AAAA,QACL,UAAU;AAAA,QACV,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,SAAS;AAAA,QACT,YAAY;AAAA,MACd;AAAA;AAAA,IAGA,8BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,SAAS,MAAM;AACb,cAAI,eAAe;AACjB,6BAAiB,IAAI;AAAA,UACvB,OAAO;AACL,oBAAQ;AAAA,UACV;AAAA,QACF;AAAA,QACA,OAAO;AAAA,UACL,UAAU;AAAA,UACV,OAAO;AAAA,UACP,YAAY;AAAA,UACZ,gBAAgB;AAAA,UAChB,sBAAsB;AAAA,QACxB;AAAA;AAAA,IACF;AAAA,IAGA,8BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,OAAO;AAAA,UACP,UAAU;AAAA,UACV,WAAW;AAAA,UACX,SAAS;AAAA,UACT,eAAe;AAAA,UACf,WAAW;AAAA,UACX,UAAU;AAAA,QACZ;AAAA;AAAA,MAGA,8BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,QAAQ;AAAA,YACR,YAAY;AAAA,UACd;AAAA;AAAA,MACF;AAAA,MAEC;AAAA;AAAA,QAEC,8BAAAA,QAAA,4BAAAA,QAAA,gBAEE,8BAAAA,QAAA,cAAC,SAAI,OAAO,EAAE,SAAS,kBAAkB,SAAS,QAAQ,YAAY,UAAU,KAAK,GAAG,KACtF,8BAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAS,MAAM,iBAAiB,IAAI;AAAA,YACpC,cAAW;AAAA,YACX,OAAO;AAAA,cACL,YAAY;AAAA,cACZ,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,gBAAgB;AAAA,cAChB,QAAQ;AAAA,cACR,OAAO;AAAA,cACP,YAAY;AAAA,cACZ,YAAY;AAAA,cACZ,SAAS;AAAA,YACX;AAAA;AAAA,UAEA,8BAAAA,QAAA,cAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,UACnD,8BAAAA,QAAA,cAAC,UAAK,GAAE,oBAAmB,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SAAQ,CAClH;AAAA,QACF,GACA,8BAAAA,QAAA,cAAC,QAAG,OAAO,EAAE,QAAQ,GAAG,UAAU,IAAI,YAAY,KAAK,OAAO,kBAAkB,eAAe,UAAU,KAAG,iBAE5G,GACA,8BAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAS;AAAA,YACT,cAAW;AAAA,YACX,OAAO;AAAA,cACL,YAAY;AAAA,cACZ,YAAY;AAAA,cACZ,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,gBAAgB;AAAA,cAChB,QAAQ;AAAA,cACR,OAAO;AAAA,cACP,YAAY;AAAA,cACZ,YAAY;AAAA,cACZ,SAAS;AAAA,YACX;AAAA;AAAA,UAEA,8BAAAA,QAAA,cAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,UACnD,8BAAAA,QAAA,cAAC,UAAK,GAAE,wCAAuC,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,CAC/G;AAAA,QACF,CACF,GAGA,8BAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,QAAQ;AAAA,cACR,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,KAAK;AAAA,YACP;AAAA;AAAA,UAEA,8BAAAA,QAAA,cAAC,cAAW,KAAK,cAAc,QAAQ,QAAW,MAAM,cAAc,MAAM,MAAM,IAAI;AAAA,UACtF,8BAAAA,QAAA,cAAC,aACC,8BAAAA,QAAA,cAAC,SAAI,OAAO,EAAE,UAAU,IAAI,YAAY,KAAK,OAAO,iBAAiB,KAAI,cAAc,IAAK,GAC5F,8BAAAA,QAAA,cAAC,SAAI,OAAO,EAAE,UAAU,IAAI,OAAO,wBAAwB,WAAW,EAAE,KAAG,6BAA2B,CACxG;AAAA,QACF,GAGA,8BAAAA,QAAA,cAAC,SAAI,OAAO,EAAE,SAAS,eAAe,SAAS,QAAQ,eAAe,UAAU,KAAK,EAAE,KACrF,8BAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,aAAY;AAAA,YACZ,QACE,8BAAAA,QAAA,cAAC,UAAK,OAAO,EAAE,GAAG,WAAW,YAAY,uBAAuB,OAAO,2BAA2B,KAAG,KAAG;AAAA,YAE1G,SAAS,MAAM,kBAAkB,KAAK;AAAA;AAAA,QACxC,GACA,8BAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,aAAY;AAAA,YACZ,QACE,8BAAAA,QAAA,cAAC,UAAK,OAAO,EAAE,GAAG,WAAW,YAAY,uBAAuB,OAAO,4BAA4B,QAAQ,6BAA6B,KAAG,KAAG;AAAA,YAEhJ,SAAS,MAAM,kBAAkB,QAAQ;AAAA;AAAA,QAC3C,GACA,8BAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,aAAY;AAAA,YACZ,QACE,8BAAAA,QAAA,cAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,EAAE,KACpC,8BAAAA,QAAA,cAAC,UAAK,OAAO,EAAE,GAAG,WAAW,YAAY,uBAAuB,OAAO,2BAA2B,KAAG,KAAG,GACxG,8BAAAA,QAAA,cAAC,UAAK,OAAO,EAAE,GAAG,WAAW,YAAY,uBAAuB,OAAO,4BAA4B,QAAQ,6BAA6B,KAAG,KAAG,CAChJ;AAAA,YAEF,SAAS,MAAM,kBAAkB,MAAS;AAAA;AAAA,QAC5C,CACF,CACF;AAAA;AAAA;AAAA,QAGA,8BAAAA,QAAA,4BAAAA,QAAA,gBAEE,8BAAAA,QAAA,cAAC,SAAI,OAAO,EAAE,SAAS,cAAc,KACnC,8BAAAA,QAAA,cAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,cAAc,gBAAgB,iBAAiB,cAAc,GAAG,KACzG,8BAAAA,QAAA,cAAC,aACC,8BAAAA,QAAA,cAAC,QAAG,OAAO,EAAE,QAAQ,GAAG,UAAU,IAAI,YAAY,KAAK,OAAO,kBAAkB,eAAe,WAAW,YAAY,IAAI,KAAG,gBAE7H,GACC,eAAe,SAAS,KACvB,8BAAAA,QAAA,cAAC,OAAE,OAAO,EAAE,QAAQ,WAAW,UAAU,IAAI,OAAO,uBAAuB,KACxE,eAAe,QAAO,WAAQ,eAAe,WAAW,IAAI,MAAM,IAAG,WACxE,CAEJ,GACA,8BAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAS;AAAA,YACT,cAAW;AAAA,YACX,OAAO;AAAA,cACL,YAAY;AAAA,cACZ,QAAQ;AAAA,cACR,QAAQ;AAAA,cACR,SAAS;AAAA,cACT,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,gBAAgB;AAAA,cAChB,OAAO;AAAA,cACP,YAAY;AAAA,cACZ,YAAY;AAAA,cACZ,YAAY;AAAA,YACd;AAAA,YACA,cAAc,CAAC,MAAM;AACnB,cAAC,EAAE,cAAoC,MAAM,aAAa;AAC1D,cAAC,EAAE,cAAoC,MAAM,QAAQ;AAAA,YACvD;AAAA,YACA,cAAc,CAAC,MAAM;AACnB,cAAC,EAAE,cAAoC,MAAM,aAAa;AAC1D,cAAC,EAAE,cAAoC,MAAM,QAAQ;AAAA,YACvD;AAAA;AAAA,UAEA,8BAAAA,QAAA,cAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,UACnD,8BAAAA,QAAA,cAAC,UAAK,GAAE,wCAAuC,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,CAC/G;AAAA,QACF,CACF,GAGA,8BAAAA,QAAA,cAAC,SAAI,OAAO,EAAE,UAAU,YAAY,cAAc,GAAG,KACnD,8BAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YAAI,OAAM;AAAA,YAAK,QAAO;AAAA,YAAK,SAAQ;AAAA,YAAY,MAAK;AAAA,YACnD,OAAO,EAAE,UAAU,YAAY,MAAM,IAAI,KAAK,OAAO,WAAW,oBAAoB,OAAO,wBAAwB,eAAe,OAAO;AAAA;AAAA,UACzI,8BAAAA,QAAA,cAAC,YAAO,IAAG,KAAI,IAAG,KAAI,GAAE,KAAI,QAAO,gBAAe,aAAY,OAAM;AAAA,UACpE,8BAAAA,QAAA,cAAC,UAAK,GAAE,kBAAiB,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ;AAAA,QACzF,GACA,8BAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,aAAY;AAAA,YACZ,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,UAAU,EAAE,OAAO,KAAK;AAAA,YACzC,OAAO;AAAA,cACL,OAAO;AAAA,cACP,YAAY;AAAA,cACZ,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,OAAO;AAAA,cACP,UAAU;AAAA,cACV,SAAS;AAAA,cACT,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,YAAY;AAAA,cACZ,WAAW;AAAA,YACb;AAAA,YACA,SAAS,CAAC,MAAM;AAAE,gBAAE,cAAc,MAAM,cAAc;AAAA,YAA2B;AAAA,YACjF,QAAQ,CAAC,MAAM;AAAE,gBAAE,cAAc,MAAM,cAAc;AAAA,YAAoB;AAAA;AAAA,QAC3E,CACF,GAGC,aAAa,SACZ,8BAAAA,QAAA,cAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,GAAG,cAAc,GAAG,KACtD,8BAAAA,QAAA,cAAC,aAAU,OAAM,OAAM,QAAQ,WAAW,OAAO,SAAS,MAAM,UAAU,KAAK,GAAG,GAClF,8BAAAA,QAAA,cAAC,aAAU,OAAM,OAAM,QAAQ,WAAW,OAAO,SAAS,MAAM,UAAU,KAAK,GAAG,GAClF,8BAAAA,QAAA,cAAC,aAAU,OAAM,UAAS,QAAQ,WAAW,UAAU,SAAS,MAAM,UAAU,QAAQ,GAAG,CAC7F,CAEJ,GAGA,8BAAAA,QAAA,cAAC,SAAI,OAAO,EAAE,WAAW,QAAQ,MAAM,GAAG,SAAS,cAAc,KAC9D,SAAS,SAAS,IACjB,8BAAAA,QAAA,cAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,EAAE,KAC5D,SAAS,IAAI,CAAC,MACb,8BAAAA,QAAA,cAAC,aAAU,KAAK,EAAE,IAAI,QAAQ,GAAG,SAAS,MAAM,kBAAkB,CAAC,GAAG,CACvE,CACH,IAEA,8BAAAA,QAAA,cAAC,SAAI,OAAO,EAAE,WAAW,UAAU,SAAS,aAAa,OAAO,wBAAwB,UAAU,GAAG,KAClG,IAAI,wBAAwB,CAAC,MAAM,qBACtC,CAEJ,GAGA,8BAAAA,QAAA,cAAC,SAAI,OAAO,EAAE,SAAS,kBAAkB,WAAW,8BAA8B,WAAW,UAAU,UAAU,IAAI,OAAO,uBAAuB,KAAG,8DAEtJ,CACF;AAAA;AAAA,IAEJ;AAAA,EACF;AAGF,aAAO,+BAAa,OAAO,SAAS,IAAI;AAC1C;;;AG/jBA,IAAAC,gBAOO;AAgBP,IAAM,oBAAgB,6BAAyC,IAAI;AAO5D,SAAS,UAAU,EAAE,QAAQ,SAAS,GAAmB;AAC9D,QAAM,UAAM,sBAA8B,IAAI;AAC9C,MAAI,CAAC,IAAI,SAAS;AAChB,QAAI,UAAU,aAAa,MAAM;AAAA,EACnC;AAEA,QAAM,CAAC,cAAc,eAAe,QAAI,wBAAS,KAAK;AACtD,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAgB,QAAQ,SAAS,MAAM;AAEjE,QAAM,mBAAgB,2BAAY,MAAM,gBAAgB,IAAI,GAAI,CAAC,CAAC;AAClE,QAAM,oBAAgB,2BAAY,MAAM,gBAAgB,KAAK,GAAG,CAAC,CAAC;AAElE,QAAM,oBAAgB;AAAA,IACpB,CAAC,QAA8B,eAA2B;AACxD,UAAI,QAAS,QAAQ,QAAQ,UAAU,EAAE,MAAM,QAAQ,KAAK;AAAA,IAC9D;AAAA,IACA,CAAC;AAAA,EACH;AAEA,SACE,8BAAAC,QAAA;AAAA,IAAC,cAAc;AAAA,IAAd;AAAA,MACC,OAAO,EAAE,UAAU,IAAI,SAAS,cAAc,cAAc,eAAe,OAAO,SAAS;AAAA;AAAA,IAE1F;AAAA,IACD,8BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,UAAU,IAAI;AAAA,QACd,MAAM;AAAA,QACN,SAAS;AAAA,QACT,WAAW;AAAA,QACX;AAAA,QACA,UAAU,QAAQ,YAAY;AAAA;AAAA,IAChC;AAAA,EACF;AAEJ;AAEO,SAAS,mBAAuC;AACrD,QAAM,UAAM,0BAAW,aAAa;AACpC,MAAI,CAAC,KAAK;AACR,UAAM,IAAI;AAAA,MACR;AAAA,IAEF;AAAA,EACF;AACA,SAAO;AACT;;;AC3EA,IAAAC,gBAAiD;AAO1C,SAAS,YAAY;AAC1B,QAAM,EAAE,UAAU,OAAO,SAAS,IAAI,iBAAiB;AACvD,QAAM,CAAC,EAAE,WAAW,QAAI,wBAAS,CAAC;AAElC,+BAAU,MAAM;AACd,UAAM,UAAU,MAAM,YAAY,CAAC,MAAM,IAAI,CAAC;AAC9C,UAAM,SAAS;AAAA,MACb;AAAA,MAAW;AAAA,MACX;AAAA,MAAoB;AAAA,MAAiB;AAAA,MACrC;AAAA,MAAc;AAAA,IAChB;AACA,WAAO,QAAQ,CAAC,MAAM,SAAS,GAAG,GAAG,OAAO,CAAC;AAC7C,WAAO,MAAM,OAAO,QAAQ,CAAC,MAAM,SAAS,IAAI,GAAG,OAAO,CAAC;AAAA,EAC7D,GAAG,CAAC,QAAQ,CAAC;AAEb,SAAO;AAAA,IACL;AAAA,IACA,SAAmB,SAAS;AAAA,IAC5B,YAAmB,SAAS;AAAA,IAC5B,eAAmB,SAAS;AAAA,IAC5B,mBAAmB,SAAS;AAAA,IAC5B,QAAmB,SAAS;AAAA,IAC5B,iBAAmB,SAAS;AAAA,IAC5B,eAAmB,SAAS;AAAA,IAC5B,aAAmB,SAAS;AAAA,IAC5B,aAAmB,CAAC,CAAC,SAAS;AAAA,IAC9B;AAAA,IACA;AAAA,IACA,SAAa,CAAC,QAA8B,eAC7B,SAAS,QAAQ,QAAQ,UAAU;AAAA,IAClD,YAAa,MAAM,SAAS,WAAW;AAAA,IACvC,UAAa,CAAC,UAA2B,SAAS,SAAS,KAAK;AAAA,IAChE,aAAa,CAAC,YAAoB,SAAS,YAAY,OAAO;AAAA,EAChE;AACF;AAKO,SAAS,oBAAoB;AAClC,QAAM,EAAE,cAAc,cAAc,cAAc,IAAI,iBAAiB;AACvE,SAAO,EAAE,QAAQ,cAAc,MAAM,cAAc,OAAO,cAAc;AAC1E;AAIO,SAAS,iBAAiB;AAC/B,QAAM,EAAE,SAAS,IAAI,iBAAiB;AACtC,QAAM,CAAC,EAAE,WAAW,QAAI,wBAAS,CAAC;AAClC,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,KAAK;AAC5C,QAAM,CAAC,OAAS,QAAQ,QAAM,wBAA6B,IAAI;AAE/D,+BAAU,MAAM;AACd,UAAM,UAAU,MAAM,YAAY,CAAC,MAAM,IAAI,CAAC;AAC9C,aAAS,GAAG,WAAW,OAAO;AAC9B,aAAS,GAAG,cAAc,OAAO;AACjC,WAAO,MAAM;AACX,eAAS,IAAI,WAAW,OAAO;AAC/B,eAAS,IAAI,cAAc,OAAO;AAAA,IACpC;AAAA,EACF,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,kBAAc;AAAA,IAClB,OAAO,YAAmC;AACxC,iBAAW,IAAI;AACf,eAAS,IAAI;AACb,UAAI;AACF,cAAM,gBAAgB,SAAS,eAAe,cAAc,OAAO;AACnE,cAAM,SAAS,QAAQ;AAAA,UACrB,QAAQ;AAAA,UACR,QAAQ;AAAA,YACN;AAAA,cACE,gBAAgB;AAAA,gBACd,CAAC,OAAO,GAAG,iBAAiB;AAAA,kBAC1B,SAAS,CAAC,0BAA0B,oBAAoB;AAAA,kBACxD,UAAU,CAAC;AAAA,kBACX,QAAQ,CAAC;AAAA,gBACX;AAAA,cACF;AAAA,cACA,gBAAgB,CAAC;AAAA,YACnB;AAAA,UACF;AAAA,QACF,CAAC;AACD,oBAAY,CAAC,MAAM,IAAI,CAAC;AAAA,MAC1B,SAAS,KAAK;AACZ,cAAM,IAAI,eAAe,cACrB,MACA,IAAI,uCAA4C,OAAO,GAAG,CAAC;AAC/D,iBAAS,CAAC;AACV,cAAM;AAAA,MACR,UAAE;AACA,mBAAW,KAAK;AAAA,MAClB;AAAA,IACF;AAAA,IACA,CAAC,QAAQ;AAAA,EACX;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAe,SAAS;AAAA,IACxB,eAAe,SAAS,gBACpB,OAAO,KAAK,SAAS,cAAc,aAAa,IAChD,CAAC;AAAA,EACP;AACF;AAIA,SAAS,aACP,UACA,SACA,SACoC;AACpC,QAAM,QAAQ,WAAW,SAAS;AAClC,MAAI,CAAC,OAAO;AACV,UAAM,IAAI;AAAA;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACA,QAAM,QAAQ,SAAS,eAAe,cAAc,KAAK;AACzD,QAAM,WAAW,WAAW,OAAO,SAAS,CAAC,GAAG,MAAM,GAAG,EAAE,IAAI,KAAK;AACpE,SAAO,EAAE,OAAO,SAAS,SAAS;AACpC;AAIO,SAAS,iBAAiB;AAC/B,QAAM,EAAE,SAAS,IAAI,iBAAiB;AACtC,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAwB,IAAI;AAC9D,QAAM,CAAC,SAAW,UAAU,QAAM,wBAAS,KAAK;AAChD,QAAM,CAAC,OAAW,QAAQ,QAAQ,wBAA6B,IAAI;AAEnE,QAAM,kBAAc;AAAA,IAClB,OACE,SACA,YACoB;AACpB,YAAM,EAAE,OAAO,QAAQ,IAAI;AAAA,QACzB;AAAA,QAAU,SAAS;AAAA,QAAS,SAAS;AAAA,MACvC;AACA,iBAAW,IAAI;AACf,eAAS,IAAI;AACb,UAAI;AACF,cAAM,MAAO,MAAM,SAAS,QAAQ;AAAA,UAClC,QAAQ;AAAA,UACR,QAAQ,CAAC,OAAO,SAAS,OAAO;AAAA,QAClC,CAAC;AACD,qBAAa,GAAG;AAChB,eAAO;AAAA,MACT,SAAS,KAAK;AACZ,cAAM,IAAI,eAAe,cACrB,MACA,IAAI,uCAA4C,OAAO,GAAG,CAAC;AAC/D,iBAAS,CAAC;AACV,cAAM;AAAA,MACR,UAAE;AACA,mBAAW,KAAK;AAAA,MAClB;AAAA,IACF;AAAA,IACA,CAAC,QAAQ;AAAA,EACX;AAEA,QAAM,YAAQ,2BAAY,MAAM;AAAE,iBAAa,IAAI;AAAG,aAAS,IAAI;AAAA,EAAG,GAAG,CAAC,CAAC;AAC3E,SAAO,EAAE,aAAa,WAAW,SAAS,OAAO,MAAM;AACzD;AAYO,SAAS,qBAAqB;AACnC,QAAM,EAAE,SAAS,IAAI,iBAAiB;AACtC,QAAM,CAAC,QAAS,SAAS,QAAK,wBAAwB,IAAI;AAC1D,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,KAAK;AAC5C,QAAM,CAAC,OAAS,QAAQ,QAAM,wBAA6B,IAAI;AAE/D,QAAM,sBAAkB;AAAA,IACtB,OACE,IACA,YACoB;AACpB,YAAM,EAAE,OAAO,QAAQ,IAAI;AAAA,QACzB;AAAA,QAAU,SAAS;AAAA,QAAS,SAAS;AAAA,MACvC;AACA,YAAM,QAAQ,GAAG,QACb,GAAG,MAAM,WAAW,IAAI,IACtB,GAAG,QACH,KAAK,SAAS,GAAG,OAAO,EAAE,EAAE,SAAS,EAAE,CAAC,KAC1C;AAEJ,iBAAW,IAAI;AACf,eAAS,IAAI;AACb,UAAI;AACF,cAAM,OAAQ,MAAM,SAAS,QAAQ;AAAA,UACnC,QAAQ;AAAA,UACR,QAAQ,CAAC,OAAO,SAAS,EAAE,GAAG,IAAI,MAAM,CAAC;AAAA,QAC3C,CAAC;AACD,kBAAU,IAAI;AACd,eAAO;AAAA,MACT,SAAS,KAAK;AACZ,cAAM,IAAI,eAAe,cACrB,MACA,IAAI,uCAA4C,OAAO,GAAG,CAAC;AAC/D,iBAAS,CAAC;AACV,cAAM;AAAA,MACR,UAAE;AACA,mBAAW,KAAK;AAAA,MAClB;AAAA,IACF;AAAA,IACA,CAAC,QAAQ;AAAA,EACX;AAEA,QAAM,YAAQ,2BAAY,MAAM;AAAE,cAAU,IAAI;AAAG,aAAS,IAAI;AAAA,EAAG,GAAG,CAAC,CAAC;AACxE,SAAO,EAAE,iBAAiB,QAAQ,SAAS,OAAO,MAAM;AAC1D;AAKO,SAAS,mBAAmB;AACjC,QAAM,EAAE,SAAS,IAAI,iBAAiB;AACtC,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAwB,IAAI;AAC9D,QAAM,CAAC,SAAW,UAAU,QAAM,wBAAS,KAAK;AAChD,QAAM,CAAC,OAAW,QAAQ,QAAQ,wBAA6B,IAAI;AAEnE,QAAM,oBAAgB;AAAA,IACpB,OACE,WACA,YACoB;AACpB,YAAM,EAAE,OAAO,QAAQ,IAAI;AAAA,QACzB;AAAA,QAAU,SAAS;AAAA,QAAS,SAAS;AAAA,MACvC;AACA,iBAAW,IAAI;AACf,eAAS,IAAI;AACb,UAAI;AACF,cAAM,MAAO,MAAM,SAAS,QAAQ;AAAA,UAClC,QAAQ;AAAA,UACR,QAAQ,CAAC,OAAO,SAAS,SAAS;AAAA,QACpC,CAAC;AACD,qBAAa,GAAG;AAChB,eAAO;AAAA,MACT,SAAS,KAAK;AACZ,cAAM,IAAI,eAAe,cACrB,MACA,IAAI,uCAA4C,OAAO,GAAG,CAAC;AAC/D,iBAAS,CAAC;AACV,cAAM;AAAA,MACR,UAAE;AACA,mBAAW,KAAK;AAAA,MAClB;AAAA,IACF;AAAA,IACA,CAAC,QAAQ;AAAA,EACX;AAEA,QAAM,YAAQ,2BAAY,MAAM;AAAE,iBAAa,IAAI;AAAG,aAAS,IAAI;AAAA,EAAG,GAAG,CAAC,CAAC;AAC3E,SAAO,EAAE,eAAe,WAAW,SAAS,OAAO,MAAM;AAC3D;","names":["DecaneErrorCode","import_react","React","React","import_react","React","import_react"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
import React, { ReactNode } from 'react';
|
|
2
|
+
|
|
3
|
+
type ChainType = "evm" | "solana";
|
|
4
|
+
type ChainSupport = ["evm"] | ["solana"] | ["evm", "solana"];
|
|
5
|
+
interface ChainDescriptor {
|
|
6
|
+
id: string;
|
|
7
|
+
type: ChainType;
|
|
8
|
+
name: string;
|
|
9
|
+
nativeCurrency: {
|
|
10
|
+
name: string;
|
|
11
|
+
symbol: string;
|
|
12
|
+
decimals: number;
|
|
13
|
+
};
|
|
14
|
+
rpcUrl?: string;
|
|
15
|
+
blockExplorerUrl?: string;
|
|
16
|
+
iconUrl?: string;
|
|
17
|
+
chainId?: number;
|
|
18
|
+
isCustom?: boolean;
|
|
19
|
+
}
|
|
20
|
+
interface UnifiedWalletAccount {
|
|
21
|
+
id: string;
|
|
22
|
+
name: string;
|
|
23
|
+
icon: string;
|
|
24
|
+
rdns?: string;
|
|
25
|
+
chainSupport: ChainSupport;
|
|
26
|
+
evmProvider?: EIP1193Provider;
|
|
27
|
+
solanaProvider?: StandardWallet;
|
|
28
|
+
}
|
|
29
|
+
type CAIP25Method = "wallet_requestPermissions" | "wallet_revokePermissions" | "wallet_getPermissions" | "wallet_sendTransaction" | "wallet_signMessage" | "wallet_signTypedData";
|
|
30
|
+
interface ChainScope {
|
|
31
|
+
methods: CAIP25Method[];
|
|
32
|
+
accounts: string[];
|
|
33
|
+
events?: string[];
|
|
34
|
+
}
|
|
35
|
+
interface CAIP25SessionRequest {
|
|
36
|
+
requiredScopes: Partial<Record<string, ChainScope>>;
|
|
37
|
+
optionalScopes: Partial<Record<string, ChainScope>>;
|
|
38
|
+
}
|
|
39
|
+
interface CAIP25SessionResult {
|
|
40
|
+
sessionId: string;
|
|
41
|
+
grantedScopes: Partial<Record<string, ChainScope>>;
|
|
42
|
+
}
|
|
43
|
+
interface ActiveSession {
|
|
44
|
+
sessionId: string;
|
|
45
|
+
grantedScopes: Partial<Record<string, ChainScope>>;
|
|
46
|
+
walletId: string;
|
|
47
|
+
walletType: ChainType | "multi";
|
|
48
|
+
createdAt: number;
|
|
49
|
+
}
|
|
50
|
+
interface DecaneProvider {
|
|
51
|
+
request(args: {
|
|
52
|
+
method: string;
|
|
53
|
+
params?: unknown[];
|
|
54
|
+
}): Promise<unknown>;
|
|
55
|
+
on(event: string, handler: (...args: unknown[]) => void): void;
|
|
56
|
+
off(event: string, handler: (...args: unknown[]) => void): void;
|
|
57
|
+
readonly wallets: UnifiedWalletAccount[];
|
|
58
|
+
readonly evmWallets: UnifiedWalletAccount[];
|
|
59
|
+
readonly solanaWallets: UnifiedWalletAccount[];
|
|
60
|
+
readonly multiChainWallets: UnifiedWalletAccount[];
|
|
61
|
+
connect(wallet: UnifiedWalletAccount, preferredChain?: ChainType): Promise<void>;
|
|
62
|
+
disconnect(): Promise<void>;
|
|
63
|
+
addChain(chain: ChainDescriptor): void;
|
|
64
|
+
removeChain(chainId: string): void;
|
|
65
|
+
getChain(chainId: string): ChainDescriptor | undefined;
|
|
66
|
+
readonly chains: ChainDescriptor[];
|
|
67
|
+
readonly connectedWallet: UnifiedWalletAccount | null;
|
|
68
|
+
readonly activeSession: ActiveSession | null;
|
|
69
|
+
readonly activeChain: string | null;
|
|
70
|
+
}
|
|
71
|
+
interface DecaneConfig {
|
|
72
|
+
chains?: ChainDescriptor[];
|
|
73
|
+
supportedChainIds?: string[];
|
|
74
|
+
networks?: "evm" | "solana" | "all";
|
|
75
|
+
defaultChain?: string;
|
|
76
|
+
theme?: "light" | "dark" | "auto";
|
|
77
|
+
}
|
|
78
|
+
interface EIP1193Provider {
|
|
79
|
+
request(args: {
|
|
80
|
+
method: string;
|
|
81
|
+
params?: unknown[];
|
|
82
|
+
}): Promise<unknown>;
|
|
83
|
+
on(event: string, handler: (...args: unknown[]) => void): void;
|
|
84
|
+
removeListener(event: string, handler: (...args: unknown[]) => void): void;
|
|
85
|
+
}
|
|
86
|
+
interface StandardWallet {
|
|
87
|
+
name: string;
|
|
88
|
+
icon: string;
|
|
89
|
+
features: Record<string, unknown>;
|
|
90
|
+
accounts: StandardWalletAccount[];
|
|
91
|
+
}
|
|
92
|
+
interface StandardWalletAccount {
|
|
93
|
+
address: string;
|
|
94
|
+
publicKey: Uint8Array;
|
|
95
|
+
chains: string[];
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
declare function createDecane(config?: DecaneConfig): DecaneProvider;
|
|
99
|
+
|
|
100
|
+
declare class DecaneError extends Error {
|
|
101
|
+
code: DecaneErrorCode;
|
|
102
|
+
constructor(code: DecaneErrorCode, message: string);
|
|
103
|
+
}
|
|
104
|
+
declare enum DecaneErrorCode {
|
|
105
|
+
USER_REJECTED = 4001,
|
|
106
|
+
UNAUTHORIZED = 4100,
|
|
107
|
+
NO_ACTIVE_SESSION = 5001,
|
|
108
|
+
SCOPE_MISMATCH = 5002,
|
|
109
|
+
SESSION_EXPIRED = 5003,
|
|
110
|
+
UNSUPPORTED_CHAIN = 5010,
|
|
111
|
+
CHAIN_NOT_IN_SCOPE = 5011,
|
|
112
|
+
INVALID_CHAIN_CONFIG = 5012,
|
|
113
|
+
NO_WALLET_CONNECTED = 5020,
|
|
114
|
+
WALLET_DISCONNECTED = 5021,
|
|
115
|
+
PROVIDER_ERROR = 5022,
|
|
116
|
+
METHOD_NOT_SUPPORTED = 5030,
|
|
117
|
+
EVM_ONLY_METHOD = 5031
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
declare const BUILT_IN_CHAINS: ChainDescriptor[];
|
|
121
|
+
declare const CHAINS: {
|
|
122
|
+
readonly ETHEREUM: "eip155:1";
|
|
123
|
+
readonly BASE: "eip155:8453";
|
|
124
|
+
readonly ARBITRUM: "eip155:42161";
|
|
125
|
+
readonly OPTIMISM: "eip155:10";
|
|
126
|
+
readonly BNB: "eip155:56";
|
|
127
|
+
readonly POLYGON: "eip155:137";
|
|
128
|
+
readonly ABSTRACT: "eip155:2741";
|
|
129
|
+
readonly ANCIENT8: "eip155:888888888";
|
|
130
|
+
readonly ANIMECHAIN: "eip155:69000";
|
|
131
|
+
readonly APE_CHAIN: "eip155:33139";
|
|
132
|
+
readonly ARBITRUM_NOVA: "eip155:42170";
|
|
133
|
+
readonly AVALANCHE: "eip155:43114";
|
|
134
|
+
readonly B3: "eip155:8333";
|
|
135
|
+
readonly BERACHAIN: "eip155:80094";
|
|
136
|
+
readonly BLAST: "eip155:81457";
|
|
137
|
+
readonly BOB: "eip155:60808";
|
|
138
|
+
readonly BOBA: "eip155:288";
|
|
139
|
+
readonly CELO: "eip155:42220";
|
|
140
|
+
readonly CORN: "eip155:21000000";
|
|
141
|
+
readonly CRONOS: "eip155:25";
|
|
142
|
+
readonly CYBER: "eip155:7560";
|
|
143
|
+
readonly DEGEN: "eip155:666666666";
|
|
144
|
+
readonly FLOW_EVM: "eip155:747";
|
|
145
|
+
readonly GNOSIS: "eip155:100";
|
|
146
|
+
readonly GUNZ: "eip155:49321";
|
|
147
|
+
readonly HEMI: "eip155:43111";
|
|
148
|
+
readonly HYPER_EVM: "eip155:999";
|
|
149
|
+
readonly INK: "eip155:57073";
|
|
150
|
+
readonly LINEA: "eip155:59144";
|
|
151
|
+
readonly LISK: "eip155:1135";
|
|
152
|
+
readonly MANTA_PACIFIC: "eip155:169";
|
|
153
|
+
readonly MANTLE: "eip155:5000";
|
|
154
|
+
readonly MEGA_ETH: "eip155:6342";
|
|
155
|
+
readonly METIS: "eip155:1088";
|
|
156
|
+
readonly MODE: "eip155:34443";
|
|
157
|
+
readonly MONAD: "eip155:10143";
|
|
158
|
+
readonly MORPH: "eip155:2818";
|
|
159
|
+
readonly PLUME: "eip155:98866";
|
|
160
|
+
readonly RARI: "eip155:1380012617";
|
|
161
|
+
readonly REDSTONE: "eip155:690";
|
|
162
|
+
readonly RONIN: "eip155:2020";
|
|
163
|
+
readonly SCROLL: "eip155:534352";
|
|
164
|
+
readonly SEI: "eip155:1329";
|
|
165
|
+
readonly SHAPE: "eip155:360";
|
|
166
|
+
readonly SOMNIA: "eip155:50312";
|
|
167
|
+
readonly SONEIUM: "eip155:1868";
|
|
168
|
+
readonly SONIC: "eip155:146";
|
|
169
|
+
readonly STORY: "eip155:1514";
|
|
170
|
+
readonly SUPERPOSITION: "eip155:55244";
|
|
171
|
+
readonly SUPERSEED: "eip155:5330";
|
|
172
|
+
readonly SWELL_CHAIN: "eip155:1923";
|
|
173
|
+
readonly TAIKO: "eip155:167000";
|
|
174
|
+
readonly UNICHAIN: "eip155:130";
|
|
175
|
+
readonly WORLD_CHAIN: "eip155:480";
|
|
176
|
+
readonly ZERO: "eip155:543210";
|
|
177
|
+
readonly ZIRCUIT: "eip155:48900";
|
|
178
|
+
readonly ZKSYNC_ERA: "eip155:324";
|
|
179
|
+
readonly ZORA: "eip155:7777777";
|
|
180
|
+
readonly LOCALHOST: "eip155:31337";
|
|
181
|
+
readonly SOLANA: "solana:mainnet";
|
|
182
|
+
readonly SOLANA_DEVNET: "solana:devnet";
|
|
183
|
+
};
|
|
184
|
+
type ChainId = typeof CHAINS[keyof typeof CHAINS];
|
|
185
|
+
|
|
186
|
+
interface WalletSelectorProps {
|
|
187
|
+
provider: DecaneProvider;
|
|
188
|
+
open: boolean;
|
|
189
|
+
onClose: () => void;
|
|
190
|
+
onConnect: (wallet: UnifiedWalletAccount, preference?: ChainType) => void;
|
|
191
|
+
theme?: "light" | "dark" | "auto";
|
|
192
|
+
networks?: "evm" | "solana" | "all";
|
|
193
|
+
}
|
|
194
|
+
declare function WalletSelector({ provider, open, onClose, onConnect, theme, networks, }: WalletSelectorProps): React.ReactPortal | null;
|
|
195
|
+
|
|
196
|
+
type Theme = "light" | "dark" | "auto";
|
|
197
|
+
interface DecaneKitProps {
|
|
198
|
+
config?: DecaneConfig;
|
|
199
|
+
children: ReactNode;
|
|
200
|
+
}
|
|
201
|
+
declare function DecaneKit({ config, children }: DecaneKitProps): React.JSX.Element;
|
|
202
|
+
|
|
203
|
+
declare function useDecane(): {
|
|
204
|
+
provider: DecaneProvider;
|
|
205
|
+
wallets: UnifiedWalletAccount[];
|
|
206
|
+
evmWallets: UnifiedWalletAccount[];
|
|
207
|
+
solanaWallets: UnifiedWalletAccount[];
|
|
208
|
+
multiChainWallets: UnifiedWalletAccount[];
|
|
209
|
+
chains: ChainDescriptor[];
|
|
210
|
+
connectedWallet: UnifiedWalletAccount | null;
|
|
211
|
+
activeSession: ActiveSession | null;
|
|
212
|
+
activeChain: string | null;
|
|
213
|
+
isConnected: boolean;
|
|
214
|
+
theme: Theme;
|
|
215
|
+
setTheme: (t: Theme) => void;
|
|
216
|
+
connect: (wallet: UnifiedWalletAccount, preference?: ChainType) => Promise<void>;
|
|
217
|
+
disconnect: () => Promise<void>;
|
|
218
|
+
addChain: (chain: ChainDescriptor) => void;
|
|
219
|
+
removeChain: (chainId: string) => void;
|
|
220
|
+
};
|
|
221
|
+
declare function useWalletSelector(): {
|
|
222
|
+
isOpen: boolean;
|
|
223
|
+
open: () => void;
|
|
224
|
+
close: () => void;
|
|
225
|
+
};
|
|
226
|
+
declare function useChainSwitch(): {
|
|
227
|
+
switchChain: (chainId: string) => Promise<void>;
|
|
228
|
+
loading: boolean;
|
|
229
|
+
error: DecaneError | null;
|
|
230
|
+
activeChain: string | null;
|
|
231
|
+
grantedChains: string[];
|
|
232
|
+
};
|
|
233
|
+
declare function useSignMessage(): {
|
|
234
|
+
signMessage: (message: string, options?: {
|
|
235
|
+
chainId?: string;
|
|
236
|
+
account?: string;
|
|
237
|
+
}) => Promise<string>;
|
|
238
|
+
signature: string | null;
|
|
239
|
+
loading: boolean;
|
|
240
|
+
error: DecaneError | null;
|
|
241
|
+
reset: () => void;
|
|
242
|
+
};
|
|
243
|
+
interface TxParams {
|
|
244
|
+
to: string;
|
|
245
|
+
value?: string;
|
|
246
|
+
data?: string;
|
|
247
|
+
gas?: string;
|
|
248
|
+
gasPrice?: string;
|
|
249
|
+
}
|
|
250
|
+
declare function useSendTransaction(): {
|
|
251
|
+
sendTransaction: (tx: TxParams, options?: {
|
|
252
|
+
chainId?: string;
|
|
253
|
+
from?: string;
|
|
254
|
+
}) => Promise<string>;
|
|
255
|
+
txHash: string | null;
|
|
256
|
+
loading: boolean;
|
|
257
|
+
error: DecaneError | null;
|
|
258
|
+
reset: () => void;
|
|
259
|
+
};
|
|
260
|
+
declare function useSignTypedData(): {
|
|
261
|
+
signTypedData: (typedData: {
|
|
262
|
+
domain: unknown;
|
|
263
|
+
types: unknown;
|
|
264
|
+
message: unknown;
|
|
265
|
+
}, options?: {
|
|
266
|
+
chainId?: string;
|
|
267
|
+
account?: string;
|
|
268
|
+
}) => Promise<string>;
|
|
269
|
+
signature: string | null;
|
|
270
|
+
loading: boolean;
|
|
271
|
+
error: DecaneError | null;
|
|
272
|
+
reset: () => void;
|
|
273
|
+
};
|
|
274
|
+
|
|
275
|
+
export { type ActiveSession, BUILT_IN_CHAINS, type CAIP25Method, type CAIP25SessionRequest, type CAIP25SessionResult, CHAINS, type ChainDescriptor, type ChainId, type ChainScope, type ChainSupport, type ChainType, type DecaneConfig, DecaneError, DecaneErrorCode, DecaneKit, type DecaneProvider, type Theme, type TxParams, type UnifiedWalletAccount, WalletSelector, createDecane, useChainSwitch, useDecane, useSendTransaction, useSignMessage, useSignTypedData, useWalletSelector };
|