btc-wallet 0.5.73-beta → 0.5.75-beta
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/setupModal.d.ts +1 -0
- package/dist/index.js +6 -4
- package/dist/index.js.map +2 -2
- package/esm/index.js +6 -4
- package/esm/index.js.map +2 -2
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
2
|
"version": 3,
|
3
3
|
"sources": ["../src/index.ts", "../src/connector/base.ts", "../src/utils/index.ts", "../src/utils/Dialog.ts", "../src/connector/universalLink.ts", "../src/connector/injected.ts", "../src/connector/bitget.ts", "../src/connector/bybit.ts", "../src/connector/okx.ts", "../src/connector/tokenPocket.ts", "../src/connector/unisat.ts", "../src/connector/wizz.ts", "../src/connector/xverse.ts", "../src/connector/magicEden.ts", "../src/connector/binance.ts", "../src/connector/gate.ts", "../src/context/index.tsx", "../src/components/connectModal/index.tsx", "../src/hooks/useAccountContract.ts", "../src/hooks/useAccounts.ts", "../src/hooks/useBTCProvider.ts", "../src/hooks/useConnectModal.ts", "../src/hooks/useConnector.ts", "../src/hooks/useETHProvider.ts", "../src/evmSigner/provider.ts", "../src/utils/eventUtils.ts", "../src/utils/txConfirmUtils.ts", "../src/evmSigner/walletClientProvider.ts", "esbuild-scss-modules-plugin:./spinner.module.scss", "../src/components/spinner/index.tsx", "esbuild-scss-modules-plugin:./button.module.scss", "../src/components/button/index.tsx", "../src/components/modal/index.tsx", "esbuild-scss-modules-plugin:./modal.module.scss", "esbuild-scss-modules-plugin:./connect.module.scss", "../src/components/signModal/index.tsx", "../src/utils/ethereumUtils.ts", "../src/components/copyText/index.tsx", "esbuild-scss-modules-plugin:./copyText.module.scss", "../src/components/transactionDetails/index.tsx", "esbuild-scss-modules-plugin:./tooltip.module.scss", "../src/components/tooltip/index.tsx", "esbuild-scss-modules-plugin:./transactionDetails.module.scss", "esbuild-scss-modules-plugin:./sign.module.scss", "../src/evmSigner/index.ts", "../src/hooks/useModalStateValue.ts", "../src/core/btcWalletSelectorContext.tsx", "../src/components/confirmBox/Modal.tsx", "../src/components/confirmBox/index.tsx", "../src/config.ts", "../src/core/btcUtils.ts", "../src/utils/nearUtils.ts", "../src/utils/request.ts", "../src/utils/satoshi.ts", "../src/core/setupBTCWallet/state.ts", "../src/utils/initWalletButton.ts", "../src/core/setupBTCWallet/index.ts", "../src/core/setupModal.ts"],
|
4
|
-
"sourcesContent": ["export * from './connector';\nexport { ConnectProvider } from './context';\nexport * from './hooks';\nexport * from './core/btcWalletSelectorContext';\nexport * from './core/setupBTCWallet/index';\nexport * from './core/btcUtils';\nexport * from './config';\nexport * from './core/setupModal';\nexport const getVersion = () => {\n return '0.5.73-beta';\n};\n\nif (typeof window !== 'undefined') {\n (window as any).__BTC_WALLET_VERSION = getVersion();\n}\n", "export interface WalletMetadata {\n id: string;\n name: string;\n icon: string;\n downloadUrl: string;\n}\n\nexport abstract class BaseConnector {\n abstract readonly metadata: WalletMetadata;\n abstract isReady(): boolean;\n abstract requestAccounts(): Promise<string[]>;\n abstract getAccounts(): Promise<string[]>;\n abstract getPublicKey(): Promise<string>;\n abstract signMessage(signStr: string, type?: 'ecdsa' | 'bip322-simple'): Promise<string>;\n abstract on(event: string, handler: (data?: any) => void): void;\n abstract removeListener(event: string, handler: (data?: any) => void): void;\n [key: string]: any;\n abstract getProvider(): any;\n abstract getNetwork(): Promise<'livenet' | 'testnet'>;\n abstract switchNetwork(network: 'livenet' | 'testnet'): Promise<void>;\n abstract sendBitcoin(\n toAddress: string,\n satoshis: number,\n options?: { feeRate: number },\n ): Promise<string>;\n abstract sendInscription(\n address: string,\n inscriptionId: string,\n options?: { feeRate: number },\n ): Promise<{ txid: string }>;\n abstract disconnect(): void;\n}\n", "import type { AAOptions } from '@particle-network/aa';\n\nexport function shortString(str: any): string {\n if (Array.isArray(str)) {\n str = '[' + str.toString() + ']';\n }\n if (str) {\n if (typeof str.toString === 'function') {\n str = str.toString();\n }\n if (str.length <= 10) {\n return str;\n }\n return `${str.slice(0, 5)}...${str.slice(str.length - 5, str.length)}`;\n }\n return '';\n}\n\nexport async function copyToClipboard(text: string) {\n const clipboardCopy = async () => {\n if (navigator.clipboard) {\n return navigator.clipboard.writeText(text);\n } else {\n const textarea = document.createElement('textarea');\n textarea.value = text;\n textarea.setAttribute('readonly', '');\n textarea.style.position = 'absolute';\n textarea.style.left = '-9999px';\n document.body.appendChild(textarea);\n\n textarea.select();\n const result = document.execCommand('copy');\n\n document.body.removeChild(textarea);\n\n if (!result) {\n throw new Error('Copy to clipboard failed');\n }\n }\n };\n\n return new Promise((resolve, reject) => {\n clipboardCopy().then(resolve).catch(reject);\n });\n}\n\nexport const defaultTokenIcon =\n 'https://static.particle.network/token-list/defaultToken/default.png';\n\nexport const ipfsToSrc = (ipfs: string) => {\n if (!ipfs || !ipfs.startsWith('ipfs://')) {\n return ipfs || '';\n }\n\n return `https://ipfs.particle.network/${encodeURI(ipfs.slice(7))}`;\n};\n\nexport const checkBTCVersion = (\n accountContracts: AAOptions['accountContracts'],\n accountContractKey: string,\n version: string,\n) => {\n if (!accountContracts[accountContractKey]) {\n return false;\n }\n return accountContracts[accountContractKey].some((item) => item.version === version);\n};\n\nexport const delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\nexport async function retryOperation<T>(\n operation: () => Promise<T> | T,\n shouldStop: (result: T) => boolean,\n {\n maxRetries = 3,\n delayMs = 1000,\n }: {\n maxRetries?: number;\n delayMs?: number;\n } = {},\n): Promise<T> {\n let retries = 0;\n\n while (retries <= maxRetries) {\n const result = await operation();\n if (shouldStop(result)) {\n return result;\n }\n if (retries === maxRetries) {\n console.warn('Max retries reached');\n return result;\n }\n retries++;\n await delay(delayMs);\n }\n throw new Error('Unexpected execution path');\n}\n\nexport function toHex(originalString: string) {\n const charArray = originalString.split('');\n const asciiArray = charArray.map((char) => char.charCodeAt(0));\n const hexArray = asciiArray.map((code) => code.toString(16));\n let hexString = hexArray.join('');\n hexString = hexString.replace(/(^0+)/g, '');\n return hexString;\n}\n\nexport function isMobile(): boolean {\n if (typeof window !== 'undefined') {\n return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\n navigator?.userAgent,\n );\n }\n return false;\n}\n\nexport function safeJSONParse<T>(str: string): T | undefined {\n try {\n return JSON.parse(str) as T;\n } catch (e) {\n console.error('safeJSONParse', e);\n return undefined;\n }\n}\n\nexport function safeJSONStringify(obj: any): string | undefined {\n try {\n return JSON.stringify(obj);\n } catch (e) {\n console.error('safeJSONStringify', e);\n return undefined;\n }\n}\n\nexport function storageStore(namespace?: string, options?: { storage?: Storage }) {\n if (typeof window === 'undefined') return;\n const _namespace = namespace || 'SATOSHI_WALLET_DEFAULT';\n const storage = options?.storage || window?.localStorage;\n const namespaceKey = (key: string) => {\n return _namespace + ':' + key;\n };\n return {\n set(key: string, value: any) {\n const _value = safeJSONStringify(value);\n _value ? storage.setItem(namespaceKey(key), _value) : storage.removeItem(namespaceKey(key));\n },\n get<T>(key: string) {\n const _value = storage.getItem(namespaceKey(key));\n return _value ? safeJSONParse<T>(_value) : undefined;\n },\n remove(key: string) {\n storage.removeItem(namespaceKey(key));\n },\n clearAll: function clearAll() {\n for (const key in storage) {\n if (key.startsWith(namespace + ':')) {\n storage.removeItem(key);\n }\n }\n },\n };\n}\n", "interface DialogOptions {\n title: string;\n message: string;\n dangerouslyUseHTML?: boolean;\n closable?: boolean;\n}\n\nexport class Dialog {\n private static template = `\n <div class=\"dialog-overlay\">\n <div class=\"dialog-container\">\n <div class=\"dialog-content\">\n <div class=\"dialog-title\"></div>\n <div class=\"dialog-message\"></div>\n <div class=\"dialog-buttons\">\n <button class=\"dialog-cancel-btn\">Cancel</button>\n <button class=\"dialog-confirm-btn\">OK</button>\n </div>\n </div>\n </div>\n </div>\n `;\n\n private static style = `\n .dialog-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: rgba(0, 0, 0, 0.75);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 999999;\n backdrop-filter: blur(4px);\n }\n .dialog-container {\n background: #131313;\n border-radius: 12px;\n padding: 24px;\n width: 350px;\n box-shadow: 0 4px 24px rgba(0, 0, 0, 0.3);\n }\n .dialog-title {\n font-size: 18px;\n font-weight: 600;\n margin-bottom: 16px;\n color: #ffffff;\n }\n .dialog-message {\n margin-bottom: 24px;\n line-height: 1.6;\n color: rgba(255, 255, 255, 0.8);\n font-size: 14px;\n }\n .dialog-buttons {\n display: flex;\n justify-content: flex-end;\n gap: 12px;\n }\n .dialog-alert .dialog-buttons {\n justify-content: center;\n }\n .dialog-confirm-btn {\n padding: 8px 24px;\n background-color: #ff7a00;\n color: white;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n font-size: 14px;\n font-weight: 500;\n transition: all 0.2s ease;\n }\n .dialog-confirm-btn:hover {\n background-color: #ff8f1f;\n transform: translateY(-1px);\n }\n .dialog-confirm-btn:active {\n transform: translateY(0);\n }\n .dialog-cancel-btn {\n padding: 8px 24px;\n background-color: rgba(255, 255, 255, 0.1);\n color: rgba(255, 255, 255, 0.8);\n border: none;\n border-radius: 6px;\n cursor: pointer;\n font-size: 14px;\n font-weight: 500;\n transition: all 0.2s ease;\n }\n .dialog-cancel-btn:hover {\n background-color: rgba(255, 255, 255, 0.15);\n transform: translateY(-1px);\n }\n .dialog-cancel-btn:active {\n transform: translateY(0);\n }\n \n .dialog-overlay {\n animation: fadeIn 0.2s ease;\n }\n .dialog-container {\n animation: slideIn 0.2s ease;\n }\n @keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n }\n @keyframes slideIn {\n from {\n transform: translateY(-20px);\n opacity: 0;\n }\n to {\n transform: translateY(0);\n opacity: 1;\n }\n }\n .option-list {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n .option-item {\n display: flex;\n align-items: center;\n gap: 12px;\n color: #fff;\n border: 1px solid transparent;\n background-color: hsla(0, 0%, 100%, .05);\n border-radius: 8px;\n padding: 8px 16px;\n transition: all 0.15s ease;\n cursor: pointer;\n font-size: 14px;\n font-weight: bold;\n &:hover {\n border-color: #ff7a00;\n color: #ff7a00;\n background-color: hsla(0, 0%, 100%, .08);\n }\n }\n `;\n\n private static injectStyles() {\n if (!document.querySelector('#dialog-styles')) {\n const styleSheet = document.createElement('style');\n styleSheet.id = 'dialog-styles';\n styleSheet.textContent = this.style;\n document.head.appendChild(styleSheet);\n }\n }\n\n static confirm(options: { title?: string; message: string }): Promise<boolean> {\n return new Promise((resolve) => {\n this.injectStyles();\n\n const container = document.createElement('div');\n container.innerHTML = this.template;\n document.body.appendChild(container);\n\n const titleEl = container.querySelector('.dialog-title') as HTMLElement;\n const messageEl = container.querySelector('.dialog-message') as HTMLElement;\n const confirmBtn = container.querySelector('.dialog-confirm-btn') as HTMLElement;\n const cancelBtn = container.querySelector('.dialog-cancel-btn') as HTMLElement;\n\n if (options.title) {\n titleEl.textContent = options.title;\n } else {\n titleEl.style.display = 'none';\n }\n messageEl.textContent = options.message;\n\n const cleanup = () => {\n document.body.removeChild(container);\n };\n\n confirmBtn.addEventListener('click', () => {\n cleanup();\n resolve(true);\n });\n\n cancelBtn.addEventListener('click', () => {\n cleanup();\n resolve(false);\n });\n });\n }\n\n static alert(options: DialogOptions) {\n const messageEl = options.dangerouslyUseHTML\n ? { dangerouslySetInnerHTML: { __html: options.message } }\n : { children: options.message };\n\n return new Promise<void>((resolve) => {\n this.injectStyles();\n\n const container = document.createElement('div');\n container.innerHTML = this.template;\n container.querySelector('.dialog-overlay')?.classList.add('dialog-alert');\n\n if (options.closable === false) {\n const overlay = container.querySelector('.dialog-overlay') as HTMLElement;\n overlay.style.pointerEvents = 'none';\n const dialogContainer = container.querySelector('.dialog-container') as HTMLElement;\n dialogContainer.style.pointerEvents = 'auto';\n }\n\n document.body.appendChild(container);\n\n const titleEl = container.querySelector('.dialog-title') as HTMLElement;\n const messageEl = container.querySelector('.dialog-message') as HTMLElement;\n const confirmBtn = container.querySelector('.dialog-confirm-btn') as HTMLElement;\n const cancelBtn = container.querySelector('.dialog-cancel-btn') as HTMLElement;\n\n if (options.title) {\n titleEl.textContent = options.title;\n } else {\n titleEl.style.display = 'none';\n }\n messageEl.innerHTML = options.message;\n cancelBtn.style.display = 'none';\n\n if (options.closable === false) {\n confirmBtn.style.display = 'none';\n }\n\n const cleanup = () => {\n if (options.closable === false) {\n return;\n }\n document.body.removeChild(container);\n };\n\n confirmBtn.addEventListener('click', () => {\n cleanup();\n resolve();\n });\n });\n }\n\n static openModal<T>({\n title,\n titleStyle,\n content,\n }: {\n title: string;\n titleStyle?: string;\n content: (resolve: (value: T) => void, close: () => void) => HTMLElement;\n }): Promise<T> {\n return new Promise((resolve) => {\n const modalContainer = document.createElement('div');\n modalContainer.innerHTML = this.template;\n document.body.appendChild(modalContainer);\n\n const btns = modalContainer.querySelector('.dialog-buttons') as HTMLElement;\n btns.style.display = 'none';\n\n this.injectStyles();\n\n const titleEl = modalContainer.querySelector('.dialog-title') as HTMLElement;\n\n if (title) {\n titleEl.textContent = title;\n if (titleStyle) {\n titleEl.style.cssText = titleStyle;\n }\n } else {\n titleEl.style.display = 'none';\n }\n\n const cleanup = () => {\n document.body.removeChild(modalContainer);\n };\n\n const close = () => {\n cleanup();\n resolve(null as T);\n };\n\n const messageEl = modalContainer.querySelector('.dialog-message') as HTMLElement;\n messageEl.appendChild(content(resolve, close));\n\n const overlay = modalContainer.querySelector('.dialog-overlay') as HTMLElement;\n overlay.addEventListener('click', (e) => {\n if (e.target === overlay) {\n close();\n }\n });\n });\n }\n}\n", "import { isMobile } from '../utils';\nimport { Dialog } from '../utils/Dialog';\n\nexport interface WalletConnectHelper {\n getUniversalLink(url: string): string;\n isWalletInstalled(): boolean;\n}\n\nexport class MobileWalletConnect {\n static getUniversalLink(walletId: string, url: string): string {\n switch (walletId) {\n case 'okx':\n return `okx://wallet/dapp/url?dappUrl=${encodeURIComponent(url)}`;\n case 'bitget':\n return `bitkeep://bkconnect?action=dapp&url=${encodeURIComponent(url)}`;\n case 'xverse':\n return `xverse://browser?url=${encodeURIComponent(url)}`;\n default:\n return '';\n }\n }\n\n static async redirectToWallet(walletId: string) {\n if (isMobile()) {\n const currentUrl = window.location.href;\n const universalLink = this.getUniversalLink(walletId, currentUrl);\n\n const showGuideDialog = async () => {\n try {\n await navigator.clipboard?.writeText(currentUrl);\n } catch (error) {\n console.error(error);\n }\n\n await Dialog.alert({\n title: 'Open in Wallet Browser',\n message: `\n <div style=\"display: flex; flex-direction: column; gap: 12px;\">\n <p>Please follow these steps:</p>\n <p>1. Open ${walletId} wallet app</p>\n <p>2. Find the browser feature in the wallet</p>\n <p>3. Paste the URL (already copied to clipboard)</p>\n </div>\n `,\n dangerouslyUseHTML: true,\n });\n };\n\n if (!universalLink) {\n await showGuideDialog();\n return false;\n }\n\n const openWallet = () => {\n const iframe = document.createElement('iframe');\n iframe.style.display = 'none';\n iframe.src = universalLink;\n document.body.appendChild(iframe);\n\n setTimeout(async () => {\n document.body.removeChild(iframe);\n await showGuideDialog();\n }, 2000);\n };\n\n window.location.href = universalLink;\n setTimeout(openWallet, 100);\n return true;\n }\n return false;\n }\n}\n", "import { isMobile } from '../utils';\nimport { BaseConnector } from './base';\nimport { MobileWalletConnect } from './universalLink';\n\nexport abstract class InjectedConnector extends BaseConnector {\n constructor(private propertity: string) {\n super();\n const props = this.propertity?.split('.');\n if (!this.propertity || props.length > 2) {\n throw new Error('please input valid propertity');\n }\n }\n isReady(): boolean {\n if (typeof window !== 'undefined') {\n const props = this.propertity.split('.');\n if (props.length === 1) {\n if (typeof (window as any)[props[0]] !== 'undefined') {\n return true;\n }\n } else {\n if (\n typeof (window as any)[props[0]] !== 'undefined' &&\n typeof (window as any)[props[0]][props[1]] !== 'undefined'\n ) {\n return true;\n }\n }\n if (isMobile()) {\n return true;\n }\n }\n return false;\n }\n\n async requestAccounts(): Promise<string[]> {\n if (isMobile()) {\n try {\n this.getProvider();\n } catch (error) {\n await MobileWalletConnect.redirectToWallet(this.metadata.id);\n return [];\n }\n }\n\n const accounts = await this.getProviderOrThrow().requestAccounts();\n console.log('network:', await this.getNetwork());\n console.log('\uD83D\uDE80 ~ InjectedConnector ~ requestAccounts ~ accounts:', accounts);\n return accounts;\n }\n\n async getAccounts(): Promise<string[]> {\n const accounts = await this.getProviderOrThrow().getAccounts();\n return accounts;\n }\n async getPublicKey(): Promise<string> {\n return this.getProviderOrThrow().getPublicKey();\n }\n async signMessage(signStr: string, type?: 'ecdsa' | 'bip322-simple'): Promise<string> {\n const addresses = await this.getAccounts();\n if (addresses.length === 0) {\n throw new Error(`${this.metadata.name} not connected!`);\n }\n return this.getProviderOrThrow().signMessage(signStr, type);\n }\n on(event: string, handler: (data?: unknown) => void) {\n const provider = this.getProvider();\n return provider?.on?.(event, handler);\n }\n removeListener(event: string, handler: (data?: unknown) => void) {\n const provider = this.getProvider();\n return provider?.removeListener?.(event, handler);\n }\n\n getProvider() {\n if (this.isReady()) {\n const props = this.propertity.split('.');\n if (props.length === 1) {\n return (window as any)[props[0]];\n } else {\n return (window as any)[props[0]][props[1]];\n }\n }\n }\n\n getProviderOrThrow() {\n const provider = this.getProvider();\n if (!provider) {\n throw new Error(`${this.metadata.name} is not install or not create Bitcoin wallet!`);\n }\n return provider;\n }\n\n async getNetwork(): Promise<'livenet' | 'testnet'> {\n return this.getProviderOrThrow().getNetwork();\n }\n async switchNetwork(network: 'livenet' | 'testnet'): Promise<void> {\n return this.getProviderOrThrow().switchNetwork(network);\n }\n\n async sendBitcoin(\n toAddress: string,\n satoshis: number,\n options?: { feeRate: number },\n ): Promise<string> {\n return this.getProviderOrThrow().sendBitcoin(toAddress, satoshis, options);\n }\n\n async sendInscription(\n address: string,\n inscriptionId: string,\n options?: { feeRate: number },\n ): Promise<{ txid: string }> {\n const result = await this.getProviderOrThrow().sendInscription(address, inscriptionId, options);\n if (typeof result === 'string') {\n return {\n txid: result,\n };\n }\n\n return result;\n }\n\n disconnect() {}\n}\n", "import icon from '../icons/bitget.png';\nimport { type WalletMetadata } from './base';\nimport { InjectedConnector } from './injected';\n\nexport class BitgetConnector extends InjectedConnector {\n readonly metadata: WalletMetadata = {\n id: 'bitget',\n name: 'Bitget Wallet',\n icon,\n downloadUrl: 'https://web3.bitget.com/en/wallet-download',\n };\n\n constructor() {\n super('bitkeep.unisat');\n }\n}\n", "import icon from '../icons/bybit.png';\nimport { type WalletMetadata } from './base';\nimport { InjectedConnector } from './injected';\n\nexport class BybitConnector extends InjectedConnector {\n readonly metadata: WalletMetadata = {\n id: 'bybit',\n name: 'Bybit Wallet',\n icon,\n downloadUrl: 'https://www.bybit.com/download/',\n };\n\n constructor() {\n super('bybitWallet.bitcoin');\n }\n}\n", "import icon from '../icons/okx.svg';\nimport { type WalletMetadata } from './base';\nimport { InjectedConnector } from './injected';\n\nexport class OKXConnector extends InjectedConnector {\n readonly metadata: WalletMetadata = {\n id: 'okx',\n name: 'OKX Wallet',\n icon,\n downloadUrl: 'https://www.okx.com/download',\n };\n constructor() {\n super('okxwallet.bitcoin');\n }\n}\n", "import icon from '../icons/tokenpocket.png';\nimport { type WalletMetadata } from './base';\nimport { InjectedConnector } from './injected';\n\nexport class TokenPocketConnector extends InjectedConnector {\n readonly metadata: WalletMetadata = {\n id: 'tokenpocket',\n name: 'TokenPocket',\n icon,\n downloadUrl: 'https://www.tokenpocket.pro/en/download/app',\n };\n\n constructor() {\n super('tokenpocket.bitcoin');\n }\n}\n", "import icon from '../icons/unisat.svg';\nimport { type WalletMetadata } from './base';\nimport { InjectedConnector } from './injected';\n\nexport class UnisatConnector extends InjectedConnector {\n readonly metadata: WalletMetadata = {\n id: 'unisat',\n name: 'Unisat Wallet',\n icon,\n downloadUrl: 'https://unisat.io',\n };\n\n constructor() {\n super('unisat');\n }\n}\n", "import icon from '../icons/wizz.svg';\nimport { type WalletMetadata } from './base';\nimport { InjectedConnector } from './injected';\n\nexport class WizzConnector extends InjectedConnector {\n readonly metadata: WalletMetadata = {\n id: 'wizz',\n name: 'Wizz Wallet',\n icon,\n downloadUrl: 'https://wizzwallet.io',\n };\n\n constructor() {\n super('wizz');\n }\n}\n", "import EventEmitter from 'events';\nimport type { Address } from 'sats-connect';\nimport icon from '../icons/xverse.png';\nimport { BaseConnector, type WalletMetadata } from './base';\nimport { MobileWalletConnect } from './universalLink';\nimport { isMobile } from '../utils';\nimport { storageStore } from '../utils';\n\ninterface XverseAddress extends Address {\n walletType: 'software' | 'ledger';\n}\n\nconst storage = storageStore('SATOSHI_WALLET_XVERSE');\nexport class XverseConnector extends BaseConnector {\n #network = 'Mainnet';\n #event = new EventEmitter();\n constructor() {\n super();\n this.#event.setMaxListeners(100);\n }\n readonly metadata: WalletMetadata = {\n id: 'xverse',\n name: 'Xverse Wallet',\n icon,\n downloadUrl: 'https://www.xverse.app',\n };\n isReady(): boolean {\n if (typeof window !== 'undefined') {\n if (typeof window.BitcoinProvider !== 'undefined') return true;\n if (isMobile()) return true;\n }\n return false;\n }\n private loadAccounts = async (network: 'Mainnet' | 'Testnet') => {\n const { AddressPurpose } = await import('sats-connect');\n const provider = this.getProvider();\n await provider.request('wallet_requestPermissions', undefined);\n const { result: walletType } = await provider.request('wallet_getWalletType', undefined);\n\n const { result } = await provider.request('getAddresses', {\n purposes: [AddressPurpose.Payment, AddressPurpose.Ordinals],\n message: 'Address for receiving Ordinals and payments',\n });\n const addresses: XverseAddress[] = result.addresses.map((item: XverseAddress) => ({\n ...item,\n walletType,\n }));\n console.log('\uD83D\uDE80 ~ XverseConnector ~ loadAccounts ~ res:', addresses);\n\n storage?.set(`${network}:addresses`, addresses);\n return addresses;\n };\n async sendInscription(): Promise<{ txid: string }> {\n throw new Error('Unsupported');\n }\n async requestAccounts(): Promise<string[]> {\n if (isMobile()) {\n try {\n this.getProvider();\n } catch (error) {\n MobileWalletConnect.redirectToWallet(this.metadata.id);\n return [];\n }\n }\n const addresses = await this.loadAccounts(this.#network as any);\n return addresses.map((item) => item.address);\n }\n async getAddresses() {\n const data = storage?.get<XverseAddress[]>(`${this.#network}:addresses`);\n if (data) {\n return data;\n }\n return [];\n }\n async getCurrentAddress() {\n const addresses = await this.getAddresses();\n const address = addresses?.[0];\n if (!address) {\n throw new Error(`${this.metadata.name} not connected!`);\n }\n return address;\n }\n async getAccounts() {\n if (!this.isReady()) {\n throw new Error(`${this.metadata.name} is not install!`);\n }\n const addresses = await this.getAddresses();\n return addresses.map((item) => item.address);\n }\n async getPublicKey(): Promise<string> {\n const address = await this.getCurrentAddress();\n return address.publicKey;\n }\n async signMessage(signStr: string): Promise<string> {\n const address = await this.getCurrentAddress();\n const provider = this.getProvider();\n const { result } = await provider.request('signMessage', {\n address: address.address,\n message: signStr,\n protocol: 'ECDSA',\n });\n console.log('xverse walletType', address.walletType);\n console.log('xverse raw sig', result.signature);\n const modifiedSig = Buffer.from(result.signature, 'base64');\n modifiedSig[0] = 31 + ((modifiedSig[0] - 31) % 4);\n const sig = modifiedSig.toString('base64');\n console.log('xverse modified sig', sig);\n return sig;\n }\n on(event: string, handler: (data?: unknown) => void) {\n return this.#event.on(event, handler);\n }\n removeListener(event: string, handler: (data?: unknown) => void) {\n return this.#event.removeListener(event, handler);\n }\n getProvider() {\n const provider = window.BitcoinProvider;\n if (!provider) {\n throw new Error(`${this.metadata.name} is not install!`);\n }\n return provider;\n }\n async getNetwork(): Promise<'livenet' | 'testnet'> {\n if (!this.isReady()) {\n throw new Error(`${this.metadata.name} is not install!`);\n }\n return this.#network === 'Mainnet' ? 'livenet' : 'testnet';\n }\n async switchNetwork(): Promise<void> {\n throw new Error('Unsupported');\n }\n async sendBitcoin(toAddress: string, satoshis: number): Promise<string> {\n const provider = this.getProvider();\n const { result } = await provider.request('sendTransfer', {\n recipients: [{ address: toAddress, amount: satoshis }],\n });\n console.log('\uD83D\uDE80 ~ XverseConnector ~ sendBitcoin ~ res:', result);\n return result.txid;\n }\n disconnect(): void {\n storage?.remove(`${this.#network}:addresses`);\n }\n}\n", "import EventEmitter from 'events';\nimport type {\n Address,\n GetAddressOptions,\n SendBtcTransactionOptions,\n SignMessageOptions,\n} from 'sats-connect';\nimport icon from '../icons/magicEden.svg';\nimport { BaseConnector, type WalletMetadata } from './base';\nimport { storageStore } from '../utils';\n\nconst storage = storageStore('SATOSHI_WALLET_MAGICEDEN');\nexport class MagicEdenConnector extends BaseConnector {\n #network = 'Mainnet';\n #event = new EventEmitter();\n\n constructor() {\n super();\n this.#event.setMaxListeners(100);\n }\n\n readonly metadata: WalletMetadata = {\n id: 'magicEden',\n name: 'Magic Eden Wallet',\n icon,\n downloadUrl: 'https://www.magiceden.io',\n };\n\n isReady(): boolean {\n return typeof window !== 'undefined' && 'magicEden' in window && !!window.magicEden;\n }\n\n private loadAccounts = async (network: 'Mainnet' | 'Testnet') => {\n const { getAddress, AddressPurpose } = await import('sats-connect');\n const addresses = await new Promise<Address[]>((resolve, reject) => {\n const getAddressOptions: GetAddressOptions = {\n payload: {\n purposes: [AddressPurpose.Payment, AddressPurpose.Ordinals],\n message: 'Address for receiving Ordinals and payments',\n network: {\n type: network as any,\n },\n },\n onFinish: (response) => {\n resolve(response.addresses);\n },\n onCancel: () =>\n reject({\n code: 4001,\n message: 'User rejected the request.',\n }),\n };\n getAddress(getAddressOptions).catch((error) => reject(error));\n });\n storage?.set(`${network}:addresses`, addresses);\n return addresses;\n };\n\n async sendInscription(): Promise<{ txid: string }> {\n throw new Error('Unsupported');\n }\n\n async requestAccounts(): Promise<string[]> {\n if (!this.isReady()) {\n throw new Error(`${this.metadata.name} is not install!`);\n }\n const addresses = await this.loadAccounts(this.#network as any);\n return addresses.map((item) => item.address);\n }\n\n async getAccounts(): Promise<string[]> {\n if (!this.isReady()) {\n throw new Error(`${this.metadata.name} is not install!`);\n }\n const data = storage?.get<Address[]>(`${this.#network}:addresses`);\n if (data) {\n return data.map((item) => item.address);\n } else {\n return [];\n }\n }\n\n async getPublicKey(): Promise<string> {\n if (!this.isReady()) {\n throw new Error(`${this.metadata.name} is not install!`);\n }\n const data = storage?.get<Address[]>(`${this.#network}:addresses`);\n if (data) {\n return data[0].publicKey;\n } else {\n return '';\n }\n }\n\n async signMessage(signStr: string): Promise<string> {\n if (!this.isReady()) {\n throw new Error(`${this.metadata.name} is not install!`);\n }\n const addresses = await this.getAccounts();\n if (addresses.length === 0) {\n throw new Error(`${this.metadata.name} not connected!`);\n }\n const { signMessage } = await import('sats-connect');\n\n const sig = await new Promise<string>((resolve, reject) => {\n const signMessageOptions: SignMessageOptions = {\n payload: {\n network: {\n type: this.#network as any,\n },\n address: addresses[0],\n message: signStr,\n },\n onFinish: (response) => {\n resolve(response);\n },\n onCancel: () => {\n reject({\n code: 4001,\n message: 'User rejected the request.',\n });\n },\n };\n signMessage(signMessageOptions).catch((e) => {\n reject(e);\n });\n });\n\n const modifiedSig = Buffer.from(sig, 'base64');\n modifiedSig[0] = 31 + ((modifiedSig[0] - 31) % 4);\n return modifiedSig.toString('base64');\n }\n\n on(event: string, handler: (data?: unknown) => void) {\n return this.#event.on(event, handler);\n }\n\n removeListener(event: string, handler: (data?: unknown) => void) {\n return this.#event.removeListener(event, handler);\n }\n\n getProvider() {\n if (this.isReady()) {\n if ('magicEden' in window) {\n const anyWindow: any = window;\n if (anyWindow.magicEden.bitcoin && anyWindow.magicEden.bitcoin.isMagicEden)\n return anyWindow.magicEden.bitcoin;\n }\n }\n }\n\n async getNetwork(): Promise<'livenet' | 'testnet'> {\n if (!this.isReady()) {\n throw new Error(`${this.metadata.name} is not install!`);\n }\n return this.#network === 'Mainnet' ? 'livenet' : 'testnet';\n }\n\n async switchNetwork(): Promise<void> {\n throw new Error('Unsupported');\n }\n\n async sendBitcoin(toAddress: string, satoshis: number): Promise<string> {\n const provider = this.getProvider();\n if (!provider) {\n throw new Error(`${this.metadata.name} is not install!`);\n }\n const { sendBtcTransaction } = await import('sats-connect');\n\n const addresses = await this.getAccounts();\n if (addresses.length === 0) {\n throw new Error(`${this.metadata.name} not connected!`);\n }\n const result = await new Promise<any>((resolve, reject) => {\n const sendBtcOptions: SendBtcTransactionOptions = {\n payload: {\n network: {\n type: this.#network as any,\n },\n recipients: [\n {\n address: toAddress,\n amountSats: BigInt(satoshis),\n },\n ],\n senderAddress: addresses[0],\n },\n onFinish: (response) => {\n resolve(response);\n },\n onCancel: () => {\n reject({\n code: 4001,\n message: 'User rejected the request.',\n });\n },\n };\n sendBtcTransaction(sendBtcOptions).catch((e) => reject(e));\n });\n return result?.txid || result;\n }\n\n disconnect(): void {\n storage?.remove(`${this.#network}:addresses`);\n }\n}\n", "import icon from '../icons/binance.png';\nimport { type WalletMetadata } from './base';\nimport { InjectedConnector } from './injected';\n\nexport class BinanceConnector extends InjectedConnector {\n readonly metadata: WalletMetadata = {\n id: 'binance',\n name: 'Binance Wallet',\n icon,\n downloadUrl: 'https://www.binance.com/en/web3wallet',\n };\n constructor() {\n super('binancew3w.bitcoin');\n }\n}\n", "import icon from '../icons/gate.svg';\nimport { type WalletMetadata } from './base';\nimport { InjectedConnector } from './injected';\n\nexport class GateConnector extends InjectedConnector {\n readonly metadata: WalletMetadata = {\n id: 'gate',\n name: 'Gate Wallet',\n icon,\n downloadUrl: 'https://www.gate.io/en/web3',\n };\n\n constructor() {\n super('gatewallet.bitcoin');\n }\n}\n", "import { SmartAccount, type AAOptions, type AccountContract } from '@particle-network/aa';\nimport { chains } from '@particle-network/chains';\nimport { walletEntryPlugin, type WalletOption } from '@particle-network/wallet';\nimport { createContext, useCallback, useContext, useEffect, useMemo, useState } from 'react';\nimport ConnectModal from '../components/connectModal';\nimport SignModal from '../components/signModal';\nimport { type BaseConnector } from '../connector/base';\nimport { AASignerProvider } from '../evmSigner';\nimport useModalStateValue from '../hooks/useModalStateValue';\nimport { EventName } from '../types/eventName';\nimport { checkBTCVersion, storageStore } from '../utils';\n\nimport events from '../utils/eventUtils';\nimport txConfirm from '../utils/txConfirmUtils';\n\ninterface GlobalState {\n connectorId?: string;\n setConnectorId: (connectorId?: string) => void;\n connector?: BaseConnector;\n connectors: BaseConnector[];\n connectModalOpen: boolean;\n openConnectModal: () => void;\n closeConnectModal: () => void;\n accounts: string[];\n provider: any;\n disconnect: () => void;\n requestDirectAccount: (connector: BaseConnector) => any;\n getPublicKey: () => Promise<string>;\n signMessage: (message: string) => Promise<string>;\n evmAccount?: string;\n smartAccount?: SmartAccount;\n switchNetwork: (network: 'livenet' | 'testnet') => Promise<void>;\n getNetwork: () => Promise<'livenet' | 'testnet'>;\n sendBitcoin: (\n toAddress: string,\n satoshis: number,\n options?: { feeRate: number },\n ) => Promise<string>;\n accountContract: AccountContract;\n setAccountContract: (accountContract: AccountContract) => void;\n}\n\nconst ConnectContext = createContext<GlobalState>({} as any);\n\ninterface ConnectOptions {\n projectId: string;\n clientKey: string;\n appId: string;\n aaOptions: AAOptions;\n rpcUrls?: Record<number, string>;\n walletOptions?: Omit<WalletOption, 'erc4337' | 'customStyle'> & {\n customStyle?: Omit<WalletOption['customStyle'], 'supportChains'>;\n };\n}\n\nconst SAContractKey = 'particle-sa-config';\n\nexport const ConnectProvider = ({\n children,\n options,\n connectors,\n autoConnect = true,\n}: {\n children: React.ReactNode;\n options: ConnectOptions;\n connectors: BaseConnector[];\n autoConnect?: boolean;\n}) => {\n const {\n closeModal: closeConnectModal,\n isModalOpen: connectModalOpen,\n openModal: openConnectModal,\n } = useModalStateValue();\n\n const {\n closeModal: closeSignModal,\n isModalOpen: signModalOpen,\n openModal: openSignModal,\n } = useModalStateValue();\n\n const [connectorId, setConnectorId] = useState<string>();\n const [accounts, setAccounts] = useState<string[]>([]);\n const [evmAccount, setEVMAccount] = useState<string>();\n const [accountContract, _setAccountContract] = useState<AccountContract>({\n name: Object.keys(options.aaOptions.accountContracts)?.[0] || 'BTC',\n version:\n options.aaOptions.accountContracts[\n Object.keys(options.aaOptions.accountContracts)?.[0] || 'BTC'\n ]?.[0].version || '1.0.0',\n });\n\n const getConnectorId = useCallback(() => {\n if (typeof window === 'undefined') {\n return '';\n }\n const id = storageStore()?.get<string>('current-connector-id');\n return id ?? '';\n }, []);\n\n const getConnector = useCallback(() => {\n const connectorId = getConnectorId();\n return connectors.find((item) => item.metadata.id === connectorId);\n }, [connectorId, connectors]);\n\n const setAccountContract = useCallback(\n (config: AccountContract) => {\n if (!checkBTCVersion(options.aaOptions.accountContracts, config.name, config.version)) {\n throw new Error('Invalid Account Contract');\n }\n localStorage.setItem(SAContractKey, JSON.stringify(config));\n _setAccountContract(config);\n },\n [options.aaOptions.accountContracts, _setAccountContract],\n );\n\n useEffect(() => {\n const connectorId = getConnectorId();\n if (connectorId) {\n setConnectorId(connectorId);\n }\n }, [autoConnect, getConnectorId]);\n\n const evmSupportChainIds = useMemo(() => {\n let chainIds = options.aaOptions.accountContracts[accountContract.name]\n ?.filter((item) => item.version === accountContract.version)\n .map((item) => item.chainIds)\n .reduce((a, b) => {\n a.push(...b);\n return a;\n }, []);\n chainIds = Array.from(new Set(chainIds || []));\n return chainIds;\n }, [options.aaOptions.accountContracts, accountContract]);\n\n const connector = useMemo(() => getConnector(), [connectorId, connectors]);\n\n const getPublicKey = useCallback(async () => {\n const connector = getConnector();\n if (!connector) {\n throw new Error('Wallet not connected!');\n }\n const pubKey = await connector.getPublicKey();\n return pubKey;\n }, [getConnector]);\n\n const signMessage = useCallback(\n async (message: string) => {\n if (!connector) {\n throw new Error('Wallet not connected!');\n }\n const signature = await connector.signMessage(message);\n return signature;\n },\n [connector],\n );\n\n const sendBitcoin = useCallback(\n async (toAddress: string, satoshis: number, options?: { feeRate: number }) => {\n if (!connector) {\n throw new Error('Wallet not connected!');\n }\n\n const signature = await connector.sendBitcoin(toAddress, satoshis, options);\n return signature;\n },\n [connector],\n );\n\n const getNetwork = useCallback(async () => {\n if (!connector) {\n throw new Error('Wallet not connected!');\n }\n const network = await connector.getNetwork();\n return network;\n }, [connector]);\n\n const switchNetwork = useCallback(\n async (network: 'livenet' | 'testnet') => {\n if (!connector) {\n throw new Error('Wallet not connected!');\n }\n await connector.switchNetwork(network);\n },\n [connector],\n );\n\n const smartAccount = useMemo(() => {\n if (typeof window === 'undefined') {\n return undefined;\n }\n\n if (\n !(window as any).__bitcoinSmartAccount ||\n ((window as any)?.__bitcoinSmartAccount &&\n ((window as any)?.__bitcoinSmartAccount.smartAccountContract.version !==\n accountContract.version ||\n (window as any)?.__bitcoinSmartAccount.smartAccountContract.name !==\n accountContract.name))\n ) {\n const smartAccount = new SmartAccount(\n new AASignerProvider(\n evmSupportChainIds,\n options.projectId,\n options.clientKey,\n options.rpcUrls,\n ) as any,\n options,\n );\n smartAccount.setSmartAccountContract(accountContract);\n (window as any).__bitcoinSmartAccount = smartAccount;\n }\n (window as any).__bitcoinSmartAccount.provider.getPublicKey = getPublicKey;\n (window as any).__bitcoinSmartAccount.provider.personalSign = signMessage;\n return (window as any).__bitcoinSmartAccount as SmartAccount;\n }, [options, evmSupportChainIds, getPublicKey, signMessage, accountContract]);\n\n const requestAccount = useCallback(\n async (connector: BaseConnector) => {\n let accounts = await connector.getAccounts();\n if (accounts.length === 0 && autoConnect) {\n accounts = await connector.requestAccounts();\n }\n setAccounts(accounts);\n },\n [autoConnect],\n );\n\n const requestDirectAccount = useCallback(async (connector: BaseConnector) => {\n let accounts = await connector.getAccounts();\n if (accounts.length === 0) {\n accounts = await connector.requestAccounts();\n }\n setAccounts(accounts);\n\n return accounts;\n }, []);\n\n useEffect(() => {\n if (connector) {\n requestAccount(connector).catch((e: any) => {\n console.error('get account error', e);\n\n setAccounts([]);\n });\n } else {\n setAccounts([]);\n }\n }, [connector, requestAccount]);\n\n useEffect(() => {\n const onAccountChange = (accounts: string[]) => {\n if (!accounts.length) return;\n setAccounts(accounts);\n };\n connector?.on('accountsChanged', onAccountChange);\n return () => {\n connector?.removeListener('accountsChanged', onAccountChange);\n };\n }, [connector]);\n\n const provider = useMemo(() => {\n if (connectorId) {\n return connectors.find((item) => item.metadata.id === connectorId)?.getProvider();\n }\n }, [connectorId, connectors]);\n\n const disconnect = useCallback(() => {\n storageStore()?.remove('current-connector-id');\n txConfirm.reset();\n if (connector) {\n connector.disconnect();\n }\n setConnectorId(undefined);\n }, [connector]);\n\n useEffect(() => {\n const config = JSON.parse(localStorage.getItem(SAContractKey) || '{}');\n if (\n config.name &&\n config.version &&\n checkBTCVersion(options.aaOptions.accountContracts, config.name, config.version)\n ) {\n _setAccountContract(config);\n }\n }, [options.aaOptions.accountContracts, _setAccountContract]);\n\n useEffect(() => {\n if (options.walletOptions?.visible !== false) {\n const supportChains = evmSupportChainIds.map((id) => chains.getEVMChainInfoById(id));\n if (supportChains.some((chain) => !chain)) {\n throw new Error(`Please config valid chain ids, ${JSON.stringify(evmSupportChainIds)}`);\n }\n walletEntryPlugin.init(\n {\n projectId: options.projectId,\n clientKey: options.clientKey,\n appId: options.appId,\n },\n {\n ...options.walletOptions,\n erc4337: accountContract,\n customStyle: {\n ...options.walletOptions?.customStyle,\n supportChains: supportChains as any,\n },\n },\n );\n }\n }, [options, evmSupportChainIds, accountContract]);\n\n useEffect(() => {\n if (smartAccount && options.walletOptions?.visible !== false) {\n walletEntryPlugin.setWalletCore({\n ethereum: smartAccount.provider,\n });\n }\n }, [smartAccount, options]);\n\n useEffect(() => {\n if (options.walletOptions?.visible !== false) {\n if (evmAccount) {\n walletEntryPlugin.walletEntryCreate();\n } else {\n walletEntryPlugin.walletEntryDestroy();\n }\n }\n }, [evmAccount, smartAccount, options]);\n\n useEffect(() => {\n if (accounts.length === 0) {\n closeConnectModal();\n closeSignModal();\n if (events.listenerCount(EventName.sendUserOpResult) > 0) {\n events.emit(EventName.sendUserOpResult, {\n error: {\n code: -32600,\n message: 'Wallet disconnected',\n },\n });\n } else if (events.listenerCount(EventName.personalSignResult) > 0) {\n events.emit(EventName.personalSignResult, {\n error: {\n code: -32600,\n message: 'Wallet disconnected',\n },\n });\n } else if (events.listenerCount(EventName.signTypedDataResult) > 0) {\n events.emit(EventName.signTypedDataResult, {\n error: {\n code: -32600,\n message: 'Wallet disconnected',\n },\n });\n }\n }\n }, [accounts, closeConnectModal, closeSignModal]);\n\n return (\n <ConnectContext.Provider\n value={{\n connectorId,\n setConnectorId,\n connector,\n connectors,\n connectModalOpen,\n openConnectModal,\n closeConnectModal,\n accounts,\n provider,\n disconnect,\n requestDirectAccount,\n getPublicKey,\n signMessage,\n evmAccount,\n smartAccount,\n getNetwork,\n switchNetwork,\n sendBitcoin,\n accountContract: accountContract,\n setAccountContract: setAccountContract,\n }}\n >\n {children}\n <ConnectModal open={connectModalOpen} onClose={closeConnectModal} />\n <SignModal open={signModalOpen} onClose={closeSignModal} onOpen={openSignModal} />\n </ConnectContext.Provider>\n );\n};\n\nexport const useConnectProvider = () => {\n const context = useContext(ConnectContext);\n return context;\n};\n", "import { useEffect, useState } from 'react';\nimport { type BaseConnector } from '../../connector/base';\nimport { useConnectProvider } from '../../context';\nimport { useConnector } from '../../hooks';\nimport back from '../../icons/back.svg';\nimport close from '../../icons/close.svg';\nimport retryIcon from '../../icons/retry.svg';\nimport Button from '../button';\nimport Modal from '../modal';\nimport styles from './connect.module.scss';\n\nconst ConnectModal = ({ open, onClose }: { open: boolean; onClose: () => void }) => {\n const [backVisible, setBackVisible] = useState(false);\n const [retryVisible, setRetryVisible] = useState(false);\n const [walletReady, setWalletReady] = useState(true);\n const [selectConnector, setSelectConnector] = useState<BaseConnector>();\n const { closeConnectModal } = useConnectProvider();\n const { connect, connectors } = useConnector();\n\n useEffect(() => {\n if (!open) {\n setBackVisible(false);\n setRetryVisible(false);\n setWalletReady(true);\n setSelectConnector(undefined);\n }\n }, [open]);\n\n const onConnect = async (connector: BaseConnector) => {\n setBackVisible(true);\n setSelectConnector(connector);\n if (connector.isReady()) {\n try {\n await connect(connector.metadata.id);\n closeConnectModal();\n } catch (error: any) {\n console.error('onConnect error', error);\n if (error.code === 4001) {\n setRetryVisible(true);\n }\n }\n } else {\n setWalletReady(false);\n }\n };\n\n const onBack = () => {\n setBackVisible(false);\n setRetryVisible(false);\n setWalletReady(true);\n setSelectConnector(undefined);\n };\n\n const onRetry = () => {\n setRetryVisible(false);\n if (selectConnector) {\n onConnect(selectConnector);\n }\n };\n\n return (\n <Modal open={open} onClose={onClose} isDismissable={false} contentClassName={styles.connectModal}>\n <div className={styles.title}>{selectConnector?.metadata.name || 'Choose Wallet'}</div>\n <img className={styles.closeBtn} src={close} onClick={onClose}></img>\n {backVisible && <img className={styles.backBtn} src={back} onClick={onBack}></img>}\n\n {!backVisible &&\n connectors.map((connector) => {\n return (\n <div className={styles.walletItem} key={connector.metadata.id} onClick={() => onConnect(connector)}>\n <img className={styles.walletIcon} src={connector.metadata.icon}></img>\n <div className={styles.walletName}>{connector.metadata.name}</div>\n </div>\n );\n })}\n\n {backVisible && selectConnector && (\n <div className={styles.connecting}>\n <div className={styles.connectingIconContainer}>\n <img className={styles.connectingIcon} src={selectConnector.metadata.icon}></img>\n {retryVisible && (\n <div className={styles.retryContainer} onClick={onRetry}>\n <img className={styles.retryIcon} src={retryIcon}></img>\n </div>\n )}\n </div>\n\n {walletReady ? (\n <>\n <div className={styles.connection}>{retryVisible ? 'Request Cancelled' : 'Requesting Connection'}</div>\n <div className={styles.acceptRequest}>\n {retryVisible\n ? 'You cancelled the request.\\nClick above to try again.'\n : 'Accept the request through your wallet to connect to this app.'}\n </div>\n </>\n ) : (\n <>\n <div className={styles.connection}>Wallet Not Installed.</div>\n <Button\n className={styles.btnDownload}\n onClick={() => {\n window.open(selectConnector?.metadata.downloadUrl, '_blank');\n }}\n >\n Get\n </Button>\n </>\n )}\n </div>\n )}\n </Modal>\n );\n};\n\nexport default ConnectModal;\n", "import { useConnectProvider } from '../context';\n\nexport const useAccountContract = () => {\n const { accountContract, setAccountContract } = useConnectProvider();\n return {\n accountContract,\n setAccountContract,\n };\n};\n", "import { useConnectProvider } from '../context';\n\nexport const useAccounts = () => {\n const { accounts } = useConnectProvider();\n return { accounts };\n};\n", "import { useCallback } from 'react';\nimport { useConnectProvider } from '../context';\n\nexport const useBTCProvider = () => {\n const {\n connector,\n provider,\n accounts,\n getPublicKey,\n signMessage,\n getNetwork,\n switchNetwork,\n sendBitcoin,\n } = useConnectProvider();\n\n const sendInscription = useCallback(\n async (address: string, inscriptionId: string, options?: { feeRate: number }) => {\n if (!connector) {\n throw new Error('Wallet not connected!');\n }\n const result = await connector.sendInscription(address, inscriptionId, options);\n return result;\n },\n [connector],\n );\n\n return {\n provider,\n accounts,\n getPublicKey,\n signMessage,\n getNetwork,\n switchNetwork,\n sendBitcoin,\n sendInscription,\n connector,\n };\n};\n", "import { useConnectProvider } from '../context';\n\nexport const useConnectModal = () => {\n const { openConnectModal, disconnect, requestDirectAccount, connectModalOpen } =\n useConnectProvider();\n return { openConnectModal, disconnect, requestDirectAccount, connectModalOpen };\n};\n", "import { useCallback } from 'react';\nimport { useConnectProvider } from '../context';\nimport { storageStore } from '../utils';\n\nexport const useConnector = () => {\n const { connectors, setConnectorId } = useConnectProvider();\n\n const connect = useCallback(\n async (connectorId: string) => {\n const connector = connectors.find((item) => item.metadata.id === connectorId);\n if (!connector) {\n throw new Error(`connector id ${connectorId} not found`);\n }\n const accounts = await connector.requestAccounts();\n if (accounts.length > 0) {\n storageStore()?.set('current-connector-id', connector.metadata.id);\n setConnectorId(connector.metadata.id);\n }\n },\n [connectors, setConnectorId],\n );\n\n return { connectors, connect };\n};\n", "import { intToHex } from '@ethereumjs/util';\nimport type {\n SendTransactionParams,\n Transaction,\n UserOpBundle,\n UserOpParams,\n} from '@particle-network/aa';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { createWalletClient, custom, type PublicClient } from 'viem';\nimport { useConnectProvider } from '../context';\nimport { EthereumProvider } from '../evmSigner/provider';\nimport { WalletClientProvider } from '../evmSigner/walletClientProvider';\nimport { EventName } from '../types/eventName';\nimport events, { getPendingSignEventAccount } from '../utils/eventUtils';\nimport txConfirm from '../utils/txConfirmUtils';\n\nexport const useETHProvider: any = () => {\n const { evmAccount, smartAccount } = useConnectProvider();\n const [chainId, setChainId] = useState<number>();\n\n useEffect(() => {\n if (smartAccount) {\n const chainId = (smartAccount.provider as any).chainId as number;\n setChainId(chainId);\n\n const onChangeChange = (id: string) => {\n setChainId(Number(id));\n };\n smartAccount.provider.on('chainChanged', onChangeChange);\n return () => {\n smartAccount.provider.removeListener('chainChanged', onChangeChange);\n };\n }\n }, [smartAccount]);\n\n const switchChain = useCallback(\n async (chainId: number) => {\n if (smartAccount?.provider) {\n await smartAccount.provider.request({\n method: 'wallet_switchEthereumChain',\n params: [\n {\n chainId: intToHex(chainId),\n },\n ],\n });\n }\n },\n [smartAccount?.provider],\n );\n\n const getFeeQuotes = useCallback(\n async (tx: Transaction | Transaction[]) => {\n if (!smartAccount) {\n throw new Error('The smart account is not initialized.');\n }\n return smartAccount.getFeeQuotes(tx);\n },\n [smartAccount],\n );\n\n const buildUserOp = useCallback(\n async ({ tx, feeQuote, tokenPaymasterAddress }: UserOpParams) => {\n if (!smartAccount) {\n throw new Error('The smart account is not initialized.');\n }\n const result = await smartAccount.buildUserOperation({ tx, feeQuote, tokenPaymasterAddress });\n return result;\n },\n [smartAccount],\n );\n\n const sendUserOp = useCallback(\n async (params: SendTransactionParams, forceHideConfirmModal?: boolean) => {\n if (!smartAccount) {\n throw new Error('The smart account is not initialized.');\n }\n\n const showConfirmModal = !forceHideConfirmModal && !txConfirm.isNotRemind();\n\n if (showConfirmModal) {\n if (getPendingSignEventAccount() > 0) {\n throw new Error('Operation failed, there is a transaction being processed');\n }\n }\n\n let userOpBundle: UserOpBundle | undefined;\n if (\n Object.prototype.hasOwnProperty.call(params, 'userOpHash') &&\n Object.prototype.hasOwnProperty.call(params, 'userOp')\n ) {\n const { userOpHash, userOp } = params as UserOpBundle;\n if (userOpHash && userOp) {\n userOpBundle = { userOpHash, userOp };\n }\n }\n\n if (!userOpBundle) {\n const { tx, feeQuote, tokenPaymasterAddress } = params as UserOpParams;\n userOpBundle = await buildUserOp({ tx, feeQuote, tokenPaymasterAddress });\n }\n\n if (!showConfirmModal) {\n return smartAccount.sendUserOperation(userOpBundle);\n }\n\n return new Promise<string>((resolve, reject) => {\n events.emit(EventName.sendUserOp, userOpBundle);\n events.once(EventName.sendUserOpResult, ({ result, error }) => {\n if (result) {\n resolve(result);\n } else {\n reject(error);\n }\n });\n });\n },\n [smartAccount, buildUserOp],\n );\n\n const publicClient = useMemo(() => {\n if (!smartAccount || !chainId) {\n return undefined;\n }\n return (smartAccount?.provider as any).publicClient as PublicClient;\n }, [smartAccount, chainId]);\n\n const provider = useMemo(() => {\n const ethereumProvider = new EthereumProvider(\n sendUserOp,\n smartAccount?.provider as any,\n evmAccount,\n );\n return ethereumProvider;\n }, [evmAccount, sendUserOp, smartAccount?.provider]);\n\n const walletClient = useMemo(() => {\n return createWalletClient({\n transport: custom(new WalletClientProvider(provider)),\n });\n }, [provider]);\n\n return {\n provider,\n /** @deprecated please use account */\n evmAccount,\n account: evmAccount,\n switchChain,\n chainId,\n getFeeQuotes,\n buildUserOp,\n sendUserOp,\n publicClient,\n walletClient,\n };\n};\n", "import type { IEthereumProvider, JsonRpcRequest, SendTransactionParams } from '@particle-network/aa';\nimport { type AASignerProvider } from '.';\n\nexport class EthereumProvider implements IEthereumProvider {\n constructor(\n public sendUserOp: (params: SendTransactionParams, forceHideConfirmModal?: boolean) => Promise<string>,\n public signer?: AASignerProvider,\n public account?: string\n ) {}\n\n on(event: string, listener: any): this {\n this.signer?.on(event, listener);\n return this;\n }\n\n once(event: string, listener: any): this {\n this.signer?.once(event, listener);\n return this;\n }\n\n off(event: string, listener: any): this {\n this.signer?.off(event, listener);\n return this;\n }\n\n removeListener(event: string, listener: any): this {\n this.signer?.removeListener(event, listener);\n return this;\n }\n\n async request(arg: Partial<JsonRpcRequest>): Promise<any> {\n const method = arg.method;\n if (!method) {\n throw new Error('Method not found.');\n }\n\n if (method === 'eth_accounts' || method === 'eth_requestAccounts') {\n return this.account ? [this.account] : [];\n } else if (method === 'eth_sendTransaction') {\n const txData = arg.params?.[0];\n const result = await this.sendUserOp({ tx: txData });\n return result;\n }\n\n return this.signer?.request(arg as any);\n }\n}\n", "import { EventEmitter } from 'events';\nimport { EventName } from '../types/eventName';\n\nconst events = new EventEmitter();\nevents.setMaxListeners(100);\n\nexport const getPendingSignEventAccount = () => {\n return (\n events.listenerCount(EventName.sendUserOpResult) +\n events.listenerCount(EventName.personalSignResult) +\n events.listenerCount(EventName.signTypedDataResult)\n );\n};\n\nexport default events;\n", "const txConfirm = {\n isNotRemind: () => {\n if (typeof window === 'undefined') return false;\n const value = localStorage.getItem('tx-confirm-modal-remind');\n return value === '0';\n },\n setNotRemind: (notRemind: boolean) => {\n if (typeof window === 'undefined') return;\n if (notRemind) {\n localStorage.setItem('tx-confirm-modal-remind', '0');\n } else {\n localStorage.removeItem('tx-confirm-modal-remind');\n }\n },\n reset: () => {\n if (typeof window === 'undefined') return;\n localStorage.removeItem('tx-confirm-modal-remind');\n },\n};\n\nexport default txConfirm;\n", "import type { IEthereumProvider, JsonRpcRequest } from '@particle-network/aa';\nimport { EventName } from '../types/eventName';\nimport { EVMMethod } from '../types/evmMethod';\nimport events, { getPendingSignEventAccount } from '../utils/eventUtils';\nimport txConfirm from '../utils/txConfirmUtils';\n\nexport class WalletClientProvider implements IEthereumProvider {\n constructor(private provider: IEthereumProvider) {}\n\n on(event: string, listener: any): this {\n this.provider.on(event, listener);\n return this;\n }\n\n once(event: string, listener: any): this {\n this.provider.once(event, listener);\n return this;\n }\n\n off(event: string, listener: any): this {\n this.provider.off(event, listener);\n return this;\n }\n\n removeListener(event: string, listener: any): this {\n this.provider.removeListener(event, listener);\n return this;\n }\n\n async request(arg: Partial<JsonRpcRequest>): Promise<any> {\n const method = arg.method;\n if (!method) {\n throw new Error('Method not found.');\n }\n\n if (method === EVMMethod.personalSign || method.startsWith(EVMMethod.signTypedData)) {\n const showConfirmModal = !txConfirm.isNotRemind();\n if (showConfirmModal) {\n if (getPendingSignEventAccount() > 0) {\n throw new Error('Operation failed, there is a transaction being processed');\n }\n }\n if (!showConfirmModal) {\n return this.provider.request(arg as any);\n }\n }\n\n if (method === EVMMethod.personalSign) {\n console.log('personal_sign ---- ', arg);\n return new Promise<string>((resolve, reject) => {\n events.emit(EventName.personalSign, arg);\n events.once(EventName.personalSignResult, ({ result, error }) => {\n if (result) {\n resolve(result);\n } else {\n reject(error);\n }\n });\n });\n } else if (method.startsWith(EVMMethod.signTypedData)) {\n return new Promise<string>((resolve, reject) => {\n events.emit(EventName.signTypedData, arg);\n events.once(EventName.signTypedDataResult, ({ result, error }) => {\n if (result) {\n resolve(result);\n } else {\n reject(error);\n }\n });\n });\n }\n\n return this.provider.request(arg as any);\n }\n}\n", "\nconst digest = '906d42389ecad5c2ab92642c8e0775ea667c413b069684ce9d01199562f2d0be';\nconst classes = {\"loader\":\"_loader_g0am3_1\",\"rotate\":\"_rotate_g0am3_1\",\"prixClipFix\":\"_prixClipFix_g0am3_1\"};\nconst css = `._loader_g0am3_1{animation:_rotate_g0am3_1 1s linear infinite;border-radius:50%;height:20px;position:relative;width:20px}._loader_g0am3_1:before{animation:_prixClipFix_g0am3_1 2s linear infinite;border:2px solid #000;border-radius:50%;box-sizing:border-box;content:\"\";inset:0;position:absolute}@keyframes _rotate_g0am3_1{to{transform:rotate(1turn)}}@keyframes _prixClipFix_g0am3_1{0%{clip-path:polygon(50% 50%,0 0,0 0,0 0,0 0,0 0)}25%{clip-path:polygon(50% 50%,0 0,100% 0,100% 0,100% 0,100% 0)}50%{clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)}75%{clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)}to{clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0)}}`;\n\n(function() {\n if (typeof document !== \"undefined\" && !document.getElementById(digest)) {\n var ele = document.createElement('style');\n ele.id = digest;\n ele.textContent = css;\n document.head.appendChild(ele);\n }\n})();\n\nexport default classes;\nexport { css, digest, classes };\n ", "import { type CSSProperties } from 'react';\nimport styles from './spinner.module.scss';\n\nconst Spinner = ({ className, style }: { className?: string; style?: CSSProperties | undefined }) => {\n return <span className={styles.loader + (className ? ` ${className}` : '')} style={style}></span>;\n};\n\nexport default Spinner;\n", "\nconst digest = '424d614dbc2763d7cad7ca35c00bd255c6ed55da308a1f3018594201a47127bf';\nconst classes = {\"btn\":\"_btn_ofd87_1\"};\nconst css = `._btn_ofd87_1{align-items:center;background:#fff;border-radius:8px;color:#000;display:flex;flex-direction:row;font-size:16px;gap:16px;justify-content:center;padding:6px 24px;position:relative}._btn_ofd87_1:hover{opacity:.85}._btn_ofd87_1:disabled{background:hsla(0,0%,100%,.2);color:hsla(0,0%,100%,.639);cursor:not-allowed;opacity:1}`;\n\n(function() {\n if (typeof document !== \"undefined\" && !document.getElementById(digest)) {\n var ele = document.createElement('style');\n ele.id = digest;\n ele.textContent = css;\n document.head.appendChild(ele);\n }\n})();\n\nexport default classes;\nexport { css, digest, classes };\n ", "import { type CSSProperties, type ReactNode } from 'react';\nimport Spinner from '../spinner';\nimport styles from './button.module.scss';\n\nconst Button = ({\n children,\n isLoading,\n isDisabled,\n onClick,\n className,\n style,\n}: {\n children: ReactNode;\n isLoading?: boolean;\n isDisabled?: boolean;\n onClick?: () => void;\n className?: string;\n style?: CSSProperties | undefined;\n}) => {\n return (\n <button\n className={styles.btn + (className ? ` ${className}` : '')}\n onClick={isLoading || isDisabled ? undefined : onClick}\n disabled={isDisabled}\n style={style}\n >\n {isLoading && !isDisabled && <Spinner />}\n {children}\n </button>\n );\n};\n\nexport default Button;\n", "import { useEffect, useMemo, useState, type CSSProperties, type MouseEventHandler, type ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\nimport { RemoveScroll } from 'react-remove-scroll';\nimport styles from './modal.module.scss';\n\ninterface ModalProp {\n open: boolean;\n onClose: () => void;\n children: ReactNode;\n isDismissable?: boolean;\n contentStyle?: CSSProperties | undefined;\n contentClassName?: string;\n}\n\nconst stopPropagation: MouseEventHandler<unknown> = (event) => event.stopPropagation();\n\nconst Modal = ({ open, onClose, children, isDismissable = true, contentStyle, contentClassName }: ModalProp) => {\n const handleBackdropClick = useMemo(() => (isDismissable ? onClose : undefined), [onClose, isDismissable]);\n\n useEffect(() => {\n if (isDismissable) {\n const handleEscape = (event: KeyboardEvent) => open && event.key === 'Escape' && onClose();\n\n document.addEventListener('keydown', handleEscape);\n\n return () => document.removeEventListener('keydown', handleEscape);\n }\n }, [open, onClose, isDismissable]);\n\n const [bodyScrollable, setBodyScrollable] = useState(true);\n useEffect(() => {\n setBodyScrollable(getComputedStyle(window.document.body).overflow !== 'hidden');\n }, []);\n\n return (\n <>\n {open\n ? createPortal(\n <RemoveScroll enabled={bodyScrollable}>\n <div className={styles.container} onClick={handleBackdropClick}>\n <div\n className={styles.modal + (contentClassName ? ` ${contentClassName}` : '')}\n style={contentStyle}\n onClick={stopPropagation}\n >\n {children}\n </div>\n </div>\n </RemoveScroll>,\n document.body\n )\n : null}\n </>\n );\n};\n\nexport default Modal;\n", "\nconst digest = '9c9a003376c4060e772fdba1e4b20a9af75a33b996c44ae9cea877de3ceb1b80';\nconst classes = {\"container\":\"_container_1s3ca_1\",\"modal\":\"_modal_1s3ca_18\"};\nconst css = `._container_1s3ca_1{align-items:center;backdrop-filter:blur(12px);background:rgba(0,0,0,.502);bottom:0;color:#fff;display:flex;height:100%;justify-content:center;left:0;overflow:hidden;position:fixed;right:0;top:0;width:100%;z-index:100000}._container_1s3ca_1 ._modal_1s3ca_18{align-items:center;background-color:#131313;border-radius:16px;display:flex;flex-direction:column;font-size:14px;height:auto;margin:16px;max-height:80%;max-width:100%;overflow:auto;padding:24px;position:relative;width:380px}`;\n\n(function() {\n if (typeof document !== \"undefined\" && !document.getElementById(digest)) {\n var ele = document.createElement('style');\n ele.id = digest;\n ele.textContent = css;\n document.head.appendChild(ele);\n }\n})();\n\nexport default classes;\nexport { css, digest, classes };\n ", "\nconst digest = '9f37532ca7be1b0e97d8b75261330d17b9316635d48e9ec58b471baefd1f674c';\nconst classes = {\"connectModal\":\"_connectModal_1tdkv_1\",\"title\":\"_title_1tdkv_4\",\"closeBtn\":\"_closeBtn_1tdkv_9\",\"backBtn\":\"_backBtn_1tdkv_15\",\"walletItem\":\"_walletItem_1tdkv_21\",\"walletIcon\":\"_walletIcon_1tdkv_41\",\"walletName\":\"_walletName_1tdkv_46\",\"connecting\":\"_connecting_1tdkv_50\",\"connectingIconContainer\":\"_connectingIconContainer_1tdkv_58\",\"retryContainer\":\"_retryContainer_1tdkv_61\",\"retryIcon\":\"_retryIcon_1tdkv_70\",\"connectingIcon\":\"_connectingIcon_1tdkv_58\",\"connection\":\"_connection_1tdkv_79\",\"acceptRequest\":\"_acceptRequest_1tdkv_83\",\"btnDownload\":\"_btnDownload_1tdkv_90\"};\nconst css = `._connectModal_1tdkv_1{gap:12px}._connectModal_1tdkv_1 ._title_1tdkv_4{font-size:18px;font-weight:700;margin-bottom:16px}._connectModal_1tdkv_1 ._closeBtn_1tdkv_9{cursor:pointer;position:absolute;right:16px;top:16px}._connectModal_1tdkv_1 ._backBtn_1tdkv_15{cursor:pointer;left:16px;position:absolute;top:16px}._connectModal_1tdkv_1 ._walletItem_1tdkv_21{background-color:hsla(0,0%,100%,.05);border:1px solid transparent;border-radius:8px;box-sizing:border-box;color:#fff;cursor:pointer;display:flex;font-size:14px;font-weight:700;gap:12px;padding:8px 16px;transition:all .15s ease;width:100%}._connectModal_1tdkv_1 ._walletItem_1tdkv_21:hover{background:hsla(0,0%,100%,.08);border-color:#ff7a00;color:#ff7a00}._connectModal_1tdkv_1 ._walletItem_1tdkv_21 ._walletIcon_1tdkv_41{border-radius:8px;height:32px;width:32px}._connectModal_1tdkv_1 ._walletItem_1tdkv_21 ._walletName_1tdkv_46{flex-grow:1;line-height:32px}._connectModal_1tdkv_1 ._connecting_1tdkv_50{align-items:center;display:flex;flex-direction:column;height:204px;justify-content:center;width:100%}._connectModal_1tdkv_1 ._connecting_1tdkv_50 ._connectingIconContainer_1tdkv_58{position:relative}._connectModal_1tdkv_1 ._connecting_1tdkv_50 ._connectingIconContainer_1tdkv_58 ._retryContainer_1tdkv_61{background:#4b5563;border-radius:50%;bottom:-12px;cursor:pointer;padding:4px;position:absolute;right:-12px}._connectModal_1tdkv_1 ._connecting_1tdkv_50 ._connectingIconContainer_1tdkv_58 ._retryContainer_1tdkv_61 ._retryIcon_1tdkv_70{height:24px;width:24px}._connectModal_1tdkv_1 ._connecting_1tdkv_50 ._connectingIcon_1tdkv_58{border-radius:4px;height:60px;width:60px}._connectModal_1tdkv_1 ._connecting_1tdkv_50 ._connection_1tdkv_79{font-size:18px;margin-top:20px}._connectModal_1tdkv_1 ._connecting_1tdkv_50 ._acceptRequest_1tdkv_83{color:hsla(0,0%,100%,.4);font-size:14px;margin-top:6px;text-align:center;white-space:pre-wrap}._connectModal_1tdkv_1 ._connecting_1tdkv_50 ._btnDownload_1tdkv_90{margin-top:20px}`;\n\n(function() {\n if (typeof document !== \"undefined\" && !document.getElementById(digest)) {\n var ele = document.createElement('style');\n ele.id = digest;\n ele.textContent = css;\n document.head.appendChild(ele);\n }\n})();\n\nexport default classes;\nexport { css, digest, classes };\n ", "import type { RequestArguments, UserOpBundle } from '@particle-network/aa';\nimport { chains } from '@particle-network/chains';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { formatEther, hexToString, type Hex } from 'viem';\nimport { useConnectProvider } from '../../context';\nimport { useETHProvider } from '../../hooks';\nimport { useAccountContract } from '../../hooks/useAccountContract';\nimport checkBox from '../../icons/check_box.svg';\nimport checkBoxBlank from '../../icons/check_box_blank.svg';\nimport close from '../../icons/close.svg';\nimport copy from '../../icons/copy.svg';\nimport { type EVMDeserializeTransactionResult } from '../../types/deserializeTx';\nimport { EventName } from '../../types/eventName';\nimport { EVMMethod } from '../../types/evmMethod';\nimport { shortString } from '../../utils';\nimport { caculateNativeFee } from '../../utils/ethereumUtils';\nimport events from '../../utils/eventUtils';\nimport txConfirm from '../../utils/txConfirmUtils';\nimport Button from '../button';\nimport CopyText from '../copyText';\nimport Modal from '../modal';\nimport TransactionDetails from '../transactionDetails';\nimport styles from './sign.module.scss';\n\nconst SignModal = ({\n open,\n onClose,\n onOpen,\n}: {\n open: boolean;\n onClose: () => void;\n onOpen: () => void;\n}) => {\n const [userOpBundle, setUserOpBundle] = useState<UserOpBundle>();\n const [notRemindChecked, setNotRemindChecked] = useState<boolean>(false);\n const [loading, setLoading] = useState<boolean>(false);\n const [deserializeLoading, setDeserializeLoading] = useState<boolean>(false);\n const [deserializeResult, setDeserializeResult] = useState<\n EVMDeserializeTransactionResult[] | undefined\n >();\n const [disabled, setDisabled] = useState<boolean>(false);\n const [showNotRemind, setShowNotRemind] = useState<boolean>(true);\n const [nativeBalance, setNativeBalance] = useState<bigint>();\n const { accountContract } = useAccountContract();\n\n // personal_sign or eth_signTypedData\n const [requestArguments, setRequestArguments] = useState<RequestArguments>();\n\n const { chainId, publicClient, evmAccount, provider } = useETHProvider();\n const { smartAccount } = useConnectProvider();\n\n useEffect(() => {\n if (!open) {\n setDeserializeResult(undefined);\n setUserOpBundle(undefined);\n setRequestArguments(undefined);\n setLoading(false);\n setDisabled(false);\n setDeserializeLoading(false);\n setNativeBalance(undefined);\n }\n }, [open]);\n\n useEffect(() => {\n if (open) {\n const notRemind = txConfirm.isNotRemind();\n setShowNotRemind(!notRemind);\n if (!notRemind) {\n setNotRemindChecked(false);\n }\n }\n }, [open]);\n\n const chainInfo = useMemo(() => {\n if (chainId) {\n return chains.getEVMChainInfoById(chainId);\n }\n }, [chainId]);\n\n useEffect(() => {\n const onSendUserOp = (opBundle: UserOpBundle) => {\n setUserOpBundle(opBundle);\n onOpen();\n };\n const onPersonalSign = (arg: RequestArguments) => {\n setRequestArguments(arg);\n onOpen();\n };\n const onSignTypedData = (arg: RequestArguments) => {\n setRequestArguments(arg);\n onOpen();\n };\n events.on(EventName.sendUserOp, onSendUserOp);\n events.on(EventName.personalSign, onPersonalSign);\n events.on(EventName.signTypedData, onSignTypedData);\n return () => {\n events.off(EventName.sendUserOp, onSendUserOp);\n events.off(EventName.personalSign, onPersonalSign);\n events.off(EventName.signTypedData, onSignTypedData);\n };\n }, [onOpen, setUserOpBundle]);\n\n const deserializeUserOp = useCallback(async () => {\n if (userOpBundle && smartAccount) {\n const addresses = await smartAccount.provider.request({ method: 'eth_accounts' });\n const owner = addresses[0];\n const result = await smartAccount.sendRpc({\n method: 'particle_aa_deserializeUserOp',\n params: [\n {\n name: accountContract.name,\n version: accountContract.version,\n ownerAddress: owner,\n },\n userOpBundle.userOp,\n ],\n });\n return result;\n }\n }, [userOpBundle, smartAccount, accountContract]);\n\n useEffect(() => {\n if (userOpBundle && open) {\n console.log('deserializeUserOp start');\n setDeserializeLoading(true);\n deserializeUserOp()\n .then((result) => {\n console.log('\uD83D\uDE80 ~ deserializeUserOp ~ result:', result);\n setDeserializeResult(result as any);\n })\n .catch((error) => {\n console.log('\uD83D\uDE80 ~ deserializeUserOp ~ error:', error);\n events.emit(EventName.sendUserOpResult, {\n error,\n });\n onClose();\n });\n }\n }, [deserializeUserOp, userOpBundle, open, onClose]);\n\n useEffect(() => {\n if (open && publicClient && evmAccount && userOpBundle) {\n publicClient\n .getBalance({ address: evmAccount as Hex })\n .then((result: any) => setNativeBalance(result))\n .catch((error: any) => {\n console.log('\uD83D\uDE80 ~ getBalance ~ error:', error);\n events.emit(EventName.sendUserOpResult, {\n error,\n });\n onClose();\n });\n }\n }, [open, publicClient, evmAccount, userOpBundle, onClose]);\n\n useEffect(() => {\n if (nativeBalance != null && deserializeResult != null) {\n setDeserializeLoading(false);\n }\n }, [nativeBalance, deserializeResult]);\n\n const toggleNotRemind = () => {\n setNotRemindChecked(!notRemindChecked);\n txConfirm.setNotRemind(!notRemindChecked);\n };\n\n const gasFee = useMemo(() => {\n if (userOpBundle?.userOp) {\n return caculateNativeFee(userOpBundle?.userOp);\n }\n return BigInt(0);\n }, [userOpBundle]);\n\n const closeModal = () => {\n let event;\n if (userOpBundle) {\n event = EventName.sendUserOpResult;\n } else if (requestArguments?.method === EVMMethod.personalSign) {\n event = EventName.personalSignResult;\n } else if (requestArguments?.method?.startsWith(EVMMethod.signTypedData)) {\n event = EventName.signTypedDataResult;\n }\n\n if (event) {\n events.emit(event, {\n error: {\n code: 4001,\n message: 'The user rejected the request.',\n },\n });\n }\n\n onClose();\n };\n\n const confirmTx = useCallback(async () => {\n if (smartAccount && provider) {\n setLoading(true);\n if (userOpBundle) {\n try {\n const hash = await smartAccount.sendUserOperation(userOpBundle);\n events.emit(EventName.sendUserOpResult, { result: hash });\n } catch (error) {\n events.emit(EventName.sendUserOpResult, {\n error,\n });\n } finally {\n setLoading(false);\n }\n } else if (requestArguments) {\n try {\n const hash = await provider.request(requestArguments);\n events.emit(\n requestArguments.method == EVMMethod.personalSign\n ? EventName.personalSignResult\n : EventName.signTypedDataResult,\n { result: hash },\n );\n } catch (error) {\n events.emit(\n requestArguments.method == EVMMethod.personalSign\n ? EventName.personalSignResult\n : EventName.signTypedDataResult,\n {\n error,\n },\n );\n } finally {\n setLoading(false);\n }\n }\n\n onClose();\n }\n }, [smartAccount, provider, requestArguments, userOpBundle, onClose]);\n\n useEffect(() => {\n if (userOpBundle && nativeBalance != null && deserializeResult) {\n const nativeChange = deserializeResult\n .filter(\n (item) =>\n item.estimatedChanges.natives?.[0]?.nativeChange &&\n item.estimatedChanges.natives[0].nativeChange.startsWith('-'),\n )\n .map((item) =>\n BigInt(item.estimatedChanges?.natives?.[0]?.nativeChange?.replace('-', '') || 0),\n )\n .reduce((accumulator, currentValue) => accumulator + currentValue, BigInt(0));\n if (userOpBundle.userOp.paymasterAndData.length > 2) {\n setDisabled(nativeBalance < nativeChange);\n } else {\n setDisabled(nativeBalance < gasFee + nativeChange);\n }\n }\n }, [userOpBundle, gasFee, nativeBalance, deserializeResult]);\n\n const unsignedMessage = useMemo(() => {\n if (!requestArguments) {\n return undefined;\n }\n\n if (requestArguments.method === EVMMethod.personalSign) {\n const message = requestArguments.params?.[0] || '0x';\n return hexToString(message);\n } else {\n const typedData = requestArguments.params?.[1];\n const obj = typeof typedData === 'string' ? JSON.parse(typedData) : typedData;\n return JSON.stringify(obj, null, 2);\n }\n }, [requestArguments]);\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n isDismissable={false}\n contentClassName={styles.modalContent}\n >\n <>\n <img className={styles.closeBtn} src={close} onClick={closeModal}></img>\n\n {requestArguments && (\n <div className={styles.signTitle}>\n {requestArguments.method == EVMMethod.personalSign ? 'Sign Message' : 'Sign Typed Data'}\n </div>\n )}\n\n <div className={styles.chainInfo}>\n <img src={chainInfo?.icon}></img>\n {chainInfo?.fullname.replace('Mainnet', '')}\n </div>\n\n <div className={styles.addressContainer}>\n <CopyText value={evmAccount} style={{ textDecorationLine: 'none' }}>\n <div className={styles.addressInfo}>\n {shortString(evmAccount)}\n <img src={copy}></img>\n </div>\n </CopyText>\n </div>\n\n <div\n className={\n styles.detailsContent + (deserializeResult || requestArguments ? ` ${styles.fill}` : '')\n }\n >\n {deserializeResult &&\n deserializeResult.map((details, index) => (\n <TransactionDetails key={`${details.type}-${index}`} details={details} />\n ))}\n\n {unsignedMessage && <div className={styles.unsignedMessage}>{unsignedMessage}</div>}\n </div>\n\n {gasFee && (\n <div className={styles.estimatedGas}>{`Estimated gas fee: ${formatEther(gasFee)} ${\n chainInfo?.nativeCurrency.symbol\n }`}</div>\n )}\n\n <Button\n onClick={confirmTx}\n className={styles.signBtn}\n isLoading={loading || deserializeLoading}\n isDisabled={disabled}\n >\n {deserializeLoading ? 'LOADING' : disabled ? 'INSUFFICIENT FEE' : 'CONFIRM'}\n </Button>\n\n {showNotRemind && (\n <div className={styles.notRemind} onClick={toggleNotRemind}>\n <img src={notRemindChecked ? checkBox : checkBoxBlank}></img>\n Do not remind me again\n </div>\n )}\n </>\n </Modal>\n );\n};\n\nexport default SignModal;\n", "import { bytesToHex, publicToAddress, toBytes, toChecksumAddress } from '@ethereumjs/util';\nimport type { UserOp } from '@particle-network/aa';\n\nexport const pubKeyToEVMAddress = (pubKey: string) => {\n const address = toChecksumAddress(bytesToHex(publicToAddress(toBytes(`0x${pubKey}`), true)));\n return address;\n};\n\nexport function caculateNativeFee(userOp: UserOp): bigint {\n return (\n (BigInt(userOp.callGasLimit) +\n BigInt(userOp.verificationGasLimit) +\n BigInt(userOp.preVerificationGas)) *\n BigInt(userOp.maxFeePerGas)\n );\n}\n", "import { useState, type CSSProperties } from 'react';\nimport { copyToClipboard } from '../../utils';\nimport styles from './copyText.module.scss';\n\nexport interface CopyTextProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n value?: string;\n className?: string;\n style?: CSSProperties | undefined;\n}\n\nexport default function CopyText({ children, value, className, style }: CopyTextProps) {\n const [copied, setCopied] = useState<boolean>();\n\n const handleClick = async () => {\n if (copied) {\n return;\n }\n\n try {\n if (value) {\n await copyToClipboard(value);\n } else if (typeof children === 'string' || typeof children === 'number' || typeof children === 'boolean') {\n await copyToClipboard(children.toString());\n } else {\n throw new Error('please set copy value');\n }\n setCopied(true);\n setTimeout(() => setCopied(false), 1000);\n } catch (error) {\n //ignore\n }\n };\n\n return (\n <div\n className={styles.copyText + (className ? ` ${className}` : '') + (copied ? ` ${styles.copied}` : '')}\n onClick={handleClick}\n style={style}\n >\n {copied ? 'Copied' : children}\n </div>\n );\n}\n", "\nconst digest = 'd6fbb5df7ed6ec51d41f665ca768306181bb1e7d7c1cef8eed9bd4230368d7bb';\nconst classes = {\"copyText\":\"_copyText_smolu_1\",\"copied\":\"_copied_smolu_9\"};\nconst css = `._copyText_smolu_1{cursor:pointer;text-decoration-line:underline}._copyText_smolu_1:hover{opacity:.75}._copied_smolu_9{color:#a855f7;cursor:none;text-decoration-line:none}._copied_smolu_9:hover{opacity:1}`;\n\n(function() {\n if (typeof document !== \"undefined\" && !document.getElementById(digest)) {\n var ele = document.createElement('style');\n ele.id = digest;\n ele.textContent = css;\n document.head.appendChild(ele);\n }\n})();\n\nexport default classes;\nexport { css, digest, classes };\n ", "import { chains } from '@particle-network/chains';\nimport { useCallback, useMemo } from 'react';\nimport { formatUnits } from 'viem';\nimport { useETHProvider } from '../../hooks';\nimport unverified from '../../icons/unverified.svg';\nimport verified from '../../icons/verified.svg';\nimport {\n TransactionSmartType,\n type EVMDeserializeTransactionResult,\n type EVMTokenChange,\n} from '../../types/deserializeTx';\nimport { defaultTokenIcon, ipfsToSrc, shortString } from '../../utils';\nimport CopyText from '../copyText';\nimport Tooltip from '../tooltip';\nimport styles from './transactionDetails.module.scss';\n\nconst TransactionDetails = ({ details }: { details: EVMDeserializeTransactionResult }) => {\n const { chainId } = useETHProvider();\n\n const chainInfo = useMemo(() => {\n if (chainId) {\n return chains.getEVMChainInfoById(chainId);\n }\n }, [chainId]);\n\n const titleContent = useMemo(() => {\n switch (details.type) {\n case TransactionSmartType.NATIVE_TRANSFER:\n return `Send ${chainInfo?.nativeCurrency.symbol}`;\n case TransactionSmartType.ERC20_TRANSFER:\n return `Send ${details.estimatedChanges.tokens[0]?.symbol}`;\n case TransactionSmartType.ERC20_APPROVE:\n return 'Approve Spending';\n case TransactionSmartType.ERC721_TRANFER:\n return 'Send NFT';\n case TransactionSmartType.ERC1155_TRANFER:\n return 'Send NFT';\n default:\n return 'Transaction Details';\n }\n }, [details, chainInfo]);\n\n const nftContractType = useMemo(() => {\n if (details.type === TransactionSmartType.ERC721_TRANFER) {\n return 'ERC721';\n } else if (details.type === TransactionSmartType.ERC1155_TRANFER) {\n return 'ERC1155';\n }\n }, [details]);\n\n const nativeIcon = useMemo(() => {\n if (chainInfo) {\n if (chainInfo.nativeCurrency.symbol === 'ETH') {\n return 'https://static.particle.network/token-list/ethereum/native.png';\n } else {\n return chainInfo.nativeIcon || chainInfo.icon;\n }\n }\n return defaultTokenIcon;\n }, [chainInfo]);\n\n // to address\n const to = useMemo(() => {\n const params = details.data?.function?.params;\n if (details.type == TransactionSmartType.ERC20_TRANSFER) {\n return params ? (params[params.length === 3 ? 1 : 0].value as string) : '';\n } else if (details.type == TransactionSmartType.ERC20_APPROVE) {\n return params ? (params[0].value as string) : '';\n } else if (details.type == TransactionSmartType.NATIVE_TRANSFER) {\n return details.data.to;\n } else if (\n details.type == TransactionSmartType.ERC721_TRANFER ||\n details.type == TransactionSmartType.ERC1155_TRANFER\n ) {\n return params ? (params[1].value as string) : '';\n } else {\n return details.data.to;\n }\n }, [details]);\n\n const balanceChangeTextColor = useCallback((value: string | number) => {\n if (BigInt(value) > 0) {\n return '#4ade80';\n } else if (BigInt(value) < 0) {\n return '#ef4444';\n } else {\n return 'white';\n }\n }, []);\n\n const functionContent = useMemo(() => {\n if (details.type !== TransactionSmartType.NATIVE_TRANSFER && details.data.function) {\n const params = details.data.function.params.map((item) => item.name);\n return `${details.data.function.name}(${params.join(', ')})`;\n }\n }, [details]);\n\n const approveTokenAmount = useMemo(() => {\n if (details.type === TransactionSmartType.ERC20_APPROVE) {\n const amount = details.data?.function?.params?.[1]?.value as string;\n return BigInt(amount || 0);\n }\n return BigInt(0);\n }, [details]);\n\n const tokenAmountChange = useCallback(\n (tokenItem: EVMTokenChange) => {\n const result = formatUnits(\n details.type === TransactionSmartType.ERC20_APPROVE ? approveTokenAmount : BigInt(tokenItem.amountChange),\n tokenItem.decimals\n );\n\n if (details.type !== TransactionSmartType.ERC20_APPROVE && BigInt(tokenItem.amountChange) > BigInt(0)) {\n return `+${result}`;\n }\n\n return result;\n },\n [approveTokenAmount, details]\n );\n\n const showContactAddress = useMemo(() => {\n return (\n details.type === TransactionSmartType.ERC20_TRANSFER ||\n details.type === TransactionSmartType.ERC20_APPROVE ||\n details.type === TransactionSmartType.ERC721_TRANFER ||\n details.type === TransactionSmartType.ERC1155_TRANFER\n );\n }, [details]);\n\n return (\n <div className={styles.detailsCard}>\n <div className={styles.title}>{titleContent}</div>\n {nftContractType && <div className={styles.nftContract}>{nftContractType}</div>}\n\n {details.estimatedChanges.natives.map((nativeItem) => {\n return (\n <div key={nativeItem.address} className={styles.row}>\n <img className={styles.tokenIcon} src={nativeIcon}></img>\n <div className={styles.balanceChange} style={{ color: balanceChangeTextColor(nativeItem.nativeChange) }}>\n {BigInt(nativeItem.nativeChange) > 0 ? '+' : undefined}\n {formatUnits(BigInt(nativeItem.nativeChange), chainInfo?.nativeCurrency.decimals || 18)}\n </div>\n <div className={styles.tokenSymbol}>{chainInfo?.nativeCurrency.symbol}</div>\n </div>\n );\n })}\n\n {details.estimatedChanges.tokens.map((tokenItem) => {\n return (\n <div key={tokenItem.address} className={styles.row}>\n <img className={styles.tokenIcon} src={tokenItem.image || defaultTokenIcon}></img>\n <div className={styles.balanceChange}>\n <span style={{ color: balanceChangeTextColor(tokenItem.amountChange) }}>\n {tokenAmountChange(tokenItem)}\n </span>\n {` ${tokenItem.symbol}`}\n </div>\n </div>\n );\n })}\n\n {details.estimatedChanges.nfts.map((nftItem) => {\n return (\n <div key={nftItem.address} className={styles.row}>\n <div style={{ fontSize: 16 }}>\n <img className={styles.nftIcon} src={ipfsToSrc(nftItem.image || defaultTokenIcon)}></img>\n {nftItem.name || `NFT#${nftItem.tokenId}`}\n </div>\n <div className={styles.balanceChange} style={{ color: balanceChangeTextColor(nftItem.amountChange) }}>\n {nftItem.amountChange}\n </div>\n </div>\n );\n })}\n\n {to && (\n <div className={styles.row}>\n <div>To</div>\n <div className={styles.toContract}>\n {details.toVerified != null && !showContactAddress && (\n <Tooltip content={details.toVerified ? 'Verified Contract' : 'Unverified Contract'}>\n <img src={details.toVerified ? verified : unverified}></img>\n </Tooltip>\n )}\n <CopyText value={to}>{shortString(to)}</CopyText>\n </div>\n </div>\n )}\n\n {showContactAddress && (\n <div className={styles.row}>\n <div>Contract</div>\n <div className={styles.toContract}>\n {details.toVerified != null && (\n <Tooltip content={details.toVerified ? 'Verified Contract' : 'Unverified Contract'}>\n <img src={details.toVerified ? verified : unverified}></img>\n </Tooltip>\n )}\n <CopyText value={details.data.to}>{shortString(details.data.to)}</CopyText>\n </div>\n </div>\n )}\n\n <div className={styles.row}>\n <div>Hex Data</div>\n <CopyText value={details.data.data}>{shortString(details.data.data)}</CopyText>\n </div>\n\n {functionContent && (\n <div className={styles.row}>\n <div>Function</div>\n <div className={styles.right}>{functionContent}</div>\n </div>\n )}\n </div>\n );\n};\n\nexport default TransactionDetails;\n", "\nconst digest = 'ee15dc27fcfd209601159e7f0e0063ff4e7a886b7b892c1600a911372b82a0b1';\nconst classes = {\"tipContainer\":\"_tipContainer_ufud7_1\",\"tipContent\":\"_tipContent_ufud7_5\"};\nconst css = `._tipContainer_ufud7_1{overflow:visible;position:relative}._tipContainer_ufud7_1 ._tipContent_ufud7_5{background:#3f3f46;border-radius:8px;bottom:100%;color:#fff;font-size:11px;left:-100%;opacity:0;padding:3px 6px;position:absolute;transition:opacity .5s;visibility:hidden;white-space:nowrap;z-index:1}._tipContainer_ufud7_1:hover ._tipContent_ufud7_5{opacity:1;visibility:visible}`;\n\n(function() {\n if (typeof document !== \"undefined\" && !document.getElementById(digest)) {\n var ele = document.createElement('style');\n ele.id = digest;\n ele.textContent = css;\n document.head.appendChild(ele);\n }\n})();\n\nexport default classes;\nexport { css, digest, classes };\n ", "import { type ReactNode } from 'react';\nimport styles from './tooltip.module.scss';\n\nconst Tooltip = ({ children, content, className }: { children: ReactNode; content: string; className?: string }) => {\n return (\n <div className={styles.tipContainer}>\n {children}\n <div className={styles.tipContent + (className ? ` ${className}` : '')}>{content}</div>\n </div>\n );\n};\n\nexport default Tooltip;\n", "\nconst digest = 'a81c744751497ed4b401c08b9e5aeef1991aeb86f2cbba3ee57c1926c0502f1a';\nconst classes = {\"detailsCard\":\"_detailsCard_ml2p9_1\",\"title\":\"_title_ml2p9_13\",\"nftContract\":\"_nftContract_ml2p9_19\",\"row\":\"_row_ml2p9_26\",\"tokenIcon\":\"_tokenIcon_ml2p9_35\",\"nftIcon\":\"_nftIcon_ml2p9_41\",\"balanceChange\":\"_balanceChange_ml2p9_49\",\"tokenSymbol\":\"_tokenSymbol_ml2p9_56\",\"toContract\":\"_toContract_ml2p9_61\",\"right\":\"_right_ml2p9_71\"};\nconst css = `._detailsCard_ml2p9_1{background:#232529;border:1px solid #252525;border-radius:8px;color:#fff;margin-top:16px;overflow-x:hidden;padding:10px;position:relative;width:100%}._detailsCard_ml2p9_1 ._title_ml2p9_13{font-size:16px;font-weight:600;margin-bottom:12px;text-align:left}._detailsCard_ml2p9_1 ._nftContract_ml2p9_19{color:#a855f7;font-size:16px;position:absolute;right:8px;top:8px}._detailsCard_ml2p9_1 ._row_ml2p9_26{align-items:center;display:flex;flex-direction:row;font-size:14px;gap:8px;justify-content:space-between;margin-top:6px}._detailsCard_ml2p9_1 ._row_ml2p9_26 ._tokenIcon_ml2p9_35{border-radius:50%;height:32px;margin:10px 0;width:32px}._detailsCard_ml2p9_1 ._row_ml2p9_26 ._nftIcon_ml2p9_41{border-radius:2px;display:inline;height:32px;margin:10px 8px 10px 0;width:32px}._detailsCard_ml2p9_1 ._row_ml2p9_26 ._balanceChange_ml2p9_49{flex-grow:2;font-size:16px;font-weight:500;text-align:end;word-break:break-word}._detailsCard_ml2p9_1 ._row_ml2p9_26 ._tokenSymbol_ml2p9_56{font-size:16px;font-weight:500;text-align:end}._detailsCard_ml2p9_1 ._row_ml2p9_26 ._toContract_ml2p9_61{align-items:center;display:flex;gap:8px}._detailsCard_ml2p9_1 ._row_ml2p9_26 ._toContract_ml2p9_61 img{display:inline;height:18px;width:18px}._detailsCard_ml2p9_1 ._row_ml2p9_26 ._right_ml2p9_71{text-align:end}`;\n\n(function() {\n if (typeof document !== \"undefined\" && !document.getElementById(digest)) {\n var ele = document.createElement('style');\n ele.id = digest;\n ele.textContent = css;\n document.head.appendChild(ele);\n }\n})();\n\nexport default classes;\nexport { css, digest, classes };\n ", "\nconst digest = '3ab1a455562ae7e24c2ac49572897e615b9e9275066fd0d64f0cf24844521bab';\nconst classes = {\"modalContent\":\"_modalContent_aoysu_1\",\"closeBtn\":\"_closeBtn_aoysu_5\",\"signTitle\":\"_signTitle_aoysu_11\",\"chainInfo\":\"_chainInfo_aoysu_16\",\"addressContainer\":\"_addressContainer_aoysu_29\",\"addressInfo\":\"_addressInfo_aoysu_34\",\"detailsContent\":\"_detailsContent_aoysu_49\",\"fill\":\"_fill_aoysu_58\",\"unsignedMessage\":\"_unsignedMessage_aoysu_61\",\"estimatedGas\":\"_estimatedGas_aoysu_76\",\"signBtn\":\"_signBtn_aoysu_81\",\"notRemind\":\"_notRemind_aoysu_85\"};\nconst css = `._modalContent_aoysu_1{color:#fff;text-align:center}._modalContent_aoysu_1 ._closeBtn_aoysu_5{cursor:pointer;position:absolute;right:16px;top:16px}._modalContent_aoysu_1 ._signTitle_aoysu_11{font-size:20px;font-weight:600;margin-bottom:10px}._modalContent_aoysu_1 ._chainInfo_aoysu_16{align-items:center;display:flex;flex-direction:row;font-size:12px;gap:8px;justify-content:center;margin-bottom:8px}._modalContent_aoysu_1 ._chainInfo_aoysu_16 img{height:18px;width:18px}._modalContent_aoysu_1 ._addressContainer_aoysu_29{height:28px;margin-bottom:16px;margin-top:8px}._modalContent_aoysu_1 ._addressContainer_aoysu_29 ._addressInfo_aoysu_34{align-items:center;background:rgba(58,58,58,.635);border-radius:20px;display:flex;flex-direction:row;font-size:12px;gap:4px;justify-content:center;padding:4px 8px}._modalContent_aoysu_1 ._addressContainer_aoysu_29 ._addressInfo_aoysu_34 img{height:18px;width:18px}._modalContent_aoysu_1 ._detailsContent_aoysu_49{max-height:0;overflow-y:auto;transition:max-height .3s linear;width:100%}._modalContent_aoysu_1 ._detailsContent_aoysu_49::-webkit-scrollbar{display:none}._modalContent_aoysu_1 ._detailsContent_aoysu_49._fill_aoysu_58{max-height:500px}._modalContent_aoysu_1 ._detailsContent_aoysu_49 ._unsignedMessage_aoysu_61{background:#232529;border:1px solid #252525;border-radius:8px;box-sizing:border-box;color:#fff;font-size:14px;padding:8px;width:100%;word-wrap:break-word;color:hsla(0,0%,100%,.631);text-align:left;white-space:pre-wrap}._modalContent_aoysu_1 ._estimatedGas_aoysu_76{color:hsla(0,0%,100%,.631);font-size:12px;margin-top:24px}._modalContent_aoysu_1 ._signBtn_aoysu_81{margin-top:24px;min-width:200px}._modalContent_aoysu_1 ._notRemind_aoysu_85{align-items:center;color:hsla(0,0%,100%,.631);cursor:pointer;display:inline-flex;font-size:12px;gap:4px;margin-top:16px}._modalContent_aoysu_1 ._notRemind_aoysu_85:hover{opacity:.85}`;\n\n(function() {\n if (typeof document !== \"undefined\" && !document.getElementById(digest)) {\n var ele = document.createElement('style');\n ele.id = digest;\n ele.textContent = css;\n document.head.appendChild(ele);\n }\n})();\n\nexport default classes;\nexport { css, digest, classes };\n ", "import type { RequestArguments } from '@particle-network/aa';\nimport { chains } from '@particle-network/chains';\nimport { EventEmitter } from 'events';\nimport { UnsupportedProviderMethodError, createPublicClient, http, type PublicClient } from 'viem';\n\nexport class AASignerProvider {\n private events: EventEmitter;\n chainId = 1;\n publicClient: PublicClient;\n constructor(\n public supportChainIds: number[],\n public projectId: string,\n public clientKey: string,\n public rpcUrls: Record<number, string> | undefined,\n ) {\n this.events = new EventEmitter();\n this.events.setMaxListeners(100);\n\n if (typeof window !== 'undefined') {\n const localChainId = localStorage.getItem('connect-evm-chain-id');\n if (localChainId && supportChainIds.includes(Number(localChainId))) {\n this.chainId = Number(localChainId);\n } else {\n const chainId = supportChainIds[0];\n if (chainId) {\n localStorage.setItem('connect-evm-chain-id', chainId.toString());\n this.chainId = chainId;\n }\n }\n }\n\n this.publicClient = this.getPublicClient();\n }\n\n async request(arg: RequestArguments) {\n if (\n arg.method === 'eth_sendTransaction' ||\n arg.method === 'wallet_addEthereumChain' ||\n arg.method === 'wallet_watchAsset' ||\n arg.method === 'eth_sign'\n ) {\n throw new UnsupportedProviderMethodError(\n new Error('The Provider does not support the requested method.'),\n );\n }\n\n const result = await this.publicClient.request(arg as any);\n return result;\n }\n\n personalSign = async (message: string): Promise<string> => {\n throw new Error('Wallet not connected!');\n };\n\n getPublicKey = async (): Promise<string> => {\n throw new Error('Wallet not connected!');\n };\n\n removeListener(event: string, listener: (...args: any[]) => void) {\n this.events.removeListener(event, listener);\n return this;\n }\n\n on(event: string, listener: (...args: any[]) => void) {\n this.events.on(event, listener);\n return this;\n }\n\n once(event: string, listener: any) {\n this.events.once(event, listener);\n return this;\n }\n\n off(event: string, listener: any) {\n this.events.off(event, listener);\n return this;\n }\n\n emit(event: string, ...args: any[]) {\n this.events.emit(event, args);\n }\n\n getPublicClient = () => {\n const rpcUrl =\n this?.rpcUrls?.[this.chainId] || chains.getEVMChainInfoById(this.chainId || 1)?.rpcUrl;\n console.log('rpcUrl', rpcUrl);\n\n return createPublicClient({\n transport: http(rpcUrl),\n }) as unknown as PublicClient;\n };\n}\n", "import { useCallback, useState } from 'react';\n\nconst useModalStateValue = () => {\n const [isModalOpen, setModalOpen] = useState(false);\n\n return {\n closeModal: useCallback(() => setModalOpen(false), []),\n isModalOpen,\n openModal: useCallback(() => setModalOpen(true), []),\n };\n};\n\nexport default useModalStateValue;\n", "import React, { useContext, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { ConnectProvider as BTCConnectProvider } from '../context';\nimport {\n UnisatConnector,\n XverseConnector,\n OKXConnector,\n BitgetConnector,\n MagicEdenConnector,\n BybitConnector,\n GateConnector,\n // BinanceConnector,\n} from '../connector';\nimport { useBTCProvider, useConnectModal } from '../hooks';\n\nimport ComfirmBox from '../components/confirmBox';\nimport { retryOperation } from '../utils';\n\n// Global handler to prevent duplicate events\nconst eventCache = {\n lastProcessedAccount: '',\n lastProcessedTime: 0,\n};\n\nconst WalletSelectorContext = React.createContext<any>(null);\n\nexport function BtcWalletSelectorContextProvider({\n children,\n}: {\n children: React.ReactNode;\n autoConnect?: boolean;\n}) {\n const [isProcessing, setIsProcessing] = useState(false);\n\n //OKX\uFF0CBitget\uFF0Cbybit\uFF0CXverse\uFF0CUnisat\n const connectors = [\n new OKXConnector(),\n new BitgetConnector(),\n new BybitConnector(),\n new XverseConnector(),\n new UnisatConnector(),\n new MagicEdenConnector(),\n new GateConnector(),\n // new BinanceConnector(),\n ];\n\n const walletSelectorContextValue = useMemo(() => {\n const simpleFn: Record<string, ((e: any) => void)[]> = {};\n\n return {\n setIsProcessing,\n emit: (eventName: string, e: any) => {\n if (simpleFn[eventName] && simpleFn[eventName].length) {\n simpleFn[eventName].forEach((fn: (e: any) => void) => {\n fn(e);\n });\n }\n },\n on: (eventName: string, fn: (e: any) => void) => {\n simpleFn[eventName] = simpleFn[eventName] || [];\n simpleFn[eventName].push(fn);\n },\n };\n }, []);\n\n return (\n <WalletSelectorContext.Provider value={walletSelectorContextValue}>\n <BTCConnectProvider\n options={{\n projectId: 'btc',\n clientKey: 'btc',\n appId: 'btc',\n aaOptions: {\n accountContracts: {\n BTC: [\n {\n chainIds: [686868],\n version: '1.0.0',\n },\n ],\n },\n },\n walletOptions: {\n visible: true,\n },\n }}\n autoConnect={false}\n connectors={connectors}\n >\n {children}\n {isProcessing && (\n <ComfirmBox\n hash={''}\n status={0}\n onClose={() => {\n setIsProcessing(false);\n }}\n />\n )}\n <InitBtcWalletSelectorContext />\n </BTCConnectProvider>\n </WalletSelectorContext.Provider>\n );\n}\n\nfunction InitBtcWalletSelectorContext() {\n const context = useBtcWalletSelector();\n useEffect(() => {\n window.btcContext = context;\n }, [context]);\n return null;\n}\n\nexport function useBtcWalletSelector() {\n // @ts-ignore\n const { openConnectModal, disconnect, requestDirectAccount, connectModalOpen } =\n useConnectModal();\n const {\n accounts,\n sendBitcoin,\n getPublicKey,\n provider,\n signMessage,\n connector,\n getNetwork,\n switchNetwork,\n } = useBTCProvider();\n const connectorRef = useRef<any>(null);\n const context = useContext(WalletSelectorContext);\n\n useEffect(() => {\n const handleAccountsChanged = (account: any) => {\n // Skip processing if we don't have an account\n if (!account?.length) return;\n\n // Create a key for this event\n const accountKey = JSON.stringify(account);\n const now = Date.now();\n\n // Force a minimum time between processing the same account (3 seconds)\n if (\n accountKey === eventCache.lastProcessedAccount &&\n now - eventCache.lastProcessedTime < 3000\n ) {\n return;\n }\n\n // Update cache\n eventCache.lastProcessedAccount = accountKey;\n eventCache.lastProcessedTime = now;\n\n getPublicKey().then((res) => {\n context.emit('updatePublicKey', res);\n });\n };\n\n connector?.on('accountsChanged', handleAccountsChanged);\n connectorRef.current = connector;\n\n return () => {\n connector?.removeListener('accountsChanged', handleAccountsChanged);\n };\n }, [connector, context, getPublicKey]);\n\n const hook = useMemo(() => {\n // Common connect method with two connection modes\n const connectWallet = async (useModal = false) => {\n if (connectModalOpen) return null;\n // const account = accounts?.[0];\n // if (account) return account;\n\n try {\n if (useModal) {\n openConnectModal?.();\n } else {\n await requestDirectAccount(connectorRef.current);\n }\n\n // Wait for account connection\n const account = await retryOperation(\n () => window.btcContext.account,\n (res) => !!res,\n {\n maxRetries: 100,\n delayMs: 1000,\n },\n );\n\n return account || null;\n } catch (error) {\n console.error('btcLoginError', error);\n context.emit('btcLoginError');\n return null;\n }\n };\n\n return {\n login: async () => {\n return connectWallet(true);\n },\n autoConnect: async () => {\n return connectWallet(false);\n },\n logout: () => {\n const accountId = accounts?.[0];\n if (!accountId) return;\n disconnect?.();\n context.emit('btcLogOut');\n },\n account: accounts?.[0],\n getPublicKey: async () => {\n const publicKey = await getPublicKey().catch(() => null);\n if (publicKey) return publicKey;\n\n await connectWallet(false);\n return getPublicKey();\n },\n signMessage: async (msg: string) => {\n await connectWallet(false);\n return signMessage(msg);\n },\n getContext: () => {\n return context;\n },\n getNetwork,\n switchNetwork,\n sendBitcoin: async (toAddress: string, satoshis: number, options?: { feeRate: number }) => {\n await connectWallet(false);\n return sendBitcoin(toAddress, satoshis, options);\n },\n };\n }, [\n accounts,\n getNetwork,\n switchNetwork,\n sendBitcoin,\n connectModalOpen,\n openConnectModal,\n context,\n requestDirectAccount,\n disconnect,\n getPublicKey,\n signMessage,\n ]);\n\n return hook;\n}\n", "import React from 'react';\n// import './modal.css'\n\ninterface Props {\n children?: any;\n onClose?: () => void;\n style?: any\n}\n\nconst styles: any = {}\n\nexport default function Modal({ children, onClose, style = {} }: Props) {\n return <div>\n <div className=\"layer\"></div>\n <div className=\"modal\" style={style}>\n <div className=\"close\" onClick={() => { onClose && onClose() }}>\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7.73284 5.99997L11.7359 1.99698C12.0368 1.69598 12.0882 1.25928 11.8507 1.02188L10.9779 0.149088C10.7404 -0.0884114 10.3043 -0.0363117 10.0028 0.264487L6.00013 4.26737L1.99719 0.264587C1.69619 -0.0367116 1.25948 -0.0884115 1.02198 0.149388L0.149174 1.02228C-0.0882276 1.25938 -0.0368271 1.69608 0.264576 1.99708L4.26761 5.99997L0.264576 10.0032C-0.0363271 10.304 -0.0884276 10.7404 0.149174 10.9779L1.02198 11.8507C1.25948 12.0882 1.69619 12.0367 1.99719 11.7358L6.00033 7.73266L10.0029 11.7352C10.3044 12.0368 10.7405 12.0882 10.978 11.8507L11.8508 10.9779C12.0882 10.7404 12.0368 10.304 11.736 10.0028L7.73284 5.99997Z\" fill=\"#808095\" />\n </svg>\n </div>\n {children}\n </div>\n </div>\n}", "import React from \"react\";\nimport Modal from \"./Modal\";\n\n// import './confirmBox.css'\n\ninterface Props {\n onClose: () => void;\n fromChain?: any;\n toChain?: any;\n status: number;\n hash: string;\n}\n\n\n\nexport default function ComfirmBox({ onClose, status = 1, fromChain = {\n name: 'NEAR',\n}, toChain = {\n name: 'BTC',\n}, hash }: Props) {\n return <Modal onClose={onClose}>\n <div className=\"title\">Transaction Detail</div>\n <div className=\"chians\">\n {/* <img style={{ width: 26, height: 26 }} src={fromChain?.icon} /> */}\n {/* <svg width=\"31\" height=\"2\" viewBox=\"0 0 31 2\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <line opacity=\"0.5\" x1=\"8.74228e-08\" y1=\"1\" x2=\"31\" y2=\"1\" stroke=\"#727272\" stroke-width=\"2\" stroke-dasharray=\"2 5\" />\n </svg> */}\n\n {\n status === 0 ? <svg className=\"loading\" width=\"54\" height=\"54\" viewBox=\"0 0 54 54\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M52.0766 10.7867C53.0482 11.0471 53.6273 12.0399 53.3741 13.0134C53.1219 13.977 52.1361 14.5546 51.1725 14.3024L47.6172 13.3498L46.3268 18.1657C44.8261 23.7665 40.0219 27.6146 34.2721 28.6546C38.7381 32.4056 40.9681 38.1648 39.4673 43.7656L38.1769 48.5815L41.6972 49.5248C42.6655 49.7843 43.2401 50.7794 42.9806 51.7477C42.7212 52.7159 41.726 53.2905 40.7578 53.031L2.02593 42.6529L1.71657 42.5396C0.800668 42.1375 0.383843 41.0689 0.785965 40.153C1.15472 39.3126 2.09436 38.8809 2.97262 39.1481L6.52126 40.0989L7.81144 35.2839C9.31216 29.6832 14.1131 25.8341 19.8661 24.795C15.3968 21.0432 13.1702 15.2848 14.6709 9.68407L15.9615 4.86764L12.4128 3.91679C11.4445 3.65734 10.87 2.66223 11.1295 1.69395C11.3889 0.725662 12.384 0.151138 13.3523 0.410589L52.0766 10.7867ZM44.0959 12.4063L19.471 5.80801L18.1871 10.5994C17.0693 14.7711 18.671 19.3131 22.2022 22.3268C23.2549 23.2994 23.6544 24.61 23.3544 25.7297C23.0485 27.0126 21.9665 27.9627 20.6551 28.1007C16.1146 28.9516 12.432 32.0776 11.3175 36.2502L10.0214 41.0874L11.982 41.6127L12.5291 39.571C13.5385 35.8039 16.032 32.0464 21.0065 30.689L21.8135 30.4937C23.6047 30.2306 25.3145 29.1151 26.9388 27.1507C27.1931 29.441 28.1726 31.2771 29.8857 32.6567C34.4351 36.8 34.1706 41.1245 33.1094 45.0849L32.5623 47.1267L34.6428 47.6841L35.9323 42.8715C37.0501 38.6998 35.4522 34.1588 31.9215 31.1412C30.8693 30.1687 30.4684 28.8613 30.7693 27.7383C31.1136 26.4535 32.114 25.5215 33.4676 25.3711C38.0072 24.5235 41.6865 21.3966 42.8052 17.2216L44.0959 12.4063ZM40.7578 15.6185C40.1797 19.9295 35.6431 22.9023 32.7256 23.2863C30.9809 23.5169 29.1741 24.3456 27.3087 25.7742C26.4809 23.6244 25.3731 22.0143 23.9948 20.9474C21.5041 19.0198 20.6551 17.2216 20.3797 15.1185L40.7578 15.6185Z\" fill=\"white\" fill-opacity=\"0.21\" />\n </svg> : <svg width=\"54\" height=\"54\" viewBox=\"0 0 54 54\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"27\" cy=\"27\" r=\"21\" fill=\"#33FFDA\" />\n <circle cx=\"27\" cy=\"27\" r=\"24\" stroke=\"#33FFDA\" stroke-opacity=\"0.3\" stroke-width=\"6\" />\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M37.342 19.6604C38.2111 20.5494 38.2205 22.0006 37.363 22.9016L24.8987 36L17.651 28.5196C16.7858 27.6266 16.7826 26.1754 17.6439 25.2783C18.5052 24.3813 19.9048 24.378 20.77 25.271L24.8705 29.5031L34.2159 19.6822C35.0733 18.7812 36.4729 18.7714 37.342 19.6604Z\" fill=\"black\" />\n </svg>\n }\n\n {/* <svg width=\"31\" height=\"2\" viewBox=\"0 0 31 2\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <line opacity=\"0.5\" x1=\"8.74228e-08\" y1=\"1\" x2=\"31\" y2=\"1\" stroke=\"#727272\" stroke-width=\"2\" stroke-dasharray=\"2 5\" />\n </svg> */}\n {/* <img style={{ width: 26, height: 26 }} src={toChain?.icon} /> */}\n </div>\n\n {\n status === 0 && <>\n <div className=\"time\">\n Est Time: 5 mins\n </div>\n <div className=\"processing\">\n Transaction is processing. \n </div>\n </>\n }\n\n {\n status === 1 && <>\n <div className=\"time\">\n Bridge Completed\n </div>\n <div className=\"processing\">\n You can view your transaction on the <a href=\"/history\">bridge transaction history.</a>\n </div>\n </>\n }\n\n {\n !!hash && <><div className=\"srcBtn\" onClick={() => {\n if (fromChain.name === 'BTC') {\n window.open(`https://mempool.space/testnet/tx/${hash}`)\n } else if (fromChain.name === 'NEAR') {\n window.open(`https://testnet.nearblocks.io/txns/${hash}`)\n }\n\n }}>\n SRC TX <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M5.97871 8H2.02129C0.907217 8 0 7.09294 0 5.97905V2.02095C0 0.907063 0.907217 0 2.02129 0H3.73973C3.98175 0 4.17779 0.196012 4.17779 0.437986C4.17779 0.679959 3.98175 0.875972 3.73973 0.875972H2.02129C1.71573 0.875972 1.42775 0.994931 1.21142 1.21122C0.995099 1.42751 0.87612 1.71544 0.87612 2.02095V5.97769C0.87612 6.2832 0.995099 6.57114 1.21142 6.78743C1.42775 7.00372 1.71573 7.12268 2.02129 7.12268H5.97871C6.61011 7.12268 7.12388 6.60899 7.12388 5.97769V4.12977C7.12388 3.97432 7.20771 3.82832 7.34291 3.74992C7.40916 3.71206 7.48487 3.69179 7.56194 3.69179C7.63901 3.69179 7.71472 3.71206 7.78097 3.74992C7.91617 3.82832 8 3.97296 8 4.12977V5.97769C8 7.09294 7.09414 8 5.97871 8ZM7.35223 2.78066C7.41578 2.81715 7.48879 2.83608 7.56179 2.83608C7.6348 2.83608 7.70781 2.8158 7.77271 2.7793C7.90251 2.70496 7.98228 2.56572 7.98228 2.41702V0.438001C7.98228 0.206844 7.79434 0.0189453 7.56315 0.0189453H5.58378C5.35258 0.0189453 5.16465 0.206844 5.16465 0.438001C5.16465 0.669157 5.35258 0.857056 5.58378 0.857056H6.55077L3.70328 3.70405L3.70058 3.70676C3.62658 3.7861 3.58634 3.89111 3.58835 3.99958C3.59037 4.10806 3.6345 4.21149 3.7114 4.28803C3.79117 4.36779 3.89527 4.41105 4.00749 4.41105C4.1143 4.41105 4.2157 4.37049 4.29277 4.29885L4.29412 4.2975L7.14267 1.44944V2.41838C7.14267 2.56707 7.22379 2.70631 7.35223 2.78066Z\" fill=\"#FF7A00\" />\n </svg>\n </div>\n </>\n }\n\n {/* {\n status === 1 &&\n <button onClick={() => {\n onClose && onClose()\n }} className={styles.btn}>+ New Transfer</button>\n } */}\n\n </Modal>\n}", "export type ENV = 'mainnet' | 'testnet' | 'private_mainnet' | 'dev';\n\nexport const walletConfig: Record<\n ENV,\n {\n base_url: string;\n btcToken: string;\n btcTokenDecimals: number;\n nearToken: string;\n nearTokenDecimals: number;\n accountContractId: string;\n bridgeContractId: string;\n walletUrl: string;\n bridgeUrl: string;\n }\n> = {\n dev: {\n base_url: 'https://api.dev.satoshibridge.top',\n btcToken: 'nbtc-dev.testnet',\n btcTokenDecimals: 8,\n nearToken: 'wrap.testnet',\n nearTokenDecimals: 24,\n accountContractId: 'acc-dev.testnet',\n bridgeContractId: 'brg-dev.testnet',\n walletUrl: 'https://wallet-dev.satoshibridge.top',\n bridgeUrl: 'https://dev.satoshibridge.top/',\n },\n testnet: {\n base_url: 'https://api.testnet.satoshibridge.top',\n btcToken: 'nbtc2-nsp.testnet',\n btcTokenDecimals: 8,\n nearToken: 'wrap.testnet',\n nearTokenDecimals: 24,\n accountContractId: 'acc2-nsp.testnet',\n bridgeContractId: 'brg2-nsp.testnet',\n walletUrl: 'https://wallet-test.satoshibridge.top',\n bridgeUrl: 'https://testnet.satoshibridge.top/',\n },\n private_mainnet: {\n base_url: 'https://api.stg.satoshibridge.top',\n btcToken: 'nbtc.toalice.near',\n btcTokenDecimals: 8,\n nearToken: 'wrap.near',\n nearTokenDecimals: 24,\n accountContractId: 'acc.toalice.near',\n bridgeContractId: 'brg.toalice.near',\n walletUrl: 'https://wallet-stg.satoshibridge.top',\n bridgeUrl: 'https://old.ramp.satos.network',\n },\n mainnet: {\n base_url: 'https://api.satos.network',\n btcToken: 'nbtc.bridge.near',\n btcTokenDecimals: 8,\n nearToken: 'wrap.near',\n nearTokenDecimals: 24,\n accountContractId: 'acc.ref-labs.near',\n bridgeContractId: 'btc-connector.bridge.near',\n walletUrl: 'https://wallet.satoshibridge.top',\n bridgeUrl: 'https://ramp.satos.network',\n },\n};\n\nexport function getWalletConfig(env: ENV) {\n const config = walletConfig[env];\n const network = env === 'mainnet' || env === 'private_mainnet' ? 'mainnet' : 'testnet';\n return {\n ...config,\n network,\n };\n}\n\nexport const nearRpcUrls = {\n mainnet: [\n 'https://near.lava.build',\n 'https://rpc.mainnet.near.org',\n 'https://free.rpc.fastnear.com',\n 'https://near.drpc.org',\n ],\n testnet: ['https://rpc.testnet.near.org'],\n};\n\nexport const btcRpcUrls = {\n mainnet: 'https://mempool.space/api',\n testnet: 'https://mempool.space/testnet/api',\n};\n", "import Big from 'big.js';\nimport type { ENV } from '../config';\nimport { getWalletConfig, btcRpcUrls } from '../config';\nimport { retryOperation, storageStore } from '../utils';\nimport { nearCallFunction, pollTransactionStatuses } from '../utils/nearUtils';\nimport {\n checkBridgeTransactionStatus,\n getAccountInfo,\n getBridgeConfig,\n getWhitelist,\n preReceiveDepositMsg,\n receiveDepositMsg,\n calculateGasLimit,\n} from '../utils/satoshi';\nimport { Dialog } from '../utils/Dialog';\nimport type { FinalExecutionOutcome, Transaction } from '@near-wallet-selector/core';\nimport * as bitcoin from 'bitcoinjs-lib';\n// @ts-ignore\nimport coinselect from 'coinselect';\n// @ts-ignore\nimport * as ecc from '@bitcoinerlab/secp256k1';\n\nexport { calculateGasLimit, checkBridgeTransactionStatus };\n\n// init ecc lib\nbitcoin.initEccLib(ecc);\n\n/** NEAR Storage Deposit Amount */\nconst NEAR_STORAGE_DEPOSIT_AMOUNT = '1250000000000000000000';\n/** NBTC Storage Deposit Amount */\nconst NBTC_STORAGE_DEPOSIT_AMOUNT = '800';\n/** New account min deposit amount */\nconst NEW_ACCOUNT_MIN_DEPOSIT_AMOUNT = '1000';\n\nfunction getBtcProvider() {\n if (typeof window === 'undefined' || !window.btcContext) {\n throw new Error('BTC Provider is not initialized.');\n }\n return window.btcContext;\n}\n\nasync function getNetwork() {\n try {\n const network = await getBtcProvider().getNetwork();\n console.log('btc network:', network);\n return network === 'livenet' ? 'mainnet' : 'testnet';\n } catch (error) {\n return 'mainnet';\n }\n}\n\nfunction formatBtcAmount(amount: number | string) {\n return new Big(amount).div(10 ** 8).toFixed();\n}\n\nasync function getBtcRpcUrl() {\n const network = await getNetwork();\n return btcRpcUrls[network as keyof typeof btcRpcUrls];\n}\n\nasync function nearCall<T>(contractId: string, methodName: string, args: any) {\n const network = await getNetwork();\n return nearCallFunction<T>(contractId, methodName, args, { network });\n}\n\ntype CheckGasTokenDebtReturnType<T extends boolean> = T extends true\n ? void\n : { receiver_id: string; amount: string; msg: string } | undefined;\n\nexport async function checkGasTokenDebt<T extends boolean>(\n csna: string,\n env: ENV,\n autoDeposit?: T,\n): Promise<CheckGasTokenDebtReturnType<T>> {\n const accountInfo = await getAccountInfo({ csna, env });\n const debtAmount = new Big(accountInfo?.debt_info?.near_gas_debt_amount || 0)\n .plus(accountInfo?.debt_info?.protocol_fee_debt_amount || 0)\n .toString();\n const relayerFeeAmount = !accountInfo?.nonce\n ? NBTC_STORAGE_DEPOSIT_AMOUNT\n : accountInfo?.relayer_fee?.amount || 0;\n const hasDebtArrears = new Big(debtAmount).gt(0);\n const hasRelayerFeeArrears = new Big(relayerFeeAmount).gt(0);\n if (!hasDebtArrears && !hasRelayerFeeArrears) return;\n const config = getWalletConfig(env);\n const transferAmount = hasDebtArrears ? debtAmount : relayerFeeAmount;\n\n const action = {\n receiver_id: config.accountContractId,\n amount: transferAmount.toString(),\n msg: JSON.stringify(hasDebtArrears ? 'Repay' : 'RelayerFee'),\n };\n\n if (!autoDeposit) return action as CheckGasTokenDebtReturnType<T>;\n\n console.log('checkGasTokenDebt action:', action);\n\n const { minDepositAmount } = await getDepositAmount(action.amount, {\n env,\n });\n\n const remainingAmount = new Big(minDepositAmount).minus(transferAmount).toNumber();\n\n const confirmed = await Dialog.confirm({\n title: hasDebtArrears ? 'Gas Token Arrears' : 'Relayer Fee Arrears',\n message: hasDebtArrears\n ? `You have gas token arrears. Minimum deposit amount is ${formatBtcAmount(minDepositAmount)} BTC, of which ${formatBtcAmount(transferAmount)} BTC will be used to repay the debt, and the remaining ${formatBtcAmount(remainingAmount)} BTC will be credited to your account.`\n : `You have relayer fee arrears. Minimum deposit amount is ${formatBtcAmount(minDepositAmount)} BTC, of which ${formatBtcAmount(transferAmount)} BTC will be used for relayer fee, and the remaining ${formatBtcAmount(remainingAmount)} BTC will be credited to your account.`,\n });\n\n if (confirmed) {\n await executeBTCDepositAndAction({ amount: minDepositAmount.toString(), action, env });\n\n await Dialog.alert({\n title: 'Deposit Success',\n message: `Deposit successful. ${formatBtcAmount(transferAmount)} BTC has been paid for ${hasDebtArrears ? 'debt' : 'relayer fee'}, and the remaining ${formatBtcAmount(remainingAmount)} BTC has been credited to your account. Transaction will continue.`,\n });\n } else {\n throw new Error('Deposit failed, please deposit gas token first.');\n }\n}\n\ninterface DepositMsg {\n recipient_id: string;\n post_actions?: Array<{\n receiver_id: string;\n amount: string;\n memo?: string;\n msg: string;\n gas?: string;\n }>;\n extra_msg?: string;\n}\n\nexport async function getBtcGasPrice(): Promise<number> {\n const network = await getNetwork();\n const defaultFeeRate = network === 'mainnet' ? 5 : 2500;\n try {\n const btcRpcUrl = await getBtcRpcUrl();\n const res = await fetch(`${btcRpcUrl}/v1/fees/recommended`).then((res) => res.json());\n const feeRate = res.fastestFee;\n return feeRate || defaultFeeRate;\n } catch (error) {\n return defaultFeeRate;\n }\n}\n\nexport async function getBtcUtxos(account: string) {\n const btcRpcUrl = await getBtcRpcUrl();\n const utxos: { value: number; status: { confirmed: boolean } }[] = await fetch(\n `${btcRpcUrl}/address/${account}/utxo`,\n ).then((res) => res.json());\n return utxos.filter((item) => item.status.confirmed);\n}\n\nexport async function calculateGasFee(account: string, amount: number, feeRate?: number) {\n const _feeRate = feeRate || (await getBtcGasPrice());\n const utxos = await getBtcUtxos(account);\n const { fee } = coinselect(utxos, [{ address: account, value: amount }], Math.ceil(_feeRate));\n console.log('calculateGasFee fee:', fee);\n return fee;\n}\n\nexport async function getBtcBalance(account?: string) {\n if (!account) {\n const res = await retryOperation(getBtcProvider, (res) => !!res.account);\n\n if (!res.account) {\n console.error('BTC Account is not available.');\n return { rawBalance: 0, balance: 0, availableBalance: 0 };\n }\n account = res.account;\n }\n\n const utxos = await getBtcUtxos(account);\n\n const btcDecimals = 8;\n\n const rawBalance = utxos?.reduce((acc, cur) => acc + cur.value, 0) || 0;\n const balance = rawBalance / 10 ** btcDecimals;\n\n const estimatedFee = await calculateGasFee(account, rawBalance);\n\n const availableRawBalance = (rawBalance - estimatedFee).toFixed(0);\n\n const availableBalance = new Big(availableRawBalance)\n .div(10 ** btcDecimals)\n .round(btcDecimals, Big.roundDown)\n .toNumber();\n\n return {\n rawBalance,\n balance,\n availableBalance: Math.max(availableBalance, 0),\n };\n}\n\nexport async function sendBitcoin(address: string, amount: number, feeRate: number) {\n const { sendBitcoin } = getBtcProvider();\n const txHash = await sendBitcoin(address, amount, { feeRate });\n return txHash;\n}\n\nexport async function signMessage(message: string) {\n const { signMessage, getPublicKey } = getBtcProvider();\n const publicKey = await getPublicKey();\n const signature = await signMessage(message);\n return { signature, publicKey };\n}\n\n/** estimate deposit receive amount, deduct protocol fee and repay amount */\nexport async function estimateDepositAmount(\n amount: string,\n option?: {\n env?: ENV;\n },\n) {\n return amount;\n}\n\nexport async function getDepositAmount(\n amount: string,\n option?: {\n csna?: string;\n env?: ENV;\n /** default is true, if true, new account minimum deposit amount 1000sat, otherwise 0 */\n newAccountMinDepositAmount?: boolean;\n },\n) {\n const env = option?.env || 'mainnet';\n const _newAccountMinDepositAmount = option?.newAccountMinDepositAmount ?? true;\n const csna = option?.csna || (await getCsnaAccountId(env));\n const accountInfo = await getAccountInfo({ csna, env });\n const debtAction = await checkGasTokenDebt(csna, env, false);\n const repayAmount = debtAction?.amount || 0;\n const depositAmount = Number(amount);\n const {\n deposit_bridge_fee: { fee_min, fee_rate },\n min_deposit_amount,\n } = await getBridgeConfig({ env });\n\n const protocolFee = Math.max(Number(fee_min), depositAmount * fee_rate);\n const newAccountMinDepositAmount =\n !accountInfo?.nonce && _newAccountMinDepositAmount ? NEW_ACCOUNT_MIN_DEPOSIT_AMOUNT : 0;\n let receiveAmount = new Big(depositAmount)\n .minus(protocolFee)\n .minus(repayAmount)\n .round(0, Big.roundDown)\n .toNumber();\n receiveAmount = Math.max(receiveAmount, 0);\n\n const minDepositAmount = new Big(min_deposit_amount || 0)\n .plus(newAccountMinDepositAmount)\n .plus(protocolFee)\n .plus(repayAmount)\n .round(0, Big.roundUp)\n .toNumber();\n\n console.log(\n `minDepositAmount: ${minDepositAmount} = ${min_deposit_amount} + ${newAccountMinDepositAmount} + ${protocolFee} + ${repayAmount}`,\n );\n\n return {\n depositAmount,\n receiveAmount,\n protocolFee,\n repayAmount,\n newAccountMinDepositAmount,\n minDepositAmount,\n };\n}\n\nexport async function getCsnaAccountId(env: ENV) {\n const config = getWalletConfig(env);\n const { getPublicKey } = getBtcProvider();\n const btcPublicKey = await getPublicKey();\n if (!btcPublicKey) {\n throw new Error('BTC Public Key is not available.');\n }\n const csna = await nearCall<string>(\n config.accountContractId,\n 'get_chain_signature_near_account_id',\n {\n btc_public_key: btcPublicKey,\n },\n );\n return csna;\n}\n\nfunction checkDepositDisabledAddress() {\n const data =\n storageStore('SATOSHI_WALLET_XVERSE')?.get<{ walletType: string; addressType: string }[]>(\n `Mainnet:addresses`,\n );\n if (!data) return;\n const address = data?.[0];\n if (address.walletType === 'ledger' && !['p2wpkh', 'p2sh'].includes(address.addressType)) {\n throw new Error('Ledger is only supported for p2wpkh and p2sh address');\n }\n}\n\ninterface ExecuteBTCDepositAndActionParams<T extends boolean = true> {\n action?: {\n receiver_id: string;\n amount: string;\n msg: string;\n };\n amount?: string;\n /** if registerDeposit is true, It will consume the deposit, otherwise it will be 0.000125 NEAR */\n registerDeposit?: string;\n feeRate?: number;\n env?: ENV;\n pollResult?: T;\n newAccountMinDepositAmount?: boolean;\n /** if registerContractId is provided, it will be used to register the contract, otherwise it will be the default contract id */\n registerContractId?: string;\n}\n\n/**\n * @param T - if true, return the poll result, otherwise return the btcTxHash\n */\ntype ExecuteBTCDepositAndActionReturn<T extends boolean> = T extends true\n ? FinalExecutionOutcome[]\n : string;\n\nexport async function executeBTCDepositAndAction<T extends boolean = true>({\n action,\n amount,\n feeRate,\n pollResult = true as T,\n registerDeposit,\n env = 'mainnet',\n newAccountMinDepositAmount,\n registerContractId,\n}: ExecuteBTCDepositAndActionParams<T>): Promise<ExecuteBTCDepositAndActionReturn<T>> {\n try {\n console.log('executeBTCDepositAndAction start', {\n action,\n amount,\n feeRate,\n pollResult,\n registerDeposit,\n newAccountMinDepositAmount,\n registerContractId,\n });\n checkDepositDisabledAddress();\n const { getPublicKey } = getBtcProvider();\n\n const config = getWalletConfig(env);\n\n const btcPublicKey = await getPublicKey();\n\n if (!btcPublicKey) {\n throw new Error('BTC Public Key is not available.');\n }\n if (!amount && !action) {\n throw new Error('Deposit amount or action is required');\n }\n\n const csna = await getCsnaAccountId(env);\n\n const depositAmount = new Big(amount || action?.amount || 0).round(0, Big.roundDown).toNumber();\n\n console.log('depositAmount', depositAmount);\n\n if (depositAmount <= 0) {\n throw new Error('Invalid deposit amount');\n }\n\n const { receiveAmount, protocolFee, repayAmount, minDepositAmount } = await getDepositAmount(\n depositAmount.toString(),\n {\n env,\n newAccountMinDepositAmount,\n },\n );\n\n if (depositAmount < minDepositAmount) {\n throw new Error(\n `Invalid deposit amount, must be greater than ${formatBtcAmount(minDepositAmount)} BTC`,\n );\n }\n\n const accountInfo = await getAccountInfo({ csna, env });\n\n const newActions = [];\n\n const debtAction = await checkGasTokenDebt(csna, env, false);\n\n if (debtAction) {\n newActions.push({\n ...debtAction,\n gas: '30000000000000', // 30 TGas\n });\n }\n\n // if action is not provided, and the gas token balance is less than the minimum deposit amount, then add the deposit action\n if (action) {\n newActions.push({\n ...action,\n gas: '100000000000000', // 100 TGas\n });\n }\n\n const storageDepositMsg: {\n storage_deposit_msg?: {\n contract_id: string;\n deposit: string;\n registration_only: boolean;\n };\n btc_public_key?: string;\n } = {};\n\n const _registerContractId =\n registerContractId ||\n (action?.receiver_id || config.btcToken).replace(config.accountContractId, config.btcToken);\n console.log('executeBTCDepositAndAction registerContractId', _registerContractId);\n // check receiver_id is registered\n const registerRes = await nearCall<{\n available: string;\n total: string;\n }>(_registerContractId, 'storage_balance_of', {\n account_id: csna,\n });\n\n if (!registerRes?.available) {\n storageDepositMsg.storage_deposit_msg = {\n contract_id: _registerContractId,\n deposit: registerDeposit || NEAR_STORAGE_DEPOSIT_AMOUNT,\n registration_only: true,\n };\n }\n // check account is registerer\n if (!accountInfo?.nonce) {\n storageDepositMsg.btc_public_key = btcPublicKey;\n }\n\n const depositMsg: DepositMsg = {\n recipient_id: csna,\n post_actions: newActions.length > 0 ? newActions : undefined,\n extra_msg:\n Object.keys(storageDepositMsg).length > 0 ? JSON.stringify(storageDepositMsg) : undefined,\n };\n\n console.log('get_user_deposit_address params:', { deposit_msg: depositMsg });\n const userDepositAddress = await nearCall<string>(\n config.bridgeContractId,\n 'get_user_deposit_address',\n { deposit_msg: depositMsg },\n );\n const _feeRate = feeRate || (await getBtcGasPrice());\n\n // deposit amount detail\n console.table({\n 'User Deposit Address': userDepositAddress,\n 'Deposit Amount': depositAmount,\n 'Protocol Fee': protocolFee,\n 'Repay Amount': repayAmount,\n 'Receive Amount': receiveAmount,\n 'Fee Rate': _feeRate,\n });\n\n const postActionsStr = newActions.length > 0 ? JSON.stringify(newActions) : undefined;\n\n await preReceiveDepositMsg({\n env,\n btcPublicKey,\n depositType: postActionsStr || depositMsg.extra_msg ? 1 : 0,\n postActions: postActionsStr,\n extraMsg: depositMsg.extra_msg,\n });\n\n const txHash = await sendBitcoin(userDepositAddress, depositAmount, _feeRate);\n\n await receiveDepositMsg({\n env,\n btcPublicKey,\n txHash,\n depositType: postActionsStr || depositMsg.extra_msg ? 1 : 0,\n postActions: postActionsStr,\n extraMsg: depositMsg.extra_msg,\n });\n\n if (!pollResult) {\n return txHash as ExecuteBTCDepositAndActionReturn<T>;\n }\n\n const checkTransactionStatusRes = await checkBridgeTransactionStatus({\n txHash,\n fromChain: 'BTC',\n env,\n });\n const network = await getNetwork();\n const result = await pollTransactionStatuses(network, [checkTransactionStatusRes.ToTxHash]);\n return result as ExecuteBTCDepositAndActionReturn<T>;\n } catch (error: any) {\n console.error('executeBTCDepositAndAction error:', error);\n throw error;\n }\n}\n\nexport async function checkSatoshiWhitelist(btcAccountId: string, env: ENV = 'mainnet') {\n if (env !== 'mainnet') return;\n const storage = storageStore();\n const hasShownNotice = storage?.get<string>('private-mainnet-notice');\n if (!hasShownNotice) {\n Dialog.alert({\n title: 'Notice',\n message:\n 'You are currently using Satoshi Private Mainnet. This is a private version for testing. Please try a small amount of assets in Ramp',\n });\n storage?.set('private-mainnet-notice', 'true');\n }\n if (!btcAccountId) return;\n const whitelist = await getWhitelist({ env });\n if (!whitelist?.length) return;\n const isWhitelisted = whitelist.includes(btcAccountId);\n if (!isWhitelisted) {\n Dialog.alert({\n title: 'Account is not whitelisted',\n message: `We're live on beta mainnet! Join the whitelist to on-ramp your BTC in just 24 hours.\nSign up now: <a style=\"color: #ff7a00; text-decoration: underline;\" href=\"https://forms.gle/rrTP1ZbGU5mRZpHdA\" target=\"_blank\">https://forms.gle/rrTP1ZbGU5mRZpHdA</a>`,\n dangerouslyUseHTML: true,\n closable: false,\n });\n throw new Error('Account is not whitelisted');\n }\n}\n\ninterface WithdrawParams {\n amount: string | number;\n feeRate?: number;\n csna?: string;\n btcAddress?: string;\n env?: ENV;\n}\n\nexport async function getWithdrawTransaction({\n amount,\n feeRate,\n csna,\n btcAddress,\n env = 'mainnet',\n}: WithdrawParams): Promise<Transaction> {\n const config = getWalletConfig(env);\n let _btcAddress = btcAddress || getBtcProvider().account;\n if (!_btcAddress) {\n await getBtcProvider().autoConnect();\n _btcAddress = getBtcProvider().account;\n if (!_btcAddress) {\n throw new Error('BTC Account is not available.');\n }\n }\n const _csna = csna || (await getCsnaAccountId(env));\n\n // calculate gas and get transaction details\n const { inputs, outputs, isError, errorMsg, fromAmount, gasFee } = await calculateWithdraw({\n amount,\n feeRate,\n csna: _csna,\n btcAddress: _btcAddress,\n env,\n });\n\n if (isError || !inputs || !outputs) {\n throw new Error(errorMsg);\n }\n console.log('inputs:', JSON.stringify(inputs));\n console.log('outputs:', JSON.stringify(outputs));\n\n console.log('inputs - outputs = gas');\n console.log(\n `(${inputs.map((item) => item.value).join(' + ')}) - (${outputs.map((item) => item.value).join(' + ')}) = ${gasFee}`,\n );\n\n const network = await getNetwork();\n const btcNetwork = network === 'mainnet' ? bitcoin.networks.bitcoin : bitcoin.networks.testnet;\n const psbt = new bitcoin.Psbt({ network: btcNetwork });\n\n // Add inputs\n const btcRpcUrl = await getBtcRpcUrl();\n await Promise.all(\n inputs.map(async (input) => {\n const txData = await fetch(`${btcRpcUrl}/tx/${input.txid}`).then((res) => res.json());\n\n const inputOptions = {\n hash: input.txid,\n index: input.vout,\n sequence: 0xfffffffd,\n witnessUtxo: {\n script: Buffer.from(txData.vout[input.vout].scriptpubkey, 'hex'),\n value: input.value,\n },\n };\n\n psbt.addInput(inputOptions);\n }),\n );\n\n // Add outputs\n outputs.forEach((output: { address: string; value: number }) => {\n psbt.addOutput({\n address: output.address,\n value: output.value,\n });\n });\n\n // Build contract call message\n const _inputs = inputs.map((item: { txid: string; vout: number; value: number }) => {\n return `${item.txid}:${item.vout}`;\n });\n\n const txOutputs = psbt.txOutputs.map((item: { script: Uint8Array; value: number }) => {\n return {\n script_pubkey: uint8ArrayToHex(item.script),\n value: item.value,\n };\n });\n\n const msg = {\n Withdraw: {\n target_btc_address: _btcAddress,\n input: _inputs,\n output: txOutputs,\n },\n };\n\n // Finally return the transaction object\n const transaction: Transaction = {\n receiverId: config.btcToken,\n signerId: _csna,\n actions: [\n {\n type: 'FunctionCall',\n params: {\n methodName: 'ft_transfer_call',\n args: {\n receiver_id: config.bridgeContractId,\n amount: fromAmount?.toString(),\n msg: JSON.stringify(msg),\n },\n gas: '300000000000000', // 300 TGas\n deposit: '1', // 1 yoctoNEAR\n },\n },\n ],\n };\n\n console.log('=== End getWithdrawTransaction ===');\n return transaction;\n}\n\ninterface CalculateWithdrawParams {\n amount: string | number;\n feeRate?: number;\n csna?: string;\n btcAddress?: string;\n env: ENV;\n}\ninterface CalculateWithdrawResult {\n withdrawFee: number;\n gasFee?: number;\n inputs?: any[];\n outputs?: any[];\n fromAmount?: number;\n receiveAmount?: string;\n isError: boolean;\n errorMsg?: string;\n}\n\nexport async function calculateWithdraw({\n amount,\n feeRate: _feeRate,\n csna: _csna,\n btcAddress: _btcAddress,\n env,\n}: CalculateWithdrawParams): Promise<CalculateWithdrawResult> {\n try {\n const config = getWalletConfig(env);\n\n let btcAddress = _btcAddress || getBtcProvider().account;\n if (!btcAddress) {\n await getBtcProvider().autoConnect();\n btcAddress = getBtcProvider().account;\n if (!btcAddress) {\n throw new Error('BTC Account is not available.');\n }\n }\n const csna = _csna || (await getCsnaAccountId(env));\n\n const feeRate = _feeRate || (await getBtcGasPrice());\n // mock the gas limit\n const gasLimit = await calculateGasLimit({\n csna,\n transactions: [\n {\n signerId: '',\n receiverId: config.btcToken,\n actions: [\n {\n type: 'FunctionCall',\n params: {\n methodName: 'ft_transfer_call',\n args: {\n receiver_id: config.btcToken,\n amount: '100',\n msg: '',\n },\n gas: '300000000000000',\n deposit: '1',\n },\n },\n ],\n },\n ],\n env,\n });\n\n let satoshis = Number(amount);\n if (Number(gasLimit) > 0) {\n satoshis = new Big(amount).minus(gasLimit).toNumber();\n }\n\n const brgConfig = await getBridgeConfig({ env });\n\n const allUTXO = await nearCallFunction<\n Record<\n string,\n {\n vout: number;\n balance: string;\n script: string;\n }\n >\n >(config.bridgeContractId, 'get_utxos_paged', {}, { network: config.network });\n\n if (brgConfig.min_withdraw_amount) {\n if (Number(satoshis) < Number(brgConfig.min_withdraw_amount)) {\n return {\n withdrawFee: 0,\n isError: true,\n errorMsg: `Minimum withdraw amount is ${formatBtcAmount(Number(brgConfig.min_withdraw_amount) + Number(gasLimit))} BTC`,\n };\n }\n }\n\n const feePercent = Number(brgConfig.withdraw_bridge_fee.fee_rate) * Number(satoshis);\n const withdrawFee =\n feePercent > Number(brgConfig.withdraw_bridge_fee.fee_min)\n ? feePercent\n : Number(brgConfig.withdraw_bridge_fee.fee_min);\n\n const withdrawChangeAddress = brgConfig.change_address;\n\n const utxos = Object.keys(allUTXO)\n .map((key) => {\n const txid = key.split('@');\n return {\n txid: txid[0],\n vout: allUTXO[key].vout,\n value: Number(allUTXO[key].balance),\n script: allUTXO[key].script,\n };\n })\n .filter((utxo) => utxo.value > Number(brgConfig.min_change_amount));\n\n if (!utxos || utxos.length === 0) {\n return {\n withdrawFee,\n isError: true,\n errorMsg: 'The network is busy, please try again later.',\n };\n }\n\n const userSatoshis = Number(satoshis);\n const maxBtcFee = Number(brgConfig.max_btc_gas_fee);\n\n const { inputs, outputs, fee } = coinselect(\n utxos,\n [{ address: btcAddress, value: userSatoshis }],\n Math.ceil(feeRate),\n );\n\n const newInputs = inputs;\n let newOutputs = outputs;\n let newFee = fee;\n\n if (!newOutputs || newOutputs.length === 0) {\n return {\n withdrawFee,\n isError: true,\n errorMsg: 'The network is busy, please try again later.',\n };\n }\n\n let userOutput, noUserOutput;\n for (let i = 0; i < newOutputs.length; i++) {\n const output = newOutputs[i];\n if (output.value.toString() === userSatoshis.toString()) {\n userOutput = output;\n } else {\n noUserOutput = output;\n }\n if (!output.address) {\n output.address = withdrawChangeAddress;\n }\n }\n\n let dis = 0;\n if (newFee > maxBtcFee) {\n dis = newFee - maxBtcFee;\n newFee = maxBtcFee;\n\n return {\n gasFee: newFee,\n withdrawFee,\n isError: true,\n errorMsg: 'Gas exceeds maximum value',\n };\n }\n\n userOutput.value = new Big(userOutput.value).minus(newFee).minus(withdrawFee).toNumber();\n\n if (userOutput.value < 0) {\n return {\n gasFee: newFee,\n withdrawFee,\n isError: true,\n errorMsg: 'Not enough gas',\n };\n }\n\n if (noUserOutput) {\n if (!noUserOutput.address) {\n noUserOutput.address = withdrawChangeAddress;\n }\n noUserOutput.value = new Big(noUserOutput.value)\n .plus(newFee)\n .plus(withdrawFee)\n .plus(dis)\n .toNumber();\n } else {\n noUserOutput = {\n address: withdrawChangeAddress,\n value: new Big(newFee).plus(withdrawFee).plus(dis).toNumber(),\n };\n newOutputs.push(noUserOutput);\n }\n\n let minValue = Math.min(...newInputs.map((input: any) => input.value));\n let totalNoUserOutputValue = noUserOutput.value;\n\n while (totalNoUserOutputValue >= minValue && minValue > 0 && newInputs.length > 0) {\n totalNoUserOutputValue -= minValue;\n noUserOutput.value = totalNoUserOutputValue;\n const minValueIndex = newInputs.findIndex((input: any) => input.value === minValue);\n if (minValueIndex > -1) {\n newInputs.splice(minValueIndex, 1);\n }\n minValue = Math.min(...newInputs.map((input: any) => input.value));\n }\n\n let gasMore = 0;\n if (noUserOutput.value === 0) {\n newOutputs = newOutputs.filter((item: any) => item.value !== 0);\n } else if (noUserOutput.value < Number(brgConfig.min_change_amount)) {\n gasMore = Number(brgConfig.min_change_amount) - noUserOutput.value;\n userOutput.value -= gasMore;\n noUserOutput.value = Number(brgConfig.min_change_amount);\n }\n\n const insufficientOutput = newOutputs.some((item: any) => item.value < 0);\n if (insufficientOutput) {\n return {\n gasFee: newFee,\n withdrawFee,\n isError: true,\n errorMsg: 'Not enough gas',\n };\n }\n\n // check if the output amount is below minimum change amount\n const belowMinChangeAmount = newOutputs.some(\n (item: any) => item.value > 0 && item.value < Number(brgConfig.min_change_amount),\n );\n if (belowMinChangeAmount) {\n // Calculate minimum withdraw amount: min_change_amount + gas + fee\n const minWithdrawAmount = new Big(brgConfig.min_withdraw_amount)\n .plus(brgConfig.min_change_amount)\n .plus(gasLimit)\n .plus(withdrawFee)\n .toNumber();\n\n return {\n gasFee: newFee,\n withdrawFee,\n isError: true,\n errorMsg: `Transaction amount too small. Minimum required: ${formatBtcAmount(minWithdrawAmount)} BTC`,\n };\n }\n\n const inputSum = newInputs.reduce((sum: number, cur: any) => sum + Number(cur.value), 0);\n const outputSum = newOutputs.reduce((sum: number, cur: any) => sum + Number(cur.value), 0);\n\n if (newFee + outputSum !== inputSum) {\n return {\n withdrawFee,\n isError: true,\n errorMsg: 'Service busy, please try again later',\n };\n }\n return {\n withdrawFee: new Big(withdrawFee).plus(gasLimit).plus(gasMore).toNumber(),\n gasFee: new Big(newFee).toNumber(),\n inputs: newInputs,\n outputs: newOutputs,\n fromAmount: satoshis,\n receiveAmount: userOutput.value,\n isError: false,\n };\n } catch (error: any) {\n return {\n withdrawFee: 0,\n isError: true,\n errorMsg: error.message,\n };\n }\n}\n\n// Helper function\nfunction uint8ArrayToHex(uint8Array: Uint8Array): string {\n return Array.from(uint8Array)\n .map((byte) => byte.toString(16).padStart(2, '0'))\n .join('');\n}\n", "import type { ProviderService } from '@near-wallet-selector/core/src/lib/services';\nimport { providers } from 'near-api-js';\nimport { nearRpcUrls } from '../config';\nimport { delay } from '.';\nimport type { FinalExecutionOutcome } from '@near-wallet-selector/core';\nimport { withCache } from './request';\n\nexport function getNearProvider(option: { network?: string; provider?: ProviderService }) {\n return (\n option.provider ||\n new providers.FailoverRpcProvider(\n nearRpcUrls[option?.network as keyof typeof nearRpcUrls].map(\n (url) => new providers.JsonRpcProvider({ url }),\n ),\n )\n );\n}\n\nexport async function nearCallFunction<T>(\n contractId: string,\n methodName: string,\n args: any,\n options: {\n network?: string;\n provider?: ProviderService;\n cacheTimeout?: number;\n skipCache?: boolean;\n } = {},\n): Promise<T> {\n if (!options.skipCache) {\n const cacheKey = `near:${contractId}:${methodName}:${args ? JSON.stringify(args) : ''}`;\n return withCache(\n cacheKey,\n () => executeNearCall<T>(contractId, methodName, args, options),\n options.cacheTimeout || 5000,\n );\n }\n\n return executeNearCall<T>(contractId, methodName, args, options);\n}\n\nasync function executeNearCall<T>(\n contractId: string,\n methodName: string,\n args: any,\n options: {\n network?: string;\n provider?: ProviderService;\n },\n): Promise<T> {\n const nearProvider = getNearProvider(options);\n const res: any = await nearProvider.query({\n request_type: 'call_function',\n account_id: contractId,\n method_name: methodName,\n args_base64: Buffer.from(JSON.stringify(args)).toString('base64'),\n finality: 'final',\n });\n return JSON.parse(Buffer.from(res.result).toString()) as T;\n}\n\nexport async function pollTransactionStatuses(network: string, hashes: string[]) {\n const provider = new providers.FailoverRpcProvider(\n Object.values(nearRpcUrls[network as keyof typeof nearRpcUrls]).map(\n (url) => new providers.JsonRpcProvider({ url }),\n ),\n );\n\n const maxAttempts = 30;\n let currentAttempt = 0;\n const pendingHashes = new Set(hashes);\n const results = new Map<string, FinalExecutionOutcome>();\n\n while (pendingHashes.size > 0 && currentAttempt < maxAttempts) {\n currentAttempt++;\n\n const promises = Array.from(pendingHashes).map(async (hash) => {\n try {\n const result = await provider.txStatus(hash, 'unused', 'FINAL');\n if (result && result.status) {\n console.log(`Transaction ${hash} result:`, result);\n results.set(hash, result);\n pendingHashes.delete(hash);\n }\n } catch (error: any) {\n console.error(`Failed to fetch transaction status for ${hash}: ${error.message}`);\n }\n });\n\n await Promise.all(promises);\n\n if (pendingHashes.size > 0) {\n if (currentAttempt === maxAttempts) {\n throw new Error(\n `Transactions not found after max attempts: ${Array.from(pendingHashes).join(', ')}`,\n );\n }\n console.log(\n `Waiting for ${pendingHashes.size} transactions, retrying ${maxAttempts - currentAttempt} more times`,\n );\n await delay(10000);\n }\n }\n\n const result = hashes.map((hash) => results.get(hash)).filter(Boolean) as FinalExecutionOutcome[];\n return result;\n}\n", "interface RequestOptions<T> extends RequestInit {\n body?: RequestInit['body'] | any;\n retryCount?: number;\n timeout?: number;\n cacheTimeout?: number;\n pollingInterval?: number;\n maxPollingAttempts?: number;\n shouldStopPolling?: (response: T) => boolean;\n}\n\nconst cache = new Map<string, { timestamp: number; data: any }>();\n\nconst defaultCacheTimeout = 3000;\n\nexport function withCache<T>(\n key: string,\n fetcher: () => Promise<T>,\n timeout: number = defaultCacheTimeout,\n): Promise<T> {\n const cached = cache.get(key);\n const isCacheValid = cached && Date.now() - cached.timestamp < timeout;\n\n if (isCacheValid) {\n return Promise.resolve(cached.data as T);\n }\n\n return fetcher().then((data) => {\n cache.set(key, { timestamp: Date.now(), data });\n setTimeout(() => {\n cache.delete(key);\n }, timeout);\n return data;\n });\n}\n\nexport default async function request<T>(url: string, options?: RequestOptions<T>): Promise<T> {\n const defaultHeaders = {\n 'Content-Type': 'application/json',\n };\n\n const cacheTimeout = options?.cacheTimeout || defaultCacheTimeout;\n\n const headers = {\n ...defaultHeaders,\n ...options?.headers,\n };\n\n let body = options?.body;\n if (headers['Content-Type'] === 'application/json' && body && typeof body !== 'string') {\n body = JSON.stringify(body);\n }\n\n const method = options?.method || 'GET';\n const cacheKey = method.toUpperCase() === 'GET' ? url : null;\n\n if (cacheKey) {\n const cached = cache.get(cacheKey);\n const isCacheValid = cached && Date.now() - cached.timestamp < cacheTimeout;\n if (isCacheValid) {\n return Promise.resolve(cached.data as T);\n }\n }\n\n const newOptions: RequestInit = {\n ...options,\n headers,\n body,\n method,\n };\n\n const retryCount = options?.retryCount ?? 1;\n\n const controller = new AbortController();\n const timeout = options?.timeout || 20000;\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n try {\n const res = await fetch(url, { ...newOptions, signal: controller.signal }).finally(() =>\n clearTimeout(timeoutId),\n );\n\n if (!res.ok) throw new Error(res.statusText);\n const data = await res.json();\n\n if (options?.shouldStopPolling) {\n if (options.shouldStopPolling(data)) {\n return data as T;\n }\n throw new Error('Polling should continue');\n }\n\n if (cacheKey) {\n cache.set(cacheKey, { timestamp: Date.now(), data });\n setTimeout(() => {\n cache.delete(cacheKey);\n }, cacheTimeout);\n }\n\n return data as T;\n } catch (err) {\n if (retryCount > 0) {\n console.log(`Retrying... attempts left: ${retryCount}`);\n return request(url, { ...options, retryCount: retryCount - 1 });\n } else if (options?.pollingInterval && options?.maxPollingAttempts) {\n if (options.maxPollingAttempts > 0) {\n console.log(`Polling... attempts left: ${options.maxPollingAttempts}`);\n await new Promise((resolve) => setTimeout(resolve, options.pollingInterval));\n return request(url, {\n ...options,\n maxPollingAttempts: options.maxPollingAttempts - 1,\n retryCount: retryCount,\n });\n }\n }\n console.error(err);\n return Promise.reject(err);\n }\n}\n", "import { toHex } from '.';\nimport request from './request';\nimport type { AccessKeyViewRaw } from 'near-api-js/lib/providers/provider';\nimport { actionCreators } from '@near-js/transactions';\nimport { PublicKey } from 'near-api-js/lib/utils/key_pair';\nimport { encodeTransaction } from 'near-api-js/lib/transaction';\nimport { baseDecode } from '@near-js/utils';\nimport bs58 from 'bs58';\n// @ts-ignore\nimport { sha256 } from 'js-sha256';\nimport type { Transaction } from '@near-wallet-selector/core';\nimport { getNearProvider, nearCallFunction } from './nearUtils';\nimport { getWalletConfig, type ENV } from '../config';\nimport { transactions } from 'near-api-js';\nimport Big from 'big.js';\nimport { Dialog } from './Dialog';\nimport state from '../core/setupBTCWallet/state';\n\ninterface RequestResult<T> {\n result_code: number;\n result_message: string;\n result_data: T;\n}\n\nexport async function getNonce({ env, accountId }: { env: ENV; accountId: string }) {\n const config = getWalletConfig(env);\n const { result_code, result_message, result_data } = await request<RequestResult<string>>(\n `${config.base_url}/v1/nonce?csna=${accountId}`,\n );\n if (result_code !== 0) {\n throw new Error(result_message);\n }\n return result_data;\n}\n\nexport async function getNearNonce({ env, accountId }: { env: ENV; accountId: string }) {\n const config = getWalletConfig(env);\n const { result_code, result_message, result_data } = await request<RequestResult<string>>(\n `${config.base_url}/v1/nonceNear?csna=${accountId}`,\n );\n if (result_code !== 0) {\n throw new Error(result_message);\n }\n return result_data;\n}\n\nexport async function receiveTransaction({ env, ...data }: { env: ENV } & any) {\n const config = getWalletConfig(env);\n const { result_code, result_message, result_data } = await request<RequestResult<any>>(\n `${config.base_url}/v1/receiveTransaction`,\n {\n method: 'POST',\n body: data,\n },\n );\n if (result_code !== 0) {\n throw new Error(result_message);\n }\n return result_data;\n}\n\ninterface ReceiveDepositMsgParams {\n env: ENV;\n btcPublicKey: string;\n txHash: string;\n depositType?: number;\n postActions?: string;\n extraMsg?: string;\n}\n\nexport async function preReceiveDepositMsg({\n env,\n btcPublicKey,\n depositType = 1,\n postActions,\n extraMsg,\n}: Omit<ReceiveDepositMsgParams, 'txHash'>) {\n const config = getWalletConfig(env);\n const { result_code, result_message, result_data } = await request<RequestResult<any>>(\n `${config.base_url}/v1/preReceiveDepositMsg`,\n {\n method: 'POST',\n body: { btcPublicKey, depositType, postActions, extraMsg },\n },\n );\n console.log('preReceiveDepositMsg resp:', { result_code, result_message, result_data });\n if (result_code !== 0) {\n throw new Error(result_message);\n }\n return result_data;\n}\n\nexport async function receiveDepositMsg({\n env,\n btcPublicKey,\n txHash,\n depositType = 1,\n postActions,\n extraMsg,\n}: ReceiveDepositMsgParams) {\n const config = getWalletConfig(env);\n const { result_code, result_message, result_data } = await request<RequestResult<any>>(\n `${config.base_url}/v1/receiveDepositMsg`,\n {\n method: 'POST',\n body: { btcPublicKey, txHash, depositType, postActions, extraMsg },\n },\n );\n console.log('receiveDepositMsg resp:', { result_code, result_message, result_data });\n if (result_code !== 0) {\n throw new Error(result_message);\n }\n return result_data;\n}\n\nexport async function checkBridgeTransactionStatus({\n txHash,\n fromChain,\n env,\n}: {\n txHash: string;\n fromChain?: 'BTC' | 'NEAR';\n env: ENV;\n}) {\n const config = getWalletConfig(env);\n const { result_code, result_message, result_data } = await request<\n RequestResult<{ Status: number; ToTxHash: string }>\n >(\n `${config.base_url}/v1/bridgeFromTx?fromTxHash=${txHash}&fromChainId=${fromChain === 'NEAR' ? 2 : 1}`,\n {\n timeout: 3 * 60 * 60 * 1000,\n pollingInterval: 5000,\n maxPollingAttempts: 3000,\n shouldStopPolling: (res) => {\n const status = res.result_data?.Status || 0;\n return res.result_code === 0 && (status === 4 || status >= 50);\n },\n },\n );\n console.log('checkTransactionStatus resp:', { result_code, result_message, result_data });\n if (result_data?.Status !== 4) {\n throw new Error(result_message || `Transaction failed, status: ${result_data?.Status}`);\n }\n console.log('checkBridgeTransactionStatus resp:', result_data);\n return result_data;\n}\n\nexport async function checkBtcTransactionStatus({\n signature,\n env,\n}: {\n signature: string;\n env: ENV;\n}) {\n const config = getWalletConfig(env);\n const { result_code, result_message, result_data } = await request<\n RequestResult<{ Status: number; NearHashList: string[] }>\n >(`${config.base_url}/v1/btcTx?sig=${toHex(signature)}`, {\n timeout: 300000,\n pollingInterval: 5000,\n maxPollingAttempts: 60,\n shouldStopPolling: (res) => {\n const status = res.result_data?.Status || 0;\n return res.result_code === 0 && (status === 3 || status >= 10);\n },\n });\n if (result_data?.Status !== 3) {\n throw new Error(result_message || `Transaction failed, status: ${result_data?.Status}`);\n }\n console.log('checkBtcTransactionStatus resp:', { result_code, result_message, result_data });\n return result_data;\n}\n\nexport async function getWhitelist({ env }: { env: ENV }) {\n const config = getWalletConfig(env);\n const data = await request<string[]>(`${config.base_url}/v1/whitelist/users`).catch((error) => {\n console.error('getWhitelist error:', error);\n return [] as string[];\n });\n return data;\n}\n\nexport async function receiveWithdrawMsg({ env, txHash }: { env: ENV; txHash: string }) {\n const config = getWalletConfig(env);\n const { result_code, result_message, result_data } = await request<RequestResult<any>>(\n `${config.base_url}/v1/receiveWithdrawMsg`,\n {\n method: 'POST',\n body: { txHash },\n },\n );\n console.log('receiveWithdrawMsg resp:', { result_code, result_message, result_data });\n if (result_code !== 0) {\n throw new Error(result_message);\n }\n return result_data;\n}\n\nexport interface AccountInfo {\n nonce: string;\n gas_token: Record<string, string>;\n debt_info?: {\n gas_token_id: string;\n near_gas_debt_amount: string;\n protocol_fee_debt_amount: string;\n };\n relayer_fee?: { amount?: string };\n}\n\nexport async function getAccountInfo({ csna, env }: { csna: string; env: ENV }) {\n const config = getWalletConfig(env);\n const accountInfo = await nearCallFunction<AccountInfo>(\n config.accountContractId,\n 'get_account',\n {\n account_id: csna,\n },\n { network: config.network },\n ).catch((error) => {\n console.log(`get_account error, please try again later`, error);\n throw error;\n });\n console.log('getAccountInfo resp:', accountInfo);\n return accountInfo;\n}\n\nexport async function getBridgeConfig({ env }: { env: ENV }) {\n const config = getWalletConfig(env);\n const bridgeConfig = await nearCallFunction<{\n min_withdraw_amount: string;\n withdraw_bridge_fee: { fee_rate: number; fee_min: string };\n max_btc_gas_fee: string;\n change_address: string;\n min_change_amount: string;\n deposit_bridge_fee: { fee_rate: number; fee_min: string };\n min_deposit_amount: string;\n }>(config.bridgeContractId, 'get_config', {}, { network: config.network });\n return bridgeConfig;\n}\n\nexport async function getTokenBalance({\n csna,\n tokenId,\n env,\n}: {\n csna: string;\n tokenId: string;\n env: ENV;\n}): Promise<{ balance: number; rawBalance: string }> {\n const config = getWalletConfig(env);\n const nearProvider = getNearProvider({ network: config.network });\n try {\n if (tokenId === config.nearToken) {\n const nearAccount = await nearProvider.query<any>({\n request_type: 'view_account',\n account_id: csna,\n finality: 'final',\n });\n const balance = parseFloat(nearAccount.amount) / 10 ** config.nearTokenDecimals;\n return { balance, rawBalance: nearAccount.amount };\n } else {\n const res = await nearCallFunction<string>(\n tokenId,\n 'ft_balance_of',\n { account_id: csna },\n { network: config.network },\n );\n const decimals =\n tokenId === config.btcToken\n ? config.btcTokenDecimals\n : (\n await nearCallFunction<{ decimals: number }>(\n tokenId,\n 'ft_metadata',\n {},\n { network: config.network },\n )\n ).decimals;\n const balance = parseFloat(res) / 10 ** decimals;\n return { balance, rawBalance: res };\n }\n } catch (error) {\n console.error('getTokenBalance error:', error);\n return { balance: 0, rawBalance: '0' };\n }\n}\n\nexport async function checkGasTokenBalance(csna: string, minAmount: string, env: ENV) {\n const config = getWalletConfig(env);\n const { rawBalance } = await getTokenBalance({ csna, tokenId: config.btcToken, env });\n console.log('gas token balance:', rawBalance);\n if (new Big(rawBalance).lt(minAmount)) {\n await Dialog.confirm({\n title: 'Gas token balance is insufficient',\n message: 'Please deposit gas token to continue, will open bridge website.',\n });\n window.open(config.bridgeUrl, '_blank');\n throw new Error('Gas token balance is insufficient');\n }\n}\n\nconst { functionCall, transfer } = actionCreators;\nexport async function convertTransactionToTxHex({\n transaction,\n accountId,\n publicKey,\n env,\n index = 0,\n}: {\n transaction: Transaction;\n accountId: string;\n publicKey: string;\n env: ENV;\n index?: number;\n}) {\n if (!publicKey) return { txHex: '', txBytes: new Uint8Array(), hash: '' };\n const publicKeyFormat = PublicKey.from(publicKey);\n const currentConfig = getWalletConfig(env);\n const provider = getNearProvider({ network: currentConfig.network });\n\n const { header } = await provider.block({\n finality: 'final',\n });\n\n const rawAccessKey = await provider\n .query<AccessKeyViewRaw>({\n request_type: 'view_access_key',\n account_id: accountId,\n public_key: publicKey,\n finality: 'final',\n })\n .catch((e: any) => {\n console.log('view_access_key error:', e);\n return undefined;\n });\n\n const accessKey = {\n ...rawAccessKey,\n nonce: BigInt(rawAccessKey?.nonce || 0),\n };\n\n const nearNonceFromApi = await getNearNonce({ env, accountId });\n\n let nearNonceNumber = accessKey.nonce + BigInt(1);\n if (nearNonceFromApi) {\n nearNonceNumber =\n BigInt(nearNonceFromApi) > nearNonceNumber ? BigInt(nearNonceFromApi) : nearNonceNumber;\n }\n\n const newActions = transaction.actions\n .map((action) => {\n switch (action.type) {\n case 'FunctionCall':\n return functionCall(\n action.params.methodName,\n action.params.args,\n BigInt(action.params.gas),\n BigInt(action.params.deposit),\n );\n case 'Transfer':\n return transfer(BigInt(action.params.deposit));\n }\n })\n .filter(Boolean) as transactions.Action[];\n\n const _transaction = transactions.createTransaction(\n accountId,\n publicKeyFormat,\n transaction.receiverId,\n BigInt(nearNonceNumber) + BigInt(index),\n newActions,\n baseDecode(header.hash),\n );\n\n const txBytes = encodeTransaction(_transaction);\n const txHex = Array.from(txBytes, (byte) => ('0' + (byte & 0xff).toString(16)).slice(-2)).join(\n '',\n );\n const hash = bs58.encode(new Uint8Array(sha256.array(txBytes)));\n\n return { txBytes, txHex, hash };\n}\n\ninterface CalculateGasLimitParams {\n transactions: Transaction[];\n csna: string;\n env: ENV;\n gasStrategy?: 'auto' | 'near' | 'btc';\n}\n\nexport async function calculateGasLimit(params: CalculateGasLimitParams) {\n const trans = [...params.transactions];\n console.log('calculateGasLimit raw trans:', trans);\n\n const { gasLimit } = await calculateGasStrategy(params);\n\n return gasLimit;\n}\n\nexport async function calculateGasStrategy({\n csna,\n transactions,\n env,\n gasStrategy = 'auto',\n}: CalculateGasLimitParams & { gasStrategy?: 'auto' | 'near' | 'btc' }): Promise<{\n transferGasTransaction?: Transaction;\n useNearPayGas: boolean;\n gasLimit: string;\n}> {\n const currentConfig = getWalletConfig(env);\n\n const accountInfo = await getAccountInfo({ csna, env });\n const gasTokenBalance = accountInfo?.gas_token[currentConfig.btcToken] || '0';\n const { balance: nearBalance } = await getTokenBalance({\n csna,\n tokenId: currentConfig.nearToken,\n env,\n });\n\n const transferAmount = transactions.reduce(\n (acc, tx) => {\n tx.actions.forEach((action: any) => {\n // NEAR deposit\n if (action.params.deposit) {\n const amount = Number(action.params.deposit) / 10 ** currentConfig.nearTokenDecimals;\n console.log('near deposit amount:', amount);\n acc.near = acc.near.plus(amount);\n }\n // BTC transfer\n if (\n tx.receiverId === currentConfig.btcToken &&\n ['ft_transfer_call', 'ft_transfer'].includes(action.params.methodName)\n ) {\n const amount = Number(action.params.args.amount) / 10 ** currentConfig.btcTokenDecimals;\n console.log('btc transfer amount:', amount);\n acc.btc = acc.btc.plus(amount);\n }\n });\n return acc;\n },\n { near: new Big(0), btc: new Big(0) },\n );\n\n const nearAvailableBalance = new Big(nearBalance).minus(transferAmount.near).toNumber();\n\n console.log('available near balance:', nearAvailableBalance);\n console.log('available gas token balance:', gasTokenBalance);\n console.log('gas strategy:', gasStrategy);\n\n const convertTx = await Promise.all(\n transactions.map((transaction, index) =>\n convertTransactionToTxHex({\n transaction,\n accountId: state.getAccount(),\n publicKey: state.getPublicKey(),\n index,\n env,\n }),\n ),\n );\n\n // Determine if we should use NEAR to pay for gas\n let useNearPayGas = false;\n let perTxFee: string | undefined;\n\n // Force using NEAR as gas token\n if (gasStrategy === 'near') {\n console.log('Forcing NEAR as gas token based on gasStrategy');\n useNearPayGas = true;\n }\n // Force using BTC token as gas token\n else if (gasStrategy === 'btc') {\n console.log('Forcing BTC token as gas token based on gasStrategy');\n useNearPayGas = false;\n }\n // Auto select payment method (original logic)\n else if (nearAvailableBalance > 0.5) {\n console.log('NEAR balance is enough, using NEAR to pay for gas');\n useNearPayGas = true;\n }\n\n // Get gas amount based on selected payment method\n let gasAmount: string;\n\n if (useNearPayGas) {\n // Get protocol fee for NEAR payment\n const gasTokens = await nearCallFunction<Record<string, { per_tx_protocol_fee: string }>>(\n currentConfig.accountContractId,\n 'list_gas_token',\n { token_ids: [currentConfig.btcToken] },\n { network: currentConfig.network },\n );\n\n console.log('list_gas_token gas tokens:', gasTokens);\n\n const fee = Math.max(Number(gasTokens[currentConfig.btcToken]?.per_tx_protocol_fee || 0), 100);\n perTxFee = fee.toString();\n console.log('perTxFee:', perTxFee);\n gasAmount = new Big(perTxFee || '0').mul(convertTx.length).toFixed(0);\n } else {\n // Predict gas amount for BTC token payment\n gasAmount = await getPredictedGasAmount({\n accountContractId: currentConfig.accountContractId,\n tokenId: currentConfig.btcToken,\n transactions: convertTx.map((t) => t.txHex),\n env,\n });\n }\n\n console.log('useNearPayGas:', useNearPayGas);\n console.log('gasAmount:', gasAmount);\n\n // Create gas token transfer transaction\n const transferTx = await createGasTokenTransfer({ csna, amount: gasAmount, env });\n\n // Recalculate gas with transfer included\n return recalculateGasWithTransfer({\n csna,\n transferTx,\n transactions: convertTx,\n useNearPayGas,\n perTxFee,\n env,\n });\n}\n\nasync function createGasTokenTransfer({\n csna,\n amount,\n env,\n}: {\n csna: string;\n amount: string;\n env: ENV;\n}) {\n const currentConfig = getWalletConfig(env);\n return {\n signerId: csna,\n receiverId: currentConfig.btcToken,\n actions: [\n {\n type: 'FunctionCall',\n params: {\n methodName: 'ft_transfer_call',\n args: {\n receiver_id: currentConfig.accountContractId,\n amount,\n msg: JSON.stringify('Repay'),\n },\n gas: new Big(50).mul(10 ** 12).toFixed(0),\n deposit: '1',\n },\n },\n ],\n } as Transaction;\n}\n\nasync function recalculateGasWithTransfer({\n csna,\n transferTx,\n transactions,\n useNearPayGas,\n perTxFee,\n env,\n}: {\n csna: string;\n transferTx: Transaction;\n transactions: { txHex: string }[];\n useNearPayGas: boolean;\n perTxFee?: string;\n env: ENV;\n}) {\n const currentConfig = getWalletConfig(env);\n const { txHex: transferTxHex } = await convertTransactionToTxHex({\n transaction: transferTx,\n accountId: state.getAccount(),\n publicKey: state.getPublicKey(),\n index: 0,\n env,\n });\n\n let newGasLimit;\n if (useNearPayGas && perTxFee) {\n newGasLimit = new Big(perTxFee).mul(transactions.length + 1).toFixed(0);\n } else {\n newGasLimit = await getPredictedGasAmount({\n accountContractId: currentConfig.accountContractId,\n tokenId: currentConfig.btcToken,\n transactions: [transferTxHex, ...transactions.map((t) => t.txHex)],\n env,\n });\n }\n\n (transferTx.actions[0] as any).params.args.amount = newGasLimit;\n\n return { transferGasTransaction: transferTx, useNearPayGas, gasLimit: newGasLimit };\n}\n\nasync function getPredictedGasAmount({\n accountContractId,\n tokenId,\n transactions,\n env,\n}: {\n accountContractId: string;\n tokenId: string;\n transactions: string[];\n env: ENV;\n}): Promise<string> {\n const currentConfig = getWalletConfig(env);\n const isValidTransactions = transactions.every((tx) => tx.length > 0);\n const predictedGas = isValidTransactions\n ? await nearCallFunction<string>(\n accountContractId,\n 'predict_txs_gas_token_amount',\n {\n gas_token_id: tokenId,\n near_transactions: transactions,\n },\n { network: currentConfig.network },\n )\n : '0';\n\n const predictedGasAmount = new Big(predictedGas).mul(1.2).toFixed(0);\n const miniGasAmount = 200 * transactions.length;\n const gasAmount = Math.max(Number(predictedGasAmount), miniGasAmount);\n console.log('predictedGas:', predictedGasAmount);\n return gasAmount.toString();\n}\n", "import { storageStore } from '../../utils';\n\nconst STORAGE_KEYS = {\n ACCOUNT: 'btc-wallet-account',\n PUBLIC_KEY: 'btc-wallet-publickey',\n BTC_PUBLIC_KEY: 'btc-wallet-btc-publickey',\n} as const;\n\nconst storage = storageStore('SATOSHI_WALLET_ACCOUNT');\n\nexport default {\n saveAccount(account: string) {\n if (!account) {\n this.removeAccount();\n return;\n }\n storage?.set(STORAGE_KEYS.ACCOUNT, account);\n },\n removeAccount() {\n storage?.remove(STORAGE_KEYS.ACCOUNT);\n },\n savePublicKey(publicKey: string) {\n if (!publicKey) {\n this.removePublicKey();\n return;\n }\n storage?.set(STORAGE_KEYS.PUBLIC_KEY, publicKey);\n },\n removePublicKey() {\n storage?.remove(STORAGE_KEYS.PUBLIC_KEY);\n },\n saveBtcPublicKey(publicKey: string) {\n if (!publicKey) {\n this.removeBtcPublicKey();\n return;\n }\n storage?.set(STORAGE_KEYS.BTC_PUBLIC_KEY, publicKey);\n },\n removeBtcPublicKey() {\n storage?.remove(STORAGE_KEYS.BTC_PUBLIC_KEY);\n },\n clear() {\n this.removeAccount();\n this.removePublicKey();\n this.removeBtcPublicKey();\n },\n save(account: string, publicKey: string) {\n if (!account || !publicKey) {\n this.clear();\n return;\n }\n this.saveAccount(account);\n this.savePublicKey(publicKey);\n },\n getAccount() {\n return storage?.get<string>(STORAGE_KEYS.ACCOUNT) || '';\n },\n getPublicKey() {\n return storage?.get<string>(STORAGE_KEYS.PUBLIC_KEY) || '';\n },\n getBtcPublicKey() {\n return storage?.get<string>(STORAGE_KEYS.BTC_PUBLIC_KEY) || '';\n },\n isValid() {\n const account = this.getAccount();\n const publicKey = this.getPublicKey();\n const btcPublicKey = this.getBtcPublicKey();\n\n const allEmpty = !account && !publicKey && !btcPublicKey;\n const allExist = account && publicKey && btcPublicKey;\n\n return allEmpty || allExist;\n },\n syncSave(account: string, publicKey: string, btcPublicKey: string) {\n if (!account || !publicKey || !btcPublicKey) {\n this.clear();\n return;\n }\n\n this.clear();\n\n this.savePublicKey(publicKey);\n this.saveBtcPublicKey(btcPublicKey);\n this.saveAccount(account);\n },\n};\n", "import type { Wallet } from '@near-wallet-selector/core';\nimport { walletConfig, type ENV } from '../config';\nimport { executeBTCDepositAndAction, getWithdrawTransaction } from '../core/btcUtils';\nimport { isMobile, storageStore } from '.';\n\ninterface setupWalletButtonOptions {\n env: ENV;\n nearWallet: Wallet;\n btcWallet?: OriginalWallet;\n walletUrl?: string;\n draggable?: boolean;\n initialPosition?: { right: string; bottom: string };\n buttonSize?: string;\n mobileButtonSize?: string;\n}\n\ninterface OriginalWallet {\n account: string | undefined;\n getPublicKey: () => Promise<string | undefined>;\n}\n\nconst storage = storageStore('SATOSHI_WALLET_BUTTON');\n\nconst minimumMargin = 10;\n\nexport function setupWalletButton({\n env,\n nearWallet,\n btcWallet,\n walletUrl,\n draggable = true,\n initialPosition,\n buttonSize,\n mobileButtonSize,\n}: setupWalletButtonOptions) {\n if (document.getElementById('satoshi-wallet-button')) {\n return;\n }\n\n const iframe = createIframe({\n iframeUrl: walletUrl || walletConfig[env].walletUrl,\n iframeStyle: isMobile()\n ? { width: 'calc(100% - 40px)', height: '80%' }\n : { width: '400px', height: '650px' },\n });\n\n iframe.addEventListener('mouseenter', () => {\n if (document.activeElement !== iframe) {\n document.activeElement?.setAttribute('tabindex', 'null');\n setTimeout(() => {\n iframe.focus();\n }, 0);\n }\n });\n\n const isNearWallet = !btcWallet;\n const openImageUrl = `https://assets.deltatrade.ai/wallet-assets/wallet${\n isNearWallet ? '-near' : ''\n }-btn.png`;\n const closeImageUrl = `https://assets.deltatrade.ai/wallet-assets/wallet${\n isNearWallet ? '-near' : ''\n }-btn-active.png`;\n\n const button = createFloatingButtonWithIframe({\n openImageUrl,\n closeImageUrl,\n iframe,\n draggable,\n initialPosition,\n buttonSize,\n mobileButtonSize,\n });\n\n setupButtonClickHandler(button, iframe, nearWallet, btcWallet);\n}\n\nfunction createFloatingButtonWithIframe({\n openImageUrl,\n closeImageUrl,\n iframe,\n draggable,\n initialPosition,\n buttonSize,\n mobileButtonSize,\n}: {\n openImageUrl: string;\n closeImageUrl: string;\n iframe: HTMLIFrameElement;\n draggable: boolean;\n initialPosition?: { right: string; bottom: string };\n buttonSize?: string;\n mobileButtonSize?: string;\n}): HTMLImageElement {\n const button = document.createElement('img');\n button.id = 'satoshi-wallet-button';\n\n const isIframeVisible = storage?.get<boolean>('visible');\n\n button.src = isIframeVisible ? closeImageUrl : openImageUrl;\n iframe.style.display = isIframeVisible ? 'block' : 'none';\n\n const windowWidth = window.innerWidth;\n const windowHeight = window.innerHeight;\n\n const savedPosition = storage?.get<{ right: string; bottom: string }>('position');\n const currentInitialPosition = initialPosition ||\n savedPosition || {\n right: '20px',\n bottom: '20px',\n };\n\n const tempButtonSize = buttonSize || '60px';\n const tempMobileButtonSize = mobileButtonSize || buttonSize || '40px';\n const actualButtonSize = isMobile() ? parseInt(tempMobileButtonSize) : parseInt(tempButtonSize);\n\n const right = Math.min(\n Math.max(minimumMargin, parseInt(currentInitialPosition.right)),\n windowWidth - actualButtonSize - minimumMargin,\n );\n const bottom = Math.min(\n Math.max(minimumMargin, parseInt(currentInitialPosition.bottom)),\n windowHeight - actualButtonSize - minimumMargin,\n );\n\n Object.assign(button.style, {\n position: 'fixed',\n bottom: `${bottom}px`,\n right: `${right}px`,\n zIndex: '100000',\n width: buttonSize || '60px',\n height: buttonSize || '60px',\n cursor: draggable ? 'grab' : 'pointer',\n transition: 'transform 0.15s ease',\n userSelect: 'none',\n touchAction: 'none',\n });\n\n if (isMobile()) {\n Object.assign(button.style, {\n width: mobileButtonSize || buttonSize || '40px',\n height: mobileButtonSize || buttonSize || '40px',\n });\n }\n\n document.body.appendChild(button);\n\n updateIframePosition(\n iframe,\n right,\n bottom,\n windowWidth,\n windowHeight,\n parseInt(button.style.width),\n );\n\n let isDragging = false;\n let startX = 0;\n let startY = 0;\n let initialRight = 0;\n let initialBottom = 0;\n let dragStartTime = 0;\n\n function startDrag(clientX: number, clientY: number) {\n if (!draggable) return;\n isDragging = true;\n startX = clientX;\n startY = clientY;\n initialRight = parseInt(button.style.right);\n initialBottom = parseInt(button.style.bottom);\n dragStartTime = Date.now();\n\n button.style.cursor = 'grabbing';\n button.style.transition = 'none';\n }\n\n function toggleWallet() {\n const isCurrentlyVisible = iframe.style.display === 'block';\n button.style.transform = 'scale(0.8)';\n setTimeout(() => {\n button.style.transform = 'scale(1)';\n }, 150);\n\n const newVisibleState = !isCurrentlyVisible;\n iframe.style.display = newVisibleState ? 'block' : 'none';\n button.src = newVisibleState ? closeImageUrl : openImageUrl;\n\n storage?.set('visible', newVisibleState);\n\n setTimeout(() => {\n if (newVisibleState) {\n iframe.focus();\n }\n }, 0);\n }\n\n button.addEventListener(\n 'click',\n (e) => {\n if (!isDragging || !draggable) {\n toggleWallet();\n }\n e.preventDefault();\n e.stopPropagation();\n },\n { capture: true },\n );\n\n if (draggable) {\n button.addEventListener(\n 'mousedown',\n (e) => {\n startDrag(e.clientX, e.clientY);\n e.preventDefault();\n e.stopPropagation();\n },\n { capture: true },\n );\n\n button.addEventListener(\n 'touchstart',\n (e) => {\n if (e.touches.length === 1) {\n const touch = e.touches[0];\n startDrag(touch.clientX, touch.clientY);\n e.preventDefault();\n e.stopPropagation();\n }\n },\n { capture: true },\n );\n\n document.addEventListener(\n 'mousemove',\n (e) => {\n if (!isDragging) return;\n moveButton(e.clientX, e.clientY);\n e.preventDefault();\n },\n { capture: true },\n );\n\n document.addEventListener(\n 'touchmove',\n (e) => {\n if (!isDragging || e.touches.length !== 1) return;\n const touch = e.touches[0];\n moveButton(touch.clientX, touch.clientY);\n e.preventDefault();\n },\n { capture: true },\n );\n\n document.addEventListener(\n 'mouseup',\n (e) => {\n if (isDragging) {\n e.preventDefault();\n e.stopPropagation();\n }\n endDrag();\n },\n { capture: true },\n );\n\n document.addEventListener(\n 'touchend',\n (e) => {\n if (isDragging) {\n e.preventDefault();\n e.stopPropagation();\n }\n endDrag();\n\n const dragEndTime = Date.now();\n const dragDuration = dragEndTime - dragStartTime;\n\n if (\n dragDuration < 200 &&\n Math.abs(parseInt(button.style.right) - initialRight) < 5 &&\n Math.abs(parseInt(button.style.bottom) - initialBottom) < 5\n ) {\n toggleWallet();\n }\n },\n { capture: true },\n );\n\n document.addEventListener(\n 'touchcancel',\n () => {\n endDrag();\n },\n { capture: true },\n );\n }\n\n function moveButton(clientX: number, clientY: number) {\n const deltaX = startX - clientX;\n const deltaY = startY - clientY;\n\n let newRight = initialRight + deltaX;\n let newBottom = initialBottom + deltaY;\n\n const currentButtonSize = parseInt(button.style.width);\n\n newRight = Math.min(\n Math.max(minimumMargin, newRight),\n windowWidth - currentButtonSize - minimumMargin,\n );\n newBottom = Math.min(\n Math.max(minimumMargin, newBottom),\n windowHeight - currentButtonSize - minimumMargin,\n );\n\n const snapThreshold = minimumMargin;\n const buttonLeft = windowWidth - newRight - currentButtonSize;\n if (buttonLeft < snapThreshold) {\n newRight = windowWidth - currentButtonSize - minimumMargin;\n } else if (newRight < snapThreshold) {\n newRight = minimumMargin;\n }\n\n const buttonTop = windowHeight - newBottom - currentButtonSize;\n if (buttonTop < snapThreshold) {\n newBottom = windowHeight - currentButtonSize - minimumMargin;\n } else if (newBottom < snapThreshold) {\n newBottom = minimumMargin;\n }\n\n button.style.right = `${newRight}px`;\n button.style.bottom = `${newBottom}px`;\n\n updateIframePosition(iframe, newRight, newBottom, windowWidth, windowHeight, currentButtonSize);\n }\n\n function endDrag() {\n if (!isDragging || !draggable) return;\n\n isDragging = false;\n button.style.cursor = 'grab';\n button.style.transition = 'transform 0.15s ease';\n\n storage?.set('position', {\n right: button.style.right,\n bottom: button.style.bottom,\n });\n }\n\n button.onclick = null;\n\n return button;\n}\n\nfunction createIframe({\n iframeUrl,\n iframeStyle = {},\n}: {\n iframeUrl: string;\n iframeStyle?: { [key: string]: string };\n}): HTMLIFrameElement {\n const iframe = document.createElement('iframe');\n iframe.id = 'satoshi-wallet-iframe';\n iframe.allow = 'clipboard-read; clipboard-write';\n iframe.src = iframeUrl;\n\n const isVisible = storage?.get<boolean>('visible');\n\n Object.assign(iframe.style, {\n position: 'fixed',\n bottom: '90px',\n right: '20px',\n zIndex: '100000',\n boxShadow: '0 0 10px rgba(0, 0, 0, 0.1)',\n borderRadius: '10px',\n display: isVisible ? 'block' : 'none',\n border: 'none',\n ...iframeStyle,\n });\n\n document.body.appendChild(iframe);\n\n return iframe;\n}\n\nlet currentMessageHandler: ((event: MessageEvent) => void) | null = null;\n\nasync function setupButtonClickHandler(\n button: HTMLImageElement,\n iframe: HTMLIFrameElement,\n nearWallet: Wallet,\n btcWallet?: OriginalWallet,\n) {\n const accountId = (await nearWallet?.getAccounts())?.[0].accountId;\n const originalAccountId = btcWallet?.account;\n const originalPublicKey = await btcWallet?.getPublicKey();\n console.log({ accountId, originalAccountId, originalPublicKey });\n const iframeSrc = new URL(iframe.src);\n iframeSrc.searchParams.set('origin', window.location.origin);\n accountId && iframeSrc.searchParams.set('accountId', accountId);\n originalAccountId && iframeSrc.searchParams.set('originalAccountId', originalAccountId);\n originalPublicKey && iframeSrc.searchParams.set('originalPublicKey', originalPublicKey);\n\n iframe.src = iframeSrc.toString();\n\n const actions = {\n signAndSendTransaction: nearWallet.signAndSendTransaction,\n signAndSendTransactions: nearWallet.signAndSendTransactions,\n executeBTCDepositAndAction,\n getWithdrawTransaction,\n };\n\n if (currentMessageHandler) {\n window.removeEventListener('message', currentMessageHandler);\n currentMessageHandler = null;\n }\n\n const handleWalletMessage = async (event: MessageEvent) => {\n if (event.origin !== iframeSrc.origin) return;\n const { action, requestId, data } = event.data;\n\n try {\n const actionFn = actions[action as keyof typeof actions];\n if (!actionFn) return;\n console.log('handleWalletAction', action, event.data);\n const result = await actionFn(data);\n console.log('handleWalletAction result', action, result);\n event.source?.postMessage(\n {\n requestId,\n data,\n success: true,\n },\n { targetOrigin: event.origin },\n );\n } catch (error: any) {\n console.error('handleWalletAction error', action, error);\n event.source?.postMessage(\n {\n requestId,\n error: error.message,\n success: false,\n },\n { targetOrigin: event.origin },\n );\n }\n };\n\n currentMessageHandler = handleWalletMessage;\n window.addEventListener('message', handleWalletMessage);\n}\n\nexport function removeWalletButton() {\n console.log('removeWalletButton');\n const button = document.getElementById('satoshi-wallet-button');\n button?.remove();\n const iframe = document.getElementById('satoshi-wallet-iframe');\n iframe?.remove();\n}\n\nfunction updateIframePosition(\n iframe: HTMLIFrameElement,\n buttonRight: number,\n buttonBottom: number,\n windowWidth: number,\n windowHeight: number,\n buttonSize: number,\n) {\n const iframeWidth = parseInt(iframe.style.width);\n const iframeHeight = parseInt(iframe.style.height);\n\n let iframeRight = buttonRight;\n let iframeBottom = buttonBottom + buttonSize + 10;\n\n if (iframeRight + iframeWidth > windowWidth - minimumMargin) {\n iframeRight = Math.max(minimumMargin, windowWidth - iframeWidth - minimumMargin);\n }\n\n if (iframeBottom + iframeHeight > windowHeight - minimumMargin) {\n iframeBottom = Math.max(minimumMargin, buttonBottom - iframeHeight - 10);\n }\n\n iframe.style.right = `${iframeRight}px`;\n iframe.style.bottom = `${iframeBottom}px`;\n}\n", "import type {\n Transaction,\n InjectedWallet,\n WalletModuleFactory,\n WalletBehaviourFactory,\n} from '@near-wallet-selector/core';\nimport { setupWalletButton, removeWalletButton } from '../../utils/initWalletButton';\nimport type { useBtcWalletSelector } from '../btcWalletSelectorContext';\nimport { retryOperation, toHex } from '../../utils';\nimport type { ENV } from '../../config';\nimport { getWalletConfig } from '../../config';\nimport { nearCallFunction, pollTransactionStatuses } from '../../utils/nearUtils';\n\nimport { checkGasTokenDebt, getCsnaAccountId } from '../btcUtils';\n\nimport {\n getAccountInfo,\n checkBtcTransactionStatus,\n convertTransactionToTxHex,\n getNonce,\n receiveTransaction,\n checkGasTokenBalance,\n calculateGasStrategy,\n} from '../../utils/satoshi';\nimport { getVersion } from '../../index';\nimport state from './state';\n\ndeclare global {\n interface Window {\n btcContext: ReturnType<typeof useBtcWalletSelector>;\n }\n}\n\ninterface BTCWalletParams {\n iconUrl?: string;\n deprecated?: boolean;\n autoConnect?: boolean;\n syncLogOut?: boolean;\n env?: ENV;\n walletUrl?: string;\n gasStrategy?: 'auto' | 'near' | 'btc';\n}\n\nconst BTCWallet: WalletBehaviourFactory<InjectedWallet> = async ({\n metadata,\n options,\n store,\n emitter,\n logger,\n id,\n provider,\n}) => {\n let initializing = false;\n let connectionUpdateTimeout: NodeJS.Timeout;\n\n const wallet = {\n signIn,\n signOut,\n getAccounts,\n verifyOwner,\n signMessage,\n isSignedIn,\n signAndSendTransaction,\n signAndSendTransactions,\n };\n const env: ENV = (metadata as any).env || options.network.networkId || 'mainnet';\n const currentConfig = getWalletConfig(env);\n\n await initBtcContext();\n\n function validateWalletState() {\n const accountId = state.getAccount();\n const publicKey = state.getPublicKey();\n const btcPublicKey = state.getBtcPublicKey();\n if ((!accountId && publicKey) || (accountId && !publicKey) || (!publicKey && btcPublicKey)) {\n state.clear();\n return false;\n }\n return true;\n }\n\n async function initBtcContext() {\n if (initializing) {\n console.log('BTC context initialization already in progress');\n return;\n }\n\n console.log('initBtcContext');\n try {\n initializing = true;\n const btcContext = await retryOperation(\n async () => {\n const ctx = window.btcContext;\n if (!ctx) {\n throw new Error('btcContext not found');\n }\n return ctx;\n },\n (res) => !!res,\n {\n maxRetries: 10,\n delayMs: 500,\n },\n );\n\n await setupBtcContextListeners();\n return btcContext;\n } finally {\n initializing = false;\n }\n }\n\n async function setupBtcContextListeners() {\n const handleConnectionUpdate = async () => {\n if (connectionUpdateTimeout) {\n clearTimeout(connectionUpdateTimeout);\n }\n\n await checkBtcNetwork(currentConfig.network);\n\n if (!state.isValid()) {\n state.clear();\n console.log('setupBtcContextListeners clear');\n }\n\n const valid = validateWalletState();\n if (!valid) {\n return;\n }\n\n const btcContext = window.btcContext;\n\n if (btcContext.account) {\n const btcPublicKey = await btcContext.getPublicKey();\n if (btcPublicKey) {\n await getNearAccountByBtcPublicKey(btcPublicKey);\n if (!window.enableCustomWalletSelectorModal) {\n removeWalletButton();\n setupWalletButton({\n env,\n nearWallet: wallet as any,\n btcWallet: btcContext,\n walletUrl: (metadata as any).walletUrl,\n });\n }\n }\n } else {\n connectionUpdateTimeout = setTimeout(() => {\n handleConnectionUpdate();\n }, 5000);\n }\n };\n\n const context = window.btcContext.getContext();\n\n context.on('updatePublicKey', async (btcPublicKey: string) => {\n state.clear();\n console.log('updatePublicKey clear');\n try {\n const { nearAddress, nearPublicKey } = await getNearAccountByBtcPublicKey(btcPublicKey);\n\n if (!nearAddress || !nearPublicKey) {\n throw new Error('Failed to get near account info');\n }\n\n emitter.emit('accountsChanged', {\n accounts: [{ accountId: nearAddress }],\n });\n await handleConnectionUpdate();\n } catch (error) {\n console.error('Error updating public key:', error);\n }\n });\n\n context.on('btcLoginError', async () => {\n // console.log('btcLoginError');\n // state.clear();\n // emitter.emit('accountsChanged', { accounts: [] });\n // await handleConnectionUpdate();\n });\n\n context.on('btcLogOut', async () => {\n console.log('btcLogOut');\n state.clear();\n emitter.emit('accountsChanged', { accounts: [] });\n await handleConnectionUpdate();\n });\n\n await handleConnectionUpdate();\n\n if (\n 'autoConnect' in metadata &&\n metadata.autoConnect &&\n localStorage.getItem('near-wallet-selector:selectedWalletId') === '\"btc-wallet\"'\n ) {\n await window.btcContext.autoConnect();\n }\n }\n\n async function nearCall<T>(contractId: string, methodName: string, args: any) {\n return nearCallFunction<T>(contractId, methodName, args, { provider });\n }\n\n async function getNearAccountByBtcPublicKey(btcPublicKey: string) {\n const csna = await getCsnaAccountId(env);\n const nearPublicKey = await nearCall<string>(\n currentConfig.accountContractId,\n 'get_chain_signature_near_account_public_key',\n { btc_public_key: btcPublicKey },\n );\n\n state.syncSave(csna, nearPublicKey, btcPublicKey);\n\n return {\n nearAddress: csna,\n nearPublicKey,\n };\n }\n\n async function signIn({ contractId, methodNames }: any) {\n const btcContext = window.btcContext;\n\n state.clear();\n\n if (!state.getAccount() || !state.getPublicKey()) {\n await btcContext.login();\n }\n\n const btcPublicKey = await btcContext.getPublicKey();\n console.log('btcPublicKey:', btcPublicKey);\n if (!btcPublicKey) {\n throw new Error('No connected BTC wallet, please connect your BTC wallet first.');\n }\n\n const { nearAddress, nearPublicKey } = await getNearAccountByBtcPublicKey(btcPublicKey);\n\n return [\n {\n accountId: nearAddress,\n publicKey: nearPublicKey,\n },\n ];\n }\n\n async function signOut() {\n const accountId = state.getAccount();\n const publicKey = state.getPublicKey();\n if (!(accountId && publicKey)) {\n return;\n }\n const btcContext = window.btcContext;\n // @ts-ignore\n if (metadata.syncLogOut) {\n btcContext.logout();\n }\n\n state.clear();\n window.localStorage.removeItem('near-wallet-selector:selectedWalletId');\n if (!window.enableCustomWalletSelectorModal) {\n removeWalletButton();\n }\n }\n\n function isSignedIn() {\n const accountId = state.getAccount();\n const publicKey = state.getPublicKey();\n return accountId && publicKey;\n }\n\n async function getAccounts() {\n return [{ accountId: state.getAccount() }];\n }\n\n async function verifyOwner() {\n throw new Error(`Method not supported by ${metadata.name}`);\n }\n\n async function signMessage() {\n throw new Error(`Method not supported by ${metadata.name}`);\n }\n\n async function signAndSendTransaction(params: Transaction) {\n const transactions = [params];\n const result = await signAndSendTransactions({ transactions });\n if (Array.isArray(result)) {\n return result[0];\n } else {\n throw new Error(`Transaction failed: ${result}`);\n }\n }\n\n async function signAndSendTransactions(params: { transactions: Transaction[] }) {\n if (!validateWalletState()) {\n throw new Error('Wallet state is invalid, please reconnect your wallet.');\n }\n\n const btcContext = window.btcContext;\n const csna = state.getAccount();\n\n const accountInfo = await getAccountInfo({ csna, env });\n\n // check gas token arrears\n await checkGasTokenDebt(csna, env, true);\n\n const trans = [...params.transactions];\n console.log('signAndSendTransactions raw trans:', trans);\n\n const { transferGasTransaction, useNearPayGas, gasLimit } = await calculateGasStrategy({\n csna,\n transactions: trans,\n env,\n gasStrategy: (metadata as any).gasStrategy,\n });\n\n console.log('transferGasTransaction:', transferGasTransaction);\n console.log('useNearPayGas:', useNearPayGas);\n console.log('gasLimit:', gasLimit);\n\n // check gas token balance\n await checkGasTokenBalance(csna, gasLimit, env);\n\n if (transferGasTransaction) {\n trans.unshift(transferGasTransaction);\n }\n\n console.log('calculateGasStrategy trans:', trans);\n\n const newTrans = await Promise.all(\n trans.map((transaction, index) =>\n convertTransactionToTxHex({\n transaction,\n accountId: state.getAccount(),\n publicKey: state.getPublicKey(),\n index,\n env,\n }),\n ),\n );\n\n const nonceFromApi = await getNonce({ env, accountId: csna });\n\n const nonceFromContract = accountInfo?.nonce || 0;\n\n const nonce =\n Number(nonceFromApi) > Number(nonceFromContract)\n ? String(nonceFromApi)\n : String(nonceFromContract);\n\n const intention = {\n chain_id: '397',\n csna,\n near_transactions: newTrans.map((t) => t.txHex),\n gas_token: currentConfig.btcToken,\n gas_limit: gasLimit,\n use_near_pay_gas: useNearPayGas,\n nonce,\n replace: true,\n };\n\n const strIntention = JSON.stringify(intention);\n\n const signature = await btcContext.signMessage(strIntention);\n\n await receiveTransaction({\n env,\n sig: signature,\n btcPubKey: state.getBtcPublicKey(),\n data: toHex(strIntention),\n });\n await checkBtcTransactionStatus({ signature, env });\n\n // Skip the outcome of the first transaction, which is the gas token transfer transaction\n const hash = newTrans.slice(1).map((t) => t.hash);\n console.log('txHash:', hash);\n const result = await pollTransactionStatuses(options.network.networkId, hash);\n return result;\n }\n\n async function checkBtcNetwork(network: string) {\n const btcContext = window.btcContext;\n if (!btcContext.account) return;\n const btcNetwork = await btcContext.getNetwork();\n const networkMap = {\n livenet: ['mainnet', 'private_mainnet'],\n testnet: ['testnet', 'dev'],\n };\n if (!networkMap[btcNetwork].includes(network)) {\n await btcContext.switchNetwork(btcNetwork === 'livenet' ? 'testnet' : 'livenet');\n }\n }\n\n return wallet as any;\n};\n\nexport function setupBTCWallet({\n iconUrl = 'https://assets.deltatrade.ai/assets/chain/btc.svg',\n deprecated = false,\n autoConnect = true,\n syncLogOut = true,\n env = 'mainnet',\n walletUrl,\n gasStrategy = 'auto',\n}: BTCWalletParams | undefined = {}): WalletModuleFactory<InjectedWallet> {\n console.log('\u26A1\uFE0F BTC Wallet Version:', getVersion(), 'env:', env, 'gasStrategy:', gasStrategy);\n\n const btcWallet = async () => {\n return {\n id: 'btc-wallet',\n type: 'injected',\n metadata: {\n name: 'BTC Wallet',\n description: 'BTC Wallet',\n iconUrl,\n downloadUrl: iconUrl,\n deprecated,\n available: true,\n autoConnect,\n syncLogOut,\n env,\n walletUrl,\n gasStrategy,\n },\n init: BTCWallet,\n } as any;\n };\n\n return btcWallet;\n}\n\nexport default {\n setupBTCWallet,\n};\n", "import {\n setupModal as _setupModal,\n type WalletSelectorModal as _WalletSelectorModal,\n type ModalOptions as _ModalOptions,\n} from 'ref-modal-ui';\nimport type { WalletSelector, WalletSelectorState } from '@near-wallet-selector/core';\nimport { Dialog } from '../utils/Dialog';\nimport { removeWalletButton, setupWalletButton } from '../utils/initWalletButton';\nimport { ENV } from '../config';\n\nexport interface WalletSelectorModalOptions extends _ModalOptions {\n showChainGroups?: boolean;\n showWalletUIForNearAccount?: boolean;\n walletUrl?: string;\n env?: ENV;\n draggable?: boolean;\n initialPosition?: { right: string; bottom: string };\n buttonSize?: string;\n mobileButtonSize?: string;\n}\nexport type WalletSelectorModal = _WalletSelectorModal;\n\ndeclare global {\n interface Window {\n enableCustomWalletSelectorModal: boolean;\n }\n}\n\nlet subscription: any;\n\nexport function setupWalletSelectorModal(\n selector: WalletSelector,\n options: WalletSelectorModalOptions,\n) {\n if (!selector) throw new Error('selector is required');\n\n const {\n showChainGroups = true,\n showWalletUIForNearAccount = true,\n env = 'mainnet',\n walletUrl,\n draggable = true,\n initialPosition = { right: '20px', bottom: '20px' },\n buttonSize = '60px',\n mobileButtonSize = '40px',\n } = options;\n\n subscription?.unsubscribe();\n const state = selector.store.getState();\n const group = getGroup(state);\n subscription = selector.store.observable.subscribe((state: WalletSelectorState) => {\n const walletId = state.selectedWalletId;\n window.enableCustomWalletSelectorModal = true;\n console.log('setupWalletSelectorModal walletId', walletId);\n removeWalletButton();\n if (walletId === 'btc-wallet' || showWalletUIForNearAccount) {\n selector.wallet().then((wallet) => {\n setupWalletButton({\n env,\n nearWallet: wallet,\n btcWallet: walletId === 'btc-wallet' ? window.btcContext : undefined,\n walletUrl,\n draggable,\n initialPosition,\n buttonSize,\n mobileButtonSize,\n });\n });\n }\n });\n\n if (group.includes('btc')) {\n document.head.appendChild(document.createElement('style')).textContent = `\n #near-wallet-selector-modal .options-list .btc-wallet {\n display: none;\n }\n `;\n }\n\n if (group.includes('eth')) {\n document.head.appendChild(document.createElement('style')).textContent = `\n #near-wallet-selector-modal .options-list .ethereum-wallets {\n display: none;\n }\n `;\n }\n\n const modal = _setupModal(selector, options);\n const originalShow = modal.show.bind(modal);\n\n modal.show = async () => {\n const chain = group.length > 1 && showChainGroups ? await openChainModal(group) : group[0];\n if (['btc', 'eth'].includes(chain)) {\n const moduleId = chain === 'btc' ? 'btc-wallet' : 'ethereum-wallets';\n const module = state.modules.find((module) => module.id === moduleId);\n if (module) {\n const wallet = await module.wallet();\n await wallet.signIn(options as any);\n }\n } else if (chain === 'near') {\n originalShow();\n }\n };\n return modal;\n}\n\nconst CHAINS = [\n { id: 'near', name: 'Near', description: 'Near Account' },\n { id: 'eth', name: 'Ethereum', description: 'EVM address as Near Account' },\n { id: 'btc', name: 'Bitcoin', description: 'MPC Mapping' },\n];\n\nasync function openChainModal(group: string[]): Promise<string> {\n const chains = CHAINS.filter((chain) => group.includes(chain.id));\n const content = (resolve: (v: string) => void, close: () => void) => {\n const buttons = `\n <div class=\"option-list\">${chains\n .map(\n (chain) => `<button class=\"chain-button option-item\" data-chain=\"${chain.id}\">\n <img src=\"https://assets.deltatrade.ai/assets/chain/${chain.id}.svg\" alt=\"${chain.id}\" style=\"width:32px; height: 32px;\" />\n <div style=\"display: flex; flex-direction: column; text-align: left;\">\n <div style=\"font-size: 16px; font-weight: bold;\">${chain.name}</div>\n <div style=\"font-size: 12px; opacity:0.5;\">${chain.description}</div>\n </div>\n </button>`,\n )\n .join('')}\n </div>\n `;\n const div = document.createElement('div');\n div.innerHTML = buttons;\n\n const buttonsEl = div.querySelectorAll('.chain-button');\n\n buttonsEl.forEach((button) => {\n button.addEventListener('click', () => {\n resolve((button as HTMLButtonElement).dataset.chain as string);\n close();\n });\n });\n\n return div;\n };\n return await Dialog.openModal({\n title: 'Choose Wallet',\n titleStyle:\n 'font-size: 18px; font-weight: 600; color: #fff; text-align: center;padding-bottom: 10px;',\n content,\n });\n}\n\nfunction getGroup(state: WalletSelectorState) {\n const hasBtcWallet = state.modules.some((module) => module.id === 'btc-wallet');\n const hasEvmWallet = state.modules.some((module) => module.id === 'ethereum-wallets');\n const hasNearWallet = state.modules.some(\n (module) => module.id !== 'btc-wallet' && module.id !== 'ethereum-wallets',\n );\n const group = [];\n if (hasBtcWallet) group.push('btc');\n if (hasEvmWallet) group.push('eth');\n if (hasNearWallet) group.push('near');\n return group;\n}\n"],
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACOO,IAAe,gBAAf,MAA6B;AAwBpC;;;;;;AC7BO,SAAS,YAAY,KAAkB;AAC5C,MAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,UAAM,MAAM,IAAI,SAAS,IAAI;AAAA,EAC/B;AACA,MAAI,KAAK;AACP,QAAI,OAAO,IAAI,aAAa,YAAY;AACtC,YAAM,IAAI,SAAS;AAAA,IACrB;AACA,QAAI,IAAI,UAAU,IAAI;AACpB,aAAO;AAAA,IACT;AACA,WAAO,GAAG,IAAI,MAAM,GAAG,CAAC,OAAO,IAAI,MAAM,IAAI,SAAS,GAAG,IAAI,MAAM;AAAA,EACrE;AACA,SAAO;AACT;AAEA,SAAsB,gBAAgB,MAAc;AAAA;AAClD,UAAM,gBAAgB,MAAY;AAChC,UAAI,UAAU,WAAW;AACvB,eAAO,UAAU,UAAU,UAAU,IAAI;AAAA,MAC3C,OAAO;AACL,cAAM,WAAW,SAAS,cAAc,UAAU;AAClD,iBAAS,QAAQ;AACjB,iBAAS,aAAa,YAAY,EAAE;AACpC,iBAAS,MAAM,WAAW;AAC1B,iBAAS,MAAM,OAAO;AACtB,iBAAS,KAAK,YAAY,QAAQ;AAElC,iBAAS,OAAO;AAChB,cAAM,SAAS,SAAS,YAAY,MAAM;AAE1C,iBAAS,KAAK,YAAY,QAAQ;AAElC,YAAI,CAAC,QAAQ;AACX,gBAAM,IAAI,MAAM,0BAA0B;AAAA,QAC5C;AAAA,MACF;AAAA,IACF;AAEA,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,oBAAc,EAAE,KAAK,OAAO,EAAE,MAAM,MAAM;AAAA,IAC5C,CAAC;AAAA,EACH;AAAA;AAEO,IAAM,mBACX;AAEK,IAAM,YAAY,CAAC,SAAiB;AACzC,MAAI,CAAC,QAAQ,CAAC,KAAK,WAAW,SAAS,GAAG;AACxC,WAAO,QAAQ;AAAA,EACjB;AAEA,SAAO,iCAAiC,UAAU,KAAK,MAAM,CAAC,CAAC;AACjE;AAEO,IAAM,kBAAkB,CAC7B,kBACA,oBACA,YACG;AACH,MAAI,CAAC,iBAAiB,qBAAqB;AACzC,WAAO;AAAA,EACT;AACA,SAAO,iBAAiB,oBAAoB,KAAK,CAAC,SAAS,KAAK,YAAY,OAAO;AACrF;AAEO,IAAM,QAAQ,CAAC,OAAe,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AAErF,SAAsB,eACpB,IACA,IAQY;AAAA,6CATZ,WACA,YACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,EACZ,IAGI,CAAC,GACO;AACZ,QAAI,UAAU;AAEd,WAAO,WAAW,YAAY;AAC5B,YAAM,SAAS,MAAM,UAAU;AAC/B,UAAI,WAAW,MAAM,GAAG;AACtB,eAAO;AAAA,MACT;AACA,UAAI,YAAY,YAAY;AAC1B,gBAAQ,KAAK,qBAAqB;AAClC,eAAO;AAAA,MACT;AACA;AACA,YAAM,MAAM,OAAO;AAAA,IACrB;AACA,UAAM,IAAI,MAAM,2BAA2B;AAAA,EAC7C;AAAA;AAEO,SAAS,MAAM,gBAAwB;AAC5C,QAAM,YAAY,eAAe,MAAM,EAAE;AACzC,QAAM,aAAa,UAAU,IAAI,CAAC,SAAS,KAAK,WAAW,CAAC,CAAC;AAC7D,QAAM,WAAW,WAAW,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;AAC3D,MAAI,YAAY,SAAS,KAAK,EAAE;AAChC,cAAY,UAAU,QAAQ,UAAU,EAAE;AAC1C,SAAO;AACT;AAEO,SAAS,WAAoB;AAClC,MAAI,OAAO,WAAW,aAAa;AACjC,WAAO,iEAAiE;AAAA,MACtE,uCAAW;AAAA,IACb;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,cAAiB,KAA4B;AAC3D,MAAI;AACF,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,SAAS,GAAP;AACA,YAAQ,MAAM,iBAAiB,CAAC;AAChC,WAAO;AAAA,EACT;AACF;AAEO,SAAS,kBAAkB,KAA8B;AAC9D,MAAI;AACF,WAAO,KAAK,UAAU,GAAG;AAAA,EAC3B,SAAS,GAAP;AACA,YAAQ,MAAM,qBAAqB,CAAC;AACpC,WAAO;AAAA,EACT;AACF;AAEO,SAAS,aAAa,WAAoB,SAAiC;AAChF,MAAI,OAAO,WAAW;AAAa;AACnC,QAAM,aAAa,aAAa;AAChC,QAAMA,YAAU,mCAAS,aAAW,iCAAQ;AAC5C,QAAM,eAAe,CAAC,QAAgB;AACpC,WAAO,aAAa,MAAM;AAAA,EAC5B;AACA,SAAO;AAAA,IACL,IAAI,KAAa,OAAY;AAC3B,YAAM,SAAS,kBAAkB,KAAK;AACtC,eAASA,SAAQ,QAAQ,aAAa,GAAG,GAAG,MAAM,IAAIA,SAAQ,WAAW,aAAa,GAAG,CAAC;AAAA,IAC5F;AAAA,IACA,IAAO,KAAa;AAClB,YAAM,SAASA,SAAQ,QAAQ,aAAa,GAAG,CAAC;AAChD,aAAO,SAAS,cAAiB,MAAM,IAAI;AAAA,IAC7C;AAAA,IACA,OAAO,KAAa;AAClB,MAAAA,SAAQ,WAAW,aAAa,GAAG,CAAC;AAAA,IACtC;AAAA,IACA,UAAU,SAAS,WAAW;AAC5B,iBAAW,OAAOA,UAAS;AACzB,YAAI,IAAI,WAAW,YAAY,GAAG,GAAG;AACnC,UAAAA,SAAQ,WAAW,GAAG;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AC1JO,IAAM,SAAN,MAAa;AAAA,EAgJlB,OAAe,eAAe;AAC5B,QAAI,CAAC,SAAS,cAAc,gBAAgB,GAAG;AAC7C,YAAM,aAAa,SAAS,cAAc,OAAO;AACjD,iBAAW,KAAK;AAChB,iBAAW,cAAc,KAAK;AAC9B,eAAS,KAAK,YAAY,UAAU;AAAA,IACtC;AAAA,EACF;AAAA,EAEA,OAAO,QAAQ,SAAgE;AAC7E,WAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,WAAK,aAAa;AAElB,YAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,gBAAU,YAAY,KAAK;AAC3B,eAAS,KAAK,YAAY,SAAS;AAEnC,YAAM,UAAU,UAAU,cAAc,eAAe;AACvD,YAAM,YAAY,UAAU,cAAc,iBAAiB;AAC3D,YAAM,aAAa,UAAU,cAAc,qBAAqB;AAChE,YAAM,YAAY,UAAU,cAAc,oBAAoB;AAE9D,UAAI,QAAQ,OAAO;AACjB,gBAAQ,cAAc,QAAQ;AAAA,MAChC,OAAO;AACL,gBAAQ,MAAM,UAAU;AAAA,MAC1B;AACA,gBAAU,cAAc,QAAQ;AAEhC,YAAM,UAAU,MAAM;AACpB,iBAAS,KAAK,YAAY,SAAS;AAAA,MACrC;AAEA,iBAAW,iBAAiB,SAAS,MAAM;AACzC,gBAAQ;AACR,gBAAQ,IAAI;AAAA,MACd,CAAC;AAED,gBAAU,iBAAiB,SAAS,MAAM;AACxC,gBAAQ;AACR,gBAAQ,KAAK;AAAA,MACf,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,MAAM,SAAwB;AACnC,UAAM,YAAY,QAAQ,qBACtB,EAAE,yBAAyB,EAAE,QAAQ,QAAQ,QAAQ,EAAE,IACvD,EAAE,UAAU,QAAQ,QAAQ;AAEhC,WAAO,IAAI,QAAc,CAAC,YAAY;AAzM1C;AA0MM,WAAK,aAAa;AAElB,YAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,gBAAU,YAAY,KAAK;AAC3B,sBAAU,cAAc,iBAAiB,MAAzC,mBAA4C,UAAU,IAAI;AAE1D,UAAI,QAAQ,aAAa,OAAO;AAC9B,cAAM,UAAU,UAAU,cAAc,iBAAiB;AACzD,gBAAQ,MAAM,gBAAgB;AAC9B,cAAM,kBAAkB,UAAU,cAAc,mBAAmB;AACnE,wBAAgB,MAAM,gBAAgB;AAAA,MACxC;AAEA,eAAS,KAAK,YAAY,SAAS;AAEnC,YAAM,UAAU,UAAU,cAAc,eAAe;AACvD,YAAMC,aAAY,UAAU,cAAc,iBAAiB;AAC3D,YAAM,aAAa,UAAU,cAAc,qBAAqB;AAChE,YAAM,YAAY,UAAU,cAAc,oBAAoB;AAE9D,UAAI,QAAQ,OAAO;AACjB,gBAAQ,cAAc,QAAQ;AAAA,MAChC,OAAO;AACL,gBAAQ,MAAM,UAAU;AAAA,MAC1B;AACA,MAAAA,WAAU,YAAY,QAAQ;AAC9B,gBAAU,MAAM,UAAU;AAE1B,UAAI,QAAQ,aAAa,OAAO;AAC9B,mBAAW,MAAM,UAAU;AAAA,MAC7B;AAEA,YAAM,UAAU,MAAM;AACpB,YAAI,QAAQ,aAAa,OAAO;AAC9B;AAAA,QACF;AACA,iBAAS,KAAK,YAAY,SAAS;AAAA,MACrC;AAEA,iBAAW,iBAAiB,SAAS,MAAM;AACzC,gBAAQ;AACR,gBAAQ;AAAA,MACV,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,UAAa;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAIe;AACb,WAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,YAAM,iBAAiB,SAAS,cAAc,KAAK;AACnD,qBAAe,YAAY,KAAK;AAChC,eAAS,KAAK,YAAY,cAAc;AAExC,YAAM,OAAO,eAAe,cAAc,iBAAiB;AAC3D,WAAK,MAAM,UAAU;AAErB,WAAK,aAAa;AAElB,YAAM,UAAU,eAAe,cAAc,eAAe;AAE5D,UAAI,OAAO;AACT,gBAAQ,cAAc;AACtB,YAAI,YAAY;AACd,kBAAQ,MAAM,UAAU;AAAA,QAC1B;AAAA,MACF,OAAO;AACL,gBAAQ,MAAM,UAAU;AAAA,MAC1B;AAEA,YAAM,UAAU,MAAM;AACpB,iBAAS,KAAK,YAAY,cAAc;AAAA,MAC1C;AAEA,YAAM,QAAQ,MAAM;AAClB,gBAAQ;AACR,gBAAQ,IAAS;AAAA,MACnB;AAEA,YAAM,YAAY,eAAe,cAAc,iBAAiB;AAChE,gBAAU,YAAY,QAAQ,SAAS,KAAK,CAAC;AAE7C,YAAM,UAAU,eAAe,cAAc,iBAAiB;AAC9D,cAAQ,iBAAiB,SAAS,CAAC,MAAM;AACvC,YAAI,EAAE,WAAW,SAAS;AACxB,gBAAM;AAAA,QACR;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AACF;AAnSa,OACI,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AADf,OAgBI,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACflB,IAAM,sBAAN,MAA0B;AAAA,EAC/B,OAAO,iBAAiB,UAAkB,KAAqB;AAC7D,YAAQ,UAAU;AAAA,MAChB,KAAK;AACH,eAAO,iCAAiC,mBAAmB,GAAG;AAAA,MAChE,KAAK;AACH,eAAO,uCAAuC,mBAAmB,GAAG;AAAA,MACtE,KAAK;AACH,eAAO,wBAAwB,mBAAmB,GAAG;AAAA,MACvD;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAAA,EAEA,OAAa,iBAAiB,UAAkB;AAAA;AAC9C,UAAI,SAAS,GAAG;AACd,cAAM,aAAa,OAAO,SAAS;AACnC,cAAM,gBAAgB,KAAK,iBAAiB,UAAU,UAAU;AAEhE,cAAM,kBAAkB,MAAY;AA3B1C;AA4BQ,cAAI;AACF,mBAAM,eAAU,cAAV,mBAAqB,UAAU;AAAA,UACvC,SAAS,OAAP;AACA,oBAAQ,MAAM,KAAK;AAAA,UACrB;AAEA,gBAAM,OAAO,MAAM;AAAA,YACjB,OAAO;AAAA,YACP,SAAS;AAAA;AAAA;AAAA,2BAGQ;AAAA;AAAA;AAAA;AAAA;AAAA,YAKjB,oBAAoB;AAAA,UACtB,CAAC;AAAA,QACH;AAEA,YAAI,CAAC,eAAe;AAClB,gBAAM,gBAAgB;AACtB,iBAAO;AAAA,QACT;AAEA,cAAM,aAAa,MAAM;AACvB,gBAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,iBAAO,MAAM,UAAU;AACvB,iBAAO,MAAM;AACb,mBAAS,KAAK,YAAY,MAAM;AAEhC,qBAAW,MAAY;AACrB,qBAAS,KAAK,YAAY,MAAM;AAChC,kBAAM,gBAAgB;AAAA,UACxB,IAAG,GAAI;AAAA,QACT;AAEA,eAAO,SAAS,OAAO;AACvB,mBAAW,YAAY,GAAG;AAC1B,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAAA;AACF;;;ACnEO,IAAe,oBAAf,cAAyC,cAAc;AAAA,EAC5D,YAAoB,YAAoB;AAL1C;AAMI,UAAM;AADY;AAElB,UAAM,SAAQ,UAAK,eAAL,mBAAiB,MAAM;AACrC,QAAI,CAAC,KAAK,cAAc,MAAM,SAAS,GAAG;AACxC,YAAM,IAAI,MAAM,+BAA+B;AAAA,IACjD;AAAA,EACF;AAAA,EACA,UAAmB;AACjB,QAAI,OAAO,WAAW,aAAa;AACjC,YAAM,QAAQ,KAAK,WAAW,MAAM,GAAG;AACvC,UAAI,MAAM,WAAW,GAAG;AACtB,YAAI,OAAQ,OAAe,MAAM,QAAQ,aAAa;AACpD,iBAAO;AAAA,QACT;AAAA,MACF,OAAO;AACL,YACE,OAAQ,OAAe,MAAM,QAAQ,eACrC,OAAQ,OAAe,MAAM,IAAI,MAAM,QAAQ,aAC/C;AACA,iBAAO;AAAA,QACT;AAAA,MACF;AACA,UAAI,SAAS,GAAG;AACd,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEM,kBAAqC;AAAA;AACzC,UAAI,SAAS,GAAG;AACd,YAAI;AACF,eAAK,YAAY;AAAA,QACnB,SAAS,OAAP;AACA,gBAAM,oBAAoB,iBAAiB,KAAK,SAAS,EAAE;AAC3D,iBAAO,CAAC;AAAA,QACV;AAAA,MACF;AAEA,YAAM,WAAW,MAAM,KAAK,mBAAmB,EAAE,gBAAgB;AACjE,cAAQ,IAAI,YAAY,MAAM,KAAK,WAAW,CAAC;AAC/C,cAAQ,IAAI,+DAAwD,QAAQ;AAC5E,aAAO;AAAA,IACT;AAAA;AAAA,EAEM,cAAiC;AAAA;AACrC,YAAM,WAAW,MAAM,KAAK,mBAAmB,EAAE,YAAY;AAC7D,aAAO;AAAA,IACT;AAAA;AAAA,EACM,eAAgC;AAAA;AACpC,aAAO,KAAK,mBAAmB,EAAE,aAAa;AAAA,IAChD;AAAA;AAAA,EACM,YAAY,SAAiB,MAAmD;AAAA;AACpF,YAAM,YAAY,MAAM,KAAK,YAAY;AACzC,UAAI,UAAU,WAAW,GAAG;AAC1B,cAAM,IAAI,MAAM,GAAG,KAAK,SAAS,qBAAqB;AAAA,MACxD;AACA,aAAO,KAAK,mBAAmB,EAAE,YAAY,SAAS,IAAI;AAAA,IAC5D;AAAA;AAAA,EACA,GAAG,OAAe,SAAmC;AAhEvD;AAiEI,UAAM,WAAW,KAAK,YAAY;AAClC,YAAO,0CAAU,OAAV,kCAAe,OAAO;AAAA,EAC/B;AAAA,EACA,eAAe,OAAe,SAAmC;AApEnE;AAqEI,UAAM,WAAW,KAAK,YAAY;AAClC,YAAO,0CAAU,mBAAV,kCAA2B,OAAO;AAAA,EAC3C;AAAA,EAEA,cAAc;AACZ,QAAI,KAAK,QAAQ,GAAG;AAClB,YAAM,QAAQ,KAAK,WAAW,MAAM,GAAG;AACvC,UAAI,MAAM,WAAW,GAAG;AACtB,eAAQ,OAAe,MAAM;AAAA,MAC/B,OAAO;AACL,eAAQ,OAAe,MAAM,IAAI,MAAM;AAAA,MACzC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,qBAAqB;AACnB,UAAM,WAAW,KAAK,YAAY;AAClC,QAAI,CAAC,UAAU;AACb,YAAM,IAAI,MAAM,GAAG,KAAK,SAAS,mDAAmD;AAAA,IACtF;AACA,WAAO;AAAA,EACT;AAAA,EAEM,aAA6C;AAAA;AACjD,aAAO,KAAK,mBAAmB,EAAE,WAAW;AAAA,IAC9C;AAAA;AAAA,EACM,cAAc,SAA+C;AAAA;AACjE,aAAO,KAAK,mBAAmB,EAAE,cAAc,OAAO;AAAA,IACxD;AAAA;AAAA,EAEM,YACJ,WACA,UACA,SACiB;AAAA;AACjB,aAAO,KAAK,mBAAmB,EAAE,YAAY,WAAW,UAAU,OAAO;AAAA,IAC3E;AAAA;AAAA,EAEM,gBACJ,SACA,eACA,SAC2B;AAAA;AAC3B,YAAM,SAAS,MAAM,KAAK,mBAAmB,EAAE,gBAAgB,SAAS,eAAe,OAAO;AAC9F,UAAI,OAAO,WAAW,UAAU;AAC9B,eAAO;AAAA,UACL,MAAM;AAAA,QACR;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAAA;AAAA,EAEA,aAAa;AAAA,EAAC;AAChB;;;ACvHO,IAAM,kBAAN,cAA8B,kBAAkB;AAAA,EAQrD,cAAc;AACZ,UAAM,gBAAgB;AARxB,SAAS,WAA2B;AAAA,MAClC,IAAI;AAAA,MACJ,MAAM;AAAA,MACN;AAAA,MACA,aAAa;AAAA,IACf;AAAA,EAIA;AACF;;;;;;ACXO,IAAM,iBAAN,cAA6B,kBAAkB;AAAA,EAQpD,cAAc;AACZ,UAAM,qBAAqB;AAR7B,SAAS,WAA2B;AAAA,MAClC,IAAI;AAAA,MACJ,MAAM;AAAA,MACN;AAAA,MACA,aAAa;AAAA,IACf;AAAA,EAIA;AACF;;;;;;ACXO,IAAM,eAAN,cAA2B,kBAAkB;AAAA,EAOlD,cAAc;AACZ,UAAM,mBAAmB;AAP3B,SAAS,WAA2B;AAAA,MAClC,IAAI;AAAA,MACJ,MAAM;AAAA,MACN;AAAA,MACA,aAAa;AAAA,IACf;AAAA,EAGA;AACF;;;;;;ACVO,IAAM,uBAAN,cAAmC,kBAAkB;AAAA,EAQ1D,cAAc;AACZ,UAAM,qBAAqB;AAR7B,SAAS,WAA2B;AAAA,MAClC,IAAI;AAAA,MACJ,MAAM;AAAA,MACN;AAAA,MACA,aAAa;AAAA,IACf;AAAA,EAIA;AACF;;;;;;ACXO,IAAM,kBAAN,cAA8B,kBAAkB;AAAA,EAQrD,cAAc;AACZ,UAAM,QAAQ;AARhB,SAAS,WAA2B;AAAA,MAClC,IAAI;AAAA,MACJ,MAAM;AAAA,MACN;AAAA,MACA,aAAa;AAAA,IACf;AAAA,EAIA;AACF;;;;;;ACXO,IAAM,gBAAN,cAA4B,kBAAkB;AAAA,EAQnD,cAAc;AACZ,UAAM,MAAM;AARd,SAAS,WAA2B;AAAA,MAClC,IAAI;AAAA,MACJ,MAAM;AAAA,MACN;AAAA,MACA,aAAa;AAAA,IACf;AAAA,EAIA;AACF;;;ACfA,oBAAyB;;;;;;AAYzB,IAAM,UAAU,aAAa,uBAAuB;AAZpD;AAaO,IAAM,kBAAN,cAA8B,cAAc;AAAA,EAGjD,cAAc;AACZ,UAAM;AAHR,iCAAW;AACX,+BAAS,IAAI,cAAAC,QAAa;AAK1B,SAAS,WAA2B;AAAA,MAClC,IAAI;AAAA,MACJ,MAAM;AAAA,MACN;AAAA,MACA,aAAa;AAAA,IACf;AAQA,SAAQ,eAAe,CAAO,YAAmC;AAC/D,YAAM,EAAE,eAAe,IAAI,MAAM,OAAO;AACxC,YAAM,WAAW,KAAK,YAAY;AAClC,YAAM,SAAS,QAAQ,6BAA6B,MAAS;AAC7D,YAAM,EAAE,QAAQ,WAAW,IAAI,MAAM,SAAS,QAAQ,wBAAwB,MAAS;AAEvF,YAAM,EAAE,OAAO,IAAI,MAAM,SAAS,QAAQ,gBAAgB;AAAA,QACxD,UAAU,CAAC,eAAe,SAAS,eAAe,QAAQ;AAAA,QAC1D,SAAS;AAAA,MACX,CAAC;AACD,YAAM,YAA6B,OAAO,UAAU,IAAI,CAAC,SAAyB,iCAC7E,OAD6E;AAAA,QAEhF;AAAA,MACF,EAAE;AACF,cAAQ,IAAI,qDAA8C,SAAS;AAEnE,yCAAS,IAAI,GAAG,qBAAqB;AACrC,aAAO;AAAA,IACT;AAjCE,uBAAK,QAAO,gBAAgB,GAAG;AAAA,EACjC;AAAA,EAOA,UAAmB;AACjB,QAAI,OAAO,WAAW,aAAa;AACjC,UAAI,OAAO,OAAO,oBAAoB;AAAa,eAAO;AAC1D,UAAI,SAAS;AAAG,eAAO;AAAA,IACzB;AACA,WAAO;AAAA,EACT;AAAA,EAoBM,kBAA6C;AAAA;AACjD,YAAM,IAAI,MAAM,aAAa;AAAA,IAC/B;AAAA;AAAA,EACM,kBAAqC;AAAA;AACzC,UAAI,SAAS,GAAG;AACd,YAAI;AACF,eAAK,YAAY;AAAA,QACnB,SAAS,OAAP;AACA,8BAAoB,iBAAiB,KAAK,SAAS,EAAE;AACrD,iBAAO,CAAC;AAAA,QACV;AAAA,MACF;AACA,YAAM,YAAY,MAAM,KAAK,aAAa,mBAAK,SAAe;AAC9D,aAAO,UAAU,IAAI,CAAC,SAAS,KAAK,OAAO;AAAA,IAC7C;AAAA;AAAA,EACM,eAAe;AAAA;AACnB,YAAM,OAAO,mCAAS,IAAqB,GAAG,mBAAK;AACnD,UAAI,MAAM;AACR,eAAO;AAAA,MACT;AACA,aAAO,CAAC;AAAA,IACV;AAAA;AAAA,EACM,oBAAoB;AAAA;AACxB,YAAM,YAAY,MAAM,KAAK,aAAa;AAC1C,YAAM,UAAU,uCAAY;AAC5B,UAAI,CAAC,SAAS;AACZ,cAAM,IAAI,MAAM,GAAG,KAAK,SAAS,qBAAqB;AAAA,MACxD;AACA,aAAO;AAAA,IACT;AAAA;AAAA,EACM,cAAc;AAAA;AAClB,UAAI,CAAC,KAAK,QAAQ,GAAG;AACnB,cAAM,IAAI,MAAM,GAAG,KAAK,SAAS,sBAAsB;AAAA,MACzD;AACA,YAAM,YAAY,MAAM,KAAK,aAAa;AAC1C,aAAO,UAAU,IAAI,CAAC,SAAS,KAAK,OAAO;AAAA,IAC7C;AAAA;AAAA,EACM,eAAgC;AAAA;AACpC,YAAM,UAAU,MAAM,KAAK,kBAAkB;AAC7C,aAAO,QAAQ;AAAA,IACjB;AAAA;AAAA,EACM,YAAY,SAAkC;AAAA;AAClD,YAAM,UAAU,MAAM,KAAK,kBAAkB;AAC7C,YAAM,WAAW,KAAK,YAAY;AAClC,YAAM,EAAE,OAAO,IAAI,MAAM,SAAS,QAAQ,eAAe;AAAA,QACvD,SAAS,QAAQ;AAAA,QACjB,SAAS;AAAA,QACT,UAAU;AAAA,MACZ,CAAC;AACD,cAAQ,IAAI,qBAAqB,QAAQ,UAAU;AACnD,cAAQ,IAAI,kBAAkB,OAAO,SAAS;AAC9C,YAAM,cAAc,OAAO,KAAK,OAAO,WAAW,QAAQ;AAC1D,kBAAY,KAAK,MAAO,YAAY,KAAK,MAAM;AAC/C,YAAM,MAAM,YAAY,SAAS,QAAQ;AACzC,cAAQ,IAAI,uBAAuB,GAAG;AACtC,aAAO;AAAA,IACT;AAAA;AAAA,EACA,GAAG,OAAe,SAAmC;AACnD,WAAO,mBAAK,QAAO,GAAG,OAAO,OAAO;AAAA,EACtC;AAAA,EACA,eAAe,OAAe,SAAmC;AAC/D,WAAO,mBAAK,QAAO,eAAe,OAAO,OAAO;AAAA,EAClD;AAAA,EACA,cAAc;AACZ,UAAM,WAAW,OAAO;AACxB,QAAI,CAAC,UAAU;AACb,YAAM,IAAI,MAAM,GAAG,KAAK,SAAS,sBAAsB;AAAA,IACzD;AACA,WAAO;AAAA,EACT;AAAA,EACM,aAA6C;AAAA;AACjD,UAAI,CAAC,KAAK,QAAQ,GAAG;AACnB,cAAM,IAAI,MAAM,GAAG,KAAK,SAAS,sBAAsB;AAAA,MACzD;AACA,aAAO,mBAAK,cAAa,YAAY,YAAY;AAAA,IACnD;AAAA;AAAA,EACM,gBAA+B;AAAA;AACnC,YAAM,IAAI,MAAM,aAAa;AAAA,IAC/B;AAAA;AAAA,EACM,YAAY,WAAmB,UAAmC;AAAA;AACtE,YAAM,WAAW,KAAK,YAAY;AAClC,YAAM,EAAE,OAAO,IAAI,MAAM,SAAS,QAAQ,gBAAgB;AAAA,QACxD,YAAY,CAAC,EAAE,SAAS,WAAW,QAAQ,SAAS,CAAC;AAAA,MACvD,CAAC;AACD,cAAQ,IAAI,oDAA6C,MAAM;AAC/D,aAAO,OAAO;AAAA,IAChB;AAAA;AAAA,EACA,aAAmB;AACjB,uCAAS,OAAO,GAAG,mBAAK;AAAA,EAC1B;AACF;AAhIE;AACA;;;ACfF,IAAAC,iBAAyB;;;;;;AAWzB,IAAMC,WAAU,aAAa,0BAA0B;AAXvD,IAAAC,WAAAC;AAYO,IAAM,qBAAN,cAAiC,cAAc;AAAA,EAIpD,cAAc;AACZ,UAAM;AAJR,uBAAAD,WAAW;AACX,uBAAAC,SAAS,IAAI,eAAAC,QAAa;AAO1B,SAAS,WAA2B;AAAA,MAClC,IAAI;AAAA,MACJ,MAAM;AAAA,MACN;AAAA,MACA,aAAa;AAAA,IACf;AAMA,SAAQ,eAAe,CAAO,YAAmC;AAC/D,YAAM,EAAE,YAAY,eAAe,IAAI,MAAM,OAAO;AACpD,YAAM,YAAY,MAAM,IAAI,QAAmB,CAAC,SAAS,WAAW;AAClE,cAAM,oBAAuC;AAAA,UAC3C,SAAS;AAAA,YACP,UAAU,CAAC,eAAe,SAAS,eAAe,QAAQ;AAAA,YAC1D,SAAS;AAAA,YACT,SAAS;AAAA,cACP,MAAM;AAAA,YACR;AAAA,UACF;AAAA,UACA,UAAU,CAAC,aAAa;AACtB,oBAAQ,SAAS,SAAS;AAAA,UAC5B;AAAA,UACA,UAAU,MACR,OAAO;AAAA,YACL,MAAM;AAAA,YACN,SAAS;AAAA,UACX,CAAC;AAAA,QACL;AACA,mBAAW,iBAAiB,EAAE,MAAM,CAAC,UAAU,OAAO,KAAK,CAAC;AAAA,MAC9D,CAAC;AACD,MAAAH,YAAA,gBAAAA,SAAS,IAAI,GAAG,qBAAqB;AACrC,aAAO;AAAA,IACT;AAtCE,uBAAKE,SAAO,gBAAgB,GAAG;AAAA,EACjC;AAAA,EASA,UAAmB;AACjB,WAAO,OAAO,WAAW,eAAe,eAAe,UAAU,CAAC,CAAC,OAAO;AAAA,EAC5E;AAAA,EA4BM,kBAA6C;AAAA;AACjD,YAAM,IAAI,MAAM,aAAa;AAAA,IAC/B;AAAA;AAAA,EAEM,kBAAqC;AAAA;AACzC,UAAI,CAAC,KAAK,QAAQ,GAAG;AACnB,cAAM,IAAI,MAAM,GAAG,KAAK,SAAS,sBAAsB;AAAA,MACzD;AACA,YAAM,YAAY,MAAM,KAAK,aAAa,mBAAKD,UAAe;AAC9D,aAAO,UAAU,IAAI,CAAC,SAAS,KAAK,OAAO;AAAA,IAC7C;AAAA;AAAA,EAEM,cAAiC;AAAA;AACrC,UAAI,CAAC,KAAK,QAAQ,GAAG;AACnB,cAAM,IAAI,MAAM,GAAG,KAAK,SAAS,sBAAsB;AAAA,MACzD;AACA,YAAM,OAAOD,YAAA,gBAAAA,SAAS,IAAe,GAAG,mBAAKC;AAC7C,UAAI,MAAM;AACR,eAAO,KAAK,IAAI,CAAC,SAAS,KAAK,OAAO;AAAA,MACxC,OAAO;AACL,eAAO,CAAC;AAAA,MACV;AAAA,IACF;AAAA;AAAA,EAEM,eAAgC;AAAA;AACpC,UAAI,CAAC,KAAK,QAAQ,GAAG;AACnB,cAAM,IAAI,MAAM,GAAG,KAAK,SAAS,sBAAsB;AAAA,MACzD;AACA,YAAM,OAAOD,YAAA,gBAAAA,SAAS,IAAe,GAAG,mBAAKC;AAC7C,UAAI,MAAM;AACR,eAAO,KAAK,GAAG;AAAA,MACjB,OAAO;AACL,eAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA,EAEM,YAAY,SAAkC;AAAA;AAClD,UAAI,CAAC,KAAK,QAAQ,GAAG;AACnB,cAAM,IAAI,MAAM,GAAG,KAAK,SAAS,sBAAsB;AAAA,MACzD;AACA,YAAM,YAAY,MAAM,KAAK,YAAY;AACzC,UAAI,UAAU,WAAW,GAAG;AAC1B,cAAM,IAAI,MAAM,GAAG,KAAK,SAAS,qBAAqB;AAAA,MACxD;AACA,YAAM,EAAE,aAAAG,aAAY,IAAI,MAAM,OAAO;AAErC,YAAM,MAAM,MAAM,IAAI,QAAgB,CAAC,SAAS,WAAW;AACzD,cAAM,qBAAyC;AAAA,UAC7C,SAAS;AAAA,YACP,SAAS;AAAA,cACP,MAAM,mBAAKH;AAAA,YACb;AAAA,YACA,SAAS,UAAU;AAAA,YACnB,SAAS;AAAA,UACX;AAAA,UACA,UAAU,CAAC,aAAa;AACtB,oBAAQ,QAAQ;AAAA,UAClB;AAAA,UACA,UAAU,MAAM;AACd,mBAAO;AAAA,cACL,MAAM;AAAA,cACN,SAAS;AAAA,YACX,CAAC;AAAA,UACH;AAAA,QACF;AACA,QAAAG,aAAY,kBAAkB,EAAE,MAAM,CAAC,MAAM;AAC3C,iBAAO,CAAC;AAAA,QACV,CAAC;AAAA,MACH,CAAC;AAED,YAAM,cAAc,OAAO,KAAK,KAAK,QAAQ;AAC7C,kBAAY,KAAK,MAAO,YAAY,KAAK,MAAM;AAC/C,aAAO,YAAY,SAAS,QAAQ;AAAA,IACtC;AAAA;AAAA,EAEA,GAAG,OAAe,SAAmC;AACnD,WAAO,mBAAKF,SAAO,GAAG,OAAO,OAAO;AAAA,EACtC;AAAA,EAEA,eAAe,OAAe,SAAmC;AAC/D,WAAO,mBAAKA,SAAO,eAAe,OAAO,OAAO;AAAA,EAClD;AAAA,EAEA,cAAc;AACZ,QAAI,KAAK,QAAQ,GAAG;AAClB,UAAI,eAAe,QAAQ;AACzB,cAAM,YAAiB;AACvB,YAAI,UAAU,UAAU,WAAW,UAAU,UAAU,QAAQ;AAC7D,iBAAO,UAAU,UAAU;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AAAA,EAEM,aAA6C;AAAA;AACjD,UAAI,CAAC,KAAK,QAAQ,GAAG;AACnB,cAAM,IAAI,MAAM,GAAG,KAAK,SAAS,sBAAsB;AAAA,MACzD;AACA,aAAO,mBAAKD,eAAa,YAAY,YAAY;AAAA,IACnD;AAAA;AAAA,EAEM,gBAA+B;AAAA;AACnC,YAAM,IAAI,MAAM,aAAa;AAAA,IAC/B;AAAA;AAAA,EAEM,YAAY,WAAmB,UAAmC;AAAA;AACtE,YAAM,WAAW,KAAK,YAAY;AAClC,UAAI,CAAC,UAAU;AACb,cAAM,IAAI,MAAM,GAAG,KAAK,SAAS,sBAAsB;AAAA,MACzD;AACA,YAAM,EAAE,mBAAmB,IAAI,MAAM,OAAO;AAE5C,YAAM,YAAY,MAAM,KAAK,YAAY;AACzC,UAAI,UAAU,WAAW,GAAG;AAC1B,cAAM,IAAI,MAAM,GAAG,KAAK,SAAS,qBAAqB;AAAA,MACxD;AACA,YAAM,SAAS,MAAM,IAAI,QAAa,CAAC,SAAS,WAAW;AACzD,cAAM,iBAA4C;AAAA,UAChD,SAAS;AAAA,YACP,SAAS;AAAA,cACP,MAAM,mBAAKA;AAAA,YACb;AAAA,YACA,YAAY;AAAA,cACV;AAAA,gBACE,SAAS;AAAA,gBACT,YAAY,OAAO,QAAQ;AAAA,cAC7B;AAAA,YACF;AAAA,YACA,eAAe,UAAU;AAAA,UAC3B;AAAA,UACA,UAAU,CAAC,aAAa;AACtB,oBAAQ,QAAQ;AAAA,UAClB;AAAA,UACA,UAAU,MAAM;AACd,mBAAO;AAAA,cACL,MAAM;AAAA,cACN,SAAS;AAAA,YACX,CAAC;AAAA,UACH;AAAA,QACF;AACA,2BAAmB,cAAc,EAAE,MAAM,CAAC,MAAM,OAAO,CAAC,CAAC;AAAA,MAC3D,CAAC;AACD,cAAO,iCAAQ,SAAQ;AAAA,IACzB;AAAA;AAAA,EAEA,aAAmB;AACjB,IAAAD,YAAA,gBAAAA,SAAS,OAAO,GAAG,mBAAKC;AAAA,EAC1B;AACF;AAhMEA,YAAA;AACAC,UAAA;;;;;;ACVK,IAAM,mBAAN,cAA+B,kBAAkB;AAAA,EAOtD,cAAc;AACZ,UAAM,oBAAoB;AAP5B,SAAS,WAA2B;AAAA,MAClC,IAAI;AAAA,MACJ,MAAM;AAAA,MACN;AAAA,MACA,aAAa;AAAA,IACf;AAAA,EAGA;AACF;;;;;;ACVO,IAAM,gBAAN,cAA4B,kBAAkB;AAAA,EAQnD,cAAc;AACZ,UAAM,oBAAoB;AAR5B,SAAS,WAA2B;AAAA,MAClC,IAAI;AAAA,MACJ,MAAM;AAAA,MACN;AAAA,MACA,aAAa;AAAA,IACf;AAAA,EAIA;AACF;;;ACfA,gBAAmE;AACnE,IAAAG,iBAAuB;AACvB,oBAAqD;AACrD,IAAAC,iBAAqF;;;ACHrF,IAAAC,gBAAoC;;;ACE7B,IAAM,qBAAqB,MAAM;AACtC,QAAM,EAAE,iBAAiB,mBAAmB,IAAI,mBAAmB;AACnE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;;;ACNO,IAAM,cAAc,MAAM;AAC/B,QAAM,EAAE,SAAS,IAAI,mBAAmB;AACxC,SAAO,EAAE,SAAS;AACpB;;;ACLA,mBAA4B;AAGrB,IAAM,iBAAiB,MAAM;AAClC,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAAC;AAAA,IACA,YAAAC;AAAA,IACA;AAAA,IACA,aAAAC;AAAA,EACF,IAAI,mBAAmB;AAEvB,QAAM,sBAAkB;AAAA,IACtB,CAAO,SAAiB,eAAuB,YAAkC;AAC/E,UAAI,CAAC,WAAW;AACd,cAAM,IAAI,MAAM,uBAAuB;AAAA,MACzC;AACA,YAAM,SAAS,MAAM,UAAU,gBAAgB,SAAS,eAAe,OAAO;AAC9E,aAAO;AAAA,IACT;AAAA,IACA,CAAC,SAAS;AAAA,EACZ;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAAF;AAAA,IACA,YAAAC;AAAA,IACA;AAAA,IACA,aAAAC;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACnCO,IAAM,kBAAkB,MAAM;AACnC,QAAM,EAAE,kBAAkB,YAAY,sBAAsB,iBAAiB,IAC3E,mBAAmB;AACrB,SAAO,EAAE,kBAAkB,YAAY,sBAAsB,iBAAiB;AAChF;;;ACNA,IAAAC,gBAA4B;AAIrB,IAAM,eAAe,MAAM;AAChC,QAAM,EAAE,YAAY,eAAe,IAAI,mBAAmB;AAE1D,QAAM,cAAU;AAAA,IACd,CAAO,gBAAwB;AARnC;AASM,YAAM,YAAY,WAAW,KAAK,CAAC,SAAS,KAAK,SAAS,OAAO,WAAW;AAC5E,UAAI,CAAC,WAAW;AACd,cAAM,IAAI,MAAM,gBAAgB,uBAAuB;AAAA,MACzD;AACA,YAAM,WAAW,MAAM,UAAU,gBAAgB;AACjD,UAAI,SAAS,SAAS,GAAG;AACvB,2BAAa,MAAb,mBAAgB,IAAI,wBAAwB,UAAU,SAAS;AAC/D,uBAAe,UAAU,SAAS,EAAE;AAAA,MACtC;AAAA,IACF;AAAA,IACA,CAAC,YAAY,cAAc;AAAA,EAC7B;AAEA,SAAO,EAAE,YAAY,QAAQ;AAC/B;;;ACvBA,kBAAyB;AAOzB,IAAAC,gBAA0D;AAC1D,kBAA8D;;;ACLvD,IAAM,mBAAN,MAAoD;AAAA,EACzD,YACS,YACA,QACA,SACP;AAHO;AACA;AACA;AAAA,EACN;AAAA,EAEH,GAAG,OAAe,UAAqB;AAVzC;AAWI,eAAK,WAAL,mBAAa,GAAG,OAAO;AACvB,WAAO;AAAA,EACT;AAAA,EAEA,KAAK,OAAe,UAAqB;AAf3C;AAgBI,eAAK,WAAL,mBAAa,KAAK,OAAO;AACzB,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,OAAe,UAAqB;AApB1C;AAqBI,eAAK,WAAL,mBAAa,IAAI,OAAO;AACxB,WAAO;AAAA,EACT;AAAA,EAEA,eAAe,OAAe,UAAqB;AAzBrD;AA0BI,eAAK,WAAL,mBAAa,eAAe,OAAO;AACnC,WAAO;AAAA,EACT;AAAA,EAEM,QAAQ,KAA4C;AAAA;AA9B5D;AA+BI,YAAM,SAAS,IAAI;AACnB,UAAI,CAAC,QAAQ;AACX,cAAM,IAAI,MAAM,mBAAmB;AAAA,MACrC;AAEA,UAAI,WAAW,kBAAkB,WAAW,uBAAuB;AACjE,eAAO,KAAK,UAAU,CAAC,KAAK,OAAO,IAAI,CAAC;AAAA,MAC1C,WAAW,WAAW,uBAAuB;AAC3C,cAAM,UAAS,SAAI,WAAJ,mBAAa;AAC5B,cAAM,SAAS,MAAM,KAAK,WAAW,EAAE,IAAI,OAAO,CAAC;AACnD,eAAO;AAAA,MACT;AAEA,cAAO,UAAK,WAAL,mBAAa,QAAQ;AAAA,IAC9B;AAAA;AACF;;;AC9CA,IAAAC,iBAA6B;AAG7B,IAAM,SAAS,IAAI,4BAAa;AAChC,OAAO,gBAAgB,GAAG;AAEnB,IAAM,6BAA6B,MAAM;AAC9C,SACE,OAAO,uDAAwC,IAC/C,OAAO,2DAA0C,IACjD,OAAO,6DAA2C;AAEtD;AAEA,IAAO,qBAAQ;;;ACdf,IAAM,YAAY;AAAA,EAChB,aAAa,MAAM;AACjB,QAAI,OAAO,WAAW;AAAa,aAAO;AAC1C,UAAM,QAAQ,aAAa,QAAQ,yBAAyB;AAC5D,WAAO,UAAU;AAAA,EACnB;AAAA,EACA,cAAc,CAAC,cAAuB;AACpC,QAAI,OAAO,WAAW;AAAa;AACnC,QAAI,WAAW;AACb,mBAAa,QAAQ,2BAA2B,GAAG;AAAA,IACrD,OAAO;AACL,mBAAa,WAAW,yBAAyB;AAAA,IACnD;AAAA,EACF;AAAA,EACA,OAAO,MAAM;AACX,QAAI,OAAO,WAAW;AAAa;AACnC,iBAAa,WAAW,yBAAyB;AAAA,EACnD;AACF;AAEA,IAAO,yBAAQ;;;ACdR,IAAM,uBAAN,MAAwD;AAAA,EAC7D,YAAoB,UAA6B;AAA7B;AAAA,EAA8B;AAAA,EAElD,GAAG,OAAe,UAAqB;AACrC,SAAK,SAAS,GAAG,OAAO,QAAQ;AAChC,WAAO;AAAA,EACT;AAAA,EAEA,KAAK,OAAe,UAAqB;AACvC,SAAK,SAAS,KAAK,OAAO,QAAQ;AAClC,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,OAAe,UAAqB;AACtC,SAAK,SAAS,IAAI,OAAO,QAAQ;AACjC,WAAO;AAAA,EACT;AAAA,EAEA,eAAe,OAAe,UAAqB;AACjD,SAAK,SAAS,eAAe,OAAO,QAAQ;AAC5C,WAAO;AAAA,EACT;AAAA,EAEM,QAAQ,KAA4C;AAAA;AACxD,YAAM,SAAS,IAAI;AACnB,UAAI,CAAC,QAAQ;AACX,cAAM,IAAI,MAAM,mBAAmB;AAAA,MACrC;AAEA,UAAI,iDAAqC,OAAO,kDAAkC,GAAG;AACnF,cAAM,mBAAmB,CAAC,uBAAU,YAAY;AAChD,YAAI,kBAAkB;AACpB,cAAI,2BAA2B,IAAI,GAAG;AACpC,kBAAM,IAAI,MAAM,0DAA0D;AAAA,UAC5E;AAAA,QACF;AACA,YAAI,CAAC,kBAAkB;AACrB,iBAAO,KAAK,SAAS,QAAQ,GAAU;AAAA,QACzC;AAAA,MACF;AAEA,UAAI,+CAAmC;AACrC,gBAAQ,IAAI,uBAAuB,GAAG;AACtC,eAAO,IAAI,QAAgB,CAAC,SAAS,WAAW;AAC9C,6BAAO,wCAA6B,GAAG;AACvC,6BAAO,oDAAmC,CAAC,EAAE,QAAQ,MAAM,MAAM;AAC/D,gBAAI,QAAQ;AACV,sBAAQ,MAAM;AAAA,YAChB,OAAO;AACL,qBAAO,KAAK;AAAA,YACd;AAAA,UACF,CAAC;AAAA,QACH,CAAC;AAAA,MACH,WAAW,OAAO,kDAAkC,GAAG;AACrD,eAAO,IAAI,QAAgB,CAAC,SAAS,WAAW;AAC9C,6BAAO,0CAA8B,GAAG;AACxC,6BAAO,sDAAoC,CAAC,EAAE,QAAQ,MAAM,MAAM;AAChE,gBAAI,QAAQ;AACV,sBAAQ,MAAM;AAAA,YAChB,OAAO;AACL,qBAAO,KAAK;AAAA,YACd;AAAA,UACF,CAAC;AAAA,QACH,CAAC;AAAA,MACH;AAEA,aAAO,KAAK,SAAS,QAAQ,GAAU;AAAA,IACzC;AAAA;AACF;;;AJ1DO,IAAM,iBAAsB,MAAM;AACvC,QAAM,EAAE,YAAY,aAAa,IAAI,mBAAmB;AACxD,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAiB;AAE/C,+BAAU,MAAM;AACd,QAAI,cAAc;AAChB,YAAMC,WAAW,aAAa,SAAiB;AAC/C,iBAAWA,QAAO;AAElB,YAAM,iBAAiB,CAAC,OAAe;AACrC,mBAAW,OAAO,EAAE,CAAC;AAAA,MACvB;AACA,mBAAa,SAAS,GAAG,gBAAgB,cAAc;AACvD,aAAO,MAAM;AACX,qBAAa,SAAS,eAAe,gBAAgB,cAAc;AAAA,MACrE;AAAA,IACF;AAAA,EACF,GAAG,CAAC,YAAY,CAAC;AAEjB,QAAM,kBAAc;AAAA,IAClB,CAAOA,aAAoB;AACzB,UAAI,6CAAc,UAAU;AAC1B,cAAM,aAAa,SAAS,QAAQ;AAAA,UAClC,QAAQ;AAAA,UACR,QAAQ;AAAA,YACN;AAAA,cACE,aAAS,sBAASA,QAAO;AAAA,YAC3B;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IACA,CAAC,6CAAc,QAAQ;AAAA,EACzB;AAEA,QAAM,mBAAe;AAAA,IACnB,CAAO,OAAoC;AACzC,UAAI,CAAC,cAAc;AACjB,cAAM,IAAI,MAAM,uCAAuC;AAAA,MACzD;AACA,aAAO,aAAa,aAAa,EAAE;AAAA,IACrC;AAAA,IACA,CAAC,YAAY;AAAA,EACf;AAEA,QAAM,kBAAc;AAAA,IAClB,CAAO,OAA0D,iBAA1D,KAA0D,WAA1D,EAAE,IAAI,UAAU,sBAAsB,GAAoB;AAC/D,UAAI,CAAC,cAAc;AACjB,cAAM,IAAI,MAAM,uCAAuC;AAAA,MACzD;AACA,YAAM,SAAS,MAAM,aAAa,mBAAmB,EAAE,IAAI,UAAU,sBAAsB,CAAC;AAC5F,aAAO;AAAA,IACT;AAAA,IACA,CAAC,YAAY;AAAA,EACf;AAEA,QAAM,iBAAa;AAAA,IACjB,CAAO,QAA+B,0BAAoC;AACxE,UAAI,CAAC,cAAc;AACjB,cAAM,IAAI,MAAM,uCAAuC;AAAA,MACzD;AAEA,YAAM,mBAAmB,CAAC,yBAAyB,CAAC,uBAAU,YAAY;AAE1E,UAAI,kBAAkB;AACpB,YAAI,2BAA2B,IAAI,GAAG;AACpC,gBAAM,IAAI,MAAM,0DAA0D;AAAA,QAC5E;AAAA,MACF;AAEA,UAAI;AACJ,UACE,OAAO,UAAU,eAAe,KAAK,QAAQ,YAAY,KACzD,OAAO,UAAU,eAAe,KAAK,QAAQ,QAAQ,GACrD;AACA,cAAM,EAAE,YAAY,OAAO,IAAI;AAC/B,YAAI,cAAc,QAAQ;AACxB,yBAAe,EAAE,YAAY,OAAO;AAAA,QACtC;AAAA,MACF;AAEA,UAAI,CAAC,cAAc;AACjB,cAAM,EAAE,IAAI,UAAU,sBAAsB,IAAI;AAChD,uBAAe,MAAM,YAAY,EAAE,IAAI,UAAU,sBAAsB,CAAC;AAAA,MAC1E;AAEA,UAAI,CAAC,kBAAkB;AACrB,eAAO,aAAa,kBAAkB,YAAY;AAAA,MACpD;AAEA,aAAO,IAAI,QAAgB,CAAC,SAAS,WAAW;AAC9C,2BAAO,oCAA2B,YAAY;AAC9C,2BAAO,gDAAiC,CAAC,EAAE,QAAQ,MAAM,MAAM;AAC7D,cAAI,QAAQ;AACV,oBAAQ,MAAM;AAAA,UAChB,OAAO;AACL,mBAAO,KAAK;AAAA,UACd;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,IACA,CAAC,cAAc,WAAW;AAAA,EAC5B;AAEA,QAAM,mBAAe,uBAAQ,MAAM;AACjC,QAAI,CAAC,gBAAgB,CAAC,SAAS;AAC7B,aAAO;AAAA,IACT;AACA,YAAQ,6CAAc,UAAiB;AAAA,EACzC,GAAG,CAAC,cAAc,OAAO,CAAC;AAE1B,QAAM,eAAW,uBAAQ,MAAM;AAC7B,UAAM,mBAAmB,IAAI;AAAA,MAC3B;AAAA,MACA,6CAAc;AAAA,MACd;AAAA,IACF;AACA,WAAO;AAAA,EACT,GAAG,CAAC,YAAY,YAAY,6CAAc,QAAQ,CAAC;AAEnD,QAAM,mBAAe,uBAAQ,MAAM;AACjC,eAAO,gCAAmB;AAAA,MACxB,eAAW,oBAAO,IAAI,qBAAqB,QAAQ,CAAC;AAAA,IACtD,CAAC;AAAA,EACH,GAAG,CAAC,QAAQ,CAAC;AAEb,SAAO;AAAA,IACL;AAAA,IAEA;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;;;;;;;;;;AK1JA,IAAM,SAAS;AACf,IAAM,UAAU,EAAC,UAAS,mBAAkB,UAAS,mBAAkB,eAAc,uBAAsB;AAC3G,IAAM,MAAM;AAAA,CAEX,WAAW;AACV,MAAI,OAAO,aAAa,eAAe,CAAC,SAAS,eAAe,MAAM,GAAG;AACvE,QAAI,MAAM,SAAS,cAAc,OAAO;AACxC,QAAI,KAAK;AACT,QAAI,cAAc;AAClB,aAAS,KAAK,YAAY,GAAG;AAAA,EAC/B;AACF,GAAG;AAEH,IAAO,yBAAQ;;;ACVN;AADT,IAAM,UAAU,CAAC,EAAE,WAAW,MAAM,MAAiE;AACnG,SAAO,4CAAC,UAAK,WAAW,uBAAO,UAAU,YAAY,IAAI,cAAc,KAAK,OAAc;AAC5F;AAEA,IAAO,kBAAQ;;;ACNf,IAAMC,UAAS;AACf,IAAMC,WAAU,EAAC,OAAM,eAAc;AACrC,IAAMC,OAAM;AAAA,CAEX,WAAW;AACV,MAAI,OAAO,aAAa,eAAe,CAAC,SAAS,eAAeF,OAAM,GAAG;AACvE,QAAI,MAAM,SAAS,cAAc,OAAO;AACxC,QAAI,KAAKA;AACT,QAAI,cAAcE;AAClB,aAAS,KAAK,YAAY,GAAG;AAAA,EAC/B;AACF,GAAG;AAEH,IAAO,wBAAQD;;;ACMX,IAAAE,sBAAA;AAhBJ,IAAM,SAAS,CAAC;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAOM;AACJ,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,sBAAO,OAAO,YAAY,IAAI,cAAc;AAAA,MACvD,SAAS,aAAa,aAAa,SAAY;AAAA,MAC/C,UAAU;AAAA,MACV;AAAA,MAEC;AAAA,qBAAa,CAAC,cAAc,6CAAC,mBAAQ;AAAA,QACrC;AAAA;AAAA;AAAA,EACH;AAEJ;AAEA,IAAO,iBAAQ;;;AChCf,IAAAC,gBAAyG;AACzG,uBAA6B;AAC7B,iCAA6B;;;ACD7B,IAAMC,UAAS;AACf,IAAMC,WAAU,EAAC,aAAY,sBAAqB,SAAQ,kBAAiB;AAC3E,IAAMC,OAAM;AAAA,CAEX,WAAW;AACV,MAAI,OAAO,aAAa,eAAe,CAAC,SAAS,eAAeF,OAAM,GAAG;AACvE,QAAI,MAAM,SAAS,cAAc,OAAO;AACxC,QAAI,KAAKA;AACT,QAAI,cAAcE;AAClB,aAAS,KAAK,YAAY,GAAG;AAAA,EAC/B;AACF,GAAG;AAEH,IAAO,uBAAQD;;;ADqBX,IAAAE,sBAAA;AArBJ,IAAM,kBAA8C,CAAC,UAAU,MAAM,gBAAgB;AAErF,IAAM,QAAQ,CAAC,EAAE,MAAM,SAAS,UAAU,gBAAgB,MAAM,cAAc,iBAAiB,MAAiB;AAC9G,QAAM,0BAAsB,uBAAQ,MAAO,gBAAgB,UAAU,QAAY,CAAC,SAAS,aAAa,CAAC;AAEzG,+BAAU,MAAM;AACd,QAAI,eAAe;AACjB,YAAM,eAAe,CAAC,UAAyB,QAAQ,MAAM,QAAQ,YAAY,QAAQ;AAEzF,eAAS,iBAAiB,WAAW,YAAY;AAEjD,aAAO,MAAM,SAAS,oBAAoB,WAAW,YAAY;AAAA,IACnE;AAAA,EACF,GAAG,CAAC,MAAM,SAAS,aAAa,CAAC;AAEjC,QAAM,CAAC,gBAAgB,iBAAiB,QAAI,wBAAS,IAAI;AACzD,+BAAU,MAAM;AACd,sBAAkB,iBAAiB,OAAO,SAAS,IAAI,EAAE,aAAa,QAAQ;AAAA,EAChF,GAAG,CAAC,CAAC;AAEL,SACE,6EACG,qBACG;AAAA,IACE,6CAAC,2CAAa,SAAS,gBACrB,uDAAC,SAAI,WAAW,qBAAO,WAAW,SAAS,qBACzC;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,qBAAO,SAAS,mBAAmB,IAAI,qBAAqB;AAAA,QACvE,OAAO;AAAA,QACP,SAAS;AAAA,QAER;AAAA;AAAA,IACH,GACF,GACF;AAAA,IACA,SAAS;AAAA,EACX,IACA,MACN;AAEJ;AAEA,IAAO,gBAAQ;;;AEvDf,IAAMC,UAAS;AACf,IAAMC,WAAU,EAAC,gBAAe,yBAAwB,SAAQ,kBAAiB,YAAW,qBAAoB,WAAU,qBAAoB,cAAa,wBAAuB,cAAa,wBAAuB,cAAa,wBAAuB,cAAa,wBAAuB,2BAA0B,qCAAoC,kBAAiB,4BAA2B,aAAY,uBAAsB,kBAAiB,4BAA2B,cAAa,wBAAuB,iBAAgB,2BAA0B,eAAc,wBAAuB;AACzkB,IAAMC,OAAM;AAAA,CAEX,WAAW;AACV,MAAI,OAAO,aAAa,eAAe,CAAC,SAAS,eAAeF,OAAM,GAAG;AACvE,QAAI,MAAM,SAAS,cAAc,OAAO;AACxC,QAAI,KAAKA;AACT,QAAI,cAAcE;AAClB,aAAS,KAAK,YAAY,GAAG;AAAA,EAC/B;AACF,GAAG;AAEH,IAAO,yBAAQD;;;AjBgDT,IAAAE,sBAAA;AAnDN,IAAM,eAAe,CAAC,EAAE,MAAM,QAAQ,MAA8C;AAClF,QAAM,CAAC,aAAa,cAAc,QAAI,wBAAS,KAAK;AACpD,QAAM,CAAC,cAAc,eAAe,QAAI,wBAAS,KAAK;AACtD,QAAM,CAAC,aAAa,cAAc,QAAI,wBAAS,IAAI;AACnD,QAAM,CAAC,iBAAiB,kBAAkB,QAAI,wBAAwB;AACtE,QAAM,EAAE,kBAAkB,IAAI,mBAAmB;AACjD,QAAM,EAAE,SAAS,WAAW,IAAI,aAAa;AAE7C,+BAAU,MAAM;AACd,QAAI,CAAC,MAAM;AACT,qBAAe,KAAK;AACpB,sBAAgB,KAAK;AACrB,qBAAe,IAAI;AACnB,yBAAmB,MAAS;AAAA,IAC9B;AAAA,EACF,GAAG,CAAC,IAAI,CAAC;AAET,QAAM,YAAY,CAAO,cAA6B;AACpD,mBAAe,IAAI;AACnB,uBAAmB,SAAS;AAC5B,QAAI,UAAU,QAAQ,GAAG;AACvB,UAAI;AACF,cAAM,QAAQ,UAAU,SAAS,EAAE;AACnC,0BAAkB;AAAA,MACpB,SAAS,OAAP;AACA,gBAAQ,MAAM,mBAAmB,KAAK;AACtC,YAAI,MAAM,SAAS,MAAM;AACvB,0BAAgB,IAAI;AAAA,QACtB;AAAA,MACF;AAAA,IACF,OAAO;AACL,qBAAe,KAAK;AAAA,IACtB;AAAA,EACF;AAEA,QAAM,SAAS,MAAM;AACnB,mBAAe,KAAK;AACpB,oBAAgB,KAAK;AACrB,mBAAe,IAAI;AACnB,uBAAmB,MAAS;AAAA,EAC9B;AAEA,QAAM,UAAU,MAAM;AACpB,oBAAgB,KAAK;AACrB,QAAI,iBAAiB;AACnB,gBAAU,eAAe;AAAA,IAC3B;AAAA,EACF;AAEA,SACE,8CAAC,iBAAM,MAAY,SAAkB,eAAe,OAAO,kBAAkB,uBAAO,cAClF;AAAA,iDAAC,SAAI,WAAW,uBAAO,OAAQ,8DAAiB,SAAS,SAAQ,iBAAgB;AAAA,IACjF,6CAAC,SAAI,WAAW,uBAAO,UAAU,KAAK,eAAO,SAAS,SAAS;AAAA,IAC9D,eAAe,6CAAC,SAAI,WAAW,uBAAO,SAAS,KAAK,cAAM,SAAS,QAAQ;AAAA,IAE3E,CAAC,eACA,WAAW,IAAI,CAAC,cAAc;AAC5B,aACE,8CAAC,SAAI,WAAW,uBAAO,YAAwC,SAAS,MAAM,UAAU,SAAS,GAC/F;AAAA,qDAAC,SAAI,WAAW,uBAAO,YAAY,KAAK,UAAU,SAAS,MAAM;AAAA,QACjE,6CAAC,SAAI,WAAW,uBAAO,YAAa,oBAAU,SAAS,MAAK;AAAA,WAFtB,UAAU,SAAS,EAG3D;AAAA,IAEJ,CAAC;AAAA,IAEF,eAAe,mBACd,8CAAC,SAAI,WAAW,uBAAO,YACrB;AAAA,oDAAC,SAAI,WAAW,uBAAO,yBACrB;AAAA,qDAAC,SAAI,WAAW,uBAAO,gBAAgB,KAAK,gBAAgB,SAAS,MAAM;AAAA,QAC1E,gBACC,6CAAC,SAAI,WAAW,uBAAO,gBAAgB,SAAS,SAC9C,uDAAC,SAAI,WAAW,uBAAO,WAAW,KAAK,eAAW,GACpD;AAAA,SAEJ;AAAA,MAEC,cACC,8EACE;AAAA,qDAAC,SAAI,WAAW,uBAAO,YAAa,yBAAe,sBAAsB,yBAAwB;AAAA,QACjG,6CAAC,SAAI,WAAW,uBAAO,eACpB,yBACG,0DACA,kEACN;AAAA,SACF,IAEA,8EACE;AAAA,qDAAC,SAAI,WAAW,uBAAO,YAAY,mCAAqB;AAAA,QACxD;AAAA,UAAC;AAAA;AAAA,YACC,WAAW,uBAAO;AAAA,YAClB,SAAS,MAAM;AACb,qBAAO,KAAK,mDAAiB,SAAS,aAAa,QAAQ;AAAA,YAC7D;AAAA,YACD;AAAA;AAAA,QAED;AAAA,SACF;AAAA,OAEJ;AAAA,KAEJ;AAEJ;AAEA,IAAO,uBAAQ;;;AkBlHf,IAAAC,iBAAuB;AACvB,IAAAC,gBAA0D;AAC1D,IAAAC,eAAmD;;;;;;;;;;;;ACHnD,IAAAC,eAAwE;AAQjE,SAAS,kBAAkB,QAAwB;AACxD,UACG,OAAO,OAAO,YAAY,IACzB,OAAO,OAAO,oBAAoB,IAClC,OAAO,OAAO,kBAAkB,KAClC,OAAO,OAAO,YAAY;AAE9B;;;ACfA,IAAAC,gBAA6C;;;ACC7C,IAAMC,UAAS;AACf,IAAMC,WAAU,EAAC,YAAW,qBAAoB,UAAS,kBAAiB;AAC1E,IAAMC,OAAM;AAAA,CAEX,WAAW;AACV,MAAI,OAAO,aAAa,eAAe,CAAC,SAAS,eAAeF,OAAM,GAAG;AACvE,QAAI,MAAM,SAAS,cAAc,OAAO;AACxC,QAAI,KAAKA;AACT,QAAI,cAAcE;AAClB,aAAS,KAAK,YAAY,GAAG;AAAA,EAC/B;AACF,GAAG;AAEH,IAAO,0BAAQD;;;ADqBX,IAAAE,sBAAA;AAxBW,SAAR,SAA0B,EAAE,UAAU,OAAO,WAAW,MAAM,GAAkB;AACrF,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAAkB;AAE9C,QAAM,cAAc,MAAY;AAC9B,QAAI,QAAQ;AACV;AAAA,IACF;AAEA,QAAI;AACF,UAAI,OAAO;AACT,cAAM,gBAAgB,KAAK;AAAA,MAC7B,WAAW,OAAO,aAAa,YAAY,OAAO,aAAa,YAAY,OAAO,aAAa,WAAW;AACxG,cAAM,gBAAgB,SAAS,SAAS,CAAC;AAAA,MAC3C,OAAO;AACL,cAAM,IAAI,MAAM,uBAAuB;AAAA,MACzC;AACA,gBAAU,IAAI;AACd,iBAAW,MAAM,UAAU,KAAK,GAAG,GAAI;AAAA,IACzC,SAAS,OAAP;AAAA,IAEF;AAAA,EACF;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,wBAAO,YAAY,YAAY,IAAI,cAAc,OAAO,SAAS,IAAI,wBAAO,WAAW;AAAA,MAClG,SAAS;AAAA,MACT;AAAA,MAEC,mBAAS,WAAW;AAAA;AAAA,EACvB;AAEJ;;;AE3CA,oBAAuB;AACvB,IAAAC,gBAAqC;AACrC,IAAAC,eAA4B;;;;;;;;;ACD5B,IAAMC,UAAS;AACf,IAAMC,WAAU,EAAC,gBAAe,yBAAwB,cAAa,sBAAqB;AAC1F,IAAMC,OAAM;AAAA,CAEX,WAAW;AACV,MAAI,OAAO,aAAa,eAAe,CAAC,SAAS,eAAeF,OAAM,GAAG;AACvE,QAAI,MAAM,SAAS,cAAc,OAAO;AACxC,QAAI,KAAKA;AACT,QAAI,cAAcE;AAClB,aAAS,KAAK,YAAY,GAAG;AAAA,EAC/B;AACF,GAAG;AAEH,IAAO,yBAAQD;;;ACTX,IAAAE,sBAAA;AAFJ,IAAM,UAAU,CAAC,EAAE,UAAU,SAAS,UAAU,MAAoE;AAClH,SACE,8CAAC,SAAI,WAAW,uBAAO,cACpB;AAAA;AAAA,IACD,6CAAC,SAAI,WAAW,uBAAO,cAAc,YAAY,IAAI,cAAc,KAAM,mBAAQ;AAAA,KACnF;AAEJ;AAEA,IAAO,kBAAQ;;;ACXf,IAAMC,UAAS;AACf,IAAMC,WAAU,EAAC,eAAc,wBAAuB,SAAQ,mBAAkB,eAAc,yBAAwB,OAAM,iBAAgB,aAAY,uBAAsB,WAAU,qBAAoB,iBAAgB,2BAA0B,eAAc,yBAAwB,cAAa,wBAAuB,SAAQ,kBAAiB;AACzV,IAAMC,OAAM;AAAA,CAEX,WAAW;AACV,MAAI,OAAO,aAAa,eAAe,CAAC,SAAS,eAAeF,OAAM,GAAG;AACvE,QAAI,MAAM,SAAS,cAAc,OAAO;AACxC,QAAI,KAAKA;AACT,QAAI,cAAcE;AAClB,aAAS,KAAK,YAAY,GAAG;AAAA,EAC/B;AACF,GAAG;AAEH,IAAO,oCAAQD;;;AHsHT,IAAAE,sBAAA;AApHN,IAAM,qBAAqB,CAAC,EAAE,QAAQ,MAAoD;AACxF,QAAM,EAAE,QAAQ,IAAI,eAAe;AAEnC,QAAM,gBAAY,uBAAQ,MAAM;AAC9B,QAAI,SAAS;AACX,aAAO,qBAAO,oBAAoB,OAAO;AAAA,IAC3C;AAAA,EACF,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,mBAAe,uBAAQ,MAAM;AAzBrC;AA0BI,YAAQ,QAAQ,MAAM;AAAA,MACpB;AACE,eAAO,QAAQ,uCAAW,eAAe;AAAA,MAC3C;AACE,eAAO,SAAQ,aAAQ,iBAAiB,OAAO,OAAhC,mBAAoC;AAAA,MACrD;AACE,eAAO;AAAA,MACT;AACE,eAAO;AAAA,MACT;AACE,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IACX;AAAA,EACF,GAAG,CAAC,SAAS,SAAS,CAAC;AAEvB,QAAM,sBAAkB,uBAAQ,MAAM;AACpC,QAAI,QAAQ,iDAA8C;AACxD,aAAO;AAAA,IACT,WAAW,QAAQ,mDAA+C;AAChE,aAAO;AAAA,IACT;AAAA,EACF,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,iBAAa,uBAAQ,MAAM;AAC/B,QAAI,WAAW;AACb,UAAI,UAAU,eAAe,WAAW,OAAO;AAC7C,eAAO;AAAA,MACT,OAAO;AACL,eAAO,UAAU,cAAc,UAAU;AAAA,MAC3C;AAAA,IACF;AACA,WAAO;AAAA,EACT,GAAG,CAAC,SAAS,CAAC;AAGd,QAAM,SAAK,uBAAQ,MAAM;AA9D3B;AA+DI,UAAM,UAAS,mBAAQ,SAAR,mBAAc,aAAd,mBAAwB;AACvC,QAAI,QAAQ,+CAA6C;AACvD,aAAO,SAAU,OAAO,OAAO,WAAW,IAAI,IAAI,GAAG,QAAmB;AAAA,IAC1E,WAAW,QAAQ,6CAA4C;AAC7D,aAAO,SAAU,OAAO,GAAG,QAAmB;AAAA,IAChD,WAAW,QAAQ,iDAA8C;AAC/D,aAAO,QAAQ,KAAK;AAAA,IACtB,WACE,QAAQ,kDACR,QAAQ,kDACR;AACA,aAAO,SAAU,OAAO,GAAG,QAAmB;AAAA,IAChD,OAAO;AACL,aAAO,QAAQ,KAAK;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,6BAAyB,2BAAY,CAAC,UAA2B;AACrE,QAAI,OAAO,KAAK,IAAI,GAAG;AACrB,aAAO;AAAA,IACT,WAAW,OAAO,KAAK,IAAI,GAAG;AAC5B,aAAO;AAAA,IACT,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,sBAAkB,uBAAQ,MAAM;AACpC,QAAI,QAAQ,oDAAiD,QAAQ,KAAK,UAAU;AAClF,YAAM,SAAS,QAAQ,KAAK,SAAS,OAAO,IAAI,CAAC,SAAS,KAAK,IAAI;AACnE,aAAO,GAAG,QAAQ,KAAK,SAAS,QAAQ,OAAO,KAAK,IAAI;AAAA,IAC1D;AAAA,EACF,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,yBAAqB,uBAAQ,MAAM;AAjG3C;AAkGI,QAAI,QAAQ,8CAA6C;AACvD,YAAM,UAAS,+BAAQ,SAAR,mBAAc,aAAd,mBAAwB,WAAxB,mBAAiC,OAAjC,mBAAqC;AACpD,aAAO,OAAO,UAAU,CAAC;AAAA,IAC3B;AACA,WAAO,OAAO,CAAC;AAAA,EACjB,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,wBAAoB;AAAA,IACxB,CAAC,cAA8B;AAC7B,YAAM,aAAS;AAAA,QACb,QAAQ,+CAA8C,qBAAqB,OAAO,UAAU,YAAY;AAAA,QACxG,UAAU;AAAA,MACZ;AAEA,UAAI,QAAQ,gDAA+C,OAAO,UAAU,YAAY,IAAI,OAAO,CAAC,GAAG;AACrG,eAAO,IAAI;AAAA,MACb;AAEA,aAAO;AAAA,IACT;AAAA,IACA,CAAC,oBAAoB,OAAO;AAAA,EAC9B;AAEA,QAAM,yBAAqB,uBAAQ,MAAM;AACvC,WACE,QAAQ,kDACR,QAAQ,gDACR,QAAQ,mDACR,QAAQ;AAAA,EAEZ,GAAG,CAAC,OAAO,CAAC;AAEZ,SACE,8CAAC,SAAI,WAAW,kCAAO,aACrB;AAAA,iDAAC,SAAI,WAAW,kCAAO,OAAQ,wBAAa;AAAA,IAC3C,mBAAmB,6CAAC,SAAI,WAAW,kCAAO,aAAc,2BAAgB;AAAA,IAExE,QAAQ,iBAAiB,QAAQ,IAAI,CAAC,eAAe;AACpD,aACE,8CAAC,SAA6B,WAAW,kCAAO,KAC9C;AAAA,qDAAC,SAAI,WAAW,kCAAO,WAAW,KAAK,YAAY;AAAA,QACnD,8CAAC,SAAI,WAAW,kCAAO,eAAe,OAAO,EAAE,OAAO,uBAAuB,WAAW,YAAY,EAAE,GACnG;AAAA,iBAAO,WAAW,YAAY,IAAI,IAAI,MAAM;AAAA,cAC5C,0BAAY,OAAO,WAAW,YAAY,IAAG,uCAAW,eAAe,aAAY,EAAE;AAAA,WACxF;AAAA,QACA,6CAAC,SAAI,WAAW,kCAAO,aAAc,iDAAW,eAAe,QAAO;AAAA,WAN9D,WAAW,OAOrB;AAAA,IAEJ,CAAC;AAAA,IAEA,QAAQ,iBAAiB,OAAO,IAAI,CAAC,cAAc;AAClD,aACE,8CAAC,SAA4B,WAAW,kCAAO,KAC7C;AAAA,qDAAC,SAAI,WAAW,kCAAO,WAAW,KAAK,UAAU,SAAS,kBAAkB;AAAA,QAC5E,8CAAC,SAAI,WAAW,kCAAO,eACrB;AAAA,uDAAC,UAAK,OAAO,EAAE,OAAO,uBAAuB,UAAU,YAAY,EAAE,GAClE,4BAAkB,SAAS,GAC9B;AAAA,UACC,IAAI,UAAU;AAAA,WACjB;AAAA,WAPQ,UAAU,OAQpB;AAAA,IAEJ,CAAC;AAAA,IAEA,QAAQ,iBAAiB,KAAK,IAAI,CAAC,YAAY;AAC9C,aACE,8CAAC,SAA0B,WAAW,kCAAO,KAC3C;AAAA,sDAAC,SAAI,OAAO,EAAE,UAAU,GAAG,GACzB;AAAA,uDAAC,SAAI,WAAW,kCAAO,SAAS,KAAK,UAAU,QAAQ,SAAS,gBAAgB,GAAG;AAAA,UAClF,QAAQ,QAAQ,OAAO,QAAQ;AAAA,WAClC;AAAA,QACA,6CAAC,SAAI,WAAW,kCAAO,eAAe,OAAO,EAAE,OAAO,uBAAuB,QAAQ,YAAY,EAAE,GAChG,kBAAQ,cACX;AAAA,WAPQ,QAAQ,OAQlB;AAAA,IAEJ,CAAC;AAAA,IAEA,MACC,8CAAC,SAAI,WAAW,kCAAO,KACrB;AAAA,mDAAC,SAAI,gBAAE;AAAA,MACP,8CAAC,SAAI,WAAW,kCAAO,YACpB;AAAA,gBAAQ,cAAc,QAAQ,CAAC,sBAC9B,6CAAC,mBAAQ,SAAS,QAAQ,aAAa,sBAAsB,uBAC3D,uDAAC,SAAI,KAAK,QAAQ,aAAa,mBAAW,oBAAY,GACxD;AAAA,QAEF,6CAAC,YAAS,OAAO,IAAK,sBAAY,EAAE,GAAE;AAAA,SACxC;AAAA,OACF;AAAA,IAGD,sBACC,8CAAC,SAAI,WAAW,kCAAO,KACrB;AAAA,mDAAC,SAAI,sBAAQ;AAAA,MACb,8CAAC,SAAI,WAAW,kCAAO,YACpB;AAAA,gBAAQ,cAAc,QACrB,6CAAC,mBAAQ,SAAS,QAAQ,aAAa,sBAAsB,uBAC3D,uDAAC,SAAI,KAAK,QAAQ,aAAa,mBAAW,oBAAY,GACxD;AAAA,QAEF,6CAAC,YAAS,OAAO,QAAQ,KAAK,IAAK,sBAAY,QAAQ,KAAK,EAAE,GAAE;AAAA,SAClE;AAAA,OACF;AAAA,IAGF,8CAAC,SAAI,WAAW,kCAAO,KACrB;AAAA,mDAAC,SAAI,sBAAQ;AAAA,MACb,6CAAC,YAAS,OAAO,QAAQ,KAAK,MAAO,sBAAY,QAAQ,KAAK,IAAI,GAAE;AAAA,OACtE;AAAA,IAEC,mBACC,8CAAC,SAAI,WAAW,kCAAO,KACrB;AAAA,mDAAC,SAAI,sBAAQ;AAAA,MACb,6CAAC,SAAI,WAAW,kCAAO,OAAQ,2BAAgB;AAAA,OACjD;AAAA,KAEJ;AAEJ;AAEA,IAAO,6BAAQ;;;AI1Nf,IAAMC,UAAS;AACf,IAAMC,WAAU,EAAC,gBAAe,yBAAwB,YAAW,qBAAoB,aAAY,uBAAsB,aAAY,uBAAsB,oBAAmB,8BAA6B,eAAc,yBAAwB,kBAAiB,4BAA2B,QAAO,kBAAiB,mBAAkB,6BAA4B,gBAAe,0BAAyB,WAAU,qBAAoB,aAAY,sBAAqB;AAC1c,IAAMC,OAAM;AAAA,CAEX,WAAW;AACV,MAAI,OAAO,aAAa,eAAe,CAAC,SAAS,eAAeF,OAAM,GAAG;AACvE,QAAI,MAAM,SAAS,cAAc,OAAO;AACxC,QAAI,KAAKA;AACT,QAAI,cAAcE;AAClB,aAAS,KAAK,YAAY,GAAG;AAAA,EAC/B;AACF,GAAG;AAEH,IAAO,sBAAQD;;;ARwQT,IAAAE,sBAAA;AA9PN,IAAM,YAAY,CAAC;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AACF,MAIM;AACJ,QAAM,CAAC,cAAc,eAAe,QAAI,wBAAuB;AAC/D,QAAM,CAAC,kBAAkB,mBAAmB,QAAI,wBAAkB,KAAK;AACvE,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAkB,KAAK;AACrD,QAAM,CAAC,oBAAoB,qBAAqB,QAAI,wBAAkB,KAAK;AAC3E,QAAM,CAAC,mBAAmB,oBAAoB,QAAI,wBAEhD;AACF,QAAM,CAAC,UAAU,WAAW,QAAI,wBAAkB,KAAK;AACvD,QAAM,CAAC,eAAe,gBAAgB,QAAI,wBAAkB,IAAI;AAChE,QAAM,CAAC,eAAe,gBAAgB,QAAI,wBAAiB;AAC3D,QAAM,EAAE,gBAAgB,IAAI,mBAAmB;AAG/C,QAAM,CAAC,kBAAkB,mBAAmB,QAAI,wBAA2B;AAE3E,QAAM,EAAE,SAAS,cAAc,YAAY,SAAS,IAAI,eAAe;AACvE,QAAM,EAAE,aAAa,IAAI,mBAAmB;AAE5C,+BAAU,MAAM;AACd,QAAI,CAAC,MAAM;AACT,2BAAqB,MAAS;AAC9B,sBAAgB,MAAS;AACzB,0BAAoB,MAAS;AAC7B,iBAAW,KAAK;AAChB,kBAAY,KAAK;AACjB,4BAAsB,KAAK;AAC3B,uBAAiB,MAAS;AAAA,IAC5B;AAAA,EACF,GAAG,CAAC,IAAI,CAAC;AAET,+BAAU,MAAM;AACd,QAAI,MAAM;AACR,YAAM,YAAY,uBAAU,YAAY;AACxC,uBAAiB,CAAC,SAAS;AAC3B,UAAI,CAAC,WAAW;AACd,4BAAoB,KAAK;AAAA,MAC3B;AAAA,IACF;AAAA,EACF,GAAG,CAAC,IAAI,CAAC;AAET,QAAM,gBAAY,uBAAQ,MAAM;AAC9B,QAAI,SAAS;AACX,aAAO,sBAAO,oBAAoB,OAAO;AAAA,IAC3C;AAAA,EACF,GAAG,CAAC,OAAO,CAAC;AAEZ,+BAAU,MAAM;AACd,UAAM,eAAe,CAAC,aAA2B;AAC/C,sBAAgB,QAAQ;AACxB,aAAO;AAAA,IACT;AACA,UAAM,iBAAiB,CAAC,QAA0B;AAChD,0BAAoB,GAAG;AACvB,aAAO;AAAA,IACT;AACA,UAAM,kBAAkB,CAAC,QAA0B;AACjD,0BAAoB,GAAG;AACvB,aAAO;AAAA,IACT;AACA,uBAAO,kCAAyB,YAAY;AAC5C,uBAAO,sCAA2B,cAAc;AAChD,uBAAO,wCAA4B,eAAe;AAClD,WAAO,MAAM;AACX,yBAAO,mCAA0B,YAAY;AAC7C,yBAAO,uCAA4B,cAAc;AACjD,yBAAO,yCAA6B,eAAe;AAAA,IACrD;AAAA,EACF,GAAG,CAAC,QAAQ,eAAe,CAAC;AAE5B,QAAM,wBAAoB,2BAAY,MAAY;AAChD,QAAI,gBAAgB,cAAc;AAChC,YAAM,YAAY,MAAM,aAAa,SAAS,QAAQ,EAAE,QAAQ,eAAe,CAAC;AAChF,YAAM,QAAQ,UAAU;AACxB,YAAM,SAAS,MAAM,aAAa,QAAQ;AAAA,QACxC,QAAQ;AAAA,QACR,QAAQ;AAAA,UACN;AAAA,YACE,MAAM,gBAAgB;AAAA,YACtB,SAAS,gBAAgB;AAAA,YACzB,cAAc;AAAA,UAChB;AAAA,UACA,aAAa;AAAA,QACf;AAAA,MACF,CAAC;AACD,aAAO;AAAA,IACT;AAAA,EACF,IAAG,CAAC,cAAc,cAAc,eAAe,CAAC;AAEhD,+BAAU,MAAM;AACd,QAAI,gBAAgB,MAAM;AACxB,cAAQ,IAAI,yBAAyB;AACrC,4BAAsB,IAAI;AAC1B,wBAAkB,EACf,KAAK,CAAC,WAAW;AAChB,gBAAQ,IAAI,2CAAoC,MAAM;AACtD,6BAAqB,MAAa;AAAA,MACpC,CAAC,EACA,MAAM,CAAC,UAAU;AAChB,gBAAQ,IAAI,0CAAmC,KAAK;AACpD,2BAAO,gDAAiC;AAAA,UACtC;AAAA,QACF,CAAC;AACD,gBAAQ;AAAA,MACV,CAAC;AAAA,IACL;AAAA,EACF,GAAG,CAAC,mBAAmB,cAAc,MAAM,OAAO,CAAC;AAEnD,+BAAU,MAAM;AACd,QAAI,QAAQ,gBAAgB,cAAc,cAAc;AACtD,mBACG,WAAW,EAAE,SAAS,WAAkB,CAAC,EACzC,KAAK,CAAC,WAAgB,iBAAiB,MAAM,CAAC,EAC9C,MAAM,CAAC,UAAe;AACrB,gBAAQ,IAAI,mCAA4B,KAAK;AAC7C,2BAAO,gDAAiC;AAAA,UACtC;AAAA,QACF,CAAC;AACD,gBAAQ;AAAA,MACV,CAAC;AAAA,IACL;AAAA,EACF,GAAG,CAAC,MAAM,cAAc,YAAY,cAAc,OAAO,CAAC;AAE1D,+BAAU,MAAM;AACd,QAAI,iBAAiB,QAAQ,qBAAqB,MAAM;AACtD,4BAAsB,KAAK;AAAA,IAC7B;AAAA,EACF,GAAG,CAAC,eAAe,iBAAiB,CAAC;AAErC,QAAM,kBAAkB,MAAM;AAC5B,wBAAoB,CAAC,gBAAgB;AACrC,2BAAU,aAAa,CAAC,gBAAgB;AAAA,EAC1C;AAEA,QAAM,aAAS,uBAAQ,MAAM;AAC3B,QAAI,6CAAc,QAAQ;AACxB,aAAO,kBAAkB,6CAAc,MAAM;AAAA,IAC/C;AACA,WAAO,OAAO,CAAC;AAAA,EACjB,GAAG,CAAC,YAAY,CAAC;AAEjB,QAAM,aAAa,MAAM;AA7K3B;AA8KI,QAAI;AACJ,QAAI,cAAc;AAChB;AAAA,IACF,YAAW,qDAAkB,gDAAmC;AAC9D;AAAA,IACF,YAAW,0DAAkB,WAAlB,mBAA0B,qDAAqC;AACxE;AAAA,IACF;AAEA,QAAI,OAAO;AACT,yBAAO,KAAK,OAAO;AAAA,QACjB,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,QACX;AAAA,MACF,CAAC;AAAA,IACH;AAEA,YAAQ;AAAA,EACV;AAEA,QAAM,gBAAY,2BAAY,MAAY;AACxC,QAAI,gBAAgB,UAAU;AAC5B,iBAAW,IAAI;AACf,UAAI,cAAc;AAChB,YAAI;AACF,gBAAM,OAAO,MAAM,aAAa,kBAAkB,YAAY;AAC9D,6BAAO,gDAAiC,EAAE,QAAQ,KAAK,CAAC;AAAA,QAC1D,SAAS,OAAP;AACA,6BAAO,gDAAiC;AAAA,YACtC;AAAA,UACF,CAAC;AAAA,QACH,UAAE;AACA,qBAAW,KAAK;AAAA,QAClB;AAAA,MACF,WAAW,kBAAkB;AAC3B,YAAI;AACF,gBAAM,OAAO,MAAM,SAAS,QAAQ,gBAAgB;AACpD,6BAAO;AAAA,YACL,iBAAiB;AAAA,YAGjB,EAAE,QAAQ,KAAK;AAAA,UACjB;AAAA,QACF,SAAS,OAAP;AACA,6BAAO;AAAA,YACL,iBAAiB;AAAA,YAGjB;AAAA,cACE;AAAA,YACF;AAAA,UACF;AAAA,QACF,UAAE;AACA,qBAAW,KAAK;AAAA,QAClB;AAAA,MACF;AAEA,cAAQ;AAAA,IACV;AAAA,EACF,IAAG,CAAC,cAAc,UAAU,kBAAkB,cAAc,OAAO,CAAC;AAEpE,+BAAU,MAAM;AACd,QAAI,gBAAgB,iBAAiB,QAAQ,mBAAmB;AAC9D,YAAM,eAAe,kBAClB;AAAA,QACC,CAAC,SAAM;AAhPjB;AAiPY,mCAAK,iBAAiB,YAAtB,mBAAgC,OAAhC,mBAAoC,iBACpC,KAAK,iBAAiB,QAAQ,GAAG,aAAa,WAAW,GAAG;AAAA;AAAA,MAChE,EACC;AAAA,QAAI,CAAC,SAAM;AApPpB;AAqPU,0BAAO,4BAAK,qBAAL,mBAAuB,YAAvB,mBAAiC,OAAjC,mBAAqC,iBAArC,mBAAmD,QAAQ,KAAK,QAAO,CAAC;AAAA;AAAA,MACjF,EACC,OAAO,CAAC,aAAa,iBAAiB,cAAc,cAAc,OAAO,CAAC,CAAC;AAC9E,UAAI,aAAa,OAAO,iBAAiB,SAAS,GAAG;AACnD,oBAAY,gBAAgB,YAAY;AAAA,MAC1C,OAAO;AACL,oBAAY,gBAAgB,SAAS,YAAY;AAAA,MACnD;AAAA,IACF;AAAA,EACF,GAAG,CAAC,cAAc,QAAQ,eAAe,iBAAiB,CAAC;AAE3D,QAAM,sBAAkB,uBAAQ,MAAM;AAhQxC;AAiQI,QAAI,CAAC,kBAAkB;AACrB,aAAO;AAAA,IACT;AAEA,QAAI,iBAAiB,+CAAmC;AACtD,YAAM,YAAU,sBAAiB,WAAjB,mBAA0B,OAAM;AAChD,iBAAO,0BAAY,OAAO;AAAA,IAC5B,OAAO;AACL,YAAM,aAAY,sBAAiB,WAAjB,mBAA0B;AAC5C,YAAM,MAAM,OAAO,cAAc,WAAW,KAAK,MAAM,SAAS,IAAI;AACpE,aAAO,KAAK,UAAU,KAAK,MAAM,CAAC;AAAA,IACpC;AAAA,EACF,GAAG,CAAC,gBAAgB,CAAC;AAErB,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,eAAe;AAAA,MACf,kBAAkB,oBAAO;AAAA,MAEzB,wFACE;AAAA,qDAAC,SAAI,WAAW,oBAAO,UAAU,KAAK,eAAO,SAAS,YAAY;AAAA,QAEjE,oBACC,6CAAC,SAAI,WAAW,oBAAO,WACpB,2BAAiB,+CAAmC,iBAAiB,mBACxE;AAAA,QAGF,8CAAC,SAAI,WAAW,oBAAO,WACrB;AAAA,uDAAC,SAAI,KAAK,uCAAW,MAAM;AAAA,UAC1B,uCAAW,SAAS,QAAQ,WAAW;AAAA,WAC1C;AAAA,QAEA,6CAAC,SAAI,WAAW,oBAAO,kBACrB,uDAAC,YAAS,OAAO,YAAY,OAAO,EAAE,oBAAoB,OAAO,GAC/D,wDAAC,SAAI,WAAW,oBAAO,aACpB;AAAA,sBAAY,UAAU;AAAA,UACvB,6CAAC,SAAI,KAAK,cAAM;AAAA,WAClB,GACF,GACF;AAAA,QAEA;AAAA,UAAC;AAAA;AAAA,YACC,WACE,oBAAO,kBAAkB,qBAAqB,mBAAmB,IAAI,oBAAO,SAAS;AAAA,YAGtF;AAAA,mCACC,kBAAkB,IAAI,CAAC,SAAS,UAC9B,6CAAC,8BAAoD,WAA5B,GAAG,QAAQ,QAAQ,OAA2B,CACxE;AAAA,cAEF,mBAAmB,6CAAC,SAAI,WAAW,oBAAO,iBAAkB,2BAAgB;AAAA;AAAA;AAAA,QAC/E;AAAA,QAEC,UACC,6CAAC,SAAI,WAAW,oBAAO,cAAe,oCAAsB,0BAAY,MAAM,KAC5E,uCAAW,eAAe,UACzB;AAAA,QAGL;AAAA,UAAC;AAAA;AAAA,YACC,SAAS;AAAA,YACT,WAAW,oBAAO;AAAA,YAClB,WAAW,WAAW;AAAA,YACtB,YAAY;AAAA,YAEX,+BAAqB,YAAY,WAAW,qBAAqB;AAAA;AAAA,QACpE;AAAA,QAEC,iBACC,8CAAC,SAAI,WAAW,oBAAO,WAAW,SAAS,iBACzC;AAAA,uDAAC,SAAI,KAAK,mBAAmB,oBAAW,yBAAe;AAAA,UAAM;AAAA,WAE/D;AAAA,SAEJ;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,oBAAQ;;;ASnVf,IAAAC,iBAAuB;AACvB,IAAAC,iBAA6B;AAC7B,IAAAC,eAA4F;AAErF,IAAM,mBAAN,MAAuB;AAAA,EAI5B,YACS,iBACA,WACA,WACA,SACP;AAJO;AACA;AACA;AACA;AANT,mBAAU;AA2CV,wBAAe,CAAO,YAAqC;AACzD,YAAM,IAAI,MAAM,uBAAuB;AAAA,IACzC;AAEA,wBAAe,MAA6B;AAC1C,YAAM,IAAI,MAAM,uBAAuB;AAAA,IACzC;AA0BA,2BAAkB,MAAM;AAlF1B;AAmFI,YAAM,WACJ,kCAAM,YAAN,mBAAgB,KAAK,eAAY,2BAAO,oBAAoB,KAAK,WAAW,CAAC,MAA5C,mBAA+C;AAClF,cAAQ,IAAI,UAAU,MAAM;AAE5B,iBAAO,iCAAmB;AAAA,QACxB,eAAW,mBAAK,MAAM;AAAA,MACxB,CAAC;AAAA,IACH;AA3EE,SAAK,SAAS,IAAI,4BAAa;AAC/B,SAAK,OAAO,gBAAgB,GAAG;AAE/B,QAAI,OAAO,WAAW,aAAa;AACjC,YAAM,eAAe,aAAa,QAAQ,sBAAsB;AAChE,UAAI,gBAAgB,gBAAgB,SAAS,OAAO,YAAY,CAAC,GAAG;AAClE,aAAK,UAAU,OAAO,YAAY;AAAA,MACpC,OAAO;AACL,cAAM,UAAU,gBAAgB;AAChC,YAAI,SAAS;AACX,uBAAa,QAAQ,wBAAwB,QAAQ,SAAS,CAAC;AAC/D,eAAK,UAAU;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAEA,SAAK,eAAe,KAAK,gBAAgB;AAAA,EAC3C;AAAA,EAEM,QAAQ,KAAuB;AAAA;AACnC,UACE,IAAI,WAAW,yBACf,IAAI,WAAW,6BACf,IAAI,WAAW,uBACf,IAAI,WAAW,YACf;AACA,cAAM,IAAI;AAAA,UACR,IAAI,MAAM,qDAAqD;AAAA,QACjE;AAAA,MACF;AAEA,YAAM,SAAS,MAAM,KAAK,aAAa,QAAQ,GAAU;AACzD,aAAO;AAAA,IACT;AAAA;AAAA,EAUA,eAAe,OAAe,UAAoC;AAChE,SAAK,OAAO,eAAe,OAAO,QAAQ;AAC1C,WAAO;AAAA,EACT;AAAA,EAEA,GAAG,OAAe,UAAoC;AACpD,SAAK,OAAO,GAAG,OAAO,QAAQ;AAC9B,WAAO;AAAA,EACT;AAAA,EAEA,KAAK,OAAe,UAAe;AACjC,SAAK,OAAO,KAAK,OAAO,QAAQ;AAChC,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,OAAe,UAAe;AAChC,SAAK,OAAO,IAAI,OAAO,QAAQ;AAC/B,WAAO;AAAA,EACT;AAAA,EAEA,KAAK,UAAkB,MAAa;AAClC,SAAK,OAAO,KAAK,OAAO,IAAI;AAAA,EAC9B;AAWF;;;AC3FA,IAAAC,gBAAsC;AAEtC,IAAM,qBAAqB,MAAM;AAC/B,QAAM,CAAC,aAAa,YAAY,QAAI,wBAAS,KAAK;AAElD,SAAO;AAAA,IACL,gBAAY,2BAAY,MAAM,aAAa,KAAK,GAAG,CAAC,CAAC;AAAA,IACrD;AAAA,IACA,eAAW,2BAAY,MAAM,aAAa,IAAI,GAAG,CAAC,CAAC;AAAA,EACrD;AACF;AAEA,IAAO,6BAAQ;;;A7B0VX,IAAAC,sBAAA;AA5TJ,IAAM,qBAAiB,8BAA2B,CAAC,CAAQ;AAa3D,IAAM,gBAAgB;AAEf,IAAM,kBAAkB,CAAC;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAChB,MAKM;AAnEN;AAoEE,QAAM;AAAA,IACJ,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,WAAW;AAAA,EACb,IAAI,2BAAmB;AAEvB,QAAM;AAAA,IACJ,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,WAAW;AAAA,EACb,IAAI,2BAAmB;AAEvB,QAAM,CAAC,aAAa,cAAc,QAAI,yBAAiB;AACvD,QAAM,CAAC,UAAU,WAAW,QAAI,yBAAmB,CAAC,CAAC;AACrD,QAAM,CAAC,YAAY,aAAa,QAAI,yBAAiB;AACrD,QAAM,CAAC,iBAAiB,mBAAmB,QAAI,yBAA0B;AAAA,IACvE,QAAM,YAAO,KAAK,QAAQ,UAAU,gBAAgB,MAA9C,mBAAkD,OAAM;AAAA,IAC9D,WACE,aAAQ,UAAU,mBAChB,YAAO,KAAK,QAAQ,UAAU,gBAAgB,MAA9C,mBAAkD,OAAM,WAD1D,mBAEI,GAAG,YAAW;AAAA,EACtB,CAAC;AAED,QAAM,qBAAiB,4BAAY,MAAM;AA3F3C,QAAAC;AA4FI,QAAI,OAAO,WAAW,aAAa;AACjC,aAAO;AAAA,IACT;AACA,UAAM,MAAKA,MAAA,aAAa,MAAb,gBAAAA,IAAgB,IAAY;AACvC,WAAO,kBAAM;AAAA,EACf,GAAG,CAAC,CAAC;AAEL,QAAM,mBAAe,4BAAY,MAAM;AACrC,UAAMC,eAAc,eAAe;AACnC,WAAO,WAAW,KAAK,CAAC,SAAS,KAAK,SAAS,OAAOA,YAAW;AAAA,EACnE,GAAG,CAAC,aAAa,UAAU,CAAC;AAE5B,QAAM,yBAAqB;AAAA,IACzB,CAAC,WAA4B;AAC3B,UAAI,CAAC,gBAAgB,QAAQ,UAAU,kBAAkB,OAAO,MAAM,OAAO,OAAO,GAAG;AACrF,cAAM,IAAI,MAAM,0BAA0B;AAAA,MAC5C;AACA,mBAAa,QAAQ,eAAe,KAAK,UAAU,MAAM,CAAC;AAC1D,0BAAoB,MAAM;AAAA,IAC5B;AAAA,IACA,CAAC,QAAQ,UAAU,kBAAkB,mBAAmB;AAAA,EAC1D;AAEA,gCAAU,MAAM;AACd,UAAMA,eAAc,eAAe;AACnC,QAAIA,cAAa;AACf,qBAAeA,YAAW;AAAA,IAC5B;AAAA,EACF,GAAG,CAAC,aAAa,cAAc,CAAC;AAEhC,QAAM,yBAAqB,wBAAQ,MAAM;AA1H3C,QAAAD;AA2HI,QAAI,YAAWA,MAAA,QAAQ,UAAU,iBAAiB,gBAAgB,UAAnD,gBAAAA,IACX,OAAO,CAAC,SAAS,KAAK,YAAY,gBAAgB,SACnD,IAAI,CAAC,SAAS,KAAK,UACnB,OAAO,CAAC,GAAG,MAAM;AAChB,QAAE,KAAK,GAAG,CAAC;AACX,aAAO;AAAA,IACT,GAAG,CAAC;AACN,eAAW,MAAM,KAAK,IAAI,IAAI,YAAY,CAAC,CAAC,CAAC;AAC7C,WAAO;AAAA,EACT,GAAG,CAAC,QAAQ,UAAU,kBAAkB,eAAe,CAAC;AAExD,QAAM,gBAAY,wBAAQ,MAAM,aAAa,GAAG,CAAC,aAAa,UAAU,CAAC;AAEzE,QAAM,mBAAe,4BAAY,MAAY;AAC3C,UAAME,aAAY,aAAa;AAC/B,QAAI,CAACA,YAAW;AACd,YAAM,IAAI,MAAM,uBAAuB;AAAA,IACzC;AACA,UAAM,SAAS,MAAMA,WAAU,aAAa;AAC5C,WAAO;AAAA,EACT,IAAG,CAAC,YAAY,CAAC;AAEjB,QAAMC,mBAAc;AAAA,IAClB,CAAO,YAAoB;AACzB,UAAI,CAAC,WAAW;AACd,cAAM,IAAI,MAAM,uBAAuB;AAAA,MACzC;AACA,YAAM,YAAY,MAAM,UAAU,YAAY,OAAO;AACrD,aAAO;AAAA,IACT;AAAA,IACA,CAAC,SAAS;AAAA,EACZ;AAEA,QAAMC,mBAAc;AAAA,IAClB,CAAO,WAAmB,UAAkBC,aAAkC;AAC5E,UAAI,CAAC,WAAW;AACd,cAAM,IAAI,MAAM,uBAAuB;AAAA,MACzC;AAEA,YAAM,YAAY,MAAM,UAAU,YAAY,WAAW,UAAUA,QAAO;AAC1E,aAAO;AAAA,IACT;AAAA,IACA,CAAC,SAAS;AAAA,EACZ;AAEA,QAAMC,kBAAa,4BAAY,MAAY;AACzC,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,MAAM,uBAAuB;AAAA,IACzC;AACA,UAAM,UAAU,MAAM,UAAU,WAAW;AAC3C,WAAO;AAAA,EACT,IAAG,CAAC,SAAS,CAAC;AAEd,QAAM,oBAAgB;AAAA,IACpB,CAAO,YAAmC;AACxC,UAAI,CAAC,WAAW;AACd,cAAM,IAAI,MAAM,uBAAuB;AAAA,MACzC;AACA,YAAM,UAAU,cAAc,OAAO;AAAA,IACvC;AAAA,IACA,CAAC,SAAS;AAAA,EACZ;AAEA,QAAM,mBAAe,wBAAQ,MAAM;AACjC,QAAI,OAAO,WAAW,aAAa;AACjC,aAAO;AAAA,IACT;AAEA,QACE,CAAE,OAAe,0BACf,iCAAgB,4BACd,iCAAgB,sBAAsB,qBAAqB,aAC3D,gBAAgB,YACf,iCAAgB,sBAAsB,qBAAqB,UAC1D,gBAAgB,OACtB;AACA,YAAMC,gBAAe,IAAI;AAAA,QACvB,IAAI;AAAA,UACF;AAAA,UACA,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV;AAAA,QACA;AAAA,MACF;AACA,MAAAA,cAAa,wBAAwB,eAAe;AACpD,MAAC,OAAe,wBAAwBA;AAAA,IAC1C;AACA,IAAC,OAAe,sBAAsB,SAAS,eAAe;AAC9D,IAAC,OAAe,sBAAsB,SAAS,eAAeJ;AAC9D,WAAQ,OAAe;AAAA,EACzB,GAAG,CAAC,SAAS,oBAAoB,cAAcA,cAAa,eAAe,CAAC;AAE5E,QAAM,qBAAiB;AAAA,IACrB,CAAOD,eAA6B;AAClC,UAAIM,YAAW,MAAMN,WAAU,YAAY;AAC3C,UAAIM,UAAS,WAAW,KAAK,aAAa;AACxC,QAAAA,YAAW,MAAMN,WAAU,gBAAgB;AAAA,MAC7C;AACA,kBAAYM,SAAQ;AAAA,IACtB;AAAA,IACA,CAAC,WAAW;AAAA,EACd;AAEA,QAAM,2BAAuB,4BAAY,CAAON,eAA6B;AAC3E,QAAIM,YAAW,MAAMN,WAAU,YAAY;AAC3C,QAAIM,UAAS,WAAW,GAAG;AACzB,MAAAA,YAAW,MAAMN,WAAU,gBAAgB;AAAA,IAC7C;AACA,gBAAYM,SAAQ;AAEpB,WAAOA;AAAA,EACT,IAAG,CAAC,CAAC;AAEL,gCAAU,MAAM;AACd,QAAI,WAAW;AACb,qBAAe,SAAS,EAAE,MAAM,CAAC,MAAW;AAC1C,gBAAQ,MAAM,qBAAqB,CAAC;AAEpC,oBAAY,CAAC,CAAC;AAAA,MAChB,CAAC;AAAA,IACH,OAAO;AACL,kBAAY,CAAC,CAAC;AAAA,IAChB;AAAA,EACF,GAAG,CAAC,WAAW,cAAc,CAAC;AAE9B,gCAAU,MAAM;AACd,UAAM,kBAAkB,CAACA,cAAuB;AAC9C,UAAI,CAACA,UAAS;AAAQ;AACtB,kBAAYA,SAAQ;AAAA,IACtB;AACA,2CAAW,GAAG,mBAAmB;AACjC,WAAO,MAAM;AACX,6CAAW,eAAe,mBAAmB;AAAA,IAC/C;AAAA,EACF,GAAG,CAAC,SAAS,CAAC;AAEd,QAAM,eAAW,wBAAQ,MAAM;AApQjC,QAAAR;AAqQI,QAAI,aAAa;AACf,cAAOA,MAAA,WAAW,KAAK,CAAC,SAAS,KAAK,SAAS,OAAO,WAAW,MAA1D,gBAAAA,IAA6D;AAAA,IACtE;AAAA,EACF,GAAG,CAAC,aAAa,UAAU,CAAC;AAE5B,QAAM,iBAAa,4BAAY,MAAM;AA1QvC,QAAAA;AA2QI,KAAAA,MAAA,aAAa,MAAb,gBAAAA,IAAgB,OAAO;AACvB,2BAAU,MAAM;AAChB,QAAI,WAAW;AACb,gBAAU,WAAW;AAAA,IACvB;AACA,mBAAe,MAAS;AAAA,EAC1B,GAAG,CAAC,SAAS,CAAC;AAEd,gCAAU,MAAM;AACd,UAAM,SAAS,KAAK,MAAM,aAAa,QAAQ,aAAa,KAAK,IAAI;AACrE,QACE,OAAO,QACP,OAAO,WACP,gBAAgB,QAAQ,UAAU,kBAAkB,OAAO,MAAM,OAAO,OAAO,GAC/E;AACA,0BAAoB,MAAM;AAAA,IAC5B;AAAA,EACF,GAAG,CAAC,QAAQ,UAAU,kBAAkB,mBAAmB,CAAC;AAE5D,gCAAU,MAAM;AA9RlB,QAAAA,KAAAS;AA+RI,UAAIT,MAAA,QAAQ,kBAAR,gBAAAA,IAAuB,aAAY,OAAO;AAC5C,YAAM,gBAAgB,mBAAmB,IAAI,CAAC,OAAO,sBAAO,oBAAoB,EAAE,CAAC;AACnF,UAAI,cAAc,KAAK,CAAC,UAAU,CAAC,KAAK,GAAG;AACzC,cAAM,IAAI,MAAM,kCAAkC,KAAK,UAAU,kBAAkB,GAAG;AAAA,MACxF;AACA,sCAAkB;AAAA,QAChB;AAAA,UACE,WAAW,QAAQ;AAAA,UACnB,WAAW,QAAQ;AAAA,UACnB,OAAO,QAAQ;AAAA,QACjB;AAAA,QACA,iCACK,QAAQ,gBADb;AAAA,UAEE,SAAS;AAAA,UACT,aAAa,kCACRS,MAAA,QAAQ,kBAAR,gBAAAA,IAAuB,cADf;AAAA,YAEX;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAAG,CAAC,SAAS,oBAAoB,eAAe,CAAC;AAEjD,gCAAU,MAAM;AAtTlB,QAAAT;AAuTI,QAAI,kBAAgBA,MAAA,QAAQ,kBAAR,gBAAAA,IAAuB,aAAY,OAAO;AAC5D,sCAAkB,cAAc;AAAA,QAC9B,UAAU,aAAa;AAAA,MACzB,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,cAAc,OAAO,CAAC;AAE1B,gCAAU,MAAM;AA9TlB,QAAAA;AA+TI,UAAIA,MAAA,QAAQ,kBAAR,gBAAAA,IAAuB,aAAY,OAAO;AAC5C,UAAI,YAAY;AACd,wCAAkB,kBAAkB;AAAA,MACtC,OAAO;AACL,wCAAkB,mBAAmB;AAAA,MACvC;AAAA,IACF;AAAA,EACF,GAAG,CAAC,YAAY,cAAc,OAAO,CAAC;AAEtC,gCAAU,MAAM;AACd,QAAI,SAAS,WAAW,GAAG;AACzB,wBAAkB;AAClB,qBAAe;AACf,UAAI,mBAAO,uDAAwC,IAAI,GAAG;AACxD,2BAAO,gDAAiC;AAAA,UACtC,OAAO;AAAA,YACL,MAAM;AAAA,YACN,SAAS;AAAA,UACX;AAAA,QACF,CAAC;AAAA,MACH,WAAW,mBAAO,2DAA0C,IAAI,GAAG;AACjE,2BAAO,oDAAmC;AAAA,UACxC,OAAO;AAAA,YACL,MAAM;AAAA,YACN,SAAS;AAAA,UACX;AAAA,QACF,CAAC;AAAA,MACH,WAAW,mBAAO,6DAA2C,IAAI,GAAG;AAClE,2BAAO,sDAAoC;AAAA,UACzC,OAAO;AAAA,YACL,MAAM;AAAA,YACN,SAAS;AAAA,UACX;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,GAAG,CAAC,UAAU,mBAAmB,cAAc,CAAC;AAEhD,SACE;AAAA,IAAC,eAAe;AAAA,IAAf;AAAA,MACC,OAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,aAAAG;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAAG;AAAA,QACA;AAAA,QACA,aAAAF;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MAEC;AAAA;AAAA,QACD,6CAAC,wBAAa,MAAM,kBAAkB,SAAS,mBAAmB;AAAA,QAClE,6CAAC,qBAAU,MAAM,eAAe,SAAS,gBAAgB,QAAQ,eAAe;AAAA;AAAA;AAAA,EAClF;AAEJ;AAEO,IAAM,qBAAqB,MAAM;AACtC,QAAM,cAAU,2BAAW,cAAc;AACzC,SAAO;AACT;;;A8BxYA,IAAAM,iBAAwE;;;ACahE,IAAAC,uBAAA;AAFO,SAARC,OAAuB,EAAE,UAAU,SAAS,QAAQ,CAAC,EAAE,GAAU;AACpE,SAAO,+CAAC,SACJ;AAAA,kDAAC,SAAI,WAAU,SAAQ;AAAA,IACvB,+CAAC,SAAI,WAAU,SAAQ,OACnB;AAAA,oDAAC,SAAI,WAAU,SAAQ,SAAS,MAAM;AAAE,mBAAW,QAAQ;AAAA,MAAE,GACzD,wDAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,OAAM,8BAC9D,wDAAC,UAAK,GAAE,inBAAgnB,MAAK,WAAU,GAC3oB,GACJ;AAAA,MACC;AAAA,OACL;AAAA,KACJ;AACJ;;;ACFQ,IAAAC,uBAAA;AANO,SAAR,WAA4B,EAAE,SAAS,SAAS,GAAG,YAAY;AAAA,EAClE,MAAM;AACV,GAAG,UAAU;AAAA,EACT,MAAM;AACV,GAAG,KAAK,GAAU;AACd,SAAO,+CAACC,QAAA,EAAM,SACV;AAAA,kDAAC,SAAI,WAAU,SAAQ,gCAAkB;AAAA,IACzC,8CAAC,SAAI,WAAU,UAOP,qBAAW,IAAI,8CAAC,SAAI,WAAU,WAAU,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,OAAM,8BACjG,wDAAC,UAAK,GAAE,usDAAssD,MAAK,SAAQ,gBAAa,QAAO,GACnvD,IAAS,+CAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,OAAM,8BACvE;AAAA,oDAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK,MAAK,WAAU;AAAA,MAC9C,8CAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK,QAAO,WAAU,kBAAe,OAAM,gBAAa,KAAI;AAAA,MACtF,8CAAC,UAAK,aAAU,WAAU,aAAU,WAAU,GAAE,wQAAuQ,MAAK,SAAQ;AAAA,OACxU,GAOR;AAAA,IAGI,WAAW,KAAK,gFACZ;AAAA,oDAAC,SAAI,WAAU,QAAO,8BAEtB;AAAA,MACA,8CAAC,SAAI,WAAU,cAAa,wCAE5B;AAAA,OACJ;AAAA,IAIA,WAAW,KAAK,gFACZ;AAAA,oDAAC,SAAI,WAAU,QAAO,8BAEtB;AAAA,MACA,+CAAC,SAAI,WAAU,cAAa;AAAA;AAAA,QACa,8CAAC,OAAE,MAAK,YAAW,yCAA2B;AAAA,SACvF;AAAA,OACJ;AAAA,IAIA,CAAC,CAAC,QAAQ,+EAAE,yDAAC,SAAI,WAAU,UAAS,SAAS,MAAM;AAC/C,UAAI,UAAU,SAAS,OAAO;AAC1B,eAAO,KAAK,oCAAoC,MAAM;AAAA,MAC1D,WAAW,UAAU,SAAS,QAAQ;AAClC,eAAO,KAAK,sCAAsC,MAAM;AAAA,MAC5D;AAAA,IAEJ,GAAG;AAAA;AAAA,MACQ,8CAAC,SAAI,OAAM,KAAI,QAAO,KAAI,SAAQ,WAAU,MAAK,QAAO,OAAM,8BACjE,wDAAC,UAAK,aAAU,WAAU,aAAU,WAAU,GAAE,uzCAAszC,MAAK,WAAU,GACz3C;AAAA,OACJ,GACA;AAAA,KAUR;AACJ;;;AFvBM,IAAAC,uBAAA;AAhDN,IAAM,aAAa;AAAA,EACjB,sBAAsB;AAAA,EACtB,mBAAmB;AACrB;AAEA,IAAM,wBAAwB,eAAAC,QAAM,cAAmB,IAAI;AAEpD,SAAS,iCAAiC;AAAA,EAC/C;AACF,GAGG;AACD,QAAM,CAAC,cAAc,eAAe,QAAI,yBAAS,KAAK;AAGtD,QAAM,aAAa;AAAA,IACjB,IAAI,aAAa;AAAA,IACjB,IAAI,gBAAgB;AAAA,IACpB,IAAI,eAAe;AAAA,IACnB,IAAI,gBAAgB;AAAA,IACpB,IAAI,gBAAgB;AAAA,IACpB,IAAI,mBAAmB;AAAA,IACvB,IAAI,cAAc;AAAA,EAEpB;AAEA,QAAM,iCAA6B,wBAAQ,MAAM;AAC/C,UAAM,WAAiD,CAAC;AAExD,WAAO;AAAA,MACL;AAAA,MACA,MAAM,CAAC,WAAmB,MAAW;AACnC,YAAI,SAAS,cAAc,SAAS,WAAW,QAAQ;AACrD,mBAAS,WAAW,QAAQ,CAAC,OAAyB;AACpD,eAAG,CAAC;AAAA,UACN,CAAC;AAAA,QACH;AAAA,MACF;AAAA,MACA,IAAI,CAAC,WAAmB,OAAyB;AAC/C,iBAAS,aAAa,SAAS,cAAc,CAAC;AAC9C,iBAAS,WAAW,KAAK,EAAE;AAAA,MAC7B;AAAA,IACF;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SACE,8CAAC,sBAAsB,UAAtB,EAA+B,OAAO,4BACrC;AAAA,IAAC;AAAA;AAAA,MACC,SAAS;AAAA,QACP,WAAW;AAAA,QACX,WAAW;AAAA,QACX,OAAO;AAAA,QACP,WAAW;AAAA,UACT,kBAAkB;AAAA,YAChB,KAAK;AAAA,cACH;AAAA,gBACE,UAAU,CAAC,MAAM;AAAA,gBACjB,SAAS;AAAA,cACX;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,eAAe;AAAA,UACb,SAAS;AAAA,QACX;AAAA,MACF;AAAA,MACA,aAAa;AAAA,MACb;AAAA,MAEC;AAAA;AAAA,QACA,gBACC;AAAA,UAAC;AAAA;AAAA,YACC,MAAM;AAAA,YACN,QAAQ;AAAA,YACR,SAAS,MAAM;AACb,8BAAgB,KAAK;AAAA,YACvB;AAAA;AAAA,QACF;AAAA,QAEF,8CAAC,gCAA6B;AAAA;AAAA;AAAA,EAChC,GACF;AAEJ;AAEA,SAAS,+BAA+B;AACtC,QAAM,UAAU,qBAAqB;AACrC,gCAAU,MAAM;AACd,WAAO,aAAa;AAAA,EACtB,GAAG,CAAC,OAAO,CAAC;AACZ,SAAO;AACT;AAEO,SAAS,uBAAuB;AAErC,QAAM,EAAE,kBAAkB,YAAY,sBAAsB,iBAAiB,IAC3E,gBAAgB;AAClB,QAAM;AAAA,IACJ;AAAA,IACA,aAAAC;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAAC;AAAA,IACA;AAAA,IACA,YAAAC;AAAA,IACA;AAAA,EACF,IAAI,eAAe;AACnB,QAAM,mBAAe,uBAAY,IAAI;AACrC,QAAM,cAAU,2BAAW,qBAAqB;AAEhD,gCAAU,MAAM;AACd,UAAM,wBAAwB,CAAC,YAAiB;AAE9C,UAAI,EAAC,mCAAS;AAAQ;AAGtB,YAAM,aAAa,KAAK,UAAU,OAAO;AACzC,YAAM,MAAM,KAAK,IAAI;AAGrB,UACE,eAAe,WAAW,wBAC1B,MAAM,WAAW,oBAAoB,KACrC;AACA;AAAA,MACF;AAGA,iBAAW,uBAAuB;AAClC,iBAAW,oBAAoB;AAE/B,mBAAa,EAAE,KAAK,CAAC,QAAQ;AAC3B,gBAAQ,KAAK,mBAAmB,GAAG;AAAA,MACrC,CAAC;AAAA,IACH;AAEA,2CAAW,GAAG,mBAAmB;AACjC,iBAAa,UAAU;AAEvB,WAAO,MAAM;AACX,6CAAW,eAAe,mBAAmB;AAAA,IAC/C;AAAA,EACF,GAAG,CAAC,WAAW,SAAS,YAAY,CAAC;AAErC,QAAM,WAAO,wBAAQ,MAAM;AAEzB,UAAM,gBAAgB,CAAO,WAAW,UAAU;AAChD,UAAI;AAAkB,eAAO;AAI7B,UAAI;AACF,YAAI,UAAU;AACZ;AAAA,QACF,OAAO;AACL,gBAAM,qBAAqB,aAAa,OAAO;AAAA,QACjD;AAGA,cAAM,UAAU,MAAM;AAAA,UACpB,MAAM,OAAO,WAAW;AAAA,UACxB,CAAC,QAAQ,CAAC,CAAC;AAAA,UACX;AAAA,YACE,YAAY;AAAA,YACZ,SAAS;AAAA,UACX;AAAA,QACF;AAEA,eAAO,WAAW;AAAA,MACpB,SAAS,OAAP;AACA,gBAAQ,MAAM,iBAAiB,KAAK;AACpC,gBAAQ,KAAK,eAAe;AAC5B,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,MACL,OAAO,MAAY;AACjB,eAAO,cAAc,IAAI;AAAA,MAC3B;AAAA,MACA,aAAa,MAAY;AACvB,eAAO,cAAc,KAAK;AAAA,MAC5B;AAAA,MACA,QAAQ,MAAM;AACZ,cAAM,YAAY,qCAAW;AAC7B,YAAI,CAAC;AAAW;AAChB;AACA,gBAAQ,KAAK,WAAW;AAAA,MAC1B;AAAA,MACA,SAAS,qCAAW;AAAA,MACpB,cAAc,MAAY;AACxB,cAAM,YAAY,MAAM,aAAa,EAAE,MAAM,MAAM,IAAI;AACvD,YAAI;AAAW,iBAAO;AAEtB,cAAM,cAAc,KAAK;AACzB,eAAO,aAAa;AAAA,MACtB;AAAA,MACA,aAAa,CAAO,QAAgB;AAClC,cAAM,cAAc,KAAK;AACzB,eAAOD,aAAY,GAAG;AAAA,MACxB;AAAA,MACA,YAAY,MAAM;AAChB,eAAO;AAAA,MACT;AAAA,MACA,YAAAC;AAAA,MACA;AAAA,MACA,aAAa,CAAO,WAAmB,UAAkB,YAAkC;AACzF,cAAM,cAAc,KAAK;AACzB,eAAOF,aAAY,WAAW,UAAU,OAAO;AAAA,MACjD;AAAA,IACF;AAAA,EACF,GAAG;AAAA,IACD;AAAA,IACAE;AAAA,IACA;AAAA,IACAF;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACAC;AAAA,EACF,CAAC;AAED,SAAO;AACT;;;AGpPO,IAAM,eAaT;AAAA,EACF,KAAK;AAAA,IACH,UAAU;AAAA,IACV,UAAU;AAAA,IACV,kBAAkB;AAAA,IAClB,WAAW;AAAA,IACX,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,IACnB,kBAAkB;AAAA,IAClB,WAAW;AAAA,IACX,WAAW;AAAA,EACb;AAAA,EACA,SAAS;AAAA,IACP,UAAU;AAAA,IACV,UAAU;AAAA,IACV,kBAAkB;AAAA,IAClB,WAAW;AAAA,IACX,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,IACnB,kBAAkB;AAAA,IAClB,WAAW;AAAA,IACX,WAAW;AAAA,EACb;AAAA,EACA,iBAAiB;AAAA,IACf,UAAU;AAAA,IACV,UAAU;AAAA,IACV,kBAAkB;AAAA,IAClB,WAAW;AAAA,IACX,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,IACnB,kBAAkB;AAAA,IAClB,WAAW;AAAA,IACX,WAAW;AAAA,EACb;AAAA,EACA,SAAS;AAAA,IACP,UAAU;AAAA,IACV,UAAU;AAAA,IACV,kBAAkB;AAAA,IAClB,WAAW;AAAA,IACX,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,IACnB,kBAAkB;AAAA,IAClB,WAAW;AAAA,IACX,WAAW;AAAA,EACb;AACF;AAEO,SAAS,gBAAgB,KAAU;AACxC,QAAM,SAAS,aAAa;AAC5B,QAAM,UAAU,QAAQ,aAAa,QAAQ,oBAAoB,YAAY;AAC7E,SAAO,iCACF,SADE;AAAA,IAEL;AAAA,EACF;AACF;AAEO,IAAM,cAAc;AAAA,EACzB,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,SAAS,CAAC,8BAA8B;AAC1C;AAEO,IAAM,aAAa;AAAA,EACxB,SAAS;AAAA,EACT,SAAS;AACX;;;ACpFA,IAAAE,cAAgB;;;ACChB,yBAA0B;;;ACS1B,IAAM,QAAQ,oBAAI,IAA8C;AAEhE,IAAM,sBAAsB;AAErB,SAAS,UACd,KACA,SACA,UAAkB,qBACN;AACZ,QAAM,SAAS,MAAM,IAAI,GAAG;AAC5B,QAAM,eAAe,UAAU,KAAK,IAAI,IAAI,OAAO,YAAY;AAE/D,MAAI,cAAc;AAChB,WAAO,QAAQ,QAAQ,OAAO,IAAS;AAAA,EACzC;AAEA,SAAO,QAAQ,EAAE,KAAK,CAAC,SAAS;AAC9B,UAAM,IAAI,KAAK,EAAE,WAAW,KAAK,IAAI,GAAG,KAAK,CAAC;AAC9C,eAAW,MAAM;AACf,YAAM,OAAO,GAAG;AAAA,IAClB,GAAG,OAAO;AACV,WAAO;AAAA,EACT,CAAC;AACH;AAEA,SAAO,QAAkC,KAAa,SAAyC;AAAA;AAnC/F;AAoCE,UAAM,iBAAiB;AAAA,MACrB,gBAAgB;AAAA,IAClB;AAEA,UAAM,gBAAe,mCAAS,iBAAgB;AAE9C,UAAM,UAAU,kCACX,iBACA,mCAAS;AAGd,QAAI,OAAO,mCAAS;AACpB,QAAI,QAAQ,oBAAoB,sBAAsB,QAAQ,OAAO,SAAS,UAAU;AACtF,aAAO,KAAK,UAAU,IAAI;AAAA,IAC5B;AAEA,UAAM,UAAS,mCAAS,WAAU;AAClC,UAAM,WAAW,OAAO,YAAY,MAAM,QAAQ,MAAM;AAExD,QAAI,UAAU;AACZ,YAAM,SAAS,MAAM,IAAI,QAAQ;AACjC,YAAM,eAAe,UAAU,KAAK,IAAI,IAAI,OAAO,YAAY;AAC/D,UAAI,cAAc;AAChB,eAAO,QAAQ,QAAQ,OAAO,IAAS;AAAA,MACzC;AAAA,IACF;AAEA,UAAM,aAA0B,iCAC3B,UAD2B;AAAA,MAE9B;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,UAAM,cAAa,wCAAS,eAAT,YAAuB;AAE1C,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,WAAU,mCAAS,YAAW;AACpC,UAAM,YAAY,WAAW,MAAM,WAAW,MAAM,GAAG,OAAO;AAE9D,QAAI;AACF,YAAM,MAAM,MAAM,MAAM,KAAK,iCAAK,aAAL,EAAiB,QAAQ,WAAW,OAAO,EAAC,EAAE;AAAA,QAAQ,MACjF,aAAa,SAAS;AAAA,MACxB;AAEA,UAAI,CAAC,IAAI;AAAI,cAAM,IAAI,MAAM,IAAI,UAAU;AAC3C,YAAM,OAAO,MAAM,IAAI,KAAK;AAE5B,UAAI,mCAAS,mBAAmB;AAC9B,YAAI,QAAQ,kBAAkB,IAAI,GAAG;AACnC,iBAAO;AAAA,QACT;AACA,cAAM,IAAI,MAAM,yBAAyB;AAAA,MAC3C;AAEA,UAAI,UAAU;AACZ,cAAM,IAAI,UAAU,EAAE,WAAW,KAAK,IAAI,GAAG,KAAK,CAAC;AACnD,mBAAW,MAAM;AACf,gBAAM,OAAO,QAAQ;AAAA,QACvB,GAAG,YAAY;AAAA,MACjB;AAEA,aAAO;AAAA,IACT,SAAS,KAAP;AACA,UAAI,aAAa,GAAG;AAClB,gBAAQ,IAAI,8BAA8B,YAAY;AACtD,eAAO,QAAQ,KAAK,iCAAK,UAAL,EAAc,YAAY,aAAa,EAAE,EAAC;AAAA,MAChE,YAAW,mCAAS,qBAAmB,mCAAS,qBAAoB;AAClE,YAAI,QAAQ,qBAAqB,GAAG;AAClC,kBAAQ,IAAI,6BAA6B,QAAQ,oBAAoB;AACrE,gBAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,QAAQ,eAAe,CAAC;AAC3E,iBAAO,QAAQ,KAAK,iCACf,UADe;AAAA,YAElB,oBAAoB,QAAQ,qBAAqB;AAAA,YACjD;AAAA,UACF,EAAC;AAAA,QACH;AAAA,MACF;AACA,cAAQ,MAAM,GAAG;AACjB,aAAO,QAAQ,OAAO,GAAG;AAAA,IAC3B;AAAA,EACF;AAAA;;;AD9GO,SAAS,gBAAgB,QAA0D;AACxF,SACE,OAAO,YACP,IAAI,6BAAU;AAAA,IACZ,YAAY,iCAAQ,SAAqC;AAAA,MACvD,CAAC,QAAQ,IAAI,6BAAU,gBAAgB,EAAE,IAAI,CAAC;AAAA,IAChD;AAAA,EACF;AAEJ;AAEA,SAAsB,iBACpB,IACA,IACA,IAOY;AAAA,6CATZ,YACA,YACA,MACA,UAKI,CAAC,GACO;AACZ,QAAI,CAAC,QAAQ,WAAW;AACtB,YAAM,WAAW,QAAQ,cAAc,cAAc,OAAO,KAAK,UAAU,IAAI,IAAI;AACnF,aAAO;AAAA,QACL;AAAA,QACA,MAAM,gBAAmB,YAAY,YAAY,MAAM,OAAO;AAAA,QAC9D,QAAQ,gBAAgB;AAAA,MAC1B;AAAA,IACF;AAEA,WAAO,gBAAmB,YAAY,YAAY,MAAM,OAAO;AAAA,EACjE;AAAA;AAEA,SAAe,gBACb,YACA,YACA,MACA,SAIY;AAAA;AACZ,UAAM,eAAe,gBAAgB,OAAO;AAC5C,UAAM,MAAW,MAAM,aAAa,MAAM;AAAA,MACxC,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,aAAa,OAAO,KAAK,KAAK,UAAU,IAAI,CAAC,EAAE,SAAS,QAAQ;AAAA,MAChE,UAAU;AAAA,IACZ,CAAC;AACD,WAAO,KAAK,MAAM,OAAO,KAAK,IAAI,MAAM,EAAE,SAAS,CAAC;AAAA,EACtD;AAAA;AAEA,SAAsB,wBAAwB,SAAiB,QAAkB;AAAA;AAC/E,UAAM,WAAW,IAAI,6BAAU;AAAA,MAC7B,OAAO,OAAO,YAAY,QAAoC,EAAE;AAAA,QAC9D,CAAC,QAAQ,IAAI,6BAAU,gBAAgB,EAAE,IAAI,CAAC;AAAA,MAChD;AAAA,IACF;AAEA,UAAM,cAAc;AACpB,QAAI,iBAAiB;AACrB,UAAM,gBAAgB,IAAI,IAAI,MAAM;AACpC,UAAM,UAAU,oBAAI,IAAmC;AAEvD,WAAO,cAAc,OAAO,KAAK,iBAAiB,aAAa;AAC7D;AAEA,YAAM,WAAW,MAAM,KAAK,aAAa,EAAE,IAAI,CAAO,SAAS;AAC7D,YAAI;AACF,gBAAMC,UAAS,MAAM,SAAS,SAAS,MAAM,UAAU,OAAO;AAC9D,cAAIA,WAAUA,QAAO,QAAQ;AAC3B,oBAAQ,IAAI,eAAe,gBAAgBA,OAAM;AACjD,oBAAQ,IAAI,MAAMA,OAAM;AACxB,0BAAc,OAAO,IAAI;AAAA,UAC3B;AAAA,QACF,SAAS,OAAP;AACA,kBAAQ,MAAM,0CAA0C,SAAS,MAAM,SAAS;AAAA,QAClF;AAAA,MACF,EAAC;AAED,YAAM,QAAQ,IAAI,QAAQ;AAE1B,UAAI,cAAc,OAAO,GAAG;AAC1B,YAAI,mBAAmB,aAAa;AAClC,gBAAM,IAAI;AAAA,YACR,8CAA8C,MAAM,KAAK,aAAa,EAAE,KAAK,IAAI;AAAA,UACnF;AAAA,QACF;AACA,gBAAQ;AAAA,UACN,eAAe,cAAc,+BAA+B,cAAc;AAAA,QAC5E;AACA,cAAM,MAAM,GAAK;AAAA,MACnB;AAAA,IACF;AAEA,UAAM,SAAS,OAAO,IAAI,CAAC,SAAS,QAAQ,IAAI,IAAI,CAAC,EAAE,OAAO,OAAO;AACrE,WAAO;AAAA,EACT;AAAA;;;AEvGA,0BAA+B;AAC/B,sBAA0B;AAC1B,yBAAkC;AAClC,IAAAC,iBAA2B;AAC3B,kBAAiB;AAEjB,uBAAuB;AAIvB,IAAAC,sBAA6B;AAC7B,iBAAgB;;;ACZhB,IAAM,eAAe;AAAA,EACnB,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,gBAAgB;AAClB;AAEA,IAAMC,WAAU,aAAa,wBAAwB;AAErD,IAAO,gBAAQ;AAAA,EACb,YAAY,SAAiB;AAC3B,QAAI,CAAC,SAAS;AACZ,WAAK,cAAc;AACnB;AAAA,IACF;AACA,IAAAA,YAAA,gBAAAA,SAAS,IAAI,aAAa,SAAS;AAAA,EACrC;AAAA,EACA,gBAAgB;AACd,IAAAA,YAAA,gBAAAA,SAAS,OAAO,aAAa;AAAA,EAC/B;AAAA,EACA,cAAc,WAAmB;AAC/B,QAAI,CAAC,WAAW;AACd,WAAK,gBAAgB;AACrB;AAAA,IACF;AACA,IAAAA,YAAA,gBAAAA,SAAS,IAAI,aAAa,YAAY;AAAA,EACxC;AAAA,EACA,kBAAkB;AAChB,IAAAA,YAAA,gBAAAA,SAAS,OAAO,aAAa;AAAA,EAC/B;AAAA,EACA,iBAAiB,WAAmB;AAClC,QAAI,CAAC,WAAW;AACd,WAAK,mBAAmB;AACxB;AAAA,IACF;AACA,IAAAA,YAAA,gBAAAA,SAAS,IAAI,aAAa,gBAAgB;AAAA,EAC5C;AAAA,EACA,qBAAqB;AACnB,IAAAA,YAAA,gBAAAA,SAAS,OAAO,aAAa;AAAA,EAC/B;AAAA,EACA,QAAQ;AACN,SAAK,cAAc;AACnB,SAAK,gBAAgB;AACrB,SAAK,mBAAmB;AAAA,EAC1B;AAAA,EACA,KAAK,SAAiB,WAAmB;AACvC,QAAI,CAAC,WAAW,CAAC,WAAW;AAC1B,WAAK,MAAM;AACX;AAAA,IACF;AACA,SAAK,YAAY,OAAO;AACxB,SAAK,cAAc,SAAS;AAAA,EAC9B;AAAA,EACA,aAAa;AACX,YAAOA,YAAA,gBAAAA,SAAS,IAAY,aAAa,aAAY;AAAA,EACvD;AAAA,EACA,eAAe;AACb,YAAOA,YAAA,gBAAAA,SAAS,IAAY,aAAa,gBAAe;AAAA,EAC1D;AAAA,EACA,kBAAkB;AAChB,YAAOA,YAAA,gBAAAA,SAAS,IAAY,aAAa,oBAAmB;AAAA,EAC9D;AAAA,EACA,UAAU;AACR,UAAM,UAAU,KAAK,WAAW;AAChC,UAAM,YAAY,KAAK,aAAa;AACpC,UAAM,eAAe,KAAK,gBAAgB;AAE1C,UAAM,WAAW,CAAC,WAAW,CAAC,aAAa,CAAC;AAC5C,UAAM,WAAW,WAAW,aAAa;AAEzC,WAAO,YAAY;AAAA,EACrB;AAAA,EACA,SAAS,SAAiB,WAAmB,cAAsB;AACjE,QAAI,CAAC,WAAW,CAAC,aAAa,CAAC,cAAc;AAC3C,WAAK,MAAM;AACX;AAAA,IACF;AAEA,SAAK,MAAM;AAEX,SAAK,cAAc,SAAS;AAC5B,SAAK,iBAAiB,YAAY;AAClC,SAAK,YAAY,OAAO;AAAA,EAC1B;AACF;;;AD7DA,SAAsB,SAAS,IAAqD;AAAA,6CAArD,EAAE,KAAK,UAAU,GAAoC;AAClF,UAAM,SAAS,gBAAgB,GAAG;AAClC,UAAM,EAAE,aAAa,gBAAgB,YAAY,IAAI,MAAM;AAAA,MACzD,GAAG,OAAO,0BAA0B;AAAA,IACtC;AACA,QAAI,gBAAgB,GAAG;AACrB,YAAM,IAAI,MAAM,cAAc;AAAA,IAChC;AACA,WAAO;AAAA,EACT;AAAA;AAEA,SAAsB,aAAa,IAAqD;AAAA,6CAArD,EAAE,KAAK,UAAU,GAAoC;AACtF,UAAM,SAAS,gBAAgB,GAAG;AAClC,UAAM,EAAE,aAAa,gBAAgB,YAAY,IAAI,MAAM;AAAA,MACzD,GAAG,OAAO,8BAA8B;AAAA,IAC1C;AACA,QAAI,gBAAgB,GAAG;AACrB,YAAM,IAAI,MAAM,cAAc;AAAA,IAChC;AACA,WAAO;AAAA,EACT;AAAA;AAEA,SAAsB,mBAAmB,IAAsC;AAAA;AAAtC,iBAAE,MA9C3C,IA8CyC,IAAU,iBAAV,IAAU,CAAR;AACzC,UAAM,SAAS,gBAAgB,GAAG;AAClC,UAAM,EAAE,aAAa,gBAAgB,YAAY,IAAI,MAAM;AAAA,MACzD,GAAG,OAAO;AAAA,MACV;AAAA,QACE,QAAQ;AAAA,QACR,MAAM;AAAA,MACR;AAAA,IACF;AACA,QAAI,gBAAgB,GAAG;AACrB,YAAM,IAAI,MAAM,cAAc;AAAA,IAChC;AACA,WAAO;AAAA,EACT;AAAA;AAWA,SAAsB,qBAAqB,IAMC;AAAA,6CAND;AAAA,IACzC;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd;AAAA,IACA;AAAA,EACF,GAA4C;AAC1C,UAAM,SAAS,gBAAgB,GAAG;AAClC,UAAM,EAAE,aAAa,gBAAgB,YAAY,IAAI,MAAM;AAAA,MACzD,GAAG,OAAO;AAAA,MACV;AAAA,QACE,QAAQ;AAAA,QACR,MAAM,EAAE,cAAc,aAAa,aAAa,SAAS;AAAA,MAC3D;AAAA,IACF;AACA,YAAQ,IAAI,8BAA8B,EAAE,aAAa,gBAAgB,YAAY,CAAC;AACtF,QAAI,gBAAgB,GAAG;AACrB,YAAM,IAAI,MAAM,cAAc;AAAA,IAChC;AACA,WAAO;AAAA,EACT;AAAA;AAEA,SAAsB,kBAAkB,IAOZ;AAAA,6CAPY;AAAA,IACtC;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd;AAAA,IACA;AAAA,EACF,GAA4B;AAC1B,UAAM,SAAS,gBAAgB,GAAG;AAClC,UAAM,EAAE,aAAa,gBAAgB,YAAY,IAAI,MAAM;AAAA,MACzD,GAAG,OAAO;AAAA,MACV;AAAA,QACE,QAAQ;AAAA,QACR,MAAM,EAAE,cAAc,QAAQ,aAAa,aAAa,SAAS;AAAA,MACnE;AAAA,IACF;AACA,YAAQ,IAAI,2BAA2B,EAAE,aAAa,gBAAgB,YAAY,CAAC;AACnF,QAAI,gBAAgB,GAAG;AACrB,YAAM,IAAI,MAAM,cAAc;AAAA,IAChC;AACA,WAAO;AAAA,EACT;AAAA;AAEA,SAAsB,6BAA6B,IAQhD;AAAA,6CARgD;AAAA,IACjD;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAIG;AACD,UAAM,SAAS,gBAAgB,GAAG;AAClC,UAAM,EAAE,aAAa,gBAAgB,YAAY,IAAI,MAAM;AAAA,MAGzD,GAAG,OAAO,uCAAuC,sBAAsB,cAAc,SAAS,IAAI;AAAA,MAClG;AAAA,QACE,SAAS,IAAI,KAAK,KAAK;AAAA,QACvB,iBAAiB;AAAA,QACjB,oBAAoB;AAAA,QACpB,mBAAmB,CAAC,QAAQ;AArIlC;AAsIQ,gBAAM,WAAS,SAAI,gBAAJ,mBAAiB,WAAU;AAC1C,iBAAO,IAAI,gBAAgB,MAAM,WAAW,KAAK,UAAU;AAAA,QAC7D;AAAA,MACF;AAAA,IACF;AACA,YAAQ,IAAI,gCAAgC,EAAE,aAAa,gBAAgB,YAAY,CAAC;AACxF,SAAI,2CAAa,YAAW,GAAG;AAC7B,YAAM,IAAI,MAAM,kBAAkB,+BAA+B,2CAAa,QAAQ;AAAA,IACxF;AACA,YAAQ,IAAI,sCAAsC,WAAW;AAC7D,WAAO;AAAA,EACT;AAAA;AAEA,SAAsB,0BAA0B,IAM7C;AAAA,6CAN6C;AAAA,IAC9C;AAAA,IACA;AAAA,EACF,GAGG;AACD,UAAM,SAAS,gBAAgB,GAAG;AAClC,UAAM,EAAE,aAAa,gBAAgB,YAAY,IAAI,MAAM,QAEzD,GAAG,OAAO,yBAAyB,MAAM,SAAS,KAAK;AAAA,MACvD,SAAS;AAAA,MACT,iBAAiB;AAAA,MACjB,oBAAoB;AAAA,MACpB,mBAAmB,CAAC,QAAQ;AAjKhC;AAkKM,cAAM,WAAS,SAAI,gBAAJ,mBAAiB,WAAU;AAC1C,eAAO,IAAI,gBAAgB,MAAM,WAAW,KAAK,UAAU;AAAA,MAC7D;AAAA,IACF,CAAC;AACD,SAAI,2CAAa,YAAW,GAAG;AAC7B,YAAM,IAAI,MAAM,kBAAkB,+BAA+B,2CAAa,QAAQ;AAAA,IACxF;AACA,YAAQ,IAAI,mCAAmC,EAAE,aAAa,gBAAgB,YAAY,CAAC;AAC3F,WAAO;AAAA,EACT;AAAA;AAEA,SAAsB,aAAa,IAAuB;AAAA,6CAAvB,EAAE,IAAI,GAAiB;AACxD,UAAM,SAAS,gBAAgB,GAAG;AAClC,UAAM,OAAO,MAAM,QAAkB,GAAG,OAAO,6BAA6B,EAAE,MAAM,CAAC,UAAU;AAC7F,cAAQ,MAAM,uBAAuB,KAAK;AAC1C,aAAO,CAAC;AAAA,IACV,CAAC;AACD,WAAO;AAAA,EACT;AAAA;AA6BA,SAAsB,eAAe,IAA2C;AAAA,6CAA3C,EAAE,MAAM,IAAI,GAA+B;AAC9E,UAAM,SAAS,gBAAgB,GAAG;AAClC,UAAM,cAAc,MAAM;AAAA,MACxB,OAAO;AAAA,MACP;AAAA,MACA;AAAA,QACE,YAAY;AAAA,MACd;AAAA,MACA,EAAE,SAAS,OAAO,QAAQ;AAAA,IAC5B,EAAE,MAAM,CAAC,UAAU;AACjB,cAAQ,IAAI,6CAA6C,KAAK;AAC9D,YAAM;AAAA,IACR,CAAC;AACD,YAAQ,IAAI,wBAAwB,WAAW;AAC/C,WAAO;AAAA,EACT;AAAA;AAEA,SAAsB,gBAAgB,IAAuB;AAAA,6CAAvB,EAAE,IAAI,GAAiB;AAC3D,UAAM,SAAS,gBAAgB,GAAG;AAClC,UAAM,eAAe,MAAM,iBAQxB,OAAO,kBAAkB,cAAc,CAAC,GAAG,EAAE,SAAS,OAAO,QAAQ,CAAC;AACzE,WAAO;AAAA,EACT;AAAA;AAEA,SAAsB,gBAAgB,IAQe;AAAA,6CARf;AAAA,IACpC;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAIqD;AACnD,UAAM,SAAS,gBAAgB,GAAG;AAClC,UAAM,eAAe,gBAAgB,EAAE,SAAS,OAAO,QAAQ,CAAC;AAChE,QAAI;AACF,UAAI,YAAY,OAAO,WAAW;AAChC,cAAM,cAAc,MAAM,aAAa,MAAW;AAAA,UAChD,cAAc;AAAA,UACd,YAAY;AAAA,UACZ,UAAU;AAAA,QACZ,CAAC;AACD,cAAM,UAAU,WAAW,YAAY,MAAM,IAAI,UAAM,OAAO;AAC9D,eAAO,EAAE,SAAS,YAAY,YAAY,OAAO;AAAA,MACnD,OAAO;AACL,cAAM,MAAM,MAAM;AAAA,UAChB;AAAA,UACA;AAAA,UACA,EAAE,YAAY,KAAK;AAAA,UACnB,EAAE,SAAS,OAAO,QAAQ;AAAA,QAC5B;AACA,cAAM,WACJ,YAAY,OAAO,WACf,OAAO,oBAEL,MAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA,CAAC;AAAA,UACD,EAAE,SAAS,OAAO,QAAQ;AAAA,QAC5B,GACA;AACR,cAAM,UAAU,WAAW,GAAG,IAAI,UAAM;AACxC,eAAO,EAAE,SAAS,YAAY,IAAI;AAAA,MACpC;AAAA,IACF,SAAS,OAAP;AACA,cAAQ,MAAM,0BAA0B,KAAK;AAC7C,aAAO,EAAE,SAAS,GAAG,YAAY,IAAI;AAAA,IACvC;AAAA,EACF;AAAA;AAEA,SAAsB,qBAAqB,MAAc,WAAmB,KAAU;AAAA;AACpF,UAAM,SAAS,gBAAgB,GAAG;AAClC,UAAM,EAAE,WAAW,IAAI,MAAM,gBAAgB,EAAE,MAAM,SAAS,OAAO,UAAU,IAAI,CAAC;AACpF,YAAQ,IAAI,sBAAsB,UAAU;AAC5C,QAAI,IAAI,WAAAC,QAAI,UAAU,EAAE,GAAG,SAAS,GAAG;AACrC,YAAM,OAAO,QAAQ;AAAA,QACnB,OAAO;AAAA,QACP,SAAS;AAAA,MACX,CAAC;AACD,aAAO,KAAK,OAAO,WAAW,QAAQ;AACtC,YAAM,IAAI,MAAM,mCAAmC;AAAA,IACrD;AAAA,EACF;AAAA;AAEA,IAAM,EAAE,cAAc,SAAS,IAAI;AACnC,SAAsB,0BAA0B,IAY7C;AAAA,6CAZ6C;AAAA,IAC9C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,EACV,GAMG;AACD,QAAI,CAAC;AAAW,aAAO,EAAE,OAAO,IAAI,SAAS,IAAI,WAAW,GAAG,MAAM,GAAG;AACxE,UAAM,kBAAkB,0BAAU,KAAK,SAAS;AAChD,UAAM,gBAAgB,gBAAgB,GAAG;AACzC,UAAM,WAAW,gBAAgB,EAAE,SAAS,cAAc,QAAQ,CAAC;AAEnE,UAAM,EAAE,OAAO,IAAI,MAAM,SAAS,MAAM;AAAA,MACtC,UAAU;AAAA,IACZ,CAAC;AAED,UAAM,eAAe,MAAM,SACxB,MAAwB;AAAA,MACvB,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,UAAU;AAAA,IACZ,CAAC,EACA,MAAM,CAAC,MAAW;AACjB,cAAQ,IAAI,0BAA0B,CAAC;AACvC,aAAO;AAAA,IACT,CAAC;AAEH,UAAM,YAAY,iCACb,eADa;AAAA,MAEhB,OAAO,QAAO,6CAAc,UAAS,CAAC;AAAA,IACxC;AAEA,UAAM,mBAAmB,MAAM,aAAa,EAAE,KAAK,UAAU,CAAC;AAE9D,QAAI,kBAAkB,UAAU,QAAQ,OAAO,CAAC;AAChD,QAAI,kBAAkB;AACpB,wBACE,OAAO,gBAAgB,IAAI,kBAAkB,OAAO,gBAAgB,IAAI;AAAA,IAC5E;AAEA,UAAM,aAAa,YAAY,QAC5B,IAAI,CAAC,WAAW;AACf,cAAQ,OAAO,MAAM;AAAA,QACnB,KAAK;AACH,iBAAO;AAAA,YACL,OAAO,OAAO;AAAA,YACd,OAAO,OAAO;AAAA,YACd,OAAO,OAAO,OAAO,GAAG;AAAA,YACxB,OAAO,OAAO,OAAO,OAAO;AAAA,UAC9B;AAAA,QACF,KAAK;AACH,iBAAO,SAAS,OAAO,OAAO,OAAO,OAAO,CAAC;AAAA,MACjD;AAAA,IACF,CAAC,EACA,OAAO,OAAO;AAEjB,UAAM,eAAe,iCAAa;AAAA,MAChC;AAAA,MACA;AAAA,MACA,YAAY;AAAA,MACZ,OAAO,eAAe,IAAI,OAAO,KAAK;AAAA,MACtC;AAAA,UACA,2BAAW,OAAO,IAAI;AAAA,IACxB;AAEA,UAAM,cAAU,sCAAkB,YAAY;AAC9C,UAAM,QAAQ,MAAM,KAAK,SAAS,CAAC,UAAU,OAAO,OAAO,KAAM,SAAS,EAAE,GAAG,MAAM,EAAE,CAAC,EAAE;AAAA,MACxF;AAAA,IACF;AACA,UAAM,OAAO,YAAAC,QAAK,OAAO,IAAI,WAAW,wBAAO,MAAM,OAAO,CAAC,CAAC;AAE9D,WAAO,EAAE,SAAS,OAAO,KAAK;AAAA,EAChC;AAAA;AASA,SAAsB,kBAAkB,QAAiC;AAAA;AACvE,UAAM,QAAQ,CAAC,GAAG,OAAO,YAAY;AACrC,YAAQ,IAAI,gCAAgC,KAAK;AAEjD,UAAM,EAAE,SAAS,IAAI,MAAM,qBAAqB,MAAM;AAEtD,WAAO;AAAA,EACT;AAAA;AAEA,SAAsB,qBAAqB,IASxC;AAAA,6CATwC;AAAA,IACzC;AAAA,IACA,cAAAC;AAAA,IACA;AAAA,IACA,cAAc;AAAA,EAChB,GAIG;AAxZH;AAyZE,UAAM,gBAAgB,gBAAgB,GAAG;AAEzC,UAAM,cAAc,MAAM,eAAe,EAAE,MAAM,IAAI,CAAC;AACtD,UAAM,mBAAkB,2CAAa,UAAU,cAAc,cAAa;AAC1E,UAAM,EAAE,SAAS,YAAY,IAAI,MAAM,gBAAgB;AAAA,MACrD;AAAA,MACA,SAAS,cAAc;AAAA,MACvB;AAAA,IACF,CAAC;AAED,UAAM,iBAAiBA,cAAa;AAAA,MAClC,CAAC,KAAK,OAAO;AACX,WAAG,QAAQ,QAAQ,CAAC,WAAgB;AAElC,cAAI,OAAO,OAAO,SAAS;AACzB,kBAAM,SAAS,OAAO,OAAO,OAAO,OAAO,IAAI,UAAM,cAAc;AACnE,oBAAQ,IAAI,wBAAwB,MAAM;AAC1C,gBAAI,OAAO,IAAI,KAAK,KAAK,MAAM;AAAA,UACjC;AAEA,cACE,GAAG,eAAe,cAAc,YAChC,CAAC,oBAAoB,aAAa,EAAE,SAAS,OAAO,OAAO,UAAU,GACrE;AACA,kBAAM,SAAS,OAAO,OAAO,OAAO,KAAK,MAAM,IAAI,UAAM,cAAc;AACvE,oBAAQ,IAAI,wBAAwB,MAAM;AAC1C,gBAAI,MAAM,IAAI,IAAI,KAAK,MAAM;AAAA,UAC/B;AAAA,QACF,CAAC;AACD,eAAO;AAAA,MACT;AAAA,MACA,EAAE,MAAM,IAAI,WAAAF,QAAI,CAAC,GAAG,KAAK,IAAI,WAAAA,QAAI,CAAC,EAAE;AAAA,IACtC;AAEA,UAAM,uBAAuB,IAAI,WAAAA,QAAI,WAAW,EAAE,MAAM,eAAe,IAAI,EAAE,SAAS;AAEtF,YAAQ,IAAI,2BAA2B,oBAAoB;AAC3D,YAAQ,IAAI,gCAAgC,eAAe;AAC3D,YAAQ,IAAI,iBAAiB,WAAW;AAExC,UAAM,YAAY,MAAM,QAAQ;AAAA,MAC9BE,cAAa;AAAA,QAAI,CAAC,aAAa,UAC7B,0BAA0B;AAAA,UACxB;AAAA,UACA,WAAW,cAAM,WAAW;AAAA,UAC5B,WAAW,cAAM,aAAa;AAAA,UAC9B;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAGA,QAAI,gBAAgB;AACpB,QAAI;AAGJ,QAAI,gBAAgB,QAAQ;AAC1B,cAAQ,IAAI,gDAAgD;AAC5D,sBAAgB;AAAA,IAClB,WAES,gBAAgB,OAAO;AAC9B,cAAQ,IAAI,qDAAqD;AACjE,sBAAgB;AAAA,IAClB,WAES,uBAAuB,KAAK;AACnC,cAAQ,IAAI,mDAAmD;AAC/D,sBAAgB;AAAA,IAClB;AAGA,QAAI;AAEJ,QAAI,eAAe;AAEjB,YAAM,YAAY,MAAM;AAAA,QACtB,cAAc;AAAA,QACd;AAAA,QACA,EAAE,WAAW,CAAC,cAAc,QAAQ,EAAE;AAAA,QACtC,EAAE,SAAS,cAAc,QAAQ;AAAA,MACnC;AAEA,cAAQ,IAAI,8BAA8B,SAAS;AAEnD,YAAM,MAAM,KAAK,IAAI,SAAO,eAAU,cAAc,cAAxB,mBAAmC,wBAAuB,CAAC,GAAG,GAAG;AAC7F,iBAAW,IAAI,SAAS;AACxB,cAAQ,IAAI,aAAa,QAAQ;AACjC,kBAAY,IAAI,WAAAF,QAAI,YAAY,GAAG,EAAE,IAAI,UAAU,MAAM,EAAE,QAAQ,CAAC;AAAA,IACtE,OAAO;AAEL,kBAAY,MAAM,sBAAsB;AAAA,QACtC,mBAAmB,cAAc;AAAA,QACjC,SAAS,cAAc;AAAA,QACvB,cAAc,UAAU,IAAI,CAAC,MAAM,EAAE,KAAK;AAAA,QAC1C;AAAA,MACF,CAAC;AAAA,IACH;AAEA,YAAQ,IAAI,kBAAkB,aAAa;AAC3C,YAAQ,IAAI,cAAc,SAAS;AAGnC,UAAM,aAAa,MAAM,uBAAuB,EAAE,MAAM,QAAQ,WAAW,IAAI,CAAC;AAGhF,WAAO,2BAA2B;AAAA,MAChC;AAAA,MACA;AAAA,MACA,cAAc;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAEA,SAAe,uBAAuB,IAQnC;AAAA,6CARmC;AAAA,IACpC;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAIG;AACD,UAAM,gBAAgB,gBAAgB,GAAG;AACzC,WAAO;AAAA,MACL,UAAU;AAAA,MACV,YAAY,cAAc;AAAA,MAC1B,SAAS;AAAA,QACP;AAAA,UACE,MAAM;AAAA,UACN,QAAQ;AAAA,YACN,YAAY;AAAA,YACZ,MAAM;AAAA,cACJ,aAAa,cAAc;AAAA,cAC3B;AAAA,cACA,KAAK,KAAK,UAAU,OAAO;AAAA,YAC7B;AAAA,YACA,KAAK,IAAI,WAAAA,QAAI,EAAE,EAAE,IAAI,UAAM,GAAE,EAAE,QAAQ,CAAC;AAAA,YACxC,SAAS;AAAA,UACX;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAEA,SAAe,2BAA2B,IAcvC;AAAA,6CAduC;AAAA,IACxC;AAAA,IACA;AAAA,IACA,cAAAE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAOG;AACD,UAAM,gBAAgB,gBAAgB,GAAG;AACzC,UAAM,EAAE,OAAO,cAAc,IAAI,MAAM,0BAA0B;AAAA,MAC/D,aAAa;AAAA,MACb,WAAW,cAAM,WAAW;AAAA,MAC5B,WAAW,cAAM,aAAa;AAAA,MAC9B,OAAO;AAAA,MACP;AAAA,IACF,CAAC;AAED,QAAI;AACJ,QAAI,iBAAiB,UAAU;AAC7B,oBAAc,IAAI,WAAAF,QAAI,QAAQ,EAAE,IAAIE,cAAa,SAAS,CAAC,EAAE,QAAQ,CAAC;AAAA,IACxE,OAAO;AACL,oBAAc,MAAM,sBAAsB;AAAA,QACxC,mBAAmB,cAAc;AAAA,QACjC,SAAS,cAAc;AAAA,QACvB,cAAc,CAAC,eAAe,GAAGA,cAAa,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAAA,QACjE;AAAA,MACF,CAAC;AAAA,IACH;AAEA,IAAC,WAAW,QAAQ,GAAW,OAAO,KAAK,SAAS;AAEpD,WAAO,EAAE,wBAAwB,YAAY,eAAe,UAAU,YAAY;AAAA,EACpF;AAAA;AAEA,SAAe,sBAAsB,IAUjB;AAAA,6CAViB;AAAA,IACnC;AAAA,IACA;AAAA,IACA,cAAAA;AAAA,IACA;AAAA,EACF,GAKoB;AAClB,UAAM,gBAAgB,gBAAgB,GAAG;AACzC,UAAM,sBAAsBA,cAAa,MAAM,CAAC,OAAO,GAAG,SAAS,CAAC;AACpE,UAAM,eAAe,sBACjB,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,mBAAmBA;AAAA,MACrB;AAAA,MACA,EAAE,SAAS,cAAc,QAAQ;AAAA,IACnC,IACA;AAEJ,UAAM,qBAAqB,IAAI,WAAAF,QAAI,YAAY,EAAE,IAAI,GAAG,EAAE,QAAQ,CAAC;AACnE,UAAM,gBAAgB,MAAME,cAAa;AACzC,UAAM,YAAY,KAAK,IAAI,OAAO,kBAAkB,GAAG,aAAa;AACpE,YAAQ,IAAI,iBAAiB,kBAAkB;AAC/C,WAAO,UAAU,SAAS;AAAA,EAC5B;AAAA;;;AHpmBA,cAAyB;AAEzB,wBAAuB;AAEvB,UAAqB;AAKb,mBAAW,GAAG;AAGtB,IAAM,8BAA8B;AAEpC,IAAM,8BAA8B;AAEpC,IAAM,iCAAiC;AAEvC,SAAS,iBAAiB;AACxB,MAAI,OAAO,WAAW,eAAe,CAAC,OAAO,YAAY;AACvD,UAAM,IAAI,MAAM,kCAAkC;AAAA,EACpD;AACA,SAAO,OAAO;AAChB;AAEA,SAAe,aAAa;AAAA;AAC1B,QAAI;AACF,YAAM,UAAU,MAAM,eAAe,EAAE,WAAW;AAClD,cAAQ,IAAI,gBAAgB,OAAO;AACnC,aAAO,YAAY,YAAY,YAAY;AAAA,IAC7C,SAAS,OAAP;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAEA,SAAS,gBAAgB,QAAyB;AAChD,SAAO,IAAI,YAAAC,QAAI,MAAM,EAAE,IAAI,UAAM,EAAC,EAAE,QAAQ;AAC9C;AAEA,SAAe,eAAe;AAAA;AAC5B,UAAM,UAAU,MAAM,WAAW;AACjC,WAAO,WAAW;AAAA,EACpB;AAAA;AAEA,SAAe,SAAY,YAAoB,YAAoB,MAAW;AAAA;AAC5E,UAAM,UAAU,MAAM,WAAW;AACjC,WAAO,iBAAoB,YAAY,YAAY,MAAM,EAAE,QAAQ,CAAC;AAAA,EACtE;AAAA;AAMA,SAAsB,kBACpB,MACA,KACA,aACyC;AAAA;AAzE3C;AA0EE,UAAM,cAAc,MAAM,eAAe,EAAE,MAAM,IAAI,CAAC;AACtD,UAAM,aAAa,IAAI,YAAAA,UAAI,gDAAa,cAAb,mBAAwB,yBAAwB,CAAC,EACzE,OAAK,gDAAa,cAAb,mBAAwB,6BAA4B,CAAC,EAC1D,SAAS;AACZ,UAAM,mBAAmB,EAAC,2CAAa,SACnC,gCACA,gDAAa,gBAAb,mBAA0B,WAAU;AACxC,UAAM,iBAAiB,IAAI,YAAAA,QAAI,UAAU,EAAE,GAAG,CAAC;AAC/C,UAAM,uBAAuB,IAAI,YAAAA,QAAI,gBAAgB,EAAE,GAAG,CAAC;AAC3D,QAAI,CAAC,kBAAkB,CAAC;AAAsB;AAC9C,UAAM,SAAS,gBAAgB,GAAG;AAClC,UAAM,iBAAiB,iBAAiB,aAAa;AAErD,UAAM,SAAS;AAAA,MACb,aAAa,OAAO;AAAA,MACpB,QAAQ,eAAe,SAAS;AAAA,MAChC,KAAK,KAAK,UAAU,iBAAiB,UAAU,YAAY;AAAA,IAC7D;AAEA,QAAI,CAAC;AAAa,aAAO;AAEzB,YAAQ,IAAI,6BAA6B,MAAM;AAE/C,UAAM,EAAE,iBAAiB,IAAI,MAAM,iBAAiB,OAAO,QAAQ;AAAA,MACjE;AAAA,IACF,CAAC;AAED,UAAM,kBAAkB,IAAI,YAAAA,QAAI,gBAAgB,EAAE,MAAM,cAAc,EAAE,SAAS;AAEjF,UAAM,YAAY,MAAM,OAAO,QAAQ;AAAA,MACrC,OAAO,iBAAiB,sBAAsB;AAAA,MAC9C,SAAS,iBACL,yDAAyD,gBAAgB,gBAAgB,mBAAmB,gBAAgB,cAAc,2DAA2D,gBAAgB,eAAe,4CACpO,2DAA2D,gBAAgB,gBAAgB,mBAAmB,gBAAgB,cAAc,yDAAyD,gBAAgB,eAAe;AAAA,IAC1O,CAAC;AAED,QAAI,WAAW;AACb,YAAM,2BAA2B,EAAE,QAAQ,iBAAiB,SAAS,GAAG,QAAQ,IAAI,CAAC;AAErF,YAAM,OAAO,MAAM;AAAA,QACjB,OAAO;AAAA,QACP,SAAS,uBAAuB,gBAAgB,cAAc,2BAA2B,iBAAiB,SAAS,oCAAoC,gBAAgB,eAAe;AAAA,MACxL,CAAC;AAAA,IACH,OAAO;AACL,YAAM,IAAI,MAAM,iDAAiD;AAAA,IACnE;AAAA,EACF;AAAA;AAcA,SAAsB,iBAAkC;AAAA;AACtD,UAAM,UAAU,MAAM,WAAW;AACjC,UAAM,iBAAiB,YAAY,YAAY,IAAI;AACnD,QAAI;AACF,YAAM,YAAY,MAAM,aAAa;AACrC,YAAM,MAAM,MAAM,MAAM,GAAG,+BAA+B,EAAE,KAAK,CAACC,SAAQA,KAAI,KAAK,CAAC;AACpF,YAAM,UAAU,IAAI;AACpB,aAAO,WAAW;AAAA,IACpB,SAAS,OAAP;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAEA,SAAsB,YAAY,SAAiB;AAAA;AACjD,UAAM,YAAY,MAAM,aAAa;AACrC,UAAM,QAA6D,MAAM;AAAA,MACvE,GAAG,qBAAqB;AAAA,IAC1B,EAAE,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC;AAC1B,WAAO,MAAM,OAAO,CAAC,SAAS,KAAK,OAAO,SAAS;AAAA,EACrD;AAAA;AAEA,SAAsB,gBAAgB,SAAiB,QAAgB,SAAkB;AAAA;AACvF,UAAM,WAAW,YAAY,MAAM,eAAe;AAClD,UAAM,QAAQ,MAAM,YAAY,OAAO;AACvC,UAAM,EAAE,IAAI,QAAI,kBAAAC,SAAW,OAAO,CAAC,EAAE,SAAS,SAAS,OAAO,OAAO,CAAC,GAAG,KAAK,KAAK,QAAQ,CAAC;AAC5F,YAAQ,IAAI,wBAAwB,GAAG;AACvC,WAAO;AAAA,EACT;AAAA;AAEA,SAAsB,cAAc,SAAkB;AAAA;AACpD,QAAI,CAAC,SAAS;AACZ,YAAM,MAAM,MAAM,eAAe,gBAAgB,CAACD,SAAQ,CAAC,CAACA,KAAI,OAAO;AAEvE,UAAI,CAAC,IAAI,SAAS;AAChB,gBAAQ,MAAM,+BAA+B;AAC7C,eAAO,EAAE,YAAY,GAAG,SAAS,GAAG,kBAAkB,EAAE;AAAA,MAC1D;AACA,gBAAU,IAAI;AAAA,IAChB;AAEA,UAAM,QAAQ,MAAM,YAAY,OAAO;AAEvC,UAAM,cAAc;AAEpB,UAAM,cAAa,+BAAO,OAAO,CAAC,KAAK,QAAQ,MAAM,IAAI,OAAO,OAAM;AACtE,UAAM,UAAU,aAAa,UAAM;AAEnC,UAAM,eAAe,MAAM,gBAAgB,SAAS,UAAU;AAE9D,UAAM,uBAAuB,aAAa,cAAc,QAAQ,CAAC;AAEjE,UAAM,mBAAmB,IAAI,YAAAD,QAAI,mBAAmB,EACjD,IAAI,UAAM,YAAW,EACrB,MAAM,aAAa,YAAAA,QAAI,SAAS,EAChC,SAAS;AAEZ,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,kBAAkB,KAAK,IAAI,kBAAkB,CAAC;AAAA,IAChD;AAAA,EACF;AAAA;AAEA,SAAsB,YAAY,SAAiB,QAAgB,SAAiB;AAAA;AAClF,UAAM,EAAE,aAAAG,aAAY,IAAI,eAAe;AACvC,UAAM,SAAS,MAAMA,aAAY,SAAS,QAAQ,EAAE,QAAQ,CAAC;AAC7D,WAAO;AAAA,EACT;AAAA;AAEA,SAAsB,YAAY,SAAiB;AAAA;AACjD,UAAM,EAAE,aAAAC,cAAa,aAAa,IAAI,eAAe;AACrD,UAAM,YAAY,MAAM,aAAa;AACrC,UAAM,YAAY,MAAMA,aAAY,OAAO;AAC3C,WAAO,EAAE,WAAW,UAAU;AAAA,EAChC;AAAA;AAGA,SAAsB,sBACpB,QACA,QAGA;AAAA;AACA,WAAO;AAAA,EACT;AAAA;AAEA,SAAsB,iBACpB,QACA,QAMA;AAAA;AApOF;AAqOE,UAAM,OAAM,iCAAQ,QAAO;AAC3B,UAAM,+BAA8B,sCAAQ,+BAAR,YAAsC;AAC1E,UAAM,QAAO,iCAAQ,UAAS,MAAM,iBAAiB,GAAG;AACxD,UAAM,cAAc,MAAM,eAAe,EAAE,MAAM,IAAI,CAAC;AACtD,UAAM,aAAa,MAAM,kBAAkB,MAAM,KAAK,KAAK;AAC3D,UAAM,eAAc,yCAAY,WAAU;AAC1C,UAAM,gBAAgB,OAAO,MAAM;AACnC,UAAM;AAAA,MACJ,oBAAoB,EAAE,SAAS,SAAS;AAAA,MACxC;AAAA,IACF,IAAI,MAAM,gBAAgB,EAAE,IAAI,CAAC;AAEjC,UAAM,cAAc,KAAK,IAAI,OAAO,OAAO,GAAG,gBAAgB,QAAQ;AACtE,UAAM,6BACJ,EAAC,2CAAa,UAAS,8BAA8B,iCAAiC;AACxF,QAAI,gBAAgB,IAAI,YAAAJ,QAAI,aAAa,EACtC,MAAM,WAAW,EACjB,MAAM,WAAW,EACjB,MAAM,GAAG,YAAAA,QAAI,SAAS,EACtB,SAAS;AACZ,oBAAgB,KAAK,IAAI,eAAe,CAAC;AAEzC,UAAM,mBAAmB,IAAI,YAAAA,QAAI,sBAAsB,CAAC,EACrD,KAAK,0BAA0B,EAC/B,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,MAAM,GAAG,YAAAA,QAAI,OAAO,EACpB,SAAS;AAEZ,YAAQ;AAAA,MACN,qBAAqB,sBAAsB,wBAAwB,gCAAgC,iBAAiB;AAAA,IACtH;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAEA,SAAsB,iBAAiB,KAAU;AAAA;AAC/C,UAAM,SAAS,gBAAgB,GAAG;AAClC,UAAM,EAAE,aAAa,IAAI,eAAe;AACxC,UAAM,eAAe,MAAM,aAAa;AACxC,QAAI,CAAC,cAAc;AACjB,YAAM,IAAI,MAAM,kCAAkC;AAAA,IACpD;AACA,UAAM,OAAO,MAAM;AAAA,MACjB,OAAO;AAAA,MACP;AAAA,MACA;AAAA,QACE,gBAAgB;AAAA,MAClB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAEA,SAAS,8BAA8B;AAjSvC;AAkSE,QAAM,QACJ,kBAAa,uBAAuB,MAApC,mBAAuC;AAAA,IACrC;AAAA;AAEJ,MAAI,CAAC;AAAM;AACX,QAAM,UAAU,6BAAO;AACvB,MAAI,QAAQ,eAAe,YAAY,CAAC,CAAC,UAAU,MAAM,EAAE,SAAS,QAAQ,WAAW,GAAG;AACxF,UAAM,IAAI,MAAM,sDAAsD;AAAA,EACxE;AACF;AA0BA,SAAsB,2BAAqD,IASW;AAAA,6CATX;AAAA,IACzE;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa;AAAA,IACb;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA;AAAA,EACF,GAAsF;AACpF,QAAI;AACF,cAAQ,IAAI,oCAAoC;AAAA,QAC9C;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AACD,kCAA4B;AAC5B,YAAM,EAAE,aAAa,IAAI,eAAe;AAExC,YAAM,SAAS,gBAAgB,GAAG;AAElC,YAAM,eAAe,MAAM,aAAa;AAExC,UAAI,CAAC,cAAc;AACjB,cAAM,IAAI,MAAM,kCAAkC;AAAA,MACpD;AACA,UAAI,CAAC,UAAU,CAAC,QAAQ;AACtB,cAAM,IAAI,MAAM,sCAAsC;AAAA,MACxD;AAEA,YAAM,OAAO,MAAM,iBAAiB,GAAG;AAEvC,YAAM,gBAAgB,IAAI,YAAAA,QAAI,WAAU,iCAAQ,WAAU,CAAC,EAAE,MAAM,GAAG,YAAAA,QAAI,SAAS,EAAE,SAAS;AAE9F,cAAQ,IAAI,iBAAiB,aAAa;AAE1C,UAAI,iBAAiB,GAAG;AACtB,cAAM,IAAI,MAAM,wBAAwB;AAAA,MAC1C;AAEA,YAAM,EAAE,eAAe,aAAa,aAAa,iBAAiB,IAAI,MAAM;AAAA,QAC1E,cAAc,SAAS;AAAA,QACvB;AAAA,UACE;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAEA,UAAI,gBAAgB,kBAAkB;AACpC,cAAM,IAAI;AAAA,UACR,gDAAgD,gBAAgB,gBAAgB;AAAA,QAClF;AAAA,MACF;AAEA,YAAM,cAAc,MAAM,eAAe,EAAE,MAAM,IAAI,CAAC;AAEtD,YAAM,aAAa,CAAC;AAEpB,YAAM,aAAa,MAAM,kBAAkB,MAAM,KAAK,KAAK;AAE3D,UAAI,YAAY;AACd,mBAAW,KAAK,iCACX,aADW;AAAA,UAEd,KAAK;AAAA,QACP,EAAC;AAAA,MACH;AAGA,UAAI,QAAQ;AACV,mBAAW,KAAK,iCACX,SADW;AAAA,UAEd,KAAK;AAAA,QACP,EAAC;AAAA,MACH;AAEA,YAAM,oBAOF,CAAC;AAEL,YAAM,sBACJ,wBACC,iCAAQ,gBAAe,OAAO,UAAU,QAAQ,OAAO,mBAAmB,OAAO,QAAQ;AAC5F,cAAQ,IAAI,iDAAiD,mBAAmB;AAEhF,YAAM,cAAc,MAAM,SAGvB,qBAAqB,sBAAsB;AAAA,QAC5C,YAAY;AAAA,MACd,CAAC;AAED,UAAI,EAAC,2CAAa,YAAW;AAC3B,0BAAkB,sBAAsB;AAAA,UACtC,aAAa;AAAA,UACb,SAAS,mBAAmB;AAAA,UAC5B,mBAAmB;AAAA,QACrB;AAAA,MACF;AAEA,UAAI,EAAC,2CAAa,QAAO;AACvB,0BAAkB,iBAAiB;AAAA,MACrC;AAEA,YAAM,aAAyB;AAAA,QAC7B,cAAc;AAAA,QACd,cAAc,WAAW,SAAS,IAAI,aAAa;AAAA,QACnD,WACE,OAAO,KAAK,iBAAiB,EAAE,SAAS,IAAI,KAAK,UAAU,iBAAiB,IAAI;AAAA,MACpF;AAEA,cAAQ,IAAI,oCAAoC,EAAE,aAAa,WAAW,CAAC;AAC3E,YAAM,qBAAqB,MAAM;AAAA,QAC/B,OAAO;AAAA,QACP;AAAA,QACA,EAAE,aAAa,WAAW;AAAA,MAC5B;AACA,YAAM,WAAW,YAAY,MAAM,eAAe;AAGlD,cAAQ,MAAM;AAAA,QACZ,wBAAwB;AAAA,QACxB,kBAAkB;AAAA,QAClB,gBAAgB;AAAA,QAChB,gBAAgB;AAAA,QAChB,kBAAkB;AAAA,QAClB,YAAY;AAAA,MACd,CAAC;AAED,YAAM,iBAAiB,WAAW,SAAS,IAAI,KAAK,UAAU,UAAU,IAAI;AAE5E,YAAM,qBAAqB;AAAA,QACzB;AAAA,QACA;AAAA,QACA,aAAa,kBAAkB,WAAW,YAAY,IAAI;AAAA,QAC1D,aAAa;AAAA,QACb,UAAU,WAAW;AAAA,MACvB,CAAC;AAED,YAAM,SAAS,MAAM,YAAY,oBAAoB,eAAe,QAAQ;AAE5E,YAAM,kBAAkB;AAAA,QACtB;AAAA,QACA;AAAA,QACA;AAAA,QACA,aAAa,kBAAkB,WAAW,YAAY,IAAI;AAAA,QAC1D,aAAa;AAAA,QACb,UAAU,WAAW;AAAA,MACvB,CAAC;AAED,UAAI,CAAC,YAAY;AACf,eAAO;AAAA,MACT;AAEA,YAAM,4BAA4B,MAAM,6BAA6B;AAAA,QACnE;AAAA,QACA,WAAW;AAAA,QACX;AAAA,MACF,CAAC;AACD,YAAM,UAAU,MAAM,WAAW;AACjC,YAAM,SAAS,MAAM,wBAAwB,SAAS,CAAC,0BAA0B,QAAQ,CAAC;AAC1F,aAAO;AAAA,IACT,SAAS,OAAP;AACA,cAAQ,MAAM,qCAAqC,KAAK;AACxD,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAEA,SAAsB,sBAAsB,cAAsB,MAAW,WAAW;AAAA;AACtF,QAAI,QAAQ;AAAW;AACvB,UAAMK,WAAU,aAAa;AAC7B,UAAM,iBAAiBA,YAAA,gBAAAA,SAAS,IAAY;AAC5C,QAAI,CAAC,gBAAgB;AACnB,aAAO,MAAM;AAAA,QACX,OAAO;AAAA,QACP,SACE;AAAA,MACJ,CAAC;AACD,MAAAA,YAAA,gBAAAA,SAAS,IAAI,0BAA0B;AAAA,IACzC;AACA,QAAI,CAAC;AAAc;AACnB,UAAM,YAAY,MAAM,aAAa,EAAE,IAAI,CAAC;AAC5C,QAAI,EAAC,uCAAW;AAAQ;AACxB,UAAM,gBAAgB,UAAU,SAAS,YAAY;AACrD,QAAI,CAAC,eAAe;AAClB,aAAO,MAAM;AAAA,QACX,OAAO;AAAA,QACP,SAAS;AAAA;AAAA,QAET,oBAAoB;AAAA,QACpB,UAAU;AAAA,MACZ,CAAC;AACD,YAAM,IAAI,MAAM,4BAA4B;AAAA,IAC9C;AAAA,EACF;AAAA;AAUA,SAAsB,uBAAuB,IAMJ;AAAA,6CANI;AAAA,IAC3C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM;AAAA,EACR,GAAyC;AACvC,UAAM,SAAS,gBAAgB,GAAG;AAClC,QAAI,cAAc,cAAc,eAAe,EAAE;AACjD,QAAI,CAAC,aAAa;AAChB,YAAM,eAAe,EAAE,YAAY;AACnC,oBAAc,eAAe,EAAE;AAC/B,UAAI,CAAC,aAAa;AAChB,cAAM,IAAI,MAAM,+BAA+B;AAAA,MACjD;AAAA,IACF;AACA,UAAM,QAAQ,SAAS,MAAM,iBAAiB,GAAG;AAGjD,UAAM,EAAE,QAAQ,SAAS,SAAS,UAAU,YAAY,OAAO,IAAI,MAAM,kBAAkB;AAAA,MACzF;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,YAAY;AAAA,MACZ;AAAA,IACF,CAAC;AAED,QAAI,WAAW,CAAC,UAAU,CAAC,SAAS;AAClC,YAAM,IAAI,MAAM,QAAQ;AAAA,IAC1B;AACA,YAAQ,IAAI,WAAW,KAAK,UAAU,MAAM,CAAC;AAC7C,YAAQ,IAAI,YAAY,KAAK,UAAU,OAAO,CAAC;AAE/C,YAAQ,IAAI,wBAAwB;AACpC,YAAQ;AAAA,MACN,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,KAAK,EAAE,KAAK,KAAK,SAAS,QAAQ,IAAI,CAAC,SAAS,KAAK,KAAK,EAAE,KAAK,KAAK,QAAQ;AAAA,IAC9G;AAEA,UAAM,UAAU,MAAM,WAAW;AACjC,UAAM,aAAa,YAAY,YAAoB,iBAAS,UAAkB,iBAAS;AACvF,UAAM,OAAO,IAAY,aAAK,EAAE,SAAS,WAAW,CAAC;AAGrD,UAAM,YAAY,MAAM,aAAa;AACrC,UAAM,QAAQ;AAAA,MACZ,OAAO,IAAI,CAAO,UAAU;AAC1B,cAAM,SAAS,MAAM,MAAM,GAAG,gBAAgB,MAAM,MAAM,EAAE,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC;AAEpF,cAAM,eAAe;AAAA,UACnB,MAAM,MAAM;AAAA,UACZ,OAAO,MAAM;AAAA,UACb,UAAU;AAAA,UACV,aAAa;AAAA,YACX,QAAQ,OAAO,KAAK,OAAO,KAAK,MAAM,MAAM,cAAc,KAAK;AAAA,YAC/D,OAAO,MAAM;AAAA,UACf;AAAA,QACF;AAEA,aAAK,SAAS,YAAY;AAAA,MAC5B,EAAC;AAAA,IACH;AAGA,YAAQ,QAAQ,CAAC,WAA+C;AAC9D,WAAK,UAAU;AAAA,QACb,SAAS,OAAO;AAAA,QAChB,OAAO,OAAO;AAAA,MAChB,CAAC;AAAA,IACH,CAAC;AAGD,UAAM,UAAU,OAAO,IAAI,CAAC,SAAwD;AAClF,aAAO,GAAG,KAAK,QAAQ,KAAK;AAAA,IAC9B,CAAC;AAED,UAAM,YAAY,KAAK,UAAU,IAAI,CAAC,SAAgD;AACpF,aAAO;AAAA,QACL,eAAe,gBAAgB,KAAK,MAAM;AAAA,QAC1C,OAAO,KAAK;AAAA,MACd;AAAA,IACF,CAAC;AAED,UAAM,MAAM;AAAA,MACV,UAAU;AAAA,QACR,oBAAoB;AAAA,QACpB,OAAO;AAAA,QACP,QAAQ;AAAA,MACV;AAAA,IACF;AAGA,UAAM,cAA2B;AAAA,MAC/B,YAAY,OAAO;AAAA,MACnB,UAAU;AAAA,MACV,SAAS;AAAA,QACP;AAAA,UACE,MAAM;AAAA,UACN,QAAQ;AAAA,YACN,YAAY;AAAA,YACZ,MAAM;AAAA,cACJ,aAAa,OAAO;AAAA,cACpB,QAAQ,yCAAY;AAAA,cACpB,KAAK,KAAK,UAAU,GAAG;AAAA,YACzB;AAAA,YACA,KAAK;AAAA,YACL,SAAS;AAAA,UACX;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,YAAQ,IAAI,oCAAoC;AAChD,WAAO;AAAA,EACT;AAAA;AAoBA,SAAsB,kBAAkB,IAMsB;AAAA,6CANtB;AAAA,IACtC;AAAA,IACA,SAAS;AAAA,IACT,MAAM;AAAA,IACN,YAAY;AAAA,IACZ;AAAA,EACF,GAA8D;AAC5D,QAAI;AACF,YAAM,SAAS,gBAAgB,GAAG;AAElC,UAAI,aAAa,eAAe,eAAe,EAAE;AACjD,UAAI,CAAC,YAAY;AACf,cAAM,eAAe,EAAE,YAAY;AACnC,qBAAa,eAAe,EAAE;AAC9B,YAAI,CAAC,YAAY;AACf,gBAAM,IAAI,MAAM,+BAA+B;AAAA,QACjD;AAAA,MACF;AACA,YAAM,OAAO,UAAU,MAAM,iBAAiB,GAAG;AAEjD,YAAM,UAAU,aAAa,MAAM,eAAe;AAElD,YAAM,WAAW,MAAM,kBAAkB;AAAA,QACvC;AAAA,QACA,cAAc;AAAA,UACZ;AAAA,YACE,UAAU;AAAA,YACV,YAAY,OAAO;AAAA,YACnB,SAAS;AAAA,cACP;AAAA,gBACE,MAAM;AAAA,gBACN,QAAQ;AAAA,kBACN,YAAY;AAAA,kBACZ,MAAM;AAAA,oBACJ,aAAa,OAAO;AAAA,oBACpB,QAAQ;AAAA,oBACR,KAAK;AAAA,kBACP;AAAA,kBACA,KAAK;AAAA,kBACL,SAAS;AAAA,gBACX;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,MACF,CAAC;AAED,UAAI,WAAW,OAAO,MAAM;AAC5B,UAAI,OAAO,QAAQ,IAAI,GAAG;AACxB,mBAAW,IAAI,YAAAL,QAAI,MAAM,EAAE,MAAM,QAAQ,EAAE,SAAS;AAAA,MACtD;AAEA,YAAM,YAAY,MAAM,gBAAgB,EAAE,IAAI,CAAC;AAE/C,YAAM,UAAU,MAAM,iBASpB,OAAO,kBAAkB,mBAAmB,CAAC,GAAG,EAAE,SAAS,OAAO,QAAQ,CAAC;AAE7E,UAAI,UAAU,qBAAqB;AACjC,YAAI,OAAO,QAAQ,IAAI,OAAO,UAAU,mBAAmB,GAAG;AAC5D,iBAAO;AAAA,YACL,aAAa;AAAA,YACb,SAAS;AAAA,YACT,UAAU,8BAA8B,gBAAgB,OAAO,UAAU,mBAAmB,IAAI,OAAO,QAAQ,CAAC;AAAA,UAClH;AAAA,QACF;AAAA,MACF;AAEA,YAAM,aAAa,OAAO,UAAU,oBAAoB,QAAQ,IAAI,OAAO,QAAQ;AACnF,YAAM,cACJ,aAAa,OAAO,UAAU,oBAAoB,OAAO,IACrD,aACA,OAAO,UAAU,oBAAoB,OAAO;AAElD,YAAM,wBAAwB,UAAU;AAExC,YAAM,QAAQ,OAAO,KAAK,OAAO,EAC9B,IAAI,CAAC,QAAQ;AACZ,cAAM,OAAO,IAAI,MAAM,GAAG;AAC1B,eAAO;AAAA,UACL,MAAM,KAAK;AAAA,UACX,MAAM,QAAQ,KAAK;AAAA,UACnB,OAAO,OAAO,QAAQ,KAAK,OAAO;AAAA,UAClC,QAAQ,QAAQ,KAAK;AAAA,QACvB;AAAA,MACF,CAAC,EACA,OAAO,CAAC,SAAS,KAAK,QAAQ,OAAO,UAAU,iBAAiB,CAAC;AAEpE,UAAI,CAAC,SAAS,MAAM,WAAW,GAAG;AAChC,eAAO;AAAA,UACL;AAAA,UACA,SAAS;AAAA,UACT,UAAU;AAAA,QACZ;AAAA,MACF;AAEA,YAAM,eAAe,OAAO,QAAQ;AACpC,YAAM,YAAY,OAAO,UAAU,eAAe;AAElD,YAAM,EAAE,QAAQ,SAAS,IAAI,QAAI,kBAAAE;AAAA,QAC/B;AAAA,QACA,CAAC,EAAE,SAAS,YAAY,OAAO,aAAa,CAAC;AAAA,QAC7C,KAAK,KAAK,OAAO;AAAA,MACnB;AAEA,YAAM,YAAY;AAClB,UAAI,aAAa;AACjB,UAAI,SAAS;AAEb,UAAI,CAAC,cAAc,WAAW,WAAW,GAAG;AAC1C,eAAO;AAAA,UACL;AAAA,UACA,SAAS;AAAA,UACT,UAAU;AAAA,QACZ;AAAA,MACF;AAEA,UAAI,YAAY;AAChB,eAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AAC1C,cAAM,SAAS,WAAW;AAC1B,YAAI,OAAO,MAAM,SAAS,MAAM,aAAa,SAAS,GAAG;AACvD,uBAAa;AAAA,QACf,OAAO;AACL,yBAAe;AAAA,QACjB;AACA,YAAI,CAAC,OAAO,SAAS;AACnB,iBAAO,UAAU;AAAA,QACnB;AAAA,MACF;AAEA,UAAI,MAAM;AACV,UAAI,SAAS,WAAW;AACtB,cAAM,SAAS;AACf,iBAAS;AAET,eAAO;AAAA,UACL,QAAQ;AAAA,UACR;AAAA,UACA,SAAS;AAAA,UACT,UAAU;AAAA,QACZ;AAAA,MACF;AAEA,iBAAW,QAAQ,IAAI,YAAAF,QAAI,WAAW,KAAK,EAAE,MAAM,MAAM,EAAE,MAAM,WAAW,EAAE,SAAS;AAEvF,UAAI,WAAW,QAAQ,GAAG;AACxB,eAAO;AAAA,UACL,QAAQ;AAAA,UACR;AAAA,UACA,SAAS;AAAA,UACT,UAAU;AAAA,QACZ;AAAA,MACF;AAEA,UAAI,cAAc;AAChB,YAAI,CAAC,aAAa,SAAS;AACzB,uBAAa,UAAU;AAAA,QACzB;AACA,qBAAa,QAAQ,IAAI,YAAAA,QAAI,aAAa,KAAK,EAC5C,KAAK,MAAM,EACX,KAAK,WAAW,EAChB,KAAK,GAAG,EACR,SAAS;AAAA,MACd,OAAO;AACL,uBAAe;AAAA,UACb,SAAS;AAAA,UACT,OAAO,IAAI,YAAAA,QAAI,MAAM,EAAE,KAAK,WAAW,EAAE,KAAK,GAAG,EAAE,SAAS;AAAA,QAC9D;AACA,mBAAW,KAAK,YAAY;AAAA,MAC9B;AAEA,UAAI,WAAW,KAAK,IAAI,GAAG,UAAU,IAAI,CAAC,UAAe,MAAM,KAAK,CAAC;AACrE,UAAI,yBAAyB,aAAa;AAE1C,aAAO,0BAA0B,YAAY,WAAW,KAAK,UAAU,SAAS,GAAG;AACjF,kCAA0B;AAC1B,qBAAa,QAAQ;AACrB,cAAM,gBAAgB,UAAU,UAAU,CAAC,UAAe,MAAM,UAAU,QAAQ;AAClF,YAAI,gBAAgB,IAAI;AACtB,oBAAU,OAAO,eAAe,CAAC;AAAA,QACnC;AACA,mBAAW,KAAK,IAAI,GAAG,UAAU,IAAI,CAAC,UAAe,MAAM,KAAK,CAAC;AAAA,MACnE;AAEA,UAAI,UAAU;AACd,UAAI,aAAa,UAAU,GAAG;AAC5B,qBAAa,WAAW,OAAO,CAAC,SAAc,KAAK,UAAU,CAAC;AAAA,MAChE,WAAW,aAAa,QAAQ,OAAO,UAAU,iBAAiB,GAAG;AACnE,kBAAU,OAAO,UAAU,iBAAiB,IAAI,aAAa;AAC7D,mBAAW,SAAS;AACpB,qBAAa,QAAQ,OAAO,UAAU,iBAAiB;AAAA,MACzD;AAEA,YAAM,qBAAqB,WAAW,KAAK,CAAC,SAAc,KAAK,QAAQ,CAAC;AACxE,UAAI,oBAAoB;AACtB,eAAO;AAAA,UACL,QAAQ;AAAA,UACR;AAAA,UACA,SAAS;AAAA,UACT,UAAU;AAAA,QACZ;AAAA,MACF;AAGA,YAAM,uBAAuB,WAAW;AAAA,QACtC,CAAC,SAAc,KAAK,QAAQ,KAAK,KAAK,QAAQ,OAAO,UAAU,iBAAiB;AAAA,MAClF;AACA,UAAI,sBAAsB;AAExB,cAAM,oBAAoB,IAAI,YAAAA,QAAI,UAAU,mBAAmB,EAC5D,KAAK,UAAU,iBAAiB,EAChC,KAAK,QAAQ,EACb,KAAK,WAAW,EAChB,SAAS;AAEZ,eAAO;AAAA,UACL,QAAQ;AAAA,UACR;AAAA,UACA,SAAS;AAAA,UACT,UAAU,mDAAmD,gBAAgB,iBAAiB;AAAA,QAChG;AAAA,MACF;AAEA,YAAM,WAAW,UAAU,OAAO,CAAC,KAAa,QAAa,MAAM,OAAO,IAAI,KAAK,GAAG,CAAC;AACvF,YAAM,YAAY,WAAW,OAAO,CAAC,KAAa,QAAa,MAAM,OAAO,IAAI,KAAK,GAAG,CAAC;AAEzF,UAAI,SAAS,cAAc,UAAU;AACnC,eAAO;AAAA,UACL;AAAA,UACA,SAAS;AAAA,UACT,UAAU;AAAA,QACZ;AAAA,MACF;AACA,aAAO;AAAA,QACL,aAAa,IAAI,YAAAA,QAAI,WAAW,EAAE,KAAK,QAAQ,EAAE,KAAK,OAAO,EAAE,SAAS;AAAA,QACxE,QAAQ,IAAI,YAAAA,QAAI,MAAM,EAAE,SAAS;AAAA,QACjC,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,eAAe,WAAW;AAAA,QAC1B,SAAS;AAAA,MACX;AAAA,IACF,SAAS,OAAP;AACA,aAAO;AAAA,QACL,aAAa;AAAA,QACb,SAAS;AAAA,QACT,UAAU,MAAM;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAAA;AAGA,SAAS,gBAAgB,YAAgC;AACvD,SAAO,MAAM,KAAK,UAAU,EACzB,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAChD,KAAK,EAAE;AACZ;;;AKj5BA,IAAMM,WAAU,aAAa,uBAAuB;AAEpD,IAAM,gBAAgB;AAEf,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AACF,GAA6B;AAC3B,MAAI,SAAS,eAAe,uBAAuB,GAAG;AACpD;AAAA,EACF;AAEA,QAAM,SAAS,aAAa;AAAA,IAC1B,WAAW,aAAa,aAAa,KAAK;AAAA,IAC1C,aAAa,SAAS,IAClB,EAAE,OAAO,qBAAqB,QAAQ,MAAM,IAC5C,EAAE,OAAO,SAAS,QAAQ,QAAQ;AAAA,EACxC,CAAC;AAED,SAAO,iBAAiB,cAAc,MAAM;AA9C9C;AA+CI,QAAI,SAAS,kBAAkB,QAAQ;AACrC,qBAAS,kBAAT,mBAAwB,aAAa,YAAY;AACjD,iBAAW,MAAM;AACf,eAAO,MAAM;AAAA,MACf,GAAG,CAAC;AAAA,IACN;AAAA,EACF,CAAC;AAED,QAAM,eAAe,CAAC;AACtB,QAAM,eAAe,oDACnB,eAAe,UAAU;AAE3B,QAAM,gBAAgB,oDACpB,eAAe,UAAU;AAG3B,QAAM,SAAS,+BAA+B;AAAA,IAC5C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,0BAAwB,QAAQ,QAAQ,YAAY,SAAS;AAC/D;AAEA,SAAS,+BAA+B;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAQqB;AACnB,QAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,SAAO,KAAK;AAEZ,QAAM,kBAAkBA,YAAA,gBAAAA,SAAS,IAAa;AAE9C,SAAO,MAAM,kBAAkB,gBAAgB;AAC/C,SAAO,MAAM,UAAU,kBAAkB,UAAU;AAEnD,QAAM,cAAc,OAAO;AAC3B,QAAM,eAAe,OAAO;AAE5B,QAAM,gBAAgBA,YAAA,gBAAAA,SAAS,IAAuC;AACtE,QAAM,yBAAyB,mBAC7B,iBAAiB;AAAA,IACf,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAEF,QAAM,iBAAiB,cAAc;AACrC,QAAM,uBAAuB,oBAAoB,cAAc;AAC/D,QAAM,mBAAmB,SAAS,IAAI,SAAS,oBAAoB,IAAI,SAAS,cAAc;AAE9F,QAAM,QAAQ,KAAK;AAAA,IACjB,KAAK,IAAI,eAAe,SAAS,uBAAuB,KAAK,CAAC;AAAA,IAC9D,cAAc,mBAAmB;AAAA,EACnC;AACA,QAAM,SAAS,KAAK;AAAA,IAClB,KAAK,IAAI,eAAe,SAAS,uBAAuB,MAAM,CAAC;AAAA,IAC/D,eAAe,mBAAmB;AAAA,EACpC;AAEA,SAAO,OAAO,OAAO,OAAO;AAAA,IAC1B,UAAU;AAAA,IACV,QAAQ,GAAG;AAAA,IACX,OAAO,GAAG;AAAA,IACV,QAAQ;AAAA,IACR,OAAO,cAAc;AAAA,IACrB,QAAQ,cAAc;AAAA,IACtB,QAAQ,YAAY,SAAS;AAAA,IAC7B,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,aAAa;AAAA,EACf,CAAC;AAED,MAAI,SAAS,GAAG;AACd,WAAO,OAAO,OAAO,OAAO;AAAA,MAC1B,OAAO,oBAAoB,cAAc;AAAA,MACzC,QAAQ,oBAAoB,cAAc;AAAA,IAC5C,CAAC;AAAA,EACH;AAEA,WAAS,KAAK,YAAY,MAAM;AAEhC;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,OAAO,MAAM,KAAK;AAAA,EAC7B;AAEA,MAAI,aAAa;AACjB,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,eAAe;AACnB,MAAI,gBAAgB;AACpB,MAAI,gBAAgB;AAEpB,WAAS,UAAU,SAAiB,SAAiB;AACnD,QAAI,CAAC;AAAW;AAChB,iBAAa;AACb,aAAS;AACT,aAAS;AACT,mBAAe,SAAS,OAAO,MAAM,KAAK;AAC1C,oBAAgB,SAAS,OAAO,MAAM,MAAM;AAC5C,oBAAgB,KAAK,IAAI;AAEzB,WAAO,MAAM,SAAS;AACtB,WAAO,MAAM,aAAa;AAAA,EAC5B;AAEA,WAAS,eAAe;AACtB,UAAM,qBAAqB,OAAO,MAAM,YAAY;AACpD,WAAO,MAAM,YAAY;AACzB,eAAW,MAAM;AACf,aAAO,MAAM,YAAY;AAAA,IAC3B,GAAG,GAAG;AAEN,UAAM,kBAAkB,CAAC;AACzB,WAAO,MAAM,UAAU,kBAAkB,UAAU;AACnD,WAAO,MAAM,kBAAkB,gBAAgB;AAE/C,IAAAA,YAAA,gBAAAA,SAAS,IAAI,WAAW;AAExB,eAAW,MAAM;AACf,UAAI,iBAAiB;AACnB,eAAO,MAAM;AAAA,MACf;AAAA,IACF,GAAG,CAAC;AAAA,EACN;AAEA,SAAO;AAAA,IACL;AAAA,IACA,CAAC,MAAM;AACL,UAAI,CAAC,cAAc,CAAC,WAAW;AAC7B,qBAAa;AAAA,MACf;AACA,QAAE,eAAe;AACjB,QAAE,gBAAgB;AAAA,IACpB;AAAA,IACA,EAAE,SAAS,KAAK;AAAA,EAClB;AAEA,MAAI,WAAW;AACb,WAAO;AAAA,MACL;AAAA,MACA,CAAC,MAAM;AACL,kBAAU,EAAE,SAAS,EAAE,OAAO;AAC9B,UAAE,eAAe;AACjB,UAAE,gBAAgB;AAAA,MACpB;AAAA,MACA,EAAE,SAAS,KAAK;AAAA,IAClB;AAEA,WAAO;AAAA,MACL;AAAA,MACA,CAAC,MAAM;AACL,YAAI,EAAE,QAAQ,WAAW,GAAG;AAC1B,gBAAM,QAAQ,EAAE,QAAQ;AACxB,oBAAU,MAAM,SAAS,MAAM,OAAO;AACtC,YAAE,eAAe;AACjB,YAAE,gBAAgB;AAAA,QACpB;AAAA,MACF;AAAA,MACA,EAAE,SAAS,KAAK;AAAA,IAClB;AAEA,aAAS;AAAA,MACP;AAAA,MACA,CAAC,MAAM;AACL,YAAI,CAAC;AAAY;AACjB,mBAAW,EAAE,SAAS,EAAE,OAAO;AAC/B,UAAE,eAAe;AAAA,MACnB;AAAA,MACA,EAAE,SAAS,KAAK;AAAA,IAClB;AAEA,aAAS;AAAA,MACP;AAAA,MACA,CAAC,MAAM;AACL,YAAI,CAAC,cAAc,EAAE,QAAQ,WAAW;AAAG;AAC3C,cAAM,QAAQ,EAAE,QAAQ;AACxB,mBAAW,MAAM,SAAS,MAAM,OAAO;AACvC,UAAE,eAAe;AAAA,MACnB;AAAA,MACA,EAAE,SAAS,KAAK;AAAA,IAClB;AAEA,aAAS;AAAA,MACP;AAAA,MACA,CAAC,MAAM;AACL,YAAI,YAAY;AACd,YAAE,eAAe;AACjB,YAAE,gBAAgB;AAAA,QACpB;AACA,gBAAQ;AAAA,MACV;AAAA,MACA,EAAE,SAAS,KAAK;AAAA,IAClB;AAEA,aAAS;AAAA,MACP;AAAA,MACA,CAAC,MAAM;AACL,YAAI,YAAY;AACd,YAAE,eAAe;AACjB,YAAE,gBAAgB;AAAA,QACpB;AACA,gBAAQ;AAER,cAAM,cAAc,KAAK,IAAI;AAC7B,cAAM,eAAe,cAAc;AAEnC,YACE,eAAe,OACf,KAAK,IAAI,SAAS,OAAO,MAAM,KAAK,IAAI,YAAY,IAAI,KACxD,KAAK,IAAI,SAAS,OAAO,MAAM,MAAM,IAAI,aAAa,IAAI,GAC1D;AACA,uBAAa;AAAA,QACf;AAAA,MACF;AAAA,MACA,EAAE,SAAS,KAAK;AAAA,IAClB;AAEA,aAAS;AAAA,MACP;AAAA,MACA,MAAM;AACJ,gBAAQ;AAAA,MACV;AAAA,MACA,EAAE,SAAS,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,WAAS,WAAW,SAAiB,SAAiB;AACpD,UAAM,SAAS,SAAS;AACxB,UAAM,SAAS,SAAS;AAExB,QAAI,WAAW,eAAe;AAC9B,QAAI,YAAY,gBAAgB;AAEhC,UAAM,oBAAoB,SAAS,OAAO,MAAM,KAAK;AAErD,eAAW,KAAK;AAAA,MACd,KAAK,IAAI,eAAe,QAAQ;AAAA,MAChC,cAAc,oBAAoB;AAAA,IACpC;AACA,gBAAY,KAAK;AAAA,MACf,KAAK,IAAI,eAAe,SAAS;AAAA,MACjC,eAAe,oBAAoB;AAAA,IACrC;AAEA,UAAM,gBAAgB;AACtB,UAAM,aAAa,cAAc,WAAW;AAC5C,QAAI,aAAa,eAAe;AAC9B,iBAAW,cAAc,oBAAoB;AAAA,IAC/C,WAAW,WAAW,eAAe;AACnC,iBAAW;AAAA,IACb;AAEA,UAAM,YAAY,eAAe,YAAY;AAC7C,QAAI,YAAY,eAAe;AAC7B,kBAAY,eAAe,oBAAoB;AAAA,IACjD,WAAW,YAAY,eAAe;AACpC,kBAAY;AAAA,IACd;AAEA,WAAO,MAAM,QAAQ,GAAG;AACxB,WAAO,MAAM,SAAS,GAAG;AAEzB,yBAAqB,QAAQ,UAAU,WAAW,aAAa,cAAc,iBAAiB;AAAA,EAChG;AAEA,WAAS,UAAU;AACjB,QAAI,CAAC,cAAc,CAAC;AAAW;AAE/B,iBAAa;AACb,WAAO,MAAM,SAAS;AACtB,WAAO,MAAM,aAAa;AAE1B,IAAAA,YAAA,gBAAAA,SAAS,IAAI,YAAY;AAAA,MACvB,OAAO,OAAO,MAAM;AAAA,MACpB,QAAQ,OAAO,MAAM;AAAA,IACvB;AAAA,EACF;AAEA,SAAO,UAAU;AAEjB,SAAO;AACT;AAEA,SAAS,aAAa;AAAA,EACpB;AAAA,EACA,cAAc,CAAC;AACjB,GAGsB;AACpB,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,SAAO,KAAK;AACZ,SAAO,QAAQ;AACf,SAAO,MAAM;AAEb,QAAM,YAAYA,YAAA,gBAAAA,SAAS,IAAa;AAExC,SAAO,OAAO,OAAO,OAAO;AAAA,IAC1B,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,cAAc;AAAA,IACd,SAAS,YAAY,UAAU;AAAA,IAC/B,QAAQ;AAAA,KACL,YACJ;AAED,WAAS,KAAK,YAAY,MAAM;AAEhC,SAAO;AACT;AAEA,IAAI,wBAAgE;AAEpE,SAAe,wBACb,QACA,QACA,YACA,WACA;AAAA;AAvYF;AAwYE,UAAM,aAAa,WAAM,yCAAY,kBAAlB,mBAAmC,GAAG;AACzD,UAAM,oBAAoB,uCAAW;AACrC,UAAM,oBAAoB,MAAM,uCAAW;AAC3C,YAAQ,IAAI,EAAE,WAAW,mBAAmB,kBAAkB,CAAC;AAC/D,UAAM,YAAY,IAAI,IAAI,OAAO,GAAG;AACpC,cAAU,aAAa,IAAI,UAAU,OAAO,SAAS,MAAM;AAC3D,iBAAa,UAAU,aAAa,IAAI,aAAa,SAAS;AAC9D,yBAAqB,UAAU,aAAa,IAAI,qBAAqB,iBAAiB;AACtF,yBAAqB,UAAU,aAAa,IAAI,qBAAqB,iBAAiB;AAEtF,WAAO,MAAM,UAAU,SAAS;AAEhC,UAAM,UAAU;AAAA,MACd,wBAAwB,WAAW;AAAA,MACnC,yBAAyB,WAAW;AAAA,MACpC;AAAA,MACA;AAAA,IACF;AAEA,QAAI,uBAAuB;AACzB,aAAO,oBAAoB,WAAW,qBAAqB;AAC3D,8BAAwB;AAAA,IAC1B;AAEA,UAAM,sBAAsB,CAAO,UAAwB;AAha7D,UAAAC,KAAA;AAiaI,UAAI,MAAM,WAAW,UAAU;AAAQ;AACvC,YAAM,EAAE,QAAQ,WAAW,KAAK,IAAI,MAAM;AAE1C,UAAI;AACF,cAAM,WAAW,QAAQ;AACzB,YAAI,CAAC;AAAU;AACf,gBAAQ,IAAI,sBAAsB,QAAQ,MAAM,IAAI;AACpD,cAAM,SAAS,MAAM,SAAS,IAAI;AAClC,gBAAQ,IAAI,6BAA6B,QAAQ,MAAM;AACvD,SAAAA,MAAA,MAAM,WAAN,gBAAAA,IAAc;AAAA,UACZ;AAAA,YACE;AAAA,YACA;AAAA,YACA,SAAS;AAAA,UACX;AAAA,UACA,EAAE,cAAc,MAAM,OAAO;AAAA;AAAA,MAEjC,SAAS,OAAP;AACA,gBAAQ,MAAM,4BAA4B,QAAQ,KAAK;AACvD,oBAAM,WAAN,mBAAc;AAAA,UACZ;AAAA,YACE;AAAA,YACA,OAAO,MAAM;AAAA,YACb,SAAS;AAAA,UACX;AAAA,UACA,EAAE,cAAc,MAAM,OAAO;AAAA;AAAA,MAEjC;AAAA,IACF;AAEA,4BAAwB;AACxB,WAAO,iBAAiB,WAAW,mBAAmB;AAAA,EACxD;AAAA;AAEO,SAAS,qBAAqB;AACnC,UAAQ,IAAI,oBAAoB;AAChC,QAAM,SAAS,SAAS,eAAe,uBAAuB;AAC9D,mCAAQ;AACR,QAAM,SAAS,SAAS,eAAe,uBAAuB;AAC9D,mCAAQ;AACV;AAEA,SAAS,qBACP,QACA,aACA,cACA,aACA,cACA,YACA;AACA,QAAM,cAAc,SAAS,OAAO,MAAM,KAAK;AAC/C,QAAM,eAAe,SAAS,OAAO,MAAM,MAAM;AAEjD,MAAI,cAAc;AAClB,MAAI,eAAe,eAAe,aAAa;AAE/C,MAAI,cAAc,cAAc,cAAc,eAAe;AAC3D,kBAAc,KAAK,IAAI,eAAe,cAAc,cAAc,aAAa;AAAA,EACjF;AAEA,MAAI,eAAe,eAAe,eAAe,eAAe;AAC9D,mBAAe,KAAK,IAAI,eAAe,eAAe,eAAe,EAAE;AAAA,EACzE;AAEA,SAAO,MAAM,QAAQ,GAAG;AACxB,SAAO,MAAM,SAAS,GAAG;AAC3B;;;ACxbA,IAAM,YAAoD,CAAO,OAQ3D,iBAR2D,KAQ3D,WAR2D;AAAA,EAC/D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAM;AACJ,MAAI,eAAe;AACnB,MAAI;AAEJ,QAAM,SAAS;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAAC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,MAAY,SAAiB,OAAO,QAAQ,QAAQ,aAAa;AACvE,QAAM,gBAAgB,gBAAgB,GAAG;AAEzC,QAAM,eAAe;AAErB,WAAS,sBAAsB;AAC7B,UAAM,YAAY,cAAM,WAAW;AACnC,UAAM,YAAY,cAAM,aAAa;AACrC,UAAM,eAAe,cAAM,gBAAgB;AAC3C,QAAK,CAAC,aAAa,aAAe,aAAa,CAAC,aAAe,CAAC,aAAa,cAAe;AAC1F,oBAAM,MAAM;AACZ,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAEA,WAAe,iBAAiB;AAAA;AAC9B,UAAI,cAAc;AAChB,gBAAQ,IAAI,gDAAgD;AAC5D;AAAA,MACF;AAEA,cAAQ,IAAI,gBAAgB;AAC5B,UAAI;AACF,uBAAe;AACf,cAAM,aAAa,MAAM;AAAA,UACvB,MAAY;AACV,kBAAM,MAAM,OAAO;AACnB,gBAAI,CAAC,KAAK;AACR,oBAAM,IAAI,MAAM,sBAAsB;AAAA,YACxC;AACA,mBAAO;AAAA,UACT;AAAA,UACA,CAAC,QAAQ,CAAC,CAAC;AAAA,UACX;AAAA,YACE,YAAY;AAAA,YACZ,SAAS;AAAA,UACX;AAAA,QACF;AAEA,cAAM,yBAAyB;AAC/B,eAAO;AAAA,MACT,UAAE;AACA,uBAAe;AAAA,MACjB;AAAA,IACF;AAAA;AAEA,WAAe,2BAA2B;AAAA;AACxC,YAAM,yBAAyB,MAAY;AACzC,YAAI,yBAAyB;AAC3B,uBAAa,uBAAuB;AAAA,QACtC;AAEA,cAAM,gBAAgB,cAAc,OAAO;AAE3C,YAAI,CAAC,cAAM,QAAQ,GAAG;AACpB,wBAAM,MAAM;AACZ,kBAAQ,IAAI,gCAAgC;AAAA,QAC9C;AAEA,cAAM,QAAQ,oBAAoB;AAClC,YAAI,CAAC,OAAO;AACV;AAAA,QACF;AAEA,cAAM,aAAa,OAAO;AAE1B,YAAI,WAAW,SAAS;AACtB,gBAAM,eAAe,MAAM,WAAW,aAAa;AACnD,cAAI,cAAc;AAChB,kBAAM,6BAA6B,YAAY;AAC/C,gBAAI,CAAC,OAAO,iCAAiC;AAC3C,iCAAmB;AACnB,gCAAkB;AAAA,gBAChB;AAAA,gBACA,YAAY;AAAA,gBACZ,WAAW;AAAA,gBACX,WAAY,SAAiB;AAAA,cAC/B,CAAC;AAAA,YACH;AAAA,UACF;AAAA,QACF,OAAO;AACL,oCAA0B,WAAW,MAAM;AACzC,mCAAuB;AAAA,UACzB,GAAG,GAAI;AAAA,QACT;AAAA,MACF;AAEA,YAAM,UAAU,OAAO,WAAW,WAAW;AAE7C,cAAQ,GAAG,mBAAmB,CAAO,iBAAyB;AAC5D,sBAAM,MAAM;AACZ,gBAAQ,IAAI,uBAAuB;AACnC,YAAI;AACF,gBAAM,EAAE,aAAa,cAAc,IAAI,MAAM,6BAA6B,YAAY;AAEtF,cAAI,CAAC,eAAe,CAAC,eAAe;AAClC,kBAAM,IAAI,MAAM,iCAAiC;AAAA,UACnD;AAEA,kBAAQ,KAAK,mBAAmB;AAAA,YAC9B,UAAU,CAAC,EAAE,WAAW,YAAY,CAAC;AAAA,UACvC,CAAC;AACD,gBAAM,uBAAuB;AAAA,QAC/B,SAAS,OAAP;AACA,kBAAQ,MAAM,8BAA8B,KAAK;AAAA,QACnD;AAAA,MACF,EAAC;AAED,cAAQ,GAAG,iBAAiB,MAAY;AAAA,MAKxC,EAAC;AAED,cAAQ,GAAG,aAAa,MAAY;AAClC,gBAAQ,IAAI,WAAW;AACvB,sBAAM,MAAM;AACZ,gBAAQ,KAAK,mBAAmB,EAAE,UAAU,CAAC,EAAE,CAAC;AAChD,cAAM,uBAAuB;AAAA,MAC/B,EAAC;AAED,YAAM,uBAAuB;AAE7B,UACE,iBAAiB,YACjB,SAAS,eACT,aAAa,QAAQ,uCAAuC,MAAM,gBAClE;AACA,cAAM,OAAO,WAAW,YAAY;AAAA,MACtC;AAAA,IACF;AAAA;AAEA,WAAeC,UAAY,YAAoB,YAAoB,MAAW;AAAA;AAC5E,aAAO,iBAAoB,YAAY,YAAY,MAAM,EAAE,SAAS,CAAC;AAAA,IACvE;AAAA;AAEA,WAAe,6BAA6B,cAAsB;AAAA;AAChE,YAAM,OAAO,MAAM,iBAAiB,GAAG;AACvC,YAAM,gBAAgB,MAAMA;AAAA,QAC1B,cAAc;AAAA,QACd;AAAA,QACA,EAAE,gBAAgB,aAAa;AAAA,MACjC;AAEA,oBAAM,SAAS,MAAM,eAAe,YAAY;AAEhD,aAAO;AAAA,QACL,aAAa;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAAA;AAEA,WAAe,OAAOC,KAAkC;AAAA,+CAAlC,EAAE,YAAY,YAAY,GAAQ;AACtD,YAAM,aAAa,OAAO;AAE1B,oBAAM,MAAM;AAEZ,UAAI,CAAC,cAAM,WAAW,KAAK,CAAC,cAAM,aAAa,GAAG;AAChD,cAAM,WAAW,MAAM;AAAA,MACzB;AAEA,YAAM,eAAe,MAAM,WAAW,aAAa;AACnD,cAAQ,IAAI,iBAAiB,YAAY;AACzC,UAAI,CAAC,cAAc;AACjB,cAAM,IAAI,MAAM,gEAAgE;AAAA,MAClF;AAEA,YAAM,EAAE,aAAa,cAAc,IAAI,MAAM,6BAA6B,YAAY;AAEtF,aAAO;AAAA,QACL;AAAA,UACE,WAAW;AAAA,UACX,WAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAAA;AAEA,WAAe,UAAU;AAAA;AACvB,YAAM,YAAY,cAAM,WAAW;AACnC,YAAM,YAAY,cAAM,aAAa;AACrC,UAAI,EAAE,aAAa,YAAY;AAC7B;AAAA,MACF;AACA,YAAM,aAAa,OAAO;AAE1B,UAAI,SAAS,YAAY;AACvB,mBAAW,OAAO;AAAA,MACpB;AAEA,oBAAM,MAAM;AACZ,aAAO,aAAa,WAAW,uCAAuC;AACtE,UAAI,CAAC,OAAO,iCAAiC;AAC3C,2BAAmB;AAAA,MACrB;AAAA,IACF;AAAA;AAEA,WAAS,aAAa;AACpB,UAAM,YAAY,cAAM,WAAW;AACnC,UAAM,YAAY,cAAM,aAAa;AACrC,WAAO,aAAa;AAAA,EACtB;AAEA,WAAe,cAAc;AAAA;AAC3B,aAAO,CAAC,EAAE,WAAW,cAAM,WAAW,EAAE,CAAC;AAAA,IAC3C;AAAA;AAEA,WAAe,cAAc;AAAA;AAC3B,YAAM,IAAI,MAAM,2BAA2B,SAAS,MAAM;AAAA,IAC5D;AAAA;AAEA,WAAeF,eAAc;AAAA;AAC3B,YAAM,IAAI,MAAM,2BAA2B,SAAS,MAAM;AAAA,IAC5D;AAAA;AAEA,WAAe,uBAAuB,QAAqB;AAAA;AACzD,YAAMG,gBAAe,CAAC,MAAM;AAC5B,YAAM,SAAS,MAAM,wBAAwB,EAAE,cAAAA,cAAa,CAAC;AAC7D,UAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,eAAO,OAAO;AAAA,MAChB,OAAO;AACL,cAAM,IAAI,MAAM,uBAAuB,QAAQ;AAAA,MACjD;AAAA,IACF;AAAA;AAEA,WAAe,wBAAwB,QAAyC;AAAA;AAC9E,UAAI,CAAC,oBAAoB,GAAG;AAC1B,cAAM,IAAI,MAAM,wDAAwD;AAAA,MAC1E;AAEA,YAAM,aAAa,OAAO;AAC1B,YAAM,OAAO,cAAM,WAAW;AAE9B,YAAM,cAAc,MAAM,eAAe,EAAE,MAAM,IAAI,CAAC;AAGtD,YAAM,kBAAkB,MAAM,KAAK,IAAI;AAEvC,YAAM,QAAQ,CAAC,GAAG,OAAO,YAAY;AACrC,cAAQ,IAAI,sCAAsC,KAAK;AAEvD,YAAM,EAAE,wBAAwB,eAAe,SAAS,IAAI,MAAM,qBAAqB;AAAA,QACrF;AAAA,QACA,cAAc;AAAA,QACd;AAAA,QACA,aAAc,SAAiB;AAAA,MACjC,CAAC;AAED,cAAQ,IAAI,2BAA2B,sBAAsB;AAC7D,cAAQ,IAAI,kBAAkB,aAAa;AAC3C,cAAQ,IAAI,aAAa,QAAQ;AAGjC,YAAM,qBAAqB,MAAM,UAAU,GAAG;AAE9C,UAAI,wBAAwB;AAC1B,cAAM,QAAQ,sBAAsB;AAAA,MACtC;AAEA,cAAQ,IAAI,+BAA+B,KAAK;AAEhD,YAAM,WAAW,MAAM,QAAQ;AAAA,QAC7B,MAAM;AAAA,UAAI,CAAC,aAAa,UACtB,0BAA0B;AAAA,YACxB;AAAA,YACA,WAAW,cAAM,WAAW;AAAA,YAC5B,WAAW,cAAM,aAAa;AAAA,YAC9B;AAAA,YACA;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAEA,YAAM,eAAe,MAAM,SAAS,EAAE,KAAK,WAAW,KAAK,CAAC;AAE5D,YAAM,qBAAoB,2CAAa,UAAS;AAEhD,YAAM,QACJ,OAAO,YAAY,IAAI,OAAO,iBAAiB,IAC3C,OAAO,YAAY,IACnB,OAAO,iBAAiB;AAE9B,YAAM,YAAY;AAAA,QAChB,UAAU;AAAA,QACV;AAAA,QACA,mBAAmB,SAAS,IAAI,CAAC,MAAM,EAAE,KAAK;AAAA,QAC9C,WAAW,cAAc;AAAA,QACzB,WAAW;AAAA,QACX,kBAAkB;AAAA,QAClB;AAAA,QACA,SAAS;AAAA,MACX;AAEA,YAAM,eAAe,KAAK,UAAU,SAAS;AAE7C,YAAM,YAAY,MAAM,WAAW,YAAY,YAAY;AAE3D,YAAM,mBAAmB;AAAA,QACvB;AAAA,QACA,KAAK;AAAA,QACL,WAAW,cAAM,gBAAgB;AAAA,QACjC,MAAM,MAAM,YAAY;AAAA,MAC1B,CAAC;AACD,YAAM,0BAA0B,EAAE,WAAW,IAAI,CAAC;AAGlD,YAAM,OAAO,SAAS,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI;AAChD,cAAQ,IAAI,WAAW,IAAI;AAC3B,YAAM,SAAS,MAAM,wBAAwB,QAAQ,QAAQ,WAAW,IAAI;AAC5E,aAAO;AAAA,IACT;AAAA;AAEA,WAAe,gBAAgB,SAAiB;AAAA;AAC9C,YAAM,aAAa,OAAO;AAC1B,UAAI,CAAC,WAAW;AAAS;AACzB,YAAM,aAAa,MAAM,WAAW,WAAW;AAC/C,YAAM,aAAa;AAAA,QACjB,SAAS,CAAC,WAAW,iBAAiB;AAAA,QACtC,SAAS,CAAC,WAAW,KAAK;AAAA,MAC5B;AACA,UAAI,CAAC,WAAW,YAAY,SAAS,OAAO,GAAG;AAC7C,cAAM,WAAW,cAAc,eAAe,YAAY,YAAY,SAAS;AAAA,MACjF;AAAA,IACF;AAAA;AAEA,SAAO;AACT;AAEO,SAAS,eAAe;AAAA,EAC7B,UAAU;AAAA,EACV,aAAa;AAAA,EACb,cAAc;AAAA,EACd,aAAa;AAAA,EACb,MAAM;AAAA,EACN;AAAA,EACA,cAAc;AAChB,IAAiC,CAAC,GAAwC;AACxE,UAAQ,IAAI,oCAA0B,WAAW,GAAG,QAAQ,KAAK,gBAAgB,WAAW;AAE5F,QAAM,YAAY,MAAY;AAC5B,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,UAAU;AAAA,QACR,MAAM;AAAA,QACN,aAAa;AAAA,QACb;AAAA,QACA,aAAa;AAAA,QACb;AAAA,QACA,WAAW;AAAA,QACX;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,MAAM;AAAA,IACR;AAAA,EACF;AAEA,SAAO;AACT;;;AC3aA,0BAIO;AAwBP,IAAI;AAEG,SAAS,yBACd,UACA,SACA;AACA,MAAI,CAAC;AAAU,UAAM,IAAI,MAAM,sBAAsB;AAErD,QAAM;AAAA,IACJ,kBAAkB;AAAA,IAClB,6BAA6B;AAAA,IAC7B,MAAM;AAAA,IACN;AAAA,IACA,YAAY;AAAA,IACZ,kBAAkB,EAAE,OAAO,QAAQ,QAAQ,OAAO;AAAA,IAClD,aAAa;AAAA,IACb,mBAAmB;AAAA,EACrB,IAAI;AAEJ,+CAAc;AACd,QAAM,QAAQ,SAAS,MAAM,SAAS;AACtC,QAAM,QAAQ,SAAS,KAAK;AAC5B,iBAAe,SAAS,MAAM,WAAW,UAAU,CAACC,WAA+B;AACjF,UAAM,WAAWA,OAAM;AACvB,WAAO,kCAAkC;AACzC,YAAQ,IAAI,qCAAqC,QAAQ;AACzD,uBAAmB;AACnB,QAAI,aAAa,gBAAgB,4BAA4B;AAC3D,eAAS,OAAO,EAAE,KAAK,CAAC,WAAW;AACjC,0BAAkB;AAAA,UAChB;AAAA,UACA,YAAY;AAAA,UACZ,WAAW,aAAa,eAAe,OAAO,aAAa;AAAA,UAC3D;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,MAAI,MAAM,SAAS,KAAK,GAAG;AACzB,aAAS,KAAK,YAAY,SAAS,cAAc,OAAO,CAAC,EAAE,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA,EAK3E;AAEA,MAAI,MAAM,SAAS,KAAK,GAAG;AACzB,aAAS,KAAK,YAAY,SAAS,cAAc,OAAO,CAAC,EAAE,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA,EAK3E;AAEA,QAAM,YAAQ,oBAAAC,YAAY,UAAU,OAAO;AAC3C,QAAM,eAAe,MAAM,KAAK,KAAK,KAAK;AAE1C,QAAM,OAAO,MAAY;AACvB,UAAM,QAAQ,MAAM,SAAS,KAAK,kBAAkB,MAAM,eAAe,KAAK,IAAI,MAAM;AACxF,QAAI,CAAC,OAAO,KAAK,EAAE,SAAS,KAAK,GAAG;AAClC,YAAM,WAAW,UAAU,QAAQ,eAAe;AAClD,YAAMC,UAAS,MAAM,QAAQ,KAAK,CAACA,YAAWA,QAAO,OAAO,QAAQ;AACpE,UAAIA,SAAQ;AACV,cAAM,SAAS,MAAMA,QAAO,OAAO;AACnC,cAAM,OAAO,OAAO,OAAc;AAAA,MACpC;AAAA,IACF,WAAW,UAAU,QAAQ;AAC3B,mBAAa;AAAA,IACf;AAAA,EACF;AACA,SAAO;AACT;AAEA,IAAM,SAAS;AAAA,EACb,EAAE,IAAI,QAAQ,MAAM,QAAQ,aAAa,eAAe;AAAA,EACxD,EAAE,IAAI,OAAO,MAAM,YAAY,aAAa,8BAA8B;AAAA,EAC1E,EAAE,IAAI,OAAO,MAAM,WAAW,aAAa,cAAc;AAC3D;AAEA,SAAe,eAAe,OAAkC;AAAA;AAC9D,UAAMC,UAAS,OAAO,OAAO,CAAC,UAAU,MAAM,SAAS,MAAM,EAAE,CAAC;AAChE,UAAM,UAAU,CAAC,SAA8B,UAAsB;AACnE,YAAM,UAAU;AAAA,iCACaA,QACxB;AAAA,QACC,CAAC,UAAU,wDAAwD,MAAM;AAAA,gEACnB,MAAM,gBAAgB,MAAM;AAAA;AAAA,+DAE7B,MAAM;AAAA,yDACZ,MAAM;AAAA;AAAA;AAAA,MAGvD,EACC,KAAK,EAAE;AAAA;AAAA;AAGZ,YAAM,MAAM,SAAS,cAAc,KAAK;AACxC,UAAI,YAAY;AAEhB,YAAM,YAAY,IAAI,iBAAiB,eAAe;AAEtD,gBAAU,QAAQ,CAAC,WAAW;AAC5B,eAAO,iBAAiB,SAAS,MAAM;AACrC,kBAAS,OAA6B,QAAQ,KAAe;AAC7D,gBAAM;AAAA,QACR,CAAC;AAAA,MACH,CAAC;AAED,aAAO;AAAA,IACT;AACA,WAAO,MAAM,OAAO,UAAU;AAAA,MAC5B,OAAO;AAAA,MACP,YACE;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAEA,SAAS,SAAS,OAA4B;AAC5C,QAAM,eAAe,MAAM,QAAQ,KAAK,CAACD,YAAWA,QAAO,OAAO,YAAY;AAC9E,QAAM,eAAe,MAAM,QAAQ,KAAK,CAACA,YAAWA,QAAO,OAAO,kBAAkB;AACpF,QAAM,gBAAgB,MAAM,QAAQ;AAAA,IAClC,CAACA,YAAWA,QAAO,OAAO,gBAAgBA,QAAO,OAAO;AAAA,EAC1D;AACA,QAAM,QAAQ,CAAC;AACf,MAAI;AAAc,UAAM,KAAK,KAAK;AAClC,MAAI;AAAc,UAAM,KAAK,KAAK;AAClC,MAAI;AAAe,UAAM,KAAK,MAAM;AACpC,SAAO;AACT;;;AzD1JO,IAAM,aAAa,MAAM;AAC9B,SAAO;AACT;AAEA,IAAI,OAAO,WAAW,aAAa;AACjC,EAAC,OAAe,uBAAuB,WAAW;AACpD;",
|
4
|
+
"sourcesContent": ["export * from './connector';\nexport { ConnectProvider } from './context';\nexport * from './hooks';\nexport * from './core/btcWalletSelectorContext';\nexport * from './core/setupBTCWallet/index';\nexport * from './core/btcUtils';\nexport * from './config';\nexport * from './core/setupModal';\nexport const getVersion = () => {\n return '0.5.75-beta';\n};\n\nif (typeof window !== 'undefined') {\n (window as any).__BTC_WALLET_VERSION = getVersion();\n}\n", "export interface WalletMetadata {\n id: string;\n name: string;\n icon: string;\n downloadUrl: string;\n}\n\nexport abstract class BaseConnector {\n abstract readonly metadata: WalletMetadata;\n abstract isReady(): boolean;\n abstract requestAccounts(): Promise<string[]>;\n abstract getAccounts(): Promise<string[]>;\n abstract getPublicKey(): Promise<string>;\n abstract signMessage(signStr: string, type?: 'ecdsa' | 'bip322-simple'): Promise<string>;\n abstract on(event: string, handler: (data?: any) => void): void;\n abstract removeListener(event: string, handler: (data?: any) => void): void;\n [key: string]: any;\n abstract getProvider(): any;\n abstract getNetwork(): Promise<'livenet' | 'testnet'>;\n abstract switchNetwork(network: 'livenet' | 'testnet'): Promise<void>;\n abstract sendBitcoin(\n toAddress: string,\n satoshis: number,\n options?: { feeRate: number },\n ): Promise<string>;\n abstract sendInscription(\n address: string,\n inscriptionId: string,\n options?: { feeRate: number },\n ): Promise<{ txid: string }>;\n abstract disconnect(): void;\n}\n", "import type { AAOptions } from '@particle-network/aa';\n\nexport function shortString(str: any): string {\n if (Array.isArray(str)) {\n str = '[' + str.toString() + ']';\n }\n if (str) {\n if (typeof str.toString === 'function') {\n str = str.toString();\n }\n if (str.length <= 10) {\n return str;\n }\n return `${str.slice(0, 5)}...${str.slice(str.length - 5, str.length)}`;\n }\n return '';\n}\n\nexport async function copyToClipboard(text: string) {\n const clipboardCopy = async () => {\n if (navigator.clipboard) {\n return navigator.clipboard.writeText(text);\n } else {\n const textarea = document.createElement('textarea');\n textarea.value = text;\n textarea.setAttribute('readonly', '');\n textarea.style.position = 'absolute';\n textarea.style.left = '-9999px';\n document.body.appendChild(textarea);\n\n textarea.select();\n const result = document.execCommand('copy');\n\n document.body.removeChild(textarea);\n\n if (!result) {\n throw new Error('Copy to clipboard failed');\n }\n }\n };\n\n return new Promise((resolve, reject) => {\n clipboardCopy().then(resolve).catch(reject);\n });\n}\n\nexport const defaultTokenIcon =\n 'https://static.particle.network/token-list/defaultToken/default.png';\n\nexport const ipfsToSrc = (ipfs: string) => {\n if (!ipfs || !ipfs.startsWith('ipfs://')) {\n return ipfs || '';\n }\n\n return `https://ipfs.particle.network/${encodeURI(ipfs.slice(7))}`;\n};\n\nexport const checkBTCVersion = (\n accountContracts: AAOptions['accountContracts'],\n accountContractKey: string,\n version: string,\n) => {\n if (!accountContracts[accountContractKey]) {\n return false;\n }\n return accountContracts[accountContractKey].some((item) => item.version === version);\n};\n\nexport const delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\nexport async function retryOperation<T>(\n operation: () => Promise<T> | T,\n shouldStop: (result: T) => boolean,\n {\n maxRetries = 3,\n delayMs = 1000,\n }: {\n maxRetries?: number;\n delayMs?: number;\n } = {},\n): Promise<T> {\n let retries = 0;\n\n while (retries <= maxRetries) {\n const result = await operation();\n if (shouldStop(result)) {\n return result;\n }\n if (retries === maxRetries) {\n console.warn('Max retries reached');\n return result;\n }\n retries++;\n await delay(delayMs);\n }\n throw new Error('Unexpected execution path');\n}\n\nexport function toHex(originalString: string) {\n const charArray = originalString.split('');\n const asciiArray = charArray.map((char) => char.charCodeAt(0));\n const hexArray = asciiArray.map((code) => code.toString(16));\n let hexString = hexArray.join('');\n hexString = hexString.replace(/(^0+)/g, '');\n return hexString;\n}\n\nexport function isMobile(): boolean {\n if (typeof window !== 'undefined') {\n return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\n navigator?.userAgent,\n );\n }\n return false;\n}\n\nexport function safeJSONParse<T>(str: string): T | undefined {\n try {\n return JSON.parse(str) as T;\n } catch (e) {\n console.error('safeJSONParse', e);\n return undefined;\n }\n}\n\nexport function safeJSONStringify(obj: any): string | undefined {\n try {\n return JSON.stringify(obj);\n } catch (e) {\n console.error('safeJSONStringify', e);\n return undefined;\n }\n}\n\nexport function storageStore(namespace?: string, options?: { storage?: Storage }) {\n if (typeof window === 'undefined') return;\n const _namespace = namespace || 'SATOSHI_WALLET_DEFAULT';\n const storage = options?.storage || window?.localStorage;\n const namespaceKey = (key: string) => {\n return _namespace + ':' + key;\n };\n return {\n set(key: string, value: any) {\n const _value = safeJSONStringify(value);\n _value ? storage.setItem(namespaceKey(key), _value) : storage.removeItem(namespaceKey(key));\n },\n get<T>(key: string) {\n const _value = storage.getItem(namespaceKey(key));\n return _value ? safeJSONParse<T>(_value) : undefined;\n },\n remove(key: string) {\n storage.removeItem(namespaceKey(key));\n },\n clearAll: function clearAll() {\n for (const key in storage) {\n if (key.startsWith(namespace + ':')) {\n storage.removeItem(key);\n }\n }\n },\n };\n}\n", "interface DialogOptions {\n title: string;\n message: string;\n dangerouslyUseHTML?: boolean;\n closable?: boolean;\n}\n\nexport class Dialog {\n private static template = `\n <div class=\"dialog-overlay\">\n <div class=\"dialog-container\">\n <div class=\"dialog-content\">\n <div class=\"dialog-title\"></div>\n <div class=\"dialog-message\"></div>\n <div class=\"dialog-buttons\">\n <button class=\"dialog-cancel-btn\">Cancel</button>\n <button class=\"dialog-confirm-btn\">OK</button>\n </div>\n </div>\n </div>\n </div>\n `;\n\n private static style = `\n .dialog-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: rgba(0, 0, 0, 0.75);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 999999;\n backdrop-filter: blur(4px);\n }\n .dialog-container {\n background: #131313;\n border-radius: 12px;\n padding: 24px;\n width: 350px;\n box-shadow: 0 4px 24px rgba(0, 0, 0, 0.3);\n }\n .dialog-title {\n font-size: 18px;\n font-weight: 600;\n margin-bottom: 16px;\n color: #ffffff;\n }\n .dialog-message {\n margin-bottom: 24px;\n line-height: 1.6;\n color: rgba(255, 255, 255, 0.8);\n font-size: 14px;\n }\n .dialog-buttons {\n display: flex;\n justify-content: flex-end;\n gap: 12px;\n }\n .dialog-alert .dialog-buttons {\n justify-content: center;\n }\n .dialog-confirm-btn {\n padding: 8px 24px;\n background-color: #ff7a00;\n color: white;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n font-size: 14px;\n font-weight: 500;\n transition: all 0.2s ease;\n }\n .dialog-confirm-btn:hover {\n background-color: #ff8f1f;\n transform: translateY(-1px);\n }\n .dialog-confirm-btn:active {\n transform: translateY(0);\n }\n .dialog-cancel-btn {\n padding: 8px 24px;\n background-color: rgba(255, 255, 255, 0.1);\n color: rgba(255, 255, 255, 0.8);\n border: none;\n border-radius: 6px;\n cursor: pointer;\n font-size: 14px;\n font-weight: 500;\n transition: all 0.2s ease;\n }\n .dialog-cancel-btn:hover {\n background-color: rgba(255, 255, 255, 0.15);\n transform: translateY(-1px);\n }\n .dialog-cancel-btn:active {\n transform: translateY(0);\n }\n \n .dialog-overlay {\n animation: fadeIn 0.2s ease;\n }\n .dialog-container {\n animation: slideIn 0.2s ease;\n }\n @keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n }\n @keyframes slideIn {\n from {\n transform: translateY(-20px);\n opacity: 0;\n }\n to {\n transform: translateY(0);\n opacity: 1;\n }\n }\n .option-list {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n .option-item {\n display: flex;\n align-items: center;\n gap: 12px;\n color: #fff;\n border: 1px solid transparent;\n background-color: hsla(0, 0%, 100%, .05);\n border-radius: 8px;\n padding: 8px 16px;\n transition: all 0.15s ease;\n cursor: pointer;\n font-size: 14px;\n font-weight: bold;\n &:hover {\n border-color: #ff7a00;\n color: #ff7a00;\n background-color: hsla(0, 0%, 100%, .08);\n }\n }\n `;\n\n private static injectStyles() {\n if (!document.querySelector('#dialog-styles')) {\n const styleSheet = document.createElement('style');\n styleSheet.id = 'dialog-styles';\n styleSheet.textContent = this.style;\n document.head.appendChild(styleSheet);\n }\n }\n\n static confirm(options: { title?: string; message: string }): Promise<boolean> {\n return new Promise((resolve) => {\n this.injectStyles();\n\n const container = document.createElement('div');\n container.innerHTML = this.template;\n document.body.appendChild(container);\n\n const titleEl = container.querySelector('.dialog-title') as HTMLElement;\n const messageEl = container.querySelector('.dialog-message') as HTMLElement;\n const confirmBtn = container.querySelector('.dialog-confirm-btn') as HTMLElement;\n const cancelBtn = container.querySelector('.dialog-cancel-btn') as HTMLElement;\n\n if (options.title) {\n titleEl.textContent = options.title;\n } else {\n titleEl.style.display = 'none';\n }\n messageEl.textContent = options.message;\n\n const cleanup = () => {\n document.body.removeChild(container);\n };\n\n confirmBtn.addEventListener('click', () => {\n cleanup();\n resolve(true);\n });\n\n cancelBtn.addEventListener('click', () => {\n cleanup();\n resolve(false);\n });\n });\n }\n\n static alert(options: DialogOptions) {\n const messageEl = options.dangerouslyUseHTML\n ? { dangerouslySetInnerHTML: { __html: options.message } }\n : { children: options.message };\n\n return new Promise<void>((resolve) => {\n this.injectStyles();\n\n const container = document.createElement('div');\n container.innerHTML = this.template;\n container.querySelector('.dialog-overlay')?.classList.add('dialog-alert');\n\n if (options.closable === false) {\n const overlay = container.querySelector('.dialog-overlay') as HTMLElement;\n overlay.style.pointerEvents = 'none';\n const dialogContainer = container.querySelector('.dialog-container') as HTMLElement;\n dialogContainer.style.pointerEvents = 'auto';\n }\n\n document.body.appendChild(container);\n\n const titleEl = container.querySelector('.dialog-title') as HTMLElement;\n const messageEl = container.querySelector('.dialog-message') as HTMLElement;\n const confirmBtn = container.querySelector('.dialog-confirm-btn') as HTMLElement;\n const cancelBtn = container.querySelector('.dialog-cancel-btn') as HTMLElement;\n\n if (options.title) {\n titleEl.textContent = options.title;\n } else {\n titleEl.style.display = 'none';\n }\n messageEl.innerHTML = options.message;\n cancelBtn.style.display = 'none';\n\n if (options.closable === false) {\n confirmBtn.style.display = 'none';\n }\n\n const cleanup = () => {\n if (options.closable === false) {\n return;\n }\n document.body.removeChild(container);\n };\n\n confirmBtn.addEventListener('click', () => {\n cleanup();\n resolve();\n });\n });\n }\n\n static openModal<T>({\n title,\n titleStyle,\n content,\n }: {\n title: string;\n titleStyle?: string;\n content: (resolve: (value: T) => void, close: () => void) => HTMLElement;\n }): Promise<T> {\n return new Promise((resolve) => {\n const modalContainer = document.createElement('div');\n modalContainer.innerHTML = this.template;\n document.body.appendChild(modalContainer);\n\n const btns = modalContainer.querySelector('.dialog-buttons') as HTMLElement;\n btns.style.display = 'none';\n\n this.injectStyles();\n\n const titleEl = modalContainer.querySelector('.dialog-title') as HTMLElement;\n\n if (title) {\n titleEl.textContent = title;\n if (titleStyle) {\n titleEl.style.cssText = titleStyle;\n }\n } else {\n titleEl.style.display = 'none';\n }\n\n const cleanup = () => {\n document.body.removeChild(modalContainer);\n };\n\n const close = () => {\n cleanup();\n resolve(null as T);\n };\n\n const messageEl = modalContainer.querySelector('.dialog-message') as HTMLElement;\n messageEl.appendChild(content(resolve, close));\n\n const overlay = modalContainer.querySelector('.dialog-overlay') as HTMLElement;\n overlay.addEventListener('click', (e) => {\n if (e.target === overlay) {\n close();\n }\n });\n });\n }\n}\n", "import { isMobile } from '../utils';\nimport { Dialog } from '../utils/Dialog';\n\nexport interface WalletConnectHelper {\n getUniversalLink(url: string): string;\n isWalletInstalled(): boolean;\n}\n\nexport class MobileWalletConnect {\n static getUniversalLink(walletId: string, url: string): string {\n switch (walletId) {\n case 'okx':\n return `okx://wallet/dapp/url?dappUrl=${encodeURIComponent(url)}`;\n case 'bitget':\n return `bitkeep://bkconnect?action=dapp&url=${encodeURIComponent(url)}`;\n case 'xverse':\n return `xverse://browser?url=${encodeURIComponent(url)}`;\n default:\n return '';\n }\n }\n\n static async redirectToWallet(walletId: string) {\n if (isMobile()) {\n const currentUrl = window.location.href;\n const universalLink = this.getUniversalLink(walletId, currentUrl);\n\n const showGuideDialog = async () => {\n try {\n await navigator.clipboard?.writeText(currentUrl);\n } catch (error) {\n console.error(error);\n }\n\n await Dialog.alert({\n title: 'Open in Wallet Browser',\n message: `\n <div style=\"display: flex; flex-direction: column; gap: 12px;\">\n <p>Please follow these steps:</p>\n <p>1. Open ${walletId} wallet app</p>\n <p>2. Find the browser feature in the wallet</p>\n <p>3. Paste the URL (already copied to clipboard)</p>\n </div>\n `,\n dangerouslyUseHTML: true,\n });\n };\n\n if (!universalLink) {\n await showGuideDialog();\n return false;\n }\n\n const openWallet = () => {\n const iframe = document.createElement('iframe');\n iframe.style.display = 'none';\n iframe.src = universalLink;\n document.body.appendChild(iframe);\n\n setTimeout(async () => {\n document.body.removeChild(iframe);\n await showGuideDialog();\n }, 2000);\n };\n\n window.location.href = universalLink;\n setTimeout(openWallet, 100);\n return true;\n }\n return false;\n }\n}\n", "import { isMobile } from '../utils';\nimport { BaseConnector } from './base';\nimport { MobileWalletConnect } from './universalLink';\n\nexport abstract class InjectedConnector extends BaseConnector {\n constructor(private propertity: string) {\n super();\n const props = this.propertity?.split('.');\n if (!this.propertity || props.length > 2) {\n throw new Error('please input valid propertity');\n }\n }\n isReady(): boolean {\n if (typeof window !== 'undefined') {\n const props = this.propertity.split('.');\n if (props.length === 1) {\n if (typeof (window as any)[props[0]] !== 'undefined') {\n return true;\n }\n } else {\n if (\n typeof (window as any)[props[0]] !== 'undefined' &&\n typeof (window as any)[props[0]][props[1]] !== 'undefined'\n ) {\n return true;\n }\n }\n if (isMobile()) {\n return true;\n }\n }\n return false;\n }\n\n async requestAccounts(): Promise<string[]> {\n if (isMobile()) {\n try {\n this.getProvider();\n } catch (error) {\n await MobileWalletConnect.redirectToWallet(this.metadata.id);\n return [];\n }\n }\n\n const accounts = await this.getProviderOrThrow().requestAccounts();\n console.log('network:', await this.getNetwork());\n console.log('\uD83D\uDE80 ~ InjectedConnector ~ requestAccounts ~ accounts:', accounts);\n return accounts;\n }\n\n async getAccounts(): Promise<string[]> {\n const accounts = await this.getProviderOrThrow().getAccounts();\n return accounts;\n }\n async getPublicKey(): Promise<string> {\n return this.getProviderOrThrow().getPublicKey();\n }\n async signMessage(signStr: string, type?: 'ecdsa' | 'bip322-simple'): Promise<string> {\n const addresses = await this.getAccounts();\n if (addresses.length === 0) {\n throw new Error(`${this.metadata.name} not connected!`);\n }\n return this.getProviderOrThrow().signMessage(signStr, type);\n }\n on(event: string, handler: (data?: unknown) => void) {\n const provider = this.getProvider();\n return provider?.on?.(event, handler);\n }\n removeListener(event: string, handler: (data?: unknown) => void) {\n const provider = this.getProvider();\n return provider?.removeListener?.(event, handler);\n }\n\n getProvider() {\n if (this.isReady()) {\n const props = this.propertity.split('.');\n if (props.length === 1) {\n return (window as any)[props[0]];\n } else {\n return (window as any)[props[0]][props[1]];\n }\n }\n }\n\n getProviderOrThrow() {\n const provider = this.getProvider();\n if (!provider) {\n throw new Error(`${this.metadata.name} is not install or not create Bitcoin wallet!`);\n }\n return provider;\n }\n\n async getNetwork(): Promise<'livenet' | 'testnet'> {\n return this.getProviderOrThrow().getNetwork();\n }\n async switchNetwork(network: 'livenet' | 'testnet'): Promise<void> {\n return this.getProviderOrThrow().switchNetwork(network);\n }\n\n async sendBitcoin(\n toAddress: string,\n satoshis: number,\n options?: { feeRate: number },\n ): Promise<string> {\n return this.getProviderOrThrow().sendBitcoin(toAddress, satoshis, options);\n }\n\n async sendInscription(\n address: string,\n inscriptionId: string,\n options?: { feeRate: number },\n ): Promise<{ txid: string }> {\n const result = await this.getProviderOrThrow().sendInscription(address, inscriptionId, options);\n if (typeof result === 'string') {\n return {\n txid: result,\n };\n }\n\n return result;\n }\n\n disconnect() {}\n}\n", "import icon from '../icons/bitget.png';\nimport { type WalletMetadata } from './base';\nimport { InjectedConnector } from './injected';\n\nexport class BitgetConnector extends InjectedConnector {\n readonly metadata: WalletMetadata = {\n id: 'bitget',\n name: 'Bitget Wallet',\n icon,\n downloadUrl: 'https://web3.bitget.com/en/wallet-download',\n };\n\n constructor() {\n super('bitkeep.unisat');\n }\n}\n", "import icon from '../icons/bybit.png';\nimport { type WalletMetadata } from './base';\nimport { InjectedConnector } from './injected';\n\nexport class BybitConnector extends InjectedConnector {\n readonly metadata: WalletMetadata = {\n id: 'bybit',\n name: 'Bybit Wallet',\n icon,\n downloadUrl: 'https://www.bybit.com/download/',\n };\n\n constructor() {\n super('bybitWallet.bitcoin');\n }\n}\n", "import icon from '../icons/okx.svg';\nimport { type WalletMetadata } from './base';\nimport { InjectedConnector } from './injected';\n\nexport class OKXConnector extends InjectedConnector {\n readonly metadata: WalletMetadata = {\n id: 'okx',\n name: 'OKX Wallet',\n icon,\n downloadUrl: 'https://www.okx.com/download',\n };\n constructor() {\n super('okxwallet.bitcoin');\n }\n}\n", "import icon from '../icons/tokenpocket.png';\nimport { type WalletMetadata } from './base';\nimport { InjectedConnector } from './injected';\n\nexport class TokenPocketConnector extends InjectedConnector {\n readonly metadata: WalletMetadata = {\n id: 'tokenpocket',\n name: 'TokenPocket',\n icon,\n downloadUrl: 'https://www.tokenpocket.pro/en/download/app',\n };\n\n constructor() {\n super('tokenpocket.bitcoin');\n }\n}\n", "import icon from '../icons/unisat.svg';\nimport { type WalletMetadata } from './base';\nimport { InjectedConnector } from './injected';\n\nexport class UnisatConnector extends InjectedConnector {\n readonly metadata: WalletMetadata = {\n id: 'unisat',\n name: 'Unisat Wallet',\n icon,\n downloadUrl: 'https://unisat.io',\n };\n\n constructor() {\n super('unisat');\n }\n}\n", "import icon from '../icons/wizz.svg';\nimport { type WalletMetadata } from './base';\nimport { InjectedConnector } from './injected';\n\nexport class WizzConnector extends InjectedConnector {\n readonly metadata: WalletMetadata = {\n id: 'wizz',\n name: 'Wizz Wallet',\n icon,\n downloadUrl: 'https://wizzwallet.io',\n };\n\n constructor() {\n super('wizz');\n }\n}\n", "import EventEmitter from 'events';\nimport type { Address } from 'sats-connect';\nimport icon from '../icons/xverse.png';\nimport { BaseConnector, type WalletMetadata } from './base';\nimport { MobileWalletConnect } from './universalLink';\nimport { isMobile } from '../utils';\nimport { storageStore } from '../utils';\n\ninterface XverseAddress extends Address {\n walletType: 'software' | 'ledger';\n}\n\nconst storage = storageStore('SATOSHI_WALLET_XVERSE');\nexport class XverseConnector extends BaseConnector {\n #network = 'Mainnet';\n #event = new EventEmitter();\n constructor() {\n super();\n this.#event.setMaxListeners(100);\n }\n readonly metadata: WalletMetadata = {\n id: 'xverse',\n name: 'Xverse Wallet',\n icon,\n downloadUrl: 'https://www.xverse.app',\n };\n isReady(): boolean {\n if (typeof window !== 'undefined') {\n if (typeof window.BitcoinProvider !== 'undefined') return true;\n if (isMobile()) return true;\n }\n return false;\n }\n private loadAccounts = async (network: 'Mainnet' | 'Testnet') => {\n const { AddressPurpose } = await import('sats-connect');\n const provider = this.getProvider();\n await provider.request('wallet_requestPermissions', undefined);\n const { result: walletType } = await provider.request('wallet_getWalletType', undefined);\n\n const { result } = await provider.request('getAddresses', {\n purposes: [AddressPurpose.Payment, AddressPurpose.Ordinals],\n message: 'Address for receiving Ordinals and payments',\n });\n const addresses: XverseAddress[] = result.addresses.map((item: XverseAddress) => ({\n ...item,\n walletType,\n }));\n console.log('\uD83D\uDE80 ~ XverseConnector ~ loadAccounts ~ res:', addresses);\n\n storage?.set(`${network}:addresses`, addresses);\n return addresses;\n };\n async sendInscription(): Promise<{ txid: string }> {\n throw new Error('Unsupported');\n }\n async requestAccounts(): Promise<string[]> {\n if (isMobile()) {\n try {\n this.getProvider();\n } catch (error) {\n MobileWalletConnect.redirectToWallet(this.metadata.id);\n return [];\n }\n }\n const addresses = await this.loadAccounts(this.#network as any);\n return addresses.map((item) => item.address);\n }\n async getAddresses() {\n const data = storage?.get<XverseAddress[]>(`${this.#network}:addresses`);\n if (data) {\n return data;\n }\n return [];\n }\n async getCurrentAddress() {\n const addresses = await this.getAddresses();\n const address = addresses?.[0];\n if (!address) {\n throw new Error(`${this.metadata.name} not connected!`);\n }\n return address;\n }\n async getAccounts() {\n if (!this.isReady()) {\n throw new Error(`${this.metadata.name} is not install!`);\n }\n const addresses = await this.getAddresses();\n return addresses.map((item) => item.address);\n }\n async getPublicKey(): Promise<string> {\n const address = await this.getCurrentAddress();\n return address.publicKey;\n }\n async signMessage(signStr: string): Promise<string> {\n const address = await this.getCurrentAddress();\n const provider = this.getProvider();\n const { result } = await provider.request('signMessage', {\n address: address.address,\n message: signStr,\n protocol: 'ECDSA',\n });\n console.log('xverse walletType', address.walletType);\n console.log('xverse raw sig', result.signature);\n const modifiedSig = Buffer.from(result.signature, 'base64');\n modifiedSig[0] = 31 + ((modifiedSig[0] - 31) % 4);\n const sig = modifiedSig.toString('base64');\n console.log('xverse modified sig', sig);\n return sig;\n }\n on(event: string, handler: (data?: unknown) => void) {\n return this.#event.on(event, handler);\n }\n removeListener(event: string, handler: (data?: unknown) => void) {\n return this.#event.removeListener(event, handler);\n }\n getProvider() {\n const provider = window.BitcoinProvider;\n if (!provider) {\n throw new Error(`${this.metadata.name} is not install!`);\n }\n return provider;\n }\n async getNetwork(): Promise<'livenet' | 'testnet'> {\n if (!this.isReady()) {\n throw new Error(`${this.metadata.name} is not install!`);\n }\n return this.#network === 'Mainnet' ? 'livenet' : 'testnet';\n }\n async switchNetwork(): Promise<void> {\n throw new Error('Unsupported');\n }\n async sendBitcoin(toAddress: string, satoshis: number): Promise<string> {\n const provider = this.getProvider();\n const { result } = await provider.request('sendTransfer', {\n recipients: [{ address: toAddress, amount: satoshis }],\n });\n console.log('\uD83D\uDE80 ~ XverseConnector ~ sendBitcoin ~ res:', result);\n return result.txid;\n }\n disconnect(): void {\n storage?.remove(`${this.#network}:addresses`);\n }\n}\n", "import EventEmitter from 'events';\nimport type {\n Address,\n GetAddressOptions,\n SendBtcTransactionOptions,\n SignMessageOptions,\n} from 'sats-connect';\nimport icon from '../icons/magicEden.svg';\nimport { BaseConnector, type WalletMetadata } from './base';\nimport { storageStore } from '../utils';\n\nconst storage = storageStore('SATOSHI_WALLET_MAGICEDEN');\nexport class MagicEdenConnector extends BaseConnector {\n #network = 'Mainnet';\n #event = new EventEmitter();\n\n constructor() {\n super();\n this.#event.setMaxListeners(100);\n }\n\n readonly metadata: WalletMetadata = {\n id: 'magicEden',\n name: 'Magic Eden Wallet',\n icon,\n downloadUrl: 'https://www.magiceden.io',\n };\n\n isReady(): boolean {\n return typeof window !== 'undefined' && 'magicEden' in window && !!window.magicEden;\n }\n\n private loadAccounts = async (network: 'Mainnet' | 'Testnet') => {\n const { getAddress, AddressPurpose } = await import('sats-connect');\n const addresses = await new Promise<Address[]>((resolve, reject) => {\n const getAddressOptions: GetAddressOptions = {\n payload: {\n purposes: [AddressPurpose.Payment, AddressPurpose.Ordinals],\n message: 'Address for receiving Ordinals and payments',\n network: {\n type: network as any,\n },\n },\n onFinish: (response) => {\n resolve(response.addresses);\n },\n onCancel: () =>\n reject({\n code: 4001,\n message: 'User rejected the request.',\n }),\n };\n getAddress(getAddressOptions).catch((error) => reject(error));\n });\n storage?.set(`${network}:addresses`, addresses);\n return addresses;\n };\n\n async sendInscription(): Promise<{ txid: string }> {\n throw new Error('Unsupported');\n }\n\n async requestAccounts(): Promise<string[]> {\n if (!this.isReady()) {\n throw new Error(`${this.metadata.name} is not install!`);\n }\n const addresses = await this.loadAccounts(this.#network as any);\n return addresses.map((item) => item.address);\n }\n\n async getAccounts(): Promise<string[]> {\n if (!this.isReady()) {\n throw new Error(`${this.metadata.name} is not install!`);\n }\n const data = storage?.get<Address[]>(`${this.#network}:addresses`);\n if (data) {\n return data.map((item) => item.address);\n } else {\n return [];\n }\n }\n\n async getPublicKey(): Promise<string> {\n if (!this.isReady()) {\n throw new Error(`${this.metadata.name} is not install!`);\n }\n const data = storage?.get<Address[]>(`${this.#network}:addresses`);\n if (data) {\n return data[0].publicKey;\n } else {\n return '';\n }\n }\n\n async signMessage(signStr: string): Promise<string> {\n if (!this.isReady()) {\n throw new Error(`${this.metadata.name} is not install!`);\n }\n const addresses = await this.getAccounts();\n if (addresses.length === 0) {\n throw new Error(`${this.metadata.name} not connected!`);\n }\n const { signMessage } = await import('sats-connect');\n\n const sig = await new Promise<string>((resolve, reject) => {\n const signMessageOptions: SignMessageOptions = {\n payload: {\n network: {\n type: this.#network as any,\n },\n address: addresses[0],\n message: signStr,\n },\n onFinish: (response) => {\n resolve(response);\n },\n onCancel: () => {\n reject({\n code: 4001,\n message: 'User rejected the request.',\n });\n },\n };\n signMessage(signMessageOptions).catch((e) => {\n reject(e);\n });\n });\n\n const modifiedSig = Buffer.from(sig, 'base64');\n modifiedSig[0] = 31 + ((modifiedSig[0] - 31) % 4);\n return modifiedSig.toString('base64');\n }\n\n on(event: string, handler: (data?: unknown) => void) {\n return this.#event.on(event, handler);\n }\n\n removeListener(event: string, handler: (data?: unknown) => void) {\n return this.#event.removeListener(event, handler);\n }\n\n getProvider() {\n if (this.isReady()) {\n if ('magicEden' in window) {\n const anyWindow: any = window;\n if (anyWindow.magicEden.bitcoin && anyWindow.magicEden.bitcoin.isMagicEden)\n return anyWindow.magicEden.bitcoin;\n }\n }\n }\n\n async getNetwork(): Promise<'livenet' | 'testnet'> {\n if (!this.isReady()) {\n throw new Error(`${this.metadata.name} is not install!`);\n }\n return this.#network === 'Mainnet' ? 'livenet' : 'testnet';\n }\n\n async switchNetwork(): Promise<void> {\n throw new Error('Unsupported');\n }\n\n async sendBitcoin(toAddress: string, satoshis: number): Promise<string> {\n const provider = this.getProvider();\n if (!provider) {\n throw new Error(`${this.metadata.name} is not install!`);\n }\n const { sendBtcTransaction } = await import('sats-connect');\n\n const addresses = await this.getAccounts();\n if (addresses.length === 0) {\n throw new Error(`${this.metadata.name} not connected!`);\n }\n const result = await new Promise<any>((resolve, reject) => {\n const sendBtcOptions: SendBtcTransactionOptions = {\n payload: {\n network: {\n type: this.#network as any,\n },\n recipients: [\n {\n address: toAddress,\n amountSats: BigInt(satoshis),\n },\n ],\n senderAddress: addresses[0],\n },\n onFinish: (response) => {\n resolve(response);\n },\n onCancel: () => {\n reject({\n code: 4001,\n message: 'User rejected the request.',\n });\n },\n };\n sendBtcTransaction(sendBtcOptions).catch((e) => reject(e));\n });\n return result?.txid || result;\n }\n\n disconnect(): void {\n storage?.remove(`${this.#network}:addresses`);\n }\n}\n", "import icon from '../icons/binance.png';\nimport { type WalletMetadata } from './base';\nimport { InjectedConnector } from './injected';\n\nexport class BinanceConnector extends InjectedConnector {\n readonly metadata: WalletMetadata = {\n id: 'binance',\n name: 'Binance Wallet',\n icon,\n downloadUrl: 'https://www.binance.com/en/web3wallet',\n };\n constructor() {\n super('binancew3w.bitcoin');\n }\n}\n", "import icon from '../icons/gate.svg';\nimport { type WalletMetadata } from './base';\nimport { InjectedConnector } from './injected';\n\nexport class GateConnector extends InjectedConnector {\n readonly metadata: WalletMetadata = {\n id: 'gate',\n name: 'Gate Wallet',\n icon,\n downloadUrl: 'https://www.gate.io/en/web3',\n };\n\n constructor() {\n super('gatewallet.bitcoin');\n }\n}\n", "import { SmartAccount, type AAOptions, type AccountContract } from '@particle-network/aa';\nimport { chains } from '@particle-network/chains';\nimport { walletEntryPlugin, type WalletOption } from '@particle-network/wallet';\nimport { createContext, useCallback, useContext, useEffect, useMemo, useState } from 'react';\nimport ConnectModal from '../components/connectModal';\nimport SignModal from '../components/signModal';\nimport { type BaseConnector } from '../connector/base';\nimport { AASignerProvider } from '../evmSigner';\nimport useModalStateValue from '../hooks/useModalStateValue';\nimport { EventName } from '../types/eventName';\nimport { checkBTCVersion, storageStore } from '../utils';\n\nimport events from '../utils/eventUtils';\nimport txConfirm from '../utils/txConfirmUtils';\n\ninterface GlobalState {\n connectorId?: string;\n setConnectorId: (connectorId?: string) => void;\n connector?: BaseConnector;\n connectors: BaseConnector[];\n connectModalOpen: boolean;\n openConnectModal: () => void;\n closeConnectModal: () => void;\n accounts: string[];\n provider: any;\n disconnect: () => void;\n requestDirectAccount: (connector: BaseConnector) => any;\n getPublicKey: () => Promise<string>;\n signMessage: (message: string) => Promise<string>;\n evmAccount?: string;\n smartAccount?: SmartAccount;\n switchNetwork: (network: 'livenet' | 'testnet') => Promise<void>;\n getNetwork: () => Promise<'livenet' | 'testnet'>;\n sendBitcoin: (\n toAddress: string,\n satoshis: number,\n options?: { feeRate: number },\n ) => Promise<string>;\n accountContract: AccountContract;\n setAccountContract: (accountContract: AccountContract) => void;\n}\n\nconst ConnectContext = createContext<GlobalState>({} as any);\n\ninterface ConnectOptions {\n projectId: string;\n clientKey: string;\n appId: string;\n aaOptions: AAOptions;\n rpcUrls?: Record<number, string>;\n walletOptions?: Omit<WalletOption, 'erc4337' | 'customStyle'> & {\n customStyle?: Omit<WalletOption['customStyle'], 'supportChains'>;\n };\n}\n\nconst SAContractKey = 'particle-sa-config';\n\nexport const ConnectProvider = ({\n children,\n options,\n connectors,\n autoConnect = true,\n}: {\n children: React.ReactNode;\n options: ConnectOptions;\n connectors: BaseConnector[];\n autoConnect?: boolean;\n}) => {\n const {\n closeModal: closeConnectModal,\n isModalOpen: connectModalOpen,\n openModal: openConnectModal,\n } = useModalStateValue();\n\n const {\n closeModal: closeSignModal,\n isModalOpen: signModalOpen,\n openModal: openSignModal,\n } = useModalStateValue();\n\n const [connectorId, setConnectorId] = useState<string>();\n const [accounts, setAccounts] = useState<string[]>([]);\n const [evmAccount, setEVMAccount] = useState<string>();\n const [accountContract, _setAccountContract] = useState<AccountContract>({\n name: Object.keys(options.aaOptions.accountContracts)?.[0] || 'BTC',\n version:\n options.aaOptions.accountContracts[\n Object.keys(options.aaOptions.accountContracts)?.[0] || 'BTC'\n ]?.[0].version || '1.0.0',\n });\n\n const getConnectorId = useCallback(() => {\n if (typeof window === 'undefined') {\n return '';\n }\n const id = storageStore()?.get<string>('current-connector-id');\n return id ?? '';\n }, []);\n\n const getConnector = useCallback(() => {\n const connectorId = getConnectorId();\n return connectors.find((item) => item.metadata.id === connectorId);\n }, [connectorId, connectors]);\n\n const setAccountContract = useCallback(\n (config: AccountContract) => {\n if (!checkBTCVersion(options.aaOptions.accountContracts, config.name, config.version)) {\n throw new Error('Invalid Account Contract');\n }\n localStorage.setItem(SAContractKey, JSON.stringify(config));\n _setAccountContract(config);\n },\n [options.aaOptions.accountContracts, _setAccountContract],\n );\n\n useEffect(() => {\n const connectorId = getConnectorId();\n if (connectorId) {\n setConnectorId(connectorId);\n }\n }, [autoConnect, getConnectorId]);\n\n const evmSupportChainIds = useMemo(() => {\n let chainIds = options.aaOptions.accountContracts[accountContract.name]\n ?.filter((item) => item.version === accountContract.version)\n .map((item) => item.chainIds)\n .reduce((a, b) => {\n a.push(...b);\n return a;\n }, []);\n chainIds = Array.from(new Set(chainIds || []));\n return chainIds;\n }, [options.aaOptions.accountContracts, accountContract]);\n\n const connector = useMemo(() => getConnector(), [connectorId, connectors]);\n\n const getPublicKey = useCallback(async () => {\n const connector = getConnector();\n if (!connector) {\n throw new Error('Wallet not connected!');\n }\n const pubKey = await connector.getPublicKey();\n return pubKey;\n }, [getConnector]);\n\n const signMessage = useCallback(\n async (message: string) => {\n if (!connector) {\n throw new Error('Wallet not connected!');\n }\n const signature = await connector.signMessage(message);\n return signature;\n },\n [connector],\n );\n\n const sendBitcoin = useCallback(\n async (toAddress: string, satoshis: number, options?: { feeRate: number }) => {\n if (!connector) {\n throw new Error('Wallet not connected!');\n }\n\n const signature = await connector.sendBitcoin(toAddress, satoshis, options);\n return signature;\n },\n [connector],\n );\n\n const getNetwork = useCallback(async () => {\n if (!connector) {\n throw new Error('Wallet not connected!');\n }\n const network = await connector.getNetwork();\n return network;\n }, [connector]);\n\n const switchNetwork = useCallback(\n async (network: 'livenet' | 'testnet') => {\n if (!connector) {\n throw new Error('Wallet not connected!');\n }\n await connector.switchNetwork(network);\n },\n [connector],\n );\n\n const smartAccount = useMemo(() => {\n if (typeof window === 'undefined') {\n return undefined;\n }\n\n if (\n !(window as any).__bitcoinSmartAccount ||\n ((window as any)?.__bitcoinSmartAccount &&\n ((window as any)?.__bitcoinSmartAccount.smartAccountContract.version !==\n accountContract.version ||\n (window as any)?.__bitcoinSmartAccount.smartAccountContract.name !==\n accountContract.name))\n ) {\n const smartAccount = new SmartAccount(\n new AASignerProvider(\n evmSupportChainIds,\n options.projectId,\n options.clientKey,\n options.rpcUrls,\n ) as any,\n options,\n );\n smartAccount.setSmartAccountContract(accountContract);\n (window as any).__bitcoinSmartAccount = smartAccount;\n }\n (window as any).__bitcoinSmartAccount.provider.getPublicKey = getPublicKey;\n (window as any).__bitcoinSmartAccount.provider.personalSign = signMessage;\n return (window as any).__bitcoinSmartAccount as SmartAccount;\n }, [options, evmSupportChainIds, getPublicKey, signMessage, accountContract]);\n\n const requestAccount = useCallback(\n async (connector: BaseConnector) => {\n let accounts = await connector.getAccounts();\n if (accounts.length === 0 && autoConnect) {\n accounts = await connector.requestAccounts();\n }\n setAccounts(accounts);\n },\n [autoConnect],\n );\n\n const requestDirectAccount = useCallback(async (connector: BaseConnector) => {\n let accounts = await connector.getAccounts();\n if (accounts.length === 0) {\n accounts = await connector.requestAccounts();\n }\n setAccounts(accounts);\n\n return accounts;\n }, []);\n\n useEffect(() => {\n if (connector) {\n requestAccount(connector).catch((e: any) => {\n console.error('get account error', e);\n\n setAccounts([]);\n });\n } else {\n setAccounts([]);\n }\n }, [connector, requestAccount]);\n\n useEffect(() => {\n const onAccountChange = (accounts: string[]) => {\n if (!accounts.length) return;\n setAccounts(accounts);\n };\n connector?.on('accountsChanged', onAccountChange);\n return () => {\n connector?.removeListener('accountsChanged', onAccountChange);\n };\n }, [connector]);\n\n const provider = useMemo(() => {\n if (connectorId) {\n return connectors.find((item) => item.metadata.id === connectorId)?.getProvider();\n }\n }, [connectorId, connectors]);\n\n const disconnect = useCallback(() => {\n storageStore()?.remove('current-connector-id');\n txConfirm.reset();\n if (connector) {\n connector.disconnect();\n }\n setConnectorId(undefined);\n }, [connector]);\n\n useEffect(() => {\n const config = JSON.parse(localStorage.getItem(SAContractKey) || '{}');\n if (\n config.name &&\n config.version &&\n checkBTCVersion(options.aaOptions.accountContracts, config.name, config.version)\n ) {\n _setAccountContract(config);\n }\n }, [options.aaOptions.accountContracts, _setAccountContract]);\n\n useEffect(() => {\n if (options.walletOptions?.visible !== false) {\n const supportChains = evmSupportChainIds.map((id) => chains.getEVMChainInfoById(id));\n if (supportChains.some((chain) => !chain)) {\n throw new Error(`Please config valid chain ids, ${JSON.stringify(evmSupportChainIds)}`);\n }\n walletEntryPlugin.init(\n {\n projectId: options.projectId,\n clientKey: options.clientKey,\n appId: options.appId,\n },\n {\n ...options.walletOptions,\n erc4337: accountContract,\n customStyle: {\n ...options.walletOptions?.customStyle,\n supportChains: supportChains as any,\n },\n },\n );\n }\n }, [options, evmSupportChainIds, accountContract]);\n\n useEffect(() => {\n if (smartAccount && options.walletOptions?.visible !== false) {\n walletEntryPlugin.setWalletCore({\n ethereum: smartAccount.provider,\n });\n }\n }, [smartAccount, options]);\n\n useEffect(() => {\n if (options.walletOptions?.visible !== false) {\n if (evmAccount) {\n walletEntryPlugin.walletEntryCreate();\n } else {\n walletEntryPlugin.walletEntryDestroy();\n }\n }\n }, [evmAccount, smartAccount, options]);\n\n useEffect(() => {\n if (accounts.length === 0) {\n closeConnectModal();\n closeSignModal();\n if (events.listenerCount(EventName.sendUserOpResult) > 0) {\n events.emit(EventName.sendUserOpResult, {\n error: {\n code: -32600,\n message: 'Wallet disconnected',\n },\n });\n } else if (events.listenerCount(EventName.personalSignResult) > 0) {\n events.emit(EventName.personalSignResult, {\n error: {\n code: -32600,\n message: 'Wallet disconnected',\n },\n });\n } else if (events.listenerCount(EventName.signTypedDataResult) > 0) {\n events.emit(EventName.signTypedDataResult, {\n error: {\n code: -32600,\n message: 'Wallet disconnected',\n },\n });\n }\n }\n }, [accounts, closeConnectModal, closeSignModal]);\n\n return (\n <ConnectContext.Provider\n value={{\n connectorId,\n setConnectorId,\n connector,\n connectors,\n connectModalOpen,\n openConnectModal,\n closeConnectModal,\n accounts,\n provider,\n disconnect,\n requestDirectAccount,\n getPublicKey,\n signMessage,\n evmAccount,\n smartAccount,\n getNetwork,\n switchNetwork,\n sendBitcoin,\n accountContract: accountContract,\n setAccountContract: setAccountContract,\n }}\n >\n {children}\n <ConnectModal open={connectModalOpen} onClose={closeConnectModal} />\n <SignModal open={signModalOpen} onClose={closeSignModal} onOpen={openSignModal} />\n </ConnectContext.Provider>\n );\n};\n\nexport const useConnectProvider = () => {\n const context = useContext(ConnectContext);\n return context;\n};\n", "import { useEffect, useState } from 'react';\nimport { type BaseConnector } from '../../connector/base';\nimport { useConnectProvider } from '../../context';\nimport { useConnector } from '../../hooks';\nimport back from '../../icons/back.svg';\nimport close from '../../icons/close.svg';\nimport retryIcon from '../../icons/retry.svg';\nimport Button from '../button';\nimport Modal from '../modal';\nimport styles from './connect.module.scss';\n\nconst ConnectModal = ({ open, onClose }: { open: boolean; onClose: () => void }) => {\n const [backVisible, setBackVisible] = useState(false);\n const [retryVisible, setRetryVisible] = useState(false);\n const [walletReady, setWalletReady] = useState(true);\n const [selectConnector, setSelectConnector] = useState<BaseConnector>();\n const { closeConnectModal } = useConnectProvider();\n const { connect, connectors } = useConnector();\n\n useEffect(() => {\n if (!open) {\n setBackVisible(false);\n setRetryVisible(false);\n setWalletReady(true);\n setSelectConnector(undefined);\n }\n }, [open]);\n\n const onConnect = async (connector: BaseConnector) => {\n setBackVisible(true);\n setSelectConnector(connector);\n if (connector.isReady()) {\n try {\n await connect(connector.metadata.id);\n closeConnectModal();\n } catch (error: any) {\n console.error('onConnect error', error);\n if (error.code === 4001) {\n setRetryVisible(true);\n }\n }\n } else {\n setWalletReady(false);\n }\n };\n\n const onBack = () => {\n setBackVisible(false);\n setRetryVisible(false);\n setWalletReady(true);\n setSelectConnector(undefined);\n };\n\n const onRetry = () => {\n setRetryVisible(false);\n if (selectConnector) {\n onConnect(selectConnector);\n }\n };\n\n return (\n <Modal open={open} onClose={onClose} isDismissable={false} contentClassName={styles.connectModal}>\n <div className={styles.title}>{selectConnector?.metadata.name || 'Choose Wallet'}</div>\n <img className={styles.closeBtn} src={close} onClick={onClose}></img>\n {backVisible && <img className={styles.backBtn} src={back} onClick={onBack}></img>}\n\n {!backVisible &&\n connectors.map((connector) => {\n return (\n <div className={styles.walletItem} key={connector.metadata.id} onClick={() => onConnect(connector)}>\n <img className={styles.walletIcon} src={connector.metadata.icon}></img>\n <div className={styles.walletName}>{connector.metadata.name}</div>\n </div>\n );\n })}\n\n {backVisible && selectConnector && (\n <div className={styles.connecting}>\n <div className={styles.connectingIconContainer}>\n <img className={styles.connectingIcon} src={selectConnector.metadata.icon}></img>\n {retryVisible && (\n <div className={styles.retryContainer} onClick={onRetry}>\n <img className={styles.retryIcon} src={retryIcon}></img>\n </div>\n )}\n </div>\n\n {walletReady ? (\n <>\n <div className={styles.connection}>{retryVisible ? 'Request Cancelled' : 'Requesting Connection'}</div>\n <div className={styles.acceptRequest}>\n {retryVisible\n ? 'You cancelled the request.\\nClick above to try again.'\n : 'Accept the request through your wallet to connect to this app.'}\n </div>\n </>\n ) : (\n <>\n <div className={styles.connection}>Wallet Not Installed.</div>\n <Button\n className={styles.btnDownload}\n onClick={() => {\n window.open(selectConnector?.metadata.downloadUrl, '_blank');\n }}\n >\n Get\n </Button>\n </>\n )}\n </div>\n )}\n </Modal>\n );\n};\n\nexport default ConnectModal;\n", "import { useConnectProvider } from '../context';\n\nexport const useAccountContract = () => {\n const { accountContract, setAccountContract } = useConnectProvider();\n return {\n accountContract,\n setAccountContract,\n };\n};\n", "import { useConnectProvider } from '../context';\n\nexport const useAccounts = () => {\n const { accounts } = useConnectProvider();\n return { accounts };\n};\n", "import { useCallback } from 'react';\nimport { useConnectProvider } from '../context';\n\nexport const useBTCProvider = () => {\n const {\n connector,\n provider,\n accounts,\n getPublicKey,\n signMessage,\n getNetwork,\n switchNetwork,\n sendBitcoin,\n } = useConnectProvider();\n\n const sendInscription = useCallback(\n async (address: string, inscriptionId: string, options?: { feeRate: number }) => {\n if (!connector) {\n throw new Error('Wallet not connected!');\n }\n const result = await connector.sendInscription(address, inscriptionId, options);\n return result;\n },\n [connector],\n );\n\n return {\n provider,\n accounts,\n getPublicKey,\n signMessage,\n getNetwork,\n switchNetwork,\n sendBitcoin,\n sendInscription,\n connector,\n };\n};\n", "import { useConnectProvider } from '../context';\n\nexport const useConnectModal = () => {\n const { openConnectModal, disconnect, requestDirectAccount, connectModalOpen } =\n useConnectProvider();\n return { openConnectModal, disconnect, requestDirectAccount, connectModalOpen };\n};\n", "import { useCallback } from 'react';\nimport { useConnectProvider } from '../context';\nimport { storageStore } from '../utils';\n\nexport const useConnector = () => {\n const { connectors, setConnectorId } = useConnectProvider();\n\n const connect = useCallback(\n async (connectorId: string) => {\n const connector = connectors.find((item) => item.metadata.id === connectorId);\n if (!connector) {\n throw new Error(`connector id ${connectorId} not found`);\n }\n const accounts = await connector.requestAccounts();\n if (accounts.length > 0) {\n storageStore()?.set('current-connector-id', connector.metadata.id);\n setConnectorId(connector.metadata.id);\n }\n },\n [connectors, setConnectorId],\n );\n\n return { connectors, connect };\n};\n", "import { intToHex } from '@ethereumjs/util';\nimport type {\n SendTransactionParams,\n Transaction,\n UserOpBundle,\n UserOpParams,\n} from '@particle-network/aa';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { createWalletClient, custom, type PublicClient } from 'viem';\nimport { useConnectProvider } from '../context';\nimport { EthereumProvider } from '../evmSigner/provider';\nimport { WalletClientProvider } from '../evmSigner/walletClientProvider';\nimport { EventName } from '../types/eventName';\nimport events, { getPendingSignEventAccount } from '../utils/eventUtils';\nimport txConfirm from '../utils/txConfirmUtils';\n\nexport const useETHProvider: any = () => {\n const { evmAccount, smartAccount } = useConnectProvider();\n const [chainId, setChainId] = useState<number>();\n\n useEffect(() => {\n if (smartAccount) {\n const chainId = (smartAccount.provider as any).chainId as number;\n setChainId(chainId);\n\n const onChangeChange = (id: string) => {\n setChainId(Number(id));\n };\n smartAccount.provider.on('chainChanged', onChangeChange);\n return () => {\n smartAccount.provider.removeListener('chainChanged', onChangeChange);\n };\n }\n }, [smartAccount]);\n\n const switchChain = useCallback(\n async (chainId: number) => {\n if (smartAccount?.provider) {\n await smartAccount.provider.request({\n method: 'wallet_switchEthereumChain',\n params: [\n {\n chainId: intToHex(chainId),\n },\n ],\n });\n }\n },\n [smartAccount?.provider],\n );\n\n const getFeeQuotes = useCallback(\n async (tx: Transaction | Transaction[]) => {\n if (!smartAccount) {\n throw new Error('The smart account is not initialized.');\n }\n return smartAccount.getFeeQuotes(tx);\n },\n [smartAccount],\n );\n\n const buildUserOp = useCallback(\n async ({ tx, feeQuote, tokenPaymasterAddress }: UserOpParams) => {\n if (!smartAccount) {\n throw new Error('The smart account is not initialized.');\n }\n const result = await smartAccount.buildUserOperation({ tx, feeQuote, tokenPaymasterAddress });\n return result;\n },\n [smartAccount],\n );\n\n const sendUserOp = useCallback(\n async (params: SendTransactionParams, forceHideConfirmModal?: boolean) => {\n if (!smartAccount) {\n throw new Error('The smart account is not initialized.');\n }\n\n const showConfirmModal = !forceHideConfirmModal && !txConfirm.isNotRemind();\n\n if (showConfirmModal) {\n if (getPendingSignEventAccount() > 0) {\n throw new Error('Operation failed, there is a transaction being processed');\n }\n }\n\n let userOpBundle: UserOpBundle | undefined;\n if (\n Object.prototype.hasOwnProperty.call(params, 'userOpHash') &&\n Object.prototype.hasOwnProperty.call(params, 'userOp')\n ) {\n const { userOpHash, userOp } = params as UserOpBundle;\n if (userOpHash && userOp) {\n userOpBundle = { userOpHash, userOp };\n }\n }\n\n if (!userOpBundle) {\n const { tx, feeQuote, tokenPaymasterAddress } = params as UserOpParams;\n userOpBundle = await buildUserOp({ tx, feeQuote, tokenPaymasterAddress });\n }\n\n if (!showConfirmModal) {\n return smartAccount.sendUserOperation(userOpBundle);\n }\n\n return new Promise<string>((resolve, reject) => {\n events.emit(EventName.sendUserOp, userOpBundle);\n events.once(EventName.sendUserOpResult, ({ result, error }) => {\n if (result) {\n resolve(result);\n } else {\n reject(error);\n }\n });\n });\n },\n [smartAccount, buildUserOp],\n );\n\n const publicClient = useMemo(() => {\n if (!smartAccount || !chainId) {\n return undefined;\n }\n return (smartAccount?.provider as any).publicClient as PublicClient;\n }, [smartAccount, chainId]);\n\n const provider = useMemo(() => {\n const ethereumProvider = new EthereumProvider(\n sendUserOp,\n smartAccount?.provider as any,\n evmAccount,\n );\n return ethereumProvider;\n }, [evmAccount, sendUserOp, smartAccount?.provider]);\n\n const walletClient = useMemo(() => {\n return createWalletClient({\n transport: custom(new WalletClientProvider(provider)),\n });\n }, [provider]);\n\n return {\n provider,\n /** @deprecated please use account */\n evmAccount,\n account: evmAccount,\n switchChain,\n chainId,\n getFeeQuotes,\n buildUserOp,\n sendUserOp,\n publicClient,\n walletClient,\n };\n};\n", "import type { IEthereumProvider, JsonRpcRequest, SendTransactionParams } from '@particle-network/aa';\nimport { type AASignerProvider } from '.';\n\nexport class EthereumProvider implements IEthereumProvider {\n constructor(\n public sendUserOp: (params: SendTransactionParams, forceHideConfirmModal?: boolean) => Promise<string>,\n public signer?: AASignerProvider,\n public account?: string\n ) {}\n\n on(event: string, listener: any): this {\n this.signer?.on(event, listener);\n return this;\n }\n\n once(event: string, listener: any): this {\n this.signer?.once(event, listener);\n return this;\n }\n\n off(event: string, listener: any): this {\n this.signer?.off(event, listener);\n return this;\n }\n\n removeListener(event: string, listener: any): this {\n this.signer?.removeListener(event, listener);\n return this;\n }\n\n async request(arg: Partial<JsonRpcRequest>): Promise<any> {\n const method = arg.method;\n if (!method) {\n throw new Error('Method not found.');\n }\n\n if (method === 'eth_accounts' || method === 'eth_requestAccounts') {\n return this.account ? [this.account] : [];\n } else if (method === 'eth_sendTransaction') {\n const txData = arg.params?.[0];\n const result = await this.sendUserOp({ tx: txData });\n return result;\n }\n\n return this.signer?.request(arg as any);\n }\n}\n", "import { EventEmitter } from 'events';\nimport { EventName } from '../types/eventName';\n\nconst events = new EventEmitter();\nevents.setMaxListeners(100);\n\nexport const getPendingSignEventAccount = () => {\n return (\n events.listenerCount(EventName.sendUserOpResult) +\n events.listenerCount(EventName.personalSignResult) +\n events.listenerCount(EventName.signTypedDataResult)\n );\n};\n\nexport default events;\n", "const txConfirm = {\n isNotRemind: () => {\n if (typeof window === 'undefined') return false;\n const value = localStorage.getItem('tx-confirm-modal-remind');\n return value === '0';\n },\n setNotRemind: (notRemind: boolean) => {\n if (typeof window === 'undefined') return;\n if (notRemind) {\n localStorage.setItem('tx-confirm-modal-remind', '0');\n } else {\n localStorage.removeItem('tx-confirm-modal-remind');\n }\n },\n reset: () => {\n if (typeof window === 'undefined') return;\n localStorage.removeItem('tx-confirm-modal-remind');\n },\n};\n\nexport default txConfirm;\n", "import type { IEthereumProvider, JsonRpcRequest } from '@particle-network/aa';\nimport { EventName } from '../types/eventName';\nimport { EVMMethod } from '../types/evmMethod';\nimport events, { getPendingSignEventAccount } from '../utils/eventUtils';\nimport txConfirm from '../utils/txConfirmUtils';\n\nexport class WalletClientProvider implements IEthereumProvider {\n constructor(private provider: IEthereumProvider) {}\n\n on(event: string, listener: any): this {\n this.provider.on(event, listener);\n return this;\n }\n\n once(event: string, listener: any): this {\n this.provider.once(event, listener);\n return this;\n }\n\n off(event: string, listener: any): this {\n this.provider.off(event, listener);\n return this;\n }\n\n removeListener(event: string, listener: any): this {\n this.provider.removeListener(event, listener);\n return this;\n }\n\n async request(arg: Partial<JsonRpcRequest>): Promise<any> {\n const method = arg.method;\n if (!method) {\n throw new Error('Method not found.');\n }\n\n if (method === EVMMethod.personalSign || method.startsWith(EVMMethod.signTypedData)) {\n const showConfirmModal = !txConfirm.isNotRemind();\n if (showConfirmModal) {\n if (getPendingSignEventAccount() > 0) {\n throw new Error('Operation failed, there is a transaction being processed');\n }\n }\n if (!showConfirmModal) {\n return this.provider.request(arg as any);\n }\n }\n\n if (method === EVMMethod.personalSign) {\n console.log('personal_sign ---- ', arg);\n return new Promise<string>((resolve, reject) => {\n events.emit(EventName.personalSign, arg);\n events.once(EventName.personalSignResult, ({ result, error }) => {\n if (result) {\n resolve(result);\n } else {\n reject(error);\n }\n });\n });\n } else if (method.startsWith(EVMMethod.signTypedData)) {\n return new Promise<string>((resolve, reject) => {\n events.emit(EventName.signTypedData, arg);\n events.once(EventName.signTypedDataResult, ({ result, error }) => {\n if (result) {\n resolve(result);\n } else {\n reject(error);\n }\n });\n });\n }\n\n return this.provider.request(arg as any);\n }\n}\n", "\nconst digest = '906d42389ecad5c2ab92642c8e0775ea667c413b069684ce9d01199562f2d0be';\nconst classes = {\"loader\":\"_loader_g0am3_1\",\"rotate\":\"_rotate_g0am3_1\",\"prixClipFix\":\"_prixClipFix_g0am3_1\"};\nconst css = `._loader_g0am3_1{animation:_rotate_g0am3_1 1s linear infinite;border-radius:50%;height:20px;position:relative;width:20px}._loader_g0am3_1:before{animation:_prixClipFix_g0am3_1 2s linear infinite;border:2px solid #000;border-radius:50%;box-sizing:border-box;content:\"\";inset:0;position:absolute}@keyframes _rotate_g0am3_1{to{transform:rotate(1turn)}}@keyframes _prixClipFix_g0am3_1{0%{clip-path:polygon(50% 50%,0 0,0 0,0 0,0 0,0 0)}25%{clip-path:polygon(50% 50%,0 0,100% 0,100% 0,100% 0,100% 0)}50%{clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)}75%{clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)}to{clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0)}}`;\n\n(function() {\n if (typeof document !== \"undefined\" && !document.getElementById(digest)) {\n var ele = document.createElement('style');\n ele.id = digest;\n ele.textContent = css;\n document.head.appendChild(ele);\n }\n})();\n\nexport default classes;\nexport { css, digest, classes };\n ", "import { type CSSProperties } from 'react';\nimport styles from './spinner.module.scss';\n\nconst Spinner = ({ className, style }: { className?: string; style?: CSSProperties | undefined }) => {\n return <span className={styles.loader + (className ? ` ${className}` : '')} style={style}></span>;\n};\n\nexport default Spinner;\n", "\nconst digest = '424d614dbc2763d7cad7ca35c00bd255c6ed55da308a1f3018594201a47127bf';\nconst classes = {\"btn\":\"_btn_ofd87_1\"};\nconst css = `._btn_ofd87_1{align-items:center;background:#fff;border-radius:8px;color:#000;display:flex;flex-direction:row;font-size:16px;gap:16px;justify-content:center;padding:6px 24px;position:relative}._btn_ofd87_1:hover{opacity:.85}._btn_ofd87_1:disabled{background:hsla(0,0%,100%,.2);color:hsla(0,0%,100%,.639);cursor:not-allowed;opacity:1}`;\n\n(function() {\n if (typeof document !== \"undefined\" && !document.getElementById(digest)) {\n var ele = document.createElement('style');\n ele.id = digest;\n ele.textContent = css;\n document.head.appendChild(ele);\n }\n})();\n\nexport default classes;\nexport { css, digest, classes };\n ", "import { type CSSProperties, type ReactNode } from 'react';\nimport Spinner from '../spinner';\nimport styles from './button.module.scss';\n\nconst Button = ({\n children,\n isLoading,\n isDisabled,\n onClick,\n className,\n style,\n}: {\n children: ReactNode;\n isLoading?: boolean;\n isDisabled?: boolean;\n onClick?: () => void;\n className?: string;\n style?: CSSProperties | undefined;\n}) => {\n return (\n <button\n className={styles.btn + (className ? ` ${className}` : '')}\n onClick={isLoading || isDisabled ? undefined : onClick}\n disabled={isDisabled}\n style={style}\n >\n {isLoading && !isDisabled && <Spinner />}\n {children}\n </button>\n );\n};\n\nexport default Button;\n", "import { useEffect, useMemo, useState, type CSSProperties, type MouseEventHandler, type ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\nimport { RemoveScroll } from 'react-remove-scroll';\nimport styles from './modal.module.scss';\n\ninterface ModalProp {\n open: boolean;\n onClose: () => void;\n children: ReactNode;\n isDismissable?: boolean;\n contentStyle?: CSSProperties | undefined;\n contentClassName?: string;\n}\n\nconst stopPropagation: MouseEventHandler<unknown> = (event) => event.stopPropagation();\n\nconst Modal = ({ open, onClose, children, isDismissable = true, contentStyle, contentClassName }: ModalProp) => {\n const handleBackdropClick = useMemo(() => (isDismissable ? onClose : undefined), [onClose, isDismissable]);\n\n useEffect(() => {\n if (isDismissable) {\n const handleEscape = (event: KeyboardEvent) => open && event.key === 'Escape' && onClose();\n\n document.addEventListener('keydown', handleEscape);\n\n return () => document.removeEventListener('keydown', handleEscape);\n }\n }, [open, onClose, isDismissable]);\n\n const [bodyScrollable, setBodyScrollable] = useState(true);\n useEffect(() => {\n setBodyScrollable(getComputedStyle(window.document.body).overflow !== 'hidden');\n }, []);\n\n return (\n <>\n {open\n ? createPortal(\n <RemoveScroll enabled={bodyScrollable}>\n <div className={styles.container} onClick={handleBackdropClick}>\n <div\n className={styles.modal + (contentClassName ? ` ${contentClassName}` : '')}\n style={contentStyle}\n onClick={stopPropagation}\n >\n {children}\n </div>\n </div>\n </RemoveScroll>,\n document.body\n )\n : null}\n </>\n );\n};\n\nexport default Modal;\n", "\nconst digest = '9c9a003376c4060e772fdba1e4b20a9af75a33b996c44ae9cea877de3ceb1b80';\nconst classes = {\"container\":\"_container_1s3ca_1\",\"modal\":\"_modal_1s3ca_18\"};\nconst css = `._container_1s3ca_1{align-items:center;backdrop-filter:blur(12px);background:rgba(0,0,0,.502);bottom:0;color:#fff;display:flex;height:100%;justify-content:center;left:0;overflow:hidden;position:fixed;right:0;top:0;width:100%;z-index:100000}._container_1s3ca_1 ._modal_1s3ca_18{align-items:center;background-color:#131313;border-radius:16px;display:flex;flex-direction:column;font-size:14px;height:auto;margin:16px;max-height:80%;max-width:100%;overflow:auto;padding:24px;position:relative;width:380px}`;\n\n(function() {\n if (typeof document !== \"undefined\" && !document.getElementById(digest)) {\n var ele = document.createElement('style');\n ele.id = digest;\n ele.textContent = css;\n document.head.appendChild(ele);\n }\n})();\n\nexport default classes;\nexport { css, digest, classes };\n ", "\nconst digest = '9f37532ca7be1b0e97d8b75261330d17b9316635d48e9ec58b471baefd1f674c';\nconst classes = {\"connectModal\":\"_connectModal_1tdkv_1\",\"title\":\"_title_1tdkv_4\",\"closeBtn\":\"_closeBtn_1tdkv_9\",\"backBtn\":\"_backBtn_1tdkv_15\",\"walletItem\":\"_walletItem_1tdkv_21\",\"walletIcon\":\"_walletIcon_1tdkv_41\",\"walletName\":\"_walletName_1tdkv_46\",\"connecting\":\"_connecting_1tdkv_50\",\"connectingIconContainer\":\"_connectingIconContainer_1tdkv_58\",\"retryContainer\":\"_retryContainer_1tdkv_61\",\"retryIcon\":\"_retryIcon_1tdkv_70\",\"connectingIcon\":\"_connectingIcon_1tdkv_58\",\"connection\":\"_connection_1tdkv_79\",\"acceptRequest\":\"_acceptRequest_1tdkv_83\",\"btnDownload\":\"_btnDownload_1tdkv_90\"};\nconst css = `._connectModal_1tdkv_1{gap:12px}._connectModal_1tdkv_1 ._title_1tdkv_4{font-size:18px;font-weight:700;margin-bottom:16px}._connectModal_1tdkv_1 ._closeBtn_1tdkv_9{cursor:pointer;position:absolute;right:16px;top:16px}._connectModal_1tdkv_1 ._backBtn_1tdkv_15{cursor:pointer;left:16px;position:absolute;top:16px}._connectModal_1tdkv_1 ._walletItem_1tdkv_21{background-color:hsla(0,0%,100%,.05);border:1px solid transparent;border-radius:8px;box-sizing:border-box;color:#fff;cursor:pointer;display:flex;font-size:14px;font-weight:700;gap:12px;padding:8px 16px;transition:all .15s ease;width:100%}._connectModal_1tdkv_1 ._walletItem_1tdkv_21:hover{background:hsla(0,0%,100%,.08);border-color:#ff7a00;color:#ff7a00}._connectModal_1tdkv_1 ._walletItem_1tdkv_21 ._walletIcon_1tdkv_41{border-radius:8px;height:32px;width:32px}._connectModal_1tdkv_1 ._walletItem_1tdkv_21 ._walletName_1tdkv_46{flex-grow:1;line-height:32px}._connectModal_1tdkv_1 ._connecting_1tdkv_50{align-items:center;display:flex;flex-direction:column;height:204px;justify-content:center;width:100%}._connectModal_1tdkv_1 ._connecting_1tdkv_50 ._connectingIconContainer_1tdkv_58{position:relative}._connectModal_1tdkv_1 ._connecting_1tdkv_50 ._connectingIconContainer_1tdkv_58 ._retryContainer_1tdkv_61{background:#4b5563;border-radius:50%;bottom:-12px;cursor:pointer;padding:4px;position:absolute;right:-12px}._connectModal_1tdkv_1 ._connecting_1tdkv_50 ._connectingIconContainer_1tdkv_58 ._retryContainer_1tdkv_61 ._retryIcon_1tdkv_70{height:24px;width:24px}._connectModal_1tdkv_1 ._connecting_1tdkv_50 ._connectingIcon_1tdkv_58{border-radius:4px;height:60px;width:60px}._connectModal_1tdkv_1 ._connecting_1tdkv_50 ._connection_1tdkv_79{font-size:18px;margin-top:20px}._connectModal_1tdkv_1 ._connecting_1tdkv_50 ._acceptRequest_1tdkv_83{color:hsla(0,0%,100%,.4);font-size:14px;margin-top:6px;text-align:center;white-space:pre-wrap}._connectModal_1tdkv_1 ._connecting_1tdkv_50 ._btnDownload_1tdkv_90{margin-top:20px}`;\n\n(function() {\n if (typeof document !== \"undefined\" && !document.getElementById(digest)) {\n var ele = document.createElement('style');\n ele.id = digest;\n ele.textContent = css;\n document.head.appendChild(ele);\n }\n})();\n\nexport default classes;\nexport { css, digest, classes };\n ", "import type { RequestArguments, UserOpBundle } from '@particle-network/aa';\nimport { chains } from '@particle-network/chains';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { formatEther, hexToString, type Hex } from 'viem';\nimport { useConnectProvider } from '../../context';\nimport { useETHProvider } from '../../hooks';\nimport { useAccountContract } from '../../hooks/useAccountContract';\nimport checkBox from '../../icons/check_box.svg';\nimport checkBoxBlank from '../../icons/check_box_blank.svg';\nimport close from '../../icons/close.svg';\nimport copy from '../../icons/copy.svg';\nimport { type EVMDeserializeTransactionResult } from '../../types/deserializeTx';\nimport { EventName } from '../../types/eventName';\nimport { EVMMethod } from '../../types/evmMethod';\nimport { shortString } from '../../utils';\nimport { caculateNativeFee } from '../../utils/ethereumUtils';\nimport events from '../../utils/eventUtils';\nimport txConfirm from '../../utils/txConfirmUtils';\nimport Button from '../button';\nimport CopyText from '../copyText';\nimport Modal from '../modal';\nimport TransactionDetails from '../transactionDetails';\nimport styles from './sign.module.scss';\n\nconst SignModal = ({\n open,\n onClose,\n onOpen,\n}: {\n open: boolean;\n onClose: () => void;\n onOpen: () => void;\n}) => {\n const [userOpBundle, setUserOpBundle] = useState<UserOpBundle>();\n const [notRemindChecked, setNotRemindChecked] = useState<boolean>(false);\n const [loading, setLoading] = useState<boolean>(false);\n const [deserializeLoading, setDeserializeLoading] = useState<boolean>(false);\n const [deserializeResult, setDeserializeResult] = useState<\n EVMDeserializeTransactionResult[] | undefined\n >();\n const [disabled, setDisabled] = useState<boolean>(false);\n const [showNotRemind, setShowNotRemind] = useState<boolean>(true);\n const [nativeBalance, setNativeBalance] = useState<bigint>();\n const { accountContract } = useAccountContract();\n\n // personal_sign or eth_signTypedData\n const [requestArguments, setRequestArguments] = useState<RequestArguments>();\n\n const { chainId, publicClient, evmAccount, provider } = useETHProvider();\n const { smartAccount } = useConnectProvider();\n\n useEffect(() => {\n if (!open) {\n setDeserializeResult(undefined);\n setUserOpBundle(undefined);\n setRequestArguments(undefined);\n setLoading(false);\n setDisabled(false);\n setDeserializeLoading(false);\n setNativeBalance(undefined);\n }\n }, [open]);\n\n useEffect(() => {\n if (open) {\n const notRemind = txConfirm.isNotRemind();\n setShowNotRemind(!notRemind);\n if (!notRemind) {\n setNotRemindChecked(false);\n }\n }\n }, [open]);\n\n const chainInfo = useMemo(() => {\n if (chainId) {\n return chains.getEVMChainInfoById(chainId);\n }\n }, [chainId]);\n\n useEffect(() => {\n const onSendUserOp = (opBundle: UserOpBundle) => {\n setUserOpBundle(opBundle);\n onOpen();\n };\n const onPersonalSign = (arg: RequestArguments) => {\n setRequestArguments(arg);\n onOpen();\n };\n const onSignTypedData = (arg: RequestArguments) => {\n setRequestArguments(arg);\n onOpen();\n };\n events.on(EventName.sendUserOp, onSendUserOp);\n events.on(EventName.personalSign, onPersonalSign);\n events.on(EventName.signTypedData, onSignTypedData);\n return () => {\n events.off(EventName.sendUserOp, onSendUserOp);\n events.off(EventName.personalSign, onPersonalSign);\n events.off(EventName.signTypedData, onSignTypedData);\n };\n }, [onOpen, setUserOpBundle]);\n\n const deserializeUserOp = useCallback(async () => {\n if (userOpBundle && smartAccount) {\n const addresses = await smartAccount.provider.request({ method: 'eth_accounts' });\n const owner = addresses[0];\n const result = await smartAccount.sendRpc({\n method: 'particle_aa_deserializeUserOp',\n params: [\n {\n name: accountContract.name,\n version: accountContract.version,\n ownerAddress: owner,\n },\n userOpBundle.userOp,\n ],\n });\n return result;\n }\n }, [userOpBundle, smartAccount, accountContract]);\n\n useEffect(() => {\n if (userOpBundle && open) {\n console.log('deserializeUserOp start');\n setDeserializeLoading(true);\n deserializeUserOp()\n .then((result) => {\n console.log('\uD83D\uDE80 ~ deserializeUserOp ~ result:', result);\n setDeserializeResult(result as any);\n })\n .catch((error) => {\n console.log('\uD83D\uDE80 ~ deserializeUserOp ~ error:', error);\n events.emit(EventName.sendUserOpResult, {\n error,\n });\n onClose();\n });\n }\n }, [deserializeUserOp, userOpBundle, open, onClose]);\n\n useEffect(() => {\n if (open && publicClient && evmAccount && userOpBundle) {\n publicClient\n .getBalance({ address: evmAccount as Hex })\n .then((result: any) => setNativeBalance(result))\n .catch((error: any) => {\n console.log('\uD83D\uDE80 ~ getBalance ~ error:', error);\n events.emit(EventName.sendUserOpResult, {\n error,\n });\n onClose();\n });\n }\n }, [open, publicClient, evmAccount, userOpBundle, onClose]);\n\n useEffect(() => {\n if (nativeBalance != null && deserializeResult != null) {\n setDeserializeLoading(false);\n }\n }, [nativeBalance, deserializeResult]);\n\n const toggleNotRemind = () => {\n setNotRemindChecked(!notRemindChecked);\n txConfirm.setNotRemind(!notRemindChecked);\n };\n\n const gasFee = useMemo(() => {\n if (userOpBundle?.userOp) {\n return caculateNativeFee(userOpBundle?.userOp);\n }\n return BigInt(0);\n }, [userOpBundle]);\n\n const closeModal = () => {\n let event;\n if (userOpBundle) {\n event = EventName.sendUserOpResult;\n } else if (requestArguments?.method === EVMMethod.personalSign) {\n event = EventName.personalSignResult;\n } else if (requestArguments?.method?.startsWith(EVMMethod.signTypedData)) {\n event = EventName.signTypedDataResult;\n }\n\n if (event) {\n events.emit(event, {\n error: {\n code: 4001,\n message: 'The user rejected the request.',\n },\n });\n }\n\n onClose();\n };\n\n const confirmTx = useCallback(async () => {\n if (smartAccount && provider) {\n setLoading(true);\n if (userOpBundle) {\n try {\n const hash = await smartAccount.sendUserOperation(userOpBundle);\n events.emit(EventName.sendUserOpResult, { result: hash });\n } catch (error) {\n events.emit(EventName.sendUserOpResult, {\n error,\n });\n } finally {\n setLoading(false);\n }\n } else if (requestArguments) {\n try {\n const hash = await provider.request(requestArguments);\n events.emit(\n requestArguments.method == EVMMethod.personalSign\n ? EventName.personalSignResult\n : EventName.signTypedDataResult,\n { result: hash },\n );\n } catch (error) {\n events.emit(\n requestArguments.method == EVMMethod.personalSign\n ? EventName.personalSignResult\n : EventName.signTypedDataResult,\n {\n error,\n },\n );\n } finally {\n setLoading(false);\n }\n }\n\n onClose();\n }\n }, [smartAccount, provider, requestArguments, userOpBundle, onClose]);\n\n useEffect(() => {\n if (userOpBundle && nativeBalance != null && deserializeResult) {\n const nativeChange = deserializeResult\n .filter(\n (item) =>\n item.estimatedChanges.natives?.[0]?.nativeChange &&\n item.estimatedChanges.natives[0].nativeChange.startsWith('-'),\n )\n .map((item) =>\n BigInt(item.estimatedChanges?.natives?.[0]?.nativeChange?.replace('-', '') || 0),\n )\n .reduce((accumulator, currentValue) => accumulator + currentValue, BigInt(0));\n if (userOpBundle.userOp.paymasterAndData.length > 2) {\n setDisabled(nativeBalance < nativeChange);\n } else {\n setDisabled(nativeBalance < gasFee + nativeChange);\n }\n }\n }, [userOpBundle, gasFee, nativeBalance, deserializeResult]);\n\n const unsignedMessage = useMemo(() => {\n if (!requestArguments) {\n return undefined;\n }\n\n if (requestArguments.method === EVMMethod.personalSign) {\n const message = requestArguments.params?.[0] || '0x';\n return hexToString(message);\n } else {\n const typedData = requestArguments.params?.[1];\n const obj = typeof typedData === 'string' ? JSON.parse(typedData) : typedData;\n return JSON.stringify(obj, null, 2);\n }\n }, [requestArguments]);\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n isDismissable={false}\n contentClassName={styles.modalContent}\n >\n <>\n <img className={styles.closeBtn} src={close} onClick={closeModal}></img>\n\n {requestArguments && (\n <div className={styles.signTitle}>\n {requestArguments.method == EVMMethod.personalSign ? 'Sign Message' : 'Sign Typed Data'}\n </div>\n )}\n\n <div className={styles.chainInfo}>\n <img src={chainInfo?.icon}></img>\n {chainInfo?.fullname.replace('Mainnet', '')}\n </div>\n\n <div className={styles.addressContainer}>\n <CopyText value={evmAccount} style={{ textDecorationLine: 'none' }}>\n <div className={styles.addressInfo}>\n {shortString(evmAccount)}\n <img src={copy}></img>\n </div>\n </CopyText>\n </div>\n\n <div\n className={\n styles.detailsContent + (deserializeResult || requestArguments ? ` ${styles.fill}` : '')\n }\n >\n {deserializeResult &&\n deserializeResult.map((details, index) => (\n <TransactionDetails key={`${details.type}-${index}`} details={details} />\n ))}\n\n {unsignedMessage && <div className={styles.unsignedMessage}>{unsignedMessage}</div>}\n </div>\n\n {gasFee && (\n <div className={styles.estimatedGas}>{`Estimated gas fee: ${formatEther(gasFee)} ${\n chainInfo?.nativeCurrency.symbol\n }`}</div>\n )}\n\n <Button\n onClick={confirmTx}\n className={styles.signBtn}\n isLoading={loading || deserializeLoading}\n isDisabled={disabled}\n >\n {deserializeLoading ? 'LOADING' : disabled ? 'INSUFFICIENT FEE' : 'CONFIRM'}\n </Button>\n\n {showNotRemind && (\n <div className={styles.notRemind} onClick={toggleNotRemind}>\n <img src={notRemindChecked ? checkBox : checkBoxBlank}></img>\n Do not remind me again\n </div>\n )}\n </>\n </Modal>\n );\n};\n\nexport default SignModal;\n", "import { bytesToHex, publicToAddress, toBytes, toChecksumAddress } from '@ethereumjs/util';\nimport type { UserOp } from '@particle-network/aa';\n\nexport const pubKeyToEVMAddress = (pubKey: string) => {\n const address = toChecksumAddress(bytesToHex(publicToAddress(toBytes(`0x${pubKey}`), true)));\n return address;\n};\n\nexport function caculateNativeFee(userOp: UserOp): bigint {\n return (\n (BigInt(userOp.callGasLimit) +\n BigInt(userOp.verificationGasLimit) +\n BigInt(userOp.preVerificationGas)) *\n BigInt(userOp.maxFeePerGas)\n );\n}\n", "import { useState, type CSSProperties } from 'react';\nimport { copyToClipboard } from '../../utils';\nimport styles from './copyText.module.scss';\n\nexport interface CopyTextProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n value?: string;\n className?: string;\n style?: CSSProperties | undefined;\n}\n\nexport default function CopyText({ children, value, className, style }: CopyTextProps) {\n const [copied, setCopied] = useState<boolean>();\n\n const handleClick = async () => {\n if (copied) {\n return;\n }\n\n try {\n if (value) {\n await copyToClipboard(value);\n } else if (typeof children === 'string' || typeof children === 'number' || typeof children === 'boolean') {\n await copyToClipboard(children.toString());\n } else {\n throw new Error('please set copy value');\n }\n setCopied(true);\n setTimeout(() => setCopied(false), 1000);\n } catch (error) {\n //ignore\n }\n };\n\n return (\n <div\n className={styles.copyText + (className ? ` ${className}` : '') + (copied ? ` ${styles.copied}` : '')}\n onClick={handleClick}\n style={style}\n >\n {copied ? 'Copied' : children}\n </div>\n );\n}\n", "\nconst digest = 'd6fbb5df7ed6ec51d41f665ca768306181bb1e7d7c1cef8eed9bd4230368d7bb';\nconst classes = {\"copyText\":\"_copyText_smolu_1\",\"copied\":\"_copied_smolu_9\"};\nconst css = `._copyText_smolu_1{cursor:pointer;text-decoration-line:underline}._copyText_smolu_1:hover{opacity:.75}._copied_smolu_9{color:#a855f7;cursor:none;text-decoration-line:none}._copied_smolu_9:hover{opacity:1}`;\n\n(function() {\n if (typeof document !== \"undefined\" && !document.getElementById(digest)) {\n var ele = document.createElement('style');\n ele.id = digest;\n ele.textContent = css;\n document.head.appendChild(ele);\n }\n})();\n\nexport default classes;\nexport { css, digest, classes };\n ", "import { chains } from '@particle-network/chains';\nimport { useCallback, useMemo } from 'react';\nimport { formatUnits } from 'viem';\nimport { useETHProvider } from '../../hooks';\nimport unverified from '../../icons/unverified.svg';\nimport verified from '../../icons/verified.svg';\nimport {\n TransactionSmartType,\n type EVMDeserializeTransactionResult,\n type EVMTokenChange,\n} from '../../types/deserializeTx';\nimport { defaultTokenIcon, ipfsToSrc, shortString } from '../../utils';\nimport CopyText from '../copyText';\nimport Tooltip from '../tooltip';\nimport styles from './transactionDetails.module.scss';\n\nconst TransactionDetails = ({ details }: { details: EVMDeserializeTransactionResult }) => {\n const { chainId } = useETHProvider();\n\n const chainInfo = useMemo(() => {\n if (chainId) {\n return chains.getEVMChainInfoById(chainId);\n }\n }, [chainId]);\n\n const titleContent = useMemo(() => {\n switch (details.type) {\n case TransactionSmartType.NATIVE_TRANSFER:\n return `Send ${chainInfo?.nativeCurrency.symbol}`;\n case TransactionSmartType.ERC20_TRANSFER:\n return `Send ${details.estimatedChanges.tokens[0]?.symbol}`;\n case TransactionSmartType.ERC20_APPROVE:\n return 'Approve Spending';\n case TransactionSmartType.ERC721_TRANFER:\n return 'Send NFT';\n case TransactionSmartType.ERC1155_TRANFER:\n return 'Send NFT';\n default:\n return 'Transaction Details';\n }\n }, [details, chainInfo]);\n\n const nftContractType = useMemo(() => {\n if (details.type === TransactionSmartType.ERC721_TRANFER) {\n return 'ERC721';\n } else if (details.type === TransactionSmartType.ERC1155_TRANFER) {\n return 'ERC1155';\n }\n }, [details]);\n\n const nativeIcon = useMemo(() => {\n if (chainInfo) {\n if (chainInfo.nativeCurrency.symbol === 'ETH') {\n return 'https://static.particle.network/token-list/ethereum/native.png';\n } else {\n return chainInfo.nativeIcon || chainInfo.icon;\n }\n }\n return defaultTokenIcon;\n }, [chainInfo]);\n\n // to address\n const to = useMemo(() => {\n const params = details.data?.function?.params;\n if (details.type == TransactionSmartType.ERC20_TRANSFER) {\n return params ? (params[params.length === 3 ? 1 : 0].value as string) : '';\n } else if (details.type == TransactionSmartType.ERC20_APPROVE) {\n return params ? (params[0].value as string) : '';\n } else if (details.type == TransactionSmartType.NATIVE_TRANSFER) {\n return details.data.to;\n } else if (\n details.type == TransactionSmartType.ERC721_TRANFER ||\n details.type == TransactionSmartType.ERC1155_TRANFER\n ) {\n return params ? (params[1].value as string) : '';\n } else {\n return details.data.to;\n }\n }, [details]);\n\n const balanceChangeTextColor = useCallback((value: string | number) => {\n if (BigInt(value) > 0) {\n return '#4ade80';\n } else if (BigInt(value) < 0) {\n return '#ef4444';\n } else {\n return 'white';\n }\n }, []);\n\n const functionContent = useMemo(() => {\n if (details.type !== TransactionSmartType.NATIVE_TRANSFER && details.data.function) {\n const params = details.data.function.params.map((item) => item.name);\n return `${details.data.function.name}(${params.join(', ')})`;\n }\n }, [details]);\n\n const approveTokenAmount = useMemo(() => {\n if (details.type === TransactionSmartType.ERC20_APPROVE) {\n const amount = details.data?.function?.params?.[1]?.value as string;\n return BigInt(amount || 0);\n }\n return BigInt(0);\n }, [details]);\n\n const tokenAmountChange = useCallback(\n (tokenItem: EVMTokenChange) => {\n const result = formatUnits(\n details.type === TransactionSmartType.ERC20_APPROVE ? approveTokenAmount : BigInt(tokenItem.amountChange),\n tokenItem.decimals\n );\n\n if (details.type !== TransactionSmartType.ERC20_APPROVE && BigInt(tokenItem.amountChange) > BigInt(0)) {\n return `+${result}`;\n }\n\n return result;\n },\n [approveTokenAmount, details]\n );\n\n const showContactAddress = useMemo(() => {\n return (\n details.type === TransactionSmartType.ERC20_TRANSFER ||\n details.type === TransactionSmartType.ERC20_APPROVE ||\n details.type === TransactionSmartType.ERC721_TRANFER ||\n details.type === TransactionSmartType.ERC1155_TRANFER\n );\n }, [details]);\n\n return (\n <div className={styles.detailsCard}>\n <div className={styles.title}>{titleContent}</div>\n {nftContractType && <div className={styles.nftContract}>{nftContractType}</div>}\n\n {details.estimatedChanges.natives.map((nativeItem) => {\n return (\n <div key={nativeItem.address} className={styles.row}>\n <img className={styles.tokenIcon} src={nativeIcon}></img>\n <div className={styles.balanceChange} style={{ color: balanceChangeTextColor(nativeItem.nativeChange) }}>\n {BigInt(nativeItem.nativeChange) > 0 ? '+' : undefined}\n {formatUnits(BigInt(nativeItem.nativeChange), chainInfo?.nativeCurrency.decimals || 18)}\n </div>\n <div className={styles.tokenSymbol}>{chainInfo?.nativeCurrency.symbol}</div>\n </div>\n );\n })}\n\n {details.estimatedChanges.tokens.map((tokenItem) => {\n return (\n <div key={tokenItem.address} className={styles.row}>\n <img className={styles.tokenIcon} src={tokenItem.image || defaultTokenIcon}></img>\n <div className={styles.balanceChange}>\n <span style={{ color: balanceChangeTextColor(tokenItem.amountChange) }}>\n {tokenAmountChange(tokenItem)}\n </span>\n {` ${tokenItem.symbol}`}\n </div>\n </div>\n );\n })}\n\n {details.estimatedChanges.nfts.map((nftItem) => {\n return (\n <div key={nftItem.address} className={styles.row}>\n <div style={{ fontSize: 16 }}>\n <img className={styles.nftIcon} src={ipfsToSrc(nftItem.image || defaultTokenIcon)}></img>\n {nftItem.name || `NFT#${nftItem.tokenId}`}\n </div>\n <div className={styles.balanceChange} style={{ color: balanceChangeTextColor(nftItem.amountChange) }}>\n {nftItem.amountChange}\n </div>\n </div>\n );\n })}\n\n {to && (\n <div className={styles.row}>\n <div>To</div>\n <div className={styles.toContract}>\n {details.toVerified != null && !showContactAddress && (\n <Tooltip content={details.toVerified ? 'Verified Contract' : 'Unverified Contract'}>\n <img src={details.toVerified ? verified : unverified}></img>\n </Tooltip>\n )}\n <CopyText value={to}>{shortString(to)}</CopyText>\n </div>\n </div>\n )}\n\n {showContactAddress && (\n <div className={styles.row}>\n <div>Contract</div>\n <div className={styles.toContract}>\n {details.toVerified != null && (\n <Tooltip content={details.toVerified ? 'Verified Contract' : 'Unverified Contract'}>\n <img src={details.toVerified ? verified : unverified}></img>\n </Tooltip>\n )}\n <CopyText value={details.data.to}>{shortString(details.data.to)}</CopyText>\n </div>\n </div>\n )}\n\n <div className={styles.row}>\n <div>Hex Data</div>\n <CopyText value={details.data.data}>{shortString(details.data.data)}</CopyText>\n </div>\n\n {functionContent && (\n <div className={styles.row}>\n <div>Function</div>\n <div className={styles.right}>{functionContent}</div>\n </div>\n )}\n </div>\n );\n};\n\nexport default TransactionDetails;\n", "\nconst digest = 'ee15dc27fcfd209601159e7f0e0063ff4e7a886b7b892c1600a911372b82a0b1';\nconst classes = {\"tipContainer\":\"_tipContainer_ufud7_1\",\"tipContent\":\"_tipContent_ufud7_5\"};\nconst css = `._tipContainer_ufud7_1{overflow:visible;position:relative}._tipContainer_ufud7_1 ._tipContent_ufud7_5{background:#3f3f46;border-radius:8px;bottom:100%;color:#fff;font-size:11px;left:-100%;opacity:0;padding:3px 6px;position:absolute;transition:opacity .5s;visibility:hidden;white-space:nowrap;z-index:1}._tipContainer_ufud7_1:hover ._tipContent_ufud7_5{opacity:1;visibility:visible}`;\n\n(function() {\n if (typeof document !== \"undefined\" && !document.getElementById(digest)) {\n var ele = document.createElement('style');\n ele.id = digest;\n ele.textContent = css;\n document.head.appendChild(ele);\n }\n})();\n\nexport default classes;\nexport { css, digest, classes };\n ", "import { type ReactNode } from 'react';\nimport styles from './tooltip.module.scss';\n\nconst Tooltip = ({ children, content, className }: { children: ReactNode; content: string; className?: string }) => {\n return (\n <div className={styles.tipContainer}>\n {children}\n <div className={styles.tipContent + (className ? ` ${className}` : '')}>{content}</div>\n </div>\n );\n};\n\nexport default Tooltip;\n", "\nconst digest = 'a81c744751497ed4b401c08b9e5aeef1991aeb86f2cbba3ee57c1926c0502f1a';\nconst classes = {\"detailsCard\":\"_detailsCard_ml2p9_1\",\"title\":\"_title_ml2p9_13\",\"nftContract\":\"_nftContract_ml2p9_19\",\"row\":\"_row_ml2p9_26\",\"tokenIcon\":\"_tokenIcon_ml2p9_35\",\"nftIcon\":\"_nftIcon_ml2p9_41\",\"balanceChange\":\"_balanceChange_ml2p9_49\",\"tokenSymbol\":\"_tokenSymbol_ml2p9_56\",\"toContract\":\"_toContract_ml2p9_61\",\"right\":\"_right_ml2p9_71\"};\nconst css = `._detailsCard_ml2p9_1{background:#232529;border:1px solid #252525;border-radius:8px;color:#fff;margin-top:16px;overflow-x:hidden;padding:10px;position:relative;width:100%}._detailsCard_ml2p9_1 ._title_ml2p9_13{font-size:16px;font-weight:600;margin-bottom:12px;text-align:left}._detailsCard_ml2p9_1 ._nftContract_ml2p9_19{color:#a855f7;font-size:16px;position:absolute;right:8px;top:8px}._detailsCard_ml2p9_1 ._row_ml2p9_26{align-items:center;display:flex;flex-direction:row;font-size:14px;gap:8px;justify-content:space-between;margin-top:6px}._detailsCard_ml2p9_1 ._row_ml2p9_26 ._tokenIcon_ml2p9_35{border-radius:50%;height:32px;margin:10px 0;width:32px}._detailsCard_ml2p9_1 ._row_ml2p9_26 ._nftIcon_ml2p9_41{border-radius:2px;display:inline;height:32px;margin:10px 8px 10px 0;width:32px}._detailsCard_ml2p9_1 ._row_ml2p9_26 ._balanceChange_ml2p9_49{flex-grow:2;font-size:16px;font-weight:500;text-align:end;word-break:break-word}._detailsCard_ml2p9_1 ._row_ml2p9_26 ._tokenSymbol_ml2p9_56{font-size:16px;font-weight:500;text-align:end}._detailsCard_ml2p9_1 ._row_ml2p9_26 ._toContract_ml2p9_61{align-items:center;display:flex;gap:8px}._detailsCard_ml2p9_1 ._row_ml2p9_26 ._toContract_ml2p9_61 img{display:inline;height:18px;width:18px}._detailsCard_ml2p9_1 ._row_ml2p9_26 ._right_ml2p9_71{text-align:end}`;\n\n(function() {\n if (typeof document !== \"undefined\" && !document.getElementById(digest)) {\n var ele = document.createElement('style');\n ele.id = digest;\n ele.textContent = css;\n document.head.appendChild(ele);\n }\n})();\n\nexport default classes;\nexport { css, digest, classes };\n ", "\nconst digest = '3ab1a455562ae7e24c2ac49572897e615b9e9275066fd0d64f0cf24844521bab';\nconst classes = {\"modalContent\":\"_modalContent_aoysu_1\",\"closeBtn\":\"_closeBtn_aoysu_5\",\"signTitle\":\"_signTitle_aoysu_11\",\"chainInfo\":\"_chainInfo_aoysu_16\",\"addressContainer\":\"_addressContainer_aoysu_29\",\"addressInfo\":\"_addressInfo_aoysu_34\",\"detailsContent\":\"_detailsContent_aoysu_49\",\"fill\":\"_fill_aoysu_58\",\"unsignedMessage\":\"_unsignedMessage_aoysu_61\",\"estimatedGas\":\"_estimatedGas_aoysu_76\",\"signBtn\":\"_signBtn_aoysu_81\",\"notRemind\":\"_notRemind_aoysu_85\"};\nconst css = `._modalContent_aoysu_1{color:#fff;text-align:center}._modalContent_aoysu_1 ._closeBtn_aoysu_5{cursor:pointer;position:absolute;right:16px;top:16px}._modalContent_aoysu_1 ._signTitle_aoysu_11{font-size:20px;font-weight:600;margin-bottom:10px}._modalContent_aoysu_1 ._chainInfo_aoysu_16{align-items:center;display:flex;flex-direction:row;font-size:12px;gap:8px;justify-content:center;margin-bottom:8px}._modalContent_aoysu_1 ._chainInfo_aoysu_16 img{height:18px;width:18px}._modalContent_aoysu_1 ._addressContainer_aoysu_29{height:28px;margin-bottom:16px;margin-top:8px}._modalContent_aoysu_1 ._addressContainer_aoysu_29 ._addressInfo_aoysu_34{align-items:center;background:rgba(58,58,58,.635);border-radius:20px;display:flex;flex-direction:row;font-size:12px;gap:4px;justify-content:center;padding:4px 8px}._modalContent_aoysu_1 ._addressContainer_aoysu_29 ._addressInfo_aoysu_34 img{height:18px;width:18px}._modalContent_aoysu_1 ._detailsContent_aoysu_49{max-height:0;overflow-y:auto;transition:max-height .3s linear;width:100%}._modalContent_aoysu_1 ._detailsContent_aoysu_49::-webkit-scrollbar{display:none}._modalContent_aoysu_1 ._detailsContent_aoysu_49._fill_aoysu_58{max-height:500px}._modalContent_aoysu_1 ._detailsContent_aoysu_49 ._unsignedMessage_aoysu_61{background:#232529;border:1px solid #252525;border-radius:8px;box-sizing:border-box;color:#fff;font-size:14px;padding:8px;width:100%;word-wrap:break-word;color:hsla(0,0%,100%,.631);text-align:left;white-space:pre-wrap}._modalContent_aoysu_1 ._estimatedGas_aoysu_76{color:hsla(0,0%,100%,.631);font-size:12px;margin-top:24px}._modalContent_aoysu_1 ._signBtn_aoysu_81{margin-top:24px;min-width:200px}._modalContent_aoysu_1 ._notRemind_aoysu_85{align-items:center;color:hsla(0,0%,100%,.631);cursor:pointer;display:inline-flex;font-size:12px;gap:4px;margin-top:16px}._modalContent_aoysu_1 ._notRemind_aoysu_85:hover{opacity:.85}`;\n\n(function() {\n if (typeof document !== \"undefined\" && !document.getElementById(digest)) {\n var ele = document.createElement('style');\n ele.id = digest;\n ele.textContent = css;\n document.head.appendChild(ele);\n }\n})();\n\nexport default classes;\nexport { css, digest, classes };\n ", "import type { RequestArguments } from '@particle-network/aa';\nimport { chains } from '@particle-network/chains';\nimport { EventEmitter } from 'events';\nimport { UnsupportedProviderMethodError, createPublicClient, http, type PublicClient } from 'viem';\n\nexport class AASignerProvider {\n private events: EventEmitter;\n chainId = 1;\n publicClient: PublicClient;\n constructor(\n public supportChainIds: number[],\n public projectId: string,\n public clientKey: string,\n public rpcUrls: Record<number, string> | undefined,\n ) {\n this.events = new EventEmitter();\n this.events.setMaxListeners(100);\n\n if (typeof window !== 'undefined') {\n const localChainId = localStorage.getItem('connect-evm-chain-id');\n if (localChainId && supportChainIds.includes(Number(localChainId))) {\n this.chainId = Number(localChainId);\n } else {\n const chainId = supportChainIds[0];\n if (chainId) {\n localStorage.setItem('connect-evm-chain-id', chainId.toString());\n this.chainId = chainId;\n }\n }\n }\n\n this.publicClient = this.getPublicClient();\n }\n\n async request(arg: RequestArguments) {\n if (\n arg.method === 'eth_sendTransaction' ||\n arg.method === 'wallet_addEthereumChain' ||\n arg.method === 'wallet_watchAsset' ||\n arg.method === 'eth_sign'\n ) {\n throw new UnsupportedProviderMethodError(\n new Error('The Provider does not support the requested method.'),\n );\n }\n\n const result = await this.publicClient.request(arg as any);\n return result;\n }\n\n personalSign = async (message: string): Promise<string> => {\n throw new Error('Wallet not connected!');\n };\n\n getPublicKey = async (): Promise<string> => {\n throw new Error('Wallet not connected!');\n };\n\n removeListener(event: string, listener: (...args: any[]) => void) {\n this.events.removeListener(event, listener);\n return this;\n }\n\n on(event: string, listener: (...args: any[]) => void) {\n this.events.on(event, listener);\n return this;\n }\n\n once(event: string, listener: any) {\n this.events.once(event, listener);\n return this;\n }\n\n off(event: string, listener: any) {\n this.events.off(event, listener);\n return this;\n }\n\n emit(event: string, ...args: any[]) {\n this.events.emit(event, args);\n }\n\n getPublicClient = () => {\n const rpcUrl =\n this?.rpcUrls?.[this.chainId] || chains.getEVMChainInfoById(this.chainId || 1)?.rpcUrl;\n console.log('rpcUrl', rpcUrl);\n\n return createPublicClient({\n transport: http(rpcUrl),\n }) as unknown as PublicClient;\n };\n}\n", "import { useCallback, useState } from 'react';\n\nconst useModalStateValue = () => {\n const [isModalOpen, setModalOpen] = useState(false);\n\n return {\n closeModal: useCallback(() => setModalOpen(false), []),\n isModalOpen,\n openModal: useCallback(() => setModalOpen(true), []),\n };\n};\n\nexport default useModalStateValue;\n", "import React, { useContext, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { ConnectProvider as BTCConnectProvider } from '../context';\nimport {\n UnisatConnector,\n XverseConnector,\n OKXConnector,\n BitgetConnector,\n MagicEdenConnector,\n BybitConnector,\n GateConnector,\n // BinanceConnector,\n} from '../connector';\nimport { useBTCProvider, useConnectModal } from '../hooks';\n\nimport ComfirmBox from '../components/confirmBox';\nimport { retryOperation } from '../utils';\n\n// Global handler to prevent duplicate events\nconst eventCache = {\n lastProcessedAccount: '',\n lastProcessedTime: 0,\n};\n\nconst WalletSelectorContext = React.createContext<any>(null);\n\nexport function BtcWalletSelectorContextProvider({\n children,\n}: {\n children: React.ReactNode;\n autoConnect?: boolean;\n}) {\n const [isProcessing, setIsProcessing] = useState(false);\n\n //OKX\uFF0CBitget\uFF0Cbybit\uFF0CXverse\uFF0CUnisat\n const connectors = [\n new OKXConnector(),\n new BitgetConnector(),\n new BybitConnector(),\n new XverseConnector(),\n new UnisatConnector(),\n new MagicEdenConnector(),\n new GateConnector(),\n // new BinanceConnector(),\n ];\n\n const walletSelectorContextValue = useMemo(() => {\n const simpleFn: Record<string, ((e: any) => void)[]> = {};\n\n return {\n setIsProcessing,\n emit: (eventName: string, e: any) => {\n if (simpleFn[eventName] && simpleFn[eventName].length) {\n simpleFn[eventName].forEach((fn: (e: any) => void) => {\n fn(e);\n });\n }\n },\n on: (eventName: string, fn: (e: any) => void) => {\n simpleFn[eventName] = simpleFn[eventName] || [];\n simpleFn[eventName].push(fn);\n },\n };\n }, []);\n\n return (\n <WalletSelectorContext.Provider value={walletSelectorContextValue}>\n <BTCConnectProvider\n options={{\n projectId: 'btc',\n clientKey: 'btc',\n appId: 'btc',\n aaOptions: {\n accountContracts: {\n BTC: [\n {\n chainIds: [686868],\n version: '1.0.0',\n },\n ],\n },\n },\n walletOptions: {\n visible: true,\n },\n }}\n autoConnect={false}\n connectors={connectors}\n >\n {children}\n {isProcessing && (\n <ComfirmBox\n hash={''}\n status={0}\n onClose={() => {\n setIsProcessing(false);\n }}\n />\n )}\n <InitBtcWalletSelectorContext />\n </BTCConnectProvider>\n </WalletSelectorContext.Provider>\n );\n}\n\nfunction InitBtcWalletSelectorContext() {\n const context = useBtcWalletSelector();\n useEffect(() => {\n window.btcContext = context;\n }, [context]);\n return null;\n}\n\nexport function useBtcWalletSelector() {\n // @ts-ignore\n const { openConnectModal, disconnect, requestDirectAccount, connectModalOpen } =\n useConnectModal();\n const {\n accounts,\n sendBitcoin,\n getPublicKey,\n provider,\n signMessage,\n connector,\n getNetwork,\n switchNetwork,\n } = useBTCProvider();\n const connectorRef = useRef<any>(null);\n const context = useContext(WalletSelectorContext);\n\n useEffect(() => {\n const handleAccountsChanged = (account: any) => {\n // Skip processing if we don't have an account\n if (!account?.length) return;\n\n // Create a key for this event\n const accountKey = JSON.stringify(account);\n const now = Date.now();\n\n // Force a minimum time between processing the same account (3 seconds)\n if (\n accountKey === eventCache.lastProcessedAccount &&\n now - eventCache.lastProcessedTime < 3000\n ) {\n return;\n }\n\n // Update cache\n eventCache.lastProcessedAccount = accountKey;\n eventCache.lastProcessedTime = now;\n\n getPublicKey().then((res) => {\n context.emit('updatePublicKey', res);\n });\n };\n\n connector?.on('accountsChanged', handleAccountsChanged);\n connectorRef.current = connector;\n\n return () => {\n connector?.removeListener('accountsChanged', handleAccountsChanged);\n };\n }, [connector, context, getPublicKey]);\n\n const hook = useMemo(() => {\n // Common connect method with two connection modes\n const connectWallet = async (useModal = false) => {\n if (connectModalOpen) return null;\n // const account = accounts?.[0];\n // if (account) return account;\n\n try {\n if (useModal) {\n openConnectModal?.();\n } else {\n await requestDirectAccount(connectorRef.current);\n }\n\n // Wait for account connection\n const account = await retryOperation(\n () => window.btcContext.account,\n (res) => !!res,\n {\n maxRetries: 100,\n delayMs: 1000,\n },\n );\n\n return account || null;\n } catch (error) {\n console.error('btcLoginError', error);\n context.emit('btcLoginError');\n return null;\n }\n };\n\n return {\n login: async () => {\n return connectWallet(true);\n },\n autoConnect: async () => {\n return connectWallet(false);\n },\n logout: () => {\n const accountId = accounts?.[0];\n if (!accountId) return;\n disconnect?.();\n context.emit('btcLogOut');\n },\n account: accounts?.[0],\n getPublicKey: async () => {\n const publicKey = await getPublicKey().catch(() => null);\n if (publicKey) return publicKey;\n\n await connectWallet(false);\n return getPublicKey();\n },\n signMessage: async (msg: string) => {\n await connectWallet(false);\n return signMessage(msg);\n },\n getContext: () => {\n return context;\n },\n getNetwork,\n switchNetwork,\n sendBitcoin: async (toAddress: string, satoshis: number, options?: { feeRate: number }) => {\n await connectWallet(false);\n return sendBitcoin(toAddress, satoshis, options);\n },\n };\n }, [\n accounts,\n getNetwork,\n switchNetwork,\n sendBitcoin,\n connectModalOpen,\n openConnectModal,\n context,\n requestDirectAccount,\n disconnect,\n getPublicKey,\n signMessage,\n ]);\n\n return hook;\n}\n", "import React from 'react';\n// import './modal.css'\n\ninterface Props {\n children?: any;\n onClose?: () => void;\n style?: any\n}\n\nconst styles: any = {}\n\nexport default function Modal({ children, onClose, style = {} }: Props) {\n return <div>\n <div className=\"layer\"></div>\n <div className=\"modal\" style={style}>\n <div className=\"close\" onClick={() => { onClose && onClose() }}>\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7.73284 5.99997L11.7359 1.99698C12.0368 1.69598 12.0882 1.25928 11.8507 1.02188L10.9779 0.149088C10.7404 -0.0884114 10.3043 -0.0363117 10.0028 0.264487L6.00013 4.26737L1.99719 0.264587C1.69619 -0.0367116 1.25948 -0.0884115 1.02198 0.149388L0.149174 1.02228C-0.0882276 1.25938 -0.0368271 1.69608 0.264576 1.99708L4.26761 5.99997L0.264576 10.0032C-0.0363271 10.304 -0.0884276 10.7404 0.149174 10.9779L1.02198 11.8507C1.25948 12.0882 1.69619 12.0367 1.99719 11.7358L6.00033 7.73266L10.0029 11.7352C10.3044 12.0368 10.7405 12.0882 10.978 11.8507L11.8508 10.9779C12.0882 10.7404 12.0368 10.304 11.736 10.0028L7.73284 5.99997Z\" fill=\"#808095\" />\n </svg>\n </div>\n {children}\n </div>\n </div>\n}", "import React from \"react\";\nimport Modal from \"./Modal\";\n\n// import './confirmBox.css'\n\ninterface Props {\n onClose: () => void;\n fromChain?: any;\n toChain?: any;\n status: number;\n hash: string;\n}\n\n\n\nexport default function ComfirmBox({ onClose, status = 1, fromChain = {\n name: 'NEAR',\n}, toChain = {\n name: 'BTC',\n}, hash }: Props) {\n return <Modal onClose={onClose}>\n <div className=\"title\">Transaction Detail</div>\n <div className=\"chians\">\n {/* <img style={{ width: 26, height: 26 }} src={fromChain?.icon} /> */}\n {/* <svg width=\"31\" height=\"2\" viewBox=\"0 0 31 2\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <line opacity=\"0.5\" x1=\"8.74228e-08\" y1=\"1\" x2=\"31\" y2=\"1\" stroke=\"#727272\" stroke-width=\"2\" stroke-dasharray=\"2 5\" />\n </svg> */}\n\n {\n status === 0 ? <svg className=\"loading\" width=\"54\" height=\"54\" viewBox=\"0 0 54 54\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M52.0766 10.7867C53.0482 11.0471 53.6273 12.0399 53.3741 13.0134C53.1219 13.977 52.1361 14.5546 51.1725 14.3024L47.6172 13.3498L46.3268 18.1657C44.8261 23.7665 40.0219 27.6146 34.2721 28.6546C38.7381 32.4056 40.9681 38.1648 39.4673 43.7656L38.1769 48.5815L41.6972 49.5248C42.6655 49.7843 43.2401 50.7794 42.9806 51.7477C42.7212 52.7159 41.726 53.2905 40.7578 53.031L2.02593 42.6529L1.71657 42.5396C0.800668 42.1375 0.383843 41.0689 0.785965 40.153C1.15472 39.3126 2.09436 38.8809 2.97262 39.1481L6.52126 40.0989L7.81144 35.2839C9.31216 29.6832 14.1131 25.8341 19.8661 24.795C15.3968 21.0432 13.1702 15.2848 14.6709 9.68407L15.9615 4.86764L12.4128 3.91679C11.4445 3.65734 10.87 2.66223 11.1295 1.69395C11.3889 0.725662 12.384 0.151138 13.3523 0.410589L52.0766 10.7867ZM44.0959 12.4063L19.471 5.80801L18.1871 10.5994C17.0693 14.7711 18.671 19.3131 22.2022 22.3268C23.2549 23.2994 23.6544 24.61 23.3544 25.7297C23.0485 27.0126 21.9665 27.9627 20.6551 28.1007C16.1146 28.9516 12.432 32.0776 11.3175 36.2502L10.0214 41.0874L11.982 41.6127L12.5291 39.571C13.5385 35.8039 16.032 32.0464 21.0065 30.689L21.8135 30.4937C23.6047 30.2306 25.3145 29.1151 26.9388 27.1507C27.1931 29.441 28.1726 31.2771 29.8857 32.6567C34.4351 36.8 34.1706 41.1245 33.1094 45.0849L32.5623 47.1267L34.6428 47.6841L35.9323 42.8715C37.0501 38.6998 35.4522 34.1588 31.9215 31.1412C30.8693 30.1687 30.4684 28.8613 30.7693 27.7383C31.1136 26.4535 32.114 25.5215 33.4676 25.3711C38.0072 24.5235 41.6865 21.3966 42.8052 17.2216L44.0959 12.4063ZM40.7578 15.6185C40.1797 19.9295 35.6431 22.9023 32.7256 23.2863C30.9809 23.5169 29.1741 24.3456 27.3087 25.7742C26.4809 23.6244 25.3731 22.0143 23.9948 20.9474C21.5041 19.0198 20.6551 17.2216 20.3797 15.1185L40.7578 15.6185Z\" fill=\"white\" fill-opacity=\"0.21\" />\n </svg> : <svg width=\"54\" height=\"54\" viewBox=\"0 0 54 54\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"27\" cy=\"27\" r=\"21\" fill=\"#33FFDA\" />\n <circle cx=\"27\" cy=\"27\" r=\"24\" stroke=\"#33FFDA\" stroke-opacity=\"0.3\" stroke-width=\"6\" />\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M37.342 19.6604C38.2111 20.5494 38.2205 22.0006 37.363 22.9016L24.8987 36L17.651 28.5196C16.7858 27.6266 16.7826 26.1754 17.6439 25.2783C18.5052 24.3813 19.9048 24.378 20.77 25.271L24.8705 29.5031L34.2159 19.6822C35.0733 18.7812 36.4729 18.7714 37.342 19.6604Z\" fill=\"black\" />\n </svg>\n }\n\n {/* <svg width=\"31\" height=\"2\" viewBox=\"0 0 31 2\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <line opacity=\"0.5\" x1=\"8.74228e-08\" y1=\"1\" x2=\"31\" y2=\"1\" stroke=\"#727272\" stroke-width=\"2\" stroke-dasharray=\"2 5\" />\n </svg> */}\n {/* <img style={{ width: 26, height: 26 }} src={toChain?.icon} /> */}\n </div>\n\n {\n status === 0 && <>\n <div className=\"time\">\n Est Time: 5 mins\n </div>\n <div className=\"processing\">\n Transaction is processing. \n </div>\n </>\n }\n\n {\n status === 1 && <>\n <div className=\"time\">\n Bridge Completed\n </div>\n <div className=\"processing\">\n You can view your transaction on the <a href=\"/history\">bridge transaction history.</a>\n </div>\n </>\n }\n\n {\n !!hash && <><div className=\"srcBtn\" onClick={() => {\n if (fromChain.name === 'BTC') {\n window.open(`https://mempool.space/testnet/tx/${hash}`)\n } else if (fromChain.name === 'NEAR') {\n window.open(`https://testnet.nearblocks.io/txns/${hash}`)\n }\n\n }}>\n SRC TX <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M5.97871 8H2.02129C0.907217 8 0 7.09294 0 5.97905V2.02095C0 0.907063 0.907217 0 2.02129 0H3.73973C3.98175 0 4.17779 0.196012 4.17779 0.437986C4.17779 0.679959 3.98175 0.875972 3.73973 0.875972H2.02129C1.71573 0.875972 1.42775 0.994931 1.21142 1.21122C0.995099 1.42751 0.87612 1.71544 0.87612 2.02095V5.97769C0.87612 6.2832 0.995099 6.57114 1.21142 6.78743C1.42775 7.00372 1.71573 7.12268 2.02129 7.12268H5.97871C6.61011 7.12268 7.12388 6.60899 7.12388 5.97769V4.12977C7.12388 3.97432 7.20771 3.82832 7.34291 3.74992C7.40916 3.71206 7.48487 3.69179 7.56194 3.69179C7.63901 3.69179 7.71472 3.71206 7.78097 3.74992C7.91617 3.82832 8 3.97296 8 4.12977V5.97769C8 7.09294 7.09414 8 5.97871 8ZM7.35223 2.78066C7.41578 2.81715 7.48879 2.83608 7.56179 2.83608C7.6348 2.83608 7.70781 2.8158 7.77271 2.7793C7.90251 2.70496 7.98228 2.56572 7.98228 2.41702V0.438001C7.98228 0.206844 7.79434 0.0189453 7.56315 0.0189453H5.58378C5.35258 0.0189453 5.16465 0.206844 5.16465 0.438001C5.16465 0.669157 5.35258 0.857056 5.58378 0.857056H6.55077L3.70328 3.70405L3.70058 3.70676C3.62658 3.7861 3.58634 3.89111 3.58835 3.99958C3.59037 4.10806 3.6345 4.21149 3.7114 4.28803C3.79117 4.36779 3.89527 4.41105 4.00749 4.41105C4.1143 4.41105 4.2157 4.37049 4.29277 4.29885L4.29412 4.2975L7.14267 1.44944V2.41838C7.14267 2.56707 7.22379 2.70631 7.35223 2.78066Z\" fill=\"#FF7A00\" />\n </svg>\n </div>\n </>\n }\n\n {/* {\n status === 1 &&\n <button onClick={() => {\n onClose && onClose()\n }} className={styles.btn}>+ New Transfer</button>\n } */}\n\n </Modal>\n}", "export type ENV = 'mainnet' | 'testnet' | 'private_mainnet' | 'dev';\n\nexport const walletConfig: Record<\n ENV,\n {\n base_url: string;\n btcToken: string;\n btcTokenDecimals: number;\n nearToken: string;\n nearTokenDecimals: number;\n accountContractId: string;\n bridgeContractId: string;\n walletUrl: string;\n bridgeUrl: string;\n }\n> = {\n dev: {\n base_url: 'https://api.dev.satoshibridge.top',\n btcToken: 'nbtc-dev.testnet',\n btcTokenDecimals: 8,\n nearToken: 'wrap.testnet',\n nearTokenDecimals: 24,\n accountContractId: 'acc-dev.testnet',\n bridgeContractId: 'brg-dev.testnet',\n walletUrl: 'https://wallet-dev.satoshibridge.top',\n bridgeUrl: 'https://dev.satoshibridge.top/',\n },\n testnet: {\n base_url: 'https://api.testnet.satoshibridge.top',\n btcToken: 'nbtc2-nsp.testnet',\n btcTokenDecimals: 8,\n nearToken: 'wrap.testnet',\n nearTokenDecimals: 24,\n accountContractId: 'acc2-nsp.testnet',\n bridgeContractId: 'brg2-nsp.testnet',\n walletUrl: 'https://wallet-test.satoshibridge.top',\n bridgeUrl: 'https://testnet.satoshibridge.top/',\n },\n private_mainnet: {\n base_url: 'https://api.stg.satoshibridge.top',\n btcToken: 'nbtc.toalice.near',\n btcTokenDecimals: 8,\n nearToken: 'wrap.near',\n nearTokenDecimals: 24,\n accountContractId: 'acc.toalice.near',\n bridgeContractId: 'brg.toalice.near',\n walletUrl: 'https://wallet-stg.satoshibridge.top',\n bridgeUrl: 'https://old.ramp.satos.network',\n },\n mainnet: {\n base_url: 'https://api.satos.network',\n btcToken: 'nbtc.bridge.near',\n btcTokenDecimals: 8,\n nearToken: 'wrap.near',\n nearTokenDecimals: 24,\n accountContractId: 'acc.ref-labs.near',\n bridgeContractId: 'btc-connector.bridge.near',\n walletUrl: 'https://wallet.satoshibridge.top',\n bridgeUrl: 'https://ramp.satos.network',\n },\n};\n\nexport function getWalletConfig(env: ENV) {\n const config = walletConfig[env];\n const network = env === 'mainnet' || env === 'private_mainnet' ? 'mainnet' : 'testnet';\n return {\n ...config,\n network,\n };\n}\n\nexport const nearRpcUrls = {\n mainnet: [\n 'https://near.lava.build',\n 'https://rpc.mainnet.near.org',\n 'https://free.rpc.fastnear.com',\n 'https://near.drpc.org',\n ],\n testnet: ['https://rpc.testnet.near.org'],\n};\n\nexport const btcRpcUrls = {\n mainnet: 'https://mempool.space/api',\n testnet: 'https://mempool.space/testnet/api',\n};\n", "import Big from 'big.js';\nimport type { ENV } from '../config';\nimport { getWalletConfig, btcRpcUrls } from '../config';\nimport { retryOperation, storageStore } from '../utils';\nimport { nearCallFunction, pollTransactionStatuses } from '../utils/nearUtils';\nimport {\n checkBridgeTransactionStatus,\n getAccountInfo,\n getBridgeConfig,\n getWhitelist,\n preReceiveDepositMsg,\n receiveDepositMsg,\n calculateGasLimit,\n} from '../utils/satoshi';\nimport { Dialog } from '../utils/Dialog';\nimport type { FinalExecutionOutcome, Transaction } from '@near-wallet-selector/core';\nimport * as bitcoin from 'bitcoinjs-lib';\n// @ts-ignore\nimport coinselect from 'coinselect';\n// @ts-ignore\nimport * as ecc from '@bitcoinerlab/secp256k1';\n\nexport { calculateGasLimit, checkBridgeTransactionStatus };\n\n// init ecc lib\nbitcoin.initEccLib(ecc);\n\n/** NEAR Storage Deposit Amount */\nconst NEAR_STORAGE_DEPOSIT_AMOUNT = '1250000000000000000000';\n/** NBTC Storage Deposit Amount */\nconst NBTC_STORAGE_DEPOSIT_AMOUNT = '800';\n/** New account min deposit amount */\nconst NEW_ACCOUNT_MIN_DEPOSIT_AMOUNT = '1000';\n\nfunction getBtcProvider() {\n if (typeof window === 'undefined' || !window.btcContext) {\n throw new Error('BTC Provider is not initialized.');\n }\n return window.btcContext;\n}\n\nasync function getNetwork() {\n try {\n const network = await getBtcProvider().getNetwork();\n console.log('btc network:', network);\n return network === 'livenet' ? 'mainnet' : 'testnet';\n } catch (error) {\n return 'mainnet';\n }\n}\n\nfunction formatBtcAmount(amount: number | string) {\n return new Big(amount).div(10 ** 8).toFixed();\n}\n\nasync function getBtcRpcUrl() {\n const network = await getNetwork();\n return btcRpcUrls[network as keyof typeof btcRpcUrls];\n}\n\nasync function nearCall<T>(contractId: string, methodName: string, args: any) {\n const network = await getNetwork();\n return nearCallFunction<T>(contractId, methodName, args, { network });\n}\n\ntype CheckGasTokenDebtReturnType<T extends boolean> = T extends true\n ? void\n : { receiver_id: string; amount: string; msg: string } | undefined;\n\nexport async function checkGasTokenDebt<T extends boolean>(\n csna: string,\n env: ENV,\n autoDeposit?: T,\n): Promise<CheckGasTokenDebtReturnType<T>> {\n const accountInfo = await getAccountInfo({ csna, env });\n const debtAmount = new Big(accountInfo?.debt_info?.near_gas_debt_amount || 0)\n .plus(accountInfo?.debt_info?.protocol_fee_debt_amount || 0)\n .toString();\n const relayerFeeAmount = !accountInfo?.nonce\n ? NBTC_STORAGE_DEPOSIT_AMOUNT\n : accountInfo?.relayer_fee?.amount || 0;\n const hasDebtArrears = new Big(debtAmount).gt(0);\n const hasRelayerFeeArrears = new Big(relayerFeeAmount).gt(0);\n if (!hasDebtArrears && !hasRelayerFeeArrears) return;\n const config = getWalletConfig(env);\n const transferAmount = hasDebtArrears ? debtAmount : relayerFeeAmount;\n\n const action = {\n receiver_id: config.accountContractId,\n amount: transferAmount.toString(),\n msg: JSON.stringify(hasDebtArrears ? 'Repay' : 'RelayerFee'),\n };\n\n if (!autoDeposit) return action as CheckGasTokenDebtReturnType<T>;\n\n console.log('checkGasTokenDebt action:', action);\n\n const { minDepositAmount } = await getDepositAmount(action.amount, {\n env,\n });\n\n const remainingAmount = new Big(minDepositAmount).minus(transferAmount).toNumber();\n\n const confirmed = await Dialog.confirm({\n title: hasDebtArrears ? 'Gas Token Arrears' : 'Relayer Fee Arrears',\n message: hasDebtArrears\n ? `You have gas token arrears. Minimum deposit amount is ${formatBtcAmount(minDepositAmount)} BTC, of which ${formatBtcAmount(transferAmount)} BTC will be used to repay the debt, and the remaining ${formatBtcAmount(remainingAmount)} BTC will be credited to your account.`\n : `You have relayer fee arrears. Minimum deposit amount is ${formatBtcAmount(minDepositAmount)} BTC, of which ${formatBtcAmount(transferAmount)} BTC will be used for relayer fee, and the remaining ${formatBtcAmount(remainingAmount)} BTC will be credited to your account.`,\n });\n\n if (confirmed) {\n await executeBTCDepositAndAction({ amount: minDepositAmount.toString(), action, env });\n\n await Dialog.alert({\n title: 'Deposit Success',\n message: `Deposit successful. ${formatBtcAmount(transferAmount)} BTC has been paid for ${hasDebtArrears ? 'debt' : 'relayer fee'}, and the remaining ${formatBtcAmount(remainingAmount)} BTC has been credited to your account. Transaction will continue.`,\n });\n } else {\n throw new Error('Deposit failed, please deposit gas token first.');\n }\n}\n\ninterface DepositMsg {\n recipient_id: string;\n post_actions?: Array<{\n receiver_id: string;\n amount: string;\n memo?: string;\n msg: string;\n gas?: string;\n }>;\n extra_msg?: string;\n}\n\nexport async function getBtcGasPrice(): Promise<number> {\n const network = await getNetwork();\n const defaultFeeRate = network === 'mainnet' ? 5 : 2500;\n try {\n const btcRpcUrl = await getBtcRpcUrl();\n const res = await fetch(`${btcRpcUrl}/v1/fees/recommended`).then((res) => res.json());\n const feeRate = res.fastestFee ? Number(res.fastestFee) + 1 : defaultFeeRate;\n return feeRate;\n } catch (error) {\n return defaultFeeRate;\n }\n}\n\nexport async function getBtcUtxos(account: string) {\n const btcRpcUrl = await getBtcRpcUrl();\n const utxos: { value: number; status: { confirmed: boolean } }[] = await fetch(\n `${btcRpcUrl}/address/${account}/utxo`,\n ).then((res) => res.json());\n return utxos.filter((item) => item.status.confirmed);\n}\n\nexport async function calculateGasFee(account: string, amount: number, feeRate?: number) {\n const _feeRate = feeRate || (await getBtcGasPrice());\n const utxos = await getBtcUtxos(account);\n const { fee } = coinselect(utxos, [{ address: account, value: amount }], Math.ceil(_feeRate));\n console.log('calculateGasFee fee:', fee);\n return fee;\n}\n\nexport async function getBtcBalance(account?: string) {\n if (!account) {\n const res = await retryOperation(getBtcProvider, (res) => !!res.account);\n\n if (!res.account) {\n console.error('BTC Account is not available.');\n return { rawBalance: 0, balance: 0, availableBalance: 0 };\n }\n account = res.account;\n }\n\n const utxos = await getBtcUtxos(account);\n\n const btcDecimals = 8;\n\n const rawBalance = utxos?.reduce((acc, cur) => acc + cur.value, 0) || 0;\n const balance = rawBalance / 10 ** btcDecimals;\n\n const estimatedFee = await calculateGasFee(account, rawBalance);\n\n const availableRawBalance = (rawBalance - estimatedFee).toFixed(0);\n\n const availableBalance = new Big(availableRawBalance)\n .div(10 ** btcDecimals)\n .round(btcDecimals, Big.roundDown)\n .toNumber();\n\n return {\n rawBalance,\n balance,\n availableBalance: Math.max(availableBalance, 0),\n };\n}\n\nexport async function sendBitcoin(address: string, amount: number, feeRate: number) {\n const { sendBitcoin } = getBtcProvider();\n const txHash = await sendBitcoin(address, amount, { feeRate });\n return txHash;\n}\n\nexport async function signMessage(message: string) {\n const { signMessage, getPublicKey } = getBtcProvider();\n const publicKey = await getPublicKey();\n const signature = await signMessage(message);\n return { signature, publicKey };\n}\n\n/** estimate deposit receive amount, deduct protocol fee and repay amount */\nexport async function estimateDepositAmount(\n amount: string,\n option?: {\n env?: ENV;\n },\n) {\n return amount;\n}\n\nexport async function getDepositAmount(\n amount: string,\n option?: {\n csna?: string;\n env?: ENV;\n /** default is true, if true, new account minimum deposit amount 1000sat, otherwise 0 */\n newAccountMinDepositAmount?: boolean;\n },\n) {\n const env = option?.env || 'mainnet';\n const _newAccountMinDepositAmount = option?.newAccountMinDepositAmount ?? true;\n const csna = option?.csna || (await getCsnaAccountId(env));\n const accountInfo = await getAccountInfo({ csna, env });\n const debtAction = await checkGasTokenDebt(csna, env, false);\n const repayAmount = debtAction?.amount || 0;\n const depositAmount = Number(amount);\n const {\n deposit_bridge_fee: { fee_min, fee_rate },\n min_deposit_amount,\n } = await getBridgeConfig({ env });\n\n const protocolFee = Math.max(Number(fee_min), depositAmount * fee_rate);\n const newAccountMinDepositAmount =\n !accountInfo?.nonce && _newAccountMinDepositAmount ? NEW_ACCOUNT_MIN_DEPOSIT_AMOUNT : 0;\n let receiveAmount = new Big(depositAmount)\n .minus(protocolFee)\n .minus(repayAmount)\n .round(0, Big.roundDown)\n .toNumber();\n receiveAmount = Math.max(receiveAmount, 0);\n\n const minDepositAmount = new Big(min_deposit_amount || 0)\n .plus(newAccountMinDepositAmount)\n .plus(protocolFee)\n .plus(repayAmount)\n .round(0, Big.roundUp)\n .toNumber();\n\n console.log(\n `minDepositAmount: ${minDepositAmount} = ${min_deposit_amount} + ${newAccountMinDepositAmount} + ${protocolFee} + ${repayAmount}`,\n );\n\n return {\n depositAmount,\n receiveAmount,\n protocolFee,\n repayAmount,\n newAccountMinDepositAmount,\n minDepositAmount,\n };\n}\n\nexport async function getCsnaAccountId(env: ENV) {\n const config = getWalletConfig(env);\n const { getPublicKey } = getBtcProvider();\n const btcPublicKey = await getPublicKey();\n if (!btcPublicKey) {\n throw new Error('BTC Public Key is not available.');\n }\n const csna = await nearCall<string>(\n config.accountContractId,\n 'get_chain_signature_near_account_id',\n {\n btc_public_key: btcPublicKey,\n },\n );\n return csna;\n}\n\nfunction checkDepositDisabledAddress() {\n const data =\n storageStore('SATOSHI_WALLET_XVERSE')?.get<{ walletType: string; addressType: string }[]>(\n `Mainnet:addresses`,\n );\n if (!data) return;\n const address = data?.[0];\n if (address.walletType === 'ledger' && !['p2wpkh', 'p2sh'].includes(address.addressType)) {\n throw new Error('Ledger is only supported for p2wpkh and p2sh address');\n }\n}\n\ninterface ExecuteBTCDepositAndActionParams<T extends boolean = true> {\n action?: {\n receiver_id: string;\n amount: string;\n msg: string;\n };\n amount?: string;\n /** if registerDeposit is true, It will consume the deposit, otherwise it will be 0.000125 NEAR */\n registerDeposit?: string;\n feeRate?: number;\n env?: ENV;\n pollResult?: T;\n newAccountMinDepositAmount?: boolean;\n /** if registerContractId is provided, it will be used to register the contract, otherwise it will be the default contract id */\n registerContractId?: string;\n}\n\n/**\n * @param T - if true, return the poll result, otherwise return the btcTxHash\n */\ntype ExecuteBTCDepositAndActionReturn<T extends boolean> = T extends true\n ? FinalExecutionOutcome[]\n : string;\n\nexport async function executeBTCDepositAndAction<T extends boolean = true>({\n action,\n amount,\n feeRate,\n pollResult = true as T,\n registerDeposit,\n env = 'mainnet',\n newAccountMinDepositAmount,\n registerContractId,\n}: ExecuteBTCDepositAndActionParams<T>): Promise<ExecuteBTCDepositAndActionReturn<T>> {\n try {\n console.log('executeBTCDepositAndAction start', {\n action,\n amount,\n feeRate,\n pollResult,\n registerDeposit,\n newAccountMinDepositAmount,\n registerContractId,\n });\n checkDepositDisabledAddress();\n const { getPublicKey } = getBtcProvider();\n\n const config = getWalletConfig(env);\n\n const btcPublicKey = await getPublicKey();\n\n if (!btcPublicKey) {\n throw new Error('BTC Public Key is not available.');\n }\n if (!amount && !action) {\n throw new Error('Deposit amount or action is required');\n }\n\n const csna = await getCsnaAccountId(env);\n\n const depositAmount = new Big(amount || action?.amount || 0).round(0, Big.roundDown).toNumber();\n\n console.log('depositAmount', depositAmount);\n\n if (depositAmount <= 0) {\n throw new Error('Invalid deposit amount');\n }\n\n const { receiveAmount, protocolFee, repayAmount, minDepositAmount } = await getDepositAmount(\n depositAmount.toString(),\n {\n env,\n newAccountMinDepositAmount,\n },\n );\n\n if (depositAmount < minDepositAmount) {\n throw new Error(\n `Invalid deposit amount, must be greater than ${formatBtcAmount(minDepositAmount)} BTC`,\n );\n }\n\n const accountInfo = await getAccountInfo({ csna, env });\n\n const newActions = [];\n\n const debtAction = await checkGasTokenDebt(csna, env, false);\n\n if (debtAction) {\n newActions.push({\n ...debtAction,\n gas: '30000000000000', // 30 TGas\n });\n }\n\n // if action is not provided, and the gas token balance is less than the minimum deposit amount, then add the deposit action\n if (action) {\n newActions.push({\n ...action,\n gas: '100000000000000', // 100 TGas\n });\n }\n\n const storageDepositMsg: {\n storage_deposit_msg?: {\n contract_id: string;\n deposit: string;\n registration_only: boolean;\n };\n btc_public_key?: string;\n } = {};\n\n const _registerContractId =\n registerContractId ||\n (action?.receiver_id || config.btcToken).replace(config.accountContractId, config.btcToken);\n console.log('executeBTCDepositAndAction registerContractId', _registerContractId);\n // check receiver_id is registered\n const registerRes = await nearCall<{\n available: string;\n total: string;\n }>(_registerContractId, 'storage_balance_of', {\n account_id: csna,\n });\n\n if (!registerRes?.available) {\n storageDepositMsg.storage_deposit_msg = {\n contract_id: _registerContractId,\n deposit: registerDeposit || NEAR_STORAGE_DEPOSIT_AMOUNT,\n registration_only: true,\n };\n }\n // check account is registerer\n if (!accountInfo?.nonce) {\n storageDepositMsg.btc_public_key = btcPublicKey;\n }\n\n const depositMsg: DepositMsg = {\n recipient_id: csna,\n post_actions: newActions.length > 0 ? newActions : undefined,\n extra_msg:\n Object.keys(storageDepositMsg).length > 0 ? JSON.stringify(storageDepositMsg) : undefined,\n };\n\n console.log('get_user_deposit_address params:', { deposit_msg: depositMsg });\n const userDepositAddress = await nearCall<string>(\n config.bridgeContractId,\n 'get_user_deposit_address',\n { deposit_msg: depositMsg },\n );\n const _feeRate = feeRate || (await getBtcGasPrice());\n\n // deposit amount detail\n console.table({\n 'User Deposit Address': userDepositAddress,\n 'Deposit Amount': depositAmount,\n 'Protocol Fee': protocolFee,\n 'Repay Amount': repayAmount,\n 'Receive Amount': receiveAmount,\n 'Fee Rate': _feeRate,\n });\n\n const postActionsStr = newActions.length > 0 ? JSON.stringify(newActions) : undefined;\n\n await preReceiveDepositMsg({\n env,\n btcPublicKey,\n depositType: postActionsStr || depositMsg.extra_msg ? 1 : 0,\n postActions: postActionsStr,\n extraMsg: depositMsg.extra_msg,\n });\n\n const txHash = await sendBitcoin(userDepositAddress, depositAmount, _feeRate);\n\n await receiveDepositMsg({\n env,\n btcPublicKey,\n txHash,\n depositType: postActionsStr || depositMsg.extra_msg ? 1 : 0,\n postActions: postActionsStr,\n extraMsg: depositMsg.extra_msg,\n });\n\n if (!pollResult) {\n return txHash as ExecuteBTCDepositAndActionReturn<T>;\n }\n\n const checkTransactionStatusRes = await checkBridgeTransactionStatus({\n txHash,\n fromChain: 'BTC',\n env,\n });\n const network = await getNetwork();\n const result = await pollTransactionStatuses(network, [checkTransactionStatusRes.ToTxHash]);\n return result as ExecuteBTCDepositAndActionReturn<T>;\n } catch (error: any) {\n console.error('executeBTCDepositAndAction error:', error);\n throw error;\n }\n}\n\nexport async function checkSatoshiWhitelist(btcAccountId: string, env: ENV = 'mainnet') {\n if (env !== 'mainnet') return;\n const storage = storageStore();\n const hasShownNotice = storage?.get<string>('private-mainnet-notice');\n if (!hasShownNotice) {\n Dialog.alert({\n title: 'Notice',\n message:\n 'You are currently using Satoshi Private Mainnet. This is a private version for testing. Please try a small amount of assets in Ramp',\n });\n storage?.set('private-mainnet-notice', 'true');\n }\n if (!btcAccountId) return;\n const whitelist = await getWhitelist({ env });\n if (!whitelist?.length) return;\n const isWhitelisted = whitelist.includes(btcAccountId);\n if (!isWhitelisted) {\n Dialog.alert({\n title: 'Account is not whitelisted',\n message: `We're live on beta mainnet! Join the whitelist to on-ramp your BTC in just 24 hours.\nSign up now: <a style=\"color: #ff7a00; text-decoration: underline;\" href=\"https://forms.gle/rrTP1ZbGU5mRZpHdA\" target=\"_blank\">https://forms.gle/rrTP1ZbGU5mRZpHdA</a>`,\n dangerouslyUseHTML: true,\n closable: false,\n });\n throw new Error('Account is not whitelisted');\n }\n}\n\ninterface WithdrawParams {\n amount: string | number;\n feeRate?: number;\n csna?: string;\n btcAddress?: string;\n env?: ENV;\n}\n\nexport async function getWithdrawTransaction({\n amount,\n feeRate,\n csna,\n btcAddress,\n env = 'mainnet',\n}: WithdrawParams): Promise<Transaction> {\n const config = getWalletConfig(env);\n let _btcAddress = btcAddress || getBtcProvider().account;\n if (!_btcAddress) {\n await getBtcProvider().autoConnect();\n _btcAddress = getBtcProvider().account;\n if (!_btcAddress) {\n throw new Error('BTC Account is not available.');\n }\n }\n const _csna = csna || (await getCsnaAccountId(env));\n\n // calculate gas and get transaction details\n const { inputs, outputs, isError, errorMsg, fromAmount, gasFee } = await calculateWithdraw({\n amount,\n feeRate,\n csna: _csna,\n btcAddress: _btcAddress,\n env,\n });\n\n if (isError || !inputs || !outputs) {\n throw new Error(errorMsg);\n }\n console.log('inputs:', JSON.stringify(inputs));\n console.log('outputs:', JSON.stringify(outputs));\n\n console.log('inputs - outputs = gas');\n console.log(\n `(${inputs.map((item) => item.value).join(' + ')}) - (${outputs.map((item) => item.value).join(' + ')}) = ${gasFee}`,\n );\n\n const network = await getNetwork();\n const btcNetwork = network === 'mainnet' ? bitcoin.networks.bitcoin : bitcoin.networks.testnet;\n const psbt = new bitcoin.Psbt({ network: btcNetwork });\n\n // Add inputs\n const btcRpcUrl = await getBtcRpcUrl();\n await Promise.all(\n inputs.map(async (input) => {\n const txData = await fetch(`${btcRpcUrl}/tx/${input.txid}`).then((res) => res.json());\n\n const inputOptions = {\n hash: input.txid,\n index: input.vout,\n sequence: 0xfffffffd,\n witnessUtxo: {\n script: Buffer.from(txData.vout[input.vout].scriptpubkey, 'hex'),\n value: input.value,\n },\n };\n\n psbt.addInput(inputOptions);\n }),\n );\n\n // Add outputs\n outputs.forEach((output: { address: string; value: number }) => {\n psbt.addOutput({\n address: output.address,\n value: output.value,\n });\n });\n\n // Build contract call message\n const _inputs = inputs.map((item: { txid: string; vout: number; value: number }) => {\n return `${item.txid}:${item.vout}`;\n });\n\n const txOutputs = psbt.txOutputs.map((item: { script: Uint8Array; value: number }) => {\n return {\n script_pubkey: uint8ArrayToHex(item.script),\n value: item.value,\n };\n });\n\n const msg = {\n Withdraw: {\n target_btc_address: _btcAddress,\n input: _inputs,\n output: txOutputs,\n },\n };\n\n // Finally return the transaction object\n const transaction: Transaction = {\n receiverId: config.btcToken,\n signerId: _csna,\n actions: [\n {\n type: 'FunctionCall',\n params: {\n methodName: 'ft_transfer_call',\n args: {\n receiver_id: config.bridgeContractId,\n amount: fromAmount?.toString(),\n msg: JSON.stringify(msg),\n },\n gas: '300000000000000', // 300 TGas\n deposit: '1', // 1 yoctoNEAR\n },\n },\n ],\n };\n\n console.log('=== End getWithdrawTransaction ===');\n return transaction;\n}\n\ninterface CalculateWithdrawParams {\n amount: string | number;\n feeRate?: number;\n csna?: string;\n btcAddress?: string;\n env: ENV;\n}\ninterface CalculateWithdrawResult {\n withdrawFee: number;\n gasFee?: number;\n inputs?: any[];\n outputs?: any[];\n fromAmount?: number;\n receiveAmount?: string;\n isError: boolean;\n errorMsg?: string;\n}\n\nexport async function calculateWithdraw({\n amount,\n feeRate: _feeRate,\n csna: _csna,\n btcAddress: _btcAddress,\n env,\n}: CalculateWithdrawParams): Promise<CalculateWithdrawResult> {\n try {\n const config = getWalletConfig(env);\n\n let btcAddress = _btcAddress || getBtcProvider().account;\n if (!btcAddress) {\n await getBtcProvider().autoConnect();\n btcAddress = getBtcProvider().account;\n if (!btcAddress) {\n throw new Error('BTC Account is not available.');\n }\n }\n const csna = _csna || (await getCsnaAccountId(env));\n\n const feeRate = _feeRate || (await getBtcGasPrice());\n // mock the gas limit\n const gasLimit = await calculateGasLimit({\n csna,\n transactions: [\n {\n signerId: '',\n receiverId: config.btcToken,\n actions: [\n {\n type: 'FunctionCall',\n params: {\n methodName: 'ft_transfer_call',\n args: {\n receiver_id: config.btcToken,\n amount: '100',\n msg: '',\n },\n gas: '300000000000000',\n deposit: '1',\n },\n },\n ],\n },\n ],\n env,\n });\n\n let satoshis = Number(amount);\n if (Number(gasLimit) > 0) {\n satoshis = new Big(amount).minus(gasLimit).toNumber();\n }\n\n const brgConfig = await getBridgeConfig({ env });\n\n const allUTXO = await nearCallFunction<\n Record<\n string,\n {\n vout: number;\n balance: string;\n script: string;\n }\n >\n >(config.bridgeContractId, 'get_utxos_paged', {}, { network: config.network });\n\n if (brgConfig.min_withdraw_amount) {\n if (Number(satoshis) < Number(brgConfig.min_withdraw_amount)) {\n return {\n withdrawFee: 0,\n isError: true,\n errorMsg: `Minimum withdraw amount is ${formatBtcAmount(Number(brgConfig.min_withdraw_amount) + Number(gasLimit))} BTC`,\n };\n }\n }\n\n const feePercent = Number(brgConfig.withdraw_bridge_fee.fee_rate) * Number(satoshis);\n const withdrawFee =\n feePercent > Number(brgConfig.withdraw_bridge_fee.fee_min)\n ? feePercent\n : Number(brgConfig.withdraw_bridge_fee.fee_min);\n\n const withdrawChangeAddress = brgConfig.change_address;\n\n const utxos = Object.keys(allUTXO)\n .map((key) => {\n const txid = key.split('@');\n return {\n txid: txid[0],\n vout: allUTXO[key].vout,\n value: Number(allUTXO[key].balance),\n script: allUTXO[key].script,\n };\n })\n .filter((utxo) => utxo.value > Number(brgConfig.min_change_amount));\n\n if (!utxos || utxos.length === 0) {\n return {\n withdrawFee,\n isError: true,\n errorMsg: 'The network is busy, please try again later.',\n };\n }\n\n const userSatoshis = Number(satoshis);\n const maxBtcFee = Number(brgConfig.max_btc_gas_fee);\n\n const { inputs, outputs, fee } = coinselect(\n utxos,\n [{ address: btcAddress, value: userSatoshis }],\n Math.ceil(feeRate),\n );\n\n const newInputs = inputs;\n let newOutputs = outputs;\n let newFee = fee;\n\n if (!newOutputs || newOutputs.length === 0) {\n return {\n withdrawFee,\n isError: true,\n errorMsg: 'The network is busy, please try again later.',\n };\n }\n\n let userOutput, noUserOutput;\n for (let i = 0; i < newOutputs.length; i++) {\n const output = newOutputs[i];\n if (output.value.toString() === userSatoshis.toString()) {\n userOutput = output;\n } else {\n noUserOutput = output;\n }\n if (!output.address) {\n output.address = withdrawChangeAddress;\n }\n }\n\n let dis = 0;\n if (newFee > maxBtcFee) {\n dis = newFee - maxBtcFee;\n newFee = maxBtcFee;\n\n return {\n gasFee: newFee,\n withdrawFee,\n isError: true,\n errorMsg: 'Gas exceeds maximum value',\n };\n }\n\n userOutput.value = new Big(userOutput.value).minus(newFee).minus(withdrawFee).toNumber();\n\n if (userOutput.value < 0) {\n return {\n gasFee: newFee,\n withdrawFee,\n isError: true,\n errorMsg: 'Not enough gas',\n };\n }\n\n if (noUserOutput) {\n if (!noUserOutput.address) {\n noUserOutput.address = withdrawChangeAddress;\n }\n noUserOutput.value = new Big(noUserOutput.value)\n .plus(newFee)\n .plus(withdrawFee)\n .plus(dis)\n .toNumber();\n } else {\n noUserOutput = {\n address: withdrawChangeAddress,\n value: new Big(newFee).plus(withdrawFee).plus(dis).toNumber(),\n };\n newOutputs.push(noUserOutput);\n }\n\n let minValue = Math.min(...newInputs.map((input: any) => input.value));\n let totalNoUserOutputValue = noUserOutput.value;\n\n while (totalNoUserOutputValue >= minValue && minValue > 0 && newInputs.length > 0) {\n totalNoUserOutputValue -= minValue;\n noUserOutput.value = totalNoUserOutputValue;\n const minValueIndex = newInputs.findIndex((input: any) => input.value === minValue);\n if (minValueIndex > -1) {\n newInputs.splice(minValueIndex, 1);\n }\n minValue = Math.min(...newInputs.map((input: any) => input.value));\n }\n\n let gasMore = 0;\n if (noUserOutput.value === 0) {\n newOutputs = newOutputs.filter((item: any) => item.value !== 0);\n } else if (noUserOutput.value < Number(brgConfig.min_change_amount)) {\n gasMore = Number(brgConfig.min_change_amount) - noUserOutput.value;\n userOutput.value -= gasMore;\n noUserOutput.value = Number(brgConfig.min_change_amount);\n }\n\n const insufficientOutput = newOutputs.some((item: any) => item.value < 0);\n if (insufficientOutput) {\n return {\n gasFee: newFee,\n withdrawFee,\n isError: true,\n errorMsg: 'Not enough gas',\n };\n }\n\n // check if the output amount is below minimum change amount\n const belowMinChangeAmount = newOutputs.some(\n (item: any) => item.value > 0 && item.value < Number(brgConfig.min_change_amount),\n );\n if (belowMinChangeAmount) {\n // Calculate minimum withdraw amount: min_change_amount + gas + fee\n const minWithdrawAmount = new Big(brgConfig.min_withdraw_amount)\n .plus(brgConfig.min_change_amount)\n .plus(gasLimit)\n .plus(withdrawFee)\n .toNumber();\n\n return {\n gasFee: newFee,\n withdrawFee,\n isError: true,\n errorMsg: `Transaction amount too small. Minimum required: ${formatBtcAmount(minWithdrawAmount)} BTC`,\n };\n }\n\n const inputSum = newInputs.reduce((sum: number, cur: any) => sum + Number(cur.value), 0);\n const outputSum = newOutputs.reduce((sum: number, cur: any) => sum + Number(cur.value), 0);\n\n if (newFee + outputSum !== inputSum) {\n return {\n withdrawFee,\n isError: true,\n errorMsg: 'Service busy, please try again later',\n };\n }\n return {\n withdrawFee: new Big(withdrawFee).plus(gasLimit).plus(gasMore).toNumber(),\n gasFee: new Big(newFee).toNumber(),\n inputs: newInputs,\n outputs: newOutputs,\n fromAmount: satoshis,\n receiveAmount: userOutput.value,\n isError: false,\n };\n } catch (error: any) {\n return {\n withdrawFee: 0,\n isError: true,\n errorMsg: error.message,\n };\n }\n}\n\n// Helper function\nfunction uint8ArrayToHex(uint8Array: Uint8Array): string {\n return Array.from(uint8Array)\n .map((byte) => byte.toString(16).padStart(2, '0'))\n .join('');\n}\n", "import type { ProviderService } from '@near-wallet-selector/core/src/lib/services';\nimport { providers } from 'near-api-js';\nimport { nearRpcUrls } from '../config';\nimport { delay } from '.';\nimport type { FinalExecutionOutcome } from '@near-wallet-selector/core';\nimport { withCache } from './request';\n\nexport function getNearProvider(option: { network?: string; provider?: ProviderService }) {\n return (\n option.provider ||\n new providers.FailoverRpcProvider(\n nearRpcUrls[option?.network as keyof typeof nearRpcUrls].map(\n (url) => new providers.JsonRpcProvider({ url }),\n ),\n )\n );\n}\n\nexport async function nearCallFunction<T>(\n contractId: string,\n methodName: string,\n args: any,\n options: {\n network?: string;\n provider?: ProviderService;\n cacheTimeout?: number;\n skipCache?: boolean;\n } = {},\n): Promise<T> {\n if (!options.skipCache) {\n const cacheKey = `near:${contractId}:${methodName}:${args ? JSON.stringify(args) : ''}`;\n return withCache(\n cacheKey,\n () => executeNearCall<T>(contractId, methodName, args, options),\n options.cacheTimeout || 5000,\n );\n }\n\n return executeNearCall<T>(contractId, methodName, args, options);\n}\n\nasync function executeNearCall<T>(\n contractId: string,\n methodName: string,\n args: any,\n options: {\n network?: string;\n provider?: ProviderService;\n },\n): Promise<T> {\n const nearProvider = getNearProvider(options);\n const res: any = await nearProvider.query({\n request_type: 'call_function',\n account_id: contractId,\n method_name: methodName,\n args_base64: Buffer.from(JSON.stringify(args)).toString('base64'),\n finality: 'final',\n });\n return JSON.parse(Buffer.from(res.result).toString()) as T;\n}\n\nexport async function pollTransactionStatuses(network: string, hashes: string[]) {\n const provider = new providers.FailoverRpcProvider(\n Object.values(nearRpcUrls[network as keyof typeof nearRpcUrls]).map(\n (url) => new providers.JsonRpcProvider({ url }),\n ),\n );\n\n const maxAttempts = 30;\n let currentAttempt = 0;\n const pendingHashes = new Set(hashes);\n const results = new Map<string, FinalExecutionOutcome>();\n\n while (pendingHashes.size > 0 && currentAttempt < maxAttempts) {\n currentAttempt++;\n\n const promises = Array.from(pendingHashes).map(async (hash) => {\n try {\n const result = await provider.txStatus(hash, 'unused', 'FINAL');\n if (result && result.status) {\n console.log(`Transaction ${hash} result:`, result);\n results.set(hash, result);\n pendingHashes.delete(hash);\n }\n } catch (error: any) {\n console.error(`Failed to fetch transaction status for ${hash}: ${error.message}`);\n }\n });\n\n await Promise.all(promises);\n\n if (pendingHashes.size > 0) {\n if (currentAttempt === maxAttempts) {\n throw new Error(\n `Transactions not found after max attempts: ${Array.from(pendingHashes).join(', ')}`,\n );\n }\n console.log(\n `Waiting for ${pendingHashes.size} transactions, retrying ${maxAttempts - currentAttempt} more times`,\n );\n await delay(10000);\n }\n }\n\n const result = hashes.map((hash) => results.get(hash)).filter(Boolean) as FinalExecutionOutcome[];\n return result;\n}\n", "interface RequestOptions<T> extends RequestInit {\n body?: RequestInit['body'] | any;\n retryCount?: number;\n timeout?: number;\n cacheTimeout?: number;\n pollingInterval?: number;\n maxPollingAttempts?: number;\n shouldStopPolling?: (response: T) => boolean;\n}\n\nconst cache = new Map<string, { timestamp: number; data: any }>();\n\nconst defaultCacheTimeout = 3000;\n\nexport function withCache<T>(\n key: string,\n fetcher: () => Promise<T>,\n timeout: number = defaultCacheTimeout,\n): Promise<T> {\n const cached = cache.get(key);\n const isCacheValid = cached && Date.now() - cached.timestamp < timeout;\n\n if (isCacheValid) {\n return Promise.resolve(cached.data as T);\n }\n\n return fetcher().then((data) => {\n cache.set(key, { timestamp: Date.now(), data });\n setTimeout(() => {\n cache.delete(key);\n }, timeout);\n return data;\n });\n}\n\nexport default async function request<T>(url: string, options?: RequestOptions<T>): Promise<T> {\n const defaultHeaders = {\n 'Content-Type': 'application/json',\n };\n\n const cacheTimeout = options?.cacheTimeout || defaultCacheTimeout;\n\n const headers = {\n ...defaultHeaders,\n ...options?.headers,\n };\n\n let body = options?.body;\n if (headers['Content-Type'] === 'application/json' && body && typeof body !== 'string') {\n body = JSON.stringify(body);\n }\n\n const method = options?.method || 'GET';\n const cacheKey = method.toUpperCase() === 'GET' ? url : null;\n\n if (cacheKey) {\n const cached = cache.get(cacheKey);\n const isCacheValid = cached && Date.now() - cached.timestamp < cacheTimeout;\n if (isCacheValid) {\n return Promise.resolve(cached.data as T);\n }\n }\n\n const newOptions: RequestInit = {\n ...options,\n headers,\n body,\n method,\n };\n\n const retryCount = options?.retryCount ?? 1;\n\n const controller = new AbortController();\n const timeout = options?.timeout || 20000;\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n try {\n const res = await fetch(url, { ...newOptions, signal: controller.signal }).finally(() =>\n clearTimeout(timeoutId),\n );\n\n if (!res.ok) throw new Error(res.statusText);\n const data = await res.json();\n\n if (options?.shouldStopPolling) {\n if (options.shouldStopPolling(data)) {\n return data as T;\n }\n throw new Error('Polling should continue');\n }\n\n if (cacheKey) {\n cache.set(cacheKey, { timestamp: Date.now(), data });\n setTimeout(() => {\n cache.delete(cacheKey);\n }, cacheTimeout);\n }\n\n return data as T;\n } catch (err) {\n if (retryCount > 0) {\n console.log(`Retrying... attempts left: ${retryCount}`);\n return request(url, { ...options, retryCount: retryCount - 1 });\n } else if (options?.pollingInterval && options?.maxPollingAttempts) {\n if (options.maxPollingAttempts > 0) {\n console.log(`Polling... attempts left: ${options.maxPollingAttempts}`);\n await new Promise((resolve) => setTimeout(resolve, options.pollingInterval));\n return request(url, {\n ...options,\n maxPollingAttempts: options.maxPollingAttempts - 1,\n retryCount: retryCount,\n });\n }\n }\n console.error(err);\n return Promise.reject(err);\n }\n}\n", "import { toHex } from '.';\nimport request from './request';\nimport type { AccessKeyViewRaw } from 'near-api-js/lib/providers/provider';\nimport { actionCreators } from '@near-js/transactions';\nimport { PublicKey } from 'near-api-js/lib/utils/key_pair';\nimport { encodeTransaction } from 'near-api-js/lib/transaction';\nimport { baseDecode } from '@near-js/utils';\nimport bs58 from 'bs58';\n// @ts-ignore\nimport { sha256 } from 'js-sha256';\nimport type { Transaction } from '@near-wallet-selector/core';\nimport { getNearProvider, nearCallFunction } from './nearUtils';\nimport { getWalletConfig, type ENV } from '../config';\nimport { transactions } from 'near-api-js';\nimport Big from 'big.js';\nimport { Dialog } from './Dialog';\nimport state from '../core/setupBTCWallet/state';\n\ninterface RequestResult<T> {\n result_code: number;\n result_message: string;\n result_data: T;\n}\n\nexport async function getNonce({ env, accountId }: { env: ENV; accountId: string }) {\n const config = getWalletConfig(env);\n const { result_code, result_message, result_data } = await request<RequestResult<string>>(\n `${config.base_url}/v1/nonce?csna=${accountId}`,\n );\n if (result_code !== 0) {\n throw new Error(result_message);\n }\n return result_data;\n}\n\nexport async function getNearNonce({ env, accountId }: { env: ENV; accountId: string }) {\n const config = getWalletConfig(env);\n const { result_code, result_message, result_data } = await request<RequestResult<string>>(\n `${config.base_url}/v1/nonceNear?csna=${accountId}`,\n );\n if (result_code !== 0) {\n throw new Error(result_message);\n }\n return result_data;\n}\n\nexport async function receiveTransaction({ env, ...data }: { env: ENV } & any) {\n const config = getWalletConfig(env);\n const { result_code, result_message, result_data } = await request<RequestResult<any>>(\n `${config.base_url}/v1/receiveTransaction`,\n {\n method: 'POST',\n body: data,\n },\n );\n if (result_code !== 0) {\n throw new Error(result_message);\n }\n return result_data;\n}\n\ninterface ReceiveDepositMsgParams {\n env: ENV;\n btcPublicKey: string;\n txHash: string;\n depositType?: number;\n postActions?: string;\n extraMsg?: string;\n}\n\nexport async function preReceiveDepositMsg({\n env,\n btcPublicKey,\n depositType = 1,\n postActions,\n extraMsg,\n}: Omit<ReceiveDepositMsgParams, 'txHash'>) {\n const config = getWalletConfig(env);\n const { result_code, result_message, result_data } = await request<RequestResult<any>>(\n `${config.base_url}/v1/preReceiveDepositMsg`,\n {\n method: 'POST',\n body: { btcPublicKey, depositType, postActions, extraMsg },\n },\n );\n console.log('preReceiveDepositMsg resp:', { result_code, result_message, result_data });\n if (result_code !== 0) {\n throw new Error(result_message);\n }\n return result_data;\n}\n\nexport async function receiveDepositMsg({\n env,\n btcPublicKey,\n txHash,\n depositType = 1,\n postActions,\n extraMsg,\n}: ReceiveDepositMsgParams) {\n const config = getWalletConfig(env);\n const { result_code, result_message, result_data } = await request<RequestResult<any>>(\n `${config.base_url}/v1/receiveDepositMsg`,\n {\n method: 'POST',\n body: { btcPublicKey, txHash, depositType, postActions, extraMsg },\n },\n );\n console.log('receiveDepositMsg resp:', { result_code, result_message, result_data });\n if (result_code !== 0) {\n throw new Error(result_message);\n }\n return result_data;\n}\n\nexport async function checkBridgeTransactionStatus({\n txHash,\n fromChain,\n env,\n}: {\n txHash: string;\n fromChain?: 'BTC' | 'NEAR';\n env: ENV;\n}) {\n const config = getWalletConfig(env);\n const { result_code, result_message, result_data } = await request<\n RequestResult<{ Status: number; ToTxHash: string }>\n >(\n `${config.base_url}/v1/bridgeFromTx?fromTxHash=${txHash}&fromChainId=${fromChain === 'NEAR' ? 2 : 1}`,\n {\n timeout: 3 * 60 * 60 * 1000,\n pollingInterval: 5000,\n maxPollingAttempts: 3000,\n shouldStopPolling: (res) => {\n const status = res.result_data?.Status || 0;\n return res.result_code === 0 && (status === 4 || status >= 50);\n },\n },\n );\n console.log('checkTransactionStatus resp:', { result_code, result_message, result_data });\n if (result_data?.Status !== 4) {\n throw new Error(result_message || `Transaction failed, status: ${result_data?.Status}`);\n }\n console.log('checkBridgeTransactionStatus resp:', result_data);\n return result_data;\n}\n\nexport async function checkBtcTransactionStatus({\n signature,\n env,\n}: {\n signature: string;\n env: ENV;\n}) {\n const config = getWalletConfig(env);\n const { result_code, result_message, result_data } = await request<\n RequestResult<{ Status: number; NearHashList: string[] }>\n >(`${config.base_url}/v1/btcTx?sig=${toHex(signature)}`, {\n timeout: 300000,\n pollingInterval: 5000,\n maxPollingAttempts: 60,\n shouldStopPolling: (res) => {\n const status = res.result_data?.Status || 0;\n return res.result_code === 0 && (status === 3 || status >= 10);\n },\n });\n if (result_data?.Status !== 3) {\n throw new Error(result_message || `Transaction failed, status: ${result_data?.Status}`);\n }\n console.log('checkBtcTransactionStatus resp:', { result_code, result_message, result_data });\n return result_data;\n}\n\nexport async function getWhitelist({ env }: { env: ENV }) {\n const config = getWalletConfig(env);\n const data = await request<string[]>(`${config.base_url}/v1/whitelist/users`).catch((error) => {\n console.error('getWhitelist error:', error);\n return [] as string[];\n });\n return data;\n}\n\nexport async function receiveWithdrawMsg({ env, txHash }: { env: ENV; txHash: string }) {\n const config = getWalletConfig(env);\n const { result_code, result_message, result_data } = await request<RequestResult<any>>(\n `${config.base_url}/v1/receiveWithdrawMsg`,\n {\n method: 'POST',\n body: { txHash },\n },\n );\n console.log('receiveWithdrawMsg resp:', { result_code, result_message, result_data });\n if (result_code !== 0) {\n throw new Error(result_message);\n }\n return result_data;\n}\n\nexport interface AccountInfo {\n nonce: string;\n gas_token: Record<string, string>;\n debt_info?: {\n gas_token_id: string;\n near_gas_debt_amount: string;\n protocol_fee_debt_amount: string;\n };\n relayer_fee?: { amount?: string };\n}\n\nexport async function getAccountInfo({ csna, env }: { csna: string; env: ENV }) {\n const config = getWalletConfig(env);\n const accountInfo = await nearCallFunction<AccountInfo>(\n config.accountContractId,\n 'get_account',\n {\n account_id: csna,\n },\n { network: config.network },\n ).catch((error) => {\n console.log(`get_account error, please try again later`, error);\n throw error;\n });\n console.log('getAccountInfo resp:', accountInfo);\n return accountInfo;\n}\n\nexport async function getBridgeConfig({ env }: { env: ENV }) {\n const config = getWalletConfig(env);\n const bridgeConfig = await nearCallFunction<{\n min_withdraw_amount: string;\n withdraw_bridge_fee: { fee_rate: number; fee_min: string };\n max_btc_gas_fee: string;\n change_address: string;\n min_change_amount: string;\n deposit_bridge_fee: { fee_rate: number; fee_min: string };\n min_deposit_amount: string;\n }>(config.bridgeContractId, 'get_config', {}, { network: config.network });\n return bridgeConfig;\n}\n\nexport async function getTokenBalance({\n csna,\n tokenId,\n env,\n}: {\n csna: string;\n tokenId: string;\n env: ENV;\n}): Promise<{ balance: number; rawBalance: string }> {\n const config = getWalletConfig(env);\n const nearProvider = getNearProvider({ network: config.network });\n try {\n if (tokenId === config.nearToken) {\n const nearAccount = await nearProvider.query<any>({\n request_type: 'view_account',\n account_id: csna,\n finality: 'final',\n });\n const balance = parseFloat(nearAccount.amount) / 10 ** config.nearTokenDecimals;\n return { balance, rawBalance: nearAccount.amount };\n } else {\n const res = await nearCallFunction<string>(\n tokenId,\n 'ft_balance_of',\n { account_id: csna },\n { network: config.network },\n );\n const decimals =\n tokenId === config.btcToken\n ? config.btcTokenDecimals\n : (\n await nearCallFunction<{ decimals: number }>(\n tokenId,\n 'ft_metadata',\n {},\n { network: config.network },\n )\n ).decimals;\n const balance = parseFloat(res) / 10 ** decimals;\n return { balance, rawBalance: res };\n }\n } catch (error) {\n console.error('getTokenBalance error:', error);\n return { balance: 0, rawBalance: '0' };\n }\n}\n\nexport async function checkGasTokenBalance(csna: string, minAmount: string, env: ENV) {\n const config = getWalletConfig(env);\n const { rawBalance } = await getTokenBalance({ csna, tokenId: config.btcToken, env });\n console.log('gas token balance:', rawBalance);\n if (new Big(rawBalance).lt(minAmount)) {\n await Dialog.confirm({\n title: 'Gas token balance is insufficient',\n message: 'Please deposit gas token to continue, will open bridge website.',\n });\n window.open(config.bridgeUrl, '_blank');\n throw new Error('Gas token balance is insufficient');\n }\n}\n\nconst { functionCall, transfer } = actionCreators;\nexport async function convertTransactionToTxHex({\n transaction,\n accountId,\n publicKey,\n env,\n index = 0,\n}: {\n transaction: Transaction;\n accountId: string;\n publicKey: string;\n env: ENV;\n index?: number;\n}) {\n if (!publicKey) return { txHex: '', txBytes: new Uint8Array(), hash: '' };\n const publicKeyFormat = PublicKey.from(publicKey);\n const currentConfig = getWalletConfig(env);\n const provider = getNearProvider({ network: currentConfig.network });\n\n const { header } = await provider.block({\n finality: 'final',\n });\n\n const rawAccessKey = await provider\n .query<AccessKeyViewRaw>({\n request_type: 'view_access_key',\n account_id: accountId,\n public_key: publicKey,\n finality: 'final',\n })\n .catch((e: any) => {\n console.log('view_access_key error:', e);\n return undefined;\n });\n\n const accessKey = {\n ...rawAccessKey,\n nonce: BigInt(rawAccessKey?.nonce || 0),\n };\n\n const nearNonceFromApi = await getNearNonce({ env, accountId });\n\n let nearNonceNumber = accessKey.nonce + BigInt(1);\n if (nearNonceFromApi) {\n nearNonceNumber =\n BigInt(nearNonceFromApi) > nearNonceNumber ? BigInt(nearNonceFromApi) : nearNonceNumber;\n }\n\n const newActions = transaction.actions\n .map((action) => {\n switch (action.type) {\n case 'FunctionCall':\n return functionCall(\n action.params.methodName,\n action.params.args,\n BigInt(action.params.gas),\n BigInt(action.params.deposit),\n );\n case 'Transfer':\n return transfer(BigInt(action.params.deposit));\n }\n })\n .filter(Boolean) as transactions.Action[];\n\n const _transaction = transactions.createTransaction(\n accountId,\n publicKeyFormat,\n transaction.receiverId,\n BigInt(nearNonceNumber) + BigInt(index),\n newActions,\n baseDecode(header.hash),\n );\n\n const txBytes = encodeTransaction(_transaction);\n const txHex = Array.from(txBytes, (byte) => ('0' + (byte & 0xff).toString(16)).slice(-2)).join(\n '',\n );\n const hash = bs58.encode(new Uint8Array(sha256.array(txBytes)));\n\n return { txBytes, txHex, hash };\n}\n\ninterface CalculateGasLimitParams {\n transactions: Transaction[];\n csna: string;\n env: ENV;\n gasStrategy?: 'auto' | 'near' | 'btc';\n}\n\nexport async function calculateGasLimit(params: CalculateGasLimitParams) {\n const trans = [...params.transactions];\n console.log('calculateGasLimit raw trans:', trans);\n\n const { gasLimit } = await calculateGasStrategy(params);\n\n return gasLimit;\n}\n\nexport async function calculateGasStrategy({\n csna,\n transactions,\n env,\n gasStrategy = 'auto',\n}: CalculateGasLimitParams & { gasStrategy?: 'auto' | 'near' | 'btc' }): Promise<{\n transferGasTransaction?: Transaction;\n useNearPayGas: boolean;\n gasLimit: string;\n}> {\n const currentConfig = getWalletConfig(env);\n\n const accountInfo = await getAccountInfo({ csna, env });\n const gasTokenBalance = accountInfo?.gas_token[currentConfig.btcToken] || '0';\n const { balance: nearBalance } = await getTokenBalance({\n csna,\n tokenId: currentConfig.nearToken,\n env,\n });\n\n const transferAmount = transactions.reduce(\n (acc, tx) => {\n tx.actions.forEach((action: any) => {\n // NEAR deposit\n if (action.params.deposit) {\n const amount = Number(action.params.deposit) / 10 ** currentConfig.nearTokenDecimals;\n console.log('near deposit amount:', amount);\n acc.near = acc.near.plus(amount);\n }\n // BTC transfer\n if (\n tx.receiverId === currentConfig.btcToken &&\n ['ft_transfer_call', 'ft_transfer'].includes(action.params.methodName)\n ) {\n const amount = Number(action.params.args.amount) / 10 ** currentConfig.btcTokenDecimals;\n console.log('btc transfer amount:', amount);\n acc.btc = acc.btc.plus(amount);\n }\n });\n return acc;\n },\n { near: new Big(0), btc: new Big(0) },\n );\n\n const nearAvailableBalance = new Big(nearBalance).minus(transferAmount.near).toNumber();\n\n console.log('available near balance:', nearAvailableBalance);\n console.log('available gas token balance:', gasTokenBalance);\n console.log('gas strategy:', gasStrategy);\n\n const convertTx = await Promise.all(\n transactions.map((transaction, index) =>\n convertTransactionToTxHex({\n transaction,\n accountId: state.getAccount(),\n publicKey: state.getPublicKey(),\n index,\n env,\n }),\n ),\n );\n\n // Determine if we should use NEAR to pay for gas\n let useNearPayGas = false;\n let perTxFee: string | undefined;\n\n // Force using NEAR as gas token\n if (gasStrategy === 'near') {\n console.log('Forcing NEAR as gas token based on gasStrategy');\n useNearPayGas = true;\n }\n // Force using BTC token as gas token\n else if (gasStrategy === 'btc') {\n console.log('Forcing BTC token as gas token based on gasStrategy');\n useNearPayGas = false;\n }\n // Auto select payment method (original logic)\n else if (nearAvailableBalance > 0.5) {\n console.log('NEAR balance is enough, using NEAR to pay for gas');\n useNearPayGas = true;\n }\n\n // Get gas amount based on selected payment method\n let gasAmount: string;\n\n if (useNearPayGas) {\n // Get protocol fee for NEAR payment\n const gasTokens = await nearCallFunction<Record<string, { per_tx_protocol_fee: string }>>(\n currentConfig.accountContractId,\n 'list_gas_token',\n { token_ids: [currentConfig.btcToken] },\n { network: currentConfig.network },\n );\n\n console.log('list_gas_token gas tokens:', gasTokens);\n\n const fee = Math.max(Number(gasTokens[currentConfig.btcToken]?.per_tx_protocol_fee || 0), 100);\n perTxFee = fee.toString();\n console.log('perTxFee:', perTxFee);\n gasAmount = new Big(perTxFee || '0').mul(convertTx.length).toFixed(0);\n } else {\n // Predict gas amount for BTC token payment\n gasAmount = await getPredictedGasAmount({\n accountContractId: currentConfig.accountContractId,\n tokenId: currentConfig.btcToken,\n transactions: convertTx.map((t) => t.txHex),\n env,\n });\n }\n\n console.log('useNearPayGas:', useNearPayGas);\n console.log('gasAmount:', gasAmount);\n\n // Create gas token transfer transaction\n const transferTx = await createGasTokenTransfer({ csna, amount: gasAmount, env });\n\n // Recalculate gas with transfer included\n return recalculateGasWithTransfer({\n csna,\n transferTx,\n transactions: convertTx,\n useNearPayGas,\n perTxFee,\n env,\n });\n}\n\nasync function createGasTokenTransfer({\n csna,\n amount,\n env,\n}: {\n csna: string;\n amount: string;\n env: ENV;\n}) {\n const currentConfig = getWalletConfig(env);\n return {\n signerId: csna,\n receiverId: currentConfig.btcToken,\n actions: [\n {\n type: 'FunctionCall',\n params: {\n methodName: 'ft_transfer_call',\n args: {\n receiver_id: currentConfig.accountContractId,\n amount,\n msg: JSON.stringify('Repay'),\n },\n gas: new Big(50).mul(10 ** 12).toFixed(0),\n deposit: '1',\n },\n },\n ],\n } as Transaction;\n}\n\nasync function recalculateGasWithTransfer({\n csna,\n transferTx,\n transactions,\n useNearPayGas,\n perTxFee,\n env,\n}: {\n csna: string;\n transferTx: Transaction;\n transactions: { txHex: string }[];\n useNearPayGas: boolean;\n perTxFee?: string;\n env: ENV;\n}) {\n const currentConfig = getWalletConfig(env);\n const { txHex: transferTxHex } = await convertTransactionToTxHex({\n transaction: transferTx,\n accountId: state.getAccount(),\n publicKey: state.getPublicKey(),\n index: 0,\n env,\n });\n\n let newGasLimit;\n if (useNearPayGas && perTxFee) {\n newGasLimit = new Big(perTxFee).mul(transactions.length + 1).toFixed(0);\n } else {\n newGasLimit = await getPredictedGasAmount({\n accountContractId: currentConfig.accountContractId,\n tokenId: currentConfig.btcToken,\n transactions: [transferTxHex, ...transactions.map((t) => t.txHex)],\n env,\n });\n }\n\n (transferTx.actions[0] as any).params.args.amount = newGasLimit;\n\n return { transferGasTransaction: transferTx, useNearPayGas, gasLimit: newGasLimit };\n}\n\nasync function getPredictedGasAmount({\n accountContractId,\n tokenId,\n transactions,\n env,\n}: {\n accountContractId: string;\n tokenId: string;\n transactions: string[];\n env: ENV;\n}): Promise<string> {\n const currentConfig = getWalletConfig(env);\n const isValidTransactions = transactions.every((tx) => tx.length > 0);\n const predictedGas = isValidTransactions\n ? await nearCallFunction<string>(\n accountContractId,\n 'predict_txs_gas_token_amount',\n {\n gas_token_id: tokenId,\n near_transactions: transactions,\n },\n { network: currentConfig.network },\n )\n : '0';\n\n const predictedGasAmount = new Big(predictedGas).mul(1.2).toFixed(0);\n const miniGasAmount = 200 * transactions.length;\n const gasAmount = Math.max(Number(predictedGasAmount), miniGasAmount);\n console.log('predictedGas:', predictedGasAmount);\n return gasAmount.toString();\n}\n", "import { storageStore } from '../../utils';\n\nconst STORAGE_KEYS = {\n ACCOUNT: 'btc-wallet-account',\n PUBLIC_KEY: 'btc-wallet-publickey',\n BTC_PUBLIC_KEY: 'btc-wallet-btc-publickey',\n} as const;\n\nconst storage = storageStore('SATOSHI_WALLET_ACCOUNT');\n\nexport default {\n saveAccount(account: string) {\n if (!account) {\n this.removeAccount();\n return;\n }\n storage?.set(STORAGE_KEYS.ACCOUNT, account);\n },\n removeAccount() {\n storage?.remove(STORAGE_KEYS.ACCOUNT);\n },\n savePublicKey(publicKey: string) {\n if (!publicKey) {\n this.removePublicKey();\n return;\n }\n storage?.set(STORAGE_KEYS.PUBLIC_KEY, publicKey);\n },\n removePublicKey() {\n storage?.remove(STORAGE_KEYS.PUBLIC_KEY);\n },\n saveBtcPublicKey(publicKey: string) {\n if (!publicKey) {\n this.removeBtcPublicKey();\n return;\n }\n storage?.set(STORAGE_KEYS.BTC_PUBLIC_KEY, publicKey);\n },\n removeBtcPublicKey() {\n storage?.remove(STORAGE_KEYS.BTC_PUBLIC_KEY);\n },\n clear() {\n this.removeAccount();\n this.removePublicKey();\n this.removeBtcPublicKey();\n },\n save(account: string, publicKey: string) {\n if (!account || !publicKey) {\n this.clear();\n return;\n }\n this.saveAccount(account);\n this.savePublicKey(publicKey);\n },\n getAccount() {\n return storage?.get<string>(STORAGE_KEYS.ACCOUNT) || '';\n },\n getPublicKey() {\n return storage?.get<string>(STORAGE_KEYS.PUBLIC_KEY) || '';\n },\n getBtcPublicKey() {\n return storage?.get<string>(STORAGE_KEYS.BTC_PUBLIC_KEY) || '';\n },\n isValid() {\n const account = this.getAccount();\n const publicKey = this.getPublicKey();\n const btcPublicKey = this.getBtcPublicKey();\n\n const allEmpty = !account && !publicKey && !btcPublicKey;\n const allExist = account && publicKey && btcPublicKey;\n\n return allEmpty || allExist;\n },\n syncSave(account: string, publicKey: string, btcPublicKey: string) {\n if (!account || !publicKey || !btcPublicKey) {\n this.clear();\n return;\n }\n\n this.clear();\n\n this.savePublicKey(publicKey);\n this.saveBtcPublicKey(btcPublicKey);\n this.saveAccount(account);\n },\n};\n", "import type { Wallet } from '@near-wallet-selector/core';\nimport { walletConfig, type ENV } from '../config';\nimport { executeBTCDepositAndAction, getWithdrawTransaction } from '../core/btcUtils';\nimport { isMobile, storageStore } from '.';\n\ninterface setupWalletButtonOptions {\n env: ENV;\n nearWallet: Wallet;\n btcWallet?: OriginalWallet;\n walletUrl?: string;\n draggable?: boolean;\n initialPosition?: { right: string; bottom: string };\n buttonSize?: string;\n mobileButtonSize?: string;\n}\n\ninterface OriginalWallet {\n account: string | undefined;\n getPublicKey: () => Promise<string | undefined>;\n}\n\nconst storage = storageStore('SATOSHI_WALLET_BUTTON');\n\nconst minimumMargin = 10;\n\nexport function setupWalletButton({\n env,\n nearWallet,\n btcWallet,\n walletUrl,\n draggable = true,\n initialPosition,\n buttonSize,\n mobileButtonSize,\n}: setupWalletButtonOptions) {\n if (document.getElementById('satoshi-wallet-button')) {\n return;\n }\n\n const iframe = createIframe({\n iframeUrl: walletUrl || walletConfig[env].walletUrl,\n iframeStyle: isMobile()\n ? { width: 'calc(100% - 40px)', height: '80%' }\n : { width: '400px', height: '650px' },\n });\n\n iframe.addEventListener('mouseenter', () => {\n if (document.activeElement !== iframe) {\n document.activeElement?.setAttribute('tabindex', 'null');\n setTimeout(() => {\n iframe.focus();\n }, 0);\n }\n });\n\n const isNearWallet = !btcWallet;\n const openImageUrl = `https://assets.deltatrade.ai/wallet-assets/wallet${\n isNearWallet ? '-near' : ''\n }-btn.png`;\n const closeImageUrl = `https://assets.deltatrade.ai/wallet-assets/wallet${\n isNearWallet ? '-near' : ''\n }-btn-active.png`;\n\n const button = createFloatingButtonWithIframe({\n openImageUrl,\n closeImageUrl,\n iframe,\n draggable,\n initialPosition,\n buttonSize,\n mobileButtonSize,\n });\n\n setupButtonClickHandler(button, iframe, nearWallet, btcWallet);\n}\n\nfunction createFloatingButtonWithIframe({\n openImageUrl,\n closeImageUrl,\n iframe,\n draggable,\n initialPosition,\n buttonSize,\n mobileButtonSize,\n}: {\n openImageUrl: string;\n closeImageUrl: string;\n iframe: HTMLIFrameElement;\n draggable: boolean;\n initialPosition?: { right: string; bottom: string };\n buttonSize?: string;\n mobileButtonSize?: string;\n}): HTMLImageElement {\n const button = document.createElement('img');\n button.id = 'satoshi-wallet-button';\n\n const isIframeVisible = storage?.get<boolean>('visible');\n\n button.src = isIframeVisible ? closeImageUrl : openImageUrl;\n iframe.style.display = isIframeVisible ? 'block' : 'none';\n\n const windowWidth = window.innerWidth;\n const windowHeight = window.innerHeight;\n\n const savedPosition = storage?.get<{ right: string; bottom: string }>('position');\n const currentInitialPosition = initialPosition ||\n savedPosition || {\n right: '20px',\n bottom: '20px',\n };\n\n const tempButtonSize = buttonSize || '60px';\n const tempMobileButtonSize = mobileButtonSize || buttonSize || '40px';\n const actualButtonSize = isMobile() ? parseInt(tempMobileButtonSize) : parseInt(tempButtonSize);\n\n const right = Math.min(\n Math.max(minimumMargin, parseInt(currentInitialPosition.right)),\n windowWidth - actualButtonSize - minimumMargin,\n );\n const bottom = Math.min(\n Math.max(minimumMargin, parseInt(currentInitialPosition.bottom)),\n windowHeight - actualButtonSize - minimumMargin,\n );\n\n Object.assign(button.style, {\n position: 'fixed',\n bottom: `${bottom}px`,\n right: `${right}px`,\n zIndex: '100000',\n width: buttonSize || '60px',\n height: buttonSize || '60px',\n cursor: draggable ? 'grab' : 'pointer',\n transition: 'transform 0.15s ease',\n userSelect: 'none',\n touchAction: 'none',\n });\n\n if (isMobile()) {\n Object.assign(button.style, {\n width: mobileButtonSize || buttonSize || '40px',\n height: mobileButtonSize || buttonSize || '40px',\n });\n }\n\n document.body.appendChild(button);\n\n updateIframePosition(\n iframe,\n right,\n bottom,\n windowWidth,\n windowHeight,\n parseInt(button.style.width),\n );\n\n let isDragging = false;\n let startX = 0;\n let startY = 0;\n let initialRight = 0;\n let initialBottom = 0;\n let dragStartTime = 0;\n\n function startDrag(clientX: number, clientY: number) {\n if (!draggable) return;\n isDragging = true;\n startX = clientX;\n startY = clientY;\n initialRight = parseInt(button.style.right);\n initialBottom = parseInt(button.style.bottom);\n dragStartTime = Date.now();\n\n button.style.cursor = 'grabbing';\n button.style.transition = 'none';\n }\n\n function toggleWallet() {\n const isCurrentlyVisible = iframe.style.display === 'block';\n button.style.transform = 'scale(0.8)';\n setTimeout(() => {\n button.style.transform = 'scale(1)';\n }, 150);\n\n const newVisibleState = !isCurrentlyVisible;\n iframe.style.display = newVisibleState ? 'block' : 'none';\n button.src = newVisibleState ? closeImageUrl : openImageUrl;\n\n storage?.set('visible', newVisibleState);\n\n setTimeout(() => {\n if (newVisibleState) {\n iframe.focus();\n }\n }, 0);\n }\n\n button.addEventListener(\n 'click',\n (e) => {\n if (!isDragging || !draggable) {\n toggleWallet();\n }\n e.preventDefault();\n e.stopPropagation();\n },\n { capture: true },\n );\n\n if (draggable) {\n button.addEventListener(\n 'mousedown',\n (e) => {\n startDrag(e.clientX, e.clientY);\n e.preventDefault();\n e.stopPropagation();\n },\n { capture: true },\n );\n\n button.addEventListener(\n 'touchstart',\n (e) => {\n if (e.touches.length === 1) {\n const touch = e.touches[0];\n startDrag(touch.clientX, touch.clientY);\n e.preventDefault();\n e.stopPropagation();\n }\n },\n { capture: true },\n );\n\n document.addEventListener(\n 'mousemove',\n (e) => {\n if (!isDragging) return;\n moveButton(e.clientX, e.clientY);\n e.preventDefault();\n },\n { capture: true },\n );\n\n document.addEventListener(\n 'touchmove',\n (e) => {\n if (!isDragging || e.touches.length !== 1) return;\n const touch = e.touches[0];\n moveButton(touch.clientX, touch.clientY);\n e.preventDefault();\n },\n { capture: true },\n );\n\n document.addEventListener(\n 'mouseup',\n (e) => {\n if (isDragging) {\n e.preventDefault();\n e.stopPropagation();\n }\n endDrag();\n },\n { capture: true },\n );\n\n document.addEventListener(\n 'touchend',\n (e) => {\n if (isDragging) {\n e.preventDefault();\n e.stopPropagation();\n }\n endDrag();\n\n const dragEndTime = Date.now();\n const dragDuration = dragEndTime - dragStartTime;\n\n if (\n dragDuration < 200 &&\n Math.abs(parseInt(button.style.right) - initialRight) < 5 &&\n Math.abs(parseInt(button.style.bottom) - initialBottom) < 5\n ) {\n toggleWallet();\n }\n },\n { capture: true },\n );\n\n document.addEventListener(\n 'touchcancel',\n () => {\n endDrag();\n },\n { capture: true },\n );\n }\n\n function moveButton(clientX: number, clientY: number) {\n const deltaX = startX - clientX;\n const deltaY = startY - clientY;\n\n let newRight = initialRight + deltaX;\n let newBottom = initialBottom + deltaY;\n\n const currentButtonSize = parseInt(button.style.width);\n\n newRight = Math.min(\n Math.max(minimumMargin, newRight),\n windowWidth - currentButtonSize - minimumMargin,\n );\n newBottom = Math.min(\n Math.max(minimumMargin, newBottom),\n windowHeight - currentButtonSize - minimumMargin,\n );\n\n const snapThreshold = minimumMargin;\n const buttonLeft = windowWidth - newRight - currentButtonSize;\n if (buttonLeft < snapThreshold) {\n newRight = windowWidth - currentButtonSize - minimumMargin;\n } else if (newRight < snapThreshold) {\n newRight = minimumMargin;\n }\n\n const buttonTop = windowHeight - newBottom - currentButtonSize;\n if (buttonTop < snapThreshold) {\n newBottom = windowHeight - currentButtonSize - minimumMargin;\n } else if (newBottom < snapThreshold) {\n newBottom = minimumMargin;\n }\n\n button.style.right = `${newRight}px`;\n button.style.bottom = `${newBottom}px`;\n\n updateIframePosition(iframe, newRight, newBottom, windowWidth, windowHeight, currentButtonSize);\n }\n\n function endDrag() {\n if (!isDragging || !draggable) return;\n\n isDragging = false;\n button.style.cursor = 'grab';\n button.style.transition = 'transform 0.15s ease';\n\n storage?.set('position', {\n right: button.style.right,\n bottom: button.style.bottom,\n });\n }\n\n button.onclick = null;\n\n return button;\n}\n\nfunction createIframe({\n iframeUrl,\n iframeStyle = {},\n}: {\n iframeUrl: string;\n iframeStyle?: { [key: string]: string };\n}): HTMLIFrameElement {\n const iframe = document.createElement('iframe');\n iframe.id = 'satoshi-wallet-iframe';\n iframe.allow = 'clipboard-read; clipboard-write';\n iframe.src = iframeUrl;\n\n const isVisible = storage?.get<boolean>('visible');\n\n Object.assign(iframe.style, {\n position: 'fixed',\n bottom: '90px',\n right: '20px',\n zIndex: '100000',\n boxShadow: '0 0 10px rgba(0, 0, 0, 0.1)',\n borderRadius: '10px',\n display: isVisible ? 'block' : 'none',\n border: 'none',\n ...iframeStyle,\n });\n\n document.body.appendChild(iframe);\n\n return iframe;\n}\n\nlet currentMessageHandler: ((event: MessageEvent) => void) | null = null;\n\nasync function setupButtonClickHandler(\n button: HTMLImageElement,\n iframe: HTMLIFrameElement,\n nearWallet: Wallet,\n btcWallet?: OriginalWallet,\n) {\n const accountId = (await nearWallet?.getAccounts())?.[0].accountId;\n const originalAccountId = btcWallet?.account;\n const originalPublicKey = await btcWallet?.getPublicKey();\n console.log({ accountId, originalAccountId, originalPublicKey });\n const iframeSrc = new URL(iframe.src);\n iframeSrc.searchParams.set('origin', window.location.origin);\n accountId && iframeSrc.searchParams.set('accountId', accountId);\n originalAccountId && iframeSrc.searchParams.set('originalAccountId', originalAccountId);\n originalPublicKey && iframeSrc.searchParams.set('originalPublicKey', originalPublicKey);\n\n iframe.src = iframeSrc.toString();\n\n const actions = {\n signAndSendTransaction: nearWallet.signAndSendTransaction,\n signAndSendTransactions: nearWallet.signAndSendTransactions,\n executeBTCDepositAndAction,\n getWithdrawTransaction,\n };\n\n if (currentMessageHandler) {\n window.removeEventListener('message', currentMessageHandler);\n currentMessageHandler = null;\n }\n\n const handleWalletMessage = async (event: MessageEvent) => {\n if (event.origin !== iframeSrc.origin) return;\n const { action, requestId, data } = event.data;\n\n try {\n const actionFn = actions[action as keyof typeof actions];\n if (!actionFn) return;\n console.log('handleWalletAction', action, event.data);\n const result = await actionFn(data);\n console.log('handleWalletAction result', action, result);\n event.source?.postMessage(\n {\n requestId,\n data,\n success: true,\n },\n { targetOrigin: event.origin },\n );\n } catch (error: any) {\n console.error('handleWalletAction error', action, error);\n event.source?.postMessage(\n {\n requestId,\n error: error.message,\n success: false,\n },\n { targetOrigin: event.origin },\n );\n }\n };\n\n currentMessageHandler = handleWalletMessage;\n window.addEventListener('message', handleWalletMessage);\n}\n\nexport function removeWalletButton() {\n console.log('removeWalletButton');\n const button = document.getElementById('satoshi-wallet-button');\n button?.remove();\n const iframe = document.getElementById('satoshi-wallet-iframe');\n iframe?.remove();\n}\n\nfunction updateIframePosition(\n iframe: HTMLIFrameElement,\n buttonRight: number,\n buttonBottom: number,\n windowWidth: number,\n windowHeight: number,\n buttonSize: number,\n) {\n const iframeWidth = parseInt(iframe.style.width);\n const iframeHeight = parseInt(iframe.style.height);\n\n let iframeRight = buttonRight;\n let iframeBottom = buttonBottom + buttonSize + 10;\n\n if (iframeRight + iframeWidth > windowWidth - minimumMargin) {\n iframeRight = Math.max(minimumMargin, windowWidth - iframeWidth - minimumMargin);\n }\n\n if (iframeBottom + iframeHeight > windowHeight - minimumMargin) {\n iframeBottom = Math.max(minimumMargin, buttonBottom - iframeHeight - 10);\n }\n\n iframe.style.right = `${iframeRight}px`;\n iframe.style.bottom = `${iframeBottom}px`;\n}\n", "import type {\n Transaction,\n InjectedWallet,\n WalletModuleFactory,\n WalletBehaviourFactory,\n} from '@near-wallet-selector/core';\nimport { setupWalletButton, removeWalletButton } from '../../utils/initWalletButton';\nimport type { useBtcWalletSelector } from '../btcWalletSelectorContext';\nimport { retryOperation, toHex } from '../../utils';\nimport type { ENV } from '../../config';\nimport { getWalletConfig } from '../../config';\nimport { nearCallFunction, pollTransactionStatuses } from '../../utils/nearUtils';\n\nimport { checkGasTokenDebt, getCsnaAccountId } from '../btcUtils';\n\nimport {\n getAccountInfo,\n checkBtcTransactionStatus,\n convertTransactionToTxHex,\n getNonce,\n receiveTransaction,\n checkGasTokenBalance,\n calculateGasStrategy,\n} from '../../utils/satoshi';\nimport { getVersion } from '../../index';\nimport state from './state';\n\ndeclare global {\n interface Window {\n btcContext: ReturnType<typeof useBtcWalletSelector>;\n }\n}\n\ninterface BTCWalletParams {\n iconUrl?: string;\n deprecated?: boolean;\n autoConnect?: boolean;\n syncLogOut?: boolean;\n env?: ENV;\n walletUrl?: string;\n gasStrategy?: 'auto' | 'near' | 'btc';\n}\n\nconst BTCWallet: WalletBehaviourFactory<InjectedWallet> = async ({\n metadata,\n options,\n store,\n emitter,\n logger,\n id,\n provider,\n}) => {\n let initializing = false;\n let connectionUpdateTimeout: NodeJS.Timeout;\n\n const wallet = {\n signIn,\n signOut,\n getAccounts,\n verifyOwner,\n signMessage,\n isSignedIn,\n signAndSendTransaction,\n signAndSendTransactions,\n };\n const env: ENV = (metadata as any).env || options.network.networkId || 'mainnet';\n const currentConfig = getWalletConfig(env);\n\n await initBtcContext();\n\n function validateWalletState() {\n const accountId = state.getAccount();\n const publicKey = state.getPublicKey();\n const btcPublicKey = state.getBtcPublicKey();\n if ((!accountId && publicKey) || (accountId && !publicKey) || (!publicKey && btcPublicKey)) {\n state.clear();\n return false;\n }\n return true;\n }\n\n async function initBtcContext() {\n if (initializing) {\n console.log('BTC context initialization already in progress');\n return;\n }\n\n console.log('initBtcContext');\n try {\n initializing = true;\n const btcContext = await retryOperation(\n async () => {\n const ctx = window.btcContext;\n if (!ctx) {\n throw new Error('btcContext not found');\n }\n return ctx;\n },\n (res) => !!res,\n {\n maxRetries: 10,\n delayMs: 500,\n },\n );\n\n await setupBtcContextListeners();\n return btcContext;\n } finally {\n initializing = false;\n }\n }\n\n async function setupBtcContextListeners() {\n const handleConnectionUpdate = async () => {\n if (connectionUpdateTimeout) {\n clearTimeout(connectionUpdateTimeout);\n }\n\n await checkBtcNetwork(currentConfig.network);\n\n if (!state.isValid()) {\n state.clear();\n console.log('setupBtcContextListeners clear');\n }\n\n const valid = validateWalletState();\n if (!valid) {\n return;\n }\n\n const btcContext = window.btcContext;\n\n if (btcContext.account) {\n const btcPublicKey = await btcContext.getPublicKey();\n if (btcPublicKey) {\n await getNearAccountByBtcPublicKey(btcPublicKey);\n if (!window.enableCustomWalletSelectorModal) {\n removeWalletButton();\n setupWalletButton({\n env,\n nearWallet: wallet as any,\n btcWallet: btcContext,\n walletUrl: (metadata as any).walletUrl,\n });\n }\n }\n } else {\n connectionUpdateTimeout = setTimeout(() => {\n handleConnectionUpdate();\n }, 5000);\n }\n };\n\n const context = window.btcContext.getContext();\n\n context.on('updatePublicKey', async (btcPublicKey: string) => {\n state.clear();\n console.log('updatePublicKey clear');\n try {\n const { nearAddress, nearPublicKey } = await getNearAccountByBtcPublicKey(btcPublicKey);\n\n if (!nearAddress || !nearPublicKey) {\n throw new Error('Failed to get near account info');\n }\n\n emitter.emit('accountsChanged', {\n accounts: [{ accountId: nearAddress }],\n });\n await handleConnectionUpdate();\n } catch (error) {\n console.error('Error updating public key:', error);\n }\n });\n\n context.on('btcLoginError', async () => {\n // console.log('btcLoginError');\n // state.clear();\n // emitter.emit('accountsChanged', { accounts: [] });\n // await handleConnectionUpdate();\n });\n\n context.on('btcLogOut', async () => {\n console.log('btcLogOut');\n state.clear();\n emitter.emit('accountsChanged', { accounts: [] });\n await handleConnectionUpdate();\n });\n\n await handleConnectionUpdate();\n\n if (\n 'autoConnect' in metadata &&\n metadata.autoConnect &&\n localStorage.getItem('near-wallet-selector:selectedWalletId') === '\"btc-wallet\"'\n ) {\n await window.btcContext.autoConnect();\n }\n }\n\n async function nearCall<T>(contractId: string, methodName: string, args: any) {\n return nearCallFunction<T>(contractId, methodName, args, { provider });\n }\n\n async function getNearAccountByBtcPublicKey(btcPublicKey: string) {\n const csna = await getCsnaAccountId(env);\n const nearPublicKey = await nearCall<string>(\n currentConfig.accountContractId,\n 'get_chain_signature_near_account_public_key',\n { btc_public_key: btcPublicKey },\n );\n\n state.syncSave(csna, nearPublicKey, btcPublicKey);\n\n return {\n nearAddress: csna,\n nearPublicKey,\n };\n }\n\n async function signIn({ contractId, methodNames }: any) {\n const btcContext = window.btcContext;\n\n state.clear();\n\n if (!state.getAccount() || !state.getPublicKey()) {\n await btcContext.login();\n }\n\n const btcPublicKey = await btcContext.getPublicKey();\n console.log('btcPublicKey:', btcPublicKey);\n if (!btcPublicKey) {\n throw new Error('No connected BTC wallet, please connect your BTC wallet first.');\n }\n\n const { nearAddress, nearPublicKey } = await getNearAccountByBtcPublicKey(btcPublicKey);\n\n return [\n {\n accountId: nearAddress,\n publicKey: nearPublicKey,\n },\n ];\n }\n\n async function signOut() {\n const accountId = state.getAccount();\n const publicKey = state.getPublicKey();\n if (!(accountId && publicKey)) {\n return;\n }\n const btcContext = window.btcContext;\n // @ts-ignore\n if (metadata.syncLogOut) {\n btcContext.logout();\n }\n\n state.clear();\n window.localStorage.removeItem('near-wallet-selector:selectedWalletId');\n if (!window.enableCustomWalletSelectorModal) {\n removeWalletButton();\n }\n }\n\n function isSignedIn() {\n const accountId = state.getAccount();\n const publicKey = state.getPublicKey();\n return accountId && publicKey;\n }\n\n async function getAccounts() {\n return [{ accountId: state.getAccount() }];\n }\n\n async function verifyOwner() {\n throw new Error(`Method not supported by ${metadata.name}`);\n }\n\n async function signMessage() {\n throw new Error(`Method not supported by ${metadata.name}`);\n }\n\n async function signAndSendTransaction(params: Transaction) {\n const transactions = [params];\n const result = await signAndSendTransactions({ transactions });\n if (Array.isArray(result)) {\n return result[0];\n } else {\n throw new Error(`Transaction failed: ${result}`);\n }\n }\n\n async function signAndSendTransactions(params: { transactions: Transaction[] }) {\n if (!validateWalletState()) {\n throw new Error('Wallet state is invalid, please reconnect your wallet.');\n }\n\n const btcContext = window.btcContext;\n const csna = state.getAccount();\n\n const accountInfo = await getAccountInfo({ csna, env });\n\n // check gas token arrears\n await checkGasTokenDebt(csna, env, true);\n\n const trans = [...params.transactions];\n console.log('signAndSendTransactions raw trans:', trans);\n\n const { transferGasTransaction, useNearPayGas, gasLimit } = await calculateGasStrategy({\n csna,\n transactions: trans,\n env,\n gasStrategy: (metadata as any).gasStrategy,\n });\n\n console.log('transferGasTransaction:', transferGasTransaction);\n console.log('useNearPayGas:', useNearPayGas);\n console.log('gasLimit:', gasLimit);\n\n // check gas token balance\n await checkGasTokenBalance(csna, gasLimit, env);\n\n if (transferGasTransaction) {\n trans.unshift(transferGasTransaction);\n }\n\n console.log('calculateGasStrategy trans:', trans);\n\n const newTrans = await Promise.all(\n trans.map((transaction, index) =>\n convertTransactionToTxHex({\n transaction,\n accountId: state.getAccount(),\n publicKey: state.getPublicKey(),\n index,\n env,\n }),\n ),\n );\n\n const nonceFromApi = await getNonce({ env, accountId: csna });\n\n const nonceFromContract = accountInfo?.nonce || 0;\n\n const nonce =\n Number(nonceFromApi) > Number(nonceFromContract)\n ? String(nonceFromApi)\n : String(nonceFromContract);\n\n const intention = {\n chain_id: '397',\n csna,\n near_transactions: newTrans.map((t) => t.txHex),\n gas_token: currentConfig.btcToken,\n gas_limit: gasLimit,\n use_near_pay_gas: useNearPayGas,\n nonce,\n replace: true,\n };\n\n const strIntention = JSON.stringify(intention);\n\n const signature = await btcContext.signMessage(strIntention);\n\n await receiveTransaction({\n env,\n sig: signature,\n btcPubKey: state.getBtcPublicKey(),\n data: toHex(strIntention),\n });\n await checkBtcTransactionStatus({ signature, env });\n\n // Skip the outcome of the first transaction, which is the gas token transfer transaction\n const hash = newTrans.slice(1).map((t) => t.hash);\n console.log('txHash:', hash);\n const result = await pollTransactionStatuses(options.network.networkId, hash);\n return result;\n }\n\n async function checkBtcNetwork(network: string) {\n const btcContext = window.btcContext;\n if (!btcContext.account) return;\n const btcNetwork = await btcContext.getNetwork();\n const networkMap = {\n livenet: ['mainnet', 'private_mainnet'],\n testnet: ['testnet', 'dev'],\n };\n if (!networkMap[btcNetwork].includes(network)) {\n await btcContext.switchNetwork(btcNetwork === 'livenet' ? 'testnet' : 'livenet');\n }\n }\n\n return wallet as any;\n};\n\nexport function setupBTCWallet({\n iconUrl = 'https://assets.deltatrade.ai/assets/chain/btc.svg',\n deprecated = false,\n autoConnect = true,\n syncLogOut = true,\n env = 'mainnet',\n walletUrl,\n gasStrategy = 'auto',\n}: BTCWalletParams | undefined = {}): WalletModuleFactory<InjectedWallet> {\n console.log('\u26A1\uFE0F BTC Wallet Version:', getVersion(), 'env:', env, 'gasStrategy:', gasStrategy);\n\n const btcWallet = async () => {\n return {\n id: 'btc-wallet',\n type: 'injected',\n metadata: {\n name: 'BTC Wallet',\n description: 'BTC Wallet',\n iconUrl,\n downloadUrl: iconUrl,\n deprecated,\n available: true,\n autoConnect,\n syncLogOut,\n env,\n walletUrl,\n gasStrategy,\n },\n init: BTCWallet,\n } as any;\n };\n\n return btcWallet;\n}\n\nexport default {\n setupBTCWallet,\n};\n", "import {\n setupModal as _setupModal,\n type WalletSelectorModal as _WalletSelectorModal,\n type ModalOptions as _ModalOptions,\n} from 'ref-modal-ui';\nimport type { WalletSelector, WalletSelectorState } from '@near-wallet-selector/core';\nimport { Dialog } from '../utils/Dialog';\nimport { removeWalletButton, setupWalletButton } from '../utils/initWalletButton';\nimport { ENV } from '../config';\n\nexport interface WalletSelectorModalOptions extends _ModalOptions {\n showChainGroups?: boolean;\n showWalletUIForNearAccount?: boolean;\n hideWalletUIForNearWallets?: string[];\n walletUrl?: string;\n env?: ENV;\n draggable?: boolean;\n initialPosition?: { right: string; bottom: string };\n buttonSize?: string;\n mobileButtonSize?: string;\n}\nexport type WalletSelectorModal = _WalletSelectorModal;\n\ndeclare global {\n interface Window {\n enableCustomWalletSelectorModal: boolean;\n }\n}\n\nlet subscription: any;\n\nexport function setupWalletSelectorModal(\n selector: WalletSelector,\n options: WalletSelectorModalOptions,\n) {\n if (!selector) throw new Error('selector is required');\n\n const {\n showChainGroups = true,\n showWalletUIForNearAccount = true,\n hideWalletUIForNearWallets = ['meteor-wallet-app'],\n env = 'mainnet',\n walletUrl,\n draggable = true,\n initialPosition = { right: '20px', bottom: '20px' },\n buttonSize = '60px',\n mobileButtonSize = '40px',\n } = options;\n\n subscription?.unsubscribe();\n const state = selector.store.getState();\n const group = getGroup(state);\n subscription = selector.store.observable.subscribe((state: WalletSelectorState) => {\n const walletId = state.selectedWalletId;\n window.enableCustomWalletSelectorModal = true;\n console.log('setupWalletSelectorModal walletId', walletId);\n const showWalletUI =\n walletId &&\n (walletId === 'btc-wallet' ||\n (showWalletUIForNearAccount && !hideWalletUIForNearWallets.includes(walletId)));\n removeWalletButton();\n if (showWalletUI) {\n selector.wallet().then((wallet) => {\n setupWalletButton({\n env,\n nearWallet: wallet,\n btcWallet: walletId === 'btc-wallet' ? window.btcContext : undefined,\n walletUrl,\n draggable,\n initialPosition,\n buttonSize,\n mobileButtonSize,\n });\n });\n }\n });\n\n if (group.includes('btc')) {\n document.head.appendChild(document.createElement('style')).textContent = `\n #near-wallet-selector-modal .options-list .btc-wallet {\n display: none;\n }\n `;\n }\n\n if (group.includes('eth')) {\n document.head.appendChild(document.createElement('style')).textContent = `\n #near-wallet-selector-modal .options-list .ethereum-wallets {\n display: none;\n }\n `;\n }\n\n const modal = _setupModal(selector, options);\n const originalShow = modal.show.bind(modal);\n\n modal.show = async () => {\n const chain = group.length > 1 && showChainGroups ? await openChainModal(group) : group[0];\n if (['btc', 'eth'].includes(chain)) {\n const moduleId = chain === 'btc' ? 'btc-wallet' : 'ethereum-wallets';\n const module = state.modules.find((module) => module.id === moduleId);\n if (module) {\n const wallet = await module.wallet();\n await wallet.signIn(options as any);\n }\n } else if (chain === 'near') {\n originalShow();\n }\n };\n return modal;\n}\n\nconst CHAINS = [\n { id: 'near', name: 'Near', description: 'Near Account' },\n { id: 'eth', name: 'Ethereum', description: 'EVM address as Near Account' },\n { id: 'btc', name: 'Bitcoin', description: 'MPC Mapping' },\n];\n\nasync function openChainModal(group: string[]): Promise<string> {\n const chains = CHAINS.filter((chain) => group.includes(chain.id));\n const content = (resolve: (v: string) => void, close: () => void) => {\n const buttons = `\n <div class=\"option-list\">${chains\n .map(\n (chain) => `<button class=\"chain-button option-item\" data-chain=\"${chain.id}\">\n <img src=\"https://assets.deltatrade.ai/assets/chain/${chain.id}.svg\" alt=\"${chain.id}\" style=\"width:32px; height: 32px;\" />\n <div style=\"display: flex; flex-direction: column; text-align: left;\">\n <div style=\"font-size: 16px; font-weight: bold;\">${chain.name}</div>\n <div style=\"font-size: 12px; opacity:0.5;\">${chain.description}</div>\n </div>\n </button>`,\n )\n .join('')}\n </div>\n `;\n const div = document.createElement('div');\n div.innerHTML = buttons;\n\n const buttonsEl = div.querySelectorAll('.chain-button');\n\n buttonsEl.forEach((button) => {\n button.addEventListener('click', () => {\n resolve((button as HTMLButtonElement).dataset.chain as string);\n close();\n });\n });\n\n return div;\n };\n return await Dialog.openModal({\n title: 'Choose Wallet',\n titleStyle:\n 'font-size: 18px; font-weight: 600; color: #fff; text-align: center;padding-bottom: 10px;',\n content,\n });\n}\n\nfunction getGroup(state: WalletSelectorState) {\n const hasBtcWallet = state.modules.some((module) => module.id === 'btc-wallet');\n const hasEvmWallet = state.modules.some((module) => module.id === 'ethereum-wallets');\n const hasNearWallet = state.modules.some(\n (module) => module.id !== 'btc-wallet' && module.id !== 'ethereum-wallets',\n );\n const group = [];\n if (hasBtcWallet) group.push('btc');\n if (hasEvmWallet) group.push('eth');\n if (hasNearWallet) group.push('near');\n return group;\n}\n"],
|
5
|
+
"mappings": "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",
|
6
6
|
"names": ["storage", "messageEl", "EventEmitter", "import_events", "storage", "_network", "_event", "EventEmitter", "signMessage", "import_chains", "import_react", "import_react", "signMessage", "getNetwork", "sendBitcoin", "import_react", "import_react", "import_events", "chainId", "digest", "classes", "css", "import_jsx_runtime", "import_react", "digest", "classes", "css", "import_jsx_runtime", "digest", "classes", "css", "import_jsx_runtime", "import_chains", "import_react", "import_viem", "import_util", "import_react", "digest", "classes", "css", "import_jsx_runtime", "import_react", "import_viem", "digest", "classes", "css", "import_jsx_runtime", "digest", "classes", "css", "import_jsx_runtime", "digest", "classes", "css", "import_jsx_runtime", "import_chains", "import_events", "import_viem", "import_react", "import_jsx_runtime", "_a", "connectorId", "connector", "signMessage", "sendBitcoin", "options", "getNetwork", "smartAccount", "accounts", "_b", "import_react", "import_jsx_runtime", "Modal", "import_jsx_runtime", "Modal", "import_jsx_runtime", "React", "sendBitcoin", "signMessage", "getNetwork", "import_big", "result", "import_utils", "import_near_api_js", "storage", "Big", "bs58", "transactions", "Big", "res", "coinselect", "sendBitcoin", "signMessage", "storage", "storage", "_a", "signMessage", "nearCall", "_0", "transactions", "state", "_setupModal", "module", "chains"]
|
7
7
|
}
|