@bitgo-beta/sdk-coin-kaspa 0.0.1-beta.21 → 0.0.1-beta.210

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.
Files changed (49) hide show
  1. package/README.md +224 -33
  2. package/dist/src/kaspa.d.ts +86 -18
  3. package/dist/src/kaspa.d.ts.map +1 -1
  4. package/dist/src/kaspa.js +119 -31
  5. package/dist/src/lib/constants.d.ts +38 -0
  6. package/dist/src/lib/constants.d.ts.map +1 -1
  7. package/dist/src/lib/constants.js +56 -5
  8. package/dist/src/lib/iface.d.ts +28 -17
  9. package/dist/src/lib/iface.d.ts.map +1 -1
  10. package/dist/src/lib/iface.js +1 -1
  11. package/dist/src/lib/index.d.ts +2 -0
  12. package/dist/src/lib/index.d.ts.map +1 -1
  13. package/dist/src/lib/index.js +4 -2
  14. package/dist/src/lib/keyPair.d.ts +6 -2
  15. package/dist/src/lib/keyPair.d.ts.map +1 -1
  16. package/dist/src/lib/keyPair.js +7 -4
  17. package/dist/src/lib/pskt.d.ts +257 -0
  18. package/dist/src/lib/pskt.d.ts.map +1 -0
  19. package/dist/src/lib/pskt.js +439 -0
  20. package/dist/src/lib/sighash.d.ts +34 -13
  21. package/dist/src/lib/sighash.d.ts.map +1 -1
  22. package/dist/src/lib/sighash.js +115 -56
  23. package/dist/src/lib/transaction.d.ts +94 -6
  24. package/dist/src/lib/transaction.d.ts.map +1 -1
  25. package/dist/src/lib/transaction.js +199 -21
  26. package/dist/src/lib/transactionBuilder.d.ts +22 -0
  27. package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
  28. package/dist/src/lib/transactionBuilder.js +53 -5
  29. package/dist/src/lib/transactionBuilderFactory.d.ts +8 -3
  30. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  31. package/dist/src/lib/transactionBuilderFactory.js +14 -4
  32. package/dist/src/lib/utils.d.ts +17 -3
  33. package/dist/src/lib/utils.d.ts.map +1 -1
  34. package/dist/src/lib/utils.js +45 -11
  35. package/dist/src/register.js +2 -2
  36. package/dist/test/fixtures/kaspa.fixtures.d.ts +12 -0
  37. package/dist/test/fixtures/kaspa.fixtures.d.ts.map +1 -1
  38. package/dist/test/fixtures/kaspa.fixtures.js +76 -11
  39. package/dist/test/unit/coin.test.js +129 -9
  40. package/dist/test/unit/keyPair.test.js +35 -1
  41. package/dist/test/unit/pskt.test.d.ts +15 -0
  42. package/dist/test/unit/pskt.test.d.ts.map +1 -0
  43. package/dist/test/unit/pskt.test.js +383 -0
  44. package/dist/test/unit/transaction.test.js +291 -11
  45. package/dist/test/unit/transactionBuilder.test.js +16 -3
  46. package/dist/test/unit/transactionFlow.test.js +67 -2
  47. package/dist/test/unit/utils.test.js +63 -4
  48. package/dist/tsconfig.tsbuildinfo +1 -1
  49. package/package.json +6 -5
@@ -4,8 +4,22 @@ exports.Transaction = void 0;
4
4
  const sdk_core_1 = require("@bitgo-beta/sdk-core");
5
5
  const secp256k1_1 = require("@bitgo-beta/secp256k1");
6
6
  const sighash_1 = require("./sighash");
