@bwalletx/connect 0.0.0-stage → 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/discover.ts","../node_modules/@bsv/sdk/src/primitives/BigNumber.ts","../node_modules/@bsv/sdk/src/primitives/Mersenne.ts","../node_modules/@bsv/sdk/src/primitives/K256.ts","../node_modules/@bsv/sdk/src/primitives/ReductionContext.ts","../node_modules/@bsv/sdk/src/primitives/MontgomoryMethod.ts","../node_modules/@bsv/sdk/src/primitives/UTF8.ts","../node_modules/@bsv/sdk/src/primitives/hex.ts","../node_modules/@bsv/sdk/src/primitives/Hash.ts","../node_modules/@bsv/sdk/src/primitives/utils.ts","../node_modules/@bsv/sdk/src/primitives/Curve.ts","../node_modules/@bsv/sdk/src/primitives/BasePoint.ts","../node_modules/@bsv/sdk/src/primitives/JacobianPoint.ts","../node_modules/@bsv/sdk/src/primitives/Point.ts","../node_modules/@bsv/sdk/src/primitives/PublicKey.ts","../node_modules/@bsv/sdk/src/primitives/Signature.ts","../node_modules/@bsv/sdk/src/primitives/DRBG.ts","../node_modules/@bsv/sdk/src/primitives/ECDSA.ts","../node_modules/@bsv/sdk/src/primitives/Random.ts","../node_modules/@bsv/sdk/src/primitives/Polynomial.ts","../node_modules/@bsv/sdk/src/primitives/PrivateKey.ts","../src/in-order.ts","../src/protocol.ts","../src/pair.ts","../src/signin.ts","../src/button.ts"],"sourcesContent":["export { findBwalletX, discoverBwalletX, BWALLETX_RDNS, RDNS_EXTENSION, RDNS_MOBILE } from './discover.js';\nexport type { FoundWallet, FoundBy } from './discover.js';\nexport { pairBwalletX, restorePairing, clearPairing } from './pair.js';\nexport type { PairingOptions, PairConnectionOptions, PairStorage, PairedWallet, SocketLike, SocketFactory } from './pair.js';\nexport { signInWithBwalletX, connectBwalletX, LOGIN_PROTOCOL } from './signin.js';\nexport type { Challenge, SignInOptions, SignInResult, SignInMethod } from './signin.js';\nexport { renderButton, LOGO_URL } from './button.js';\nexport type { ButtonOptions } from './button.js';\nexport { inOrder } from './in-order.js';\n","import type { WalletInterface } from '@bsv/sdk';\n\n/** Ids bWalletX announces in BRC-100 wallet discovery. */\nexport const RDNS_EXTENSION = 'com.bwalletx.extension';\nexport const RDNS_MOBILE = 'space.bwallet.mobile';\nexport const BWALLETX_RDNS = [RDNS_EXTENSION, RDNS_MOBILE] as const;\n\nexport type FoundBy = 'extension' | 'in-app';\n\nexport interface FoundWallet {\n wallet: WalletInterface;\n /** 'extension' for the Chrome extension; 'in-app' inside the bWalletX app's own browser. */\n method: FoundBy;\n rdns: string | null;\n}\n\n/**\n * Like findBwalletX, but also says which bWalletX answered.\n * Order: a BRC-100 announcement with a bWalletX rdns; then `window.CWI` (set by the in-app\n * browser, and by older builds that do not announce); otherwise null.\n */\nexport function discoverBwalletX(ms = 1200): Promise<FoundWallet | null> {\n if (typeof window === 'undefined') return Promise.resolve(null);\n return new Promise((resolve) => {\n let done = false;\n const finish = (r: FoundWallet | null) => {\n if (done) return;\n done = true;\n window.removeEventListener('brc100:announceWallet', onAnnounce);\n resolve(r);\n };\n const onAnnounce = (e: Event) => {\n const d = (e as CustomEvent).detail as { info?: { rdns?: string }; wallet?: WalletInterface } | undefined;\n const rdns = d?.info?.rdns ?? '';\n if (d?.wallet && (BWALLETX_RDNS as readonly string[]).includes(rdns)) {\n finish({ wallet: d.wallet, method: rdns === RDNS_EXTENSION ? 'extension' : 'in-app', rdns });\n }\n };\n window.addEventListener('brc100:announceWallet', onAnnounce);\n window.dispatchEvent(new Event('brc100:requestWallet'));\n setTimeout(() => {\n const cwi = (window as unknown as { CWI?: WalletInterface }).CWI;\n finish(cwi ? { wallet: cwi, method: 'in-app', rdns: null } : null);\n }, ms);\n });\n}\n\n/**\n * Find bWalletX in this page: the extension on a computer, or the wallet itself when the page is\n * open in bWalletX's in-app browser. Resolves null if nothing answered within `ms`.\n */\nexport async function findBwalletX(ms = 1200): Promise<WalletInterface | null> {\n return (await discoverBwalletX(ms))?.wallet ?? null;\n}\n","// @ts-nocheck\n// Modified bn.js lineage; see ../../THIRD_PARTY_NOTICES.md and ../../LICENSES/bn.js-MIT.txt.\nimport ReductionContext from './ReductionContext.js'\n\n/** Comparison result: -1 (less than), 0 (equal), or 1 (greater than). */\ntype CompareResult = 1 | 0 | -1\n\nconst BufferCtor = (globalThis as any).Buffer\nconst CAN_USE_BUFFER = BufferCtor != null && typeof BufferCtor.from === 'function'\nconst HEX_CHAR_TO_VALUE = new Int8Array(256).fill(-1)\nfor (let i = 0; i < 10; i++) {\n HEX_CHAR_TO_VALUE[48 + i] = i // '0'-'9'\n}\nfor (let i = 0; i < 6; i++) {\n HEX_CHAR_TO_VALUE[65 + i] = 10 + i // 'A'-'F'\n HEX_CHAR_TO_VALUE[97 + i] = 10 + i // 'a'-'f'\n}\n\n/**\n * JavaScript numbers are only precise up to 53 bits. Since Bitcoin relies on\n * 256-bit cryptography, this BigNumber class enables operations on larger\n * numbers.\n *\n * @class BigNumber\n */\nexport default class BigNumber {\n /**\n * @privateinitializer\n */\n public static readonly zeros: string[] = [\n '',\n '0',\n '00',\n '000',\n '0000',\n '00000',\n '000000',\n '0000000',\n '00000000',\n '000000000',\n '0000000000',\n '00000000000',\n '000000000000',\n '0000000000000',\n '00000000000000',\n '000000000000000',\n '0000000000000000',\n '00000000000000000',\n '000000000000000000',\n '0000000000000000000',\n '00000000000000000000',\n '000000000000000000000',\n '0000000000000000000000',\n '00000000000000000000000',\n '000000000000000000000000',\n '0000000000000000000000000'\n ]\n\n /**\n * @privateinitializer\n */\n static readonly groupSizes: number[] = [\n 0, 0, 25, 16, 12, 11, 10, 9, 8, 8, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n 5, 5, 5, 5, 5, 5, 5\n ]\n\n /**\n * @privateinitializer\n */\n static readonly groupBases: number[] = [\n 0, 0, 33554432, 43046721, 16777216, 48828125, 60466176, 40353607, 16777216, 43046721, 10000000,\n 19487171, 35831808, 62748517, 7529536, 11390625, 16777216, 24137569, 34012224, 47045881,\n 64000000, 4084101, 5153632, 6436343, 7962624, 9765625, 11881376, 14348907, 17210368, 20511149,\n 24300000, 28629151, 33554432, 39135393, 45435424, 52521875, 60466176\n ]\n\n /**\n * The word size of big number chunks.\n *\n * @property wordSize\n *\n * @example\n * console.log(BigNumber.wordSize); // output: 26\n */\n static readonly wordSize: number = 26\n static readonly #WORD_SIZE_BIGINT: bigint = 26n\n static readonly #WORD_MASK: bigint = (1n << 26n) - 1n\n static readonly #MAX_SAFE_INTEGER_BIGINT: bigint = BigInt(Number.MAX_SAFE_INTEGER)\n static readonly #MIN_SAFE_INTEGER_BIGINT: bigint = BigInt(Number.MIN_SAFE_INTEGER)\n static readonly #MAX_IMULN_ARG: number = 0x4000000 - 1\n static readonly #MAX_NUMBER_CONSTRUCTOR_MAG_BIGINT: bigint = (1n << 53n) - 1n\n // About 3.25 MiB of mathematical payload. Legitimate cryptographic values\n // are orders of magnitude smaller; this cap prevents hostile sparse-length\n // metadata from causing an unbounded dense JavaScript array allocation.\n static readonly #MAX_NOMINAL_WORD_LENGTH: number = 1_048_576\n\n #_magnitude: bigint = 0n\n #_sign: 0 | 1 = 0\n #_nominalWordLength: number = 1\n\n /**\n * Reduction context of the big number.\n *\n * @property red\n */\n public red: ReductionContext | null = null\n\n /**\n * Negative flag. Indicates whether the big number is a negative number.\n * - If 0, the number is positive.\n * - If 1, the number is negative.\n *\n * @property negative\n */\n public get negative(): number {\n return this.#_sign\n }\n\n /**\n * Sets the negative flag. Only 0 (positive) or 1 (negative) are allowed.\n */\n public set negative(val: number) {\n this.#assert(val === 0 || val === 1, 'Negative property must be 0 or 1')\n const newSign = val === 1 ? 1 : 0\n if (this.#_magnitude === 0n) {\n this.#_sign = 0\n } else {\n this.#_sign = newSign\n }\n }\n\n get #_computedWordsArray(): number[] {\n if (this.#_magnitude === 0n) return [0]\n const arr: number[] = []\n let temp = this.#_magnitude\n while (temp > 0n) {\n arr.push(Number(temp & BigNumber.#WORD_MASK))\n temp >>= BigNumber.#WORD_SIZE_BIGINT\n }\n return arr.length > 0 ? arr : [0]\n }\n\n /**\n * Array of numbers, where each number represents a part of the value of the big number.\n *\n * @property words\n */\n public get words(): number[] {\n if (\n !Number.isSafeInteger(this.#_nominalWordLength) ||\n this.#_nominalWordLength < 1 ||\n this.#_nominalWordLength > BigNumber.#MAX_NOMINAL_WORD_LENGTH\n ) {\n throw new Error('BigNumber word length exceeds the supported limit')\n }\n const computed = this.#_computedWordsArray\n if (this.#_nominalWordLength <= computed.length) {\n return computed\n }\n const paddedWords = Array.from({ length: this.#_nominalWordLength }).fill(0)\n for (let i = 0; i < computed.length; i++) {\n paddedWords[i] = computed[i]\n }\n return paddedWords\n }\n\n /**\n * Sets the words array representing the value of the big number.\n */\n public set words(newWords: number[]) {\n const oldSign = this.#_sign\n let newMagnitude = 0n\n const len = newWords.length > 0 ? newWords.length : 1\n for (let i = len - 1; i >= 0; i--) {\n const wordVal = newWords[i] ?? 0\n newMagnitude =\n (newMagnitude << BigNumber.#WORD_SIZE_BIGINT) |\n BigInt(wordVal & Number(BigNumber.#WORD_MASK))\n }\n this.#_magnitude = newMagnitude\n this.#_sign = oldSign\n this.#_nominalWordLength = len\n this.normSign()\n }\n\n /**\n * Length of the words array.\n *\n * @property length\n */\n public get length(): number {\n return Math.max(1, this.#_nominalWordLength)\n }\n\n /**\n * Checks whether a value is an instance of BigNumber. Regular JS numbers fail this check.\n *\n * @method isBN\n * @param num - The value to be checked.\n * @returns - Returns a boolean value determining whether or not the checked num parameter is a BigNumber.\n */\n static isBN(num: any): boolean {\n if (num instanceof BigNumber) return true\n return (\n num !== null &&\n typeof num === 'object' &&\n num.constructor?.wordSize === BigNumber.wordSize &&\n Array.isArray(num.words)\n )\n }\n\n /**\n * Returns the bigger value between two BigNumbers\n *\n * @method max\n * @param left - The first BigNumber to be compared.\n * @param right - The second BigNumber to be compared.\n * @returns - Returns the bigger BigNumber between left and right.\n */\n static max(left: BigNumber, right: BigNumber): BigNumber {\n return left.cmp(right) > 0 ? left : right\n }\n\n /**\n * Returns the smaller value between two BigNumbers\n *\n * @method min\n * @param left - The first BigNumber to be compared.\n * @param right - The second BigNumber to be compared.\n * @returns - Returns the smaller value between left and right.\n */\n static min(left: BigNumber, right: BigNumber): BigNumber {\n return left.cmp(right) < 0 ? left : right\n }\n\n /**\n * @constructor\n *\n * @param number - The number (various types accepted) to construct a BigNumber from. Default is 0.\n * @param base - The base of number provided. By default is 10.\n * @param endian - The endianness provided. By default is 'big endian'.\n */\n constructor(\n number: number | string | number[] | bigint | undefined = 0,\n base: number | 'be' | 'le' | 'hex' = 10,\n endian: 'be' | 'le' = 'be'\n ) {\n number ??= 0\n\n if (typeof number === 'bigint') {\n this.#_initializeState(number < 0n ? -number : number, number < 0n ? 1 : 0)\n this.normSign()\n return\n }\n\n const baseIsEndian = base === 'le' || base === 'be'\n const effectiveBase: number | 'hex' = baseIsEndian ? 10 : base\n const effectiveEndian: 'be' | 'le' = baseIsEndian ? base : endian\n\n if (typeof number === 'number') {\n this.#initNumber(number, effectiveEndian)\n return\n }\n if (Array.isArray(number)) {\n this.#initArray(number, effectiveEndian)\n return\n }\n if (typeof number === 'string') {\n this.#_initFromString(number, effectiveBase, effectiveEndian)\n return\n }\n\n if (number !== 0) {\n this.#assert(false, 'Unsupported input type for BigNumber constructor')\n } else {\n this.#_initializeState(0n, 0)\n }\n }\n\n #_initFromString(\n number: string,\n effectiveBase: number | 'hex',\n effectiveEndian: 'be' | 'le'\n ): void {\n if (effectiveBase === 'hex') effectiveBase = 16\n this.#assert(\n typeof effectiveBase === 'number' &&\n effectiveBase === Math.trunc(effectiveBase) &&\n effectiveBase >= 2 &&\n effectiveBase <= 36,\n 'Base must be an integer between 2 and 36'\n )\n const originalNumberStr = number.toString().replace(/\\s+/g, '')\n let start = 0\n let sign = 0\n if (originalNumberStr.startsWith('-')) {\n start++\n sign = 1\n } else if (originalNumberStr.startsWith('+')) {\n start++\n }\n\n const numStr = originalNumberStr.substring(start)\n if (numStr.length === 0) {\n this.#_initializeState(0n, sign === 1 && originalNumberStr.startsWith('-') ? 1 : 0)\n this.normSign()\n return\n }\n\n if (effectiveBase === 16) {\n this.#_initFromHexString(numStr, sign, effectiveEndian)\n } else {\n this.#_initFromNonHexString(numStr, effectiveBase, sign, effectiveEndian)\n }\n }\n\n #_initFromHexString(numStr: string, sign: number, effectiveEndian: 'be' | 'le'): void {\n if (effectiveEndian === 'le') {\n const bytes: number[] = []\n let hexStr = numStr\n if (hexStr.length % 2 !== 0) hexStr = '0' + hexStr\n for (let i = 0; i < hexStr.length; i += 2) {\n const byteHex = hexStr.substring(i, i + 2)\n const byteVal = Number.parseInt(byteHex, 16)\n if (Number.isNaN(byteVal)) throw new Error('Invalid character in ' + hexStr)\n bytes.push(byteVal)\n }\n this.#initArray(bytes, 'le')\n this.#_sign = sign\n this.normSign()\n } else {\n let tempMagnitude: bigint\n try {\n tempMagnitude = BigInt('0x' + numStr)\n } catch {\n throw new Error('Invalid character in ' + numStr)\n }\n this.#_initializeState(tempMagnitude, sign)\n this.normSign()\n }\n }\n\n #_initFromNonHexString(\n numStr: string,\n base: number,\n sign: number,\n effectiveEndian: 'be' | 'le'\n ): void {\n try {\n this.#_parseBaseString(numStr, base)\n this.#_sign = sign\n this.normSign()\n if (effectiveEndian === 'le') {\n const currentSign = this.#_sign\n this.#initArray(this.toArray('be'), 'le')\n this.#_sign = currentSign\n this.normSign()\n }\n } catch (err) {\n const error = err as Error\n if (\n error.message.includes('Invalid character in string') ||\n error.message.includes('Invalid digit for base') ||\n error.message.startsWith('Invalid character:')\n ) {\n throw new Error('Invalid character')\n }\n throw error\n }\n }\n\n #_bigIntToStringInBase(num: bigint, base: number): string {\n if (num === 0n) return '0'\n if (base < 2 || base > 36) throw new Error('Base must be between 2 and 36')\n\n const digits = '0123456789abcdefghijklmnopqrstuvwxyz'\n let result = ''\n let currentNum = num > 0n ? num : -num\n const bigBase = BigInt(base)\n\n while (currentNum > 0n) {\n result = digits[Number(currentNum % bigBase)] + result\n currentNum /= bigBase\n }\n return result\n }\n\n #_parseBaseString(numberStr: string, base: number): void {\n this.#_magnitude = 0n\n const bigBase = BigInt(base)\n\n let groupSize = BigNumber.groupSizes[base]\n let groupBaseBigInt = BigInt(BigNumber.groupBases[base])\n\n if (groupSize === 0 || groupBaseBigInt === 0n) {\n groupSize = Math.floor(Math.log(0x3ffffff) / Math.log(base))\n if (groupSize === 0) groupSize = 1\n groupBaseBigInt = bigBase ** BigInt(groupSize)\n }\n\n let currentPos = 0\n const totalLen = numberStr.length\n\n let firstChunkLen = totalLen % groupSize\n if (firstChunkLen === 0 && totalLen > 0) firstChunkLen = groupSize\n\n if (firstChunkLen > 0) {\n const chunkStr = numberStr.substring(currentPos, currentPos + firstChunkLen)\n this.#_magnitude = BigInt(this.#_parseBaseWord(chunkStr, base))\n currentPos += firstChunkLen\n }\n\n while (currentPos < totalLen) {\n const chunkStr = numberStr.substring(currentPos, currentPos + groupSize)\n const wordVal = BigInt(this.#_parseBaseWord(chunkStr, base))\n this.#_magnitude = this.#_magnitude * groupBaseBigInt + wordVal\n currentPos += groupSize\n }\n\n this.#_finishInitialization()\n }\n\n #_parseBaseWord(str: string, base: number): number {\n let r = 0\n for (let i = 0; i < str.length; i++) {\n const charCode = str.codePointAt(i) as number\n let digitVal\n if (charCode >= 48 && charCode <= 57) digitVal = charCode - 48\n else if (charCode >= 65 && charCode <= 90) digitVal = charCode - 65 + 10\n else if (charCode >= 97 && charCode <= 122) digitVal = charCode - 97 + 10\n else throw new Error('Invalid character: ' + str[i])\n\n if (digitVal >= base) throw new Error('Invalid character')\n r = r * base + digitVal\n }\n return r\n }\n\n #_initializeState(magnitude: bigint, sign: 0 | 1): void {\n this.#_magnitude = magnitude\n this.#_sign = magnitude === 0n ? 0 : sign\n this.#_finishInitialization()\n }\n\n #_finishInitialization(): void {\n if (this.#_magnitude === 0n) {\n this.#_nominalWordLength = 1\n this.#_sign = 0\n } else {\n const bitLen = this.#_magnitude.toString(2).length\n this.#_nominalWordLength = Math.max(1, Math.ceil(bitLen / BigNumber.wordSize))\n }\n }\n\n #assert(val: unknown, msg: string = 'Assertion failed'): void {\n if (!(val as boolean)) throw new Error(msg)\n }\n\n #initNumber(number: number, endian: 'be' | 'le' = 'be'): this {\n this.#assert(\n BigInt(Math.abs(number)) <= BigNumber.#MAX_NUMBER_CONSTRUCTOR_MAG_BIGINT,\n 'The number is larger than 2 ^ 53 (unsafe)'\n )\n this.#assert(number % 1 === 0, 'Number must be an integer for BigNumber conversion')\n this.#_initializeState(BigInt(Math.abs(number)), number < 0 ? 1 : 0)\n if (endian === 'le') {\n const currentSign = this.#_sign\n const beBytes = this.toArray('be')\n this.#initArray(beBytes, 'le')\n this.#_sign = currentSign\n this.normSign()\n }\n return this\n }\n\n #initArray(bytes: number[], endian: 'be' | 'le'): this {\n if (bytes.length === 0) {\n this.#_initializeState(0n, 0)\n return this\n }\n let magnitude = 0n\n if (endian === 'be') {\n for (const byte of bytes) magnitude = (magnitude << 8n) | BigInt(byte & 0xff)\n } else {\n for (let i = bytes.length - 1; i >= 0; i--)\n magnitude = (magnitude << 8n) | BigInt(bytes[i] & 0xff)\n }\n this.#_initializeState(magnitude, 0)\n return this\n }\n\n copy(dest: BigNumber): void {\n dest.#_magnitude = this.#_magnitude\n dest.#_sign = this.#_sign\n dest.#_nominalWordLength = this.#_nominalWordLength\n dest.red = this.red\n }\n static move(dest: BigNumber, src: BigNumber): void {\n dest.#_magnitude = src.#_magnitude\n dest.#_sign = src.#_sign\n dest.#_nominalWordLength = src.#_nominalWordLength\n dest.red = src.red\n }\n clone(): BigNumber {\n const r = new BigNumber(0n)\n this.copy(r)\n return r\n }\n\n expand(size: number): this {\n this.#assert(\n Number.isSafeInteger(size) && size >= 0 && size <= BigNumber.#MAX_NOMINAL_WORD_LENGTH,\n 'Expand size must be a non-negative safe integer within the supported word limit'\n )\n this.#_nominalWordLength = Math.max(this.#_nominalWordLength, size, 1)\n return this\n }\n\n strip(): this {\n this.#_finishInitialization()\n return this.normSign()\n }\n normSign(): this {\n if (this.#_magnitude === 0n) {\n this.#_sign = 0\n }\n return this\n }\n inspect(): string {\n return (this.red === null ? '<BN: ' : '<BN-R: ') + this.toString(16) + '>'\n }\n\n #_getMinimalHex(): string {\n if (this.#_magnitude === 0n) return '0'\n return this.#_magnitude.toString(16)\n }\n\n #_toHexString(padding: number): string {\n let hexStr = this.#_getMinimalHex()\n\n if (padding > 1) {\n // Preserve whole bytes before applying the bn.js multiple-of-N rule.\n if (hexStr !== '0' && hexStr.length % 2 !== 0) {\n hexStr = '0' + hexStr\n }\n while (hexStr.length % padding !== 0) {\n hexStr = '0' + hexStr\n }\n }\n\n return (this.isNeg() ? '-' : '') + hexStr\n }\n\n /**\n * Converts the BigNumber instance to a string representation.\n *\n * @method toString\n * @param base - The base for representing number. Default is 10. Other accepted values are 16 and 'hex'.\n * @param padding - Represents the minimum number of digits to represent the BigNumber as a string. Default is 1.\n * @returns The string representation of the BigNumber instance\n */\n toString(base: number | 'hex' = 10, padding: number = 1): string {\n if (base === 16 || base === 'hex') {\n return this.#_toHexString(padding)\n }\n\n if (typeof base !== 'number' || base < 2 || base > 36 || base % 1 !== 0)\n throw new Error('Base should be an integer between 2 and 36')\n return this.#toBaseString(base, padding)\n }\n\n #toBaseString(base: number, padding: number): string {\n if (this.#_magnitude === 0n) {\n return BigNumber.#_paddedZero(padding)\n }\n\n let groupSize = BigNumber.groupSizes[base]\n let groupBaseBigInt = BigInt(BigNumber.groupBases[base])\n if (groupSize === 0 || groupBaseBigInt === 0n) {\n groupSize = Math.floor(Math.log(Number.MAX_SAFE_INTEGER) / Math.log(base))\n if (groupSize === 0) groupSize = 1\n groupBaseBigInt = BigInt(base) ** BigInt(groupSize)\n }\n\n let out = ''\n let tempMag = this.#_magnitude\n\n while (tempMag > 0n) {\n const remainder = tempMag % groupBaseBigInt\n tempMag /= groupBaseBigInt\n const chunkStr = this.#_bigIntToStringInBase(remainder, base)\n out = (tempMag > 0n ? this.#_zeroPaddedChunk(chunkStr, groupSize) : chunkStr) + out\n }\n\n if (padding > 0) {\n while (out.length < padding) out = '0' + out\n }\n return (this.#_sign === 1 ? '-' : '') + out\n }\n\n static #_paddedZero(padding: number): string {\n let out = '0'\n if (padding > 1) {\n while (out.length < padding) out = '0' + out\n }\n return out\n }\n\n /** Returns a chunk string zero-padded to groupSize (used by toBaseString for interior chunks). */\n #_zeroPaddedChunk(chunkStr: string, groupSize: number): string {\n const zerosToPrepend = groupSize - chunkStr.length\n if (zerosToPrepend <= 0) return chunkStr\n if (zerosToPrepend < BigNumber.zeros.length) return BigNumber.zeros[zerosToPrepend] + chunkStr\n return '0'.repeat(zerosToPrepend) + chunkStr\n }\n\n /**\n * Converts the BigNumber instance to a JavaScript number.\n * Please note that JavaScript numbers are only precise up to 53 bits.\n *\n * @method toNumber\n * @throws If the BigNumber instance cannot be safely stored in a JavaScript number\n * @returns The JavaScript number representation of the BigNumber instance.\n */\n toNumber(): number {\n const val = this.#_getSignedValue()\n if (val > BigNumber.#MAX_SAFE_INTEGER_BIGINT || val < BigNumber.#MIN_SAFE_INTEGER_BIGINT)\n throw new Error('Number can only safely store up to 53 bits')\n return Number(val)\n }\n\n /**\n * Returns the signed BigInt representation of this BigNumber without any safety checks.\n *\n * @method toBigInt\n * @returns bigint value for this BigNumber.\n */\n toBigInt(): bigint {\n return this.#_getSignedValue()\n }\n\n /**\n * Converts the BigNumber instance to a JSON-formatted string.\n *\n * @method toJSON\n * @returns The JSON string representation of the BigNumber instance.\n */\n toJSON(): string {\n const hex = this.#_getMinimalHex()\n return (this.isNeg() ? '-' : '') + hex\n }\n\n #toArrayLikeGeneric(res: number[], isLE: boolean): void {\n let tempMag = this.#_magnitude\n let position = isLE ? 0 : res.length - 1\n const increment = isLE ? 1 : -1\n\n for (const _byte of res) {\n if (tempMag === 0n && position >= 0 && position < res.length) {\n res[position] = 0\n } else if (position >= 0 && position < res.length) {\n res[position] = Number(tempMag & 0xffn)\n } else {\n break\n }\n tempMag >>= 8n\n position += increment\n }\n }\n\n /**\n * Converts the BigNumber instance to an array of bytes.\n *\n * @method toArray\n * @param endian - Endianness of the output array, defaults to 'be'.\n * @param length - Optional length of the output array.\n * @returns Array of bytes representing the BigNumber.\n */\n toArray(endian: 'le' | 'be' = 'be', length?: number): number[] {\n this.strip()\n const actualByteLength = this.byteLength()\n const reqLength = length ?? Math.max(1, actualByteLength)\n\n this.#assert(actualByteLength <= reqLength, 'byte array longer than desired length')\n this.#assert(reqLength > 0, 'Requested array length <= 0')\n\n const res = Array.from({ length: reqLength }).fill(0)\n if (this.#_magnitude === 0n && reqLength > 0) return res\n if (this.#_magnitude === 0n && reqLength === 0) return []\n\n this.#toArrayLikeGeneric(res, endian === 'le')\n return res\n }\n\n /**\n * Calculates the number of bits required to represent the BigNumber.\n *\n * @method bitLength\n * @returns The bit length of the BigNumber.\n */\n bitLength(): number {\n if (this.#_magnitude === 0n) {\n return 0\n }\n return this.#_magnitude.toString(2).length\n }\n /**\n * Converts a BigNumber to an array of bits.\n *\n * @method toBitArray\n * @param num - The BigNumber to convert.\n * @returns An array of bits.\n */\n static toBitArray(num: BigNumber): Array<0 | 1> {\n const len = num.bitLength()\n if (len === 0) return []\n const w = Array.from({ length: len })\n const mag = num.#_magnitude\n for (let bit = 0; bit < len; bit++) {\n w[bit] = ((mag >> BigInt(bit)) & 1n) === 0n ? 0 : 1\n }\n return w\n }\n\n /**\n * Instance version of {@link toBitArray}.\n */\n toBitArray(): Array<0 | 1> {\n return BigNumber.toBitArray(this)\n }\n\n /**\n * Returns the number of trailing zero bits in the big number.\n *\n * @method zeroBits\n * @returns Returns the number of trailing zero bits\n * in the binary representation of the big number.\n *\n * @example\n * const bn = new BigNumber('8'); // binary: 1000\n * const zeroBits = bn.zeroBits(); // 3\n */\n zeroBits(): number {\n if (this.#_magnitude === 0n) return 0\n let c = 0\n let t = this.#_magnitude\n while ((t & 1n) === 0n && t !== 0n) {\n c++\n t >>= 1n\n }\n return c\n }\n\n /**\n * Calculates the number of bytes required to represent the BigNumber.\n *\n * @method byteLength\n * @returns The byte length of the BigNumber.\n */\n byteLength(): number {\n if (this.#_magnitude === 0n) {\n return 0\n }\n return Math.ceil(this.bitLength() / 8)\n }\n\n #_getSignedValue(): bigint {\n return this.#_sign === 1 ? -this.#_magnitude : this.#_magnitude\n }\n\n #_setValueFromSigned(sVal: bigint): void {\n if (sVal < 0n) {\n this.#_magnitude = -sVal\n this.#_sign = 1\n } else {\n this.#_magnitude = sVal\n this.#_sign = 0\n }\n this.#_finishInitialization()\n this.normSign()\n }\n\n toTwos(width: number): BigNumber {\n this.#assert(width >= 0)\n const Bw = BigInt(width)\n let v = this.#_getSignedValue()\n if (this.#_sign === 1 && this.#_magnitude !== 0n) v = (1n << Bw) + v\n const m = (1n << Bw) - 1n\n v &= m\n const r = new BigNumber(0n)\n r.#_initializeState(v, 0)\n return r\n }\n\n fromTwos(width: number): BigNumber {\n this.#assert(width >= 0)\n const Bw = BigInt(width)\n const m = this.#_magnitude\n if (width > 0 && ((m >> (Bw - 1n)) & 1n) !== 0n && this.#_sign === 0) {\n const sVal = m - (1n << Bw)\n const r = new BigNumber(0n)\n r.#_setValueFromSigned(sVal)\n return r\n }\n return this.clone()\n }\n\n isNeg(): boolean {\n return this.#_sign === 1 && this.#_magnitude !== 0n\n }\n neg(): BigNumber {\n return this.clone().ineg()\n }\n ineg(): this {\n if (this.#_magnitude !== 0n) {\n this.#_sign = this.#_sign === 1 ? 0 : 1\n }\n return this\n }\n\n #_iuop(num: BigNumber, op: (a: bigint, b: bigint) => bigint, isXor: boolean = false): this {\n const newMag = op(this.#_magnitude, num.#_magnitude)\n let targetNominalLength = this.#_nominalWordLength\n if (isXor) targetNominalLength = Math.max(this.length, num.length)\n\n this.#_magnitude = newMag\n this.#_finishInitialization()\n if (isXor) this.#_nominalWordLength = Math.max(this.#_nominalWordLength, targetNominalLength)\n return this.strip()\n }\n\n iuor(num: BigNumber): this {\n return this.#_iuop(num, (a, b) => a | b)\n }\n iuand(num: BigNumber): this {\n return this.#_iuop(num, (a, b) => a & b)\n }\n iuxor(num: BigNumber): this {\n return this.#_iuop(num, (a, b) => a ^ b, true)\n }\n #_iop(num: BigNumber, op: (a: bigint, b: bigint) => bigint, isXor: boolean = false): this {\n this.#assert(this.#_sign === 0 && num.#_sign === 0)\n return this.#_iuop(num, op, isXor)\n }\n ior(num: BigNumber): this {\n return this.#_iop(num, (a, b) => a | b)\n }\n iand(num: BigNumber): this {\n return this.#_iop(num, (a, b) => a & b)\n }\n ixor(num: BigNumber): this {\n return this.#_iop(num, (a, b) => a ^ b, true)\n }\n #_uop_new(num: BigNumber, opName: 'iuor' | 'iuand' | 'iuxor'): BigNumber {\n if (this.length >= num.length) {\n return this.clone()[opName](num)\n }\n return num.clone()[opName](this)\n }\n or(num: BigNumber): BigNumber {\n this.#assert(this.#_sign === 0 && num.#_sign === 0)\n return this.#_uop_new(num, 'iuor')\n }\n uor(num: BigNumber): BigNumber {\n return this.#_uop_new(num, 'iuor')\n }\n and(num: BigNumber): BigNumber {\n this.#assert(this.#_sign === 0 && num.#_sign === 0)\n return this.#_uop_new(num, 'iuand')\n }\n uand(num: BigNumber): BigNumber {\n return this.#_uop_new(num, 'iuand')\n }\n xor(num: BigNumber): BigNumber {\n this.#assert(this.#_sign === 0 && num.#_sign === 0)\n return this.#_uop_new(num, 'iuxor')\n }\n uxor(num: BigNumber): BigNumber {\n return this.#_uop_new(num, 'iuxor')\n }\n\n inotn(width: number): this {\n this.#assert(typeof width === 'number' && width >= 0)\n const Bw = BigInt(width)\n const m = (1n << Bw) - 1n\n this.#_magnitude = ~this.#_magnitude & m\n const wfw = width === 0 ? 1 : Math.ceil(width / BigNumber.wordSize)\n this.#_nominalWordLength = Math.max(1, wfw)\n this.strip()\n this.#_nominalWordLength = Math.max(this.#_nominalWordLength, Math.max(1, wfw))\n return this\n }\n\n notn(width: number): BigNumber {\n return this.clone().inotn(width)\n }\n setn(bit: number, val: any): this {\n this.#assert(typeof bit === 'number' && bit >= 0)\n const Bb = BigInt(bit)\n if (val === 1 || val === true) this.#_magnitude |= 1n << Bb\n else this.#_magnitude &= ~(1n << Bb)\n const wnb = Math.floor(bit / BigNumber.wordSize) + 1\n this.#_nominalWordLength = Math.max(this.#_nominalWordLength, wnb)\n this.#_finishInitialization()\n return this.strip()\n }\n\n iadd(num: BigNumber): this {\n this.#_setValueFromSigned(this.#_getSignedValue() + num.#_getSignedValue())\n return this\n }\n add(num: BigNumber): BigNumber {\n const r = new BigNumber(0n)\n r.#_setValueFromSigned(this.#_getSignedValue() + num.#_getSignedValue())\n return r\n }\n isub(num: BigNumber): this {\n this.#_setValueFromSigned(this.#_getSignedValue() - num.#_getSignedValue())\n return this\n }\n sub(num: BigNumber): BigNumber {\n const r = new BigNumber(0n)\n r.#_setValueFromSigned(this.#_getSignedValue() - num.#_getSignedValue())\n return r\n }\n mul(num: BigNumber): BigNumber {\n const r = new BigNumber(0n)\n r.#_magnitude = this.#_magnitude * num.#_magnitude\n r.#_sign = r.#_magnitude === 0n ? 0 : ((this.#_sign ^ num.#_sign) as 0 | 1)\n r.#_nominalWordLength = this.length + num.length\n r.red = null\n return r.normSign()\n }\n\n imul(num: BigNumber): this {\n this.#_magnitude *= num.#_magnitude\n this.#_sign = this.#_magnitude === 0n ? 0 : ((this.#_sign ^ num.#_sign) as 0 | 1)\n this.#_nominalWordLength = this.length + num.length\n this.red = null\n return this.normSign()\n }\n\n imuln(num: number): this {\n this.#assert(typeof num === 'number', 'Assertion failed')\n this.#assert(Math.abs(num) <= BigNumber.#MAX_IMULN_ARG, 'Assertion failed')\n this.#_setValueFromSigned(this.#_getSignedValue() * BigInt(num))\n return this\n }\n muln(num: number): BigNumber {\n return this.clone().imuln(num)\n }\n sqr(): BigNumber {\n const r = new BigNumber(0n)\n r.#_magnitude = this.#_magnitude * this.#_magnitude\n r.#_sign = 0\n r.#_nominalWordLength = this.length * 2\n r.red = null\n return r\n }\n\n isqr(): this {\n this.#_magnitude *= this.#_magnitude\n this.#_sign = 0\n this.#_nominalWordLength = this.length * 2\n this.red = null\n return this\n }\n\n pow(num: BigNumber): BigNumber {\n this.#assert(num.#_sign === 0, 'Exponent for pow must be non-negative')\n if (num.isZero()) return new BigNumber(1n)\n\n const res = new BigNumber(1n)\n const currentBase = this.clone()\n const exp = num.clone()\n\n const baseIsNegative = currentBase.isNeg()\n const expIsOdd = exp.isOdd()\n if (baseIsNegative) currentBase.ineg()\n\n while (!exp.isZero()) {\n if (exp.isOdd()) {\n res.imul(currentBase)\n }\n currentBase.isqr()\n exp.iushrn(1)\n }\n\n if (baseIsNegative && expIsOdd) {\n res.ineg()\n }\n return res\n }\n\n static #normalizeNonNegativeBigInt(value: number | bigint, label: string): bigint {\n if (typeof value === 'number') {\n if (!Number.isFinite(value) || !Number.isInteger(value) || value < 0)\n throw new Error(`${label} must be a non-negative integer`)\n return BigInt(value)\n }\n if (value < 0n) throw new Error(`${label} must be a non-negative integer`)\n return value\n }\n\n iushln(bits: number | bigint): this {\n const normalizedBits = BigNumber.#normalizeNonNegativeBigInt(bits, 'Shift bits')\n if (normalizedBits === 0n) return this\n this.#_magnitude <<= normalizedBits\n this.#_finishInitialization()\n return this.strip()\n }\n\n ishln(bits: number | bigint): this {\n this.#assert(this.#_sign === 0, 'ishln requires positive number')\n return this.iushln(bits)\n }\n\n iushrn(bits: number | bigint, hint?: number, extended?: BigNumber): this {\n const normalizedBits = BigNumber.#normalizeNonNegativeBigInt(bits, 'Shift bits')\n if (normalizedBits === 0n) {\n if (extended != null) extended.#_initializeState(0n, 0)\n return this\n }\n if (extended != null) {\n const m = (1n << normalizedBits) - 1n\n const sOut = this.#_magnitude & m\n extended.#_initializeState(sOut, 0)\n }\n this.#_magnitude >>= normalizedBits\n this.#_finishInitialization()\n return this.strip()\n }\n\n ishrn(bits: number | bigint, hint?: number, extended?: BigNumber): this {\n this.#assert(this.#_sign === 0, 'ishrn requires positive number')\n return this.iushrn(bits, hint, extended)\n }\n\n shln(bits: number | bigint): BigNumber {\n return this.clone().ishln(bits)\n }\n ushln(bits: number | bigint): BigNumber {\n return this.clone().iushln(bits)\n }\n shrn(bits: number | bigint): BigNumber {\n return this.clone().ishrn(bits)\n }\n ushrn(bits: number | bigint): BigNumber {\n return this.clone().iushrn(bits)\n }\n\n testn(bit: number): boolean {\n this.#assert(typeof bit === 'number' && bit >= 0)\n return ((this.#_magnitude >> BigInt(bit)) & 1n) !== 0n\n }\n\n imaskn(bits: number): this {\n this.#assert(typeof bits === 'number' && bits >= 0)\n this.#assert(this.#_sign === 0, 'imaskn works only with positive numbers')\n const Bb = BigInt(bits)\n const m = Bb === 0n ? 0n : (1n << Bb) - 1n\n this.#_magnitude &= m\n const wfm = bits === 0 ? 1 : Math.max(1, Math.ceil(bits / BigNumber.wordSize))\n this.#_nominalWordLength = wfm\n this.#_finishInitialization()\n this.#_nominalWordLength = Math.max(this.#_nominalWordLength, wfm)\n return this.strip()\n }\n\n maskn(bits: number): BigNumber {\n return this.clone().imaskn(bits)\n }\n iaddn(num: number): this {\n this.#assert(typeof num === 'number')\n this.#assert(Math.abs(num) <= BigNumber.#MAX_IMULN_ARG, 'num is too large')\n this.#_setValueFromSigned(this.#_getSignedValue() + BigInt(num))\n return this\n }\n _iaddn(num: number): this {\n return this.iaddn(num)\n }\n isubn(num: number): this {\n this.#assert(typeof num === 'number')\n this.#assert(Math.abs(num) <= BigNumber.#MAX_IMULN_ARG, 'Assertion failed')\n this.#_setValueFromSigned(this.#_getSignedValue() - BigInt(num))\n return this\n }\n addn(num: number): BigNumber {\n return this.clone().iaddn(num)\n }\n subn(num: number): BigNumber {\n return this.clone().isubn(num)\n }\n iabs(): this {\n this.#_sign = 0\n return this\n }\n abs(): BigNumber {\n return this.clone().iabs()\n }\n\n divmod(num: BigNumber, mode?: 'div' | 'mod', positive?: boolean): any {\n this.#assert(!num.isZero(), 'Division by zero')\n if (this.isZero()) {\n const z = new BigNumber(0n)\n return { div: mode === 'mod' ? null : z, mod: mode === 'div' ? null : z }\n }\n const tV = this.#_getSignedValue()\n const nV = num.#_getSignedValue()\n const dV = mode !== 'mod' ? tV / nV : null\n const mV = this.#_computeMod(tV, nV, mode, positive)\n return { div: this.#_bigNumberFromSigned(dV), mod: this.#_bigNumberFromSigned(mV) }\n }\n\n #_computeMod(tV: bigint, nV: bigint, mode?: 'div' | 'mod', positive?: boolean): bigint | null {\n if (mode === 'div') return null\n let mV = tV % nV\n if (positive === true && mV < 0n) mV += nV < 0n ? -nV : nV\n return mV\n }\n\n #_bigNumberFromSigned(v: bigint | null): BigNumber | null {\n if (v === null) return null\n const r = new BigNumber(0n)\n r.#_setValueFromSigned(v)\n return r\n }\n\n div(num: BigNumber): BigNumber {\n return this.divmod(num, 'div', false).div as BigNumber\n }\n\n mod(num: BigNumber): BigNumber {\n return this.divmod(num, 'mod', false).mod as BigNumber\n }\n\n umod(num: BigNumber): BigNumber {\n return this.divmod(num, 'mod', true).mod as BigNumber\n }\n\n divRound(num: BigNumber): BigNumber {\n this.#assert(!num.isZero())\n const tV = this.#_getSignedValue()\n const nV = num.#_getSignedValue()\n\n let d = tV / nV\n const m = tV % nV\n\n if (m === 0n) {\n const r = new BigNumber(0n)\n r.#_setValueFromSigned(d)\n return r\n }\n\n const absM = m < 0n ? -m : m\n const absNV = nV < 0n ? -nV : nV\n\n if (absM * 2n >= absNV) {\n if ((tV > 0n && nV > 0n) || (tV < 0n && nV < 0n)) {\n d += 1n\n } else {\n d -= 1n\n }\n }\n const r = new BigNumber(0n)\n r.#_setValueFromSigned(d)\n return r\n }\n\n modrn(numArg: number): number {\n this.#assert(numArg !== 0, 'Division by zero in modrn')\n const absDivisor = BigInt(Math.abs(numArg))\n if (absDivisor === 0n) throw new Error('Division by zero in modrn')\n\n const remainderMag = this.#_magnitude % absDivisor\n return numArg < 0 ? Number(-remainderMag) : Number(remainderMag)\n }\n\n idivn(num: number): this {\n this.#assert(num !== 0)\n this.#assert(Math.abs(num) <= BigNumber.#MAX_IMULN_ARG, 'num is too large')\n this.#_setValueFromSigned(this.#_getSignedValue() / BigInt(num))\n return this\n }\n\n divn(num: number): BigNumber {\n return this.clone().idivn(num)\n }\n\n egcd(p: BigNumber): { a: BigNumber; b: BigNumber; gcd: BigNumber } {\n this.#assert(p.negative === 0, 'p must not be negative')\n this.#assert(!p.isZero(), 'p must not be zero')\n let uV = this.#_getSignedValue()\n let vV = p.#_magnitude\n let a = 1n\n let pa = 0n\n let b = 0n\n let pb = 1n\n while (vV !== 0n) {\n const q = uV / vV\n let t = vV\n vV = uV % vV\n uV = t\n t = pa\n pa = a - q * pa\n a = t\n t = pb\n pb = b - q * pb\n b = t\n }\n const ra = new BigNumber(0n)\n ra.#_setValueFromSigned(a)\n const rb = new BigNumber(0n)\n rb.#_setValueFromSigned(b)\n const rg = new BigNumber(0n)\n rg.#_initializeState(uV < 0n ? -uV : uV, 0)\n return { a: ra, b: rb, gcd: rg }\n }\n\n gcd(num: BigNumber): BigNumber {\n let u = this.#_magnitude\n let v = num.#_magnitude\n if (u === 0n) {\n const r = new BigNumber(0n)\n r.#_setValueFromSigned(v)\n return r.iabs()\n }\n if (v === 0n) {\n const r = new BigNumber(0n)\n r.#_setValueFromSigned(u)\n return r.iabs()\n }\n while (v !== 0n) {\n const t = u % v\n u = v\n v = t\n }\n const res = new BigNumber(0n)\n res.#_initializeState(u, 0)\n return res\n }\n\n invm(num: BigNumber): BigNumber {\n this.#assert(\n !num.isZero() && num.#_sign === 0,\n 'Modulus for invm must be positive and non-zero'\n )\n const eg = this.egcd(num)\n if (!eg.gcd.eqn(1)) {\n throw new Error('Inverse does not exist (numbers are not coprime).')\n }\n return eg.a.umod(num)\n }\n\n isEven(): boolean {\n return this.#_magnitude % 2n === 0n\n }\n isOdd(): boolean {\n return this.#_magnitude % 2n === 1n\n }\n andln(num: number): number {\n this.#assert(num >= 0)\n return Number(this.#_magnitude & BigInt(num))\n }\n bincn(bit: number): this {\n this.#assert(typeof bit === 'number' && bit >= 0)\n const BVal = 1n << BigInt(bit)\n this.#_setValueFromSigned(this.#_getSignedValue() + BVal)\n return this\n }\n isZero(): boolean {\n return this.#_magnitude === 0n\n }\n cmpn(num: number): CompareResult {\n this.#assert(Math.abs(num) <= BigNumber.#MAX_IMULN_ARG, 'Number is too big')\n const tV = this.#_getSignedValue()\n const nV = BigInt(num)\n if (tV < nV) {\n return -1\n }\n if (tV > nV) {\n return 1\n }\n return 0\n }\n cmp(num: BigNumber): CompareResult {\n const tV = this.#_getSignedValue()\n const nV = num.#_getSignedValue()\n if (tV < nV) {\n return -1\n }\n if (tV > nV) {\n return 1\n }\n return 0\n }\n ucmp(num: BigNumber): CompareResult {\n if (this.#_magnitude < num.#_magnitude) {\n return -1\n }\n if (this.#_magnitude > num.#_magnitude) {\n return 1\n }\n return 0\n }\n gtn(num: number): boolean {\n return this.cmpn(num) === 1\n }\n gt(num: BigNumber): boolean {\n return this.cmp(num) === 1\n }\n gten(num: number): boolean {\n return this.cmpn(num) >= 0\n }\n gte(num: BigNumber): boolean {\n return this.cmp(num) >= 0\n }\n ltn(num: number): boolean {\n return this.cmpn(num) === -1\n }\n lt(num: BigNumber): boolean {\n return this.cmp(num) === -1\n }\n lten(num: number): boolean {\n return this.cmpn(num) <= 0\n }\n lte(num: BigNumber): boolean {\n return this.cmp(num) <= 0\n }\n eqn(num: number): boolean {\n return this.cmpn(num) === 0\n }\n eq(num: BigNumber): boolean {\n return this.cmp(num) === 0\n }\n\n toRed(ctx: ReductionContext): BigNumber {\n this.#assert(this.red == null, 'Already a number in reduction context')\n this.#assert(this.#_sign === 0, 'toRed works only with positives')\n return ctx.convertTo(this).forceRed(ctx)\n }\n fromRed(): BigNumber {\n this.#assert(this.red, 'fromRed works only with numbers in reduction context')\n return this.red.convertFrom(this)\n }\n forceRed(ctx: ReductionContext): this {\n this.red = ctx\n return this\n }\n redAdd(num: BigNumber): BigNumber {\n this.#assert(this.red, 'redAdd works only with red numbers')\n return this.red.add(this, num)\n }\n redIAdd(num: BigNumber): BigNumber {\n this.#assert(this.red, 'redIAdd works only with red numbers')\n return this.red.iadd(this, num)\n }\n redSub(num: BigNumber): BigNumber {\n this.#assert(this.red, 'redSub works only with red numbers')\n return this.red.sub(this, num)\n }\n redISub(num: BigNumber): BigNumber {\n this.#assert(this.red, 'redISub works only with red numbers')\n return this.red.isub(this, num)\n }\n redShl(num: number): BigNumber {\n this.#assert(this.red, 'redShl works only with red numbers')\n return this.red.shl(this, num)\n }\n redMul(num: BigNumber): BigNumber {\n this.#assert(this.red, 'redMul works only with red numbers')\n this.red.verify2(this, num)\n return this.red.mul(this, num)\n }\n redIMul(num: BigNumber): BigNumber {\n this.#assert(this.red, 'redIMul works only with red numbers')\n this.red.verify2(this, num)\n return this.red.imul(this, num)\n }\n redSqr(): BigNumber {\n this.#assert(this.red, 'redSqr works only with red numbers')\n this.red.verify1(this)\n return this.red.sqr(this)\n }\n redISqr(): BigNumber {\n this.#assert(this.red, 'redISqr works only with red numbers')\n this.red.verify1(this)\n return this.red.isqr(this)\n }\n redSqrt(): BigNumber {\n this.#assert(this.red, 'redSqrt works only with red numbers')\n this.red.verify1(this)\n return this.red.sqrt(this)\n }\n redInvm(): BigNumber {\n this.#assert(this.red, 'redInvm works only with red numbers')\n this.red.verify1(this)\n return this.red.invm(this)\n }\n redNeg(): BigNumber {\n this.#assert(this.red, 'redNeg works only with red numbers')\n this.red.verify1(this)\n return this.red.neg(this)\n }\n redPow(num: BigNumber): BigNumber {\n this.#assert(this.red != null && num.red == null, 'redPow(normalNum)')\n this.red.verify1(this)\n return this.red.pow(this, num)\n }\n\n /**\n * Creates a BigNumber from a hexadecimal string.\n *\n * @static\n * @method fromHex\n * @param hex - The hexadecimal string to create a BigNumber from.\n * @param endian - Optional endianness for parsing the hex string.\n * @returns Returns a BigNumber created from the hexadecimal input string.\n *\n * @example\n * const exampleHex = 'a1b2c3';\n * const bigNumber = BigNumber.fromHex(exampleHex);\n */\n static fromHex(hex: string, endian?: 'le' | 'be' | 'little' | 'big'): BigNumber {\n let eE: 'le' | 'be' = 'be'\n if (endian === 'little' || endian === 'le') eE = 'le'\n return new BigNumber(hex, 16, eE)\n }\n\n /**\n * Converts this BigNumber to a hexadecimal string.\n *\n * @method toHex\n * @param length - The minimum length of the hex string\n * @returns Returns a string representing the hexadecimal value of this BigNumber.\n *\n * @example\n * const bigNumber = new BigNumber(255)\n * const hex = bigNumber.toHex()\n */\n toHex(byteLength: number = 0): string {\n if (this.isZero() && byteLength === 0) return ''\n\n let hexStr = this.#_getMinimalHex() // Raw hex: \"0\", \"f\", \"10\", \"123\"\n\n // Ensure even length for non-zero values (byte alignment)\n if (hexStr !== '0' && hexStr.length % 2 !== 0) {\n hexStr = '0' + hexStr\n }\n\n // Pad to minimum character length (byteLength * 2)\n const minChars = byteLength * 2\n while (hexStr.length < minChars) {\n hexStr = '0' + hexStr\n }\n return (this.isNeg() ? '-' : '') + hexStr\n }\n\n /**\n * Creates a BigNumber from a JSON-serialized string.\n *\n * @static\n * @method fromJSON\n * @param str - The JSON-serialized string to create a BigNumber from.\n * @returns Returns a BigNumber created from the JSON input string.\n */\n static fromJSON(str: string): BigNumber {\n return new BigNumber(str, 16)\n }\n\n /**\n * Creates a BigNumber from a number.\n *\n * @static\n * @method fromNumber\n * @param n - The number to create a BigNumber from.\n * @returns Returns a BigNumber equivalent to the input number.\n */\n static fromNumber(n: number): BigNumber {\n return new BigNumber(n)\n }\n\n /**\n * Creates a BigNumber from a string, considering an optional base.\n *\n * @static\n * @method fromString\n * @param str - The string to create a BigNumber from.\n * @param base - The base used for conversion. If not provided, base 10 is assumed.\n * @returns Returns a BigNumber equivalent to the string after conversion from the specified base.\n */\n static fromString(str: string, base?: number | 'hex'): BigNumber {\n return new BigNumber(str, base)\n }\n\n /**\n * Creates a BigNumber from a signed magnitude number.\n *\n * @static\n * @method fromSm\n * @param bytes - The signed magnitude number to convert to a BigNumber.\n * @param endian - Defines endianess. If not provided, big endian is assumed.\n * @returns Returns a BigNumber equivalent to the signed magnitude number interpreted with specified endianess.\n */\n static fromSm(bytes: number[], endian: 'big' | 'little' = 'big'): BigNumber {\n if (bytes.length === 0) return new BigNumber(0n)\n\n const beBytes = bytes.slice()\n if (endian === 'little') {\n beBytes.reverse()\n }\n let sign: 0 | 1 = 0\n if (beBytes.length > 0 && (beBytes[0] & 0x80) !== 0) {\n sign = 1\n beBytes[0] &= 0x7f\n }\n\n let hexStr: string\n if (CAN_USE_BUFFER) {\n hexStr = BufferCtor.from(beBytes).toString('hex') as string\n } else {\n hexStr = ''\n for (const byte of beBytes) {\n hexStr += byte < 16 ? '0' + byte.toString(16) : byte.toString(16)\n }\n }\n const magnitude = hexStr.length === 0 ? 0n : BigInt('0x' + hexStr)\n\n const r = new BigNumber(0n)\n r.#_initializeState(magnitude, sign)\n return r\n }\n\n /**\n * Converts this BigNumber to a signed magnitude number.\n *\n * @method toSm\n * @param endian - Defines endianess. If not provided, big endian is assumed.\n * @returns Returns an array equivalent to this BigNumber interpreted as a signed magnitude with specified endianess.\n */\n toSm(endian: 'big' | 'little' = 'big'): number[] {\n if (this.#_magnitude === 0n) {\n return this.#_sign === 1 ? [0x80] : []\n }\n\n let hex = this.#_getMinimalHex()\n if (hex.length % 2 !== 0) hex = '0' + hex\n\n const byteLen = hex.length / 2\n const bytes = Array.from({ length: byteLen })\n for (let i = 0, j = 0; i < hex.length; i += 2) {\n const high = HEX_CHAR_TO_VALUE[hex.codePointAt(i) as number]\n const low = HEX_CHAR_TO_VALUE[hex.codePointAt(i + 1) as number]\n bytes[j++] = ((high & 0xf) << 4) | (low & 0xf)\n }\n\n let result: number[]\n if (this.#_sign === 1) {\n if ((bytes[0] & 0x80) === 0) {\n result = bytes.slice()\n result[0] |= 0x80\n } else {\n result = [0x80, ...bytes]\n }\n } else if ((bytes[0] & 0x80) === 0) {\n result = bytes.slice()\n } else {\n result = [0x00, ...bytes]\n }\n\n return endian === 'little' ? result.reverse() : result\n }\n\n /**\n * Creates a BigNumber from a number representing the \"bits\" value in a block header.\n *\n * @static\n * @method fromBits\n * @param bits - The number representing the bits value in a block header.\n * @param strict - If true, an error is thrown if the number has negative bit set.\n * @returns Returns a BigNumber equivalent to the \"bits\" value in a block header.\n * @throws Will throw an error if `strict` is `true` and the number has negative bit set.\n */\n static fromBits(bits: number, strict: boolean = false): BigNumber {\n const nSize = bits >>> 24\n const nWordCompact = bits & 0x007fffff\n const isNegativeFromBit = (bits & 0x00800000) !== 0\n\n if (strict && isNegativeFromBit) {\n throw new Error('negative bit set')\n }\n\n if (nSize === 0 && nWordCompact === 0) {\n if (isNegativeFromBit && strict) throw new Error('negative bit set for zero value')\n return new BigNumber(0n)\n }\n\n const bn = new BigNumber(nWordCompact)\n\n // This logic comes from original bn.js `fromCompact`\n if (nSize <= 3) {\n bn.iushrn((3 - nSize) * 8)\n } else {\n bn.iushln((nSize - 3) * 8)\n }\n\n if (isNegativeFromBit) {\n bn.ineg()\n }\n return bn\n }\n\n /**\n * Converts this BigNumber to a number representing the \"bits\" value in a block header.\n *\n * @method toBits\n * @returns Returns a number equivalent to the \"bits\" value in a block header.\n */\n toBits(): number {\n this.strip()\n if (this.isZero() && !this.isNeg()) return 0\n\n const isActualNegative = this.isNeg()\n const bnAbs = this.abs() // Work with absolute value for magnitude\n\n // Get byte array of absolute value\n let mB = bnAbs.toArray('be') // Minimal byte array\n\n // Remove leading zeros from byte array, if any (toArray('be') might already do this if no length specified)\n let firstNonZeroIdx = 0\n while (firstNonZeroIdx < mB.length - 1 && mB[firstNonZeroIdx] === 0) {\n // Keep last byte if it's [0]\n firstNonZeroIdx++\n }\n mB = mB.slice(firstNonZeroIdx)\n\n let nSize = mB.length\n\n let nWordNum\n if (nSize === 0) {\n nWordNum = 0\n } else if (nSize <= 3) {\n nWordNum = 0\n for (let i = 0; i < nSize; i++) {\n nWordNum = (nWordNum << 8) | mB[i]\n }\n } else {\n // nSize > 3\n nWordNum = (mB[0] << 16) | (mB[1] << 8) | mB[2]\n }\n\n if ((nWordNum & 0x00800000) !== 0 && nSize <= 0xff) {\n // MSB of 3-byte mantissa is set\n nWordNum >>>= 8 // Shift mantissa over by one byte\n nSize++ // Increase size component by one\n }\n\n let b = (nSize << 24) | nWordNum\n if (isActualNegative) b |= 0x00800000\n return b >>> 0\n }\n\n /**\n * Creates a BigNumber from the format used in Bitcoin scripts.\n *\n * @static\n * @method fromScriptNum\n * @param num - The number in the format used in Bitcoin scripts.\n * @param requireMinimal - If true, non-minimally encoded values will throw an error.\n * @param maxNumSize - The maximum allowed size for the number.\n * @returns Returns a BigNumber equivalent to the number used in a Bitcoin script.\n */\n static fromScriptNum(\n num: number[],\n requireMinimal: boolean = false,\n maxNumSize?: number\n ): BigNumber {\n if (maxNumSize !== undefined && num.length > maxNumSize)\n throw new Error('script number overflow')\n if (num.length === 0) return new BigNumber(0n)\n if (requireMinimal) {\n if ((num.at(-1) & 0x7f) === 0) {\n if (num.length <= 1 || (num.at(-2) & 0x80) === 0) {\n throw new Error('non-minimally encoded script number')\n }\n }\n }\n return BigNumber.fromSm(num, 'little')\n }\n\n /**\n * Converts this BigNumber to a number in the format used in Bitcoin scripts.\n *\n * @method toScriptNum\n * @returns Returns the equivalent to this BigNumber as a Bitcoin script number.\n */\n toScriptNum(): number[] {\n return this.toSm('little')\n }\n\n /**\n * Compute the multiplicative inverse of the current BigNumber in the modulus field specified by `p`.\n * The multiplicative inverse is a number which when multiplied with the current BigNumber gives '1' in the modulus field.\n *\n * @method _invmp\n * @param p - The `BigNumber` specifying the modulus field.\n * @returns The multiplicative inverse `BigNumber` in the modulus field specified by `p`.\n */\n /**\n * SECURITY NOTE:\n * This implementation avoids variable-time extended Euclidean algorithms\n * to reduce timing side-channel leakage. However, JavaScript BigInt arithmetic\n * does not provide constant-time guarantees. This implementation is suitable\n * for browser and single-tenant environments but is not hardened against\n * high-resolution timing attacks in shared CPU contexts.\n */\n _invmp(p: BigNumber): BigNumber {\n this.#assert(p.#_sign === 0, 'p must not be negative for _invmp')\n this.#assert(!p.isZero(), 'p must not be zero for _invmp')\n\n // Fermat inversion: a^(p-2) mod p\n // NOTE: This assumes p is prime (true for all cryptographic use cases here).\n // This avoids variable-time EEA loops but BigInt arithmetic itself\n // is not constant-time (documented limitation).\n\n const a = this.umod(p)\n const exp = p.subn(2)\n\n // Use modular exponentiation via ReductionContext if available\n if (a.red !== null) {\n return a.redPow(exp)\n }\n\n // Fallback: non-reduction context modular exponentiation\n let result = new BigNumber(1n)\n let base = a.clone()\n const e = exp.clone()\n\n while (!e.isZero()) {\n if (e.isOdd()) result = result.mul(base).umod(p)\n base = base.sqr().umod(p)\n e.iushrn(1)\n }\n\n return result\n }\n\n /**\n * Performs multiplication between the BigNumber instance and a given BigNumber.\n * It chooses the multiplication method based on the lengths of the numbers to optimize execution time.\n *\n * @method mulTo\n * @param num - The BigNumber multiply with.\n * @param out - The BigNumber where to store the result.\n * @returns The BigNumber resulting from the multiplication operation.\n */\n mulTo(num: BigNumber, out: BigNumber): BigNumber {\n out.#_magnitude = this.#_magnitude * num.#_magnitude\n out.#_sign = out.#_magnitude === 0n ? 0 : ((this.#_sign ^ num.#_sign) as 0 | 1)\n out.#_nominalWordLength = this.length + num.length\n out.red = null\n out.normSign()\n return out\n }\n}\n","import BigNumber from './BigNumber.js'\n\n/**\n * A representation of a pseudo-Mersenne prime.\n * A pseudo-Mersenne prime has the general form 2^n - k, where n and k are integers.\n *\n * @class Mersenne\n *\n * @property name - The identifier for the Mersenne instance.\n * @property p - BigNumber equivalent to 2^n - k.\n * @property k - The constant subtracted from 2^n to derive a pseudo-Mersenne prime.\n * @property n - The exponent which determines the magnitude of the prime.\n */\nexport default class Mersenne {\n name: string\n p: BigNumber\n k: BigNumber\n n: number\n private readonly tmp: BigNumber\n\n /**\n * @constructor\n * @param name - An identifier for the Mersenne instance.\n * @param p - A string representation of the pseudo-Mersenne prime, expressed in hexadecimal.\n *\n * @example\n * const mersenne = new Mersenne('M31', '7FFFFFFF');\n */\n constructor (name: string, p: string) {\n // P = 2 ^ N - K\n this.name = name\n this.p = new BigNumber(p, 16)\n this.n = this.p.bitLength()\n this.k = new BigNumber(BigInt(1)).iushln(this.n).isub(this.p) // Use 1n for BigInt compatibility\n\n this.tmp = this._tmp()\n }\n\n /**\n * Creates a temporary BigNumber structure for computations,\n * ensuring the appropriate number of words are initially allocated.\n *\n * @method _tmp\n * @returns A BigNumber with scaled size depending on prime magnitude.\n */\n private _tmp (): BigNumber {\n const tmp = new BigNumber(BigInt(0)) // Initialize with BigInt 0\n const requiredWords = Math.ceil(this.n / BigNumber.wordSize)\n tmp.expand(Math.max(1, requiredWords)) // Expand sets _nominalWordLength\n return tmp\n }\n\n /**\n * Reduces an input BigNumber in place, under the assumption that\n * it is less than the square of the pseudo-Mersenne prime.\n *\n * @method ireduce\n * @param num - The BigNumber to be reduced.\n * @returns The reduced BigNumber.\n *\n * @example\n * const reduced = mersenne.ireduce(new BigNumber('2345', 16));\n */\n ireduce (num: BigNumber): BigNumber {\n // Assumes that `num` is less than `P^2`\n // num = HI * (2 ^ N - K) + HI * K + LO = HI * K + LO (mod P)\n const r = num // num is directly modified\n let rlen\n\n do {\n this.split(r, this.tmp) // r is modified (becomes HI), this.tmp becomes LO\n this.imulK(r) // r becomes HI * K\n r.iadd(this.tmp) // r becomes HI * K + LO\n rlen = r.bitLength()\n } while (rlen > this.n)\n\n const cmp = rlen < this.n ? -1 : r.ucmp(this.p)\n if (cmp === 0) {\n r.words = [0] // Set to zero using the words setter\n } else if (cmp > 0) {\n r.isub(this.p)\n }\n // No explicit strip needed here if operations maintain correctness and setter handles it.\n // However, ensuring it's stripped to minimal form after reduction is good.\n r.strip()\n return r\n }\n\n /**\n * Shifts bits of the input BigNumber to the right, in place,\n * to meet the magnitude of the pseudo-Mersenne prime.\n *\n * @method split\n * @param input - The BigNumber to be shifted (will contain HI part).\n * @param out - The BigNumber to hold the shifted result (LO part).\n *\n * @example\n * mersenne.split(new BigNumber('2345', 16), new BigNumber());\n */\n split (input: BigNumber, out: BigNumber): void {\n // out gets the LO bits (shifted out part)\n // input gets modified to be the HI bits (remaining part after shift)\n input.iushrn(this.n, 0, out)\n }\n\n /**\n * Performs an in-place multiplication of the parameter by constant k.\n *\n * @method imulK\n * @param num - The BigNumber to multiply with k.\n * @returns The result of the multiplication, in BigNumber format.\n *\n * @example\n * const multiplied = mersenne.imulK(new BigNumber('2345', 16));\n */\n imulK (num: BigNumber): BigNumber {\n return num.imul(this.k)\n }\n}\n","import Mersenne from './Mersenne.js'\nimport BigNumber from './BigNumber.js'\n\n/**\n * A class representing K-256, a prime number with optimizations, specifically used in the secp256k1 curve.\n * It extends the functionalities of the Mersenne class.\n * K-256 prime is represented as 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f'\n *\n * @class K256\n * @extends {Mersenne}\n *\n * @example\n * const k256 = new K256();\n */\nexport default class K256 extends Mersenne {\n /**\n * Constructor for the K256 class.\n * Creates an instance of K256 using the super constructor from Mersenne.\n *\n * @constructor\n *\n * @example\n * const k256 = new K256();\n */\n constructor() {\n super('k256', 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f')\n }\n\n /**\n * Splits a BigNumber into a new BigNumber based on specific computation\n * rules. This method modifies the input and output big numbers.\n *\n * @method split\n * @param input - The BigNumber to be split.\n * @param output - The BigNumber that results from the split.\n *\n * @example\n * const input = new BigNumber(3456);\n * const output = new BigNumber(0);\n * k256.split(input, output);\n */\n override split(input: BigNumber, output: BigNumber): void {\n const mask = 0x3fffff // 22 bits\n const inputWords = input.words // Access via getter\n const inputNominalLength = input.length // Access via getter, respects _nominalWordLength\n\n const outLen = Math.min(inputNominalLength, 9)\n const tempOutputWords = Array.from(\n { length: outLen + (inputNominalLength > 9 ? 1 : 0) },\n () => 0\n )\n\n for (let i = 0; i < outLen; i++) {\n tempOutputWords[i] = inputWords[i]\n }\n let currentOutputWordCount = outLen\n\n if (inputNominalLength <= 9) {\n const finalOutputWords = Array.from({ length: currentOutputWordCount }, () => 0)\n for (let i = 0; i < currentOutputWordCount; ++i) finalOutputWords[i] = tempOutputWords[i]\n output.words = finalOutputWords // Use setter\n\n input.words = [0] // Use setter to set to 0\n return\n }\n\n // Shift by 9 limbs\n let prev = inputWords[9]\n tempOutputWords[currentOutputWordCount++] = prev & mask\n\n const finalOutputWords = Array.from({ length: currentOutputWordCount }, () => 0)\n for (let i = 0; i < currentOutputWordCount; ++i) finalOutputWords[i] = tempOutputWords[i]\n output.words = finalOutputWords // Use setter for output\n\n // For input modification\n const tempInputNewWords = Array.from({ length: Math.max(1, inputNominalLength - 9) }, () => 0)\n let currentInputNewWordCount = 0\n\n for (let i = 10; i < inputNominalLength; i++) {\n const next = Math.trunc(inputWords[i])\n if (currentInputNewWordCount < tempInputNewWords.length) {\n // Boundary check\n tempInputNewWords[currentInputNewWordCount++] = ((next & mask) << 4) | (prev >>> 22)\n }\n prev = next\n }\n prev >>>= 22\n if (currentInputNewWordCount < tempInputNewWords.length) {\n // Boundary check\n tempInputNewWords[currentInputNewWordCount++] = prev\n } else if (prev !== 0 && tempInputNewWords.length > 0) {\n // If prev is non-zero but no space, this is an issue.\n // This case implies original logic might have relied on array auto-expansion or specific length handling\n // For safety, if there's still a carry and no space, the array should have been bigger.\n // However, the original logic `input.length -= 9` suggests truncation.\n }\n\n const finalInputNewWords = Array.from({ length: currentInputNewWordCount }, () => 0)\n for (let i = 0; i < currentInputNewWordCount; ++i) finalInputNewWords[i] = tempInputNewWords[i]\n input.words = finalInputNewWords // Use setter, which will strip and set magnitude\n }\n\n /**\n * Multiplies a BigNumber ('num') with the constant 'K' in-place and returns the result.\n * 'K' is equal to 0x1000003d1 or in decimal representation: [ 64, 977 ].\n *\n * @method imulK\n * @param num - The BigNumber to multiply with K.\n * @returns Returns the mutated BigNumber after multiplication.\n *\n * @example\n * const number = new BigNumber(12345);\n * const result = k256.imulK(number);\n */\n override imulK(num: BigNumber): BigNumber {\n const currentWords = num.words // Get current words based on _magnitude and _nominalWordLength\n const originalNominalLength = num.length // Getter\n\n const newNominalLength = originalNominalLength + 2\n const tempWords = Array.from({ length: newNominalLength }, () => 0)\n\n for (let i = 0; i < originalNominalLength; i++) {\n tempWords[i] = currentWords[i]\n }\n // tempWords is now effectively num.words expanded with zeroes\n\n let lo = 0\n for (let i = 0; i < newNominalLength; i++) {\n // Iterate up to new expanded length\n const w = Math.trunc(tempWords[i])\n lo += w * 0x3d1 // 0x3d1 = 977\n tempWords[i] = lo & 0x3ffffff // 26-bit mask\n lo = w * 0x40 + Math.trunc(lo / 0x4000000) // 0x40 = 64. 0x4000000 = 2^26\n }\n\n num.words = tempWords // Use setter to re-initialize from tempWords\n // The setter will handle _magnitude, _sign, _nominalWordLength, and strip.\n return num\n }\n}\n","import BigNumber from './BigNumber.js'\nimport K256 from './K256.js'\nimport Mersenne from './Mersenne.js'\n\n/**\n * SECURITY NOTE:\n * This reduction context avoids obvious variable-time constructs (such as\n * sliding-window exponentiation and conditional modular reduction) to reduce\n * timing side-channel leakage. However, JavaScript BigInt arithmetic does not\n * provide constant-time guarantees. These mitigations improve resistance to\n * coarse timing attacks but do not make the implementation suitable for\n * hostile multi-tenant or shared-CPU environments.\n */\n\n/**\n * A base reduction engine that provides several arithmetic operations over\n * big numbers under a modulus context. It's particularly suitable for\n * calculations required in cryptography algorithms and encoding schemas.\n *\n * @class ReductionContext\n *\n * @property prime - The prime number utilised in the reduction context, typically an instance of Mersenne class.\n * @property m - The modulus used for reduction operations.\n */\nexport default class ReductionContext {\n prime: Mersenne | null\n m: BigNumber\n\n /**\n * Constructs a new ReductionContext.\n *\n * @constructor\n * @param m - A BigNumber representing the modulus, or 'k256' to create a context for Koblitz curve.\n *\n * @example\n * new ReductionContext(new BigNumber(11));\n * new ReductionContext('k256');\n */\n constructor (m: BigNumber | 'k256') {\n if (m === 'k256') {\n const prime = new K256()\n this.m = prime.p\n this.prime = prime\n } else {\n this.assert(m.gtn(1), 'modulus must be greater than 1')\n this.m = m\n this.prime = null\n }\n }\n\n /**\n * Asserts that given value is truthy. Throws an Error with a provided message\n * if the value is falsy.\n *\n * @private\n * @param val - The value to be checked.\n * @param msg - The error message to be thrown if the value is falsy.\n *\n * @example\n * this.assert(1 < 2, '1 is not less than 2');\n * this.assert(2 < 1, '2 is less than 1'); // throws an Error with message '2 is less than 1'\n */\n private assert (val: unknown, msg: string = 'Assertion failed'): void {\n if (!(val as boolean)) throw new Error(msg)\n }\n\n /**\n * Verifies that a BigNumber is positive and red. Throws an error if these\n * conditions are not met.\n *\n * @param a - The BigNumber to be verified.\n *\n * @example\n * this.verify1(new BigNumber(10).toRed());\n * this.verify1(new BigNumber(-10).toRed()); //throws an Error\n * this.verify1(new BigNumber(10)); //throws an Error\n */\n verify1 (a: BigNumber): void {\n this.assert(a.negative === 0, 'red works only with positives')\n this.assert(a.red, 'red works only with red numbers')\n }\n\n /**\n * Verifies that two BigNumbers are both positive and red. Also checks\n * that they have the same reduction context. Throws an error if these\n * conditions are not met.\n *\n * @param a - The first BigNumber to be verified.\n * @param b - The second BigNumber to be verified.\n *\n * @example\n * this.verify2(new BigNumber(10).toRed(this), new BigNumber(20).toRed(this));\n * this.verify2(new BigNumber(-10).toRed(this), new BigNumber(20).toRed(this)); //throws an Error\n * this.verify2(new BigNumber(10).toRed(this), new BigNumber(20)); //throws an Error\n */\n verify2 (a: BigNumber, b: BigNumber): void {\n this.assert(\n (a.negative | b.negative) === 0,\n 'red works only with positives'\n )\n this.assert(\n a.red != null && a.red === b.red,\n 'red works only with red numbers'\n )\n }\n\n /**\n * Performs an in-place reduction of the given BigNumber by the modulus of the reduction context, 'm'.\n *\n * @method imod\n *\n * @param a - BigNumber to be reduced.\n *\n * @returns Returns the reduced result.\n *\n * @example\n * const context = new ReductionContext(new BigNumber(7));\n * context.imod(new BigNumber(19)); // Returns 5\n */\n imod (a: BigNumber): BigNumber {\n if (this.prime != null) return this.prime.ireduce(a).forceRed(this)\n\n BigNumber.move(a, a.umod(this.m).forceRed(this))\n return a\n }\n\n /**\n * Negates a BigNumber in the context of the modulus.\n *\n * @method neg\n *\n * @param a - BigNumber to negate.\n *\n * @returns Returns the negation of 'a' in the reduction context.\n *\n * @example\n * const context = new ReductionContext(new BigNumber(7));\n * context.neg(new BigNumber(3)); // Returns 4\n */\n neg (a: BigNumber): BigNumber {\n if (a.isZero()) {\n return a.clone()\n }\n\n return this.m.sub(a).forceRed(this)\n }\n\n /**\n * Performs the addition operation on two BigNumbers in the reduction context.\n *\n * @method add\n *\n * @param a - First BigNumber to add.\n * @param b - Second BigNumber to add.\n *\n * @returns Returns the result of 'a + b' in the reduction context.\n *\n * @example\n * const context = new ReductionContext(new BigNumber(5));\n * context.add(new BigNumber(2), new BigNumber(4)); // Returns 1\n */\n add (a: BigNumber, b: BigNumber): BigNumber {\n this.verify2(a, b)\n\n // Start from a red clone\n const res = a.clone()\n\n // In-place add keeps red context\n res.iadd(b)\n\n // Always subtract modulus (still red)\n res.isub(this.m)\n\n // If negative, add modulus back\n if (res.isNeg()) {\n res.iadd(this.m)\n }\n\n return res\n }\n\n /**\n * Performs an in-place addition operation on two BigNumbers in the reduction context\n * in order to avoid creating a new BigNumber, it modifies the first one with the result.\n *\n * @method iadd\n *\n * @param a - First BigNumber to add.\n * @param b - Second BigNumber to add.\n *\n * @returns Returns the modified 'a' after addition with 'b' in the reduction context.\n *\n * @example\n * const context = new ReductionContext(new BigNumber(5));\n * const a = new BigNumber(2);\n * context.iadd(a, new BigNumber(4)); // Modifies 'a' to be 1\n */\n iadd (a: BigNumber, b: BigNumber): BigNumber {\n this.verify2(a, b)\n\n a.iadd(b)\n a.isub(this.m)\n\n if (a.isNeg()) {\n a.iadd(this.m)\n }\n\n return a\n }\n\n /**\n * Subtracts one BigNumber from another BigNumber in the reduction context.\n *\n * @method sub\n *\n * @param a - BigNumber to be subtracted from.\n * @param b - BigNumber to subtract.\n *\n * @returns Returns the result of 'a - b' in the reduction context.\n *\n * @example\n * const context = new ReductionContext(new BigNumber(7));\n * context.sub(new BigNumber(3), new BigNumber(2)); // Returns 1\n */\n sub (a: BigNumber, b: BigNumber): BigNumber {\n this.verify2(a, b)\n\n const res = a.sub(b)\n if (res.cmpn(0) < 0) {\n res.iadd(this.m)\n }\n return res.forceRed(this)\n }\n\n /**\n * Performs in-place subtraction of one BigNumber from another in the reduction context,\n * it modifies the first BigNumber with the result.\n *\n * @method isub\n *\n * @param a - BigNumber to be subtracted from.\n * @param b - BigNumber to subtract.\n *\n * @returns Returns the modified 'a' after subtraction of 'b' in the reduction context.\n *\n * @example\n * const context = new ReductionContext(new BigNumber(5));\n * const a = new BigNumber(4);\n * context.isub(a, new BigNumber(2)); // Modifies 'a' to be 2\n */\n isub (a: BigNumber, b: BigNumber): BigNumber {\n this.verify2(a, b)\n\n const res = a.isub(b)\n if (res.cmpn(0) < 0) {\n res.iadd(this.m)\n }\n return res\n }\n\n /**\n * Performs bitwise shift left operation on a BigNumber in the reduction context.\n *\n * @method shl\n *\n * @param a - BigNumber to perform shift on.\n * @param num - The number of positions to shift.\n *\n * @returns Returns the result of shifting 'a' left by 'num' positions in the reduction context.\n *\n * @example\n * const context = new ReductionContext(new BigNumber(32));\n * context.shl(new BigNumber(4), 2); // Returns 16\n */\n shl (a: BigNumber, num: number): BigNumber {\n this.verify1(a)\n return this.imod(a.ushln(num))\n }\n\n /**\n * Performs in-place multiplication of two BigNumbers in the reduction context,\n * modifying the first BigNumber with the result.\n *\n * @method imul\n *\n * @param a - First BigNumber to multiply.\n * @param b - Second BigNumber to multiply.\n *\n * @returns Returns the modified 'a' after multiplication with 'b' in the reduction context.\n *\n * @example\n * const context = new ReductionContext(new BigNumber(7));\n * const a = new BigNumber(3);\n * context.imul(a, new BigNumber(2)); // Modifies 'a' to be 6\n */\n imul (a: BigNumber, b: BigNumber): BigNumber {\n this.verify2(a, b)\n return this.imod(a.imul(b))\n }\n\n /**\n * Multiplies two BigNumbers in the reduction context.\n *\n * @method mul\n *\n * @param a - First BigNumber to multiply.\n * @param b - Second BigNumber to multiply.\n *\n * @returns Returns the result of 'a * b' in the reduction context.\n *\n * @example\n * const context = new ReductionContext(new BigNumber(7));\n * context.mul(new BigNumber(3), new BigNumber(2)); // Returns 6\n */\n mul (a: BigNumber, b: BigNumber): BigNumber {\n this.verify2(a, b)\n return this.imod(a.mul(b))\n }\n\n /**\n * Calculates the square of a BigNumber in the reduction context,\n * modifying the original BigNumber with the result.\n *\n * @method isqr\n *\n * @param a - BigNumber to be squared.\n *\n * @returns Returns the squared 'a' in the reduction context.\n *\n * @example\n * const context = new ReductionContext(new BigNumber(7));\n * const a = new BigNumber(3);\n * context.isqr(a); // Modifies 'a' to be 2 (9 % 7 = 2)\n */\n isqr (a: BigNumber): BigNumber {\n return this.imul(a, a.clone())\n }\n\n /**\n * Calculates the square of a BigNumber in the reduction context.\n *\n * @method sqr\n *\n * @param a - BigNumber to be squared.\n *\n * @returns Returns the result of 'a^2' in the reduction context.\n *\n * @example\n * const context = new ReductionContext(new BigNumber(7));\n * context.sqr(new BigNumber(3)); // Returns 2 (9 % 7 = 2)\n */\n sqr (a: BigNumber): BigNumber {\n return this.mul(a, a)\n }\n\n /**\n * Calculates the square root of a BigNumber in the reduction context.\n *\n * @method sqrt\n *\n * @param a - The BigNumber to calculate the square root of.\n *\n * @returns Returns the square root of 'a' in the reduction context.\n *\n * @example\n * const context = new ReductionContext(new BigNumber(9));\n * context.sqrt(new BigNumber(4)); // Returns 2\n */\n sqrt (a: BigNumber): BigNumber {\n if (a.isZero()) return a.clone()\n\n const mod3 = this.m.andln(3)\n this.assert(mod3 % 2 === 1)\n\n // Fast case\n if (mod3 === 3) {\n const pow = this.m.add(new BigNumber(1)).iushrn(2)\n return this.pow(a, pow)\n }\n\n // Tonelli-Shanks algorithm (Totally unoptimized and slow)\n //\n // Find Q and S, that Q * 2 ^ S = (P - 1)\n const q = this.m.subn(1)\n let s = 0\n while (!q.isZero() && q.andln(1) === 0) {\n s++\n q.iushrn(1)\n }\n this.assert(!q.isZero())\n\n const one = new BigNumber(1).toRed(this)\n const nOne = one.redNeg()\n\n // Find quadratic non-residue\n // NOTE: Max is such because of generalized Riemann hypothesis.\n const lpow = this.m.subn(1).iushrn(1)\n const zl = this.m.bitLength()\n const z = new BigNumber(2 * zl * zl).toRed(this)\n\n while (this.pow(z, lpow).cmp(nOne) !== 0) {\n z.redIAdd(nOne)\n }\n\n let c = this.pow(z, q)\n let r = this.pow(a, q.addn(1).iushrn(1))\n let t = this.pow(a, q)\n let m = s\n while (t.cmp(one) !== 0) {\n let tmp = t\n let i = 0\n while (tmp.cmp(one) !== 0) {\n tmp = tmp.redSqr()\n i++\n }\n this.assert(i < m)\n const b = this.pow(c, new BigNumber(1).iushln(m - i - 1))\n\n r = r.redMul(b)\n c = b.redSqr()\n t = t.redMul(c)\n m = i\n }\n\n return r\n }\n\n /**\n * Calculates the multiplicative inverse of a BigNumber in the reduction context.\n *\n * @method invm\n *\n * @param a - The BigNumber to find the multiplicative inverse of.\n *\n * @returns Returns the multiplicative inverse of 'a' in the reduction context.\n *\n * @example\n * const context = new ReductionContext(new BigNumber(11));\n * context.invm(new BigNumber(3)); // Returns 4 (3*4 mod 11 = 1)\n */\n invm (a: BigNumber): BigNumber {\n const inv = a._invmp(this.m)\n if (inv.negative !== 0) {\n inv.negative = 0\n return this.imod(inv).redNeg()\n } else {\n return this.imod(inv)\n }\n }\n\n /**\n * Raises a BigNumber to a power in the reduction context.\n *\n * @method pow\n *\n * @param a - The BigNumber to be raised to a power.\n * @param num - The power to raise the BigNumber to.\n *\n * @returns Returns the result of 'a' raised to the power of 'num' in the reduction context.\n *\n * @example\n * const context = new ReductionContext(new BigNumber(7));\n * context.pow(new BigNumber(3), new BigNumber(2)); // Returns 2 (3^2 % 7)\n */\n pow (a: BigNumber, num: BigNumber): BigNumber {\n this.verify1(a)\n\n if (num.isZero()) return new BigNumber(1).toRed(this)\n\n let result = new BigNumber(1).toRed(this)\n const base = a.clone()\n const bits = num.bitLength()\n\n for (let i = bits - 1; i >= 0; i--) {\n // Always square\n result = this.sqr(result)\n\n // Multiply if bit is set\n if (num.testn(i)) {\n result = this.mul(result, base)\n }\n }\n\n return result\n }\n\n /**\n * Converts a BigNumber to its equivalent in the reduction context.\n *\n * @method convertTo\n *\n * @param num - The BigNumber to convert to the reduction context.\n *\n * @returns Returns the converted BigNumber compatible with the reduction context.\n *\n * @example\n * const context = new ReductionContext(new BigNumber(7));\n * context.convertTo(new BigNumber(8)); // Returns 1 (8 % 7)\n */\n convertTo (num: BigNumber): BigNumber {\n const r = num.umod(this.m)\n\n return r === num ? r.clone() : r\n }\n\n /**\n * Converts a BigNumber from reduction context to its regular form.\n *\n * @method convertFrom\n *\n * @param num - The BigNumber to convert from the reduction context.\n *\n * @returns Returns the converted BigNumber in its regular form.\n *\n * @example\n * const context = new ReductionContext(new BigNumber(7));\n * const a = context.convertTo(new BigNumber(8)); // 'a' is now 1 in the reduction context\n * context.convertFrom(a); // Returns 1\n */\n convertFrom (num: BigNumber): BigNumber {\n const res = num.clone()\n res.red = null\n return res\n }\n}\n","import ReductionContext from './ReductionContext.js'\nimport BigNumber from './BigNumber.js'\n\n/**\n * Represents a Montgomery reduction context, which is a mathematical method\n * for performing modular multiplication without division.\n *\n * Montgomery reduction is an algorithm used mainly in cryptography which can\n * help to speed up calculations in contexts where there are many repeated\n * computations.\n *\n * This class extends the `ReductionContext` class.\n *\n * @class MontgomoryMethod\n * @extends {ReductionContext}\n *\n * @property shift - The number of bits in the modulus.\n * @property r - The 2^shift, shifted left by the bit length of modulus `m`.\n * @property r2 - The square of `r` modulo `m`.\n * @property rinv - The modular multiplicative inverse of `r` mod `m`.\n * @property minv - The modular multiplicative inverse of `m` mod `r`.\n */\nexport default class MontgomoryMethod extends ReductionContext {\n shift: number\n r: BigNumber\n r2: BigNumber\n rinv: BigNumber\n minv: BigNumber\n\n /**\n * @constructor\n * @param m - The modulus to be used for the Montgomery method reductions.\n */\n constructor(m: BigNumber | 'k256') {\n super(m)\n\n this.shift = this.m.bitLength()\n if (this.shift % 26 !== 0) {\n this.shift += 26 - (this.shift % 26)\n }\n\n this.r = new BigNumber(1).iushln(this.shift)\n this.r2 = this.imod(this.r.sqr())\n this.rinv = this.r._invmp(this.m)\n\n this.minv = this.rinv.mul(this.r).isubn(1).div(this.m)\n this.minv = this.minv.umod(this.r)\n this.minv = this.r.sub(this.minv)\n }\n\n /**\n * Converts a number into the Montgomery domain.\n *\n * @method convertTo\n * @param num - The number to be converted into the Montgomery domain.\n * @returns The result of the conversion into the Montgomery domain.\n *\n * @example\n * const montMethod = new MontgomoryMethod(m);\n * const convertedNum = montMethod.convertTo(num);\n */\n override convertTo(num: BigNumber): BigNumber {\n return this.imod(num.ushln(this.shift))\n }\n\n /**\n * Converts a number from the Montgomery domain back to the original domain.\n *\n * @method convertFrom\n * @param num - The number to be converted from the Montgomery domain.\n * @returns The result of the conversion from the Montgomery domain.\n *\n * @example\n * const montMethod = new MontgomoryMethod(m);\n * const convertedNum = montMethod.convertFrom(num);\n */\n override convertFrom(num: BigNumber): BigNumber {\n const r = this.imod(num.mul(this.rinv))\n r.red = null\n return r\n }\n\n /**\n * Performs an in-place multiplication of two numbers in the Montgomery domain.\n *\n * @method imul\n * @param a - The first number to multiply.\n * @param b - The second number to multiply.\n * @returns The result of the in-place multiplication.\n *\n * @example\n * const montMethod = new MontgomoryMethod(m);\n * const product = montMethod.imul(a, b);\n */\n override imul(a: BigNumber, b: BigNumber): BigNumber {\n if (a.isZero() || b.isZero()) {\n a.words[0] = 0\n ;(a as any).length = 1\n return a\n }\n\n const t = a.imul(b)\n const c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m)\n const u = t.isub(c).iushrn(this.shift)\n let res = u\n\n if (u.cmp(this.m) >= 0) {\n res = u.isub(this.m)\n } else if (u.cmpn(0) < 0) {\n res = u.iadd(this.m)\n }\n\n return res.forceRed(this)\n }\n\n /**\n * Performs the multiplication of two numbers in the Montgomery domain.\n *\n * @method mul\n * @param a - The first number to multiply.\n * @param b - The second number to multiply.\n * @returns The result of the multiplication.\n *\n * @example\n * const montMethod = new MontgomoryMethod(m);\n * const product = montMethod.mul(a, b);\n */\n override mul(a: BigNumber, b: BigNumber): BigNumber {\n if (a.isZero() || b.isZero()) return new BigNumber(0).forceRed(this)\n\n const t = a.mul(b)\n const c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m)\n const u = t.isub(c).iushrn(this.shift)\n let res = u\n if (u.cmp(this.m) >= 0) {\n res = u.isub(this.m)\n } else if (u.cmpn(0) < 0) {\n res = u.iadd(this.m)\n }\n\n return res.forceRed(this)\n }\n\n /**\n * Calculates the modular multiplicative inverse of a number in the Montgomery domain.\n *\n * @method invm\n * @param a - The number to compute the modular multiplicative inverse of.\n * @returns The modular multiplicative inverse of 'a'.\n *\n * @example\n * const montMethod = new MontgomoryMethod(m);\n * const inverse = montMethod.invm(a);\n */\n override invm(a: BigNumber): BigNumber {\n // (AR)^-1 * R^2 = (A^-1 * R^-1) * R^2 = A^-1 * R\n const res = this.imod(a._invmp(this.m).mul(this.r2))\n return res.forceRed(this)\n }\n}\n","const encoder = new TextEncoder()\n\nexport function utf8Bytes(value: string): Uint8Array {\n return encoder.encode(value)\n}\n\nexport function utf8ByteLength(value: string): number {\n return utf8Bytes(value).byteLength\n}\n\nexport function hasControlCharacter(value: string): boolean {\n for (const character of value) {\n const codePoint = character.codePointAt(0)!\n if (codePoint <= 0x1f || (codePoint >= 0x7f && codePoint <= 0x9f)) return true\n }\n return false\n}\n","// src/primitives/hex.ts\n\n// Accepts empty string because empty byte arrays are valid in Bitcoin.\nconst PURE_HEX_REGEX = /^[0-9a-fA-F]*$/\n\nexport function assertValidHex (msg: string): void {\n if (typeof msg !== 'string') {\n throw new TypeError('Invalid hex string')\n }\n\n // allow empty\n if (msg.length === 0) return\n\n if (!PURE_HEX_REGEX.test(msg)) {\n throw new Error('Invalid hex string')\n }\n}\n\nexport function normalizeHex (msg: string): string {\n assertValidHex(msg)\n\n // If empty, return empty — never force to \"00\"\n if (msg.length === 0) return ''\n\n let normalized = msg.toLowerCase()\n\n // Pad odd-length hex\n if (normalized.length % 2 !== 0) {\n normalized = '0' + normalized\n }\n\n return normalized\n}\n","// @ts-nocheck\n// Modified code incorporates hash.js, @noble/hashes, and Closure lineages; see ../../THIRD_PARTY_NOTICES.md.\n/* eslint-disable @typescript-eslint/naming-convention */\nimport { assertValidHex, normalizeHex } from './hex.js'\nimport { utf8Bytes } from './UTF8.js'\n\nconst assert = (expression: unknown, message: string = 'Hash assertion failed'): void => {\n if (!(expression as boolean)) {\n throw new Error(message)\n }\n}\n\n/**\n * The BaseHash class is an abstract base class for cryptographic hash functions.\n * It provides a common structure and functionality for hash function classes.\n *\n * @class BaseHash\n *\n * @property pending - Stores partially processed message segments.\n * @property pendingTotal - The total number of characters that are being stored in `pending`\n * @property blockSize - The size of each block to processed.\n * @property outSize - The size of the final hash output.\n * @property endian - The endianness used during processing, can either be 'big' or 'little'.\n * @property _delta8 - The block size divided by 8, useful in various computations.\n * @property _delta32 - The block size divided by 32, useful in various computations.\n * @property padLength - The length of padding to be added to finalize the computation.\n * @property hmacStrength - The HMAC strength value.\n *\n * @param blockSize - The size of the block to be hashed.\n * @param outSize - The size of the resulting hash.\n * @param hmacStrength - The strength of the HMAC.\n * @param padLength - The length of the padding to be added.\n *\n * @example\n * Sub-classes would extend this base BaseHash class like:\n * class RIPEMD160 extends BaseHash {\n * constructor () {\n * super(512, 160, 192, 64);\n * // ...\n * }\n * // ...\n * }\n */\nabstract class BaseHash {\n pending: number[] | null = null\n pendingTotal: number = 0\n blockSize: number\n outSize: number\n endian: 'big' | 'little'\n _delta8: number\n _delta32: number\n padLength: number\n hmacStrength: number\n\n constructor(blockSize: number, outSize: number, hmacStrength: number, padLength: number) {\n this.blockSize = blockSize\n this.outSize = outSize\n this.hmacStrength = hmacStrength\n this.padLength = padLength / 8\n this.endian = 'big'\n\n this._delta8 = this.blockSize / 8\n this._delta32 = this.blockSize / 32\n }\n\n _update(_msg: number[], _start: number): void {\n throw new Error('Not implemented')\n }\n\n _digest(): number[] {\n throw new Error('Not implemented')\n }\n\n _digestHex(): string {\n throw new Error('Not implemented')\n }\n\n /**\n * Converts the input message into an array, pads it, and joins into 32bit blocks.\n * If there is enough data, it tries updating the hash computation.\n *\n * @method update\n * @param msg - The message segment to include in the hashing computation.\n * @param enc - The encoding of the message. If 'hex', the string will be treated as such, 'utf8' otherwise.\n *\n * @returns Returns the instance of the object for chaining.\n *\n * @example\n * sha256.update('Hello World', 'utf8');\n */\n update(msg: number[] | string, enc?: 'hex' | 'utf8'): this {\n // Convert message to array, pad it, and join into 32bit blocks\n msg = toArray(msg, enc)\n if (this.pending == null) {\n this.pending = msg\n } else {\n this.pending = this.pending.concat(msg)\n }\n this.pendingTotal += msg.length\n\n // Enough data, try updating\n if (this.pending.length >= this._delta8) {\n msg = this.pending\n\n // Process pending data in blocks\n const r = msg.length % this._delta8\n this.pending = msg.slice(msg.length - r, msg.length)\n if (this.pending.length === 0) {\n this.pending = null\n }\n\n msg = join32(msg, 0, msg.length - r, this.endian)\n for (let i = 0; i < msg.length; i += this._delta32) {\n this._update(msg, i)\n }\n }\n\n return this\n }\n\n /**\n * Finalizes the hash computation and returns the hash value/result.\n *\n * @method digest\n *\n * @returns Returns the final hash value.\n *\n * @example\n * const hash = sha256.digest();\n */\n digest(): number[] {\n this.update(this._pad())\n assert(this.pending === null)\n\n return this._digest()\n }\n\n /**\n * Finalizes the hash computation and returns the hash value/result as a hex string.\n *\n * @method digest\n *\n * @returns Returns the final hash value as a hex string.\n *\n * @example\n * const hash = sha256.digestHex();\n */\n digestHex(): string {\n this.update(this._pad())\n assert(this.pending === null)\n\n return this._digestHex()\n }\n\n /**\n * [Private Method] Used internally to prepare the padding for the final stage of the hash computation.\n *\n * @method _pad\n * @private\n *\n * @returns Returns an array denoting the padding.\n */\n private _pad(): number[] {\n const len = this.pendingTotal\n if (!Number.isSafeInteger(len) || len < 0) {\n throw new Error('Message too long for this hash function')\n }\n\n const bytes = this._delta8\n const k = bytes - ((len + this.padLength) % bytes)\n const res = Array.from({ length: k + this.padLength })\n res[0] = 0x80\n let i: number\n for (i = 1; i < k; i++) {\n res[i] = 0\n }\n const lengthBytes = this.padLength\n const maxBits = 1n << BigInt(lengthBytes * 8)\n let totalBits = BigInt(len) * 8n\n\n if (totalBits >= maxBits) {\n throw new Error('Message too long for this hash function')\n }\n\n if (this.endian === 'big') {\n const lenArray = Array.from({ length: lengthBytes })\n\n for (let b = lengthBytes - 1; b >= 0; b--) {\n lenArray[b] = Number(totalBits & 0xffn)\n totalBits >>= 8n\n }\n\n for (let b = 0; b < lengthBytes; b++) {\n res[i++] = lenArray[b]\n }\n } else {\n for (let b = 0; b < lengthBytes; b++) {\n res[i++] = Number(totalBits & 0xffn)\n totalBits >>= 8n\n }\n }\n\n return res\n }\n}\n\n/**\n * Encode a single UTF-16 code unit (and possibly its surrogate partner)\n * into UTF-8 bytes, appending them to `out`.\n *\n * Returns the index of the last consumed code unit so the caller can\n * advance its loop variable when a surrogate pair is consumed.\n *\n * Inspired by stringToUtf8ByteArray() in closure-library by Google\n * https://github.com/google/closure-library/blob/8598d87242af59aac233270742c8984e2b2bdbe0/closure/goog/crypt/crypt#L117-L143\n * Apache License 2.0\n * https://github.com/google/closure-library/blob/master/LICENSE\n */\nfunction appendUtf8CodeUnit(msg: string, i: number, out: number[]): number {\n // The caller's loop guarantees that i is within msg.\n const c = msg.codePointAt(i) as number\n if (c < 128) {\n out.push(c)\n return i\n }\n if (c < 2048) {\n out.push((c >> 6) | 192, (c & 63) | 128)\n return i\n }\n if (c > 0xffff) {\n out.push((c >> 18) | 240, ((c >> 12) & 63) | 128, ((c >> 6) & 63) | 128, (c & 63) | 128)\n return i + 1\n }\n out.push((c >> 12) | 224, ((c >> 6) & 63) | 128, (c & 63) | 128)\n return i\n}\n\nfunction utf8StringToArray(msg: string): number[] {\n const res: number[] = []\n let i = 0\n while (i < msg.length) {\n const lastConsumed = appendUtf8CodeUnit(msg, i, res)\n i = lastConsumed + 1\n }\n return res\n}\n\nfunction hexStringToArray(msg: string): number[] {\n assertValidHex(msg)\n const normalized = normalizeHex(msg)\n const res: number[] = []\n for (let i = 0; i < normalized.length; i += 2) {\n res.push(Number.parseInt(normalized[i] + normalized[i + 1], 16))\n }\n return res\n}\n\nfunction numberArrayToByteArray(msg: number[]): number[] {\n const res: number[] = []\n for (let i = 0; i < msg.length; i++) {\n res[i] = Math.trunc(msg[i])\n }\n return res\n}\n\n/**\n *\n * @param msg\n * @param enc Optional. Encoding to use if msg is string. Default is 'utf8'.\n * @returns array of byte values from msg. If msg is an array, a copy is returned.\n */\nexport function toArray(msg: number[] | string, enc?: 'hex' | 'utf8'): number[] {\n if (Array.isArray(msg)) {\n return msg.slice()\n }\n if (!(msg as unknown as boolean)) {\n return []\n }\n if (typeof msg === 'string') {\n return enc === 'hex' ? hexStringToArray(msg) : utf8StringToArray(msg)\n }\n return numberArrayToByteArray(msg as number[])\n}\n\n/**\n * @deprecated\n * This function behaves differently from the standard C `htonl()`.\n * It always performs an unconditional 32-bit byte swap.\n * Use `swapBytes32()` for explicit byte swapping, or `realHtonl()` for\n * standards-compliant host-to-network conversion.\n */\nexport function htonl(w: number): number {\n return swapBytes32(w)\n}\n\nfunction toHex32(msg: number[], endian?: 'little' | 'big'): string {\n let res = ''\n for (let w of msg) {\n if (endian === 'little') {\n w = htonl(w)\n }\n res += zero8(w.toString(16))\n }\n return res\n}\n\nfunction zero8(word: string): string {\n if (word.length === 7) {\n return '0' + word\n } else if (word.length === 6) {\n return '00' + word\n } else if (word.length === 5) {\n return '000' + word\n } else if (word.length === 4) {\n return '0000' + word\n } else if (word.length === 3) {\n return '00000' + word\n } else if (word.length === 2) {\n return '000000' + word\n } else if (word.length === 1) {\n return '0000000' + word\n } else {\n return word\n }\n}\n\nconst BufferCtor = typeof globalThis === 'undefined' ? undefined : (globalThis as any).Buffer\nconst CAN_USE_BUFFER = BufferCtor != null && typeof BufferCtor.from === 'function'\nconst HEX_DIGITS = '0123456789abcdef'\nconst HEX_BYTE_STRINGS: string[] = Array.from({ length: 256 })\nfor (let i = 0; i < HEX_BYTE_STRINGS.length; i++) {\n HEX_BYTE_STRINGS[i] = HEX_DIGITS[(i >> 4) & 0xf] + HEX_DIGITS[i & 0xf]\n}\n\nfunction bytesToHex(data: Uint8Array): string {\n if (CAN_USE_BUFFER) {\n return BufferCtor.from(data).toString('hex')\n }\n const out: string[] = Array.from({ length: data.length })\n for (let i = 0; i < data.length; i++) out[i] = HEX_BYTE_STRINGS[data[i]]\n return out.join('')\n}\n\nconst NODE_CRYPTO = (() => {\n const processLike = typeof globalThis === 'undefined' ? undefined : (globalThis as any).process\n const getBuiltinModule = processLike?.getBuiltinModule\n if (typeof getBuiltinModule === 'function') {\n try {\n const crypto = getBuiltinModule.call(processLike, 'node:crypto')\n if (crypto != null) return crypto\n } catch {\n // node:crypto is unavailable in this runtime\n }\n }\n return undefined\n})()\n\ntype HashInput = Uint8Array | number[] | string\n\nfunction toHashBytes(msg: HashInput, enc?: 'hex' | 'utf8'): Uint8Array {\n if (msg instanceof Uint8Array) {\n return msg\n }\n if (Array.isArray(msg)) {\n return new Uint8Array(msg)\n }\n return Uint8Array.from(toArray(msg, enc))\n}\n\nfunction toHashKeyBytes(key: HashInput): Uint8Array {\n return typeof key === 'string' ? toHashBytes(key, 'hex') : toHashBytes(key)\n}\n\ninterface FallbackHashLike {\n update: (data: Uint8Array) => unknown\n digest: () => Uint8Array\n}\n\nfunction updateNativeOrFallback(\n native: any,\n fallback: FallbackHashLike | undefined,\n data: Uint8Array\n): void {\n if (native != null) {\n native.update(data)\n } else if (fallback != null) {\n fallback.update(data)\n }\n}\n\nfunction digestNativeOrFallback(native: any, fallback: FallbackHashLike | undefined): number[] {\n if (native != null) return Array.from(native.digest())\n if (fallback != null) return Array.from(fallback.digest())\n return []\n}\n\nfunction digestHexNativeOrFallback(native: any, fallback: FallbackHashLike | undefined): string {\n if (native != null) return native.digest('hex')\n if (fallback != null) return bytesToHex(fallback.digest())\n return ''\n}\n\nfunction createNodeHash(algorithm: string): any {\n const createHash = NODE_CRYPTO?.createHash\n if (typeof createHash !== 'function') return undefined\n try {\n return createHash(algorithm)\n } catch {\n return undefined\n }\n}\n\nfunction createNodeHmac(algorithm: string, keyBytes: Uint8Array): any {\n const createHmac = NODE_CRYPTO?.createHmac\n if (typeof createHmac !== 'function') return undefined\n try {\n return createHmac(algorithm, keyBytes)\n } catch {\n return undefined\n }\n}\n\nfunction digestWithNodeHash(\n algorithm: string,\n msg: HashInput,\n enc?: 'hex' | 'utf8'\n): Uint8Array | undefined {\n const hash = createNodeHash(algorithm)\n if (hash == null) return undefined\n hash.update(toHashBytes(msg, enc))\n return hash.digest()\n}\n\nfunction digestWithNodeHmac(\n algorithm: string,\n key: HashInput,\n msg: HashInput,\n enc?: 'hex' | 'utf8'\n): Uint8Array | undefined {\n const hmac = createNodeHmac(algorithm, toHashKeyBytes(key))\n if (hmac == null) return undefined\n hmac.update(toHashBytes(msg, enc))\n return hmac.digest()\n}\n\nfunction join32(msg, start, end, endian): number[] {\n const len = end - start\n assert(len % 4 === 0)\n const res = Array.from({ length: len / 4 })\n for (let i = 0, k: number = start; i < res.length; i++, k += 4) {\n let w\n if (endian === 'big') {\n w = (msg[k] << 24) | (msg[k + 1] << 16) | (msg[k + 2] << 8) | msg[k + 3]\n } else {\n w = (msg[k + 3] << 24) | (msg[k + 2] << 16) | (msg[k + 1] << 8) | msg[k]\n }\n res[i] = w >>> 0\n }\n return res\n}\n\nfunction split32(msg: number[], endian: 'big' | 'little'): number[] {\n const res = Array.from({ length: msg.length * 4 })\n for (let i = 0, k = 0; i < msg.length; i++, k += 4) {\n const m = msg[i]\n if (endian === 'big') {\n res[k] = m >>> 24\n res[k + 1] = (m >>> 16) & 0xff\n res[k + 2] = (m >>> 8) & 0xff\n res[k + 3] = m & 0xff\n } else {\n res[k + 3] = m >>> 24\n res[k + 2] = (m >>> 16) & 0xff\n res[k + 1] = (m >>> 8) & 0xff\n res[k] = m & 0xff\n }\n }\n return res\n}\n\nfunction rotr32(w: number, b: number): number {\n return (w >>> b) | (w << (32 - b))\n}\n\nfunction rotl32(w: number, b: number): number {\n return (w << b) | (w >>> (32 - b))\n}\n\nfunction sum32(a: number, b: number): number {\n return (a + b) >>> 0\n}\n\nfunction SUM32_3(a: number, b: number, c: number): number {\n return (a + b + c) >>> 0\n}\n\nfunction SUM32_4(a: number, b: number, c: number, d: number): number {\n return (a + b + c + d) >>> 0\n}\n\nfunction SUM32_5(a: number, b: number, c: number, d: number, e: number): number {\n return (a + b + c + d + e) >>> 0\n}\n\nfunction FT_1(s, x, y, z): number {\n if (s === 0) {\n return ch32(x, y, z)\n }\n if (s === 1 || s === 3) {\n return p32(x, y, z)\n }\n if (s === 2) {\n return maj32(x, y, z)\n }\n return 0\n}\n\nfunction ch32(x, y, z): number {\n return (x & y) ^ (~x & z)\n}\n\nfunction maj32(x, y, z): number {\n return (x & y) ^ (x & z) ^ (y & z)\n}\n\nfunction p32(x, y, z): number {\n return x ^ y ^ z\n}\n\nfunction S0_256(x): number {\n return rotr32(x, 2) ^ rotr32(x, 13) ^ rotr32(x, 22)\n}\n\nfunction S1_256(x): number {\n return rotr32(x, 6) ^ rotr32(x, 11) ^ rotr32(x, 25)\n}\n\nfunction G0_256(x): number {\n return rotr32(x, 7) ^ rotr32(x, 18) ^ (x >>> 3)\n}\n\nfunction G1_256(x): number {\n return rotr32(x, 17) ^ rotr32(x, 19) ^ (x >>> 10)\n}\n\nconst r = [\n 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2,\n 14, 11, 8, 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, 1, 9, 11, 10, 0, 8, 12, 4, 13, 3,\n 7, 15, 14, 5, 6, 2, 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13\n]\n\nconst rh = [\n 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4,\n 9, 1, 2, 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2,\n 13, 9, 7, 10, 14, 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11\n]\n\nconst s = [\n 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9,\n 11, 7, 13, 12, 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, 11, 12, 14, 15, 14, 15, 9,\n 8, 9, 14, 5, 6, 8, 6, 5, 12, 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6\n]\n\nconst sh = [\n 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7,\n 6, 15, 13, 11, 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, 15, 5, 8, 11, 14, 14, 6,\n 14, 6, 9, 12, 9, 12, 5, 15, 8, 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11\n]\n\nfunction f(j, x, y, z): number {\n if (j <= 15) {\n return x ^ y ^ z\n } else if (j <= 31) {\n return (x & y) | (~x & z)\n } else if (j <= 47) {\n return (x | ~y) ^ z\n } else if (j <= 63) {\n return (x & z) | (y & ~z)\n } else {\n return x ^ (y | ~z)\n }\n}\n\nfunction K(j): number {\n if (j <= 15) {\n return 0x00000000\n } else if (j <= 31) {\n return 0x5a827999\n } else if (j <= 47) {\n return 0x6ed9eba1\n } else if (j <= 63) {\n return 0x8f1bbcdc\n } else {\n return 0xa953fd4e\n }\n}\n\nfunction Kh(j): number {\n if (j <= 15) {\n return 0x50a28be6\n } else if (j <= 31) {\n return 0x5c4dd124\n } else if (j <= 47) {\n return 0x6d703ef3\n } else if (j <= 63) {\n return 0x7a6d76e9\n } else {\n return 0x00000000\n }\n}\n\n/**\n * An implementation of RIPEMD160 cryptographic hash function. Extends the BaseHash class.\n * It provides a way to compute a 'digest' for any kind of input data; transforming the data\n * into a unique output of fixed size. The output is deterministic; it will always be\n * the same for the same input.\n *\n * @class RIPEMD160\n * @param None\n *\n * @constructor\n * Use the RIPEMD160 constructor to create an instance of RIPEMD160 hash function.\n *\n * @example\n * const ripemd160 = new RIPEMD160();\n *\n * @property h - Array that is updated iteratively as part of hashing computation.\n */\nexport class RIPEMD160 extends BaseHash {\n h: number[]\n\n constructor() {\n super(512, 160, 192, 64)\n this.endian = 'little'\n\n this.h = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0]\n this.endian = 'little'\n }\n\n _update(msg: number[], start: number): void {\n let A = this.h[0]\n let B = this.h[1]\n let C = this.h[2]\n let D = this.h[3]\n let E = this.h[4]\n let Ah = A\n let Bh = B\n let Ch = C\n let Dh = D\n let Eh = E\n let T\n for (let j = 0; j < 80; j++) {\n T = sum32(rotl32(SUM32_4(A, f(j, B, C, D), msg[r[j] + start], K(j)), s[j]), E)\n A = E\n E = D\n D = rotl32(C, 10)\n C = B\n B = T\n T = sum32(rotl32(SUM32_4(Ah, f(79 - j, Bh, Ch, Dh), msg[rh[j] + start], Kh(j)), sh[j]), Eh)\n Ah = Eh\n Eh = Dh\n Dh = rotl32(Ch, 10)\n Ch = Bh\n Bh = T\n }\n T = SUM32_3(this.h[1], C, Dh)\n this.h[1] = SUM32_3(this.h[2], D, Eh)\n this.h[2] = SUM32_3(this.h[3], E, Ah)\n this.h[3] = SUM32_3(this.h[4], A, Bh)\n this.h[4] = SUM32_3(this.h[0], B, Ch)\n this.h[0] = T\n }\n\n _digest(): number[] {\n return split32(this.h, 'little')\n }\n\n _digestHex(): string {\n return toHex32(this.h, 'little')\n }\n}\n\n/**\n * An implementation of SHA256 cryptographic hash function. Extends the BaseHash class.\n * It provides a way to compute a 'digest' for any kind of input data; transforming the data\n * into a unique output of fixed size. The output is deterministic; it will always be\n * the same for the same input.\n *\n * @class SHA256\n * @param None\n *\n * @constructor\n * Use the SHA256 constructor to create an instance of SHA256 hash function.\n *\n * @example\n * const sha256 = new SHA256();\n *\n * @property h - The initial hash constants\n * @property W - Provides a way to recycle usage of the array memory.\n * @property k - The round constants used for each round of SHA-256\n */\nexport class SHA256 {\n readonly #h?: FastSHA256\n readonly #native?: any\n\n constructor() {\n this.#native = createNodeHash('sha256')\n if (this.#native == null) {\n this.#h = new FastSHA256()\n }\n }\n\n update(msg: HashInput, enc?: 'hex' | 'utf8'): this {\n updateNativeOrFallback(this.#native, this.#h, toHashBytes(msg, enc))\n return this\n }\n\n digest(): number[] {\n return digestNativeOrFallback(this.#native, this.#h)\n }\n\n digestHex(): string {\n return digestHexNativeOrFallback(this.#native, this.#h)\n }\n}\n\n/**\n * An implementation of SHA1 cryptographic hash function. Extends the BaseHash class.\n * It provides a way to compute a 'digest' for any kind of input data; transforming the data\n * into a unique output of fixed size. The output is deterministic; it will always be\n * the same for the same input.\n *\n * @class SHA1\n * @param None\n *\n * @constructor\n * Use the SHA1 constructor to create an instance of SHA1 hash function.\n *\n * @example\n * const sha1 = new SHA1();\n *\n * @property h - The initial hash constants.\n * @property W - Provides a way to recycle usage of the array memory.\n * @property k - The round constants used for each round of SHA-1.\n */\nexport class SHA1 extends BaseHash {\n h: number[]\n W: number[]\n k: number[]\n\n constructor() {\n super(512, 160, 80, 64)\n this.k = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6]\n this.h = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0]\n this.W = Array.from({ length: 80 })\n }\n\n _update(msg: number[], start?: number): void {\n const W = this.W\n\n // Default start to 0\n start ??= 0\n\n let i: number\n for (i = 0; i < 16; i++) {\n W[i] = msg[start + i]\n }\n\n for (; i < W.length; i++) {\n W[i] = rotl32(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1)\n }\n\n let a = this.h[0]\n let b = this.h[1]\n let c = this.h[2]\n let d = this.h[3]\n let e = this.h[4]\n\n for (i = 0; i < W.length; i++) {\n const s = Math.trunc(i / 20)\n const t = SUM32_5(rotl32(a, 5), FT_1(s, b, c, d), e, W[i], this.k[s])\n e = d\n d = c\n c = rotl32(b, 30)\n b = a\n a = t\n }\n\n this.h[0] = sum32(this.h[0], a)\n this.h[1] = sum32(this.h[1], b)\n this.h[2] = sum32(this.h[2], c)\n this.h[3] = sum32(this.h[3], d)\n this.h[4] = sum32(this.h[4], e)\n }\n\n _digest(): number[] {\n return split32(this.h, 'big')\n }\n\n _digestHex(): string {\n return toHex32(this.h, 'big')\n }\n}\n\n/**\n * An implementation of SHA512 cryptographic hash function. Extends the BaseHash class.\n * It provides a way to compute a 'digest' for any kind of input data; transforming the data\n * into a unique output of fixed size. The output is deterministic; it will always be\n * the same for the same input.\n *\n * @class SHA512\n * @param None\n *\n * @constructor\n * Use the SHA512 constructor to create an instance of SHA512 hash function.\n *\n * @example\n * const sha512 = new SHA512();\n *\n * @property h - The initial hash constants.\n * @property W - Provides a way to recycle usage of the array memory.\n * @property k - The round constants used for each round of SHA-512.\n */\nexport class SHA512 {\n readonly #h?: FastSHA512\n readonly #native?: any\n\n constructor() {\n this.#native = createNodeHash('sha512')\n if (this.#native == null) {\n this.#h = new FastSHA512()\n }\n }\n\n update(msg: HashInput, enc?: 'hex' | 'utf8'): this {\n updateNativeOrFallback(this.#native, this.#h, toHashBytes(msg, enc))\n return this\n }\n\n digest(): number[] {\n return digestNativeOrFallback(this.#native, this.#h)\n }\n\n digestHex(): string {\n return digestHexNativeOrFallback(this.#native, this.#h)\n }\n}\n\n/**\n * The `SHA256HMAC` class is used to create Hash-based Message Authentication Code (HMAC) using the SHA-256 cryptographic hash function.\n *\n * HMAC is a specific type of MAC involving a cryptographic hash function and a secret cryptographic key. It may be used to simultaneously verify both the data integrity and the authenticity of a message.\n *\n * This class also uses the SHA-256 cryptographic hash algorithm that produces a 256-bit (32-byte) hash value.\n *\n * @property inner - Represents the inner hash of SHA-256.\n * @property outer - Represents the outer hash of SHA-256.\n * @property blockSize - The block size for the SHA-256 hash function, in bytes. It's set to 64 bytes.\n * @property outSize - The output size of the SHA-256 hash function, in bytes. It's set to 32 bytes.\n */\nexport class SHA256HMAC {\n readonly #h?: HMAC<FastSHA256>\n readonly #native?: any\n blockSize = 64\n outSize = 32\n\n /**\n * The constructor for the `SHA256HMAC` class.\n *\n * It initializes the `SHA256HMAC` object and sets up the inner and outer padded keys.\n * If the key size is larger than the blockSize, it is digested using SHA-256.\n * If the key size is less than the blockSize, it is padded with zeroes.\n *\n * @constructor\n * @param key - The key to use to create the HMAC. Can be a number array or a string in hexadecimal format.\n *\n * @example\n * const myHMAC = new SHA256HMAC('deadbeef');\n */\n constructor(key: HashInput) {\n const k = toHashKeyBytes(key)\n this.#native = createNodeHmac('sha256', k)\n if (this.#native == null) {\n this.#h = new HMAC(sha256Fast, k)\n }\n }\n\n /**\n * Updates the `SHA256HMAC` object with part of the message to be hashed.\n *\n * @method update\n * @param msg - Part of the message to hash. Can be a number array or a string.\n * @param enc - If 'hex', then the input is encoded as hexadecimal. If undefined or not 'hex', then no encoding is performed.\n * @returns Returns the instance of `SHA256HMAC` for chaining calls.\n *\n * @example\n * myHMAC.update('deadbeef', 'hex');\n */\n update(msg: HashInput, enc?: 'hex'): this {\n updateNativeOrFallback(this.#native, this.#h, toHashBytes(msg, enc))\n return this\n }\n\n /**\n * Finalizes the HMAC computation and returns the resultant hash.\n *\n * @method digest\n * @returns Returns the digest of the hashed data. Can be a number array or a string.\n *\n * @example\n * let hashedMessage = myHMAC.digest();\n */\n digest(): number[] {\n return digestNativeOrFallback(this.#native, this.#h)\n }\n\n /**\n * Finalizes the HMAC computation and returns the resultant hash as a hex string.\n *\n * @method digest\n * @returns Returns the digest of the hashed data as a hex string\n *\n * @example\n * let hashedMessage = myHMAC.digestHex();\n */\n digestHex(): string {\n return digestHexNativeOrFallback(this.#native, this.#h)\n }\n}\n\nexport class SHA1HMAC {\n inner: SHA1\n outer: SHA1\n blockSize = 64\n\n constructor(key: number[] | string) {\n key = toArray(key, 'hex')\n // Shorten key, if needed\n if (key.length > this.blockSize) {\n key = new SHA1().update(key).digest()\n }\n\n // Keys shorter than block size are padded with zeros on the right\n let i\n for (i = key.length; i < this.blockSize; i++) {\n key.push(0)\n }\n\n for (i = 0; i < key.length; i++) {\n key[i] ^= 0x36\n }\n this.inner = new SHA1().update(key)\n\n // 0x36 ^ 0x5c = 0x6a\n for (i = 0; i < key.length; i++) {\n key[i] ^= 0x6a\n }\n this.outer = new SHA1().update(key)\n }\n\n update(msg: number[] | string, enc?: 'hex'): this {\n this.inner.update(msg, enc)\n return this\n }\n\n digest(): number[] {\n this.outer.update(this.inner.digest())\n return this.outer.digest()\n }\n\n digestHex(): string {\n this.outer.update(this.inner.digest())\n return this.outer.digestHex()\n }\n}\n\n/**\n * The `SHA512HMAC` class is used to create Hash-based Message Authentication Code (HMAC) using the SHA-512 cryptographic hash function.\n *\n * HMAC is a specific type of MAC involving a cryptographic hash function and a secret cryptographic key. It may be used to simultaneously verify both the data integrity and the authenticity of a message.\n *\n * This class also uses the SHA-512 cryptographic hash algorithm that produces a 512-bit (64-byte) hash value.\n *\n * @property inner - Represents the inner hash of SHA-512.\n * @property outer - Represents the outer hash of SHA-512.\n * @property blockSize - The block size for the SHA-512 hash function, in bytes. It's set to 128 bytes.\n * @property outSize - The output size of the SHA-512 hash function, in bytes. It's set to 64 bytes.\n */\nexport class SHA512HMAC {\n readonly #h?: HMAC<FastSHA512>\n readonly #native?: any\n blockSize = 128\n outSize = 32\n\n /**\n * The constructor for the `SHA512HMAC` class.\n *\n * It initializes the `SHA512HMAC` object and sets up the inner and outer padded keys.\n * If the key size is larger than the blockSize, it is digested using SHA-512.\n * If the key size is less than the blockSize, it is padded with zeroes.\n *\n * @constructor\n * @param key - The key to use to create the HMAC. Can be a number array or a string in hexadecimal format.\n *\n * @example\n * const myHMAC = new SHA512HMAC('deadbeef');\n */\n constructor(key: HashInput) {\n const k = toHashKeyBytes(key)\n this.#native = createNodeHmac('sha512', k)\n if (this.#native == null) {\n this.#h = new HMAC(sha512Fast, k)\n }\n }\n\n /**\n * Updates the `SHA512HMAC` object with part of the message to be hashed.\n *\n * @method update\n * @param msg - Part of the message to hash. Can be a number array or a string.\n * @param enc - If 'hex', then the input is encoded as hexadecimal. If undefined or not 'hex', then no encoding is performed.\n * @returns Returns the instance of `SHA512HMAC` for chaining calls.\n *\n * @example\n * myHMAC.update('deadbeef', 'hex');\n */\n update(msg: HashInput, enc?: 'hex' | 'utf8'): this {\n updateNativeOrFallback(this.#native, this.#h, toHashBytes(msg, enc))\n return this\n }\n\n /**\n * Finalizes the HMAC computation and returns the resultant hash.\n *\n * @method digest\n * @returns Returns the digest of the hashed data as a number array.\n *\n * @example\n * let hashedMessage = myHMAC.digest();\n */\n digest(): number[] {\n return digestNativeOrFallback(this.#native, this.#h)\n }\n\n /**\n * Finalizes the HMAC computation and returns the resultant hash as a hex string.\n *\n * @method digest\n * @returns Returns the digest of the hashed data as a hex string\n *\n * @example\n * let hashedMessage = myHMAC.digestHex();\n */\n digestHex(): string {\n return digestHexNativeOrFallback(this.#native, this.#h)\n }\n}\n\nfunction sha256Bytes(msg: HashInput, enc?: 'hex' | 'utf8'): Uint8Array {\n const native = digestWithNodeHash('sha256', msg, enc)\n if (native != null) return native\n return new FastSHA256().update(toHashBytes(msg, enc)).digest()\n}\n\nfunction sha512Bytes(msg: HashInput, enc?: 'hex' | 'utf8'): Uint8Array {\n const native = digestWithNodeHash('sha512', msg, enc)\n if (native != null) return native\n return new FastSHA512().update(toHashBytes(msg, enc)).digest()\n}\n\nfunction ripemd160Bytes(msg: HashInput, enc?: 'hex' | 'utf8'): Uint8Array | undefined {\n return digestWithNodeHash('ripemd160', msg, enc)\n}\n\n/**\n * Computes RIPEMD160 hash of a given message.\n * @function ripemd160\n * @param msg - The message to compute the hash for.\n * @param enc - The encoding of msg if string. Default is 'utf8'.\n *\n * @returns the computed RIPEMD160 hash of the message.\n *\n * @example\n * const digest = ripemd160('Hello, world!');\n */\nexport const ripemd160 = (msg: number[] | string, enc?: 'hex' | 'utf8'): number[] => {\n const native = ripemd160Bytes(msg, enc)\n if (native != null) return Array.from(native)\n return new RIPEMD160().update(msg, enc).digest()\n}\n\n/**\n * Computes SHA1 hash of a given message.\n * @function sha1\n * @param msg - The message to compute the hash for.\n * @param enc - The encoding of msg if string. Default is 'utf8'.\n *\n * @returns the computed SHA1 hash of the message.\n *\n * @example\n * const digest = sha1('Hello, world!');\n */\nexport const sha1 = (msg: number[] | string, enc?: 'hex' | 'utf8'): number[] => {\n return new SHA1().update(msg, enc).digest()\n}\n\n/**\n * Computes SHA256 hash of a given message.\n * @function sha256\n * @param msg - The message to compute the hash for.\n * @param enc - The encoding of msg if string. Default is 'utf8'.\n *\n * @returns the computed SHA256 hash of the message.\n *\n * @example\n * const digest = sha256('Hello, world!');\n */\nexport const sha256 = (msg: HashInput, enc?: 'hex' | 'utf8'): number[] => {\n return Array.from(sha256Bytes(msg, enc))\n}\n\n/**\n * Computes SHA512 hash of a given message.\n * @function sha512\n * @param msg - The message to compute the hash for.\n * @param enc - The encoding of msg if string. Default is 'utf8'.\n *\n * @returns the computed SHA512 hash of the message.\n *\n * @example\n * const digest = sha512('Hello, world!');\n */\nexport const sha512 = (msg: HashInput, enc?: 'hex' | 'utf8'): number[] => {\n return Array.from(sha512Bytes(msg, enc))\n}\n\n/**\n * Performs a 'double hash' using SHA256. This means the data is hashed twice\n * with SHA256. First, the SHA256 hash of the message is computed, then the\n * SHA256 hash of the resulting hash is computed.\n * @function hash256\n * @param msg - The message to compute the hash for.\n * @param enc - The encoding of msg if string. Default is 'utf8'.\n *\n * @returns the double hashed SHA256 output.\n *\n * @example\n * const doubleHash = hash256('Hello, world!');\n */\nexport const hash256 = (msg: HashInput, enc?: 'hex' | 'utf8'): number[] => {\n return Array.from(sha256Bytes(sha256Bytes(msg, enc)))\n}\n\n/**\n * Computes SHA256 hash of a given message and then computes a RIPEMD160 hash of the result.\n *\n * @function hash160\n * @param msg - The message to compute the hash for.\n * @param enc - The encoding of msg if string. Default is 'utf8'.\n *\n * @returns the RIPEMD160 hash of the SHA256 hash of the input message.\n *\n * @example\n * const hash = hash160('Hello, world!');\n */\nexport const hash160 = (msg: HashInput, enc?: 'hex' | 'utf8'): number[] => {\n const first = sha256Bytes(msg, enc)\n const native = ripemd160Bytes(first)\n if (native != null) return Array.from(native)\n return new RIPEMD160().update(first).digest()\n}\n\n/**\n * Computes SHA256 HMAC of a given message with a given key.\n * @function sha256hmac\n * @param key - The key used to compute the HMAC\n * @param msg - The message to compute the hash for.\n * @param enc - The encoding of msg if string. Default is 'utf8'.\n *\n * @returns the computed HMAC of the message.\n *\n * @example\n * const digest = sha256hmac('deadbeef', 'ffff001d');\n */\nexport const sha256hmac = (key: HashInput, msg: HashInput, enc?: 'hex'): number[] => {\n const native = digestWithNodeHmac('sha256', key, msg, enc)\n if (native != null) return Array.from(native)\n return new SHA256HMAC(key).update(msg, enc).digest()\n}\n\n/**\n * Computes SHA512 HMAC of a given message with a given key.\n * @function sha512hmac\n * @param key - The key used to compute the HMAC\n * @param msg - The message to compute the hash for.\n * @param enc - The encoding of msg if string. Default is 'utf8'.\n *\n * @returns the computed HMAC of the message.\n *\n * @example\n * const digest = sha512hmac('deadbeef', 'ffff001d');\n */\nexport const sha512hmac = (key: HashInput, msg: HashInput, enc?: 'hex'): number[] => {\n const native = digestWithNodeHmac('sha512', key, msg, enc)\n if (native != null) return Array.from(native)\n return new SHA512HMAC(key).update(msg, enc).digest()\n}\n\n// BEGIN fast-pbkdf2 helpers\n// Utils\nfunction isBytes(a: unknown): a is Uint8Array {\n return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array')\n}\nfunction anumber(n: number): void {\n if (!Number.isSafeInteger(n) || n < 0) {\n throw new Error(`positive integer expected, got ${n}`)\n }\n}\nfunction abytes(b: Uint8Array | undefined, ...lengths: number[]): void {\n if (!isBytes(b)) throw new Error('Uint8Array expected')\n if (lengths.length > 0 && !lengths.includes(b.length)) {\n const lens = lengths.join(',')\n throw new Error(`Uint8Array expected of length ${lens}, got length=${b.length}`)\n }\n}\nfunction ahash(h: IHash): void {\n if (typeof h !== 'function' || typeof h.create !== 'function') {\n throw new TypeError('Hash should be wrapped by utils.createHasher')\n }\n anumber(h.outputLen)\n anumber(h.blockLen)\n}\nfunction aexists(instance: any, checkFinished = true): void {\n if (instance.destroyed === true) throw new Error('Hash instance has been destroyed')\n if (checkFinished && instance.finished === true) {\n throw new Error('Hash#digest() has already been called')\n }\n}\nfunction aoutput(out: any, instance: any): void {\n abytes(out)\n const min: number = instance.outputLen as number\n if (out.length < min) {\n throw new Error(`digestInto() expects output buffer of length at least ${min}`)\n }\n}\ntype TypedArray =\n Int8Array | Uint8ClampedArray | Uint8Array | Uint16Array | Int16Array | Uint32Array | Int32Array\n\nfunction clean(...arrays: TypedArray[]): void {\n for (const arr of arrays) arr.fill(0)\n}\nfunction createView(arr: TypedArray): DataView {\n return new DataView(arr.buffer, arr.byteOffset, arr.byteLength)\n}\nfunction toBytes(data: Input): Uint8Array {\n if (typeof data === 'string') data = utf8ToBytes(data)\n abytes(data)\n return data\n}\nfunction utf8ToBytes(str: string): Uint8Array {\n if (typeof str !== 'string') throw new Error('string expected')\n return utf8Bytes(str)\n}\ntype Input = string | Uint8Array\nconst kdfInputToBytes = toBytes\ninterface IHash {\n (data: Uint8Array): Uint8Array\n blockLen: number\n outputLen: number\n create: any\n}\n\ninterface Hasher<T extends Hash<T>> {\n (msg: Input): Uint8Array\n blockLen: number\n outputLen: number\n create: () => Hash<T>\n}\nabstract class Hash<T extends Hash<T>> {\n abstract blockLen: number\n abstract outputLen: number\n abstract update(buf: Input): this\n abstract digestInto(buf: Uint8Array): void\n abstract digest(): Uint8Array\n abstract destroy(): void\n abstract _cloneInto(to?: T): T\n abstract clone(): T\n}\nfunction createHasher<T extends Hash<T>>(hashCons: () => Hash<T>): Hasher<T> {\n const hashC = (msg: Input): Uint8Array => hashCons().update(toBytes(msg)).digest()\n const tmp = hashCons()\n hashC.outputLen = tmp.outputLen\n hashC.blockLen = tmp.blockLen\n hashC.create = () => hashCons()\n return hashC\n}\n\n// u64 helpers\nconst U32_MASK64 = BigInt(2 ** 32 - 1)\nconst _32n = BigInt(32)\nfunction fromBig(n: bigint, le = false): { h: number; l: number } {\n if (le) return { h: Number(n & U32_MASK64), l: Number((n >> _32n) & U32_MASK64) }\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n return { h: Number((n >> _32n) & U32_MASK64) | 0, l: Number(n & U32_MASK64) | 0 }\n}\nfunction split(lst: bigint[], le = false): Uint32Array[] {\n const len = lst.length\n const Ah = new Uint32Array(len)\n const Al = new Uint32Array(len)\n for (let i = 0; i < len; i++) {\n const { h, l } = fromBig(lst[i], le)\n Ah[i] = h\n Al[i] = l\n }\n return [Ah, Al]\n}\nconst shrSH = (h: number, _l: number, s: number): number => h >>> s\nconst shrSL = (h: number, l: number, s: number): number => (h << (32 - s)) | (l >>> s)\nconst rotrSH = (h: number, l: number, s: number): number => (h >>> s) | (l << (32 - s))\nconst rotrSL = (h: number, l: number, s: number): number => (h << (32 - s)) | (l >>> s)\nconst rotrBH = (h: number, l: number, s: number): number => (h << (64 - s)) | (l >>> (s - 32))\nconst rotrBL = (h: number, l: number, s: number): number => (h >>> (s - 32)) | (l << (64 - s))\nfunction add(Ah: number, Al: number, Bh: number, Bl: number): { h: number; l: number } {\n const l = (Al >>> 0) + (Bl >>> 0)\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n return { h: (Ah + Bh + ((l / 2 ** 32) | 0)) | 0, l: l | 0 }\n}\nconst add3L = (Al: number, Bl: number, Cl: number): number => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0)\nconst add3H = (low: number, Ah: number, Bh: number, Ch: number): number =>\n Math.trunc(Ah + Bh + Ch + Math.trunc(low / 2 ** 32))\nconst add4L = (Al: number, Bl: number, Cl: number, Dl: number): number =>\n (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0)\nconst add4H = (low: number, Ah: number, Bh: number, Ch: number, Dh: number): number =>\n Math.trunc(Ah + Bh + Ch + Dh + Math.trunc(low / 2 ** 32))\nconst add5L = (Al: number, Bl: number, Cl: number, Dl: number, El: number): number =>\n (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0) + (El >>> 0)\n// eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\nconst add5H = (low: number, Ah: number, Bh: number, Ch: number, Dh: number, Eh: number): number =>\n (Ah + Bh + Ch + Dh + Eh + ((low / 2 ** 32) | 0)) | 0\n\n// _md helpers\nabstract class HashMD<T extends HashMD<T>> extends Hash<T> {\n readonly blockLen: number\n readonly outputLen: number\n readonly padOffset: number\n readonly isLE: boolean\n protected buffer: Uint8Array\n protected view: DataView\n protected finished = false\n protected length = 0\n protected pos = 0\n protected destroyed = false\n constructor(blockLen: number, outputLen: number, padOffset: number, isLE: boolean) {\n super()\n this.blockLen = blockLen\n this.outputLen = outputLen\n this.padOffset = padOffset\n this.isLE = isLE\n this.buffer = new Uint8Array(blockLen)\n this.view = createView(this.buffer)\n }\n\n protected abstract process(buf: DataView, offset: number): void\n protected abstract get(): number[]\n protected abstract set(...args: number[]): void\n abstract destroy(): void\n protected abstract roundClean(): void\n update(data: Input): this {\n aexists(this)\n data = toBytes(data)\n abytes(data)\n const { view, buffer, blockLen } = this\n const len = data.length\n for (let pos = 0; pos < len;) {\n const take = Math.min(blockLen - this.pos, len - pos)\n if (take === blockLen) {\n const dataView = createView(data)\n for (; blockLen <= len - pos; pos += blockLen) this.process(dataView, pos)\n continue\n }\n buffer.set(data.subarray(pos, pos + take), this.pos)\n this.pos += take\n pos += take\n if (this.pos === blockLen) {\n this.process(view, 0)\n this.pos = 0\n }\n }\n this.length += data.length\n this.roundClean()\n return this\n }\n\n digestInto(out: Uint8Array): void {\n aexists(this)\n aoutput(out, this)\n this.finished = true\n const { buffer, view, blockLen, isLE } = this\n let { pos } = this\n buffer[pos++] = 0b10000000\n clean(this.buffer.subarray(pos))\n if (this.padOffset > blockLen - pos) {\n this.process(view, 0)\n pos = 0\n }\n for (let i = pos; i < blockLen; i++) buffer[i] = 0\n setBigUint64(view, blockLen - 8, BigInt(this.length * 8), isLE)\n this.process(view, 0)\n const oview = createView(out)\n const len = this.outputLen\n if (len % 4 !== 0) throw new Error('_sha2: outputLen should be aligned to 32bit')\n const outLen = len / 4\n const state = this.get()\n if (outLen > state.length) throw new Error('_sha2: outputLen bigger than state')\n for (let i = 0; i < outLen; i++) oview.setUint32(4 * i, state[i], isLE)\n }\n\n digest(): Uint8Array {\n const { buffer, outputLen } = this\n this.digestInto(buffer)\n const res = buffer.slice(0, outputLen)\n this.destroy()\n return res\n }\n\n _cloneInto(to?: T): T {\n to ??= new (this.constructor as any)() as T\n to.set(...this.get())\n const { blockLen, buffer, length, finished, destroyed, pos } = this\n to.destroyed = destroyed\n to.finished = finished\n to.length = length\n to.pos = pos\n if (length % blockLen !== 0) to.buffer.set(buffer)\n return to\n }\n\n clone(): T {\n return this._cloneInto()\n }\n}\nfunction setBigUint64(view: DataView, byteOffset: number, value: bigint, isLE: boolean): void {\n if (typeof view.setBigUint64 === 'function') return view.setBigUint64(byteOffset, value, isLE)\n const _32n = BigInt(32)\n const _u32_max = BigInt(0xffffffff)\n const wh = Number((value >> _32n) & _u32_max)\n const wl = Number(value & _u32_max)\n const h = isLE ? 4 : 0\n const l = isLE ? 0 : 4\n view.setUint32(byteOffset + h, wh, isLE)\n view.setUint32(byteOffset + l, wl, isLE)\n}\n\n// sha256 fast constants\nconst SHA256_IV = Uint32Array.from([\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19\n])\nconst K256 = Uint32Array.from([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\n])\nconst SHA256_W = new Uint32Array(64)\n\nclass FastSHA256 extends HashMD<FastSHA256> {\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n protected A = SHA256_IV[0] | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n protected B = SHA256_IV[1] | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n protected C = SHA256_IV[2] | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n protected D = SHA256_IV[3] | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n protected E = SHA256_IV[4] | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n protected F = SHA256_IV[5] | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n protected G = SHA256_IV[6] | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n protected H = SHA256_IV[7] | 0\n constructor(outputLen = 32) {\n super(64, outputLen, 8, false)\n }\n\n protected get(): number[] {\n const { A, B, C, D, E, F, G, H } = this\n return [A, B, C, D, E, F, G, H]\n }\n\n protected set(\n ...[A, B, C, D, E, F, G, H]: [\n A: number,\n B: number,\n C: number,\n D: number,\n E: number,\n F: number,\n G: number,\n H: number\n ]\n ): void {\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n this.A = A | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n this.B = B | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n this.C = C | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n this.D = D | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n this.E = E | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n this.F = F | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n this.G = G | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n this.H = H | 0\n }\n\n protected process(view: DataView, offset: number): void {\n for (let i = 0; i < 16; i++, offset += 4) {\n SHA256_W[i] = view.getUint32(offset)\n }\n for (let i = 16; i < 64; i++) {\n const w15 = SHA256_W[i - 15]\n const w2 = SHA256_W[i - 2]\n const s0 = G0_256(w15)\n const s1 = G1_256(w2)\n SHA256_W[i] = sum32(sum32(s0, SHA256_W[i - 7]), sum32(s1, SHA256_W[i - 16]))\n }\n\n let { A, B, C, D, E, F, G, H } = this\n for (let i = 0; i < 64; i++) {\n const T1 = SUM32_5(H, S1_256(E), ch32(E, F, G), K256[i], SHA256_W[i])\n const T2 = sum32(S0_256(A), maj32(A, B, C))\n H = G\n G = F\n F = E\n E = sum32(D, T1)\n D = C\n C = B\n B = A\n A = sum32(T1, T2)\n }\n this.A = sum32(this.A, A)\n this.B = sum32(this.B, B)\n this.C = sum32(this.C, C)\n this.D = sum32(this.D, D)\n this.E = sum32(this.E, E)\n this.F = sum32(this.F, F)\n this.G = sum32(this.G, G)\n this.H = sum32(this.H, H)\n }\n\n protected roundClean(): void {\n clean(SHA256_W)\n }\n\n destroy(): void {\n clean(this.buffer)\n this.set(0, 0, 0, 0, 0, 0, 0, 0)\n }\n}\nconst sha256Fast = createHasher(() => new FastSHA256())\n\n// sha512\nconst SHA512_IV = Uint32Array.from([\n 0x6a09e667, 0xf3bcc908, 0xbb67ae85, 0x84caa73b, 0x3c6ef372, 0xfe94f82b, 0xa54ff53a, 0x5f1d36f1,\n 0x510e527f, 0xade682d1, 0x9b05688c, 0x2b3e6c1f, 0x1f83d9ab, 0xfb41bd6b, 0x5be0cd19, 0x137e2179\n])\nconst K512 = (() =>\n split(\n [\n '0x428a2f98d728ae22',\n '0x7137449123ef65cd',\n '0xb5c0fbcfec4d3b2f',\n '0xe9b5dba58189dbbc',\n '0x3956c25bf348b538',\n '0x59f111f1b605d019',\n '0x923f82a4af194f9b',\n '0xab1c5ed5da6d8118',\n '0xd807aa98a3030242',\n '0x12835b0145706fbe',\n '0x243185be4ee4b28c',\n '0x550c7dc3d5ffb4e2',\n '0x72be5d74f27b896f',\n '0x80deb1fe3b1696b1',\n '0x9bdc06a725c71235',\n '0xc19bf174cf692694',\n '0xe49b69c19ef14ad2',\n '0xefbe4786384f25e3',\n '0x0fc19dc68b8cd5b5',\n '0x240ca1cc77ac9c65',\n '0x2de92c6f592b0275',\n '0x4a7484aa6ea6e483',\n '0x5cb0a9dcbd41fbd4',\n '0x76f988da831153b5',\n '0x983e5152ee66dfab',\n '0xa831c66d2db43210',\n '0xb00327c898fb213f',\n '0xbf597fc7beef0ee4',\n '0xc6e00bf33da88fc2',\n '0xd5a79147930aa725',\n '0x06ca6351e003826f',\n '0x142929670a0e6e70',\n '0x27b70a8546d22ffc',\n '0x2e1b21385c26c926',\n '0x4d2c6dfc5ac42aed',\n '0x53380d139d95b3df',\n '0x650a73548baf63de',\n '0x766a0abb3c77b2a8',\n '0x81c2c92e47edaee6',\n '0x92722c851482353b',\n '0xa2bfe8a14cf10364',\n '0xa81a664bbc423001',\n '0xc24b8b70d0f89791',\n '0xc76c51a30654be30',\n '0xd192e819d6ef5218',\n '0xd69906245565a910',\n '0xf40e35855771202a',\n '0x106aa07032bbd1b8',\n '0x19a4c116b8d2d0c8',\n '0x1e376c085141ab53',\n '0x2748774cdf8eeb99',\n '0x34b0bcb5e19b48a8',\n '0x391c0cb3c5c95a63',\n '0x4ed8aa4ae3418acb',\n '0x5b9cca4f7763e373',\n '0x682e6ff3d6b2b8a3',\n '0x748f82ee5defb2fc',\n '0x78a5636f43172f60',\n '0x84c87814a1f0ab72',\n '0x8cc702081a6439ec',\n '0x90befffa23631e28',\n '0xa4506cebde82bde9',\n '0xbef9a3f7b2c67915',\n '0xc67178f2e372532b',\n '0xca273eceea26619c',\n '0xd186b8c721c0c207',\n '0xeada7dd6cde0eb1e',\n '0xf57d4f7fee6ed178',\n '0x06f067aa72176fba',\n '0x0a637dc5a2c898a6',\n '0x113f9804bef90dae',\n '0x1b710b35131c471b',\n '0x28db77f523047d84',\n '0x32caab7b40c72493',\n '0x3c9ebe0a15c9bebc',\n '0x431d67c49c100d4c',\n '0x4cc5d4becb3e42b6',\n '0x597f299cfc657e2a',\n '0x5fcb6fab3ad6faec',\n '0x6c44198c4a475817'\n ].map(BigInt)\n ))()\nconst SHA512_Kh = (() => K512[0])()\nconst SHA512_Kl = (() => K512[1])()\nconst SHA512_W_H = new Uint32Array(80)\nconst SHA512_W_L = new Uint32Array(80)\n\nclass FastSHA512 extends HashMD<FastSHA512> {\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n protected Ah = SHA512_IV[0] | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n protected Al = SHA512_IV[1] | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n protected Bh = SHA512_IV[2] | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n protected Bl = SHA512_IV[3] | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n protected Ch = SHA512_IV[4] | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n protected Cl = SHA512_IV[5] | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n protected Dh = SHA512_IV[6] | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n protected Dl = SHA512_IV[7] | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n protected Eh = SHA512_IV[8] | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n protected El = SHA512_IV[9] | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n protected Fh = SHA512_IV[10] | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n protected Fl = SHA512_IV[11] | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n protected Gh = SHA512_IV[12] | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n protected Gl = SHA512_IV[13] | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n protected Hh = SHA512_IV[14] | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n protected Hl = SHA512_IV[15] | 0\n constructor(outputLen = 64) {\n super(128, outputLen, 16, false)\n }\n\n protected get(): number[] {\n const { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this\n return [Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl]\n }\n\n protected set(\n ...[Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl]: [\n Ah: number,\n Al: number,\n Bh: number,\n Bl: number,\n Ch: number,\n Cl: number,\n Dh: number,\n Dl: number,\n Eh: number,\n El: number,\n Fh: number,\n Fl: number,\n Gh: number,\n Gl: number,\n Hh: number,\n Hl: number\n ]\n ): void {\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n this.Ah = Ah | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n this.Al = Al | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n this.Bh = Bh | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n this.Bl = Bl | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n this.Ch = Ch | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n this.Cl = Cl | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n this.Dh = Dh | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n this.Dl = Dl | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n this.Eh = Eh | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n this.El = El | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n this.Fh = Fh | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n this.Fl = Fl | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n this.Gh = Gh | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n this.Gl = Gl | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n this.Hh = Hh | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n this.Hl = Hl | 0\n }\n\n protected process(view: DataView, offset: number): void {\n for (let i = 0; i < 16; i++, offset += 8) {\n SHA512_W_H[i] = view.getUint32(offset)\n SHA512_W_L[i] = view.getUint32(offset + 4)\n }\n for (let i = 16; i < 80; i++) {\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n const W15h = SHA512_W_H[i - 15] | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n const W15l = SHA512_W_L[i - 15] | 0\n const s0h = rotrSH(W15h, W15l, 1) ^ rotrSH(W15h, W15l, 8) ^ shrSH(W15h, W15l, 7)\n const s0l = rotrSL(W15h, W15l, 1) ^ rotrSL(W15h, W15l, 8) ^ shrSL(W15h, W15l, 7)\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n const W2h = SHA512_W_H[i - 2] | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n const W2l = SHA512_W_L[i - 2] | 0\n const s1h = rotrSH(W2h, W2l, 19) ^ rotrBH(W2h, W2l, 61) ^ shrSH(W2h, W2l, 6)\n const s1l = rotrSL(W2h, W2l, 19) ^ rotrBL(W2h, W2l, 61) ^ shrSL(W2h, W2l, 6)\n const SUMl = add4L(s0l, s1l, SHA512_W_L[i - 7], SHA512_W_L[i - 16])\n const SUMh = add4H(SUMl, s0h, s1h, SHA512_W_H[i - 7], SHA512_W_H[i - 16])\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n SHA512_W_H[i] = SUMh | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n SHA512_W_L[i] = SUMl | 0\n }\n let { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this\n for (let i = 0; i < 80; i++) {\n const sigma1h = rotrSH(Eh, El, 14) ^ rotrSH(Eh, El, 18) ^ rotrBH(Eh, El, 41)\n const sigma1l = rotrSL(Eh, El, 14) ^ rotrSL(Eh, El, 18) ^ rotrBL(Eh, El, 41)\n const CHIh = (Eh & Fh) ^ (~Eh & Gh)\n const CHIl = (El & Fl) ^ (~El & Gl)\n const T1ll = add5L(Hl, sigma1l, CHIl, SHA512_Kl[i], SHA512_W_L[i])\n const T1h = add5H(T1ll, Hh, sigma1h, CHIh, SHA512_Kh[i], SHA512_W_H[i])\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n const T1l = T1ll | 0\n const sigma0h = rotrSH(Ah, Al, 28) ^ rotrBH(Ah, Al, 34) ^ rotrBH(Ah, Al, 39)\n const sigma0l = rotrSL(Ah, Al, 28) ^ rotrBL(Ah, Al, 34) ^ rotrBL(Ah, Al, 39)\n const MAJh = (Ah & Bh) ^ (Ah & Ch) ^ (Bh & Ch)\n const MAJl = (Al & Bl) ^ (Al & Cl) ^ (Bl & Cl)\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n Hh = Gh | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n Hl = Gl | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n Gh = Fh | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n Gl = Fl | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n Fh = Eh | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n Fl = El | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n ;({ h: Eh, l: El } = add(Dh | 0, Dl | 0, T1h | 0, T1l | 0))\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n Dh = Ch | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n Dl = Cl | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n Ch = Bh | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n Cl = Bl | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n Bh = Ah | 0\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n Bl = Al | 0\n const T2l = add3L(sigma0l, MAJl, T1l)\n Ah = add3H(T2l, sigma0h, MAJh, T1h)\n // eslint-disable-next-line no-bitwise -- ToInt32 (ECMA-262); not truncation. Required for SHA arithmetic.\n Al = T2l | 0\n }\n ;({ h: Ah, l: Al } = add(Ah, Al, this.Ah, this.Al))\n ;({ h: Bh, l: Bl } = add(Bh, Bl, this.Bh, this.Bl))\n ;({ h: Ch, l: Cl } = add(Ch, Cl, this.Ch, this.Cl))\n ;({ h: Dh, l: Dl } = add(Dh, Dl, this.Dh, this.Dl))\n ;({ h: Eh, l: El } = add(Eh, El, this.Eh, this.El))\n ;({ h: Fh, l: Fl } = add(Fh, Fl, this.Fh, this.Fl))\n ;({ h: Gh, l: Gl } = add(Gh, Gl, this.Gh, this.Gl))\n ;({ h: Hh, l: Hl } = add(Hh, Hl, this.Hh, this.Hl))\n this.set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl)\n }\n\n protected roundClean(): void {\n clean(SHA512_W_H, SHA512_W_L)\n }\n\n destroy(): void {\n clean(this.buffer)\n this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\n }\n}\nconst sha512Fast = createHasher(() => new FastSHA512())\n\nclass HMAC<T extends Hash<T>> extends Hash<HMAC<T>> {\n oHash: T\n iHash: T\n blockLen: number\n outputLen: number\n private finished = false\n private destroyed = false\n constructor(\n hash: (msg: Input) => Uint8Array & { create: () => T; blockLen: number; outputLen: number },\n _key: Input\n ) {\n super()\n ahash(hash)\n const key = toBytes(_key)\n this.iHash = hash.create() as T\n if (typeof (this.iHash as any).update !== 'function') {\n throw new TypeError('Expected instance of class which extends utils.Hash')\n }\n this.blockLen = this.iHash.blockLen\n this.outputLen = this.iHash.outputLen\n const blockLen = this.blockLen\n const pad = new Uint8Array(blockLen)\n pad.set(key.length > blockLen ? hash.create().update(key).digest() : key)\n for (let i = 0; i < pad.length; i++) pad[i] ^= 0x36\n this.iHash.update(pad)\n this.oHash = hash.create() as T\n for (let i = 0; i < pad.length; i++) pad[i] ^= 0x36 ^ 0x5c\n this.oHash.update(pad)\n clean(pad)\n }\n\n update(buf: Input): this {\n aexists(this)\n this.iHash.update(buf)\n return this\n }\n\n digestInto(out: Uint8Array): void {\n aexists(this)\n abytes(out, this.outputLen)\n this.finished = true\n this.iHash.digestInto(out)\n this.oHash.update(out)\n this.oHash.digestInto(out)\n this.destroy()\n }\n\n digest(): Uint8Array {\n const out = new Uint8Array(this.oHash.outputLen)\n this.digestInto(out)\n return out\n }\n\n _cloneInto(to?: HMAC<T>): HMAC<T> {\n to ??= Object.create(Object.getPrototypeOf(this), {})\n const { oHash, iHash, finished, destroyed, blockLen, outputLen } = this\n to = to as this\n to.finished = finished\n to.destroyed = destroyed\n to.blockLen = blockLen\n to.outputLen = outputLen\n to.oHash = oHash._cloneInto(to.oHash ?? undefined)\n to.iHash = iHash._cloneInto(to.iHash ?? undefined)\n return to\n }\n\n clone(): HMAC<T> {\n return this._cloneInto()\n }\n\n destroy(): void {\n this.destroyed = true\n this.oHash.destroy()\n this.iHash.destroy()\n }\n}\n\nfunction pbkdf2Core(\n hash: (\n msg: Input\n ) => Uint8Array & { create: () => FastSHA512; blockLen: number; outputLen: number },\n password: Input,\n salt: Input,\n opts: { c: number; dkLen?: number }\n): Uint8Array {\n ahash(hash)\n const { c, dkLen = 32 } = { ...opts }\n anumber(c)\n anumber(dkLen)\n if (c < 1) throw new Error('iterations (c) should be >= 1')\n const pwd = kdfInputToBytes(password)\n const slt = kdfInputToBytes(salt)\n const DK = new Uint8Array(dkLen)\n const PRF = hmac.create(hash, pwd)\n const PRFSalt = PRF._cloneInto().update(slt)\n let prfW: any\n const arr = new Uint8Array(4)\n const view = createView(arr)\n const u = new Uint8Array(PRF.outputLen)\n for (let ti = 1, pos = 0; pos < dkLen; ti++, pos += PRF.outputLen) {\n const Ti = DK.subarray(pos, pos + PRF.outputLen)\n view.setInt32(0, ti, false)\n prfW = PRFSalt._cloneInto(prfW)\n prfW.update(arr).digestInto(u)\n Ti.set(u.subarray(0, Ti.length))\n for (let ui = 1; ui < c; ui++) {\n PRF._cloneInto(prfW).update(u).digestInto(u)\n for (let i = 0; i < Ti.length; i++) Ti[i] ^= u[i]\n }\n }\n PRF.destroy()\n PRFSalt.destroy()\n if (prfW != null) prfW.destroy()\n clean(u)\n return DK\n}\n\nconst hmac = (hash: any, key: Input, message: Input): Uint8Array =>\n new HMAC<any>(hash, key).update(message).digest()\nhmac.create = (hash: any, key: Input) => new HMAC<any>(hash, key)\n\nfunction pbkdf2Fast(\n password: Uint8Array,\n salt: Uint8Array,\n iterations: number,\n keylen: number\n): Uint8Array {\n return pbkdf2Core(sha512Fast, password, salt, { c: iterations, dkLen: keylen })\n}\n// END fast-pbkdf2 helpers\n\n/**\n * Limited SHA-512-only PBKDF2 function for use in deprecated BIP39 code.\n * @function pbkdf2\n * @param password - The PBKDF2 password\n * @param salt - The PBKDF2 salt\n * @param iterations - The number of of iterations to run\n * @param keylen - The length of the key\n * @param digest - The digest (must be sha512 for this implementation)\n *\n * @returns The computed key\n */\nexport function pbkdf2(\n password: number[],\n salt: number[],\n iterations: number,\n keylen: number,\n digest = 'sha512'\n): number[] {\n if (digest !== 'sha512') {\n throw new Error('Only sha512 is supported in this PBKDF2 implementation')\n }\n const pbkdf2Sync = NODE_CRYPTO?.pbkdf2Sync\n if (typeof pbkdf2Sync === 'function') {\n const out = pbkdf2Sync(toHashBytes(password), toHashBytes(salt), iterations, keylen, digest)\n return Array.from(out)\n }\n const p = Uint8Array.from(password)\n const s = Uint8Array.from(salt)\n const out = pbkdf2Fast(p, s, iterations, keylen)\n return Array.from(out)\n}\n\n/**\n * Unconditionally swaps the byte order of a 32-bit unsigned integer.\n *\n * This function performs a strict 32-bit byte swap regardless of host\n * endianness. It is equivalent to the behavior commonly referred to as\n * `bswap32` in low-level libraries.\n *\n * This function is introduced as part of TOB-20 to provide a clearly-named\n * alternative to `htonl()`, which was previously implemented as an\n * unconditional byte swap and did not match the semantics of the traditional\n * C `htonl()` function.\n *\n * @param w - A 32-bit unsigned integer.\n * @returns The value with its byte order reversed.\n *\n * @example\n * swapBytes32(0x11223344) // → 0x44332211\n */\nexport function swapBytes32(w: number): number {\n const res = (w >>> 24) | ((w >>> 8) & 0xff00) | ((w << 8) & 0xff0000) | ((w & 0xff) << 24)\n return res >>> 0\n}\n\n// Detect the host machine's endianness at runtime.\n//\n// This is used by `realHtonl()` to determine whether the value must be\n// byte-swapped or returned unchanged. JavaScript engines on common platforms\n// are almost always little-endian, but this check is included for correctness.\nconst isLittleEndian = (() => {\n const b = new ArrayBuffer(4)\n const a = new Uint32Array(b)\n const c = new Uint8Array(b)\n a[0] = 0x01020304\n return c[0] === 0x04\n})()\n\n/**\n * Converts a 32-bit unsigned integer from host byte order to network byte order.\n *\n * Unlike the legacy `htonl()` implementation (which always swapped bytes),\n * this function behaves like the traditional C `htonl()`:\n *\n * - On **little-endian** machines → performs a byte swap.\n * - On **big-endian** machines → returns the value unchanged.\n *\n * This function is provided to resolve TOB-20, which identified that the\n * previous `htonl()` implementation had a misleading name and did not match\n * platform-dependent semantics.\n *\n * @param w - A 32-bit unsigned integer.\n * @returns The value converted to network byte order.\n *\n * @example\n * realHtonl(0x11223344) // → 0x44332211 on little-endian systems\n */\nexport function realHtonl(w: number): number {\n return isLittleEndian ? swapBytes32(w) : w >>> 0\n}\n","// Modified minimalistic-crypto-utils lineage; see ../../THIRD_PARTY_NOTICES.md.\nimport BigNumber from './BigNumber.js'\nimport { utf8Bytes } from './UTF8.js'\nimport { hash256 } from './Hash.js'\nimport { assertValidHex } from './hex.js'\nimport strictCompactSize from './readVarIntNumStrict.js'\n\nexport { WriterUint8Array } from './WriterUint8Array.js'\nexport { ReaderUint8Array } from './ReaderUint8Array.js'\n\nconst BufferCtor = (globalThis as any).Buffer\nconst CAN_USE_BUFFER = BufferCtor != null && typeof BufferCtor.from === 'function'\n\n/**\n * Convert an unknown value to a diagnostic string without silently reducing\n * objects to the unhelpful default \"[object Object]\" representation.\n */\nexport const toSafeString = (value: unknown, fallback = 'Unknown value'): string => {\n if (value === null) return 'null'\n if (value === undefined) return 'undefined'\n if (typeof value === 'string') return value\n if (typeof value === 'number' || typeof value === 'bigint') return value.toString()\n if (typeof value === 'boolean') return value ? 'true' : 'false'\n if (typeof value === 'symbol') return value.description ?? value.toString()\n if (value instanceof Error && value.message.length > 0) return value.message\n\n const message = (value as { message?: unknown }).message\n if (typeof message === 'string' && message.length > 0) return message\n\n try {\n return JSON.stringify(value) ?? fallback\n } catch {\n return fallback\n }\n}\n\n/**\n * Prepends a '0' to an odd character length word to ensure it has an even number of characters.\n * @param {string} word - The input word.\n * @returns {string} - The word with a leading '0' if it's an odd character length; otherwise, the original word.\n */\nexport const zero2 = (word: string): string => {\n if (word.length % 2 === 1) {\n return '0' + word\n } else {\n return word\n }\n}\n\n/**\n * Converts an array of numbers to a hexadecimal string representation.\n * @param {number[]} msg - The input array of numbers.\n * @returns {string} - The hexadecimal string representation of the input array.\n */\nconst HEX_DIGITS = '0123456789abcdef'\nconst HEX_BYTE_STRINGS: string[] = Array.from({ length: 256 }, () => '')\nfor (let i = 0; i < 256; i++) {\n HEX_BYTE_STRINGS[i] = HEX_DIGITS[(i >> 4) & 0xf] + HEX_DIGITS[i & 0xf]\n}\n\nexport const toHex = (msg: number[] | Uint8Array): string => {\n if (CAN_USE_BUFFER) {\n return BufferCtor.from(msg).toString('hex')\n }\n if (msg.length === 0) return ''\n return Array.from(msg, byte => HEX_BYTE_STRINGS[byte & 0xff]).join('')\n}\n\n/**\n * Converts various message formats into a Uint8Array.\n * Supports Uint8Array, arrays of bytes, hexadecimal strings, base64 strings, and UTF-8 strings.\n *\n * @param {any} msg - The input message (Uint8Array, number[], Array or string).\n * @param {('hex' | 'utf8' | 'base64')} enc - Specifies the string encoding, if applicable.\n * @returns {Uint8Array}\n */\nexport const toUint8Array = (msg: any, enc?: 'hex' | 'utf8' | 'base64'): Uint8Array => {\n if (msg instanceof Uint8Array) return msg\n if (typeof msg === 'string' && enc === 'hex') return hexToUint8Array(msg)\n return new Uint8Array(toArray(msg, enc))\n}\n\n/**\n * Converts various message formats into an array of numbers.\n * Supports arrays, hexadecimal strings, base64 strings, and UTF-8 strings.\n *\n * @param {any} msg - The input message (Uint8Array, number[], Array or string).\n * @param {('hex' | 'utf8' | 'base64')} enc - Specifies the string encoding, if applicable.\n * @returns {any[]} - Array representation of the input.\n */\nexport const toArray = (msg: any, enc?: 'hex' | 'utf8' | 'base64'): any[] => {\n if (Array.isArray(msg)) return msg.slice()\n if (msg === undefined) return []\n\n if (typeof msg !== 'string') {\n return Array.from(msg, (item: any) => Math.trunc(item))\n }\n\n switch (enc) {\n case 'hex':\n return hexToArray(msg)\n case 'base64':\n return base64ToArray(msg)\n default:\n return utf8ToArray(msg)\n }\n}\n\nconst HEX_CHAR_TO_VALUE = new Int8Array(256).fill(-1)\nfor (let i = 0; i < 10; i++) {\n HEX_CHAR_TO_VALUE[48 + i] = i // '0'-'9'\n}\nfor (let i = 0; i < 6; i++) {\n HEX_CHAR_TO_VALUE[65 + i] = 10 + i // 'A'-'F'\n HEX_CHAR_TO_VALUE[97 + i] = 10 + i // 'a'-'f'\n}\n\nconst hexToArray = (msg: string): number[] => {\n return Array.from(hexToUint8Array(msg))\n}\n\n/**\n * Decodes hex directly into compact byte storage without an intermediate\n * boxed number array. Odd-length inputs retain the legacy leading-zero rule.\n */\nexport const hexToUint8Array = (msg: string): Uint8Array => {\n assertValidHex(msg)\n const normalized = msg.length % 2 === 0 ? msg : '0' + msg\n if (CAN_USE_BUFFER) {\n const decoded = BufferCtor.from(normalized, 'hex')\n return new Uint8Array(decoded.buffer, decoded.byteOffset, decoded.byteLength)\n }\n const out = new Uint8Array(normalized.length / 2)\n let o = 0\n for (let i = 0; i < normalized.length; i += 2) {\n const hi = HEX_CHAR_TO_VALUE[normalized.codePointAt(i) as number]\n const lo = HEX_CHAR_TO_VALUE[normalized.codePointAt(i + 1) as number]\n out[o++] = (hi << 4) | lo\n }\n return out\n}\n\nconst normalizeBase64 = (msg: string): string => {\n if (typeof msg !== 'string') throw new TypeError('msg must be a string')\n const normalized = msg\n .trim()\n .replaceAll(/[\\r\\n\\t\\f\\v ]+/g, '')\n .replaceAll('-', '+')\n .replaceAll('_', '/')\n const padIndex = normalized.indexOf('=')\n if (padIndex === -1) return normalized\n const pad = normalized.slice(padIndex)\n if (!/^={1,2}$/.test(pad) || normalized.slice(0, padIndex).includes('=')) {\n throw new Error('Invalid base64 padding')\n }\n return normalized.slice(0, padIndex)\n}\n\nconst base64CharacterValue = (codePoint: number, index: number): number => {\n if (codePoint >= 65 && codePoint <= 90) return codePoint - 65\n if (codePoint >= 97 && codePoint <= 122) return codePoint - 97 + 26\n if (codePoint >= 48 && codePoint <= 57) return codePoint - 48 + 52\n if (codePoint === 43) return 62\n if (codePoint === 47) return 63\n throw new Error(`Invalid base64 character at index ${index}`)\n}\n\nexport function base64ToArray(msg: string): number[] {\n const s = normalizeBase64(msg)\n\n const result: number[] = []\n let bitBuffer = 0\n let bitCount = 0\n\n for (let i = 0; i < s.length; i++) {\n const c = s.codePointAt(i) as number\n const v = base64CharacterValue(c, i)\n bitBuffer = (bitBuffer << 6) | v\n bitCount += 6\n\n while (bitCount >= 8) {\n bitCount -= 8\n result.push((bitBuffer >> bitCount) & 0xff)\n bitBuffer &= (1 << bitCount) - 1\n }\n }\n // check for valid padding bits\n // if (bitCount !== 0 && bitBuffer !== 0) {\n // throw new Error(\"Invalid base64: non-zero padding bits\")\n // }\n\n return result\n}\n\n/**\n * Encodes a string into an array of bytes representing its UTF-8 encoding.\n * Any lone surrogates are replaced with the Unicode replacement character (U+FFFD).\n *\n * @param str - The string to encode.\n * @returns An array of numbers, each representing a byte in the UTF-8 encoded string.\n */\nfunction utf8ToArray(str: string): number[] {\n return Array.from(utf8Bytes(str))\n}\n\n/**\n * Converts an array of numbers to a UTF-8 encoded string.\n * @param {number[]} arr - The input array of numbers.\n * @returns {string} - The UTF-8 encoded string.\n */\nexport const toUTF8 = (arr: number[] | Uint8Array): string => {\n return new TextDecoder().decode(arr instanceof Uint8Array ? arr : new Uint8Array(arr))\n}\n\n/**\n * Decodes canonical UTF-8 and rejects malformed byte sequences instead of\n * replacing them with U+FFFD. Use this at trust boundaries where replacement\n * could make distinct attacker-controlled byte strings compare as one value.\n *\n * @param arr - UTF-8 bytes to decode.\n * @returns The decoded string.\n * @throws TypeError when the input is not well-formed UTF-8.\n */\nexport const toUTF8Strict = (arr: number[] | Uint8Array): string => {\n return new TextDecoder('utf-8', { fatal: true }).decode(\n arr instanceof Uint8Array ? arr : new Uint8Array(arr)\n )\n}\n\n/**\n * Encodes an array of numbers into a specified encoding ('hex' or 'utf8'). If no encoding is provided, returns the original array.\n * @param {number[]} arr - The input array of numbers.\n * @param {('hex' | 'utf8')} enc - The desired encoding.\n * @returns {string | number[]} - The encoded message as a string (for 'hex' and 'utf8') or the original array.\n */\nexport const encode = (arr: number[], enc?: 'hex' | 'utf8'): string | number[] => {\n switch (enc) {\n case 'hex':\n return toHex(arr)\n case 'utf8':\n return toUTF8(arr)\n // If no encoding is provided, return the original array\n default:\n return arr\n }\n}\n\n/**\n * Converts an array of bytes (each between 0 and 255) into a base64 encoded string.\n *\n * @param {number[]} byteArray - An array of numbers where each number is a byte (0-255).\n * @returns {string} The base64 encoded string.\n *\n * @example\n * const bytes = [72, 101, 108, 108, 111]; // Represents the string \"Hello\"\n * console.log(toBase64(bytes)); // Outputs: SGVsbG8=\n */\nexport function toBase64(byteArray: number[] | Uint8Array): string {\n const base64Chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\n let result = ''\n let i: number\n\n for (i = 0; i < byteArray.length; i += 3) {\n const byte1 = byteArray[i]\n const byte2 = i + 1 < byteArray.length ? byteArray[i + 1] : 0\n const byte3 = i + 2 < byteArray.length ? byteArray[i + 2] : 0\n\n const encoded1 = byte1 >> 2\n const encoded2 = ((byte1 & 0x03) << 4) | (byte2 >> 4)\n const encoded3 = ((byte2 & 0x0f) << 2) | (byte3 >> 6)\n const encoded4 = byte3 & 0x3f\n\n result += base64Chars.charAt(encoded1) + base64Chars.charAt(encoded2)\n result += i + 1 < byteArray.length ? base64Chars.charAt(encoded3) : '='\n result += i + 2 < byteArray.length ? base64Chars.charAt(encoded4) : '='\n }\n\n return result\n}\n\nconst base58chars = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'\n\n/**\n * Converts a string from base58 to a binary array\n * @param str - The string representation\n * @returns The binary representation\n */\nexport const fromBase58 = (str: string): number[] => {\n if (str === '' || typeof str !== 'string') {\n throw new Error(`Expected base58 string but got “${str}”`)\n }\n const match: string[] | null = str.match(/[^1-9A-HJ-NP-Za-km-z]/gmu)\n\n if (match !== null) {\n throw new Error(`Invalid base58 character “${match.join('')}”`)\n }\n const lz = str.match(/^1+/gmu)\n const psz: number = lz === null ? 0 : lz[0].length\n const size = ((str.length - psz) * (Math.log(58) / Math.log(256)) + 1) >>> 0\n\n const uint8 = new Uint8Array([\n ...new Uint8Array(psz),\n ...Array.from(str)\n .map(i => base58chars.indexOf(i))\n .reduce((acc, i) => {\n acc = acc.map(j => {\n const x = j * 58 + i\n i = x >> 8\n return x\n })\n return acc\n }, new Uint8Array(size))\n .reverse()\n .filter(\n (\n lastValue => value =>\n // @ts-expect-error\n (lastValue = lastValue || value)\n )(false)\n )\n ])\n return [...uint8]\n}\n\n/**\n * Converts a binary array into a base58 string\n * @param bin - The binary array to convert to base58\n * @returns The base58 string representation\n */\nexport const toBase58 = (bin: number[]): string => {\n const base58Map = Array.from({ length: 256 }, () => -1)\n for (let i = 0; i < base58chars.length; ++i) {\n base58Map[base58chars.codePointAt(i) as number] = i\n }\n\n const result: number[] = []\n\n for (const byte of bin) {\n let carry = byte\n for (let j = 0; j < result.length; ++j) {\n const x = (base58Map[result[j]] << 8) + carry\n const quotient = Math.trunc(x / 58)\n const remainder = x - quotient * 58\n result[j] = base58chars.codePointAt(remainder) as number\n carry = quotient\n }\n while (carry !== 0) {\n const quotient = Math.trunc(carry / 58)\n const remainder = carry - quotient * 58\n result.push(base58chars.codePointAt(remainder) as number)\n carry = quotient\n }\n }\n\n for (const byte of bin) {\n if (byte === 0) result.push('1'.codePointAt(0) as number)\n else break\n }\n\n result.reverse()\n\n return String.fromCodePoint(...result)\n}\n\n/**\n * Converts a binary array into a base58check string with a checksum\n * @param bin - The binary array to convert to base58check\n * @returns The base58check string representation\n */\nexport const toBase58Check = (bin: number[], prefix: number[] = [0]): string => {\n let hash = hash256([...prefix, ...bin])\n hash = [...prefix, ...bin, ...hash.slice(0, 4)]\n return toBase58(hash)\n}\n\n/**\n * Converts a base58check string into a binary array after validating the checksum\n * @param str - The base58check string to convert to binary\n * @param enc - If hex, the return values will be hex strings, arrays of numbers otherwise\n * @param prefixLength - The length of the prefix. Optional, defaults to 1.\n * @returns The binary array representation\n */\nexport const fromBase58Check = (\n str: string,\n enc?: 'hex',\n prefixLength: number = 1\n): { data: number[] | string; prefix: number[] | string } => {\n const bin = fromBase58(str)\n let prefix: string | number[] = bin.slice(0, prefixLength)\n let data: string | number[] = bin.slice(prefixLength, -4)\n let hash = [...prefix, ...data]\n hash = hash256(hash)\n bin.slice(-4).forEach((check, index) => {\n if (check !== hash[index]) {\n throw new Error('Invalid checksum')\n }\n })\n if (enc === 'hex') {\n prefix = toHex(prefix)\n data = toHex(data)\n }\n return { prefix, data }\n}\n\ntype WriterChunk = readonly number[] | Uint8Array\n\nexport class Writer {\n public bufs: WriterChunk[]\n private length: number\n\n constructor(bufs?: WriterChunk[]) {\n this.bufs = bufs ?? []\n this.length = 0\n for (const b of this.bufs) this.length += b.length\n }\n\n getLength(): number {\n return this.length\n }\n\n toUint8Array(): Uint8Array {\n const out = new Uint8Array(this.length)\n let offset = 0\n for (const buf of this.bufs) {\n out.set(buf, offset)\n offset += buf.length\n }\n return out\n }\n\n toArray(): number[] {\n const totalLength = this.length\n const ret = Array.from({ length: totalLength }, () => 0)\n let offset = 0\n for (const buf of this.bufs) {\n if (buf instanceof Uint8Array) {\n for (const byte of buf) {\n ret[offset++] = byte\n }\n } else {\n const arr = buf as number[]\n for (const item of arr) {\n ret[offset++] = item\n }\n }\n }\n return ret\n }\n\n toHex(): string {\n return this.toArray()\n .map(n => n.toString(16).padStart(2, '0'))\n .join('')\n }\n\n write(buf: WriterChunk): this {\n this.bufs.push(buf)\n this.length += buf.length\n return this\n }\n\n writeReverse(buf: number[]): this {\n const buf2: number[] = Array.from({ length: buf.length }, () => 0)\n for (let i = 0; i < buf2.length; i++) {\n buf2[i] = buf[buf.length - 1 - i]\n }\n return this.write(buf2)\n }\n\n writeUInt8(n: number): this {\n const buf = Array.from({ length: 1 }, () => 0)\n buf[0] = n & 0xff\n this.write(buf)\n return this\n }\n\n writeInt8(n: number): this {\n return this.writeUInt8(n)\n }\n\n writeUInt16BE(n: number): this {\n const buf = [\n (n >> 8) & 0xff, // shift right 8 bits to get the high byte\n n & 0xff // low byte is just the last 8 bits\n ]\n return this.write(buf)\n }\n\n writeInt16BE(n: number): this {\n return this.writeUInt16BE(n & 0xffff) // Mask with 0xFFFF to get the lower 16 bits\n }\n\n writeUInt16LE(n: number): this {\n const buf = [\n n & 0xff, // low byte is just the last 8 bits\n (n >> 8) & 0xff // shift right 8 bits to get the high byte\n ]\n return this.write(buf)\n }\n\n writeInt16LE(n: number): this {\n return this.writeUInt16LE(n & 0xffff) // Mask with 0xFFFF to get the lower 16 bits\n }\n\n writeUInt32BE(n: number): this {\n const buf = [\n (n >> 24) & 0xff, // highest byte\n (n >> 16) & 0xff,\n (n >> 8) & 0xff,\n n & 0xff // lowest byte\n ]\n return this.write(buf)\n }\n\n writeInt32BE(n: number): this {\n return this.writeUInt32BE(n >>> 0) // Using unsigned right shift to handle negative numbers\n }\n\n writeUInt32LE(n: number): this {\n const buf = [\n n & 0xff, // lowest byte\n (n >> 8) & 0xff,\n (n >> 16) & 0xff,\n (n >> 24) & 0xff // highest byte\n ]\n return this.write(buf)\n }\n\n writeInt32LE(n: number): this {\n return this.writeUInt32LE(n >>> 0) // Using unsigned right shift to handle negative numbers\n }\n\n writeUInt64BEBn(bn: BigNumber): this {\n const buf = bn.toArray('be', 8)\n this.write(buf)\n return this\n }\n\n writeUInt64LEBn(bn: BigNumber): this {\n const buf = bn.toArray('be', 8)\n this.writeReverse(buf)\n return this\n }\n\n writeUInt64LE(n: number): this {\n if (n === -1) {\n // This value is used as a dummy satoshis value when serializing OTDA placeholder output for SIGHASH_SINGLE\n this.write(Array.from({ length: 8 }, () => 0xff))\n } else {\n const buf = new BigNumber(n).toArray('be', 8)\n this.writeReverse(buf)\n }\n return this\n }\n\n writeVarIntNum(n: number): this {\n const buf = Writer.varIntNum(n)\n this.write(buf)\n return this\n }\n\n writeVarIntBn(bn: BigNumber): this {\n const buf = Writer.varIntBn(bn)\n this.write(buf)\n return this\n }\n\n static varIntNum(n: number): number[] {\n if (!Number.isFinite(n) || !Number.isInteger(n)) {\n throw new RangeError('CompactSize value must be a finite integer')\n }\n let buf: number[]\n if (n < 0) {\n return this.varIntBn(new BigNumber(n))\n }\n if (n < 253) {\n buf = [n] // 1 byte\n } else if (n < 0x10000) {\n // 253 followed by the number in little-endian format\n buf = [\n 253, // 0xfd\n n & 0xff, // low byte\n (n >> 8) & 0xff // high byte\n ]\n } else if (n < 0x100000000) {\n // 254 followed by the number in little-endian format\n buf = [\n 254, // 0xfe\n n & 0xff,\n (n >> 8) & 0xff,\n (n >> 16) & 0xff,\n (n >> 24) & 0xff\n ]\n } else {\n // 255 followed by the number in little-endian format\n // Since JavaScript bitwise operations work on 32 bits, we need to handle 64-bit numbers in two parts\n const low = n & 0xffffffff\n const high = Math.floor(n / 0x100000000) & 0xffffffff\n buf = [\n 255, // 0xff\n low & 0xff,\n (low >> 8) & 0xff,\n (low >> 16) & 0xff,\n (low >> 24) & 0xff,\n high & 0xff,\n (high >> 8) & 0xff,\n (high >> 16) & 0xff,\n (high >> 24) & 0xff\n ]\n }\n return buf\n }\n\n static varIntBn(bn: BigNumber): number[] {\n let buf: number[]\n if (bn.isNeg()) {\n bn = bn.add(OverflowUint64) // Adjust for negative numbers\n }\n if (bn.ltn(253)) {\n const n = bn.toNumber()\n // No need for bitwise operation as the value is within a byte's range\n buf = [n]\n } else if (bn.ltn(0x10000)) {\n const n = bn.toNumber()\n // Value fits in a uint16\n buf = [253, n & 0xff, (n >> 8) & 0xff]\n } else if (bn.lt(new BigNumber(0x100000000))) {\n const n = bn.toNumber()\n // Value fits in a uint32\n buf = [254, n & 0xff, (n >> 8) & 0xff, (n >> 16) & 0xff, (n >> 24) & 0xff]\n } else {\n const bw = new Writer()\n bw.writeUInt8(255)\n bw.writeUInt64LEBn(bn)\n buf = bw.toArray()\n }\n return buf\n }\n}\n\nexport class Reader {\n public bin: number[]\n public pos: number\n private readonly length: number\n\n constructor(bin: number[] = [], pos: number = 0) {\n this.bin = bin\n this.length = bin.length\n if (!Number.isSafeInteger(pos) || pos < 0 || pos > this.length) {\n throw new RangeError('Reader position exceeds available data')\n }\n this.pos = pos\n }\n\n private ensureAvailable(len: number): void {\n if (\n !Number.isSafeInteger(len) ||\n len < 0 ||\n !Number.isSafeInteger(this.pos) ||\n this.pos < 0 ||\n this.pos + len > this.length\n ) {\n throw new RangeError('Reader read exceeds available data')\n }\n }\n\n public eof(): boolean {\n return this.pos >= this.length\n }\n\n public read(len = this.length - this.pos): number[] {\n this.ensureAvailable(len)\n const start = this.pos\n const end = this.pos + len\n this.pos = end\n return this.bin.slice(start, end)\n }\n\n public readReverse(len = this.length - this.pos): number[] {\n this.ensureAvailable(len)\n const buf2 = Array.from({ length: len }, () => 0)\n for (let i = 0; i < len; i++) {\n buf2[i] = this.bin[this.pos + len - 1 - i]\n }\n this.pos += len\n return buf2\n }\n\n public readUInt8(): number {\n this.ensureAvailable(1)\n const val = this.bin[this.pos]\n this.pos += 1\n return val\n }\n\n public readInt8(): number {\n const val = this.readUInt8()\n // If the sign bit is set, convert to negative value\n return (val & 0x80) === 0 ? val : val - 0x100\n }\n\n public readUInt16BE(): number {\n this.ensureAvailable(2)\n const val = (this.bin[this.pos] << 8) | this.bin[this.pos + 1]\n this.pos += 2\n return val\n }\n\n public readInt16BE(): number {\n const val = this.readUInt16BE()\n // If the sign bit is set, convert to negative value\n return (val & 0x8000) === 0 ? val : val - 0x10000\n }\n\n public readUInt16LE(): number {\n this.ensureAvailable(2)\n const val = this.bin[this.pos] | (this.bin[this.pos + 1] << 8)\n this.pos += 2\n return val\n }\n\n public readInt16LE(): number {\n const val = this.readUInt16LE()\n // If the sign bit is set, convert to negative value\n const x = (val & 0x8000) === 0 ? val : val - 0x10000\n return x\n }\n\n public readUInt32BE(): number {\n this.ensureAvailable(4)\n const val =\n this.bin[this.pos] * 0x1000000 + // Shift the first byte by 24 bits\n ((this.bin[this.pos + 1] << 16) | // Shift the second byte by 16 bits\n (this.bin[this.pos + 2] << 8) | // Shift the third byte by 8 bits\n this.bin[this.pos + 3]) // The fourth byte\n this.pos += 4\n return val\n }\n\n public readInt32BE(): number {\n const val = this.readUInt32BE()\n // If the sign bit is set, convert to negative value\n return (val & 0x80000000) === 0 ? val : val - 0x100000000\n }\n\n public readUInt32LE(): number {\n this.ensureAvailable(4)\n const val =\n (this.bin[this.pos] |\n (this.bin[this.pos + 1] << 8) |\n (this.bin[this.pos + 2] << 16) |\n (this.bin[this.pos + 3] << 24)) >>>\n 0\n this.pos += 4\n return val\n }\n\n public readInt32LE(): number {\n const val = this.readUInt32LE()\n // Explicitly check if the sign bit is set and then convert to a negative value\n return (val & 0x80000000) === 0 ? val : val - 0x100000000\n }\n\n public readUInt64BEBn(): BigNumber {\n const bin = this.read(8)\n const bn = new BigNumber(bin)\n return bn\n }\n\n public readUInt64LEBn(): BigNumber {\n const bin = this.readReverse(8)\n const bn = new BigNumber(bin)\n return bn\n }\n\n public readInt64LEBn(): BigNumber {\n const bin = this.readReverse(8)\n let bn = new BigNumber(bin)\n if (bn.gte(OverflowInt64)) {\n bn = bn.sub(OverflowUint64) // Adjust for negative numbers\n }\n return bn\n }\n\n public readVarIntNum(signed: boolean = true): number {\n const first = this.readUInt8()\n let bn: BigNumber\n switch (first) {\n case 0xfd:\n return this.readUInt16LE()\n case 0xfe:\n return this.readUInt32LE()\n case 0xff:\n bn = signed ? this.readInt64LEBn() : this.readUInt64LEBn()\n if (bn.lte(new BigNumber(2).pow(new BigNumber(53)))) {\n return bn.toNumber()\n } else {\n throw new Error('number too large to retain precision - use readVarIntBn')\n }\n default:\n return first\n }\n }\n\n /**\n * Reads a canonical CompactSize value that can be represented exactly by\n * JavaScript. The legacy `-1` sentinel is accepted when `signed` is true;\n * pass `false` for untrusted lengths, counts, and indexes.\n */\n public readVarIntNumStrict(signed: boolean = true): number {\n return strictCompactSize(this, signed)\n }\n\n public readVarInt(): number[] {\n const first = this.bin[this.pos]\n switch (first) {\n case 0xfd:\n return this.read(1 + 2)\n case 0xfe:\n return this.read(1 + 4)\n case 0xff:\n return this.read(1 + 8)\n default:\n return this.read(1)\n }\n }\n\n public readVarIntBn(): BigNumber {\n const first = this.readUInt8()\n switch (first) {\n case 0xfd:\n return new BigNumber(this.readUInt16LE())\n case 0xfe:\n return new BigNumber(this.readUInt32LE())\n case 0xff:\n return this.readUInt64LEBn()\n default:\n return new BigNumber(first)\n }\n }\n}\n\nexport const minimallyEncode = (buf: number[]): number[] => {\n if (buf.length === 0) {\n return buf\n }\n\n // If the last byte is not 0x00 or 0x80, we are minimally encoded.\n const last = buf.at(-1)!\n if ((last & 0x7f) !== 0) {\n return buf\n }\n\n // If the script is one byte long, then we have a zero, which encodes as an\n // empty array.\n if (buf.length === 1) {\n return []\n }\n\n // If the next byte has it sign bit set, then we are minimaly encoded.\n if ((buf.at(-2)! & 0x80) !== 0) {\n return buf\n }\n\n // We are not minimally encoded, we need to figure out how much to trim.\n for (let i = buf.length - 1; i > 0; i--) {\n // We found a non zero byte, time to encode.\n if (buf[i - 1] !== 0) {\n if ((buf[i - 1] & 0x80) === 0) {\n // the sign bit is clear, we can use it.\n buf[i - 1]! |= last\n return buf.slice(0, i)\n } else {\n // We found a byte with it sign bit set so we need one more\n // byte.\n buf[i] = last\n return buf.slice(0, i + 1)\n }\n }\n }\n\n // If we found the whole thing is zeros, then we have a zero.\n return []\n}\n\nconst OverflowInt64 = new BigNumber(2).pow(new BigNumber(63))\nconst OverflowUint64 = new BigNumber(2).pow(new BigNumber(64))\n\n/**\n * Verifies that a value is not null or undefined, throwing an error if it is.\n *\n * @template T - The type of the value being verified\n * @param {T | undefined | null} value - The value to verify\n * @param {string} errorMessage - The error message to throw if the value is null or undefined\n * @returns {T} - The verified value\n * @throws {Error} - If the value is null or undefined\n *\n * @example\n * const myValue = verifyNotNull(someValue, 'someValue must be defined')\n */\nexport function verifyNotNull<T>(\n value: T | undefined | null,\n errorMessage: string = 'Expected a valid value, but got undefined or null.'\n): T {\n if (value == null) throw new Error(errorMessage)\n return value\n}\n\nexport function constantTimeEquals(a: Uint8Array | number[], b: Uint8Array | number[]): boolean {\n if (a.length !== b.length) return false\n\n let diff = 0\n for (let i = 0; i < a.length; i++) {\n diff |= a[i] ^ b[i]\n }\n return diff === 0\n}\n","// Modified elliptic lineage; see ../../THIRD_PARTY_NOTICES.md and ../../LICENSES/elliptic-MIT.txt.\nimport BigNumber from './BigNumber.js'\nimport ReductionContext from './ReductionContext.js'\nimport MontgomoryMethod from './MontgomoryMethod.js'\nimport Point from './Point.js'\nimport { toArray } from './utils.js'\n\n// This ensures that only one curve is ever created, enhancing performance.\n// This assumes there is never a need to have multiple distinct Curve instances.\n// So far, this assumption has proven to be valid.\nlet globalCurve: Curve\n\ninterface EndomorphismConfig {\n beta?: string\n lambda?: string\n basis?: Array<{ a: string; b: string }>\n}\n\nfunction normalizedMod4(value: BigNumber, carry: number): number {\n const mod4 = (value.andln(3) + carry) & 3\n return mod4 === 3 ? -1 : mod4\n}\n\nfunction jsfDigit(value: BigNumber, carry: number, mod4: number, otherMod4: number): number {\n if ((mod4 & 1) === 0) return 0\n const mod8 = (value.andln(7) + carry) & 7\n return (mod8 === 3 || mod8 === 5) && otherMod4 === 2 ? -mod4 : mod4\n}\n\nfunction nextJsfCarry(carry: number, digit: number): number {\n return 2 * carry === digit + 1 ? 1 - carry : carry\n}\n\nexport default class Curve {\n p!: BigNumber\n red!: ReductionContext\n redN!: BigNumber | null\n zero!: BigNumber\n one!: BigNumber\n two!: BigNumber\n g!: Point\n n!: BigNumber\n a!: BigNumber\n b!: BigNumber\n tinv!: BigNumber\n zeroA!: boolean\n threeA!: boolean\n endo:\n { beta: BigNumber; lambda: BigNumber; basis: Array<{ a: BigNumber; b: BigNumber }> } | undefined // beta, lambda, basis\n _endoWnafT1!: BigNumber[]\n _endoWnafT2!: BigNumber[]\n _wnafT1!: BigNumber[]\n _wnafT2!: BigNumber[]\n _wnafT3!: BigNumber[]\n _wnafT4!: BigNumber[]\n _bitLength!: number\n\n // Represent num in a w-NAF form\n static assert(expression: unknown, message: string = 'Elliptic curve assertion failed'): void {\n if (!(expression as boolean)) {\n throw new Error(message)\n }\n }\n\n getNAF(num: BigNumber, w: number, bits: number): number[] {\n const naf = Array.from({ length: Math.max(num.bitLength(), bits) + 1 }, () => 0)\n naf.fill(0)\n\n const ws = 1 << (w + 1)\n const k = num.clone()\n\n for (let i = 0; i < naf.length; i++) {\n let z\n const mod = k.andln(ws - 1)\n if (k.isOdd()) {\n if (mod > (ws >> 1) - 1) {\n z = (ws >> 1) - mod\n } else {\n z = mod\n }\n k.isubn(z)\n } else {\n z = 0\n }\n\n naf[i] = z\n k.iushrn(1)\n }\n\n return naf\n }\n\n // Represent k1, k2 in a Joint Sparse Form\n getJSF(k1: BigNumber, k2: BigNumber): number[][] {\n const jsf: number[][] = [[], []]\n\n k1 = k1.clone()\n k2 = k2.clone()\n let d1 = 0\n let d2 = 0\n while (k1.cmpn(-d1) > 0 || k2.cmpn(-d2) > 0) {\n // First phase\n const m14 = normalizedMod4(k1, d1)\n const m24 = normalizedMod4(k2, d2)\n const u1 = jsfDigit(k1, d1, m14, m24)\n jsf[0].push(u1)\n\n const u2 = jsfDigit(k2, d2, m24, m14)\n jsf[1].push(u2)\n\n // Second phase\n d1 = nextJsfCarry(d1, u1)\n d2 = nextJsfCarry(d2, u2)\n k1.iushrn(1)\n k2.iushrn(1)\n }\n\n return jsf\n }\n\n static cachedProperty(obj: any, name: string, computer: (this: any) => unknown): void {\n const key = '_' + name\n obj.prototype[name] = function cachedProperty(this: Record<string, unknown>) {\n if (this[key] === undefined) {\n this[key] = computer.call(this)\n }\n return this[key]\n }\n }\n\n static parseBytes(bytes: string | number[]): number[] {\n return typeof bytes === 'string' ? toArray(bytes, 'hex') : bytes\n }\n\n static intFromLE(bytes: number[]): BigNumber {\n return new BigNumber(bytes, 'hex', 'le')\n }\n\n constructor() {\n if (globalCurve === undefined) {\n /* eslint-disable-next-line @typescript-eslint/no-this-alias */\n globalCurve = this\n } else {\n return globalCurve\n }\n\n const precomputed = {\n doubles: {\n step: 4,\n points: [\n [\n 'e60fce93b59e9ec53011aabc21c23e97b2a31369b87a5ae9c44ee89e2a6dec0a',\n 'f7e3507399e595929db99f34f57937101296891e44d23f0be1f32cce69616821'\n ],\n [\n '8282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508',\n '11f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf'\n ],\n [\n '175e159f728b865a72f99cc6c6fc846de0b93833fd2222ed73fce5b551e5b739',\n 'd3506e0d9e3c79eba4ef97a51ff71f5eacb5955add24345c6efa6ffee9fed695'\n ],\n [\n '363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640',\n '4e273adfc732221953b445397f3363145b9a89008199ecb62003c7f3bee9de9'\n ],\n [\n '8b4b5f165df3c2be8c6244b5b745638843e4a781a15bcd1b69f79a55dffdf80c',\n '4aad0a6f68d308b4b3fbd7813ab0da04f9e336546162ee56b3eff0c65fd4fd36'\n ],\n [\n '723cbaa6e5db996d6bf771c00bd548c7b700dbffa6c0e77bcb6115925232fcda',\n '96e867b5595cc498a921137488824d6e2660a0653779494801dc069d9eb39f5f'\n ],\n [\n 'eebfa4d493bebf98ba5feec812c2d3b50947961237a919839a533eca0e7dd7fa',\n '5d9a8ca3970ef0f269ee7edaf178089d9ae4cdc3a711f712ddfd4fdae1de8999'\n ],\n [\n '100f44da696e71672791d0a09b7bde459f1215a29b3c03bfefd7835b39a48db0',\n 'cdd9e13192a00b772ec8f3300c090666b7ff4a18ff5195ac0fbd5cd62bc65a09'\n ],\n [\n 'e1031be262c7ed1b1dc9227a4a04c017a77f8d4464f3b3852c8acde6e534fd2d',\n '9d7061928940405e6bb6a4176597535af292dd419e1ced79a44f18f29456a00d'\n ],\n [\n 'feea6cae46d55b530ac2839f143bd7ec5cf8b266a41d6af52d5e688d9094696d',\n 'e57c6b6c97dce1bab06e4e12bf3ecd5c981c8957cc41442d3155debf18090088'\n ],\n [\n 'da67a91d91049cdcb367be4be6ffca3cfeed657d808583de33fa978bc1ec6cb1',\n '9bacaa35481642bc41f463f7ec9780e5dec7adc508f740a17e9ea8e27a68be1d'\n ],\n [\n '53904faa0b334cdda6e000935ef22151ec08d0f7bb11069f57545ccc1a37b7c0',\n '5bc087d0bc80106d88c9eccac20d3c1c13999981e14434699dcb096b022771c8'\n ],\n [\n '8e7bcd0bd35983a7719cca7764ca906779b53a043a9b8bcaeff959f43ad86047',\n '10b7770b2a3da4b3940310420ca9514579e88e2e47fd68b3ea10047e8460372a'\n ],\n [\n '385eed34c1cdff21e6d0818689b81bde71a7f4f18397e6690a841e1599c43862',\n '283bebc3e8ea23f56701de19e9ebf4576b304eec2086dc8cc0458fe5542e5453'\n ],\n [\n '6f9d9b803ecf191637c73a4413dfa180fddf84a5947fbc9c606ed86c3fac3a7',\n '7c80c68e603059ba69b8e2a30e45c4d47ea4dd2f5c281002d86890603a842160'\n ],\n [\n '3322d401243c4e2582a2147c104d6ecbf774d163db0f5e5313b7e0e742d0e6bd',\n '56e70797e9664ef5bfb019bc4ddaf9b72805f63ea2873af624f3a2e96c28b2a0'\n ],\n [\n '85672c7d2de0b7da2bd1770d89665868741b3f9af7643397721d74d28134ab83',\n '7c481b9b5b43b2eb6374049bfa62c2e5e77f17fcc5298f44c8e3094f790313a6'\n ],\n [\n '948bf809b1988a46b06c9f1919413b10f9226c60f668832ffd959af60c82a0a',\n '53a562856dcb6646dc6b74c5d1c3418c6d4dff08c97cd2bed4cb7f88d8c8e589'\n ],\n [\n '6260ce7f461801c34f067ce0f02873a8f1b0e44dfc69752accecd819f38fd8e8',\n 'bc2da82b6fa5b571a7f09049776a1ef7ecd292238051c198c1a84e95b2b4ae17'\n ],\n [\n 'e5037de0afc1d8d43d8348414bbf4103043ec8f575bfdc432953cc8d2037fa2d',\n '4571534baa94d3b5f9f98d09fb990bddbd5f5b03ec481f10e0e5dc841d755bda'\n ],\n [\n 'e06372b0f4a207adf5ea905e8f1771b4e7e8dbd1c6a6c5b725866a0ae4fce725',\n '7a908974bce18cfe12a27bb2ad5a488cd7484a7787104870b27034f94eee31dd'\n ],\n [\n '213c7a715cd5d45358d0bbf9dc0ce02204b10bdde2a3f58540ad6908d0559754',\n '4b6dad0b5ae462507013ad06245ba190bb4850f5f36a7eeddff2c27534b458f2'\n ],\n [\n '4e7c272a7af4b34e8dbb9352a5419a87e2838c70adc62cddf0cc3a3b08fbd53c',\n '17749c766c9d0b18e16fd09f6def681b530b9614bff7dd33e0b3941817dcaae6'\n ],\n [\n 'fea74e3dbe778b1b10f238ad61686aa5c76e3db2be43057632427e2840fb27b6',\n '6e0568db9b0b13297cf674deccb6af93126b596b973f7b77701d3db7f23cb96f'\n ],\n [\n '76e64113f677cf0e10a2570d599968d31544e179b760432952c02a4417bdde39',\n 'c90ddf8dee4e95cf577066d70681f0d35e2a33d2b56d2032b4b1752d1901ac01'\n ],\n [\n 'c738c56b03b2abe1e8281baa743f8f9a8f7cc643df26cbee3ab150242bcbb891',\n '893fb578951ad2537f718f2eacbfbbbb82314eef7880cfe917e735d9699a84c3'\n ],\n [\n 'd895626548b65b81e264c7637c972877d1d72e5f3a925014372e9f6588f6c14b',\n 'febfaa38f2bc7eae728ec60818c340eb03428d632bb067e179363ed75d7d991f'\n ],\n [\n 'b8da94032a957518eb0f6433571e8761ceffc73693e84edd49150a564f676e03',\n '2804dfa44805a1e4d7c99cc9762808b092cc584d95ff3b511488e4e74efdf6e7'\n ],\n [\n 'e80fea14441fb33a7d8adab9475d7fab2019effb5156a792f1a11778e3c0df5d',\n 'eed1de7f638e00771e89768ca3ca94472d155e80af322ea9fcb4291b6ac9ec78'\n ],\n [\n 'a301697bdfcd704313ba48e51d567543f2a182031efd6915ddc07bbcc4e16070',\n '7370f91cfb67e4f5081809fa25d40f9b1735dbf7c0a11a130c0d1a041e177ea1'\n ],\n [\n '90ad85b389d6b936463f9d0512678de208cc330b11307fffab7ac63e3fb04ed4',\n 'e507a3620a38261affdcbd9427222b839aefabe1582894d991d4d48cb6ef150'\n ],\n [\n '8f68b9d2f63b5f339239c1ad981f162ee88c5678723ea3351b7b444c9ec4c0da',\n '662a9f2dba063986de1d90c2b6be215dbbea2cfe95510bfdf23cbf79501fff82'\n ],\n [\n 'e4f3fb0176af85d65ff99ff9198c36091f48e86503681e3e6686fd5053231e11',\n '1e63633ad0ef4f1c1661a6d0ea02b7286cc7e74ec951d1c9822c38576feb73bc'\n ],\n [\n '8c00fa9b18ebf331eb961537a45a4266c7034f2f0d4e1d0716fb6eae20eae29e',\n 'efa47267fea521a1a9dc343a3736c974c2fadafa81e36c54e7d2a4c66702414b'\n ],\n [\n 'e7a26ce69dd4829f3e10cec0a9e98ed3143d084f308b92c0997fddfc60cb3e41',\n '2a758e300fa7984b471b006a1aafbb18d0a6b2c0420e83e20e8a9421cf2cfd51'\n ],\n [\n 'b6459e0ee3662ec8d23540c223bcbdc571cbcb967d79424f3cf29eb3de6b80ef',\n '67c876d06f3e06de1dadf16e5661db3c4b3ae6d48e35b2ff30bf0b61a71ba45'\n ],\n [\n 'd68a80c8280bb840793234aa118f06231d6f1fc67e73c5a5deda0f5b496943e8',\n 'db8ba9fff4b586d00c4b1f9177b0e28b5b0e7b8f7845295a294c84266b133120'\n ],\n [\n '324aed7df65c804252dc0270907a30b09612aeb973449cea4095980fc28d3d5d',\n '648a365774b61f2ff130c0c35aec1f4f19213b0c7e332843967224af96ab7c84'\n ],\n [\n '4df9c14919cde61f6d51dfdbe5fee5dceec4143ba8d1ca888e8bd373fd054c96',\n '35ec51092d8728050974c23a1d85d4b5d506cdc288490192ebac06cad10d5d'\n ],\n [\n '9c3919a84a474870faed8a9c1cc66021523489054d7f0308cbfc99c8ac1f98cd',\n 'ddb84f0f4a4ddd57584f044bf260e641905326f76c64c8e6be7e5e03d4fc599d'\n ],\n [\n '6057170b1dd12fdf8de05f281d8e06bb91e1493a8b91d4cc5a21382120a959e5',\n '9a1af0b26a6a4807add9a2daf71df262465152bc3ee24c65e899be932385a2a8'\n ],\n [\n 'a576df8e23a08411421439a4518da31880cef0fba7d4df12b1a6973eecb94266',\n '40a6bf20e76640b2c92b97afe58cd82c432e10a7f514d9f3ee8be11ae1b28ec8'\n ],\n [\n '7778a78c28dec3e30a05fe9629de8c38bb30d1f5cf9a3a208f763889be58ad71',\n '34626d9ab5a5b22ff7098e12f2ff580087b38411ff24ac563b513fc1fd9f43ac'\n ],\n [\n '928955ee637a84463729fd30e7afd2ed5f96274e5ad7e5cb09eda9c06d903ac',\n 'c25621003d3f42a827b78a13093a95eeac3d26efa8a8d83fc5180e935bcd091f'\n ],\n [\n '85d0fef3ec6db109399064f3a0e3b2855645b4a907ad354527aae75163d82751',\n '1f03648413a38c0be29d496e582cf5663e8751e96877331582c237a24eb1f962'\n ],\n [\n 'ff2b0dce97eece97c1c9b6041798b85dfdfb6d8882da20308f5404824526087e',\n '493d13fef524ba188af4c4dc54d07936c7b7ed6fb90e2ceb2c951e01f0c29907'\n ],\n [\n '827fbbe4b1e880ea9ed2b2e6301b212b57f1ee148cd6dd28780e5e2cf856e241',\n 'c60f9c923c727b0b71bef2c67d1d12687ff7a63186903166d605b68baec293ec'\n ],\n [\n 'eaa649f21f51bdbae7be4ae34ce6e5217a58fdce7f47f9aa7f3b58fa2120e2b3',\n 'be3279ed5bbbb03ac69a80f89879aa5a01a6b965f13f7e59d47a5305ba5ad93d'\n ],\n [\n 'e4a42d43c5cf169d9391df6decf42ee541b6d8f0c9a137401e23632dda34d24f',\n '4d9f92e716d1c73526fc99ccfb8ad34ce886eedfa8d8e4f13a7f7131deba9414'\n ],\n [\n '1ec80fef360cbdd954160fadab352b6b92b53576a88fea4947173b9d4300bf19',\n 'aeefe93756b5340d2f3a4958a7abbf5e0146e77f6295a07b671cdc1cc107cefd'\n ],\n [\n '146a778c04670c2f91b00af4680dfa8bce3490717d58ba889ddb5928366642be',\n 'b318e0ec3354028add669827f9d4b2870aaa971d2f7e5ed1d0b297483d83efd0'\n ],\n [\n 'fa50c0f61d22e5f07e3acebb1aa07b128d0012209a28b9776d76a8793180eef9',\n '6b84c6922397eba9b72cd2872281a68a5e683293a57a213b38cd8d7d3f4f2811'\n ],\n [\n 'da1d61d0ca721a11b1a5bf6b7d88e8421a288ab5d5bba5220e53d32b5f067ec2',\n '8157f55a7c99306c79c0766161c91e2966a73899d279b48a655fba0f1ad836f1'\n ],\n [\n 'a8e282ff0c9706907215ff98e8fd416615311de0446f1e062a73b0610d064e13',\n '7f97355b8db81c09abfb7f3c5b2515888b679a3e50dd6bd6cef7c73111f4cc0c'\n ],\n [\n '174a53b9c9a285872d39e56e6913cab15d59b1fa512508c022f382de8319497c',\n 'ccc9dc37abfc9c1657b4155f2c47f9e6646b3a1d8cb9854383da13ac079afa73'\n ],\n [\n '959396981943785c3d3e57edf5018cdbe039e730e4918b3d884fdff09475b7ba',\n '2e7e552888c331dd8ba0386a4b9cd6849c653f64c8709385e9b8abf87524f2fd'\n ],\n [\n 'd2a63a50ae401e56d645a1153b109a8fcca0a43d561fba2dbb51340c9d82b151',\n 'e82d86fb6443fcb7565aee58b2948220a70f750af484ca52d4142174dcf89405'\n ],\n [\n '64587e2335471eb890ee7896d7cfdc866bacbdbd3839317b3436f9b45617e073',\n 'd99fcdd5bf6902e2ae96dd6447c299a185b90a39133aeab358299e5e9faf6589'\n ],\n [\n '8481bde0e4e4d885b3a546d3e549de042f0aa6cea250e7fd358d6c86dd45e458',\n '38ee7b8cba5404dd84a25bf39cecb2ca900a79c42b262e556d64b1b59779057e'\n ],\n [\n '13464a57a78102aa62b6979ae817f4637ffcfed3c4b1ce30bcd6303f6caf666b',\n '69be159004614580ef7e433453ccb0ca48f300a81d0942e13f495a907f6ecc27'\n ],\n [\n 'bc4a9df5b713fe2e9aef430bcc1dc97a0cd9ccede2f28588cada3a0d2d83f366',\n 'd3a81ca6e785c06383937adf4b798caa6e8a9fbfa547b16d758d666581f33c1'\n ],\n [\n '8c28a97bf8298bc0d23d8c749452a32e694b65e30a9472a3954ab30fe5324caa',\n '40a30463a3305193378fedf31f7cc0eb7ae784f0451cb9459e71dc73cbef9482'\n ],\n [\n '8ea9666139527a8c1dd94ce4f071fd23c8b350c5a4bb33748c4ba111faccae0',\n '620efabbc8ee2782e24e7c0cfb95c5d735b783be9cf0f8e955af34a30e62b945'\n ],\n [\n 'dd3625faef5ba06074669716bbd3788d89bdde815959968092f76cc4eb9a9787',\n '7a188fa3520e30d461da2501045731ca941461982883395937f68d00c644a573'\n ],\n [\n 'f710d79d9eb962297e4f6232b40e8f7feb2bc63814614d692c12de752408221e',\n 'ea98e67232d3b3295d3b535532115ccac8612c721851617526ae47a9c77bfc82'\n ]\n ]\n },\n naf: {\n wnd: 7,\n points: [\n [\n 'f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9',\n '388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672'\n ],\n [\n '2f8bde4d1a07209355b4a7250a5c5128e88b84bddc619ab7cba8d569b240efe4',\n 'd8ac222636e5e3d6d4dba9dda6c9c426f788271bab0d6840dca87d3aa6ac62d6'\n ],\n [\n '5cbdf0646e5db4eaa398f365f2ea7a0e3d419b7e0330e39ce92bddedcac4f9bc',\n '6aebca40ba255960a3178d6d861a54dba813d0b813fde7b5a5082628087264da'\n ],\n [\n 'acd484e2f0c7f65309ad178a9f559abde09796974c57e714c35f110dfc27ccbe',\n 'cc338921b0a7d9fd64380971763b61e9add888a4375f8e0f05cc262ac64f9c37'\n ],\n [\n '774ae7f858a9411e5ef4246b70c65aac5649980be5c17891bbec17895da008cb',\n 'd984a032eb6b5e190243dd56d7b7b365372db1e2dff9d6a8301d74c9c953c61b'\n ],\n [\n 'f28773c2d975288bc7d1d205c3748651b075fbc6610e58cddeeddf8f19405aa8',\n 'ab0902e8d880a89758212eb65cdaf473a1a06da521fa91f29b5cb52db03ed81'\n ],\n [\n 'd7924d4f7d43ea965a465ae3095ff41131e5946f3c85f79e44adbcf8e27e080e',\n '581e2872a86c72a683842ec228cc6defea40af2bd896d3a5c504dc9ff6a26b58'\n ],\n [\n 'defdea4cdb677750a420fee807eacf21eb9898ae79b9768766e4faa04a2d4a34',\n '4211ab0694635168e997b0ead2a93daeced1f4a04a95c0f6cfb199f69e56eb77'\n ],\n [\n '2b4ea0a797a443d293ef5cff444f4979f06acfebd7e86d277475656138385b6c',\n '85e89bc037945d93b343083b5a1c86131a01f60c50269763b570c854e5c09b7a'\n ],\n [\n '352bbf4a4cdd12564f93fa332ce333301d9ad40271f8107181340aef25be59d5',\n '321eb4075348f534d59c18259dda3e1f4a1b3b2e71b1039c67bd3d8bcf81998c'\n ],\n [\n '2fa2104d6b38d11b0230010559879124e42ab8dfeff5ff29dc9cdadd4ecacc3f',\n '2de1068295dd865b64569335bd5dd80181d70ecfc882648423ba76b532b7d67'\n ],\n [\n '9248279b09b4d68dab21a9b066edda83263c3d84e09572e269ca0cd7f5453714',\n '73016f7bf234aade5d1aa71bdea2b1ff3fc0de2a887912ffe54a32ce97cb3402'\n ],\n [\n 'daed4f2be3a8bf278e70132fb0beb7522f570e144bf615c07e996d443dee8729',\n 'a69dce4a7d6c98e8d4a1aca87ef8d7003f83c230f3afa726ab40e52290be1c55'\n ],\n [\n 'c44d12c7065d812e8acf28d7cbb19f9011ecd9e9fdf281b0e6a3b5e87d22e7db',\n '2119a460ce326cdc76c45926c982fdac0e106e861edf61c5a039063f0e0e6482'\n ],\n [\n '6a245bf6dc698504c89a20cfded60853152b695336c28063b61c65cbd269e6b4',\n 'e022cf42c2bd4a708b3f5126f16a24ad8b33ba48d0423b6efd5e6348100d8a82'\n ],\n [\n '1697ffa6fd9de627c077e3d2fe541084ce13300b0bec1146f95ae57f0d0bd6a5',\n 'b9c398f186806f5d27561506e4557433a2cf15009e498ae7adee9d63d01b2396'\n ],\n [\n '605bdb019981718b986d0f07e834cb0d9deb8360ffb7f61df982345ef27a7479',\n '2972d2de4f8d20681a78d93ec96fe23c26bfae84fb14db43b01e1e9056b8c49'\n ],\n [\n '62d14dab4150bf497402fdc45a215e10dcb01c354959b10cfe31c7e9d87ff33d',\n '80fc06bd8cc5b01098088a1950eed0db01aa132967ab472235f5642483b25eaf'\n ],\n [\n '80c60ad0040f27dade5b4b06c408e56b2c50e9f56b9b8b425e555c2f86308b6f',\n '1c38303f1cc5c30f26e66bad7fe72f70a65eed4cbe7024eb1aa01f56430bd57a'\n ],\n [\n '7a9375ad6167ad54aa74c6348cc54d344cc5dc9487d847049d5eabb0fa03c8fb',\n 'd0e3fa9eca8726909559e0d79269046bdc59ea10c70ce2b02d499ec224dc7f7'\n ],\n [\n 'd528ecd9b696b54c907a9ed045447a79bb408ec39b68df504bb51f459bc3ffc9',\n 'eecf41253136e5f99966f21881fd656ebc4345405c520dbc063465b521409933'\n ],\n [\n '49370a4b5f43412ea25f514e8ecdad05266115e4a7ecb1387231808f8b45963',\n '758f3f41afd6ed428b3081b0512fd62a54c3f3afbb5b6764b653052a12949c9a'\n ],\n [\n '77f230936ee88cbbd73df930d64702ef881d811e0e1498e2f1c13eb1fc345d74',\n '958ef42a7886b6400a08266e9ba1b37896c95330d97077cbbe8eb3c7671c60d6'\n ],\n [\n 'f2dac991cc4ce4b9ea44887e5c7c0bce58c80074ab9d4dbaeb28531b7739f530',\n 'e0dedc9b3b2f8dad4da1f32dec2531df9eb5fbeb0598e4fd1a117dba703a3c37'\n ],\n [\n '463b3d9f662621fb1b4be8fbbe2520125a216cdfc9dae3debcba4850c690d45b',\n '5ed430d78c296c3543114306dd8622d7c622e27c970a1de31cb377b01af7307e'\n ],\n [\n 'f16f804244e46e2a09232d4aff3b59976b98fac14328a2d1a32496b49998f247',\n 'cedabd9b82203f7e13d206fcdf4e33d92a6c53c26e5cce26d6579962c4e31df6'\n ],\n [\n 'caf754272dc84563b0352b7a14311af55d245315ace27c65369e15f7151d41d1',\n 'cb474660ef35f5f2a41b643fa5e460575f4fa9b7962232a5c32f908318a04476'\n ],\n [\n '2600ca4b282cb986f85d0f1709979d8b44a09c07cb86d7c124497bc86f082120',\n '4119b88753c15bd6a693b03fcddbb45d5ac6be74ab5f0ef44b0be9475a7e4b40'\n ],\n [\n '7635ca72d7e8432c338ec53cd12220bc01c48685e24f7dc8c602a7746998e435',\n '91b649609489d613d1d5e590f78e6d74ecfc061d57048bad9e76f302c5b9c61'\n ],\n [\n '754e3239f325570cdbbf4a87deee8a66b7f2b33479d468fbc1a50743bf56cc18',\n '673fb86e5bda30fb3cd0ed304ea49a023ee33d0197a695d0c5d98093c536683'\n ],\n [\n 'e3e6bd1071a1e96aff57859c82d570f0330800661d1c952f9fe2694691d9b9e8',\n '59c9e0bba394e76f40c0aa58379a3cb6a5a2283993e90c4167002af4920e37f5'\n ],\n [\n '186b483d056a033826ae73d88f732985c4ccb1f32ba35f4b4cc47fdcf04aa6eb',\n '3b952d32c67cf77e2e17446e204180ab21fb8090895138b4a4a797f86e80888b'\n ],\n [\n 'df9d70a6b9876ce544c98561f4be4f725442e6d2b737d9c91a8321724ce0963f',\n '55eb2dafd84d6ccd5f862b785dc39d4ab157222720ef9da217b8c45cf2ba2417'\n ],\n [\n '5edd5cc23c51e87a497ca815d5dce0f8ab52554f849ed8995de64c5f34ce7143',\n 'efae9c8dbc14130661e8cec030c89ad0c13c66c0d17a2905cdc706ab7399a868'\n ],\n [\n '290798c2b6476830da12fe02287e9e777aa3fba1c355b17a722d362f84614fba',\n 'e38da76dcd440621988d00bcf79af25d5b29c094db2a23146d003afd41943e7a'\n ],\n [\n 'af3c423a95d9f5b3054754efa150ac39cd29552fe360257362dfdecef4053b45',\n 'f98a3fd831eb2b749a93b0e6f35cfb40c8cd5aa667a15581bc2feded498fd9c6'\n ],\n [\n '766dbb24d134e745cccaa28c99bf274906bb66b26dcf98df8d2fed50d884249a',\n '744b1152eacbe5e38dcc887980da38b897584a65fa06cedd2c924f97cbac5996'\n ],\n [\n '59dbf46f8c94759ba21277c33784f41645f7b44f6c596a58ce92e666191abe3e',\n 'c534ad44175fbc300f4ea6ce648309a042ce739a7919798cd85e216c4a307f6e'\n ],\n [\n 'f13ada95103c4537305e691e74e9a4a8dd647e711a95e73cb62dc6018cfd87b8',\n 'e13817b44ee14de663bf4bc808341f326949e21a6a75c2570778419bdaf5733d'\n ],\n [\n '7754b4fa0e8aced06d4167a2c59cca4cda1869c06ebadfb6488550015a88522c',\n '30e93e864e669d82224b967c3020b8fa8d1e4e350b6cbcc537a48b57841163a2'\n ],\n [\n '948dcadf5990e048aa3874d46abef9d701858f95de8041d2a6828c99e2262519',\n 'e491a42537f6e597d5d28a3224b1bc25df9154efbd2ef1d2cbba2cae5347d57e'\n ],\n [\n '7962414450c76c1689c7b48f8202ec37fb224cf5ac0bfa1570328a8a3d7c77ab',\n '100b610ec4ffb4760d5c1fc133ef6f6b12507a051f04ac5760afa5b29db83437'\n ],\n [\n '3514087834964b54b15b160644d915485a16977225b8847bb0dd085137ec47ca',\n 'ef0afbb2056205448e1652c48e8127fc6039e77c15c2378b7e7d15a0de293311'\n ],\n [\n 'd3cc30ad6b483e4bc79ce2c9dd8bc54993e947eb8df787b442943d3f7b527eaf',\n '8b378a22d827278d89c5e9be8f9508ae3c2ad46290358630afb34db04eede0a4'\n ],\n [\n '1624d84780732860ce1c78fcbfefe08b2b29823db913f6493975ba0ff4847610',\n '68651cf9b6da903e0914448c6cd9d4ca896878f5282be4c8cc06e2a404078575'\n ],\n [\n '733ce80da955a8a26902c95633e62a985192474b5af207da6df7b4fd5fc61cd4',\n 'f5435a2bd2badf7d485a4d8b8db9fcce3e1ef8e0201e4578c54673bc1dc5ea1d'\n ],\n [\n '15d9441254945064cf1a1c33bbd3b49f8966c5092171e699ef258dfab81c045c',\n 'd56eb30b69463e7234f5137b73b84177434800bacebfc685fc37bbe9efe4070d'\n ],\n [\n 'a1d0fcf2ec9de675b612136e5ce70d271c21417c9d2b8aaaac138599d0717940',\n 'edd77f50bcb5a3cab2e90737309667f2641462a54070f3d519212d39c197a629'\n ],\n [\n 'e22fbe15c0af8ccc5780c0735f84dbe9a790badee8245c06c7ca37331cb36980',\n 'a855babad5cd60c88b430a69f53a1a7a38289154964799be43d06d77d31da06'\n ],\n [\n '311091dd9860e8e20ee13473c1155f5f69635e394704eaa74009452246cfa9b3',\n '66db656f87d1f04fffd1f04788c06830871ec5a64feee685bd80f0b1286d8374'\n ],\n [\n '34c1fd04d301be89b31c0442d3e6ac24883928b45a9340781867d4232ec2dbdf',\n '9414685e97b1b5954bd46f730174136d57f1ceeb487443dc5321857ba73abee'\n ],\n [\n 'f219ea5d6b54701c1c14de5b557eb42a8d13f3abbcd08affcc2a5e6b049b8d63',\n '4cb95957e83d40b0f73af4544cccf6b1f4b08d3c07b27fb8d8c2962a400766d1'\n ],\n [\n 'd7b8740f74a8fbaab1f683db8f45de26543a5490bca627087236912469a0b448',\n 'fa77968128d9c92ee1010f337ad4717eff15db5ed3c049b3411e0315eaa4593b'\n ],\n [\n '32d31c222f8f6f0ef86f7c98d3a3335ead5bcd32abdd94289fe4d3091aa824bf',\n '5f3032f5892156e39ccd3d7915b9e1da2e6dac9e6f26e961118d14b8462e1661'\n ],\n [\n '7461f371914ab32671045a155d9831ea8793d77cd59592c4340f86cbc18347b5',\n '8ec0ba238b96bec0cbdddcae0aa442542eee1ff50c986ea6b39847b3cc092ff6'\n ],\n [\n 'ee079adb1df1860074356a25aa38206a6d716b2c3e67453d287698bad7b2b2d6',\n '8dc2412aafe3be5c4c5f37e0ecc5f9f6a446989af04c4e25ebaac479ec1c8c1e'\n ],\n [\n '16ec93e447ec83f0467b18302ee620f7e65de331874c9dc72bfd8616ba9da6b5',\n '5e4631150e62fb40d0e8c2a7ca5804a39d58186a50e497139626778e25b0674d'\n ],\n [\n 'eaa5f980c245f6f038978290afa70b6bd8855897f98b6aa485b96065d537bd99',\n 'f65f5d3e292c2e0819a528391c994624d784869d7e6ea67fb18041024edc07dc'\n ],\n [\n '78c9407544ac132692ee1910a02439958ae04877151342ea96c4b6b35a49f51',\n 'f3e0319169eb9b85d5404795539a5e68fa1fbd583c064d2462b675f194a3ddb4'\n ],\n [\n '494f4be219a1a77016dcd838431aea0001cdc8ae7a6fc688726578d9702857a5',\n '42242a969283a5f339ba7f075e36ba2af925ce30d767ed6e55f4b031880d562c'\n ],\n [\n 'a598a8030da6d86c6bc7f2f5144ea549d28211ea58faa70ebf4c1e665c1fe9b5',\n '204b5d6f84822c307e4b4a7140737aec23fc63b65b35f86a10026dbd2d864e6b'\n ],\n [\n 'c41916365abb2b5d09192f5f2dbeafec208f020f12570a184dbadc3e58595997',\n '4f14351d0087efa49d245b328984989d5caf9450f34bfc0ed16e96b58fa9913'\n ],\n [\n '841d6063a586fa475a724604da03bc5b92a2e0d2e0a36acfe4c73a5514742881',\n '73867f59c0659e81904f9a1c7543698e62562d6744c169ce7a36de01a8d6154'\n ],\n [\n '5e95bb399a6971d376026947f89bde2f282b33810928be4ded112ac4d70e20d5',\n '39f23f366809085beebfc71181313775a99c9aed7d8ba38b161384c746012865'\n ],\n [\n '36e4641a53948fd476c39f8a99fd974e5ec07564b5315d8bf99471bca0ef2f66',\n 'd2424b1b1abe4eb8164227b085c9aa9456ea13493fd563e06fd51cf5694c78fc'\n ],\n [\n '336581ea7bfbbb290c191a2f507a41cf5643842170e914faeab27c2c579f726',\n 'ead12168595fe1be99252129b6e56b3391f7ab1410cd1e0ef3dcdcabd2fda224'\n ],\n [\n '8ab89816dadfd6b6a1f2634fcf00ec8403781025ed6890c4849742706bd43ede',\n '6fdcef09f2f6d0a044e654aef624136f503d459c3e89845858a47a9129cdd24e'\n ],\n [\n '1e33f1a746c9c5778133344d9299fcaa20b0938e8acff2544bb40284b8c5fb94',\n '60660257dd11b3aa9c8ed618d24edff2306d320f1d03010e33a7d2057f3b3b6'\n ],\n [\n '85b7c1dcb3cec1b7ee7f30ded79dd20a0ed1f4cc18cbcfcfa410361fd8f08f31',\n '3d98a9cdd026dd43f39048f25a8847f4fcafad1895d7a633c6fed3c35e999511'\n ],\n [\n '29df9fbd8d9e46509275f4b125d6d45d7fbe9a3b878a7af872a2800661ac5f51',\n 'b4c4fe99c775a606e2d8862179139ffda61dc861c019e55cd2876eb2a27d84b'\n ],\n [\n 'a0b1cae06b0a847a3fea6e671aaf8adfdfe58ca2f768105c8082b2e449fce252',\n 'ae434102edde0958ec4b19d917a6a28e6b72da1834aff0e650f049503a296cf2'\n ],\n [\n '4e8ceafb9b3e9a136dc7ff67e840295b499dfb3b2133e4ba113f2e4c0e121e5',\n 'cf2174118c8b6d7a4b48f6d534ce5c79422c086a63460502b827ce62a326683c'\n ],\n [\n 'd24a44e047e19b6f5afb81c7ca2f69080a5076689a010919f42725c2b789a33b',\n '6fb8d5591b466f8fc63db50f1c0f1c69013f996887b8244d2cdec417afea8fa3'\n ],\n [\n 'ea01606a7a6c9cdd249fdfcfacb99584001edd28abbab77b5104e98e8e3b35d4',\n '322af4908c7312b0cfbfe369f7a7b3cdb7d4494bc2823700cfd652188a3ea98d'\n ],\n [\n 'af8addbf2b661c8a6c6328655eb96651252007d8c5ea31be4ad196de8ce2131f',\n '6749e67c029b85f52a034eafd096836b2520818680e26ac8f3dfbcdb71749700'\n ],\n [\n 'e3ae1974566ca06cc516d47e0fb165a674a3dabcfca15e722f0e3450f45889',\n '2aeabe7e4531510116217f07bf4d07300de97e4874f81f533420a72eeb0bd6a4'\n ],\n [\n '591ee355313d99721cf6993ffed1e3e301993ff3ed258802075ea8ced397e246',\n 'b0ea558a113c30bea60fc4775460c7901ff0b053d25ca2bdeee98f1a4be5d196'\n ],\n [\n '11396d55fda54c49f19aa97318d8da61fa8584e47b084945077cf03255b52984',\n '998c74a8cd45ac01289d5833a7beb4744ff536b01b257be4c5767bea93ea57a4'\n ],\n [\n '3c5d2a1ba39c5a1790000738c9e0c40b8dcdfd5468754b6405540157e017aa7a',\n 'b2284279995a34e2f9d4de7396fc18b80f9b8b9fdd270f6661f79ca4c81bd257'\n ],\n [\n 'cc8704b8a60a0defa3a99a7299f2e9c3fbc395afb04ac078425ef8a1793cc030',\n 'bdd46039feed17881d1e0862db347f8cf395b74fc4bcdc4e940b74e3ac1f1b13'\n ],\n [\n 'c533e4f7ea8555aacd9777ac5cad29b97dd4defccc53ee7ea204119b2889b197',\n '6f0a256bc5efdf429a2fb6242f1a43a2d9b925bb4a4b3a26bb8e0f45eb596096'\n ],\n [\n 'c14f8f2ccb27d6f109f6d08d03cc96a69ba8c34eec07bbcf566d48e33da6593',\n 'c359d6923bb398f7fd4473e16fe1c28475b740dd098075e6c0e8649113dc3a38'\n ],\n [\n 'a6cbc3046bc6a450bac24789fa17115a4c9739ed75f8f21ce441f72e0b90e6ef',\n '21ae7f4680e889bb130619e2c0f95a360ceb573c70603139862afd617fa9b9f'\n ],\n [\n '347d6d9a02c48927ebfb86c1359b1caf130a3c0267d11ce6344b39f99d43cc38',\n '60ea7f61a353524d1c987f6ecec92f086d565ab687870cb12689ff1e31c74448'\n ],\n [\n 'da6545d2181db8d983f7dcb375ef5866d47c67b1bf31c8cf855ef7437b72656a',\n '49b96715ab6878a79e78f07ce5680c5d6673051b4935bd897fea824b77dc208a'\n ],\n [\n 'c40747cc9d012cb1a13b8148309c6de7ec25d6945d657146b9d5994b8feb1111',\n '5ca560753be2a12fc6de6caf2cb489565db936156b9514e1bb5e83037e0fa2d4'\n ],\n [\n '4e42c8ec82c99798ccf3a610be870e78338c7f713348bd34c8203ef4037f3502',\n '7571d74ee5e0fb92a7a8b33a07783341a5492144cc54bcc40a94473693606437'\n ],\n [\n '3775ab7089bc6af823aba2e1af70b236d251cadb0c86743287522a1b3b0dedea',\n 'be52d107bcfa09d8bcb9736a828cfa7fac8db17bf7a76a2c42ad961409018cf7'\n ],\n [\n 'cee31cbf7e34ec379d94fb814d3d775ad954595d1314ba8846959e3e82f74e26',\n '8fd64a14c06b589c26b947ae2bcf6bfa0149ef0be14ed4d80f448a01c43b1c6d'\n ],\n [\n 'b4f9eaea09b6917619f6ea6a4eb5464efddb58fd45b1ebefcdc1a01d08b47986',\n '39e5c9925b5a54b07433a4f18c61726f8bb131c012ca542eb24a8ac07200682a'\n ],\n [\n 'd4263dfc3d2df923a0179a48966d30ce84e2515afc3dccc1b77907792ebcc60e',\n '62dfaf07a0f78feb30e30d6295853ce189e127760ad6cf7fae164e122a208d54'\n ],\n [\n '48457524820fa65a4f8d35eb6930857c0032acc0a4a2de422233eeda897612c4',\n '25a748ab367979d98733c38a1fa1c2e7dc6cc07db2d60a9ae7a76aaa49bd0f77'\n ],\n [\n 'dfeeef1881101f2cb11644f3a2afdfc2045e19919152923f367a1767c11cceda',\n 'ecfb7056cf1de042f9420bab396793c0c390bde74b4bbdff16a83ae09a9a7517'\n ],\n [\n '6d7ef6b17543f8373c573f44e1f389835d89bcbc6062ced36c82df83b8fae859',\n 'cd450ec335438986dfefa10c57fea9bcc521a0959b2d80bbf74b190dca712d10'\n ],\n [\n 'e75605d59102a5a2684500d3b991f2e3f3c88b93225547035af25af66e04541f',\n 'f5c54754a8f71ee540b9b48728473e314f729ac5308b06938360990e2bfad125'\n ],\n [\n 'eb98660f4c4dfaa06a2be453d5020bc99a0c2e60abe388457dd43fefb1ed620c',\n '6cb9a8876d9cb8520609af3add26cd20a0a7cd8a9411131ce85f44100099223e'\n ],\n [\n '13e87b027d8514d35939f2e6892b19922154596941888336dc3563e3b8dba942',\n 'fef5a3c68059a6dec5d624114bf1e91aac2b9da568d6abeb2570d55646b8adf1'\n ],\n [\n 'ee163026e9fd6fe017c38f06a5be6fc125424b371ce2708e7bf4491691e5764a',\n '1acb250f255dd61c43d94ccc670d0f58f49ae3fa15b96623e5430da0ad6c62b2'\n ],\n [\n 'b268f5ef9ad51e4d78de3a750c2dc89b1e626d43505867999932e5db33af3d80',\n '5f310d4b3c99b9ebb19f77d41c1dee018cf0d34fd4191614003e945a1216e423'\n ],\n [\n 'ff07f3118a9df035e9fad85eb6c7bfe42b02f01ca99ceea3bf7ffdba93c4750d',\n '438136d603e858a3a5c440c38eccbaddc1d2942114e2eddd4740d098ced1f0d8'\n ],\n [\n '8d8b9855c7c052a34146fd20ffb658bea4b9f69e0d825ebec16e8c3ce2b526a1',\n 'cdb559eedc2d79f926baf44fb84ea4d44bcf50fee51d7ceb30e2e7f463036758'\n ],\n [\n '52db0b5384dfbf05bfa9d472d7ae26dfe4b851ceca91b1eba54263180da32b63',\n 'c3b997d050ee5d423ebaf66a6db9f57b3180c902875679de924b69d84a7b375'\n ],\n [\n 'e62f9490d3d51da6395efd24e80919cc7d0f29c3f3fa48c6fff543becbd43352',\n '6d89ad7ba4876b0b22c2ca280c682862f342c8591f1daf5170e07bfd9ccafa7d'\n ],\n [\n '7f30ea2476b399b4957509c88f77d0191afa2ff5cb7b14fd6d8e7d65aaab1193',\n 'ca5ef7d4b231c94c3b15389a5f6311e9daff7bb67b103e9880ef4bff637acaec'\n ],\n [\n '5098ff1e1d9f14fb46a210fada6c903fef0fb7b4a1dd1d9ac60a0361800b7a00',\n '9731141d81fc8f8084d37c6e7542006b3ee1b40d60dfe5362a5b132fd17ddc0'\n ],\n [\n '32b78c7de9ee512a72895be6b9cbefa6e2f3c4ccce445c96b9f2c81e2778ad58',\n 'ee1849f513df71e32efc3896ee28260c73bb80547ae2275ba497237794c8753c'\n ],\n [\n 'e2cb74fddc8e9fbcd076eef2a7c72b0ce37d50f08269dfc074b581550547a4f7',\n 'd3aa2ed71c9dd2247a62df062736eb0baddea9e36122d2be8641abcb005cc4a4'\n ],\n [\n '8438447566d4d7bedadc299496ab357426009a35f235cb141be0d99cd10ae3a8',\n 'c4e1020916980a4da5d01ac5e6ad330734ef0d7906631c4f2390426b2edd791f'\n ],\n [\n '4162d488b89402039b584c6fc6c308870587d9c46f660b878ab65c82c711d67e',\n '67163e903236289f776f22c25fb8a3afc1732f2b84b4e95dbda47ae5a0852649'\n ],\n [\n '3fad3fa84caf0f34f0f89bfd2dcf54fc175d767aec3e50684f3ba4a4bf5f683d',\n 'cd1bc7cb6cc407bb2f0ca647c718a730cf71872e7d0d2a53fa20efcdfe61826'\n ],\n [\n '674f2600a3007a00568c1a7ce05d0816c1fb84bf1370798f1c69532faeb1a86b',\n '299d21f9413f33b3edf43b257004580b70db57da0b182259e09eecc69e0d38a5'\n ],\n [\n 'd32f4da54ade74abb81b815ad1fb3b263d82d6c692714bcff87d29bd5ee9f08f',\n 'f9429e738b8e53b968e99016c059707782e14f4535359d582fc416910b3eea87'\n ],\n [\n '30e4e670435385556e593657135845d36fbb6931f72b08cb1ed954f1e3ce3ff6',\n '462f9bce619898638499350113bbc9b10a878d35da70740dc695a559eb88db7b'\n ],\n [\n 'be2062003c51cc3004682904330e4dee7f3dcd10b01e580bf1971b04d4cad297',\n '62188bc49d61e5428573d48a74e1c655b1c61090905682a0d5558ed72dccb9bc'\n ],\n [\n '93144423ace3451ed29e0fb9ac2af211cb6e84a601df5993c419859fff5df04a',\n '7c10dfb164c3425f5c71a3f9d7992038f1065224f72bb9d1d902a6d13037b47c'\n ],\n [\n 'b015f8044f5fcbdcf21ca26d6c34fb8197829205c7b7d2a7cb66418c157b112c',\n 'ab8c1e086d04e813744a655b2df8d5f83b3cdc6faa3088c1d3aea1454e3a1d5f'\n ],\n [\n 'd5e9e1da649d97d89e4868117a465a3a4f8a18de57a140d36b3f2af341a21b52',\n '4cb04437f391ed73111a13cc1d4dd0db1693465c2240480d8955e8592f27447a'\n ],\n [\n 'd3ae41047dd7ca065dbf8ed77b992439983005cd72e16d6f996a5316d36966bb',\n 'bd1aeb21ad22ebb22a10f0303417c6d964f8cdd7df0aca614b10dc14d125ac46'\n ],\n [\n '463e2763d885f958fc66cdd22800f0a487197d0a82e377b49f80af87c897b065',\n 'bfefacdb0e5d0fd7df3a311a94de062b26b80c61fbc97508b79992671ef7ca7f'\n ],\n [\n '7985fdfd127c0567c6f53ec1bb63ec3158e597c40bfe747c83cddfc910641917',\n '603c12daf3d9862ef2b25fe1de289aed24ed291e0ec6708703a5bd567f32ed03'\n ],\n [\n '74a1ad6b5f76e39db2dd249410eac7f99e74c59cb83d2d0ed5ff1543da7703e9',\n 'cc6157ef18c9c63cd6193d83631bbea0093e0968942e8c33d5737fd790e0db08'\n ],\n [\n '30682a50703375f602d416664ba19b7fc9bab42c72747463a71d0896b22f6da3',\n '553e04f6b018b4fa6c8f39e7f311d3176290d0e0f19ca73f17714d9977a22ff8'\n ],\n [\n '9e2158f0d7c0d5f26c3791efefa79597654e7a2b2464f52b1ee6c1347769ef57',\n '712fcdd1b9053f09003a3481fa7762e9ffd7c8ef35a38509e2fbf2629008373'\n ],\n [\n '176e26989a43c9cfeba4029c202538c28172e566e3c4fce7322857f3be327d66',\n 'ed8cc9d04b29eb877d270b4878dc43c19aefd31f4eee09ee7b47834c1fa4b1c3'\n ],\n [\n '75d46efea3771e6e68abb89a13ad747ecf1892393dfc4f1b7004788c50374da8',\n '9852390a99507679fd0b86fd2b39a868d7efc22151346e1a3ca4726586a6bed8'\n ],\n [\n '809a20c67d64900ffb698c4c825f6d5f2310fb0451c869345b7319f645605721',\n '9e994980d9917e22b76b061927fa04143d096ccc54963e6a5ebfa5f3f8e286c1'\n ],\n [\n '1b38903a43f7f114ed4500b4eac7083fdefece1cf29c63528d563446f972c180',\n '4036edc931a60ae889353f77fd53de4a2708b26b6f5da72ad3394119daf408f9'\n ]\n ]\n }\n }\n const conf = {\n prime: 'k256',\n p: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f',\n a: '0',\n b: '7',\n n: 'ffffffff ffffffff ffffffff fffffffe baaedce6 af48a03b bfd25e8c d0364141',\n h: '1',\n\n // Precomputed endomorphism\n beta: '7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee',\n lambda: '5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72',\n basis: [\n {\n a: '3086d221a7d46bcde86c90e49284eb15',\n b: '-e4437ed6010e88286f547fa90abfe4c3'\n },\n {\n a: '114ca50f7a8e2f3f657c1108d9d44cfd8',\n b: '3086d221a7d46bcde86c90e49284eb15'\n }\n ],\n\n gRed: false,\n g: [\n '79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798',\n '483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8',\n precomputed\n ]\n }\n\n this.p = new BigNumber(conf.p, 16)\n\n // Use Montgomery, when there is no fast reduction for the prime\n this.red = new ReductionContext(conf.prime as 'k256')\n\n // Useful for many curves\n this.zero = new BigNumber(0).toRed(this.red)\n this.one = new BigNumber(1).toRed(this.red)\n this.two = new BigNumber(2).toRed(this.red)\n\n // Curve configuration, optional\n this.n = new BigNumber(conf.n, 16)\n this.g = Point.fromJSON(\n conf.g as [\n string,\n string,\n {\n doubles?: { step: number; points: Array<[string, string]> }\n naf?: { wnd: number; points: Array<[string, string]> }\n }\n ],\n conf.gRed\n )\n\n // Temporary arrays\n this._wnafT1 = Array.from({ length: 4 }, () => undefined as unknown as BigNumber)\n this._wnafT2 = Array.from({ length: 4 }, () => undefined as unknown as BigNumber)\n this._wnafT3 = Array.from({ length: 4 }, () => undefined as unknown as BigNumber)\n this._wnafT4 = Array.from({ length: 4 }, () => undefined as unknown as BigNumber)\n\n this._bitLength = this.n.bitLength()\n this.redN = this.n.toRed(this.red)\n this.a = new BigNumber(conf.a, 16).toRed(this.red)\n this.b = new BigNumber(conf.b, 16).toRed(this.red)\n this.tinv = this.two.redInvm()\n\n this.zeroA = this.a.fromRed().cmpn(0) === 0\n this.threeA = this.a.fromRed().sub(this.p).cmpn(-3) === 0\n\n // If the curve is endomorphic, precalculate beta and lambda\n this.endo = this._getEndomorphism(conf)\n this._endoWnafT1 = Array.from({ length: 4 }, () => undefined as unknown as BigNumber)\n this._endoWnafT2 = Array.from({ length: 4 }, () => undefined as unknown as BigNumber)\n }\n\n _getEndomorphism(conf: EndomorphismConfig):\n | {\n beta: BigNumber\n lambda: BigNumber\n basis: Array<{ a: BigNumber; b: BigNumber }>\n }\n | undefined {\n // No efficient endomorphism\n if (!this.zeroA || this.p.modrn(3) !== 1) {\n return\n }\n\n const beta = this._resolveEndomorphismBeta(conf)\n const lambda = this._resolveEndomorphismLambda(conf, beta)\n return {\n beta,\n lambda,\n basis: this.#_resolveEndomorphismBasis(conf, lambda)\n }\n }\n\n private _resolveEndomorphismBeta(conf: EndomorphismConfig): BigNumber {\n if (conf.beta !== undefined) return new BigNumber(conf.beta, 16).toRed(this.red)\n const betas = this._getEndoRoots(this.p)\n if (betas == null) throw new Error('Failed to get endomorphism roots for beta.')\n const beta = betas[0].cmp(betas[1]) < 0 ? betas[0] : betas[1]\n return beta.toRed(this.red)\n }\n\n private _endomorphismLambdaMatches(\n lambda: BigNumber,\n beta: BigNumber,\n requireCoordinates = false\n ): boolean {\n if (this.g == null) throw new Error('Curve generator point (g) is not defined.')\n const gMulX = this.g.mul(lambda)?.x\n const gXRedMulBeta = this.g.x == null ? undefined : this.g.x.redMul(beta)\n if (gMulX == null || gXRedMulBeta == null) {\n if (requireCoordinates) {\n throw new Error(\n 'Lambda computation failed: g.mul(lambda).x or g.x.redMul(beta) is undefined.'\n )\n }\n return false\n }\n return gMulX.cmp(gXRedMulBeta) === 0\n }\n\n private _resolveEndomorphismLambda(conf: EndomorphismConfig, beta: BigNumber): BigNumber {\n if (conf.lambda !== undefined) return new BigNumber(conf.lambda, 16)\n const lambdas = this._getEndoRoots(this.n)\n if (lambdas == null) throw new Error('Failed to get endomorphism roots for lambda.')\n if (this._endomorphismLambdaMatches(lambdas[0], beta)) return lambdas[0]\n Curve.assert(\n this._endomorphismLambdaMatches(lambdas[1], beta, true),\n 'Lambda selection does not match computed beta.'\n )\n return lambdas[1]\n }\n\n #_resolveEndomorphismBasis(\n conf: EndomorphismConfig,\n lambda: BigNumber\n ): Array<{ a: BigNumber; b: BigNumber }> {\n if (typeof conf.basis !== 'object' || conf.basis === null) {\n return this._getEndoBasis(lambda)\n }\n return conf.basis.map(vec => ({\n a: new BigNumber(vec.a, 16),\n b: new BigNumber(vec.b, 16)\n }))\n }\n\n _getEndoRoots(num: BigNumber): [BigNumber, BigNumber] {\n // Find roots of for x^2 + x + 1 in F\n // Root = (-1 +- Sqrt(-3)) / 2\n //\n const red = num === this.p ? this.red : new MontgomoryMethod(num)\n const tinv = new BigNumber(2).toRed(red).redInvm()\n const ntinv = tinv.redNeg()\n\n const s = new BigNumber(3).toRed(red).redNeg().redSqrt().redMul(tinv)\n\n const l1 = ntinv.redAdd(s).fromRed()\n const l2 = ntinv.redSub(s).fromRed()\n return [l1, l2]\n }\n\n _getEndoBasis(\n lambda: BigNumber\n ): [{ a: BigNumber; b: BigNumber }, { a: BigNumber; b: BigNumber }] {\n // aprxSqrt >= sqrt(this.n)\n const aprxSqrt = this.n.ushrn(Math.floor(this.n.bitLength() / 2))\n\n // 3.74\n // Run EGCD, until r(L + 1) < aprxSqrt\n let u = lambda\n let v = this.n.clone()\n let x1 = new BigNumber(1)\n let y1 = new BigNumber(0)\n let x2 = new BigNumber(0)\n let y2 = new BigNumber(1)\n\n // NOTE: all vectors are roots of: a + b * lambda = 0 (mod n)\n let a0: BigNumber | undefined\n let b0: BigNumber | undefined\n // First vector\n let a1: BigNumber | undefined\n let b1: BigNumber | undefined\n // Second vector\n let a2: BigNumber\n let b2: BigNumber\n\n let prevR: BigNumber = new BigNumber(0)\n let i = 0\n let r: BigNumber = new BigNumber(0)\n let x: BigNumber = new BigNumber(0) // Ensure x is initialized\n\n while (u.cmpn(0) !== 0) {\n const q = v.div(u)\n r = v.sub(q.mul(u))\n x = x2.sub(q.mul(x1)) // Now TypeScript knows x is always assigned\n const y = y2.sub(q.mul(y1))\n\n if (a1 === undefined && r.cmp(aprxSqrt) < 0) {\n a0 = prevR.neg()\n b0 = x1\n a1 = r.neg()\n b1 = x\n } else if (a1 !== undefined && ++i === 2) {\n break\n }\n prevR = r\n\n v = u\n u = r\n x2 = x1\n x1 = x\n y2 = y1\n y1 = y\n }\n\n // Ensure a0 and b0 have been assigned\n if (a0 === undefined || b0 === undefined || a1 === undefined || b1 === undefined) {\n throw new Error('Failed to compute Endo Basis values')\n }\n\n a2 = r.neg()\n b2 = x\n\n const len1 = a1.sqr().add(b1.sqr())\n const len2 = a2.sqr().add(b2.sqr())\n\n if (len2.cmp(len1) >= 0) {\n a2 = a0\n b2 = b0\n }\n\n // Normalize signs\n if (a1.negative !== 0) {\n a1 = a1.neg()\n b1 = b1.neg()\n }\n if (a2.negative !== 0) {\n a2 = a2.neg()\n b2 = b2.neg()\n }\n\n return [\n { a: a1, b: b1 },\n { a: a2, b: b2 }\n ]\n }\n\n _endoSplit(k: BigNumber): { k1: BigNumber; k2: BigNumber } {\n if (this.endo == null) {\n throw new Error('Endomorphism is not defined.')\n }\n const basis = this.endo.basis\n const v1 = basis[0]\n const v2 = basis[1]\n\n const c1 = v2.b.mul(k).divRound(this.n)\n const c2 = v1.b.neg().mul(k).divRound(this.n)\n\n const p1 = c1.mul(v1.a)\n const p2 = c2.mul(v2.a)\n const q1 = c1.mul(v1.b)\n const q2 = c2.mul(v2.b)\n\n // Calculate answer\n const k1 = k.sub(p1).sub(p2)\n const k2 = q1.add(q2).neg()\n return { k1, k2 }\n }\n\n validate(point: Point): boolean {\n if (point.inf) {\n return true\n }\n\n const x = point.x\n const y = point.y\n\n // Ensure x and y are not null before proceeding\n if (x === null || y === null) {\n throw new Error('Point coordinates cannot be null')\n }\n\n const ax = this.a.redMul(x)\n const rhs = x.redSqr().redMul(x).redIAdd(ax).redIAdd(this.b)\n return y.redSqr().redISub(rhs).cmpn(0) === 0\n }\n}\n","import Curve from './Curve.js'\n\n/**\n * Base class for Point (affine coordinates) and JacobianPoint classes,\n * defining their curve and type.\n */\nexport default abstract class BasePoint {\n curve: Curve\n type: 'affine' | 'jacobian'\n precomputed: {\n doubles?: { step: number, points: BasePoint[] }\n naf?: { wnd: number, points: BasePoint[] }\n beta?: BasePoint | null\n } | null\n\n constructor (type: 'affine' | 'jacobian') {\n this.curve = new Curve() // Always initialized, so never null\n this.type = type\n this.precomputed = null\n }\n}\n","import BasePoint from './BasePoint.js'\nimport BigNumber from './BigNumber.js'\nimport Point from './Point.js'\n\ntype JacobianCoord = string | BigNumber | null\n\n/**\n * The `JacobianPoint` class extends the `BasePoint` class for handling Jacobian coordinates on an Elliptic Curve.\n * This class defines the properties and the methods needed to work with points in Jacobian coordinates.\n *\n * The Jacobian coordinates represent a point (x, y, z) on an Elliptic Curve such that the usual (x, y) coordinates are given by (x/z^2, y/z^3).\n *\n * @property x - The `x` coordinate of the point in the Jacobian form.\n * @property y - The `y` coordinate of the point in the Jacobian form.\n * @property z - The `z` coordinate of the point in the Jacobian form.\n * @property zOne - Flag that indicates if the `z` coordinate is one.\n *\n * @example\n * const pointJ = new JacobianPoint('3', '4', '1');\n */\nexport default class JacobianPoint extends BasePoint {\n x: BigNumber\n y: BigNumber\n z: BigNumber\n zOne: boolean\n\n /**\n * Constructs a new `JacobianPoint` instance.\n *\n * @param x - If `null`, the x-coordinate will default to the curve's defined 'one' constant.\n * If `x` is not a BigNumber, `x` will be converted to a `BigNumber` assuming it is a hex string.\n *\n * @param y - If `null`, the y-coordinate will default to the curve's defined 'one' constant.\n * If `y` is not a BigNumber, `y` will be converted to a `BigNumber` assuming it is a hex string.\n *\n * @param z - If `null`, the z-coordinate will default to 0.\n * If `z` is not a BigNumber, `z` will be converted to a `BigNumber` assuming it is a hex string.\n *\n * @example\n * const pointJ1 = new JacobianPoint(null, null, null); // creates point at infinity\n * const pointJ2 = new JacobianPoint('3', '4', '1'); // creates point (3, 4, 1)\n */\n constructor (\n x: JacobianCoord,\n y: JacobianCoord,\n z: JacobianCoord\n ) {\n super('jacobian')\n if (x === null && y === null && z === null) {\n this.x = this.curve.one\n this.y = this.curve.one\n this.z = new BigNumber(0)\n } else {\n if (!BigNumber.isBN(x)) {\n x = new BigNumber(x as string, 16)\n }\n this.x = x as BigNumber\n if (!BigNumber.isBN(y)) {\n y = new BigNumber(y as string, 16)\n }\n this.y = y as BigNumber\n if (!BigNumber.isBN(z)) {\n z = new BigNumber(z as string, 16)\n }\n this.z = z as BigNumber\n }\n if (this.x.red == null) {\n this.x = this.x.toRed(this.curve.red)\n }\n if (this.y.red == null) {\n this.y = this.y.toRed(this.curve.red)\n }\n if (this.z.red == null) {\n this.z = this.z.toRed(this.curve.red)\n }\n\n this.zOne = this.z === this.curve.one\n\n // --- Canonicalize point at infinity ---\n if (this.isInfinity()) {\n this.x = this.curve.one\n this.y = this.curve.one\n this.z = new BigNumber(0).toRed(this.curve.red)\n this.zOne = false\n }\n }\n\n /**\n * Converts the `JacobianPoint` object instance to standard affine `Point` format and returns `Point` type.\n *\n * @returns The `Point`(affine) object representing the same point as the original `JacobianPoint`.\n *\n * If the initial `JacobianPoint` represents point at infinity, an instance of `Point` at infinity is returned.\n *\n * @example\n * const pointJ = new JacobianPoint('3', '4', '1');\n * const pointP = pointJ.toP(); // The point in affine coordinates.\n */\n toP (): Point {\n if (this.isInfinity()) {\n return new Point(null, null)\n }\n\n const zinv = this.z.redInvm()\n const zinv2 = zinv.redSqr()\n const ax = this.x.redMul(zinv2)\n const ay = this.y.redMul(zinv2).redMul(zinv)\n\n return new Point(ax, ay)\n }\n\n /**\n * Negation operation. It returns the additive inverse of the Jacobian point.\n *\n * @method neg\n * @returns Returns a new Jacobian point as the result of the negation.\n *\n * @example\n * const jp = new JacobianPoint(x, y, z)\n * const result = jp.neg()\n */\n neg (): JacobianPoint {\n return new JacobianPoint(this.x, this.y.redNeg(), this.z)\n }\n\n /**\n * Addition operation in the Jacobian coordinates. It takes a Jacobian point as an argument\n * and returns a new Jacobian point as a result of the addition. In the special cases,\n * when either one of the points is the point at infinity, it will return the other point.\n *\n * @method add\n * @param p - The Jacobian point to be added.\n * @returns Returns a new Jacobian point as the result of the addition.\n *\n * @example\n * const p1 = new JacobianPoint(x1, y1, z1)\n * const p2 = new JacobianPoint(x2, y2, z2)\n * const result = p1.add(p2)\n */\n add (p: JacobianPoint): JacobianPoint {\n // O + P = P\n if (this.isInfinity()) {\n return p\n }\n\n // P + O = P\n if (p.isInfinity()) {\n return this\n }\n\n // 12M + 4S + 7A\n const pz2 = p.z.redSqr()\n const z2 = this.z.redSqr()\n const u1 = this.x.redMul(pz2)\n const u2 = p.x.redMul(z2)\n const s1 = this.y.redMul(pz2.redMul(p.z))\n const s2 = p.y.redMul(z2.redMul(this.z))\n\n const h = u1.redSub(u2)\n const r = s1.redSub(s2)\n if (h.cmpn(0) === 0) {\n if (r.cmpn(0) === 0) {\n return this.dbl()\n } else {\n return new JacobianPoint(null, null, null)\n }\n }\n\n const h2 = h.redSqr()\n const h3 = h2.redMul(h)\n const v = u1.redMul(h2)\n\n const nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v)\n const ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3))\n const nz = this.z.redMul(p.z).redMul(h)\n\n return new JacobianPoint(nx, ny, nz)\n }\n\n /**\n * Mixed addition operation. This function combines the standard point addition with\n * the transformation from the affine to Jacobian coordinates. It first converts\n * the affine point to Jacobian, and then preforms the addition.\n *\n * @method mixedAdd\n * @param p - The affine point to be added.\n * @returns Returns the result of the mixed addition as a new Jacobian point.\n *\n * @example\n * const jp = new JacobianPoint(x1, y1, z1)\n * const ap = new Point(x2, y2)\n * const result = jp.mixedAdd(ap)\n */\n mixedAdd (p: Point): JacobianPoint {\n // O + P = P\n if (this.isInfinity()) {\n return p.toJ()\n }\n\n // P + O = P\n if (p.isInfinity()) {\n return this\n }\n\n // Ensure x and y are not null\n if (p.x === null || p.y === null) {\n throw new Error('Point coordinates cannot be null')\n }\n\n // 8M + 3S + 7A\n const z2 = this.z.redSqr()\n const u1 = this.x\n const u2 = p.x.redMul(z2)\n const s1 = this.y\n const s2 = p.y.redMul(z2).redMul(this.z)\n\n const h = u1.redSub(u2)\n const r = s1.redSub(s2)\n if (h.cmpn(0) === 0) {\n if (r.cmpn(0) === 0) {\n return this.dbl()\n } else {\n return new JacobianPoint(null, null, null)\n }\n }\n\n const h2 = h.redSqr()\n const h3 = h2.redMul(h)\n const v = u1.redMul(h2)\n\n const nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v)\n const ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3))\n const nz = this.z.redMul(h)\n\n return new JacobianPoint(nx, ny, nz)\n }\n\n /**\n * Multiple doubling operation. It doubles the Jacobian point as many times as the pow parameter specifies. If pow is 0 or the point is the point at infinity, it will return the point itself.\n *\n * @method dblp\n * @param pow - The number of times the point should be doubled.\n * @returns Returns a new Jacobian point as the result of multiple doublings.\n *\n * @example\n * const jp = new JacobianPoint(x, y, z)\n * const result = jp.dblp(3)\n */\n dblp (pow: number): JacobianPoint {\n if (pow === 0) {\n return this\n }\n if (this.isInfinity()) {\n return this\n }\n if (pow === undefined) {\n return this.dbl()\n }\n\n /* eslint-disable @typescript-eslint/no-this-alias */\n let r = this as JacobianPoint\n for (let i = 0; i < pow; i++) {\n r = r.dbl()\n }\n return r\n }\n\n /**\n * Point doubling operation in the Jacobian coordinates. A special case is when the point is the point at infinity, in this case, this function will return the point itself.\n *\n * @method dbl\n * @returns Returns a new Jacobian point as the result of the doubling.\n *\n * @example\n * const jp = new JacobianPoint(x, y, z)\n * const result = jp.dbl()\n */\n dbl (): JacobianPoint {\n if (this.isInfinity()) {\n return this\n }\n\n let nx\n let ny\n let nz\n // Z = 1\n if (this.zOne) {\n // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html\n // #doubling-mdbl-2007-bl\n // 1M + 5S + 14A\n\n // XX = X1^2\n const xx = this.x.redSqr()\n // YY = Y1^2\n const yy = this.y.redSqr()\n // YYYY = YY^2\n const yyyy = yy.redSqr()\n // S = 2 * ((X1 + YY)^2 - XX - YYYY)\n let s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy)\n s = s.redIAdd(s)\n // M = 3 * XX + a; a = 0\n const m = xx.redAdd(xx).redIAdd(xx)\n // T = M ^ 2 - 2*S\n const t = m.redSqr().redISub(s).redISub(s)\n\n // 8 * YYYY\n let yyyy8 = yyyy.redIAdd(yyyy)\n yyyy8 = yyyy8.redIAdd(yyyy8)\n yyyy8 = yyyy8.redIAdd(yyyy8)\n\n // X3 = T\n nx = t\n // Y3 = M * (S - T) - 8 * YYYY\n ny = m.redMul(s.redISub(t)).redISub(yyyy8)\n // Z3 = 2*Y1\n nz = this.y.redAdd(this.y)\n } else {\n // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html\n // #doubling-dbl-2009-l\n // 2M + 5S + 13A\n\n // A = X1^2\n const a = this.x.redSqr()\n // B = Y1^2\n const b = this.y.redSqr()\n // C = B^2\n const c = b.redSqr()\n // D = 2 * ((X1 + B)^2 - A - C)\n let d = this.x.redAdd(b).redSqr().redISub(a).redISub(c)\n d = d.redIAdd(d)\n // E = 3 * A\n const e = a.redAdd(a).redIAdd(a)\n // F = E^2\n const f = e.redSqr()\n\n // 8 * C\n let c8 = c.redIAdd(c)\n c8 = c8.redIAdd(c8)\n c8 = c8.redIAdd(c8)\n\n // X3 = F - 2 * D\n nx = f.redISub(d).redISub(d)\n // Y3 = E * (D - X3) - 8 * C\n ny = e.redMul(d.redISub(nx)).redISub(c8)\n // Z3 = 2 * Y1 * Z1\n nz = this.y.redMul(this.z)\n nz = nz.redIAdd(nz)\n }\n\n return new JacobianPoint(nx, ny, nz)\n }\n\n /**\n * Equality check operation. It checks whether the affine or Jacobian point is equal to this Jacobian point.\n *\n * @method eq\n * @param p - The affine or Jacobian point to compare with.\n * @returns Returns true if the points are equal, otherwise returns false.\n *\n * @example\n * const jp1 = new JacobianPoint(x1, y1, z1)\n * const jp2 = new JacobianPoint(x2, y2, z2)\n * const areEqual = jp1.eq(jp2)\n */\n eq (p: Point | JacobianPoint): boolean {\n if (p.type === 'affine') {\n return this.eq((p as Point).toJ())\n }\n\n if (this === p) {\n return true\n }\n\n p = p as JacobianPoint\n\n // --- Infinity handling ---\n if (this.isInfinity() && p.isInfinity()) {\n return true\n }\n if (this.isInfinity() !== p.isInfinity()) {\n return false\n }\n\n // x1 * z2^2 == x2 * z1^2\n const z2 = this.z.redSqr()\n const pz2 = p.z.redSqr()\n if (this.x.redMul(pz2).redISub(p.x.redMul(z2)).cmpn(0) !== 0) {\n return false\n }\n\n // y1 * z2^3 == y2 * z1^3\n const z3 = z2.redMul(this.z)\n const pz3 = pz2.redMul(p.z)\n return this.y.redMul(pz3).redISub(p.y.redMul(z3)).cmpn(0) === 0\n }\n\n /**\n * Equality check operation in relation to an x coordinate of a point in projective coordinates.\n * It checks whether the x coordinate of the Jacobian point is equal to the provided x coordinate\n * of a point in projective coordinates.\n *\n * @method eqXToP\n * @param x - The x coordinate of a point in projective coordinates.\n * @returns Returns true if the x coordinates are equal, otherwise returns false.\n *\n * @example\n * const jp = new JacobianPoint(x1, y1, z1)\n * const isXEqual = jp.eqXToP(x2)\n */\n eqXToP (x: BigNumber): boolean {\n const zs = this.z.redSqr()\n const rx = x.toRed(this.curve?.red).redMul(zs)\n\n if (this.x.cmp(rx) === 0) {\n return true\n }\n\n const xc = x.clone()\n if (this.curve?.redN == null) {\n throw new Error('Curve or redN is not initialized.')\n }\n\n const t = this.curve.redN.redMul(zs)\n\n while (xc.cmp(this.curve.p) < 0) {\n xc.iadd(this.curve.n)\n if (xc.cmp(this.curve.p) >= 0) {\n return false\n }\n\n rx.redIAdd(t)\n if (this.x.cmp(rx) === 0) {\n return true\n }\n }\n\n // ✅ Ensure function always returns a boolean\n return false\n }\n\n /**\n * Returns the string representation of the JacobianPoint instance.\n * @method inspect\n * @returns Returns the string description of the JacobianPoint. If the JacobianPoint represents a point at infinity, the return value of this function is '<EC JPoint Infinity>'. For a normal point, it returns the string description format as '<EC JPoint x: x-coordinate y: y-coordinate z: z-coordinate>'.\n *\n * @example\n * const point = new JacobianPoint('5', '6', '1');\n * console.log(point.inspect()); // Output: '<EC JPoint x: 5 y: 6 z: 1>'\n */\n inspect (): string {\n if (this.isInfinity()) {\n return '<EC JPoint Infinity>'\n }\n return (\n '<EC JPoint x: ' +\n this.x.toString(16, 2) +\n ' y: ' +\n this.y.toString(16, 2) +\n ' z: ' +\n this.z.toString(16, 2) +\n '>'\n )\n }\n\n /**\n * Checks whether the JacobianPoint instance represents a point at infinity.\n * @method isInfinity\n * @returns Returns true if the JacobianPoint's z-coordinate equals to zero (which represents the point at infinity in Jacobian coordinates). Returns false otherwise.\n *\n * @example\n * const point = new JacobianPoint('5', '6', '0');\n * console.log(point.isInfinity()); // Output: true\n */\n isInfinity (): boolean {\n return this.z.cmpn(0) === 0\n }\n}\n","import BasePoint from './BasePoint.js'\nimport JPoint from './JacobianPoint.js'\nimport BigNumber from './BigNumber.js'\nimport { toArray, toHex } from './utils.js'\n\nfunction ctSwap(swap: bigint, a: JacobianPointBI, b: JacobianPointBI): void {\n const mask = -swap\n const swapX = (a.X ^ b.X) & mask\n const swapY = (a.Y ^ b.Y) & mask\n const swapZ = (a.Z ^ b.Z) & mask\n\n a.X ^= swapX\n b.X ^= swapX\n a.Y ^= swapY\n b.Y ^= swapY\n a.Z ^= swapZ\n b.Z ^= swapZ\n}\n\n// -----------------------------------------------------------------------------\n// BigInt helpers & constants (secp256k1) – hoisted so we don't recreate them on\n// every Point.mul() call.\n// -----------------------------------------------------------------------------\nexport const BI_ZERO = 0n\nexport const BI_ONE = 1n\nexport const BI_TWO = 2n\nexport const BI_THREE = 3n\nexport const BI_FOUR = 4n\nexport const BI_EIGHT = 8n\n\nexport const P_BIGINT = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2fn\nexport const N_BIGINT = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141n\nexport const MASK_256 = (1n << 256n) - 1n // 0xffff…ffff (256 sones)\n\nexport function red(x: bigint): bigint {\n // first fold\n let hi = x >> 256n\n x = (x & MASK_256) + (hi << 32n) + hi * 977n\n\n // second fold (hi ≤ 2³² + 977 here, so one more pass is enough)\n hi = x >> 256n\n x = (x & MASK_256) + (hi << 32n) + hi * 977n\n\n // final conditional subtraction\n if (x >= P_BIGINT) x -= P_BIGINT\n return x\n}\n\nexport const biMod = (a: bigint): bigint => red(((a % P_BIGINT) + P_BIGINT) % P_BIGINT)\nexport const biModSub = (a: bigint, b: bigint): bigint => (a >= b ? a - b : P_BIGINT - (b - a))\nexport const biModMul = (a: bigint, b: bigint): bigint => red(a * b)\nexport const biModAdd = (a: bigint, b: bigint): bigint => red(a + b)\nexport const biModInv = (a: bigint): bigint => {\n // binary‑ext GCD\n let lm = BI_ONE\n let hm = BI_ZERO\n let low = biMod(a)\n let high = P_BIGINT\n while (low > BI_ONE) {\n const r = high / low\n ;[lm, hm] = [hm - lm * r, lm]\n ;[low, high] = [high - low * r, low]\n }\n return biMod(lm)\n}\nexport const biModSqr = (a: bigint): bigint => biModMul(a, a)\n\nexport const biModPow = (base: bigint, exp: bigint): bigint => {\n let result = 1n\n base = biMod(base)\n\n while (exp > 0n) {\n if ((exp & 1n) !== 0n) {\n result = biModMul(result, base)\n }\n base = biModMul(base, base)\n exp >>= 1n\n }\n\n return result\n}\n\nexport const P_PLUS1_DIV4 = (P_BIGINT + 1n) >> 2n\ntype PointInput = BigNumber | number | number[] | string\n\ninterface WnafPairContext {\n points: Point[]\n coeffs: BigNumber[]\n wndWidth: number[]\n wnd: Point[][]\n naf: number[][]\n currentMax: number\n}\n\nexport const biModSqrt = (a: bigint): bigint | null => {\n const r = biModPow(a, P_PLUS1_DIV4)\n\n if (biModMul(r, r) !== biMod(a)) {\n return null\n }\n\n return r\n}\n\nconst toBigInt = (x: PointInput): bigint => {\n if (BigNumber.isBN(x)) return BigInt('0x' + (x as BigNumber).toString(16))\n if (typeof x === 'string') return BigInt('0x' + x)\n if (Array.isArray(x)) return BigInt('0x' + toHex(x))\n return BigInt(x as number)\n}\n\n// Generator point coordinates as bigint constants\nexport const GX_BIGINT = BigInt(\n '0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798'\n)\nexport const GY_BIGINT = BigInt(\n '0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8'\n)\n\n// Cache for precomputed windowed tables keyed by 'window:x:y'\nconst WNAF_TABLE_CACHE: Map<string, JacobianPointBI[]> = new Map()\n\nexport interface JacobianPointBI {\n X: bigint\n Y: bigint\n Z: bigint\n}\n\nexport const jpDouble = (P: JacobianPointBI): JacobianPointBI => {\n const { X: X1, Y: Y1, Z: Z1 } = P\n if (Y1 === BI_ZERO) return { X: BI_ZERO, Y: BI_ONE, Z: BI_ZERO }\n\n const Y1sq = biModMul(Y1, Y1)\n const S = biModMul(BI_FOUR, biModMul(X1, Y1sq))\n const M = biModMul(BI_THREE, biModMul(X1, X1))\n const X3 = biModSub(biModMul(M, M), biModMul(BI_TWO, S))\n const Y3 = biModSub(biModMul(M, biModSub(S, X3)), biModMul(BI_EIGHT, biModMul(Y1sq, Y1sq)))\n const Z3 = biModMul(BI_TWO, biModMul(Y1, Z1))\n return { X: X3, Y: Y3, Z: Z3 }\n}\n\n// NOTE:\n// jpAdd contains conditional branches.\n// In mulCT, jpAdd and jpDouble are executed in a fixed pattern\n// independent of scalar bits, satisfying TOB-4 constant-time requirements.\nexport const jpAdd = (P: JacobianPointBI, Q: JacobianPointBI): JacobianPointBI => {\n if (P.Z === BI_ZERO) return Q\n if (Q.Z === BI_ZERO) return P\n\n const Z1Z1 = biModMul(P.Z, P.Z)\n const Z2Z2 = biModMul(Q.Z, Q.Z)\n const U1 = biModMul(P.X, Z2Z2)\n const U2 = biModMul(Q.X, Z1Z1)\n const S1 = biModMul(P.Y, biModMul(Z2Z2, Q.Z))\n const S2 = biModMul(Q.Y, biModMul(Z1Z1, P.Z))\n\n const H = biModSub(U2, U1)\n const r = biModSub(S2, S1)\n if (H === BI_ZERO) {\n if (r === BI_ZERO) return jpDouble(P)\n return { X: BI_ZERO, Y: BI_ONE, Z: BI_ZERO } // Infinity\n }\n\n const HH = biModMul(H, H)\n const HHH = biModMul(H, HH)\n const V = biModMul(U1, HH)\n\n const X3 = biModSub(biModSub(biModMul(r, r), HHH), biModMul(BI_TWO, V))\n const Y3 = biModSub(biModMul(r, biModSub(V, X3)), biModMul(S1, HHH))\n const Z3 = biModMul(H, biModMul(P.Z, Q.Z))\n return { X: X3, Y: Y3, Z: Z3 }\n}\n\nexport const jpNeg = (P: JacobianPointBI): JacobianPointBI => {\n if (P.Z === BI_ZERO) return P\n return { X: P.X, Y: P_BIGINT - P.Y, Z: P.Z }\n}\n\nconst wnafTable = (window: number, P0: { x: bigint; y: bigint }): JacobianPointBI[] => {\n const key = `${window}:${P0.x.toString(16)}:${P0.y.toString(16)}`\n const cached = WNAF_TABLE_CACHE.get(key)\n if (cached !== undefined) return cached\n\n const table = Array.from<unknown, JacobianPointBI>({ length: 1 << (window - 1) }, () => ({\n X: BI_ZERO,\n Y: BI_ONE,\n Z: BI_ZERO\n }))\n const point: JacobianPointBI = { X: P0.x, Y: P0.y, Z: BI_ONE }\n table[0] = point\n const doubled = jpDouble(point)\n for (let i = 1; i < table.length; i++) {\n table[i] = jpAdd(table[i - 1], doubled)\n }\n WNAF_TABLE_CACHE.set(key, table)\n return table\n}\n\nconst wnafDigits = (scalar: bigint, window: number): number[] => {\n const digits: number[] = []\n const windowSize = 1n << BigInt(window)\n const halfWindow = windowSize >> 1n\n let remaining = scalar\n while (remaining > 0n) {\n if ((remaining & BI_ONE) === BI_ZERO) {\n digits.push(0)\n } else {\n let digit = remaining & (windowSize - 1n)\n if (digit > halfWindow) digit -= windowSize\n digits.push(Number(digit))\n remaining -= digit\n }\n remaining >>= BI_ONE\n }\n return digits\n}\n\n// Fast windowed-NAF scalar multiplication (default window = 5) in Jacobian\n// coordinates. Returns Q = k * P0 as a JacobianPoint.\nexport const scalarMultiplyWNAF = (\n k: bigint,\n P0: { x: bigint; y: bigint },\n window: number = 5\n): JacobianPointBI => {\n const table = wnafTable(window, P0)\n const wnaf = wnafDigits(k, window)\n\n // Accumulate from MSB to LSB\n let Q: JacobianPointBI = { X: BI_ZERO, Y: BI_ONE, Z: BI_ZERO } // infinity\n for (let i = wnaf.length - 1; i >= 0; i--) {\n Q = jpDouble(Q)\n const di = wnaf[i]\n if (di !== 0) {\n const idx = Math.abs(di) >> 1 // (|di|-1)/2 because di is odd\n const addend = di > 0 ? table[idx] : jpNeg(table[idx])\n Q = jpAdd(Q, addend)\n }\n }\n return Q\n}\n\nexport const modN = (a: bigint): bigint => {\n let r = a % N_BIGINT\n if (r < 0n) r += N_BIGINT\n return r\n}\nexport const modMulN = (a: bigint, b: bigint): bigint => modN(a * b)\n\n/** modular inverse modulo n with plain extended‑gcd (not constant‑time) */\nexport const modInvN = (a: bigint): bigint => {\n let lm = 1n\n let hm = 0n\n let low = modN(a)\n let high = N_BIGINT\n while (low > 1n) {\n const q = high / low\n ;[lm, hm] = [hm - lm * q, lm]\n ;[low, high] = [high - low * q, low]\n }\n return modN(lm)\n}\n\n/**\n * `Point` class is a representation of an elliptic curve point with affine coordinates.\n * It extends the functionality of BasePoint and carries x, y coordinates of point on the curve.\n * It also introduces new methods for handling Point operations in elliptic curve.\n *\n * @class Point\n * @extends {BasePoint}\n *\n * @property x - The x-coordinate of the point.\n * @property y - The y-coordinate of the point.\n * @property inf - Flag to record if the point is at infinity in the Elliptic Curve.\n */\nexport default class Point extends BasePoint {\n x: BigNumber | null\n y: BigNumber | null\n inf: boolean\n\n static _assertOnCurve(p: Point): Point {\n if (!p.validate()) {\n throw new Error('Invalid point')\n }\n return p\n }\n\n /**\n * Creates a point object from a given Array. These numbers can represent coordinates in hex format, or points\n * in multiple established formats.\n * The function verifies the integrity of the provided data and throws errors if inconsistencies are found.\n *\n * @method fromDER\n * @static\n * @param bytes - The point representation number array.\n * @returns Returns a new point representing the given string.\n * @throws `Error` If the point number[] value has a wrong length.\n * @throws `Error` If the point format is unknown.\n *\n * @example\n * const derPoint = [ 2, 18, 123, 108, 125, 83, 1, 251, 164, 214, 16, 119, 200, 216, 210, 193, 251, 193, 129, 67, 97, 146, 210, 216, 77, 254, 18, 6, 150, 190, 99, 198, 128 ];\n * const point = Point.fromDER(derPoint);\n */\n static fromDER(bytes: number[]): Point {\n const len = 32\n if (\n (bytes[0] === 0x04 || bytes[0] === 0x06 || bytes[0] === 0x07) &&\n bytes.length - 1 === 2 * len\n ) {\n if (bytes[0] === 0x06) {\n if (bytes.at(-1)! % 2 !== 0) {\n throw new Error('Point string value is wrong length')\n }\n } else if (bytes[0] === 0x07) {\n if (bytes.at(-1)! % 2 !== 1) {\n throw new Error('Point string value is wrong length')\n }\n }\n\n const res = new Point(bytes.slice(1, 1 + len), bytes.slice(1 + len, 1 + 2 * len))\n\n return Point._assertOnCurve(res)\n } else if ((bytes[0] === 0x02 || bytes[0] === 0x03) && bytes.length - 1 === len) {\n return Point._assertOnCurve(Point.fromX(bytes.slice(1, 1 + len), bytes[0] === 0x03))\n }\n throw new Error('Unknown point format')\n }\n\n /**\n * Creates a point object from a given string. This string can represent coordinates in hex format, or points\n * in multiple established formats.\n * The function verifies the integrity of the provided data and throws errors if inconsistencies are found.\n *\n * @method fromString\n * @static\n *\n * @param str The point representation string.\n * @returns Returns a new point representing the given string.\n * @throws `Error` If the point string value has a wrong length.\n * @throws `Error` If the point format is unknown.\n *\n * @example\n * const pointStr = 'abcdef';\n * const point = Point.fromString(pointStr);\n */\n static fromString(str: string): Point {\n const bytes = toArray(str, 'hex')\n return Point._assertOnCurve(Point.fromDER(bytes))\n }\n\n /**\n * Generates a point from an x coordinate and a boolean indicating whether the corresponding\n * y coordinate is odd.\n *\n * @method fromX\n * @static\n * @param x - The x coordinate of the point.\n * @param odd - Boolean indicating whether the corresponding y coordinate is odd or not.\n * @returns Returns the new point.\n * @throws `Error` If the point is invalid.\n *\n * @example\n * const xCoordinate = new BigNumber('10');\n * const point = Point.fromX(xCoordinate, true);\n */\n static fromX(x: PointInput, odd: boolean): Point {\n let xBigInt = toBigInt(x)\n xBigInt = biMod(xBigInt)\n\n const y2 = biModAdd(biModMul(biModSqr(xBigInt), xBigInt), 7n)\n const y = biModSqrt(y2)\n if (y === null) {\n throw new Error('Invalid point')\n }\n\n let yBig = y\n if ((yBig & BI_ONE) !== (odd ? BI_ONE : BI_ZERO)) {\n yBig = biModSub(P_BIGINT, yBig)\n }\n\n const xBN = new BigNumber(xBigInt.toString(16), 16)\n const yBN = new BigNumber(yBig.toString(16), 16)\n\n return Point._assertOnCurve(new Point(xBN, yBN))\n }\n\n /**\n * Generates a point from a serialized JSON object. The function accounts for different options in the JSON object,\n * including precomputed values for optimization of EC operations, and calls another helper function to turn nested\n * JSON points into proper Point objects.\n *\n * @method fromJSON\n * @static\n * @param obj - An object or array that holds the data for the point.\n * @param isRed - A boolean to direct how the Point is constructed from the JSON object.\n * @returns Returns a new point based on the deserialized JSON object.\n *\n * @example\n * const serializedPoint = '{\"x\":52,\"y\":15}';\n * const point = Point.fromJSON(serializedPoint, true);\n */\n static fromJSON(obj: string | any[], isRed: boolean): Point {\n if (typeof obj === 'string') {\n obj = JSON.parse(obj)\n }\n\n let res = new Point(obj[0], obj[1], isRed)\n res = Point._assertOnCurve(res)\n\n if (typeof obj[2] !== 'object' || obj[2] === null) {\n return res\n }\n\n const pre = obj[2]\n\n const obj2point = (p: [PointInput, PointInput]): Point => {\n const pt = new Point(p[0], p[1], isRed)\n return Point._assertOnCurve(pt)\n }\n\n res.precomputed = {\n beta: null,\n\n doubles:\n typeof pre.doubles === 'object' && pre.doubles !== null\n ? {\n step: pre.doubles.step,\n points: [res].concat(pre.doubles.points.map(obj2point))\n }\n : undefined,\n\n naf:\n typeof pre.naf === 'object' && pre.naf !== null\n ? {\n wnd: pre.naf.wnd,\n points: [res].concat(pre.naf.points.map(obj2point))\n }\n : undefined\n }\n\n return res\n }\n\n /**\n * @constructor\n * @param x - The x-coordinate of the point. May be a number, a BigNumber, a string (which will be interpreted as hex), a number array, or null. If null, an \"Infinity\" point is constructed.\n * @param y - The y-coordinate of the point, similar to x.\n * @param isRed - A boolean indicating if the point is a member of the field of integers modulo the k256 prime. Default is true.\n *\n * @example\n * new Point('abc123', 'def456');\n * new Point(null, null); // Generates Infinity point.\n */\n constructor(x: PointInput | null, y: PointInput | null, isRed: boolean = true) {\n super('affine')\n this.precomputed = null\n if (x === null && y === null) {\n this.x = null\n this.y = null\n this.inf = true\n } else {\n if (!BigNumber.isBN(x)) {\n x = new BigNumber(x as number, 16)\n }\n this.x = x as BigNumber\n if (!BigNumber.isBN(y)) {\n y = new BigNumber(y as number, 16)\n }\n this.y = y as BigNumber\n // Force redgomery representation when loading from JSON\n if (isRed) {\n this.x.forceRed(this.curve.red)\n this.y.forceRed(this.curve.red)\n }\n if (this.x.red === null) {\n this.x = this.x.toRed(this.curve.red)\n }\n if (this.y.red === null) {\n this.y = this.y.toRed(this.curve.red)\n }\n this.inf = false\n }\n }\n\n /**\n * Validates if a point belongs to the curve. Follows the short Weierstrass\n * equation for elliptic curves: y^2 = x^3 + ax + b.\n *\n * @method validate\n * @returns {boolean} true if the point is on the curve, false otherwise.\n *\n * @example\n * const aPoint = new Point(x, y);\n * const isValid = aPoint.validate();\n */\n validate(): boolean {\n if (this.inf || this.x == null || this.y == null) return false\n\n try {\n const xBig = BigInt('0x' + this.x.fromRed().toString(16))\n const yBig = BigInt('0x' + this.y.fromRed().toString(16))\n\n // compute y² and x³ + 7 using bigint-secure field ops\n const lhs = biModMul(yBig, yBig)\n const rhs = biModAdd(biModMul(biModMul(xBig, xBig), xBig), 7n)\n\n return lhs === rhs\n } catch {\n return false\n }\n }\n\n /**\n * Encodes the coordinates of a point into an array or a hexadecimal string.\n * The details of encoding are determined by the optional compact and enc parameters.\n *\n * @method encode\n * @param compact - If true, an additional prefix byte 0x02 or 0x03 based on the 'y' coordinate being even or odd respectively is used. If false, byte 0x04 is used.\n * @param enc - Expects the string 'hex' if hexadecimal string encoding is required instead of an array of numbers.\n * @throws Will throw an error if the specified encoding method is not recognized. Expects 'hex'.\n * @returns If enc is undefined, a byte array representation of the point will be returned. if enc is 'hex', a hexadecimal string representation of the point will be returned.\n *\n * @example\n * const aPoint = new Point(x, y);\n * const encodedPointArray = aPoint.encode();\n * const encodedPointHex = aPoint.encode(true, 'hex');\n */\n encode(compact: boolean = true, enc?: 'hex'): number[] | string {\n if (this.inf) {\n if (enc === 'hex') return '00'\n return [0x00]\n }\n const len = this.curve.p.byteLength()\n const x = this.getX().toArray('be', len)\n let res: number[]\n if (compact) {\n res = [this.getY().isEven() ? 0x02 : 0x03].concat(x)\n } else {\n res = [0x04].concat(x, this.getY().toArray('be', len))\n }\n if (enc === 'hex') {\n return toHex(res)\n } else {\n return res\n }\n }\n\n /**\n * Converts the point coordinates to a hexadecimal string. A wrapper method\n * for encode. Byte 0x02 or 0x03 is used as prefix based on the 'y' coordinate being even or odd respectively.\n *\n * @method toString\n * @returns {string} A hexadecimal string representation of the point coordinates.\n *\n * @example\n * const aPoint = new Point(x, y);\n * const stringPoint = aPoint.toString();\n */\n override toString(): string {\n return this.encode(true, 'hex') as string\n }\n\n /**\n * Exports the x and y coordinates of the point, and the precomputed doubles and non-adjacent form (NAF) for optimization. The output is an array.\n *\n * @method toJSON\n * @returns An Array where first two elements are the coordinates of the point and optional third element is an object with doubles and NAF points.\n *\n * @example\n * const aPoint = new Point(x, y);\n * const jsonPoint = aPoint.toJSON();\n */\n toJSON(): [\n BigNumber | null,\n BigNumber | null,\n {\n doubles: { step: any; points: any[] } | undefined\n naf: { wnd: any; points: any[] } | undefined\n }?\n ] {\n if (this.precomputed == null) {\n return [this.x, this.y]\n }\n\n return [\n this.x,\n this.y,\n typeof this.precomputed === 'object' && this.precomputed !== null\n ? {\n doubles:\n this.precomputed.doubles == null\n ? undefined\n : {\n step: this.precomputed.doubles.step,\n points: this.precomputed.doubles.points.slice(1)\n },\n naf:\n this.precomputed.naf == null\n ? undefined\n : {\n wnd: this.precomputed.naf.wnd,\n points: this.precomputed.naf.points.slice(1)\n }\n }\n : undefined\n ]\n }\n\n /**\n * Provides the point coordinates in a human-readable string format for debugging purposes.\n *\n * @method inspect\n * @returns String of the format '<EC Point x: x-coordinate y: y-coordinate>', or '<EC Point Infinity>' if the point is at infinity.\n *\n * @example\n * const aPoint = new Point(x, y);\n * console.log(aPoint.inspect());\n */\n inspect(): string {\n if (this.isInfinity()) {\n return '<EC Point Infinity>'\n }\n return (\n '<EC Point x: ' +\n (this.x?.fromRed()?.toString(16, 2) ?? 'undefined') +\n ' y: ' +\n (this.y?.fromRed()?.toString(16, 2) ?? 'undefined') +\n '>'\n )\n }\n\n /**\n * Checks if the point is at infinity.\n * @method isInfinity\n * @returns Returns whether or not the point is at infinity.\n *\n * @example\n * const p = new Point(null, null);\n * console.log(p.isInfinity()); // outputs: true\n */\n isInfinity(): boolean {\n return this.inf\n }\n\n /**\n * Adds another Point to this Point, returning a new Point.\n *\n * @method add\n * @param p - The Point to add to this one.\n * @returns A new Point that results from the addition.\n *\n * @example\n * const p1 = new Point(1, 2);\n * const p2 = new Point(2, 3);\n * const result = p1.add(p2);\n */\n add(p: Point): Point {\n // O + P = P\n if (this.inf) {\n return p\n }\n\n // P + O = P\n if (p.inf) {\n return this\n }\n\n // P + P = 2P\n if (this.eq(p)) {\n return this.dbl()\n }\n\n // P + (-P) = O\n if (this.neg().eq(p)) {\n return new Point(null, null)\n }\n\n // P + Q = O\n if (this.x?.cmp(p.x ?? new BigNumber(0)) === 0) {\n return new Point(null, null)\n }\n\n const P1 = {\n X: BigInt('0x' + (this.x as BigNumber).fromRed().toString(16)),\n Y: BigInt('0x' + (this.y as BigNumber).fromRed().toString(16)),\n Z: BI_ONE\n }\n const Q1 = {\n X: BigInt('0x' + (p.x as BigNumber).fromRed().toString(16)),\n Y: BigInt('0x' + (p.y as BigNumber).fromRed().toString(16)),\n Z: BI_ONE\n }\n const R = jpAdd(P1, Q1)\n if (R.Z === BI_ZERO) return new Point(null, null)\n const zInv = biModInv(R.Z)\n const zInv2 = biModMul(zInv, zInv)\n const xRes = biModMul(R.X, zInv2)\n const yRes = biModMul(R.Y, biModMul(zInv2, zInv))\n return new Point(xRes.toString(16), yRes.toString(16))\n }\n\n /**\n * Doubles the current point.\n *\n * @method dbl\n *\n * @example\n * const P = new Point('123', '456');\n * const result = P.dbl();\n * */\n dbl(): Point {\n if (this.inf) return this\n if (this.x === null || this.y === null) {\n throw new Error('Point coordinates cannot be null')\n }\n\n const X = BigInt('0x' + this.x.fromRed().toString(16))\n const Y = BigInt('0x' + this.y.fromRed().toString(16))\n if (Y === BI_ZERO) return new Point(null, null)\n\n const R = jpDouble({ X, Y, Z: BI_ONE })\n const zInv = biModInv(R.Z)\n const zInv2 = biModMul(zInv, zInv)\n const xRes = biModMul(R.X, zInv2)\n const yRes = biModMul(R.Y, biModMul(zInv2, zInv))\n return new Point(xRes.toString(16), yRes.toString(16))\n }\n\n /**\n * Returns X coordinate of point\n *\n * @example\n * const P = new Point('123', '456');\n * const x = P.getX();\n */\n getX(): BigNumber {\n return (this.x ?? new BigNumber(0)).fromRed()\n }\n\n /**\n * Returns X coordinate of point\n *\n * @example\n * const P = new Point('123', '456');\n * const x = P.getX();\n */\n getY(): BigNumber {\n return (this.y ?? new BigNumber(0)).fromRed()\n }\n\n /**\n * Multiplies this Point by a scalar value, returning a new Point.\n *\n * @method mul\n * @param k - The scalar value to multiply this Point by.\n * @returns A new Point that results from the multiplication.\n *\n * @example\n * const p = new Point(1, 2);\n * const result = p.mul(2); // this doubles the Point\n */\n mul(k: PointInput): Point {\n if (!BigNumber.isBN(k)) {\n k = new BigNumber(k as number, 16)\n }\n k = k as BigNumber\n if (this.inf) {\n return this\n }\n\n const isNeg = k.isNeg()\n const kAbs = isNeg ? k.neg() : k\n let kBig = BigInt('0x' + kAbs.toString(16))\n\n kBig = biMod(kBig)\n if (kBig === BI_ZERO) {\n return new Point(null, null)\n }\n if (kBig === BI_ZERO) {\n return new Point(null, null)\n }\n\n if (this.x === null || this.y === null) {\n throw new Error('Point coordinates cannot be null')\n }\n\n let Px: bigint\n let Py: bigint\n if (this === this.curve.g) {\n Px = GX_BIGINT\n Py = GY_BIGINT\n } else {\n Px = BigInt('0x' + this.x.fromRed().toString(16))\n Py = BigInt('0x' + this.y.fromRed().toString(16))\n }\n\n const R = scalarMultiplyWNAF(kBig, { x: Px, y: Py })\n if (R.Z === BI_ZERO) {\n return new Point(null, null)\n }\n const zInv = biModInv(R.Z)\n const zInv2 = biModMul(zInv, zInv)\n const xRes = biModMul(R.X, zInv2)\n const yRes = biModMul(R.Y, biModMul(zInv2, zInv))\n\n const xBN = new BigNumber(xRes.toString(16), 16)\n const yBN = new BigNumber(yRes.toString(16), 16)\n const result = new Point(xBN, yBN)\n if (isNeg) {\n return result.neg()\n }\n return result\n }\n\n mulCT(k: PointInput): Point {\n if (!BigNumber.isBN(k)) {\n k = new BigNumber(k as any, 16)\n }\n k = k as BigNumber\n\n if (this.inf) return new Point(null, null)\n\n // ✅ SAFE sign handling (this is the fix)\n const isNeg = k.isNeg()\n const kAbs = isNeg ? k.neg() : k\n let kBig = BigInt('0x' + kAbs.toString(16))\n\n kBig = biMod(kBig)\n if (kBig === 0n) return new Point(null, null)\n\n const Px = this === this.curve.g ? GX_BIGINT : BigInt('0x' + this.getX().toString(16))\n\n const Py = this === this.curve.g ? GY_BIGINT : BigInt('0x' + this.getY().toString(16))\n\n let R0: JacobianPointBI = { X: 0n, Y: 1n, Z: 0n }\n let R1: JacobianPointBI = { X: Px, Y: Py, Z: 1n }\n\n const bits = kBig.toString(2)\n for (const bitChar of bits) {\n const bit = bitChar === '1' ? 1n : 0n\n ctSwap(bit, R0, R1)\n R1 = jpAdd(R0, R1)\n R0 = jpDouble(R0)\n ctSwap(bit, R0, R1)\n }\n\n if (R0.Z === 0n) return new Point(null, null)\n\n const zInv = biModInv(R0.Z)\n const zInv2 = biModMul(zInv, zInv)\n const x = biModMul(R0.X, zInv2)\n const y = biModMul(R0.Y, biModMul(zInv2, zInv))\n\n const result = new Point(x.toString(16), y.toString(16))\n return isNeg ? result.neg() : result\n }\n\n /**\n * Performs a multiplication and addition operation in a single step.\n * Multiplies this Point by k1, adds the resulting Point to the result of p2 multiplied by k2.\n *\n * @method mulAdd\n * @param k1 - The scalar value to multiply this Point by.\n * @param p2 - The other Point to be involved in the operation.\n * @param k2 - The scalar value to multiply the Point p2 by.\n * @returns A Point that results from the combined multiplication and addition operations.\n *\n * @example\n * const p1 = new Point(1, 2);\n * const p2 = new Point(2, 3);\n * const result = p1.mulAdd(2, p2, 3);\n */\n mulAdd(k1: BigNumber, p2: Point, k2: BigNumber): Point {\n const points = [this, p2]\n const coeffs = [k1, k2]\n return this.#_endoWnafMulAdd(points, coeffs) as Point\n }\n\n /**\n * Performs the Jacobian multiplication and addition operation in a single\n * step. Instead of returning a regular Point, the result is a JacobianPoint.\n *\n * @method jmulAdd\n * @param k1 - The scalar value to multiply this Point by.\n * @param p2 - The other Point to be involved in the operation\n * @param k2 - The scalar value to multiply the Point p2 by.\n * @returns A JacobianPoint that results from the combined multiplication and addition operation.\n *\n * @example\n * const p1 = new Point(1, 2);\n * const p2 = new Point(2, 3);\n * const result = p1.jmulAdd(2, p2, 3);\n */\n jmulAdd(k1: BigNumber, p2: Point, k2: BigNumber): JPoint {\n const points = [this, p2]\n const coeffs = [k1, k2]\n return this.#_endoWnafMulAdd(points, coeffs, true) as JPoint\n }\n\n /**\n * Checks if the Point instance is equal to another given Point.\n *\n * @method eq\n * @param p - The Point to be checked if equal to the current instance.\n *\n * @returns Whether the two Point instances are equal. Both the 'x' and 'y' coordinates have to match, and both points have to either be valid or at infinity for equality. If both conditions are true, it returns true, else it returns false.\n *\n * @example\n * const p1 = new Point(5, 20);\n * const p2 = new Point(5, 20);\n * const areEqual = p1.eq(p2); // returns true\n */\n eq(p: Point): boolean {\n return (\n this === p ||\n (this.inf === p.inf &&\n (this.inf ||\n ((this.x ?? new BigNumber(0)).cmp(p.x ?? new BigNumber(0)) === 0 &&\n (this.y ?? new BigNumber(0)).cmp(p.y ?? new BigNumber(0)) === 0)))\n )\n }\n\n /**\n * Negate a point. The negation of a point P is the mirror of P about x-axis.\n *\n * @method neg\n *\n * @example\n * const P = new Point('123', '456');\n * const result = P.neg();\n */\n neg(_precompute?: boolean): Point {\n if (this.inf) {\n return this\n }\n const res = new Point(this.x, (this.y ?? new BigNumber(0)).redNeg())\n if (_precompute === true && this.precomputed != null) {\n const pre = this.precomputed\n const negate = (p: BasePoint): Point => (p as Point).neg()\n res.precomputed = {\n naf:\n pre.naf == null\n ? undefined\n : {\n wnd: pre.naf.wnd,\n points: pre.naf.points.map(negate) as BasePoint[]\n },\n doubles:\n pre.doubles == null\n ? undefined\n : {\n step: pre.doubles.step,\n points: pre.doubles.points.map(p => (p as Point).neg())\n },\n beta: undefined\n }\n }\n\n return res\n }\n\n /**\n * Performs the \"doubling\" operation on the Point a given number of times.\n * This is used in elliptic curve operations to perform multiplication by 2, multiple times.\n * If the point is at infinity, it simply returns the point because doubling\n * a point at infinity is still infinity.\n *\n * @method dblp\n * @param k - The number of times the \"doubling\" operation is to be performed on the Point.\n * @returns The Point after 'k' \"doubling\" operations have been performed.\n *\n * @example\n * const p = new Point(5, 20);\n * const doubledPoint = p.dblp(10); // returns the point after \"doubled\" 10 times\n */\n dblp(k: number): Point {\n let r: Point | undefined\n for (let i = 0; i < k; i++) {\n r = (r ?? this).dbl()\n }\n return r ?? this\n }\n\n /**\n * Converts the point to a Jacobian point. If the point is at infinity, the corresponding Jacobian point\n * will also be at infinity.\n *\n * @method toJ\n * @returns Returns a new Jacobian point based on the current point.\n *\n * @example\n * const point = new Point(xCoordinate, yCoordinate);\n * const jacobianPoint = point.toJ();\n */\n toJ(): JPoint {\n if (this.inf) {\n return new JPoint(null, null, null)\n }\n const res = new JPoint(this.x, this.y, this.curve.one)\n return res\n }\n\n #_getBeta(): undefined | Point {\n if (typeof this.curve.endo !== 'object') {\n return\n }\n\n const pre = this.precomputed\n if (\n typeof pre === 'object' &&\n pre !== null &&\n typeof pre.beta === 'object' &&\n pre.beta !== null\n ) {\n return pre.beta as Point\n }\n\n const beta = new Point((this.x ?? new BigNumber(0)).redMul(this.curve.endo.beta), this.y)\n if (pre != null) {\n const curve = this.curve\n const endoMul = (basePoint: BasePoint): Point => {\n const p = basePoint as Point\n if (p.x === null) {\n throw new Error('p.x is null')\n }\n if (curve.endo === undefined || curve.endo === null) {\n throw new Error('curve.endo is undefined')\n }\n return new Point(p.x.redMul(curve.endo.beta), p.y)\n }\n pre.beta = beta\n beta.precomputed = {\n beta: null,\n naf:\n pre.naf == null\n ? undefined\n : {\n wnd: pre.naf.wnd,\n points: pre.naf.points.map(endoMul)\n },\n doubles:\n pre.doubles == null\n ? undefined\n : {\n step: pre.doubles.step,\n points: pre.doubles.points.map(endoMul)\n }\n }\n }\n return beta\n }\n\n #_prepareWnafWindows(\n defW: number,\n points: Point[],\n len: number,\n wndWidth: number[],\n wnd: Point[][]\n ): void {\n for (let index = 0; index < len; index++) {\n const nafPoints = points[index].#_getNAFPoints(defW)\n wndWidth[index] = nafPoints.wnd\n wnd[index] = nafPoints.points\n }\n }\n\n private _combineWnafPair(a: number, b: number, context: WnafPairContext): number {\n const { points, coeffs, wndWidth, wnd, naf, currentMax } = context\n if (wndWidth[a] !== 1 || wndWidth[b] !== 1) {\n naf[a] = this.curve.getNAF(coeffs[a], wndWidth[a], this.curve._bitLength)\n naf[b] = this.curve.getNAF(coeffs[b], wndWidth[b], this.curve._bitLength)\n return Math.max(currentMax, naf[a].length, naf[b].length)\n }\n const comb: any[] = [points[a], null, null, points[b]]\n const aY = points[a].y ?? new BigNumber(0)\n const bY = points[b].y ?? new BigNumber(0)\n if (aY.cmp(bY) === 0) {\n comb[1] = points[a].add(points[b])\n comb[2] = points[a].toJ().mixedAdd(points[b].neg())\n } else if (aY.cmp(bY.redNeg()) === 0) {\n comb[1] = points[a].toJ().mixedAdd(points[b])\n comb[2] = points[a].add(points[b].neg())\n } else {\n comb[1] = points[a].toJ().mixedAdd(points[b])\n comb[2] = points[a].toJ().mixedAdd(points[b].neg())\n }\n const index = [-3, -1, -5, -7, 0, 7, 5, 1, 3]\n const jsf = this.curve.getJSF(coeffs[a], coeffs[b])\n const max = Math.max(currentMax, jsf[0].length)\n naf[a] = Array.from({ length: max })\n naf[b] = Array.from({ length: max })\n for (let position = 0; position < max; position++) {\n const ja = Math.trunc(jsf[0][position])\n const jb = Math.trunc(jsf[1][position])\n naf[a][position] = index[(ja + 1) * 3 + (jb + 1)]\n naf[b][position] = 0\n wnd[a] = comb\n }\n return max\n }\n\n #_prepareWnafRepresentations(\n points: Point[],\n coeffs: BigNumber[],\n len: number,\n wndWidth: number[],\n wnd: Point[][],\n naf: number[][]\n ): number {\n let max = 0\n for (let index = len - 1; index >= 1; index -= 2) {\n max = this._combineWnafPair(index - 1, index, {\n points,\n coeffs,\n wndWidth,\n wnd,\n naf,\n currentMax: max\n })\n }\n return max\n }\n\n private _collectWnafStep(\n start: number,\n len: number,\n naf: number[][],\n tmp: BigNumber[]\n ): { index: number; doubles: number } {\n let index = start\n let doubles = 0\n while (index >= 0) {\n let zero = true\n for (let point = 0; point < len; point++) {\n tmp[point] = new BigNumber(typeof naf[point][index] === 'number' ? naf[point][index] : 0)\n if (!tmp[point].isZero()) zero = false\n }\n if (!zero) break\n doubles++\n index--\n }\n if (index >= 0) doubles++\n return { index, doubles }\n }\n\n #_addWnafStep(accumulator: JPoint, len: number, tmp: BigNumber[], wnd: Point[][]): JPoint {\n const one = new BigNumber(1)\n const two = new BigNumber(2)\n let result = accumulator\n for (let index = 0; index < len; index++) {\n const value = tmp[index]\n if (value.cmpn(0) === 0) continue\n const point: any = value.isNeg()\n ? wnd[index][value.neg().sub(one).div(two).toNumber()].neg()\n : wnd[index][value.sub(one).div(two).toNumber()]\n result = point.type === 'affine' ? result.mixedAdd(point) : result.add(point)\n }\n return result\n }\n\n #_wnafMulAdd(\n defW: number,\n points: Point[],\n coeffs: BigNumber[],\n len: number,\n jacobianResult?: boolean\n ): BasePoint {\n const scratchLength = this.curve._wnafT1.length\n const wndWidth: number[] = Array.from({ length: scratchLength })\n const wnd: Point[][] = Array.from({ length: scratchLength }, () => [])\n const naf: number[][] = Array.from({ length: scratchLength }, () => [])\n\n this.#_prepareWnafWindows(defW, points, len, wndWidth, wnd)\n const max = this.#_prepareWnafRepresentations(points, coeffs, len, wndWidth, wnd, naf)\n\n let acc = new JPoint(null, null, null)\n const tmp = this.curve._wnafT4\n let index = max\n while (index >= 0) {\n const step = this._collectWnafStep(index, len, naf, tmp)\n index = step.index\n acc = acc.dblp(step.doubles)\n if (index < 0) break\n acc = this.#_addWnafStep(acc, len, tmp, wnd)\n index--\n }\n // Zeroify references\n for (let i = 0; i < len; i++) {\n wnd[i] = []\n }\n\n if (jacobianResult === true) {\n return acc\n } else {\n return acc.toP()\n }\n }\n\n #_endoWnafMulAdd(\n points: Point[],\n coeffs: BigNumber[], // Explicitly type coeffs\n jacobianResult?: boolean\n ): BasePoint {\n const npoints: Point[] = Array.from({ length: points.length * 2 })\n const ncoeffs: BigNumber[] = Array.from({ length: points.length * 2 })\n let i: number\n for (i = 0; i < points.length; i++) {\n const split = this.curve._endoSplit(coeffs[i])\n let p = points[i]\n let beta: Point = p.#_getBeta() ?? new Point(null, null)\n\n if (split.k1.negative !== 0) {\n split.k1.ineg()\n p = p.neg(true)\n }\n if (split.k2.negative !== 0) {\n split.k2.ineg()\n beta = beta.neg(true)\n }\n\n npoints[i * 2] = p\n npoints[i * 2 + 1] = beta\n ncoeffs[i * 2] = split.k1\n ncoeffs[i * 2 + 1] = split.k2\n }\n\n const res = this.#_wnafMulAdd(1, npoints, ncoeffs, i * 2, jacobianResult)\n\n // Clean-up references to points and coefficients\n for (let j = 0; j < i * 2; j++) {\n npoints[j] = null as unknown as Point\n ncoeffs[j] = null as unknown as BigNumber\n }\n return res\n }\n\n private _getDoubles(step?: number, power?: number): { step: number; points: any[] } {\n if (\n typeof this.precomputed === 'object' &&\n this.precomputed !== null &&\n typeof this.precomputed.doubles === 'object' &&\n this.precomputed.doubles !== null\n ) {\n return this.precomputed.doubles\n }\n\n const doubles = [this]\n let acc: Point | undefined\n for (let i = 0; i < (power ?? 0); i += step ?? 1) {\n for (let j = 0; j < (step ?? 1); j++) {\n acc = (acc ?? this).dbl()\n }\n doubles.push(acc as this)\n }\n return {\n step: step ?? 1,\n points: doubles\n }\n }\n\n #_getNAFPoints(wnd: number): { wnd: number; points: any[] } {\n if (\n typeof this.precomputed === 'object' &&\n this.precomputed !== null &&\n typeof this.precomputed.naf === 'object' &&\n this.precomputed.naf !== null\n ) {\n return this.precomputed.naf\n }\n\n const res = [this]\n const max = (1 << wnd) - 1\n const dbl = max === 1 ? null : this.dbl()\n for (let i = 1; i < max; i++) {\n if (dbl !== null) {\n res[i] = res[i - 1].add(dbl) as this\n }\n }\n return {\n wnd,\n points: res\n }\n }\n}\n","import Point from './Point.js'\nimport type PrivateKey from './PrivateKey.js'\nimport Curve from './Curve.js'\nimport { verify } from './ECDSA.js'\nimport BigNumber from './BigNumber.js'\nimport { sha256, sha256hmac, hash160 } from './Hash.js'\nimport Signature from './Signature.js'\nimport { toArray, toBase58Check, toHex } from './utils.js'\n\n/**\n * The PublicKey class extends the Point class. It is used in public-key cryptography to derive shared secret, verify message signatures, and encode the public key in the DER format.\n * The class comes with static methods to generate PublicKey instances from private keys or from strings.\n *\n * @extends {Point}\n * @see {@link Point} for more information on Point.\n */\nexport default class PublicKey extends Point {\n /**\n * Static factory method to derive a public key from a private key.\n * It multiplies the generator point 'g' on the elliptic curve by the private key.\n *\n * @static\n * @method fromPrivateKey\n *\n * @param key - The private key from which to derive the public key.\n *\n * @returns Returns the PublicKey derived from the given PrivateKey.\n *\n * @example\n * const myPrivKey = new PrivateKey(...)\n * const myPubKey = PublicKey.fromPrivateKey(myPrivKey)\n */\n static fromPrivateKey(key: PrivateKey): PublicKey {\n const c = new Curve()\n const p = c.g.mul(key)\n return new PublicKey(p.x, p.y)\n }\n\n /**\n * Static factory method to create a PublicKey instance from a string.\n *\n * @param str - A string representing a public key.\n *\n * @returns Returns the PublicKey created from the string.\n *\n * @example\n * const myPubKey = PublicKey.fromString(\"03....\")\n */\n static override fromString(str: string): PublicKey {\n const p = Point.fromString(str)\n return new PublicKey(p.x, p.y)\n }\n\n /**\n * Static factory method to create a PublicKey instance from a number array.\n *\n * @param bytes - A number array representing a public key.\n *\n * @returns Returns the PublicKey created from the number array.\n *\n * @example\n * const myPubKey = PublicKey.fromString(\"03....\")\n */\n static override fromDER(bytes: number[]): PublicKey {\n const p = Point.fromDER(bytes)\n return new PublicKey(p.x, p.y)\n }\n\n /**\n * @constructor\n * @param x - A point or the x-coordinate of the point. May be a number, a BigNumber, a string (which will be interpreted as hex), a number array, or null. If null, an \"Infinity\" point is constructed.\n * @param y - If x is not a point, the y-coordinate of the point, similar to x.\n * @param isRed - A boolean indicating if the point is a member of the field of integers modulo the k256 prime. Default is true.\n *\n * @example\n * new PublicKey(point1);\n * new PublicKey('abc123', 'def456');\n */\n constructor(\n x: Point | BigNumber | number | number[] | string | null,\n y: BigNumber | number | number[] | string | null = null,\n isRed: boolean = true\n ) {\n if (x instanceof Point) {\n super(x.getX(), x.getY())\n } else {\n // Common gotcha: constructing PublicKey with a DER value when you should use .fromString()\n if (y === null && isRed && typeof x === 'string') {\n if (x.length === 66 || x.length === 130) {\n throw new Error(\n 'You are using the \"new PublicKey()\" constructor with a DER hex string. You need to use \"PublicKey.fromString()\" instead.'\n )\n }\n }\n super(x, y, isRed)\n }\n }\n\n /**\n * Derive a shared secret from a public key and a private key for use in symmetric encryption.\n * This method multiplies the public key (an instance of Point) with a private key.\n *\n * @param priv - The private key to use in deriving the shared secret.\n *\n * @returns Returns the Point representing the shared secret.\n *\n * @throws Will throw an error if the public key is not valid for ECDH secret derivation.\n *\n * @example\n * const myPrivKey = new PrivateKey(...)\n * const sharedSecret = myPubKey.deriveSharedSecret(myPrivKey)\n */\n deriveSharedSecret(priv: PrivateKey): Point {\n if (!this.validate()) {\n throw new Error('Public key not valid for ECDH secret derivation')\n }\n return this.mulCT(priv)\n }\n\n /**\n * Verify a signature of a message using this public key.\n *\n * @param msg - The message to verify. It can be a string or an array of numbers.\n * @param sig - The Signature of the message that needs verification.\n * @param enc - The encoding of the message. It defaults to 'utf8'.\n *\n * @returns Returns true if the signature is verified successfully, otherwise false.\n *\n * @example\n * const myMessage = \"Hello, world!\"\n * const mySignature = new Signature(...)\n * const isVerified = myPubKey.verify(myMessage, mySignature)\n */\n verify(msg: number[] | string, sig: Signature, enc?: 'hex' | 'utf8'): boolean {\n const msgHash = new BigNumber(sha256(msg, enc), 16)\n return verify(msgHash, sig, this)\n }\n\n /**\n * Encode the public key to DER (Distinguished Encoding Rules) format.\n *\n * @returns Returns the DER-encoded public key in number array or string.\n *\n * @param enc - The encoding of the DER string. undefined = number array, 'hex' = hex string.\n *\n * @example\n * const derPublicKey = myPubKey.toDER()\n */\n toDER(enc?: 'hex' | undefined): number[] | string {\n if (enc === 'hex') return this.encode(true, enc) as string\n return this.encode(true) as number[]\n }\n\n /**\n * Hash sha256 and ripemd160 of the public key.\n *\n * @returns Returns the hash of the public key.\n *\n * @example\n * const publicKeyHash = pubkey.toHash()\n */\n toHash(enc?: 'hex'): number[] | string {\n const pkh = hash160(this.encode(true))\n if (enc === 'hex') {\n return toHex(pkh)\n }\n return pkh\n }\n\n /**\n * Base58Check encodes the hash of the public key with a prefix to indicate locking script type.\n * Defaults to P2PKH for mainnet, otherwise known as a \"Bitcoin Address\".\n *\n * @param prefix defaults to [0x00] for mainnet, set to [0x6f] for testnet or use the strings 'mainnet' or 'testnet'\n *\n * @returns Returns the address encoding associated with the hash of the public key.\n *\n * @example\n * const address = pubkey.toAddress()\n * const address = pubkey.toAddress('mainnet')\n * const testnetAddress = pubkey.toAddress([0x6f])\n * const testnetAddress = pubkey.toAddress('testnet')\n */\n toAddress(prefix: number[] | string = [0x00]): string {\n if (typeof prefix === 'string') {\n if (prefix === 'testnet' || prefix === 'test') {\n prefix = [0x6f]\n } else if (prefix === 'mainnet' || prefix === 'main') {\n prefix = [0x00]\n } else {\n throw new Error(`Invalid prefix ${prefix}`)\n }\n }\n return toBase58Check(this.toHash() as number[], prefix)\n }\n\n /**\n * Derives a child key with BRC-42.\n * @param privateKey The private key of the other party\n * @param invoiceNumber The invoice number used to derive the child key\n * @param cacheSharedSecret Optional function to cache shared secrets\n * @param retrieveCachedSharedSecret Optional function to retrieve shared secrets from the cache\n * @returns The derived child key.\n */\n deriveChild(\n privateKey: PrivateKey,\n invoiceNumber: string,\n cacheSharedSecret?: (priv: PrivateKey, pub: Point, point: Point) => void,\n retrieveCachedSharedSecret?: (priv: PrivateKey, pub: Point) => Point | undefined\n ): PublicKey {\n let sharedSecret: Point\n if (typeof retrieveCachedSharedSecret === 'function') {\n const retrieved = retrieveCachedSharedSecret(privateKey, this)\n if (retrieved === undefined) {\n sharedSecret = this.deriveSharedSecret(privateKey)\n if (typeof cacheSharedSecret === 'function') {\n cacheSharedSecret(privateKey, this, sharedSecret)\n }\n } else {\n sharedSecret = retrieved\n }\n } else {\n sharedSecret = this.deriveSharedSecret(privateKey)\n }\n const invoiceNumberBin = toArray(invoiceNumber, 'utf8')\n const hmac = sha256hmac(sharedSecret.encode(true), invoiceNumberBin)\n const curve = new Curve()\n const point = curve.g.mul(new BigNumber(hmac))\n const finalPoint = this.add(point)\n return new PublicKey(finalPoint.x, finalPoint.y)\n }\n\n /**\n * Takes an array of numbers or a string and returns a new PublicKey instance.\n * This method will throw an error if the Compact encoding is invalid.\n * If a string is provided, it is assumed to represent a hexadecimal sequence.\n * compactByte value 27-30 means uncompressed public key.\n * 31-34 means compressed public key.\n * The range represents the recovery param which can be 0,1,2,3.\n *\n * @static\n * @method fromMsgHashAndCompactSignature\n * @param msgHash - The message hash which was signed.\n * @param signature - The signature in compact format.\n * @param enc - The encoding of the signature string.\n * @returns A PublicKey instance derived from the message hash and compact signature.\n * @example\n * const publicKey = Signature.fromMsgHashAndCompactSignature(msgHash, 'IMOl2mVKfDgsSsHT4uIYBNN4e...', 'base64');\n */\n static fromMsgHashAndCompactSignature(\n msgHash: BigNumber,\n signature: number[] | string,\n enc?: 'hex' | 'base64'\n ): PublicKey {\n const data = toArray(signature, enc)\n if (data.length !== 65) {\n throw new Error('Invalid Compact Signature')\n }\n const compactByte = data[0]\n if (compactByte < 27 || compactByte >= 35) {\n throw new Error('Invalid Compact Byte')\n }\n let r = data[0] - 27\n // NOTE: We don't use uncompressed pubkeys in this library,\n // but whether the key is compressed is captured in the recovery param.\n // Code below is commented out for reference of how you could capture this.\n // let compressed = false\n if (r > 3) {\n // compressed = true\n r -= 4\n }\n const s = new Signature(new BigNumber(data.slice(1, 33)), new BigNumber(data.slice(33, 65)))\n return s.RecoverPublicKey(r, msgHash)\n }\n}\n","import BigNumber from './BigNumber.js'\nimport PublicKey from './PublicKey.js'\nimport { verify } from './ECDSA.js'\nimport { sha256 } from './Hash.js'\nimport { toArray, toHex, toBase64 } from './utils.js'\nimport Point from './Point.js'\nimport Curve from './Curve.js'\n\n/**\n * Represents a digital signature.\n *\n * A digital signature is a mathematical scheme for verifying the authenticity of\n * digital messages or documents. In many scenarios, it is equivalent to a handwritten signature or stamped seal.\n * The signature pair (R, S) corresponds to the raw ECDSA ([Elliptic Curve Digital Signature Algorithm](https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm)) signature.\n * Signatures are often serialized into a format known as '[DER encoding](https://en.wikipedia.org/wiki/X.690#DER_encoding)' for transmission.\n *\n * @class Signature\n */\nexport default class Signature {\n /**\n * @property Represents the \"r\" component of the digital signature\n */\n r: BigNumber\n\n /**\n * @property Represents the \"s\" component of the digital signature\n */\n s: BigNumber\n\n /**\n * Takes an array of numbers or a string and returns a new Signature instance.\n * This method will throw an error if the DER encoding is invalid.\n * If a string is provided, it is assumed to represent a hexadecimal sequence.\n *\n * @static\n * @method fromDER\n * @param data - The sequence to decode from DER encoding.\n * @param enc - The encoding of the data string.\n * @returns The decoded data in the form of Signature instance.\n *\n * @example\n * const signature = Signature.fromDER('30440220018c1f5502f8...', 'hex');\n */\n static fromDER(data: number[] | string, enc?: 'hex' | 'base64'): Signature {\n const getLength = (buf: number[], p: { place: number }): number => {\n const initial = buf[p.place++]\n if ((initial & 0x80) === 0) {\n return initial\n } else {\n throw new Error('Invalid DER entity length')\n }\n }\n\n class Position {\n place = 0\n }\n data = toArray(data, enc)\n\n const p = new Position()\n if (data[p.place++] !== 0x30) {\n throw new Error('Signature DER must start with 0x30')\n }\n const len = getLength(data, p)\n if (len + p.place !== data.length) {\n throw new Error('Signature DER invalid')\n }\n if (data[p.place++] !== 0x02) {\n throw new Error('Signature DER invalid')\n }\n const rlen = getLength(data, p)\n let r = data.slice(p.place, rlen + p.place)\n p.place += rlen\n if (data[p.place++] !== 0x02) {\n throw new Error('Signature DER invalid')\n }\n const slen = getLength(data, p)\n if (data.length !== slen + p.place) {\n throw new Error('Invalid R-length in signature DER')\n }\n let s = data.slice(p.place, slen + p.place)\n if (r[0] === 0) {\n if ((r[1] & 0x80) === 0) {\n throw new Error('Invalid R-value in signature DER')\n } else {\n r = r.slice(1)\n }\n }\n if (s[0] === 0) {\n if ((s[1] & 0x80) === 0) {\n throw new Error('Invalid S-value in signature DER')\n } else {\n s = s.slice(1)\n }\n }\n\n return new Signature(new BigNumber(r), new BigNumber(s))\n }\n\n /**\n * Takes an array of numbers or a string and returns a new Signature instance.\n * This method will throw an error if the Compact encoding is invalid.\n * If a string is provided, it is assumed to represent a hexadecimal sequence.\n * compactByte value 27-30 means uncompressed public key.\n * 31-34 means compressed public key.\n * The range represents the recovery param which can be 0,1,2,3.\n * We could support recovery functions in future if there's demand.\n *\n * @static\n * @method fromCompact\n * @param data - The sequence to decode from Compact encoding.\n * @param enc - The encoding of the data string.\n * @returns The decoded data in the form of Signature instance.\n *\n * @example\n * const signature = Signature.fromCompact('1b18c1f5502f8...', 'hex');\n */\n static fromCompact(data: number[] | string, enc?: 'hex' | 'base64'): Signature {\n data = toArray(data, enc)\n if (data.length !== 65) {\n throw new Error('Invalid Compact Signature')\n }\n const compactByte = data[0]\n if (compactByte < 27 || compactByte >= 35) {\n throw new Error('Invalid Compact Byte')\n }\n return new Signature(new BigNumber(data.slice(1, 33)), new BigNumber(data.slice(33, 65)))\n }\n\n /**\n * Creates an instance of the Signature class.\n *\n * @constructor\n * @param r - The R component of the signature.\n * @param s - The S component of the signature.\n *\n * @example\n * const r = new BigNumber('208755674028...');\n * const s = new BigNumber('564745627577...');\n * const signature = new Signature(r, s);\n */\n constructor(r: BigNumber, s: BigNumber) {\n this.r = r\n this.s = s\n }\n\n /**\n * Verifies a digital signature.\n *\n * This method will return true if the signature, key, and message hash match.\n * If the data or key do not match the signature, the function returns false.\n *\n * @method verify\n * @param msg - The message to verify.\n * @param key - The public key used to sign the original message.\n * @param enc - The encoding of the msg string.\n * @returns A boolean representing whether the signature is valid.\n *\n * @example\n * const msg = 'The quick brown fox jumps over the lazy dog';\n * const publicKey = PublicKey.fromString('04188ca1050...');\n * const isVerified = signature.verify(msg, publicKey);\n */\n verify(msg: number[] | string, key: PublicKey, enc?: 'hex'): boolean {\n const msgHash = new BigNumber(sha256(msg, enc), 16)\n return verify(msgHash, this, key)\n }\n\n /**\n * Converts an instance of Signature into DER encoding.\n * An alias for the toDER method.\n *\n * If the encoding parameter is set to 'hex', the function will return a hex string.\n * If 'base64', it will return a base64 string.\n * Otherwise, it will return an array of numbers.\n *\n * @method toDER\n * @param enc - The encoding to use for the output.\n * @returns The current instance in DER encoding.\n *\n * @example\n * const der = signature.toString('base64');\n */\n toString(enc?: 'hex' | 'base64'): number[] | string {\n return this.toDER(enc)\n }\n\n /**\n * Converts an instance of Signature into DER encoding.\n *\n * If the encoding parameter is set to 'hex', the function will return a hex string.\n * If 'base64', it will return a base64 string.\n * Otherwise, it will return an array of numbers.\n *\n * @method toDER\n * @param enc - The encoding to use for the output.\n * @returns The current instance in DER encoding.\n *\n * @example\n * const der = signature.toDER('hex');\n */\n toDER(enc?: 'hex' | 'base64'): number[] | string {\n const constructLength = (arr: number[], len: number): void => {\n if (len < 0x80) {\n arr.push(len)\n } else {\n throw new Error('len must be < 0x80')\n }\n }\n\n const rmPadding = (buf: number[]): number[] => {\n let i = 0\n const len = buf.length - 1\n while (buf[i] === 0 && (buf[i + 1] & 0x80) === 0 && i < len) {\n i++\n }\n if (i === 0) {\n return buf\n }\n return buf.slice(i)\n }\n\n let r = this.r.toArray()\n let s = this.s.toArray()\n\n // Pad values\n if ((r[0] & 0x80) !== 0) {\n r = [0].concat(r)\n }\n // Pad values\n if ((s[0] & 0x80) !== 0) {\n s = [0].concat(s)\n }\n\n r = rmPadding(r)\n s = rmPadding(s)\n\n while (s[0] === 0 && (s[1] & 0x80) === 0) {\n s = s.slice(1)\n }\n let arr = [0x02]\n constructLength(arr, r.length)\n arr = arr.concat(r)\n arr.push(0x02)\n constructLength(arr, s.length)\n const backHalf = arr.concat(s)\n let res = [0x30]\n constructLength(res, backHalf.length)\n res = res.concat(backHalf)\n if (enc === 'hex') {\n return toHex(res)\n } else if (enc === 'base64') {\n return toBase64(res)\n } else {\n return res\n }\n }\n\n /**\n * Converts an instance of Signature into Compact encoding.\n *\n * If the encoding parameter is set to 'hex', the function will return a hex string.\n * If 'base64', it will return a base64 string.\n * Otherwise, it will return an array of numbers.\n *\n * @method toCompact\n * @param enc - The encoding to use for the output.\n * @returns The current instance in DER encoding.\n *\n * @example\n * const compact = signature.toCompact(3, true, 'base64');\n */\n toCompact(recovery: number, compressed: boolean, enc?: 'hex' | 'base64'): number[] | string {\n if (recovery < 0 || recovery > 3) throw new Error('Invalid recovery param')\n if (typeof compressed !== 'boolean') {\n throw new TypeError('Invalid compressed param')\n }\n let compactByte = 27 + recovery\n if (compressed) {\n compactByte += 4\n }\n let arr = [compactByte]\n arr = arr.concat(this.r.toArray('be', 32))\n arr = arr.concat(this.s.toArray('be', 32))\n if (enc === 'hex') {\n return toHex(arr)\n } else if (enc === 'base64') {\n return toBase64(arr)\n } else {\n return arr\n }\n }\n\n /**\n * Recovers the public key from a signature.\n * This method will return the public key if it finds a valid public key.\n * If it does not find a valid public key, it will throw an error.\n * The recovery factor is a number between 0 and 3.\n * @method RecoverPublicKey\n * @param recovery - The recovery factor.\n * @param e - The message hash.\n * @returns The public key associated with the signature.\n *\n * @example\n * const publicKey = signature.RecoverPublicKey(0, msgHash);\n */\n RecoverPublicKey(recovery: number, e: BigNumber): PublicKey {\n const r = this.r\n const s = this.s\n\n // A set LSB signifies that the y-coordinate is odd\n const isYOdd = (recovery & 1) !== 0\n\n // The more significant bit specifies whether we should use the\n // first or second candidate key.\n const isSecondKey = recovery >> 1\n\n const curve = new Curve()\n const n = curve.n\n const G = curve.g\n\n // 1.1 LEt x = r + jn\n const x = isSecondKey === 0 ? r : r.add(n)\n const R = Point.fromX(x, isYOdd)\n\n // 1.4 Check that nR is at infinity\n const nR = R.mul(n)\n if (!nR.isInfinity()) {\n throw new Error('nR is not at infinity')\n }\n\n // Compute -e from e\n const eNeg = e.neg().umod(n)\n\n // 1.6.1 Compute Q = r^-1 (sR - eG)\n // Q = r^-1 (sR + -eG)\n const rInv = r.invm(n)\n\n // const Q = R.multiplyTwo(s, G, eNeg).mul(rInv)\n const srInv = rInv.mul(s).umod(n)\n const eInvrInv = rInv.mul(eNeg).umod(n)\n const Q = G.mul(eInvrInv).add(R.mul(srInv))\n\n const pubKey = new PublicKey(Q)\n pubKey.validate()\n\n return pubKey\n }\n\n /**\n * Calculates the recovery factor which will work for a particular public key and message hash.\n * This method will return the recovery factor if it finds a valid recovery factor.\n * If it does not find a valid recovery factor, it will throw an error.\n * The recovery factor is a number between 0 and 3.\n *\n * @method CalculateRecoveryFactor\n * @param msgHash - The message hash.\n * @returns the recovery factor: number\n * /\n * @example\n * const recovery = signature.CalculateRecoveryFactor(publicKey, msgHash);\n */\n CalculateRecoveryFactor(pubkey: PublicKey, msgHash: BigNumber): number {\n for (let recovery = 0; recovery < 4; recovery++) {\n let Qprime\n try {\n Qprime = this.RecoverPublicKey(recovery, msgHash)\n } catch {\n continue\n }\n if (pubkey.eq(Qprime)) {\n return recovery\n }\n }\n throw new Error('Unable to find valid recovery factor')\n }\n}\n","// Modified hmac-drbg lineage; see ../../THIRD_PARTY_NOTICES.md.\nimport { SHA256HMAC } from './Hash.js'\nimport { toHex, toArray } from './utils.js'\n\n/**\n * HMAC-DRBG used **only** for deterministic ECDSA nonce generation.\n *\n * This implementation follows the RFC 6979-style HMAC-DRBG construction for secp256k1\n * and is wired internally into the ECDSA signing code. It is **not forward-secure**\n * and MUST NOT be used as a general-purpose DRBG, key generator, or randomness source.\n *\n * Security note:\n * - Intended scope: internal ECDSA nonce generation with fixed-size inputs.\n * - Out-of-scope: generic randomness, long-lived session keys, or any context\n * where forward secrecy is required.\n * - API stability: this class is internal.\n *\n * @class DRBG\n *\n * @constructor\n * @param entropy - Initial entropy either in number array or hexadecimal string.\n * @param nonce - Initial nonce either in number array or hexadecimal string.\n *\n * @throws Throws an error message 'Not enough entropy. Minimum is 256 bits' when entropy's length is less than 32.\n * @throws Thrown an error message 'Nonce must be exactly 32 bytes (256 bits)' when nonce's length is less than 32.\n *\n * @example\n * const drbg = new DRBG('af12de...', '123ef...');\n */\nexport default class DRBG {\n K: number[]\n V: number[]\n\n constructor(entropy: number[] | string, nonce: number[] | string) {\n const entropyBytes = toArray(entropy, 'hex')\n const nonceBytes = toArray(nonce, 'hex')\n\n // RFC 6979 for secp256k1 assumes 256-bit x and h1.\n if (entropyBytes.length !== 32) {\n throw new Error('Entropy must be exactly 32 bytes (256 bits)')\n }\n if (nonceBytes.length !== 32) {\n throw new Error('Nonce must be exactly 32 bytes (256 bits)')\n }\n\n const seedMaterial = entropyBytes.concat(nonceBytes)\n\n this.K = Array.from({ length: 32 })\n this.V = Array.from({ length: 32 })\n for (let i = 0; i < 32; i++) {\n this.K[i] = 0x00\n this.V[i] = 0x01\n }\n\n this.update(seedMaterial)\n }\n\n /**\n * Generates HMAC using the K value of the instance. This method is used internally for operations.\n *\n * @method hmac\n * @returns The SHA256HMAC object created with K value.\n *\n * @example\n * const hmac = drbg.hmac();\n */\n hmac(): SHA256HMAC {\n return new SHA256HMAC(this.K)\n }\n\n /**\n * Updates the `K` and `V` values of the instance based on the seed.\n * The seed if not provided uses `V` as seed.\n *\n * @method update\n * @param seed - an optional value that used to update `K` and `V`. Default is `undefined`.\n * @returns Nothing, but updates the internal state `K` and `V` value.\n *\n * @example\n * drbg.update('e13af...');\n */\n update(seed?: number[]): void {\n let kmac = this.hmac().update(this.V).update([0x00])\n if (seed !== undefined) {\n kmac = kmac.update(seed)\n }\n this.K = kmac.digest()\n this.V = this.hmac().update(this.V).digest()\n if (seed === undefined) {\n return\n }\n\n this.K = this.hmac().update(this.V).update([0x01]).update(seed).digest()\n this.V = this.hmac().update(this.V).digest()\n }\n\n /**\n * Generates deterministic random hexadecimal string of given length.\n * In every generation process, it also updates the internal state `K` and `V`.\n *\n * @method generate\n * @param len - The length of required random number.\n * @returns The required deterministic random hexadecimal string.\n *\n * @example\n * const randomHex = drbg.generate(256);\n */\n generate(len: number): string {\n let temp: number[] = []\n while (temp.length < len) {\n this.V = this.hmac().update(this.V).digest()\n temp = temp.concat(this.V)\n }\n\n const res = temp.slice(0, len)\n this.update()\n return toHex(res)\n }\n}\n","import BigNumber from './BigNumber.js'\nimport Signature from './Signature.js'\nimport Curve from './Curve.js'\nimport Point, {\n scalarMultiplyWNAF,\n biModInv,\n BI_ZERO,\n biModMul,\n GX_BIGINT,\n GY_BIGINT,\n jpAdd,\n N_BIGINT,\n modInvN,\n modMulN,\n modN\n} from './Point.js'\nimport DRBG from './DRBG.js'\n\n/**\n * Truncates a BigNumber message to the length of the curve order n, in the context of the Elliptic Curve Digital Signature Algorithm (ECDSA).\n * This method is used as part of ECDSA signing and verification.\n *\n * The method calculates `delta`, which is a difference obtained by subtracting the bit length of the curve order `n` from the byte length of the message in bits.\n * If `delta` is greater than zero, logical shifts msg to the right by `delta`, retaining the sign.\n *\n * Another condition is tested, but only if `truncOnly` is false. This condition compares the value of msg to curve order `n`.\n * If msg is greater or equal to `n`, it is decreased by `n` and returned.\n *\n * @method truncateToN\n * @param msg - The BigNumber message to be truncated.\n * @param truncOnly - An optional boolean parameter that if set to true, the method will only perform truncation of the BigNumber without doing the additional subtraction from the curve order.\n * @returns Returns the truncated BigNumber value, potentially subtracted by the curve order n.\n *\n * @example\n * let msg = new BigNumber('1234567890abcdef', 16);\n * let truncatedMsg = truncateToN(msg);\n *\n * This behavior follows the message truncation rules defined in FIPS 186-4.\n */\nfunction truncateToN(msg: BigNumber, truncOnly?: boolean, curve = new Curve()): BigNumber {\n const delta = msg.byteLength() * 8 - curve.n.bitLength()\n if (delta > 0) {\n msg.iushrn(delta)\n }\n if (truncOnly !== true && msg.cmp(curve.n) >= 0) {\n return msg.sub(curve.n)\n } else {\n return msg\n }\n}\n\nfunction bnToBigInt(bn: BigNumber): bigint {\n const bytes = bn.toArray('be')\n let x = 0n\n for (const byte of bytes) {\n x = (x << 8n) | BigInt(byte)\n }\n return x\n}\n\nconst curve = new Curve()\nconst bytes = curve.n.byteLength()\nconst ns1 = curve.n.subn(1)\nconst halfN = N_BIGINT >> 1n\n\nfunction selectK(\n customK: BigNumber | ((iter: number) => BigNumber) | undefined,\n iter: number,\n drbg: DRBG\n): BigNumber {\n let selected: BigNumber\n if (typeof customK === 'function') {\n selected = customK(iter)\n } else if (customK !== undefined && BigNumber.isBN(customK)) {\n selected = customK\n } else {\n selected = new BigNumber(drbg.generate(bytes), 16)\n }\n if (selected == null) throw new Error('k is undefined')\n return truncateToN(selected, true)\n}\n\nfunction retryOrRejectFixedK(fixedK: boolean, message: string): undefined {\n if (fixedK) throw new Error(message)\n return undefined\n}\n\nfunction signatureFromK(\n kBN: BigNumber,\n msgBig: bigint,\n keyBig: bigint,\n forceLowS: boolean,\n fixedK: boolean\n): Signature | undefined {\n if (kBN.cmpn(1) < 0 || kBN.cmp(ns1) > 0) {\n return retryOrRejectFixedK(fixedK, 'Invalid fixed custom K value (must be >1 and <N-1)')\n }\n\n const R = curve.g.mulCT(kBN)\n if (R.isInfinity()) {\n return retryOrRejectFixedK(fixedK, 'Invalid fixed custom K value (k·G at infinity)')\n }\n\n const rBig = modN(BigInt('0x' + R.getX().toString(16)))\n if (rBig === 0n) {\n return retryOrRejectFixedK(fixedK, 'Invalid fixed custom K value (r == 0)')\n }\n\n const kInv = modInvN(BigInt('0x' + kBN.toString(16)))\n const sum = modN(msgBig + modMulN(rBig, keyBig))\n let sBig = modMulN(kInv, sum)\n if (sBig === 0n) {\n return retryOrRejectFixedK(fixedK, 'Invalid fixed custom K value (s == 0)')\n }\n if (forceLowS && sBig > halfN) sBig = N_BIGINT - sBig\n\n return new Signature(new BigNumber(rBig.toString(16), 16), new BigNumber(sBig.toString(16), 16))\n}\n\n/**\n * Generates a digital signature for a given message.\n *\n * @function sign\n * @param msg - The BigNumber message for which the signature has to be computed.\n * @param key - Private key in BigNumber.\n * @param forceLowS - Optional boolean flag if True forces \"s\" to be the lower of two possible values.\n * @param customK - Optional specification for k value, which can be a function or BigNumber.\n * @returns Returns the elliptic curve digital signature of the message.\n *\n * @example\n * const msg = new BigNumber('2664878')\n * const key = new BigNumber('123456')\n * const signature = sign(msg, key)\n */\n/**\n * SECURITY NOTE:\n *\n * This function implements ECDSA signing and expects `msg` to be the output of\n * a cryptographic hash function (e.g. SHA-256), not an arbitrary-length message.\n *\n * Per FIPS 186-4 / SEC 1, the message representative used by ECDSA must not\n * exceed the bit length of the curve order `n`. Inputs larger than `n` must be\n * hashed before signing.\n *\n * As a short-term mitigation for TOB-22, this implementation explicitly rejects\n * messages whose bit length exceeds that of the curve order.\n *\n * Long-term, callers SHOULD always hash messages before invoking `sign()`.\n */\nexport const sign = (\n msg: BigNumber,\n key: BigNumber,\n forceLowS: boolean = false,\n customK?: BigNumber | ((iter: number) => BigNumber)\n): Signature => {\n const nBitLength = curve.n.bitLength()\n if (msg.bitLength() > nBitLength) {\n throw new Error(\n `ECDSA message is too large: expected <= ${nBitLength} bits. Callers must hash messages before signing.`\n )\n }\n\n msg = truncateToN(msg)\n const msgBig = bnToBigInt(msg)\n const keyBig = bnToBigInt(key)\n\n const bkey = key.toArray('be', bytes)\n const nonce = msg.toArray('be', bytes)\n const drbg = new DRBG(bkey, nonce)\n const fixedK = BigNumber.isBN(customK)\n\n for (let iter = 0; ; iter++) {\n const signature = signatureFromK(\n selectK(customK, iter, drbg),\n msgBig,\n keyBig,\n forceLowS,\n fixedK\n )\n if (signature != null) return signature\n }\n}\n\n/**\n * Verifies a digital signature of a given message.\n *\n * Message and key used during the signature generation process, and the previously computed signature\n * are used to validate the authenticity of the digital signature.\n *\n * @function verify\n * @param msg - The BigNumber message for which the signature has to be verified.\n * @param sig - Signature object consisting of parameters 'r' and 's'.\n * @param key - Public key in Point.\n * @returns Returns true if the signature is valid and false otherwise.\n *\n * @example\n * const msg = new BigNumber('2664878', 16)\n * const key = new Point(new BigNumber(10), new BigNumber(20)\n * const signature = sign(msg, new BigNumber('123456'))\n * const isVerified = verify(msg, sig, key)\n */\n/**\n * SECURITY NOTE:\n *\n * This verification routine assumes that `msg` is a hashed message\n * representative produced using the same hash function used during signing.\n *\n * As part of TOB-22 short-term hardening, messages exceeding the curve order\n * bit length are rejected to prevent misuse with non-hashed inputs.\n */\nexport const verify = (msg: BigNumber, sig: Signature, key: Point): boolean => {\n const nBitLength = curve.n.bitLength()\n if (msg.bitLength() > nBitLength) {\n // could be throw or return false; returning false is typical for verify\n return false\n }\n\n // Convert inputs to BigInt\n const hash = bnToBigInt(msg)\n if (key.x == null || key.y == null) {\n throw new Error('Invalid public key: missing coordinates.')\n }\n\n const publicKey = {\n x: bnToBigInt(key.x),\n y: bnToBigInt(key.y)\n }\n const signature = {\n r: bnToBigInt(sig.r),\n s: bnToBigInt(sig.s)\n }\n\n const { r, s } = signature\n const z = hash\n\n // Check r and s are in [1, n - 1]\n if (r <= BI_ZERO || r >= N_BIGINT || s <= BI_ZERO || s >= N_BIGINT) {\n return false\n }\n\n // ── compute u₁ = z·s⁻¹ mod n and u₂ = r·s⁻¹ mod n ───────────────────────\n const w = modInvN(s) // s⁻¹ mod n\n if (w === 0n) return false // should never happen\n const u1 = modMulN(z, w)\n const u2 = modMulN(r, w)\n\n // ── R = u₁·G + u₂·Q (Jacobian, window‑NAF) ──────────────────────────────\n const RG = scalarMultiplyWNAF(u1, { x: GX_BIGINT, y: GY_BIGINT })\n const RQ = scalarMultiplyWNAF(u2, publicKey)\n const R = jpAdd(RG, RQ)\n if (R.Z === 0n) return false // point at infinity\n\n // ── affine x‑coordinate of R (mod p) ─────────────────────────────────────\n const zInv = biModInv(R.Z) // (Z⁻¹ mod p)\n const zInv2 = biModMul(zInv, zInv) // Z⁻²\n const xAff = biModMul(R.X, zInv2) // X / Z² mod p\n\n // ── v = xAff mod n and final check ───────────────────────────────────────\n const v = modN(xAff)\n return v === r\n}\n","// Modified brorand lineage; see ../../THIRD_PARTY_NOTICES.md.\n/**\n * Random number generator that works across modern JavaScript environments.\n *\n * This implementation uses the Web Crypto API which is available in:\n * - Node.js 18+ via globalThis.crypto\n * - Modern browsers via globalThis.crypto, self.crypto, or window.crypto\n * - Web Workers and Service Workers via self.crypto\n * - Deno and Bun via globalThis.crypto\n * - Node.js 22+ via process.getBuiltinModule when Web Crypto is unavailable\n *\n * @throws {Error} If no secure random number generator is available\n */\nclass Rand {\n _rand: (n: number) => number[] // ✅ Explicit function type\n\n getRandomValues (obj: any, n: number): number[] {\n const arr = new Uint8Array(n)\n obj.crypto.getRandomValues(arr)\n return Array.from(arr)\n }\n\n constructor () {\n const noRand = (): never => {\n throw new Error(\n 'No secure random number generator is available in this environment.'\n )\n }\n\n this._rand = noRand // Assign the function\n\n // Try globalThis.crypto (works in Node.js 18+, modern browsers, and Deno)\n if (typeof globalThis !== 'undefined' && typeof (globalThis as any).crypto?.getRandomValues === 'function') {\n this._rand = (n) => {\n return this.getRandomValues(globalThis as any, n)\n }\n return\n }\n\n // Try self.crypto (Web Workers and Service Workers)\n if (globalThis.self !== undefined && typeof globalThis.self.crypto?.getRandomValues === 'function') {\n this._rand = (n) => {\n return this.getRandomValues(globalThis.self, n)\n }\n return\n }\n\n // Try window.crypto (browsers)\n if (globalThis.window !== undefined && typeof (globalThis.window as any).crypto?.getRandomValues === 'function') {\n this._rand = (n) => {\n return this.getRandomValues(globalThis.window, n)\n }\n return\n }\n\n // Retain a Node.js fallback without a static import or require that browser\n // and mobile bundlers would have to resolve.\n if (\n typeof process !== 'undefined' &&\n typeof process.getBuiltinModule === 'function'\n ) {\n const nodeCrypto = process.getBuiltinModule('node:crypto')\n if (typeof nodeCrypto?.randomBytes === 'function') {\n this._rand = n => Array.from(nodeCrypto.randomBytes(n))\n return\n }\n }\n\n // No crypto available\n this._rand = noRand\n }\n\n generate (len: number): number[] {\n return this._rand(len)\n }\n}\n\nlet ayn: Rand | null = null\n\n/**\n * Generates a sequence of pseudo-random bytes with the given length.\n *\n * @param len - The number of bytes to generate\n *\n * @returns The generated bytes\n *\n * @example\n * import Random from '@bsv/sdk/primitives/Random'\n * const bytes = Random(32) // Produces 32 random bytes\n */\nconst Random = (len: number): number[] => {\n ayn ??= new Rand()\n return ayn.generate(len)\n}\n\nexport default Random\n","import PrivateKey from './PrivateKey.js'\nimport BigNumber from './BigNumber.js'\nimport Curve from './Curve.js'\nimport Random from './Random.js'\nimport { fromBase58, toBase58 } from './utils.js'\n\nexport const MAX_SHAMIR_SHARES = 255\nconst MAX_POINT_STRING_LENGTH = 129\nconst BASE58_FIELD = /^[1-9A-HJ-NP-Za-km-z]{1,64}$/\n\nfunction assertPolynomialThreshold(threshold: number, pointCount: number, minimum: number): void {\n if (!Number.isSafeInteger(threshold) || threshold < minimum || threshold > MAX_SHAMIR_SHARES) {\n throw new TypeError(`threshold must be a safe integer from ${minimum} to ${MAX_SHAMIR_SHARES}`)\n }\n if (threshold > pointCount) throw new Error('threshold cannot exceed the number of points')\n}\n\nexport class PointInFiniteField {\n x: BigNumber\n y: BigNumber\n\n constructor (x: BigNumber, y: BigNumber) {\n const P = new Curve().p // arithmetic is mod P\n this.x = x.umod(P)\n this.y = y.umod(P)\n }\n\n toString (): string {\n return toBase58(this.x.toArray()) + '.' + toBase58(this.y.toArray())\n }\n\n static fromString (str: string): PointInFiniteField {\n if (typeof str !== 'string' || str.length > MAX_POINT_STRING_LENGTH) {\n throw new TypeError('Finite-field point must use a bounded canonical Base58 representation')\n }\n const [x, y, extra] = str.split('.')\n if (extra !== undefined || x === undefined || y === undefined || !BASE58_FIELD.test(x) || !BASE58_FIELD.test(y)) {\n throw new TypeError('Finite-field point must use a bounded canonical Base58 representation')\n }\n const point = new PointInFiniteField(\n new BigNumber(fromBase58(x)),\n new BigNumber(fromBase58(y))\n )\n if (point.toString() !== str) {\n throw new TypeError('Finite-field point must use a bounded canonical Base58 representation')\n }\n return point\n }\n}\n\n/**\n * Polynomial class\n *\n * This class is used to create a polynomial with a given threshold and a private key.\n * The polynomial is used to create shares of the private key.\n *\n * @param key - The private key to split\n * @param threshold - The number of shares required to recombine the private key\n *\n * @example\n * const key = new PrivateKey()\n * const threshold = 2\n * const polynomial = new Polynomial(key, threshold)\n *\n */\nexport default class Polynomial {\n readonly points: PointInFiniteField[]\n readonly threshold: number\n\n constructor (points: PointInFiniteField[], threshold?: number) {\n if (!Array.isArray(points) || points.length === 0 || points.length > MAX_SHAMIR_SHARES) {\n throw new TypeError(`points must contain from 1 to ${MAX_SHAMIR_SHARES} entries`)\n }\n const resolvedThreshold = threshold ?? points.length\n assertPolynomialThreshold(resolvedThreshold, points.length, 1)\n this.points = points.slice()\n this.threshold = resolvedThreshold\n }\n\n static fromPrivateKey (key: PrivateKey, threshold: number): Polynomial {\n if (!Number.isSafeInteger(threshold) || threshold < 2 || threshold > MAX_SHAMIR_SHARES) {\n throw new TypeError(`threshold must be a safe integer from 2 to ${MAX_SHAMIR_SHARES}`)\n }\n const P = new Curve().p // arithmetic is mod P\n // The key is the y-intercept of the polynomial where x=0.\n const points = [\n new PointInFiniteField(new BigNumber(0), new BigNumber(key.toArray()))\n ]\n\n // The other values are random\n for (let i = 1; i < threshold; i++) {\n const randomX = new BigNumber(Random(32)).umod(P)\n const randomY = new BigNumber(Random(32)).umod(P)\n points.push(new PointInFiniteField(randomX, randomY))\n }\n\n return new Polynomial(points)\n }\n\n // Evaluate the polynomial at x by using Lagrange interpolation\n valueAt (x: BigNumber): BigNumber {\n assertPolynomialThreshold(this.threshold, this.points.length, 1)\n if (!(x instanceof BigNumber)) throw new TypeError('x must be a BigNumber')\n const P = new Curve().p // arithmetic is mod P\n const seenXCoordinates = new Set<string>()\n for (let index = 0; index < this.threshold; index++) {\n const point = this.points[index]\n if (!(point instanceof PointInFiniteField) || !(point.x instanceof BigNumber) || !(point.y instanceof BigNumber)) {\n throw new TypeError('points must contain finite-field points')\n }\n if (point.x.isNeg() || point.y.isNeg() || point.x.gte(P) || point.y.gte(P)) {\n throw new TypeError('point coordinates must be canonical field elements')\n }\n const xCoordinate = point.x.toString(16)\n if (seenXCoordinates.has(xCoordinate)) throw new Error('Polynomial points must have unique x coordinates')\n seenXCoordinates.add(xCoordinate)\n }\n const normalizedX = x.umod(P)\n let y = new BigNumber(0)\n for (let i = 0; i < this.threshold; i++) {\n let term = this.points[i].y\n for (let j = 0; j < this.threshold; j++) {\n if (i !== j) {\n const xj = this.points[j].x\n const xi = this.points[i].x\n\n const numerator = normalizedX.sub(xj).umod(P)\n const denominator = xi.sub(xj).umod(P)\n const denominatorInverse = denominator.invm(P)\n\n const fraction = numerator.mul(denominatorInverse).umod(P)\n term = term.mul(fraction).umod(P)\n }\n }\n y = y.add(term).umod(P)\n }\n return y\n }\n}\n","import BigNumber from './BigNumber.js'\nimport Signature from './Signature.js'\nimport PublicKey from './PublicKey.js'\nimport Point from './Point.js'\nimport Curve from './Curve.js'\nimport { sign, verify } from './ECDSA.js'\nimport { sha256, sha256hmac, sha512hmac } from './Hash.js'\nimport Random from './Random.js'\nimport { fromBase58Check, toArray, toBase58Check } from './utils.js'\nimport Polynomial, { MAX_SHAMIR_SHARES, PointInFiniteField } from './Polynomial.js'\n\nconst MAX_BACKUP_SHARE_LENGTH = 256\nconst BACKUP_SHARE_FIELD = /^[1-9A-HJ-NP-Za-km-z]{1,64}$/\nconst BACKUP_SHARE_THRESHOLD = /^(?:[2-9]|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])$/\nconst BACKUP_SHARE_INTEGRITY = /^[0-9a-f]{8}$/\n\nfunction assertKeyShareCollection(points: PointInFiniteField[], threshold: number, integrity: string): void {\n if (!Array.isArray(points) || points.length === 0 || points.length > MAX_SHAMIR_SHARES) {\n throw new TypeError(`shares must contain from 1 to ${MAX_SHAMIR_SHARES} entries`)\n }\n if (!Number.isSafeInteger(threshold) || threshold < 2 || threshold > MAX_SHAMIR_SHARES) {\n throw new TypeError(`threshold must be a safe integer from 2 to ${MAX_SHAMIR_SHARES}`)\n }\n if (typeof integrity !== 'string' || !BACKUP_SHARE_INTEGRITY.test(integrity)) {\n throw new TypeError('integrity must be an 8-character lowercase hexadecimal string')\n }\n}\n\n/**\n * @class KeyShares\n *\n * This class is used to store the shares of a private key.\n *\n * @param shares - An array of shares\n * @param threshold - The number of shares required to recombine the private key\n *\n * @returns KeyShares\n *\n * @example\n * const key = PrivateKey.fromShares(shares)\n *\n */\n\nexport class KeyShares {\n points: PointInFiniteField[]\n threshold: number\n integrity: string\n\n constructor(points: PointInFiniteField[], threshold: number, integrity: string) {\n this.points = points\n this.threshold = threshold\n this.integrity = integrity\n }\n\n /**\n * Parse one or more canonical bounded backup shares. Each share uses\n * `x.y.threshold.integrity`, where the threshold is from 2 through 255.\n */\n static fromBackupFormat(shares: string[]): KeyShares {\n if (!Array.isArray(shares) || shares.length === 0 || shares.length > MAX_SHAMIR_SHARES) {\n throw new TypeError(`shares must contain from 1 to ${MAX_SHAMIR_SHARES} entries`)\n }\n let threshold = 0\n let integrity = ''\n const points: PointInFiniteField[] = []\n for (let idx = 0; idx < shares.length; idx++) {\n if (!Object.prototype.hasOwnProperty.call(shares, idx)) throw new TypeError('shares must be a dense array')\n const share = shares[idx]\n if (typeof share !== 'string' || share.length > MAX_BACKUP_SHARE_LENGTH) {\n throw new TypeError(`Invalid share format in share ${idx.toString()}`)\n }\n const shareParts = share.split('.')\n if (shareParts.length !== 4) {\n throw new Error(`Invalid share format in share ${idx.toString()}. Expected format: \"x.y.t.i\"`)\n }\n const [x, y, t, i] = shareParts\n if (\n x === undefined ||\n y === undefined ||\n t === undefined ||\n i === undefined ||\n !BACKUP_SHARE_FIELD.test(x) ||\n !BACKUP_SHARE_FIELD.test(y) ||\n !BACKUP_SHARE_THRESHOLD.test(t) ||\n !BACKUP_SHARE_INTEGRITY.test(i)\n ) {\n throw new TypeError(`Invalid canonical share data in share ${idx.toString()}`)\n }\n const tInt = Number(t)\n if (idx !== 0 && threshold !== tInt) {\n throw new Error('Threshold mismatch in share ' + idx.toString())\n }\n if (idx !== 0 && integrity !== i) {\n throw new Error('Integrity mismatch in share ' + idx.toString())\n }\n threshold = tInt\n integrity = i\n points.push(PointInFiniteField.fromString(`${x}.${y}`))\n }\n assertKeyShareCollection(points, threshold, integrity)\n return new KeyShares(points, threshold, integrity)\n }\n\n toBackupFormat(): string[] {\n assertKeyShareCollection(this.points, this.threshold, this.integrity)\n const result: string[] = []\n for (let index = 0; index < this.points.length; index++) {\n if (!Object.prototype.hasOwnProperty.call(this.points, index)) throw new TypeError('shares must be a dense array')\n const point = this.points[index]\n if (!(point instanceof PointInFiniteField)) throw new TypeError('shares must contain finite-field points')\n const serialized = point.toString()\n if (PointInFiniteField.fromString(serialized).toString() !== serialized) {\n throw new TypeError('shares must contain canonical finite-field points')\n }\n result.push(`${serialized}.${this.threshold.toString()}.${this.integrity}`)\n }\n return result\n }\n}\n\n/**\n * Represents a Private Key, which is a secret that can be used to generate signatures in a cryptographic system.\n *\n * The `PrivateKey` class extends from the `BigNumber` class. It offers methods to create signatures, verify them,\n * create a corresponding public key and derive a shared secret from a public key.\n *\n * @extends {BigNumber}\n * @see {@link BigNumber} for more information on BigNumber.\n */\nexport default class PrivateKey extends BigNumber {\n /**\n * Generates a private key randomly.\n *\n * @method fromRandom\n * @static\n * @returns The newly generated Private Key.\n *\n * @example\n * const privateKey = PrivateKey.fromRandom();\n */\n static fromRandom(): PrivateKey {\n return new PrivateKey(Random(32))\n }\n\n /**\n * Generates a private key from a string.\n *\n * @method fromString\n * @static\n * @param str - The string to generate the private key from.\n * @param base - The base of the string.\n * @returns The generated Private Key.\n * @throws Will throw an error if the string is not valid.\n **/\n static override fromString(str: string, base: number | 'hex' = 'hex'): PrivateKey {\n return new PrivateKey(super.fromString(str, base).toArray())\n }\n\n /**\n * Generates a private key from a hexadecimal string.\n *\n * @method fromHex\n * @static\n * @param {string} str - The hexadecimal string representing the private key. The string must represent a valid private key in big-endian format.\n * @returns {PrivateKey} The generated Private Key instance.\n * @throws {Error} If the string is not a valid hexadecimal or represents an invalid private key.\n **/\n static override fromHex(str: string): PrivateKey {\n return new PrivateKey(super.fromHex(str, 'big'))\n }\n\n /**\n * Generates a private key from a WIF (Wallet Import Format) string.\n *\n * @method fromWif\n * @static\n * @param wif - The WIF string to generate the private key from.\n * @param base - The base of the string.\n * @returns The generated Private Key.\n * @throws Will throw an error if the string is not a valid WIF.\n **/\n static fromWif(wif: string, prefixLength: number = 1): PrivateKey {\n const decoded = fromBase58Check(wif, undefined, prefixLength)\n if (decoded.data.length !== 33) {\n throw new Error('Invalid WIF length')\n }\n if (decoded.data[32] !== 1) {\n throw new Error('Invalid WIF padding')\n }\n return new PrivateKey(decoded.data.slice(0, 32))\n }\n\n /**\n * @constructor\n *\n * @param number - The number (various types accepted) to construct a BigNumber from. Default is 0.\n *\n * @param base - The base of number provided. By default is 10. Ignored if number is BigNumber.\n *\n * @param endian - The endianness provided. By default is 'big endian'. Ignored if number is BigNumber.\n *\n * @param modN - Optional. Default 'apply. If 'apply', apply modN to input to guarantee a valid PrivateKey. If 'error', if input is out of field throw new Error('Input is out of field'). If 'nocheck', assumes input is in field.\n *\n * @example\n * import PrivateKey from './PrivateKey';\n * import BigNumber from './BigNumber';\n * const privKey = new PrivateKey(new BigNumber('123456', 10, 'be'));\n */\n constructor(\n number: BigNumber | number | string | number[] = 0,\n base: number | 'be' | 'le' | 'hex' = 10,\n endian: 'be' | 'le' = 'be',\n modN: 'apply' | 'nocheck' | 'error' = 'apply'\n ) {\n if (number instanceof BigNumber) {\n super()\n number.copy(this)\n } else {\n super(number, base, endian)\n }\n\n if (modN !== 'nocheck') {\n const check = this.checkInField()\n if (!check.inField) {\n if (modN === 'error') {\n throw new Error('Input is out of field')\n }\n // Force the PrivateKey BigNumber value to lie in the field limited by curve.n\n BigNumber.move(this, check.modN)\n }\n }\n }\n\n /**\n * A utility function to check that the value of this PrivateKey lies in the field limited by curve.n\n * @returns { inField, modN } where modN is this PrivateKey's current BigNumber value mod curve.n, and inField is true only if modN equals current BigNumber value.\n */\n checkInField(): { inField: boolean; modN: BigNumber } {\n const curve = new Curve()\n const modN = this.mod(curve.n)\n const inField = this.cmp(modN) === 0\n return { inField, modN }\n }\n\n /**\n * @returns true if the PrivateKey's current BigNumber value lies in the field limited by curve.n\n */\n isValid(): boolean {\n return this.checkInField().inField\n }\n\n /**\n * Signs a message using the private key.\n *\n * @method sign\n * @param msg - The message (array of numbers or string) to be signed.\n * @param enc - If 'hex' the string will be treated as hex, utf8 otherwise.\n * @param forceLowS - If true (the default), the signature will be forced to have a low S value.\n * @param customK — If provided, uses a custom K-value for the signature. Provie a function that returns a BigNumber, or the BigNumber itself.\n * @returns A digital signature generated from the hash of the message and the private key.\n *\n * @example\n * const privateKey = PrivateKey.fromRandom();\n * const signature = privateKey.sign('Hello, World!');\n */\n sign(\n msg: number[] | string,\n enc?: 'hex' | 'utf8',\n forceLowS: boolean = true,\n customK?: ((iter: number) => BigNumber) | BigNumber\n ): Signature {\n const msgHash = new BigNumber(sha256(msg, enc), 16)\n return sign(msgHash, this, forceLowS, customK)\n }\n\n /**\n * Verifies a message's signature using the public key associated with this private key.\n *\n * @method verify\n * @param msg - The original message which has been signed.\n * @param sig - The signature to be verified.\n * @param enc - The data encoding method.\n * @returns Whether or not the signature is valid.\n *\n * @example\n * const privateKey = PrivateKey.fromRandom();\n * const signature = privateKey.sign('Hello, World!');\n * const isSignatureValid = privateKey.verify('Hello, World!', signature);\n */\n verify(msg: number[] | string, sig: Signature, enc?: 'hex'): boolean {\n const msgHash = new BigNumber(sha256(msg, enc), 16)\n return verify(msgHash, sig, this.toPublicKey())\n }\n\n /**\n * Converts the private key to its corresponding public key.\n *\n * The public key is generated by multiplying the base point G of the curve and the private key.\n *\n * @method toPublicKey\n * @returns The generated PublicKey.\n *\n * @example\n * const privateKey = PrivateKey.fromRandom();\n * const publicKey = privateKey.toPublicKey();\n */\n toPublicKey(): PublicKey {\n const c = new Curve()\n const p = c.g.mulCT(this)\n return new PublicKey(p.x, p.y)\n }\n\n /**\n * Converts the private key to a Wallet Import Format (WIF) string.\n *\n * Base58Check encoding is used for encoding the private key.\n * The prefix\n *\n * @method toWif\n * @returns The WIF string.\n *\n * @param prefix defaults to [0x80] for mainnet, set it to [0xef] for testnet.\n *\n * @throws Error('Value is out of field') if current BigNumber value is out of field limited by curve.n\n *\n * @example\n * const privateKey = PrivateKey.fromRandom();\n * const wif = privateKey.toWif();\n * const testnetWif = privateKey.toWif([0xef]);\n */\n toWif(prefix: number[] = [0x80]): string {\n if (!this.isValid()) {\n throw new Error('Value is out of field')\n }\n return toBase58Check([...this.toArray('be', 32), 1], prefix)\n }\n\n /**\n * Base58Check encodes the hash of the public key associated with this private key with a prefix to indicate locking script type.\n * Defaults to P2PKH for mainnet, otherwise known as a \"Bitcoin Address\".\n *\n * @param prefix defaults to [0x00] for mainnet, set to [0x6f] for testnet or use the strings 'testnet' or 'mainnet'\n *\n * @returns Returns the address encoding associated with the hash of the public key associated with this private key.\n *\n * @example\n * const address = privkey.toAddress()\n * const address = privkey.toAddress('mainnet')\n * const testnetAddress = privkey.toAddress([0x6f])\n * const testnetAddress = privkey.toAddress('testnet')\n */\n toAddress(prefix: number[] | string = [0x00]): string {\n return this.toPublicKey().toAddress(prefix)\n }\n\n /**\n * Converts this PrivateKey to a hexadecimal string.\n *\n * @method toHex\n * @param length - The minimum length of the hex string\n * @returns Returns a string representing the hexadecimal value of this BigNumber.\n *\n * @example\n * const bigNumber = new BigNumber(255);\n * const hex = bigNumber.toHex();\n */\n override toHex(): string {\n return super.toHex(32)\n }\n\n /**\n * Converts this PrivateKey to a string representation.\n *\n * @method toString\n * @param {number | 'hex'} [base='hex'] - The base for representing the number. Default is hexadecimal ('hex').\n * @param {number} [padding=64] - The minimum number of digits for the output string. Default is 64, ensuring a 256-bit representation in hexadecimal.\n * @returns {string} A string representation of the PrivateKey in the specified base, padded to the specified length.\n *\n **/\n override toString(base: number | 'hex' = 'hex', padding: number = 64): string {\n return super.toString(base, padding)\n }\n\n /**\n * Derives a shared secret from the public key.\n *\n * @method deriveSharedSecret\n * @param key - The public key to derive the shared secret from.\n * @returns The derived shared secret (a point on the curve).\n * @throws Will throw an error if the public key is not valid.\n *\n * @example\n * const privateKey = PrivateKey.fromRandom();\n * const publicKey = privateKey.toPublicKey();\n * const sharedSecret = privateKey.deriveSharedSecret(publicKey);\n */\n deriveSharedSecret(key: PublicKey): Point {\n if (!key.validate()) {\n throw new Error('Public key not valid for ECDH secret derivation')\n }\n return key.mulCT(this)\n }\n\n /**\n * SECURITY NOTE – DETERMINISTIC CHILD KEY DERIVATION\n *\n * This method derives child private keys deterministically from the caller’s\n * long-term private key, the counterparty’s public key, and a caller-supplied\n * invoice number using HMAC over an ECDH shared secret (BRC-42 style derivation).\n *\n * This construction does NOT implement a formally authenticated key exchange\n * (AKE) and does NOT provide the following security properties:\n *\n * - Forward secrecy: Compromise of a long-term private key compromises all\n * past and future child keys derived from it.\n * - Replay protection: Child keys are deterministic for a given invoice\n * number and key pair; previously observed messages can be replayed.\n * - Explicit authentication / identity binding: Possession of a public key\n * alone does not guarantee the intended peer identity, enabling potential\n * identity misbinding attacks if higher-level identity verification is absent.\n *\n * This derivation is intended for lightweight, deterministic key hierarchies\n * where both parties already possess and trust each other’s long-term public\n * keys. It SHOULD NOT be used as a drop-in replacement for a standard\n * authenticated key exchange (e.g. X3DH, Noise, or SIGMA) in high-security or\n * high-value contexts.\n *\n * Any future protocol providing forward secrecy, replay protection, or strong\n * peer authentication will require a versioned, breaking change.\n */\n /**\n * Derives a child key with BRC-42.\n * @param publicKey The public key of the other party\n * @param invoiceNumber The invoice number used to derive the child key\n * @param cacheSharedSecret Optional function to cache shared secrets\n * @param retrieveCachedSharedSecret Optional function to retrieve shared secrets from the cache\n * @returns The derived child key.\n */\n deriveChild(\n publicKey: PublicKey,\n invoiceNumber: string,\n cacheSharedSecret?: (priv: PrivateKey, pub: Point, point: Point) => void,\n retrieveCachedSharedSecret?: (priv: PrivateKey, pub: Point) => Point | undefined\n ): PrivateKey {\n let sharedSecret: Point\n if (typeof retrieveCachedSharedSecret === 'function') {\n const retrieved = retrieveCachedSharedSecret(this, publicKey)\n if (retrieved === undefined) {\n sharedSecret = this.deriveSharedSecret(publicKey)\n if (typeof cacheSharedSecret === 'function') {\n cacheSharedSecret(this, publicKey, sharedSecret)\n }\n } else {\n sharedSecret = retrieved\n }\n } else {\n sharedSecret = this.deriveSharedSecret(publicKey)\n }\n const invoiceNumberBin = toArray(invoiceNumber, 'utf8')\n const hmac = sha256hmac(sharedSecret.encode(true), invoiceNumberBin)\n const curve = new Curve()\n return new PrivateKey(this.add(new BigNumber(hmac)).mod(curve.n).toArray())\n }\n\n /**\n * Splits the private key into shares using Shamir's Secret Sharing Scheme.\n *\n * @param threshold The minimum number of shares required to reconstruct the private key.\n * @param totalShares The total number of shares to generate.\n * Both values must be safe integers from 2 through 255.\n * @param prime The prime number to be used in Shamir's Secret Sharing Scheme.\n * @returns An array of shares.\n *\n * @example\n * const key = PrivateKey.fromRandom()\n * const shares = key.toKeyShares(2, 5)\n */\n toKeyShares(threshold: number, totalShares: number): KeyShares {\n if (typeof threshold !== 'number' || typeof totalShares !== 'number') {\n throw new TypeError('threshold and totalShares must be numbers')\n }\n if (!Number.isSafeInteger(threshold) || !Number.isSafeInteger(totalShares)) {\n throw new TypeError('threshold and totalShares must be safe integers')\n }\n if (threshold < 2) throw new Error('threshold must be at least 2')\n if (totalShares < 2) throw new Error('totalShares must be at least 2')\n if (threshold > totalShares) {\n throw new Error('threshold should be less than or equal to totalShares')\n }\n if (threshold > MAX_SHAMIR_SHARES || totalShares > MAX_SHAMIR_SHARES) {\n throw new RangeError(`threshold and totalShares cannot exceed ${MAX_SHAMIR_SHARES}`)\n }\n\n const poly = Polynomial.fromPrivateKey(this, threshold)\n\n const points: PointInFiniteField[] = []\n const usedXCoordinates = new Set<string>()\n const curve = new Curve()\n\n /**\n * Cryptographically secure x-coordinate generation for Shamir's Secret Sharing (toKeyShares)\n *\n * - Each x-coordinate is derived using a master seed (Random(64)) as the HMAC key and a per-attempt counter array as the message.\n * - The counter array includes the share index, the attempt number (to handle rare collisions), and 32 bytes of fresh randomness for each attempt.\n * - This ensures:\n * 1. **Non-determinism**: Each split is unique, even for the same key and parameters, due to the per-attempt randomness.\n * 2. **Uniqueness**: x-coordinates are checked for zero and duplication; retry logic ensures no repeats or invalid values.\n * 3. **Cryptographic strength**: HMAC-SHA-512 is robust, and combining deterministic and random values protects against RNG compromise or bias.\n * 4. **Defensive programming**: Attempts are capped (5 per share) to prevent infinite loops in pathological cases.\n *\n * This approach is robust against all practical attacks and is suitable for high-security environments where deterministic splits are not desired.\n */\n const seed = Random(64)\n for (let i = 0; i < totalShares; i++) {\n let x: BigNumber\n let attempts = 0\n do {\n // To ensure no two points are ever the same, even if the system RNG is compromised,\n // we'll use a different counter value for each point and use SHA-512 HMAC.\n const counter = [i, attempts, ...Random(32)]\n const h = sha512hmac(seed, counter)\n x = new BigNumber(h).umod(curve.p)\n // repeat generation if x is zero or has already been used (insanely unlikely)\n attempts++\n if (attempts > 5) {\n throw new Error('Failed to generate unique x coordinate after 5 attempts')\n }\n } while (x.isZero() || usedXCoordinates.has(x.toString()))\n\n usedXCoordinates.add(x.toString())\n const y = poly.valueAt(x)\n points.push(new PointInFiniteField(x, y))\n }\n\n const integrity = (this.toPublicKey().toHash('hex') as string).slice(0, 8)\n\n return new KeyShares(points, threshold, integrity)\n }\n\n /**\n * @method toBackupShares\n *\n * Creates a backup of the private key by splitting it into shares.\n *\n *\n * @param threshold The number of shares which will be required to reconstruct the private key.\n * @param totalShares The number of shares to generate for distribution.\n * Both values must be safe integers from 2 through 255.\n * @returns\n */\n toBackupShares(threshold: number, totalShares: number): string[] {\n return this.toKeyShares(threshold, totalShares).toBackupFormat()\n }\n\n /**\n *\n * @method fromBackupShares\n *\n * Creates a private key from backup shares.\n *\n * @param shares\n * @returns PrivateKey\n *\n * @example\n *\n * const share1 = '3znuzt7DZp8HzZTfTh5MF9YQKNX3oSxTbSYmSRGrH2ev.2Nm17qoocmoAhBTCs8TEBxNXCskV9N41rB2PckcgYeqV.2.35449bb9'\n * const share2 = 'Cm5fuUc39X5xgdedao8Pr1kvCSm8Gk7Cfenc7xUKcfLX.2juyK9BxCWn2DiY5JUAgj9NsQ77cc9bWksFyW45haXZm.2.35449bb9'\n *\n * const recoveredKey = PrivateKey.fromBackupShares([share1, share2])\n */\n static fromBackupShares(shares: string[]): PrivateKey {\n return PrivateKey.fromKeyShares(KeyShares.fromBackupFormat(shares))\n }\n\n /**\n * Combines shares to reconstruct the private key.\n *\n * @param shares An array of points (shares) to be used to reconstruct the private key.\n * @param threshold The minimum number of shares required to reconstruct the private key.\n *\n * @returns The reconstructed private key.\n *\n **/\n static fromKeyShares(keyShares: KeyShares): PrivateKey {\n if (keyShares === null || typeof keyShares !== 'object') throw new TypeError('keyShares must be an object')\n const points = keyShares.points\n const threshold = keyShares.threshold\n const integrity = keyShares.integrity\n assertKeyShareCollection(points, threshold, integrity)\n if (points.length < threshold) {\n throw new Error(`At least ${threshold} shares are required to reconstruct the private key`)\n }\n\n const ownedPoints: PointInFiniteField[] = []\n const P = new Curve().p\n for (let index = 0; index < threshold; index++) {\n if (!Object.prototype.hasOwnProperty.call(points, index)) throw new TypeError('shares must be a dense array')\n const point = points[index]\n if (!(point instanceof PointInFiniteField) || !(point.x instanceof BigNumber) || !(point.y instanceof BigNumber)) {\n throw new TypeError('shares must contain finite-field points')\n }\n if (point.x.isNeg() || point.y.isNeg() || point.x.gte(P) || point.y.gte(P)) {\n throw new TypeError('share coordinates must be canonical field elements')\n }\n ownedPoints.push(new PointInFiniteField(new BigNumber(point.x.toArray()), new BigNumber(point.y.toArray())))\n }\n // check to see if two points have the same x value\n for (let i = 0; i < threshold; i++) {\n for (let j = i + 1; j < threshold; j++) {\n if (ownedPoints[i].x.eq(ownedPoints[j].x)) {\n throw new Error('Duplicate share detected, each must be unique.')\n }\n }\n }\n const poly = new Polynomial(ownedPoints, threshold)\n const privateKey = new PrivateKey(poly.valueAt(new BigNumber(0)).toArray())\n const integrityHash = privateKey.toPublicKey().toHash('hex').slice(0, 8)\n if (integrityHash !== integrity) {\n throw new Error('Integrity hash mismatch')\n }\n\n return privateKey\n }\n}\n","/**\n * Wrap an async frame handler so frames are handled one at a time, in arrival order.\n *\n * WebSocket `onmessage` does not wait for an async handler. The phone sends its plain `hello`\n * and then, as soon as the user taps Connect, a sealed `ready`. If the handler for `hello` is\n * still deriving the session key when `ready` arrives, a naive handler sees no key yet and drops\n * `ready`, so pairing never finishes. Chaining every frame onto one promise fixes that.\n */\nexport function inOrder<T>(handle: (frame: T) => Promise<void> | void, onError?: (e: unknown) => void) {\n let queue: Promise<void> = Promise.resolve();\n return (frame: T): Promise<void> => {\n queue = queue.then(() => handle(frame)).catch((e) => onError?.(e));\n return queue;\n };\n}\n","/**\n * Phone pairing protocol (tokenblaster.lol docs/wallet-connect.md §4), shared by the site side and\n * bWallet. Kept dependency-light (@bsv/sdk + WebCrypto) so the same file can be copied into sites\n * until it ships as @b0ase/wallet.\n *\n * QR: https://www.bwallet.space/pair?v=1&r=<relay host>&c=<channel>&k=<site pubkey>&o=<origin>&e=<expiry>\n * key: ECDH(secp256k1) → HKDF-SHA256(salt = channel bytes, info = \"bwallet-pair-v1\") → AES-256-GCM\n * frame: { s: seq, n: nonce b64, d: ciphertext b64 }, AAD = \"<sender role>|<s>\", s strictly increasing\n * code: first 2 bytes of SHA-256(key bits) → 4 digits, shown on both screens\n */\nimport { PrivateKey, PublicKey } from '@bsv/sdk';\n\nexport const PAIR_VERSION = '1';\nexport const PAIR_INFO = 'bwallet-pair-v1';\n// www: the bare domain redirects there, and app-link checks (Apple's AASA) don't follow redirects.\nexport const PAIR_HOST = 'www.bwallet.space';\nconst PAIR_HOSTS = new Set([PAIR_HOST, 'bwallet.space']);\nexport const DEFAULT_RELAY = 'relay.bwallet.space';\nexport const QR_LIFETIME_S = 120;\n\nexport type Role = 'site' | 'wallet';\nexport type WalletInfo = { name: string; icon?: string; rdns: string };\n\nexport type PairLink = { v: string; r: string; c: string; k: string; o: string; e: number };\n\n/** Plaintext messages inside encrypted frames. */\nexport type PairMessage =\n | { t: 'req'; id: string; action: string; params: unknown }\n | { t: 'res'; id: string; result?: unknown; error?: { code: string; message: string } }\n | { t: 'ready' }\n | { t: 'ping' }\n | { t: 'close'; reason: string };\n\n/** Unencrypted frames: from the relay, and the phone's hello (its key isn't shared yet). */\nexport type RelayFrame = { t: 'relay'; verifiedOrigin?: string; peer?: 'joined' | 'left'; role?: Role; error?: string };\nexport type HelloFrame = { t: 'hello'; k: string; info: WalletInfo };\nexport type SealedFrame = { s: number; n: string; d: string };\n\nconst enc = new TextEncoder();\nconst dec = new TextDecoder();\n\n// Chunked: String.fromCharCode(...bytes) overflows the call stack on large frames (signed transactions).\nconst binary = (bytes: Uint8Array) => {\n let s = '';\n for (let i = 0; i < bytes.length; i += 0x8000) s += String.fromCharCode(...bytes.subarray(i, i + 0x8000));\n return s;\n};\nexport const b64url = (bytes: Uint8Array) =>\n btoa(binary(bytes)).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\nexport const fromB64url = (s: string) => {\n const t = s.replace(/-/g, '+').replace(/_/g, '/');\n const bin = atob(t + '='.repeat((4 - (t.length % 4)) % 4));\n return Uint8Array.from(bin, (ch) => ch.charCodeAt(0));\n};\nconst b64 = (bytes: Uint8Array) => btoa(binary(bytes));\nconst fromB64 = (s: string) => Uint8Array.from(atob(s), (ch) => ch.charCodeAt(0));\n\nexport const newChannel = () => b64url(crypto.getRandomValues(new Uint8Array(16)));\n\nexport function pairUrl(link: PairLink): string {\n const q = new URLSearchParams({ v: link.v, r: link.r, c: link.c, k: link.k, o: link.o, e: String(link.e) });\n return `https://${PAIR_HOST}/pair?${q}`;\n}\n\n/** Parse a scanned QR (https link or bwallet:// fallback). Throws on anything else. */\nexport function parsePairUrl(text: string, nowS = Math.floor(Date.now() / 1000)): PairLink {\n const u = new URL(text.trim());\n const ok =\n (u.protocol === 'https:' && PAIR_HOSTS.has(u.host) && u.pathname === '/pair') ||\n (u.protocol === 'bwallet:' && /pair/.test(u.href));\n if (!ok) throw new Error('Not a bWallet pairing code');\n const g = (k: string) => u.searchParams.get(k) ?? '';\n const link: PairLink = { v: g('v'), r: g('r'), c: g('c'), k: g('k'), o: g('o'), e: Number(g('e')) };\n if (link.v !== PAIR_VERSION) throw new Error('This pairing code needs a newer bWallet');\n if (!/^[A-Za-z0-9_-]{22}$/.test(link.c)) throw new Error('Bad pairing code');\n if (!/^0[23][0-9a-f]{64}$/i.test(link.k)) throw new Error('Bad pairing code');\n if (!/^[a-z0-9.-]+(:\\d+)?$/i.test(link.r)) throw new Error('Bad pairing code');\n const o = new URL(link.o);\n if (o.origin !== link.o) throw new Error('Bad pairing code');\n if (!Number.isFinite(link.e) || link.e < nowS) throw new Error('This code has expired. Ask the site for a new one.');\n return link;\n}\n\nexport const relaySocketUrl = (relay: string, channel: string, role: Role, expiry?: number) => {\n const local = /^(localhost|127\\.0\\.0\\.1)(:\\d+)?$/.test(relay);\n const q = new URLSearchParams({ role });\n if (expiry) q.set('e', String(expiry));\n return `${local ? 'ws' : 'wss'}://${relay}/v1/c/${channel}?${q}`;\n};\n\n/** Shared AES key + 4-digit comparison code from my private key and their public key. */\nexport async function deriveSession(mine: PrivateKey, theirs: string, channel: string) {\n const point = mine.deriveSharedSecret(PublicKey.fromString(theirs));\n const ikm = new Uint8Array(point.encode(true) as number[]);\n const base = await crypto.subtle.importKey('raw', ikm, 'HKDF', false, ['deriveBits']);\n const bits = new Uint8Array(\n await crypto.subtle.deriveBits(\n { name: 'HKDF', hash: 'SHA-256', salt: fromB64url(channel), info: enc.encode(PAIR_INFO) },\n base,\n 256,\n ),\n );\n const key = await crypto.subtle.importKey('raw', bits, 'AES-GCM', false, ['encrypt', 'decrypt']);\n const h = new Uint8Array(await crypto.subtle.digest('SHA-256', bits));\n const code = String(((h[0] << 8) | h[1]) % 10000).padStart(4, '0');\n return { key, code };\n}\n\n/** One direction-aware encrypted pipe. `me` is the sender role used in the AAD. */\nexport class Sealer {\n private sent = 0;\n private lastSeen = 0;\n constructor(\n private key: CryptoKey,\n private me: Role,\n ) {}\n\n async seal(msg: PairMessage): Promise<SealedFrame> {\n const s = ++this.sent;\n const n = crypto.getRandomValues(new Uint8Array(12));\n const ct = new Uint8Array(\n await crypto.subtle.encrypt(\n { name: 'AES-GCM', iv: n, additionalData: enc.encode(`${this.me}|${s}`) },\n this.key,\n enc.encode(JSON.stringify(msg)),\n ),\n );\n return { s, n: b64(n), d: b64(ct) };\n }\n\n /** Decrypts a frame from the other side; null for replays, reflections or tampering. */\n async open(f: SealedFrame): Promise<PairMessage | null> {\n if (!Number.isInteger(f.s) || f.s <= this.lastSeen) return null;\n const from: Role = this.me === 'site' ? 'wallet' : 'site';\n try {\n const pt = await crypto.subtle.decrypt(\n { name: 'AES-GCM', iv: fromB64(f.n), additionalData: enc.encode(`${from}|${f.s}`) },\n this.key,\n fromB64(f.d),\n );\n this.lastSeen = f.s;\n return JSON.parse(dec.decode(pt)) as PairMessage;\n } catch {\n return null;\n }\n }\n\n /** For resuming a session after a reload: continue counters where they were. */\n get counters() {\n return { sent: this.sent, lastSeen: this.lastSeen };\n }\n restore(c: { sent: number; lastSeen: number }) {\n this.sent = c.sent;\n this.lastSeen = c.lastSeen;\n }\n}\n\nexport const isSealed = (x: unknown): x is SealedFrame =>\n !!x && typeof x === 'object' && 'd' in x && 'n' in x && 's' in x;\n","import { PrivateKey, type WalletInterface } from '@bsv/sdk';\nimport { inOrder } from './in-order.js';\nimport {\n DEFAULT_RELAY,\n PAIR_VERSION,\n QR_LIFETIME_S,\n Sealer,\n deriveSession,\n isSealed,\n newChannel,\n pairUrl,\n relaySocketUrl,\n type HelloFrame,\n type PairMessage,\n} from './protocol.js';\n\n/** localStorage-shaped storage. Methods may be sync or async. */\nexport interface PairStorage {\n getItem(key: string): string | null | Promise<string | null>;\n setItem(key: string, value: string): void | Promise<void>;\n removeItem(key: string): void | Promise<void>;\n}\n\n/** The minimum of the browser WebSocket API this package uses (the `ws` package also fits). */\nexport interface SocketLike {\n readonly readyState: number;\n onopen: ((ev: unknown) => void) | null;\n onmessage: ((ev: { data: unknown }) => void) | null;\n onerror: ((ev: unknown) => void) | null;\n onclose: ((ev: unknown) => void) | null;\n send(data: string): void;\n close(): void;\n}\nexport type SocketFactory = (url: string) => SocketLike;\n\nexport interface PairConnectionOptions {\n /** Where the pairing is kept so it survives a reload. Default: localStorage, else memory only. */\n storage?: PairStorage | null;\n /** Storage key. Default 'bwalletx.connect.pairing.v1'. */\n storageKey?: string;\n /** Opens a socket. Default: the global WebSocket. Pass one to run in Node or to test. */\n socket?: SocketFactory;\n /** Per-call timeout in ms. Default 120000. */\n callTimeoutMs?: number;\n}\n\nexport interface PairingOptions extends PairConnectionOptions {\n /** Show this link as a QR code, and as text to copy (web.bwalletx.com takes it pasted). */\n onLink: (link: string) => void;\n /** Show this 4-digit code. The wallet shows the same one; the user checks they match. */\n onCode: (code: string) => void;\n signal?: AbortSignal;\n /** Relay host. Default relay.bwallet.space. */\n relay?: string;\n /** This page's origin, as the relay will see it. Default location.origin. */\n origin?: string;\n}\n\n/** A BRC-100 wallet whose every call goes, end-to-end encrypted, to the paired phone or web wallet. */\nexport type PairedWallet = WalletInterface & {\n /** Close the relay connection. The pairing stays stored; the next call reconnects. */\n close(): void;\n /** Tell the wallet to unpair, close, and delete the stored pairing. */\n forget(): Promise<void>;\n};\n\ninterface StoredPairing {\n v: 1;\n c: string; // channel\n r: string; // relay host\n s: string; // our pairing private key (hex). Random; not a wallet key.\n k: string; // the wallet's pairing public key\n sent: number;\n lastSeen: number;\n pairedAt: number;\n}\n\nconst DEFAULT_KEY = 'bwalletx.connect.pairing.v1';\nconst OPEN = 1;\n\nfunction memoryStorage(): PairStorage {\n const m = new Map<string, string>();\n return { getItem: (k) => m.get(k) ?? null, setItem: (k, v) => void m.set(k, v), removeItem: (k) => void m.delete(k) };\n}\n\nfunction defaultStorage(): PairStorage {\n try {\n if (typeof localStorage !== 'undefined') return localStorage;\n } catch {\n /* blocked storage */\n }\n return memoryStorage();\n}\n\nfunction defaultSocket(): SocketFactory {\n return (url) => {\n if (typeof WebSocket === 'undefined') throw new Error('No WebSocket here. Pass options.socket.');\n return new WebSocket(url) as unknown as SocketLike;\n };\n}\n\nfunction parseStored(raw: string | null): StoredPairing | null {\n if (!raw) return null;\n try {\n const p = JSON.parse(raw) as Partial<StoredPairing>;\n const n = (x: unknown) => Number.isInteger(x) && (x as number) >= 0;\n if (p.v !== 1) return null;\n if (typeof p.c !== 'string' || !/^[A-Za-z0-9_-]{22}$/.test(p.c)) return null;\n if (typeof p.r !== 'string' || !/^[a-z0-9.-]+(:\\d+)?$/i.test(p.r)) return null;\n if (typeof p.s !== 'string' || !/^[0-9a-f]{64}$/i.test(p.s)) return null;\n if (typeof p.k !== 'string' || !/^0[23][0-9a-f]{64}$/i.test(p.k)) return null;\n if (!n(p.sent) || !n(p.lastSeen) || !n(p.pairedAt)) return null;\n return p as StoredPairing;\n } catch {\n return null;\n }\n}\n\nclass Link {\n private ws: SocketLike | null = null;\n private opening: Promise<void> | null = null;\n private waiting = new Map<string, { resolve: (v: unknown) => void; reject: (e: Error) => void; timer: ReturnType<typeof setTimeout> }>();\n private forgotten = false;\n\n constructor(\n private p: StoredPairing,\n private sealer: Sealer,\n private storage: PairStorage,\n private key: string,\n private socket: SocketFactory,\n private timeoutMs: number,\n ) {}\n\n /** Take over a socket that is already open (the one pairing used). */\n adopt(ws: SocketLike) {\n this.ws = ws;\n this.wire(ws);\n }\n\n private wire(ws: SocketLike) {\n ws.onmessage = inOrder((ev: { data: unknown }) => this.onFrame(String(ev.data)));\n ws.onerror = null;\n ws.onclose = () => {\n if (this.ws === ws) this.ws = null;\n this.failAll(new Error('The connection to bWalletX closed'));\n };\n }\n\n private persist() {\n if (this.forgotten) return;\n this.p = { ...this.p, ...this.sealer.counters };\n void Promise.resolve(this.storage.setItem(this.key, JSON.stringify(this.p))).catch(() => {});\n }\n\n private failAll(e: Error) {\n for (const w of this.waiting.values()) {\n clearTimeout(w.timer);\n w.reject(e);\n }\n this.waiting.clear();\n }\n\n private async ensure() {\n if (this.forgotten) throw new Error('This pairing was removed. Pair again.');\n if (this.ws && this.ws.readyState === OPEN) return;\n this.opening ??= this.reopen().finally(() => (this.opening = null));\n await this.opening;\n }\n\n private reopen() {\n // A fresh expiry lets the relay recreate the channel if it was dropped; the wallet rejoins on its own.\n const ws = this.socket(relaySocketUrl(this.p.r, this.p.c, 'site', Math.floor(Date.now() / 1000) + QR_LIFETIME_S - 10));\n return new Promise<void>((resolve, reject) => {\n ws.onopen = () => {\n this.ws = ws;\n this.wire(ws);\n resolve();\n };\n ws.onerror = () => reject(new Error('Could not reach the bWalletX pairing service'));\n ws.onclose = () => reject(new Error('Could not reach the bWalletX pairing service'));\n });\n }\n\n private async onFrame(raw: string) {\n let f: unknown;\n try {\n f = JSON.parse(raw);\n } catch {\n return;\n }\n const t = (f as { t?: string; error?: string }).t;\n if (t === 'relay' && (f as { error?: string }).error) {\n return this.failAll(new Error(`bWalletX pairing service: ${(f as { error: string }).error}`));\n }\n if (!isSealed(f)) return;\n const msg = await this.sealer.open(f);\n if (!msg) return;\n this.persist();\n if (msg.t === 'res') {\n const w = this.waiting.get(msg.id);\n if (!w) return;\n clearTimeout(w.timer);\n this.waiting.delete(msg.id);\n if (msg.error) w.reject(Object.assign(new Error(msg.error.message), { code: msg.error.code }));\n else w.resolve(msg.result);\n } else if (msg.t === 'close') {\n this.drop();\n this.failAll(new Error('bWalletX disconnected this site. Pair again.'));\n }\n }\n\n async call(action: string, params: unknown): Promise<unknown> {\n await this.ensure();\n const ws = this.ws!;\n const id = `${action}-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\n const result = new Promise<unknown>((resolve, reject) => {\n const timer = setTimeout(() => {\n if (this.waiting.delete(id)) reject(new Error('No answer from bWalletX. Open it, unlocked, and approve.'));\n }, this.timeoutMs);\n this.waiting.set(id, { resolve, reject, timer });\n });\n ws.send(JSON.stringify(await this.sealer.seal({ t: 'req', id, action, params } satisfies PairMessage)));\n this.persist();\n return result;\n }\n\n close() {\n const ws = this.ws;\n this.ws = null;\n ws?.close();\n }\n\n private drop() {\n this.forgotten = true;\n void Promise.resolve(this.storage.removeItem(this.key)).catch(() => {});\n this.close();\n }\n\n async forget() {\n if (this.forgotten) return;\n try {\n if (this.ws && this.ws.readyState === OPEN) {\n this.ws.send(JSON.stringify(await this.sealer.seal({ t: 'close', reason: 'site unpaired' })));\n }\n } catch {\n /* best effort */\n }\n this.drop();\n }\n\n wallet(): PairedWallet {\n return new Proxy({} as PairedWallet, {\n get: (_t, method) => {\n if (method === 'close') return () => this.close();\n if (method === 'forget') return () => this.forget();\n if (typeof method !== 'string' || method === 'then' || method === 'toJSON') return undefined;\n return (params: unknown) => this.call(method, params ?? {});\n },\n });\n }\n}\n\n/**\n * Pair with bWalletX on a phone (scan the QR) or web.bwalletx.com (paste the link).\n * Resolves with a wallet once the user taps Connect. The pairing is stored (see `storage`) so\n * `restorePairing()` can reconnect after a reload without a new QR.\n */\nexport function pairBwalletX(opts: PairingOptions): Promise<PairedWallet> {\n const storage = opts.storage === undefined ? defaultStorage() : (opts.storage ?? memoryStorage());\n const key = opts.storageKey ?? DEFAULT_KEY;\n const socket = opts.socket ?? defaultSocket();\n const relay = opts.relay ?? DEFAULT_RELAY;\n const origin = opts.origin ?? (typeof location !== 'undefined' ? location.origin : '');\n if (!origin) return Promise.reject(new Error('pairBwalletX needs options.origin outside a browser'));\n\n const siteKey = PrivateKey.fromRandom(); // a throwaway pairing key, not a wallet key\n const channel = newChannel();\n const expiry = Math.floor(Date.now() / 1000) + QR_LIFETIME_S;\n\n return new Promise<PairedWallet>((resolve, reject) => {\n if (opts.signal?.aborted) return reject(new Error('cancelled'));\n let ws: SocketLike;\n try {\n ws = socket(relaySocketUrl(relay, channel, 'site', expiry));\n } catch (e) {\n return reject(e);\n }\n let sealer: Sealer | null = null;\n let walletKey = '';\n let settled = false;\n const fail = (e: Error) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n ws.close();\n reject(e);\n };\n const timer = setTimeout(() => fail(new Error('The pairing code expired. Show a new one.')), QR_LIFETIME_S * 1000);\n opts.signal?.addEventListener('abort', () => fail(new Error('cancelled')));\n ws.onerror = () => fail(new Error('Could not reach the bWalletX pairing service'));\n ws.onclose = () => fail(new Error('The connection to bWalletX closed before pairing finished'));\n ws.onmessage = inOrder(async (ev: { data: unknown }) => {\n if (settled) return;\n let f: unknown;\n try {\n f = JSON.parse(String(ev.data));\n } catch {\n return;\n }\n if ((f as HelloFrame).t === 'hello' && !sealer) {\n walletKey = (f as HelloFrame).k;\n const s = await deriveSession(siteKey, walletKey, channel);\n sealer = new Sealer(s.key, 'site');\n opts.onCode(s.code);\n return;\n }\n if (!sealer || !isSealed(f)) return;\n const msg = await sealer.open(f);\n if (!msg) return;\n if (msg.t === 'ready') {\n settled = true;\n clearTimeout(timer);\n const p: StoredPairing = { v: 1, c: channel, r: relay, s: siteKey.toHex(), k: walletKey, ...sealer.counters, pairedAt: Date.now() };\n await Promise.resolve(storage.setItem(key, JSON.stringify(p))).catch(() => {});\n const link = new Link(p, sealer, storage, key, socket, opts.callTimeoutMs ?? 120_000);\n link.adopt(ws);\n resolve(link.wallet());\n } else if (msg.t === 'close') {\n fail(new Error('Pairing was declined in bWalletX'));\n }\n });\n opts.onLink(pairUrl({ v: PAIR_VERSION, r: relay, c: channel, k: siteKey.toPublicKey().toString(), o: origin, e: expiry }));\n });\n}\n\n/**\n * The wallet from a pairing stored by an earlier `pairBwalletX`, or null if there is none.\n * It connects on the first call. The wallet must still have this site paired.\n */\nexport async function restorePairing(opts: PairConnectionOptions = {}): Promise<PairedWallet | null> {\n const storage = opts.storage === undefined ? defaultStorage() : (opts.storage ?? memoryStorage());\n const key = opts.storageKey ?? DEFAULT_KEY;\n const p = parseStored(await Promise.resolve(storage.getItem(key)).catch(() => null));\n if (!p) return null;\n const { key: aes } = await deriveSession(PrivateKey.fromHex(p.s), p.k, p.c);\n const sealer = new Sealer(aes, 'site');\n sealer.restore({ sent: p.sent, lastSeen: p.lastSeen });\n return new Link(p, sealer, storage, key, opts.socket ?? defaultSocket(), opts.callTimeoutMs ?? 120_000).wallet();\n}\n\n/** Delete the stored pairing without telling the wallet. */\nexport async function clearPairing(opts: Pick<PairConnectionOptions, 'storage' | 'storageKey'> = {}) {\n const storage = opts.storage === undefined ? defaultStorage() : (opts.storage ?? memoryStorage());\n await Promise.resolve(storage.removeItem(opts.storageKey ?? DEFAULT_KEY)).catch(() => {});\n}\n","import type { WalletInterface, WalletProtocol } from '@bsv/sdk';\nimport { discoverBwalletX } from './discover.js';\nimport { pairBwalletX, restorePairing, type PairingOptions } from './pair.js';\n\n/** Security level 2, a protocol name used for nothing else. */\nexport const LOGIN_PROTOCOL: WalletProtocol = [2, 'bwallet sign in'];\n\n/** What your server's challenge route returns (createChallenge from '@bwalletx/connect/server'). */\nexport interface Challenge {\n nonce: string;\n message: string;\n keyID: string;\n protocolID?: WalletProtocol;\n}\n\nexport type SignInMethod = 'extension' | 'in-app' | 'pairing' | 'wallet';\n\nexport interface SignInOptions {\n /** Ask your server for a challenge for this identity key. */\n challenge: (identityKey: string) => Promise<Challenge>;\n /** Use this wallet instead of looking for one. `method` is then 'wallet'. */\n wallet?: WalletInterface;\n /** How to show the QR and code if pairing is needed. Without it, pairing is not tried. */\n pairing?: PairingOptions;\n /** Reuse a pairing stored by an earlier sign-in before showing a new QR. Default true. */\n reusePairing?: boolean;\n /** How long to wait for the extension or in-app browser to answer, in ms. Default 1200. */\n discoverMs?: number;\n}\n\nexport interface SignInResult {\n identityKey: string;\n /** DER signature as number[], ready to post to verifySignIn. */\n signature: number[];\n nonce: string;\n method: SignInMethod;\n /** The wallet that signed. Keep it to make more calls. */\n wallet: WalletInterface;\n}\n\n/** Find a wallet: extension or in-app browser first, then a stored pairing, then a new pairing. */\nexport async function connectBwalletX(\n opts: Pick<SignInOptions, 'wallet' | 'pairing' | 'reusePairing' | 'discoverMs'> = {},\n): Promise<{ wallet: WalletInterface; method: SignInMethod }> {\n if (opts.wallet) return { wallet: opts.wallet, method: 'wallet' };\n const found = await discoverBwalletX(opts.discoverMs);\n if (found) return { wallet: found.wallet, method: found.method };\n if (opts.reusePairing !== false) {\n const restored = await restorePairing(opts.pairing ?? {});\n if (restored) return { wallet: restored, method: 'pairing' };\n }\n if (!opts.pairing) {\n throw Object.assign(new Error('bWalletX was not found in this browser'), { code: 'NOT_FOUND' });\n }\n return { wallet: await pairBwalletX(opts.pairing), method: 'pairing' };\n}\n\n/**\n * Sign the server's challenge with the user's bWalletX identity key. Post the result's\n * identityKey, nonce and signature to your verify route.\n */\nexport async function signInWithBwalletX(opts: SignInOptions): Promise<SignInResult> {\n const { wallet, method } = await connectBwalletX(opts);\n if (method !== 'pairing') await wallet.waitForAuthentication({}).catch(() => {});\n const { publicKey: identityKey } = await wallet.getPublicKey({ identityKey: true });\n const c = await opts.challenge(identityKey);\n const { signature } = await wallet.createSignature({\n protocolID: c.protocolID ?? LOGIN_PROTOCOL,\n keyID: c.keyID,\n counterparty: 'anyone',\n data: Array.from(new TextEncoder().encode(c.message)),\n });\n return { identityKey, signature: Array.from(signature), nonce: c.nonce, method, wallet };\n}\n","const CSS = `\n.bwx-signin{display:inline-flex;align-items:center;gap:12px;min-height:48px;padding:10px 22px 10px 10px;border:0;border-radius:12px;cursor:pointer;background:linear-gradient(180deg,#fcd34d,#f59e0b);color:#000;text-align:left;font:700 16px/1.2 system-ui,-apple-system,\"Segoe UI\",sans-serif;box-shadow:0 8px 24px rgba(245,158,11,.2)}\n.bwx-signin:hover{background:linear-gradient(180deg,#fde68a,#fbbf24)}\n.bwx-signin:focus-visible{outline:2px solid #ffd24d;outline-offset:3px}\n.bwx-signin:disabled{opacity:.6;cursor:wait}\n.bwx-signin .bwx-mark{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:50%;background:#000;flex:none}\n.bwx-signin small{display:block;font-size:11px;font-weight:500;color:rgba(0,0,0,.6)}`;\n\nexport const LOGO_URL = 'https://bwalletx.com/logo.svg';\n\nexport interface ButtonOptions {\n /** Second line under the label. Default \"also works with bWallet\". false hides it. */\n subtitle?: string | false;\n onClick?: (button: HTMLButtonElement) => void;\n}\n\n/** Put the gold \"Sign in with bWalletX\" button into `el` (replacing its contents). */\nexport function renderButton(el: HTMLElement | string, opts: ButtonOptions = {}): HTMLButtonElement {\n const host = typeof el === 'string' ? document.querySelector<HTMLElement>(el) : el;\n if (!host) throw new Error(`renderButton: no element ${String(el)}`);\n if (!document.getElementById('bwx-signin-css')) {\n const style = document.createElement('style');\n style.id = 'bwx-signin-css';\n style.textContent = CSS;\n document.head.appendChild(style);\n }\n const b = document.createElement('button');\n b.type = 'button';\n b.className = 'bwx-signin';\n const mark = document.createElement('span');\n mark.className = 'bwx-mark';\n const img = document.createElement('img');\n img.src = LOGO_URL;\n img.alt = '';\n img.width = 15;\n img.height = 20;\n mark.appendChild(img);\n const label = document.createElement('span');\n label.className = 'bwx-label';\n label.textContent = 'Sign in with bWalletX';\n const sub = opts.subtitle === undefined ? 'also works with bWallet' : opts.subtitle;\n if (sub) {\n const small = document.createElement('small');\n small.textContent = sub;\n label.appendChild(small);\n }\n b.append(mark, label);\n if (opts.onClick) b.addEventListener('click', () => opts.onClick!(b));\n host.replaceChildren(b);\n return b;\n}\n"],"mappings":"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EAAA,YACAA,EAAA,UACAA,EAAA,UACAA,EAAA,UACAA,EAAA,UACAA,EAAA,aACAA,EAAA,cACAA,EAAA,eACAA,EAAA,aAEAA,EAAA,oBACAA,EAAA,oBACAA,EAAA,gBACAA,EAAA,gBACAA,EAAA,gBACAA,EAAA,gBACAA,EAAA,mBAoFE,GAAId,KAAgB,OAElBA,GAAc,SAEd,QAAOA,GA+wBT,IAAMe,EAAO,CACX,MAAO,OACP,EAAG,0EACH,EAAG,IACH,EAAG,IACH,EAAG,0EACH,EAAG,IAGH,KAAM,mEACN,OAAQ,mEACR,MAAO,CACL,CACE,EAAG,mCACH,EAAG,qCAEL,CACE,EAAG,oCACH,EAAG,qCAIP,KAAM,GACN,EAAG,CACD,mEACA,mEAryBgB,CAClB,QAAS,CACP,KAAM,EACN,OAAQ,CACN,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,mEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,kEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,kEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,mEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,mEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,kEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,kEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,mEAEF,CACE,mEACA,oEAEF,CACE,kEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,sEAIN,IAAK,CACH,IAAK,EACL,OAAQ,CACN,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,mEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,mEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,mEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,mEAEF,CACE,mEACA,oEAEF,CACE,kEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,mEAEF,CACE,mEACA,mEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,mEAEF,CACE,mEACA,oEAEF,CACE,mEACA,mEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,kEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,mEAEF,CACE,mEACA,mEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,kEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,mEAEF,CACE,mEACA,oEAEF,CACE,mEACA,mEAEF,CACE,mEACA,oEAEF,CACE,kEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,iEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,kEACA,oEAEF,CACE,mEACA,mEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,mEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,mEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,mEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,mEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,yEAmCR,KAAK,EAAI,IAAIC,EAAUD,EAAK,EAAG,EAAE,EAGjC,KAAK,IAAM,IAAIE,GAAiBF,EAAK,KAAe,EAGpD,KAAK,KAAO,IAAIC,EAAU,CAAC,EAAE,MAAM,KAAK,GAAG,EAC3C,KAAK,IAAM,IAAIA,EAAU,CAAC,EAAE,MAAM,KAAK,GAAG,EAC1C,KAAK,IAAM,IAAIA,EAAU,CAAC,EAAE,MAAM,KAAK,GAAG,EAG1C,KAAK,EAAI,IAAIA,EAAUD,EAAK,EAAG,EAAE,EACjC,KAAK,EAAIG,EAAM,SACbH,EAAK,EAQLA,EAAK,IAAI,EAIX,KAAK,QAAU,MAAM,KAAK,CAAE,OAAQ,CAAC,EAAI,IAAG,EAAoC,EAChF,KAAK,QAAU,MAAM,KAAK,CAAE,OAAQ,CAAC,EAAI,IAAG,EAAoC,EAChF,KAAK,QAAU,MAAM,KAAK,CAAE,OAAQ,CAAC,EAAI,IAAG,EAAoC,EAChF,KAAK,QAAU,MAAM,KAAK,CAAE,OAAQ,CAAC,EAAI,IAAG,EAAoC,EAEhF,KAAK,WAAa,KAAK,EAAE,UAAS,EAClC,KAAK,KAAO,KAAK,EAAE,MAAM,KAAK,GAAG,EACjC,KAAK,EAAI,IAAIC,EAAUD,EAAK,EAAG,EAAE,EAAE,MAAM,KAAK,GAAG,EACjD,KAAK,EAAI,IAAIC,EAAUD,EAAK,EAAG,EAAE,EAAE,MAAM,KAAK,GAAG,EACjD,KAAK,KAAO,KAAK,IAAI,QAAO,EAE5B,KAAK,MAAQ,KAAK,EAAE,QAAO,EAAG,KAAK,CAAC,IAAM,EAC1C,KAAK,OAAS,KAAK,EAAE,QAAO,EAAG,IAAI,KAAK,CAAC,EAAE,KAAK,EAAE,IAAM,EAGxD,KAAK,KAAO,KAAK,iBAAiBA,CAAI,EACtC,KAAK,YAAc,MAAM,KAAK,CAAE,OAAQ,CAAC,EAAI,IAAG,EAAoC,EACpF,KAAK,YAAc,MAAM,KAAK,CAAE,OAAQ,CAAC,EAAI,IAAG,EAAoC,CACtF,CA76BA,OAAO,OAAOI,EAAqBC,EAAkB,kCAAiC,CACpF,GAAI,CAAED,EACJ,MAAM,IAAI,MAAMC,CAAO,CAE3B,CAEA,OAAOC,EAAgBC,EAAWC,EAAY,CAC5C,IAAMC,EAAM,MAAM,KAAK,CAAE,OAAQ,KAAK,IAAIH,EAAI,UAAS,EAAIE,CAAI,EAAI,CAAC,EAAI,IAAM,CAAC,EAC/EC,EAAI,KAAK,CAAC,EAEV,IAAMC,EAAK,GAAMH,EAAI,EACfI,EAAIL,EAAI,MAAK,EAEnB,QAASM,EAAI,EAAGA,EAAIH,EAAI,OAAQG,IAAK,CACnC,IAAIC,EACEC,EAAMH,EAAE,MAAMD,EAAK,CAAC,EACtBC,EAAE,MAAK,GACLG,GAAOJ,GAAM,GAAK,EACpBG,GAAKH,GAAM,GAAKI,EAEhBD,EAAIC,EAENH,EAAE,MAAME,CAAC,GAETA,EAAI,EAGNJ,EAAIG,CAAC,EAAIC,EACTF,EAAE,OAAO,CAAC,CACZ,CAEA,OAAOF,CACT,CAGA,OAAOM,EAAeC,EAAa,CACjC,IAAMC,EAAkB,CAAC,CAAA,EAAI,CAAA,CAAE,EAE/BF,EAAKA,EAAG,MAAK,EACbC,EAAKA,EAAG,MAAK,EACb,IAAIE,EAAK,EACLC,EAAK,EACT,KAAOJ,EAAG,KAAK,CAACG,CAAE,EAAI,GAAKF,EAAG,KAAK,CAACG,CAAE,EAAI,GAAG,CAE3C,IAAMC,EAAMlC,GAAe6B,EAAIG,CAAE,EAC3BG,EAAMnC,GAAe8B,EAAIG,CAAE,EAC3BG,EAAKhC,GAASyB,EAAIG,EAAIE,EAAKC,CAAG,EACpCJ,EAAI,CAAC,EAAE,KAAKK,CAAE,EAEd,IAAMC,EAAKjC,GAAS0B,EAAIG,EAAIE,EAAKD,CAAG,EACpCH,EAAI,CAAC,EAAE,KAAKM,CAAE,EAGdL,EAAKzB,GAAayB,EAAII,CAAE,EACxBH,EAAK1B,GAAa0B,EAAII,CAAE,EACxBR,EAAG,OAAO,CAAC,EACXC,EAAG,OAAO,CAAC,CACb,CAEA,OAAOC,CACT,CAEA,OAAO,eAAeO,EAAUC,EAAcC,EAAgC,CAC5E,IAAMC,EAAM,IAAMF,EAClBD,EAAI,UAAUC,CAAI,EAAI,UAAuB,CAC3C,OAAI,KAAKE,CAAG,IAAM,SAChB,KAAKA,CAAG,EAAID,EAAS,KAAK,IAAI,GAEzB,KAAKC,CAAG,CACjB,CACF,CAEA,OAAO,WAAWC,EAAwB,CACxC,OAAO,OAAOA,GAAU,SAAWC,EAAQD,EAAO,KAAK,EAAIA,CAC7D,CAEA,OAAO,UAAUA,EAAe,CAC9B,OAAO,IAAI3B,EAAU2B,EAAO,MAAO,IAAI,CACzC,CAi2BA,iBAAiB5B,EAAwB,CAQvC,GAAI,CAAC,KAAK,OAAS,KAAK,EAAE,MAAM,CAAC,IAAM,EACrC,OAGF,IAAM8B,EAAO,KAAK,yBAAyB9B,CAAI,EACzC+B,EAAS,KAAK,2BAA2B/B,EAAM8B,CAAI,EACzD,MAAO,CACL,KAAAA,EACA,OAAAC,EACA,MAAOC,EAAA,KAAKrC,GAAAC,IAAL,UAAgCI,EAAM+B,GAEjD,CAEQ,yBAAyB/B,EAAwB,CACvD,GAAIA,EAAK,OAAS,OAAW,OAAO,IAAIC,EAAUD,EAAK,KAAM,EAAE,EAAE,MAAM,KAAK,GAAG,EAC/E,IAAMiC,EAAQ,KAAK,cAAc,KAAK,CAAC,EACvC,GAAIA,GAAS,KAAM,MAAM,IAAI,MAAM,4CAA4C,EAE/E,OADaA,EAAM,CAAC,EAAE,IAAIA,EAAM,CAAC,CAAC,EAAI,EAAIA,EAAM,CAAC,EAAIA,EAAM,CAAC,GAChD,MAAM,KAAK,GAAG,CAC5B,CAEQ,2BACNF,EACAD,EACAI,EAAqB,GAAK,CAE1B,GAAI,KAAK,GAAK,KAAM,MAAM,IAAI,MAAM,2CAA2C,EAC/E,IAAMC,EAAQ,KAAK,EAAE,IAAIJ,CAAM,GAAG,EAC5BK,EAAe,KAAK,EAAE,GAAK,KAAO,OAAY,KAAK,EAAE,EAAE,OAAON,CAAI,EACxE,GAAIK,GAAS,MAAQC,GAAgB,KAAM,CACzC,GAAIF,EACF,MAAM,IAAI,MACR,8EAA8E,EAGlF,MAAO,EACT,CACA,OAAOC,EAAM,IAAIC,CAAY,IAAM,CACrC,CAEQ,2BAA2BpC,EAA0B8B,EAAe,CAC1E,GAAI9B,EAAK,SAAW,OAAW,OAAO,IAAIC,EAAUD,EAAK,OAAQ,EAAE,EACnE,IAAMqC,EAAU,KAAK,cAAc,KAAK,CAAC,EACzC,GAAIA,GAAW,KAAM,MAAM,IAAI,MAAM,8CAA8C,EACnF,OAAI,KAAK,2BAA2BA,EAAQ,CAAC,EAAGP,CAAI,EAAUO,EAAQ,CAAC,GACvExC,GAAM,OACJ,KAAK,2BAA2BwC,EAAQ,CAAC,EAAGP,EAAM,EAAI,EACtD,gDAAgD,EAE3CO,EAAQ,CAAC,EAClB,CAeA,cAAc/B,EAAc,CAI1B,IAAMgC,EAAMhC,IAAQ,KAAK,EAAI,KAAK,IAAM,IAAIiC,GAAiBjC,CAAG,EAC1DkC,EAAO,IAAIvC,EAAU,CAAC,EAAE,MAAMqC,CAAG,EAAE,QAAO,EAC1CG,EAAQD,EAAK,OAAM,EAEnB,EAAI,IAAIvC,EAAU,CAAC,EAAE,MAAMqC,CAAG,EAAE,OAAM,EAAG,QAAO,EAAG,OAAOE,CAAI,EAE9DE,EAAKD,EAAM,OAAO,CAAC,EAAE,QAAO,EAC5BE,EAAKF,EAAM,OAAO,CAAC,EAAE,QAAO,EAClC,MAAO,CAACC,EAAIC,CAAE,CAChB,CAEA,cACEZ,EAAiB,CAGjB,IAAMa,EAAW,KAAK,EAAE,MAAM,KAAK,MAAM,KAAK,EAAE,UAAS,EAAK,CAAC,CAAC,EAI5DC,EAAId,EACJe,EAAI,KAAK,EAAE,MAAK,EAChBC,EAAK,IAAI9C,EAAU,CAAC,EACpB+C,EAAK,IAAI/C,EAAU,CAAC,EACpBgD,EAAK,IAAIhD,EAAU,CAAC,EACpBiD,EAAK,IAAIjD,EAAU,CAAC,EAGpBkD,EACAC,EAEAC,EACAC,EAEAC,EACAC,EAEAC,EAAmB,IAAIxD,EAAU,CAAC,EAClCW,EAAI,EACJ8C,EAAe,IAAIzD,EAAU,CAAC,EAC9B0D,EAAe,IAAI1D,EAAU,CAAC,EAElC,KAAO4C,EAAE,KAAK,CAAC,IAAM,GAAG,CACtB,IAAMe,EAAId,EAAE,IAAID,CAAC,EACjBa,EAAIZ,EAAE,IAAIc,EAAE,IAAIf,CAAC,CAAC,EAClBc,EAAIV,EAAG,IAAIW,EAAE,IAAIb,CAAE,CAAC,EACpB,IAAMc,EAAIX,EAAG,IAAIU,EAAE,IAAIZ,CAAE,CAAC,EAE1B,GAAIK,IAAO,QAAaK,EAAE,IAAId,CAAQ,EAAI,EACxCO,EAAKM,EAAM,IAAG,EACdL,EAAKL,EACLM,EAAKK,EAAE,IAAG,EACVJ,EAAKK,UACIN,IAAO,QAAa,EAAEzC,IAAM,EACrC,MAEF6C,EAAQC,EAERZ,EAAID,EACJA,EAAIa,EACJT,EAAKF,EACLA,EAAKY,EACLT,EAAKF,EACLA,EAAKa,CACP,CAGA,GAAIV,IAAO,QAAaC,IAAO,QAAaC,IAAO,QAAaC,IAAO,OACrE,MAAM,IAAI,MAAM,qCAAqC,EAGvDC,EAAKG,EAAE,IAAG,EACVF,EAAKG,EAEL,IAAMG,EAAOT,EAAG,IAAG,EAAG,IAAIC,EAAG,IAAG,CAAE,EAGlC,OAFaC,EAAG,IAAG,EAAG,IAAIC,EAAG,IAAG,CAAE,EAEzB,IAAIM,CAAI,GAAK,IACpBP,EAAKJ,EACLK,EAAKJ,GAIHC,EAAG,WAAa,IAClBA,EAAKA,EAAG,IAAG,EACXC,EAAKA,EAAG,IAAG,GAETC,EAAG,WAAa,IAClBA,EAAKA,EAAG,IAAG,EACXC,EAAKA,EAAG,IAAG,GAGN,CACL,CAAE,EAAGH,EAAI,EAAGC,CAAE,EACd,CAAE,EAAGC,EAAI,EAAGC,CAAE,EAElB,CAEA,WAAW7C,EAAY,CACrB,GAAI,KAAK,MAAQ,KACf,MAAM,IAAI,MAAM,8BAA8B,EAEhD,IAAMoD,EAAQ,KAAK,KAAK,MAClBC,EAAKD,EAAM,CAAC,EACZE,EAAKF,EAAM,CAAC,EAEZG,EAAKD,EAAG,EAAE,IAAItD,CAAC,EAAE,SAAS,KAAK,CAAC,EAChCwD,EAAKH,EAAG,EAAE,IAAG,EAAG,IAAIrD,CAAC,EAAE,SAAS,KAAK,CAAC,EAEtCyD,EAAKF,EAAG,IAAIF,EAAG,CAAC,EAChBK,EAAKF,EAAG,IAAIF,EAAG,CAAC,EAChBK,EAAKJ,EAAG,IAAIF,EAAG,CAAC,EAChBO,EAAKJ,EAAG,IAAIF,EAAG,CAAC,EAGhBlD,EAAKJ,EAAE,IAAIyD,CAAE,EAAE,IAAIC,CAAE,EACrBrD,EAAKsD,EAAG,IAAIC,CAAE,EAAE,IAAG,EACzB,MAAO,CAAE,GAAAxD,EAAI,GAAAC,CAAE,CACjB,CAEA,SAASwD,EAAY,CACnB,GAAIA,EAAM,IACR,MAAO,GAGT,IAAMb,EAAIa,EAAM,EACVX,EAAIW,EAAM,EAGhB,GAAIb,IAAM,MAAQE,IAAM,KACtB,MAAM,IAAI,MAAM,kCAAkC,EAGpD,IAAMY,EAAK,KAAK,EAAE,OAAOd,CAAC,EACpBe,EAAMf,EAAE,OAAM,EAAG,OAAOA,CAAC,EAAE,QAAQc,CAAE,EAAE,QAAQ,KAAK,CAAC,EAC3D,OAAOZ,EAAE,OAAM,EAAG,QAAQa,CAAG,EAAE,KAAK,CAAC,IAAM,CAC7C,GA5pCF/E,GAAA,YAogCEC,GAA0B,SACxBI,EACA+B,EAAiB,CAEjB,OAAI,OAAO/B,EAAK,OAAU,UAAYA,EAAK,QAAU,KAC5C,KAAK,cAAc+B,CAAM,EAE3B/B,EAAK,MAAM,IAAI2E,IAAQ,CAC5B,EAAG,IAAI1E,EAAU0E,EAAI,EAAG,EAAE,EAC1B,EAAG,IAAI1E,EAAU0E,EAAI,EAAG,EAAE,GAC1B,CACJ,EA/gCF,IAAqBC,EAArB/E,GC3BA,IAA8BgF,GAA9B,KAAuC,CASrC,YAAaC,EAA2B,CARxCC,EAAA,cACAA,EAAA,aACAA,EAAA,oBAOE,KAAK,MAAQ,IAAIC,EACjB,KAAK,KAAOF,EACZ,KAAK,YAAc,IACrB,GCCF,IAAqBG,GAArB,MAAqBC,UAAsBC,EAAS,CAsBlD,YACEC,EACAC,EACAC,EAAgB,CAEhB,MAAM,UAAU,EA1BlBC,EAAA,UACAA,EAAA,UACAA,EAAA,UACAA,EAAA,aAwBMH,IAAM,MAAQC,IAAM,MAAQC,IAAM,MACpC,KAAK,EAAI,KAAK,MAAM,IACpB,KAAK,EAAI,KAAK,MAAM,IACpB,KAAK,EAAI,IAAIE,EAAU,CAAC,IAEnBA,EAAU,KAAKJ,CAAC,IACnBA,EAAI,IAAII,EAAUJ,EAAa,EAAE,GAEnC,KAAK,EAAIA,EACJI,EAAU,KAAKH,CAAC,IACnBA,EAAI,IAAIG,EAAUH,EAAa,EAAE,GAEnC,KAAK,EAAIA,EACJG,EAAU,KAAKF,CAAC,IACnBA,EAAI,IAAIE,EAAUF,EAAa,EAAE,GAEnC,KAAK,EAAIA,GAEP,KAAK,EAAE,KAAO,OAChB,KAAK,EAAI,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,GAElC,KAAK,EAAE,KAAO,OAChB,KAAK,EAAI,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,GAElC,KAAK,EAAE,KAAO,OAChB,KAAK,EAAI,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,GAGtC,KAAK,KAAO,KAAK,IAAM,KAAK,MAAM,IAG9B,KAAK,WAAU,IACjB,KAAK,EAAI,KAAK,MAAM,IACpB,KAAK,EAAI,KAAK,MAAM,IACpB,KAAK,EAAI,IAAIE,EAAU,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,EAC9C,KAAK,KAAO,GAEhB,CAaA,KAAG,CACD,GAAI,KAAK,WAAU,EACjB,OAAO,IAAIC,EAAM,KAAM,IAAI,EAG7B,IAAMC,EAAO,KAAK,EAAE,QAAO,EACrBC,EAAQD,EAAK,OAAM,EACnBE,EAAK,KAAK,EAAE,OAAOD,CAAK,EACxBE,EAAK,KAAK,EAAE,OAAOF,CAAK,EAAE,OAAOD,CAAI,EAE3C,OAAO,IAAID,EAAMG,EAAIC,CAAE,CACzB,CAYA,KAAG,CACD,OAAO,IAAIX,EAAc,KAAK,EAAG,KAAK,EAAE,OAAM,EAAI,KAAK,CAAC,CAC1D,CAgBA,IAAKY,EAAgB,CAEnB,GAAI,KAAK,WAAU,EACjB,OAAOA,EAIT,GAAIA,EAAE,WAAU,EACd,OAAO,KAIT,IAAMC,EAAMD,EAAE,EAAE,OAAM,EAChBE,EAAK,KAAK,EAAE,OAAM,EAClBC,EAAK,KAAK,EAAE,OAAOF,CAAG,EACtBG,EAAKJ,EAAE,EAAE,OAAOE,CAAE,EAClBG,EAAK,KAAK,EAAE,OAAOJ,EAAI,OAAOD,EAAE,CAAC,CAAC,EAClCM,EAAKN,EAAE,EAAE,OAAOE,EAAG,OAAO,KAAK,CAAC,CAAC,EAEjCK,EAAIJ,EAAG,OAAOC,CAAE,EAChBI,EAAIH,EAAG,OAAOC,CAAE,EACtB,GAAIC,EAAE,KAAK,CAAC,IAAM,EAChB,OAAIC,EAAE,KAAK,CAAC,IAAM,EACT,KAAK,IAAG,EAER,IAAIpB,EAAc,KAAM,KAAM,IAAI,EAI7C,IAAMqB,EAAKF,EAAE,OAAM,EACbG,EAAKD,EAAG,OAAOF,CAAC,EAChBI,EAAIR,EAAG,OAAOM,CAAE,EAEhBG,EAAKJ,EAAE,OAAM,EAAG,QAAQE,CAAE,EAAE,QAAQC,CAAC,EAAE,QAAQA,CAAC,EAChDE,EAAKL,EAAE,OAAOG,EAAE,QAAQC,CAAE,CAAC,EAAE,QAAQP,EAAG,OAAOK,CAAE,CAAC,EAClDI,EAAK,KAAK,EAAE,OAAOd,EAAE,CAAC,EAAE,OAAOO,CAAC,EAEtC,OAAO,IAAInB,EAAcwB,EAAIC,EAAIC,CAAE,CACrC,CAgBA,SAAUd,EAAQ,CAEhB,GAAI,KAAK,WAAU,EACjB,OAAOA,EAAE,IAAG,EAId,GAAIA,EAAE,WAAU,EACd,OAAO,KAIT,GAAIA,EAAE,IAAM,MAAQA,EAAE,IAAM,KAC1B,MAAM,IAAI,MAAM,kCAAkC,EAIpD,IAAME,EAAK,KAAK,EAAE,OAAM,EAClBC,EAAK,KAAK,EACVC,EAAKJ,EAAE,EAAE,OAAOE,CAAE,EAClBG,EAAK,KAAK,EACVC,EAAKN,EAAE,EAAE,OAAOE,CAAE,EAAE,OAAO,KAAK,CAAC,EAEjCK,EAAIJ,EAAG,OAAOC,CAAE,EAChBI,EAAIH,EAAG,OAAOC,CAAE,EACtB,GAAIC,EAAE,KAAK,CAAC,IAAM,EAChB,OAAIC,EAAE,KAAK,CAAC,IAAM,EACT,KAAK,IAAG,EAER,IAAIpB,EAAc,KAAM,KAAM,IAAI,EAI7C,IAAMqB,EAAKF,EAAE,OAAM,EACbG,EAAKD,EAAG,OAAOF,CAAC,EAChBI,EAAIR,EAAG,OAAOM,CAAE,EAEhBG,EAAKJ,EAAE,OAAM,EAAG,QAAQE,CAAE,EAAE,QAAQC,CAAC,EAAE,QAAQA,CAAC,EAChDE,EAAKL,EAAE,OAAOG,EAAE,QAAQC,CAAE,CAAC,EAAE,QAAQP,EAAG,OAAOK,CAAE,CAAC,EAClDI,EAAK,KAAK,EAAE,OAAOP,CAAC,EAE1B,OAAO,IAAInB,EAAcwB,EAAIC,EAAIC,CAAE,CACrC,CAaA,KAAMC,EAAW,CACf,GAAIA,IAAQ,EACV,OAAO,KAET,GAAI,KAAK,WAAU,EACjB,OAAO,KAET,GAAIA,IAAQ,OACV,OAAO,KAAK,IAAG,EAIjB,IAAIP,EAAI,KACR,QAAS,EAAI,EAAG,EAAIO,EAAK,IACvBP,EAAIA,EAAE,IAAG,EAEX,OAAOA,CACT,CAYA,KAAG,CACD,GAAI,KAAK,WAAU,EACjB,OAAO,KAGT,IAAII,EACAC,EACAC,EAEJ,GAAI,KAAK,KAAM,CAMb,IAAME,EAAK,KAAK,EAAE,OAAM,EAElBC,EAAK,KAAK,EAAE,OAAM,EAElBC,EAAOD,EAAG,OAAM,EAElBE,EAAI,KAAK,EAAE,OAAOF,CAAE,EAAE,OAAM,EAAG,QAAQD,CAAE,EAAE,QAAQE,CAAI,EAC3DC,EAAIA,EAAE,QAAQA,CAAC,EAEf,IAAMC,EAAIJ,EAAG,OAAOA,CAAE,EAAE,QAAQA,CAAE,EAE5BK,EAAID,EAAE,OAAM,EAAG,QAAQD,CAAC,EAAE,QAAQA,CAAC,EAGrCG,EAAQJ,EAAK,QAAQA,CAAI,EAC7BI,EAAQA,EAAM,QAAQA,CAAK,EAC3BA,EAAQA,EAAM,QAAQA,CAAK,EAG3BV,EAAKS,EAELR,EAAKO,EAAE,OAAOD,EAAE,QAAQE,CAAC,CAAC,EAAE,QAAQC,CAAK,EAEzCR,EAAK,KAAK,EAAE,OAAO,KAAK,CAAC,CAC3B,KAAO,CAML,IAAMS,EAAI,KAAK,EAAE,OAAM,EAEjBC,EAAI,KAAK,EAAE,OAAM,EAEjB,EAAIA,EAAE,OAAM,EAEdC,EAAI,KAAK,EAAE,OAAOD,CAAC,EAAE,OAAM,EAAG,QAAQD,CAAC,EAAE,QAAQ,CAAC,EACtDE,EAAIA,EAAE,QAAQA,CAAC,EAEf,IAAMC,EAAIH,EAAE,OAAOA,CAAC,EAAE,QAAQA,CAAC,EAEzBI,EAAID,EAAE,OAAM,EAGdE,EAAK,EAAE,QAAQ,CAAC,EACpBA,EAAKA,EAAG,QAAQA,CAAE,EAClBA,EAAKA,EAAG,QAAQA,CAAE,EAGlBhB,EAAKe,EAAE,QAAQF,CAAC,EAAE,QAAQA,CAAC,EAE3BZ,EAAKa,EAAE,OAAOD,EAAE,QAAQb,CAAE,CAAC,EAAE,QAAQgB,CAAE,EAEvCd,EAAK,KAAK,EAAE,OAAO,KAAK,CAAC,EACzBA,EAAKA,EAAG,QAAQA,CAAE,CACpB,CAEA,OAAO,IAAI1B,EAAcwB,EAAIC,EAAIC,CAAE,CACrC,CAcA,GAAId,EAAwB,CAC1B,GAAIA,EAAE,OAAS,SACb,OAAO,KAAK,GAAIA,EAAY,IAAG,CAAE,EAUnC,GAPI,OAASA,IAIbA,EAAIA,EAGA,KAAK,WAAU,GAAMA,EAAE,WAAU,GACnC,MAAO,GAET,GAAI,KAAK,WAAU,IAAOA,EAAE,WAAU,EACpC,MAAO,GAIT,IAAME,EAAK,KAAK,EAAE,OAAM,EAClBD,EAAMD,EAAE,EAAE,OAAM,EACtB,GAAI,KAAK,EAAE,OAAOC,CAAG,EAAE,QAAQD,EAAE,EAAE,OAAOE,CAAE,CAAC,EAAE,KAAK,CAAC,IAAM,EACzD,MAAO,GAIT,IAAM2B,EAAK3B,EAAG,OAAO,KAAK,CAAC,EACrB4B,EAAM7B,EAAI,OAAOD,EAAE,CAAC,EAC1B,OAAO,KAAK,EAAE,OAAO8B,CAAG,EAAE,QAAQ9B,EAAE,EAAE,OAAO6B,CAAE,CAAC,EAAE,KAAK,CAAC,IAAM,CAChE,CAeA,OAAQvC,EAAY,CAClB,IAAMyC,EAAK,KAAK,EAAE,OAAM,EAClBC,EAAK1C,EAAE,MAAM,KAAK,OAAO,GAAG,EAAE,OAAOyC,CAAE,EAE7C,GAAI,KAAK,EAAE,IAAIC,CAAE,IAAM,EACrB,MAAO,GAGT,IAAMC,EAAK3C,EAAE,MAAK,EAClB,GAAI,KAAK,OAAO,MAAQ,KACtB,MAAM,IAAI,MAAM,mCAAmC,EAGrD,IAAM+B,EAAI,KAAK,MAAM,KAAK,OAAOU,CAAE,EAEnC,KAAOE,EAAG,IAAI,KAAK,MAAM,CAAC,EAAI,GAAG,CAE/B,GADAA,EAAG,KAAK,KAAK,MAAM,CAAC,EAChBA,EAAG,IAAI,KAAK,MAAM,CAAC,GAAK,EAC1B,MAAO,GAIT,GADAD,EAAG,QAAQX,CAAC,EACR,KAAK,EAAE,IAAIW,CAAE,IAAM,EACrB,MAAO,EAEX,CAGA,MAAO,EACT,CAWA,SAAO,CACL,OAAI,KAAK,WAAU,EACV,uBAGP,iBACA,KAAK,EAAE,SAAS,GAAI,CAAC,EACrB,OACA,KAAK,EAAE,SAAS,GAAI,CAAC,EACrB,OACA,KAAK,EAAE,SAAS,GAAI,CAAC,EACrB,GAEJ,CAWA,YAAU,CACR,OAAO,KAAK,EAAE,KAAK,CAAC,IAAM,CAC5B,GCtdF,SAASE,GAAOC,EAAcC,EAAoBC,EAAkB,CAClE,IAAMC,EAAO,CAACH,EACRI,GAASH,EAAE,EAAIC,EAAE,GAAKC,EACtBE,GAASJ,EAAE,EAAIC,EAAE,GAAKC,EACtBG,GAASL,EAAE,EAAIC,EAAE,GAAKC,EAE5BF,EAAE,GAAKG,EACPF,EAAE,GAAKE,EACPH,EAAE,GAAKI,EACPH,EAAE,GAAKG,EACPJ,EAAE,GAAKK,EACPJ,EAAE,GAAKI,CACT,CAMO,IAAMC,EAAU,GACVC,EAAS,GACTC,GAAS,GACTC,GAAW,GACXC,GAAU,GACVC,GAAW,GAEXC,GAAW,oEACXC,GAAW,oEACXC,IAAY,IAAM,MAAQ,GAEjC,SAAUC,GAAIC,EAAS,CAE3B,IAAIC,EAAKD,GAAK,KACd,OAAAA,GAAKA,EAAIF,KAAaG,GAAM,KAAOA,EAAK,KAGxCA,EAAKD,GAAK,KACVA,GAAKA,EAAIF,KAAaG,GAAM,KAAOA,EAAK,KAGpCD,GAAKJ,KAAUI,GAAKJ,IACjBI,CACT,CAEO,IAAME,GAASlB,GAAsBe,IAAMf,EAAIY,GAAYA,IAAYA,EAAQ,EACzEO,EAAW,CAACnB,EAAWC,IAAuBD,GAAKC,EAAID,EAAIC,EAAIW,IAAYX,EAAID,GAC/EoB,EAAW,CAACpB,EAAWC,IAAsBc,GAAIf,EAAIC,CAAC,EACtDoB,GAAW,CAACrB,EAAWC,IAAsBc,GAAIf,EAAIC,CAAC,EACtDqB,GAAYtB,GAAqB,CAE5C,IAAIuB,EAAKhB,EACLiB,EAAKlB,EACLmB,EAAMP,GAAMlB,CAAC,EACb0B,EAAOd,GACX,KAAOa,EAAMlB,GAAQ,CACnB,IAAMoB,EAAID,EAAOD,EAChB,CAACF,EAAIC,CAAE,EAAI,CAACA,EAAKD,EAAKI,EAAGJ,CAAE,EAC3B,CAACE,EAAKC,CAAI,EAAI,CAACA,EAAOD,EAAME,EAAGF,CAAG,CACrC,CACA,OAAOP,GAAMK,CAAE,CACjB,EACaK,GAAY5B,GAAsBoB,EAASpB,EAAGA,CAAC,EAE/C6B,GAAW,CAACC,EAAcC,IAAuB,CAC5D,IAAIC,EAAS,GAGb,IAFAF,EAAOZ,GAAMY,CAAI,EAEVC,EAAM,KACNA,EAAM,MAAQ,KACjBC,EAASZ,EAASY,EAAQF,CAAI,GAEhCA,EAAOV,EAASU,EAAMA,CAAI,EAC1BC,IAAQ,GAGV,OAAOC,CACT,EAEaC,GAAgBrB,GAAW,IAAO,GAYlCsB,GAAalC,GAA4B,CACpD,IAAM2B,EAAIE,GAAS7B,EAAGiC,EAAY,EAElC,OAAIb,EAASO,EAAGA,CAAC,IAAMT,GAAMlB,CAAC,EACrB,KAGF2B,CACT,EAEMQ,GAAYnB,GACZoB,EAAU,KAAKpB,CAAC,EAAU,OAAO,KAAQA,EAAgB,SAAS,EAAE,CAAC,EACrE,OAAOA,GAAM,SAAiB,OAAO,KAAOA,CAAC,EAC7C,MAAM,QAAQA,CAAC,EAAU,OAAO,KAAOqB,EAAMrB,CAAC,CAAC,EAC5C,OAAOA,CAAW,EAIdsB,GAAY,OACvB,oEAAoE,EAEzDC,GAAY,OACvB,oEAAoE,EAIhEC,GAAmD,IAAI,IAQhDC,GAAYC,GAAuC,CAC9D,GAAM,CAAE,EAAGC,EAAI,EAAGC,EAAI,EAAGC,CAAE,EAAKH,EAChC,GAAIE,IAAOtC,EAAS,MAAO,CAAE,EAAGA,EAAS,EAAGC,EAAQ,EAAGD,CAAO,EAE9D,IAAMwC,EAAO1B,EAASwB,EAAIA,CAAE,EACtBG,EAAI3B,EAASV,GAASU,EAASuB,EAAIG,CAAI,CAAC,EACxCE,EAAI5B,EAASX,GAAUW,EAASuB,EAAIA,CAAE,CAAC,EACvCM,EAAK9B,EAASC,EAAS4B,EAAGA,CAAC,EAAG5B,EAASZ,GAAQuC,CAAC,CAAC,EACjDG,EAAK/B,EAASC,EAAS4B,EAAG7B,EAAS4B,EAAGE,CAAE,CAAC,EAAG7B,EAAST,GAAUS,EAAS0B,EAAMA,CAAI,CAAC,CAAC,EACpFK,EAAK/B,EAASZ,GAAQY,EAASwB,EAAIC,CAAE,CAAC,EAC5C,MAAO,CAAE,EAAGI,EAAI,EAAGC,EAAI,EAAGC,CAAE,CAC9B,EAMaC,GAAQ,CAACV,EAAoBW,IAAuC,CAC/E,GAAIX,EAAE,IAAMpC,EAAS,OAAO+C,EAC5B,GAAIA,EAAE,IAAM/C,EAAS,OAAOoC,EAE5B,IAAMY,EAAOlC,EAASsB,EAAE,EAAGA,EAAE,CAAC,EACxBa,EAAOnC,EAASiC,EAAE,EAAGA,EAAE,CAAC,EACxBG,EAAKpC,EAASsB,EAAE,EAAGa,CAAI,EACvBE,EAAKrC,EAASiC,EAAE,EAAGC,CAAI,EACvBI,EAAKtC,EAASsB,EAAE,EAAGtB,EAASmC,EAAMF,EAAE,CAAC,CAAC,EACtCM,EAAKvC,EAASiC,EAAE,EAAGjC,EAASkC,EAAMZ,EAAE,CAAC,CAAC,EAEtCkB,EAAIzC,EAASsC,EAAID,CAAE,EACnB7B,EAAIR,EAASwC,EAAID,CAAE,EACzB,GAAIE,IAAMtD,EACR,OAAIqB,IAAMrB,EAAgBmC,GAASC,CAAC,EAC7B,CAAE,EAAGpC,EAAS,EAAGC,EAAQ,EAAGD,CAAO,EAG5C,IAAMuD,EAAKzC,EAASwC,EAAGA,CAAC,EAClBE,EAAM1C,EAASwC,EAAGC,CAAE,EACpBE,EAAI3C,EAASoC,EAAIK,CAAE,EAEnBZ,EAAK9B,EAASA,EAASC,EAASO,EAAGA,CAAC,EAAGmC,CAAG,EAAG1C,EAASZ,GAAQuD,CAAC,CAAC,EAChEb,EAAK/B,EAASC,EAASO,EAAGR,EAAS4C,EAAGd,CAAE,CAAC,EAAG7B,EAASsC,EAAII,CAAG,CAAC,EAC7DX,EAAK/B,EAASwC,EAAGxC,EAASsB,EAAE,EAAGW,EAAE,CAAC,CAAC,EACzC,MAAO,CAAE,EAAGJ,EAAI,EAAGC,EAAI,EAAGC,CAAE,CAC9B,EAEaa,GAAStB,GAChBA,EAAE,IAAMpC,EAAgBoC,EACrB,CAAE,EAAGA,EAAE,EAAG,EAAG9B,GAAW8B,EAAE,EAAG,EAAGA,EAAE,CAAC,EAGtCuB,GAAY,CAACC,EAAgBC,IAAmD,CACpF,IAAMC,EAAM,GAAGF,CAAM,IAAIC,EAAG,EAAE,SAAS,EAAE,CAAC,IAAIA,EAAG,EAAE,SAAS,EAAE,CAAC,GACzDE,EAAS7B,GAAiB,IAAI4B,CAAG,EACvC,GAAIC,IAAW,OAAW,OAAOA,EAEjC,IAAMC,EAAQ,MAAM,KAA+B,CAAE,OAAQ,GAAMJ,EAAS,CAAE,EAAI,KAAO,CACvF,EAAG5D,EACH,EAAGC,EACH,EAAGD,GACH,EACIiE,EAAyB,CAAE,EAAGJ,EAAG,EAAG,EAAGA,EAAG,EAAG,EAAG5D,CAAM,EAC5D+D,EAAM,CAAC,EAAIC,EACX,IAAMC,EAAU/B,GAAS8B,CAAK,EAC9B,QAASE,EAAI,EAAGA,EAAIH,EAAM,OAAQG,IAChCH,EAAMG,CAAC,EAAIrB,GAAMkB,EAAMG,EAAI,CAAC,EAAGD,CAAO,EAExC,OAAAhC,GAAiB,IAAI4B,EAAKE,CAAK,EACxBA,CACT,EAEMI,GAAa,CAACC,EAAgBT,IAA4B,CAC9D,IAAMU,EAAmB,CAAA,EACnBC,EAAa,IAAM,OAAOX,CAAM,EAChCY,EAAaD,GAAc,GAC7BE,EAAYJ,EAChB,KAAOI,EAAY,IAAI,CACrB,IAAKA,EAAYxE,KAAYD,EAC3BsE,EAAO,KAAK,CAAC,MACR,CACL,IAAII,EAAQD,EAAaF,EAAa,GAClCG,EAAQF,IAAYE,GAASH,GACjCD,EAAO,KAAK,OAAOI,CAAK,CAAC,EACzBD,GAAaC,CACf,CACAD,IAAcxE,CAChB,CACA,OAAOqE,CACT,EAIaK,GAAqB,CAChCC,EACAf,EACAD,EAAiB,IACE,CACnB,IAAMI,EAAQL,GAAUC,EAAQC,CAAE,EAC5BgB,EAAOT,GAAWQ,EAAGhB,CAAM,EAG7Bb,EAAqB,CAAE,EAAG/C,EAAS,EAAGC,EAAQ,EAAGD,CAAO,EAC5D,QAASmE,EAAIU,EAAK,OAAS,EAAGV,GAAK,EAAGA,IAAK,CACzCpB,EAAIZ,GAASY,CAAC,EACd,IAAM+B,EAAKD,EAAKV,CAAC,EACjB,GAAIW,IAAO,EAAG,CACZ,IAAMC,EAAM,KAAK,IAAID,CAAE,GAAK,EACtBE,EAASF,EAAK,EAAId,EAAMe,CAAG,EAAIrB,GAAMM,EAAMe,CAAG,CAAC,EACrDhC,EAAID,GAAMC,EAAGiC,CAAM,CACrB,CACF,CACA,OAAOjC,CACT,EAEakC,GAAQvF,GAAqB,CACxC,IAAI2B,EAAI3B,EAAIa,GACZ,OAAIc,EAAI,KAAIA,GAAKd,IACVc,CACT,EACa6D,GAAU,CAACxF,EAAWC,IAAsBsF,GAAKvF,EAAIC,CAAC,EAGtDwF,GAAWzF,GAAqB,CAC3C,IAAIuB,EAAK,GACLC,EAAK,GACLC,EAAM8D,GAAKvF,CAAC,EACZ0B,EAAOb,GACX,KAAOY,EAAM,IAAI,CACf,IAAMiE,EAAIhE,EAAOD,EAChB,CAACF,EAAIC,CAAE,EAAI,CAACA,EAAKD,EAAKmE,EAAGnE,CAAE,EAC3B,CAACE,EAAKC,CAAI,EAAI,CAACA,EAAOD,EAAMiE,EAAGjE,CAAG,CACrC,CACA,OAAO8D,GAAKhE,CAAE,CAChB,EApQAoE,EAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAkRqBC,EAArB,MAAqBA,UAAcC,EAAS,CAkL1C,YAAYpF,EAAsBqF,EAAsBC,EAAiB,GAAI,CAC3E,MAAM,QAAQ,EAnLlBC,EAAA,KAAAZ,GACEa,EAAA,UACAA,EAAA,UACAA,EAAA,YAiLE,KAAK,YAAc,KACfxF,IAAM,MAAQqF,IAAM,MACtB,KAAK,EAAI,KACT,KAAK,EAAI,KACT,KAAK,IAAM,KAENjE,EAAU,KAAKpB,CAAC,IACnBA,EAAI,IAAIoB,EAAUpB,EAAa,EAAE,GAEnC,KAAK,EAAIA,EACJoB,EAAU,KAAKiE,CAAC,IACnBA,EAAI,IAAIjE,EAAUiE,EAAa,EAAE,GAEnC,KAAK,EAAIA,EAELC,IACF,KAAK,EAAE,SAAS,KAAK,MAAM,GAAG,EAC9B,KAAK,EAAE,SAAS,KAAK,MAAM,GAAG,GAE5B,KAAK,EAAE,MAAQ,OACjB,KAAK,EAAI,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,GAElC,KAAK,EAAE,MAAQ,OACjB,KAAK,EAAI,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,GAEtC,KAAK,IAAM,GAEf,CA1MA,OAAO,eAAeG,EAAQ,CAC5B,GAAI,CAACA,EAAE,SAAQ,EACb,MAAM,IAAI,MAAM,eAAe,EAEjC,OAAOA,CACT,CAkBA,OAAO,QAAQC,EAAe,CAE5B,IACGA,EAAM,CAAC,IAAM,GAAQA,EAAM,CAAC,IAAM,GAAQA,EAAM,CAAC,IAAM,IACxDA,EAAM,OAAS,IAAM,GACrB,CACA,GAAIA,EAAM,CAAC,IAAM,GACf,GAAIA,EAAM,GAAG,EAAE,EAAK,IAAM,EACxB,MAAM,IAAI,MAAM,oCAAoC,UAE7CA,EAAM,CAAC,IAAM,GAClBA,EAAM,GAAG,EAAE,EAAK,IAAM,EACxB,MAAM,IAAI,MAAM,oCAAoC,EAIxD,IAAMC,EAAM,IAAIR,EAAMO,EAAM,MAAM,EAAG,EAAO,EAAGA,EAAM,MAAM,GAAS,EAAW,CAAC,EAEhF,OAAOP,EAAM,eAAeQ,CAAG,CACjC,UAAYD,EAAM,CAAC,IAAM,GAAQA,EAAM,CAAC,IAAM,IAASA,EAAM,OAAS,IAAM,GAC1E,OAAOP,EAAM,eAAeA,EAAM,MAAMO,EAAM,MAAM,EAAG,EAAO,EAAGA,EAAM,CAAC,IAAM,CAAI,CAAC,EAErF,MAAM,IAAI,MAAM,sBAAsB,CACxC,CAmBA,OAAO,WAAWE,EAAW,CAC3B,IAAMF,EAAQG,EAAQD,EAAK,KAAK,EAChC,OAAOT,EAAM,eAAeA,EAAM,QAAQO,CAAK,CAAC,CAClD,CAiBA,OAAO,MAAM1F,EAAe8F,EAAY,CACtC,IAAIC,EAAU5E,GAASnB,CAAC,EACxB+F,EAAU7F,GAAM6F,CAAO,EAEvB,IAAMC,EAAK3F,GAASD,EAASQ,GAASmF,CAAO,EAAGA,CAAO,EAAG,EAAE,EACtDV,EAAInE,GAAU8E,CAAE,EACtB,GAAIX,IAAM,KACR,MAAM,IAAI,MAAM,eAAe,EAGjC,IAAIY,EAAOZ,GACNY,EAAO1G,MAAauG,EAAMvG,EAASD,KACtC2G,EAAO9F,EAASP,GAAUqG,CAAI,GAGhC,IAAMC,EAAM,IAAI9E,EAAU2E,EAAQ,SAAS,EAAE,EAAG,EAAE,EAC5CI,EAAM,IAAI/E,EAAU6E,EAAK,SAAS,EAAE,EAAG,EAAE,EAE/C,OAAOd,EAAM,eAAe,IAAIA,EAAMe,EAAKC,CAAG,CAAC,CACjD,CAiBA,OAAO,SAASC,EAAqBd,EAAc,CAC7C,OAAOc,GAAQ,WACjBA,EAAM,KAAK,MAAMA,CAAG,GAGtB,IAAIT,EAAM,IAAIR,EAAMiB,EAAI,CAAC,EAAGA,EAAI,CAAC,EAAGd,CAAK,EAGzC,GAFAK,EAAMR,EAAM,eAAeQ,CAAG,EAE1B,OAAOS,EAAI,CAAC,GAAM,UAAYA,EAAI,CAAC,IAAM,KAC3C,OAAOT,EAGT,IAAMU,EAAMD,EAAI,CAAC,EAEXE,EAAab,GAAsC,CACvD,IAAMc,EAAK,IAAIpB,EAAMM,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGH,CAAK,EACtC,OAAOH,EAAM,eAAeoB,CAAE,CAChC,EAEA,OAAAZ,EAAI,YAAc,CAChB,KAAM,KAEN,QACE,OAAOU,EAAI,SAAY,UAAYA,EAAI,UAAY,KAC/C,CACE,KAAMA,EAAI,QAAQ,KAClB,OAAQ,CAACV,CAAG,EAAE,OAAOU,EAAI,QAAQ,OAAO,IAAIC,CAAS,CAAC,GAExD,OAEN,IACE,OAAOD,EAAI,KAAQ,UAAYA,EAAI,MAAQ,KACvC,CACE,IAAKA,EAAI,IAAI,IACb,OAAQ,CAACV,CAAG,EAAE,OAAOU,EAAI,IAAI,OAAO,IAAIC,CAAS,CAAC,GAEpD,QAGDX,CACT,CAsDA,UAAQ,CACN,GAAI,KAAK,KAAO,KAAK,GAAK,MAAQ,KAAK,GAAK,KAAM,MAAO,GAEzD,GAAI,CACF,IAAMa,EAAO,OAAO,KAAO,KAAK,EAAE,QAAO,EAAG,SAAS,EAAE,CAAC,EAClDP,EAAO,OAAO,KAAO,KAAK,EAAE,QAAO,EAAG,SAAS,EAAE,CAAC,EAGlDQ,EAAMrG,EAAS6F,EAAMA,CAAI,EACzBS,EAAMrG,GAASD,EAASA,EAASoG,EAAMA,CAAI,EAAGA,CAAI,EAAG,EAAE,EAE7D,OAAOC,IAAQC,CACjB,MAAQ,CACN,MAAO,EACT,CACF,CAiBA,OAAOC,EAAmB,GAAMC,EAAW,CACzC,GAAI,KAAK,IACP,OAAIA,IAAQ,MAAc,KACnB,CAAC,CAAI,EAEd,IAAMC,EAAM,KAAK,MAAM,EAAE,WAAU,EAC7B7G,EAAI,KAAK,KAAI,EAAG,QAAQ,KAAM6G,CAAG,EACnClB,EAMJ,OALIgB,EACFhB,EAAM,CAAC,KAAK,KAAI,EAAG,OAAM,EAAK,EAAO,CAAI,EAAE,OAAO3F,CAAC,EAEnD2F,EAAM,CAAC,CAAI,EAAE,OAAO3F,EAAG,KAAK,KAAI,EAAG,QAAQ,KAAM6G,CAAG,CAAC,EAEnDD,IAAQ,MACHvF,EAAMsE,CAAG,EAETA,CAEX,CAaS,UAAQ,CACf,OAAO,KAAK,OAAO,GAAM,KAAK,CAChC,CAYA,QAAM,CAQJ,OAAI,KAAK,aAAe,KACf,CAAC,KAAK,EAAG,KAAK,CAAC,EAGjB,CACL,KAAK,EACL,KAAK,EACL,OAAO,KAAK,aAAgB,UAAY,KAAK,cAAgB,KACzD,CACE,QACE,KAAK,YAAY,SAAW,KACxB,OACA,CACE,KAAM,KAAK,YAAY,QAAQ,KAC/B,OAAQ,KAAK,YAAY,QAAQ,OAAO,MAAM,CAAC,GAEvD,IACE,KAAK,YAAY,KAAO,KACpB,OACA,CACE,IAAK,KAAK,YAAY,IAAI,IAC1B,OAAQ,KAAK,YAAY,IAAI,OAAO,MAAM,CAAC,IAGrD,OAER,CAYA,SAAO,CACL,OAAI,KAAK,WAAU,EACV,sBAGP,iBACC,KAAK,GAAG,QAAO,GAAI,SAAS,GAAI,CAAC,GAAK,aACvC,QACC,KAAK,GAAG,QAAO,GAAI,SAAS,GAAI,CAAC,GAAK,aACvC,GAEJ,CAWA,YAAU,CACR,OAAO,KAAK,GACd,CAcA,IAAIF,EAAQ,CAEV,GAAI,KAAK,IACP,OAAOA,EAIT,GAAIA,EAAE,IACJ,OAAO,KAIT,GAAI,KAAK,GAAGA,CAAC,EACX,OAAO,KAAK,IAAG,EAIjB,GAAI,KAAK,IAAG,EAAG,GAAGA,CAAC,EACjB,OAAO,IAAIN,EAAM,KAAM,IAAI,EAI7B,GAAI,KAAK,GAAG,IAAIM,EAAE,GAAK,IAAIrE,EAAU,CAAC,CAAC,IAAM,EAC3C,OAAO,IAAI+D,EAAM,KAAM,IAAI,EAG7B,IAAM2B,EAAK,CACT,EAAG,OAAO,KAAQ,KAAK,EAAgB,QAAO,EAAG,SAAS,EAAE,CAAC,EAC7D,EAAG,OAAO,KAAQ,KAAK,EAAgB,QAAO,EAAG,SAAS,EAAE,CAAC,EAC7D,EAAGvH,GAECwH,EAAK,CACT,EAAG,OAAO,KAAQtB,EAAE,EAAgB,QAAO,EAAG,SAAS,EAAE,CAAC,EAC1D,EAAG,OAAO,KAAQA,EAAE,EAAgB,QAAO,EAAG,SAAS,EAAE,CAAC,EAC1D,EAAGlG,GAECyH,EAAI5E,GAAM0E,EAAIC,CAAE,EACtB,GAAIC,EAAE,IAAM1H,EAAS,OAAO,IAAI6F,EAAM,KAAM,IAAI,EAChD,IAAM8B,EAAO3G,GAAS0G,EAAE,CAAC,EACnBE,EAAQ9G,EAAS6G,EAAMA,CAAI,EAC3BE,EAAO/G,EAAS4G,EAAE,EAAGE,CAAK,EAC1BE,EAAOhH,EAAS4G,EAAE,EAAG5G,EAAS8G,EAAOD,CAAI,CAAC,EAChD,OAAO,IAAI9B,EAAMgC,EAAK,SAAS,EAAE,EAAGC,EAAK,SAAS,EAAE,CAAC,CACvD,CAWA,KAAG,CACD,GAAI,KAAK,IAAK,OAAO,KACrB,GAAI,KAAK,IAAM,MAAQ,KAAK,IAAM,KAChC,MAAM,IAAI,MAAM,kCAAkC,EAGpD,IAAMC,EAAI,OAAO,KAAO,KAAK,EAAE,QAAO,EAAG,SAAS,EAAE,CAAC,EAC/CC,EAAI,OAAO,KAAO,KAAK,EAAE,QAAO,EAAG,SAAS,EAAE,CAAC,EACrD,GAAIA,IAAMhI,EAAS,OAAO,IAAI6F,EAAM,KAAM,IAAI,EAE9C,IAAM6B,EAAIvF,GAAS,CAAE,EAAA4F,EAAG,EAAAC,EAAG,EAAG/H,CAAM,CAAE,EAChC0H,EAAO3G,GAAS0G,EAAE,CAAC,EACnBE,EAAQ9G,EAAS6G,EAAMA,CAAI,EAC3BE,EAAO/G,EAAS4G,EAAE,EAAGE,CAAK,EAC1BE,EAAOhH,EAAS4G,EAAE,EAAG5G,EAAS8G,EAAOD,CAAI,CAAC,EAChD,OAAO,IAAI9B,EAAMgC,EAAK,SAAS,EAAE,EAAGC,EAAK,SAAS,EAAE,CAAC,CACvD,CASA,MAAI,CACF,OAAQ,KAAK,GAAK,IAAIhG,EAAU,CAAC,GAAG,QAAO,CAC7C,CASA,MAAI,CACF,OAAQ,KAAK,GAAK,IAAIA,EAAU,CAAC,GAAG,QAAO,CAC7C,CAaA,IAAI8C,EAAa,CAKf,GAJK9C,EAAU,KAAK8C,CAAC,IACnBA,EAAI,IAAI9C,EAAU8C,EAAa,EAAE,GAEnCA,EAAIA,EACA,KAAK,IACP,OAAO,KAGT,IAAMqD,EAAQrD,EAAE,MAAK,EACfsD,EAAOD,EAAQrD,EAAE,IAAG,EAAKA,EAC3BuD,EAAO,OAAO,KAAOD,EAAK,SAAS,EAAE,CAAC,EAG1C,GADAC,EAAOvH,GAAMuH,CAAI,EACbA,IAASnI,EACX,OAAO,IAAI6F,EAAM,KAAM,IAAI,EAE7B,GAAIsC,IAASnI,EACX,OAAO,IAAI6F,EAAM,KAAM,IAAI,EAG7B,GAAI,KAAK,IAAM,MAAQ,KAAK,IAAM,KAChC,MAAM,IAAI,MAAM,kCAAkC,EAGpD,IAAIuC,EACAC,EACA,OAAS,KAAK,MAAM,GACtBD,EAAKpG,GACLqG,EAAKpG,KAELmG,EAAK,OAAO,KAAO,KAAK,EAAE,QAAO,EAAG,SAAS,EAAE,CAAC,EAChDC,EAAK,OAAO,KAAO,KAAK,EAAE,QAAO,EAAG,SAAS,EAAE,CAAC,GAGlD,IAAMX,EAAI/C,GAAmBwD,EAAM,CAAE,EAAGC,EAAI,EAAGC,CAAE,CAAE,EACnD,GAAIX,EAAE,IAAM1H,EACV,OAAO,IAAI6F,EAAM,KAAM,IAAI,EAE7B,IAAM8B,EAAO3G,GAAS0G,EAAE,CAAC,EACnBE,EAAQ9G,EAAS6G,EAAMA,CAAI,EAC3BE,EAAO/G,EAAS4G,EAAE,EAAGE,CAAK,EAC1BE,EAAOhH,EAAS4G,EAAE,EAAG5G,EAAS8G,EAAOD,CAAI,CAAC,EAE1Cf,EAAM,IAAI9E,EAAU+F,EAAK,SAAS,EAAE,EAAG,EAAE,EACzChB,EAAM,IAAI/E,EAAUgG,EAAK,SAAS,EAAE,EAAG,EAAE,EACzCpG,EAAS,IAAImE,EAAMe,EAAKC,CAAG,EACjC,OAAIoB,EACKvG,EAAO,IAAG,EAEZA,CACT,CAEA,MAAMkD,EAAa,CAMjB,GALK9C,EAAU,KAAK8C,CAAC,IACnBA,EAAI,IAAI9C,EAAU8C,EAAU,EAAE,GAEhCA,EAAIA,EAEA,KAAK,IAAK,OAAO,IAAIiB,EAAM,KAAM,IAAI,EAGzC,IAAMoC,EAAQrD,EAAE,MAAK,EACfsD,EAAOD,EAAQrD,EAAE,IAAG,EAAKA,EAC3BuD,EAAO,OAAO,KAAOD,EAAK,SAAS,EAAE,CAAC,EAG1C,GADAC,EAAOvH,GAAMuH,CAAI,EACbA,IAAS,GAAI,OAAO,IAAItC,EAAM,KAAM,IAAI,EAE5C,IAAMuC,EAAK,OAAS,KAAK,MAAM,EAAIpG,GAAY,OAAO,KAAO,KAAK,KAAI,EAAG,SAAS,EAAE,CAAC,EAE/EqG,EAAK,OAAS,KAAK,MAAM,EAAIpG,GAAY,OAAO,KAAO,KAAK,KAAI,EAAG,SAAS,EAAE,CAAC,EAEjFqG,EAAsB,CAAE,EAAG,GAAI,EAAG,GAAI,EAAG,EAAE,EAC3CC,EAAsB,CAAE,EAAGH,EAAI,EAAGC,EAAI,EAAG,EAAE,EAEzCG,EAAOL,EAAK,SAAS,CAAC,EAC5B,QAAWM,KAAWD,EAAM,CAC1B,IAAME,EAAMD,IAAY,IAAM,GAAK,GACnCjJ,GAAOkJ,EAAKJ,EAAIC,CAAE,EAClBA,EAAKzF,GAAMwF,EAAIC,CAAE,EACjBD,EAAKnG,GAASmG,CAAE,EAChB9I,GAAOkJ,EAAKJ,EAAIC,CAAE,CACpB,CAEA,GAAID,EAAG,IAAM,GAAI,OAAO,IAAIzC,EAAM,KAAM,IAAI,EAE5C,IAAM8B,EAAO3G,GAASsH,EAAG,CAAC,EACpBV,EAAQ9G,EAAS6G,EAAMA,CAAI,EAC3BjH,EAAII,EAASwH,EAAG,EAAGV,CAAK,EACxB7B,EAAIjF,EAASwH,EAAG,EAAGxH,EAAS8G,EAAOD,CAAI,CAAC,EAExCjG,EAAS,IAAImE,EAAMnF,EAAE,SAAS,EAAE,EAAGqF,EAAE,SAAS,EAAE,CAAC,EACvD,OAAOkC,EAAQvG,EAAO,IAAG,EAAKA,CAChC,CAiBA,OAAOiH,EAAeC,EAAWC,EAAa,CAC5C,IAAMC,EAAS,CAAC,KAAMF,CAAE,EAClBG,EAAS,CAACJ,EAAIE,CAAE,EACtB,OAAOG,EAAA,KAAK3D,EAAAM,IAAL,UAAsBmD,EAAQC,EACvC,CAiBA,QAAQJ,EAAeC,EAAWC,EAAa,CAC7C,IAAMC,EAAS,CAAC,KAAMF,CAAE,EAClBG,EAAS,CAACJ,EAAIE,CAAE,EACtB,OAAOG,EAAA,KAAK3D,EAAAM,IAAL,UAAsBmD,EAAQC,EAAQ,GAC/C,CAeA,GAAG5C,EAAQ,CACT,OACE,OAASA,GACR,KAAK,MAAQA,EAAE,MACb,KAAK,MACF,KAAK,GAAK,IAAIrE,EAAU,CAAC,GAAG,IAAIqE,EAAE,GAAK,IAAIrE,EAAU,CAAC,CAAC,IAAM,IAC5D,KAAK,GAAK,IAAIA,EAAU,CAAC,GAAG,IAAIqE,EAAE,GAAK,IAAIrE,EAAU,CAAC,CAAC,IAAM,EAExE,CAWA,IAAImH,EAAqB,CACvB,GAAI,KAAK,IACP,OAAO,KAET,IAAM5C,EAAM,IAAIR,EAAM,KAAK,GAAI,KAAK,GAAK,IAAI/D,EAAU,CAAC,GAAG,OAAM,CAAE,EACnE,GAAImH,IAAgB,IAAQ,KAAK,aAAe,KAAM,CACpD,IAAMlC,EAAM,KAAK,YACXmC,EAAU/C,GAAyBA,EAAY,IAAG,EACxDE,EAAI,YAAc,CAChB,IACEU,EAAI,KAAO,KACP,OACA,CACE,IAAKA,EAAI,IAAI,IACb,OAAQA,EAAI,IAAI,OAAO,IAAImC,CAAM,GAEzC,QACEnC,EAAI,SAAW,KACX,OACA,CACE,KAAMA,EAAI,QAAQ,KAClB,OAAQA,EAAI,QAAQ,OAAO,IAAIZ,GAAMA,EAAY,IAAG,CAAE,GAE9D,KAAM,OAEV,CAEA,OAAOE,CACT,CAgBA,KAAKzB,EAAS,CACZ,IAAIvD,EACJ,QAAS,EAAI,EAAG,EAAIuD,EAAG,IACrBvD,GAAKA,GAAK,MAAM,IAAG,EAErB,OAAOA,GAAK,IACd,CAaA,KAAG,CACD,OAAI,KAAK,IACA,IAAI8H,GAAO,KAAM,KAAM,IAAI,EAExB,IAAIA,GAAO,KAAK,EAAG,KAAK,EAAG,KAAK,MAAM,GAAG,CAEvD,CAkEQ,iBAAiBzJ,EAAWC,EAAWyJ,EAAwB,CACrE,GAAM,CAAE,OAAAN,EAAQ,OAAAC,EAAQ,SAAAM,EAAU,IAAAC,EAAK,IAAAC,EAAK,WAAAC,CAAU,EAAKJ,EAC3D,GAAIC,EAAS3J,CAAC,IAAM,GAAK2J,EAAS1J,CAAC,IAAM,EACvC,OAAA4J,EAAI7J,CAAC,EAAI,KAAK,MAAM,OAAOqJ,EAAOrJ,CAAC,EAAG2J,EAAS3J,CAAC,EAAG,KAAK,MAAM,UAAU,EACxE6J,EAAI5J,CAAC,EAAI,KAAK,MAAM,OAAOoJ,EAAOpJ,CAAC,EAAG0J,EAAS1J,CAAC,EAAG,KAAK,MAAM,UAAU,EACjE,KAAK,IAAI6J,EAAYD,EAAI7J,CAAC,EAAE,OAAQ6J,EAAI5J,CAAC,EAAE,MAAM,EAE1D,IAAM8J,EAAc,CAACX,EAAOpJ,CAAC,EAAG,KAAM,KAAMoJ,EAAOnJ,CAAC,CAAC,EAC/C+J,EAAKZ,EAAOpJ,CAAC,EAAE,GAAK,IAAIoC,EAAU,CAAC,EACnC6H,EAAKb,EAAOnJ,CAAC,EAAE,GAAK,IAAImC,EAAU,CAAC,EACrC4H,EAAG,IAAIC,CAAE,IAAM,GACjBF,EAAK,CAAC,EAAIX,EAAOpJ,CAAC,EAAE,IAAIoJ,EAAOnJ,CAAC,CAAC,EACjC8J,EAAK,CAAC,EAAIX,EAAOpJ,CAAC,EAAE,IAAG,EAAG,SAASoJ,EAAOnJ,CAAC,EAAE,IAAG,CAAE,GACzC+J,EAAG,IAAIC,EAAG,OAAM,CAAE,IAAM,GACjCF,EAAK,CAAC,EAAIX,EAAOpJ,CAAC,EAAE,IAAG,EAAG,SAASoJ,EAAOnJ,CAAC,CAAC,EAC5C8J,EAAK,CAAC,EAAIX,EAAOpJ,CAAC,EAAE,IAAIoJ,EAAOnJ,CAAC,EAAE,IAAG,CAAE,IAEvC8J,EAAK,CAAC,EAAIX,EAAOpJ,CAAC,EAAE,IAAG,EAAG,SAASoJ,EAAOnJ,CAAC,CAAC,EAC5C8J,EAAK,CAAC,EAAIX,EAAOpJ,CAAC,EAAE,IAAG,EAAG,SAASoJ,EAAOnJ,CAAC,EAAE,IAAG,CAAE,GAEpD,IAAMiK,EAAQ,CAAC,GAAI,GAAI,GAAI,GAAI,EAAG,EAAG,EAAG,EAAG,CAAC,EACtCC,EAAM,KAAK,MAAM,OAAOd,EAAOrJ,CAAC,EAAGqJ,EAAOpJ,CAAC,CAAC,EAC5CmK,EAAM,KAAK,IAAIN,EAAYK,EAAI,CAAC,EAAE,MAAM,EAC9CN,EAAI7J,CAAC,EAAI,MAAM,KAAK,CAAE,OAAQoK,CAAG,CAAE,EACnCP,EAAI5J,CAAC,EAAI,MAAM,KAAK,CAAE,OAAQmK,CAAG,CAAE,EACnC,QAASC,EAAW,EAAGA,EAAWD,EAAKC,IAAY,CACjD,IAAMC,EAAK,KAAK,MAAMH,EAAI,CAAC,EAAEE,CAAQ,CAAC,EAChCE,EAAK,KAAK,MAAMJ,EAAI,CAAC,EAAEE,CAAQ,CAAC,EACtCR,EAAI7J,CAAC,EAAEqK,CAAQ,EAAIH,GAAOI,EAAK,GAAK,GAAKC,EAAK,EAAE,EAChDV,EAAI5J,CAAC,EAAEoK,CAAQ,EAAI,EACnBT,EAAI5J,CAAC,EAAI+J,CACX,CACA,OAAOK,CACT,CAwBQ,iBACNI,EACA3C,EACAgC,EACAY,EAAgB,CAEhB,IAAIP,EAAQM,EACRE,EAAU,EACd,KAAOR,GAAS,GAAG,CACjB,IAAIS,EAAO,GACX,QAASpG,EAAQ,EAAGA,EAAQsD,EAAKtD,IAC/BkG,EAAIlG,CAAK,EAAI,IAAInC,EAAU,OAAOyH,EAAItF,CAAK,EAAE2F,CAAK,GAAM,SAAWL,EAAItF,CAAK,EAAE2F,CAAK,EAAI,CAAC,EACnFO,EAAIlG,CAAK,EAAE,OAAM,IAAIoG,EAAO,IAEnC,GAAI,CAACA,EAAM,MACXD,IACAR,GACF,CACA,OAAIA,GAAS,GAAGQ,IACT,CAAE,MAAAR,EAAO,QAAAQ,CAAO,CACzB,CA6FQ,YAAYE,EAAeC,EAAc,CAC/C,GACE,OAAO,KAAK,aAAgB,UAC5B,KAAK,cAAgB,MACrB,OAAO,KAAK,YAAY,SAAY,UACpC,KAAK,YAAY,UAAY,KAE7B,OAAO,KAAK,YAAY,QAG1B,IAAMH,EAAU,CAAC,IAAI,EACjBI,EACJ,QAASrG,EAAI,EAAGA,GAAKoG,GAAS,GAAIpG,GAAKmG,GAAQ,EAAG,CAChD,QAASG,EAAI,EAAGA,GAAKH,GAAQ,GAAIG,IAC/BD,GAAOA,GAAO,MAAM,IAAG,EAEzBJ,EAAQ,KAAKI,CAAW,CAC1B,CACA,MAAO,CACL,KAAMF,GAAQ,EACd,OAAQF,EAEZ,GAv9BF/E,EAAA,YAutBEC,GAAS,UAAA,CACP,GAAI,OAAO,KAAK,MAAM,MAAS,SAC7B,OAGF,IAAMyB,EAAM,KAAK,YACjB,GACE,OAAOA,GAAQ,UACfA,IAAQ,MACR,OAAOA,EAAI,MAAS,UACpBA,EAAI,OAAS,KAEb,OAAOA,EAAI,KAGb,IAAM2D,EAAO,IAAI7E,GAAO,KAAK,GAAK,IAAI/D,EAAU,CAAC,GAAG,OAAO,KAAK,MAAM,KAAK,IAAI,EAAG,KAAK,CAAC,EACxF,GAAIiF,GAAO,KAAM,CACf,IAAM4D,EAAQ,KAAK,MACbC,EAAWC,GAA+B,CAC9C,IAAM1E,EAAI0E,EACV,GAAI1E,EAAE,IAAM,KACV,MAAM,IAAI,MAAM,aAAa,EAE/B,GAAIwE,EAAM,OAAS,QAAaA,EAAM,OAAS,KAC7C,MAAM,IAAI,MAAM,yBAAyB,EAE3C,OAAO,IAAI9E,EAAMM,EAAE,EAAE,OAAOwE,EAAM,KAAK,IAAI,EAAGxE,EAAE,CAAC,CACnD,EACAY,EAAI,KAAO2D,EACXA,EAAK,YAAc,CACjB,KAAM,KACN,IACE3D,EAAI,KAAO,KACP,OACA,CACE,IAAKA,EAAI,IAAI,IACb,OAAQA,EAAI,IAAI,OAAO,IAAI6D,CAAO,GAE1C,QACE7D,EAAI,SAAW,KACX,OACA,CACE,KAAMA,EAAI,QAAQ,KAClB,OAAQA,EAAI,QAAQ,OAAO,IAAI6D,CAAO,GAGlD,CACA,OAAOF,CACT,EAEAnF,GAAoB,SAClBuF,EACAhC,EACAvB,EACA8B,EACAC,EAAc,CAhiClB,IAAAyB,EAkiCI,QAASnB,EAAQ,EAAGA,EAAQrC,EAAKqC,IAAS,CACxC,IAAMoB,EAAYhC,EAAA+B,EAAAjC,EAAOc,CAAK,EAAEvE,EAAAO,IAAd,KAAAmF,EAA6BD,GAC/CzB,EAASO,CAAK,EAAIoB,EAAU,IAC5B1B,EAAIM,CAAK,EAAIoB,EAAU,MACzB,CACF,EAqCAxF,GAA4B,SAC1BsD,EACAC,EACAxB,EACA8B,EACAC,EACAC,EAAe,CAEf,IAAIO,EAAM,EACV,QAASF,EAAQrC,EAAM,EAAGqC,GAAS,EAAGA,GAAS,EAC7CE,EAAM,KAAK,iBAAiBF,EAAQ,EAAGA,EAAO,CAC5C,OAAAd,EACA,OAAAC,EACA,SAAAM,EACA,IAAAC,EACA,IAAAC,EACA,WAAYO,EACb,EAEH,OAAOA,CACT,EAwBArE,GAAa,SAACwF,EAAqB1D,EAAa4C,EAAkBb,EAAc,CAC9E,IAAM4B,EAAM,IAAIpJ,EAAU,CAAC,EACrBqJ,EAAM,IAAIrJ,EAAU,CAAC,EACvBJ,EAASuJ,EACb,QAASrB,EAAQ,EAAGA,EAAQrC,EAAKqC,IAAS,CACxC,IAAMwB,EAAQjB,EAAIP,CAAK,EACvB,GAAIwB,EAAM,KAAK,CAAC,IAAM,EAAG,SACzB,IAAMnH,EAAamH,EAAM,MAAK,EAC1B9B,EAAIM,CAAK,EAAEwB,EAAM,IAAG,EAAG,IAAIF,CAAG,EAAE,IAAIC,CAAG,EAAE,SAAQ,CAAE,EAAE,IAAG,EACxD7B,EAAIM,CAAK,EAAEwB,EAAM,IAAIF,CAAG,EAAE,IAAIC,CAAG,EAAE,SAAQ,CAAE,EACjDzJ,EAASuC,EAAM,OAAS,SAAWvC,EAAO,SAASuC,CAAK,EAAIvC,EAAO,IAAIuC,CAAK,CAC9E,CACA,OAAOvC,CACT,EAEAgE,GAAY,SACVoF,EACAhC,EACAC,EACAxB,EACA8D,EAAwB,CAExB,IAAMC,EAAgB,KAAK,MAAM,QAAQ,OACnCjC,EAAqB,MAAM,KAAK,CAAE,OAAQiC,CAAa,CAAE,EACzDhC,EAAiB,MAAM,KAAK,CAAE,OAAQgC,CAAa,EAAI,IAAM,CAAA,CAAE,EAC/D/B,EAAkB,MAAM,KAAK,CAAE,OAAQ+B,CAAa,EAAI,IAAM,CAAA,CAAE,EAEtEtC,EAAA,KAAK3D,EAAAE,IAAL,UAA0BuF,EAAMhC,EAAQvB,EAAK8B,EAAUC,GACvD,IAAMQ,EAAMd,EAAA,KAAK3D,EAAAG,IAAL,UAAkCsD,EAAQC,EAAQxB,EAAK8B,EAAUC,EAAKC,GAE9EiB,EAAM,IAAIrB,GAAO,KAAM,KAAM,IAAI,EAC/BgB,EAAM,KAAK,MAAM,QACnBP,EAAQE,EACZ,KAAOF,GAAS,GAAG,CACjB,IAAMU,EAAO,KAAK,iBAAiBV,EAAOrC,EAAKgC,EAAKY,CAAG,EAGvD,GAFAP,EAAQU,EAAK,MACbE,EAAMA,EAAI,KAAKF,EAAK,OAAO,EACvBV,EAAQ,EAAG,MACfY,EAAMxB,EAAA,KAAK3D,EAAAI,IAAL,UAAmB+E,EAAKjD,EAAK4C,EAAKb,GACxCM,GACF,CAEA,QAASzF,EAAI,EAAGA,EAAIoD,EAAKpD,IACvBmF,EAAInF,CAAC,EAAI,CAAA,EAGX,OAAIkH,IAAmB,GACdb,EAEAA,EAAI,IAAG,CAElB,EAEA7E,GAAgB,SACdmD,EACAC,EACAsC,EAAwB,CAhrC5B,IAAAN,EAkrCI,IAAMQ,EAAmB,MAAM,KAAK,CAAE,OAAQzC,EAAO,OAAS,CAAC,CAAE,EAC3D0C,EAAuB,MAAM,KAAK,CAAE,OAAQ1C,EAAO,OAAS,CAAC,CAAE,EACjE3E,EACJ,IAAKA,EAAI,EAAGA,EAAI2E,EAAO,OAAQ3E,IAAK,CAClC,IAAMsH,EAAQ,KAAK,MAAM,WAAW1C,EAAO5E,CAAC,CAAC,EACzCgC,EAAI2C,EAAO3E,CAAC,EACZuG,EAAc1B,EAAA+B,EAAA5E,EAAEd,EAAAC,IAAF,KAAAyF,IAAiB,IAAIlF,EAAM,KAAM,IAAI,EAEnD4F,EAAM,GAAG,WAAa,IACxBA,EAAM,GAAG,KAAI,EACbtF,EAAIA,EAAE,IAAI,EAAI,GAEZsF,EAAM,GAAG,WAAa,IACxBA,EAAM,GAAG,KAAI,EACbf,EAAOA,EAAK,IAAI,EAAI,GAGtBa,EAAQpH,EAAI,CAAC,EAAIgC,EACjBoF,EAAQpH,EAAI,EAAI,CAAC,EAAIuG,EACrBc,EAAQrH,EAAI,CAAC,EAAIsH,EAAM,GACvBD,EAAQrH,EAAI,EAAI,CAAC,EAAIsH,EAAM,EAC7B,CAEA,IAAMpF,EAAM2C,EAAA,KAAK3D,EAAAK,IAAL,UAAkB,EAAG6F,EAASC,EAASrH,EAAI,EAAGkH,GAG1D,QAASZ,EAAI,EAAGA,EAAItG,EAAI,EAAGsG,IACzBc,EAAQd,CAAC,EAAI,KACbe,EAAQf,CAAC,EAAI,KAEf,OAAOpE,CACT,EA0BAT,GAAc,SAAC0D,EAAW,CACxB,GACE,OAAO,KAAK,aAAgB,UAC5B,KAAK,cAAgB,MACrB,OAAO,KAAK,YAAY,KAAQ,UAChC,KAAK,YAAY,MAAQ,KAEzB,OAAO,KAAK,YAAY,IAG1B,IAAMjD,EAAM,CAAC,IAAI,EACXyD,GAAO,GAAKR,GAAO,EACnBoC,EAAM5B,IAAQ,EAAI,KAAO,KAAK,IAAG,EACvC,QAAS3F,EAAI,EAAGA,EAAI2F,EAAK3F,IACnBuH,IAAQ,OACVrF,EAAIlC,CAAC,EAAIkC,EAAIlC,EAAI,CAAC,EAAE,IAAIuH,CAAG,GAG/B,MAAO,CACL,IAAApC,EACA,OAAQjD,EAEZ,EA/+BF,IAAqBsF,EAArB9F,EClQA,IAAqB+F,GAArB,MAAqBC,UAAkBC,CAAK,CAgB1C,OAAO,eAAeC,EAAe,CAEnC,IAAMC,EADI,IAAIC,EAAK,EACP,EAAE,IAAIF,CAAG,EACrB,OAAO,IAAIF,EAAUG,EAAE,EAAGA,EAAE,CAAC,CAC/B,CAYA,OAAgB,WAAWE,EAAW,CACpC,IAAMF,EAAIF,EAAM,WAAWI,CAAG,EAC9B,OAAO,IAAIL,EAAUG,EAAE,EAAGA,EAAE,CAAC,CAC/B,CAYA,OAAgB,QAAQG,EAAe,CACrC,IAAMH,EAAIF,EAAM,QAAQK,CAAK,EAC7B,OAAO,IAAIN,EAAUG,EAAE,EAAGA,EAAE,CAAC,CAC/B,CAYA,YACEI,EACAC,EAAmD,KACnDC,EAAiB,GAAI,CAErB,GAAIF,aAAaN,EACf,MAAMM,EAAE,KAAI,EAAIA,EAAE,KAAI,CAAE,MACnB,CAEL,GAAIC,IAAM,MAAQC,GAAS,OAAOF,GAAM,WAClCA,EAAE,SAAW,IAAMA,EAAE,SAAW,KAClC,MAAM,IAAI,MACR,0HAA0H,EAIhI,MAAMA,EAAGC,EAAGC,CAAK,CACnB,CACF,CAgBA,mBAAmBC,EAAgB,CACjC,GAAI,CAAC,KAAK,SAAQ,EAChB,MAAM,IAAI,MAAM,iDAAiD,EAEnE,OAAO,KAAK,MAAMA,CAAI,CACxB,CAgBA,OAAOC,EAAwBC,EAAgBC,EAAoB,CACjE,IAAMC,EAAU,IAAIC,EAAUC,GAAOL,EAAKE,CAAG,EAAG,EAAE,EAClD,OAAOI,GAAOH,EAASF,EAAK,IAAI,CAClC,CAYA,MAAMC,EAAuB,CAC3B,OAAIA,IAAQ,MAAc,KAAK,OAAO,GAAMA,CAAG,EACxC,KAAK,OAAO,EAAI,CACzB,CAUA,OAAOA,EAAW,CAChB,IAAMK,EAAMC,GAAQ,KAAK,OAAO,EAAI,CAAC,EACrC,OAAIN,IAAQ,MACHO,EAAMF,CAAG,EAEXA,CACT,CAgBA,UAAUG,EAA4B,CAAC,CAAI,EAAC,CAC1C,GAAI,OAAOA,GAAW,SACpB,GAAIA,IAAW,WAAaA,IAAW,OACrCA,EAAS,CAAC,GAAI,UACLA,IAAW,WAAaA,IAAW,OAC5CA,EAAS,CAAC,CAAI,MAEd,OAAM,IAAI,MAAM,kBAAkBA,CAAM,EAAE,EAG9C,OAAOC,GAAc,KAAK,OAAM,EAAgBD,CAAM,CACxD,CAUA,YACEE,EACAC,EACAC,EACAC,EAAgF,CAEhF,IAAIC,EACJ,GAAI,OAAOD,GAA+B,WAAY,CACpD,IAAME,EAAYF,EAA2BH,EAAY,IAAI,EACzDK,IAAc,QAChBD,EAAe,KAAK,mBAAmBJ,CAAU,EAC7C,OAAOE,GAAsB,YAC/BA,EAAkBF,EAAY,KAAMI,CAAY,GAGlDA,EAAeC,CAEnB,MACED,EAAe,KAAK,mBAAmBJ,CAAU,EAEnD,IAAMM,EAAmBC,EAAQN,EAAe,MAAM,EAChDO,EAAOC,GAAWL,EAAa,OAAO,EAAI,EAAGE,CAAgB,EAE7DI,EADQ,IAAI7B,EAAK,EACH,EAAE,IAAI,IAAIW,EAAUgB,CAAI,CAAC,EACvCG,EAAa,KAAK,IAAID,CAAK,EACjC,OAAO,IAAIjC,EAAUkC,EAAW,EAAGA,EAAW,CAAC,CACjD,CAmBA,OAAO,+BACLpB,EACAqB,EACAtB,EAAsB,CAEtB,IAAMuB,EAAON,EAAQK,EAAWtB,CAAG,EACnC,GAAIuB,EAAK,SAAW,GAClB,MAAM,IAAI,MAAM,2BAA2B,EAE7C,IAAMC,EAAcD,EAAK,CAAC,EAC1B,GAAIC,EAAc,IAAMA,GAAe,GACrC,MAAM,IAAI,MAAM,sBAAsB,EAExC,IAAIC,EAAIF,EAAK,CAAC,EAAI,GAKlB,OAAIE,EAAI,IAENA,GAAK,GAEG,IAAIC,GAAU,IAAIxB,EAAUqB,EAAK,MAAM,EAAG,EAAE,CAAC,EAAG,IAAIrB,EAAUqB,EAAK,MAAM,GAAI,EAAE,CAAC,CAAC,EAClF,iBAAiBE,EAAGxB,CAAO,CACtC,GC/PF,IAAqB0B,GAArB,MAAqBC,CAAS,CA0H5B,YAAYC,EAAcC,EAAY,CAtHtCC,EAAA,UAKAA,EAAA,UAkHE,KAAK,EAAIF,EACT,KAAK,EAAIC,CACX,CApGA,OAAO,QAAQE,EAAyBC,EAAsB,CAC5D,IAAMC,EAAY,CAACC,EAAeC,IAAgC,CAChE,IAAMC,EAAUF,EAAIC,EAAE,OAAO,EAC7B,IAAKC,EAAU,OAAU,EACvB,OAAOA,EAEP,MAAM,IAAI,MAAM,2BAA2B,CAE/C,EAEA,MAAMC,CAAQ,CAAd,cACEP,EAAA,aAAQ,IAEVC,EAAOO,EAAQP,EAAMC,CAAG,EAExB,IAAMG,EAAI,IAAIE,EACd,GAAIN,EAAKI,EAAE,OAAO,IAAM,GACtB,MAAM,IAAI,MAAM,oCAAoC,EAGtD,GADYF,EAAUF,EAAMI,CAAC,EACnBA,EAAE,QAAUJ,EAAK,OACzB,MAAM,IAAI,MAAM,uBAAuB,EAEzC,GAAIA,EAAKI,EAAE,OAAO,IAAM,EACtB,MAAM,IAAI,MAAM,uBAAuB,EAEzC,IAAMI,EAAON,EAAUF,EAAMI,CAAC,EAC1BP,EAAIG,EAAK,MAAMI,EAAE,MAAOI,EAAOJ,EAAE,KAAK,EAE1C,GADAA,EAAE,OAASI,EACPR,EAAKI,EAAE,OAAO,IAAM,EACtB,MAAM,IAAI,MAAM,uBAAuB,EAEzC,IAAMK,EAAOP,EAAUF,EAAMI,CAAC,EAC9B,GAAIJ,EAAK,SAAWS,EAAOL,EAAE,MAC3B,MAAM,IAAI,MAAM,mCAAmC,EAErD,IAAIN,EAAIE,EAAK,MAAMI,EAAE,MAAOK,EAAOL,EAAE,KAAK,EAC1C,GAAIP,EAAE,CAAC,IAAM,EAAG,CACd,IAAKA,EAAE,CAAC,EAAI,OAAU,EACpB,MAAM,IAAI,MAAM,kCAAkC,EAElDA,EAAIA,EAAE,MAAM,CAAC,CAEjB,CACA,GAAIC,EAAE,CAAC,IAAM,EAAG,CACd,IAAKA,EAAE,CAAC,EAAI,OAAU,EACpB,MAAM,IAAI,MAAM,kCAAkC,EAElDA,EAAIA,EAAE,MAAM,CAAC,CAEjB,CAEA,OAAO,IAAIF,EAAU,IAAIc,EAAUb,CAAC,EAAG,IAAIa,EAAUZ,CAAC,CAAC,CACzD,CAoBA,OAAO,YAAYE,EAAyBC,EAAsB,CAEhE,GADAD,EAAOO,EAAQP,EAAMC,CAAG,EACpBD,EAAK,SAAW,GAClB,MAAM,IAAI,MAAM,2BAA2B,EAE7C,IAAMW,EAAcX,EAAK,CAAC,EAC1B,GAAIW,EAAc,IAAMA,GAAe,GACrC,MAAM,IAAI,MAAM,sBAAsB,EAExC,OAAO,IAAIf,EAAU,IAAIc,EAAUV,EAAK,MAAM,EAAG,EAAE,CAAC,EAAG,IAAIU,EAAUV,EAAK,MAAM,GAAI,EAAE,CAAC,CAAC,CAC1F,CAoCA,OAAOY,EAAwBC,EAAgBZ,EAAW,CACxD,IAAMa,EAAU,IAAIJ,EAAUK,GAAOH,EAAKX,CAAG,EAAG,EAAE,EAClD,OAAOe,GAAOF,EAAS,KAAMD,CAAG,CAClC,CAiBA,SAASZ,EAAsB,CAC7B,OAAO,KAAK,MAAMA,CAAG,CACvB,CAgBA,MAAMA,EAAsB,CAC1B,IAAMgB,EAAkB,CAACC,EAAeC,IAAqB,CAC3D,GAAIA,EAAM,IACRD,EAAI,KAAKC,CAAG,MAEZ,OAAM,IAAI,MAAM,oBAAoB,CAExC,EAEMC,EAAajB,GAA2B,CAC5C,IAAIkB,EAAI,EACFF,EAAMhB,EAAI,OAAS,EACzB,KAAOA,EAAIkB,CAAC,IAAM,IAAMlB,EAAIkB,EAAI,CAAC,EAAI,OAAU,GAAKA,EAAIF,GACtDE,IAEF,OAAIA,IAAM,EACDlB,EAEFA,EAAI,MAAMkB,CAAC,CACpB,EAEIxB,EAAI,KAAK,EAAE,QAAO,EAClB,EAAI,KAAK,EAAE,QAAO,EActB,KAXKA,EAAE,CAAC,EAAI,OAAU,IACpBA,EAAI,CAAC,CAAC,EAAE,OAAOA,CAAC,IAGb,EAAE,CAAC,EAAI,OAAU,IACpB,EAAI,CAAC,CAAC,EAAE,OAAO,CAAC,GAGlBA,EAAIuB,EAAUvB,CAAC,EACf,EAAIuB,EAAU,CAAC,EAER,EAAE,CAAC,IAAM,IAAM,EAAE,CAAC,EAAI,OAAU,GACrC,EAAI,EAAE,MAAM,CAAC,EAEf,IAAIF,EAAM,CAAC,CAAI,EACfD,EAAgBC,EAAKrB,EAAE,MAAM,EAC7BqB,EAAMA,EAAI,OAAOrB,CAAC,EAClBqB,EAAI,KAAK,CAAI,EACbD,EAAgBC,EAAK,EAAE,MAAM,EAC7B,IAAMI,EAAWJ,EAAI,OAAO,CAAC,EACzBK,EAAM,CAAC,EAAI,EAGf,OAFAN,EAAgBM,EAAKD,EAAS,MAAM,EACpCC,EAAMA,EAAI,OAAOD,CAAQ,EACrBrB,IAAQ,MACHuB,EAAMD,CAAG,EACPtB,IAAQ,SACVwB,GAASF,CAAG,EAEZA,CAEX,CAgBA,UAAUG,EAAkBC,EAAqB1B,EAAsB,CACrE,GAAIyB,EAAW,GAAKA,EAAW,EAAG,MAAM,IAAI,MAAM,wBAAwB,EAC1E,GAAI,OAAOC,GAAe,UACxB,MAAM,IAAI,UAAU,0BAA0B,EAEhD,IAAIhB,EAAc,GAAKe,EACnBC,IACFhB,GAAe,GAEjB,IAAIO,EAAM,CAACP,CAAW,EAGtB,OAFAO,EAAMA,EAAI,OAAO,KAAK,EAAE,QAAQ,KAAM,EAAE,CAAC,EACzCA,EAAMA,EAAI,OAAO,KAAK,EAAE,QAAQ,KAAM,EAAE,CAAC,EACrCjB,IAAQ,MACHuB,EAAMN,CAAG,EACPjB,IAAQ,SACVwB,GAASP,CAAG,EAEZA,CAEX,CAeA,iBAAiBQ,EAAkBE,EAAY,CAC7C,IAAM/B,EAAI,KAAK,EACTC,EAAI,KAAK,EAGT+B,GAAUH,EAAW,KAAO,EAI5BI,EAAcJ,GAAY,EAE1BK,EAAQ,IAAIC,EACZC,EAAIF,EAAM,EACVG,EAAIH,EAAM,EAGVI,EAAIL,IAAgB,EAAIjC,EAAIA,EAAE,IAAIoC,CAAC,EACnCG,EAAIC,EAAM,MAAMF,EAAGN,CAAM,EAI/B,GAAI,CADOO,EAAE,IAAIH,CAAC,EACV,WAAU,EAChB,MAAM,IAAI,MAAM,uBAAuB,EAIzC,IAAMK,EAAOV,EAAE,IAAG,EAAG,KAAKK,CAAC,EAIrBM,EAAO1C,EAAE,KAAKoC,CAAC,EAGfO,EAAQD,EAAK,IAAIzC,CAAC,EAAE,KAAKmC,CAAC,EAC1BQ,EAAWF,EAAK,IAAID,CAAI,EAAE,KAAKL,CAAC,EAChCS,EAAIR,EAAE,IAAIO,CAAQ,EAAE,IAAIL,EAAE,IAAII,CAAK,CAAC,EAEpCG,EAAS,IAAIC,GAAUF,CAAC,EAC9B,OAAAC,EAAO,SAAQ,EAERA,CACT,CAeA,wBAAwBE,EAAmB/B,EAAkB,CAC3D,QAASY,EAAW,EAAGA,EAAW,EAAGA,IAAY,CAC/C,IAAIoB,EACJ,GAAI,CACFA,EAAS,KAAK,iBAAiBpB,EAAUZ,CAAO,CAClD,MAAQ,CACN,QACF,CACA,GAAI+B,EAAO,GAAGC,CAAM,EAClB,OAAOpB,CAEX,CACA,MAAM,IAAI,MAAM,sCAAsC,CACxD,GCzVF,IAAqBqB,GAArB,KAAyB,CAIvB,YAAYC,EAA4BC,EAAwB,CAHhEC,EAAA,UACAA,EAAA,UAGE,IAAMC,EAAeC,EAAQJ,EAAS,KAAK,EACrCK,EAAaD,EAAQH,EAAO,KAAK,EAGvC,GAAIE,EAAa,SAAW,GAC1B,MAAM,IAAI,MAAM,6CAA6C,EAE/D,GAAIE,EAAW,SAAW,GACxB,MAAM,IAAI,MAAM,2CAA2C,EAG7D,IAAMC,EAAeH,EAAa,OAAOE,CAAU,EAEnD,KAAK,EAAI,MAAM,KAAK,CAAE,OAAQ,EAAE,CAAE,EAClC,KAAK,EAAI,MAAM,KAAK,CAAE,OAAQ,EAAE,CAAE,EAClC,QAASE,EAAI,EAAGA,EAAI,GAAIA,IACtB,KAAK,EAAEA,CAAC,EAAI,EACZ,KAAK,EAAEA,CAAC,EAAI,EAGd,KAAK,OAAOD,CAAY,CAC1B,CAWA,MAAI,CACF,OAAO,IAAIE,GAAW,KAAK,CAAC,CAC9B,CAaA,OAAOC,EAAe,CACpB,IAAIC,EAAO,KAAK,KAAI,EAAG,OAAO,KAAK,CAAC,EAAE,OAAO,CAAC,CAAI,CAAC,EAC/CD,IAAS,SACXC,EAAOA,EAAK,OAAOD,CAAI,GAEzB,KAAK,EAAIC,EAAK,OAAM,EACpB,KAAK,EAAI,KAAK,KAAI,EAAG,OAAO,KAAK,CAAC,EAAE,OAAM,EACtCD,IAAS,SAIb,KAAK,EAAI,KAAK,KAAI,EAAG,OAAO,KAAK,CAAC,EAAE,OAAO,CAAC,CAAI,CAAC,EAAE,OAAOA,CAAI,EAAE,OAAM,EACtE,KAAK,EAAI,KAAK,KAAI,EAAG,OAAO,KAAK,CAAC,EAAE,OAAM,EAC5C,CAaA,SAASE,EAAW,CAClB,IAAIC,EAAiB,CAAA,EACrB,KAAOA,EAAK,OAASD,GACnB,KAAK,EAAI,KAAK,KAAI,EAAG,OAAO,KAAK,CAAC,EAAE,OAAM,EAC1CC,EAAOA,EAAK,OAAO,KAAK,CAAC,EAG3B,IAAMC,EAAMD,EAAK,MAAM,EAAGD,CAAG,EAC7B,YAAK,OAAM,EACJG,EAAMD,CAAG,CAClB,GC9EF,SAASE,GAAYC,EAAgBC,EAAqBC,EAAQ,IAAIC,EAAO,CAC3E,IAAMC,EAAQJ,EAAI,WAAU,EAAK,EAAIE,EAAM,EAAE,UAAS,EAItD,OAHIE,EAAQ,GACVJ,EAAI,OAAOI,CAAK,EAEdH,IAAc,IAAQD,EAAI,IAAIE,EAAM,CAAC,GAAK,EACrCF,EAAI,IAAIE,EAAM,CAAC,EAEfF,CAEX,CAEA,SAASK,GAAWC,EAAa,CAC/B,IAAMC,EAAQD,EAAG,QAAQ,IAAI,EACzBE,EAAI,GACR,QAAWC,KAAQF,EACjBC,EAAKA,GAAK,GAAM,OAAOC,CAAI,EAE7B,OAAOD,CACT,CAEA,IAAMN,GAAQ,IAAIC,EACZI,GAAQL,GAAM,EAAE,WAAU,EAC1BQ,GAAMR,GAAM,EAAE,KAAK,CAAC,EACpBS,GAAQC,IAAY,GAE1B,SAASC,GACPC,EACAC,EACAC,EAAU,CAEV,IAAIC,EAQJ,GAPI,OAAOH,GAAY,WACrBG,EAAWH,EAAQC,CAAI,EACdD,IAAY,QAAaI,EAAU,KAAKJ,CAAO,EACxDG,EAAWH,EAEXG,EAAW,IAAIC,EAAUF,EAAK,SAAST,EAAK,EAAG,EAAE,EAE/CU,GAAY,KAAM,MAAM,IAAI,MAAM,gBAAgB,EACtD,OAAOlB,GAAYkB,EAAU,EAAI,CACnC,CAEA,SAASE,GAAoBC,EAAiBC,EAAe,CAC3D,GAAID,EAAQ,MAAM,IAAI,MAAMC,CAAO,CAErC,CAEA,SAASC,GACPC,EACAC,EACAC,EACAC,EACAN,EAAe,CAEf,GAAIG,EAAI,KAAK,CAAC,EAAI,GAAKA,EAAI,IAAIb,EAAG,EAAI,EACpC,OAAOS,GAAoBC,EAAQ,oDAAoD,EAGzF,IAAMO,EAAIzB,GAAM,EAAE,MAAMqB,CAAG,EAC3B,GAAII,EAAE,WAAU,EACd,OAAOR,GAAoBC,EAAQ,mDAAgD,EAGrF,IAAMQ,EAAOC,GAAK,OAAO,KAAOF,EAAE,KAAI,EAAG,SAAS,EAAE,CAAC,CAAC,EACtD,GAAIC,IAAS,GACX,OAAOT,GAAoBC,EAAQ,uCAAuC,EAG5E,IAAMU,EAAOC,GAAQ,OAAO,KAAOR,EAAI,SAAS,EAAE,CAAC,CAAC,EAC9CS,EAAMH,GAAKL,EAASS,GAAQL,EAAMH,CAAM,CAAC,EAC3CS,EAAOD,GAAQH,EAAME,CAAG,EAC5B,OAAIE,IAAS,GACJf,GAAoBC,EAAQ,uCAAuC,GAExEM,GAAaQ,EAAOvB,KAAOuB,EAAOtB,GAAWsB,GAE1C,IAAIC,GAAU,IAAIjB,EAAUU,EAAK,SAAS,EAAE,EAAG,EAAE,EAAG,IAAIV,EAAUgB,EAAK,SAAS,EAAE,EAAG,EAAE,CAAC,EACjG,CAgCO,IAAME,GAAO,CAClBpC,EACAqC,EACAX,EAAqB,GACrBZ,IACa,CACb,IAAMwB,EAAapC,GAAM,EAAE,UAAS,EACpC,GAAIF,EAAI,UAAS,EAAKsC,EACpB,MAAM,IAAI,MACR,2CAA2CA,CAAU,mDAAmD,EAI5GtC,EAAMD,GAAYC,CAAG,EACrB,IAAMwB,EAASnB,GAAWL,CAAG,EACvByB,EAASpB,GAAWgC,CAAG,EAEvBE,EAAOF,EAAI,QAAQ,KAAM9B,EAAK,EAC9BiC,EAAQxC,EAAI,QAAQ,KAAMO,EAAK,EAC/BS,EAAO,IAAIyB,GAAKF,EAAMC,CAAK,EAC3BpB,EAASF,EAAU,KAAKJ,CAAO,EAErC,QAASC,EAAO,GAAKA,IAAQ,CAC3B,IAAM2B,EAAYpB,GAChBT,GAAQC,EAASC,EAAMC,CAAI,EAC3BQ,EACAC,EACAC,EACAN,CAAM,EAER,GAAIsB,GAAa,KAAM,OAAOA,CAChC,CACF,EA6BaC,GAAS,CAAC3C,EAAgB4C,EAAgBP,IAAuB,CAC5E,IAAMC,EAAapC,GAAM,EAAE,UAAS,EACpC,GAAIF,EAAI,UAAS,EAAKsC,EAEpB,MAAO,GAIT,IAAMO,EAAOxC,GAAWL,CAAG,EAC3B,GAAIqC,EAAI,GAAK,MAAQA,EAAI,GAAK,KAC5B,MAAM,IAAI,MAAM,0CAA0C,EAG5D,IAAMS,EAAY,CAChB,EAAGzC,GAAWgC,EAAI,CAAC,EACnB,EAAGhC,GAAWgC,EAAI,CAAC,GAEfK,EAAY,CAChB,EAAGrC,GAAWuC,EAAI,CAAC,EACnB,EAAGvC,GAAWuC,EAAI,CAAC,GAGf,CAAE,EAAAG,EAAG,EAAAC,CAAC,EAAKN,EACXO,EAAIJ,EAGV,GAAIE,GAAKG,GAAWH,GAAKnC,IAAYoC,GAAKE,GAAWF,GAAKpC,GACxD,MAAO,GAIT,IAAMuC,EAAIpB,GAAQiB,CAAC,EACnB,GAAIG,IAAM,GAAI,MAAO,GACrB,IAAMC,EAAKnB,GAAQgB,EAAGE,CAAC,EACjBE,EAAKpB,GAAQc,EAAGI,CAAC,EAGjBG,EAAKC,GAAmBH,EAAI,CAAE,EAAGI,GAAW,EAAGC,EAAS,CAAE,EAC1DC,EAAKH,GAAmBF,EAAIP,CAAS,EACrCnB,EAAIgC,GAAML,EAAII,CAAE,EACtB,GAAI/B,EAAE,IAAM,GAAI,MAAO,GAGvB,IAAMiC,EAAOC,GAASlC,EAAE,CAAC,EACnBmC,EAAQC,EAASH,EAAMA,CAAI,EAC3BI,EAAOD,EAASpC,EAAE,EAAGmC,CAAK,EAIhC,OADUjC,GAAKmC,CAAI,IACNjB,CACf,ECvPA,IAAMkB,GAAN,KAAU,CASR,aAAA,CARAC,EAAA,cASE,IAAMC,EAAS,IAAY,CACzB,MAAM,IAAI,MACR,qEAAqE,CAEzE,EAKA,GAHA,KAAK,MAAQA,EAGT,OAAO,WAAe,KAAe,OAAQ,WAAmB,QAAQ,iBAAoB,WAAY,CAC1G,KAAK,MAASC,GACL,KAAK,gBAAgB,WAAmBA,CAAC,EAElD,MACF,CAGA,GAAI,WAAW,OAAS,QAAa,OAAO,WAAW,KAAK,QAAQ,iBAAoB,WAAY,CAClG,KAAK,MAASA,GACL,KAAK,gBAAgB,WAAW,KAAMA,CAAC,EAEhD,MACF,CAGA,GAAI,WAAW,SAAW,QAAa,OAAQ,WAAW,OAAe,QAAQ,iBAAoB,WAAY,CAC/G,KAAK,MAASA,GACL,KAAK,gBAAgB,WAAW,OAAQA,CAAC,EAElD,MACF,CAIA,GACE,OAAO,QAAY,KACnB,OAAO,QAAQ,kBAAqB,WACpC,CACA,IAAMC,EAAa,QAAQ,iBAAiB,aAAa,EACzD,GAAI,OAAOA,GAAY,aAAgB,WAAY,CACjD,KAAK,MAAQ,GAAK,MAAM,KAAKA,EAAW,YAAY,CAAC,CAAC,EACtD,MACF,CACF,CAGA,KAAK,MAAQF,CACf,CAtDA,gBAAiBG,EAAUF,EAAS,CAClC,IAAMG,EAAM,IAAI,WAAWH,CAAC,EAC5B,OAAAE,EAAI,OAAO,gBAAgBC,CAAG,EACvB,MAAM,KAAKA,CAAG,CACvB,CAoDA,SAAUC,EAAW,CACnB,OAAO,KAAK,MAAMA,CAAG,CACvB,GAGEC,GAAmB,KAajBC,GAAUF,IACdC,QAAQ,IAAIR,IACLQ,GAAI,SAASD,CAAG,GAGzBG,GAAeD,GCzFR,IAAME,EAAoB,IAC3BC,GAA0B,IAC1BC,GAAe,+BAErB,SAASC,GAA0BC,EAAmBC,EAAoBC,EAAe,CACvF,GAAI,CAAC,OAAO,cAAcF,CAAS,GAAKA,EAAYE,GAAWF,EAAYJ,EACzE,MAAM,IAAI,UAAU,yCAAyCM,CAAO,OAAON,CAAiB,EAAE,EAEhG,GAAII,EAAYC,EAAY,MAAM,IAAI,MAAM,8CAA8C,CAC5F,CAEM,IAAOE,EAAP,MAAOC,CAAkB,CAI7B,YAAaC,EAAcC,EAAY,CAHvCC,EAAA,UACAA,EAAA,UAGE,IAAMC,EAAI,IAAIC,EAAK,EAAG,EACtB,KAAK,EAAIJ,EAAE,KAAKG,CAAC,EACjB,KAAK,EAAIF,EAAE,KAAKE,CAAC,CACnB,CAEA,UAAQ,CACN,OAAOE,GAAS,KAAK,EAAE,QAAO,CAAE,EAAI,IAAMA,GAAS,KAAK,EAAE,QAAO,CAAE,CACrE,CAEA,OAAO,WAAYC,EAAW,CAC5B,GAAI,OAAOA,GAAQ,UAAYA,EAAI,OAASd,GAC1C,MAAM,IAAI,UAAU,uEAAuE,EAE7F,GAAM,CAACQ,EAAGC,EAAGM,CAAK,EAAID,EAAI,MAAM,GAAG,EACnC,GAAIC,IAAU,QAAaP,IAAM,QAAaC,IAAM,QAAa,CAACR,GAAa,KAAKO,CAAC,GAAK,CAACP,GAAa,KAAKQ,CAAC,EAC5G,MAAM,IAAI,UAAU,uEAAuE,EAE7F,IAAMO,EAAQ,IAAIT,EAChB,IAAIU,EAAUC,GAAWV,CAAC,CAAC,EAC3B,IAAIS,EAAUC,GAAWT,CAAC,CAAC,CAAC,EAE9B,GAAIO,EAAM,SAAQ,IAAOF,EACvB,MAAM,IAAI,UAAU,uEAAuE,EAE7F,OAAOE,CACT,GAkBmBG,GAArB,MAAqBC,CAAU,CAI7B,YAAaC,EAA8BlB,EAAkB,CAHpDO,EAAA,eACAA,EAAA,kBAGP,GAAI,CAAC,MAAM,QAAQW,CAAM,GAAKA,EAAO,SAAW,GAAKA,EAAO,OAAStB,EACnE,MAAM,IAAI,UAAU,iCAAiCA,CAAiB,UAAU,EAElF,IAAMuB,EAAoBnB,GAAakB,EAAO,OAC9CnB,GAA0BoB,EAAmBD,EAAO,OAAQ,CAAC,EAC7D,KAAK,OAASA,EAAO,MAAK,EAC1B,KAAK,UAAYC,CACnB,CAEA,OAAO,eAAgBC,EAAiBpB,EAAiB,CACvD,GAAI,CAAC,OAAO,cAAcA,CAAS,GAAKA,EAAY,GAAKA,EAAYJ,EACnE,MAAM,IAAI,UAAU,8CAA8CA,CAAiB,EAAE,EAEvF,IAAMY,EAAI,IAAIC,EAAK,EAAG,EAEhBS,EAAS,CACb,IAAIf,EAAmB,IAAIW,EAAU,CAAC,EAAG,IAAIA,EAAUM,EAAI,QAAO,CAAE,CAAC,GAIvE,QAASC,EAAI,EAAGA,EAAIrB,EAAWqB,IAAK,CAClC,IAAMC,EAAU,IAAIR,EAAUS,GAAO,EAAE,CAAC,EAAE,KAAKf,CAAC,EAC1CgB,EAAU,IAAIV,EAAUS,GAAO,EAAE,CAAC,EAAE,KAAKf,CAAC,EAChDU,EAAO,KAAK,IAAIf,EAAmBmB,EAASE,CAAO,CAAC,CACtD,CAEA,OAAO,IAAIP,EAAWC,CAAM,CAC9B,CAGA,QAASb,EAAY,CAEnB,GADAN,GAA0B,KAAK,UAAW,KAAK,OAAO,OAAQ,CAAC,EAC3D,EAAEM,aAAaS,GAAY,MAAM,IAAI,UAAU,uBAAuB,EAC1E,IAAMN,EAAI,IAAIC,EAAK,EAAG,EAChBgB,EAAmB,IAAI,IAC7B,QAASC,EAAQ,EAAGA,EAAQ,KAAK,UAAWA,IAAS,CACnD,IAAMb,EAAQ,KAAK,OAAOa,CAAK,EAC/B,GAAI,EAAEb,aAAiBV,IAAuB,EAAEU,EAAM,aAAaC,IAAc,EAAED,EAAM,aAAaC,GACpG,MAAM,IAAI,UAAU,yCAAyC,EAE/D,GAAID,EAAM,EAAE,MAAK,GAAMA,EAAM,EAAE,MAAK,GAAMA,EAAM,EAAE,IAAIL,CAAC,GAAKK,EAAM,EAAE,IAAIL,CAAC,EACvE,MAAM,IAAI,UAAU,oDAAoD,EAE1E,IAAMmB,EAAcd,EAAM,EAAE,SAAS,EAAE,EACvC,GAAIY,EAAiB,IAAIE,CAAW,EAAG,MAAM,IAAI,MAAM,kDAAkD,EACzGF,EAAiB,IAAIE,CAAW,CAClC,CACA,IAAMC,EAAcvB,EAAE,KAAKG,CAAC,EACxBF,EAAI,IAAIQ,EAAU,CAAC,EACvB,QAASO,EAAI,EAAGA,EAAI,KAAK,UAAWA,IAAK,CACvC,IAAIQ,EAAO,KAAK,OAAOR,CAAC,EAAE,EAC1B,QAASS,EAAI,EAAGA,EAAI,KAAK,UAAWA,IAClC,GAAIT,IAAMS,EAAG,CACX,IAAMC,EAAK,KAAK,OAAOD,CAAC,EAAE,EACpBE,EAAK,KAAK,OAAOX,CAAC,EAAE,EAEpBY,EAAYL,EAAY,IAAIG,CAAE,EAAE,KAAKvB,CAAC,EAEtC0B,EADcF,EAAG,IAAID,CAAE,EAAE,KAAKvB,CAAC,EACE,KAAKA,CAAC,EAEvC2B,EAAWF,EAAU,IAAIC,CAAkB,EAAE,KAAK1B,CAAC,EACzDqB,EAAOA,EAAK,IAAIM,CAAQ,EAAE,KAAK3B,CAAC,CAClC,CAEFF,EAAIA,EAAE,IAAIuB,CAAI,EAAE,KAAKrB,CAAC,CACxB,CACA,OAAOF,CACT,GC9HF,IAAM8B,GAA0B,IAC1BC,GAAqB,+BACrBC,GAAyB,6CACzBC,GAAyB,gBAE/B,SAASC,GAAyBC,EAA8BC,EAAmBC,EAAiB,CAClG,GAAI,CAAC,MAAM,QAAQF,CAAM,GAAKA,EAAO,SAAW,GAAKA,EAAO,OAASG,EACnE,MAAM,IAAI,UAAU,iCAAiCA,CAAiB,UAAU,EAElF,GAAI,CAAC,OAAO,cAAcF,CAAS,GAAKA,EAAY,GAAKA,EAAYE,EACnE,MAAM,IAAI,UAAU,8CAA8CA,CAAiB,EAAE,EAEvF,GAAI,OAAOD,GAAc,UAAY,CAACJ,GAAuB,KAAKI,CAAS,EACzE,MAAM,IAAI,UAAU,+DAA+D,CAEvF,CAiBM,IAAOE,GAAP,MAAOC,CAAS,CAKpB,YAAYL,EAA8BC,EAAmBC,EAAiB,CAJ9EI,EAAA,eACAA,EAAA,kBACAA,EAAA,kBAGE,KAAK,OAASN,EACd,KAAK,UAAYC,EACjB,KAAK,UAAYC,CACnB,CAMA,OAAO,iBAAiBK,EAAgB,CACtC,GAAI,CAAC,MAAM,QAAQA,CAAM,GAAKA,EAAO,SAAW,GAAKA,EAAO,OAASJ,EACnE,MAAM,IAAI,UAAU,iCAAiCA,CAAiB,UAAU,EAElF,IAAIF,EAAY,EACZC,EAAY,GACVF,EAA+B,CAAA,EACrC,QAASQ,EAAM,EAAGA,EAAMD,EAAO,OAAQC,IAAO,CAC5C,GAAI,CAAC,OAAO,UAAU,eAAe,KAAKD,EAAQC,CAAG,EAAG,MAAM,IAAI,UAAU,8BAA8B,EAC1G,IAAMC,EAAQF,EAAOC,CAAG,EACxB,GAAI,OAAOC,GAAU,UAAYA,EAAM,OAASd,GAC9C,MAAM,IAAI,UAAU,iCAAiCa,EAAI,SAAQ,CAAE,EAAE,EAEvE,IAAME,EAAaD,EAAM,MAAM,GAAG,EAClC,GAAIC,EAAW,SAAW,EACxB,MAAM,IAAI,MAAM,iCAAiCF,EAAI,SAAQ,CAAE,8BAA8B,EAE/F,GAAM,CAACG,EAAGC,EAAGC,EAAGC,CAAC,EAAIJ,EACrB,GACEC,IAAM,QACNC,IAAM,QACNC,IAAM,QACNC,IAAM,QACN,CAAClB,GAAmB,KAAKe,CAAC,GAC1B,CAACf,GAAmB,KAAKgB,CAAC,GAC1B,CAACf,GAAuB,KAAKgB,CAAC,GAC9B,CAACf,GAAuB,KAAKgB,CAAC,EAE9B,MAAM,IAAI,UAAU,yCAAyCN,EAAI,SAAQ,CAAE,EAAE,EAE/E,IAAMO,EAAO,OAAOF,CAAC,EACrB,GAAIL,IAAQ,GAAKP,IAAcc,EAC7B,MAAM,IAAI,MAAM,+BAAiCP,EAAI,SAAQ,CAAE,EAEjE,GAAIA,IAAQ,GAAKN,IAAcY,EAC7B,MAAM,IAAI,MAAM,+BAAiCN,EAAI,SAAQ,CAAE,EAEjEP,EAAYc,EACZb,EAAYY,EACZd,EAAO,KAAKgB,EAAmB,WAAW,GAAGL,CAAC,IAAIC,CAAC,EAAE,CAAC,CACxD,CACA,OAAAb,GAAyBC,EAAQC,EAAWC,CAAS,EAC9C,IAAIG,EAAUL,EAAQC,EAAWC,CAAS,CACnD,CAEA,gBAAc,CACZH,GAAyB,KAAK,OAAQ,KAAK,UAAW,KAAK,SAAS,EACpE,IAAMkB,EAAmB,CAAA,EACzB,QAASC,EAAQ,EAAGA,EAAQ,KAAK,OAAO,OAAQA,IAAS,CACvD,GAAI,CAAC,OAAO,UAAU,eAAe,KAAK,KAAK,OAAQA,CAAK,EAAG,MAAM,IAAI,UAAU,8BAA8B,EACjH,IAAMC,EAAQ,KAAK,OAAOD,CAAK,EAC/B,GAAI,EAAEC,aAAiBH,GAAqB,MAAM,IAAI,UAAU,yCAAyC,EACzG,IAAMI,EAAaD,EAAM,SAAQ,EACjC,GAAIH,EAAmB,WAAWI,CAAU,EAAE,SAAQ,IAAOA,EAC3D,MAAM,IAAI,UAAU,mDAAmD,EAEzEH,EAAO,KAAK,GAAGG,CAAU,IAAI,KAAK,UAAU,SAAQ,CAAE,IAAI,KAAK,SAAS,EAAE,CAC5E,CACA,OAAOH,CACT,GAYmBI,GAArB,MAAqBC,UAAmBC,CAAS,CAW/C,OAAO,YAAU,CACf,OAAO,IAAID,EAAWE,GAAO,EAAE,CAAC,CAClC,CAYA,OAAgB,WAAWC,EAAaC,EAAuB,MAAK,CAClE,OAAO,IAAIJ,EAAW,MAAM,WAAWG,EAAKC,CAAI,EAAE,QAAO,CAAE,CAC7D,CAWA,OAAgB,QAAQD,EAAW,CACjC,OAAO,IAAIH,EAAW,MAAM,QAAQG,EAAK,KAAK,CAAC,CACjD,CAYA,OAAO,QAAQE,EAAaC,EAAuB,EAAC,CAClD,IAAMC,EAAUC,GAAgBH,EAAK,OAAWC,CAAY,EAC5D,GAAIC,EAAQ,KAAK,SAAW,GAC1B,MAAM,IAAI,MAAM,oBAAoB,EAEtC,GAAIA,EAAQ,KAAK,EAAE,IAAM,EACvB,MAAM,IAAI,MAAM,qBAAqB,EAEvC,OAAO,IAAIP,EAAWO,EAAQ,KAAK,MAAM,EAAG,EAAE,CAAC,CACjD,CAkBA,YACEE,EAAiD,EACjDL,EAAqC,GACrCM,EAAsB,KACtBC,EAAsC,QAAO,CAS7C,GAPIF,aAAkBR,GACpB,MAAK,EACLQ,EAAO,KAAK,IAAI,GAEhB,MAAMA,EAAQL,EAAMM,CAAM,EAGxBC,IAAS,UAAW,CACtB,IAAMC,EAAQ,KAAK,aAAY,EAC/B,GAAI,CAACA,EAAM,QAAS,CAClB,GAAID,IAAS,QACX,MAAM,IAAI,MAAM,uBAAuB,EAGzCV,EAAU,KAAK,KAAMW,EAAM,IAAI,CACjC,CACF,CACF,CAMA,cAAY,CACV,IAAMC,EAAQ,IAAIC,EACZH,EAAO,KAAK,IAAIE,EAAM,CAAC,EAE7B,MAAO,CAAE,QADO,KAAK,IAAIF,CAAI,IAAM,EACjB,KAAAA,CAAI,CACxB,CAKA,SAAO,CACL,OAAO,KAAK,aAAY,EAAG,OAC7B,CAgBA,KACEI,EACAC,EACAC,EAAqB,GACrBC,EAAmD,CAEnD,IAAMC,EAAU,IAAIlB,EAAUmB,GAAOL,EAAKC,CAAG,EAAG,EAAE,EAClD,OAAOK,GAAKF,EAAS,KAAMF,EAAWC,CAAO,CAC/C,CAgBA,OAAOH,EAAwBO,EAAgBN,EAAW,CACxD,IAAMG,EAAU,IAAIlB,EAAUmB,GAAOL,EAAKC,CAAG,EAAG,EAAE,EAClD,OAAOO,GAAOJ,EAASG,EAAK,KAAK,YAAW,CAAE,CAChD,CAcA,aAAW,CAET,IAAME,EADI,IAAIV,EAAK,EACP,EAAE,MAAM,IAAI,EACxB,OAAO,IAAIW,GAAUD,EAAE,EAAGA,EAAE,CAAC,CAC/B,CAoBA,MAAME,EAAmB,CAAC,GAAI,EAAC,CAC7B,GAAI,CAAC,KAAK,QAAO,EACf,MAAM,IAAI,MAAM,uBAAuB,EAEzC,OAAOC,GAAc,CAAC,GAAG,KAAK,QAAQ,KAAM,EAAE,EAAG,CAAC,EAAGD,CAAM,CAC7D,CAgBA,UAAUA,EAA4B,CAAC,CAAI,EAAC,CAC1C,OAAO,KAAK,YAAW,EAAG,UAAUA,CAAM,CAC5C,CAaS,OAAK,CACZ,OAAO,MAAM,MAAM,EAAE,CACvB,CAWS,SAAStB,EAAuB,MAAOwB,EAAkB,GAAE,CAClE,OAAO,MAAM,SAASxB,EAAMwB,CAAO,CACrC,CAeA,mBAAmBC,EAAc,CAC/B,GAAI,CAACA,EAAI,SAAQ,EACf,MAAM,IAAI,MAAM,iDAAiD,EAEnE,OAAOA,EAAI,MAAM,IAAI,CACvB,CAqCA,YACEC,EACAC,EACAC,EACAC,EAAgF,CAEhF,IAAIC,EACJ,GAAI,OAAOD,GAA+B,WAAY,CACpD,IAAME,EAAYF,EAA2B,KAAMH,CAAS,EACxDK,IAAc,QAChBD,EAAe,KAAK,mBAAmBJ,CAAS,EAC5C,OAAOE,GAAsB,YAC/BA,EAAkB,KAAMF,EAAWI,CAAY,GAGjDA,EAAeC,CAEnB,MACED,EAAe,KAAK,mBAAmBJ,CAAS,EAElD,IAAMM,EAAmBC,EAAQN,EAAe,MAAM,EAChDO,EAAOC,GAAWL,EAAa,OAAO,EAAI,EAAGE,CAAgB,EAC7DvB,EAAQ,IAAIC,EAClB,OAAO,IAAId,EAAW,KAAK,IAAI,IAAIC,EAAUqC,CAAI,CAAC,EAAE,IAAIzB,EAAM,CAAC,EAAE,QAAO,CAAE,CAC5E,CAeA,YAAYlC,EAAmB6D,EAAmB,CAChD,GAAI,OAAO7D,GAAc,UAAY,OAAO6D,GAAgB,SAC1D,MAAM,IAAI,UAAU,2CAA2C,EAEjE,GAAI,CAAC,OAAO,cAAc7D,CAAS,GAAK,CAAC,OAAO,cAAc6D,CAAW,EACvE,MAAM,IAAI,UAAU,iDAAiD,EAEvE,GAAI7D,EAAY,EAAG,MAAM,IAAI,MAAM,8BAA8B,EACjE,GAAI6D,EAAc,EAAG,MAAM,IAAI,MAAM,gCAAgC,EACrE,GAAI7D,EAAY6D,EACd,MAAM,IAAI,MAAM,uDAAuD,EAEzE,GAAI7D,EAAYE,GAAqB2D,EAAc3D,EACjD,MAAM,IAAI,WAAW,2CAA2CA,CAAiB,EAAE,EAGrF,IAAM4D,EAAOC,GAAW,eAAe,KAAM/D,CAAS,EAEhDD,EAA+B,CAAA,EAC/BiE,EAAmB,IAAI,IACvB9B,EAAQ,IAAIC,EAeZ8B,EAAO1C,GAAO,EAAE,EACtB,QAASV,EAAI,EAAGA,EAAIgD,EAAahD,IAAK,CACpC,IAAIH,EACAwD,EAAW,EACf,EAAG,CAGD,IAAMC,EAAU,CAACtD,EAAGqD,EAAU,GAAG3C,GAAO,EAAE,CAAC,EACrC6C,EAAIC,GAAWJ,EAAME,CAAO,EAIlC,GAHAzD,EAAI,IAAIY,EAAU8C,CAAC,EAAE,KAAKlC,EAAM,CAAC,EAEjCgC,IACIA,EAAW,EACb,MAAM,IAAI,MAAM,yDAAyD,CAE7E,OAASxD,EAAE,OAAM,GAAMsD,EAAiB,IAAItD,EAAE,SAAQ,CAAE,GAExDsD,EAAiB,IAAItD,EAAE,SAAQ,CAAE,EACjC,IAAMC,EAAImD,EAAK,QAAQpD,CAAC,EACxBX,EAAO,KAAK,IAAIgB,EAAmBL,EAAGC,CAAC,CAAC,CAC1C,CAEA,IAAMV,EAAa,KAAK,YAAW,EAAG,OAAO,KAAK,EAAa,MAAM,EAAG,CAAC,EAEzE,OAAO,IAAIE,GAAUJ,EAAQC,EAAWC,CAAS,CACnD,CAaA,eAAeD,EAAmB6D,EAAmB,CACnD,OAAO,KAAK,YAAY7D,EAAW6D,CAAW,EAAE,eAAc,CAChE,CAkBA,OAAO,iBAAiBvD,EAAgB,CACtC,OAAOe,EAAW,cAAclB,GAAU,iBAAiBG,CAAM,CAAC,CACpE,CAWA,OAAO,cAAcgE,EAAoB,CACvC,GAAIA,IAAc,MAAQ,OAAOA,GAAc,SAAU,MAAM,IAAI,UAAU,6BAA6B,EAC1G,IAAMvE,EAASuE,EAAU,OACnBtE,EAAYsE,EAAU,UACtBrE,EAAYqE,EAAU,UAE5B,GADAxE,GAAyBC,EAAQC,EAAWC,CAAS,EACjDF,EAAO,OAASC,EAClB,MAAM,IAAI,MAAM,YAAYA,CAAS,qDAAqD,EAG5F,IAAMuE,EAAoC,CAAA,EACpCC,EAAI,IAAIrC,EAAK,EAAG,EACtB,QAASlB,EAAQ,EAAGA,EAAQjB,EAAWiB,IAAS,CAC9C,GAAI,CAAC,OAAO,UAAU,eAAe,KAAKlB,EAAQkB,CAAK,EAAG,MAAM,IAAI,UAAU,8BAA8B,EAC5G,IAAMC,EAAQnB,EAAOkB,CAAK,EAC1B,GAAI,EAAEC,aAAiBH,IAAuB,EAAEG,EAAM,aAAaI,IAAc,EAAEJ,EAAM,aAAaI,GACpG,MAAM,IAAI,UAAU,yCAAyC,EAE/D,GAAIJ,EAAM,EAAE,MAAK,GAAMA,EAAM,EAAE,MAAK,GAAMA,EAAM,EAAE,IAAIsD,CAAC,GAAKtD,EAAM,EAAE,IAAIsD,CAAC,EACvE,MAAM,IAAI,UAAU,oDAAoD,EAE1ED,EAAY,KAAK,IAAIxD,EAAmB,IAAIO,EAAUJ,EAAM,EAAE,QAAO,CAAE,EAAG,IAAII,EAAUJ,EAAM,EAAE,QAAO,CAAE,CAAC,CAAC,CAC7G,CAEA,QAASL,EAAI,EAAGA,EAAIb,EAAWa,IAC7B,QAAS4D,EAAI5D,EAAI,EAAG4D,EAAIzE,EAAWyE,IACjC,GAAIF,EAAY1D,CAAC,EAAE,EAAE,GAAG0D,EAAYE,CAAC,EAAE,CAAC,EACtC,MAAM,IAAI,MAAM,gDAAgD,EAItE,IAAMX,EAAO,IAAIC,GAAWQ,EAAavE,CAAS,EAC5C0E,EAAa,IAAIrD,EAAWyC,EAAK,QAAQ,IAAIxC,EAAU,CAAC,CAAC,EAAE,QAAO,CAAE,EAE1E,GADsBoD,EAAW,YAAW,EAAG,OAAO,KAAK,EAAE,MAAM,EAAG,CAAC,IACjDzE,EACpB,MAAM,IAAI,MAAM,yBAAyB,EAG3C,OAAOyE,CACT,GCtmBK,SAASC,GAAWC,EAA4CC,EAAgC,CACrG,IAAIC,EAAuB,QAAQ,QAAQ,EAC3C,OAAQC,IACND,EAAQA,EAAM,KAAK,IAAMF,EAAOG,CAAK,CAAC,EAAE,MAAOC,GAAMH,IAAUG,CAAC,CAAC,EAC1DF,EAEX,CCFO,IAAMG,GAAe,IACfC,GAAY,kBAEZC,GAAY,oBAElB,IAAMC,GAAgB,sBAChBC,GAAgB,IAoBvBC,GAAM,IAAI,YACVC,GAAM,IAAI,YAGVC,GAAUC,GAAsB,CACpC,IAAIC,EAAI,GACR,QAASC,EAAI,EAAGA,EAAIF,EAAM,OAAQE,GAAK,MAAQD,GAAK,OAAO,aAAa,GAAGD,EAAM,SAASE,EAAGA,EAAI,KAAM,CAAC,EACxG,OAAOD,CACT,EACaE,GAAUH,GACrB,KAAKD,GAAOC,CAAK,CAAC,EAAE,QAAQ,MAAO,GAAG,EAAE,QAAQ,MAAO,GAAG,EAAE,QAAQ,MAAO,EAAE,EAClEI,GAAcH,GAAc,CACvC,IAAMI,EAAIJ,EAAE,QAAQ,KAAM,GAAG,EAAE,QAAQ,KAAM,GAAG,EAC1CK,EAAM,KAAKD,EAAI,IAAI,QAAQ,EAAKA,EAAE,OAAS,GAAM,CAAC,CAAC,EACzD,OAAO,WAAW,KAAKC,EAAMC,GAAOA,EAAG,WAAW,CAAC,CAAC,CACtD,EACMC,GAAOR,GAAsB,KAAKD,GAAOC,CAAK,CAAC,EAC/CS,GAAWR,GAAc,WAAW,KAAK,KAAKA,CAAC,EAAIM,GAAOA,EAAG,WAAW,CAAC,CAAC,EAEnEG,GAAa,IAAMP,GAAO,OAAO,gBAAgB,IAAI,WAAW,EAAE,CAAC,CAAC,EAE1E,SAASQ,GAAQC,EAAwB,CAC9C,IAAMC,EAAI,IAAI,gBAAgB,CAAE,EAAGD,EAAK,EAAG,EAAGA,EAAK,EAAG,EAAGA,EAAK,EAAG,EAAGA,EAAK,EAAG,EAAGA,EAAK,EAAG,EAAG,OAAOA,EAAK,CAAC,CAAE,CAAC,EAC1G,MAAO,WAAWE,EAAS,SAASD,CAAC,EACvC,CAqBO,IAAME,GAAiB,CAACC,EAAeC,EAAiBC,EAAYC,IAAoB,CAC7F,IAAMC,EAAQ,oCAAoC,KAAKJ,CAAK,EACtDK,EAAI,IAAI,gBAAgB,CAAE,KAAAH,CAAK,CAAC,EACtC,OAAIC,GAAQE,EAAE,IAAI,IAAK,OAAOF,CAAM,CAAC,EAC9B,GAAGC,EAAQ,KAAO,KAAK,MAAMJ,CAAK,SAASC,CAAO,IAAII,CAAC,EAChE,EAGA,eAAsBC,GAAcC,EAAkBC,EAAgBP,EAAiB,CACrF,IAAMQ,EAAQF,EAAK,mBAAmBG,GAAU,WAAWF,CAAM,CAAC,EAC5DG,EAAM,IAAI,WAAWF,EAAM,OAAO,EAAI,CAAa,EACnDG,EAAO,MAAM,OAAO,OAAO,UAAU,MAAOD,EAAK,OAAQ,GAAO,CAAC,YAAY,CAAC,EAC9EE,EAAO,IAAI,WACf,MAAM,OAAO,OAAO,WAClB,CAAE,KAAM,OAAQ,KAAM,UAAW,KAAMC,GAAWb,CAAO,EAAG,KAAMc,GAAI,OAAOC,EAAS,CAAE,EACxFJ,EACA,GACF,CACF,EACMK,EAAM,MAAM,OAAO,OAAO,UAAU,MAAOJ,EAAM,UAAW,GAAO,CAAC,UAAW,SAAS,CAAC,EACzFK,EAAI,IAAI,WAAW,MAAM,OAAO,OAAO,OAAO,UAAWL,CAAI,CAAC,EAC9DM,EAAO,QAASD,EAAE,CAAC,GAAK,EAAKA,EAAE,CAAC,GAAK,GAAK,EAAE,SAAS,EAAG,GAAG,EACjE,MAAO,CAAE,IAAAD,EAAK,KAAAE,CAAK,CACrB,CAGO,IAAMC,GAAN,KAAa,CAGlB,YACUH,EACAI,EACR,CAFQC,EAAA,WAAAL,GACAK,EAAA,UAAAD,GAJVC,EAAA,KAAQ,OAAO,GACfA,EAAA,KAAQ,WAAW,EAIhB,CAEH,MAAM,KAAKC,EAAwC,CACjD,IAAMC,EAAI,EAAE,KAAK,KACX,EAAI,OAAO,gBAAgB,IAAI,WAAW,EAAE,CAAC,EAC7CC,EAAK,IAAI,WACb,MAAM,OAAO,OAAO,QAClB,CAAE,KAAM,UAAW,GAAI,EAAG,eAAgBV,GAAI,OAAO,GAAG,KAAK,EAAE,IAAIS,CAAC,EAAE,CAAE,EACxE,KAAK,IACLT,GAAI,OAAO,KAAK,UAAUQ,CAAG,CAAC,CAChC,CACF,EACA,MAAO,CAAE,EAAAC,EAAG,EAAGE,GAAI,CAAC,EAAG,EAAGA,GAAID,CAAE,CAAE,CACpC,CAGA,MAAM,KAAKE,EAA6C,CACtD,GAAI,CAAC,OAAO,UAAUA,EAAE,CAAC,GAAKA,EAAE,GAAK,KAAK,SAAU,OAAO,KAC3D,IAAMC,EAAa,KAAK,KAAO,OAAS,SAAW,OACnD,GAAI,CACF,IAAMC,EAAK,MAAM,OAAO,OAAO,QAC7B,CAAE,KAAM,UAAW,GAAIC,GAAQH,EAAE,CAAC,EAAG,eAAgBZ,GAAI,OAAO,GAAGa,CAAI,IAAID,EAAE,CAAC,EAAE,CAAE,EAClF,KAAK,IACLG,GAAQH,EAAE,CAAC,CACb,EACA,YAAK,SAAWA,EAAE,EACX,KAAK,MAAMI,GAAI,OAAOF,CAAE,CAAC,CAClC,MAAQ,CACN,OAAO,IACT,CACF,CAGA,IAAI,UAAW,CACb,MAAO,CAAE,KAAM,KAAK,KAAM,SAAU,KAAK,QAAS,CACpD,CACA,QAAQG,EAAuC,CAC7C,KAAK,KAAOA,EAAE,KACd,KAAK,SAAWA,EAAE,QACpB,CACF,EAEaC,GAAYC,GACvB,CAAC,CAACA,GAAK,OAAOA,GAAM,UAAY,MAAOA,GAAK,MAAOA,GAAK,MAAOA,ECjFjE,IAAMC,GAAc,8BACdC,GAAO,EAEb,SAASC,IAA6B,CACpC,IAAMC,EAAI,IAAI,IACd,MAAO,CAAE,QAAUC,GAAMD,EAAE,IAAIC,CAAC,GAAK,KAAM,QAAS,CAACA,EAAGC,IAAG,CAAQF,EAAE,IAAIC,EAAGC,CAAC,GAAG,WAAaD,GAAG,CAAQD,EAAE,OAAOC,CAAC,EAAE,CACtH,CAEA,SAASE,IAA8B,CACrC,GAAI,CACF,GAAI,OAAO,aAAiB,IAAa,OAAO,YAClD,MAAQ,CAER,CACA,OAAOJ,GAAc,CACvB,CAEA,SAASK,IAA+B,CACtC,OAAQC,GAAQ,CACd,GAAI,OAAO,UAAc,IAAa,MAAM,IAAI,MAAM,yCAAyC,EAC/F,OAAO,IAAI,UAAUA,CAAG,CAC1B,CACF,CAEA,SAASC,GAAYC,EAA0C,CAC7D,GAAI,CAACA,EAAK,OAAO,KACjB,GAAI,CACF,IAAMC,EAAI,KAAK,MAAMD,CAAG,EAClBE,EAAKC,GAAe,OAAO,UAAUA,CAAC,GAAMA,GAAgB,EAMlE,OALIF,EAAE,IAAM,GACR,OAAOA,EAAE,GAAM,UAAY,CAAC,sBAAsB,KAAKA,EAAE,CAAC,GAC1D,OAAOA,EAAE,GAAM,UAAY,CAAC,wBAAwB,KAAKA,EAAE,CAAC,GAC5D,OAAOA,EAAE,GAAM,UAAY,CAAC,kBAAkB,KAAKA,EAAE,CAAC,GACtD,OAAOA,EAAE,GAAM,UAAY,CAAC,uBAAuB,KAAKA,EAAE,CAAC,GAC3D,CAACC,EAAED,EAAE,IAAI,GAAK,CAACC,EAAED,EAAE,QAAQ,GAAK,CAACC,EAAED,EAAE,QAAQ,EAAU,KACpDA,CACT,MAAQ,CACN,OAAO,IACT,CACF,CAEA,IAAMG,GAAN,KAAW,CAMT,YACUH,EACAI,EACAC,EACAC,EACAC,EACAC,EACR,CANQC,EAAA,SAAAT,GACAS,EAAA,cAAAL,GACAK,EAAA,eAAAJ,GACAI,EAAA,WAAAH,GACAG,EAAA,cAAAF,GACAE,EAAA,iBAAAD,GAXVC,EAAA,KAAQ,KAAwB,MAChCA,EAAA,KAAQ,UAAgC,MACxCA,EAAA,KAAQ,UAAU,IAAI,KACtBA,EAAA,KAAQ,YAAY,GASjB,CAGH,MAAMC,EAAgB,CACpB,KAAK,GAAKA,EACV,KAAK,KAAKA,CAAE,CACd,CAEQ,KAAKA,EAAgB,CAC3BA,EAAG,UAAYC,GAASC,GAA0B,KAAK,QAAQ,OAAOA,EAAG,IAAI,CAAC,CAAC,EAC/EF,EAAG,QAAU,KACbA,EAAG,QAAU,IAAM,CACb,KAAK,KAAOA,IAAI,KAAK,GAAK,MAC9B,KAAK,QAAQ,IAAI,MAAM,mCAAmC,CAAC,CAC7D,CACF,CAEQ,SAAU,CACZ,KAAK,YACT,KAAK,EAAI,CAAE,GAAG,KAAK,EAAG,GAAG,KAAK,OAAO,QAAS,EACzC,QAAQ,QAAQ,KAAK,QAAQ,QAAQ,KAAK,IAAK,KAAK,UAAU,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,IAAM,CAAC,CAAC,EAC7F,CAEQ,QAAQ,EAAU,CACxB,QAAWG,KAAK,KAAK,QAAQ,OAAO,EAClC,aAAaA,EAAE,KAAK,EACpBA,EAAE,OAAO,CAAC,EAEZ,KAAK,QAAQ,MAAM,CACrB,CAEA,MAAc,QAAS,CACrB,GAAI,KAAK,UAAW,MAAM,IAAI,MAAM,uCAAuC,EACvE,KAAK,IAAM,KAAK,GAAG,aAAevB,KACtC,KAAK,UAAL,KAAK,QAAY,KAAK,OAAO,EAAE,QAAQ,IAAO,KAAK,QAAU,IAAK,GAClE,MAAM,KAAK,QACb,CAEQ,QAAS,CAEf,IAAMoB,EAAK,KAAK,OAAOI,GAAe,KAAK,EAAE,EAAG,KAAK,EAAE,EAAG,OAAQ,KAAK,MAAM,KAAK,IAAI,EAAI,GAAI,EAAIC,GAAgB,EAAE,CAAC,EACrH,OAAO,IAAI,QAAc,CAACC,EAASC,IAAW,CAC5CP,EAAG,OAAS,IAAM,CAChB,KAAK,GAAKA,EACV,KAAK,KAAKA,CAAE,EACZM,EAAQ,CACV,EACAN,EAAG,QAAU,IAAMO,EAAO,IAAI,MAAM,8CAA8C,CAAC,EACnFP,EAAG,QAAU,IAAMO,EAAO,IAAI,MAAM,8CAA8C,CAAC,CACrF,CAAC,CACH,CAEA,MAAc,QAAQlB,EAAa,CACjC,IAAImB,EACJ,GAAI,CACFA,EAAI,KAAK,MAAMnB,CAAG,CACpB,MAAQ,CACN,MACF,CAEA,GADWmB,EAAqC,IACtC,SAAYA,EAAyB,MAC7C,OAAO,KAAK,QAAQ,IAAI,MAAM,6BAA8BA,EAAwB,KAAK,EAAE,CAAC,EAE9F,GAAI,CAACC,GAASD,CAAC,EAAG,OAClB,IAAME,EAAM,MAAM,KAAK,OAAO,KAAKF,CAAC,EACpC,GAAKE,EAEL,GADA,KAAK,QAAQ,EACTA,EAAI,IAAM,MAAO,CACnB,IAAMP,EAAI,KAAK,QAAQ,IAAIO,EAAI,EAAE,EACjC,GAAI,CAACP,EAAG,OACR,aAAaA,EAAE,KAAK,EACpB,KAAK,QAAQ,OAAOO,EAAI,EAAE,EACtBA,EAAI,MAAOP,EAAE,OAAO,OAAO,OAAO,IAAI,MAAMO,EAAI,MAAM,OAAO,EAAG,CAAE,KAAMA,EAAI,MAAM,IAAK,CAAC,CAAC,EACxFP,EAAE,QAAQO,EAAI,MAAM,CAC3B,MAAWA,EAAI,IAAM,UACnB,KAAK,KAAK,EACV,KAAK,QAAQ,IAAI,MAAM,8CAA8C,CAAC,EAE1E,CAEA,MAAM,KAAKC,EAAgBC,EAAmC,CAC5D,MAAM,KAAK,OAAO,EAClB,IAAMZ,EAAK,KAAK,GACVa,EAAK,GAAGF,CAAM,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,EAAG,EAAE,CAAC,GACvEG,EAAS,IAAI,QAAiB,CAACR,EAASC,IAAW,CACvD,IAAMQ,EAAQ,WAAW,IAAM,CACzB,KAAK,QAAQ,OAAOF,CAAE,GAAGN,EAAO,IAAI,MAAM,0DAA0D,CAAC,CAC3G,EAAG,KAAK,SAAS,EACjB,KAAK,QAAQ,IAAIM,EAAI,CAAE,QAAAP,EAAS,OAAAC,EAAQ,MAAAQ,CAAM,CAAC,CACjD,CAAC,EACD,OAAAf,EAAG,KAAK,KAAK,UAAU,MAAM,KAAK,OAAO,KAAK,CAAE,EAAG,MAAO,GAAAa,EAAI,OAAAF,EAAQ,OAAAC,CAAO,CAAuB,CAAC,CAAC,EACtG,KAAK,QAAQ,EACNE,CACT,CAEA,OAAQ,CACN,IAAMd,EAAK,KAAK,GAChB,KAAK,GAAK,KACVA,GAAI,MAAM,CACZ,CAEQ,MAAO,CACb,KAAK,UAAY,GACZ,QAAQ,QAAQ,KAAK,QAAQ,WAAW,KAAK,GAAG,CAAC,EAAE,MAAM,IAAM,CAAC,CAAC,EACtE,KAAK,MAAM,CACb,CAEA,MAAM,QAAS,CACb,GAAI,MAAK,UACT,IAAI,CACE,KAAK,IAAM,KAAK,GAAG,aAAepB,IACpC,KAAK,GAAG,KAAK,KAAK,UAAU,MAAM,KAAK,OAAO,KAAK,CAAE,EAAG,QAAS,OAAQ,eAAgB,CAAC,CAAC,CAAC,CAEhG,MAAQ,CAER,CACA,KAAK,KAAK,EACZ,CAEA,QAAuB,CACrB,OAAO,IAAI,MAAM,CAAC,EAAmB,CACnC,IAAK,CAACoC,EAAIC,IAAW,CACnB,GAAIA,IAAW,QAAS,MAAO,IAAM,KAAK,MAAM,EAChD,GAAIA,IAAW,SAAU,MAAO,IAAM,KAAK,OAAO,EAClD,GAAI,SAAOA,GAAW,UAAYA,IAAW,QAAUA,IAAW,UAClE,OAAQL,GAAoB,KAAK,KAAKK,EAAQL,GAAU,CAAC,CAAC,CAC5D,CACF,CAAC,CACH,CACF,EAOO,SAASM,GAAaC,EAA6C,CACxE,IAAMxB,EAAUwB,EAAK,UAAY,OAAYlC,GAAe,EAAKkC,EAAK,SAAWtC,GAAc,EACzFe,EAAMuB,EAAK,YAAcxC,GACzBkB,EAASsB,EAAK,QAAUjC,GAAc,EACtCkC,EAAQD,EAAK,OAASE,GACtBC,EAASH,EAAK,SAAW,OAAO,SAAa,IAAc,SAAS,OAAS,IACnF,GAAI,CAACG,EAAQ,OAAO,QAAQ,OAAO,IAAI,MAAM,qDAAqD,CAAC,EAEnG,IAAMC,EAAUC,GAAW,WAAW,EAChCC,EAAUC,GAAW,EACrBC,EAAS,KAAK,MAAM,KAAK,IAAI,EAAI,GAAI,EAAItB,GAE/C,OAAO,IAAI,QAAsB,CAACC,EAASC,IAAW,CACpD,GAAIY,EAAK,QAAQ,QAAS,OAAOZ,EAAO,IAAI,MAAM,WAAW,CAAC,EAC9D,IAAIP,EACJ,GAAI,CACFA,EAAKH,EAAOO,GAAegB,EAAOK,EAAS,OAAQE,CAAM,CAAC,CAC5D,OAASC,EAAG,CACV,OAAOrB,EAAOqB,CAAC,CACjB,CACA,IAAIlC,EAAwB,KACxBmC,EAAY,GACZC,EAAU,GACRC,EAAQH,GAAa,CACrBE,IACJA,EAAU,GACV,aAAaf,CAAK,EAClBf,EAAG,MAAM,EACTO,EAAOqB,CAAC,EACV,EACMb,EAAQ,WAAW,IAAMgB,EAAK,IAAI,MAAM,2CAA2C,CAAC,EAAG1B,GAAgB,GAAI,EACjHc,EAAK,QAAQ,iBAAiB,QAAS,IAAMY,EAAK,IAAI,MAAM,WAAW,CAAC,CAAC,EACzE/B,EAAG,QAAU,IAAM+B,EAAK,IAAI,MAAM,8CAA8C,CAAC,EACjF/B,EAAG,QAAU,IAAM+B,EAAK,IAAI,MAAM,2DAA2D,CAAC,EAC9F/B,EAAG,UAAYC,GAAQ,MAAOC,GAA0B,CACtD,GAAI4B,EAAS,OACb,IAAItB,EACJ,GAAI,CACFA,EAAI,KAAK,MAAM,OAAON,EAAG,IAAI,CAAC,CAChC,MAAQ,CACN,MACF,CACA,GAAKM,EAAiB,IAAM,SAAW,CAACd,EAAQ,CAC9CmC,EAAarB,EAAiB,EAC9B,IAAMwB,EAAI,MAAMC,GAAcV,EAASM,EAAWJ,CAAO,EACzD/B,EAAS,IAAIwC,GAAOF,EAAE,IAAK,MAAM,EACjCb,EAAK,OAAOa,EAAE,IAAI,EAClB,MACF,CACA,GAAI,CAACtC,GAAU,CAACe,GAASD,CAAC,EAAG,OAC7B,IAAME,EAAM,MAAMhB,EAAO,KAAKc,CAAC,EAC/B,GAAKE,EACL,GAAIA,EAAI,IAAM,QAAS,CACrBoB,EAAU,GACV,aAAaf,CAAK,EAClB,IAAMzB,EAAmB,CAAE,EAAG,EAAGmC,EAAY,EAAGL,EAAO,EAAGG,EAAQ,MAAM,EAAG,EAAGM,EAAW,GAAGnC,EAAO,SAAU,SAAU,KAAK,IAAI,CAAE,EAClI,MAAM,QAAQ,QAAQC,EAAQ,QAAQC,EAAK,KAAK,UAAUN,CAAC,CAAC,CAAC,EAAE,MAAM,IAAM,CAAC,CAAC,EAC7E,IAAM6C,EAAO,IAAI1C,GAAKH,EAAGI,EAAQC,EAASC,EAAKC,EAAQsB,EAAK,eAAiB,IAAO,EACpFgB,EAAK,MAAMnC,CAAE,EACbM,EAAQ6B,EAAK,OAAO,CAAC,CACvB,MAAWzB,EAAI,IAAM,SACnBqB,EAAK,IAAI,MAAM,kCAAkC,CAAC,CAEtD,CAAC,EACDZ,EAAK,OAAOiB,GAAQ,CAAE,EAAGC,GAAc,EAAGjB,EAAOK,EAAY,EAAGF,EAAQ,YAAY,EAAE,SAAS,EAAG,EAAGD,EAAQ,EAAGK,CAAO,CAAC,CAAC,CAC3H,CAAC,CACH,CAMA,eAAsBW,GAAenB,EAA8B,CAAC,EAAiC,CACnG,IAAMxB,EAAUwB,EAAK,UAAY,OAAYlC,GAAe,EAAKkC,EAAK,SAAWtC,GAAc,EACzFe,EAAMuB,EAAK,YAAcxC,GACzBW,EAAIF,GAAY,MAAM,QAAQ,QAAQO,EAAQ,QAAQC,CAAG,CAAC,EAAE,MAAM,IAAM,IAAI,CAAC,EACnF,GAAI,CAACN,EAAG,OAAO,KACf,GAAM,CAAE,IAAKiD,CAAI,EAAI,MAAMN,GAAcT,GAAW,QAAQlC,EAAE,CAAC,EAAGA,EAAE,EAAGA,EAAE,CAAC,EACpEI,EAAS,IAAIwC,GAAOK,EAAK,MAAM,EACrC,OAAA7C,EAAO,QAAQ,CAAE,KAAMJ,EAAE,KAAM,SAAUA,EAAE,QAAS,CAAC,EAC9C,IAAIG,GAAKH,EAAGI,EAAQC,EAASC,EAAKuB,EAAK,QAAUjC,GAAc,EAAGiC,EAAK,eAAiB,IAAO,EAAE,OAAO,CACjH,CAGA,eAAsBqB,GAAarB,EAA8D,CAAC,EAAG,CACnG,IAAMxB,EAAUwB,EAAK,UAAY,OAAYlC,GAAe,EAAKkC,EAAK,SAAWtC,GAAc,EAC/F,MAAM,QAAQ,QAAQc,EAAQ,WAAWwB,EAAK,YAAcxC,EAAW,CAAC,EAAE,MAAM,IAAM,CAAC,CAAC,CAC1F,CC7VO,IAAM8D,GAAiC,CAAC,EAAG,iBAAiB,EAoCnE,eAAsBC,GACpBC,EAAkF,CAAC,EACvB,CAC5D,GAAIA,EAAK,OAAQ,MAAO,CAAE,OAAQA,EAAK,OAAQ,OAAQ,QAAS,EAChE,IAAMC,EAAQ,MAAMC,GAAiBF,EAAK,UAAU,EACpD,GAAIC,EAAO,MAAO,CAAE,OAAQA,EAAM,OAAQ,OAAQA,EAAM,MAAO,EAC/D,GAAID,EAAK,eAAiB,GAAO,CAC/B,IAAMG,EAAW,MAAMC,GAAeJ,EAAK,SAAW,CAAC,CAAC,EACxD,GAAIG,EAAU,MAAO,CAAE,OAAQA,EAAU,OAAQ,SAAU,CAC7D,CACA,GAAI,CAACH,EAAK,QACR,MAAM,OAAO,OAAO,IAAI,MAAM,wCAAwC,EAAG,CAAE,KAAM,WAAY,CAAC,EAEhG,MAAO,CAAE,OAAQ,MAAMK,GAAaL,EAAK,OAAO,EAAG,OAAQ,SAAU,CACvE,CAMA,eAAsBM,GAAmBN,EAA4C,CACnF,GAAM,CAAE,OAAAO,EAAQ,OAAAC,CAAO,EAAI,MAAMT,GAAgBC,CAAI,EACjDQ,IAAW,WAAW,MAAMD,EAAO,sBAAsB,CAAC,CAAC,EAAE,MAAM,IAAM,CAAC,CAAC,EAC/E,GAAM,CAAE,UAAWE,CAAY,EAAI,MAAMF,EAAO,aAAa,CAAE,YAAa,EAAK,CAAC,EAC5EG,EAAI,MAAMV,EAAK,UAAUS,CAAW,EACpC,CAAE,UAAAE,CAAU,EAAI,MAAMJ,EAAO,gBAAgB,CACjD,WAAYG,EAAE,YAAcZ,GAC5B,MAAOY,EAAE,MACT,aAAc,SACd,KAAM,MAAM,KAAK,IAAI,YAAY,EAAE,OAAOA,EAAE,OAAO,CAAC,CACtD,CAAC,EACD,MAAO,CAAE,YAAAD,EAAa,UAAW,MAAM,KAAKE,CAAS,EAAG,MAAOD,EAAE,MAAO,OAAAF,EAAQ,OAAAD,CAAO,CACzF,CCzEA,IAAMK,GAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sFAQCC,GAAW,gCASjB,SAASC,GAAaC,EAA0BC,EAAsB,CAAC,EAAsB,CAClG,IAAMC,EAAO,OAAOF,GAAO,SAAW,SAAS,cAA2BA,CAAE,EAAIA,EAChF,GAAI,CAACE,EAAM,MAAM,IAAI,MAAM,4BAA4B,OAAOF,CAAE,CAAC,EAAE,EACnE,GAAI,CAAC,SAAS,eAAe,gBAAgB,EAAG,CAC9C,IAAMG,EAAQ,SAAS,cAAc,OAAO,EAC5CA,EAAM,GAAK,iBACXA,EAAM,YAAcN,GACpB,SAAS,KAAK,YAAYM,CAAK,CACjC,CACA,IAAMC,EAAI,SAAS,cAAc,QAAQ,EACzCA,EAAE,KAAO,SACTA,EAAE,UAAY,aACd,IAAMC,EAAO,SAAS,cAAc,MAAM,EAC1CA,EAAK,UAAY,WACjB,IAAMC,EAAM,SAAS,cAAc,KAAK,EACxCA,EAAI,IAAMR,GACVQ,EAAI,IAAM,GACVA,EAAI,MAAQ,GACZA,EAAI,OAAS,GACbD,EAAK,YAAYC,CAAG,EACpB,IAAMC,EAAQ,SAAS,cAAc,MAAM,EAC3CA,EAAM,UAAY,YAClBA,EAAM,YAAc,wBACpB,IAAMC,EAAMP,EAAK,WAAa,OAAY,0BAA4BA,EAAK,SAC3E,GAAIO,EAAK,CACP,IAAMC,EAAQ,SAAS,cAAc,OAAO,EAC5CA,EAAM,YAAcD,EACpBD,EAAM,YAAYE,CAAK,CACzB,CACA,OAAAL,EAAE,OAAOC,EAAME,CAAK,EAChBN,EAAK,SAASG,EAAE,iBAAiB,QAAS,IAAMH,EAAK,QAASG,CAAC,CAAC,EACpEF,EAAK,gBAAgBE,CAAC,EACfA,CACT","names":["src_exports","__export","BWALLETX_RDNS","LOGIN_PROTOCOL","LOGO_URL","RDNS_EXTENSION","RDNS_MOBILE","clearPairing","connectBwalletX","discoverBwalletX","findBwalletX","inOrder","pairBwalletX","renderButton","restorePairing","signInWithBwalletX","RDNS_EXTENSION","RDNS_MOBILE","BWALLETX_RDNS","discoverBwalletX","ms","resolve","done","finish","r","onAnnounce","e","d","rdns","cwi","findBwalletX","BufferCtor","CAN_USE_BUFFER","HEX_CHAR_TO_VALUE","i","_WORD_SIZE_BIGINT","_WORD_MASK","_MAX_SAFE_INTEGER_BIGINT","_MIN_SAFE_INTEGER_BIGINT","_MAX_IMULN_ARG","_MAX_NUMBER_CONSTRUCTOR_MAG_BIGINT","_MAX_NOMINAL_WORD_LENGTH","__magnitude","__sign","__nominalWordLength","_BigNumber_instances","_computedWordsArray_get","_initFromString_fn","_initFromHexString_fn","_initFromNonHexString_fn","_bigIntToStringInBase_fn","_parseBaseString_fn","_parseBaseWord_fn","_initializeState_fn","_finishInitialization_fn","assert_fn","initNumber_fn","initArray_fn","_getMinimalHex_fn","_toHexString_fn","toBaseString_fn","_BigNumber_static","_paddedZero_fn","_zeroPaddedChunk_fn","toArrayLikeGeneric_fn","_getSignedValue_fn","_setValueFromSigned_fn","_iuop_fn","_iop_fn","_uop_new_fn","normalizeNonNegativeBigInt_fn","_computeMod_fn","_bigNumberFromSigned_fn","_BigNumber","number","base","endian","__privateAdd","__publicField","__privateMethod","baseIsEndian","effectiveBase","effectiveEndian","__privateGet","val","newSign","__privateSet","computed","paddedWords","newWords","oldSign","newMagnitude","len","wordVal","num","left","right","dest","src","r","size","padding","hex","length","actualByteLength","reqLength","res","w","mag","bit","c","width","_a","Bw","v","m","sVal","a","b","wfw","Bb","wnb","_b","currentBase","exp","baseIsNegative","expIsOdd","bits","normalizedBits","hint","extended","_c","sOut","wfm","mode","positive","z","tV","nV","dV","mV","d","absM","absNV","numArg","absDivisor","remainderMag","p","uV","vV","pa","pb","q","t","ra","rb","rg","u","eg","BVal","ctx","eE","byteLength","hexStr","minChars","str","n","bytes","beBytes","sign","byte","magnitude","byteLen","j","high","low","result","strict","nSize","nWordCompact","isNegativeFromBit","bn","isActualNegative","mB","firstNonZeroIdx","nWordNum","requireMinimal","maxNumSize","e","out","arr","temp","originalNumberStr","start","numStr","byteHex","byteVal","tempMagnitude","currentSign","err","error","digits","currentNum","bigBase","numberStr","groupSize","groupBaseBigInt","currentPos","totalLen","firstChunkLen","chunkStr","charCode","digitVal","bitLen","msg","tempMag","remainder","zerosToPrepend","isLE","position","increment","_byte","op","isXor","newMag","targetNominalLength","opName","value","label","BigNumber","Mersenne","name","p","__publicField","BigNumber","tmp","requiredWords","num","r","rlen","cmp","input","out","K256","Mersenne","input","output","inputWords","inputNominalLength","outLen","tempOutputWords","i","currentOutputWordCount","finalOutputWords","prev","tempInputNewWords","currentInputNewWordCount","next","finalInputNewWords","num","currentWords","originalNominalLength","newNominalLength","tempWords","lo","w","ReductionContext","m","__publicField","prime","K256","val","msg","a","b","BigNumber","res","num","mod3","pow","q","s","one","nOne","lpow","zl","z","c","r","t","tmp","i","inv","result","base","bits","MontgomoryMethod","ReductionContext","m","__publicField","BigNumber","num","r","a","b","t","c","u","res","encoder","utf8Bytes","value","PURE_HEX_REGEX","assertValidHex","msg","normalizeHex","normalized","assert","expression","message","BaseHash","blockSize","outSize","hmacStrength","padLength","__publicField","_msg","_start","msg","enc","toArray","r","join32","len","bytes","k","res","i","lengthBytes","maxBits","totalBits","lenArray","b","appendUtf8CodeUnit","out","c","utf8StringToArray","hexStringToArray","assertValidHex","normalized","normalizeHex","numberArrayToByteArray","htonl","w","swapBytes32","toHex32","endian","zero8","word","BufferCtor","CAN_USE_BUFFER","HEX_DIGITS","HEX_BYTE_STRINGS","bytesToHex","data","NODE_CRYPTO","processLike","getBuiltinModule","crypto","toHashBytes","toHashKeyBytes","key","updateNativeOrFallback","native","fallback","digestNativeOrFallback","digestHexNativeOrFallback","createNodeHash","algorithm","createHash","createNodeHmac","keyBytes","createHmac","digestWithNodeHash","hash","digestWithNodeHmac","hmac","start","end","split32","m","rotr32","rotl32","sum32","a","SUM32_3","SUM32_4","d","SUM32_5","e","ch32","x","y","z","maj32","S0_256","x","rotr32","S1_256","G0_256","G1_256","r","rh","s","sh","f","j","y","z","K","Kh","RIPEMD160","BaseHash","__publicField","msg","start","A","B","C","D","E","Ah","Bh","Ch","Dh","Eh","T","sum32","rotl32","SUM32_4","SUM32_3","split32","toHex32","_h","_native","SHA256HMAC","key","__privateAdd","__publicField","k","toHashKeyBytes","__privateSet","createNodeHmac","__privateGet","HMAC","sha256Fast","msg","enc","updateNativeOrFallback","toHashBytes","digestNativeOrFallback","digestHexNativeOrFallback","_h","_native","SHA512HMAC","key","__privateAdd","__publicField","k","toHashKeyBytes","__privateSet","createNodeHmac","__privateGet","HMAC","sha512Fast","msg","enc","updateNativeOrFallback","toHashBytes","digestNativeOrFallback","digestHexNativeOrFallback","sha256Bytes","native","digestWithNodeHash","FastSHA256","ripemd160Bytes","msg","enc","digestWithNodeHash","sha256","msg","enc","sha256Bytes","hash256","msg","enc","sha256Bytes","hash160","first","native","ripemd160Bytes","RIPEMD160","sha256hmac","key","digestWithNodeHmac","SHA256HMAC","sha512hmac","SHA512HMAC","isBytes","a","anumber","n","abytes","b","lengths","lens","ahash","h","aexists","instance","checkFinished","aoutput","out","min","clean","arrays","arr","createView","toBytes","data","utf8ToBytes","str","utf8Bytes","Hash","createHasher","hashCons","hashC","msg","toBytes","tmp","U32_MASK64","_32n","fromBig","n","le","split","lst","len","Ah","Al","i","h","l","shrSH","_l","s","shrSL","rotrSH","rotrSL","rotrBH","rotrBL","add","Bh","Bl","add3L","Cl","add3H","low","Ch","add4L","Dl","add4H","Dh","add5L","El","add5H","Eh","HashMD","blockLen","outputLen","padOffset","isLE","__publicField","createView","data","aexists","abytes","view","buffer","pos","take","dataView","out","aoutput","clean","setBigUint64","oview","outLen","state","res","to","length","finished","destroyed","byteOffset","value","_u32_max","wh","wl","SHA256_IV","K256","SHA256_W","FastSHA256","A","B","C","D","E","F","G","H","offset","w15","w2","s0","G0_256","s1","G1_256","sum32","T1","SUM32_5","S1_256","ch32","T2","S0_256","maj32","sha256Fast","SHA512_IV","K512","SHA512_Kh","SHA512_Kl","SHA512_W_H","SHA512_W_L","FastSHA512","Fh","Fl","Gh","Gl","Hh","Hl","W15h","W15l","s0h","s0l","W2h","W2l","s1h","s1l","SUMl","SUMh","sigma1h","sigma1l","CHIh","CHIl","T1ll","T1h","T1l","sigma0h","sigma0l","MAJh","MAJl","T2l","sha512Fast","HMAC","hash","_key","ahash","key","pad","buf","oHash","iHash","hmac","hash","key","message","HMAC","swapBytes32","w","isLittleEndian","b","a","c","BufferCtor","CAN_USE_BUFFER","HEX_DIGITS","HEX_BYTE_STRINGS","i","toHex","msg","CAN_USE_BUFFER","BufferCtor","byte","toArray","msg","enc","item","hexToArray","base64ToArray","utf8ToArray","HEX_CHAR_TO_VALUE","i","hexToUint8Array","assertValidHex","normalized","CAN_USE_BUFFER","decoded","BufferCtor","out","o","hi","lo","normalizeBase64","padIndex","pad","base64CharacterValue","codePoint","index","s","result","bitBuffer","bitCount","c","v","str","utf8Bytes","toBase64","byteArray","base64Chars","result","i","byte1","byte2","byte3","encoded1","encoded2","encoded3","encoded4","base58chars","fromBase58","str","match","lz","psz","size","acc","j","x","lastValue","value","toBase58","bin","base58Map","byte","carry","quotient","remainder","toBase58Check","prefix","hash","hash256","fromBase58Check","enc","prefixLength","data","check","index","toHex","OverflowInt64","BigNumber","OverflowUint64","globalCurve","normalizedMod4","value","carry","mod4","jsfDigit","otherMod4","mod8","nextJsfCarry","digit","_Curve_instances","_resolveEndomorphismBasis_fn","_Curve","__privateAdd","__publicField","conf","BigNumber","ReductionContext","Point","expression","message","num","w","bits","naf","ws","k","i","z","mod","k1","k2","jsf","d1","d2","m14","m24","u1","u2","obj","name","computer","key","bytes","toArray","beta","lambda","__privateMethod","betas","requireCoordinates","gMulX","gXRedMulBeta","lambdas","red","MontgomoryMethod","tinv","ntinv","l1","l2","aprxSqrt","u","v","x1","y1","x2","y2","a0","b0","a1","b1","a2","b2","prevR","r","x","q","y","len1","basis","v1","v2","c1","c2","p1","p2","q1","q2","point","ax","rhs","vec","Curve","BasePoint","type","__publicField","Curve","JacobianPoint","_JacobianPoint","BasePoint","x","y","z","__publicField","BigNumber","Point","zinv","zinv2","ax","ay","p","pz2","z2","u1","u2","s1","s2","h","r","h2","h3","v","nx","ny","nz","pow","xx","yy","yyyy","s","m","t","yyyy8","a","b","d","e","f","c8","z3","pz3","zs","rx","xc","ctSwap","swap","a","b","mask","swapX","swapY","swapZ","BI_ZERO","BI_ONE","BI_TWO","BI_THREE","BI_FOUR","BI_EIGHT","P_BIGINT","N_BIGINT","MASK_256","red","x","hi","biMod","biModSub","biModMul","biModAdd","biModInv","lm","hm","low","high","r","biModSqr","biModPow","base","exp","result","P_PLUS1_DIV4","biModSqrt","toBigInt","BigNumber","toHex","GX_BIGINT","GY_BIGINT","WNAF_TABLE_CACHE","jpDouble","P","X1","Y1","Z1","Y1sq","S","M","X3","Y3","Z3","jpAdd","Q","Z1Z1","Z2Z2","U1","U2","S1","S2","H","HH","HHH","V","jpNeg","wnafTable","window","P0","key","cached","table","point","doubled","i","wnafDigits","scalar","digits","windowSize","halfWindow","remaining","digit","scalarMultiplyWNAF","k","wnaf","di","idx","addend","modN","modMulN","modInvN","q","_Point_instances","_getBeta_fn","_prepareWnafWindows_fn","_prepareWnafRepresentations_fn","_addWnafStep_fn","_wnafMulAdd_fn","_endoWnafMulAdd_fn","_getNAFPoints_fn","_Point","BasePoint","y","isRed","__privateAdd","__publicField","p","bytes","res","str","toArray","odd","xBigInt","y2","yBig","xBN","yBN","obj","pre","obj2point","pt","xBig","lhs","rhs","compact","enc","len","P1","Q1","R","zInv","zInv2","xRes","yRes","X","Y","isNeg","kAbs","kBig","Px","Py","R0","R1","bits","bitChar","bit","k1","p2","k2","points","coeffs","__privateMethod","_precompute","negate","JacobianPoint","context","wndWidth","wnd","naf","currentMax","comb","aY","bY","index","jsf","max","position","ja","jb","start","tmp","doubles","zero","step","power","acc","j","beta","curve","endoMul","basePoint","defW","_a","nafPoints","accumulator","one","two","value","jacobianResult","scratchLength","npoints","ncoeffs","split","dbl","Point","PublicKey","_PublicKey","Point","key","p","Curve","str","bytes","x","y","isRed","priv","msg","sig","enc","msgHash","BigNumber","sha256","verify","pkh","hash160","toHex","prefix","toBase58Check","privateKey","invoiceNumber","cacheSharedSecret","retrieveCachedSharedSecret","sharedSecret","retrieved","invoiceNumberBin","toArray","hmac","sha256hmac","point","finalPoint","signature","data","compactByte","r","Signature","Signature","_Signature","r","s","__publicField","data","enc","getLength","buf","p","initial","Position","toArray","rlen","slen","BigNumber","compactByte","msg","key","msgHash","sha256","verify","constructLength","arr","len","rmPadding","i","backHalf","res","toHex","toBase64","recovery","compressed","e","isYOdd","isSecondKey","curve","Curve","n","G","x","R","Point","eNeg","rInv","srInv","eInvrInv","Q","pubKey","PublicKey","pubkey","Qprime","DRBG","entropy","nonce","__publicField","entropyBytes","toArray","nonceBytes","seedMaterial","i","SHA256HMAC","seed","kmac","len","temp","res","toHex","truncateToN","msg","truncOnly","curve","Curve","delta","bnToBigInt","bn","bytes","x","byte","ns1","halfN","N_BIGINT","selectK","customK","iter","drbg","selected","BigNumber","retryOrRejectFixedK","fixedK","message","signatureFromK","kBN","msgBig","keyBig","forceLowS","R","rBig","modN","kInv","modInvN","sum","modMulN","sBig","Signature","sign","key","nBitLength","bkey","nonce","DRBG","signature","verify","sig","hash","publicKey","r","s","z","BI_ZERO","w","u1","u2","RG","scalarMultiplyWNAF","GX_BIGINT","GY_BIGINT","RQ","jpAdd","zInv","biModInv","zInv2","biModMul","xAff","Rand","__publicField","noRand","n","nodeCrypto","obj","arr","len","ayn","Random","Random_default","MAX_SHAMIR_SHARES","MAX_POINT_STRING_LENGTH","BASE58_FIELD","assertPolynomialThreshold","threshold","pointCount","minimum","PointInFiniteField","_PointInFiniteField","x","y","__publicField","P","Curve","toBase58","str","extra","point","BigNumber","fromBase58","Polynomial","_Polynomial","points","resolvedThreshold","key","i","randomX","Random_default","randomY","seenXCoordinates","index","xCoordinate","normalizedX","term","j","xj","xi","numerator","denominatorInverse","fraction","MAX_BACKUP_SHARE_LENGTH","BACKUP_SHARE_FIELD","BACKUP_SHARE_THRESHOLD","BACKUP_SHARE_INTEGRITY","assertKeyShareCollection","points","threshold","integrity","MAX_SHAMIR_SHARES","KeyShares","_KeyShares","__publicField","shares","idx","share","shareParts","x","y","t","i","tInt","PointInFiniteField","result","index","point","serialized","PrivateKey","_PrivateKey","BigNumber","Random_default","str","base","wif","prefixLength","decoded","fromBase58Check","number","endian","modN","check","curve","Curve","msg","enc","forceLowS","customK","msgHash","sha256","sign","sig","verify","p","PublicKey","prefix","toBase58Check","padding","key","publicKey","invoiceNumber","cacheSharedSecret","retrieveCachedSharedSecret","sharedSecret","retrieved","invoiceNumberBin","toArray","hmac","sha256hmac","totalShares","poly","Polynomial","usedXCoordinates","seed","attempts","counter","h","sha512hmac","keyShares","ownedPoints","P","j","privateKey","inOrder","handle","onError","queue","frame","e","PAIR_VERSION","PAIR_INFO","PAIR_HOST","DEFAULT_RELAY","QR_LIFETIME_S","enc","dec","binary","bytes","s","i","b64url","fromB64url","t","bin","ch","b64","fromB64","newChannel","pairUrl","link","q","PAIR_HOST","relaySocketUrl","relay","channel","role","expiry","local","q","deriveSession","mine","theirs","point","PublicKey","ikm","base","bits","fromB64url","enc","PAIR_INFO","key","h","code","Sealer","me","__publicField","msg","s","ct","b64","f","from","pt","fromB64","dec","c","isSealed","x","DEFAULT_KEY","OPEN","memoryStorage","m","k","v","defaultStorage","defaultSocket","url","parseStored","raw","p","n","x","Link","sealer","storage","key","socket","timeoutMs","__publicField","ws","inOrder","ev","w","relaySocketUrl","QR_LIFETIME_S","resolve","reject","f","isSealed","msg","action","params","id","result","timer","_t","method","pairBwalletX","opts","relay","DEFAULT_RELAY","origin","siteKey","PrivateKey","channel","newChannel","expiry","e","walletKey","settled","fail","s","deriveSession","Sealer","link","pairUrl","PAIR_VERSION","restorePairing","aes","clearPairing","LOGIN_PROTOCOL","connectBwalletX","opts","found","discoverBwalletX","restored","restorePairing","pairBwalletX","signInWithBwalletX","wallet","method","identityKey","c","signature","CSS","LOGO_URL","renderButton","el","opts","host","style","b","mark","img","label","sub","small"]}