@flarenetwork/multichain-wallet-connector 0.0.2-rc.21 → 0.0.2-rc.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/index.d.mts +1 -1
- package/dist/core/index.mjs +1 -1
- package/dist/{core-1pT9AVKV.mjs → core-naObEOCc.mjs} +15 -2
- package/dist/core-naObEOCc.mjs.map +1 -0
- package/dist/{index-C6Pp_gsM.d.mts → index-CKRosotG.d.mts} +3 -1
- package/dist/{index-C6Pp_gsM.d.mts.map → index-CKRosotG.d.mts.map} +1 -1
- package/dist/{index-K6sAU1hV.d.mts → index-DMuS4_bh.d.mts} +2 -2
- package/dist/{index-K6sAU1hV.d.mts.map → index-DMuS4_bh.d.mts.map} +1 -1
- package/dist/index.d.mts +2 -2
- package/dist/index.mjs +2 -2
- package/dist/react/index.d.mts +2 -2
- package/dist/react/index.mjs +2 -2
- package/dist/{react-D-tpV70-.mjs → react-CwCy_BYx.mjs} +2 -2
- package/dist/{react-D-tpV70-.mjs.map → react-CwCy_BYx.mjs.map} +1 -1
- package/package.json +1 -1
- package/dist/core-1pT9AVKV.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core-naObEOCc.mjs","names":["TypeUtils","isError","value","Error","isObject","isString","AtLeastOne","T","Partial","K","Required","Pick","P","NonEmptyArray","StripPrefix","Prefix","Rest","shortenAddress","address","prefixLength","suffixLength","minLength","length","slice","objectKeys","obj","T","Array","Object","keys","objectValues","values","objectEntries","entries","objectFromEntries","PropertyKey","K","V","Record","fromEntries","isEmptyObject","value","isArray","stripEmptyObjects","filter","v","CAIP2_NAMESPACES","eip155","xrpl","bip122","const","CAIP2","RpcError","BaseChain","Caip2","Caip2Namespace","Caip2Reference","ChainConfig","ChainInput","Eip155Caip2","EvmChain","ExtractNamespace","ExtractReference","NamespaceFilter","NonEvmChain","XRPlCaip2","TypeUtils","objectEntries","objectFromEntries","CAIP2","ChainGuards","isRpcError","error","isObject","Object","hasOwn","isEvmCaip2","caip2","startsWith","isXrplCaip2","isEvmChain","chain","isEvm","isXrplChain","isEvmNamespace","namespace","getEvmChainIdFromReference","reference","referenceAsNumber","Number","parseInt","id","toString","hex","getChainName","T","parseCaip2","C","split","parseCaip10","account","address","createChain","config","createChainConfig","entries","chainEntries","map","name","evmChain","defineChain","flareCoston","id","name","nativeCurrency","decimals","symbol","rpcUrls","default","http","blockExplorers","url","apiUrl","testnet","Caip2","ChainConfig","ChainRegistry","Eip155Caip2","EvmChain","flareCoston","objectKeys","objectValues","flare","flareTestnet","mainnet","sepolia","songbird","CAIP2","ChainGuards","createChainConfig","defineChainRegistry","Record","registry","T","chainRegistry","caip2Names","chains","testnet","nativeCurrency","name","symbol","decimals","rpcUrls","bip44Part","blockExplorerUrls","ledgerHrp","viem","chainConfig","evmCaip2s","Array","filter","c","isEvmCaip2","evmChains","isEvmChain","isCaip2","caip2","Object","hasOwn","Caip2","Chain","ChainConfig","Eip155Caip2","EvmChain","XRPlCaip2","XrplChain","WalletType","ChainOverride","MultiChainOptions","ResolvedWalletConfig","WalletOptions","ChainGuards","objectEntries","objectKeys","objectValues","defaultChainConfig","ConfigResolver","globalOverrides","Map","walletOverrides","walletOptions","constructor","options","chainOverrides","walletType","walletConfig","wallets","set","getWalletOptions","W","get","resolveForWallet","resolvedChains","caip2","defaultConfig","resolved","resolveChain","Record","createResolvedConfig","globalOverride","walletOverride","rpcUrls","blockExplorerUrls","rpcOverride","source","default","explorerOverride","length","hasOverride","Object","freeze","_override","undefined","chains","evmHexMap","chain","isEvmChain","evmChain","hex","getChain","C","getEvmChain","getXrplChain","getRpcUrl","getSupportedChains","objectFromEntries","errorCodeMap","const","ErrorCodeMap","CodeNumber","CodeName","ReverseErrorCodeMap","buildReverseMap","entries","Array","key","num","Number","name","push","ErrorCode","ErrorCodeKey","CommonCode","Extract","MetaMaskCode","LedgerCode","WalletConnectCode","XamanCode","DcentCode","MetaMaskErrorCode","LedgerErrorCode","WalletConnectErrorCode","XamanErrorCode","DcentErrorCode","ErrorCodeKey","ErrorMessages","Record","COMMON_USER_REJECTED","COMMON_NOT_CONNECTED","COMMON_CHAIN_NOT_CONFIGURED","COMMON_CHAIN_NOT_SUPPORTED","COMMON_FEATURE_NOT_SUPPORTED","COMMON_CONNECTION_FAILED","COMMON_UNKNOWN_CHAIN_ID","COMMON_NO_ACCOUNTS","COMMON_PROVIDER_ERROR","COMMON_CONNECTION_IN_PROGRESS","COMMON_TX_EXPIRED","METAMASK_PROVIDER_NOT_FOUND","METAMASK_CHAIN_NOT_ADDED","METAMASK_NOT_INSTALLED","LEDGER_DEVICE_LOCKED","LEDGER_APP_NOT_OPEN","LEDGER_WRONG_APP","LEDGER_TRANSPORT_ERROR","LEDGER_CONNECTION_FAILED","LEDGER_TX_REJECTED","LEDGER_DEVICE_BUSY","WALLET_CONNECT_SESSION_EXPIRED","WALLET_CONNECT_PAIRING_FAILED","WALLET_CONNECT_SESSION_NOT_FOUND","WALLET_CONNECT_PROVIDER_NOT_INITIALIZED","XAMAN_SIGN_REJECTED","XAMAN_QR_TIMEOUT","XAMAN_SDK_NOT_READY","XAMAN_AUTHORIZATION_FAILED","DCENT_NOT_IN_BROWSER","DCENT_SIGN_REJECTED","WalletType","ErrorCodeKey","ErrorCode","ErrorMessages","WalletError","Error","code","codeKey","walletType","cause","constructor","message","name","Object","setPrototypeOf","new","target","prototype","ErrorCodeKey","WalletType","WalletError","XrplError","XrplWalletError","name","constructor","walletType","code","cause","fromError","error","message","includes","DcentErrorCode","WalletError","DcentError","name","constructor","code","cause","fromError","_error","LedgerErrorCode","WalletError","DisconnectedDevice","DisconnectedDeviceDuringOperation","LockedDeviceError","StatusCodes","TransportInterfaceNotAvailable","TransportOpenUserCancelled","TransportRaceCondition","TransportStatusError","TransportErrorMapping","match","error","code","LedgerError","name","TRANSPORT_MAPPINGS","e","statusCode","LOCKED_DEVICE","CLA_NOT_SUPPORTED","USER_REFUSED_ON_DEVICE","CONDITIONS_OF_USE_NOT_SATISFIED","constructor","cause","fromError","mapping","BaseChain","Caip2","Chain","Eip155Caip2","EvmChain","XRPlCaip2","RpcError","ChainGuards","TypeUtils","ChainUtils","isEvmCaip2","caip2","isXrplCaip2","isEvmChain","chain","isRpcError","error","isObject","code","isRpcErrorWithCode","buildEvmHexMap","chains","Iterable","Map","map","set","evmChain","hex","MetaMaskErrorCode","WalletError","ChainUtils","MetaMaskError","name","constructor","code","cause","fromError","error","isRpcErrorWithCode","WalletConnectErrorCode","WalletError","ChainUtils","WalletConnectError","name","constructor","code","cause","fromError","error","isRpcErrorWithCode","XamanErrorCode","WalletError","XamanError","name","constructor","code","cause","fromError","_error","WalletType","XrplWalletError","DcentError","LedgerError","MetaMaskError","WalletConnectError","XamanError","WalletError","WalletErrorHelper","isWalletError","error","from","walletType","xrplError","fromError","_exhaustive","TypeUtils","ErrorUtils","extractMessage","error","isString","isError","message","isObject","JSON","stringify","ensureError","Error","Caip2","WalletAddressState","WalletErrorState","WalletStore","WalletType","ChainUtils","ConnectedEventData","address","addresses","caip2","AddressChangedEventData","ConnectorEventEmitter","constructor","store","walletType","startConnecting","send","type","connected","data","activeAddress","availableAddresses","resolveAddresses","reconnected","startDisconnecting","disconnected","chainChanged","addressChanged","error","length","isEvm","isEvmCaip2","map","ResolvedWalletConfig","WalletStore","SupportedWalletChains","WalletType","Connector","ConnectorConfig","ConnectorProvider","WalletErrorHelper","ErrorUtils","ConnectorEventEmitter","BaseConnector","W","TClient","TProvider","walletType","events","store","config","resolvedConfig","initPromise","Promise","initResolved","constructor","connect","wrapAsync","bind","disconnect","restoreConnection","switchChain","initialized","initialize","onInitialize","then","catch","error","resetInitialization","emitError","message","extractMessage","code","isWalletError","args","method","T","Parameters","apply","caip2","getClient","getProvider","Client","parseAccountRootFlags","RippledError","BaseXrplClient","onDestroy","Promise","isConnected","disconnect","ensureConnected","connect","requiresDestinationTag","address","response","request","command","account","flags","result","account_data","Flags","lsfRequireDestTag","isDepositAuthEnabled","lsfDepositAuth","getBalance","getXrpBalance","error","message","XRPlCaip2","XrplChain","BaseXrplClient","XrplClient","chain","constructor","rpcUrls","getCaip2","Promise","caip2","onDestroy","XRPlCaip2","XrpClient","ResolvedWalletConfig","SubmittableTransaction","DcentXrplProvider","XrplClient","DcentError","DcentXrplResponse","hash","DcentXrpClient","constructor","provider","resolvedConfig","sendTx","tx","Promise","caip2","getCaip2","result","request","method","params","tx_json","submit","chainId","autofill","getBalance","address","xrplClient","getSimpleClient","requiresDestinationTag","isDepositAuthEnabled","chain","getXrplChain","info","getWalletInfo","onDestroy","XRPlCaip2","ConnectorConfig","WalletStore","SupportedWalletChains","DcentXrplProvider","BaseConnector","DcentError","DcentXrpClient","DCENT_NETWORK_MAP","Record","DcentProvider","DcentConnector","client","provider","constructor","store","config","isAvailable","window","xrpl","getDynamicLink","targetUrl","caip2","url","URL","searchParams","set","toString","onInitialize","Promise","resolvedConfig","connect","_chains","connectionState","initialize","events","startConnecting","accounts","request","method","length","address","getCaip2","connected","addresses","disconnect","startDisconnecting","disconnected","restoreConnection","reconnected","switchChain","params","chainId","chainChanged","getClient","getProvider","getSnapshot","context","Caip2","LedgerDerivationPath","LedgerDerivationPathNoMaster","LedgerHDStandard","LedgerPaginatedBip44","chainConfig","isCaip2","BIP44_HARDENED_OFFSET","Bip44PathComponent","value","hardened","toString","Bip44","_purpose","_coinType","_account","_change","_addressIndex","constructor","path","normalizedPath","startsWith","slice","segments","split","length","Error","parseComponent","purpose","coinType","account","change","addressIndex","getPaginatedBip44s","from","to","ledgerHDStandard","caip2","paths","Array","fromCaip2ToCoinType","i","push","chain","bip44Part","fromCaip2","fromCoin","bitcoin","ethereum","ledgerLiveEthereum","accountIndex","getIndexForStandard","standard","isChangeAddress","isReceivingAddress","getFullPath","getPathWithoutMaster","toPathArray","hardenedValue","deriveFromAddressIndex","newAddressIndex","nextAddress","toReceivingAddress","index","undefined","toChangeAddress","deriveAccount","getNextPaginatedBip44s","currentAccountIndex","isValidCaip2","component","endsWith","Number","parseInt","isNaN","TypeError","ConnectionMutex","queue","Promise","resolve","run","fn","T","release","waitForTurn","r","Hex","LedgerHexUtils","ensureLeading0x","input","startsWith","trimLeading0x","substring","fromBuffer","buffer","Uint8Array","hexes","Array","from","map","item","toString","padStart","join","LedgerComputedAddress","Bip44","Hex","LedgerApp","secp256k1","publicKeyToAddress","bytesToHex","LedgerHexUtils","LedgerAddressHelper","getComputedAddresses","app","bip44s","Array","hrp","Promise","addresses","bip44","computedAddress","getComputedAddress","push","compressedPKToAddress","compressedPK","Buffer","publicKeyHex","point","Point","fromHex","trimLeading0x","uncompressedPublicKeyHex","fromBuffer","toBytes","Eth","HashTypedDataParameters","LedgerDerivationPathNoMaster","getAddress","getTypesForEIP712Domain","hashDomain","hashStruct","serializeSignature","serializeTransaction","toAccount","LedgerHexUtils","EthLedgerAccountArgs","ledger","derivationPath","ledgerToEthAccount","MessageTypeProperty","name","type","DEFAULT_ETH_DERIVATION_PATH","resolvedPath","address","publicKey","account","signTransaction","transaction","hash","signedTxn","trimLeading0x","v","_v","r","s","BigInt","ensureLeading0x","error","Error","String","signMessage","message","signPersonalMessage","Buffer","from","toString","signTypedData","_parameters","domain","primaryType","types","EIP712Domain","domainSeparator","Record","messageHash","data","signEIP712HashedMessage","source","LedgerAppName","LedgerComputedAddress","Transport","Bip44","Account","LedgerTransportManager","EvmLedgerApp","Eth","LedgerAddressHelper","ledgerToEthAccount","EthereumLedgerApp","appName","transportManager","constructor","transport","create","Promise","open","getComputedAddress","bip44","_hrp","addressData","getAddress","getFullPath","address","getComputedAddresses","bip44s","Array","hrp","getViemAccount","ledger","derivationPath","getPathWithoutMaster","verifyActive","verifyApp","FlareApp","LedgerDerivationPathNoMaster","getAddress","serializeSignature","serializeTransaction","toAccount","LedgerHexUtils","FlareLedgerAccountArgs","ledger","derivationPath","ledgerToFlareAccount","DEFAULT_ETH_DERIVATION_PATH","resolvedPath","address","publicKey","getEVMAddress","account","signTransaction","transaction","hash","signedTxn","signEVMTransaction","trimLeading0x","v","_v","r","s","BigInt","ensureLeading0x","error","Error","String","signMessage","message","signPersonalMessage","Buffer","from","toString","signTypedData","source","LedgerAppName","LedgerComputedAddress","Transport","Bip44","Account","LedgerTransportManager","EvmLedgerApp","FlareApp","LedgerAddressHelper","ledgerToFlareAccount","FlareLedgerApp","appName","transportManager","constructor","transport","create","Promise","open","getComputedAddress","bip44","hrp","addressData","getAddressAndPubKey","getFullPath","address","compressedPKToAddress","compressed_pk","getComputedAddresses","bip44s","Array","getViemAccount","ledger","derivationPath","getPathWithoutMaster","verifyActive","verifyApp","LedgerAppName","LedgerComputedAddress","Bip44","LedgerTransportManager","LedgerApp","Xrp","LedgerAddressHelper","XrpLedgerApp","xrp","appName","transportManager","constructor","getXrp","Promise","transport","open","getAddress","path","address","publicKey","signTransaction","rawTxHex","getComputedAddress","bip44","_hrp","pathWithoutMaster","getPathWithoutMaster","getComputedAddresses","bip44s","Array","hrp","verifyActive","close","verifyApp","LedgerApp","LedgerAppName","LedgerCaip2","LedgerTransportManager","EthereumLedgerApp","FlareLedgerApp","XrpLedgerApp","LedgerError","CHAIN_TO_APP","Record","LedgerAppFactory","getRequiredAppName","chain","apps","length","createApp","transportManager","Promise","validApps","appName","create","Account","PublicClient","Chain","ViemChain","WalletClient","Eip155Caip2","EvmChain","Caip2ToViewChain","objectFromEntries","createPublicClient","createWalletClient","defineChain","http","chainRegistry","evmChains","ViemHelper","caip2ToViemChain","buildChainMap","toViemChain","chain","id","Number","evmChain","name","nativeCurrency","rpcUrls","default","blockExplorers","blockExplorerUrls","length","url","undefined","testnet","derivedViemChains","map","caip2","viem","chains","getViemWalletClientFromAccount","account","transport","getViemPublicClientFromAccount","_account","Caip2","Chain","ChainClient","BaseEvmClient","chainConfig","constructor","getCaip2","Promise","caip2","getBalance","address","onDestroy","EvmChain","Account","Address","EIP1193Provider","PublicClient","WalletClient","ViemHelper","BaseEvmClient","createPublicClient","createWalletClient","custom","http","EvmClient","publicClient","walletClient","constructor","chainConfig","create","provider","viemChain","toViemChain","chain","transport","createReadOnly","rpcUrls","getPublicClient","getWalletClient","getAccount","Promise","account","address","getAddresses","getBalance","evmChainConfig","EvmChain","LedgerClient","Account","PublicClient","WalletClient","LedgerApp","CreateLedgerClientArgs","ViemHelper","EvmClient","LedgerEvmClient","_app","constructor","chain","publicClient","walletClient","app","createForLedger","args","account","getViemPublicClientFromAccount","caip2","getViemWalletClientFromAccount","getLedgerApp","verifyDevice","Promise","verifyActive","XrplChain","LedgerClient","XrpClient","SubmittableTransaction","XrpLedgerApp","CreateLedgerClientArgs","XrplClient","encode","LedgerXrpClient","args","constructor","chain","getLedgerApp","app","getAddressInfo","Promise","address","publicKey","path","bip44","getPathWithoutMaster","getAddress","verifyDevice","verifyActive","sendTx","tx","ensureConnected","prepared","autofill","SigningPubKey","toUpperCase","unsignedBlob","signature","signTransaction","TxnSignature","signedBlob","result","submitAndWait","hash","LedgerClient","ResolvedWalletConfig","Bip44","EvmLedgerApp","LedgerApp","LedgerCaip2","ChainGuards","LedgerEvmClient","LedgerXrpClient","LedgerError","LedgerClientFactory","constructor","resolvedConfig","create","chain","app","bip44","Promise","isXrplCaip2","xrplChain","getXrplChain","caip2","isEvmCaip2","evmChain","getEvmChain","viemAccount","getViemAccount","createForLedger","LocalStorageFullKey","TPrefix","TSeparator","TKey","LocalStorageManagerOptions","prefix","separator","LocalStorageManager","Record","constructor","options","getPrefixedKey","TSchema","key","K","String","getKey","set","value","fullKey","stringifiedValue","JSON","stringify","localStorage","setItem","error","console","get","storedValue","getItem","parse","remove","removeItem","has","clear","prefixWithSeparator","keysToRemove","i","length","startsWith","push","forEach","Caip2","LedgerCaip2","LedgerDerivationPath","LedgerHDStandard","WalletType","LocalStorageManager","MWCStorageSchema","Record","mwcStorage","prefix","separator","MWCStorage","MWCStorage","LedgerCaip2","LedgerDerivationPath","LedgerHDStandard","mwcStorage","LedgerStorage","constructor","storage","setCaip2","caip2","set","getCaip2","get","setBip44","bip44","getBip44","setHDStandard","standard","getHDStandard","clear","remove","ledgerStorage","LedgerCaip2","LedgerComputedAddress","LedgerHDStandard","Bip44","LedgerError","ledgerStorage","LedgerSession","caip2","bip44","hdStandard","account","LedgerSessionManager","current","save","session","setCaip2","setBip44","getFullPath","setHDStandard","loadSaved","getCaip2","bip44Path","getBip44","getHDStandard","clear","getSession","requireSession","LedgerAppAndVersion","LedgerAppName","TransportWebHID","LedgerError","DeviceStatus","available","currentApp","LedgerTransportManager","transport","disconnectHandler","open","Promise","console","debug","openTransport","attachDisconnectHandler","checkDeviceStatus","devices","list","length","openConnected","getCurrentApp","name","error","response","send","index","format","nameLength","nameStartIndex","subarray","toString","versionLength","versionStartIndex","version","flagLength","flagsStartIndex","flags","existing","create","verifyApp","expectedAppName","Error","close","onDisconnect","handler","on","LedgerClient","ConnectorConfig","LedgerProvider","WalletStore","LedgerSession","LedgerCaip2","LedgerComputedAddress","LedgerConnectOptions","BaseConnector","Bip44","ConnectionMutex","LedgerAppFactory","LedgerClientFactory","LedgerSessionManager","LedgerTransportManager","LedgerError","LedgerConnector","transportManager","sessionManager","clientFactory","mutex","client","constructor","store","config","resolvedConfig","onDisconnect","handleDisconnect","onInitialize","Promise","connect","chain","options","console","debug","run","performConnect","bip44","fromCaip2","ledgerHDStandard","disconnect","events","startDisconnecting","close","clear","disconnected","restoreConnection","saved","loadSaved","status","checkDeviceStatus","available","requiredApp","getRequiredAppName","caip2","currentApp","name","required","current","performRestore","switchChain","hdStandard","requireSession","account","change","addressIndex","getSession","getClient","getProvider","fetchAddressesForSelection","paths","requireApp","app","createApp","getComputedAddresses","getChain","ledgerHrp","startConnecting","establishConnection","save","connected","address","addresses","error","NonNullable","ReturnType","this","reconnected","hrp","result","getComputedAddress","create","fromError","getCurrentApp","Error","Eip155Caip2","MetaMaskProvider","Hex","MetamaskConnectEVM","SupportedWalletChains","ChainGuards","EvmClient","BaseConnector","createEVMClient","ChainUtils","MetaMaskError","RPC_ERROR","USER_REJECTED","REQUEST_PENDING","const","MetaMaskConnector","sdk","provider","client","onInitialize","Promise","supportedNetworks","Record","caip2","resolvedConfig","getSupportedChains","isEvmCaip2","chain","getEvmChain","evmChain","hex","rpcUrls","dapp","name","config","metadata","url","api","getProvider","on","accounts","onAccountsChanged","onChainChanged","getConnectionState","events","disconnected","connect","initialize","startConnecting","targetHex","undefined","chainId","existingAccount","getAccount","existingChainId","getChainId","result","chainIds","catch","error","isRpcErrorWithCode","length","currentChain","evmHexMap","get","switchChain","createClient","connected","address","addresses","disconnect","startDisconnecting","initialized","restoreConnection","account","reconnected","chainConfiguration","chainName","nativeCurrency","blockExplorerUrls","getClient","request","method","then","addressChanged","emitError","getCurrentCaip2","chainChanged","create","store","getSnapshot","context","connectionState","EvmChain","UniversalProvider","PublicClient","WalletClient","ViemHelper","EvmClient","createPublicClient","createWalletClient","custom","http","WalletConnectEvmClient","constructor","chain","publicClient","walletClient","createWithProvider","chainConfig","provider","viemChain","toViemChain","transport","rpcUrls","XRPlCaip2","XrplChain","XrpClient","GirinSignedTxJson","UniversalProvider","SubmittableTransaction","XrplClient","stripEmptyObjects","encode","WalletConnectXrpClient","provider","constructor","chain","sendTx","tx","Promise","connect","prepared","autofill","xrpCaip2","getCaip2","isHexTrust","result","request","tx_json","hash","method","params","submit","signedTx","sanitizeTx","signedBlob","res","submitAndWait","disconnect","walletResult","isGirin","TransactionType","Account","Fee","Sequence","SigningPubKey","TxnSignature","Flags","LastLedgerSequence","Destination","Amount","DestinationTag","Memos","SourceTag","peerName","getPeerName","includes","_walletResult","session","peer","metadata","name","toLowerCase","Caip2","ChainClient","ResolvedWalletConfig","UniversalProvider","ChainUtils","WalletConnectEvmClient","WalletConnectXrpClient","WalletConnectError","WalletConnectClientFactory","constructor","provider","resolvedConfig","create","caip2","isEvmCaip2","chain","getEvmChain","createWithProvider","isXrplCaip2","getXrplChain","Caip2","MWCStorage","mwcStorage","SessionStorage","constructor","storage","setLastSession","session","set","getLastSession","get","setLastAddress","address","getLastAddress","setLastChain","caip2","getLastChain","clear","remove","sessionStorage","Caip2","WalletAddressState","UniversalProvider","parseCaip10","ChainUtils","WalletConnectError","sessionStorage","ParsedSession","availableAddresses","selectedAddress","WalletConnectSessionManager","constructor","provider","parseSession","session","eip155","namespaces","accounts","account","namespace","reference","address","push","type","caip2","isEvm","xrpl","resolveSessionWithStorage","parsedSession","lastAddress","getLastAddress","lastChain","getLastChain","validAddress","find","addressState","saveLastConnection","setLastAddress","setLastChain","buildNamespaces","chains","evmChains","filter","isEvmCaip2","xrplChains","isXrplCaip2","Record","methods","events","length","Caip2","ChainClient","WalletConnectConnectorConfig","WalletConnectProvider","AppKit","CaipNetwork","WalletStore","SessionTypes","SupportedWalletChains","ProviderRpcError","parseCaip2","BaseConnector","createAppKit","objectEntries","UniversalProvider","WalletConnectClientFactory","WalletConnectSessionManager","sessionStorage","WalletConnectError","WalletConnectConnector","config","provider","sessionManager","clientFactory","appKit","client","constructor","store","onInitialize","Promise","init","projectId","metadata","name","description","url","icons","resolvedConfig","universalProvider","manualWCControl","networks","buildAppKitNetworks","customRpcUrls","buildCustomRpcUrls","registerProviderEvents","registerModalCloseHandler","connect","chains","connectionState","length","initialize","events","startConnecting","open","getProvider","optionalNamespaces","buildNamespaces","then","session","onSessionCreated","catch","error","onConnectionFailed","disconnect","startDisconnecting","clear","initialized","disconnected","restoreConnection","parsedSession","parseSession","resolved","resolveSessionWithStorage","selectedAddress","create","caip2","reconnected","address","addresses","availableAddresses","map","switchChain","targetAddress","find","saveLastConnection","chainChanged","getClient","on","_uri","onDisconnect","chainId","onChainChanged","accounts","onAccountsChanged","event","id","onProposalExpire","subscribeState","state","Struct","close","emitError","connected","Error","message","includes","console","log","newAddress","matched","addressChanged","storedCaip2","warn","chain","isEvm","reference","push","Number","chainNamespace","caipNetworkId","nativeCurrency","rpcUrls","default","http","first","rest","Record","Array","getSnapshot","context","XRPlCaip2","XrpClient","ResolvedWalletConfig","SubmittableTransaction","XamanConfig","XamanNetworkKey","XamanPayloadResult","XamanSendTxOptions","XummPayloadBody","parseCaip2","XrplClient","Xumm","XamanError","XamanClient","NETWORK_KEYS","Record","resolvedConfig","constructor","config","apiKey","sendTx","tx","sendTxOptions","Promise","payload","caip2","getCaip2","reference","networkKey","txjson","options","custom_meta","user_token","force_network","subscription","createAndSubscribe","event","data","undefined","created","result","resolved","txid","response","networkId","user","toCaip2Network","onDestroy","logout","getBalance","address","simpleClient","getSimpleClient","requiresDestinationTag","isDepositAuthEnabled","chain","getXrplChain","Caip2","XamanConnectorConfig","XamanProvider","WalletStore","SupportedWalletChains","BaseConnector","XamanError","XamanClient","XamanConnector","config","client","constructor","store","onInitialize","Promise","apiKey","resolvedConfig","on","onReady","onSuccess","catch","error","emitError","onError","onLogout","event","network","onNetworkSwitch","restoreConnection","connect","_chains","connectionState","initialize","events","startConnecting","getClient","authorize","disconnect","startDisconnecting","initialized","logout","resetInitialization","disconnected","switchChain","_caip2","getProvider","isLoggedIn","address","user","account","networkId","caip2","getCaip2","isReconnect","eventData","addresses","reconnected","connected","toCaip2Network","storedCaip2","chainChanged","runtime","xapp","getSnapshot","context","ResolvedWalletConfig","WalletConnectWalletOptions","WalletMetadata","WalletOptionsMap","XamanWalletOptions","WalletStore","WalletType","Connector","DcentConnector","LedgerConnector","MetaMaskConnector","WalletConnectConnector","XamanConnector","AnyConnector","DEFAULT_METADATA","name","url","window","location","origin","CreateConnectorOptions","walletType","W","store","resolvedConfig","walletOptions","ConnectorFactory","create","options","metadata","wcOptions","projectId","xamanOptions","apiKey","Error","WalletType","WalletState","WalletStore","objectFromEntries","createStore","AggregateWalletState","wallets","Record","T","AggregateWalletEvents","walletUpdated","walletType","context","NoAggregateWalletEmittedEvents","createAggregateWalletStore","stores","Map","initialWallets","Array","from","entries","map","type","store","getSnapshot","on","state","AggregateWalletStore","ReturnType","Caip2","WalletType","ExtractEvents","createStore","WalletConnectionState","WalletErrorState","code","message","WalletAddressState","Extract","type","K","address","isEvm","caip2","T","WalletState","connectionState","activeAddress","availableAddresses","Array","error","WalletStoreEvents","startConnecting","Record","connectionEstablished","connectionRestored","startDisconnecting","disconnected","chainChanged","addressChanged","WalletStoreEmittedEvents","walletConnected","walletType","isReconnect","walletDisconnected","walletError","walletChainChanged","walletAddressChanged","WalletEmittedEvent","INITIAL_STATE","undefined","createWalletStore","context","on","enqueue","emit","_","WalletStore","ReturnType","Caip2","MultiChainEvents","MultiChainOptions","ConcreteConnector","Connector","ConnectWalletArgs","createBrowserInspector","AggregateWalletStore","WalletEmittedEvent","WalletStore","WalletType","Subscription","ConfigResolver","ConnectorFactory","createAggregateWalletStore","createWalletStore","objectEntries","objectValues","AnyConnector","MultiChain","stores","Map","connectors","aggregateStore","configResolver","events","subscriptions","mounted","constructor","options","inspector","ReturnType","walletType","walletOptions","wallets","wType","store","set","inspect","resolvedConfig","resolveForWallet","connector","create","registerGlobalListeners","registerAggregateSync","mount","Promise","results","allSettled","Array","from","entries","map","initialize","restoreConnection","result","status","console","warn","reason","disconnect","get","Error","disconnectAll","disconnectPromises","values","all","connect","args","wallet","getConnector","chains","chain","getAggregateStore","getWalletTypes","keys","W","onWalletEvent","eventType","K","callback","event","type","undefined","on","getConfigResolver","isConnectedByCaip2","caip2","getSnapshot","context","some","state","connectionState","push","onConnect","address","activeAddress","availableAddresses","isReconnect","onDisconnect","onError","error","message","onChainChanged","sync","send","subscribe"],"sources":["../src/core/shared/type-utils.ts","../src/core/utils/utils.ts","../src/core/chains/chain.constants.ts","../src/core/chains/chain.utils.ts","../src/core/chains/viem/custom-chains.ts","../src/core/chains/chain-registry.ts","../src/core/config/config-resolver.ts","../src/core/errors/error-codes.ts","../src/core/errors/error-messages.ts","../src/core/errors/wallet-error.ts","../src/core/clients/xrp/xrpl-error.ts","../src/core/connectors/dcent/dcent-error.ts","../src/core/connectors/ledger/ledger-error.ts","../src/core/utils/chain-utils.ts","../src/core/connectors/metamask/metamask-error.ts","../src/core/connectors/wallet-connect/wallet-connect-error.ts","../src/core/connectors/xaman/xaman-error.ts","../src/core/errors/wallet-error-helper.ts","../src/core/utils/error-utils.ts","../src/core/connectors/connector-events.ts","../src/core/connectors/base-connector.ts","../src/core/clients/xrp/base-xrpl-client.ts","../src/core/clients/xrp/xrpl-client.ts","../src/core/connectors/dcent/dcent-xrpl-client.ts","../src/core/connectors/dcent/dcent-connector.ts","../src/core/shared/bip44.ts","../src/core/shared/connection-mutex.ts","../src/core/connectors/ledger/internal/ledger-hex-utils.ts","../src/core/connectors/ledger/internal/ledger-address-helper.ts","../src/core/connectors/ledger/apps/ethereum/ethereum-viem-adapter.ts","../src/core/connectors/ledger/apps/ethereum/ethereum-ledger-app.ts","../src/core/connectors/ledger/apps/flare/flare-viem-adapter.ts","../src/core/connectors/ledger/apps/flare/flare-ledger-app.ts","../src/core/connectors/ledger/apps/xrp/xrp-ledger-app.ts","../src/core/connectors/ledger/internal/ledger-app-factory.ts","../src/core/chains/viem/viem-helper.ts","../src/core/clients/base-evm-client.ts","../src/core/clients/evm/evm-client.ts","../src/core/connectors/ledger/clients/ledger-evm-client.ts","../src/core/connectors/ledger/clients/ledger-xrp-client.ts","../src/core/connectors/ledger/internal/ledger-client-factory.ts","../src/core/storage/local-storage-manager.ts","../src/core/storage/local-storage-schema.ts","../src/core/connectors/ledger/internal/ledger-storage.ts","../src/core/connectors/ledger/internal/ledger-session-manager.ts","../src/core/connectors/ledger/internal/ledger-transport-manager.ts","../src/core/connectors/ledger/ledger-connector.ts","../src/core/connectors/metamask/metamask-connector.ts","../src/core/connectors/wallet-connect/clients/wallet-connect-evm-client.ts","../src/core/connectors/wallet-connect/clients/wallet-connect-xrpl-client.ts","../src/core/connectors/wallet-connect/internal/wallet-connect-client-factory.ts","../src/core/connectors/wallet-connect/internal/wallet-connect-session-storage.ts","../src/core/connectors/wallet-connect/internal/wallet-connect-session-manager.ts","../src/core/connectors/wallet-connect/wallet-connect-connector.ts","../src/core/connectors/xaman/xaman-xrpl-client.ts","../src/core/connectors/xaman/xaman-connector.ts","../src/core/connectors/connector-factory.ts","../src/core/stores/wallet-store/aggregate-wallet-store.ts","../src/core/stores/wallet-store/wallet-store.ts","../src/core/multichain/multichain.ts"],"sourcesContent":["export class TypeUtils {\r\n static isError(value: unknown): value is Error {\r\n return value instanceof Error;\r\n }\r\n\r\n static isObject(value: unknown): value is object {\r\n return typeof value === \"object\" && value !== null;\r\n }\r\n\r\n static isString(value: unknown): value is string {\r\n return typeof value === \"string\";\r\n }\r\n}\r\n\r\nexport type AtLeastOne<T, K extends keyof T = keyof T> = Partial<T> &\r\n {\r\n [P in K]: Required<Pick<T, P>>;\r\n }[K];\r\n\r\nexport type NonEmptyArray<T> = [T, ...T[]];\r\n\r\nexport type StripPrefix<T extends string, Prefix extends string> = T extends `${Prefix}${infer Rest}` ? Rest : T;\r\n","/**\r\n * Shortens an address for display (e.g., \"0x1234...abcd\").\r\n * @param address - The full address string\r\n * @param prefixLength - Number of characters to show at start (default: 6)\r\n * @param suffixLength - Number of characters to show at end (default: 4)\r\n */\r\nexport function shortenAddress(address: string, prefixLength = 6, suffixLength = 4): string {\r\n const minLength = prefixLength + suffixLength + 3; // 3 for \"...\"\r\n if (address.length <= minLength) {\r\n return address;\r\n }\r\n return `${address.slice(0, prefixLength)}...${address.slice(-suffixLength)}`;\r\n}\r\n\r\n/** Type-safe `Object.keys()` that preserves key types. */\r\nexport function objectKeys<T extends object>(obj: T): Array<keyof T> {\r\n return Object.keys(obj) as Array<keyof T>;\r\n}\r\n\r\n/** Type-safe `Object.values()` that preserves value types. */\r\nexport function objectValues<T extends object>(obj: T): Array<T[keyof T]> {\r\n return Object.values(obj) as Array<T[keyof T]>;\r\n}\r\n\r\n/** Type-safe `Object.entries()` that preserves key and value types. */\r\nexport function objectEntries<T extends object>(obj: T): Array<[keyof T, T[keyof T]]> {\r\n return Object.entries(obj) as Array<[keyof T, T[keyof T]]>;\r\n}\r\n\r\n/** Type-safe `Object.fromEntries()` that preserves key and value types. */\r\nexport function objectFromEntries<K extends PropertyKey, V>(entries: Array<[K, V]>): Record<K & string, V> {\r\n return Object.fromEntries(entries) as Record<K & string, V>;\r\n}\r\n\r\nfunction isEmptyObject(value: unknown): boolean {\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value) && Object.keys(value).length === 0;\r\n}\r\n\r\n/** Strips fields with empty object values ({}) from an object. */\r\nexport function stripEmptyObjects<T extends object>(obj: T): T {\r\n return objectFromEntries(objectEntries(obj).filter(([, v]) => !isEmptyObject(v))) as T;\r\n}\r\n","export const CAIP2_NAMESPACES = {\r\n eip155: \"eip155\",\r\n xrpl: \"xrpl\",\r\n bip122: \"bip122\",\r\n} as const;\r\n\r\nexport const CAIP2 = {\r\n [CAIP2_NAMESPACES.eip155]: {\r\n \"1\": \"Ethereum Mainnet\",\r\n \"11155111\": \"Ethereum Sepolia\",\r\n \"14\": \"Flare Mainnet\",\r\n \"16\": \"Flare Testnet Coston\",\r\n \"114\": \"Flare Testnet Coston2\",\r\n \"19\": \"Songbird Canary-Network\",\r\n },\r\n [CAIP2_NAMESPACES.xrpl]: {\r\n \"0\": \"XRP Ledger Mainnet\",\r\n \"1\": \"XRP Ledger Testnet\",\r\n },\r\n [CAIP2_NAMESPACES.bip122]: {\r\n \"1a91e3dace36e2be3bf030a65679fe821\": \"Dogecoin Mainnet\",\r\n },\r\n} as const;\r\n","import type { RpcError } from \"viem\";\r\n\r\nimport type {\r\n BaseChain,\r\n Caip2,\r\n Caip2Namespace,\r\n Caip2Reference,\r\n ChainConfig,\r\n ChainInput,\r\n Eip155Caip2,\r\n EvmChain,\r\n ExtractNamespace,\r\n ExtractReference,\r\n NamespaceFilter,\r\n NonEvmChain,\r\n XRPlCaip2,\r\n} from \"./chain.types\";\r\nimport { TypeUtils } from \"@shared/type-utils\";\r\nimport { objectEntries, objectFromEntries } from \"@utils/utils\";\r\nimport { CAIP2 } from \"./chain.constants\";\r\n\r\nexport class ChainGuards {\r\n static isRpcError(error: unknown): error is RpcError {\r\n return TypeUtils.isObject(error) && Object.hasOwn(error, \"code\");\r\n }\r\n static isEvmCaip2(caip2: Caip2): caip2 is Eip155Caip2 {\r\n return caip2.startsWith(\"eip155:\");\r\n }\r\n\r\n static isXrplCaip2(caip2: Caip2): caip2 is XRPlCaip2 {\r\n return caip2.startsWith(\"xrpl:\");\r\n }\r\n\r\n static isEvmChain(chain: BaseChain): chain is EvmChain {\r\n return chain.isEvm;\r\n }\r\n\r\n static isXrplChain(chain: BaseChain): chain is BaseChain<NamespaceFilter<Caip2, \"xrpl\">> {\r\n return chain.caip2.startsWith(\"xrpl:\");\r\n }\r\n\r\n static isEvmNamespace = (namespace: Caip2Namespace): namespace is \"eip155\" => namespace === \"eip155\";\r\n}\r\n\r\nfunction getEvmChainIdFromReference(reference: string) {\r\n const referenceAsNumber = Number.parseInt(reference);\r\n return {\r\n id: referenceAsNumber.toString(),\r\n hex: `0x${referenceAsNumber.toString(16)}`,\r\n };\r\n}\r\n\r\nfunction getChainName<T extends Caip2Namespace>(namespace: T, reference: Caip2Reference<T>) {\r\n return CAIP2[namespace][reference];\r\n}\r\n\r\nexport function parseCaip2<C extends Caip2>(\r\n caip2: C\r\n): { namespace: ExtractNamespace<C>; reference: ExtractReference<C> } {\r\n const [namespace, reference] = caip2.split(\":\") as [ExtractNamespace<C>, ExtractReference<C>];\r\n return { namespace, reference };\r\n}\r\n\r\nexport function parseCaip10(account: string): { namespace: string; reference: string; address: string } {\r\n const [namespace, reference, address] = account.split(\":\");\r\n return { namespace, reference, address };\r\n}\r\n\r\nexport function createChain<T extends ChainInput>(config: T): T {\r\n return config;\r\n}\r\n\r\nexport function createChainConfig<T extends { [K in Caip2]: ChainInput }>(config: T): ChainConfig {\r\n const entries = objectEntries(config) as [Caip2, ChainInput][];\r\n\r\n const chainEntries: [Caip2, EvmChain | NonEvmChain][] = entries.map(([caip2, chain]) => {\r\n const { namespace, reference } = parseCaip2(caip2);\r\n const name = getChainName(namespace, reference as Caip2Reference<typeof namespace>);\r\n\r\n if (ChainGuards.isEvmNamespace(namespace)) {\r\n return [\r\n caip2,\r\n { ...chain, namespace, caip2, name, isEvm: true, evmChain: getEvmChainIdFromReference(reference) } as EvmChain,\r\n ];\r\n }\r\n\r\n return [caip2, { ...chain, namespace, caip2, isEvm: false, name } as NonEvmChain];\r\n });\r\n\r\n return objectFromEntries(chainEntries) as ChainConfig;\r\n}\r\n","import { defineChain } from \"viem\";\r\n\r\nexport const flareCoston = defineChain({\r\n id: 16,\r\n name: \"Flare Testnet Coston\",\r\n nativeCurrency: {\r\n decimals: 18,\r\n name: \"Coston Flare\",\r\n symbol: \"CFLR\",\r\n },\r\n rpcUrls: {\r\n default: { http: [\"https://coston-api.flare.network/ext/C/rpc\"] },\r\n },\r\n blockExplorers: {\r\n default: {\r\n name: \"Coston Explorer\",\r\n url: \"https://coston-explorer.flare.network\",\r\n apiUrl: \"https://coston-explorer.flare.network/api\",\r\n },\r\n },\r\n testnet: true,\r\n});\r\n","import type { Caip2, ChainConfig, ChainRegistry, Eip155Caip2, EvmChain } from \"./chain.types\";\r\nimport { flareCoston } from \"@chains/viem/custom-chains\";\r\nimport { objectKeys, objectValues } from \"@utils/utils\";\r\nimport { flare, flareTestnet, mainnet, sepolia, songbird } from \"viem/chains\";\r\nimport { CAIP2 } from \"./chain.constants\";\r\nimport { ChainGuards, createChainConfig } from \"./chain.utils\";\r\n\r\nexport function defineChainRegistry<T extends Record<string, Record<string, string>>>(\r\n registry: ChainRegistry<T>\r\n): ChainRegistry<T> {\r\n return registry;\r\n}\r\n\r\nexport const chainRegistry = defineChainRegistry({\r\n caip2Names: CAIP2,\r\n chains: {\r\n \"eip155:1\": {\r\n testnet: false,\r\n nativeCurrency: {\r\n name: \"Ethereum\",\r\n symbol: \"ETH\",\r\n decimals: 18,\r\n },\r\n rpcUrls: [\"https://mainnet.infura.io/v3/\"],\r\n bip44Part: 60,\r\n blockExplorerUrls: [\"https://etherscan.io\"],\r\n },\r\n\r\n \"eip155:11155111\": {\r\n testnet: true,\r\n nativeCurrency: {\r\n name: \"Ethereum\",\r\n symbol: \"ETH\",\r\n decimals: 18,\r\n },\r\n bip44Part: 60,\r\n rpcUrls: [\"https://sepolia.infura.io/v3/\"],\r\n blockExplorerUrls: [\"https://sepolia.etherscan.io\"],\r\n },\r\n\r\n \"eip155:14\": {\r\n testnet: false,\r\n nativeCurrency: {\r\n name: \"Flare\",\r\n symbol: \"FLR\",\r\n decimals: 18,\r\n },\r\n ledgerHrp: \"flare\",\r\n bip44Part: 60,\r\n rpcUrls: [\"https://flare-api.flare.network/ext/C/rpc\"],\r\n blockExplorerUrls: [\"https://flare-explorer.flare.network\"],\r\n },\r\n\r\n \"eip155:16\": {\r\n testnet: true,\r\n nativeCurrency: {\r\n name: \"Coston Spark\",\r\n symbol: \"CFLR\",\r\n decimals: 18,\r\n },\r\n rpcUrls: [\"https://coston-api.flare.network/ext/C/rpc\"],\r\n ledgerHrp: \"coston\",\r\n bip44Part: 60,\r\n blockExplorerUrls: [\"https://coston-explorer.flare.network\"],\r\n },\r\n\r\n \"eip155:114\": {\r\n testnet: true,\r\n nativeCurrency: {\r\n name: \"Coston2 Spark\",\r\n symbol: \"C2FLR\",\r\n decimals: 18,\r\n },\r\n ledgerHrp: \"costwo\",\r\n bip44Part: 60,\r\n rpcUrls: [\"https://coston2-api.flare.network/ext/C/rpc\"],\r\n blockExplorerUrls: [\"https://coston2-explorer.flare.network\"],\r\n },\r\n\r\n \"eip155:19\": {\r\n testnet: false,\r\n nativeCurrency: {\r\n name: \"Songbird\",\r\n symbol: \"SGB\",\r\n decimals: 18,\r\n },\r\n ledgerHrp: \"songbird\",\r\n bip44Part: 60,\r\n rpcUrls: [\"https://songbird-api.flare.network/ext/C/rpc\"],\r\n blockExplorerUrls: [\"https://songbird-explorer.flare.network\"],\r\n },\r\n\r\n \"xrpl:0\": {\r\n testnet: false,\r\n nativeCurrency: {\r\n name: \"XRP\",\r\n symbol: \"XRP\",\r\n decimals: 15,\r\n },\r\n bip44Part: 144,\r\n rpcUrls: [\"wss://xrplcluster.com\"],\r\n blockExplorerUrls: [\"https://xrpscan.com\"],\r\n },\r\n\r\n \"xrpl:1\": {\r\n testnet: true,\r\n nativeCurrency: {\r\n name: \"XRP\",\r\n symbol: \"XRP\",\r\n decimals: 15,\r\n },\r\n bip44Part: 144,\r\n rpcUrls: [\"wss://s.altnet.rippletest.net:51233\"],\r\n blockExplorerUrls: [\"https://testnet.xrpscan.com\"],\r\n },\r\n\r\n \"bip122:1a91e3dace36e2be3bf030a65679fe821\": {\r\n testnet: false,\r\n nativeCurrency: {\r\n name: \"Dogecoin\",\r\n symbol: \"DOGE\",\r\n decimals: 8,\r\n },\r\n bip44Part: 3,\r\n rpcUrls: [\"https://dogecoin-rpc.com\"],\r\n blockExplorerUrls: [\"https://dogechain.info\"],\r\n },\r\n },\r\n viem: {\r\n chains: {\r\n \"eip155:1\": mainnet,\r\n \"eip155:11155111\": sepolia,\r\n \"eip155:14\": flare,\r\n \"eip155:16\": flareCoston,\r\n \"eip155:114\": flareTestnet,\r\n \"eip155:19\": songbird,\r\n },\r\n },\r\n});\r\n\r\nexport const chainConfig: ChainConfig = createChainConfig(chainRegistry.chains);\r\n\r\nexport const evmCaip2s: Array<Eip155Caip2> = objectKeys(chainConfig).filter((c): c is Eip155Caip2 =>\r\n ChainGuards.isEvmCaip2(c)\r\n);\r\nexport const evmChains: Array<EvmChain> = objectValues(chainConfig).filter((c) =>\r\n ChainGuards.isEvmChain(c)\r\n) as Array<EvmChain>;\r\nexport const isCaip2 = (caip2: string | undefined | null): caip2 is Caip2 => {\r\n if (!caip2) {\r\n return false;\r\n }\r\n return Object.hasOwn(chainConfig, caip2);\r\n};\r\n","import type { Caip2, Chain, ChainConfig, Eip155Caip2, EvmChain, XRPlCaip2, XrplChain } from \"@chains/chain.types\";\r\nimport type { WalletType } from \"@wallets/wallet.types\";\r\nimport type { ChainOverride, MultiChainOptions, ResolvedWalletConfig, WalletOptions } from \"./config-types\";\r\nimport { ChainGuards } from \"@chains/chain.utils\";\r\nimport { objectEntries, objectKeys, objectValues } from \"@utils/utils\";\r\nimport { defaultChainConfig } from \"./config-defaults\";\r\n\r\nexport class ConfigResolver {\r\n private readonly globalOverrides: Map<Caip2, ChainOverride>;\r\n private readonly walletOverrides: Map<WalletType, Map<Caip2, ChainOverride>>;\r\n private readonly walletOptions: Map<WalletType, WalletOptions>;\r\n\r\n constructor(options: MultiChainOptions) {\r\n this.globalOverrides = new Map(objectEntries(options.chainOverrides ?? {}) as [Caip2, ChainOverride][]);\r\n\r\n this.walletOverrides = new Map();\r\n this.walletOptions = new Map();\r\n\r\n for (const [walletType, walletConfig] of objectEntries(options.wallets)) {\r\n if (!walletConfig) continue;\r\n\r\n this.walletOptions.set(walletType, walletConfig);\r\n\r\n if (walletConfig.chainOverrides) {\r\n this.walletOverrides.set(\r\n walletType,\r\n new Map(objectEntries(walletConfig.chainOverrides) as [Caip2, ChainOverride][])\r\n );\r\n }\r\n }\r\n }\r\n\r\n getWalletOptions<W extends WalletType>(walletType: W): WalletOptions | undefined {\r\n return this.walletOptions.get(walletType);\r\n }\r\n\r\n resolveForWallet<W extends WalletType>(walletType: W): ResolvedWalletConfig<W> {\r\n const resolvedChains = {} as ChainConfig;\r\n\r\n for (const [caip2, defaultConfig] of objectEntries(defaultChainConfig)) {\r\n const resolved = this.resolveChain(caip2, defaultConfig, walletType);\r\n (resolvedChains as Record<Caip2, Chain>)[caip2] = resolved;\r\n }\r\n\r\n return ConfigResolver.createResolvedConfig(walletType, resolvedChains);\r\n }\r\n\r\n private resolveChain(caip2: Caip2, defaultConfig: Chain, walletType: WalletType): Chain {\r\n const globalOverride = this.globalOverrides.get(caip2);\r\n const walletOverride = this.walletOverrides.get(walletType)?.get(caip2);\r\n\r\n if (!globalOverride && !walletOverride) {\r\n return defaultConfig;\r\n }\r\n\r\n let rpcUrls = defaultConfig.rpcUrls;\r\n let blockExplorerUrls = defaultConfig.blockExplorerUrls;\r\n let rpcOverride: { source: \"global\" | \"wallet\"; default: string } | undefined;\r\n let explorerOverride: { source: \"global\" | \"wallet\"; default: string } | undefined;\r\n\r\n if (globalOverride) {\r\n if (globalOverride.rpcUrls?.length) {\r\n rpcOverride = { source: \"global\", default: defaultConfig.rpcUrls[0] };\r\n rpcUrls = globalOverride.rpcUrls as [string, ...string[]];\r\n }\r\n if (globalOverride.blockExplorerUrls?.length) {\r\n explorerOverride = { source: \"global\", default: defaultConfig.blockExplorerUrls[0] };\r\n blockExplorerUrls = globalOverride.blockExplorerUrls as [string, ...string[]];\r\n }\r\n }\r\n\r\n if (walletOverride) {\r\n if (walletOverride.rpcUrls?.length) {\r\n rpcOverride = { source: \"wallet\", default: rpcOverride?.default ?? defaultConfig.rpcUrls[0] };\r\n rpcUrls = walletOverride.rpcUrls as [string, ...string[]];\r\n }\r\n if (walletOverride.blockExplorerUrls?.length) {\r\n explorerOverride = {\r\n source: \"wallet\",\r\n default: explorerOverride?.default ?? defaultConfig.blockExplorerUrls[0],\r\n };\r\n blockExplorerUrls = walletOverride.blockExplorerUrls as [string, ...string[]];\r\n }\r\n }\r\n\r\n const hasOverride = rpcOverride || explorerOverride;\r\n\r\n return Object.freeze({\r\n ...defaultConfig,\r\n rpcUrls,\r\n blockExplorerUrls,\r\n _override: hasOverride ? { rpcUrls: rpcOverride, blockExplorerUrls: explorerOverride } : undefined,\r\n }) as Chain;\r\n }\r\n\r\n private static createResolvedConfig<W extends WalletType>(\r\n walletType: W,\r\n chains: ChainConfig\r\n ): ResolvedWalletConfig<W> {\r\n const evmHexMap = new Map<string, Eip155Caip2>();\r\n for (const chain of objectValues(chains)) {\r\n if (ChainGuards.isEvmChain(chain)) {\r\n evmHexMap.set(chain.evmChain.hex, chain.caip2 as Eip155Caip2);\r\n }\r\n }\r\n\r\n return Object.freeze({\r\n walletType,\r\n chains,\r\n evmHexMap,\r\n\r\n getChain<C extends Caip2>(caip2: C): ChainConfig[C] {\r\n return chains[caip2];\r\n },\r\n\r\n getEvmChain(caip2: Eip155Caip2): EvmChain {\r\n return chains[caip2];\r\n },\r\n\r\n getXrplChain(caip2: XRPlCaip2): XrplChain {\r\n return chains[caip2] as XrplChain;\r\n },\r\n\r\n getRpcUrl(caip2: Caip2): string {\r\n return chains[caip2].rpcUrls[0];\r\n },\r\n\r\n getSupportedChains(): Caip2[] {\r\n return objectKeys(chains);\r\n },\r\n });\r\n }\r\n}\r\n","import { objectFromEntries } from \"@utils/utils\";\r\n\r\n/**\r\n * Error codes for all connectors.\r\n * Numbers as keys = duplicates impossible.\r\n *\r\n * Ranges:\r\n * - 4000-4099: Common (all connectors)\r\n * - 4100-4199: MetaMask\r\n * - 4200-4299: Ledger\r\n * - 4300-4399: WalletConnect\r\n * - 4400-4499: Xaman\r\n * - 4500-4599: D'CENT\r\n */\r\nconst errorCodeMap = {\r\n 4001: \"COMMON_USER_REJECTED\",\r\n 4002: \"COMMON_NOT_CONNECTED\",\r\n 4003: \"COMMON_CHAIN_NOT_CONFIGURED\",\r\n 4004: \"COMMON_CHAIN_NOT_SUPPORTED\",\r\n 4005: \"COMMON_FEATURE_NOT_SUPPORTED\",\r\n 4006: \"COMMON_CONNECTION_FAILED\",\r\n 4007: \"COMMON_UNKNOWN_CHAIN_ID\",\r\n 4008: \"COMMON_NO_ACCOUNTS\",\r\n 4009: \"COMMON_PROVIDER_ERROR\",\r\n 4010: \"COMMON_CONNECTION_IN_PROGRESS\",\r\n 4011: \"COMMON_TX_EXPIRED\",\r\n\r\n 4100: \"METAMASK_PROVIDER_NOT_FOUND\",\r\n 4101: \"METAMASK_CHAIN_NOT_ADDED\",\r\n 4102: \"METAMASK_NOT_INSTALLED\",\r\n\r\n 4200: \"LEDGER_DEVICE_LOCKED\",\r\n 4201: \"LEDGER_APP_NOT_OPEN\",\r\n 4202: \"LEDGER_WRONG_APP\",\r\n 4203: \"LEDGER_TRANSPORT_ERROR\",\r\n 4204: \"LEDGER_CONNECTION_FAILED\",\r\n 4205: \"LEDGER_TX_REJECTED\",\r\n 4206: \"LEDGER_DEVICE_BUSY\",\r\n\r\n 4300: \"WALLET_CONNECT_SESSION_EXPIRED\",\r\n 4301: \"WALLET_CONNECT_PAIRING_FAILED\",\r\n 4302: \"WALLET_CONNECT_SESSION_NOT_FOUND\",\r\n 4303: \"WALLET_CONNECT_PROVIDER_NOT_INITIALIZED\",\r\n\r\n 4400: \"XAMAN_SIGN_REJECTED\",\r\n 4401: \"XAMAN_QR_TIMEOUT\",\r\n 4402: \"XAMAN_SDK_NOT_READY\",\r\n 4403: \"XAMAN_AUTHORIZATION_FAILED\",\r\n\r\n 4500: \"DCENT_NOT_IN_BROWSER\",\r\n 4501: \"DCENT_SIGN_REJECTED\",\r\n} as const;\r\n\r\ntype ErrorCodeMap = typeof errorCodeMap;\r\ntype CodeNumber = keyof ErrorCodeMap;\r\ntype CodeName = ErrorCodeMap[CodeNumber];\r\n\r\ntype ReverseErrorCodeMap = { readonly [K in CodeName]: CodeNumber };\r\n\r\nfunction buildReverseMap(): ReverseErrorCodeMap {\r\n const entries: Array<[CodeName, CodeNumber]> = [];\r\n for (const key in errorCodeMap) {\r\n const num = Number(key) as CodeNumber;\r\n const name = errorCodeMap[num];\r\n entries.push([name, num]);\r\n }\r\n return objectFromEntries(entries);\r\n}\r\n\r\nexport const ErrorCode: ReverseErrorCodeMap = buildReverseMap();\r\n\r\nexport type ErrorCodeKey = keyof typeof ErrorCode;\r\n\r\ntype CommonCode = Extract<ErrorCodeKey, `COMMON_${string}`>;\r\ntype MetaMaskCode = Extract<ErrorCodeKey, `METAMASK_${string}`>;\r\ntype LedgerCode = Extract<ErrorCodeKey, `LEDGER_${string}`>;\r\ntype WalletConnectCode = Extract<ErrorCodeKey, `WALLET_CONNECT_${string}`>;\r\ntype XamanCode = Extract<ErrorCodeKey, `XAMAN_${string}`>;\r\ntype DcentCode = Extract<ErrorCodeKey, `DCENT_${string}`>;\r\n\r\nexport type MetaMaskErrorCode = CommonCode | MetaMaskCode;\r\nexport type LedgerErrorCode = CommonCode | LedgerCode;\r\nexport type WalletConnectErrorCode = CommonCode | WalletConnectCode;\r\nexport type XamanErrorCode = CommonCode | XamanCode;\r\nexport type DcentErrorCode = CommonCode | DcentCode;\r\n","import type { ErrorCodeKey } from \"./error-codes\";\r\n\r\n/**\r\n * Human-readable error messages for each error code.\r\n */\r\nexport const ErrorMessages: Record<ErrorCodeKey, string> = {\r\n COMMON_USER_REJECTED: \"User rejected the request.\",\r\n COMMON_NOT_CONNECTED: \"Wallet is not connected.\",\r\n COMMON_CHAIN_NOT_CONFIGURED: \"Chain is not configured.\",\r\n COMMON_CHAIN_NOT_SUPPORTED: \"Chain is not supported by this wallet.\",\r\n COMMON_FEATURE_NOT_SUPPORTED: \"Feature is not supported by this wallet.\",\r\n COMMON_CONNECTION_FAILED: \"Connection failed.\",\r\n COMMON_UNKNOWN_CHAIN_ID: \"Unknown chain ID.\",\r\n COMMON_NO_ACCOUNTS: \"No accounts available.\",\r\n COMMON_PROVIDER_ERROR: \"Provider error.\",\r\n COMMON_CONNECTION_IN_PROGRESS: \"Connection already in progress.\",\r\n COMMON_TX_EXPIRED: \"Transaction expired. Please try again.\",\r\n\r\n METAMASK_PROVIDER_NOT_FOUND: \"MetaMask provider not found.\",\r\n METAMASK_CHAIN_NOT_ADDED: \"Chain is not added to MetaMask.\",\r\n METAMASK_NOT_INSTALLED: \"MetaMask is not installed.\",\r\n\r\n LEDGER_DEVICE_LOCKED: \"Ledger device is locked.\",\r\n LEDGER_APP_NOT_OPEN: \"Please open the correct app on your Ledger.\",\r\n LEDGER_WRONG_APP: \"Wrong app is open on Ledger device.\",\r\n LEDGER_TRANSPORT_ERROR: \"Ledger transport error.\",\r\n LEDGER_CONNECTION_FAILED: \"Failed to connect to Ledger device.\",\r\n LEDGER_TX_REJECTED: \"Transaction rejected on Ledger device.\",\r\n LEDGER_DEVICE_BUSY: \"An action is already pending on the Ledger device. Please deny or reconnect.\",\r\n\r\n WALLET_CONNECT_SESSION_EXPIRED: \"WalletConnect session has expired.\",\r\n WALLET_CONNECT_PAIRING_FAILED: \"WalletConnect pairing failed.\",\r\n WALLET_CONNECT_SESSION_NOT_FOUND: \"WalletConnect session not found.\",\r\n WALLET_CONNECT_PROVIDER_NOT_INITIALIZED: \"WalletConnect provider not initialized.\",\r\n\r\n XAMAN_SIGN_REJECTED: \"Sign request rejected in Xaman.\",\r\n XAMAN_QR_TIMEOUT: \"Xaman QR scan timed out.\",\r\n XAMAN_SDK_NOT_READY: \"Xaman SDK is not ready.\",\r\n XAMAN_AUTHORIZATION_FAILED: \"Xaman authorization failed.\",\r\n\r\n DCENT_NOT_IN_BROWSER: \"D'CENT in-app browser not detected.\",\r\n DCENT_SIGN_REJECTED: \"Transaction rejected in D'CENT wallet.\",\r\n};\r\n","import type { WalletType } from \"@wallets/wallet.types\";\r\nimport type { ErrorCodeKey } from \"./error-codes\";\r\nimport { ErrorCode } from \"./error-codes\";\r\nimport { ErrorMessages } from \"./error-messages\";\r\n\r\nexport class WalletError extends Error {\r\n readonly code: number;\r\n readonly codeKey: ErrorCodeKey;\r\n readonly walletType: WalletType;\r\n override readonly cause?: unknown;\r\n\r\n constructor(walletType: WalletType, codeKey: ErrorCodeKey, cause?: unknown) {\r\n const message = ErrorMessages[codeKey];\r\n super(message, { cause });\r\n\r\n this.name = \"WalletError\";\r\n this.walletType = walletType;\r\n this.codeKey = codeKey;\r\n this.code = ErrorCode[codeKey];\r\n this.cause = cause;\r\n\r\n Object.setPrototypeOf(this, new.target.prototype);\r\n }\r\n}\r\n","import type { ErrorCodeKey } from \"@errors/error-codes\";\nimport type { WalletType } from \"@wallets/wallet.types\";\nimport { WalletError } from \"@errors/wallet-error\";\nimport { XrplError } from \"xrpl\";\n\nexport class XrplWalletError extends WalletError {\n override readonly name = \"XrplWalletError\";\n\n constructor(walletType: WalletType, code: ErrorCodeKey, cause?: unknown) {\n super(walletType, code, cause);\n }\n\n static fromError(error: unknown, walletType: WalletType): XrplWalletError | null {\n if (error instanceof XrplError && error.message.includes(\"tefMAX_LEDGER\")) {\n return new XrplWalletError(walletType, \"COMMON_TX_EXPIRED\", error);\n }\n return null;\n }\n}\n","import type { DcentErrorCode } from \"@errors/error-codes\";\r\nimport { WalletError } from \"@errors/wallet-error\";\r\n\r\nexport class DcentError extends WalletError {\r\n override readonly name = \"DcentError\";\r\n\r\n constructor(code: DcentErrorCode, cause?: unknown) {\r\n super(\"dcent\", code, cause);\r\n }\r\n\r\n static fromError(_error: unknown): DcentError | null {\r\n return null;\r\n }\r\n}\r\n","import type { LedgerErrorCode } from \"@errors/error-codes\";\nimport { WalletError } from \"@errors/wallet-error\";\nimport {\n DisconnectedDevice,\n DisconnectedDeviceDuringOperation,\n LockedDeviceError,\n StatusCodes,\n TransportInterfaceNotAvailable,\n TransportOpenUserCancelled,\n TransportRaceCondition,\n TransportStatusError,\n} from \"@ledgerhq/errors\";\n\ntype TransportErrorMapping = {\n match: (error: unknown) => boolean;\n code: LedgerErrorCode;\n};\n\nexport class LedgerError extends WalletError {\n override readonly name = \"LedgerError\";\n\n private static readonly TRANSPORT_MAPPINGS: TransportErrorMapping[] = [\n { match: (e) => e instanceof LockedDeviceError, code: \"LEDGER_DEVICE_LOCKED\" },\n {\n match: (e) =>\n e instanceof TransportStatusError &&\n (e.statusCode === StatusCodes.LOCKED_DEVICE || e.statusCode === StatusCodes.CLA_NOT_SUPPORTED),\n code: \"LEDGER_DEVICE_LOCKED\",\n },\n {\n match: (e) =>\n e instanceof TransportStatusError &&\n (e.statusCode === StatusCodes.USER_REFUSED_ON_DEVICE ||\n e.statusCode === StatusCodes.CONDITIONS_OF_USE_NOT_SATISFIED),\n code: \"LEDGER_TX_REJECTED\",\n },\n { match: (e) => e instanceof TransportOpenUserCancelled, code: \"COMMON_USER_REJECTED\" },\n { match: (e) => e instanceof DisconnectedDevice, code: \"LEDGER_CONNECTION_FAILED\" },\n { match: (e) => e instanceof DisconnectedDeviceDuringOperation, code: \"LEDGER_CONNECTION_FAILED\" },\n { match: (e) => e instanceof TransportInterfaceNotAvailable, code: \"LEDGER_CONNECTION_FAILED\" },\n { match: (e) => e instanceof TransportRaceCondition, code: \"LEDGER_DEVICE_BUSY\" },\n { match: (e) => e instanceof TransportStatusError, code: \"LEDGER_TRANSPORT_ERROR\" },\n ];\n\n constructor(code: LedgerErrorCode, cause?: unknown) {\n super(\"ledger\", code, cause);\n }\n\n /** Maps raw @ledgerhq transport errors to LedgerError. Returns null for unknown errors. */\n static fromError(error: unknown): LedgerError | null {\n for (const mapping of LedgerError.TRANSPORT_MAPPINGS) {\n if (mapping.match(error)) {\n return new LedgerError(mapping.code, error);\n }\n }\n return null;\n }\n}\n","import type { BaseChain, Caip2, Chain, Eip155Caip2, EvmChain, XRPlCaip2 } from \"@chains/chain.types\";\r\nimport type { RpcError } from \"viem\";\r\nimport { ChainGuards } from \"@chains/chain.utils\";\r\nimport { TypeUtils } from \"@shared/type-utils\";\r\n\r\n/**\r\n * Chain utilities - extends ChainGuards with additional helpers.\r\n * For basic type guards (isEvmCaip2, isXrplCaip2), use ChainGuards directly.\r\n */\r\nexport class ChainUtils {\r\n static isEvmCaip2 = (caip2: Caip2): caip2 is Eip155Caip2 => ChainGuards.isEvmCaip2(caip2);\r\n static isXrplCaip2 = (caip2: Caip2): caip2 is XRPlCaip2 => ChainGuards.isXrplCaip2(caip2);\r\n static isEvmChain = (chain: BaseChain): chain is EvmChain => ChainGuards.isEvmChain(chain);\r\n\r\n static isRpcError(error: unknown): error is RpcError {\r\n return TypeUtils.isObject(error) && \"code\" in error && typeof (error as RpcError).code === \"number\";\r\n }\r\n\r\n static isRpcErrorWithCode(error: unknown, code: number): boolean {\r\n return ChainUtils.isRpcError(error) && error.code === code;\r\n }\r\n\r\n static buildEvmHexMap(chains: Iterable<Chain>): Map<string, Eip155Caip2> {\r\n const map = new Map<string, Eip155Caip2>();\r\n\r\n for (const chain of chains) {\r\n if (ChainGuards.isEvmChain(chain)) {\r\n map.set(chain.evmChain.hex, chain.caip2 as Eip155Caip2);\r\n }\r\n }\r\n\r\n return map;\r\n }\r\n}\r\n","import type { MetaMaskErrorCode } from \"@errors/error-codes\";\r\nimport { WalletError } from \"@errors/wallet-error\";\r\nimport { ChainUtils } from \"@utils/chain-utils\";\r\n\r\nexport class MetaMaskError extends WalletError {\r\n override readonly name = \"MetaMaskError\";\r\n\r\n constructor(code: MetaMaskErrorCode, cause?: unknown) {\r\n super(\"metamask\", code, cause);\r\n }\r\n\r\n static fromError(error: unknown): MetaMaskError | null {\r\n if (ChainUtils.isRpcErrorWithCode(error, 4001)) {\r\n return new MetaMaskError(\"COMMON_USER_REJECTED\", error);\r\n }\r\n return null;\r\n }\r\n}\r\n","import type { WalletConnectErrorCode } from \"@errors/error-codes\";\r\nimport { WalletError } from \"@errors/wallet-error\";\r\nimport { ChainUtils } from \"@utils/chain-utils\";\r\n\r\nexport class WalletConnectError extends WalletError {\r\n override readonly name = \"WalletConnectError\";\r\n\r\n constructor(code: WalletConnectErrorCode, cause?: unknown) {\r\n super(\"wallet-connect\", code, cause);\r\n }\r\n\r\n static fromError(error: unknown): WalletConnectError | null {\r\n if (ChainUtils.isRpcErrorWithCode(error, 4001)) {\r\n return new WalletConnectError(\"COMMON_USER_REJECTED\", error);\r\n }\r\n return null;\r\n }\r\n}\r\n","import type { XamanErrorCode } from \"@errors/error-codes\";\r\nimport { WalletError } from \"@errors/wallet-error\";\r\n\r\nexport class XamanError extends WalletError {\r\n override readonly name = \"XamanError\";\r\n\r\n constructor(code: XamanErrorCode, cause?: unknown) {\r\n super(\"xaman\", code, cause);\r\n }\r\n\r\n static fromError(_error: unknown): XamanError | null {\r\n return null;\r\n }\r\n}\r\n","import type { WalletType } from \"@wallets/wallet.types\";\nimport { XrplWalletError } from \"@clients/xrp/xrpl-error\";\nimport { DcentError } from \"@connectors/dcent/dcent-error\";\nimport { LedgerError } from \"@connectors/ledger/ledger-error\";\nimport { MetaMaskError } from \"@connectors/metamask/metamask-error\";\nimport { WalletConnectError } from \"@connectors/wallet-connect/wallet-connect-error\";\nimport { XamanError } from \"@connectors/xaman/xaman-error\";\nimport { WalletError } from \"./wallet-error\";\n\nexport class WalletErrorHelper {\n static isWalletError(error: unknown): error is WalletError {\n return error instanceof WalletError;\n }\n\n static from(error: unknown, walletType: WalletType): WalletError | null {\n if (error instanceof WalletError) return error;\n\n const xrplError = XrplWalletError.fromError(error, walletType);\n if (xrplError) return xrplError;\n\n switch (walletType) {\n case \"ledger\":\n return LedgerError.fromError(error);\n case \"wallet-connect\":\n return WalletConnectError.fromError(error);\n case \"metamask\":\n return MetaMaskError.fromError(error);\n case \"xaman\":\n return XamanError.fromError(error);\n case \"dcent\":\n return DcentError.fromError(error);\n default: {\n const _exhaustive: never = walletType;\n void _exhaustive;\n return null;\n }\n }\n }\n}\n","import { TypeUtils } from \"@shared/type-utils\";\r\n\r\nexport class ErrorUtils {\r\n static extractMessage(error: unknown): string {\r\n if (TypeUtils.isString(error)) {\r\n return error;\r\n }\r\n\r\n if (TypeUtils.isError(error)) {\r\n return error.message;\r\n }\r\n\r\n if (TypeUtils.isObject(error) && \"message\" in error && TypeUtils.isString(error.message)) {\r\n return error.message;\r\n }\r\n\r\n try {\r\n return JSON.stringify(error);\r\n } catch {\r\n return \"Unknown error\";\r\n }\r\n }\r\n\r\n static ensureError(error: unknown): Error {\r\n if (TypeUtils.isError(error)) {\r\n return error;\r\n }\r\n return new Error(ErrorUtils.extractMessage(error));\r\n }\r\n}\r\n","import type { Caip2 } from \"@chains/chain.types\";\r\nimport type { WalletAddressState, WalletErrorState, WalletStore } from \"@stores/wallet-store/wallet-store\";\r\nimport type { WalletType } from \"@wallets/wallet.types\";\r\nimport { ChainUtils } from \"@utils/chain-utils\";\r\n\r\nexport interface ConnectedEventData {\r\n address: string;\r\n addresses: string[] | WalletAddressState[];\r\n caip2: Caip2;\r\n}\r\n\r\nexport interface AddressChangedEventData {\r\n address: string;\r\n addresses: string[] | WalletAddressState[];\r\n caip2: Caip2;\r\n}\r\n\r\nexport class ConnectorEventEmitter {\r\n constructor(\r\n private readonly store: WalletStore,\r\n private readonly walletType: WalletType\r\n ) {}\r\n\r\n startConnecting(): void {\r\n this.store.send({ type: \"startConnecting\" });\r\n }\r\n\r\n connected(data: ConnectedEventData): void {\r\n this.store.send({\r\n type: \"connectionEstablished\",\r\n activeAddress: data.address,\r\n availableAddresses: this.resolveAddresses(data.addresses, data.caip2),\r\n caip2: data.caip2,\r\n });\r\n }\r\n\r\n reconnected(data: ConnectedEventData): void {\r\n this.store.send({\r\n type: \"connectionRestored\",\r\n activeAddress: data.address,\r\n availableAddresses: this.resolveAddresses(data.addresses, data.caip2),\r\n caip2: data.caip2,\r\n });\r\n }\r\n\r\n startDisconnecting(): void {\r\n this.store.send({ type: \"startDisconnecting\" });\r\n }\r\n\r\n disconnected(): void {\r\n this.store.send({ type: \"disconnected\" });\r\n }\r\n\r\n chainChanged(caip2: Caip2): void {\r\n this.store.send({ type: \"chainChanged\", caip2 });\r\n }\r\n\r\n addressChanged(data: AddressChangedEventData): void {\r\n this.store.send({\r\n type: \"addressChanged\",\r\n activeAddress: data.address,\r\n availableAddresses: this.resolveAddresses(data.addresses, data.caip2),\r\n });\r\n }\r\n\r\n error(error: WalletErrorState): void {\r\n this.store.send({ type: \"error\", error });\r\n }\r\n\r\n private resolveAddresses(addresses: string[] | WalletAddressState[], caip2: Caip2): WalletAddressState[] {\r\n if (addresses.length === 0) return [];\r\n if (typeof addresses[0] === \"string\") {\r\n const isEvm = ChainUtils.isEvmCaip2(caip2);\r\n return (addresses as string[]).map((address) => ({\r\n type: this.walletType,\r\n address,\r\n caip2,\r\n isEvm,\r\n }));\r\n }\r\n return addresses as WalletAddressState[];\r\n }\r\n}\r\n","import type { ResolvedWalletConfig } from \"@config/config-types\";\r\nimport type { WalletStore } from \"@stores/wallet-store/wallet-store\";\r\nimport type { SupportedWalletChains, WalletType } from \"@wallets/wallet.types\";\r\nimport type { Connector, ConnectorConfig, ConnectorProvider } from \"./connector-types\";\r\n\r\nimport { WalletErrorHelper } from \"@errors/wallet-error-helper\";\r\nimport { ErrorUtils } from \"@utils/error-utils\";\r\nimport { ConnectorEventEmitter } from \"./connector-events\";\r\n\r\nexport abstract class BaseConnector<\r\n W extends WalletType,\r\n TClient,\r\n TProvider extends ConnectorProvider<W> = ConnectorProvider<W>,\r\n> implements Connector<W, TClient, TProvider> {\r\n readonly walletType: W;\r\n\r\n protected readonly events: ConnectorEventEmitter;\r\n protected readonly store: WalletStore;\r\n protected readonly config: ConnectorConfig<W>;\r\n protected readonly resolvedConfig: ResolvedWalletConfig;\r\n\r\n private initPromise: Promise<void> | null = null;\r\n private initResolved = false;\r\n\r\n constructor(store: WalletStore, config: ConnectorConfig<W>) {\r\n this.store = store;\r\n this.config = config;\r\n this.walletType = config.walletType;\r\n this.resolvedConfig = config.resolvedConfig;\r\n this.events = new ConnectorEventEmitter(store, config.walletType);\r\n\r\n this.connect = this.wrapAsync(this.connect.bind(this));\r\n this.disconnect = this.wrapAsync(this.disconnect.bind(this));\r\n this.restoreConnection = this.wrapAsync(this.restoreConnection.bind(this));\r\n this.switchChain = this.wrapAsync(this.switchChain.bind(this));\r\n }\r\n\r\n get initialized(): boolean {\r\n return this.initResolved;\r\n }\r\n\r\n async initialize(): Promise<void> {\r\n if (!this.initPromise) {\r\n this.initPromise = this.onInitialize()\r\n .then(() => {\r\n this.initResolved = true;\r\n })\r\n .catch((error) => {\r\n this.initPromise = null;\r\n throw error;\r\n });\r\n }\r\n return this.initPromise;\r\n }\r\n\r\n /**\r\n * Reset init state so next operation re-initializes the SDK.\r\n * Required for Xaman (SDK terminates on disconnect).\r\n * MetaMask and WalletConnect should NOT call this — their providers survive disconnect.\r\n */\r\n protected resetInitialization(): void {\r\n this.initPromise = null;\r\n this.initResolved = false;\r\n }\r\n\r\n protected abstract onInitialize(): Promise<void>;\r\n\r\n protected emitError(error: unknown): void {\r\n const message = ErrorUtils.extractMessage(error);\r\n const code = WalletErrorHelper.isWalletError(error) ? error.code : \"unknown\";\r\n this.events.error({ code, message });\r\n }\r\n\r\n private wrapAsync<T extends (...args: never[]) => Promise<unknown>>(method: T): T {\r\n return (async (...args: Parameters<T>) => {\r\n try {\r\n return await method.apply(this, args);\r\n } catch (error) {\r\n this.emitError(error);\r\n throw error;\r\n }\r\n }) as T;\r\n }\r\n\r\n abstract connect(...args: never[]): Promise<void>;\r\n abstract disconnect(): Promise<void>;\r\n abstract restoreConnection(): Promise<void>;\r\n abstract switchChain(caip2: SupportedWalletChains<W>[number]): Promise<void>;\r\n abstract getClient(): TClient;\r\n abstract getProvider(): TProvider;\r\n}\r\n","import { Client, parseAccountRootFlags, RippledError } from \"xrpl\";\r\n\r\nexport class BaseXrplClient extends Client {\r\n async onDestroy(): Promise<void> {\r\n if (this.isConnected()) {\r\n await this.disconnect();\r\n }\r\n }\r\n\r\n async ensureConnected(): Promise<void> {\r\n if (!this.isConnected()) {\r\n await this.connect();\r\n }\r\n }\r\n\r\n async requiresDestinationTag(address: string): Promise<boolean> {\r\n await this.ensureConnected();\r\n\r\n const response = await this.request({\r\n command: \"account_info\",\r\n account: address,\r\n });\r\n\r\n const flags = parseAccountRootFlags(response.result.account_data.Flags);\r\n return flags.lsfRequireDestTag ?? false;\r\n }\r\n\r\n async isDepositAuthEnabled(address: string): Promise<boolean> {\r\n await this.ensureConnected();\r\n\r\n const response = await this.request({\r\n command: \"account_info\",\r\n account: address,\r\n });\r\n\r\n const flags = parseAccountRootFlags(response.result.account_data.Flags);\r\n return flags.lsfDepositAuth ?? false;\r\n }\r\n\r\n async getBalance(address: string): Promise<number> {\r\n try {\r\n await this.ensureConnected();\r\n return await this.getXrpBalance(address);\r\n } catch (error) {\r\n if (error instanceof RippledError && error.message === \"Account not found.\") {\r\n return 0;\r\n }\r\n throw error;\r\n }\r\n }\r\n}\r\n","import type { XRPlCaip2, XrplChain } from \"@chains/chain.types\";\r\nimport { BaseXrplClient } from \"./base-xrpl-client\";\r\n\r\nexport class XrplClient extends BaseXrplClient {\r\n private readonly chain: XrplChain;\r\n\r\n constructor(chain: XrplChain) {\r\n super(chain.rpcUrls[0]);\r\n this.chain = chain;\r\n }\r\n\r\n async getCaip2(): Promise<XRPlCaip2> {\r\n return this.chain.caip2;\r\n }\r\n\r\n async onDestroy(): Promise<void> {\r\n await super.onDestroy();\r\n }\r\n}\r\n","import type { XRPlCaip2 } from \"@chains/chain.types\";\r\nimport type { XrpClient } from \"@clients/xrp/xrp-client\";\r\nimport type { ResolvedWalletConfig } from \"@config/config-types\";\r\nimport type { SubmittableTransaction } from \"xrpl\";\r\nimport type { DcentXrplProvider } from \"./dcent.types\";\r\n\r\nimport { XrplClient } from \"@clients/xrp/xrpl-client\";\r\nimport { DcentError } from \"./dcent-error\";\r\n\r\ninterface DcentXrplResponse {\r\n hash: string;\r\n}\r\n\r\nexport class DcentXrpClient implements XrpClient {\r\n constructor(\r\n private readonly provider: DcentXrplProvider,\r\n private readonly resolvedConfig: ResolvedWalletConfig\r\n ) {}\r\n\r\n async sendTx(tx: SubmittableTransaction): Promise<string> {\r\n const caip2 = await this.getCaip2();\r\n\r\n const result = await this.provider.request<DcentXrplResponse>({\r\n method: \"xrpl_signTransaction\",\r\n params: [{ tx_json: tx, submit: true, chainId: caip2, autofill: true }],\r\n });\r\n\r\n if (!result?.hash) {\r\n throw new DcentError(\"DCENT_SIGN_REJECTED\");\r\n }\r\n\r\n return result.hash;\r\n }\r\n\r\n async getBalance(address: string): Promise<number> {\r\n const xrplClient = await this.getSimpleClient();\r\n return xrplClient.getBalance(address);\r\n }\r\n\r\n async requiresDestinationTag(address: string): Promise<boolean> {\r\n const xrplClient = await this.getSimpleClient();\r\n return xrplClient.requiresDestinationTag(address);\r\n }\r\n\r\n async isDepositAuthEnabled(address: string): Promise<boolean> {\r\n const xrplClient = await this.getSimpleClient();\r\n return xrplClient.isDepositAuthEnabled(address);\r\n }\r\n\r\n private async getSimpleClient(): Promise<XrplClient> {\r\n const caip2 = await this.getCaip2();\r\n const chain = this.resolvedConfig.getXrplChain(caip2);\r\n return new XrplClient(chain);\r\n }\r\n\r\n async getCaip2(): Promise<XRPlCaip2> {\r\n const info = await this.provider.getWalletInfo();\r\n return info.chainId as XRPlCaip2;\r\n }\r\n\r\n async onDestroy(): Promise<void> {}\r\n}\r\n","import type { XRPlCaip2 } from \"@chains/chain.types\";\r\nimport type { ConnectorConfig } from \"@connectors/connector-types\";\r\nimport type { WalletStore } from \"@stores/wallet-store/wallet-store\";\r\nimport type { SupportedWalletChains } from \"@wallets/wallet.types\";\r\nimport type { DcentXrplProvider } from \"./dcent.types\";\r\n\r\nimport { BaseConnector } from \"@connectors/base-connector\";\r\nimport { DcentError } from \"./dcent-error\";\r\nimport { DcentXrpClient } from \"./dcent-xrpl-client\";\r\n\r\nconst DCENT_NETWORK_MAP: Record<XRPlCaip2, string> = {\r\n \"xrpl:0\": \"xrpl-mainnet\",\r\n \"xrpl:1\": \"xrpl-testnet\",\r\n};\r\n\r\nexport type DcentProvider = DcentXrplProvider;\r\n\r\nexport class DcentConnector extends BaseConnector<\"dcent\", DcentXrpClient, DcentProvider> {\r\n declare private client: DcentXrpClient;\r\n declare private provider: DcentXrplProvider;\r\n\r\n constructor(store: WalletStore, config: ConnectorConfig<\"dcent\">) {\r\n super(store, config);\r\n }\r\n\r\n static isAvailable(): boolean {\r\n return typeof window !== \"undefined\" && typeof window.xrpl !== \"undefined\";\r\n }\r\n\r\n static getDynamicLink(targetUrl: string, caip2: XRPlCaip2): string {\r\n const url = new URL(\"https://link.dcentwallet.com/DAppBrowser/\");\r\n url.searchParams.set(\"url\", targetUrl);\r\n url.searchParams.set(\"network\", DCENT_NETWORK_MAP[caip2]);\r\n return url.toString();\r\n }\r\n\r\n protected async onInitialize(): Promise<void> {\r\n if (!DcentConnector.isAvailable()) return;\r\n\r\n this.provider = window.xrpl!;\r\n this.client = new DcentXrpClient(this.provider, this.resolvedConfig);\r\n }\r\n\r\n async connect(_chains?: SupportedWalletChains<\"dcent\">): Promise<void> {\r\n if (!DcentConnector.isAvailable()) {\r\n throw new DcentError(\"DCENT_NOT_IN_BROWSER\");\r\n }\r\n\r\n if (this.connectionState === \"connecting\") {\r\n throw new DcentError(\"COMMON_CONNECTION_IN_PROGRESS\");\r\n }\r\n\r\n await this.initialize();\r\n this.events.startConnecting();\r\n\r\n const accounts = await this.provider.request<string[]>({\r\n method: \"xrpl_accounts\",\r\n });\r\n\r\n if (!accounts?.length) {\r\n throw new DcentError(\"COMMON_NO_ACCOUNTS\");\r\n }\r\n\r\n const address = accounts[0];\r\n const caip2 = await this.client.getCaip2();\r\n\r\n this.events.connected({ address, addresses: [address], caip2 });\r\n }\r\n\r\n async disconnect(): Promise<void> {\r\n this.events.startDisconnecting();\r\n this.events.disconnected();\r\n }\r\n\r\n async restoreConnection(): Promise<void> {\r\n if (!DcentConnector.isAvailable()) return;\r\n\r\n await this.initialize();\r\n\r\n const accounts = await this.provider.request<string[]>({\r\n method: \"xrpl_accounts\",\r\n });\r\n\r\n if (!accounts?.length) return;\r\n\r\n const address = accounts[0];\r\n const caip2 = await this.client.getCaip2();\r\n\r\n this.events.reconnected({ address, addresses: [address], caip2 });\r\n }\r\n\r\n async switchChain(caip2: SupportedWalletChains<\"dcent\">[number]): Promise<void> {\r\n await this.provider.request({\r\n method: \"xrpl_switchChain\",\r\n params: [{ chainId: caip2 }],\r\n });\r\n\r\n this.events.chainChanged(caip2);\r\n }\r\n\r\n getClient(): DcentXrpClient {\r\n return this.client;\r\n }\r\n\r\n getProvider(): DcentProvider {\r\n return this.provider;\r\n }\r\n\r\n private get connectionState() {\r\n return this.store.getSnapshot().context.connectionState;\r\n }\r\n}\r\n","import type { Caip2 } from \"@chains/chain.types\";\r\nimport type {\r\n LedgerDerivationPath,\r\n LedgerDerivationPathNoMaster,\r\n LedgerHDStandard,\r\n LedgerPaginatedBip44,\r\n} from \"@connectors/ledger/ledger.types\";\r\nimport { chainConfig, isCaip2 } from \"@chains/chain-registry\";\r\n\r\nconst BIP44_HARDENED_OFFSET = 0x80000000;\r\n\r\ninterface Bip44PathComponent {\r\n value: number;\r\n hardened: boolean;\r\n toString: () => string;\r\n}\r\n\r\nexport class Bip44 {\r\n private readonly _purpose: Bip44PathComponent;\r\n private readonly _coinType: Bip44PathComponent;\r\n private readonly _account: Bip44PathComponent;\r\n private readonly _change: Bip44PathComponent;\r\n private readonly _addressIndex: Bip44PathComponent;\r\n\r\n constructor(path: LedgerDerivationPath | LedgerDerivationPathNoMaster) {\r\n const normalizedPath = path.startsWith(\"m/\") ? path.slice(2) : path;\r\n const segments = normalizedPath.split(\"/\");\r\n\r\n if (segments.length !== 5) {\r\n throw new Error(`Invalid BIP44 path: ${path}. Expected 5 components.`);\r\n }\r\n\r\n if (!segments[0].startsWith(\"44\")) {\r\n throw new Error(`Invalid BIP44 purpose: ${segments[0]}. Must be 44'.`);\r\n }\r\n\r\n this._purpose = this.parseComponent(segments[0]);\r\n this._coinType = this.parseComponent(segments[1]);\r\n this._account = this.parseComponent(segments[2]);\r\n this._change = this.parseComponent(segments[3]);\r\n this._addressIndex = this.parseComponent(segments[4]);\r\n\r\n if (this._change.value !== 0 && this._change.value !== 1) {\r\n throw new Error(`Invalid change value: ${this._change.value}. Must be 0 or 1.`);\r\n }\r\n\r\n if (!this._purpose.hardened || !this._coinType.hardened || !this._account.hardened) {\r\n throw new Error(\"BIP44 requires purpose, coin type, and account to be hardened.\");\r\n }\r\n }\r\n\r\n get purpose(): number {\r\n return this._purpose.value;\r\n }\r\n\r\n get coinType(): number {\r\n return this._coinType.value;\r\n }\r\n\r\n get account(): number {\r\n return this._account.value;\r\n }\r\n\r\n get change(): 0 | 1 {\r\n return this._change.value as 0 | 1;\r\n }\r\n\r\n get addressIndex(): number {\r\n return this._addressIndex.value;\r\n }\r\n\r\n /**\r\n * Generate paginated BIP44 paths.\r\n * - bip44 standard: m/44'/coin'/0'/0/i — increments address index\r\n * - Ledger Live: m/44'/coin'/i'/0/0 — increments account\r\n */\r\n static getPaginatedBip44s({\r\n from,\r\n to,\r\n ledgerHDStandard,\r\n caip2,\r\n }: {\r\n from: number;\r\n to: number;\r\n ledgerHDStandard: LedgerHDStandard;\r\n caip2: Caip2;\r\n }): LedgerPaginatedBip44 {\r\n const paths: Array<Bip44> = [];\r\n const coinType = Bip44.fromCaip2ToCoinType(caip2);\r\n if (ledgerHDStandard === \"bip44\") {\r\n for (let i = from; i < to; i++) {\r\n const path = new Bip44(`44'/${coinType}'/0'/0/${i}` as LedgerDerivationPathNoMaster);\r\n paths.push(path);\r\n }\r\n } else {\r\n for (let i = from; i < to; i++) {\r\n const path = new Bip44(`44'/${coinType}'/${i}'/0/0` as LedgerDerivationPathNoMaster);\r\n paths.push(path);\r\n }\r\n }\r\n\r\n return {\r\n paths,\r\n from,\r\n to,\r\n ledgerHDStandard,\r\n };\r\n }\r\n\r\n public static fromCaip2ToCoinType(caip2: Caip2): number {\r\n if (!isCaip2(caip2)) {\r\n throw new Error(`Invalid CAIP2: ${caip2}`);\r\n }\r\n\r\n const chain = chainConfig[caip2];\r\n if (!chain.bip44Part) {\r\n throw new Error(`Chain ${caip2} does not define a BIP44 part.`);\r\n }\r\n return chain.bip44Part;\r\n }\r\n\r\n static fromCaip2(caip2: Caip2, account = 0, change = 0 as 0 | 1, addressIndex = 0): Bip44 {\r\n return Bip44.fromCoin(Bip44.fromCaip2ToCoinType(caip2), account, change, addressIndex);\r\n }\r\n\r\n static fromCoin(coinType: number, account = 0, change = 0 as 0 | 1, addressIndex = 0): Bip44 {\r\n return new Bip44(`44'/${coinType}'/${account}'/${change}/${addressIndex}`);\r\n }\r\n\r\n static bitcoin(account = 0, change: 0 | 1 = 0, addressIndex = 0): Bip44 {\r\n return Bip44.fromCoin(0, account, change, addressIndex);\r\n }\r\n\r\n static ethereum(account = 0, change = 0 as 0 | 1, addressIndex = 0): Bip44 {\r\n return Bip44.fromCoin(60, account, change, addressIndex);\r\n }\r\n\r\n static ledgerLiveEthereum(accountIndex = 0): Bip44 {\r\n return new Bip44(`44'/60'/${accountIndex}'/0/0` as LedgerDerivationPathNoMaster);\r\n }\r\n\r\n public getIndexForStandard(standard: LedgerHDStandard) {\r\n if (standard === \"bip44\") {\r\n return this.addressIndex;\r\n }\r\n return this.account;\r\n }\r\n\r\n isChangeAddress(): boolean {\r\n return this._change.value === 1;\r\n }\r\n\r\n isReceivingAddress(): boolean {\r\n return this._change.value === 0;\r\n }\r\n\r\n getFullPath(): LedgerDerivationPath {\r\n return `m/${this.getPathWithoutMaster()}`;\r\n }\r\n\r\n getPathWithoutMaster(): LedgerDerivationPathNoMaster {\r\n return `${this._purpose}/${this._coinType}/${this._account}/${this._change}/${this._addressIndex}` as LedgerDerivationPathNoMaster;\r\n }\r\n\r\n toPathArray(): number[] {\r\n return [\r\n this.hardenedValue(this._purpose),\r\n this.hardenedValue(this._coinType),\r\n this.hardenedValue(this._account),\r\n this._change.value,\r\n this._addressIndex.value,\r\n ];\r\n }\r\n\r\n deriveFromAddressIndex(newAddressIndex: number): Bip44 {\r\n return new Bip44(\r\n `${this._purpose}/${this._coinType}/${this._account}/${this._change}/${newAddressIndex}` as LedgerDerivationPathNoMaster\r\n );\r\n }\r\n\r\n nextAddress(standard: LedgerHDStandard = \"bip44\"): Bip44 {\r\n if (standard === \"bip44\") {\r\n return this.deriveFromAddressIndex(this._addressIndex.value + 1);\r\n }\r\n return new Bip44(\r\n `${this._purpose}/${this._coinType}/${this._account.value + 1}'/${this._change}/${this._addressIndex}` as LedgerDerivationPathNoMaster\r\n );\r\n }\r\n\r\n toReceivingAddress(addressIndex?: number): Bip44 {\r\n const index = addressIndex !== undefined ? addressIndex : this._addressIndex.value;\r\n return new Bip44(`${this._purpose}/${this._coinType}/${this._account}/0/${index}` as LedgerDerivationPathNoMaster);\r\n }\r\n\r\n toChangeAddress(addressIndex?: number): Bip44 {\r\n const index = addressIndex !== undefined ? addressIndex : this._addressIndex.value;\r\n return new Bip44(`${this._purpose}/${this._coinType}/${this._account}/1/${index}` as LedgerDerivationPathNoMaster);\r\n }\r\n\r\n deriveAccount(accountIndex: number): Bip44 {\r\n return new Bip44(\r\n `${this._purpose}/${this._coinType}/${accountIndex}'/${this._change}/${this._addressIndex}` as LedgerDerivationPathNoMaster\r\n );\r\n }\r\n\r\n toString(): string {\r\n return this.getFullPath();\r\n }\r\n\r\n getNextPaginatedBip44s(caip2: Caip2, ledgerHDStandard: LedgerHDStandard) {\r\n const currentAccountIndex = this.getIndexForStandard(ledgerHDStandard);\r\n return Bip44.getPaginatedBip44s({\r\n from: currentAccountIndex + 1,\r\n to: currentAccountIndex + 6,\r\n ledgerHDStandard,\r\n caip2,\r\n });\r\n }\r\n\r\n public isValidCaip2(caip2: Caip2): boolean {\r\n return Bip44.fromCaip2ToCoinType(caip2) === this.coinType;\r\n }\r\n\r\n private parseComponent(component: string): Bip44PathComponent {\r\n const hardened = component.endsWith(\"'\") || component.endsWith(\"h\");\r\n const value = Number.parseInt(hardened ? component.slice(0, -1) : component, 10);\r\n\r\n if (Number.isNaN(value)) {\r\n throw new TypeError(`Invalid path component: ${component}`);\r\n }\r\n\r\n return {\r\n value,\r\n hardened,\r\n toString: () => (hardened ? `${value}'` : `${value}`),\r\n };\r\n }\r\n\r\n private hardenedValue(component: Bip44PathComponent): number {\r\n return component.hardened ? component.value + BIP44_HARDENED_OFFSET : component.value;\r\n }\r\n}\r\n","/**\r\n * Async mutex for serializing connection operations.\r\n * Uses promise chaining to ensure FIFO ordering.\r\n */\r\nexport class ConnectionMutex {\r\n private queue: Promise<void> = Promise.resolve();\r\n\r\n async run<T>(fn: () => Promise<T>): Promise<T> {\r\n let release: () => void;\r\n const waitForTurn = this.queue;\r\n this.queue = new Promise((r) => {\r\n release = r;\r\n });\r\n\r\n await waitForTurn;\r\n\r\n try {\r\n return await fn();\r\n } finally {\r\n release!();\r\n }\r\n }\r\n}\r\n","import type { Hex } from \"viem\";\r\n\r\nexport class LedgerHexUtils {\r\n static ensureLeading0x(input: string): `0x${string}` {\r\n return input.startsWith(\"0x\") ? (input as `0x${string}`) : `0x${input}`;\r\n }\r\n\r\n static trimLeading0x(input: string | `0x${string}`): string {\r\n return input.startsWith(\"0x\") ? input.substring(2) : input;\r\n }\r\n\r\n static fromBuffer(buffer: Uint8Array): Hex {\r\n const hexes = Array.from(buffer)\r\n .map((item) => item.toString(16).padStart(2, \"0\"))\r\n .join(\"\");\r\n return `0x${hexes}`;\r\n }\r\n}\r\n","import type { LedgerComputedAddress } from \"@connectors/ledger/ledger.types\";\r\nimport type { Bip44 } from \"@shared/bip44\";\r\nimport type { Hex } from \"viem\";\r\nimport type { LedgerApp } from \"../apps/ledger-app\";\r\n\r\nimport * as secp256k1 from \"@noble/secp256k1\";\r\nimport { publicKeyToAddress } from \"viem/accounts\";\r\nimport { bytesToHex } from \"viem/utils\";\r\nimport { LedgerHexUtils } from \"./ledger-hex-utils\";\r\n\r\nexport class LedgerAddressHelper {\r\n static async getComputedAddresses(\r\n app: LedgerApp,\r\n bip44s: Array<Bip44>,\r\n hrp?: string\r\n ): Promise<Array<LedgerComputedAddress>> {\r\n const addresses: Array<LedgerComputedAddress> = [];\r\n for (const bip44 of bip44s) {\r\n const computedAddress = await app.getComputedAddress(bip44, hrp);\r\n addresses.push(computedAddress);\r\n }\r\n return addresses;\r\n }\r\n\r\n static compressedPKToAddress(compressedPK: Buffer): Hex {\r\n const publicKeyHex = bytesToHex(compressedPK);\r\n const point = secp256k1.Point.fromHex(LedgerHexUtils.trimLeading0x(publicKeyHex));\r\n const uncompressedPublicKeyHex = LedgerHexUtils.fromBuffer(point.toBytes(false));\r\n return publicKeyToAddress(uncompressedPublicKeyHex);\r\n }\r\n}\r\n","import type Eth from \"@ledgerhq/hw-app-eth\";\r\nimport type { HashTypedDataParameters } from \"viem\";\r\nimport type { LedgerDerivationPathNoMaster } from \"../../ledger.types\";\r\n\r\nimport {\r\n getAddress,\r\n getTypesForEIP712Domain,\r\n hashDomain,\r\n hashStruct,\r\n serializeSignature,\r\n serializeTransaction,\r\n} from \"viem\";\r\nimport { toAccount } from \"viem/accounts\";\r\nimport { LedgerHexUtils } from \"../../internal/ledger-hex-utils\";\r\n\r\ninterface EthLedgerAccountArgs {\r\n ledger: Eth;\r\n derivationPath?: LedgerDerivationPathNoMaster;\r\n}\r\n\r\nexport async function ledgerToEthAccount({ ledger, derivationPath }: EthLedgerAccountArgs) {\r\n interface MessageTypeProperty {\r\n name: string;\r\n type: string;\r\n }\r\n\r\n const DEFAULT_ETH_DERIVATION_PATH = `44'/60'/0'/0/0`;\r\n const resolvedPath = derivationPath ?? DEFAULT_ETH_DERIVATION_PATH;\r\n const { address, publicKey } = await ledger.getAddress(resolvedPath, false);\r\n\r\n const account = toAccount({\r\n address: getAddress(address),\r\n\r\n async signTransaction(transaction) {\r\n const hash = serializeTransaction(transaction);\r\n const signedTxn = await ledger.signTransaction(resolvedPath, LedgerHexUtils.trimLeading0x(hash), null);\r\n let { v: _v } = signedTxn;\r\n const { r, s } = signedTxn;\r\n\r\n if (typeof _v === \"string\" && (_v === \"\" || _v === \"0x\")) {\r\n _v = \"0x0\";\r\n }\r\n\r\n let v: bigint;\r\n try {\r\n v = BigInt(typeof _v === \"string\" ? LedgerHexUtils.ensureLeading0x(_v) : _v);\r\n } catch (error) {\r\n throw new Error(\r\n `Ledger signature \\`v\\` was malformed and couldn't be parsed \\`${_v}\\` (Original error: ${String(error)})`\r\n );\r\n }\r\n\r\n return serializeTransaction(transaction, {\r\n r: LedgerHexUtils.ensureLeading0x(r),\r\n s: LedgerHexUtils.ensureLeading0x(s),\r\n v,\r\n });\r\n },\r\n\r\n async signMessage({ message }) {\r\n const { r, s, v } = await ledger.signPersonalMessage(\r\n resolvedPath,\r\n `0x${Buffer.from(message as string).toString(\"hex\")}`\r\n );\r\n return serializeSignature({\r\n r: LedgerHexUtils.ensureLeading0x(r),\r\n s: LedgerHexUtils.ensureLeading0x(s),\r\n v: BigInt(v),\r\n });\r\n },\r\n\r\n async signTypedData(_parameters) {\r\n const { domain = {}, message, primaryType } = _parameters as HashTypedDataParameters;\r\n const types = {\r\n EIP712Domain: getTypesForEIP712Domain({ domain }),\r\n ..._parameters.types,\r\n };\r\n\r\n const domainSeparator = hashDomain({ domain, types: types as Record<string, MessageTypeProperty[]> });\r\n const messageHash = hashStruct({\r\n data: message,\r\n primaryType,\r\n types: types as Record<string, MessageTypeProperty[]>,\r\n });\r\n\r\n const { r, s, v } = await ledger.signEIP712HashedMessage(resolvedPath, domainSeparator, messageHash);\r\n\r\n return serializeSignature({\r\n r: LedgerHexUtils.ensureLeading0x(r),\r\n s: LedgerHexUtils.ensureLeading0x(s),\r\n v: BigInt(v),\r\n });\r\n },\r\n });\r\n\r\n return {\r\n ...account,\r\n publicKey: LedgerHexUtils.ensureLeading0x(publicKey),\r\n source: \"ledger\",\r\n };\r\n}\r\n","import type { LedgerAppName, LedgerComputedAddress } from \"@connectors/ledger/ledger.types\";\r\nimport type Transport from \"@ledgerhq/hw-transport\";\r\nimport type { Bip44 } from \"@shared/bip44\";\r\nimport type { Account } from \"viem\";\r\n\r\nimport type { LedgerTransportManager } from \"../../internal/ledger-transport-manager\";\r\nimport type { EvmLedgerApp } from \"../evm-ledger-app\";\r\nimport Eth from \"@ledgerhq/hw-app-eth\";\r\nimport { LedgerAddressHelper } from \"../../internal/ledger-address-helper\";\r\nimport { ledgerToEthAccount } from \"./ethereum-viem-adapter\";\r\n\r\nexport class EthereumLedgerApp extends Eth implements EvmLedgerApp {\r\n private readonly appName: LedgerAppName;\r\n private readonly transportManager: LedgerTransportManager;\r\n\r\n private constructor(transportManager: LedgerTransportManager, appName: LedgerAppName, transport: Transport) {\r\n super(transport);\r\n this.appName = appName;\r\n this.transportManager = transportManager;\r\n }\r\n\r\n static async create(transportManager: LedgerTransportManager, appName: LedgerAppName): Promise<EthereumLedgerApp> {\r\n const transport = await transportManager.open();\r\n return new EthereumLedgerApp(transportManager, appName, transport);\r\n }\r\n async getComputedAddress(bip44: Bip44, _hrp?: string): Promise<LedgerComputedAddress> {\r\n const addressData = await this.getAddress(bip44.getFullPath());\r\n return {\r\n address: addressData.address,\r\n bip44,\r\n };\r\n }\r\n\r\n async getComputedAddresses(bip44s: Array<Bip44>, hrp?: string): Promise<Array<LedgerComputedAddress>> {\r\n return LedgerAddressHelper.getComputedAddresses(this, bip44s, hrp);\r\n }\r\n\r\n async getViemAccount(bip44: Bip44): Promise<Account> {\r\n return ledgerToEthAccount({\r\n ledger: this,\r\n derivationPath: bip44.getPathWithoutMaster(),\r\n });\r\n }\r\n\r\n // TODO: Refactor to composition (like XrpLedgerApp) to recreate Eth instance on each verifyActive call.\r\n // Currently EVM signing bypasses verifyActive(), so stale transport is not an issue yet.\r\n async verifyActive(): Promise<void> {\r\n await this.transportManager.verifyApp(this.appName);\r\n }\r\n}\r\n","import type { FlareApp } from \"@zondax/ledger-flare\";\r\nimport type { LedgerDerivationPathNoMaster } from \"../../ledger.types\";\r\n\r\nimport { getAddress, serializeSignature, serializeTransaction } from \"viem\";\r\nimport { toAccount } from \"viem/accounts\";\r\nimport { LedgerHexUtils } from \"../../internal/ledger-hex-utils\";\r\n\r\ninterface FlareLedgerAccountArgs {\r\n ledger: FlareApp;\r\n derivationPath?: LedgerDerivationPathNoMaster;\r\n}\r\n\r\nexport async function ledgerToFlareAccount({ ledger, derivationPath }: FlareLedgerAccountArgs) {\r\n const DEFAULT_ETH_DERIVATION_PATH = `44'/60'/0'/0/0`;\r\n const resolvedPath = derivationPath ?? DEFAULT_ETH_DERIVATION_PATH;\r\n const { address, publicKey } = await ledger.getEVMAddress(resolvedPath, false);\r\n\r\n const account = toAccount({\r\n address: getAddress(address),\r\n\r\n async signTransaction(transaction) {\r\n const hash = serializeTransaction(transaction);\r\n const signedTxn = await ledger.signEVMTransaction(resolvedPath, LedgerHexUtils.trimLeading0x(hash), null);\r\n let { v: _v } = signedTxn;\r\n const { r, s } = signedTxn;\r\n\r\n if (typeof _v === \"string\" && (_v === \"\" || _v === \"0x\")) {\r\n _v = \"0x0\";\r\n }\r\n\r\n let v: bigint;\r\n try {\r\n v = BigInt(typeof _v === \"string\" ? LedgerHexUtils.ensureLeading0x(_v) : _v);\r\n } catch (error) {\r\n throw new Error(\r\n `Ledger signature \\`v\\` was malformed and couldn't be parsed \\`${_v}\\` (Original error: ${String(error)})`\r\n );\r\n }\r\n\r\n return serializeTransaction(transaction, {\r\n r: LedgerHexUtils.ensureLeading0x(r),\r\n s: LedgerHexUtils.ensureLeading0x(s),\r\n v,\r\n });\r\n },\r\n\r\n async signMessage({ message }) {\r\n const { r, s, v } = await ledger.signPersonalMessage(\r\n resolvedPath,\r\n `0x${Buffer.from(message as string).toString(\"hex\")}`\r\n );\r\n return serializeSignature({\r\n r: LedgerHexUtils.ensureLeading0x(r),\r\n s: LedgerHexUtils.ensureLeading0x(s),\r\n v: BigInt(v),\r\n });\r\n },\r\n\r\n async signTypedData() {\r\n throw new Error(\"signTypedData not supported for Flare Ledger\");\r\n },\r\n });\r\n\r\n return {\r\n ...account,\r\n publicKey: LedgerHexUtils.ensureLeading0x(publicKey),\r\n source: \"ledger\",\r\n };\r\n}\r\n","import type { LedgerAppName, LedgerComputedAddress } from \"@connectors/ledger/ledger.types\";\r\nimport type Transport from \"@ledgerhq/hw-transport\";\r\nimport type { Bip44 } from \"@shared/bip44\";\r\n\r\nimport type { Account } from \"viem/accounts\";\r\nimport type { LedgerTransportManager } from \"../../internal/ledger-transport-manager\";\r\nimport type { EvmLedgerApp } from \"../evm-ledger-app\";\r\nimport { FlareApp } from \"@zondax/ledger-flare\";\r\nimport { LedgerAddressHelper } from \"../../internal/ledger-address-helper\";\r\nimport { ledgerToFlareAccount } from \"./flare-viem-adapter\";\r\n\r\nexport class FlareLedgerApp extends FlareApp implements EvmLedgerApp {\r\n private readonly appName: LedgerAppName;\r\n private readonly transportManager: LedgerTransportManager;\r\n\r\n private constructor(transportManager: LedgerTransportManager, appName: LedgerAppName, transport: Transport) {\r\n super(transport);\r\n this.appName = appName;\r\n this.transportManager = transportManager;\r\n }\r\n\r\n static async create(transportManager: LedgerTransportManager, appName: LedgerAppName): Promise<FlareLedgerApp> {\r\n const transport = await transportManager.open();\r\n return new FlareLedgerApp(transportManager, appName, transport);\r\n }\r\n async getComputedAddress(bip44: Bip44, hrp?: string): Promise<LedgerComputedAddress> {\r\n const addressData = await this.getAddressAndPubKey(bip44.getFullPath(), hrp);\r\n return {\r\n address: LedgerAddressHelper.compressedPKToAddress(addressData.compressed_pk),\r\n bip44,\r\n };\r\n }\r\n\r\n async getComputedAddresses(bip44s: Array<Bip44>, hrp?: string): Promise<Array<LedgerComputedAddress>> {\r\n return LedgerAddressHelper.getComputedAddresses(this, bip44s, hrp);\r\n }\r\n\r\n async getViemAccount(bip44: Bip44): Promise<Account> {\r\n return ledgerToFlareAccount({\r\n ledger: this,\r\n derivationPath: bip44.getPathWithoutMaster(),\r\n });\r\n }\r\n\r\n // TODO: Refactor to composition (like XrpLedgerApp) to recreate FlareApp instance on each verifyActive call.\r\n // Currently EVM signing bypasses verifyActive(), so stale transport is not an issue yet.\r\n async verifyActive(): Promise<void> {\r\n await this.transportManager.verifyApp(this.appName);\r\n }\r\n}\r\n","import type { LedgerAppName, LedgerComputedAddress } from \"@connectors/ledger/ledger.types\";\nimport type { Bip44 } from \"@shared/bip44\";\n\nimport type { LedgerTransportManager } from \"../../internal/ledger-transport-manager\";\nimport type { LedgerApp } from \"../ledger-app\";\nimport Xrp from \"@ledgerhq/hw-app-xrp\";\nimport { LedgerAddressHelper } from \"../../internal/ledger-address-helper\";\n\nexport class XrpLedgerApp implements LedgerApp {\n private xrp: Xrp | null = null;\n private readonly appName: LedgerAppName;\n private readonly transportManager: LedgerTransportManager;\n\n constructor(transportManager: LedgerTransportManager, appName: LedgerAppName) {\n this.transportManager = transportManager;\n this.appName = appName;\n }\n\n private async getXrp(): Promise<Xrp> {\n if (!this.xrp) {\n const transport = await this.transportManager.open();\n this.xrp = new Xrp(transport);\n }\n return this.xrp;\n }\n\n async getAddress(path: string): Promise<{ address: string; publicKey: string }> {\n const xrp = await this.getXrp();\n return xrp.getAddress(path);\n }\n\n async signTransaction(path: string, rawTxHex: string): Promise<string> {\n const xrp = await this.getXrp();\n return xrp.signTransaction(path, rawTxHex);\n }\n\n async getComputedAddress(bip44: Bip44, _hrp?: string): Promise<LedgerComputedAddress> {\n const pathWithoutMaster = bip44.getPathWithoutMaster();\n const address = await this.getAddress(pathWithoutMaster);\n\n return {\n address: address.address,\n bip44,\n };\n }\n\n async getComputedAddresses(bip44s: Array<Bip44>, hrp?: string): Promise<Array<LedgerComputedAddress>> {\n return LedgerAddressHelper.getComputedAddresses(this, bip44s, hrp);\n }\n\n async verifyActive(): Promise<void> {\n await this.transportManager.close();\n await this.transportManager.verifyApp(this.appName);\n this.xrp = null;\n }\n}\n","import type { LedgerApp } from \"../apps/ledger-app\";\nimport type { LedgerAppName, LedgerCaip2 } from \"../ledger.types\";\nimport type { LedgerTransportManager } from \"./ledger-transport-manager\";\n\nimport { EthereumLedgerApp } from \"../apps/ethereum/ethereum-ledger-app\";\nimport { FlareLedgerApp } from \"../apps/flare/flare-ledger-app\";\nimport { XrpLedgerApp } from \"../apps/xrp/xrp-ledger-app\";\nimport { LedgerError } from \"../ledger-error\";\n\nconst CHAIN_TO_APP: Record<LedgerCaip2, LedgerAppName[]> = {\n \"eip155:1\": [\"Ethereum\"],\n \"eip155:11155111\": [\"Ethereum\"],\n \"eip155:14\": [\"Flare Network\"],\n \"eip155:16\": [\"Flare Network\"],\n \"eip155:114\": [\"Flare Network\"],\n \"eip155:19\": [\"Flare Network\"],\n \"xrpl:0\": [\"XRP\"],\n \"xrpl:1\": [\"XRP\"],\n};\n\nexport class LedgerAppFactory {\n static getRequiredAppName(chain: LedgerCaip2): LedgerAppName {\n const apps = CHAIN_TO_APP[chain];\n if (!apps?.length) {\n throw new LedgerError(\"COMMON_CHAIN_NOT_SUPPORTED\");\n }\n return apps[0];\n }\n\n static async createApp(chain: LedgerCaip2, transportManager: LedgerTransportManager): Promise<LedgerApp> {\n const validApps = CHAIN_TO_APP[chain];\n if (!validApps?.length) {\n throw new LedgerError(\"COMMON_CHAIN_NOT_SUPPORTED\");\n }\n\n const appName = validApps[0];\n switch (appName) {\n case \"XRP\":\n return new XrpLedgerApp(transportManager, appName);\n case \"Ethereum\":\n return EthereumLedgerApp.create(transportManager, appName);\n case \"Flare Network\":\n return FlareLedgerApp.create(transportManager, appName);\n case \"Doge\":\n throw new LedgerError(\"COMMON_CHAIN_NOT_SUPPORTED\");\n }\n }\n}\n","import type { Account, PublicClient, Chain as ViemChain, WalletClient } from \"viem\";\r\nimport type { Eip155Caip2, EvmChain } from \"../chain.types\";\r\nimport type { Caip2ToViewChain } from \"./viem-types\";\r\nimport { objectFromEntries } from \"@utils/utils\";\r\nimport { createPublicClient, createWalletClient, defineChain, http } from \"viem\";\r\nimport { chainRegistry, evmChains } from \"../chain-registry\";\r\n\r\nexport class ViemHelper {\r\n private static readonly caip2ToViemChain: Caip2ToViewChain = ViemHelper.buildChainMap();\r\n\r\n static toViemChain(chain: EvmChain): ViemChain {\r\n return defineChain({\r\n id: Number(chain.evmChain.id),\r\n name: chain.name,\r\n nativeCurrency: chain.nativeCurrency,\r\n rpcUrls: {\r\n default: { http: chain.rpcUrls },\r\n },\r\n blockExplorers: chain.blockExplorerUrls.length\r\n ? {\r\n default: {\r\n name: \"Explorer\",\r\n url: chain.blockExplorerUrls[0],\r\n },\r\n }\r\n : undefined,\r\n testnet: chain.testnet,\r\n });\r\n }\r\n\r\n private static buildChainMap(): Caip2ToViewChain {\r\n const derivedViemChains = objectFromEntries(\r\n evmChains.map((chain) => [chain.caip2, ViemHelper.toViemChain(chain)])\r\n ) as Caip2ToViewChain;\r\n\r\n return {\r\n ...derivedViemChains,\r\n ...(chainRegistry.viem?.chains ?? {}),\r\n };\r\n }\r\n\r\n static getViemWalletClientFromAccount = (caip2: Eip155Caip2, account: Account): WalletClient => {\r\n return createWalletClient({ chain: ViemHelper.caip2ToViemChain[caip2], transport: http(), account });\r\n };\r\n\r\n static getViemPublicClientFromAccount = (caip2: Eip155Caip2, _account: Account): PublicClient => {\r\n return createPublicClient({ chain: ViemHelper.caip2ToViemChain[caip2], transport: http() });\r\n };\r\n}\r\n","import type { Caip2, Chain } from \"@chains/chain.types\";\r\nimport type { ChainClient } from \"./client-types\";\r\n\r\nexport abstract class BaseEvmClient implements ChainClient {\r\n protected readonly chainConfig: Chain;\r\n\r\n constructor(chainConfig: Chain) {\r\n this.chainConfig = chainConfig;\r\n }\r\n\r\n async getCaip2(): Promise<Caip2> {\r\n return this.chainConfig.caip2;\r\n }\r\n\r\n abstract getBalance(address: string): Promise<bigint | number>;\r\n\r\n async onDestroy(): Promise<void> {}\r\n}\r\n","import type { EvmChain } from \"@chains/chain.types\";\r\nimport type { Account, Address, EIP1193Provider, PublicClient, WalletClient } from \"viem\";\r\n\r\nimport { ViemHelper } from \"@chains/viem/viem-helper\";\r\nimport { BaseEvmClient } from \"@clients/base-evm-client\";\r\nimport { createPublicClient, createWalletClient, custom, http } from \"viem\";\r\n\r\n/**\r\n * EVM chain client.\r\n * Provides Viem public and wallet clients for EVM chain interactions.\r\n */\r\nexport class EvmClient extends BaseEvmClient {\r\n private readonly publicClient: PublicClient;\r\n private readonly walletClient: WalletClient;\r\n\r\n constructor(chainConfig: EvmChain, publicClient: PublicClient, walletClient: WalletClient) {\r\n super(chainConfig);\r\n this.publicClient = publicClient;\r\n this.walletClient = walletClient;\r\n }\r\n\r\n /**\r\n * Create an EVM client from chain config and provider.\r\n */\r\n static create(chainConfig: EvmChain, provider: EIP1193Provider): EvmClient {\r\n const viemChain = ViemHelper.toViemChain(chainConfig);\r\n\r\n const publicClient = createPublicClient({\r\n chain: viemChain,\r\n transport: custom(provider),\r\n });\r\n\r\n const walletClient = createWalletClient({\r\n chain: viemChain,\r\n transport: custom(provider),\r\n });\r\n\r\n return new EvmClient(chainConfig, publicClient, walletClient);\r\n }\r\n\r\n /**\r\n * Create an EVM client with HTTP transport (for read-only operations).\r\n */\r\n static createReadOnly(chainConfig: EvmChain): EvmClient {\r\n const viemChain = ViemHelper.toViemChain(chainConfig);\r\n\r\n const publicClient = createPublicClient({\r\n chain: viemChain,\r\n transport: http(chainConfig.rpcUrls[0]),\r\n });\r\n\r\n const walletClient = createWalletClient({\r\n chain: viemChain,\r\n transport: http(chainConfig.rpcUrls[0]),\r\n });\r\n\r\n return new EvmClient(chainConfig, publicClient, walletClient);\r\n }\r\n\r\n getPublicClient(): PublicClient {\r\n return this.publicClient;\r\n }\r\n\r\n getWalletClient(): WalletClient {\r\n return this.walletClient;\r\n }\r\n\r\n async getAccount(): Promise<Account | Address> {\r\n if (this.walletClient.account) {\r\n return this.walletClient.account;\r\n }\r\n const [address] = await this.walletClient.getAddresses();\r\n return address;\r\n }\r\n\r\n /**\r\n * Get balance for an address in wei.\r\n */\r\n async getBalance(address: string): Promise<bigint> {\r\n return this.publicClient.getBalance({\r\n address: address as `0x${string}`,\r\n });\r\n }\r\n\r\n /**\r\n * Get the EVM chain config.\r\n */\r\n get evmChainConfig(): EvmChain {\r\n return this.chainConfig as EvmChain;\r\n }\r\n}\r\n","import type { EvmChain } from \"@chains/chain.types\";\r\nimport type { LedgerClient } from \"@clients/client-types\";\r\nimport type { Account, PublicClient, WalletClient } from \"viem\";\r\nimport type { LedgerApp } from \"../apps/ledger-app\";\r\nimport type { CreateLedgerClientArgs } from \"../ledger.types\";\r\nimport { ViemHelper } from \"@chains/viem/viem-helper\";\r\nimport { EvmClient } from \"@clients/evm/evm-client\";\r\n\r\nexport class LedgerEvmClient extends EvmClient implements LedgerClient {\r\n private readonly _app: LedgerApp;\r\n\r\n constructor(chain: EvmChain, publicClient: PublicClient, walletClient: WalletClient, app: LedgerApp) {\r\n super(chain, publicClient, walletClient);\r\n this._app = app;\r\n }\r\n\r\n public static createForLedger(args: CreateLedgerClientArgs, chain: EvmChain, account: Account): LedgerEvmClient {\r\n const publicClient = ViemHelper.getViemPublicClientFromAccount(chain.caip2, account);\r\n const walletClient = ViemHelper.getViemWalletClientFromAccount(chain.caip2, account);\r\n return new LedgerEvmClient(chain, publicClient, walletClient, args.app);\r\n }\r\n\r\n getLedgerApp(): LedgerApp {\r\n return this._app;\r\n }\r\n\r\n async verifyDevice(): Promise<void> {\r\n await this._app.verifyActive();\r\n }\r\n}\r\n","import type { XrplChain } from \"@chains/chain.types\";\r\nimport type { LedgerClient } from \"@clients/client-types\";\r\nimport type { XrpClient } from \"@clients/xrp/xrp-client\";\r\nimport type { SubmittableTransaction } from \"xrpl\";\r\nimport type { XrpLedgerApp } from \"../apps/xrp/xrp-ledger-app\";\r\nimport type { CreateLedgerClientArgs } from \"../ledger.types\";\r\nimport { XrplClient } from \"@clients/xrp/xrpl-client\";\r\nimport { encode } from \"xrpl\";\r\n\r\nexport class LedgerXrpClient extends XrplClient implements LedgerClient<XrpLedgerApp>, XrpClient {\r\n private readonly args: CreateLedgerClientArgs;\r\n\r\n constructor(chain: XrplChain, args: CreateLedgerClientArgs) {\r\n super(chain);\r\n this.args = args;\r\n }\r\n\r\n getLedgerApp(): XrpLedgerApp {\r\n return this.args.app as XrpLedgerApp;\r\n }\r\n\r\n private async getAddressInfo(): Promise<{ address: string; publicKey: string }> {\r\n const app = this.getLedgerApp();\r\n const path = this.args.bip44.getPathWithoutMaster();\r\n return app.getAddress(path);\r\n }\r\n\r\n async verifyDevice(): Promise<void> {\r\n await this.getLedgerApp().verifyActive();\r\n }\r\n\r\n async sendTx(tx: SubmittableTransaction): Promise<string> {\r\n await this.ensureConnected();\r\n await this.verifyDevice();\r\n\r\n const { publicKey } = await this.getAddressInfo();\r\n const prepared = await this.autofill(tx);\r\n prepared.SigningPubKey = publicKey.toUpperCase();\r\n\r\n const unsignedBlob = encode(prepared);\r\n const app = this.getLedgerApp();\r\n const path = this.args.bip44.getPathWithoutMaster();\r\n const signature = await app.signTransaction(path, unsignedBlob);\r\n\r\n prepared.TxnSignature = signature.toUpperCase();\r\n const signedBlob = encode(prepared);\r\n\r\n const result = await this.submitAndWait(signedBlob);\r\n return result.result.hash;\r\n }\r\n}\r\n","import type { LedgerClient } from \"@clients/client-types\";\r\nimport type { ResolvedWalletConfig } from \"@config/config-types\";\r\nimport type { Bip44 } from \"@shared/bip44\";\r\nimport type { EvmLedgerApp } from \"../apps/evm-ledger-app\";\r\nimport type { LedgerApp } from \"../apps/ledger-app\";\r\nimport type { LedgerCaip2 } from \"../ledger.types\";\r\n\r\nimport { ChainGuards } from \"@chains/chain.utils\";\r\nimport { LedgerEvmClient } from \"../clients/ledger-evm-client\";\r\nimport { LedgerXrpClient } from \"../clients/ledger-xrp-client\";\r\nimport { LedgerError } from \"../ledger-error\";\r\n\r\nexport class LedgerClientFactory {\r\n constructor(private readonly resolvedConfig: ResolvedWalletConfig) {}\r\n\r\n async create(chain: LedgerCaip2, app: LedgerApp, bip44: Bip44): Promise<LedgerClient> {\r\n if (ChainGuards.isXrplCaip2(chain)) {\r\n const xrplChain = this.resolvedConfig.getXrplChain(chain);\r\n return new LedgerXrpClient(xrplChain, { app, caip2: chain, bip44 });\r\n }\r\n\r\n if (ChainGuards.isEvmCaip2(chain)) {\r\n const evmChain = this.resolvedConfig.getEvmChain(chain);\r\n const viemAccount = await (app as EvmLedgerApp).getViemAccount(bip44);\r\n return LedgerEvmClient.createForLedger({ app, caip2: chain, bip44 }, evmChain, viemAccount);\r\n }\r\n\r\n throw new LedgerError(\"COMMON_CHAIN_NOT_SUPPORTED\");\r\n }\r\n}\r\n","type LocalStorageFullKey<\r\n TPrefix extends string,\r\n TSeparator extends string,\r\n TKey extends string,\r\n> = `${TPrefix}${TSeparator}${TKey}`;\r\n\r\ninterface LocalStorageManagerOptions<TPrefix extends string, TSeparator extends string> {\r\n prefix: TPrefix;\r\n separator: TSeparator;\r\n}\r\n\r\nexport class LocalStorageManager<\r\n TSchema extends Record<string, unknown>,\r\n TPrefix extends string = string,\r\n TSeparator extends string = string,\r\n> {\r\n readonly prefix: TPrefix;\r\n readonly separator: TSeparator;\r\n\r\n constructor(options: LocalStorageManagerOptions<TPrefix, TSeparator>) {\r\n this.prefix = options.prefix;\r\n this.separator = options.separator;\r\n }\r\n\r\n private getPrefixedKey<K extends keyof TSchema>(key: K): LocalStorageFullKey<TPrefix, TSeparator, K & string> {\r\n return `${this.prefix}${this.separator}${String(key)}` as LocalStorageFullKey<TPrefix, TSeparator, K & string>;\r\n }\r\n\r\n getKey<K extends keyof TSchema>(key: K): LocalStorageFullKey<TPrefix, TSeparator, K & string> {\r\n return this.getPrefixedKey(key);\r\n }\r\n\r\n set<K extends keyof TSchema>(key: K, value: TSchema[K]): void {\r\n const fullKey = this.getPrefixedKey(key);\r\n const stringifiedValue = typeof value === \"object\" && value !== null ? JSON.stringify(value) : String(value);\r\n try {\r\n localStorage.setItem(fullKey, stringifiedValue);\r\n } catch (error) {\r\n console.error(`LocalStorageManager: Failed to set \"${fullKey}\"`, error);\r\n }\r\n }\r\n\r\n get<K extends keyof TSchema>(key: K): TSchema[K] | null {\r\n const fullKey = this.getPrefixedKey(key);\r\n const storedValue = localStorage.getItem(fullKey);\r\n if (storedValue === null) return null;\r\n try {\r\n return JSON.parse(storedValue) as TSchema[K];\r\n } catch {\r\n return storedValue as TSchema[K];\r\n }\r\n }\r\n\r\n remove<K extends keyof TSchema>(key: K): void {\r\n localStorage.removeItem(this.getPrefixedKey(key));\r\n }\r\n\r\n has<K extends keyof TSchema>(key: K): boolean {\r\n return localStorage.getItem(this.getPrefixedKey(key)) !== null;\r\n }\r\n\r\n clear(): void {\r\n const prefixWithSeparator = `${this.prefix}${this.separator}`;\r\n const keysToRemove: string[] = [];\r\n for (let i = 0; i < localStorage.length; i++) {\r\n const key = localStorage.key(i);\r\n if (key?.startsWith(prefixWithSeparator)) keysToRemove.push(key);\r\n }\r\n keysToRemove.forEach((key) => localStorage.removeItem(key));\r\n }\r\n}\r\n","import type { Caip2 } from \"@chains/chain.types\";\r\nimport type { LedgerCaip2, LedgerDerivationPath, LedgerHDStandard } from \"@connectors/ledger/ledger.types\";\r\nimport type { WalletType } from \"@wallets/wallet.types\";\r\nimport { LocalStorageManager } from \"./local-storage-manager\";\r\n\r\n/**\r\n * Schema for all MWC localStorage keys.\r\n * Each key is prefixed with \"mwc:\" when stored.\r\n */\r\nexport interface MWCStorageSchema extends Record<string, unknown> {\r\n \"wc:last-session\": string;\r\n \"wc:last-address\": string;\r\n \"wc:last-chain\": Caip2;\r\n\r\n \"mc:last-connected-wallet\": WalletType;\r\n \"mc:preferred-chain\": Caip2;\r\n \"mc:auto-connect\": boolean;\r\n\r\n \"ledger:caip2\": LedgerCaip2;\r\n \"ledger:bip44\": LedgerDerivationPath;\r\n \"ledger:hd-standard\": LedgerHDStandard;\r\n \"ledger:device-hid\": string;\r\n\r\n \"wc-connector:topic\": string;\r\n}\r\n\r\n/**\r\n * Main storage instance for MWC.\r\n * All keys are prefixed with \"mwc:\".\r\n */\r\nexport const mwcStorage = new LocalStorageManager<MWCStorageSchema, \"mwc\", \":\">({\r\n prefix: \"mwc\",\r\n separator: \":\",\r\n});\r\n\r\nexport type MWCStorage = typeof mwcStorage;\r\n","import type { MWCStorage } from \"@storage/local-storage-schema\";\r\nimport type { LedgerCaip2, LedgerDerivationPath, LedgerHDStandard } from \"../ledger.types\";\r\nimport { mwcStorage } from \"@storage/local-storage-schema\";\r\n\r\nexport class LedgerStorage {\r\n constructor(private readonly storage: MWCStorage) {}\r\n\r\n setCaip2(caip2: LedgerCaip2): void {\r\n this.storage.set(\"ledger:caip2\", caip2);\r\n }\r\n\r\n getCaip2(): LedgerCaip2 | null {\r\n return this.storage.get(\"ledger:caip2\");\r\n }\r\n\r\n setBip44(bip44: LedgerDerivationPath): void {\r\n this.storage.set(\"ledger:bip44\", bip44);\r\n }\r\n\r\n getBip44(): LedgerDerivationPath | null {\r\n return this.storage.get(\"ledger:bip44\");\r\n }\r\n\r\n setHDStandard(standard: LedgerHDStandard): void {\r\n this.storage.set(\"ledger:hd-standard\", standard);\r\n }\r\n\r\n getHDStandard(): LedgerHDStandard | null {\r\n return this.storage.get(\"ledger:hd-standard\");\r\n }\r\n\r\n clear(): void {\r\n this.storage.remove(\"ledger:caip2\");\r\n this.storage.remove(\"ledger:bip44\");\r\n this.storage.remove(\"ledger:hd-standard\");\r\n this.storage.remove(\"ledger:device-hid\");\r\n }\r\n}\r\n\r\nexport const ledgerStorage = new LedgerStorage(mwcStorage);\r\n","import type { LedgerCaip2, LedgerComputedAddress, LedgerHDStandard } from \"../ledger.types\";\r\n\r\nimport { Bip44 } from \"@shared/bip44\";\r\nimport { LedgerError } from \"../ledger-error\";\r\nimport { ledgerStorage } from \"./ledger-storage\";\r\n\r\nexport interface LedgerSession {\r\n caip2: LedgerCaip2;\r\n bip44: Bip44;\r\n hdStandard: LedgerHDStandard;\r\n account: LedgerComputedAddress;\r\n}\r\n\r\nexport class LedgerSessionManager {\r\n private current: LedgerSession | null = null;\r\n\r\n save(session: LedgerSession): void {\r\n this.current = session;\r\n ledgerStorage.setCaip2(session.caip2);\r\n ledgerStorage.setBip44(session.bip44.getFullPath());\r\n ledgerStorage.setHDStandard(session.hdStandard);\r\n }\r\n\r\n loadSaved() {\r\n const caip2 = ledgerStorage.getCaip2();\r\n const bip44Path = ledgerStorage.getBip44();\r\n const hdStandard = ledgerStorage.getHDStandard();\r\n\r\n if (!caip2 || !bip44Path || !hdStandard) {\r\n return null;\r\n }\r\n\r\n try {\r\n const bip44 = new Bip44(bip44Path);\r\n return { caip2, bip44, hdStandard };\r\n } catch {\r\n ledgerStorage.clear();\r\n return null;\r\n }\r\n }\r\n\r\n getSession(): LedgerSession | null {\r\n return this.current;\r\n }\r\n\r\n requireSession(): LedgerSession {\r\n if (!this.current) {\r\n throw new LedgerError(\"COMMON_NOT_CONNECTED\");\r\n }\r\n return this.current;\r\n }\r\n\r\n clear(): void {\r\n this.current = null;\r\n ledgerStorage.clear();\r\n }\r\n}\r\n","import type { LedgerAppAndVersion, LedgerAppName } from \"../ledger.types\";\r\n\r\nimport TransportWebHID from \"@ledgerhq/hw-transport-webhid\";\r\nimport { LedgerError } from \"../ledger-error\";\r\n\r\nexport interface DeviceStatus {\r\n available: boolean;\r\n currentApp?: LedgerAppAndVersion;\r\n}\r\n\r\nexport class LedgerTransportManager {\r\n private transport: TransportWebHID | null = null;\r\n private disconnectHandler: (() => void) | null = null;\r\n\r\n async open(): Promise<TransportWebHID> {\r\n if (this.transport) {\r\n console.debug(\"[Ledger] TransportManager.open(): reusing existing transport\");\r\n return this.transport;\r\n }\r\n\r\n console.debug(\"[Ledger] TransportManager.open(): checking for connected device\");\r\n this.transport = await this.openTransport();\r\n this.attachDisconnectHandler();\r\n\r\n console.debug(\"[Ledger] TransportManager.open(): transport ready\");\r\n return this.transport;\r\n }\r\n\r\n async checkDeviceStatus(): Promise<DeviceStatus> {\r\n const devices = await TransportWebHID.list();\r\n console.debug(\"[Ledger] TransportManager.checkDeviceStatus(): devices found\", devices.length);\r\n\r\n if (devices.length === 0) {\r\n return { available: false };\r\n }\r\n\r\n try {\r\n console.debug(\"[Ledger] TransportManager.checkDeviceStatus(): opening transport\");\r\n const transport = await TransportWebHID.openConnected();\r\n if (!transport) {\r\n console.debug(\"[Ledger] TransportManager.checkDeviceStatus(): could not open transport\");\r\n return { available: false };\r\n }\r\n\r\n this.transport = transport;\r\n this.attachDisconnectHandler();\r\n\r\n console.debug(\"[Ledger] TransportManager.checkDeviceStatus(): getting current app\");\r\n const currentApp = await this.getCurrentApp();\r\n console.debug(\"[Ledger] TransportManager.checkDeviceStatus(): current app\", currentApp.name);\r\n return { available: true, currentApp };\r\n } catch (error) {\r\n console.debug(\"[Ledger] TransportManager.checkDeviceStatus(): failed\", error);\r\n return { available: false };\r\n }\r\n }\r\n\r\n async getCurrentApp(): Promise<LedgerAppAndVersion> {\r\n const transport = await this.open();\r\n console.debug(\"[Ledger] TransportManager.getCurrentApp(): sending APDU command\");\r\n const response = await transport.send(0xb0, 0x01, 0x00, 0x00);\r\n\r\n let index = 0;\r\n const format = response[index++];\r\n\r\n if (format !== 1) {\r\n throw new LedgerError(\"LEDGER_APP_NOT_OPEN\");\r\n }\r\n\r\n const nameLength = response[index++];\r\n const nameStartIndex = index;\r\n index += nameLength;\r\n const name = response.subarray(nameStartIndex, index).toString(\"ascii\");\r\n\r\n const versionLength = response[index++];\r\n const versionStartIndex = index;\r\n index += versionLength;\r\n const version = response.subarray(versionStartIndex, index).toString(\"ascii\");\r\n\r\n const flagLength = response[index++];\r\n const flagsStartIndex = index;\r\n index += flagLength;\r\n const flags = response.subarray(flagsStartIndex, index);\r\n\r\n console.debug(\"[Ledger] TransportManager.getCurrentApp(): received\", { name, version });\r\n return { name, version, flags };\r\n }\r\n\r\n private async openTransport(): Promise<TransportWebHID> {\r\n try {\r\n const existing = await TransportWebHID.openConnected();\r\n\r\n if (existing) {\r\n console.debug(\"[Ledger] TransportManager.open(): found connected device\");\r\n return existing;\r\n }\r\n } catch {\r\n console.debug(\"[Ledger] TransportManager.open(): stale device detected, requesting new connection\");\r\n }\r\n\r\n console.debug(\"[Ledger] TransportManager.open(): creating new transport (will prompt user)\");\r\n return (await TransportWebHID.create()) as TransportWebHID;\r\n }\r\n\r\n async verifyApp(expectedAppName: LedgerAppName): Promise<void> {\r\n const { name } = await this.getCurrentApp();\r\n\r\n if (name !== expectedAppName) {\r\n throw new LedgerError(\r\n \"LEDGER_WRONG_APP\",\r\n new Error(`Expected ${expectedAppName} app, currently running: ${name}`)\r\n );\r\n }\r\n }\r\n\r\n async close(): Promise<void> {\r\n if (this.transport) {\r\n console.debug(\"[Ledger] TransportManager.close(): closing transport\");\r\n try {\r\n await this.transport.close();\r\n } finally {\r\n this.transport = null;\r\n }\r\n console.debug(\"[Ledger] TransportManager.close(): transport closed\");\r\n }\r\n }\r\n\r\n onDisconnect(handler: () => void): void {\r\n this.disconnectHandler = handler;\r\n this.attachDisconnectHandler();\r\n }\r\n\r\n private attachDisconnectHandler(): void {\r\n if (this.transport && this.disconnectHandler) {\r\n this.transport.on(\"disconnect\", this.disconnectHandler);\r\n }\r\n }\r\n}\r\n","import type { LedgerClient } from \"@clients/client-types\";\r\nimport type { ConnectorConfig, LedgerProvider } from \"@connectors/connector-types\";\r\nimport type { WalletStore } from \"@stores/wallet-store/wallet-store\";\r\nimport type { LedgerSession } from \"./internal/ledger-session-manager\";\r\n\r\nimport type { LedgerCaip2, LedgerComputedAddress, LedgerConnectOptions } from \"./ledger.types\";\r\nimport { BaseConnector } from \"@connectors/base-connector\";\r\nimport { Bip44 } from \"@shared/bip44\";\r\nimport { ConnectionMutex } from \"@shared/connection-mutex\";\r\nimport { LedgerAppFactory } from \"./internal/ledger-app-factory\";\r\nimport { LedgerClientFactory } from \"./internal/ledger-client-factory\";\r\nimport { LedgerSessionManager } from \"./internal/ledger-session-manager\";\r\nimport { LedgerTransportManager } from \"./internal/ledger-transport-manager\";\r\nimport { LedgerError } from \"./ledger-error\";\r\n\r\nexport class LedgerConnector extends BaseConnector<\"ledger\", LedgerClient, LedgerProvider> {\r\n private readonly transportManager = new LedgerTransportManager();\r\n private readonly sessionManager = new LedgerSessionManager();\r\n private readonly clientFactory: LedgerClientFactory;\r\n private readonly mutex = new ConnectionMutex();\r\n private client: LedgerClient | null = null;\r\n\r\n constructor(store: WalletStore, config: ConnectorConfig<\"ledger\">) {\r\n super(store, config);\r\n this.clientFactory = new LedgerClientFactory(this.resolvedConfig);\r\n this.transportManager.onDisconnect(() => this.handleDisconnect());\r\n }\r\n\r\n protected async onInitialize(): Promise<void> {}\r\n\r\n async connect(chain: LedgerCaip2, options?: LedgerConnectOptions): Promise<void> {\r\n console.debug(\"[Ledger] connect() called\", { chain, options });\r\n await this.mutex.run(async () =>\r\n this.performConnect(chain, options ?? { bip44: Bip44.fromCaip2(chain, 0, 0, 0), ledgerHDStandard: \"bip44\" })\r\n );\r\n }\r\n\r\n async disconnect(): Promise<void> {\r\n this.events.startDisconnecting();\r\n await this.transportManager.close();\r\n this.client = null;\r\n this.sessionManager.clear();\r\n this.events.disconnected();\r\n }\r\n\r\n async restoreConnection(): Promise<void> {\r\n console.debug(\"[Ledger] restoreConnection() called\");\r\n if (this.client) {\r\n console.debug(\"[Ledger] restoreConnection(): client already exists, skipping\");\r\n return;\r\n }\r\n\r\n const saved = this.sessionManager.loadSaved();\r\n if (!saved) {\r\n console.debug(\"[Ledger] restoreConnection(): no saved session, skipping\");\r\n return;\r\n }\r\n\r\n const status = await this.transportManager.checkDeviceStatus();\r\n if (!status.available) {\r\n console.debug(\"[Ledger] restoreConnection(): device not available, skipping\");\r\n return;\r\n }\r\n\r\n const requiredApp = LedgerAppFactory.getRequiredAppName(saved.caip2);\r\n if (status.currentApp?.name !== requiredApp) {\r\n console.debug(\"[Ledger] restoreConnection(): wrong app\", {\r\n required: requiredApp,\r\n current: status.currentApp?.name,\r\n });\r\n return;\r\n }\r\n\r\n console.debug(\"[Ledger] restoreConnection(): starting restore\", { chain: saved.caip2 });\r\n await this.mutex.run(async () => this.performRestore(saved));\r\n }\r\n\r\n async switchChain(chain: LedgerCaip2): Promise<void> {\r\n const { bip44, hdStandard } = this.sessionManager.requireSession();\r\n await this.connect(chain, {\r\n bip44: Bip44.fromCaip2(chain, bip44.account, bip44.change, bip44.addressIndex),\r\n ledgerHDStandard: hdStandard,\r\n });\r\n }\r\n\r\n getSession(): LedgerSession | null {\r\n return this.sessionManager.getSession();\r\n }\r\n\r\n getClient(): LedgerClient {\r\n if (!this.client) throw new LedgerError(\"COMMON_NOT_CONNECTED\");\r\n return this.client;\r\n }\r\n\r\n getProvider(): LedgerProvider {\r\n throw new LedgerError(\"COMMON_FEATURE_NOT_SUPPORTED\");\r\n }\r\n\r\n async fetchAddressesForSelection(chain: LedgerCaip2, paths: Bip44[]): Promise<LedgerComputedAddress[]> {\r\n await this.requireApp(chain);\r\n const app = await LedgerAppFactory.createApp(chain, this.transportManager);\r\n return app.getComputedAddresses(paths, this.resolvedConfig.getChain(chain).ledgerHrp);\r\n }\r\n\r\n private async performConnect(chain: LedgerCaip2, options: LedgerConnectOptions): Promise<void> {\r\n console.debug(\"[Ledger] performConnect() started\", { chain, bip44: options.bip44 });\r\n this.events.startConnecting();\r\n\r\n try {\r\n const { account, client } = await this.establishConnection(chain, options);\r\n this.client = client;\r\n this.sessionManager.save({ caip2: chain, bip44: options.bip44, hdStandard: options.ledgerHDStandard, account });\r\n this.events.connected({ address: account.address, addresses: [account.address], caip2: chain });\r\n console.debug(\"[Ledger] performConnect() completed\", { address: account.address });\r\n } catch (error) {\r\n console.debug(\"[Ledger] performConnect() failed\", error);\r\n await this.transportManager.close();\r\n this.events.disconnected();\r\n throw error;\r\n }\r\n }\r\n\r\n private async performRestore(saved: NonNullable<ReturnType<typeof this.sessionManager.loadSaved>>): Promise<void> {\r\n console.debug(\"[Ledger] performRestore() started\", { chain: saved.caip2, bip44: saved.bip44 });\r\n try {\r\n const { account, client } = await this.establishConnection(saved.caip2, {\r\n bip44: saved.bip44,\r\n ledgerHDStandard: saved.hdStandard,\r\n });\r\n\r\n this.client = client;\r\n this.sessionManager.save({ caip2: saved.caip2, bip44: saved.bip44, hdStandard: saved.hdStandard, account });\r\n this.events.reconnected({ address: account.address, addresses: [account.address], caip2: saved.caip2 });\r\n console.debug(\"[Ledger] performRestore() completed\", { address: account.address });\r\n } catch (error) {\r\n console.debug(\"[Ledger] performRestore() failed\", error);\r\n await this.transportManager.close();\r\n }\r\n }\r\n\r\n private async establishConnection(chain: LedgerCaip2, options: LedgerConnectOptions) {\r\n console.debug(\"[Ledger] establishConnection() started\", { chain });\r\n\r\n try {\r\n await this.requireApp(chain);\r\n console.debug(\"[Ledger] establishConnection(): app verified\");\r\n\r\n const app = await LedgerAppFactory.createApp(chain, this.transportManager);\r\n const hrp = this.resolvedConfig.getChain(chain).ledgerHrp;\r\n\r\n const result = {\r\n account: await app.getComputedAddress(options.bip44, hrp),\r\n client: await this.clientFactory.create(chain, app, options.bip44),\r\n };\r\n\r\n console.debug(\"[Ledger] establishConnection() completed\");\r\n return result;\r\n } catch (error) {\r\n throw LedgerError.fromError(error) ?? error;\r\n }\r\n }\r\n\r\n private handleDisconnect(): void {\r\n this.client = null;\r\n this.sessionManager.clear();\r\n this.events.disconnected();\r\n }\r\n\r\n private async requireApp(chain: LedgerCaip2): Promise<void> {\r\n const requiredApp = LedgerAppFactory.getRequiredAppName(chain);\r\n const currentApp = await this.transportManager.getCurrentApp();\r\n\r\n if (currentApp.name !== requiredApp) {\r\n throw new LedgerError(\r\n \"LEDGER_WRONG_APP\",\r\n new Error(`Please open the ${requiredApp} app on your Ledger. Currently running: ${currentApp.name}`)\r\n );\r\n }\r\n }\r\n}\r\n","import type { Eip155Caip2 } from \"@chains/chain.types\";\r\nimport type { MetaMaskProvider } from \"@connectors/connector-types\";\r\nimport type { Hex, MetamaskConnectEVM } from \"@metamask/connect-evm\";\r\nimport type { SupportedWalletChains } from \"@wallets/wallet.types\";\r\n\r\nimport { ChainGuards } from \"@chains/chain.utils\";\r\nimport { EvmClient } from \"@clients/evm/evm-client\";\r\nimport { BaseConnector } from \"@connectors/base-connector\";\r\nimport { createEVMClient } from \"@metamask/connect-evm\";\r\nimport { ChainUtils } from \"@utils/chain-utils\";\r\nimport { MetaMaskError } from \"./metamask-error\";\r\n\r\nconst RPC_ERROR = {\r\n USER_REJECTED: 4001,\r\n REQUEST_PENDING: -32002,\r\n} as const;\r\n\r\nexport class MetaMaskConnector extends BaseConnector<\"metamask\", EvmClient, MetaMaskProvider> {\r\n private sdk!: MetamaskConnectEVM;\r\n private provider!: MetaMaskProvider;\r\n private client: EvmClient | null = null;\r\n\r\n protected async onInitialize(): Promise<void> {\r\n const supportedNetworks: Record<Hex, string> = {};\r\n for (const caip2 of this.resolvedConfig.getSupportedChains()) {\r\n if (!ChainGuards.isEvmCaip2(caip2)) continue;\r\n const chain = this.resolvedConfig.getEvmChain(caip2);\r\n supportedNetworks[chain.evmChain.hex as Hex] = chain.rpcUrls[0];\r\n }\r\n\r\n this.sdk = await createEVMClient({\r\n dapp: { name: this.config.metadata.name, url: this.config.metadata.url },\r\n api: { supportedNetworks },\r\n });\r\n\r\n this.provider = this.sdk.getProvider() as MetaMaskProvider;\r\n\r\n this.provider.on(\"accountsChanged\", (accounts: string[]) => this.onAccountsChanged(accounts));\r\n this.provider.on(\"chainChanged\", (hex: string) => this.onChainChanged(hex));\r\n this.provider.on(\"disconnect\", () => {\r\n if (this.getConnectionState() === \"connected\") {\r\n this.client = null;\r\n this.events.disconnected();\r\n }\r\n });\r\n }\r\n\r\n async connect(chain: SupportedWalletChains<\"metamask\">[number]): Promise<void> {\r\n if (this.getConnectionState() === \"connecting\") {\r\n throw new MetaMaskError(\"COMMON_CONNECTION_IN_PROGRESS\");\r\n }\r\n\r\n await this.initialize();\r\n this.events.startConnecting();\r\n\r\n if (chain && !ChainGuards.isEvmCaip2(chain)) {\r\n this.events.disconnected();\r\n throw new MetaMaskError(\"COMMON_CHAIN_NOT_SUPPORTED\");\r\n }\r\n\r\n const targetHex = chain ? (this.resolvedConfig.getEvmChain(chain).evmChain.hex as Hex) : undefined;\r\n\r\n let accounts: string[];\r\n let chainId: string;\r\n\r\n const existingAccount = this.sdk.getAccount();\r\n const existingChainId = this.sdk.getChainId();\r\n if (existingAccount && existingChainId) {\r\n accounts = this.sdk.accounts;\r\n chainId = existingChainId;\r\n } else {\r\n const result = await this.sdk.connect(targetHex ? { chainIds: [targetHex] } : undefined).catch((error) => {\r\n this.events.disconnected();\r\n if (ChainUtils.isRpcErrorWithCode(error, RPC_ERROR.USER_REJECTED)) {\r\n throw new MetaMaskError(\"COMMON_USER_REJECTED\", error);\r\n }\r\n if (ChainUtils.isRpcErrorWithCode(error, RPC_ERROR.REQUEST_PENDING)) {\r\n throw new MetaMaskError(\"COMMON_CONNECTION_IN_PROGRESS\", error);\r\n }\r\n throw new MetaMaskError(\"COMMON_CONNECTION_FAILED\", error);\r\n });\r\n if (!result.accounts.length) {\r\n this.events.disconnected();\r\n throw new MetaMaskError(\"COMMON_NO_ACCOUNTS\");\r\n }\r\n accounts = result.accounts;\r\n chainId = result.chainId;\r\n }\r\n\r\n const currentChain = this.resolvedConfig.evmHexMap.get(chainId);\r\n\r\n if (chain && currentChain !== chain) {\r\n await this.switchChain(chain);\r\n } else if (!currentChain) {\r\n this.events.disconnected();\r\n throw new MetaMaskError(\"COMMON_UNKNOWN_CHAIN_ID\");\r\n }\r\n\r\n const caip2 = chain ?? currentChain;\r\n this.createClient(caip2);\r\n this.events.connected({ address: accounts[0], addresses: accounts, caip2 });\r\n }\r\n\r\n async disconnect(): Promise<void> {\r\n this.events.startDisconnecting();\r\n if (this.initialized) {\r\n await this.sdk.disconnect();\r\n }\r\n this.client = null;\r\n this.events.disconnected();\r\n }\r\n\r\n async restoreConnection(): Promise<void> {\r\n if (this.getConnectionState() !== \"disconnected\") return;\r\n\r\n await this.initialize();\r\n if (this.getConnectionState() !== \"disconnected\") return;\r\n\r\n const account = this.sdk.getAccount();\r\n if (!account) return;\r\n\r\n const hex = this.sdk.getChainId();\r\n if (!hex) return;\r\n\r\n const caip2 = this.resolvedConfig.evmHexMap.get(hex);\r\n if (!caip2) return;\r\n\r\n this.createClient(caip2);\r\n this.events.reconnected({ address: account, addresses: this.sdk.accounts, caip2 });\r\n }\r\n\r\n async switchChain(caip2: Eip155Caip2): Promise<void> {\r\n const chain = this.resolvedConfig.getEvmChain(caip2);\r\n\r\n try {\r\n await this.sdk.switchChain({\r\n chainId: chain.evmChain.hex as Hex,\r\n chainConfiguration: {\r\n chainId: chain.evmChain.hex,\r\n chainName: chain.name,\r\n nativeCurrency: chain.nativeCurrency,\r\n rpcUrls: chain.rpcUrls,\r\n blockExplorerUrls: chain.blockExplorerUrls,\r\n },\r\n });\r\n } catch (error) {\r\n if (ChainUtils.isRpcErrorWithCode(error, RPC_ERROR.USER_REJECTED)) {\r\n throw new MetaMaskError(\"COMMON_USER_REJECTED\", error);\r\n }\r\n throw new MetaMaskError(\"COMMON_CHAIN_NOT_SUPPORTED\", error);\r\n }\r\n\r\n this.createClient(caip2);\r\n }\r\n\r\n getClient(): EvmClient {\r\n if (!this.client) throw new MetaMaskError(\"COMMON_NOT_CONNECTED\");\r\n return this.client;\r\n }\r\n\r\n getProvider(): MetaMaskProvider {\r\n return this.provider;\r\n }\r\n\r\n private onAccountsChanged(accounts: string[]): void {\r\n if (accounts.length === 0) {\r\n if (this.getConnectionState() !== \"connected\") return;\r\n this.events.startDisconnecting();\r\n this.events.disconnected();\r\n return;\r\n }\r\n\r\n this.provider\r\n .request({ method: \"eth_chainId\" })\r\n .then((hex: string) => {\r\n const caip2 = this.resolvedConfig.evmHexMap.get(hex);\r\n if (!caip2) return;\r\n\r\n if (this.getConnectionState() === \"disconnected\") {\r\n this.events.startConnecting();\r\n this.createClient(caip2);\r\n this.events.connected({ address: accounts[0], addresses: accounts, caip2 });\r\n } else {\r\n this.events.addressChanged({ address: accounts[0], addresses: accounts, caip2 });\r\n }\r\n })\r\n .catch((error) => {\r\n this.emitError(error);\r\n });\r\n }\r\n\r\n private onChainChanged(hex: string): void {\r\n const caip2 = this.resolvedConfig.evmHexMap.get(hex);\r\n\r\n if (!caip2) {\r\n this.client = null;\r\n this.events.disconnected();\r\n return;\r\n }\r\n\r\n if (this.getCurrentCaip2() !== caip2) {\r\n this.createClient(caip2);\r\n this.events.chainChanged(caip2);\r\n }\r\n }\r\n\r\n private createClient(caip2: Eip155Caip2): void {\r\n this.client = EvmClient.create(this.resolvedConfig.getEvmChain(caip2), this.provider);\r\n }\r\n\r\n private getConnectionState() {\r\n return this.store.getSnapshot().context.connectionState;\r\n }\r\n\r\n private getCurrentCaip2() {\r\n return this.store.getSnapshot().context.caip2;\r\n }\r\n}\r\n","import type { EvmChain } from \"@chains/chain.types\";\r\nimport type UniversalProvider from \"@walletconnect/universal-provider\";\r\nimport type { PublicClient, WalletClient } from \"viem\";\r\n\r\nimport { ViemHelper } from \"@chains/viem/viem-helper\";\r\nimport { EvmClient } from \"@clients/evm/evm-client\";\r\nimport { createPublicClient, createWalletClient, custom, http } from \"viem\";\r\n\r\n/**\r\n * WalletConnect EVM client with hybrid transport.\r\n * Reads go direct to RPC (avoids Reown unsupported chain issue),\r\n * writes/signing go through WalletConnect provider.\r\n */\r\nexport class WalletConnectEvmClient extends EvmClient {\r\n constructor(chain: EvmChain, publicClient: PublicClient, walletClient: WalletClient) {\r\n super(chain, publicClient, walletClient);\r\n }\r\n\r\n static createWithProvider(chainConfig: EvmChain, provider: UniversalProvider): WalletConnectEvmClient {\r\n const viemChain = ViemHelper.toViemChain(chainConfig);\r\n\r\n const publicClient = createPublicClient({\r\n chain: viemChain,\r\n transport: http(chainConfig.rpcUrls[0]),\r\n });\r\n\r\n const walletClient = createWalletClient({\r\n chain: viemChain,\r\n transport: custom(provider),\r\n });\r\n\r\n return new WalletConnectEvmClient(chainConfig, publicClient, walletClient);\r\n }\r\n}\r\n","import type { XRPlCaip2, XrplChain } from \"@chains/chain.types\";\r\nimport type { XrpClient } from \"@clients/xrp/xrp-client\";\r\nimport type { GirinSignedTxJson } from \"@connectors/wallet-connect/clients/wallet-connect-xrpl-client.types\";\r\nimport type UniversalProvider from \"@walletconnect/universal-provider\";\r\nimport type { SubmittableTransaction } from \"xrpl\";\r\nimport { XrplClient } from \"@clients/xrp/xrpl-client\";\r\nimport { stripEmptyObjects } from \"@utils/utils\";\r\nimport { encode } from \"xrpl\";\r\n\r\nexport class WalletConnectXrpClient extends XrplClient implements XrpClient {\r\n provider: UniversalProvider;\r\n\r\n constructor(chain: XrplChain, provider: UniversalProvider) {\r\n super(chain);\r\n this.provider = provider;\r\n }\r\n\r\n async sendTx(tx: SubmittableTransaction): Promise<string> {\r\n await this.connect();\r\n try {\r\n const prepared = await this.autofill(tx);\r\n const xrpCaip2: XRPlCaip2 = await this.getCaip2();\r\n\r\n if (this.isHexTrust()) {\r\n const result = await this.provider.request<{ tx_json: { hash: string } }>(\r\n {\r\n method: \"xrpl_signTransaction\",\r\n params: {\r\n tx_json: prepared,\r\n submit: true,\r\n },\r\n },\r\n xrpCaip2\r\n );\r\n return result.tx_json.hash;\r\n }\r\n\r\n const result = await this.provider.request<{ tx_json: SubmittableTransaction | GirinSignedTxJson }>(\r\n {\r\n method: \"xrpl_signTransaction\",\r\n params: {\r\n tx_json: prepared,\r\n submit: false,\r\n },\r\n },\r\n xrpCaip2\r\n );\r\n\r\n const signedTx = this.sanitizeTx(result.tx_json);\r\n const signedBlob = encode(signedTx);\r\n const res = await this.submitAndWait(signedBlob);\r\n return res.result.hash;\r\n } finally {\r\n await this.disconnect();\r\n }\r\n }\r\n\r\n private sanitizeTx(walletResult: SubmittableTransaction | GirinSignedTxJson): SubmittableTransaction {\r\n if (this.isGirin(walletResult)) {\r\n // Girin injects non-standard fields (hash, TxHash, empty objects).\r\n // Recreate a clean SubmittableTransaction with only valid XRPL fields.\r\n // was copeid\r\n const tx = {\r\n TransactionType: walletResult.TransactionType,\r\n Account: walletResult.Account,\r\n Fee: walletResult.Fee,\r\n Sequence: walletResult.Sequence,\r\n SigningPubKey: walletResult.SigningPubKey,\r\n TxnSignature: walletResult.TxnSignature,\r\n Flags: walletResult.Flags,\r\n LastLedgerSequence: walletResult.LastLedgerSequence,\r\n Destination: walletResult.Destination,\r\n Amount: walletResult.Amount,\r\n DestinationTag: walletResult.DestinationTag,\r\n Memos: walletResult.Memos,\r\n SourceTag: walletResult.SourceTag,\r\n } as SubmittableTransaction;\r\n\r\n return stripEmptyObjects(tx);\r\n }\r\n\r\n return walletResult;\r\n }\r\n private isHexTrust(): boolean {\r\n const peerName = this.getPeerName();\r\n return peerName.includes(\"hex safe\");\r\n }\r\n\r\n private isGirin(_walletResult: SubmittableTransaction | GirinSignedTxJson): _walletResult is GirinSignedTxJson {\r\n const peerName = this.getPeerName();\r\n return peerName.includes(\"girin\");\r\n }\r\n\r\n private getPeerName(): string {\r\n return (this.provider.session?.peer.metadata.name ?? \"unknown\").toLowerCase();\r\n }\r\n}\r\n","import type { Caip2 } from \"@chains/chain.types\";\r\nimport type { ChainClient } from \"@clients/client-types\";\r\nimport type { ResolvedWalletConfig } from \"@config/config-types\";\r\n\r\nimport type UniversalProvider from \"@walletconnect/universal-provider\";\r\nimport { ChainUtils } from \"@utils/chain-utils\";\r\nimport { WalletConnectEvmClient } from \"../clients/wallet-connect-evm-client\";\r\nimport { WalletConnectXrpClient } from \"../clients/wallet-connect-xrpl-client\";\r\nimport { WalletConnectError } from \"../wallet-connect-error\";\r\n\r\nexport class WalletConnectClientFactory {\r\n constructor(\r\n private readonly provider: UniversalProvider,\r\n private readonly resolvedConfig: ResolvedWalletConfig\r\n ) {}\r\n\r\n create(caip2: Caip2): ChainClient {\r\n if (ChainUtils.isEvmCaip2(caip2)) {\r\n const chain = this.resolvedConfig.getEvmChain(caip2);\r\n return WalletConnectEvmClient.createWithProvider(chain, this.provider);\r\n }\r\n\r\n if (ChainUtils.isXrplCaip2(caip2)) {\r\n const chain = this.resolvedConfig.getXrplChain(caip2);\r\n return new WalletConnectXrpClient(chain, this.provider);\r\n }\r\n\r\n throw new WalletConnectError(\"COMMON_CHAIN_NOT_SUPPORTED\");\r\n }\r\n}\r\n","import type { Caip2 } from \"@chains/chain.types\";\r\nimport type { MWCStorage } from \"@storage/local-storage-schema\";\r\nimport { mwcStorage } from \"@storage/local-storage-schema\";\r\n\r\nclass SessionStorage {\r\n constructor(private readonly storage: MWCStorage) {}\r\n\r\n setLastSession(session: string): void {\r\n this.storage.set(\"wc:last-session\", session);\r\n }\r\n\r\n getLastSession(): string | null {\r\n return this.storage.get(\"wc:last-session\");\r\n }\r\n\r\n setLastAddress(address: string): void {\r\n this.storage.set(\"wc:last-address\", address);\r\n }\r\n\r\n getLastAddress(): string | null {\r\n return this.storage.get(\"wc:last-address\");\r\n }\r\n\r\n setLastChain(caip2: Caip2): void {\r\n this.storage.set(\"wc:last-chain\", caip2);\r\n }\r\n\r\n getLastChain(): Caip2 | null {\r\n return this.storage.get(\"wc:last-chain\");\r\n }\r\n\r\n clear(): void {\r\n this.storage.remove(\"wc:last-session\");\r\n this.storage.remove(\"wc:last-address\");\r\n this.storage.remove(\"wc:last-chain\");\r\n }\r\n}\r\n\r\nexport const sessionStorage = new SessionStorage(mwcStorage);\r\n","import type { Caip2 } from \"@chains/chain.types\";\r\nimport type { WalletAddressState } from \"@stores/wallet-store/wallet-store\";\r\n\r\nimport type UniversalProvider from \"@walletconnect/universal-provider\";\r\nimport { parseCaip10 } from \"@chains/chain.utils\";\r\nimport { ChainUtils } from \"@utils/chain-utils\";\r\nimport { WalletConnectError } from \"../wallet-connect-error\";\r\nimport { sessionStorage } from \"./wallet-connect-session-storage\";\r\n\r\nexport interface ParsedSession {\r\n availableAddresses: WalletAddressState[];\r\n selectedAddress: WalletAddressState;\r\n}\r\n\r\nexport class WalletConnectSessionManager {\r\n constructor(private readonly provider: UniversalProvider) {}\r\n\r\n parseSession(): ParsedSession {\r\n const session = this.provider.session;\r\n if (!session) throw new WalletConnectError(\"WALLET_CONNECT_SESSION_NOT_FOUND\");\r\n\r\n const availableAddresses: WalletAddressState[] = [];\r\n\r\n const eip155 = session.namespaces.eip155;\r\n if (eip155?.accounts) {\r\n for (const account of eip155.accounts) {\r\n const { namespace, reference, address } = parseCaip10(account);\r\n availableAddresses.push({\r\n type: \"wallet-connect\",\r\n address,\r\n caip2: `${namespace}:${reference}` as Caip2,\r\n isEvm: true,\r\n });\r\n }\r\n }\r\n\r\n const xrpl = session.namespaces.xrpl;\r\n if (xrpl?.accounts) {\r\n for (const account of xrpl.accounts) {\r\n const { namespace, reference, address } = parseCaip10(account);\r\n availableAddresses.push({\r\n type: \"wallet-connect\",\r\n address,\r\n caip2: `${namespace}:${reference}` as Caip2,\r\n isEvm: false,\r\n });\r\n }\r\n }\r\n\r\n return { availableAddresses, selectedAddress: availableAddresses[0] };\r\n }\r\n\r\n resolveSessionWithStorage(parsedSession: ParsedSession): ParsedSession {\r\n const lastAddress = sessionStorage.getLastAddress();\r\n const lastChain = sessionStorage.getLastChain();\r\n\r\n if (lastAddress && lastChain) {\r\n const validAddress = parsedSession.availableAddresses.find(\r\n (addressState) => addressState.address === lastAddress && addressState.caip2 === lastChain\r\n );\r\n if (validAddress) {\r\n return { availableAddresses: parsedSession.availableAddresses, selectedAddress: validAddress };\r\n }\r\n }\r\n return parsedSession;\r\n }\r\n\r\n saveLastConnection(address: WalletAddressState): void {\r\n sessionStorage.setLastAddress(address.address);\r\n sessionStorage.setLastChain(address.caip2);\r\n }\r\n\r\n buildNamespaces(chains: Caip2[]) {\r\n const evmChains = chains.filter(ChainUtils.isEvmCaip2);\r\n const xrplChains = chains.filter(ChainUtils.isXrplCaip2);\r\n\r\n const namespaces: Record<string, { chains: string[]; methods: string[]; events: string[] }> = {};\r\n\r\n if (evmChains.length > 0) {\r\n namespaces.eip155 = {\r\n chains: evmChains,\r\n methods: [\"eth_sendTransaction\", \"eth_signTransaction\", \"eth_sign\", \"personal_sign\", \"eth_signTypedData\"],\r\n events: [\"chainChanged\", \"accountsChanged\"],\r\n };\r\n }\r\n\r\n if (xrplChains.length > 0) {\r\n namespaces.xrpl = {\r\n chains: xrplChains,\r\n methods: [\"xrpl_signTransaction\"],\r\n events: [],\r\n };\r\n }\r\n\r\n return namespaces;\r\n }\r\n}\r\n","import type { Caip2 } from \"@chains/chain.types\";\r\nimport type { ChainClient } from \"@clients/client-types\";\r\nimport type { WalletConnectConnectorConfig, WalletConnectProvider } from \"@connectors/connector-types\";\r\nimport type { AppKit } from \"@reown/appkit\";\r\nimport type { CaipNetwork } from \"@reown/appkit-common\";\r\nimport type { WalletStore } from \"@stores/wallet-store/wallet-store\";\r\nimport type { SessionTypes } from \"@walletconnect/types\";\r\nimport type { SupportedWalletChains } from \"@wallets/wallet.types\";\r\nimport type { ProviderRpcError } from \"viem\";\r\n\r\nimport { parseCaip2 } from \"@chains/chain.utils\";\r\nimport { BaseConnector } from \"@connectors/base-connector\";\r\nimport { createAppKit } from \"@reown/appkit\";\r\nimport { objectEntries } from \"@utils/utils\";\r\nimport UniversalProvider from \"@walletconnect/universal-provider\";\r\nimport { WalletConnectClientFactory } from \"./internal/wallet-connect-client-factory\";\r\nimport { WalletConnectSessionManager } from \"./internal/wallet-connect-session-manager\";\r\nimport { sessionStorage } from \"./internal/wallet-connect-session-storage\";\r\nimport { WalletConnectError } from \"./wallet-connect-error\";\r\n\r\n/**\r\n * WalletConnect connector using Reown AppKit for QR modal.\r\n *\r\n * - connect() opens AppKit first (spinner), then provider.connect() emits display_uri\r\n * which auto-populates the QR in the modal. The empty display_uri handler is required.\r\n * - disconnect() cleans up the WC session, but provider and AppKit survive —\r\n * no re-initialization needed (unlike MetaMask/Xaman).\r\n * - Only EVM chains are registered with AppKit (ChainNamespace doesn't include \"xrpl\").\r\n * XRPL sessions still work fine without AppKit awareness.\r\n */\r\nexport class WalletConnectConnector extends BaseConnector<\"wallet-connect\", ChainClient, WalletConnectProvider> {\r\n protected override readonly config: WalletConnectConnectorConfig;\r\n\r\n declare private provider: UniversalProvider;\r\n declare private sessionManager: WalletConnectSessionManager;\r\n declare private clientFactory: WalletConnectClientFactory;\r\n declare private appKit: AppKit;\r\n private client: ChainClient | null = null;\r\n\r\n constructor(store: WalletStore, config: WalletConnectConnectorConfig) {\r\n super(store, config);\r\n this.config = config;\r\n }\r\n\r\n protected async onInitialize(): Promise<void> {\r\n this.provider = await UniversalProvider.init({\r\n projectId: this.config.projectId,\r\n metadata: {\r\n name: this.config.metadata.name,\r\n description: this.config.metadata.description ?? \"\",\r\n url: this.config.metadata.url,\r\n icons: this.config.metadata.icons ?? [],\r\n },\r\n });\r\n\r\n this.sessionManager = new WalletConnectSessionManager(this.provider);\r\n this.clientFactory = new WalletConnectClientFactory(this.provider, this.resolvedConfig);\r\n\r\n this.appKit = createAppKit({\r\n projectId: this.config.projectId,\r\n universalProvider: this.provider,\r\n manualWCControl: true,\r\n networks: this.buildAppKitNetworks(),\r\n customRpcUrls: this.buildCustomRpcUrls(),\r\n });\r\n\r\n this.registerProviderEvents();\r\n this.registerModalCloseHandler();\r\n }\r\n\r\n async connect(chains?: SupportedWalletChains<\"wallet-connect\"> | readonly Caip2[]): Promise<void> {\r\n if (this.connectionState === \"connecting\") {\r\n throw new WalletConnectError(\"COMMON_CONNECTION_IN_PROGRESS\");\r\n }\r\n if (!chains?.length) {\r\n throw new WalletConnectError(\"COMMON_CHAIN_NOT_CONFIGURED\");\r\n }\r\n\r\n await this.initialize();\r\n this.events.startConnecting();\r\n\r\n await this.appKit.open();\r\n\r\n this.getProvider()\r\n .connect({ optionalNamespaces: this.sessionManager.buildNamespaces([...chains]) })\r\n .then((session) => this.onSessionCreated(session))\r\n .catch((error) => this.onConnectionFailed(error));\r\n }\r\n\r\n async disconnect(): Promise<void> {\r\n this.events.startDisconnecting();\r\n sessionStorage.clear();\r\n\r\n if (this.initialized && this.provider?.session) {\r\n await this.provider.disconnect();\r\n }\r\n\r\n this.client = null;\r\n this.events.disconnected();\r\n }\r\n\r\n async restoreConnection(): Promise<void> {\r\n if (this.connectionState !== \"disconnected\") return;\r\n\r\n await this.initialize();\r\n if (!this.provider?.session) return;\r\n if (this.connectionState !== \"disconnected\") return;\r\n\r\n const parsedSession = this.sessionManager.parseSession();\r\n const resolved = this.sessionManager.resolveSessionWithStorage(parsedSession);\r\n if (!resolved.selectedAddress) return;\r\n\r\n this.client = this.clientFactory.create(resolved.selectedAddress.caip2);\r\n this.events.reconnected({\r\n address: resolved.selectedAddress.address,\r\n addresses: resolved.availableAddresses.map((address) => address.address),\r\n caip2: resolved.selectedAddress.caip2,\r\n });\r\n }\r\n\r\n async switchChain(caip2: SupportedWalletChains<\"wallet-connect\">[number]): Promise<void> {\r\n if (!this.provider.session) {\r\n throw new WalletConnectError(\"WALLET_CONNECT_SESSION_NOT_FOUND\");\r\n }\r\n\r\n const parsedSession = this.sessionManager.parseSession();\r\n const targetAddress = parsedSession.availableAddresses.find((address) => address.caip2 === caip2);\r\n if (!targetAddress) return;\r\n\r\n this.sessionManager.saveLastConnection(targetAddress);\r\n this.client = this.clientFactory.create(caip2);\r\n this.events.chainChanged(caip2);\r\n }\r\n\r\n getClient(): ChainClient {\r\n if (!this.client) throw new WalletConnectError(\"COMMON_NOT_CONNECTED\");\r\n return this.client;\r\n }\r\n\r\n getProvider(): WalletConnectProvider {\r\n return this.provider;\r\n }\r\n\r\n private registerProviderEvents(): void {\r\n this.provider.on(\"display_uri\", (_uri: string) => {});\r\n this.provider.on(\"disconnect\", (error: ProviderRpcError) => this.onDisconnect(error));\r\n this.provider.on(\"session_delete\", () => this.onDisconnect());\r\n this.provider.on(\"chainChanged\", (chainId: string) => this.onChainChanged(chainId));\r\n this.provider.on(\"accountsChanged\", (accounts: string[]) => this.onAccountsChanged(accounts));\r\n this.provider.client?.on(\"proposal_expire\", (event: { id: number }) => this.onProposalExpire(event));\r\n }\r\n\r\n private registerModalCloseHandler(): void {\r\n this.appKit.subscribeState((state) => {\r\n if (!state.open && this.connectionState === \"connecting\") {\r\n this.events.disconnected();\r\n }\r\n });\r\n }\r\n\r\n private onSessionCreated(session: SessionTypes.Struct | undefined): void {\r\n void this.appKit.close();\r\n\r\n if (!session) {\r\n this.events.disconnected();\r\n this.emitError(new WalletConnectError(\"WALLET_CONNECT_PAIRING_FAILED\"));\r\n return;\r\n }\r\n\r\n const parsedSession = this.sessionManager.parseSession();\r\n if (!parsedSession.selectedAddress) {\r\n this.events.disconnected();\r\n this.emitError(new WalletConnectError(\"COMMON_NO_ACCOUNTS\"));\r\n return;\r\n }\r\n\r\n this.client = this.clientFactory.create(parsedSession.selectedAddress.caip2);\r\n this.sessionManager.saveLastConnection(parsedSession.selectedAddress);\r\n\r\n this.events.connected({\r\n address: parsedSession.selectedAddress.address,\r\n addresses: parsedSession.availableAddresses.map((address) => address.address),\r\n caip2: parsedSession.selectedAddress.caip2,\r\n });\r\n }\r\n\r\n private onConnectionFailed(error: unknown): void {\r\n void this.appKit.close();\r\n\r\n if (this.connectionState === \"connecting\") {\r\n this.events.disconnected();\r\n }\r\n\r\n if (error instanceof Error && error.message.includes(\"Proposal expired\")) return;\r\n\r\n this.emitError(error);\r\n }\r\n\r\n private onProposalExpire(event: { id: number }): void {\r\n console.log(\"[WC] proposal_expire\", event);\r\n if (this.connectionState !== \"connecting\") return;\r\n\r\n void this.appKit.close();\r\n this.events.disconnected();\r\n }\r\n\r\n private onAccountsChanged(accounts: string[]): void {\r\n if (this.connectionState !== \"connected\") return;\r\n\r\n if (!accounts.length) {\r\n this.events.disconnected();\r\n return;\r\n }\r\n\r\n const parsedSession = this.sessionManager.parseSession();\r\n const newAddress = accounts[0];\r\n const matched = parsedSession.availableAddresses.find((address) => address.address === newAddress);\r\n if (!matched) return;\r\n\r\n this.events.addressChanged({\r\n address: newAddress,\r\n addresses: parsedSession.availableAddresses.map((address) => address.address),\r\n caip2: matched.caip2,\r\n });\r\n }\r\n\r\n private onChainChanged(chainId: string): void {\r\n const caip2 = chainId as Caip2;\r\n if (this.storedCaip2 === caip2) return;\r\n\r\n this.client = this.clientFactory.create(caip2);\r\n this.events.chainChanged(caip2);\r\n }\r\n\r\n private onDisconnect(error?: ProviderRpcError): void {\r\n if (error) console.warn(\"[WC] disconnect error:\", error);\r\n this.client = null;\r\n this.events.disconnected();\r\n }\r\n\r\n private buildAppKitNetworks(): [CaipNetwork, ...CaipNetwork[]] {\r\n const networks: CaipNetwork[] = [];\r\n\r\n for (const [caip2, chain] of objectEntries(this.resolvedConfig.chains)) {\r\n if (!chain.isEvm) continue;\r\n\r\n const { reference } = parseCaip2(caip2);\r\n if (!reference) continue;\r\n\r\n networks.push({\r\n id: Number(reference),\r\n name: chain.name,\r\n chainNamespace: \"eip155\",\r\n caipNetworkId: `eip155:${reference}`,\r\n nativeCurrency: chain.nativeCurrency,\r\n rpcUrls: {\r\n default: { http: [...chain.rpcUrls] },\r\n },\r\n } satisfies CaipNetwork);\r\n }\r\n\r\n const [first, ...rest] = networks;\r\n if (!first) throw new WalletConnectError(\"COMMON_CHAIN_NOT_CONFIGURED\");\r\n return [first, ...rest];\r\n }\r\n\r\n private buildCustomRpcUrls(): Record<string, Array<{ url: string }>> {\r\n const rpcUrls: Record<string, Array<{ url: string }>> = {};\r\n\r\n for (const [caip2, chain] of objectEntries(this.resolvedConfig.chains)) {\r\n rpcUrls[caip2] = [{ url: chain.rpcUrls[0] }];\r\n }\r\n\r\n return rpcUrls;\r\n }\r\n\r\n private get connectionState() {\r\n return this.store.getSnapshot().context.connectionState;\r\n }\r\n\r\n private get storedCaip2() {\r\n return this.store.getSnapshot().context.caip2;\r\n }\r\n}\r\n","import type { XRPlCaip2 } from \"@chains/chain.types\";\r\nimport type { XrpClient } from \"@clients/xrp/xrp-client\";\r\nimport type { ResolvedWalletConfig } from \"@config/config-types\";\r\nimport type { SubmittableTransaction } from \"xrpl\";\r\nimport type {\r\n XamanConfig,\r\n XamanNetworkKey,\r\n XamanPayloadResult,\r\n XamanSendTxOptions,\r\n XummPayloadBody,\r\n} from \"./xaman-types\";\r\n\r\nimport { parseCaip2 } from \"@chains/chain.utils\";\r\nimport { XrplClient } from \"@clients/xrp/xrpl-client\";\r\nimport { Xumm } from \"xumm\";\r\nimport { XamanError } from \"./xaman-error\";\r\n\r\nexport class XamanClient extends Xumm implements XrpClient<XamanSendTxOptions> {\r\n private static readonly NETWORK_KEYS: Record<string, XamanNetworkKey> = {\r\n \"0\": \"MAINNET\",\r\n \"1\": \"TESTNET\",\r\n };\r\n\r\n private readonly resolvedConfig: ResolvedWalletConfig;\r\n\r\n constructor(config: XamanConfig, resolvedConfig: ResolvedWalletConfig) {\r\n super(config.apiKey);\r\n this.resolvedConfig = resolvedConfig;\r\n }\r\n\r\n async sendTx(tx: SubmittableTransaction, sendTxOptions?: XamanSendTxOptions): Promise<string> {\r\n if (!this.payload) {\r\n throw new XamanError(\"XAMAN_SDK_NOT_READY\");\r\n }\r\n\r\n const caip2 = await this.getCaip2();\r\n const { reference } = parseCaip2(caip2);\r\n\r\n const networkKey = XamanClient.NETWORK_KEYS[reference];\r\n\r\n const payload = {\r\n txjson: { ...tx },\r\n options: { ...sendTxOptions?.options },\r\n custom_meta: sendTxOptions?.custom_meta,\r\n user_token: sendTxOptions?.user_token,\r\n } as XummPayloadBody;\r\n\r\n if (networkKey) {\r\n payload.options = { force_network: networkKey, ...payload.options };\r\n }\r\n\r\n const subscription = await this.payload.createAndSubscribe(payload, (event) =>\r\n \"signed\" in event.data ? event : undefined\r\n );\r\n\r\n if (!subscription?.created) {\r\n throw new XamanError(\"XAMAN_SDK_NOT_READY\");\r\n }\r\n\r\n const result = (await subscription.resolved) as XamanPayloadResult;\r\n const txid = result?.payload?.response?.txid;\r\n\r\n if (!txid) {\r\n throw new XamanError(\"XAMAN_SIGN_REJECTED\");\r\n }\r\n\r\n return txid;\r\n }\r\n\r\n async getCaip2(): Promise<XRPlCaip2> {\r\n const networkId = (await this.user.networkId) as number;\r\n return this.toCaip2Network(networkId);\r\n }\r\n\r\n async onDestroy(): Promise<void> {\r\n await super.logout();\r\n }\r\n\r\n async getBalance(address: string): Promise<number> {\r\n const simpleClient = await this.getSimpleClient();\r\n return simpleClient.getBalance(address);\r\n }\r\n\r\n async requiresDestinationTag(address: string): Promise<boolean> {\r\n const simpleClient = await this.getSimpleClient();\r\n return simpleClient.requiresDestinationTag(address);\r\n }\r\n\r\n async isDepositAuthEnabled(address: string): Promise<boolean> {\r\n const simpleClient = await this.getSimpleClient();\r\n return simpleClient.isDepositAuthEnabled(address);\r\n }\r\n\r\n async getSimpleClient(): Promise<XrplClient> {\r\n const caip2 = await this.getCaip2();\r\n const chain = this.resolvedConfig.getXrplChain(caip2);\r\n return new XrplClient(chain);\r\n }\r\n\r\n public toCaip2Network(networkId: number | string): XRPlCaip2 {\r\n return `xrpl:${networkId}` as XRPlCaip2;\r\n }\r\n}\r\n","import type { Caip2 } from \"@chains/chain.types\";\r\nimport type { XamanConnectorConfig, XamanProvider } from \"@connectors/connector-types\";\r\nimport type { WalletStore } from \"@stores/wallet-store/wallet-store\";\r\nimport type { SupportedWalletChains } from \"@wallets/wallet.types\";\r\n\r\nimport { BaseConnector } from \"@connectors/base-connector\";\r\nimport { XamanError } from \"./xaman-error\";\r\nimport { XamanClient } from \"./xaman-xrpl-client\";\r\n\r\nexport class XamanConnector extends BaseConnector<\"xaman\", XamanClient, XamanProvider> {\r\n protected override readonly config: XamanConnectorConfig;\r\n\r\n declare private client: XamanClient;\r\n\r\n constructor(store: WalletStore, config: XamanConnectorConfig) {\r\n super(store, config);\r\n this.config = config;\r\n }\r\n\r\n protected async onInitialize(): Promise<void> {\r\n this.client = new XamanClient({ apiKey: this.config.apiKey }, this.resolvedConfig);\r\n\r\n this.client.on(\"ready\", () => this.onReady());\r\n this.client.on(\"success\", () => {\r\n void this.onSuccess().catch((error) => this.emitError(error));\r\n });\r\n this.client.on(\"error\", (error) => this.onError(error));\r\n this.client.on(\"logout\", () => this.onLogout());\r\n this.client.on(\"loggedout\", () => this.onLogout());\r\n this.client.on(\"networkswitch\", (event) => event.network && this.onNetworkSwitch(event.network));\r\n }\r\n\r\n /**\r\n * Xaman doesn't support session restoration — authorize() is fire-and-forget,\r\n * with state changes arriving via SDK events (ready, success, error, logout).\r\n */\r\n async restoreConnection(): Promise<void> {}\r\n\r\n async connect(_chains?: SupportedWalletChains<\"xaman\"> | readonly Caip2[]): Promise<void> {\r\n if (this.connectionState === \"connecting\") {\r\n throw new XamanError(\"COMMON_CONNECTION_IN_PROGRESS\");\r\n }\r\n\r\n await this.initialize();\r\n this.events.startConnecting();\r\n\r\n // TODO: Xumm SDK authorize() resolves with Error (not rejects) or hangs when\r\n // the popup is closed (e.g. \"Invalid client/redirect URL\"). None of the SDK\r\n // events fire either, leaving the connector stuck in \"connecting\" state.\r\n // Need to find a way to detect popup closure (polling, timeout, etc.).\r\n this.getClient()\r\n .authorize()\r\n .catch((error: unknown) => this.emitError(error));\r\n }\r\n\r\n async disconnect(): Promise<void> {\r\n this.events.startDisconnecting();\r\n\r\n if (this.initialized) {\r\n await this.client.logout().catch((error) => {\r\n throw new XamanError(\"COMMON_CONNECTION_FAILED\", error);\r\n });\r\n }\r\n\r\n this.resetInitialization();\r\n this.events.disconnected();\r\n }\r\n\r\n override async switchChain(_caip2: SupportedWalletChains<\"xaman\">[number]): Promise<void> {\r\n throw new XamanError(\"COMMON_FEATURE_NOT_SUPPORTED\");\r\n }\r\n\r\n getClient(): XamanClient {\r\n return this.client;\r\n }\r\n\r\n getProvider(): XamanProvider {\r\n return this.client;\r\n }\r\n\r\n private onReady(): void {\r\n if (this.connectionState === \"connected\" && !this.isLoggedIn()) {\r\n this.events.disconnected();\r\n }\r\n }\r\n\r\n private async onSuccess(): Promise<void> {\r\n const client = this.getClient();\r\n const address = await client.user.account;\r\n const networkId = await client.user.networkId;\r\n\r\n if (!networkId) throw new XamanError(\"COMMON_PROVIDER_ERROR\");\r\n if (!address) throw new XamanError(\"COMMON_NO_ACCOUNTS\");\r\n\r\n const caip2 = await client.getCaip2();\r\n const isReconnect = this.connectionState !== \"connecting\";\r\n\r\n const eventData = { address, addresses: [address], caip2 };\r\n isReconnect ? this.events.reconnected(eventData) : this.events.connected(eventData);\r\n }\r\n\r\n private onError(error: unknown): void {\r\n if (this.connectionState === \"connecting\") {\r\n this.events.disconnected();\r\n }\r\n this.emitError(error);\r\n }\r\n\r\n private onLogout(): void {\r\n if (this.connectionState === \"connected\") {\r\n this.events.disconnected();\r\n }\r\n }\r\n\r\n private onNetworkSwitch(network: string): void {\r\n const networkId = network === \"1\" ? 1 : 0;\r\n const caip2 = this.getClient().toCaip2Network(networkId);\r\n\r\n if (this.storedCaip2 !== caip2) {\r\n this.events.chainChanged(caip2);\r\n }\r\n }\r\n\r\n private isLoggedIn(): boolean {\r\n return this.initialized ? !!this.client.runtime.xapp : false;\r\n }\r\n\r\n private get connectionState() {\r\n return this.store.getSnapshot().context.connectionState;\r\n }\r\n\r\n private get storedCaip2() {\r\n return this.store.getSnapshot().context.caip2;\r\n }\r\n}\r\n","import type {\r\n ResolvedWalletConfig,\r\n WalletConnectWalletOptions,\r\n WalletMetadata,\r\n WalletOptionsMap,\r\n XamanWalletOptions,\r\n} from \"@config/config-types\";\r\nimport type { WalletStore } from \"@stores/wallet-store/wallet-store\";\r\nimport type { WalletType } from \"@wallets/wallet.types\";\r\nimport type { Connector } from \"./connector-types\";\r\n\r\nimport { DcentConnector } from \"./dcent/dcent-connector\";\r\nimport { LedgerConnector } from \"./ledger/ledger-connector\";\r\nimport { MetaMaskConnector } from \"./metamask/metamask-connector\";\r\nimport { WalletConnectConnector } from \"./wallet-connect/wallet-connect-connector\";\r\nimport { XamanConnector } from \"./xaman/xaman-connector\";\r\n\r\ntype AnyConnector = Connector<WalletType, unknown, unknown>;\r\n\r\nconst DEFAULT_METADATA: WalletMetadata = {\r\n name: \"App\",\r\n url: typeof window !== \"undefined\" ? window.location.origin : \"https://localhost\",\r\n};\r\n\r\nexport interface CreateConnectorOptions<W extends WalletType> {\r\n walletType: W;\r\n store: WalletStore;\r\n resolvedConfig: ResolvedWalletConfig;\r\n walletOptions: WalletOptionsMap[W];\r\n}\r\n\r\nexport class ConnectorFactory {\r\n static create<W extends WalletType>(options: CreateConnectorOptions<W>): AnyConnector {\r\n const { walletType, store, resolvedConfig, walletOptions } = options;\r\n const metadata = walletOptions.metadata ?? DEFAULT_METADATA;\r\n\r\n switch (walletType) {\r\n case \"metamask\":\r\n return new MetaMaskConnector(store, {\r\n walletType: \"metamask\",\r\n metadata,\r\n resolvedConfig,\r\n });\r\n\r\n case \"wallet-connect\": {\r\n const wcOptions = walletOptions as WalletConnectWalletOptions;\r\n return new WalletConnectConnector(store, {\r\n walletType: \"wallet-connect\",\r\n metadata,\r\n resolvedConfig,\r\n projectId: wcOptions.projectId,\r\n });\r\n }\r\n\r\n case \"ledger\":\r\n return new LedgerConnector(store, {\r\n walletType: \"ledger\",\r\n metadata,\r\n resolvedConfig,\r\n });\r\n\r\n case \"xaman\": {\r\n const xamanOptions = walletOptions as XamanWalletOptions;\r\n return new XamanConnector(store, {\r\n walletType: \"xaman\",\r\n metadata,\r\n resolvedConfig,\r\n apiKey: xamanOptions.apiKey,\r\n });\r\n }\r\n\r\n case \"dcent\":\r\n return new DcentConnector(store, {\r\n walletType: \"dcent\",\r\n metadata,\r\n resolvedConfig,\r\n });\r\n\r\n default:\r\n throw new Error(`Unknown wallet type: ${walletType}`);\r\n }\r\n }\r\n}\r\n","import type { WalletType } from \"@wallets/wallet.types\";\r\nimport type { WalletState, WalletStore } from \"./wallet-store\";\r\nimport { objectFromEntries } from \"@utils/utils\";\r\nimport { createStore } from \"@xstate/store\";\r\n\r\nexport type AggregateWalletState<T extends WalletType = WalletType> = {\r\n wallets: Record<T, WalletState>;\r\n};\r\n\r\nexport type AggregateWalletEvents = {\r\n walletUpdated: {\r\n walletType: WalletType;\r\n context: WalletState;\r\n };\r\n};\r\n\r\ntype NoAggregateWalletEmittedEvents = Record<never, never>;\r\n\r\nexport const createAggregateWalletStore = <T extends WalletType>(stores: Map<T, WalletStore>) => {\r\n const initialWallets = objectFromEntries(\r\n Array.from(stores.entries()).map(([type, store]) => [type, store.getSnapshot().context])\r\n );\r\n\r\n return createStore<AggregateWalletState<T>, AggregateWalletEvents, NoAggregateWalletEmittedEvents>({\r\n context: { wallets: initialWallets },\r\n on: {\r\n walletUpdated: (state, { walletType, context }) => ({\r\n wallets: {\r\n ...state.wallets,\r\n [walletType]: context,\r\n },\r\n }),\r\n },\r\n });\r\n};\r\n\r\nexport type AggregateWalletStore<T extends WalletType = WalletType> = ReturnType<typeof createAggregateWalletStore<T>>;\r\n","import type { Caip2 } from \"@chains/chain.types\";\r\nimport type { WalletType } from \"@wallets/wallet.types\";\r\nimport type { ExtractEvents } from \"@xstate/store\";\r\nimport { createStore } from \"@xstate/store\";\r\n\r\nexport type WalletConnectionState = \"disconnected\" | \"connecting\" | \"connected\" | \"disconnecting\" | \"error\";\r\nexport interface WalletErrorState {\r\n code: number | string;\r\n message: string;\r\n}\r\nexport type WalletAddressState<T extends WalletType = WalletType> = Extract<\r\n {\r\n [K in WalletType]: { type: K; address: string } & { isEvm: boolean; caip2: Caip2 };\r\n }[WalletType],\r\n { type: T }\r\n>;\r\n\r\nexport interface WalletState {\r\n connectionState: WalletConnectionState;\r\n activeAddress: string | undefined;\r\n availableAddresses: Array<WalletAddressState>;\r\n caip2: Caip2 | undefined;\r\n error: WalletErrorState | undefined;\r\n}\r\ntype WalletStoreEvents = {\r\n startConnecting: Record<never, never>;\r\n connectionEstablished: {\r\n activeAddress: string;\r\n availableAddresses: Array<WalletAddressState>;\r\n caip2: Caip2;\r\n };\r\n connectionRestored: {\r\n activeAddress: string;\r\n availableAddresses: Array<WalletAddressState>;\r\n caip2: Caip2;\r\n };\r\n error: {\r\n error: WalletErrorState;\r\n };\r\n startDisconnecting: Record<never, never>;\r\n disconnected: Record<never, never>;\r\n chainChanged: {\r\n caip2: Caip2;\r\n };\r\n addressChanged: {\r\n activeAddress: string;\r\n availableAddresses: Array<WalletAddressState>;\r\n };\r\n};\r\n\r\nexport type WalletStoreEmittedEvents = {\r\n walletConnected: {\r\n activeAddress: string;\r\n availableAddresses: Array<WalletAddressState>;\r\n caip2: Caip2;\r\n walletType: WalletType;\r\n isReconnect: boolean;\r\n };\r\n walletDisconnected: {\r\n walletType: WalletType;\r\n };\r\n walletError: {\r\n error: WalletErrorState;\r\n walletType: WalletType;\r\n };\r\n walletChainChanged: {\r\n caip2: Caip2;\r\n walletType: WalletType;\r\n };\r\n walletAddressChanged: {\r\n activeAddress: string;\r\n walletType: WalletType;\r\n };\r\n};\r\nexport type WalletEmittedEvent = ExtractEvents<WalletStoreEmittedEvents>;\r\n\r\nconst INITIAL_STATE: WalletState = {\r\n connectionState: \"disconnected\",\r\n activeAddress: undefined,\r\n availableAddresses: [],\r\n caip2: undefined,\r\n error: undefined,\r\n};\r\n\r\nexport const createWalletStore = (walletType: WalletType) => {\r\n return createStore<WalletState, WalletStoreEvents, WalletStoreEmittedEvents>({\r\n context: INITIAL_STATE,\r\n on: {\r\n startConnecting: (context) => ({\r\n ...context,\r\n connectionState: \"connecting\",\r\n }),\r\n connectionEstablished: (context, { activeAddress, availableAddresses, caip2 }, enqueue) => {\r\n enqueue.emit.walletConnected({\r\n activeAddress,\r\n availableAddresses,\r\n caip2,\r\n walletType,\r\n isReconnect: false,\r\n });\r\n\r\n return {\r\n ...context,\r\n connectionState: \"connected\",\r\n activeAddress,\r\n availableAddresses,\r\n caip2,\r\n error: undefined,\r\n };\r\n },\r\n connectionRestored: (context, { activeAddress, availableAddresses, caip2 }, enqueue) => {\r\n enqueue.emit.walletConnected({\r\n activeAddress,\r\n availableAddresses,\r\n caip2,\r\n walletType,\r\n isReconnect: true,\r\n });\r\n\r\n return {\r\n ...context,\r\n connectionState: \"connected\",\r\n activeAddress,\r\n availableAddresses,\r\n caip2,\r\n error: undefined,\r\n };\r\n },\r\n error: (context, { error }, enqueue) => {\r\n enqueue.emit.walletError({\r\n error,\r\n walletType,\r\n });\r\n\r\n return {\r\n ...context,\r\n connectionState: \"error\",\r\n error,\r\n };\r\n },\r\n startDisconnecting: (context) => ({\r\n ...context,\r\n connectionState: \"disconnecting\",\r\n }),\r\n disconnected: (context, _, enqueue) => {\r\n enqueue.emit.walletDisconnected({\r\n walletType,\r\n });\r\n\r\n return {\r\n ...context,\r\n connectionState: \"disconnected\",\r\n activeAddress: undefined,\r\n availableAddresses: [],\r\n caip2: undefined,\r\n error: undefined,\r\n };\r\n },\r\n chainChanged: (context, { caip2 }, enqueue) => {\r\n enqueue.emit.walletChainChanged({\r\n caip2,\r\n walletType,\r\n });\r\n\r\n return {\r\n ...context,\r\n caip2,\r\n };\r\n },\r\n addressChanged: (context, { activeAddress, availableAddresses }, enqueue) => {\r\n enqueue.emit.walletAddressChanged({\r\n activeAddress,\r\n walletType,\r\n });\r\n\r\n return {\r\n ...context,\r\n availableAddresses,\r\n activeAddress,\r\n };\r\n },\r\n },\r\n });\r\n};\r\nexport type WalletStore = ReturnType<typeof createWalletStore>;\r\n","import type { Caip2 } from \"@chains/chain.types\";\r\nimport type { MultiChainEvents, MultiChainOptions } from \"@config/config-types\";\r\nimport type { ConcreteConnector, Connector, ConnectWalletArgs } from \"@connectors/connector-types\";\r\nimport type { createBrowserInspector } from \"@statelyai/inspect\";\r\nimport type { AggregateWalletStore } from \"@stores/wallet-store/aggregate-wallet-store\";\r\nimport type { WalletEmittedEvent, WalletStore } from \"@stores/wallet-store/wallet-store\";\r\nimport type { WalletType } from \"@wallets/wallet.types\";\r\nimport type { Subscription } from \"@xstate/store\";\r\n\r\nimport { ConfigResolver } from \"@config/config-resolver\";\r\nimport { ConnectorFactory } from \"@connectors/connector-factory\";\r\nimport { createAggregateWalletStore } from \"@stores/wallet-store/aggregate-wallet-store\";\r\nimport { createWalletStore } from \"@stores/wallet-store/wallet-store\";\r\nimport { objectEntries, objectValues } from \"@utils/utils\";\r\n\r\ntype AnyConnector = Connector<WalletType, unknown, unknown>;\r\n\r\nexport class MultiChain {\r\n private readonly stores: Map<WalletType, WalletStore> = new Map();\r\n private readonly connectors: Map<WalletType, AnyConnector> = new Map();\r\n private readonly aggregateStore: AggregateWalletStore;\r\n private readonly configResolver: ConfigResolver;\r\n private readonly events: MultiChainEvents;\r\n private subscriptions: Subscription[] = [];\r\n private mounted = false;\r\n\r\n constructor(options: MultiChainOptions, inspector?: ReturnType<typeof createBrowserInspector>) {\r\n this.configResolver = new ConfigResolver(options);\r\n this.events = options.events ?? {};\r\n\r\n for (const [walletType, walletOptions] of objectEntries(options.wallets)) {\r\n if (!walletOptions) continue;\r\n\r\n const wType = walletType;\r\n const store = createWalletStore(wType);\r\n this.stores.set(wType, store);\r\n\r\n if (inspector) {\r\n store.inspect(inspector.inspect);\r\n }\r\n\r\n const resolvedConfig = this.configResolver.resolveForWallet(wType);\r\n const connector = ConnectorFactory.create({\r\n walletType: wType,\r\n store,\r\n resolvedConfig,\r\n walletOptions,\r\n });\r\n this.connectors.set(wType, connector);\r\n\r\n this.registerGlobalListeners(wType);\r\n }\r\n\r\n this.aggregateStore = createAggregateWalletStore(this.stores);\r\n\r\n for (const [walletType, store] of this.stores) {\r\n this.registerAggregateSync(walletType, store);\r\n }\r\n\r\n if (inspector) {\r\n this.aggregateStore.inspect(inspector.inspect);\r\n }\r\n }\r\n\r\n async mount(): Promise<void> {\r\n if (this.mounted) return;\r\n this.mounted = true;\r\n\r\n const results = await Promise.allSettled(\r\n Array.from(this.connectors.entries()).map(async ([walletType, connector]) => {\r\n await connector.initialize();\r\n await connector.restoreConnection();\r\n return walletType;\r\n })\r\n );\r\n\r\n for (const result of results) {\r\n if (result.status === \"rejected\") {\r\n console.warn(\"[MultiChain] Connector failed to mount:\", result.reason);\r\n }\r\n }\r\n }\r\n\r\n async disconnect(walletType: WalletType): Promise<void> {\r\n const connector = this.connectors.get(walletType);\r\n if (!connector) {\r\n throw new Error(`Wallet \"${walletType}\" is not configured`);\r\n }\r\n await connector.disconnect();\r\n }\r\n\r\n async disconnectAll(): Promise<void> {\r\n const disconnectPromises = Array.from(this.connectors.values()).map(async (connector) => connector.disconnect());\r\n await Promise.all(disconnectPromises);\r\n }\r\n\r\n /**\r\n * Connect a wallet with type-safe discriminated union arguments.\r\n *\r\n * Each wallet type has its own connection signature:\r\n * - wallet-connect: { wallet: \"wallet-connect\", chains: [...] }\r\n * - metamask: { wallet: \"metamask\", chain: \"eip155:...\" }\r\n * - ledger: { wallet: \"ledger\", chain: \"...\", options?: {...} }\r\n * - xaman: { wallet: \"xaman\" }\r\n * - dcent: { wallet: \"dcent\" }\r\n */\r\n async connect(args: ConnectWalletArgs): Promise<void> {\r\n switch (args.wallet) {\r\n case \"wallet-connect\": {\r\n const connector = this.getConnector(\"wallet-connect\");\r\n return connector.connect(args.chains);\r\n }\r\n case \"metamask\": {\r\n const connector = this.getConnector(\"metamask\");\r\n return connector.connect(args.chain);\r\n }\r\n case \"ledger\": {\r\n const connector = this.getConnector(\"ledger\");\r\n return connector.connect(args.chain, args.options);\r\n }\r\n case \"xaman\": {\r\n const connector = this.getConnector(\"xaman\");\r\n return connector.connect();\r\n }\r\n case \"dcent\": {\r\n const connector = this.getConnector(\"dcent\");\r\n return connector.connect();\r\n }\r\n }\r\n }\r\n\r\n getAggregateStore(): AggregateWalletStore {\r\n return this.aggregateStore;\r\n }\r\n\r\n getWalletTypes(): WalletType[] {\r\n return Array.from(this.stores.keys());\r\n }\r\n\r\n getConnector<W extends WalletType>(walletType: W): ConcreteConnector<W> {\r\n const connector = this.connectors.get(walletType);\r\n if (!connector) {\r\n throw new Error(`Wallet \"${walletType}\" is not configured`);\r\n }\r\n return connector as ConcreteConnector<W>;\r\n }\r\n\r\n onWalletEvent<K extends WalletEmittedEvent[\"type\"]>(\r\n walletType: WalletType,\r\n eventType: K,\r\n callback: (event: WalletEmittedEvent & { type: K }) => void\r\n ): Subscription | undefined {\r\n const store = this.stores.get(walletType);\r\n if (!store) return undefined;\r\n return store.on(eventType, callback as (event: WalletEmittedEvent) => void);\r\n }\r\n\r\n getConfigResolver(): ConfigResolver {\r\n return this.configResolver;\r\n }\r\n\r\n /** Check if any wallet is currently connected to a specific chain. */\r\n isConnectedByCaip2(caip2: Caip2): boolean {\r\n const wallets = this.aggregateStore.getSnapshot().context.wallets;\r\n return objectValues(wallets).some((state) => state.connectionState === \"connected\" && state.caip2 === caip2);\r\n }\r\n\r\n private registerGlobalListeners(walletType: WalletType): void {\r\n const store = this.stores.get(walletType);\r\n if (!store) return;\r\n\r\n this.subscriptions.push(\r\n store.on(\"walletConnected\", (event) => {\r\n this.events.onConnect?.({\r\n walletType,\r\n caip2: event.caip2,\r\n address: event.activeAddress,\r\n availableAddresses: event.availableAddresses,\r\n isReconnect: event.isReconnect,\r\n });\r\n })\r\n );\r\n\r\n this.subscriptions.push(\r\n store.on(\"walletDisconnected\", () => {\r\n this.events.onDisconnect?.({ walletType });\r\n })\r\n );\r\n\r\n this.subscriptions.push(\r\n store.on(\"walletError\", (event) => {\r\n this.events.onError?.({\r\n walletType,\r\n error: new Error(event.error.message),\r\n });\r\n })\r\n );\r\n\r\n this.subscriptions.push(\r\n store.on(\"walletChainChanged\", (event) => {\r\n this.events.onChainChanged?.({\r\n walletType,\r\n caip2: event.caip2,\r\n });\r\n })\r\n );\r\n }\r\n\r\n private registerAggregateSync(walletType: WalletType, store: WalletStore): void {\r\n const sync = () => {\r\n this.aggregateStore.send({\r\n type: \"walletUpdated\",\r\n walletType,\r\n context: store.getSnapshot().context,\r\n });\r\n };\r\n\r\n sync();\r\n this.subscriptions.push(store.subscribe(sync));\r\n }\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;AAAA,IAAaA,YAAb,MAAuB;CACrB,OAAOC,QAAQC,OAAgC;AAC7C,SAAOA,iBAAiBC;;CAG1B,OAAOC,SAASF,OAAiC;AAC/C,SAAO,OAAOA,UAAU,YAAYA,UAAU;;CAGhD,OAAOG,SAASH,OAAiC;AAC/C,SAAO,OAAOA,UAAU;;;;;;;;;;;ACJ5B,SAAgBe,eAAeC,SAAiBC,eAAe,GAAGC,eAAe,GAAW;CAC1F,MAAMC,YAAYF,eAAeC,eAAe;AAChD,KAAIF,QAAQI,UAAUD,UACpB,QAAOH;AAET,QAAO,GAAGA,QAAQK,MAAM,GAAGJ,aAAa,CAAA,KAAMD,QAAQK,MAAM,CAACH,aAAa;;;AAI5E,SAAgBI,WAA6BC,KAAwB;AACnE,QAAOG,OAAOC,KAAKJ,IAAI;;;AAIzB,SAAgBK,aAA+BL,KAA2B;AACxE,QAAOG,OAAOG,OAAON,IAAI;;;AAI3B,SAAgBO,cAAgCP,KAAsC;AACpF,QAAOG,OAAOK,QAAQR,IAAI;;;AAI5B,SAAgBS,kBAA4CD,SAA+C;AACzG,QAAOL,OAAOW,YAAYN,QAAQ;;AAGpC,SAASO,cAAcC,OAAyB;AAC9C,QAAO,OAAOA,UAAU,YAAYA,UAAU,QAAQ,CAACd,MAAMe,QAAQD,MAAM,IAAIb,OAAOC,KAAKY,MAAM,CAACnB,WAAW;;;AAI/G,SAAgBqB,kBAAoClB,KAAW;AAC7D,QAAOS,kBAAkBF,cAAcP,IAAI,CAACmB,QAAQ,GAAGC,OAAO,CAACL,cAAcK,EAAE,CAAC,CAAC;;;;ACxCnF,MAAaC,mBAAmB;CAC9BC,QAAQ;CACRC,MAAM;CACNC,QAAQ;CACT;AAED,MAAaE,QAAQ;EAClBL,iBAAiBC,SAAS;EACzB,KAAK;EACL,YAAY;EACZ,MAAM;EACN,MAAM;EACN,OAAO;EACP,MAAM;EACP;EACAD,iBAAiBE,OAAO;EACvB,KAAK;EACL,KAAK;EACN;EACAF,iBAAiBG,SAAS,EACzB,qCAAqC,oBACvC;CACD;;;ACDD,IAAaqB,cAAb,MAAyB;CACvB,OAAOC,WAAWC,OAAmC;AACnD,SAAON,UAAUO,SAASD,MAAM,IAAIE,OAAOC,OAAOH,OAAO,OAAO;;CAElE,OAAOI,WAAWC,OAAoC;AACpD,SAAOA,MAAMC,WAAW,UAAU;;CAGpC,OAAOC,YAAYF,OAAkC;AACnD,SAAOA,MAAMC,WAAW,QAAQ;;CAGlC,OAAOE,WAAWC,OAAqC;AACrD,SAAOA,MAAMC;;CAGf,OAAOC,YAAYF,OAAsE;AACvF,SAAOA,MAAMJ,MAAMC,WAAW,QAAQ;;;yBAGfO,cAAqDA,cAAc;;;AAG9F,SAASC,2BAA2BC,WAAmB;CACrD,MAAMC,oBAAoBC,OAAOC,SAASH,UAAU;AACpD,QAAO;EACLI,IAAIH,kBAAkBI,UAAU;EAChCC,KAAK,KAAKL,kBAAkBI,SAAS,GAAG;EACzC;;AAGH,SAASE,aAAuCT,WAAcE,WAA8B;AAC1F,QAAOlB,MAAMgB,WAAWE;;AAG1B,SAAgBS,WACdnB,OACoE;CACpE,MAAM,CAACQ,WAAWE,aAAaV,MAAMqB,MAAM,IAAI;AAC/C,QAAO;EAAEb;EAAWE;EAAW;;AAGjC,SAAgBY,YAAYC,SAA4E;CACtG,MAAM,CAACf,WAAWE,WAAWc,WAAWD,QAAQF,MAAM,IAAI;AAC1D,QAAO;EAAEb;EAAWE;EAAWc;EAAS;;AAO1C,SAAgBG,kBAA0DD,QAAwB;AAiBhG,QAAOnC,kBAhBSD,cAAcoC,OAAO,CAE2BI,KAAK,CAAC9B,OAAOI,WAAW;EACtF,MAAM,EAAEI,WAAWE,cAAcS,WAAWnB,MAAM;EAClD,MAAM+B,OAAOd,aAAaT,WAAWE,UAA8C;AAEnF,MAAIjB,YAAYc,eAAeC,UAAU,CACvC,QAAO,CACLR,OACA;GAAE,GAAGI;GAAOI;GAAWR;GAAO+B;GAAM1B,OAAO;GAAM2B,UAAUvB,2BAA2BC,UAAS;GAAG,CACnG;AAGH,SAAO,CAACV,OAAO;GAAE,GAAGI;GAAOI;GAAWR;GAAOK,OAAO;GAAO0B;GAAM,CAAgB;GACjF,CAEoC;;;;ACvFxC,MAAaG,cAAcD,YAAY;CACrCE,IAAI;CACJC,MAAM;CACNC,gBAAgB;EACdC,UAAU;EACVF,MAAM;EACNG,QAAQ;EACT;CACDC,SAAS,EACPC,SAAS,EAAEC,MAAM,CAAC,6CAA4C,EAAE,EACjE;CACDC,gBAAgB,EACdF,SAAS;EACPL,MAAM;EACNQ,KAAK;EACLC,QAAQ;EACV,EACD;CACDC,SAAS;CACV,CAAC;;;ACdF,SAAgBiB,oBACdE,UACkB;AAClB,QAAOA;;AAGT,MAAaE,gBAAgBJ,oBAAoB;CAC/CK,YAAYR;CACZS,QAAQ;EACN,YAAY;GACVC,SAAS;GACTC,gBAAgB;IACdC,MAAM;IACNC,QAAQ;IACRC,UAAU;IACX;GACDC,SAAS,CAAC,gCAAgC;GAC1CC,WAAW;GACXC,mBAAmB,CAAC,uBAAsB;GAC3C;EAED,mBAAmB;GACjBP,SAAS;GACTC,gBAAgB;IACdC,MAAM;IACNC,QAAQ;IACRC,UAAU;IACX;GACDE,WAAW;GACXD,SAAS,CAAC,gCAAgC;GAC1CE,mBAAmB,CAAC,+BAA8B;GACnD;EAED,aAAa;GACXP,SAAS;GACTC,gBAAgB;IACdC,MAAM;IACNC,QAAQ;IACRC,UAAU;IACX;GACDI,WAAW;GACXF,WAAW;GACXD,SAAS,CAAC,4CAA4C;GACtDE,mBAAmB,CAAC,uCAAsC;GAC3D;EAED,aAAa;GACXP,SAAS;GACTC,gBAAgB;IACdC,MAAM;IACNC,QAAQ;IACRC,UAAU;IACX;GACDC,SAAS,CAAC,6CAA6C;GACvDG,WAAW;GACXF,WAAW;GACXC,mBAAmB,CAAC,wCAAuC;GAC5D;EAED,cAAc;GACZP,SAAS;GACTC,gBAAgB;IACdC,MAAM;IACNC,QAAQ;IACRC,UAAU;IACX;GACDI,WAAW;GACXF,WAAW;GACXD,SAAS,CAAC,8CAA8C;GACxDE,mBAAmB,CAAC,yCAAwC;GAC7D;EAED,aAAa;GACXP,SAAS;GACTC,gBAAgB;IACdC,MAAM;IACNC,QAAQ;IACRC,UAAU;IACX;GACDI,WAAW;GACXF,WAAW;GACXD,SAAS,CAAC,+CAA+C;GACzDE,mBAAmB,CAAC,0CAAyC;GAC9D;EAED,UAAU;GACRP,SAAS;GACTC,gBAAgB;IACdC,MAAM;IACNC,QAAQ;IACRC,UAAU;IACX;GACDE,WAAW;GACXD,SAAS,CAAC,wBAAwB;GAClCE,mBAAmB,CAAC,sBAAqB;GAC1C;EAED,UAAU;GACRP,SAAS;GACTC,gBAAgB;IACdC,MAAM;IACNC,QAAQ;IACRC,UAAU;IACX;GACDE,WAAW;GACXD,SAAS,CAAC,sCAAsC;GAChDE,mBAAmB,CAAC,8BAA6B;GAClD;EAED,4CAA4C;GAC1CP,SAAS;GACTC,gBAAgB;IACdC,MAAM;IACNC,QAAQ;IACRC,UAAU;IACX;GACDE,WAAW;GACXD,SAAS,CAAC,2BAA2B;GACrCE,mBAAmB,CAAC,yBAAwB;GAC9C;EACD;CACDE,MAAM,EACJV,QAAQ;EACN,YAAYZ;EACZ,mBAAmBC;EACnB,aAAaH;EACb,aAAaH;EACb,cAAcI;EACd,aAAaG;EACf,EACF;CACD,CAAC;AAEF,MAAaqB,cAA2BlB,kBAAkBK,cAAcE,OAAO;AAE/E,MAAaY,YAAgC5B,WAAW2B,YAAY,CAACG,QAAQC,MAC3EvB,YAAYwB,WAAWD,EACzB,CAAC;AACD,MAAaE,YAA6BhC,aAAa0B,YAAY,CAACG,QAAQC,MAC1EvB,YAAY0B,WAAWH,EACzB,CAAC;AACD,MAAaI,WAAWC,UAAqD;AAC3E,KAAI,CAACA,MACH,QAAO;AAET,QAAOC,OAAOC,OAAOX,aAAaS,MAAM;;;;ACjJ1C,IAAaoB,iBAAb,MAAaA,eAAe;CAK1BK,YAAYC,SAA4B;AACtC,OAAKL,kBAAkB,IAAIC,IAAIN,cAAcU,QAAQC,kBAAkB,EAAE,CAAC,CAA6B;AAEvG,OAAKJ,kCAAkB,IAAID,KAAK;AAChC,OAAKE,gCAAgB,IAAIF,KAAK;AAE9B,OAAK,MAAM,CAACM,YAAYC,iBAAiBb,cAAcU,QAAQI,QAAQ,EAAE;AACvE,OAAI,CAACD,aAAc;AAEnB,QAAKL,cAAcO,IAAIH,YAAYC,aAAa;AAEhD,OAAIA,aAAaF,eACf,MAAKJ,gBAAgBQ,IACnBH,YACA,IAAIN,IAAIN,cAAca,aAAaF,eAAe,CACpD,CAAC;;;CAKPK,iBAAuCJ,YAA0C;AAC/E,SAAO,KAAKJ,cAAcU,IAAIN,WAAW;;CAG3CO,iBAAuCP,YAAwC;EAC7E,MAAMQ,iBAAiB,EAAE;AAEzB,OAAK,MAAM,CAACC,OAAOC,kBAAkBtB,cAAcG,YAAmB,CAEnEiB,gBAAwCC,SADxB,KAAKG,aAAaH,OAAOC,eAAeV,WAAW;AAItE,SAAOR,eAAesB,qBAAqBd,YAAYQ,eAAe;;CAGxE,aAAqBC,OAAcC,eAAsBV,YAA+B;EACtF,MAAMe,iBAAiB,KAAKtB,gBAAgBa,IAAIG,MAAM;EACtD,MAAMO,iBAAiB,KAAKrB,gBAAgBW,IAAIN,WAAW,EAAEM,IAAIG,MAAM;AAEvE,MAAI,CAACM,kBAAkB,CAACC,eACtB,QAAON;EAGT,IAAIO,UAAUP,cAAcO;EAC5B,IAAIC,oBAAoBR,cAAcQ;EACtC,IAAIC;EACJ,IAAIG;AAEJ,MAAIP,gBAAgB;AAClB,OAAIA,eAAeE,SAASM,QAAQ;AAClCJ,kBAAc;KAAEC,QAAQ;KAAUC,SAASX,cAAcO,QAAQ;KAAI;AACrEA,cAAUF,eAAeE;;AAE3B,OAAIF,eAAeG,mBAAmBK,QAAQ;AAC5CD,uBAAmB;KAAEF,QAAQ;KAAUC,SAASX,cAAcQ,kBAAkB;KAAI;AACpFA,wBAAoBH,eAAeG;;;AAIvC,MAAIF,gBAAgB;AAClB,OAAIA,eAAeC,SAASM,QAAQ;AAClCJ,kBAAc;KAAEC,QAAQ;KAAUC,SAASF,aAAaE,WAAWX,cAAcO,QAAQ;KAAI;AAC7FA,cAAUD,eAAeC;;AAE3B,OAAID,eAAeE,mBAAmBK,QAAQ;AAC5CD,uBAAmB;KACjBF,QAAQ;KACRC,SAASC,kBAAkBD,WAAWX,cAAcQ,kBAAkB;KACvE;AACDA,wBAAoBF,eAAeE;;;EAIvC,MAAMM,cAAcL,eAAeG;AAEnC,SAAOG,OAAOC,OAAO;GACnB,GAAGhB;GACHO;GACAC;GACAS,WAAWH,cAAc;IAAEP,SAASE;IAAaD,mBAAmBI;IAAkB,GAAGM,KAAAA;GAC1F,CAAC;;CAGJ,OAAed,qBACbd,YACA6B,QACyB;EACzB,MAAMC,4BAAY,IAAIpC,KAA0B;AAChD,OAAK,MAAMqC,SAASzC,aAAauC,OAAO,CACtC,KAAI1C,YAAY6C,WAAWD,MAAM,CAC/BD,WAAU3B,IAAI4B,MAAME,SAASC,KAAKH,MAAMtB,MAAqB;AAIjE,SAAOgB,OAAOC,OAAO;GACnB1B;GACA6B;GACAC;GAEAK,SAA0B1B,OAA0B;AAClD,WAAOoB,OAAOpB;;GAGhB4B,YAAY5B,OAA8B;AACxC,WAAOoB,OAAOpB;;GAGhB6B,aAAa7B,OAA6B;AACxC,WAAOoB,OAAOpB;;GAGhB8B,UAAU9B,OAAsB;AAC9B,WAAOoB,OAAOpB,OAAOQ,QAAQ;;GAG/BuB,qBAA8B;AAC5B,WAAOnD,WAAWwC,OAAO;;GAE5B,CAAC;;;;;;;;;;;;;;;;;ACpHN,MAAMa,eAAe;CACnB,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM;CAEN,MAAM;CACN,MAAM;CACN,MAAM;CAEN,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM;CAEN,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM;CAEN,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM;CAEN,MAAM;CACN,MAAM;CACP;AAQD,SAASM,kBAAuC;CAC9C,MAAMC,UAAyC,EAAE;AACjD,MAAK,MAAME,OAAOT,cAAc;EAC9B,MAAMU,MAAMC,OAAOF,IAAI;EACvB,MAAMG,OAAOZ,aAAaU;AAC1BH,UAAQM,KAAK,CAACD,MAAMF,IAAI,CAAC;;AAE3B,QAAOX,kBAAkBQ,QAAQ;;AAGnC,MAAaO,YAAiCR,iBAAiB;;;;;;AChE/D,MAAauB,gBAA8C;CACzDE,sBAAsB;CACtBC,sBAAsB;CACtBC,6BAA6B;CAC7BC,4BAA4B;CAC5BC,8BAA8B;CAC9BC,0BAA0B;CAC1BC,yBAAyB;CACzBC,oBAAoB;CACpBC,uBAAuB;CACvBC,+BAA+B;CAC/BC,mBAAmB;CAEnBC,6BAA6B;CAC7BC,0BAA0B;CAC1BC,wBAAwB;CAExBC,sBAAsB;CACtBC,qBAAqB;CACrBC,kBAAkB;CAClBC,wBAAwB;CACxBC,0BAA0B;CAC1BC,oBAAoB;CACpBC,oBAAoB;CAEpBC,gCAAgC;CAChCC,+BAA+B;CAC/BC,kCAAkC;CAClCC,yCAAyC;CAEzCC,qBAAqB;CACrBC,kBAAkB;CAClBC,qBAAqB;CACrBC,4BAA4B;CAE5BC,sBAAsB;CACtBC,qBAAqB;CACtB;;;ACrCD,IAAaK,cAAb,cAAiCC,MAAM;CAMrCK,YAAYF,YAAwBD,SAAuBE,OAAiB;EAC1E,MAAME,UAAUR,cAAcI;AAC9B,QAAMI,SAAS,EAAEF,OAAO,CAAC;AAEzB,OAAKG,OAAO;AACZ,OAAKJ,aAAaA;AAClB,OAAKD,UAAUA;AACf,OAAKD,OAAOJ,UAAUK;AACtB,OAAKE,QAAQA;AAEbI,SAAOC,eAAe,MAAMC,IAAIC,OAAOC,UAAU;;;;;AChBrD,IAAaK,kBAAb,MAAaA,wBAAwBF,YAAY;CAG/CI,YAAYC,YAAwBC,MAAoBC,OAAiB;AACvE,QAAMF,YAAYC,MAAMC,MAAM;cAHP;;CAMzB,OAAOC,UAAUC,OAAgBJ,YAAgD;AAC/E,MAAII,iBAAiBR,aAAaQ,MAAMC,QAAQC,SAAS,gBAAgB,CACvE,QAAO,IAAIT,gBAAgBG,YAAY,qBAAqBI,MAAM;AAEpE,SAAO;;;;;ACbX,IAAaK,aAAb,cAAgCD,YAAY;CAG1CG,YAAYC,MAAsBC,OAAiB;AACjD,QAAM,SAASD,MAAMC,MAAM;cAHJ;;CAMzB,OAAOC,UAAUC,QAAoC;AACnD,SAAO;;;;;ACOX,IAAae,cAAb,MAAaA,oBAAoBb,YAAY;;4BAG2B;GACpE;IAAEU,QAAQM,MAAMA,aAAab;IAAmBS,MAAM;IAAwB;GAC9E;IACEF,QAAQM,MACNA,aAAaR,yBACZQ,EAAEC,eAAeb,YAAYc,iBAAiBF,EAAEC,eAAeb,YAAYe;IAC9EP,MAAM;IACP;GACD;IACEF,QAAQM,MACNA,aAAaR,yBACZQ,EAAEC,eAAeb,YAAYgB,0BAC5BJ,EAAEC,eAAeb,YAAYiB;IACjCT,MAAM;IACP;GACD;IAAEF,QAAQM,MAAMA,aAAaV;IAA4BM,MAAM;IAAwB;GACvF;IAAEF,QAAQM,MAAMA,aAAaf;IAAoBW,MAAM;IAA4B;GACnF;IAAEF,QAAQM,MAAMA,aAAad;IAAmCU,MAAM;IAA4B;GAClG;IAAEF,QAAQM,MAAMA,aAAaX;IAAgCO,MAAM;IAA4B;GAC/F;IAAEF,QAAQM,MAAMA,aAAaT;IAAwBK,MAAM;IAAsB;GACjF;IAAEF,QAAQM,MAAMA,aAAaR;IAAsBI,MAAM;IAA0B;GACpF;;CAEDU,YAAYV,MAAuBW,OAAiB;AAClD,QAAM,UAAUX,MAAMW,MAAM;cA1BL;;;CA8BzB,OAAOC,UAAUb,OAAoC;AACnD,OAAK,MAAMc,WAAWZ,YAAYE,mBAChC,KAAIU,QAAQf,MAAMC,MAAM,CACtB,QAAO,IAAIE,YAAYY,QAAQb,MAAMD,MAAM;AAG/C,SAAO;;;;;;;;;AC9CX,IAAawB,aAAb,MAAaA,WAAW;;qBACDE,UAAuCJ,YAAYG,WAAWC,MAAM;;;sBACnEA,UAAqCJ,YAAYK,YAAYD,MAAM;;;qBACpEG,UAAwCP,YAAYM,WAAWC,MAAM;;CAE1F,OAAOC,WAAWC,OAAmC;AACnD,SAAOR,UAAUS,SAASD,MAAM,IAAI,UAAUA,SAAS,OAAQA,MAAmBE,SAAS;;CAG7F,OAAOC,mBAAmBH,OAAgBE,MAAuB;AAC/D,SAAOT,WAAWM,WAAWC,MAAM,IAAIA,MAAME,SAASA;;CAGxD,OAAOE,eAAeC,QAAmD;EACvE,MAAMG,sBAAM,IAAID,KAA0B;AAE1C,OAAK,MAAMT,SAASO,OAClB,KAAId,YAAYM,WAAWC,MAAM,CAC/BU,KAAIC,IAAIX,MAAMY,SAASC,KAAKb,MAAMH,MAAqB;AAI3D,SAAOa;;;;;AC3BX,IAAaO,gBAAb,MAAaA,sBAAsBF,YAAY;CAG7CI,YAAYC,MAAyBC,OAAiB;AACpD,QAAM,YAAYD,MAAMC,MAAM;cAHP;;CAMzB,OAAOC,UAAUC,OAAsC;AACrD,MAAIP,WAAWQ,mBAAmBD,OAAO,KAAK,CAC5C,QAAO,IAAIN,cAAc,wBAAwBM,MAAM;AAEzD,SAAO;;;;;ACXX,IAAaK,qBAAb,MAAaA,2BAA2BF,YAAY;CAGlDI,YAAYC,MAA8BC,OAAiB;AACzD,QAAM,kBAAkBD,MAAMC,MAAM;cAHb;;CAMzB,OAAOC,UAAUC,OAA2C;AAC1D,MAAIP,WAAWQ,mBAAmBD,OAAO,KAAK,CAC5C,QAAO,IAAIN,mBAAmB,wBAAwBM,MAAM;AAE9D,SAAO;;;;;ACZX,IAAaI,aAAb,cAAgCD,YAAY;CAG1CG,YAAYC,MAAsBC,OAAiB;AACjD,QAAM,SAASD,MAAMC,MAAM;cAHJ;;CAMzB,OAAOC,UAAUC,QAAoC;AACnD,SAAO;;;;;ACFX,IAAaS,oBAAb,MAA+B;CAC7B,OAAOC,cAAcC,OAAsC;AACzD,SAAOA,iBAAiBH;;CAG1B,OAAOI,KAAKD,OAAgBE,YAA4C;AACtE,MAAIF,iBAAiBH,YAAa,QAAOG;EAEzC,MAAMG,YAAYZ,gBAAgBa,UAAUJ,OAAOE,WAAW;AAC9D,MAAIC,UAAW,QAAOA;AAEtB,UAAQD,YAAR;GACE,KAAK,SACH,QAAOT,YAAYW,UAAUJ,MAAM;GACrC,KAAK,iBACH,QAAOL,mBAAmBS,UAAUJ,MAAM;GAC5C,KAAK,WACH,QAAON,cAAcU,UAAUJ,MAAM;GACvC,KAAK,QACH,QAAOJ,WAAWQ,UAAUJ,MAAM;GACpC,KAAK,QACH,QAAOR,WAAWY,UAAUJ,MAAM;GACpC,QAGE,QAAO;;;;;;AChCf,IAAaO,aAAb,MAAaA,WAAW;CACtB,OAAOC,eAAeC,OAAwB;AAC5C,MAAIH,UAAUI,SAASD,MAAM,CAC3B,QAAOA;AAGT,MAAIH,UAAUK,QAAQF,MAAM,CAC1B,QAAOA,MAAMG;AAGf,MAAIN,UAAUO,SAASJ,MAAM,IAAI,aAAaA,SAASH,UAAUI,SAASD,MAAMG,QAAQ,CACtF,QAAOH,MAAMG;AAGf,MAAI;AACF,UAAOE,KAAKC,UAAUN,MAAM;UACtB;AACN,UAAO;;;CAIX,OAAOO,YAAYP,OAAuB;AACxC,MAAIH,UAAUK,QAAQF,MAAM,CAC1B,QAAOA;AAET,SAAO,IAAIQ,MAAMV,WAAWC,eAAeC,MAAM,CAAC;;;;;ACVtD,IAAaoB,wBAAb,MAAmC;CACjCC,YACE,OACA,YACA;AAFiBC,OAAAA,QAAAA;AACAC,OAAAA,aAAAA;;CAGnBC,kBAAwB;AACtB,OAAKF,MAAMG,KAAK,EAAEC,MAAM,mBAAmB,CAAC;;CAG9CC,UAAUC,MAAgC;AACxC,OAAKN,MAAMG,KAAK;GACdC,MAAM;GACNG,eAAeD,KAAKZ;GACpBc,oBAAoB,KAAKC,iBAAiBH,KAAKX,WAAWW,KAAKV,MAAM;GACrEA,OAAOU,KAAKV;GACb,CAAC;;CAGJc,YAAYJ,MAAgC;AAC1C,OAAKN,MAAMG,KAAK;GACdC,MAAM;GACNG,eAAeD,KAAKZ;GACpBc,oBAAoB,KAAKC,iBAAiBH,KAAKX,WAAWW,KAAKV,MAAM;GACrEA,OAAOU,KAAKV;GACb,CAAC;;CAGJe,qBAA2B;AACzB,OAAKX,MAAMG,KAAK,EAAEC,MAAM,sBAAsB,CAAC;;CAGjDQ,eAAqB;AACnB,OAAKZ,MAAMG,KAAK,EAAEC,MAAM,gBAAgB,CAAC;;CAG3CS,aAAajB,OAAoB;AAC/B,OAAKI,MAAMG,KAAK;GAAEC,MAAM;GAAgBR;GAAO,CAAC;;CAGlDkB,eAAeR,MAAqC;AAClD,OAAKN,MAAMG,KAAK;GACdC,MAAM;GACNG,eAAeD,KAAKZ;GACpBc,oBAAoB,KAAKC,iBAAiBH,KAAKX,WAAWW,KAAKV,MAAK;GACrE,CAAC;;CAGJmB,MAAMA,OAA+B;AACnC,OAAKf,MAAMG,KAAK;GAAEC,MAAM;GAASW;GAAO,CAAC;;CAG3C,iBAAyBpB,WAA4CC,OAAoC;AACvG,MAAID,UAAUqB,WAAW,EAAG,QAAO,EAAE;AACrC,MAAI,OAAOrB,UAAU,OAAO,UAAU;GACpC,MAAMsB,QAAQzB,WAAW0B,WAAWtB,MAAM;AAC1C,UAAQD,UAAuBwB,KAAKzB,aAAa;IAC/CU,MAAM,KAAKH;IACXP;IACAE;IACAqB;IACD,EAAE;;AAEL,SAAOtB;;;;;ACvEX,IAAsBmC,gBAAtB,MAI8C;CAW5CY,YAAYN,OAAoBC,QAA4B;qBAHhB;sBACrB;AAGrB,OAAKD,QAAQA;AACb,OAAKC,SAASA;AACd,OAAKH,aAAaG,OAAOH;AACzB,OAAKI,iBAAiBD,OAAOC;AAC7B,OAAKH,SAAS,IAAIN,sBAAsBO,OAAOC,OAAOH,WAAW;AAEjE,OAAKS,UAAU,KAAKC,UAAU,KAAKD,QAAQE,KAAK,KAAK,CAAC;AACtD,OAAKC,aAAa,KAAKF,UAAU,KAAKE,WAAWD,KAAK,KAAK,CAAC;AAC5D,OAAKE,oBAAoB,KAAKH,UAAU,KAAKG,kBAAkBF,KAAK,KAAK,CAAC;AAC1E,OAAKG,cAAc,KAAKJ,UAAU,KAAKI,YAAYH,KAAK,KAAK,CAAC;;CAGhE,IAAII,cAAuB;AACzB,SAAO,KAAKR;;CAGd,MAAMS,aAA4B;AAChC,MAAI,CAAC,KAAKX,YACR,MAAKA,cAAc,KAAKY,cAAc,CACnCC,WAAW;AACV,QAAKX,eAAe;IACpB,CACDY,OAAOC,UAAU;AAChB,QAAKf,cAAc;AACnB,SAAMe;IACN;AAEN,SAAO,KAAKf;;;;;;;CAQd,sBAAsC;AACpC,OAAKA,cAAc;AACnB,OAAKE,eAAe;;CAKtB,UAAoBa,OAAsB;EACxC,MAAMG,UAAU7B,WAAW8B,eAAeJ,MAAM;EAChD,MAAMK,OAAOhC,kBAAkBiC,cAAcN,MAAM,GAAGA,MAAMK,OAAO;AACnE,OAAKxB,OAAOmB,MAAM;GAAEK;GAAMF;GAAS,CAAC;;CAGtC,UAAoEK,QAAc;AAChF,UAAQ,OAAO,GAAGD,SAAwB;AACxC,OAAI;AACF,WAAO,MAAMC,OAAOG,MAAM,MAAMJ,KAAK;YAC9BP,OAAO;AACd,SAAKE,UAAUF,MAAM;AACrB,UAAMA;;;;;;;AC7Ed,IAAakB,iBAAb,cAAoCH,OAAO;CACzC,MAAMI,YAA2B;AAC/B,MAAI,KAAKE,aAAa,CACpB,OAAM,KAAKC,YAAY;;CAI3B,MAAMC,kBAAiC;AACrC,MAAI,CAAC,KAAKF,aAAa,CACrB,OAAM,KAAKG,SAAS;;CAIxB,MAAMC,uBAAuBC,SAAmC;AAC9D,QAAM,KAAKH,iBAAiB;AAQ5B,SADcP,uBALG,MAAM,KAAKY,QAAQ;GAClCC,SAAS;GACTC,SAASJ;GACV,CAAC,EAE2CM,OAAOC,aAAaC,MAAM,CAC1DC,qBAAqB;;CAGpC,MAAMC,qBAAqBV,SAAmC;AAC5D,QAAM,KAAKH,iBAAiB;AAQ5B,SADcP,uBALG,MAAM,KAAKY,QAAQ;GAClCC,SAAS;GACTC,SAASJ;GACV,CAAC,EAE2CM,OAAOC,aAAaC,MAAM,CAC1DG,kBAAkB;;CAGjC,MAAMC,WAAWZ,SAAkC;AACjD,MAAI;AACF,SAAM,KAAKH,iBAAiB;AAC5B,UAAO,MAAM,KAAKgB,cAAcb,QAAQ;WACjCc,OAAO;AACd,OAAIA,iBAAiBvB,gBAAgBuB,MAAMC,YAAY,qBACrD,QAAO;AAET,SAAMD;;;;;;AC5CZ,IAAaK,aAAb,cAAgCD,eAAe;CAG7CG,YAAYD,OAAkB;AAC5B,QAAMA,MAAME,QAAQ,GAAG;AACvB,OAAKF,QAAQA;;CAGf,MAAMG,WAA+B;AACnC,SAAO,KAAKH,MAAMK;;CAGpB,MAAMC,YAA2B;AAC/B,QAAM,MAAMA,WAAW;;;;;ACH3B,IAAaU,iBAAb,MAAiD;CAC/CC,YACE,UACA,gBACA;AAFiBC,OAAAA,WAAAA;AACAC,OAAAA,iBAAAA;;CAGnB,MAAMC,OAAOC,IAA6C;EACxD,MAAME,QAAQ,MAAM,KAAKC,UAAU;EAEnC,MAAMC,SAAS,MAAM,KAAKP,SAASQ,QAA2B;GAC5DC,QAAQ;GACRC,QAAQ,CAAC;IAAEC,SAASR;IAAIS,QAAQ;IAAMC,SAASR;IAAOS,UAAU;IAAM,CAAA;GACvE,CAAC;AAEF,MAAI,CAACP,QAAQV,KACX,OAAM,IAAIF,WAAW,sBAAsB;AAG7C,SAAOY,OAAOV;;CAGhB,MAAMkB,WAAWC,SAAkC;AAEjD,UADmB,MAAM,KAAKE,iBAAiB,EAC7BH,WAAWC,QAAQ;;CAGvC,MAAMG,uBAAuBH,SAAmC;AAE9D,UADmB,MAAM,KAAKE,iBAAiB,EAC7BC,uBAAuBH,QAAQ;;CAGnD,MAAMI,qBAAqBJ,SAAmC;AAE5D,UADmB,MAAM,KAAKE,iBAAiB,EAC7BE,qBAAqBJ,QAAQ;;CAGjD,MAAcE,kBAAuC;EACnD,MAAMb,QAAQ,MAAM,KAAKC,UAAU;AAEnC,SAAO,IAAIZ,WADG,KAAKO,eAAeqB,aAAajB,MAAM,CACzB;;CAG9B,MAAMC,WAA+B;AAEnC,UADa,MAAM,KAAKN,SAASwB,eAAe,EACpCX;;CAGd,MAAMY,YAA2B;;;;AClDnC,MAAMS,oBAA+C;CACnD,UAAU;CACV,UAAU;CACX;AAID,IAAaG,iBAAb,MAAaA,uBAAuBN,cAAsD;CAIxFS,YAAYC,OAAoBC,QAAkC;AAChE,QAAMD,OAAOC,OAAO;;CAGtB,OAAOC,cAAuB;AAC5B,SAAO,OAAOC,WAAW,eAAe,OAAOA,OAAOC,SAAS;;CAGjE,OAAOC,eAAeC,WAAmBC,OAA0B;EACjE,MAAMC,MAAM,IAAIC,IAAI,4CAA4C;AAChED,MAAIE,aAAaC,IAAI,OAAOL,UAAU;AACtCE,MAAIE,aAAaC,IAAI,WAAWlB,kBAAkBc,OAAO;AACzD,SAAOC,IAAII,UAAU;;CAGvB,MAAgBC,eAA8B;AAC5C,MAAI,CAACjB,eAAeM,aAAa,CAAE;AAEnC,OAAKJ,WAAWK,OAAOC;AACvB,OAAKP,SAAS,IAAIL,eAAe,KAAKM,UAAU,KAAKiB,eAAe;;CAGtE,MAAMC,QAAQC,SAAyD;AACrE,MAAI,CAACrB,eAAeM,aAAa,CAC/B,OAAM,IAAIX,WAAW,uBAAuB;AAG9C,MAAI,KAAK2B,oBAAoB,aAC3B,OAAM,IAAI3B,WAAW,gCAAgC;AAGvD,QAAM,KAAK4B,YAAY;AACvB,OAAKC,OAAOC,iBAAiB;EAE7B,MAAMC,WAAW,MAAM,KAAKxB,SAASyB,QAAkB,EACrDC,QAAQ,iBACT,CAAC;AAEF,MAAI,CAACF,UAAUG,OACb,OAAM,IAAIlC,WAAW,qBAAqB;EAG5C,MAAMmC,UAAUJ,SAAS;EACzB,MAAMf,QAAQ,MAAM,KAAKV,OAAO8B,UAAU;AAE1C,OAAKP,OAAOQ,UAAU;GAAEF;GAASG,WAAW,CAACH,QAAQ;GAAEnB;GAAO,CAAC;;CAGjE,MAAMuB,aAA4B;AAChC,OAAKV,OAAOW,oBAAoB;AAChC,OAAKX,OAAOY,cAAc;;CAG5B,MAAMC,oBAAmC;AACvC,MAAI,CAACrC,eAAeM,aAAa,CAAE;AAEnC,QAAM,KAAKiB,YAAY;EAEvB,MAAMG,WAAW,MAAM,KAAKxB,SAASyB,QAAkB,EACrDC,QAAQ,iBACT,CAAC;AAEF,MAAI,CAACF,UAAUG,OAAQ;EAEvB,MAAMC,UAAUJ,SAAS;EACzB,MAAMf,QAAQ,MAAM,KAAKV,OAAO8B,UAAU;AAE1C,OAAKP,OAAOc,YAAY;GAAER;GAASG,WAAW,CAACH,QAAQ;GAAEnB;GAAO,CAAC;;CAGnE,MAAM4B,YAAY5B,OAA8D;AAC9E,QAAM,KAAKT,SAASyB,QAAQ;GAC1BC,QAAQ;GACRY,QAAQ,CAAC,EAAEC,SAAS9B,OAAO,CAAA;GAC5B,CAAC;AAEF,OAAKa,OAAOkB,aAAa/B,MAAM;;CAGjCgC,YAA4B;AAC1B,SAAO,KAAK1C;;CAGd2C,cAA6B;AAC3B,SAAO,KAAK1C;;CAGd,IAAYoB,kBAAkB;AAC5B,SAAO,KAAKlB,MAAMyC,aAAa,CAACC,QAAQxB;;;;;ACpG5C,MAAMgC,wBAAwB;AAQ9B,IAAaK,QAAb,MAAaA,MAAM;CAOjBM,YAAYC,MAA2D;EAErE,MAAMI,YADiBJ,KAAKE,WAAW,KAAK,GAAGF,KAAKG,MAAM,EAAE,GAAGH,MAC/BK,MAAM,IAAI;AAE1C,MAAID,SAASE,WAAW,EACtB,OAAM,IAAIC,MAAM,uBAAuBP,KAAI,0BAA2B;AAGxE,MAAI,CAACI,SAAS,GAAGF,WAAW,KAAK,CAC/B,OAAM,IAAIK,MAAM,0BAA0BH,SAAS,GAAE,gBAAiB;AAGxE,OAAKV,WAAW,KAAKc,eAAeJ,SAAS,GAAG;AAChD,OAAKT,YAAY,KAAKa,eAAeJ,SAAS,GAAG;AACjD,OAAKR,WAAW,KAAKY,eAAeJ,SAAS,GAAG;AAChD,OAAKP,UAAU,KAAKW,eAAeJ,SAAS,GAAG;AAC/C,OAAKN,gBAAgB,KAAKU,eAAeJ,SAAS,GAAG;AAErD,MAAI,KAAKP,QAAQP,UAAU,KAAK,KAAKO,QAAQP,UAAU,EACrD,OAAM,IAAIiB,MAAM,yBAAyB,KAAKV,QAAQP,MAAK,mBAAoB;AAGjF,MAAI,CAAC,KAAKI,SAASH,YAAY,CAAC,KAAKI,UAAUJ,YAAY,CAAC,KAAKK,SAASL,SACxE,OAAM,IAAIgB,MAAM,iEAAiE;;CAIrF,IAAIE,UAAkB;AACpB,SAAO,KAAKf,SAASJ;;CAGvB,IAAIoB,WAAmB;AACrB,SAAO,KAAKf,UAAUL;;CAGxB,IAAIqB,UAAkB;AACpB,SAAO,KAAKf,SAASN;;CAGvB,IAAIsB,SAAgB;AAClB,SAAO,KAAKf,QAAQP;;CAGtB,IAAIuB,eAAuB;AACzB,SAAO,KAAKf,cAAcR;;;;;;;CAQ5B,OAAOwB,mBAAmB,EACxBC,MACAC,IACAC,kBACAC,SAMuB;EACvB,MAAMC,QAAsB,EAAE;EAC9B,MAAMT,WAAWjB,MAAM4B,oBAAoBH,MAAM;AACjD,MAAID,qBAAqB,QACvB,MAAK,IAAIK,IAAIP,MAAMO,IAAIN,IAAIM,KAAK;GAC9B,MAAMtB,OAAO,IAAIP,MAAM,OAAOiB,SAAQ,SAAUY,IAAoC;AACpFH,SAAMI,KAAKvB,KAAK;;MAGlB,MAAK,IAAIsB,IAAIP,MAAMO,IAAIN,IAAIM,KAAK;GAC9B,MAAMtB,OAAO,IAAIP,MAAM,OAAOiB,SAAQ,IAAKY,EAAC,OAAwC;AACpFH,SAAMI,KAAKvB,KAAK;;AAIpB,SAAO;GACLmB;GACAJ;GACAC;GACAC;GACD;;CAGH,OAAcI,oBAAoBH,OAAsB;AACtD,MAAI,CAAC/B,QAAQ+B,MAAM,CACjB,OAAM,IAAIX,MAAM,kBAAkBW,QAAQ;EAG5C,MAAMM,QAAQtC,YAAYgC;AAC1B,MAAI,CAACM,MAAMC,UACT,OAAM,IAAIlB,MAAM,SAASW,MAAK,gCAAiC;AAEjE,SAAOM,MAAMC;;CAGf,OAAOC,UAAUR,OAAcP,UAAU,GAAGC,SAAS,GAAYC,eAAe,GAAU;AACxF,SAAOpB,MAAMkC,SAASlC,MAAM4B,oBAAoBH,MAAM,EAAEP,SAASC,QAAQC,aAAa;;CAGxF,OAAOc,SAASjB,UAAkBC,UAAU,GAAGC,SAAS,GAAYC,eAAe,GAAU;AAC3F,SAAO,IAAIpB,MAAM,OAAOiB,SAAQ,IAAKC,QAAO,IAAKC,OAAM,GAAIC,eAAe;;CAG5E,OAAOe,QAAQjB,UAAU,GAAGC,SAAgB,GAAGC,eAAe,GAAU;AACtE,SAAOpB,MAAMkC,SAAS,GAAGhB,SAASC,QAAQC,aAAa;;CAGzD,OAAOgB,SAASlB,UAAU,GAAGC,SAAS,GAAYC,eAAe,GAAU;AACzE,SAAOpB,MAAMkC,SAAS,IAAIhB,SAASC,QAAQC,aAAa;;CAG1D,OAAOiB,mBAAmBC,eAAe,GAAU;AACjD,SAAO,IAAItC,MAAM,WAAWsC,aAAY,OAAwC;;CAGlF,oBAA2BE,UAA4B;AACrD,MAAIA,aAAa,QACf,QAAO,KAAKpB;AAEd,SAAO,KAAKF;;CAGduB,kBAA2B;AACzB,SAAO,KAAKrC,QAAQP,UAAU;;CAGhC6C,qBAA8B;AAC5B,SAAO,KAAKtC,QAAQP,UAAU;;CAGhC8C,cAAoC;AAClC,SAAO,KAAK,KAAKC,sBAAsB;;CAGzCA,uBAAqD;AACnD,SAAO,GAAG,KAAK3C,SAAQ,GAAI,KAAKC,UAAS,GAAI,KAAKC,SAAQ,GAAI,KAAKC,QAAO,GAAI,KAAKC;;CAGrFwC,cAAwB;AACtB,SAAO;GACL,KAAKC,cAAc,KAAK7C,SAAS;GACjC,KAAK6C,cAAc,KAAK5C,UAAU;GAClC,KAAK4C,cAAc,KAAK3C,SAAS;GACjC,KAAKC,QAAQP;GACb,KAAKQ,cAAcR;GACpB;;CAGHkD,uBAAuBC,iBAAgC;AACrD,SAAO,IAAIhD,MACT,GAAG,KAAKC,SAAQ,GAAI,KAAKC,UAAS,GAAI,KAAKC,SAAQ,GAAI,KAAKC,QAAO,GAAI4C,kBACxE;;CAGHC,YAAYT,WAA6B,SAAgB;AACvD,MAAIA,aAAa,QACf,QAAO,KAAKO,uBAAuB,KAAK1C,cAAcR,QAAQ,EAAE;AAElE,SAAO,IAAIG,MACT,GAAG,KAAKC,SAAQ,GAAI,KAAKC,UAAS,GAAI,KAAKC,SAASN,QAAQ,EAAC,IAAK,KAAKO,QAAO,GAAI,KAAKC,gBACxF;;CAGH6C,mBAAmB9B,cAA8B;EAC/C,MAAM+B,QAAQ/B,iBAAiBgC,KAAAA,IAAYhC,eAAe,KAAKf,cAAcR;AAC7E,SAAO,IAAIG,MAAM,GAAG,KAAKC,SAAQ,GAAI,KAAKC,UAAS,GAAI,KAAKC,SAAQ,KAAMgD,QAAwC;;CAGpHE,gBAAgBjC,cAA8B;EAC5C,MAAM+B,QAAQ/B,iBAAiBgC,KAAAA,IAAYhC,eAAe,KAAKf,cAAcR;AAC7E,SAAO,IAAIG,MAAM,GAAG,KAAKC,SAAQ,GAAI,KAAKC,UAAS,GAAI,KAAKC,SAAQ,KAAMgD,QAAwC;;CAGpHG,cAAchB,cAA6B;AACzC,SAAO,IAAItC,MACT,GAAG,KAAKC,SAAQ,GAAI,KAAKC,UAAS,GAAIoC,aAAY,IAAK,KAAKlC,QAAO,GAAI,KAAKC,gBAC7E;;CAGHN,WAAmB;AACjB,SAAO,KAAK4C,aAAa;;CAG3BY,uBAAuB9B,OAAcD,kBAAoC;EACvE,MAAMgC,sBAAsB,KAAKjB,oBAAoBf,iBAAiB;AACtE,SAAOxB,MAAMqB,mBAAmB;GAC9BC,MAAMkC,sBAAsB;GAC5BjC,IAAIiC,sBAAsB;GAC1BhC;GACAC;GACD,CAAC;;CAGJ,aAAoBA,OAAuB;AACzC,SAAOzB,MAAM4B,oBAAoBH,MAAM,KAAK,KAAKR;;CAGnD,eAAuByC,WAAuC;EAC5D,MAAM5D,WAAW4D,UAAUC,SAAS,IAAI,IAAID,UAAUC,SAAS,IAAI;EACnE,MAAM9D,QAAQ+D,OAAOC,SAAS/D,WAAW4D,UAAUhD,MAAM,GAAG,GAAG,GAAGgD,WAAW,GAAG;AAEhF,MAAIE,OAAOE,MAAMjE,MAAM,CACrB,OAAM,IAAIkE,UAAU,2BAA2BL,YAAY;AAG7D,SAAO;GACL7D;GACAC;GACAC,gBAAiBD,WAAW,GAAGD,MAAK,KAAM,GAAGA;GAC9C;;CAGH,cAAsB6D,WAAuC;AAC3D,SAAOA,UAAU5D,WAAW4D,UAAU7D,QAAQF,wBAAwB+D,UAAU7D;;;;;;;;;AC3OpF,IAAamE,kBAAb,MAA6B;;eACIE,QAAQC,SAAS;;CAEhD,MAAMC,IAAOC,IAAkC;EAC7C,IAAIE;EACJ,MAAMC,cAAc,KAAKP;AACzB,OAAKA,QAAQ,IAAIC,SAASO,MAAM;AAC9BF,aAAUE;IACV;AAEF,QAAMD;AAEN,MAAI;AACF,UAAO,MAAMH,IAAI;YACT;AACRE,YAAU;;;;;;ACjBhB,IAAaI,iBAAb,MAA4B;CAC1B,OAAOC,gBAAgBC,OAA8B;AACnD,SAAOA,MAAMC,WAAW,KAAK,GAAID,QAA0B,KAAKA;;CAGlE,OAAOE,cAAcF,OAAuC;AAC1D,SAAOA,MAAMC,WAAW,KAAK,GAAGD,MAAMG,UAAU,EAAE,GAAGH;;CAGvD,OAAOI,WAAWC,QAAyB;AAIzC,SAAO,KAHOG,MAAMC,KAAKJ,OAAO,CAC7BK,KAAKC,SAASA,KAAKC,SAAS,GAAG,CAACC,SAAS,GAAG,IAAI,CAAC,CACjDC,KAAK,GAAG;;;;;ACJf,IAAaS,sBAAb,MAAiC;CAC/B,aAAaC,qBACXC,KACAC,QACAE,KACuC;EACvC,MAAME,YAA0C,EAAE;AAClD,OAAK,MAAMC,SAASL,QAAQ;GAC1B,MAAMM,kBAAkB,MAAMP,IAAIQ,mBAAmBF,OAAOH,IAAI;AAChEE,aAAUI,KAAKF,gBAAgB;;AAEjC,SAAOF;;CAGT,OAAOK,sBAAsBC,cAA2B;EACtD,MAAME,eAAejB,WAAWe,aAAa;EAC7C,MAAMG,QAAQpB,UAAUqB,MAAMC,QAAQnB,eAAeoB,cAAcJ,aAAa,CAAC;AAEjF,SAAOlB,mBAD0BE,eAAesB,WAAWL,MAAMM,QAAQ,MAAM,CAAC,CAC7B;;;;;ACRvD,eAAsBe,mBAAmB,EAAEF,QAAQC,kBAAwC;CAOzF,MAAMM,eAAeN,kBADe;CAEpC,MAAM,EAAEO,SAASC,cAAc,MAAMT,OAAOT,WAAWgB,cAAc,MAAM;AAmE3E,QAAO;EACL,GAlEcV,UAAU;GACxBW,SAASjB,WAAWiB,QAAQ;GAE5B,MAAMG,gBAAgBC,aAAa;IACjC,MAAMC,OAAOjB,qBAAqBgB,YAAY;IAC9C,MAAME,YAAY,MAAMd,OAAOW,gBAAgBJ,cAAcT,eAAeiB,cAAcF,KAAK,EAAE,KAAK;IACtG,IAAI,EAAEG,GAAGC,OAAOH;IAChB,MAAM,EAAEI,GAAGC,MAAML;AAEjB,QAAI,OAAOG,OAAO,aAAaA,OAAO,MAAMA,OAAO,MACjDA,MAAK;IAGP,IAAID;AACJ,QAAI;AACFA,SAAII,OAAO,OAAOH,OAAO,WAAWnB,eAAeuB,gBAAgBJ,GAAG,GAAGA,GAAG;aACrEK,OAAO;AACd,WAAM,IAAIC,MACR,iEAAiEN,GAAE,sBAAuBO,OAAOF,MAAM,CAAA,GACxG;;AAGH,WAAO1B,qBAAqBgB,aAAa;KACvCM,GAAGpB,eAAeuB,gBAAgBH,EAAE;KACpCC,GAAGrB,eAAeuB,gBAAgBF,EAAE;KACpCH;KACD,CAAC;;GAGJ,MAAMS,YAAY,EAAEC,WAAW;IAC7B,MAAM,EAAER,GAAGC,GAAGH,MAAM,MAAMhB,OAAO2B,oBAC/BpB,cACA,KAAKqB,OAAOC,KAAKH,QAAkB,CAACI,SAAS,MAAM,GACpD;AACD,WAAOnC,mBAAmB;KACxBuB,GAAGpB,eAAeuB,gBAAgBH,EAAE;KACpCC,GAAGrB,eAAeuB,gBAAgBF,EAAE;KACpCH,GAAGI,OAAOJ,EAAC;KACZ,CAAC;;GAGJ,MAAMe,cAAcC,aAAa;IAC/B,MAAM,EAAEC,SAAS,EAAE,EAAEP,SAASQ,gBAAgBF;IAC9C,MAAMG,QAAQ;KACZC,cAAc5C,wBAAwB,EAAEyC,QAAQ,CAAC;KACjD,GAAGD,YAAYG;KAChB;IAED,MAAME,kBAAkB5C,WAAW;KAAEwC;KAAeE;KAAgD,CAAC;IACrG,MAAMI,cAAc7C,WAAW;KAC7B8C,MAAMd;KACNQ;KACOC;KACR,CAAC;IAEF,MAAM,EAAEjB,GAAGC,GAAGH,MAAM,MAAMhB,OAAOyC,wBAAwBlC,cAAc8B,iBAAiBE,YAAY;AAEpG,WAAO5C,mBAAmB;KACxBuB,GAAGpB,eAAeuB,gBAAgBH,EAAE;KACpCC,GAAGrB,eAAeuB,gBAAgBF,EAAE;KACpCH,GAAGI,OAAOJ,EAAC;KACZ,CAAC;;GAEL,CAAC;EAIAP,WAAWX,eAAeuB,gBAAgBZ,UAAU;EACpDiC,QAAQ;EACT;;;;ACxFH,IAAaW,oBAAb,MAAaA,0BAA0BH,IAA4B;CAIjE,YAAoBK,kBAA0CD,SAAwBG,WAAsB;AAC1G,QAAMA,UAAU;AAChB,OAAKH,UAAUA;AACf,OAAKC,mBAAmBA;;CAG1B,aAAaG,OAAOH,kBAA0CD,SAAoD;AAEhH,SAAO,IAAID,kBAAkBE,kBAAkBD,SAD7B,MAAMC,iBAAiBK,MAAM,CACmB;;CAEpE,MAAMC,mBAAmBC,OAAcC,MAA+C;AAEpF,SAAO;GACLI,UAFkB,MAAM,KAAKF,WAAWH,MAAMI,aAAa,CAAC,EAEvCC;GACrBL;GACD;;CAGH,MAAMM,qBAAqBC,QAAsBE,KAAqD;AACpG,SAAOpB,oBAAoBiB,qBAAqB,MAAMC,QAAQE,IAAI;;CAGpE,MAAMC,eAAeV,OAAgC;AACnD,SAAOV,mBAAmB;GACxBqB,QAAQ;GACRC,gBAAgBZ,MAAMa,sBAAqB;GAC5C,CAAC;;CAKJ,MAAMC,eAA8B;AAClC,QAAM,KAAKrB,iBAAiBsB,UAAU,KAAKvB,QAAQ;;;;;ACnCvD,eAAsBkC,qBAAqB,EAAEF,QAAQC,kBAA0C;CAE7F,MAAMG,eAAeH,kBADe;CAEpC,MAAM,EAAEI,SAASC,cAAc,MAAMN,OAAOO,cAAcH,cAAc,MAAM;AAgD9E,QAAO;EACL,GA/CcP,UAAU;GACxBQ,SAASX,WAAWW,QAAQ;GAE5B,MAAMI,gBAAgBC,aAAa;IACjC,MAAMC,OAAOf,qBAAqBc,YAAY;IAC9C,MAAME,YAAY,MAAMZ,OAAOa,mBAAmBT,cAAcN,eAAegB,cAAcH,KAAK,EAAE,KAAK;IACzG,IAAI,EAAEI,GAAGC,OAAOJ;IAChB,MAAM,EAAEK,GAAGC,MAAMN;AAEjB,QAAI,OAAOI,OAAO,aAAaA,OAAO,MAAMA,OAAO,MACjDA,MAAK;IAGP,IAAID;AACJ,QAAI;AACFA,SAAII,OAAO,OAAOH,OAAO,WAAWlB,eAAesB,gBAAgBJ,GAAG,GAAGA,GAAG;aACrEK,OAAO;AACd,WAAM,IAAIC,MACR,iEAAiEN,GAAE,sBAAuBO,OAAOF,MAAM,CAAA,GACxG;;AAGH,WAAOzB,qBAAqBc,aAAa;KACvCO,GAAGnB,eAAesB,gBAAgBH,EAAE;KACpCC,GAAGpB,eAAesB,gBAAgBF,EAAE;KACpCH;KACD,CAAC;;GAGJ,MAAMS,YAAY,EAAEC,WAAW;IAC7B,MAAM,EAAER,GAAGC,GAAGH,MAAM,MAAMf,OAAO0B,oBAC/BtB,cACA,KAAKuB,OAAOC,KAAKH,QAAkB,CAACI,SAAS,MAAM,GACpD;AACD,WAAOlC,mBAAmB;KACxBsB,GAAGnB,eAAesB,gBAAgBH,EAAE;KACpCC,GAAGpB,eAAesB,gBAAgBF,EAAE;KACpCH,GAAGI,OAAOJ,EAAC;KACZ,CAAC;;GAGJ,MAAMe,gBAAgB;AACpB,UAAM,IAAIR,MAAM,+CAA+C;;GAElE,CAAC;EAIAhB,WAAWR,eAAesB,gBAAgBd,UAAU;EACpDyB,QAAQ;EACT;;;;ACxDH,IAAaW,iBAAb,MAAaA,uBAAuBH,SAAiC;CAInE,YAAoBK,kBAA0CD,SAAwBG,WAAsB;AAC1G,QAAMA,UAAU;AAChB,OAAKH,UAAUA;AACf,OAAKC,mBAAmBA;;CAG1B,aAAaG,OAAOH,kBAA0CD,SAAiD;AAE7G,SAAO,IAAID,eAAeE,kBAAkBD,SAD1B,MAAMC,iBAAiBK,MAAM,CACgB;;CAEjE,MAAMC,mBAAmBC,OAAcC,KAA8C;EACnF,MAAMC,cAAc,MAAM,KAAKC,oBAAoBH,MAAMI,aAAa,EAAEH,IAAI;AAC5E,SAAO;GACLI,SAAShB,oBAAoBiB,sBAAsBJ,YAAYK,cAAc;GAC7EP;GACD;;CAGH,MAAMQ,qBAAqBC,QAAsBR,KAAqD;AACpG,SAAOZ,oBAAoBmB,qBAAqB,MAAMC,QAAQR,IAAI;;CAGpE,MAAMU,eAAeX,OAAgC;AACnD,SAAOV,qBAAqB;GAC1BsB,QAAQ;GACRC,gBAAgBb,MAAMc,sBAAqB;GAC5C,CAAC;;CAKJ,MAAMC,eAA8B;AAClC,QAAM,KAAKtB,iBAAiBuB,UAAU,KAAKxB,QAAQ;;;;;ACvCvD,IAAagC,eAAb,MAA+C;CAK7CI,YAAYD,kBAA0CD,SAAwB;aAJpD;AAKxB,OAAKC,mBAAmBA;AACxB,OAAKD,UAAUA;;CAGjB,MAAcG,SAAuB;AACnC,MAAI,CAAC,KAAKJ,IAER,MAAKA,MAAM,IAAIH,IADG,MAAM,KAAKK,iBAAiBK,MAAM,CACvB;AAE/B,SAAO,KAAKP;;CAGd,MAAMQ,WAAWC,MAA+D;AAE9E,UADY,MAAM,KAAKL,QAAQ,EACpBI,WAAWC,KAAK;;CAG7B,MAAMG,gBAAgBH,MAAcI,UAAmC;AAErE,UADY,MAAM,KAAKT,QAAQ,EACpBQ,gBAAgBH,MAAMI,SAAS;;CAG5C,MAAMC,mBAAmBC,OAAcC,MAA+C;EACpF,MAAMC,oBAAoBF,MAAMG,sBAAsB;AAGtD,SAAO;GACLR,UAHc,MAAM,KAAKF,WAAWS,kBAAkB,EAGrCP;GACjBK;GACD;;CAGH,MAAMI,qBAAqBC,QAAsBE,KAAqD;AACpG,SAAOxB,oBAAoBqB,qBAAqB,MAAMC,QAAQE,IAAI;;CAGpE,MAAMC,eAA8B;AAClC,QAAM,KAAKrB,iBAAiBsB,OAAO;AACnC,QAAM,KAAKtB,iBAAiBuB,UAAU,KAAKxB,QAAQ;AACnD,OAAKD,MAAM;;;;;AC5Cf,MAAMkC,eAAqD;CACzD,YAAY,CAAC,WAAW;CACxB,mBAAmB,CAAC,WAAW;CAC/B,aAAa,CAAC,gBAAgB;CAC9B,aAAa,CAAC,gBAAgB;CAC9B,cAAc,CAAC,gBAAgB;CAC/B,aAAa,CAAC,gBAAgB;CAC9B,UAAU,CAAC,MAAM;CACjB,UAAU,CAAC,MAAK;CACjB;AAED,IAAaE,mBAAb,MAA8B;CAC5B,OAAOC,mBAAmBC,OAAmC;EAC3D,MAAMC,OAAOL,aAAaI;AAC1B,MAAI,CAACC,MAAMC,OACT,OAAM,IAAIP,YAAY,6BAA6B;AAErD,SAAOM,KAAK;;CAGd,aAAaE,UAAUH,OAAoBI,kBAA8D;EACvG,MAAME,YAAYV,aAAaI;AAC/B,MAAI,CAACM,WAAWJ,OACd,OAAM,IAAIP,YAAY,6BAA6B;EAGrD,MAAMY,UAAUD,UAAU;AAC1B,UAAQC,SAAR;GACE,KAAK,MACH,QAAO,IAAIb,aAAaU,kBAAkBG,QAAQ;GACpD,KAAK,WACH,QAAOf,kBAAkBgB,OAAOJ,kBAAkBG,QAAQ;GAC5D,KAAK,gBACH,QAAOd,eAAee,OAAOJ,kBAAkBG,QAAQ;GACzD,KAAK,OACH,OAAM,IAAIZ,YAAY,6BAA6B;;;;;;ACrC3D,IAAa6B,aAAb,MAAaA,WAAW;;0BACuCA,WAAWE,eAAe;;CAEvF,OAAOC,YAAYC,OAA4B;AAC7C,SAAOR,YAAY;GACjBS,IAAIC,OAAOF,MAAMG,SAASF,GAAG;GAC7BG,MAAMJ,MAAMI;GACZC,gBAAgBL,MAAMK;GACtBC,SAAS,EACPC,SAAS,EAAEd,MAAMO,MAAMM,SAAQ,EAChC;GACDE,gBAAgBR,MAAMS,kBAAkBC,SACpC,EACEH,SAAS;IACPH,MAAM;IACNO,KAAKX,MAAMS,kBAAkB;IAC/B,EACD,GACDG,KAAAA;GACJC,SAASb,MAAMa;GAChB,CAAC;;CAGJ,OAAef,gBAAkC;AAK/C,SAAO;GACL,GALwBT,kBACxBM,UAAUoB,KAAKf,UAAU,CAACA,MAAMgB,OAAOpB,WAAWG,YAAYC,MAAM,CAAC,CACvE,CAAC;GAIC,GAAIN,cAAcuB,MAAMC,UAAU,EAAE;GACrC;;;yCAGsCF,OAAoBI,YAAmC;AAC9F,UAAO7B,mBAAmB;IAAES,OAAOJ,WAAWC,iBAAiBmB;IAAQK,WAAW5B,MAAM;IAAE2B;IAAS,CAAC;;;;yCAG7DJ,OAAoBO,aAAoC;AAC/F,UAAOjC,mBAAmB;IAAEU,OAAOJ,WAAWC,iBAAiBmB;IAAQK,WAAW5B,MAAK;IAAG,CAAC;;;;;;AC3C/F,IAAsBkC,gBAAtB,MAA2D;CAGzDE,YAAYD,aAAoB;AAC9B,OAAKA,cAAcA;;CAGrB,MAAME,WAA2B;AAC/B,SAAO,KAAKF,YAAYI;;CAK1B,MAAMG,YAA2B;;;;;;;;ACLnC,IAAaa,YAAb,MAAaA,kBAAkBL,cAAc;CAI3CQ,YAAYC,aAAuBH,cAA4BC,cAA4B;AACzF,QAAME,YAAY;AAClB,OAAKH,eAAeA;AACpB,OAAKC,eAAeA;;;;;CAMtB,OAAOG,OAAOD,aAAuBE,UAAsC;EACzE,MAAMC,YAAYb,WAAWc,YAAYJ,YAAY;AAYrD,SAAO,IAAIJ,UAAUI,aAVAR,mBAAmB;GACtCa,OAAOF;GACPG,WAAWZ,OAAOQ,SAAQ;GAC3B,CAAC,EAEmBT,mBAAmB;GACtCY,OAAOF;GACPG,WAAWZ,OAAOQ,SAAQ;GAC3B,CAAC,CAE2D;;;;;CAM/D,OAAOK,eAAeP,aAAkC;EACtD,MAAMG,YAAYb,WAAWc,YAAYJ,YAAY;AAYrD,SAAO,IAAIJ,UAAUI,aAVAR,mBAAmB;GACtCa,OAAOF;GACPG,WAAWX,KAAKK,YAAYQ,QAAQ,GAAE;GACvC,CAAC,EAEmBf,mBAAmB;GACtCY,OAAOF;GACPG,WAAWX,KAAKK,YAAYQ,QAAQ,GAAE;GACvC,CAAC,CAE2D;;CAG/DC,kBAAgC;AAC9B,SAAO,KAAKZ;;CAGda,kBAAgC;AAC9B,SAAO,KAAKZ;;CAGd,MAAMa,aAAyC;AAC7C,MAAI,KAAKb,aAAae,QACpB,QAAO,KAAKf,aAAae;EAE3B,MAAM,CAACC,WAAW,MAAM,KAAKhB,aAAaiB,cAAc;AACxD,SAAOD;;;;;CAMT,MAAME,WAAWF,SAAkC;AACjD,SAAO,KAAKjB,aAAamB,WAAW,EACzBF,SACV,CAAC;;;;;CAMJ,IAAIG,iBAA2B;AAC7B,SAAO,KAAKjB;;;;;AChFhB,IAAa2B,kBAAb,MAAaA,wBAAwBD,UAAkC;CAGrEG,YAAYC,OAAiBC,cAA4BC,cAA4BC,KAAgB;AACnG,QAAMH,OAAOC,cAAcC,aAAa;AACxC,OAAKJ,OAAOK;;CAGd,OAAcC,gBAAgBC,MAA8BL,OAAiBM,SAAmC;AAG9G,SAAO,IAAIT,gBAAgBG,OAFNL,WAAWY,+BAA+BP,MAAMQ,OAAOF,QAAQ,EAC/DX,WAAWc,+BAA+BT,MAAMQ,OAAOF,QAAQ,EACtBD,KAAKF,IAAI;;CAGzEO,eAA0B;AACxB,SAAO,KAAKZ;;CAGd,MAAMa,eAA8B;AAClC,QAAM,KAAKb,KAAKe,cAAc;;;;;AClBlC,IAAaS,kBAAb,cAAqCF,WAA4D;CAG/FI,YAAYC,OAAkBF,MAA8B;AAC1D,QAAME,MAAM;AACZ,OAAKF,OAAOA;;CAGdG,eAA6B;AAC3B,SAAO,KAAKH,KAAKI;;CAGnB,MAAcC,iBAAkE;EAC9E,MAAMD,MAAM,KAAKD,cAAc;EAC/B,MAAMM,OAAO,KAAKT,KAAKU,MAAMC,sBAAsB;AACnD,SAAOP,IAAIQ,WAAWH,KAAK;;CAG7B,MAAMI,eAA8B;AAClC,QAAM,KAAKV,cAAc,CAACW,cAAc;;CAG1C,MAAMC,OAAOC,IAA6C;AACxD,QAAM,KAAKC,iBAAiB;AAC5B,QAAM,KAAKJ,cAAc;EAEzB,MAAM,EAAEL,cAAc,MAAM,KAAKH,gBAAgB;EACjD,MAAMa,WAAW,MAAM,KAAKC,SAASH,GAAG;AACxCE,WAASE,gBAAgBZ,UAAUa,aAAa;EAEhD,MAAMC,eAAexB,OAAOoB,SAAS;EACrC,MAAMd,MAAM,KAAKD,cAAc;EAC/B,MAAMM,OAAO,KAAKT,KAAKU,MAAMC,sBAAsB;AAGnDO,WAASO,gBAFS,MAAMrB,IAAIoB,gBAAgBf,MAAMa,aAAa,EAE7BD,aAAa;EAC/C,MAAMK,aAAa5B,OAAOoB,SAAS;AAGnC,UADe,MAAM,KAAKU,cAAcF,WAAW,EACrCC,OAAOE;;;;;ACpCzB,IAAaW,sBAAb,MAAiC;CAC/BC,YAAY,gBAAuD;AAAtCC,OAAAA,iBAAAA;;CAE7B,MAAMC,OAAOC,OAAoBC,KAAgBC,OAAqC;AACpF,MAAIV,YAAYY,YAAYJ,MAAM,CAEhC,QAAO,IAAIN,gBADO,KAAKI,eAAeQ,aAAaN,MAAM,EACnB;GAAEC;GAAKM,OAAOP;GAAOE;GAAO,CAAC;AAGrE,MAAIV,YAAYgB,WAAWR,MAAM,EAAE;GACjC,MAAMS,WAAW,KAAKX,eAAeY,YAAYV,MAAM;GACvD,MAAMW,cAAc,MAAOV,IAAqBW,eAAeV,MAAM;AACrE,UAAOT,gBAAgBoB,gBAAgB;IAAEZ;IAAKM,OAAOP;IAAOE;IAAO,EAAEO,UAAUE,YAAY;;AAG7F,QAAM,IAAIhB,YAAY,6BAA6B;;;;;AChBvD,IAAa0B,sBAAb,MAIE;CAIAE,YAAYC,SAA0D;AACpE,OAAKL,SAASK,QAAQL;AACtB,OAAKC,YAAYI,QAAQJ;;CAG3B,eAAgDO,KAA8D;AAC5G,SAAO,GAAG,KAAKR,SAAS,KAAKC,YAAYS,OAAOF,IAAI;;CAGtDG,OAAgCH,KAA8D;AAC5F,SAAO,KAAKF,eAAeE,IAAI;;CAGjCI,IAA6BJ,KAAQK,OAAyB;EAC5D,MAAMC,UAAU,KAAKR,eAAeE,IAAI;EACxC,MAAMO,mBAAmB,OAAOF,UAAU,YAAYA,UAAU,OAAOG,KAAKC,UAAUJ,MAAM,GAAGH,OAAOG,MAAM;AAC5G,MAAI;AACFK,gBAAaC,QAAQL,SAASC,iBAAiB;WACxCK,OAAO;AACdC,WAAQD,MAAM,uCAAuCN,QAAO,IAAKM,MAAM;;;CAI3EE,IAA6Bd,KAA2B;EACtD,MAAMM,UAAU,KAAKR,eAAeE,IAAI;EACxC,MAAMe,cAAcL,aAAaM,QAAQV,QAAQ;AACjD,MAAIS,gBAAgB,KAAM,QAAO;AACjC,MAAI;AACF,UAAOP,KAAKS,MAAMF,YAAY;UACxB;AACN,UAAOA;;;CAIXG,OAAgClB,KAAc;AAC5CU,eAAaS,WAAW,KAAKrB,eAAeE,IAAI,CAAC;;CAGnDoB,IAA6BpB,KAAiB;AAC5C,SAAOU,aAAaM,QAAQ,KAAKlB,eAAeE,IAAI,CAAC,KAAK;;CAG5DqB,QAAc;EACZ,MAAMC,sBAAsB,GAAG,KAAK9B,SAAS,KAAKC;EAClD,MAAM8B,eAAyB,EAAE;AACjC,OAAK,IAAIC,IAAI,GAAGA,IAAId,aAAae,QAAQD,KAAK;GAC5C,MAAMxB,MAAMU,aAAaV,IAAIwB,EAAE;AAC/B,OAAIxB,KAAK0B,WAAWJ,oBAAoB,CAAEC,cAAaI,KAAK3B,IAAI;;AAElEuB,eAAaK,SAAS5B,QAAQU,aAAaS,WAAWnB,IAAI,CAAC;;;;;;;;;ACtC/D,MAAaqC,aAAa,IAAIH,oBAAkD;CAC9EI,QAAQ;CACRC,WAAW;CACZ,CAAC;;;AC7BF,IAAaO,gBAAb,MAA2B;CACzBC,YAAY,SAAsC;AAArBC,OAAAA,UAAAA;;CAE7BC,SAASC,OAA0B;AACjC,OAAKF,QAAQG,IAAI,gBAAgBD,MAAM;;CAGzCE,WAA+B;AAC7B,SAAO,KAAKJ,QAAQK,IAAI,eAAe;;CAGzCC,SAASC,OAAmC;AAC1C,OAAKP,QAAQG,IAAI,gBAAgBI,MAAM;;CAGzCC,WAAwC;AACtC,SAAO,KAAKR,QAAQK,IAAI,eAAe;;CAGzCI,cAAcC,UAAkC;AAC9C,OAAKV,QAAQG,IAAI,sBAAsBO,SAAS;;CAGlDC,gBAAyC;AACvC,SAAO,KAAKX,QAAQK,IAAI,qBAAqB;;CAG/CO,QAAc;AACZ,OAAKZ,QAAQa,OAAO,eAAe;AACnC,OAAKb,QAAQa,OAAO,eAAe;AACnC,OAAKb,QAAQa,OAAO,qBAAqB;AACzC,OAAKb,QAAQa,OAAO,oBAAoB;;;AAI5C,MAAaC,gBAAgB,IAAIhB,cAAcD,WAAW;;;AC1B1D,IAAa6B,uBAAb,MAAkC;;iBACQ;;CAExCE,KAAKC,SAA8B;AACjC,OAAKF,UAAUE;AACfT,gBAAcU,SAASD,QAAQP,MAAM;AACrCF,gBAAcW,SAASF,QAAQN,MAAMS,aAAa,CAAC;AACnDZ,gBAAca,cAAcJ,QAAQL,WAAW;;CAGjDU,YAAY;EACV,MAAMZ,QAAQF,cAAce,UAAU;EACtC,MAAMC,YAAYhB,cAAciB,UAAU;EAC1C,MAAMb,aAAaJ,cAAckB,eAAe;AAEhD,MAAI,CAAChB,SAAS,CAACc,aAAa,CAACZ,WAC3B,QAAO;AAGT,MAAI;AAEF,UAAO;IAAEF;IAAOC,OADF,IAAIL,MAAMkB,UAAU;IACXZ;IAAY;UAC7B;AACNJ,iBAAcmB,OAAO;AACrB,UAAO;;;CAIXC,aAAmC;AACjC,SAAO,KAAKb;;CAGdc,iBAAgC;AAC9B,MAAI,CAAC,KAAKd,QACR,OAAM,IAAIR,YAAY,uBAAuB;AAE/C,SAAO,KAAKQ;;CAGdY,QAAc;AACZ,OAAKZ,UAAU;AACfP,gBAAcmB,OAAO;;;;;AC5CzB,IAAaU,yBAAb,MAAoC;;mBACU;2BACK;;CAEjD,MAAMG,OAAiC;AACrC,MAAI,KAAKF,WAAW;AAClBI,WAAQC,MAAM,+DAA+D;AAC7E,UAAO,KAAKL;;AAGdI,UAAQC,MAAM,kEAAkE;AAChF,OAAKL,YAAY,MAAM,KAAKM,eAAe;AAC3C,OAAKC,yBAAyB;AAE9BH,UAAQC,MAAM,oDAAoD;AAClE,SAAO,KAAKL;;CAGd,MAAMQ,oBAA2C;EAC/C,MAAMC,UAAU,MAAMf,gBAAgBgB,MAAM;AAC5CN,UAAQC,MAAM,gEAAgEI,QAAQE,OAAO;AAE7F,MAAIF,QAAQE,WAAW,EACrB,QAAO,EAAEd,WAAW,OAAO;AAG7B,MAAI;AACFO,WAAQC,MAAM,mEAAmE;GACjF,MAAML,YAAY,MAAMN,gBAAgBkB,eAAe;AACvD,OAAI,CAACZ,WAAW;AACdI,YAAQC,MAAM,0EAA0E;AACxF,WAAO,EAAER,WAAW,OAAO;;AAG7B,QAAKG,YAAYA;AACjB,QAAKO,yBAAyB;AAE9BH,WAAQC,MAAM,qEAAqE;GACnF,MAAMP,aAAa,MAAM,KAAKe,eAAe;AAC7CT,WAAQC,MAAM,8DAA8DP,WAAWgB,KAAK;AAC5F,UAAO;IAAEjB,WAAW;IAAMC;IAAY;WAC/BiB,OAAO;AACdX,WAAQC,MAAM,yDAAyDU,MAAM;AAC7E,UAAO,EAAElB,WAAW,OAAO;;;CAI/B,MAAMgB,gBAA8C;EAClD,MAAMb,YAAY,MAAM,KAAKE,MAAM;AACnCE,UAAQC,MAAM,kEAAkE;EAChF,MAAMW,WAAW,MAAMhB,UAAUiB,KAAK,KAAM,GAAM,GAAM,EAAK;EAE7D,IAAIC,QAAQ;AAGZ,MAFeF,SAASE,aAET,EACb,OAAM,IAAIvB,YAAY,sBAAsB;EAG9C,MAAMyB,aAAaJ,SAASE;EAC5B,MAAMG,iBAAiBH;AACvBA,WAASE;EACT,MAAMN,OAAOE,SAASM,SAASD,gBAAgBH,MAAM,CAACK,SAAS,QAAQ;EAEvE,MAAMC,gBAAgBR,SAASE;EAC/B,MAAMO,oBAAoBP;AAC1BA,WAASM;EACT,MAAME,UAAUV,SAASM,SAASG,mBAAmBP,MAAM,CAACK,SAAS,QAAQ;EAE7E,MAAMI,aAAaX,SAASE;EAC5B,MAAMU,kBAAkBV;AACxBA,WAASS;EACT,MAAME,QAAQb,SAASM,SAASM,iBAAiBV,MAAM;AAEvDd,UAAQC,MAAM,uDAAuD;GAAES;GAAMY;GAAS,CAAC;AACvF,SAAO;GAAEZ;GAAMY;GAASG;GAAO;;CAGjC,MAAcvB,gBAA0C;AACtD,MAAI;GACF,MAAMwB,WAAW,MAAMpC,gBAAgBkB,eAAe;AAEtD,OAAIkB,UAAU;AACZ1B,YAAQC,MAAM,2DAA2D;AACzE,WAAOyB;;UAEH;AACN1B,WAAQC,MAAM,qFAAqF;;AAGrGD,UAAQC,MAAM,8EAA8E;AAC5F,SAAQ,MAAMX,gBAAgBqC,QAAQ;;CAGxC,MAAMC,UAAUC,iBAA+C;EAC7D,MAAM,EAAEnB,SAAS,MAAM,KAAKD,eAAe;AAE3C,MAAIC,SAASmB,gBACX,OAAM,IAAItC,YACR,oCACA,IAAIuC,MAAM,YAAYD,gBAAe,2BAA4BnB,OACnE,CAAC;;CAIL,MAAMqB,QAAuB;AAC3B,MAAI,KAAKnC,WAAW;AAClBI,WAAQC,MAAM,uDAAuD;AACrE,OAAI;AACF,UAAM,KAAKL,UAAUmC,OAAO;aACpB;AACR,SAAKnC,YAAY;;AAEnBI,WAAQC,MAAM,sDAAsD;;;CAIxE+B,aAAaC,SAA2B;AACtC,OAAKpC,oBAAoBoC;AACzB,OAAK9B,yBAAyB;;CAGhC,0BAAwC;AACtC,MAAI,KAAKP,aAAa,KAAKC,kBACzB,MAAKD,UAAUsC,GAAG,cAAc,KAAKrC,kBAAkB;;;;;ACvH7D,IAAasD,kBAAb,cAAqCR,cAAsD;CAOzFc,YAAYC,OAAoBC,QAAmC;AACjE,QAAMD,OAAOC,OAAO;0BAPc,IAAIV,wBAAwB;wBAC9B,IAAID,sBAAsB;eAEnC,IAAIH,iBAAiB;gBACR;AAIpC,OAAKS,gBAAgB,IAAIP,oBAAoB,KAAKa,eAAe;AACjE,OAAKR,iBAAiBS,mBAAmB,KAAKC,kBAAkB,CAAC;;CAGnE,MAAgBC,eAA8B;CAE9C,MAAME,QAAQC,OAAoBC,SAA+C;AAC/EC,UAAQC,MAAM,6BAA6B;GAAEH;GAAOC;GAAS,CAAC;AAC9D,QAAM,KAAKZ,MAAMe,IAAI,YACnB,KAAKC,eAAeL,OAAOC,WAAW;GAAEK,OAAO5B,MAAM6B,UAAUP,OAAO,GAAG,GAAG,EAAE;GAAEQ,kBAAkB;GAAS,CAC7G,CAAC;;CAGH,MAAMC,aAA4B;AAChC,OAAKC,OAAOC,oBAAoB;AAChC,QAAM,KAAKzB,iBAAiB0B,OAAO;AACnC,OAAKtB,SAAS;AACd,OAAKH,eAAe0B,OAAO;AAC3B,OAAKH,OAAOI,cAAc;;CAG5B,MAAMC,oBAAmC;AACvCb,UAAQC,MAAM,sCAAsC;AACpD,MAAI,KAAKb,QAAQ;AACfY,WAAQC,MAAM,gEAAgE;AAC9E;;EAGF,MAAMa,QAAQ,KAAK7B,eAAe8B,WAAW;AAC7C,MAAI,CAACD,OAAO;AACVd,WAAQC,MAAM,2DAA2D;AACzE;;EAGF,MAAMe,SAAS,MAAM,KAAKhC,iBAAiBiC,mBAAmB;AAC9D,MAAI,CAACD,OAAOE,WAAW;AACrBlB,WAAQC,MAAM,+DAA+D;AAC7E;;EAGF,MAAMkB,cAAczC,iBAAiB0C,mBAAmBN,MAAMO,MAAM;AACpE,MAAIL,OAAOM,YAAYC,SAASJ,aAAa;AAC3CnB,WAAQC,MAAM,2CAA2C;IACvDuB,UAAUL;IACVM,SAAST,OAAOM,YAAYC;IAC7B,CAAC;AACF;;AAGFvB,UAAQC,MAAM,kDAAkD,EAAEH,OAAOgB,MAAMO,OAAO,CAAC;AACvF,QAAM,KAAKlC,MAAMe,IAAI,YAAY,KAAKwB,eAAeZ,MAAM,CAAC;;CAG9D,MAAMa,YAAY7B,OAAmC;EACnD,MAAM,EAAEM,OAAOwB,eAAe,KAAK3C,eAAe4C,gBAAgB;AAClE,QAAM,KAAKhC,QAAQC,OAAO;GACxBM,OAAO5B,MAAM6B,UAAUP,OAAOM,MAAM0B,SAAS1B,MAAM2B,QAAQ3B,MAAM4B,aAAa;GAC9E1B,kBAAkBsB;GACnB,CAAC;;CAGJK,aAAmC;AACjC,SAAO,KAAKhD,eAAegD,YAAY;;CAGzCC,YAA0B;AACxB,MAAI,CAAC,KAAK9C,OAAQ,OAAM,IAAIN,YAAY,uBAAuB;AAC/D,SAAO,KAAKM;;CAGd+C,cAA8B;AAC5B,QAAM,IAAIrD,YAAY,+BAA+B;;CAGvD,MAAMsD,2BAA2BtC,OAAoBuC,OAAkD;AACrG,QAAM,KAAKC,WAAWxC,MAAM;AAE5B,UADY,MAAMpB,iBAAiB8D,UAAU1C,OAAO,KAAKd,iBAAiB,EAC/DyD,qBAAqBJ,OAAO,KAAK7C,eAAekD,SAAS5C,MAAM,CAAC6C,UAAU;;CAGvF,MAAcxC,eAAeL,OAAoBC,SAA8C;AAC7FC,UAAQC,MAAM,qCAAqC;GAAEH;GAAOM,OAAOL,QAAQK;GAAO,CAAC;AACnF,OAAKI,OAAOoC,iBAAiB;AAE7B,MAAI;GACF,MAAM,EAAEd,SAAS1C,WAAW,MAAM,KAAKyD,oBAAoB/C,OAAOC,QAAQ;AAC1E,QAAKX,SAASA;AACd,QAAKH,eAAe6D,KAAK;IAAEzB,OAAOvB;IAAOM,OAAOL,QAAQK;IAAOwB,YAAY7B,QAAQO;IAAkBwB;IAAS,CAAC;AAC/G,QAAKtB,OAAOuC,UAAU;IAAEC,SAASlB,QAAQkB;IAASC,WAAW,CAACnB,QAAQkB,QAAQ;IAAE3B,OAAOvB;IAAO,CAAC;AAC/FE,WAAQC,MAAM,uCAAuC,EAAE+C,SAASlB,QAAQkB,SAAS,CAAC;WAC3EE,OAAO;AACdlD,WAAQC,MAAM,oCAAoCiD,MAAM;AACxD,SAAM,KAAKlE,iBAAiB0B,OAAO;AACnC,QAAKF,OAAOI,cAAc;AAC1B,SAAMsC;;;CAIV,MAAcxB,eAAeZ,OAAqF;AAChHd,UAAQC,MAAM,qCAAqC;GAAEH,OAAOgB,MAAMO;GAAOjB,OAAOU,MAAMV;GAAO,CAAC;AAC9F,MAAI;GACF,MAAM,EAAE0B,SAAS1C,WAAW,MAAM,KAAKyD,oBAAoB/B,MAAMO,OAAO;IACtEjB,OAAOU,MAAMV;IACbE,kBAAkBQ,MAAMc;IACzB,CAAC;AAEF,QAAKxC,SAASA;AACd,QAAKH,eAAe6D,KAAK;IAAEzB,OAAOP,MAAMO;IAAOjB,OAAOU,MAAMV;IAAOwB,YAAYd,MAAMc;IAAYE;IAAS,CAAC;AAC3G,QAAKtB,OAAO8C,YAAY;IAAEN,SAASlB,QAAQkB;IAASC,WAAW,CAACnB,QAAQkB,QAAQ;IAAE3B,OAAOP,MAAMO;IAAO,CAAC;AACvGrB,WAAQC,MAAM,uCAAuC,EAAE+C,SAASlB,QAAQkB,SAAS,CAAC;WAC3EE,OAAO;AACdlD,WAAQC,MAAM,oCAAoCiD,MAAM;AACxD,SAAM,KAAKlE,iBAAiB0B,OAAO;;;CAIvC,MAAcmC,oBAAoB/C,OAAoBC,SAA+B;AACnFC,UAAQC,MAAM,0CAA0C,EAAEH,OAAO,CAAC;AAElE,MAAI;AACF,SAAM,KAAKwC,WAAWxC,MAAM;AAC5BE,WAAQC,MAAM,+CAA+C;GAE7D,MAAMsC,MAAM,MAAM7D,iBAAiB8D,UAAU1C,OAAO,KAAKd,iBAAiB;GAC1E,MAAMuE,MAAM,KAAK/D,eAAekD,SAAS5C,MAAM,CAAC6C;GAEhD,MAAMa,SAAS;IACb1B,SAAS,MAAMS,IAAIkB,mBAAmB1D,QAAQK,OAAOmD,IAAI;IACzDnE,QAAQ,MAAM,KAAKF,cAAcwE,OAAO5D,OAAOyC,KAAKxC,QAAQK,MAAK;IAClE;AAEDJ,WAAQC,MAAM,2CAA2C;AACzD,UAAOuD;WACAN,OAAO;AACd,SAAMpE,YAAY6E,UAAUT,MAAM,IAAIA;;;CAI1C,mBAAiC;AAC/B,OAAK9D,SAAS;AACd,OAAKH,eAAe0B,OAAO;AAC3B,OAAKH,OAAOI,cAAc;;CAG5B,MAAc0B,WAAWxC,OAAmC;EAC1D,MAAMqB,cAAczC,iBAAiB0C,mBAAmBtB,MAAM;EAC9D,MAAMwB,aAAa,MAAM,KAAKtC,iBAAiB4E,eAAe;AAE9D,MAAItC,WAAWC,SAASJ,YACtB,OAAM,IAAIrC,YACR,oCACA,IAAI+E,MAAM,mBAAmB1C,YAAW,0CAA2CG,WAAWC,OAChG,CAAC;;;;;ACpKP,MAAMkD,YAAY;CAChBC,eAAe;CACfC,iBAAiB;CAClB;AAED,IAAaE,oBAAb,cAAuCR,cAAuD;;;gBAGzD;;CAEnC,MAAgBY,eAA8B;EAC5C,MAAME,oBAAyC,EAAE;AACjD,OAAK,MAAME,SAAS,KAAKC,eAAeC,oBAAoB,EAAE;AAC5D,OAAI,CAACpB,YAAYqB,WAAWH,MAAM,CAAE;GACpC,MAAMI,QAAQ,KAAKH,eAAeI,YAAYL,MAAM;AACpDF,qBAAkBM,MAAME,SAASC,OAAcH,MAAMI,QAAQ;;AAG/D,OAAKf,MAAM,MAAMR,gBAAgB;GAC/BwB,MAAM;IAAEC,MAAM,KAAKC,OAAOC,SAASF;IAAMG,KAAK,KAAKF,OAAOC,SAASC;IAAK;GACxEC,KAAK,EAAEhB,mBAAkB;GAC1B,CAAC;AAEF,OAAKJ,WAAW,KAAKD,IAAIsB,aAAa;AAEtC,OAAKrB,SAASsB,GAAG,oBAAoBC,aAAuB,KAAKC,kBAAkBD,SAAS,CAAC;AAC7F,OAAKvB,SAASsB,GAAG,iBAAiBT,QAAgB,KAAKY,eAAeZ,IAAI,CAAC;AAC3E,OAAKb,SAASsB,GAAG,oBAAoB;AACnC,OAAI,KAAKI,oBAAoB,KAAK,aAAa;AAC7C,SAAKzB,SAAS;AACd,SAAK0B,OAAOC,cAAc;;IAE5B;;CAGJ,MAAMC,QAAQnB,OAAiE;AAC7E,MAAI,KAAKgB,oBAAoB,KAAK,aAChC,OAAM,IAAIjC,cAAc,gCAAgC;AAG1D,QAAM,KAAKqC,YAAY;AACvB,OAAKH,OAAOI,iBAAiB;AAE7B,MAAIrB,SAAS,CAACtB,YAAYqB,WAAWC,MAAM,EAAE;AAC3C,QAAKiB,OAAOC,cAAc;AAC1B,SAAM,IAAInC,cAAc,6BAA6B;;EAGvD,MAAMuC,YAAYtB,QAAS,KAAKH,eAAeI,YAAYD,MAAM,CAACE,SAASC,MAAcoB,KAAAA;EAEzF,IAAIV;EACJ,IAAIW;EAEJ,MAAMC,kBAAkB,KAAKpC,IAAIqC,YAAY;EAC7C,MAAMC,kBAAkB,KAAKtC,IAAIuC,YAAY;AAC7C,MAAIH,mBAAmBE,iBAAiB;AACtCd,cAAW,KAAKxB,IAAIwB;AACpBW,aAAUG;SACL;GACL,MAAME,SAAS,MAAM,KAAKxC,IAAI8B,QAAQG,YAAY,EAAEQ,UAAU,CAACR,UAAS,EAAG,GAAGC,KAAAA,EAAU,CAACQ,OAAOC,UAAU;AACxG,SAAKf,OAAOC,cAAc;AAC1B,QAAIpC,WAAWmD,mBAAmBD,OAAOhD,UAAUC,cAAc,CAC/D,OAAM,IAAIF,cAAc,wBAAwBiD,MAAM;AAExD,QAAIlD,WAAWmD,mBAAmBD,OAAOhD,UAAUE,gBAAgB,CACjE,OAAM,IAAIH,cAAc,iCAAiCiD,MAAM;AAEjE,UAAM,IAAIjD,cAAc,4BAA4BiD,MAAM;KAC1D;AACF,OAAI,CAACH,OAAOhB,SAASqB,QAAQ;AAC3B,SAAKjB,OAAOC,cAAc;AAC1B,UAAM,IAAInC,cAAc,qBAAqB;;AAE/C8B,cAAWgB,OAAOhB;AAClBW,aAAUK,OAAOL;;EAGnB,MAAMW,eAAe,KAAKtC,eAAeuC,UAAUC,IAAIb,QAAQ;AAE/D,MAAIxB,SAASmC,iBAAiBnC,MAC5B,OAAM,KAAKsC,YAAYtC,MAAM;WACpB,CAACmC,cAAc;AACxB,QAAKlB,OAAOC,cAAc;AAC1B,SAAM,IAAInC,cAAc,0BAA0B;;EAGpD,MAAMa,QAAQI,SAASmC;AACvB,OAAKI,aAAa3C,MAAM;AACxB,OAAKqB,OAAOuB,UAAU;GAAEC,SAAS5B,SAAS;GAAI6B,WAAW7B;GAAUjB;GAAO,CAAC;;CAG7E,MAAM+C,aAA4B;AAChC,OAAK1B,OAAO2B,oBAAoB;AAChC,MAAI,KAAKC,YACP,OAAM,KAAKxD,IAAIsD,YAAY;AAE7B,OAAKpD,SAAS;AACd,OAAK0B,OAAOC,cAAc;;CAG5B,MAAM4B,oBAAmC;AACvC,MAAI,KAAK9B,oBAAoB,KAAK,eAAgB;AAElD,QAAM,KAAKI,YAAY;AACvB,MAAI,KAAKJ,oBAAoB,KAAK,eAAgB;EAElD,MAAM+B,UAAU,KAAK1D,IAAIqC,YAAY;AACrC,MAAI,CAACqB,QAAS;EAEd,MAAM5C,MAAM,KAAKd,IAAIuC,YAAY;AACjC,MAAI,CAACzB,IAAK;EAEV,MAAMP,QAAQ,KAAKC,eAAeuC,UAAUC,IAAIlC,IAAI;AACpD,MAAI,CAACP,MAAO;AAEZ,OAAK2C,aAAa3C,MAAM;AACxB,OAAKqB,OAAO+B,YAAY;GAAEP,SAASM;GAASL,WAAW,KAAKrD,IAAIwB;GAAUjB;GAAO,CAAC;;CAGpF,MAAM0C,YAAY1C,OAAmC;EACnD,MAAMI,QAAQ,KAAKH,eAAeI,YAAYL,MAAM;AAEpD,MAAI;AACF,SAAM,KAAKP,IAAIiD,YAAY;IACzBd,SAASxB,MAAME,SAASC;IACxB8C,oBAAoB;KAClBzB,SAASxB,MAAME,SAASC;KACxB+C,WAAWlD,MAAMM;KACjB6C,gBAAgBnD,MAAMmD;KACtB/C,SAASJ,MAAMI;KACfgD,mBAAmBpD,MAAMoD;KAC3B;IACD,CAAC;WACKpB,OAAO;AACd,OAAIlD,WAAWmD,mBAAmBD,OAAOhD,UAAUC,cAAc,CAC/D,OAAM,IAAIF,cAAc,wBAAwBiD,MAAM;AAExD,SAAM,IAAIjD,cAAc,8BAA8BiD,MAAM;;AAG9D,OAAKO,aAAa3C,MAAM;;CAG1ByD,YAAuB;AACrB,MAAI,CAAC,KAAK9D,OAAQ,OAAM,IAAIR,cAAc,uBAAuB;AACjE,SAAO,KAAKQ;;CAGdoB,cAAgC;AAC9B,SAAO,KAAKrB;;CAGd,kBAA0BuB,UAA0B;AAClD,MAAIA,SAASqB,WAAW,GAAG;AACzB,OAAI,KAAKlB,oBAAoB,KAAK,YAAa;AAC/C,QAAKC,OAAO2B,oBAAoB;AAChC,QAAK3B,OAAOC,cAAc;AAC1B;;AAGF,OAAK5B,SACFgE,QAAQ,EAAEC,QAAQ,eAAe,CAAC,CAClCC,MAAMrD,QAAgB;GACrB,MAAMP,QAAQ,KAAKC,eAAeuC,UAAUC,IAAIlC,IAAI;AACpD,OAAI,CAACP,MAAO;AAEZ,OAAI,KAAKoB,oBAAoB,KAAK,gBAAgB;AAChD,SAAKC,OAAOI,iBAAiB;AAC7B,SAAKkB,aAAa3C,MAAM;AACxB,SAAKqB,OAAOuB,UAAU;KAAEC,SAAS5B,SAAS;KAAI6B,WAAW7B;KAAUjB;KAAO,CAAC;SAE3E,MAAKqB,OAAOwC,eAAe;IAAEhB,SAAS5B,SAAS;IAAI6B,WAAW7B;IAAUjB;IAAO,CAAC;IAElF,CACDmC,OAAOC,UAAU;AAChB,QAAK0B,UAAU1B,MAAM;IACrB;;CAGN,eAAuB7B,KAAmB;EACxC,MAAMP,QAAQ,KAAKC,eAAeuC,UAAUC,IAAIlC,IAAI;AAEpD,MAAI,CAACP,OAAO;AACV,QAAKL,SAAS;AACd,QAAK0B,OAAOC,cAAc;AAC1B;;AAGF,MAAI,KAAKyC,iBAAiB,KAAK/D,OAAO;AACpC,QAAK2C,aAAa3C,MAAM;AACxB,QAAKqB,OAAO2C,aAAahE,MAAM;;;CAInC,aAAqBA,OAA0B;AAC7C,OAAKL,SAASZ,UAAUkF,OAAO,KAAKhE,eAAeI,YAAYL,MAAM,EAAE,KAAKN,SAAS;;CAGvF,qBAA6B;AAC3B,SAAO,KAAKwE,MAAMC,aAAa,CAACC,QAAQC;;CAG1C,kBAA0B;AACxB,SAAO,KAAKH,MAAMC,aAAa,CAACC,QAAQpE;;;;;;;;;;AC1M5C,IAAagF,yBAAb,MAAaA,+BAA+BL,UAAU;CACpDM,YAAYC,OAAiBC,cAA4BC,cAA4B;AACnF,QAAMF,OAAOC,cAAcC,aAAa;;CAG1C,OAAOC,mBAAmBC,aAAuBC,UAAqD;EACpG,MAAMC,YAAYd,WAAWe,YAAYH,YAAY;AAYrD,SAAO,IAAIN,uBAAuBM,aAVbV,mBAAmB;GACtCM,OAAOM;GACPE,WAAWX,KAAKO,YAAYK,QAAQ,GAAE;GACvC,CAAC,EAEmBd,mBAAmB;GACtCK,OAAOM;GACPE,WAAWZ,OAAOS,SAAQ;GAC3B,CAAC,CAEwE;;;;;ACtB9E,IAAac,yBAAb,cAA4CH,WAAgC;CAG1EK,YAAYC,OAAkBF,UAA6B;AACzD,QAAME,MAAM;AACZ,OAAKF,WAAWA;;CAGlB,MAAMG,OAAOC,IAA6C;AACxD,QAAM,KAAKE,SAAS;AACpB,MAAI;GACF,MAAMC,WAAW,MAAM,KAAKC,SAASJ,GAAG;GACxC,MAAMK,WAAsB,MAAM,KAAKC,UAAU;AAEjD,OAAI,KAAKC,YAAY,CAWnB,SAVe,MAAM,KAAKX,SAASa,QACjC;IACEG,QAAQ;IACRC,QAAQ;KACNH,SAASP;KACTW,QAAQ;KACV;IACD,EACDT,SACD,EACaK,QAAQC;GAGxB,MAAMH,SAAS,MAAM,KAAKZ,SAASa,QACjC;IACEG,QAAQ;IACRC,QAAQ;KACNH,SAASP;KACTW,QAAQ;KACV;IACD,EACDT,SACD;GAGD,MAAMY,aAAavB,OADF,KAAKsB,WAAWR,OAAOE,QAAQ,CACb;AAEnC,WADY,MAAM,KAAKS,cAAcF,WAAW,EACrCT,OAAOG;YACV;AACR,SAAM,KAAKS,YAAY;;;CAI3B,WAAmBC,cAAkF;AACnG,MAAI,KAAKC,QAAQD,aAAa,CAoB5B,QAAO5B,kBAhBI;GACT8B,iBAAiBF,aAAaE;GAC9BC,SAASH,aAAaG;GACtBC,KAAKJ,aAAaI;GAClBC,UAAUL,aAAaK;GACvBC,eAAeN,aAAaM;GAC5BC,cAAcP,aAAaO;GAC3BC,OAAOR,aAAaQ;GACpBC,oBAAoBT,aAAaS;GACjCC,aAAaV,aAAaU;GAC1BC,QAAQX,aAAaW;GACrBC,gBAAgBZ,aAAaY;GAC7BC,OAAOb,aAAaa;GACpBC,WAAWd,aAAac;GACzB,CAE2B;AAG9B,SAAOd;;CAET,aAA8B;AAE5B,SADiB,KAAKgB,aAAa,CACnBC,SAAS,WAAW;;CAGtC,QAAgBC,eAA+F;AAE7G,SADiB,KAAKF,aAAa,CACnBC,SAAS,QAAQ;;CAGnC,cAA8B;AAC5B,UAAQ,KAAK1C,SAAS4C,SAASC,KAAKC,SAASC,QAAQ,WAAWC,aAAa;;;;;ACpFjF,IAAaS,6BAAb,MAAwC;CACtCC,YACE,UACA,gBACA;AAFiBC,OAAAA,WAAAA;AACAC,OAAAA,iBAAAA;;CAGnBC,OAAOC,OAA2B;AAChC,MAAIT,WAAWU,WAAWD,MAAM,EAAE;GAChC,MAAME,QAAQ,KAAKJ,eAAeK,YAAYH,MAAM;AACpD,UAAOR,uBAAuBY,mBAAmBF,OAAO,KAAKL,SAAS;;AAGxE,MAAIN,WAAWc,YAAYL,MAAM,CAE/B,QAAO,IAAIP,uBADG,KAAKK,eAAeQ,aAAaN,MAAM,EACZ,KAAKH,SAAS;AAGzD,QAAM,IAAIH,mBAAmB,6BAA6B;;;;;ACvB9D,IAAMgB,iBAAN,MAAqB;CACnBC,YAAY,SAAsC;AAArBC,OAAAA,UAAAA;;CAE7BC,eAAeC,SAAuB;AACpC,OAAKF,QAAQG,IAAI,mBAAmBD,QAAQ;;CAG9CE,iBAAgC;AAC9B,SAAO,KAAKJ,QAAQK,IAAI,kBAAkB;;CAG5CC,eAAeC,SAAuB;AACpC,OAAKP,QAAQG,IAAI,mBAAmBI,QAAQ;;CAG9CC,iBAAgC;AAC9B,SAAO,KAAKR,QAAQK,IAAI,kBAAkB;;CAG5CI,aAAaC,OAAoB;AAC/B,OAAKV,QAAQG,IAAI,iBAAiBO,MAAM;;CAG1CC,eAA6B;AAC3B,SAAO,KAAKX,QAAQK,IAAI,gBAAgB;;CAG1CO,QAAc;AACZ,OAAKZ,QAAQa,OAAO,kBAAkB;AACtC,OAAKb,QAAQa,OAAO,kBAAkB;AACtC,OAAKb,QAAQa,OAAO,gBAAgB;;;AAIxC,MAAaC,iBAAiB,IAAIhB,eAAeD,WAAW;;;ACxB5D,IAAa4B,8BAAb,MAAyC;CACvCC,YAAY,UAA8C;AAA7BC,OAAAA,WAAAA;;CAE7BC,eAA8B;EAC5B,MAAMC,UAAU,KAAKF,SAASE;AAC9B,MAAI,CAACA,QAAS,OAAM,IAAIT,mBAAmB,mCAAmC;EAE9E,MAAMG,qBAA2C,EAAE;EAEnD,MAAMO,SAASD,QAAQE,WAAWD;AAClC,MAAIA,QAAQE,SACV,MAAK,MAAMC,WAAWH,OAAOE,UAAU;GACrC,MAAM,EAAEE,WAAWC,WAAWC,YAAYlB,YAAYe,QAAQ;AAC9DV,sBAAmBc,KAAK;IACtBC,MAAM;IACNF;IACAG,OAAO,GAAGL,UAAS,GAAIC;IACvBK,OAAO;IACR,CAAC;;EAIN,MAAMC,OAAOZ,QAAQE,WAAWU;AAChC,MAAIA,MAAMT,SACR,MAAK,MAAMC,WAAWQ,KAAKT,UAAU;GACnC,MAAM,EAAEE,WAAWC,WAAWC,YAAYlB,YAAYe,QAAQ;AAC9DV,sBAAmBc,KAAK;IACtBC,MAAM;IACNF;IACAG,OAAO,GAAGL,UAAS,GAAIC;IACvBK,OAAO;IACR,CAAC;;AAIN,SAAO;GAAEjB;GAAoBC,iBAAiBD,mBAAmB;GAAI;;CAGvEmB,0BAA0BC,eAA6C;EACrE,MAAMC,cAAcvB,eAAewB,gBAAgB;EACnD,MAAMC,YAAYzB,eAAe0B,cAAc;AAE/C,MAAIH,eAAeE,WAAW;GAC5B,MAAME,eAAeL,cAAcpB,mBAAmB0B,MACnDC,iBAAiBA,aAAad,YAAYQ,eAAeM,aAAaX,UAAUO,UAClF;AACD,OAAIE,aACF,QAAO;IAAEzB,oBAAoBoB,cAAcpB;IAAoBC,iBAAiBwB;IAAc;;AAGlG,SAAOL;;CAGTQ,mBAAmBf,SAAmC;AACpDf,iBAAe+B,eAAehB,QAAQA,QAAQ;AAC9Cf,iBAAegC,aAAajB,QAAQG,MAAM;;CAG5Ce,gBAAgBC,QAAiB;EAC/B,MAAMC,YAAYD,OAAOE,OAAOtC,WAAWuC,WAAW;EACtD,MAAMC,aAAaJ,OAAOE,OAAOtC,WAAWyC,YAAY;EAExD,MAAM7B,aAAwF,EAAE;AAEhG,MAAIyB,UAAUQ,SAAS,EACrBjC,YAAWD,SAAS;GAClByB,QAAQC;GACRM,SAAS;IAAC;IAAuB;IAAuB;IAAY;IAAiB;IAAoB;GACzGC,QAAQ,CAAC,gBAAgB,kBAAiB;GAC3C;AAGH,MAAIJ,WAAWK,SAAS,EACtBjC,YAAWU,OAAO;GAChBc,QAAQI;GACRG,SAAS,CAAC,uBAAuB;GACjCC,QAAQ,EAAA;GACT;AAGH,SAAOhC;;;;;;;;;;;;;;;AChEX,IAAaqD,yBAAb,cAA4CR,cAAoE;CAS9Ge,YAAYC,OAAoBP,QAAsC;AACpE,QAAMO,OAAOP,OAAO;gBAHe;AAInC,OAAKA,SAASA;;CAGhB,MAAgBQ,eAA8B;AAC5C,OAAKP,WAAW,MAAMP,kBAAkBgB,KAAK;GAC3CC,WAAW,KAAKX,OAAOW;GACvBC,UAAU;IACRC,MAAM,KAAKb,OAAOY,SAASC;IAC3BC,aAAa,KAAKd,OAAOY,SAASE,eAAe;IACjDC,KAAK,KAAKf,OAAOY,SAASG;IAC1BC,OAAO,KAAKhB,OAAOY,SAASI,SAAS,EAAA;IACvC;GACD,CAAC;AAEF,OAAKd,iBAAiB,IAAIN,4BAA4B,KAAKK,SAAS;AACpE,OAAKE,gBAAgB,IAAIR,2BAA2B,KAAKM,UAAU,KAAKgB,eAAe;AAEvF,OAAKb,SAASZ,aAAa;GACzBmB,WAAW,KAAKX,OAAOW;GACvBO,mBAAmB,KAAKjB;GACxBkB,iBAAiB;GACjBC,UAAU,KAAKC,qBAAqB;GACpCC,eAAe,KAAKC,oBAAmB;GACxC,CAAC;AAEF,OAAKC,wBAAwB;AAC7B,OAAKC,2BAA2B;;CAGlC,MAAMC,QAAQC,QAAoF;AAChG,MAAI,KAAKC,oBAAoB,aAC3B,OAAM,IAAI9B,mBAAmB,gCAAgC;AAE/D,MAAI,CAAC6B,QAAQE,OACX,OAAM,IAAI/B,mBAAmB,8BAA8B;AAG7D,QAAM,KAAKgC,YAAY;AACvB,OAAKC,OAAOC,iBAAiB;AAE7B,QAAM,KAAK5B,OAAO6B,MAAM;AAExB,OAAKC,aAAa,CACfR,QAAQ,EAAES,oBAAoB,KAAKjC,eAAekC,gBAAgB,CAAC,GAAGT,OAAO,CAAA,EAAG,CAAC,CACjFU,MAAMC,YAAY,KAAKC,iBAAiBD,QAAQ,CAAC,CACjDE,OAAOC,UAAU,KAAKC,mBAAmBD,MAAM,CAAC;;CAGrD,MAAME,aAA4B;AAChC,OAAKZ,OAAOa,oBAAoB;AAChC/C,iBAAegD,OAAO;AAEtB,MAAI,KAAKC,eAAe,KAAK7C,UAAUqC,QACrC,OAAM,KAAKrC,SAAS0C,YAAY;AAGlC,OAAKtC,SAAS;AACd,OAAK0B,OAAOgB,cAAc;;CAG5B,MAAMC,oBAAmC;AACvC,MAAI,KAAKpB,oBAAoB,eAAgB;AAE7C,QAAM,KAAKE,YAAY;AACvB,MAAI,CAAC,KAAK7B,UAAUqC,QAAS;AAC7B,MAAI,KAAKV,oBAAoB,eAAgB;EAE7C,MAAMqB,gBAAgB,KAAK/C,eAAegD,cAAc;EACxD,MAAMC,WAAW,KAAKjD,eAAekD,0BAA0BH,cAAc;AAC7E,MAAI,CAACE,SAASE,gBAAiB;AAE/B,OAAKhD,SAAS,KAAKF,cAAcmD,OAAOH,SAASE,gBAAgBE,MAAM;AACvE,OAAKxB,OAAOyB,YAAY;GACtBC,SAASN,SAASE,gBAAgBI;GAClCC,WAAWP,SAASQ,mBAAmBC,KAAKH,YAAYA,QAAQA,QAAQ;GACxEF,OAAOJ,SAASE,gBAAgBE;GACjC,CAAC;;CAGJ,MAAMM,YAAYN,OAAuE;AACvF,MAAI,CAAC,KAAKtD,SAASqC,QACjB,OAAM,IAAIxC,mBAAmB,mCAAmC;EAIlE,MAAMgE,gBADgB,KAAK5D,eAAegD,cAAc,CACpBS,mBAAmBI,MAAMN,YAAYA,QAAQF,UAAUA,MAAM;AACjG,MAAI,CAACO,cAAe;AAEpB,OAAK5D,eAAe8D,mBAAmBF,cAAc;AACrD,OAAKzD,SAAS,KAAKF,cAAcmD,OAAOC,MAAM;AAC9C,OAAKxB,OAAOkC,aAAaV,MAAM;;CAGjCW,YAAyB;AACvB,MAAI,CAAC,KAAK7D,OAAQ,OAAM,IAAIP,mBAAmB,uBAAuB;AACtE,SAAO,KAAKO;;CAGd6B,cAAqC;AACnC,SAAO,KAAKjC;;CAGd,yBAAuC;AACrC,OAAKA,SAASkE,GAAG,gBAAgBC,SAAiB,GAAG;AACrD,OAAKnE,SAASkE,GAAG,eAAe1B,UAA4B,KAAK4B,aAAa5B,MAAM,CAAC;AACrF,OAAKxC,SAASkE,GAAG,wBAAwB,KAAKE,cAAc,CAAC;AAC7D,OAAKpE,SAASkE,GAAG,iBAAiBG,YAAoB,KAAKC,eAAeD,QAAQ,CAAC;AACnF,OAAKrE,SAASkE,GAAG,oBAAoBK,aAAuB,KAAKC,kBAAkBD,SAAS,CAAC;AAC7F,OAAKvE,SAASI,QAAQ8D,GAAG,oBAAoBO,UAA0B,KAAKE,iBAAiBF,MAAM,CAAC;;CAGtG,4BAA0C;AACxC,OAAKtE,OAAOyE,gBAAgBC,UAAU;AACpC,OAAI,CAACA,MAAM7C,QAAQ,KAAKL,oBAAoB,aAC1C,MAAKG,OAAOgB,cAAc;IAE5B;;CAGJ,iBAAyBT,SAAgD;AAClE,OAAKlC,OAAO4E,OAAO;AAExB,MAAI,CAAC1C,SAAS;AACZ,QAAKP,OAAOgB,cAAc;AAC1B,QAAKkC,UAAU,IAAInF,mBAAmB,gCAAgC,CAAC;AACvE;;EAGF,MAAMmD,gBAAgB,KAAK/C,eAAegD,cAAc;AACxD,MAAI,CAACD,cAAcI,iBAAiB;AAClC,QAAKtB,OAAOgB,cAAc;AAC1B,QAAKkC,UAAU,IAAInF,mBAAmB,qBAAqB,CAAC;AAC5D;;AAGF,OAAKO,SAAS,KAAKF,cAAcmD,OAAOL,cAAcI,gBAAgBE,MAAM;AAC5E,OAAKrD,eAAe8D,mBAAmBf,cAAcI,gBAAgB;AAErE,OAAKtB,OAAOmD,UAAU;GACpBzB,SAASR,cAAcI,gBAAgBI;GACvCC,WAAWT,cAAcU,mBAAmBC,KAAKH,YAAYA,QAAQA,QAAQ;GAC7EF,OAAON,cAAcI,gBAAgBE;GACtC,CAAC;;CAGJ,mBAA2Bd,OAAsB;AAC1C,OAAKrC,OAAO4E,OAAO;AAExB,MAAI,KAAKpD,oBAAoB,aAC3B,MAAKG,OAAOgB,cAAc;AAG5B,MAAIN,iBAAiB0C,SAAS1C,MAAM2C,QAAQC,SAAS,mBAAmB,CAAE;AAE1E,OAAKJ,UAAUxC,MAAM;;CAGvB,iBAAyBiC,OAA6B;AACpDY,UAAQC,IAAI,wBAAwBb,MAAM;AAC1C,MAAI,KAAK9C,oBAAoB,aAAc;AAEtC,OAAKxB,OAAO4E,OAAO;AACxB,OAAKjD,OAAOgB,cAAc;;CAG5B,kBAA0ByB,UAA0B;AAClD,MAAI,KAAK5C,oBAAoB,YAAa;AAE1C,MAAI,CAAC4C,SAAS3C,QAAQ;AACpB,QAAKE,OAAOgB,cAAc;AAC1B;;EAGF,MAAME,gBAAgB,KAAK/C,eAAegD,cAAc;EACxD,MAAMsC,aAAahB,SAAS;EAC5B,MAAMiB,UAAUxC,cAAcU,mBAAmBI,MAAMN,YAAYA,QAAQA,YAAY+B,WAAW;AAClG,MAAI,CAACC,QAAS;AAEd,OAAK1D,OAAO2D,eAAe;GACzBjC,SAAS+B;GACT9B,WAAWT,cAAcU,mBAAmBC,KAAKH,YAAYA,QAAQA,QAAQ;GAC7EF,OAAOkC,QAAQlC;GAChB,CAAC;;CAGJ,eAAuBe,SAAuB;EAC5C,MAAMf,QAAQe;AACd,MAAI,KAAKqB,gBAAgBpC,MAAO;AAEhC,OAAKlD,SAAS,KAAKF,cAAcmD,OAAOC,MAAM;AAC9C,OAAKxB,OAAOkC,aAAaV,MAAM;;CAGjC,aAAqBd,OAAgC;AACnD,MAAIA,MAAO6C,SAAQM,KAAK,0BAA0BnD,MAAM;AACxD,OAAKpC,SAAS;AACd,OAAK0B,OAAOgB,cAAc;;CAG5B,sBAA+D;EAC7D,MAAM3B,WAA0B,EAAE;AAElC,OAAK,MAAM,CAACmC,OAAOsC,UAAUpG,cAAc,KAAKwB,eAAeU,OAAO,EAAE;AACtE,OAAI,CAACkE,MAAMC,MAAO;GAElB,MAAM,EAAEC,cAAczG,WAAWiE,MAAM;AACvC,OAAI,CAACwC,UAAW;AAEhB3E,YAAS4E,KAAK;IACZrB,IAAIsB,OAAOF,UAAU;IACrBlF,MAAMgF,MAAMhF;IACZqF,gBAAgB;IAChBC,eAAe,UAAUJ;IACzBK,gBAAgBP,MAAMO;IACtBC,SAAS,EACPC,SAAS,EAAEC,MAAM,CAAC,GAAGV,MAAMQ,QAAO,EAAE,EACtC;IACD,CAAuB;;EAG1B,MAAM,CAACG,OAAO,GAAGC,QAAQrF;AACzB,MAAI,CAACoF,MAAO,OAAM,IAAI1G,mBAAmB,8BAA8B;AACvE,SAAO,CAAC0G,OAAO,GAAGC,KAAK;;CAGzB,qBAAqE;EACnE,MAAMJ,UAAkD,EAAE;AAE1D,OAAK,MAAM,CAAC9C,OAAOsC,UAAUpG,cAAc,KAAKwB,eAAeU,OAAO,CACpE0E,SAAQ9C,SAAS,CAAC,EAAExC,KAAK8E,MAAMQ,QAAQ,IAAI,CAAC;AAG9C,SAAOA;;CAGT,IAAYzE,kBAAkB;AAC5B,SAAO,KAAKrB,MAAMqG,aAAa,CAACC,QAAQjF;;CAG1C,IAAY+D,cAAc;AACxB,SAAO,KAAKpF,MAAMqG,aAAa,CAACC,QAAQtD;;;;;ACxQ5C,IAAaoE,cAAb,MAAaA,oBAAoBF,KAA8C;;sBACL;GACtE,KAAK;GACL,KAAK;GACN;;CAIDM,YAAYC,QAAqBF,gBAAsC;AACrE,QAAME,OAAOC,OAAO;AACpB,OAAKH,iBAAiBA;;CAGxB,MAAMI,OAAOC,IAA4BC,eAAqD;AAC5F,MAAI,CAAC,KAAKE,QACR,OAAM,IAAIZ,WAAW,sBAAsB;EAI7C,MAAM,EAAEe,cAAclB,WADR,MAAM,KAAKiB,UAAU,CACI;EAEvC,MAAME,aAAaf,YAAYC,aAAaa;EAE5C,MAAMH,UAAU;GACdK,QAAQ,EAAE,GAAGR,IAAI;GACjBS,SAAS,EAAE,GAAGR,eAAeQ,SAAS;GACtCC,aAAaT,eAAeS;GAC5BC,YAAYV,eAAeU;GAC5B;AAED,MAAIJ,WACFJ,SAAQM,UAAU;GAAEG,eAAeL;GAAY,GAAGJ,QAAQM;GAAS;EAGrE,MAAMI,eAAe,MAAM,KAAKV,QAAQW,mBAAmBX,UAAUY,UACnE,YAAYA,MAAMC,OAAOD,QAAQE,KAAAA,EAClC;AAED,MAAI,CAACJ,cAAcK,QACjB,OAAM,IAAI3B,WAAW,sBAAsB;EAI7C,MAAM8B,QADU,MAAMR,aAAaO,WACdjB,SAASmB,UAAUD;AAExC,MAAI,CAACA,KACH,OAAM,IAAI9B,WAAW,sBAAsB;AAG7C,SAAO8B;;CAGT,MAAMhB,WAA+B;EACnC,MAAMkB,YAAa,MAAM,KAAKC,KAAKD;AACnC,SAAO,KAAKE,eAAeF,UAAU;;CAGvC,MAAMG,YAA2B;AAC/B,QAAM,MAAMC,QAAQ;;CAGtB,MAAMC,WAAWC,SAAkC;AAEjD,UADqB,MAAM,KAAKE,iBAAiB,EAC7BH,WAAWC,QAAQ;;CAGzC,MAAMG,uBAAuBH,SAAmC;AAE9D,UADqB,MAAM,KAAKE,iBAAiB,EAC7BC,uBAAuBH,QAAQ;;CAGrD,MAAMI,qBAAqBJ,SAAmC;AAE5D,UADqB,MAAM,KAAKE,iBAAiB,EAC7BE,qBAAqBJ,QAAQ;;CAGnD,MAAME,kBAAuC;EAC3C,MAAM3B,QAAQ,MAAM,KAAKC,UAAU;AAEnC,SAAO,IAAIhB,WADG,KAAKM,eAAewC,aAAa/B,MAAM,CACzB;;CAG9B,eAAsBmB,WAAuC;AAC3D,SAAO,QAAQA;;;;;AC3FnB,IAAaqB,iBAAb,cAAoCH,cAAmD;CAKrFM,YAAYC,OAAoBH,QAA8B;AAC5D,QAAMG,OAAOH,OAAO;AACpB,OAAKA,SAASA;;CAGhB,MAAgBI,eAA8B;AAC5C,OAAKH,SAAS,IAAIH,YAAY,EAAEQ,QAAQ,KAAKN,OAAOM,QAAQ,EAAE,KAAKC,eAAe;AAElF,OAAKN,OAAOO,GAAG,eAAe,KAAKC,SAAS,CAAC;AAC7C,OAAKR,OAAOO,GAAG,iBAAiB;AACzB,QAAKE,WAAW,CAACC,OAAOC,UAAU,KAAKC,UAAUD,MAAM,CAAC;IAC7D;AACF,OAAKX,OAAOO,GAAG,UAAUI,UAAU,KAAKE,QAAQF,MAAM,CAAC;AACvD,OAAKX,OAAOO,GAAG,gBAAgB,KAAKO,UAAU,CAAC;AAC/C,OAAKd,OAAOO,GAAG,mBAAmB,KAAKO,UAAU,CAAC;AAClD,OAAKd,OAAOO,GAAG,kBAAkBQ,UAAUA,MAAMC,WAAW,KAAKC,gBAAgBF,MAAMC,QAAQ,CAAC;;;;;;CAOlG,MAAME,oBAAmC;CAEzC,MAAMC,QAAQC,SAA4E;AACxF,MAAI,KAAKC,oBAAoB,aAC3B,OAAM,IAAIzB,WAAW,gCAAgC;AAGvD,QAAM,KAAK0B,YAAY;AACvB,OAAKC,OAAOC,iBAAiB;AAM7B,OAAKC,WAAW,CACbC,WAAW,CACXhB,OAAOC,UAAmB,KAAKC,UAAUD,MAAM,CAAC;;CAGrD,MAAMgB,aAA4B;AAChC,OAAKJ,OAAOK,oBAAoB;AAEhC,MAAI,KAAKC,YACP,OAAM,KAAK7B,OAAO8B,QAAQ,CAACpB,OAAOC,UAAU;AAC1C,SAAM,IAAIf,WAAW,4BAA4Be,MAAM;IACvD;AAGJ,OAAKoB,qBAAqB;AAC1B,OAAKR,OAAOS,cAAc;;CAG5B,MAAeC,YAAYC,QAA+D;AACxF,QAAM,IAAItC,WAAW,+BAA+B;;CAGtD6B,YAAyB;AACvB,SAAO,KAAKzB;;CAGdmC,cAA6B;AAC3B,SAAO,KAAKnC;;CAGd,UAAwB;AACtB,MAAI,KAAKqB,oBAAoB,eAAe,CAAC,KAAKe,YAAY,CAC5D,MAAKb,OAAOS,cAAc;;CAI9B,MAAcvB,YAA2B;EACvC,MAAMT,SAAS,KAAKyB,WAAW;EAC/B,MAAMY,UAAU,MAAMrC,OAAOsC,KAAKC;AAGlC,MAAI,CAFc,MAAMvC,OAAOsC,KAAKE,UAEpB,OAAM,IAAI5C,WAAW,wBAAwB;AAC7D,MAAI,CAACyC,QAAS,OAAM,IAAIzC,WAAW,qBAAqB;EAExD,MAAM6C,QAAQ,MAAMzC,OAAO0C,UAAU;EACrC,MAAMC,cAAc,KAAKtB,oBAAoB;EAE7C,MAAMuB,YAAY;GAAEP;GAASQ,WAAW,CAACR,QAAQ;GAAEI;GAAO;AAC1DE,gBAAc,KAAKpB,OAAOuB,YAAYF,UAAU,GAAG,KAAKrB,OAAOwB,UAAUH,UAAU;;CAGrF,QAAgBjC,OAAsB;AACpC,MAAI,KAAKU,oBAAoB,aAC3B,MAAKE,OAAOS,cAAc;AAE5B,OAAKpB,UAAUD,MAAM;;CAGvB,WAAyB;AACvB,MAAI,KAAKU,oBAAoB,YAC3B,MAAKE,OAAOS,cAAc;;CAI9B,gBAAwBhB,SAAuB;EAC7C,MAAMwB,YAAYxB,YAAY,MAAM,IAAI;EACxC,MAAMyB,QAAQ,KAAKhB,WAAW,CAACuB,eAAeR,UAAU;AAExD,MAAI,KAAKS,gBAAgBR,MACvB,MAAKlB,OAAO2B,aAAaT,MAAM;;CAInC,aAA8B;AAC5B,SAAO,KAAKZ,cAAc,CAAC,CAAC,KAAK7B,OAAOmD,QAAQC,OAAO;;CAGzD,IAAY/B,kBAAkB;AAC5B,SAAO,KAAKnB,MAAMmD,aAAa,CAACC,QAAQjC;;CAG1C,IAAY4B,cAAc;AACxB,SAAO,KAAK/C,MAAMmD,aAAa,CAACC,QAAQb;;;;;ACjH5C,MAAM4B,mBAAmC;CACvCC,MAAM;CACNC,KAAK,OAAOC,WAAW,cAAcA,OAAOC,SAASC,SAAS;CAC/D;AASD,IAAaO,mBAAb,MAA8B;CAC5B,OAAOC,OAA6BC,SAAkD;EACpF,MAAM,EAAEP,YAAYE,OAAOC,gBAAgBC,kBAAkBG;EAC7D,MAAMC,WAAWJ,cAAcI,YAAYf;AAE3C,UAAQO,YAAR;GACE,KAAK,WACH,QAAO,IAAIX,kBAAkBa,OAAO;IAClCF,YAAY;IACZQ;IACAL;IACD,CAAC;GAEJ,KAAK,iBAEH,QAAO,IAAIb,uBAAuBY,OAAO;IACvCF,YAAY;IACZQ;IACAL;IACAO,WALgBN,cAKKM;IACtB,CAAC;GAGJ,KAAK,SACH,QAAO,IAAItB,gBAAgBc,OAAO;IAChCF,YAAY;IACZQ;IACAL;IACD,CAAC;GAEJ,KAAK,QAEH,QAAO,IAAIZ,eAAeW,OAAO;IAC/BF,YAAY;IACZQ;IACAL;IACAS,QALmBR,cAKEQ;IACtB,CAAC;GAGJ,KAAK,QACH,QAAO,IAAIzB,eAAee,OAAO;IAC/BF,YAAY;IACZQ;IACAL;IACD,CAAC;GAEJ,QACE,OAAM,IAAIU,MAAM,wBAAwBb,aAAa;;;;;;AC7D7D,MAAa4B,8BAAoDC,WAAgC;AAK/F,QAAOX,YAA4F;EACjGQ,SAAS,EAAEN,SALUH,kBACrBe,MAAMC,KAAKJ,OAAOK,SAAS,CAAC,CAACC,KAAK,CAACC,MAAMC,WAAW,CAACD,MAAMC,MAAMC,aAAa,CAACZ,QAAQ,CACzF,CAAC,EAGqC;EACpCa,IAAI,EACFf,gBAAgBgB,OAAO,EAAEf,YAAYC,eAAe,EAClDN,SAAS;GACP,GAAGoB,MAAMpB;IACRK,aAAaC;GAChB,EACD,GACH;EACD,CAAC;;;;AC2CJ,MAAMyD,gBAA6B;CACjCvB,iBAAiB;CACjBC,eAAeuB,KAAAA;CACftB,oBAAoB,EAAE;CACtBL,OAAO2B,KAAAA;CACPpB,OAAOoB,KAAAA;CACR;AAED,MAAaC,qBAAqBT,eAA2B;AAC3D,QAAO9B,YAAsE;EAC3EwC,SAASH;EACTI,IAAI;GACFrB,kBAAkBoB,aAAa;IAC7B,GAAGA;IACH1B,iBAAiB;IAClB;GACDQ,wBAAwBkB,SAAS,EAAEzB,eAAeC,oBAAoBL,SAAS+B,YAAY;AACzFA,YAAQC,KAAKd,gBAAgB;KAC3Bd;KACAC;KACAL;KACAmB;KACAC,aAAa;KACd,CAAC;AAEF,WAAO;KACL,GAAGS;KACH1B,iBAAiB;KACjBC;KACAC;KACAL;KACAO,OAAOoB,KAAAA;KACR;;GAEHf,qBAAqBiB,SAAS,EAAEzB,eAAeC,oBAAoBL,SAAS+B,YAAY;AACtFA,YAAQC,KAAKd,gBAAgB;KAC3Bd;KACAC;KACAL;KACAmB;KACAC,aAAa;KACd,CAAC;AAEF,WAAO;KACL,GAAGS;KACH1B,iBAAiB;KACjBC;KACAC;KACAL;KACAO,OAAOoB,KAAAA;KACR;;GAEHpB,QAAQsB,SAAS,EAAEtB,SAASwB,YAAY;AACtCA,YAAQC,KAAKV,YAAY;KACvBf;KACAY;KACD,CAAC;AAEF,WAAO;KACL,GAAGU;KACH1B,iBAAiB;KACjBI;KACD;;GAEHM,qBAAqBgB,aAAa;IAChC,GAAGA;IACH1B,iBAAiB;IAClB;GACDW,eAAee,SAASI,GAAGF,YAAY;AACrCA,YAAQC,KAAKX,mBAAmB,EAC9BF,YACD,CAAC;AAEF,WAAO;KACL,GAAGU;KACH1B,iBAAiB;KACjBC,eAAeuB,KAAAA;KACftB,oBAAoB,EAAE;KACtBL,OAAO2B,KAAAA;KACPpB,OAAOoB,KAAAA;KACR;;GAEHZ,eAAec,SAAS,EAAE7B,SAAS+B,YAAY;AAC7CA,YAAQC,KAAKT,mBAAmB;KAC9BvB;KACAmB;KACD,CAAC;AAEF,WAAO;KACL,GAAGU;KACH7B;KACD;;GAEHgB,iBAAiBa,SAAS,EAAEzB,eAAeC,sBAAsB0B,YAAY;AAC3EA,YAAQC,KAAKR,qBAAqB;KAChCpB;KACAe;KACD,CAAC;AAEF,WAAO;KACL,GAAGU;KACHxB;KACAD;KACD;;GAEL;EACD,CAAC;;;;ACrKJ,IAAamD,aAAb,MAAwB;CAStBS,YAAYC,SAA4BC,WAAuD;gCARvC,IAAIT,KAAK;oCACJ,IAAIA,KAAK;uBAI9B,EAAE;iBACxB;AAGhB,OAAKG,iBAAiB,IAAIZ,eAAeiB,QAAQ;AACjD,OAAKJ,SAASI,QAAQJ,UAAU,EAAE;AAElC,OAAK,MAAM,CAACO,YAAYC,kBAAkBjB,cAAca,QAAQK,QAAQ,EAAE;AACxE,OAAI,CAACD,cAAe;GAEpB,MAAME,QAAQH;GACd,MAAMI,QAAQrB,kBAAkBoB,MAAM;AACtC,QAAKf,OAAOiB,IAAIF,OAAOC,MAAM;AAE7B,OAAIN,UACFM,OAAME,QAAQR,UAAUQ,QAAQ;GAGlC,MAAMC,iBAAiB,KAAKf,eAAegB,iBAAiBL,MAAM;GAClE,MAAMM,YAAY5B,iBAAiB6B,OAAO;IACxCV,YAAYG;IACZC;IACAG;IACAN;IACD,CAAC;AACF,QAAKX,WAAWe,IAAIF,OAAOM,UAAU;AAErC,QAAKE,wBAAwBR,MAAM;;AAGrC,OAAKZ,iBAAiBT,2BAA2B,KAAKM,OAAO;AAE7D,OAAK,MAAM,CAACY,YAAYI,UAAU,KAAKhB,OACrC,MAAKwB,sBAAsBZ,YAAYI,MAAM;AAG/C,MAAIN,UACF,MAAKP,eAAee,QAAQR,UAAUQ,QAAQ;;CAIlD,MAAMO,QAAuB;AAC3B,MAAI,KAAKlB,QAAS;AAClB,OAAKA,UAAU;EAEf,MAAMoB,UAAU,MAAMD,QAAQE,WAC5BC,MAAMC,KAAK,KAAK5B,WAAW6B,SAAS,CAAC,CAACC,IAAI,OAAO,CAACpB,YAAYS,eAAe;AAC3E,SAAMA,UAAUY,YAAY;AAC5B,SAAMZ,UAAUa,mBAAmB;AACnC,UAAOtB;IAEX,CAAC;AAED,OAAK,MAAMuB,UAAUR,QACnB,KAAIQ,OAAOC,WAAW,WACpBC,SAAQC,KAAK,2CAA2CH,OAAOI,OAAO;;CAK5E,MAAMC,WAAW5B,YAAuC;EACtD,MAAMS,YAAY,KAAKnB,WAAWuC,IAAI7B,WAAW;AACjD,MAAI,CAACS,UACH,OAAM,IAAIqB,MAAM,WAAW9B,WAAU,qBAAsB;AAE7D,QAAMS,UAAUmB,YAAY;;CAG9B,MAAMG,gBAA+B;EACnC,MAAMC,qBAAqBf,MAAMC,KAAK,KAAK5B,WAAW2C,QAAQ,CAAC,CAACb,IAAI,OAAOX,cAAcA,UAAUmB,YAAY,CAAC;AAChH,QAAMd,QAAQoB,IAAIF,mBAAmB;;;;;;;;;;;;CAavC,MAAMG,QAAQC,MAAwC;AACpD,UAAQA,KAAKC,QAAb;GACE,KAAK,iBAEH,QADkB,KAAKC,aAAa,iBAAiB,CACpCH,QAAQC,KAAKG,OAAO;GAEvC,KAAK,WAEH,QADkB,KAAKD,aAAa,WAAW,CAC9BH,QAAQC,KAAKI,MAAM;GAEtC,KAAK,SAEH,QADkB,KAAKF,aAAa,SAAS,CAC5BH,QAAQC,KAAKI,OAAOJ,KAAKvC,QAAQ;GAEpD,KAAK,QAEH,QADkB,KAAKyC,aAAa,QAAQ,CAC3BH,SAAS;GAE5B,KAAK,QAEH,QADkB,KAAKG,aAAa,QAAQ,CAC3BH,SAAS;;;CAKhCM,oBAA0C;AACxC,SAAO,KAAKlD;;CAGdmD,iBAA+B;AAC7B,SAAOzB,MAAMC,KAAK,KAAK9B,OAAOuD,MAAM,CAAC;;CAGvCL,aAAmCtC,YAAqC;EACtE,MAAMS,YAAY,KAAKnB,WAAWuC,IAAI7B,WAAW;AACjD,MAAI,CAACS,UACH,OAAM,IAAIqB,MAAM,WAAW9B,WAAU,qBAAsB;AAE7D,SAAOS;;CAGToC,cACE7C,YACA8C,WACAE,UAC0B;EAC1B,MAAM5C,QAAQ,KAAKhB,OAAOyC,IAAI7B,WAAW;AACzC,MAAI,CAACI,MAAO,QAAO+C,KAAAA;AACnB,SAAO/C,MAAMgD,GAAGN,WAAWE,SAAgD;;CAG7EK,oBAAoC;AAClC,SAAO,KAAK7D;;;CAId8D,mBAAmBC,OAAuB;EACxC,MAAMrD,UAAU,KAAKX,eAAeiE,aAAa,CAACC,QAAQvD;AAC1D,SAAOjB,aAAaiB,QAAQ,CAACwD,MAAMC,UAAUA,MAAMC,oBAAoB,eAAeD,MAAMJ,UAAUA,MAAM;;CAG9G,wBAAgCvD,YAA8B;EAC5D,MAAMI,QAAQ,KAAKhB,OAAOyC,IAAI7B,WAAW;AACzC,MAAI,CAACI,MAAO;AAEZ,OAAKV,cAAcmE,KACjBzD,MAAMgD,GAAG,oBAAoBH,UAAU;AACrC,QAAKxD,OAAOqE,YAAY;IACtB9D;IACAuD,OAAON,MAAMM;IACbQ,SAASd,MAAMe;IACfC,oBAAoBhB,MAAMgB;IAC1BC,aAAajB,MAAMiB;IACpB,CAAC;IAEN,CAAC;AAED,OAAKxE,cAAcmE,KACjBzD,MAAMgD,GAAG,4BAA4B;AACnC,QAAK3D,OAAO0E,eAAe,EAAEnE,YAAY,CAAC;IAE9C,CAAC;AAED,OAAKN,cAAcmE,KACjBzD,MAAMgD,GAAG,gBAAgBH,UAAU;AACjC,QAAKxD,OAAO2E,UAAU;IACpBpE;IACAqE,OAAO,IAAIvC,MAAMmB,MAAMoB,MAAMC,QAAO;IACrC,CAAC;IAEN,CAAC;AAED,OAAK5E,cAAcmE,KACjBzD,MAAMgD,GAAG,uBAAuBH,UAAU;AACxC,QAAKxD,OAAO8E,iBAAiB;IAC3BvE;IACAuD,OAAON,MAAMM;IACd,CAAC;IAEN,CAAC;;CAGH,sBAA8BvD,YAAwBI,OAA0B;EAC9E,MAAMoE,aAAa;AACjB,QAAKjF,eAAekF,KAAK;IACvBvB,MAAM;IACNlD;IACAyD,SAASrD,MAAMoD,aAAa,CAACC;IAC9B,CAAC;;AAGJe,QAAM;AACN,OAAK9E,cAAcmE,KAAKzD,MAAMsE,UAAUF,KAAK,CAAC"}
|