@onekeyfe/hwk-keystone-adapter 1.2.5-alpha.3 → 1.2.6-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +10 -9
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +15 -12
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -3
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/urEngine/KeystoneUrEngine.ts","../src/urEngine/TronSignRequest.ts","../src/urEngine/TronSignature.ts","../src/adapter/KeystoneAdapter.ts","../src/adapter/pathUtils.ts","../src/adapter/deviceTable.ts","../src/utils/queueKey.ts"],"sourcesContent":["// UR engine, shared by QR and USB since both carry the same UR payloads.\nexport { KeystoneUrEngine } from './urEngine/KeystoneUrEngine';\nexport type {\n BtcScriptType,\n KeystoneBtcSignatureResult,\n KeystoneBtcSignRequestAccount,\n KeystoneDerivationCurve,\n KeystoneEthSignatureResult,\n KeystoneEthSignRequestInput,\n KeystoneKeyDerivationRequestInput,\n KeystoneKeySchema,\n KeystoneParsedAccount,\n KeystoneParsedMultiAccounts,\n KeystoneSolSignatureResult,\n KeystoneSolSignRequestInput,\n KeystoneTronSignatureResult,\n KeystoneTronSignRequestInput,\n KeystoneUr,\n} from './urEngine/types';\n\n// Adapter\nexport { KeystoneAdapter } from './adapter/KeystoneAdapter';\nexport type { ImportFromQrOptions } from './adapter/KeystoneAdapter';\nexport {\n KEYSTONE_COLD_START_PATH,\n KEYSTONE_WALLET_CONNECT_ID_PREFIX,\n accountKey,\n createDeviceRecord,\n placeholderDeviceInfo,\n toDeviceInfo,\n walletConnectId,\n} from './adapter/deviceTable';\nexport type { KeystoneAccountEntry, KeystoneDeviceRecord } from './adapter/deviceTable';\nexport { btcScriptTypeFromPath, normalizePath, splitAccountPath } from './adapter/pathUtils';\n","import { generateAddressFromXpub } from '@keystonehq/bc-ur-registry-eth';\nimport { Curve, KeystoneSDK, QRHardwareCallVersion, UR } from '@keystonehq/keystone-sdk';\nimport bs58check from 'bs58check';\nimport * as bitcoin from 'bitcoinjs-lib';\nimport HDKey from 'hdkey';\nimport { parse as uuidParse, stringify as uuidStringify } from 'uuid';\nimport { parseBip32MasterFingerprint } from '@onekeyfe/hwk-adapter-core';\n\nimport { TronSignRequest, TronSignType } from './TronSignRequest';\nimport { TronSignature } from './TronSignature';\n\nimport type {\n BtcScriptType,\n KeystoneBtcSignRequestAccount,\n KeystoneBtcSignatureResult,\n KeystoneEthSignRequestInput,\n KeystoneEthSignatureResult,\n KeystoneKeyDerivationRequestInput,\n KeystoneParsedAccount,\n KeystoneParsedMultiAccounts,\n KeystoneSolSignRequestInput,\n KeystoneSolSignatureResult,\n KeystoneTronSignRequestInput,\n KeystoneTronSignatureResult,\n KeystoneUr,\n} from './types';\n\n/** TRON's own address-version byte, prepended before base58check encoding. */\nconst TRON_ADDRESS_PREFIX = 0x41;\n\nfunction stripHexPrefix(hex: string): string {\n return hex.replace(/^0x/i, '');\n}\n\nconst ETH_DATA_TYPE = {\n transaction: 1,\n typedData: 2,\n personalMessage: 3,\n typedTransaction: 4,\n} as const;\n\nconst DERIVATION_CURVE = {\n secp256k1: Curve.secp256k1,\n ed25519: Curve.ed25519,\n} as const;\n\nfunction toSdkUr(ur: KeystoneUr): UR {\n return new UR(Buffer.from(ur.urData, 'hex'), ur.urType);\n}\n\nfunction fromSdkUr(ur: UR): KeystoneUr {\n return { urType: ur.type, urData: ur.cbor.toString('hex') };\n}\n\n/**\n * r(32) | s(32) | v. A legacy EIP-155 tx's v is 35 + 2 * chainId + recId, so it\n * outgrows one byte from chainId 110 on; a short answer must still fail here.\n */\nfunction splitEvmSignature(hex: string): { r: string; s: string; v: string } {\n if (hex.length < 130 || hex.length % 2 !== 0) {\n throw new Error(\n `Keystone returned a ${hex.length / 2}-byte signature; expected at least 65 bytes (r|s|v)`\n );\n }\n return { r: hex.slice(0, 64), s: hex.slice(64, 128), v: hex.slice(128) };\n}\n\n/** Same short-answer guard as `splitEvmSignature` for chains whose signature is one fixed-length blob. */\nfunction requireSignatureBytes(hex: string, expectedBytes: number, chain: string): string {\n if (hex.length !== expectedBytes * 2) {\n throw new Error(\n `Keystone returned a ${\n hex.length / 2\n }-byte ${chain} signature; expected ${expectedBytes} bytes`\n );\n }\n return hex;\n}\n\n// The registry decodes a missing mfp as four zero bytes; that is never a usable wallet identity.\nconst MISSING_MASTER_FINGERPRINT = '00000000';\n\nfunction requireBip32MasterFingerprint(value: unknown): string {\n const fingerprint = parseBip32MasterFingerprint(value);\n if (!fingerprint || fingerprint === MISSING_MASTER_FINGERPRINT) {\n throw new Error('Keystone master fingerprint must be exactly 4 bytes (8 hex characters)');\n }\n return fingerprint;\n}\n\nfunction toParsedAccount(key: ReturnType<KeystoneSDK['parseHDKey']>): KeystoneParsedAccount {\n return {\n chain: key.chain,\n path: key.path,\n publicKey: key.publicKey,\n extendedPublicKey: key.extendedPublicKey,\n xfp: key.xfp ? requireBip32MasterFingerprint(key.xfp) : undefined,\n name: key.name,\n };\n}\n\n/** Relative derivation path in the `m/`-prefixed form the xpub helpers expect. */\nfunction relativeHdPath(relativeDerivePath: string): string {\n return `m/${relativeDerivePath.replace(/^m\\//i, '')}`;\n}\n\n/**\n * Single touch point with `@keystonehq/keystone-sdk`, shared by QR and USB. Uses the bare\n * constructor: `KeystoneSDK.create()` fetches remote config at call time.\n */\nexport class KeystoneUrEngine {\n private readonly sdk: KeystoneSDK;\n\n constructor(origin = 'OneKey') {\n this.sdk = new KeystoneSDK({ origin });\n }\n\n // --- Account sync (device-initiated export or KeyDerivation response) ---\n\n parseMultiAccounts(ur: KeystoneUr): KeystoneParsedMultiAccounts {\n const parsed = this.sdk.parseMultiAccounts(toSdkUr(ur));\n return {\n masterFingerprint: requireBip32MasterFingerprint(parsed.masterFingerprint),\n device: parsed.device,\n deviceId: parsed.deviceId,\n deviceVersion: parsed.deviceVersion,\n accounts: parsed.keys.map(toParsedAccount),\n };\n }\n\n parseHDKey(ur: KeystoneUr): KeystoneParsedAccount {\n return toParsedAccount(this.sdk.parseHDKey(toSdkUr(ur)));\n }\n\n /**\n * Builds a KeyDerivation request. `version: V1` is required: firmware validates V0 (the SDK\n * default) as Cardano-only and rejects other paths with `PRS_PARSING_ERROR`.\n */\n buildKeyDerivationRequest(input: KeystoneKeyDerivationRequestInput): KeystoneUr {\n const ur = this.sdk.generateKeyDerivationCall({\n schemas: input.schemas.map(schema => ({\n path: schema.path,\n curve: DERIVATION_CURVE[schema.curve ?? 'secp256k1'],\n })),\n origin: input.origin,\n version: QRHardwareCallVersion.V1,\n });\n return fromSdkUr(ur);\n }\n\n /**\n * Normalizes `crypto-multi-accounts` and the single-key `crypto-hdkey` some firmware returns. The\n * hdkey source fingerprint is the mfp only because every request here derives from the seed.\n */\n parseAccountResponse(ur: KeystoneUr): KeystoneParsedMultiAccounts {\n if (ur.urType === 'crypto-hdkey') {\n const account = this.parseHDKey(ur);\n if (!account.xfp) {\n throw new Error('Keystone crypto-hdkey response is missing its source fingerprint');\n }\n return {\n masterFingerprint: requireBip32MasterFingerprint(account.xfp),\n accounts: [account],\n };\n }\n return this.parseMultiAccounts(ur);\n }\n\n // --- EVM ---\n\n buildEthSignRequest(input: KeystoneEthSignRequestInput): KeystoneUr {\n const ur = this.sdk.eth.generateSignRequest({\n requestId: input.requestId,\n signData: input.unsignedTxHex,\n dataType: ETH_DATA_TYPE[input.dataType],\n path: input.path,\n xfp: input.xfp,\n chainId: input.chainId,\n address: input.address,\n origin: input.origin,\n });\n return fromSdkUr(ur);\n }\n\n parseEthSignature(ur: KeystoneUr): KeystoneEthSignatureResult {\n const signature = this.sdk.eth.parseSignature(toSdkUr(ur));\n return { requestId: signature.requestId, ...splitEvmSignature(signature.signature) };\n }\n\n /** Derives an EVM address offline; `relativeDerivePath` is relative to the xpub, e.g. `'0/0'`. */\n deriveEvmAddressFromXpub(xpub: string, relativeDerivePath: string): string {\n return generateAddressFromXpub(xpub, relativeHdPath(relativeDerivePath));\n }\n\n // --- BTC (PSBT transaction signing + plain message signing) ---\n\n /**\n * `CryptoHDKey` always emits mainnet xpub version bytes (`0488B21E`), so `hdkey` parses it as is.\n * `p2tr` needs an ECC lib for BIP-341 tweaking, not wired here.\n */\n deriveBtcAddressFromXpub(\n xpub: string,\n relativeDerivePath: string,\n scriptType: BtcScriptType\n ): string {\n const node = HDKey.fromExtendedKey(xpub).derive(relativeHdPath(relativeDerivePath));\n if (!node.publicKey) throw new Error('HDKey derivation did not produce a public key');\n return this.deriveBtcAddressFromPublicKey(\n Buffer.from(node.publicKey).toString('hex'),\n scriptType\n );\n }\n\n deriveBtcAddressFromPublicKey(publicKeyHex: string, scriptType: BtcScriptType): string {\n const pubkey = Buffer.from(stripHexPrefix(publicKeyHex), 'hex');\n const network = bitcoin.networks.bitcoin;\n\n switch (scriptType) {\n case 'p2pkh': {\n const { address } = bitcoin.payments.p2pkh({ pubkey, network });\n if (!address) throw new Error('Failed to derive a P2PKH address from this public key');\n return address;\n }\n case 'p2sh-p2wpkh': {\n const { address } = bitcoin.payments.p2sh({\n redeem: bitcoin.payments.p2wpkh({ pubkey, network }),\n network,\n });\n if (!address)\n throw new Error('Failed to derive a P2SH-P2WPKH address from this public key');\n return address;\n }\n case 'p2wpkh': {\n const { address } = bitcoin.payments.p2wpkh({ pubkey, network });\n if (!address) throw new Error('Failed to derive a P2WPKH address from this public key');\n return address;\n }\n case 'p2tr':\n throw new Error(\n 'BTC P2TR (taproot) address derivation is not supported yet — needs an elliptic-curve library for BIP-341 tweaking'\n );\n default: {\n const exhaustive: never = scriptType;\n throw new Error(`Unsupported BTC script type: ${String(exhaustive)}`);\n }\n }\n }\n\n buildBtcPsbtRequest(unsignedPsbtHex: string): KeystoneUr {\n const ur = this.sdk.btc.generatePSBT(Buffer.from(unsignedPsbtHex, 'hex'));\n return fromSdkUr(ur);\n }\n\n /** Returns the hex-encoded (possibly still-unsigned-in-part) PSBT the device replied with. */\n parseBtcPsbt(ur: KeystoneUr): string {\n return this.sdk.btc.parsePSBT(toSdkUr(ur));\n }\n\n buildBtcMessageSignRequest(params: {\n requestId: string;\n /** Hex, no 0x prefix. */\n messageHex: string;\n accounts: KeystoneBtcSignRequestAccount[];\n origin?: string;\n }): KeystoneUr {\n const ur = this.sdk.btc.generateSignRequest({\n requestId: params.requestId,\n signData: params.messageHex,\n dataType: 1, // BtcSignRequest.DataType.message; PSBT signing never goes through this path.\n accounts: params.accounts,\n origin: params.origin,\n });\n return fromSdkUr(ur);\n }\n\n parseBtcSignature(ur: KeystoneUr): KeystoneBtcSignatureResult {\n const signature = this.sdk.btc.parseSignature(toSdkUr(ur));\n return {\n requestId: signature.requestId,\n publicKey: signature.publicKey,\n signature: signature.signature,\n };\n }\n\n // --- SOL ---\n\n buildSolSignRequest(input: KeystoneSolSignRequestInput): KeystoneUr {\n const ur = this.sdk.sol.generateSignRequest({\n requestId: input.requestId,\n signData: input.unsignedPayloadHex,\n dataType: input.dataType === 'transaction' ? 1 : 2,\n path: input.path,\n xfp: input.xfp,\n address: input.address,\n origin: input.origin,\n });\n return fromSdkUr(ur);\n }\n\n parseSolSignature(ur: KeystoneUr): KeystoneSolSignatureResult {\n const signature = this.sdk.sol.parseSignature(toSdkUr(ur));\n return {\n requestId: signature.requestId,\n signature: requireSignatureBytes(signature.signature, 64, 'SOL'),\n };\n }\n\n // --- TRON ---\n\n /**\n * Keystone's native tron-sign-request/tron-signature pair (bare signature).\n * `sdk.tron` from keystone-sdk is the older protobuf envelope; not used.\n */\n buildTronSignRequest(input: KeystoneTronSignRequestInput): KeystoneUr {\n const request = new TronSignRequest({\n requestId: Buffer.from(uuidParse(input.requestId) as Uint8Array),\n signData: Buffer.from(stripHexPrefix(input.rawTxHex), 'hex'),\n signType: input.signType ?? TronSignType.Transaction,\n derivationPath: TronSignRequest.parsePath(input.path, input.xfp),\n origin: input.origin,\n });\n return fromSdkUr(request.toUR());\n }\n\n parseTronSignature(ur: KeystoneUr): KeystoneTronSignatureResult {\n if (ur.urType !== 'tron-signature') {\n throw new Error(`Expected a tron-signature UR, got ${ur.urType}`);\n }\n const signature = TronSignature.fromCBOR(Buffer.from(ur.urData, 'hex'));\n const requestId = signature.getRequestId();\n return {\n requestId: requestId ? uuidStringify(requestId) : undefined,\n signature: requireSignatureBytes(signature.getSignature().toString('hex'), 65, 'TRON'),\n };\n }\n\n /**\n * TRON uses the same 20 address bytes as EVM (Keystone's `formatAddress()`), re-encoded as\n * base58check with the `0x41` version byte.\n */\n deriveTronAddressFromXpub(xpub: string, relativeDerivePath: string): string {\n const evmStyleHex = generateAddressFromXpub(xpub, relativeHdPath(relativeDerivePath)) as string;\n const addressBytes = Buffer.concat([\n Buffer.from([TRON_ADDRESS_PREFIX]),\n Buffer.from(stripHexPrefix(evmStyleHex), 'hex'),\n ]);\n return bs58check.encode(addressBytes);\n }\n\n /** Decodes an xpub's BIP-32 fields; `parentFingerprint` is the parent key's, not the mfp. */\n parseXpubMeta(xpub: string): {\n publicKey: string;\n chainCode: string;\n depth: number;\n parentFingerprint: number;\n } {\n // Decoded by hand because `@types/hdkey` lacks depth/parentFingerprint. BIP-32 layout:\n // [0..4) version | [4] depth | [5..9) parentFingerprint\n // [9..13) childNumber | [13..45) chainCode | [45..78) publicKey\n const raw = Buffer.from(bs58check.decode(xpub));\n if (raw.length !== 78) {\n throw new Error(`Keystone xpub did not decode to a 78-byte BIP-32 key (got ${raw.length})`);\n }\n return {\n publicKey: raw.subarray(45, 78).toString('hex'),\n chainCode: raw.subarray(13, 45).toString('hex'),\n depth: raw.readUInt8(4),\n parentFingerprint: raw.readUInt32BE(5),\n };\n }\n}\n","import {\n CryptoKeypath,\n DataItem,\n PathComponent,\n RegistryItem,\n RegistryType,\n RegistryTypes,\n extend,\n} from '@keystonehq/bc-ur-registry';\n\nimport type { DataItemMap } from '@keystonehq/bc-ur-registry';\n\nconst { decodeToDataItem } = extend;\n\n/**\n * Native `tron-sign-request` (tag 5201), keyed as keystone-sdk-rust ur-registry/tron (firmware\n * >= 2.5.0); OneKey Pro's air-gap layout is rejected by Keystone.\n */\nconst TRON_SIGN_REQUEST_TYPE = new RegistryType('tron-sign-request', 5201);\n\nenum RequestKeys {\n requestId = 1,\n signData,\n dataType,\n derivationPath,\n address,\n origin,\n}\n\n/** Keystone `DataType`: 1 = transaction, 2 = personal message. */\nexport enum TronSignType {\n Transaction = 1,\n PersonalMessage = 2,\n}\n\ninterface TronSignRequestProps {\n requestId?: Buffer;\n signData: Buffer;\n signType: TronSignType;\n derivationPath: CryptoKeypath;\n address?: Buffer;\n origin?: string;\n}\n\nexport class TronSignRequest extends RegistryItem {\n private readonly requestId?: Buffer;\n\n private readonly signData: Buffer;\n\n private readonly signType: TronSignType;\n\n private readonly derivationPath: CryptoKeypath;\n\n private readonly address?: Buffer;\n\n private readonly origin?: string;\n\n getRegistryType = (): RegistryType => TRON_SIGN_REQUEST_TYPE;\n\n constructor(args: TronSignRequestProps) {\n super();\n this.requestId = args.requestId;\n this.signData = args.signData;\n this.derivationPath = args.derivationPath;\n this.address = args.address;\n this.origin = args.origin;\n this.signType = args.signType;\n }\n\n getRequestId = (): Buffer | undefined => this.requestId;\n\n getSignData = (): Buffer => this.signData;\n\n getSignType = (): TronSignType => this.signType;\n\n getDerivationPath = (): string => this.derivationPath.getPath();\n\n getOrigin = (): string | undefined => this.origin;\n\n toDataItem = (): DataItem => {\n const map: DataItemMap = {};\n if (this.requestId) {\n map[RequestKeys.requestId] = new DataItem(this.requestId, RegistryTypes.UUID.getTag());\n }\n if (this.address) map[RequestKeys.address] = this.address;\n if (this.origin) map[RequestKeys.origin] = this.origin;\n map[RequestKeys.signData] = this.signData;\n map[RequestKeys.dataType] = this.signType;\n const keyPath = this.derivationPath.toDataItem();\n keyPath.setTag(this.derivationPath.getRegistryType().getTag());\n map[RequestKeys.derivationPath] = keyPath;\n return new DataItem(map);\n };\n\n static fromDataItem(dataItem: DataItem): TronSignRequest {\n const map = dataItem.getData() as Record<number, unknown>;\n const signData = map[RequestKeys.signData] as Buffer;\n const derivationPath = CryptoKeypath.fromDataItem(map[RequestKeys.derivationPath] as DataItem);\n const address = map[RequestKeys.address] as Buffer | undefined;\n const requestIdItem = map[RequestKeys.requestId] as DataItem | undefined;\n const requestId = requestIdItem?.getData() as Buffer | undefined;\n const origin = map[RequestKeys.origin] as string | undefined;\n const signType = map[RequestKeys.dataType] as TronSignType;\n return new TronSignRequest({ requestId, signData, derivationPath, address, origin, signType });\n }\n\n static fromCBOR(cborPayload: Buffer): TronSignRequest {\n return TronSignRequest.fromDataItem(decodeToDataItem(cborPayload));\n }\n\n static parsePath(path: string, xfp: string): CryptoKeypath {\n const segments = path.replace(/^[mM]\\//, '').split('/');\n const components = segments.map(segment => {\n const hardened = segment.endsWith(\"'\");\n return new PathComponent({\n index: parseInt(hardened ? segment.slice(0, -1) : segment, 10),\n hardened,\n });\n });\n return new CryptoKeypath(components, Buffer.from(xfp, 'hex'));\n }\n}\n","import {\n DataItem,\n RegistryItem,\n RegistryType,\n RegistryTypes,\n extend,\n} from '@keystonehq/bc-ur-registry';\n\nimport type { DataItemMap } from '@keystonehq/bc-ur-registry';\n\nconst { decodeToDataItem } = extend;\n\n/** Response half of the `tron-sign-request` (5201) pair, registry type 5202. */\nconst TRON_SIGNATURE_TYPE = new RegistryType('tron-signature', 5202);\n\nenum SignatureKeys {\n requestId = 1,\n signature,\n}\n\nexport class TronSignature extends RegistryItem {\n private readonly requestId?: Buffer;\n\n private readonly signatureBytes: Buffer;\n\n getRegistryType = (): RegistryType => TRON_SIGNATURE_TYPE;\n\n constructor(signature: Buffer, requestId?: Buffer) {\n super();\n this.signatureBytes = signature;\n this.requestId = requestId;\n }\n\n getRequestId = (): Buffer | undefined => this.requestId;\n\n getSignature = (): Buffer => this.signatureBytes;\n\n toDataItem = (): DataItem => {\n const map: DataItemMap = {};\n if (this.requestId) {\n map[SignatureKeys.requestId] = new DataItem(this.requestId, RegistryTypes.UUID.getTag());\n }\n map[SignatureKeys.signature] = this.signatureBytes;\n return new DataItem(map);\n };\n\n static fromDataItem(dataItem: DataItem): TronSignature {\n const map = dataItem.getData() as Record<number, unknown>;\n const signature = map[SignatureKeys.signature] as Buffer;\n if (!Buffer.isBuffer(signature)) {\n throw new Error('Keystone tron-signature UR is missing its signature bytes');\n }\n const requestIdItem = map[SignatureKeys.requestId] as DataItem | undefined;\n const requestId = requestIdItem?.getData() as Buffer | undefined;\n return new TronSignature(signature, requestId);\n }\n\n static fromCBOR(cborPayload: Buffer): TronSignature {\n return TronSignature.fromDataItem(decodeToDataItem(cborPayload));\n }\n}\n","import bs58 from 'bs58';\nimport { v4 as uuidv4 } from 'uuid';\nimport {\n CHAIN_FINGERPRINT_PATHS,\n DEVICE,\n DeviceJobQueue,\n HardwareErrorCode,\n OperationRegistry,\n SDK,\n TypedEventEmitter,\n UI_REQUEST,\n UI_REQUEST_CANCELLED_TAG,\n UI_REQUEST_PREEMPTED_TAG,\n UI_REQUEST_TIMEOUT_TAG,\n UI_RESPONSE,\n UiRequestRegistry,\n createHardwareSearchTargetId,\n createHwkError,\n deriveDeviceFingerprint,\n ensure0x,\n failure,\n getAllNetworkMethodChain,\n hasHardwareRuntimeIdPrefix,\n isAllNetworkMethodName,\n isConnectionLost,\n isHardwareOperationId,\n isHwkRecoveryHint,\n isUserRefusal,\n operationMayHaveCompletedParams,\n parseBip32MasterFingerprint,\n rehydrateConnectorError,\n resolveHardwareOperationTarget as resolveGenericHardwareOperationTarget,\n runAllNetworkGetAddress,\n stripHex,\n success,\n} from '@onekeyfe/hwk-adapter-core';\n\nimport { KeystoneUrEngine } from '../urEngine/KeystoneUrEngine';\nimport { TronSignType } from '../urEngine/TronSignRequest';\nimport {\n KEYSTONE_COLD_START_PATH,\n accountKey,\n createDeviceRecord,\n placeholderDeviceInfo,\n toDeviceInfo,\n walletConnectId,\n} from './deviceTable';\nimport {\n KEYSTONE_BTC_ACCOUNT_FORBIDDEN_MESSAGE,\n btcScriptTypeFromPath,\n isKeystoneSignableBtcAccountPath,\n normalizePath,\n splitAccountPath,\n} from './pathUtils';\nimport {\n KEYSTONE_COLD_START_JOB_LABEL,\n keystoneCancelQueueKeys,\n keystoneMfpFromIdentifier,\n keystoneQueueKey,\n} from '../utils/queueKey';\n\nimport type { KeystoneKeySchema, KeystoneParsedMultiAccounts, KeystoneUr } from '../urEngine/types';\nimport type { KeystoneAccountEntry, KeystoneDeviceRecord } from './deviceTable';\nimport type {\n AllNetworkAddressParams,\n AllNetworkAddressResponse,\n AllNetworkGetAddressParams,\n BtcAddress,\n BtcGetAddressParams,\n BtcGetPublicKeyParams,\n BtcPublicKey,\n BtcSignMsgParams,\n BtcSignPsbtParams,\n BtcSignTxParams,\n BtcSignature,\n BtcSignedPsbt,\n BtcSignedTx,\n CancelScopeHandle,\n ChainCapability,\n ChainForFingerprint,\n ConnectionTarget,\n ConnectorCallResult,\n ConnectorConnectTarget,\n ConnectorDevice,\n ConnectorEventMap,\n DeviceEventListener,\n DeviceInfo,\n DeviceSearchTarget,\n EvmAddress,\n EvmGetAddressParams,\n EvmSignMsgParams,\n EvmSignTxParams,\n EvmSignTypedDataParams,\n EvmSignature,\n EvmSignedTx,\n HardwareEvent,\n HardwareEventMap,\n IConnector,\n IHardwareCallParams,\n IHardwareCommonCallParams,\n IHardwareWallet,\n NullableCallArg,\n QrDisplayData,\n Response,\n SearchDevicesOptions,\n SolAddress,\n SolGetAddressParams,\n SolSignMsgParams,\n SolSignTxParams,\n SolSignature,\n SolSignedTx,\n TransportType,\n TronAddress,\n TronGetAddressParams,\n TronSignMsgParams,\n TronSignTxParams,\n TronSignature,\n TronSignedTx,\n UiResponseEvent,\n} from '@onekeyfe/hwk-adapter-core';\n\n/** Key material for one operation, keyed by `accountKey()`; never retained. */\ntype AccountBook = Map<string, KeystoneAccountEntry>;\n\ntype OperationRoute = { operationId: string; connectionType: 'usb' | 'qr' };\n\ntype ExpectedWallet = { expectedMasterFingerprint?: string };\n\n// Keystone briefly leaves the USB bus when entering external-wallet mode, so a persisted-wallet\n// call must wait out re-enumeration instead of falling back to QR on one empty snapshot.\nconst KEYSTONE_USB_REATTACH_PROBE_ATTEMPTS = 4;\nconst KEYSTONE_USB_REATTACH_PROBE_INTERVAL_MS = 500;\n\nfunction resolveHardwareOperationTarget(\n positionalTargetId: string | null | undefined,\n operationId: string | null | undefined\n) {\n return resolveGenericHardwareOperationTarget(positionalTargetId, operationId, 'keystone');\n}\n\nfunction keySchema(chain: string, path: string): KeystoneKeySchema {\n return { path, curve: chain === 'sol' ? 'ed25519' : 'secp256k1' };\n}\n\nfunction waitForKeystoneUsbReattachProbe(): Promise<void> {\n return new Promise(resolve => {\n setTimeout(resolve, KEYSTONE_USB_REATTACH_PROBE_INTERVAL_MS);\n });\n}\n\n/** UserAborted is a top-level abort code, so this ends the bundle. */\nfunction buildCancelledFailure<T>(signal: AbortSignal): Response<T> {\n const reason = signal.reason as { code?: unknown; message?: unknown } | undefined;\n const code =\n typeof reason?.code === 'number'\n ? (reason.code as HardwareErrorCode)\n : HardwareErrorCode.UserAborted;\n const message = typeof reason?.message === 'string' ? reason.message : '';\n return failure(code, message || 'All-network get-address cancelled');\n}\n\nconst BIP44_COIN_TYPE_TO_CHAIN: Record<number, ChainCapability> = {\n 60: 'evm',\n 0: 'btc',\n 501: 'sol',\n 195: 'tron',\n};\n\n/**\n * Classifies a returned account by BIP44 coin type (2nd segment), not by\n * purpose, so 44'/49'/84'/86' BTC entries all map to `btc`.\n */\nfunction inferHwkChainFromPath(path: string): ChainCapability | undefined {\n const match = normalizePath(path).match(/^m\\/\\d+'\\/(\\d+)'/);\n return match ? BIP44_COIN_TYPE_TO_CHAIN[Number(match[1])] : undefined;\n}\n\nexport interface ImportFromQrOptions {\n /**\n * 'request' asks the device for one account; 'scan' waits for whatever export it already shows.\n * Only the wallet's master fingerprint is learned either way.\n */\n mode?: 'request' | 'scan';\n}\n\n/**\n * QR and USB behind one `IHardwareWallet`, keyed by the wallet's BIP32 master fingerprint.\n * Key material is fetched per operation and never retained.\n */\nexport class KeystoneAdapter implements IHardwareWallet {\n readonly vendor = 'keystone' as const;\n\n // No protocol-level cancel exists over Keystone USB, and QR has no transport\n // to interrupt at all. Cancelling ends the wait, not the device's prompt.\n readonly cancelCapability = 'stops-waiting' as const;\n\n private readonly urEngine: KeystoneUrEngine;\n\n private readonly emitter = new TypedEventEmitter<HardwareEventMap>();\n\n private readonly _operationRoutes = new Map<string, OperationRoute>();\n\n private readonly _operations = new OperationRegistry({\n vendor: 'keystone',\n onEnded: (operation, reason) => {\n const route = this._operationRoutes.get(operation.connectId);\n if (route?.operationId === operation.operationId) {\n this._operationRoutes.delete(operation.connectId);\n }\n this.emitter.emit(SDK.OPERATION_ENDED, {\n type: SDK.OPERATION_ENDED,\n payload: { operationId: operation.operationId, reason },\n });\n if (reason === 'timeout') {\n this._releaseOperationConnection(operation).catch(() => undefined);\n }\n },\n });\n\n private readonly _uiRegistry = new UiRequestRegistry();\n\n private readonly _jobQueue: DeviceJobQueue;\n\n private readonly _devices = new Map<string, KeystoneDeviceRecord>();\n\n private readonly _searchDeviceTargets = new Map<string, 'usb' | 'qr'>();\n\n private _activeSearchGeneration: symbol | undefined;\n\n private readonly _origin: string;\n\n /** Host answer timeout for QR display/scan requests; undefined uses the registry default. */\n private readonly _qrTimeoutMs: number | undefined;\n\n /** Host-supplied USB connector; undefined means QR-only. */\n private readonly _usbConnector: IConnector | undefined;\n\n /** Serializes USB open/identity handshakes that run outside the job queue. */\n private _usbConnectTail: Promise<void> = Promise.resolve();\n\n private readonly _unsettledUsbOperations = new Map<string, number>();\n\n private readonly _usbIdleWaiters = new Set<() => void>();\n\n private _abandonedUsbConnects = 0;\n\n private _usbTeardownTail: Promise<void> = Promise.resolve();\n\n private _pendingUsbTeardowns = 0;\n\n /** `switchTransport` pin; undefined means USB when the wallet has a live session, else QR. */\n private _forcedTransport: 'qr' | 'usb' | undefined;\n\n private readonly _handleUsbDisconnect = ({ connectId }: { connectId: string }): void => {\n const record = Array.from(this._devices.values()).find(item => item.usbSessionId === connectId);\n if (!record) return;\n\n // QR operations for the same wallet do not depend on this USB session.\n this._operations.endByConnectionKey(connectId, 'disconnect');\n\n record.usbSessionId = undefined;\n const info = toDeviceInfo(record);\n if (record.qrSynced) {\n this.emitter.emit(DEVICE.CHANGED, { type: DEVICE.CHANGED, payload: info });\n } else {\n this._devices.delete(record.masterFingerprint);\n this.emitter.emit(DEVICE.DISCONNECT, { type: DEVICE.DISCONNECT, payload: info });\n }\n };\n\n private readonly _handleUsbUiEvent = (event: ConnectorEventMap['ui-event']): void => {\n this.emitter.emit('ui-event', event);\n };\n\n constructor(options?: { origin?: string; qrTimeoutMs?: number; usbConnector?: IConnector }) {\n this._origin = options?.origin ?? 'OneKey';\n this._qrTimeoutMs = options?.qrTimeoutMs;\n this.urEngine = new KeystoneUrEngine(this._origin);\n this._jobQueue = new DeviceJobQueue();\n this._usbConnector = options?.usbConnector;\n this._usbConnector?.on('device-disconnect', this._handleUsbDisconnect);\n // Relayed verbatim like the Ledger adapter, so hosts reuse one handler.\n this._usbConnector?.on('ui-event', this._handleUsbUiEvent);\n }\n\n // ---------------------------------------------------------------------------\n // Lifecycle / transport\n // ---------------------------------------------------------------------------\n\n get activeTransport(): TransportType | null {\n if (this._devices.size === 0) return null;\n const hasUsbSession = Array.from(this._devices.values()).some(r => r.usbSessionId);\n return hasUsbSession ? 'usb' : 'qr';\n }\n\n getAvailableTransports(): TransportType[] {\n return this._usbConnector ? ['qr', 'usb'] : ['qr'];\n }\n\n /** Pins calls to 'qr' or 'usb'; any other value clears the pin back to auto routing. */\n switchTransport(type: TransportType): Promise<void> {\n this._forcedTransport = type === 'qr' || type === 'usb' ? type : undefined;\n return Promise.resolve();\n }\n\n init(_config?: unknown): Promise<void> {\n return Promise.resolve();\n }\n\n async dispose(): Promise<void> {\n this._operations.endAll('runtime-reset');\n this._uiRegistry.cancel();\n this._jobQueue.clear();\n this._searchDeviceTargets.clear();\n await this._usbConnectTail;\n await this._resetUsbSessions();\n this._usbConnector?.off('device-disconnect', this._handleUsbDisconnect);\n this._usbConnector?.off('ui-event', this._handleUsbUiEvent);\n this._usbConnector?.reset();\n this._devices.clear();\n this.emitter.removeAllListeners();\n }\n\n // ---------------------------------------------------------------------------\n // Device table\n // ---------------------------------------------------------------------------\n\n /**\n * Returns known wallets plus USB scan results; USB entries have no mfp until `connectDevice()`\n * claims them. Explicit QR discovery returns one virtual target.\n */\n async searchDevices(options?: SearchDevicesOptions): Promise<DeviceInfo[]> {\n const searchGeneration = Symbol('keystone-device-search');\n this._activeSearchGeneration = searchGeneration;\n this._searchDeviceTargets.clear();\n if (options?.resetSession) {\n await this._resetUsbSessions();\n } else {\n await this._usbTeardownTail;\n }\n const known = Array.from(this._devices.values()).map(toDeviceInfo);\n\n // QR has nothing to enumerate; a virtual target keeps the search/connect flow\n // without a device round trip during discovery.\n if (options?.transportType === 'qr') {\n const searchTargetId = createHardwareSearchTargetId('keystone');\n this._searchDeviceTargets.set(searchTargetId, 'qr');\n return [\n {\n ...placeholderDeviceInfo(),\n model: '',\n connectId: searchTargetId,\n capabilities: { persistentDeviceIdentity: false },\n },\n ];\n }\n\n if (options?.transportType === 'ble') return [];\n if (!this._usbConnector) return options?.transportType === 'usb' ? [] : known;\n\n let usbDevices: ConnectorDevice[];\n try {\n usbDevices = await this._usbConnector.searchDevices();\n } catch (error) {\n // A failed USB scan (no WebUSB, no permission) must not hide known QR wallets.\n if (options?.transportType === 'usb') throw error;\n return known;\n }\n if (this._activeSearchGeneration !== searchGeneration) return [];\n const placeholders: DeviceInfo[] = usbDevices.map(d => ({\n vendor: 'keystone',\n // Empty, not 'unknown': all models share one vid/pid, and a placeholder\n // string would beat the host's default-name fallback.\n model: d.model ?? '',\n modelName: d.modelName,\n // Unknown until the device is opened.\n firmwareVersion: '0.0.0',\n deviceId: d.deviceId,\n connectId: d.connectId,\n connectionType: 'usb',\n label: d.name,\n serialNumber: d.serialNumber,\n capabilities: d.capabilities ?? { persistentDeviceIdentity: false },\n raw: d.raw,\n }));\n for (const placeholder of placeholders) {\n this._searchDeviceTargets.set(placeholder.connectId, 'usb');\n }\n return options?.transportType === 'usb' ? placeholders : [...known, ...placeholders];\n }\n\n private async _resetUsbSessions(): Promise<void> {\n await this._runUsbTeardown(async () => {\n await this._usbConnectTail;\n this._operations.endAll('runtime-reset');\n if (!this._usbConnector) return;\n\n const sessionIds = new Set(\n Array.from(this._devices.values())\n .map(record => record.usbSessionId)\n .filter((sessionId): sessionId is string => Boolean(sessionId))\n );\n for (const sessionId of sessionIds) {\n await this._retireUsbSession(sessionId);\n }\n });\n }\n\n /** Best-effort disconnect; the session is retired either way so it cannot be selected again. */\n private async _retireUsbSession(sessionId: string): Promise<void> {\n if (this._usbConnector) {\n try {\n await this._usbConnector.disconnect(sessionId);\n } catch {\n // Local routing state is cleared below regardless.\n }\n }\n this._handleUsbDisconnect({ connectId: sessionId });\n }\n\n async searchDeviceTargets(options?: SearchDevicesOptions): Promise<DeviceSearchTarget[]> {\n const devices = await this.searchDevices(options);\n return devices.map(device => ({\n searchTargetId: device.connectId,\n // The master fingerprint is known only after the USB/QR handshake.\n searchTargetReusePolicy: 'current-discovery',\n vendor: device.vendor,\n connectionType: device.connectionType,\n kind: device.connectionType === 'qr' ? 'interactive' : 'physical',\n label: device.label,\n model: device.model,\n modelName: device.modelName,\n serialNumber: device.serialNumber,\n }));\n }\n\n async listConnectionTargets(options?: SearchDevicesOptions): Promise<ConnectionTarget[]> {\n const targets = await this.searchDeviceTargets(options);\n return targets.map(({ searchTargetId, ...target }) => ({\n ...target,\n targetId: searchTargetId,\n }));\n }\n\n async connectDevice(searchTargetId: string): Promise<Response<string>> {\n const scope = this._jobQueue.createCancelScope(searchTargetId);\n try {\n let connected: Response<DeviceInfo>;\n let selectedConnectionType: 'usb' | 'qr';\n const discoveredConnectionType = this._searchDeviceTargets.get(searchTargetId);\n if (discoveredConnectionType === 'qr') {\n selectedConnectionType = 'qr';\n // The cold-start job queues under its own label; forward a cancel aimed\n // at this search target to it.\n const abortColdStart = () =>\n this._jobQueue.cancelActiveAndPending(\n KEYSTONE_COLD_START_JOB_LABEL,\n scope.signal.reason as Error\n );\n scope.signal.addEventListener('abort', abortColdStart, { once: true });\n try {\n connected = await this.importFromQr();\n } finally {\n scope.signal.removeEventListener('abort', abortColdStart);\n }\n } else if (discoveredConnectionType === 'usb') {\n selectedConnectionType = 'usb';\n if (!this._usbConnector) {\n return failure(\n HardwareErrorCode.TransportNotAvailable,\n 'No USB connector configured for this Keystone adapter'\n );\n }\n connected = await this._connectUsb({}, searchTargetId, scope.signal);\n } else if (hasHardwareRuntimeIdPrefix(searchTargetId)) {\n return failure(\n HardwareErrorCode.DeviceNotFound,\n 'Keystone search target has expired; search for devices again',\n undefined,\n undefined,\n { scope: 'search-target' }\n );\n } else {\n const target = this._resolveTarget(searchTargetId);\n if (target.record) {\n selectedConnectionType = target.record.usbSessionId ? 'usb' : 'qr';\n connected = success(toDeviceInfo(target.record));\n } else if (!this._usbConnector) {\n return failure(\n HardwareErrorCode.DeviceNotFound,\n `Unknown Keystone device search target: ${searchTargetId}`\n );\n } else {\n selectedConnectionType = 'usb';\n connected = await this._connectUsb(target, undefined, scope.signal);\n }\n }\n KeystoneAdapter._throwIfAborted(scope.signal);\n if (!connected.success) return connected;\n\n const record = this._devices.get(connected.payload.deviceId);\n this._operations.endByConnectionKey(connected.payload.connectId, 'explicit');\n const operation = this._operations.create({\n searchTargetId,\n connectId: connected.payload.connectId,\n device: connected.payload,\n connectionType: selectedConnectionType,\n connectionKeys:\n selectedConnectionType === 'usb' && record?.usbSessionId ? [record.usbSessionId] : [],\n });\n this._operationRoutes.set(connected.payload.connectId, {\n operationId: operation.operationId,\n connectionType: selectedConnectionType,\n });\n return success(operation.operationId);\n } catch (err) {\n return this._errorToFailure<string>(err);\n } finally {\n scope.release();\n }\n }\n\n /**\n * QR has nothing to tear down. A USB session is closed, and the record is demoted to QR-only or\n * removed if it was never QR-synced.\n */\n async releaseOperation(operationId: string): Promise<void> {\n const operation = this._operations.find(operationId);\n if (!operation) {\n this._operations.resolve(operationId);\n return;\n }\n const endedOperation = this._operations.end(operationId, 'explicit');\n if (!endedOperation) return;\n await this._releaseOperationConnection(endedOperation);\n }\n\n private async _releaseOperationConnection(\n operation: NonNullable<ReturnType<OperationRegistry['find']>>\n ): Promise<void> {\n const { connectId } = operation;\n let record: KeystoneDeviceRecord | undefined;\n try {\n record = this._resolveTarget(connectId).record;\n } catch {\n return;\n }\n if (!record?.usbSessionId || !operation.connectionKeys.includes(record.usbSessionId)) {\n return;\n }\n\n const { usbSessionId } = record;\n await this._runUsbTeardown(() => this._retireUsbSession(usbSessionId));\n }\n\n getDeviceInfo(connectIdOrOperationId: string, deviceId: string): Promise<Response<DeviceInfo>> {\n try {\n const connectId = isHardwareOperationId(connectIdOrOperationId)\n ? this._operations.resolve(connectIdOrOperationId).connectId\n : connectIdOrOperationId;\n const { record } = this._resolveTarget(connectId, deviceId);\n if (!record) {\n return Promise.resolve(\n failure(\n HardwareErrorCode.DeviceNotFound,\n `Unknown Keystone device: ${connectId || deviceId}`\n )\n );\n }\n return Promise.resolve(success(toDeviceInfo(record)));\n } catch (err) {\n return Promise.resolve(this._errorToFailure<DeviceInfo>(err));\n }\n }\n\n cancel(connectId?: string): void {\n // An ended operation id names nothing: return rather than decay into an\n // untargeted cancel that takes down an unrelated job.\n let namedOperationConnectId: string | undefined;\n if (isHardwareOperationId(connectId)) {\n try {\n namedOperationConnectId = this._operations.resolve(connectId).connectId;\n } catch {\n // Ended (tombstoned) and never-existed both land here.\n return;\n }\n }\n const reason = createHwkError({\n code: HardwareErrorCode.UserAborted,\n message: 'User aborted operation',\n });\n if (connectId) {\n // An operation-scoped call queues under its operation id, so cancel every\n // queue key this identifier can stand for.\n const queueKeys = keystoneCancelQueueKeys([\n connectId,\n this._operationRoutes.get(connectId)?.operationId,\n namedOperationConnectId,\n ]);\n for (const key of queueKeys) {\n this._jobQueue.cancelActiveAndPending(key, reason);\n }\n // A named cancel clears only its own operation's prompts; an unresolvable\n // name clears nothing.\n const scopedOperationId = isHardwareOperationId(connectId)\n ? connectId\n : this._operationRouteForIdentifier(connectId)?.operationId;\n if (scopedOperationId) {\n this._uiRegistry.cancel(undefined, undefined, scopedOperationId);\n }\n } else {\n // Nothing to name: teardown clears every waiter.\n this._jobQueue.cancelActiveAndPending(undefined, reason);\n this._uiRegistry.cancel();\n }\n }\n\n getChainFingerprint(\n connectId: string,\n deviceId: string,\n chain: ChainForFingerprint\n ): Promise<Response<string>> {\n try {\n const target = this._resolveTarget(connectId, deviceId);\n const masterFingerprint = target.expectedMasterFingerprint;\n if (!masterFingerprint) {\n return Promise.resolve(\n failure(HardwareErrorCode.DeviceNotFound, 'Unknown Keystone wallet identity')\n );\n }\n return Promise.resolve(\n success(deriveDeviceFingerprint(`keystone:${chain}:${masterFingerprint}`))\n );\n } catch (err) {\n return Promise.resolve(this._errorToFailure<string>(err));\n }\n }\n\n uiResponse(response: UiResponseEvent): void {\n if (response.type === UI_RESPONSE.CANCEL) {\n this.cancel();\n return;\n }\n this._uiRegistry.resolve(response.type, response.payload);\n }\n\n on<K extends keyof HardwareEventMap>(\n event: K,\n listener: (event: HardwareEventMap[K]) => void\n ): void;\n\n on(event: string, listener: DeviceEventListener): void;\n\n on(event: string, listener: (event: HardwareEvent) => void): void {\n this.emitter.on(event, listener);\n }\n\n off<K extends keyof HardwareEventMap>(\n event: K,\n listener: (event: HardwareEventMap[K]) => void\n ): void;\n\n off(event: string, listener: DeviceEventListener): void;\n\n off(event: string, listener: (event: HardwareEvent) => void): void {\n this.emitter.off(event, listener);\n }\n\n // ---------------------------------------------------------------------------\n // Explicit account import: call before signing to avoid a cold sync per call.\n // ---------------------------------------------------------------------------\n\n async importFromQr(options: ImportFromQrOptions = {}): Promise<Response<DeviceInfo>> {\n try {\n return await this._jobQueue.enqueue(KEYSTONE_COLD_START_JOB_LABEL, async signal => {\n const displayDevice = placeholderDeviceInfo();\n let responseUr: KeystoneUr;\n\n if (options.mode === 'scan') {\n responseUr = await this._requestQrScanAndAwaitResponse(displayDevice, signal);\n } else {\n const requestUr = this.urEngine.buildKeyDerivationRequest({\n schemas: [keySchema('evm', KEYSTONE_COLD_START_PATH)],\n origin: this._origin,\n });\n responseUr = await this._requestQrDisplayAndAwaitResponse(\n displayDevice,\n { ...requestUr, animated: false },\n signal\n );\n }\n KeystoneAdapter._throwIfAborted(signal);\n\n const parsed = this.urEngine.parseAccountResponse(responseUr);\n const record = this._upsertDeviceRecord(parsed);\n return success(toDeviceInfo(record));\n });\n } catch (err) {\n return this._errorToFailure<DeviceInfo>(err);\n }\n }\n\n // ---------------------------------------------------------------------------\n // All-network bundle, dispatched to the per-chain methods below.\n // ---------------------------------------------------------------------------\n\n allNetworkGetAddress = async (\n connectId: string,\n deviceId: string,\n params: AllNetworkGetAddressParams\n ): Promise<Response<AllNetworkAddressResponse[]>> => {\n const operationTarget = resolveHardwareOperationTarget(connectId, params.operationId);\n if (!operationTarget.success) return operationTarget;\n const effectiveConnectId = operationTarget.payload.targetId ?? '';\n const { operationId } = operationTarget.payload;\n let cancelScope: CancelScopeHandle | undefined;\n try {\n const prefetched = await this._prefetchAllNetworkAccounts(effectiveConnectId, deviceId, {\n ...params,\n operationId,\n });\n const { book } = prefetched;\n // On a cold start the prefetch established the wallet identity; route\n // per-item calls to it instead of re-syncing per item.\n const itemDeviceId = deviceId || prefetched.masterFingerprint || '';\n // A cancel between two per-item jobs finds nothing to abort; the scope\n // carries it across that gap under the same queue key.\n const scope = this._jobQueue.createCancelScope(\n keystoneQueueKey(effectiveConnectId, itemDeviceId)\n );\n cancelScope = scope;\n const cancelledIndexes = new Set<number>();\n return await runAllNetworkGetAddress({\n connectId: effectiveConnectId,\n deviceId: itemDeviceId,\n params,\n callItem: async ({ method, item, index }) => {\n if (scope.signal.aborted) {\n cancelledIndexes.add(index);\n return buildCancelledFailure(scope.signal);\n }\n const commonArgs = {\n path: item.path,\n showOnDevice: item.showOnDevice,\n operationId,\n };\n switch (method) {\n case 'evmGetAddress':\n return this.evmGetAddress(effectiveConnectId, itemDeviceId, commonArgs, book);\n case 'btcGetAddress':\n return this.btcGetAddress(effectiveConnectId, itemDeviceId, commonArgs, book);\n case 'btcGetPublicKey':\n return this.btcGetPublicKey(effectiveConnectId, itemDeviceId, commonArgs, book);\n case 'solGetAddress':\n return this.solGetAddress(effectiveConnectId, itemDeviceId, commonArgs, book);\n case 'tronGetAddress':\n return this.tronGetAddress(effectiveConnectId, itemDeviceId, commonArgs, book);\n default:\n return failure(\n HardwareErrorCode.MethodNotSupported,\n `Unsupported method: ${String(method)}`\n );\n }\n },\n attachIdentity: context => {\n const { record } = this._resolveTarget(effectiveConnectId, itemDeviceId);\n return Promise.resolve({\n ...context.item,\n success: true,\n payload: {\n ...context.payload,\n rootFingerprint: record ? Number.parseInt(record.masterFingerprint, 16) : undefined,\n deviceIdentity: record\n ? {\n vendor: 'keystone' as const,\n type: 'walletId' as const,\n value: record.masterFingerprint,\n }\n : undefined,\n },\n });\n },\n // Cancel, refusal or a lost session ends the batch; other per-item\n // failures carry on with the next chain.\n shouldAbortBundle: (response, { index }) => {\n const { code } = response.payload ?? {};\n return cancelledIndexes.has(index) || isUserRefusal(code) || isConnectionLost(code);\n },\n });\n } catch (err) {\n return this._errorToFailure<AllNetworkAddressResponse[]>(err);\n } finally {\n cancelScope?.release();\n }\n };\n\n // ---------------------------------------------------------------------------\n // EVM\n // ---------------------------------------------------------------------------\n\n async evmGetAddress(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n params?: NullableCallArg<IHardwareCallParams<EvmGetAddressParams>>,\n book?: AccountBook\n ): Promise<Response<EvmAddress>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, params?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n if (!params) return failure(HardwareErrorCode.InvalidParams, 'evmGetAddress requires params');\n if (!params.path)\n return failure(HardwareErrorCode.InvalidParams, 'evmGetAddress requires params.path');\n\n const { accountPath, relativeDerivePath } = splitAccountPath(params.path);\n if (!relativeDerivePath) {\n return failure(\n HardwareErrorCode.InvalidParams,\n \"evmGetAddress requires a full leaf path, e.g. m/44'/60'/0'/0/0\"\n );\n }\n\n return this._runJob(connectId, deviceId, async signal => {\n const xpub = await this._fetchAccountXpub(\n connectId,\n deviceId,\n 'evm',\n accountPath,\n signal,\n book\n );\n // showOnDevice is not wired; the address is derived offline from a device-verified xpub.\n const address = this.urEngine.deriveEvmAddressFromXpub(xpub, relativeDerivePath);\n return success<EvmAddress>({ address, path: normalizePath(params.path) });\n });\n }\n\n async evmSignTransaction(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n params?: NullableCallArg<IHardwareCallParams<EvmSignTxParams>>\n ): Promise<Response<EvmSignedTx>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, params?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n if (!params)\n return failure(HardwareErrorCode.InvalidParams, 'evmSignTransaction requires params');\n if (!params.path) {\n return failure(HardwareErrorCode.InvalidParams, 'evmSignTransaction requires params.path');\n }\n if (\n !('serializedTx' in params) ||\n typeof params.serializedTx !== 'string' ||\n !params.serializedTx\n ) {\n return failure(\n HardwareErrorCode.MethodNotSupported,\n 'Keystone only signs a fully RLP-serialized transaction (params.serializedTx) — structured-field signing is not supported'\n );\n }\n const rawTxHex = stripHex(params.serializedTx);\n const path = normalizePath(params.path);\n // EIP-2718 typed txs start with a type byte < 0x80; legacy RLP lists start at >= 0xc0.\n const dataType = parseInt(rawTxHex.slice(0, 2), 16) < 0xc0 ? 'typedTransaction' : 'transaction';\n\n return this._signWithWallet({\n connectId,\n deviceId,\n chain: 'evm',\n operationName: 'evmSignTransaction',\n buildRequest: (requestId, xfp) =>\n this.urEngine.buildEthSignRequest({\n requestId,\n unsignedTxHex: rawTxHex,\n dataType,\n path,\n xfp,\n chainId: params.chainId,\n origin: this._origin,\n }),\n parseResponse: ur => this.urEngine.parseEthSignature(ur),\n toPayload: (sig): EvmSignedTx => ({\n v: ensure0x(sig.v),\n r: ensure0x(sig.r),\n s: ensure0x(sig.s),\n }),\n });\n }\n\n async evmSignMessage(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n params?: NullableCallArg<IHardwareCallParams<EvmSignMsgParams>>\n ): Promise<Response<EvmSignature>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, params?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n if (!params) return failure(HardwareErrorCode.InvalidParams, 'evmSignMessage requires params');\n if (!params.path || params.message === undefined) {\n return failure(\n HardwareErrorCode.InvalidParams,\n 'evmSignMessage requires params.path and params.message'\n );\n }\n const messageHex = params.hex\n ? stripHex(params.message)\n : Buffer.from(params.message, 'utf8').toString('hex');\n const path = normalizePath(params.path);\n\n return this._signWithWallet({\n connectId,\n deviceId,\n chain: 'evm',\n operationName: 'evmSignMessage',\n buildRequest: (requestId, xfp) =>\n this.urEngine.buildEthSignRequest({\n requestId,\n unsignedTxHex: messageHex,\n dataType: 'personalMessage',\n path,\n xfp,\n chainId: params.chainId,\n origin: this._origin,\n }),\n parseResponse: ur => this.urEngine.parseEthSignature(ur),\n toPayload: (sig): EvmSignature => ({ signature: ensure0x(sig.r + sig.s + sig.v) }),\n });\n }\n\n async evmSignTypedData(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n params?: NullableCallArg<IHardwareCallParams<EvmSignTypedDataParams>>\n ): Promise<Response<EvmSignature>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, params?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n if (!params)\n return failure(HardwareErrorCode.InvalidParams, 'evmSignTypedData requires params');\n if (!params.path) {\n return failure(HardwareErrorCode.InvalidParams, 'evmSignTypedData requires params.path');\n }\n if (params.mode === 'hash') {\n return failure(\n HardwareErrorCode.MethodNotSupported,\n 'Keystone always displays the full EIP-712 payload for on-device review — pre-hashed signing is not supported'\n );\n }\n // Typed-data JSON as UTF-8, the Keystone USB SDK convention. Prefer `dataJson`:\n // re-stringifying can rewrite integers above 2^53.\n const signDataHex = Buffer.from(\n params.dataJson ?? JSON.stringify(params.data),\n 'utf8'\n ).toString('hex');\n const path = normalizePath(params.path);\n\n return this._signWithWallet({\n connectId,\n deviceId,\n chain: 'evm',\n operationName: 'evmSignTypedData',\n buildRequest: (requestId, xfp) =>\n this.urEngine.buildEthSignRequest({\n requestId,\n unsignedTxHex: signDataHex,\n dataType: 'typedData',\n path,\n xfp,\n chainId: params.chainId,\n origin: this._origin,\n }),\n parseResponse: ur => this.urEngine.parseEthSignature(ur),\n toPayload: (sig): EvmSignature => ({ signature: ensure0x(sig.r + sig.s + sig.v) }),\n });\n }\n\n // ---------------------------------------------------------------------------\n // BTC: 44'/49'/84' addresses derive offline from the account xpub; P2TR addresses\n // and structured-field tx signing are unsupported (the host builds a PSBT instead).\n // ---------------------------------------------------------------------------\n\n async btcGetAddress(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n params?: NullableCallArg<IHardwareCallParams<BtcGetAddressParams>>,\n book?: AccountBook\n ): Promise<Response<BtcAddress>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, params?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n if (!params) return failure(HardwareErrorCode.InvalidParams, 'btcGetAddress requires params');\n if (!params.path)\n return failure(HardwareErrorCode.InvalidParams, 'btcGetAddress requires params.path');\n\n const scriptType = btcScriptTypeFromPath(params.path);\n if (!scriptType) {\n return failure(\n HardwareErrorCode.InvalidParams,\n \"btcGetAddress requires a path whose purpose is 44'/49'/84'/86' (P2PKH/P2SH-P2WPKH/P2WPKH/P2TR)\"\n );\n }\n if (scriptType === 'p2tr') {\n return this._unsupported(\n 'btcGetAddress',\n \"P2TR (purpose 86') needs an elliptic-curve library for BIP-341 tweaking, not yet wired in — 44'/49'/84' work\"\n );\n }\n\n const normalizedPath = normalizePath(params.path);\n const { accountPath, relativeDerivePath } = splitAccountPath(normalizedPath);\n if (!relativeDerivePath) {\n return failure(\n HardwareErrorCode.InvalidParams,\n \"btcGetAddress requires a full leaf path, e.g. m/84'/0'/0'/0/0\"\n );\n }\n if (!isKeystoneSignableBtcAccountPath(accountPath)) {\n return failure(HardwareErrorCode.DevicePathForbidden, KEYSTONE_BTC_ACCOUNT_FORBIDDEN_MESSAGE);\n }\n\n return this._runJob(connectId, deviceId, async signal => {\n const xpub = await this._fetchAccountXpub(\n connectId,\n deviceId,\n 'btc',\n accountPath,\n signal,\n book\n );\n const address = this.urEngine.deriveBtcAddressFromXpub(xpub, relativeDerivePath, scriptType);\n return success<BtcAddress>({ address, path: normalizedPath });\n });\n }\n\n /**\n * `params.path` must be an account path (`m/84'/0'/0'`), the level Keystone syncs. An xpub is\n * script-type agnostic, so `86'` works here even though `btcGetAddress` rejects it.\n */\n async btcGetPublicKey(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n params?: NullableCallArg<IHardwareCallParams<BtcGetPublicKeyParams>>,\n book?: AccountBook\n ): Promise<Response<BtcPublicKey>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, params?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n if (!params) return failure(HardwareErrorCode.InvalidParams, 'btcGetPublicKey requires params');\n if (!params.path)\n return failure(HardwareErrorCode.InvalidParams, 'btcGetPublicKey requires params.path');\n\n const { accountPath, relativeDerivePath } = splitAccountPath(params.path);\n if (relativeDerivePath) {\n return failure(\n HardwareErrorCode.InvalidParams,\n \"btcGetPublicKey requires an account path, e.g. m/84'/0'/0' (not a leaf path)\"\n );\n }\n if (!isKeystoneSignableBtcAccountPath(accountPath)) {\n return failure(HardwareErrorCode.DevicePathForbidden, KEYSTONE_BTC_ACCOUNT_FORBIDDEN_MESSAGE);\n }\n\n return this._runJob(connectId, deviceId, async signal => {\n const xpub = await this._fetchAccountXpub(\n connectId,\n deviceId,\n 'btc',\n accountPath,\n signal,\n book\n );\n const meta = this.urEngine.parseXpubMeta(xpub);\n return success<BtcPublicKey>({\n xpub,\n publicKey: meta.publicKey,\n chainCode: meta.chainCode,\n depth: meta.depth,\n fingerprint: meta.parentFingerprint,\n path: normalizePath(accountPath),\n });\n });\n }\n\n async btcSignTransaction(\n _connectId?: NullableCallArg<string>,\n _deviceId?: NullableCallArg<string>,\n _params?: NullableCallArg<IHardwareCallParams<BtcSignTxParams>>\n ): Promise<Response<BtcSignedTx>> {\n return this._unsupported(\n 'btcSignTransaction',\n 'use btcSignPsbt — structured input/output signing needs host-side PSBT construction, not yet wired in'\n );\n }\n\n async btcSignPsbt(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n params?: NullableCallArg<IHardwareCallParams<BtcSignPsbtParams>>\n ): Promise<Response<BtcSignedPsbt>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, params?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n if (!params) return failure(HardwareErrorCode.InvalidParams, 'btcSignPsbt requires params');\n if (!params.psbt)\n return failure(HardwareErrorCode.InvalidParams, 'btcSignPsbt requires params.psbt');\n // `path` is optional in the shared type, but the account-0 gate needs it.\n if (!params.path)\n return failure(HardwareErrorCode.InvalidParams, 'btcSignPsbt requires params.path');\n if (!isKeystoneSignableBtcAccountPath(splitAccountPath(params.path).accountPath)) {\n return failure(HardwareErrorCode.DevicePathForbidden, KEYSTONE_BTC_ACCOUNT_FORBIDDEN_MESSAGE);\n }\n\n return this._runJob(connectId, deviceId, async signal => {\n // A PSBT may span several paths; only the wallet's mfp is needed.\n const { record } = await this._ensureWalletKnown(connectId, deviceId, 'btc', signal);\n KeystoneAdapter._throwIfAborted(signal);\n\n const requestUr = this.urEngine.buildBtcPsbtRequest(stripHex(params.psbt));\n const responseUr = await this._resolveUr(\n record,\n requestUr,\n true,\n connectId,\n signal,\n 'btcSignPsbt'\n );\n KeystoneAdapter._throwIfAborted(signal);\n\n const signedPsbt = this.urEngine.parseBtcPsbt(responseUr);\n return success<BtcSignedPsbt>({ signedPsbt });\n });\n }\n\n async btcSignMessage(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n params?: NullableCallArg<IHardwareCallParams<BtcSignMsgParams>>\n ): Promise<Response<BtcSignature>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, params?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n if (!params) return failure(HardwareErrorCode.InvalidParams, 'btcSignMessage requires params');\n if (!params.path || params.message === undefined) {\n return failure(\n HardwareErrorCode.InvalidParams,\n 'btcSignMessage requires params.path and params.message'\n );\n }\n const messageHex = params.hex\n ? stripHex(params.message)\n : Buffer.from(params.message, 'utf8').toString('hex');\n const path = normalizePath(params.path);\n if (!isKeystoneSignableBtcAccountPath(splitAccountPath(path).accountPath)) {\n return failure(HardwareErrorCode.DevicePathForbidden, KEYSTONE_BTC_ACCOUNT_FORBIDDEN_MESSAGE);\n }\n\n return this._signWithWallet({\n connectId,\n deviceId,\n chain: 'btc',\n operationName: 'btcSignMessage',\n buildRequest: (requestId, xfp) =>\n this.urEngine.buildBtcMessageSignRequest({\n requestId,\n messageHex,\n accounts: [{ path, xfp }],\n origin: this._origin,\n }),\n parseResponse: ur => this.urEngine.parseBtcSignature(ur),\n toPayload: (sig): BtcSignature => ({ signature: sig.signature }),\n });\n }\n\n async btcGetMasterFingerprint(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n paramsArg?: NullableCallArg<IHardwareCommonCallParams>\n ): Promise<Response<{ masterFingerprint: string }>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, paramsArg?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n return this._runJob(connectId, deviceId, async signal => {\n const { record } = await this._ensureWalletKnown(connectId, deviceId, 'btc', signal);\n return success({ masterFingerprint: record.masterFingerprint });\n });\n }\n\n // ---------------------------------------------------------------------------\n // SOL\n // ---------------------------------------------------------------------------\n\n async solGetAddress(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n params?: NullableCallArg<IHardwareCallParams<SolGetAddressParams>>,\n book?: AccountBook\n ): Promise<Response<SolAddress>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, params?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n if (!params) return failure(HardwareErrorCode.InvalidParams, 'solGetAddress requires params');\n if (!params.path)\n return failure(HardwareErrorCode.InvalidParams, 'solGetAddress requires params.path');\n const path = normalizePath(params.path);\n\n return this._runJob(connectId, deviceId, async signal => {\n const { account } = await this._fetchAccount(connectId, deviceId, 'sol', path, signal, book);\n KeystoneAdapter._throwIfAborted(signal);\n // The Ed25519 public key is the Solana address (base58).\n const address = bs58.encode(Buffer.from(account.publicKey, 'hex'));\n return success<SolAddress>({ address, path });\n });\n }\n\n async solSignTransaction(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n params?: NullableCallArg<IHardwareCallParams<SolSignTxParams>>\n ): Promise<Response<SolSignedTx>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, params?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n if (!params)\n return failure(HardwareErrorCode.InvalidParams, 'solSignTransaction requires params');\n if (!params.path || !params.serializedTx) {\n return failure(\n HardwareErrorCode.InvalidParams,\n 'solSignTransaction requires params.path and params.serializedTx'\n );\n }\n const path = normalizePath(params.path);\n\n return this._signWithWallet({\n connectId,\n deviceId,\n chain: 'sol',\n operationName: 'solSignTransaction',\n buildRequest: (requestId, xfp) =>\n this.urEngine.buildSolSignRequest({\n requestId,\n unsignedPayloadHex: stripHex(params.serializedTx),\n dataType: 'transaction',\n path,\n xfp,\n origin: this._origin,\n }),\n parseResponse: ur => this.urEngine.parseSolSignature(ur),\n toPayload: (sig): SolSignedTx => ({ signature: sig.signature }),\n });\n }\n\n async solSignMessage(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n params?: NullableCallArg<IHardwareCallParams<SolSignMsgParams>>\n ): Promise<Response<SolSignature>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, params?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n if (!params) return failure(HardwareErrorCode.InvalidParams, 'solSignMessage requires params');\n if (!params.path || !params.message) {\n return failure(\n HardwareErrorCode.InvalidParams,\n 'solSignMessage requires params.path and params.message'\n );\n }\n const path = normalizePath(params.path);\n\n return this._signWithWallet({\n connectId,\n deviceId,\n chain: 'sol',\n operationName: 'solSignMessage',\n buildRequest: (requestId, xfp) =>\n this.urEngine.buildSolSignRequest({\n requestId,\n unsignedPayloadHex: stripHex(params.message),\n dataType: 'message',\n path,\n xfp,\n origin: this._origin,\n }),\n parseResponse: ur => this.urEngine.parseSolSignature(ur),\n toPayload: (sig): SolSignature => ({ signature: sig.signature }),\n });\n }\n\n // ---------------------------------------------------------------------------\n // TRON: keystone-sdk-rust layout (tags 5201/5202, firmware >= 2.5.0), not sdk.tron's\n // protobuf module; OneKey Pro's encoding under the same tag is rejected by the firmware.\n // ---------------------------------------------------------------------------\n\n async tronGetAddress(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n params?: NullableCallArg<IHardwareCallParams<TronGetAddressParams>>,\n book?: AccountBook\n ): Promise<Response<TronAddress>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, params?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n if (!params) return failure(HardwareErrorCode.InvalidParams, 'tronGetAddress requires params');\n if (!params.path)\n return failure(HardwareErrorCode.InvalidParams, 'tronGetAddress requires params.path');\n\n const { accountPath, relativeDerivePath } = splitAccountPath(params.path);\n if (!relativeDerivePath) {\n return failure(\n HardwareErrorCode.InvalidParams,\n \"tronGetAddress requires a full leaf path, e.g. m/44'/195'/0'/0/0\"\n );\n }\n\n return this._runJob(connectId, deviceId, async signal => {\n const xpub = await this._fetchAccountXpub(\n connectId,\n deviceId,\n 'tron',\n accountPath,\n signal,\n book\n );\n const address = this.urEngine.deriveTronAddressFromXpub(xpub, relativeDerivePath);\n return success<TronAddress>({ address, path: normalizePath(params.path) });\n });\n }\n\n async tronSignTransaction(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n params?: NullableCallArg<IHardwareCallParams<TronSignTxParams>>\n ): Promise<Response<TronSignedTx>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, params?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n if (!params)\n return failure(HardwareErrorCode.InvalidParams, 'tronSignTransaction requires params');\n if (!params.path) {\n return failure(HardwareErrorCode.InvalidParams, 'tronSignTransaction requires params.path');\n }\n if (!params.rawTxHex) {\n return failure(\n HardwareErrorCode.InvalidParams,\n 'Keystone only signs a fully protobuf-serialized TRON transaction (params.rawTxHex) — the Trezor-style structured contract fields have no equivalent here'\n );\n }\n const rawTxHex = stripHex(params.rawTxHex);\n const path = normalizePath(params.path);\n\n return this._signWithWallet({\n connectId,\n deviceId,\n chain: 'tron',\n operationName: 'tronSignTransaction',\n buildRequest: (requestId, xfp) =>\n this.urEngine.buildTronSignRequest({\n requestId,\n rawTxHex,\n path,\n xfp,\n origin: this._origin,\n }),\n parseResponse: ur => this.urEngine.parseTronSignature(ur),\n // Keystone signs rawTxHex as given and returns only the signature, so no serializedTx.\n toPayload: (sig): TronSignedTx => ({ signature: sig.signature }),\n });\n }\n\n async tronSignMessage(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n params?: NullableCallArg<IHardwareCallParams<TronSignMsgParams>>\n ): Promise<Response<TronSignature>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, params?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n if (!params) return failure(HardwareErrorCode.InvalidParams, 'tronSignMessage requires params');\n if (!params.path) {\n return failure(HardwareErrorCode.InvalidParams, 'tronSignMessage requires params.path');\n }\n if (!params.messageHex) {\n return failure(HardwareErrorCode.InvalidParams, 'tronSignMessage requires params.messageHex');\n }\n // Firmware implements TIP-191 signMessageV2 only.\n if (params.messageType !== 'V2') {\n return failure(\n HardwareErrorCode.MethodNotSupported,\n 'Keystone signs TRON messages as TIP-191 signMessageV2 only (messageType: \"V2\")'\n );\n }\n const messageHex = stripHex(params.messageHex);\n const path = normalizePath(params.path);\n\n return this._signWithWallet({\n connectId,\n deviceId,\n chain: 'tron',\n operationName: 'tronSignMessage',\n buildRequest: (requestId, xfp) =>\n this.urEngine.buildTronSignRequest({\n requestId,\n rawTxHex: messageHex,\n path,\n xfp,\n signType: TronSignType.PersonalMessage,\n origin: this._origin,\n }),\n parseResponse: ur => this.urEngine.parseTronSignature(ur),\n toPayload: (sig): TronSignature => ({ signature: sig.signature }),\n });\n }\n\n // ---------------------------------------------------------------------------\n // Internals\n // ---------------------------------------------------------------------------\n\n private async _runJob<T>(\n connectId: string | undefined,\n deviceId: string | undefined,\n job: (signal: AbortSignal) => Promise<Response<T>>\n ): Promise<Response<T>> {\n try {\n return await this._jobQueue.enqueue(keystoneQueueKey(connectId, deviceId), job);\n } catch (err) {\n return this._errorToFailure<T>(err);\n }\n }\n\n private async _fetchAccountXpub(\n connectId: string | undefined,\n deviceId: string | undefined,\n hwkChain: ChainCapability,\n accountPath: string,\n signal: AbortSignal,\n book: AccountBook | undefined\n ): Promise<string> {\n const { account } = await this._fetchAccount(\n connectId,\n deviceId,\n hwkChain,\n accountPath,\n signal,\n book\n );\n KeystoneAdapter._throwIfAborted(signal);\n if (!account.extendedPublicKey) {\n throw createHwkError({\n code: HardwareErrorCode.MethodNotSupported,\n message: 'Keystone did not return an extended public key for this account path',\n });\n }\n return account.extendedPublicKey;\n }\n\n /**\n * Signing needs only the wallet's mfp: the device re-derives the key from path+xfp, so no\n * per-path account lookup happens here.\n */\n private _signWithWallet<S extends { requestId?: string }, T>(args: {\n connectId: string | undefined;\n deviceId: string | undefined;\n chain: ChainForFingerprint;\n operationName: string;\n buildRequest: (requestId: string, xfp: string) => KeystoneUr;\n parseResponse: (responseUr: KeystoneUr) => S;\n toPayload: (signature: S) => T;\n }): Promise<Response<T>> {\n const { connectId, deviceId } = args;\n return this._runJob(connectId, deviceId, async signal => {\n const { record } = await this._ensureWalletKnown(connectId, deviceId, args.chain, signal);\n KeystoneAdapter._throwIfAborted(signal);\n\n const requestId = uuidv4();\n const requestUr = args.buildRequest(requestId, record.masterFingerprint);\n const responseUr = await this._resolveUr(\n record,\n requestUr,\n true,\n connectId,\n signal,\n args.operationName\n );\n KeystoneAdapter._throwIfAborted(signal);\n\n const signature = args.parseResponse(responseUr);\n KeystoneAdapter._assertRequestIdMatches(requestId, signature.requestId);\n return success(args.toPayload(signature));\n });\n }\n\n private _allNetworkSyncSchema(\n item: AllNetworkAddressParams\n ): { hwkChain: ChainCapability; path: string } | undefined {\n if (!isAllNetworkMethodName(String(item.methodName)) || !item.path) return undefined;\n\n const method = item.methodName;\n const hwkChain = getAllNetworkMethodChain(method);\n const path = normalizePath(item.path);\n // Unsignable BTC accounts are refused by the per-item call; keep them out\n // of the prefetch so the device is not asked to export them.\n if (\n hwkChain === 'btc' &&\n !isKeystoneSignableBtcAccountPath(splitAccountPath(path).accountPath)\n ) {\n return undefined;\n }\n switch (method) {\n case 'evmGetAddress':\n case 'btcGetAddress':\n case 'tronGetAddress':\n return { hwkChain, path: splitAccountPath(path).accountPath };\n case 'btcGetPublicKey':\n case 'solGetAddress':\n return { hwkChain, path };\n default:\n return undefined;\n }\n }\n\n /**\n * QR answers the whole bundle with one request QR and one scan. USB exports one path per\n * request because the device limits that channel.\n */\n private async _prefetchAllNetworkAccounts(\n connectId: string,\n deviceId: string,\n params: AllNetworkGetAddressParams\n ): Promise<{ book: AccountBook; masterFingerprint?: string }> {\n return this._jobQueue.enqueue(keystoneQueueKey(connectId, deviceId), async signal => {\n const target = this._resolveTarget(connectId, deviceId);\n let { record } = target;\n\n const requestedByKey = new Map<string, { hwkChain: ChainCapability; path: string }>();\n for (const item of params.bundle) {\n const schema = this._allNetworkSyncSchema(item);\n if (schema) requestedByKey.set(accountKey(schema.hwkChain, schema.path), schema);\n }\n\n const book: AccountBook = new Map();\n if (!requestedByKey.size) {\n return { book };\n }\n const requestedSchemas = Array.from(requestedByKey.values());\n const assertAllBooked = () => {\n for (const schema of requestedSchemas) {\n if (!book.has(accountKey(schema.hwkChain, schema.path))) {\n throw createHwkError({\n code: HardwareErrorCode.DeviceMismatch,\n message: `Keystone did not return the requested derivation path (${schema.path})`,\n });\n }\n }\n };\n\n // An operation routed to QR at connectDevice must stay on QR: attaching\n // USB here would export per path while `_resolveUr` still prompts a QR.\n const operation = isHardwareOperationId(params.operationId)\n ? this._operations.find(params.operationId)\n : undefined;\n const operationRoute = operation ? this._operationRoutes.get(operation.connectId) : undefined;\n const routedToQr =\n operationRoute?.operationId === operation?.operationId &&\n operationRoute?.connectionType === 'qr';\n\n if (\n this._forcedTransport !== 'qr' &&\n !routedToQr &&\n !record?.usbSessionId &&\n this._usbConnector &&\n target.expectedMasterFingerprint\n ) {\n record = (await this._tryUsbAttach(signal, target.expectedMasterFingerprint)) ?? record;\n KeystoneAdapter._throwIfAborted(signal);\n }\n\n // importFromQr keeps a leftover usbSessionId on the record; the route,\n // not that session, decides the channel.\n if (this._forcedTransport !== 'qr' && !routedToQr && record?.usbSessionId) {\n const bundleSessionId = record.usbSessionId;\n const assertBundleSession = () => {\n if (record?.usbSessionId !== bundleSessionId) {\n throw createHwkError({\n code: HardwareErrorCode.TransportNotAvailable,\n message: 'Keystone USB connection was lost during account export',\n });\n }\n };\n for (const schema of requestedSchemas) {\n if (!book.has(accountKey(schema.hwkChain, schema.path))) {\n assertBundleSession();\n const synced = await this._fetchAccount(\n connectId,\n deviceId,\n schema.hwkChain,\n schema.path,\n signal,\n book\n );\n record = synced.record;\n assertBundleSession();\n }\n }\n assertAllBooked();\n return { book, masterFingerprint: record.masterFingerprint };\n }\n if (this._forcedTransport === 'usb') {\n throw createHwkError({\n code: HardwareErrorCode.TransportNotAvailable,\n message: 'USB channel is not connected for this Keystone wallet',\n });\n }\n\n const schemas = requestedSchemas;\n const requestUr = this.urEngine.buildKeyDerivationRequest({\n schemas: schemas.map(schema => keySchema(schema.hwkChain, schema.path)),\n origin: this._origin,\n });\n const responseUr = await this._requestQrDisplayAndAwaitResponse(\n record ? toDeviceInfo(record) : placeholderDeviceInfo(),\n { ...requestUr, animated: false },\n signal\n );\n KeystoneAdapter._throwIfAborted(signal);\n\n const parsed = this.urEngine.parseAccountResponse(responseUr);\n this._assertParsedIdentity(parsed, target);\n record = this._upsertDeviceRecord(parsed);\n const requestedChainByPath = new Map(\n schemas.map(schema => [normalizePath(schema.path), schema.hwkChain] as const)\n );\n for (const account of parsed.accounts) {\n const normalizedPath = normalizePath(account.path);\n const hwkChain =\n requestedChainByPath.get(normalizedPath) ?? inferHwkChainFromPath(normalizedPath);\n if (hwkChain) {\n book.set(accountKey(hwkChain, normalizedPath), { ...account, hwkChain });\n }\n }\n assertAllBooked();\n return { book, masterFingerprint: record.masterFingerprint };\n });\n }\n\n /** Resolve the wallet's master fingerprint from the connectId and/or deviceId the caller passed. */\n private _resolveTarget(\n connectId?: string,\n deviceId?: string\n ): ExpectedWallet & { record?: KeystoneDeviceRecord } {\n const resolvedConnectId = isHardwareOperationId(connectId)\n ? this._operations.resolve(connectId).connectId\n : connectId;\n const identifiers = [deviceId, resolvedConnectId].filter((identifier): identifier is string =>\n Boolean(identifier)\n );\n if (!identifiers.length) return {};\n\n const fingerprints = identifiers.map(identifier => keystoneMfpFromIdentifier(identifier));\n const expectedMasterFingerprint = fingerprints[0];\n if (!expectedMasterFingerprint || fingerprints.some(value => !value)) {\n throw createHwkError({\n code: HardwareErrorCode.DeviceNotFound,\n message: 'Keystone device lookup requires the wallet master fingerprint',\n });\n }\n if (fingerprints.some(value => value !== expectedMasterFingerprint)) {\n throw createHwkError({\n code: HardwareErrorCode.DeviceMismatch,\n message: 'Keystone connectId and deviceId identify different wallets',\n });\n }\n\n return {\n record: this._devices.get(expectedMasterFingerprint),\n expectedMasterFingerprint,\n };\n }\n\n private _assertParsedIdentity(\n parsed: KeystoneParsedMultiAccounts,\n expected: ExpectedWallet\n ): void {\n if (\n expected.expectedMasterFingerprint &&\n parsed.masterFingerprint !== expected.expectedMasterFingerprint\n ) {\n throw createHwkError({\n code: HardwareErrorCode.DeviceMismatch,\n message: `Connected Keystone wallet (mfp ${parsed.masterFingerprint}) does not match the requested wallet fingerprint (${expected.expectedMasterFingerprint})`,\n });\n }\n }\n\n /**\n * Folds a parsed account response into the device table. Only non-USB round trips mark\n * `qrSynced`, so a USB-only wallet is dropped on disconnect.\n */\n private _upsertDeviceRecord(\n parsed: KeystoneParsedMultiAccounts,\n options?: { viaUsb?: boolean; usbSessionId?: string }\n ): KeystoneDeviceRecord {\n const { masterFingerprint } = parsed;\n let record = this._devices.get(masterFingerprint);\n const isNew = !record;\n if (!record) {\n record = createDeviceRecord(masterFingerprint);\n this._devices.set(masterFingerprint, record);\n }\n record.model = parsed.device ?? record.model;\n record.deviceVersion = parsed.deviceVersion ?? record.deviceVersion;\n record.hardwareDeviceId = parsed.deviceId ?? record.hardwareDeviceId;\n record.usbSessionId = options?.usbSessionId ?? record.usbSessionId;\n if (!options?.viaUsb) record.qrSynced = true;\n\n const info = toDeviceInfo(record);\n const eventType = isNew ? DEVICE.CONNECT : DEVICE.CHANGED;\n this.emitter.emit(eventType, { type: eventType, payload: info });\n return record;\n }\n\n /**\n * Opens a permitted USB Keystone and takes its mfp as the wallet identity. A known wallet gains\n * USB in place (`device-changed`); an unseen one becomes USB-only.\n */\n private async _connectUsb(\n expected: ExpectedWallet,\n searchTargetId?: string,\n signal?: AbortSignal\n ): Promise<Response<DeviceInfo>> {\n if (this._pendingUsbTeardowns > 0 || this._abandonedUsbConnects > 0) {\n return failure(\n HardwareErrorCode.DeviceBusyInternal,\n 'Keystone USB session is being released'\n );\n }\n KeystoneAdapter._throwIfAborted(signal);\n let abandoned = false;\n const onAbort = () => {\n abandoned = true;\n this._abandonedUsbConnects += 1;\n };\n signal?.addEventListener('abort', onAbort, { once: true });\n // Cancellation releases the caller, not the physical USB transfer. Keep\n // the tail until the late result has been rejected and disconnected.\n const pending = this._usbConnectTail.then(async () => {\n KeystoneAdapter._throwIfAborted(signal);\n return this._connectUsbExclusive(expected, searchTargetId, signal);\n });\n const settled = pending.finally(() => {\n signal?.removeEventListener('abort', onAbort);\n if (abandoned) this._abandonedUsbConnects -= 1;\n });\n this._usbConnectTail = settled.then(\n () => undefined,\n () => undefined\n );\n return signal ? KeystoneAdapter._abortable(signal, settled) : settled;\n }\n\n private async _connectUsbExclusive(\n expected: ExpectedWallet,\n searchTargetId?: string,\n signal?: AbortSignal\n ): Promise<Response<DeviceInfo>> {\n if (!this._usbConnector) {\n return failure(\n HardwareErrorCode.TransportNotAvailable,\n 'No USB connector configured for this Keystone adapter'\n );\n }\n let sessionId: string | undefined;\n try {\n let connectTarget: ConnectorConnectTarget = { type: 'default' };\n if (searchTargetId) {\n connectTarget = { type: 'search-target', searchTargetId };\n } else if (expected.expectedMasterFingerprint) {\n connectTarget = {\n type: 'expected-device-identity',\n deviceIdentity: expected.expectedMasterFingerprint,\n };\n }\n const connector = this._usbConnector;\n const session = await (connector.connectTarget\n ? connector.connectTarget(connectTarget)\n : connector.connect(searchTargetId ?? expected.expectedMasterFingerprint));\n sessionId = session.sessionId;\n KeystoneAdapter._throwIfAborted(signal);\n const raw = session.deviceInfo.raw as { masterFingerprint?: unknown } | undefined;\n const mfpValue = parseBip32MasterFingerprint(raw?.masterFingerprint);\n if (!mfpValue) {\n throw createHwkError({\n code: HardwareErrorCode.DeviceMismatch,\n message: 'Keystone USB did not report a master fingerprint',\n });\n }\n const masterFingerprint = mfpValue.toLowerCase();\n if (\n expected.expectedMasterFingerprint &&\n masterFingerprint !== expected.expectedMasterFingerprint\n ) {\n throw createHwkError({\n code: HardwareErrorCode.DeviceMismatch,\n message: `Connected Keystone wallet (mfp ${masterFingerprint}) does not match the requested wallet fingerprint (${expected.expectedMasterFingerprint})`,\n });\n }\n\n const previousUsbSessionId = this._devices.get(masterFingerprint)?.usbSessionId;\n if (previousUsbSessionId && previousUsbSessionId !== session.sessionId) {\n try {\n await this._usbConnector.disconnect(previousUsbSessionId);\n } catch {\n // The replacement session is authoritative even if stale teardown fails.\n }\n }\n KeystoneAdapter._throwIfAborted(signal);\n const record = this._upsertDeviceRecord(\n { masterFingerprint, accounts: [] },\n {\n viaUsb: true,\n usbSessionId: session.sessionId,\n }\n );\n KeystoneAdapter._throwIfAborted(signal);\n record.hadUsbSession = true;\n record.model = session.deviceInfo.modelName ?? session.deviceInfo.model ?? record.model;\n record.deviceVersion = session.deviceInfo.firmwareVersion ?? record.deviceVersion;\n return success(toDeviceInfo(record));\n } catch (err) {\n if (sessionId) {\n try {\n await this._usbConnector.disconnect(sessionId);\n } catch {\n // Preserve the identity/export failure; teardown is best-effort.\n }\n }\n return this._errorToFailure<DeviceInfo>(err);\n }\n }\n\n /**\n * Probes already-authorized USB devices without a permission picker, then attaches and verifies\n * the requested wallet if present.\n */\n private async _tryUsbAttach(\n signal: AbortSignal,\n expectedMasterFingerprint?: string,\n options?: { waitForReenumeration?: boolean }\n ): Promise<KeystoneDeviceRecord | undefined> {\n KeystoneAdapter._throwIfAborted(signal);\n if (!expectedMasterFingerprint || this._forcedTransport === 'qr' || !this._usbConnector) {\n return undefined;\n }\n\n const maxAttempts = options?.waitForReenumeration ? KEYSTONE_USB_REATTACH_PROBE_ATTEMPTS : 1;\n let availableDevices: ConnectorDevice[] = [];\n let lastSearchError: unknown;\n for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {\n KeystoneAdapter._throwIfAborted(signal);\n try {\n // eslint-disable-next-line no-await-in-loop\n availableDevices = await KeystoneAdapter._abortable(\n signal,\n this._usbConnector.searchDevices({ purpose: 'availability' })\n );\n lastSearchError = undefined;\n } catch (error) {\n lastSearchError = error;\n }\n KeystoneAdapter._throwIfAborted(signal);\n if (availableDevices.length) {\n break;\n }\n if (attempt < maxAttempts) {\n // eslint-disable-next-line no-await-in-loop\n await KeystoneAdapter._abortable(signal, waitForKeystoneUsbReattachProbe());\n }\n }\n if (!availableDevices.length) {\n if (this._forcedTransport === 'usb' && lastSearchError) {\n throw lastSearchError instanceof Error\n ? lastSearchError\n : new Error(String(lastSearchError));\n }\n return undefined;\n }\n\n // Enumeration retries are silent; the connect runs once, targeted at the expected mfp.\n const attached = await this._connectUsb({ expectedMasterFingerprint }, undefined, signal);\n KeystoneAdapter._throwIfAborted(signal);\n // A cancelled transfer still draining is busy, not absent; don't fall back to QR.\n if (!attached.success && attached.payload.code === HardwareErrorCode.DeviceBusyInternal) {\n throw createHwkError({\n ...attached.payload,\n message: attached.payload.error,\n });\n }\n return attached.success ? this._devices.get(expectedMasterFingerprint) : undefined;\n }\n\n /**\n * Decides QR vs USB for one UR round trip. A pinned 'usb' with no live session fails closed;\n * otherwise a failed USB reattach leaves the call on QR.\n */\n private async _resolveUr(\n record: KeystoneDeviceRecord | undefined,\n requestUr: KeystoneUr,\n animated: boolean,\n operationId: string | undefined,\n signal: AbortSignal,\n operationName?: string\n ): Promise<KeystoneUr> {\n const releaseOperationRetention = isHardwareOperationId(operationId)\n ? this._operations.retain(operationId)\n : undefined;\n try {\n return await this._resolveUrWithRoute(\n record,\n requestUr,\n animated,\n operationId,\n signal,\n operationName\n );\n } finally {\n releaseOperationRetention?.();\n }\n }\n\n private async _resolveUrWithRoute(\n callerRecord: KeystoneDeviceRecord | undefined,\n requestUr: KeystoneUr,\n animated: boolean,\n operationId: string | undefined,\n signal: AbortSignal,\n operationName?: string\n ): Promise<KeystoneUr> {\n let record = callerRecord;\n let interactionRoute: OperationRoute | undefined;\n if (isHardwareOperationId(operationId)) {\n const operation = this._operations.resolve(operationId);\n const route = this._operationRoutes.get(operation.connectId);\n if (!route || route.operationId !== operationId) {\n throw this._endDisconnectedOperation(\n operationId,\n 'Keystone hardware operation is no longer connected'\n );\n }\n interactionRoute = route;\n }\n // One best-effort USB reattach; a failure is not surfaced and the call stays on QR.\n if (\n !interactionRoute &&\n !this._forcedTransport &&\n record &&\n !record.usbSessionId &&\n this._usbConnector\n ) {\n record =\n (await this._tryUsbAttach(signal, record.masterFingerprint, {\n waitForReenumeration: record.hadUsbSession,\n })) ?? record;\n }\n\n const wantUsb = interactionRoute\n ? interactionRoute.connectionType === 'usb'\n : this._forcedTransport === 'usb' ||\n (this._forcedTransport !== 'qr' && Boolean(record?.usbSessionId));\n if (wantUsb) {\n if (!record?.usbSessionId || !this._usbConnector) {\n if (interactionRoute) {\n throw this._endDisconnectedOperation(\n interactionRoute.operationId,\n 'Keystone operation USB connection was lost'\n );\n }\n throw createHwkError({\n code: HardwareErrorCode.TransportNotAvailable,\n message: 'USB channel is not connected for this Keystone wallet',\n });\n }\n const result = await this._callUsbConnector(\n record.usbSessionId,\n 'resolveUr',\n requestUr,\n signal\n );\n if (result.success) return result.payload as KeystoneUr;\n\n const usbError = rehydrateConnectorError(result.error);\n const { origin: usbErrorOrigin, code: usbErrorCode } = usbError as Error & {\n origin?: string;\n code?: number;\n };\n if (usbErrorCode === HardwareErrorCode.PayloadTooLarge && usbErrorOrigin !== 'device') {\n if (!interactionRoute && !this._forcedTransport) {\n const displayDevice = toDeviceInfo(record);\n return this._requestQrDisplayAndAwaitResponse(\n displayDevice,\n { ...requestUr, animated },\n signal\n );\n }\n // Rejected by the host before sending: keep the pinned session and report\n // the limit without implying the operation ran.\n throw usbError;\n }\n // No QR retry once the request is on the wire. Only a pipe failure drops the session;\n // `origin` decides when stamped, else the code list of device answers.\n const deviceAnswered =\n usbErrorOrigin !== undefined\n ? usbErrorOrigin === 'device'\n : usbErrorCode === HardwareErrorCode.UserRejected ||\n usbErrorCode === HardwareErrorCode.UserAborted ||\n usbErrorCode === HardwareErrorCode.DeviceLocked ||\n usbErrorCode === HardwareErrorCode.DeviceMismatch;\n if (!deviceAnswered) {\n // Hand the session back so the connector releases its transport and listener.\n const lostSessionId = record.usbSessionId;\n if (lostSessionId) {\n this._usbConnector?.disconnect(lostSessionId).catch(() => undefined);\n }\n record.usbSessionId = undefined;\n if (interactionRoute) {\n throw this._endDisconnectedOperation(\n interactionRoute.operationId,\n operationName\n ? `Keystone ${operationName} may have completed before the USB connection was lost`\n : 'Keystone operation USB connection was lost',\n operationName\n );\n }\n if (operationName) {\n throw createHwkError({\n code: (usbErrorCode as HardwareErrorCode) ?? HardwareErrorCode.TransportError,\n message: `Keystone ${operationName} may have completed before the USB connection was lost`,\n origin: 'transport',\n recovery: { scope: 'unknown' },\n params: operationMayHaveCompletedParams(operationName),\n });\n }\n }\n throw usbError;\n }\n\n const displayDevice = record ? toDeviceInfo(record) : placeholderDeviceInfo();\n try {\n return await this._requestQrDisplayAndAwaitResponse(\n displayDevice,\n { ...requestUr, animated },\n signal\n );\n } catch (error) {\n const { code, _tag: tag } = error as { code?: unknown; _tag?: unknown };\n if (\n operationName &&\n (code === HardwareErrorCode.OperationTimeout || tag === UI_REQUEST_TIMEOUT_TAG)\n ) {\n throw createHwkError({\n code: HardwareErrorCode.OperationTimeout,\n message: `Keystone ${operationName} may have completed before the QR response timed out`,\n recovery: { scope: 'unknown' },\n params: operationMayHaveCompletedParams(operationName),\n });\n }\n throw error;\n }\n }\n\n /** Ends the operation as disconnected and returns the error to throw. */\n private _endDisconnectedOperation(\n operationId: string,\n message: string,\n operationName?: string\n ): Error {\n this._operations.end(operationId, 'disconnect');\n const params = { operationId, reason: 'disconnect' };\n return createHwkError({\n code: HardwareErrorCode.OperationEnded,\n message,\n recovery: operationName ? { scope: 'unknown' } : undefined,\n params: operationName ? operationMayHaveCompletedParams(operationName, params) : params,\n });\n }\n\n /**\n * Fetches one account's key material for this operation only; `book` reuses earlier fetches. A\n * failed USB export ends the operation without replaying or switching transports.\n */\n private async _fetchAccount(\n connectId: string | undefined,\n deviceId: string | undefined,\n hwkChain: ChainCapability,\n syncPath: string,\n signal: AbortSignal,\n book?: AccountBook\n ): Promise<{ record: KeystoneDeviceRecord; account: KeystoneAccountEntry }> {\n const target = this._resolveTarget(connectId, deviceId);\n const operationConnectionType = isHardwareOperationId(connectId)\n ? this._operations.resolve(connectId).connectionType\n : undefined;\n const key = accountKey(hwkChain, syncPath);\n\n let existingRecord = target.record;\n if (!existingRecord) {\n existingRecord = await this._tryUsbAttach(signal, target.expectedMasterFingerprint);\n KeystoneAdapter._throwIfAborted(signal);\n }\n const booked = book?.get(key);\n if (existingRecord && booked) {\n return { record: existingRecord, account: booked };\n }\n if (\n !operationConnectionType &&\n existingRecord &&\n !existingRecord.usbSessionId &&\n this._forcedTransport === 'usb'\n ) {\n // Pinned to USB without a session: attach here so enumeration errors\n // surface (resolveUr skips its probe for pinned transports).\n await this._tryUsbAttach(signal, existingRecord.masterFingerprint, {\n waitForReenumeration: existingRecord.hadUsbSession,\n });\n KeystoneAdapter._throwIfAborted(signal);\n existingRecord = this._devices.get(existingRecord.masterFingerprint) ?? existingRecord;\n }\n\n // A leftover USB session must not change a QR operation's request.\n const useSinglePathUsbExport = operationConnectionType\n ? operationConnectionType === 'usb'\n : this._forcedTransport !== 'qr' && Boolean(existingRecord?.usbSessionId);\n const schemas = [keySchema(hwkChain, syncPath)];\n const requestUr = this.urEngine.buildKeyDerivationRequest({ schemas, origin: this._origin });\n const responseUr = await this._resolveUr(existingRecord, requestUr, false, connectId, signal);\n KeystoneAdapter._throwIfAborted(signal);\n\n const parsed = this.urEngine.parseAccountResponse(responseUr);\n let record: KeystoneDeviceRecord;\n if (useSinglePathUsbExport && existingRecord) {\n if (parsed.masterFingerprint !== existingRecord.masterFingerprint) {\n throw createHwkError({\n code: HardwareErrorCode.DeviceMismatch,\n message: 'Keystone USB account export returned a different master fingerprint',\n });\n }\n record = existingRecord;\n } else {\n this._assertParsedIdentity(parsed, target);\n record = this._upsertDeviceRecord(parsed, {\n viaUsb: operationConnectionType !== 'qr' && Boolean(existingRecord?.usbSessionId),\n });\n }\n const account = parsed.accounts.find(a => normalizePath(a.path) === syncPath);\n if (!account) {\n throw createHwkError({\n code: HardwareErrorCode.DeviceMismatch,\n message: `Keystone did not return the requested derivation path (${syncPath})`,\n });\n }\n const entry: KeystoneAccountEntry = { ...account, hwkChain };\n if (book) {\n // Everything the device answered stays usable for this operation.\n for (const returned of parsed.accounts) {\n const returnedChain = inferHwkChainFromPath(returned.path);\n if (returnedChain) {\n book.set(accountKey(returnedChain, returned.path), {\n ...returned,\n hwkChain: returnedChain,\n });\n }\n }\n book.set(key, entry);\n }\n return { record, account: entry };\n }\n\n /**\n * Resolves which wallet is attached, without a per-path account. `CHAIN_FINGERPRINT_PATHS.evm` is\n * a leaf path, so it is cut to the account path Keystone expects.\n */\n private async _ensureWalletKnown(\n connectId: string | undefined,\n deviceId: string | undefined,\n chain: ChainForFingerprint,\n signal: AbortSignal\n ): Promise<{ record: KeystoneDeviceRecord }> {\n const target = this._resolveTarget(connectId, deviceId);\n if (target.record) return { record: target.record };\n\n const attached = await this._tryUsbAttach(signal, target.expectedMasterFingerprint);\n KeystoneAdapter._throwIfAborted(signal);\n if (attached) return { record: attached };\n\n // The caller named the wallet: its mfp is all a signing request needs, and a wrong wallet is\n // refused by the device itself. No identity round trip first.\n if (target.expectedMasterFingerprint) {\n return { record: createDeviceRecord(target.expectedMasterFingerprint) };\n }\n\n // A true cold start: ask the device once for any account, which carries the mfp.\n const { accountPath } = splitAccountPath(CHAIN_FINGERPRINT_PATHS[chain]);\n const requestUr = this.urEngine.buildKeyDerivationRequest({\n schemas: [keySchema(chain, accountPath)],\n origin: this._origin,\n });\n const responseUr = await this._resolveUr(undefined, requestUr, false, connectId, signal);\n KeystoneAdapter._throwIfAborted(signal);\n\n return { record: this._upsertDeviceRecord(this.urEngine.parseAccountResponse(responseUr)) };\n }\n\n /**\n * The operation owning the running job, so a mid-call UI request can name it. Unpinned jobs map\n * through the operation route; a cold start returns undefined.\n */\n private _activeOperationId(): string | undefined {\n const activeJobId = this._jobQueue.getActiveJob()?.deviceId;\n if (!activeJobId) return undefined;\n if (isHardwareOperationId(activeJobId)) return activeJobId;\n return this._operationRouteForIdentifier(activeJobId)?.operationId;\n }\n\n /** Routes are keyed by connectId; a job key may be the bare master fingerprint. */\n private _operationRouteForIdentifier(identifier: string): OperationRoute | undefined {\n for (const key of keystoneCancelQueueKeys([identifier])) {\n const route = this._operationRoutes.get(key);\n if (route) return route;\n }\n const masterFingerprint = keystoneMfpFromIdentifier(identifier);\n return masterFingerprint\n ? this._operationRoutes.get(walletConnectId(masterFingerprint))\n : undefined;\n }\n\n /**\n * A QR prompt has no transport to interrupt; releasing the registry slot on abort is what lets\n * a cancel reach the wait before the QR timeout.\n */\n private async _awaitQrResponse<T>(\n requestType: string,\n pending: Promise<T>,\n signal?: AbortSignal\n ): Promise<T> {\n if (!signal) return pending;\n let settled = false;\n const onAbort = () => {\n if (!settled) this._uiRegistry.cancel(requestType);\n };\n if (signal.aborted) onAbort();\n else signal.addEventListener('abort', onAbort, { once: true });\n try {\n return await pending;\n } finally {\n settled = true;\n signal.removeEventListener('abort', onAbort);\n }\n }\n\n private async _requestQrDisplayAndAwaitResponse(\n device: DeviceInfo,\n data: QrDisplayData,\n signal?: AbortSignal\n ): Promise<KeystoneUr> {\n const operationId = this._activeOperationId();\n const waitPromise = this._uiRegistry.wait<{ urType: string; urData: string }>(\n UI_REQUEST.REQUEST_QR_DISPLAY,\n { timeoutMs: this._qrTimeoutMs, operationId }\n );\n this.emitter.emit(UI_REQUEST.REQUEST_QR_DISPLAY, {\n type: UI_REQUEST.REQUEST_QR_DISPLAY,\n payload: { device, data, operationId },\n });\n const response = await this._awaitQrResponse(\n UI_REQUEST.REQUEST_QR_DISPLAY,\n waitPromise,\n signal\n );\n return { urType: response.urType, urData: response.urData };\n }\n\n private async _requestQrScanAndAwaitResponse(\n device: DeviceInfo,\n signal?: AbortSignal\n ): Promise<KeystoneUr> {\n const operationId = this._activeOperationId();\n const waitPromise = this._uiRegistry.wait<{ urType: string; urData: string }>(\n UI_REQUEST.REQUEST_QR_SCAN,\n { timeoutMs: this._qrTimeoutMs, operationId }\n );\n this.emitter.emit(UI_REQUEST.REQUEST_QR_SCAN, {\n type: UI_REQUEST.REQUEST_QR_SCAN,\n payload: { device, operationId },\n });\n const response = await this._awaitQrResponse(UI_REQUEST.REQUEST_QR_SCAN, waitPromise, signal);\n return { urType: response.urType, urData: response.urData };\n }\n\n private async _callUsbConnector(\n sessionId: string,\n method: string,\n params: unknown,\n signal?: AbortSignal\n ): Promise<ConnectorCallResult> {\n if (!this._usbConnector) {\n throw createHwkError({\n code: HardwareErrorCode.TransportNotAvailable,\n message: 'No USB connector configured for this Keystone adapter',\n });\n }\n if (this._pendingUsbTeardowns > 0 || this._unsettledUsbOperations.size > 0) {\n throw createHwkError({\n code: HardwareErrorCode.DeviceBusyInternal,\n message: `Keystone USB is busy while calling ${method}`,\n });\n }\n // Checked before the connector call: racing an aborted signal would still put\n // the command on the wire.\n if (signal?.aborted) {\n throw signal.reason instanceof Error\n ? signal.reason\n : createHwkError({\n code: HardwareErrorCode.UserAborted,\n message: 'User aborted operation',\n });\n }\n const releaseOperation = this._retainUsbOperation(`call:${sessionId}`);\n let rawCall: Promise<ConnectorCallResult>;\n try {\n rawCall = this._usbConnector.call(sessionId, method, params).finally(releaseOperation);\n } catch (error) {\n releaseOperation();\n throw error;\n }\n return signal ? KeystoneAdapter._abortable(signal, rawCall) : rawCall;\n }\n\n private _runUsbTeardown(task: () => Promise<void>): Promise<void> {\n const previous = this._usbTeardownTail;\n let releaseTail: () => void = () => undefined;\n this._usbTeardownTail = new Promise<void>(resolve => {\n releaseTail = resolve;\n });\n this._pendingUsbTeardowns += 1;\n return (async () => {\n try {\n await previous;\n await this._waitForUsbOperationsToDrain();\n await task();\n } finally {\n this._pendingUsbTeardowns -= 1;\n releaseTail();\n }\n })();\n }\n\n private _waitForUsbOperationsToDrain(): Promise<void> {\n if (this._unsettledUsbOperations.size === 0) return Promise.resolve();\n return new Promise(resolve => {\n this._usbIdleWaiters.add(resolve);\n });\n }\n\n private _retainUsbOperation(key: string): () => void {\n this._unsettledUsbOperations.set(key, (this._unsettledUsbOperations.get(key) ?? 0) + 1);\n let released = false;\n return () => {\n if (released) return;\n released = true;\n const remaining = (this._unsettledUsbOperations.get(key) ?? 1) - 1;\n if (remaining > 0) {\n this._unsettledUsbOperations.set(key, remaining);\n } else {\n this._unsettledUsbOperations.delete(key);\n }\n if (this._unsettledUsbOperations.size === 0) {\n for (const resolve of this._usbIdleWaiters) resolve();\n this._usbIdleWaiters.clear();\n }\n };\n }\n\n private static _abortable<T>(signal: AbortSignal, promise: Promise<T>): Promise<T> {\n const abortReason = () =>\n signal.reason instanceof Error ? signal.reason : new Error('Aborted');\n if (signal.aborted) return Promise.reject(abortReason());\n return new Promise<T>((resolve, reject) => {\n const onAbort = () => reject(abortReason());\n signal.addEventListener('abort', onAbort, { once: true });\n promise.then(\n value => {\n signal.removeEventListener('abort', onAbort);\n resolve(value);\n },\n error => {\n signal.removeEventListener('abort', onAbort);\n reject(error);\n }\n );\n });\n }\n\n private static _throwIfAborted(signal: AbortSignal | undefined): void {\n if (signal?.aborted) {\n throw signal.reason instanceof Error ? signal.reason : new Error('Operation aborted');\n }\n }\n\n private static _assertRequestIdMatches(expected: string, actual?: string): void {\n if (actual && actual.toLowerCase() !== expected.toLowerCase()) {\n throw createHwkError({\n code: HardwareErrorCode.DeviceMismatch,\n message:\n 'Keystone response requestId does not match the pending request — discarding a stale or unrelated scan',\n });\n }\n }\n\n private _unsupported<T>(method: string, reason: string): Promise<Response<T>> {\n return Promise.resolve(\n failure(\n HardwareErrorCode.MethodNotSupported,\n `KeystoneAdapter.${method} is not implemented yet: ${reason}`\n )\n );\n }\n\n private _errorToFailure<T>(err: unknown): Response<T> {\n if (err && typeof err === 'object') {\n const e = err as {\n code?: unknown;\n message?: string;\n params?: Record<string, unknown>;\n _tag?: string;\n recovery?: unknown;\n };\n // Only five-digit codes are HWK codes; a DOMException code or errno falls\n // through to UnknownError with its message.\n if (typeof e.code === 'number' && e.code >= 10000 && e.code <= 99999) {\n const { origin } = e as { origin?: unknown };\n return failure(\n e.code as HardwareErrorCode,\n e.message ?? 'Unknown error',\n e.params,\n origin === 'device' || origin === 'transport' || origin === 'host' ? origin : undefined,\n isHwkRecoveryHint(e.recovery) ? e.recovery : undefined\n );\n }\n if (e._tag === UI_REQUEST_CANCELLED_TAG || e._tag === UI_REQUEST_PREEMPTED_TAG) {\n return failure(\n HardwareErrorCode.UserAborted,\n e.message ?? 'Keystone QR operation was cancelled'\n );\n }\n if (e._tag === UI_REQUEST_TIMEOUT_TAG) {\n return failure(\n HardwareErrorCode.OperationTimeout,\n e.message ?? 'Keystone QR operation timed out'\n );\n }\n }\n const message = err instanceof Error ? err.message : String(err);\n // An uncoded error here is usually a real bug; keep the stack for the host.\n const params = err instanceof Error && err.stack ? { stack: err.stack } : undefined;\n return failure(HardwareErrorCode.UnknownError, message, params);\n }\n}\n","import type { BtcScriptType } from '../urEngine/types';\n\n/** Always returns an `m/`-prefixed path, regardless of the input's casing/prefix. */\nexport function normalizePath(path: string): string {\n const trimmed = path.trim();\n return /^m\\//i.test(trimmed) ? `m/${trimmed.slice(2)}` : `m/${trimmed}`;\n}\n\n/**\n * Splits a 5-segment BIP-44 leaf path into the 3-segment account path and the relative\n * `change/index`; a path of 3 or fewer segments is already an account path.\n */\nexport function splitAccountPath(path: string): {\n accountPath: string;\n relativeDerivePath: string;\n} {\n const normalized = normalizePath(path);\n const segments = normalized.slice(2).split('/');\n if (segments.length <= 3) {\n return { accountPath: normalized, relativeDerivePath: '' };\n }\n const accountSegments = segments.slice(0, segments.length - 2);\n const relativeSegments = segments.slice(segments.length - 2);\n return {\n accountPath: `m/${accountSegments.join('/')}`,\n relativeDerivePath: relativeSegments.join('/'),\n };\n}\n\n/** BIP-44/49/84/86 purpose to script type; undefined for any other purpose. */\nexport function btcScriptTypeFromPath(path: string): BtcScriptType | undefined {\n const match = normalizePath(path).match(/^m\\/(\\d+)'/);\n if (!match) return undefined;\n switch (Number(match[1])) {\n case 44:\n return 'p2pkh';\n case 49:\n return 'p2sh-p2wpkh';\n case 84:\n return 'p2wpkh';\n case 86:\n return 'p2tr';\n default:\n return undefined;\n }\n}\n\n/**\n * Firmware signs BTC only against account-0 xpubs (gui_btc.c PreparePublicKeys). Testnet is\n * excluded because addresses are derived with mainnet parameters.\n */\nexport function isKeystoneSignableBtcAccountPath(accountPath: string): boolean {\n const segments = normalizePath(accountPath).slice(2).split('/');\n if (segments.length !== 3) return false;\n const [purpose, coin, account] = segments;\n return [\"44'\", \"49'\", \"84'\", \"86'\"].includes(purpose) && coin === \"0'\" && account === \"0'\";\n}\n\nexport const KEYSTONE_BTC_ACCOUNT_FORBIDDEN_MESSAGE =\n \"Keystone BTC is limited to mainnet account 0 (m/44'|49'|84'|86'/0'/0')\";\n","import { normalizePath } from './pathUtils';\n\nimport type { KeystoneParsedAccount } from '../urEngine/types';\nimport type { ChainCapability, DeviceCapabilities, DeviceInfo } from '@onekeyfe/hwk-adapter-core';\n\nexport const KEYSTONE_WALLET_CONNECT_ID_PREFIX = 'keystone-wallet:';\n\n/** Account a QR cold start requests when the caller named no path; any path returns the mfp. */\nexport const KEYSTONE_COLD_START_PATH = \"m/44'/60'/0'\";\n\nexport function walletConnectId(masterFingerprint: string): string {\n return `${KEYSTONE_WALLET_CONNECT_ID_PREFIX}${masterFingerprint}`;\n}\n\nexport interface KeystoneAccountEntry extends KeystoneParsedAccount {\n hwkChain: ChainCapability;\n}\n\nexport function accountKey(hwkChain: ChainCapability, path: string): string {\n return `${hwkChain}:${normalizePath(path)}`;\n}\n\nexport interface KeystoneDeviceRecord {\n /** Lowercase 8-char BIP32 master fingerprint: the wallet identity and the BC-UR xfp. */\n masterFingerprint: string;\n connectId: string;\n /** Optional physical-device id exposed by some Keystone QR export menus. */\n hardwareDeviceId?: string;\n /** Model string from the device (e.g. \"Keystone 3 Pro\"); not unique per unit. */\n model?: string;\n deviceVersion?: string;\n importedAt: number;\n /** Connector session id while a live USB session exists; its presence routes calls over USB. */\n usbSessionId?: string;\n /**\n * Stays true after the USB session is lost, so only these wallets wait through the device's\n * USB re-enumeration window.\n */\n hadUsbSession?: boolean;\n /** True after one QR round trip; on USB disconnect it decides demote-to-QR versus drop. */\n qrSynced?: boolean;\n}\n\nexport function createDeviceRecord(masterFingerprint: string): KeystoneDeviceRecord {\n return {\n masterFingerprint,\n connectId: walletConnectId(masterFingerprint),\n importedAt: Date.now(),\n };\n}\n\nconst CAPABILITIES: DeviceCapabilities = { persistentDeviceIdentity: true };\n\nexport function toDeviceInfo(record: KeystoneDeviceRecord): DeviceInfo {\n // `connectionType` is the channel a call would use now; `raw.availableChannels`\n // lists both for a merged QR + USB wallet.\n let availableChannels: Array<'qr' | 'usb'> = ['qr'];\n if (record.usbSessionId) {\n availableChannels = record.qrSynced ? ['qr', 'usb'] : ['usb'];\n }\n return {\n vendor: 'keystone',\n model: record.model ?? 'unknown',\n modelName: record.model,\n firmwareVersion: record.deviceVersion ?? '0.0.0',\n deviceId: record.masterFingerprint,\n connectId: record.connectId,\n connectionType: record.usbSessionId ? 'usb' : 'qr',\n capabilities: CAPABILITIES,\n raw: {\n availableChannels,\n masterFingerprint: record.masterFingerprint,\n hardwareDeviceId: record.hardwareDeviceId,\n },\n };\n}\n\n/** Device row for a not-yet-synced wallet during a cold-start round trip. */\nexport function placeholderDeviceInfo(): DeviceInfo {\n return {\n vendor: 'keystone',\n model: 'unknown',\n firmwareVersion: '0.0.0',\n deviceId: '',\n connectId: '',\n connectionType: 'qr',\n capabilities: CAPABILITIES,\n };\n}\n","/**\n * Single source of the device-queue key: enqueue, the all-network cancel scope and `cancel()`\n * must agree or a cancel misses its target. A pinned operation id wins.\n */\nimport { isHardwareOperationId, parseBip32MasterFingerprint } from '@onekeyfe/hwk-adapter-core';\n\nimport { KEYSTONE_WALLET_CONNECT_ID_PREFIX } from '../adapter/deviceTable';\n\n/** Queue key for a cold start, which has neither a connectId nor a deviceId yet. */\nexport const KEYSTONE_COLD_START_JOB_LABEL = 'keystone-cold-start';\n\nexport function keystoneQueueKey(connectId?: string, deviceId?: string): string {\n return isHardwareOperationId(connectId)\n ? connectId\n : deviceId || connectId || KEYSTONE_COLD_START_JOB_LABEL;\n}\n\n/** A Keystone identifier is either a wallet connectId or the bare 8-hex master fingerprint. */\nexport function keystoneMfpFromIdentifier(identifier: string): string | undefined {\n const value = identifier.startsWith(KEYSTONE_WALLET_CONNECT_ID_PREFIX)\n ? identifier.slice(KEYSTONE_WALLET_CONNECT_ID_PREFIX.length)\n : identifier;\n return parseBip32MasterFingerprint(value);\n}\n\n/**\n * Every queue key one identifier can stand for, so a cancel that knows only one of operation id,\n * connectId or master fingerprint fans out over all of them.\n */\nexport function keystoneCancelQueueKeys(identifiers: (string | undefined)[]): Set<string> {\n const keys = new Set<string>();\n for (const identifier of identifiers) {\n if (identifier) {\n keys.add(identifier);\n const masterFingerprint = keystoneMfpFromIdentifier(identifier);\n if (masterFingerprint) keys.add(masterFingerprint);\n }\n }\n return keys;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,gCAAwC;AACxC,0BAA8D;AAC9D,uBAAsB;AACtB,cAAyB;AACzB,mBAAkB;AAClB,kBAA+D;AAC/D,8BAA4C;;;ACN5C,4BAQO;AAIP,IAAM,EAAE,iBAAiB,IAAI;AAM7B,IAAM,yBAAyB,IAAI,mCAAa,qBAAqB,IAAI;AA0BlE,IAAM,kBAAN,MAAM,yBAAwB,mCAAa;AAAA,EAehD,YAAY,MAA4B;AACtC,UAAM;AAHR,2BAAkB,MAAoB;AAYtC,wBAAe,MAA0B,KAAK;AAE9C,uBAAc,MAAc,KAAK;AAEjC,uBAAc,MAAoB,KAAK;AAEvC,6BAAoB,MAAc,KAAK,eAAe,QAAQ;AAE9D,qBAAY,MAA0B,KAAK;AAE3C,sBAAa,MAAgB;AAC3B,YAAM,MAAmB,CAAC;AAC1B,UAAI,KAAK,WAAW;AAClB,YAAI,iBAAqB,IAAI,IAAI,+BAAS,KAAK,WAAW,oCAAc,KAAK,OAAO,CAAC;AAAA,MACvF;AACA,UAAI,KAAK,QAAS,KAAI,eAAmB,IAAI,KAAK;AAClD,UAAI,KAAK,OAAQ,KAAI,cAAkB,IAAI,KAAK;AAChD,UAAI,gBAAoB,IAAI,KAAK;AACjC,UAAI,gBAAoB,IAAI,KAAK;AACjC,YAAM,UAAU,KAAK,eAAe,WAAW;AAC/C,cAAQ,OAAO,KAAK,eAAe,gBAAgB,EAAE,OAAO,CAAC;AAC7D,UAAI,sBAA0B,IAAI;AAClC,aAAO,IAAI,+BAAS,GAAG;AAAA,IACzB;AA/BE,SAAK,YAAY,KAAK;AACtB,SAAK,WAAW,KAAK;AACrB,SAAK,iBAAiB,KAAK;AAC3B,SAAK,UAAU,KAAK;AACpB,SAAK,SAAS,KAAK;AACnB,SAAK,WAAW,KAAK;AAAA,EACvB;AAAA,EA2BA,OAAO,aAAa,UAAqC;AACvD,UAAM,MAAM,SAAS,QAAQ;AAC7B,UAAM,WAAW,IAAI,gBAAoB;AACzC,UAAM,iBAAiB,oCAAc,aAAa,IAAI,sBAA0B,CAAa;AAC7F,UAAM,UAAU,IAAI,eAAmB;AACvC,UAAM,gBAAgB,IAAI,iBAAqB;AAC/C,UAAM,YAAY,eAAe,QAAQ;AACzC,UAAM,SAAS,IAAI,cAAkB;AACrC,UAAM,WAAW,IAAI,gBAAoB;AACzC,WAAO,IAAI,iBAAgB,EAAE,WAAW,UAAU,gBAAgB,SAAS,QAAQ,SAAS,CAAC;AAAA,EAC/F;AAAA,EAEA,OAAO,SAAS,aAAsC;AACpD,WAAO,iBAAgB,aAAa,iBAAiB,WAAW,CAAC;AAAA,EACnE;AAAA,EAEA,OAAO,UAAU,MAAc,KAA4B;AACzD,UAAM,WAAW,KAAK,QAAQ,WAAW,EAAE,EAAE,MAAM,GAAG;AACtD,UAAM,aAAa,SAAS,IAAI,aAAW;AACzC,YAAM,WAAW,QAAQ,SAAS,GAAG;AACrC,aAAO,IAAI,oCAAc;AAAA,QACvB,OAAO,SAAS,WAAW,QAAQ,MAAM,GAAG,EAAE,IAAI,SAAS,EAAE;AAAA,QAC7D;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AACD,WAAO,IAAI,oCAAc,YAAY,OAAO,KAAK,KAAK,KAAK,CAAC;AAAA,EAC9D;AACF;;;ACzHA,IAAAA,yBAMO;AAIP,IAAM,EAAE,kBAAAC,kBAAiB,IAAI;AAG7B,IAAM,sBAAsB,IAAI,oCAAa,kBAAkB,IAAI;AAO5D,IAAM,gBAAN,MAAM,uBAAsB,oCAAa;AAAA,EAO9C,YAAY,WAAmB,WAAoB;AACjD,UAAM;AAHR,2BAAkB,MAAoB;AAQtC,wBAAe,MAA0B,KAAK;AAE9C,wBAAe,MAAc,KAAK;AAElC,sBAAa,MAAgB;AAC3B,YAAM,MAAmB,CAAC;AAC1B,UAAI,KAAK,WAAW;AAClB,YAAI,iBAAuB,IAAI,IAAI,gCAAS,KAAK,WAAW,qCAAc,KAAK,OAAO,CAAC;AAAA,MACzF;AACA,UAAI,iBAAuB,IAAI,KAAK;AACpC,aAAO,IAAI,gCAAS,GAAG;AAAA,IACzB;AAfE,SAAK,iBAAiB;AACtB,SAAK,YAAY;AAAA,EACnB;AAAA,EAeA,OAAO,aAAa,UAAmC;AACrD,UAAM,MAAM,SAAS,QAAQ;AAC7B,UAAM,YAAY,IAAI,iBAAuB;AAC7C,QAAI,CAAC,OAAO,SAAS,SAAS,GAAG;AAC/B,YAAM,IAAI,MAAM,2DAA2D;AAAA,IAC7E;AACA,UAAM,gBAAgB,IAAI,iBAAuB;AACjD,UAAM,YAAY,eAAe,QAAQ;AACzC,WAAO,IAAI,eAAc,WAAW,SAAS;AAAA,EAC/C;AAAA,EAEA,OAAO,SAAS,aAAoC;AAClD,WAAO,eAAc,aAAaC,kBAAiB,WAAW,CAAC;AAAA,EACjE;AACF;;;AFhCA,IAAM,sBAAsB;AAE5B,SAAS,eAAe,KAAqB;AAC3C,SAAO,IAAI,QAAQ,QAAQ,EAAE;AAC/B;AAEA,IAAM,gBAAgB;AAAA,EACpB,aAAa;AAAA,EACb,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,kBAAkB;AACpB;AAEA,IAAM,mBAAmB;AAAA,EACvB,WAAW,0BAAM;AAAA,EACjB,SAAS,0BAAM;AACjB;AAEA,SAAS,QAAQ,IAAoB;AACnC,SAAO,IAAI,uBAAG,OAAO,KAAK,GAAG,QAAQ,KAAK,GAAG,GAAG,MAAM;AACxD;AAEA,SAAS,UAAU,IAAoB;AACrC,SAAO,EAAE,QAAQ,GAAG,MAAM,QAAQ,GAAG,KAAK,SAAS,KAAK,EAAE;AAC5D;AAMA,SAAS,kBAAkB,KAAkD;AAC3E,MAAI,IAAI,SAAS,OAAO,IAAI,SAAS,MAAM,GAAG;AAC5C,UAAM,IAAI;AAAA,MACR,uBAAuB,IAAI,SAAS,CAAC;AAAA,IACvC;AAAA,EACF;AACA,SAAO,EAAE,GAAG,IAAI,MAAM,GAAG,EAAE,GAAG,GAAG,IAAI,MAAM,IAAI,GAAG,GAAG,GAAG,IAAI,MAAM,GAAG,EAAE;AACzE;AAGA,SAAS,sBAAsB,KAAa,eAAuB,OAAuB;AACxF,MAAI,IAAI,WAAW,gBAAgB,GAAG;AACpC,UAAM,IAAI;AAAA,MACR,uBACE,IAAI,SAAS,CACf,SAAS,KAAK,wBAAwB,aAAa;AAAA,IACrD;AAAA,EACF;AACA,SAAO;AACT;AAGA,IAAM,6BAA6B;AAEnC,SAAS,8BAA8B,OAAwB;AAC7D,QAAM,kBAAc,qDAA4B,KAAK;AACrD,MAAI,CAAC,eAAe,gBAAgB,4BAA4B;AAC9D,UAAM,IAAI,MAAM,wEAAwE;AAAA,EAC1F;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,KAAmE;AAC1F,SAAO;AAAA,IACL,OAAO,IAAI;AAAA,IACX,MAAM,IAAI;AAAA,IACV,WAAW,IAAI;AAAA,IACf,mBAAmB,IAAI;AAAA,IACvB,KAAK,IAAI,MAAM,8BAA8B,IAAI,GAAG,IAAI;AAAA,IACxD,MAAM,IAAI;AAAA,EACZ;AACF;AAGA,SAAS,eAAe,oBAAoC;AAC1D,SAAO,KAAK,mBAAmB,QAAQ,SAAS,EAAE,CAAC;AACrD;AAMO,IAAM,mBAAN,MAAuB;AAAA,EAG5B,YAAY,SAAS,UAAU;AAC7B,SAAK,MAAM,IAAI,gCAAY,EAAE,OAAO,CAAC;AAAA,EACvC;AAAA;AAAA,EAIA,mBAAmB,IAA6C;AAC9D,UAAM,SAAS,KAAK,IAAI,mBAAmB,QAAQ,EAAE,CAAC;AACtD,WAAO;AAAA,MACL,mBAAmB,8BAA8B,OAAO,iBAAiB;AAAA,MACzE,QAAQ,OAAO;AAAA,MACf,UAAU,OAAO;AAAA,MACjB,eAAe,OAAO;AAAA,MACtB,UAAU,OAAO,KAAK,IAAI,eAAe;AAAA,IAC3C;AAAA,EACF;AAAA,EAEA,WAAW,IAAuC;AAChD,WAAO,gBAAgB,KAAK,IAAI,WAAW,QAAQ,EAAE,CAAC,CAAC;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,0BAA0B,OAAsD;AAC9E,UAAM,KAAK,KAAK,IAAI,0BAA0B;AAAA,MAC5C,SAAS,MAAM,QAAQ,IAAI,aAAW;AAAA,QACpC,MAAM,OAAO;AAAA,QACb,OAAO,iBAAiB,OAAO,SAAS,WAAW;AAAA,MACrD,EAAE;AAAA,MACF,QAAQ,MAAM;AAAA,MACd,SAAS,0CAAsB;AAAA,IACjC,CAAC;AACD,WAAO,UAAU,EAAE;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,qBAAqB,IAA6C;AAChE,QAAI,GAAG,WAAW,gBAAgB;AAChC,YAAM,UAAU,KAAK,WAAW,EAAE;AAClC,UAAI,CAAC,QAAQ,KAAK;AAChB,cAAM,IAAI,MAAM,kEAAkE;AAAA,MACpF;AACA,aAAO;AAAA,QACL,mBAAmB,8BAA8B,QAAQ,GAAG;AAAA,QAC5D,UAAU,CAAC,OAAO;AAAA,MACpB;AAAA,IACF;AACA,WAAO,KAAK,mBAAmB,EAAE;AAAA,EACnC;AAAA;AAAA,EAIA,oBAAoB,OAAgD;AAClE,UAAM,KAAK,KAAK,IAAI,IAAI,oBAAoB;AAAA,MAC1C,WAAW,MAAM;AAAA,MACjB,UAAU,MAAM;AAAA,MAChB,UAAU,cAAc,MAAM,QAAQ;AAAA,MACtC,MAAM,MAAM;AAAA,MACZ,KAAK,MAAM;AAAA,MACX,SAAS,MAAM;AAAA,MACf,SAAS,MAAM;AAAA,MACf,QAAQ,MAAM;AAAA,IAChB,CAAC;AACD,WAAO,UAAU,EAAE;AAAA,EACrB;AAAA,EAEA,kBAAkB,IAA4C;AAC5D,UAAM,YAAY,KAAK,IAAI,IAAI,eAAe,QAAQ,EAAE,CAAC;AACzD,WAAO,EAAE,WAAW,UAAU,WAAW,GAAG,kBAAkB,UAAU,SAAS,EAAE;AAAA,EACrF;AAAA;AAAA,EAGA,yBAAyB,MAAc,oBAAoC;AACzE,eAAO,mDAAwB,MAAM,eAAe,kBAAkB,CAAC;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,yBACE,MACA,oBACA,YACQ;AACR,UAAM,OAAO,aAAAC,QAAM,gBAAgB,IAAI,EAAE,OAAO,eAAe,kBAAkB,CAAC;AAClF,QAAI,CAAC,KAAK,UAAW,OAAM,IAAI,MAAM,+CAA+C;AACpF,WAAO,KAAK;AAAA,MACV,OAAO,KAAK,KAAK,SAAS,EAAE,SAAS,KAAK;AAAA,MAC1C;AAAA,IACF;AAAA,EACF;AAAA,EAEA,8BAA8B,cAAsB,YAAmC;AACrF,UAAM,SAAS,OAAO,KAAK,eAAe,YAAY,GAAG,KAAK;AAC9D,UAAM,UAAkB,iBAAS;AAEjC,YAAQ,YAAY;AAAA,MAClB,KAAK,SAAS;AACZ,cAAM,EAAE,QAAQ,IAAY,iBAAS,MAAM,EAAE,QAAQ,QAAQ,CAAC;AAC9D,YAAI,CAAC,QAAS,OAAM,IAAI,MAAM,uDAAuD;AACrF,eAAO;AAAA,MACT;AAAA,MACA,KAAK,eAAe;AAClB,cAAM,EAAE,QAAQ,IAAY,iBAAS,KAAK;AAAA,UACxC,QAAgB,iBAAS,OAAO,EAAE,QAAQ,QAAQ,CAAC;AAAA,UACnD;AAAA,QACF,CAAC;AACD,YAAI,CAAC;AACH,gBAAM,IAAI,MAAM,6DAA6D;AAC/E,eAAO;AAAA,MACT;AAAA,MACA,KAAK,UAAU;AACb,cAAM,EAAE,QAAQ,IAAY,iBAAS,OAAO,EAAE,QAAQ,QAAQ,CAAC;AAC/D,YAAI,CAAC,QAAS,OAAM,IAAI,MAAM,wDAAwD;AACtF,eAAO;AAAA,MACT;AAAA,MACA,KAAK;AACH,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF,SAAS;AACP,cAAM,aAAoB;AAC1B,cAAM,IAAI,MAAM,gCAAgC,OAAO,UAAU,CAAC,EAAE;AAAA,MACtE;AAAA,IACF;AAAA,EACF;AAAA,EAEA,oBAAoB,iBAAqC;AACvD,UAAM,KAAK,KAAK,IAAI,IAAI,aAAa,OAAO,KAAK,iBAAiB,KAAK,CAAC;AACxE,WAAO,UAAU,EAAE;AAAA,EACrB;AAAA;AAAA,EAGA,aAAa,IAAwB;AACnC,WAAO,KAAK,IAAI,IAAI,UAAU,QAAQ,EAAE,CAAC;AAAA,EAC3C;AAAA,EAEA,2BAA2B,QAMZ;AACb,UAAM,KAAK,KAAK,IAAI,IAAI,oBAAoB;AAAA,MAC1C,WAAW,OAAO;AAAA,MAClB,UAAU,OAAO;AAAA,MACjB,UAAU;AAAA;AAAA,MACV,UAAU,OAAO;AAAA,MACjB,QAAQ,OAAO;AAAA,IACjB,CAAC;AACD,WAAO,UAAU,EAAE;AAAA,EACrB;AAAA,EAEA,kBAAkB,IAA4C;AAC5D,UAAM,YAAY,KAAK,IAAI,IAAI,eAAe,QAAQ,EAAE,CAAC;AACzD,WAAO;AAAA,MACL,WAAW,UAAU;AAAA,MACrB,WAAW,UAAU;AAAA,MACrB,WAAW,UAAU;AAAA,IACvB;AAAA,EACF;AAAA;AAAA,EAIA,oBAAoB,OAAgD;AAClE,UAAM,KAAK,KAAK,IAAI,IAAI,oBAAoB;AAAA,MAC1C,WAAW,MAAM;AAAA,MACjB,UAAU,MAAM;AAAA,MAChB,UAAU,MAAM,aAAa,gBAAgB,IAAI;AAAA,MACjD,MAAM,MAAM;AAAA,MACZ,KAAK,MAAM;AAAA,MACX,SAAS,MAAM;AAAA,MACf,QAAQ,MAAM;AAAA,IAChB,CAAC;AACD,WAAO,UAAU,EAAE;AAAA,EACrB;AAAA,EAEA,kBAAkB,IAA4C;AAC5D,UAAM,YAAY,KAAK,IAAI,IAAI,eAAe,QAAQ,EAAE,CAAC;AACzD,WAAO;AAAA,MACL,WAAW,UAAU;AAAA,MACrB,WAAW,sBAAsB,UAAU,WAAW,IAAI,KAAK;AAAA,IACjE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,qBAAqB,OAAiD;AACpE,UAAM,UAAU,IAAI,gBAAgB;AAAA,MAClC,WAAW,OAAO,SAAK,YAAAC,OAAU,MAAM,SAAS,CAAe;AAAA,MAC/D,UAAU,OAAO,KAAK,eAAe,MAAM,QAAQ,GAAG,KAAK;AAAA,MAC3D,UAAU,MAAM;AAAA,MAChB,gBAAgB,gBAAgB,UAAU,MAAM,MAAM,MAAM,GAAG;AAAA,MAC/D,QAAQ,MAAM;AAAA,IAChB,CAAC;AACD,WAAO,UAAU,QAAQ,KAAK,CAAC;AAAA,EACjC;AAAA,EAEA,mBAAmB,IAA6C;AAC9D,QAAI,GAAG,WAAW,kBAAkB;AAClC,YAAM,IAAI,MAAM,qCAAqC,GAAG,MAAM,EAAE;AAAA,IAClE;AACA,UAAM,YAAY,cAAc,SAAS,OAAO,KAAK,GAAG,QAAQ,KAAK,CAAC;AACtE,UAAM,YAAY,UAAU,aAAa;AACzC,WAAO;AAAA,MACL,WAAW,gBAAY,YAAAC,WAAc,SAAS,IAAI;AAAA,MAClD,WAAW,sBAAsB,UAAU,aAAa,EAAE,SAAS,KAAK,GAAG,IAAI,MAAM;AAAA,IACvF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,0BAA0B,MAAc,oBAAoC;AAC1E,UAAM,kBAAc,mDAAwB,MAAM,eAAe,kBAAkB,CAAC;AACpF,UAAM,eAAe,OAAO,OAAO;AAAA,MACjC,OAAO,KAAK,CAAC,mBAAmB,CAAC;AAAA,MACjC,OAAO,KAAK,eAAe,WAAW,GAAG,KAAK;AAAA,IAChD,CAAC;AACD,WAAO,iBAAAC,QAAU,OAAO,YAAY;AAAA,EACtC;AAAA;AAAA,EAGA,cAAc,MAKZ;AAIA,UAAM,MAAM,OAAO,KAAK,iBAAAA,QAAU,OAAO,IAAI,CAAC;AAC9C,QAAI,IAAI,WAAW,IAAI;AACrB,YAAM,IAAI,MAAM,6DAA6D,IAAI,MAAM,GAAG;AAAA,IAC5F;AACA,WAAO;AAAA,MACL,WAAW,IAAI,SAAS,IAAI,EAAE,EAAE,SAAS,KAAK;AAAA,MAC9C,WAAW,IAAI,SAAS,IAAI,EAAE,EAAE,SAAS,KAAK;AAAA,MAC9C,OAAO,IAAI,UAAU,CAAC;AAAA,MACtB,mBAAmB,IAAI,aAAa,CAAC;AAAA,IACvC;AAAA,EACF;AACF;;;AGlXA,kBAAiB;AACjB,IAAAC,eAA6B;AAC7B,IAAAC,2BAiCO;;;AChCA,SAAS,cAAc,MAAsB;AAClD,QAAM,UAAU,KAAK,KAAK;AAC1B,SAAO,QAAQ,KAAK,OAAO,IAAI,KAAK,QAAQ,MAAM,CAAC,CAAC,KAAK,KAAK,OAAO;AACvE;AAMO,SAAS,iBAAiB,MAG/B;AACA,QAAM,aAAa,cAAc,IAAI;AACrC,QAAM,WAAW,WAAW,MAAM,CAAC,EAAE,MAAM,GAAG;AAC9C,MAAI,SAAS,UAAU,GAAG;AACxB,WAAO,EAAE,aAAa,YAAY,oBAAoB,GAAG;AAAA,EAC3D;AACA,QAAM,kBAAkB,SAAS,MAAM,GAAG,SAAS,SAAS,CAAC;AAC7D,QAAM,mBAAmB,SAAS,MAAM,SAAS,SAAS,CAAC;AAC3D,SAAO;AAAA,IACL,aAAa,KAAK,gBAAgB,KAAK,GAAG,CAAC;AAAA,IAC3C,oBAAoB,iBAAiB,KAAK,GAAG;AAAA,EAC/C;AACF;AAGO,SAAS,sBAAsB,MAAyC;AAC7E,QAAM,QAAQ,cAAc,IAAI,EAAE,MAAM,YAAY;AACpD,MAAI,CAAC,MAAO,QAAO;AACnB,UAAQ,OAAO,MAAM,CAAC,CAAC,GAAG;AAAA,IACxB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAMO,SAAS,iCAAiC,aAA8B;AAC7E,QAAM,WAAW,cAAc,WAAW,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG;AAC9D,MAAI,SAAS,WAAW,EAAG,QAAO;AAClC,QAAM,CAAC,SAAS,MAAM,OAAO,IAAI;AACjC,SAAO,CAAC,OAAO,OAAO,OAAO,KAAK,EAAE,SAAS,OAAO,KAAK,SAAS,QAAQ,YAAY;AACxF;AAEO,IAAM,yCACX;;;ACtDK,IAAM,oCAAoC;AAG1C,IAAM,2BAA2B;AAEjC,SAAS,gBAAgB,mBAAmC;AACjE,SAAO,GAAG,iCAAiC,GAAG,iBAAiB;AACjE;AAMO,SAAS,WAAW,UAA2B,MAAsB;AAC1E,SAAO,GAAG,QAAQ,IAAI,cAAc,IAAI,CAAC;AAC3C;AAuBO,SAAS,mBAAmB,mBAAiD;AAClF,SAAO;AAAA,IACL;AAAA,IACA,WAAW,gBAAgB,iBAAiB;AAAA,IAC5C,YAAY,KAAK,IAAI;AAAA,EACvB;AACF;AAEA,IAAM,eAAmC,EAAE,0BAA0B,KAAK;AAEnE,SAAS,aAAa,QAA0C;AAGrE,MAAI,oBAAyC,CAAC,IAAI;AAClD,MAAI,OAAO,cAAc;AACvB,wBAAoB,OAAO,WAAW,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK;AAAA,EAC9D;AACA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,OAAO,OAAO,SAAS;AAAA,IACvB,WAAW,OAAO;AAAA,IAClB,iBAAiB,OAAO,iBAAiB;AAAA,IACzC,UAAU,OAAO;AAAA,IACjB,WAAW,OAAO;AAAA,IAClB,gBAAgB,OAAO,eAAe,QAAQ;AAAA,IAC9C,cAAc;AAAA,IACd,KAAK;AAAA,MACH;AAAA,MACA,mBAAmB,OAAO;AAAA,MAC1B,kBAAkB,OAAO;AAAA,IAC3B;AAAA,EACF;AACF;AAGO,SAAS,wBAAoC;AAClD,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,iBAAiB;AAAA,IACjB,UAAU;AAAA,IACV,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,cAAc;AAAA,EAChB;AACF;;;ACpFA,IAAAC,2BAAmE;AAK5D,IAAM,gCAAgC;AAEtC,SAAS,iBAAiB,WAAoB,UAA2B;AAC9E,aAAO,gDAAsB,SAAS,IAClC,YACA,YAAY,aAAa;AAC/B;AAGO,SAAS,0BAA0B,YAAwC;AAChF,QAAM,QAAQ,WAAW,WAAW,iCAAiC,IACjE,WAAW,MAAM,kCAAkC,MAAM,IACzD;AACJ,aAAO,sDAA4B,KAAK;AAC1C;AAMO,SAAS,wBAAwB,aAAkD;AACxF,QAAM,OAAO,oBAAI,IAAY;AAC7B,aAAW,cAAc,aAAa;AACpC,QAAI,YAAY;AACd,WAAK,IAAI,UAAU;AACnB,YAAM,oBAAoB,0BAA0B,UAAU;AAC9D,UAAI,kBAAmB,MAAK,IAAI,iBAAiB;AAAA,IACnD;AAAA,EACF;AACA,SAAO;AACT;;;AH2FA,IAAM,uCAAuC;AAC7C,IAAM,0CAA0C;AAEhD,SAAS,+BACP,oBACA,aACA;AACA,aAAO,yBAAAC,gCAAsC,oBAAoB,aAAa,UAAU;AAC1F;AAEA,SAAS,UAAU,OAAe,MAAiC;AACjE,SAAO,EAAE,MAAM,OAAO,UAAU,QAAQ,YAAY,YAAY;AAClE;AAEA,SAAS,kCAAiD;AACxD,SAAO,IAAI,QAAQ,aAAW;AAC5B,eAAW,SAAS,uCAAuC;AAAA,EAC7D,CAAC;AACH;AAGA,SAAS,sBAAyB,QAAkC;AAClE,QAAM,SAAS,OAAO;AACtB,QAAM,OACJ,OAAO,QAAQ,SAAS,WACnB,OAAO,OACR,2CAAkB;AACxB,QAAM,UAAU,OAAO,QAAQ,YAAY,WAAW,OAAO,UAAU;AACvE,aAAO,kCAAQ,MAAM,WAAW,mCAAmC;AACrE;AAEA,IAAM,2BAA4D;AAAA,EAChE,IAAI;AAAA,EACJ,GAAG;AAAA,EACH,KAAK;AAAA,EACL,KAAK;AACP;AAMA,SAAS,sBAAsB,MAA2C;AACxE,QAAM,QAAQ,cAAc,IAAI,EAAE,MAAM,kBAAkB;AAC1D,SAAO,QAAQ,yBAAyB,OAAO,MAAM,CAAC,CAAC,CAAC,IAAI;AAC9D;AAcO,IAAM,kBAAN,MAAM,iBAA2C;AAAA,EAqFtD,YAAY,SAAgF;AApF5F,SAAS,SAAS;AAIlB;AAAA;AAAA,SAAS,mBAAmB;AAI5B,SAAiB,UAAU,IAAI,2CAAoC;AAEnE,SAAiB,mBAAmB,oBAAI,IAA4B;AAEpE,SAAiB,cAAc,IAAI,2CAAkB;AAAA,MACnD,QAAQ;AAAA,MACR,SAAS,CAAC,WAAW,WAAW;AAC9B,cAAM,QAAQ,KAAK,iBAAiB,IAAI,UAAU,SAAS;AAC3D,YAAI,OAAO,gBAAgB,UAAU,aAAa;AAChD,eAAK,iBAAiB,OAAO,UAAU,SAAS;AAAA,QAClD;AACA,aAAK,QAAQ,KAAK,6BAAI,iBAAiB;AAAA,UACrC,MAAM,6BAAI;AAAA,UACV,SAAS,EAAE,aAAa,UAAU,aAAa,OAAO;AAAA,QACxD,CAAC;AACD,YAAI,WAAW,WAAW;AACxB,eAAK,4BAA4B,SAAS,EAAE,MAAM,MAAM,MAAS;AAAA,QACnE;AAAA,MACF;AAAA,IACF,CAAC;AAED,SAAiB,cAAc,IAAI,2CAAkB;AAIrD,SAAiB,WAAW,oBAAI,IAAkC;AAElE,SAAiB,uBAAuB,oBAAI,IAA0B;AAatE;AAAA,SAAQ,kBAAiC,QAAQ,QAAQ;AAEzD,SAAiB,0BAA0B,oBAAI,IAAoB;AAEnE,SAAiB,kBAAkB,oBAAI,IAAgB;AAEvD,SAAQ,wBAAwB;AAEhC,SAAQ,mBAAkC,QAAQ,QAAQ;AAE1D,SAAQ,uBAAuB;AAK/B,SAAiB,uBAAuB,CAAC,EAAE,UAAU,MAAmC;AACtF,YAAM,SAAS,MAAM,KAAK,KAAK,SAAS,OAAO,CAAC,EAAE,KAAK,UAAQ,KAAK,iBAAiB,SAAS;AAC9F,UAAI,CAAC,OAAQ;AAGb,WAAK,YAAY,mBAAmB,WAAW,YAAY;AAE3D,aAAO,eAAe;AACtB,YAAM,OAAO,aAAa,MAAM;AAChC,UAAI,OAAO,UAAU;AACnB,aAAK,QAAQ,KAAK,gCAAO,SAAS,EAAE,MAAM,gCAAO,SAAS,SAAS,KAAK,CAAC;AAAA,MAC3E,OAAO;AACL,aAAK,SAAS,OAAO,OAAO,iBAAiB;AAC7C,aAAK,QAAQ,KAAK,gCAAO,YAAY,EAAE,MAAM,gCAAO,YAAY,SAAS,KAAK,CAAC;AAAA,MACjF;AAAA,IACF;AAEA,SAAiB,oBAAoB,CAAC,UAA+C;AACnF,WAAK,QAAQ,KAAK,YAAY,KAAK;AAAA,IACrC;AAkbA;AAAA;AAAA;AAAA,gCAAuB,OACrB,WACA,UACA,WACmD;AACnD,YAAM,kBAAkB,+BAA+B,WAAW,OAAO,WAAW;AACpF,UAAI,CAAC,gBAAgB,QAAS,QAAO;AACrC,YAAM,qBAAqB,gBAAgB,QAAQ,YAAY;AAC/D,YAAM,EAAE,YAAY,IAAI,gBAAgB;AACxC,UAAI;AACJ,UAAI;AACF,cAAM,aAAa,MAAM,KAAK,4BAA4B,oBAAoB,UAAU;AAAA,UACtF,GAAG;AAAA,UACH;AAAA,QACF,CAAC;AACD,cAAM,EAAE,KAAK,IAAI;AAGjB,cAAM,eAAe,YAAY,WAAW,qBAAqB;AAGjE,cAAM,QAAQ,KAAK,UAAU;AAAA,UAC3B,iBAAiB,oBAAoB,YAAY;AAAA,QACnD;AACA,sBAAc;AACd,cAAM,mBAAmB,oBAAI,IAAY;AACzC,eAAO,UAAM,kDAAwB;AAAA,UACnC,WAAW;AAAA,UACX,UAAU;AAAA,UACV;AAAA,UACA,UAAU,OAAO,EAAE,QAAQ,MAAM,MAAM,MAAM;AAC3C,gBAAI,MAAM,OAAO,SAAS;AACxB,+BAAiB,IAAI,KAAK;AAC1B,qBAAO,sBAAsB,MAAM,MAAM;AAAA,YAC3C;AACA,kBAAM,aAAa;AAAA,cACjB,MAAM,KAAK;AAAA,cACX,cAAc,KAAK;AAAA,cACnB;AAAA,YACF;AACA,oBAAQ,QAAQ;AAAA,cACd,KAAK;AACH,uBAAO,KAAK,cAAc,oBAAoB,cAAc,YAAY,IAAI;AAAA,cAC9E,KAAK;AACH,uBAAO,KAAK,cAAc,oBAAoB,cAAc,YAAY,IAAI;AAAA,cAC9E,KAAK;AACH,uBAAO,KAAK,gBAAgB,oBAAoB,cAAc,YAAY,IAAI;AAAA,cAChF,KAAK;AACH,uBAAO,KAAK,cAAc,oBAAoB,cAAc,YAAY,IAAI;AAAA,cAC9E,KAAK;AACH,uBAAO,KAAK,eAAe,oBAAoB,cAAc,YAAY,IAAI;AAAA,cAC/E;AACE,2BAAO;AAAA,kBACL,2CAAkB;AAAA,kBAClB,uBAAuB,OAAO,MAAM,CAAC;AAAA,gBACvC;AAAA,YACJ;AAAA,UACF;AAAA,UACA,gBAAgB,aAAW;AACzB,kBAAM,EAAE,OAAO,IAAI,KAAK,eAAe,oBAAoB,YAAY;AACvE,mBAAO,QAAQ,QAAQ;AAAA,cACrB,GAAG,QAAQ;AAAA,cACX,SAAS;AAAA,cACT,SAAS;AAAA,gBACP,GAAG,QAAQ;AAAA,gBACX,iBAAiB,SAAS,OAAO,SAAS,OAAO,mBAAmB,EAAE,IAAI;AAAA,gBAC1E,gBAAgB,SACZ;AAAA,kBACE,QAAQ;AAAA,kBACR,MAAM;AAAA,kBACN,OAAO,OAAO;AAAA,gBAChB,IACA;AAAA,cACN;AAAA,YACF,CAAC;AAAA,UACH;AAAA;AAAA;AAAA,UAGA,mBAAmB,CAAC,UAAU,EAAE,MAAM,MAAM;AAC1C,kBAAM,EAAE,KAAK,IAAI,SAAS,WAAW,CAAC;AACtC,mBAAO,iBAAiB,IAAI,KAAK,SAAK,wCAAc,IAAI,SAAK,2CAAiB,IAAI;AAAA,UACpF;AAAA,QACF,CAAC;AAAA,MACH,SAAS,KAAK;AACZ,eAAO,KAAK,gBAA6C,GAAG;AAAA,MAC9D,UAAE;AACA,qBAAa,QAAQ;AAAA,MACvB;AAAA,IACF;AAvgBE,SAAK,UAAU,SAAS,UAAU;AAClC,SAAK,eAAe,SAAS;AAC7B,SAAK,WAAW,IAAI,iBAAiB,KAAK,OAAO;AACjD,SAAK,YAAY,IAAI,wCAAe;AACpC,SAAK,gBAAgB,SAAS;AAC9B,SAAK,eAAe,GAAG,qBAAqB,KAAK,oBAAoB;AAErE,SAAK,eAAe,GAAG,YAAY,KAAK,iBAAiB;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,kBAAwC;AAC1C,QAAI,KAAK,SAAS,SAAS,EAAG,QAAO;AACrC,UAAM,gBAAgB,MAAM,KAAK,KAAK,SAAS,OAAO,CAAC,EAAE,KAAK,OAAK,EAAE,YAAY;AACjF,WAAO,gBAAgB,QAAQ;AAAA,EACjC;AAAA,EAEA,yBAA0C;AACxC,WAAO,KAAK,gBAAgB,CAAC,MAAM,KAAK,IAAI,CAAC,IAAI;AAAA,EACnD;AAAA;AAAA,EAGA,gBAAgB,MAAoC;AAClD,SAAK,mBAAmB,SAAS,QAAQ,SAAS,QAAQ,OAAO;AACjE,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAAA,EAEA,KAAK,SAAkC;AACrC,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAAA,EAEA,MAAM,UAAyB;AAC7B,SAAK,YAAY,OAAO,eAAe;AACvC,SAAK,YAAY,OAAO;AACxB,SAAK,UAAU,MAAM;AACrB,SAAK,qBAAqB,MAAM;AAChC,UAAM,KAAK;AACX,UAAM,KAAK,kBAAkB;AAC7B,SAAK,eAAe,IAAI,qBAAqB,KAAK,oBAAoB;AACtE,SAAK,eAAe,IAAI,YAAY,KAAK,iBAAiB;AAC1D,SAAK,eAAe,MAAM;AAC1B,SAAK,SAAS,MAAM;AACpB,SAAK,QAAQ,mBAAmB;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,cAAc,SAAuD;AACzE,UAAM,mBAAmB,uBAAO,wBAAwB;AACxD,SAAK,0BAA0B;AAC/B,SAAK,qBAAqB,MAAM;AAChC,QAAI,SAAS,cAAc;AACzB,YAAM,KAAK,kBAAkB;AAAA,IAC/B,OAAO;AACL,YAAM,KAAK;AAAA,IACb;AACA,UAAM,QAAQ,MAAM,KAAK,KAAK,SAAS,OAAO,CAAC,EAAE,IAAI,YAAY;AAIjE,QAAI,SAAS,kBAAkB,MAAM;AACnC,YAAM,qBAAiB,uDAA6B,UAAU;AAC9D,WAAK,qBAAqB,IAAI,gBAAgB,IAAI;AAClD,aAAO;AAAA,QACL;AAAA,UACE,GAAG,sBAAsB;AAAA,UACzB,OAAO;AAAA,UACP,WAAW;AAAA,UACX,cAAc,EAAE,0BAA0B,MAAM;AAAA,QAClD;AAAA,MACF;AAAA,IACF;AAEA,QAAI,SAAS,kBAAkB,MAAO,QAAO,CAAC;AAC9C,QAAI,CAAC,KAAK,cAAe,QAAO,SAAS,kBAAkB,QAAQ,CAAC,IAAI;AAExE,QAAI;AACJ,QAAI;AACF,mBAAa,MAAM,KAAK,cAAc,cAAc;AAAA,IACtD,SAAS,OAAO;AAEd,UAAI,SAAS,kBAAkB,MAAO,OAAM;AAC5C,aAAO;AAAA,IACT;AACA,QAAI,KAAK,4BAA4B,iBAAkB,QAAO,CAAC;AAC/D,UAAM,eAA6B,WAAW,IAAI,QAAM;AAAA,MACtD,QAAQ;AAAA;AAAA;AAAA,MAGR,OAAO,EAAE,SAAS;AAAA,MAClB,WAAW,EAAE;AAAA;AAAA,MAEb,iBAAiB;AAAA,MACjB,UAAU,EAAE;AAAA,MACZ,WAAW,EAAE;AAAA,MACb,gBAAgB;AAAA,MAChB,OAAO,EAAE;AAAA,MACT,cAAc,EAAE;AAAA,MAChB,cAAc,EAAE,gBAAgB,EAAE,0BAA0B,MAAM;AAAA,MAClE,KAAK,EAAE;AAAA,IACT,EAAE;AACF,eAAW,eAAe,cAAc;AACtC,WAAK,qBAAqB,IAAI,YAAY,WAAW,KAAK;AAAA,IAC5D;AACA,WAAO,SAAS,kBAAkB,QAAQ,eAAe,CAAC,GAAG,OAAO,GAAG,YAAY;AAAA,EACrF;AAAA,EAEA,MAAc,oBAAmC;AAC/C,UAAM,KAAK,gBAAgB,YAAY;AACrC,YAAM,KAAK;AACX,WAAK,YAAY,OAAO,eAAe;AACvC,UAAI,CAAC,KAAK,cAAe;AAEzB,YAAM,aAAa,IAAI;AAAA,QACrB,MAAM,KAAK,KAAK,SAAS,OAAO,CAAC,EAC9B,IAAI,YAAU,OAAO,YAAY,EACjC,OAAO,CAAC,cAAmC,QAAQ,SAAS,CAAC;AAAA,MAClE;AACA,iBAAW,aAAa,YAAY;AAClC,cAAM,KAAK,kBAAkB,SAAS;AAAA,MACxC;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAc,kBAAkB,WAAkC;AAChE,QAAI,KAAK,eAAe;AACtB,UAAI;AACF,cAAM,KAAK,cAAc,WAAW,SAAS;AAAA,MAC/C,QAAQ;AAAA,MAER;AAAA,IACF;AACA,SAAK,qBAAqB,EAAE,WAAW,UAAU,CAAC;AAAA,EACpD;AAAA,EAEA,MAAM,oBAAoB,SAA+D;AACvF,UAAM,UAAU,MAAM,KAAK,cAAc,OAAO;AAChD,WAAO,QAAQ,IAAI,aAAW;AAAA,MAC5B,gBAAgB,OAAO;AAAA;AAAA,MAEvB,yBAAyB;AAAA,MACzB,QAAQ,OAAO;AAAA,MACf,gBAAgB,OAAO;AAAA,MACvB,MAAM,OAAO,mBAAmB,OAAO,gBAAgB;AAAA,MACvD,OAAO,OAAO;AAAA,MACd,OAAO,OAAO;AAAA,MACd,WAAW,OAAO;AAAA,MAClB,cAAc,OAAO;AAAA,IACvB,EAAE;AAAA,EACJ;AAAA,EAEA,MAAM,sBAAsB,SAA6D;AACvF,UAAM,UAAU,MAAM,KAAK,oBAAoB,OAAO;AACtD,WAAO,QAAQ,IAAI,CAAC,EAAE,gBAAgB,GAAG,OAAO,OAAO;AAAA,MACrD,GAAG;AAAA,MACH,UAAU;AAAA,IACZ,EAAE;AAAA,EACJ;AAAA,EAEA,MAAM,cAAc,gBAAmD;AACrE,UAAM,QAAQ,KAAK,UAAU,kBAAkB,cAAc;AAC7D,QAAI;AACF,UAAI;AACJ,UAAI;AACJ,YAAM,2BAA2B,KAAK,qBAAqB,IAAI,cAAc;AAC7E,UAAI,6BAA6B,MAAM;AACrC,iCAAyB;AAGzB,cAAM,iBAAiB,MACrB,KAAK,UAAU;AAAA,UACb;AAAA,UACA,MAAM,OAAO;AAAA,QACf;AACF,cAAM,OAAO,iBAAiB,SAAS,gBAAgB,EAAE,MAAM,KAAK,CAAC;AACrE,YAAI;AACF,sBAAY,MAAM,KAAK,aAAa;AAAA,QACtC,UAAE;AACA,gBAAM,OAAO,oBAAoB,SAAS,cAAc;AAAA,QAC1D;AAAA,MACF,WAAW,6BAA6B,OAAO;AAC7C,iCAAyB;AACzB,YAAI,CAAC,KAAK,eAAe;AACvB,qBAAO;AAAA,YACL,2CAAkB;AAAA,YAClB;AAAA,UACF;AAAA,QACF;AACA,oBAAY,MAAM,KAAK,YAAY,CAAC,GAAG,gBAAgB,MAAM,MAAM;AAAA,MACrE,eAAW,qDAA2B,cAAc,GAAG;AACrD,mBAAO;AAAA,UACL,2CAAkB;AAAA,UAClB;AAAA,UACA;AAAA,UACA;AAAA,UACA,EAAE,OAAO,gBAAgB;AAAA,QAC3B;AAAA,MACF,OAAO;AACL,cAAM,SAAS,KAAK,eAAe,cAAc;AACjD,YAAI,OAAO,QAAQ;AACjB,mCAAyB,OAAO,OAAO,eAAe,QAAQ;AAC9D,0BAAY,kCAAQ,aAAa,OAAO,MAAM,CAAC;AAAA,QACjD,WAAW,CAAC,KAAK,eAAe;AAC9B,qBAAO;AAAA,YACL,2CAAkB;AAAA,YAClB,0CAA0C,cAAc;AAAA,UAC1D;AAAA,QACF,OAAO;AACL,mCAAyB;AACzB,sBAAY,MAAM,KAAK,YAAY,QAAQ,QAAW,MAAM,MAAM;AAAA,QACpE;AAAA,MACF;AACA,uBAAgB,gBAAgB,MAAM,MAAM;AAC5C,UAAI,CAAC,UAAU,QAAS,QAAO;AAE/B,YAAM,SAAS,KAAK,SAAS,IAAI,UAAU,QAAQ,QAAQ;AAC3D,WAAK,YAAY,mBAAmB,UAAU,QAAQ,WAAW,UAAU;AAC3E,YAAM,YAAY,KAAK,YAAY,OAAO;AAAA,QACxC;AAAA,QACA,WAAW,UAAU,QAAQ;AAAA,QAC7B,QAAQ,UAAU;AAAA,QAClB,gBAAgB;AAAA,QAChB,gBACE,2BAA2B,SAAS,QAAQ,eAAe,CAAC,OAAO,YAAY,IAAI,CAAC;AAAA,MACxF,CAAC;AACD,WAAK,iBAAiB,IAAI,UAAU,QAAQ,WAAW;AAAA,QACrD,aAAa,UAAU;AAAA,QACvB,gBAAgB;AAAA,MAClB,CAAC;AACD,iBAAO,kCAAQ,UAAU,WAAW;AAAA,IACtC,SAAS,KAAK;AACZ,aAAO,KAAK,gBAAwB,GAAG;AAAA,IACzC,UAAE;AACA,YAAM,QAAQ;AAAA,IAChB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,iBAAiB,aAAoC;AACzD,UAAM,YAAY,KAAK,YAAY,KAAK,WAAW;AACnD,QAAI,CAAC,WAAW;AACd,WAAK,YAAY,QAAQ,WAAW;AACpC;AAAA,IACF;AACA,UAAM,iBAAiB,KAAK,YAAY,IAAI,aAAa,UAAU;AACnE,QAAI,CAAC,eAAgB;AACrB,UAAM,KAAK,4BAA4B,cAAc;AAAA,EACvD;AAAA,EAEA,MAAc,4BACZ,WACe;AACf,UAAM,EAAE,UAAU,IAAI;AACtB,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,eAAe,SAAS,EAAE;AAAA,IAC1C,QAAQ;AACN;AAAA,IACF;AACA,QAAI,CAAC,QAAQ,gBAAgB,CAAC,UAAU,eAAe,SAAS,OAAO,YAAY,GAAG;AACpF;AAAA,IACF;AAEA,UAAM,EAAE,aAAa,IAAI;AACzB,UAAM,KAAK,gBAAgB,MAAM,KAAK,kBAAkB,YAAY,CAAC;AAAA,EACvE;AAAA,EAEA,cAAc,wBAAgC,UAAiD;AAC7F,QAAI;AACF,YAAM,gBAAY,gDAAsB,sBAAsB,IAC1D,KAAK,YAAY,QAAQ,sBAAsB,EAAE,YACjD;AACJ,YAAM,EAAE,OAAO,IAAI,KAAK,eAAe,WAAW,QAAQ;AAC1D,UAAI,CAAC,QAAQ;AACX,eAAO,QAAQ;AAAA,cACb;AAAA,YACE,2CAAkB;AAAA,YAClB,4BAA4B,aAAa,QAAQ;AAAA,UACnD;AAAA,QACF;AAAA,MACF;AACA,aAAO,QAAQ,YAAQ,kCAAQ,aAAa,MAAM,CAAC,CAAC;AAAA,IACtD,SAAS,KAAK;AACZ,aAAO,QAAQ,QAAQ,KAAK,gBAA4B,GAAG,CAAC;AAAA,IAC9D;AAAA,EACF;AAAA,EAEA,OAAO,WAA0B;AAG/B,QAAI;AACJ,YAAI,gDAAsB,SAAS,GAAG;AACpC,UAAI;AACF,kCAA0B,KAAK,YAAY,QAAQ,SAAS,EAAE;AAAA,MAChE,QAAQ;AAEN;AAAA,MACF;AAAA,IACF;AACA,UAAM,aAAS,yCAAe;AAAA,MAC5B,MAAM,2CAAkB;AAAA,MACxB,SAAS;AAAA,IACX,CAAC;AACD,QAAI,WAAW;AAGb,YAAM,YAAY,wBAAwB;AAAA,QACxC;AAAA,QACA,KAAK,iBAAiB,IAAI,SAAS,GAAG;AAAA,QACtC;AAAA,MACF,CAAC;AACD,iBAAW,OAAO,WAAW;AAC3B,aAAK,UAAU,uBAAuB,KAAK,MAAM;AAAA,MACnD;AAGA,YAAM,wBAAoB,gDAAsB,SAAS,IACrD,YACA,KAAK,6BAA6B,SAAS,GAAG;AAClD,UAAI,mBAAmB;AACrB,aAAK,YAAY,OAAO,QAAW,QAAW,iBAAiB;AAAA,MACjE;AAAA,IACF,OAAO;AAEL,WAAK,UAAU,uBAAuB,QAAW,MAAM;AACvD,WAAK,YAAY,OAAO;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,oBACE,WACA,UACA,OAC2B;AAC3B,QAAI;AACF,YAAM,SAAS,KAAK,eAAe,WAAW,QAAQ;AACtD,YAAM,oBAAoB,OAAO;AACjC,UAAI,CAAC,mBAAmB;AACtB,eAAO,QAAQ;AAAA,cACb,kCAAQ,2CAAkB,gBAAgB,kCAAkC;AAAA,QAC9E;AAAA,MACF;AACA,aAAO,QAAQ;AAAA,YACb,sCAAQ,kDAAwB,YAAY,KAAK,IAAI,iBAAiB,EAAE,CAAC;AAAA,MAC3E;AAAA,IACF,SAAS,KAAK;AACZ,aAAO,QAAQ,QAAQ,KAAK,gBAAwB,GAAG,CAAC;AAAA,IAC1D;AAAA,EACF;AAAA,EAEA,WAAW,UAAiC;AAC1C,QAAI,SAAS,SAAS,qCAAY,QAAQ;AACxC,WAAK,OAAO;AACZ;AAAA,IACF;AACA,SAAK,YAAY,QAAQ,SAAS,MAAM,SAAS,OAAO;AAAA,EAC1D;AAAA,EASA,GAAG,OAAe,UAAgD;AAChE,SAAK,QAAQ,GAAG,OAAO,QAAQ;AAAA,EACjC;AAAA,EASA,IAAI,OAAe,UAAgD;AACjE,SAAK,QAAQ,IAAI,OAAO,QAAQ;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,aAAa,UAA+B,CAAC,GAAkC;AACnF,QAAI;AACF,aAAO,MAAM,KAAK,UAAU,QAAQ,+BAA+B,OAAM,WAAU;AACjF,cAAM,gBAAgB,sBAAsB;AAC5C,YAAI;AAEJ,YAAI,QAAQ,SAAS,QAAQ;AAC3B,uBAAa,MAAM,KAAK,+BAA+B,eAAe,MAAM;AAAA,QAC9E,OAAO;AACL,gBAAM,YAAY,KAAK,SAAS,0BAA0B;AAAA,YACxD,SAAS,CAAC,UAAU,OAAO,wBAAwB,CAAC;AAAA,YACpD,QAAQ,KAAK;AAAA,UACf,CAAC;AACD,uBAAa,MAAM,KAAK;AAAA,YACtB;AAAA,YACA,EAAE,GAAG,WAAW,UAAU,MAAM;AAAA,YAChC;AAAA,UACF;AAAA,QACF;AACA,yBAAgB,gBAAgB,MAAM;AAEtC,cAAM,SAAS,KAAK,SAAS,qBAAqB,UAAU;AAC5D,cAAM,SAAS,KAAK,oBAAoB,MAAM;AAC9C,mBAAO,kCAAQ,aAAa,MAAM,CAAC;AAAA,MACrC,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,aAAO,KAAK,gBAA4B,GAAG;AAAA,IAC7C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAoGA,MAAM,cACJ,cACA,aACA,QACA,MAC+B;AAC/B,UAAM,kBAAkB,+BAA+B,cAAc,QAAQ,WAAW;AACxF,QAAI,CAAC,gBAAgB,QAAS,QAAO;AACrC,UAAM,YAAY,gBAAgB,QAAQ;AAC1C,UAAM,WAAW,eAAe;AAChC,QAAI,CAAC,OAAQ,YAAO,kCAAQ,2CAAkB,eAAe,+BAA+B;AAC5F,QAAI,CAAC,OAAO;AACV,iBAAO,kCAAQ,2CAAkB,eAAe,oCAAoC;AAEtF,UAAM,EAAE,aAAa,mBAAmB,IAAI,iBAAiB,OAAO,IAAI;AACxE,QAAI,CAAC,oBAAoB;AACvB,iBAAO;AAAA,QACL,2CAAkB;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAEA,WAAO,KAAK,QAAQ,WAAW,UAAU,OAAM,WAAU;AACvD,YAAM,OAAO,MAAM,KAAK;AAAA,QACtB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,YAAM,UAAU,KAAK,SAAS,yBAAyB,MAAM,kBAAkB;AAC/E,iBAAO,kCAAoB,EAAE,SAAS,MAAM,cAAc,OAAO,IAAI,EAAE,CAAC;AAAA,IAC1E,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,mBACJ,cACA,aACA,QACgC;AAChC,UAAM,kBAAkB,+BAA+B,cAAc,QAAQ,WAAW;AACxF,QAAI,CAAC,gBAAgB,QAAS,QAAO;AACrC,UAAM,YAAY,gBAAgB,QAAQ;AAC1C,UAAM,WAAW,eAAe;AAChC,QAAI,CAAC;AACH,iBAAO,kCAAQ,2CAAkB,eAAe,oCAAoC;AACtF,QAAI,CAAC,OAAO,MAAM;AAChB,iBAAO,kCAAQ,2CAAkB,eAAe,yCAAyC;AAAA,IAC3F;AACA,QACE,EAAE,kBAAkB,WACpB,OAAO,OAAO,iBAAiB,YAC/B,CAAC,OAAO,cACR;AACA,iBAAO;AAAA,QACL,2CAAkB;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AACA,UAAM,eAAW,mCAAS,OAAO,YAAY;AAC7C,UAAM,OAAO,cAAc,OAAO,IAAI;AAEtC,UAAM,WAAW,SAAS,SAAS,MAAM,GAAG,CAAC,GAAG,EAAE,IAAI,MAAO,qBAAqB;AAElF,WAAO,KAAK,gBAAgB;AAAA,MAC1B;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP,eAAe;AAAA,MACf,cAAc,CAAC,WAAW,QACxB,KAAK,SAAS,oBAAoB;AAAA,QAChC;AAAA,QACA,eAAe;AAAA,QACf;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS,OAAO;AAAA,QAChB,QAAQ,KAAK;AAAA,MACf,CAAC;AAAA,MACH,eAAe,QAAM,KAAK,SAAS,kBAAkB,EAAE;AAAA,MACvD,WAAW,CAAC,SAAsB;AAAA,QAChC,OAAG,mCAAS,IAAI,CAAC;AAAA,QACjB,OAAG,mCAAS,IAAI,CAAC;AAAA,QACjB,OAAG,mCAAS,IAAI,CAAC;AAAA,MACnB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,eACJ,cACA,aACA,QACiC;AACjC,UAAM,kBAAkB,+BAA+B,cAAc,QAAQ,WAAW;AACxF,QAAI,CAAC,gBAAgB,QAAS,QAAO;AACrC,UAAM,YAAY,gBAAgB,QAAQ;AAC1C,UAAM,WAAW,eAAe;AAChC,QAAI,CAAC,OAAQ,YAAO,kCAAQ,2CAAkB,eAAe,gCAAgC;AAC7F,QAAI,CAAC,OAAO,QAAQ,OAAO,YAAY,QAAW;AAChD,iBAAO;AAAA,QACL,2CAAkB;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AACA,UAAM,aAAa,OAAO,UACtB,mCAAS,OAAO,OAAO,IACvB,OAAO,KAAK,OAAO,SAAS,MAAM,EAAE,SAAS,KAAK;AACtD,UAAM,OAAO,cAAc,OAAO,IAAI;AAEtC,WAAO,KAAK,gBAAgB;AAAA,MAC1B;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP,eAAe;AAAA,MACf,cAAc,CAAC,WAAW,QACxB,KAAK,SAAS,oBAAoB;AAAA,QAChC;AAAA,QACA,eAAe;AAAA,QACf,UAAU;AAAA,QACV;AAAA,QACA;AAAA,QACA,SAAS,OAAO;AAAA,QAChB,QAAQ,KAAK;AAAA,MACf,CAAC;AAAA,MACH,eAAe,QAAM,KAAK,SAAS,kBAAkB,EAAE;AAAA,MACvD,WAAW,CAAC,SAAuB,EAAE,eAAW,mCAAS,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,EAAE;AAAA,IAClF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,iBACJ,cACA,aACA,QACiC;AACjC,UAAM,kBAAkB,+BAA+B,cAAc,QAAQ,WAAW;AACxF,QAAI,CAAC,gBAAgB,QAAS,QAAO;AACrC,UAAM,YAAY,gBAAgB,QAAQ;AAC1C,UAAM,WAAW,eAAe;AAChC,QAAI,CAAC;AACH,iBAAO,kCAAQ,2CAAkB,eAAe,kCAAkC;AACpF,QAAI,CAAC,OAAO,MAAM;AAChB,iBAAO,kCAAQ,2CAAkB,eAAe,uCAAuC;AAAA,IACzF;AACA,QAAI,OAAO,SAAS,QAAQ;AAC1B,iBAAO;AAAA,QACL,2CAAkB;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAGA,UAAM,cAAc,OAAO;AAAA,MACzB,OAAO,YAAY,KAAK,UAAU,OAAO,IAAI;AAAA,MAC7C;AAAA,IACF,EAAE,SAAS,KAAK;AAChB,UAAM,OAAO,cAAc,OAAO,IAAI;AAEtC,WAAO,KAAK,gBAAgB;AAAA,MAC1B;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP,eAAe;AAAA,MACf,cAAc,CAAC,WAAW,QACxB,KAAK,SAAS,oBAAoB;AAAA,QAChC;AAAA,QACA,eAAe;AAAA,QACf,UAAU;AAAA,QACV;AAAA,QACA;AAAA,QACA,SAAS,OAAO;AAAA,QAChB,QAAQ,KAAK;AAAA,MACf,CAAC;AAAA,MACH,eAAe,QAAM,KAAK,SAAS,kBAAkB,EAAE;AAAA,MACvD,WAAW,CAAC,SAAuB,EAAE,eAAW,mCAAS,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,EAAE;AAAA,IAClF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,cACJ,cACA,aACA,QACA,MAC+B;AAC/B,UAAM,kBAAkB,+BAA+B,cAAc,QAAQ,WAAW;AACxF,QAAI,CAAC,gBAAgB,QAAS,QAAO;AACrC,UAAM,YAAY,gBAAgB,QAAQ;AAC1C,UAAM,WAAW,eAAe;AAChC,QAAI,CAAC,OAAQ,YAAO,kCAAQ,2CAAkB,eAAe,+BAA+B;AAC5F,QAAI,CAAC,OAAO;AACV,iBAAO,kCAAQ,2CAAkB,eAAe,oCAAoC;AAEtF,UAAM,aAAa,sBAAsB,OAAO,IAAI;AACpD,QAAI,CAAC,YAAY;AACf,iBAAO;AAAA,QACL,2CAAkB;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AACA,QAAI,eAAe,QAAQ;AACzB,aAAO,KAAK;AAAA,QACV;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,iBAAiB,cAAc,OAAO,IAAI;AAChD,UAAM,EAAE,aAAa,mBAAmB,IAAI,iBAAiB,cAAc;AAC3E,QAAI,CAAC,oBAAoB;AACvB,iBAAO;AAAA,QACL,2CAAkB;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AACA,QAAI,CAAC,iCAAiC,WAAW,GAAG;AAClD,iBAAO,kCAAQ,2CAAkB,qBAAqB,sCAAsC;AAAA,IAC9F;AAEA,WAAO,KAAK,QAAQ,WAAW,UAAU,OAAM,WAAU;AACvD,YAAM,OAAO,MAAM,KAAK;AAAA,QACtB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,YAAM,UAAU,KAAK,SAAS,yBAAyB,MAAM,oBAAoB,UAAU;AAC3F,iBAAO,kCAAoB,EAAE,SAAS,MAAM,eAAe,CAAC;AAAA,IAC9D,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,gBACJ,cACA,aACA,QACA,MACiC;AACjC,UAAM,kBAAkB,+BAA+B,cAAc,QAAQ,WAAW;AACxF,QAAI,CAAC,gBAAgB,QAAS,QAAO;AACrC,UAAM,YAAY,gBAAgB,QAAQ;AAC1C,UAAM,WAAW,eAAe;AAChC,QAAI,CAAC,OAAQ,YAAO,kCAAQ,2CAAkB,eAAe,iCAAiC;AAC9F,QAAI,CAAC,OAAO;AACV,iBAAO,kCAAQ,2CAAkB,eAAe,sCAAsC;AAExF,UAAM,EAAE,aAAa,mBAAmB,IAAI,iBAAiB,OAAO,IAAI;AACxE,QAAI,oBAAoB;AACtB,iBAAO;AAAA,QACL,2CAAkB;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AACA,QAAI,CAAC,iCAAiC,WAAW,GAAG;AAClD,iBAAO,kCAAQ,2CAAkB,qBAAqB,sCAAsC;AAAA,IAC9F;AAEA,WAAO,KAAK,QAAQ,WAAW,UAAU,OAAM,WAAU;AACvD,YAAM,OAAO,MAAM,KAAK;AAAA,QACtB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,YAAM,OAAO,KAAK,SAAS,cAAc,IAAI;AAC7C,iBAAO,kCAAsB;AAAA,QAC3B;AAAA,QACA,WAAW,KAAK;AAAA,QAChB,WAAW,KAAK;AAAA,QAChB,OAAO,KAAK;AAAA,QACZ,aAAa,KAAK;AAAA,QAClB,MAAM,cAAc,WAAW;AAAA,MACjC,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,mBACJ,YACA,WACA,SACgC;AAChC,WAAO,KAAK;AAAA,MACV;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,YACJ,cACA,aACA,QACkC;AAClC,UAAM,kBAAkB,+BAA+B,cAAc,QAAQ,WAAW;AACxF,QAAI,CAAC,gBAAgB,QAAS,QAAO;AACrC,UAAM,YAAY,gBAAgB,QAAQ;AAC1C,UAAM,WAAW,eAAe;AAChC,QAAI,CAAC,OAAQ,YAAO,kCAAQ,2CAAkB,eAAe,6BAA6B;AAC1F,QAAI,CAAC,OAAO;AACV,iBAAO,kCAAQ,2CAAkB,eAAe,kCAAkC;AAEpF,QAAI,CAAC,OAAO;AACV,iBAAO,kCAAQ,2CAAkB,eAAe,kCAAkC;AACpF,QAAI,CAAC,iCAAiC,iBAAiB,OAAO,IAAI,EAAE,WAAW,GAAG;AAChF,iBAAO,kCAAQ,2CAAkB,qBAAqB,sCAAsC;AAAA,IAC9F;AAEA,WAAO,KAAK,QAAQ,WAAW,UAAU,OAAM,WAAU;AAEvD,YAAM,EAAE,OAAO,IAAI,MAAM,KAAK,mBAAmB,WAAW,UAAU,OAAO,MAAM;AACnF,uBAAgB,gBAAgB,MAAM;AAEtC,YAAM,YAAY,KAAK,SAAS,wBAAoB,mCAAS,OAAO,IAAI,CAAC;AACzE,YAAM,aAAa,MAAM,KAAK;AAAA,QAC5B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,uBAAgB,gBAAgB,MAAM;AAEtC,YAAM,aAAa,KAAK,SAAS,aAAa,UAAU;AACxD,iBAAO,kCAAuB,EAAE,WAAW,CAAC;AAAA,IAC9C,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,eACJ,cACA,aACA,QACiC;AACjC,UAAM,kBAAkB,+BAA+B,cAAc,QAAQ,WAAW;AACxF,QAAI,CAAC,gBAAgB,QAAS,QAAO;AACrC,UAAM,YAAY,gBAAgB,QAAQ;AAC1C,UAAM,WAAW,eAAe;AAChC,QAAI,CAAC,OAAQ,YAAO,kCAAQ,2CAAkB,eAAe,gCAAgC;AAC7F,QAAI,CAAC,OAAO,QAAQ,OAAO,YAAY,QAAW;AAChD,iBAAO;AAAA,QACL,2CAAkB;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AACA,UAAM,aAAa,OAAO,UACtB,mCAAS,OAAO,OAAO,IACvB,OAAO,KAAK,OAAO,SAAS,MAAM,EAAE,SAAS,KAAK;AACtD,UAAM,OAAO,cAAc,OAAO,IAAI;AACtC,QAAI,CAAC,iCAAiC,iBAAiB,IAAI,EAAE,WAAW,GAAG;AACzE,iBAAO,kCAAQ,2CAAkB,qBAAqB,sCAAsC;AAAA,IAC9F;AAEA,WAAO,KAAK,gBAAgB;AAAA,MAC1B;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP,eAAe;AAAA,MACf,cAAc,CAAC,WAAW,QACxB,KAAK,SAAS,2BAA2B;AAAA,QACvC;AAAA,QACA;AAAA,QACA,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;AAAA,QACxB,QAAQ,KAAK;AAAA,MACf,CAAC;AAAA,MACH,eAAe,QAAM,KAAK,SAAS,kBAAkB,EAAE;AAAA,MACvD,WAAW,CAAC,SAAuB,EAAE,WAAW,IAAI,UAAU;AAAA,IAChE,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,wBACJ,cACA,aACA,WACkD;AAClD,UAAM,kBAAkB,+BAA+B,cAAc,WAAW,WAAW;AAC3F,QAAI,CAAC,gBAAgB,QAAS,QAAO;AACrC,UAAM,YAAY,gBAAgB,QAAQ;AAC1C,UAAM,WAAW,eAAe;AAChC,WAAO,KAAK,QAAQ,WAAW,UAAU,OAAM,WAAU;AACvD,YAAM,EAAE,OAAO,IAAI,MAAM,KAAK,mBAAmB,WAAW,UAAU,OAAO,MAAM;AACnF,iBAAO,kCAAQ,EAAE,mBAAmB,OAAO,kBAAkB,CAAC;AAAA,IAChE,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,cACJ,cACA,aACA,QACA,MAC+B;AAC/B,UAAM,kBAAkB,+BAA+B,cAAc,QAAQ,WAAW;AACxF,QAAI,CAAC,gBAAgB,QAAS,QAAO;AACrC,UAAM,YAAY,gBAAgB,QAAQ;AAC1C,UAAM,WAAW,eAAe;AAChC,QAAI,CAAC,OAAQ,YAAO,kCAAQ,2CAAkB,eAAe,+BAA+B;AAC5F,QAAI,CAAC,OAAO;AACV,iBAAO,kCAAQ,2CAAkB,eAAe,oCAAoC;AACtF,UAAM,OAAO,cAAc,OAAO,IAAI;AAEtC,WAAO,KAAK,QAAQ,WAAW,UAAU,OAAM,WAAU;AACvD,YAAM,EAAE,QAAQ,IAAI,MAAM,KAAK,cAAc,WAAW,UAAU,OAAO,MAAM,QAAQ,IAAI;AAC3F,uBAAgB,gBAAgB,MAAM;AAEtC,YAAM,UAAU,YAAAC,QAAK,OAAO,OAAO,KAAK,QAAQ,WAAW,KAAK,CAAC;AACjE,iBAAO,kCAAoB,EAAE,SAAS,KAAK,CAAC;AAAA,IAC9C,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,mBACJ,cACA,aACA,QACgC;AAChC,UAAM,kBAAkB,+BAA+B,cAAc,QAAQ,WAAW;AACxF,QAAI,CAAC,gBAAgB,QAAS,QAAO;AACrC,UAAM,YAAY,gBAAgB,QAAQ;AAC1C,UAAM,WAAW,eAAe;AAChC,QAAI,CAAC;AACH,iBAAO,kCAAQ,2CAAkB,eAAe,oCAAoC;AACtF,QAAI,CAAC,OAAO,QAAQ,CAAC,OAAO,cAAc;AACxC,iBAAO;AAAA,QACL,2CAAkB;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AACA,UAAM,OAAO,cAAc,OAAO,IAAI;AAEtC,WAAO,KAAK,gBAAgB;AAAA,MAC1B;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP,eAAe;AAAA,MACf,cAAc,CAAC,WAAW,QACxB,KAAK,SAAS,oBAAoB;AAAA,QAChC;AAAA,QACA,wBAAoB,mCAAS,OAAO,YAAY;AAAA,QAChD,UAAU;AAAA,QACV;AAAA,QACA;AAAA,QACA,QAAQ,KAAK;AAAA,MACf,CAAC;AAAA,MACH,eAAe,QAAM,KAAK,SAAS,kBAAkB,EAAE;AAAA,MACvD,WAAW,CAAC,SAAsB,EAAE,WAAW,IAAI,UAAU;AAAA,IAC/D,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,eACJ,cACA,aACA,QACiC;AACjC,UAAM,kBAAkB,+BAA+B,cAAc,QAAQ,WAAW;AACxF,QAAI,CAAC,gBAAgB,QAAS,QAAO;AACrC,UAAM,YAAY,gBAAgB,QAAQ;AAC1C,UAAM,WAAW,eAAe;AAChC,QAAI,CAAC,OAAQ,YAAO,kCAAQ,2CAAkB,eAAe,gCAAgC;AAC7F,QAAI,CAAC,OAAO,QAAQ,CAAC,OAAO,SAAS;AACnC,iBAAO;AAAA,QACL,2CAAkB;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AACA,UAAM,OAAO,cAAc,OAAO,IAAI;AAEtC,WAAO,KAAK,gBAAgB;AAAA,MAC1B;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP,eAAe;AAAA,MACf,cAAc,CAAC,WAAW,QACxB,KAAK,SAAS,oBAAoB;AAAA,QAChC;AAAA,QACA,wBAAoB,mCAAS,OAAO,OAAO;AAAA,QAC3C,UAAU;AAAA,QACV;AAAA,QACA;AAAA,QACA,QAAQ,KAAK;AAAA,MACf,CAAC;AAAA,MACH,eAAe,QAAM,KAAK,SAAS,kBAAkB,EAAE;AAAA,MACvD,WAAW,CAAC,SAAuB,EAAE,WAAW,IAAI,UAAU;AAAA,IAChE,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,eACJ,cACA,aACA,QACA,MACgC;AAChC,UAAM,kBAAkB,+BAA+B,cAAc,QAAQ,WAAW;AACxF,QAAI,CAAC,gBAAgB,QAAS,QAAO;AACrC,UAAM,YAAY,gBAAgB,QAAQ;AAC1C,UAAM,WAAW,eAAe;AAChC,QAAI,CAAC,OAAQ,YAAO,kCAAQ,2CAAkB,eAAe,gCAAgC;AAC7F,QAAI,CAAC,OAAO;AACV,iBAAO,kCAAQ,2CAAkB,eAAe,qCAAqC;AAEvF,UAAM,EAAE,aAAa,mBAAmB,IAAI,iBAAiB,OAAO,IAAI;AACxE,QAAI,CAAC,oBAAoB;AACvB,iBAAO;AAAA,QACL,2CAAkB;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAEA,WAAO,KAAK,QAAQ,WAAW,UAAU,OAAM,WAAU;AACvD,YAAM,OAAO,MAAM,KAAK;AAAA,QACtB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,YAAM,UAAU,KAAK,SAAS,0BAA0B,MAAM,kBAAkB;AAChF,iBAAO,kCAAqB,EAAE,SAAS,MAAM,cAAc,OAAO,IAAI,EAAE,CAAC;AAAA,IAC3E,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,oBACJ,cACA,aACA,QACiC;AACjC,UAAM,kBAAkB,+BAA+B,cAAc,QAAQ,WAAW;AACxF,QAAI,CAAC,gBAAgB,QAAS,QAAO;AACrC,UAAM,YAAY,gBAAgB,QAAQ;AAC1C,UAAM,WAAW,eAAe;AAChC,QAAI,CAAC;AACH,iBAAO,kCAAQ,2CAAkB,eAAe,qCAAqC;AACvF,QAAI,CAAC,OAAO,MAAM;AAChB,iBAAO,kCAAQ,2CAAkB,eAAe,0CAA0C;AAAA,IAC5F;AACA,QAAI,CAAC,OAAO,UAAU;AACpB,iBAAO;AAAA,QACL,2CAAkB;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AACA,UAAM,eAAW,mCAAS,OAAO,QAAQ;AACzC,UAAM,OAAO,cAAc,OAAO,IAAI;AAEtC,WAAO,KAAK,gBAAgB;AAAA,MAC1B;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP,eAAe;AAAA,MACf,cAAc,CAAC,WAAW,QACxB,KAAK,SAAS,qBAAqB;AAAA,QACjC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ,KAAK;AAAA,MACf,CAAC;AAAA,MACH,eAAe,QAAM,KAAK,SAAS,mBAAmB,EAAE;AAAA;AAAA,MAExD,WAAW,CAAC,SAAuB,EAAE,WAAW,IAAI,UAAU;AAAA,IAChE,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,gBACJ,cACA,aACA,QACkC;AAClC,UAAM,kBAAkB,+BAA+B,cAAc,QAAQ,WAAW;AACxF,QAAI,CAAC,gBAAgB,QAAS,QAAO;AACrC,UAAM,YAAY,gBAAgB,QAAQ;AAC1C,UAAM,WAAW,eAAe;AAChC,QAAI,CAAC,OAAQ,YAAO,kCAAQ,2CAAkB,eAAe,iCAAiC;AAC9F,QAAI,CAAC,OAAO,MAAM;AAChB,iBAAO,kCAAQ,2CAAkB,eAAe,sCAAsC;AAAA,IACxF;AACA,QAAI,CAAC,OAAO,YAAY;AACtB,iBAAO,kCAAQ,2CAAkB,eAAe,4CAA4C;AAAA,IAC9F;AAEA,QAAI,OAAO,gBAAgB,MAAM;AAC/B,iBAAO;AAAA,QACL,2CAAkB;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AACA,UAAM,iBAAa,mCAAS,OAAO,UAAU;AAC7C,UAAM,OAAO,cAAc,OAAO,IAAI;AAEtC,WAAO,KAAK,gBAAgB;AAAA,MAC1B;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP,eAAe;AAAA,MACf,cAAc,CAAC,WAAW,QACxB,KAAK,SAAS,qBAAqB;AAAA,QACjC;AAAA,QACA,UAAU;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ,KAAK;AAAA,MACf,CAAC;AAAA,MACH,eAAe,QAAM,KAAK,SAAS,mBAAmB,EAAE;AAAA,MACxD,WAAW,CAAC,SAAwB,EAAE,WAAW,IAAI,UAAU;AAAA,IACjE,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,QACZ,WACA,UACA,KACsB;AACtB,QAAI;AACF,aAAO,MAAM,KAAK,UAAU,QAAQ,iBAAiB,WAAW,QAAQ,GAAG,GAAG;AAAA,IAChF,SAAS,KAAK;AACZ,aAAO,KAAK,gBAAmB,GAAG;AAAA,IACpC;AAAA,EACF;AAAA,EAEA,MAAc,kBACZ,WACA,UACA,UACA,aACA,QACA,MACiB;AACjB,UAAM,EAAE,QAAQ,IAAI,MAAM,KAAK;AAAA,MAC7B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,qBAAgB,gBAAgB,MAAM;AACtC,QAAI,CAAC,QAAQ,mBAAmB;AAC9B,gBAAM,yCAAe;AAAA,QACnB,MAAM,2CAAkB;AAAA,QACxB,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AACA,WAAO,QAAQ;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,gBAAqD,MAQpC;AACvB,UAAM,EAAE,WAAW,SAAS,IAAI;AAChC,WAAO,KAAK,QAAQ,WAAW,UAAU,OAAM,WAAU;AACvD,YAAM,EAAE,OAAO,IAAI,MAAM,KAAK,mBAAmB,WAAW,UAAU,KAAK,OAAO,MAAM;AACxF,uBAAgB,gBAAgB,MAAM;AAEtC,YAAM,gBAAY,aAAAC,IAAO;AACzB,YAAM,YAAY,KAAK,aAAa,WAAW,OAAO,iBAAiB;AACvE,YAAM,aAAa,MAAM,KAAK;AAAA,QAC5B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,KAAK;AAAA,MACP;AACA,uBAAgB,gBAAgB,MAAM;AAEtC,YAAM,YAAY,KAAK,cAAc,UAAU;AAC/C,uBAAgB,wBAAwB,WAAW,UAAU,SAAS;AACtE,iBAAO,kCAAQ,KAAK,UAAU,SAAS,CAAC;AAAA,IAC1C,CAAC;AAAA,EACH;AAAA,EAEQ,sBACN,MACyD;AACzD,QAAI,KAAC,iDAAuB,OAAO,KAAK,UAAU,CAAC,KAAK,CAAC,KAAK,KAAM,QAAO;AAE3E,UAAM,SAAS,KAAK;AACpB,UAAM,eAAW,mDAAyB,MAAM;AAChD,UAAM,OAAO,cAAc,KAAK,IAAI;AAGpC,QACE,aAAa,SACb,CAAC,iCAAiC,iBAAiB,IAAI,EAAE,WAAW,GACpE;AACA,aAAO;AAAA,IACT;AACA,YAAQ,QAAQ;AAAA,MACd,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,eAAO,EAAE,UAAU,MAAM,iBAAiB,IAAI,EAAE,YAAY;AAAA,MAC9D,KAAK;AAAA,MACL,KAAK;AACH,eAAO,EAAE,UAAU,KAAK;AAAA,MAC1B;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,4BACZ,WACA,UACA,QAC4D;AAC5D,WAAO,KAAK,UAAU,QAAQ,iBAAiB,WAAW,QAAQ,GAAG,OAAM,WAAU;AACnF,YAAM,SAAS,KAAK,eAAe,WAAW,QAAQ;AACtD,UAAI,EAAE,OAAO,IAAI;AAEjB,YAAM,iBAAiB,oBAAI,IAAyD;AACpF,iBAAW,QAAQ,OAAO,QAAQ;AAChC,cAAM,SAAS,KAAK,sBAAsB,IAAI;AAC9C,YAAI,OAAQ,gBAAe,IAAI,WAAW,OAAO,UAAU,OAAO,IAAI,GAAG,MAAM;AAAA,MACjF;AAEA,YAAM,OAAoB,oBAAI,IAAI;AAClC,UAAI,CAAC,eAAe,MAAM;AACxB,eAAO,EAAE,KAAK;AAAA,MAChB;AACA,YAAM,mBAAmB,MAAM,KAAK,eAAe,OAAO,CAAC;AAC3D,YAAM,kBAAkB,MAAM;AAC5B,mBAAW,UAAU,kBAAkB;AACrC,cAAI,CAAC,KAAK,IAAI,WAAW,OAAO,UAAU,OAAO,IAAI,CAAC,GAAG;AACvD,sBAAM,yCAAe;AAAA,cACnB,MAAM,2CAAkB;AAAA,cACxB,SAAS,0DAA0D,OAAO,IAAI;AAAA,YAChF,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAIA,YAAM,gBAAY,gDAAsB,OAAO,WAAW,IACtD,KAAK,YAAY,KAAK,OAAO,WAAW,IACxC;AACJ,YAAM,iBAAiB,YAAY,KAAK,iBAAiB,IAAI,UAAU,SAAS,IAAI;AACpF,YAAM,aACJ,gBAAgB,gBAAgB,WAAW,eAC3C,gBAAgB,mBAAmB;AAErC,UACE,KAAK,qBAAqB,QAC1B,CAAC,cACD,CAAC,QAAQ,gBACT,KAAK,iBACL,OAAO,2BACP;AACA,iBAAU,MAAM,KAAK,cAAc,QAAQ,OAAO,yBAAyB,KAAM;AACjF,yBAAgB,gBAAgB,MAAM;AAAA,MACxC;AAIA,UAAI,KAAK,qBAAqB,QAAQ,CAAC,cAAc,QAAQ,cAAc;AACzE,cAAM,kBAAkB,OAAO;AAC/B,cAAM,sBAAsB,MAAM;AAChC,cAAI,QAAQ,iBAAiB,iBAAiB;AAC5C,sBAAM,yCAAe;AAAA,cACnB,MAAM,2CAAkB;AAAA,cACxB,SAAS;AAAA,YACX,CAAC;AAAA,UACH;AAAA,QACF;AACA,mBAAW,UAAU,kBAAkB;AACrC,cAAI,CAAC,KAAK,IAAI,WAAW,OAAO,UAAU,OAAO,IAAI,CAAC,GAAG;AACvD,gCAAoB;AACpB,kBAAM,SAAS,MAAM,KAAK;AAAA,cACxB;AAAA,cACA;AAAA,cACA,OAAO;AAAA,cACP,OAAO;AAAA,cACP;AAAA,cACA;AAAA,YACF;AACA,qBAAS,OAAO;AAChB,gCAAoB;AAAA,UACtB;AAAA,QACF;AACA,wBAAgB;AAChB,eAAO,EAAE,MAAM,mBAAmB,OAAO,kBAAkB;AAAA,MAC7D;AACA,UAAI,KAAK,qBAAqB,OAAO;AACnC,kBAAM,yCAAe;AAAA,UACnB,MAAM,2CAAkB;AAAA,UACxB,SAAS;AAAA,QACX,CAAC;AAAA,MACH;AAEA,YAAM,UAAU;AAChB,YAAM,YAAY,KAAK,SAAS,0BAA0B;AAAA,QACxD,SAAS,QAAQ,IAAI,YAAU,UAAU,OAAO,UAAU,OAAO,IAAI,CAAC;AAAA,QACtE,QAAQ,KAAK;AAAA,MACf,CAAC;AACD,YAAM,aAAa,MAAM,KAAK;AAAA,QAC5B,SAAS,aAAa,MAAM,IAAI,sBAAsB;AAAA,QACtD,EAAE,GAAG,WAAW,UAAU,MAAM;AAAA,QAChC;AAAA,MACF;AACA,uBAAgB,gBAAgB,MAAM;AAEtC,YAAM,SAAS,KAAK,SAAS,qBAAqB,UAAU;AAC5D,WAAK,sBAAsB,QAAQ,MAAM;AACzC,eAAS,KAAK,oBAAoB,MAAM;AACxC,YAAM,uBAAuB,IAAI;AAAA,QAC/B,QAAQ,IAAI,YAAU,CAAC,cAAc,OAAO,IAAI,GAAG,OAAO,QAAQ,CAAU;AAAA,MAC9E;AACA,iBAAW,WAAW,OAAO,UAAU;AACrC,cAAM,iBAAiB,cAAc,QAAQ,IAAI;AACjD,cAAM,WACJ,qBAAqB,IAAI,cAAc,KAAK,sBAAsB,cAAc;AAClF,YAAI,UAAU;AACZ,eAAK,IAAI,WAAW,UAAU,cAAc,GAAG,EAAE,GAAG,SAAS,SAAS,CAAC;AAAA,QACzE;AAAA,MACF;AACA,sBAAgB;AAChB,aAAO,EAAE,MAAM,mBAAmB,OAAO,kBAAkB;AAAA,IAC7D,CAAC;AAAA,EACH;AAAA;AAAA,EAGQ,eACN,WACA,UACoD;AACpD,UAAM,wBAAoB,gDAAsB,SAAS,IACrD,KAAK,YAAY,QAAQ,SAAS,EAAE,YACpC;AACJ,UAAM,cAAc,CAAC,UAAU,iBAAiB,EAAE;AAAA,MAAO,CAAC,eACxD,QAAQ,UAAU;AAAA,IACpB;AACA,QAAI,CAAC,YAAY,OAAQ,QAAO,CAAC;AAEjC,UAAM,eAAe,YAAY,IAAI,gBAAc,0BAA0B,UAAU,CAAC;AACxF,UAAM,4BAA4B,aAAa,CAAC;AAChD,QAAI,CAAC,6BAA6B,aAAa,KAAK,WAAS,CAAC,KAAK,GAAG;AACpE,gBAAM,yCAAe;AAAA,QACnB,MAAM,2CAAkB;AAAA,QACxB,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AACA,QAAI,aAAa,KAAK,WAAS,UAAU,yBAAyB,GAAG;AACnE,gBAAM,yCAAe;AAAA,QACnB,MAAM,2CAAkB;AAAA,QACxB,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,MACL,QAAQ,KAAK,SAAS,IAAI,yBAAyB;AAAA,MACnD;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,sBACN,QACA,UACM;AACN,QACE,SAAS,6BACT,OAAO,sBAAsB,SAAS,2BACtC;AACA,gBAAM,yCAAe;AAAA,QACnB,MAAM,2CAAkB;AAAA,QACxB,SAAS,kCAAkC,OAAO,iBAAiB,sDAAsD,SAAS,yBAAyB;AAAA,MAC7J,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,oBACN,QACA,SACsB;AACtB,UAAM,EAAE,kBAAkB,IAAI;AAC9B,QAAI,SAAS,KAAK,SAAS,IAAI,iBAAiB;AAChD,UAAM,QAAQ,CAAC;AACf,QAAI,CAAC,QAAQ;AACX,eAAS,mBAAmB,iBAAiB;AAC7C,WAAK,SAAS,IAAI,mBAAmB,MAAM;AAAA,IAC7C;AACA,WAAO,QAAQ,OAAO,UAAU,OAAO;AACvC,WAAO,gBAAgB,OAAO,iBAAiB,OAAO;AACtD,WAAO,mBAAmB,OAAO,YAAY,OAAO;AACpD,WAAO,eAAe,SAAS,gBAAgB,OAAO;AACtD,QAAI,CAAC,SAAS,OAAQ,QAAO,WAAW;AAExC,UAAM,OAAO,aAAa,MAAM;AAChC,UAAM,YAAY,QAAQ,gCAAO,UAAU,gCAAO;AAClD,SAAK,QAAQ,KAAK,WAAW,EAAE,MAAM,WAAW,SAAS,KAAK,CAAC;AAC/D,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,YACZ,UACA,gBACA,QAC+B;AAC/B,QAAI,KAAK,uBAAuB,KAAK,KAAK,wBAAwB,GAAG;AACnE,iBAAO;AAAA,QACL,2CAAkB;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AACA,qBAAgB,gBAAgB,MAAM;AACtC,QAAI,YAAY;AAChB,UAAM,UAAU,MAAM;AACpB,kBAAY;AACZ,WAAK,yBAAyB;AAAA,IAChC;AACA,YAAQ,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AAGzD,UAAM,UAAU,KAAK,gBAAgB,KAAK,YAAY;AACpD,uBAAgB,gBAAgB,MAAM;AACtC,aAAO,KAAK,qBAAqB,UAAU,gBAAgB,MAAM;AAAA,IACnE,CAAC;AACD,UAAM,UAAU,QAAQ,QAAQ,MAAM;AACpC,cAAQ,oBAAoB,SAAS,OAAO;AAC5C,UAAI,UAAW,MAAK,yBAAyB;AAAA,IAC/C,CAAC;AACD,SAAK,kBAAkB,QAAQ;AAAA,MAC7B,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AACA,WAAO,SAAS,iBAAgB,WAAW,QAAQ,OAAO,IAAI;AAAA,EAChE;AAAA,EAEA,MAAc,qBACZ,UACA,gBACA,QAC+B;AAC/B,QAAI,CAAC,KAAK,eAAe;AACvB,iBAAO;AAAA,QACL,2CAAkB;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AACA,QAAI;AACJ,QAAI;AACF,UAAI,gBAAwC,EAAE,MAAM,UAAU;AAC9D,UAAI,gBAAgB;AAClB,wBAAgB,EAAE,MAAM,iBAAiB,eAAe;AAAA,MAC1D,WAAW,SAAS,2BAA2B;AAC7C,wBAAgB;AAAA,UACd,MAAM;AAAA,UACN,gBAAgB,SAAS;AAAA,QAC3B;AAAA,MACF;AACA,YAAM,YAAY,KAAK;AACvB,YAAM,UAAU,OAAO,UAAU,gBAC7B,UAAU,cAAc,aAAa,IACrC,UAAU,QAAQ,kBAAkB,SAAS,yBAAyB;AAC1E,kBAAY,QAAQ;AACpB,uBAAgB,gBAAgB,MAAM;AACtC,YAAM,MAAM,QAAQ,WAAW;AAC/B,YAAM,eAAW,sDAA4B,KAAK,iBAAiB;AACnE,UAAI,CAAC,UAAU;AACb,kBAAM,yCAAe;AAAA,UACnB,MAAM,2CAAkB;AAAA,UACxB,SAAS;AAAA,QACX,CAAC;AAAA,MACH;AACA,YAAM,oBAAoB,SAAS,YAAY;AAC/C,UACE,SAAS,6BACT,sBAAsB,SAAS,2BAC/B;AACA,kBAAM,yCAAe;AAAA,UACnB,MAAM,2CAAkB;AAAA,UACxB,SAAS,kCAAkC,iBAAiB,sDAAsD,SAAS,yBAAyB;AAAA,QACtJ,CAAC;AAAA,MACH;AAEA,YAAM,uBAAuB,KAAK,SAAS,IAAI,iBAAiB,GAAG;AACnE,UAAI,wBAAwB,yBAAyB,QAAQ,WAAW;AACtE,YAAI;AACF,gBAAM,KAAK,cAAc,WAAW,oBAAoB;AAAA,QAC1D,QAAQ;AAAA,QAER;AAAA,MACF;AACA,uBAAgB,gBAAgB,MAAM;AACtC,YAAM,SAAS,KAAK;AAAA,QAClB,EAAE,mBAAmB,UAAU,CAAC,EAAE;AAAA,QAClC;AAAA,UACE,QAAQ;AAAA,UACR,cAAc,QAAQ;AAAA,QACxB;AAAA,MACF;AACA,uBAAgB,gBAAgB,MAAM;AACtC,aAAO,gBAAgB;AACvB,aAAO,QAAQ,QAAQ,WAAW,aAAa,QAAQ,WAAW,SAAS,OAAO;AAClF,aAAO,gBAAgB,QAAQ,WAAW,mBAAmB,OAAO;AACpE,iBAAO,kCAAQ,aAAa,MAAM,CAAC;AAAA,IACrC,SAAS,KAAK;AACZ,UAAI,WAAW;AACb,YAAI;AACF,gBAAM,KAAK,cAAc,WAAW,SAAS;AAAA,QAC/C,QAAQ;AAAA,QAER;AAAA,MACF;AACA,aAAO,KAAK,gBAA4B,GAAG;AAAA,IAC7C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,cACZ,QACA,2BACA,SAC2C;AAC3C,qBAAgB,gBAAgB,MAAM;AACtC,QAAI,CAAC,6BAA6B,KAAK,qBAAqB,QAAQ,CAAC,KAAK,eAAe;AACvF,aAAO;AAAA,IACT;AAEA,UAAM,cAAc,SAAS,uBAAuB,uCAAuC;AAC3F,QAAI,mBAAsC,CAAC;AAC3C,QAAI;AACJ,aAAS,UAAU,GAAG,WAAW,aAAa,WAAW,GAAG;AAC1D,uBAAgB,gBAAgB,MAAM;AACtC,UAAI;AAEF,2BAAmB,MAAM,iBAAgB;AAAA,UACvC;AAAA,UACA,KAAK,cAAc,cAAc,EAAE,SAAS,eAAe,CAAC;AAAA,QAC9D;AACA,0BAAkB;AAAA,MACpB,SAAS,OAAO;AACd,0BAAkB;AAAA,MACpB;AACA,uBAAgB,gBAAgB,MAAM;AACtC,UAAI,iBAAiB,QAAQ;AAC3B;AAAA,MACF;AACA,UAAI,UAAU,aAAa;AAEzB,cAAM,iBAAgB,WAAW,QAAQ,gCAAgC,CAAC;AAAA,MAC5E;AAAA,IACF;AACA,QAAI,CAAC,iBAAiB,QAAQ;AAC5B,UAAI,KAAK,qBAAqB,SAAS,iBAAiB;AACtD,cAAM,2BAA2B,QAC7B,kBACA,IAAI,MAAM,OAAO,eAAe,CAAC;AAAA,MACvC;AACA,aAAO;AAAA,IACT;AAGA,UAAM,WAAW,MAAM,KAAK,YAAY,EAAE,0BAA0B,GAAG,QAAW,MAAM;AACxF,qBAAgB,gBAAgB,MAAM;AAEtC,QAAI,CAAC,SAAS,WAAW,SAAS,QAAQ,SAAS,2CAAkB,oBAAoB;AACvF,gBAAM,yCAAe;AAAA,QACnB,GAAG,SAAS;AAAA,QACZ,SAAS,SAAS,QAAQ;AAAA,MAC5B,CAAC;AAAA,IACH;AACA,WAAO,SAAS,UAAU,KAAK,SAAS,IAAI,yBAAyB,IAAI;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,WACZ,QACA,WACA,UACA,aACA,QACA,eACqB;AACrB,UAAM,gCAA4B,gDAAsB,WAAW,IAC/D,KAAK,YAAY,OAAO,WAAW,IACnC;AACJ,QAAI;AACF,aAAO,MAAM,KAAK;AAAA,QAChB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,UAAE;AACA,kCAA4B;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,MAAc,oBACZ,cACA,WACA,UACA,aACA,QACA,eACqB;AACrB,QAAI,SAAS;AACb,QAAI;AACJ,YAAI,gDAAsB,WAAW,GAAG;AACtC,YAAM,YAAY,KAAK,YAAY,QAAQ,WAAW;AACtD,YAAM,QAAQ,KAAK,iBAAiB,IAAI,UAAU,SAAS;AAC3D,UAAI,CAAC,SAAS,MAAM,gBAAgB,aAAa;AAC/C,cAAM,KAAK;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,yBAAmB;AAAA,IACrB;AAEA,QACE,CAAC,oBACD,CAAC,KAAK,oBACN,UACA,CAAC,OAAO,gBACR,KAAK,eACL;AACA,eACG,MAAM,KAAK,cAAc,QAAQ,OAAO,mBAAmB;AAAA,QAC1D,sBAAsB,OAAO;AAAA,MAC/B,CAAC,KAAM;AAAA,IACX;AAEA,UAAM,UAAU,mBACZ,iBAAiB,mBAAmB,QACpC,KAAK,qBAAqB,SACzB,KAAK,qBAAqB,QAAQ,QAAQ,QAAQ,YAAY;AACnE,QAAI,SAAS;AACX,UAAI,CAAC,QAAQ,gBAAgB,CAAC,KAAK,eAAe;AAChD,YAAI,kBAAkB;AACpB,gBAAM,KAAK;AAAA,YACT,iBAAiB;AAAA,YACjB;AAAA,UACF;AAAA,QACF;AACA,kBAAM,yCAAe;AAAA,UACnB,MAAM,2CAAkB;AAAA,UACxB,SAAS;AAAA,QACX,CAAC;AAAA,MACH;AACA,YAAM,SAAS,MAAM,KAAK;AAAA,QACxB,OAAO;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,UAAI,OAAO,QAAS,QAAO,OAAO;AAElC,YAAM,eAAW,kDAAwB,OAAO,KAAK;AACrD,YAAM,EAAE,QAAQ,gBAAgB,MAAM,aAAa,IAAI;AAIvD,UAAI,iBAAiB,2CAAkB,mBAAmB,mBAAmB,UAAU;AACrF,YAAI,CAAC,oBAAoB,CAAC,KAAK,kBAAkB;AAC/C,gBAAMC,iBAAgB,aAAa,MAAM;AACzC,iBAAO,KAAK;AAAA,YACVA;AAAA,YACA,EAAE,GAAG,WAAW,SAAS;AAAA,YACzB;AAAA,UACF;AAAA,QACF;AAGA,cAAM;AAAA,MACR;AAGA,YAAM,iBACJ,mBAAmB,SACf,mBAAmB,WACnB,iBAAiB,2CAAkB,gBACnC,iBAAiB,2CAAkB,eACnC,iBAAiB,2CAAkB,gBACnC,iBAAiB,2CAAkB;AACzC,UAAI,CAAC,gBAAgB;AAEnB,cAAM,gBAAgB,OAAO;AAC7B,YAAI,eAAe;AACjB,eAAK,eAAe,WAAW,aAAa,EAAE,MAAM,MAAM,MAAS;AAAA,QACrE;AACA,eAAO,eAAe;AACtB,YAAI,kBAAkB;AACpB,gBAAM,KAAK;AAAA,YACT,iBAAiB;AAAA,YACjB,gBACI,YAAY,aAAa,2DACzB;AAAA,YACJ;AAAA,UACF;AAAA,QACF;AACA,YAAI,eAAe;AACjB,oBAAM,yCAAe;AAAA,YACnB,MAAO,gBAAsC,2CAAkB;AAAA,YAC/D,SAAS,YAAY,aAAa;AAAA,YAClC,QAAQ;AAAA,YACR,UAAU,EAAE,OAAO,UAAU;AAAA,YAC7B,YAAQ,0DAAgC,aAAa;AAAA,UACvD,CAAC;AAAA,QACH;AAAA,MACF;AACA,YAAM;AAAA,IACR;AAEA,UAAM,gBAAgB,SAAS,aAAa,MAAM,IAAI,sBAAsB;AAC5E,QAAI;AACF,aAAO,MAAM,KAAK;AAAA,QAChB;AAAA,QACA,EAAE,GAAG,WAAW,SAAS;AAAA,QACzB;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,YAAM,EAAE,MAAM,MAAM,IAAI,IAAI;AAC5B,UACE,kBACC,SAAS,2CAAkB,oBAAoB,QAAQ,kDACxD;AACA,kBAAM,yCAAe;AAAA,UACnB,MAAM,2CAAkB;AAAA,UACxB,SAAS,YAAY,aAAa;AAAA,UAClC,UAAU,EAAE,OAAO,UAAU;AAAA,UAC7B,YAAQ,0DAAgC,aAAa;AAAA,QACvD,CAAC;AAAA,MACH;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA,EAGQ,0BACN,aACA,SACA,eACO;AACP,SAAK,YAAY,IAAI,aAAa,YAAY;AAC9C,UAAM,SAAS,EAAE,aAAa,QAAQ,aAAa;AACnD,eAAO,yCAAe;AAAA,MACpB,MAAM,2CAAkB;AAAA,MACxB;AAAA,MACA,UAAU,gBAAgB,EAAE,OAAO,UAAU,IAAI;AAAA,MACjD,QAAQ,oBAAgB,0DAAgC,eAAe,MAAM,IAAI;AAAA,IACnF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,cACZ,WACA,UACA,UACA,UACA,QACA,MAC0E;AAC1E,UAAM,SAAS,KAAK,eAAe,WAAW,QAAQ;AACtD,UAAM,8BAA0B,gDAAsB,SAAS,IAC3D,KAAK,YAAY,QAAQ,SAAS,EAAE,iBACpC;AACJ,UAAM,MAAM,WAAW,UAAU,QAAQ;AAEzC,QAAI,iBAAiB,OAAO;AAC5B,QAAI,CAAC,gBAAgB;AACnB,uBAAiB,MAAM,KAAK,cAAc,QAAQ,OAAO,yBAAyB;AAClF,uBAAgB,gBAAgB,MAAM;AAAA,IACxC;AACA,UAAM,SAAS,MAAM,IAAI,GAAG;AAC5B,QAAI,kBAAkB,QAAQ;AAC5B,aAAO,EAAE,QAAQ,gBAAgB,SAAS,OAAO;AAAA,IACnD;AACA,QACE,CAAC,2BACD,kBACA,CAAC,eAAe,gBAChB,KAAK,qBAAqB,OAC1B;AAGA,YAAM,KAAK,cAAc,QAAQ,eAAe,mBAAmB;AAAA,QACjE,sBAAsB,eAAe;AAAA,MACvC,CAAC;AACD,uBAAgB,gBAAgB,MAAM;AACtC,uBAAiB,KAAK,SAAS,IAAI,eAAe,iBAAiB,KAAK;AAAA,IAC1E;AAGA,UAAM,yBAAyB,0BAC3B,4BAA4B,QAC5B,KAAK,qBAAqB,QAAQ,QAAQ,gBAAgB,YAAY;AAC1E,UAAM,UAAU,CAAC,UAAU,UAAU,QAAQ,CAAC;AAC9C,UAAM,YAAY,KAAK,SAAS,0BAA0B,EAAE,SAAS,QAAQ,KAAK,QAAQ,CAAC;AAC3F,UAAM,aAAa,MAAM,KAAK,WAAW,gBAAgB,WAAW,OAAO,WAAW,MAAM;AAC5F,qBAAgB,gBAAgB,MAAM;AAEtC,UAAM,SAAS,KAAK,SAAS,qBAAqB,UAAU;AAC5D,QAAI;AACJ,QAAI,0BAA0B,gBAAgB;AAC5C,UAAI,OAAO,sBAAsB,eAAe,mBAAmB;AACjE,kBAAM,yCAAe;AAAA,UACnB,MAAM,2CAAkB;AAAA,UACxB,SAAS;AAAA,QACX,CAAC;AAAA,MACH;AACA,eAAS;AAAA,IACX,OAAO;AACL,WAAK,sBAAsB,QAAQ,MAAM;AACzC,eAAS,KAAK,oBAAoB,QAAQ;AAAA,QACxC,QAAQ,4BAA4B,QAAQ,QAAQ,gBAAgB,YAAY;AAAA,MAClF,CAAC;AAAA,IACH;AACA,UAAM,UAAU,OAAO,SAAS,KAAK,OAAK,cAAc,EAAE,IAAI,MAAM,QAAQ;AAC5E,QAAI,CAAC,SAAS;AACZ,gBAAM,yCAAe;AAAA,QACnB,MAAM,2CAAkB;AAAA,QACxB,SAAS,0DAA0D,QAAQ;AAAA,MAC7E,CAAC;AAAA,IACH;AACA,UAAM,QAA8B,EAAE,GAAG,SAAS,SAAS;AAC3D,QAAI,MAAM;AAER,iBAAW,YAAY,OAAO,UAAU;AACtC,cAAM,gBAAgB,sBAAsB,SAAS,IAAI;AACzD,YAAI,eAAe;AACjB,eAAK,IAAI,WAAW,eAAe,SAAS,IAAI,GAAG;AAAA,YACjD,GAAG;AAAA,YACH,UAAU;AAAA,UACZ,CAAC;AAAA,QACH;AAAA,MACF;AACA,WAAK,IAAI,KAAK,KAAK;AAAA,IACrB;AACA,WAAO,EAAE,QAAQ,SAAS,MAAM;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,mBACZ,WACA,UACA,OACA,QAC2C;AAC3C,UAAM,SAAS,KAAK,eAAe,WAAW,QAAQ;AACtD,QAAI,OAAO,OAAQ,QAAO,EAAE,QAAQ,OAAO,OAAO;AAElD,UAAM,WAAW,MAAM,KAAK,cAAc,QAAQ,OAAO,yBAAyB;AAClF,qBAAgB,gBAAgB,MAAM;AACtC,QAAI,SAAU,QAAO,EAAE,QAAQ,SAAS;AAIxC,QAAI,OAAO,2BAA2B;AACpC,aAAO,EAAE,QAAQ,mBAAmB,OAAO,yBAAyB,EAAE;AAAA,IACxE;AAGA,UAAM,EAAE,YAAY,IAAI,iBAAiB,iDAAwB,KAAK,CAAC;AACvE,UAAM,YAAY,KAAK,SAAS,0BAA0B;AAAA,MACxD,SAAS,CAAC,UAAU,OAAO,WAAW,CAAC;AAAA,MACvC,QAAQ,KAAK;AAAA,IACf,CAAC;AACD,UAAM,aAAa,MAAM,KAAK,WAAW,QAAW,WAAW,OAAO,WAAW,MAAM;AACvF,qBAAgB,gBAAgB,MAAM;AAEtC,WAAO,EAAE,QAAQ,KAAK,oBAAoB,KAAK,SAAS,qBAAqB,UAAU,CAAC,EAAE;AAAA,EAC5F;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,qBAAyC;AAC/C,UAAM,cAAc,KAAK,UAAU,aAAa,GAAG;AACnD,QAAI,CAAC,YAAa,QAAO;AACzB,YAAI,gDAAsB,WAAW,EAAG,QAAO;AAC/C,WAAO,KAAK,6BAA6B,WAAW,GAAG;AAAA,EACzD;AAAA;AAAA,EAGQ,6BAA6B,YAAgD;AACnF,eAAW,OAAO,wBAAwB,CAAC,UAAU,CAAC,GAAG;AACvD,YAAM,QAAQ,KAAK,iBAAiB,IAAI,GAAG;AAC3C,UAAI,MAAO,QAAO;AAAA,IACpB;AACA,UAAM,oBAAoB,0BAA0B,UAAU;AAC9D,WAAO,oBACH,KAAK,iBAAiB,IAAI,gBAAgB,iBAAiB,CAAC,IAC5D;AAAA,EACN;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,iBACZ,aACA,SACA,QACY;AACZ,QAAI,CAAC,OAAQ,QAAO;AACpB,QAAI,UAAU;AACd,UAAM,UAAU,MAAM;AACpB,UAAI,CAAC,QAAS,MAAK,YAAY,OAAO,WAAW;AAAA,IACnD;AACA,QAAI,OAAO,QAAS,SAAQ;AAAA,QACvB,QAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AAC7D,QAAI;AACF,aAAO,MAAM;AAAA,IACf,UAAE;AACA,gBAAU;AACV,aAAO,oBAAoB,SAAS,OAAO;AAAA,IAC7C;AAAA,EACF;AAAA,EAEA,MAAc,kCACZ,QACA,MACA,QACqB;AACrB,UAAM,cAAc,KAAK,mBAAmB;AAC5C,UAAM,cAAc,KAAK,YAAY;AAAA,MACnC,oCAAW;AAAA,MACX,EAAE,WAAW,KAAK,cAAc,YAAY;AAAA,IAC9C;AACA,SAAK,QAAQ,KAAK,oCAAW,oBAAoB;AAAA,MAC/C,MAAM,oCAAW;AAAA,MACjB,SAAS,EAAE,QAAQ,MAAM,YAAY;AAAA,IACvC,CAAC;AACD,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B,oCAAW;AAAA,MACX;AAAA,MACA;AAAA,IACF;AACA,WAAO,EAAE,QAAQ,SAAS,QAAQ,QAAQ,SAAS,OAAO;AAAA,EAC5D;AAAA,EAEA,MAAc,+BACZ,QACA,QACqB;AACrB,UAAM,cAAc,KAAK,mBAAmB;AAC5C,UAAM,cAAc,KAAK,YAAY;AAAA,MACnC,oCAAW;AAAA,MACX,EAAE,WAAW,KAAK,cAAc,YAAY;AAAA,IAC9C;AACA,SAAK,QAAQ,KAAK,oCAAW,iBAAiB;AAAA,MAC5C,MAAM,oCAAW;AAAA,MACjB,SAAS,EAAE,QAAQ,YAAY;AAAA,IACjC,CAAC;AACD,UAAM,WAAW,MAAM,KAAK,iBAAiB,oCAAW,iBAAiB,aAAa,MAAM;AAC5F,WAAO,EAAE,QAAQ,SAAS,QAAQ,QAAQ,SAAS,OAAO;AAAA,EAC5D;AAAA,EAEA,MAAc,kBACZ,WACA,QACA,QACA,QAC8B;AAC9B,QAAI,CAAC,KAAK,eAAe;AACvB,gBAAM,yCAAe;AAAA,QACnB,MAAM,2CAAkB;AAAA,QACxB,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AACA,QAAI,KAAK,uBAAuB,KAAK,KAAK,wBAAwB,OAAO,GAAG;AAC1E,gBAAM,yCAAe;AAAA,QACnB,MAAM,2CAAkB;AAAA,QACxB,SAAS,sCAAsC,MAAM;AAAA,MACvD,CAAC;AAAA,IACH;AAGA,QAAI,QAAQ,SAAS;AACnB,YAAM,OAAO,kBAAkB,QAC3B,OAAO,aACP,yCAAe;AAAA,QACb,MAAM,2CAAkB;AAAA,QACxB,SAAS;AAAA,MACX,CAAC;AAAA,IACP;AACA,UAAM,mBAAmB,KAAK,oBAAoB,QAAQ,SAAS,EAAE;AACrE,QAAI;AACJ,QAAI;AACF,gBAAU,KAAK,cAAc,KAAK,WAAW,QAAQ,MAAM,EAAE,QAAQ,gBAAgB;AAAA,IACvF,SAAS,OAAO;AACd,uBAAiB;AACjB,YAAM;AAAA,IACR;AACA,WAAO,SAAS,iBAAgB,WAAW,QAAQ,OAAO,IAAI;AAAA,EAChE;AAAA,EAEQ,gBAAgB,MAA0C;AAChE,UAAM,WAAW,KAAK;AACtB,QAAI,cAA0B,MAAM;AACpC,SAAK,mBAAmB,IAAI,QAAc,aAAW;AACnD,oBAAc;AAAA,IAChB,CAAC;AACD,SAAK,wBAAwB;AAC7B,YAAQ,YAAY;AAClB,UAAI;AACF,cAAM;AACN,cAAM,KAAK,6BAA6B;AACxC,cAAM,KAAK;AAAA,MACb,UAAE;AACA,aAAK,wBAAwB;AAC7B,oBAAY;AAAA,MACd;AAAA,IACF,GAAG;AAAA,EACL;AAAA,EAEQ,+BAA8C;AACpD,QAAI,KAAK,wBAAwB,SAAS,EAAG,QAAO,QAAQ,QAAQ;AACpE,WAAO,IAAI,QAAQ,aAAW;AAC5B,WAAK,gBAAgB,IAAI,OAAO;AAAA,IAClC,CAAC;AAAA,EACH;AAAA,EAEQ,oBAAoB,KAAyB;AACnD,SAAK,wBAAwB,IAAI,MAAM,KAAK,wBAAwB,IAAI,GAAG,KAAK,KAAK,CAAC;AACtF,QAAI,WAAW;AACf,WAAO,MAAM;AACX,UAAI,SAAU;AACd,iBAAW;AACX,YAAM,aAAa,KAAK,wBAAwB,IAAI,GAAG,KAAK,KAAK;AACjE,UAAI,YAAY,GAAG;AACjB,aAAK,wBAAwB,IAAI,KAAK,SAAS;AAAA,MACjD,OAAO;AACL,aAAK,wBAAwB,OAAO,GAAG;AAAA,MACzC;AACA,UAAI,KAAK,wBAAwB,SAAS,GAAG;AAC3C,mBAAW,WAAW,KAAK,gBAAiB,SAAQ;AACpD,aAAK,gBAAgB,MAAM;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAe,WAAc,QAAqB,SAAiC;AACjF,UAAM,cAAc,MAClB,OAAO,kBAAkB,QAAQ,OAAO,SAAS,IAAI,MAAM,SAAS;AACtE,QAAI,OAAO,QAAS,QAAO,QAAQ,OAAO,YAAY,CAAC;AACvD,WAAO,IAAI,QAAW,CAAC,SAAS,WAAW;AACzC,YAAM,UAAU,MAAM,OAAO,YAAY,CAAC;AAC1C,aAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AACxD,cAAQ;AAAA,QACN,WAAS;AACP,iBAAO,oBAAoB,SAAS,OAAO;AAC3C,kBAAQ,KAAK;AAAA,QACf;AAAA,QACA,WAAS;AACP,iBAAO,oBAAoB,SAAS,OAAO;AAC3C,iBAAO,KAAK;AAAA,QACd;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,OAAe,gBAAgB,QAAuC;AACpE,QAAI,QAAQ,SAAS;AACnB,YAAM,OAAO,kBAAkB,QAAQ,OAAO,SAAS,IAAI,MAAM,mBAAmB;AAAA,IACtF;AAAA,EACF;AAAA,EAEA,OAAe,wBAAwB,UAAkB,QAAuB;AAC9E,QAAI,UAAU,OAAO,YAAY,MAAM,SAAS,YAAY,GAAG;AAC7D,gBAAM,yCAAe;AAAA,QACnB,MAAM,2CAAkB;AAAA,QACxB,SACE;AAAA,MACJ,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,aAAgB,QAAgB,QAAsC;AAC5E,WAAO,QAAQ;AAAA,UACb;AAAA,QACE,2CAAkB;AAAA,QAClB,mBAAmB,MAAM,4BAA4B,MAAM;AAAA,MAC7D;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,gBAAmB,KAA2B;AACpD,QAAI,OAAO,OAAO,QAAQ,UAAU;AAClC,YAAM,IAAI;AASV,UAAI,OAAO,EAAE,SAAS,YAAY,EAAE,QAAQ,OAAS,EAAE,QAAQ,OAAO;AACpE,cAAM,EAAE,OAAO,IAAI;AACnB,mBAAO;AAAA,UACL,EAAE;AAAA,UACF,EAAE,WAAW;AAAA,UACb,EAAE;AAAA,UACF,WAAW,YAAY,WAAW,eAAe,WAAW,SAAS,SAAS;AAAA,cAC9E,4CAAkB,EAAE,QAAQ,IAAI,EAAE,WAAW;AAAA,QAC/C;AAAA,MACF;AACA,UAAI,EAAE,SAAS,qDAA4B,EAAE,SAAS,mDAA0B;AAC9E,mBAAO;AAAA,UACL,2CAAkB;AAAA,UAClB,EAAE,WAAW;AAAA,QACf;AAAA,MACF;AACA,UAAI,EAAE,SAAS,iDAAwB;AACrC,mBAAO;AAAA,UACL,2CAAkB;AAAA,UAClB,EAAE,WAAW;AAAA,QACf;AAAA,MACF;AAAA,IACF;AACA,UAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAE/D,UAAM,SAAS,eAAe,SAAS,IAAI,QAAQ,EAAE,OAAO,IAAI,MAAM,IAAI;AAC1E,eAAO,kCAAQ,2CAAkB,cAAc,SAAS,MAAM;AAAA,EAChE;AACF;","names":["import_bc_ur_registry","decodeToDataItem","decodeToDataItem","HDKey","uuidParse","uuidStringify","bs58check","import_uuid","import_hwk_adapter_core","import_hwk_adapter_core","resolveGenericHardwareOperationTarget","bs58","uuidv4","displayDevice"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/urEngine/KeystoneUrEngine.ts","../src/urEngine/TronSignRequest.ts","../src/urEngine/TronSignature.ts","../src/adapter/KeystoneAdapter.ts","../src/adapter/pathUtils.ts","../src/adapter/deviceTable.ts","../src/utils/queueKey.ts"],"sourcesContent":["// UR engine, shared by QR and USB since both carry the same UR payloads.\nexport { KeystoneUrEngine } from './urEngine/KeystoneUrEngine';\nexport type {\n BtcScriptType,\n KeystoneBtcSignatureResult,\n KeystoneBtcSignRequestAccount,\n KeystoneDerivationCurve,\n KeystoneEthSignatureResult,\n KeystoneEthSignRequestInput,\n KeystoneKeyDerivationRequestInput,\n KeystoneKeySchema,\n KeystoneParsedAccount,\n KeystoneParsedMultiAccounts,\n KeystoneSolSignatureResult,\n KeystoneSolSignRequestInput,\n KeystoneTronSignatureResult,\n KeystoneTronSignRequestInput,\n KeystoneUr,\n} from './urEngine/types';\n\n// Adapter\nexport { KeystoneAdapter } from './adapter/KeystoneAdapter';\nexport type { ImportFromQrOptions } from './adapter/KeystoneAdapter';\nexport {\n KEYSTONE_COLD_START_PATH,\n KEYSTONE_WALLET_CONNECT_ID_PREFIX,\n accountKey,\n createDeviceRecord,\n placeholderDeviceInfo,\n toDeviceInfo,\n walletConnectId,\n} from './adapter/deviceTable';\nexport type { KeystoneAccountEntry, KeystoneDeviceRecord } from './adapter/deviceTable';\nexport { btcScriptTypeFromPath, normalizePath, splitAccountPath } from './adapter/pathUtils';\n","import { generateAddressFromXpub } from '@keystonehq/bc-ur-registry-eth';\nimport { Curve, KeystoneSDK, QRHardwareCallVersion, UR } from '@keystonehq/keystone-sdk';\nimport bs58check from 'bs58check';\nimport * as bitcoin from 'bitcoinjs-lib';\nimport HDKey from 'hdkey';\nimport { parse as uuidParse, stringify as uuidStringify } from 'uuid';\nimport { parseWalletMasterFingerprint } from '@onekeyfe/hwk-adapter-core';\n\nimport { TronSignRequest, TronSignType } from './TronSignRequest';\nimport { TronSignature } from './TronSignature';\n\nimport type {\n BtcScriptType,\n KeystoneBtcSignRequestAccount,\n KeystoneBtcSignatureResult,\n KeystoneEthSignRequestInput,\n KeystoneEthSignatureResult,\n KeystoneKeyDerivationRequestInput,\n KeystoneParsedAccount,\n KeystoneParsedMultiAccounts,\n KeystoneSolSignRequestInput,\n KeystoneSolSignatureResult,\n KeystoneTronSignRequestInput,\n KeystoneTronSignatureResult,\n KeystoneUr,\n} from './types';\n\n/** TRON's own address-version byte, prepended before base58check encoding. */\nconst TRON_ADDRESS_PREFIX = 0x41;\n\nfunction stripHexPrefix(hex: string): string {\n return hex.replace(/^0x/i, '');\n}\n\nconst ETH_DATA_TYPE = {\n transaction: 1,\n typedData: 2,\n personalMessage: 3,\n typedTransaction: 4,\n} as const;\n\nconst DERIVATION_CURVE = {\n secp256k1: Curve.secp256k1,\n ed25519: Curve.ed25519,\n} as const;\n\nfunction toSdkUr(ur: KeystoneUr): UR {\n return new UR(Buffer.from(ur.urData, 'hex'), ur.urType);\n}\n\nfunction fromSdkUr(ur: UR): KeystoneUr {\n return { urType: ur.type, urData: ur.cbor.toString('hex') };\n}\n\n/**\n * r(32) | s(32) | v. A legacy EIP-155 tx's v is 35 + 2 * chainId + recId, so it\n * outgrows one byte from chainId 110 on; a short answer must still fail here.\n */\nfunction splitEvmSignature(hex: string): { r: string; s: string; v: string } {\n if (hex.length < 130 || hex.length % 2 !== 0) {\n throw new Error(\n `Keystone returned a ${hex.length / 2}-byte signature; expected at least 65 bytes (r|s|v)`\n );\n }\n return { r: hex.slice(0, 64), s: hex.slice(64, 128), v: hex.slice(128) };\n}\n\n/** Same short-answer guard as `splitEvmSignature` for chains whose signature is one fixed-length blob. */\nfunction requireSignatureBytes(hex: string, expectedBytes: number, chain: string): string {\n if (hex.length !== expectedBytes * 2) {\n throw new Error(\n `Keystone returned a ${\n hex.length / 2\n }-byte ${chain} signature; expected ${expectedBytes} bytes`\n );\n }\n return hex;\n}\n\n// The registry decodes a missing mfp as four zero bytes; that is never a usable wallet identity.\nfunction requireBip32MasterFingerprint(value: unknown): string {\n const fingerprint = parseWalletMasterFingerprint(value);\n if (!fingerprint) {\n throw new Error('Keystone master fingerprint must be exactly 4 bytes (8 hex characters)');\n }\n return fingerprint;\n}\n\nfunction toParsedAccount(key: ReturnType<KeystoneSDK['parseHDKey']>): KeystoneParsedAccount {\n return {\n chain: key.chain,\n path: key.path,\n publicKey: key.publicKey,\n extendedPublicKey: key.extendedPublicKey,\n xfp: key.xfp ? requireBip32MasterFingerprint(key.xfp) : undefined,\n name: key.name,\n };\n}\n\n/** Relative derivation path in the `m/`-prefixed form the xpub helpers expect. */\nfunction relativeHdPath(relativeDerivePath: string): string {\n return `m/${relativeDerivePath.replace(/^m\\//i, '')}`;\n}\n\n/**\n * Single touch point with `@keystonehq/keystone-sdk`, shared by QR and USB. Uses the bare\n * constructor: `KeystoneSDK.create()` fetches remote config at call time.\n */\nexport class KeystoneUrEngine {\n private readonly sdk: KeystoneSDK;\n\n constructor(origin = 'OneKey') {\n this.sdk = new KeystoneSDK({ origin });\n }\n\n // --- Account sync (device-initiated export or KeyDerivation response) ---\n\n parseMultiAccounts(ur: KeystoneUr): KeystoneParsedMultiAccounts {\n const parsed = this.sdk.parseMultiAccounts(toSdkUr(ur));\n return {\n masterFingerprint: requireBip32MasterFingerprint(parsed.masterFingerprint),\n device: parsed.device,\n deviceId: parsed.deviceId,\n deviceVersion: parsed.deviceVersion,\n accounts: parsed.keys.map(toParsedAccount),\n };\n }\n\n parseHDKey(ur: KeystoneUr): KeystoneParsedAccount {\n return toParsedAccount(this.sdk.parseHDKey(toSdkUr(ur)));\n }\n\n /**\n * Builds a KeyDerivation request. `version: V1` is required: firmware validates V0 (the SDK\n * default) as Cardano-only and rejects other paths with `PRS_PARSING_ERROR`.\n */\n buildKeyDerivationRequest(input: KeystoneKeyDerivationRequestInput): KeystoneUr {\n const ur = this.sdk.generateKeyDerivationCall({\n schemas: input.schemas.map(schema => ({\n path: schema.path,\n curve: DERIVATION_CURVE[schema.curve ?? 'secp256k1'],\n })),\n origin: input.origin,\n version: QRHardwareCallVersion.V1,\n });\n return fromSdkUr(ur);\n }\n\n /**\n * Normalizes `crypto-multi-accounts` and the single-key `crypto-hdkey` some firmware returns. The\n * hdkey source fingerprint is the mfp only because every request here derives from the seed.\n */\n parseAccountResponse(ur: KeystoneUr): KeystoneParsedMultiAccounts {\n if (ur.urType === 'crypto-hdkey') {\n const account = this.parseHDKey(ur);\n if (!account.xfp) {\n throw new Error('Keystone crypto-hdkey response is missing its source fingerprint');\n }\n return {\n masterFingerprint: requireBip32MasterFingerprint(account.xfp),\n accounts: [account],\n };\n }\n return this.parseMultiAccounts(ur);\n }\n\n // --- EVM ---\n\n buildEthSignRequest(input: KeystoneEthSignRequestInput): KeystoneUr {\n const ur = this.sdk.eth.generateSignRequest({\n requestId: input.requestId,\n signData: input.unsignedTxHex,\n dataType: ETH_DATA_TYPE[input.dataType],\n path: input.path,\n xfp: input.xfp,\n chainId: input.chainId,\n address: input.address,\n origin: input.origin,\n });\n return fromSdkUr(ur);\n }\n\n parseEthSignature(ur: KeystoneUr): KeystoneEthSignatureResult {\n const signature = this.sdk.eth.parseSignature(toSdkUr(ur));\n return { requestId: signature.requestId, ...splitEvmSignature(signature.signature) };\n }\n\n /** Derives an EVM address offline; `relativeDerivePath` is relative to the xpub, e.g. `'0/0'`. */\n deriveEvmAddressFromXpub(xpub: string, relativeDerivePath: string): string {\n return generateAddressFromXpub(xpub, relativeHdPath(relativeDerivePath));\n }\n\n // --- BTC (PSBT transaction signing + plain message signing) ---\n\n /**\n * `CryptoHDKey` always emits mainnet xpub version bytes (`0488B21E`), so `hdkey` parses it as is.\n * `p2tr` needs an ECC lib for BIP-341 tweaking, not wired here.\n */\n deriveBtcAddressFromXpub(\n xpub: string,\n relativeDerivePath: string,\n scriptType: BtcScriptType\n ): string {\n const node = HDKey.fromExtendedKey(xpub).derive(relativeHdPath(relativeDerivePath));\n if (!node.publicKey) throw new Error('HDKey derivation did not produce a public key');\n return this.deriveBtcAddressFromPublicKey(\n Buffer.from(node.publicKey).toString('hex'),\n scriptType\n );\n }\n\n deriveBtcAddressFromPublicKey(publicKeyHex: string, scriptType: BtcScriptType): string {\n const pubkey = Buffer.from(stripHexPrefix(publicKeyHex), 'hex');\n const network = bitcoin.networks.bitcoin;\n\n switch (scriptType) {\n case 'p2pkh': {\n const { address } = bitcoin.payments.p2pkh({ pubkey, network });\n if (!address) throw new Error('Failed to derive a P2PKH address from this public key');\n return address;\n }\n case 'p2sh-p2wpkh': {\n const { address } = bitcoin.payments.p2sh({\n redeem: bitcoin.payments.p2wpkh({ pubkey, network }),\n network,\n });\n if (!address)\n throw new Error('Failed to derive a P2SH-P2WPKH address from this public key');\n return address;\n }\n case 'p2wpkh': {\n const { address } = bitcoin.payments.p2wpkh({ pubkey, network });\n if (!address) throw new Error('Failed to derive a P2WPKH address from this public key');\n return address;\n }\n case 'p2tr':\n throw new Error(\n 'BTC P2TR (taproot) address derivation is not supported yet — needs an elliptic-curve library for BIP-341 tweaking'\n );\n default: {\n const exhaustive: never = scriptType;\n throw new Error(`Unsupported BTC script type: ${String(exhaustive)}`);\n }\n }\n }\n\n buildBtcPsbtRequest(unsignedPsbtHex: string): KeystoneUr {\n const ur = this.sdk.btc.generatePSBT(Buffer.from(unsignedPsbtHex, 'hex'));\n return fromSdkUr(ur);\n }\n\n /** Returns the hex-encoded (possibly still-unsigned-in-part) PSBT the device replied with. */\n parseBtcPsbt(ur: KeystoneUr): string {\n return this.sdk.btc.parsePSBT(toSdkUr(ur));\n }\n\n buildBtcMessageSignRequest(params: {\n requestId: string;\n /** Hex, no 0x prefix. */\n messageHex: string;\n accounts: KeystoneBtcSignRequestAccount[];\n origin?: string;\n }): KeystoneUr {\n const ur = this.sdk.btc.generateSignRequest({\n requestId: params.requestId,\n signData: params.messageHex,\n dataType: 1, // BtcSignRequest.DataType.message; PSBT signing never goes through this path.\n accounts: params.accounts,\n origin: params.origin,\n });\n return fromSdkUr(ur);\n }\n\n parseBtcSignature(ur: KeystoneUr): KeystoneBtcSignatureResult {\n const signature = this.sdk.btc.parseSignature(toSdkUr(ur));\n return {\n requestId: signature.requestId,\n publicKey: signature.publicKey,\n signature: signature.signature,\n };\n }\n\n // --- SOL ---\n\n buildSolSignRequest(input: KeystoneSolSignRequestInput): KeystoneUr {\n const ur = this.sdk.sol.generateSignRequest({\n requestId: input.requestId,\n signData: input.unsignedPayloadHex,\n dataType: input.dataType === 'transaction' ? 1 : 2,\n path: input.path,\n xfp: input.xfp,\n address: input.address,\n origin: input.origin,\n });\n return fromSdkUr(ur);\n }\n\n parseSolSignature(ur: KeystoneUr): KeystoneSolSignatureResult {\n const signature = this.sdk.sol.parseSignature(toSdkUr(ur));\n return {\n requestId: signature.requestId,\n signature: requireSignatureBytes(signature.signature, 64, 'SOL'),\n };\n }\n\n // --- TRON ---\n\n /**\n * Keystone's native tron-sign-request/tron-signature pair (bare signature).\n * `sdk.tron` from keystone-sdk is the older protobuf envelope; not used.\n */\n buildTronSignRequest(input: KeystoneTronSignRequestInput): KeystoneUr {\n const request = new TronSignRequest({\n requestId: Buffer.from(uuidParse(input.requestId) as Uint8Array),\n signData: Buffer.from(stripHexPrefix(input.rawTxHex), 'hex'),\n signType: input.signType ?? TronSignType.Transaction,\n derivationPath: TronSignRequest.parsePath(input.path, input.xfp),\n origin: input.origin,\n });\n return fromSdkUr(request.toUR());\n }\n\n parseTronSignature(ur: KeystoneUr): KeystoneTronSignatureResult {\n if (ur.urType !== 'tron-signature') {\n throw new Error(`Expected a tron-signature UR, got ${ur.urType}`);\n }\n const signature = TronSignature.fromCBOR(Buffer.from(ur.urData, 'hex'));\n const requestId = signature.getRequestId();\n return {\n requestId: requestId ? uuidStringify(requestId) : undefined,\n signature: requireSignatureBytes(signature.getSignature().toString('hex'), 65, 'TRON'),\n };\n }\n\n /**\n * TRON uses the same 20 address bytes as EVM (Keystone's `formatAddress()`), re-encoded as\n * base58check with the `0x41` version byte.\n */\n deriveTronAddressFromXpub(xpub: string, relativeDerivePath: string): string {\n const evmStyleHex = generateAddressFromXpub(xpub, relativeHdPath(relativeDerivePath)) as string;\n const addressBytes = Buffer.concat([\n Buffer.from([TRON_ADDRESS_PREFIX]),\n Buffer.from(stripHexPrefix(evmStyleHex), 'hex'),\n ]);\n return bs58check.encode(addressBytes);\n }\n\n /** Decodes an xpub's BIP-32 fields; `parentFingerprint` is the parent key's, not the mfp. */\n parseXpubMeta(xpub: string): {\n publicKey: string;\n chainCode: string;\n depth: number;\n parentFingerprint: number;\n } {\n // Decoded by hand because `@types/hdkey` lacks depth/parentFingerprint. BIP-32 layout:\n // [0..4) version | [4] depth | [5..9) parentFingerprint\n // [9..13) childNumber | [13..45) chainCode | [45..78) publicKey\n const raw = Buffer.from(bs58check.decode(xpub));\n if (raw.length !== 78) {\n throw new Error(`Keystone xpub did not decode to a 78-byte BIP-32 key (got ${raw.length})`);\n }\n return {\n publicKey: raw.subarray(45, 78).toString('hex'),\n chainCode: raw.subarray(13, 45).toString('hex'),\n depth: raw.readUInt8(4),\n parentFingerprint: raw.readUInt32BE(5),\n };\n }\n}\n","import {\n CryptoKeypath,\n DataItem,\n PathComponent,\n RegistryItem,\n RegistryType,\n RegistryTypes,\n extend,\n} from '@keystonehq/bc-ur-registry';\n\nimport type { DataItemMap } from '@keystonehq/bc-ur-registry';\n\nconst { decodeToDataItem } = extend;\n\n/**\n * Native `tron-sign-request` (tag 5201), keyed as keystone-sdk-rust ur-registry/tron (firmware\n * >= 2.5.0); OneKey Pro's air-gap layout is rejected by Keystone.\n */\nconst TRON_SIGN_REQUEST_TYPE = new RegistryType('tron-sign-request', 5201);\n\nenum RequestKeys {\n requestId = 1,\n signData,\n dataType,\n derivationPath,\n address,\n origin,\n}\n\n/** Keystone `DataType`: 1 = transaction, 2 = personal message. */\nexport enum TronSignType {\n Transaction = 1,\n PersonalMessage = 2,\n}\n\ninterface TronSignRequestProps {\n requestId?: Buffer;\n signData: Buffer;\n signType: TronSignType;\n derivationPath: CryptoKeypath;\n address?: Buffer;\n origin?: string;\n}\n\nexport class TronSignRequest extends RegistryItem {\n private readonly requestId?: Buffer;\n\n private readonly signData: Buffer;\n\n private readonly signType: TronSignType;\n\n private readonly derivationPath: CryptoKeypath;\n\n private readonly address?: Buffer;\n\n private readonly origin?: string;\n\n getRegistryType = (): RegistryType => TRON_SIGN_REQUEST_TYPE;\n\n constructor(args: TronSignRequestProps) {\n super();\n this.requestId = args.requestId;\n this.signData = args.signData;\n this.derivationPath = args.derivationPath;\n this.address = args.address;\n this.origin = args.origin;\n this.signType = args.signType;\n }\n\n getRequestId = (): Buffer | undefined => this.requestId;\n\n getSignData = (): Buffer => this.signData;\n\n getSignType = (): TronSignType => this.signType;\n\n getDerivationPath = (): string => this.derivationPath.getPath();\n\n getOrigin = (): string | undefined => this.origin;\n\n toDataItem = (): DataItem => {\n const map: DataItemMap = {};\n if (this.requestId) {\n map[RequestKeys.requestId] = new DataItem(this.requestId, RegistryTypes.UUID.getTag());\n }\n if (this.address) map[RequestKeys.address] = this.address;\n if (this.origin) map[RequestKeys.origin] = this.origin;\n map[RequestKeys.signData] = this.signData;\n map[RequestKeys.dataType] = this.signType;\n const keyPath = this.derivationPath.toDataItem();\n keyPath.setTag(this.derivationPath.getRegistryType().getTag());\n map[RequestKeys.derivationPath] = keyPath;\n return new DataItem(map);\n };\n\n static fromDataItem(dataItem: DataItem): TronSignRequest {\n const map = dataItem.getData() as Record<number, unknown>;\n const signData = map[RequestKeys.signData] as Buffer;\n const derivationPath = CryptoKeypath.fromDataItem(map[RequestKeys.derivationPath] as DataItem);\n const address = map[RequestKeys.address] as Buffer | undefined;\n const requestIdItem = map[RequestKeys.requestId] as DataItem | undefined;\n const requestId = requestIdItem?.getData() as Buffer | undefined;\n const origin = map[RequestKeys.origin] as string | undefined;\n const signType = map[RequestKeys.dataType] as TronSignType;\n return new TronSignRequest({ requestId, signData, derivationPath, address, origin, signType });\n }\n\n static fromCBOR(cborPayload: Buffer): TronSignRequest {\n return TronSignRequest.fromDataItem(decodeToDataItem(cborPayload));\n }\n\n static parsePath(path: string, xfp: string): CryptoKeypath {\n const segments = path.replace(/^[mM]\\//, '').split('/');\n const components = segments.map(segment => {\n const hardened = segment.endsWith(\"'\");\n return new PathComponent({\n index: parseInt(hardened ? segment.slice(0, -1) : segment, 10),\n hardened,\n });\n });\n return new CryptoKeypath(components, Buffer.from(xfp, 'hex'));\n }\n}\n","import {\n DataItem,\n RegistryItem,\n RegistryType,\n RegistryTypes,\n extend,\n} from '@keystonehq/bc-ur-registry';\n\nimport type { DataItemMap } from '@keystonehq/bc-ur-registry';\n\nconst { decodeToDataItem } = extend;\n\n/** Response half of the `tron-sign-request` (5201) pair, registry type 5202. */\nconst TRON_SIGNATURE_TYPE = new RegistryType('tron-signature', 5202);\n\nenum SignatureKeys {\n requestId = 1,\n signature,\n}\n\nexport class TronSignature extends RegistryItem {\n private readonly requestId?: Buffer;\n\n private readonly signatureBytes: Buffer;\n\n getRegistryType = (): RegistryType => TRON_SIGNATURE_TYPE;\n\n constructor(signature: Buffer, requestId?: Buffer) {\n super();\n this.signatureBytes = signature;\n this.requestId = requestId;\n }\n\n getRequestId = (): Buffer | undefined => this.requestId;\n\n getSignature = (): Buffer => this.signatureBytes;\n\n toDataItem = (): DataItem => {\n const map: DataItemMap = {};\n if (this.requestId) {\n map[SignatureKeys.requestId] = new DataItem(this.requestId, RegistryTypes.UUID.getTag());\n }\n map[SignatureKeys.signature] = this.signatureBytes;\n return new DataItem(map);\n };\n\n static fromDataItem(dataItem: DataItem): TronSignature {\n const map = dataItem.getData() as Record<number, unknown>;\n const signature = map[SignatureKeys.signature] as Buffer;\n if (!Buffer.isBuffer(signature)) {\n throw new Error('Keystone tron-signature UR is missing its signature bytes');\n }\n const requestIdItem = map[SignatureKeys.requestId] as DataItem | undefined;\n const requestId = requestIdItem?.getData() as Buffer | undefined;\n return new TronSignature(signature, requestId);\n }\n\n static fromCBOR(cborPayload: Buffer): TronSignature {\n return TronSignature.fromDataItem(decodeToDataItem(cborPayload));\n }\n}\n","import bs58 from 'bs58';\nimport { v4 as uuidv4 } from 'uuid';\nimport {\n CHAIN_FINGERPRINT_PATHS,\n DEVICE,\n DeviceJobQueue,\n HardwareErrorCode,\n MISSING_BIP32_MASTER_FINGERPRINT,\n OperationRegistry,\n SDK,\n TypedEventEmitter,\n UI_REQUEST,\n UI_REQUEST_CANCELLED_TAG,\n UI_REQUEST_PREEMPTED_TAG,\n UI_REQUEST_TIMEOUT_TAG,\n UI_RESPONSE,\n UiRequestRegistry,\n createHardwareSearchTargetId,\n createHwkError,\n deriveDeviceFingerprint,\n ensure0x,\n failure,\n getAllNetworkMethodChain,\n hasHardwareRuntimeIdPrefix,\n isAllNetworkMethodName,\n isConnectionLost,\n isHardwareOperationId,\n isHwkRecoveryHint,\n isUserRefusal,\n operationMayHaveCompletedParams,\n parseBip32MasterFingerprint,\n parseWalletMasterFingerprint,\n rehydrateConnectorError,\n resolveHardwareOperationTarget as resolveGenericHardwareOperationTarget,\n runAllNetworkGetAddress,\n stripHex,\n success,\n} from '@onekeyfe/hwk-adapter-core';\n\nimport { KeystoneUrEngine } from '../urEngine/KeystoneUrEngine';\nimport { TronSignType } from '../urEngine/TronSignRequest';\nimport {\n KEYSTONE_COLD_START_PATH,\n accountKey,\n createDeviceRecord,\n placeholderDeviceInfo,\n toDeviceInfo,\n walletConnectId,\n} from './deviceTable';\nimport {\n KEYSTONE_BTC_ACCOUNT_FORBIDDEN_MESSAGE,\n btcScriptTypeFromPath,\n isKeystoneSignableBtcAccountPath,\n normalizePath,\n splitAccountPath,\n} from './pathUtils';\nimport {\n KEYSTONE_COLD_START_JOB_LABEL,\n keystoneCancelQueueKeys,\n keystoneMfpFromIdentifier,\n keystoneQueueKey,\n} from '../utils/queueKey';\n\nimport type { KeystoneKeySchema, KeystoneParsedMultiAccounts, KeystoneUr } from '../urEngine/types';\nimport type { KeystoneAccountEntry, KeystoneDeviceRecord } from './deviceTable';\nimport type {\n AllNetworkAddressParams,\n AllNetworkAddressResponse,\n AllNetworkGetAddressParams,\n BtcAddress,\n BtcGetAddressParams,\n BtcGetPublicKeyParams,\n BtcPublicKey,\n BtcSignMsgParams,\n BtcSignPsbtParams,\n BtcSignTxParams,\n BtcSignature,\n BtcSignedPsbt,\n BtcSignedTx,\n CancelScopeHandle,\n ChainCapability,\n ChainForFingerprint,\n ConnectionTarget,\n ConnectorCallResult,\n ConnectorConnectTarget,\n ConnectorDevice,\n ConnectorEventMap,\n DeviceEventListener,\n DeviceInfo,\n DeviceSearchTarget,\n EvmAddress,\n EvmGetAddressParams,\n EvmSignMsgParams,\n EvmSignTxParams,\n EvmSignTypedDataParams,\n EvmSignature,\n EvmSignedTx,\n HardwareEvent,\n HardwareEventMap,\n IConnector,\n IHardwareCallParams,\n IHardwareCommonCallParams,\n IHardwareWallet,\n NullableCallArg,\n QrDisplayData,\n Response,\n SearchDevicesOptions,\n SolAddress,\n SolGetAddressParams,\n SolSignMsgParams,\n SolSignTxParams,\n SolSignature,\n SolSignedTx,\n TransportType,\n TronAddress,\n TronGetAddressParams,\n TronSignMsgParams,\n TronSignTxParams,\n TronSignature,\n TronSignedTx,\n UiResponseEvent,\n} from '@onekeyfe/hwk-adapter-core';\n\n/** Key material for one operation, keyed by `accountKey()`; never retained. */\ntype AccountBook = Map<string, KeystoneAccountEntry>;\n\ntype OperationRoute = { operationId: string; connectionType: 'usb' | 'qr' };\n\ntype ExpectedWallet = { expectedMasterFingerprint?: string };\n\n// Keystone briefly leaves the USB bus when entering external-wallet mode, so a persisted-wallet\n// call must wait out re-enumeration instead of falling back to QR on one empty snapshot.\nconst KEYSTONE_USB_REATTACH_PROBE_ATTEMPTS = 4;\nconst KEYSTONE_USB_REATTACH_PROBE_INTERVAL_MS = 500;\n\nfunction resolveHardwareOperationTarget(\n positionalTargetId: string | null | undefined,\n operationId: string | null | undefined\n) {\n return resolveGenericHardwareOperationTarget(positionalTargetId, operationId, 'keystone');\n}\n\nfunction keySchema(chain: string, path: string): KeystoneKeySchema {\n return { path, curve: chain === 'sol' ? 'ed25519' : 'secp256k1' };\n}\n\nfunction waitForKeystoneUsbReattachProbe(): Promise<void> {\n return new Promise(resolve => {\n setTimeout(resolve, KEYSTONE_USB_REATTACH_PROBE_INTERVAL_MS);\n });\n}\n\n/** UserAborted is a top-level abort code, so this ends the bundle. */\nfunction buildCancelledFailure<T>(signal: AbortSignal): Response<T> {\n const reason = signal.reason as { code?: unknown; message?: unknown } | undefined;\n const code =\n typeof reason?.code === 'number'\n ? (reason.code as HardwareErrorCode)\n : HardwareErrorCode.UserAborted;\n const message = typeof reason?.message === 'string' ? reason.message : '';\n return failure(code, message || 'All-network get-address cancelled');\n}\n\nconst BIP44_COIN_TYPE_TO_CHAIN: Record<number, ChainCapability> = {\n 60: 'evm',\n 0: 'btc',\n 501: 'sol',\n 195: 'tron',\n};\n\n/**\n * Classifies a returned account by BIP44 coin type (2nd segment), not by\n * purpose, so 44'/49'/84'/86' BTC entries all map to `btc`.\n */\nfunction inferHwkChainFromPath(path: string): ChainCapability | undefined {\n const match = normalizePath(path).match(/^m\\/\\d+'\\/(\\d+)'/);\n return match ? BIP44_COIN_TYPE_TO_CHAIN[Number(match[1])] : undefined;\n}\n\nexport interface ImportFromQrOptions {\n /**\n * 'request' asks the device for one account; 'scan' waits for whatever export it already shows.\n * Only the wallet's master fingerprint is learned either way.\n */\n mode?: 'request' | 'scan';\n}\n\n/**\n * QR and USB behind one `IHardwareWallet`, keyed by the wallet's BIP32 master fingerprint.\n * Key material is fetched per operation and never retained.\n */\nexport class KeystoneAdapter implements IHardwareWallet {\n readonly vendor = 'keystone' as const;\n\n // No protocol-level cancel exists over Keystone USB, and QR has no transport\n // to interrupt at all. Cancelling ends the wait, not the device's prompt.\n readonly cancelCapability = 'stops-waiting' as const;\n\n private readonly urEngine: KeystoneUrEngine;\n\n private readonly emitter = new TypedEventEmitter<HardwareEventMap>();\n\n private readonly _operationRoutes = new Map<string, OperationRoute>();\n\n private readonly _operations = new OperationRegistry({\n vendor: 'keystone',\n onEnded: (operation, reason) => {\n const route = this._operationRoutes.get(operation.connectId);\n if (route?.operationId === operation.operationId) {\n this._operationRoutes.delete(operation.connectId);\n }\n this.emitter.emit(SDK.OPERATION_ENDED, {\n type: SDK.OPERATION_ENDED,\n payload: { operationId: operation.operationId, reason },\n });\n if (reason === 'timeout') {\n this._releaseOperationConnection(operation).catch(() => undefined);\n }\n },\n });\n\n private readonly _uiRegistry = new UiRequestRegistry();\n\n private readonly _jobQueue: DeviceJobQueue;\n\n private readonly _devices = new Map<string, KeystoneDeviceRecord>();\n\n private readonly _searchDeviceTargets = new Map<string, 'usb' | 'qr'>();\n\n private _activeSearchGeneration: symbol | undefined;\n\n private readonly _origin: string;\n\n /** Host answer timeout for QR display/scan requests; undefined uses the registry default. */\n private readonly _qrTimeoutMs: number | undefined;\n\n /** Host-supplied USB connector; undefined means QR-only. */\n private readonly _usbConnector: IConnector | undefined;\n\n /** Serializes USB open/identity handshakes that run outside the job queue. */\n private _usbConnectTail: Promise<void> = Promise.resolve();\n\n private readonly _unsettledUsbOperations = new Map<string, number>();\n\n private readonly _usbIdleWaiters = new Set<() => void>();\n\n private _abandonedUsbConnects = 0;\n\n private _usbTeardownTail: Promise<void> = Promise.resolve();\n\n private _pendingUsbTeardowns = 0;\n\n /** `switchTransport` pin; undefined means USB when the wallet has a live session, else QR. */\n private _forcedTransport: 'qr' | 'usb' | undefined;\n\n private readonly _handleUsbDisconnect = ({ connectId }: { connectId: string }): void => {\n const record = Array.from(this._devices.values()).find(item => item.usbSessionId === connectId);\n if (!record) return;\n\n // QR operations for the same wallet do not depend on this USB session.\n this._operations.endByConnectionKey(connectId, 'disconnect');\n\n record.usbSessionId = undefined;\n const info = toDeviceInfo(record);\n if (record.qrSynced) {\n this.emitter.emit(DEVICE.CHANGED, { type: DEVICE.CHANGED, payload: info });\n } else {\n this._devices.delete(record.masterFingerprint);\n this.emitter.emit(DEVICE.DISCONNECT, { type: DEVICE.DISCONNECT, payload: info });\n }\n };\n\n private readonly _handleUsbUiEvent = (event: ConnectorEventMap['ui-event']): void => {\n this.emitter.emit('ui-event', event);\n };\n\n constructor(options?: { origin?: string; qrTimeoutMs?: number; usbConnector?: IConnector }) {\n this._origin = options?.origin ?? 'OneKey';\n this._qrTimeoutMs = options?.qrTimeoutMs;\n this.urEngine = new KeystoneUrEngine(this._origin);\n this._jobQueue = new DeviceJobQueue();\n this._usbConnector = options?.usbConnector;\n this._usbConnector?.on('device-disconnect', this._handleUsbDisconnect);\n // Relayed verbatim like the Ledger adapter, so hosts reuse one handler.\n this._usbConnector?.on('ui-event', this._handleUsbUiEvent);\n }\n\n // ---------------------------------------------------------------------------\n // Lifecycle / transport\n // ---------------------------------------------------------------------------\n\n get activeTransport(): TransportType | null {\n if (this._devices.size === 0) return null;\n const hasUsbSession = Array.from(this._devices.values()).some(r => r.usbSessionId);\n return hasUsbSession ? 'usb' : 'qr';\n }\n\n getAvailableTransports(): TransportType[] {\n return this._usbConnector ? ['qr', 'usb'] : ['qr'];\n }\n\n /** Pins calls to 'qr' or 'usb'; any other value clears the pin back to auto routing. */\n switchTransport(type: TransportType): Promise<void> {\n this._forcedTransport = type === 'qr' || type === 'usb' ? type : undefined;\n return Promise.resolve();\n }\n\n init(_config?: unknown): Promise<void> {\n return Promise.resolve();\n }\n\n async dispose(): Promise<void> {\n this._operations.endAll('runtime-reset');\n this._uiRegistry.cancel();\n this._jobQueue.clear();\n this._searchDeviceTargets.clear();\n await this._usbConnectTail;\n await this._resetUsbSessions();\n this._usbConnector?.off('device-disconnect', this._handleUsbDisconnect);\n this._usbConnector?.off('ui-event', this._handleUsbUiEvent);\n this._usbConnector?.reset();\n this._devices.clear();\n this.emitter.removeAllListeners();\n }\n\n // ---------------------------------------------------------------------------\n // Device table\n // ---------------------------------------------------------------------------\n\n /**\n * Returns known wallets plus USB scan results; USB entries have no mfp until `connectDevice()`\n * claims them. Explicit QR discovery returns one virtual target.\n */\n async searchDevices(options?: SearchDevicesOptions): Promise<DeviceInfo[]> {\n const searchGeneration = Symbol('keystone-device-search');\n this._activeSearchGeneration = searchGeneration;\n this._searchDeviceTargets.clear();\n if (options?.resetSession) {\n await this._resetUsbSessions();\n } else {\n await this._usbTeardownTail;\n }\n const known = Array.from(this._devices.values()).map(toDeviceInfo);\n\n // QR has nothing to enumerate; a virtual target keeps the search/connect flow\n // without a device round trip during discovery.\n if (options?.transportType === 'qr') {\n const searchTargetId = createHardwareSearchTargetId('keystone');\n this._searchDeviceTargets.set(searchTargetId, 'qr');\n return [\n {\n ...placeholderDeviceInfo(),\n model: '',\n connectId: searchTargetId,\n capabilities: { persistentDeviceIdentity: false },\n },\n ];\n }\n\n if (options?.transportType === 'ble') return [];\n if (!this._usbConnector) return options?.transportType === 'usb' ? [] : known;\n\n let usbDevices: ConnectorDevice[];\n try {\n usbDevices = await this._usbConnector.searchDevices();\n } catch (error) {\n // A failed USB scan (no WebUSB, no permission) must not hide known QR wallets.\n if (options?.transportType === 'usb') throw error;\n return known;\n }\n if (this._activeSearchGeneration !== searchGeneration) return [];\n const placeholders: DeviceInfo[] = usbDevices.map(d => ({\n vendor: 'keystone',\n // Empty, not 'unknown': all models share one vid/pid, and a placeholder\n // string would beat the host's default-name fallback.\n model: d.model ?? '',\n modelName: d.modelName,\n // Unknown until the device is opened.\n firmwareVersion: '0.0.0',\n deviceId: d.deviceId,\n connectId: d.connectId,\n connectionType: 'usb',\n label: d.name,\n serialNumber: d.serialNumber,\n capabilities: d.capabilities ?? { persistentDeviceIdentity: false },\n raw: d.raw,\n }));\n for (const placeholder of placeholders) {\n this._searchDeviceTargets.set(placeholder.connectId, 'usb');\n }\n return options?.transportType === 'usb' ? placeholders : [...known, ...placeholders];\n }\n\n private async _resetUsbSessions(): Promise<void> {\n await this._runUsbTeardown(async () => {\n await this._usbConnectTail;\n this._operations.endAll('runtime-reset');\n if (!this._usbConnector) return;\n\n const sessionIds = new Set(\n Array.from(this._devices.values())\n .map(record => record.usbSessionId)\n .filter((sessionId): sessionId is string => Boolean(sessionId))\n );\n for (const sessionId of sessionIds) {\n await this._retireUsbSession(sessionId);\n }\n });\n }\n\n /** Best-effort disconnect; the session is retired either way so it cannot be selected again. */\n private async _retireUsbSession(sessionId: string): Promise<void> {\n if (this._usbConnector) {\n try {\n await this._usbConnector.disconnect(sessionId);\n } catch {\n // Local routing state is cleared below regardless.\n }\n }\n this._handleUsbDisconnect({ connectId: sessionId });\n }\n\n async searchDeviceTargets(options?: SearchDevicesOptions): Promise<DeviceSearchTarget[]> {\n const devices = await this.searchDevices(options);\n return devices.map(device => ({\n searchTargetId: device.connectId,\n // The master fingerprint is known only after the USB/QR handshake.\n searchTargetReusePolicy: 'current-discovery',\n vendor: device.vendor,\n connectionType: device.connectionType,\n kind: device.connectionType === 'qr' ? 'interactive' : 'physical',\n label: device.label,\n model: device.model,\n modelName: device.modelName,\n serialNumber: device.serialNumber,\n }));\n }\n\n async listConnectionTargets(options?: SearchDevicesOptions): Promise<ConnectionTarget[]> {\n const targets = await this.searchDeviceTargets(options);\n return targets.map(({ searchTargetId, ...target }) => ({\n ...target,\n targetId: searchTargetId,\n }));\n }\n\n async connectDevice(searchTargetId: string): Promise<Response<string>> {\n const scope = this._jobQueue.createCancelScope(searchTargetId);\n try {\n let connected: Response<DeviceInfo>;\n let selectedConnectionType: 'usb' | 'qr';\n const discoveredConnectionType = this._searchDeviceTargets.get(searchTargetId);\n if (discoveredConnectionType === 'qr') {\n selectedConnectionType = 'qr';\n // The cold-start job queues under its own label; forward a cancel aimed\n // at this search target to it.\n const abortColdStart = () =>\n this._jobQueue.cancelActiveAndPending(\n KEYSTONE_COLD_START_JOB_LABEL,\n scope.signal.reason as Error\n );\n scope.signal.addEventListener('abort', abortColdStart, { once: true });\n try {\n connected = await this.importFromQr();\n } finally {\n scope.signal.removeEventListener('abort', abortColdStart);\n }\n } else if (discoveredConnectionType === 'usb') {\n selectedConnectionType = 'usb';\n if (!this._usbConnector) {\n return failure(\n HardwareErrorCode.TransportNotAvailable,\n 'No USB connector configured for this Keystone adapter'\n );\n }\n connected = await this._connectUsb({}, searchTargetId, scope.signal);\n } else if (hasHardwareRuntimeIdPrefix(searchTargetId)) {\n return failure(\n HardwareErrorCode.DeviceNotFound,\n 'Keystone search target has expired; search for devices again',\n undefined,\n undefined,\n { scope: 'search-target' }\n );\n } else {\n const target = this._resolveTarget(searchTargetId);\n if (target.record) {\n selectedConnectionType = target.record.usbSessionId ? 'usb' : 'qr';\n connected = success(toDeviceInfo(target.record));\n } else if (!this._usbConnector) {\n return failure(\n HardwareErrorCode.DeviceNotFound,\n `Unknown Keystone device search target: ${searchTargetId}`\n );\n } else {\n selectedConnectionType = 'usb';\n connected = await this._connectUsb(target, undefined, scope.signal);\n }\n }\n KeystoneAdapter._throwIfAborted(scope.signal);\n if (!connected.success) return connected;\n\n const record = this._devices.get(connected.payload.deviceId);\n this._operations.endByConnectionKey(connected.payload.connectId, 'explicit');\n const operation = this._operations.create({\n searchTargetId,\n connectId: connected.payload.connectId,\n device: connected.payload,\n connectionType: selectedConnectionType,\n connectionKeys:\n selectedConnectionType === 'usb' && record?.usbSessionId ? [record.usbSessionId] : [],\n });\n this._operationRoutes.set(connected.payload.connectId, {\n operationId: operation.operationId,\n connectionType: selectedConnectionType,\n });\n return success(operation.operationId);\n } catch (err) {\n return this._errorToFailure<string>(err);\n } finally {\n scope.release();\n }\n }\n\n /**\n * QR has nothing to tear down. A USB session is closed, and the record is demoted to QR-only or\n * removed if it was never QR-synced.\n */\n async releaseOperation(operationId: string): Promise<void> {\n const operation = this._operations.find(operationId);\n if (!operation) {\n this._operations.resolve(operationId);\n return;\n }\n const endedOperation = this._operations.end(operationId, 'explicit');\n if (!endedOperation) return;\n await this._releaseOperationConnection(endedOperation);\n }\n\n private async _releaseOperationConnection(\n operation: NonNullable<ReturnType<OperationRegistry['find']>>\n ): Promise<void> {\n const { connectId } = operation;\n let record: KeystoneDeviceRecord | undefined;\n try {\n record = this._resolveTarget(connectId).record;\n } catch {\n return;\n }\n if (!record?.usbSessionId || !operation.connectionKeys.includes(record.usbSessionId)) {\n return;\n }\n\n const { usbSessionId } = record;\n await this._runUsbTeardown(() => this._retireUsbSession(usbSessionId));\n }\n\n getDeviceInfo(connectIdOrOperationId: string, deviceId: string): Promise<Response<DeviceInfo>> {\n try {\n const connectId = isHardwareOperationId(connectIdOrOperationId)\n ? this._operations.resolve(connectIdOrOperationId).connectId\n : connectIdOrOperationId;\n const { record } = this._resolveTarget(connectId, deviceId);\n if (!record) {\n return Promise.resolve(\n failure(\n HardwareErrorCode.DeviceNotFound,\n `Unknown Keystone device: ${connectId || deviceId}`\n )\n );\n }\n return Promise.resolve(success(toDeviceInfo(record)));\n } catch (err) {\n return Promise.resolve(this._errorToFailure<DeviceInfo>(err));\n }\n }\n\n cancel(connectId?: string): void {\n // An ended operation id names nothing: return rather than decay into an\n // untargeted cancel that takes down an unrelated job.\n let namedOperationConnectId: string | undefined;\n if (isHardwareOperationId(connectId)) {\n try {\n namedOperationConnectId = this._operations.resolve(connectId).connectId;\n } catch {\n // Ended (tombstoned) and never-existed both land here.\n return;\n }\n }\n const reason = createHwkError({\n code: HardwareErrorCode.UserAborted,\n message: 'User aborted operation',\n });\n if (connectId) {\n // An operation-scoped call queues under its operation id, so cancel every\n // queue key this identifier can stand for.\n const queueKeys = keystoneCancelQueueKeys([\n connectId,\n this._operationRoutes.get(connectId)?.operationId,\n namedOperationConnectId,\n ]);\n for (const key of queueKeys) {\n this._jobQueue.cancelActiveAndPending(key, reason);\n }\n // A named cancel clears only its own operation's prompts; an unresolvable\n // name clears nothing.\n const scopedOperationId = isHardwareOperationId(connectId)\n ? connectId\n : this._operationRouteForIdentifier(connectId)?.operationId;\n if (scopedOperationId) {\n this._uiRegistry.cancel(undefined, undefined, scopedOperationId);\n }\n } else {\n // Nothing to name: teardown clears every waiter.\n this._jobQueue.cancelActiveAndPending(undefined, reason);\n this._uiRegistry.cancel();\n }\n }\n\n getChainFingerprint(\n connectId: string,\n deviceId: string,\n chain: ChainForFingerprint\n ): Promise<Response<string>> {\n try {\n const target = this._resolveTarget(connectId, deviceId);\n const masterFingerprint = target.expectedMasterFingerprint;\n if (!masterFingerprint) {\n return Promise.resolve(\n failure(HardwareErrorCode.DeviceNotFound, 'Unknown Keystone wallet identity')\n );\n }\n return Promise.resolve(\n success(deriveDeviceFingerprint(`keystone:${chain}:${masterFingerprint}`))\n );\n } catch (err) {\n return Promise.resolve(this._errorToFailure<string>(err));\n }\n }\n\n uiResponse(response: UiResponseEvent): void {\n if (response.type === UI_RESPONSE.CANCEL) {\n this.cancel();\n return;\n }\n this._uiRegistry.resolve(response.type, response.payload);\n }\n\n on<K extends keyof HardwareEventMap>(\n event: K,\n listener: (event: HardwareEventMap[K]) => void\n ): void;\n\n on(event: string, listener: DeviceEventListener): void;\n\n on(event: string, listener: (event: HardwareEvent) => void): void {\n this.emitter.on(event, listener);\n }\n\n off<K extends keyof HardwareEventMap>(\n event: K,\n listener: (event: HardwareEventMap[K]) => void\n ): void;\n\n off(event: string, listener: DeviceEventListener): void;\n\n off(event: string, listener: (event: HardwareEvent) => void): void {\n this.emitter.off(event, listener);\n }\n\n // ---------------------------------------------------------------------------\n // Explicit account import: call before signing to avoid a cold sync per call.\n // ---------------------------------------------------------------------------\n\n async importFromQr(options: ImportFromQrOptions = {}): Promise<Response<DeviceInfo>> {\n try {\n return await this._jobQueue.enqueue(KEYSTONE_COLD_START_JOB_LABEL, async signal => {\n const displayDevice = placeholderDeviceInfo();\n let responseUr: KeystoneUr;\n\n if (options.mode === 'scan') {\n responseUr = await this._requestQrScanAndAwaitResponse(displayDevice, signal);\n } else {\n const requestUr = this.urEngine.buildKeyDerivationRequest({\n schemas: [keySchema('evm', KEYSTONE_COLD_START_PATH)],\n origin: this._origin,\n });\n responseUr = await this._requestQrDisplayAndAwaitResponse(\n displayDevice,\n { ...requestUr, animated: false },\n signal\n );\n }\n KeystoneAdapter._throwIfAborted(signal);\n\n const parsed = this.urEngine.parseAccountResponse(responseUr);\n const record = this._upsertDeviceRecord(parsed);\n return success(toDeviceInfo(record));\n });\n } catch (err) {\n return this._errorToFailure<DeviceInfo>(err);\n }\n }\n\n // ---------------------------------------------------------------------------\n // All-network bundle, dispatched to the per-chain methods below.\n // ---------------------------------------------------------------------------\n\n allNetworkGetAddress = async (\n connectId: string,\n deviceId: string,\n params: AllNetworkGetAddressParams\n ): Promise<Response<AllNetworkAddressResponse[]>> => {\n const operationTarget = resolveHardwareOperationTarget(connectId, params.operationId);\n if (!operationTarget.success) return operationTarget;\n const effectiveConnectId = operationTarget.payload.targetId ?? '';\n const { operationId } = operationTarget.payload;\n let cancelScope: CancelScopeHandle | undefined;\n try {\n const prefetched = await this._prefetchAllNetworkAccounts(effectiveConnectId, deviceId, {\n ...params,\n operationId,\n });\n const { book } = prefetched;\n // On a cold start the prefetch established the wallet identity; route\n // per-item calls to it instead of re-syncing per item.\n const itemDeviceId = deviceId || prefetched.masterFingerprint || '';\n // A cancel between two per-item jobs finds nothing to abort; the scope\n // carries it across that gap under the same queue key.\n const scope = this._jobQueue.createCancelScope(\n keystoneQueueKey(effectiveConnectId, itemDeviceId)\n );\n cancelScope = scope;\n const cancelledIndexes = new Set<number>();\n return await runAllNetworkGetAddress({\n connectId: effectiveConnectId,\n deviceId: itemDeviceId,\n params,\n callItem: async ({ method, item, index }) => {\n if (scope.signal.aborted) {\n cancelledIndexes.add(index);\n return buildCancelledFailure(scope.signal);\n }\n const commonArgs = {\n path: item.path,\n showOnDevice: item.showOnDevice,\n operationId,\n };\n switch (method) {\n case 'evmGetAddress':\n return this.evmGetAddress(effectiveConnectId, itemDeviceId, commonArgs, book);\n case 'btcGetAddress':\n return this.btcGetAddress(effectiveConnectId, itemDeviceId, commonArgs, book);\n case 'btcGetPublicKey':\n return this.btcGetPublicKey(effectiveConnectId, itemDeviceId, commonArgs, book);\n case 'solGetAddress':\n return this.solGetAddress(effectiveConnectId, itemDeviceId, commonArgs, book);\n case 'tronGetAddress':\n return this.tronGetAddress(effectiveConnectId, itemDeviceId, commonArgs, book);\n default:\n return failure(\n HardwareErrorCode.MethodNotSupported,\n `Unsupported method: ${String(method)}`\n );\n }\n },\n attachIdentity: context => {\n const { record } = this._resolveTarget(effectiveConnectId, itemDeviceId);\n return Promise.resolve({\n ...context.item,\n success: true,\n payload: {\n ...context.payload,\n rootFingerprint: record ? Number.parseInt(record.masterFingerprint, 16) : undefined,\n deviceIdentity: record\n ? {\n vendor: 'keystone' as const,\n type: 'walletId' as const,\n value: record.masterFingerprint,\n }\n : undefined,\n },\n });\n },\n // Cancel, refusal or a lost session ends the batch; other per-item\n // failures carry on with the next chain.\n shouldAbortBundle: (response, { index }) => {\n const { code } = response.payload ?? {};\n return cancelledIndexes.has(index) || isUserRefusal(code) || isConnectionLost(code);\n },\n });\n } catch (err) {\n return this._errorToFailure<AllNetworkAddressResponse[]>(err);\n } finally {\n cancelScope?.release();\n }\n };\n\n // ---------------------------------------------------------------------------\n // EVM\n // ---------------------------------------------------------------------------\n\n async evmGetAddress(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n params?: NullableCallArg<IHardwareCallParams<EvmGetAddressParams>>,\n book?: AccountBook\n ): Promise<Response<EvmAddress>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, params?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n if (!params) return failure(HardwareErrorCode.InvalidParams, 'evmGetAddress requires params');\n if (!params.path)\n return failure(HardwareErrorCode.InvalidParams, 'evmGetAddress requires params.path');\n\n const { accountPath, relativeDerivePath } = splitAccountPath(params.path);\n if (!relativeDerivePath) {\n return failure(\n HardwareErrorCode.InvalidParams,\n \"evmGetAddress requires a full leaf path, e.g. m/44'/60'/0'/0/0\"\n );\n }\n\n return this._runJob(connectId, deviceId, async signal => {\n const xpub = await this._fetchAccountXpub(\n connectId,\n deviceId,\n 'evm',\n accountPath,\n signal,\n book\n );\n // showOnDevice is not wired; the address is derived offline from a device-verified xpub.\n const address = this.urEngine.deriveEvmAddressFromXpub(xpub, relativeDerivePath);\n return success<EvmAddress>({ address, path: normalizePath(params.path) });\n });\n }\n\n async evmSignTransaction(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n params?: NullableCallArg<IHardwareCallParams<EvmSignTxParams>>\n ): Promise<Response<EvmSignedTx>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, params?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n if (!params)\n return failure(HardwareErrorCode.InvalidParams, 'evmSignTransaction requires params');\n if (!params.path) {\n return failure(HardwareErrorCode.InvalidParams, 'evmSignTransaction requires params.path');\n }\n if (\n !('serializedTx' in params) ||\n typeof params.serializedTx !== 'string' ||\n !params.serializedTx\n ) {\n return failure(\n HardwareErrorCode.MethodNotSupported,\n 'Keystone only signs a fully RLP-serialized transaction (params.serializedTx) — structured-field signing is not supported'\n );\n }\n const rawTxHex = stripHex(params.serializedTx);\n const path = normalizePath(params.path);\n // EIP-2718 typed txs start with a type byte < 0x80; legacy RLP lists start at >= 0xc0.\n const dataType = parseInt(rawTxHex.slice(0, 2), 16) < 0xc0 ? 'typedTransaction' : 'transaction';\n\n return this._signWithWallet({\n connectId,\n deviceId,\n chain: 'evm',\n operationName: 'evmSignTransaction',\n buildRequest: (requestId, xfp) =>\n this.urEngine.buildEthSignRequest({\n requestId,\n unsignedTxHex: rawTxHex,\n dataType,\n path,\n xfp,\n chainId: params.chainId,\n origin: this._origin,\n }),\n parseResponse: ur => this.urEngine.parseEthSignature(ur),\n toPayload: (sig): EvmSignedTx => ({\n v: ensure0x(sig.v),\n r: ensure0x(sig.r),\n s: ensure0x(sig.s),\n }),\n });\n }\n\n async evmSignMessage(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n params?: NullableCallArg<IHardwareCallParams<EvmSignMsgParams>>\n ): Promise<Response<EvmSignature>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, params?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n if (!params) return failure(HardwareErrorCode.InvalidParams, 'evmSignMessage requires params');\n if (!params.path || params.message === undefined) {\n return failure(\n HardwareErrorCode.InvalidParams,\n 'evmSignMessage requires params.path and params.message'\n );\n }\n const messageHex = params.hex\n ? stripHex(params.message)\n : Buffer.from(params.message, 'utf8').toString('hex');\n const path = normalizePath(params.path);\n\n return this._signWithWallet({\n connectId,\n deviceId,\n chain: 'evm',\n operationName: 'evmSignMessage',\n buildRequest: (requestId, xfp) =>\n this.urEngine.buildEthSignRequest({\n requestId,\n unsignedTxHex: messageHex,\n dataType: 'personalMessage',\n path,\n xfp,\n chainId: params.chainId,\n origin: this._origin,\n }),\n parseResponse: ur => this.urEngine.parseEthSignature(ur),\n toPayload: (sig): EvmSignature => ({ signature: ensure0x(sig.r + sig.s + sig.v) }),\n });\n }\n\n async evmSignTypedData(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n params?: NullableCallArg<IHardwareCallParams<EvmSignTypedDataParams>>\n ): Promise<Response<EvmSignature>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, params?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n if (!params)\n return failure(HardwareErrorCode.InvalidParams, 'evmSignTypedData requires params');\n if (!params.path) {\n return failure(HardwareErrorCode.InvalidParams, 'evmSignTypedData requires params.path');\n }\n if (params.mode === 'hash') {\n return failure(\n HardwareErrorCode.MethodNotSupported,\n 'Keystone always displays the full EIP-712 payload for on-device review — pre-hashed signing is not supported'\n );\n }\n // Typed-data JSON as UTF-8, the Keystone USB SDK convention. Prefer `dataJson`:\n // re-stringifying can rewrite integers above 2^53.\n const signDataHex = Buffer.from(\n params.dataJson ?? JSON.stringify(params.data),\n 'utf8'\n ).toString('hex');\n const path = normalizePath(params.path);\n\n return this._signWithWallet({\n connectId,\n deviceId,\n chain: 'evm',\n operationName: 'evmSignTypedData',\n buildRequest: (requestId, xfp) =>\n this.urEngine.buildEthSignRequest({\n requestId,\n unsignedTxHex: signDataHex,\n dataType: 'typedData',\n path,\n xfp,\n chainId: params.chainId,\n origin: this._origin,\n }),\n parseResponse: ur => this.urEngine.parseEthSignature(ur),\n toPayload: (sig): EvmSignature => ({ signature: ensure0x(sig.r + sig.s + sig.v) }),\n });\n }\n\n // ---------------------------------------------------------------------------\n // BTC: 44'/49'/84' addresses derive offline from the account xpub; P2TR addresses\n // and structured-field tx signing are unsupported (the host builds a PSBT instead).\n // ---------------------------------------------------------------------------\n\n async btcGetAddress(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n params?: NullableCallArg<IHardwareCallParams<BtcGetAddressParams>>,\n book?: AccountBook\n ): Promise<Response<BtcAddress>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, params?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n if (!params) return failure(HardwareErrorCode.InvalidParams, 'btcGetAddress requires params');\n if (!params.path)\n return failure(HardwareErrorCode.InvalidParams, 'btcGetAddress requires params.path');\n\n const scriptType = btcScriptTypeFromPath(params.path);\n if (!scriptType) {\n return failure(\n HardwareErrorCode.InvalidParams,\n \"btcGetAddress requires a path whose purpose is 44'/49'/84'/86' (P2PKH/P2SH-P2WPKH/P2WPKH/P2TR)\"\n );\n }\n if (scriptType === 'p2tr') {\n return this._unsupported(\n 'btcGetAddress',\n \"P2TR (purpose 86') needs an elliptic-curve library for BIP-341 tweaking, not yet wired in — 44'/49'/84' work\"\n );\n }\n\n const normalizedPath = normalizePath(params.path);\n const { accountPath, relativeDerivePath } = splitAccountPath(normalizedPath);\n if (!relativeDerivePath) {\n return failure(\n HardwareErrorCode.InvalidParams,\n \"btcGetAddress requires a full leaf path, e.g. m/84'/0'/0'/0/0\"\n );\n }\n if (!isKeystoneSignableBtcAccountPath(accountPath)) {\n return failure(HardwareErrorCode.DevicePathForbidden, KEYSTONE_BTC_ACCOUNT_FORBIDDEN_MESSAGE);\n }\n\n return this._runJob(connectId, deviceId, async signal => {\n const xpub = await this._fetchAccountXpub(\n connectId,\n deviceId,\n 'btc',\n accountPath,\n signal,\n book\n );\n const address = this.urEngine.deriveBtcAddressFromXpub(xpub, relativeDerivePath, scriptType);\n return success<BtcAddress>({ address, path: normalizedPath });\n });\n }\n\n /**\n * `params.path` must be an account path (`m/84'/0'/0'`), the level Keystone syncs. An xpub is\n * script-type agnostic, so `86'` works here even though `btcGetAddress` rejects it.\n */\n async btcGetPublicKey(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n params?: NullableCallArg<IHardwareCallParams<BtcGetPublicKeyParams>>,\n book?: AccountBook\n ): Promise<Response<BtcPublicKey>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, params?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n if (!params) return failure(HardwareErrorCode.InvalidParams, 'btcGetPublicKey requires params');\n if (!params.path)\n return failure(HardwareErrorCode.InvalidParams, 'btcGetPublicKey requires params.path');\n\n const { accountPath, relativeDerivePath } = splitAccountPath(params.path);\n if (relativeDerivePath) {\n return failure(\n HardwareErrorCode.InvalidParams,\n \"btcGetPublicKey requires an account path, e.g. m/84'/0'/0' (not a leaf path)\"\n );\n }\n if (!isKeystoneSignableBtcAccountPath(accountPath)) {\n return failure(HardwareErrorCode.DevicePathForbidden, KEYSTONE_BTC_ACCOUNT_FORBIDDEN_MESSAGE);\n }\n\n return this._runJob(connectId, deviceId, async signal => {\n const xpub = await this._fetchAccountXpub(\n connectId,\n deviceId,\n 'btc',\n accountPath,\n signal,\n book\n );\n const meta = this.urEngine.parseXpubMeta(xpub);\n return success<BtcPublicKey>({\n xpub,\n publicKey: meta.publicKey,\n chainCode: meta.chainCode,\n depth: meta.depth,\n fingerprint: meta.parentFingerprint,\n path: normalizePath(accountPath),\n });\n });\n }\n\n async btcSignTransaction(\n _connectId?: NullableCallArg<string>,\n _deviceId?: NullableCallArg<string>,\n _params?: NullableCallArg<IHardwareCallParams<BtcSignTxParams>>\n ): Promise<Response<BtcSignedTx>> {\n return this._unsupported(\n 'btcSignTransaction',\n 'use btcSignPsbt — structured input/output signing needs host-side PSBT construction, not yet wired in'\n );\n }\n\n async btcSignPsbt(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n params?: NullableCallArg<IHardwareCallParams<BtcSignPsbtParams>>\n ): Promise<Response<BtcSignedPsbt>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, params?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n if (!params) return failure(HardwareErrorCode.InvalidParams, 'btcSignPsbt requires params');\n if (!params.psbt)\n return failure(HardwareErrorCode.InvalidParams, 'btcSignPsbt requires params.psbt');\n // `path` is optional in the shared type, but the account-0 gate needs it.\n if (!params.path)\n return failure(HardwareErrorCode.InvalidParams, 'btcSignPsbt requires params.path');\n if (!isKeystoneSignableBtcAccountPath(splitAccountPath(params.path).accountPath)) {\n return failure(HardwareErrorCode.DevicePathForbidden, KEYSTONE_BTC_ACCOUNT_FORBIDDEN_MESSAGE);\n }\n\n return this._runJob(connectId, deviceId, async signal => {\n // A PSBT may span several paths; only the wallet's mfp is needed.\n const { record } = await this._ensureWalletKnown(connectId, deviceId, 'btc', signal);\n KeystoneAdapter._throwIfAborted(signal);\n\n const requestUr = this.urEngine.buildBtcPsbtRequest(stripHex(params.psbt));\n const responseUr = await this._resolveUr(\n record,\n requestUr,\n true,\n connectId,\n signal,\n 'btcSignPsbt'\n );\n KeystoneAdapter._throwIfAborted(signal);\n\n const signedPsbt = this.urEngine.parseBtcPsbt(responseUr);\n return success<BtcSignedPsbt>({ signedPsbt });\n });\n }\n\n async btcSignMessage(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n params?: NullableCallArg<IHardwareCallParams<BtcSignMsgParams>>\n ): Promise<Response<BtcSignature>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, params?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n if (!params) return failure(HardwareErrorCode.InvalidParams, 'btcSignMessage requires params');\n if (!params.path || params.message === undefined) {\n return failure(\n HardwareErrorCode.InvalidParams,\n 'btcSignMessage requires params.path and params.message'\n );\n }\n const messageHex = params.hex\n ? stripHex(params.message)\n : Buffer.from(params.message, 'utf8').toString('hex');\n const path = normalizePath(params.path);\n if (!isKeystoneSignableBtcAccountPath(splitAccountPath(path).accountPath)) {\n return failure(HardwareErrorCode.DevicePathForbidden, KEYSTONE_BTC_ACCOUNT_FORBIDDEN_MESSAGE);\n }\n\n return this._signWithWallet({\n connectId,\n deviceId,\n chain: 'btc',\n operationName: 'btcSignMessage',\n buildRequest: (requestId, xfp) =>\n this.urEngine.buildBtcMessageSignRequest({\n requestId,\n messageHex,\n accounts: [{ path, xfp }],\n origin: this._origin,\n }),\n parseResponse: ur => this.urEngine.parseBtcSignature(ur),\n toPayload: (sig): BtcSignature => ({ signature: sig.signature }),\n });\n }\n\n async btcGetMasterFingerprint(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n paramsArg?: NullableCallArg<IHardwareCommonCallParams>\n ): Promise<Response<{ masterFingerprint: string }>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, paramsArg?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n return this._runJob(connectId, deviceId, async signal => {\n const { record } = await this._ensureWalletKnown(connectId, deviceId, 'btc', signal);\n return success({ masterFingerprint: record.masterFingerprint });\n });\n }\n\n // ---------------------------------------------------------------------------\n // SOL\n // ---------------------------------------------------------------------------\n\n async solGetAddress(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n params?: NullableCallArg<IHardwareCallParams<SolGetAddressParams>>,\n book?: AccountBook\n ): Promise<Response<SolAddress>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, params?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n if (!params) return failure(HardwareErrorCode.InvalidParams, 'solGetAddress requires params');\n if (!params.path)\n return failure(HardwareErrorCode.InvalidParams, 'solGetAddress requires params.path');\n const path = normalizePath(params.path);\n\n return this._runJob(connectId, deviceId, async signal => {\n const { account } = await this._fetchAccount(connectId, deviceId, 'sol', path, signal, book);\n KeystoneAdapter._throwIfAborted(signal);\n // The Ed25519 public key is the Solana address (base58).\n const address = bs58.encode(Buffer.from(account.publicKey, 'hex'));\n return success<SolAddress>({ address, path });\n });\n }\n\n async solSignTransaction(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n params?: NullableCallArg<IHardwareCallParams<SolSignTxParams>>\n ): Promise<Response<SolSignedTx>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, params?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n if (!params)\n return failure(HardwareErrorCode.InvalidParams, 'solSignTransaction requires params');\n if (!params.path || !params.serializedTx) {\n return failure(\n HardwareErrorCode.InvalidParams,\n 'solSignTransaction requires params.path and params.serializedTx'\n );\n }\n const path = normalizePath(params.path);\n\n return this._signWithWallet({\n connectId,\n deviceId,\n chain: 'sol',\n operationName: 'solSignTransaction',\n buildRequest: (requestId, xfp) =>\n this.urEngine.buildSolSignRequest({\n requestId,\n unsignedPayloadHex: stripHex(params.serializedTx),\n dataType: 'transaction',\n path,\n xfp,\n origin: this._origin,\n }),\n parseResponse: ur => this.urEngine.parseSolSignature(ur),\n toPayload: (sig): SolSignedTx => ({ signature: sig.signature }),\n });\n }\n\n async solSignMessage(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n params?: NullableCallArg<IHardwareCallParams<SolSignMsgParams>>\n ): Promise<Response<SolSignature>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, params?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n if (!params) return failure(HardwareErrorCode.InvalidParams, 'solSignMessage requires params');\n if (!params.path || !params.message) {\n return failure(\n HardwareErrorCode.InvalidParams,\n 'solSignMessage requires params.path and params.message'\n );\n }\n const path = normalizePath(params.path);\n\n return this._signWithWallet({\n connectId,\n deviceId,\n chain: 'sol',\n operationName: 'solSignMessage',\n buildRequest: (requestId, xfp) =>\n this.urEngine.buildSolSignRequest({\n requestId,\n unsignedPayloadHex: stripHex(params.message),\n dataType: 'message',\n path,\n xfp,\n origin: this._origin,\n }),\n parseResponse: ur => this.urEngine.parseSolSignature(ur),\n toPayload: (sig): SolSignature => ({ signature: sig.signature }),\n });\n }\n\n // ---------------------------------------------------------------------------\n // TRON: keystone-sdk-rust layout (tags 5201/5202, firmware >= 2.5.0), not sdk.tron's\n // protobuf module; OneKey Pro's encoding under the same tag is rejected by the firmware.\n // ---------------------------------------------------------------------------\n\n async tronGetAddress(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n params?: NullableCallArg<IHardwareCallParams<TronGetAddressParams>>,\n book?: AccountBook\n ): Promise<Response<TronAddress>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, params?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n if (!params) return failure(HardwareErrorCode.InvalidParams, 'tronGetAddress requires params');\n if (!params.path)\n return failure(HardwareErrorCode.InvalidParams, 'tronGetAddress requires params.path');\n\n const { accountPath, relativeDerivePath } = splitAccountPath(params.path);\n if (!relativeDerivePath) {\n return failure(\n HardwareErrorCode.InvalidParams,\n \"tronGetAddress requires a full leaf path, e.g. m/44'/195'/0'/0/0\"\n );\n }\n\n return this._runJob(connectId, deviceId, async signal => {\n const xpub = await this._fetchAccountXpub(\n connectId,\n deviceId,\n 'tron',\n accountPath,\n signal,\n book\n );\n const address = this.urEngine.deriveTronAddressFromXpub(xpub, relativeDerivePath);\n return success<TronAddress>({ address, path: normalizePath(params.path) });\n });\n }\n\n async tronSignTransaction(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n params?: NullableCallArg<IHardwareCallParams<TronSignTxParams>>\n ): Promise<Response<TronSignedTx>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, params?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n if (!params)\n return failure(HardwareErrorCode.InvalidParams, 'tronSignTransaction requires params');\n if (!params.path) {\n return failure(HardwareErrorCode.InvalidParams, 'tronSignTransaction requires params.path');\n }\n if (!params.rawTxHex) {\n return failure(\n HardwareErrorCode.InvalidParams,\n 'Keystone only signs a fully protobuf-serialized TRON transaction (params.rawTxHex) — the Trezor-style structured contract fields have no equivalent here'\n );\n }\n const rawTxHex = stripHex(params.rawTxHex);\n const path = normalizePath(params.path);\n\n return this._signWithWallet({\n connectId,\n deviceId,\n chain: 'tron',\n operationName: 'tronSignTransaction',\n buildRequest: (requestId, xfp) =>\n this.urEngine.buildTronSignRequest({\n requestId,\n rawTxHex,\n path,\n xfp,\n origin: this._origin,\n }),\n parseResponse: ur => this.urEngine.parseTronSignature(ur),\n // Keystone signs rawTxHex as given and returns only the signature, so no serializedTx.\n toPayload: (sig): TronSignedTx => ({ signature: sig.signature }),\n });\n }\n\n async tronSignMessage(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n params?: NullableCallArg<IHardwareCallParams<TronSignMsgParams>>\n ): Promise<Response<TronSignature>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, params?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n if (!params) return failure(HardwareErrorCode.InvalidParams, 'tronSignMessage requires params');\n if (!params.path) {\n return failure(HardwareErrorCode.InvalidParams, 'tronSignMessage requires params.path');\n }\n if (!params.messageHex) {\n return failure(HardwareErrorCode.InvalidParams, 'tronSignMessage requires params.messageHex');\n }\n // Firmware implements TIP-191 signMessageV2 only.\n if (params.messageType !== 'V2') {\n return failure(\n HardwareErrorCode.MethodNotSupported,\n 'Keystone signs TRON messages as TIP-191 signMessageV2 only (messageType: \"V2\")'\n );\n }\n const messageHex = stripHex(params.messageHex);\n const path = normalizePath(params.path);\n\n return this._signWithWallet({\n connectId,\n deviceId,\n chain: 'tron',\n operationName: 'tronSignMessage',\n buildRequest: (requestId, xfp) =>\n this.urEngine.buildTronSignRequest({\n requestId,\n rawTxHex: messageHex,\n path,\n xfp,\n signType: TronSignType.PersonalMessage,\n origin: this._origin,\n }),\n parseResponse: ur => this.urEngine.parseTronSignature(ur),\n toPayload: (sig): TronSignature => ({ signature: sig.signature }),\n });\n }\n\n // ---------------------------------------------------------------------------\n // Internals\n // ---------------------------------------------------------------------------\n\n private async _runJob<T>(\n connectId: string | undefined,\n deviceId: string | undefined,\n job: (signal: AbortSignal) => Promise<Response<T>>\n ): Promise<Response<T>> {\n try {\n return await this._jobQueue.enqueue(keystoneQueueKey(connectId, deviceId), job);\n } catch (err) {\n return this._errorToFailure<T>(err);\n }\n }\n\n private async _fetchAccountXpub(\n connectId: string | undefined,\n deviceId: string | undefined,\n hwkChain: ChainCapability,\n accountPath: string,\n signal: AbortSignal,\n book: AccountBook | undefined\n ): Promise<string> {\n const { account } = await this._fetchAccount(\n connectId,\n deviceId,\n hwkChain,\n accountPath,\n signal,\n book\n );\n KeystoneAdapter._throwIfAborted(signal);\n if (!account.extendedPublicKey) {\n throw createHwkError({\n code: HardwareErrorCode.MethodNotSupported,\n message: 'Keystone did not return an extended public key for this account path',\n });\n }\n return account.extendedPublicKey;\n }\n\n /**\n * Signing needs only the wallet's mfp: the device re-derives the key from path+xfp, so no\n * per-path account lookup happens here.\n */\n private _signWithWallet<S extends { requestId?: string }, T>(args: {\n connectId: string | undefined;\n deviceId: string | undefined;\n chain: ChainForFingerprint;\n operationName: string;\n buildRequest: (requestId: string, xfp: string) => KeystoneUr;\n parseResponse: (responseUr: KeystoneUr) => S;\n toPayload: (signature: S) => T;\n }): Promise<Response<T>> {\n const { connectId, deviceId } = args;\n return this._runJob(connectId, deviceId, async signal => {\n const { record } = await this._ensureWalletKnown(connectId, deviceId, args.chain, signal);\n KeystoneAdapter._throwIfAborted(signal);\n\n const requestId = uuidv4();\n const requestUr = args.buildRequest(requestId, record.masterFingerprint);\n const responseUr = await this._resolveUr(\n record,\n requestUr,\n true,\n connectId,\n signal,\n args.operationName\n );\n KeystoneAdapter._throwIfAborted(signal);\n\n const signature = args.parseResponse(responseUr);\n KeystoneAdapter._assertRequestIdMatches(requestId, signature.requestId);\n return success(args.toPayload(signature));\n });\n }\n\n private _allNetworkSyncSchema(\n item: AllNetworkAddressParams\n ): { hwkChain: ChainCapability; path: string } | undefined {\n if (!isAllNetworkMethodName(String(item.methodName)) || !item.path) return undefined;\n\n const method = item.methodName;\n const hwkChain = getAllNetworkMethodChain(method);\n const path = normalizePath(item.path);\n // Unsignable BTC accounts are refused by the per-item call; keep them out\n // of the prefetch so the device is not asked to export them.\n if (\n hwkChain === 'btc' &&\n !isKeystoneSignableBtcAccountPath(splitAccountPath(path).accountPath)\n ) {\n return undefined;\n }\n switch (method) {\n case 'evmGetAddress':\n case 'btcGetAddress':\n case 'tronGetAddress':\n return { hwkChain, path: splitAccountPath(path).accountPath };\n case 'btcGetPublicKey':\n case 'solGetAddress':\n return { hwkChain, path };\n default:\n return undefined;\n }\n }\n\n /**\n * QR answers the whole bundle with one request QR and one scan. USB exports one path per\n * request because the device limits that channel.\n */\n private async _prefetchAllNetworkAccounts(\n connectId: string,\n deviceId: string,\n params: AllNetworkGetAddressParams\n ): Promise<{ book: AccountBook; masterFingerprint?: string }> {\n return this._jobQueue.enqueue(keystoneQueueKey(connectId, deviceId), async signal => {\n const target = this._resolveTarget(connectId, deviceId);\n let { record } = target;\n\n const requestedByKey = new Map<string, { hwkChain: ChainCapability; path: string }>();\n for (const item of params.bundle) {\n const schema = this._allNetworkSyncSchema(item);\n if (schema) requestedByKey.set(accountKey(schema.hwkChain, schema.path), schema);\n }\n\n const book: AccountBook = new Map();\n if (!requestedByKey.size) {\n return { book };\n }\n const requestedSchemas = Array.from(requestedByKey.values());\n const assertAllBooked = () => {\n for (const schema of requestedSchemas) {\n if (!book.has(accountKey(schema.hwkChain, schema.path))) {\n throw createHwkError({\n code: HardwareErrorCode.DeviceMismatch,\n message: `Keystone did not return the requested derivation path (${schema.path})`,\n });\n }\n }\n };\n\n // An operation routed to QR at connectDevice must stay on QR: attaching\n // USB here would export per path while `_resolveUr` still prompts a QR.\n const operation = isHardwareOperationId(params.operationId)\n ? this._operations.find(params.operationId)\n : undefined;\n const operationRoute = operation ? this._operationRoutes.get(operation.connectId) : undefined;\n const routedToQr =\n operationRoute?.operationId === operation?.operationId &&\n operationRoute?.connectionType === 'qr';\n\n if (\n this._forcedTransport !== 'qr' &&\n !routedToQr &&\n !record?.usbSessionId &&\n this._usbConnector &&\n target.expectedMasterFingerprint\n ) {\n record = (await this._tryUsbAttach(signal, target.expectedMasterFingerprint)) ?? record;\n KeystoneAdapter._throwIfAborted(signal);\n }\n\n // importFromQr keeps a leftover usbSessionId on the record; the route,\n // not that session, decides the channel.\n if (this._forcedTransport !== 'qr' && !routedToQr && record?.usbSessionId) {\n const bundleSessionId = record.usbSessionId;\n const assertBundleSession = () => {\n if (record?.usbSessionId !== bundleSessionId) {\n throw createHwkError({\n code: HardwareErrorCode.TransportNotAvailable,\n message: 'Keystone USB connection was lost during account export',\n });\n }\n };\n for (const schema of requestedSchemas) {\n if (!book.has(accountKey(schema.hwkChain, schema.path))) {\n assertBundleSession();\n const synced = await this._fetchAccount(\n connectId,\n deviceId,\n schema.hwkChain,\n schema.path,\n signal,\n book\n );\n record = synced.record;\n assertBundleSession();\n }\n }\n assertAllBooked();\n return { book, masterFingerprint: record.masterFingerprint };\n }\n if (this._forcedTransport === 'usb') {\n throw createHwkError({\n code: HardwareErrorCode.TransportNotAvailable,\n message: 'USB channel is not connected for this Keystone wallet',\n });\n }\n\n const schemas = requestedSchemas;\n const requestUr = this.urEngine.buildKeyDerivationRequest({\n schemas: schemas.map(schema => keySchema(schema.hwkChain, schema.path)),\n origin: this._origin,\n });\n const responseUr = await this._requestQrDisplayAndAwaitResponse(\n record ? toDeviceInfo(record) : placeholderDeviceInfo(),\n { ...requestUr, animated: false },\n signal\n );\n KeystoneAdapter._throwIfAborted(signal);\n\n const parsed = this.urEngine.parseAccountResponse(responseUr);\n this._assertParsedIdentity(parsed, target);\n record = this._upsertDeviceRecord(parsed);\n const requestedChainByPath = new Map(\n schemas.map(schema => [normalizePath(schema.path), schema.hwkChain] as const)\n );\n for (const account of parsed.accounts) {\n const normalizedPath = normalizePath(account.path);\n const hwkChain =\n requestedChainByPath.get(normalizedPath) ?? inferHwkChainFromPath(normalizedPath);\n if (hwkChain) {\n book.set(accountKey(hwkChain, normalizedPath), { ...account, hwkChain });\n }\n }\n assertAllBooked();\n return { book, masterFingerprint: record.masterFingerprint };\n });\n }\n\n /** Resolve the wallet's master fingerprint from the connectId and/or deviceId the caller passed. */\n private _resolveTarget(\n connectId?: string,\n deviceId?: string\n ): ExpectedWallet & { record?: KeystoneDeviceRecord } {\n const resolvedConnectId = isHardwareOperationId(connectId)\n ? this._operations.resolve(connectId).connectId\n : connectId;\n const identifiers = [deviceId, resolvedConnectId].filter((identifier): identifier is string =>\n Boolean(identifier)\n );\n if (!identifiers.length) return {};\n\n const fingerprints = identifiers.map(identifier => keystoneMfpFromIdentifier(identifier));\n const expectedMasterFingerprint = fingerprints[0];\n if (!expectedMasterFingerprint || fingerprints.some(value => !value)) {\n throw createHwkError({\n code: HardwareErrorCode.DeviceNotFound,\n message: 'Keystone device lookup requires the wallet master fingerprint',\n });\n }\n if (fingerprints.some(value => value !== expectedMasterFingerprint)) {\n throw createHwkError({\n code: HardwareErrorCode.DeviceMismatch,\n message: 'Keystone connectId and deviceId identify different wallets',\n });\n }\n\n return {\n record: this._devices.get(expectedMasterFingerprint),\n expectedMasterFingerprint,\n };\n }\n\n private _assertParsedIdentity(\n parsed: KeystoneParsedMultiAccounts,\n expected: ExpectedWallet\n ): void {\n if (\n expected.expectedMasterFingerprint &&\n parsed.masterFingerprint !== expected.expectedMasterFingerprint\n ) {\n throw createHwkError({\n code: HardwareErrorCode.DeviceMismatch,\n message: `Connected Keystone wallet (mfp ${parsed.masterFingerprint}) does not match the requested wallet fingerprint (${expected.expectedMasterFingerprint})`,\n });\n }\n }\n\n /**\n * Folds a parsed account response into the device table. Only non-USB round trips mark\n * `qrSynced`, so a USB-only wallet is dropped on disconnect.\n */\n private _upsertDeviceRecord(\n parsed: KeystoneParsedMultiAccounts,\n options?: { viaUsb?: boolean; usbSessionId?: string }\n ): KeystoneDeviceRecord {\n const { masterFingerprint } = parsed;\n let record = this._devices.get(masterFingerprint);\n const isNew = !record;\n if (!record) {\n record = createDeviceRecord(masterFingerprint);\n this._devices.set(masterFingerprint, record);\n }\n record.model = parsed.device ?? record.model;\n record.deviceVersion = parsed.deviceVersion ?? record.deviceVersion;\n record.hardwareDeviceId = parsed.deviceId ?? record.hardwareDeviceId;\n record.usbSessionId = options?.usbSessionId ?? record.usbSessionId;\n if (!options?.viaUsb) record.qrSynced = true;\n\n const info = toDeviceInfo(record);\n const eventType = isNew ? DEVICE.CONNECT : DEVICE.CHANGED;\n this.emitter.emit(eventType, { type: eventType, payload: info });\n return record;\n }\n\n /**\n * Opens a permitted USB Keystone and takes its mfp as the wallet identity. A known wallet gains\n * USB in place (`device-changed`); an unseen one becomes USB-only.\n */\n private async _connectUsb(\n expected: ExpectedWallet,\n searchTargetId?: string,\n signal?: AbortSignal\n ): Promise<Response<DeviceInfo>> {\n if (this._pendingUsbTeardowns > 0 || this._abandonedUsbConnects > 0) {\n return failure(\n HardwareErrorCode.DeviceBusyInternal,\n 'Keystone USB session is being released'\n );\n }\n KeystoneAdapter._throwIfAborted(signal);\n let abandoned = false;\n const onAbort = () => {\n abandoned = true;\n this._abandonedUsbConnects += 1;\n };\n signal?.addEventListener('abort', onAbort, { once: true });\n // Cancellation releases the caller, not the physical USB transfer. Keep\n // the tail until the late result has been rejected and disconnected.\n const pending = this._usbConnectTail.then(async () => {\n KeystoneAdapter._throwIfAborted(signal);\n return this._connectUsbExclusive(expected, searchTargetId, signal);\n });\n const settled = pending.finally(() => {\n signal?.removeEventListener('abort', onAbort);\n if (abandoned) this._abandonedUsbConnects -= 1;\n });\n this._usbConnectTail = settled.then(\n () => undefined,\n () => undefined\n );\n return signal ? KeystoneAdapter._abortable(signal, settled) : settled;\n }\n\n private async _connectUsbExclusive(\n expected: ExpectedWallet,\n searchTargetId?: string,\n signal?: AbortSignal\n ): Promise<Response<DeviceInfo>> {\n if (!this._usbConnector) {\n return failure(\n HardwareErrorCode.TransportNotAvailable,\n 'No USB connector configured for this Keystone adapter'\n );\n }\n let sessionId: string | undefined;\n try {\n let connectTarget: ConnectorConnectTarget = { type: 'default' };\n if (searchTargetId) {\n connectTarget = { type: 'search-target', searchTargetId };\n } else if (expected.expectedMasterFingerprint) {\n connectTarget = {\n type: 'expected-device-identity',\n deviceIdentity: expected.expectedMasterFingerprint,\n };\n }\n const connector = this._usbConnector;\n const session = await (connector.connectTarget\n ? connector.connectTarget(connectTarget)\n : connector.connect(searchTargetId ?? expected.expectedMasterFingerprint));\n sessionId = session.sessionId;\n KeystoneAdapter._throwIfAborted(signal);\n const raw = session.deviceInfo.raw as { masterFingerprint?: unknown } | undefined;\n const mfpValue = parseWalletMasterFingerprint(raw?.masterFingerprint);\n if (!mfpValue) {\n const empty =\n parseBip32MasterFingerprint(raw?.masterFingerprint) === MISSING_BIP32_MASTER_FINGERPRINT;\n throw createHwkError({\n code: empty ? HardwareErrorCode.DeviceNotInitialized : HardwareErrorCode.DeviceMismatch,\n message: empty\n ? 'Keystone has no wallet yet; it reported an empty master fingerprint'\n : 'Keystone USB did not report a master fingerprint',\n });\n }\n const masterFingerprint = mfpValue.toLowerCase();\n if (\n expected.expectedMasterFingerprint &&\n masterFingerprint !== expected.expectedMasterFingerprint\n ) {\n throw createHwkError({\n code: HardwareErrorCode.DeviceMismatch,\n message: `Connected Keystone wallet (mfp ${masterFingerprint}) does not match the requested wallet fingerprint (${expected.expectedMasterFingerprint})`,\n });\n }\n\n const previousUsbSessionId = this._devices.get(masterFingerprint)?.usbSessionId;\n if (previousUsbSessionId && previousUsbSessionId !== session.sessionId) {\n try {\n await this._usbConnector.disconnect(previousUsbSessionId);\n } catch {\n // The replacement session is authoritative even if stale teardown fails.\n }\n }\n KeystoneAdapter._throwIfAborted(signal);\n const record = this._upsertDeviceRecord(\n { masterFingerprint, accounts: [] },\n {\n viaUsb: true,\n usbSessionId: session.sessionId,\n }\n );\n KeystoneAdapter._throwIfAborted(signal);\n record.hadUsbSession = true;\n record.model = session.deviceInfo.modelName ?? session.deviceInfo.model ?? record.model;\n record.deviceVersion = session.deviceInfo.firmwareVersion ?? record.deviceVersion;\n return success(toDeviceInfo(record));\n } catch (err) {\n if (sessionId) {\n try {\n await this._usbConnector.disconnect(sessionId);\n } catch {\n // Preserve the identity/export failure; teardown is best-effort.\n }\n }\n return this._errorToFailure<DeviceInfo>(err);\n }\n }\n\n /**\n * Probes already-authorized USB devices without a permission picker, then attaches and verifies\n * the requested wallet if present.\n */\n private async _tryUsbAttach(\n signal: AbortSignal,\n expectedMasterFingerprint?: string,\n options?: { waitForReenumeration?: boolean }\n ): Promise<KeystoneDeviceRecord | undefined> {\n KeystoneAdapter._throwIfAborted(signal);\n if (!expectedMasterFingerprint || this._forcedTransport === 'qr' || !this._usbConnector) {\n return undefined;\n }\n\n const maxAttempts = options?.waitForReenumeration ? KEYSTONE_USB_REATTACH_PROBE_ATTEMPTS : 1;\n let availableDevices: ConnectorDevice[] = [];\n let lastSearchError: unknown;\n for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {\n KeystoneAdapter._throwIfAborted(signal);\n try {\n // eslint-disable-next-line no-await-in-loop\n availableDevices = await KeystoneAdapter._abortable(\n signal,\n this._usbConnector.searchDevices({ purpose: 'availability' })\n );\n lastSearchError = undefined;\n } catch (error) {\n lastSearchError = error;\n }\n KeystoneAdapter._throwIfAborted(signal);\n if (availableDevices.length) {\n break;\n }\n if (attempt < maxAttempts) {\n // eslint-disable-next-line no-await-in-loop\n await KeystoneAdapter._abortable(signal, waitForKeystoneUsbReattachProbe());\n }\n }\n if (!availableDevices.length) {\n if (this._forcedTransport === 'usb' && lastSearchError) {\n throw lastSearchError instanceof Error\n ? lastSearchError\n : new Error(String(lastSearchError));\n }\n return undefined;\n }\n\n // Enumeration retries are silent; the connect runs once, targeted at the expected mfp.\n const attached = await this._connectUsb({ expectedMasterFingerprint }, undefined, signal);\n KeystoneAdapter._throwIfAborted(signal);\n // A cancelled transfer still draining is busy, not absent; don't fall back to QR.\n if (!attached.success && attached.payload.code === HardwareErrorCode.DeviceBusyInternal) {\n throw createHwkError({\n ...attached.payload,\n message: attached.payload.error,\n });\n }\n return attached.success ? this._devices.get(expectedMasterFingerprint) : undefined;\n }\n\n /**\n * Decides QR vs USB for one UR round trip. A pinned 'usb' with no live session fails closed;\n * otherwise a failed USB reattach leaves the call on QR.\n */\n private async _resolveUr(\n record: KeystoneDeviceRecord | undefined,\n requestUr: KeystoneUr,\n animated: boolean,\n operationId: string | undefined,\n signal: AbortSignal,\n operationName?: string\n ): Promise<KeystoneUr> {\n const releaseOperationRetention = isHardwareOperationId(operationId)\n ? this._operations.retain(operationId)\n : undefined;\n try {\n return await this._resolveUrWithRoute(\n record,\n requestUr,\n animated,\n operationId,\n signal,\n operationName\n );\n } finally {\n releaseOperationRetention?.();\n }\n }\n\n private async _resolveUrWithRoute(\n callerRecord: KeystoneDeviceRecord | undefined,\n requestUr: KeystoneUr,\n animated: boolean,\n operationId: string | undefined,\n signal: AbortSignal,\n operationName?: string\n ): Promise<KeystoneUr> {\n let record = callerRecord;\n let interactionRoute: OperationRoute | undefined;\n if (isHardwareOperationId(operationId)) {\n const operation = this._operations.resolve(operationId);\n const route = this._operationRoutes.get(operation.connectId);\n if (!route || route.operationId !== operationId) {\n throw this._endDisconnectedOperation(\n operationId,\n 'Keystone hardware operation is no longer connected'\n );\n }\n interactionRoute = route;\n }\n // One best-effort USB reattach; a failure is not surfaced and the call stays on QR.\n if (\n !interactionRoute &&\n !this._forcedTransport &&\n record &&\n !record.usbSessionId &&\n this._usbConnector\n ) {\n record =\n (await this._tryUsbAttach(signal, record.masterFingerprint, {\n waitForReenumeration: record.hadUsbSession,\n })) ?? record;\n }\n\n const wantUsb = interactionRoute\n ? interactionRoute.connectionType === 'usb'\n : this._forcedTransport === 'usb' ||\n (this._forcedTransport !== 'qr' && Boolean(record?.usbSessionId));\n if (wantUsb) {\n if (!record?.usbSessionId || !this._usbConnector) {\n if (interactionRoute) {\n throw this._endDisconnectedOperation(\n interactionRoute.operationId,\n 'Keystone operation USB connection was lost'\n );\n }\n throw createHwkError({\n code: HardwareErrorCode.TransportNotAvailable,\n message: 'USB channel is not connected for this Keystone wallet',\n });\n }\n const result = await this._callUsbConnector(\n record.usbSessionId,\n 'resolveUr',\n requestUr,\n signal\n );\n if (result.success) return result.payload as KeystoneUr;\n\n const usbError = rehydrateConnectorError(result.error);\n const { origin: usbErrorOrigin, code: usbErrorCode } = usbError as Error & {\n origin?: string;\n code?: number;\n };\n if (usbErrorCode === HardwareErrorCode.PayloadTooLarge && usbErrorOrigin !== 'device') {\n if (!interactionRoute && !this._forcedTransport) {\n const displayDevice = toDeviceInfo(record);\n return this._requestQrDisplayAndAwaitResponse(\n displayDevice,\n { ...requestUr, animated },\n signal\n );\n }\n // Rejected by the host before sending: keep the pinned session and report\n // the limit without implying the operation ran.\n throw usbError;\n }\n // No QR retry once the request is on the wire. Only a pipe failure drops the session;\n // `origin` decides when stamped, else the code list of device answers.\n const deviceAnswered =\n usbErrorOrigin !== undefined\n ? usbErrorOrigin === 'device'\n : usbErrorCode === HardwareErrorCode.UserRejected ||\n usbErrorCode === HardwareErrorCode.UserAborted ||\n usbErrorCode === HardwareErrorCode.DeviceLocked ||\n usbErrorCode === HardwareErrorCode.DeviceMismatch;\n if (!deviceAnswered) {\n // Hand the session back so the connector releases its transport and listener.\n const lostSessionId = record.usbSessionId;\n if (lostSessionId) {\n this._usbConnector?.disconnect(lostSessionId).catch(() => undefined);\n }\n record.usbSessionId = undefined;\n if (interactionRoute) {\n throw this._endDisconnectedOperation(\n interactionRoute.operationId,\n operationName\n ? `Keystone ${operationName} may have completed before the USB connection was lost`\n : 'Keystone operation USB connection was lost',\n operationName\n );\n }\n if (operationName) {\n throw createHwkError({\n code: (usbErrorCode as HardwareErrorCode) ?? HardwareErrorCode.TransportError,\n message: `Keystone ${operationName} may have completed before the USB connection was lost`,\n origin: 'transport',\n recovery: { scope: 'unknown' },\n params: operationMayHaveCompletedParams(operationName),\n });\n }\n }\n throw usbError;\n }\n\n const displayDevice = record ? toDeviceInfo(record) : placeholderDeviceInfo();\n try {\n return await this._requestQrDisplayAndAwaitResponse(\n displayDevice,\n { ...requestUr, animated },\n signal\n );\n } catch (error) {\n const { code, _tag: tag } = error as { code?: unknown; _tag?: unknown };\n if (\n operationName &&\n (code === HardwareErrorCode.OperationTimeout || tag === UI_REQUEST_TIMEOUT_TAG)\n ) {\n throw createHwkError({\n code: HardwareErrorCode.OperationTimeout,\n message: `Keystone ${operationName} may have completed before the QR response timed out`,\n recovery: { scope: 'unknown' },\n params: operationMayHaveCompletedParams(operationName),\n });\n }\n throw error;\n }\n }\n\n /** Ends the operation as disconnected and returns the error to throw. */\n private _endDisconnectedOperation(\n operationId: string,\n message: string,\n operationName?: string\n ): Error {\n this._operations.end(operationId, 'disconnect');\n const params = { operationId, reason: 'disconnect' };\n return createHwkError({\n code: HardwareErrorCode.OperationEnded,\n message,\n recovery: operationName ? { scope: 'unknown' } : undefined,\n params: operationName ? operationMayHaveCompletedParams(operationName, params) : params,\n });\n }\n\n /**\n * Fetches one account's key material for this operation only; `book` reuses earlier fetches. A\n * failed USB export ends the operation without replaying or switching transports.\n */\n private async _fetchAccount(\n connectId: string | undefined,\n deviceId: string | undefined,\n hwkChain: ChainCapability,\n syncPath: string,\n signal: AbortSignal,\n book?: AccountBook\n ): Promise<{ record: KeystoneDeviceRecord; account: KeystoneAccountEntry }> {\n const target = this._resolveTarget(connectId, deviceId);\n const operationConnectionType = isHardwareOperationId(connectId)\n ? this._operations.resolve(connectId).connectionType\n : undefined;\n const key = accountKey(hwkChain, syncPath);\n\n let existingRecord = target.record;\n if (!existingRecord) {\n existingRecord = await this._tryUsbAttach(signal, target.expectedMasterFingerprint);\n KeystoneAdapter._throwIfAborted(signal);\n }\n const booked = book?.get(key);\n if (existingRecord && booked) {\n return { record: existingRecord, account: booked };\n }\n if (\n !operationConnectionType &&\n existingRecord &&\n !existingRecord.usbSessionId &&\n this._forcedTransport === 'usb'\n ) {\n // Pinned to USB without a session: attach here so enumeration errors\n // surface (resolveUr skips its probe for pinned transports).\n await this._tryUsbAttach(signal, existingRecord.masterFingerprint, {\n waitForReenumeration: existingRecord.hadUsbSession,\n });\n KeystoneAdapter._throwIfAborted(signal);\n existingRecord = this._devices.get(existingRecord.masterFingerprint) ?? existingRecord;\n }\n\n // A leftover USB session must not change a QR operation's request.\n const useSinglePathUsbExport = operationConnectionType\n ? operationConnectionType === 'usb'\n : this._forcedTransport !== 'qr' && Boolean(existingRecord?.usbSessionId);\n const schemas = [keySchema(hwkChain, syncPath)];\n const requestUr = this.urEngine.buildKeyDerivationRequest({ schemas, origin: this._origin });\n const responseUr = await this._resolveUr(existingRecord, requestUr, false, connectId, signal);\n KeystoneAdapter._throwIfAborted(signal);\n\n const parsed = this.urEngine.parseAccountResponse(responseUr);\n let record: KeystoneDeviceRecord;\n if (useSinglePathUsbExport && existingRecord) {\n if (parsed.masterFingerprint !== existingRecord.masterFingerprint) {\n throw createHwkError({\n code: HardwareErrorCode.DeviceMismatch,\n message: 'Keystone USB account export returned a different master fingerprint',\n });\n }\n record = existingRecord;\n } else {\n this._assertParsedIdentity(parsed, target);\n record = this._upsertDeviceRecord(parsed, {\n viaUsb: operationConnectionType !== 'qr' && Boolean(existingRecord?.usbSessionId),\n });\n }\n const account = parsed.accounts.find(a => normalizePath(a.path) === syncPath);\n if (!account) {\n throw createHwkError({\n code: HardwareErrorCode.DeviceMismatch,\n message: `Keystone did not return the requested derivation path (${syncPath})`,\n });\n }\n const entry: KeystoneAccountEntry = { ...account, hwkChain };\n if (book) {\n // Everything the device answered stays usable for this operation.\n for (const returned of parsed.accounts) {\n const returnedChain = inferHwkChainFromPath(returned.path);\n if (returnedChain) {\n book.set(accountKey(returnedChain, returned.path), {\n ...returned,\n hwkChain: returnedChain,\n });\n }\n }\n book.set(key, entry);\n }\n return { record, account: entry };\n }\n\n /**\n * Resolves which wallet is attached, without a per-path account. `CHAIN_FINGERPRINT_PATHS.evm` is\n * a leaf path, so it is cut to the account path Keystone expects.\n */\n private async _ensureWalletKnown(\n connectId: string | undefined,\n deviceId: string | undefined,\n chain: ChainForFingerprint,\n signal: AbortSignal\n ): Promise<{ record: KeystoneDeviceRecord }> {\n const target = this._resolveTarget(connectId, deviceId);\n if (target.record) return { record: target.record };\n\n const attached = await this._tryUsbAttach(signal, target.expectedMasterFingerprint);\n KeystoneAdapter._throwIfAborted(signal);\n if (attached) return { record: attached };\n\n // The caller named the wallet: its mfp is all a signing request needs, and a wrong wallet is\n // refused by the device itself. No identity round trip first.\n if (target.expectedMasterFingerprint) {\n return { record: createDeviceRecord(target.expectedMasterFingerprint) };\n }\n\n // A true cold start: ask the device once for any account, which carries the mfp.\n const { accountPath } = splitAccountPath(CHAIN_FINGERPRINT_PATHS[chain]);\n const requestUr = this.urEngine.buildKeyDerivationRequest({\n schemas: [keySchema(chain, accountPath)],\n origin: this._origin,\n });\n const responseUr = await this._resolveUr(undefined, requestUr, false, connectId, signal);\n KeystoneAdapter._throwIfAborted(signal);\n\n return { record: this._upsertDeviceRecord(this.urEngine.parseAccountResponse(responseUr)) };\n }\n\n /**\n * The operation owning the running job, so a mid-call UI request can name it. Unpinned jobs map\n * through the operation route; a cold start returns undefined.\n */\n private _activeOperationId(): string | undefined {\n const activeJobId = this._jobQueue.getActiveJob()?.deviceId;\n if (!activeJobId) return undefined;\n if (isHardwareOperationId(activeJobId)) return activeJobId;\n return this._operationRouteForIdentifier(activeJobId)?.operationId;\n }\n\n /** Routes are keyed by connectId; a job key may be the bare master fingerprint. */\n private _operationRouteForIdentifier(identifier: string): OperationRoute | undefined {\n for (const key of keystoneCancelQueueKeys([identifier])) {\n const route = this._operationRoutes.get(key);\n if (route) return route;\n }\n const masterFingerprint = keystoneMfpFromIdentifier(identifier);\n return masterFingerprint\n ? this._operationRoutes.get(walletConnectId(masterFingerprint))\n : undefined;\n }\n\n /**\n * A QR prompt has no transport to interrupt; releasing the registry slot on abort is what lets\n * a cancel reach the wait before the QR timeout.\n */\n private async _awaitQrResponse<T>(\n requestType: string,\n pending: Promise<T>,\n signal?: AbortSignal\n ): Promise<T> {\n if (!signal) return pending;\n let settled = false;\n const onAbort = () => {\n if (!settled) this._uiRegistry.cancel(requestType);\n };\n if (signal.aborted) onAbort();\n else signal.addEventListener('abort', onAbort, { once: true });\n try {\n return await pending;\n } finally {\n settled = true;\n signal.removeEventListener('abort', onAbort);\n }\n }\n\n private async _requestQrDisplayAndAwaitResponse(\n device: DeviceInfo,\n data: QrDisplayData,\n signal?: AbortSignal\n ): Promise<KeystoneUr> {\n const operationId = this._activeOperationId();\n const waitPromise = this._uiRegistry.wait<{ urType: string; urData: string }>(\n UI_REQUEST.REQUEST_QR_DISPLAY,\n { timeoutMs: this._qrTimeoutMs, operationId }\n );\n this.emitter.emit(UI_REQUEST.REQUEST_QR_DISPLAY, {\n type: UI_REQUEST.REQUEST_QR_DISPLAY,\n payload: { device, data, operationId },\n });\n const response = await this._awaitQrResponse(\n UI_REQUEST.REQUEST_QR_DISPLAY,\n waitPromise,\n signal\n );\n return { urType: response.urType, urData: response.urData };\n }\n\n private async _requestQrScanAndAwaitResponse(\n device: DeviceInfo,\n signal?: AbortSignal\n ): Promise<KeystoneUr> {\n const operationId = this._activeOperationId();\n const waitPromise = this._uiRegistry.wait<{ urType: string; urData: string }>(\n UI_REQUEST.REQUEST_QR_SCAN,\n { timeoutMs: this._qrTimeoutMs, operationId }\n );\n this.emitter.emit(UI_REQUEST.REQUEST_QR_SCAN, {\n type: UI_REQUEST.REQUEST_QR_SCAN,\n payload: { device, operationId },\n });\n const response = await this._awaitQrResponse(UI_REQUEST.REQUEST_QR_SCAN, waitPromise, signal);\n return { urType: response.urType, urData: response.urData };\n }\n\n private async _callUsbConnector(\n sessionId: string,\n method: string,\n params: unknown,\n signal?: AbortSignal\n ): Promise<ConnectorCallResult> {\n if (!this._usbConnector) {\n throw createHwkError({\n code: HardwareErrorCode.TransportNotAvailable,\n message: 'No USB connector configured for this Keystone adapter',\n });\n }\n if (this._pendingUsbTeardowns > 0 || this._unsettledUsbOperations.size > 0) {\n throw createHwkError({\n code: HardwareErrorCode.DeviceBusyInternal,\n message: `Keystone USB is busy while calling ${method}`,\n });\n }\n // Checked before the connector call: racing an aborted signal would still put\n // the command on the wire.\n if (signal?.aborted) {\n throw signal.reason instanceof Error\n ? signal.reason\n : createHwkError({\n code: HardwareErrorCode.UserAborted,\n message: 'User aborted operation',\n });\n }\n const releaseOperation = this._retainUsbOperation(`call:${sessionId}`);\n let rawCall: Promise<ConnectorCallResult>;\n try {\n rawCall = this._usbConnector.call(sessionId, method, params).finally(releaseOperation);\n } catch (error) {\n releaseOperation();\n throw error;\n }\n return signal ? KeystoneAdapter._abortable(signal, rawCall) : rawCall;\n }\n\n private _runUsbTeardown(task: () => Promise<void>): Promise<void> {\n const previous = this._usbTeardownTail;\n let releaseTail: () => void = () => undefined;\n this._usbTeardownTail = new Promise<void>(resolve => {\n releaseTail = resolve;\n });\n this._pendingUsbTeardowns += 1;\n return (async () => {\n try {\n await previous;\n await this._waitForUsbOperationsToDrain();\n await task();\n } finally {\n this._pendingUsbTeardowns -= 1;\n releaseTail();\n }\n })();\n }\n\n private _waitForUsbOperationsToDrain(): Promise<void> {\n if (this._unsettledUsbOperations.size === 0) return Promise.resolve();\n return new Promise(resolve => {\n this._usbIdleWaiters.add(resolve);\n });\n }\n\n private _retainUsbOperation(key: string): () => void {\n this._unsettledUsbOperations.set(key, (this._unsettledUsbOperations.get(key) ?? 0) + 1);\n let released = false;\n return () => {\n if (released) return;\n released = true;\n const remaining = (this._unsettledUsbOperations.get(key) ?? 1) - 1;\n if (remaining > 0) {\n this._unsettledUsbOperations.set(key, remaining);\n } else {\n this._unsettledUsbOperations.delete(key);\n }\n if (this._unsettledUsbOperations.size === 0) {\n for (const resolve of this._usbIdleWaiters) resolve();\n this._usbIdleWaiters.clear();\n }\n };\n }\n\n private static _abortable<T>(signal: AbortSignal, promise: Promise<T>): Promise<T> {\n const abortReason = () =>\n signal.reason instanceof Error ? signal.reason : new Error('Aborted');\n if (signal.aborted) return Promise.reject(abortReason());\n return new Promise<T>((resolve, reject) => {\n const onAbort = () => reject(abortReason());\n signal.addEventListener('abort', onAbort, { once: true });\n promise.then(\n value => {\n signal.removeEventListener('abort', onAbort);\n resolve(value);\n },\n error => {\n signal.removeEventListener('abort', onAbort);\n reject(error);\n }\n );\n });\n }\n\n private static _throwIfAborted(signal: AbortSignal | undefined): void {\n if (signal?.aborted) {\n throw signal.reason instanceof Error ? signal.reason : new Error('Operation aborted');\n }\n }\n\n /** A response without the request's id is as unrelated as one with another id. */\n private static _assertRequestIdMatches(expected: string, actual?: string): void {\n if (!actual || actual.toLowerCase() !== expected.toLowerCase()) {\n throw createHwkError({\n code: HardwareErrorCode.DeviceMismatch,\n message: actual\n ? 'Keystone response requestId does not match the pending request — discarding a stale or unrelated scan'\n : 'Keystone response carries no requestId — discarding a stale or unrelated scan',\n });\n }\n }\n\n private _unsupported<T>(method: string, reason: string): Promise<Response<T>> {\n return Promise.resolve(\n failure(\n HardwareErrorCode.MethodNotSupported,\n `KeystoneAdapter.${method} is not implemented yet: ${reason}`\n )\n );\n }\n\n private _errorToFailure<T>(err: unknown): Response<T> {\n if (err && typeof err === 'object') {\n const e = err as {\n code?: unknown;\n message?: string;\n params?: Record<string, unknown>;\n _tag?: string;\n recovery?: unknown;\n };\n // Only five-digit codes are HWK codes; a DOMException code or errno falls\n // through to UnknownError with its message.\n if (typeof e.code === 'number' && e.code >= 10000 && e.code <= 99999) {\n const { origin } = e as { origin?: unknown };\n return failure(\n e.code as HardwareErrorCode,\n e.message ?? 'Unknown error',\n e.params,\n origin === 'device' || origin === 'transport' || origin === 'host' ? origin : undefined,\n isHwkRecoveryHint(e.recovery) ? e.recovery : undefined\n );\n }\n if (e._tag === UI_REQUEST_CANCELLED_TAG || e._tag === UI_REQUEST_PREEMPTED_TAG) {\n return failure(\n HardwareErrorCode.UserAborted,\n e.message ?? 'Keystone QR operation was cancelled'\n );\n }\n if (e._tag === UI_REQUEST_TIMEOUT_TAG) {\n return failure(\n HardwareErrorCode.OperationTimeout,\n e.message ?? 'Keystone QR operation timed out'\n );\n }\n }\n const message = err instanceof Error ? err.message : String(err);\n // An uncoded error here is usually a real bug; keep the stack for the host.\n const params = err instanceof Error && err.stack ? { stack: err.stack } : undefined;\n return failure(HardwareErrorCode.UnknownError, message, params);\n }\n}\n","import type { BtcScriptType } from '../urEngine/types';\n\n/** Always returns an `m/`-prefixed path, regardless of the input's casing/prefix. */\nexport function normalizePath(path: string): string {\n const trimmed = path.trim();\n return /^m\\//i.test(trimmed) ? `m/${trimmed.slice(2)}` : `m/${trimmed}`;\n}\n\n/**\n * Splits a 5-segment BIP-44 leaf path into the 3-segment account path and the relative\n * `change/index`; a path of 3 or fewer segments is already an account path.\n */\nexport function splitAccountPath(path: string): {\n accountPath: string;\n relativeDerivePath: string;\n} {\n const normalized = normalizePath(path);\n const segments = normalized.slice(2).split('/');\n if (segments.length <= 3) {\n return { accountPath: normalized, relativeDerivePath: '' };\n }\n const accountSegments = segments.slice(0, segments.length - 2);\n const relativeSegments = segments.slice(segments.length - 2);\n return {\n accountPath: `m/${accountSegments.join('/')}`,\n relativeDerivePath: relativeSegments.join('/'),\n };\n}\n\n/** BIP-44/49/84/86 purpose to script type; undefined for any other purpose. */\nexport function btcScriptTypeFromPath(path: string): BtcScriptType | undefined {\n const match = normalizePath(path).match(/^m\\/(\\d+)'/);\n if (!match) return undefined;\n switch (Number(match[1])) {\n case 44:\n return 'p2pkh';\n case 49:\n return 'p2sh-p2wpkh';\n case 84:\n return 'p2wpkh';\n case 86:\n return 'p2tr';\n default:\n return undefined;\n }\n}\n\n/**\n * Firmware signs BTC only against account-0 xpubs (gui_btc.c PreparePublicKeys). Testnet is\n * excluded because addresses are derived with mainnet parameters.\n */\nexport function isKeystoneSignableBtcAccountPath(accountPath: string): boolean {\n const segments = normalizePath(accountPath).slice(2).split('/');\n if (segments.length !== 3) return false;\n const [purpose, coin, account] = segments;\n return [\"44'\", \"49'\", \"84'\", \"86'\"].includes(purpose) && coin === \"0'\" && account === \"0'\";\n}\n\nexport const KEYSTONE_BTC_ACCOUNT_FORBIDDEN_MESSAGE =\n \"Keystone BTC is limited to mainnet account 0 (m/44'|49'|84'|86'/0'/0')\";\n","import { normalizePath } from './pathUtils';\n\nimport type { KeystoneParsedAccount } from '../urEngine/types';\nimport type { ChainCapability, DeviceCapabilities, DeviceInfo } from '@onekeyfe/hwk-adapter-core';\n\nexport const KEYSTONE_WALLET_CONNECT_ID_PREFIX = 'keystone-wallet:';\n\n/** Account a QR cold start requests when the caller named no path; any path returns the mfp. */\nexport const KEYSTONE_COLD_START_PATH = \"m/44'/60'/0'\";\n\nexport function walletConnectId(masterFingerprint: string): string {\n return `${KEYSTONE_WALLET_CONNECT_ID_PREFIX}${masterFingerprint}`;\n}\n\nexport interface KeystoneAccountEntry extends KeystoneParsedAccount {\n hwkChain: ChainCapability;\n}\n\nexport function accountKey(hwkChain: ChainCapability, path: string): string {\n return `${hwkChain}:${normalizePath(path)}`;\n}\n\nexport interface KeystoneDeviceRecord {\n /** Lowercase 8-char BIP32 master fingerprint: the wallet identity and the BC-UR xfp. */\n masterFingerprint: string;\n connectId: string;\n /** Optional physical-device id exposed by some Keystone QR export menus. */\n hardwareDeviceId?: string;\n /** Model string from the device (e.g. \"Keystone 3 Pro\"); not unique per unit. */\n model?: string;\n deviceVersion?: string;\n importedAt: number;\n /** Connector session id while a live USB session exists; its presence routes calls over USB. */\n usbSessionId?: string;\n /**\n * Stays true after the USB session is lost, so only these wallets wait through the device's\n * USB re-enumeration window.\n */\n hadUsbSession?: boolean;\n /** True after one QR round trip; on USB disconnect it decides demote-to-QR versus drop. */\n qrSynced?: boolean;\n}\n\nexport function createDeviceRecord(masterFingerprint: string): KeystoneDeviceRecord {\n return {\n masterFingerprint,\n connectId: walletConnectId(masterFingerprint),\n importedAt: Date.now(),\n };\n}\n\nconst CAPABILITIES: DeviceCapabilities = { persistentDeviceIdentity: true };\n\nexport function toDeviceInfo(record: KeystoneDeviceRecord): DeviceInfo {\n // `connectionType` is the channel a call would use now; `raw.availableChannels`\n // lists both for a merged QR + USB wallet.\n let availableChannels: Array<'qr' | 'usb'> = ['qr'];\n if (record.usbSessionId) {\n availableChannels = record.qrSynced ? ['qr', 'usb'] : ['usb'];\n }\n return {\n vendor: 'keystone',\n model: record.model ?? 'unknown',\n modelName: record.model,\n firmwareVersion: record.deviceVersion ?? '0.0.0',\n deviceId: record.masterFingerprint,\n connectId: record.connectId,\n connectionType: record.usbSessionId ? 'usb' : 'qr',\n capabilities: CAPABILITIES,\n raw: {\n availableChannels,\n masterFingerprint: record.masterFingerprint,\n hardwareDeviceId: record.hardwareDeviceId,\n },\n };\n}\n\n/** Device row for a not-yet-synced wallet during a cold-start round trip. */\nexport function placeholderDeviceInfo(): DeviceInfo {\n return {\n vendor: 'keystone',\n model: 'unknown',\n firmwareVersion: '0.0.0',\n deviceId: '',\n connectId: '',\n connectionType: 'qr',\n capabilities: CAPABILITIES,\n };\n}\n","/**\n * Single source of the device-queue key: enqueue, the all-network cancel scope and `cancel()`\n * must agree or a cancel misses its target. A pinned operation id wins.\n */\nimport { isHardwareOperationId, parseWalletMasterFingerprint } from '@onekeyfe/hwk-adapter-core';\n\nimport { KEYSTONE_WALLET_CONNECT_ID_PREFIX } from '../adapter/deviceTable';\n\n/** Queue key for a cold start, which has neither a connectId nor a deviceId yet. */\nexport const KEYSTONE_COLD_START_JOB_LABEL = 'keystone-cold-start';\n\nexport function keystoneQueueKey(connectId?: string, deviceId?: string): string {\n return isHardwareOperationId(connectId)\n ? connectId\n : deviceId || connectId || KEYSTONE_COLD_START_JOB_LABEL;\n}\n\n/** A Keystone identifier is either a wallet connectId or the bare 8-hex master fingerprint. */\nexport function keystoneMfpFromIdentifier(identifier: string): string | undefined {\n const value = identifier.startsWith(KEYSTONE_WALLET_CONNECT_ID_PREFIX)\n ? identifier.slice(KEYSTONE_WALLET_CONNECT_ID_PREFIX.length)\n : identifier;\n return parseWalletMasterFingerprint(value);\n}\n\n/**\n * Every queue key one identifier can stand for, so a cancel that knows only one of operation id,\n * connectId or master fingerprint fans out over all of them.\n */\nexport function keystoneCancelQueueKeys(identifiers: (string | undefined)[]): Set<string> {\n const keys = new Set<string>();\n for (const identifier of identifiers) {\n if (identifier) {\n keys.add(identifier);\n const masterFingerprint = keystoneMfpFromIdentifier(identifier);\n if (masterFingerprint) keys.add(masterFingerprint);\n }\n }\n return keys;\n}\n"],"mappings":"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","names":["import_bc_ur_registry","decodeToDataItem","decodeToDataItem","HDKey","uuidParse","uuidStringify","bs58check","import_uuid","import_hwk_adapter_core","import_hwk_adapter_core","resolveGenericHardwareOperationTarget","bs58","uuidv4","displayDevice"]}
|