@bitgo-beta/sdk-coin-kaspa 0.0.1-beta.52 → 0.0.1-beta.53

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.
@@ -4,9 +4,47 @@
4
4
  * References:
5
5
  * - https://kaspa.org/
6
6
  * - https://kaspa.aspectron.org/docs/
7
+ * - rusty-kaspa/crypto/txscript/src/standard.rs
8
+ * - rusty-kaspa/crypto/hashes/src/hashers.rs
9
+ * - rusty-kaspa/consensus/core/src/hashing/sighash.rs
7
10
  */
8
11
  export declare const MAINNET_PREFIX = "kaspa";
9
12
  export declare const TESTNET_PREFIX = "kaspatest";
13
+ /** Default transaction fee (minimum relay fee in sompi) */
10
14
  export declare const DEFAULT_FEE = "1000";
15
+ /** Kaspa transaction version */
11
16
  export declare const TX_VERSION = 0;
17
+ export declare const SIGHASH_ALL = 1;
18
+ export declare const SIGHASH_NONE = 2;
19
+ export declare const SIGHASH_SINGLE = 4;
20
+ export declare const SIGHASH_ANYONECANPAY = 128;
21
+ /** Schnorr BIP-340 checksig opcode — used by v0 Kaspa addresses */
22
+ export declare const OP_CHECKSIG_SCHNORR = 172;
23
+ /** secp256k1 ECDSA checksig opcode — used by v1 Kaspa addresses */
24
+ export declare const OP_CHECKSIG_ECDSA = 171;
25
+ /** Script version for standard P2PK scripts */
26
+ export declare const SCRIPT_PUBLIC_KEY_VERSION = 0;
27
+ /**
28
+ * Kaspa P2PK script type.
29
+ * Determines the scriptPublicKey layout and the required signing algorithm.
30
+ *
31
+ * SCHNORR (v0): OP_DATA_32 (0x20) | xOnlyPubKey32 | OP_CHECKSIG_SCHNORR (0xAC)
32
+ * ECDSA (v1): OP_DATA_33 (0x21) | compressedPubKey33 | OP_CHECKSIG_ECDSA (0xAB)
33
+ */
34
+ export declare enum KaspaScriptType {
35
+ SCHNORR = 0,// v0 — Schnorr P2PK, x-only 32-byte pubkey
36
+ ECDSA = 1
37
+ }
38
+ /**
39
+ * Kaspa address version / type.
40
+ * Mirrors KaspaScriptType — the version byte in the bech32 address payload
41
+ * encodes which script type (and therefore which signature algorithm) applies.
42
+ *
43
+ * SCHNORR (v0): version byte 0x00, x-only 32-byte pubkey in address payload
44
+ * ECDSA (v1): version byte 0x01, compressed 33-byte pubkey in address payload
45
+ */
46
+ export declare enum KaspaAddressType {
47
+ SCHNORR = 0,// default — v0 Schnorr P2PK address
48
+ ECDSA = 1
49
+ }
12
50
  //# sourceMappingURL=constants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/lib/constants.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,eAAO,MAAM,cAAc,UAAU,CAAC;AACtC,eAAO,MAAM,cAAc,cAAc,CAAC;AAG1C,eAAO,MAAM,WAAW,SAAS,CAAC;AAGlC,eAAO,MAAM,UAAU,IAAI,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/lib/constants.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,eAAO,MAAM,cAAc,UAAU,CAAC;AACtC,eAAO,MAAM,cAAc,cAAc,CAAC;AAI1C,2DAA2D;AAC3D,eAAO,MAAM,WAAW,SAAS,CAAC;AAElC,gCAAgC;AAChC,eAAO,MAAM,UAAU,IAAI,CAAC;AAM5B,eAAO,MAAM,WAAW,IAAO,CAAC;AAChC,eAAO,MAAM,YAAY,IAAO,CAAC;AACjC,eAAO,MAAM,cAAc,IAAO,CAAC;AACnC,eAAO,MAAM,oBAAoB,MAAO,CAAC;AAWzC,mEAAmE;AACnE,eAAO,MAAM,mBAAmB,MAAO,CAAC;AAExC,mEAAmE;AACnE,eAAO,MAAM,iBAAiB,MAAO,CAAC;AAEtC,+CAA+C;AAC/C,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAI3C;;;;;;GAMG;AACH,oBAAY,eAAe;IACzB,OAAO,IAAI,CAAE,2CAA2C;IACxD,KAAK,IAAI;CACV;AAED;;;;;;;GAOG;AACH,oBAAY,gBAAgB;IAC1B,OAAO,IAAI,CAAE,oCAAoC;IACjD,KAAK,IAAI;CACV"}
@@ -5,14 +5,65 @@
5
5
  * References:
6
6
  * - https://kaspa.org/
7
7
  * - https://kaspa.aspectron.org/docs/
8
+ * - rusty-kaspa/crypto/txscript/src/standard.rs
9
+ * - rusty-kaspa/crypto/hashes/src/hashers.rs
10
+ * - rusty-kaspa/consensus/core/src/hashing/sighash.rs
8
11
  */
9
12
  Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.TX_VERSION = exports.DEFAULT_FEE = exports.TESTNET_PREFIX = exports.MAINNET_PREFIX = void 0;
11
- // Address format
13
+ exports.KaspaAddressType = exports.KaspaScriptType = exports.SCRIPT_PUBLIC_KEY_VERSION = exports.OP_CHECKSIG_ECDSA = exports.OP_CHECKSIG_SCHNORR = exports.SIGHASH_ANYONECANPAY = exports.SIGHASH_SINGLE = exports.SIGHASH_NONE = exports.SIGHASH_ALL = exports.TX_VERSION = exports.DEFAULT_FEE = exports.TESTNET_PREFIX = exports.MAINNET_PREFIX = void 0;
14
+ // ── Network ───────────────────────────────────────────────────────────────────
12
15
  exports.MAINNET_PREFIX = 'kaspa';
13
16
  exports.TESTNET_PREFIX = 'kaspatest';
14
- // Default transaction fee (minimum relay fee in sompi)
17
+ // ── Transaction ───────────────────────────────────────────────────────────────
18
+ /** Default transaction fee (minimum relay fee in sompi) */
15
19
  exports.DEFAULT_FEE = '1000'; // 0.00001 KASPA minimum
16
- // Kaspa transaction version
20
+ /** Kaspa transaction version */
17
21
  exports.TX_VERSION = 0;
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9jb25zdGFudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7R0FNRzs7O0FBRUgsaUJBQWlCO0FBQ0osUUFBQSxjQUFjLEdBQUcsT0FBTyxDQUFDO0FBQ3pCLFFBQUEsY0FBYyxHQUFHLFdBQVcsQ0FBQztBQUUxQyx1REFBdUQ7QUFDMUMsUUFBQSxXQUFXLEdBQUcsTUFBTSxDQUFDLENBQUMsd0JBQXdCO0FBRTNELDRCQUE0QjtBQUNmLFFBQUEsVUFBVSxHQUFHLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogS2FzcGEgKEtBU1BBKSBDb25zdGFudHNcbiAqXG4gKiBSZWZlcmVuY2VzOlxuICogLSBodHRwczovL2thc3BhLm9yZy9cbiAqIC0gaHR0cHM6Ly9rYXNwYS5hc3BlY3Ryb24ub3JnL2RvY3MvXG4gKi9cblxuLy8gQWRkcmVzcyBmb3JtYXRcbmV4cG9ydCBjb25zdCBNQUlOTkVUX1BSRUZJWCA9ICdrYXNwYSc7XG5leHBvcnQgY29uc3QgVEVTVE5FVF9QUkVGSVggPSAna2FzcGF0ZXN0JztcblxuLy8gRGVmYXVsdCB0cmFuc2FjdGlvbiBmZWUgKG1pbmltdW0gcmVsYXkgZmVlIGluIHNvbXBpKVxuZXhwb3J0IGNvbnN0IERFRkFVTFRfRkVFID0gJzEwMDAnOyAvLyAwLjAwMDAxIEtBU1BBIG1pbmltdW1cblxuLy8gS2FzcGEgdHJhbnNhY3Rpb24gdmVyc2lvblxuZXhwb3J0IGNvbnN0IFRYX1ZFUlNJT04gPSAwO1xuIl19
22
+ // ── SigHash type flags ────────────────────────────────────────────────────────
23
+ //
24
+ // Defined in rusty-kaspa consensus/core/src/hashing/sighash_type.rs
25
+ exports.SIGHASH_ALL = 0x01;
26
+ exports.SIGHASH_NONE = 0x02;
27
+ exports.SIGHASH_SINGLE = 0x04;
28
+ exports.SIGHASH_ANYONECANPAY = 0x80;
29
+ // ── Script opcodes ────────────────────────────────────────────────────────────
30
+ //
31
+ // Verified against:
32
+ // https://kaspa.aspectron.org/docs/enums/Opcodes.html
33
+ // rusty-kaspa/crypto/txscript/src/standard.rs
34
+ //
35
+ // OpCheckSig = 172 = 0xAC → Schnorr P2PK (v0 address)
36
+ // OpCheckSigECDSA = 171 = 0xAB → ECDSA P2PK (v1 address)
37
+ /** Schnorr BIP-340 checksig opcode — used by v0 Kaspa addresses */
38
+ exports.OP_CHECKSIG_SCHNORR = 0xac;
39
+ /** secp256k1 ECDSA checksig opcode — used by v1 Kaspa addresses */
40
+ exports.OP_CHECKSIG_ECDSA = 0xab;
41
+ /** Script version for standard P2PK scripts */
42
+ exports.SCRIPT_PUBLIC_KEY_VERSION = 0;
43
+ // ── Enums ─────────────────────────────────────────────────────────────────────
44
+ /**
45
+ * Kaspa P2PK script type.
46
+ * Determines the scriptPublicKey layout and the required signing algorithm.
47
+ *
48
+ * SCHNORR (v0): OP_DATA_32 (0x20) | xOnlyPubKey32 | OP_CHECKSIG_SCHNORR (0xAC)
49
+ * ECDSA (v1): OP_DATA_33 (0x21) | compressedPubKey33 | OP_CHECKSIG_ECDSA (0xAB)
50
+ */
51
+ var KaspaScriptType;
52
+ (function (KaspaScriptType) {
53
+ KaspaScriptType[KaspaScriptType["SCHNORR"] = 0] = "SCHNORR";
54
+ KaspaScriptType[KaspaScriptType["ECDSA"] = 1] = "ECDSA";
55
+ })(KaspaScriptType || (exports.KaspaScriptType = KaspaScriptType = {}));
56
+ /**
57
+ * Kaspa address version / type.
58
+ * Mirrors KaspaScriptType — the version byte in the bech32 address payload
59
+ * encodes which script type (and therefore which signature algorithm) applies.
60
+ *
61
+ * SCHNORR (v0): version byte 0x00, x-only 32-byte pubkey in address payload
62
+ * ECDSA (v1): version byte 0x01, compressed 33-byte pubkey in address payload
63
+ */
64
+ var KaspaAddressType;
65
+ (function (KaspaAddressType) {
66
+ KaspaAddressType[KaspaAddressType["SCHNORR"] = 0] = "SCHNORR";
67
+ KaspaAddressType[KaspaAddressType["ECDSA"] = 1] = "ECDSA";
68
+ })(KaspaAddressType || (exports.KaspaAddressType = KaspaAddressType = {}));
69
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9jb25zdGFudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7R0FTRzs7O0FBRUgsaUZBQWlGO0FBRXBFLFFBQUEsY0FBYyxHQUFHLE9BQU8sQ0FBQztBQUN6QixRQUFBLGNBQWMsR0FBRyxXQUFXLENBQUM7QUFFMUMsaUZBQWlGO0FBRWpGLDJEQUEyRDtBQUM5QyxRQUFBLFdBQVcsR0FBRyxNQUFNLENBQUMsQ0FBQyx3QkFBd0I7QUFFM0QsZ0NBQWdDO0FBQ25CLFFBQUEsVUFBVSxHQUFHLENBQUMsQ0FBQztBQUU1QixpRkFBaUY7QUFDakYsRUFBRTtBQUNGLG9FQUFvRTtBQUV2RCxRQUFBLFdBQVcsR0FBRyxJQUFJLENBQUM7QUFDbkIsUUFBQSxZQUFZLEdBQUcsSUFBSSxDQUFDO0FBQ3BCLFFBQUEsY0FBYyxHQUFHLElBQUksQ0FBQztBQUN0QixRQUFBLG9CQUFvQixHQUFHLElBQUksQ0FBQztBQUV6QyxpRkFBaUY7QUFDakYsRUFBRTtBQUNGLG9CQUFvQjtBQUNwQix3REFBd0Q7QUFDeEQsZ0RBQWdEO0FBQ2hELEVBQUU7QUFDRiw0REFBNEQ7QUFDNUQsMkRBQTJEO0FBRTNELG1FQUFtRTtBQUN0RCxRQUFBLG1CQUFtQixHQUFHLElBQUksQ0FBQztBQUV4QyxtRUFBbUU7QUFDdEQsUUFBQSxpQkFBaUIsR0FBRyxJQUFJLENBQUM7QUFFdEMsK0NBQStDO0FBQ2xDLFFBQUEseUJBQXlCLEdBQUcsQ0FBQyxDQUFDO0FBRTNDLGlGQUFpRjtBQUVqRjs7Ozs7O0dBTUc7QUFDSCxJQUFZLGVBR1g7QUFIRCxXQUFZLGVBQWU7SUFDekIsMkRBQVcsQ0FBQTtJQUNYLHVEQUFTLENBQUE7QUFDWCxDQUFDLEVBSFcsZUFBZSwrQkFBZixlQUFlLFFBRzFCO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILElBQVksZ0JBR1g7QUFIRCxXQUFZLGdCQUFnQjtJQUMxQiw2REFBVyxDQUFBO0lBQ1gseURBQVMsQ0FBQTtBQUNYLENBQUMsRUFIVyxnQkFBZ0IsZ0NBQWhCLGdCQUFnQixRQUczQiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogS2FzcGEgKEtBU1BBKSBDb25zdGFudHNcbiAqXG4gKiBSZWZlcmVuY2VzOlxuICogLSBodHRwczovL2thc3BhLm9yZy9cbiAqIC0gaHR0cHM6Ly9rYXNwYS5hc3BlY3Ryb24ub3JnL2RvY3MvXG4gKiAtIHJ1c3R5LWthc3BhL2NyeXB0by90eHNjcmlwdC9zcmMvc3RhbmRhcmQucnNcbiAqIC0gcnVzdHkta2FzcGEvY3J5cHRvL2hhc2hlcy9zcmMvaGFzaGVycy5yc1xuICogLSBydXN0eS1rYXNwYS9jb25zZW5zdXMvY29yZS9zcmMvaGFzaGluZy9zaWdoYXNoLnJzXG4gKi9cblxuLy8g4pSA4pSAIE5ldHdvcmsg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmV4cG9ydCBjb25zdCBNQUlOTkVUX1BSRUZJWCA9ICdrYXNwYSc7XG5leHBvcnQgY29uc3QgVEVTVE5FVF9QUkVGSVggPSAna2FzcGF0ZXN0JztcblxuLy8g4pSA4pSAIFRyYW5zYWN0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKiogRGVmYXVsdCB0cmFuc2FjdGlvbiBmZWUgKG1pbmltdW0gcmVsYXkgZmVlIGluIHNvbXBpKSAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfRkVFID0gJzEwMDAnOyAvLyAwLjAwMDAxIEtBU1BBIG1pbmltdW1cblxuLyoqIEthc3BhIHRyYW5zYWN0aW9uIHZlcnNpb24gKi9cbmV4cG9ydCBjb25zdCBUWF9WRVJTSU9OID0gMDtcblxuLy8g4pSA4pSAIFNpZ0hhc2ggdHlwZSBmbGFncyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vXG4vLyBEZWZpbmVkIGluIHJ1c3R5LWthc3BhIGNvbnNlbnN1cy9jb3JlL3NyYy9oYXNoaW5nL3NpZ2hhc2hfdHlwZS5yc1xuXG5leHBvcnQgY29uc3QgU0lHSEFTSF9BTEwgPSAweDAxO1xuZXhwb3J0IGNvbnN0IFNJR0hBU0hfTk9ORSA9IDB4MDI7XG5leHBvcnQgY29uc3QgU0lHSEFTSF9TSU5HTEUgPSAweDA0O1xuZXhwb3J0IGNvbnN0IFNJR0hBU0hfQU5ZT05FQ0FOUEFZID0gMHg4MDtcblxuLy8g4pSA4pSAIFNjcmlwdCBvcGNvZGVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy9cbi8vIFZlcmlmaWVkIGFnYWluc3Q6XG4vLyAgIGh0dHBzOi8va2FzcGEuYXNwZWN0cm9uLm9yZy9kb2NzL2VudW1zL09wY29kZXMuaHRtbFxuLy8gICBydXN0eS1rYXNwYS9jcnlwdG8vdHhzY3JpcHQvc3JjL3N0YW5kYXJkLnJzXG4vL1xuLy8gT3BDaGVja1NpZyAgICAgID0gMTcyID0gMHhBQyAg4oaSIFNjaG5vcnIgUDJQSyAodjAgYWRkcmVzcylcbi8vIE9wQ2hlY2tTaWdFQ0RTQSA9IDE3MSA9IDB4QUIgIOKGkiBFQ0RTQSBQMlBLICAodjEgYWRkcmVzcylcblxuLyoqIFNjaG5vcnIgQklQLTM0MCBjaGVja3NpZyBvcGNvZGUg4oCUIHVzZWQgYnkgdjAgS2FzcGEgYWRkcmVzc2VzICovXG5leHBvcnQgY29uc3QgT1BfQ0hFQ0tTSUdfU0NITk9SUiA9IDB4YWM7XG5cbi8qKiBzZWNwMjU2azEgRUNEU0EgY2hlY2tzaWcgb3Bjb2RlIOKAlCB1c2VkIGJ5IHYxIEthc3BhIGFkZHJlc3NlcyAqL1xuZXhwb3J0IGNvbnN0IE9QX0NIRUNLU0lHX0VDRFNBID0gMHhhYjtcblxuLyoqIFNjcmlwdCB2ZXJzaW9uIGZvciBzdGFuZGFyZCBQMlBLIHNjcmlwdHMgKi9cbmV4cG9ydCBjb25zdCBTQ1JJUFRfUFVCTElDX0tFWV9WRVJTSU9OID0gMDtcblxuLy8g4pSA4pSAIEVudW1zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIEthc3BhIFAyUEsgc2NyaXB0IHR5cGUuXG4gKiBEZXRlcm1pbmVzIHRoZSBzY3JpcHRQdWJsaWNLZXkgbGF5b3V0IGFuZCB0aGUgcmVxdWlyZWQgc2lnbmluZyBhbGdvcml0aG0uXG4gKlxuICogU0NITk9SUiAodjApOiBPUF9EQVRBXzMyICgweDIwKSB8IHhPbmx5UHViS2V5MzIgfCBPUF9DSEVDS1NJR19TQ0hOT1JSICgweEFDKVxuICogRUNEU0EgICAodjEpOiBPUF9EQVRBXzMzICgweDIxKSB8IGNvbXByZXNzZWRQdWJLZXkzMyB8IE9QX0NIRUNLU0lHX0VDRFNBICgweEFCKVxuICovXG5leHBvcnQgZW51bSBLYXNwYVNjcmlwdFR5cGUge1xuICBTQ0hOT1JSID0gMCwgLy8gdjAg4oCUIFNjaG5vcnIgUDJQSywgeC1vbmx5IDMyLWJ5dGUgcHVia2V5XG4gIEVDRFNBID0gMSwgLy8gdjEg4oCUIEVDRFNBIFAyUEssIGNvbXByZXNzZWQgMzMtYnl0ZSBwdWJrZXlcbn1cblxuLyoqXG4gKiBLYXNwYSBhZGRyZXNzIHZlcnNpb24gLyB0eXBlLlxuICogTWlycm9ycyBLYXNwYVNjcmlwdFR5cGUg4oCUIHRoZSB2ZXJzaW9uIGJ5dGUgaW4gdGhlIGJlY2gzMiBhZGRyZXNzIHBheWxvYWRcbiAqIGVuY29kZXMgd2hpY2ggc2NyaXB0IHR5cGUgKGFuZCB0aGVyZWZvcmUgd2hpY2ggc2lnbmF0dXJlIGFsZ29yaXRobSkgYXBwbGllcy5cbiAqXG4gKiBTQ0hOT1JSICh2MCk6IHZlcnNpb24gYnl0ZSAweDAwLCB4LW9ubHkgMzItYnl0ZSBwdWJrZXkgaW4gYWRkcmVzcyBwYXlsb2FkXG4gKiBFQ0RTQSAgICh2MSk6IHZlcnNpb24gYnl0ZSAweDAxLCBjb21wcmVzc2VkIDMzLWJ5dGUgcHVia2V5IGluIGFkZHJlc3MgcGF5bG9hZFxuICovXG5leHBvcnQgZW51bSBLYXNwYUFkZHJlc3NUeXBlIHtcbiAgU0NITk9SUiA9IDAsIC8vIGRlZmF1bHQg4oCUIHYwIFNjaG5vcnIgUDJQSyBhZGRyZXNzXG4gIEVDRFNBID0gMSwgLy8gdjEgRUNEU0EgUDJQSyBhZGRyZXNzXG59XG4iXX0=
@@ -1,4 +1,5 @@
1
1
  import { DefaultKeys, KeyPairOptions, Secp256k1ExtendedKeyPair } from '@bitgo-beta/sdk-core';