7
+ const constants_1 = require("./constants");
8
+ const pskt_1 = require("./pskt");
9
+ /**
10
+ * Returns true when `input`'s scriptPublicKey belongs to a Kaspa ECDSA (v1)
11
+ * address — last opcode is OpCheckSigECDSA (0xAB).
12
+ * Schnorr (v0) scripts end with OpCheckSig (0xAC).
13
+ */
14
+ function isEcdsaInput(input) {
15
+ if (!input.scriptPublicKey || input.scriptPublicKey.length < 2)
16
+ return false;
17
+ return parseInt(input.scriptPublicKey.slice(-2), 16) === constants_1.OP_CHECKSIG_ECDSA;
18
+ }
7
19
  class Transaction extends sdk_core_1.BaseTransaction {
8
20
  constructor(coin, txData) {
21
+ // BaseTransaction expects a full statics CoinConfig; we only have the coin name string here.
22
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
9
23
  super({ coin });
10
24
  this._txData = txData || {
11
25
  version: 0,
@@ -21,44 +35,139 @@ class Transaction extends sdk_core_1.BaseTransaction {
21
35
  return this._txData;
22
36
  }
23
37
  /**
24
- * Sign all inputs with the given private key using Schnorr signatures.
38
+ * Get the transaction fee in sompi.
39
+ * If fee was explicitly set, returns that. Otherwise computes from inputs - outputs.
40
+ */
41
+ get fee() {
42
+ if (this._txData.fee) {
43
+ return this._txData.fee;
44
+ }
45
+ let totalIn = BigInt(0);
46
+ let totalOut = BigInt(0);
47
+ for (const input of this._txData.inputs) {
48
+ totalIn += BigInt(input.amount);
49
+ }
50
+ for (const output of this._txData.outputs) {
51
+ totalOut += BigInt(output.amount);
52
+ }
53
+ return (totalIn - totalOut).toString();
54
+ }
55
+ /**
56
+ * Returns one sighash Buffer per input — the set of messages that must be
57
+ * signed for a multi-input MPCv2 ceremony.
58
+ *
59
+ * Kaspa uses a BIP-143-like sighash scheme (Blake2b) where each input commits
60
+ * to its own index, so input[i] has a distinct hash that cannot be re-used for
61
+ * input[j]. A correct multi-input MPCv2 flow runs one DKLS session per input
62
+ * in parallel and applies each resulting signature via addSignatureForInput().
25
63
  *
26
- * @param privateKey 32-byte private key buffer
64
+ * The hash type is automatically selected per input:
65
+ * - Schnorr (scriptPublicKey ends 0xAC): keyed Blake2b-256
66
+ * - ECDSA (scriptPublicKey ends 0xAB): keyed Blake2b-256 + SHA256 double-hash
67
+ */
68
+ get signablePayloads() {
69
+ if (this._txData.inputs.length === 0) {
70
+ throw new Error('Cannot compute signablePayloads: no inputs');
71
+ }
72
+ return this._txData.inputs.map((input, i) => isEcdsaInput(input)
73
+ ? (0, sighash_1.computeKaspaEcdsaSigningHash)(this._txData, i, constants_1.SIGHASH_ALL)
74
+ : (0, sighash_1.computeKaspaSigningHash)(this._txData, i, constants_1.SIGHASH_ALL));
75
+ }
76
+ /**
77
+ * Apply a signature to a single specific input.
78
+ *
79
+ * Used in the multi-input MPCv2 flow where each input is signed by an
80
+ * independent DKLS session that commits to that input's sighash. Call this
81
+ * once per input with the signature produced for that input's signablePayloads[i].
82
+ *
83
+ * @param index 0-based index of the input to sign
84
+ * @param publicKey compressed secp256k1 public key (33 bytes hex) — not used in
85
+ * the scriptSig bytes but kept for symmetry with addSignature
86
+ * @param signature 64-byte signature buffer for input[index]
87
+ * @param sigHashType SigHash type (default: SIGHASH_ALL)
88
+ */
89
+ addSignatureForInput(index, publicKey, signature, sigHashType = constants_1.SIGHASH_ALL) {
90
+ if (index < 0 || index >= this._txData.inputs.length) {
91
+ throw new Error(`Input index ${index} is out of range (tx has ${this._txData.inputs.length} inputs)`);
92
+ }
93
+ if (signature.length !== 64) {
94
+ throw new Error(`Expected 64-byte signature, got ${signature.length}`);
95
+ }
96
+ // Kaspa script engine requires push-only signatureScripts.
97
+ // 0x41 = OP_DATA_65: push the next 65 bytes (64-byte sig + 1-byte sighash type) onto the stack.
98
+ const sigWithType = Buffer.concat([Buffer.from([0x41]), signature, Buffer.from([sigHashType])]);
99
+ this._txData.inputs[index].signatureScript = sigWithType.toString('hex');
100
+ }
101
+ /**
102
+ * Sign all inputs with the given private key.
103
+ *
104
+ * Automatically selects the signature algorithm per input by inspecting each
105
+ * input's scriptPublicKey:
106
+ * - Schnorr (last opcode 0xAC, v0 address): BIP-340 Schnorr + Blake2b sighash
107
+ * - ECDSA (last opcode 0xAB, v1 address): secp256k1 ECDSA + Blake2b+SHA256 sighash
108
+ *
109
+ * A single transaction may mix both address types and each input will be
110
+ * signed correctly without any extra parameters.
111
+ *
112
+ * @param privateKey 32-byte private key buffer
27
113
  * @param sigHashType SigHash type (default: SIGHASH_ALL = 0x01)
28
114
  */
29
- sign(privateKey, sigHashType = sighash_1.SIGHASH_ALL) {
115
+ sign(privateKey, sigHashType = constants_1.SIGHASH_ALL) {
30
116
  if (privateKey.length !== 32) {
31
117
  throw new Error(`Expected 32-byte private key, got ${privateKey.length}`);
32
118
  }
33
119
  for (let i = 0; i < this._txData.inputs.length; i++) {
34
- const sigHash = (0, sighash_1.computeKaspaSigningHash)(this._txData, i, sigHashType);
35
- const sig = secp256k1_1.ecc.signSchnorr(sigHash, privateKey);
36
- // 65-byte signature: 64-byte Schnorr sig + 1-byte sighash type
37
- const sigWithType = Buffer.concat([Buffer.from(sig), Buffer.from([sigHashType])]);
120
+ const input = this._txData.inputs[i];
121
+ let sig;
122
+ let sigHash;
123
+ if (isEcdsaInput(input)) {
124
+ // v1 ECDSA address: double-hash + compact secp256k1 ECDSA signature
125
+ sigHash = (0, sighash_1.computeKaspaEcdsaSigningHash)(this._txData, i, sigHashType);
126
+ sig = secp256k1_1.ecc.sign(sigHash, privateKey);
127
+ }
128
+ else {
129
+ // v0 Schnorr address (default): Blake2b sighash + BIP-340 Schnorr signature
130
+ sigHash = (0, sighash_1.computeKaspaSigningHash)(this._txData, i, sigHashType);
131
+ sig = secp256k1_1.ecc.signSchnorr(sigHash, privateKey);
132
+ }
133
+ // Kaspa requires push-only signatureScripts: 0x41 (OP_DATA_65) + 64-byte sig + 1-byte sighash type
134
+ const sigWithType = Buffer.concat([Buffer.from([0x41]), Buffer.from(sig), Buffer.from([sigHashType])]);
38
135
  this._txData.inputs[i].signatureScript = sigWithType.toString('hex');
39
136
  }
40
137
  }
41
138
  /**
42
- * Verify that a Schnorr signature on a specific input is valid.
139
+ * Verify that the signature on a specific input is valid.
140
+ *
141
+ * Automatically selects the verification algorithm based on the input's
142
+ * scriptPublicKey (ECDSA for 0xAB, Schnorr for 0xAC), matching `sign()`.
43
143
  *
44
- * @param publicKey 33-byte compressed public key (or 32-byte x-only)
144
+ * @param publicKey 33-byte compressed public key (or 32-byte x-only for Schnorr)
45
145
  * @param inputIndex Index of the input to verify
46
146
  * @param sigHashType SigHash type used when signing
47
147
  */
48
- verifySignature(publicKey, inputIndex, sigHashType = sighash_1.SIGHASH_ALL) {
148
+ verifySignature(publicKey, inputIndex, sigHashType = constants_1.SIGHASH_ALL) {
49
149
  const input = this._txData.inputs[inputIndex];
50
150
  if (!input?.signatureScript) {
51
151
  return false;
52
152
  }
53
153
  const sigBytes = Buffer.from(input.signatureScript, 'hex');
54
- if (sigBytes.length < 65) {
154
+ // signatureScript layout: 0x41 (OP_DATA_65) + 64-byte sig + 1-byte sighash type = 66 bytes
155
+ if (sigBytes.length < 66) {
55
156
  return false;
56
157
  }
57
- const sig = sigBytes.slice(0, 64);
58
- const sigHash = (0, sighash_1.computeKaspaSigningHash)(this._txData, inputIndex, sigHashType);
59
- // Accept 33-byte compressed or 32-byte x-only
60
- const xOnlyPub = publicKey.length === 33 ? publicKey.slice(1) : publicKey;
61
- return secp256k1_1.ecc.verifySchnorr(sigHash, xOnlyPub, sig);
158
+ const sig = sigBytes.slice(1, 65); // skip the 0x41 push opcode
159
+ if (isEcdsaInput(input)) {
160
+ const sigHash = (0, sighash_1.computeKaspaEcdsaSigningHash)(this._txData, inputIndex, sigHashType);
161
+ // ECDSA verification requires 33-byte compressed public key
162
+ const compressedPub = publicKey.length === 33 ? publicKey : Buffer.concat([Buffer.from([0x02]), publicKey]);
163
+ return secp256k1_1.ecc.verify(sigHash, compressedPub, sig);
164
+ }
165
+ else {
166
+ const sigHash = (0, sighash_1.computeKaspaSigningHash)(this._txData, inputIndex, sigHashType);
167
+ // Schnorr verification uses x-only (32-byte) public key
168
+ const xOnlyPub = publicKey.length === 33 ? publicKey.slice(1) : publicKey;
169
+ return secp256k1_1.ecc.verifySchnorr(sigHash, xOnlyPub, sig);
170
+ }
62
171
  }
63
172
  /**
64
173
  * Explain the transaction in a human-readable format.
@@ -89,16 +198,53 @@ class Transaction extends sdk_core_1.BaseTransaction {
89
198
  };
90
199
  }
91
200
  /**
92
- * Serialize the transaction to a JSON string (broadcast format).
201
+ * Serialize the transaction to the Kaspa REST API JSON string.
202
+ *
203
+ * This is the wire format accepted by the Kaspa node REST API for broadcasting.
204
+ * Unsigned transactions (signatureScript = "") use this same structure; once
205
+ * all inputs are signed the same format is submitted to the node.
206
+ *
207
+ * Note: inputs in this format carry only `previousOutpoint`, `signatureScript`,
208
+ * `sequence`, and `sigOpCount`. The `amount` and `scriptPublicKey` fields needed
209
+ * for sighash computation are NOT present here — they live in `toJson()`.
93
210
  */
94
211
  toBroadcastFormat() {
95
- return JSON.stringify(this._txData);
212
+ return JSON.stringify({
213
+ version: this._txData.version,
214
+ inputs: this._txData.inputs.map((input) => ({
215
+ previousOutpoint: {
216
+ transactionId: input.transactionId,
217
+ index: input.transactionIndex,
218
+ },
219
+ signatureScript: input.signatureScript || '',
220
+ sequence: Number(input.sequence ?? 0),
221
+ sigOpCount: input.sigOpCount ?? 1,
222
+ })),
223
+ outputs: this._txData.outputs.map((output) => ({
224
+ amount: Number(output.amount),
225
+ scriptPublicKey: {
226
+ version: 0,
227
+ scriptPublicKey: output.scriptPublicKey || '',
228
+ },
229
+ })),
230
+ lockTime: Number(this._txData.lockTime ?? 0),
231
+ subnetworkId: this._txData.subnetworkId ?? '0000000000000000000000000000000000000000',
232
+ gas: 0,
233
+ payload: this._txData.payload ?? '',
234
+ });
96
235
  }
97
236
  /**
98
- * Serialize transaction to hex (JSON-encoded then hex-encoded).
237
+ * Serialize transaction to hex using the internal `KaspaTransactionData` format.
238
+ *
239
+ * This hex is used for SDK-internal round-trips (builder serialisation / deserialisation)
240
+ * because the internal format preserves `amount` and `scriptPublicKey` on inputs,
241
+ * which are required for sighash computation but are not present in the REST API format.
242
+ *
243
+ * Use `Buffer.from(tx.toBroadcastFormat()).toString('hex')` when you need the hex
244
+ * representation of the broadcast / HSM wire format.
99
245
  */
100
246
  toHex() {
101
- return Buffer.from(this.toBroadcastFormat()).toString('hex');
247
+ return Buffer.from(JSON.stringify(this._txData)).toString('hex');
102
248
  }
103
249
  /**
104
250
  * Return transaction data as a plain object.
@@ -128,6 +274,38 @@ class Transaction extends sdk_core_1.BaseTransaction {
128
274
  canSign(_key) {
129
275
  return true;
130
276
  }
277
+ /**
278
+ * Convert this transaction to a PSKT in SIGNER role.
279
+ *
280
+ * The PSKT is populated with UTXO data from each input so that sighash
281
+ * computation is possible immediately. Any existing `signatureScript` on an
282
+ * input is carried into the PSKT as `finalScriptSig`.
283
+ *
284
+ * Typical use:
285
+ * ```ts
286
+ * const pskt = tx.toPskt()
287
+ * .sign(privateKey)
288
+ * .toFinalizer()
289
+ * .finalize()
290
+ * .toExtractor();
291
+ * const broadcastJson = pskt.extract();
292
+ * ```
293
+ */
294
+ toPskt() {
295
+ return pskt_1.Pskt.fromTxData(this._txData);
296
+ }
297
+ /**
298
+ * Reconstruct a Transaction from a PSKT (any role).
299
+ *
300
+ * `finalScriptSig` from each PSKT input is mapped to `signatureScript` so
301
+ * that the resulting transaction is signed if the PSKT has been finalised.
302
+ *
303
+ * @param coin Coin name string (e.g. 'kaspa', 'tkaspa')
304
+ * @param pskt A Pskt instance (typically at FINALIZER or EXTRACTOR role)
305
+ */
306
+ static fromPskt(coin, pskt) {
307
+ return new Transaction(coin, pskt.toTxData());
308
+ }
131
309
  }
132
310
  exports.Transaction = Transaction;
133
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1EQUFpRjtBQUNqRixxREFBNEM7QUFFNUMsdUNBQWlFO0FBRWpFLE1BQWEsV0FBWSxTQUFRLDBCQUFlO0lBRzlDLFlBQVksSUFBWSxFQUFFLE1BQTZCO1FBQ3JELEtBQUssQ0FBQyxFQUFFLElBQUksRUFBUyxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLElBQUk7WUFDdkIsT0FBTyxFQUFFLENBQUM7WUFDVixNQUFNLEVBQUUsRUFBRTtZQUNWLE9BQU8sRUFBRSxFQUFFO1NBQ1osQ0FBQztJQUNKLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsSUFBSSxFQUFFO1FBQ0osT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVELElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxJQUFJLENBQUMsVUFBa0IsRUFBRSxjQUFzQixxQkFBVztRQUN4RCxJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDN0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDNUUsQ0FBQztRQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNwRCxNQUFNLE9BQU8sR0FBRyxJQUFBLGlDQUF1QixFQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQ3RFLE1BQU0sR0FBRyxHQUFH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SUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsZUFBZSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsT0FBTyxDQUFDLElBQWE7UUFDbkIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0NBQ0Y7QUE5SUQsa0NBOElDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzZUtleSwgQmFzZVRyYW5zYWN0aW9uLCBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBlY2MgfSBmcm9tICdAYml0Z28tYmV0YS9zZWNwMjU2azEnO1xuaW1wb3J0IHsgS2FzcGFUcmFuc2FjdGlvbkRhdGEsIFRyYW5zYWN0aW9uRXhwbGFuYXRpb24gfSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IGNvbXB1dGVLYXNwYVNpZ25pbmdIYXNoLCBTSUdIQVNIX0FMTCB9IGZyb20gJy4vc2lnaGFzaCc7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbiBleHRlbmRzIEJhc2VUcmFuc2FjdGlvbiB7XG4gIHByb3RlY3RlZCBfdHhEYXRhOiBLYXNwYVRyYW5zYWN0aW9uRGF0YTtcblxuICBjb25zdHJ1Y3Rvcihjb2luOiBzdHJpbmcsIHR4RGF0YT86IEthc3BhVHJhbnNhY3Rpb25EYXRhKSB7XG4gICAgc3VwZXIoeyBjb2luIH0gYXMgYW55KTtcbiAgICB0aGlzLl90eERhdGEgPSB0eERhdGEgfHwge1xuICAgICAgdmVyc2lvbjogMCxcbiAgICAgIGlucHV0czogW10sXG4gICAgICBvdXRwdXRzOiBbXSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90eERhdGEuaWQgfHwgJyc7XG4gIH1cblxuICBnZXQgdHhEYXRhKCk6IEthc3BhVHJhbnNhY3Rpb25EYXRhIHtcbiAgICByZXR1cm4gdGhpcy5fdHhEYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ24gYWxsIGlucHV0cyB3aXRoIHRoZSBnaXZlbiBwcml2YXRlIGtleSB1c2luZyBTY2hub3JyIHNpZ25hdHVyZXMuXG4gICAqXG4gICAqIEBwYXJhbSBwcml2YXRlS2V5IDMyLWJ5dGUgcHJpdmF0ZSBrZXkgYnVmZmVyXG4gICAqIEBwYXJhbSBzaWdIYXNoVHlwZSBTaWdIYXNoIHR5cGUgKGRlZmF1bHQ6IFNJR0hBU0hfQUxMID0gMHgwMSlcbiAgICovXG4gIHNpZ24ocHJpdmF0ZUtleTogQnVmZmVyLCBzaWdIYXNoVHlwZTogbnVtYmVyID0gU0lHSEFTSF9BTEwpOiB2b2lkIHtcbiAgICBpZiAocHJpdmF0ZUtleS5sZW5ndGggIT09IDMyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIDMyLWJ5dGUgcHJpdmF0ZSBrZXksIGdvdCAke3ByaXZhdGVLZXkubGVuZ3RofWApO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX3R4RGF0YS5pbnB1dHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHNpZ0hhc2ggPSBjb21wdXRlS2FzcGFTaWduaW5nSGFzaCh0aGlzLl90eERhdGEsIGksIHNpZ0hhc2hUeXBlKTtcbiAgICAgIGNvbnN0IHNpZyA9IGVjYy5zaWduU2Nobm9ycihzaWdIYXNoLCBwcml2YXRlS2V5KTtcbiAgICAgIC8vIDY1LWJ5dGUgc2lnbmF0dXJlOiA2NC1ieXRlIFNjaG5vcnIgc2lnICsgMS1ieXRlIHNpZ2hhc2ggdHlwZVxuICAgICAgY29uc3Qgc2lnV2l0aFR5cGUgPSBCdWZmZXIuY29uY2F0KFtCdWZmZXIuZnJvbShzaWcpLCBCdWZmZXIuZnJvbShbc2lnSGFzaFR5cGVdKV0pO1xuICAgICAgdGhpcy5fdHhEYXRhLmlucHV0c1tpXS5zaWduYXR1cmVTY3JpcHQgPSBzaWdXaXRoVHlwZS50b1N0cmluZygnaGV4Jyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSB0aGF0IGEgU2Nobm9yciBzaWduYXR1cmUgb24gYSBzcGVjaWZpYyBpbnB1dCBpcyB2YWxpZC5cbiAgICpcbiAgICogQHBhcmFtIHB1YmxpY0tleSAzMy1ieXRlIGNvbXByZXNzZWQgcHVibGljIGtleSAob3IgMzItYnl0ZSB4LW9ubHkpXG4gICAqIEBwYXJhbSBpbnB1dEluZGV4IEluZGV4IG9mIHRoZSBpbnB1dCB0byB2ZXJpZnlcbiAgICogQHBhcmFtIHNpZ0hhc2hUeXBlIFNpZ0hhc2ggdHlwZSB1c2VkIHdoZW4gc2lnbmluZ1xuICAgKi9cbiAgdmVyaWZ5U2lnbmF0dXJlKHB1YmxpY0tleTogQnVmZmVyLCBpbnB1dEluZGV4OiBudW1iZXIsIHNpZ0hhc2hUeXBlOiBudW1iZXIgPSBTSUdIQVNIX0FMTCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGlucHV0ID0gdGhpcy5fdHhEYXRhLmlucHV0c1tpbnB1dEluZGV4XTtcbiAgICBpZiAoIWlucHV0Py5zaWduYXR1cmVTY3JpcHQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3Qgc2lnQnl0ZXMgPSBCdWZmZXIuZnJvbShpbnB1dC5zaWduYXR1cmVTY3JpcHQsICdoZXgnKTtcbiAgICBpZiAoc2lnQnl0ZXMubGVuZ3RoIDwgNjUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3Qgc2lnID0gc2lnQnl0ZXMuc2xpY2UoMCwgNjQpO1xuICAgIGNvbnN0IHNpZ0hhc2ggPSBjb21wdXRlS2FzcGFTaWduaW5nSGFzaCh0aGlzLl90eERhdGEsIGlucHV0SW5kZXgsIHNpZ0hhc2hUeXBlKTtcbiAgICAvLyBBY2NlcHQgMzMtYnl0ZSBjb21wcmVzc2VkIG9yIDMyLWJ5dGUgeC1vbmx5XG4gICAgY29uc3QgeE9ubHlQdWIgPSBwdWJsaWNLZXkubGVuZ3RoID09PSAzMyA/IHB1YmxpY0tleS5zbGljZSgxKSA6IHB1YmxpY0tleTtcbiAgICByZXR1cm4gZWNjLnZlcmlmeVNjaG5vcnIoc2lnSGFzaCwgeE9ubHlQdWIsIHNpZyk7XG4gIH1cblxuICAvKipcbiAgICogRXhwbGFpbiB0aGUgdHJhbnNhY3Rpb24gaW4gYSBodW1hbi1yZWFkYWJsZSBmb3JtYXQuXG4gICAqL1xuICBleHBsYWluVHJhbnNhY3Rpb24oKTogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB7XG4gICAgbGV0IHRvdGFsSW4gPSBCaWdJbnQoMCk7XG4gICAgbGV0IHRvdGFsT3V0ID0gQmlnSW50KDApO1xuXG4gICAgZm9yIChjb25zdCBpbnB1dCBvZiB0aGlzLl90eERhdGEuaW5wdXRzKSB7XG4gICAgICB0b3RhbEluICs9IEJpZ0ludChpbnB1dC5hbW91bnQpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG91dHB1dCBvZiB0aGlzLl90eERhdGEub3V0cHV0cykge1xuICAgICAgdG90YWxPdXQgKz0gQmlnSW50KG91dHB1dC5hbW91bnQpO1xuICAgIH1cblxuICAgIGNvbnN0IGZlZSA9ICh0b3RhbEluIC0gdG90YWxPdXQpLnRvU3RyaW5nKCk7XG5cbiAgICBjb25zdCBvdXRwdXRzID0gdGhpcy5fdHhEYXRhLm91dHB1dHMubWFwKChvKSA9PiAoe1xuICAgICAgYWRkcmVzczogby5hZGRyZXNzLFxuICAgICAgYW1vdW50OiBvLmFtb3VudCxcbiAgICB9KSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHRoaXMuX3R4RGF0YS5pZCB8fCAnJyxcbiAgICAgIHR5cGU6IFRyYW5zYWN0aW9uVHlwZS5TZW5kLFxuICAgICAgb3V0cHV0cyxcbiAgICAgIG91dHB1dEFtb3VudDogdG90YWxPdXQudG9TdHJpbmcoKSxcbiAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgY2hhbmdlQW1vdW50OiAnMCcsXG4gICAgICBmZWU6IHsgZmVlOiB0aGlzLl90eERhdGEuZmVlIHx8IGZlZSB9LFxuICAgICAgaW5wdXRzOiB0aGlzLl90eERhdGEuaW5wdXRzLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIHRoZSB0cmFuc2FjdGlvbiB0byBhIEpTT04gc3RyaW5nIChicm9hZGNhc3QgZm9ybWF0KS5cbiAgICovXG4gIHRvQnJvYWRjYXN0Rm9ybWF0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMuX3R4RGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIHRyYW5zYWN0aW9uIHRvIGhleCAoSlNPTi1lbmNvZGVkIHRoZW4gaGV4LWVuY29kZWQpLlxuICAgKi9cbiAgdG9IZXgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20odGhpcy50b0Jyb2FkY2FzdEZvcm1hdCgpKS50b1N0cmluZygnaGV4Jyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRyYW5zYWN0aW9uIGRhdGEgYXMgYSBwbGFpbiBvYmplY3QuXG4gICAqL1xuICB0b0pzb24oKTogS2FzcGFUcmFuc2FjdGlvbkRhdGEge1xuICAgIHJldHVybiB7IC4uLnRoaXMuX3R4RGF0YSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIGZyb20gaGV4LlxuICAgKi9cbiAgc3RhdGljIGZyb21IZXgoY29pbjogc3RyaW5nLCBoZXg6IHN0cmluZyk6IFRyYW5zYWN0aW9uIHtcbiAgICBjb25zdCBqc29uID0gSlNPTi5wYXJzZShCdWZmZXIuZnJvbShoZXgsICdoZXgnKS50b1N0cmluZygpKTtcbiAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uKGNvaW4sIGpzb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIGZyb20gSlNPTiBzdHJpbmcgb3Igb2JqZWN0LlxuICAgKi9cbiAgc3RhdGljIGZyb21Kc29uKGNvaW46IHN0cmluZywgZGF0YTogc3RyaW5nIHwgS2FzcGFUcmFuc2FjdGlvbkRhdGEpOiBUcmFuc2FjdGlvbiB7XG4gICAgY29uc3QgdHhEYXRhOiBLYXNwYVRyYW5zYWN0aW9uRGF0YSA9IHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2UoZGF0YSkgOiBkYXRhO1xuICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb24oY29pbiwgdHhEYXRhKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBnZXQgc2lnbmF0dXJlKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fdHhEYXRhLmlucHV0cy5tYXAoKGkpID0+IGkuc2lnbmF0dXJlU2NyaXB0IHx8ICcnKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBjYW5TaWduKF9rZXk6IEJhc2VLZXkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuIl19
311
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1EQUFpRjtBQUNqRixxREFBNEM7QUFFNUMsdUNBQWtGO0FBQ2xGLDJDQUE2RDtBQUM3RCxpQ0FBOEI7QUFFOUI7Ozs7R0FJRztBQUNILFNBQVMsWUFBWSxDQUFDLEtBQXFCO0lBQ3pDLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxJQUFJLEtBQUssQ0FBQyxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUM3RSxPQUFPLFFBQVEsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLDZCQUFpQixDQUFDO0FBQzdFLENBQUM7QUFFRCxNQUFhLFdBQVksU0FBUSwwQkFBZTtJQUc5QyxZQUFZLElBQVksRUFBRSxNQUE2QjtRQUNyRCw2RkFBNkY7UUFDN0YsOERBQThEO1FBQzlELEtBQUssQ0FBQyxFQUFFLElBQUksRUFBUyxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLElBQUk7WUFDdkIsT0FBTyxFQUFFLENBQUM7WUFDVixNQUFNLEVBQUUsRUFBRTtZQUNWLE9BQU8sRUFBRSxFQUFFO1NBQ1osQ0FBQztJQUNKLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsSUFBSSxFQUFFO1FBQ0osT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVELElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBSSxHQUFHO1FBQ0wsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3JCLE9BQU8sSUFBSSxD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Q0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxlQUFlLElBQUksRUFBRSxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixPQUFPLENBQUMsSUFBYTtRQUNuQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7OztPQWdCRztJQUNILE1BQU07UUFDSixPQUFPLFdBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBWSxFQUFFLElBQVU7UUFDdEMsT0FBTyxJQUFJLFdBQVcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDaEQsQ0FBQztDQUNGO0FBM1RELGtDQTJUQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VLZXksIEJhc2VUcmFuc2FjdGlvbiwgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgZWNjIH0gZnJvbSAnQGJpdGdvLWJldGEvc2VjcDI1NmsxJztcbmltcG9ydCB7IEthc3BhVHJhbnNhY3Rpb25EYXRhLCBLYXNwYVV0eG9JbnB1dCwgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB9IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgY29tcHV0ZUthc3BhU2lnbmluZ0hhc2gsIGNvbXB1dGVLYXNwYUVjZHNhU2lnbmluZ0hhc2ggfSBmcm9tICcuL3NpZ2hhc2gnO1xuaW1wb3J0IHsgT1BfQ0hFQ0tTSUdfRUNEU0EsIFNJR0hBU0hfQUxMIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgUHNrdCB9IGZyb20gJy4vcHNrdCc7XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIHdoZW4gYGlucHV0YCdzIHNjcmlwdFB1YmxpY0tleSBiZWxvbmdzIHRvIGEgS2FzcGEgRUNEU0EgKHYxKVxuICogYWRkcmVzcyDigJQgbGFzdCBvcGNvZGUgaXMgT3BDaGVja1NpZ0VDRFNBICgweEFCKS5cbiAqIFNjaG5vcnIgKHYwKSBzY3JpcHRzIGVuZCB3aXRoIE9wQ2hlY2tTaWcgKDB4QUMpLlxuICovXG5mdW5jdGlvbiBpc0VjZHNhSW5wdXQoaW5wdXQ6IEthc3BhVXR4b0lucHV0KTogYm9vbGVhbiB7XG4gIGlmICghaW5wdXQuc2NyaXB0UHVibGljS2V5IHx8IGlucHV0LnNjcmlwdFB1YmxpY0tleS5sZW5ndGggPCAyKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBwYXJzZUludChpbnB1dC5zY3JpcHRQdWJsaWNLZXkuc2xpY2UoLTIpLCAxNikgPT09IE9QX0NIRUNLU0lHX0VDRFNBO1xufVxuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb24gZXh0ZW5kcyBCYXNlVHJhbnNhY3Rpb24ge1xuICBwcm90ZWN0ZWQgX3R4RGF0YTogS2FzcGFUcmFuc2FjdGlvbkRhdGE7XG5cbiAgY29uc3RydWN0b3IoY29pbjogc3RyaW5nLCB0eERhdGE/OiBLYXNwYVRyYW5zYWN0aW9uRGF0YSkge1xuICAgIC8vIEJhc2VUcmFuc2FjdGlvbiBleHBlY3RzIGEgZnVsbCBzdGF0aWNzIENvaW5Db25maWc7IHdlIG9ubHkgaGF2ZSB0aGUgY29pbiBuYW1lIHN0cmluZyBoZXJlLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgc3VwZXIoeyBjb2luIH0gYXMgYW55KTtcbiAgICB0aGlzLl90eERhdGEgPSB0eERhdGEgfHwge1xuICAgICAgdmVyc2lvbjogMCxcbiAgICAgIGlucHV0czogW10sXG4gICAgICBvdXRwdXRzOiBbXSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90eERhdGEuaWQgfHwgJyc7XG4gIH1cblxuICBnZXQgdHhEYXRhKCk6IEthc3BhVHJhbnNhY3Rpb25EYXRhIHtcbiAgICByZXR1cm4gdGhpcy5fdHhEYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdHJhbnNhY3Rpb24gZmVlIGluIHNvbXBpLlxuICAgKiBJZiBmZWUgd2FzIGV4cGxpY2l0bHkgc2V0LCByZXR1cm5zIHRoYXQuIE90aGVyd2lzZSBjb21wdXRlcyBmcm9tIGlucHV0cyAtIG91dHB1dHMuXG4gICAqL1xuICBnZXQgZmVlKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuX3R4RGF0YS5mZWUpIHtcbiAgICAgIHJldHVybiB0aGlzLl90eERhdGEuZmVlO1xuICAgIH1cbiAgICBsZXQgdG90YWxJbiA9IEJpZ0ludCgwKTtcbiAgICBsZXQgdG90YWxPdXQgPSBCaWdJbnQoMCk7XG4gICAgZm9yIChjb25zdCBpbnB1dCBvZiB0aGlzLl90eERhdGEuaW5wdXRzKSB7XG4gICAgICB0b3RhbEluICs9IEJpZ0ludChpbnB1dC5hbW91bnQpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG91dHB1dCBvZiB0aGlzLl90eERhdGEub3V0cHV0cykge1xuICAgICAgdG90YWxPdXQgKz0gQmlnSW50KG91dHB1dC5hbW91bnQpO1xuICAgIH1cbiAgICByZXR1cm4gKHRvdGFsSW4gLSB0b3RhbE91dCkudG9TdHJpbmcoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIG9uZSBzaWdoYXNoIEJ1ZmZlciBwZXIgaW5wdXQg4oCUIHRoZSBzZXQgb2YgbWVzc2FnZXMgdGhhdCBtdXN0IGJlXG4gICAqIHNpZ25lZCBmb3IgYSBtdWx0aS1pbnB1dCBNUEN2MiBjZXJlbW9ueS5cbiAgICpcbiAgICogS2FzcGEgdXNlcyBhIEJJUC0xNDMtbGlrZSBzaWdoYXNoIHNjaGVtZSAoQmxha2UyYikgd2hlcmUgZWFjaCBpbnB1dCBjb21taXRzXG4gICAqIHRvIGl0cyBvd24gaW5kZXgsIHNvIGlucHV0W2ldIGhhcyBhIGRpc3RpbmN0IGhhc2ggdGhhdCBjYW5ub3QgYmUgcmUtdXNlZCBmb3JcbiAgICogaW5wdXRbal0uIEEgY29ycmVjdCBtdWx0aS1pbnB1dCBNUEN2MiBmbG93IHJ1bnMgb25lIERLTFMgc2Vzc2lvbiBwZXIgaW5wdXRcbiAgICogaW4gcGFyYWxsZWwgYW5kIGFwcGxpZXMgZWFjaCByZXN1bHRpbmcgc2lnbmF0dXJlIHZpYSBhZGRTaWduYXR1cmVGb3JJbnB1dCgpLlxuICAgKlxuICAgKiBUaGUgaGFzaCB0eXBlIGlzIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgcGVyIGlucHV0OlxuICAgKiAgIC0gU2Nobm9yciAoc2NyaXB0UHVibGljS2V5IGVuZHMgMHhBQyk6IGtleWVkIEJsYWtlMmItMjU2XG4gICAqICAgLSBFQ0RTQSAgIChzY3JpcHRQdWJsaWNLZXkgZW5kcyAweEFCKToga2V5ZWQgQmxha2UyYi0yNTYgKyBTSEEyNTYgZG91YmxlLWhhc2hcbiAgICovXG4gIGdldCBzaWduYWJsZVBheWxvYWRzKCk6IEJ1ZmZlcltdIHtcbiAgICBpZiAodGhpcy5fdHhEYXRhLmlucHV0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNvbXB1dGUgc2lnbmFibGVQYXlsb2Fkczogbm8gaW5wdXRzJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl90eERhdGEuaW5wdXRzLm1hcCgoaW5wdXQsIGkpID0+XG4gICAgICBpc0VjZHNhSW5wdXQoaW5wdXQpXG4gICAgICAgID8gY29tcHV0ZUthc3BhRWNkc2FTaWduaW5nSGFzaCh0aGlzLl90eERhdGEsIGksIFNJR0hBU0hfQUxMKVxuICAgICAgICA6IGNvbXB1dGVLYXNwYVNpZ25pbmdIYXNoKHRoaXMuX3R4RGF0YSwgaSwgU0lHSEFTSF9BTEwpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSBhIHNpZ25hdHVyZSB0byBhIHNpbmdsZSBzcGVjaWZpYyBpbnB1dC5cbiAgICpcbiAgICogVXNlZCBpbiB0aGUgbXVsdGktaW5wdXQgTVBDdjIgZmxvdyB3aGVyZSBlYWNoIGlucHV0IGlzIHNpZ25lZCBieSBhblxuICAgKiBpbmRlcGVuZGVudCBES0xTIHNlc3Npb24gdGhhdCBjb21taXRzIHRvIHRoYXQgaW5wdXQncyBzaWdoYXNoLiBDYWxsIHRoaXNcbiAgICogb25jZSBwZXIgaW5wdXQgd2l0aCB0aGUgc2lnbmF0dXJlIHByb2R1Y2VkIGZvciB0aGF0IGlucHV0J3Mgc2lnbmFibGVQYXlsb2Fkc1tpXS5cbiAgICpcbiAgICogQHBhcmFtIGluZGV4ICAgICAgMC1iYXNlZCBpbmRleCBvZiB0aGUgaW5wdXQgdG8gc2lnblxuICAgKiBAcGFyYW0gcHVibGljS2V5ICBjb21wcmVzc2VkIHNlY3AyNTZrMSBwdWJsaWMga2V5ICgzMyBieXRlcyBoZXgpIOKAlCBub3QgdXNlZCBpblxuICAgKiAgICAgICAgICAgICAgICAgICB0aGUgc2NyaXB0U2lnIGJ5dGVzIGJ1dCBrZXB0IGZvciBzeW1tZXRyeSB3aXRoIGFkZFNpZ25hdHVyZVxuICAgKiBAcGFyYW0gc2lnbmF0dXJlICA2NC1ieXRlIHNpZ25hdHVyZSBidWZmZXIgZm9yIGlucHV0W2luZGV4XVxuICAgKiBAcGFyYW0gc2lnSGFzaFR5cGUgU2lnSGFzaCB0eXBlIChkZWZhdWx0OiBTSUdIQVNIX0FMTClcbiAgICovXG4gIGFkZFNpZ25hdHVyZUZvcklucHV0KGluZGV4OiBudW1iZXIsIHB1YmxpY0tleTogc3RyaW5nLCBzaWduYXR1cmU6IEJ1ZmZlciwgc2lnSGFzaFR5cGU6IG51bWJlciA9IFNJR0hBU0hfQUxMKTogdm9pZCB7XG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLl90eERhdGEuaW5wdXRzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnB1dCBpbmRleCAke2luZGV4fSBpcyBvdXQgb2YgcmFuZ2UgKHR4IGhhcyAke3RoaXMuX3R4RGF0YS5pbnB1dHMubGVuZ3RofSBpbnB1dHMpYCk7XG4gICAgfVxuICAgIGlmIChzaWduYXR1cmUubGVuZ3RoICE9PSA2NCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCA2NC1ieXRlIHNpZ25hdHVyZSwgZ290ICR7c2lnbmF0dXJlLmxlbmd0aH1gKTtcbiAgICB9XG4gICAgLy8gS2FzcGEgc2NyaXB0IGVuZ2luZSByZXF1aXJlcyBwdXNoLW9ubHkgc2lnbmF0dXJlU2NyaXB0cy5cbiAgICAvLyAweDQxID0gT1BfREFUQV82NTogcHVzaCB0aGUgbmV4dCA2NSBieXRlcyAoNjQtYnl0ZSBzaWcgKyAxLWJ5dGUgc2lnaGFzaCB0eXBlKSBvbnRvIHRoZSBzdGFjay5cbiAgICBjb25zdCBzaWdXaXRoVHlwZSA9IEJ1ZmZlci5jb25jYXQoW0J1ZmZlci5mcm9tKFsweDQxXSksIHNpZ25hdHVyZSwgQnVmZmVyLmZyb20oW3NpZ0hhc2hUeXBlXSldKTtcbiAgICB0aGlzLl90eERhdGEuaW5wdXRzW2luZGV4XS5zaWduYXR1cmVTY3JpcHQgPSBzaWdXaXRoVHlwZS50b1N0cmluZygnaGV4Jyk7XG4gIH1cblxuICAvKipcbiAgICogU2lnbiBhbGwgaW5wdXRzIHdpdGggdGhlIGdpdmVuIHByaXZhdGUga2V5LlxuICAgKlxuICAgKiBBdXRvbWF0aWNhbGx5IHNlbGVjdHMgdGhlIHNpZ25hdHVyZSBhbGdvcml0aG0gcGVyIGlucHV0IGJ5IGluc3BlY3RpbmcgZWFjaFxuICAgKiBpbnB1dCdzIHNjcmlwdFB1YmxpY0tleTpcbiAgICogICAtIFNjaG5vcnIgKGxhc3Qgb3Bjb2RlIDB4QUMsIHYwIGFkZHJlc3MpOiBCSVAtMzQwIFNjaG5vcnIgKyBCbGFrZTJiIHNpZ2hhc2hcbiAgICogICAtIEVDRFNBICAgKGxhc3Qgb3Bjb2RlIDB4QUIsIHYxIGFkZHJlc3MpOiBzZWNwMjU2azEgRUNEU0EgKyBCbGFrZTJiK1NIQTI1NiBzaWdoYXNoXG4gICAqXG4gICAqIEEgc2luZ2xlIHRyYW5zYWN0aW9uIG1heSBtaXggYm90aCBhZGRyZXNzIHR5cGVzIGFuZCBlYWNoIGlucHV0IHdpbGwgYmVcbiAgICogc2lnbmVkIGNvcnJlY3RseSB3aXRob3V0IGFueSBleHRyYSBwYXJhbWV0ZXJzLlxuICAgKlxuICAgKiBAcGFyYW0gcHJpdmF0ZUtleSAgMzItYnl0ZSBwcml2YXRlIGtleSBidWZmZXJcbiAgICogQHBhcmFtIHNpZ0hhc2hUeXBlIFNpZ0hhc2ggdHlwZSAoZGVmYXVsdDogU0lHSEFTSF9BTEwgPSAweDAxKVxuICAgKi9cbiAgc2lnbihwcml2YXRlS2V5OiBCdWZmZXIsIHNpZ0hhc2hUeXBlOiBudW1iZXIgPSBTSUdIQVNIX0FMTCk6IHZvaWQge1xuICAgIGlmIChwcml2YXRlS2V5Lmxlbmd0aCAhPT0gMzIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgMzItYnl0ZSBwcml2YXRlIGtleSwgZ290ICR7cHJpdmF0ZUtleS5sZW5ndGh9YCk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fdHhEYXRhLmlucHV0cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLl90eERhdGEuaW5wdXRzW2ldO1xuICAgICAgbGV0IHNpZzogVWludDhBcnJheTtcbiAgICAgIGxldCBzaWdIYXNoOiBCdWZmZXI7XG5cbiAgICAgIGlmIChpc0VjZHNhSW5wdXQoaW5wdXQpKSB7XG4gICAgICAgIC8vIHYxIEVDRFNBIGFkZHJlc3M6IGRvdWJsZS1oYXNoICsgY29tcGFjdCBzZWNwMjU2azEgRUNEU0Egc2lnbmF0dXJlXG4gICAgICAgIHNpZ0hhc2ggPSBjb21wdXRlS2FzcGFFY2RzYVNpZ25pbmdIYXNoKHRoaXMuX3R4RGF0YSwgaSwgc2lnSGFzaFR5cGUpO1xuICAgICAgICBzaWcgPSBlY2Muc2lnbihzaWdIYXNoLCBwcml2YXRlS2V5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHYwIFNjaG5vcnIgYWRkcmVzcyAoZGVmYXVsdCk6IEJsYWtlMmIgc2lnaGFzaCArIEJJUC0zNDAgU2Nobm9yciBzaWduYXR1cmVcbiAgICAgICAgc2lnSGFzaCA9IGNvbXB1dGVLYXNwYVNpZ25pbmdIYXNoKHRoaXMuX3R4RGF0YSwgaSwgc2lnSGFzaFR5cGUpO1xuICAgICAgICBzaWcgPSBlY2Muc2lnblNjaG5vcnIoc2lnSGFzaCwgcHJpdmF0ZUtleSk7XG4gICAgICB9XG4gICAgICAvLyBLYXNwYSByZXF1aXJlcyBwdXNoLW9ubHkgc2lnbmF0dXJlU2NyaXB0czogMHg0MSAoT1BfREFUQV82NSkgKyA2NC1ieXRlIHNpZyArIDEtYnl0ZSBzaWdoYXNoIHR5cGVcbiAgICAgIGNvbnN0IHNpZ1dpdGhUeXBlID0gQnVmZmVyLmNvbmNhdChbQnVmZmVyLmZyb20oWzB4NDFdKSwgQnVmZmVyLmZyb20oc2lnKSwgQnVmZmVyLmZyb20oW3NpZ0hhc2hUeXBlXSldKTtcbiAgICAgIHRoaXMuX3R4RGF0YS5pbnB1dHNbaV0uc2lnbmF0dXJlU2NyaXB0ID0gc2lnV2l0aFR5cGUudG9TdHJpbmcoJ2hleCcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZnkgdGhhdCB0aGUgc2lnbmF0dXJlIG9uIGEgc3BlY2lmaWMgaW5wdXQgaXMgdmFsaWQuXG4gICAqXG4gICAqIEF1dG9tYXRpY2FsbHkgc2VsZWN0cyB0aGUgdmVyaWZpY2F0aW9uIGFsZ29yaXRobSBiYXNlZCBvbiB0aGUgaW5wdXQnc1xuICAgKiBzY3JpcHRQdWJsaWNLZXkgKEVDRFNBIGZvciAweEFCLCBTY2hub3JyIGZvciAweEFDKSwgbWF0Y2hpbmcgYHNpZ24oKWAuXG4gICAqXG4gICAqIEBwYXJhbSBwdWJsaWNLZXkgIDMzLWJ5dGUgY29tcHJlc3NlZCBwdWJsaWMga2V5IChvciAzMi1ieXRlIHgtb25seSBmb3IgU2Nobm9ycilcbiAgICogQHBhcmFtIGlucHV0SW5kZXggSW5kZXggb2YgdGhlIGlucHV0IHRvIHZlcmlmeVxuICAgKiBAcGFyYW0gc2lnSGFzaFR5cGUgU2lnSGFzaCB0eXBlIHVzZWQgd2hlbiBzaWduaW5nXG4gICAqL1xuICB2ZXJpZnlTaWduYXR1cmUocHVibGljS2V5OiBCdWZmZXIsIGlucHV0SW5kZXg6IG51bWJlciwgc2lnSGFzaFR5cGU6IG51bWJlciA9IFNJR0hBU0hfQUxMKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaW5wdXQgPSB0aGlzLl90eERhdGEuaW5wdXRzW2lucHV0SW5kZXhdO1xuICAgIGlmICghaW5wdXQ/LnNpZ25hdHVyZVNjcmlwdCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBzaWdCeXRlcyA9IEJ1ZmZlci5mcm9tKGlucHV0LnNpZ25hdHVyZVNjcmlwdCwgJ2hleCcpO1xuICAgIC8vIHNpZ25hdHVyZVNjcmlwdCBsYXlvdXQ6IDB4NDEgKE9QX0RBVEFfNjUpICsgNjQtYnl0ZSBzaWcgKyAxLWJ5dGUgc2lnaGFzaCB0eXBlID0gNjYgYnl0ZXNcbiAgICBpZiAoc2lnQnl0ZXMubGVuZ3RoIDwgNjYpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3Qgc2lnID0gc2lnQnl0ZXMuc2xpY2UoMSwgNjUpOyAvLyBza2lwIHRoZSAweDQxIHB1c2ggb3Bjb2RlXG5cbiAgICBpZiAoaXNFY2RzYUlucHV0KGlucHV0KSkge1xuICAgICAgY29uc3Qgc2lnSGFzaCA9IGNvbXB1dGVLYXNwYUVjZHNhU2lnbmluZ0hhc2godGhpcy5fdHhEYXRhLCBpbnB1dEluZGV4LCBzaWdIYXNoVHlwZSk7XG4gICAgICAvLyBFQ0RTQSB2ZXJpZmljYXRpb24gcmVxdWlyZXMgMzMtYnl0ZSBjb21wcmVzc2VkIHB1YmxpYyBrZXlcbiAgICAgIGNvbnN0IGNvbXByZXNzZWRQdWIgPSBwdWJsaWNLZXkubGVuZ3RoID09PSAzMyA/IHB1YmxpY0tleSA6IEJ1ZmZlci5jb25jYXQoW0J1ZmZlci5mcm9tKFsweDAyXSksIHB1YmxpY0tleV0pO1xuICAgICAgcmV0dXJuIGVjYy52ZXJpZnkoc2lnSGFzaCwgY29tcHJlc3NlZFB1Yiwgc2lnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc2lnSGFzaCA9IGNvbXB1dGVLYXNwYVNpZ25pbmdIYXNoKHRoaXMuX3R4RGF0YSwgaW5wdXRJbmRleCwgc2lnSGFzaFR5cGUpO1xuICAgICAgLy8gU2Nobm9yciB2ZXJpZmljYXRpb24gdXNlcyB4LW9ubHkgKDMyLWJ5dGUpIHB1YmxpYyBrZXlcbiAgICAgIGNvbnN0IHhPbmx5UHViID0gcHVibGljS2V5Lmxlbmd0aCA9PT0gMzMgPyBwdWJsaWNLZXkuc2xpY2UoMSkgOiBwdWJsaWNLZXk7XG4gICAgICByZXR1cm4gZWNjLnZlcmlmeVNjaG5vcnIoc2lnSGFzaCwgeE9ubHlQdWIsIHNpZyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV4cGxhaW4gdGhlIHRyYW5zYWN0aW9uIGluIGEgaHVtYW4tcmVhZGFibGUgZm9ybWF0LlxuICAgKi9cbiAgZXhwbGFpblRyYW5zYWN0aW9uKCk6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24ge1xuICAgIGxldCB0b3RhbEluID0gQmlnSW50KDApO1xuICAgIGxldCB0b3RhbE91dCA9IEJpZ0ludCgwKTtcblxuICAgIGZvciAoY29uc3QgaW5wdXQgb2YgdGhpcy5fdHhEYXRhLmlucHV0cykge1xuICAgICAgdG90YWxJbiArPSBCaWdJbnQoaW5wdXQuYW1vdW50KTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBvdXRwdXQgb2YgdGhpcy5fdHhEYXRhLm91dHB1dHMpIHtcbiAgICAgIHRvdGFsT3V0ICs9IEJpZ0ludChvdXRwdXQuYW1vdW50KTtcbiAgICB9XG5cbiAgICBjb25zdCBmZWUgPSAodG90YWxJbiAtIHRvdGFsT3V0KS50b1N0cmluZygpO1xuXG4gICAgY29uc3Qgb3V0cHV0cyA9IHRoaXMuX3R4RGF0YS5vdXRwdXRzLm1hcCgobykgPT4gKHtcbiAgICAgIGFkZHJlc3M6IG8uYWRkcmVzcyxcbiAgICAgIGFtb3VudDogby5hbW91bnQsXG4gICAgfSkpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiB0aGlzLl90eERhdGEuaWQgfHwgJycsXG4gICAgICB0eXBlOiBUcmFuc2FjdGlvblR5cGUuU2VuZCxcbiAgICAgIG91dHB1dHMsXG4gICAgICBvdXRwdXRBbW91bnQ6IHRvdGFsT3V0LnRvU3RyaW5nKCksXG4gICAgICBjaGFuZ2VPdXRwdXRzOiBbXSxcbiAgICAgIGNoYW5nZUFtb3VudDogJzAnLFxuICAgICAgZmVlOiB7IGZlZTogdGhpcy5fdHhEYXRhLmZlZSB8fCBmZWUgfSxcbiAgICAgIGlucHV0czogdGhpcy5fdHhEYXRhLmlucHV0cyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSB0aGUgdHJhbnNhY3Rpb24gdG8gdGhlIEthc3BhIFJFU1QgQVBJIEpTT04gc3RyaW5nLlxuICAgKlxuICAgKiBUaGlzIGlzIHRoZSB3aXJlIGZvcm1hdCBhY2NlcHRlZCBieSB0aGUgS2FzcGEgbm9kZSBSRVNUIEFQSSBmb3IgYnJvYWRjYXN0aW5nLlxuICAgKiBVbnNpZ25lZCB0cmFuc2FjdGlvbnMgKHNpZ25hdHVyZVNjcmlwdCA9IFwiXCIpIHVzZSB0aGlzIHNhbWUgc3RydWN0dXJlOyBvbmNlXG4gICAqIGFsbCBpbnB1dHMgYXJlIHNpZ25lZCB0aGUgc2FtZSBmb3JtYXQgaXMgc3VibWl0dGVkIHRvIHRoZSBub2RlLlxuICAgKlxuICAgKiBOb3RlOiBpbnB1dHMgaW4gdGhpcyBmb3JtYXQgY2Fycnkgb25seSBgcHJldmlvdXNPdXRwb2ludGAsIGBzaWduYXR1cmVTY3JpcHRgLFxuICAgKiBgc2VxdWVuY2VgLCBhbmQgYHNpZ09wQ291bnRgLiBUaGUgYGFtb3VudGAgYW5kIGBzY3JpcHRQdWJsaWNLZXlgIGZpZWxkcyBuZWVkZWRcbiAgICogZm9yIHNpZ2hhc2ggY29tcHV0YXRpb24gYXJlIE5PVCBwcmVzZW50IGhlcmUg4oCUIHRoZXkgbGl2ZSBpbiBgdG9Kc29uKClgLlxuICAgKi9cbiAgdG9Ccm9hZGNhc3RGb3JtYXQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgdmVyc2lvbjogdGhpcy5fdHhEYXRhLnZlcnNpb24sXG4gICAgICBpbnB1dHM6IHRoaXMuX3R4RGF0YS5pbnB1dHMubWFwKChpbnB1dCkgPT4gKHtcbiAgICAgICAgcHJldmlvdXNPdXRwb2ludDoge1xuICAgICAgICAgIHRyYW5zYWN0aW9uSWQ6IGlucHV0LnRyYW5zYWN0aW9uSWQsXG4gICAgICAgICAgaW5kZXg6IGlucHV0LnRyYW5zYWN0aW9uSW5kZXgsXG4gICAgICAgIH0sXG4gICAgICAgIHNpZ25hdHVyZVNjcmlwdDogaW5wdXQuc2lnbmF0dXJlU2NyaXB0IHx8ICcnLFxuICAgICAgICBzZXF1ZW5jZTogTnVtYmVyKGlucHV0LnNlcXVlbmNlID8/IDApLFxuICAgICAgICBzaWdPcENvdW50OiBpbnB1dC5zaWdPcENvdW50ID8/IDEsXG4gICAgICB9KSksXG4gICAgICBvdXRwdXRzOiB0aGlzLl90eERhdGEub3V0cHV0cy5tYXAoKG91dHB1dCkgPT4gKHtcbiAgICAgICAgYW1vdW50OiBOdW1iZXIob3V0cHV0LmFtb3VudCksXG4gICAgICAgIHNjcmlwdFB1YmxpY0tleToge1xuICAgICAgICAgIHZlcnNpb246IDAsXG4gICAgICAgICAgc2NyaXB0UHVibGljS2V5OiBvdXRwdXQuc2NyaXB0UHVibGljS2V5IHx8ICcnLFxuICAgICAgICB9LFxuICAgICAgfSkpLFxuICAgICAgbG9ja1RpbWU6IE51bWJlcih0aGlzLl90eERhdGEubG9ja1RpbWUgPz8gMCksXG4gICAgICBzdWJuZXR3b3JrSWQ6IHRoaXMuX3R4RGF0YS5zdWJuZXR3b3JrSWQgPz8gJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICAgZ2FzOiAwLFxuICAgICAgcGF5bG9hZDogdGhpcy5fdHhEYXRhLnBheWxvYWQgPz8gJycsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIHRyYW5zYWN0aW9uIHRvIGhleCB1c2luZyB0aGUgaW50ZXJuYWwgYEthc3BhVHJhbnNhY3Rpb25EYXRhYCBmb3JtYXQuXG4gICAqXG4gICAqIFRoaXMgaGV4IGlzIHVzZWQgZm9yIFNESy1pbnRlcm5hbCByb3VuZC10cmlwcyAoYnVpbGRlciBzZXJpYWxpc2F0aW9uIC8gZGVzZXJpYWxpc2F0aW9uKVxuICAgKiBiZWNhdXNlIHRoZSBpbnRlcm5hbCBmb3JtYXQgcHJlc2VydmVzIGBhbW91bnRgIGFuZCBgc2NyaXB0UHVibGljS2V5YCBvbiBpbnB1dHMsXG4gICAqIHdoaWNoIGFyZSByZXF1aXJlZCBmb3Igc2lnaGFzaCBjb21wdXRhdGlvbiBidXQgYXJlIG5vdCBwcmVzZW50IGluIHRoZSBSRVNUIEFQSSBmb3JtYXQuXG4gICAqXG4gICAqIFVzZSBgQnVmZmVyLmZyb20odHgudG9Ccm9hZGNhc3RGb3JtYXQoKSkudG9TdHJpbmcoJ2hleCcpYCB3aGVuIHlvdSBuZWVkIHRoZSBoZXhcbiAgICogcmVwcmVzZW50YXRpb24gb2YgdGhlIGJyb2FkY2FzdCAvIEhTTSB3aXJlIGZvcm1hdC5cbiAgICovXG4gIHRvSGV4KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KHRoaXMuX3R4RGF0YSkpLnRvU3RyaW5nKCdoZXgnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdHJhbnNhY3Rpb24gZGF0YSBhcyBhIHBsYWluIG9iamVjdC5cbiAgICovXG4gIHRvSnNvbigpOiBLYXNwYVRyYW5zYWN0aW9uRGF0YSB7XG4gICAgcmV0dXJuIHsgLi4udGhpcy5fdHhEYXRhIH07XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgZnJvbSBoZXguXG4gICAqL1xuICBzdGF0aWMgZnJvbUhleChjb2luOiBzdHJpbmcsIGhleDogc3RyaW5nKTogVHJhbnNhY3Rpb24ge1xuICAgIGNvbnN0IGpzb24gPSBKU09OLnBhcnNlKEJ1ZmZlci5mcm9tKGhleCwgJ2hleCcpLnRvU3RyaW5nKCkpO1xuICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb24oY29pbiwganNvbik7XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgZnJvbSBKU09OIHN0cmluZyBvciBvYmplY3QuXG4gICAqL1xuICBzdGF0aWMgZnJvbUpzb24oY29pbjogc3RyaW5nLCBkYXRhOiBzdHJpbmcgfCBLYXNwYVRyYW5zYWN0aW9uRGF0YSk6IFRyYW5zYWN0aW9uIHtcbiAgICBjb25zdCB0eERhdGE6IEthc3BhVHJhbnNhY3Rpb25EYXRhID0gdHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZShkYXRhKSA6IGRhdGE7XG4gICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbihjb2luLCB0eERhdGEpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIGdldCBzaWduYXR1cmUoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl90eERhdGEuaW5wdXRzLm1hcCgoaSkgPT4gaS5zaWduYXR1cmVTY3JpcHQgfHwgJycpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIGNhblNpZ24oX2tleTogQmFzZUtleSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgdGhpcyB0cmFuc2FjdGlvbiB0byBhIFBTS1QgaW4gU0lHTkVSIHJvbGUuXG4gICAqXG4gICAqIFRoZSBQU0tUIGlzIHBvcHVsYXRlZCB3aXRoIFVUWE8gZGF0YSBmcm9tIGVhY2ggaW5wdXQgc28gdGhhdCBzaWdoYXNoXG4gICAqIGNvbXB1dGF0aW9uIGlzIHBvc3NpYmxlIGltbWVkaWF0ZWx5LiBBbnkgZXhpc3RpbmcgYHNpZ25hdHVyZVNjcmlwdGAgb24gYW5cbiAgICogaW5wdXQgaXMgY2FycmllZCBpbnRvIHRoZSBQU0tUIGFzIGBmaW5hbFNjcmlwdFNpZ2AuXG4gICAqXG4gICAqIFR5cGljYWwgdXNlOlxuICAgKiBgYGB0c1xuICAgKiBjb25zdCBwc2t0ID0gdHgudG9Qc2t0KClcbiAgICogICAuc2lnbihwcml2YXRlS2V5KVxuICAgKiAgIC50b0ZpbmFsaXplcigpXG4gICAqICAgLmZpbmFsaXplKClcbiAgICogICAudG9FeHRyYWN0b3IoKTtcbiAgICogY29uc3QgYnJvYWRjYXN0SnNvbiA9IHBza3QuZXh0cmFjdCgpO1xuICAgKiBgYGBcbiAgICovXG4gIHRvUHNrdCgpOiBQc2t0IHtcbiAgICByZXR1cm4gUHNrdC5mcm9tVHhEYXRhKHRoaXMuX3R4RGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogUmVjb25zdHJ1Y3QgYSBUcmFuc2FjdGlvbiBmcm9tIGEgUFNLVCAoYW55IHJvbGUpLlxuICAgKlxuICAgKiBgZmluYWxTY3JpcHRTaWdgIGZyb20gZWFjaCBQU0tUIGlucHV0IGlzIG1hcHBlZCB0byBgc2lnbmF0dXJlU2NyaXB0YCBzb1xuICAgKiB0aGF0IHRoZSByZXN1bHRpbmcgdHJhbnNhY3Rpb24gaXMgc2lnbmVkIGlmIHRoZSBQU0tUIGhhcyBiZWVuIGZpbmFsaXNlZC5cbiAgICpcbiAgICogQHBhcmFtIGNvaW4gIENvaW4gbmFtZSBzdHJpbmcgKGUuZy4gJ2thc3BhJywgJ3RrYXNwYScpXG4gICAqIEBwYXJhbSBwc2t0ICBBIFBza3QgaW5zdGFuY2UgKHR5cGljYWxseSBhdCBGSU5BTElaRVIgb3IgRVhUUkFDVE9SIHJvbGUpXG4gICAqL1xuICBzdGF0aWMgZnJvbVBza3QoY29pbjogc3RyaW5nLCBwc2t0OiBQc2t0KTogVHJhbnNhY3Rpb24ge1xuICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb24oY29pbiwgcHNrdC50b1R4RGF0YSgpKTtcbiAgfVxufVxuIl19
@@ -3,6 +3,7 @@ import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
3
3
  import BigNumber from 'bignumber.js';
4
4
  import { Transaction } from './transaction';
5
5
  import { KaspaUtxoInput, KaspaTransactionOutput } from './iface';
6
+ import { Pskt } from './pskt';
6
7
  export declare class TransactionBuilder extends BaseTransactionBuilder {
7
8
  protected _transaction: Transaction;
8
9
  protected _inputs: KaspaUtxoInput[];
@@ -54,5 +55,26 @@ export declare class TransactionBuilder extends BaseTransactionBuilder {
54
55
  validateRawTransaction(rawTransaction: string): void;
55
56
  /** @inheritDoc */
56
57
  validateValue(value: BigNumber): void;
58
+ /**
59
+ * Build the transaction and return it as an unsigned PSKT in UPDATER role.
60
+ *
61
+ * The PSKT has all inputs and outputs populated with UTXO data but no
62
+ * signatures. It is ready to be handed to a signer (HSM, hardware wallet,
63
+ * or MPCv2 session) via `pskt.toSigner().sign(key)` or
64
+ * `pskt.toSigner().addSignature(...)`.
65
+ *
66
+ * Example:
67
+ * ```ts
68
+ * const pskt = await builder.toPskt();
69
+ * const broadcastJson = pskt
70
+ * .toSigner()
71
+ * .sign(privateKey)
72
+ * .toFinalizer()
73
+ * .finalize()
74
+ * .toExtractor()
75
+ * .extract();
76
+ * ```
77
+ */
78
+ toPskt(): Promise<Pskt>;
57
79
  }
58
80
  //# sourceMappingURL=transactionBuilder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"transactionBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/transactionBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,eAAe,EAAE,OAAO,EAAgB,MAAM,sBAAsB,CAAC;AACtG,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,SAAS,MAAM,cAAc,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAwB,cAAc,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAKvF,qBAAa,kBAAmB,SAAQ,sBAAsB;IAC5D,SAAS,CAAC,YAAY,EAAE,WAAW,CAAC;IACpC,SAAS,CAAC,OAAO,EAAE,cAAc,EAAE,CAAM;IACzC,SAAS,CAAC,QAAQ,EAAE,sBAAsB,EAAE,CAAM;IAClD,SAAS,CAAC,IAAI,EAAE,MAAM,CAAe;IACrC,SAAS,CAAC,YAAY,SAAM;gBAEhB,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC;IAK5C,kBAAkB;IAClB,SAAS,KAAK,WAAW,IAAI,eAAe,CAE3C;IAED,kBAAkB;IAClB,SAAS,KAAK,WAAW,CAAC,EAAE,EAAE,eAAe,EAE5C;IAED;;OAEG;IACH,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAQ7B;;OAEG;IACH,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAQzC;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAKtB;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAQpC;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,IAAI;IAKxC,kBAAkB;IAClB,SAAS,CAAC,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,WAAW;IASjE,kBAAkB;cACF,mBAAmB,IAAI,OAAO,CAAC,eAAe,CAAC;IAe/D,kBAAkB;IAClB,SAAS,CAAC,kBAAkB,CAAC,EAAE,GAAG,EAAE,EAAE,OAAO,GAAG,eAAe;IAU/D,kBAAkB;IAClB,mBAAmB,CAAC,YAAY,CAAC,EAAE,eAAe,GAAG,IAAI;IASzD,kBAAkB;IAClB,WAAW,CAAC,GAAG,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAIvC,kBAAkB;IAClB,eAAe,CAAC,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAMnD,kBAAkB;IAClB,sBAAsB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAQpD,kBAAkB;IAClB,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;CAKtC"}
1
+ {"version":3,"file":"transactionBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/transactionBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,eAAe,EAAE,OAAO,EAAgB,MAAM,sBAAsB,CAAC;AACtG,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,SAAS,MAAM,cAAc,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAwB,cAAc,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAIvF,OAAO,EAAE,IAAI,EAAyB,MAAM,QAAQ,CAAC;AAErD,qBAAa,kBAAmB,SAAQ,sBAAsB;IAC5D,SAAS,CAAC,YAAY,EAAE,WAAW,CAAC;IACpC,SAAS,CAAC,OAAO,EAAE,cAAc,EAAE,CAAM;IACzC,SAAS,CAAC,QAAQ,EAAE,sBAAsB,EAAE,CAAM;IAClD,SAAS,CAAC,IAAI,EAAE,MAAM,CAAe;IACrC,SAAS,CAAC,YAAY,SAAM;gBAEhB,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC;IAK5C,kBAAkB;IAClB,SAAS,KAAK,WAAW,IAAI,eAAe,CAE3C;IAED,kBAAkB;IAClB,SAAS,KAAK,WAAW,CAAC,EAAE,EAAE,eAAe,EAE5C;IAED;;OAEG;IACH,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAQ7B;;OAEG;IACH,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAQzC;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAKtB;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAQpC;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,IAAI;IAKxC,kBAAkB;IAClB,SAAS,CAAC,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,WAAW;IASjE,kBAAkB;cACF,mBAAmB,IAAI,OAAO,CAAC,eAAe,CAAC;IAgB/D,kBAAkB;IAClB,SAAS,CAAC,kBAAkB,CAAC,EAAE,GAAG,EAAE,EAAE,OAAO,GAAG,eAAe;IAU/D,kBAAkB;IAClB,mBAAmB,CAAC,YAAY,CAAC,EAAE,eAAe,GAAG,IAAI;IASzD,kBAAkB;IAClB,WAAW,CAAC,GAAG,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAIvC,kBAAkB;IAClB,eAAe,CAAC,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAMnD,kBAAkB;IAClB,sBAAsB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAQpD,kBAAkB;IAClB,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAMrC;;;;;;;;;;;;;;;;;;;OAmBG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;CA8B9B"}
@@ -6,6 +6,7 @@ const transaction_1 = require("./transaction");
6
6
  const utils_1 = require("./utils");
7
7
  const keyPair_1 = require("./keyPair");
8
8
  const constants_1 = require("./constants");
9
+ const pskt_1 = require("./pskt");
9
10
  class TransactionBuilder extends sdk_core_1.BaseTransactionBuilder {
10
11
  constructor(coinConfig) {
11
12
  super(coinConfig);
@@ -40,7 +41,7 @@ class TransactionBuilder extends sdk_core_1.BaseTransactionBuilder {
40
41
  if (!(0, utils_1.isValidKaspaAddress)(address)) {
41
42
  throw new Error(`Invalid Kaspa recipient address: ${address}`);
42
43
  }
43
- this._outputs.push({ address, amount });
44
+ this._outputs.push({ address, amount, scriptPublicKey: (0, utils_1.addressToScriptPublicKey)(address) });
44
45
  return this;
45
46
  }
46
47
  /**
@@ -69,7 +70,7 @@ class TransactionBuilder extends sdk_core_1.BaseTransactionBuilder {
69
70
  }
70
71
  /** @inheritDoc */
71
72
  fromImplementation(rawTransaction) {
72
- const tx = transaction_1.Transaction.fromHex(this._coinConfig?.name || 'kaspa', rawTransaction);
73
+ const tx = transaction_1.Transaction.fromHex(this._coinConfig.name, rawTransaction);
73
74
  this._transaction = tx;
74
75
  this._inputs = tx.txData.inputs || [];
75
76
  this._outputs = tx.txData.outputs || [];
@@ -87,7 +88,7 @@ class TransactionBuilder extends sdk_core_1.BaseTransactionBuilder {
87
88
  subnetworkId: '0000000000000000000000000000000000000000',
88
89
  payload: '',
89
90
  };
90
- this._transaction = new transaction_1.Transaction(this._coinConfig?.name || 'kaspa', txData);
91
+ this._transaction = new transaction_1.Transaction(this._coinConfig.name, txData);
91
92
  return this._transaction;
92
93
  }
93
94
  /** @inheritDoc */
@@ -122,7 +123,7 @@ class TransactionBuilder extends sdk_core_1.BaseTransactionBuilder {
122
123
  /** @inheritDoc */
123
124
  validateRawTransaction(rawTransaction) {
124
125
  try {
125
- transaction_1.Transaction.fromHex(this._coinConfig?.name || 'kaspa', rawTransaction);
126
+ transaction_1.Transaction.fromHex(this._coinConfig.name, rawTransaction);
126
127
  }
127
128
  catch {
128
129
  throw new Error('Invalid raw Kaspa transaction');
@@ -134,6 +135,53 @@ class TransactionBuilder extends sdk_core_1.BaseTransactionBuilder {
134
135
  throw new Error('Transaction value cannot be negative');
135
136
  }
136
137
  }
138
+ /**
139
+ * Build the transaction and return it as an unsigned PSKT in UPDATER role.
140
+ *
141
+ * The PSKT has all inputs and outputs populated with UTXO data but no
142
+ * signatures. It is ready to be handed to a signer (HSM, hardware wallet,
143
+ * or MPCv2 session) via `pskt.toSigner().sign(key)` or
144
+ * `pskt.toSigner().addSignature(...)`.
145
+ *
146
+ * Example:
147
+ * ```ts
148
+ * const pskt = await builder.toPskt();
149
+ * const broadcastJson = pskt
150
+ * .toSigner()
151
+ * .sign(privateKey)
152
+ * .toFinalizer()
153
+ * .finalize()
154
+ * .toExtractor()
155
+ * .extract();
156
+ * ```
157
+ */
158
+ async toPskt() {
159
+ this.validateTransaction();
160
+ const psktInputs = this._inputs.map((inp) => ({
161
+ previousOutpoint: { transactionId: inp.transactionId, index: inp.transactionIndex },
162
+ utxoEntry: { amount: inp.amount, scriptPublicKey: inp.scriptPublicKey },
163
+ sequence: inp.sequence,
164
+ sigOpCount: inp.sigOpCount ?? 1,
165
+ partialSigs: {},
166
+ sighashType: constants_1.SIGHASH_ALL,
167
+ bip32Derivations: {},
168
+ proprietaries: {},
169
+ }));
170
+ const psktOutputs = this._outputs.map((out) => ({
171
+ amount: out.amount,
172
+ scriptPublicKey: { version: 0, scriptPublicKey: out.scriptPublicKey || (0, utils_1.addressToScriptPublicKey)(out.address) },
173
+ bip32Derivations: {},
174
+ proprietaries: {},
175
+ }));
176
+ const pskt = pskt_1.Pskt.creator(constants_1.TX_VERSION);
177
+ for (const inp of psktInputs) {
178
+ pskt.input(inp);
179
+ }
180
+ for (const out of psktOutputs) {
181
+ pskt.output(out);
182
+ }
183
+ return pskt.toUpdater();
184
+ }
137
185
  }
138
186
  exports.TransactionBuilder = TransactionBuilder;
139
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi90cmFuc2FjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbURBQXNHO0FBR3RHLCtDQUE0QztBQUU1QyxtQ0FBOEM7QUFDOUMsdUNBQW9DO0FBQ3BDLDJDQUFzRDtBQUV0RCxNQUFhLGtCQUFtQixTQUFRLGlDQUFzQjtJQU81RCxZQUFZLFVBQWdDO1FBQzFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQU5WLFlBQU8sR0FBcUIsRUFBRSxDQUFDO1FBQy9CLGFBQVEsR0FBNkIsRUFBRSxDQUFDO1FBQ3hDLFNBQUksR0FBVyx1QkFBVyxDQUFDO1FBQzNCLGlCQUFZLEdBQUcsRUFBRSxDQUFDO1FBSTFCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSx5QkFBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLElBQWMsV0FBVztRQUN2QixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDM0IsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixJQUFjLFdBQVcsQ0FBQyxFQUFtQjtRQUMzQyxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQWlCLENBQUM7SUFDeEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLE9BQWU7UUFDcEIsSUFBSSxDQUFDLElBQUEsMkJBQW1CLEVBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNsQyxNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFDRCxJQUFJLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQztRQUM1QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7T0FFRztJQUNILEVBQUUsQ0FBQyxPQUFlLEVBQUUsTUFBYztRQUNoQyxJQUFJLENBQUMsSUFBQSwy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LENBQUM7UUFDMUQsQ0FBQztJQUNILENBQUM7Q0FDRjtBQWpKRCxnREFpSkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlVHJhbnNhY3Rpb25CdWlsZGVyLCBCYXNlVHJhbnNhY3Rpb24sIEJhc2VLZXksIFNpZ25pbmdFcnJvciB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IEJhc2VDb2luIGFzIENvaW5Db25maWcgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBLYXNwYVRyYW5zYWN0aW9uRGF0YSwgS2FzcGFVdHhvSW5wdXQsIEthc3BhVHJhbnNhY3Rpb25PdXRwdXQgfSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IGlzVmFsaWRLYXNwYUFkZHJlc3MgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IEtleVBhaXIgfSBmcm9tICcuL2tleVBhaXInO1xuaW1wb3J0IHsgREVGQVVMVF9GRUUsIFRYX1ZFUlNJT04gfSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbkJ1aWxkZXIgZXh0ZW5kcyBCYXNlVHJhbnNhY3Rpb25CdWlsZGVyIHtcbiAgcHJvdGVjdGVkIF90cmFuc2FjdGlvbjogVHJhbnNhY3Rpb247XG4gIHByb3RlY3RlZCBfaW5wdXRzOiBLYXNwYVV0eG9JbnB1dFtdID0gW107XG4gIHByb3RlY3RlZCBfb3V0cHV0czogS2FzcGFUcmFuc2FjdGlvbk91dHB1dFtdID0gW107XG4gIHByb3RlY3RlZCBfZmVlOiBzdHJpbmcgPSBERUZBVUxUX0ZFRTtcbiAgcHJvdGVjdGVkIF9mcm9tQWRkcmVzcyA9ICcnO1xuXG4gIGNvbnN0cnVjdG9yKGNvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoY29pbkNvbmZpZyk7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24oY29pbkNvbmZpZy5uYW1lKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBwcm90ZWN0ZWQgZ2V0IHRyYW5zYWN0aW9uKCk6IEJhc2VUcmFuc2FjdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zYWN0aW9uO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIHByb3RlY3RlZCBzZXQgdHJhbnNhY3Rpb24odHg6IEJhc2VUcmFuc2FjdGlvbikge1xuICAgIHRoaXMuX3RyYW5zYWN0aW9uID0gdHggYXMgVHJhbnNhY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBzZW5kZXIgYWRkcmVzcy5cbiAgICovXG4gIHNlbmRlcihhZGRyZXNzOiBzdHJpbmcpOiB0aGlzIHtcbiAgICBpZiAoIWlzVmFsaWRLYXNwYUFkZHJlc3MoYWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBLYXNwYSBhZGRyZXNzOiAke2FkZHJlc3N9YCk7XG4gICAgfVxuICAgIHRoaXMuX2Zyb21BZGRyZXNzID0gYWRkcmVzcztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSByZWNpcGllbnQgb3V0cHV0LlxuICAgKi9cbiAgdG8oYWRkcmVzczogc3RyaW5nLCBhbW91bnQ6IHN0cmluZyk6IHRoaXMge1xuICAgIGlmICghaXNWYWxpZEthc3BhQWRkcmVzcyhhZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIEthc3BhIHJlY2lwaWVudCBhZGRyZXNzOiAke2FkZHJlc3N9YCk7XG4gICAgfVxuICAgIHRoaXMuX291dHB1dHMucHVzaCh7IGFkZHJlc3MsIGFtb3VudCB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdHJhbnNhY3Rpb24gZmVlIGluIHNvbXBpLlxuICAgKi9cbiAgZmVlKGZlZTogc3RyaW5nKTogdGhpcyB7XG4gICAgdGhpcy5fZmVlID0gZmVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIFVUWE8gaW5wdXQuXG4gICAqL1xuICBhZGRJbnB1dCh1dHhvOiBLYXNwYVV0eG9JbnB1dCk6IHRoaXMge1xuICAgIGlmICghdXR4by50cmFuc2FjdGlvbklkIHx8IHV0eG8udHJhbnNhY3Rpb25JbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgVVRYTzogbWlzc2luZyB0cmFuc2FjdGlvbklkIG9yIHRyYW5zYWN0aW9uSW5kZXgnKTtcbiAgICB9XG4gICAgdGhpcy5faW5wdXRzLnB1c2godXR4byk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIG11bHRpcGxlIFVUWE8gaW5wdXRzLlxuICAgKi9cbiAgYWRkSW5wdXRzKHV0eG9zOiBLYXNwYVV0eG9JbnB1dFtdKTogdGhpcyB7XG4gICAgdXR4b3MuZm9yRWFjaCgodSkgPT4gdGhpcy5hZGRJbnB1dCh1KSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgcHJvdGVjdGVkIGZyb21JbXBsZW1lbnRhdGlvbihyYXdUcmFuc2FjdGlvbjogc3RyaW5nKTogVHJhbnNhY3Rpb24ge1xuICAgIGNvbnN0IHR4ID0gVHJhbnNhY3Rpb24uZnJvbUhleCgodGhpcyBhcyBhbnkpLl9jb2luQ29uZmlnPy5uYW1lIHx8ICdrYXNwYScsIHJhd1RyYW5zYWN0aW9uKTtcbiAgICB0aGlzLl90cmFuc2FjdGlvbiA9IHR4O1xuICAgIHRoaXMuX2lucHV0cyA9IHR4LnR4RGF0YS5pbnB1dHMgfHwgW107XG4gICAgdGhpcy5fb3V0cHV0cyA9IHR4LnR4RGF0YS5vdXRwdXRzIHx8IFtdO1xuICAgIHRoaXMuX2ZlZSA9IHR4LnR4RGF0YS5mZWUgfHwgREVGQVVMVF9GRUU7XG4gICAgcmV0dXJuIHR4O1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIHByb3RlY3RlZCBhc3luYyBidWlsZEltcGxlbWVudGF0aW9uKCk6IFByb21pc2U8QmFzZVRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgdHhEYXRhOiBLYXNwYVRyYW5zYWN0aW9uRGF0YSA9IHtcbiAgICAgIHZlcnNpb246IFRYX1ZFUlNJT04sXG4gICAgICBpbnB1dHM6IHRoaXMuX2lucHV0cyxcbiAgICAgIG91dHB1dHM6IHRoaXMuX291dHB1dHMsXG4gICAgICBmZWU6IHRoaXMuX2ZlZSxcbiAgICAgIGxvY2tUaW1lOiAnMCcsXG4gICAgICBzdWJuZXR3b3JrSWQ6ICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAgIHBheWxvYWQ6ICcnLFxuICAgIH07XG5cbiAgICB0aGlzLl90cmFuc2FjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbigodGhpcyBhcyBhbnkpLl9jb2luQ29uZmlnPy5uYW1lIHx8ICdrYXNwYScsIHR4RGF0YSk7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zYWN0aW9uO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIHByb3RlY3RlZCBzaWduSW1wbGVtZW50YXRpb24oeyBrZXkgfTogQmFzZUtleSk6IEJhc2VUcmFuc2FjdGlvbiB7XG4gICAgY29uc3Qga2V5UGFpciA9IG5ldyBLZXlQYWlyKHsgcHJ2OiBrZXkgfSk7XG4gICAgY29uc3QgcHJpdmF0ZUtleSA9IGtleVBhaXIuZ2V0S2V5cygpLnBydjtcbiAgICBpZiAoIXByaXZhdGVLZXkpIHtcbiAgICAgIHRocm93IG5ldyBTaWduaW5nRXJyb3IoJ01pc3NpbmcgcHJpdmF0ZSBrZXknKTtcbiAgICB9XG4gICAgdGhpcy5fdHJhbnNhY3Rpb24uc2lnbihCdWZmZXIuZnJvbShwcml2YXRlS2V5LCAnaGV4JykpO1xuICAgIHJldHVybiB0aGlzLl90cmFuc2FjdGlvbjtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICB2YWxpZGF0ZVRyYW5zYWN0aW9uKF90cmFuc2FjdGlvbj86IEJhc2VUcmFuc2FjdGlvbik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9pbnB1dHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0F0IGxlYXN0IG9uZSBVVFhPIGlucHV0IGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9vdXRwdXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdCBsZWFzdCBvbmUgb3V0cHV0IGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIHZhbGlkYXRlS2V5KGtleTogeyBrZXk6IHN0cmluZyB9KTogdm9pZCB7XG4gICAgLy8gS2V5IHZhbGlkYXRpb24gaGFuZGxlZCBpbiBLZXlQYWlyXG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgdmFsaWRhdGVBZGRyZXNzKGFkZHJlc3M6IHsgYWRkcmVzczogc3RyaW5nIH0pOiB2b2lkIHtcbiAgICBpZiAoIWlzVmFsaWRLYXNwYUFkZHJlc3MoYWRkcmVzcy5hZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIEthc3BhIGFkZHJlc3M6ICR7YWRkcmVzcy5hZGRyZXNzfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICB2YWxpZGF0ZVJhd1RyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgVHJhbnNhY3Rpb24uZnJvbUhleCgodGhpcyBhcyBhbnkpLl9jb2luQ29uZmlnPy5uYW1lIHx8ICdrYXNwYScsIHJhd1RyYW5zYWN0aW9uKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCByYXcgS2FzcGEgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgdmFsaWRhdGVWYWx1ZSh2YWx1ZTogQmlnTnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlLmlzTGVzc1RoYW4oMCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHJhbnNhY3Rpb24gdmFsdWUgY2Fubm90IGJlIG5lZ2F0aXZlJyk7XG4gICAgfVxuICB9XG59XG4iXX0=
187
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi90cmFuc2FjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbURBQXNHO0FBR3RHLCtDQUE0QztBQUU1QyxtQ0FBd0U7QUFDeEUsdUNBQW9DO0FBQ3BDLDJDQUFtRTtBQUNuRSxpQ0FBcUQ7QUFFckQsTUFBYSxrQkFBbUIsU0FBUSxpQ0FBc0I7SUFPNUQsWUFBWSxVQUFnQztRQUMxQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFOVixZQUFPLEdBQXFCLEVBQUUsQ0FBQztRQUMvQixhQUFRLEdBQTZCLEVBQUUsQ0FBQztRQUN4QyxTQUFJLEdBQVcsdUJBQVcsQ0FBQztRQUMzQixpQkFBWSxHQUFHLEVBQUUsQ0FBQztRQUkxQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUkseUJBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixJQUFjLFdBQVc7UUFDdkIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsSUFBYyxXQUFXLENBQUMsRUFBbUI7UUFDM0MsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFpQixDQUFDO0lBQ3hDLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxPQUFlO1FBQ3BCLElBQUksQ0FBQyxJQUFBLDJCQUFtQixFQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUN2RCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUM7UUFDNUIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxFQUFFLENBQUMsT0FBZSxFQUFFLE1BQWM7UUFDaEMsSUFB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LENBQUM7UUFDdEMsS0FBSyxNQUFNLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLENBQUM7UUFDRCxLQUFLLE1BQU0sR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkIsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQzFCLENBQUM7Q0FDRjtBQXJNRCxnREFxTUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlVHJhbnNhY3Rpb25CdWlsZGVyLCBCYXNlVHJhbnNhY3Rpb24sIEJhc2VLZXksIFNpZ25pbmdFcnJvciB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IEJhc2VDb2luIGFzIENvaW5Db25maWcgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBLYXNwYVRyYW5zYWN0aW9uRGF0YSwgS2FzcGFVdHhvSW5wdXQsIEthc3BhVHJhbnNhY3Rpb25PdXRwdXQgfSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IGlzVmFsaWRLYXNwYUFkZHJlc3MsIGFkZHJlc3NUb1NjcmlwdFB1YmxpY0tleSB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgS2V5UGFpciB9IGZyb20gJy4va2V5UGFpcic7XG5pbXBvcnQgeyBERUZBVUxUX0ZFRSwgVFhfVkVSU0lPTiwgU0lHSEFTSF9BTEwgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBQc2t0LCBQc2t0SW5wdXQsIFBza3RPdXRwdXQgfSBmcm9tICcuL3Bza3QnO1xuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25CdWlsZGVyIGV4dGVuZHMgQmFzZVRyYW5zYWN0aW9uQnVpbGRlciB7XG4gIHByb3RlY3RlZCBfdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uO1xuICBwcm90ZWN0ZWQgX2lucHV0czogS2FzcGFVdHhvSW5wdXRbXSA9IFtdO1xuICBwcm90ZWN0ZWQgX291dHB1dHM6IEthc3BhVHJhbnNhY3Rpb25PdXRwdXRbXSA9IFtdO1xuICBwcm90ZWN0ZWQgX2ZlZTogc3RyaW5nID0gREVGQVVMVF9GRUU7XG4gIHByb3RlY3RlZCBfZnJvbUFkZHJlc3MgPSAnJztcblxuICBjb25zdHJ1Y3Rvcihjb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKGNvaW5Db25maWcpO1xuICAgIHRoaXMuX3RyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKGNvaW5Db25maWcubmFtZSk7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgcHJvdGVjdGVkIGdldCB0cmFuc2FjdGlvbigpOiBCYXNlVHJhbnNhY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLl90cmFuc2FjdGlvbjtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBwcm90ZWN0ZWQgc2V0IHRyYW5zYWN0aW9uKHR4OiBCYXNlVHJhbnNhY3Rpb24pIHtcbiAgICB0aGlzLl90cmFuc2FjdGlvbiA9IHR4IGFzIFRyYW5zYWN0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgc2VuZGVyIGFkZHJlc3MuXG4gICAqL1xuICBzZW5kZXIoYWRkcmVzczogc3RyaW5nKTogdGhpcyB7XG4gICAgaWYgKCFpc1ZhbGlkS2FzcGFBZGRyZXNzKGFkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgS2FzcGEgYWRkcmVzczogJHthZGRyZXNzfWApO1xuICAgIH1cbiAgICB0aGlzLl9mcm9tQWRkcmVzcyA9IGFkZHJlc3M7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgcmVjaXBpZW50IG91dHB1dC5cbiAgICovXG4gIHRvKGFkZHJlc3M6IHN0cmluZywgYW1vdW50OiBzdHJpbmcpOiB0aGlzIHtcbiAgICBpZiAoIWlzVmFsaWRLYXNwYUFkZHJlc3MoYWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBLYXNwYSByZWNpcGllbnQgYWRkcmVzczogJHthZGRyZXNzfWApO1xuICAgIH1cbiAgICB0aGlzLl9vdXRwdXRzLnB1c2goeyBhZGRyZXNzLCBhbW91bnQsIHNjcmlwdFB1YmxpY0tleTogYWRkcmVzc1RvU2NyaXB0UHVibGljS2V5KGFkZHJlc3MpIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0cmFuc2FjdGlvbiBmZWUgaW4gc29tcGkuXG4gICAqL1xuICBmZWUoZmVlOiBzdHJpbmcpOiB0aGlzIHtcbiAgICB0aGlzLl9mZWUgPSBmZWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgVVRYTyBpbnB1dC5cbiAgICovXG4gIGFkZElucHV0KHV0eG86IEthc3BhVXR4b0lucHV0KTogdGhpcyB7XG4gICAgaWYgKCF1dHhvLnRyYW5zYWN0aW9uSWQgfHwgdXR4by50cmFuc2FjdGlvbkluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBVVFhPOiBtaXNzaW5nIHRyYW5zYWN0aW9uSWQgb3IgdHJhbnNhY3Rpb25JbmRleCcpO1xuICAgIH1cbiAgICB0aGlzLl9pbnB1dHMucHVzaCh1dHhvKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgbXVsdGlwbGUgVVRYTyBpbnB1dHMuXG4gICAqL1xuICBhZGRJbnB1dHModXR4b3M6IEthc3BhVXR4b0lucHV0W10pOiB0aGlzIHtcbiAgICB1dHhvcy5mb3JFYWNoKCh1KSA9PiB0aGlzLmFkZElucHV0KHUpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBwcm90ZWN0ZWQgZnJvbUltcGxlbWVudGF0aW9uKHJhd1RyYW5zYWN0aW9uOiBzdHJpbmcpOiBUcmFuc2FjdGlvbiB7XG4gICAgY29uc3QgdHggPSBUcmFuc2FjdGlvbi5mcm9tSGV4KHRoaXMuX2NvaW5Db25maWcubmFtZSwgcmF3VHJhbnNhY3Rpb24pO1xuICAgIHRoaXMuX3RyYW5zYWN0aW9uID0gdHg7XG4gICAgdGhpcy5faW5wdXRzID0gdHgudHhEYXRhLmlucHV0cyB8fCBbXTtcbiAgICB0aGlzLl9vdXRwdXRzID0gdHgudHhEYXRhLm91dHB1dHMgfHwgW107XG4gICAgdGhpcy5fZmVlID0gdHgudHhEYXRhLmZlZSB8fCBERUZBVUxUX0ZFRTtcbiAgICByZXR1cm4gdHg7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGJ1aWxkSW1wbGVtZW50YXRpb24oKTogUHJvbWlzZTxCYXNlVHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCB0eERhdGE6IEthc3BhVHJhbnNhY3Rpb25EYXRhID0ge1xuICAgICAgdmVyc2lvbjogVFhfVkVSU0lPTixcbiAgICAgIGlucHV0czogdGhpcy5faW5wdXRzLFxuICAgICAgb3V0cHV0czogdGhpcy5fb3V0cHV0cyxcbiAgICAgIGZlZTogdGhpcy5fZmVlLFxuICAgICAgbG9ja1RpbWU6ICcwJyxcbiAgICAgIHN1Ym5ldHdvcmtJZDogJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICAgcGF5bG9hZDogJycsXG4gICAgfTtcblxuICAgIHRoaXMuX3RyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKHRoaXMuX2NvaW5Db25maWcubmFtZSwgdHhEYXRhKTtcblxuICAgIHJldHVybiB0aGlzLl90cmFuc2FjdGlvbjtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBwcm90ZWN0ZWQgc2lnbkltcGxlbWVudGF0aW9uKHsga2V5IH06IEJhc2VLZXkpOiBCYXNlVHJhbnNhY3Rpb24ge1xuICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgS2V5UGFpcih7IHBydjoga2V5IH0pO1xuICAgIGNvbnN0IHByaXZhdGVLZXkgPSBrZXlQYWlyLmdldEtleXMoKS5wcnY7XG4gICAgaWYgKCFwcml2YXRlS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgU2lnbmluZ0Vycm9yKCdNaXNzaW5nIHByaXZhdGUga2V5Jyk7XG4gICAgfVxuICAgIHRoaXMuX3RyYW5zYWN0aW9uLnNpZ24oQnVmZmVyLmZyb20ocHJpdmF0ZUtleSwgJ2hleCcpKTtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNhY3Rpb247XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgdmFsaWRhdGVUcmFuc2FjdGlvbihfdHJhbnNhY3Rpb24/OiBCYXNlVHJhbnNhY3Rpb24pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5faW5wdXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdCBsZWFzdCBvbmUgVVRYTyBpbnB1dCBpcyByZXF1aXJlZCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fb3V0cHV0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXQgbGVhc3Qgb25lIG91dHB1dCBpcyByZXF1aXJlZCcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICB2YWxpZGF0ZUtleShrZXk6IHsga2V5OiBzdHJpbmcgfSk6IHZvaWQge1xuICAgIC8vIEtleSB2YWxpZGF0aW9uIGhhbmRsZWQgaW4gS2V5UGFpclxuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIHZhbGlkYXRlQWRkcmVzcyhhZGRyZXNzOiB7IGFkZHJlc3M6IHN0cmluZyB9KTogdm9pZCB7XG4gICAgaWYgKCFpc1ZhbGlkS2FzcGFBZGRyZXNzKGFkZHJlc3MuYWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBLYXNwYSBhZGRyZXNzOiAke2FkZHJlc3MuYWRkcmVzc31gKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgdmFsaWRhdGVSYXdUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIFRyYW5zYWN0aW9uLmZyb21IZXgodGhpcy5fY29pbkNvbmZpZy5uYW1lLCByYXdUcmFuc2FjdGlvbik7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcmF3IEthc3BhIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIHZhbGlkYXRlVmFsdWUodmFsdWU6IEJpZ051bWJlcik6IHZvaWQge1xuICAgIGlmICh2YWx1ZS5pc0xlc3NUaGFuKDApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RyYW5zYWN0aW9uIHZhbHVlIGNhbm5vdCBiZSBuZWdhdGl2ZScpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCB0aGUgdHJhbnNhY3Rpb24gYW5kIHJldHVybiBpdCBhcyBhbiB1bnNpZ25lZCBQU0tUIGluIFVQREFURVIgcm9sZS5cbiAgICpcbiAgICogVGhlIFBTS1QgaGFzIGFsbCBpbnB1dHMgYW5kIG91dHB1dHMgcG9wdWxhdGVkIHdpdGggVVRYTyBkYXRhIGJ1dCBub1xuICAgKiBzaWduYXR1cmVzLiBJdCBpcyByZWFkeSB0byBiZSBoYW5kZWQgdG8gYSBzaWduZXIgKEhTTSwgaGFyZHdhcmUgd2FsbGV0LFxuICAgKiBvciBNUEN2MiBzZXNzaW9uKSB2aWEgYHBza3QudG9TaWduZXIoKS5zaWduKGtleSlgIG9yXG4gICAqIGBwc2t0LnRvU2lnbmVyKCkuYWRkU2lnbmF0dXJlKC4uLilgLlxuICAgKlxuICAgKiBFeGFtcGxlOlxuICAgKiBgYGB0c1xuICAgKiBjb25zdCBwc2t0ID0gYXdhaXQgYnVpbGRlci50b1Bza3QoKTtcbiAgICogY29uc3QgYnJvYWRjYXN0SnNvbiA9IHBza3RcbiAgICogICAudG9TaWduZXIoKVxuICAgKiAgIC5zaWduKHByaXZhdGVLZXkpXG4gICAqICAgLnRvRmluYWxpemVyKClcbiAgICogICAuZmluYWxpemUoKVxuICAgKiAgIC50b0V4dHJhY3RvcigpXG4gICAqICAgLmV4dHJhY3QoKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyB0b1Bza3QoKTogUHJvbWlzZTxQc2t0PiB7XG4gICAgdGhpcy52YWxpZGF0ZVRyYW5zYWN0aW9uKCk7XG5cbiAgICBjb25zdCBwc2t0SW5wdXRzOiBQc2t0SW5wdXRbXSA9IHRoaXMuX2lucHV0cy5tYXAoKGlucCkgPT4gKHtcbiAgICAgIHByZXZpb3VzT3V0cG9pbnQ6IHsgdHJhbnNhY3Rpb25JZDogaW5wLnRyYW5zYWN0aW9uSWQsIGluZGV4OiBpbnAudHJhbnNhY3Rpb25JbmRleCB9LFxuICAgICAgdXR4b0VudHJ5OiB7IGFtb3VudDogaW5wLmFtb3VudCwgc2NyaXB0UHVibGljS2V5OiBpbnAuc2NyaXB0UHVibGljS2V5IH0sXG4gICAgICBzZXF1ZW5jZTogaW5wLnNlcXVlbmNlLFxuICAgICAgc2lnT3BDb3VudDogaW5wLnNpZ09wQ291bnQgPz8gMSxcbiAgICAgIHBhcnRpYWxTaWdzOiB7fSxcbiAgICAgIHNpZ2hhc2hUeXBlOiBTSUdIQVNIX0FMTCxcbiAgICAgIGJpcDMyRGVyaXZhdGlvbnM6IHt9LFxuICAgICAgcHJvcHJpZXRhcmllczoge30sXG4gICAgfSkpO1xuXG4gICAgY29uc3QgcHNrdE91dHB1dHM6IFBza3RPdXRwdXRbXSA9IHRoaXMuX291dHB1dHMubWFwKChvdXQpID0+ICh7XG4gICAgICBhbW91bnQ6IG91dC5hbW91bnQsXG4gICAgICBzY3JpcHRQdWJsaWNLZXk6IHsgdmVyc2lvbjogMCwgc2NyaXB0UHVibGljS2V5OiBvdXQuc2NyaXB0UHVibGljS2V5IHx8IGFkZHJlc3NUb1NjcmlwdFB1YmxpY0tleShvdXQuYWRkcmVzcykgfSxcbiAgICAgIGJpcDMyRGVyaXZhdGlvbnM6IHt9LFxuICAgICAgcHJvcHJpZXRhcmllczoge30sXG4gICAgfSkpO1xuXG4gICAgY29uc3QgcHNrdCA9IFBza3QuY3JlYXRvcihUWF9WRVJTSU9OKTtcbiAgICBmb3IgKGNvbnN0IGlucCBvZiBwc2t0SW5wdXRzKSB7XG4gICAgICBwc2t0LmlucHV0KGlucCk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qgb3V0IG9mIHBza3RPdXRwdXRzKSB7XG4gICAgICBwc2t0Lm91dHB1dChvdXQpO1xuICAgIH1cbiAgICByZXR1cm4gcHNrdC50b1VwZGF0ZXIoKTtcbiAgfVxufVxuIl19
@@ -1,15 +1,20 @@
1
+ import { BaseTransactionBuilderFactory } from '@bitgo-beta/sdk-core';
1
2
  import { BaseCoin as StaticsBaseCoin } from '@bitgo-beta/statics';
2
3
  import { TransactionBuilder } from './transactionBuilder';
3
- export declare class TransactionBuilderFactory {
4
- protected _coinConfig: Readonly<StaticsBaseCoin>;
4
+ export declare class TransactionBuilderFactory extends BaseTransactionBuilderFactory {
5
5
  constructor(coinConfig: Readonly<StaticsBaseCoin>);
6
6
  /**
7
7
  * Get a base transaction builder for Kaspa transfers.
8
8
  */
9
9
  getBuilder(): TransactionBuilder;
10
+ /** @inheritdoc */
11
+ getTransferBuilder(): TransactionBuilder;
10
12
  /**
11
- * Reconstruct a transaction builder from a raw transaction hex.
13
+ * Kaspa does not have a wallet initialization transaction.
14
+ * @throws NotImplementedError
12
15
  */
16
+ getWalletInitializationBuilder(): never;
17
+ /** @inheritdoc */
13
18
  from(rawTransaction: string): TransactionBuilder;
14
19
  }
15
20
  //# sourceMappingURL=transactionBuilderFactory.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"transactionBuilderFactory.d.ts","sourceRoot":"","sources":["../../../src/lib/transactionBuilderFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,qBAAa,yBAAyB;IACpC,SAAS,CAAC,WAAW,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC;gBAErC,UAAU,EAAE,QAAQ,CAAC,eAAe,CAAC;IAIjD;;OAEG;IACH,UAAU,IAAI,kBAAkB;IAIhC;;OAEG;IACH,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,kBAAkB;CAKjD"}
1
+ {"version":3,"file":"transactionBuilderFactory.d.ts","sourceRoot":"","sources":["../../../src/lib/transactionBuilderFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAuB,MAAM,sBAAsB,CAAC;AAC1F,OAAO,EAAE,QAAQ,IAAI,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,qBAAa,yBAA0B,SAAQ,6BAA6B;gBAC9D,UAAU,EAAE,QAAQ,CAAC,eAAe,CAAC;IAIjD;;OAEG;IACH,UAAU,IAAI,kBAAkB;IAIhC,kBAAkB;IAClB,kBAAkB,IAAI,kBAAkB;IAIxC;;;OAGG;IACH,8BAA8B,IAAI,KAAK;IAIvC,kBAAkB;IAClB,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,kBAAkB;CAKjD"}
@@ -1,10 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.TransactionBuilderFactory = void 0;
4
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
4
5
  const transactionBuilder_1 = require("./transactionBuilder");
5
- class TransactionBuilderFactory {
6
+ class TransactionBuilderFactory extends sdk_core_1.BaseTransactionBuilderFactory {
6
7
  constructor(coinConfig) {
7
- this._coinConfig = coinConfig;
8
+ super(coinConfig);
8
9
  }
9
10
  /**
10
11
  * Get a base transaction builder for Kaspa transfers.
@@ -12,9 +13,18 @@ class TransactionBuilderFactory {
12
13
  getBuilder() {
13
14
  return new transactionBuilder_1.TransactionBuilder(this._coinConfig);
14
15
  }
16
+ /** @inheritdoc */
17
+ getTransferBuilder() {
18
+ return this.getBuilder();
19
+ }
15
20
  /**
16
- * Reconstruct a transaction builder from a raw transaction hex.
21
+ * Kaspa does not have a wallet initialization transaction.
22
+ * @throws NotImplementedError
17
23
  */
24
+ getWalletInitializationBuilder() {
25
+ throw new sdk_core_1.NotImplementedError('getWalletInitializationBuilder is not supported for Kaspa');
26
+ }
27
+ /** @inheritdoc */
18
28
  from(rawTransaction) {
19
29
  const builder = this.getBuilder();
20
30
  builder.from(rawTransaction);
@@ -22,4 +32,4 @@ class TransactionBuilderFactory {
22
32
  }
23
33
  }
24
34
  exports.TransactionBuilderFactory = TransactionBuilderFactory;
25
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvdHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSw2REFBMEQ7QUFFMUQsTUFBYSx5QkFBeUI7SUFHcEMsWUFBWSxVQUFxQztRQUMvQyxJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxVQUFVO1FBQ1IsT0FBTyxJQUFJLHVDQUFrQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLENBQUMsY0FBc0I7UUFDekIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xDLE9BQU8sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDN0IsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztDQUNGO0FBdEJELDhEQXNCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VDb2luIGFzIFN0YXRpY3NCYXNlQ29pbiB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi90cmFuc2FjdGlvbkJ1aWxkZXInO1xuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSB7XG4gIHByb3RlY3RlZCBfY29pbkNvbmZpZzogUmVhZG9ubHk8U3RhdGljc0Jhc2VDb2luPjtcblxuICBjb25zdHJ1Y3Rvcihjb2luQ29uZmlnOiBSZWFkb25seTxTdGF0aWNzQmFzZUNvaW4+KSB7XG4gICAgdGhpcy5fY29pbkNvbmZpZyA9IGNvaW5Db25maWc7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgYmFzZSB0cmFuc2FjdGlvbiBidWlsZGVyIGZvciBLYXNwYSB0cmFuc2ZlcnMuXG4gICAqL1xuICBnZXRCdWlsZGVyKCk6IFRyYW5zYWN0aW9uQnVpbGRlciB7XG4gICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXIodGhpcy5fY29pbkNvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICogUmVjb25zdHJ1Y3QgYSB0cmFuc2FjdGlvbiBidWlsZGVyIGZyb20gYSByYXcgdHJhbnNhY3Rpb24gaGV4LlxuICAgKi9cbiAgZnJvbShyYXdUcmFuc2FjdGlvbjogc3RyaW5nKTogVHJhbnNhY3Rpb25CdWlsZGVyIHtcbiAgICBjb25zdCBidWlsZGVyID0gdGhpcy5nZXRCdWlsZGVyKCk7XG4gICAgYnVpbGRlci5mcm9tKHJhd1RyYW5zYWN0aW9uKTtcbiAgICByZXR1cm4gYnVpbGRlcjtcbiAgfVxufVxuIl19
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvdHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtREFBMEY7QUFFMUYsNkRBQTBEO0FBRTFELE1BQWEseUJBQTBCLFNBQVEsd0NBQTZCO0lBQzFFLFlBQVksVUFBcUM7UUFDL0MsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3BCLENBQUM7SUFFRDs7T0FFRztJQUNILFVBQVU7UUFDUixPQUFPLElBQUksdUNBQWtCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsa0JBQWtCO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7O09BR0c7SUFDSCw4QkFBOEI7UUFDNUIsTUFBTSxJQUFJLDhCQUFtQixDQUFDLDJEQUEyRCxDQUFDLENBQUM7SUFDN0YsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixJQUFJLENBQUMsY0FBc0I7UUFDekIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xDLE9BQU8sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDN0IsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztDQUNGO0FBL0JELDhEQStCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5LCBOb3RJbXBsZW1lbnRlZEVycm9yIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgQmFzZUNvaW4gYXMgU3RhdGljc0Jhc2VDb2luIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXIgfSBmcm9tICcuL3RyYW5zYWN0aW9uQnVpbGRlcic7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5IGV4dGVuZHMgQmFzZVRyYW5zYWN0aW9uQnVpbGRlckZhY3Rvcnkge1xuICBjb25zdHJ1Y3Rvcihjb2luQ29uZmlnOiBSZWFkb25seTxTdGF0aWNzQmFzZUNvaW4+KSB7XG4gICAgc3VwZXIoY29pbkNvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgYmFzZSB0cmFuc2FjdGlvbiBidWlsZGVyIGZvciBLYXNwYSB0cmFuc2ZlcnMuXG4gICAqL1xuICBnZXRCdWlsZGVyKCk6IFRyYW5zYWN0aW9uQnVpbGRlciB7XG4gICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXIodGhpcy5fY29pbkNvbmZpZyk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgZ2V0VHJhbnNmZXJCdWlsZGVyKCk6IFRyYW5zYWN0aW9uQnVpbGRlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QnVpbGRlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEthc3BhIGRvZXMgbm90IGhhdmUgYSB3YWxsZXQgaW5pdGlhbGl6YXRpb24gdHJhbnNhY3Rpb24uXG4gICAqIEB0aHJvd3MgTm90SW1wbGVtZW50ZWRFcnJvclxuICAgKi9cbiAgZ2V0V2FsbGV0SW5pdGlhbGl6YXRpb25CdWlsZGVyKCk6IG5ldmVyIHtcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcignZ2V0V2FsbGV0SW5pdGlhbGl6YXRpb25CdWlsZGVyIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIEthc3BhJyk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgZnJvbShyYXdUcmFuc2FjdGlvbjogc3RyaW5nKTogVHJhbnNhY3Rpb25CdWlsZGVyIHtcbiAgICBjb25zdCBidWlsZGVyID0gdGhpcy5nZXRCdWlsZGVyKCk7XG4gICAgYnVpbGRlci5mcm9tKHJhd1RyYW5zYWN0aW9uKTtcbiAgICByZXR1cm4gYnVpbGRlcjtcbiAgfVxufVxuIl19