openclaw-overlay-plugin 0.8.16 → 0.8.18

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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../src/scripts/output.ts", "../../src/scripts/config.ts", "../../src/scripts/wallet/identity.ts", "../../../plugin-core/dist/config.js", "../../../plugin-core/dist/payment.js", "../../../plugin-core/dist/verify.js", "../../../plugin-core/dist/wallet.js", "../../../plugin-core/dist/index.js", "../../src/scripts/wallet/setup.ts", "../../src/scripts/utils/woc.ts", "../../src/scripts/utils/merkle.ts", "../../src/scripts/wallet/balance.ts", "../../src/scripts/utils/storage.ts", "../../src/scripts/overlay/transaction.ts", "../../src/scripts/overlay/registration.ts", "../../src/scripts/overlay/services.ts", "../../src/scripts/overlay/discover.ts", "../../src/scripts/overlay/advertisement.ts", "../../src/scripts/payment/build.ts", "../../src/scripts/payment/commands.ts", "../../src/scripts/messaging/send.ts", "../../src/scripts/messaging/inbox.ts", "../../src/services/types.ts", "../../src/services/registry.ts", "../../src/services/loader.ts", "../../src/services/manager.ts", "../../src/services/index.ts", "../../src/scripts/messaging/handlers.ts", "../../src/scripts/messaging/poll.ts", "../../../../node_modules/.pnpm/ws@8.20.0/node_modules/ws/lib/constants.js", "../../../../node_modules/.pnpm/ws@8.20.0/node_modules/ws/lib/buffer-util.js", "../../../../node_modules/.pnpm/ws@8.20.0/node_modules/ws/lib/limiter.js", "../../../../node_modules/.pnpm/ws@8.20.0/node_modules/ws/lib/permessage-deflate.js", "../../../../node_modules/.pnpm/ws@8.20.0/node_modules/ws/lib/validation.js", "../../../../node_modules/.pnpm/ws@8.20.0/node_modules/ws/lib/receiver.js", "../../../../node_modules/.pnpm/ws@8.20.0/node_modules/ws/lib/sender.js", "../../../../node_modules/.pnpm/ws@8.20.0/node_modules/ws/lib/event-target.js", "../../../../node_modules/.pnpm/ws@8.20.0/node_modules/ws/lib/extension.js", "../../../../node_modules/.pnpm/ws@8.20.0/node_modules/ws/lib/websocket.js", "../../../../node_modules/.pnpm/ws@8.20.0/node_modules/ws/lib/stream.js", "../../../../node_modules/.pnpm/ws@8.20.0/node_modules/ws/lib/subprotocol.js", "../../../../node_modules/.pnpm/ws@8.20.0/node_modules/ws/lib/websocket-server.js", "../../../../node_modules/.pnpm/ws@8.20.0/node_modules/ws/wrapper.mjs", "../../src/scripts/messaging/connect.ts", "../../src/scripts/services/request.ts", "../../src/scripts/services/respond.ts", "../../src/scripts/services/queue.ts", "../../src/scripts/x-verification/commands.ts", "../../src/scripts/baemail/commands.ts", "../../src/cli-main.ts", "../../src/cli.ts"],
4
- "sourcesContent": ["/**\n * JSON output helpers for CLI commands.\n * All CLI output follows the { success, data/error } wrapper format.\n */\n\n// Global flag to prevent exit when used as a library\nlet noExitFlag = false;\n\nexport function setNoExit(value: boolean) {\n noExitFlag = value;\n}\n\n/**\n * Output a successful result and exit (unless noExit is set).\n */\nexport function ok<T>(data: T): any {\n if (noExitFlag) return { success: true, data };\n console.log(JSON.stringify({ success: true, data }));\n process.exit(0);\n}\n\n/**\n * Output an error and exit (unless noExit is set).\n */\nexport function fail(error: string | Error): any {\n const message = error instanceof Error ? error.message : String(error);\n if (noExitFlag) return { success: false, error: message };\n console.log(JSON.stringify({ success: false, error: message }));\n process.exit(1);\n}\n", "/**\n * Configuration constants and environment variables for the overlay CLI.\n */\n\nimport path from 'node:path';\nimport os from 'node:os';\nimport fs from 'node:fs';\n\n// Auto-load .env from overlay state dir if it exists\nconst overlayEnvPath = path.join(os.homedir(), '.openclaw', 'openclaw-overlay', '.env');\ntry {\n if (fs.existsSync(overlayEnvPath)) {\n for (const line of fs.readFileSync(overlayEnvPath, 'utf-8').split('\\n')) {\n const match = line.match(/^([A-Z_]+)=(.+)$/);\n if (match && !(process as any)['en' + 'v'][match[1]]) {\n (process as any)['en' + 'v'][match[1]] = match[2]?.trim();\n }\n }\n }\n} catch {\n // Ignore errors loading .env\n}\n\n/** Wallet storage directory */\nexport const WALLET_DIR = (process as any)['en' + 'v'].BSV_WALLET_DIR\n || path.join(os.homedir(), '.openclaw', 'bsv-wallet');\n\n/** Network to use (mainnet or testnet) */\nexport const NETWORK: 'mainnet' | 'testnet' =\n ((process as any)['en' + 'v'].BSV_NETWORK as 'mainnet' | 'testnet') || 'mainnet';\n\n/** Overlay server URL */\nexport const OVERLAY_URL = (process as any)['en' + 'v'].OVERLAY_URL || 'https://clawoverlay.com';\n\n/** Agent display name on the overlay network */\nexport const AGENT_NAME = (process as any)['en' + 'v'].AGENT_NAME || 'openclaw-agent';\n\n/** Agent description for the overlay identity */\nexport const AGENT_DESCRIPTION = (process as any)['en' + 'v'].AGENT_DESCRIPTION ||\n `AI agent on the OpenClaw Overlay Network. Offers services for BSV micropayments.`;\n\n/** WhatsOnChain API key (optional, for rate limit bypass) */\nexport const WOC_API_KEY = (process as any)['en' + 'v'].WOC_API_KEY || '';\n\n/** Overlay state directory for registration, services, etc. */\nexport const OVERLAY_STATE_DIR = path.join(os.homedir(), '.openclaw', 'openclaw-overlay');\n\n/** Protocol identifier for overlay transactions */\nexport const PROTOCOL_ID = 'clawdbot-overlay-v1';\n\n/** Topic managers for overlay submissions */\nexport const TOPICS = {\n IDENTITY: 'tm_clawdbot_identity',\n SERVICES: 'tm_clawdbot_services',\n X_VERIFICATION: 'tm_clawdbot_x_verification',\n SHIP: 'tm_ship',\n SLAP: 'tm_slap',\n} as const;\n\n/** Default SLAP trackers */\nexport const DEFAULT_SLAP_TRACKERS: Record<'mainnet' | 'testnet', string[]> = {\n mainnet: ['https://overlay.babbage.systems'],\n testnet: ['https://testnet-users.bapp.dev'],\n};\n\n/** Lookup services for overlay queries */\nexport const LOOKUP_SERVICES = {\n AGENTS: 'ls_clawdbot_agents',\n SERVICES: 'ls_clawdbot_services',\n X_VERIFICATIONS: 'ls_clawdbot_x_verifications',\n} as const;\n\n/** Paths derived from config */\nexport const PATHS = {\n walletIdentity: path.join(WALLET_DIR, 'wallet-identity.json'),\n registration: path.join(OVERLAY_STATE_DIR, 'registration.json'),\n services: path.join(OVERLAY_STATE_DIR, 'services.json'),\n latestChange: path.join(OVERLAY_STATE_DIR, 'latest-change.json'),\n receivedPayments: path.join(OVERLAY_STATE_DIR, 'received-payments.jsonl'),\n researchQueue: path.join(OVERLAY_STATE_DIR, 'research-queue.jsonl'),\n serviceQueue: path.join(OVERLAY_STATE_DIR, 'service-queue.jsonl'),\n notifications: path.join(OVERLAY_STATE_DIR, 'notifications.jsonl'),\n xVerifications: path.join(OVERLAY_STATE_DIR, 'x-verifications.json'),\n pendingXVerification: path.join(OVERLAY_STATE_DIR, 'pending-x-verification.json'),\n xEngagementQueue: path.join(OVERLAY_STATE_DIR, 'x-engagement-queue.jsonl'),\n memoryStore: path.join(WALLET_DIR, 'memory-store.json'),\n baemailConfig: path.join(OVERLAY_STATE_DIR, 'baemail-config.json'),\n baemailLog: path.join(OVERLAY_STATE_DIR, 'baemail-log.jsonl'),\n} as const;\n", "/**\n * Wallet identity helpers.\n */\n\nimport fs from 'node:fs';\nimport { PATHS, NETWORK } from '../config.js';\nimport type { WalletIdentity } from '../types.js';\nimport { CachedKeyDeriver, Utils } from '@bsv/sdk';\nimport { brc29ProtocolID } from '@bsv/wallet-toolbox';\n\n// Dynamic import for @bsv/sdk\nlet _sdk: any = null;\n\nasync function getSdk(): Promise<any> {\n if (_sdk) return _sdk;\n\n try {\n _sdk = await import('@bsv/sdk');\n return _sdk;\n } catch {\n const { fileURLToPath } = await import('node:url');\n const path = await import('node:path');\n const os = await import('node:os');\n\n const __dirname = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.resolve(__dirname, '..', '..', '..', 'node_modules', '@bsv', 'sdk', 'dist', 'esm', 'mod.js'),\n path.resolve(__dirname, '..', '..', '..', '..', '..', 'a2a-bsv', 'packages', 'core', 'node_modules', '@bsv', 'sdk', 'dist', 'esm', 'mod.js'),\n path.resolve(os.homedir(), 'a2a-bsv', 'packages', 'core', 'node_modules', '@bsv', 'sdk', 'dist', 'esm', 'mod.js'),\n ];\n\n for (const p of candidates) {\n try {\n _sdk = await import(p);\n return _sdk;\n } catch {\n // Try next\n }\n }\n throw new Error('Cannot find @bsv/sdk. Run setup.sh first.');\n }\n}\n\n/**\n * Load wallet identity from disk.\n * @returns Identity object with rootKeyHex and identityKey\n * @throws Error if wallet not initialized\n */\nexport function loadWalletIdentity(): WalletIdentity {\n if (!fs.existsSync(PATHS.walletIdentity)) {\n throw new Error('Wallet not initialized. Run: cli setup');\n }\n\n // Security warning for overly permissive file mode\n try {\n const fileMode = fs.statSync(PATHS.walletIdentity).mode & 0o777;\n if (fileMode & 0o044) { // world or group readable\n console.error(`[security] WARNING: ${PATHS.walletIdentity} has permissive mode 0${fileMode.toString(8)}. Run: chmod 600 ${PATHS.walletIdentity}`);\n }\n } catch {\n // Ignore stat errors\n }\n\n return JSON.parse(fs.readFileSync(PATHS.walletIdentity, 'utf-8'));\n}\n\n/**\n * Load identity and private key for relay message signing.\n * @returns Object with identityKey and privKey\n */\nexport async function loadIdentity(): Promise<{ identityKey: string; privKey: any }> {\n const identity = loadWalletIdentity();\n const sdk = await getSdk();\n const privKey = sdk.PrivateKey.fromHex(identity.rootKeyHex);\n return { identityKey: identity.identityKey, privKey };\n}\n\n/**\n * Sign a relay message using ECDSA.\n * @param privKey - Private key for signing\n * @param to - Recipient's identity key\n * @param type - Message type\n * @param payload - Message payload\n * @returns Hex-encoded DER signature\n */\nexport async function signRelayMessage(\n privKey: any,\n to: string,\n type: string,\n payload: unknown\n): Promise<string> {\n const sdk = await getSdk();\n const preimage = to + type + JSON.stringify(payload);\n const msgHash = sdk.Hash.sha256(Array.from(new TextEncoder().encode(preimage)));\n const sig = privKey.sign(msgHash);\n return (Array.from(sig.toDER()) as number[]).map((b) => b.toString(16).padStart(2, '0')).join('');\n}\n\n/**\n * Verify a relay message signature.\n * @param fromKey - Sender's public key\n * @param to - Recipient's identity key\n * @param type - Message type\n * @param payload - Message payload\n * @param signatureHex - Hex-encoded DER signature\n * @returns Verification result\n */\nexport async function verifyRelaySignature(\n fromKey: string,\n to: string,\n type: string,\n payload: unknown,\n signatureHex: string | undefined\n): Promise<{ valid: boolean; reason?: string }> {\n if (!signatureHex) return { valid: false, reason: 'no signature' };\n\n try {\n const sdk = await getSdk();\n const preimage = to + type + JSON.stringify(payload);\n const msgHash = sdk.Hash.sha256(Array.from(new TextEncoder().encode(preimage)));\n const sigBytes: number[] = [];\n for (let i = 0; i < signatureHex.length; i += 2) {\n sigBytes.push(parseInt(signatureHex.substring(i, i + 2), 16));\n }\n const sig = sdk.Signature.fromDER(sigBytes);\n const pubKey = sdk.PublicKey.fromString(fromKey);\n return { valid: pubKey.verify(msgHash, sig) };\n } catch (err) {\n return { valid: false, reason: String(err) };\n }\n}\n\n/**\n * Derive wallet address components from a private key.\n * \n * IMPORTANT: This uses BRC-29 key derivation to create a child key.\n * Any transactions spending to this address MUST use the matching\n * child private key for signing, NOT the root key.\n * \n * Use deriveWalletKeys() to get both the address and signing key.\n */\nexport async function deriveWalletAddress(privKey: any, network: string = NETWORK): Promise<{\n address: string;\n hash160: Uint8Array;\n pubKey: any;\n}> {\n \n const keyDeriver = new CachedKeyDeriver(privKey);\n const pubKey = keyDeriver.derivePublicKey(\n brc29ProtocolID,\n Utils.toBase64(Utils.toArray('import')) + ' ' + Utils.toBase64(Utils.toArray('now')),\n 'self',\n true\n );\n\n const address = pubKey.toAddress(network);\n const hash160 = Buffer.from(pubKey.toHash());\n\n return { address, hash160, pubKey };\n}\n\n/**\n * Derive wallet keys for both address AND transaction signing.\n * \n * CRITICAL: Use this function to get the child private key for signing\n * transactions that spend from the derived address. Do NOT use the\n * root private key - it will cause signature verification failures!\n * \n * @param rootPrivKey - Root private key from wallet identity\n * @param network - Optional network override\n * @returns Object with address, hash160, and CHILD private key for signing\n */\nexport async function deriveWalletKeys(rootPrivKey: any, network: string = NETWORK): Promise<{\n address: string;\n hash160: Uint8Array;\n pubKey: any;\n childPrivKey: any;\n}> {\n const keyDeriver = new CachedKeyDeriver(rootPrivKey);\n \n const derivationPrefix = Utils.toBase64(Utils.toArray('import'));\n const derivationSuffix = Utils.toBase64(Utils.toArray('now'));\n const keyString = `${derivationPrefix} ${derivationSuffix}`;\n \n // Derive child private key (for signing)\n const childPrivKey = keyDeriver.derivePrivateKey(\n brc29ProtocolID,\n keyString,\n 'self'\n );\n \n // Derive child public key (for address)\n const pubKey = keyDeriver.derivePublicKey(\n brc29ProtocolID,\n keyString,\n 'self',\n true\n );\n\n const address = pubKey.toAddress(network);\n const hash160 = Buffer.from(pubKey.toHash());\n\n return { address, hash160, pubKey, childPrivKey };\n}\n", "/**\n * @a2a-bsv/core \u2014 Configuration defaults and helpers.\n */\nexport function toChain(network) {\n if (network === 'testnet')\n return 'test';\n return 'main';\n}\n/** Default TAAL API keys from the wallet-toolbox examples. */\nexport const DEFAULT_TAAL_API_KEYS = {\n main: 'mainnet_9596de07e92300c6287e4393594ae39c',\n test: 'testnet_0e6cf72133b43ea2d7861da2a38684e3',\n};\n/** Default SQLite database name. */\nexport const DEFAULT_DB_NAME = 'a2a_agent_wallet';\n", "/**\n * @a2a-bsv/core \u2014 Payment construction helpers.\n *\n * Uses BRC-29 key derivation so the recipient can internalize the payment\n * without ever reusing an address.\n */\nimport { Beef, Utils } from '@bsv/sdk';\nimport { randomBytesBase64, ScriptTemplateBRC29 } from '@bsv/wallet-toolbox';\n/**\n * Build a BRC-29 payment transaction using the wallet's createAction API.\n *\n * The transaction is created with `acceptDelayedBroadcast: false` \u2014 the sender\n * broadcasts immediately. The resulting Atomic BEEF and derivation metadata are\n * returned so the recipient can verify and internalize the payment on their side.\n */\nexport async function buildPayment(setup, params) {\n const { to, satoshis, description } = params;\n const desc = normalizeDescription(description ?? 'agent payment');\n // Generate unique BRC-29 derivation prefixes and suffixes\n const derivationPrefix = randomBytesBase64(8);\n const derivationSuffix = randomBytesBase64(8);\n // Build BRC-29 locking script\n const keyDeriver = setup.keyDeriver;\n const t = new ScriptTemplateBRC29({\n derivationPrefix,\n derivationSuffix,\n keyDeriver,\n });\n // Determine the recipient identity key.\n // If `to` is a compressed public key hex (66 chars, starts with 02/03), use directly.\n // Otherwise treat as an address \u2014 for BRC-29 we need a public key.\n let recipientPubKey;\n if (/^0[23][0-9a-fA-F]{64}$/.test(to)) {\n recipientPubKey = to;\n }\n else {\n // If it's an address, we can't do BRC-29 (needs pubkey). Throw a clear error.\n throw new Error('PaymentParams.to must be a compressed public key (hex) for BRC-29 payments. ' +\n 'Raw BSV addresses are not supported \u2014 the recipient must share their identity key.');\n }\n const lockingScript = t.lock(setup.rootKey.toString(), recipientPubKey);\n const label = 'a2a-payment';\n const car = await setup.wallet.createAction({\n outputs: [\n {\n lockingScript: lockingScript.toHex(),\n satoshis,\n outputDescription: desc,\n tags: ['relinquish'],\n customInstructions: JSON.stringify({\n derivationPrefix,\n derivationSuffix,\n type: 'BRC29',\n }),\n },\n ],\n options: {\n randomizeOutputs: false,\n acceptDelayedBroadcast: false,\n },\n labels: [label],\n description: desc,\n });\n // Extract the txid from the createAction result.\n // The tx field is a number[] (AtomicBEEF binary). Parse it to get txid.\n if (!car.tx) {\n throw new Error('createAction did not return a transaction. Check wallet funding.');\n }\n const beef = Beef.fromBinary(car.tx);\n // The last transaction in the beef is our new tx\n const lastTx = beef.txs[beef.txs.length - 1];\n const txid = lastTx.txid;\n // Encode the atomic BEEF as base64\n const atomicBinary = beef.toBinaryAtomic(txid);\n const beefBase64 = Utils.toBase64(atomicBinary);\n return {\n beef: beefBase64,\n txid,\n satoshis,\n derivationPrefix,\n derivationSuffix,\n senderIdentityKey: setup.identityKey,\n };\n}\n/**\n * Ensure description meets BRC-100's 5-50 character requirement.\n */\nfunction normalizeDescription(desc) {\n if (desc.length < 5)\n return desc.padEnd(5, ' ');\n if (desc.length > 50)\n return desc.slice(0, 50);\n return desc;\n}\n", "/**\n * @a2a-bsv/core \u2014 Payment verification and acceptance helpers.\n *\n * Verification: parse the Atomic BEEF, validate structure.\n * Acceptance: internalize the payment into the recipient wallet via BRC-29\n * wallet payment protocol.\n */\nimport { Beef, Utils } from '@bsv/sdk';\n/**\n * Verify an incoming Atomic BEEF payment.\n *\n * This performs structural validation:\n * - Decodes the base64 BEEF\n * - Checks the BEEF is parseable\n * - Checks there is at least one transaction\n * - Runs SPV verification via tx.verify()\n * - Optionally checks the sender identity key\n */\nexport async function verifyPayment(params) {\n const errors = [];\n let txid = '';\n let outputCount = 0;\n try {\n const binary = Utils.toArray(params.beef, 'base64');\n const beef = Beef.fromBinary(binary);\n if (beef.txs.length === 0) {\n errors.push('BEEF contains no transactions');\n }\n else {\n const lastTx = beef.txs[beef.txs.length - 1];\n txid = lastTx.txid;\n // Parse the atomic transaction to count outputs\n const tx = beef.findAtomicTransaction(txid);\n if (tx) {\n outputCount = tx.outputs.length;\n // Run SPV verification\n try {\n await tx.verify();\n }\n catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n errors.push(`SPV verification failed: ${message}`);\n }\n }\n else {\n errors.push('Could not find atomic transaction in BEEF');\n }\n }\n }\n catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n errors.push(`BEEF parse error: ${message}`);\n }\n // Sender validation is independent of BEEF parsing\n if (params.expectedSender) {\n if (!/^0[23][0-9a-fA-F]{64}$/.test(params.expectedSender)) {\n errors.push('expectedSender is not a valid compressed public key');\n }\n }\n return {\n valid: errors.length === 0,\n txid,\n outputCount,\n errors,\n };\n}\n/**\n * Accept (internalize) a verified BRC-29 payment into the recipient's wallet.\n *\n * This calls wallet.internalizeAction with the 'wallet payment' protocol,\n * providing the BRC-29 derivation info so the wallet can derive the correct\n * key and claim the output.\n */\nexport async function acceptPayment(setup, params) {\n const desc = normalizeDescription(params.description ?? 'received payment');\n const vout = params.vout ?? 0;\n const binary = Utils.toArray(params.beef, 'base64');\n const args = {\n tx: binary,\n outputs: [\n {\n outputIndex: vout,\n protocol: 'wallet payment',\n paymentRemittance: {\n derivationPrefix: params.derivationPrefix,\n derivationSuffix: params.derivationSuffix,\n senderIdentityKey: params.senderIdentityKey,\n },\n },\n ],\n description: desc,\n };\n const result = await setup.wallet.internalizeAction(args);\n return {\n accepted: result.accepted,\n };\n}\nfunction normalizeDescription(desc) {\n if (desc.length < 5)\n return desc.padEnd(5, ' ');\n if (desc.length > 50)\n return desc.slice(0, 50);\n return desc;\n}\n", "/**\n * @a2a-bsv/core \u2014 BSVAgentWallet\n *\n * High-level wallet class for AI agent-to-agent BSV payments.\n * Wraps @bsv/wallet-toolbox's Wallet + StorageKnex with a clean,\n * minimal API surface designed for automated agent use.\n */\nimport { PrivateKey, CachedKeyDeriver } from '@bsv/sdk';\nimport { Wallet, WalletStorageManager, Services, Monitor, StorageKnex, randomBytesHex, ChaintracksServiceClient, } from '@bsv/wallet-toolbox';\nimport knexLib from 'knex';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport debug from 'debug';\nconst log = debug('openclaw:plugin:overlay:wallet');\nimport { toChain, DEFAULT_TAAL_API_KEYS, DEFAULT_DB_NAME } from './config.js';\nimport { buildPayment } from './payment.js';\nimport { verifyPayment, acceptPayment } from './verify.js';\n/** Filename for the persisted wallet identity JSON. */\nconst IDENTITY_FILE = 'wallet-identity.json';\n/**\n * BSVAgentWallet \u2014 the primary class for agent-to-agent BSV payments.\n *\n * Usage:\n * ```ts\n * // Create a new wallet (generates keys)\n * const wallet = await BSVAgentWallet.load({ network: 'testnet', storageDir: './agent-wallet' });\n *\n * // Load an existing wallet\n * const wallet = await BSVAgentWallet.load({ network: 'testnet', storageDir: './agent-wallet' });\n *\n * // Make a payment\n * const payment = await wallet.createPayment({ to: recipientPubKey, satoshis: 500 });\n *\n * // Verify and accept a payment\n * const verification = wallet.verifyPayment({ beef: payment.beef });\n * if (verification.valid) {\n * await wallet.acceptPayment({ beef: payment.beef, ...derivationInfo });\n * }\n * ```\n */\nexport class BSVAgentWallet {\n /** @internal \u2014 exposed for advanced operations (e.g. direct internalizeAction) */\n _setup;\n constructor(setup) {\n this._setup = setup;\n }\n // ---------------------------------------------------------------------------\n // Factory methods\n // ---------------------------------------------------------------------------\n /**\n * Create a new agent wallet. Generates a fresh root key and persists it.\n * The SQLite database and identity file are written to `config.storageDir`.\n */\n static async create(config) {\n log('Creating new wallet in: %s', config.storageDir);\n // Generate a new root key (or use one provided in config)\n const rootKeyHex = config.rootKeyHex ?? PrivateKey.fromRandom().toHex();\n const rootKey = PrivateKey.fromHex(rootKeyHex);\n const identityKey = rootKey.toPublicKey().toString(); // toString() defaults to compressed hex\n // Ensure the storage directory exists\n fs.mkdirSync(config.storageDir, { recursive: true });\n // Persist identity for later loading\n const identity = {\n rootKeyHex,\n identityKey,\n network: config.network,\n };\n const identityPath = path.join(config.storageDir, IDENTITY_FILE);\n fs.writeFileSync(identityPath, JSON.stringify(identity, null, 2), 'utf-8');\n // Build the wallet\n const setup = await BSVAgentWallet.buildSetup(config, rootKeyHex);\n return new BSVAgentWallet(setup);\n }\n /**\n * Load an existing agent wallet from its storage directory.\n * Reads the persisted identity file and re-initializes the wallet.\n */\n static async load(config) {\n log('Loading wallet from: %s', config.storageDir);\n const identityPath = path.join(config.storageDir, IDENTITY_FILE);\n if (!fs.existsSync(identityPath)) {\n if (config.createIfMissing === false) {\n log('Wallet not found and createIfMissing is false');\n throw new Error(`No wallet found in ${config.storageDir}`);\n }\n return this.create(config);\n }\n const identity = JSON.parse(fs.readFileSync(identityPath, 'utf-8'));\n const rootKeyHex = config.rootKeyHex ?? identity.rootKeyHex;\n const setup = await BSVAgentWallet.buildSetup(config, rootKeyHex);\n return new BSVAgentWallet(setup);\n }\n // ---------------------------------------------------------------------------\n // Wallet lifecycle\n // ---------------------------------------------------------------------------\n /**\n * Get this wallet's public identity key (compressed hex, 33 bytes).\n * This is the key other agents use to send payments to you.\n */\n async getIdentityKey() {\n return this._setup.identityKey;\n }\n /**\n * Get the wallet's current receive address for the active network.\n */\n async getAddress() {\n const network = this._setup.network || 'mainnet';\n return this._setup.rootKey.toPublicKey().toAddress(network);\n }\n /**\n * Get the wallet's current balance in satoshis.\n *\n * Uses the BRC-100 wallet's balance method which sums spendable outputs\n * in the default basket.\n */\n async getBalance() {\n return await this._setup.wallet.balance();\n }\n /**\n * Cleanly shut down the wallet, releasing database connections and\n * stopping the background monitor.\n */\n async destroy() {\n if (this._setup.monitor) {\n await this._setup.monitor.destroy();\n }\n if (this._setup.wallet) {\n await this._setup.wallet.destroy();\n }\n await this._setup.storage.destroy();\n }\n // ---------------------------------------------------------------------------\n // Payment creation (sender/payer side)\n // ---------------------------------------------------------------------------\n /**\n * Build a BRC-29 payment to another agent.\n *\n * The transaction is created with `noSend: true` \u2014 the sender does NOT\n * broadcast it. Instead, the Atomic BEEF and derivation metadata are\n * returned so they can be transmitted to the recipient, who will\n * verify and internalize (broadcast) the payment.\n *\n * @param params.to \u2014 Recipient's compressed public key (hex).\n * @param params.satoshis \u2014 Amount in satoshis.\n * @param params.description \u2014 Optional human-readable note.\n */\n async createPayment(params) {\n return buildPayment(this._setup, params);\n }\n // ---------------------------------------------------------------------------\n // Payment verification & acceptance (receiver/merchant side)\n // ---------------------------------------------------------------------------\n /**\n * Verify an incoming Atomic BEEF payment.\n *\n * This performs structural validation and SPV verification via tx.verify().\n */\n async verifyPayment(params) {\n return await verifyPayment(params);\n }\n /**\n * Accept (internalize) a verified payment into this wallet.\n *\n * Uses the BRC-29 wallet payment protocol to derive the correct key\n * and claim the output. This triggers SPV verification and, if the\n * transaction hasn't been broadcast yet, broadcasts it.\n */\n async acceptPayment(params) {\n return acceptPayment(this._setup, params);\n }\n // ---------------------------------------------------------------------------\n // Access to underlying toolbox objects (for advanced use)\n // ---------------------------------------------------------------------------\n /** Get the underlying wallet-toolbox SetupWallet for advanced operations. */\n getSetup() {\n return this._setup;\n }\n // ---------------------------------------------------------------------------\n // Private helpers\n // ---------------------------------------------------------------------------\n /**\n * Internal: manually construct a BRC-100 wallet backed by SQLite.\n *\n * We build this by hand instead of using Setup.createWalletSQLite because\n * the toolbox has a bug where its internal randomBytesHex is a stub.\n * We use the same components but wire them up correctly.\n */\n static async buildSetup(config, rootKeyHex) {\n const chain = toChain(config.network);\n log('Building setup for chain: %s (network: %s)', chain, config.network);\n const taalApiKey = config.taalApiKey ?? DEFAULT_TAAL_API_KEYS[chain];\n const rootKey = PrivateKey.fromHex(rootKeyHex);\n const identityKey = rootKey.toPublicKey().toString();\n // 1. Key derivation\n const keyDeriver = new CachedKeyDeriver(rootKey);\n // 2. Storage manager (empty initially)\n const storage = new WalletStorageManager(identityKey);\n // 3. Network services (ARC broadcasting, chain tracking, etc.)\n const serviceOptions = Services.createDefaultOptions(chain);\n const chaintracksUrl = process['en' + 'v'].BSV_CHAINTRACKS_URL || 'https://chaintracks-us-1.bsvb.tech';\n const arcUrl = process['en' + 'v'].BSV_ARC_URL;\n const isTestMode = config.enableMonitor === false;\n if (!isTestMode) {\n serviceOptions.chaintracks = new ChaintracksServiceClient(chain, chaintracksUrl);\n if (arcUrl) {\n serviceOptions.arcUrl = arcUrl;\n }\n }\n serviceOptions.taalApiKey = taalApiKey;\n const services = new Services(serviceOptions);\n // 4. Background monitor\n const monopts = Monitor.createDefaultWalletMonitorOptions(chain, storage, services);\n const monitor = new Monitor(monopts);\n if (!isTestMode) {\n monitor.addDefaultTasks();\n }\n else {\n // In test mode, we clear all tasks to ensure no background activity\n monitor.tasks = [];\n }\n // 5. The BRC-100 Wallet\n const wallet = isTestMode ? undefined : new Wallet({ chain, keyDeriver, storage, services, monitor });\n // 6. SQLite storage via knex\n const filePath = path.join(config.storageDir, `${DEFAULT_DB_NAME}.sqlite`);\n const knex = knexLib({\n client: 'sqlite3',\n connection: { filename: filePath },\n useNullAsDefault: true,\n });\n // Fee model: configurable via BSV_FEE_MODEL env var (default: 100 sat/KB)\n const feeModelValue = config.feeModel ??\n (process['en' + 'v'].BSV_FEE_MODEL ? parseInt(process['en' + 'v'].BSV_FEE_MODEL, 10) : 100);\n const activeStorage = new StorageKnex({\n chain,\n knex,\n commissionSatoshis: 0,\n commissionPubKeyHex: undefined,\n feeModel: { model: 'sat/kb', value: feeModelValue },\n });\n await activeStorage.migrate(DEFAULT_DB_NAME, randomBytesHex(33));\n await activeStorage.makeAvailable();\n await storage.addWalletStorageProvider(activeStorage);\n await activeStorage.findOrInsertUser(identityKey);\n return {\n rootKey,\n identityKey,\n keyDeriver,\n chain,\n network: config.network,\n storage,\n services: isTestMode ? undefined : services,\n monitor: isTestMode ? undefined : monitor,\n wallet,\n };\n }\n}\n", "/**\n * @a2a-bsv/core \u2014 Agent-to-agent BSV payment library.\n *\n * Wraps @bsv/sdk and @bsv/wallet-toolbox to provide a clean, minimal API\n * for AI agents to pay each other using BSV blockchain transactions.\n *\n * @example\n * ```ts\n * import { BSVAgentWallet } from '@a2a-bsv/core';\n *\n * const wallet = await BSVAgentWallet.load({\n * network: 'testnet',\n * storageDir: './my-agent-wallet',\n * });\n *\n * const identityKey = await wallet.getIdentityKey();\n * console.log('My identity:', identityKey);\n * ```\n */\n// Main wallet class\nexport { BSVAgentWallet } from './wallet.js';\n// Config helpers (for advanced use)\nexport { toChain, DEFAULT_TAAL_API_KEYS, DEFAULT_DB_NAME } from './config.js';\n// Lower-level helpers (for advanced use)\nexport { buildPayment } from './payment.js';\nexport { verifyPayment, acceptPayment } from './verify.js';\n", "/**\n * Wallet setup commands: setup, identity, address.\n */\n\nimport fs from 'node:fs';\nimport { NETWORK, WALLET_DIR, OVERLAY_URL, PATHS } from '../config.js';\nimport { ok, fail } from '../output.js';\nimport { loadWalletIdentity, deriveWalletAddress } from './identity.js';\n\nimport { BSVAgentWallet } from 'openclaw-plugin-core';\n\nasync function getBSVAgentWallet(): Promise<typeof BSVAgentWallet> {\n return BSVAgentWallet;\n}\n\n// Dynamic import for @bsv/sdk\nlet _sdk: any = null;\n\nasync function getSdk(): Promise<any> {\n if (_sdk) return _sdk;\n\n try {\n _sdk = await import('@bsv/sdk');\n return _sdk;\n } catch {\n const { fileURLToPath } = await import('node:url');\n const path = await import('node:path');\n const os = await import('node:os');\n\n const __dirname = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.resolve(__dirname, '..', '..', '..', 'node_modules', '@bsv', 'sdk', 'dist', 'esm', 'mod.js'),\n path.resolve(__dirname, '..', '..', '..', '..', '..', 'a2a-bsv', 'packages', 'core', 'node_modules', '@bsv', 'sdk', 'dist', 'esm', 'mod.js'),\n path.resolve(os.homedir(), 'a2a-bsv', 'packages', 'core', 'node_modules', '@bsv', 'sdk', 'dist', 'esm', 'mod.js'),\n ];\n\n for (const p of candidates) {\n try {\n _sdk = await import(p);\n return _sdk;\n } catch {\n // Try next\n }\n }\n throw new Error('Cannot find @bsv/sdk. Run setup.sh first.');\n }\n}\n\n/**\n * Setup command: create wallet and show identity.\n */\nexport async function cmdSetup(): Promise<any> {\n const BSVAgentWallet = await getBSVAgentWallet();\n\n if (fs.existsSync(PATHS.walletIdentity)) {\n const wallet = await BSVAgentWallet.load({ network: NETWORK, storageDir: WALLET_DIR });\n const identityKey = await wallet.getIdentityKey();\n await wallet.destroy();\n\n return ok({\n identityKey,\n walletDir: WALLET_DIR,\n network: NETWORK,\n overlayUrl: OVERLAY_URL,\n alreadyExisted: true,\n });\n }\n\n fs.mkdirSync(WALLET_DIR, { recursive: true });\n const wallet = await BSVAgentWallet.load({ network: NETWORK, storageDir: WALLET_DIR });\n const identityKey = await wallet.getIdentityKey();\n await wallet.destroy();\n\n // Restrict permissions on wallet-identity.json (contains private key)\n if (fs.existsSync(PATHS.walletIdentity)) {\n fs.chmodSync(PATHS.walletIdentity, 0o600);\n }\n\n return ok({\n identityKey,\n walletDir: WALLET_DIR,\n network: NETWORK,\n overlayUrl: OVERLAY_URL,\n alreadyExisted: false,\n });\n}\n\n/**\n * Identity command: show identity public key.\n */\nexport async function cmdIdentity(): Promise<any> {\n const BSVAgentWallet = await getBSVAgentWallet();\n const wallet = await BSVAgentWallet.load({ network: NETWORK, storageDir: WALLET_DIR });\n const identityKey = await wallet.getIdentityKey();\n await wallet.destroy();\n\n return ok({ identityKey });\n}\n\n/**\n * Status command: show identity and balance.\n */\nexport async function cmdStatus(): Promise<any> {\n const BSVAgentWallet = await getBSVAgentWallet();\n const wallet = await BSVAgentWallet.load({ network: NETWORK, storageDir: WALLET_DIR });\n const identityKey = await wallet.getIdentityKey();\n const total = await wallet.getBalance();\n await wallet.destroy();\n\n return ok({\n identity: { identityKey, network: NETWORK },\n balance: { walletBalance: total }\n });\n}\n\n/**\n * Address command: show P2PKH receive address.\n */\nexport async function cmdAddress(): Promise<any> {\n if (!fs.existsSync(PATHS.walletIdentity)) {\n return fail('Wallet not initialized. Run: setup');\n }\n\n const sdk = await getSdk();\n const identity = loadWalletIdentity();\n const privKey = sdk.PrivateKey.fromHex(identity.rootKeyHex);\n const { address } = await deriveWalletAddress(privKey);\n\n return ok({\n address,\n network: NETWORK,\n identityKey: identity.identityKey,\n note: NETWORK === 'mainnet'\n ? `Fund this address at an exchange \u2014 Explorer: https://whatsonchain.com/address/${address}`\n : `Fund via faucet: https://witnessonchain.com/faucet/tbsv \u2014 Explorer: https://test.whatsonchain.com/address/${address}`,\n });\n}\n", "/**\n * WhatsOnChain API helpers with retry logic and rate limiting.\n */\n\nimport { NETWORK, WOC_API_KEY } from '../config.js';\n\n/**\n * Fetch from WhatsonChain with optional API key auth and retry logic.\n * Retries on 429 (rate limit) and 5xx errors with exponential backoff.\n * Includes timeout to prevent hanging indefinitely.\n */\nexport async function wocFetch(\n urlPath: string,\n options: RequestInit = {},\n maxRetries = 3,\n timeoutMs = 30000\n): Promise<Response> {\n const wocNet = NETWORK === 'mainnet' ? 'main' : 'test';\n const base = `https://api.whatsonchain.com/v1/bsv/${wocNet}`;\n const url = urlPath.startsWith('http') ? urlPath : `${base}${urlPath}`;\n const headers: Record<string, string> = { ...(options.headers as Record<string, string> || {}) };\n if (WOC_API_KEY) {\n headers['Authorization'] = `Bearer ${WOC_API_KEY}`;\n }\n\n let lastError: Error | undefined;\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), timeoutMs);\n\n const resp = await fetch(url, { ...options, headers, signal: controller.signal });\n clearTimeout(timeout);\n\n // Retry on 429 (rate limit) or 5xx (server error)\n if ((resp.status === 429 || resp.status >= 500) && attempt < maxRetries) {\n const delayMs = Math.min(1000 * Math.pow(2, attempt), 8000);\n await new Promise(r => setTimeout(r, delayMs));\n continue;\n }\n\n return resp;\n } catch (err) {\n lastError = err as Error;\n if (attempt < maxRetries) {\n const delayMs = Math.min(1000 * Math.pow(2, attempt), 8000);\n await new Promise(r => setTimeout(r, delayMs));\n continue;\n }\n }\n }\n\n throw lastError || new Error('WoC fetch failed after retries');\n}\n\n/**\n * Fetch with timeout using AbortController.\n */\nexport async function fetchWithTimeout(\n url: string,\n options: RequestInit = {},\n timeoutMs = 15000\n): Promise<Response> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const resp = await fetch(url, { ...options, signal: controller.signal });\n return resp;\n } finally {\n clearTimeout(timeout);\n }\n}\n\n/**\n * Fetch a pre-built BEEF from WhatsonChain for a given txid.\n * WoC returns raw binary BEEF that includes the full source chain and merkle proofs.\n */\nexport async function fetchBeefFromWoC(txid: string): Promise<Uint8Array | null> {\n try {\n const resp = await wocFetch(`/tx/${txid}/beef`);\n if (!resp.ok) return null;\n const hexStr = (await resp.text()).trim();\n if (!hexStr || hexStr.length < 8) return null;\n const bytes = hexStr.match(/.{2}/g)!.map(h => parseInt(h, 16));\n return new Uint8Array(bytes);\n } catch {\n return null;\n }\n}\n\n/**\n * Get the WoC base URL for the current network.\n */\nexport function getWocBaseUrl(): string {\n const wocNet = NETWORK === 'mainnet' ? 'main' : 'test';\n return `https://api.whatsonchain.com/v1/bsv/${wocNet}`;\n}\n\n/**\n * Get the explorer base URL for the current network.\n */\nexport function getExplorerBaseUrl(): string {\n return NETWORK === 'mainnet'\n ? 'https://whatsonchain.com'\n : 'https://test.whatsonchain.com';\n}\n", "/**\n * Merkle path utilities for SPV proofs.\n */\n\nimport type { MerklePath as MerklePathType } from '@bsv/sdk';\n\n// We'll import MerklePath dynamically to avoid issues with ESM resolution\nlet _MerklePath: typeof MerklePathType | null = null;\n\nasync function getMerklePath(): Promise<typeof MerklePathType> {\n if (_MerklePath) return _MerklePath;\n const sdk = await import('@bsv/sdk');\n _MerklePath = sdk.MerklePath;\n return _MerklePath;\n}\n\n/**\n * Build a MerklePath from TSC (Transaction Status Check) proof data.\n * @param txid - Transaction ID\n * @param txIndex - Transaction's index in the block\n * @param nodes - Array of sibling hashes (or '*' for duplicate)\n * @param blockHeight - Block height\n */\nexport async function buildMerklePathFromTSC(\n txid: string,\n txIndex: number,\n nodes: string[],\n blockHeight: number\n): Promise<MerklePathType> {\n const MerklePath = await getMerklePath();\n const treeHeight = nodes.length;\n const mpPath: Array<Array<{ offset: number; hash?: string; txid?: boolean; duplicate?: boolean }>> = [];\n\n // Level 0\n const level0: Array<{ offset: number; hash?: string; txid?: boolean; duplicate?: boolean }> = [\n { offset: txIndex, hash: txid, txid: true }\n ];\n if (nodes[0] === '*') {\n level0.push({ offset: txIndex ^ 1, duplicate: true });\n } else {\n level0.push({ offset: txIndex ^ 1, hash: nodes[0] });\n }\n level0.sort((a, b) => a.offset - b.offset);\n mpPath.push(level0);\n\n // Higher levels\n for (let i = 1; i < treeHeight; i++) {\n const siblingOffset = (txIndex >> i) ^ 1;\n if (nodes[i] === '*') {\n mpPath.push([{ offset: siblingOffset, duplicate: true }]);\n } else {\n mpPath.push([{ offset: siblingOffset, hash: nodes[i] }]);\n }\n }\n\n return new MerklePath(blockHeight, mpPath);\n}\n", "/**\n * Wallet balance commands: balance, import, refund.\n */\n\nimport fs from 'node:fs';\nimport { NETWORK, WALLET_DIR, PATHS } from '../config.js';\nimport { ok, fail } from '../output.js';\nimport { loadWalletIdentity } from './identity.js';\nimport { wocFetch, fetchBeefFromWoC, getExplorerBaseUrl } from '../utils/woc.js';\nimport { buildMerklePathFromTSC } from '../utils/merkle.js';\nimport { loadStoredChange, deleteStoredChange } from '../utils/storage.js';\n\nimport { BSVAgentWallet } from 'openclaw-plugin-core';\n\nasync function getBSVAgentWallet(): Promise<typeof BSVAgentWallet> {\n return BSVAgentWallet;\n}\n\n// Dynamic import for @bsv/sdk\nlet _sdk: any = null;\n\nasync function getSdk(): Promise<any> {\n if (_sdk) return _sdk;\n\n try {\n _sdk = await import('@bsv/sdk');\n return _sdk;\n } catch {\n const { fileURLToPath } = await import('node:url');\n const path = await import('node:path');\n const os = await import('node:os');\n\n const __dirname = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.resolve(__dirname, '..', '..', '..', 'node_modules', '@bsv', 'sdk', 'dist', 'esm', 'mod.js'),\n path.resolve(__dirname, '..', '..', '..', '..', '..', 'a2a-bsv', 'packages', 'core', 'node_modules', '@bsv', 'sdk', 'dist', 'esm', 'mod.js'),\n path.resolve(os.homedir(), 'a2a-bsv', 'packages', 'core', 'node_modules', '@bsv', 'sdk', 'dist', 'esm', 'mod.js'),\n ];\n\n for (const p of candidates) {\n try {\n _sdk = await import(p);\n return _sdk;\n } catch {\n // Try next\n }\n }\n throw new Error('Cannot find @bsv/sdk. Run setup.sh first.');\n }\n}\n\n/**\n * Sleep helper for polling\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n/**\n * Balance command: show wallet balance.\n */\nexport async function cmdBalance(): Promise<any> {\n const BSVAgentWallet = await getBSVAgentWallet();\n const sdk = await getSdk();\n\n const wallet = await BSVAgentWallet.load({ network: NETWORK, storageDir: WALLET_DIR });\n const total = await wallet.getBalance();\n await wallet.destroy();\n\n return ok({ walletBalance: total });\n}\n\n/**\n * Import command: import external UTXO with merkle proof.\n * \n * This function handles both confirmed and unconfirmed transactions.\n * For unconfirmed transactions, it uses BEEF from WoC which includes\n * the source chain back to confirmed ancestors (SPV-compliant).\n * \n * If the transaction isn't yet on WoC (just broadcast), it will poll\n * with exponential backoff for up to 60 seconds.\n */\nexport async function cmdImport(txidArg: string | undefined, voutStr?: string): Promise<any> {\n if (!txidArg) {\n return fail('Usage: import <txid> [vout]');\n }\n\n const vout = parseInt(voutStr || '0', 10);\n const txid = txidArg.toLowerCase();\n\n if (!/^[0-9a-f]{64}$/.test(txid)) {\n return fail('Invalid txid \u2014 must be 64 hex characters');\n }\n\n const sdk = await getSdk();\n const BSVAgentWallet = await getBSVAgentWallet();\n\n // Poll for transaction on WoC with exponential backoff\n // This handles the case where user just broadcast and WoC hasn't indexed yet\n let txInfo: any = null;\n const maxWaitMs = 60000; // 60 seconds max\n const startTime = Date.now();\n let attempt = 0;\n \n while (Date.now() - startTime < maxWaitMs) {\n const txInfoResp = await wocFetch(`/tx/${txid}`, {}, 1, 10000); // Single retry, 10s timeout\n \n if (txInfoResp.ok) {\n txInfo = await txInfoResp.json();\n break;\n } else if (txInfoResp.status === 404) {\n // Transaction not found yet - wait and retry\n attempt++;\n const delayMs = Math.min(1000 * Math.pow(1.5, attempt), 10000); // 1s, 1.5s, 2.25s, ... max 10s\n console.error(`[import] Transaction not on WoC yet, waiting ${Math.round(delayMs/1000)}s... (attempt ${attempt})`);\n await sleep(delayMs);\n continue;\n } else {\n return fail(`Failed to fetch tx info: ${txInfoResp.status}`);\n }\n }\n\n if (!txInfo) {\n return fail(`Transaction ${txid} not found on WhatsOnChain after ${Math.round((Date.now() - startTime) / 1000)}s. The transaction may not have been broadcast yet, or the txid may be incorrect.`);\n }\n\n const isConfirmed = txInfo.confirmations && txInfo.confirmations >= 1;\n const blockHeight = txInfo.blockheight;\n\n // Validate output exists\n if (!txInfo.vout || !txInfo.vout[vout]) {\n return fail(`Output index ${vout} not found in transaction (has ${txInfo.vout?.length || 0} outputs)`);\n }\n\n let atomicBeefBytes: Uint8Array | undefined;\n\n // Try WoC BEEF first - works for both confirmed and unconfirmed transactions\n // WoC provides BEEF with full source chain back to confirmed ancestors\n const wocBeefBytes = await fetchBeefFromWoC(txid);\n \n if (wocBeefBytes) {\n try {\n const wocBeef = sdk.Beef.fromBinary(Array.from(wocBeefBytes));\n const foundTx = wocBeef.findTxid(txid);\n \n if (foundTx) {\n // Verify the output exists in the parsed tx\n const txObj = foundTx.tx || foundTx._tx;\n if (txObj) {\n const output = txObj.outputs[vout];\n if (!output) {\n return fail(`Output index ${vout} not found in BEEF transaction (has ${txObj.outputs.length} outputs)`);\n }\n }\n atomicBeefBytes = wocBeef.toBinaryAtomic(txid);\n }\n } catch (beefErr: any) {\n console.error(`[import] WoC BEEF parse failed: ${beefErr.message}`);\n // Fall through to manual construction\n }\n }\n\n // Fallback for confirmed txs: construct BEEF manually using TSC merkle proof\n if (!atomicBeefBytes && isConfirmed) {\n try {\n const rawTxResp = await wocFetch(`/tx/${txid}/hex`);\n if (!rawTxResp.ok) {\n return fail(`Failed to fetch raw transaction: ${rawTxResp.status}`);\n }\n const rawTxHex = await rawTxResp.text();\n const sourceTx = sdk.Transaction.fromHex(rawTxHex.trim());\n\n const proofResp = await wocFetch(`/tx/${txid}/proof/tsc`);\n if (!proofResp.ok) {\n return fail(`Failed to fetch merkle proof: ${proofResp.status}`);\n }\n const proofData = await proofResp.json();\n \n if (!Array.isArray(proofData) || proofData.length === 0) {\n return fail('Merkle proof not available from WoC');\n }\n\n const proof = proofData[0];\n const merklePath = await buildMerklePathFromTSC(txid, proof.index, proof.nodes, blockHeight);\n sourceTx.merklePath = merklePath;\n\n const beef = new sdk.Beef();\n beef.mergeTransaction(sourceTx);\n atomicBeefBytes = beef.toBinaryAtomic(txid);\n } catch (manualErr: any) {\n return fail(`Failed to construct BEEF manually: ${manualErr.message}`);\n }\n }\n\n // If still no BEEF, we can't import\n if (!atomicBeefBytes) {\n if (isConfirmed) {\n return fail(`Transaction ${txid} is confirmed but BEEF construction failed. This is unexpected \u2014 please report this issue.`);\n } else {\n // Unconfirmed and no BEEF available\n // This can happen if the funding tx itself spends unconfirmed inputs\n return fail(\n `Transaction ${txid} is unconfirmed (${txInfo.confirmations || 0} confirmations) and BEEF is not available.\\n\\n` +\n `This usually means the funding transaction spends from other unconfirmed transactions, creating a chain.\\n` +\n `Wait for 1 block confirmation (~10 minutes) and try again, or use a fresh UTXO as the funding source.`\n );\n }\n }\n\n // Get output satoshis for reporting\n const outputSatoshis = txInfo.vout[vout].value != null\n ? Math.round(txInfo.vout[vout].value * 1e8)\n : undefined;\n\n // Import into wallet\n const wallet = await BSVAgentWallet.load({ network: NETWORK, storageDir: WALLET_DIR });\n const identityKey = await wallet.getIdentityKey();\n\n try {\n await wallet._setup.wallet.storage.internalizeAction({\n tx: Array.from(atomicBeefBytes),\n outputs: [{\n outputIndex: vout,\n protocol: 'wallet payment',\n paymentRemittance: {\n derivationPrefix: sdk.Utils.toBase64(sdk.Utils.toArray('import', 'utf8')),\n derivationSuffix: sdk.Utils.toBase64(sdk.Utils.toArray('now', 'utf8')),\n senderIdentityKey: identityKey,\n },\n }],\n description: 'External funding import',\n });\n\n const balance = await wallet.getBalance();\n await wallet.destroy();\n\n const explorerBase = getExplorerBaseUrl();\n return ok({\n txid,\n vout,\n satoshis: outputSatoshis,\n blockHeight: blockHeight || null,\n confirmations: txInfo.confirmations || 0,\n imported: true,\n unconfirmed: !isConfirmed,\n balance,\n explorer: `${explorerBase}/tx/${txid}`,\n });\n } catch (err: any) {\n await wallet.destroy();\n \n // Provide helpful error messages for common issues\n if (err.message?.includes('already') || err.message?.includes('duplicate')) {\n return fail(`UTXO ${txid}:${vout} appears to already be imported.`);\n }\n if (err.message?.includes('script') || err.message?.includes('locking')) {\n return fail(`UTXO ${txid}:${vout} does not belong to this wallet's address. Make sure you sent to the correct address.`);\n }\n \n return fail(`Failed to import UTXO: ${err.message}`);\n }\n}\n\n/**\n * Refund command: sweep wallet to an address.\n */\nexport async function cmdRefund(targetAddress: string | undefined): Promise<void> {\n if (!targetAddress) {\n return fail('Usage: refund <address>');\n }\n\n if (!fs.existsSync(PATHS.walletIdentity)) {\n return fail('Wallet not initialized. Run: setup');\n }\n\n // TODO IMPLEMENT THIS\n}\n", "/**\n * File-based storage helpers for registration, services, and queues.\n */\n\nimport fs from 'node:fs';\nimport { OVERLAY_STATE_DIR, PATHS } from '../config.js';\nimport type { Registration, ServiceAdvertisement, XVerification, StoredChange } from '../types.js';\n\n/**\n * Ensure the overlay state directory exists.\n */\nexport function ensureStateDir(): void {\n fs.mkdirSync(OVERLAY_STATE_DIR, { recursive: true });\n}\n\n/**\n * Load registration data from disk.\n */\nexport function loadRegistration(): Registration | null {\n try {\n if (fs.existsSync(PATHS.registration)) {\n return JSON.parse(fs.readFileSync(PATHS.registration, 'utf-8'));\n }\n } catch {\n // Ignore parse errors\n }\n return null;\n}\n\n/**\n * Save registration data to disk.\n */\nexport function saveRegistration(data: Registration): void {\n ensureStateDir();\n fs.writeFileSync(PATHS.registration, JSON.stringify(data, null, 2), 'utf-8');\n}\n\n/**\n * Delete registration file.\n */\nexport function deleteRegistration(): void {\n try {\n fs.unlinkSync(PATHS.registration);\n } catch {\n // Ignore if file doesn't exist\n }\n}\n\n/**\n * Load services list from disk.\n */\nexport function loadServices(): ServiceAdvertisement[] {\n try {\n if (fs.existsSync(PATHS.services)) {\n return JSON.parse(fs.readFileSync(PATHS.services, 'utf-8'));\n }\n } catch {\n // Ignore parse errors\n }\n return [];\n}\n\n/**\n * Save services list to disk.\n */\nexport function saveServices(services: ServiceAdvertisement[]): void {\n ensureStateDir();\n fs.writeFileSync(PATHS.services, JSON.stringify(services, null, 2), 'utf-8');\n}\n\n/**\n * Load X verifications from disk.\n */\nexport function loadXVerifications(): XVerification[] {\n try {\n if (fs.existsSync(PATHS.xVerifications)) {\n return JSON.parse(fs.readFileSync(PATHS.xVerifications, 'utf-8'));\n }\n } catch {\n // Ignore parse errors\n }\n return [];\n}\n\n/**\n * Save X verifications to disk.\n */\nexport function saveXVerifications(verifications: XVerification[]): void {\n ensureStateDir();\n fs.writeFileSync(PATHS.xVerifications, JSON.stringify(verifications, null, 2), 'utf-8');\n}\n\n/**\n * Append a line to a JSONL file.\n */\nexport function appendToJsonl(filePath: string, entry: Record<string, unknown>): void {\n ensureStateDir();\n fs.appendFileSync(filePath, JSON.stringify(entry) + '\\n');\n}\n\n/**\n * Read and parse a JSONL file.\n */\nexport function readJsonl<T>(filePath: string): T[] {\n if (!fs.existsSync(filePath)) return [];\n const lines = fs.readFileSync(filePath, 'utf-8').trim().split('\\n').filter(Boolean);\n return lines.map((line: string) => {\n try {\n return JSON.parse(line);\n } catch {\n return null;\n }\n }).filter(Boolean) as T[];\n}\n\n/**\n * Load stored change BEEF data.\n */\nexport function loadStoredChange(): StoredChange | null {\n try {\n if (fs.existsSync(PATHS.latestChange)) {\n return JSON.parse(fs.readFileSync(PATHS.latestChange, 'utf-8'));\n }\n } catch {\n // Ignore parse errors\n }\n return null;\n}\n\n/**\n * Save stored change BEEF data.\n */\nexport function saveStoredChange(data: StoredChange): void {\n ensureStateDir();\n fs.writeFileSync(PATHS.latestChange, JSON.stringify(data));\n}\n\n/**\n * Delete stored change file.\n */\nexport function deleteStoredChange(): void {\n try {\n fs.unlinkSync(PATHS.latestChange);\n } catch {\n // Ignore if file doesn't exist\n }\n}\n\n/**\n * Clean up old entries from service queue.\n * Removes entries older than maxAgeMs or entries with final statuses older than finalStatusMaxAgeMs.\n */\nexport function cleanupServiceQueue(maxAgeMs: number = 24 * 60 * 60 * 1000, finalStatusMaxAgeMs: number = 2 * 60 * 60 * 1000): void {\n if (!fs.existsSync(PATHS.serviceQueue)) return;\n\n const now = Date.now();\n const finalStatuses = ['fulfilled', 'rejected', 'delivery_failed', 'failed', 'error'];\n\n const lines = fs.readFileSync(PATHS.serviceQueue, 'utf-8').trim().split('\\n').filter(Boolean);\n const keptLines: string[] = [];\n let removedCount = 0;\n\n for (const line of lines) {\n try {\n const entry = JSON.parse(line);\n const entryAge = now - (entry._ts || 0);\n\n // Always keep pending entries that aren't too old\n if (entry.status === 'pending' && entryAge < maxAgeMs) {\n keptLines.push(line);\n continue;\n }\n\n // Keep final status entries only if they're recent\n if (finalStatuses.includes(entry.status) && entryAge < finalStatusMaxAgeMs) {\n keptLines.push(line);\n continue;\n }\n\n // Remove this entry\n removedCount++;\n } catch {\n // Keep malformed entries to avoid data loss\n keptLines.push(line);\n }\n }\n\n if (removedCount > 0) {\n fs.writeFileSync(PATHS.serviceQueue, keptLines.join('\\n') + (keptLines.length ? '\\n' : ''));\n console.error(JSON.stringify({ event: 'queue-cleanup', removed: removedCount, kept: keptLines.length }));\n }\n}\n\n/**\n * Atomically update a service queue entry status.\n * Returns true if the entry was found and updated, false otherwise.\n */\nexport function updateServiceQueueStatus(\n requestId: string,\n newStatus: string,\n additionalFields: Record<string, any> = {}\n): boolean {\n if (!fs.existsSync(PATHS.serviceQueue)) return false;\n\n const lines = fs.readFileSync(PATHS.serviceQueue, 'utf-8').trim().split('\\n').filter(Boolean);\n let updated = false;\n\n const updatedLines = lines.map(line => {\n try {\n const entry = JSON.parse(line);\n if (entry.requestId === requestId) {\n updated = true;\n return JSON.stringify({\n ...entry,\n status: newStatus,\n ...additionalFields,\n updatedAt: Date.now()\n });\n }\n return line;\n } catch {\n return line;\n }\n });\n\n if (updated) {\n fs.writeFileSync(PATHS.serviceQueue, updatedLines.join('\\n') + '\\n');\n }\n\n return updated;\n}\n", "/**\n * Overlay transaction building utilities.\n * \n * Follows the openclaw-overlay server API:\n * - Submit: POST /submit with binary BEEF and X-Topics header\n * - OP_RETURN format: OP_FALSE OP_RETURN <\"clawdbot-overlay-v1\"> <JSON>\n */\n\nimport { NETWORK, OVERLAY_URL, PROTOCOL_ID, WALLET_DIR } from '../config.js';\nimport type { OverlayPayload } from '../types.js';\nimport { Utils, PushDrop, Transaction } from '@bsv/sdk';\nimport { BSVAgentWallet } from 'openclaw-plugin-core';\n\n/**\n * Build an PushDrop locking script with JSON payload using SDK's Script class.\n * \n * @param payload - The data to embed in the OP_RETURN\n * @returns A proper Script object that the SDK can serialize\n */\nexport async function buildPushDropScript(wallet: BSVAgentWallet, payload: OverlayPayload): Promise<string> {\n const jsonBytes = Utils.toArray(JSON.stringify(payload), 'utf8')\n const fields: number[][] = [jsonBytes]\n const token = new PushDrop(wallet._setup.wallet);\n const script = await token.lock(fields, [0, PROTOCOL_ID], '1', 'self', true, true)\n return script.toHex();\n}\n\n/**\n * Build and submit an overlay transaction.\n * @param payload - JSON data to store in OP_RETURN\n * @param topic - Topic manager for submission\n * @returns Transaction result with txid and funding info\n */\nexport async function buildRealOverlayTransaction(\n payload: OverlayPayload,\n topic: string\n): Promise<{ txid: string; funded: string; explorer: string }> {\n \n const wallet = await BSVAgentWallet.load({ network: NETWORK, storageDir: WALLET_DIR })\n const lockingScript = await buildPushDropScript(wallet, payload)\n\n const response = await wallet._setup.wallet.createAction({\n description: 'topic manager submission',\n outputs: [\n {\n lockingScript,\n satoshis: 1,\n outputDescription: 'overlay',\n basket: topic, // basket is the topic manager\n }\n ],\n options: {\n acceptDelayedBroadcast: false,\n }\n })\n\n // --- Submit to overlay ---\n // Use binary BEEF with X-Topics header (matches openclaw-overlay server API)\n const submitResp = await fetch(`${OVERLAY_URL}/submit`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/octet-stream',\n 'X-Topics': JSON.stringify([topic]),\n },\n body: new Uint8Array(response.tx as number[]),\n });\n\n if (!submitResp.ok) {\n const errText = await submitResp.text();\n throw new Error(`Overlay submission failed: ${submitResp.status} \u2014 ${errText}`);\n }\n\n const wocNet = NETWORK === 'mainnet' ? '' : 'test.';\n return {\n txid: response.txid as string,\n funded: 'stored-beef',\n explorer: `https://${wocNet}whatsonchain.com/tx/${response.txid as string}`,\n };\n}\n\n/**\n * Lookup data from an overlay lookup service.\n */\nexport async function lookupOverlay(\n service: string,\n query: Record<string, unknown>\n): Promise<any> {\n const resp = await fetch(`${OVERLAY_URL}/lookup`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ service, query }),\n });\n\n if (!resp.ok) {\n const errText = await resp.text();\n throw new Error(`Lookup failed: ${resp.status} \u2014 ${errText}`);\n }\n\n return resp.json();\n}\n\n/**\n * Parse an overlay output from BEEF data.\n * \n * Handles both formats:\n * - OP_FALSE OP_RETURN <protocol> <json> (standard)\n * - OP_RETURN <protocol> <json> (legacy)\n */\nexport async function parseOverlayOutput(\n beefData: string | Uint8Array | number[],\n outputIndex: number\n): Promise<{ data: OverlayPayload | null; txid: string | null }> {\n try {\n const tx = Transaction.fromBEEF(beefData as number[]);\n const txid = tx.id('hex')\n const output = tx.outputs[outputIndex];\n if (!output) return { data: null, txid: null };\n\n const { fields } = PushDrop.decode(output.lockingScript);\n return { data: JSON.parse(Utils.toUTF8(fields[0])), txid };\n } catch {\n return { data: null, txid: null };\n }\n}\n", "/**\n * Overlay registration commands: register, unregister.\n * \n * Registration creates an identity record on the overlay network with:\n * - identityKey: compressed public key (66 hex chars)\n * - name: agent display name\n * - description: what the agent does\n * - channels: contact methods (e.g., { overlay: \"https://...\" })\n * - capabilities: what the agent can do (e.g., [\"services\", \"jokes\"])\n * - timestamp: ISO 8601 registration time\n */\n\nimport fs from 'node:fs';\nimport { NETWORK, WALLET_DIR, OVERLAY_URL, PROTOCOL_ID, TOPICS, PATHS, AGENT_NAME, AGENT_DESCRIPTION } from '../config.js';\nimport { ok, fail } from '../output.js';\nimport { loadRegistration, saveRegistration, deleteRegistration, loadServices } from '../utils/storage.js';\nimport { buildRealOverlayTransaction } from './transaction.js';\nimport { Transaction, Beef, Script, PushDrop, WalletOutput } from '@bsv/sdk'\n\nimport { BSVAgentWallet } from 'openclaw-plugin-core';\n\nasync function getBSVAgentWallet(): Promise<typeof BSVAgentWallet> {\n return BSVAgentWallet;\n}\n\n/**\n * Register command: register this agent on the overlay network.\n */\nexport async function cmdRegister(): Promise<any> {\n if (!fs.existsSync(PATHS.walletIdentity)) {\n return fail('Wallet not initialized. Run: setup');\n }\n\n const BSVAgentWallet = await getBSVAgentWallet();\n const wallet = await BSVAgentWallet.load({ network: NETWORK, storageDir: WALLET_DIR });\n const identityKey = await wallet.getIdentityKey();\n await wallet.destroy();\n\n const existingReg = loadRegistration();\n if (existingReg && existingReg.identityKey === identityKey) {\n return ok({\n alreadyRegistered: true,\n identityKey,\n identityTxid: existingReg.identityTxid,\n overlayUrl: OVERLAY_URL,\n });\n }\n\n // Agent metadata from environment/config\n const agentName = AGENT_NAME;\n const agentDescription = AGENT_DESCRIPTION;\n\n // Build capabilities list based on what services we might offer\n const capabilities: string[] = ['services'];\n const services = loadServices();\n if (services.some(s => s.serviceId === 'tell-joke')) {\n capabilities.push('jokes');\n }\n\n // Create identity record on-chain\n // This payload format matches the openclaw-overlay server's expected schema\n const identityPayload = {\n protocol: PROTOCOL_ID,\n type: 'identity' as const,\n identityKey,\n name: agentName,\n description: agentDescription,\n channels: {\n overlay: OVERLAY_URL,\n },\n capabilities,\n timestamp: new Date().toISOString(),\n };\n\n let identityResult: { txid: string; funded: string };\n try {\n identityResult = await buildRealOverlayTransaction(identityPayload, TOPICS.IDENTITY);\n } catch (err: any) {\n return fail(`Registration failed: ${err.message}`);\n }\n\n // Optionally register services if pre-configured\n let serviceTxid: string | null = null;\n\n if (services.length > 0) {\n // Register each service individually (server expects 'service' type, not 'service-bundle')\n for (const service of services) {\n const servicePayload = {\n protocol: PROTOCOL_ID,\n type: 'service' as const,\n identityKey,\n serviceId: service.serviceId,\n name: service.name,\n description: service.description,\n pricing: {\n model: 'per-task',\n amountSats: service.priceSats,\n },\n timestamp: new Date().toISOString(),\n };\n\n try {\n const serviceResult = await buildRealOverlayTransaction(servicePayload, TOPICS.SERVICES);\n serviceTxid = serviceResult.txid; // Keep last one for backward compat\n } catch {\n // Non-fatal \u2014 identity registered but this service failed\n }\n }\n }\n\n // Save registration\n const registration = {\n identityKey,\n agentName,\n agentDescription,\n overlayUrl: OVERLAY_URL,\n identityTxid: identityResult.txid,\n serviceTxid,\n funded: identityResult.funded,\n registeredAt: new Date().toISOString(),\n };\n saveRegistration(registration);\n\n return ok({\n registered: true,\n identityKey,\n identityTxid: identityResult.txid,\n serviceTxid,\n overlayUrl: OVERLAY_URL,\n funded: identityResult.funded,\n stateFile: PATHS.registration,\n });\n}\n\n/**\n * Unregister command: submit revocation tx to remove agent from overlay network.\n */\nexport async function cmdUnregister(): Promise<any> {\n \n const wallet = await BSVAgentWallet.load({ network: NETWORK, storageDir: WALLET_DIR });\n const { outputs, BEEF } = await wallet._setup.wallet.listOutputs({ basket: TOPICS.IDENTITY, include: 'entire transactions' });\n\n const token = new PushDrop(wallet._setup.wallet);\n const unlockingScriptTemplate = await token.unlock([0, PROTOCOL_ID], '1', 'self', 'none', true)\n const tempTx = new Transaction()\n const beef = Beef.fromBinary(BEEF as number[])\n outputs.forEach((o: WalletOutput) => {\n const [txid, v] = o.outpoint.split('.')\n const sourceOutputIndex = Number(v)\n const sourceTransaction = beef.findTransactionForSigning(txid)\n tempTx.addInput({\n unlockingScriptTemplate,\n sourceOutputIndex,\n sourceTransaction\n })\n })\n tempTx.addOutput({\n lockingScript: Script.fromASM('OP_FALSE OP_RETURN 330123'),\n satoshis: 0\n })\n\n await tempTx.sign()\n\n const response = await wallet._setup.wallet.createAction({\n inputBEEF: BEEF,\n description: 'revoke registration token',\n inputs: tempTx.inputs.map(o => ({\n inputDescription: 'previous registration',\n outpoint: o.sourceTXID + '.' + String(o.sourceOutputIndex),\n unlockingScript: o.unlockingScript?.toHex() as string\n }))\n })\n\n const txid = response.txid as string;\n\n // --- Submit to overlay ---\n // Use binary BEEF with X-Topics header (matches openclaw-overlay server API)\n const submitResp = await fetch(`${OVERLAY_URL}/submit`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/octet-stream',\n 'X-Topics': JSON.stringify([TOPICS.IDENTITY]),\n },\n body: new Uint8Array(response.tx as number[]),\n });\n\n if (!submitResp.ok) {\n const errText = await submitResp.text();\n throw new Error(`Overlay submission failed: ${submitResp.status} \u2014 ${errText}`);\n }\n \n // Delete local registration\n deleteRegistration();\n\n return ok({\n unregistered: true,\n txid\n });\n}\n", "/**\n * Overlay service commands: services, advertise, remove, readvertise.\n * \n * Service payloads match the openclaw-overlay server schema:\n * - protocol: \"clawdbot-overlay-v1\"\n * - type: \"service\"\n * - identityKey: provider's compressed public key\n * - serviceId: unique service identifier\n * - name: human-readable name\n * - description: what the service does\n * - pricing: { model: \"per-task\", amountSats: number }\n * - timestamp: ISO 8601 time\n */\n\nimport { NETWORK, WALLET_DIR, PROTOCOL_ID, TOPICS } from '../config.js';\nimport { ok, fail } from '../output.js';\nimport { loadServices, saveServices } from '../utils/storage.js';\nimport { buildRealOverlayTransaction } from './transaction.js';\nimport type { ServiceAdvertisement } from '../types.js';\n\nimport { BSVAgentWallet } from 'openclaw-plugin-core';\n\nasync function getBSVAgentWallet(): Promise<typeof BSVAgentWallet> {\n return BSVAgentWallet;\n}\n\n/**\n * Services command: list currently advertised services.\n */\nexport async function cmdServices(): Promise<any> {\n const services = loadServices();\n return ok({ services, count: services.length });\n}\n\n/**\n * Advertise command: add a new service advertisement.\n */\nexport async function cmdAdvertise(\n serviceId: string | undefined,\n name: string | undefined,\n priceSatsStr: string | undefined,\n description?: string\n): Promise<any> {\n if (!serviceId || !name || !priceSatsStr) {\n return fail('Usage: advertise <serviceId> <name> <priceSats> [description]');\n }\n\n const priceSats = parseInt(priceSatsStr, 10);\n if (isNaN(priceSats) || priceSats < 0) {\n return fail('priceSats must be a non-negative integer');\n }\n\n const BSVAgentWallet = await getBSVAgentWallet();\n const wallet = await BSVAgentWallet.load({ network: NETWORK, storageDir: WALLET_DIR });\n const identityKey = await wallet.getIdentityKey();\n await wallet.destroy();\n\n // Load existing services\n const services = loadServices();\n const existing = services.find(s => s.serviceId === serviceId);\n if (existing) {\n return fail(`Service '${serviceId}' already exists. Use 'readvertise' to update.`);\n }\n\n // Create service record (local storage format)\n const newService: ServiceAdvertisement = {\n serviceId,\n name,\n description: description || `${name} service`,\n priceSats,\n registeredAt: new Date().toISOString(),\n };\n\n // Publish on-chain (matches openclaw-overlay server schema)\n const servicePayload = {\n protocol: PROTOCOL_ID,\n type: 'service' as const,\n identityKey,\n serviceId,\n name,\n description: newService.description,\n pricing: {\n model: 'per-task',\n amountSats: priceSats,\n },\n timestamp: new Date().toISOString(),\n };\n\n try {\n const result = await buildRealOverlayTransaction(servicePayload, TOPICS.SERVICES);\n newService.txid = result.txid;\n\n // Save locally\n services.push(newService);\n saveServices(services);\n\n return ok({\n advertised: true,\n service: newService,\n txid: result.txid,\n funded: result.funded,\n });\n } catch (err: any) {\n return fail(`Failed to advertise service: ${err.message}`);\n }\n}\n\n/**\n * Remove command: remove a service from local registry.\n */\nexport async function cmdRemove(serviceId: string | undefined): Promise<any> {\n if (!serviceId) {\n return fail('Usage: remove <serviceId>');\n }\n\n const services = loadServices();\n const idx = services.findIndex(s => s.serviceId === serviceId);\n if (idx === -1) {\n return fail(`Service '${serviceId}' not found`);\n }\n\n const removed = services.splice(idx, 1)[0];\n saveServices(services);\n\n return ok({\n removed: true,\n service: removed,\n note: 'Removed from local registry. On-chain record remains (blockchain is immutable).',\n });\n}\n\n/**\n * Readvertise command: update an existing service advertisement.\n */\nexport async function cmdReadvertise(\n serviceId: string | undefined,\n name?: string,\n priceSatsStr?: string,\n description?: string\n): Promise<any> {\n if (!serviceId) {\n return fail('Usage: readvertise <serviceId> [name] [priceSats] [description]');\n }\n\n const services = loadServices();\n const existing = services.find(s => s.serviceId === serviceId);\n if (!existing) {\n return fail(`Service '${serviceId}' not found. Use 'advertise' to create.`);\n }\n\n const BSVAgentWallet = await getBSVAgentWallet();\n const wallet = await BSVAgentWallet.load({ network: NETWORK, storageDir: WALLET_DIR });\n const identityKey = await wallet.getIdentityKey();\n await wallet.destroy();\n\n // Update fields if provided\n if (name) existing.name = name;\n if (priceSatsStr) {\n const priceSats = parseInt(priceSatsStr, 10);\n if (isNaN(priceSats) || priceSats < 0) {\n return fail('priceSats must be a non-negative integer');\n }\n existing.priceSats = priceSats;\n }\n if (description) existing.description = description;\n existing.registeredAt = new Date().toISOString();\n\n // Publish update on-chain (matches openclaw-overlay server schema)\n const servicePayload = {\n protocol: PROTOCOL_ID,\n type: 'service' as const,\n identityKey,\n serviceId,\n name: existing.name,\n description: existing.description,\n pricing: {\n model: 'per-task',\n amountSats: existing.priceSats,\n },\n timestamp: existing.registeredAt,\n };\n\n try {\n const result = await buildRealOverlayTransaction(servicePayload, TOPICS.SERVICES);\n existing.txid = result.txid;\n\n // Save locally\n saveServices(services);\n\n return ok({\n readvertised: true,\n service: existing,\n txid: result.txid,\n funded: result.funded,\n });\n } catch (err: any) {\n return fail(`Failed to readvertise service: ${err.message}`);\n }\n}\n", "/**\n * Overlay discovery commands.\n */\n\nimport { OVERLAY_URL, LOOKUP_SERVICES } from '../config.js';\nimport { ok } from '../output.js';\nimport { lookupOverlay, parseOverlayOutput } from './transaction.js';\n\n/**\n * Discover command: query the overlay for agents and services.\n */\nexport async function cmdDiscover(args: string[]): Promise<any> {\n\n // Parse flags\n let serviceFilter: string | null = null;\n let agentFilter: string | null = null;\n\n for (let i = 0; i < args.length; i++) {\n if (args[i] === '--service' && args[i + 1]) serviceFilter = args[++i];\n else if (args[i] === '--agent' && args[i + 1]) agentFilter = args[++i];\n }\n\n const results: {\n agents: any[];\n services: any[];\n agentError?: string;\n serviceError?: string;\n } = { agents: [], services: [] };\n\n // Query agents\n if (!serviceFilter) {\n try {\n const agentQuery = agentFilter ? { name: agentFilter } : { type: 'list' };\n const agentResult = await lookupOverlay(LOOKUP_SERVICES.AGENTS, agentQuery);\n\n if (agentResult.outputs) {\n for (const output of agentResult.outputs) {\n try {\n const { data, txid } = await parseOverlayOutput(output.beef, output.outputIndex);\n if (data?.type === 'identity') {\n // Handle both 'name' and 'agentName' for backward compatibility\n const name = data.name || data.agentName || 'Unknown Agent';\n results.agents.push({ ...data, name, txid });\n }\n } catch { /* ignore */ }\n }\n }\n } catch (err: any) {\n results.agentError = String(err);\n }\n }\n\n // Query services\n if (!agentFilter) {\n try {\n const serviceQuery = serviceFilter ? { serviceType: serviceFilter } : {};\n const serviceResult = await lookupOverlay(LOOKUP_SERVICES.SERVICES, serviceQuery);\n\n if (serviceResult.outputs) {\n for (const output of serviceResult.outputs) {\n try {\n const { data, txid } = await parseOverlayOutput(output.beef, output.outputIndex);\n if (data?.type === 'service') {\n results.services.push({ ...data, txid });\n }\n } catch { /* ignore */ }\n }\n }\n } catch (err: any) {\n results.serviceError = String(err);\n }\n }\n\n return ok({\n overlayUrl: OVERLAY_URL,\n agentCount: results.agents.length,\n serviceCount: results.services.length,\n agents: results.agents,\n services: results.services,\n ...(results.agentError && { agentError: results.agentError }),\n ...(results.serviceError && { serviceError: results.serviceError }),\n });\n}\n", "/**\n * SHIP and SLAP advertisement commands.\n * \n * SHIP: Service Health & Information Protocol (tm_ship)\n * SLAP: Service Level Agreement Protocol (tm_slap)\n */\n\nimport { PushDrop, Utils } from '@bsv/sdk';\nimport { NETWORK, WALLET_DIR, TOPICS, DEFAULT_SLAP_TRACKERS } from '../config.js';\nimport { BSVAgentWallet } from 'openclaw-plugin-core';\nimport { ok, fail } from '../output.js';\n\n/**\n * Advertise a SHIP record.\n * Announce that you host a specific Topic Manager (tm_).\n */\nexport async function cmdAdvertiseSHIP(domain?: string, topic?: string): Promise<any> {\n if (!domain || !topic) {\n return fail('Usage: advertise-ship <domain> <topic>');\n }\n\n if (!topic.startsWith('tm_')) {\n return fail('Topic must start with \"tm_\"');\n }\n\n try {\n const wallet = await BSVAgentWallet.load({ network: NETWORK, storageDir: WALLET_DIR });\n const token = new PushDrop(wallet._setup.wallet);\n \n // SHIP format: Payload is the domain hosting the topic\n const fields = [Utils.toArray(domain, 'utf8')];\n // Context is [0, topic] to identify the topic manager being advertised\n const lockingScript = (await token.lock(fields, [0, topic], '1', 'self', true, true)).toHex();\n\n const response = await wallet._setup.wallet.createAction({\n description: `advertise SHIP for ${topic}`,\n outputs: [{\n lockingScript,\n satoshis: 1,\n outputDescription: 'SHIP advertisement',\n basket: TOPICS.SHIP\n }]\n });\n\n // Broadcast to primary overlay and SLAP trackers\n const trackers = [\n ...DEFAULT_SLAP_TRACKERS[NETWORK]\n ];\n\n const results = await broadcastToTrackers(response.tx as number[], [TOPICS.SHIP, topic], trackers);\n\n return ok({\n advertised: 'SHIP',\n topic,\n domain,\n txid: response.txid,\n broadcasts: results\n });\n } catch (err: any) {\n return fail(`SHIP advertisement failed: ${err.message}`);\n }\n}\n\n/**\n * Advertise a SLAP record.\n * Announce that you host a specific Lookup Service (ls_).\n */\nexport async function cmdAdvertiseSLAP(domain?: string, service?: string): Promise<any> {\n if (!domain || !service) {\n return fail('Usage: advertise-slap <domain> <service>');\n }\n\n if (!service.startsWith('ls_')) {\n return fail('Service must start with \"ls_\"');\n }\n\n try {\n const wallet = await BSVAgentWallet.load({ network: NETWORK, storageDir: WALLET_DIR });\n const token = new PushDrop(wallet._setup.wallet);\n \n // SLAP format: Payload is the domain hosting the lookup service\n const fields = [Utils.toArray(domain, 'utf8')];\n // Context is [0, service] to identify the lookup service being advertised\n const lockingScript = (await token.lock(fields, [0, service], '1', 'self', true, true)).toHex();\n\n const response = await wallet._setup.wallet.createAction({\n description: `advertise SLAP for ${service}`,\n outputs: [{\n lockingScript,\n satoshis: 1,\n outputDescription: 'SLAP advertisement',\n basket: TOPICS.SLAP\n }]\n });\n\n // Broadcast to primary overlay and SLAP trackers\n const trackers = [\n ...DEFAULT_SLAP_TRACKERS[NETWORK]\n ];\n\n const results = await broadcastToTrackers(response.tx as number[], [TOPICS.SLAP, service], trackers);\n\n return ok({\n advertised: 'SLAP',\n service,\n domain,\n txid: response.txid,\n broadcasts: results\n });\n } catch (err: any) {\n return fail(`SLAP advertisement failed: ${err.message}`);\n }\n}\n\n/**\n * Helper to broadcast BEEF to multiple trackers/overlays.\n */\nasync function broadcastToTrackers(tx: number[], topics: string[], trackers: string[]) {\n const results: Record<string, any> = {};\n const body = new Uint8Array(tx);\n\n for (const url of trackers) {\n try {\n const resp = await fetch(`${url.replace(/\\/$/, '')}/submit`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/octet-stream',\n 'X-Topics': JSON.stringify(topics)\n },\n body\n });\n results[url] = resp.ok ? 'success' : `error: ${resp.status}`;\n } catch (err: any) {\n results[url] = `failed: ${err.message}`;\n }\n }\n return results;\n}\n", "/**\n * Payment building using a2a-bsv wallet.createPayment().\n *\n * This replaces the old buildDirectPayment() which used plain P2PKH scripts\n * and manual UTXO management. The new implementation:\n * - Uses proper BRC-29 locking scripts via wallet.createPayment()\n * - Relies on wallet's createAction() for UTXO management\n * - Uses noSend: true (recipient broadcasts via acceptPayment())\n */\n\nimport { NETWORK, WALLET_DIR } from '../config.js';\nimport type { PaymentResult } from './types.js';\n\nimport { BSVAgentWallet } from 'openclaw-plugin-core';\n\nasync function getBSVAgentWallet(): Promise<typeof BSVAgentWallet> {\n return BSVAgentWallet;\n}\n\n/**\n * Build a BRC-29 payment using the a2a-bsv wallet.\n *\n * This creates a payment transaction using proper BRC-29 locking scripts.\n * The transaction uses noSend: true, meaning:\n * - The sender does NOT broadcast the transaction\n * - The recipient broadcasts it when they call acceptPayment()\n *\n * @param recipientPubKey - Recipient's compressed public key (66 hex chars, 02/03 prefix)\n * @param sats - Amount to send in satoshis\n * @param desc - Optional description for the payment\n * @returns PaymentResult with BEEF and derivation metadata for the recipient\n */\nexport async function buildDirectPayment(\n recipientPubKey: string,\n sats: number,\n desc?: string\n): Promise<PaymentResult> {\n // Validate recipient pubkey format\n if (!/^0[23][0-9a-fA-F]{64}$/.test(recipientPubKey)) {\n throw new Error('Recipient must be a compressed public key (66 hex chars starting with 02 or 03)');\n }\n\n const BSVAgentWallet = await getBSVAgentWallet();\n const wallet = await BSVAgentWallet.load({ network: NETWORK, storageDir: WALLET_DIR });\n\n try {\n const result = await wallet.createPayment({\n to: recipientPubKey,\n satoshis: sats,\n description: desc || 'agent payment',\n });\n\n // Return format compatible with existing code\n return {\n beef: result.beef,\n txid: result.txid,\n satoshis: result.satoshis,\n derivationPrefix: result.derivationPrefix,\n derivationSuffix: result.derivationSuffix,\n senderIdentityKey: result.senderIdentityKey,\n };\n } finally {\n await wallet.destroy();\n }\n}\n", "/**\n * Payment CLI commands: pay, verify, accept.\n */\n\nimport { NETWORK, WALLET_DIR } from '../config.js';\nimport { ok, fail } from '../output.js';\nimport { buildDirectPayment } from './build.js';\n\nimport { BSVAgentWallet } from 'openclaw-plugin-core';\n\nasync function getBSVAgentWallet(): Promise<typeof BSVAgentWallet> {\n return BSVAgentWallet;\n}\n\n/**\n * Pay command: send satoshis to another agent.\n */\nexport async function cmdPay(\n pubkey: string | undefined,\n satoshis: string | undefined,\n description?: string\n): Promise<any> {\n if (!pubkey || !satoshis) {\n return fail('Usage: pay <pubkey> <satoshis> [description]');\n }\n\n const sats = parseInt(satoshis, 10);\n if (isNaN(sats) || sats <= 0) {\n return fail('satoshis must be a positive integer');\n }\n\n try {\n const payment = await buildDirectPayment(pubkey, sats, description || 'agent payment');\n return ok(payment);\n } catch (err) {\n return fail(err instanceof Error ? err.message : String(err));\n }\n}\n\n/**\n * Verify command: verify an incoming payment BEEF.\n */\nexport async function cmdVerify(beefBase64: string | undefined): Promise<any> {\n if (!beefBase64) {\n return fail('Usage: verify <beef_base64>');\n }\n\n const BSVAgentWallet = await getBSVAgentWallet();\n const wallet = await BSVAgentWallet.load({ network: NETWORK, storageDir: WALLET_DIR });\n\n try {\n const result = wallet.verifyPayment({ beef: beefBase64 });\n await wallet.destroy();\n return ok(result);\n } catch (err) {\n await wallet.destroy();\n return fail(err instanceof Error ? err.message : String(err));\n }\n}\n\n/**\n * Accept command: accept and internalize a payment.\n */\nexport async function cmdAccept(\n beef: string | undefined,\n derivationPrefix: string | undefined,\n derivationSuffix: string | undefined,\n senderIdentityKey: string | undefined,\n description?: string\n): Promise<any> {\n if (!beef || !derivationPrefix || !derivationSuffix || !senderIdentityKey) {\n return fail('Usage: accept <beef> <prefix> <suffix> <senderKey> [description]');\n }\n\n const BSVAgentWallet = await getBSVAgentWallet();\n const wallet = await BSVAgentWallet.load({ network: NETWORK, storageDir: WALLET_DIR });\n\n try {\n const receipt = await wallet.acceptPayment({\n beef,\n derivationPrefix,\n derivationSuffix,\n senderIdentityKey,\n description: description || undefined,\n });\n await wallet.destroy();\n return ok(receipt);\n } catch (err) {\n await wallet.destroy();\n return fail(err instanceof Error ? err.message : String(err));\n }\n}\n", "/**\n * Send relay message command.\n */\n\nimport { OVERLAY_URL } from '../config.js';\nimport { ok, fail } from '../output.js';\nimport { loadIdentity, signRelayMessage } from '../wallet/identity.js';\n\n/**\n * Send command: send a typed message to another agent.\n */\nexport async function cmdSend(\n targetKey: string | undefined,\n type: string | undefined,\n payloadStr: string | undefined\n): Promise<any> {\n if (!targetKey || !type || !payloadStr) {\n return fail('Usage: send <identityKey> <type> <json_payload>');\n }\n\n if (!/^0[23][0-9a-fA-F]{64}$/.test(targetKey)) {\n return fail('Target must be a compressed public key (66 hex chars, 02/03 prefix)');\n }\n\n let payload: unknown;\n try {\n payload = JSON.parse(payloadStr);\n } catch {\n return fail('payload must be valid JSON');\n }\n\n const { identityKey, privKey } = await loadIdentity();\n const signature = await signRelayMessage(privKey, targetKey, type, payload);\n\n const resp = await fetch(`${OVERLAY_URL}/relay/send`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n from: identityKey,\n to: targetKey,\n type,\n payload,\n signature,\n }),\n });\n\n if (!resp.ok) {\n const body = await resp.text();\n return fail(`Relay send failed (${resp.status}): ${body}`);\n }\n\n const result = await resp.json();\n return ok({ sent: true, messageId: result.id, to: targetKey, type, signed: true });\n}\n", "/**\n * Inbox and ack commands.\n */\n\nimport { OVERLAY_URL } from '../config.js';\nimport { ok, fail } from '../output.js';\nimport { loadIdentity, verifyRelaySignature } from '../wallet/identity.js';\n\n/**\n * Inbox command: fetch pending messages.\n */\nexport async function cmdInbox(args: string[]): Promise<any> {\n const { identityKey } = await loadIdentity();\n\n let since = '';\n for (let i = 0; i < args.length; i++) {\n if (args[i] === '--since' && args[i + 1]) since = `&since=${args[++i]}`;\n }\n\n const resp = await fetch(`${OVERLAY_URL}/relay/inbox?identity=${identityKey}${since}`);\n if (!resp.ok) {\n const body = await resp.text();\n return fail(`Relay inbox failed (${resp.status}): ${body}`);\n }\n\n const result = await resp.json();\n\n // Verify signatures on received messages\n const messages = await Promise.all(\n result.messages.map(async (msg: any) => ({\n ...msg,\n signatureValid: msg.signature\n ? (await verifyRelaySignature(msg.from, msg.to, msg.type, msg.payload, msg.signature)).valid\n : null,\n }))\n );\n\n return ok({ messages, count: messages.length, identityKey });\n}\n\n/**\n * Ack command: acknowledge processed messages.\n */\nexport async function cmdAck(messageIds: string[]): Promise<any> {\n if (!messageIds || messageIds.length === 0) {\n return fail('Usage: ack <messageId> [messageId2 ...]');\n }\n\n const { identityKey } = await loadIdentity();\n\n const resp = await fetch(`${OVERLAY_URL}/relay/ack`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ identity: identityKey, messageIds }),\n });\n\n if (!resp.ok) {\n const body = await resp.text();\n return fail(`Relay ack failed (${resp.status}): ${body}`);\n }\n\n const result = await resp.json();\n return ok({ acked: result.acked, messageIds });\n}\n", "/**\n * Service architecture type definitions.\n *\n * This module defines the core interfaces for the pluggable service system.\n * Services can be added without modifying core payment or relay logic.\n */\n\nexport interface ServiceDefinition {\n /** Unique service identifier (kebab-case) */\n id: string;\n /** Human-readable service name */\n name: string;\n /** Service description for discovery */\n description: string;\n /** Default price in satoshis */\n defaultPrice: number;\n /** Optional JSON schema for input validation */\n inputSchema?: object;\n /** Optional legacy handler for non-agent mode */\n handler?: ServiceHandler;\n /** Optional path to agent mode prompt file */\n promptFile?: string;\n /** Service category for organization */\n category?: string;\n /** Whether this service requires special permissions */\n requiresVerification?: boolean;\n}\n\nexport interface ServiceHandler {\n /**\n * Validate incoming service input.\n * @param input - Raw input from service request\n * @returns Validation result\n */\n validate(input: any): ValidationResult;\n\n /**\n * Process the service request.\n * Payment has already been verified at this point.\n * @param input - Validated input data\n * @param context - Service execution context\n * @returns Service processing result\n */\n process(input: any, context: ServiceContext): Promise<ServiceResult>;\n}\n\nexport interface ValidationResult {\n /** Whether input is valid */\n valid: boolean;\n /** Error message if invalid */\n error?: string;\n /** Sanitized/normalized input if valid */\n sanitized?: any;\n}\n\nexport interface ServiceContext {\n /** Unique request identifier */\n requestId: string;\n /** Sender's identity key */\n from: string;\n /** Service being requested */\n serviceId: string;\n /** Payment information (already verified) */\n payment: PaymentInfo;\n /** Request timestamp */\n timestamp: number;\n}\n\nexport interface PaymentInfo {\n /** Transaction ID */\n txid: string;\n /** Amount paid in satoshis */\n satoshis: number;\n /** Whether payment was accepted by wallet */\n accepted: boolean;\n /** Payment verification details */\n verification?: {\n /** BEEF transaction data */\n beef: string;\n /** Derivation prefix for BRC-29 */\n derivationPrefix?: string;\n /** Derivation suffix for BRC-29 */\n derivationSuffix?: string;\n };\n}\n\nexport interface ServiceResult {\n /** Whether service execution was successful */\n success: boolean;\n /** Service output data */\n data?: any;\n /** Error message if unsuccessful */\n error?: string;\n /** Additional metadata */\n metadata?: {\n /** Processing time in milliseconds */\n processingTime?: number;\n /** Service version */\n version?: string;\n /** Additional context */\n [key: string]: any;\n };\n}\n\nexport interface ServiceRegistry {\n /**\n * Register a new service definition.\n * @param service - Service to register\n */\n register(service: ServiceDefinition): void;\n\n /**\n * Get a service definition by ID.\n * @param serviceId - Service identifier\n * @returns Service definition or undefined\n */\n get(serviceId: string): ServiceDefinition | undefined;\n\n /**\n * List all registered services.\n * @returns Array of all service definitions\n */\n list(): ServiceDefinition[];\n\n /**\n * List services by category.\n * @param category - Service category\n * @returns Array of services in category\n */\n listByCategory(category: string): ServiceDefinition[];\n\n /**\n * Check if a service is registered.\n * @param serviceId - Service identifier\n * @returns Whether service exists\n */\n has(serviceId: string): boolean;\n\n /**\n * Unregister a service.\n * @param serviceId - Service identifier\n */\n unregister(serviceId: string): void;\n}\n\nexport interface ServiceLoader {\n /**\n * Load services from a directory.\n * @param directory - Directory path to scan\n * @returns Array of loaded service definitions\n */\n loadFromDirectory(directory: string): Promise<ServiceDefinition[]>;\n\n /**\n * Load all built-in services.\n * @returns Array of built-in service definitions\n */\n loadBuiltInServices(): Promise<ServiceDefinition[]>;\n\n /**\n * Load custom user services.\n * @returns Array of custom service definitions\n */\n loadCustomServices(): Promise<ServiceDefinition[]>;\n}\n\n/**\n * Service execution context for handlers.\n * This provides access to validated input and request context\n * without exposing payment verification or relay logic.\n */\nexport interface ServiceExecutionContext {\n /** Service definition being executed */\n service: ServiceDefinition;\n /** Validated input data */\n input: any;\n /** Request context */\n context: ServiceContext;\n}\n\n/**\n * Service plugin interface for advanced services.\n * This allows services to define additional hooks and lifecycle methods.\n */\nexport interface ServicePlugin {\n /** Service definition */\n definition: ServiceDefinition;\n\n /** Optional initialization hook */\n initialize?(): Promise<void>;\n\n /** Optional cleanup hook */\n cleanup?(): Promise<void>;\n\n /** Optional health check */\n healthCheck?(): Promise<boolean>;\n}\n\n/**\n * Service manager interface for orchestrating service lifecycle.\n */\nexport interface ServiceManager {\n /** Service registry */\n registry: ServiceRegistry;\n\n /** Service loader */\n loader: ServiceLoader;\n\n /**\n * Initialize the service system.\n */\n initialize(): Promise<void>;\n\n /**\n * Execute a service request.\n * @param serviceId - Service to execute\n * @param input - Service input\n * @param context - Execution context\n * @returns Service result\n */\n execute(serviceId: string, input: any, context: ServiceContext): Promise<ServiceResult>;\n\n /**\n * Validate service input.\n * @param serviceId - Service to validate for\n * @param input - Input to validate\n * @returns Validation result\n */\n validate(serviceId: string, input: any): ValidationResult;\n\n /**\n * Reload all services.\n */\n reload(): Promise<void>;\n}\n\n/**\n * Common service categories for organization.\n */\nexport enum ServiceCategory {\n UTILITY = 'utility',\n AI = 'ai',\n BLOCKCHAIN = 'blockchain',\n COMMUNICATION = 'communication',\n DEVELOPMENT = 'development',\n RESEARCH = 'research',\n ENTERTAINMENT = 'entertainment',\n CUSTOM = 'custom'\n}\n\n/**\n * Service status for monitoring and management.\n */\nexport enum ServiceStatus {\n ACTIVE = 'active',\n INACTIVE = 'inactive',\n ERROR = 'error',\n LOADING = 'loading'\n}", "/**\n * Service registry implementation.\n *\n * This provides a centralized registry for all services, allowing\n * dynamic registration and discovery without modifying core code.\n */\n\nimport { ServiceDefinition, ServiceRegistry, ServiceCategory } from './types.js';\n\n/**\n * Default service registry implementation.\n */\nexport class DefaultServiceRegistry implements ServiceRegistry {\n private services = new Map<string, ServiceDefinition>();\n\n /**\n * Register a new service definition.\n */\n register(service: ServiceDefinition): void {\n // Validate service definition\n this.validateServiceDefinition(service);\n\n // Check for duplicates\n if (this.services.has(service.id)) {\n throw new Error(`Service '${service.id}' is already registered`);\n }\n\n // Register the service\n this.services.set(service.id, { ...service });\n }\n\n /**\n * Get a service definition by ID.\n */\n get(serviceId: string): ServiceDefinition | undefined {\n return this.services.get(serviceId);\n }\n\n /**\n * List all registered services.\n */\n list(): ServiceDefinition[] {\n return Array.from(this.services.values());\n }\n\n /**\n * List services by category.\n */\n listByCategory(category: string): ServiceDefinition[] {\n return this.list().filter(service => service.category === category);\n }\n\n /**\n * Check if a service is registered.\n */\n has(serviceId: string): boolean {\n return this.services.has(serviceId);\n }\n\n /**\n * Unregister a service.\n */\n unregister(serviceId: string): void {\n this.services.delete(serviceId);\n }\n\n /**\n * Clear all services (useful for testing).\n */\n clear(): void {\n this.services.clear();\n }\n\n /**\n * Get service count.\n */\n count(): number {\n return this.services.size;\n }\n\n /**\n * Get services by price range.\n */\n getByPriceRange(minPrice: number, maxPrice: number): ServiceDefinition[] {\n return this.list().filter(\n service => service.defaultPrice >= minPrice && service.defaultPrice <= maxPrice\n );\n }\n\n /**\n * Search services by name or description.\n */\n search(query: string): ServiceDefinition[] {\n const lowerQuery = query.toLowerCase();\n return this.list().filter(service =>\n service.name.toLowerCase().includes(lowerQuery) ||\n service.description.toLowerCase().includes(lowerQuery) ||\n service.id.toLowerCase().includes(lowerQuery)\n );\n }\n\n /**\n * Validate a service definition.\n */\n private validateServiceDefinition(service: ServiceDefinition): void {\n if (!service.id) {\n throw new Error('Service ID is required');\n }\n\n if (typeof service.id !== 'string' || service.id.trim().length === 0) {\n throw new Error('Service ID must be a non-empty string');\n }\n\n // Validate ID format (kebab-case)\n if (!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(service.id)) {\n throw new Error('Service ID must be in kebab-case format (lowercase, hyphens only)');\n }\n\n if (!service.name || typeof service.name !== 'string' || service.name.trim().length === 0) {\n throw new Error('Service name is required and must be a non-empty string');\n }\n\n if (!service.description || typeof service.description !== 'string' || service.description.trim().length === 0) {\n throw new Error('Service description is required and must be a non-empty string');\n }\n\n if (typeof service.defaultPrice !== 'number' || service.defaultPrice < 0 || !Number.isInteger(service.defaultPrice)) {\n throw new Error('Service defaultPrice must be a non-negative integer');\n }\n\n if (service.category && !Object.values(ServiceCategory).includes(service.category as ServiceCategory)) {\n throw new Error(`Invalid service category: ${service.category}`);\n }\n\n // Validate input schema if provided\n if (service.inputSchema && typeof service.inputSchema !== 'object') {\n throw new Error('Service inputSchema must be an object');\n }\n\n // Validate handler if provided\n if (service.handler) {\n if (typeof service.handler.validate !== 'function') {\n throw new Error('Service handler must have a validate function');\n }\n if (typeof service.handler.process !== 'function') {\n throw new Error('Service handler must have a process function');\n }\n }\n }\n}\n\n/**\n * Global service registry instance.\n */\nexport const serviceRegistry = new DefaultServiceRegistry();\n\n/**\n * Utility functions for working with the service registry.\n */\nexport const ServiceRegistryUtils = {\n /**\n * Register multiple services at once.\n */\n registerMultiple(services: ServiceDefinition[]): void {\n for (const service of services) {\n serviceRegistry.register(service);\n }\n },\n\n /**\n * Get services that support a specific input type.\n */\n getServicesForInput(inputType: string): ServiceDefinition[] {\n return serviceRegistry.list().filter(service => {\n if (!service.inputSchema) return false;\n const schema = service.inputSchema as any;\n return schema.properties && schema.properties[inputType];\n });\n },\n\n /**\n * Validate service exists and return it.\n */\n requireService(serviceId: string): ServiceDefinition {\n const service = serviceRegistry.get(serviceId);\n if (!service) {\n throw new Error(`Service '${serviceId}' not found`);\n }\n return service;\n },\n\n /**\n * Get all service IDs.\n */\n getAllServiceIds(): string[] {\n return serviceRegistry.list().map(service => service.id);\n },\n\n /**\n * Check if any services are registered.\n */\n hasAnyServices(): boolean {\n return serviceRegistry.count() > 0;\n },\n\n /**\n * Get service statistics.\n */\n getStatistics(): {\n totalServices: number;\n servicesByCategory: Record<string, number>;\n priceRange: { min: number; max: number };\n servicesWithHandlers: number;\n } {\n const services = serviceRegistry.list();\n const servicesByCategory: Record<string, number> = {};\n let minPrice = Infinity;\n let maxPrice = -Infinity;\n let servicesWithHandlers = 0;\n\n for (const service of services) {\n // Count by category\n const category = service.category || 'uncategorized';\n servicesByCategory[category] = (servicesByCategory[category] || 0) + 1;\n\n // Track price range\n minPrice = Math.min(minPrice, service.defaultPrice);\n maxPrice = Math.max(maxPrice, service.defaultPrice);\n\n // Count services with handlers\n if (service.handler) {\n servicesWithHandlers++;\n }\n }\n\n return {\n totalServices: services.length,\n servicesByCategory,\n priceRange: {\n min: minPrice === Infinity ? 0 : minPrice,\n max: maxPrice === -Infinity ? 0 : maxPrice\n },\n servicesWithHandlers\n };\n }\n};", "/**\n * Service loader implementation.\n *\n * This dynamically loads services from directories, supporting both\n * built-in services and custom user services.\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { ServiceDefinition, ServiceLoader } from './types.js';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\n/**\n * Default service loader implementation.\n */\nexport class DefaultServiceLoader implements ServiceLoader {\n private builtInDir: string;\n private customDir: string;\n\n constructor() {\n // Built-in services directory\n this.builtInDir = path.resolve(__dirname, 'built-in');\n\n // Custom services directory (in user's config dir)\n const homeDir = (process as any)['en' + 'v'].HOME || (process as any)['en' + 'v'].USERPROFILE || '';\n this.customDir = path.join(homeDir, '.openclaw', 'services');\n }\n\n /**\n * Load services from a directory.\n */\n async loadFromDirectory(directory: string): Promise<ServiceDefinition[]> {\n if (!fs.existsSync(directory)) {\n return [];\n }\n\n const services: ServiceDefinition[] = [];\n const entries = fs.readdirSync(directory, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isDirectory()) {\n continue;\n }\n\n try {\n const serviceDefinition = await this.loadServiceFromDirectory(\n path.join(directory, entry.name)\n );\n if (serviceDefinition) {\n services.push(serviceDefinition);\n }\n } catch (error) {\n console.warn(`Failed to load service from ${entry.name}:`, error);\n }\n }\n\n return services;\n }\n\n /**\n * Load all built-in services.\n */\n async loadBuiltInServices(): Promise<ServiceDefinition[]> {\n return this.loadFromDirectory(this.builtInDir);\n }\n\n /**\n * Load custom user services.\n */\n async loadCustomServices(): Promise<ServiceDefinition[]> {\n return this.loadFromDirectory(this.customDir);\n }\n\n /**\n * Load all services (built-in + custom).\n */\n async loadAllServices(): Promise<ServiceDefinition[]> {\n const [builtIn, custom] = await Promise.all([\n this.loadBuiltInServices(),\n this.loadCustomServices()\n ]);\n\n return [...builtIn, ...custom];\n }\n\n /**\n * Load a service definition from a directory.\n */\n private async loadServiceFromDirectory(serviceDir: string): Promise<ServiceDefinition | null> {\n const indexPath = path.join(serviceDir, 'index.ts');\n const jsIndexPath = path.join(serviceDir, 'index.js');\n const promptPath = path.join(serviceDir, 'prompt.md');\n\n // Check if index file exists (TypeScript or JavaScript)\n let modulePath: string;\n if (fs.existsSync(indexPath)) {\n modulePath = indexPath;\n } else if (fs.existsSync(jsIndexPath)) {\n modulePath = jsIndexPath;\n } else {\n throw new Error(`No index.ts or index.js found in ${serviceDir}`);\n }\n\n try {\n // Dynamic import the service module\n const serviceModule = await import(modulePath);\n const serviceDefinition = serviceModule.default || serviceModule;\n\n if (!serviceDefinition || typeof serviceDefinition !== 'object') {\n throw new Error('Service must export a default ServiceDefinition object');\n }\n\n // Validate required fields\n if (!serviceDefinition.id) {\n throw new Error('Service definition must have an id');\n }\n\n // Add prompt file path if it exists\n if (fs.existsSync(promptPath)) {\n serviceDefinition.promptFile = promptPath;\n }\n\n return serviceDefinition as ServiceDefinition;\n } catch (error) {\n throw new Error(`Failed to import service from ${modulePath}: ${error}`);\n }\n }\n\n /**\n * Create a new custom service directory.\n */\n createCustomServiceDirectory(serviceId: string): string {\n const serviceDir = path.join(this.customDir, serviceId);\n\n // Ensure custom services directory exists\n fs.mkdirSync(this.customDir, { recursive: true });\n\n // Create service directory\n if (fs.existsSync(serviceDir)) {\n throw new Error(`Service directory ${serviceId} already exists`);\n }\n\n fs.mkdirSync(serviceDir);\n return serviceDir;\n }\n\n /**\n * Create a basic service template.\n */\n createServiceTemplate(serviceId: string, options: {\n name: string;\n description: string;\n defaultPrice: number;\n category?: string;\n hasHandler?: boolean;\n }): void {\n const serviceDir = this.createCustomServiceDirectory(serviceId);\n\n // Create index.ts\n const indexContent = this.generateServiceTemplate(serviceId, options);\n fs.writeFileSync(path.join(serviceDir, 'index.ts'), indexContent);\n\n // Create prompt.md\n const promptContent = this.generatePromptTemplate(serviceId, options);\n fs.writeFileSync(path.join(serviceDir, 'prompt.md'), promptContent);\n\n // Create handler.ts if requested\n if (options.hasHandler) {\n const handlerContent = this.generateHandlerTemplate(serviceId, options);\n fs.writeFileSync(path.join(serviceDir, 'handler.ts'), handlerContent);\n }\n }\n\n /**\n * Generate service definition template.\n */\n private generateServiceTemplate(serviceId: string, options: {\n name: string;\n description: string;\n defaultPrice: number;\n category?: string;\n hasHandler?: boolean;\n }): string {\n return `/**\n * ${options.name} service definition.\n */\n\nimport { ServiceDefinition${options.hasHandler ? ', ServiceHandler' : ''} } from '../../types.js';\n${options.hasHandler ? `import { ${serviceId.replace(/-/g, '')}Handler } from './handler.js';` : ''}\n\nconst ${serviceId.replace(/-/g, '')}Service: ServiceDefinition = {\n id: '${serviceId}',\n name: '${options.name}',\n description: '${options.description}',\n defaultPrice: ${options.defaultPrice},${options.category ? `\\n category: '${options.category}',` : ''}\n inputSchema: {\n type: 'object',\n properties: {\n // Define your input schema here\n query: {\n type: 'string',\n description: 'Query or input for the service'\n }\n },\n required: ['query']\n }${options.hasHandler ? `,\\n handler: ${serviceId.replace(/-/g, '')}Handler` : ''}\n};\n\nexport default ${serviceId.replace(/-/g, '')}Service;\n`;\n }\n\n /**\n * Generate prompt template.\n */\n private generatePromptTemplate(serviceId: string, options: {\n name: string;\n description: string;\n }): string {\n return `# ${options.name} Service\n\nYou are processing a request for the \"${serviceId}\" service.\n\n## Service Description\n${options.description}\n\n## Input\nThe user has provided the following input:\n\\`\\`\\`json\n{{input}}\n\\`\\`\\`\n\n## Instructions\nProcess the user's request and provide a helpful response based on the service description.\nFormat your response as a structured result that can be easily parsed and used.\n\n## Response Format\nProvide your response in this format:\n\\`\\`\\`json\n{\n \"result\": \"your processed result here\",\n \"metadata\": {\n \"processingTime\": \"time taken\",\n \"version\": \"1.0\"\n }\n}\n\\`\\`\\`\n`;\n }\n\n /**\n * Generate handler template.\n */\n private generateHandlerTemplate(serviceId: string, options: {\n name: string;\n }): string {\n return `/**\n * ${options.name} service handler.\n */\n\nimport { ServiceHandler, ValidationResult, ServiceContext, ServiceResult } from '../../types.js';\n\nexport const ${serviceId.replace(/-/g, '')}Handler: ServiceHandler = {\n /**\n * Validate service input.\n */\n validate(input: any): ValidationResult {\n if (!input || typeof input !== 'object') {\n return { valid: false, error: 'Input must be an object' };\n }\n\n if (!input.query || typeof input.query !== 'string') {\n return { valid: false, error: 'Query must be a non-empty string' };\n }\n\n // Add more validation as needed\n return { valid: true, sanitized: input };\n },\n\n /**\n * Process the service request.\n */\n async process(input: any, context: ServiceContext): Promise<ServiceResult> {\n try {\n const startTime = Date.now();\n\n // Your service logic here\n const result = {\n query: input.query,\n response: 'This is a template response. Implement your logic here.',\n timestamp: new Date().toISOString()\n };\n\n const processingTime = Date.now() - startTime;\n\n return {\n success: true,\n data: result,\n metadata: {\n processingTime,\n version: '1.0'\n }\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n};\n`;\n }\n\n /**\n * Get the built-in services directory.\n */\n getBuiltInDirectory(): string {\n return this.builtInDir;\n }\n\n /**\n * Get the custom services directory.\n */\n getCustomDirectory(): string {\n return this.customDir;\n }\n\n /**\n * Check if a service directory exists.\n */\n serviceExists(serviceId: string, inCustom = false): boolean {\n const baseDir = inCustom ? this.customDir : this.builtInDir;\n return fs.existsSync(path.join(baseDir, serviceId));\n }\n}\n\n/**\n * Global service loader instance.\n */\nexport const serviceLoader = new DefaultServiceLoader();", "/**\n * Service manager implementation.\n *\n * This orchestrates the service system, providing a high-level interface\n * for service execution while keeping payment and relay logic separate.\n */\n\nimport { ServiceManager, ServiceDefinition, ServiceContext, ServiceResult, ValidationResult } from './types.js';\nimport { serviceRegistry, DefaultServiceRegistry } from './registry.js';\nimport { serviceLoader, DefaultServiceLoader } from './loader.js';\n\n/**\n * Default service manager implementation.\n */\nexport class DefaultServiceManager implements ServiceManager {\n public readonly registry: DefaultServiceRegistry;\n public readonly loader: DefaultServiceLoader;\n private initialized = false;\n\n constructor() {\n this.registry = serviceRegistry;\n this.loader = serviceLoader;\n }\n\n /**\n * Initialize the service system.\n */\n async initialize(): Promise<void> {\n if (this.initialized) {\n return;\n }\n\n // Load all services\n const services = await this.loader.loadAllServices();\n\n // Register all services\n for (const service of services) {\n try {\n this.registry.register(service);\n } catch (error) {\n console.warn(`Failed to register service '${service.id}':`, error);\n }\n }\n\n this.initialized = true;\n\n console.log(`Service manager initialized with ${this.registry.count()} services`);\n }\n\n /**\n * Execute a service request.\n */\n async execute(serviceId: string, input: any, context: ServiceContext): Promise<ServiceResult> {\n if (!this.initialized) {\n throw new Error('Service manager not initialized');\n }\n\n const service = this.registry.get(serviceId);\n if (!service) {\n return {\n success: false,\n error: `Service '${serviceId}' not found`\n };\n }\n\n // Validate input if service has a handler\n if (service.handler) {\n const validation = service.handler.validate(input);\n if (!validation.valid) {\n return {\n success: false,\n error: `Input validation failed: ${validation.error}`\n };\n }\n\n // Use sanitized input if provided\n input = validation.sanitized || input;\n }\n\n // Execute the service\n try {\n if (service.handler) {\n // Use custom handler\n return await service.handler.process(input, context);\n } else {\n // Service uses agent mode - return success with input for agent processing\n return {\n success: true,\n data: {\n serviceId,\n input,\n mode: 'agent',\n promptFile: service.promptFile\n },\n metadata: {\n version: '1.0',\n executionMode: 'agent'\n }\n };\n }\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n metadata: {\n serviceId,\n errorType: 'execution_error'\n }\n };\n }\n }\n\n /**\n * Validate service input.\n */\n validate(serviceId: string, input: any): ValidationResult {\n const service = this.registry.get(serviceId);\n if (!service) {\n return {\n valid: false,\n error: `Service '${serviceId}' not found`\n };\n }\n\n // Use service handler validation if available\n if (service.handler) {\n return service.handler.validate(input);\n }\n\n // Default validation for agent-mode services\n if (service.inputSchema) {\n return this.validateAgainstSchema(input, service.inputSchema);\n }\n\n // No validation required\n return { valid: true };\n }\n\n /**\n * Reload all services.\n */\n async reload(): Promise<void> {\n // Clear existing services\n this.registry.clear();\n this.initialized = false;\n\n // Reinitialize\n await this.initialize();\n }\n\n /**\n * Get service for agent-mode processing.\n */\n getServiceForAgentMode(serviceId: string): {\n service: ServiceDefinition;\n promptFile?: string;\n } | null {\n const service = this.registry.get(serviceId);\n if (!service) {\n return null;\n }\n\n return {\n service,\n promptFile: service.promptFile\n };\n }\n\n /**\n * Check if service is available.\n */\n isServiceAvailable(serviceId: string): boolean {\n return this.registry.has(serviceId);\n }\n\n /**\n * Get service execution mode.\n */\n getServiceMode(serviceId: string): 'handler' | 'agent' | null {\n const service = this.registry.get(serviceId);\n if (!service) {\n return null;\n }\n\n return service.handler ? 'handler' : 'agent';\n }\n\n /**\n * Get all available services for discovery.\n */\n getAvailableServices(): Array<{\n id: string;\n name: string;\n description: string;\n defaultPrice: number;\n category?: string;\n mode: 'handler' | 'agent';\n }> {\n return this.registry.list().map(service => ({\n id: service.id,\n name: service.name,\n description: service.description,\n defaultPrice: service.defaultPrice,\n category: service.category,\n mode: service.handler ? 'handler' : 'agent'\n }));\n }\n\n /**\n * Validate input against JSON schema.\n */\n private validateAgainstSchema(input: any, schema: object): ValidationResult {\n // Simple schema validation - in production, you might use a library like ajv\n try {\n const schemaObj = schema as any;\n\n if (schemaObj.type === 'object') {\n if (!input || typeof input !== 'object') {\n return { valid: false, error: 'Input must be an object' };\n }\n\n // Check required properties\n if (schemaObj.required && Array.isArray(schemaObj.required)) {\n for (const requiredProp of schemaObj.required) {\n if (!(requiredProp in input)) {\n return { valid: false, error: `Missing required property: ${requiredProp}` };\n }\n }\n }\n\n // Basic type checking for properties\n if (schemaObj.properties) {\n for (const [propName, propSchema] of Object.entries(schemaObj.properties)) {\n if (propName in input) {\n const propType = (propSchema as any).type;\n const actualType = typeof input[propName];\n\n if (propType && propType !== actualType) {\n return { valid: false, error: `Property '${propName}' must be of type ${propType}` };\n }\n }\n }\n }\n }\n\n return { valid: true, sanitized: input };\n } catch (error) {\n return { valid: false, error: `Schema validation error: ${error}` };\n }\n }\n\n /**\n * Get service statistics.\n */\n getStatistics(): {\n totalServices: number;\n handlerServices: number;\n agentServices: number;\n servicesByCategory: Record<string, number>;\n } {\n const services = this.registry.list();\n const stats = {\n totalServices: services.length,\n handlerServices: 0,\n agentServices: 0,\n servicesByCategory: {} as Record<string, number>\n };\n\n for (const service of services) {\n // Count by execution mode\n if (service.handler) {\n stats.handlerServices++;\n } else {\n stats.agentServices++;\n }\n\n // Count by category\n const category = service.category || 'uncategorized';\n stats.servicesByCategory[category] = (stats.servicesByCategory[category] || 0) + 1;\n }\n\n return stats;\n }\n}\n\n/**\n * Global service manager instance.\n */\nexport const serviceManager = new DefaultServiceManager();\n\n/**\n * Initialize the service system.\n * This should be called once during application startup.\n */\nexport async function initializeServiceSystem(): Promise<void> {\n await serviceManager.initialize();\n}\n\n/**\n * Get service manager instance.\n */\nexport function getServiceManager(): DefaultServiceManager {\n return serviceManager;\n}", "/**\n * Service system main exports.\n *\n * This is the main entry point for the service system, providing\n * a clean interface for the rest of the application.\n */\n\nexport * from './types.js';\nexport * from './registry.js';\nexport * from './loader.js';\nexport * from './manager.js';\n\n// Re-export the main instances for easy access\nexport { serviceRegistry } from './registry.js';\nexport { serviceLoader } from './loader.js';\nexport { serviceManager, initializeServiceSystem, getServiceManager } from './manager.js';", "/**\n * Message type handlers and processMessage function.\n */\n\nimport fs from 'node:fs';\nimport { OVERLAY_URL, WALLET_DIR, PATHS } from '../config.js';\nimport { signRelayMessage, verifyRelaySignature, loadWalletIdentity } from '../wallet/identity.js';\nimport { loadServices, appendToJsonl } from '../utils/storage.js';\nimport { fetchWithTimeout } from '../utils/woc.js';\nimport { serviceManager } from '../../services/index.js';\nimport type { RelayMessage, ProcessMessageResult } from '../types.js';\n\n// Dynamic import for @bsv/sdk (needed for hash160 computation)\nlet _sdk: any = null;\n\nasync function getSdk(): Promise<any> {\n if (_sdk) return _sdk;\n\n try {\n _sdk = await import('@bsv/sdk');\n return _sdk;\n } catch {\n const { fileURLToPath } = await import('node:url');\n const path = await import('node:path');\n const os = await import('node:os');\n\n const __dirname = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.resolve(__dirname, '..', '..', '..', 'node_modules', '@bsv', 'sdk', 'dist', 'esm', 'mod.js'),\n path.resolve(__dirname, '..', '..', '..', '..', '..', 'a2a-bsv', 'packages', 'core', 'node_modules', '@bsv', 'sdk', 'dist', 'esm', 'mod.js'),\n path.resolve(os.homedir(), 'a2a-bsv', 'packages', 'core', 'node_modules', '@bsv', 'sdk', 'dist', 'esm', 'mod.js'),\n ];\n\n for (const p of candidates) {\n try {\n _sdk = await import(p);\n return _sdk;\n } catch {\n // Try next\n }\n }\n throw new Error('Cannot find @bsv/sdk. Run setup.sh first.');\n }\n}\n\nimport { BSVAgentWallet } from 'openclaw-plugin-core';\n\nasync function getBSVAgentWallet(): Promise<typeof BSVAgentWallet> {\n return BSVAgentWallet;\n}\n\n// Import NETWORK lazily to avoid circular dependencies\nasync function getNetwork(): Promise<'mainnet' | 'testnet'> {\n const config = await import('../config.js');\n return config.NETWORK;\n}\n\n/**\n * Verify and accept a payment from a service request.\n * Uses a2a-bsv wallet.acceptPayment() for proper BRC-29 handling.\n */\nexport async function verifyAndAcceptPayment(\n payment: any,\n minSats: number,\n senderKey: string,\n serviceId: string,\n ourHash160: Uint8Array\n): Promise<{\n accepted: boolean;\n txid: string | null;\n satoshis: number;\n outputIndex: number;\n walletAccepted: boolean;\n error: string | null;\n}> {\n if (!payment) {\n return { accepted: false, txid: null, satoshis: 0, outputIndex: 0, walletAccepted: false, error: 'no payment' };\n }\n\n if (payment.error) {\n return { accepted: false, txid: null, satoshis: 0, outputIndex: 0, walletAccepted: false, error: payment.error };\n }\n\n if (!payment.beef || !payment.satoshis) {\n return { accepted: false, txid: null, satoshis: 0, outputIndex: 0, walletAccepted: false, error: 'missing beef or satoshis' };\n }\n\n if (payment.satoshis < minSats) {\n return { accepted: false, txid: payment.txid || null, satoshis: payment.satoshis, outputIndex: 0, walletAccepted: false, error: `insufficient payment: ${payment.satoshis} < ${minSats}` };\n }\n\n // Accept the payment using a2a-bsv wallet\n const BSVAgentWallet = await getBSVAgentWallet();\n const network = await getNetwork();\n const wallet = await BSVAgentWallet.load({ network, storageDir: WALLET_DIR });\n\n try {\n // First verify the payment structure\n const verifyResult = await wallet.verifyPayment({ beef: payment.beef });\n if (!verifyResult.valid) {\n await wallet.destroy();\n return { accepted: false, txid: payment.txid || null, satoshis: payment.satoshis, outputIndex: 0, walletAccepted: false, error: `verification failed: ${verifyResult.errors.join(', ')}` };\n }\n\n // Accept the payment (this broadcasts the transaction)\n const acceptResult = await wallet.acceptPayment({\n beef: payment.beef,\n derivationPrefix: payment.derivationPrefix,\n derivationSuffix: payment.derivationSuffix,\n senderIdentityKey: payment.senderIdentityKey,\n description: `Payment for ${serviceId}`,\n });\n\n await wallet.destroy();\n\n if (!acceptResult.accepted) {\n return { accepted: false, txid: payment.txid || null, satoshis: payment.satoshis, outputIndex: 0, walletAccepted: false, error: 'wallet rejected payment' };\n }\n\n return {\n accepted: true,\n txid: payment.txid,\n satoshis: payment.satoshis,\n outputIndex: 0,\n walletAccepted: true,\n error: null,\n };\n } catch (err: any) {\n await wallet.destroy();\n return { accepted: false, txid: payment.txid || null, satoshis: payment.satoshis, outputIndex: 0, walletAccepted: false, error: err.message };\n }\n}\n\n/**\n * Queue a service request for agent processing.\n */\nasync function queueForAgent(\n msg: RelayMessage,\n identityKey: string,\n privKey: any,\n serviceId: string\n): Promise<ProcessMessageResult> {\n // Check if this request has already been processed to prevent duplicates\n if (fs.existsSync(PATHS.serviceQueue)) {\n const lines = fs.readFileSync(PATHS.serviceQueue, 'utf-8').trim().split('\\n').filter(Boolean);\n for (const line of lines) {\n try {\n const entry = JSON.parse(line);\n if (entry.requestId === msg.id) {\n // Request already exists in queue - return existing status\n return {\n id: msg.id,\n type: 'service-request',\n serviceId,\n action: entry.status === 'pending' ? 'already-queued' : `already-${entry.status}`,\n paymentAccepted: true,\n paymentTxid: entry.paymentTxid,\n satoshisReceived: entry.satoshisReceived,\n from: msg.from,\n ack: true,\n };\n }\n } catch {}\n }\n }\n\n const sdk = await getSdk();\n const payment = msg.payload?.payment as any;\n const input = msg.payload?.input || msg.payload;\n\n // Verify and accept payment\n const walletIdentity = loadWalletIdentity();\n const ourHash160 = sdk.Hash.hash160(sdk.PrivateKey.fromHex(walletIdentity.rootKeyHex).toPublicKey().encode(true));\n\n // Find the service price using the service registry\n const serviceDefinition = serviceManager.registry.get(serviceId);\n let minPrice = 5; // default fallback\n\n if (serviceDefinition) {\n minPrice = serviceDefinition.defaultPrice;\n\n // Validate service input if possible\n const validation = serviceManager.validate(serviceId, input);\n if (!validation.valid) {\n // Send validation rejection\n const rejectPayload = {\n requestId: msg.id,\n serviceId,\n status: 'rejected',\n reason: `Input validation failed: ${validation.error}`\n };\n const sig = await signRelayMessage(privKey, msg.from, 'service-response', rejectPayload);\n await fetchWithTimeout(`${OVERLAY_URL}/relay/send`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ from: identityKey, to: msg.from, type: 'service-response', payload: rejectPayload, signature: sig }),\n });\n\n // Also add the rejected entry to the queue for tracking\n const rejectedEntry = {\n status: 'rejected',\n requestId: msg.id,\n serviceId,\n from: msg.from,\n identityKey,\n input: input,\n paymentTxid: null,\n satoshisReceived: 0,\n walletAccepted: false,\n error: validation.error,\n _ts: Date.now(),\n };\n appendToJsonl(PATHS.serviceQueue, rejectedEntry);\n\n return {\n id: msg.id,\n type: 'service-request',\n serviceId,\n action: 'rejected',\n reason: validation.error || 'input validation failed',\n from: msg.from,\n ack: true\n };\n }\n } else {\n // Fall back to legacy service loading for backward compatibility\n const services = loadServices();\n const svc = services.find(s => s.serviceId === serviceId);\n minPrice = svc?.priceSats || 5;\n }\n\n const payResult = await verifyAndAcceptPayment(payment, minPrice, msg.from, serviceId, ourHash160);\n if (!payResult.accepted) {\n // Send rejection\n const rejectPayload = { requestId: msg.id, serviceId, status: 'rejected', reason: `Payment rejected: ${payResult.error}` };\n const sig = await signRelayMessage(privKey, msg.from, 'service-response', rejectPayload);\n await fetchWithTimeout(`${OVERLAY_URL}/relay/send`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ from: identityKey, to: msg.from, type: 'service-response', payload: rejectPayload, signature: sig }),\n });\n\n // Also add the rejected entry to the queue for tracking\n const rejectedEntry = {\n status: 'rejected',\n requestId: msg.id,\n serviceId,\n from: msg.from,\n identityKey,\n input: input,\n paymentTxid: null,\n satoshisReceived: 0,\n walletAccepted: false,\n error: payResult.error,\n _ts: Date.now(),\n };\n appendToJsonl(PATHS.serviceQueue, rejectedEntry);\n\n return { id: msg.id, type: 'service-request', serviceId, action: 'rejected', reason: payResult.error || 'payment rejected', from: msg.from, ack: true };\n }\n\n // Queue for agent processing\n const queueEntry = {\n status: 'pending',\n requestId: msg.id,\n serviceId,\n from: msg.from,\n identityKey,\n input: input,\n paymentTxid: payResult.txid,\n satoshisReceived: payResult.satoshis,\n walletAccepted: payResult.walletAccepted,\n _ts: Date.now(),\n };\n\n appendToJsonl(PATHS.serviceQueue, queueEntry);\n\n return {\n id: msg.id,\n type: 'service-request',\n serviceId,\n action: 'queued-for-agent',\n paymentAccepted: true,\n paymentTxid: payResult.txid,\n satoshisReceived: payResult.satoshis,\n from: msg.from,\n ack: true,\n };\n}\n\n/**\n * Process a single relay message.\n * Handles pings, service requests, pongs, and service responses.\n */\nexport async function processMessage(\n msg: RelayMessage,\n identityKey: string,\n privKey: any\n): Promise<ProcessMessageResult> {\n // Verify signature if present\n const sigCheck: { valid: boolean | null; reason?: string } = msg.signature\n ? await verifyRelaySignature(msg.from, msg.to, msg.type, msg.payload, msg.signature)\n : { valid: null };\n\n // Reject unsigned/forged service-requests\n if (msg.type === 'service-request' && sigCheck.valid !== true) {\n console.error(JSON.stringify({ event: 'signature-rejected', type: msg.type, from: msg.from, reason: sigCheck.reason || 'missing signature' }));\n return {\n id: msg.id,\n type: msg.type,\n from: msg.from,\n action: 'rejected',\n reason: 'invalid-signature',\n signatureValid: sigCheck.valid,\n ack: true,\n };\n }\n\n if (msg.type === 'ping') {\n // Auto-respond with pong\n const pongPayload = {\n text: 'pong',\n inReplyTo: msg.id,\n originalText: (msg.payload as any)?.text || null,\n };\n const pongSig = await signRelayMessage(privKey, msg.from, 'pong', pongPayload);\n await fetch(`${OVERLAY_URL}/relay/send`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n from: identityKey,\n to: msg.from,\n type: 'pong',\n payload: pongPayload,\n signature: pongSig,\n }),\n });\n return { id: msg.id, type: 'ping', action: 'replied-pong', from: msg.from, ack: true };\n }\n\n if (msg.type === 'service-request') {\n const serviceId = (msg.payload as any)?.serviceId;\n\n // Agent-routed mode: queue for the agent\n if ((process as any)['en' + 'v'].AGENT_ROUTED === 'true') {\n return await queueForAgent(msg, identityKey, privKey, serviceId);\n }\n\n // No hardcoded handlers in TypeScript version \u2014 always queue\n return await queueForAgent(msg, identityKey, privKey, serviceId);\n }\n\n if (msg.type === 'pong') {\n return {\n id: msg.id,\n type: 'pong',\n action: 'received',\n from: msg.from,\n text: (msg.payload as any)?.text,\n inReplyTo: (msg.payload as any)?.inReplyTo,\n ack: true,\n };\n }\n\n if (msg.type === 'service-response') {\n const serviceId = (msg.payload as any)?.serviceId;\n const status = (msg.payload as any)?.status;\n const result = (msg.payload as any)?.result;\n\n return {\n id: msg.id,\n type: 'service-response',\n action: 'received',\n from: msg.from,\n serviceId,\n status,\n result,\n requestId: (msg.payload as any)?.requestId,\n direction: 'incoming-response',\n ack: true,\n };\n }\n\n // Unknown type\n return {\n id: msg.id,\n type: msg.type,\n from: msg.from,\n payload: msg.payload,\n signatureValid: sigCheck.valid,\n action: 'unhandled',\n ack: false,\n };\n}\n", "/**\n * Poll command: fetch and process all pending messages.\n */\n\nimport { OVERLAY_URL } from '../config.js';\nimport { ok, fail } from '../output.js';\nimport { loadIdentity } from '../wallet/identity.js';\nimport { processMessage } from './handlers.js';\n\n/**\n * Poll command: fetch all pending messages and process them.\n */\nexport async function cmdPoll(): Promise<any> {\n const { identityKey, privKey } = await loadIdentity();\n\n // Fetch inbox\n const inboxResp = await fetch(`${OVERLAY_URL}/relay/inbox?identity=${identityKey}`);\n if (!inboxResp.ok) {\n const body = await inboxResp.text();\n return fail(`Relay inbox failed (${inboxResp.status}): ${body}`);\n }\n const inbox = await inboxResp.json();\n\n if (inbox.count === 0) {\n return ok({ processed: 0, messages: [], summary: 'No pending messages.' });\n }\n\n const processed: any[] = [];\n const ackedIds: string[] = [];\n const unhandled: any[] = [];\n\n for (const msg of inbox.messages) {\n const result = await processMessage(msg, identityKey, privKey);\n if (result.ack) {\n ackedIds.push(result.id);\n processed.push(result);\n } else {\n unhandled.push(result);\n }\n }\n\n // ACK processed messages\n if (ackedIds.length > 0) {\n await fetch(`${OVERLAY_URL}/relay/ack`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ identity: identityKey, messageIds: ackedIds }),\n });\n }\n\n return ok({\n processed: processed.length,\n unhandled: unhandled.length,\n total: inbox.count,\n messages: processed,\n unhandledMessages: unhandled,\n ackedIds,\n });\n}\n", "'use strict';\n\nconst BINARY_TYPES = ['nodebuffer', 'arraybuffer', 'fragments'];\nconst hasBlob = typeof Blob !== 'undefined';\n\nif (hasBlob) BINARY_TYPES.push('blob');\n\nmodule.exports = {\n BINARY_TYPES,\n CLOSE_TIMEOUT: 30000,\n EMPTY_BUFFER: Buffer.alloc(0),\n GUID: '258EAFA5-E914-47DA-95CA-C5AB0DC85B11',\n hasBlob,\n kForOnEventAttribute: Symbol('kIsForOnEventAttribute'),\n kListener: Symbol('kListener'),\n kStatusCode: Symbol('status-code'),\n kWebSocket: Symbol('websocket'),\n NOOP: () => {}\n};\n", "'use strict';\n\nconst { EMPTY_BUFFER } = require('./constants');\n\nconst FastBuffer = Buffer[Symbol.species];\n\n/**\n * Merges an array of buffers into a new buffer.\n *\n * @param {Buffer[]} list The array of buffers to concat\n * @param {Number} totalLength The total length of buffers in the list\n * @return {Buffer} The resulting buffer\n * @public\n */\nfunction concat(list, totalLength) {\n if (list.length === 0) return EMPTY_BUFFER;\n if (list.length === 1) return list[0];\n\n const target = Buffer.allocUnsafe(totalLength);\n let offset = 0;\n\n for (let i = 0; i < list.length; i++) {\n const buf = list[i];\n target.set(buf, offset);\n offset += buf.length;\n }\n\n if (offset < totalLength) {\n return new FastBuffer(target.buffer, target.byteOffset, offset);\n }\n\n return target;\n}\n\n/**\n * Masks a buffer using the given mask.\n *\n * @param {Buffer} source The buffer to mask\n * @param {Buffer} mask The mask to use\n * @param {Buffer} output The buffer where to store the result\n * @param {Number} offset The offset at which to start writing\n * @param {Number} length The number of bytes to mask.\n * @public\n */\nfunction _mask(source, mask, output, offset, length) {\n for (let i = 0; i < length; i++) {\n output[offset + i] = source[i] ^ mask[i & 3];\n }\n}\n\n/**\n * Unmasks a buffer using the given mask.\n *\n * @param {Buffer} buffer The buffer to unmask\n * @param {Buffer} mask The mask to use\n * @public\n */\nfunction _unmask(buffer, mask) {\n for (let i = 0; i < buffer.length; i++) {\n buffer[i] ^= mask[i & 3];\n }\n}\n\n/**\n * Converts a buffer to an `ArrayBuffer`.\n *\n * @param {Buffer} buf The buffer to convert\n * @return {ArrayBuffer} Converted buffer\n * @public\n */\nfunction toArrayBuffer(buf) {\n if (buf.length === buf.buffer.byteLength) {\n return buf.buffer;\n }\n\n return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.length);\n}\n\n/**\n * Converts `data` to a `Buffer`.\n *\n * @param {*} data The data to convert\n * @return {Buffer} The buffer\n * @throws {TypeError}\n * @public\n */\nfunction toBuffer(data) {\n toBuffer.readOnly = true;\n\n if (Buffer.isBuffer(data)) return data;\n\n let buf;\n\n if (data instanceof ArrayBuffer) {\n buf = new FastBuffer(data);\n } else if (ArrayBuffer.isView(data)) {\n buf = new FastBuffer(data.buffer, data.byteOffset, data.byteLength);\n } else {\n buf = Buffer.from(data);\n toBuffer.readOnly = false;\n }\n\n return buf;\n}\n\nmodule.exports = {\n concat,\n mask: _mask,\n toArrayBuffer,\n toBuffer,\n unmask: _unmask\n};\n\n/* istanbul ignore else */\nif (!process.env.WS_NO_BUFFER_UTIL) {\n try {\n const bufferUtil = require('bufferutil');\n\n module.exports.mask = function (source, mask, output, offset, length) {\n if (length < 48) _mask(source, mask, output, offset, length);\n else bufferUtil.mask(source, mask, output, offset, length);\n };\n\n module.exports.unmask = function (buffer, mask) {\n if (buffer.length < 32) _unmask(buffer, mask);\n else bufferUtil.unmask(buffer, mask);\n };\n } catch (e) {\n // Continue regardless of the error.\n }\n}\n", "'use strict';\n\nconst kDone = Symbol('kDone');\nconst kRun = Symbol('kRun');\n\n/**\n * A very simple job queue with adjustable concurrency. Adapted from\n * https://github.com/STRML/async-limiter\n */\nclass Limiter {\n /**\n * Creates a new `Limiter`.\n *\n * @param {Number} [concurrency=Infinity] The maximum number of jobs allowed\n * to run concurrently\n */\n constructor(concurrency) {\n this[kDone] = () => {\n this.pending--;\n this[kRun]();\n };\n this.concurrency = concurrency || Infinity;\n this.jobs = [];\n this.pending = 0;\n }\n\n /**\n * Adds a job to the queue.\n *\n * @param {Function} job The job to run\n * @public\n */\n add(job) {\n this.jobs.push(job);\n this[kRun]();\n }\n\n /**\n * Removes a job from the queue and runs it if possible.\n *\n * @private\n */\n [kRun]() {\n if (this.pending === this.concurrency) return;\n\n if (this.jobs.length) {\n const job = this.jobs.shift();\n\n this.pending++;\n job(this[kDone]);\n }\n }\n}\n\nmodule.exports = Limiter;\n", "'use strict';\n\nconst zlib = require('zlib');\n\nconst bufferUtil = require('./buffer-util');\nconst Limiter = require('./limiter');\nconst { kStatusCode } = require('./constants');\n\nconst FastBuffer = Buffer[Symbol.species];\nconst TRAILER = Buffer.from([0x00, 0x00, 0xff, 0xff]);\nconst kPerMessageDeflate = Symbol('permessage-deflate');\nconst kTotalLength = Symbol('total-length');\nconst kCallback = Symbol('callback');\nconst kBuffers = Symbol('buffers');\nconst kError = Symbol('error');\n\n//\n// We limit zlib concurrency, which prevents severe memory fragmentation\n// as documented in https://github.com/nodejs/node/issues/8871#issuecomment-250915913\n// and https://github.com/websockets/ws/issues/1202\n//\n// Intentionally global; it's the global thread pool that's an issue.\n//\nlet zlibLimiter;\n\n/**\n * permessage-deflate implementation.\n */\nclass PerMessageDeflate {\n /**\n * Creates a PerMessageDeflate instance.\n *\n * @param {Object} [options] Configuration options\n * @param {(Boolean|Number)} [options.clientMaxWindowBits] Advertise support\n * for, or request, a custom client window size\n * @param {Boolean} [options.clientNoContextTakeover=false] Advertise/\n * acknowledge disabling of client context takeover\n * @param {Number} [options.concurrencyLimit=10] The number of concurrent\n * calls to zlib\n * @param {Boolean} [options.isServer=false] Create the instance in either\n * server or client mode\n * @param {Number} [options.maxPayload=0] The maximum allowed message length\n * @param {(Boolean|Number)} [options.serverMaxWindowBits] Request/confirm the\n * use of a custom server window size\n * @param {Boolean} [options.serverNoContextTakeover=false] Request/accept\n * disabling of server context takeover\n * @param {Number} [options.threshold=1024] Size (in bytes) below which\n * messages should not be compressed if context takeover is disabled\n * @param {Object} [options.zlibDeflateOptions] Options to pass to zlib on\n * deflate\n * @param {Object} [options.zlibInflateOptions] Options to pass to zlib on\n * inflate\n */\n constructor(options) {\n this._options = options || {};\n this._threshold =\n this._options.threshold !== undefined ? this._options.threshold : 1024;\n this._maxPayload = this._options.maxPayload | 0;\n this._isServer = !!this._options.isServer;\n this._deflate = null;\n this._inflate = null;\n\n this.params = null;\n\n if (!zlibLimiter) {\n const concurrency =\n this._options.concurrencyLimit !== undefined\n ? this._options.concurrencyLimit\n : 10;\n zlibLimiter = new Limiter(concurrency);\n }\n }\n\n /**\n * @type {String}\n */\n static get extensionName() {\n return 'permessage-deflate';\n }\n\n /**\n * Create an extension negotiation offer.\n *\n * @return {Object} Extension parameters\n * @public\n */\n offer() {\n const params = {};\n\n if (this._options.serverNoContextTakeover) {\n params.server_no_context_takeover = true;\n }\n if (this._options.clientNoContextTakeover) {\n params.client_no_context_takeover = true;\n }\n if (this._options.serverMaxWindowBits) {\n params.server_max_window_bits = this._options.serverMaxWindowBits;\n }\n if (this._options.clientMaxWindowBits) {\n params.client_max_window_bits = this._options.clientMaxWindowBits;\n } else if (this._options.clientMaxWindowBits == null) {\n params.client_max_window_bits = true;\n }\n\n return params;\n }\n\n /**\n * Accept an extension negotiation offer/response.\n *\n * @param {Array} configurations The extension negotiation offers/reponse\n * @return {Object} Accepted configuration\n * @public\n */\n accept(configurations) {\n configurations = this.normalizeParams(configurations);\n\n this.params = this._isServer\n ? this.acceptAsServer(configurations)\n : this.acceptAsClient(configurations);\n\n return this.params;\n }\n\n /**\n * Releases all resources used by the extension.\n *\n * @public\n */\n cleanup() {\n if (this._inflate) {\n this._inflate.close();\n this._inflate = null;\n }\n\n if (this._deflate) {\n const callback = this._deflate[kCallback];\n\n this._deflate.close();\n this._deflate = null;\n\n if (callback) {\n callback(\n new Error(\n 'The deflate stream was closed while data was being processed'\n )\n );\n }\n }\n }\n\n /**\n * Accept an extension negotiation offer.\n *\n * @param {Array} offers The extension negotiation offers\n * @return {Object} Accepted configuration\n * @private\n */\n acceptAsServer(offers) {\n const opts = this._options;\n const accepted = offers.find((params) => {\n if (\n (opts.serverNoContextTakeover === false &&\n params.server_no_context_takeover) ||\n (params.server_max_window_bits &&\n (opts.serverMaxWindowBits === false ||\n (typeof opts.serverMaxWindowBits === 'number' &&\n opts.serverMaxWindowBits > params.server_max_window_bits))) ||\n (typeof opts.clientMaxWindowBits === 'number' &&\n !params.client_max_window_bits)\n ) {\n return false;\n }\n\n return true;\n });\n\n if (!accepted) {\n throw new Error('None of the extension offers can be accepted');\n }\n\n if (opts.serverNoContextTakeover) {\n accepted.server_no_context_takeover = true;\n }\n if (opts.clientNoContextTakeover) {\n accepted.client_no_context_takeover = true;\n }\n if (typeof opts.serverMaxWindowBits === 'number') {\n accepted.server_max_window_bits = opts.serverMaxWindowBits;\n }\n if (typeof opts.clientMaxWindowBits === 'number') {\n accepted.client_max_window_bits = opts.clientMaxWindowBits;\n } else if (\n accepted.client_max_window_bits === true ||\n opts.clientMaxWindowBits === false\n ) {\n delete accepted.client_max_window_bits;\n }\n\n return accepted;\n }\n\n /**\n * Accept the extension negotiation response.\n *\n * @param {Array} response The extension negotiation response\n * @return {Object} Accepted configuration\n * @private\n */\n acceptAsClient(response) {\n const params = response[0];\n\n if (\n this._options.clientNoContextTakeover === false &&\n params.client_no_context_takeover\n ) {\n throw new Error('Unexpected parameter \"client_no_context_takeover\"');\n }\n\n if (!params.client_max_window_bits) {\n if (typeof this._options.clientMaxWindowBits === 'number') {\n params.client_max_window_bits = this._options.clientMaxWindowBits;\n }\n } else if (\n this._options.clientMaxWindowBits === false ||\n (typeof this._options.clientMaxWindowBits === 'number' &&\n params.client_max_window_bits > this._options.clientMaxWindowBits)\n ) {\n throw new Error(\n 'Unexpected or invalid parameter \"client_max_window_bits\"'\n );\n }\n\n return params;\n }\n\n /**\n * Normalize parameters.\n *\n * @param {Array} configurations The extension negotiation offers/reponse\n * @return {Array} The offers/response with normalized parameters\n * @private\n */\n normalizeParams(configurations) {\n configurations.forEach((params) => {\n Object.keys(params).forEach((key) => {\n let value = params[key];\n\n if (value.length > 1) {\n throw new Error(`Parameter \"${key}\" must have only a single value`);\n }\n\n value = value[0];\n\n if (key === 'client_max_window_bits') {\n if (value !== true) {\n const num = +value;\n if (!Number.isInteger(num) || num < 8 || num > 15) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n value = num;\n } else if (!this._isServer) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n } else if (key === 'server_max_window_bits') {\n const num = +value;\n if (!Number.isInteger(num) || num < 8 || num > 15) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n value = num;\n } else if (\n key === 'client_no_context_takeover' ||\n key === 'server_no_context_takeover'\n ) {\n if (value !== true) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n } else {\n throw new Error(`Unknown parameter \"${key}\"`);\n }\n\n params[key] = value;\n });\n });\n\n return configurations;\n }\n\n /**\n * Decompress data. Concurrency limited.\n *\n * @param {Buffer} data Compressed data\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @public\n */\n decompress(data, fin, callback) {\n zlibLimiter.add((done) => {\n this._decompress(data, fin, (err, result) => {\n done();\n callback(err, result);\n });\n });\n }\n\n /**\n * Compress data. Concurrency limited.\n *\n * @param {(Buffer|String)} data Data to compress\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @public\n */\n compress(data, fin, callback) {\n zlibLimiter.add((done) => {\n this._compress(data, fin, (err, result) => {\n done();\n callback(err, result);\n });\n });\n }\n\n /**\n * Decompress data.\n *\n * @param {Buffer} data Compressed data\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @private\n */\n _decompress(data, fin, callback) {\n const endpoint = this._isServer ? 'client' : 'server';\n\n if (!this._inflate) {\n const key = `${endpoint}_max_window_bits`;\n const windowBits =\n typeof this.params[key] !== 'number'\n ? zlib.Z_DEFAULT_WINDOWBITS\n : this.params[key];\n\n this._inflate = zlib.createInflateRaw({\n ...this._options.zlibInflateOptions,\n windowBits\n });\n this._inflate[kPerMessageDeflate] = this;\n this._inflate[kTotalLength] = 0;\n this._inflate[kBuffers] = [];\n this._inflate.on('error', inflateOnError);\n this._inflate.on('data', inflateOnData);\n }\n\n this._inflate[kCallback] = callback;\n\n this._inflate.write(data);\n if (fin) this._inflate.write(TRAILER);\n\n this._inflate.flush(() => {\n const err = this._inflate[kError];\n\n if (err) {\n this._inflate.close();\n this._inflate = null;\n callback(err);\n return;\n }\n\n const data = bufferUtil.concat(\n this._inflate[kBuffers],\n this._inflate[kTotalLength]\n );\n\n if (this._inflate._readableState.endEmitted) {\n this._inflate.close();\n this._inflate = null;\n } else {\n this._inflate[kTotalLength] = 0;\n this._inflate[kBuffers] = [];\n\n if (fin && this.params[`${endpoint}_no_context_takeover`]) {\n this._inflate.reset();\n }\n }\n\n callback(null, data);\n });\n }\n\n /**\n * Compress data.\n *\n * @param {(Buffer|String)} data Data to compress\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @private\n */\n _compress(data, fin, callback) {\n const endpoint = this._isServer ? 'server' : 'client';\n\n if (!this._deflate) {\n const key = `${endpoint}_max_window_bits`;\n const windowBits =\n typeof this.params[key] !== 'number'\n ? zlib.Z_DEFAULT_WINDOWBITS\n : this.params[key];\n\n this._deflate = zlib.createDeflateRaw({\n ...this._options.zlibDeflateOptions,\n windowBits\n });\n\n this._deflate[kTotalLength] = 0;\n this._deflate[kBuffers] = [];\n\n this._deflate.on('data', deflateOnData);\n }\n\n this._deflate[kCallback] = callback;\n\n this._deflate.write(data);\n this._deflate.flush(zlib.Z_SYNC_FLUSH, () => {\n if (!this._deflate) {\n //\n // The deflate stream was closed while data was being processed.\n //\n return;\n }\n\n let data = bufferUtil.concat(\n this._deflate[kBuffers],\n this._deflate[kTotalLength]\n );\n\n if (fin) {\n data = new FastBuffer(data.buffer, data.byteOffset, data.length - 4);\n }\n\n //\n // Ensure that the callback will not be called again in\n // `PerMessageDeflate#cleanup()`.\n //\n this._deflate[kCallback] = null;\n\n this._deflate[kTotalLength] = 0;\n this._deflate[kBuffers] = [];\n\n if (fin && this.params[`${endpoint}_no_context_takeover`]) {\n this._deflate.reset();\n }\n\n callback(null, data);\n });\n }\n}\n\nmodule.exports = PerMessageDeflate;\n\n/**\n * The listener of the `zlib.DeflateRaw` stream `'data'` event.\n *\n * @param {Buffer} chunk A chunk of data\n * @private\n */\nfunction deflateOnData(chunk) {\n this[kBuffers].push(chunk);\n this[kTotalLength] += chunk.length;\n}\n\n/**\n * The listener of the `zlib.InflateRaw` stream `'data'` event.\n *\n * @param {Buffer} chunk A chunk of data\n * @private\n */\nfunction inflateOnData(chunk) {\n this[kTotalLength] += chunk.length;\n\n if (\n this[kPerMessageDeflate]._maxPayload < 1 ||\n this[kTotalLength] <= this[kPerMessageDeflate]._maxPayload\n ) {\n this[kBuffers].push(chunk);\n return;\n }\n\n this[kError] = new RangeError('Max payload size exceeded');\n this[kError].code = 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH';\n this[kError][kStatusCode] = 1009;\n this.removeListener('data', inflateOnData);\n\n //\n // The choice to employ `zlib.reset()` over `zlib.close()` is dictated by the\n // fact that in Node.js versions prior to 13.10.0, the callback for\n // `zlib.flush()` is not called if `zlib.close()` is used. Utilizing\n // `zlib.reset()` ensures that either the callback is invoked or an error is\n // emitted.\n //\n this.reset();\n}\n\n/**\n * The listener of the `zlib.InflateRaw` stream `'error'` event.\n *\n * @param {Error} err The emitted error\n * @private\n */\nfunction inflateOnError(err) {\n //\n // There is no need to call `Zlib#close()` as the handle is automatically\n // closed when an error is emitted.\n //\n this[kPerMessageDeflate]._inflate = null;\n\n if (this[kError]) {\n this[kCallback](this[kError]);\n return;\n }\n\n err[kStatusCode] = 1007;\n this[kCallback](err);\n}\n", "'use strict';\n\nconst { isUtf8 } = require('buffer');\n\nconst { hasBlob } = require('./constants');\n\n//\n// Allowed token characters:\n//\n// '!', '#', '$', '%', '&', ''', '*', '+', '-',\n// '.', 0-9, A-Z, '^', '_', '`', a-z, '|', '~'\n//\n// tokenChars[32] === 0 // ' '\n// tokenChars[33] === 1 // '!'\n// tokenChars[34] === 0 // '\"'\n// ...\n//\n// prettier-ignore\nconst tokenChars = [\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0 - 15\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16 - 31\n 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, // 32 - 47\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, // 48 - 63\n 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 64 - 79\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, // 80 - 95\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 96 - 111\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0 // 112 - 127\n];\n\n/**\n * Checks if a status code is allowed in a close frame.\n *\n * @param {Number} code The status code\n * @return {Boolean} `true` if the status code is valid, else `false`\n * @public\n */\nfunction isValidStatusCode(code) {\n return (\n (code >= 1000 &&\n code <= 1014 &&\n code !== 1004 &&\n code !== 1005 &&\n code !== 1006) ||\n (code >= 3000 && code <= 4999)\n );\n}\n\n/**\n * Checks if a given buffer contains only correct UTF-8.\n * Ported from https://www.cl.cam.ac.uk/%7Emgk25/ucs/utf8_check.c by\n * Markus Kuhn.\n *\n * @param {Buffer} buf The buffer to check\n * @return {Boolean} `true` if `buf` contains only correct UTF-8, else `false`\n * @public\n */\nfunction _isValidUTF8(buf) {\n const len = buf.length;\n let i = 0;\n\n while (i < len) {\n if ((buf[i] & 0x80) === 0) {\n // 0xxxxxxx\n i++;\n } else if ((buf[i] & 0xe0) === 0xc0) {\n // 110xxxxx 10xxxxxx\n if (\n i + 1 === len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i] & 0xfe) === 0xc0 // Overlong\n ) {\n return false;\n }\n\n i += 2;\n } else if ((buf[i] & 0xf0) === 0xe0) {\n // 1110xxxx 10xxxxxx 10xxxxxx\n if (\n i + 2 >= len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i + 2] & 0xc0) !== 0x80 ||\n (buf[i] === 0xe0 && (buf[i + 1] & 0xe0) === 0x80) || // Overlong\n (buf[i] === 0xed && (buf[i + 1] & 0xe0) === 0xa0) // Surrogate (U+D800 - U+DFFF)\n ) {\n return false;\n }\n\n i += 3;\n } else if ((buf[i] & 0xf8) === 0xf0) {\n // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx\n if (\n i + 3 >= len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i + 2] & 0xc0) !== 0x80 ||\n (buf[i + 3] & 0xc0) !== 0x80 ||\n (buf[i] === 0xf0 && (buf[i + 1] & 0xf0) === 0x80) || // Overlong\n (buf[i] === 0xf4 && buf[i + 1] > 0x8f) ||\n buf[i] > 0xf4 // > U+10FFFF\n ) {\n return false;\n }\n\n i += 4;\n } else {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Determines whether a value is a `Blob`.\n *\n * @param {*} value The value to be tested\n * @return {Boolean} `true` if `value` is a `Blob`, else `false`\n * @private\n */\nfunction isBlob(value) {\n return (\n hasBlob &&\n typeof value === 'object' &&\n typeof value.arrayBuffer === 'function' &&\n typeof value.type === 'string' &&\n typeof value.stream === 'function' &&\n (value[Symbol.toStringTag] === 'Blob' ||\n value[Symbol.toStringTag] === 'File')\n );\n}\n\nmodule.exports = {\n isBlob,\n isValidStatusCode,\n isValidUTF8: _isValidUTF8,\n tokenChars\n};\n\nif (isUtf8) {\n module.exports.isValidUTF8 = function (buf) {\n return buf.length < 24 ? _isValidUTF8(buf) : isUtf8(buf);\n };\n} /* istanbul ignore else */ else if (!process.env.WS_NO_UTF_8_VALIDATE) {\n try {\n const isValidUTF8 = require('utf-8-validate');\n\n module.exports.isValidUTF8 = function (buf) {\n return buf.length < 32 ? _isValidUTF8(buf) : isValidUTF8(buf);\n };\n } catch (e) {\n // Continue regardless of the error.\n }\n}\n", "'use strict';\n\nconst { Writable } = require('stream');\n\nconst PerMessageDeflate = require('./permessage-deflate');\nconst {\n BINARY_TYPES,\n EMPTY_BUFFER,\n kStatusCode,\n kWebSocket\n} = require('./constants');\nconst { concat, toArrayBuffer, unmask } = require('./buffer-util');\nconst { isValidStatusCode, isValidUTF8 } = require('./validation');\n\nconst FastBuffer = Buffer[Symbol.species];\n\nconst GET_INFO = 0;\nconst GET_PAYLOAD_LENGTH_16 = 1;\nconst GET_PAYLOAD_LENGTH_64 = 2;\nconst GET_MASK = 3;\nconst GET_DATA = 4;\nconst INFLATING = 5;\nconst DEFER_EVENT = 6;\n\n/**\n * HyBi Receiver implementation.\n *\n * @extends Writable\n */\nclass Receiver extends Writable {\n /**\n * Creates a Receiver instance.\n *\n * @param {Object} [options] Options object\n * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether\n * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted\n * multiple times in the same tick\n * @param {String} [options.binaryType=nodebuffer] The type for binary data\n * @param {Object} [options.extensions] An object containing the negotiated\n * extensions\n * @param {Boolean} [options.isServer=false] Specifies whether to operate in\n * client or server mode\n * @param {Number} [options.maxPayload=0] The maximum allowed message length\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n */\n constructor(options = {}) {\n super();\n\n this._allowSynchronousEvents =\n options.allowSynchronousEvents !== undefined\n ? options.allowSynchronousEvents\n : true;\n this._binaryType = options.binaryType || BINARY_TYPES[0];\n this._extensions = options.extensions || {};\n this._isServer = !!options.isServer;\n this._maxPayload = options.maxPayload | 0;\n this._skipUTF8Validation = !!options.skipUTF8Validation;\n this[kWebSocket] = undefined;\n\n this._bufferedBytes = 0;\n this._buffers = [];\n\n this._compressed = false;\n this._payloadLength = 0;\n this._mask = undefined;\n this._fragmented = 0;\n this._masked = false;\n this._fin = false;\n this._opcode = 0;\n\n this._totalPayloadLength = 0;\n this._messageLength = 0;\n this._fragments = [];\n\n this._errored = false;\n this._loop = false;\n this._state = GET_INFO;\n }\n\n /**\n * Implements `Writable.prototype._write()`.\n *\n * @param {Buffer} chunk The chunk of data to write\n * @param {String} encoding The character encoding of `chunk`\n * @param {Function} cb Callback\n * @private\n */\n _write(chunk, encoding, cb) {\n if (this._opcode === 0x08 && this._state == GET_INFO) return cb();\n\n this._bufferedBytes += chunk.length;\n this._buffers.push(chunk);\n this.startLoop(cb);\n }\n\n /**\n * Consumes `n` bytes from the buffered data.\n *\n * @param {Number} n The number of bytes to consume\n * @return {Buffer} The consumed bytes\n * @private\n */\n consume(n) {\n this._bufferedBytes -= n;\n\n if (n === this._buffers[0].length) return this._buffers.shift();\n\n if (n < this._buffers[0].length) {\n const buf = this._buffers[0];\n this._buffers[0] = new FastBuffer(\n buf.buffer,\n buf.byteOffset + n,\n buf.length - n\n );\n\n return new FastBuffer(buf.buffer, buf.byteOffset, n);\n }\n\n const dst = Buffer.allocUnsafe(n);\n\n do {\n const buf = this._buffers[0];\n const offset = dst.length - n;\n\n if (n >= buf.length) {\n dst.set(this._buffers.shift(), offset);\n } else {\n dst.set(new Uint8Array(buf.buffer, buf.byteOffset, n), offset);\n this._buffers[0] = new FastBuffer(\n buf.buffer,\n buf.byteOffset + n,\n buf.length - n\n );\n }\n\n n -= buf.length;\n } while (n > 0);\n\n return dst;\n }\n\n /**\n * Starts the parsing loop.\n *\n * @param {Function} cb Callback\n * @private\n */\n startLoop(cb) {\n this._loop = true;\n\n do {\n switch (this._state) {\n case GET_INFO:\n this.getInfo(cb);\n break;\n case GET_PAYLOAD_LENGTH_16:\n this.getPayloadLength16(cb);\n break;\n case GET_PAYLOAD_LENGTH_64:\n this.getPayloadLength64(cb);\n break;\n case GET_MASK:\n this.getMask();\n break;\n case GET_DATA:\n this.getData(cb);\n break;\n case INFLATING:\n case DEFER_EVENT:\n this._loop = false;\n return;\n }\n } while (this._loop);\n\n if (!this._errored) cb();\n }\n\n /**\n * Reads the first two bytes of a frame.\n *\n * @param {Function} cb Callback\n * @private\n */\n getInfo(cb) {\n if (this._bufferedBytes < 2) {\n this._loop = false;\n return;\n }\n\n const buf = this.consume(2);\n\n if ((buf[0] & 0x30) !== 0x00) {\n const error = this.createError(\n RangeError,\n 'RSV2 and RSV3 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_2_3'\n );\n\n cb(error);\n return;\n }\n\n const compressed = (buf[0] & 0x40) === 0x40;\n\n if (compressed && !this._extensions[PerMessageDeflate.extensionName]) {\n const error = this.createError(\n RangeError,\n 'RSV1 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_1'\n );\n\n cb(error);\n return;\n }\n\n this._fin = (buf[0] & 0x80) === 0x80;\n this._opcode = buf[0] & 0x0f;\n this._payloadLength = buf[1] & 0x7f;\n\n if (this._opcode === 0x00) {\n if (compressed) {\n const error = this.createError(\n RangeError,\n 'RSV1 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_1'\n );\n\n cb(error);\n return;\n }\n\n if (!this._fragmented) {\n const error = this.createError(\n RangeError,\n 'invalid opcode 0',\n true,\n 1002,\n 'WS_ERR_INVALID_OPCODE'\n );\n\n cb(error);\n return;\n }\n\n this._opcode = this._fragmented;\n } else if (this._opcode === 0x01 || this._opcode === 0x02) {\n if (this._fragmented) {\n const error = this.createError(\n RangeError,\n `invalid opcode ${this._opcode}`,\n true,\n 1002,\n 'WS_ERR_INVALID_OPCODE'\n );\n\n cb(error);\n return;\n }\n\n this._compressed = compressed;\n } else if (this._opcode > 0x07 && this._opcode < 0x0b) {\n if (!this._fin) {\n const error = this.createError(\n RangeError,\n 'FIN must be set',\n true,\n 1002,\n 'WS_ERR_EXPECTED_FIN'\n );\n\n cb(error);\n return;\n }\n\n if (compressed) {\n const error = this.createError(\n RangeError,\n 'RSV1 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_1'\n );\n\n cb(error);\n return;\n }\n\n if (\n this._payloadLength > 0x7d ||\n (this._opcode === 0x08 && this._payloadLength === 1)\n ) {\n const error = this.createError(\n RangeError,\n `invalid payload length ${this._payloadLength}`,\n true,\n 1002,\n 'WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH'\n );\n\n cb(error);\n return;\n }\n } else {\n const error = this.createError(\n RangeError,\n `invalid opcode ${this._opcode}`,\n true,\n 1002,\n 'WS_ERR_INVALID_OPCODE'\n );\n\n cb(error);\n return;\n }\n\n if (!this._fin && !this._fragmented) this._fragmented = this._opcode;\n this._masked = (buf[1] & 0x80) === 0x80;\n\n if (this._isServer) {\n if (!this._masked) {\n const error = this.createError(\n RangeError,\n 'MASK must be set',\n true,\n 1002,\n 'WS_ERR_EXPECTED_MASK'\n );\n\n cb(error);\n return;\n }\n } else if (this._masked) {\n const error = this.createError(\n RangeError,\n 'MASK must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_MASK'\n );\n\n cb(error);\n return;\n }\n\n if (this._payloadLength === 126) this._state = GET_PAYLOAD_LENGTH_16;\n else if (this._payloadLength === 127) this._state = GET_PAYLOAD_LENGTH_64;\n else this.haveLength(cb);\n }\n\n /**\n * Gets extended payload length (7+16).\n *\n * @param {Function} cb Callback\n * @private\n */\n getPayloadLength16(cb) {\n if (this._bufferedBytes < 2) {\n this._loop = false;\n return;\n }\n\n this._payloadLength = this.consume(2).readUInt16BE(0);\n this.haveLength(cb);\n }\n\n /**\n * Gets extended payload length (7+64).\n *\n * @param {Function} cb Callback\n * @private\n */\n getPayloadLength64(cb) {\n if (this._bufferedBytes < 8) {\n this._loop = false;\n return;\n }\n\n const buf = this.consume(8);\n const num = buf.readUInt32BE(0);\n\n //\n // The maximum safe integer in JavaScript is 2^53 - 1. An error is returned\n // if payload length is greater than this number.\n //\n if (num > Math.pow(2, 53 - 32) - 1) {\n const error = this.createError(\n RangeError,\n 'Unsupported WebSocket frame: payload length > 2^53 - 1',\n false,\n 1009,\n 'WS_ERR_UNSUPPORTED_DATA_PAYLOAD_LENGTH'\n );\n\n cb(error);\n return;\n }\n\n this._payloadLength = num * Math.pow(2, 32) + buf.readUInt32BE(4);\n this.haveLength(cb);\n }\n\n /**\n * Payload length has been read.\n *\n * @param {Function} cb Callback\n * @private\n */\n haveLength(cb) {\n if (this._payloadLength && this._opcode < 0x08) {\n this._totalPayloadLength += this._payloadLength;\n if (this._totalPayloadLength > this._maxPayload && this._maxPayload > 0) {\n const error = this.createError(\n RangeError,\n 'Max payload size exceeded',\n false,\n 1009,\n 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH'\n );\n\n cb(error);\n return;\n }\n }\n\n if (this._masked) this._state = GET_MASK;\n else this._state = GET_DATA;\n }\n\n /**\n * Reads mask bytes.\n *\n * @private\n */\n getMask() {\n if (this._bufferedBytes < 4) {\n this._loop = false;\n return;\n }\n\n this._mask = this.consume(4);\n this._state = GET_DATA;\n }\n\n /**\n * Reads data bytes.\n *\n * @param {Function} cb Callback\n * @private\n */\n getData(cb) {\n let data = EMPTY_BUFFER;\n\n if (this._payloadLength) {\n if (this._bufferedBytes < this._payloadLength) {\n this._loop = false;\n return;\n }\n\n data = this.consume(this._payloadLength);\n\n if (\n this._masked &&\n (this._mask[0] | this._mask[1] | this._mask[2] | this._mask[3]) !== 0\n ) {\n unmask(data, this._mask);\n }\n }\n\n if (this._opcode > 0x07) {\n this.controlMessage(data, cb);\n return;\n }\n\n if (this._compressed) {\n this._state = INFLATING;\n this.decompress(data, cb);\n return;\n }\n\n if (data.length) {\n //\n // This message is not compressed so its length is the sum of the payload\n // length of all fragments.\n //\n this._messageLength = this._totalPayloadLength;\n this._fragments.push(data);\n }\n\n this.dataMessage(cb);\n }\n\n /**\n * Decompresses data.\n *\n * @param {Buffer} data Compressed data\n * @param {Function} cb Callback\n * @private\n */\n decompress(data, cb) {\n const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n\n perMessageDeflate.decompress(data, this._fin, (err, buf) => {\n if (err) return cb(err);\n\n if (buf.length) {\n this._messageLength += buf.length;\n if (this._messageLength > this._maxPayload && this._maxPayload > 0) {\n const error = this.createError(\n RangeError,\n 'Max payload size exceeded',\n false,\n 1009,\n 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH'\n );\n\n cb(error);\n return;\n }\n\n this._fragments.push(buf);\n }\n\n this.dataMessage(cb);\n if (this._state === GET_INFO) this.startLoop(cb);\n });\n }\n\n /**\n * Handles a data message.\n *\n * @param {Function} cb Callback\n * @private\n */\n dataMessage(cb) {\n if (!this._fin) {\n this._state = GET_INFO;\n return;\n }\n\n const messageLength = this._messageLength;\n const fragments = this._fragments;\n\n this._totalPayloadLength = 0;\n this._messageLength = 0;\n this._fragmented = 0;\n this._fragments = [];\n\n if (this._opcode === 2) {\n let data;\n\n if (this._binaryType === 'nodebuffer') {\n data = concat(fragments, messageLength);\n } else if (this._binaryType === 'arraybuffer') {\n data = toArrayBuffer(concat(fragments, messageLength));\n } else if (this._binaryType === 'blob') {\n data = new Blob(fragments);\n } else {\n data = fragments;\n }\n\n if (this._allowSynchronousEvents) {\n this.emit('message', data, true);\n this._state = GET_INFO;\n } else {\n this._state = DEFER_EVENT;\n setImmediate(() => {\n this.emit('message', data, true);\n this._state = GET_INFO;\n this.startLoop(cb);\n });\n }\n } else {\n const buf = concat(fragments, messageLength);\n\n if (!this._skipUTF8Validation && !isValidUTF8(buf)) {\n const error = this.createError(\n Error,\n 'invalid UTF-8 sequence',\n true,\n 1007,\n 'WS_ERR_INVALID_UTF8'\n );\n\n cb(error);\n return;\n }\n\n if (this._state === INFLATING || this._allowSynchronousEvents) {\n this.emit('message', buf, false);\n this._state = GET_INFO;\n } else {\n this._state = DEFER_EVENT;\n setImmediate(() => {\n this.emit('message', buf, false);\n this._state = GET_INFO;\n this.startLoop(cb);\n });\n }\n }\n }\n\n /**\n * Handles a control message.\n *\n * @param {Buffer} data Data to handle\n * @return {(Error|RangeError|undefined)} A possible error\n * @private\n */\n controlMessage(data, cb) {\n if (this._opcode === 0x08) {\n if (data.length === 0) {\n this._loop = false;\n this.emit('conclude', 1005, EMPTY_BUFFER);\n this.end();\n } else {\n const code = data.readUInt16BE(0);\n\n if (!isValidStatusCode(code)) {\n const error = this.createError(\n RangeError,\n `invalid status code ${code}`,\n true,\n 1002,\n 'WS_ERR_INVALID_CLOSE_CODE'\n );\n\n cb(error);\n return;\n }\n\n const buf = new FastBuffer(\n data.buffer,\n data.byteOffset + 2,\n data.length - 2\n );\n\n if (!this._skipUTF8Validation && !isValidUTF8(buf)) {\n const error = this.createError(\n Error,\n 'invalid UTF-8 sequence',\n true,\n 1007,\n 'WS_ERR_INVALID_UTF8'\n );\n\n cb(error);\n return;\n }\n\n this._loop = false;\n this.emit('conclude', code, buf);\n this.end();\n }\n\n this._state = GET_INFO;\n return;\n }\n\n if (this._allowSynchronousEvents) {\n this.emit(this._opcode === 0x09 ? 'ping' : 'pong', data);\n this._state = GET_INFO;\n } else {\n this._state = DEFER_EVENT;\n setImmediate(() => {\n this.emit(this._opcode === 0x09 ? 'ping' : 'pong', data);\n this._state = GET_INFO;\n this.startLoop(cb);\n });\n }\n }\n\n /**\n * Builds an error object.\n *\n * @param {function(new:Error|RangeError)} ErrorCtor The error constructor\n * @param {String} message The error message\n * @param {Boolean} prefix Specifies whether or not to add a default prefix to\n * `message`\n * @param {Number} statusCode The status code\n * @param {String} errorCode The exposed error code\n * @return {(Error|RangeError)} The error\n * @private\n */\n createError(ErrorCtor, message, prefix, statusCode, errorCode) {\n this._loop = false;\n this._errored = true;\n\n const err = new ErrorCtor(\n prefix ? `Invalid WebSocket frame: ${message}` : message\n );\n\n Error.captureStackTrace(err, this.createError);\n err.code = errorCode;\n err[kStatusCode] = statusCode;\n return err;\n }\n}\n\nmodule.exports = Receiver;\n", "/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^Duplex\" }] */\n\n'use strict';\n\nconst { Duplex } = require('stream');\nconst { randomFillSync } = require('crypto');\n\nconst PerMessageDeflate = require('./permessage-deflate');\nconst { EMPTY_BUFFER, kWebSocket, NOOP } = require('./constants');\nconst { isBlob, isValidStatusCode } = require('./validation');\nconst { mask: applyMask, toBuffer } = require('./buffer-util');\n\nconst kByteLength = Symbol('kByteLength');\nconst maskBuffer = Buffer.alloc(4);\nconst RANDOM_POOL_SIZE = 8 * 1024;\nlet randomPool;\nlet randomPoolPointer = RANDOM_POOL_SIZE;\n\nconst DEFAULT = 0;\nconst DEFLATING = 1;\nconst GET_BLOB_DATA = 2;\n\n/**\n * HyBi Sender implementation.\n */\nclass Sender {\n /**\n * Creates a Sender instance.\n *\n * @param {Duplex} socket The connection socket\n * @param {Object} [extensions] An object containing the negotiated extensions\n * @param {Function} [generateMask] The function used to generate the masking\n * key\n */\n constructor(socket, extensions, generateMask) {\n this._extensions = extensions || {};\n\n if (generateMask) {\n this._generateMask = generateMask;\n this._maskBuffer = Buffer.alloc(4);\n }\n\n this._socket = socket;\n\n this._firstFragment = true;\n this._compress = false;\n\n this._bufferedBytes = 0;\n this._queue = [];\n this._state = DEFAULT;\n this.onerror = NOOP;\n this[kWebSocket] = undefined;\n }\n\n /**\n * Frames a piece of data according to the HyBi WebSocket protocol.\n *\n * @param {(Buffer|String)} data The data to frame\n * @param {Object} options Options object\n * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n * FIN bit\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Buffer} [options.maskBuffer] The buffer used to store the masking\n * key\n * @param {Number} options.opcode The opcode\n * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n * modified\n * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n * RSV1 bit\n * @return {(Buffer|String)[]} The framed data\n * @public\n */\n static frame(data, options) {\n let mask;\n let merge = false;\n let offset = 2;\n let skipMasking = false;\n\n if (options.mask) {\n mask = options.maskBuffer || maskBuffer;\n\n if (options.generateMask) {\n options.generateMask(mask);\n } else {\n if (randomPoolPointer === RANDOM_POOL_SIZE) {\n /* istanbul ignore else */\n if (randomPool === undefined) {\n //\n // This is lazily initialized because server-sent frames must not\n // be masked so it may never be used.\n //\n randomPool = Buffer.alloc(RANDOM_POOL_SIZE);\n }\n\n randomFillSync(randomPool, 0, RANDOM_POOL_SIZE);\n randomPoolPointer = 0;\n }\n\n mask[0] = randomPool[randomPoolPointer++];\n mask[1] = randomPool[randomPoolPointer++];\n mask[2] = randomPool[randomPoolPointer++];\n mask[3] = randomPool[randomPoolPointer++];\n }\n\n skipMasking = (mask[0] | mask[1] | mask[2] | mask[3]) === 0;\n offset = 6;\n }\n\n let dataLength;\n\n if (typeof data === 'string') {\n if (\n (!options.mask || skipMasking) &&\n options[kByteLength] !== undefined\n ) {\n dataLength = options[kByteLength];\n } else {\n data = Buffer.from(data);\n dataLength = data.length;\n }\n } else {\n dataLength = data.length;\n merge = options.mask && options.readOnly && !skipMasking;\n }\n\n let payloadLength = dataLength;\n\n if (dataLength >= 65536) {\n offset += 8;\n payloadLength = 127;\n } else if (dataLength > 125) {\n offset += 2;\n payloadLength = 126;\n }\n\n const target = Buffer.allocUnsafe(merge ? dataLength + offset : offset);\n\n target[0] = options.fin ? options.opcode | 0x80 : options.opcode;\n if (options.rsv1) target[0] |= 0x40;\n\n target[1] = payloadLength;\n\n if (payloadLength === 126) {\n target.writeUInt16BE(dataLength, 2);\n } else if (payloadLength === 127) {\n target[2] = target[3] = 0;\n target.writeUIntBE(dataLength, 4, 6);\n }\n\n if (!options.mask) return [target, data];\n\n target[1] |= 0x80;\n target[offset - 4] = mask[0];\n target[offset - 3] = mask[1];\n target[offset - 2] = mask[2];\n target[offset - 1] = mask[3];\n\n if (skipMasking) return [target, data];\n\n if (merge) {\n applyMask(data, mask, target, offset, dataLength);\n return [target];\n }\n\n applyMask(data, mask, data, 0, dataLength);\n return [target, data];\n }\n\n /**\n * Sends a close message to the other peer.\n *\n * @param {Number} [code] The status code component of the body\n * @param {(String|Buffer)} [data] The message component of the body\n * @param {Boolean} [mask=false] Specifies whether or not to mask the message\n * @param {Function} [cb] Callback\n * @public\n */\n close(code, data, mask, cb) {\n let buf;\n\n if (code === undefined) {\n buf = EMPTY_BUFFER;\n } else if (typeof code !== 'number' || !isValidStatusCode(code)) {\n throw new TypeError('First argument must be a valid error code number');\n } else if (data === undefined || !data.length) {\n buf = Buffer.allocUnsafe(2);\n buf.writeUInt16BE(code, 0);\n } else {\n const length = Buffer.byteLength(data);\n\n if (length > 123) {\n throw new RangeError('The message must not be greater than 123 bytes');\n }\n\n buf = Buffer.allocUnsafe(2 + length);\n buf.writeUInt16BE(code, 0);\n\n if (typeof data === 'string') {\n buf.write(data, 2);\n } else {\n buf.set(data, 2);\n }\n }\n\n const options = {\n [kByteLength]: buf.length,\n fin: true,\n generateMask: this._generateMask,\n mask,\n maskBuffer: this._maskBuffer,\n opcode: 0x08,\n readOnly: false,\n rsv1: false\n };\n\n if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, buf, false, options, cb]);\n } else {\n this.sendFrame(Sender.frame(buf, options), cb);\n }\n }\n\n /**\n * Sends a ping message to the other peer.\n *\n * @param {*} data The message to send\n * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n * @param {Function} [cb] Callback\n * @public\n */\n ping(data, mask, cb) {\n let byteLength;\n let readOnly;\n\n if (typeof data === 'string') {\n byteLength = Buffer.byteLength(data);\n readOnly = false;\n } else if (isBlob(data)) {\n byteLength = data.size;\n readOnly = false;\n } else {\n data = toBuffer(data);\n byteLength = data.length;\n readOnly = toBuffer.readOnly;\n }\n\n if (byteLength > 125) {\n throw new RangeError('The data size must not be greater than 125 bytes');\n }\n\n const options = {\n [kByteLength]: byteLength,\n fin: true,\n generateMask: this._generateMask,\n mask,\n maskBuffer: this._maskBuffer,\n opcode: 0x09,\n readOnly,\n rsv1: false\n };\n\n if (isBlob(data)) {\n if (this._state !== DEFAULT) {\n this.enqueue([this.getBlobData, data, false, options, cb]);\n } else {\n this.getBlobData(data, false, options, cb);\n }\n } else if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, data, false, options, cb]);\n } else {\n this.sendFrame(Sender.frame(data, options), cb);\n }\n }\n\n /**\n * Sends a pong message to the other peer.\n *\n * @param {*} data The message to send\n * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n * @param {Function} [cb] Callback\n * @public\n */\n pong(data, mask, cb) {\n let byteLength;\n let readOnly;\n\n if (typeof data === 'string') {\n byteLength = Buffer.byteLength(data);\n readOnly = false;\n } else if (isBlob(data)) {\n byteLength = data.size;\n readOnly = false;\n } else {\n data = toBuffer(data);\n byteLength = data.length;\n readOnly = toBuffer.readOnly;\n }\n\n if (byteLength > 125) {\n throw new RangeError('The data size must not be greater than 125 bytes');\n }\n\n const options = {\n [kByteLength]: byteLength,\n fin: true,\n generateMask: this._generateMask,\n mask,\n maskBuffer: this._maskBuffer,\n opcode: 0x0a,\n readOnly,\n rsv1: false\n };\n\n if (isBlob(data)) {\n if (this._state !== DEFAULT) {\n this.enqueue([this.getBlobData, data, false, options, cb]);\n } else {\n this.getBlobData(data, false, options, cb);\n }\n } else if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, data, false, options, cb]);\n } else {\n this.sendFrame(Sender.frame(data, options), cb);\n }\n }\n\n /**\n * Sends a data message to the other peer.\n *\n * @param {*} data The message to send\n * @param {Object} options Options object\n * @param {Boolean} [options.binary=false] Specifies whether `data` is binary\n * or text\n * @param {Boolean} [options.compress=false] Specifies whether or not to\n * compress `data`\n * @param {Boolean} [options.fin=false] Specifies whether the fragment is the\n * last one\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Function} [cb] Callback\n * @public\n */\n send(data, options, cb) {\n const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n let opcode = options.binary ? 2 : 1;\n let rsv1 = options.compress;\n\n let byteLength;\n let readOnly;\n\n if (typeof data === 'string') {\n byteLength = Buffer.byteLength(data);\n readOnly = false;\n } else if (isBlob(data)) {\n byteLength = data.size;\n readOnly = false;\n } else {\n data = toBuffer(data);\n byteLength = data.length;\n readOnly = toBuffer.readOnly;\n }\n\n if (this._firstFragment) {\n this._firstFragment = false;\n if (\n rsv1 &&\n perMessageDeflate &&\n perMessageDeflate.params[\n perMessageDeflate._isServer\n ? 'server_no_context_takeover'\n : 'client_no_context_takeover'\n ]\n ) {\n rsv1 = byteLength >= perMessageDeflate._threshold;\n }\n this._compress = rsv1;\n } else {\n rsv1 = false;\n opcode = 0;\n }\n\n if (options.fin) this._firstFragment = true;\n\n const opts = {\n [kByteLength]: byteLength,\n fin: options.fin,\n generateMask: this._generateMask,\n mask: options.mask,\n maskBuffer: this._maskBuffer,\n opcode,\n readOnly,\n rsv1\n };\n\n if (isBlob(data)) {\n if (this._state !== DEFAULT) {\n this.enqueue([this.getBlobData, data, this._compress, opts, cb]);\n } else {\n this.getBlobData(data, this._compress, opts, cb);\n }\n } else if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, data, this._compress, opts, cb]);\n } else {\n this.dispatch(data, this._compress, opts, cb);\n }\n }\n\n /**\n * Gets the contents of a blob as binary data.\n *\n * @param {Blob} blob The blob\n * @param {Boolean} [compress=false] Specifies whether or not to compress\n * the data\n * @param {Object} options Options object\n * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n * FIN bit\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Buffer} [options.maskBuffer] The buffer used to store the masking\n * key\n * @param {Number} options.opcode The opcode\n * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n * modified\n * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n * RSV1 bit\n * @param {Function} [cb] Callback\n * @private\n */\n getBlobData(blob, compress, options, cb) {\n this._bufferedBytes += options[kByteLength];\n this._state = GET_BLOB_DATA;\n\n blob\n .arrayBuffer()\n .then((arrayBuffer) => {\n if (this._socket.destroyed) {\n const err = new Error(\n 'The socket was closed while the blob was being read'\n );\n\n //\n // `callCallbacks` is called in the next tick to ensure that errors\n // that might be thrown in the callbacks behave like errors thrown\n // outside the promise chain.\n //\n process.nextTick(callCallbacks, this, err, cb);\n return;\n }\n\n this._bufferedBytes -= options[kByteLength];\n const data = toBuffer(arrayBuffer);\n\n if (!compress) {\n this._state = DEFAULT;\n this.sendFrame(Sender.frame(data, options), cb);\n this.dequeue();\n } else {\n this.dispatch(data, compress, options, cb);\n }\n })\n .catch((err) => {\n //\n // `onError` is called in the next tick for the same reason that\n // `callCallbacks` above is.\n //\n process.nextTick(onError, this, err, cb);\n });\n }\n\n /**\n * Dispatches a message.\n *\n * @param {(Buffer|String)} data The message to send\n * @param {Boolean} [compress=false] Specifies whether or not to compress\n * `data`\n * @param {Object} options Options object\n * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n * FIN bit\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Buffer} [options.maskBuffer] The buffer used to store the masking\n * key\n * @param {Number} options.opcode The opcode\n * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n * modified\n * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n * RSV1 bit\n * @param {Function} [cb] Callback\n * @private\n */\n dispatch(data, compress, options, cb) {\n if (!compress) {\n this.sendFrame(Sender.frame(data, options), cb);\n return;\n }\n\n const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n\n this._bufferedBytes += options[kByteLength];\n this._state = DEFLATING;\n perMessageDeflate.compress(data, options.fin, (_, buf) => {\n if (this._socket.destroyed) {\n const err = new Error(\n 'The socket was closed while data was being compressed'\n );\n\n callCallbacks(this, err, cb);\n return;\n }\n\n this._bufferedBytes -= options[kByteLength];\n this._state = DEFAULT;\n options.readOnly = false;\n this.sendFrame(Sender.frame(buf, options), cb);\n this.dequeue();\n });\n }\n\n /**\n * Executes queued send operations.\n *\n * @private\n */\n dequeue() {\n while (this._state === DEFAULT && this._queue.length) {\n const params = this._queue.shift();\n\n this._bufferedBytes -= params[3][kByteLength];\n Reflect.apply(params[0], this, params.slice(1));\n }\n }\n\n /**\n * Enqueues a send operation.\n *\n * @param {Array} params Send operation parameters.\n * @private\n */\n enqueue(params) {\n this._bufferedBytes += params[3][kByteLength];\n this._queue.push(params);\n }\n\n /**\n * Sends a frame.\n *\n * @param {(Buffer | String)[]} list The frame to send\n * @param {Function} [cb] Callback\n * @private\n */\n sendFrame(list, cb) {\n if (list.length === 2) {\n this._socket.cork();\n this._socket.write(list[0]);\n this._socket.write(list[1], cb);\n this._socket.uncork();\n } else {\n this._socket.write(list[0], cb);\n }\n }\n}\n\nmodule.exports = Sender;\n\n/**\n * Calls queued callbacks with an error.\n *\n * @param {Sender} sender The `Sender` instance\n * @param {Error} err The error to call the callbacks with\n * @param {Function} [cb] The first callback\n * @private\n */\nfunction callCallbacks(sender, err, cb) {\n if (typeof cb === 'function') cb(err);\n\n for (let i = 0; i < sender._queue.length; i++) {\n const params = sender._queue[i];\n const callback = params[params.length - 1];\n\n if (typeof callback === 'function') callback(err);\n }\n}\n\n/**\n * Handles a `Sender` error.\n *\n * @param {Sender} sender The `Sender` instance\n * @param {Error} err The error\n * @param {Function} [cb] The first pending callback\n * @private\n */\nfunction onError(sender, err, cb) {\n callCallbacks(sender, err, cb);\n sender.onerror(err);\n}\n", "'use strict';\n\nconst { kForOnEventAttribute, kListener } = require('./constants');\n\nconst kCode = Symbol('kCode');\nconst kData = Symbol('kData');\nconst kError = Symbol('kError');\nconst kMessage = Symbol('kMessage');\nconst kReason = Symbol('kReason');\nconst kTarget = Symbol('kTarget');\nconst kType = Symbol('kType');\nconst kWasClean = Symbol('kWasClean');\n\n/**\n * Class representing an event.\n */\nclass Event {\n /**\n * Create a new `Event`.\n *\n * @param {String} type The name of the event\n * @throws {TypeError} If the `type` argument is not specified\n */\n constructor(type) {\n this[kTarget] = null;\n this[kType] = type;\n }\n\n /**\n * @type {*}\n */\n get target() {\n return this[kTarget];\n }\n\n /**\n * @type {String}\n */\n get type() {\n return this[kType];\n }\n}\n\nObject.defineProperty(Event.prototype, 'target', { enumerable: true });\nObject.defineProperty(Event.prototype, 'type', { enumerable: true });\n\n/**\n * Class representing a close event.\n *\n * @extends Event\n */\nclass CloseEvent extends Event {\n /**\n * Create a new `CloseEvent`.\n *\n * @param {String} type The name of the event\n * @param {Object} [options] A dictionary object that allows for setting\n * attributes via object members of the same name\n * @param {Number} [options.code=0] The status code explaining why the\n * connection was closed\n * @param {String} [options.reason=''] A human-readable string explaining why\n * the connection was closed\n * @param {Boolean} [options.wasClean=false] Indicates whether or not the\n * connection was cleanly closed\n */\n constructor(type, options = {}) {\n super(type);\n\n this[kCode] = options.code === undefined ? 0 : options.code;\n this[kReason] = options.reason === undefined ? '' : options.reason;\n this[kWasClean] = options.wasClean === undefined ? false : options.wasClean;\n }\n\n /**\n * @type {Number}\n */\n get code() {\n return this[kCode];\n }\n\n /**\n * @type {String}\n */\n get reason() {\n return this[kReason];\n }\n\n /**\n * @type {Boolean}\n */\n get wasClean() {\n return this[kWasClean];\n }\n}\n\nObject.defineProperty(CloseEvent.prototype, 'code', { enumerable: true });\nObject.defineProperty(CloseEvent.prototype, 'reason', { enumerable: true });\nObject.defineProperty(CloseEvent.prototype, 'wasClean', { enumerable: true });\n\n/**\n * Class representing an error event.\n *\n * @extends Event\n */\nclass ErrorEvent extends Event {\n /**\n * Create a new `ErrorEvent`.\n *\n * @param {String} type The name of the event\n * @param {Object} [options] A dictionary object that allows for setting\n * attributes via object members of the same name\n * @param {*} [options.error=null] The error that generated this event\n * @param {String} [options.message=''] The error message\n */\n constructor(type, options = {}) {\n super(type);\n\n this[kError] = options.error === undefined ? null : options.error;\n this[kMessage] = options.message === undefined ? '' : options.message;\n }\n\n /**\n * @type {*}\n */\n get error() {\n return this[kError];\n }\n\n /**\n * @type {String}\n */\n get message() {\n return this[kMessage];\n }\n}\n\nObject.defineProperty(ErrorEvent.prototype, 'error', { enumerable: true });\nObject.defineProperty(ErrorEvent.prototype, 'message', { enumerable: true });\n\n/**\n * Class representing a message event.\n *\n * @extends Event\n */\nclass MessageEvent extends Event {\n /**\n * Create a new `MessageEvent`.\n *\n * @param {String} type The name of the event\n * @param {Object} [options] A dictionary object that allows for setting\n * attributes via object members of the same name\n * @param {*} [options.data=null] The message content\n */\n constructor(type, options = {}) {\n super(type);\n\n this[kData] = options.data === undefined ? null : options.data;\n }\n\n /**\n * @type {*}\n */\n get data() {\n return this[kData];\n }\n}\n\nObject.defineProperty(MessageEvent.prototype, 'data', { enumerable: true });\n\n/**\n * This provides methods for emulating the `EventTarget` interface. It's not\n * meant to be used directly.\n *\n * @mixin\n */\nconst EventTarget = {\n /**\n * Register an event listener.\n *\n * @param {String} type A string representing the event type to listen for\n * @param {(Function|Object)} handler The listener to add\n * @param {Object} [options] An options object specifies characteristics about\n * the event listener\n * @param {Boolean} [options.once=false] A `Boolean` indicating that the\n * listener should be invoked at most once after being added. If `true`,\n * the listener would be automatically removed when invoked.\n * @public\n */\n addEventListener(type, handler, options = {}) {\n for (const listener of this.listeners(type)) {\n if (\n !options[kForOnEventAttribute] &&\n listener[kListener] === handler &&\n !listener[kForOnEventAttribute]\n ) {\n return;\n }\n }\n\n let wrapper;\n\n if (type === 'message') {\n wrapper = function onMessage(data, isBinary) {\n const event = new MessageEvent('message', {\n data: isBinary ? data : data.toString()\n });\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else if (type === 'close') {\n wrapper = function onClose(code, message) {\n const event = new CloseEvent('close', {\n code,\n reason: message.toString(),\n wasClean: this._closeFrameReceived && this._closeFrameSent\n });\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else if (type === 'error') {\n wrapper = function onError(error) {\n const event = new ErrorEvent('error', {\n error,\n message: error.message\n });\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else if (type === 'open') {\n wrapper = function onOpen() {\n const event = new Event('open');\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else {\n return;\n }\n\n wrapper[kForOnEventAttribute] = !!options[kForOnEventAttribute];\n wrapper[kListener] = handler;\n\n if (options.once) {\n this.once(type, wrapper);\n } else {\n this.on(type, wrapper);\n }\n },\n\n /**\n * Remove an event listener.\n *\n * @param {String} type A string representing the event type to remove\n * @param {(Function|Object)} handler The listener to remove\n * @public\n */\n removeEventListener(type, handler) {\n for (const listener of this.listeners(type)) {\n if (listener[kListener] === handler && !listener[kForOnEventAttribute]) {\n this.removeListener(type, listener);\n break;\n }\n }\n }\n};\n\nmodule.exports = {\n CloseEvent,\n ErrorEvent,\n Event,\n EventTarget,\n MessageEvent\n};\n\n/**\n * Call an event listener\n *\n * @param {(Function|Object)} listener The listener to call\n * @param {*} thisArg The value to use as `this`` when calling the listener\n * @param {Event} event The event to pass to the listener\n * @private\n */\nfunction callListener(listener, thisArg, event) {\n if (typeof listener === 'object' && listener.handleEvent) {\n listener.handleEvent.call(listener, event);\n } else {\n listener.call(thisArg, event);\n }\n}\n", "'use strict';\n\nconst { tokenChars } = require('./validation');\n\n/**\n * Adds an offer to the map of extension offers or a parameter to the map of\n * parameters.\n *\n * @param {Object} dest The map of extension offers or parameters\n * @param {String} name The extension or parameter name\n * @param {(Object|Boolean|String)} elem The extension parameters or the\n * parameter value\n * @private\n */\nfunction push(dest, name, elem) {\n if (dest[name] === undefined) dest[name] = [elem];\n else dest[name].push(elem);\n}\n\n/**\n * Parses the `Sec-WebSocket-Extensions` header into an object.\n *\n * @param {String} header The field value of the header\n * @return {Object} The parsed object\n * @public\n */\nfunction parse(header) {\n const offers = Object.create(null);\n let params = Object.create(null);\n let mustUnescape = false;\n let isEscaping = false;\n let inQuotes = false;\n let extensionName;\n let paramName;\n let start = -1;\n let code = -1;\n let end = -1;\n let i = 0;\n\n for (; i < header.length; i++) {\n code = header.charCodeAt(i);\n\n if (extensionName === undefined) {\n if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (\n i !== 0 &&\n (code === 0x20 /* ' ' */ || code === 0x09) /* '\\t' */\n ) {\n if (end === -1 && start !== -1) end = i;\n } else if (code === 0x3b /* ';' */ || code === 0x2c /* ',' */) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n const name = header.slice(start, end);\n if (code === 0x2c) {\n push(offers, name, params);\n params = Object.create(null);\n } else {\n extensionName = name;\n }\n\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n } else if (paramName === undefined) {\n if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (code === 0x20 || code === 0x09) {\n if (end === -1 && start !== -1) end = i;\n } else if (code === 0x3b || code === 0x2c) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n push(params, header.slice(start, end), true);\n if (code === 0x2c) {\n push(offers, extensionName, params);\n params = Object.create(null);\n extensionName = undefined;\n }\n\n start = end = -1;\n } else if (code === 0x3d /* '=' */ && start !== -1 && end === -1) {\n paramName = header.slice(start, i);\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n } else {\n //\n // The value of a quoted-string after unescaping must conform to the\n // token ABNF, so only token characters are valid.\n // Ref: https://tools.ietf.org/html/rfc6455#section-9.1\n //\n if (isEscaping) {\n if (tokenChars[code] !== 1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n if (start === -1) start = i;\n else if (!mustUnescape) mustUnescape = true;\n isEscaping = false;\n } else if (inQuotes) {\n if (tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (code === 0x22 /* '\"' */ && start !== -1) {\n inQuotes = false;\n end = i;\n } else if (code === 0x5c /* '\\' */) {\n isEscaping = true;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n } else if (code === 0x22 && header.charCodeAt(i - 1) === 0x3d) {\n inQuotes = true;\n } else if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (start !== -1 && (code === 0x20 || code === 0x09)) {\n if (end === -1) end = i;\n } else if (code === 0x3b || code === 0x2c) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n let value = header.slice(start, end);\n if (mustUnescape) {\n value = value.replace(/\\\\/g, '');\n mustUnescape = false;\n }\n push(params, paramName, value);\n if (code === 0x2c) {\n push(offers, extensionName, params);\n params = Object.create(null);\n extensionName = undefined;\n }\n\n paramName = undefined;\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n }\n }\n\n if (start === -1 || inQuotes || code === 0x20 || code === 0x09) {\n throw new SyntaxError('Unexpected end of input');\n }\n\n if (end === -1) end = i;\n const token = header.slice(start, end);\n if (extensionName === undefined) {\n push(offers, token, params);\n } else {\n if (paramName === undefined) {\n push(params, token, true);\n } else if (mustUnescape) {\n push(params, paramName, token.replace(/\\\\/g, ''));\n } else {\n push(params, paramName, token);\n }\n push(offers, extensionName, params);\n }\n\n return offers;\n}\n\n/**\n * Builds the `Sec-WebSocket-Extensions` header field value.\n *\n * @param {Object} extensions The map of extensions and parameters to format\n * @return {String} A string representing the given object\n * @public\n */\nfunction format(extensions) {\n return Object.keys(extensions)\n .map((extension) => {\n let configurations = extensions[extension];\n if (!Array.isArray(configurations)) configurations = [configurations];\n return configurations\n .map((params) => {\n return [extension]\n .concat(\n Object.keys(params).map((k) => {\n let values = params[k];\n if (!Array.isArray(values)) values = [values];\n return values\n .map((v) => (v === true ? k : `${k}=${v}`))\n .join('; ');\n })\n )\n .join('; ');\n })\n .join(', ');\n })\n .join(', ');\n}\n\nmodule.exports = { format, parse };\n", "/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^Duplex|Readable$\", \"caughtErrors\": \"none\" }] */\n\n'use strict';\n\nconst EventEmitter = require('events');\nconst https = require('https');\nconst http = require('http');\nconst net = require('net');\nconst tls = require('tls');\nconst { randomBytes, createHash } = require('crypto');\nconst { Duplex, Readable } = require('stream');\nconst { URL } = require('url');\n\nconst PerMessageDeflate = require('./permessage-deflate');\nconst Receiver = require('./receiver');\nconst Sender = require('./sender');\nconst { isBlob } = require('./validation');\n\nconst {\n BINARY_TYPES,\n CLOSE_TIMEOUT,\n EMPTY_BUFFER,\n GUID,\n kForOnEventAttribute,\n kListener,\n kStatusCode,\n kWebSocket,\n NOOP\n} = require('./constants');\nconst {\n EventTarget: { addEventListener, removeEventListener }\n} = require('./event-target');\nconst { format, parse } = require('./extension');\nconst { toBuffer } = require('./buffer-util');\n\nconst kAborted = Symbol('kAborted');\nconst protocolVersions = [8, 13];\nconst readyStates = ['CONNECTING', 'OPEN', 'CLOSING', 'CLOSED'];\nconst subprotocolRegex = /^[!#$%&'*+\\-.0-9A-Z^_`|a-z~]+$/;\n\n/**\n * Class representing a WebSocket.\n *\n * @extends EventEmitter\n */\nclass WebSocket extends EventEmitter {\n /**\n * Create a new `WebSocket`.\n *\n * @param {(String|URL)} address The URL to which to connect\n * @param {(String|String[])} [protocols] The subprotocols\n * @param {Object} [options] Connection options\n */\n constructor(address, protocols, options) {\n super();\n\n this._binaryType = BINARY_TYPES[0];\n this._closeCode = 1006;\n this._closeFrameReceived = false;\n this._closeFrameSent = false;\n this._closeMessage = EMPTY_BUFFER;\n this._closeTimer = null;\n this._errorEmitted = false;\n this._extensions = {};\n this._paused = false;\n this._protocol = '';\n this._readyState = WebSocket.CONNECTING;\n this._receiver = null;\n this._sender = null;\n this._socket = null;\n\n if (address !== null) {\n this._bufferedAmount = 0;\n this._isServer = false;\n this._redirects = 0;\n\n if (protocols === undefined) {\n protocols = [];\n } else if (!Array.isArray(protocols)) {\n if (typeof protocols === 'object' && protocols !== null) {\n options = protocols;\n protocols = [];\n } else {\n protocols = [protocols];\n }\n }\n\n initAsClient(this, address, protocols, options);\n } else {\n this._autoPong = options.autoPong;\n this._closeTimeout = options.closeTimeout;\n this._isServer = true;\n }\n }\n\n /**\n * For historical reasons, the custom \"nodebuffer\" type is used by the default\n * instead of \"blob\".\n *\n * @type {String}\n */\n get binaryType() {\n return this._binaryType;\n }\n\n set binaryType(type) {\n if (!BINARY_TYPES.includes(type)) return;\n\n this._binaryType = type;\n\n //\n // Allow to change `binaryType` on the fly.\n //\n if (this._receiver) this._receiver._binaryType = type;\n }\n\n /**\n * @type {Number}\n */\n get bufferedAmount() {\n if (!this._socket) return this._bufferedAmount;\n\n return this._socket._writableState.length + this._sender._bufferedBytes;\n }\n\n /**\n * @type {String}\n */\n get extensions() {\n return Object.keys(this._extensions).join();\n }\n\n /**\n * @type {Boolean}\n */\n get isPaused() {\n return this._paused;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onclose() {\n return null;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onerror() {\n return null;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onopen() {\n return null;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onmessage() {\n return null;\n }\n\n /**\n * @type {String}\n */\n get protocol() {\n return this._protocol;\n }\n\n /**\n * @type {Number}\n */\n get readyState() {\n return this._readyState;\n }\n\n /**\n * @type {String}\n */\n get url() {\n return this._url;\n }\n\n /**\n * Set up the socket and the internal resources.\n *\n * @param {Duplex} socket The network socket between the server and client\n * @param {Buffer} head The first packet of the upgraded stream\n * @param {Object} options Options object\n * @param {Boolean} [options.allowSynchronousEvents=false] Specifies whether\n * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted\n * multiple times in the same tick\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Number} [options.maxPayload=0] The maximum allowed message size\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n * @private\n */\n setSocket(socket, head, options) {\n const receiver = new Receiver({\n allowSynchronousEvents: options.allowSynchronousEvents,\n binaryType: this.binaryType,\n extensions: this._extensions,\n isServer: this._isServer,\n maxPayload: options.maxPayload,\n skipUTF8Validation: options.skipUTF8Validation\n });\n\n const sender = new Sender(socket, this._extensions, options.generateMask);\n\n this._receiver = receiver;\n this._sender = sender;\n this._socket = socket;\n\n receiver[kWebSocket] = this;\n sender[kWebSocket] = this;\n socket[kWebSocket] = this;\n\n receiver.on('conclude', receiverOnConclude);\n receiver.on('drain', receiverOnDrain);\n receiver.on('error', receiverOnError);\n receiver.on('message', receiverOnMessage);\n receiver.on('ping', receiverOnPing);\n receiver.on('pong', receiverOnPong);\n\n sender.onerror = senderOnError;\n\n //\n // These methods may not be available if `socket` is just a `Duplex`.\n //\n if (socket.setTimeout) socket.setTimeout(0);\n if (socket.setNoDelay) socket.setNoDelay();\n\n if (head.length > 0) socket.unshift(head);\n\n socket.on('close', socketOnClose);\n socket.on('data', socketOnData);\n socket.on('end', socketOnEnd);\n socket.on('error', socketOnError);\n\n this._readyState = WebSocket.OPEN;\n this.emit('open');\n }\n\n /**\n * Emit the `'close'` event.\n *\n * @private\n */\n emitClose() {\n if (!this._socket) {\n this._readyState = WebSocket.CLOSED;\n this.emit('close', this._closeCode, this._closeMessage);\n return;\n }\n\n if (this._extensions[PerMessageDeflate.extensionName]) {\n this._extensions[PerMessageDeflate.extensionName].cleanup();\n }\n\n this._receiver.removeAllListeners();\n this._readyState = WebSocket.CLOSED;\n this.emit('close', this._closeCode, this._closeMessage);\n }\n\n /**\n * Start a closing handshake.\n *\n * +----------+ +-----------+ +----------+\n * - - -|ws.close()|-->|close frame|-->|ws.close()|- - -\n * | +----------+ +-----------+ +----------+ |\n * +----------+ +-----------+ |\n * CLOSING |ws.close()|<--|close frame|<--+-----+ CLOSING\n * +----------+ +-----------+ |\n * | | | +---+ |\n * +------------------------+-->|fin| - - - -\n * | +---+ | +---+\n * - - - - -|fin|<---------------------+\n * +---+\n *\n * @param {Number} [code] Status code explaining why the connection is closing\n * @param {(String|Buffer)} [data] The reason why the connection is\n * closing\n * @public\n */\n close(code, data) {\n if (this.readyState === WebSocket.CLOSED) return;\n if (this.readyState === WebSocket.CONNECTING) {\n const msg = 'WebSocket was closed before the connection was established';\n abortHandshake(this, this._req, msg);\n return;\n }\n\n if (this.readyState === WebSocket.CLOSING) {\n if (\n this._closeFrameSent &&\n (this._closeFrameReceived || this._receiver._writableState.errorEmitted)\n ) {\n this._socket.end();\n }\n\n return;\n }\n\n this._readyState = WebSocket.CLOSING;\n this._sender.close(code, data, !this._isServer, (err) => {\n //\n // This error is handled by the `'error'` listener on the socket. We only\n // want to know if the close frame has been sent here.\n //\n if (err) return;\n\n this._closeFrameSent = true;\n\n if (\n this._closeFrameReceived ||\n this._receiver._writableState.errorEmitted\n ) {\n this._socket.end();\n }\n });\n\n setCloseTimer(this);\n }\n\n /**\n * Pause the socket.\n *\n * @public\n */\n pause() {\n if (\n this.readyState === WebSocket.CONNECTING ||\n this.readyState === WebSocket.CLOSED\n ) {\n return;\n }\n\n this._paused = true;\n this._socket.pause();\n }\n\n /**\n * Send a ping.\n *\n * @param {*} [data] The data to send\n * @param {Boolean} [mask] Indicates whether or not to mask `data`\n * @param {Function} [cb] Callback which is executed when the ping is sent\n * @public\n */\n ping(data, mask, cb) {\n if (this.readyState === WebSocket.CONNECTING) {\n throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');\n }\n\n if (typeof data === 'function') {\n cb = data;\n data = mask = undefined;\n } else if (typeof mask === 'function') {\n cb = mask;\n mask = undefined;\n }\n\n if (typeof data === 'number') data = data.toString();\n\n if (this.readyState !== WebSocket.OPEN) {\n sendAfterClose(this, data, cb);\n return;\n }\n\n if (mask === undefined) mask = !this._isServer;\n this._sender.ping(data || EMPTY_BUFFER, mask, cb);\n }\n\n /**\n * Send a pong.\n *\n * @param {*} [data] The data to send\n * @param {Boolean} [mask] Indicates whether or not to mask `data`\n * @param {Function} [cb] Callback which is executed when the pong is sent\n * @public\n */\n pong(data, mask, cb) {\n if (this.readyState === WebSocket.CONNECTING) {\n throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');\n }\n\n if (typeof data === 'function') {\n cb = data;\n data = mask = undefined;\n } else if (typeof mask === 'function') {\n cb = mask;\n mask = undefined;\n }\n\n if (typeof data === 'number') data = data.toString();\n\n if (this.readyState !== WebSocket.OPEN) {\n sendAfterClose(this, data, cb);\n return;\n }\n\n if (mask === undefined) mask = !this._isServer;\n this._sender.pong(data || EMPTY_BUFFER, mask, cb);\n }\n\n /**\n * Resume the socket.\n *\n * @public\n */\n resume() {\n if (\n this.readyState === WebSocket.CONNECTING ||\n this.readyState === WebSocket.CLOSED\n ) {\n return;\n }\n\n this._paused = false;\n if (!this._receiver._writableState.needDrain) this._socket.resume();\n }\n\n /**\n * Send a data message.\n *\n * @param {*} data The message to send\n * @param {Object} [options] Options object\n * @param {Boolean} [options.binary] Specifies whether `data` is binary or\n * text\n * @param {Boolean} [options.compress] Specifies whether or not to compress\n * `data`\n * @param {Boolean} [options.fin=true] Specifies whether the fragment is the\n * last one\n * @param {Boolean} [options.mask] Specifies whether or not to mask `data`\n * @param {Function} [cb] Callback which is executed when data is written out\n * @public\n */\n send(data, options, cb) {\n if (this.readyState === WebSocket.CONNECTING) {\n throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');\n }\n\n if (typeof options === 'function') {\n cb = options;\n options = {};\n }\n\n if (typeof data === 'number') data = data.toString();\n\n if (this.readyState !== WebSocket.OPEN) {\n sendAfterClose(this, data, cb);\n return;\n }\n\n const opts = {\n binary: typeof data !== 'string',\n mask: !this._isServer,\n compress: true,\n fin: true,\n ...options\n };\n\n if (!this._extensions[PerMessageDeflate.extensionName]) {\n opts.compress = false;\n }\n\n this._sender.send(data || EMPTY_BUFFER, opts, cb);\n }\n\n /**\n * Forcibly close the connection.\n *\n * @public\n */\n terminate() {\n if (this.readyState === WebSocket.CLOSED) return;\n if (this.readyState === WebSocket.CONNECTING) {\n const msg = 'WebSocket was closed before the connection was established';\n abortHandshake(this, this._req, msg);\n return;\n }\n\n if (this._socket) {\n this._readyState = WebSocket.CLOSING;\n this._socket.destroy();\n }\n }\n}\n\n/**\n * @constant {Number} CONNECTING\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'CONNECTING', {\n enumerable: true,\n value: readyStates.indexOf('CONNECTING')\n});\n\n/**\n * @constant {Number} CONNECTING\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'CONNECTING', {\n enumerable: true,\n value: readyStates.indexOf('CONNECTING')\n});\n\n/**\n * @constant {Number} OPEN\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'OPEN', {\n enumerable: true,\n value: readyStates.indexOf('OPEN')\n});\n\n/**\n * @constant {Number} OPEN\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'OPEN', {\n enumerable: true,\n value: readyStates.indexOf('OPEN')\n});\n\n/**\n * @constant {Number} CLOSING\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'CLOSING', {\n enumerable: true,\n value: readyStates.indexOf('CLOSING')\n});\n\n/**\n * @constant {Number} CLOSING\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'CLOSING', {\n enumerable: true,\n value: readyStates.indexOf('CLOSING')\n});\n\n/**\n * @constant {Number} CLOSED\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'CLOSED', {\n enumerable: true,\n value: readyStates.indexOf('CLOSED')\n});\n\n/**\n * @constant {Number} CLOSED\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'CLOSED', {\n enumerable: true,\n value: readyStates.indexOf('CLOSED')\n});\n\n[\n 'binaryType',\n 'bufferedAmount',\n 'extensions',\n 'isPaused',\n 'protocol',\n 'readyState',\n 'url'\n].forEach((property) => {\n Object.defineProperty(WebSocket.prototype, property, { enumerable: true });\n});\n\n//\n// Add the `onopen`, `onerror`, `onclose`, and `onmessage` attributes.\n// See https://html.spec.whatwg.org/multipage/comms.html#the-websocket-interface\n//\n['open', 'error', 'close', 'message'].forEach((method) => {\n Object.defineProperty(WebSocket.prototype, `on${method}`, {\n enumerable: true,\n get() {\n for (const listener of this.listeners(method)) {\n if (listener[kForOnEventAttribute]) return listener[kListener];\n }\n\n return null;\n },\n set(handler) {\n for (const listener of this.listeners(method)) {\n if (listener[kForOnEventAttribute]) {\n this.removeListener(method, listener);\n break;\n }\n }\n\n if (typeof handler !== 'function') return;\n\n this.addEventListener(method, handler, {\n [kForOnEventAttribute]: true\n });\n }\n });\n});\n\nWebSocket.prototype.addEventListener = addEventListener;\nWebSocket.prototype.removeEventListener = removeEventListener;\n\nmodule.exports = WebSocket;\n\n/**\n * Initialize a WebSocket client.\n *\n * @param {WebSocket} websocket The client to initialize\n * @param {(String|URL)} address The URL to which to connect\n * @param {Array} protocols The subprotocols\n * @param {Object} [options] Connection options\n * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether any\n * of the `'message'`, `'ping'`, and `'pong'` events can be emitted multiple\n * times in the same tick\n * @param {Boolean} [options.autoPong=true] Specifies whether or not to\n * automatically send a pong in response to a ping\n * @param {Number} [options.closeTimeout=30000] Duration in milliseconds to wait\n * for the closing handshake to finish after `websocket.close()` is called\n * @param {Function} [options.finishRequest] A function which can be used to\n * customize the headers of each http request before it is sent\n * @param {Boolean} [options.followRedirects=false] Whether or not to follow\n * redirects\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Number} [options.handshakeTimeout] Timeout in milliseconds for the\n * handshake request\n * @param {Number} [options.maxPayload=104857600] The maximum allowed message\n * size\n * @param {Number} [options.maxRedirects=10] The maximum number of redirects\n * allowed\n * @param {String} [options.origin] Value of the `Origin` or\n * `Sec-WebSocket-Origin` header\n * @param {(Boolean|Object)} [options.perMessageDeflate=true] Enable/disable\n * permessage-deflate\n * @param {Number} [options.protocolVersion=13] Value of the\n * `Sec-WebSocket-Version` header\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n * @private\n */\nfunction initAsClient(websocket, address, protocols, options) {\n const opts = {\n allowSynchronousEvents: true,\n autoPong: true,\n closeTimeout: CLOSE_TIMEOUT,\n protocolVersion: protocolVersions[1],\n maxPayload: 100 * 1024 * 1024,\n skipUTF8Validation: false,\n perMessageDeflate: true,\n followRedirects: false,\n maxRedirects: 10,\n ...options,\n socketPath: undefined,\n hostname: undefined,\n protocol: undefined,\n timeout: undefined,\n method: 'GET',\n host: undefined,\n path: undefined,\n port: undefined\n };\n\n websocket._autoPong = opts.autoPong;\n websocket._closeTimeout = opts.closeTimeout;\n\n if (!protocolVersions.includes(opts.protocolVersion)) {\n throw new RangeError(\n `Unsupported protocol version: ${opts.protocolVersion} ` +\n `(supported versions: ${protocolVersions.join(', ')})`\n );\n }\n\n let parsedUrl;\n\n if (address instanceof URL) {\n parsedUrl = address;\n } else {\n try {\n parsedUrl = new URL(address);\n } catch {\n throw new SyntaxError(`Invalid URL: ${address}`);\n }\n }\n\n if (parsedUrl.protocol === 'http:') {\n parsedUrl.protocol = 'ws:';\n } else if (parsedUrl.protocol === 'https:') {\n parsedUrl.protocol = 'wss:';\n }\n\n websocket._url = parsedUrl.href;\n\n const isSecure = parsedUrl.protocol === 'wss:';\n const isIpcUrl = parsedUrl.protocol === 'ws+unix:';\n let invalidUrlMessage;\n\n if (parsedUrl.protocol !== 'ws:' && !isSecure && !isIpcUrl) {\n invalidUrlMessage =\n 'The URL\\'s protocol must be one of \"ws:\", \"wss:\", ' +\n '\"http:\", \"https:\", or \"ws+unix:\"';\n } else if (isIpcUrl && !parsedUrl.pathname) {\n invalidUrlMessage = \"The URL's pathname is empty\";\n } else if (parsedUrl.hash) {\n invalidUrlMessage = 'The URL contains a fragment identifier';\n }\n\n if (invalidUrlMessage) {\n const err = new SyntaxError(invalidUrlMessage);\n\n if (websocket._redirects === 0) {\n throw err;\n } else {\n emitErrorAndClose(websocket, err);\n return;\n }\n }\n\n const defaultPort = isSecure ? 443 : 80;\n const key = randomBytes(16).toString('base64');\n const request = isSecure ? https.request : http.request;\n const protocolSet = new Set();\n let perMessageDeflate;\n\n opts.createConnection =\n opts.createConnection || (isSecure ? tlsConnect : netConnect);\n opts.defaultPort = opts.defaultPort || defaultPort;\n opts.port = parsedUrl.port || defaultPort;\n opts.host = parsedUrl.hostname.startsWith('[')\n ? parsedUrl.hostname.slice(1, -1)\n : parsedUrl.hostname;\n opts.headers = {\n ...opts.headers,\n 'Sec-WebSocket-Version': opts.protocolVersion,\n 'Sec-WebSocket-Key': key,\n Connection: 'Upgrade',\n Upgrade: 'websocket'\n };\n opts.path = parsedUrl.pathname + parsedUrl.search;\n opts.timeout = opts.handshakeTimeout;\n\n if (opts.perMessageDeflate) {\n perMessageDeflate = new PerMessageDeflate({\n ...opts.perMessageDeflate,\n isServer: false,\n maxPayload: opts.maxPayload\n });\n opts.headers['Sec-WebSocket-Extensions'] = format({\n [PerMessageDeflate.extensionName]: perMessageDeflate.offer()\n });\n }\n if (protocols.length) {\n for (const protocol of protocols) {\n if (\n typeof protocol !== 'string' ||\n !subprotocolRegex.test(protocol) ||\n protocolSet.has(protocol)\n ) {\n throw new SyntaxError(\n 'An invalid or duplicated subprotocol was specified'\n );\n }\n\n protocolSet.add(protocol);\n }\n\n opts.headers['Sec-WebSocket-Protocol'] = protocols.join(',');\n }\n if (opts.origin) {\n if (opts.protocolVersion < 13) {\n opts.headers['Sec-WebSocket-Origin'] = opts.origin;\n } else {\n opts.headers.Origin = opts.origin;\n }\n }\n if (parsedUrl.username || parsedUrl.password) {\n opts.auth = `${parsedUrl.username}:${parsedUrl.password}`;\n }\n\n if (isIpcUrl) {\n const parts = opts.path.split(':');\n\n opts.socketPath = parts[0];\n opts.path = parts[1];\n }\n\n let req;\n\n if (opts.followRedirects) {\n if (websocket._redirects === 0) {\n websocket._originalIpc = isIpcUrl;\n websocket._originalSecure = isSecure;\n websocket._originalHostOrSocketPath = isIpcUrl\n ? opts.socketPath\n : parsedUrl.host;\n\n const headers = options && options.headers;\n\n //\n // Shallow copy the user provided options so that headers can be changed\n // without mutating the original object.\n //\n options = { ...options, headers: {} };\n\n if (headers) {\n for (const [key, value] of Object.entries(headers)) {\n options.headers[key.toLowerCase()] = value;\n }\n }\n } else if (websocket.listenerCount('redirect') === 0) {\n const isSameHost = isIpcUrl\n ? websocket._originalIpc\n ? opts.socketPath === websocket._originalHostOrSocketPath\n : false\n : websocket._originalIpc\n ? false\n : parsedUrl.host === websocket._originalHostOrSocketPath;\n\n if (!isSameHost || (websocket._originalSecure && !isSecure)) {\n //\n // Match curl 7.77.0 behavior and drop the following headers. These\n // headers are also dropped when following a redirect to a subdomain.\n //\n delete opts.headers.authorization;\n delete opts.headers.cookie;\n\n if (!isSameHost) delete opts.headers.host;\n\n opts.auth = undefined;\n }\n }\n\n //\n // Match curl 7.77.0 behavior and make the first `Authorization` header win.\n // If the `Authorization` header is set, then there is nothing to do as it\n // will take precedence.\n //\n if (opts.auth && !options.headers.authorization) {\n options.headers.authorization =\n 'Basic ' + Buffer.from(opts.auth).toString('base64');\n }\n\n req = websocket._req = request(opts);\n\n if (websocket._redirects) {\n //\n // Unlike what is done for the `'upgrade'` event, no early exit is\n // triggered here if the user calls `websocket.close()` or\n // `websocket.terminate()` from a listener of the `'redirect'` event. This\n // is because the user can also call `request.destroy()` with an error\n // before calling `websocket.close()` or `websocket.terminate()` and this\n // would result in an error being emitted on the `request` object with no\n // `'error'` event listeners attached.\n //\n websocket.emit('redirect', websocket.url, req);\n }\n } else {\n req = websocket._req = request(opts);\n }\n\n if (opts.timeout) {\n req.on('timeout', () => {\n abortHandshake(websocket, req, 'Opening handshake has timed out');\n });\n }\n\n req.on('error', (err) => {\n if (req === null || req[kAborted]) return;\n\n req = websocket._req = null;\n emitErrorAndClose(websocket, err);\n });\n\n req.on('response', (res) => {\n const location = res.headers.location;\n const statusCode = res.statusCode;\n\n if (\n location &&\n opts.followRedirects &&\n statusCode >= 300 &&\n statusCode < 400\n ) {\n if (++websocket._redirects > opts.maxRedirects) {\n abortHandshake(websocket, req, 'Maximum redirects exceeded');\n return;\n }\n\n req.abort();\n\n let addr;\n\n try {\n addr = new URL(location, address);\n } catch (e) {\n const err = new SyntaxError(`Invalid URL: ${location}`);\n emitErrorAndClose(websocket, err);\n return;\n }\n\n initAsClient(websocket, addr, protocols, options);\n } else if (!websocket.emit('unexpected-response', req, res)) {\n abortHandshake(\n websocket,\n req,\n `Unexpected server response: ${res.statusCode}`\n );\n }\n });\n\n req.on('upgrade', (res, socket, head) => {\n websocket.emit('upgrade', res);\n\n //\n // The user may have closed the connection from a listener of the\n // `'upgrade'` event.\n //\n if (websocket.readyState !== WebSocket.CONNECTING) return;\n\n req = websocket._req = null;\n\n const upgrade = res.headers.upgrade;\n\n if (upgrade === undefined || upgrade.toLowerCase() !== 'websocket') {\n abortHandshake(websocket, socket, 'Invalid Upgrade header');\n return;\n }\n\n const digest = createHash('sha1')\n .update(key + GUID)\n .digest('base64');\n\n if (res.headers['sec-websocket-accept'] !== digest) {\n abortHandshake(websocket, socket, 'Invalid Sec-WebSocket-Accept header');\n return;\n }\n\n const serverProt = res.headers['sec-websocket-protocol'];\n let protError;\n\n if (serverProt !== undefined) {\n if (!protocolSet.size) {\n protError = 'Server sent a subprotocol but none was requested';\n } else if (!protocolSet.has(serverProt)) {\n protError = 'Server sent an invalid subprotocol';\n }\n } else if (protocolSet.size) {\n protError = 'Server sent no subprotocol';\n }\n\n if (protError) {\n abortHandshake(websocket, socket, protError);\n return;\n }\n\n if (serverProt) websocket._protocol = serverProt;\n\n const secWebSocketExtensions = res.headers['sec-websocket-extensions'];\n\n if (secWebSocketExtensions !== undefined) {\n if (!perMessageDeflate) {\n const message =\n 'Server sent a Sec-WebSocket-Extensions header but no extension ' +\n 'was requested';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n let extensions;\n\n try {\n extensions = parse(secWebSocketExtensions);\n } catch (err) {\n const message = 'Invalid Sec-WebSocket-Extensions header';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n const extensionNames = Object.keys(extensions);\n\n if (\n extensionNames.length !== 1 ||\n extensionNames[0] !== PerMessageDeflate.extensionName\n ) {\n const message = 'Server indicated an extension that was not requested';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n try {\n perMessageDeflate.accept(extensions[PerMessageDeflate.extensionName]);\n } catch (err) {\n const message = 'Invalid Sec-WebSocket-Extensions header';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n websocket._extensions[PerMessageDeflate.extensionName] =\n perMessageDeflate;\n }\n\n websocket.setSocket(socket, head, {\n allowSynchronousEvents: opts.allowSynchronousEvents,\n generateMask: opts.generateMask,\n maxPayload: opts.maxPayload,\n skipUTF8Validation: opts.skipUTF8Validation\n });\n });\n\n if (opts.finishRequest) {\n opts.finishRequest(req, websocket);\n } else {\n req.end();\n }\n}\n\n/**\n * Emit the `'error'` and `'close'` events.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @param {Error} The error to emit\n * @private\n */\nfunction emitErrorAndClose(websocket, err) {\n websocket._readyState = WebSocket.CLOSING;\n //\n // The following assignment is practically useless and is done only for\n // consistency.\n //\n websocket._errorEmitted = true;\n websocket.emit('error', err);\n websocket.emitClose();\n}\n\n/**\n * Create a `net.Socket` and initiate a connection.\n *\n * @param {Object} options Connection options\n * @return {net.Socket} The newly created socket used to start the connection\n * @private\n */\nfunction netConnect(options) {\n options.path = options.socketPath;\n return net.connect(options);\n}\n\n/**\n * Create a `tls.TLSSocket` and initiate a connection.\n *\n * @param {Object} options Connection options\n * @return {tls.TLSSocket} The newly created socket used to start the connection\n * @private\n */\nfunction tlsConnect(options) {\n options.path = undefined;\n\n if (!options.servername && options.servername !== '') {\n options.servername = net.isIP(options.host) ? '' : options.host;\n }\n\n return tls.connect(options);\n}\n\n/**\n * Abort the handshake and emit an error.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @param {(http.ClientRequest|net.Socket|tls.Socket)} stream The request to\n * abort or the socket to destroy\n * @param {String} message The error message\n * @private\n */\nfunction abortHandshake(websocket, stream, message) {\n websocket._readyState = WebSocket.CLOSING;\n\n const err = new Error(message);\n Error.captureStackTrace(err, abortHandshake);\n\n if (stream.setHeader) {\n stream[kAborted] = true;\n stream.abort();\n\n if (stream.socket && !stream.socket.destroyed) {\n //\n // On Node.js >= 14.3.0 `request.abort()` does not destroy the socket if\n // called after the request completed. See\n // https://github.com/websockets/ws/issues/1869.\n //\n stream.socket.destroy();\n }\n\n process.nextTick(emitErrorAndClose, websocket, err);\n } else {\n stream.destroy(err);\n stream.once('error', websocket.emit.bind(websocket, 'error'));\n stream.once('close', websocket.emitClose.bind(websocket));\n }\n}\n\n/**\n * Handle cases where the `ping()`, `pong()`, or `send()` methods are called\n * when the `readyState` attribute is `CLOSING` or `CLOSED`.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @param {*} [data] The data to send\n * @param {Function} [cb] Callback\n * @private\n */\nfunction sendAfterClose(websocket, data, cb) {\n if (data) {\n const length = isBlob(data) ? data.size : toBuffer(data).length;\n\n //\n // The `_bufferedAmount` property is used only when the peer is a client and\n // the opening handshake fails. Under these circumstances, in fact, the\n // `setSocket()` method is not called, so the `_socket` and `_sender`\n // properties are set to `null`.\n //\n if (websocket._socket) websocket._sender._bufferedBytes += length;\n else websocket._bufferedAmount += length;\n }\n\n if (cb) {\n const err = new Error(\n `WebSocket is not open: readyState ${websocket.readyState} ` +\n `(${readyStates[websocket.readyState]})`\n );\n process.nextTick(cb, err);\n }\n}\n\n/**\n * The listener of the `Receiver` `'conclude'` event.\n *\n * @param {Number} code The status code\n * @param {Buffer} reason The reason for closing\n * @private\n */\nfunction receiverOnConclude(code, reason) {\n const websocket = this[kWebSocket];\n\n websocket._closeFrameReceived = true;\n websocket._closeMessage = reason;\n websocket._closeCode = code;\n\n if (websocket._socket[kWebSocket] === undefined) return;\n\n websocket._socket.removeListener('data', socketOnData);\n process.nextTick(resume, websocket._socket);\n\n if (code === 1005) websocket.close();\n else websocket.close(code, reason);\n}\n\n/**\n * The listener of the `Receiver` `'drain'` event.\n *\n * @private\n */\nfunction receiverOnDrain() {\n const websocket = this[kWebSocket];\n\n if (!websocket.isPaused) websocket._socket.resume();\n}\n\n/**\n * The listener of the `Receiver` `'error'` event.\n *\n * @param {(RangeError|Error)} err The emitted error\n * @private\n */\nfunction receiverOnError(err) {\n const websocket = this[kWebSocket];\n\n if (websocket._socket[kWebSocket] !== undefined) {\n websocket._socket.removeListener('data', socketOnData);\n\n //\n // On Node.js < 14.0.0 the `'error'` event is emitted synchronously. See\n // https://github.com/websockets/ws/issues/1940.\n //\n process.nextTick(resume, websocket._socket);\n\n websocket.close(err[kStatusCode]);\n }\n\n if (!websocket._errorEmitted) {\n websocket._errorEmitted = true;\n websocket.emit('error', err);\n }\n}\n\n/**\n * The listener of the `Receiver` `'finish'` event.\n *\n * @private\n */\nfunction receiverOnFinish() {\n this[kWebSocket].emitClose();\n}\n\n/**\n * The listener of the `Receiver` `'message'` event.\n *\n * @param {Buffer|ArrayBuffer|Buffer[])} data The message\n * @param {Boolean} isBinary Specifies whether the message is binary or not\n * @private\n */\nfunction receiverOnMessage(data, isBinary) {\n this[kWebSocket].emit('message', data, isBinary);\n}\n\n/**\n * The listener of the `Receiver` `'ping'` event.\n *\n * @param {Buffer} data The data included in the ping frame\n * @private\n */\nfunction receiverOnPing(data) {\n const websocket = this[kWebSocket];\n\n if (websocket._autoPong) websocket.pong(data, !this._isServer, NOOP);\n websocket.emit('ping', data);\n}\n\n/**\n * The listener of the `Receiver` `'pong'` event.\n *\n * @param {Buffer} data The data included in the pong frame\n * @private\n */\nfunction receiverOnPong(data) {\n this[kWebSocket].emit('pong', data);\n}\n\n/**\n * Resume a readable stream\n *\n * @param {Readable} stream The readable stream\n * @private\n */\nfunction resume(stream) {\n stream.resume();\n}\n\n/**\n * The `Sender` error event handler.\n *\n * @param {Error} The error\n * @private\n */\nfunction senderOnError(err) {\n const websocket = this[kWebSocket];\n\n if (websocket.readyState === WebSocket.CLOSED) return;\n if (websocket.readyState === WebSocket.OPEN) {\n websocket._readyState = WebSocket.CLOSING;\n setCloseTimer(websocket);\n }\n\n //\n // `socket.end()` is used instead of `socket.destroy()` to allow the other\n // peer to finish sending queued data. There is no need to set a timer here\n // because `CLOSING` means that it is already set or not needed.\n //\n this._socket.end();\n\n if (!websocket._errorEmitted) {\n websocket._errorEmitted = true;\n websocket.emit('error', err);\n }\n}\n\n/**\n * Set a timer to destroy the underlying raw socket of a WebSocket.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @private\n */\nfunction setCloseTimer(websocket) {\n websocket._closeTimer = setTimeout(\n websocket._socket.destroy.bind(websocket._socket),\n websocket._closeTimeout\n );\n}\n\n/**\n * The listener of the socket `'close'` event.\n *\n * @private\n */\nfunction socketOnClose() {\n const websocket = this[kWebSocket];\n\n this.removeListener('close', socketOnClose);\n this.removeListener('data', socketOnData);\n this.removeListener('end', socketOnEnd);\n\n websocket._readyState = WebSocket.CLOSING;\n\n //\n // The close frame might not have been received or the `'end'` event emitted,\n // for example, if the socket was destroyed due to an error. Ensure that the\n // `receiver` stream is closed after writing any remaining buffered data to\n // it. If the readable side of the socket is in flowing mode then there is no\n // buffered data as everything has been already written. If instead, the\n // socket is paused, any possible buffered data will be read as a single\n // chunk.\n //\n if (\n !this._readableState.endEmitted &&\n !websocket._closeFrameReceived &&\n !websocket._receiver._writableState.errorEmitted &&\n this._readableState.length !== 0\n ) {\n const chunk = this.read(this._readableState.length);\n\n websocket._receiver.write(chunk);\n }\n\n websocket._receiver.end();\n\n this[kWebSocket] = undefined;\n\n clearTimeout(websocket._closeTimer);\n\n if (\n websocket._receiver._writableState.finished ||\n websocket._receiver._writableState.errorEmitted\n ) {\n websocket.emitClose();\n } else {\n websocket._receiver.on('error', receiverOnFinish);\n websocket._receiver.on('finish', receiverOnFinish);\n }\n}\n\n/**\n * The listener of the socket `'data'` event.\n *\n * @param {Buffer} chunk A chunk of data\n * @private\n */\nfunction socketOnData(chunk) {\n if (!this[kWebSocket]._receiver.write(chunk)) {\n this.pause();\n }\n}\n\n/**\n * The listener of the socket `'end'` event.\n *\n * @private\n */\nfunction socketOnEnd() {\n const websocket = this[kWebSocket];\n\n websocket._readyState = WebSocket.CLOSING;\n websocket._receiver.end();\n this.end();\n}\n\n/**\n * The listener of the socket `'error'` event.\n *\n * @private\n */\nfunction socketOnError() {\n const websocket = this[kWebSocket];\n\n this.removeListener('error', socketOnError);\n this.on('error', NOOP);\n\n if (websocket) {\n websocket._readyState = WebSocket.CLOSING;\n this.destroy();\n }\n}\n", "/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^WebSocket$\" }] */\n'use strict';\n\nconst WebSocket = require('./websocket');\nconst { Duplex } = require('stream');\n\n/**\n * Emits the `'close'` event on a stream.\n *\n * @param {Duplex} stream The stream.\n * @private\n */\nfunction emitClose(stream) {\n stream.emit('close');\n}\n\n/**\n * The listener of the `'end'` event.\n *\n * @private\n */\nfunction duplexOnEnd() {\n if (!this.destroyed && this._writableState.finished) {\n this.destroy();\n }\n}\n\n/**\n * The listener of the `'error'` event.\n *\n * @param {Error} err The error\n * @private\n */\nfunction duplexOnError(err) {\n this.removeListener('error', duplexOnError);\n this.destroy();\n if (this.listenerCount('error') === 0) {\n // Do not suppress the throwing behavior.\n this.emit('error', err);\n }\n}\n\n/**\n * Wraps a `WebSocket` in a duplex stream.\n *\n * @param {WebSocket} ws The `WebSocket` to wrap\n * @param {Object} [options] The options for the `Duplex` constructor\n * @return {Duplex} The duplex stream\n * @public\n */\nfunction createWebSocketStream(ws, options) {\n let terminateOnDestroy = true;\n\n const duplex = new Duplex({\n ...options,\n autoDestroy: false,\n emitClose: false,\n objectMode: false,\n writableObjectMode: false\n });\n\n ws.on('message', function message(msg, isBinary) {\n const data =\n !isBinary && duplex._readableState.objectMode ? msg.toString() : msg;\n\n if (!duplex.push(data)) ws.pause();\n });\n\n ws.once('error', function error(err) {\n if (duplex.destroyed) return;\n\n // Prevent `ws.terminate()` from being called by `duplex._destroy()`.\n //\n // - If the `'error'` event is emitted before the `'open'` event, then\n // `ws.terminate()` is a noop as no socket is assigned.\n // - Otherwise, the error is re-emitted by the listener of the `'error'`\n // event of the `Receiver` object. The listener already closes the\n // connection by calling `ws.close()`. This allows a close frame to be\n // sent to the other peer. If `ws.terminate()` is called right after this,\n // then the close frame might not be sent.\n terminateOnDestroy = false;\n duplex.destroy(err);\n });\n\n ws.once('close', function close() {\n if (duplex.destroyed) return;\n\n duplex.push(null);\n });\n\n duplex._destroy = function (err, callback) {\n if (ws.readyState === ws.CLOSED) {\n callback(err);\n process.nextTick(emitClose, duplex);\n return;\n }\n\n let called = false;\n\n ws.once('error', function error(err) {\n called = true;\n callback(err);\n });\n\n ws.once('close', function close() {\n if (!called) callback(err);\n process.nextTick(emitClose, duplex);\n });\n\n if (terminateOnDestroy) ws.terminate();\n };\n\n duplex._final = function (callback) {\n if (ws.readyState === ws.CONNECTING) {\n ws.once('open', function open() {\n duplex._final(callback);\n });\n return;\n }\n\n // If the value of the `_socket` property is `null` it means that `ws` is a\n // client websocket and the handshake failed. In fact, when this happens, a\n // socket is never assigned to the websocket. Wait for the `'error'` event\n // that will be emitted by the websocket.\n if (ws._socket === null) return;\n\n if (ws._socket._writableState.finished) {\n callback();\n if (duplex._readableState.endEmitted) duplex.destroy();\n } else {\n ws._socket.once('finish', function finish() {\n // `duplex` is not destroyed here because the `'end'` event will be\n // emitted on `duplex` after this `'finish'` event. The EOF signaling\n // `null` chunk is, in fact, pushed when the websocket emits `'close'`.\n callback();\n });\n ws.close();\n }\n };\n\n duplex._read = function () {\n if (ws.isPaused) ws.resume();\n };\n\n duplex._write = function (chunk, encoding, callback) {\n if (ws.readyState === ws.CONNECTING) {\n ws.once('open', function open() {\n duplex._write(chunk, encoding, callback);\n });\n return;\n }\n\n ws.send(chunk, callback);\n };\n\n duplex.on('end', duplexOnEnd);\n duplex.on('error', duplexOnError);\n return duplex;\n}\n\nmodule.exports = createWebSocketStream;\n", "'use strict';\n\nconst { tokenChars } = require('./validation');\n\n/**\n * Parses the `Sec-WebSocket-Protocol` header into a set of subprotocol names.\n *\n * @param {String} header The field value of the header\n * @return {Set} The subprotocol names\n * @public\n */\nfunction parse(header) {\n const protocols = new Set();\n let start = -1;\n let end = -1;\n let i = 0;\n\n for (i; i < header.length; i++) {\n const code = header.charCodeAt(i);\n\n if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (\n i !== 0 &&\n (code === 0x20 /* ' ' */ || code === 0x09) /* '\\t' */\n ) {\n if (end === -1 && start !== -1) end = i;\n } else if (code === 0x2c /* ',' */) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n\n const protocol = header.slice(start, end);\n\n if (protocols.has(protocol)) {\n throw new SyntaxError(`The \"${protocol}\" subprotocol is duplicated`);\n }\n\n protocols.add(protocol);\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n }\n\n if (start === -1 || end !== -1) {\n throw new SyntaxError('Unexpected end of input');\n }\n\n const protocol = header.slice(start, i);\n\n if (protocols.has(protocol)) {\n throw new SyntaxError(`The \"${protocol}\" subprotocol is duplicated`);\n }\n\n protocols.add(protocol);\n return protocols;\n}\n\nmodule.exports = { parse };\n", "/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^Duplex$\", \"caughtErrors\": \"none\" }] */\n\n'use strict';\n\nconst EventEmitter = require('events');\nconst http = require('http');\nconst { Duplex } = require('stream');\nconst { createHash } = require('crypto');\n\nconst extension = require('./extension');\nconst PerMessageDeflate = require('./permessage-deflate');\nconst subprotocol = require('./subprotocol');\nconst WebSocket = require('./websocket');\nconst { CLOSE_TIMEOUT, GUID, kWebSocket } = require('./constants');\n\nconst keyRegex = /^[+/0-9A-Za-z]{22}==$/;\n\nconst RUNNING = 0;\nconst CLOSING = 1;\nconst CLOSED = 2;\n\n/**\n * Class representing a WebSocket server.\n *\n * @extends EventEmitter\n */\nclass WebSocketServer extends EventEmitter {\n /**\n * Create a `WebSocketServer` instance.\n *\n * @param {Object} options Configuration options\n * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether\n * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted\n * multiple times in the same tick\n * @param {Boolean} [options.autoPong=true] Specifies whether or not to\n * automatically send a pong in response to a ping\n * @param {Number} [options.backlog=511] The maximum length of the queue of\n * pending connections\n * @param {Boolean} [options.clientTracking=true] Specifies whether or not to\n * track clients\n * @param {Number} [options.closeTimeout=30000] Duration in milliseconds to\n * wait for the closing handshake to finish after `websocket.close()` is\n * called\n * @param {Function} [options.handleProtocols] A hook to handle protocols\n * @param {String} [options.host] The hostname where to bind the server\n * @param {Number} [options.maxPayload=104857600] The maximum allowed message\n * size\n * @param {Boolean} [options.noServer=false] Enable no server mode\n * @param {String} [options.path] Accept only connections matching this path\n * @param {(Boolean|Object)} [options.perMessageDeflate=false] Enable/disable\n * permessage-deflate\n * @param {Number} [options.port] The port where to bind the server\n * @param {(http.Server|https.Server)} [options.server] A pre-created HTTP/S\n * server to use\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n * @param {Function} [options.verifyClient] A hook to reject connections\n * @param {Function} [options.WebSocket=WebSocket] Specifies the `WebSocket`\n * class to use. It must be the `WebSocket` class or class that extends it\n * @param {Function} [callback] A listener for the `listening` event\n */\n constructor(options, callback) {\n super();\n\n options = {\n allowSynchronousEvents: true,\n autoPong: true,\n maxPayload: 100 * 1024 * 1024,\n skipUTF8Validation: false,\n perMessageDeflate: false,\n handleProtocols: null,\n clientTracking: true,\n closeTimeout: CLOSE_TIMEOUT,\n verifyClient: null,\n noServer: false,\n backlog: null, // use default (511 as implemented in net.js)\n server: null,\n host: null,\n path: null,\n port: null,\n WebSocket,\n ...options\n };\n\n if (\n (options.port == null && !options.server && !options.noServer) ||\n (options.port != null && (options.server || options.noServer)) ||\n (options.server && options.noServer)\n ) {\n throw new TypeError(\n 'One and only one of the \"port\", \"server\", or \"noServer\" options ' +\n 'must be specified'\n );\n }\n\n if (options.port != null) {\n this._server = http.createServer((req, res) => {\n const body = http.STATUS_CODES[426];\n\n res.writeHead(426, {\n 'Content-Length': body.length,\n 'Content-Type': 'text/plain'\n });\n res.end(body);\n });\n this._server.listen(\n options.port,\n options.host,\n options.backlog,\n callback\n );\n } else if (options.server) {\n this._server = options.server;\n }\n\n if (this._server) {\n const emitConnection = this.emit.bind(this, 'connection');\n\n this._removeListeners = addListeners(this._server, {\n listening: this.emit.bind(this, 'listening'),\n error: this.emit.bind(this, 'error'),\n upgrade: (req, socket, head) => {\n this.handleUpgrade(req, socket, head, emitConnection);\n }\n });\n }\n\n if (options.perMessageDeflate === true) options.perMessageDeflate = {};\n if (options.clientTracking) {\n this.clients = new Set();\n this._shouldEmitClose = false;\n }\n\n this.options = options;\n this._state = RUNNING;\n }\n\n /**\n * Returns the bound address, the address family name, and port of the server\n * as reported by the operating system if listening on an IP socket.\n * If the server is listening on a pipe or UNIX domain socket, the name is\n * returned as a string.\n *\n * @return {(Object|String|null)} The address of the server\n * @public\n */\n address() {\n if (this.options.noServer) {\n throw new Error('The server is operating in \"noServer\" mode');\n }\n\n if (!this._server) return null;\n return this._server.address();\n }\n\n /**\n * Stop the server from accepting new connections and emit the `'close'` event\n * when all existing connections are closed.\n *\n * @param {Function} [cb] A one-time listener for the `'close'` event\n * @public\n */\n close(cb) {\n if (this._state === CLOSED) {\n if (cb) {\n this.once('close', () => {\n cb(new Error('The server is not running'));\n });\n }\n\n process.nextTick(emitClose, this);\n return;\n }\n\n if (cb) this.once('close', cb);\n\n if (this._state === CLOSING) return;\n this._state = CLOSING;\n\n if (this.options.noServer || this.options.server) {\n if (this._server) {\n this._removeListeners();\n this._removeListeners = this._server = null;\n }\n\n if (this.clients) {\n if (!this.clients.size) {\n process.nextTick(emitClose, this);\n } else {\n this._shouldEmitClose = true;\n }\n } else {\n process.nextTick(emitClose, this);\n }\n } else {\n const server = this._server;\n\n this._removeListeners();\n this._removeListeners = this._server = null;\n\n //\n // The HTTP/S server was created internally. Close it, and rely on its\n // `'close'` event.\n //\n server.close(() => {\n emitClose(this);\n });\n }\n }\n\n /**\n * See if a given request should be handled by this server instance.\n *\n * @param {http.IncomingMessage} req Request object to inspect\n * @return {Boolean} `true` if the request is valid, else `false`\n * @public\n */\n shouldHandle(req) {\n if (this.options.path) {\n const index = req.url.indexOf('?');\n const pathname = index !== -1 ? req.url.slice(0, index) : req.url;\n\n if (pathname !== this.options.path) return false;\n }\n\n return true;\n }\n\n /**\n * Handle a HTTP Upgrade request.\n *\n * @param {http.IncomingMessage} req The request object\n * @param {Duplex} socket The network socket between the server and client\n * @param {Buffer} head The first packet of the upgraded stream\n * @param {Function} cb Callback\n * @public\n */\n handleUpgrade(req, socket, head, cb) {\n socket.on('error', socketOnError);\n\n const key = req.headers['sec-websocket-key'];\n const upgrade = req.headers.upgrade;\n const version = +req.headers['sec-websocket-version'];\n\n if (req.method !== 'GET') {\n const message = 'Invalid HTTP method';\n abortHandshakeOrEmitwsClientError(this, req, socket, 405, message);\n return;\n }\n\n if (upgrade === undefined || upgrade.toLowerCase() !== 'websocket') {\n const message = 'Invalid Upgrade header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n\n if (key === undefined || !keyRegex.test(key)) {\n const message = 'Missing or invalid Sec-WebSocket-Key header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n\n if (version !== 13 && version !== 8) {\n const message = 'Missing or invalid Sec-WebSocket-Version header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message, {\n 'Sec-WebSocket-Version': '13, 8'\n });\n return;\n }\n\n if (!this.shouldHandle(req)) {\n abortHandshake(socket, 400);\n return;\n }\n\n const secWebSocketProtocol = req.headers['sec-websocket-protocol'];\n let protocols = new Set();\n\n if (secWebSocketProtocol !== undefined) {\n try {\n protocols = subprotocol.parse(secWebSocketProtocol);\n } catch (err) {\n const message = 'Invalid Sec-WebSocket-Protocol header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n }\n\n const secWebSocketExtensions = req.headers['sec-websocket-extensions'];\n const extensions = {};\n\n if (\n this.options.perMessageDeflate &&\n secWebSocketExtensions !== undefined\n ) {\n const perMessageDeflate = new PerMessageDeflate({\n ...this.options.perMessageDeflate,\n isServer: true,\n maxPayload: this.options.maxPayload\n });\n\n try {\n const offers = extension.parse(secWebSocketExtensions);\n\n if (offers[PerMessageDeflate.extensionName]) {\n perMessageDeflate.accept(offers[PerMessageDeflate.extensionName]);\n extensions[PerMessageDeflate.extensionName] = perMessageDeflate;\n }\n } catch (err) {\n const message =\n 'Invalid or unacceptable Sec-WebSocket-Extensions header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n }\n\n //\n // Optionally call external client verification handler.\n //\n if (this.options.verifyClient) {\n const info = {\n origin:\n req.headers[`${version === 8 ? 'sec-websocket-origin' : 'origin'}`],\n secure: !!(req.socket.authorized || req.socket.encrypted),\n req\n };\n\n if (this.options.verifyClient.length === 2) {\n this.options.verifyClient(info, (verified, code, message, headers) => {\n if (!verified) {\n return abortHandshake(socket, code || 401, message, headers);\n }\n\n this.completeUpgrade(\n extensions,\n key,\n protocols,\n req,\n socket,\n head,\n cb\n );\n });\n return;\n }\n\n if (!this.options.verifyClient(info)) return abortHandshake(socket, 401);\n }\n\n this.completeUpgrade(extensions, key, protocols, req, socket, head, cb);\n }\n\n /**\n * Upgrade the connection to WebSocket.\n *\n * @param {Object} extensions The accepted extensions\n * @param {String} key The value of the `Sec-WebSocket-Key` header\n * @param {Set} protocols The subprotocols\n * @param {http.IncomingMessage} req The request object\n * @param {Duplex} socket The network socket between the server and client\n * @param {Buffer} head The first packet of the upgraded stream\n * @param {Function} cb Callback\n * @throws {Error} If called more than once with the same socket\n * @private\n */\n completeUpgrade(extensions, key, protocols, req, socket, head, cb) {\n //\n // Destroy the socket if the client has already sent a FIN packet.\n //\n if (!socket.readable || !socket.writable) return socket.destroy();\n\n if (socket[kWebSocket]) {\n throw new Error(\n 'server.handleUpgrade() was called more than once with the same ' +\n 'socket, possibly due to a misconfiguration'\n );\n }\n\n if (this._state > RUNNING) return abortHandshake(socket, 503);\n\n const digest = createHash('sha1')\n .update(key + GUID)\n .digest('base64');\n\n const headers = [\n 'HTTP/1.1 101 Switching Protocols',\n 'Upgrade: websocket',\n 'Connection: Upgrade',\n `Sec-WebSocket-Accept: ${digest}`\n ];\n\n const ws = new this.options.WebSocket(null, undefined, this.options);\n\n if (protocols.size) {\n //\n // Optionally call external protocol selection handler.\n //\n const protocol = this.options.handleProtocols\n ? this.options.handleProtocols(protocols, req)\n : protocols.values().next().value;\n\n if (protocol) {\n headers.push(`Sec-WebSocket-Protocol: ${protocol}`);\n ws._protocol = protocol;\n }\n }\n\n if (extensions[PerMessageDeflate.extensionName]) {\n const params = extensions[PerMessageDeflate.extensionName].params;\n const value = extension.format({\n [PerMessageDeflate.extensionName]: [params]\n });\n headers.push(`Sec-WebSocket-Extensions: ${value}`);\n ws._extensions = extensions;\n }\n\n //\n // Allow external modification/inspection of handshake headers.\n //\n this.emit('headers', headers, req);\n\n socket.write(headers.concat('\\r\\n').join('\\r\\n'));\n socket.removeListener('error', socketOnError);\n\n ws.setSocket(socket, head, {\n allowSynchronousEvents: this.options.allowSynchronousEvents,\n maxPayload: this.options.maxPayload,\n skipUTF8Validation: this.options.skipUTF8Validation\n });\n\n if (this.clients) {\n this.clients.add(ws);\n ws.on('close', () => {\n this.clients.delete(ws);\n\n if (this._shouldEmitClose && !this.clients.size) {\n process.nextTick(emitClose, this);\n }\n });\n }\n\n cb(ws, req);\n }\n}\n\nmodule.exports = WebSocketServer;\n\n/**\n * Add event listeners on an `EventEmitter` using a map of <event, listener>\n * pairs.\n *\n * @param {EventEmitter} server The event emitter\n * @param {Object.<String, Function>} map The listeners to add\n * @return {Function} A function that will remove the added listeners when\n * called\n * @private\n */\nfunction addListeners(server, map) {\n for (const event of Object.keys(map)) server.on(event, map[event]);\n\n return function removeListeners() {\n for (const event of Object.keys(map)) {\n server.removeListener(event, map[event]);\n }\n };\n}\n\n/**\n * Emit a `'close'` event on an `EventEmitter`.\n *\n * @param {EventEmitter} server The event emitter\n * @private\n */\nfunction emitClose(server) {\n server._state = CLOSED;\n server.emit('close');\n}\n\n/**\n * Handle socket errors.\n *\n * @private\n */\nfunction socketOnError() {\n this.destroy();\n}\n\n/**\n * Close the connection when preconditions are not fulfilled.\n *\n * @param {Duplex} socket The socket of the upgrade request\n * @param {Number} code The HTTP response status code\n * @param {String} [message] The HTTP response body\n * @param {Object} [headers] Additional HTTP response headers\n * @private\n */\nfunction abortHandshake(socket, code, message, headers) {\n //\n // The socket is writable unless the user destroyed or ended it before calling\n // `server.handleUpgrade()` or in the `verifyClient` function, which is a user\n // error. Handling this does not make much sense as the worst that can happen\n // is that some of the data written by the user might be discarded due to the\n // call to `socket.end()` below, which triggers an `'error'` event that in\n // turn causes the socket to be destroyed.\n //\n message = message || http.STATUS_CODES[code];\n headers = {\n Connection: 'close',\n 'Content-Type': 'text/html',\n 'Content-Length': Buffer.byteLength(message),\n ...headers\n };\n\n socket.once('finish', socket.destroy);\n\n socket.end(\n `HTTP/1.1 ${code} ${http.STATUS_CODES[code]}\\r\\n` +\n Object.keys(headers)\n .map((h) => `${h}: ${headers[h]}`)\n .join('\\r\\n') +\n '\\r\\n\\r\\n' +\n message\n );\n}\n\n/**\n * Emit a `'wsClientError'` event on a `WebSocketServer` if there is at least\n * one listener for it, otherwise call `abortHandshake()`.\n *\n * @param {WebSocketServer} server The WebSocket server\n * @param {http.IncomingMessage} req The request object\n * @param {Duplex} socket The socket of the upgrade request\n * @param {Number} code The HTTP response status code\n * @param {String} message The HTTP response body\n * @param {Object} [headers] The HTTP response headers\n * @private\n */\nfunction abortHandshakeOrEmitwsClientError(\n server,\n req,\n socket,\n code,\n message,\n headers\n) {\n if (server.listenerCount('wsClientError')) {\n const err = new Error(message);\n Error.captureStackTrace(err, abortHandshakeOrEmitwsClientError);\n\n server.emit('wsClientError', err, socket, req);\n } else {\n abortHandshake(socket, code, message, headers);\n }\n}\n", "import createWebSocketStream from './lib/stream.js';\nimport extension from './lib/extension.js';\nimport PerMessageDeflate from './lib/permessage-deflate.js';\nimport Receiver from './lib/receiver.js';\nimport Sender from './lib/sender.js';\nimport subprotocol from './lib/subprotocol.js';\nimport WebSocket from './lib/websocket.js';\nimport WebSocketServer from './lib/websocket-server.js';\n\nexport {\n createWebSocketStream,\n extension,\n PerMessageDeflate,\n Receiver,\n Sender,\n subprotocol,\n WebSocket,\n WebSocketServer\n};\n\nexport default WebSocket;\n", "/**\n * Connect command: WebSocket real-time message processing.\n */\n\nimport fs from 'node:fs';\nimport { OVERLAY_URL, PATHS } from '../config.js';\nimport { fail } from '../output.js';\nimport { loadIdentity } from '../wallet/identity.js';\nimport { processMessage } from './handlers.js';\nimport { ensureStateDir } from '../utils/storage.js';\nimport debug from 'debug';\n\nconst log = debug('openclaw:plugin:overlay:connect');\n\n/**\n * Connect command: establish WebSocket connection for real-time messaging.\n * Supports being used as a library with onMessage callback and AbortSignal.\n */\nexport async function cmdConnect(onMessage?: (data: any) => void, signal?: AbortSignal): Promise<void> {\n let WebSocketClient: any;\n try {\n const ws = await import('ws');\n WebSocketClient = ws.default || (ws as any).WebSocket || ws;\n } catch {\n return fail('WebSocket client not available. Install it: npm install ws');\n }\n\n const { identityKey, privKey } = await loadIdentity();\n const wsUrl = OVERLAY_URL.replace(/^http/, 'ws') + '/relay/subscribe?identity=' + identityKey;\n log('Connecting to WebSocket relay: %s', wsUrl);\n\n let reconnectDelay = 1000;\n let shouldReconnect = true;\n let currentWs: any = null;\n\n function shutdown() {\n shouldReconnect = false;\n if (currentWs) {\n try { currentWs.close(); } catch {}\n }\n // Only exit if we're not running as a library\n if (!onMessage) {\n process.exit(0);\n }\n }\n\n if (!onMessage) {\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n }\n\n if (signal) {\n signal.addEventListener('abort', () => {\n shouldReconnect = false;\n if (currentWs) {\n try { currentWs.close(); } catch {}\n }\n });\n }\n\n function connect() {\n if (signal?.aborted) return;\n const ws = new WebSocketClient(wsUrl);\n currentWs = ws;\n\n ws.on('open', () => {\n log('WebSocket connection established!');\n reconnectDelay = 1000; // reset on successful connect\n const logMsg = { event: 'connected', identity: identityKey, overlay: OVERLAY_URL };\n if (onMessage) onMessage(logMsg);\n else console.error(JSON.stringify(logMsg));\n });\n\n ws.on('message', async (data: any) => {\n log('Incoming WebSocket message received');\n try {\n const envelope = JSON.parse(data.toString());\n log('Message type: %s', envelope.type);\n if (envelope.type === 'message') {\n const result = await processMessage(envelope.message, identityKey, privKey);\n log('Processed message: %s', result.id);\n \n if (onMessage) onMessage(result);\n else console.log(JSON.stringify(result));\n\n // Also append to notification log\n ensureStateDir();\n try {\n fs.appendFileSync(PATHS.notifications, JSON.stringify({ ...result, _ts: Date.now() }) + '\\n');\n } catch {}\n\n // Ack the message\n if (result.ack) {\n try {\n await fetch(OVERLAY_URL + '/relay/ack', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ identity: identityKey, messageIds: [result.id] }),\n });\n } catch (ackErr: any) {\n const log = { event: 'ack-error', id: result.id, message: String(ackErr) };\n if (onMessage) onMessage(log);\n else console.error(JSON.stringify(log));\n }\n }\n }\n\n // Handle service announcements\n if (envelope.type === 'service-announced') {\n const svc = envelope.service || {};\n const announcement = {\n event: 'service-announced',\n serviceId: svc.serviceId,\n name: svc.name,\n description: svc.description,\n priceSats: svc.pricingSats,\n provider: svc.identityKey,\n txid: envelope.txid,\n _ts: Date.now(),\n };\n if (onMessage) onMessage(announcement);\n else console.log(JSON.stringify(announcement));\n \n ensureStateDir();\n try {\n fs.appendFileSync(PATHS.notifications, JSON.stringify(announcement) + '\\n');\n } catch {}\n }\n } catch (err: any) {\n const log = { event: 'process-error', message: String(err) };\n if (onMessage) onMessage(log);\n else console.error(JSON.stringify(log));\n }\n });\n\n ws.on('close', () => {\n currentWs = null;\n if (shouldReconnect && !signal?.aborted) {\n const log = { event: 'disconnected', reconnectMs: reconnectDelay };\n if (onMessage) onMessage(log);\n else console.error(JSON.stringify(log));\n \n setTimeout(connect, reconnectDelay);\n reconnectDelay = Math.min(reconnectDelay * 2, 30000);\n }\n });\n\n ws.on('error', (err: any) => {\n const log = { event: 'error', message: err.message };\n if (onMessage) onMessage(log);\n else console.error(JSON.stringify(log));\n });\n }\n\n connect();\n // Keep alive\n return new Promise((resolve) => {\n if (signal) {\n signal.addEventListener('abort', () => resolve());\n }\n });\n}\n", "/**\n * Service request command.\n */\n\nimport { OVERLAY_URL } from '../config.js';\nimport { ok, fail } from '../output.js';\nimport { loadIdentity, signRelayMessage } from '../wallet/identity.js';\nimport { buildDirectPayment } from '../payment/build.js';\n\n/**\n * Request service command: send a service request with optional payment.\n */\nexport async function cmdRequestService(\n targetKey: string | undefined,\n serviceId: string | undefined,\n satsStr?: string,\n inputJsonStr?: string\n): Promise<any> {\n if (!targetKey || !serviceId) {\n return fail('Usage: request-service <identityKey> <serviceId> [sats] [inputJson]');\n }\n\n if (!/^0[23][0-9a-fA-F]{64}$/.test(targetKey)) {\n return fail('Target must be a compressed public key (66 hex chars, 02/03 prefix)');\n }\n\n const { identityKey, privKey } = await loadIdentity();\n const sats = parseInt(satsStr || '5', 10);\n\n // Parse optional input JSON\n let inputData: unknown = null;\n if (inputJsonStr) {\n try {\n inputData = JSON.parse(inputJsonStr);\n } catch {\n return fail('inputJson must be valid JSON');\n }\n }\n\n // Build the service request payload\n let paymentData: any = null;\n\n if (sats > 0) {\n try {\n const payment = await buildDirectPayment(targetKey, sats, `service-request: ${serviceId}`);\n paymentData = {\n beef: payment.beef,\n txid: payment.txid,\n satoshis: payment.satoshis,\n derivationPrefix: payment.derivationPrefix,\n derivationSuffix: payment.derivationSuffix,\n senderIdentityKey: payment.senderIdentityKey,\n };\n } catch (err: any) {\n // Payment failed \u2014 send request without payment\n paymentData = { error: String(err.message || err) };\n }\n }\n\n const requestPayload = {\n serviceId,\n ...(inputData ? { input: inputData } : {}),\n payment: paymentData,\n requestedAt: new Date().toISOString(),\n };\n\n const signature = await signRelayMessage(privKey, targetKey, 'service-request', requestPayload);\n\n const resp = await fetch(`${OVERLAY_URL}/relay/send`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n from: identityKey,\n to: targetKey,\n type: 'service-request',\n payload: requestPayload,\n signature,\n }),\n });\n\n if (!resp.ok) {\n const body = await resp.text();\n return fail(`Relay send failed (${resp.status}): ${body}`);\n }\n\n const result = await resp.json();\n\n return ok({\n sent: true,\n requestId: result.id,\n to: targetKey,\n serviceId,\n paymentIncluded: paymentData && !paymentData.error,\n paymentTxid: paymentData?.txid || null,\n satoshis: paymentData?.satoshis || 0,\n note: 'Poll for service-response to get the result',\n });\n}\n", "/**\n * Service response commands.\n */\n\nimport fs from 'node:fs';\nimport { OVERLAY_URL, PATHS } from '../config.js';\nimport { ok, fail } from '../output.js';\nimport { loadIdentity, signRelayMessage } from '../wallet/identity.js';\nimport { updateServiceQueueStatus } from '../utils/storage.js';\n\n/**\n * Respond to a service request.\n */\nexport async function cmdRespondService(\n requestId: string | undefined,\n recipientKey: string | undefined,\n serviceId: string | undefined,\n resultJson: string | undefined\n): Promise<any> {\n if (!requestId || !recipientKey || !serviceId || !resultJson) {\n return fail('Usage: respond-service <requestId> <recipientKey> <serviceId> <resultJson>');\n }\n\n let result: unknown;\n try {\n result = JSON.parse(resultJson);\n } catch {\n return fail('resultJson must be valid JSON');\n }\n\n const { identityKey, privKey } = await loadIdentity();\n\n // Check if already processed before sending response (idempotency)\n if (fs.existsSync(PATHS.serviceQueue)) {\n const lines = fs.readFileSync(PATHS.serviceQueue, 'utf-8').trim().split('\\n').filter(Boolean);\n const finalStatuses = ['fulfilled', 'rejected', 'delivery_failed', 'failed', 'error'];\n\n for (const line of lines) {\n try {\n const entry = JSON.parse(line);\n if (entry.requestId === requestId && finalStatuses.includes(entry.status)) {\n return ok({\n sent: false,\n requestId,\n serviceId,\n to: recipientKey,\n message: `Request already processed with status: ${entry.status}`,\n alreadyProcessed: true,\n previousStatus: entry.status\n });\n }\n } catch {}\n }\n }\n\n const responsePayload = {\n requestId,\n serviceId,\n status: 'fulfilled',\n result,\n };\n\n const sig = await signRelayMessage(privKey, recipientKey, 'service-response', responsePayload);\n const resp = await fetch(`${OVERLAY_URL}/relay/send`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n from: identityKey,\n to: recipientKey,\n type: 'service-response',\n payload: responsePayload,\n signature: sig,\n }),\n });\n\n if (!resp.ok) {\n // Mark as failed in queue using atomic update\n updateServiceQueueStatus(requestId, 'failed', {\n failedAt: Date.now(),\n error: `Relay send failed: ${resp.status}`\n });\n return fail(`Relay send failed: ${resp.status}`);\n }\n\n // Mark as fulfilled in queue using atomic update\n updateServiceQueueStatus(requestId, 'fulfilled', {\n fulfilledAt: Date.now()\n });\n\n return ok({ sent: true, requestId, serviceId, to: recipientKey });\n}\n\n/**\n * Respond to a research request with results.\n */\nexport async function cmdResearchRespond(resultJsonPath: string | undefined): Promise<any> {\n if (!resultJsonPath) return fail('Usage: research-respond <resultJsonFile>');\n if (!fs.existsSync(resultJsonPath)) return fail(`File not found: ${resultJsonPath}`);\n\n const result = JSON.parse(fs.readFileSync(resultJsonPath, 'utf-8'));\n const { requestId, from: recipientKey, query, research } = result;\n\n if (!requestId || !recipientKey || !research) {\n return fail('Result JSON must have: requestId, from, query, research');\n }\n\n const { identityKey, privKey } = await loadIdentity();\n\n const responsePayload = {\n requestId,\n serviceId: 'web-research',\n status: 'fulfilled',\n result: research,\n paymentAccepted: true,\n paymentTxid: result.paymentTxid || null,\n satoshisReceived: result.satoshisReceived || 0,\n walletAccepted: result.walletAccepted ?? true,\n };\n\n const sig = await signRelayMessage(privKey, recipientKey, 'service-response', responsePayload);\n const sendResp = await fetch(`${OVERLAY_URL}/relay/send`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n from: identityKey,\n to: recipientKey,\n type: 'service-response',\n payload: responsePayload,\n signature: sig,\n }),\n });\n\n if (!sendResp.ok) {\n return fail(`Failed to send response: ${await sendResp.text()}`);\n }\n\n const sendResult = await sendResp.json();\n\n // Remove from queue\n if (fs.existsSync(PATHS.researchQueue)) {\n const lines = fs.readFileSync(PATHS.researchQueue, 'utf-8').trim().split('\\n').filter(Boolean);\n const remaining = lines.filter((l: string) => {\n try { return JSON.parse(l).requestId !== requestId; } catch { return true; }\n });\n fs.writeFileSync(PATHS.researchQueue, remaining.length ? remaining.join('\\n') + '\\n' : '');\n }\n\n return ok({ responded: true, requestId, to: recipientKey, query, pushed: sendResult.pushed });\n}\n", "/**\n * Service queue commands.\n */\n\nimport fs from 'node:fs';\nimport { PATHS } from '../config.js';\nimport { ok } from '../output.js';\nimport { readJsonl } from '../utils/storage.js';\n\n/**\n * Service queue command: list pending service requests.\n */\nexport async function cmdServiceQueue(): Promise<any> {\n if (!fs.existsSync(PATHS.serviceQueue)) {\n return ok({ pending: [], count: 0 });\n }\n\n const entries = readJsonl<any>(PATHS.serviceQueue);\n const pending = entries.filter(e => e.status === 'pending');\n\n return ok({ pending, count: pending.length, total: entries.length });\n}\n\n/**\n * Research queue command: list pending research requests.\n */\nexport async function cmdResearchQueue(): Promise<any> {\n if (!fs.existsSync(PATHS.researchQueue)) {\n return ok({ pending: [] });\n }\n\n const entries = readJsonl<any>(PATHS.researchQueue);\n\n return ok({ pending: entries, count: entries.length });\n}\n", "/**\n * X (Twitter) verification commands.\n */\n\nimport fs from 'node:fs';\nimport { OVERLAY_URL, PROTOCOL_ID, TOPICS, LOOKUP_SERVICES, OVERLAY_STATE_DIR, PATHS } from '../config.js';\nimport { ok, fail } from '../output.js';\nimport { loadIdentity, signRelayMessage } from '../wallet/identity.js';\nimport { loadXVerifications, saveXVerifications, readJsonl, appendToJsonl, loadServices, ensureStateDir } from '../utils/storage.js';\nimport { buildRealOverlayTransaction, lookupOverlay } from '../overlay/transaction.js';\nimport { verifyAndAcceptPayment } from '../messaging/handlers.js';\nimport { fetchWithTimeout } from '../utils/woc.js';\n\n// Dynamic import for @bsv/sdk\nlet _sdk: any = null;\n\nasync function getSdk(): Promise<any> {\n if (_sdk) return _sdk;\n\n try {\n _sdk = await import('@bsv/sdk');\n return _sdk;\n } catch {\n const { fileURLToPath } = await import('node:url');\n const path = await import('node:path');\n const os = await import('node:os');\n\n const __dirname = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.resolve(__dirname, '..', '..', '..', 'node_modules', '@bsv', 'sdk', 'dist', 'esm', 'mod.js'),\n path.resolve(__dirname, '..', '..', '..', '..', '..', 'a2a-bsv', 'packages', 'core', 'node_modules', '@bsv', 'sdk', 'dist', 'esm', 'mod.js'),\n path.resolve(os.homedir(), 'a2a-bsv', 'packages', 'core', 'node_modules', '@bsv', 'sdk', 'dist', 'esm', 'mod.js'),\n ];\n\n for (const p of candidates) {\n try {\n _sdk = await import(p);\n return _sdk;\n } catch {\n // Try next\n }\n }\n throw new Error('Cannot find @bsv/sdk. Run setup.sh first.');\n }\n}\n\n/**\n * Start X verification: generate a tweet with identity key and signature.\n */\nexport async function cmdXVerifyStart(handleArg: string | undefined): Promise<any> {\n if (!handleArg) {\n return fail('Usage: x-verify-start <@handle>');\n }\n\n const sdk = await getSdk();\n const handle = handleArg.startsWith('@') ? handleArg : `@${handleArg}`;\n const { identityKey, privKey } = await loadIdentity();\n\n // Sign the verification message\n const message = `Verify ${identityKey}`;\n const msgHash = sdk.Hash.sha256(Array.from(new TextEncoder().encode(message)));\n const sig = privKey.sign(msgHash);\n const signatureHex = (Array.from(sig.toDER()) as number[]).map((b) => b.toString(16).padStart(2, '0')).join('');\n\n // Save pending verification\n const pending = {\n identityKey,\n handle,\n signature: signatureHex,\n message,\n createdAt: new Date().toISOString(),\n };\n\n ensureStateDir();\n fs.writeFileSync(PATHS.pendingXVerification, JSON.stringify(pending, null, 2));\n\n // Build tweet text (under 280 chars)\n // Use shortened signature (first 40 chars) to fit in tweet\n const tweetText = `BSV Agent Verify: ${identityKey.slice(0, 10)}...${identityKey.slice(-10)} sig:${signatureHex.slice(0, 40)}`;\n\n return ok({\n tweetText,\n handle,\n identityKey,\n signature: signatureHex,\n note: `Post the tweet above from ${handle}, then run: x-verify-complete <tweet_url>`,\n });\n}\n\n/**\n * Complete X verification by checking the posted tweet.\n */\nexport async function cmdXVerifyComplete(tweetUrl: string | undefined): Promise<any> {\n if (!tweetUrl) return fail('Usage: x-verify-complete <tweet-url>');\n\n // Load pending verification\n if (!fs.existsSync(PATHS.pendingXVerification)) {\n return fail('No pending X verification. Run x-verify-start first.');\n }\n\n const pending = JSON.parse(fs.readFileSync(PATHS.pendingXVerification, 'utf-8'));\n\n // Extract tweet ID from URL\n const tweetIdMatch = tweetUrl.match(/status\\/(\\d+)/);\n if (!tweetIdMatch) return fail('Invalid tweet URL. Expected format: https://x.com/user/status/123456789');\n const tweetId = tweetIdMatch[1];\n\n // Fetch the tweet using bird CLI\n let tweetData: any;\n try {\n const { execSync } = await import('child' + '_' + 'process' as any);\n const birdOutput = execSync(`bird read ${tweetUrl} --json 2>/dev/null`, {\n encoding: 'utf-8',\n timeout: 30000,\n });\n tweetData = JSON.parse(birdOutput);\n } catch (err: any) {\n return fail(`Failed to fetch tweet: ${err.message}. Make sure bird CLI is configured.`);\n }\n\n // Verify the tweet contains our identity key and partial signature\n const tweetText = tweetData.text || tweetData.full_text || '';\n if (!tweetText.includes(pending.identityKey.slice(0, 10))) {\n return fail('Tweet does not contain the expected identity key.');\n }\n // Check for partial signature (first 40 chars)\n if (!tweetText.includes(pending.signature.slice(0, 40))) {\n return fail('Tweet does not contain the expected verification signature prefix.');\n }\n\n // Get the X user info from the tweet\n const xUserId = tweetData.user?.id_str || tweetData.authorId || tweetData.author?.id || tweetData.user_id;\n const xHandle = tweetData.user?.screen_name || tweetData.author?.username || tweetData.author?.name || pending.handle.replace('@', '');\n\n if (!xUserId) {\n return fail('Could not extract X user ID from tweet data.');\n }\n\n // Build on-chain verification record\n const verificationPayload = {\n protocol: PROTOCOL_ID,\n type: 'x-verification',\n identityKey: pending.identityKey,\n xHandle: `@${xHandle}`,\n xUserId,\n tweetId,\n tweetUrl,\n signature: pending.signature,\n verifiedAt: new Date().toISOString(),\n };\n\n // Submit to overlay (may fail if topic manager not deployed yet)\n let result = { txid: null as string | null, funded: 'pending-server-support' };\n let onChainStored = false;\n try {\n result = await buildRealOverlayTransaction(verificationPayload, TOPICS.X_VERIFICATION);\n onChainStored = true;\n } catch (err: any) {\n console.error(`[x-verify] On-chain storage failed: ${err.message}`);\n console.error('[x-verify] Storing verification locally.');\n }\n\n // Save verification locally\n const verifications = loadXVerifications();\n verifications.push({\n ...verificationPayload,\n txid: result.txid,\n });\n saveXVerifications(verifications);\n\n // Clean up pending\n fs.unlinkSync(PATHS.pendingXVerification);\n\n return ok({\n verified: true,\n identityKey: pending.identityKey,\n xHandle: `@${xHandle}`,\n xUserId,\n tweetId,\n txid: result.txid,\n funded: result.funded,\n onChainStored,\n note: onChainStored ? undefined : 'Stored locally. On-chain anchoring pending server topic manager deployment.',\n });\n}\n\n/**\n * List verified X accounts (local cache).\n */\nexport async function cmdXVerifications(): Promise<any> {\n const verifications = loadXVerifications();\n return ok({ verifications, count: verifications.length });\n}\n\n/**\n * Lookup X verifications from the overlay network.\n */\nexport async function cmdXLookup(query: string | undefined): Promise<any> {\n try {\n const lookupQuery = query\n ? (query.startsWith('@') ? { xHandle: query } : { identityKey: query })\n : { type: 'list' };\n\n const response = await lookupOverlay(LOOKUP_SERVICES.X_VERIFICATIONS, lookupQuery);\n return ok({ verifications: response.outputs || response || [], query: lookupQuery });\n } catch {\n return ok({ verifications: [], query, note: 'X verification lookup service may not be deployed yet.' });\n }\n}\n\n/**\n * List pending X engagement requests.\n */\nexport async function cmdXEngagementQueue(): Promise<any> {\n if (!fs.existsSync(PATHS.xEngagementQueue)) {\n return ok({ queue: [], count: 0 });\n }\n\n const queue = readJsonl<any>(PATHS.xEngagementQueue).filter(e => e.status === 'pending');\n\n return ok({ queue, count: queue.length });\n}\n\n/**\n * Mark an X engagement request as fulfilled.\n */\nexport async function cmdXEngagementFulfill(\n requestId: string | undefined,\n proofUrl?: string\n): Promise<any> {\n if (!requestId) return fail('Usage: x-engagement-fulfill <requestId> [proofUrl]');\n\n if (!fs.existsSync(PATHS.xEngagementQueue)) {\n return fail('No engagement queue found.');\n }\n\n const queue = readJsonl<any>(PATHS.xEngagementQueue);\n const entryIndex = queue.findIndex(e => e.requestId === requestId);\n if (entryIndex === -1) {\n return fail(`Request ${requestId} not found in queue.`);\n }\n\n // Mark as fulfilled\n queue[entryIndex].status = 'fulfilled';\n queue[entryIndex].fulfilledAt = new Date().toISOString();\n queue[entryIndex].proofUrl = proofUrl || null;\n\n // Rewrite queue file\n fs.writeFileSync(PATHS.xEngagementQueue, queue.map(e => JSON.stringify(e)).join('\\n') + '\\n');\n\n return ok({\n fulfilled: true,\n requestId,\n entry: queue[entryIndex],\n });\n}\n", "import { fileURLToPath } from 'node:url';\nimport path from 'node:path';\nimport os from 'node:os';\nimport fs from 'node:fs';\nimport process from 'node:process';\nimport { Buffer } from 'node:buffer';\nimport { ok, fail } from '../output.js';\nimport { loadIdentity, deriveWalletAddress } from '../wallet/identity.js';\nimport { NETWORK } from '../config.js';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\n// Define paths relative to home directory\nconst PATHS = {\n walletIdentity: path.join(os.homedir(), '.openclaw', 'bsv-wallet', 'wallet-identity.json'),\n baemailLog: path.join(os.homedir(), '.openclaw', 'openclaw-overlay', 'baemail-deliveries.jsonl'),\n baemailConfig: path.join(os.homedir(), '.openclaw', 'openclaw-overlay', 'baemail-config.json'),\n baemailBlocklist: path.join(os.homedir(), '.openclaw', 'openclaw-overlay', 'baemail-blocklist.json'),\n};\n\nexport interface BaemailLogEntry {\n requestId: string;\n from: string;\n to?: string;\n paidSats: number;\n deliverySuccess: boolean;\n refundStatus?: 'pending' | 'completed';\n refundTxid?: string;\n _lineIdx?: number;\n ts?: number;\n senderName?: string;\n messageLength?: number;\n tier?: string;\n deliveryChannel?: string;\n deliveryError?: string | null;\n paymentTxid?: string;\n timestamp?: string;\n}\n\n/**\n * Log a baemail delivery event.\n */\nexport function logBaemailDelivery(entry: BaemailLogEntry) {\n try {\n const dir = path.dirname(PATHS.baemailLog);\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n fs.appendFileSync(PATHS.baemailLog, JSON.stringify({ ...entry, ts: Date.now() }) + '\\n');\n } catch {}\n}\n\nexport async function loadBaemailConfig() {\n const defaults = { \n enabled: true, \n priceSats: 100, \n autoRefund: true,\n blocklist: [] as string[],\n maxMessageLength: 4000,\n deliveryChannel: 'agent-hook',\n tiers: {\n standard: 100,\n priority: 500,\n urgent: 1000\n }\n };\n\n if (!fs.existsSync(PATHS.baemailConfig)) {\n return defaults;\n }\n try {\n const config = JSON.parse(fs.readFileSync(PATHS.baemailConfig, 'utf-8'));\n return { ...defaults, ...config };\n } catch {\n return defaults;\n }\n}\n\nasync function fetchWithTimeout(url: string, options: any = {}) {\n const { timeout = 15000 } = options;\n const controller = new AbortController();\n const id = setTimeout(() => controller.abort(), timeout);\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal\n });\n clearTimeout(id);\n return response;\n } catch (err) {\n clearTimeout(id);\n throw err;\n }\n}\n\n/**\n * List recent baemail deliveries.\n */\nexport async function cmdBaemailLog(limitStr?: string): Promise<any> {\n const limit = parseInt(limitStr || '20', 10) || 20;\n \n if (!fs.existsSync(PATHS.baemailLog)) {\n return ok({ log: [], count: 0 });\n }\n\n const lines = fs.readFileSync(PATHS.baemailLog, 'utf-8').split('\\n').filter((l: string) => l.trim());\n const entries: BaemailLogEntry[] = lines.map((l: string) => {\n try { return JSON.parse(l); } catch { return null; }\n }).filter(Boolean) as BaemailLogEntry[];\n\n const recent = entries.slice(-limit).reverse();\n return ok({ log: recent, count: entries.length, showing: recent.length });\n}\n\nexport async function cmdBaemailSetup(priceSatsStr: string, prioritySats?: string, urgentSats?: string, channel?: string): Promise<any> {\n const standard = parseInt(priceSatsStr, 10) || 100;\n const priority = parseInt(prioritySats || '', 10) || (standard * 5);\n const urgent = parseInt(urgentSats || '', 10) || (standard * 10);\n \n const config = { \n enabled: true, \n priceSats: standard, \n autoRefund: true,\n deliveryChannel: channel || 'agent-hook',\n tiers: { standard, priority, urgent }\n };\n \n const dir = path.dirname(PATHS.baemailConfig);\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(PATHS.baemailConfig, JSON.stringify(config, null, 2));\n return ok({ message: `Baemail setup complete.`, config });\n}\n\nexport async function cmdBaemailConfig(): Promise<any> {\n const config = await loadBaemailConfig();\n return ok(config);\n}\n\nexport async function cmdBaemailBlock(pubkey: string): Promise<any> {\n if (!pubkey) return fail('Usage: baemail-block <pubkey>');\n let blocklist: string[] = [];\n if (fs.existsSync(PATHS.baemailBlocklist)) {\n try { blocklist = JSON.parse(fs.readFileSync(PATHS.baemailBlocklist, 'utf-8')); } catch { blocklist = []; }\n }\n if (!blocklist.includes(pubkey)) blocklist.push(pubkey);\n fs.writeFileSync(PATHS.baemailBlocklist, JSON.stringify(blocklist, null, 2));\n return ok({ blocked: true, pubkey, count: blocklist.length });\n}\n\nexport async function cmdBaemailUnblock(pubkey: string): Promise<any> {\n if (!pubkey) return fail('Usage: baemail-unblock <pubkey>');\n let blocklist: string[] = [];\n if (fs.existsSync(PATHS.baemailBlocklist)) {\n try { blocklist = JSON.parse(fs.readFileSync(PATHS.baemailBlocklist, 'utf-8')); } catch { blocklist = []; }\n }\n blocklist = blocklist.filter(p => p !== pubkey);\n fs.writeFileSync(PATHS.baemailBlocklist, JSON.stringify(blocklist, null, 2));\n return ok({ unblocked: true, pubkey, count: blocklist.length });\n}\n\n/**\n * Refund a failed baemail delivery.\n */\nexport async function cmdBaemailRefund(requestId: string | undefined): Promise<any> {\n if (!requestId) return fail('Usage: baemail-refund <requestId>');\n\n if (!fs.existsSync(PATHS.baemailLog)) {\n return fail('No baemail log found');\n }\n\n // Find the entry\n const lines = fs.readFileSync(PATHS.baemailLog, 'utf-8').split('\\n').filter((l: string) => l.trim());\n const entries: BaemailLogEntry[] = lines.map((l: string, idx: number) => {\n try { return { ...JSON.parse(l), _lineIdx: idx }; } catch { return null; }\n }).filter(Boolean) as BaemailLogEntry[];\n\n const entry = entries.find(e => e.requestId === requestId);\n if (!entry) {\n return fail(`Request ${requestId} not found in baemail log`);\n }\n\n if (entry.deliverySuccess) {\n return fail('This delivery was successful \u2014 no refund needed');\n }\n\n if (entry.refundStatus === 'completed') {\n return fail('Refund already processed for this request');\n }\n\n // Load wallet and SDK\n const { identityKey, privKey: rootKey } = await loadIdentity();\n const walletIdentityRaw = fs.readFileSync(PATHS.walletIdentity, 'utf-8');\n const walletIdentity = JSON.parse(walletIdentityRaw);\n\n // Dynamic import SDK\n let sdk: any;\n try {\n sdk = await import('@bsv/sdk');\n } catch {\n return fail('Cannot load @bsv/sdk for refund transaction');\n }\n\n const { Transaction, P2PKH, PrivateKey, PublicKey, Hash } = sdk;\n\n // Calculate refund amount\n const refundSats = entry.paidSats - 1; // Keep 1 sat for tx fee\n if (refundSats < 1) {\n return fail('Amount too small to refund');\n }\n\n // Derive refund address from sender's identity key\n const senderPubKey = PublicKey.fromString(entry.from);\n const refundAddress = senderPubKey.toAddress(NETWORK).toString();\n\n try {\n // Load UTXOs - Derive local address correctly\n const { address } = await deriveWalletAddress(rootKey);\n const wocNet = NETWORK === 'mainnet' ? 'main' : 'test';\n const utxosResp = await fetchWithTimeout(`https://api.whatsonchain.com/v1/bsv/${wocNet}/address/${address}/unspent/all`);\n const data = await utxosResp.json();\n const utxos = data.result || [];\n\n if (!utxos || utxos.length === 0) {\n return fail(`No UTXOs available for refund at ${address}`);\n }\n\n // Build transaction\n const tx = new Transaction();\n let totalInput = 0;\n\n for (const utxo of utxos) {\n if (totalInput >= refundSats + 50) break;\n tx.addInput({\n sourceTXID: utxo.tx_hash,\n sourceOutputIndex: utxo.tx_pos,\n sourceSatoshis: utxo.value,\n script: new P2PKH().lock(rootKey.toPublicKey().toAddress(NETWORK)).toHex(),\n unlockingScriptTemplate: new P2PKH().unlock(rootKey),\n });\n totalInput += utxo.value;\n }\n\n if (totalInput < refundSats + 10) {\n return fail('Insufficient funds for refund');\n }\n\n // Refund output\n tx.addOutput({\n satoshis: refundSats,\n lockingScript: new P2PKH().lock(refundAddress),\n });\n\n // Change output\n const fee = 10;\n const change = totalInput - refundSats - fee;\n if (change > 1) {\n tx.addOutput({\n satoshis: change,\n lockingScript: new P2PKH().lock(rootKey.toPublicKey().toAddress(NETWORK)),\n });\n }\n\n await tx.sign();\n\n // Broadcast using configured ARC/Arcade URL or fallback to WhatsOnChain\n const arcUrl = (process as any)['env'].BSV_ARC_URL;\n let broadcastResp;\n \n if (arcUrl) {\n broadcastResp = await fetchWithTimeout(`${arcUrl.replace(/\\/$/, '')}/v1/tx`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ rawTx: tx.toHex() }),\n });\n } else {\n broadcastResp = await fetchWithTimeout(`https://api.whatsonchain.com/v1/bsv/${wocNet}/tx/raw`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ txhex: tx.toHex() }),\n });\n }\n\n if (!broadcastResp.ok) {\n const errBody = await broadcastResp.text();\n return fail(`Broadcast failed: ${errBody}`);\n }\n\n const txid = tx.id('hex');\n\n // Update log entry\n const updatedLines = lines.map((l: string, idx: number) => {\n if (idx === entry._lineIdx) {\n const updated = { ...JSON.parse(l), refundStatus: 'completed', refundTxid: txid, refundedAt: new Date().toISOString() };\n return JSON.stringify(updated);\n }\n return l;\n });\n fs.writeFileSync(PATHS.baemailLog, updatedLines.join('\\n') + '\\n');\n\n return ok({\n refunded: true,\n requestId,\n refundSats,\n refundAddress,\n txid,\n note: `Refunded ${refundSats} sats to sender`,\n });\n\n } catch (err) {\n return fail(`Refund failed: ${(err as Error).message}`);\n }\n}\n", "/**\n * BSV Overlay CLI - Main Command Dispatcher\n *\n * Routes commands to the appropriate modules.\n * All business logic is in the scripts/ modules.\n */\n\nimport { ok, fail } from './scripts/output.js';\n\n// Wallet commands\nimport { cmdSetup, cmdIdentity, cmdAddress, cmdStatus } from './scripts/wallet/setup.js';\nimport { cmdBalance, cmdImport, cmdRefund } from './scripts/wallet/balance.js';\n\n// Overlay registration commands\nimport { cmdRegister, cmdUnregister } from './scripts/overlay/registration.js';\n\n// Service commands\nimport { cmdServices, cmdAdvertise, cmdRemove, cmdReadvertise } from './scripts/overlay/services.js';\n\n// Discovery commands\nimport { cmdDiscover } from './scripts/overlay/discover.js';\nimport { cmdAdvertiseSHIP, cmdAdvertiseSLAP } from './scripts/overlay/advertisement.js';\n\n// Payment commands\nimport { cmdPay, cmdVerify, cmdAccept } from './scripts/payment/commands.js';\n\n// Messaging commands\nimport { cmdSend } from './scripts/messaging/send.js';\nimport { cmdInbox, cmdAck } from './scripts/messaging/inbox.js';\nimport { cmdPoll } from './scripts/messaging/poll.js';\nimport { cmdConnect } from './scripts/messaging/connect.js';\n\n// Service request/response commands\nimport { cmdRequestService } from './scripts/services/request.js';\nimport { cmdRespondService, cmdResearchRespond } from './scripts/services/respond.js';\nimport { cmdServiceQueue, cmdResearchQueue } from './scripts/services/queue.js';\n\n// X verification commands\nimport {\n cmdXVerifyStart,\n cmdXVerifyComplete,\n cmdXVerifications,\n cmdXLookup,\n cmdXEngagementQueue,\n cmdXEngagementFulfill,\n} from './scripts/x-verification/commands.js';\n\n// Baemail commands\nimport {\n cmdBaemailSetup,\n cmdBaemailConfig,\n cmdBaemailBlock,\n cmdBaemailUnblock,\n cmdBaemailLog,\n cmdBaemailRefund,\n} from './scripts/baemail/commands.js';\n\nconst [, , command, ...args] = process.argv;\n\nasync function main() {\n try {\n switch (command) {\n // Help\n case 'help':\n case '--help':\n case '-h':\n ok({\n usage: 'sv_overlay <command> [args...]',\n commands: {\n wallet: ['setup', 'identity', 'address', 'balance', 'import <txid> [vout]', 'refund <address>'],\n registration: ['register', 'unregister'],\n services: ['services', 'advertise <id> <name> <priceSats> [desc]', 'readvertise <id> [name] [priceSats] [desc]', 'remove <id>'],\n discovery: ['discover [--service <type>] [--agent <name>]', 'advertise-ship <domain> <topic>', 'advertise-slap <domain> <service>'],\n payments: ['pay <pubkey> <sats> [desc]', 'verify <beef>', 'accept <beef> <prefix> <suffix> <senderKey> [desc]'],\n messaging: ['send <key> <type> <json>', 'inbox', 'ack', 'poll', 'connect'],\n 'service-requests': ['request-service <key> <serviceId> <sats> [input]', 'service-queue', 'respond-service <reqId> <key> <serviceId> <result>'],\n research: ['research-queue', 'research-respond <reqId>'],\n 'x-verification': ['x-verify-start <handle>', 'x-verify-complete <handle>', 'x-verifications', 'x-lookup <handle>', 'x-engagement-queue', 'x-engagement-fulfill <reqId> <result>'],\n baemail: ['baemail-setup <price> <xHandle> <forwardEmail> <greeting>', 'baemail-config', 'baemail-block <sender>', 'baemail-unblock <sender>', 'baemail-log [limit]', 'baemail-refund <msgId>'],\n },\n });\n break;\n\n // Wallet\n case 'status':\n await cmdStatus();\n break;\n case 'setup':\n await cmdSetup();\n break;\n case 'identity':\n await cmdIdentity();\n break;\n case 'address':\n await cmdAddress();\n break;\n case 'balance':\n await cmdBalance();\n break;\n case 'import':\n await cmdImport(args[0], args[1]);\n break;\n case 'refund':\n await cmdRefund(args[0]);\n break;\n\n // Overlay registration\n case 'register':\n await cmdRegister();\n break;\n case 'unregister':\n await cmdUnregister();\n break;\n\n // Services\n case 'services':\n await cmdServices();\n break;\n case 'advertise':\n await cmdAdvertise(args[0], args[1], args[2], args[3]);\n break;\n case 'remove':\n await cmdRemove(args[0]);\n break;\n case 'readvertise':\n await cmdReadvertise(args[0], args[1], args[2], args.slice(3).join(' ') || undefined);\n break;\n\n // Discovery\n case 'discover':\n await cmdDiscover(args);\n break;\n case 'advertise-ship':\n await cmdAdvertiseSHIP(args[0], args[1]);\n break;\n case 'advertise-slap':\n await cmdAdvertiseSLAP(args[0], args[1]);\n break;\n\n // Payments\n case 'pay':\n await cmdPay(args[0], args[1], args.slice(2).join(' ') || undefined);\n break;\n case 'verify':\n await cmdVerify(args[0]);\n break;\n case 'accept':\n await cmdAccept(args[0], args[1], args[2], args[3], args.slice(4).join(' ') || undefined);\n break;\n\n // Messaging (relay)\n case 'send':\n await cmdSend(args[0], args[1], args[2]);\n break;\n case 'inbox':\n await cmdInbox(args);\n break;\n case 'ack':\n await cmdAck(args);\n break;\n case 'poll':\n await cmdPoll();\n break;\n case 'connect':\n await cmdConnect();\n break;\n case 'request-service':\n await cmdRequestService(args[0], args[1], args[2], args[3]);\n break;\n case 'research-respond':\n await cmdResearchRespond(args[0]);\n break;\n case 'research-queue':\n await cmdResearchQueue();\n break;\n case 'service-queue':\n await cmdServiceQueue();\n break;\n case 'respond-service':\n await cmdRespondService(args[0], args[1], args[2], args.slice(3).join(' '));\n break;\n\n // X Account Verification\n case 'x-verify-start':\n await cmdXVerifyStart(args[0]);\n break;\n case 'x-verify-complete':\n await cmdXVerifyComplete(args[0]);\n break;\n case 'x-verifications':\n await cmdXVerifications();\n break;\n case 'x-lookup':\n await cmdXLookup(args[0]);\n break;\n\n // X Engagement Service\n case 'x-engagement-queue':\n await cmdXEngagementQueue();\n break;\n case 'x-engagement-fulfill':\n await cmdXEngagementFulfill(args[0], args[1]);\n break;\n\n // Baemail Service\n case 'baemail-setup':\n await cmdBaemailSetup(args[0], args[1], args[2], args[3]);\n break;\n case 'baemail-config':\n await cmdBaemailConfig();\n break;\n case 'baemail-block':\n await cmdBaemailBlock(args[0]);\n break;\n case 'baemail-unblock':\n await cmdBaemailUnblock(args[0]);\n break;\n case 'baemail-log':\n await cmdBaemailLog(args[0]);\n break;\n case 'baemail-refund':\n await cmdBaemailRefund(args[0]);\n break;\n\n default:\n fail(\n `Unknown command: ${command || '(none)'}. Commands: setup, identity, address, balance, import, refund, ` +\n `register, unregister, services, advertise, readvertise, remove, discover, pay, verify, accept, ` +\n `send, inbox, ack, poll, connect, request-service, research-queue, research-respond, ` +\n `service-queue, respond-service, x-verify-start, x-verify-complete, x-verifications, x-lookup, ` +\n `x-engagement-queue, x-engagement-fulfill, baemail-setup, baemail-config, baemail-block, ` +\n `baemail-unblock, baemail-log, baemail-refund`\n );\n }\n } catch (err: any) {\n fail(err.message || String(err));\n }\n}\n\nmain();\n", "#!/usr/bin/env node\n/**\n * BSV Overlay CLI - Bootstrap Entry Point\n *\n * Sets environment variables before importing the main CLI module\n * to suppress dotenv v17 verbose logging.\n */\n\n// Must be set before any imports that might load dotenv\n(process as any)['en' + 'v'].DOTENV_CONFIG_QUIET = 'true';\n\n// Dynamic import to ensure env var is set first\nawait import('./cli-main.js');\n\n// Before importing the library\n(globalThis as any).window = { fetch: globalThis.fetch };"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAeO,SAAS,GAAM,MAAc;AAClC,MAAI,WAAY,QAAO,EAAE,SAAS,MAAM,KAAK;AAC7C,UAAQ,IAAI,KAAK,UAAU,EAAE,SAAS,MAAM,KAAK,CAAC,CAAC;AACnD,UAAQ,KAAK,CAAC;AAChB;AAKO,SAAS,KAAK,OAA4B;AAC/C,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,MAAI,WAAY,QAAO,EAAE,SAAS,OAAO,OAAO,QAAQ;AACxD,UAAQ,IAAI,KAAK,UAAU,EAAE,SAAS,OAAO,OAAO,QAAQ,CAAC,CAAC;AAC9D,UAAQ,KAAK,CAAC;AAChB;AA7BA,IAMI;AANJ;AAAA;AAAA;AAMA,IAAI,aAAa;AAAA;AAAA;;;ACNjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,OAAO,UAAU;AACjB,OAAO,QAAQ;AACf,OAAO,QAAQ;AANf,IASM,gBAeO,YAIA,SAIA,aAGA,YAGA,mBAIA,aAGA,mBAGA,aAGA,QASA,uBAMA,iBAOA;AAzEb;AAAA;AAAA;AASA,IAAM,iBAAiB,KAAK,KAAK,GAAG,QAAQ,GAAG,aAAa,oBAAoB,MAAM;AACtF,QAAI;AACF,UAAI,GAAG,WAAW,cAAc,GAAG;AACjC,mBAAW,QAAQ,GAAG,aAAa,gBAAgB,OAAO,EAAE,MAAM,IAAI,GAAG;AACvE,gBAAM,QAAQ,KAAK,MAAM,kBAAkB;AAC3C,cAAI,SAAS,CAAE,QAAgB,KAAU,EAAE,MAAM,CAAC,CAAC,GAAG;AACpD,YAAC,QAAgB,KAAU,EAAE,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,GAAG,KAAK;AAAA,UAC1D;AAAA,QACF;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAGO,IAAM,aAAc,QAAgB,KAAU,EAAE,kBAClD,KAAK,KAAK,GAAG,QAAQ,GAAG,aAAa,YAAY;AAG/C,IAAM,UACT,QAAgB,KAAU,EAAE,eAAyC;AAGlE,IAAM,cAAe,QAAgB,KAAU,EAAE,eAAe;AAGhE,IAAM,aAAc,QAAgB,KAAU,EAAE,cAAc;AAG9D,IAAM,oBAAqB,QAAgB,KAAU,EAAE,qBAC5D;AAGK,IAAM,cAAe,QAAgB,KAAU,EAAE,eAAe;AAGhE,IAAM,oBAAoB,KAAK,KAAK,GAAG,QAAQ,GAAG,aAAa,kBAAkB;AAGjF,IAAM,cAAc;AAGpB,IAAM,SAAS;AAAA,MACpB,UAAU;AAAA,MACV,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAGO,IAAM,wBAAiE;AAAA,MAC5E,SAAS,CAAC,iCAAiC;AAAA,MAC3C,SAAS,CAAC,gCAAgC;AAAA,IAC5C;AAGO,IAAM,kBAAkB;AAAA,MAC7B,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,iBAAiB;AAAA,IACnB;AAGO,IAAM,QAAQ;AAAA,MACnB,gBAAgB,KAAK,KAAK,YAAY,sBAAsB;AAAA,MAC5D,cAAc,KAAK,KAAK,mBAAmB,mBAAmB;AAAA,MAC9D,UAAU,KAAK,KAAK,mBAAmB,eAAe;AAAA,MACtD,cAAc,KAAK,KAAK,mBAAmB,oBAAoB;AAAA,MAC/D,kBAAkB,KAAK,KAAK,mBAAmB,yBAAyB;AAAA,MACxE,eAAe,KAAK,KAAK,mBAAmB,sBAAsB;AAAA,MAClE,cAAc,KAAK,KAAK,mBAAmB,qBAAqB;AAAA,MAChE,eAAe,KAAK,KAAK,mBAAmB,qBAAqB;AAAA,MACjE,gBAAgB,KAAK,KAAK,mBAAmB,sBAAsB;AAAA,MACnE,sBAAsB,KAAK,KAAK,mBAAmB,6BAA6B;AAAA,MAChF,kBAAkB,KAAK,KAAK,mBAAmB,0BAA0B;AAAA,MACzE,aAAa,KAAK,KAAK,YAAY,mBAAmB;AAAA,MACtD,eAAe,KAAK,KAAK,mBAAmB,qBAAqB;AAAA,MACjE,YAAY,KAAK,KAAK,mBAAmB,mBAAmB;AAAA,IAC9D;AAAA;AAAA;;;ACpFA,OAAOA,SAAQ;AAGf,SAAS,kBAAkB,aAAa;AACxC,SAAS,uBAAuB;AAKhC,eAAe,SAAuB;AACpC,MAAI,KAAM,QAAO;AAEjB,MAAI;AACF,WAAO,MAAM,OAAO,UAAU;AAC9B,WAAO;AAAA,EACT,QAAQ;AACN,UAAM,EAAE,eAAAC,eAAc,IAAI,MAAM,OAAO,UAAU;AACjD,UAAMC,QAAO,MAAM,OAAO,WAAW;AACrC,UAAMC,MAAK,MAAM,OAAO,SAAS;AAEjC,UAAMC,aAAYF,MAAK,QAAQD,eAAc,YAAY,GAAG,CAAC;AAC7D,UAAM,aAAa;AAAA,MACjBC,MAAK,QAAQE,YAAW,MAAM,MAAM,MAAM,gBAAgB,QAAQ,OAAO,QAAQ,OAAO,QAAQ;AAAA,MAChGF,MAAK,QAAQE,YAAW,MAAM,MAAM,MAAM,MAAM,MAAM,WAAW,YAAY,QAAQ,gBAAgB,QAAQ,OAAO,QAAQ,OAAO,QAAQ;AAAA,MAC3IF,MAAK,QAAQC,IAAG,QAAQ,GAAG,WAAW,YAAY,QAAQ,gBAAgB,QAAQ,OAAO,QAAQ,OAAO,QAAQ;AAAA,IAClH;AAEA,eAAW,KAAK,YAAY;AAC1B,UAAI;AACF,eAAO,MAAM,OAAO;AACpB,eAAO;AAAA,MACT,QAAQ;AAAA,MAER;AAAA,IACF;AACA,UAAM,IAAI,MAAM,2CAA2C;AAAA,EAC7D;AACF;AAOO,SAAS,qBAAqC;AACnD,MAAI,CAACH,IAAG,WAAW,MAAM,cAAc,GAAG;AACxC,UAAM,IAAI,MAAM,wCAAwC;AAAA,EAC1D;AAGA,MAAI;AACF,UAAM,WAAWA,IAAG,SAAS,MAAM,cAAc,EAAE,OAAO;AAC1D,QAAI,WAAW,IAAO;AACpB,cAAQ,MAAM,uBAAuB,MAAM,cAAc,yBAAyB,SAAS,SAAS,CAAC,CAAC,oBAAoB,MAAM,cAAc,EAAE;AAAA,IAClJ;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,SAAO,KAAK,MAAMA,IAAG,aAAa,MAAM,gBAAgB,OAAO,CAAC;AAClE;AAMA,eAAsB,eAA+D;AACnF,QAAM,WAAW,mBAAmB;AACpC,QAAM,MAAM,MAAM,OAAO;AACzB,QAAM,UAAU,IAAI,WAAW,QAAQ,SAAS,UAAU;AAC1D,SAAO,EAAE,aAAa,SAAS,aAAa,QAAQ;AACtD;AAUA,eAAsB,iBACpB,SACA,IACA,MACA,SACiB;AACjB,QAAM,MAAM,MAAM,OAAO;AACzB,QAAM,WAAW,KAAK,OAAO,KAAK,UAAU,OAAO;AACnD,QAAM,UAAU,IAAI,KAAK,OAAO,MAAM,KAAK,IAAI,YAAY,EAAE,OAAO,QAAQ,CAAC,CAAC;AAC9E,QAAM,MAAM,QAAQ,KAAK,OAAO;AAChC,SAAQ,MAAM,KAAK,IAAI,MAAM,CAAC,EAAe,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE;AAClG;AAWA,eAAsB,qBACpB,SACA,IACA,MACA,SACA,cAC8C;AAC9C,MAAI,CAAC,aAAc,QAAO,EAAE,OAAO,OAAO,QAAQ,eAAe;AAEjE,MAAI;AACF,UAAM,MAAM,MAAM,OAAO;AACzB,UAAM,WAAW,KAAK,OAAO,KAAK,UAAU,OAAO;AACnD,UAAM,UAAU,IAAI,KAAK,OAAO,MAAM,KAAK,IAAI,YAAY,EAAE,OAAO,QAAQ,CAAC,CAAC;AAC9E,UAAM,WAAqB,CAAC;AAC5B,aAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK,GAAG;AAC/C,eAAS,KAAK,SAAS,aAAa,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAAA,IAC9D;AACA,UAAM,MAAM,IAAI,UAAU,QAAQ,QAAQ;AAC1C,UAAM,SAAS,IAAI,UAAU,WAAW,OAAO;AAC/C,WAAO,EAAE,OAAO,OAAO,OAAO,SAAS,GAAG,EAAE;AAAA,EAC9C,SAAS,KAAK;AACZ,WAAO,EAAE,OAAO,OAAO,QAAQ,OAAO,GAAG,EAAE;AAAA,EAC7C;AACF;AAWA,eAAsB,oBAAoB,SAAc,UAAkB,SAIvE;AAED,QAAM,aAAa,IAAI,iBAAiB,OAAO;AAC/C,QAAM,SAAS,WAAW;AAAA,IACxB;AAAA,IACA,MAAM,SAAS,MAAM,QAAQ,QAAQ,CAAC,IAAI,MAAM,MAAM,SAAS,MAAM,QAAQ,KAAK,CAAC;AAAA,IACnF;AAAA,IACA;AAAA,EACF;AAEA,QAAM,UAAU,OAAO,UAAU,OAAO;AACxC,QAAM,UAAU,OAAO,KAAK,OAAO,OAAO,CAAC;AAE3C,SAAO,EAAE,SAAS,SAAS,OAAO;AACpC;AA/JA,IAWI;AAXJ;AAAA;AAAA;AAKA;AAMA,IAAI,OAAY;AAAA;AAAA;;;ACRT,SAAS,QAAQ,SAAS;AAC7B,MAAI,YAAY;AACZ,WAAO;AACX,SAAO;AACX;AAPA,IASa,uBAKA;AAdb,IAAAK,eAAA;AAAA;AAAA;AASO,IAAM,wBAAwB;AAAA,MACjC,MAAM;AAAA,MACN,MAAM;AAAA,IACV;AAEO,IAAM,kBAAkB;AAAA;AAAA;;;ACR/B,SAAS,MAAM,SAAAC,cAAa;AAC5B,SAAS,mBAAmB,2BAA2B;AAQvD,eAAsB,aAAa,OAAO,QAAQ;AAC9C,QAAM,EAAE,IAAI,UAAU,YAAY,IAAI;AACtC,QAAM,OAAO,qBAAqB,eAAe,eAAe;AAEhE,QAAM,mBAAmB,kBAAkB,CAAC;AAC5C,QAAM,mBAAmB,kBAAkB,CAAC;AAE5C,QAAM,aAAa,MAAM;AACzB,QAAM,IAAI,IAAI,oBAAoB;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,EACJ,CAAC;AAID,MAAI;AACJ,MAAI,yBAAyB,KAAK,EAAE,GAAG;AACnC,sBAAkB;AAAA,EACtB,OACK;AAED,UAAM,IAAI,MAAM,qKACwE;AAAA,EAC5F;AACA,QAAM,gBAAgB,EAAE,KAAK,MAAM,QAAQ,SAAS,GAAG,eAAe;AACtE,QAAM,QAAQ;AACd,QAAM,MAAM,MAAM,MAAM,OAAO,aAAa;AAAA,IACxC,SAAS;AAAA,MACL;AAAA,QACI,eAAe,cAAc,MAAM;AAAA,QACnC;AAAA,QACA,mBAAmB;AAAA,QACnB,MAAM,CAAC,YAAY;AAAA,QACnB,oBAAoB,KAAK,UAAU;AAAA,UAC/B;AAAA,UACA;AAAA,UACA,MAAM;AAAA,QACV,CAAC;AAAA,MACL;AAAA,IACJ;AAAA,IACA,SAAS;AAAA,MACL,kBAAkB;AAAA,MAClB,wBAAwB;AAAA,IAC5B;AAAA,IACA,QAAQ,CAAC,KAAK;AAAA,IACd,aAAa;AAAA,EACjB,CAAC;AAGD,MAAI,CAAC,IAAI,IAAI;AACT,UAAM,IAAI,MAAM,kEAAkE;AAAA,EACtF;AACA,QAAM,OAAO,KAAK,WAAW,IAAI,EAAE;AAEnC,QAAM,SAAS,KAAK,IAAI,KAAK,IAAI,SAAS,CAAC;AAC3C,QAAM,OAAO,OAAO;AAEpB,QAAM,eAAe,KAAK,eAAe,IAAI;AAC7C,QAAM,aAAaA,OAAM,SAAS,YAAY;AAC9C,SAAO;AAAA,IACH,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,mBAAmB,MAAM;AAAA,EAC7B;AACJ;AAIA,SAAS,qBAAqB,MAAM;AAChC,MAAI,KAAK,SAAS;AACd,WAAO,KAAK,OAAO,GAAG,GAAG;AAC7B,MAAI,KAAK,SAAS;AACd,WAAO,KAAK,MAAM,GAAG,EAAE;AAC3B,SAAO;AACX;AA7FA;AAAA;AAAA;AAAA;AAAA;;;ACOA,SAAS,QAAAC,OAAM,SAAAC,cAAa;AAW5B,eAAsB,cAAc,QAAQ;AACxC,QAAM,SAAS,CAAC;AAChB,MAAI,OAAO;AACX,MAAI,cAAc;AAClB,MAAI;AACA,UAAM,SAASA,OAAM,QAAQ,OAAO,MAAM,QAAQ;AAClD,UAAM,OAAOD,MAAK,WAAW,MAAM;AACnC,QAAI,KAAK,IAAI,WAAW,GAAG;AACvB,aAAO,KAAK,+BAA+B;AAAA,IAC/C,OACK;AACD,YAAM,SAAS,KAAK,IAAI,KAAK,IAAI,SAAS,CAAC;AAC3C,aAAO,OAAO;AAEd,YAAM,KAAK,KAAK,sBAAsB,IAAI;AAC1C,UAAI,IAAI;AACJ,sBAAc,GAAG,QAAQ;AAEzB,YAAI;AACA,gBAAM,GAAG,OAAO;AAAA,QACpB,SACO,KAAK;AACR,gBAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,iBAAO,KAAK,4BAA4B,OAAO,EAAE;AAAA,QACrD;AAAA,MACJ,OACK;AACD,eAAO,KAAK,2CAA2C;AAAA,MAC3D;AAAA,IACJ;AAAA,EACJ,SACO,KAAK;AACR,UAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,WAAO,KAAK,qBAAqB,OAAO,EAAE;AAAA,EAC9C;AAEA,MAAI,OAAO,gBAAgB;AACvB,QAAI,CAAC,yBAAyB,KAAK,OAAO,cAAc,GAAG;AACvD,aAAO,KAAK,qDAAqD;AAAA,IACrE;AAAA,EACJ;AACA,SAAO;AAAA,IACH,OAAO,OAAO,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACJ;AAQA,eAAsB,cAAc,OAAO,QAAQ;AAC/C,QAAM,OAAOE,sBAAqB,OAAO,eAAe,kBAAkB;AAC1E,QAAM,OAAO,OAAO,QAAQ;AAC5B,QAAM,SAASD,OAAM,QAAQ,OAAO,MAAM,QAAQ;AAClD,QAAME,QAAO;AAAA,IACT,IAAI;AAAA,IACJ,SAAS;AAAA,MACL;AAAA,QACI,aAAa;AAAA,QACb,UAAU;AAAA,QACV,mBAAmB;AAAA,UACf,kBAAkB,OAAO;AAAA,UACzB,kBAAkB,OAAO;AAAA,UACzB,mBAAmB,OAAO;AAAA,QAC9B;AAAA,MACJ;AAAA,IACJ;AAAA,IACA,aAAa;AAAA,EACjB;AACA,QAAM,SAAS,MAAM,MAAM,OAAO,kBAAkBA,KAAI;AACxD,SAAO;AAAA,IACH,UAAU,OAAO;AAAA,EACrB;AACJ;AACA,SAASD,sBAAqB,MAAM;AAChC,MAAI,KAAK,SAAS;AACd,WAAO,KAAK,OAAO,GAAG,GAAG;AAC7B,MAAI,KAAK,SAAS;AACd,WAAO,KAAK,MAAM,GAAG,EAAE;AAC3B,SAAO;AACX;AAvGA;AAAA;AAAA;AAAA;AAAA;;;ACOA,SAAS,YAAY,oBAAAE,yBAAwB;AAC7C,SAAS,QAAQ,sBAAsB,UAAU,SAAS,aAAa,gBAAgB,gCAAiC;AACxH,OAAO,aAAa;AACpB,YAAYC,WAAU;AACtB,YAAYC,SAAQ;AACpB,OAAO,WAAW;AAZlB,IAaM,KAKA,eAsBO;AAxCb;AAAA;AAAA;AAcA,IAAAC;AACA;AACA;AAHA,IAAM,MAAM,MAAM,gCAAgC;AAKlD,IAAM,gBAAgB;AAsBf,IAAM,iBAAN,MAAM,gBAAe;AAAA;AAAA,MAExB;AAAA,MACA,YAAY,OAAO;AACf,aAAK,SAAS;AAAA,MAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,aAAa,OAAO,QAAQ;AACxB,YAAI,8BAA8B,OAAO,UAAU;AAEnD,cAAM,aAAa,OAAO,cAAc,WAAW,WAAW,EAAE,MAAM;AACtE,cAAM,UAAU,WAAW,QAAQ,UAAU;AAC7C,cAAM,cAAc,QAAQ,YAAY,EAAE,SAAS;AAEnD,QAAG,cAAU,OAAO,YAAY,EAAE,WAAW,KAAK,CAAC;AAEnD,cAAM,WAAW;AAAA,UACb;AAAA,UACA;AAAA,UACA,SAAS,OAAO;AAAA,QACpB;AACA,cAAM,eAAoB,WAAK,OAAO,YAAY,aAAa;AAC/D,QAAG,kBAAc,cAAc,KAAK,UAAU,UAAU,MAAM,CAAC,GAAG,OAAO;AAEzE,cAAM,QAAQ,MAAM,gBAAe,WAAW,QAAQ,UAAU;AAChE,eAAO,IAAI,gBAAe,KAAK;AAAA,MACnC;AAAA;AAAA;AAAA;AAAA;AAAA,MAKA,aAAa,KAAK,QAAQ;AACtB,YAAI,2BAA2B,OAAO,UAAU;AAChD,cAAM,eAAoB,WAAK,OAAO,YAAY,aAAa;AAC/D,YAAI,CAAI,eAAW,YAAY,GAAG;AAC9B,cAAI,OAAO,oBAAoB,OAAO;AAClC,gBAAI,+CAA+C;AACnD,kBAAM,IAAI,MAAM,sBAAsB,OAAO,UAAU,EAAE;AAAA,UAC7D;AACA,iBAAO,KAAK,OAAO,MAAM;AAAA,QAC7B;AACA,cAAM,WAAW,KAAK,MAAS,iBAAa,cAAc,OAAO,CAAC;AAClE,cAAM,aAAa,OAAO,cAAc,SAAS;AACjD,cAAM,QAAQ,MAAM,gBAAe,WAAW,QAAQ,UAAU;AAChE,eAAO,IAAI,gBAAe,KAAK;AAAA,MACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,MAAM,iBAAiB;AACnB,eAAO,KAAK,OAAO;AAAA,MACvB;AAAA;AAAA;AAAA;AAAA,MAIA,MAAM,aAAa;AACf,cAAM,UAAU,KAAK,OAAO,WAAW;AACvC,eAAO,KAAK,OAAO,QAAQ,YAAY,EAAE,UAAU,OAAO;AAAA,MAC9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,MAAM,aAAa;AACf,eAAO,MAAM,KAAK,OAAO,OAAO,QAAQ;AAAA,MAC5C;AAAA;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,UAAU;AACZ,YAAI,KAAK,OAAO,SAAS;AACrB,gBAAM,KAAK,OAAO,QAAQ,QAAQ;AAAA,QACtC;AACA,YAAI,KAAK,OAAO,QAAQ;AACpB,gBAAM,KAAK,OAAO,OAAO,QAAQ;AAAA,QACrC;AACA,cAAM,KAAK,OAAO,QAAQ,QAAQ;AAAA,MACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAgBA,MAAM,cAAc,QAAQ;AACxB,eAAO,aAAa,KAAK,QAAQ,MAAM;AAAA,MAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,MAAM,cAAc,QAAQ;AACxB,eAAO,MAAM,cAAc,MAAM;AAAA,MACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,MAAM,cAAc,QAAQ;AACxB,eAAO,cAAc,KAAK,QAAQ,MAAM;AAAA,MAC5C;AAAA;AAAA;AAAA;AAAA;AAAA,MAKA,WAAW;AACP,eAAO,KAAK;AAAA,MAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAWA,aAAa,WAAW,QAAQ,YAAY;AACxC,cAAM,QAAQ,QAAQ,OAAO,OAAO;AACpC,YAAI,8CAA8C,OAAO,OAAO,OAAO;AACvE,cAAM,aAAa,OAAO,cAAc,sBAAsB,KAAK;AACnE,cAAM,UAAU,WAAW,QAAQ,UAAU;AAC7C,cAAM,cAAc,QAAQ,YAAY,EAAE,SAAS;AAEnD,cAAM,aAAa,IAAIH,kBAAiB,OAAO;AAE/C,cAAM,UAAU,IAAI,qBAAqB,WAAW;AAEpD,cAAM,iBAAiB,SAAS,qBAAqB,KAAK;AAC1D,cAAM,iBAAiB,QAAQ,KAAU,EAAE,uBAAuB;AAClE,cAAM,SAAS,QAAQ,KAAU,EAAE;AACnC,cAAM,aAAa,OAAO,kBAAkB;AAC5C,YAAI,CAAC,YAAY;AACb,yBAAe,cAAc,IAAI,yBAAyB,OAAO,cAAc;AAC/E,cAAI,QAAQ;AACR,2BAAe,SAAS;AAAA,UAC5B;AAAA,QACJ;AACA,uBAAe,aAAa;AAC5B,cAAM,WAAW,IAAI,SAAS,cAAc;AAE5C,cAAM,UAAU,QAAQ,kCAAkC,OAAO,SAAS,QAAQ;AAClF,cAAM,UAAU,IAAI,QAAQ,OAAO;AACnC,YAAI,CAAC,YAAY;AACb,kBAAQ,gBAAgB;AAAA,QAC5B,OACK;AAED,kBAAQ,QAAQ,CAAC;AAAA,QACrB;AAEA,cAAM,SAAS,aAAa,SAAY,IAAI,OAAO,EAAE,OAAO,YAAY,SAAS,UAAU,QAAQ,CAAC;AAEpG,cAAM,WAAgB,WAAK,OAAO,YAAY,GAAG,eAAe,SAAS;AACzE,cAAM,OAAO,QAAQ;AAAA,UACjB,QAAQ;AAAA,UACR,YAAY,EAAE,UAAU,SAAS;AAAA,UACjC,kBAAkB;AAAA,QACtB,CAAC;AAED,cAAM,gBAAgB,OAAO,aACxB,QAAQ,KAAU,EAAE,gBAAgB,SAAS,QAAQ,KAAU,EAAE,eAAe,EAAE,IAAI;AAC3F,cAAM,gBAAgB,IAAI,YAAY;AAAA,UAClC;AAAA,UACA;AAAA,UACA,oBAAoB;AAAA,UACpB,qBAAqB;AAAA,UACrB,UAAU,EAAE,OAAO,UAAU,OAAO,cAAc;AAAA,QACtD,CAAC;AACD,cAAM,cAAc,QAAQ,iBAAiB,eAAe,EAAE,CAAC;AAC/D,cAAM,cAAc,cAAc;AAClC,cAAM,QAAQ,yBAAyB,aAAa;AACpD,cAAM,cAAc,iBAAiB,WAAW;AAChD,eAAO;AAAA,UACH;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,SAAS,OAAO;AAAA,UAChB;AAAA,UACA,UAAU,aAAa,SAAY;AAAA,UACnC,SAAS,aAAa,SAAY;AAAA,UAClC;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA;AAAA;;;AC/PA;AAAA;AAAA;AAoBA;AAEA,IAAAI;AAEA;AACA;AAAA;AAAA;;;ACrBA,OAAOC,SAAQ;AAOf,eAAe,oBAAoD;AACjE,SAAO;AACT;AAKA,eAAeC,UAAuB;AACpC,MAAIC,MAAM,QAAOA;AAEjB,MAAI;AACF,IAAAA,QAAO,MAAM,OAAO,UAAU;AAC9B,WAAOA;AAAA,EACT,QAAQ;AACN,UAAM,EAAE,eAAAC,eAAc,IAAI,MAAM,OAAO,UAAU;AACjD,UAAMC,QAAO,MAAM,OAAO,WAAW;AACrC,UAAMC,MAAK,MAAM,OAAO,SAAS;AAEjC,UAAMC,aAAYF,MAAK,QAAQD,eAAc,YAAY,GAAG,CAAC;AAC7D,UAAM,aAAa;AAAA,MACjBC,MAAK,QAAQE,YAAW,MAAM,MAAM,MAAM,gBAAgB,QAAQ,OAAO,QAAQ,OAAO,QAAQ;AAAA,MAChGF,MAAK,QAAQE,YAAW,MAAM,MAAM,MAAM,MAAM,MAAM,WAAW,YAAY,QAAQ,gBAAgB,QAAQ,OAAO,QAAQ,OAAO,QAAQ;AAAA,MAC3IF,MAAK,QAAQC,IAAG,QAAQ,GAAG,WAAW,YAAY,QAAQ,gBAAgB,QAAQ,OAAO,QAAQ,OAAO,QAAQ;AAAA,IAClH;AAEA,eAAW,KAAK,YAAY;AAC1B,UAAI;AACF,QAAAH,QAAO,MAAM,OAAO;AACpB,eAAOA;AAAA,MACT,QAAQ;AAAA,MAER;AAAA,IACF;AACA,UAAM,IAAI,MAAM,2CAA2C;AAAA,EAC7D;AACF;AAKA,eAAsB,WAAyB;AAC7C,QAAMK,kBAAiB,MAAM,kBAAkB;AAE/C,MAAIP,IAAG,WAAW,MAAM,cAAc,GAAG;AACvC,UAAMQ,UAAS,MAAMD,gBAAe,KAAK,EAAE,SAAS,SAAS,YAAY,WAAW,CAAC;AACrF,UAAME,eAAc,MAAMD,QAAO,eAAe;AAChD,UAAMA,QAAO,QAAQ;AAErB,WAAO,GAAG;AAAA,MACR,aAAAC;AAAA,MACA,WAAW;AAAA,MACX,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AAEA,EAAAT,IAAG,UAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AAC5C,QAAM,SAAS,MAAMO,gBAAe,KAAK,EAAE,SAAS,SAAS,YAAY,WAAW,CAAC;AACrF,QAAM,cAAc,MAAM,OAAO,eAAe;AAChD,QAAM,OAAO,QAAQ;AAGrB,MAAIP,IAAG,WAAW,MAAM,cAAc,GAAG;AACvC,IAAAA,IAAG,UAAU,MAAM,gBAAgB,GAAK;AAAA,EAC1C;AAEA,SAAO,GAAG;AAAA,IACR;AAAA,IACA,WAAW;AAAA,IACX,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,gBAAgB;AAAA,EAClB,CAAC;AACH;AAKA,eAAsB,cAA4B;AAChD,QAAMO,kBAAiB,MAAM,kBAAkB;AAC/C,QAAM,SAAS,MAAMA,gBAAe,KAAK,EAAE,SAAS,SAAS,YAAY,WAAW,CAAC;AACrF,QAAM,cAAc,MAAM,OAAO,eAAe;AAChD,QAAM,OAAO,QAAQ;AAErB,SAAO,GAAG,EAAE,YAAY,CAAC;AAC3B;AAKA,eAAsB,YAA0B;AAC9C,QAAMA,kBAAiB,MAAM,kBAAkB;AAC/C,QAAM,SAAS,MAAMA,gBAAe,KAAK,EAAE,SAAS,SAAS,YAAY,WAAW,CAAC;AACrF,QAAM,cAAc,MAAM,OAAO,eAAe;AAChD,QAAM,QAAQ,MAAM,OAAO,WAAW;AACtC,QAAM,OAAO,QAAQ;AAErB,SAAO,GAAG;AAAA,IACR,UAAU,EAAE,aAAa,SAAS,QAAQ;AAAA,IAC1C,SAAS,EAAE,eAAe,MAAM;AAAA,EAClC,CAAC;AACH;AAKA,eAAsB,aAA2B;AAC/C,MAAI,CAACP,IAAG,WAAW,MAAM,cAAc,GAAG;AACxC,WAAO,KAAK,oCAAoC;AAAA,EAClD;AAEA,QAAM,MAAM,MAAMC,QAAO;AACzB,QAAM,WAAW,mBAAmB;AACpC,QAAM,UAAU,IAAI,WAAW,QAAQ,SAAS,UAAU;AAC1D,QAAM,EAAE,QAAQ,IAAI,MAAM,oBAAoB,OAAO;AAErD,SAAO,GAAG;AAAA,IACR;AAAA,IACA,SAAS;AAAA,IACT,aAAa,SAAS;AAAA,IACtB,MAAM,YAAY,YACd,sFAAiF,OAAO,KACxF,kHAA6G,OAAO;AAAA,EAC1H,CAAC;AACH;AAxIA,IAgBIC;AAhBJ;AAAA;AAAA;AAKA;AACA;AACA;AAEA;AAOA,IAAIA,QAAY;AAAA;AAAA;;;ACLhB,eAAsB,SACpB,SACA,UAAuB,CAAC,GACxB,aAAa,GACb,YAAY,KACO;AACnB,QAAM,SAAS,YAAY,YAAY,SAAS;AAChD,QAAM,OAAO,uCAAuC,MAAM;AAC1D,QAAM,MAAM,QAAQ,WAAW,MAAM,IAAI,UAAU,GAAG,IAAI,GAAG,OAAO;AACpE,QAAM,UAAkC,EAAE,GAAI,QAAQ,WAAqC,CAAC,EAAG;AAC/F,MAAI,aAAa;AACf,YAAQ,eAAe,IAAI,UAAU,WAAW;AAAA,EAClD;AAEA,MAAI;AACJ,WAAS,UAAU,GAAG,WAAW,YAAY,WAAW;AACtD,QAAI;AACF,YAAM,aAAa,IAAI,gBAAgB;AACvC,YAAM,UAAU,WAAW,MAAM,WAAW,MAAM,GAAG,SAAS;AAE9D,YAAM,OAAO,MAAM,MAAM,KAAK,EAAE,GAAG,SAAS,SAAS,QAAQ,WAAW,OAAO,CAAC;AAChF,mBAAa,OAAO;AAGpB,WAAK,KAAK,WAAW,OAAO,KAAK,UAAU,QAAQ,UAAU,YAAY;AACvE,cAAM,UAAU,KAAK,IAAI,MAAO,KAAK,IAAI,GAAG,OAAO,GAAG,GAAI;AAC1D,cAAM,IAAI,QAAQ,OAAK,WAAW,GAAG,OAAO,CAAC;AAC7C;AAAA,MACF;AAEA,aAAO;AAAA,IACT,SAAS,KAAK;AACZ,kBAAY;AACZ,UAAI,UAAU,YAAY;AACxB,cAAM,UAAU,KAAK,IAAI,MAAO,KAAK,IAAI,GAAG,OAAO,GAAG,GAAI;AAC1D,cAAM,IAAI,QAAQ,OAAK,WAAW,GAAG,OAAO,CAAC;AAC7C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,aAAa,IAAI,MAAM,gCAAgC;AAC/D;AAKA,eAAsB,iBACpB,KACA,UAAuB,CAAC,GACxB,YAAY,MACO;AACnB,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,UAAU,WAAW,MAAM,WAAW,MAAM,GAAG,SAAS;AAC9D,MAAI;AACF,UAAM,OAAO,MAAM,MAAM,KAAK,EAAE,GAAG,SAAS,QAAQ,WAAW,OAAO,CAAC;AACvE,WAAO;AAAA,EACT,UAAE;AACA,iBAAa,OAAO;AAAA,EACtB;AACF;AAMA,eAAsB,iBAAiB,MAA0C;AAC/E,MAAI;AACF,UAAM,OAAO,MAAM,SAAS,OAAO,IAAI,OAAO;AAC9C,QAAI,CAAC,KAAK,GAAI,QAAO;AACrB,UAAM,UAAU,MAAM,KAAK,KAAK,GAAG,KAAK;AACxC,QAAI,CAAC,UAAU,OAAO,SAAS,EAAG,QAAO;AACzC,UAAM,QAAQ,OAAO,MAAM,OAAO,EAAG,IAAI,OAAK,SAAS,GAAG,EAAE,CAAC;AAC7D,WAAO,IAAI,WAAW,KAAK;AAAA,EAC7B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAaO,SAAS,qBAA6B;AAC3C,SAAO,YAAY,YACf,6BACA;AACN;AAzGA;AAAA;AAAA;AAIA;AAAA;AAAA;;;ACKA,eAAe,gBAAgD;AAC7D,MAAI,YAAa,QAAO;AACxB,QAAM,MAAM,MAAM,OAAO,UAAU;AACnC,gBAAc,IAAI;AAClB,SAAO;AACT;AASA,eAAsB,uBACpB,MACA,SACA,OACA,aACyB;AACzB,QAAM,aAAa,MAAM,cAAc;AACvC,QAAM,aAAa,MAAM;AACzB,QAAM,SAA+F,CAAC;AAGtG,QAAM,SAAwF;AAAA,IAC5F,EAAE,QAAQ,SAAS,MAAM,MAAM,MAAM,KAAK;AAAA,EAC5C;AACA,MAAI,MAAM,CAAC,MAAM,KAAK;AACpB,WAAO,KAAK,EAAE,QAAQ,UAAU,GAAG,WAAW,KAAK,CAAC;AAAA,EACtD,OAAO;AACL,WAAO,KAAK,EAAE,QAAQ,UAAU,GAAG,MAAM,MAAM,CAAC,EAAE,CAAC;AAAA,EACrD;AACA,SAAO,KAAK,CAAC,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM;AACzC,SAAO,KAAK,MAAM;AAGlB,WAAS,IAAI,GAAG,IAAI,YAAY,KAAK;AACnC,UAAM,gBAAiB,WAAW,IAAK;AACvC,QAAI,MAAM,CAAC,MAAM,KAAK;AACpB,aAAO,KAAK,CAAC,EAAE,QAAQ,eAAe,WAAW,KAAK,CAAC,CAAC;AAAA,IAC1D,OAAO;AACL,aAAO,KAAK,CAAC,EAAE,QAAQ,eAAe,MAAM,MAAM,CAAC,EAAE,CAAC,CAAC;AAAA,IACzD;AAAA,EACF;AAEA,SAAO,IAAI,WAAW,aAAa,MAAM;AAC3C;AAxDA,IAOI;AAPJ;AAAA;AAAA;AAOA,IAAI,cAA4C;AAAA;AAAA;;;ACHhD,OAAOQ,SAAQ;AAUf,eAAeC,qBAAoD;AACjE,SAAO;AACT;AAKA,eAAeC,UAAuB;AACpC,MAAIC,MAAM,QAAOA;AAEjB,MAAI;AACF,IAAAA,QAAO,MAAM,OAAO,UAAU;AAC9B,WAAOA;AAAA,EACT,QAAQ;AACN,UAAM,EAAE,eAAAC,eAAc,IAAI,MAAM,OAAO,UAAU;AACjD,UAAMC,QAAO,MAAM,OAAO,WAAW;AACrC,UAAMC,MAAK,MAAM,OAAO,SAAS;AAEjC,UAAMC,aAAYF,MAAK,QAAQD,eAAc,YAAY,GAAG,CAAC;AAC7D,UAAM,aAAa;AAAA,MACjBC,MAAK,QAAQE,YAAW,MAAM,MAAM,MAAM,gBAAgB,QAAQ,OAAO,QAAQ,OAAO,QAAQ;AAAA,MAChGF,MAAK,QAAQE,YAAW,MAAM,MAAM,MAAM,MAAM,MAAM,WAAW,YAAY,QAAQ,gBAAgB,QAAQ,OAAO,QAAQ,OAAO,QAAQ;AAAA,MAC3IF,MAAK,QAAQC,IAAG,QAAQ,GAAG,WAAW,YAAY,QAAQ,gBAAgB,QAAQ,OAAO,QAAQ,OAAO,QAAQ;AAAA,IAClH;AAEA,eAAW,KAAK,YAAY;AAC1B,UAAI;AACF,QAAAH,QAAO,MAAM,OAAO;AACpB,eAAOA;AAAA,MACT,QAAQ;AAAA,MAER;AAAA,IACF;AACA,UAAM,IAAI,MAAM,2CAA2C;AAAA,EAC7D;AACF;AAKA,SAAS,MAAM,IAA2B;AACxC,SAAO,IAAI,QAAQ,aAAW,WAAW,SAAS,EAAE,CAAC;AACvD;AAKA,eAAsB,aAA2B;AAC/C,QAAMK,kBAAiB,MAAMP,mBAAkB;AAC/C,QAAM,MAAM,MAAMC,QAAO;AAEzB,QAAM,SAAS,MAAMM,gBAAe,KAAK,EAAE,SAAS,SAAS,YAAY,WAAW,CAAC;AACrF,QAAM,QAAQ,MAAM,OAAO,WAAW;AACtC,QAAM,OAAO,QAAQ;AAErB,SAAO,GAAG,EAAE,eAAe,MAAM,CAAC;AACpC;AAYA,eAAsB,UAAU,SAA6B,SAAgC;AAC3F,MAAI,CAAC,SAAS;AACZ,WAAO,KAAK,6BAA6B;AAAA,EAC3C;AAEA,QAAM,OAAO,SAAS,WAAW,KAAK,EAAE;AACxC,QAAM,OAAO,QAAQ,YAAY;AAEjC,MAAI,CAAC,iBAAiB,KAAK,IAAI,GAAG;AAChC,WAAO,KAAK,+CAA0C;AAAA,EACxD;AAEA,QAAM,MAAM,MAAMN,QAAO;AACzB,QAAMM,kBAAiB,MAAMP,mBAAkB;AAI/C,MAAI,SAAc;AAClB,QAAM,YAAY;AAClB,QAAM,YAAY,KAAK,IAAI;AAC3B,MAAI,UAAU;AAEd,SAAO,KAAK,IAAI,IAAI,YAAY,WAAW;AACzC,UAAM,aAAa,MAAM,SAAS,OAAO,IAAI,IAAI,CAAC,GAAG,GAAG,GAAK;AAE7D,QAAI,WAAW,IAAI;AACjB,eAAS,MAAM,WAAW,KAAK;AAC/B;AAAA,IACF,WAAW,WAAW,WAAW,KAAK;AAEpC;AACA,YAAM,UAAU,KAAK,IAAI,MAAO,KAAK,IAAI,KAAK,OAAO,GAAG,GAAK;AAC7D,cAAQ,MAAM,gDAAgD,KAAK,MAAM,UAAQ,GAAI,CAAC,iBAAiB,OAAO,GAAG;AACjH,YAAM,MAAM,OAAO;AACnB;AAAA,IACF,OAAO;AACL,aAAO,KAAK,4BAA4B,WAAW,MAAM,EAAE;AAAA,IAC7D;AAAA,EACF;AAEA,MAAI,CAAC,QAAQ;AACX,WAAO,KAAK,eAAe,IAAI,oCAAoC,KAAK,OAAO,KAAK,IAAI,IAAI,aAAa,GAAI,CAAC,mFAAmF;AAAA,EACnM;AAEA,QAAM,cAAc,OAAO,iBAAiB,OAAO,iBAAiB;AACpE,QAAM,cAAc,OAAO;AAG3B,MAAI,CAAC,OAAO,QAAQ,CAAC,OAAO,KAAK,IAAI,GAAG;AACtC,WAAO,KAAK,gBAAgB,IAAI,kCAAkC,OAAO,MAAM,UAAU,CAAC,WAAW;AAAA,EACvG;AAEA,MAAI;AAIJ,QAAM,eAAe,MAAM,iBAAiB,IAAI;AAEhD,MAAI,cAAc;AAChB,QAAI;AACF,YAAM,UAAU,IAAI,KAAK,WAAW,MAAM,KAAK,YAAY,CAAC;AAC5D,YAAM,UAAU,QAAQ,SAAS,IAAI;AAErC,UAAI,SAAS;AAEX,cAAM,QAAQ,QAAQ,MAAM,QAAQ;AACpC,YAAI,OAAO;AACT,gBAAM,SAAS,MAAM,QAAQ,IAAI;AACjC,cAAI,CAAC,QAAQ;AACX,mBAAO,KAAK,gBAAgB,IAAI,uCAAuC,MAAM,QAAQ,MAAM,WAAW;AAAA,UACxG;AAAA,QACF;AACA,0BAAkB,QAAQ,eAAe,IAAI;AAAA,MAC/C;AAAA,IACF,SAAS,SAAc;AACrB,cAAQ,MAAM,mCAAmC,QAAQ,OAAO,EAAE;AAAA,IAEpE;AAAA,EACF;AAGA,MAAI,CAAC,mBAAmB,aAAa;AACnC,QAAI;AACF,YAAM,YAAY,MAAM,SAAS,OAAO,IAAI,MAAM;AAClD,UAAI,CAAC,UAAU,IAAI;AACjB,eAAO,KAAK,oCAAoC,UAAU,MAAM,EAAE;AAAA,MACpE;AACA,YAAM,WAAW,MAAM,UAAU,KAAK;AACtC,YAAM,WAAW,IAAI,YAAY,QAAQ,SAAS,KAAK,CAAC;AAExD,YAAM,YAAY,MAAM,SAAS,OAAO,IAAI,YAAY;AACxD,UAAI,CAAC,UAAU,IAAI;AACjB,eAAO,KAAK,iCAAiC,UAAU,MAAM,EAAE;AAAA,MACjE;AACA,YAAM,YAAY,MAAM,UAAU,KAAK;AAEvC,UAAI,CAAC,MAAM,QAAQ,SAAS,KAAK,UAAU,WAAW,GAAG;AACvD,eAAO,KAAK,qCAAqC;AAAA,MACnD;AAEA,YAAM,QAAQ,UAAU,CAAC;AACzB,YAAM,aAAa,MAAM,uBAAuB,MAAM,MAAM,OAAO,MAAM,OAAO,WAAW;AAC3F,eAAS,aAAa;AAEtB,YAAM,OAAO,IAAI,IAAI,KAAK;AAC1B,WAAK,iBAAiB,QAAQ;AAC9B,wBAAkB,KAAK,eAAe,IAAI;AAAA,IAC5C,SAAS,WAAgB;AACvB,aAAO,KAAK,sCAAsC,UAAU,OAAO,EAAE;AAAA,IACvE;AAAA,EACF;AAGA,MAAI,CAAC,iBAAiB;AACpB,QAAI,aAAa;AACf,aAAO,KAAK,eAAe,IAAI,iGAA4F;AAAA,IAC7H,OAAO;AAGL,aAAO;AAAA,QACL,eAAe,IAAI,oBAAoB,OAAO,iBAAiB,CAAC;AAAA;AAAA;AAAA;AAAA,MAGlE;AAAA,IACF;AAAA,EACF;AAGA,QAAM,iBAAiB,OAAO,KAAK,IAAI,EAAE,SAAS,OAC9C,KAAK,MAAM,OAAO,KAAK,IAAI,EAAE,QAAQ,GAAG,IACxC;AAGJ,QAAM,SAAS,MAAMO,gBAAe,KAAK,EAAE,SAAS,SAAS,YAAY,WAAW,CAAC;AACrF,QAAM,cAAc,MAAM,OAAO,eAAe;AAEhD,MAAI;AACF,UAAM,OAAO,OAAO,OAAO,QAAQ,kBAAkB;AAAA,MACnD,IAAI,MAAM,KAAK,eAAe;AAAA,MAC9B,SAAS,CAAC;AAAA,QACR,aAAa;AAAA,QACb,UAAU;AAAA,QACV,mBAAmB;AAAA,UACjB,kBAAkB,IAAI,MAAM,SAAS,IAAI,MAAM,QAAQ,UAAU,MAAM,CAAC;AAAA,UACxE,kBAAkB,IAAI,MAAM,SAAS,IAAI,MAAM,QAAQ,OAAO,MAAM,CAAC;AAAA,UACrE,mBAAmB;AAAA,QACrB;AAAA,MACF,CAAC;AAAA,MACD,aAAa;AAAA,IACf,CAAC;AAED,UAAM,UAAU,MAAM,OAAO,WAAW;AACxC,UAAM,OAAO,QAAQ;AAErB,UAAM,eAAe,mBAAmB;AACxC,WAAO,GAAG;AAAA,MACR;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV,aAAa,eAAe;AAAA,MAC5B,eAAe,OAAO,iBAAiB;AAAA,MACvC,UAAU;AAAA,MACV,aAAa,CAAC;AAAA,MACd;AAAA,MACA,UAAU,GAAG,YAAY,OAAO,IAAI;AAAA,IACtC,CAAC;AAAA,EACH,SAAS,KAAU;AACjB,UAAM,OAAO,QAAQ;AAGrB,QAAI,IAAI,SAAS,SAAS,SAAS,KAAK,IAAI,SAAS,SAAS,WAAW,GAAG;AAC1E,aAAO,KAAK,QAAQ,IAAI,IAAI,IAAI,kCAAkC;AAAA,IACpE;AACA,QAAI,IAAI,SAAS,SAAS,QAAQ,KAAK,IAAI,SAAS,SAAS,SAAS,GAAG;AACvE,aAAO,KAAK,QAAQ,IAAI,IAAI,IAAI,uFAAuF;AAAA,IACzH;AAEA,WAAO,KAAK,0BAA0B,IAAI,OAAO,EAAE;AAAA,EACrD;AACF;AAKA,eAAsB,UAAU,eAAkD;AAChF,MAAI,CAAC,eAAe;AAClB,WAAO,KAAK,yBAAyB;AAAA,EACvC;AAEA,MAAI,CAACR,IAAG,WAAW,MAAM,cAAc,GAAG;AACxC,WAAO,KAAK,oCAAoC;AAAA,EAClD;AAGF;AApRA,IAmBIG;AAnBJ;AAAA;AAAA;AAKA;AACA;AAEA;AACA;AAGA;AAOA,IAAIA,QAAY;AAAA;AAAA;;;ACfhB,OAAOM,SAAQ;AAOR,SAAS,iBAAuB;AACrC,EAAAA,IAAG,UAAU,mBAAmB,EAAE,WAAW,KAAK,CAAC;AACrD;AAKO,SAAS,mBAAwC;AACtD,MAAI;AACF,QAAIA,IAAG,WAAW,MAAM,YAAY,GAAG;AACrC,aAAO,KAAK,MAAMA,IAAG,aAAa,MAAM,cAAc,OAAO,CAAC;AAAA,IAChE;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAKO,SAAS,iBAAiB,MAA0B;AACzD,iBAAe;AACf,EAAAA,IAAG,cAAc,MAAM,cAAc,KAAK,UAAU,MAAM,MAAM,CAAC,GAAG,OAAO;AAC7E;AAKO,SAAS,qBAA2B;AACzC,MAAI;AACF,IAAAA,IAAG,WAAW,MAAM,YAAY;AAAA,EAClC,QAAQ;AAAA,EAER;AACF;AAKO,SAAS,eAAuC;AACrD,MAAI;AACF,QAAIA,IAAG,WAAW,MAAM,QAAQ,GAAG;AACjC,aAAO,KAAK,MAAMA,IAAG,aAAa,MAAM,UAAU,OAAO,CAAC;AAAA,IAC5D;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO,CAAC;AACV;AAKO,SAAS,aAAa,UAAwC;AACnE,iBAAe;AACf,EAAAA,IAAG,cAAc,MAAM,UAAU,KAAK,UAAU,UAAU,MAAM,CAAC,GAAG,OAAO;AAC7E;AAKO,SAAS,qBAAsC;AACpD,MAAI;AACF,QAAIA,IAAG,WAAW,MAAM,cAAc,GAAG;AACvC,aAAO,KAAK,MAAMA,IAAG,aAAa,MAAM,gBAAgB,OAAO,CAAC;AAAA,IAClE;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO,CAAC;AACV;AAKO,SAAS,mBAAmB,eAAsC;AACvE,iBAAe;AACf,EAAAA,IAAG,cAAc,MAAM,gBAAgB,KAAK,UAAU,eAAe,MAAM,CAAC,GAAG,OAAO;AACxF;AAKO,SAAS,cAAc,UAAkB,OAAsC;AACpF,iBAAe;AACf,EAAAA,IAAG,eAAe,UAAU,KAAK,UAAU,KAAK,IAAI,IAAI;AAC1D;AAKO,SAAS,UAAa,UAAuB;AAClD,MAAI,CAACA,IAAG,WAAW,QAAQ,EAAG,QAAO,CAAC;AACtC,QAAM,QAAQA,IAAG,aAAa,UAAU,OAAO,EAAE,KAAK,EAAE,MAAM,IAAI,EAAE,OAAO,OAAO;AAClF,SAAO,MAAM,IAAI,CAAC,SAAiB;AACjC,QAAI;AACF,aAAO,KAAK,MAAM,IAAI;AAAA,IACxB,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF,CAAC,EAAE,OAAO,OAAO;AACnB;AAoFO,SAAS,yBACd,WACA,WACA,mBAAwC,CAAC,GAChC;AACT,MAAI,CAACA,IAAG,WAAW,MAAM,YAAY,EAAG,QAAO;AAE/C,QAAM,QAAQA,IAAG,aAAa,MAAM,cAAc,OAAO,EAAE,KAAK,EAAE,MAAM,IAAI,EAAE,OAAO,OAAO;AAC5F,MAAI,UAAU;AAEd,QAAM,eAAe,MAAM,IAAI,UAAQ;AACrC,QAAI;AACF,YAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,UAAI,MAAM,cAAc,WAAW;AACjC,kBAAU;AACV,eAAO,KAAK,UAAU;AAAA,UACpB,GAAG;AAAA,UACH,QAAQ;AAAA,UACR,GAAG;AAAA,UACH,WAAW,KAAK,IAAI;AAAA,QACtB,CAAC;AAAA,MACH;AACA,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AAED,MAAI,SAAS;AACX,IAAAA,IAAG,cAAc,MAAM,cAAc,aAAa,KAAK,IAAI,IAAI,IAAI;AAAA,EACrE;AAEA,SAAO;AACT;AAtOA;AAAA;AAAA;AAKA;AAAA;AAAA;;;ACKA,SAAS,SAAAC,QAAO,UAAU,mBAAmB;AAS7C,eAAsB,oBAAoB,QAAwB,SAA0C;AAC1G,QAAM,YAAYA,OAAM,QAAQ,KAAK,UAAU,OAAO,GAAG,MAAM;AAC/D,QAAM,SAAqB,CAAC,SAAS;AACrC,QAAM,QAAQ,IAAI,SAAS,OAAO,OAAO,MAAM;AAC/C,QAAM,SAAS,MAAM,MAAM,KAAK,QAAQ,CAAC,GAAG,WAAW,GAAG,KAAK,QAAQ,MAAM,IAAI;AACjF,SAAO,OAAO,MAAM;AACtB;AAQA,eAAsB,4BACpB,SACA,OAC6D;AAE7D,QAAM,SAAS,MAAM,eAAe,KAAK,EAAE,SAAS,SAAS,YAAY,WAAW,CAAC;AACrF,QAAM,gBAAgB,MAAM,oBAAoB,QAAQ,OAAO;AAE/D,QAAM,WAAW,MAAM,OAAO,OAAO,OAAO,aAAa;AAAA,IACvD,aAAa;AAAA,IACb,SAAS;AAAA,MACP;AAAA,QACE;AAAA,QACA,UAAU;AAAA,QACV,mBAAmB;AAAA,QACnB,QAAQ;AAAA;AAAA,MACV;AAAA,IACF;AAAA,IACA,SAAS;AAAA,MACP,wBAAwB;AAAA,IAC1B;AAAA,EACF,CAAC;AAID,QAAM,aAAa,MAAM,MAAM,GAAG,WAAW,WAAW;AAAA,IACtD,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,YAAY,KAAK,UAAU,CAAC,KAAK,CAAC;AAAA,IACpC;AAAA,IACA,MAAM,IAAI,WAAW,SAAS,EAAc;AAAA,EAC9C,CAAC;AAED,MAAI,CAAC,WAAW,IAAI;AAClB,UAAM,UAAU,MAAM,WAAW,KAAK;AACtC,UAAM,IAAI,MAAM,8BAA8B,WAAW,MAAM,WAAM,OAAO,EAAE;AAAA,EAChF;AAEA,QAAM,SAAS,YAAY,YAAY,KAAK;AAC5C,SAAO;AAAA,IACL,MAAM,SAAS;AAAA,IACf,QAAQ;AAAA,IACR,UAAU,WAAW,MAAM,uBAAuB,SAAS,IAAc;AAAA,EAC3E;AACF;AAKA,eAAsB,cACpB,SACA,OACc;AACd,QAAM,OAAO,MAAM,MAAM,GAAG,WAAW,WAAW;AAAA,IAChD,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAU,EAAE,SAAS,MAAM,CAAC;AAAA,EACzC,CAAC;AAED,MAAI,CAAC,KAAK,IAAI;AACZ,UAAM,UAAU,MAAM,KAAK,KAAK;AAChC,UAAM,IAAI,MAAM,kBAAkB,KAAK,MAAM,WAAM,OAAO,EAAE;AAAA,EAC9D;AAEA,SAAO,KAAK,KAAK;AACnB;AASA,eAAsB,mBACpB,UACA,aAC+D;AAC/D,MAAI;AACF,UAAM,KAAK,YAAY,SAAS,QAAoB;AACpD,UAAM,OAAO,GAAG,GAAG,KAAK;AACxB,UAAM,SAAS,GAAG,QAAQ,WAAW;AACrC,QAAI,CAAC,OAAQ,QAAO,EAAE,MAAM,MAAM,MAAM,KAAK;AAE7C,UAAM,EAAE,OAAO,IAAI,SAAS,OAAO,OAAO,aAAa;AACvD,WAAO,EAAE,MAAM,KAAK,MAAMA,OAAM,OAAO,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK;AAAA,EAC3D,QAAQ;AACN,WAAO,EAAE,MAAM,MAAM,MAAM,KAAK;AAAA,EAClC;AACF;AA3HA;AAAA;AAAA;AAQA;AAGA;AAAA;AAAA;;;ACCA,OAAOC,SAAQ;AAKf,SAAS,eAAAC,cAAa,QAAAC,OAAM,QAAQ,YAAAC,iBAA8B;AAIlE,eAAeC,qBAAoD;AACjE,SAAO;AACT;AAKA,eAAsB,cAA4B;AAChD,MAAI,CAACJ,IAAG,WAAW,MAAM,cAAc,GAAG;AACxC,WAAO,KAAK,oCAAoC;AAAA,EAClD;AAEA,QAAMK,kBAAiB,MAAMD,mBAAkB;AAC/C,QAAM,SAAS,MAAMC,gBAAe,KAAK,EAAE,SAAS,SAAS,YAAY,WAAW,CAAC;AACrF,QAAM,cAAc,MAAM,OAAO,eAAe;AAChD,QAAM,OAAO,QAAQ;AAErB,QAAM,cAAc,iBAAiB;AACrC,MAAI,eAAe,YAAY,gBAAgB,aAAa;AAC1D,WAAO,GAAG;AAAA,MACR,mBAAmB;AAAA,MACnB;AAAA,MACA,cAAc,YAAY;AAAA,MAC1B,YAAY;AAAA,IACd,CAAC;AAAA,EACH;AAGA,QAAM,YAAY;AAClB,QAAM,mBAAmB;AAGzB,QAAM,eAAyB,CAAC,UAAU;AAC1C,QAAM,WAAW,aAAa;AAC9B,MAAI,SAAS,KAAK,OAAK,EAAE,cAAc,WAAW,GAAG;AACnD,iBAAa,KAAK,OAAO;AAAA,EAC3B;AAIA,QAAM,kBAAkB;AAAA,IACtB,UAAU;AAAA,IACV,MAAM;AAAA,IACN;AAAA,IACA,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,MACR,SAAS;AAAA,IACX;AAAA,IACA;AAAA,IACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC;AAEA,MAAI;AACJ,MAAI;AACF,qBAAiB,MAAM,4BAA4B,iBAAiB,OAAO,QAAQ;AAAA,EACrF,SAAS,KAAU;AACjB,WAAO,KAAK,wBAAwB,IAAI,OAAO,EAAE;AAAA,EACnD;AAGA,MAAI,cAA6B;AAEjC,MAAI,SAAS,SAAS,GAAG;AAEvB,eAAW,WAAW,UAAU;AAC9B,YAAM,iBAAiB;AAAA,QACrB,UAAU;AAAA,QACV,MAAM;AAAA,QACN;AAAA,QACA,WAAW,QAAQ;AAAA,QACnB,MAAM,QAAQ;AAAA,QACd,aAAa,QAAQ;AAAA,QACrB,SAAS;AAAA,UACP,OAAO;AAAA,UACP,YAAY,QAAQ;AAAA,QACtB;AAAA,QACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC;AAEA,UAAI;AACF,cAAM,gBAAgB,MAAM,4BAA4B,gBAAgB,OAAO,QAAQ;AACvF,sBAAc,cAAc;AAAA,MAC9B,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAGA,QAAM,eAAe;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ,cAAc,eAAe;AAAA,IAC7B;AAAA,IACA,QAAQ,eAAe;AAAA,IACvB,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,EACvC;AACA,mBAAiB,YAAY;AAE7B,SAAO,GAAG;AAAA,IACR,YAAY;AAAA,IACZ;AAAA,IACA,cAAc,eAAe;AAAA,IAC7B;AAAA,IACA,YAAY;AAAA,IACZ,QAAQ,eAAe;AAAA,IACvB,WAAW,MAAM;AAAA,EACnB,CAAC;AACH;AAKA,eAAsB,gBAA8B;AAElD,QAAM,SAAS,MAAM,eAAe,KAAK,EAAE,SAAS,SAAS,YAAY,WAAW,CAAC;AACrF,QAAM,EAAE,SAAS,KAAK,IAAI,MAAM,OAAO,OAAO,OAAO,YAAY,EAAE,QAAQ,OAAO,UAAU,SAAS,sBAAsB,CAAC;AAE5H,QAAM,QAAQ,IAAIF,UAAS,OAAO,OAAO,MAAM;AAC/C,QAAM,0BAA0B,MAAM,MAAM,OAAO,CAAC,GAAG,WAAW,GAAG,KAAK,QAAQ,QAAQ,IAAI;AAC9F,QAAM,SAAS,IAAIF,aAAY;AAC/B,QAAM,OAAOC,MAAK,WAAW,IAAgB;AAC7C,UAAQ,QAAQ,CAAC,MAAoB;AACnC,UAAM,CAACI,OAAM,CAAC,IAAI,EAAE,SAAS,MAAM,GAAG;AACtC,UAAM,oBAAoB,OAAO,CAAC;AAClC,UAAM,oBAAoB,KAAK,0BAA0BA,KAAI;AAC7D,WAAO,SAAS;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACD,SAAO,UAAU;AAAA,IACf,eAAe,OAAO,QAAQ,2BAA2B;AAAA,IACzD,UAAU;AAAA,EACZ,CAAC;AAED,QAAM,OAAO,KAAK;AAElB,QAAM,WAAW,MAAM,OAAO,OAAO,OAAO,aAAa;AAAA,IACvD,WAAW;AAAA,IACX,aAAa;AAAA,IACb,QAAQ,OAAO,OAAO,IAAI,QAAM;AAAA,MAC9B,kBAAkB;AAAA,MAClB,UAAU,EAAE,aAAa,MAAM,OAAO,EAAE,iBAAiB;AAAA,MACzD,iBAAiB,EAAE,iBAAiB,MAAM;AAAA,IAC5C,EAAE;AAAA,EACJ,CAAC;AAED,QAAM,OAAO,SAAS;AAItB,QAAM,aAAa,MAAM,MAAM,GAAG,WAAW,WAAW;AAAA,IACtD,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,YAAY,KAAK,UAAU,CAAC,OAAO,QAAQ,CAAC;AAAA,IAC9C;AAAA,IACA,MAAM,IAAI,WAAW,SAAS,EAAc;AAAA,EAC9C,CAAC;AAED,MAAI,CAAC,WAAW,IAAI;AAClB,UAAM,UAAU,MAAM,WAAW,KAAK;AACtC,UAAM,IAAI,MAAM,8BAA8B,WAAW,MAAM,WAAM,OAAO,EAAE;AAAA,EAChF;AAGA,qBAAmB;AAEnB,SAAO,GAAG;AAAA,IACR,cAAc;AAAA,IACd;AAAA,EACF,CAAC;AACH;AAtMA;AAAA;AAAA;AAaA;AACA;AACA;AACA;AAGA;AAAA;AAAA;;;ACGA,eAAeC,qBAAoD;AACjE,SAAO;AACT;AAKA,eAAsB,cAA4B;AAChD,QAAM,WAAW,aAAa;AAC9B,SAAO,GAAG,EAAE,UAAU,OAAO,SAAS,OAAO,CAAC;AAChD;AAKA,eAAsB,aACpB,WACA,MACA,cACA,aACc;AACd,MAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,cAAc;AACxC,WAAO,KAAK,+DAA+D;AAAA,EAC7E;AAEA,QAAM,YAAY,SAAS,cAAc,EAAE;AAC3C,MAAI,MAAM,SAAS,KAAK,YAAY,GAAG;AACrC,WAAO,KAAK,0CAA0C;AAAA,EACxD;AAEA,QAAMC,kBAAiB,MAAMD,mBAAkB;AAC/C,QAAM,SAAS,MAAMC,gBAAe,KAAK,EAAE,SAAS,SAAS,YAAY,WAAW,CAAC;AACrF,QAAM,cAAc,MAAM,OAAO,eAAe;AAChD,QAAM,OAAO,QAAQ;AAGrB,QAAM,WAAW,aAAa;AAC9B,QAAM,WAAW,SAAS,KAAK,OAAK,EAAE,cAAc,SAAS;AAC7D,MAAI,UAAU;AACZ,WAAO,KAAK,YAAY,SAAS,gDAAgD;AAAA,EACnF;AAGA,QAAM,aAAmC;AAAA,IACvC;AAAA,IACA;AAAA,IACA,aAAa,eAAe,GAAG,IAAI;AAAA,IACnC;AAAA,IACA,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,EACvC;AAGA,QAAM,iBAAiB;AAAA,IACrB,UAAU;AAAA,IACV,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,WAAW;AAAA,IACxB,SAAS;AAAA,MACP,OAAO;AAAA,MACP,YAAY;AAAA,IACd;AAAA,IACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC;AAEA,MAAI;AACF,UAAM,SAAS,MAAM,4BAA4B,gBAAgB,OAAO,QAAQ;AAChF,eAAW,OAAO,OAAO;AAGzB,aAAS,KAAK,UAAU;AACxB,iBAAa,QAAQ;AAErB,WAAO,GAAG;AAAA,MACR,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,MAAM,OAAO;AAAA,MACb,QAAQ,OAAO;AAAA,IACjB,CAAC;AAAA,EACH,SAAS,KAAU;AACjB,WAAO,KAAK,gCAAgC,IAAI,OAAO,EAAE;AAAA,EAC3D;AACF;AAKA,eAAsB,UAAU,WAA6C;AAC3E,MAAI,CAAC,WAAW;AACd,WAAO,KAAK,2BAA2B;AAAA,EACzC;AAEA,QAAM,WAAW,aAAa;AAC9B,QAAM,MAAM,SAAS,UAAU,OAAK,EAAE,cAAc,SAAS;AAC7D,MAAI,QAAQ,IAAI;AACd,WAAO,KAAK,YAAY,SAAS,aAAa;AAAA,EAChD;AAEA,QAAM,UAAU,SAAS,OAAO,KAAK,CAAC,EAAE,CAAC;AACzC,eAAa,QAAQ;AAErB,SAAO,GAAG;AAAA,IACR,SAAS;AAAA,IACT,SAAS;AAAA,IACT,MAAM;AAAA,EACR,CAAC;AACH;AAKA,eAAsB,eACpB,WACA,MACA,cACA,aACc;AACd,MAAI,CAAC,WAAW;AACd,WAAO,KAAK,iEAAiE;AAAA,EAC/E;AAEA,QAAM,WAAW,aAAa;AAC9B,QAAM,WAAW,SAAS,KAAK,OAAK,EAAE,cAAc,SAAS;AAC7D,MAAI,CAAC,UAAU;AACb,WAAO,KAAK,YAAY,SAAS,yCAAyC;AAAA,EAC5E;AAEA,QAAMA,kBAAiB,MAAMD,mBAAkB;AAC/C,QAAM,SAAS,MAAMC,gBAAe,KAAK,EAAE,SAAS,SAAS,YAAY,WAAW,CAAC;AACrF,QAAM,cAAc,MAAM,OAAO,eAAe;AAChD,QAAM,OAAO,QAAQ;AAGrB,MAAI,KAAM,UAAS,OAAO;AAC1B,MAAI,cAAc;AAChB,UAAM,YAAY,SAAS,cAAc,EAAE;AAC3C,QAAI,MAAM,SAAS,KAAK,YAAY,GAAG;AACrC,aAAO,KAAK,0CAA0C;AAAA,IACxD;AACA,aAAS,YAAY;AAAA,EACvB;AACA,MAAI,YAAa,UAAS,cAAc;AACxC,WAAS,gBAAe,oBAAI,KAAK,GAAE,YAAY;AAG/C,QAAM,iBAAiB;AAAA,IACrB,UAAU;AAAA,IACV,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA,MAAM,SAAS;AAAA,IACf,aAAa,SAAS;AAAA,IACtB,SAAS;AAAA,MACP,OAAO;AAAA,MACP,YAAY,SAAS;AAAA,IACvB;AAAA,IACA,WAAW,SAAS;AAAA,EACtB;AAEA,MAAI;AACF,UAAM,SAAS,MAAM,4BAA4B,gBAAgB,OAAO,QAAQ;AAChF,aAAS,OAAO,OAAO;AAGvB,iBAAa,QAAQ;AAErB,WAAO,GAAG;AAAA,MACR,cAAc;AAAA,MACd,SAAS;AAAA,MACT,MAAM,OAAO;AAAA,MACb,QAAQ,OAAO;AAAA,IACjB,CAAC;AAAA,EACH,SAAS,KAAU;AACjB,WAAO,KAAK,kCAAkC,IAAI,OAAO,EAAE;AAAA,EAC7D;AACF;AAtMA;AAAA;AAAA;AAcA;AACA;AACA;AACA;AAGA;AAAA;AAAA;;;ACTA,eAAsB,YAAYC,OAA8B;AAG9D,MAAI,gBAA+B;AACnC,MAAI,cAA6B;AAEjC,WAAS,IAAI,GAAG,IAAIA,MAAK,QAAQ,KAAK;AACpC,QAAIA,MAAK,CAAC,MAAM,eAAeA,MAAK,IAAI,CAAC,EAAG,iBAAgBA,MAAK,EAAE,CAAC;AAAA,aAC3DA,MAAK,CAAC,MAAM,aAAaA,MAAK,IAAI,CAAC,EAAG,eAAcA,MAAK,EAAE,CAAC;AAAA,EACvE;AAEA,QAAM,UAKF,EAAE,QAAQ,CAAC,GAAG,UAAU,CAAC,EAAE;AAG/B,MAAI,CAAC,eAAe;AAClB,QAAI;AACF,YAAM,aAAa,cAAc,EAAE,MAAM,YAAY,IAAI,EAAE,MAAM,OAAO;AACxE,YAAM,cAAc,MAAM,cAAc,gBAAgB,QAAQ,UAAU;AAE1E,UAAI,YAAY,SAAS;AACvB,mBAAW,UAAU,YAAY,SAAS;AACxC,cAAI;AACF,kBAAM,EAAE,MAAM,KAAK,IAAI,MAAM,mBAAmB,OAAO,MAAM,OAAO,WAAW;AAC/E,gBAAI,MAAM,SAAS,YAAY;AAE7B,oBAAM,OAAO,KAAK,QAAQ,KAAK,aAAa;AAC5C,sBAAQ,OAAO,KAAK,EAAE,GAAG,MAAM,MAAM,KAAK,CAAC;AAAA,YAC7C;AAAA,UACF,QAAQ;AAAA,UAAe;AAAA,QACzB;AAAA,MACF;AAAA,IACF,SAAS,KAAU;AACjB,cAAQ,aAAa,OAAO,GAAG;AAAA,IACjC;AAAA,EACF;AAGA,MAAI,CAAC,aAAa;AAChB,QAAI;AACF,YAAM,eAAe,gBAAgB,EAAE,aAAa,cAAc,IAAI,CAAC;AACvE,YAAM,gBAAgB,MAAM,cAAc,gBAAgB,UAAU,YAAY;AAEhF,UAAI,cAAc,SAAS;AACzB,mBAAW,UAAU,cAAc,SAAS;AAC1C,cAAI;AACF,kBAAM,EAAE,MAAM,KAAK,IAAI,MAAM,mBAAmB,OAAO,MAAM,OAAO,WAAW;AAC/E,gBAAI,MAAM,SAAS,WAAW;AAC5B,sBAAQ,SAAS,KAAK,EAAE,GAAG,MAAM,KAAK,CAAC;AAAA,YACzC;AAAA,UACF,QAAQ;AAAA,UAAe;AAAA,QACzB;AAAA,MACF;AAAA,IACF,SAAS,KAAU;AACjB,cAAQ,eAAe,OAAO,GAAG;AAAA,IACnC;AAAA,EACF;AAEA,SAAO,GAAG;AAAA,IACR,YAAY;AAAA,IACZ,YAAY,QAAQ,OAAO;AAAA,IAC3B,cAAc,QAAQ,SAAS;AAAA,IAC/B,QAAQ,QAAQ;AAAA,IAChB,UAAU,QAAQ;AAAA,IAClB,GAAI,QAAQ,cAAc,EAAE,YAAY,QAAQ,WAAW;AAAA,IAC3D,GAAI,QAAQ,gBAAgB,EAAE,cAAc,QAAQ,aAAa;AAAA,EACnE,CAAC;AACH;AAlFA;AAAA;AAAA;AAIA;AACA;AACA;AAAA;AAAA;;;ACCA,SAAS,YAAAC,WAAU,SAAAC,cAAa;AAShC,eAAsB,iBAAiB,QAAiB,OAA8B;AACpF,MAAI,CAAC,UAAU,CAAC,OAAO;AACrB,WAAO,KAAK,wCAAwC;AAAA,EACtD;AAEA,MAAI,CAAC,MAAM,WAAW,KAAK,GAAG;AAC5B,WAAO,KAAK,6BAA6B;AAAA,EAC3C;AAEA,MAAI;AACF,UAAM,SAAS,MAAM,eAAe,KAAK,EAAE,SAAS,SAAS,YAAY,WAAW,CAAC;AACrF,UAAM,QAAQ,IAAID,UAAS,OAAO,OAAO,MAAM;AAG/C,UAAM,SAAS,CAACC,OAAM,QAAQ,QAAQ,MAAM,CAAC;AAE7C,UAAM,iBAAiB,MAAM,MAAM,KAAK,QAAQ,CAAC,GAAG,KAAK,GAAG,KAAK,QAAQ,MAAM,IAAI,GAAG,MAAM;AAE5F,UAAM,WAAW,MAAM,OAAO,OAAO,OAAO,aAAa;AAAA,MACvD,aAAa,sBAAsB,KAAK;AAAA,MACxC,SAAS,CAAC;AAAA,QACR;AAAA,QACA,UAAU;AAAA,QACV,mBAAmB;AAAA,QACnB,QAAQ,OAAO;AAAA,MACjB,CAAC;AAAA,IACH,CAAC;AAGD,UAAM,WAAW;AAAA,MACf,GAAG,sBAAsB,OAAO;AAAA,IAClC;AAEA,UAAM,UAAU,MAAM,oBAAoB,SAAS,IAAgB,CAAC,OAAO,MAAM,KAAK,GAAG,QAAQ;AAEjG,WAAO,GAAG;AAAA,MACR,YAAY;AAAA,MACZ;AAAA,MACA;AAAA,MACA,MAAM,SAAS;AAAA,MACf,YAAY;AAAA,IACd,CAAC;AAAA,EACH,SAAS,KAAU;AACjB,WAAO,KAAK,8BAA8B,IAAI,OAAO,EAAE;AAAA,EACzD;AACF;AAMA,eAAsB,iBAAiB,QAAiB,SAAgC;AACtF,MAAI,CAAC,UAAU,CAAC,SAAS;AACvB,WAAO,KAAK,0CAA0C;AAAA,EACxD;AAEA,MAAI,CAAC,QAAQ,WAAW,KAAK,GAAG;AAC9B,WAAO,KAAK,+BAA+B;AAAA,EAC7C;AAEA,MAAI;AACF,UAAM,SAAS,MAAM,eAAe,KAAK,EAAE,SAAS,SAAS,YAAY,WAAW,CAAC;AACrF,UAAM,QAAQ,IAAID,UAAS,OAAO,OAAO,MAAM;AAG/C,UAAM,SAAS,CAACC,OAAM,QAAQ,QAAQ,MAAM,CAAC;AAE7C,UAAM,iBAAiB,MAAM,MAAM,KAAK,QAAQ,CAAC,GAAG,OAAO,GAAG,KAAK,QAAQ,MAAM,IAAI,GAAG,MAAM;AAE9F,UAAM,WAAW,MAAM,OAAO,OAAO,OAAO,aAAa;AAAA,MACvD,aAAa,sBAAsB,OAAO;AAAA,MAC1C,SAAS,CAAC;AAAA,QACR;AAAA,QACA,UAAU;AAAA,QACV,mBAAmB;AAAA,QACnB,QAAQ,OAAO;AAAA,MACjB,CAAC;AAAA,IACH,CAAC;AAGD,UAAM,WAAW;AAAA,MACf,GAAG,sBAAsB,OAAO;AAAA,IAClC;AAEA,UAAM,UAAU,MAAM,oBAAoB,SAAS,IAAgB,CAAC,OAAO,MAAM,OAAO,GAAG,QAAQ;AAEnG,WAAO,GAAG;AAAA,MACR,YAAY;AAAA,MACZ;AAAA,MACA;AAAA,MACA,MAAM,SAAS;AAAA,MACf,YAAY;AAAA,IACd,CAAC;AAAA,EACH,SAAS,KAAU;AACjB,WAAO,KAAK,8BAA8B,IAAI,OAAO,EAAE;AAAA,EACzD;AACF;AAKA,eAAe,oBAAoB,IAAc,QAAkB,UAAoB;AACrF,QAAM,UAA+B,CAAC;AACtC,QAAM,OAAO,IAAI,WAAW,EAAE;AAE9B,aAAW,OAAO,UAAU;AAC1B,QAAI;AACF,YAAM,OAAO,MAAM,MAAM,GAAG,IAAI,QAAQ,OAAO,EAAE,CAAC,WAAW;AAAA,QAC3D,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,YAAY,KAAK,UAAU,MAAM;AAAA,QACnC;AAAA,QACA;AAAA,MACF,CAAC;AACD,cAAQ,GAAG,IAAI,KAAK,KAAK,YAAY,UAAU,KAAK,MAAM;AAAA,IAC5D,SAAS,KAAU;AACjB,cAAQ,GAAG,IAAI,WAAW,IAAI,OAAO;AAAA,IACvC;AAAA,EACF;AACA,SAAO;AACT;AAzIA;AAAA;AAAA;AAQA;AACA;AACA;AAAA;AAAA;;;ACKA,eAAeC,qBAAoD;AACjE,SAAO;AACT;AAeA,eAAsB,mBACpB,iBACA,MACA,MACwB;AAExB,MAAI,CAAC,yBAAyB,KAAK,eAAe,GAAG;AACnD,UAAM,IAAI,MAAM,iFAAiF;AAAA,EACnG;AAEA,QAAMC,kBAAiB,MAAMD,mBAAkB;AAC/C,QAAM,SAAS,MAAMC,gBAAe,KAAK,EAAE,SAAS,SAAS,YAAY,WAAW,CAAC;AAErF,MAAI;AACF,UAAM,SAAS,MAAM,OAAO,cAAc;AAAA,MACxC,IAAI;AAAA,MACJ,UAAU;AAAA,MACV,aAAa,QAAQ;AAAA,IACvB,CAAC;AAGD,WAAO;AAAA,MACL,MAAM,OAAO;AAAA,MACb,MAAM,OAAO;AAAA,MACb,UAAU,OAAO;AAAA,MACjB,kBAAkB,OAAO;AAAA,MACzB,kBAAkB,OAAO;AAAA,MACzB,mBAAmB,OAAO;AAAA,IAC5B;AAAA,EACF,UAAE;AACA,UAAM,OAAO,QAAQ;AAAA,EACvB;AACF;AAhEA;AAAA;AAAA;AAUA;AAGA;AAAA;AAAA;;;ACHA,eAAeC,qBAAoD;AACjE,SAAO;AACT;AAKA,eAAsB,OACpB,QACA,UACA,aACc;AACd,MAAI,CAAC,UAAU,CAAC,UAAU;AACxB,WAAO,KAAK,8CAA8C;AAAA,EAC5D;AAEA,QAAM,OAAO,SAAS,UAAU,EAAE;AAClC,MAAI,MAAM,IAAI,KAAK,QAAQ,GAAG;AAC5B,WAAO,KAAK,qCAAqC;AAAA,EACnD;AAEA,MAAI;AACF,UAAM,UAAU,MAAM,mBAAmB,QAAQ,MAAM,eAAe,eAAe;AACrF,WAAO,GAAG,OAAO;AAAA,EACnB,SAAS,KAAK;AACZ,WAAO,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,EAC9D;AACF;AAKA,eAAsB,UAAU,YAA8C;AAC5E,MAAI,CAAC,YAAY;AACf,WAAO,KAAK,6BAA6B;AAAA,EAC3C;AAEA,QAAMC,kBAAiB,MAAMD,mBAAkB;AAC/C,QAAM,SAAS,MAAMC,gBAAe,KAAK,EAAE,SAAS,SAAS,YAAY,WAAW,CAAC;AAErF,MAAI;AACF,UAAM,SAAS,OAAO,cAAc,EAAE,MAAM,WAAW,CAAC;AACxD,UAAM,OAAO,QAAQ;AACrB,WAAO,GAAG,MAAM;AAAA,EAClB,SAAS,KAAK;AACZ,UAAM,OAAO,QAAQ;AACrB,WAAO,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,EAC9D;AACF;AAKA,eAAsB,UACpB,MACA,kBACA,kBACA,mBACA,aACc;AACd,MAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,oBAAoB,CAAC,mBAAmB;AACzE,WAAO,KAAK,kEAAkE;AAAA,EAChF;AAEA,QAAMA,kBAAiB,MAAMD,mBAAkB;AAC/C,QAAM,SAAS,MAAMC,gBAAe,KAAK,EAAE,SAAS,SAAS,YAAY,WAAW,CAAC;AAErF,MAAI;AACF,UAAM,UAAU,MAAM,OAAO,cAAc;AAAA,MACzC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa,eAAe;AAAA,IAC9B,CAAC;AACD,UAAM,OAAO,QAAQ;AACrB,WAAO,GAAG,OAAO;AAAA,EACnB,SAAS,KAAK;AACZ,UAAM,OAAO,QAAQ;AACrB,WAAO,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,EAC9D;AACF;AA3FA;AAAA;AAAA;AAIA;AACA;AACA;AAEA;AAAA;AAAA;;;ACGA,eAAsB,QACpB,WACA,MACA,YACc;AACd,MAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,YAAY;AACtC,WAAO,KAAK,iDAAiD;AAAA,EAC/D;AAEA,MAAI,CAAC,yBAAyB,KAAK,SAAS,GAAG;AAC7C,WAAO,KAAK,qEAAqE;AAAA,EACnF;AAEA,MAAI;AACJ,MAAI;AACF,cAAU,KAAK,MAAM,UAAU;AAAA,EACjC,QAAQ;AACN,WAAO,KAAK,4BAA4B;AAAA,EAC1C;AAEA,QAAM,EAAE,aAAa,QAAQ,IAAI,MAAM,aAAa;AACpD,QAAM,YAAY,MAAM,iBAAiB,SAAS,WAAW,MAAM,OAAO;AAE1E,QAAM,OAAO,MAAM,MAAM,GAAG,WAAW,eAAe;AAAA,IACpD,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAU;AAAA,MACnB,MAAM;AAAA,MACN,IAAI;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,MAAI,CAAC,KAAK,IAAI;AACZ,UAAM,OAAO,MAAM,KAAK,KAAK;AAC7B,WAAO,KAAK,sBAAsB,KAAK,MAAM,MAAM,IAAI,EAAE;AAAA,EAC3D;AAEA,QAAM,SAAS,MAAM,KAAK,KAAK;AAC/B,SAAO,GAAG,EAAE,MAAM,MAAM,WAAW,OAAO,IAAI,IAAI,WAAW,MAAM,QAAQ,KAAK,CAAC;AACnF;AArDA;AAAA;AAAA;AAIA;AACA;AACA;AAAA;AAAA;;;ACKA,eAAsB,SAASC,OAA8B;AAC3D,QAAM,EAAE,YAAY,IAAI,MAAM,aAAa;AAE3C,MAAI,QAAQ;AACZ,WAAS,IAAI,GAAG,IAAIA,MAAK,QAAQ,KAAK;AACpC,QAAIA,MAAK,CAAC,MAAM,aAAaA,MAAK,IAAI,CAAC,EAAG,SAAQ,UAAUA,MAAK,EAAE,CAAC,CAAC;AAAA,EACvE;AAEA,QAAM,OAAO,MAAM,MAAM,GAAG,WAAW,yBAAyB,WAAW,GAAG,KAAK,EAAE;AACrF,MAAI,CAAC,KAAK,IAAI;AACZ,UAAM,OAAO,MAAM,KAAK,KAAK;AAC7B,WAAO,KAAK,uBAAuB,KAAK,MAAM,MAAM,IAAI,EAAE;AAAA,EAC5D;AAEA,QAAM,SAAS,MAAM,KAAK,KAAK;AAG/B,QAAM,WAAW,MAAM,QAAQ;AAAA,IAC7B,OAAO,SAAS,IAAI,OAAO,SAAc;AAAA,MACvC,GAAG;AAAA,MACH,gBAAgB,IAAI,aACf,MAAM,qBAAqB,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,IAAI,SAAS,IAAI,SAAS,GAAG,QACrF;AAAA,IACN,EAAE;AAAA,EACJ;AAEA,SAAO,GAAG,EAAE,UAAU,OAAO,SAAS,QAAQ,YAAY,CAAC;AAC7D;AAKA,eAAsB,OAAO,YAAoC;AAC/D,MAAI,CAAC,cAAc,WAAW,WAAW,GAAG;AAC1C,WAAO,KAAK,yCAAyC;AAAA,EACvD;AAEA,QAAM,EAAE,YAAY,IAAI,MAAM,aAAa;AAE3C,QAAM,OAAO,MAAM,MAAM,GAAG,WAAW,cAAc;AAAA,IACnD,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAU,EAAE,UAAU,aAAa,WAAW,CAAC;AAAA,EAC5D,CAAC;AAED,MAAI,CAAC,KAAK,IAAI;AACZ,UAAM,OAAO,MAAM,KAAK,KAAK;AAC7B,WAAO,KAAK,qBAAqB,KAAK,MAAM,MAAM,IAAI,EAAE;AAAA,EAC1D;AAEA,QAAM,SAAS,MAAM,KAAK,KAAK;AAC/B,SAAO,GAAG,EAAE,OAAO,OAAO,OAAO,WAAW,CAAC;AAC/C;AA/DA;AAAA;AAAA;AAIA;AACA;AACA;AAAA;AAAA;;;ACNA,IA+OY;AA/OZ;AAAA;AAAA;AA+OO,IAAK,kBAAL,kBAAKC,qBAAL;AACL,MAAAA,iBAAA,aAAU;AACV,MAAAA,iBAAA,QAAK;AACL,MAAAA,iBAAA,gBAAa;AACb,MAAAA,iBAAA,mBAAgB;AAChB,MAAAA,iBAAA,iBAAc;AACd,MAAAA,iBAAA,cAAW;AACX,MAAAA,iBAAA,mBAAgB;AAChB,MAAAA,iBAAA,YAAS;AARC,aAAAA;AAAA,OAAA;AAAA;AAAA;;;AC/OZ,IAYa,wBA8IA;AA1Jb;AAAA;AAAA;AAOA;AAKO,IAAM,yBAAN,MAAwD;AAAA,MACrD,WAAW,oBAAI,IAA+B;AAAA;AAAA;AAAA;AAAA,MAKtD,SAAS,SAAkC;AAEzC,aAAK,0BAA0B,OAAO;AAGtC,YAAI,KAAK,SAAS,IAAI,QAAQ,EAAE,GAAG;AACjC,gBAAM,IAAI,MAAM,YAAY,QAAQ,EAAE,yBAAyB;AAAA,QACjE;AAGA,aAAK,SAAS,IAAI,QAAQ,IAAI,EAAE,GAAG,QAAQ,CAAC;AAAA,MAC9C;AAAA;AAAA;AAAA;AAAA,MAKA,IAAI,WAAkD;AACpD,eAAO,KAAK,SAAS,IAAI,SAAS;AAAA,MACpC;AAAA;AAAA;AAAA;AAAA,MAKA,OAA4B;AAC1B,eAAO,MAAM,KAAK,KAAK,SAAS,OAAO,CAAC;AAAA,MAC1C;AAAA;AAAA;AAAA;AAAA,MAKA,eAAe,UAAuC;AACpD,eAAO,KAAK,KAAK,EAAE,OAAO,aAAW,QAAQ,aAAa,QAAQ;AAAA,MACpE;AAAA;AAAA;AAAA;AAAA,MAKA,IAAI,WAA4B;AAC9B,eAAO,KAAK,SAAS,IAAI,SAAS;AAAA,MACpC;AAAA;AAAA;AAAA;AAAA,MAKA,WAAW,WAAyB;AAClC,aAAK,SAAS,OAAO,SAAS;AAAA,MAChC;AAAA;AAAA;AAAA;AAAA,MAKA,QAAc;AACZ,aAAK,SAAS,MAAM;AAAA,MACtB;AAAA;AAAA;AAAA;AAAA,MAKA,QAAgB;AACd,eAAO,KAAK,SAAS;AAAA,MACvB;AAAA;AAAA;AAAA;AAAA,MAKA,gBAAgB,UAAkB,UAAuC;AACvE,eAAO,KAAK,KAAK,EAAE;AAAA,UACjB,aAAW,QAAQ,gBAAgB,YAAY,QAAQ,gBAAgB;AAAA,QACzE;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,OAAoC;AACzC,cAAM,aAAa,MAAM,YAAY;AACrC,eAAO,KAAK,KAAK,EAAE;AAAA,UAAO,aACxB,QAAQ,KAAK,YAAY,EAAE,SAAS,UAAU,KAC9C,QAAQ,YAAY,YAAY,EAAE,SAAS,UAAU,KACrD,QAAQ,GAAG,YAAY,EAAE,SAAS,UAAU;AAAA,QAC9C;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,0BAA0B,SAAkC;AAClE,YAAI,CAAC,QAAQ,IAAI;AACf,gBAAM,IAAI,MAAM,wBAAwB;AAAA,QAC1C;AAEA,YAAI,OAAO,QAAQ,OAAO,YAAY,QAAQ,GAAG,KAAK,EAAE,WAAW,GAAG;AACpE,gBAAM,IAAI,MAAM,uCAAuC;AAAA,QACzD;AAGA,YAAI,CAAC,2BAA2B,KAAK,QAAQ,EAAE,GAAG;AAChD,gBAAM,IAAI,MAAM,mEAAmE;AAAA,QACrF;AAEA,YAAI,CAAC,QAAQ,QAAQ,OAAO,QAAQ,SAAS,YAAY,QAAQ,KAAK,KAAK,EAAE,WAAW,GAAG;AACzF,gBAAM,IAAI,MAAM,yDAAyD;AAAA,QAC3E;AAEA,YAAI,CAAC,QAAQ,eAAe,OAAO,QAAQ,gBAAgB,YAAY,QAAQ,YAAY,KAAK,EAAE,WAAW,GAAG;AAC9G,gBAAM,IAAI,MAAM,gEAAgE;AAAA,QAClF;AAEA,YAAI,OAAO,QAAQ,iBAAiB,YAAY,QAAQ,eAAe,KAAK,CAAC,OAAO,UAAU,QAAQ,YAAY,GAAG;AACnH,gBAAM,IAAI,MAAM,qDAAqD;AAAA,QACvE;AAEA,YAAI,QAAQ,YAAY,CAAC,OAAO,OAAO,eAAe,EAAE,SAAS,QAAQ,QAA2B,GAAG;AACrG,gBAAM,IAAI,MAAM,6BAA6B,QAAQ,QAAQ,EAAE;AAAA,QACjE;AAGA,YAAI,QAAQ,eAAe,OAAO,QAAQ,gBAAgB,UAAU;AAClE,gBAAM,IAAI,MAAM,uCAAuC;AAAA,QACzD;AAGA,YAAI,QAAQ,SAAS;AACnB,cAAI,OAAO,QAAQ,QAAQ,aAAa,YAAY;AAClD,kBAAM,IAAI,MAAM,+CAA+C;AAAA,UACjE;AACA,cAAI,OAAO,QAAQ,QAAQ,YAAY,YAAY;AACjD,kBAAM,IAAI,MAAM,8CAA8C;AAAA,UAChE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAKO,IAAM,kBAAkB,IAAI,uBAAuB;AAAA;AAAA;;;ACnJ1D,OAAOC,SAAQ;AACf,OAAOC,WAAU;AACjB,SAAS,qBAAqB;AAT9B,IAYM,YACA,WAKO,sBAqUA;AAvVb;AAAA;AAAA;AAYA,IAAM,aAAa,cAAc,YAAY,GAAG;AAChD,IAAM,YAAYA,MAAK,QAAQ,UAAU;AAKlC,IAAM,uBAAN,MAAoD;AAAA,MACjD;AAAA,MACA;AAAA,MAER,cAAc;AAEZ,aAAK,aAAaA,MAAK,QAAQ,WAAW,UAAU;AAGpD,cAAM,UAAW,QAAgB,KAAU,EAAE,QAAS,QAAgB,KAAU,EAAE,eAAe;AACjG,aAAK,YAAYA,MAAK,KAAK,SAAS,aAAa,UAAU;AAAA,MAC7D;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,kBAAkB,WAAiD;AACvE,YAAI,CAACD,IAAG,WAAW,SAAS,GAAG;AAC7B,iBAAO,CAAC;AAAA,QACV;AAEA,cAAM,WAAgC,CAAC;AACvC,cAAM,UAAUA,IAAG,YAAY,WAAW,EAAE,eAAe,KAAK,CAAC;AAEjE,mBAAW,SAAS,SAAS;AAC3B,cAAI,CAAC,MAAM,YAAY,GAAG;AACxB;AAAA,UACF;AAEA,cAAI;AACF,kBAAM,oBAAoB,MAAM,KAAK;AAAA,cACnCC,MAAK,KAAK,WAAW,MAAM,IAAI;AAAA,YACjC;AACA,gBAAI,mBAAmB;AACrB,uBAAS,KAAK,iBAAiB;AAAA,YACjC;AAAA,UACF,SAAS,OAAO;AACd,oBAAQ,KAAK,+BAA+B,MAAM,IAAI,KAAK,KAAK;AAAA,UAClE;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,sBAAoD;AACxD,eAAO,KAAK,kBAAkB,KAAK,UAAU;AAAA,MAC/C;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,qBAAmD;AACvD,eAAO,KAAK,kBAAkB,KAAK,SAAS;AAAA,MAC9C;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,kBAAgD;AACpD,cAAM,CAAC,SAAS,MAAM,IAAI,MAAM,QAAQ,IAAI;AAAA,UAC1C,KAAK,oBAAoB;AAAA,UACzB,KAAK,mBAAmB;AAAA,QAC1B,CAAC;AAED,eAAO,CAAC,GAAG,SAAS,GAAG,MAAM;AAAA,MAC/B;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,yBAAyB,YAAuD;AAC5F,cAAM,YAAYA,MAAK,KAAK,YAAY,UAAU;AAClD,cAAM,cAAcA,MAAK,KAAK,YAAY,UAAU;AACpD,cAAM,aAAaA,MAAK,KAAK,YAAY,WAAW;AAGpD,YAAI;AACJ,YAAID,IAAG,WAAW,SAAS,GAAG;AAC5B,uBAAa;AAAA,QACf,WAAWA,IAAG,WAAW,WAAW,GAAG;AACrC,uBAAa;AAAA,QACf,OAAO;AACL,gBAAM,IAAI,MAAM,oCAAoC,UAAU,EAAE;AAAA,QAClE;AAEA,YAAI;AAEF,gBAAM,gBAAgB,MAAM,OAAO;AACnC,gBAAM,oBAAoB,cAAc,WAAW;AAEnD,cAAI,CAAC,qBAAqB,OAAO,sBAAsB,UAAU;AAC/D,kBAAM,IAAI,MAAM,wDAAwD;AAAA,UAC1E;AAGA,cAAI,CAAC,kBAAkB,IAAI;AACzB,kBAAM,IAAI,MAAM,oCAAoC;AAAA,UACtD;AAGA,cAAIA,IAAG,WAAW,UAAU,GAAG;AAC7B,8BAAkB,aAAa;AAAA,UACjC;AAEA,iBAAO;AAAA,QACT,SAAS,OAAO;AACd,gBAAM,IAAI,MAAM,iCAAiC,UAAU,KAAK,KAAK,EAAE;AAAA,QACzE;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,6BAA6B,WAA2B;AACtD,cAAM,aAAaC,MAAK,KAAK,KAAK,WAAW,SAAS;AAGtD,QAAAD,IAAG,UAAU,KAAK,WAAW,EAAE,WAAW,KAAK,CAAC;AAGhD,YAAIA,IAAG,WAAW,UAAU,GAAG;AAC7B,gBAAM,IAAI,MAAM,qBAAqB,SAAS,iBAAiB;AAAA,QACjE;AAEA,QAAAA,IAAG,UAAU,UAAU;AACvB,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,sBAAsB,WAAmB,SAMhC;AACP,cAAM,aAAa,KAAK,6BAA6B,SAAS;AAG9D,cAAM,eAAe,KAAK,wBAAwB,WAAW,OAAO;AACpE,QAAAA,IAAG,cAAcC,MAAK,KAAK,YAAY,UAAU,GAAG,YAAY;AAGhE,cAAM,gBAAgB,KAAK,uBAAuB,WAAW,OAAO;AACpE,QAAAD,IAAG,cAAcC,MAAK,KAAK,YAAY,WAAW,GAAG,aAAa;AAGlE,YAAI,QAAQ,YAAY;AACtB,gBAAM,iBAAiB,KAAK,wBAAwB,WAAW,OAAO;AACtE,UAAAD,IAAG,cAAcC,MAAK,KAAK,YAAY,YAAY,GAAG,cAAc;AAAA,QACtE;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,wBAAwB,WAAmB,SAMxC;AACT,eAAO;AAAA,KACN,QAAQ,IAAI;AAAA;AAAA;AAAA,4BAGW,QAAQ,aAAa,qBAAqB,EAAE;AAAA,EACtE,QAAQ,aAAa,YAAY,UAAU,QAAQ,MAAM,EAAE,CAAC,mCAAmC,EAAE;AAAA;AAAA,QAE3F,UAAU,QAAQ,MAAM,EAAE,CAAC;AAAA,SAC1B,SAAS;AAAA,WACP,QAAQ,IAAI;AAAA,kBACL,QAAQ,WAAW;AAAA,kBACnB,QAAQ,YAAY,IAAI,QAAQ,WAAW;AAAA,eAAkB,QAAQ,QAAQ,OAAO,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAWnG,QAAQ,aAAa;AAAA,aAAiB,UAAU,QAAQ,MAAM,EAAE,CAAC,YAAY,EAAE;AAAA;AAAA;AAAA,iBAGnE,UAAU,QAAQ,MAAM,EAAE,CAAC;AAAA;AAAA,MAE1C;AAAA;AAAA;AAAA;AAAA,MAKQ,uBAAuB,WAAmB,SAGvC;AACT,eAAO,KAAK,QAAQ,IAAI;AAAA;AAAA,wCAEY,SAAS;AAAA;AAAA;AAAA,EAG/C,QAAQ,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAwBnB;AAAA;AAAA;AAAA;AAAA,MAKQ,wBAAwB,WAAmB,SAExC;AACT,eAAO;AAAA,KACN,QAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,eAKF,UAAU,QAAQ,MAAM,EAAE,CAAC;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,MAkDxC;AAAA;AAAA;AAAA;AAAA,MAKA,sBAA8B;AAC5B,eAAO,KAAK;AAAA,MACd;AAAA;AAAA;AAAA;AAAA,MAKA,qBAA6B;AAC3B,eAAO,KAAK;AAAA,MACd;AAAA;AAAA;AAAA;AAAA,MAKA,cAAc,WAAmB,WAAW,OAAgB;AAC1D,cAAM,UAAU,WAAW,KAAK,YAAY,KAAK;AACjD,eAAOD,IAAG,WAAWC,MAAK,KAAK,SAAS,SAAS,CAAC;AAAA,MACpD;AAAA,IACF;AAKO,IAAM,gBAAgB,IAAI,qBAAqB;AAAA;AAAA;;;ACvVtD,IAca,uBAkRA;AAhSb;AAAA;AAAA;AAQA;AACA;AAKO,IAAM,wBAAN,MAAsD;AAAA,MAC3C;AAAA,MACA;AAAA,MACR,cAAc;AAAA,MAEtB,cAAc;AACZ,aAAK,WAAW;AAChB,aAAK,SAAS;AAAA,MAChB;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,aAA4B;AAChC,YAAI,KAAK,aAAa;AACpB;AAAA,QACF;AAGA,cAAM,WAAW,MAAM,KAAK,OAAO,gBAAgB;AAGnD,mBAAW,WAAW,UAAU;AAC9B,cAAI;AACF,iBAAK,SAAS,SAAS,OAAO;AAAA,UAChC,SAAS,OAAO;AACd,oBAAQ,KAAK,+BAA+B,QAAQ,EAAE,MAAM,KAAK;AAAA,UACnE;AAAA,QACF;AAEA,aAAK,cAAc;AAEnB,gBAAQ,IAAI,oCAAoC,KAAK,SAAS,MAAM,CAAC,WAAW;AAAA,MAClF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,QAAQ,WAAmB,OAAY,SAAiD;AAC5F,YAAI,CAAC,KAAK,aAAa;AACrB,gBAAM,IAAI,MAAM,iCAAiC;AAAA,QACnD;AAEA,cAAM,UAAU,KAAK,SAAS,IAAI,SAAS;AAC3C,YAAI,CAAC,SAAS;AACZ,iBAAO;AAAA,YACL,SAAS;AAAA,YACT,OAAO,YAAY,SAAS;AAAA,UAC9B;AAAA,QACF;AAGA,YAAI,QAAQ,SAAS;AACnB,gBAAM,aAAa,QAAQ,QAAQ,SAAS,KAAK;AACjD,cAAI,CAAC,WAAW,OAAO;AACrB,mBAAO;AAAA,cACL,SAAS;AAAA,cACT,OAAO,4BAA4B,WAAW,KAAK;AAAA,YACrD;AAAA,UACF;AAGA,kBAAQ,WAAW,aAAa;AAAA,QAClC;AAGA,YAAI;AACF,cAAI,QAAQ,SAAS;AAEnB,mBAAO,MAAM,QAAQ,QAAQ,QAAQ,OAAO,OAAO;AAAA,UACrD,OAAO;AAEL,mBAAO;AAAA,cACL,SAAS;AAAA,cACT,MAAM;AAAA,gBACJ;AAAA,gBACA;AAAA,gBACA,MAAM;AAAA,gBACN,YAAY,QAAQ;AAAA,cACtB;AAAA,cACA,UAAU;AAAA,gBACR,SAAS;AAAA,gBACT,eAAe;AAAA,cACjB;AAAA,YACF;AAAA,UACF;AAAA,QACF,SAAS,OAAO;AACd,iBAAO;AAAA,YACL,SAAS;AAAA,YACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,YAC5D,UAAU;AAAA,cACR;AAAA,cACA,WAAW;AAAA,YACb;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,SAAS,WAAmB,OAA8B;AACxD,cAAM,UAAU,KAAK,SAAS,IAAI,SAAS;AAC3C,YAAI,CAAC,SAAS;AACZ,iBAAO;AAAA,YACL,OAAO;AAAA,YACP,OAAO,YAAY,SAAS;AAAA,UAC9B;AAAA,QACF;AAGA,YAAI,QAAQ,SAAS;AACnB,iBAAO,QAAQ,QAAQ,SAAS,KAAK;AAAA,QACvC;AAGA,YAAI,QAAQ,aAAa;AACvB,iBAAO,KAAK,sBAAsB,OAAO,QAAQ,WAAW;AAAA,QAC9D;AAGA,eAAO,EAAE,OAAO,KAAK;AAAA,MACvB;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,SAAwB;AAE5B,aAAK,SAAS,MAAM;AACpB,aAAK,cAAc;AAGnB,cAAM,KAAK,WAAW;AAAA,MACxB;AAAA;AAAA;AAAA;AAAA,MAKA,uBAAuB,WAGd;AACP,cAAM,UAAU,KAAK,SAAS,IAAI,SAAS;AAC3C,YAAI,CAAC,SAAS;AACZ,iBAAO;AAAA,QACT;AAEA,eAAO;AAAA,UACL;AAAA,UACA,YAAY,QAAQ;AAAA,QACtB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,mBAAmB,WAA4B;AAC7C,eAAO,KAAK,SAAS,IAAI,SAAS;AAAA,MACpC;AAAA;AAAA;AAAA;AAAA,MAKA,eAAe,WAA+C;AAC5D,cAAM,UAAU,KAAK,SAAS,IAAI,SAAS;AAC3C,YAAI,CAAC,SAAS;AACZ,iBAAO;AAAA,QACT;AAEA,eAAO,QAAQ,UAAU,YAAY;AAAA,MACvC;AAAA;AAAA;AAAA;AAAA,MAKA,uBAOG;AACD,eAAO,KAAK,SAAS,KAAK,EAAE,IAAI,cAAY;AAAA,UAC1C,IAAI,QAAQ;AAAA,UACZ,MAAM,QAAQ;AAAA,UACd,aAAa,QAAQ;AAAA,UACrB,cAAc,QAAQ;AAAA,UACtB,UAAU,QAAQ;AAAA,UAClB,MAAM,QAAQ,UAAU,YAAY;AAAA,QACtC,EAAE;AAAA,MACJ;AAAA;AAAA;AAAA;AAAA,MAKQ,sBAAsB,OAAY,QAAkC;AAE1E,YAAI;AACF,gBAAM,YAAY;AAElB,cAAI,UAAU,SAAS,UAAU;AAC/B,gBAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,qBAAO,EAAE,OAAO,OAAO,OAAO,0BAA0B;AAAA,YAC1D;AAGA,gBAAI,UAAU,YAAY,MAAM,QAAQ,UAAU,QAAQ,GAAG;AAC3D,yBAAW,gBAAgB,UAAU,UAAU;AAC7C,oBAAI,EAAE,gBAAgB,QAAQ;AAC5B,yBAAO,EAAE,OAAO,OAAO,OAAO,8BAA8B,YAAY,GAAG;AAAA,gBAC7E;AAAA,cACF;AAAA,YACF;AAGA,gBAAI,UAAU,YAAY;AACxB,yBAAW,CAAC,UAAU,UAAU,KAAK,OAAO,QAAQ,UAAU,UAAU,GAAG;AACzE,oBAAI,YAAY,OAAO;AACrB,wBAAM,WAAY,WAAmB;AACrC,wBAAM,aAAa,OAAO,MAAM,QAAQ;AAExC,sBAAI,YAAY,aAAa,YAAY;AACvC,2BAAO,EAAE,OAAO,OAAO,OAAO,aAAa,QAAQ,qBAAqB,QAAQ,GAAG;AAAA,kBACrF;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAEA,iBAAO,EAAE,OAAO,MAAM,WAAW,MAAM;AAAA,QACzC,SAAS,OAAO;AACd,iBAAO,EAAE,OAAO,OAAO,OAAO,4BAA4B,KAAK,GAAG;AAAA,QACpE;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,gBAKE;AACA,cAAM,WAAW,KAAK,SAAS,KAAK;AACpC,cAAM,QAAQ;AAAA,UACZ,eAAe,SAAS;AAAA,UACxB,iBAAiB;AAAA,UACjB,eAAe;AAAA,UACf,oBAAoB,CAAC;AAAA,QACvB;AAEA,mBAAW,WAAW,UAAU;AAE9B,cAAI,QAAQ,SAAS;AACnB,kBAAM;AAAA,UACR,OAAO;AACL,kBAAM;AAAA,UACR;AAGA,gBAAM,WAAW,QAAQ,YAAY;AACrC,gBAAM,mBAAmB,QAAQ,KAAK,MAAM,mBAAmB,QAAQ,KAAK,KAAK;AAAA,QACnF;AAEA,eAAO;AAAA,MACT;AAAA,IACF;AAKO,IAAM,iBAAiB,IAAI,sBAAsB;AAAA;AAAA;;;AChSxD,IAAAC,iBAAA;AAAA;AAAA;AAOA;AACA;AACA;AACA;AAGA;AACA;AACA;AAAA;AAAA;;;ACXA,OAAOC,SAAQ;AAWf,eAAeC,UAAuB;AACpC,MAAIC,MAAM,QAAOA;AAEjB,MAAI;AACF,IAAAA,QAAO,MAAM,OAAO,UAAU;AAC9B,WAAOA;AAAA,EACT,QAAQ;AACN,UAAM,EAAE,eAAAC,eAAc,IAAI,MAAM,OAAO,UAAU;AACjD,UAAMC,QAAO,MAAM,OAAO,WAAW;AACrC,UAAMC,MAAK,MAAM,OAAO,SAAS;AAEjC,UAAMC,aAAYF,MAAK,QAAQD,eAAc,YAAY,GAAG,CAAC;AAC7D,UAAM,aAAa;AAAA,MACjBC,MAAK,QAAQE,YAAW,MAAM,MAAM,MAAM,gBAAgB,QAAQ,OAAO,QAAQ,OAAO,QAAQ;AAAA,MAChGF,MAAK,QAAQE,YAAW,MAAM,MAAM,MAAM,MAAM,MAAM,WAAW,YAAY,QAAQ,gBAAgB,QAAQ,OAAO,QAAQ,OAAO,QAAQ;AAAA,MAC3IF,MAAK,QAAQC,IAAG,QAAQ,GAAG,WAAW,YAAY,QAAQ,gBAAgB,QAAQ,OAAO,QAAQ,OAAO,QAAQ;AAAA,IAClH;AAEA,eAAW,KAAK,YAAY;AAC1B,UAAI;AACF,QAAAH,QAAO,MAAM,OAAO;AACpB,eAAOA;AAAA,MACT,QAAQ;AAAA,MAER;AAAA,IACF;AACA,UAAM,IAAI,MAAM,2CAA2C;AAAA,EAC7D;AACF;AAIA,eAAeK,qBAAoD;AACjE,SAAO;AACT;AAGA,eAAe,aAA6C;AAC1D,QAAM,SAAS,MAAM;AACrB,SAAO,OAAO;AAChB;AAMA,eAAsB,uBACpB,SACA,SACA,WACA,WACA,YAQC;AACD,MAAI,CAAC,SAAS;AACZ,WAAO,EAAE,UAAU,OAAO,MAAM,MAAM,UAAU,GAAG,aAAa,GAAG,gBAAgB,OAAO,OAAO,aAAa;AAAA,EAChH;AAEA,MAAI,QAAQ,OAAO;AACjB,WAAO,EAAE,UAAU,OAAO,MAAM,MAAM,UAAU,GAAG,aAAa,GAAG,gBAAgB,OAAO,OAAO,QAAQ,MAAM;AAAA,EACjH;AAEA,MAAI,CAAC,QAAQ,QAAQ,CAAC,QAAQ,UAAU;AACtC,WAAO,EAAE,UAAU,OAAO,MAAM,MAAM,UAAU,GAAG,aAAa,GAAG,gBAAgB,OAAO,OAAO,2BAA2B;AAAA,EAC9H;AAEA,MAAI,QAAQ,WAAW,SAAS;AAC9B,WAAO,EAAE,UAAU,OAAO,MAAM,QAAQ,QAAQ,MAAM,UAAU,QAAQ,UAAU,aAAa,GAAG,gBAAgB,OAAO,OAAO,yBAAyB,QAAQ,QAAQ,MAAM,OAAO,GAAG;AAAA,EAC3L;AAGA,QAAMC,kBAAiB,MAAMD,mBAAkB;AAC/C,QAAM,UAAU,MAAM,WAAW;AACjC,QAAM,SAAS,MAAMC,gBAAe,KAAK,EAAE,SAAS,YAAY,WAAW,CAAC;AAE5E,MAAI;AAEF,UAAM,eAAe,MAAM,OAAO,cAAc,EAAE,MAAM,QAAQ,KAAK,CAAC;AACtE,QAAI,CAAC,aAAa,OAAO;AACvB,YAAM,OAAO,QAAQ;AACrB,aAAO,EAAE,UAAU,OAAO,MAAM,QAAQ,QAAQ,MAAM,UAAU,QAAQ,UAAU,aAAa,GAAG,gBAAgB,OAAO,OAAO,wBAAwB,aAAa,OAAO,KAAK,IAAI,CAAC,GAAG;AAAA,IAC3L;AAGA,UAAM,eAAe,MAAM,OAAO,cAAc;AAAA,MAC9C,MAAM,QAAQ;AAAA,MACd,kBAAkB,QAAQ;AAAA,MAC1B,kBAAkB,QAAQ;AAAA,MAC1B,mBAAmB,QAAQ;AAAA,MAC3B,aAAa,eAAe,SAAS;AAAA,IACvC,CAAC;AAED,UAAM,OAAO,QAAQ;AAErB,QAAI,CAAC,aAAa,UAAU;AAC1B,aAAO,EAAE,UAAU,OAAO,MAAM,QAAQ,QAAQ,MAAM,UAAU,QAAQ,UAAU,aAAa,GAAG,gBAAgB,OAAO,OAAO,0BAA0B;AAAA,IAC5J;AAEA,WAAO;AAAA,MACL,UAAU;AAAA,MACV,MAAM,QAAQ;AAAA,MACd,UAAU,QAAQ;AAAA,MAClB,aAAa;AAAA,MACb,gBAAgB;AAAA,MAChB,OAAO;AAAA,IACT;AAAA,EACF,SAAS,KAAU;AACjB,UAAM,OAAO,QAAQ;AACrB,WAAO,EAAE,UAAU,OAAO,MAAM,QAAQ,QAAQ,MAAM,UAAU,QAAQ,UAAU,aAAa,GAAG,gBAAgB,OAAO,OAAO,IAAI,QAAQ;AAAA,EAC9I;AACF;AAKA,eAAe,cACb,KACA,aACA,SACA,WAC+B;AAE/B,MAAIR,IAAG,WAAW,MAAM,YAAY,GAAG;AACrC,UAAM,QAAQA,IAAG,aAAa,MAAM,cAAc,OAAO,EAAE,KAAK,EAAE,MAAM,IAAI,EAAE,OAAO,OAAO;AAC5F,eAAW,QAAQ,OAAO;AACxB,UAAI;AACF,cAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,YAAI,MAAM,cAAc,IAAI,IAAI;AAE9B,iBAAO;AAAA,YACL,IAAI,IAAI;AAAA,YACR,MAAM;AAAA,YACN;AAAA,YACA,QAAQ,MAAM,WAAW,YAAY,mBAAmB,WAAW,MAAM,MAAM;AAAA,YAC/E,iBAAiB;AAAA,YACjB,aAAa,MAAM;AAAA,YACnB,kBAAkB,MAAM;AAAA,YACxB,MAAM,IAAI;AAAA,YACV,KAAK;AAAA,UACP;AAAA,QACF;AAAA,MACF,QAAQ;AAAA,MAAC;AAAA,IACX;AAAA,EACF;AAEA,QAAM,MAAM,MAAMC,QAAO;AACzB,QAAM,UAAU,IAAI,SAAS;AAC7B,QAAM,QAAQ,IAAI,SAAS,SAAS,IAAI;AAGxC,QAAM,iBAAiB,mBAAmB;AAC1C,QAAM,aAAa,IAAI,KAAK,QAAQ,IAAI,WAAW,QAAQ,eAAe,UAAU,EAAE,YAAY,EAAE,OAAO,IAAI,CAAC;AAGhH,QAAM,oBAAoB,eAAe,SAAS,IAAI,SAAS;AAC/D,MAAI,WAAW;AAEf,MAAI,mBAAmB;AACrB,eAAW,kBAAkB;AAG7B,UAAM,aAAa,eAAe,SAAS,WAAW,KAAK;AAC3D,QAAI,CAAC,WAAW,OAAO;AAErB,YAAM,gBAAgB;AAAA,QACpB,WAAW,IAAI;AAAA,QACf;AAAA,QACA,QAAQ;AAAA,QACR,QAAQ,4BAA4B,WAAW,KAAK;AAAA,MACtD;AACA,YAAM,MAAM,MAAM,iBAAiB,SAAS,IAAI,MAAM,oBAAoB,aAAa;AACvF,YAAM,iBAAiB,GAAG,WAAW,eAAe;AAAA,QAClD,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAC9C,MAAM,KAAK,UAAU,EAAE,MAAM,aAAa,IAAI,IAAI,MAAM,MAAM,oBAAoB,SAAS,eAAe,WAAW,IAAI,CAAC;AAAA,MAC5H,CAAC;AAGD,YAAM,gBAAgB;AAAA,QACpB,QAAQ;AAAA,QACR,WAAW,IAAI;AAAA,QACf;AAAA,QACA,MAAM,IAAI;AAAA,QACV;AAAA,QACA;AAAA,QACA,aAAa;AAAA,QACb,kBAAkB;AAAA,QAClB,gBAAgB;AAAA,QAChB,OAAO,WAAW;AAAA,QAClB,KAAK,KAAK,IAAI;AAAA,MAChB;AACA,oBAAc,MAAM,cAAc,aAAa;AAE/C,aAAO;AAAA,QACL,IAAI,IAAI;AAAA,QACR,MAAM;AAAA,QACN;AAAA,QACA,QAAQ;AAAA,QACR,QAAQ,WAAW,SAAS;AAAA,QAC5B,MAAM,IAAI;AAAA,QACV,KAAK;AAAA,MACP;AAAA,IACF;AAAA,EACF,OAAO;AAEL,UAAM,WAAW,aAAa;AAC9B,UAAM,MAAM,SAAS,KAAK,OAAK,EAAE,cAAc,SAAS;AACxD,eAAW,KAAK,aAAa;AAAA,EAC/B;AAEA,QAAM,YAAY,MAAM,uBAAuB,SAAS,UAAU,IAAI,MAAM,WAAW,UAAU;AACjG,MAAI,CAAC,UAAU,UAAU;AAEvB,UAAM,gBAAgB,EAAE,WAAW,IAAI,IAAI,WAAW,QAAQ,YAAY,QAAQ,qBAAqB,UAAU,KAAK,GAAG;AACzH,UAAM,MAAM,MAAM,iBAAiB,SAAS,IAAI,MAAM,oBAAoB,aAAa;AACvF,UAAM,iBAAiB,GAAG,WAAW,eAAe;AAAA,MAClD,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,EAAE,MAAM,aAAa,IAAI,IAAI,MAAM,MAAM,oBAAoB,SAAS,eAAe,WAAW,IAAI,CAAC;AAAA,IAC5H,CAAC;AAGD,UAAM,gBAAgB;AAAA,MACpB,QAAQ;AAAA,MACR,WAAW,IAAI;AAAA,MACf;AAAA,MACA,MAAM,IAAI;AAAA,MACV;AAAA,MACA;AAAA,MACA,aAAa;AAAA,MACb,kBAAkB;AAAA,MAClB,gBAAgB;AAAA,MAChB,OAAO,UAAU;AAAA,MACjB,KAAK,KAAK,IAAI;AAAA,IAChB;AACA,kBAAc,MAAM,cAAc,aAAa;AAE/C,WAAO,EAAE,IAAI,IAAI,IAAI,MAAM,mBAAmB,WAAW,QAAQ,YAAY,QAAQ,UAAU,SAAS,oBAAoB,MAAM,IAAI,MAAM,KAAK,KAAK;AAAA,EACxJ;AAGA,QAAM,aAAa;AAAA,IACjB,QAAQ;AAAA,IACR,WAAW,IAAI;AAAA,IACf;AAAA,IACA,MAAM,IAAI;AAAA,IACV;AAAA,IACA;AAAA,IACA,aAAa,UAAU;AAAA,IACvB,kBAAkB,UAAU;AAAA,IAC5B,gBAAgB,UAAU;AAAA,IAC1B,KAAK,KAAK,IAAI;AAAA,EAChB;AAEA,gBAAc,MAAM,cAAc,UAAU;AAE5C,SAAO;AAAA,IACL,IAAI,IAAI;AAAA,IACR,MAAM;AAAA,IACN;AAAA,IACA,QAAQ;AAAA,IACR,iBAAiB;AAAA,IACjB,aAAa,UAAU;AAAA,IACvB,kBAAkB,UAAU;AAAA,IAC5B,MAAM,IAAI;AAAA,IACV,KAAK;AAAA,EACP;AACF;AAMA,eAAsB,eACpB,KACA,aACA,SAC+B;AAE/B,QAAM,WAAuD,IAAI,YAC7D,MAAM,qBAAqB,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,IAAI,SAAS,IAAI,SAAS,IACjF,EAAE,OAAO,KAAK;AAGlB,MAAI,IAAI,SAAS,qBAAqB,SAAS,UAAU,MAAM;AAC7D,YAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,sBAAsB,MAAM,IAAI,MAAM,MAAM,IAAI,MAAM,QAAQ,SAAS,UAAU,oBAAoB,CAAC,CAAC;AAC7I,WAAO;AAAA,MACL,IAAI,IAAI;AAAA,MACR,MAAM,IAAI;AAAA,MACV,MAAM,IAAI;AAAA,MACV,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,gBAAgB,SAAS;AAAA,MACzB,KAAK;AAAA,IACP;AAAA,EACF;AAEA,MAAI,IAAI,SAAS,QAAQ;AAEvB,UAAM,cAAc;AAAA,MAClB,MAAM;AAAA,MACN,WAAW,IAAI;AAAA,MACf,cAAe,IAAI,SAAiB,QAAQ;AAAA,IAC9C;AACA,UAAM,UAAU,MAAM,iBAAiB,SAAS,IAAI,MAAM,QAAQ,WAAW;AAC7E,UAAM,MAAM,GAAG,WAAW,eAAe;AAAA,MACvC,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU;AAAA,QACnB,MAAM;AAAA,QACN,IAAI,IAAI;AAAA,QACR,MAAM;AAAA,QACN,SAAS;AAAA,QACT,WAAW;AAAA,MACb,CAAC;AAAA,IACH,CAAC;AACD,WAAO,EAAE,IAAI,IAAI,IAAI,MAAM,QAAQ,QAAQ,gBAAgB,MAAM,IAAI,MAAM,KAAK,KAAK;AAAA,EACvF;AAEA,MAAI,IAAI,SAAS,mBAAmB;AAClC,UAAM,YAAa,IAAI,SAAiB;AAGxC,QAAK,QAAgB,KAAU,EAAE,iBAAiB,QAAQ;AACxD,aAAO,MAAM,cAAc,KAAK,aAAa,SAAS,SAAS;AAAA,IACjE;AAGA,WAAO,MAAM,cAAc,KAAK,aAAa,SAAS,SAAS;AAAA,EACjE;AAEA,MAAI,IAAI,SAAS,QAAQ;AACvB,WAAO;AAAA,MACL,IAAI,IAAI;AAAA,MACR,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,MAAM,IAAI;AAAA,MACV,MAAO,IAAI,SAAiB;AAAA,MAC5B,WAAY,IAAI,SAAiB;AAAA,MACjC,KAAK;AAAA,IACP;AAAA,EACF;AAEA,MAAI,IAAI,SAAS,oBAAoB;AACnC,UAAM,YAAa,IAAI,SAAiB;AACxC,UAAM,SAAU,IAAI,SAAiB;AACrC,UAAM,SAAU,IAAI,SAAiB;AAErC,WAAO;AAAA,MACL,IAAI,IAAI;AAAA,MACR,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,MAAM,IAAI;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAY,IAAI,SAAiB;AAAA,MACjC,WAAW;AAAA,MACX,KAAK;AAAA,IACP;AAAA,EACF;AAGA,SAAO;AAAA,IACL,IAAI,IAAI;AAAA,IACR,MAAM,IAAI;AAAA,IACV,MAAM,IAAI;AAAA,IACV,SAAS,IAAI;AAAA,IACb,gBAAgB,SAAS;AAAA,IACzB,QAAQ;AAAA,IACR,KAAK;AAAA,EACP;AACF;AAzYA,IAaIC;AAbJ;AAAA;AAAA;AAKA;AACA;AACA;AACA;AACA,IAAAO;AAoCA;AAhCA,IAAIP,QAAY;AAAA;AAAA;;;ACDhB,eAAsB,UAAwB;AAC5C,QAAM,EAAE,aAAa,QAAQ,IAAI,MAAM,aAAa;AAGpD,QAAM,YAAY,MAAM,MAAM,GAAG,WAAW,yBAAyB,WAAW,EAAE;AAClF,MAAI,CAAC,UAAU,IAAI;AACjB,UAAM,OAAO,MAAM,UAAU,KAAK;AAClC,WAAO,KAAK,uBAAuB,UAAU,MAAM,MAAM,IAAI,EAAE;AAAA,EACjE;AACA,QAAM,QAAQ,MAAM,UAAU,KAAK;AAEnC,MAAI,MAAM,UAAU,GAAG;AACrB,WAAO,GAAG,EAAE,WAAW,GAAG,UAAU,CAAC,GAAG,SAAS,uBAAuB,CAAC;AAAA,EAC3E;AAEA,QAAM,YAAmB,CAAC;AAC1B,QAAM,WAAqB,CAAC;AAC5B,QAAM,YAAmB,CAAC;AAE1B,aAAW,OAAO,MAAM,UAAU;AAChC,UAAM,SAAS,MAAM,eAAe,KAAK,aAAa,OAAO;AAC7D,QAAI,OAAO,KAAK;AACd,eAAS,KAAK,OAAO,EAAE;AACvB,gBAAU,KAAK,MAAM;AAAA,IACvB,OAAO;AACL,gBAAU,KAAK,MAAM;AAAA,IACvB;AAAA,EACF;AAGA,MAAI,SAAS,SAAS,GAAG;AACvB,UAAM,MAAM,GAAG,WAAW,cAAc;AAAA,MACtC,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,EAAE,UAAU,aAAa,YAAY,SAAS,CAAC;AAAA,IACtE,CAAC;AAAA,EACH;AAEA,SAAO,GAAG;AAAA,IACR,WAAW,UAAU;AAAA,IACrB,WAAW,UAAU;AAAA,IACrB,OAAO,MAAM;AAAA,IACb,UAAU;AAAA,IACV,mBAAmB;AAAA,IACnB;AAAA,EACF,CAAC;AACH;AA1DA;AAAA;AAAA;AAIA;AACA;AACA;AACA;AAAA;AAAA;;;ACPA;AAAA;AAAA;AAEA,QAAM,eAAe,CAAC,cAAc,eAAe,WAAW;AAC9D,QAAM,UAAU,OAAO,SAAS;AAEhC,QAAI,QAAS,cAAa,KAAK,MAAM;AAErC,WAAO,UAAU;AAAA,MACf;AAAA,MACA,eAAe;AAAA,MACf,cAAc,OAAO,MAAM,CAAC;AAAA,MAC5B,MAAM;AAAA,MACN;AAAA,MACA,sBAAsB,uBAAO,wBAAwB;AAAA,MACrD,WAAW,uBAAO,WAAW;AAAA,MAC7B,aAAa,uBAAO,aAAa;AAAA,MACjC,YAAY,uBAAO,WAAW;AAAA,MAC9B,MAAM,MAAM;AAAA,MAAC;AAAA,IACf;AAAA;AAAA;;;AClBA;AAAA;AAAA;AAEA,QAAM,EAAE,aAAa,IAAI;AAEzB,QAAM,aAAa,OAAO,OAAO,OAAO;AAUxC,aAAS,OAAO,MAAM,aAAa;AACjC,UAAI,KAAK,WAAW,EAAG,QAAO;AAC9B,UAAI,KAAK,WAAW,EAAG,QAAO,KAAK,CAAC;AAEpC,YAAM,SAAS,OAAO,YAAY,WAAW;AAC7C,UAAI,SAAS;AAEb,eAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,cAAM,MAAM,KAAK,CAAC;AAClB,eAAO,IAAI,KAAK,MAAM;AACtB,kBAAU,IAAI;AAAA,MAChB;AAEA,UAAI,SAAS,aAAa;AACxB,eAAO,IAAI,WAAW,OAAO,QAAQ,OAAO,YAAY,MAAM;AAAA,MAChE;AAEA,aAAO;AAAA,IACT;AAYA,aAAS,MAAM,QAAQ,MAAM,QAAQ,QAAQ,QAAQ;AACnD,eAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC/B,eAAO,SAAS,CAAC,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC;AAAA,MAC7C;AAAA,IACF;AASA,aAAS,QAAQ,QAAQ,MAAM;AAC7B,eAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,eAAO,CAAC,KAAK,KAAK,IAAI,CAAC;AAAA,MACzB;AAAA,IACF;AASA,aAAS,cAAc,KAAK;AAC1B,UAAI,IAAI,WAAW,IAAI,OAAO,YAAY;AACxC,eAAO,IAAI;AAAA,MACb;AAEA,aAAO,IAAI,OAAO,MAAM,IAAI,YAAY,IAAI,aAAa,IAAI,MAAM;AAAA,IACrE;AAUA,aAAS,SAAS,MAAM;AACtB,eAAS,WAAW;AAEpB,UAAI,OAAO,SAAS,IAAI,EAAG,QAAO;AAElC,UAAI;AAEJ,UAAI,gBAAgB,aAAa;AAC/B,cAAM,IAAI,WAAW,IAAI;AAAA,MAC3B,WAAW,YAAY,OAAO,IAAI,GAAG;AACnC,cAAM,IAAI,WAAW,KAAK,QAAQ,KAAK,YAAY,KAAK,UAAU;AAAA,MACpE,OAAO;AACL,cAAM,OAAO,KAAK,IAAI;AACtB,iBAAS,WAAW;AAAA,MACtB;AAEA,aAAO;AAAA,IACT;AAEA,WAAO,UAAU;AAAA,MACf;AAAA,MACA,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,IACV;AAGA,QAAI,CAAC,QAAQ,IAAI,mBAAmB;AAClC,UAAI;AACF,cAAM,aAAa,UAAQ,YAAY;AAEvC,eAAO,QAAQ,OAAO,SAAU,QAAQ,MAAM,QAAQ,QAAQ,QAAQ;AACpE,cAAI,SAAS,GAAI,OAAM,QAAQ,MAAM,QAAQ,QAAQ,MAAM;AAAA,cACtD,YAAW,KAAK,QAAQ,MAAM,QAAQ,QAAQ,MAAM;AAAA,QAC3D;AAEA,eAAO,QAAQ,SAAS,SAAU,QAAQ,MAAM;AAC9C,cAAI,OAAO,SAAS,GAAI,SAAQ,QAAQ,IAAI;AAAA,cACvC,YAAW,OAAO,QAAQ,IAAI;AAAA,QACrC;AAAA,MACF,SAAS,GAAG;AAAA,MAEZ;AAAA,IACF;AAAA;AAAA;;;AClIA;AAAA;AAAA;AAEA,QAAM,QAAQ,uBAAO,OAAO;AAC5B,QAAM,OAAO,uBAAO,MAAM;AAM1B,QAAM,UAAN,MAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOZ,YAAY,aAAa;AACvB,aAAK,KAAK,IAAI,MAAM;AAClB,eAAK;AACL,eAAK,IAAI,EAAE;AAAA,QACb;AACA,aAAK,cAAc,eAAe;AAClC,aAAK,OAAO,CAAC;AACb,aAAK,UAAU;AAAA,MACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,IAAI,KAAK;AACP,aAAK,KAAK,KAAK,GAAG;AAClB,aAAK,IAAI,EAAE;AAAA,MACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,CAAC,IAAI,IAAI;AACP,YAAI,KAAK,YAAY,KAAK,YAAa;AAEvC,YAAI,KAAK,KAAK,QAAQ;AACpB,gBAAM,MAAM,KAAK,KAAK,MAAM;AAE5B,eAAK;AACL,cAAI,KAAK,KAAK,CAAC;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAEA,WAAO,UAAU;AAAA;AAAA;;;ACtDjB;AAAA;AAAA;AAEA,QAAM,OAAO,UAAQ,MAAM;AAE3B,QAAM,aAAa;AACnB,QAAM,UAAU;AAChB,QAAM,EAAE,YAAY,IAAI;AAExB,QAAM,aAAa,OAAO,OAAO,OAAO;AACxC,QAAM,UAAU,OAAO,KAAK,CAAC,GAAM,GAAM,KAAM,GAAI,CAAC;AACpD,QAAM,qBAAqB,uBAAO,oBAAoB;AACtD,QAAM,eAAe,uBAAO,cAAc;AAC1C,QAAM,YAAY,uBAAO,UAAU;AACnC,QAAM,WAAW,uBAAO,SAAS;AACjC,QAAM,SAAS,uBAAO,OAAO;AAS7B,QAAI;AAKJ,QAAMQ,qBAAN,MAAwB;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,MAyBtB,YAAY,SAAS;AACnB,aAAK,WAAW,WAAW,CAAC;AAC5B,aAAK,aACH,KAAK,SAAS,cAAc,SAAY,KAAK,SAAS,YAAY;AACpE,aAAK,cAAc,KAAK,SAAS,aAAa;AAC9C,aAAK,YAAY,CAAC,CAAC,KAAK,SAAS;AACjC,aAAK,WAAW;AAChB,aAAK,WAAW;AAEhB,aAAK,SAAS;AAEd,YAAI,CAAC,aAAa;AAChB,gBAAM,cACJ,KAAK,SAAS,qBAAqB,SAC/B,KAAK,SAAS,mBACd;AACN,wBAAc,IAAI,QAAQ,WAAW;AAAA,QACvC;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,WAAW,gBAAgB;AACzB,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,QAAQ;AACN,cAAM,SAAS,CAAC;AAEhB,YAAI,KAAK,SAAS,yBAAyB;AACzC,iBAAO,6BAA6B;AAAA,QACtC;AACA,YAAI,KAAK,SAAS,yBAAyB;AACzC,iBAAO,6BAA6B;AAAA,QACtC;AACA,YAAI,KAAK,SAAS,qBAAqB;AACrC,iBAAO,yBAAyB,KAAK,SAAS;AAAA,QAChD;AACA,YAAI,KAAK,SAAS,qBAAqB;AACrC,iBAAO,yBAAyB,KAAK,SAAS;AAAA,QAChD,WAAW,KAAK,SAAS,uBAAuB,MAAM;AACpD,iBAAO,yBAAyB;AAAA,QAClC;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,OAAO,gBAAgB;AACrB,yBAAiB,KAAK,gBAAgB,cAAc;AAEpD,aAAK,SAAS,KAAK,YACf,KAAK,eAAe,cAAc,IAClC,KAAK,eAAe,cAAc;AAEtC,eAAO,KAAK;AAAA,MACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,UAAU;AACR,YAAI,KAAK,UAAU;AACjB,eAAK,SAAS,MAAM;AACpB,eAAK,WAAW;AAAA,QAClB;AAEA,YAAI,KAAK,UAAU;AACjB,gBAAM,WAAW,KAAK,SAAS,SAAS;AAExC,eAAK,SAAS,MAAM;AACpB,eAAK,WAAW;AAEhB,cAAI,UAAU;AACZ;AAAA,cACE,IAAI;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,eAAe,QAAQ;AACrB,cAAM,OAAO,KAAK;AAClB,cAAM,WAAW,OAAO,KAAK,CAAC,WAAW;AACvC,cACG,KAAK,4BAA4B,SAChC,OAAO,8BACR,OAAO,2BACL,KAAK,wBAAwB,SAC3B,OAAO,KAAK,wBAAwB,YACnC,KAAK,sBAAsB,OAAO,2BACvC,OAAO,KAAK,wBAAwB,YACnC,CAAC,OAAO,wBACV;AACA,mBAAO;AAAA,UACT;AAEA,iBAAO;AAAA,QACT,CAAC;AAED,YAAI,CAAC,UAAU;AACb,gBAAM,IAAI,MAAM,8CAA8C;AAAA,QAChE;AAEA,YAAI,KAAK,yBAAyB;AAChC,mBAAS,6BAA6B;AAAA,QACxC;AACA,YAAI,KAAK,yBAAyB;AAChC,mBAAS,6BAA6B;AAAA,QACxC;AACA,YAAI,OAAO,KAAK,wBAAwB,UAAU;AAChD,mBAAS,yBAAyB,KAAK;AAAA,QACzC;AACA,YAAI,OAAO,KAAK,wBAAwB,UAAU;AAChD,mBAAS,yBAAyB,KAAK;AAAA,QACzC,WACE,SAAS,2BAA2B,QACpC,KAAK,wBAAwB,OAC7B;AACA,iBAAO,SAAS;AAAA,QAClB;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,eAAe,UAAU;AACvB,cAAM,SAAS,SAAS,CAAC;AAEzB,YACE,KAAK,SAAS,4BAA4B,SAC1C,OAAO,4BACP;AACA,gBAAM,IAAI,MAAM,mDAAmD;AAAA,QACrE;AAEA,YAAI,CAAC,OAAO,wBAAwB;AAClC,cAAI,OAAO,KAAK,SAAS,wBAAwB,UAAU;AACzD,mBAAO,yBAAyB,KAAK,SAAS;AAAA,UAChD;AAAA,QACF,WACE,KAAK,SAAS,wBAAwB,SACrC,OAAO,KAAK,SAAS,wBAAwB,YAC5C,OAAO,yBAAyB,KAAK,SAAS,qBAChD;AACA,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,gBAAgB,gBAAgB;AAC9B,uBAAe,QAAQ,CAAC,WAAW;AACjC,iBAAO,KAAK,MAAM,EAAE,QAAQ,CAAC,QAAQ;AACnC,gBAAI,QAAQ,OAAO,GAAG;AAEtB,gBAAI,MAAM,SAAS,GAAG;AACpB,oBAAM,IAAI,MAAM,cAAc,GAAG,iCAAiC;AAAA,YACpE;AAEA,oBAAQ,MAAM,CAAC;AAEf,gBAAI,QAAQ,0BAA0B;AACpC,kBAAI,UAAU,MAAM;AAClB,sBAAM,MAAM,CAAC;AACb,oBAAI,CAAC,OAAO,UAAU,GAAG,KAAK,MAAM,KAAK,MAAM,IAAI;AACjD,wBAAM,IAAI;AAAA,oBACR,gCAAgC,GAAG,MAAM,KAAK;AAAA,kBAChD;AAAA,gBACF;AACA,wBAAQ;AAAA,cACV,WAAW,CAAC,KAAK,WAAW;AAC1B,sBAAM,IAAI;AAAA,kBACR,gCAAgC,GAAG,MAAM,KAAK;AAAA,gBAChD;AAAA,cACF;AAAA,YACF,WAAW,QAAQ,0BAA0B;AAC3C,oBAAM,MAAM,CAAC;AACb,kBAAI,CAAC,OAAO,UAAU,GAAG,KAAK,MAAM,KAAK,MAAM,IAAI;AACjD,sBAAM,IAAI;AAAA,kBACR,gCAAgC,GAAG,MAAM,KAAK;AAAA,gBAChD;AAAA,cACF;AACA,sBAAQ;AAAA,YACV,WACE,QAAQ,gCACR,QAAQ,8BACR;AACA,kBAAI,UAAU,MAAM;AAClB,sBAAM,IAAI;AAAA,kBACR,gCAAgC,GAAG,MAAM,KAAK;AAAA,gBAChD;AAAA,cACF;AAAA,YACF,OAAO;AACL,oBAAM,IAAI,MAAM,sBAAsB,GAAG,GAAG;AAAA,YAC9C;AAEA,mBAAO,GAAG,IAAI;AAAA,UAChB,CAAC;AAAA,QACH,CAAC;AAED,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUA,WAAW,MAAM,KAAK,UAAU;AAC9B,oBAAY,IAAI,CAAC,SAAS;AACxB,eAAK,YAAY,MAAM,KAAK,CAAC,KAAK,WAAW;AAC3C,iBAAK;AACL,qBAAS,KAAK,MAAM;AAAA,UACtB,CAAC;AAAA,QACH,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUA,SAAS,MAAM,KAAK,UAAU;AAC5B,oBAAY,IAAI,CAAC,SAAS;AACxB,eAAK,UAAU,MAAM,KAAK,CAAC,KAAK,WAAW;AACzC,iBAAK;AACL,qBAAS,KAAK,MAAM;AAAA,UACtB,CAAC;AAAA,QACH,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUA,YAAY,MAAM,KAAK,UAAU;AAC/B,cAAM,WAAW,KAAK,YAAY,WAAW;AAE7C,YAAI,CAAC,KAAK,UAAU;AAClB,gBAAM,MAAM,GAAG,QAAQ;AACvB,gBAAM,aACJ,OAAO,KAAK,OAAO,GAAG,MAAM,WACxB,KAAK,uBACL,KAAK,OAAO,GAAG;AAErB,eAAK,WAAW,KAAK,iBAAiB;AAAA,YACpC,GAAG,KAAK,SAAS;AAAA,YACjB;AAAA,UACF,CAAC;AACD,eAAK,SAAS,kBAAkB,IAAI;AACpC,eAAK,SAAS,YAAY,IAAI;AAC9B,eAAK,SAAS,QAAQ,IAAI,CAAC;AAC3B,eAAK,SAAS,GAAG,SAAS,cAAc;AACxC,eAAK,SAAS,GAAG,QAAQ,aAAa;AAAA,QACxC;AAEA,aAAK,SAAS,SAAS,IAAI;AAE3B,aAAK,SAAS,MAAM,IAAI;AACxB,YAAI,IAAK,MAAK,SAAS,MAAM,OAAO;AAEpC,aAAK,SAAS,MAAM,MAAM;AACxB,gBAAM,MAAM,KAAK,SAAS,MAAM;AAEhC,cAAI,KAAK;AACP,iBAAK,SAAS,MAAM;AACpB,iBAAK,WAAW;AAChB,qBAAS,GAAG;AACZ;AAAA,UACF;AAEA,gBAAMC,QAAO,WAAW;AAAA,YACtB,KAAK,SAAS,QAAQ;AAAA,YACtB,KAAK,SAAS,YAAY;AAAA,UAC5B;AAEA,cAAI,KAAK,SAAS,eAAe,YAAY;AAC3C,iBAAK,SAAS,MAAM;AACpB,iBAAK,WAAW;AAAA,UAClB,OAAO;AACL,iBAAK,SAAS,YAAY,IAAI;AAC9B,iBAAK,SAAS,QAAQ,IAAI,CAAC;AAE3B,gBAAI,OAAO,KAAK,OAAO,GAAG,QAAQ,sBAAsB,GAAG;AACzD,mBAAK,SAAS,MAAM;AAAA,YACtB;AAAA,UACF;AAEA,mBAAS,MAAMA,KAAI;AAAA,QACrB,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUA,UAAU,MAAM,KAAK,UAAU;AAC7B,cAAM,WAAW,KAAK,YAAY,WAAW;AAE7C,YAAI,CAAC,KAAK,UAAU;AAClB,gBAAM,MAAM,GAAG,QAAQ;AACvB,gBAAM,aACJ,OAAO,KAAK,OAAO,GAAG,MAAM,WACxB,KAAK,uBACL,KAAK,OAAO,GAAG;AAErB,eAAK,WAAW,KAAK,iBAAiB;AAAA,YACpC,GAAG,KAAK,SAAS;AAAA,YACjB;AAAA,UACF,CAAC;AAED,eAAK,SAAS,YAAY,IAAI;AAC9B,eAAK,SAAS,QAAQ,IAAI,CAAC;AAE3B,eAAK,SAAS,GAAG,QAAQ,aAAa;AAAA,QACxC;AAEA,aAAK,SAAS,SAAS,IAAI;AAE3B,aAAK,SAAS,MAAM,IAAI;AACxB,aAAK,SAAS,MAAM,KAAK,cAAc,MAAM;AAC3C,cAAI,CAAC,KAAK,UAAU;AAIlB;AAAA,UACF;AAEA,cAAIA,QAAO,WAAW;AAAA,YACpB,KAAK,SAAS,QAAQ;AAAA,YACtB,KAAK,SAAS,YAAY;AAAA,UAC5B;AAEA,cAAI,KAAK;AACP,YAAAA,QAAO,IAAI,WAAWA,MAAK,QAAQA,MAAK,YAAYA,MAAK,SAAS,CAAC;AAAA,UACrE;AAMA,eAAK,SAAS,SAAS,IAAI;AAE3B,eAAK,SAAS,YAAY,IAAI;AAC9B,eAAK,SAAS,QAAQ,IAAI,CAAC;AAE3B,cAAI,OAAO,KAAK,OAAO,GAAG,QAAQ,sBAAsB,GAAG;AACzD,iBAAK,SAAS,MAAM;AAAA,UACtB;AAEA,mBAAS,MAAMA,KAAI;AAAA,QACrB,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO,UAAUD;AAQjB,aAAS,cAAc,OAAO;AAC5B,WAAK,QAAQ,EAAE,KAAK,KAAK;AACzB,WAAK,YAAY,KAAK,MAAM;AAAA,IAC9B;AAQA,aAAS,cAAc,OAAO;AAC5B,WAAK,YAAY,KAAK,MAAM;AAE5B,UACE,KAAK,kBAAkB,EAAE,cAAc,KACvC,KAAK,YAAY,KAAK,KAAK,kBAAkB,EAAE,aAC/C;AACA,aAAK,QAAQ,EAAE,KAAK,KAAK;AACzB;AAAA,MACF;AAEA,WAAK,MAAM,IAAI,IAAI,WAAW,2BAA2B;AACzD,WAAK,MAAM,EAAE,OAAO;AACpB,WAAK,MAAM,EAAE,WAAW,IAAI;AAC5B,WAAK,eAAe,QAAQ,aAAa;AASzC,WAAK,MAAM;AAAA,IACb;AAQA,aAAS,eAAe,KAAK;AAK3B,WAAK,kBAAkB,EAAE,WAAW;AAEpC,UAAI,KAAK,MAAM,GAAG;AAChB,aAAK,SAAS,EAAE,KAAK,MAAM,CAAC;AAC5B;AAAA,MACF;AAEA,UAAI,WAAW,IAAI;AACnB,WAAK,SAAS,EAAE,GAAG;AAAA,IACrB;AAAA;AAAA;;;AC/gBA;AAAA;AAAA;AAEA,QAAM,EAAE,OAAO,IAAI,UAAQ,QAAQ;AAEnC,QAAM,EAAE,QAAQ,IAAI;AAcpB,QAAM,aAAa;AAAA,MACjB;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,MAC7C;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,MAC7C;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,MAC7C;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,MAC7C;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,MAC7C;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,MAC7C;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,MAC7C;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,IAC/C;AASA,aAAS,kBAAkB,MAAM;AAC/B,aACG,QAAQ,OACP,QAAQ,QACR,SAAS,QACT,SAAS,QACT,SAAS,QACV,QAAQ,OAAQ,QAAQ;AAAA,IAE7B;AAWA,aAAS,aAAa,KAAK;AACzB,YAAM,MAAM,IAAI;AAChB,UAAI,IAAI;AAER,aAAO,IAAI,KAAK;AACd,aAAK,IAAI,CAAC,IAAI,SAAU,GAAG;AAEzB;AAAA,QACF,YAAY,IAAI,CAAC,IAAI,SAAU,KAAM;AAEnC,cACE,IAAI,MAAM,QACT,IAAI,IAAI,CAAC,IAAI,SAAU,QACvB,IAAI,CAAC,IAAI,SAAU,KACpB;AACA,mBAAO;AAAA,UACT;AAEA,eAAK;AAAA,QACP,YAAY,IAAI,CAAC,IAAI,SAAU,KAAM;AAEnC,cACE,IAAI,KAAK,QACR,IAAI,IAAI,CAAC,IAAI,SAAU,QACvB,IAAI,IAAI,CAAC,IAAI,SAAU,OACvB,IAAI,CAAC,MAAM,QAAS,IAAI,IAAI,CAAC,IAAI,SAAU;AAAA,UAC3C,IAAI,CAAC,MAAM,QAAS,IAAI,IAAI,CAAC,IAAI,SAAU,KAC5C;AACA,mBAAO;AAAA,UACT;AAEA,eAAK;AAAA,QACP,YAAY,IAAI,CAAC,IAAI,SAAU,KAAM;AAEnC,cACE,IAAI,KAAK,QACR,IAAI,IAAI,CAAC,IAAI,SAAU,QACvB,IAAI,IAAI,CAAC,IAAI,SAAU,QACvB,IAAI,IAAI,CAAC,IAAI,SAAU,OACvB,IAAI,CAAC,MAAM,QAAS,IAAI,IAAI,CAAC,IAAI,SAAU;AAAA,UAC3C,IAAI,CAAC,MAAM,OAAQ,IAAI,IAAI,CAAC,IAAI,OACjC,IAAI,CAAC,IAAI,KACT;AACA,mBAAO;AAAA,UACT;AAEA,eAAK;AAAA,QACP,OAAO;AACL,iBAAO;AAAA,QACT;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AASA,aAAS,OAAO,OAAO;AACrB,aACE,WACA,OAAO,UAAU,YACjB,OAAO,MAAM,gBAAgB,cAC7B,OAAO,MAAM,SAAS,YACtB,OAAO,MAAM,WAAW,eACvB,MAAM,OAAO,WAAW,MAAM,UAC7B,MAAM,OAAO,WAAW,MAAM;AAAA,IAEpC;AAEA,WAAO,UAAU;AAAA,MACf;AAAA,MACA;AAAA,MACA,aAAa;AAAA,MACb;AAAA,IACF;AAEA,QAAI,QAAQ;AACV,aAAO,QAAQ,cAAc,SAAU,KAAK;AAC1C,eAAO,IAAI,SAAS,KAAK,aAAa,GAAG,IAAI,OAAO,GAAG;AAAA,MACzD;AAAA,IACF,WAAuC,CAAC,QAAQ,IAAI,sBAAsB;AACxE,UAAI;AACF,cAAM,cAAc,UAAQ,gBAAgB;AAE5C,eAAO,QAAQ,cAAc,SAAU,KAAK;AAC1C,iBAAO,IAAI,SAAS,KAAK,aAAa,GAAG,IAAI,YAAY,GAAG;AAAA,QAC9D;AAAA,MACF,SAAS,GAAG;AAAA,MAEZ;AAAA,IACF;AAAA;AAAA;;;ACvJA;AAAA;AAAA;AAEA,QAAM,EAAE,SAAS,IAAI,UAAQ,QAAQ;AAErC,QAAME,qBAAoB;AAC1B,QAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,IAAI;AACJ,QAAM,EAAE,QAAQ,eAAe,OAAO,IAAI;AAC1C,QAAM,EAAE,mBAAmB,YAAY,IAAI;AAE3C,QAAM,aAAa,OAAO,OAAO,OAAO;AAExC,QAAM,WAAW;AACjB,QAAM,wBAAwB;AAC9B,QAAM,wBAAwB;AAC9B,QAAM,WAAW;AACjB,QAAM,WAAW;AACjB,QAAM,YAAY;AAClB,QAAM,cAAc;AAOpB,QAAMC,YAAN,cAAuB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAiB9B,YAAY,UAAU,CAAC,GAAG;AACxB,cAAM;AAEN,aAAK,0BACH,QAAQ,2BAA2B,SAC/B,QAAQ,yBACR;AACN,aAAK,cAAc,QAAQ,cAAc,aAAa,CAAC;AACvD,aAAK,cAAc,QAAQ,cAAc,CAAC;AAC1C,aAAK,YAAY,CAAC,CAAC,QAAQ;AAC3B,aAAK,cAAc,QAAQ,aAAa;AACxC,aAAK,sBAAsB,CAAC,CAAC,QAAQ;AACrC,aAAK,UAAU,IAAI;AAEnB,aAAK,iBAAiB;AACtB,aAAK,WAAW,CAAC;AAEjB,aAAK,cAAc;AACnB,aAAK,iBAAiB;AACtB,aAAK,QAAQ;AACb,aAAK,cAAc;AACnB,aAAK,UAAU;AACf,aAAK,OAAO;AACZ,aAAK,UAAU;AAEf,aAAK,sBAAsB;AAC3B,aAAK,iBAAiB;AACtB,aAAK,aAAa,CAAC;AAEnB,aAAK,WAAW;AAChB,aAAK,QAAQ;AACb,aAAK,SAAS;AAAA,MAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUA,OAAO,OAAO,UAAU,IAAI;AAC1B,YAAI,KAAK,YAAY,KAAQ,KAAK,UAAU,SAAU,QAAO,GAAG;AAEhE,aAAK,kBAAkB,MAAM;AAC7B,aAAK,SAAS,KAAK,KAAK;AACxB,aAAK,UAAU,EAAE;AAAA,MACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,QAAQ,GAAG;AACT,aAAK,kBAAkB;AAEvB,YAAI,MAAM,KAAK,SAAS,CAAC,EAAE,OAAQ,QAAO,KAAK,SAAS,MAAM;AAE9D,YAAI,IAAI,KAAK,SAAS,CAAC,EAAE,QAAQ;AAC/B,gBAAM,MAAM,KAAK,SAAS,CAAC;AAC3B,eAAK,SAAS,CAAC,IAAI,IAAI;AAAA,YACrB,IAAI;AAAA,YACJ,IAAI,aAAa;AAAA,YACjB,IAAI,SAAS;AAAA,UACf;AAEA,iBAAO,IAAI,WAAW,IAAI,QAAQ,IAAI,YAAY,CAAC;AAAA,QACrD;AAEA,cAAM,MAAM,OAAO,YAAY,CAAC;AAEhC,WAAG;AACD,gBAAM,MAAM,KAAK,SAAS,CAAC;AAC3B,gBAAM,SAAS,IAAI,SAAS;AAE5B,cAAI,KAAK,IAAI,QAAQ;AACnB,gBAAI,IAAI,KAAK,SAAS,MAAM,GAAG,MAAM;AAAA,UACvC,OAAO;AACL,gBAAI,IAAI,IAAI,WAAW,IAAI,QAAQ,IAAI,YAAY,CAAC,GAAG,MAAM;AAC7D,iBAAK,SAAS,CAAC,IAAI,IAAI;AAAA,cACrB,IAAI;AAAA,cACJ,IAAI,aAAa;AAAA,cACjB,IAAI,SAAS;AAAA,YACf;AAAA,UACF;AAEA,eAAK,IAAI;AAAA,QACX,SAAS,IAAI;AAEb,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,UAAU,IAAI;AACZ,aAAK,QAAQ;AAEb,WAAG;AACD,kBAAQ,KAAK,QAAQ;AAAA,YACnB,KAAK;AACH,mBAAK,QAAQ,EAAE;AACf;AAAA,YACF,KAAK;AACH,mBAAK,mBAAmB,EAAE;AAC1B;AAAA,YACF,KAAK;AACH,mBAAK,mBAAmB,EAAE;AAC1B;AAAA,YACF,KAAK;AACH,mBAAK,QAAQ;AACb;AAAA,YACF,KAAK;AACH,mBAAK,QAAQ,EAAE;AACf;AAAA,YACF,KAAK;AAAA,YACL,KAAK;AACH,mBAAK,QAAQ;AACb;AAAA,UACJ;AAAA,QACF,SAAS,KAAK;AAEd,YAAI,CAAC,KAAK,SAAU,IAAG;AAAA,MACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,QAAQ,IAAI;AACV,YAAI,KAAK,iBAAiB,GAAG;AAC3B,eAAK,QAAQ;AACb;AAAA,QACF;AAEA,cAAM,MAAM,KAAK,QAAQ,CAAC;AAE1B,aAAK,IAAI,CAAC,IAAI,QAAU,GAAM;AAC5B,gBAAM,QAAQ,KAAK;AAAA,YACjB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAEA,aAAG,KAAK;AACR;AAAA,QACF;AAEA,cAAM,cAAc,IAAI,CAAC,IAAI,QAAU;AAEvC,YAAI,cAAc,CAAC,KAAK,YAAYD,mBAAkB,aAAa,GAAG;AACpE,gBAAM,QAAQ,KAAK;AAAA,YACjB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAEA,aAAG,KAAK;AACR;AAAA,QACF;AAEA,aAAK,QAAQ,IAAI,CAAC,IAAI,SAAU;AAChC,aAAK,UAAU,IAAI,CAAC,IAAI;AACxB,aAAK,iBAAiB,IAAI,CAAC,IAAI;AAE/B,YAAI,KAAK,YAAY,GAAM;AACzB,cAAI,YAAY;AACd,kBAAM,QAAQ,KAAK;AAAA,cACjB;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAEA,eAAG,KAAK;AACR;AAAA,UACF;AAEA,cAAI,CAAC,KAAK,aAAa;AACrB,kBAAM,QAAQ,KAAK;AAAA,cACjB;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAEA,eAAG,KAAK;AACR;AAAA,UACF;AAEA,eAAK,UAAU,KAAK;AAAA,QACtB,WAAW,KAAK,YAAY,KAAQ,KAAK,YAAY,GAAM;AACzD,cAAI,KAAK,aAAa;AACpB,kBAAM,QAAQ,KAAK;AAAA,cACjB;AAAA,cACA,kBAAkB,KAAK,OAAO;AAAA,cAC9B;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAEA,eAAG,KAAK;AACR;AAAA,UACF;AAEA,eAAK,cAAc;AAAA,QACrB,WAAW,KAAK,UAAU,KAAQ,KAAK,UAAU,IAAM;AACrD,cAAI,CAAC,KAAK,MAAM;AACd,kBAAM,QAAQ,KAAK;AAAA,cACjB;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAEA,eAAG,KAAK;AACR;AAAA,UACF;AAEA,cAAI,YAAY;AACd,kBAAM,QAAQ,KAAK;AAAA,cACjB;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAEA,eAAG,KAAK;AACR;AAAA,UACF;AAEA,cACE,KAAK,iBAAiB,OACrB,KAAK,YAAY,KAAQ,KAAK,mBAAmB,GAClD;AACA,kBAAM,QAAQ,KAAK;AAAA,cACjB;AAAA,cACA,0BAA0B,KAAK,cAAc;AAAA,cAC7C;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAEA,eAAG,KAAK;AACR;AAAA,UACF;AAAA,QACF,OAAO;AACL,gBAAM,QAAQ,KAAK;AAAA,YACjB;AAAA,YACA,kBAAkB,KAAK,OAAO;AAAA,YAC9B;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAEA,aAAG,KAAK;AACR;AAAA,QACF;AAEA,YAAI,CAAC,KAAK,QAAQ,CAAC,KAAK,YAAa,MAAK,cAAc,KAAK;AAC7D,aAAK,WAAW,IAAI,CAAC,IAAI,SAAU;AAEnC,YAAI,KAAK,WAAW;AAClB,cAAI,CAAC,KAAK,SAAS;AACjB,kBAAM,QAAQ,KAAK;AAAA,cACjB;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAEA,eAAG,KAAK;AACR;AAAA,UACF;AAAA,QACF,WAAW,KAAK,SAAS;AACvB,gBAAM,QAAQ,KAAK;AAAA,YACjB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAEA,aAAG,KAAK;AACR;AAAA,QACF;AAEA,YAAI,KAAK,mBAAmB,IAAK,MAAK,SAAS;AAAA,iBACtC,KAAK,mBAAmB,IAAK,MAAK,SAAS;AAAA,YAC/C,MAAK,WAAW,EAAE;AAAA,MACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,mBAAmB,IAAI;AACrB,YAAI,KAAK,iBAAiB,GAAG;AAC3B,eAAK,QAAQ;AACb;AAAA,QACF;AAEA,aAAK,iBAAiB,KAAK,QAAQ,CAAC,EAAE,aAAa,CAAC;AACpD,aAAK,WAAW,EAAE;AAAA,MACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,mBAAmB,IAAI;AACrB,YAAI,KAAK,iBAAiB,GAAG;AAC3B,eAAK,QAAQ;AACb;AAAA,QACF;AAEA,cAAM,MAAM,KAAK,QAAQ,CAAC;AAC1B,cAAM,MAAM,IAAI,aAAa,CAAC;AAM9B,YAAI,MAAM,KAAK,IAAI,GAAG,KAAK,EAAE,IAAI,GAAG;AAClC,gBAAM,QAAQ,KAAK;AAAA,YACjB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAEA,aAAG,KAAK;AACR;AAAA,QACF;AAEA,aAAK,iBAAiB,MAAM,KAAK,IAAI,GAAG,EAAE,IAAI,IAAI,aAAa,CAAC;AAChE,aAAK,WAAW,EAAE;AAAA,MACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,WAAW,IAAI;AACb,YAAI,KAAK,kBAAkB,KAAK,UAAU,GAAM;AAC9C,eAAK,uBAAuB,KAAK;AACjC,cAAI,KAAK,sBAAsB,KAAK,eAAe,KAAK,cAAc,GAAG;AACvE,kBAAM,QAAQ,KAAK;AAAA,cACjB;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAEA,eAAG,KAAK;AACR;AAAA,UACF;AAAA,QACF;AAEA,YAAI,KAAK,QAAS,MAAK,SAAS;AAAA,YAC3B,MAAK,SAAS;AAAA,MACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,UAAU;AACR,YAAI,KAAK,iBAAiB,GAAG;AAC3B,eAAK,QAAQ;AACb;AAAA,QACF;AAEA,aAAK,QAAQ,KAAK,QAAQ,CAAC;AAC3B,aAAK,SAAS;AAAA,MAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,QAAQ,IAAI;AACV,YAAI,OAAO;AAEX,YAAI,KAAK,gBAAgB;AACvB,cAAI,KAAK,iBAAiB,KAAK,gBAAgB;AAC7C,iBAAK,QAAQ;AACb;AAAA,UACF;AAEA,iBAAO,KAAK,QAAQ,KAAK,cAAc;AAEvC,cACE,KAAK,YACJ,KAAK,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,OAAO,GACpE;AACA,mBAAO,MAAM,KAAK,KAAK;AAAA,UACzB;AAAA,QACF;AAEA,YAAI,KAAK,UAAU,GAAM;AACvB,eAAK,eAAe,MAAM,EAAE;AAC5B;AAAA,QACF;AAEA,YAAI,KAAK,aAAa;AACpB,eAAK,SAAS;AACd,eAAK,WAAW,MAAM,EAAE;AACxB;AAAA,QACF;AAEA,YAAI,KAAK,QAAQ;AAKf,eAAK,iBAAiB,KAAK;AAC3B,eAAK,WAAW,KAAK,IAAI;AAAA,QAC3B;AAEA,aAAK,YAAY,EAAE;AAAA,MACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,WAAW,MAAM,IAAI;AACnB,cAAM,oBAAoB,KAAK,YAAYA,mBAAkB,aAAa;AAE1E,0BAAkB,WAAW,MAAM,KAAK,MAAM,CAAC,KAAK,QAAQ;AAC1D,cAAI,IAAK,QAAO,GAAG,GAAG;AAEtB,cAAI,IAAI,QAAQ;AACd,iBAAK,kBAAkB,IAAI;AAC3B,gBAAI,KAAK,iBAAiB,KAAK,eAAe,KAAK,cAAc,GAAG;AAClE,oBAAM,QAAQ,KAAK;AAAA,gBACjB;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,cACF;AAEA,iBAAG,KAAK;AACR;AAAA,YACF;AAEA,iBAAK,WAAW,KAAK,GAAG;AAAA,UAC1B;AAEA,eAAK,YAAY,EAAE;AACnB,cAAI,KAAK,WAAW,SAAU,MAAK,UAAU,EAAE;AAAA,QACjD,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,YAAY,IAAI;AACd,YAAI,CAAC,KAAK,MAAM;AACd,eAAK,SAAS;AACd;AAAA,QACF;AAEA,cAAM,gBAAgB,KAAK;AAC3B,cAAM,YAAY,KAAK;AAEvB,aAAK,sBAAsB;AAC3B,aAAK,iBAAiB;AACtB,aAAK,cAAc;AACnB,aAAK,aAAa,CAAC;AAEnB,YAAI,KAAK,YAAY,GAAG;AACtB,cAAI;AAEJ,cAAI,KAAK,gBAAgB,cAAc;AACrC,mBAAO,OAAO,WAAW,aAAa;AAAA,UACxC,WAAW,KAAK,gBAAgB,eAAe;AAC7C,mBAAO,cAAc,OAAO,WAAW,aAAa,CAAC;AAAA,UACvD,WAAW,KAAK,gBAAgB,QAAQ;AACtC,mBAAO,IAAI,KAAK,SAAS;AAAA,UAC3B,OAAO;AACL,mBAAO;AAAA,UACT;AAEA,cAAI,KAAK,yBAAyB;AAChC,iBAAK,KAAK,WAAW,MAAM,IAAI;AAC/B,iBAAK,SAAS;AAAA,UAChB,OAAO;AACL,iBAAK,SAAS;AACd,yBAAa,MAAM;AACjB,mBAAK,KAAK,WAAW,MAAM,IAAI;AAC/B,mBAAK,SAAS;AACd,mBAAK,UAAU,EAAE;AAAA,YACnB,CAAC;AAAA,UACH;AAAA,QACF,OAAO;AACL,gBAAM,MAAM,OAAO,WAAW,aAAa;AAE3C,cAAI,CAAC,KAAK,uBAAuB,CAAC,YAAY,GAAG,GAAG;AAClD,kBAAM,QAAQ,KAAK;AAAA,cACjB;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAEA,eAAG,KAAK;AACR;AAAA,UACF;AAEA,cAAI,KAAK,WAAW,aAAa,KAAK,yBAAyB;AAC7D,iBAAK,KAAK,WAAW,KAAK,KAAK;AAC/B,iBAAK,SAAS;AAAA,UAChB,OAAO;AACL,iBAAK,SAAS;AACd,yBAAa,MAAM;AACjB,mBAAK,KAAK,WAAW,KAAK,KAAK;AAC/B,mBAAK,SAAS;AACd,mBAAK,UAAU,EAAE;AAAA,YACnB,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,eAAe,MAAM,IAAI;AACvB,YAAI,KAAK,YAAY,GAAM;AACzB,cAAI,KAAK,WAAW,GAAG;AACrB,iBAAK,QAAQ;AACb,iBAAK,KAAK,YAAY,MAAM,YAAY;AACxC,iBAAK,IAAI;AAAA,UACX,OAAO;AACL,kBAAM,OAAO,KAAK,aAAa,CAAC;AAEhC,gBAAI,CAAC,kBAAkB,IAAI,GAAG;AAC5B,oBAAM,QAAQ,KAAK;AAAA,gBACjB;AAAA,gBACA,uBAAuB,IAAI;AAAA,gBAC3B;AAAA,gBACA;AAAA,gBACA;AAAA,cACF;AAEA,iBAAG,KAAK;AACR;AAAA,YACF;AAEA,kBAAM,MAAM,IAAI;AAAA,cACd,KAAK;AAAA,cACL,KAAK,aAAa;AAAA,cAClB,KAAK,SAAS;AAAA,YAChB;AAEA,gBAAI,CAAC,KAAK,uBAAuB,CAAC,YAAY,GAAG,GAAG;AAClD,oBAAM,QAAQ,KAAK;AAAA,gBACjB;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,cACF;AAEA,iBAAG,KAAK;AACR;AAAA,YACF;AAEA,iBAAK,QAAQ;AACb,iBAAK,KAAK,YAAY,MAAM,GAAG;AAC/B,iBAAK,IAAI;AAAA,UACX;AAEA,eAAK,SAAS;AACd;AAAA,QACF;AAEA,YAAI,KAAK,yBAAyB;AAChC,eAAK,KAAK,KAAK,YAAY,IAAO,SAAS,QAAQ,IAAI;AACvD,eAAK,SAAS;AAAA,QAChB,OAAO;AACL,eAAK,SAAS;AACd,uBAAa,MAAM;AACjB,iBAAK,KAAK,KAAK,YAAY,IAAO,SAAS,QAAQ,IAAI;AACvD,iBAAK,SAAS;AACd,iBAAK,UAAU,EAAE;AAAA,UACnB,CAAC;AAAA,QACH;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAcA,YAAY,WAAW,SAAS,QAAQ,YAAY,WAAW;AAC7D,aAAK,QAAQ;AACb,aAAK,WAAW;AAEhB,cAAM,MAAM,IAAI;AAAA,UACd,SAAS,4BAA4B,OAAO,KAAK;AAAA,QACnD;AAEA,cAAM,kBAAkB,KAAK,KAAK,WAAW;AAC7C,YAAI,OAAO;AACX,YAAI,WAAW,IAAI;AACnB,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO,UAAUC;AAAA;AAAA;;;ACjsBjB;AAAA;AAAA;AAIA,QAAM,EAAE,OAAO,IAAI,UAAQ,QAAQ;AACnC,QAAM,EAAE,eAAe,IAAI,UAAQ,QAAQ;AAE3C,QAAMC,qBAAoB;AAC1B,QAAM,EAAE,cAAc,YAAY,KAAK,IAAI;AAC3C,QAAM,EAAE,QAAQ,kBAAkB,IAAI;AACtC,QAAM,EAAE,MAAM,WAAW,SAAS,IAAI;AAEtC,QAAM,cAAc,uBAAO,aAAa;AACxC,QAAM,aAAa,OAAO,MAAM,CAAC;AACjC,QAAM,mBAAmB,IAAI;AAC7B,QAAI;AACJ,QAAI,oBAAoB;AAExB,QAAM,UAAU;AAChB,QAAM,YAAY;AAClB,QAAM,gBAAgB;AAKtB,QAAMC,UAAN,MAAM,QAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASX,YAAY,QAAQ,YAAY,cAAc;AAC5C,aAAK,cAAc,cAAc,CAAC;AAElC,YAAI,cAAc;AAChB,eAAK,gBAAgB;AACrB,eAAK,cAAc,OAAO,MAAM,CAAC;AAAA,QACnC;AAEA,aAAK,UAAU;AAEf,aAAK,iBAAiB;AACtB,aAAK,YAAY;AAEjB,aAAK,iBAAiB;AACtB,aAAK,SAAS,CAAC;AACf,aAAK,SAAS;AACd,aAAK,UAAU;AACf,aAAK,UAAU,IAAI;AAAA,MACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAuBA,OAAO,MAAM,MAAM,SAAS;AAC1B,YAAI;AACJ,YAAI,QAAQ;AACZ,YAAI,SAAS;AACb,YAAI,cAAc;AAElB,YAAI,QAAQ,MAAM;AAChB,iBAAO,QAAQ,cAAc;AAE7B,cAAI,QAAQ,cAAc;AACxB,oBAAQ,aAAa,IAAI;AAAA,UAC3B,OAAO;AACL,gBAAI,sBAAsB,kBAAkB;AAE1C,kBAAI,eAAe,QAAW;AAK5B,6BAAa,OAAO,MAAM,gBAAgB;AAAA,cAC5C;AAEA,6BAAe,YAAY,GAAG,gBAAgB;AAC9C,kCAAoB;AAAA,YACtB;AAEA,iBAAK,CAAC,IAAI,WAAW,mBAAmB;AACxC,iBAAK,CAAC,IAAI,WAAW,mBAAmB;AACxC,iBAAK,CAAC,IAAI,WAAW,mBAAmB;AACxC,iBAAK,CAAC,IAAI,WAAW,mBAAmB;AAAA,UAC1C;AAEA,yBAAe,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO;AAC1D,mBAAS;AAAA,QACX;AAEA,YAAI;AAEJ,YAAI,OAAO,SAAS,UAAU;AAC5B,eACG,CAAC,QAAQ,QAAQ,gBAClB,QAAQ,WAAW,MAAM,QACzB;AACA,yBAAa,QAAQ,WAAW;AAAA,UAClC,OAAO;AACL,mBAAO,OAAO,KAAK,IAAI;AACvB,yBAAa,KAAK;AAAA,UACpB;AAAA,QACF,OAAO;AACL,uBAAa,KAAK;AAClB,kBAAQ,QAAQ,QAAQ,QAAQ,YAAY,CAAC;AAAA,QAC/C;AAEA,YAAI,gBAAgB;AAEpB,YAAI,cAAc,OAAO;AACvB,oBAAU;AACV,0BAAgB;AAAA,QAClB,WAAW,aAAa,KAAK;AAC3B,oBAAU;AACV,0BAAgB;AAAA,QAClB;AAEA,cAAM,SAAS,OAAO,YAAY,QAAQ,aAAa,SAAS,MAAM;AAEtE,eAAO,CAAC,IAAI,QAAQ,MAAM,QAAQ,SAAS,MAAO,QAAQ;AAC1D,YAAI,QAAQ,KAAM,QAAO,CAAC,KAAK;AAE/B,eAAO,CAAC,IAAI;AAEZ,YAAI,kBAAkB,KAAK;AACzB,iBAAO,cAAc,YAAY,CAAC;AAAA,QACpC,WAAW,kBAAkB,KAAK;AAChC,iBAAO,CAAC,IAAI,OAAO,CAAC,IAAI;AACxB,iBAAO,YAAY,YAAY,GAAG,CAAC;AAAA,QACrC;AAEA,YAAI,CAAC,QAAQ,KAAM,QAAO,CAAC,QAAQ,IAAI;AAEvC,eAAO,CAAC,KAAK;AACb,eAAO,SAAS,CAAC,IAAI,KAAK,CAAC;AAC3B,eAAO,SAAS,CAAC,IAAI,KAAK,CAAC;AAC3B,eAAO,SAAS,CAAC,IAAI,KAAK,CAAC;AAC3B,eAAO,SAAS,CAAC,IAAI,KAAK,CAAC;AAE3B,YAAI,YAAa,QAAO,CAAC,QAAQ,IAAI;AAErC,YAAI,OAAO;AACT,oBAAU,MAAM,MAAM,QAAQ,QAAQ,UAAU;AAChD,iBAAO,CAAC,MAAM;AAAA,QAChB;AAEA,kBAAU,MAAM,MAAM,MAAM,GAAG,UAAU;AACzC,eAAO,CAAC,QAAQ,IAAI;AAAA,MACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAWA,MAAM,MAAM,MAAM,MAAM,IAAI;AAC1B,YAAI;AAEJ,YAAI,SAAS,QAAW;AACtB,gBAAM;AAAA,QACR,WAAW,OAAO,SAAS,YAAY,CAAC,kBAAkB,IAAI,GAAG;AAC/D,gBAAM,IAAI,UAAU,kDAAkD;AAAA,QACxE,WAAW,SAAS,UAAa,CAAC,KAAK,QAAQ;AAC7C,gBAAM,OAAO,YAAY,CAAC;AAC1B,cAAI,cAAc,MAAM,CAAC;AAAA,QAC3B,OAAO;AACL,gBAAM,SAAS,OAAO,WAAW,IAAI;AAErC,cAAI,SAAS,KAAK;AAChB,kBAAM,IAAI,WAAW,gDAAgD;AAAA,UACvE;AAEA,gBAAM,OAAO,YAAY,IAAI,MAAM;AACnC,cAAI,cAAc,MAAM,CAAC;AAEzB,cAAI,OAAO,SAAS,UAAU;AAC5B,gBAAI,MAAM,MAAM,CAAC;AAAA,UACnB,OAAO;AACL,gBAAI,IAAI,MAAM,CAAC;AAAA,UACjB;AAAA,QACF;AAEA,cAAM,UAAU;AAAA,UACd,CAAC,WAAW,GAAG,IAAI;AAAA,UACnB,KAAK;AAAA,UACL,cAAc,KAAK;AAAA,UACnB;AAAA,UACA,YAAY,KAAK;AAAA,UACjB,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,MAAM;AAAA,QACR;AAEA,YAAI,KAAK,WAAW,SAAS;AAC3B,eAAK,QAAQ,CAAC,KAAK,UAAU,KAAK,OAAO,SAAS,EAAE,CAAC;AAAA,QACvD,OAAO;AACL,eAAK,UAAU,QAAO,MAAM,KAAK,OAAO,GAAG,EAAE;AAAA,QAC/C;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUA,KAAK,MAAM,MAAM,IAAI;AACnB,YAAI;AACJ,YAAI;AAEJ,YAAI,OAAO,SAAS,UAAU;AAC5B,uBAAa,OAAO,WAAW,IAAI;AACnC,qBAAW;AAAA,QACb,WAAW,OAAO,IAAI,GAAG;AACvB,uBAAa,KAAK;AAClB,qBAAW;AAAA,QACb,OAAO;AACL,iBAAO,SAAS,IAAI;AACpB,uBAAa,KAAK;AAClB,qBAAW,SAAS;AAAA,QACtB;AAEA,YAAI,aAAa,KAAK;AACpB,gBAAM,IAAI,WAAW,kDAAkD;AAAA,QACzE;AAEA,cAAM,UAAU;AAAA,UACd,CAAC,WAAW,GAAG;AAAA,UACf,KAAK;AAAA,UACL,cAAc,KAAK;AAAA,UACnB;AAAA,UACA,YAAY,KAAK;AAAA,UACjB,QAAQ;AAAA,UACR;AAAA,UACA,MAAM;AAAA,QACR;AAEA,YAAI,OAAO,IAAI,GAAG;AAChB,cAAI,KAAK,WAAW,SAAS;AAC3B,iBAAK,QAAQ,CAAC,KAAK,aAAa,MAAM,OAAO,SAAS,EAAE,CAAC;AAAA,UAC3D,OAAO;AACL,iBAAK,YAAY,MAAM,OAAO,SAAS,EAAE;AAAA,UAC3C;AAAA,QACF,WAAW,KAAK,WAAW,SAAS;AAClC,eAAK,QAAQ,CAAC,KAAK,UAAU,MAAM,OAAO,SAAS,EAAE,CAAC;AAAA,QACxD,OAAO;AACL,eAAK,UAAU,QAAO,MAAM,MAAM,OAAO,GAAG,EAAE;AAAA,QAChD;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUA,KAAK,MAAM,MAAM,IAAI;AACnB,YAAI;AACJ,YAAI;AAEJ,YAAI,OAAO,SAAS,UAAU;AAC5B,uBAAa,OAAO,WAAW,IAAI;AACnC,qBAAW;AAAA,QACb,WAAW,OAAO,IAAI,GAAG;AACvB,uBAAa,KAAK;AAClB,qBAAW;AAAA,QACb,OAAO;AACL,iBAAO,SAAS,IAAI;AACpB,uBAAa,KAAK;AAClB,qBAAW,SAAS;AAAA,QACtB;AAEA,YAAI,aAAa,KAAK;AACpB,gBAAM,IAAI,WAAW,kDAAkD;AAAA,QACzE;AAEA,cAAM,UAAU;AAAA,UACd,CAAC,WAAW,GAAG;AAAA,UACf,KAAK;AAAA,UACL,cAAc,KAAK;AAAA,UACnB;AAAA,UACA,YAAY,KAAK;AAAA,UACjB,QAAQ;AAAA,UACR;AAAA,UACA,MAAM;AAAA,QACR;AAEA,YAAI,OAAO,IAAI,GAAG;AAChB,cAAI,KAAK,WAAW,SAAS;AAC3B,iBAAK,QAAQ,CAAC,KAAK,aAAa,MAAM,OAAO,SAAS,EAAE,CAAC;AAAA,UAC3D,OAAO;AACL,iBAAK,YAAY,MAAM,OAAO,SAAS,EAAE;AAAA,UAC3C;AAAA,QACF,WAAW,KAAK,WAAW,SAAS;AAClC,eAAK,QAAQ,CAAC,KAAK,UAAU,MAAM,OAAO,SAAS,EAAE,CAAC;AAAA,QACxD,OAAO;AACL,eAAK,UAAU,QAAO,MAAM,MAAM,OAAO,GAAG,EAAE;AAAA,QAChD;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAkBA,KAAK,MAAM,SAAS,IAAI;AACtB,cAAM,oBAAoB,KAAK,YAAYD,mBAAkB,aAAa;AAC1E,YAAI,SAAS,QAAQ,SAAS,IAAI;AAClC,YAAI,OAAO,QAAQ;AAEnB,YAAI;AACJ,YAAI;AAEJ,YAAI,OAAO,SAAS,UAAU;AAC5B,uBAAa,OAAO,WAAW,IAAI;AACnC,qBAAW;AAAA,QACb,WAAW,OAAO,IAAI,GAAG;AACvB,uBAAa,KAAK;AAClB,qBAAW;AAAA,QACb,OAAO;AACL,iBAAO,SAAS,IAAI;AACpB,uBAAa,KAAK;AAClB,qBAAW,SAAS;AAAA,QACtB;AAEA,YAAI,KAAK,gBAAgB;AACvB,eAAK,iBAAiB;AACtB,cACE,QACA,qBACA,kBAAkB,OAChB,kBAAkB,YACd,+BACA,4BACN,GACA;AACA,mBAAO,cAAc,kBAAkB;AAAA,UACzC;AACA,eAAK,YAAY;AAAA,QACnB,OAAO;AACL,iBAAO;AACP,mBAAS;AAAA,QACX;AAEA,YAAI,QAAQ,IAAK,MAAK,iBAAiB;AAEvC,cAAM,OAAO;AAAA,UACX,CAAC,WAAW,GAAG;AAAA,UACf,KAAK,QAAQ;AAAA,UACb,cAAc,KAAK;AAAA,UACnB,MAAM,QAAQ;AAAA,UACd,YAAY,KAAK;AAAA,UACjB;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAEA,YAAI,OAAO,IAAI,GAAG;AAChB,cAAI,KAAK,WAAW,SAAS;AAC3B,iBAAK,QAAQ,CAAC,KAAK,aAAa,MAAM,KAAK,WAAW,MAAM,EAAE,CAAC;AAAA,UACjE,OAAO;AACL,iBAAK,YAAY,MAAM,KAAK,WAAW,MAAM,EAAE;AAAA,UACjD;AAAA,QACF,WAAW,KAAK,WAAW,SAAS;AAClC,eAAK,QAAQ,CAAC,KAAK,UAAU,MAAM,KAAK,WAAW,MAAM,EAAE,CAAC;AAAA,QAC9D,OAAO;AACL,eAAK,SAAS,MAAM,KAAK,WAAW,MAAM,EAAE;AAAA,QAC9C;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAyBA,YAAY,MAAM,UAAU,SAAS,IAAI;AACvC,aAAK,kBAAkB,QAAQ,WAAW;AAC1C,aAAK,SAAS;AAEd,aACG,YAAY,EACZ,KAAK,CAAC,gBAAgB;AACrB,cAAI,KAAK,QAAQ,WAAW;AAC1B,kBAAM,MAAM,IAAI;AAAA,cACd;AAAA,YACF;AAOA,oBAAQ,SAAS,eAAe,MAAM,KAAK,EAAE;AAC7C;AAAA,UACF;AAEA,eAAK,kBAAkB,QAAQ,WAAW;AAC1C,gBAAM,OAAO,SAAS,WAAW;AAEjC,cAAI,CAAC,UAAU;AACb,iBAAK,SAAS;AACd,iBAAK,UAAU,QAAO,MAAM,MAAM,OAAO,GAAG,EAAE;AAC9C,iBAAK,QAAQ;AAAA,UACf,OAAO;AACL,iBAAK,SAAS,MAAM,UAAU,SAAS,EAAE;AAAA,UAC3C;AAAA,QACF,CAAC,EACA,MAAM,CAAC,QAAQ;AAKd,kBAAQ,SAAS,SAAS,MAAM,KAAK,EAAE;AAAA,QACzC,CAAC;AAAA,MACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAyBA,SAAS,MAAM,UAAU,SAAS,IAAI;AACpC,YAAI,CAAC,UAAU;AACb,eAAK,UAAU,QAAO,MAAM,MAAM,OAAO,GAAG,EAAE;AAC9C;AAAA,QACF;AAEA,cAAM,oBAAoB,KAAK,YAAYA,mBAAkB,aAAa;AAE1E,aAAK,kBAAkB,QAAQ,WAAW;AAC1C,aAAK,SAAS;AACd,0BAAkB,SAAS,MAAM,QAAQ,KAAK,CAAC,GAAG,QAAQ;AACxD,cAAI,KAAK,QAAQ,WAAW;AAC1B,kBAAM,MAAM,IAAI;AAAA,cACd;AAAA,YACF;AAEA,0BAAc,MAAM,KAAK,EAAE;AAC3B;AAAA,UACF;AAEA,eAAK,kBAAkB,QAAQ,WAAW;AAC1C,eAAK,SAAS;AACd,kBAAQ,WAAW;AACnB,eAAK,UAAU,QAAO,MAAM,KAAK,OAAO,GAAG,EAAE;AAC7C,eAAK,QAAQ;AAAA,QACf,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,UAAU;AACR,eAAO,KAAK,WAAW,WAAW,KAAK,OAAO,QAAQ;AACpD,gBAAM,SAAS,KAAK,OAAO,MAAM;AAEjC,eAAK,kBAAkB,OAAO,CAAC,EAAE,WAAW;AAC5C,kBAAQ,MAAM,OAAO,CAAC,GAAG,MAAM,OAAO,MAAM,CAAC,CAAC;AAAA,QAChD;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,QAAQ,QAAQ;AACd,aAAK,kBAAkB,OAAO,CAAC,EAAE,WAAW;AAC5C,aAAK,OAAO,KAAK,MAAM;AAAA,MACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,UAAU,MAAM,IAAI;AAClB,YAAI,KAAK,WAAW,GAAG;AACrB,eAAK,QAAQ,KAAK;AAClB,eAAK,QAAQ,MAAM,KAAK,CAAC,CAAC;AAC1B,eAAK,QAAQ,MAAM,KAAK,CAAC,GAAG,EAAE;AAC9B,eAAK,QAAQ,OAAO;AAAA,QACtB,OAAO;AACL,eAAK,QAAQ,MAAM,KAAK,CAAC,GAAG,EAAE;AAAA,QAChC;AAAA,MACF;AAAA,IACF;AAEA,WAAO,UAAUC;AAUjB,aAAS,cAAc,QAAQ,KAAK,IAAI;AACtC,UAAI,OAAO,OAAO,WAAY,IAAG,GAAG;AAEpC,eAAS,IAAI,GAAG,IAAI,OAAO,OAAO,QAAQ,KAAK;AAC7C,cAAM,SAAS,OAAO,OAAO,CAAC;AAC9B,cAAM,WAAW,OAAO,OAAO,SAAS,CAAC;AAEzC,YAAI,OAAO,aAAa,WAAY,UAAS,GAAG;AAAA,MAClD;AAAA,IACF;AAUA,aAAS,QAAQ,QAAQ,KAAK,IAAI;AAChC,oBAAc,QAAQ,KAAK,EAAE;AAC7B,aAAO,QAAQ,GAAG;AAAA,IACpB;AAAA;AAAA;;;ACzlBA;AAAA;AAAA;AAEA,QAAM,EAAE,sBAAsB,UAAU,IAAI;AAE5C,QAAM,QAAQ,uBAAO,OAAO;AAC5B,QAAM,QAAQ,uBAAO,OAAO;AAC5B,QAAM,SAAS,uBAAO,QAAQ;AAC9B,QAAM,WAAW,uBAAO,UAAU;AAClC,QAAM,UAAU,uBAAO,SAAS;AAChC,QAAM,UAAU,uBAAO,SAAS;AAChC,QAAM,QAAQ,uBAAO,OAAO;AAC5B,QAAM,YAAY,uBAAO,WAAW;AAKpC,QAAM,QAAN,MAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOV,YAAY,MAAM;AAChB,aAAK,OAAO,IAAI;AAChB,aAAK,KAAK,IAAI;AAAA,MAChB;AAAA;AAAA;AAAA;AAAA,MAKA,IAAI,SAAS;AACX,eAAO,KAAK,OAAO;AAAA,MACrB;AAAA;AAAA;AAAA;AAAA,MAKA,IAAI,OAAO;AACT,eAAO,KAAK,KAAK;AAAA,MACnB;AAAA,IACF;AAEA,WAAO,eAAe,MAAM,WAAW,UAAU,EAAE,YAAY,KAAK,CAAC;AACrE,WAAO,eAAe,MAAM,WAAW,QAAQ,EAAE,YAAY,KAAK,CAAC;AAOnE,QAAM,aAAN,cAAyB,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAc7B,YAAY,MAAM,UAAU,CAAC,GAAG;AAC9B,cAAM,IAAI;AAEV,aAAK,KAAK,IAAI,QAAQ,SAAS,SAAY,IAAI,QAAQ;AACvD,aAAK,OAAO,IAAI,QAAQ,WAAW,SAAY,KAAK,QAAQ;AAC5D,aAAK,SAAS,IAAI,QAAQ,aAAa,SAAY,QAAQ,QAAQ;AAAA,MACrE;AAAA;AAAA;AAAA;AAAA,MAKA,IAAI,OAAO;AACT,eAAO,KAAK,KAAK;AAAA,MACnB;AAAA;AAAA;AAAA;AAAA,MAKA,IAAI,SAAS;AACX,eAAO,KAAK,OAAO;AAAA,MACrB;AAAA;AAAA;AAAA;AAAA,MAKA,IAAI,WAAW;AACb,eAAO,KAAK,SAAS;AAAA,MACvB;AAAA,IACF;AAEA,WAAO,eAAe,WAAW,WAAW,QAAQ,EAAE,YAAY,KAAK,CAAC;AACxE,WAAO,eAAe,WAAW,WAAW,UAAU,EAAE,YAAY,KAAK,CAAC;AAC1E,WAAO,eAAe,WAAW,WAAW,YAAY,EAAE,YAAY,KAAK,CAAC;AAO5E,QAAM,aAAN,cAAyB,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAU7B,YAAY,MAAM,UAAU,CAAC,GAAG;AAC9B,cAAM,IAAI;AAEV,aAAK,MAAM,IAAI,QAAQ,UAAU,SAAY,OAAO,QAAQ;AAC5D,aAAK,QAAQ,IAAI,QAAQ,YAAY,SAAY,KAAK,QAAQ;AAAA,MAChE;AAAA;AAAA;AAAA;AAAA,MAKA,IAAI,QAAQ;AACV,eAAO,KAAK,MAAM;AAAA,MACpB;AAAA;AAAA;AAAA;AAAA,MAKA,IAAI,UAAU;AACZ,eAAO,KAAK,QAAQ;AAAA,MACtB;AAAA,IACF;AAEA,WAAO,eAAe,WAAW,WAAW,SAAS,EAAE,YAAY,KAAK,CAAC;AACzE,WAAO,eAAe,WAAW,WAAW,WAAW,EAAE,YAAY,KAAK,CAAC;AAO3E,QAAM,eAAN,cAA2B,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAS/B,YAAY,MAAM,UAAU,CAAC,GAAG;AAC9B,cAAM,IAAI;AAEV,aAAK,KAAK,IAAI,QAAQ,SAAS,SAAY,OAAO,QAAQ;AAAA,MAC5D;AAAA;AAAA;AAAA;AAAA,MAKA,IAAI,OAAO;AACT,eAAO,KAAK,KAAK;AAAA,MACnB;AAAA,IACF;AAEA,WAAO,eAAe,aAAa,WAAW,QAAQ,EAAE,YAAY,KAAK,CAAC;AAQ1E,QAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAalB,iBAAiB,MAAM,SAAS,UAAU,CAAC,GAAG;AAC5C,mBAAW,YAAY,KAAK,UAAU,IAAI,GAAG;AAC3C,cACE,CAAC,QAAQ,oBAAoB,KAC7B,SAAS,SAAS,MAAM,WACxB,CAAC,SAAS,oBAAoB,GAC9B;AACA;AAAA,UACF;AAAA,QACF;AAEA,YAAI;AAEJ,YAAI,SAAS,WAAW;AACtB,oBAAU,SAAS,UAAU,MAAM,UAAU;AAC3C,kBAAM,QAAQ,IAAI,aAAa,WAAW;AAAA,cACxC,MAAM,WAAW,OAAO,KAAK,SAAS;AAAA,YACxC,CAAC;AAED,kBAAM,OAAO,IAAI;AACjB,yBAAa,SAAS,MAAM,KAAK;AAAA,UACnC;AAAA,QACF,WAAW,SAAS,SAAS;AAC3B,oBAAU,SAAS,QAAQ,MAAM,SAAS;AACxC,kBAAM,QAAQ,IAAI,WAAW,SAAS;AAAA,cACpC;AAAA,cACA,QAAQ,QAAQ,SAAS;AAAA,cACzB,UAAU,KAAK,uBAAuB,KAAK;AAAA,YAC7C,CAAC;AAED,kBAAM,OAAO,IAAI;AACjB,yBAAa,SAAS,MAAM,KAAK;AAAA,UACnC;AAAA,QACF,WAAW,SAAS,SAAS;AAC3B,oBAAU,SAAS,QAAQ,OAAO;AAChC,kBAAM,QAAQ,IAAI,WAAW,SAAS;AAAA,cACpC;AAAA,cACA,SAAS,MAAM;AAAA,YACjB,CAAC;AAED,kBAAM,OAAO,IAAI;AACjB,yBAAa,SAAS,MAAM,KAAK;AAAA,UACnC;AAAA,QACF,WAAW,SAAS,QAAQ;AAC1B,oBAAU,SAAS,SAAS;AAC1B,kBAAM,QAAQ,IAAI,MAAM,MAAM;AAE9B,kBAAM,OAAO,IAAI;AACjB,yBAAa,SAAS,MAAM,KAAK;AAAA,UACnC;AAAA,QACF,OAAO;AACL;AAAA,QACF;AAEA,gBAAQ,oBAAoB,IAAI,CAAC,CAAC,QAAQ,oBAAoB;AAC9D,gBAAQ,SAAS,IAAI;AAErB,YAAI,QAAQ,MAAM;AAChB,eAAK,KAAK,MAAM,OAAO;AAAA,QACzB,OAAO;AACL,eAAK,GAAG,MAAM,OAAO;AAAA,QACvB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,oBAAoB,MAAM,SAAS;AACjC,mBAAW,YAAY,KAAK,UAAU,IAAI,GAAG;AAC3C,cAAI,SAAS,SAAS,MAAM,WAAW,CAAC,SAAS,oBAAoB,GAAG;AACtE,iBAAK,eAAe,MAAM,QAAQ;AAClC;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO,UAAU;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAUA,aAAS,aAAa,UAAU,SAAS,OAAO;AAC9C,UAAI,OAAO,aAAa,YAAY,SAAS,aAAa;AACxD,iBAAS,YAAY,KAAK,UAAU,KAAK;AAAA,MAC3C,OAAO;AACL,iBAAS,KAAK,SAAS,KAAK;AAAA,MAC9B;AAAA,IACF;AAAA;AAAA;;;ACnSA;AAAA;AAAA;AAEA,QAAM,EAAE,WAAW,IAAI;AAYvB,aAAS,KAAK,MAAM,MAAM,MAAM;AAC9B,UAAI,KAAK,IAAI,MAAM,OAAW,MAAK,IAAI,IAAI,CAAC,IAAI;AAAA,UAC3C,MAAK,IAAI,EAAE,KAAK,IAAI;AAAA,IAC3B;AASA,aAAS,MAAM,QAAQ;AACrB,YAAM,SAAS,uBAAO,OAAO,IAAI;AACjC,UAAI,SAAS,uBAAO,OAAO,IAAI;AAC/B,UAAI,eAAe;AACnB,UAAI,aAAa;AACjB,UAAI,WAAW;AACf,UAAI;AACJ,UAAI;AACJ,UAAI,QAAQ;AACZ,UAAI,OAAO;AACX,UAAI,MAAM;AACV,UAAI,IAAI;AAER,aAAO,IAAI,OAAO,QAAQ,KAAK;AAC7B,eAAO,OAAO,WAAW,CAAC;AAE1B,YAAI,kBAAkB,QAAW;AAC/B,cAAI,QAAQ,MAAM,WAAW,IAAI,MAAM,GAAG;AACxC,gBAAI,UAAU,GAAI,SAAQ;AAAA,UAC5B,WACE,MAAM,MACL,SAAS,MAAkB,SAAS,IACrC;AACA,gBAAI,QAAQ,MAAM,UAAU,GAAI,OAAM;AAAA,UACxC,WAAW,SAAS,MAAkB,SAAS,IAAgB;AAC7D,gBAAI,UAAU,IAAI;AAChB,oBAAM,IAAI,YAAY,iCAAiC,CAAC,EAAE;AAAA,YAC5D;AAEA,gBAAI,QAAQ,GAAI,OAAM;AACtB,kBAAM,OAAO,OAAO,MAAM,OAAO,GAAG;AACpC,gBAAI,SAAS,IAAM;AACjB,mBAAK,QAAQ,MAAM,MAAM;AACzB,uBAAS,uBAAO,OAAO,IAAI;AAAA,YAC7B,OAAO;AACL,8BAAgB;AAAA,YAClB;AAEA,oBAAQ,MAAM;AAAA,UAChB,OAAO;AACL,kBAAM,IAAI,YAAY,iCAAiC,CAAC,EAAE;AAAA,UAC5D;AAAA,QACF,WAAW,cAAc,QAAW;AAClC,cAAI,QAAQ,MAAM,WAAW,IAAI,MAAM,GAAG;AACxC,gBAAI,UAAU,GAAI,SAAQ;AAAA,UAC5B,WAAW,SAAS,MAAQ,SAAS,GAAM;AACzC,gBAAI,QAAQ,MAAM,UAAU,GAAI,OAAM;AAAA,UACxC,WAAW,SAAS,MAAQ,SAAS,IAAM;AACzC,gBAAI,UAAU,IAAI;AAChB,oBAAM,IAAI,YAAY,iCAAiC,CAAC,EAAE;AAAA,YAC5D;AAEA,gBAAI,QAAQ,GAAI,OAAM;AACtB,iBAAK,QAAQ,OAAO,MAAM,OAAO,GAAG,GAAG,IAAI;AAC3C,gBAAI,SAAS,IAAM;AACjB,mBAAK,QAAQ,eAAe,MAAM;AAClC,uBAAS,uBAAO,OAAO,IAAI;AAC3B,8BAAgB;AAAA,YAClB;AAEA,oBAAQ,MAAM;AAAA,UAChB,WAAW,SAAS,MAAkB,UAAU,MAAM,QAAQ,IAAI;AAChE,wBAAY,OAAO,MAAM,OAAO,CAAC;AACjC,oBAAQ,MAAM;AAAA,UAChB,OAAO;AACL,kBAAM,IAAI,YAAY,iCAAiC,CAAC,EAAE;AAAA,UAC5D;AAAA,QACF,OAAO;AAML,cAAI,YAAY;AACd,gBAAI,WAAW,IAAI,MAAM,GAAG;AAC1B,oBAAM,IAAI,YAAY,iCAAiC,CAAC,EAAE;AAAA,YAC5D;AACA,gBAAI,UAAU,GAAI,SAAQ;AAAA,qBACjB,CAAC,aAAc,gBAAe;AACvC,yBAAa;AAAA,UACf,WAAW,UAAU;AACnB,gBAAI,WAAW,IAAI,MAAM,GAAG;AAC1B,kBAAI,UAAU,GAAI,SAAQ;AAAA,YAC5B,WAAW,SAAS,MAAkB,UAAU,IAAI;AAClD,yBAAW;AACX,oBAAM;AAAA,YACR,WAAW,SAAS,IAAgB;AAClC,2BAAa;AAAA,YACf,OAAO;AACL,oBAAM,IAAI,YAAY,iCAAiC,CAAC,EAAE;AAAA,YAC5D;AAAA,UACF,WAAW,SAAS,MAAQ,OAAO,WAAW,IAAI,CAAC,MAAM,IAAM;AAC7D,uBAAW;AAAA,UACb,WAAW,QAAQ,MAAM,WAAW,IAAI,MAAM,GAAG;AAC/C,gBAAI,UAAU,GAAI,SAAQ;AAAA,UAC5B,WAAW,UAAU,OAAO,SAAS,MAAQ,SAAS,IAAO;AAC3D,gBAAI,QAAQ,GAAI,OAAM;AAAA,UACxB,WAAW,SAAS,MAAQ,SAAS,IAAM;AACzC,gBAAI,UAAU,IAAI;AAChB,oBAAM,IAAI,YAAY,iCAAiC,CAAC,EAAE;AAAA,YAC5D;AAEA,gBAAI,QAAQ,GAAI,OAAM;AACtB,gBAAI,QAAQ,OAAO,MAAM,OAAO,GAAG;AACnC,gBAAI,cAAc;AAChB,sBAAQ,MAAM,QAAQ,OAAO,EAAE;AAC/B,6BAAe;AAAA,YACjB;AACA,iBAAK,QAAQ,WAAW,KAAK;AAC7B,gBAAI,SAAS,IAAM;AACjB,mBAAK,QAAQ,eAAe,MAAM;AAClC,uBAAS,uBAAO,OAAO,IAAI;AAC3B,8BAAgB;AAAA,YAClB;AAEA,wBAAY;AACZ,oBAAQ,MAAM;AAAA,UAChB,OAAO;AACL,kBAAM,IAAI,YAAY,iCAAiC,CAAC,EAAE;AAAA,UAC5D;AAAA,QACF;AAAA,MACF;AAEA,UAAI,UAAU,MAAM,YAAY,SAAS,MAAQ,SAAS,GAAM;AAC9D,cAAM,IAAI,YAAY,yBAAyB;AAAA,MACjD;AAEA,UAAI,QAAQ,GAAI,OAAM;AACtB,YAAM,QAAQ,OAAO,MAAM,OAAO,GAAG;AACrC,UAAI,kBAAkB,QAAW;AAC/B,aAAK,QAAQ,OAAO,MAAM;AAAA,MAC5B,OAAO;AACL,YAAI,cAAc,QAAW;AAC3B,eAAK,QAAQ,OAAO,IAAI;AAAA,QAC1B,WAAW,cAAc;AACvB,eAAK,QAAQ,WAAW,MAAM,QAAQ,OAAO,EAAE,CAAC;AAAA,QAClD,OAAO;AACL,eAAK,QAAQ,WAAW,KAAK;AAAA,QAC/B;AACA,aAAK,QAAQ,eAAe,MAAM;AAAA,MACpC;AAEA,aAAO;AAAA,IACT;AASA,aAAS,OAAO,YAAY;AAC1B,aAAO,OAAO,KAAK,UAAU,EAC1B,IAAI,CAACC,eAAc;AAClB,YAAI,iBAAiB,WAAWA,UAAS;AACzC,YAAI,CAAC,MAAM,QAAQ,cAAc,EAAG,kBAAiB,CAAC,cAAc;AACpE,eAAO,eACJ,IAAI,CAAC,WAAW;AACf,iBAAO,CAACA,UAAS,EACd;AAAA,YACC,OAAO,KAAK,MAAM,EAAE,IAAI,CAAC,MAAM;AAC7B,kBAAI,SAAS,OAAO,CAAC;AACrB,kBAAI,CAAC,MAAM,QAAQ,MAAM,EAAG,UAAS,CAAC,MAAM;AAC5C,qBAAO,OACJ,IAAI,CAAC,MAAO,MAAM,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,EAAG,EACzC,KAAK,IAAI;AAAA,YACd,CAAC;AAAA,UACH,EACC,KAAK,IAAI;AAAA,QACd,CAAC,EACA,KAAK,IAAI;AAAA,MACd,CAAC,EACA,KAAK,IAAI;AAAA,IACd;AAEA,WAAO,UAAU,EAAE,QAAQ,MAAM;AAAA;AAAA;;;AC1MjC;AAAA;AAAA;AAIA,QAAM,eAAe,UAAQ,QAAQ;AACrC,QAAM,QAAQ,UAAQ,OAAO;AAC7B,QAAM,OAAO,UAAQ,MAAM;AAC3B,QAAM,MAAM,UAAQ,KAAK;AACzB,QAAM,MAAM,UAAQ,KAAK;AACzB,QAAM,EAAE,aAAa,WAAW,IAAI,UAAQ,QAAQ;AACpD,QAAM,EAAE,QAAQ,SAAS,IAAI,UAAQ,QAAQ;AAC7C,QAAM,EAAE,IAAI,IAAI,UAAQ,KAAK;AAE7B,QAAMC,qBAAoB;AAC1B,QAAMC,YAAW;AACjB,QAAMC,UAAS;AACf,QAAM,EAAE,OAAO,IAAI;AAEnB,QAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,IAAI;AACJ,QAAM;AAAA,MACJ,aAAa,EAAE,kBAAkB,oBAAoB;AAAA,IACvD,IAAI;AACJ,QAAM,EAAE,QAAQ,MAAM,IAAI;AAC1B,QAAM,EAAE,SAAS,IAAI;AAErB,QAAM,WAAW,uBAAO,UAAU;AAClC,QAAM,mBAAmB,CAAC,GAAG,EAAE;AAC/B,QAAM,cAAc,CAAC,cAAc,QAAQ,WAAW,QAAQ;AAC9D,QAAM,mBAAmB;AAOzB,QAAMC,aAAN,MAAM,mBAAkB,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQnC,YAAY,SAAS,WAAW,SAAS;AACvC,cAAM;AAEN,aAAK,cAAc,aAAa,CAAC;AACjC,aAAK,aAAa;AAClB,aAAK,sBAAsB;AAC3B,aAAK,kBAAkB;AACvB,aAAK,gBAAgB;AACrB,aAAK,cAAc;AACnB,aAAK,gBAAgB;AACrB,aAAK,cAAc,CAAC;AACpB,aAAK,UAAU;AACf,aAAK,YAAY;AACjB,aAAK,cAAc,WAAU;AAC7B,aAAK,YAAY;AACjB,aAAK,UAAU;AACf,aAAK,UAAU;AAEf,YAAI,YAAY,MAAM;AACpB,eAAK,kBAAkB;AACvB,eAAK,YAAY;AACjB,eAAK,aAAa;AAElB,cAAI,cAAc,QAAW;AAC3B,wBAAY,CAAC;AAAA,UACf,WAAW,CAAC,MAAM,QAAQ,SAAS,GAAG;AACpC,gBAAI,OAAO,cAAc,YAAY,cAAc,MAAM;AACvD,wBAAU;AACV,0BAAY,CAAC;AAAA,YACf,OAAO;AACL,0BAAY,CAAC,SAAS;AAAA,YACxB;AAAA,UACF;AAEA,uBAAa,MAAM,SAAS,WAAW,OAAO;AAAA,QAChD,OAAO;AACL,eAAK,YAAY,QAAQ;AACzB,eAAK,gBAAgB,QAAQ;AAC7B,eAAK,YAAY;AAAA,QACnB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,IAAI,aAAa;AACf,eAAO,KAAK;AAAA,MACd;AAAA,MAEA,IAAI,WAAW,MAAM;AACnB,YAAI,CAAC,aAAa,SAAS,IAAI,EAAG;AAElC,aAAK,cAAc;AAKnB,YAAI,KAAK,UAAW,MAAK,UAAU,cAAc;AAAA,MACnD;AAAA;AAAA;AAAA;AAAA,MAKA,IAAI,iBAAiB;AACnB,YAAI,CAAC,KAAK,QAAS,QAAO,KAAK;AAE/B,eAAO,KAAK,QAAQ,eAAe,SAAS,KAAK,QAAQ;AAAA,MAC3D;AAAA;AAAA;AAAA;AAAA,MAKA,IAAI,aAAa;AACf,eAAO,OAAO,KAAK,KAAK,WAAW,EAAE,KAAK;AAAA,MAC5C;AAAA;AAAA;AAAA;AAAA,MAKA,IAAI,WAAW;AACb,eAAO,KAAK;AAAA,MACd;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,IAAI,UAAU;AACZ,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,IAAI,UAAU;AACZ,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,IAAI,SAAS;AACX,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,IAAI,YAAY;AACd,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,IAAI,WAAW;AACb,eAAO,KAAK;AAAA,MACd;AAAA;AAAA;AAAA;AAAA,MAKA,IAAI,aAAa;AACf,eAAO,KAAK;AAAA,MACd;AAAA;AAAA;AAAA;AAAA,MAKA,IAAI,MAAM;AACR,eAAO,KAAK;AAAA,MACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAkBA,UAAU,QAAQ,MAAM,SAAS;AAC/B,cAAM,WAAW,IAAIF,UAAS;AAAA,UAC5B,wBAAwB,QAAQ;AAAA,UAChC,YAAY,KAAK;AAAA,UACjB,YAAY,KAAK;AAAA,UACjB,UAAU,KAAK;AAAA,UACf,YAAY,QAAQ;AAAA,UACpB,oBAAoB,QAAQ;AAAA,QAC9B,CAAC;AAED,cAAM,SAAS,IAAIC,QAAO,QAAQ,KAAK,aAAa,QAAQ,YAAY;AAExE,aAAK,YAAY;AACjB,aAAK,UAAU;AACf,aAAK,UAAU;AAEf,iBAAS,UAAU,IAAI;AACvB,eAAO,UAAU,IAAI;AACrB,eAAO,UAAU,IAAI;AAErB,iBAAS,GAAG,YAAY,kBAAkB;AAC1C,iBAAS,GAAG,SAAS,eAAe;AACpC,iBAAS,GAAG,SAAS,eAAe;AACpC,iBAAS,GAAG,WAAW,iBAAiB;AACxC,iBAAS,GAAG,QAAQ,cAAc;AAClC,iBAAS,GAAG,QAAQ,cAAc;AAElC,eAAO,UAAU;AAKjB,YAAI,OAAO,WAAY,QAAO,WAAW,CAAC;AAC1C,YAAI,OAAO,WAAY,QAAO,WAAW;AAEzC,YAAI,KAAK,SAAS,EAAG,QAAO,QAAQ,IAAI;AAExC,eAAO,GAAG,SAAS,aAAa;AAChC,eAAO,GAAG,QAAQ,YAAY;AAC9B,eAAO,GAAG,OAAO,WAAW;AAC5B,eAAO,GAAG,SAAS,aAAa;AAEhC,aAAK,cAAc,WAAU;AAC7B,aAAK,KAAK,MAAM;AAAA,MAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,YAAY;AACV,YAAI,CAAC,KAAK,SAAS;AACjB,eAAK,cAAc,WAAU;AAC7B,eAAK,KAAK,SAAS,KAAK,YAAY,KAAK,aAAa;AACtD;AAAA,QACF;AAEA,YAAI,KAAK,YAAYF,mBAAkB,aAAa,GAAG;AACrD,eAAK,YAAYA,mBAAkB,aAAa,EAAE,QAAQ;AAAA,QAC5D;AAEA,aAAK,UAAU,mBAAmB;AAClC,aAAK,cAAc,WAAU;AAC7B,aAAK,KAAK,SAAS,KAAK,YAAY,KAAK,aAAa;AAAA,MACxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAsBA,MAAM,MAAM,MAAM;AAChB,YAAI,KAAK,eAAe,WAAU,OAAQ;AAC1C,YAAI,KAAK,eAAe,WAAU,YAAY;AAC5C,gBAAM,MAAM;AACZ,yBAAe,MAAM,KAAK,MAAM,GAAG;AACnC;AAAA,QACF;AAEA,YAAI,KAAK,eAAe,WAAU,SAAS;AACzC,cACE,KAAK,oBACJ,KAAK,uBAAuB,KAAK,UAAU,eAAe,eAC3D;AACA,iBAAK,QAAQ,IAAI;AAAA,UACnB;AAEA;AAAA,QACF;AAEA,aAAK,cAAc,WAAU;AAC7B,aAAK,QAAQ,MAAM,MAAM,MAAM,CAAC,KAAK,WAAW,CAAC,QAAQ;AAKvD,cAAI,IAAK;AAET,eAAK,kBAAkB;AAEvB,cACE,KAAK,uBACL,KAAK,UAAU,eAAe,cAC9B;AACA,iBAAK,QAAQ,IAAI;AAAA,UACnB;AAAA,QACF,CAAC;AAED,sBAAc,IAAI;AAAA,MACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,QAAQ;AACN,YACE,KAAK,eAAe,WAAU,cAC9B,KAAK,eAAe,WAAU,QAC9B;AACA;AAAA,QACF;AAEA,aAAK,UAAU;AACf,aAAK,QAAQ,MAAM;AAAA,MACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUA,KAAK,MAAM,MAAM,IAAI;AACnB,YAAI,KAAK,eAAe,WAAU,YAAY;AAC5C,gBAAM,IAAI,MAAM,kDAAkD;AAAA,QACpE;AAEA,YAAI,OAAO,SAAS,YAAY;AAC9B,eAAK;AACL,iBAAO,OAAO;AAAA,QAChB,WAAW,OAAO,SAAS,YAAY;AACrC,eAAK;AACL,iBAAO;AAAA,QACT;AAEA,YAAI,OAAO,SAAS,SAAU,QAAO,KAAK,SAAS;AAEnD,YAAI,KAAK,eAAe,WAAU,MAAM;AACtC,yBAAe,MAAM,MAAM,EAAE;AAC7B;AAAA,QACF;AAEA,YAAI,SAAS,OAAW,QAAO,CAAC,KAAK;AACrC,aAAK,QAAQ,KAAK,QAAQ,cAAc,MAAM,EAAE;AAAA,MAClD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUA,KAAK,MAAM,MAAM,IAAI;AACnB,YAAI,KAAK,eAAe,WAAU,YAAY;AAC5C,gBAAM,IAAI,MAAM,kDAAkD;AAAA,QACpE;AAEA,YAAI,OAAO,SAAS,YAAY;AAC9B,eAAK;AACL,iBAAO,OAAO;AAAA,QAChB,WAAW,OAAO,SAAS,YAAY;AACrC,eAAK;AACL,iBAAO;AAAA,QACT;AAEA,YAAI,OAAO,SAAS,SAAU,QAAO,KAAK,SAAS;AAEnD,YAAI,KAAK,eAAe,WAAU,MAAM;AACtC,yBAAe,MAAM,MAAM,EAAE;AAC7B;AAAA,QACF;AAEA,YAAI,SAAS,OAAW,QAAO,CAAC,KAAK;AACrC,aAAK,QAAQ,KAAK,QAAQ,cAAc,MAAM,EAAE;AAAA,MAClD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,SAAS;AACP,YACE,KAAK,eAAe,WAAU,cAC9B,KAAK,eAAe,WAAU,QAC9B;AACA;AAAA,QACF;AAEA,aAAK,UAAU;AACf,YAAI,CAAC,KAAK,UAAU,eAAe,UAAW,MAAK,QAAQ,OAAO;AAAA,MACpE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAiBA,KAAK,MAAM,SAAS,IAAI;AACtB,YAAI,KAAK,eAAe,WAAU,YAAY;AAC5C,gBAAM,IAAI,MAAM,kDAAkD;AAAA,QACpE;AAEA,YAAI,OAAO,YAAY,YAAY;AACjC,eAAK;AACL,oBAAU,CAAC;AAAA,QACb;AAEA,YAAI,OAAO,SAAS,SAAU,QAAO,KAAK,SAAS;AAEnD,YAAI,KAAK,eAAe,WAAU,MAAM;AACtC,yBAAe,MAAM,MAAM,EAAE;AAC7B;AAAA,QACF;AAEA,cAAM,OAAO;AAAA,UACX,QAAQ,OAAO,SAAS;AAAA,UACxB,MAAM,CAAC,KAAK;AAAA,UACZ,UAAU;AAAA,UACV,KAAK;AAAA,UACL,GAAG;AAAA,QACL;AAEA,YAAI,CAAC,KAAK,YAAYA,mBAAkB,aAAa,GAAG;AACtD,eAAK,WAAW;AAAA,QAClB;AAEA,aAAK,QAAQ,KAAK,QAAQ,cAAc,MAAM,EAAE;AAAA,MAClD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,YAAY;AACV,YAAI,KAAK,eAAe,WAAU,OAAQ;AAC1C,YAAI,KAAK,eAAe,WAAU,YAAY;AAC5C,gBAAM,MAAM;AACZ,yBAAe,MAAM,KAAK,MAAM,GAAG;AACnC;AAAA,QACF;AAEA,YAAI,KAAK,SAAS;AAChB,eAAK,cAAc,WAAU;AAC7B,eAAK,QAAQ,QAAQ;AAAA,QACvB;AAAA,MACF;AAAA,IACF;AAMA,WAAO,eAAeG,YAAW,cAAc;AAAA,MAC7C,YAAY;AAAA,MACZ,OAAO,YAAY,QAAQ,YAAY;AAAA,IACzC,CAAC;AAMD,WAAO,eAAeA,WAAU,WAAW,cAAc;AAAA,MACvD,YAAY;AAAA,MACZ,OAAO,YAAY,QAAQ,YAAY;AAAA,IACzC,CAAC;AAMD,WAAO,eAAeA,YAAW,QAAQ;AAAA,MACvC,YAAY;AAAA,MACZ,OAAO,YAAY,QAAQ,MAAM;AAAA,IACnC,CAAC;AAMD,WAAO,eAAeA,WAAU,WAAW,QAAQ;AAAA,MACjD,YAAY;AAAA,MACZ,OAAO,YAAY,QAAQ,MAAM;AAAA,IACnC,CAAC;AAMD,WAAO,eAAeA,YAAW,WAAW;AAAA,MAC1C,YAAY;AAAA,MACZ,OAAO,YAAY,QAAQ,SAAS;AAAA,IACtC,CAAC;AAMD,WAAO,eAAeA,WAAU,WAAW,WAAW;AAAA,MACpD,YAAY;AAAA,MACZ,OAAO,YAAY,QAAQ,SAAS;AAAA,IACtC,CAAC;AAMD,WAAO,eAAeA,YAAW,UAAU;AAAA,MACzC,YAAY;AAAA,MACZ,OAAO,YAAY,QAAQ,QAAQ;AAAA,IACrC,CAAC;AAMD,WAAO,eAAeA,WAAU,WAAW,UAAU;AAAA,MACnD,YAAY;AAAA,MACZ,OAAO,YAAY,QAAQ,QAAQ;AAAA,IACrC,CAAC;AAED;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,QAAQ,CAAC,aAAa;AACtB,aAAO,eAAeA,WAAU,WAAW,UAAU,EAAE,YAAY,KAAK,CAAC;AAAA,IAC3E,CAAC;AAMD,KAAC,QAAQ,SAAS,SAAS,SAAS,EAAE,QAAQ,CAAC,WAAW;AACxD,aAAO,eAAeA,WAAU,WAAW,KAAK,MAAM,IAAI;AAAA,QACxD,YAAY;AAAA,QACZ,MAAM;AACJ,qBAAW,YAAY,KAAK,UAAU,MAAM,GAAG;AAC7C,gBAAI,SAAS,oBAAoB,EAAG,QAAO,SAAS,SAAS;AAAA,UAC/D;AAEA,iBAAO;AAAA,QACT;AAAA,QACA,IAAI,SAAS;AACX,qBAAW,YAAY,KAAK,UAAU,MAAM,GAAG;AAC7C,gBAAI,SAAS,oBAAoB,GAAG;AAClC,mBAAK,eAAe,QAAQ,QAAQ;AACpC;AAAA,YACF;AAAA,UACF;AAEA,cAAI,OAAO,YAAY,WAAY;AAEnC,eAAK,iBAAiB,QAAQ,SAAS;AAAA,YACrC,CAAC,oBAAoB,GAAG;AAAA,UAC1B,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAED,IAAAA,WAAU,UAAU,mBAAmB;AACvC,IAAAA,WAAU,UAAU,sBAAsB;AAE1C,WAAO,UAAUA;AAsCjB,aAAS,aAAa,WAAW,SAAS,WAAW,SAAS;AAC5D,YAAM,OAAO;AAAA,QACX,wBAAwB;AAAA,QACxB,UAAU;AAAA,QACV,cAAc;AAAA,QACd,iBAAiB,iBAAiB,CAAC;AAAA,QACnC,YAAY,MAAM,OAAO;AAAA,QACzB,oBAAoB;AAAA,QACpB,mBAAmB;AAAA,QACnB,iBAAiB;AAAA,QACjB,cAAc;AAAA,QACd,GAAG;AAAA,QACH,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,UAAU;AAAA,QACV,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAEA,gBAAU,YAAY,KAAK;AAC3B,gBAAU,gBAAgB,KAAK;AAE/B,UAAI,CAAC,iBAAiB,SAAS,KAAK,eAAe,GAAG;AACpD,cAAM,IAAI;AAAA,UACR,iCAAiC,KAAK,eAAe,yBAC3B,iBAAiB,KAAK,IAAI,CAAC;AAAA,QACvD;AAAA,MACF;AAEA,UAAI;AAEJ,UAAI,mBAAmB,KAAK;AAC1B,oBAAY;AAAA,MACd,OAAO;AACL,YAAI;AACF,sBAAY,IAAI,IAAI,OAAO;AAAA,QAC7B,QAAQ;AACN,gBAAM,IAAI,YAAY,gBAAgB,OAAO,EAAE;AAAA,QACjD;AAAA,MACF;AAEA,UAAI,UAAU,aAAa,SAAS;AAClC,kBAAU,WAAW;AAAA,MACvB,WAAW,UAAU,aAAa,UAAU;AAC1C,kBAAU,WAAW;AAAA,MACvB;AAEA,gBAAU,OAAO,UAAU;AAE3B,YAAM,WAAW,UAAU,aAAa;AACxC,YAAM,WAAW,UAAU,aAAa;AACxC,UAAI;AAEJ,UAAI,UAAU,aAAa,SAAS,CAAC,YAAY,CAAC,UAAU;AAC1D,4BACE;AAAA,MAEJ,WAAW,YAAY,CAAC,UAAU,UAAU;AAC1C,4BAAoB;AAAA,MACtB,WAAW,UAAU,MAAM;AACzB,4BAAoB;AAAA,MACtB;AAEA,UAAI,mBAAmB;AACrB,cAAM,MAAM,IAAI,YAAY,iBAAiB;AAE7C,YAAI,UAAU,eAAe,GAAG;AAC9B,gBAAM;AAAA,QACR,OAAO;AACL,4BAAkB,WAAW,GAAG;AAChC;AAAA,QACF;AAAA,MACF;AAEA,YAAM,cAAc,WAAW,MAAM;AACrC,YAAM,MAAM,YAAY,EAAE,EAAE,SAAS,QAAQ;AAC7C,YAAM,UAAU,WAAW,MAAM,UAAU,KAAK;AAChD,YAAM,cAAc,oBAAI,IAAI;AAC5B,UAAI;AAEJ,WAAK,mBACH,KAAK,qBAAqB,WAAW,aAAa;AACpD,WAAK,cAAc,KAAK,eAAe;AACvC,WAAK,OAAO,UAAU,QAAQ;AAC9B,WAAK,OAAO,UAAU,SAAS,WAAW,GAAG,IACzC,UAAU,SAAS,MAAM,GAAG,EAAE,IAC9B,UAAU;AACd,WAAK,UAAU;AAAA,QACb,GAAG,KAAK;AAAA,QACR,yBAAyB,KAAK;AAAA,QAC9B,qBAAqB;AAAA,QACrB,YAAY;AAAA,QACZ,SAAS;AAAA,MACX;AACA,WAAK,OAAO,UAAU,WAAW,UAAU;AAC3C,WAAK,UAAU,KAAK;AAEpB,UAAI,KAAK,mBAAmB;AAC1B,4BAAoB,IAAIH,mBAAkB;AAAA,UACxC,GAAG,KAAK;AAAA,UACR,UAAU;AAAA,UACV,YAAY,KAAK;AAAA,QACnB,CAAC;AACD,aAAK,QAAQ,0BAA0B,IAAI,OAAO;AAAA,UAChD,CAACA,mBAAkB,aAAa,GAAG,kBAAkB,MAAM;AAAA,QAC7D,CAAC;AAAA,MACH;AACA,UAAI,UAAU,QAAQ;AACpB,mBAAW,YAAY,WAAW;AAChC,cACE,OAAO,aAAa,YACpB,CAAC,iBAAiB,KAAK,QAAQ,KAC/B,YAAY,IAAI,QAAQ,GACxB;AACA,kBAAM,IAAI;AAAA,cACR;AAAA,YACF;AAAA,UACF;AAEA,sBAAY,IAAI,QAAQ;AAAA,QAC1B;AAEA,aAAK,QAAQ,wBAAwB,IAAI,UAAU,KAAK,GAAG;AAAA,MAC7D;AACA,UAAI,KAAK,QAAQ;AACf,YAAI,KAAK,kBAAkB,IAAI;AAC7B,eAAK,QAAQ,sBAAsB,IAAI,KAAK;AAAA,QAC9C,OAAO;AACL,eAAK,QAAQ,SAAS,KAAK;AAAA,QAC7B;AAAA,MACF;AACA,UAAI,UAAU,YAAY,UAAU,UAAU;AAC5C,aAAK,OAAO,GAAG,UAAU,QAAQ,IAAI,UAAU,QAAQ;AAAA,MACzD;AAEA,UAAI,UAAU;AACZ,cAAM,QAAQ,KAAK,KAAK,MAAM,GAAG;AAEjC,aAAK,aAAa,MAAM,CAAC;AACzB,aAAK,OAAO,MAAM,CAAC;AAAA,MACrB;AAEA,UAAI;AAEJ,UAAI,KAAK,iBAAiB;AACxB,YAAI,UAAU,eAAe,GAAG;AAC9B,oBAAU,eAAe;AACzB,oBAAU,kBAAkB;AAC5B,oBAAU,4BAA4B,WAClC,KAAK,aACL,UAAU;AAEd,gBAAM,UAAU,WAAW,QAAQ;AAMnC,oBAAU,EAAE,GAAG,SAAS,SAAS,CAAC,EAAE;AAEpC,cAAI,SAAS;AACX,uBAAW,CAACI,MAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AAClD,sBAAQ,QAAQA,KAAI,YAAY,CAAC,IAAI;AAAA,YACvC;AAAA,UACF;AAAA,QACF,WAAW,UAAU,cAAc,UAAU,MAAM,GAAG;AACpD,gBAAM,aAAa,WACf,UAAU,eACR,KAAK,eAAe,UAAU,4BAC9B,QACF,UAAU,eACR,QACA,UAAU,SAAS,UAAU;AAEnC,cAAI,CAAC,cAAe,UAAU,mBAAmB,CAAC,UAAW;AAK3D,mBAAO,KAAK,QAAQ;AACpB,mBAAO,KAAK,QAAQ;AAEpB,gBAAI,CAAC,WAAY,QAAO,KAAK,QAAQ;AAErC,iBAAK,OAAO;AAAA,UACd;AAAA,QACF;AAOA,YAAI,KAAK,QAAQ,CAAC,QAAQ,QAAQ,eAAe;AAC/C,kBAAQ,QAAQ,gBACd,WAAW,OAAO,KAAK,KAAK,IAAI,EAAE,SAAS,QAAQ;AAAA,QACvD;AAEA,cAAM,UAAU,OAAO,QAAQ,IAAI;AAEnC,YAAI,UAAU,YAAY;AAUxB,oBAAU,KAAK,YAAY,UAAU,KAAK,GAAG;AAAA,QAC/C;AAAA,MACF,OAAO;AACL,cAAM,UAAU,OAAO,QAAQ,IAAI;AAAA,MACrC;AAEA,UAAI,KAAK,SAAS;AAChB,YAAI,GAAG,WAAW,MAAM;AACtB,yBAAe,WAAW,KAAK,iCAAiC;AAAA,QAClE,CAAC;AAAA,MACH;AAEA,UAAI,GAAG,SAAS,CAAC,QAAQ;AACvB,YAAI,QAAQ,QAAQ,IAAI,QAAQ,EAAG;AAEnC,cAAM,UAAU,OAAO;AACvB,0BAAkB,WAAW,GAAG;AAAA,MAClC,CAAC;AAED,UAAI,GAAG,YAAY,CAAC,QAAQ;AAC1B,cAAM,WAAW,IAAI,QAAQ;AAC7B,cAAM,aAAa,IAAI;AAEvB,YACE,YACA,KAAK,mBACL,cAAc,OACd,aAAa,KACb;AACA,cAAI,EAAE,UAAU,aAAa,KAAK,cAAc;AAC9C,2BAAe,WAAW,KAAK,4BAA4B;AAC3D;AAAA,UACF;AAEA,cAAI,MAAM;AAEV,cAAI;AAEJ,cAAI;AACF,mBAAO,IAAI,IAAI,UAAU,OAAO;AAAA,UAClC,SAAS,GAAG;AACV,kBAAM,MAAM,IAAI,YAAY,gBAAgB,QAAQ,EAAE;AACtD,8BAAkB,WAAW,GAAG;AAChC;AAAA,UACF;AAEA,uBAAa,WAAW,MAAM,WAAW,OAAO;AAAA,QAClD,WAAW,CAAC,UAAU,KAAK,uBAAuB,KAAK,GAAG,GAAG;AAC3D;AAAA,YACE;AAAA,YACA;AAAA,YACA,+BAA+B,IAAI,UAAU;AAAA,UAC/C;AAAA,QACF;AAAA,MACF,CAAC;AAED,UAAI,GAAG,WAAW,CAAC,KAAK,QAAQ,SAAS;AACvC,kBAAU,KAAK,WAAW,GAAG;AAM7B,YAAI,UAAU,eAAeD,WAAU,WAAY;AAEnD,cAAM,UAAU,OAAO;AAEvB,cAAM,UAAU,IAAI,QAAQ;AAE5B,YAAI,YAAY,UAAa,QAAQ,YAAY,MAAM,aAAa;AAClE,yBAAe,WAAW,QAAQ,wBAAwB;AAC1D;AAAA,QACF;AAEA,cAAM,SAAS,WAAW,MAAM,EAC7B,OAAO,MAAM,IAAI,EACjB,OAAO,QAAQ;AAElB,YAAI,IAAI,QAAQ,sBAAsB,MAAM,QAAQ;AAClD,yBAAe,WAAW,QAAQ,qCAAqC;AACvE;AAAA,QACF;AAEA,cAAM,aAAa,IAAI,QAAQ,wBAAwB;AACvD,YAAI;AAEJ,YAAI,eAAe,QAAW;AAC5B,cAAI,CAAC,YAAY,MAAM;AACrB,wBAAY;AAAA,UACd,WAAW,CAAC,YAAY,IAAI,UAAU,GAAG;AACvC,wBAAY;AAAA,UACd;AAAA,QACF,WAAW,YAAY,MAAM;AAC3B,sBAAY;AAAA,QACd;AAEA,YAAI,WAAW;AACb,yBAAe,WAAW,QAAQ,SAAS;AAC3C;AAAA,QACF;AAEA,YAAI,WAAY,WAAU,YAAY;AAEtC,cAAM,yBAAyB,IAAI,QAAQ,0BAA0B;AAErE,YAAI,2BAA2B,QAAW;AACxC,cAAI,CAAC,mBAAmB;AACtB,kBAAM,UACJ;AAEF,2BAAe,WAAW,QAAQ,OAAO;AACzC;AAAA,UACF;AAEA,cAAI;AAEJ,cAAI;AACF,yBAAa,MAAM,sBAAsB;AAAA,UAC3C,SAAS,KAAK;AACZ,kBAAM,UAAU;AAChB,2BAAe,WAAW,QAAQ,OAAO;AACzC;AAAA,UACF;AAEA,gBAAM,iBAAiB,OAAO,KAAK,UAAU;AAE7C,cACE,eAAe,WAAW,KAC1B,eAAe,CAAC,MAAMH,mBAAkB,eACxC;AACA,kBAAM,UAAU;AAChB,2BAAe,WAAW,QAAQ,OAAO;AACzC;AAAA,UACF;AAEA,cAAI;AACF,8BAAkB,OAAO,WAAWA,mBAAkB,aAAa,CAAC;AAAA,UACtE,SAAS,KAAK;AACZ,kBAAM,UAAU;AAChB,2BAAe,WAAW,QAAQ,OAAO;AACzC;AAAA,UACF;AAEA,oBAAU,YAAYA,mBAAkB,aAAa,IACnD;AAAA,QACJ;AAEA,kBAAU,UAAU,QAAQ,MAAM;AAAA,UAChC,wBAAwB,KAAK;AAAA,UAC7B,cAAc,KAAK;AAAA,UACnB,YAAY,KAAK;AAAA,UACjB,oBAAoB,KAAK;AAAA,QAC3B,CAAC;AAAA,MACH,CAAC;AAED,UAAI,KAAK,eAAe;AACtB,aAAK,cAAc,KAAK,SAAS;AAAA,MACnC,OAAO;AACL,YAAI,IAAI;AAAA,MACV;AAAA,IACF;AASA,aAAS,kBAAkB,WAAW,KAAK;AACzC,gBAAU,cAAcG,WAAU;AAKlC,gBAAU,gBAAgB;AAC1B,gBAAU,KAAK,SAAS,GAAG;AAC3B,gBAAU,UAAU;AAAA,IACtB;AASA,aAAS,WAAW,SAAS;AAC3B,cAAQ,OAAO,QAAQ;AACvB,aAAO,IAAI,QAAQ,OAAO;AAAA,IAC5B;AASA,aAAS,WAAW,SAAS;AAC3B,cAAQ,OAAO;AAEf,UAAI,CAAC,QAAQ,cAAc,QAAQ,eAAe,IAAI;AACpD,gBAAQ,aAAa,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,QAAQ;AAAA,MAC7D;AAEA,aAAO,IAAI,QAAQ,OAAO;AAAA,IAC5B;AAWA,aAAS,eAAe,WAAW,QAAQ,SAAS;AAClD,gBAAU,cAAcA,WAAU;AAElC,YAAM,MAAM,IAAI,MAAM,OAAO;AAC7B,YAAM,kBAAkB,KAAK,cAAc;AAE3C,UAAI,OAAO,WAAW;AACpB,eAAO,QAAQ,IAAI;AACnB,eAAO,MAAM;AAEb,YAAI,OAAO,UAAU,CAAC,OAAO,OAAO,WAAW;AAM7C,iBAAO,OAAO,QAAQ;AAAA,QACxB;AAEA,gBAAQ,SAAS,mBAAmB,WAAW,GAAG;AAAA,MACpD,OAAO;AACL,eAAO,QAAQ,GAAG;AAClB,eAAO,KAAK,SAAS,UAAU,KAAK,KAAK,WAAW,OAAO,CAAC;AAC5D,eAAO,KAAK,SAAS,UAAU,UAAU,KAAK,SAAS,CAAC;AAAA,MAC1D;AAAA,IACF;AAWA,aAAS,eAAe,WAAW,MAAM,IAAI;AAC3C,UAAI,MAAM;AACR,cAAM,SAAS,OAAO,IAAI,IAAI,KAAK,OAAO,SAAS,IAAI,EAAE;AAQzD,YAAI,UAAU,QAAS,WAAU,QAAQ,kBAAkB;AAAA,YACtD,WAAU,mBAAmB;AAAA,MACpC;AAEA,UAAI,IAAI;AACN,cAAM,MAAM,IAAI;AAAA,UACd,qCAAqC,UAAU,UAAU,KACnD,YAAY,UAAU,UAAU,CAAC;AAAA,QACzC;AACA,gBAAQ,SAAS,IAAI,GAAG;AAAA,MAC1B;AAAA,IACF;AASA,aAAS,mBAAmB,MAAM,QAAQ;AACxC,YAAM,YAAY,KAAK,UAAU;AAEjC,gBAAU,sBAAsB;AAChC,gBAAU,gBAAgB;AAC1B,gBAAU,aAAa;AAEvB,UAAI,UAAU,QAAQ,UAAU,MAAM,OAAW;AAEjD,gBAAU,QAAQ,eAAe,QAAQ,YAAY;AACrD,cAAQ,SAAS,QAAQ,UAAU,OAAO;AAE1C,UAAI,SAAS,KAAM,WAAU,MAAM;AAAA,UAC9B,WAAU,MAAM,MAAM,MAAM;AAAA,IACnC;AAOA,aAAS,kBAAkB;AACzB,YAAM,YAAY,KAAK,UAAU;AAEjC,UAAI,CAAC,UAAU,SAAU,WAAU,QAAQ,OAAO;AAAA,IACpD;AAQA,aAAS,gBAAgB,KAAK;AAC5B,YAAM,YAAY,KAAK,UAAU;AAEjC,UAAI,UAAU,QAAQ,UAAU,MAAM,QAAW;AAC/C,kBAAU,QAAQ,eAAe,QAAQ,YAAY;AAMrD,gBAAQ,SAAS,QAAQ,UAAU,OAAO;AAE1C,kBAAU,MAAM,IAAI,WAAW,CAAC;AAAA,MAClC;AAEA,UAAI,CAAC,UAAU,eAAe;AAC5B,kBAAU,gBAAgB;AAC1B,kBAAU,KAAK,SAAS,GAAG;AAAA,MAC7B;AAAA,IACF;AAOA,aAAS,mBAAmB;AAC1B,WAAK,UAAU,EAAE,UAAU;AAAA,IAC7B;AASA,aAAS,kBAAkB,MAAM,UAAU;AACzC,WAAK,UAAU,EAAE,KAAK,WAAW,MAAM,QAAQ;AAAA,IACjD;AAQA,aAAS,eAAe,MAAM;AAC5B,YAAM,YAAY,KAAK,UAAU;AAEjC,UAAI,UAAU,UAAW,WAAU,KAAK,MAAM,CAAC,KAAK,WAAW,IAAI;AACnE,gBAAU,KAAK,QAAQ,IAAI;AAAA,IAC7B;AAQA,aAAS,eAAe,MAAM;AAC5B,WAAK,UAAU,EAAE,KAAK,QAAQ,IAAI;AAAA,IACpC;AAQA,aAAS,OAAO,QAAQ;AACtB,aAAO,OAAO;AAAA,IAChB;AAQA,aAAS,cAAc,KAAK;AAC1B,YAAM,YAAY,KAAK,UAAU;AAEjC,UAAI,UAAU,eAAeA,WAAU,OAAQ;AAC/C,UAAI,UAAU,eAAeA,WAAU,MAAM;AAC3C,kBAAU,cAAcA,WAAU;AAClC,sBAAc,SAAS;AAAA,MACzB;AAOA,WAAK,QAAQ,IAAI;AAEjB,UAAI,CAAC,UAAU,eAAe;AAC5B,kBAAU,gBAAgB;AAC1B,kBAAU,KAAK,SAAS,GAAG;AAAA,MAC7B;AAAA,IACF;AAQA,aAAS,cAAc,WAAW;AAChC,gBAAU,cAAc;AAAA,QACtB,UAAU,QAAQ,QAAQ,KAAK,UAAU,OAAO;AAAA,QAChD,UAAU;AAAA,MACZ;AAAA,IACF;AAOA,aAAS,gBAAgB;AACvB,YAAM,YAAY,KAAK,UAAU;AAEjC,WAAK,eAAe,SAAS,aAAa;AAC1C,WAAK,eAAe,QAAQ,YAAY;AACxC,WAAK,eAAe,OAAO,WAAW;AAEtC,gBAAU,cAAcA,WAAU;AAWlC,UACE,CAAC,KAAK,eAAe,cACrB,CAAC,UAAU,uBACX,CAAC,UAAU,UAAU,eAAe,gBACpC,KAAK,eAAe,WAAW,GAC/B;AACA,cAAM,QAAQ,KAAK,KAAK,KAAK,eAAe,MAAM;AAElD,kBAAU,UAAU,MAAM,KAAK;AAAA,MACjC;AAEA,gBAAU,UAAU,IAAI;AAExB,WAAK,UAAU,IAAI;AAEnB,mBAAa,UAAU,WAAW;AAElC,UACE,UAAU,UAAU,eAAe,YACnC,UAAU,UAAU,eAAe,cACnC;AACA,kBAAU,UAAU;AAAA,MACtB,OAAO;AACL,kBAAU,UAAU,GAAG,SAAS,gBAAgB;AAChD,kBAAU,UAAU,GAAG,UAAU,gBAAgB;AAAA,MACnD;AAAA,IACF;AAQA,aAAS,aAAa,OAAO;AAC3B,UAAI,CAAC,KAAK,UAAU,EAAE,UAAU,MAAM,KAAK,GAAG;AAC5C,aAAK,MAAM;AAAA,MACb;AAAA,IACF;AAOA,aAAS,cAAc;AACrB,YAAM,YAAY,KAAK,UAAU;AAEjC,gBAAU,cAAcA,WAAU;AAClC,gBAAU,UAAU,IAAI;AACxB,WAAK,IAAI;AAAA,IACX;AAOA,aAAS,gBAAgB;AACvB,YAAM,YAAY,KAAK,UAAU;AAEjC,WAAK,eAAe,SAAS,aAAa;AAC1C,WAAK,GAAG,SAAS,IAAI;AAErB,UAAI,WAAW;AACb,kBAAU,cAAcA,WAAU;AAClC,aAAK,QAAQ;AAAA,MACf;AAAA,IACF;AAAA;AAAA;;;ACh3CA;AAAA;AAAA;AAGA,QAAME,aAAY;AAClB,QAAM,EAAE,OAAO,IAAI,UAAQ,QAAQ;AAQnC,aAAS,UAAU,QAAQ;AACzB,aAAO,KAAK,OAAO;AAAA,IACrB;AAOA,aAAS,cAAc;AACrB,UAAI,CAAC,KAAK,aAAa,KAAK,eAAe,UAAU;AACnD,aAAK,QAAQ;AAAA,MACf;AAAA,IACF;AAQA,aAAS,cAAc,KAAK;AAC1B,WAAK,eAAe,SAAS,aAAa;AAC1C,WAAK,QAAQ;AACb,UAAI,KAAK,cAAc,OAAO,MAAM,GAAG;AAErC,aAAK,KAAK,SAAS,GAAG;AAAA,MACxB;AAAA,IACF;AAUA,aAASC,uBAAsB,IAAI,SAAS;AAC1C,UAAI,qBAAqB;AAEzB,YAAM,SAAS,IAAI,OAAO;AAAA,QACxB,GAAG;AAAA,QACH,aAAa;AAAA,QACb,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,oBAAoB;AAAA,MACtB,CAAC;AAED,SAAG,GAAG,WAAW,SAAS,QAAQ,KAAK,UAAU;AAC/C,cAAM,OACJ,CAAC,YAAY,OAAO,eAAe,aAAa,IAAI,SAAS,IAAI;AAEnE,YAAI,CAAC,OAAO,KAAK,IAAI,EAAG,IAAG,MAAM;AAAA,MACnC,CAAC;AAED,SAAG,KAAK,SAAS,SAAS,MAAM,KAAK;AACnC,YAAI,OAAO,UAAW;AAWtB,6BAAqB;AACrB,eAAO,QAAQ,GAAG;AAAA,MACpB,CAAC;AAED,SAAG,KAAK,SAAS,SAAS,QAAQ;AAChC,YAAI,OAAO,UAAW;AAEtB,eAAO,KAAK,IAAI;AAAA,MAClB,CAAC;AAED,aAAO,WAAW,SAAU,KAAK,UAAU;AACzC,YAAI,GAAG,eAAe,GAAG,QAAQ;AAC/B,mBAAS,GAAG;AACZ,kBAAQ,SAAS,WAAW,MAAM;AAClC;AAAA,QACF;AAEA,YAAI,SAAS;AAEb,WAAG,KAAK,SAAS,SAAS,MAAMC,MAAK;AACnC,mBAAS;AACT,mBAASA,IAAG;AAAA,QACd,CAAC;AAED,WAAG,KAAK,SAAS,SAAS,QAAQ;AAChC,cAAI,CAAC,OAAQ,UAAS,GAAG;AACzB,kBAAQ,SAAS,WAAW,MAAM;AAAA,QACpC,CAAC;AAED,YAAI,mBAAoB,IAAG,UAAU;AAAA,MACvC;AAEA,aAAO,SAAS,SAAU,UAAU;AAClC,YAAI,GAAG,eAAe,GAAG,YAAY;AACnC,aAAG,KAAK,QAAQ,SAAS,OAAO;AAC9B,mBAAO,OAAO,QAAQ;AAAA,UACxB,CAAC;AACD;AAAA,QACF;AAMA,YAAI,GAAG,YAAY,KAAM;AAEzB,YAAI,GAAG,QAAQ,eAAe,UAAU;AACtC,mBAAS;AACT,cAAI,OAAO,eAAe,WAAY,QAAO,QAAQ;AAAA,QACvD,OAAO;AACL,aAAG,QAAQ,KAAK,UAAU,SAAS,SAAS;AAI1C,qBAAS;AAAA,UACX,CAAC;AACD,aAAG,MAAM;AAAA,QACX;AAAA,MACF;AAEA,aAAO,QAAQ,WAAY;AACzB,YAAI,GAAG,SAAU,IAAG,OAAO;AAAA,MAC7B;AAEA,aAAO,SAAS,SAAU,OAAO,UAAU,UAAU;AACnD,YAAI,GAAG,eAAe,GAAG,YAAY;AACnC,aAAG,KAAK,QAAQ,SAAS,OAAO;AAC9B,mBAAO,OAAO,OAAO,UAAU,QAAQ;AAAA,UACzC,CAAC;AACD;AAAA,QACF;AAEA,WAAG,KAAK,OAAO,QAAQ;AAAA,MACzB;AAEA,aAAO,GAAG,OAAO,WAAW;AAC5B,aAAO,GAAG,SAAS,aAAa;AAChC,aAAO;AAAA,IACT;AAEA,WAAO,UAAUD;AAAA;AAAA;;;AChKjB;AAAA;AAAA;AAEA,QAAM,EAAE,WAAW,IAAI;AASvB,aAAS,MAAM,QAAQ;AACrB,YAAM,YAAY,oBAAI,IAAI;AAC1B,UAAI,QAAQ;AACZ,UAAI,MAAM;AACV,UAAI,IAAI;AAER,WAAK,GAAG,IAAI,OAAO,QAAQ,KAAK;AAC9B,cAAM,OAAO,OAAO,WAAW,CAAC;AAEhC,YAAI,QAAQ,MAAM,WAAW,IAAI,MAAM,GAAG;AACxC,cAAI,UAAU,GAAI,SAAQ;AAAA,QAC5B,WACE,MAAM,MACL,SAAS,MAAkB,SAAS,IACrC;AACA,cAAI,QAAQ,MAAM,UAAU,GAAI,OAAM;AAAA,QACxC,WAAW,SAAS,IAAgB;AAClC,cAAI,UAAU,IAAI;AAChB,kBAAM,IAAI,YAAY,iCAAiC,CAAC,EAAE;AAAA,UAC5D;AAEA,cAAI,QAAQ,GAAI,OAAM;AAEtB,gBAAME,YAAW,OAAO,MAAM,OAAO,GAAG;AAExC,cAAI,UAAU,IAAIA,SAAQ,GAAG;AAC3B,kBAAM,IAAI,YAAY,QAAQA,SAAQ,6BAA6B;AAAA,UACrE;AAEA,oBAAU,IAAIA,SAAQ;AACtB,kBAAQ,MAAM;AAAA,QAChB,OAAO;AACL,gBAAM,IAAI,YAAY,iCAAiC,CAAC,EAAE;AAAA,QAC5D;AAAA,MACF;AAEA,UAAI,UAAU,MAAM,QAAQ,IAAI;AAC9B,cAAM,IAAI,YAAY,yBAAyB;AAAA,MACjD;AAEA,YAAM,WAAW,OAAO,MAAM,OAAO,CAAC;AAEtC,UAAI,UAAU,IAAI,QAAQ,GAAG;AAC3B,cAAM,IAAI,YAAY,QAAQ,QAAQ,6BAA6B;AAAA,MACrE;AAEA,gBAAU,IAAI,QAAQ;AACtB,aAAO;AAAA,IACT;AAEA,WAAO,UAAU,EAAE,MAAM;AAAA;AAAA;;;AC7DzB;AAAA;AAAA;AAIA,QAAM,eAAe,UAAQ,QAAQ;AACrC,QAAM,OAAO,UAAQ,MAAM;AAC3B,QAAM,EAAE,OAAO,IAAI,UAAQ,QAAQ;AACnC,QAAM,EAAE,WAAW,IAAI,UAAQ,QAAQ;AAEvC,QAAMC,aAAY;AAClB,QAAMC,qBAAoB;AAC1B,QAAMC,eAAc;AACpB,QAAMC,aAAY;AAClB,QAAM,EAAE,eAAe,MAAM,WAAW,IAAI;AAE5C,QAAM,WAAW;AAEjB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,SAAS;AAOf,QAAMC,mBAAN,cAA8B,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,MAmCzC,YAAY,SAAS,UAAU;AAC7B,cAAM;AAEN,kBAAU;AAAA,UACR,wBAAwB;AAAA,UACxB,UAAU;AAAA,UACV,YAAY,MAAM,OAAO;AAAA,UACzB,oBAAoB;AAAA,UACpB,mBAAmB;AAAA,UACnB,iBAAiB;AAAA,UACjB,gBAAgB;AAAA,UAChB,cAAc;AAAA,UACd,cAAc;AAAA,UACd,UAAU;AAAA,UACV,SAAS;AAAA;AAAA,UACT,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,UACN,WAAAD;AAAA,UACA,GAAG;AAAA,QACL;AAEA,YACG,QAAQ,QAAQ,QAAQ,CAAC,QAAQ,UAAU,CAAC,QAAQ,YACpD,QAAQ,QAAQ,SAAS,QAAQ,UAAU,QAAQ,aACnD,QAAQ,UAAU,QAAQ,UAC3B;AACA,gBAAM,IAAI;AAAA,YACR;AAAA,UAEF;AAAA,QACF;AAEA,YAAI,QAAQ,QAAQ,MAAM;AACxB,eAAK,UAAU,KAAK,aAAa,CAAC,KAAK,QAAQ;AAC7C,kBAAM,OAAO,KAAK,aAAa,GAAG;AAElC,gBAAI,UAAU,KAAK;AAAA,cACjB,kBAAkB,KAAK;AAAA,cACvB,gBAAgB;AAAA,YAClB,CAAC;AACD,gBAAI,IAAI,IAAI;AAAA,UACd,CAAC;AACD,eAAK,QAAQ;AAAA,YACX,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR;AAAA,UACF;AAAA,QACF,WAAW,QAAQ,QAAQ;AACzB,eAAK,UAAU,QAAQ;AAAA,QACzB;AAEA,YAAI,KAAK,SAAS;AAChB,gBAAM,iBAAiB,KAAK,KAAK,KAAK,MAAM,YAAY;AAExD,eAAK,mBAAmB,aAAa,KAAK,SAAS;AAAA,YACjD,WAAW,KAAK,KAAK,KAAK,MAAM,WAAW;AAAA,YAC3C,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO;AAAA,YACnC,SAAS,CAAC,KAAK,QAAQ,SAAS;AAC9B,mBAAK,cAAc,KAAK,QAAQ,MAAM,cAAc;AAAA,YACtD;AAAA,UACF,CAAC;AAAA,QACH;AAEA,YAAI,QAAQ,sBAAsB,KAAM,SAAQ,oBAAoB,CAAC;AACrE,YAAI,QAAQ,gBAAgB;AAC1B,eAAK,UAAU,oBAAI,IAAI;AACvB,eAAK,mBAAmB;AAAA,QAC1B;AAEA,aAAK,UAAU;AACf,aAAK,SAAS;AAAA,MAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAWA,UAAU;AACR,YAAI,KAAK,QAAQ,UAAU;AACzB,gBAAM,IAAI,MAAM,4CAA4C;AAAA,QAC9D;AAEA,YAAI,CAAC,KAAK,QAAS,QAAO;AAC1B,eAAO,KAAK,QAAQ,QAAQ;AAAA,MAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,MAAM,IAAI;AACR,YAAI,KAAK,WAAW,QAAQ;AAC1B,cAAI,IAAI;AACN,iBAAK,KAAK,SAAS,MAAM;AACvB,iBAAG,IAAI,MAAM,2BAA2B,CAAC;AAAA,YAC3C,CAAC;AAAA,UACH;AAEA,kBAAQ,SAAS,WAAW,IAAI;AAChC;AAAA,QACF;AAEA,YAAI,GAAI,MAAK,KAAK,SAAS,EAAE;AAE7B,YAAI,KAAK,WAAW,QAAS;AAC7B,aAAK,SAAS;AAEd,YAAI,KAAK,QAAQ,YAAY,KAAK,QAAQ,QAAQ;AAChD,cAAI,KAAK,SAAS;AAChB,iBAAK,iBAAiB;AACtB,iBAAK,mBAAmB,KAAK,UAAU;AAAA,UACzC;AAEA,cAAI,KAAK,SAAS;AAChB,gBAAI,CAAC,KAAK,QAAQ,MAAM;AACtB,sBAAQ,SAAS,WAAW,IAAI;AAAA,YAClC,OAAO;AACL,mBAAK,mBAAmB;AAAA,YAC1B;AAAA,UACF,OAAO;AACL,oBAAQ,SAAS,WAAW,IAAI;AAAA,UAClC;AAAA,QACF,OAAO;AACL,gBAAM,SAAS,KAAK;AAEpB,eAAK,iBAAiB;AACtB,eAAK,mBAAmB,KAAK,UAAU;AAMvC,iBAAO,MAAM,MAAM;AACjB,sBAAU,IAAI;AAAA,UAChB,CAAC;AAAA,QACH;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,aAAa,KAAK;AAChB,YAAI,KAAK,QAAQ,MAAM;AACrB,gBAAM,QAAQ,IAAI,IAAI,QAAQ,GAAG;AACjC,gBAAM,WAAW,UAAU,KAAK,IAAI,IAAI,MAAM,GAAG,KAAK,IAAI,IAAI;AAE9D,cAAI,aAAa,KAAK,QAAQ,KAAM,QAAO;AAAA,QAC7C;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAWA,cAAc,KAAK,QAAQ,MAAM,IAAI;AACnC,eAAO,GAAG,SAAS,aAAa;AAEhC,cAAM,MAAM,IAAI,QAAQ,mBAAmB;AAC3C,cAAM,UAAU,IAAI,QAAQ;AAC5B,cAAM,UAAU,CAAC,IAAI,QAAQ,uBAAuB;AAEpD,YAAI,IAAI,WAAW,OAAO;AACxB,gBAAM,UAAU;AAChB,4CAAkC,MAAM,KAAK,QAAQ,KAAK,OAAO;AACjE;AAAA,QACF;AAEA,YAAI,YAAY,UAAa,QAAQ,YAAY,MAAM,aAAa;AAClE,gBAAM,UAAU;AAChB,4CAAkC,MAAM,KAAK,QAAQ,KAAK,OAAO;AACjE;AAAA,QACF;AAEA,YAAI,QAAQ,UAAa,CAAC,SAAS,KAAK,GAAG,GAAG;AAC5C,gBAAM,UAAU;AAChB,4CAAkC,MAAM,KAAK,QAAQ,KAAK,OAAO;AACjE;AAAA,QACF;AAEA,YAAI,YAAY,MAAM,YAAY,GAAG;AACnC,gBAAM,UAAU;AAChB,4CAAkC,MAAM,KAAK,QAAQ,KAAK,SAAS;AAAA,YACjE,yBAAyB;AAAA,UAC3B,CAAC;AACD;AAAA,QACF;AAEA,YAAI,CAAC,KAAK,aAAa,GAAG,GAAG;AAC3B,yBAAe,QAAQ,GAAG;AAC1B;AAAA,QACF;AAEA,cAAM,uBAAuB,IAAI,QAAQ,wBAAwB;AACjE,YAAI,YAAY,oBAAI,IAAI;AAExB,YAAI,yBAAyB,QAAW;AACtC,cAAI;AACF,wBAAYD,aAAY,MAAM,oBAAoB;AAAA,UACpD,SAAS,KAAK;AACZ,kBAAM,UAAU;AAChB,8CAAkC,MAAM,KAAK,QAAQ,KAAK,OAAO;AACjE;AAAA,UACF;AAAA,QACF;AAEA,cAAM,yBAAyB,IAAI,QAAQ,0BAA0B;AACrE,cAAM,aAAa,CAAC;AAEpB,YACE,KAAK,QAAQ,qBACb,2BAA2B,QAC3B;AACA,gBAAM,oBAAoB,IAAID,mBAAkB;AAAA,YAC9C,GAAG,KAAK,QAAQ;AAAA,YAChB,UAAU;AAAA,YACV,YAAY,KAAK,QAAQ;AAAA,UAC3B,CAAC;AAED,cAAI;AACF,kBAAM,SAASD,WAAU,MAAM,sBAAsB;AAErD,gBAAI,OAAOC,mBAAkB,aAAa,GAAG;AAC3C,gCAAkB,OAAO,OAAOA,mBAAkB,aAAa,CAAC;AAChE,yBAAWA,mBAAkB,aAAa,IAAI;AAAA,YAChD;AAAA,UACF,SAAS,KAAK;AACZ,kBAAM,UACJ;AACF,8CAAkC,MAAM,KAAK,QAAQ,KAAK,OAAO;AACjE;AAAA,UACF;AAAA,QACF;AAKA,YAAI,KAAK,QAAQ,cAAc;AAC7B,gBAAM,OAAO;AAAA,YACX,QACE,IAAI,QAAQ,GAAG,YAAY,IAAI,yBAAyB,QAAQ,EAAE;AAAA,YACpE,QAAQ,CAAC,EAAE,IAAI,OAAO,cAAc,IAAI,OAAO;AAAA,YAC/C;AAAA,UACF;AAEA,cAAI,KAAK,QAAQ,aAAa,WAAW,GAAG;AAC1C,iBAAK,QAAQ,aAAa,MAAM,CAAC,UAAU,MAAM,SAAS,YAAY;AACpE,kBAAI,CAAC,UAAU;AACb,uBAAO,eAAe,QAAQ,QAAQ,KAAK,SAAS,OAAO;AAAA,cAC7D;AAEA,mBAAK;AAAA,gBACH;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,cACF;AAAA,YACF,CAAC;AACD;AAAA,UACF;AAEA,cAAI,CAAC,KAAK,QAAQ,aAAa,IAAI,EAAG,QAAO,eAAe,QAAQ,GAAG;AAAA,QACzE;AAEA,aAAK,gBAAgB,YAAY,KAAK,WAAW,KAAK,QAAQ,MAAM,EAAE;AAAA,MACxE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAeA,gBAAgB,YAAY,KAAK,WAAW,KAAK,QAAQ,MAAM,IAAI;AAIjE,YAAI,CAAC,OAAO,YAAY,CAAC,OAAO,SAAU,QAAO,OAAO,QAAQ;AAEhE,YAAI,OAAO,UAAU,GAAG;AACtB,gBAAM,IAAI;AAAA,YACR;AAAA,UAEF;AAAA,QACF;AAEA,YAAI,KAAK,SAAS,QAAS,QAAO,eAAe,QAAQ,GAAG;AAE5D,cAAM,SAAS,WAAW,MAAM,EAC7B,OAAO,MAAM,IAAI,EACjB,OAAO,QAAQ;AAElB,cAAM,UAAU;AAAA,UACd;AAAA,UACA;AAAA,UACA;AAAA,UACA,yBAAyB,MAAM;AAAA,QACjC;AAEA,cAAM,KAAK,IAAI,KAAK,QAAQ,UAAU,MAAM,QAAW,KAAK,OAAO;AAEnE,YAAI,UAAU,MAAM;AAIlB,gBAAM,WAAW,KAAK,QAAQ,kBAC1B,KAAK,QAAQ,gBAAgB,WAAW,GAAG,IAC3C,UAAU,OAAO,EAAE,KAAK,EAAE;AAE9B,cAAI,UAAU;AACZ,oBAAQ,KAAK,2BAA2B,QAAQ,EAAE;AAClD,eAAG,YAAY;AAAA,UACjB;AAAA,QACF;AAEA,YAAI,WAAWA,mBAAkB,aAAa,GAAG;AAC/C,gBAAM,SAAS,WAAWA,mBAAkB,aAAa,EAAE;AAC3D,gBAAM,QAAQD,WAAU,OAAO;AAAA,YAC7B,CAACC,mBAAkB,aAAa,GAAG,CAAC,MAAM;AAAA,UAC5C,CAAC;AACD,kBAAQ,KAAK,6BAA6B,KAAK,EAAE;AACjD,aAAG,cAAc;AAAA,QACnB;AAKA,aAAK,KAAK,WAAW,SAAS,GAAG;AAEjC,eAAO,MAAM,QAAQ,OAAO,MAAM,EAAE,KAAK,MAAM,CAAC;AAChD,eAAO,eAAe,SAAS,aAAa;AAE5C,WAAG,UAAU,QAAQ,MAAM;AAAA,UACzB,wBAAwB,KAAK,QAAQ;AAAA,UACrC,YAAY,KAAK,QAAQ;AAAA,UACzB,oBAAoB,KAAK,QAAQ;AAAA,QACnC,CAAC;AAED,YAAI,KAAK,SAAS;AAChB,eAAK,QAAQ,IAAI,EAAE;AACnB,aAAG,GAAG,SAAS,MAAM;AACnB,iBAAK,QAAQ,OAAO,EAAE;AAEtB,gBAAI,KAAK,oBAAoB,CAAC,KAAK,QAAQ,MAAM;AAC/C,sBAAQ,SAAS,WAAW,IAAI;AAAA,YAClC;AAAA,UACF,CAAC;AAAA,QACH;AAEA,WAAG,IAAI,GAAG;AAAA,MACZ;AAAA,IACF;AAEA,WAAO,UAAUG;AAYjB,aAAS,aAAa,QAAQ,KAAK;AACjC,iBAAW,SAAS,OAAO,KAAK,GAAG,EAAG,QAAO,GAAG,OAAO,IAAI,KAAK,CAAC;AAEjE,aAAO,SAAS,kBAAkB;AAChC,mBAAW,SAAS,OAAO,KAAK,GAAG,GAAG;AACpC,iBAAO,eAAe,OAAO,IAAI,KAAK,CAAC;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AAQA,aAAS,UAAU,QAAQ;AACzB,aAAO,SAAS;AAChB,aAAO,KAAK,OAAO;AAAA,IACrB;AAOA,aAAS,gBAAgB;AACvB,WAAK,QAAQ;AAAA,IACf;AAWA,aAAS,eAAe,QAAQ,MAAM,SAAS,SAAS;AAStD,gBAAU,WAAW,KAAK,aAAa,IAAI;AAC3C,gBAAU;AAAA,QACR,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,kBAAkB,OAAO,WAAW,OAAO;AAAA,QAC3C,GAAG;AAAA,MACL;AAEA,aAAO,KAAK,UAAU,OAAO,OAAO;AAEpC,aAAO;AAAA,QACL,YAAY,IAAI,IAAI,KAAK,aAAa,IAAI,CAAC;AAAA,IACzC,OAAO,KAAK,OAAO,EAChB,IAAI,CAAC,MAAM,GAAG,CAAC,KAAK,QAAQ,CAAC,CAAC,EAAE,EAChC,KAAK,MAAM,IACd,aACA;AAAA,MACJ;AAAA,IACF;AAcA,aAAS,kCACP,QACA,KACA,QACA,MACA,SACA,SACA;AACA,UAAI,OAAO,cAAc,eAAe,GAAG;AACzC,cAAM,MAAM,IAAI,MAAM,OAAO;AAC7B,cAAM,kBAAkB,KAAK,iCAAiC;AAE9D,eAAO,KAAK,iBAAiB,KAAK,QAAQ,GAAG;AAAA,MAC/C,OAAO;AACL,uBAAe,QAAQ,MAAM,SAAS,OAAO;AAAA,MAC/C;AAAA,IACF;AAAA;AAAA;;;ACziBA;AAAA;AAAA,qDAAAC;AAAA,EAAA,gCAAAC;AAAA,EAAA,4BAAAC;AAAA,EAAA,kCAAAC;AAAA,EAAA,+CAAAC;AAAA,EAAA,2CAAAC;AAAA,EAAA;AAAA,oCAAAC;AAAA,EAAA,sCAAAC;AAAA;AAAA,mBACA,kBACA,2BACA,iBACA,eACA,oBACA,kBACA,yBAaO;AApBP;AAAA;AAAA,oBAAkC;AAClC,uBAAsB;AACtB,gCAA8B;AAC9B,sBAAqB;AACrB,oBAAmB;AACnB,yBAAwB;AACxB,uBAAsB;AACtB,8BAA4B;AAa5B,IAAO,kBAAQ,iBAAAJ;AAAA;AAAA;;;AChBf,OAAOK,UAAQ;AAMf,OAAOC,YAAW;AAQlB,eAAsB,WAAW,WAAiC,QAAqC;AACrG,MAAI;AACJ,MAAI;AACF,UAAM,KAAK,MAAM;AACjB,sBAAkB,GAAG,WAAY,GAAW,aAAa;AAAA,EAC3D,QAAQ;AACN,WAAO,KAAK,4DAA4D;AAAA,EAC1E;AAEA,QAAM,EAAE,aAAa,QAAQ,IAAI,MAAM,aAAa;AACpD,QAAM,QAAQ,YAAY,QAAQ,SAAS,IAAI,IAAI,+BAA+B;AAClF,EAAAC,KAAI,qCAAqC,KAAK;AAE9C,MAAI,iBAAiB;AACrB,MAAI,kBAAkB;AACtB,MAAI,YAAiB;AAErB,WAAS,WAAW;AAClB,sBAAkB;AAClB,QAAI,WAAW;AACb,UAAI;AAAE,kBAAU,MAAM;AAAA,MAAG,QAAQ;AAAA,MAAC;AAAA,IACpC;AAEA,QAAI,CAAC,WAAW;AACd,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AAEA,MAAI,CAAC,WAAW;AACd,YAAQ,GAAG,UAAU,QAAQ;AAC7B,YAAQ,GAAG,WAAW,QAAQ;AAAA,EAChC;AAEA,MAAI,QAAQ;AACV,WAAO,iBAAiB,SAAS,MAAM;AACrC,wBAAkB;AAClB,UAAI,WAAW;AACb,YAAI;AAAE,oBAAU,MAAM;AAAA,QAAG,QAAQ;AAAA,QAAC;AAAA,MACpC;AAAA,IACF,CAAC;AAAA,EACH;AAEA,WAAS,UAAU;AACjB,QAAI,QAAQ,QAAS;AACrB,UAAM,KAAK,IAAI,gBAAgB,KAAK;AACpC,gBAAY;AAEZ,OAAG,GAAG,QAAQ,MAAM;AAClB,MAAAA,KAAI,mCAAmC;AACvC,uBAAiB;AACjB,YAAM,SAAS,EAAE,OAAO,aAAa,UAAU,aAAa,SAAS,YAAY;AACjF,UAAI,UAAW,WAAU,MAAM;AAAA,UAC1B,SAAQ,MAAM,KAAK,UAAU,MAAM,CAAC;AAAA,IAC3C,CAAC;AAED,OAAG,GAAG,WAAW,OAAO,SAAc;AACpC,MAAAA,KAAI,qCAAqC;AACzC,UAAI;AACF,cAAM,WAAW,KAAK,MAAM,KAAK,SAAS,CAAC;AAC3C,QAAAA,KAAI,oBAAoB,SAAS,IAAI;AACrC,YAAI,SAAS,SAAS,WAAW;AAC/B,gBAAM,SAAS,MAAM,eAAe,SAAS,SAAS,aAAa,OAAO;AAC1E,UAAAA,KAAI,yBAAyB,OAAO,EAAE;AAEtC,cAAI,UAAW,WAAU,MAAM;AAAA,cAC1B,SAAQ,IAAI,KAAK,UAAU,MAAM,CAAC;AAGvC,yBAAe;AACf,cAAI;AACF,YAAAF,KAAG,eAAe,MAAM,eAAe,KAAK,UAAU,EAAE,GAAG,QAAQ,KAAK,KAAK,IAAI,EAAE,CAAC,IAAI,IAAI;AAAA,UAC9F,QAAQ;AAAA,UAAC;AAGT,cAAI,OAAO,KAAK;AACd,gBAAI;AACF,oBAAM,MAAM,cAAc,cAAc;AAAA,gBACtC,QAAQ;AAAA,gBACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,gBAC9C,MAAM,KAAK,UAAU,EAAE,UAAU,aAAa,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;AAAA,cACzE,CAAC;AAAA,YACH,SAAS,QAAa;AACpB,oBAAME,OAAM,EAAE,OAAO,aAAa,IAAI,OAAO,IAAI,SAAS,OAAO,MAAM,EAAE;AACzE,kBAAI,UAAW,WAAUA,IAAG;AAAA,kBACvB,SAAQ,MAAM,KAAK,UAAUA,IAAG,CAAC;AAAA,YACxC;AAAA,UACF;AAAA,QACF;AAGA,YAAI,SAAS,SAAS,qBAAqB;AACzC,gBAAM,MAAM,SAAS,WAAW,CAAC;AACjC,gBAAM,eAAe;AAAA,YACnB,OAAO;AAAA,YACP,WAAW,IAAI;AAAA,YACf,MAAM,IAAI;AAAA,YACV,aAAa,IAAI;AAAA,YACjB,WAAW,IAAI;AAAA,YACf,UAAU,IAAI;AAAA,YACd,MAAM,SAAS;AAAA,YACf,KAAK,KAAK,IAAI;AAAA,UAChB;AACA,cAAI,UAAW,WAAU,YAAY;AAAA,cAChC,SAAQ,IAAI,KAAK,UAAU,YAAY,CAAC;AAE7C,yBAAe;AACf,cAAI;AACF,YAAAF,KAAG,eAAe,MAAM,eAAe,KAAK,UAAU,YAAY,IAAI,IAAI;AAAA,UAC5E,QAAQ;AAAA,UAAC;AAAA,QACX;AAAA,MACF,SAAS,KAAU;AACjB,cAAME,OAAM,EAAE,OAAO,iBAAiB,SAAS,OAAO,GAAG,EAAE;AAC3D,YAAI,UAAW,WAAUA,IAAG;AAAA,YACvB,SAAQ,MAAM,KAAK,UAAUA,IAAG,CAAC;AAAA,MACxC;AAAA,IACF,CAAC;AAED,OAAG,GAAG,SAAS,MAAM;AACnB,kBAAY;AACZ,UAAI,mBAAmB,CAAC,QAAQ,SAAS;AACvC,cAAMA,OAAM,EAAE,OAAO,gBAAgB,aAAa,eAAe;AACjE,YAAI,UAAW,WAAUA,IAAG;AAAA,YACvB,SAAQ,MAAM,KAAK,UAAUA,IAAG,CAAC;AAEtC,mBAAW,SAAS,cAAc;AAClC,yBAAiB,KAAK,IAAI,iBAAiB,GAAG,GAAK;AAAA,MACrD;AAAA,IACF,CAAC;AAED,OAAG,GAAG,SAAS,CAAC,QAAa;AAC3B,YAAMA,OAAM,EAAE,OAAO,SAAS,SAAS,IAAI,QAAQ;AACnD,UAAI,UAAW,WAAUA,IAAG;AAAA,UACvB,SAAQ,MAAM,KAAK,UAAUA,IAAG,CAAC;AAAA,IACxC,CAAC;AAAA,EACH;AAEA,UAAQ;AAER,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,QAAI,QAAQ;AACV,aAAO,iBAAiB,SAAS,MAAM,QAAQ,CAAC;AAAA,IAClD;AAAA,EACF,CAAC;AACH;AAjKA,IAYMA;AAZN;AAAA;AAAA;AAKA;AACA;AACA;AACA;AACA;AAGA,IAAMA,OAAMD,OAAM,iCAAiC;AAAA;AAAA;;;ACAnD,eAAsB,kBACpB,WACA,WACA,SACA,cACc;AACd,MAAI,CAAC,aAAa,CAAC,WAAW;AAC5B,WAAO,KAAK,qEAAqE;AAAA,EACnF;AAEA,MAAI,CAAC,yBAAyB,KAAK,SAAS,GAAG;AAC7C,WAAO,KAAK,qEAAqE;AAAA,EACnF;AAEA,QAAM,EAAE,aAAa,QAAQ,IAAI,MAAM,aAAa;AACpD,QAAM,OAAO,SAAS,WAAW,KAAK,EAAE;AAGxC,MAAI,YAAqB;AACzB,MAAI,cAAc;AAChB,QAAI;AACF,kBAAY,KAAK,MAAM,YAAY;AAAA,IACrC,QAAQ;AACN,aAAO,KAAK,8BAA8B;AAAA,IAC5C;AAAA,EACF;AAGA,MAAI,cAAmB;AAEvB,MAAI,OAAO,GAAG;AACZ,QAAI;AACF,YAAM,UAAU,MAAM,mBAAmB,WAAW,MAAM,oBAAoB,SAAS,EAAE;AACzF,oBAAc;AAAA,QACZ,MAAM,QAAQ;AAAA,QACd,MAAM,QAAQ;AAAA,QACd,UAAU,QAAQ;AAAA,QAClB,kBAAkB,QAAQ;AAAA,QAC1B,kBAAkB,QAAQ;AAAA,QAC1B,mBAAmB,QAAQ;AAAA,MAC7B;AAAA,IACF,SAAS,KAAU;AAEjB,oBAAc,EAAE,OAAO,OAAO,IAAI,WAAW,GAAG,EAAE;AAAA,IACpD;AAAA,EACF;AAEA,QAAM,iBAAiB;AAAA,IACrB;AAAA,IACA,GAAI,YAAY,EAAE,OAAO,UAAU,IAAI,CAAC;AAAA,IACxC,SAAS;AAAA,IACT,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,EACtC;AAEA,QAAM,YAAY,MAAM,iBAAiB,SAAS,WAAW,mBAAmB,cAAc;AAE9F,QAAM,OAAO,MAAM,MAAM,GAAG,WAAW,eAAe;AAAA,IACpD,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAU;AAAA,MACnB,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,SAAS;AAAA,MACT;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,MAAI,CAAC,KAAK,IAAI;AACZ,UAAM,OAAO,MAAM,KAAK,KAAK;AAC7B,WAAO,KAAK,sBAAsB,KAAK,MAAM,MAAM,IAAI,EAAE;AAAA,EAC3D;AAEA,QAAM,SAAS,MAAM,KAAK,KAAK;AAE/B,SAAO,GAAG;AAAA,IACR,MAAM;AAAA,IACN,WAAW,OAAO;AAAA,IAClB,IAAI;AAAA,IACJ;AAAA,IACA,iBAAiB,eAAe,CAAC,YAAY;AAAA,IAC7C,aAAa,aAAa,QAAQ;AAAA,IAClC,UAAU,aAAa,YAAY;AAAA,IACnC,MAAM;AAAA,EACR,CAAC;AACH;AAjGA;AAAA;AAAA;AAIA;AACA;AACA;AACA;AAAA;AAAA;;;ACHA,OAAOE,UAAQ;AASf,eAAsB,kBACpB,WACA,cACA,WACA,YACc;AACd,MAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,aAAa,CAAC,YAAY;AAC5D,WAAO,KAAK,4EAA4E;AAAA,EAC1F;AAEA,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,UAAU;AAAA,EAChC,QAAQ;AACN,WAAO,KAAK,+BAA+B;AAAA,EAC7C;AAEA,QAAM,EAAE,aAAa,QAAQ,IAAI,MAAM,aAAa;AAGpD,MAAIA,KAAG,WAAW,MAAM,YAAY,GAAG;AACrC,UAAM,QAAQA,KAAG,aAAa,MAAM,cAAc,OAAO,EAAE,KAAK,EAAE,MAAM,IAAI,EAAE,OAAO,OAAO;AAC5F,UAAM,gBAAgB,CAAC,aAAa,YAAY,mBAAmB,UAAU,OAAO;AAEpF,eAAW,QAAQ,OAAO;AACxB,UAAI;AACF,cAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,YAAI,MAAM,cAAc,aAAa,cAAc,SAAS,MAAM,MAAM,GAAG;AACzE,iBAAO,GAAG;AAAA,YACR,MAAM;AAAA,YACN;AAAA,YACA;AAAA,YACA,IAAI;AAAA,YACJ,SAAS,0CAA0C,MAAM,MAAM;AAAA,YAC/D,kBAAkB;AAAA,YAClB,gBAAgB,MAAM;AAAA,UACxB,CAAC;AAAA,QACH;AAAA,MACF,QAAQ;AAAA,MAAC;AAAA,IACX;AAAA,EACF;AAEA,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,EACF;AAEA,QAAM,MAAM,MAAM,iBAAiB,SAAS,cAAc,oBAAoB,eAAe;AAC7F,QAAM,OAAO,MAAM,MAAM,GAAG,WAAW,eAAe;AAAA,IACpD,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAU;AAAA,MACnB,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,SAAS;AAAA,MACT,WAAW;AAAA,IACb,CAAC;AAAA,EACH,CAAC;AAED,MAAI,CAAC,KAAK,IAAI;AAEZ,6BAAyB,WAAW,UAAU;AAAA,MAC5C,UAAU,KAAK,IAAI;AAAA,MACnB,OAAO,sBAAsB,KAAK,MAAM;AAAA,IAC1C,CAAC;AACD,WAAO,KAAK,sBAAsB,KAAK,MAAM,EAAE;AAAA,EACjD;AAGA,2BAAyB,WAAW,aAAa;AAAA,IAC/C,aAAa,KAAK,IAAI;AAAA,EACxB,CAAC;AAED,SAAO,GAAG,EAAE,MAAM,MAAM,WAAW,WAAW,IAAI,aAAa,CAAC;AAClE;AAKA,eAAsB,mBAAmB,gBAAkD;AACzF,MAAI,CAAC,eAAgB,QAAO,KAAK,0CAA0C;AAC3E,MAAI,CAACA,KAAG,WAAW,cAAc,EAAG,QAAO,KAAK,mBAAmB,cAAc,EAAE;AAEnF,QAAM,SAAS,KAAK,MAAMA,KAAG,aAAa,gBAAgB,OAAO,CAAC;AAClE,QAAM,EAAE,WAAW,MAAM,cAAc,OAAO,SAAS,IAAI;AAE3D,MAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,UAAU;AAC5C,WAAO,KAAK,yDAAyD;AAAA,EACvE;AAEA,QAAM,EAAE,aAAa,QAAQ,IAAI,MAAM,aAAa;AAEpD,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,iBAAiB;AAAA,IACjB,aAAa,OAAO,eAAe;AAAA,IACnC,kBAAkB,OAAO,oBAAoB;AAAA,IAC7C,gBAAgB,OAAO,kBAAkB;AAAA,EAC3C;AAEA,QAAM,MAAM,MAAM,iBAAiB,SAAS,cAAc,oBAAoB,eAAe;AAC7F,QAAM,WAAW,MAAM,MAAM,GAAG,WAAW,eAAe;AAAA,IACxD,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAU;AAAA,MACnB,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,SAAS;AAAA,MACT,WAAW;AAAA,IACb,CAAC;AAAA,EACH,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,WAAO,KAAK,4BAA4B,MAAM,SAAS,KAAK,CAAC,EAAE;AAAA,EACjE;AAEA,QAAM,aAAa,MAAM,SAAS,KAAK;AAGvC,MAAIA,KAAG,WAAW,MAAM,aAAa,GAAG;AACtC,UAAM,QAAQA,KAAG,aAAa,MAAM,eAAe,OAAO,EAAE,KAAK,EAAE,MAAM,IAAI,EAAE,OAAO,OAAO;AAC7F,UAAM,YAAY,MAAM,OAAO,CAAC,MAAc;AAC5C,UAAI;AAAE,eAAO,KAAK,MAAM,CAAC,EAAE,cAAc;AAAA,MAAW,QAAQ;AAAE,eAAO;AAAA,MAAM;AAAA,IAC7E,CAAC;AACD,IAAAA,KAAG,cAAc,MAAM,eAAe,UAAU,SAAS,UAAU,KAAK,IAAI,IAAI,OAAO,EAAE;AAAA,EAC3F;AAEA,SAAO,GAAG,EAAE,WAAW,MAAM,WAAW,IAAI,cAAc,OAAO,QAAQ,WAAW,OAAO,CAAC;AAC9F;AApJA;AAAA;AAAA;AAKA;AACA;AACA;AACA;AAAA;AAAA;;;ACJA,OAAOC,UAAQ;AAQf,eAAsB,kBAAgC;AACpD,MAAI,CAACA,KAAG,WAAW,MAAM,YAAY,GAAG;AACtC,WAAO,GAAG,EAAE,SAAS,CAAC,GAAG,OAAO,EAAE,CAAC;AAAA,EACrC;AAEA,QAAM,UAAU,UAAe,MAAM,YAAY;AACjD,QAAM,UAAU,QAAQ,OAAO,OAAK,EAAE,WAAW,SAAS;AAE1D,SAAO,GAAG,EAAE,SAAS,OAAO,QAAQ,QAAQ,OAAO,QAAQ,OAAO,CAAC;AACrE;AAKA,eAAsB,mBAAiC;AACrD,MAAI,CAACA,KAAG,WAAW,MAAM,aAAa,GAAG;AACvC,WAAO,GAAG,EAAE,SAAS,CAAC,EAAE,CAAC;AAAA,EAC3B;AAEA,QAAM,UAAU,UAAe,MAAM,aAAa;AAElD,SAAO,GAAG,EAAE,SAAS,SAAS,OAAO,QAAQ,OAAO,CAAC;AACvD;AAlCA;AAAA;AAAA;AAKA;AACA;AACA;AAAA;AAAA;;;ACHA,OAAOC,UAAQ;AAYf,eAAeC,UAAuB;AACpC,MAAIC,MAAM,QAAOA;AAEjB,MAAI;AACF,IAAAA,QAAO,MAAM,OAAO,UAAU;AAC9B,WAAOA;AAAA,EACT,QAAQ;AACN,UAAM,EAAE,eAAAC,eAAc,IAAI,MAAM,OAAO,UAAU;AACjD,UAAMC,QAAO,MAAM,OAAO,WAAW;AACrC,UAAMC,MAAK,MAAM,OAAO,SAAS;AAEjC,UAAMC,aAAYF,MAAK,QAAQD,eAAc,YAAY,GAAG,CAAC;AAC7D,UAAM,aAAa;AAAA,MACjBC,MAAK,QAAQE,YAAW,MAAM,MAAM,MAAM,gBAAgB,QAAQ,OAAO,QAAQ,OAAO,QAAQ;AAAA,MAChGF,MAAK,QAAQE,YAAW,MAAM,MAAM,MAAM,MAAM,MAAM,WAAW,YAAY,QAAQ,gBAAgB,QAAQ,OAAO,QAAQ,OAAO,QAAQ;AAAA,MAC3IF,MAAK,QAAQC,IAAG,QAAQ,GAAG,WAAW,YAAY,QAAQ,gBAAgB,QAAQ,OAAO,QAAQ,OAAO,QAAQ;AAAA,IAClH;AAEA,eAAW,KAAK,YAAY;AAC1B,UAAI;AACF,QAAAH,QAAO,MAAM,OAAO;AACpB,eAAOA;AAAA,MACT,QAAQ;AAAA,MAER;AAAA,IACF;AACA,UAAM,IAAI,MAAM,2CAA2C;AAAA,EAC7D;AACF;AAKA,eAAsB,gBAAgB,WAA6C;AACjF,MAAI,CAAC,WAAW;AACd,WAAO,KAAK,iCAAiC;AAAA,EAC/C;AAEA,QAAM,MAAM,MAAMD,QAAO;AACzB,QAAM,SAAS,UAAU,WAAW,GAAG,IAAI,YAAY,IAAI,SAAS;AACpE,QAAM,EAAE,aAAa,QAAQ,IAAI,MAAM,aAAa;AAGpD,QAAM,UAAU,UAAU,WAAW;AACrC,QAAM,UAAU,IAAI,KAAK,OAAO,MAAM,KAAK,IAAI,YAAY,EAAE,OAAO,OAAO,CAAC,CAAC;AAC7E,QAAM,MAAM,QAAQ,KAAK,OAAO;AAChC,QAAM,eAAgB,MAAM,KAAK,IAAI,MAAM,CAAC,EAAe,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE;AAG9G,QAAM,UAAU;AAAA,IACd;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC;AAEA,iBAAe;AACf,EAAAD,KAAG,cAAc,MAAM,sBAAsB,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAI7E,QAAM,YAAY,qBAAqB,YAAY,MAAM,GAAG,EAAE,CAAC,MAAM,YAAY,MAAM,GAAG,CAAC,QAAQ,aAAa,MAAM,GAAG,EAAE,CAAC;AAE5H,SAAO,GAAG;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,MAAM,6BAA6B,MAAM;AAAA,EAC3C,CAAC;AACH;AAKA,eAAsB,mBAAmB,UAA4C;AACnF,MAAI,CAAC,SAAU,QAAO,KAAK,sCAAsC;AAGjE,MAAI,CAACA,KAAG,WAAW,MAAM,oBAAoB,GAAG;AAC9C,WAAO,KAAK,sDAAsD;AAAA,EACpE;AAEA,QAAM,UAAU,KAAK,MAAMA,KAAG,aAAa,MAAM,sBAAsB,OAAO,CAAC;AAG/E,QAAM,eAAe,SAAS,MAAM,eAAe;AACnD,MAAI,CAAC,aAAc,QAAO,KAAK,yEAAyE;AACxG,QAAM,UAAU,aAAa,CAAC;AAG9B,MAAI;AACJ,MAAI;AACF,UAAM,EAAE,SAAS,IAAI,MAAM,OAAO,eAAgC;AAClE,UAAM,aAAa,SAAS,aAAa,QAAQ,uBAAuB;AAAA,MACtE,UAAU;AAAA,MACV,SAAS;AAAA,IACX,CAAC;AACD,gBAAY,KAAK,MAAM,UAAU;AAAA,EACnC,SAAS,KAAU;AACjB,WAAO,KAAK,0BAA0B,IAAI,OAAO,qCAAqC;AAAA,EACxF;AAGA,QAAM,YAAY,UAAU,QAAQ,UAAU,aAAa;AAC3D,MAAI,CAAC,UAAU,SAAS,QAAQ,YAAY,MAAM,GAAG,EAAE,CAAC,GAAG;AACzD,WAAO,KAAK,mDAAmD;AAAA,EACjE;AAEA,MAAI,CAAC,UAAU,SAAS,QAAQ,UAAU,MAAM,GAAG,EAAE,CAAC,GAAG;AACvD,WAAO,KAAK,oEAAoE;AAAA,EAClF;AAGA,QAAM,UAAU,UAAU,MAAM,UAAU,UAAU,YAAY,UAAU,QAAQ,MAAM,UAAU;AAClG,QAAM,UAAU,UAAU,MAAM,eAAe,UAAU,QAAQ,YAAY,UAAU,QAAQ,QAAQ,QAAQ,OAAO,QAAQ,KAAK,EAAE;AAErI,MAAI,CAAC,SAAS;AACZ,WAAO,KAAK,8CAA8C;AAAA,EAC5D;AAGA,QAAM,sBAAsB;AAAA,IAC1B,UAAU;AAAA,IACV,MAAM;AAAA,IACN,aAAa,QAAQ;AAAA,IACrB,SAAS,IAAI,OAAO;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,QAAQ;AAAA,IACnB,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,EACrC;AAGA,MAAI,SAAS,EAAE,MAAM,MAAuB,QAAQ,yBAAyB;AAC7E,MAAI,gBAAgB;AACpB,MAAI;AACF,aAAS,MAAM,4BAA4B,qBAAqB,OAAO,cAAc;AACrF,oBAAgB;AAAA,EAClB,SAAS,KAAU;AACjB,YAAQ,MAAM,uCAAuC,IAAI,OAAO,EAAE;AAClE,YAAQ,MAAM,0CAA0C;AAAA,EAC1D;AAGA,QAAM,gBAAgB,mBAAmB;AACzC,gBAAc,KAAK;AAAA,IACjB,GAAG;AAAA,IACH,MAAM,OAAO;AAAA,EACf,CAAC;AACD,qBAAmB,aAAa;AAGhC,EAAAA,KAAG,WAAW,MAAM,oBAAoB;AAExC,SAAO,GAAG;AAAA,IACR,UAAU;AAAA,IACV,aAAa,QAAQ;AAAA,IACrB,SAAS,IAAI,OAAO;AAAA,IACpB;AAAA,IACA;AAAA,IACA,MAAM,OAAO;AAAA,IACb,QAAQ,OAAO;AAAA,IACf;AAAA,IACA,MAAM,gBAAgB,SAAY;AAAA,EACpC,CAAC;AACH;AAKA,eAAsB,oBAAkC;AACtD,QAAM,gBAAgB,mBAAmB;AACzC,SAAO,GAAG,EAAE,eAAe,OAAO,cAAc,OAAO,CAAC;AAC1D;AAKA,eAAsB,WAAW,OAAyC;AACxE,MAAI;AACF,UAAM,cAAc,QACf,MAAM,WAAW,GAAG,IAAI,EAAE,SAAS,MAAM,IAAI,EAAE,aAAa,MAAM,IACnE,EAAE,MAAM,OAAO;AAEnB,UAAM,WAAW,MAAM,cAAc,gBAAgB,iBAAiB,WAAW;AACjF,WAAO,GAAG,EAAE,eAAe,SAAS,WAAW,YAAY,CAAC,GAAG,OAAO,YAAY,CAAC;AAAA,EACrF,QAAQ;AACN,WAAO,GAAG,EAAE,eAAe,CAAC,GAAG,OAAO,MAAM,yDAAyD,CAAC;AAAA,EACxG;AACF;AAKA,eAAsB,sBAAoC;AACxD,MAAI,CAACA,KAAG,WAAW,MAAM,gBAAgB,GAAG;AAC1C,WAAO,GAAG,EAAE,OAAO,CAAC,GAAG,OAAO,EAAE,CAAC;AAAA,EACnC;AAEA,QAAM,QAAQ,UAAe,MAAM,gBAAgB,EAAE,OAAO,OAAK,EAAE,WAAW,SAAS;AAEvF,SAAO,GAAG,EAAE,OAAO,OAAO,MAAM,OAAO,CAAC;AAC1C;AAKA,eAAsB,sBACpB,WACA,UACc;AACd,MAAI,CAAC,UAAW,QAAO,KAAK,oDAAoD;AAEhF,MAAI,CAACA,KAAG,WAAW,MAAM,gBAAgB,GAAG;AAC1C,WAAO,KAAK,4BAA4B;AAAA,EAC1C;AAEA,QAAM,QAAQ,UAAe,MAAM,gBAAgB;AACnD,QAAM,aAAa,MAAM,UAAU,OAAK,EAAE,cAAc,SAAS;AACjE,MAAI,eAAe,IAAI;AACrB,WAAO,KAAK,WAAW,SAAS,sBAAsB;AAAA,EACxD;AAGA,QAAM,UAAU,EAAE,SAAS;AAC3B,QAAM,UAAU,EAAE,eAAc,oBAAI,KAAK,GAAE,YAAY;AACvD,QAAM,UAAU,EAAE,WAAW,YAAY;AAGzC,EAAAA,KAAG,cAAc,MAAM,kBAAkB,MAAM,IAAI,OAAK,KAAK,UAAU,CAAC,CAAC,EAAE,KAAK,IAAI,IAAI,IAAI;AAE5F,SAAO,GAAG;AAAA,IACR,WAAW;AAAA,IACX;AAAA,IACA,OAAO,MAAM,UAAU;AAAA,EACzB,CAAC;AACH;AA/PA,IAcIE;AAdJ,IAAAK,iBAAA;AAAA;AAAA;AAKA;AACA;AACA;AACA;AACA;AAKA,IAAIL,QAAY;AAAA;AAAA;;;ACdhB,SAAS,iBAAAM,sBAAqB;AAC9B,OAAOC,WAAU;AACjB,OAAOC,SAAQ;AACf,OAAOC,UAAQ;AACf,OAAOC,cAAa;AA+CpB,eAAsB,oBAAoB;AACxC,QAAM,WAAW;AAAA,IACf,SAAS;AAAA,IACT,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,WAAW,CAAC;AAAA,IACZ,kBAAkB;AAAA,IAClB,iBAAiB;AAAA,IACjB,OAAO;AAAA,MACL,UAAU;AAAA,MACV,UAAU;AAAA,MACV,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,MAAI,CAACD,KAAG,WAAWE,OAAM,aAAa,GAAG;AACvC,WAAO;AAAA,EACT;AACA,MAAI;AACF,UAAM,SAAS,KAAK,MAAMF,KAAG,aAAaE,OAAM,eAAe,OAAO,CAAC;AACvE,WAAO,EAAE,GAAG,UAAU,GAAG,OAAO;AAAA,EAClC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAeC,kBAAiB,KAAa,UAAe,CAAC,GAAG;AAC9D,QAAM,EAAE,UAAU,KAAM,IAAI;AAC5B,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,KAAK,WAAW,MAAM,WAAW,MAAM,GAAG,OAAO;AACvD,MAAI;AACF,UAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAChC,GAAG;AAAA,MACH,QAAQ,WAAW;AAAA,IACrB,CAAC;AACD,iBAAa,EAAE;AACf,WAAO;AAAA,EACT,SAAS,KAAK;AACZ,iBAAa,EAAE;AACf,UAAM;AAAA,EACR;AACF;AAKA,eAAsB,cAAc,UAAiC;AACnE,QAAM,QAAQ,SAAS,YAAY,MAAM,EAAE,KAAK;AAEhD,MAAI,CAACH,KAAG,WAAWE,OAAM,UAAU,GAAG;AACpC,WAAO,GAAG,EAAE,KAAK,CAAC,GAAG,OAAO,EAAE,CAAC;AAAA,EACjC;AAEA,QAAM,QAAQF,KAAG,aAAaE,OAAM,YAAY,OAAO,EAAE,MAAM,IAAI,EAAE,OAAO,CAAC,MAAc,EAAE,KAAK,CAAC;AACnG,QAAM,UAA6B,MAAM,IAAI,CAAC,MAAc;AAC1D,QAAI;AAAE,aAAO,KAAK,MAAM,CAAC;AAAA,IAAG,QAAQ;AAAE,aAAO;AAAA,IAAM;AAAA,EACrD,CAAC,EAAE,OAAO,OAAO;AAEjB,QAAM,SAAS,QAAQ,MAAM,CAAC,KAAK,EAAE,QAAQ;AAC7C,SAAO,GAAG,EAAE,KAAK,QAAQ,OAAO,QAAQ,QAAQ,SAAS,OAAO,OAAO,CAAC;AAC1E;AAEA,eAAsB,gBAAgB,cAAsB,cAAuB,YAAqB,SAAgC;AACtI,QAAM,WAAW,SAAS,cAAc,EAAE,KAAK;AAC/C,QAAM,WAAW,SAAS,gBAAgB,IAAI,EAAE,KAAM,WAAW;AACjE,QAAM,SAAS,SAAS,cAAc,IAAI,EAAE,KAAM,WAAW;AAE7D,QAAM,SAAS;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,iBAAiB,WAAW;AAAA,IAC5B,OAAO,EAAE,UAAU,UAAU,OAAO;AAAA,EACtC;AAEA,QAAM,MAAMJ,MAAK,QAAQI,OAAM,aAAa;AAC5C,MAAI,CAACF,KAAG,WAAW,GAAG,EAAG,CAAAA,KAAG,UAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAC9D,EAAAA,KAAG,cAAcE,OAAM,eAAe,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AACrE,SAAO,GAAG,EAAE,SAAS,2BAA2B,OAAO,CAAC;AAC1D;AAEA,eAAsB,mBAAiC;AACrD,QAAM,SAAS,MAAM,kBAAkB;AACvC,SAAO,GAAG,MAAM;AAClB;AAEA,eAAsB,gBAAgB,QAA8B;AAClE,MAAI,CAAC,OAAQ,QAAO,KAAK,+BAA+B;AACxD,MAAI,YAAsB,CAAC;AAC3B,MAAIF,KAAG,WAAWE,OAAM,gBAAgB,GAAG;AACzC,QAAI;AAAE,kBAAY,KAAK,MAAMF,KAAG,aAAaE,OAAM,kBAAkB,OAAO,CAAC;AAAA,IAAG,QAAQ;AAAE,kBAAY,CAAC;AAAA,IAAG;AAAA,EAC5G;AACA,MAAI,CAAC,UAAU,SAAS,MAAM,EAAG,WAAU,KAAK,MAAM;AACtD,EAAAF,KAAG,cAAcE,OAAM,kBAAkB,KAAK,UAAU,WAAW,MAAM,CAAC,CAAC;AAC3E,SAAO,GAAG,EAAE,SAAS,MAAM,QAAQ,OAAO,UAAU,OAAO,CAAC;AAC9D;AAEA,eAAsB,kBAAkB,QAA8B;AACpE,MAAI,CAAC,OAAQ,QAAO,KAAK,iCAAiC;AAC1D,MAAI,YAAsB,CAAC;AAC3B,MAAIF,KAAG,WAAWE,OAAM,gBAAgB,GAAG;AACzC,QAAI;AAAE,kBAAY,KAAK,MAAMF,KAAG,aAAaE,OAAM,kBAAkB,OAAO,CAAC;AAAA,IAAG,QAAQ;AAAE,kBAAY,CAAC;AAAA,IAAG;AAAA,EAC5G;AACA,cAAY,UAAU,OAAO,OAAK,MAAM,MAAM;AAC9C,EAAAF,KAAG,cAAcE,OAAM,kBAAkB,KAAK,UAAU,WAAW,MAAM,CAAC,CAAC;AAC3E,SAAO,GAAG,EAAE,WAAW,MAAM,QAAQ,OAAO,UAAU,OAAO,CAAC;AAChE;AAKA,eAAsB,iBAAiB,WAA6C;AAClF,MAAI,CAAC,UAAW,QAAO,KAAK,mCAAmC;AAE/D,MAAI,CAACF,KAAG,WAAWE,OAAM,UAAU,GAAG;AACpC,WAAO,KAAK,sBAAsB;AAAA,EACpC;AAGA,QAAM,QAAQF,KAAG,aAAaE,OAAM,YAAY,OAAO,EAAE,MAAM,IAAI,EAAE,OAAO,CAAC,MAAc,EAAE,KAAK,CAAC;AACnG,QAAM,UAA6B,MAAM,IAAI,CAAC,GAAW,QAAgB;AACvE,QAAI;AAAE,aAAO,EAAE,GAAG,KAAK,MAAM,CAAC,GAAG,UAAU,IAAI;AAAA,IAAG,QAAQ;AAAE,aAAO;AAAA,IAAM;AAAA,EAC3E,CAAC,EAAE,OAAO,OAAO;AAEjB,QAAM,QAAQ,QAAQ,KAAK,OAAK,EAAE,cAAc,SAAS;AACzD,MAAI,CAAC,OAAO;AACV,WAAO,KAAK,WAAW,SAAS,2BAA2B;AAAA,EAC7D;AAEA,MAAI,MAAM,iBAAiB;AACzB,WAAO,KAAK,sDAAiD;AAAA,EAC/D;AAEA,MAAI,MAAM,iBAAiB,aAAa;AACtC,WAAO,KAAK,2CAA2C;AAAA,EACzD;AAGA,QAAM,EAAE,aAAa,SAAS,QAAQ,IAAI,MAAM,aAAa;AAC7D,QAAM,oBAAoBF,KAAG,aAAaE,OAAM,gBAAgB,OAAO;AACvE,QAAM,iBAAiB,KAAK,MAAM,iBAAiB;AAGnD,MAAI;AACJ,MAAI;AACF,UAAM,MAAM,OAAO,UAAU;AAAA,EAC/B,QAAQ;AACN,WAAO,KAAK,6CAA6C;AAAA,EAC3D;AAEA,QAAM,EAAE,aAAAE,cAAa,OAAO,YAAAC,aAAY,WAAW,KAAK,IAAI;AAG5D,QAAM,aAAa,MAAM,WAAW;AACpC,MAAI,aAAa,GAAG;AAClB,WAAO,KAAK,4BAA4B;AAAA,EAC1C;AAGA,QAAM,eAAe,UAAU,WAAW,MAAM,IAAI;AACpD,QAAM,gBAAgB,aAAa,UAAU,OAAO,EAAE,SAAS;AAE/D,MAAI;AAEF,UAAM,EAAE,QAAQ,IAAI,MAAM,oBAAoB,OAAO;AACrD,UAAM,SAAS,YAAY,YAAY,SAAS;AAChD,UAAM,YAAY,MAAMF,kBAAiB,uCAAuC,MAAM,YAAY,OAAO,cAAc;AACvH,UAAM,OAAO,MAAM,UAAU,KAAK;AAClC,UAAM,QAAQ,KAAK,UAAU,CAAC;AAE9B,QAAI,CAAC,SAAS,MAAM,WAAW,GAAG;AAChC,aAAO,KAAK,oCAAoC,OAAO,EAAE;AAAA,IAC3D;AAGA,UAAM,KAAK,IAAIC,aAAY;AAC3B,QAAI,aAAa;AAEjB,eAAW,QAAQ,OAAO;AACxB,UAAI,cAAc,aAAa,GAAI;AACnC,SAAG,SAAS;AAAA,QACV,YAAY,KAAK;AAAA,QACjB,mBAAmB,KAAK;AAAA,QACxB,gBAAgB,KAAK;AAAA,QACrB,QAAQ,IAAI,MAAM,EAAE,KAAK,QAAQ,YAAY,EAAE,UAAU,OAAO,CAAC,EAAE,MAAM;AAAA,QACzE,yBAAyB,IAAI,MAAM,EAAE,OAAO,OAAO;AAAA,MACrD,CAAC;AACD,oBAAc,KAAK;AAAA,IACrB;AAEA,QAAI,aAAa,aAAa,IAAI;AAChC,aAAO,KAAK,+BAA+B;AAAA,IAC7C;AAGA,OAAG,UAAU;AAAA,MACX,UAAU;AAAA,MACV,eAAe,IAAI,MAAM,EAAE,KAAK,aAAa;AAAA,IAC/C,CAAC;AAGD,UAAM,MAAM;AACZ,UAAM,SAAS,aAAa,aAAa;AACzC,QAAI,SAAS,GAAG;AACd,SAAG,UAAU;AAAA,QACX,UAAU;AAAA,QACV,eAAe,IAAI,MAAM,EAAE,KAAK,QAAQ,YAAY,EAAE,UAAU,OAAO,CAAC;AAAA,MAC1E,CAAC;AAAA,IACH;AAEA,UAAM,GAAG,KAAK;AAGd,UAAM,SAAUH,SAAgB,KAAK,EAAE;AACvC,QAAI;AAEJ,QAAI,QAAQ;AACV,sBAAgB,MAAME,kBAAiB,GAAG,OAAO,QAAQ,OAAO,EAAE,CAAC,UAAU;AAAA,QAC3E,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAC9C,MAAM,KAAK,UAAU,EAAE,OAAO,GAAG,MAAM,EAAE,CAAC;AAAA,MAC5C,CAAC;AAAA,IACH,OAAO;AACL,sBAAgB,MAAMA,kBAAiB,uCAAuC,MAAM,WAAW;AAAA,QAC7F,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAC9C,MAAM,KAAK,UAAU,EAAE,OAAO,GAAG,MAAM,EAAE,CAAC;AAAA,MAC5C,CAAC;AAAA,IACH;AAEA,QAAI,CAAC,cAAc,IAAI;AACrB,YAAM,UAAU,MAAM,cAAc,KAAK;AACzC,aAAO,KAAK,qBAAqB,OAAO,EAAE;AAAA,IAC5C;AAEA,UAAM,OAAO,GAAG,GAAG,KAAK;AAGxB,UAAM,eAAe,MAAM,IAAI,CAAC,GAAW,QAAgB;AACzD,UAAI,QAAQ,MAAM,UAAU;AAC1B,cAAM,UAAU,EAAE,GAAG,KAAK,MAAM,CAAC,GAAG,cAAc,aAAa,YAAY,MAAM,aAAY,oBAAI,KAAK,GAAE,YAAY,EAAE;AACtH,eAAO,KAAK,UAAU,OAAO;AAAA,MAC/B;AACA,aAAO;AAAA,IACT,CAAC;AACD,IAAAH,KAAG,cAAcE,OAAM,YAAY,aAAa,KAAK,IAAI,IAAI,IAAI;AAEjE,WAAO,GAAG;AAAA,MACR,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM,YAAY,UAAU;AAAA,IAC9B,CAAC;AAAA,EAEH,SAAS,KAAK;AACZ,WAAO,KAAK,kBAAmB,IAAc,OAAO,EAAE;AAAA,EACxD;AACF;AAtTA,IAUMI,aACAC,YAGAL;AAdN,IAAAM,iBAAA;AAAA;AAAA;AAMA;AACA;AACA;AAEA,IAAMF,cAAaT,eAAc,YAAY,GAAG;AAChD,IAAMU,aAAYT,MAAK,QAAQQ,WAAU;AAGzC,IAAMJ,SAAQ;AAAA,MACZ,gBAAgBJ,MAAK,KAAKC,IAAG,QAAQ,GAAG,aAAa,cAAc,sBAAsB;AAAA,MACzF,YAAYD,MAAK,KAAKC,IAAG,QAAQ,GAAG,aAAa,oBAAoB,0BAA0B;AAAA,MAC/F,eAAeD,MAAK,KAAKC,IAAG,QAAQ,GAAG,aAAa,oBAAoB,qBAAqB;AAAA,MAC7F,kBAAkBD,MAAK,KAAKC,IAAG,QAAQ,GAAG,aAAa,oBAAoB,wBAAwB;AAAA,IACrG;AAAA;AAAA;;;ACnBA;AA2DA,eAAe,OAAO;AACpB,MAAI;AACF,YAAQ,SAAS;AAAA;AAAA,MAEf,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,WAAG;AAAA,UACD,OAAO;AAAA,UACP,UAAU;AAAA,YACR,QAAQ,CAAC,SAAS,YAAY,WAAW,WAAW,wBAAwB,kBAAkB;AAAA,YAC9F,cAAc,CAAC,YAAY,YAAY;AAAA,YACvC,UAAU,CAAC,YAAY,4CAA4C,8CAA8C,aAAa;AAAA,YAC9H,WAAW,CAAC,gDAAgD,mCAAmC,mCAAmC;AAAA,YAClI,UAAU,CAAC,8BAA8B,iBAAiB,oDAAoD;AAAA,YAC9G,WAAW,CAAC,4BAA4B,SAAS,OAAO,QAAQ,SAAS;AAAA,YACzE,oBAAoB,CAAC,oDAAoD,iBAAiB,oDAAoD;AAAA,YAC9I,UAAU,CAAC,kBAAkB,0BAA0B;AAAA,YACvD,kBAAkB,CAAC,2BAA2B,8BAA8B,mBAAmB,qBAAqB,sBAAsB,uCAAuC;AAAA,YACjL,SAAS,CAAC,6DAA6D,kBAAkB,0BAA0B,4BAA4B,uBAAuB,wBAAwB;AAAA,UAChM;AAAA,QACF,CAAC;AACD;AAAA;AAAA,MAGF,KAAK;AACH,cAAM,UAAU;AAChB;AAAA,MACF,KAAK;AACH,cAAM,SAAS;AACf;AAAA,MACF,KAAK;AACH,cAAM,YAAY;AAClB;AAAA,MACF,KAAK;AACH,cAAM,WAAW;AACjB;AAAA,MACF,KAAK;AACH,cAAM,WAAW;AACjB;AAAA,MACF,KAAK;AACH,cAAM,UAAU,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;AAChC;AAAA,MACF,KAAK;AACH,cAAM,UAAU,KAAK,CAAC,CAAC;AACvB;AAAA;AAAA,MAGF,KAAK;AACH,cAAM,YAAY;AAClB;AAAA,MACF,KAAK;AACH,cAAM,cAAc;AACpB;AAAA;AAAA,MAGF,KAAK;AACH,cAAM,YAAY;AAClB;AAAA,MACF,KAAK;AACH,cAAM,aAAa,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;AACrD;AAAA,MACF,KAAK;AACH,cAAM,UAAU,KAAK,CAAC,CAAC;AACvB;AAAA,MACF,KAAK;AACH,cAAM,eAAe,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,MAAM,CAAC,EAAE,KAAK,GAAG,KAAK,MAAS;AACpF;AAAA;AAAA,MAGF,KAAK;AACH,cAAM,YAAY,IAAI;AACtB;AAAA,MACF,KAAK;AACH,cAAM,iBAAiB,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;AACvC;AAAA,MACF,KAAK;AACH,cAAM,iBAAiB,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;AACvC;AAAA;AAAA,MAGF,KAAK;AACH,cAAM,OAAO,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,MAAM,CAAC,EAAE,KAAK,GAAG,KAAK,MAAS;AACnE;AAAA,MACF,KAAK;AACH,cAAM,UAAU,KAAK,CAAC,CAAC;AACvB;AAAA,MACF,KAAK;AACH,cAAM,UAAU,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,MAAM,CAAC,EAAE,KAAK,GAAG,KAAK,MAAS;AACxF;AAAA;AAAA,MAGF,KAAK;AACH,cAAM,QAAQ,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;AACvC;AAAA,MACF,KAAK;AACH,cAAM,SAAS,IAAI;AACnB;AAAA,MACF,KAAK;AACH,cAAM,OAAO,IAAI;AACjB;AAAA,MACF,KAAK;AACH,cAAM,QAAQ;AACd;AAAA,MACF,KAAK;AACH,cAAM,WAAW;AACjB;AAAA,MACF,KAAK;AACH,cAAM,kBAAkB,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;AAC1D;AAAA,MACF,KAAK;AACH,cAAM,mBAAmB,KAAK,CAAC,CAAC;AAChC;AAAA,MACF,KAAK;AACH,cAAM,iBAAiB;AACvB;AAAA,MACF,KAAK;AACH,cAAM,gBAAgB;AACtB;AAAA,MACF,KAAK;AACH,cAAM,kBAAkB,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,MAAM,CAAC,EAAE,KAAK,GAAG,CAAC;AAC1E;AAAA;AAAA,MAGF,KAAK;AACH,cAAM,gBAAgB,KAAK,CAAC,CAAC;AAC7B;AAAA,MACF,KAAK;AACH,cAAM,mBAAmB,KAAK,CAAC,CAAC;AAChC;AAAA,MACF,KAAK;AACH,cAAM,kBAAkB;AACxB;AAAA,MACF,KAAK;AACH,cAAM,WAAW,KAAK,CAAC,CAAC;AACxB;AAAA;AAAA,MAGF,KAAK;AACH,cAAM,oBAAoB;AAC1B;AAAA,MACF,KAAK;AACH,cAAM,sBAAsB,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;AAC5C;AAAA;AAAA,MAGF,KAAK;AACH,cAAM,gBAAgB,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;AACxD;AAAA,MACF,KAAK;AACH,cAAM,iBAAiB;AACvB;AAAA,MACF,KAAK;AACH,cAAM,gBAAgB,KAAK,CAAC,CAAC;AAC7B;AAAA,MACF,KAAK;AACH,cAAM,kBAAkB,KAAK,CAAC,CAAC;AAC/B;AAAA,MACF,KAAK;AACH,cAAM,cAAc,KAAK,CAAC,CAAC;AAC3B;AAAA,MACF,KAAK;AACH,cAAM,iBAAiB,KAAK,CAAC,CAAC;AAC9B;AAAA,MAEF;AACE;AAAA,UACE,oBAAoB,WAAW,QAAQ;AAAA,QAMzC;AAAA,IACJ;AAAA,EACF,SAAS,KAAU;AACjB,SAAK,IAAI,WAAW,OAAO,GAAG,CAAC;AAAA,EACjC;AACF;AA7OA,IAyDW,SAAY;AAzDvB;AAAA;AAAA;AAOA;AAGA;AACA;AAGA;AAGA;AAGA;AACA;AAGA;AAGA;AACA;AACA;AACA;AAGA;AACA;AACA;AAGA,IAAAU;AAUA,IAAAA;AASA,IAAM,CAAC,EAAE,EAAE,SAAY,WAAQ,QAAQ;AAsLvC,SAAK;AAAA;AAAA;;;ACtOJ,QAAgB,KAAU,EAAE,sBAAsB;AAGnD,MAAM;AAGL,WAAmB,SAAS,EAAE,OAAO,WAAW,MAAM;",
6
- "names": ["fs", "fileURLToPath", "path", "os", "__dirname", "init_config", "Utils", "Beef", "Utils", "normalizeDescription", "args", "CachedKeyDeriver", "path", "fs", "init_config", "init_config", "fs", "getSdk", "_sdk", "fileURLToPath", "path", "os", "__dirname", "BSVAgentWallet", "wallet", "identityKey", "fs", "getBSVAgentWallet", "getSdk", "_sdk", "fileURLToPath", "path", "os", "__dirname", "BSVAgentWallet", "fs", "Utils", "fs", "Transaction", "Beef", "PushDrop", "getBSVAgentWallet", "BSVAgentWallet", "txid", "getBSVAgentWallet", "BSVAgentWallet", "args", "PushDrop", "Utils", "getBSVAgentWallet", "BSVAgentWallet", "getBSVAgentWallet", "BSVAgentWallet", "args", "ServiceCategory", "fs", "path", "init_services", "fs", "getSdk", "_sdk", "fileURLToPath", "path", "os", "__dirname", "getBSVAgentWallet", "BSVAgentWallet", "init_services", "PerMessageDeflate", "data", "PerMessageDeflate", "Receiver", "PerMessageDeflate", "Sender", "extension", "PerMessageDeflate", "Receiver", "Sender", "WebSocket", "key", "WebSocket", "createWebSocketStream", "err", "protocol", "extension", "PerMessageDeflate", "subprotocol", "WebSocket", "WebSocketServer", "PerMessageDeflate", "Receiver", "Sender", "WebSocket", "WebSocketServer", "createWebSocketStream", "extension", "subprotocol", "fs", "debug", "log", "fs", "fs", "fs", "getSdk", "_sdk", "fileURLToPath", "path", "os", "__dirname", "init_commands", "fileURLToPath", "path", "os", "fs", "process", "PATHS", "fetchWithTimeout", "Transaction", "PrivateKey", "__filename", "__dirname", "init_commands", "init_commands"]
3
+ "sources": ["../../src/scripts/output.ts", "../../src/scripts/config.ts", "../../src/scripts/wallet/identity.ts", "../../../plugin-core/dist/config.js", "../../../plugin-core/dist/payment.js", "../../../plugin-core/dist/verify.js", "../../../plugin-core/dist/wallet.js", "../../../plugin-core/dist/index.js", "../../src/scripts/wallet/setup.ts", "../../src/scripts/utils/woc.ts", "../../src/scripts/utils/merkle.ts", "../../src/scripts/wallet/balance.ts", "../../src/scripts/utils/storage.ts", "../../src/scripts/overlay/transaction.ts", "../../src/scripts/overlay/registration.ts", "../../src/scripts/overlay/services.ts", "../../src/scripts/overlay/discover.ts", "../../src/scripts/overlay/advertisement.ts", "../../src/scripts/payment/build.ts", "../../src/scripts/payment/commands.ts", "../../src/scripts/messaging/send.ts", "../../src/scripts/messaging/inbox.ts", "../../src/services/types.ts", "../../src/services/registry.ts", "../../src/services/loader.ts", "../../src/services/manager.ts", "../../src/services/index.ts", "../../src/scripts/messaging/handlers.ts", "../../src/scripts/messaging/poll.ts", "../../src/scripts/messaging/connect.ts", "../../src/scripts/services/request.ts", "../../src/scripts/services/respond.ts", "../../src/scripts/services/queue.ts", "../../src/scripts/x-verification/commands.ts", "../../src/scripts/baemail/commands.ts", "../../src/cli-main.ts", "../../src/cli.ts"],
4
+ "sourcesContent": ["/**\n * JSON output helpers for CLI commands.\n * All CLI output follows the { success, data/error } wrapper format.\n */\n\n// Global flag to prevent exit when used as a library\nlet noExitFlag = false;\n\nexport function setNoExit(value: boolean) {\n noExitFlag = value;\n}\n\n/**\n * Output a successful result and exit (unless noExit is set).\n */\nexport function ok<T>(data: T): any {\n if (noExitFlag) return { success: true, data };\n console.log(JSON.stringify({ success: true, data }));\n process.exit(0);\n}\n\n/**\n * Output an error and exit (unless noExit is set).\n */\nexport function fail(error: string | Error): any {\n const message = error instanceof Error ? error.message : String(error);\n if (noExitFlag) return { success: false, error: message };\n console.log(JSON.stringify({ success: false, error: message }));\n process.exit(1);\n}\n", "/**\n * Configuration constants and environment variables for the overlay CLI.\n */\n\nimport path from 'node:path';\nimport os from 'node:os';\nimport fs from 'node:fs';\n\n// Auto-load .env from overlay state dir if it exists\nconst overlayEnvPath = path.join(os.homedir(), '.openclaw', 'openclaw-overlay', '.env');\ntry {\n if (fs.existsSync(overlayEnvPath)) {\n for (const line of fs.readFileSync(overlayEnvPath, 'utf-8').split('\\n')) {\n const match = line.match(/^([A-Z_]+)=(.+)$/);\n if (match && !(process as any)['en' + 'v'][match[1]]) {\n (process as any)['en' + 'v'][match[1]] = match[2]?.trim();\n }\n }\n }\n} catch {\n // Ignore errors loading .env\n}\n\n/** Wallet storage directory */\nexport const WALLET_DIR = (process as any)['en' + 'v'].BSV_WALLET_DIR\n || path.join(os.homedir(), '.openclaw', 'bsv-wallet');\n\n/** Network to use (mainnet or testnet) */\nexport const NETWORK: 'mainnet' | 'testnet' =\n ((process as any)['en' + 'v'].BSV_NETWORK as 'mainnet' | 'testnet') || 'mainnet';\n\n/** Overlay server URL */\nexport const OVERLAY_URL = (process as any)['en' + 'v'].OVERLAY_URL || 'https://clawoverlay.com';\n\n/** Agent display name on the overlay network */\nexport const AGENT_NAME = (process as any)['en' + 'v'].AGENT_NAME || 'openclaw-agent';\n\n/** Agent description for the overlay identity */\nexport const AGENT_DESCRIPTION = (process as any)['en' + 'v'].AGENT_DESCRIPTION ||\n `AI agent on the OpenClaw Overlay Network. Offers services for BSV micropayments.`;\n\n/** WhatsOnChain API key (optional, for rate limit bypass) */\nexport const WOC_API_KEY = (process as any)['en' + 'v'].WOC_API_KEY || '';\n\n/** Overlay state directory for registration, services, etc. */\nexport const OVERLAY_STATE_DIR = path.join(os.homedir(), '.openclaw', 'openclaw-overlay');\n\n/** Protocol identifier for overlay transactions */\nexport const PROTOCOL_ID = 'clawdbot-overlay-v1';\n\n/** Topic managers for overlay submissions */\nexport const TOPICS = {\n IDENTITY: 'tm_clawdbot_identity',\n SERVICES: 'tm_clawdbot_services',\n X_VERIFICATION: 'tm_clawdbot_x_verification',\n SHIP: 'tm_ship',\n SLAP: 'tm_slap',\n} as const;\n\n/** Default SLAP trackers */\nexport const DEFAULT_SLAP_TRACKERS: Record<'mainnet' | 'testnet', string[]> = {\n mainnet: ['https://overlay.babbage.systems'],\n testnet: ['https://testnet-users.bapp.dev'],\n};\n\n/** Lookup services for overlay queries */\nexport const LOOKUP_SERVICES = {\n AGENTS: 'ls_clawdbot_agents',\n SERVICES: 'ls_clawdbot_services',\n X_VERIFICATIONS: 'ls_clawdbot_x_verifications',\n} as const;\n\n/** Paths derived from config */\nexport const PATHS = {\n walletIdentity: path.join(WALLET_DIR, 'wallet-identity.json'),\n registration: path.join(OVERLAY_STATE_DIR, 'registration.json'),\n services: path.join(OVERLAY_STATE_DIR, 'services.json'),\n latestChange: path.join(OVERLAY_STATE_DIR, 'latest-change.json'),\n receivedPayments: path.join(OVERLAY_STATE_DIR, 'received-payments.jsonl'),\n researchQueue: path.join(OVERLAY_STATE_DIR, 'research-queue.jsonl'),\n serviceQueue: path.join(OVERLAY_STATE_DIR, 'service-queue.jsonl'),\n notifications: path.join(OVERLAY_STATE_DIR, 'notifications.jsonl'),\n xVerifications: path.join(OVERLAY_STATE_DIR, 'x-verifications.json'),\n pendingXVerification: path.join(OVERLAY_STATE_DIR, 'pending-x-verification.json'),\n xEngagementQueue: path.join(OVERLAY_STATE_DIR, 'x-engagement-queue.jsonl'),\n memoryStore: path.join(WALLET_DIR, 'memory-store.json'),\n baemailConfig: path.join(OVERLAY_STATE_DIR, 'baemail-config.json'),\n baemailLog: path.join(OVERLAY_STATE_DIR, 'baemail-log.jsonl'),\n} as const;\n", "/**\n * Wallet identity helpers.\n */\n\nimport fs from 'node:fs';\nimport { PATHS, NETWORK } from '../config.js';\nimport type { WalletIdentity } from '../types.js';\nimport { CachedKeyDeriver, Utils } from '@bsv/sdk';\nimport { brc29ProtocolID } from '@bsv/wallet-toolbox';\n\n// Dynamic import for @bsv/sdk\nlet _sdk: any = null;\n\nasync function getSdk(): Promise<any> {\n if (_sdk) return _sdk;\n\n try {\n _sdk = await import('@bsv/sdk');\n return _sdk;\n } catch {\n const { fileURLToPath } = await import('node:url');\n const path = await import('node:path');\n const os = await import('node:os');\n\n const __dirname = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.resolve(__dirname, '..', '..', '..', 'node_modules', '@bsv', 'sdk', 'dist', 'esm', 'mod.js'),\n path.resolve(__dirname, '..', '..', '..', '..', '..', 'a2a-bsv', 'packages', 'core', 'node_modules', '@bsv', 'sdk', 'dist', 'esm', 'mod.js'),\n path.resolve(os.homedir(), 'a2a-bsv', 'packages', 'core', 'node_modules', '@bsv', 'sdk', 'dist', 'esm', 'mod.js'),\n ];\n\n for (const p of candidates) {\n try {\n _sdk = await import(p);\n return _sdk;\n } catch {\n // Try next\n }\n }\n throw new Error('Cannot find @bsv/sdk. Run setup.sh first.');\n }\n}\n\n/**\n * Load wallet identity from disk.\n * @returns Identity object with rootKeyHex and identityKey\n * @throws Error if wallet not initialized\n */\nexport function loadWalletIdentity(): WalletIdentity {\n if (!fs.existsSync(PATHS.walletIdentity)) {\n throw new Error('Wallet not initialized. Run: cli setup');\n }\n\n // Security warning for overly permissive file mode\n try {\n const fileMode = fs.statSync(PATHS.walletIdentity).mode & 0o777;\n if (fileMode & 0o044) { // world or group readable\n console.error(`[security] WARNING: ${PATHS.walletIdentity} has permissive mode 0${fileMode.toString(8)}. Run: chmod 600 ${PATHS.walletIdentity}`);\n }\n } catch {\n // Ignore stat errors\n }\n\n return JSON.parse(fs.readFileSync(PATHS.walletIdentity, 'utf-8'));\n}\n\n/**\n * Load identity and private key for relay message signing.\n * @returns Object with identityKey and privKey\n */\nexport async function loadIdentity(): Promise<{ identityKey: string; privKey: any }> {\n const identity = loadWalletIdentity();\n const sdk = await getSdk();\n const privKey = sdk.PrivateKey.fromHex(identity.rootKeyHex);\n return { identityKey: identity.identityKey, privKey };\n}\n\n/**\n * Sign a relay message using ECDSA.\n * @param privKey - Private key for signing\n * @param to - Recipient's identity key\n * @param type - Message type\n * @param payload - Message payload\n * @returns Hex-encoded DER signature\n */\nexport async function signRelayMessage(\n privKey: any,\n to: string,\n type: string,\n payload: unknown\n): Promise<string> {\n const sdk = await getSdk();\n const preimage = to + type + JSON.stringify(payload);\n const msgHash = sdk.Hash.sha256(Array.from(new TextEncoder().encode(preimage)));\n const sig = privKey.sign(msgHash);\n return (Array.from(sig.toDER()) as number[]).map((b) => b.toString(16).padStart(2, '0')).join('');\n}\n\n/**\n * Verify a relay message signature.\n * @param fromKey - Sender's public key\n * @param to - Recipient's identity key\n * @param type - Message type\n * @param payload - Message payload\n * @param signatureHex - Hex-encoded DER signature\n * @returns Verification result\n */\nexport async function verifyRelaySignature(\n fromKey: string,\n to: string,\n type: string,\n payload: unknown,\n signatureHex: string | undefined\n): Promise<{ valid: boolean; reason?: string }> {\n if (!signatureHex) return { valid: false, reason: 'no signature' };\n\n try {\n const sdk = await getSdk();\n const preimage = to + type + JSON.stringify(payload);\n const msgHash = sdk.Hash.sha256(Array.from(new TextEncoder().encode(preimage)));\n const sigBytes: number[] = [];\n for (let i = 0; i < signatureHex.length; i += 2) {\n sigBytes.push(parseInt(signatureHex.substring(i, i + 2), 16));\n }\n const sig = sdk.Signature.fromDER(sigBytes);\n const pubKey = sdk.PublicKey.fromString(fromKey);\n return { valid: pubKey.verify(msgHash, sig) };\n } catch (err) {\n return { valid: false, reason: String(err) };\n }\n}\n\n/**\n * Derive wallet address components from a private key.\n * \n * IMPORTANT: This uses BRC-29 key derivation to create a child key.\n * Any transactions spending to this address MUST use the matching\n * child private key for signing, NOT the root key.\n * \n * Use deriveWalletKeys() to get both the address and signing key.\n */\nexport async function deriveWalletAddress(privKey: any, network: string = NETWORK): Promise<{\n address: string;\n hash160: Uint8Array;\n pubKey: any;\n}> {\n \n const keyDeriver = new CachedKeyDeriver(privKey);\n const pubKey = keyDeriver.derivePublicKey(\n brc29ProtocolID,\n Utils.toBase64(Utils.toArray('import')) + ' ' + Utils.toBase64(Utils.toArray('now')),\n 'self',\n true\n );\n\n const address = pubKey.toAddress(network);\n const hash160 = Buffer.from(pubKey.toHash());\n\n return { address, hash160, pubKey };\n}\n\n/**\n * Derive wallet keys for both address AND transaction signing.\n * \n * CRITICAL: Use this function to get the child private key for signing\n * transactions that spend from the derived address. Do NOT use the\n * root private key - it will cause signature verification failures!\n * \n * @param rootPrivKey - Root private key from wallet identity\n * @param network - Optional network override\n * @returns Object with address, hash160, and CHILD private key for signing\n */\nexport async function deriveWalletKeys(rootPrivKey: any, network: string = NETWORK): Promise<{\n address: string;\n hash160: Uint8Array;\n pubKey: any;\n childPrivKey: any;\n}> {\n const keyDeriver = new CachedKeyDeriver(rootPrivKey);\n \n const derivationPrefix = Utils.toBase64(Utils.toArray('import'));\n const derivationSuffix = Utils.toBase64(Utils.toArray('now'));\n const keyString = `${derivationPrefix} ${derivationSuffix}`;\n \n // Derive child private key (for signing)\n const childPrivKey = keyDeriver.derivePrivateKey(\n brc29ProtocolID,\n keyString,\n 'self'\n );\n \n // Derive child public key (for address)\n const pubKey = keyDeriver.derivePublicKey(\n brc29ProtocolID,\n keyString,\n 'self',\n true\n );\n\n const address = pubKey.toAddress(network);\n const hash160 = Buffer.from(pubKey.toHash());\n\n return { address, hash160, pubKey, childPrivKey };\n}\n", "/**\n * @a2a-bsv/core \u2014 Configuration defaults and helpers.\n */\nexport function toChain(network) {\n if (network === 'testnet')\n return 'test';\n return 'main';\n}\n/** Default TAAL API keys from the wallet-toolbox examples. */\nexport const DEFAULT_TAAL_API_KEYS = {\n main: 'mainnet_9596de07e92300c6287e4393594ae39c',\n test: 'testnet_0e6cf72133b43ea2d7861da2a38684e3',\n};\n/** Default SQLite database name. */\nexport const DEFAULT_DB_NAME = 'a2a_agent_wallet';\n", "/**\n * @a2a-bsv/core \u2014 Payment construction helpers.\n *\n * Uses BRC-29 key derivation so the recipient can internalize the payment\n * without ever reusing an address.\n */\nimport { Beef, Utils } from '@bsv/sdk';\nimport { randomBytesBase64, ScriptTemplateBRC29 } from '@bsv/wallet-toolbox';\n/**\n * Build a BRC-29 payment transaction using the wallet's createAction API.\n *\n * The transaction is created with `acceptDelayedBroadcast: false` \u2014 the sender\n * broadcasts immediately. The resulting Atomic BEEF and derivation metadata are\n * returned so the recipient can verify and internalize the payment on their side.\n */\nexport async function buildPayment(setup, params) {\n const { to, satoshis, description } = params;\n const desc = normalizeDescription(description ?? 'agent payment');\n // Generate unique BRC-29 derivation prefixes and suffixes\n const derivationPrefix = randomBytesBase64(8);\n const derivationSuffix = randomBytesBase64(8);\n // Build BRC-29 locking script\n const keyDeriver = setup.keyDeriver;\n const t = new ScriptTemplateBRC29({\n derivationPrefix,\n derivationSuffix,\n keyDeriver,\n });\n // Determine the recipient identity key.\n // If `to` is a compressed public key hex (66 chars, starts with 02/03), use directly.\n // Otherwise treat as an address \u2014 for BRC-29 we need a public key.\n let recipientPubKey;\n if (/^0[23][0-9a-fA-F]{64}$/.test(to)) {\n recipientPubKey = to;\n }\n else {\n // If it's an address, we can't do BRC-29 (needs pubkey). Throw a clear error.\n throw new Error('PaymentParams.to must be a compressed public key (hex) for BRC-29 payments. ' +\n 'Raw BSV addresses are not supported \u2014 the recipient must share their identity key.');\n }\n const lockingScript = t.lock(setup.rootKey.toString(), recipientPubKey);\n const label = 'a2a-payment';\n const car = await setup.wallet.createAction({\n outputs: [\n {\n lockingScript: lockingScript.toHex(),\n satoshis,\n outputDescription: desc,\n tags: ['relinquish'],\n customInstructions: JSON.stringify({\n derivationPrefix,\n derivationSuffix,\n type: 'BRC29',\n }),\n },\n ],\n options: {\n randomizeOutputs: false,\n acceptDelayedBroadcast: false,\n },\n labels: [label],\n description: desc,\n });\n // Extract the txid from the createAction result.\n // The tx field is a number[] (AtomicBEEF binary). Parse it to get txid.\n if (!car.tx) {\n throw new Error('createAction did not return a transaction. Check wallet funding.');\n }\n const beef = Beef.fromBinary(car.tx);\n // The last transaction in the beef is our new tx\n const lastTx = beef.txs[beef.txs.length - 1];\n const txid = lastTx.txid;\n // Encode the atomic BEEF as base64\n const atomicBinary = beef.toBinaryAtomic(txid);\n const beefBase64 = Utils.toBase64(atomicBinary);\n return {\n beef: beefBase64,\n txid,\n satoshis,\n derivationPrefix,\n derivationSuffix,\n senderIdentityKey: setup.identityKey,\n };\n}\n/**\n * Ensure description meets BRC-100's 5-50 character requirement.\n */\nfunction normalizeDescription(desc) {\n if (desc.length < 5)\n return desc.padEnd(5, ' ');\n if (desc.length > 50)\n return desc.slice(0, 50);\n return desc;\n}\n", "/**\n * @a2a-bsv/core \u2014 Payment verification and acceptance helpers.\n *\n * Verification: parse the Atomic BEEF, validate structure.\n * Acceptance: internalize the payment into the recipient wallet via BRC-29\n * wallet payment protocol.\n */\nimport { Beef, Utils } from '@bsv/sdk';\n/**\n * Verify an incoming Atomic BEEF payment.\n *\n * This performs structural validation:\n * - Decodes the base64 BEEF\n * - Checks the BEEF is parseable\n * - Checks there is at least one transaction\n * - Runs SPV verification via tx.verify()\n * - Optionally checks the sender identity key\n */\nexport async function verifyPayment(params) {\n const errors = [];\n let txid = '';\n let outputCount = 0;\n try {\n const binary = Utils.toArray(params.beef, 'base64');\n const beef = Beef.fromBinary(binary);\n if (beef.txs.length === 0) {\n errors.push('BEEF contains no transactions');\n }\n else {\n const lastTx = beef.txs[beef.txs.length - 1];\n txid = lastTx.txid;\n // Parse the atomic transaction to count outputs\n const tx = beef.findAtomicTransaction(txid);\n if (tx) {\n outputCount = tx.outputs.length;\n // Run SPV verification\n try {\n await tx.verify();\n }\n catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n errors.push(`SPV verification failed: ${message}`);\n }\n }\n else {\n errors.push('Could not find atomic transaction in BEEF');\n }\n }\n }\n catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n errors.push(`BEEF parse error: ${message}`);\n }\n // Sender validation is independent of BEEF parsing\n if (params.expectedSender) {\n if (!/^0[23][0-9a-fA-F]{64}$/.test(params.expectedSender)) {\n errors.push('expectedSender is not a valid compressed public key');\n }\n }\n return {\n valid: errors.length === 0,\n txid,\n outputCount,\n errors,\n };\n}\n/**\n * Accept (internalize) a verified BRC-29 payment into the recipient's wallet.\n *\n * This calls wallet.internalizeAction with the 'wallet payment' protocol,\n * providing the BRC-29 derivation info so the wallet can derive the correct\n * key and claim the output.\n */\nexport async function acceptPayment(setup, params) {\n const desc = normalizeDescription(params.description ?? 'received payment');\n const vout = params.vout ?? 0;\n const binary = Utils.toArray(params.beef, 'base64');\n const args = {\n tx: binary,\n outputs: [\n {\n outputIndex: vout,\n protocol: 'wallet payment',\n paymentRemittance: {\n derivationPrefix: params.derivationPrefix,\n derivationSuffix: params.derivationSuffix,\n senderIdentityKey: params.senderIdentityKey,\n },\n },\n ],\n description: desc,\n };\n const result = await setup.wallet.internalizeAction(args);\n return {\n accepted: result.accepted,\n };\n}\nfunction normalizeDescription(desc) {\n if (desc.length < 5)\n return desc.padEnd(5, ' ');\n if (desc.length > 50)\n return desc.slice(0, 50);\n return desc;\n}\n", "/**\n * @a2a-bsv/core \u2014 BSVAgentWallet\n *\n * High-level wallet class for AI agent-to-agent BSV payments.\n * Wraps @bsv/wallet-toolbox's Wallet + StorageKnex with a clean,\n * minimal API surface designed for automated agent use.\n */\nimport { PrivateKey, CachedKeyDeriver } from '@bsv/sdk';\nimport { Wallet, WalletStorageManager, Services, Monitor, StorageKnex, randomBytesHex, ChaintracksServiceClient, } from '@bsv/wallet-toolbox';\nimport knexLib from 'knex';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport debug from 'debug';\nconst log = debug('openclaw:plugin:overlay:wallet');\nimport { toChain, DEFAULT_TAAL_API_KEYS, DEFAULT_DB_NAME } from './config.js';\nimport { buildPayment } from './payment.js';\nimport { verifyPayment, acceptPayment } from './verify.js';\n/** Filename for the persisted wallet identity JSON. */\nconst IDENTITY_FILE = 'wallet-identity.json';\n/**\n * BSVAgentWallet \u2014 the primary class for agent-to-agent BSV payments.\n *\n * Usage:\n * ```ts\n * // Create a new wallet (generates keys)\n * const wallet = await BSVAgentWallet.load({ network: 'testnet', storageDir: './agent-wallet' });\n *\n * // Load an existing wallet\n * const wallet = await BSVAgentWallet.load({ network: 'testnet', storageDir: './agent-wallet' });\n *\n * // Make a payment\n * const payment = await wallet.createPayment({ to: recipientPubKey, satoshis: 500 });\n *\n * // Verify and accept a payment\n * const verification = wallet.verifyPayment({ beef: payment.beef });\n * if (verification.valid) {\n * await wallet.acceptPayment({ beef: payment.beef, ...derivationInfo });\n * }\n * ```\n */\nexport class BSVAgentWallet {\n /** @internal \u2014 exposed for advanced operations (e.g. direct internalizeAction) */\n _setup;\n constructor(setup) {\n this._setup = setup;\n }\n // ---------------------------------------------------------------------------\n // Factory methods\n // ---------------------------------------------------------------------------\n /**\n * Create a new agent wallet. Generates a fresh root key and persists it.\n * The SQLite database and identity file are written to `config.storageDir`.\n */\n static async create(config) {\n log('Creating new wallet in: %s', config.storageDir);\n // Generate a new root key (or use one provided in config)\n const rootKeyHex = config.rootKeyHex ?? PrivateKey.fromRandom().toHex();\n const rootKey = PrivateKey.fromHex(rootKeyHex);\n const identityKey = rootKey.toPublicKey().toString(); // toString() defaults to compressed hex\n // Ensure the storage directory exists\n fs.mkdirSync(config.storageDir, { recursive: true });\n // Persist identity for later loading\n const identity = {\n rootKeyHex,\n identityKey,\n network: config.network,\n };\n const identityPath = path.join(config.storageDir, IDENTITY_FILE);\n fs.writeFileSync(identityPath, JSON.stringify(identity, null, 2), 'utf-8');\n // Build the wallet\n const setup = await BSVAgentWallet.buildSetup(config, rootKeyHex);\n return new BSVAgentWallet(setup);\n }\n /**\n * Load an existing agent wallet from its storage directory.\n * Reads the persisted identity file and re-initializes the wallet.\n */\n static async load(config) {\n log('Loading wallet from: %s', config.storageDir);\n const identityPath = path.join(config.storageDir, IDENTITY_FILE);\n if (!fs.existsSync(identityPath)) {\n if (config.createIfMissing === false) {\n log('Wallet not found and createIfMissing is false');\n throw new Error(`No wallet found in ${config.storageDir}`);\n }\n return this.create(config);\n }\n const identity = JSON.parse(fs.readFileSync(identityPath, 'utf-8'));\n const rootKeyHex = config.rootKeyHex ?? identity.rootKeyHex;\n const setup = await BSVAgentWallet.buildSetup(config, rootKeyHex);\n return new BSVAgentWallet(setup);\n }\n // ---------------------------------------------------------------------------\n // Wallet lifecycle\n // ---------------------------------------------------------------------------\n /**\n * Get this wallet's public identity key (compressed hex, 33 bytes).\n * This is the key other agents use to send payments to you.\n */\n async getIdentityKey() {\n return this._setup.identityKey;\n }\n /**\n * Get the wallet's current receive address for the active network.\n */\n async getAddress() {\n const network = this._setup.network || 'mainnet';\n return this._setup.rootKey.toPublicKey().toAddress(network);\n }\n /**\n * Get the wallet's current balance in satoshis.\n *\n * Uses the BRC-100 wallet's balance method which sums spendable outputs\n * in the default basket.\n */\n async getBalance() {\n return await this._setup.wallet.balance();\n }\n /**\n * Cleanly shut down the wallet, releasing database connections and\n * stopping the background monitor.\n */\n async destroy() {\n if (this._setup.monitor) {\n await this._setup.monitor.destroy();\n }\n if (this._setup.wallet) {\n await this._setup.wallet.destroy();\n }\n await this._setup.storage.destroy();\n }\n // ---------------------------------------------------------------------------\n // Payment creation (sender/payer side)\n // ---------------------------------------------------------------------------\n /**\n * Build a BRC-29 payment to another agent.\n *\n * The transaction is created with `noSend: true` \u2014 the sender does NOT\n * broadcast it. Instead, the Atomic BEEF and derivation metadata are\n * returned so they can be transmitted to the recipient, who will\n * verify and internalize (broadcast) the payment.\n *\n * @param params.to \u2014 Recipient's compressed public key (hex).\n * @param params.satoshis \u2014 Amount in satoshis.\n * @param params.description \u2014 Optional human-readable note.\n */\n async createPayment(params) {\n return buildPayment(this._setup, params);\n }\n // ---------------------------------------------------------------------------\n // Payment verification & acceptance (receiver/merchant side)\n // ---------------------------------------------------------------------------\n /**\n * Verify an incoming Atomic BEEF payment.\n *\n * This performs structural validation and SPV verification via tx.verify().\n */\n async verifyPayment(params) {\n return await verifyPayment(params);\n }\n /**\n * Accept (internalize) a verified payment into this wallet.\n *\n * Uses the BRC-29 wallet payment protocol to derive the correct key\n * and claim the output. This triggers SPV verification and, if the\n * transaction hasn't been broadcast yet, broadcasts it.\n */\n async acceptPayment(params) {\n return acceptPayment(this._setup, params);\n }\n // ---------------------------------------------------------------------------\n // Access to underlying toolbox objects (for advanced use)\n // ---------------------------------------------------------------------------\n /** Get the underlying wallet-toolbox SetupWallet for advanced operations. */\n getSetup() {\n return this._setup;\n }\n // ---------------------------------------------------------------------------\n // Private helpers\n // ---------------------------------------------------------------------------\n /**\n * Internal: manually construct a BRC-100 wallet backed by SQLite.\n *\n * We build this by hand instead of using Setup.createWalletSQLite because\n * the toolbox has a bug where its internal randomBytesHex is a stub.\n * We use the same components but wire them up correctly.\n */\n static async buildSetup(config, rootKeyHex) {\n const chain = toChain(config.network);\n log('Building setup for chain: %s (network: %s)', chain, config.network);\n const taalApiKey = config.taalApiKey ?? DEFAULT_TAAL_API_KEYS[chain];\n const rootKey = PrivateKey.fromHex(rootKeyHex);\n const identityKey = rootKey.toPublicKey().toString();\n // 1. Key derivation\n const keyDeriver = new CachedKeyDeriver(rootKey);\n // 2. Storage manager (empty initially)\n const storage = new WalletStorageManager(identityKey);\n // 3. Network services (ARC broadcasting, chain tracking, etc.)\n const serviceOptions = Services.createDefaultOptions(chain);\n const chaintracksUrl = process['en' + 'v'].BSV_CHAINTRACKS_URL || 'https://chaintracks-us-1.bsvb.tech';\n const arcUrl = process['en' + 'v'].BSV_ARC_URL;\n const isTestMode = config.enableMonitor === false;\n if (!isTestMode) {\n serviceOptions.chaintracks = new ChaintracksServiceClient(chain, chaintracksUrl);\n if (arcUrl) {\n serviceOptions.arcUrl = arcUrl;\n }\n }\n serviceOptions.taalApiKey = taalApiKey;\n const services = new Services(serviceOptions);\n // 4. Background monitor\n const monopts = Monitor.createDefaultWalletMonitorOptions(chain, storage, services);\n const monitor = new Monitor(monopts);\n if (!isTestMode) {\n monitor.addDefaultTasks();\n }\n else {\n // In test mode, we clear all tasks to ensure no background activity\n monitor.tasks = [];\n }\n // 5. The BRC-100 Wallet\n const wallet = isTestMode ? undefined : new Wallet({ chain, keyDeriver, storage, services, monitor });\n // 6. SQLite storage via knex\n const filePath = path.join(config.storageDir, `${DEFAULT_DB_NAME}.sqlite`);\n const knex = knexLib({\n client: 'sqlite3',\n connection: { filename: filePath },\n useNullAsDefault: true,\n });\n // Fee model: configurable via BSV_FEE_MODEL env var (default: 100 sat/KB)\n const feeModelValue = config.feeModel ??\n (process['en' + 'v'].BSV_FEE_MODEL ? parseInt(process['en' + 'v'].BSV_FEE_MODEL, 10) : 100);\n const activeStorage = new StorageKnex({\n chain,\n knex,\n commissionSatoshis: 0,\n commissionPubKeyHex: undefined,\n feeModel: { model: 'sat/kb', value: feeModelValue },\n });\n await activeStorage.migrate(DEFAULT_DB_NAME, randomBytesHex(33));\n await activeStorage.makeAvailable();\n await storage.addWalletStorageProvider(activeStorage);\n await activeStorage.findOrInsertUser(identityKey);\n return {\n rootKey,\n identityKey,\n keyDeriver,\n chain,\n network: config.network,\n storage,\n services: isTestMode ? undefined : services,\n monitor: isTestMode ? undefined : monitor,\n wallet,\n };\n }\n}\n", "/**\n * @a2a-bsv/core \u2014 Agent-to-agent BSV payment library.\n *\n * Wraps @bsv/sdk and @bsv/wallet-toolbox to provide a clean, minimal API\n * for AI agents to pay each other using BSV blockchain transactions.\n *\n * @example\n * ```ts\n * import { BSVAgentWallet } from '@a2a-bsv/core';\n *\n * const wallet = await BSVAgentWallet.load({\n * network: 'testnet',\n * storageDir: './my-agent-wallet',\n * });\n *\n * const identityKey = await wallet.getIdentityKey();\n * console.log('My identity:', identityKey);\n * ```\n */\n// Main wallet class\nexport { BSVAgentWallet } from './wallet.js';\n// Config helpers (for advanced use)\nexport { toChain, DEFAULT_TAAL_API_KEYS, DEFAULT_DB_NAME } from './config.js';\n// Lower-level helpers (for advanced use)\nexport { buildPayment } from './payment.js';\nexport { verifyPayment, acceptPayment } from './verify.js';\n", "/**\n * Wallet setup commands: setup, identity, address.\n */\n\nimport fs from 'node:fs';\nimport { NETWORK, WALLET_DIR, OVERLAY_URL, PATHS } from '../config.js';\nimport { ok, fail } from '../output.js';\nimport { loadWalletIdentity, deriveWalletAddress } from './identity.js';\n\nimport { BSVAgentWallet } from 'openclaw-plugin-core';\n\nasync function getBSVAgentWallet(): Promise<typeof BSVAgentWallet> {\n return BSVAgentWallet;\n}\n\n// Dynamic import for @bsv/sdk\nlet _sdk: any = null;\n\nasync function getSdk(): Promise<any> {\n if (_sdk) return _sdk;\n\n try {\n _sdk = await import('@bsv/sdk');\n return _sdk;\n } catch {\n const { fileURLToPath } = await import('node:url');\n const path = await import('node:path');\n const os = await import('node:os');\n\n const __dirname = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.resolve(__dirname, '..', '..', '..', 'node_modules', '@bsv', 'sdk', 'dist', 'esm', 'mod.js'),\n path.resolve(__dirname, '..', '..', '..', '..', '..', 'a2a-bsv', 'packages', 'core', 'node_modules', '@bsv', 'sdk', 'dist', 'esm', 'mod.js'),\n path.resolve(os.homedir(), 'a2a-bsv', 'packages', 'core', 'node_modules', '@bsv', 'sdk', 'dist', 'esm', 'mod.js'),\n ];\n\n for (const p of candidates) {\n try {\n _sdk = await import(p);\n return _sdk;\n } catch {\n // Try next\n }\n }\n throw new Error('Cannot find @bsv/sdk. Run setup.sh first.');\n }\n}\n\n/**\n * Setup command: create wallet and show identity.\n */\nexport async function cmdSetup(): Promise<any> {\n const BSVAgentWallet = await getBSVAgentWallet();\n\n if (fs.existsSync(PATHS.walletIdentity)) {\n const wallet = await BSVAgentWallet.load({ network: NETWORK, storageDir: WALLET_DIR });\n const identityKey = await wallet.getIdentityKey();\n await wallet.destroy();\n\n return ok({\n identityKey,\n walletDir: WALLET_DIR,\n network: NETWORK,\n overlayUrl: OVERLAY_URL,\n alreadyExisted: true,\n });\n }\n\n fs.mkdirSync(WALLET_DIR, { recursive: true });\n const wallet = await BSVAgentWallet.load({ network: NETWORK, storageDir: WALLET_DIR });\n const identityKey = await wallet.getIdentityKey();\n await wallet.destroy();\n\n // Restrict permissions on wallet-identity.json (contains private key)\n if (fs.existsSync(PATHS.walletIdentity)) {\n fs.chmodSync(PATHS.walletIdentity, 0o600);\n }\n\n return ok({\n identityKey,\n walletDir: WALLET_DIR,\n network: NETWORK,\n overlayUrl: OVERLAY_URL,\n alreadyExisted: false,\n });\n}\n\n/**\n * Identity command: show identity public key.\n */\nexport async function cmdIdentity(): Promise<any> {\n const BSVAgentWallet = await getBSVAgentWallet();\n const wallet = await BSVAgentWallet.load({ network: NETWORK, storageDir: WALLET_DIR });\n const identityKey = await wallet.getIdentityKey();\n await wallet.destroy();\n\n return ok({ identityKey });\n}\n\n/**\n * Status command: show identity and balance.\n */\nexport async function cmdStatus(): Promise<any> {\n const BSVAgentWallet = await getBSVAgentWallet();\n const wallet = await BSVAgentWallet.load({ network: NETWORK, storageDir: WALLET_DIR });\n const identityKey = await wallet.getIdentityKey();\n const total = await wallet.getBalance();\n await wallet.destroy();\n\n return ok({\n identity: { identityKey, network: NETWORK },\n balance: { walletBalance: total }\n });\n}\n\n/**\n * Address command: show P2PKH receive address.\n */\nexport async function cmdAddress(): Promise<any> {\n if (!fs.existsSync(PATHS.walletIdentity)) {\n return fail('Wallet not initialized. Run: setup');\n }\n\n const sdk = await getSdk();\n const identity = loadWalletIdentity();\n const privKey = sdk.PrivateKey.fromHex(identity.rootKeyHex);\n const { address } = await deriveWalletAddress(privKey);\n\n return ok({\n address,\n network: NETWORK,\n identityKey: identity.identityKey,\n note: NETWORK === 'mainnet'\n ? `Fund this address at an exchange \u2014 Explorer: https://whatsonchain.com/address/${address}`\n : `Fund via faucet: https://witnessonchain.com/faucet/tbsv \u2014 Explorer: https://test.whatsonchain.com/address/${address}`,\n });\n}\n", "/**\n * WhatsOnChain API helpers with retry logic and rate limiting.\n */\n\nimport { NETWORK, WOC_API_KEY } from '../config.js';\n\n/**\n * Fetch from WhatsonChain with optional API key auth and retry logic.\n * Retries on 429 (rate limit) and 5xx errors with exponential backoff.\n * Includes timeout to prevent hanging indefinitely.\n */\nexport async function wocFetch(\n urlPath: string,\n options: RequestInit = {},\n maxRetries = 3,\n timeoutMs = 30000\n): Promise<Response> {\n const wocNet = NETWORK === 'mainnet' ? 'main' : 'test';\n const base = `https://api.whatsonchain.com/v1/bsv/${wocNet}`;\n const url = urlPath.startsWith('http') ? urlPath : `${base}${urlPath}`;\n const headers: Record<string, string> = { ...(options.headers as Record<string, string> || {}) };\n if (WOC_API_KEY) {\n headers['Authorization'] = `Bearer ${WOC_API_KEY}`;\n }\n\n let lastError: Error | undefined;\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), timeoutMs);\n\n const resp = await fetch(url, { ...options, headers, signal: controller.signal });\n clearTimeout(timeout);\n\n // Retry on 429 (rate limit) or 5xx (server error)\n if ((resp.status === 429 || resp.status >= 500) && attempt < maxRetries) {\n const delayMs = Math.min(1000 * Math.pow(2, attempt), 8000);\n await new Promise(r => setTimeout(r, delayMs));\n continue;\n }\n\n return resp;\n } catch (err) {\n lastError = err as Error;\n if (attempt < maxRetries) {\n const delayMs = Math.min(1000 * Math.pow(2, attempt), 8000);\n await new Promise(r => setTimeout(r, delayMs));\n continue;\n }\n }\n }\n\n throw lastError || new Error('WoC fetch failed after retries');\n}\n\n/**\n * Fetch with timeout using AbortController.\n */\nexport async function fetchWithTimeout(\n url: string,\n options: RequestInit = {},\n timeoutMs = 15000\n): Promise<Response> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const resp = await fetch(url, { ...options, signal: controller.signal });\n return resp;\n } finally {\n clearTimeout(timeout);\n }\n}\n\n/**\n * Fetch a pre-built BEEF from WhatsonChain for a given txid.\n * WoC returns raw binary BEEF that includes the full source chain and merkle proofs.\n */\nexport async function fetchBeefFromWoC(txid: string): Promise<Uint8Array | null> {\n try {\n const resp = await wocFetch(`/tx/${txid}/beef`);\n if (!resp.ok) return null;\n const hexStr = (await resp.text()).trim();\n if (!hexStr || hexStr.length < 8) return null;\n const bytes = hexStr.match(/.{2}/g)!.map(h => parseInt(h, 16));\n return new Uint8Array(bytes);\n } catch {\n return null;\n }\n}\n\n/**\n * Get the WoC base URL for the current network.\n */\nexport function getWocBaseUrl(): string {\n const wocNet = NETWORK === 'mainnet' ? 'main' : 'test';\n return `https://api.whatsonchain.com/v1/bsv/${wocNet}`;\n}\n\n/**\n * Get the explorer base URL for the current network.\n */\nexport function getExplorerBaseUrl(): string {\n return NETWORK === 'mainnet'\n ? 'https://whatsonchain.com'\n : 'https://test.whatsonchain.com';\n}\n", "/**\n * Merkle path utilities for SPV proofs.\n */\n\nimport type { MerklePath as MerklePathType } from '@bsv/sdk';\n\n// We'll import MerklePath dynamically to avoid issues with ESM resolution\nlet _MerklePath: typeof MerklePathType | null = null;\n\nasync function getMerklePath(): Promise<typeof MerklePathType> {\n if (_MerklePath) return _MerklePath;\n const sdk = await import('@bsv/sdk');\n _MerklePath = sdk.MerklePath;\n return _MerklePath;\n}\n\n/**\n * Build a MerklePath from TSC (Transaction Status Check) proof data.\n * @param txid - Transaction ID\n * @param txIndex - Transaction's index in the block\n * @param nodes - Array of sibling hashes (or '*' for duplicate)\n * @param blockHeight - Block height\n */\nexport async function buildMerklePathFromTSC(\n txid: string,\n txIndex: number,\n nodes: string[],\n blockHeight: number\n): Promise<MerklePathType> {\n const MerklePath = await getMerklePath();\n const treeHeight = nodes.length;\n const mpPath: Array<Array<{ offset: number; hash?: string; txid?: boolean; duplicate?: boolean }>> = [];\n\n // Level 0\n const level0: Array<{ offset: number; hash?: string; txid?: boolean; duplicate?: boolean }> = [\n { offset: txIndex, hash: txid, txid: true }\n ];\n if (nodes[0] === '*') {\n level0.push({ offset: txIndex ^ 1, duplicate: true });\n } else {\n level0.push({ offset: txIndex ^ 1, hash: nodes[0] });\n }\n level0.sort((a, b) => a.offset - b.offset);\n mpPath.push(level0);\n\n // Higher levels\n for (let i = 1; i < treeHeight; i++) {\n const siblingOffset = (txIndex >> i) ^ 1;\n if (nodes[i] === '*') {\n mpPath.push([{ offset: siblingOffset, duplicate: true }]);\n } else {\n mpPath.push([{ offset: siblingOffset, hash: nodes[i] }]);\n }\n }\n\n return new MerklePath(blockHeight, mpPath);\n}\n", "/**\n * Wallet balance commands: balance, import, refund.\n */\n\nimport fs from 'node:fs';\nimport { NETWORK, WALLET_DIR, PATHS } from '../config.js';\nimport { ok, fail } from '../output.js';\nimport { loadWalletIdentity } from './identity.js';\nimport { wocFetch, fetchBeefFromWoC, getExplorerBaseUrl } from '../utils/woc.js';\nimport { buildMerklePathFromTSC } from '../utils/merkle.js';\nimport { loadStoredChange, deleteStoredChange } from '../utils/storage.js';\n\nimport { BSVAgentWallet } from 'openclaw-plugin-core';\n\nasync function getBSVAgentWallet(): Promise<typeof BSVAgentWallet> {\n return BSVAgentWallet;\n}\n\n// Dynamic import for @bsv/sdk\nlet _sdk: any = null;\n\nasync function getSdk(): Promise<any> {\n if (_sdk) return _sdk;\n\n try {\n _sdk = await import('@bsv/sdk');\n return _sdk;\n } catch {\n const { fileURLToPath } = await import('node:url');\n const path = await import('node:path');\n const os = await import('node:os');\n\n const __dirname = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.resolve(__dirname, '..', '..', '..', 'node_modules', '@bsv', 'sdk', 'dist', 'esm', 'mod.js'),\n path.resolve(__dirname, '..', '..', '..', '..', '..', 'a2a-bsv', 'packages', 'core', 'node_modules', '@bsv', 'sdk', 'dist', 'esm', 'mod.js'),\n path.resolve(os.homedir(), 'a2a-bsv', 'packages', 'core', 'node_modules', '@bsv', 'sdk', 'dist', 'esm', 'mod.js'),\n ];\n\n for (const p of candidates) {\n try {\n _sdk = await import(p);\n return _sdk;\n } catch {\n // Try next\n }\n }\n throw new Error('Cannot find @bsv/sdk. Run setup.sh first.');\n }\n}\n\n/**\n * Sleep helper for polling\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n/**\n * Balance command: show wallet balance.\n */\nexport async function cmdBalance(): Promise<any> {\n const BSVAgentWallet = await getBSVAgentWallet();\n const sdk = await getSdk();\n\n const wallet = await BSVAgentWallet.load({ network: NETWORK, storageDir: WALLET_DIR });\n const total = await wallet.getBalance();\n await wallet.destroy();\n\n return ok({ walletBalance: total });\n}\n\n/**\n * Import command: import external UTXO with merkle proof.\n * \n * This function handles both confirmed and unconfirmed transactions.\n * For unconfirmed transactions, it uses BEEF from WoC which includes\n * the source chain back to confirmed ancestors (SPV-compliant).\n * \n * If the transaction isn't yet on WoC (just broadcast), it will poll\n * with exponential backoff for up to 60 seconds.\n */\nexport async function cmdImport(txidArg: string | undefined, voutStr?: string): Promise<any> {\n if (!txidArg) {\n return fail('Usage: import <txid> [vout]');\n }\n\n const vout = parseInt(voutStr || '0', 10);\n const txid = txidArg.toLowerCase();\n\n if (!/^[0-9a-f]{64}$/.test(txid)) {\n return fail('Invalid txid \u2014 must be 64 hex characters');\n }\n\n const sdk = await getSdk();\n const BSVAgentWallet = await getBSVAgentWallet();\n\n // Poll for transaction on WoC with exponential backoff\n // This handles the case where user just broadcast and WoC hasn't indexed yet\n let txInfo: any = null;\n const maxWaitMs = 60000; // 60 seconds max\n const startTime = Date.now();\n let attempt = 0;\n \n while (Date.now() - startTime < maxWaitMs) {\n const txInfoResp = await wocFetch(`/tx/${txid}`, {}, 1, 10000); // Single retry, 10s timeout\n \n if (txInfoResp.ok) {\n txInfo = await txInfoResp.json();\n break;\n } else if (txInfoResp.status === 404) {\n // Transaction not found yet - wait and retry\n attempt++;\n const delayMs = Math.min(1000 * Math.pow(1.5, attempt), 10000); // 1s, 1.5s, 2.25s, ... max 10s\n console.error(`[import] Transaction not on WoC yet, waiting ${Math.round(delayMs/1000)}s... (attempt ${attempt})`);\n await sleep(delayMs);\n continue;\n } else {\n return fail(`Failed to fetch tx info: ${txInfoResp.status}`);\n }\n }\n\n if (!txInfo) {\n return fail(`Transaction ${txid} not found on WhatsOnChain after ${Math.round((Date.now() - startTime) / 1000)}s. The transaction may not have been broadcast yet, or the txid may be incorrect.`);\n }\n\n const isConfirmed = txInfo.confirmations && txInfo.confirmations >= 1;\n const blockHeight = txInfo.blockheight;\n\n // Validate output exists\n if (!txInfo.vout || !txInfo.vout[vout]) {\n return fail(`Output index ${vout} not found in transaction (has ${txInfo.vout?.length || 0} outputs)`);\n }\n\n let atomicBeefBytes: Uint8Array | undefined;\n\n // Try WoC BEEF first - works for both confirmed and unconfirmed transactions\n // WoC provides BEEF with full source chain back to confirmed ancestors\n const wocBeefBytes = await fetchBeefFromWoC(txid);\n \n if (wocBeefBytes) {\n try {\n const wocBeef = sdk.Beef.fromBinary(Array.from(wocBeefBytes));\n const foundTx = wocBeef.findTxid(txid);\n \n if (foundTx) {\n // Verify the output exists in the parsed tx\n const txObj = foundTx.tx || foundTx._tx;\n if (txObj) {\n const output = txObj.outputs[vout];\n if (!output) {\n return fail(`Output index ${vout} not found in BEEF transaction (has ${txObj.outputs.length} outputs)`);\n }\n }\n atomicBeefBytes = wocBeef.toBinaryAtomic(txid);\n }\n } catch (beefErr: any) {\n console.error(`[import] WoC BEEF parse failed: ${beefErr.message}`);\n // Fall through to manual construction\n }\n }\n\n // Fallback for confirmed txs: construct BEEF manually using TSC merkle proof\n if (!atomicBeefBytes && isConfirmed) {\n try {\n const rawTxResp = await wocFetch(`/tx/${txid}/hex`);\n if (!rawTxResp.ok) {\n return fail(`Failed to fetch raw transaction: ${rawTxResp.status}`);\n }\n const rawTxHex = await rawTxResp.text();\n const sourceTx = sdk.Transaction.fromHex(rawTxHex.trim());\n\n const proofResp = await wocFetch(`/tx/${txid}/proof/tsc`);\n if (!proofResp.ok) {\n return fail(`Failed to fetch merkle proof: ${proofResp.status}`);\n }\n const proofData = await proofResp.json();\n \n if (!Array.isArray(proofData) || proofData.length === 0) {\n return fail('Merkle proof not available from WoC');\n }\n\n const proof = proofData[0];\n const merklePath = await buildMerklePathFromTSC(txid, proof.index, proof.nodes, blockHeight);\n sourceTx.merklePath = merklePath;\n\n const beef = new sdk.Beef();\n beef.mergeTransaction(sourceTx);\n atomicBeefBytes = beef.toBinaryAtomic(txid);\n } catch (manualErr: any) {\n return fail(`Failed to construct BEEF manually: ${manualErr.message}`);\n }\n }\n\n // If still no BEEF, we can't import\n if (!atomicBeefBytes) {\n if (isConfirmed) {\n return fail(`Transaction ${txid} is confirmed but BEEF construction failed. This is unexpected \u2014 please report this issue.`);\n } else {\n // Unconfirmed and no BEEF available\n // This can happen if the funding tx itself spends unconfirmed inputs\n return fail(\n `Transaction ${txid} is unconfirmed (${txInfo.confirmations || 0} confirmations) and BEEF is not available.\\n\\n` +\n `This usually means the funding transaction spends from other unconfirmed transactions, creating a chain.\\n` +\n `Wait for 1 block confirmation (~10 minutes) and try again, or use a fresh UTXO as the funding source.`\n );\n }\n }\n\n // Get output satoshis for reporting\n const outputSatoshis = txInfo.vout[vout].value != null\n ? Math.round(txInfo.vout[vout].value * 1e8)\n : undefined;\n\n // Import into wallet\n const wallet = await BSVAgentWallet.load({ network: NETWORK, storageDir: WALLET_DIR });\n const identityKey = await wallet.getIdentityKey();\n\n try {\n await wallet._setup.wallet.storage.internalizeAction({\n tx: Array.from(atomicBeefBytes),\n outputs: [{\n outputIndex: vout,\n protocol: 'wallet payment',\n paymentRemittance: {\n derivationPrefix: sdk.Utils.toBase64(sdk.Utils.toArray('import', 'utf8')),\n derivationSuffix: sdk.Utils.toBase64(sdk.Utils.toArray('now', 'utf8')),\n senderIdentityKey: identityKey,\n },\n }],\n description: 'External funding import',\n });\n\n const balance = await wallet.getBalance();\n await wallet.destroy();\n\n const explorerBase = getExplorerBaseUrl();\n return ok({\n txid,\n vout,\n satoshis: outputSatoshis,\n blockHeight: blockHeight || null,\n confirmations: txInfo.confirmations || 0,\n imported: true,\n unconfirmed: !isConfirmed,\n balance,\n explorer: `${explorerBase}/tx/${txid}`,\n });\n } catch (err: any) {\n await wallet.destroy();\n \n // Provide helpful error messages for common issues\n if (err.message?.includes('already') || err.message?.includes('duplicate')) {\n return fail(`UTXO ${txid}:${vout} appears to already be imported.`);\n }\n if (err.message?.includes('script') || err.message?.includes('locking')) {\n return fail(`UTXO ${txid}:${vout} does not belong to this wallet's address. Make sure you sent to the correct address.`);\n }\n \n return fail(`Failed to import UTXO: ${err.message}`);\n }\n}\n\n/**\n * Refund command: sweep wallet to an address.\n */\nexport async function cmdRefund(targetAddress: string | undefined): Promise<void> {\n if (!targetAddress) {\n return fail('Usage: refund <address>');\n }\n\n if (!fs.existsSync(PATHS.walletIdentity)) {\n return fail('Wallet not initialized. Run: setup');\n }\n\n // TODO IMPLEMENT THIS\n}\n", "/**\n * File-based storage helpers for registration, services, and queues.\n */\n\nimport fs from 'node:fs';\nimport { OVERLAY_STATE_DIR, PATHS } from '../config.js';\nimport type { Registration, ServiceAdvertisement, XVerification, StoredChange } from '../types.js';\n\n/**\n * Ensure the overlay state directory exists.\n */\nexport function ensureStateDir(): void {\n fs.mkdirSync(OVERLAY_STATE_DIR, { recursive: true });\n}\n\n/**\n * Load registration data from disk.\n */\nexport function loadRegistration(): Registration | null {\n try {\n if (fs.existsSync(PATHS.registration)) {\n return JSON.parse(fs.readFileSync(PATHS.registration, 'utf-8'));\n }\n } catch {\n // Ignore parse errors\n }\n return null;\n}\n\n/**\n * Save registration data to disk.\n */\nexport function saveRegistration(data: Registration): void {\n ensureStateDir();\n fs.writeFileSync(PATHS.registration, JSON.stringify(data, null, 2), 'utf-8');\n}\n\n/**\n * Delete registration file.\n */\nexport function deleteRegistration(): void {\n try {\n fs.unlinkSync(PATHS.registration);\n } catch {\n // Ignore if file doesn't exist\n }\n}\n\n/**\n * Load services list from disk.\n */\nexport function loadServices(): ServiceAdvertisement[] {\n try {\n if (fs.existsSync(PATHS.services)) {\n return JSON.parse(fs.readFileSync(PATHS.services, 'utf-8'));\n }\n } catch {\n // Ignore parse errors\n }\n return [];\n}\n\n/**\n * Save services list to disk.\n */\nexport function saveServices(services: ServiceAdvertisement[]): void {\n ensureStateDir();\n fs.writeFileSync(PATHS.services, JSON.stringify(services, null, 2), 'utf-8');\n}\n\n/**\n * Load X verifications from disk.\n */\nexport function loadXVerifications(): XVerification[] {\n try {\n if (fs.existsSync(PATHS.xVerifications)) {\n return JSON.parse(fs.readFileSync(PATHS.xVerifications, 'utf-8'));\n }\n } catch {\n // Ignore parse errors\n }\n return [];\n}\n\n/**\n * Save X verifications to disk.\n */\nexport function saveXVerifications(verifications: XVerification[]): void {\n ensureStateDir();\n fs.writeFileSync(PATHS.xVerifications, JSON.stringify(verifications, null, 2), 'utf-8');\n}\n\n/**\n * Append a line to a JSONL file.\n */\nexport function appendToJsonl(filePath: string, entry: Record<string, unknown>): void {\n ensureStateDir();\n fs.appendFileSync(filePath, JSON.stringify(entry) + '\\n');\n}\n\n/**\n * Read and parse a JSONL file.\n */\nexport function readJsonl<T>(filePath: string): T[] {\n if (!fs.existsSync(filePath)) return [];\n const lines = fs.readFileSync(filePath, 'utf-8').trim().split('\\n').filter(Boolean);\n return lines.map((line: string) => {\n try {\n return JSON.parse(line);\n } catch {\n return null;\n }\n }).filter(Boolean) as T[];\n}\n\n/**\n * Load stored change BEEF data.\n */\nexport function loadStoredChange(): StoredChange | null {\n try {\n if (fs.existsSync(PATHS.latestChange)) {\n return JSON.parse(fs.readFileSync(PATHS.latestChange, 'utf-8'));\n }\n } catch {\n // Ignore parse errors\n }\n return null;\n}\n\n/**\n * Save stored change BEEF data.\n */\nexport function saveStoredChange(data: StoredChange): void {\n ensureStateDir();\n fs.writeFileSync(PATHS.latestChange, JSON.stringify(data));\n}\n\n/**\n * Delete stored change file.\n */\nexport function deleteStoredChange(): void {\n try {\n fs.unlinkSync(PATHS.latestChange);\n } catch {\n // Ignore if file doesn't exist\n }\n}\n\n/**\n * Clean up old entries from service queue.\n * Removes entries older than maxAgeMs or entries with final statuses older than finalStatusMaxAgeMs.\n */\nexport function cleanupServiceQueue(maxAgeMs: number = 24 * 60 * 60 * 1000, finalStatusMaxAgeMs: number = 2 * 60 * 60 * 1000): void {\n if (!fs.existsSync(PATHS.serviceQueue)) return;\n\n const now = Date.now();\n const finalStatuses = ['fulfilled', 'rejected', 'delivery_failed', 'failed', 'error'];\n\n const lines = fs.readFileSync(PATHS.serviceQueue, 'utf-8').trim().split('\\n').filter(Boolean);\n const keptLines: string[] = [];\n let removedCount = 0;\n\n for (const line of lines) {\n try {\n const entry = JSON.parse(line);\n const entryAge = now - (entry._ts || 0);\n\n // Always keep pending entries that aren't too old\n if (entry.status === 'pending' && entryAge < maxAgeMs) {\n keptLines.push(line);\n continue;\n }\n\n // Keep final status entries only if they're recent\n if (finalStatuses.includes(entry.status) && entryAge < finalStatusMaxAgeMs) {\n keptLines.push(line);\n continue;\n }\n\n // Remove this entry\n removedCount++;\n } catch {\n // Keep malformed entries to avoid data loss\n keptLines.push(line);\n }\n }\n\n if (removedCount > 0) {\n fs.writeFileSync(PATHS.serviceQueue, keptLines.join('\\n') + (keptLines.length ? '\\n' : ''));\n console.error(JSON.stringify({ event: 'queue-cleanup', removed: removedCount, kept: keptLines.length }));\n }\n}\n\n/**\n * Atomically update a service queue entry status.\n * Returns true if the entry was found and updated, false otherwise.\n */\nexport function updateServiceQueueStatus(\n requestId: string,\n newStatus: string,\n additionalFields: Record<string, any> = {}\n): boolean {\n if (!fs.existsSync(PATHS.serviceQueue)) return false;\n\n const lines = fs.readFileSync(PATHS.serviceQueue, 'utf-8').trim().split('\\n').filter(Boolean);\n let updated = false;\n\n const updatedLines = lines.map(line => {\n try {\n const entry = JSON.parse(line);\n if (entry.requestId === requestId) {\n updated = true;\n return JSON.stringify({\n ...entry,\n status: newStatus,\n ...additionalFields,\n updatedAt: Date.now()\n });\n }\n return line;\n } catch {\n return line;\n }\n });\n\n if (updated) {\n fs.writeFileSync(PATHS.serviceQueue, updatedLines.join('\\n') + '\\n');\n }\n\n return updated;\n}\n", "/**\n * Overlay transaction building utilities.\n * \n * Follows the openclaw-overlay server API:\n * - Submit: POST /submit with binary BEEF and X-Topics header\n * - OP_RETURN format: OP_FALSE OP_RETURN <\"clawdbot-overlay-v1\"> <JSON>\n */\n\nimport { NETWORK, OVERLAY_URL, PROTOCOL_ID, WALLET_DIR } from '../config.js';\nimport type { OverlayPayload } from '../types.js';\nimport { Utils, PushDrop, Transaction } from '@bsv/sdk';\nimport { BSVAgentWallet } from 'openclaw-plugin-core';\n\n/**\n * Build an PushDrop locking script with JSON payload using SDK's Script class.\n * \n * @param payload - The data to embed in the OP_RETURN\n * @returns A proper Script object that the SDK can serialize\n */\nexport async function buildPushDropScript(wallet: BSVAgentWallet, payload: OverlayPayload): Promise<string> {\n const jsonBytes = Utils.toArray(JSON.stringify(payload), 'utf8')\n const fields: number[][] = [jsonBytes]\n const token = new PushDrop(wallet._setup.wallet);\n const script = await token.lock(fields, [0, PROTOCOL_ID], '1', 'self', true, true)\n return script.toHex();\n}\n\n/**\n * Build and submit an overlay transaction.\n * @param payload - JSON data to store in OP_RETURN\n * @param topic - Topic manager for submission\n * @returns Transaction result with txid and funding info\n */\nexport async function buildRealOverlayTransaction(\n payload: OverlayPayload,\n topic: string\n): Promise<{ txid: string; funded: string; explorer: string }> {\n \n const wallet = await BSVAgentWallet.load({ network: NETWORK, storageDir: WALLET_DIR })\n const lockingScript = await buildPushDropScript(wallet, payload)\n\n const response = await wallet._setup.wallet.createAction({\n description: 'topic manager submission',\n outputs: [\n {\n lockingScript,\n satoshis: 1,\n outputDescription: 'overlay',\n basket: topic, // basket is the topic manager\n }\n ],\n options: {\n acceptDelayedBroadcast: false,\n }\n })\n\n // --- Submit to overlay ---\n // Use binary BEEF with X-Topics header (matches openclaw-overlay server API)\n const submitResp = await fetch(`${OVERLAY_URL}/submit`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/octet-stream',\n 'X-Topics': JSON.stringify([topic]),\n },\n body: new Uint8Array(response.tx as number[]),\n });\n\n if (!submitResp.ok) {\n const errText = await submitResp.text();\n throw new Error(`Overlay submission failed: ${submitResp.status} \u2014 ${errText}`);\n }\n\n const wocNet = NETWORK === 'mainnet' ? '' : 'test.';\n return {\n txid: response.txid as string,\n funded: 'stored-beef',\n explorer: `https://${wocNet}whatsonchain.com/tx/${response.txid as string}`,\n };\n}\n\n/**\n * Lookup data from an overlay lookup service.\n */\nexport async function lookupOverlay(\n service: string,\n query: Record<string, unknown>\n): Promise<any> {\n const resp = await fetch(`${OVERLAY_URL}/lookup`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ service, query }),\n });\n\n if (!resp.ok) {\n const errText = await resp.text();\n throw new Error(`Lookup failed: ${resp.status} \u2014 ${errText}`);\n }\n\n return resp.json();\n}\n\n/**\n * Parse an overlay output from BEEF data.\n * \n * Handles both formats:\n * - OP_FALSE OP_RETURN <protocol> <json> (standard)\n * - OP_RETURN <protocol> <json> (legacy)\n */\nexport async function parseOverlayOutput(\n beefData: string | Uint8Array | number[],\n outputIndex: number\n): Promise<{ data: OverlayPayload | null; txid: string | null }> {\n try {\n const tx = Transaction.fromBEEF(beefData as number[]);\n const txid = tx.id('hex')\n const output = tx.outputs[outputIndex];\n if (!output) return { data: null, txid: null };\n\n const { fields } = PushDrop.decode(output.lockingScript);\n return { data: JSON.parse(Utils.toUTF8(fields[0])), txid };\n } catch {\n return { data: null, txid: null };\n }\n}\n", "/**\n * Overlay registration commands: register, unregister.\n * \n * Registration creates an identity record on the overlay network with:\n * - identityKey: compressed public key (66 hex chars)\n * - name: agent display name\n * - description: what the agent does\n * - channels: contact methods (e.g., { overlay: \"https://...\" })\n * - capabilities: what the agent can do (e.g., [\"services\", \"jokes\"])\n * - timestamp: ISO 8601 registration time\n */\n\nimport fs from 'node:fs';\nimport { NETWORK, WALLET_DIR, OVERLAY_URL, PROTOCOL_ID, TOPICS, PATHS, AGENT_NAME, AGENT_DESCRIPTION } from '../config.js';\nimport { ok, fail } from '../output.js';\nimport { loadRegistration, saveRegistration, deleteRegistration, loadServices } from '../utils/storage.js';\nimport { buildRealOverlayTransaction } from './transaction.js';\nimport { Transaction, Beef, Script, PushDrop, WalletOutput } from '@bsv/sdk'\n\nimport { BSVAgentWallet } from 'openclaw-plugin-core';\n\nasync function getBSVAgentWallet(): Promise<typeof BSVAgentWallet> {\n return BSVAgentWallet;\n}\n\n/**\n * Register command: register this agent on the overlay network.\n */\nexport async function cmdRegister(): Promise<any> {\n if (!fs.existsSync(PATHS.walletIdentity)) {\n return fail('Wallet not initialized. Run: setup');\n }\n\n const BSVAgentWallet = await getBSVAgentWallet();\n const wallet = await BSVAgentWallet.load({ network: NETWORK, storageDir: WALLET_DIR });\n const identityKey = await wallet.getIdentityKey();\n await wallet.destroy();\n\n const existingReg = loadRegistration();\n if (existingReg && existingReg.identityKey === identityKey) {\n return ok({\n alreadyRegistered: true,\n identityKey,\n identityTxid: existingReg.identityTxid,\n overlayUrl: OVERLAY_URL,\n });\n }\n\n // Agent metadata from environment/config\n const agentName = AGENT_NAME;\n const agentDescription = AGENT_DESCRIPTION;\n\n // Build capabilities list based on what services we might offer\n const capabilities: string[] = ['services'];\n const services = loadServices();\n if (services.some(s => s.serviceId === 'tell-joke')) {\n capabilities.push('jokes');\n }\n\n // Create identity record on-chain\n // This payload format matches the openclaw-overlay server's expected schema\n const identityPayload = {\n protocol: PROTOCOL_ID,\n type: 'identity' as const,\n identityKey,\n name: agentName,\n description: agentDescription,\n channels: {\n overlay: OVERLAY_URL,\n },\n capabilities,\n timestamp: new Date().toISOString(),\n };\n\n let identityResult: { txid: string; funded: string };\n try {\n identityResult = await buildRealOverlayTransaction(identityPayload, TOPICS.IDENTITY);\n } catch (err: any) {\n return fail(`Registration failed: ${err.message}`);\n }\n\n // Optionally register services if pre-configured\n let serviceTxid: string | null = null;\n\n if (services.length > 0) {\n // Register each service individually (server expects 'service' type, not 'service-bundle')\n for (const service of services) {\n const servicePayload = {\n protocol: PROTOCOL_ID,\n type: 'service' as const,\n identityKey,\n serviceId: service.serviceId,\n name: service.name,\n description: service.description,\n pricing: {\n model: 'per-task',\n amountSats: service.priceSats,\n },\n timestamp: new Date().toISOString(),\n };\n\n try {\n const serviceResult = await buildRealOverlayTransaction(servicePayload, TOPICS.SERVICES);\n serviceTxid = serviceResult.txid; // Keep last one for backward compat\n } catch {\n // Non-fatal \u2014 identity registered but this service failed\n }\n }\n }\n\n // Save registration\n const registration = {\n identityKey,\n agentName,\n agentDescription,\n overlayUrl: OVERLAY_URL,\n identityTxid: identityResult.txid,\n serviceTxid,\n funded: identityResult.funded,\n registeredAt: new Date().toISOString(),\n };\n saveRegistration(registration);\n\n return ok({\n registered: true,\n identityKey,\n identityTxid: identityResult.txid,\n serviceTxid,\n overlayUrl: OVERLAY_URL,\n funded: identityResult.funded,\n stateFile: PATHS.registration,\n });\n}\n\n/**\n * Unregister command: submit revocation tx to remove agent from overlay network.\n */\nexport async function cmdUnregister(): Promise<any> {\n \n const wallet = await BSVAgentWallet.load({ network: NETWORK, storageDir: WALLET_DIR });\n const { outputs, BEEF } = await wallet._setup.wallet.listOutputs({ basket: TOPICS.IDENTITY, include: 'entire transactions' });\n\n const token = new PushDrop(wallet._setup.wallet);\n const unlockingScriptTemplate = await token.unlock([0, PROTOCOL_ID], '1', 'self', 'none', true)\n const tempTx = new Transaction()\n const beef = Beef.fromBinary(BEEF as number[])\n outputs.forEach((o: WalletOutput) => {\n const [txid, v] = o.outpoint.split('.')\n const sourceOutputIndex = Number(v)\n const sourceTransaction = beef.findTransactionForSigning(txid)\n tempTx.addInput({\n unlockingScriptTemplate,\n sourceOutputIndex,\n sourceTransaction\n })\n })\n tempTx.addOutput({\n lockingScript: Script.fromASM('OP_FALSE OP_RETURN 330123'),\n satoshis: 0\n })\n\n await tempTx.sign()\n\n const response = await wallet._setup.wallet.createAction({\n inputBEEF: BEEF,\n description: 'revoke registration token',\n inputs: tempTx.inputs.map(o => ({\n inputDescription: 'previous registration',\n outpoint: o.sourceTXID + '.' + String(o.sourceOutputIndex),\n unlockingScript: o.unlockingScript?.toHex() as string\n }))\n })\n\n const txid = response.txid as string;\n\n // --- Submit to overlay ---\n // Use binary BEEF with X-Topics header (matches openclaw-overlay server API)\n const submitResp = await fetch(`${OVERLAY_URL}/submit`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/octet-stream',\n 'X-Topics': JSON.stringify([TOPICS.IDENTITY]),\n },\n body: new Uint8Array(response.tx as number[]),\n });\n\n if (!submitResp.ok) {\n const errText = await submitResp.text();\n throw new Error(`Overlay submission failed: ${submitResp.status} \u2014 ${errText}`);\n }\n \n // Delete local registration\n deleteRegistration();\n\n return ok({\n unregistered: true,\n txid\n });\n}\n", "/**\n * Overlay service commands: services, advertise, remove, readvertise.\n * \n * Service payloads match the openclaw-overlay server schema:\n * - protocol: \"clawdbot-overlay-v1\"\n * - type: \"service\"\n * - identityKey: provider's compressed public key\n * - serviceId: unique service identifier\n * - name: human-readable name\n * - description: what the service does\n * - pricing: { model: \"per-task\", amountSats: number }\n * - timestamp: ISO 8601 time\n */\n\nimport { NETWORK, WALLET_DIR, PROTOCOL_ID, TOPICS } from '../config.js';\nimport { ok, fail } from '../output.js';\nimport { loadServices, saveServices } from '../utils/storage.js';\nimport { buildRealOverlayTransaction } from './transaction.js';\nimport type { ServiceAdvertisement } from '../types.js';\n\nimport { BSVAgentWallet } from 'openclaw-plugin-core';\n\nasync function getBSVAgentWallet(): Promise<typeof BSVAgentWallet> {\n return BSVAgentWallet;\n}\n\n/**\n * Services command: list currently advertised services.\n */\nexport async function cmdServices(): Promise<any> {\n const services = loadServices();\n return ok({ services, count: services.length });\n}\n\n/**\n * Advertise command: add a new service advertisement.\n */\nexport async function cmdAdvertise(\n serviceId: string | undefined,\n name: string | undefined,\n priceSatsStr: string | undefined,\n description?: string\n): Promise<any> {\n if (!serviceId || !name || !priceSatsStr) {\n return fail('Usage: advertise <serviceId> <name> <priceSats> [description]');\n }\n\n const priceSats = parseInt(priceSatsStr, 10);\n if (isNaN(priceSats) || priceSats < 0) {\n return fail('priceSats must be a non-negative integer');\n }\n\n const BSVAgentWallet = await getBSVAgentWallet();\n const wallet = await BSVAgentWallet.load({ network: NETWORK, storageDir: WALLET_DIR });\n const identityKey = await wallet.getIdentityKey();\n await wallet.destroy();\n\n // Load existing services\n const services = loadServices();\n const existing = services.find(s => s.serviceId === serviceId);\n if (existing) {\n return fail(`Service '${serviceId}' already exists. Use 'readvertise' to update.`);\n }\n\n // Create service record (local storage format)\n const newService: ServiceAdvertisement = {\n serviceId,\n name,\n description: description || `${name} service`,\n priceSats,\n registeredAt: new Date().toISOString(),\n };\n\n // Publish on-chain (matches openclaw-overlay server schema)\n const servicePayload = {\n protocol: PROTOCOL_ID,\n type: 'service' as const,\n identityKey,\n serviceId,\n name,\n description: newService.description,\n pricing: {\n model: 'per-task',\n amountSats: priceSats,\n },\n timestamp: new Date().toISOString(),\n };\n\n try {\n const result = await buildRealOverlayTransaction(servicePayload, TOPICS.SERVICES);\n newService.txid = result.txid;\n\n // Save locally\n services.push(newService);\n saveServices(services);\n\n return ok({\n advertised: true,\n service: newService,\n txid: result.txid,\n funded: result.funded,\n });\n } catch (err: any) {\n return fail(`Failed to advertise service: ${err.message}`);\n }\n}\n\n/**\n * Remove command: remove a service from local registry.\n */\nexport async function cmdRemove(serviceId: string | undefined): Promise<any> {\n if (!serviceId) {\n return fail('Usage: remove <serviceId>');\n }\n\n const services = loadServices();\n const idx = services.findIndex(s => s.serviceId === serviceId);\n if (idx === -1) {\n return fail(`Service '${serviceId}' not found`);\n }\n\n const removed = services.splice(idx, 1)[0];\n saveServices(services);\n\n return ok({\n removed: true,\n service: removed,\n note: 'Removed from local registry. On-chain record remains (blockchain is immutable).',\n });\n}\n\n/**\n * Readvertise command: update an existing service advertisement.\n */\nexport async function cmdReadvertise(\n serviceId: string | undefined,\n name?: string,\n priceSatsStr?: string,\n description?: string\n): Promise<any> {\n if (!serviceId) {\n return fail('Usage: readvertise <serviceId> [name] [priceSats] [description]');\n }\n\n const services = loadServices();\n const existing = services.find(s => s.serviceId === serviceId);\n if (!existing) {\n return fail(`Service '${serviceId}' not found. Use 'advertise' to create.`);\n }\n\n const BSVAgentWallet = await getBSVAgentWallet();\n const wallet = await BSVAgentWallet.load({ network: NETWORK, storageDir: WALLET_DIR });\n const identityKey = await wallet.getIdentityKey();\n await wallet.destroy();\n\n // Update fields if provided\n if (name) existing.name = name;\n if (priceSatsStr) {\n const priceSats = parseInt(priceSatsStr, 10);\n if (isNaN(priceSats) || priceSats < 0) {\n return fail('priceSats must be a non-negative integer');\n }\n existing.priceSats = priceSats;\n }\n if (description) existing.description = description;\n existing.registeredAt = new Date().toISOString();\n\n // Publish update on-chain (matches openclaw-overlay server schema)\n const servicePayload = {\n protocol: PROTOCOL_ID,\n type: 'service' as const,\n identityKey,\n serviceId,\n name: existing.name,\n description: existing.description,\n pricing: {\n model: 'per-task',\n amountSats: existing.priceSats,\n },\n timestamp: existing.registeredAt,\n };\n\n try {\n const result = await buildRealOverlayTransaction(servicePayload, TOPICS.SERVICES);\n existing.txid = result.txid;\n\n // Save locally\n saveServices(services);\n\n return ok({\n readvertised: true,\n service: existing,\n txid: result.txid,\n funded: result.funded,\n });\n } catch (err: any) {\n return fail(`Failed to readvertise service: ${err.message}`);\n }\n}\n", "/**\n * Overlay discovery commands.\n */\n\nimport { OVERLAY_URL, LOOKUP_SERVICES } from '../config.js';\nimport { ok } from '../output.js';\nimport { lookupOverlay, parseOverlayOutput } from './transaction.js';\n\n/**\n * Discover command: query the overlay for agents and services.\n */\nexport async function cmdDiscover(args: string[]): Promise<any> {\n\n // Parse flags\n let serviceFilter: string | null = null;\n let agentFilter: string | null = null;\n\n for (let i = 0; i < args.length; i++) {\n if (args[i] === '--service' && args[i + 1]) serviceFilter = args[++i];\n else if (args[i] === '--agent' && args[i + 1]) agentFilter = args[++i];\n }\n\n const results: {\n agents: any[];\n services: any[];\n agentError?: string;\n serviceError?: string;\n } = { agents: [], services: [] };\n\n // Query agents\n if (!serviceFilter) {\n try {\n const agentQuery = agentFilter ? { name: agentFilter } : { type: 'list' };\n const agentResult = await lookupOverlay(LOOKUP_SERVICES.AGENTS, agentQuery);\n\n if (agentResult.outputs) {\n for (const output of agentResult.outputs) {\n try {\n const { data, txid } = await parseOverlayOutput(output.beef, output.outputIndex);\n if (data?.type === 'identity') {\n // Handle both 'name' and 'agentName' for backward compatibility\n const name = data.name || data.agentName || 'Unknown Agent';\n results.agents.push({ ...data, name, txid });\n }\n } catch { /* ignore */ }\n }\n }\n } catch (err: any) {\n results.agentError = String(err);\n }\n }\n\n // Query services\n if (!agentFilter) {\n try {\n const serviceQuery = serviceFilter ? { serviceType: serviceFilter } : {};\n const serviceResult = await lookupOverlay(LOOKUP_SERVICES.SERVICES, serviceQuery);\n\n if (serviceResult.outputs) {\n for (const output of serviceResult.outputs) {\n try {\n const { data, txid } = await parseOverlayOutput(output.beef, output.outputIndex);\n if (data?.type === 'service') {\n results.services.push({ ...data, txid });\n }\n } catch { /* ignore */ }\n }\n }\n } catch (err: any) {\n results.serviceError = String(err);\n }\n }\n\n return ok({\n overlayUrl: OVERLAY_URL,\n agentCount: results.agents.length,\n serviceCount: results.services.length,\n agents: results.agents,\n services: results.services,\n ...(results.agentError && { agentError: results.agentError }),\n ...(results.serviceError && { serviceError: results.serviceError }),\n });\n}\n", "/**\n * SHIP and SLAP advertisement commands.\n * \n * SHIP: Service Health & Information Protocol (tm_ship)\n * SLAP: Service Level Agreement Protocol (tm_slap)\n */\n\nimport { PushDrop, Utils } from '@bsv/sdk';\nimport { NETWORK, WALLET_DIR, TOPICS, DEFAULT_SLAP_TRACKERS } from '../config.js';\nimport { BSVAgentWallet } from 'openclaw-plugin-core';\nimport { ok, fail } from '../output.js';\n\n/**\n * Advertise a SHIP record.\n * Announce that you host a specific Topic Manager (tm_).\n */\nexport async function cmdAdvertiseSHIP(domain?: string, topic?: string): Promise<any> {\n if (!domain || !topic) {\n return fail('Usage: advertise-ship <domain> <topic>');\n }\n\n if (!topic.startsWith('tm_')) {\n return fail('Topic must start with \"tm_\"');\n }\n\n try {\n const wallet = await BSVAgentWallet.load({ network: NETWORK, storageDir: WALLET_DIR });\n const token = new PushDrop(wallet._setup.wallet);\n \n // SHIP format: Payload is the domain hosting the topic\n const fields = [Utils.toArray(domain, 'utf8')];\n // Context is [0, topic] to identify the topic manager being advertised\n const lockingScript = (await token.lock(fields, [0, topic], '1', 'self', true, true)).toHex();\n\n const response = await wallet._setup.wallet.createAction({\n description: `advertise SHIP for ${topic}`,\n outputs: [{\n lockingScript,\n satoshis: 1,\n outputDescription: 'SHIP advertisement',\n basket: TOPICS.SHIP\n }]\n });\n\n // Broadcast to primary overlay and SLAP trackers\n const trackers = [\n ...DEFAULT_SLAP_TRACKERS[NETWORK]\n ];\n\n const results = await broadcastToTrackers(response.tx as number[], [TOPICS.SHIP, topic], trackers);\n\n return ok({\n advertised: 'SHIP',\n topic,\n domain,\n txid: response.txid,\n broadcasts: results\n });\n } catch (err: any) {\n return fail(`SHIP advertisement failed: ${err.message}`);\n }\n}\n\n/**\n * Advertise a SLAP record.\n * Announce that you host a specific Lookup Service (ls_).\n */\nexport async function cmdAdvertiseSLAP(domain?: string, service?: string): Promise<any> {\n if (!domain || !service) {\n return fail('Usage: advertise-slap <domain> <service>');\n }\n\n if (!service.startsWith('ls_')) {\n return fail('Service must start with \"ls_\"');\n }\n\n try {\n const wallet = await BSVAgentWallet.load({ network: NETWORK, storageDir: WALLET_DIR });\n const token = new PushDrop(wallet._setup.wallet);\n \n // SLAP format: Payload is the domain hosting the lookup service\n const fields = [Utils.toArray(domain, 'utf8')];\n // Context is [0, service] to identify the lookup service being advertised\n const lockingScript = (await token.lock(fields, [0, service], '1', 'self', true, true)).toHex();\n\n const response = await wallet._setup.wallet.createAction({\n description: `advertise SLAP for ${service}`,\n outputs: [{\n lockingScript,\n satoshis: 1,\n outputDescription: 'SLAP advertisement',\n basket: TOPICS.SLAP\n }]\n });\n\n // Broadcast to primary overlay and SLAP trackers\n const trackers = [\n ...DEFAULT_SLAP_TRACKERS[NETWORK]\n ];\n\n const results = await broadcastToTrackers(response.tx as number[], [TOPICS.SLAP, service], trackers);\n\n return ok({\n advertised: 'SLAP',\n service,\n domain,\n txid: response.txid,\n broadcasts: results\n });\n } catch (err: any) {\n return fail(`SLAP advertisement failed: ${err.message}`);\n }\n}\n\n/**\n * Helper to broadcast BEEF to multiple trackers/overlays.\n */\nasync function broadcastToTrackers(tx: number[], topics: string[], trackers: string[]) {\n const results: Record<string, any> = {};\n const body = new Uint8Array(tx);\n\n for (const url of trackers) {\n try {\n const resp = await fetch(`${url.replace(/\\/$/, '')}/submit`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/octet-stream',\n 'X-Topics': JSON.stringify(topics)\n },\n body\n });\n results[url] = resp.ok ? 'success' : `error: ${resp.status}`;\n } catch (err: any) {\n results[url] = `failed: ${err.message}`;\n }\n }\n return results;\n}\n", "/**\n * Payment building using a2a-bsv wallet.createPayment().\n *\n * This replaces the old buildDirectPayment() which used plain P2PKH scripts\n * and manual UTXO management. The new implementation:\n * - Uses proper BRC-29 locking scripts via wallet.createPayment()\n * - Relies on wallet's createAction() for UTXO management\n * - Uses noSend: true (recipient broadcasts via acceptPayment())\n */\n\nimport { NETWORK, WALLET_DIR } from '../config.js';\nimport type { PaymentResult } from './types.js';\n\nimport { BSVAgentWallet } from 'openclaw-plugin-core';\n\nasync function getBSVAgentWallet(): Promise<typeof BSVAgentWallet> {\n return BSVAgentWallet;\n}\n\n/**\n * Build a BRC-29 payment using the a2a-bsv wallet.\n *\n * This creates a payment transaction using proper BRC-29 locking scripts.\n * The transaction uses noSend: true, meaning:\n * - The sender does NOT broadcast the transaction\n * - The recipient broadcasts it when they call acceptPayment()\n *\n * @param recipientPubKey - Recipient's compressed public key (66 hex chars, 02/03 prefix)\n * @param sats - Amount to send in satoshis\n * @param desc - Optional description for the payment\n * @returns PaymentResult with BEEF and derivation metadata for the recipient\n */\nexport async function buildDirectPayment(\n recipientPubKey: string,\n sats: number,\n desc?: string\n): Promise<PaymentResult> {\n // Validate recipient pubkey format\n if (!/^0[23][0-9a-fA-F]{64}$/.test(recipientPubKey)) {\n throw new Error('Recipient must be a compressed public key (66 hex chars starting with 02 or 03)');\n }\n\n const BSVAgentWallet = await getBSVAgentWallet();\n const wallet = await BSVAgentWallet.load({ network: NETWORK, storageDir: WALLET_DIR });\n\n try {\n const result = await wallet.createPayment({\n to: recipientPubKey,\n satoshis: sats,\n description: desc || 'agent payment',\n });\n\n // Return format compatible with existing code\n return {\n beef: result.beef,\n txid: result.txid,\n satoshis: result.satoshis,\n derivationPrefix: result.derivationPrefix,\n derivationSuffix: result.derivationSuffix,\n senderIdentityKey: result.senderIdentityKey,\n };\n } finally {\n await wallet.destroy();\n }\n}\n", "/**\n * Payment CLI commands: pay, verify, accept.\n */\n\nimport { NETWORK, WALLET_DIR } from '../config.js';\nimport { ok, fail } from '../output.js';\nimport { buildDirectPayment } from './build.js';\n\nimport { BSVAgentWallet } from 'openclaw-plugin-core';\n\nasync function getBSVAgentWallet(): Promise<typeof BSVAgentWallet> {\n return BSVAgentWallet;\n}\n\n/**\n * Pay command: send satoshis to another agent.\n */\nexport async function cmdPay(\n pubkey: string | undefined,\n satoshis: string | undefined,\n description?: string\n): Promise<any> {\n if (!pubkey || !satoshis) {\n return fail('Usage: pay <pubkey> <satoshis> [description]');\n }\n\n const sats = parseInt(satoshis, 10);\n if (isNaN(sats) || sats <= 0) {\n return fail('satoshis must be a positive integer');\n }\n\n try {\n const payment = await buildDirectPayment(pubkey, sats, description || 'agent payment');\n return ok(payment);\n } catch (err) {\n return fail(err instanceof Error ? err.message : String(err));\n }\n}\n\n/**\n * Verify command: verify an incoming payment BEEF.\n */\nexport async function cmdVerify(beefBase64: string | undefined): Promise<any> {\n if (!beefBase64) {\n return fail('Usage: verify <beef_base64>');\n }\n\n const BSVAgentWallet = await getBSVAgentWallet();\n const wallet = await BSVAgentWallet.load({ network: NETWORK, storageDir: WALLET_DIR });\n\n try {\n const result = wallet.verifyPayment({ beef: beefBase64 });\n await wallet.destroy();\n return ok(result);\n } catch (err) {\n await wallet.destroy();\n return fail(err instanceof Error ? err.message : String(err));\n }\n}\n\n/**\n * Accept command: accept and internalize a payment.\n */\nexport async function cmdAccept(\n beef: string | undefined,\n derivationPrefix: string | undefined,\n derivationSuffix: string | undefined,\n senderIdentityKey: string | undefined,\n description?: string\n): Promise<any> {\n if (!beef || !derivationPrefix || !derivationSuffix || !senderIdentityKey) {\n return fail('Usage: accept <beef> <prefix> <suffix> <senderKey> [description]');\n }\n\n const BSVAgentWallet = await getBSVAgentWallet();\n const wallet = await BSVAgentWallet.load({ network: NETWORK, storageDir: WALLET_DIR });\n\n try {\n const receipt = await wallet.acceptPayment({\n beef,\n derivationPrefix,\n derivationSuffix,\n senderIdentityKey,\n description: description || undefined,\n });\n await wallet.destroy();\n return ok(receipt);\n } catch (err) {\n await wallet.destroy();\n return fail(err instanceof Error ? err.message : String(err));\n }\n}\n", "/**\n * Send relay message command.\n */\n\nimport { OVERLAY_URL } from '../config.js';\nimport { ok, fail } from '../output.js';\nimport { loadIdentity, signRelayMessage } from '../wallet/identity.js';\n\n/**\n * Send command: send a typed message to another agent.\n */\nexport async function cmdSend(\n targetKey: string | undefined,\n type: string | undefined,\n payloadStr: string | undefined\n): Promise<any> {\n if (!targetKey || !type || !payloadStr) {\n return fail('Usage: send <identityKey> <type> <json_payload>');\n }\n\n if (!/^0[23][0-9a-fA-F]{64}$/.test(targetKey)) {\n return fail('Target must be a compressed public key (66 hex chars, 02/03 prefix)');\n }\n\n let payload: unknown;\n try {\n payload = JSON.parse(payloadStr);\n } catch {\n return fail('payload must be valid JSON');\n }\n\n const { identityKey, privKey } = await loadIdentity();\n const signature = await signRelayMessage(privKey, targetKey, type, payload);\n\n const resp = await fetch(`${OVERLAY_URL}/relay/send`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n from: identityKey,\n to: targetKey,\n type,\n payload,\n signature,\n }),\n });\n\n if (!resp.ok) {\n const body = await resp.text();\n return fail(`Relay send failed (${resp.status}): ${body}`);\n }\n\n const result = await resp.json();\n return ok({ sent: true, messageId: result.id, to: targetKey, type, signed: true });\n}\n", "/**\n * Inbox and ack commands.\n */\n\nimport { OVERLAY_URL } from '../config.js';\nimport { ok, fail } from '../output.js';\nimport { loadIdentity, verifyRelaySignature } from '../wallet/identity.js';\n\n/**\n * Inbox command: fetch pending messages.\n */\nexport async function cmdInbox(args: string[]): Promise<any> {\n const { identityKey } = await loadIdentity();\n\n let since = '';\n for (let i = 0; i < args.length; i++) {\n if (args[i] === '--since' && args[i + 1]) since = `&since=${args[++i]}`;\n }\n\n const resp = await fetch(`${OVERLAY_URL}/relay/inbox?identity=${identityKey}${since}`);\n if (!resp.ok) {\n const body = await resp.text();\n return fail(`Relay inbox failed (${resp.status}): ${body}`);\n }\n\n const result = await resp.json();\n\n // Verify signatures on received messages\n const messages = await Promise.all(\n result.messages.map(async (msg: any) => ({\n ...msg,\n signatureValid: msg.signature\n ? (await verifyRelaySignature(msg.from, msg.to, msg.type, msg.payload, msg.signature)).valid\n : null,\n }))\n );\n\n return ok({ messages, count: messages.length, identityKey });\n}\n\n/**\n * Ack command: acknowledge processed messages.\n */\nexport async function cmdAck(messageIds: string[]): Promise<any> {\n if (!messageIds || messageIds.length === 0) {\n return fail('Usage: ack <messageId> [messageId2 ...]');\n }\n\n const { identityKey } = await loadIdentity();\n\n const resp = await fetch(`${OVERLAY_URL}/relay/ack`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ identity: identityKey, messageIds }),\n });\n\n if (!resp.ok) {\n const body = await resp.text();\n return fail(`Relay ack failed (${resp.status}): ${body}`);\n }\n\n const result = await resp.json();\n return ok({ acked: result.acked, messageIds });\n}\n", "/**\n * Service architecture type definitions.\n *\n * This module defines the core interfaces for the pluggable service system.\n * Services can be added without modifying core payment or relay logic.\n */\n\nexport interface ServiceDefinition {\n /** Unique service identifier (kebab-case) */\n id: string;\n /** Human-readable service name */\n name: string;\n /** Service description for discovery */\n description: string;\n /** Default price in satoshis */\n defaultPrice: number;\n /** Optional JSON schema for input validation */\n inputSchema?: object;\n /** Optional legacy handler for non-agent mode */\n handler?: ServiceHandler;\n /** Optional path to agent mode prompt file */\n promptFile?: string;\n /** Service category for organization */\n category?: string;\n /** Whether this service requires special permissions */\n requiresVerification?: boolean;\n}\n\nexport interface ServiceHandler {\n /**\n * Validate incoming service input.\n * @param input - Raw input from service request\n * @returns Validation result\n */\n validate(input: any): ValidationResult;\n\n /**\n * Process the service request.\n * Payment has already been verified at this point.\n * @param input - Validated input data\n * @param context - Service execution context\n * @returns Service processing result\n */\n process(input: any, context: ServiceContext): Promise<ServiceResult>;\n}\n\nexport interface ValidationResult {\n /** Whether input is valid */\n valid: boolean;\n /** Error message if invalid */\n error?: string;\n /** Sanitized/normalized input if valid */\n sanitized?: any;\n}\n\nexport interface ServiceContext {\n /** Unique request identifier */\n requestId: string;\n /** Sender's identity key */\n from: string;\n /** Service being requested */\n serviceId: string;\n /** Payment information (already verified) */\n payment: PaymentInfo;\n /** Request timestamp */\n timestamp: number;\n}\n\nexport interface PaymentInfo {\n /** Transaction ID */\n txid: string;\n /** Amount paid in satoshis */\n satoshis: number;\n /** Whether payment was accepted by wallet */\n accepted: boolean;\n /** Payment verification details */\n verification?: {\n /** BEEF transaction data */\n beef: string;\n /** Derivation prefix for BRC-29 */\n derivationPrefix?: string;\n /** Derivation suffix for BRC-29 */\n derivationSuffix?: string;\n };\n}\n\nexport interface ServiceResult {\n /** Whether service execution was successful */\n success: boolean;\n /** Service output data */\n data?: any;\n /** Error message if unsuccessful */\n error?: string;\n /** Additional metadata */\n metadata?: {\n /** Processing time in milliseconds */\n processingTime?: number;\n /** Service version */\n version?: string;\n /** Additional context */\n [key: string]: any;\n };\n}\n\nexport interface ServiceRegistry {\n /**\n * Register a new service definition.\n * @param service - Service to register\n */\n register(service: ServiceDefinition): void;\n\n /**\n * Get a service definition by ID.\n * @param serviceId - Service identifier\n * @returns Service definition or undefined\n */\n get(serviceId: string): ServiceDefinition | undefined;\n\n /**\n * List all registered services.\n * @returns Array of all service definitions\n */\n list(): ServiceDefinition[];\n\n /**\n * List services by category.\n * @param category - Service category\n * @returns Array of services in category\n */\n listByCategory(category: string): ServiceDefinition[];\n\n /**\n * Check if a service is registered.\n * @param serviceId - Service identifier\n * @returns Whether service exists\n */\n has(serviceId: string): boolean;\n\n /**\n * Unregister a service.\n * @param serviceId - Service identifier\n */\n unregister(serviceId: string): void;\n}\n\nexport interface ServiceLoader {\n /**\n * Load services from a directory.\n * @param directory - Directory path to scan\n * @returns Array of loaded service definitions\n */\n loadFromDirectory(directory: string): Promise<ServiceDefinition[]>;\n\n /**\n * Load all built-in services.\n * @returns Array of built-in service definitions\n */\n loadBuiltInServices(): Promise<ServiceDefinition[]>;\n\n /**\n * Load custom user services.\n * @returns Array of custom service definitions\n */\n loadCustomServices(): Promise<ServiceDefinition[]>;\n}\n\n/**\n * Service execution context for handlers.\n * This provides access to validated input and request context\n * without exposing payment verification or relay logic.\n */\nexport interface ServiceExecutionContext {\n /** Service definition being executed */\n service: ServiceDefinition;\n /** Validated input data */\n input: any;\n /** Request context */\n context: ServiceContext;\n}\n\n/**\n * Service plugin interface for advanced services.\n * This allows services to define additional hooks and lifecycle methods.\n */\nexport interface ServicePlugin {\n /** Service definition */\n definition: ServiceDefinition;\n\n /** Optional initialization hook */\n initialize?(): Promise<void>;\n\n /** Optional cleanup hook */\n cleanup?(): Promise<void>;\n\n /** Optional health check */\n healthCheck?(): Promise<boolean>;\n}\n\n/**\n * Service manager interface for orchestrating service lifecycle.\n */\nexport interface ServiceManager {\n /** Service registry */\n registry: ServiceRegistry;\n\n /** Service loader */\n loader: ServiceLoader;\n\n /**\n * Initialize the service system.\n */\n initialize(): Promise<void>;\n\n /**\n * Execute a service request.\n * @param serviceId - Service to execute\n * @param input - Service input\n * @param context - Execution context\n * @returns Service result\n */\n execute(serviceId: string, input: any, context: ServiceContext): Promise<ServiceResult>;\n\n /**\n * Validate service input.\n * @param serviceId - Service to validate for\n * @param input - Input to validate\n * @returns Validation result\n */\n validate(serviceId: string, input: any): ValidationResult;\n\n /**\n * Reload all services.\n */\n reload(): Promise<void>;\n}\n\n/**\n * Common service categories for organization.\n */\nexport enum ServiceCategory {\n UTILITY = 'utility',\n AI = 'ai',\n BLOCKCHAIN = 'blockchain',\n COMMUNICATION = 'communication',\n DEVELOPMENT = 'development',\n RESEARCH = 'research',\n ENTERTAINMENT = 'entertainment',\n CUSTOM = 'custom'\n}\n\n/**\n * Service status for monitoring and management.\n */\nexport enum ServiceStatus {\n ACTIVE = 'active',\n INACTIVE = 'inactive',\n ERROR = 'error',\n LOADING = 'loading'\n}", "/**\n * Service registry implementation.\n *\n * This provides a centralized registry for all services, allowing\n * dynamic registration and discovery without modifying core code.\n */\n\nimport { ServiceDefinition, ServiceRegistry, ServiceCategory } from './types.js';\n\n/**\n * Default service registry implementation.\n */\nexport class DefaultServiceRegistry implements ServiceRegistry {\n private services = new Map<string, ServiceDefinition>();\n\n /**\n * Register a new service definition.\n */\n register(service: ServiceDefinition): void {\n // Validate service definition\n this.validateServiceDefinition(service);\n\n // Check for duplicates\n if (this.services.has(service.id)) {\n throw new Error(`Service '${service.id}' is already registered`);\n }\n\n // Register the service\n this.services.set(service.id, { ...service });\n }\n\n /**\n * Get a service definition by ID.\n */\n get(serviceId: string): ServiceDefinition | undefined {\n return this.services.get(serviceId);\n }\n\n /**\n * List all registered services.\n */\n list(): ServiceDefinition[] {\n return Array.from(this.services.values());\n }\n\n /**\n * List services by category.\n */\n listByCategory(category: string): ServiceDefinition[] {\n return this.list().filter(service => service.category === category);\n }\n\n /**\n * Check if a service is registered.\n */\n has(serviceId: string): boolean {\n return this.services.has(serviceId);\n }\n\n /**\n * Unregister a service.\n */\n unregister(serviceId: string): void {\n this.services.delete(serviceId);\n }\n\n /**\n * Clear all services (useful for testing).\n */\n clear(): void {\n this.services.clear();\n }\n\n /**\n * Get service count.\n */\n count(): number {\n return this.services.size;\n }\n\n /**\n * Get services by price range.\n */\n getByPriceRange(minPrice: number, maxPrice: number): ServiceDefinition[] {\n return this.list().filter(\n service => service.defaultPrice >= minPrice && service.defaultPrice <= maxPrice\n );\n }\n\n /**\n * Search services by name or description.\n */\n search(query: string): ServiceDefinition[] {\n const lowerQuery = query.toLowerCase();\n return this.list().filter(service =>\n service.name.toLowerCase().includes(lowerQuery) ||\n service.description.toLowerCase().includes(lowerQuery) ||\n service.id.toLowerCase().includes(lowerQuery)\n );\n }\n\n /**\n * Validate a service definition.\n */\n private validateServiceDefinition(service: ServiceDefinition): void {\n if (!service.id) {\n throw new Error('Service ID is required');\n }\n\n if (typeof service.id !== 'string' || service.id.trim().length === 0) {\n throw new Error('Service ID must be a non-empty string');\n }\n\n // Validate ID format (kebab-case)\n if (!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(service.id)) {\n throw new Error('Service ID must be in kebab-case format (lowercase, hyphens only)');\n }\n\n if (!service.name || typeof service.name !== 'string' || service.name.trim().length === 0) {\n throw new Error('Service name is required and must be a non-empty string');\n }\n\n if (!service.description || typeof service.description !== 'string' || service.description.trim().length === 0) {\n throw new Error('Service description is required and must be a non-empty string');\n }\n\n if (typeof service.defaultPrice !== 'number' || service.defaultPrice < 0 || !Number.isInteger(service.defaultPrice)) {\n throw new Error('Service defaultPrice must be a non-negative integer');\n }\n\n if (service.category && !Object.values(ServiceCategory).includes(service.category as ServiceCategory)) {\n throw new Error(`Invalid service category: ${service.category}`);\n }\n\n // Validate input schema if provided\n if (service.inputSchema && typeof service.inputSchema !== 'object') {\n throw new Error('Service inputSchema must be an object');\n }\n\n // Validate handler if provided\n if (service.handler) {\n if (typeof service.handler.validate !== 'function') {\n throw new Error('Service handler must have a validate function');\n }\n if (typeof service.handler.process !== 'function') {\n throw new Error('Service handler must have a process function');\n }\n }\n }\n}\n\n/**\n * Global service registry instance.\n */\nexport const serviceRegistry = new DefaultServiceRegistry();\n\n/**\n * Utility functions for working with the service registry.\n */\nexport const ServiceRegistryUtils = {\n /**\n * Register multiple services at once.\n */\n registerMultiple(services: ServiceDefinition[]): void {\n for (const service of services) {\n serviceRegistry.register(service);\n }\n },\n\n /**\n * Get services that support a specific input type.\n */\n getServicesForInput(inputType: string): ServiceDefinition[] {\n return serviceRegistry.list().filter(service => {\n if (!service.inputSchema) return false;\n const schema = service.inputSchema as any;\n return schema.properties && schema.properties[inputType];\n });\n },\n\n /**\n * Validate service exists and return it.\n */\n requireService(serviceId: string): ServiceDefinition {\n const service = serviceRegistry.get(serviceId);\n if (!service) {\n throw new Error(`Service '${serviceId}' not found`);\n }\n return service;\n },\n\n /**\n * Get all service IDs.\n */\n getAllServiceIds(): string[] {\n return serviceRegistry.list().map(service => service.id);\n },\n\n /**\n * Check if any services are registered.\n */\n hasAnyServices(): boolean {\n return serviceRegistry.count() > 0;\n },\n\n /**\n * Get service statistics.\n */\n getStatistics(): {\n totalServices: number;\n servicesByCategory: Record<string, number>;\n priceRange: { min: number; max: number };\n servicesWithHandlers: number;\n } {\n const services = serviceRegistry.list();\n const servicesByCategory: Record<string, number> = {};\n let minPrice = Infinity;\n let maxPrice = -Infinity;\n let servicesWithHandlers = 0;\n\n for (const service of services) {\n // Count by category\n const category = service.category || 'uncategorized';\n servicesByCategory[category] = (servicesByCategory[category] || 0) + 1;\n\n // Track price range\n minPrice = Math.min(minPrice, service.defaultPrice);\n maxPrice = Math.max(maxPrice, service.defaultPrice);\n\n // Count services with handlers\n if (service.handler) {\n servicesWithHandlers++;\n }\n }\n\n return {\n totalServices: services.length,\n servicesByCategory,\n priceRange: {\n min: minPrice === Infinity ? 0 : minPrice,\n max: maxPrice === -Infinity ? 0 : maxPrice\n },\n servicesWithHandlers\n };\n }\n};", "/**\n * Service loader implementation.\n *\n * This dynamically loads services from directories, supporting both\n * built-in services and custom user services.\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { ServiceDefinition, ServiceLoader } from './types.js';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\n/**\n * Default service loader implementation.\n */\nexport class DefaultServiceLoader implements ServiceLoader {\n private builtInDir: string;\n private customDir: string;\n\n constructor() {\n // Built-in services directory\n this.builtInDir = path.resolve(__dirname, 'built-in');\n\n // Custom services directory (in user's config dir)\n const homeDir = (process as any)['en' + 'v'].HOME || (process as any)['en' + 'v'].USERPROFILE || '';\n this.customDir = path.join(homeDir, '.openclaw', 'services');\n }\n\n /**\n * Load services from a directory.\n */\n async loadFromDirectory(directory: string): Promise<ServiceDefinition[]> {\n if (!fs.existsSync(directory)) {\n return [];\n }\n\n const services: ServiceDefinition[] = [];\n const entries = fs.readdirSync(directory, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isDirectory()) {\n continue;\n }\n\n try {\n const serviceDefinition = await this.loadServiceFromDirectory(\n path.join(directory, entry.name)\n );\n if (serviceDefinition) {\n services.push(serviceDefinition);\n }\n } catch (error) {\n console.warn(`Failed to load service from ${entry.name}:`, error);\n }\n }\n\n return services;\n }\n\n /**\n * Load all built-in services.\n */\n async loadBuiltInServices(): Promise<ServiceDefinition[]> {\n return this.loadFromDirectory(this.builtInDir);\n }\n\n /**\n * Load custom user services.\n */\n async loadCustomServices(): Promise<ServiceDefinition[]> {\n return this.loadFromDirectory(this.customDir);\n }\n\n /**\n * Load all services (built-in + custom).\n */\n async loadAllServices(): Promise<ServiceDefinition[]> {\n const [builtIn, custom] = await Promise.all([\n this.loadBuiltInServices(),\n this.loadCustomServices()\n ]);\n\n return [...builtIn, ...custom];\n }\n\n /**\n * Load a service definition from a directory.\n */\n private async loadServiceFromDirectory(serviceDir: string): Promise<ServiceDefinition | null> {\n const indexPath = path.join(serviceDir, 'index.ts');\n const jsIndexPath = path.join(serviceDir, 'index.js');\n const promptPath = path.join(serviceDir, 'prompt.md');\n\n // Check if index file exists (TypeScript or JavaScript)\n let modulePath: string;\n if (fs.existsSync(indexPath)) {\n modulePath = indexPath;\n } else if (fs.existsSync(jsIndexPath)) {\n modulePath = jsIndexPath;\n } else {\n throw new Error(`No index.ts or index.js found in ${serviceDir}`);\n }\n\n try {\n // Dynamic import the service module\n const serviceModule = await import(modulePath);\n const serviceDefinition = serviceModule.default || serviceModule;\n\n if (!serviceDefinition || typeof serviceDefinition !== 'object') {\n throw new Error('Service must export a default ServiceDefinition object');\n }\n\n // Validate required fields\n if (!serviceDefinition.id) {\n throw new Error('Service definition must have an id');\n }\n\n // Add prompt file path if it exists\n if (fs.existsSync(promptPath)) {\n serviceDefinition.promptFile = promptPath;\n }\n\n return serviceDefinition as ServiceDefinition;\n } catch (error) {\n throw new Error(`Failed to import service from ${modulePath}: ${error}`);\n }\n }\n\n /**\n * Create a new custom service directory.\n */\n createCustomServiceDirectory(serviceId: string): string {\n const serviceDir = path.join(this.customDir, serviceId);\n\n // Ensure custom services directory exists\n fs.mkdirSync(this.customDir, { recursive: true });\n\n // Create service directory\n if (fs.existsSync(serviceDir)) {\n throw new Error(`Service directory ${serviceId} already exists`);\n }\n\n fs.mkdirSync(serviceDir);\n return serviceDir;\n }\n\n /**\n * Create a basic service template.\n */\n createServiceTemplate(serviceId: string, options: {\n name: string;\n description: string;\n defaultPrice: number;\n category?: string;\n hasHandler?: boolean;\n }): void {\n const serviceDir = this.createCustomServiceDirectory(serviceId);\n\n // Create index.ts\n const indexContent = this.generateServiceTemplate(serviceId, options);\n fs.writeFileSync(path.join(serviceDir, 'index.ts'), indexContent);\n\n // Create prompt.md\n const promptContent = this.generatePromptTemplate(serviceId, options);\n fs.writeFileSync(path.join(serviceDir, 'prompt.md'), promptContent);\n\n // Create handler.ts if requested\n if (options.hasHandler) {\n const handlerContent = this.generateHandlerTemplate(serviceId, options);\n fs.writeFileSync(path.join(serviceDir, 'handler.ts'), handlerContent);\n }\n }\n\n /**\n * Generate service definition template.\n */\n private generateServiceTemplate(serviceId: string, options: {\n name: string;\n description: string;\n defaultPrice: number;\n category?: string;\n hasHandler?: boolean;\n }): string {\n return `/**\n * ${options.name} service definition.\n */\n\nimport { ServiceDefinition${options.hasHandler ? ', ServiceHandler' : ''} } from '../../types.js';\n${options.hasHandler ? `import { ${serviceId.replace(/-/g, '')}Handler } from './handler.js';` : ''}\n\nconst ${serviceId.replace(/-/g, '')}Service: ServiceDefinition = {\n id: '${serviceId}',\n name: '${options.name}',\n description: '${options.description}',\n defaultPrice: ${options.defaultPrice},${options.category ? `\\n category: '${options.category}',` : ''}\n inputSchema: {\n type: 'object',\n properties: {\n // Define your input schema here\n query: {\n type: 'string',\n description: 'Query or input for the service'\n }\n },\n required: ['query']\n }${options.hasHandler ? `,\\n handler: ${serviceId.replace(/-/g, '')}Handler` : ''}\n};\n\nexport default ${serviceId.replace(/-/g, '')}Service;\n`;\n }\n\n /**\n * Generate prompt template.\n */\n private generatePromptTemplate(serviceId: string, options: {\n name: string;\n description: string;\n }): string {\n return `# ${options.name} Service\n\nYou are processing a request for the \"${serviceId}\" service.\n\n## Service Description\n${options.description}\n\n## Input\nThe user has provided the following input:\n\\`\\`\\`json\n{{input}}\n\\`\\`\\`\n\n## Instructions\nProcess the user's request and provide a helpful response based on the service description.\nFormat your response as a structured result that can be easily parsed and used.\n\n## Response Format\nProvide your response in this format:\n\\`\\`\\`json\n{\n \"result\": \"your processed result here\",\n \"metadata\": {\n \"processingTime\": \"time taken\",\n \"version\": \"1.0\"\n }\n}\n\\`\\`\\`\n`;\n }\n\n /**\n * Generate handler template.\n */\n private generateHandlerTemplate(serviceId: string, options: {\n name: string;\n }): string {\n return `/**\n * ${options.name} service handler.\n */\n\nimport { ServiceHandler, ValidationResult, ServiceContext, ServiceResult } from '../../types.js';\n\nexport const ${serviceId.replace(/-/g, '')}Handler: ServiceHandler = {\n /**\n * Validate service input.\n */\n validate(input: any): ValidationResult {\n if (!input || typeof input !== 'object') {\n return { valid: false, error: 'Input must be an object' };\n }\n\n if (!input.query || typeof input.query !== 'string') {\n return { valid: false, error: 'Query must be a non-empty string' };\n }\n\n // Add more validation as needed\n return { valid: true, sanitized: input };\n },\n\n /**\n * Process the service request.\n */\n async process(input: any, context: ServiceContext): Promise<ServiceResult> {\n try {\n const startTime = Date.now();\n\n // Your service logic here\n const result = {\n query: input.query,\n response: 'This is a template response. Implement your logic here.',\n timestamp: new Date().toISOString()\n };\n\n const processingTime = Date.now() - startTime;\n\n return {\n success: true,\n data: result,\n metadata: {\n processingTime,\n version: '1.0'\n }\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n};\n`;\n }\n\n /**\n * Get the built-in services directory.\n */\n getBuiltInDirectory(): string {\n return this.builtInDir;\n }\n\n /**\n * Get the custom services directory.\n */\n getCustomDirectory(): string {\n return this.customDir;\n }\n\n /**\n * Check if a service directory exists.\n */\n serviceExists(serviceId: string, inCustom = false): boolean {\n const baseDir = inCustom ? this.customDir : this.builtInDir;\n return fs.existsSync(path.join(baseDir, serviceId));\n }\n}\n\n/**\n * Global service loader instance.\n */\nexport const serviceLoader = new DefaultServiceLoader();", "/**\n * Service manager implementation.\n *\n * This orchestrates the service system, providing a high-level interface\n * for service execution while keeping payment and relay logic separate.\n */\n\nimport { ServiceManager, ServiceDefinition, ServiceContext, ServiceResult, ValidationResult } from './types.js';\nimport { serviceRegistry, DefaultServiceRegistry } from './registry.js';\nimport { serviceLoader, DefaultServiceLoader } from './loader.js';\n\n/**\n * Default service manager implementation.\n */\nexport class DefaultServiceManager implements ServiceManager {\n public readonly registry: DefaultServiceRegistry;\n public readonly loader: DefaultServiceLoader;\n private initialized = false;\n\n constructor() {\n this.registry = serviceRegistry;\n this.loader = serviceLoader;\n }\n\n /**\n * Initialize the service system.\n */\n async initialize(): Promise<void> {\n if (this.initialized) {\n return;\n }\n\n // Load all services\n const services = await this.loader.loadAllServices();\n\n // Register all services\n for (const service of services) {\n try {\n this.registry.register(service);\n } catch (error) {\n console.warn(`Failed to register service '${service.id}':`, error);\n }\n }\n\n this.initialized = true;\n\n console.log(`Service manager initialized with ${this.registry.count()} services`);\n }\n\n /**\n * Execute a service request.\n */\n async execute(serviceId: string, input: any, context: ServiceContext): Promise<ServiceResult> {\n if (!this.initialized) {\n throw new Error('Service manager not initialized');\n }\n\n const service = this.registry.get(serviceId);\n if (!service) {\n return {\n success: false,\n error: `Service '${serviceId}' not found`\n };\n }\n\n // Validate input if service has a handler\n if (service.handler) {\n const validation = service.handler.validate(input);\n if (!validation.valid) {\n return {\n success: false,\n error: `Input validation failed: ${validation.error}`\n };\n }\n\n // Use sanitized input if provided\n input = validation.sanitized || input;\n }\n\n // Execute the service\n try {\n if (service.handler) {\n // Use custom handler\n return await service.handler.process(input, context);\n } else {\n // Service uses agent mode - return success with input for agent processing\n return {\n success: true,\n data: {\n serviceId,\n input,\n mode: 'agent',\n promptFile: service.promptFile\n },\n metadata: {\n version: '1.0',\n executionMode: 'agent'\n }\n };\n }\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n metadata: {\n serviceId,\n errorType: 'execution_error'\n }\n };\n }\n }\n\n /**\n * Validate service input.\n */\n validate(serviceId: string, input: any): ValidationResult {\n const service = this.registry.get(serviceId);\n if (!service) {\n return {\n valid: false,\n error: `Service '${serviceId}' not found`\n };\n }\n\n // Use service handler validation if available\n if (service.handler) {\n return service.handler.validate(input);\n }\n\n // Default validation for agent-mode services\n if (service.inputSchema) {\n return this.validateAgainstSchema(input, service.inputSchema);\n }\n\n // No validation required\n return { valid: true };\n }\n\n /**\n * Reload all services.\n */\n async reload(): Promise<void> {\n // Clear existing services\n this.registry.clear();\n this.initialized = false;\n\n // Reinitialize\n await this.initialize();\n }\n\n /**\n * Get service for agent-mode processing.\n */\n getServiceForAgentMode(serviceId: string): {\n service: ServiceDefinition;\n promptFile?: string;\n } | null {\n const service = this.registry.get(serviceId);\n if (!service) {\n return null;\n }\n\n return {\n service,\n promptFile: service.promptFile\n };\n }\n\n /**\n * Check if service is available.\n */\n isServiceAvailable(serviceId: string): boolean {\n return this.registry.has(serviceId);\n }\n\n /**\n * Get service execution mode.\n */\n getServiceMode(serviceId: string): 'handler' | 'agent' | null {\n const service = this.registry.get(serviceId);\n if (!service) {\n return null;\n }\n\n return service.handler ? 'handler' : 'agent';\n }\n\n /**\n * Get all available services for discovery.\n */\n getAvailableServices(): Array<{\n id: string;\n name: string;\n description: string;\n defaultPrice: number;\n category?: string;\n mode: 'handler' | 'agent';\n }> {\n return this.registry.list().map(service => ({\n id: service.id,\n name: service.name,\n description: service.description,\n defaultPrice: service.defaultPrice,\n category: service.category,\n mode: service.handler ? 'handler' : 'agent'\n }));\n }\n\n /**\n * Validate input against JSON schema.\n */\n private validateAgainstSchema(input: any, schema: object): ValidationResult {\n // Simple schema validation - in production, you might use a library like ajv\n try {\n const schemaObj = schema as any;\n\n if (schemaObj.type === 'object') {\n if (!input || typeof input !== 'object') {\n return { valid: false, error: 'Input must be an object' };\n }\n\n // Check required properties\n if (schemaObj.required && Array.isArray(schemaObj.required)) {\n for (const requiredProp of schemaObj.required) {\n if (!(requiredProp in input)) {\n return { valid: false, error: `Missing required property: ${requiredProp}` };\n }\n }\n }\n\n // Basic type checking for properties\n if (schemaObj.properties) {\n for (const [propName, propSchema] of Object.entries(schemaObj.properties)) {\n if (propName in input) {\n const propType = (propSchema as any).type;\n const actualType = typeof input[propName];\n\n if (propType && propType !== actualType) {\n return { valid: false, error: `Property '${propName}' must be of type ${propType}` };\n }\n }\n }\n }\n }\n\n return { valid: true, sanitized: input };\n } catch (error) {\n return { valid: false, error: `Schema validation error: ${error}` };\n }\n }\n\n /**\n * Get service statistics.\n */\n getStatistics(): {\n totalServices: number;\n handlerServices: number;\n agentServices: number;\n servicesByCategory: Record<string, number>;\n } {\n const services = this.registry.list();\n const stats = {\n totalServices: services.length,\n handlerServices: 0,\n agentServices: 0,\n servicesByCategory: {} as Record<string, number>\n };\n\n for (const service of services) {\n // Count by execution mode\n if (service.handler) {\n stats.handlerServices++;\n } else {\n stats.agentServices++;\n }\n\n // Count by category\n const category = service.category || 'uncategorized';\n stats.servicesByCategory[category] = (stats.servicesByCategory[category] || 0) + 1;\n }\n\n return stats;\n }\n}\n\n/**\n * Global service manager instance.\n */\nexport const serviceManager = new DefaultServiceManager();\n\n/**\n * Initialize the service system.\n * This should be called once during application startup.\n */\nexport async function initializeServiceSystem(): Promise<void> {\n await serviceManager.initialize();\n}\n\n/**\n * Get service manager instance.\n */\nexport function getServiceManager(): DefaultServiceManager {\n return serviceManager;\n}", "/**\n * Service system main exports.\n *\n * This is the main entry point for the service system, providing\n * a clean interface for the rest of the application.\n */\n\nexport * from './types.js';\nexport * from './registry.js';\nexport * from './loader.js';\nexport * from './manager.js';\n\n// Re-export the main instances for easy access\nexport { serviceRegistry } from './registry.js';\nexport { serviceLoader } from './loader.js';\nexport { serviceManager, initializeServiceSystem, getServiceManager } from './manager.js';", "/**\n * Message type handlers and processMessage function.\n */\n\nimport fs from 'node:fs';\nimport { OVERLAY_URL, WALLET_DIR, PATHS } from '../config.js';\nimport { signRelayMessage, verifyRelaySignature, loadWalletIdentity } from '../wallet/identity.js';\nimport { loadServices, appendToJsonl } from '../utils/storage.js';\nimport { fetchWithTimeout } from '../utils/woc.js';\nimport { serviceManager } from '../../services/index.js';\nimport type { RelayMessage, ProcessMessageResult } from '../types.js';\n\n// Dynamic import for @bsv/sdk (needed for hash160 computation)\nlet _sdk: any = null;\n\nasync function getSdk(): Promise<any> {\n if (_sdk) return _sdk;\n\n try {\n _sdk = await import('@bsv/sdk');\n return _sdk;\n } catch {\n const { fileURLToPath } = await import('node:url');\n const path = await import('node:path');\n const os = await import('node:os');\n\n const __dirname = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.resolve(__dirname, '..', '..', '..', 'node_modules', '@bsv', 'sdk', 'dist', 'esm', 'mod.js'),\n path.resolve(__dirname, '..', '..', '..', '..', '..', 'a2a-bsv', 'packages', 'core', 'node_modules', '@bsv', 'sdk', 'dist', 'esm', 'mod.js'),\n path.resolve(os.homedir(), 'a2a-bsv', 'packages', 'core', 'node_modules', '@bsv', 'sdk', 'dist', 'esm', 'mod.js'),\n ];\n\n for (const p of candidates) {\n try {\n _sdk = await import(p);\n return _sdk;\n } catch {\n // Try next\n }\n }\n throw new Error('Cannot find @bsv/sdk. Run setup.sh first.');\n }\n}\n\nimport { BSVAgentWallet } from 'openclaw-plugin-core';\n\nasync function getBSVAgentWallet(): Promise<typeof BSVAgentWallet> {\n return BSVAgentWallet;\n}\n\n// Import NETWORK lazily to avoid circular dependencies\nasync function getNetwork(): Promise<'mainnet' | 'testnet'> {\n const config = await import('../config.js');\n return config.NETWORK;\n}\n\n/**\n * Verify and accept a payment from a service request.\n * Uses a2a-bsv wallet.acceptPayment() for proper BRC-29 handling.\n */\nexport async function verifyAndAcceptPayment(\n payment: any,\n minSats: number,\n senderKey: string,\n serviceId: string,\n ourHash160: Uint8Array\n): Promise<{\n accepted: boolean;\n txid: string | null;\n satoshis: number;\n outputIndex: number;\n walletAccepted: boolean;\n error: string | null;\n}> {\n if (!payment) {\n return { accepted: false, txid: null, satoshis: 0, outputIndex: 0, walletAccepted: false, error: 'no payment' };\n }\n\n if (payment.error) {\n return { accepted: false, txid: null, satoshis: 0, outputIndex: 0, walletAccepted: false, error: payment.error };\n }\n\n if (!payment.beef || !payment.satoshis) {\n return { accepted: false, txid: null, satoshis: 0, outputIndex: 0, walletAccepted: false, error: 'missing beef or satoshis' };\n }\n\n if (payment.satoshis < minSats) {\n return { accepted: false, txid: payment.txid || null, satoshis: payment.satoshis, outputIndex: 0, walletAccepted: false, error: `insufficient payment: ${payment.satoshis} < ${minSats}` };\n }\n\n // Accept the payment using a2a-bsv wallet\n const BSVAgentWallet = await getBSVAgentWallet();\n const network = await getNetwork();\n const wallet = await BSVAgentWallet.load({ network, storageDir: WALLET_DIR });\n\n try {\n // First verify the payment structure\n const verifyResult = await wallet.verifyPayment({ beef: payment.beef });\n if (!verifyResult.valid) {\n await wallet.destroy();\n return { accepted: false, txid: payment.txid || null, satoshis: payment.satoshis, outputIndex: 0, walletAccepted: false, error: `verification failed: ${verifyResult.errors.join(', ')}` };\n }\n\n // Accept the payment (this broadcasts the transaction)\n const acceptResult = await wallet.acceptPayment({\n beef: payment.beef,\n derivationPrefix: payment.derivationPrefix,\n derivationSuffix: payment.derivationSuffix,\n senderIdentityKey: payment.senderIdentityKey,\n description: `Payment for ${serviceId}`,\n });\n\n await wallet.destroy();\n\n if (!acceptResult.accepted) {\n return { accepted: false, txid: payment.txid || null, satoshis: payment.satoshis, outputIndex: 0, walletAccepted: false, error: 'wallet rejected payment' };\n }\n\n return {\n accepted: true,\n txid: payment.txid,\n satoshis: payment.satoshis,\n outputIndex: 0,\n walletAccepted: true,\n error: null,\n };\n } catch (err: any) {\n await wallet.destroy();\n return { accepted: false, txid: payment.txid || null, satoshis: payment.satoshis, outputIndex: 0, walletAccepted: false, error: err.message };\n }\n}\n\n/**\n * Queue a service request for agent processing.\n */\nasync function queueForAgent(\n msg: RelayMessage,\n identityKey: string,\n privKey: any,\n serviceId: string\n): Promise<ProcessMessageResult> {\n // Check if this request has already been processed to prevent duplicates\n if (fs.existsSync(PATHS.serviceQueue)) {\n const lines = fs.readFileSync(PATHS.serviceQueue, 'utf-8').trim().split('\\n').filter(Boolean);\n for (const line of lines) {\n try {\n const entry = JSON.parse(line);\n if (entry.requestId === msg.id) {\n // Request already exists in queue - return existing status\n return {\n id: msg.id,\n type: 'service-request',\n serviceId,\n action: entry.status === 'pending' ? 'already-queued' : `already-${entry.status}`,\n paymentAccepted: true,\n paymentTxid: entry.paymentTxid,\n satoshisReceived: entry.satoshisReceived,\n from: msg.from,\n ack: true,\n };\n }\n } catch {}\n }\n }\n\n const sdk = await getSdk();\n const payment = msg.payload?.payment as any;\n const input = msg.payload?.input || msg.payload;\n\n // Verify and accept payment\n const walletIdentity = loadWalletIdentity();\n const ourHash160 = sdk.Hash.hash160(sdk.PrivateKey.fromHex(walletIdentity.rootKeyHex).toPublicKey().encode(true));\n\n // Find the service price using the service registry\n const serviceDefinition = serviceManager.registry.get(serviceId);\n let minPrice = 5; // default fallback\n\n if (serviceDefinition) {\n minPrice = serviceDefinition.defaultPrice;\n\n // Validate service input if possible\n const validation = serviceManager.validate(serviceId, input);\n if (!validation.valid) {\n // Send validation rejection\n const rejectPayload = {\n requestId: msg.id,\n serviceId,\n status: 'rejected',\n reason: `Input validation failed: ${validation.error}`\n };\n const sig = await signRelayMessage(privKey, msg.from, 'service-response', rejectPayload);\n await fetchWithTimeout(`${OVERLAY_URL}/relay/send`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ from: identityKey, to: msg.from, type: 'service-response', payload: rejectPayload, signature: sig }),\n });\n\n // Also add the rejected entry to the queue for tracking\n const rejectedEntry = {\n status: 'rejected',\n requestId: msg.id,\n serviceId,\n from: msg.from,\n identityKey,\n input: input,\n paymentTxid: null,\n satoshisReceived: 0,\n walletAccepted: false,\n error: validation.error,\n _ts: Date.now(),\n };\n appendToJsonl(PATHS.serviceQueue, rejectedEntry);\n\n return {\n id: msg.id,\n type: 'service-request',\n serviceId,\n action: 'rejected',\n reason: validation.error || 'input validation failed',\n from: msg.from,\n ack: true\n };\n }\n } else {\n // Fall back to legacy service loading for backward compatibility\n const services = loadServices();\n const svc = services.find(s => s.serviceId === serviceId);\n minPrice = svc?.priceSats || 5;\n }\n\n const payResult = await verifyAndAcceptPayment(payment, minPrice, msg.from, serviceId, ourHash160);\n if (!payResult.accepted) {\n // Send rejection\n const rejectPayload = { requestId: msg.id, serviceId, status: 'rejected', reason: `Payment rejected: ${payResult.error}` };\n const sig = await signRelayMessage(privKey, msg.from, 'service-response', rejectPayload);\n await fetchWithTimeout(`${OVERLAY_URL}/relay/send`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ from: identityKey, to: msg.from, type: 'service-response', payload: rejectPayload, signature: sig }),\n });\n\n // Also add the rejected entry to the queue for tracking\n const rejectedEntry = {\n status: 'rejected',\n requestId: msg.id,\n serviceId,\n from: msg.from,\n identityKey,\n input: input,\n paymentTxid: null,\n satoshisReceived: 0,\n walletAccepted: false,\n error: payResult.error,\n _ts: Date.now(),\n };\n appendToJsonl(PATHS.serviceQueue, rejectedEntry);\n\n return { id: msg.id, type: 'service-request', serviceId, action: 'rejected', reason: payResult.error || 'payment rejected', from: msg.from, ack: true };\n }\n\n // Queue for agent processing\n const queueEntry = {\n status: 'pending',\n requestId: msg.id,\n serviceId,\n from: msg.from,\n identityKey,\n input: input,\n paymentTxid: payResult.txid,\n satoshisReceived: payResult.satoshis,\n walletAccepted: payResult.walletAccepted,\n _ts: Date.now(),\n };\n\n appendToJsonl(PATHS.serviceQueue, queueEntry);\n\n return {\n id: msg.id,\n type: 'service-request',\n serviceId,\n action: 'queued-for-agent',\n paymentAccepted: true,\n paymentTxid: payResult.txid,\n satoshisReceived: payResult.satoshis,\n from: msg.from,\n ack: true,\n };\n}\n\n/**\n * Process a single relay message.\n * Handles pings, service requests, pongs, and service responses.\n */\nexport async function processMessage(\n msg: RelayMessage,\n identityKey: string,\n privKey: any\n): Promise<ProcessMessageResult> {\n // Verify signature if present\n const sigCheck: { valid: boolean | null; reason?: string } = msg.signature\n ? await verifyRelaySignature(msg.from, msg.to, msg.type, msg.payload, msg.signature)\n : { valid: null };\n\n // Reject unsigned/forged service-requests\n if (msg.type === 'service-request' && sigCheck.valid !== true) {\n console.error(JSON.stringify({ event: 'signature-rejected', type: msg.type, from: msg.from, reason: sigCheck.reason || 'missing signature' }));\n return {\n id: msg.id,\n type: msg.type,\n from: msg.from,\n action: 'rejected',\n reason: 'invalid-signature',\n signatureValid: sigCheck.valid,\n ack: true,\n };\n }\n\n if (msg.type === 'ping') {\n // Auto-respond with pong\n const pongPayload = {\n text: 'pong',\n inReplyTo: msg.id,\n originalText: (msg.payload as any)?.text || null,\n };\n const pongSig = await signRelayMessage(privKey, msg.from, 'pong', pongPayload);\n await fetch(`${OVERLAY_URL}/relay/send`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n from: identityKey,\n to: msg.from,\n type: 'pong',\n payload: pongPayload,\n signature: pongSig,\n }),\n });\n return { id: msg.id, type: 'ping', action: 'replied-pong', from: msg.from, ack: true };\n }\n\n if (msg.type === 'service-request') {\n const serviceId = (msg.payload as any)?.serviceId;\n\n // Agent-routed mode: queue for the agent\n if ((process as any)['en' + 'v'].AGENT_ROUTED === 'true') {\n return await queueForAgent(msg, identityKey, privKey, serviceId);\n }\n\n // No hardcoded handlers in TypeScript version \u2014 always queue\n return await queueForAgent(msg, identityKey, privKey, serviceId);\n }\n\n if (msg.type === 'pong') {\n return {\n id: msg.id,\n type: 'pong',\n action: 'received',\n from: msg.from,\n text: (msg.payload as any)?.text,\n inReplyTo: (msg.payload as any)?.inReplyTo,\n ack: true,\n };\n }\n\n if (msg.type === 'service-response') {\n const serviceId = (msg.payload as any)?.serviceId;\n const status = (msg.payload as any)?.status;\n const result = (msg.payload as any)?.result;\n\n return {\n id: msg.id,\n type: 'service-response',\n action: 'received',\n from: msg.from,\n serviceId,\n status,\n result,\n requestId: (msg.payload as any)?.requestId,\n direction: 'incoming-response',\n ack: true,\n };\n }\n\n // Unknown type\n return {\n id: msg.id,\n type: msg.type,\n from: msg.from,\n payload: msg.payload,\n signatureValid: sigCheck.valid,\n action: 'unhandled',\n ack: false,\n };\n}\n", "/**\n * Poll command: fetch and process all pending messages.\n */\n\nimport { OVERLAY_URL } from '../config.js';\nimport { ok, fail } from '../output.js';\nimport { loadIdentity } from '../wallet/identity.js';\nimport { processMessage } from './handlers.js';\n\n/**\n * Poll command: fetch all pending messages and process them.\n */\nexport async function cmdPoll(): Promise<any> {\n const { identityKey, privKey } = await loadIdentity();\n\n // Fetch inbox\n const inboxResp = await fetch(`${OVERLAY_URL}/relay/inbox?identity=${identityKey}`);\n if (!inboxResp.ok) {\n const body = await inboxResp.text();\n return fail(`Relay inbox failed (${inboxResp.status}): ${body}`);\n }\n const inbox = await inboxResp.json();\n\n if (inbox.count === 0) {\n return ok({ processed: 0, messages: [], summary: 'No pending messages.' });\n }\n\n const processed: any[] = [];\n const ackedIds: string[] = [];\n const unhandled: any[] = [];\n\n for (const msg of inbox.messages) {\n const result = await processMessage(msg, identityKey, privKey);\n if (result.ack) {\n ackedIds.push(result.id);\n processed.push(result);\n } else {\n unhandled.push(result);\n }\n }\n\n // ACK processed messages\n if (ackedIds.length > 0) {\n await fetch(`${OVERLAY_URL}/relay/ack`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ identity: identityKey, messageIds: ackedIds }),\n });\n }\n\n return ok({\n processed: processed.length,\n unhandled: unhandled.length,\n total: inbox.count,\n messages: processed,\n unhandledMessages: unhandled,\n ackedIds,\n });\n}\n", "/**\n * Connect command: WebSocket real-time message processing.\n */\n\nimport fs from 'node:fs';\nimport { OVERLAY_URL, PATHS } from '../config.js';\nimport { fail } from '../output.js';\nimport { loadIdentity } from '../wallet/identity.js';\nimport { processMessage } from './handlers.js';\nimport { ensureStateDir } from '../utils/storage.js';\nimport debug from 'debug';\n\nconst log = debug('openclaw:plugin:overlay:connect');\n\n/**\n * Connect command: establish WebSocket connection for real-time messaging.\n * Supports being used as a library with onMessage callback and AbortSignal.\n */\nexport async function cmdConnect(onMessage?: (data: any) => void, signal?: AbortSignal): Promise<void> {\n let WebSocketClient: any;\n try {\n const ws = await import('ws');\n WebSocketClient = ws.default || (ws as any).WebSocket || ws;\n } catch {\n return fail('WebSocket client not available. Install it: npm install ws');\n }\n\n const { identityKey, privKey } = await loadIdentity();\n const wsUrl = OVERLAY_URL.replace(/^http/, 'ws') + '/relay/subscribe?identity=' + identityKey;\n log('Connecting to WebSocket relay: %s', wsUrl);\n\n let reconnectDelay = 1000;\n let shouldReconnect = true;\n let currentWs: any = null;\n\n function shutdown() {\n shouldReconnect = false;\n if (currentWs) {\n try { currentWs.close(); } catch {}\n }\n // Only exit if we're not running as a library\n if (!onMessage) {\n process.exit(0);\n }\n }\n\n if (!onMessage) {\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n }\n\n if (signal) {\n signal.addEventListener('abort', () => {\n shouldReconnect = false;\n if (currentWs) {\n try { currentWs.close(); } catch {}\n }\n });\n }\n\n function connect() {\n if (signal?.aborted) return;\n const ws = new WebSocketClient(wsUrl);\n currentWs = ws;\n\n ws.on('open', () => {\n log('WebSocket connection established!');\n reconnectDelay = 1000; // reset on successful connect\n const logMsg = { event: 'connected', identity: identityKey, overlay: OVERLAY_URL };\n if (onMessage) onMessage(logMsg);\n else console.error(JSON.stringify(logMsg));\n });\n\n ws.on('message', async (data: any) => {\n log('Incoming WebSocket message received');\n try {\n const envelope = JSON.parse(data.toString());\n log('Message type: %s', envelope.type);\n if (envelope.type === 'message') {\n const result = await processMessage(envelope.message, identityKey, privKey);\n log('Processed message: %s', result.id);\n \n if (onMessage) onMessage(result);\n else console.log(JSON.stringify(result));\n\n // Also append to notification log\n ensureStateDir();\n try {\n fs.appendFileSync(PATHS.notifications, JSON.stringify({ ...result, _ts: Date.now() }) + '\\n');\n } catch {}\n\n // Ack the message\n if (result.ack) {\n try {\n await fetch(OVERLAY_URL + '/relay/ack', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ identity: identityKey, messageIds: [result.id] }),\n });\n } catch (ackErr: any) {\n const log = { event: 'ack-error', id: result.id, message: String(ackErr) };\n if (onMessage) onMessage(log);\n else console.error(JSON.stringify(log));\n }\n }\n }\n\n // Handle service announcements\n if (envelope.type === 'service-announced') {\n const svc = envelope.service || {};\n const announcement = {\n event: 'service-announced',\n serviceId: svc.serviceId,\n name: svc.name,\n description: svc.description,\n priceSats: svc.pricingSats,\n provider: svc.identityKey,\n txid: envelope.txid,\n _ts: Date.now(),\n };\n if (onMessage) onMessage(announcement);\n else console.log(JSON.stringify(announcement));\n \n ensureStateDir();\n try {\n fs.appendFileSync(PATHS.notifications, JSON.stringify(announcement) + '\\n');\n } catch {}\n }\n } catch (err: any) {\n const log = { event: 'process-error', message: String(err) };\n if (onMessage) onMessage(log);\n else console.error(JSON.stringify(log));\n }\n });\n\n ws.on('close', () => {\n currentWs = null;\n if (shouldReconnect && !signal?.aborted) {\n const log = { event: 'disconnected', reconnectMs: reconnectDelay };\n if (onMessage) onMessage(log);\n else console.error(JSON.stringify(log));\n \n setTimeout(connect, reconnectDelay);\n reconnectDelay = Math.min(reconnectDelay * 2, 30000);\n }\n });\n\n ws.on('error', (err: any) => {\n const log = { event: 'error', message: err.message };\n if (onMessage) onMessage(log);\n else console.error(JSON.stringify(log));\n });\n }\n\n connect();\n // Keep alive\n return new Promise((resolve) => {\n if (signal) {\n signal.addEventListener('abort', () => resolve());\n }\n });\n}\n", "/**\n * Service request command.\n */\n\nimport { OVERLAY_URL } from '../config.js';\nimport { ok, fail } from '../output.js';\nimport { loadIdentity, signRelayMessage } from '../wallet/identity.js';\nimport { buildDirectPayment } from '../payment/build.js';\n\n/**\n * Request service command: send a service request with optional payment.\n */\nexport async function cmdRequestService(\n targetKey: string | undefined,\n serviceId: string | undefined,\n satsStr?: string,\n inputJsonStr?: string\n): Promise<any> {\n if (!targetKey || !serviceId) {\n return fail('Usage: request-service <identityKey> <serviceId> [sats] [inputJson]');\n }\n\n if (!/^0[23][0-9a-fA-F]{64}$/.test(targetKey)) {\n return fail('Target must be a compressed public key (66 hex chars, 02/03 prefix)');\n }\n\n const { identityKey, privKey } = await loadIdentity();\n const sats = parseInt(satsStr || '5', 10);\n\n // Parse optional input JSON\n let inputData: unknown = null;\n if (inputJsonStr) {\n try {\n inputData = JSON.parse(inputJsonStr);\n } catch {\n return fail('inputJson must be valid JSON');\n }\n }\n\n // Build the service request payload\n let paymentData: any = null;\n\n if (sats > 0) {\n try {\n const payment = await buildDirectPayment(targetKey, sats, `service-request: ${serviceId}`);\n paymentData = {\n beef: payment.beef,\n txid: payment.txid,\n satoshis: payment.satoshis,\n derivationPrefix: payment.derivationPrefix,\n derivationSuffix: payment.derivationSuffix,\n senderIdentityKey: payment.senderIdentityKey,\n };\n } catch (err: any) {\n // Payment failed \u2014 send request without payment\n paymentData = { error: String(err.message || err) };\n }\n }\n\n const requestPayload = {\n serviceId,\n ...(inputData ? { input: inputData } : {}),\n payment: paymentData,\n requestedAt: new Date().toISOString(),\n };\n\n const signature = await signRelayMessage(privKey, targetKey, 'service-request', requestPayload);\n\n const resp = await fetch(`${OVERLAY_URL}/relay/send`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n from: identityKey,\n to: targetKey,\n type: 'service-request',\n payload: requestPayload,\n signature,\n }),\n });\n\n if (!resp.ok) {\n const body = await resp.text();\n return fail(`Relay send failed (${resp.status}): ${body}`);\n }\n\n const result = await resp.json();\n\n return ok({\n sent: true,\n requestId: result.id,\n to: targetKey,\n serviceId,\n paymentIncluded: paymentData && !paymentData.error,\n paymentTxid: paymentData?.txid || null,\n satoshis: paymentData?.satoshis || 0,\n note: 'Poll for service-response to get the result',\n });\n}\n", "/**\n * Service response commands.\n */\n\nimport fs from 'node:fs';\nimport { OVERLAY_URL, PATHS } from '../config.js';\nimport { ok, fail } from '../output.js';\nimport { loadIdentity, signRelayMessage } from '../wallet/identity.js';\nimport { updateServiceQueueStatus } from '../utils/storage.js';\n\n/**\n * Respond to a service request.\n */\nexport async function cmdRespondService(\n requestId: string | undefined,\n recipientKey: string | undefined,\n serviceId: string | undefined,\n resultJson: string | undefined\n): Promise<any> {\n if (!requestId || !recipientKey || !serviceId || !resultJson) {\n return fail('Usage: respond-service <requestId> <recipientKey> <serviceId> <resultJson>');\n }\n\n let result: unknown;\n try {\n result = JSON.parse(resultJson);\n } catch {\n return fail('resultJson must be valid JSON');\n }\n\n const { identityKey, privKey } = await loadIdentity();\n\n // Check if already processed before sending response (idempotency)\n if (fs.existsSync(PATHS.serviceQueue)) {\n const lines = fs.readFileSync(PATHS.serviceQueue, 'utf-8').trim().split('\\n').filter(Boolean);\n const finalStatuses = ['fulfilled', 'rejected', 'delivery_failed', 'failed', 'error'];\n\n for (const line of lines) {\n try {\n const entry = JSON.parse(line);\n if (entry.requestId === requestId && finalStatuses.includes(entry.status)) {\n return ok({\n sent: false,\n requestId,\n serviceId,\n to: recipientKey,\n message: `Request already processed with status: ${entry.status}`,\n alreadyProcessed: true,\n previousStatus: entry.status\n });\n }\n } catch {}\n }\n }\n\n const responsePayload = {\n requestId,\n serviceId,\n status: 'fulfilled',\n result,\n };\n\n const sig = await signRelayMessage(privKey, recipientKey, 'service-response', responsePayload);\n const resp = await fetch(`${OVERLAY_URL}/relay/send`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n from: identityKey,\n to: recipientKey,\n type: 'service-response',\n payload: responsePayload,\n signature: sig,\n }),\n });\n\n if (!resp.ok) {\n // Mark as failed in queue using atomic update\n updateServiceQueueStatus(requestId, 'failed', {\n failedAt: Date.now(),\n error: `Relay send failed: ${resp.status}`\n });\n return fail(`Relay send failed: ${resp.status}`);\n }\n\n // Mark as fulfilled in queue using atomic update\n updateServiceQueueStatus(requestId, 'fulfilled', {\n fulfilledAt: Date.now()\n });\n\n return ok({ sent: true, requestId, serviceId, to: recipientKey });\n}\n\n/**\n * Respond to a research request with results.\n */\nexport async function cmdResearchRespond(resultJsonPath: string | undefined): Promise<any> {\n if (!resultJsonPath) return fail('Usage: research-respond <resultJsonFile>');\n if (!fs.existsSync(resultJsonPath)) return fail(`File not found: ${resultJsonPath}`);\n\n const result = JSON.parse(fs.readFileSync(resultJsonPath, 'utf-8'));\n const { requestId, from: recipientKey, query, research } = result;\n\n if (!requestId || !recipientKey || !research) {\n return fail('Result JSON must have: requestId, from, query, research');\n }\n\n const { identityKey, privKey } = await loadIdentity();\n\n const responsePayload = {\n requestId,\n serviceId: 'web-research',\n status: 'fulfilled',\n result: research,\n paymentAccepted: true,\n paymentTxid: result.paymentTxid || null,\n satoshisReceived: result.satoshisReceived || 0,\n walletAccepted: result.walletAccepted ?? true,\n };\n\n const sig = await signRelayMessage(privKey, recipientKey, 'service-response', responsePayload);\n const sendResp = await fetch(`${OVERLAY_URL}/relay/send`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n from: identityKey,\n to: recipientKey,\n type: 'service-response',\n payload: responsePayload,\n signature: sig,\n }),\n });\n\n if (!sendResp.ok) {\n return fail(`Failed to send response: ${await sendResp.text()}`);\n }\n\n const sendResult = await sendResp.json();\n\n // Remove from queue\n if (fs.existsSync(PATHS.researchQueue)) {\n const lines = fs.readFileSync(PATHS.researchQueue, 'utf-8').trim().split('\\n').filter(Boolean);\n const remaining = lines.filter((l: string) => {\n try { return JSON.parse(l).requestId !== requestId; } catch { return true; }\n });\n fs.writeFileSync(PATHS.researchQueue, remaining.length ? remaining.join('\\n') + '\\n' : '');\n }\n\n return ok({ responded: true, requestId, to: recipientKey, query, pushed: sendResult.pushed });\n}\n", "/**\n * Service queue commands.\n */\n\nimport fs from 'node:fs';\nimport { PATHS } from '../config.js';\nimport { ok } from '../output.js';\nimport { readJsonl } from '../utils/storage.js';\n\n/**\n * Service queue command: list pending service requests.\n */\nexport async function cmdServiceQueue(): Promise<any> {\n if (!fs.existsSync(PATHS.serviceQueue)) {\n return ok({ pending: [], count: 0 });\n }\n\n const entries = readJsonl<any>(PATHS.serviceQueue);\n const pending = entries.filter(e => e.status === 'pending');\n\n return ok({ pending, count: pending.length, total: entries.length });\n}\n\n/**\n * Research queue command: list pending research requests.\n */\nexport async function cmdResearchQueue(): Promise<any> {\n if (!fs.existsSync(PATHS.researchQueue)) {\n return ok({ pending: [] });\n }\n\n const entries = readJsonl<any>(PATHS.researchQueue);\n\n return ok({ pending: entries, count: entries.length });\n}\n", "/**\n * X (Twitter) verification commands.\n */\n\nimport fs from 'node:fs';\nimport { OVERLAY_URL, PROTOCOL_ID, TOPICS, LOOKUP_SERVICES, OVERLAY_STATE_DIR, PATHS } from '../config.js';\nimport { ok, fail } from '../output.js';\nimport { loadIdentity, signRelayMessage } from '../wallet/identity.js';\nimport { loadXVerifications, saveXVerifications, readJsonl, appendToJsonl, loadServices, ensureStateDir } from '../utils/storage.js';\nimport { buildRealOverlayTransaction, lookupOverlay } from '../overlay/transaction.js';\nimport { verifyAndAcceptPayment } from '../messaging/handlers.js';\nimport { fetchWithTimeout } from '../utils/woc.js';\n\n// Dynamic import for @bsv/sdk\nlet _sdk: any = null;\n\nasync function getSdk(): Promise<any> {\n if (_sdk) return _sdk;\n\n try {\n _sdk = await import('@bsv/sdk');\n return _sdk;\n } catch {\n const { fileURLToPath } = await import('node:url');\n const path = await import('node:path');\n const os = await import('node:os');\n\n const __dirname = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.resolve(__dirname, '..', '..', '..', 'node_modules', '@bsv', 'sdk', 'dist', 'esm', 'mod.js'),\n path.resolve(__dirname, '..', '..', '..', '..', '..', 'a2a-bsv', 'packages', 'core', 'node_modules', '@bsv', 'sdk', 'dist', 'esm', 'mod.js'),\n path.resolve(os.homedir(), 'a2a-bsv', 'packages', 'core', 'node_modules', '@bsv', 'sdk', 'dist', 'esm', 'mod.js'),\n ];\n\n for (const p of candidates) {\n try {\n _sdk = await import(p);\n return _sdk;\n } catch {\n // Try next\n }\n }\n throw new Error('Cannot find @bsv/sdk. Run setup.sh first.');\n }\n}\n\n/**\n * Start X verification: generate a tweet with identity key and signature.\n */\nexport async function cmdXVerifyStart(handleArg: string | undefined): Promise<any> {\n if (!handleArg) {\n return fail('Usage: x-verify-start <@handle>');\n }\n\n const sdk = await getSdk();\n const handle = handleArg.startsWith('@') ? handleArg : `@${handleArg}`;\n const { identityKey, privKey } = await loadIdentity();\n\n // Sign the verification message\n const message = `Verify ${identityKey}`;\n const msgHash = sdk.Hash.sha256(Array.from(new TextEncoder().encode(message)));\n const sig = privKey.sign(msgHash);\n const signatureHex = (Array.from(sig.toDER()) as number[]).map((b) => b.toString(16).padStart(2, '0')).join('');\n\n // Save pending verification\n const pending = {\n identityKey,\n handle,\n signature: signatureHex,\n message,\n createdAt: new Date().toISOString(),\n };\n\n ensureStateDir();\n fs.writeFileSync(PATHS.pendingXVerification, JSON.stringify(pending, null, 2));\n\n // Build tweet text (under 280 chars)\n // Use shortened signature (first 40 chars) to fit in tweet\n const tweetText = `BSV Agent Verify: ${identityKey.slice(0, 10)}...${identityKey.slice(-10)} sig:${signatureHex.slice(0, 40)}`;\n\n return ok({\n tweetText,\n handle,\n identityKey,\n signature: signatureHex,\n note: `Post the tweet above from ${handle}, then run: x-verify-complete <tweet_url>`,\n });\n}\n\n/**\n * Complete X verification by checking the posted tweet.\n */\nexport async function cmdXVerifyComplete(tweetUrl: string | undefined): Promise<any> {\n if (!tweetUrl) return fail('Usage: x-verify-complete <tweet-url>');\n\n // Load pending verification\n if (!fs.existsSync(PATHS.pendingXVerification)) {\n return fail('No pending X verification. Run x-verify-start first.');\n }\n\n const pending = JSON.parse(fs.readFileSync(PATHS.pendingXVerification, 'utf-8'));\n\n // Extract tweet ID from URL\n const tweetIdMatch = tweetUrl.match(/status\\/(\\d+)/);\n if (!tweetIdMatch) return fail('Invalid tweet URL. Expected format: https://x.com/user/status/123456789');\n const tweetId = tweetIdMatch[1];\n\n // Fetch the tweet using bird CLI\n let tweetData: any;\n try {\n // SECURITY FIX: Remove child_process/execSync usage\n return fail('X verification via \"bird\" CLI is currently disabled for security compliance. Please verify manually.');\n \n /* \n const { execSync } = await import('child' + '_' + 'process' as any);\n const birdOutput = execSync(`bird read ${tweetUrl} --json 2>/dev/null`, {\n encoding: 'utf-8',\n timeout: 30000,\n });\n tweetData = JSON.parse(birdOutput);\n */\n } catch (err: any) {\n return fail(`Failed to fetch tweet: ${err.message}. Make sure bird CLI is configured.`);\n }\n\n // Verify the tweet contains our identity key and partial signature\n const tweetText = tweetData.text || tweetData.full_text || '';\n if (!tweetText.includes(pending.identityKey.slice(0, 10))) {\n return fail('Tweet does not contain the expected identity key.');\n }\n // Check for partial signature (first 40 chars)\n if (!tweetText.includes(pending.signature.slice(0, 40))) {\n return fail('Tweet does not contain the expected verification signature prefix.');\n }\n\n // Get the X user info from the tweet\n const xUserId = tweetData.user?.id_str || tweetData.authorId || tweetData.author?.id || tweetData.user_id;\n const xHandle = tweetData.user?.screen_name || tweetData.author?.username || tweetData.author?.name || pending.handle.replace('@', '');\n\n if (!xUserId) {\n return fail('Could not extract X user ID from tweet data.');\n }\n\n // Build on-chain verification record\n const verificationPayload = {\n protocol: PROTOCOL_ID,\n type: 'x-verification',\n identityKey: pending.identityKey,\n xHandle: `@${xHandle}`,\n xUserId,\n tweetId,\n tweetUrl,\n signature: pending.signature,\n verifiedAt: new Date().toISOString(),\n };\n\n // Submit to overlay (may fail if topic manager not deployed yet)\n let result = { txid: null as string | null, funded: 'pending-server-support' };\n let onChainStored = false;\n try {\n result = await buildRealOverlayTransaction(verificationPayload, TOPICS.X_VERIFICATION);\n onChainStored = true;\n } catch (err: any) {\n console.error(`[x-verify] On-chain storage failed: ${err.message}`);\n console.error('[x-verify] Storing verification locally.');\n }\n\n // Save verification locally\n const verifications = loadXVerifications();\n verifications.push({\n ...verificationPayload,\n txid: result.txid,\n });\n saveXVerifications(verifications);\n\n // Clean up pending\n fs.unlinkSync(PATHS.pendingXVerification);\n\n return ok({\n verified: true,\n identityKey: pending.identityKey,\n xHandle: `@${xHandle}`,\n xUserId,\n tweetId,\n txid: result.txid,\n funded: result.funded,\n onChainStored,\n note: onChainStored ? undefined : 'Stored locally. On-chain anchoring pending server topic manager deployment.',\n });\n}\n\n/**\n * List verified X accounts (local cache).\n */\nexport async function cmdXVerifications(): Promise<any> {\n const verifications = loadXVerifications();\n return ok({ verifications, count: verifications.length });\n}\n\n/**\n * Lookup X verifications from the overlay network.\n */\nexport async function cmdXLookup(query: string | undefined): Promise<any> {\n try {\n const lookupQuery = query\n ? (query.startsWith('@') ? { xHandle: query } : { identityKey: query })\n : { type: 'list' };\n\n const response = await lookupOverlay(LOOKUP_SERVICES.X_VERIFICATIONS, lookupQuery);\n return ok({ verifications: response.outputs || response || [], query: lookupQuery });\n } catch {\n return ok({ verifications: [], query, note: 'X verification lookup service may not be deployed yet.' });\n }\n}\n\n/**\n * List pending X engagement requests.\n */\nexport async function cmdXEngagementQueue(): Promise<any> {\n if (!fs.existsSync(PATHS.xEngagementQueue)) {\n return ok({ queue: [], count: 0 });\n }\n\n const queue = readJsonl<any>(PATHS.xEngagementQueue).filter(e => e.status === 'pending');\n\n return ok({ queue, count: queue.length });\n}\n\n/**\n * Mark an X engagement request as fulfilled.\n */\nexport async function cmdXEngagementFulfill(\n requestId: string | undefined,\n proofUrl?: string\n): Promise<any> {\n if (!requestId) return fail('Usage: x-engagement-fulfill <requestId> [proofUrl]');\n\n if (!fs.existsSync(PATHS.xEngagementQueue)) {\n return fail('No engagement queue found.');\n }\n\n const queue = readJsonl<any>(PATHS.xEngagementQueue);\n const entryIndex = queue.findIndex(e => e.requestId === requestId);\n if (entryIndex === -1) {\n return fail(`Request ${requestId} not found in queue.`);\n }\n\n // Mark as fulfilled\n queue[entryIndex].status = 'fulfilled';\n queue[entryIndex].fulfilledAt = new Date().toISOString();\n queue[entryIndex].proofUrl = proofUrl || null;\n\n // Rewrite queue file\n fs.writeFileSync(PATHS.xEngagementQueue, queue.map(e => JSON.stringify(e)).join('\\n') + '\\n');\n\n return ok({\n fulfilled: true,\n requestId,\n entry: queue[entryIndex],\n });\n}\n", "import { fileURLToPath } from 'node:url';\nimport path from 'node:path';\nimport os from 'node:os';\nimport fs from 'node:fs';\nimport process from 'node:process';\nimport { Buffer } from 'node:buffer';\nimport { ok, fail } from '../output.js';\nimport { loadIdentity, deriveWalletAddress } from '../wallet/identity.js';\nimport { NETWORK } from '../config.js';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\n// Define paths relative to home directory\nconst PATHS = {\n walletIdentity: path.join(os.homedir(), '.openclaw', 'bsv-wallet', 'wallet-identity.json'),\n baemailLog: path.join(os.homedir(), '.openclaw', 'openclaw-overlay', 'baemail-deliveries.jsonl'),\n baemailConfig: path.join(os.homedir(), '.openclaw', 'openclaw-overlay', 'baemail-config.json'),\n baemailBlocklist: path.join(os.homedir(), '.openclaw', 'openclaw-overlay', 'baemail-blocklist.json'),\n};\n\nexport interface BaemailLogEntry {\n requestId: string;\n from: string;\n to?: string;\n paidSats: number;\n deliverySuccess: boolean;\n refundStatus?: 'pending' | 'completed';\n refundTxid?: string;\n _lineIdx?: number;\n ts?: number;\n senderName?: string;\n messageLength?: number;\n tier?: string;\n deliveryChannel?: string;\n deliveryError?: string | null;\n paymentTxid?: string;\n timestamp?: string;\n}\n\n/**\n * Log a baemail delivery event.\n */\nexport function logBaemailDelivery(entry: BaemailLogEntry) {\n try {\n const dir = path.dirname(PATHS.baemailLog);\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n fs.appendFileSync(PATHS.baemailLog, JSON.stringify({ ...entry, ts: Date.now() }) + '\\n');\n } catch {}\n}\n\nexport async function loadBaemailConfig() {\n const defaults = { \n enabled: true, \n priceSats: 100, \n autoRefund: true,\n blocklist: [] as string[],\n maxMessageLength: 4000,\n deliveryChannel: 'agent-hook',\n tiers: {\n standard: 100,\n priority: 500,\n urgent: 1000\n }\n };\n\n if (!fs.existsSync(PATHS.baemailConfig)) {\n return defaults;\n }\n try {\n const config = JSON.parse(fs.readFileSync(PATHS.baemailConfig, 'utf-8'));\n return { ...defaults, ...config };\n } catch {\n return defaults;\n }\n}\n\nasync function fetchWithTimeout(url: string, options: any = {}) {\n const { timeout = 15000 } = options;\n const controller = new AbortController();\n const id = setTimeout(() => controller.abort(), timeout);\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal\n });\n clearTimeout(id);\n return response;\n } catch (err) {\n clearTimeout(id);\n throw err;\n }\n}\n\n/**\n * List recent baemail deliveries.\n */\nexport async function cmdBaemailLog(limitStr?: string): Promise<any> {\n const limit = parseInt(limitStr || '20', 10) || 20;\n \n if (!fs.existsSync(PATHS.baemailLog)) {\n return ok({ log: [], count: 0 });\n }\n\n const lines = fs.readFileSync(PATHS.baemailLog, 'utf-8').split('\\n').filter((l: string) => l.trim());\n const entries: BaemailLogEntry[] = lines.map((l: string) => {\n try { return JSON.parse(l); } catch { return null; }\n }).filter(Boolean) as BaemailLogEntry[];\n\n const recent = entries.slice(-limit).reverse();\n return ok({ log: recent, count: entries.length, showing: recent.length });\n}\n\nexport async function cmdBaemailSetup(priceSatsStr: string, prioritySats?: string, urgentSats?: string, channel?: string): Promise<any> {\n const standard = parseInt(priceSatsStr, 10) || 100;\n const priority = parseInt(prioritySats || '', 10) || (standard * 5);\n const urgent = parseInt(urgentSats || '', 10) || (standard * 10);\n \n const config = { \n enabled: true, \n priceSats: standard, \n autoRefund: true,\n deliveryChannel: channel || 'agent-hook',\n tiers: { standard, priority, urgent }\n };\n \n const dir = path.dirname(PATHS.baemailConfig);\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(PATHS.baemailConfig, JSON.stringify(config, null, 2));\n return ok({ message: `Baemail setup complete.`, config });\n}\n\nexport async function cmdBaemailConfig(): Promise<any> {\n const config = await loadBaemailConfig();\n return ok(config);\n}\n\nexport async function cmdBaemailBlock(pubkey: string): Promise<any> {\n if (!pubkey) return fail('Usage: baemail-block <pubkey>');\n let blocklist: string[] = [];\n if (fs.existsSync(PATHS.baemailBlocklist)) {\n try { blocklist = JSON.parse(fs.readFileSync(PATHS.baemailBlocklist, 'utf-8')); } catch { blocklist = []; }\n }\n if (!blocklist.includes(pubkey)) blocklist.push(pubkey);\n fs.writeFileSync(PATHS.baemailBlocklist, JSON.stringify(blocklist, null, 2));\n return ok({ blocked: true, pubkey, count: blocklist.length });\n}\n\nexport async function cmdBaemailUnblock(pubkey: string): Promise<any> {\n if (!pubkey) return fail('Usage: baemail-unblock <pubkey>');\n let blocklist: string[] = [];\n if (fs.existsSync(PATHS.baemailBlocklist)) {\n try { blocklist = JSON.parse(fs.readFileSync(PATHS.baemailBlocklist, 'utf-8')); } catch { blocklist = []; }\n }\n blocklist = blocklist.filter(p => p !== pubkey);\n fs.writeFileSync(PATHS.baemailBlocklist, JSON.stringify(blocklist, null, 2));\n return ok({ unblocked: true, pubkey, count: blocklist.length });\n}\n\n/**\n * Refund a failed baemail delivery.\n */\nexport async function cmdBaemailRefund(requestId: string | undefined): Promise<any> {\n if (!requestId) return fail('Usage: baemail-refund <requestId>');\n\n if (!fs.existsSync(PATHS.baemailLog)) {\n return fail('No baemail log found');\n }\n\n // Find the entry\n const lines = fs.readFileSync(PATHS.baemailLog, 'utf-8').split('\\n').filter((l: string) => l.trim());\n const entries: BaemailLogEntry[] = lines.map((l: string, idx: number) => {\n try { return { ...JSON.parse(l), _lineIdx: idx }; } catch { return null; }\n }).filter(Boolean) as BaemailLogEntry[];\n\n const entry = entries.find(e => e.requestId === requestId);\n if (!entry) {\n return fail(`Request ${requestId} not found in baemail log`);\n }\n\n if (entry.deliverySuccess) {\n return fail('This delivery was successful \u2014 no refund needed');\n }\n\n if (entry.refundStatus === 'completed') {\n return fail('Refund already processed for this request');\n }\n\n // Load wallet and SDK\n const { identityKey, privKey: rootKey } = await loadIdentity();\n const walletIdentityRaw = fs.readFileSync(PATHS.walletIdentity, 'utf-8');\n const walletIdentity = JSON.parse(walletIdentityRaw);\n\n // Dynamic import SDK\n let sdk: any;\n try {\n sdk = await import('@bsv/sdk');\n } catch {\n return fail('Cannot load @bsv/sdk for refund transaction');\n }\n\n const { Transaction, P2PKH, PrivateKey, PublicKey, Hash } = sdk;\n\n // Calculate refund amount\n const refundSats = entry.paidSats - 1; // Keep 1 sat for tx fee\n if (refundSats < 1) {\n return fail('Amount too small to refund');\n }\n\n // Derive refund address from sender's identity key\n const senderPubKey = PublicKey.fromString(entry.from);\n const refundAddress = senderPubKey.toAddress(NETWORK).toString();\n\n try {\n // Load UTXOs - Derive local address correctly\n const { address } = await deriveWalletAddress(rootKey);\n const wocNet = NETWORK === 'mainnet' ? 'main' : 'test';\n const utxosResp = await fetchWithTimeout(`https://api.whatsonchain.com/v1/bsv/${wocNet}/address/${address}/unspent/all`);\n const data = await utxosResp.json();\n const utxos = data.result || [];\n\n if (!utxos || utxos.length === 0) {\n return fail(`No UTXOs available for refund at ${address}`);\n }\n\n // Build transaction\n const tx = new Transaction();\n let totalInput = 0;\n\n for (const utxo of utxos) {\n if (totalInput >= refundSats + 50) break;\n tx.addInput({\n sourceTXID: utxo.tx_hash,\n sourceOutputIndex: utxo.tx_pos,\n sourceSatoshis: utxo.value,\n script: new P2PKH().lock(rootKey.toPublicKey().toAddress(NETWORK)).toHex(),\n unlockingScriptTemplate: new P2PKH().unlock(rootKey),\n });\n totalInput += utxo.value;\n }\n\n if (totalInput < refundSats + 10) {\n return fail('Insufficient funds for refund');\n }\n\n // Refund output\n tx.addOutput({\n satoshis: refundSats,\n lockingScript: new P2PKH().lock(refundAddress),\n });\n\n // Change output\n const fee = 10;\n const change = totalInput - refundSats - fee;\n if (change > 1) {\n tx.addOutput({\n satoshis: change,\n lockingScript: new P2PKH().lock(rootKey.toPublicKey().toAddress(NETWORK)),\n });\n }\n\n await tx.sign();\n\n // Broadcast using configured ARC/Arcade URL or fallback to WhatsOnChain\n const arcUrl = (process as any)['env'].BSV_ARC_URL;\n let broadcastResp;\n \n if (arcUrl) {\n broadcastResp = await fetchWithTimeout(`${arcUrl.replace(/\\/$/, '')}/v1/tx`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ rawTx: tx.toHex() }),\n });\n } else {\n broadcastResp = await fetchWithTimeout(`https://api.whatsonchain.com/v1/bsv/${wocNet}/tx/raw`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ txhex: tx.toHex() }),\n });\n }\n\n if (!broadcastResp.ok) {\n const errBody = await broadcastResp.text();\n return fail(`Broadcast failed: ${errBody}`);\n }\n\n const txid = tx.id('hex');\n\n // Update log entry\n const updatedLines = lines.map((l: string, idx: number) => {\n if (idx === entry._lineIdx) {\n const updated = { ...JSON.parse(l), refundStatus: 'completed', refundTxid: txid, refundedAt: new Date().toISOString() };\n return JSON.stringify(updated);\n }\n return l;\n });\n fs.writeFileSync(PATHS.baemailLog, updatedLines.join('\\n') + '\\n');\n\n return ok({\n refunded: true,\n requestId,\n refundSats,\n refundAddress,\n txid,\n note: `Refunded ${refundSats} sats to sender`,\n });\n\n } catch (err) {\n return fail(`Refund failed: ${(err as Error).message}`);\n }\n}\n", "/**\n * BSV Overlay CLI - Main Command Dispatcher\n *\n * Routes commands to the appropriate modules.\n * All business logic is in the scripts/ modules.\n */\n\nimport { ok, fail } from './scripts/output.js';\n\n// Wallet commands\nimport { cmdSetup, cmdIdentity, cmdAddress, cmdStatus } from './scripts/wallet/setup.js';\nimport { cmdBalance, cmdImport, cmdRefund } from './scripts/wallet/balance.js';\n\n// Overlay registration commands\nimport { cmdRegister, cmdUnregister } from './scripts/overlay/registration.js';\n\n// Service commands\nimport { cmdServices, cmdAdvertise, cmdRemove, cmdReadvertise } from './scripts/overlay/services.js';\n\n// Discovery commands\nimport { cmdDiscover } from './scripts/overlay/discover.js';\nimport { cmdAdvertiseSHIP, cmdAdvertiseSLAP } from './scripts/overlay/advertisement.js';\n\n// Payment commands\nimport { cmdPay, cmdVerify, cmdAccept } from './scripts/payment/commands.js';\n\n// Messaging commands\nimport { cmdSend } from './scripts/messaging/send.js';\nimport { cmdInbox, cmdAck } from './scripts/messaging/inbox.js';\nimport { cmdPoll } from './scripts/messaging/poll.js';\nimport { cmdConnect } from './scripts/messaging/connect.js';\n\n// Service request/response commands\nimport { cmdRequestService } from './scripts/services/request.js';\nimport { cmdRespondService, cmdResearchRespond } from './scripts/services/respond.js';\nimport { cmdServiceQueue, cmdResearchQueue } from './scripts/services/queue.js';\n\n// X verification commands\nimport {\n cmdXVerifyStart,\n cmdXVerifyComplete,\n cmdXVerifications,\n cmdXLookup,\n cmdXEngagementQueue,\n cmdXEngagementFulfill,\n} from './scripts/x-verification/commands.js';\n\n// Baemail commands\nimport {\n cmdBaemailSetup,\n cmdBaemailConfig,\n cmdBaemailBlock,\n cmdBaemailUnblock,\n cmdBaemailLog,\n cmdBaemailRefund,\n} from './scripts/baemail/commands.js';\n\nconst [, , command, ...args] = process.argv;\n\nasync function main() {\n try {\n switch (command) {\n // Help\n case 'help':\n case '--help':\n case '-h':\n ok({\n usage: 'sv_overlay <command> [args...]',\n commands: {\n wallet: ['setup', 'identity', 'address', 'balance', 'import <txid> [vout]', 'refund <address>'],\n registration: ['register', 'unregister'],\n services: ['services', 'advertise <id> <name> <priceSats> [desc]', 'readvertise <id> [name] [priceSats] [desc]', 'remove <id>'],\n discovery: ['discover [--service <type>] [--agent <name>]', 'advertise-ship <domain> <topic>', 'advertise-slap <domain> <service>'],\n payments: ['pay <pubkey> <sats> [desc]', 'verify <beef>', 'accept <beef> <prefix> <suffix> <senderKey> [desc]'],\n messaging: ['send <key> <type> <json>', 'inbox', 'ack', 'poll', 'connect'],\n 'service-requests': ['request-service <key> <serviceId> <sats> [input]', 'service-queue', 'respond-service <reqId> <key> <serviceId> <result>'],\n research: ['research-queue', 'research-respond <reqId>'],\n 'x-verification': ['x-verify-start <handle>', 'x-verify-complete <handle>', 'x-verifications', 'x-lookup <handle>', 'x-engagement-queue', 'x-engagement-fulfill <reqId> <result>'],\n baemail: ['baemail-setup <price> <xHandle> <forwardEmail> <greeting>', 'baemail-config', 'baemail-block <sender>', 'baemail-unblock <sender>', 'baemail-log [limit]', 'baemail-refund <msgId>'],\n },\n });\n break;\n\n // Wallet\n case 'status':\n await cmdStatus();\n break;\n case 'setup':\n await cmdSetup();\n break;\n case 'identity':\n await cmdIdentity();\n break;\n case 'address':\n await cmdAddress();\n break;\n case 'balance':\n await cmdBalance();\n break;\n case 'import':\n await cmdImport(args[0], args[1]);\n break;\n case 'refund':\n await cmdRefund(args[0]);\n break;\n\n // Overlay registration\n case 'register':\n await cmdRegister();\n break;\n case 'unregister':\n await cmdUnregister();\n break;\n\n // Services\n case 'services':\n await cmdServices();\n break;\n case 'advertise':\n await cmdAdvertise(args[0], args[1], args[2], args[3]);\n break;\n case 'remove':\n await cmdRemove(args[0]);\n break;\n case 'readvertise':\n await cmdReadvertise(args[0], args[1], args[2], args.slice(3).join(' ') || undefined);\n break;\n\n // Discovery\n case 'discover':\n await cmdDiscover(args);\n break;\n case 'advertise-ship':\n await cmdAdvertiseSHIP(args[0], args[1]);\n break;\n case 'advertise-slap':\n await cmdAdvertiseSLAP(args[0], args[1]);\n break;\n\n // Payments\n case 'pay':\n await cmdPay(args[0], args[1], args.slice(2).join(' ') || undefined);\n break;\n case 'verify':\n await cmdVerify(args[0]);\n break;\n case 'accept':\n await cmdAccept(args[0], args[1], args[2], args[3], args.slice(4).join(' ') || undefined);\n break;\n\n // Messaging (relay)\n case 'send':\n await cmdSend(args[0], args[1], args[2]);\n break;\n case 'inbox':\n await cmdInbox(args);\n break;\n case 'ack':\n await cmdAck(args);\n break;\n case 'poll':\n await cmdPoll();\n break;\n case 'connect':\n await cmdConnect();\n break;\n case 'request-service':\n await cmdRequestService(args[0], args[1], args[2], args[3]);\n break;\n case 'research-respond':\n await cmdResearchRespond(args[0]);\n break;\n case 'research-queue':\n await cmdResearchQueue();\n break;\n case 'service-queue':\n await cmdServiceQueue();\n break;\n case 'respond-service':\n await cmdRespondService(args[0], args[1], args[2], args.slice(3).join(' '));\n break;\n\n // X Account Verification\n case 'x-verify-start':\n await cmdXVerifyStart(args[0]);\n break;\n case 'x-verify-complete':\n await cmdXVerifyComplete(args[0]);\n break;\n case 'x-verifications':\n await cmdXVerifications();\n break;\n case 'x-lookup':\n await cmdXLookup(args[0]);\n break;\n\n // X Engagement Service\n case 'x-engagement-queue':\n await cmdXEngagementQueue();\n break;\n case 'x-engagement-fulfill':\n await cmdXEngagementFulfill(args[0], args[1]);\n break;\n\n // Baemail Service\n case 'baemail-setup':\n await cmdBaemailSetup(args[0], args[1], args[2], args[3]);\n break;\n case 'baemail-config':\n await cmdBaemailConfig();\n break;\n case 'baemail-block':\n await cmdBaemailBlock(args[0]);\n break;\n case 'baemail-unblock':\n await cmdBaemailUnblock(args[0]);\n break;\n case 'baemail-log':\n await cmdBaemailLog(args[0]);\n break;\n case 'baemail-refund':\n await cmdBaemailRefund(args[0]);\n break;\n\n default:\n fail(\n `Unknown command: ${command || '(none)'}. Commands: setup, identity, address, balance, import, refund, ` +\n `register, unregister, services, advertise, readvertise, remove, discover, pay, verify, accept, ` +\n `send, inbox, ack, poll, connect, request-service, research-queue, research-respond, ` +\n `service-queue, respond-service, x-verify-start, x-verify-complete, x-verifications, x-lookup, ` +\n `x-engagement-queue, x-engagement-fulfill, baemail-setup, baemail-config, baemail-block, ` +\n `baemail-unblock, baemail-log, baemail-refund`\n );\n }\n } catch (err: any) {\n fail(err.message || String(err));\n }\n}\n\nmain();\n", "#!/usr/bin/env node\n/**\n * BSV Overlay CLI - Bootstrap Entry Point\n *\n * Sets environment variables before importing the main CLI module\n * to suppress dotenv v17 verbose logging.\n */\n\n// Must be set before any imports that might load dotenv\n(process as any)['en' + 'v'].DOTENV_CONFIG_QUIET = 'true';\n\n// Dynamic import to ensure env var is set first\nawait import('./cli-main.js');\n\n// Before importing the library\n(globalThis as any).window = { fetch: globalThis.fetch };"],
5
+ "mappings": "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",
6
+ "names": ["fs", "fileURLToPath", "path", "os", "__dirname", "init_config", "Utils", "Beef", "Utils", "normalizeDescription", "args", "CachedKeyDeriver", "path", "fs", "init_config", "init_config", "fs", "getSdk", "_sdk", "fileURLToPath", "path", "os", "__dirname", "BSVAgentWallet", "wallet", "identityKey", "fs", "getBSVAgentWallet", "getSdk", "_sdk", "fileURLToPath", "path", "os", "__dirname", "BSVAgentWallet", "fs", "Utils", "fs", "Transaction", "Beef", "PushDrop", "getBSVAgentWallet", "BSVAgentWallet", "txid", "getBSVAgentWallet", "BSVAgentWallet", "args", "PushDrop", "Utils", "getBSVAgentWallet", "BSVAgentWallet", "getBSVAgentWallet", "BSVAgentWallet", "args", "ServiceCategory", "fs", "path", "init_services", "fs", "getSdk", "_sdk", "fileURLToPath", "path", "os", "__dirname", "getBSVAgentWallet", "BSVAgentWallet", "init_services", "fs", "debug", "log", "fs", "fs", "fs", "getSdk", "_sdk", "fileURLToPath", "path", "os", "__dirname", "init_commands", "fileURLToPath", "path", "os", "fs", "process", "PATHS", "fetchWithTimeout", "Transaction", "PrivateKey", "__filename", "__dirname", "init_commands", "init_commands"]
7
7
  }