2
+ import { KaspaAddressType } from './constants';
2
3
  export declare class KeyPair extends Secp256k1ExtendedKeyPair {
3
4
  /**
4
5
  * Public constructor. By default, creates a key pair with a random master seed.
@@ -15,8 +16,11 @@ export declare class KeyPair extends Secp256k1ExtendedKeyPair {
15
16
  /**
16
17
  * Get a Kaspa address from this key pair.
17
18
  *
18
- * @returns {string} The bech32-encoded Kaspa address
19
+ * @param network - 'mainnet' or 'testnet' (default: 'mainnet')
20
+ * @param type - address type (default: SCHNORR / v0 for hot-wallet;
21
+ * use KaspaAddressType.ECDSA / v1 for MPC/DKLS wallets)
22
+ * @returns bech32-encoded Kaspa address
19
23
  */
20
- getAddress(network?: string): string;
24
+ getAddress(network?: string, type?: KaspaAddressType): string;
21
25
  }
22
26
  //# sourceMappingURL=keyPair.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"keyPair.d.ts","sourceRoot":"","sources":["../../../src/lib/keyPair.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EAIX,cAAc,EACd,wBAAwB,EACzB,MAAM,sBAAsB,CAAC;AAQ9B,qBAAa,OAAQ,SAAQ,wBAAwB;IACnD;;;;OAIG;gBACS,MAAM,CAAC,EAAE,cAAc;IAoBnC;;;;OAIG;IACH,OAAO,IAAI,WAAW;IAOtB;;;;OAIG;IACH,UAAU,CAAC,OAAO,SAAY,GAAG,MAAM;CAKxC"}
