UNPKG

@bitgo/secp256k1

Version:

Low-level cryptographic methods used in BitGo packages for the secp256k1 curve

224 lines 27.5 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.bip32utils = exports.musig = exports.BIP32Factory = exports.bip32 = exports.ECPairFactory = exports.ECPair = exports.ecc = void 0; const ecpair_1 = require("ecpair"); Object.defineProperty(exports, "ECPairFactory", { enumerable: true, get: function () { return ecpair_1.ECPairFactory; } }); const necc = __importStar(require("@noble/secp256k1")); const bip32_1 = require("bip32"); Object.defineProperty(exports, "BIP32Factory", { enumerable: true, get: function () { return bip32_1.BIP32Factory; } }); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore base_crypto is exported as a subPath export, ignoring since compiler complains about importing like this const baseCrypto = __importStar(require("@brandonblack/musig/base_crypto")); const musig_1 = require("@brandonblack/musig"); const createHash = require('create-hash'); const createHmac = require('create-hmac'); necc.utils.sha256Sync = (...messages) => { const sha256 = createHash('sha256'); for (const message of messages) sha256.update(message); return sha256.digest(); }; necc.utils.hmacSha256Sync = (key, ...messages) => { const hash = createHmac('sha256', Buffer.from(key)); messages.forEach((m) => hash.update(m)); return Uint8Array.from(hash.digest()); }; const defaultTrue = (param) => param !== false; function throwToNull(fn) { try { return fn(); } catch (e) { return null; } } function isPoint(p, xOnly) { if ((p.length === 32) !== xOnly) return false; try { return !!necc.Point.fromHex(p); } catch (e) { return false; } } function toBigInt(b) { const buff = Buffer.from(b); if (buff.length !== 32) { throw new Error('Invalid size ${buff.length}'); } return BigInt(`0x${buff.toString('hex')}`); } const ecc = { isPoint: (p) => isPoint(p, false), isPrivate: (d) => necc.utils.isValidPrivateKey(d), isXOnlyPoint: (p) => isPoint(p, true), xOnlyPointAddTweak: (p, tweak) => throwToNull(() => { const P = necc.utils.pointAddScalar(p, tweak, true); const parity = P[0] % 2 === 1 ? 1 : 0; return { parity, xOnlyPubkey: P.slice(1) }; }), pointFromScalar: (sk, compressed) => throwToNull(() => necc.getPublicKey(sk, defaultTrue(compressed))), pointCompress: (p, compressed) => { return necc.Point.fromHex(p).toRawBytes(defaultTrue(compressed)); }, pointMultiply: (a, tweak, compressed) => throwToNull(() => necc.utils.pointMultiply(a, tweak, defaultTrue(compressed))), pointAdd: (a, b, compressed) => throwToNull(() => { const A = necc.Point.fromHex(a); const B = necc.Point.fromHex(b); return A.add(B).toRawBytes(defaultTrue(compressed)); }), pointAddScalar: (p, tweak, compressed) => throwToNull(() => necc.utils.pointAddScalar(p, tweak, defaultTrue(compressed))), privateAdd: (d, tweak) => throwToNull(() => { const res = necc.utils.privateAdd(d, tweak); // tiny-secp256k1 returns null rather than allowing a 0 private key to be returned // ECPair.testEcc() requires that behavior. if (res?.every((i) => i === 0)) return null; return res; }), privateNegate: (d) => necc.utils.privateNegate(d), sign: (h, d, e) => { return necc.signSync(h, d, { der: false, extraEntropy: e }); }, signSchnorr: (h, d, e = Buffer.alloc(32, 0x00)) => { return necc.schnorr.signSync(h, d, e); }, verify: (h, Q, signature, strict) => { return necc.verify(signature, h, Q, { strict }); }, recoverPublicKey: (h, signature, recovery, compressed) => { // Message hash must be exactly 32 bytes if (h.length !== 32) { return null; } // Signature must be exactly 64 bytes (r and s components) if (signature.length !== 64) { return null; } // Recovery value must be 0 or 1 if (recovery !== 0 && recovery !== 1) { return null; } return throwToNull(() => necc.recoverPublicKey(h, signature, recovery, defaultTrue(compressed))); }, verifySchnorr: (h, Q, signature) => { return necc.schnorr.verifySync(signature, h, Q); }, }; exports.ecc = ecc; const crypto = { ...baseCrypto, pointMultiplyUnsafe(p, a, compress) { try { const product = necc.Point.fromHex(p).multiplyAndAddUnsafe(necc.Point.ZERO, toBigInt(a), BigInt(1)); if (!product) return null; return product.toRawBytes(compress); } catch { return null; } }, pointMultiplyAndAddUnsafe(p1, a, p2, compress) { try { const p2p = necc.Point.fromHex(p2); const p = necc.Point.fromHex(p1).multiplyAndAddUnsafe(p2p, toBigInt(a), BigInt(1)); if (!p) return null; return p.toRawBytes(compress); } catch { return null; } }, pointAdd(a, b, compress) { try { return necc.Point.fromHex(a).add(necc.Point.fromHex(b)).toRawBytes(compress); } catch { return null; } }, pointAddTweak(p, tweak, compress) { try { const P = necc.Point.fromHex(p); const t = baseCrypto.readSecret(tweak); const Q = necc.Point.BASE.multiplyAndAddUnsafe(P, t, BigInt(1)); if (!Q) throw new Error('Tweaked point at infinity'); return Q.toRawBytes(compress); } catch { return null; } }, pointCompress(p, compress = true) { return necc.Point.fromHex(p).toRawBytes(compress); }, liftX(p) { try { return necc.Point.fromHex(p).toRawBytes(false); } catch { return null; } }, getPublicKey(s, compress) { try { return necc.getPublicKey(s, compress); } catch { return null; } }, taggedHash: necc.utils.taggedHashSync, sha256(...messages) { const sha256 = createHash('sha256'); for (const message of messages) sha256.update(message); return sha256.digest(); }, }; const ECPair = (0, ecpair_1.ECPairFactory)(ecc); exports.ECPair = ECPair; const bip32 = (0, bip32_1.BIP32Factory)(ecc); exports.bip32 = bip32; const musig = (0, musig_1.MuSigFactory)(crypto); exports.musig = musig; const bip32utils = __importStar(require("./bip32utils")); exports.bip32utils = bip32utils; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsbUNBQW1FO0FBNk1qRSw4RkE3TWtCLHNCQUFhLE9BNk1sQjtBQTVNZix1REFBeUM7QUFDekMsaUNBQStEO0FBK003RCw2RkEvTWlCLG9CQUFZLE9BK01qQjtBQTlNZCw2REFBNkQ7QUFDN0Qsc0hBQXNIO0FBQ3RILDRFQUE4RDtBQUM5RCwrQ0FBMEQ7QUFFMUQsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBQzFDLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUUxQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxDQUFDLEdBQUcsUUFBc0IsRUFBYyxFQUFFO0lBQ2hFLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNwQyxLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVE7UUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZELE9BQU8sTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBQ3pCLENBQUMsQ0FBQztBQUVGLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxHQUFHLENBQUMsR0FBZSxFQUFFLEdBQUcsUUFBc0IsRUFBYyxFQUFFO0lBQ3JGLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3BELFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4QyxPQUFPLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFB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QUFNLEtBQUssR0FBVSxJQUFBLG9CQUFZLEVBQUMsTUFBTSxDQUFDLENBQUM7QUFjeEMsc0JBQUs7QUFaUCx5REFBMkM7QUFjekMsZ0NBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFQ1BhaXJBUEksIEVDUGFpckZhY3RvcnksIEVDUGFpckludGVyZmFjZSB9IGZyb20gJ2VjcGFpcic7XG5pbXBvcnQgKiBhcyBuZWNjIGZyb20gJ0Bub2JsZS9zZWNwMjU2azEnO1xuaW1wb3J0IHsgQklQMzJBUEksIEJJUDMyRmFjdG9yeSwgQklQMzJJbnRlcmZhY2UgfSBmcm9tICdiaXAzMic7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4vLyBAdHMtaWdub3JlIGJhc2VfY3J5cHRvIGlzIGV4cG9ydGVkIGFzIGEgc3ViUGF0aCBleHBvcnQsIGlnbm9yaW5nIHNpbmNlIGNvbXBpbGVyIGNvbXBsYWlucyBhYm91dCBpbXBvcnRpbmcgbGlrZSB0aGlzXG5pbXBvcnQgKiBhcyBiYXNlQ3J5cHRvIGZyb20gJ0BicmFuZG9uYmxhY2svbXVzaWcvYmFzZV9jcnlwdG8nO1xuaW1wb3J0IHsgTXVTaWcsIE11U2lnRmFjdG9yeSB9IGZyb20gJ0BicmFuZG9uYmxhY2svbXVzaWcnO1xuXG5jb25zdCBjcmVhdGVIYXNoID0gcmVxdWlyZSgnY3JlYXRlLWhhc2gnKTtcbmNvbnN0IGNyZWF0ZUhtYWMgPSByZXF1aXJlKCdjcmVhdGUtaG1hYycpO1xuXG5uZWNjLnV0aWxzLnNoYTI1NlN5bmMgPSAoLi4ubWVzc2FnZXM6IFVpbnQ4QXJyYXlbXSk6IFVpbnQ4QXJyYXkgPT4ge1xuICBjb25zdCBzaGEyNTYgPSBjcmVhdGVIYXNoKCdzaGEyNTYnKTtcbiAgZm9yIChjb25zdCBtZXNzYWdlIG9mIG1lc3NhZ2VzKSBzaGEyNTYudXBkYXRlKG1lc3NhZ2UpO1xuICByZXR1cm4gc2hhMjU2LmRpZ2VzdCgpO1xufTtcblxubmVjYy51dGlscy5obWFjU2hhMjU2U3luYyA9IChrZXk6IFVpbnQ4QXJyYXksIC4uLm1lc3NhZ2VzOiBVaW50OEFycmF5W10pOiBVaW50OEFycmF5ID0+IHtcbiAgY29uc3QgaGFzaCA9IGNyZWF0ZUhtYWMoJ3NoYTI1NicsIEJ1ZmZlci5mcm9tKGtleSkpO1xuICBtZXNzYWdlcy5mb3JFYWNoKChtKSA9PiBoYXNoLnVwZGF0ZShtKSk7XG4gIHJldHVybiBVaW50OEFycmF5LmZyb20oaGFzaC5kaWdlc3QoKSk7XG59O1xuXG5jb25zdCBkZWZhdWx0VHJ1ZSA9IChwYXJhbT86IGJvb2xlYW4pOiBib29sZWFuID0+IHBhcmFtICE9PSBmYWxzZTtcblxuZnVuY3Rpb24gdGhyb3dUb051bGw8VHlwZT4oZm46ICgpID0+IFR5cGUpOiBUeXBlIHwgbnVsbCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1BvaW50KHA6IFVpbnQ4QXJyYXksIHhPbmx5OiBib29sZWFuKTogYm9vbGVhbiB7XG4gIGlmICgocC5sZW5ndGggPT09IDMyKSAhPT0geE9ubHkpIHJldHVybiBmYWxzZTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gISFuZWNjLlBvaW50LmZyb21IZXgocCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9CaWdJbnQoYjogVWludDhBcnJheSB8IEJ1ZmZlcik6IGJpZ2ludCB7XG4gIGNvbnN0IGJ1ZmYgPSBCdWZmZXIuZnJvbShiKTtcbiAgaWYgKGJ1ZmYubGVuZ3RoICE9PSAzMikge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzaXplICR7YnVmZi5sZW5ndGh9Jyk7XG4gIH1cbiAgcmV0dXJuIEJpZ0ludChgMHgke2J1ZmYudG9TdHJpbmcoJ2hleCcpfWApO1xufVxuXG5jb25zdCBlY2MgPSB7XG4gIGlzUG9pbnQ6IChwOiBVaW50OEFycmF5KTogYm9vbGVhbiA9PiBpc1BvaW50KHAsIGZhbHNlKSxcbiAgaXNQcml2YXRlOiAoZDogVWludDhBcnJheSk6IGJvb2xlYW4gPT4gbmVjYy51dGlscy5pc1ZhbGlkUHJpdmF0ZUtleShkKSxcbiAgaXNYT25seVBvaW50OiAocDogVWludDhBcnJheSk6IGJvb2xlYW4gPT4gaXNQb2ludChwLCB0cnVlKSxcblxuICB4T25seVBvaW50QWRkVHdlYWs6IChwOiBVaW50OEFycmF5LCB0d2VhazogVWludDhBcnJheSk6IHsgcGFyaXR5OiAwIHwgMTsgeE9ubHlQdWJrZXk6IFVpbnQ4QXJyYXkgfSB8IG51bGwgPT5cbiAgICB0aHJvd1RvTnVsbCgoKSA9PiB7XG4gICAgICBjb25zdCBQID0gbmVjYy51dGlscy5wb2ludEFkZFNjYWxhcihwLCB0d2VhaywgdHJ1ZSk7XG4gICAgICBjb25zdCBwYXJpdHkgPSBQWzBdICUgMiA9PT0gMSA/IDEgOiAwO1xuICAgICAgcmV0dXJuIHsgcGFyaXR5LCB4T25seVB1YmtleTogUC5zbGljZSgxKSB9O1xuICAgIH0pLFxuXG4gIHBvaW50RnJvbVNjYWxhcjogKHNrOiBVaW50OEFycmF5LCBjb21wcmVzc2VkPzogYm9vbGVhbik6IFVpbnQ4QXJyYXkgfCBudWxsID0+XG4gICAgdGhyb3dUb051bGwoKCkgPT4gbmVjYy5nZXRQdWJsaWNLZXkoc2ssIGRlZmF1bHRUcnVlKGNvbXByZXNzZWQpKSksXG5cbiAgcG9pbnRDb21wcmVzczogKHA6IFVpbnQ4QXJyYXksIGNvbXByZXNzZWQ/OiBib29sZWFuKTogVWludDhBcnJheSA9PiB7XG4gICAgcmV0dXJuIG5lY2MuUG9pbnQuZnJvbUhleChwKS50b1Jhd0J5dGVzKGRlZmF1bHRUcnVlKGNvbXByZXNzZWQpKTtcbiAgfSxcblxuICBwb2ludE11bHRpcGx5OiAoYTogVWludDhBcnJheSwgdHdlYWs6IFVpbnQ4QXJyYXksIGNvbXByZXNzZWQ/OiBib29sZWFuKTogVWludDhBcnJheSB8IG51bGwgPT5cbiAgICB0aHJvd1RvTnVsbCgoKSA9PiBuZWNjLnV0aWxzLnBvaW50TXVsdGlwbHkoYSwgdHdlYWssIGRlZmF1bHRUcnVlKGNvbXByZXNzZWQpKSksXG5cbiAgcG9pbnRBZGQ6IChhOiBVaW50OEFycmF5LCBiOiBVaW50OEFycmF5LCBjb21wcmVzc2VkPzogYm9vbGVhbik6IFVpbnQ4QXJyYXkgfCBudWxsID0+XG4gICAgdGhyb3dUb051bGwoKCkgPT4ge1xuICAgICAgY29uc3QgQSA9IG5lY2MuUG9pbnQuZnJvbUhleChhKTtcbiAgICAgIGNvbnN0IEIgPSBuZWNjLlBvaW50LmZyb21IZXgoYik7XG4gICAgICByZXR1cm4gQS5hZGQoQikudG9SYXdCeXRlcyhkZWZhdWx0VHJ1ZShjb21wcmVzc2VkKSk7XG4gICAgfSksXG5cbiAgcG9pbnRBZGRTY2FsYXI6IChwOiBVaW50OEFycmF5LCB0d2VhazogVWludDhBcnJheSwgY29tcHJlc3NlZD86IGJvb2xlYW4pOiBVaW50OEFycmF5IHwgbnVsbCA9PlxuICAgIHRocm93VG9OdWxsKCgpID0+IG5lY2MudXRpbHMucG9pbnRBZGRTY2FsYXIocCwgdHdlYWssIGRlZmF1bHRUcnVlKGNvbXByZXNzZWQpKSksXG5cbiAgcHJpdmF0ZUFkZDogKGQ6IFVpbnQ4QXJyYXksIHR3ZWFrOiBVaW50OEFycmF5KTogVWludDhBcnJheSB8IG51bGwgPT5cbiAgICB0aHJvd1RvTnVsbCgoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBuZWNjLnV0aWxzLnByaXZhdGVBZGQoZCwgdHdlYWspO1xuICAgICAgLy8gdGlueS1zZWNwMjU2azEgcmV0dXJucyBudWxsIHJhdGhlciB0aGFuIGFsbG93aW5nIGEgMCBwcml2YXRlIGtleSB0byBiZSByZXR1cm5lZFxuICAgICAgLy8gRUNQYWlyLnRlc3RFY2MoKSByZXF1aXJlcyB0aGF0IGJlaGF2aW9yLlxuICAgICAgaWYgKHJlcz8uZXZlcnkoKGkpID0+IGkgPT09IDApKSByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfSksXG5cbiAgcHJpdmF0ZU5lZ2F0ZTogKGQ6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5ID0+IG5lY2MudXRpbHMucHJpdmF0ZU5lZ2F0ZShkKSxcblxuICBzaWduOiAoaDogVWludDhBcnJheSwgZDogVWludDhBcnJheSwgZT86IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5ID0+IHtcbiAgICByZXR1cm4gbmVjYy5zaWduU3luYyhoLCBkLCB7IGRlcjogZmFsc2UsIGV4dHJhRW50cm9weTogZSB9KTtcbiAgfSxcblxuICBzaWduU2Nobm9ycjogKGg6IFVpbnQ4QXJyYXksIGQ6IFVpbnQ4QXJyYXksIGU6IFVpbnQ4QXJyYXkgPSBCdWZmZXIuYWxsb2MoMzIsIDB4MDApKTogVWludDhBcnJheSA9PiB7XG4gICAgcmV0dXJuIG5lY2Muc2Nobm9yci5zaWduU3luYyhoLCBkLCBlKTtcbiAgfSxcblxuICB2ZXJpZnk6IChoOiBVaW50OEFycmF5LCBROiBVaW50OEFycmF5LCBzaWduYXR1cmU6IFVpbnQ4QXJyYXksIHN0cmljdD86IGJvb2xlYW4pOiBib29sZWFuID0+IHtcbiAgICByZXR1cm4gbmVjYy52ZXJpZnkoc2lnbmF0dXJlLCBoLCBRLCB7IHN0cmljdCB9KTtcbiAgfSxcblxuICByZWNvdmVyUHVibGljS2V5OiAoXG4gICAgaDogVWludDhBcnJheSxcbiAgICBzaWduYXR1cmU6IFVpbnQ4QXJyYXksXG4gICAgcmVjb3Zlcnk6IG51bWJlcixcbiAgICBjb21wcmVzc2VkPzogYm9vbGVhblxuICApOiBVaW50OEFycmF5IHwgbnVsbCA9PiB7XG4gICAgLy8gTWVzc2FnZSBoYXNoIG11c3QgYmUgZXhhY3RseSAzMiBieXRlc1xuICAgIGlmIChoLmxlbmd0aCAhPT0gMzIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvLyBTaWduYXR1cmUgbXVzdCBiZSBleGFjdGx5IDY0IGJ5dGVzIChyIGFuZCBzIGNvbXBvbmVudHMpXG4gICAgaWYgKHNpZ25hdHVyZS5sZW5ndGggIT09IDY0KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLy8gUmVjb3ZlcnkgdmFsdWUgbXVzdCBiZSAwIG9yIDFcbiAgICBpZiAocmVjb3ZlcnkgIT09IDAgJiYgcmVjb3ZlcnkgIT09IDEpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gdGhyb3dUb051bGwoKCkgPT4gbmVjYy5yZWNvdmVyUHVibGljS2V5KGgsIHNpZ25hdHVyZSwgcmVjb3ZlcnksIGRlZmF1bHRUcnVlKGNvbXByZXNzZWQpKSk7XG4gIH0sXG5cbiAgdmVyaWZ5U2Nobm9ycjogKGg6IFVpbnQ4QXJyYXksIFE6IFVpbnQ4QXJyYXksIHNpZ25hdHVyZTogVWludDhBcnJheSk6IGJvb2xlYW4gPT4ge1xuICAgIHJldHVybiBuZWNjLnNjaG5vcnIudmVyaWZ5U3luYyhzaWduYXR1cmUsIGgsIFEpO1xuICB9LFxufTtcblxuY29uc3QgY3J5cHRvID0ge1xuICAuLi5iYXNlQ3J5cHRvLFxuICBwb2ludE11bHRpcGx5VW5zYWZlKHA6IFVpbnQ4QXJyYXksIGE6IFVpbnQ4QXJyYXksIGNvbXByZXNzOiBib29sZWFuKTogVWludDhBcnJheSB8IG51bGwge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwcm9kdWN0ID0gbmVjYy5Qb2ludC5mcm9tSGV4KHApLm11bHRpcGx5QW5kQWRkVW5zYWZlKG5lY2MuUG9pbnQuWkVSTywgdG9CaWdJbnQoYSksIEJpZ0ludCgxKSk7XG4gICAgICBpZiAoIXByb2R1Y3QpIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIHByb2R1Y3QudG9SYXdCeXRlcyhjb21wcmVzcyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0sXG4gIHBvaW50TXVsdGlwbHlBbmRBZGRVbnNhZmUocDE6IFVpbnQ4QXJyYXksIGE6IFVpbnQ4QXJyYXksIHAyOiBVaW50OEFycmF5LCBjb21wcmVzczogYm9vbGVhbik6IFVpbnQ4QXJyYXkgfCBudWxsIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcDJwID0gbmVjYy5Qb2ludC5mcm9tSGV4KHAyKTtcbiAgICAgIGNvbnN0IHAgPSBuZWNjLlBvaW50LmZyb21IZXgocDEpLm11bHRpcGx5QW5kQWRkVW5zYWZlKHAycCwgdG9CaWdJbnQoYSksIEJpZ0ludCgxKSk7XG4gICAgICBpZiAoIXApIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIHAudG9SYXdCeXRlcyhjb21wcmVzcyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0sXG4gIHBvaW50QWRkKGE6IFVpbnQ4QXJyYXksIGI6IFVpbnQ4QXJyYXksIGNvbXByZXNzOiBib29sZWFuKTogVWludDhBcnJheSB8IG51bGwge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbmVjYy5Qb2ludC5mcm9tSGV4KGEpLmFkZChuZWNjLlBvaW50LmZyb21IZXgoYikpLnRvUmF3Qnl0ZXMoY29tcHJlc3MpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9LFxuICBwb2ludEFkZFR3ZWFrKHA6IFVpbnQ4QXJyYXksIHR3ZWFrOiBVaW50OEFycmF5LCBjb21wcmVzczogYm9vbGVhbik6IFVpbnQ4QXJyYXkgfCBudWxsIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgUCA9IG5lY2MuUG9pbnQuZnJvbUhleChwKTtcbiAgICAgIGNvbnN0IHQgPSBiYXNlQ3J5cHRvLnJlYWRTZWNyZXQodHdlYWspO1xuICAgICAgY29uc3QgUSA9IG5lY2MuUG9pbnQuQkFTRS5tdWx0aXBseUFuZEFkZFVuc2FmZShQLCB0LCBCaWdJbnQoMSkpO1xuICAgICAgaWYgKCFRKSB0aHJvdyBuZXcgRXJyb3IoJ1R3ZWFrZWQgcG9pbnQgYXQgaW5maW5pdHknKTtcbiAgICAgIHJldHVybiBRLnRvUmF3Qnl0ZXMoY29tcHJlc3MpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9LFxuICBwb2ludENvbXByZXNzKHA6IFVpbnQ4QXJyYXksIGNvbXByZXNzID0gdHJ1ZSk6IFVpbnQ4QXJyYXkge1xuICAgIHJldHVybiBuZWNjLlBvaW50LmZyb21IZXgocCkudG9SYXdCeXRlcyhjb21wcmVzcyk7XG4gIH0sXG4gIGxpZnRYKHA6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5IHwgbnVsbCB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBuZWNjLlBvaW50LmZyb21IZXgocCkudG9SYXdCeXRlcyhmYWxzZSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0sXG4gIGdldFB1YmxpY0tleShzOiBVaW50OEFycmF5LCBjb21wcmVzczogYm9vbGVhbik6IFVpbnQ4QXJyYXkgfCBudWxsIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIG5lY2MuZ2V0UHVibGljS2V5KHMsIGNvbXByZXNzKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSxcbiAgdGFnZ2VkSGFzaDogbmVjYy51dGlscy50YWdnZWRIYXNoU3luYyxcbiAgc2hhMjU2KC4uLm1lc3NhZ2VzOiBVaW50OEFycmF5W10pOiBVaW50OEFycmF5IHtcbiAgICBjb25zdCBzaGEyNTYgPSBjcmVhdGVIYXNoKCdzaGEyNTYnKTtcbiAgICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgbWVzc2FnZXMpIHNoYTI1Ni51cGRhdGUobWVzc2FnZSk7XG4gICAgcmV0dXJuIHNoYTI1Ni5kaWdlc3QoKTtcbiAgfSxcbn07XG5cbmNvbnN0IEVDUGFpcjogRUNQYWlyQVBJID0gRUNQYWlyRmFjdG9yeShlY2MpO1xuY29uc3QgYmlwMzI6IEJJUDMyQVBJID0gQklQMzJGYWN0b3J5KGVjYyk7XG5jb25zdCBtdXNpZzogTXVTaWcgPSBNdVNpZ0ZhY3RvcnkoY3J5cHRvKTtcblxuaW1wb3J0ICogYXMgYmlwMzJ1dGlscyBmcm9tICcuL2JpcDMydXRpbHMnO1xuXG5leHBvcnQge1xuICBlY2MsXG4gIEVDUGFpcixcbiAgRUNQYWlyQVBJLFxuICBFQ1BhaXJGYWN0b3J5LFxuICBFQ1BhaXJJbnRlcmZhY2UsXG4gIGJpcDMyLFxuICBCSVAzMkFQSSxcbiAgQklQMzJGYWN0b3J5LFxuICBCSVAzMkludGVyZmFjZSxcbiAgbXVzaWcsXG4gIE11U2lnLFxuICBiaXAzMnV0aWxzLFxufTtcbiJdfQ==