1
+ {"version":3,"file":"keyPair.d.ts","sourceRoot":"","sources":["../../../src/lib/keyPair.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EAIX,cAAc,EACd,wBAAwB,EACzB,MAAM,sBAAsB,CAAC;AAI9B,OAAO,EAAkC,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAI/E,qBAAa,OAAQ,SAAQ,wBAAwB;IACnD;;;;OAIG;gBACS,MAAM,CAAC,EAAE,cAAc;IAoBnC;;;;OAIG;IACH,OAAO,IAAI,WAAW;IAOtB;;;;;;;OAOG;IACH,UAAU,CAAC,OAAO,SAAY,EAAE,IAAI,GAAE,gBAA2C,GAAG,MAAM;CAK3F"}
@@ -49,13 +49,16 @@ class KeyPair extends sdk_core_1.Secp256k1ExtendedKeyPair {
49
49
  /**
50
50
  * Get a Kaspa address from this key pair.
51
51
  *
52
- * @returns {string} The bech32-encoded Kaspa address
52
+ * @param network - 'mainnet' or 'testnet' (default: 'mainnet')
53
+ * @param type - address type (default: SCHNORR / v0 for hot-wallet;
54
+ * use KaspaAddressType.ECDSA / v1 for MPC/DKLS wallets)
55
+ * @returns bech32-encoded Kaspa address
53
56
  */
54
- getAddress(network = 'mainnet') {
57
+ getAddress(network = 'mainnet', type = constants_1.KaspaAddressType.SCHNORR) {
55
58
  const hrp = network === 'testnet' ? constants_1.TESTNET_PREFIX : constants_1.MAINNET_PREFIX;
56
59
  const compressedPub = this.getPublicKey({ compressed: true });
57
- return (0, utils_1.pubKeyToKaspaAddress)(compressedPub, hrp);
60
+ return (0, utils_1.pubKeyToKaspaAddress)(compressedPub, hrp, type);
58
61
  }
59
62
  }
60
63
  exports.KeyPair = KeyPair;
61
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5UGFpci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIva2V5UGFpci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtREFPOEI7QUFDOUIscURBQThDO0FBQzlDLG1DQUFxQztBQUNyQyxtQ0FBK0M7QUFDL0MsMkNBQTZEO0FBRTdELE1BQU0sdUJBQXVCLEdBQUcsRUFBRSxDQUFDO0FBRW5DLE1BQWEsT0FBUSxTQUFRLG1DQUF3QjtJQUNuRDs7OztPQUlHO0lBQ0gsWUFBWSxNQUF1QjtRQUNqQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDZCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixNQUFNLElBQUksR0FBRyxJQUFBLG9CQUFXLEVBQUMsdUJBQXVCLENBQUMsQ0FBQztZQUNsRCxJQUFJLENBQUMsTUFBTSxHQUFHLGlCQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JDLENBQUM7YUFBTSxJQUFJLElBQUEsaUJBQU0sRUFBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxNQUFNLEdBQUcsaUJBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVDLENBQUM7YUFBTSxJQUFJLElBQUEsdUJBQVksRUFBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUMsQ0FBQzthQUFNLElBQUksSUFBQSxzQkFBVyxFQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQyxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUM5QyxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxtQ0FBd0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pFLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE9BQU87UUFDTCxPQUFPO1lBQ0wsR0FBRyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQzVELEdBQUcsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQztTQUMzQyxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxVQUFVLENBQUMsT0FBTyxHQUFHLFNBQVM7UUFDNUIsTUFBTSxHQUFHLEdBQUcsT0FBTyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsMEJBQWMsQ0FBQyxDQUFDLENBQUMsMEJBQWMsQ0FBQztRQUNwRSxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDOUQsT0FBTyxJQUFBLDRCQUFvQixFQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNsRCxDQUFDO0NBQ0Y7QUFoREQsMEJBZ0RDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRGVmYXVsdEtleXMsXG4gIGlzUHJpdmF0ZUtleSxcbiAgaXNQdWJsaWNLZXksXG4gIGlzU2VlZCxcbiAgS2V5UGFpck9wdGlvbnMsXG4gIFNlY3AyNTZrMUV4dGVuZGVkS2V5UGFpcixcbn0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgYmlwMzIgfSBmcm9tICdAYml0Z28tYmV0YS9zZWNwMjU2azEnO1xuaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgcHViS2V5VG9LYXNwYUFkZHJlc3MgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IE1BSU5ORVRfUFJFRklYLCBURVNUTkVUX1BSRUZJWCB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuY29uc3QgREVGQVVMVF9TRUVEX1NJWkVfQllURVMgPSAxNjtcblxuZXhwb3J0IGNsYXNzIEtleVBhaXIgZXh0ZW5kcyBTZWNwMjU2azFFeHRlbmRlZEtleVBhaXIge1xuICAvKipcbiAgICogUHVibGljIGNvbnN0cnVjdG9yLiBCeSBkZWZhdWx0LCBjcmVhdGVzIGEga2V5IHBhaXIgd2l0aCBhIHJhbmRvbSBtYXN0ZXIgc2VlZC5cbiAgICpcbiAgICogQHBhcmFtIHsgS2V5UGFpck9wdGlvbnMgfSBzb3VyY2UgRWl0aGVyIGEgbWFzdGVyIHNlZWQsIGEgcHJpdmF0ZSBrZXksIG9yIGEgcHVibGljIGtleVxuICAgKi9cbiAgY29uc3RydWN0b3Ioc291cmNlPzogS2V5UGFpck9wdGlvbnMpIHtcbiAgICBzdXBlcihzb3VyY2UpO1xuICAgIGlmICghc291cmNlKSB7XG4gICAgICBjb25zdCBzZWVkID0gcmFuZG9tQnl0ZXMoREVGQVVMVF9TRUVEX1NJWkVfQllURVMpO1xuICAgICAgdGhpcy5oZE5vZGUgPSBiaXAzMi5mcm9tU2VlZChzZWVkKTtcbiAgICB9IGVsc2UgaWYgKGlzU2VlZChzb3VyY2UpKSB7XG4gICAgICB0aGlzLmhkTm9kZSA9IGJpcDMyLmZyb21TZWVkKHNvdXJjZS5zZWVkKTtcbiAgICB9IGVsc2UgaWYgKGlzUHJpdmF0ZUtleShzb3VyY2UpKSB7XG4gICAgICB0aGlzLnJlY29yZEtleXNGcm9tUHJpdmF0ZUtleShzb3VyY2UucHJ2KTtcbiAgICB9IGVsc2UgaWYgKGlzUHVibGljS2V5KHNvdXJjZSkpIHtcbiAgICAgIHRoaXMucmVjb3JkS2V5c0Zyb21QdWJsaWNLZXkoc291cmNlLnB1Yik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBrZXkgcGFpciBvcHRpb25zJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGROb2RlKSB7XG4gICAgICB0aGlzLmtleVBhaXIgPSBTZWNwMjU2azFFeHRlbmRlZEtleVBhaXIudG9LZXlQYWlyKHRoaXMuaGROb2RlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVmYXVsdCBrZXlzIGZvcm1hdCBpcyBhIHBhaXIgb2YgaGV4IGtleXMuXG4gICAqXG4gICAqIEByZXR1cm5zIHsgRGVmYXVsdEtleXMgfSBUaGUga2V5cyBpbiB0aGUgZGVmaW5lZCBmb3JtYXRcbiAgICovXG4gIGdldEtleXMoKTogRGVmYXVsdEtleXMge1xuICAgIHJldHVybiB7XG4gICAgICBwdWI6IHRoaXMuZ2V0UHVibGljS2V5KHsgY29tcHJlc3NlZDogdHJ1ZSB9KS50b1N0cmluZygnaGV4JyksXG4gICAgICBwcnY6IHRoaXMuZ2V0UHJpdmF0ZUtleSgpPy50b1N0cmluZygnaGV4JyksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBLYXNwYSBhZGRyZXNzIGZyb20gdGhpcyBrZXkgcGFpci5cbiAgICpcbiAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGJlY2gzMi1lbmNvZGVkIEthc3BhIGFkZHJlc3NcbiAgICovXG4gIGdldEFkZHJlc3MobmV0d29yayA9ICdtYWlubmV0Jyk6IHN0cmluZyB7XG4gICAgY29uc3QgaHJwID0gbmV0d29yayA9PT0gJ3Rlc3RuZXQnID8gVEVTVE5FVF9QUkVGSVggOiBNQUlOTkVUX1BSRUZJWDtcbiAgICBjb25zdCBjb21wcmVzc2VkUHViID0gdGhpcy5nZXRQdWJsaWNLZXkoeyBjb21wcmVzc2VkOiB0cnVlIH0pO1xuICAgIHJldHVybiBwdWJLZXlUb0thc3BhQWRkcmVzcyhjb21wcmVzc2VkUHViLCBocnApO1xuICB9XG59XG4iXX0=
64
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5UGFpci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIva2V5UGFpci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtREFPOEI7QUFDOUIscURBQThDO0FBQzlDLG1DQUFxQztBQUNyQyxtQ0FBK0M7QUFDL0MsMkNBQStFO0FBRS9FLE1BQU0sdUJBQXVCLEdBQUcsRUFBRSxDQUFDO0FBRW5DLE1BQWEsT0FBUSxTQUFRLG1DQUF3QjtJQUNuRDs7OztPQUlHO0lBQ0gsWUFBWSxNQUF1QjtRQUNqQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDZCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixNQUFNLElBQUksR0FBRyxJQUFBLG9CQUFXLEVBQUMsdUJBQXVCLENBQUMsQ0FBQztZQUNsRCxJQUFJLENBQUMsTUFBTSxHQUFHLGlCQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JDLENBQUM7YUFBTSxJQUFJLElBQUEsaUJBQU0sRUFBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxNQUFNLEdBQUcsaUJBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVDLENBQUM7YUFBTSxJQUFJLElBQUEsdUJBQVksRUFBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUMsQ0FBQzthQUFNLElBQUksSUFBQSxzQkFBVyxFQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQyxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUM5QyxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxtQ0FBd0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pFLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE9BQU87UUFDTCxPQUFPO1lBQ0wsR0FBRyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQzVELEdBQUcsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQztTQUMzQyxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxVQUFVLENBQUMsT0FBTyxHQUFHLFNBQVMsRUFBRSxPQUF5Qiw0QkFBZ0IsQ0FBQyxPQUFPO1FBQy9FLE1BQU0sR0FBRyxHQUFHLE9BQU8sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLDBCQUFjLENBQUMsQ0FBQyxDQUFDLDBCQUFjLENBQUM7UUFDcEUsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzlELE9BQU8sSUFBQSw0QkFBb0IsRUFBQyxhQUFhLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3hELENBQUM7Q0FDRjtBQW5ERCwwQkFtREMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBEZWZhdWx0S2V5cyxcbiAgaXNQcml2YXRlS2V5LFxuICBpc1B1YmxpY0tleSxcbiAgaXNTZWVkLFxuICBLZXlQYWlyT3B0aW9ucyxcbiAgU2VjcDI1NmsxRXh0ZW5kZWRLZXlQYWlyLFxufSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBiaXAzMiB9IGZyb20gJ0BiaXRnby1iZXRhL3NlY3AyNTZrMSc7XG5pbXBvcnQgeyByYW5kb21CeXRlcyB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBwdWJLZXlUb0thc3BhQWRkcmVzcyB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgTUFJTk5FVF9QUkVGSVgsIFRFU1RORVRfUFJFRklYLCBLYXNwYUFkZHJlc3NUeXBlIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG5jb25zdCBERUZBVUxUX1NFRURfU0laRV9CWVRFUyA9IDE2O1xuXG5leHBvcnQgY2xhc3MgS2V5UGFpciBleHRlbmRzIFNlY3AyNTZrMUV4dGVuZGVkS2V5UGFpciB7XG4gIC8qKlxuICAgKiBQdWJsaWMgY29uc3RydWN0b3IuIEJ5IGRlZmF1bHQsIGNyZWF0ZXMgYSBrZXkgcGFpciB3aXRoIGEgcmFuZG9tIG1hc3RlciBzZWVkLlxuICAgKlxuICAgKiBAcGFyYW0geyBLZXlQYWlyT3B0aW9ucyB9IHNvdXJjZSBFaXRoZXIgYSBtYXN0ZXIgc2VlZCwgYSBwcml2YXRlIGtleSwgb3IgYSBwdWJsaWMga2V5XG4gICAqL1xuICBjb25zdHJ1Y3Rvcihzb3VyY2U/OiBLZXlQYWlyT3B0aW9ucykge1xuICAgIHN1cGVyKHNvdXJjZSk7XG4gICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgIGNvbnN0IHNlZWQgPSByYW5kb21CeXRlcyhERUZBVUxUX1NFRURfU0laRV9CWVRFUyk7XG4gICAgICB0aGlzLmhkTm9kZSA9IGJpcDMyLmZyb21TZWVkKHNlZWQpO1xuICAgIH0gZWxzZSBpZiAoaXNTZWVkKHNvdXJjZSkpIHtcbiAgICAgIHRoaXMuaGROb2RlID0gYmlwMzIuZnJvbVNlZWQoc291cmNlLnNlZWQpO1xuICAgIH0gZWxzZSBpZiAoaXNQcml2YXRlS2V5KHNvdXJjZSkpIHtcbiAgICAgIHRoaXMucmVjb3JkS2V5c0Zyb21Qcml2YXRlS2V5KHNvdXJjZS5wcnYpO1xuICAgIH0gZWxzZSBpZiAoaXNQdWJsaWNLZXkoc291cmNlKSkge1xuICAgICAgdGhpcy5yZWNvcmRLZXlzRnJvbVB1YmxpY0tleShzb3VyY2UucHViKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGtleSBwYWlyIG9wdGlvbnMnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5oZE5vZGUpIHtcbiAgICAgIHRoaXMua2V5UGFpciA9IFNlY3AyNTZrMUV4dGVuZGVkS2V5UGFpci50b0tleVBhaXIodGhpcy5oZE5vZGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZhdWx0IGtleXMgZm9ybWF0IGlzIGEgcGFpciBvZiBoZXgga2V5cy5cbiAgICpcbiAgICogQHJldHVybnMgeyBEZWZhdWx0S2V5cyB9IFRoZSBrZXlzIGluIHRoZSBkZWZpbmVkIGZvcm1hdFxuICAgKi9cbiAgZ2V0S2V5cygpOiBEZWZhdWx0S2V5cyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHB1YjogdGhpcy5nZXRQdWJsaWNLZXkoeyBjb21wcmVzc2VkOiB0cnVlIH0pLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHBydjogdGhpcy5nZXRQcml2YXRlS2V5KCk/LnRvU3RyaW5nKCdoZXgnKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIEthc3BhIGFkZHJlc3MgZnJvbSB0aGlzIGtleSBwYWlyLlxuICAgKlxuICAgKiBAcGFyYW0gbmV0d29yayAtICdtYWlubmV0JyBvciAndGVzdG5ldCcgKGRlZmF1bHQ6ICdtYWlubmV0JylcbiAgICogQHBhcmFtIHR5cGUgICAgLSBhZGRyZXNzIHR5cGUgKGRlZmF1bHQ6IFNDSE5PUlIgLyB2MCBmb3IgaG90LXdhbGxldDtcbiAgICogICAgICAgICAgICAgICAgICB1c2UgS2FzcGFBZGRyZXNzVHlwZS5FQ0RTQSAvIHYxIGZvciBNUEMvREtMUyB3YWxsZXRzKVxuICAgKiBAcmV0dXJucyBiZWNoMzItZW5jb2RlZCBLYXNwYSBhZGRyZXNzXG4gICAqL1xuICBnZXRBZGRyZXNzKG5ldHdvcmsgPSAnbWFpbm5ldCcsIHR5cGU6IEthc3BhQWRkcmVzc1R5cGUgPSBLYXNwYUFkZHJlc3NUeXBlLlNDSE5PUlIpOiBzdHJpbmcge1xuICAgIGNvbnN0IGhycCA9IG5ldHdvcmsgPT09ICd0ZXN0bmV0JyA/IFRFU1RORVRfUFJFRklYIDogTUFJTk5FVF9QUkVGSVg7XG4gICAgY29uc3QgY29tcHJlc3NlZFB1YiA9IHRoaXMuZ2V0UHVibGljS2V5KHsgY29tcHJlc3NlZDogdHJ1ZSB9KTtcbiAgICByZXR1cm4gcHViS2V5VG9LYXNwYUFkZHJlc3MoY29tcHJlc3NlZFB1YiwgaHJwLCB0eXBlKTtcbiAgfVxufVxuIl19
@@ -226,8 +226,10 @@ export declare class Pskt {
226
226
  /**
227
227
  * Finalise all inputs: promote the first `partialSig` on each input into
228
228
  * `finalScriptSig` using Kaspa's push-only script layout:
229
- * `0x41` (OP_DATA_65) + 64-byte Schnorr sig + 1-byte sighash type = 66 bytes
229
+ * `0x41` (OP_DATA_65) + 64-byte sig + 1-byte sighash type = 66 bytes
230
230
  *
231
+ * Works for both Schnorr (v0) and ECDSA (v1) inputs since both produce a
232
+ * 64-byte compact signature stored in `partialSigs`.
231
233
  * Inputs that already have a `finalScriptSig` are left unchanged.
232
234
  */
233
235
  finalize(): this;
@@ -1 +1 @@
1
- {"version":3,"file":"pskt.d.ts","sourceRoot":"","sources":["../../../src/lib/pskt.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pskt.d.ts","sourceRoot":"","sources":["../../../src/lib/pskt.ts"],"names":[],"mappings":"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"}
@@ -22,6 +22,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
22
22
  exports.Pskt = void 0;
23
23
  const secp256k1_1 = require("@bitgo-beta/secp256k1");
24
24
  const sighash_1 = require("./sighash");
25
+ const constants_1 = require("./constants");
25
26
  const keyPair_1 = require("./keyPair");
26
27
  // ─── Internal helpers ─────────────────────────────────────────────────────────
27
28
  function requireRole(current, ...allowed) {
@@ -158,7 +159,7 @@ class Pskt {
158
159
  sequence: inp.sequence,
159
160
  sigOpCount: inp.sigOpCount,
160
161
  partialSigs: {},
161
- sighashType: sighash_1.SIGHASH_ALL,
162
+ sighashType: constants_1.SIGHASH_ALL,
162
163
  // Carry any existing signatureScript as the finalScriptSig
163
164
  finalScriptSig: inp.signatureScript,
164
165
  bip32Derivations: {},
@@ -253,7 +254,7 @@ class Pskt {
253
254
  * @param privateKey 32-byte private key buffer
254
255
  * @param sigHashType SigHash type (default: SIGHASH_ALL = 0x01)
255
256
  */
256
- sign(privateKey, sigHashType = sighash_1.SIGHASH_ALL) {
257
+ sign(privateKey, sigHashType = constants_1.SIGHASH_ALL) {
257
258
  requireRole(this._role, 'SIGNER');
258
259
  if (privateKey.length !== 32) {
259
260
  throw new Error(`Expected 32-byte private key, got ${privateKey.length}`);
@@ -286,7 +287,7 @@ class Pskt {
286
287
  * @param sigHex 64-byte Schnorr signature, hex-encoded
287
288
  * @param sigHashType SigHash type used when producing the signature
288
289
  */
289
- addSignature(inputIndex, pubKeyHex, sigHex, sigHashType = sighash_1.SIGHASH_ALL) {
290
+ addSignature(inputIndex, pubKeyHex, sigHex, sigHashType = constants_1.SIGHASH_ALL) {
290
291
  requireRole(this._role, 'SIGNER');
291
292
  if (inputIndex < 0 || inputIndex >= this._inputs.length) {
292
293
  throw new Error(`Input index ${inputIndex} is out of range (tx has ${this._inputs.length} inputs)`);
@@ -329,8 +330,10 @@ class Pskt {
329
330
  /**
330
331
  * Finalise all inputs: promote the first `partialSig` on each input into
331
332
  * `finalScriptSig` using Kaspa's push-only script layout:
332
- * `0x41` (OP_DATA_65) + 64-byte Schnorr sig + 1-byte sighash type = 66 bytes
333
+ * `0x41` (OP_DATA_65) + 64-byte sig + 1-byte sighash type = 66 bytes
333
334
  *
335
+ * Works for both Schnorr (v0) and ECDSA (v1) inputs since both produce a
336
+ * 64-byte compact signature stored in `partialSigs`.
334
337
  * Inputs that already have a `finalScriptSig` are left unchanged.
335
338
  */
336
339
  finalize() {
@@ -349,7 +352,7 @@ class Pskt {
349
352
  if (sig.length !== 64) {
350
353
  throw new Error(`Input[${i}] partial signature is ${sig.length} bytes, expected 64`);
351
354
  }
352
- const sighashType = inp.sighashType ?? sighash_1.SIGHASH_ALL;
355
+ const sighashType = inp.sighashType ?? constants_1.SIGHASH_ALL;
353
356
  // Push-only scriptSig: OP_DATA_65 + 64-byte sig + 1-byte sighash type
354
357
  inp.finalScriptSig = Buffer.concat([Buffer.from([0x41]), sig, Buffer.from([sighashType])]).toString('hex');
355
358
  }
@@ -433,4 +436,4 @@ class Pskt {
433
436
  }
434
437
  }
435
438
  exports.Pskt = Pskt;
436
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHNrdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcHNrdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRzs7O0FBRUgscURBQTRDO0FBRTVDLHVDQUFpRTtBQUNqRSx1Q0FBb0M7QUFtR3BDLGlGQUFpRjtBQUVqRixTQUFTLFdBQVcsQ0FBQyxPQUFpQixFQUFFLEdBQUcsT0FBbUI7SUFDNUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyx5QkFBeUIsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUNyRyxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsaUJBQWlCLENBQUMsTUFBa0IsRUFBRSxNQUFtQixFQUFFLE9BQXFCO0lBQ3ZGLE1BQU0sV0FBVyxHQUFxQixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQzFELElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkIsTUFBTSxJQUFJLEtBQUssQ0FDYixTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxJQUFJLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLElBQUk7Z0JBQ2xGLHlEQUF5RCxDQUM1RCxDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU87WUFDTCxhQUFhLEVBQUUsR0FBRyxDQUFDLGdCQUFnQixDQUFDLGFBQWE7WUFDakQsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLGdCQUFnQixDQUFDLEtBQUs7WUFDNUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTTtZQUM1QixlQUFlLEVBQUUsR0FBRyxDQUFDLFNBQVMsQ0FBQyxlQUFlO1lBQzlD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O1lBQ3hELE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxFQUFFO1NBQ3BDLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUF2WUQsb0JBdVlDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQU0tUIOKAlCBQYXJ0aWFsbHkgU2lnbmVkIEthc3BhIFRyYW5zYWN0aW9uXG4gKlxuICogS2FzcGEncyBuYXRpdmUgYW5hbG9ndWUgb2YgQml0Y29pbidzIFBTQlQgKEJJUC0xNzQpLCBpbXBsZW1lbnRlZCBpblxuICogVHlwZVNjcmlwdCB3aXRoIHplcm8gZXh0ZXJuYWwgZGVwZW5kZW5jaWVzLiBXaXJlIGZvcm1hdCBpcyBwbGFpbiBjYW1lbENhc2VcbiAqIEpTT04sIG1hdGNoaW5nIHRoZSBzZXJkZSBzZXJpYWxpc2F0aW9uIG9mIHJ1c3R5LWthc3BhJ3Mgd2FsbGV0L3Bza3QgY3JhdGUuXG4gKlxuICogUmVmZXJlbmNlOiBodHRwczovL2dpdGh1Yi5jb20va2FzcGFuZXQvcnVzdHkta2FzcGEvdHJlZS9tYXN0ZXIvd2FsbGV0L3Bza3RcbiAqXG4gKiBSb2xlIHN0YXRlIG1hY2hpbmU6XG4gKiAgIENSRUFUT1Ig4oaSIFVQREFURVIg4oaSIFNJR05FUiDilIDilKzihpIgQ09NQklORVIg4oaSIEZJTkFMSVpFUiDihpIgRVhUUkFDVE9SXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4oaSIEZJTkFMSVpFUiDihpIgRVhUUkFDVE9SXG4gKlxuICogS2V5IGRpZmZlcmVuY2UgZnJvbSB0aGUgY3VycmVudCBKU09OLWhleCBmbG93OlxuICogICBTaWduYXR1cmVzIGFyZSBzdG9yZWQgaW4gYHBhcnRpYWxTaWdzYCBwZXIgaW5wdXQgdW50aWwgdGhlIEZJTkFMSVpFUlxuICogICByb2xlIHByb21vdGVzIHRoZW0gaW50byB0aGUgcHVzaC1vbmx5IGBmaW5hbFNjcmlwdFNpZ2AuIFRoaXMgbGV0cyBhblxuICogICBleHRlcm5hbCBIU00gb3IgYSBzZWNvbmQgcGFydHkgcmVjZWl2ZSB0aGUgc2VyaWFsaXNlZCBQU0tULCBjYWxsXG4gKiAgIGBhZGRTaWduYXR1cmUoKWAsIGFuZCByZXR1cm4gaXQg4oCUIGlkZW50aWNhbCB0byBob3cgUFNCVCB3b3JrcyBmb3IgQlRDLlxuICovXG5cbmltcG9ydCB7IGVjYyB9IGZyb20gJ0BiaXRnby1iZXRhL3NlY3AyNTZrMSc7XG5pbXBvcnQgeyBLYXNwYVRyYW5zYWN0aW9uRGF0YSwgS2FzcGFVdHhvSW5wdXQsIEthc3BhVHJhbnNhY3Rpb25PdXRwdXQgfSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IGNvbXB1dGVLYXNwYVNpZ25pbmdIYXNoLCBTSUdIQVNIX0FMTCB9IGZyb20gJy4vc2lnaGFzaCc7XG5pbXBvcnQgeyBLZXlQYWlyIH0gZnJvbSAnLi9rZXlQYWlyJztcblxuLy8g4pSA4pSA4pSAIFJvbGUgdHlwZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmV4cG9ydCB0eXBlIFBza3RSb2xlID0gJ0NSRUFUT1InIHwgJ1VQREFURVInIHwgJ1NJR05FUicgfCAnQ09NQklORVInIHwgJ0ZJTkFMSVpFUicgfCAnRVhUUkFDVE9SJztcblxuLy8g4pSA4pSA4pSAIEludGVyZmFjZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmV4cG9ydCBpbnRlcmZhY2UgUHNrdEtleVNvdXJjZSB7XG4gIC8qKiA0LWJ5dGUgbWFzdGVyIGZpbmdlcnByaW50LCBoZXgtZW5jb2RlZCAqL1xuICBrZXlGaW5nZXJwcmludDogc3RyaW5nO1xuICAvKiogQklQLTMyIGRlcml2YXRpb24gcGF0aCBzdHJpbmcsIGUuZy4gXCJtLzQ0Jy8xMTExMTEnLzAnLzAvMFwiICovXG4gIGRlcml2YXRpb25QYXRoOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHNrdEdsb2JhbCB7XG4gIC8qKiBQU0tUIHZlcnNpb24gKDAgPSBubyBwYXlsb2FkLCAxID0gcGF5bG9hZCBhbGxvd2VkKSAqL1xuICB2ZXJzaW9uOiAwIHwgMTtcbiAgLyoqIEthc3BhIHRyYW5zYWN0aW9uIHZlcnNpb24gKGN1cnJlbnRseSAwKSAqL1xuICB0eFZlcnNpb246IG51bWJlcjtcbiAgLyoqIEZhbGxiYWNrIGxvY2sgdGltZSAoYmxvY2sgb3IgdGltZXN0YW1wKSwgYXMgZGVjaW1hbCBzdHJpbmcgZm9yIEpTT04gc2FmZXR5ICovXG4gIGZhbGxiYWNrTG9ja1RpbWU/OiBzdHJpbmc7XG4gIC8qKiBXaGV0aGVyIGlucHV0cyBjYW4gc3RpbGwgYmUgYWRkZWQgKi9cbiAgaW5wdXRzTW9kaWZpYWJsZTogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgb3V0cHV0cyBjYW4gc3RpbGwgYmUgYWRkZWQgKi9cbiAgb3V0cHV0c01vZGlmaWFibGU6IGJvb2xlYW47XG4gIC8qKiBOdW1iZXIgb2YgaW5wdXRzIGluIHRoaXMgUFNLVCAqL1xuICBpbnB1dENvdW50OiBudW1iZXI7XG4gIC8qKiBOdW1iZXIgb2Ygb3V0cHV0cyBpbiB0aGlzIFBTS1QgKi9cbiAgb3V0cHV0Q291bnQ6IG51bWJlcjtcbiAgLyoqIEV4dGVuZGVkIHB1YmxpYyBrZXlzIGFuZCB0aGVpciBkZXJpdmF0aW9uIGluZm8gKi9cbiAgeHB1YnM6IFJlY29yZDxzdHJpbmcsIFBza3RLZXlTb3VyY2U+O1xuICAvKiogVHJhbnNhY3Rpb24gSUQgb25jZSBrbm93biAqL1xuICBpZD86IHN0cmluZztcbiAgLyoqIFByb3ByaWV0YXJ5IGtleS12YWx1ZSBwYWlycyAqL1xuICBwcm9wcmlldGFyaWVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgLyoqIEhleC1lbmNvZGVkIHRyYW5zYWN0aW9uIHBheWxvYWQgKHJlcXVpcmVzIHZlcnNpb24gPj0gMSkgKi9cbiAgcGF5bG9hZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQc2t0VXR4b0VudHJ5IHtcbiAgLyoqIEFtb3VudCBpbiBzb21waSAoZGVjaW1hbCBzdHJpbmcgZm9yIEpTT04gYmlnaW50IHNhZmV0eSkgKi9cbiAgYW1vdW50OiBzdHJpbmc7XG4gIC8qKiBIZXgtZW5jb2RlZCBzY3JpcHRQdWJsaWNLZXkgYnl0ZXMgKi9cbiAgc2NyaXB0UHVibGljS2V5OiBzdHJpbmc7XG4gIGJsb2NrRGFhU2NvcmU/OiBzdHJpbmc7XG4gIGlzQ29pbmJhc2U/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBza3RJbnB1dCB7XG4gIC8qKiBUaGUgb3V0cG9pbnQgYmVpbmcgc3BlbnQgKi9cbiAgcHJldmlvdXNPdXRwb2ludDogeyB0cmFuc2FjdGlvbklkOiBzdHJpbmc7IGluZGV4OiBudW1iZXIgfTtcbiAgLyoqXG4gICAqIFVUWE8gZGF0YSByZXF1aXJlZCBmb3Igc2lnaGFzaCBjb21wdXRhdGlvbi5cbiAgICogTXVzdCBiZSBwcmVzZW50IGJlZm9yZSBzaWduaW5nLlxuICAgKi9cbiAgdXR4b0VudHJ5PzogUHNrdFV0eG9FbnRyeTtcbiAgLyoqIFNlcXVlbmNlIG51bWJlciAodTY0IGFzIGRlY2ltYWwgc3RyaW5nOyBhYnNlbnQgPSB1NjQ6Ok1BWCAvIGZpbmFsaXR5KSAqL1xuICBzZXF1ZW5jZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFBhcnRpYWwgU2Nobm9yciBzaWduYXR1cmVzIGNvbGxlY3RlZCBzbyBmYXIuXG4gICAqIEtleTogMzMtYnl0ZSBjb21wcmVzc2VkIHNlY3AyNTZrMSBwdWJLZXkgaGV4LlxuICAgKiBWYWx1ZTogNjQtYnl0ZSByYXcgU2Nobm9yciBzaWduYXR1cmUgaGV4LlxuICAgKi9cbiAgcGFydGlhbFNpZ3M6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIC8qKiBTaWdIYXNoIHR5cGUgZm9yIHRoaXMgaW5wdXQgKGRlZmF1bHQ6IFNJR0hBU0hfQUxMID0gMHgwMSkgKi9cbiAgc2lnaGFzaFR5cGU6IG51bWJlcjtcbiAgLyoqIFNpZ25hdHVyZSBvcGVyYXRpb24gY291bnQgKi9cbiAgc2lnT3BDb3VudD86IG51bWJlcjtcbiAgLyoqXG4gICAqIEZpbmFsaXplZCBzY3JpcHRTaWcgKHNldCBieSB0aGUgRklOQUxJWkVSIHJvbGUpLlxuICAgKiBMYXlvdXQ6IDB4NDEgKE9QX0RBVEFfNjUpICsgNjQtYnl0ZSBzaWcgKyAxLWJ5dGUgc2lnaGFzaCB0eXBlID0gNjYgYnl0ZXMgaGV4LlxuICAgKi9cbiAgZmluYWxTY3JpcHRTaWc/OiBzdHJpbmc7XG4gIC8qKiBCSVAtMzIgZGVyaXZhdGlvbiBpbmZvIGZvciBrZXlzIHVzZWQgaW4gdGhpcyBpbnB1dCAqL1xuICBiaXAzMkRlcml2YXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBQc2t0S2V5U291cmNlPjtcbiAgLyoqIFByb3ByaWV0YXJ5IGtleS12YWx1ZSBwYWlycyAqL1xuICBwcm9wcmlldGFyaWVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQc2t0T3V0cHV0IHtcbiAgLyoqIEFtb3VudCBpbiBzb21waSAoZGVjaW1hbCBzdHJpbmcgZm9yIEpTT04gYmlnaW50IHNhZmV0eSkgKi9cbiAgYW1vdW50OiBzdHJpbmc7XG4gIC8qKiBTY3JpcHQgcHVibGljIGtleSAqL1xuICBzY3JpcHRQdWJsaWNLZXk6IHsgdmVyc2lvbjogbnVtYmVyOyBzY3JpcHRQdWJsaWNLZXk6IHN0cmluZyB9O1xuICAvKiogQklQLTMyIGRlcml2YXRpb24gaW5mbyBmb3Iga2V5cyB1c2VkIGluIHRoaXMgb3V0cHV0ICovXG4gIGJpcDMyRGVyaXZhdGlvbnM6IFJlY29yZDxzdHJpbmcsIFBza3RLZXlTb3VyY2U+O1xuICAvKiogUHJvcHJpZXRhcnkga2V5LXZhbHVlIHBhaXJzICovXG4gIHByb3ByaWV0YXJpZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG4vKiogV2lyZSBmb3JtYXQg4oCUIHdoYXQgYHNlcmlhbGl6ZSgpYCBwcm9kdWNlcyBhbmQgYGRlc2VyaWFsaXplKClgIGNvbnN1bWVzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJpYWxpemVkUHNrdCB7XG4gIHJvbGU6IFBza3RSb2xlO1xuICBnbG9iYWw6IFBza3RHbG9iYWw7XG4gIGlucHV0czogUHNrdElucHV0W107XG4gIG91dHB1dHM6IFBza3RPdXRwdXRbXTtcbn1cblxuLy8g4pSA4pSA4pSAIEludGVybmFsIGhlbHBlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmZ1bmN0aW9uIHJlcXVpcmVSb2xlKGN1cnJlbnQ6IFBza3RSb2xlLCAuLi5hbGxvd2VkOiBQc2t0Um9sZVtdKTogdm9pZCB7XG4gIGlmICghYWxsb3dlZC5pbmNsdWRlcyhjdXJyZW50KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgT3BlcmF0aW9uIHJlcXVpcmVzIHJvbGUgJHthbGxvd2VkLmpvaW4oJyBvciAnKX0sIGJ1dCBjdXJyZW50IHJvbGUgaXMgJHtjdXJyZW50fWApO1xuICB9XG59XG5cbi8qKlxuICogQnVpbGQgYSBgS2FzcGFUcmFuc2FjdGlvbkRhdGFgIGZyb20gUFNLVCBpbnRlcm5hbHMsIGZvciB1c2Ugd2l0aFxuICogYGNvbXB1dGVLYXNwYVNpZ25pbmdIYXNoYC4gRXZlcnkgaW5wdXQgbXVzdCBoYXZlIGB1dHhvRW50cnlgIHBvcHVsYXRlZC5cbiAqL1xuZnVuY3Rpb24gcHNrdFRvS2FzcGFUeERhdGEoZ2xvYmFsOiBQc2t0R2xvYmFsLCBpbnB1dHM6IFBza3RJbnB1dFtdLCBvdXRwdXRzOiBQc2t0T3V0cHV0W10pOiBLYXNwYVRyYW5zYWN0aW9uRGF0YSB7XG4gIGNvbnN0IGthc3BhSW5wdXRzOiBLYXNwYVV0eG9JbnB1dFtdID0gaW5wdXRzLm1hcCgoaW5wLCBpKSA9PiB7XG4gICAgaWYgKCFpbnAudXR4b0VudHJ5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnB1dFske2l9XSAoJHtpbnAucHJldmlvdXNPdXRwb2ludC50cmFuc2FjdGlvbklkfToke2lucC5wcmV2aW91c091dHBvaW50LmluZGV4fSkgYCArXG4gICAgICAgICAgYGlzIG1pc3NpbmcgdXR4b0VudHJ5IOKAlCByZXF1aXJlZCBmb3Igc2lnaGFzaCBjb21wdXRhdGlvbmBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB0cmFuc2FjdGlvbklkOiBpbnAucHJldmlvdXNPdXRwb2ludC50cmFuc2FjdGlvbklkLFxuICAgICAgdHJhbnNhY3Rpb25JbmRleDogaW5wLnByZXZpb3VzT3V0cG9pbnQuaW5kZXgsXG4gICAgICBhbW91bnQ6IGlucC51dHhvRW50cnkuYW1vdW50LFxuICAgICAgc2NyaXB0UHVibGljS2V5OiBpbnAudXR4b0VudHJ5LnNjcmlwdFB1YmxpY0tleSxcbiAgICAgIHNlcXVlbmNlOiBpbnAuc2VxdWVuY2UsXG4gICAgICBzaWdPcENvdW50OiBpbnAuc2lnT3BDb3VudCA/PyAxLFxuICAgIH07XG4gIH0pO1xuXG4gIGNvbnN0IGthc3BhT3V0cHV0czogS2FzcGFUcmFuc2FjdGlvbk91dHB1dFtdID0gb3V0cHV0cy5tYXAoKG91dCkgPT4gKHtcbiAgICBhZGRyZXNzOiAnJyxcbiAgICBhbW91bnQ6IG91dC5hbW91bnQsXG4gICAgc2NyaXB0UHVibGljS2V5OiBvdXQuc2NyaXB0UHVibGljS2V5LnNjcmlwdFB1YmxpY0tleSxcbiAgfSkpO1xuXG4gIHJldHVybiB7XG4gICAgdmVyc2lvbjogZ2xvYmFsLnR4VmVyc2lvbixcbiAgICBpbnB1dHM6IGthc3BhSW5wdXRzLFxuICAgIG91dHB1dHM6IGthc3BhT3V0cHV0cyxcbiAgICBsb2NrVGltZTogZ2xvYmFsLmZhbGxiYWNrTG9ja1RpbWUgPz8gJzAnLFxuICAgIHN1Ym5ldHdvcmtJZDogJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgIHBheWxvYWQ6IGdsb2JhbC5wYXlsb2FkID8/ICcnLFxuICB9O1xufVxuXG4vLyDilIDilIDilIAgUHNrdCBjbGFzcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBQU0tUIChQYXJ0aWFsbHkgU2lnbmVkIEthc3BhIFRyYW5zYWN0aW9uKS5cbiAqXG4gKiBNaXJyb3JzIHRoZSByb2xlLWJhc2VkIHdvcmtmbG93IG9mIEJpdGNvaW4ncyBQU0JUIGJ1dCB1c2VzIEthc3BhJ3Mgd2lyZVxuICogZm9ybWF0IChjYW1lbENhc2UgSlNPTiksIEJsYWtlMmIgc2lnaGFzaCwgYW5kIFNjaG5vcnIgc2lnbmF0dXJlcy5cbiAqXG4gKiBUeXBpY2FsIHNpbmdsZS1zaWduZXIgZmxvdzpcbiAqIGBgYHRzXG4gKiBjb25zdCBwc2t0ID0gUHNrdC5jcmVhdG9yKClcbiAqICAgLnRvVXBkYXRlcigpXG4gKiAgIC5pbnB1dCh7IC4uLiB9KVxuICogICAub3V0cHV0KHsgLi4uIH0pXG4gKiAgIC50b1NpZ25lcigpXG4gKiAgIC5zaWduKHByaXZhdGVLZXlCdWZmZXIpXG4gKiAgIC50b0ZpbmFsaXplcigpXG4gKiAgIC5maW5hbGl6ZSgpXG4gKiAgIC50b0V4dHJhY3RvcigpO1xuICpcbiAqIGNvbnN0IGJyb2FkY2FzdEpzb24gPSBwc2t0LmV4dHJhY3QoKTtcbiAqIGBgYFxuICpcbiAqIEhTTSAvIGV4dGVybmFsIHNpZ25pbmcgZmxvdzpcbiAqIGBgYHRzXG4gKiBjb25zdCB1bnNpZ25lZCA9IHBza3Quc2VyaWFsaXplKCk7ICAgICAgICAgIC8vIHNlbmQgdG8gSFNNXG4gKiBjb25zdCBzaWduZWQgICA9IFBza3QuZGVzZXJpYWxpemUoc2lnbmVkKTsgIC8vIHJlY2VpdmUgYmFja1xuICogY29uc3QgdHggICAgICAgPSBzaWduZWQudG9GaW5hbGl6ZXIoKS5maW5hbGl6ZSgpLnRvRXh0cmFjdG9yKCkuZXh0cmFjdCgpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBQc2t0IHtcbiAgcHJpdmF0ZSBfZ2xvYmFsOiBQc2t0R2xvYmFsO1xuICBwcml2YXRlIF9pbnB1dHM6IFBza3RJbnB1dFtdO1xuICBwcml2YXRlIF9vdXRwdXRzOiBQc2t0T3V0cHV0W107XG4gIHByaXZhdGUgX3JvbGU6IFBza3RSb2xlO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoZ2xvYmFsOiBQc2t0R2xvYmFsLCBpbnB1dHM6IFBza3RJbnB1dFtdLCBvdXRwdXRzOiBQc2t0T3V0cHV0W10sIHJvbGU6IFBza3RSb2xlKSB7XG4gICAgdGhpcy5fZ2xvYmFsID0geyAuLi5nbG9iYWwgfTtcbiAgICB0aGlzLl9pbnB1dHMgPSBpbnB1dHMubWFwKChpbnApID0+ICh7IC4uLmlucCwgcGFydGlhbFNpZ3M6IHsgLi4uaW5wLnBhcnRpYWxTaWdzIH0gfSkpO1xuICAgIHRoaXMuX291dHB1dHMgPSBvdXRwdXRzLm1hcCgob3V0KSA9PiAoeyAuLi5vdXQgfSkpO1xuICAgIHRoaXMuX3JvbGUgPSByb2xlO1xuICB9XG5cbiAgLy8g4pSA4pSAIEFjY2Vzc29ycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBnZXQgcm9sZSgpOiBQc2t0Um9sZSB7XG4gICAgcmV0dXJuIHRoaXMuX3JvbGU7XG4gIH1cblxuICBnZXQgZ2xvYmFsKCk6IFJlYWRvbmx5PFBza3RHbG9iYWw+IHtcbiAgICByZXR1cm4gdGhpcy5fZ2xvYmFsO1xuICB9XG5cbiAgZ2V0IGlucHV0cygpOiBSZWFkb25seUFycmF5PFJlYWRvbmx5PFBza3RJbnB1dD4+IHtcbiAgICByZXR1cm4gdGhpcy5faW5wdXRzO1xuICB9XG5cbiAgZ2V0IG91dHB1dHMoKTogUmVhZG9ubHlBcnJheTxSZWFkb25seTxQc2t0T3V0cHV0Pj4ge1xuICAgIHJldHVybiB0aGlzLl9vdXRwdXRzO1xuICB9XG5cbiAgLy8g4pSA4pSAIFN0YXRpYyBmYWN0b3JpZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBQU0tUIGluIENSRUFUT1Igcm9sZS5cbiAgICpcbiAgICogQHBhcmFtIHR4VmVyc2lvbiAgICAgICBLYXNwYSB0cmFuc2FjdGlvbiB2ZXJzaW9uIChjdXJyZW50bHkgMClcbiAgICogQHBhcmFtIGZhbGxiYWNrTG9ja1RpbWUgT3B0aW9uYWwgbG9jayB0aW1lIGFzIGRlY2ltYWwgc3RyaW5nXG4gICAqL1xuICBzdGF0aWMgY3JlYXRvcih0eFZlcnNpb24gPSAwLCBmYWxsYmFja0xvY2tUaW1lPzogc3RyaW5nKTogUHNrdCB7XG4gICAgY29uc3QgZ2xvYmFsOiBQc2t0R2xvYmFsID0ge1xuICAgICAgdmVyc2lvbjogMCxcbiAgICAgIHR4VmVyc2lvbixcbiAgICAgIGZhbGxiYWNrTG9ja1RpbWUsXG4gICAgICBpbnB1dHNNb2RpZmlhYmxlOiB0cnVlLFxuICAgICAgb3V0cHV0c01vZGlmaWFibGU6IHRydWUsXG4gICAgICBpbnB1dENvdW50OiAwLFxuICAgICAgb3V0cHV0Q291bnQ6IDAsXG4gICAgICB4cHViczoge30sXG4gICAgICBwcm9wcmlldGFyaWVzOiB7fSxcbiAgICB9O1xuICAgIHJldHVybiBuZXcgUHNrdChnbG9iYWwsIFtdLCBbXSwgJ0NSRUFUT1InKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvbnN0cnVjdCBhIFBTS1QgZnJvbSBhIGBLYXNwYVRyYW5zYWN0aW9uRGF0YWAgb2JqZWN0LlxuICAgKlxuICAgKiBUaGUgcmV0dXJuZWQgUFNLVCBpcyBwbGFjZWQgaW4gU0lHTkVSIHJvbGUgKGlucHV0cyBhcmUgbG9ja2VkLCBVVFhPIGRhdGFcbiAgICogaXMgcG9wdWxhdGVkLCBhbnkgZXhpc3RpbmcgYHNpZ25hdHVyZVNjcmlwdGAgaXMgY2FycmllZCBhcyBgZmluYWxTY3JpcHRTaWdgKS5cbiAgICogVXNlZCBieSBgVHJhbnNhY3Rpb24udG9Qc2t0KClgLlxuICAgKi9cbiAgc3RhdGljIGZyb21UeERhdGEodHhEYXRhOiBLYXNwYVRyYW5zYWN0aW9uRGF0YSk6IFBza3Qge1xuICAgIGNvbnN0IGdsb2JhbDogUHNrdEdsb2JhbCA9IHtcbiAgICAgIHZlcnNpb246IDAsXG4gICAgICB0eFZlcnNpb246IHR4RGF0YS52ZXJzaW9uLFxuICAgICAgZmFsbGJhY2tMb2NrVGltZTogdHhEYXRhLmxvY2tUaW1lID8/ICcwJyxcbiAgICAgIGlucHV0c01vZGlmaWFibGU6IGZhbHNlLFxuICAgICAgb3V0cHV0c01vZGlmaWFibGU6IGZhbHNlLFxuICAgICAgaW5wdXRDb3VudDogdHhEYXRhLmlucHV0cy5sZW5ndGgsXG4gICAgICBvdXRwdXRDb3VudDogdHhEYXRhLm91dHB1dHMubGVuZ3RoLFxuICAgICAgeHB1YnM6IHt9LFxuICAgICAgcHJvcHJpZXRhcmllczoge30sXG4gICAgICBwYXlsb2FkOiB0eERhdGEucGF5bG9hZCxcbiAgICB9O1xuXG4gICAgY29uc3QgaW5wdXRzOiBQc2t0SW5wdXRbXSA9IHR4RGF0YS5pbnB1dHMubWFwKChpbnApID0+ICh7XG4gICAgICBwcmV2aW91c091dHBvaW50OiB7IHRyYW5zYWN0aW9uSWQ6IGlucC50cmFuc2FjdGlvbklkLCBpbmRleDogaW5wLnRyYW5zYWN0aW9uSW5kZXggfSxcbiAgICAgIHV0eG9FbnRyeTogeyBhbW91bnQ6IGlucC5hbW91bnQsIHNjcmlwdFB1YmxpY0tleTogaW5wLnNjcmlwdFB1YmxpY0tleSB9LFxuICAgICAgc2VxdWVuY2U6IGlucC5zZXF1ZW5jZSxcbiAgICAgIHNpZ09wQ291bnQ6IGlucC5zaWdPcENvdW50LFxuICAgICAgcGFydGlhbFNpZ3M6IHt9LFxuICAgICAgc2lnaGFzaFR5cGU6IFNJR0hBU0hfQUxMLFxuICAgICAgLy8gQ2FycnkgYW55IGV4aXN0aW5nIHNpZ25hdHVyZVNjcmlwdCBhcyB0aGUgZmluYWxTY3JpcHRTaWdcbiAgICAgIGZpbmFsU2NyaXB0U2lnOiBpbnAuc2lnbmF0dXJlU2NyaXB0LFxuICAgICAgYmlwMzJEZXJpdmF0aW9uczoge30sXG4gICAgICBwcm9wcmlldGFyaWVzOiB7fSxcbiAgICB9KSk7XG5cbiAgICBjb25zdCBvdXRwdXRzOiBQc2t0T3V0cHV0W10gPSB0eERhdGEub3V0cHV0cy5tYXAoKG91dCkgPT4gKHtcbiAgICAgIGFtb3VudDogb3V0LmFtb3VudCxcbiAgICAgIHNjcmlwdFB1YmxpY0tleTogeyB2ZXJzaW9uOiAwLCBzY3JpcHRQdWJsaWNLZXk6IG91dC5zY3JpcHRQdWJsaWNLZXkgfHwgJycgfSxcbiAgICAgIGJpcDMyRGVyaXZhdGlvbnM6IHt9LFxuICAgICAgcHJvcHJpZXRhcmllczoge30sXG4gICAgfSkpO1xuXG4gICAgcmV0dXJuIG5ldyBQc2t0KGdsb2JhbCwgaW5wdXRzLCBvdXRwdXRzLCAnU0lHTkVSJyk7XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpc2UgYSBQU0tUIGZyb20gdGhlIEpTT04gc3RyaW5nIHByb2R1Y2VkIGJ5IGBzZXJpYWxpemUoKWAuXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemUoanNvbjogc3RyaW5nKTogUHNrdCB7XG4gICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoanNvbikgYXMgU2VyaWFsaXplZFBza3Q7XG4gICAgaWYgKCFkYXRhLnJvbGUgfHwgIWRhdGEuZ2xvYmFsIHx8ICFBcnJheS5pc0FycmF5KGRhdGEuaW5wdXRzKSB8fCAhQXJyYXkuaXNBcnJheShkYXRhLm91dHB1dHMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgUFNLVCBKU09OOiBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcycpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFBza3QoZGF0YS5nbG9iYWwsIGRhdGEuaW5wdXRzLCBkYXRhLm91dHB1dHMsIGRhdGEucm9sZSk7XG4gIH1cblxuICAvLyDilIDilIAgUm9sZSB0cmFuc2l0aW9ucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICB0b1VwZGF0ZXIoKTogUHNrdCB7XG4gICAgcmVxdWlyZVJvbGUodGhpcy5fcm9sZSwgJ0NSRUFUT1InKTtcbiAgICByZXR1cm4gbmV3IFBza3QodGhpcy5fZ2xvYmFsLCB0aGlzLl9pbnB1dHMsIHRoaXMuX291dHB1dHMsICdVUERBVEVSJyk7XG4gIH1cblxuICB0b1NpZ25lcigpOiBQc2t0IHtcbiAgICByZXF1aXJlUm9sZSh0aGlzLl9yb2xlLCAnVVBEQVRFUicpO1xuICAgIC8vIExvY2sgc3RydWN0dXJlIGJlZm9yZSBzaWduaW5nXG4gICAgcmV0dXJuIG5ldyBQc2t0KFxuICAgICAgeyAuLi50aGlzLl9nbG9iYWwsIGlucHV0c01vZGlmaWFibGU6IGZhbHNlLCBvdXRwdXRzTW9kaWZpYWJsZTogZmFsc2UgfSxcbiAgICAgIHRoaXMuX2lucHV0cyxcbiAgICAgIHRoaXMuX291dHB1dHMsXG4gICAgICAnU0lHTkVSJ1xuICAgICk7XG4gIH1cblxuICB0b0NvbWJpbmVyKCk6IFBza3Qge1xuICAgIHJlcXVpcmVSb2xlKHRoaXMuX3JvbGUsICdTSUdORVInKTtcbiAgICByZXR1cm4gbmV3IFBza3QodGhpcy5fZ2xvYmFsLCB0aGlzLl9pbnB1dHMsIHRoaXMuX291dHB1dHMsICdDT01CSU5FUicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zaXRpb24gdG8gRklOQUxJWkVSIHJvbGUuXG4gICAqIEFsbG93ZWQgZnJvbSBib3RoIFNJR05FUiAoc2luZ2xlLXBhcnR5IHNob3J0Y3V0KSBhbmQgQ09NQklORVIuXG4gICAqL1xuICB0b0ZpbmFsaXplcigpOiBQc2t0IHtcbiAgICByZXF1aXJlUm9sZSh0aGlzLl9yb2xlLCAnU0lHTkVSJywgJ0NPTUJJTkVSJyk7XG4gICAgcmV0dXJuIG5ldyBQc2t0KHRoaXMuX2dsb2JhbCwgdGhpcy5faW5wdXRzLCB0aGlzLl9vdXRwdXRzLCAnRklOQUxJWkVSJyk7XG4gIH1cblxuICAvKipcbiAgICogVHJhbnNpdGlvbiB0byBFWFRSQUNUT1Igcm9sZS5cbiAgICogQWxsIGlucHV0cyBtdXN0IGhhdmUgYSBgZmluYWxTY3JpcHRTaWdgIChjYWxsIGBmaW5hbGl6ZSgpYCBmaXJzdCkuXG4gICAqL1xuICB0b0V4dHJhY3RvcigpOiBQc2t0IHtcbiAgICByZXF1aXJlUm9sZSh0aGlzLl9yb2xlLCAnRklOQUxJWkVSJyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9pbnB1dHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghdGhpcy5faW5wdXRzW2ldLmZpbmFsU2NyaXB0U2lnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW5wdXRbJHtpfV0gaXMgbm90IGZpbmFsaXNlZCDigJQgY2FsbCBmaW5hbGl6ZSgpIGJlZm9yZSB0b0V4dHJhY3RvcigpYCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXcgUHNrdCh0aGlzLl9nbG9iYWwsIHRoaXMuX2lucHV0cywgdGhpcy5fb3V0cHV0cywgJ0VYVFJBQ1RPUicpO1xuICB9XG5cbiAgLy8g4pSA4pSAIENSRUFUT1IgLyBVUERBVEVSIG11dGF0aW9ucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogQWRkIGFuIGlucHV0LiBPbmx5IGFsbG93ZWQgaW4gQ1JFQVRPUiBvciBVUERBVEVSIHJvbGUuXG4gICAqL1xuICBpbnB1dChpbnA6IFBza3RJbnB1dCk6IHRoaXMge1xuICAgIHJlcXVpcmVSb2xlKHRoaXMuX3JvbGUsICdDUkVBVE9SJywgJ1VQREFURVInKTtcbiAgICBpZiAoIXRoaXMuX2dsb2JhbC5pbnB1dHNNb2RpZmlhYmxlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0lucHV0cyBhcmUgbG9ja2VkIChpbnB1dHNNb2RpZmlhYmxlID0gZmFsc2UpJyk7XG4gICAgfVxuICAgIHRoaXMuX2lucHV0cy5wdXNoKHsgLi4uaW5wLCBwYXJ0aWFsU2lnczogeyAuLi5pbnAucGFydGlhbFNpZ3MgfSB9KTtcbiAgICB0aGlzLl9nbG9iYWwuaW5wdXRDb3VudCA9IHRoaXMuX2lucHV0cy5sZW5ndGg7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGFuIG91dHB1dC4gT25seSBhbGxvd2VkIGluIENSRUFUT1Igb3IgVVBEQVRFUiByb2xlLlxuICAgKi9cbiAgb3V0cHV0KG91dDogUHNrdE91dHB1dCk6IHRoaXMge1xuICAgIHJlcXVpcmVSb2xlKHRoaXMuX3JvbGUsICdDUkVBVE9SJywgJ1VQREFURVInKTtcbiAgICBpZiAoIXRoaXMuX2dsb2JhbC5vdXRwdXRzTW9kaWZpYWJsZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdPdXRwdXRzIGFyZSBsb2NrZWQgKG91dHB1dHNNb2RpZmlhYmxlID0gZmFsc2UpJyk7XG4gICAgfVxuICAgIHRoaXMuX291dHB1dHMucHVzaCh7IC4uLm91dCB9KTtcbiAgICB0aGlzLl9nbG9iYWwub3V0cHV0Q291bnQgPSB0aGlzLl9vdXRwdXRzLmxlbmd0aDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIOKUgOKUgCBTSUdORVIgb3BlcmF0aW9ucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogU2lnbiBhbGwgaW5wdXRzIHdpdGggYSBwcml2YXRlIGtleSAoc2luZ2xlLWtleSAvIG5vbi1IU00gcGF0aCkuXG4gICAqXG4gICAqIENvbXB1dGVzIGEgZGlzdGluY3Qga2V5ZWQgQmxha2UyYi0yNTYgc2lnaGFzaCBwZXIgaW5wdXQgKEthc3BhJ3NcbiAgICogQklQLTE0My1saWtlIHNjaGVtZSkgYW5kIHdyaXRlcyB0aGUgNjQtYnl0ZSBTY2hub3JyIHNpZ25hdHVyZSBpbnRvXG4gICAqIGBwYXJ0aWFsU2lnc1tjb21wcmVzc2VkUHViS2V5SGV4XWAgZm9yIGVhY2ggaW5wdXQuXG4gICAqXG4gICAqIEBwYXJhbSBwcml2YXRlS2V5ICAzMi1ieXRlIHByaXZhdGUga2V5IGJ1ZmZlclxuICAgKiBAcGFyYW0gc2lnSGFzaFR5cGUgU2lnSGFzaCB0eXBlIChkZWZhdWx0OiBTSUdIQVNIX0FMTCA9IDB4MDEpXG4gICAqL1xuICBzaWduKHByaXZhdGVLZXk6IEJ1ZmZlciwgc2lnSGFzaFR5cGU6IG51bWJlciA9IFNJR0hBU0hfQUxMKTogdGhpcyB7XG4gICAgcmVxdWlyZVJvbGUodGhpcy5fcm9sZSwgJ1NJR05FUicpO1xuICAgIGlmIChwcml2YXRlS2V5Lmxlbmd0aCAhPT0gMzIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgMzItYnl0ZSBwcml2YXRlIGtleSwgZ290ICR7cHJpdmF0ZUtleS5sZW5ndGh9YCk7XG4gICAgfVxuXG4gICAgLy8gRGVyaXZlIHRoZSBjb21wcmVzc2VkIHB1YmxpYyBrZXkgdXNpbmcgdGhlIGV4aXN0aW5nIEtleVBhaXIgaW5mcmFzdHJ1Y3R1cmVcbiAgICBjb25zdCBrcCA9IG5ldyBLZXlQYWlyKHsgcHJ2OiBwcml2YXRlS2V5LnRvU3RyaW5nKCdoZXgnKSB9KTtcbiAgICBjb25zdCBwdWJLZXlIZXggPSBrcC5nZXRLZXlzKCkucHViIGFzIHN0cmluZztcblxuICAgIGNvbnN0IHR4RGF0YSA9IHBza3RUb0thc3BhVHhEYXRhKHRoaXMuX2dsb2JhbCwgdGhpcy5faW5wdXRzLCB0aGlzLl9vdXRwdXRzKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5faW5wdXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBpbnB1dFNpZ2hhc2hUeXBlID0gdGhpcy5faW5wdXRzW2ldLnNpZ2hhc2hUeXBlID8/IHNpZ0hhc2hUeXBlO1xuICAgICAgY29uc3Qgc2lnSGFzaCA9IGNvbXB1dGVLYXNwYVNpZ25pbmdIYXNoKHR4RGF0YSwgaSwgaW5wdXRTaWdoYXNoVHlwZSk7XG4gICAgICBjb25zdCBzaWcgPSBCdWZmZXIuZnJvbShlY2Muc2lnblNjaG5vcnIoc2lnSGFzaCwgcHJpdmF0ZUtleSkpO1xuICAgICAgdGhpcy5faW5wdXRzW2ldLnBhcnRpYWxTaWdzW3B1YktleUhleF0gPSBzaWcudG9TdHJpbmcoJ2hleCcpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29yZCBhbiBleHRlcm5hbGx5LXByb2R1Y2VkIFNjaG5vcnIgc2lnbmF0dXJlIGZvciBvbmUgc3BlY2lmaWMgaW5wdXQuXG4gICAqXG4gICAqIEhTTSAvIE1QQ3YyIGZsb3c6XG4gICAqIGBgYHRzXG4gICAqIGNvbnN0IGpzb24gID0gcHNrdC5zZXJpYWxpemUoKTsgICAgICAgICAgICAgICAgICAvLyDihpIgSFNNXG4gICAqIC8vIEhTTSBzaWducyBlYWNoIGlucHV0J3Mgc2lnaGFzaCBhbmQgcmV0dXJucyBzaWduYXR1cmVzXG4gICAqIHBza3QuYWRkU2lnbmF0dXJlKDAsIHB1YktleUhleCwgc2lnMEhleClcbiAgICogICAgIC5hZGRTaWduYXR1cmUoMSwgcHViS2V5SGV4LCBzaWcxSGV4KTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dEluZGV4ICAwLWJhc2VkIGluZGV4IG9mIHRoZSBpbnB1dCBiZWluZyBzaWduZWRcbiAgICogQHBhcmFtIHB1YktleUhleCAgIDMzLWJ5dGUgY29tcHJlc3NlZCBzZWNwMjU2azEgcHViS2V5LCBoZXgtZW5jb2RlZFxuICAgKiBAcGFyYW0gc2lnSGV4ICAgICAgNjQtYnl0ZSBTY2hub3JyIHNpZ25hdHVyZSwgaGV4LWVuY29kZWRcbiAgICogQHBhcmFtIHNpZ0hhc2hUeXBlIFNpZ0hhc2ggdHlwZSB1c2VkIHdoZW4gcHJvZHVjaW5nIHRoZSBzaWduYXR1cmVcbiAgICovXG4gIGFkZFNpZ25hdHVyZShpbnB1dEluZGV4OiBudW1iZXIsIHB1YktleUhleDogc3RyaW5nLCBzaWdIZXg6IHN0cmluZywgc2lnSGFzaFR5cGU6IG51bWJlciA9IFNJR0hBU0hfQUxMKTogdGhpcyB7XG4gICAgcmVxdWlyZVJvbGUodGhpcy5fcm9sZSwgJ1NJR05FUicpO1xuICAgIGlmIChpbnB1dEluZGV4IDwgMCB8fCBpbnB1dEluZGV4ID49IHRoaXMuX2lucHV0cy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW5wdXQgaW5kZXggJHtpbnB1dEluZGV4fSBpcyBvdXQgb2YgcmFuZ2UgKHR4IGhhcyAke3RoaXMuX2lucHV0cy5sZW5ndGh9IGlucHV0cylgKTtcbiAgICB9XG4gICAgY29uc3Qgc2lnQnVmID0gQnVmZmVyLmZyb20oc2lnSGV4LCAnaGV4Jyk7XG4gICAgaWYgKHNpZ0J1Zi5sZW5ndGggIT09IDY0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIDY0LWJ5dGUgU2Nobm9yciBzaWduYXR1cmUsIGdvdCAke3NpZ0J1Zi5sZW5ndGh9IGJ5dGVzYCk7XG4gICAgfVxuICAgIHRoaXMuX2lucHV0c1tpbnB1dEluZGV4XS5wYXJ0aWFsU2lnc1twdWJLZXlIZXhdID0gc2lnSGV4O1xuICAgIHRoaXMuX2lucHV0c1tpbnB1dEluZGV4XS5zaWdoYXNoVHlwZSA9IHNpZ0hhc2hUeXBlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g4pSA4pSAIENPTUJJTkVSIG9wZXJhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogTWVyZ2UgYHBhcnRpYWxTaWdzYCBmcm9tIGFub3RoZXIgUFNLVCBpbnRvIHRoaXMgb25lLlxuICAgKlxuICAgKiBCb3RoIFBTS1RzIG11c3QgcmVwcmVzZW50IHRoZSBzYW1lIHRyYW5zYWN0aW9uIChzYW1lIG51bWJlciBvZiBpbnB1dHMgYW5kXG4gICAqIG91dHB1dHMpLiBDb25mbGljdGluZyBzaWduYXR1cmVzIGZvciB0aGUgc2FtZSBwdWJLZXkgcmFpc2UgYW4gZXJyb3IuXG4gICAqL1xuICBjb21iaW5lKG90aGVyOiBQc2t0KTogdGhpcyB7XG4gICAgcmVxdWlyZVJvbGUodGhpcy5fcm9sZSwgJ0NPTUJJTkVSJyk7XG4gICAgaWYgKG90aGVyLl9pbnB1dHMubGVuZ3RoICE9PSB0aGlzLl9pbnB1dHMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgY29tYmluZTogaW5wdXQgY291bnQgbWlzbWF0Y2ggKHRoaXM9JHt0aGlzLl9pbnB1dHMubGVuZ3RofSwgb3RoZXI9JHtvdGhlci5faW5wdXRzLmxlbmd0aH0pYFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKG90aGVyLl9vdXRwdXRzLmxlbmd0aCAhPT0gdGhpcy5fb3V0cHV0cy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbm5vdCBjb21iaW5lOiBvdXRwdXQgY291bnQgbWlzbWF0Y2ggKHRoaXM9JHt0aGlzLl9vdXRwdXRzLmxlbmd0aH0sIG90aGVyPSR7b3RoZXIuX291dHB1dHMubGVuZ3RofSlgXG4gICAgICApO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2lucHV0cy5sZW5ndGg7IGkrKykge1xuICAgICAgZm9yIChjb25zdCBbcHViS2V5LCBzaWddIG9mIE9iamVjdC5lbnRyaWVzKG90aGVyLl9pbnB1dHNbaV0ucGFydGlhbFNpZ3MpKSB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5faW5wdXRzW2ldLnBhcnRpYWxTaWdzW3B1YktleV07XG4gICAgICAgIGlmIChleGlzdGluZyAmJiBleGlzdGluZyAhPT0gc2lnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb25mbGljdGluZyBzaWduYXR1cmUgZm9yIGlucHV0WyR7aX1dIHB1YktleSAke3B1YktleS5zbGljZSgwLCAxNil9Li4uYCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faW5wdXRzW2ldLnBhcnRpYWxTaWdzW3B1YktleV0gPSBzaWc7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g4pSA4pSAIEZJTkFMSVpFUiBvcGVyYXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEZpbmFsaXNlIGFsbCBpbnB1dHM6IHByb21vdGUgdGhlIGZpcnN0IGBwYXJ0aWFsU2lnYCBvbiBlYWNoIGlucHV0IGludG9cbiAgICogYGZpbmFsU2NyaXB0U2lnYCB1c2luZyBLYXNwYSdzIHB1c2gtb25seSBzY3JpcHQgbGF5b3V0OlxuICAgKiAgIGAweDQxYCAoT1BfREFUQV82NSkgKyA2NC1ieXRlIFNjaG5vcnIgc2lnICsgMS1ieXRlIHNpZ2hhc2ggdHlwZSA9IDY2IGJ5dGVzXG4gICAqXG4gICAqIElucHV0cyB0aGF0IGFscmVhZHkgaGF2ZSBhIGBmaW5hbFNjcmlwdFNpZ2AgYXJlIGxlZnQgdW5jaGFuZ2VkLlxuICAgKi9cbiAgZmluYWxpemUoKTogdGhpcyB7XG4gICAgcmVxdWlyZVJvbGUodGhpcy5fcm9sZSwgJ0ZJTkFMSVpFUicpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5faW5wdXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBpbnAgPSB0aGlzLl9pbnB1dHNbaV07XG4gICAgICBpZiAoaW5wLmZpbmFsU2NyaXB0U2lnKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKGlucC5wYXJ0aWFsU2lncyk7XG4gICAgICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnB1dFske2l9XSBoYXMgbm8gcGFydGlhbCBzaWduYXR1cmVzIOKAlCBjYW5ub3QgZmluYWxpc2VgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IFssIHNpZ0hleF0gPSBlbnRyaWVzWzBdO1xuICAgICAgY29uc3Qgc2lnID0gQnVmZmVyLmZyb20oc2lnSGV4LCAnaGV4Jyk7XG4gICAgICBpZiAoc2lnLmxlbmd0aCAhPT0gNjQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnB1dFske2l9XSBwYXJ0aWFsIHNpZ25hdHVyZSBpcyAke3NpZy5sZW5ndGh9IGJ5dGVzLCBleHBlY3RlZCA2NGApO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2lnaGFzaFR5cGUgPSBpbnAuc2lnaGFzaFR5cGUgPz8gU0lHSEFTSF9BTEw7XG4gICAgICAvLyBQdXNoLW9ubHkgc2NyaXB0U2lnOiBPUF9EQVRBXzY1ICsgNjQtYnl0ZSBzaWcgKyAxLWJ5dGUgc2lnaGFzaCB0eXBlXG4gICAgICBpbnAuZmluYWxTY3JpcHRTaWcgPSBCdWZmZXIuY29uY2F0KFtCdWZmZXIuZnJvbShbMHg0MV0pLCBzaWcsIEJ1ZmZlci5mcm9tKFtzaWdoYXNoVHlwZV0pXSkudG9TdHJpbmcoJ2hleCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIOKUgOKUgCBFWFRSQUNUT1Igb3BlcmF0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBFeHRyYWN0IHRoZSBicm9hZGNhc3QtcmVhZHkgdHJhbnNhY3Rpb24gYXMgYSBKU09OIHN0cmluZy5cbiAgICpcbiAgICogUHJvZHVjZXMgdGhlIHNhbWUgd2lyZSBmb3JtYXQgYXMgYFRyYW5zYWN0aW9uLnRvQnJvYWRjYXN0Rm9ybWF0KClgLlxuICAgKiBNdXN0IGJlIGluIEVYVFJBQ1RPUiByb2xlIChjYWxsIGAudG9GaW5hbGl6ZXIoKS5maW5hbGl6ZSgpLnRvRXh0cmFjdG9yKClgIGZpcnN0KS5cbiAgICovXG4gIGV4dHJhY3QoKTogc3RyaW5nIHtcbiAgICByZXF1aXJlUm9sZSh0aGlzLl9yb2xlLCAnRVhUUkFDVE9SJyk7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIHZlcnNpb246IHRoaXMuX2dsb2JhbC50eFZlcnNpb24sXG4gICAgICBpbnB1dHM6IHRoaXMuX2lucHV0cy5tYXAoKGlucCkgPT4gKHtcbiAgICAgICAgcHJldmlvdXNPdXRwb2ludDoge1xuICAgICAgICAgIHRyYW5zYWN0aW9uSWQ6IGlucC5wcmV2aW91c091dHBvaW50LnRyYW5zYWN0aW9uSWQsXG4gICAgICAgICAgaW5kZXg6IGlucC5wcmV2aW91c091dHBvaW50LmluZGV4LFxuICAgICAgICB9LFxuICAgICAgICBzaWduYXR1cmVTY3JpcHQ6IGlucC5maW5hbFNjcmlwdFNpZyB8fCAnJyxcbiAgICAgICAgc2VxdWVuY2U6IE51bWJlcihpbnAuc2VxdWVuY2UgPz8gMCksXG4gICAgICAgIHNpZ09wQ291bnQ6IGlucC5zaWdPcENvdW50ID8/IDEsXG4gICAgICB9KSksXG4gICAgICBvdXRwdXRzOiB0aGlzLl9vdXRwdXRzLm1hcCgob3V0KSA9PiAoe1xuICAgICAgICBhbW91bnQ6IE51bWJlcihvdXQuYW1vdW50KSxcbiAgICAgICAgc2NyaXB0UHVibGljS2V5OiB7XG4gICAgICAgICAgdmVyc2lvbjogb3V0LnNjcmlwdFB1YmxpY0tleS52ZXJzaW9uLFxuICAgICAgICAgIHNjcmlwdFB1YmxpY0tleTogb3V0LnNjcmlwdFB1YmxpY0tleS5zY3JpcHRQdWJsaWNLZXksXG4gICAgICAgIH0sXG4gICAgICB9KSksXG4gICAgICBsb2NrVGltZTogTnVtYmVyKHRoaXMuX2dsb2JhbC5mYWxsYmFja0xvY2tUaW1lID8/IDApLFxuICAgICAgc3VibmV0d29ya0lkOiAnMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgICBnYXM6IDAsXG4gICAgICBwYXlsb2FkOiB0aGlzLl9nbG9iYWwucGF5bG9hZCA/PyAnJyxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBTZXJpYWxpemF0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBTZXJpYWxpc2UgdGhlIFBTS1QgdG8gYSBKU09OIHN0cmluZyBmb3IgdHJhbnNtaXNzaW9uIChlLmcuIHRvIGFuIEhTTSkuXG4gICAqIFRoZSBgcm9sZWAgaXMgaW5jbHVkZWQgc28gYFBza3QuZGVzZXJpYWxpemUoKWAgY2FuIHJlY29uc3RydWN0IHRoZSBzdGF0ZS5cbiAgICovXG4gIHNlcmlhbGl6ZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHdpcmU6IFNlcmlhbGl6ZWRQc2t0ID0ge1xuICAgICAgcm9sZTogdGhpcy5fcm9sZSxcbiAgICAgIGdsb2JhbDogdGhpcy5fZ2xvYmFsLFxuICAgICAgaW5wdXRzOiB0aGlzLl9pbnB1dHMsXG4gICAgICBvdXRwdXRzOiB0aGlzLl9vdXRwdXRzLFxuICAgIH07XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHdpcmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgdGhlIFBTS1QncyBpbnRlcm5hbCBkYXRhIGJhY2sgdG8gYSBgS2FzcGFUcmFuc2FjdGlvbkRhdGFgIG9iamVjdC5cbiAgICpcbiAgICogYGZpbmFsU2NyaXB0U2lnYCAoaWYgcHJlc2VudCkgaXMgbWFwcGVkIHRvIGBzaWduYXR1cmVTY3JpcHRgIHNvIHRoYXQgdGhlXG4gICAqIHJlc3VsdGluZyBgVHJhbnNhY3Rpb25gIGlzIGZ1bGx5IHNpZ25lZCBhbmQgcmVhZHkgdG8gYnJvYWRjYXN0LlxuICAgKiBVc2VkIGJ5IGBUcmFuc2FjdGlvbi5mcm9tUHNrdCgpYC5cbiAgICovXG4gIHRvVHhEYXRhKCk6IEthc3BhVHJhbnNhY3Rpb25EYXRhIHtcbiAgICByZXR1cm4ge1xuICAgICAgdmVyc2lvbjogdGhpcy5fZ2xvYmFsLnR4VmVyc2lvbixcbiAgICAgIGlucHV0czogdGhpcy5faW5wdXRzLm1hcCgoaW5wKSA9PiAoe1xuICAgICAgICB0cmFuc2FjdGlvbklkOiBpbnAucHJldmlvdXNPdXRwb2ludC50cmFuc2FjdGlvbklkLFxuICAgICAgICB0cmFuc2FjdGlvbkluZGV4OiBpbnAucHJldmlvdXNPdXRwb2ludC5pbmRleCxcbiAgICAgICAgYW1vdW50OiBpbnAudXR4b0VudHJ5Py5hbW91bnQgPz8gJzAnLFxuICAgICAgICBzY3JpcHRQdWJsaWNLZXk6IGlucC51dHhvRW50cnk/LnNjcmlwdFB1YmxpY0tleSA/PyAnJyxcbiAgICAgICAgc2VxdWVuY2U6IGlucC5zZXF1ZW5jZSxcbiAgICAgICAgc2lnT3BDb3VudDogaW5wLnNpZ09wQ291bnQsXG4gICAgICAgIHNpZ25hdHVyZVNjcmlwdDogaW5wLmZpbmFsU2NyaXB0U2lnLFxuICAgICAgfSkpLFxuICAgICAgb3V0cHV0czogdGhpcy5fb3V0cHV0cy5tYXAoKG91dCkgPT4gKHtcbiAgICAgICAgYWRkcmVzczogJycsXG4gICAgICAgIGFtb3VudDogb3V0LmFtb3VudCxcbiAgICAgICAgc2NyaXB0UHVibGljS2V5OiBvdXQuc2NyaXB0UHVibGljS2V5LnNjcmlwdFB1YmxpY0tleSxcbiAgICAgIH0pKSxcbiAgICAgIGxvY2tUaW1lOiB0aGlzLl9nbG9iYWwuZmFsbGJhY2tMb2NrVGltZSA/PyAnMCcsXG4gICAgICBzdWJuZXR3b3JrSWQ6ICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAgIHBheWxvYWQ6IHRoaXMuX2dsb2JhbC5wYXlsb2FkID8/ICcnLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
439
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHNrdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcHNrdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRzs7O0FBRUgscURBQTRDO0FBRTVDLHVDQUFvRDtBQUNwRCwyQ0FBMEM7QUFDMUMsdUNBQW9DO0FBbUdwQyxpRkFBaUY7QUFFakYsU0FBUyxXQUFXLENBQUMsT0FBaUIsRUFBRSxHQUFHLE9BQW1CO0lBQzVELElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMseUJBQXlCLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDckcsQ0FBQztBQUNILENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLGlCQUFpQixDQUFDLE1BQWtCLEVBQUUsTUFBbUIsRUFBRSxPQUFxQjtJQUN2RixNQUFNLFdBQVcsR0FBcUIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUMxRCxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ25CLE1BQU0sSUFBSSxLQUFLLENBQ2IsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLGdCQUFnQixDQUFDLGFBQWEsSUFBSSxHQUFHLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxJQUFJO2dCQUNsRix5REFBeUQsQ0FDNUQsQ0FBQztRQUNKLENBQUM7UUFDRCxPQUFPO1lBQ0wsYUFBYSxFQUFFLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhO1lBQ2pELGdCQUFnQixFQUFFLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLO1lBQzVDLE1BQU0sRUFBRSxHQUFHLENBQUMsU0FBUyxDQUFDLE1BQU07WUFDNUIsZUFBZSxFQUFFLEdBQUcsQ0FBQyxTQUFTLENB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QUFZLEVBQUUsMENBQTBDO1lBQ3hELE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxFQUFFO1NBQ3BDLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUF6WUQsb0JBeVlDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQU0tUIOKAlCBQYXJ0aWFsbHkgU2lnbmVkIEthc3BhIFRyYW5zYWN0aW9uXG4gKlxuICogS2FzcGEncyBuYXRpdmUgYW5hbG9ndWUgb2YgQml0Y29pbidzIFBTQlQgKEJJUC0xNzQpLCBpbXBsZW1lbnRlZCBpblxuICogVHlwZVNjcmlwdCB3aXRoIHplcm8gZXh0ZXJuYWwgZGVwZW5kZW5jaWVzLiBXaXJlIGZvcm1hdCBpcyBwbGFpbiBjYW1lbENhc2VcbiAqIEpTT04sIG1hdGNoaW5nIHRoZSBzZXJkZSBzZXJpYWxpc2F0aW9uIG9mIHJ1c3R5LWthc3BhJ3Mgd2FsbGV0L3Bza3QgY3JhdGUuXG4gKlxuICogUmVmZXJlbmNlOiBodHRwczovL2dpdGh1Yi5jb20va2FzcGFuZXQvcnVzdHkta2FzcGEvdHJlZS9tYXN0ZXIvd2FsbGV0L3Bza3RcbiAqXG4gKiBSb2xlIHN0YXRlIG1hY2hpbmU6XG4gKiAgIENSRUFUT1Ig4oaSIFVQREFURVIg4oaSIFNJR05FUiDilIDilKzihpIgQ09NQklORVIg4oaSIEZJTkFMSVpFUiDihpIgRVhUUkFDVE9SXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4oaSIEZJTkFMSVpFUiDihpIgRVhUUkFDVE9SXG4gKlxuICogS2V5IGRpZmZlcmVuY2UgZnJvbSB0aGUgY3VycmVudCBKU09OLWhleCBmbG93OlxuICogICBTaWduYXR1cmVzIGFyZSBzdG9yZWQgaW4gYHBhcnRpYWxTaWdzYCBwZXIgaW5wdXQgdW50aWwgdGhlIEZJTkFMSVpFUlxuICogICByb2xlIHByb21vdGVzIHRoZW0gaW50byB0aGUgcHVzaC1vbmx5IGBmaW5hbFNjcmlwdFNpZ2AuIFRoaXMgbGV0cyBhblxuICogICBleHRlcm5hbCBIU00gb3IgYSBzZWNvbmQgcGFydHkgcmVjZWl2ZSB0aGUgc2VyaWFsaXNlZCBQU0tULCBjYWxsXG4gKiAgIGBhZGRTaWduYXR1cmUoKWAsIGFuZCByZXR1cm4gaXQg4oCUIGlkZW50aWNhbCB0byBob3cgUFNCVCB3b3JrcyBmb3IgQlRDLlxuICovXG5cbmltcG9ydCB7IGVjYyB9IGZyb20gJ0BiaXRnby1iZXRhL3NlY3AyNTZrMSc7XG5pbXBvcnQgeyBLYXNwYVRyYW5zYWN0aW9uRGF0YSwgS2FzcGFVdHhvSW5wdXQsIEthc3BhVHJhbnNhY3Rpb25PdXRwdXQgfSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IGNvbXB1dGVLYXNwYVNpZ25pbmdIYXNoIH0gZnJvbSAnLi9zaWdoYXNoJztcbmltcG9ydCB7IFNJR0hBU0hfQUxMIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgS2V5UGFpciB9IGZyb20gJy4va2V5UGFpcic7XG5cbi8vIOKUgOKUgOKUgCBSb2xlIHR5cGVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5leHBvcnQgdHlwZSBQc2t0Um9sZSA9ICdDUkVBVE9SJyB8ICdVUERBVEVSJyB8ICdTSUdORVInIHwgJ0NPTUJJTkVSJyB8ICdGSU5BTElaRVInIHwgJ0VYVFJBQ1RPUic7XG5cbi8vIOKUgOKUgOKUgCBJbnRlcmZhY2VzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5leHBvcnQgaW50ZXJmYWNlIFBza3RLZXlTb3VyY2Uge1xuICAvKiogNC1ieXRlIG1hc3RlciBmaW5nZXJwcmludCwgaGV4LWVuY29kZWQgKi9cbiAga2V5RmluZ2VycHJpbnQ6IHN0cmluZztcbiAgLyoqIEJJUC0zMiBkZXJpdmF0aW9uIHBhdGggc3RyaW5nLCBlLmcuIFwibS80NCcvMTExMTExJy8wJy8wLzBcIiAqL1xuICBkZXJpdmF0aW9uUGF0aDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBza3RHbG9iYWwge1xuICAvKiogUFNLVCB2ZXJzaW9uICgwID0gbm8gcGF5bG9hZCwgMSA9IHBheWxvYWQgYWxsb3dlZCkgKi9cbiAgdmVyc2lvbjogMCB8IDE7XG4gIC8qKiBLYXNwYSB0cmFuc2FjdGlvbiB2ZXJzaW9uIChjdXJyZW50bHkgMCkgKi9cbiAgdHhWZXJzaW9uOiBudW1iZXI7XG4gIC8qKiBGYWxsYmFjayBsb2NrIHRpbWUgKGJsb2NrIG9yIHRpbWVzdGFtcCksIGFzIGRlY2ltYWwgc3RyaW5nIGZvciBKU09OIHNhZmV0eSAqL1xuICBmYWxsYmFja0xvY2tUaW1lPzogc3RyaW5nO1xuICAvKiogV2hldGhlciBpbnB1dHMgY2FuIHN0aWxsIGJlIGFkZGVkICovXG4gIGlucHV0c01vZGlmaWFibGU6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIG91dHB1dHMgY2FuIHN0aWxsIGJlIGFkZGVkICovXG4gIG91dHB1dHNNb2RpZmlhYmxlOiBib29sZWFuO1xuICAvKiogTnVtYmVyIG9mIGlucHV0cyBpbiB0aGlzIFBTS1QgKi9cbiAgaW5wdXRDb3VudDogbnVtYmVyO1xuICAvKiogTnVtYmVyIG9mIG91dHB1dHMgaW4gdGhpcyBQU0tUICovXG4gIG91dHB1dENvdW50OiBudW1iZXI7XG4gIC8qKiBFeHRlbmRlZCBwdWJsaWMga2V5cyBhbmQgdGhlaXIgZGVyaXZhdGlvbiBpbmZvICovXG4gIHhwdWJzOiBSZWNvcmQ8c3RyaW5nLCBQc2t0S2V5U291cmNlPjtcbiAgLyoqIFRyYW5zYWN0aW9uIElEIG9uY2Uga25vd24gKi9cbiAgaWQ/OiBzdHJpbmc7XG4gIC8qKiBQcm9wcmlldGFyeSBrZXktdmFsdWUgcGFpcnMgKi9cbiAgcHJvcHJpZXRhcmllczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIC8qKiBIZXgtZW5jb2RlZCB0cmFuc2FjdGlvbiBwYXlsb2FkIChyZXF1aXJlcyB2ZXJzaW9uID49IDEpICovXG4gIHBheWxvYWQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHNrdFV0eG9FbnRyeSB7XG4gIC8qKiBBbW91bnQgaW4gc29tcGkgKGRlY2ltYWwgc3RyaW5nIGZvciBKU09OIGJpZ2ludCBzYWZldHkpICovXG4gIGFtb3VudDogc3RyaW5nO1xuICAvKiogSGV4LWVuY29kZWQgc2NyaXB0UHVibGljS2V5IGJ5dGVzICovXG4gIHNjcmlwdFB1YmxpY0tleTogc3RyaW5nO1xuICBibG9ja0RhYVNjb3JlPzogc3RyaW5nO1xuICBpc0NvaW5iYXNlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQc2t0SW5wdXQge1xuICAvKiogVGhlIG91dHBvaW50IGJlaW5nIHNwZW50ICovXG4gIHByZXZpb3VzT3V0cG9pbnQ6IHsgdHJhbnNhY3Rpb25JZDogc3RyaW5nOyBpbmRleDogbnVtYmVyIH07XG4gIC8qKlxuICAgKiBVVFhPIGRhdGEgcmVxdWlyZWQgZm9yIHNpZ2hhc2ggY29tcHV0YXRpb24uXG4gICAqIE11c3QgYmUgcHJlc2VudCBiZWZvcmUgc2lnbmluZy5cbiAgICovXG4gIHV0eG9FbnRyeT86IFBza3RVdHhvRW50cnk7XG4gIC8qKiBTZXF1ZW5jZSBudW1iZXIgKHU2NCBhcyBkZWNpbWFsIHN0cmluZzsgYWJzZW50ID0gdTY0OjpNQVggLyBmaW5hbGl0eSkgKi9cbiAgc2VxdWVuY2U/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQYXJ0aWFsIFNjaG5vcnIgc2lnbmF0dXJlcyBjb2xsZWN0ZWQgc28gZmFyLlxuICAgKiBLZXk6IDMzLWJ5dGUgY29tcHJlc3NlZCBzZWNwMjU2azEgcHViS2V5IGhleC5cbiAgICogVmFsdWU6IDY0LWJ5dGUgcmF3IFNjaG5vcnIgc2lnbmF0dXJlIGhleC5cbiAgICovXG4gIHBhcnRpYWxTaWdzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAvKiogU2lnSGFzaCB0eXBlIGZvciB0aGlzIGlucHV0IChkZWZhdWx0OiBTSUdIQVNIX0FMTCA9IDB4MDEpICovXG4gIHNpZ2hhc2hUeXBlOiBudW1iZXI7XG4gIC8qKiBTaWduYXR1cmUgb3BlcmF0aW9uIGNvdW50ICovXG4gIHNpZ09wQ291bnQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBGaW5hbGl6ZWQgc2NyaXB0U2lnIChzZXQgYnkgdGhlIEZJTkFMSVpFUiByb2xlKS5cbiAgICogTGF5b3V0OiAweDQxIChPUF9EQVRBXzY1KSArIDY0LWJ5dGUgc2lnICsgMS1ieXRlIHNpZ2hhc2ggdHlwZSA9IDY2IGJ5dGVzIGhleC5cbiAgICovXG4gIGZpbmFsU2NyaXB0U2lnPzogc3RyaW5nO1xuICAvKiogQklQLTMyIGRlcml2YXRpb24gaW5mbyBmb3Iga2V5cyB1c2VkIGluIHRoaXMgaW5wdXQgKi9cbiAgYmlwMzJEZXJpdmF0aW9uczogUmVjb3JkPHN0cmluZywgUHNrdEtleVNvdXJjZT47XG4gIC8qKiBQcm9wcmlldGFyeSBrZXktdmFsdWUgcGFpcnMgKi9cbiAgcHJvcHJpZXRhcmllczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHNrdE91dHB1dCB7XG4gIC8qKiBBbW91bnQgaW4gc29tcGkgKGRlY2ltYWwgc3RyaW5nIGZvciBKU09OIGJpZ2ludCBzYWZldHkpICovXG4gIGFtb3VudDogc3RyaW5nO1xuICAvKiogU2NyaXB0IHB1YmxpYyBrZXkgKi9cbiAgc2NyaXB0UHVibGljS2V5OiB7IHZlcnNpb246IG51bWJlcjsgc2NyaXB0UHVibGljS2V5OiBzdHJpbmcgfTtcbiAgLyoqIEJJUC0zMiBkZXJpdmF0aW9uIGluZm8gZm9yIGtleXMgdXNlZCBpbiB0aGlzIG91dHB1dCAqL1xuICBiaXAzMkRlcml2YXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBQc2t0S2V5U291cmNlPjtcbiAgLyoqIFByb3ByaWV0YXJ5IGtleS12YWx1ZSBwYWlycyAqL1xuICBwcm9wcmlldGFyaWVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLyoqIFdpcmUgZm9ybWF0IOKAlCB3aGF0IGBzZXJpYWxpemUoKWAgcHJvZHVjZXMgYW5kIGBkZXNlcmlhbGl6ZSgpYCBjb25zdW1lcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VyaWFsaXplZFBza3Qge1xuICByb2xlOiBQc2t0Um9sZTtcbiAgZ2xvYmFsOiBQc2t0R2xvYmFsO1xuICBpbnB1dHM6IFBza3RJbnB1dFtdO1xuICBvdXRwdXRzOiBQc2t0T3V0cHV0W107XG59XG5cbi8vIOKUgOKUgOKUgCBJbnRlcm5hbCBoZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5mdW5jdGlvbiByZXF1aXJlUm9sZShjdXJyZW50OiBQc2t0Um9sZSwgLi4uYWxsb3dlZDogUHNrdFJvbGVbXSk6IHZvaWQge1xuICBpZiAoIWFsbG93ZWQuaW5jbHVkZXMoY3VycmVudCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE9wZXJhdGlvbiByZXF1aXJlcyByb2xlICR7YWxsb3dlZC5qb2luKCcgb3IgJyl9LCBidXQgY3VycmVudCByb2xlIGlzICR7Y3VycmVudH1gKTtcbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkIGEgYEthc3BhVHJhbnNhY3Rpb25EYXRhYCBmcm9tIFBTS1QgaW50ZXJuYWxzLCBmb3IgdXNlIHdpdGhcbiAqIGBjb21wdXRlS2FzcGFTaWduaW5nSGFzaGAuIEV2ZXJ5IGlucHV0IG11c3QgaGF2ZSBgdXR4b0VudHJ5YCBwb3B1bGF0ZWQuXG4gKi9cbmZ1bmN0aW9uIHBza3RUb0thc3BhVHhEYXRhKGdsb2JhbDogUHNrdEdsb2JhbCwgaW5wdXRzOiBQc2t0SW5wdXRbXSwgb3V0cHV0czogUHNrdE91dHB1dFtdKTogS2FzcGFUcmFuc2FjdGlvbkRhdGEge1xuICBjb25zdCBrYXNwYUlucHV0czogS2FzcGFVdHhvSW5wdXRbXSA9IGlucHV0cy5tYXAoKGlucCwgaSkgPT4ge1xuICAgIGlmICghaW5wLnV0eG9FbnRyeSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW5wdXRbJHtpfV0gKCR7aW5wLnByZXZpb3VzT3V0cG9pbnQudHJhbnNhY3Rpb25JZH06JHtpbnAucHJldmlvdXNPdXRwb2ludC5pbmRleH0pIGAgK1xuICAgICAgICAgIGBpcyBtaXNzaW5nIHV0eG9FbnRyeSDigJQgcmVxdWlyZWQgZm9yIHNpZ2hhc2ggY29tcHV0YXRpb25gXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgdHJhbnNhY3Rpb25JZDogaW5wLnByZXZpb3VzT3V0cG9pbnQudHJhbnNhY3Rpb25JZCxcbiAgICAgIHRyYW5zYWN0aW9uSW5kZXg6IGlucC5wcmV2aW91c091dHBvaW50LmluZGV4LFxuICAgICAgYW1vdW50OiBpbnAudXR4b0VudHJ5LmFtb3VudCxcbiAgICAgIHNjcmlwdFB1YmxpY0tleTogaW5wLnV0eG9FbnRyeS5zY3JpcHRQdWJsaWNLZXksXG4gICAgICBzZXF1ZW5jZTogaW5wLnNlcXVlbmNlLFxuICAgICAgc2lnT3BDb3VudDogaW5wLnNpZ09wQ291bnQgPz8gMSxcbiAgICB9O1xuICB9KTtcblxuICBjb25zdCBrYXNwYU91dHB1dHM6IEthc3BhVHJhbnNhY3Rpb25PdXRwdXRbXSA9IG91dHB1dHMubWFwKChvdXQpID0+ICh7XG4gICAgYWRkcmVzczogJycsXG4gICAgYW1vdW50OiBvdXQuYW1vdW50LFxuICAgIHNjcmlwdFB1YmxpY0tleTogb3V0LnNjcmlwdFB1YmxpY0tleS5zY3JpcHRQdWJsaWNLZXksXG4gIH0pKTtcblxuICByZXR1cm4ge1xuICAgIHZlcnNpb246IGdsb2JhbC50eFZlcnNpb24sXG4gICAgaW5wdXRzOiBrYXNwYUlucHV0cyxcbiAgICBvdXRwdXRzOiBrYXNwYU91dHB1dHMsXG4gICAgbG9ja1RpbWU6IGdsb2JhbC5mYWxsYmFja0xvY2tUaW1lID8/ICcwJyxcbiAgICBzdWJuZXR3b3JrSWQ6ICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICBwYXlsb2FkOiBnbG9iYWwucGF5bG9hZCA/PyAnJyxcbiAgfTtcbn1cblxuLy8g4pSA4pSA4pSAIFBza3QgY2xhc3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogUFNLVCAoUGFydGlhbGx5IFNpZ25lZCBLYXNwYSBUcmFuc2FjdGlvbikuXG4gKlxuICogTWlycm9ycyB0aGUgcm9sZS1iYXNlZCB3b3JrZmxvdyBvZiBCaXRjb2luJ3MgUFNCVCBidXQgdXNlcyBLYXNwYSdzIHdpcmVcbiAqIGZvcm1hdCAoY2FtZWxDYXNlIEpTT04pLCBCbGFrZTJiIHNpZ2hhc2gsIGFuZCBTY2hub3JyIHNpZ25hdHVyZXMuXG4gKlxuICogVHlwaWNhbCBzaW5nbGUtc2lnbmVyIGZsb3c6XG4gKiBgYGB0c1xuICogY29uc3QgcHNrdCA9IFBza3QuY3JlYXRvcigpXG4gKiAgIC50b1VwZGF0ZXIoKVxuICogICAuaW5wdXQoeyAuLi4gfSlcbiAqICAgLm91dHB1dCh7IC4uLiB9KVxuICogICAudG9TaWduZXIoKVxuICogICAuc2lnbihwcml2YXRlS2V5QnVmZmVyKVxuICogICAudG9GaW5hbGl6ZXIoKVxuICogICAuZmluYWxpemUoKVxuICogICAudG9FeHRyYWN0b3IoKTtcbiAqXG4gKiBjb25zdCBicm9hZGNhc3RKc29uID0gcHNrdC5leHRyYWN0KCk7XG4gKiBgYGBcbiAqXG4gKiBIU00gLyBleHRlcm5hbCBzaWduaW5nIGZsb3c6XG4gKiBgYGB0c1xuICogY29uc3QgdW5zaWduZWQgPSBwc2t0LnNlcmlhbGl6ZSgpOyAgICAgICAgICAvLyBzZW5kIHRvIEhTTVxuICogY29uc3Qgc2lnbmVkICAgPSBQc2t0LmRlc2VyaWFsaXplKHNpZ25lZCk7ICAvLyByZWNlaXZlIGJhY2tcbiAqIGNvbnN0IHR4ICAgICAgID0gc2lnbmVkLnRvRmluYWxpemVyKCkuZmluYWxpemUoKS50b0V4dHJhY3RvcigpLmV4dHJhY3QoKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgUHNrdCB7XG4gIHByaXZhdGUgX2dsb2JhbDogUHNrdEdsb2JhbDtcbiAgcHJpdmF0ZSBfaW5wdXRzOiBQc2t0SW5wdXRbXTtcbiAgcHJpdmF0ZSBfb3V0cHV0czogUHNrdE91dHB1dFtdO1xuICBwcml2YXRlIF9yb2xlOiBQc2t0Um9sZTtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKGdsb2JhbDogUHNrdEdsb2JhbCwgaW5wdXRzOiBQc2t0SW5wdXRbXSwgb3V0cHV0czogUHNrdE91dHB1dFtdLCByb2xlOiBQc2t0Um9sZSkge1xuICAgIHRoaXMuX2dsb2JhbCA9IHsgLi4uZ2xvYmFsIH07XG4gICAgdGhpcy5faW5wdXRzID0gaW5wdXRzLm1hcCgoaW5wKSA9PiAoeyAuLi5pbnAsIHBhcnRpYWxTaWdzOiB7IC4uLmlucC5wYXJ0aWFsU2lncyB9IH0pKTtcbiAgICB0aGlzLl9vdXRwdXRzID0gb3V0cHV0cy5tYXAoKG91dCkgPT4gKHsgLi4ub3V0IH0pKTtcbiAgICB0aGlzLl9yb2xlID0gcm9sZTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBBY2Nlc3NvcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgZ2V0IHJvbGUoKTogUHNrdFJvbGUge1xuICAgIHJldHVybiB0aGlzLl9yb2xlO1xuICB9XG5cbiAgZ2V0IGdsb2JhbCgpOiBSZWFkb25seTxQc2t0R2xvYmFsPiB7XG4gICAgcmV0dXJuIHRoaXMuX2dsb2JhbDtcbiAgfVxuXG4gIGdldCBpbnB1dHMoKTogUmVhZG9ubHlBcnJheTxSZWFkb25seTxQc2t0SW5wdXQ+PiB7XG4gICAgcmV0dXJuIHRoaXMuX2lucHV0cztcbiAgfVxuXG4gIGdldCBvdXRwdXRzKCk6IFJlYWRvbmx5QXJyYXk8UmVhZG9ubHk8UHNrdE91dHB1dD4+IHtcbiAgICByZXR1cm4gdGhpcy5fb3V0cHV0cztcbiAgfVxuXG4gIC8vIOKUgOKUgCBTdGF0aWMgZmFjdG9yaWVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgUFNLVCBpbiBDUkVBVE9SIHJvbGUuXG4gICAqXG4gICAqIEBwYXJhbSB0eFZlcnNpb24gICAgICAgS2FzcGEgdHJhbnNhY3Rpb24gdmVyc2lvbiAoY3VycmVudGx5IDApXG4gICAqIEBwYXJhbSBmYWxsYmFja0xvY2tUaW1lIE9wdGlvbmFsIGxvY2sgdGltZSBhcyBkZWNpbWFsIHN0cmluZ1xuICAgKi9cbiAgc3RhdGljIGNyZWF0b3IodHhWZXJzaW9uID0gMCwgZmFsbGJhY2tMb2NrVGltZT86IHN0cmluZyk6IFBza3Qge1xuICAgIGNvbnN0IGdsb2JhbDogUHNrdEdsb2JhbCA9IHtcbiAgICAgIHZlcnNpb246IDAsXG4gICAgICB0eFZlcnNpb24sXG4gICAgICBmYWxsYmFja0xvY2tUaW1lLFxuICAgICAgaW5wdXRzTW9kaWZpYWJsZTogdHJ1ZSxcbiAgICAgIG91dHB1dHNNb2RpZmlhYmxlOiB0cnVlLFxuICAgICAgaW5wdXRDb3VudDogMCxcbiAgICAgIG91dHB1dENvdW50OiAwLFxuICAgICAgeHB1YnM6IHt9LFxuICAgICAgcHJvcHJpZXRhcmllczoge30sXG4gICAgfTtcbiAgICByZXR1cm4gbmV3IFBza3QoZ2xvYmFsLCBbXSwgW10sICdDUkVBVE9SJyk7XG4gIH1cblxuICAvKipcbiAgICogUmVjb25zdHJ1Y3QgYSBQU0tUIGZyb20gYSBgS2FzcGFUcmFuc2FjdGlvbkRhdGFgIG9iamVjdC5cbiAgICpcbiAgICogVGhlIHJldHVybmVkIFBTS1QgaXMgcGxhY2VkIGluIFNJR05FUiByb2xlIChpbnB1dHMgYXJlIGxvY2tlZCwgVVRYTyBkYXRhXG4gICAqIGlzIHBvcHVsYXRlZCwgYW55IGV4aXN0aW5nIGBzaWduYXR1cmVTY3JpcHRgIGlzIGNhcnJpZWQgYXMgYGZpbmFsU2NyaXB0U2lnYCkuXG4gICAqIFVzZWQgYnkgYFRyYW5zYWN0aW9uLnRvUHNrdCgpYC5cbiAgICovXG4gIHN0YXRpYyBmcm9tVHhEYXRhKHR4RGF0YTogS2FzcGFUcmFuc2FjdGlvbkRhdGEpOiBQc2t0IHtcbiAgICBjb25zdCBnbG9iYWw6IFBza3RHbG9iYWwgPSB7XG4gICAgICB2ZXJzaW9uOiAwLFxuICAgICAgdHhWZXJzaW9uOiB0eERhdGEudmVyc2lvbixcbiAgICAgIGZhbGxiYWNrTG9ja1RpbWU6IHR4RGF0YS5sb2NrVGltZSA/PyAnMCcsXG4gICAgICBpbnB1dHNNb2RpZmlhYmxlOiBmYWxzZSxcbiAgICAgIG91dHB1dHNNb2RpZmlhYmxlOiBmYWxzZSxcbiAgICAgIGlucHV0Q291bnQ6IHR4RGF0YS5pbnB1dHMubGVuZ3RoLFxuICAgICAgb3V0cHV0Q291bnQ6IHR4RGF0YS5vdXRwdXRzLmxlbmd0aCxcbiAgICAgIHhwdWJzOiB7fSxcbiAgICAgIHByb3ByaWV0YXJpZXM6IHt9LFxuICAgICAgcGF5bG9hZDogdHhEYXRhLnBheWxvYWQsXG4gICAgfTtcblxuICAgIGNvbnN0IGlucHV0czogUHNrdElucHV0W10gPSB0eERhdGEuaW5wdXRzLm1hcCgoaW5wKSA9PiAoe1xuICAgICAgcHJldmlvdXNPdXRwb2ludDogeyB0cmFuc2FjdGlvbklkOiBpbnAudHJhbnNhY3Rpb25JZCwgaW5kZXg6IGlucC50cmFuc2FjdGlvbkluZGV4IH0sXG4gICAgICB1dHhvRW50cnk6IHsgYW1vdW50OiBpbnAuYW1vdW50LCBzY3JpcHRQdWJsaWNLZXk6IGlucC5zY3JpcHRQdWJsaWNLZXkgfSxcbiAgICAgIHNlcXVlbmNlOiBpbnAuc2VxdWVuY2UsXG4gICAgICBzaWdPcENvdW50OiBpbnAuc2lnT3BDb3VudCxcbiAgICAgIHBhcnRpYWxTaWdzOiB7fSxcbiAgICAgIHNpZ2hhc2hUeXBlOiBTSUdIQVNIX0FMTCxcbiAgICAgIC8vIENhcnJ5IGFueSBleGlzdGluZyBzaWduYXR1cmVTY3JpcHQgYXMgdGhlIGZpbmFsU2NyaXB0U2lnXG4gICAgICBmaW5hbFNjcmlwdFNpZzogaW5wLnNpZ25hdHVyZVNjcmlwdCxcbiAgICAgIGJpcDMyRGVyaXZhdGlvbnM6IHt9LFxuICAgICAgcHJvcHJpZXRhcmllczoge30sXG4gICAgfSkpO1xuXG4gICAgY29uc3Qgb3V0cHV0czogUHNrdE91dHB1dFtdID0gdHhEYXRhLm91dHB1dHMubWFwKChvdXQpID0+ICh7XG4gICAgICBhbW91bnQ6IG91dC5hbW91bnQsXG4gICAgICBzY3JpcHRQdWJsaWNLZXk6IHsgdmVyc2lvbjogMCwgc2NyaXB0UHVibGljS2V5OiBvdXQuc2NyaXB0UHVibGljS2V5IHx8ICcnIH0sXG4gICAgICBiaXAzMkRlcml2YXRpb25zOiB7fSxcbiAgICAgIHByb3ByaWV0YXJpZXM6IHt9LFxuICAgIH0pKTtcblxuICAgIHJldHVybiBuZXcgUHNrdChnbG9iYWwsIGlucHV0cywgb3V0cHV0cywgJ1NJR05FUicpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXNlIGEgUFNLVCBmcm9tIHRoZSBKU09OIHN0cmluZyBwcm9kdWNlZCBieSBgc2VyaWFsaXplKClgLlxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplKGpzb246IHN0cmluZyk6IFBza3Qge1xuICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGpzb24pIGFzIFNlcmlhbGl6ZWRQc2t0O1xuICAgIGlmICghZGF0YS5yb2xlIHx8ICFkYXRhLmdsb2JhbCB8fCAhQXJyYXkuaXNBcnJheShkYXRhLmlucHV0cykgfHwgIUFycmF5LmlzQXJyYXkoZGF0YS5vdXRwdXRzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFBTS1QgSlNPTjogbWlzc2luZyByZXF1aXJlZCBmaWVsZHMnKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBQc2t0KGRhdGEuZ2xvYmFsLCBkYXRhLmlucHV0cywgZGF0YS5vdXRwdXRzLCBkYXRhLnJvbGUpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFJvbGUgdHJhbnNpdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgdG9VcGRhdGVyKCk6IFBza3Qge1xuICAgIHJlcXVpcmVSb2xlKHRoaXMuX3JvbGUsICdDUkVBVE9SJyk7XG4gICAgcmV0dXJuIG5ldyBQc2t0KHRoaXMuX2dsb2JhbCwgdGhpcy5faW5wdXRzLCB0aGlzLl9vdXRwdXRzLCAnVVBEQVRFUicpO1xuICB9XG5cbiAgdG9TaWduZXIoKTogUHNrdCB7XG4gICAgcmVxdWlyZVJvbGUodGhpcy5fcm9sZSwgJ1VQREFURVInKTtcbiAgICAvLyBMb2NrIHN0cnVjdHVyZSBiZWZvcmUgc2lnbmluZ1xuICAgIHJldHVybiBuZXcgUHNrdChcbiAgICAgIHsgLi4udGhpcy5fZ2xvYmFsLCBpbnB1dHNNb2RpZmlhYmxlOiBmYWxzZSwgb3V0cHV0c01vZGlmaWFibGU6IGZhbHNlIH0sXG4gICAgICB0aGlzLl9pbnB1dHMsXG4gICAgICB0aGlzLl9vdXRwdXRzLFxuICAgICAgJ1NJR05FUidcbiAgICApO1xuICB9XG5cbiAgdG9Db21iaW5lcigpOiBQc2t0IHtcbiAgICByZXF1aXJlUm9sZSh0aGlzLl9yb2xlLCAnU0lHTkVSJyk7XG4gICAgcmV0dXJuIG5ldyBQc2t0KHRoaXMuX2dsb2JhbCwgdGhpcy5faW5wdXRzLCB0aGlzLl9vdXRwdXRzLCAnQ09NQklORVInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2l0aW9uIHRvIEZJTkFMSVpFUiByb2xlLlxuICAgKiBBbGxvd2VkIGZyb20gYm90aCBTSUdORVIgKHNpbmdsZS1wYXJ0eSBzaG9ydGN1dCkgYW5kIENPTUJJTkVSLlxuICAgKi9cbiAgdG9GaW5hbGl6ZXIoKTogUHNrdCB7XG4gICAgcmVxdWlyZVJvbGUodGhpcy5fcm9sZSwgJ1NJR05FUicsICdDT01CSU5FUicpO1xuICAgIHJldHVybiBuZXcgUHNrdCh0aGlzLl9nbG9iYWwsIHRoaXMuX2lucHV0cywgdGhpcy5fb3V0cHV0cywgJ0ZJTkFMSVpFUicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zaXRpb24gdG8gRVhUUkFDVE9SIHJvbGUuXG4gICAqIEFsbCBpbnB1dHMgbXVzdCBoYXZlIGEgYGZpbmFsU2NyaXB0U2lnYCAoY2FsbCBgZmluYWxpemUoKWAgZmlyc3QpLlxuICAgKi9cbiAgdG9FeHRyYWN0b3IoKTogUHNrdCB7XG4gICAgcmVxdWlyZVJvbGUodGhpcy5fcm9sZSwgJ0ZJTkFMSVpFUicpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5faW5wdXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIXRoaXMuX2lucHV0c1tpXS5maW5hbFNjcmlwdFNpZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYElucHV0WyR7aX1dIGlzIG5vdCBmaW5hbGlzZWQg4oCUIGNhbGwgZmluYWxpemUoKSBiZWZvcmUgdG9FeHRyYWN0b3IoKWApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3IFBza3QodGhpcy5fZ2xvYmFsLCB0aGlzLl9pbnB1dHMsIHRoaXMuX291dHB1dHMsICdFWFRSQUNUT1InKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBDUkVBVE9SIC8gVVBEQVRFUiBtdXRhdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEFkZCBhbiBpbnB1dC4gT25seSBhbGxvd2VkIGluIENSRUFUT1Igb3IgVVBEQVRFUiByb2xlLlxuICAgKi9cbiAgaW5wdXQoaW5wOiBQc2t0SW5wdXQpOiB0aGlzIHtcbiAgICByZXF1aXJlUm9sZSh0aGlzLl9yb2xlLCAnQ1JFQVRPUicsICdVUERBVEVSJyk7XG4gICAgaWYgKCF0aGlzLl9nbG9iYWwuaW5wdXRzTW9kaWZpYWJsZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnB1dHMgYXJlIGxvY2tlZCAoaW5wdXRzTW9kaWZpYWJsZSA9IGZhbHNlKScpO1xuICAgIH1cbiAgICB0aGlzLl9pbnB1dHMucHVzaCh7IC4uLmlucCwgcGFydGlhbFNpZ3M6IHsgLi4uaW5wLnBhcnRpYWxTaWdzIH0gfSk7XG4gICAgdGhpcy5fZ2xvYmFsLmlucHV0Q291bnQgPSB0aGlzLl9pbnB1dHMubGVuZ3RoO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhbiBvdXRwdXQuIE9ubHkgYWxsb3dlZCBpbiBDUkVBVE9SIG9yIFVQREFURVIgcm9sZS5cbiAgICovXG4gIG91dHB1dChvdXQ6IFBza3RPdXRwdXQpOiB0aGlzIHtcbiAgICByZXF1aXJlUm9sZSh0aGlzLl9yb2xlLCAnQ1JFQVRPUicsICdVUERBVEVSJyk7XG4gICAgaWYgKCF0aGlzLl9nbG9iYWwub3V0cHV0c01vZGlmaWFibGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignT3V0cHV0cyBhcmUgbG9ja2VkIChvdXRwdXRzTW9kaWZpYWJsZSA9IGZhbHNlKScpO1xuICAgIH1cbiAgICB0aGlzLl9vdXRwdXRzLnB1c2goeyAuLi5vdXQgfSk7XG4gICAgdGhpcy5fZ2xvYmFsLm91dHB1dENvdW50ID0gdGhpcy5fb3V0cHV0cy5sZW5ndGg7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyDilIDilIAgU0lHTkVSIG9wZXJhdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFNpZ24gYWxsIGlucHV0cyB3aXRoIGEgcHJpdmF0ZSBrZXkgKHNpbmdsZS1rZXkgLyBub24tSFNNIHBhdGgpLlxuICAgKlxuICAgKiBDb21wdXRlcyBhIGRpc3RpbmN0IGtleWVkIEJsYWtlMmItMjU2IHNpZ2hhc2ggcGVyIGlucHV0IChLYXNwYSdzXG4gICAqIEJJUC0xNDMtbGlrZSBzY2hlbWUpIGFuZCB3cml0ZXMgdGhlIDY0LWJ5dGUgU2Nobm9yciBzaWduYXR1cmUgaW50b1xuICAgKiBgcGFydGlhbFNpZ3NbY29tcHJlc3NlZFB1YktleUhleF1gIGZvciBlYWNoIGlucHV0LlxuICAgKlxuICAgKiBAcGFyYW0gcHJpdmF0ZUtleSAgMzItYnl0ZSBwcml2YXRlIGtleSBidWZmZXJcbiAgICogQHBhcmFtIHNpZ0hhc2hUeXBlIFNpZ0hhc2ggdHlwZSAoZGVmYXVsdDogU0lHSEFTSF9BTEwgPSAweDAxKVxuICAgKi9cbiAgc2lnbihwcml2YXRlS2V5OiBCdWZmZXIsIHNpZ0hhc2hUeXBlOiBudW1iZXIgPSBTSUdIQVNIX0FMTCk6IHRoaXMge1xuICAgIHJlcXVpcmVSb2xlKHRoaXMuX3JvbGUsICdTSUdORVInKTtcbiAgICBpZiAocHJpdmF0ZUtleS5sZW5ndGggIT09IDMyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIDMyLWJ5dGUgcHJpdmF0ZSBrZXksIGdvdCAke3ByaXZhdGVLZXkubGVuZ3RofWApO1xuICAgIH1cblxuICAgIC8vIERlcml2ZSB0aGUgY29tcHJlc3NlZCBwdWJsaWMga2V5IHVzaW5nIHRoZSBleGlzdGluZyBLZXlQYWlyIGluZnJhc3RydWN0dXJlXG4gICAgY29uc3Qga3AgPSBuZXcgS2V5UGFpcih7IHBydjogcHJpdmF0ZUtleS50b1N0cmluZygnaGV4JykgfSk7XG4gICAgY29uc3QgcHViS2V5SGV4ID0ga3AuZ2V0S2V5cygpLnB1YiBhcyBzdHJpbmc7XG5cbiAgICBjb25zdCB0eERhdGEgPSBwc2t0VG9LYXNwYVR4RGF0YSh0aGlzLl9nbG9iYWwsIHRoaXMuX2lucHV0cywgdGhpcy5fb3V0cHV0cyk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2lucHV0cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgaW5wdXRTaWdoYXNoVHlwZSA9IHRoaXMuX2lucHV0c1tpXS5zaWdoYXNoVHlwZSA/PyBzaWdIYXNoVHlwZTtcbiAgICAgIGNvbnN0IHNpZ0hhc2ggPSBjb21wdXRlS2FzcGFTaWduaW5nSGFzaCh0eERhdGEsIGksIGlucHV0U2lnaGFzaFR5cGUpO1xuICAgICAgY29uc3Qgc2lnID0gQnVmZmVyLmZyb20oZWNjLnNpZ25TY2hub3JyKHNpZ0hhc2gsIHByaXZhdGVLZXkpKTtcbiAgICAgIHRoaXMuX2lucHV0c1tpXS5wYXJ0aWFsU2lnc1twdWJLZXlIZXhdID0gc2lnLnRvU3RyaW5nKCdoZXgnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmQgYW4gZXh0ZXJuYWxseS1wcm9kdWNlZCBTY2hub3JyIHNpZ25hdHVyZSBmb3Igb25lIHNwZWNpZmljIGlucHV0LlxuICAgKlxuICAgKiBIU00gLyBNUEN2MiBmbG93OlxuICAgKiBgYGB0c1xuICAgKiBjb25zdCBqc29uICA9IHBza3Quc2VyaWFsaXplKCk7ICAgICAgICAgICAgICAgICAgLy8g4oaSIEhTTVxuICAgKiAvLyBIU00gc2lnbnMgZWFjaCBpbnB1dCdzIHNpZ2hhc2ggYW5kIHJldHVybnMgc2lnbmF0dXJlc1xuICAgKiBwc2t0LmFkZFNpZ25hdHVyZSgwLCBwdWJLZXlIZXgsIHNpZzBIZXgpXG4gICAqICAgICAuYWRkU2lnbmF0dXJlKDEsIHB1YktleUhleCwgc2lnMUhleCk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXRJbmRleCAgMC1iYXNlZCBpbmRleCBvZiB0aGUgaW5wdXQgYmVpbmcgc2lnbmVkXG4gICAqIEBwYXJhbSBwdWJLZXlIZXggICAzMy1ieXRlIGNvbXByZXNzZWQgc2VjcDI1NmsxIHB1YktleSwgaGV4LWVuY29kZWRcbiAgICogQHBhcmFtIHNpZ0hleCAgICAgIDY0LWJ5dGUgU2Nobm9yciBzaWduYXR1cmUsIGhleC1lbmNvZGVkXG4gICAqIEBwYXJhbSBzaWdIYXNoVHlwZSBTaWdIYXNoIHR5cGUgdXNlZCB3aGVuIHByb2R1Y2luZyB0aGUgc2lnbmF0dXJlXG4gICAqL1xuICBhZGRTaWduYXR1cmUoaW5wdXRJbmRleDogbnVtYmVyLCBwdWJLZXlIZXg6IHN0cmluZywgc2lnSGV4OiBzdHJpbmcsIHNpZ0hhc2hUeXBlOiBudW1iZXIgPSBTSUdIQVNIX0FMTCk6IHRoaXMge1xuICAgIHJlcXVpcmVSb2xlKHRoaXMuX3JvbGUsICdTSUdORVInKTtcbiAgICBpZiAoaW5wdXRJbmRleCA8IDAgfHwgaW5wdXRJbmRleCA+PSB0aGlzLl9pbnB1dHMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYElucHV0IGluZGV4ICR7aW5wdXRJbmRleH0gaXMgb3V0IG9mIHJhbmdlICh0eCBoYXMgJHt0aGlzLl9pbnB1dHMubGVuZ3RofSBpbnB1dHMpYCk7XG4gICAgfVxuICAgIGNvbnN0IHNpZ0J1ZiA9IEJ1ZmZlci5mcm9tKHNpZ0hleCwgJ2hleCcpO1xuICAgIGlmIChzaWdCdWYubGVuZ3RoICE9PSA2NCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCA2NC1ieXRlIFNjaG5vcnIgc2lnbmF0dXJlLCBnb3QgJHtzaWdCdWYubGVuZ3RofSBieXRlc2ApO1xuICAgIH1cbiAgICB0aGlzLl9pbnB1dHNbaW5wdXRJbmRleF0ucGFydGlhbFNpZ3NbcHViS2V5SGV4XSA9IHNpZ0hleDtcbiAgICB0aGlzLl9pbnB1dHNbaW5wdXRJbmRleF0uc2lnaGFzaFR5cGUgPSBzaWdIYXNoVHlwZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIOKUgOKUgCBDT01CSU5FUiBvcGVyYXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIE1lcmdlIGBwYXJ0aWFsU2lnc2AgZnJvbSBhbm90aGVyIFBTS1QgaW50byB0aGlzIG9uZS5cbiAgICpcbiAgICogQm90aCBQU0tUcyBtdXN0IHJlcHJlc2VudCB0aGUgc2FtZSB0cmFuc2FjdGlvbiAoc2FtZSBudW1iZXIgb2YgaW5wdXRzIGFuZFxuICAgKiBvdXRwdXRzKS4gQ29uZmxpY3Rpbmcgc2lnbmF0dXJlcyBmb3IgdGhlIHNhbWUgcHViS2V5IHJhaXNlIGFuIGVycm9yLlxuICAgKi9cbiAgY29tYmluZShvdGhlcjogUHNrdCk6IHRoaXMge1xuICAgIHJlcXVpcmVSb2xlKHRoaXMuX3JvbGUsICdDT01CSU5FUicpO1xuICAgIGlmIChvdGhlci5faW5wdXRzLmxlbmd0aCAhPT0gdGhpcy5faW5wdXRzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ2Fubm90IGNvbWJpbmU6IGlucHV0IGNvdW50IG1pc21hdGNoICh0aGlzPSR7dGhpcy5faW5wdXRzLmxlbmd0aH0sIG90aGVyPSR7b3RoZXIuX2lucHV0cy5sZW5ndGh9KWBcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChvdGhlci5fb3V0cHV0cy5sZW5ndGggIT09IHRoaXMuX291dHB1dHMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgY29tYmluZTogb3V0cHV0IGNvdW50IG1pc21hdGNoICh0aGlzPSR7dGhpcy5fb3V0cHV0cy5sZW5ndGh9LCBvdGhlcj0ke290aGVyLl9vdXRwdXRzLmxlbmd0aH0pYFxuICAgICAgKTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9pbnB1dHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGZvciAoY29uc3QgW3B1YktleSwgc2lnXSBvZiBPYmplY3QuZW50cmllcyhvdGhlci5faW5wdXRzW2ldLnBhcnRpYWxTaWdzKSkge1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuX2lucHV0c1tpXS5wYXJ0aWFsU2lnc1twdWJLZXldO1xuICAgICAgICBpZiAoZXhpc3RpbmcgJiYgZXhpc3RpbmcgIT09IHNpZykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ29uZmxpY3Rpbmcgc2lnbmF0dXJlIGZvciBpbnB1dFske2l9XSBwdWJLZXkgJHtwdWJLZXkuc2xpY2UoMCwgMTYpfS4uLmApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2lucHV0c1tpXS5wYXJ0aWFsU2lnc1twdWJLZXldID0gc2lnO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIOKUgOKUgCBGSU5BTElaRVIgb3BlcmF0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBGaW5hbGlzZSBhbGwgaW5wdXRzOiBwcm9tb3RlIHRoZSBmaXJzdCBgcGFydGlhbFNpZ2Agb24gZWFjaCBpbnB1dCBpbnRvXG4gICAqIGBmaW5hbFNjcmlwdFNpZ2AgdXNpbmcgS2FzcGEncyBwdXNoLW9ubHkgc2NyaXB0IGxheW91dDpcbiAgICogICBgMHg0MWAgKE9QX0RBVEFfNjUpICsgNjQtYnl0ZSBzaWcgKyAxLWJ5dGUgc2lnaGFzaCB0eXBlID0gNjYgYnl0ZXNcbiAgICpcbiAgICogV29ya3MgZm9yIGJvdGggU2Nobm9yciAodjApIGFuZCBFQ0RTQSAodjEpIGlucHV0cyBzaW5jZSBib3RoIHByb2R1Y2UgYVxuICAgKiA2NC1ieXRlIGNvbXBhY3Qgc2lnbmF0dXJlIHN0b3JlZCBpbiBgcGFydGlhbFNpZ3NgLlxuICAgKiBJbnB1dHMgdGhhdCBhbHJlYWR5IGhhdmUgYSBgZmluYWxTY3JpcHRTaWdgIGFyZSBsZWZ0IHVuY2hhbmdlZC5cbiAgICovXG4gIGZpbmFsaXplKCk6IHRoaXMge1xuICAgIHJlcXVpcmVSb2xlKHRoaXMuX3JvbGUsICdGSU5BTElaRVInKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2lucHV0cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgaW5wID0gdGhpcy5faW5wdXRzW2ldO1xuICAgICAgaWYgKGlucC5maW5hbFNjcmlwdFNpZykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyhpbnAucGFydGlhbFNpZ3MpO1xuICAgICAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW5wdXRbJHtpfV0gaGFzIG5vIHBhcnRpYWwgc2lnbmF0dXJlcyDigJQgY2Fubm90IGZpbmFsaXNlYCk7XG4gICAgICB9XG4gICAgICBjb25zdCBbLCBzaWdIZXhdID0gZW50cmllc1swXTtcbiAgICAgIGNvbnN0IHNpZyA9IEJ1ZmZlci5mcm9tKHNpZ0hleCwgJ2hleCcpO1xuICAgICAgaWYgKHNpZy5sZW5ndGggIT09IDY0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW5wdXRbJHtpfV0gcGFydGlhbCBzaWduYXR1cmUgaXMgJHtzaWcubGVuZ3RofSBieXRlcywgZXhwZWN0ZWQgNjRgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNpZ2hhc2hUeXBlID0gaW5wLnNpZ2hhc2hUeXBlID8/IFNJR0hBU0hfQUxMO1xuICAgICAgLy8gUHVzaC1vbmx5IHNjcmlwdFNpZzogT1BfREFUQV82NSArIDY0LWJ5dGUgc2lnICsgMS1ieXRlIHNpZ2hhc2ggdHlwZVxuICAgICAgaW5wLmZpbmFsU2NyaXB0U2lnID0gQnVmZmVyLmNvbmNhdChbQnVmZmVyLmZyb20oWzB4NDFdKSwgc2lnLCBCdWZmZXIuZnJvbShbc2lnaGFzaFR5cGVdKV0pLnRvU3RyaW5nKCdoZXgnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyDilIDilIAgRVhUUkFDVE9SIG9wZXJhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogRXh0cmFjdCB0aGUgYnJvYWRjYXN0LXJlYWR5IHRyYW5zYWN0aW9uIGFzIGEgSlNPTiBzdHJpbmcuXG4gICAqXG4gICAqIFByb2R1Y2VzIHRoZSBzYW1lIHdpcmUgZm9ybWF0IGFzIGBUcmFuc2FjdGlvbi50b0Jyb2FkY2FzdEZvcm1hdCgpYC5cbiAgICogTXVzdCBiZSBpbiBFWFRSQUNUT1Igcm9sZSAoY2FsbCBgLnRvRmluYWxpemVyKCkuZmluYWxpemUoKS50b0V4dHJhY3RvcigpYCBmaXJzdCkuXG4gICAqL1xuICBleHRyYWN0KCk6IHN0cmluZyB7XG4gICAgcmVxdWlyZVJvbGUodGhpcy5fcm9sZSwgJ0VYVFJBQ1RPUicpO1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICB2ZXJzaW9uOiB0aGlzLl9nbG9iYWwudHhWZXJzaW9uLFxuICAgICAgaW5wdXRzOiB0aGlzLl9pbnB1dHMubWFwKChpbnApID0+ICh7XG4gICAgICAgIHByZXZpb3VzT3V0cG9pbnQ6IHtcbiAgICAgICAgICB0cmFuc2FjdGlvbklkOiBpbnAucHJldmlvdXNPdXRwb2ludC50cmFuc2FjdGlvbklkLFxuICAgICAgICAgIGluZGV4OiBpbnAucHJldmlvdXNPdXRwb2ludC5pbmRleCxcbiAgICAgICAgfSxcbiAgICAgICAgc2lnbmF0dXJlU2NyaXB0OiBpbnAuZmluYWxTY3JpcHRTaWcgfHwgJycsXG4gICAgICAgIHNlcXVlbmNlOiBOdW1iZXIoaW5wLnNlcXVlbmNlID8/IDApLFxuICAgICAgICBzaWdPcENvdW50OiBpbnAuc2lnT3BDb3VudCA/PyAxLFxuICAgICAgfSkpLFxuICAgICAgb3V0cHV0czogdGhpcy5fb3V0cHV0cy5tYXAoKG91dCkgPT4gKHtcbiAgICAgICAgYW1vdW50OiBOdW1iZXIob3V0LmFtb3VudCksXG4gICAgICAgIHNjcmlwdFB1YmxpY0tleToge1xuICAgICAgICAgIHZlcnNpb246IG91dC5zY3JpcHRQdWJsaWNLZXkudmVyc2lvbixcbiAgICAgICAgICBzY3JpcHRQdWJsaWNLZXk6IG91dC5zY3JpcHRQdWJsaWNLZXkuc2NyaXB0UHVibGljS2V5LFxuICAgICAgICB9LFxuICAgICAgfSkpLFxuICAgICAgbG9ja1RpbWU6IE51bWJlcih0aGlzLl9nbG9iYWwuZmFsbGJhY2tMb2NrVGltZSA/PyAwKSxcbiAgICAgIHN1Ym5ldHdvcmtJZDogJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICAgZ2FzOiAwLFxuICAgICAgcGF5bG9hZDogdGhpcy5fZ2xvYmFsLnBheWxvYWQgPz8gJycsXG4gICAgfSk7XG4gIH1cblxuICAvLyDilIDilIAgU2VyaWFsaXphdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogU2VyaWFsaXNlIHRoZSBQU0tUIHRvIGEgSlNPTiBzdHJpbmcgZm9yIHRyYW5zbWlzc2lvbiAoZS5nLiB0byBhbiBIU00pLlxuICAgKiBUaGUgYHJvbGVgIGlzIGluY2x1ZGVkIHNvIGBQc2t0LmRlc2VyaWFsaXplKClgIGNhbiByZWNvbnN0cnVjdCB0aGUgc3RhdGUuXG4gICAqL1xuICBzZXJpYWxpemUoKTogc3RyaW5nIHtcbiAgICBjb25zdCB3aXJlOiBTZXJpYWxpemVkUHNrdCA9IHtcbiAgICAgIHJvbGU6IHRoaXMuX3JvbGUsXG4gICAgICBnbG9iYWw6IHRoaXMuX2dsb2JhbCxcbiAgICAgIGlucHV0czogdGhpcy5faW5wdXRzLFxuICAgICAgb3V0cHV0czogdGhpcy5fb3V0cHV0cyxcbiAgICB9O1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh3aXJlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IHRoZSBQU0tUJ3MgaW50ZXJuYWwgZGF0YSBiYWNrIHRvIGEgYEthc3BhVHJhbnNhY3Rpb25EYXRhYCBvYmplY3QuXG4gICAqXG4gICAqIGBmaW5hbFNjcmlwdFNpZ2AgKGlmIHByZXNlbnQpIGlzIG1hcHBlZCB0byBgc2lnbmF0dXJlU2NyaXB0YCBzbyB0aGF0IHRoZVxuICAgKiByZXN1bHRpbmcgYFRyYW5zYWN0aW9uYCBpcyBmdWxseSBzaWduZWQgYW5kIHJlYWR5IHRvIGJyb2FkY2FzdC5cbiAgICogVXNlZCBieSBgVHJhbnNhY3Rpb24uZnJvbVBza3QoKWAuXG4gICAqL1xuICB0b1R4RGF0YSgpOiBLYXNwYVRyYW5zYWN0aW9uRGF0YSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZlcnNpb246IHRoaXMuX2dsb2JhbC50eFZlcnNpb24sXG4gICAgICBpbnB1dHM6IHRoaXMuX2lucHV0cy5tYXAoKGlucCkgPT4gKHtcbiAgICAgICAgdHJhbnNhY3Rpb25JZDogaW5wLnByZXZpb3VzT3V0cG9pbnQudHJhbnNhY3Rpb25JZCxcbiAgICAgICAgdHJhbnNhY3Rpb25JbmRleDogaW5wLnByZXZpb3VzT3V0cG9pbnQuaW5kZXgsXG4gICAgICAgIGFtb3VudDogaW5wLnV0eG9FbnRyeT8uYW1vdW50ID8/ICcwJyxcbiAgICAgICAgc2NyaXB0UHVibGljS2V5OiBpbnAudXR4b0VudHJ5Py5zY3JpcHRQdWJsaWNLZXkgPz8gJycsXG4gICAgICAgIHNlcXVlbmNlOiBpbnAuc2VxdWVuY2UsXG4gICAgICAgIHNpZ09wQ291bnQ6IGlucC5zaWdPcENvdW50LFxuICAgICAgICBzaWduYXR1cmVTY3JpcHQ6IGlucC5maW5hbFNjcmlwdFNpZyxcbiAgICAgIH0pKSxcbiAgICAgIG91dHB1dHM6IHRoaXMuX291dHB1dHMubWFwKChvdXQpID0+ICh7XG4gICAgICAgIGFkZHJlc3M6ICcnLFxuICAgICAgICBhbW91bnQ6IG91dC5hbW91bnQsXG4gICAgICAgIHNjcmlwdFB1YmxpY0tleTogb3V0LnNjcmlwdFB1YmxpY0tleS5zY3JpcHRQdWJsaWNLZXksXG4gICAgICB9KSksXG4gICAgICBsb2NrVGltZTogdGhpcy5fZ2xvYmFsLmZhbGxiYWNrTG9ja1RpbWUgPz8gJzAnLFxuICAgICAgc3VibmV0d29ya0lkOiAnMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgICBwYXlsb2FkOiB0aGlzLl9nbG9iYWwucGF5bG9hZCA/PyAnJyxcbiAgICB9O1xuICB9XG59XG4iXX0=
@@ -1,15 +1,17 @@
1
1
  import { KaspaTransactionData } from './iface';
2
- export declare const SIGHASH_ALL = 1;
3
- export declare const SIGHASH_NONE = 2;
4
- export declare const SIGHASH_SINGLE = 4;
5
- export declare const SIGHASH_ANYONECANPAY = 128;
6
- export declare const OP_CHECKSIG_SCHNORR = 171;
7
- export declare const SCRIPT_PUBLIC_KEY_VERSION = 0;
2
+ import { KaspaScriptType } from './constants';
8
3
  /**
9
- * Build P2PK Schnorr scriptPublicKey from a 32-byte x-only public key.
10
- * Format: OP_DATA_32(0x20) + xOnlyPubKey(32 bytes) + OP_CHECKSIG_SCHNORR(0xAB)
4
+ * Build a Kaspa P2PK scriptPublicKey.
5
+ *
6
+ * @param pubKey - For SCHNORR: 32-byte x-only key.
7
+ * For ECDSA: 33-byte compressed key.
8
+ * @param type - Address type (default: SCHNORR / v0).
9
+ *
10
+ * Resulting script formats (per rusty-kaspa crypto/txscript/src/standard.rs):
11
+ * SCHNORR (v0): OP_DATA_32(0x20) || xOnlyPubKey(32B) || OpCheckSig(0xAC)
12
+ * ECDSA (v1): OP_DATA_33(0x21) || compressedPubKey(33B) || OpCheckSigECDSA(0xAB)
11
13
  */
12
- export declare function buildP2PKScriptPublicKey(xOnlyPubKey: Buffer): Buffer;
14
+ export declare function buildP2PKScriptPublicKey(pubKey: Buffer, type?: KaspaScriptType): Buffer;
13
15
  /**
14
16
  * Derive x-only public key from 33-byte compressed public key.
15
17
  */
@@ -26,4 +28,19 @@ export declare function compressedToXOnly(compressedPubKey: Buffer): Buffer;
26
28
  * @param sigHashType SigHash type flags (SIGHASH_ALL = 0x01 for standard)
27
29
  */
28
30
  export declare function computeKaspaSigningHash(tx: KaspaTransactionData, inputIndex: number, sigHashType?: number): Buffer;
31
+ /**
32
+ * Compute the Kaspa ECDSA sighash for a specific input.
33
+ *
34
+ * ECDSA signing uses a two-step hash defined in rusty-kaspa sighash.rs:
35
+ * 1. schnorr_hash = blake2b256_keyed("TransactionSigningHash", preimage)
36
+ * 2. ecdsa_hash = SHA256( SHA256("TransactionSigningHashECDSA") || schnorr_hash )
37
+ *
38
+ * This differs from the Schnorr hash — using the Schnorr hash for ECDSA signing
39
+ * will produce a locally-valid signature that the network always rejects.
40
+ *
41
+ * @param tx Full transaction data with UTXO amount + scriptPublicKey on inputs
42
+ * @param inputIndex 0-based index of the input being signed
43
+ * @param sigHashType SigHash type flags (SIGHASH_ALL = 0x01)
44
+ */
45
+ export declare function computeKaspaEcdsaSigningHash(tx: KaspaTransactionData, inputIndex: number, sigHashType?: number): Buffer;
29
46
  //# sourceMappingURL=sighash.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sighash.d.ts","sourceRoot":"","sources":["../../../src/lib/sighash.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,oBAAoB,EAA0C,MAAM,SAAS,CAAC;AAGvF,eAAO,MAAM,WAAW,IAAO,CAAC;AAChC,eAAO,MAAM,YAAY,IAAO,CAAC;AACjC,eAAO,MAAM,cAAc,IAAO,CAAC;AACnC,eAAO,MAAM,oBAAoB,MAAO,CAAC;AAGzC,eAAO,MAAM,mBAAmB,MAAO,CAAC;AACxC,eAAO,MAAM,yBAAyB,IAAI,CAAC;AA+F3C;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAKpE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,gBAAgB,EAAE,MAAM,GAAG,MAAM,CAKlE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CACrC,EAAE,EAAE,oBAAoB,EACxB,UAAU,EAAE,MAAM,EAClB,WAAW,GAAE,MAAoB,GAChC,MAAM,CAqFR"}
1
+ {"version":3,"file":"sighash.d.ts","sourceRoot":"","sources":["../../../src/lib/sighash.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,oBAAoB,EAA0C,MAAM,SAAS,CAAC;AACvF,OAAO,EAOL,eAAe,EAChB,MAAM,aAAa,CAAC;AAerB;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,eAAyC,GAAG,MAAM,CAYhH;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,gBAAgB,EAAE,MAAM,GAAG,MAAM,CAKlE;AA4ED;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CACrC,EAAE,EAAE,oBAAoB,EACxB,UAAU,EAAE,MAAM,EAClB,WAAW,GAAE,MAAoB,GAChC,MAAM,CAqFR;AAUD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,4BAA4B,CAC1C,EAAE,EAAE,oBAAoB,EACxB,UAAU,EAAE,MAAM,EAClB,WAAW,GAAE,MAAoB,GAChC,MAAM,CAGR"}