@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
@@ -1,4 +1,5 @@
1
1
  import { BaseUtils } from '@bitgo-beta/sdk-core';
2
+ import { KaspaAddressType } from './constants';
2
3
  /**
3
4
  * Validates a Kaspa address (mainnet or testnet)
4
5
  */
@@ -12,12 +13,25 @@ export declare function isValidMainnetAddress(address: string): boolean;
12
13
  */
13
14
  export declare function isValidTestnetAddress(address: string): boolean;
14
15
  /**
15
- * Derive a Kaspa P2PK (Schnorr) address from a compressed secp256k1 public key.
16
+ * Decode a Kaspa address to its P2PK scriptPublicKey hex string.
17
+ *
18
+ * Reverses pubKeyToKaspaAddress: decodes the bech32 payload, reads the version
19
+ * byte to determine the script type, and builds the locking script.
20
+ *
21
+ * v0 (Schnorr): 0x20 || xOnlyPubKey(32B) || 0xAC (OpCheckSig)
22
+ * v1 (ECDSA): 0x21 || compressedPubKey(33B) || 0xAB (OpCheckSigECDSA)
23
+ *
24
+ * Used by TransactionBuilder to populate output scriptPublicKeys from addresses.
25
+ */
26
+ export declare function addressToScriptPublicKey(address: string): string;
27
+ /**
28
+ * Derive a Kaspa P2PK address from a compressed secp256k1 public key.
16
29
  *
17
30
  * @param compressedPubKey - 33-byte compressed secp256k1 public key (hex string or Buffer)
18
- * @param hrp - human-readable part ('kaspa' or 'kaspatest')
31
+ * @param hrp - human-readable part ('kaspa' or 'kaspatest')
32
+ * @param type - address type (default: SCHNORR / v0)
19
33
  */
20
- export declare function pubKeyToKaspaAddress(compressedPubKey: string | Buffer, hrp: string): string;
34
+ export declare function pubKeyToKaspaAddress(compressedPubKey: string | Buffer, hrp: string, type?: KaspaAddressType): string;
21
35
  /**
22
36
  * Validates a secp256k1 public key (compressed or uncompressed)
23
37
  */
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA4B,MAAM,sBAAsB,CAAC;AAmH3E;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAqB5D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,gBAAgB,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAoB3F;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAgBrD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAatD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED,qBAAa,KAAM,YAAW,SAAS;IACrC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIxC,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIrC,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIvC,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAItC,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAI5C,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAG5C;AAED,QAAA,MAAM,KAAK,OAAc,CAAC;AAC1B,eAAe,KAAK,CAAC"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA4B,MAAM,sBAAsB,CAAC;AAC3E,OAAO,EAAkC,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAkH/E;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAqB5D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAuBhE;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,gBAAgB,EAAE,MAAM,GAAG,MAAM,EACjC,GAAG,EAAE,MAAM,EACX,IAAI,GAAE,gBAA2C,GAChD,MAAM,CAgBR;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAgBrD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAatD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED,qBAAa,KAAM,YAAW,SAAS;IACrC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIxC,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIrC,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIvC,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAItC,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAI5C,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAG5C;AAED,QAAA,MAAM,KAAK,OAAc,CAAC;AAC1B,eAAe,KAAK,CAAC"}
@@ -4,6 +4,7 @@ exports.Utils = void 0;
4
4
  exports.isValidKaspaAddress = isValidKaspaAddress;
5
5
  exports.isValidMainnetAddress = isValidMainnetAddress;
6
6
  exports.isValidTestnetAddress = isValidTestnetAddress;
7
+ exports.addressToScriptPublicKey = addressToScriptPublicKey;
7
8
  exports.pubKeyToKaspaAddress = pubKeyToKaspaAddress;
8
9
  exports.isValidPublicKey = isValidPublicKey;
9
10
  exports.isValidPrivateKey = isValidPrivateKey;
@@ -143,25 +144,58 @@ function isValidTestnetAddress(address) {
143
144
  return isValidKaspaAddress(address) && address.toLowerCase().startsWith(constants_1.TESTNET_PREFIX + ':');
144
145
  }
145
146
  /**
146
- * Derive a Kaspa P2PK (Schnorr) address from a compressed secp256k1 public key.
147
+ * Decode a Kaspa address to its P2PK scriptPublicKey hex string.
148
+ *
149
+ * Reverses pubKeyToKaspaAddress: decodes the bech32 payload, reads the version
150
+ * byte to determine the script type, and builds the locking script.
151
+ *
152
+ * v0 (Schnorr): 0x20 || xOnlyPubKey(32B) || 0xAC (OpCheckSig)
153
+ * v1 (ECDSA): 0x21 || compressedPubKey(33B) || 0xAB (OpCheckSigECDSA)
154
+ *
155
+ * Used by TransactionBuilder to populate output scriptPublicKeys from addresses.
156
+ */
157
+ function addressToScriptPublicKey(address) {
158
+ const { data: words } = kaspacDecode(address);
159
+ const payload = Buffer.from(convertBits(Buffer.from(words), 5, 8, false));
160
+ // First byte is the version / address type.
161
+ const version = payload[0];
162
+ const keyBytes = payload.slice(1);
163
+ if (version === constants_1.KaspaAddressType.SCHNORR) {
164
+ // v0: keyBytes is 32-byte x-only pubkey
165
+ if (keyBytes.length !== 32) {
166
+ throw new Error(`Invalid Schnorr address payload length: ${keyBytes.length}`);
167
+ }
168
+ return Buffer.concat([Buffer.from([0x20]), keyBytes, Buffer.from([0xac])]).toString('hex');
169
+ }
170
+ else if (version === constants_1.KaspaAddressType.ECDSA) {
171
+ // v1: keyBytes is 33-byte compressed pubkey
172
+ if (keyBytes.length !== 33) {
173
+ throw new Error(`Invalid ECDSA address payload length: ${keyBytes.length}`);
174
+ }
175
+ return Buffer.concat([Buffer.from([0x21]), keyBytes, Buffer.from([0xab])]).toString('hex');
176
+ }
177
+ else {
178
+ throw new Error(`Unknown Kaspa address version: ${version}`);
179
+ }
180
+ }
181
+ /**
182
+ * Derive a Kaspa P2PK address from a compressed secp256k1 public key.
147
183
  *
148
184
  * @param compressedPubKey - 33-byte compressed secp256k1 public key (hex string or Buffer)
149
- * @param hrp - human-readable part ('kaspa' or 'kaspatest')
185
+ * @param hrp - human-readable part ('kaspa' or 'kaspatest')
186
+ * @param type - address type (default: SCHNORR / v0)
150
187
  */
151
- function pubKeyToKaspaAddress(compressedPubKey, hrp) {
188
+ function pubKeyToKaspaAddress(compressedPubKey, hrp, type = constants_1.KaspaAddressType.SCHNORR) {
152
189
  const pubKeyBytes = Buffer.isBuffer(compressedPubKey)
153
190
  ? compressedPubKey
154
191
  : Buffer.from(compressedPubKey, 'hex');
155
192
  if (pubKeyBytes.length !== 33) {
156
193
  throw new Error(`Expected 33-byte compressed public key, got ${pubKeyBytes.length}`);
157
194
  }
158
- // X-only public key: drop the prefix byte (02 or 03), keep 32-byte x-coordinate
159
- const xOnlyPubKey = pubKeyBytes.slice(1);
160
- // Kaspa P2PK address:
161
- // - version nibble: 0 (Schnorr secp256k1 P2PK)
162
- // - payload: x-only public key (32 bytes)
163
- const versionByte = 0;
164
- const payload = Buffer.concat([Buffer.from([versionByte]), xOnlyPubKey]);
195
+ // Schnorr (v0): payload uses the 32-byte x-only key (drop the 02/03 prefix).
196
+ // ECDSA (v1): payload uses the full 33-byte compressed key (prefix byte kept).
197
+ const keyPayload = type === constants_1.KaspaAddressType.SCHNORR ? pubKeyBytes.slice(1) : pubKeyBytes;
198
+ const payload = Buffer.concat([Buffer.from([type]), keyPayload]);
165
199
  const words = convertBits(payload, 8, 5, true);
166
200
  return kaspaEncode(hrp, words);
167
201
  }
@@ -233,4 +267,4 @@ class Utils {
233
267
  exports.Utils = Utils;
234
268
  const utils = new Utils();
235
269
  exports.default = utils;
236
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQXNIQSxrREFxQkM7QUFLRCxzREFFQztBQUtELHNEQUVDO0FBUUQsb0RBb0JDO0FBS0QsNENBZ0JDO0FBS0QsOENBYUM7QUFLRCxvREFFQztBQW5PRCxtREFBMkU7QUFDM0UsMkNBQTZEO0FBRTdELHlFQUF5RTtBQUN6RSxvRUFBb0U7QUFFcEUsTUFBTSxPQUFPLEdBQUcsa0NBQWtDLENBQUM7QUFDbkQsTUFBTSxlQUFlLEdBQTJCLEVBQUUsQ0FBQztBQUNuRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO0lBQ3hDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbEMsQ0FBQztBQUVELE1BQU0sU0FBUyxHQUFHO0lBQ2hCLE1BQU0sQ0FBQyxjQUFjLENBQUM7SUFDdEIsTUFBTSxDQUFDLGNBQWMsQ0FBQztJQUN0QixNQUFNLENBQUMsY0FBYyxDQUFDO0lBQ3RCLE1BQU0sQ0FBQyxjQUFjLENBQUM7SUFDdEIsTUFBTSxDQUFDLGNBQWMsQ0FBQztDQUN2QixDQUFDO0FBRUYsU0FBUyxPQUFPLENBQUMsTUFBZ0I7SUFDL0IsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ1gsS0FBSyxNQUFNLENBQUMsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUN2QixNQUFNLEVBQUUsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDO1FBQ3BCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMs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Q1AsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0FBQ0gsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0Isb0JBQW9CLENBQUMsSUFBWTtJQUMvQyxPQUFPLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN4QyxDQUFDO0FBRUQsTUFBYSxLQUFLO0lBQ2hCLGNBQWMsQ0FBQyxPQUFlO1FBQzVCLE9BQU8sbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELGNBQWMsQ0FBQyxJQUFZO1FBQ3pCLE9BQU8sbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxHQUFXO1FBQzNCLE9BQU8saUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELGdCQUFnQixDQUFDLEdBQVc7UUFDMUIsT0FBTyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsU0FBaUI7UUFDaEMsT0FBTyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVELG9CQUFvQixDQUFDLElBQVk7UUFDL0IsT0FBTyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQyxDQUFDO0NBQ0Y7QUF4QkQsc0JBd0JDO0FBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztBQUMxQixrQkFBZSxLQUFLLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlVXRpbHMsIGlzVmFsaWRYcHJ2LCBpc1ZhbGlkWHB1YiB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IE1BSU5ORVRfUFJFRklYLCBURVNUTkVUX1BSRUZJWCB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuLy8gS2FzcGEgYWRkcmVzcyBlbmNvZGluZyB1c2VzIGEgYmVjaDMyLWxpa2Ugc2NoZW1lIHdpdGggJzonIGFzIHNlcGFyYXRvclxuLy8gYW5kIGEgY3VzdG9tIGNoZWNrc3VtIHBvbHlub21pYWwgKHNhbWUgYXMgQml0Y29pbiBDYXNoIGNhc2hhZGRyKS5cblxuY29uc3QgQ0hBUlNFVCA9ICdxcHpyeTl4OGdmMnR2ZHcwczNqbjU0a2hjZTZtdWE3bCc7XG5jb25zdCBDSEFSU0VUX1JFVkVSU0U6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcbmZvciAobGV0IGkgPSAwOyBpIDwgQ0hBUlNFVC5sZW5ndGg7IGkrKykge1xuICBDSEFSU0VUX1JFVkVSU0VbQ0hBUlNFVFtpXV0gPSBpO1xufVxuXG5jb25zdCBHRU5FUkFUT1IgPSBbXG4gIEJpZ0ludCgnMHg5OGYyYmM4ZTYxJyksXG4gIEJpZ0ludCgnMHg3OWI3NmQ5OWUyJyksXG4gIEJpZ0ludCgnMHhmMzNlNWZiM2M0JyksXG4gIEJpZ0ludCgnMHhhZTJlYWJlMmE4JyksXG4gIEJpZ0ludCgnMHgxZTRmNDNlNDcwJyksXG5dO1xuXG5mdW5jdGlvbiBwb2x5bW9kKHZhbHVlczogbnVtYmVyW10pOiBiaWdpbnQge1xuICBsZXQgYyA9IDFuO1xuICBmb3IgKGNvbnN0IGQgb2YgdmFsdWVzKSB7XG4gICAgY29uc3QgYzAgPSBjID4+IDM1bjtcbiAgICBjID0gKChjICYgQmlnSW50KCcweDA3ZmZmZmZmZmYnKSkgPDwgNW4pIF4gQmlnSW50KGQpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNTsgaSsrKSB7XG4gICAgICBpZiAoKGMwID4+IEJpZ0ludChpKSkgJiAxbikge1xuICAgICAgICBjIF49IEdFTkVSQVRPUltpXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGMgXiAxbjtcbn1cblxuZnVuY3Rpb24gcHJlZml4RXhwYW5kKHByZWZpeDogc3RyaW5nKTogbnVtYmVyW10ge1xuICByZXR1cm4gWy4uLnByZWZpeF0ubWFwKChjKSA9PiBjLmNoYXJDb2RlQXQoMCkgJiAweDFmKS5jb25jYXQoWzBdKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ2hlY2tzdW0ocHJlZml4OiBzdHJpbmcsIGRhdGE6IG51bWJlcltdKTogbnVtYmVyW10ge1xuICBjb25zdCB2YWx1ZXMgPSBwcmVmaXhFeHBhbmQocHJlZml4KS5jb25jYXQoZGF0YSkuY29uY2F0KFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwXSk7XG4gIGNvbnN0IG1vZCA9IHBvbHltb2QodmFsdWVzKTtcbiAgY29uc3QgcmV0OiBudW1iZXJbXSA9IFtdO1xuICBmb3IgKGxldCBpID0gNzsgaSA+PSAwOyBpLS0pIHtcbiAgICByZXQucHVzaChOdW1iZXIoKG1vZCA+PiBCaWdJbnQoNSAqIGkpKSAmIDMxbikpO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIHZlcmlmeUNoZWNrc3VtKHByZWZpeDogc3RyaW5nLCBkYXRhOiBudW1iZXJbXSk6IGJvb2xlYW4ge1xuICBjb25zdCB2YWx1ZXMgPSBwcmVmaXhFeHBhbmQocHJlZml4KS5jb25jYXQoZGF0YSk7XG4gIHJldHVybiBwb2x5bW9kKHZhbHVlcykgPT09IDBuO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0Qml0cyhkYXRhOiBCdWZmZXIgfCBVaW50OEFycmF5LCBmcm9tOiBudW1iZXIsIHRvOiBudW1iZXIsIHBhZDogYm9vbGVhbik6IG51bWJlcltdIHtcbiAgbGV0IGFjYyA9IDA7XG4gIGxldCBiaXRzID0gMDtcbiAgY29uc3QgcmV0OiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBtYXh2ID0gKDEgPDwgdG8pIC0gMTtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBkYXRhKSB7XG4gICAgYWNjID0gKGFjYyA8PCBmcm9tKSB8IHZhbHVlO1xuICAgIGJpdHMgKz0gZnJvbTtcbiAgICB3aGlsZSAoYml0cyA+PSB0bykge1xuICAgICAgYml0cyAtPSB0bztcbiAgICAgIHJldC5wdXNoKChhY2MgPj4gYml0cykgJiBtYXh2KTtcbiAgICB9XG4gIH1cbiAgaWYgKHBhZCAmJiBiaXRzID4gMCkge1xuICAgIHJldC5wdXNoKChhY2MgPDwgKHRvIC0gYml0cykpICYgbWF4dik7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuLyoqXG4gKiBFbmNvZGUgZGF0YSBpbnRvIGEgS2FzcGEgYmVjaDMyLWxpa2UgYWRkcmVzcy5cbiAqL1xuZnVuY3Rpb24ga2FzcGFFbmNvZGUocHJlZml4OiBzdHJpbmcsIGRhdGE6IG51bWJlcltdKTogc3RyaW5nIHtcbiAgY29uc3QgY2hlY2tzdW0gPSBjcmVhdGVDaGVja3N1bShwcmVmaXgsIGRhdGEpO1xuICByZXR1cm4gKFxuICAgIHByZWZpeCArXG4gICAgJzonICtcbiAgICBkYXRhXG4gICAgICAuY29uY2F0KGNoZWNrc3VtKVxuICAgICAgLm1hcCgoZCkgPT4gQ0hBUlNFVFtkXSlcbiAgICAgIC5qb2luKCcnKVxuICApO1xufVxuXG4vKipcbiAqIERlY29kZSBhIEthc3BhIGJlY2gzMi1saWtlIGFkZHJlc3MuXG4gKiBSZXR1cm5zIHsgcHJlZml4LCBkYXRhIH0gb3IgdGhyb3dzIG9uIGVycm9yLlxuICovXG5mdW5jdGlvbiBrYXNwYWNEZWNvZGUoYWRkcmVzczogc3RyaW5nKTogeyBwcmVmaXg6IHN0cmluZzsgZGF0YTogbnVtYmVyW10gfSB7XG4gIGNvbnN0IGNvbG9uSWR4ID0gYWRkcmVzcy5sYXN0SW5kZXhPZignOicpO1xuICBpZiAoY29sb25JZHggPCAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHByZWZpeCBzZXBhcmF0b3InKTtcbiAgfVxuICBjb25zdCBwcmVmaXggPSBhZGRyZXNzLnNsaWNlKDAsIGNvbG9uSWR4KS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBlbmNvZGVkID0gYWRkcmVzcy5zbGljZShjb2xvbklkeCArIDEpLnRvTG93ZXJDYXNlKCk7XG5cbiAgY29uc3QgZGF0YTogbnVtYmVyW10gPSBbXTtcbiAgZm9yIChjb25zdCBjIG9mIGVuY29kZWQpIHtcbiAgICBjb25zdCB2YWwgPSBDSEFSU0VUX1JFVkVSU0VbY107XG4gICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY2hhcmFjdGVyOiAke2N9YCk7XG4gICAgfVxuICAgIGRhdGEucHVzaCh2YWwpO1xuICB9XG5cbiAgaWYgKCF2ZXJpZnlDaGVja3N1bShwcmVmaXgsIGRhdGEpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNoZWNrc3VtJyk7XG4gIH1cblxuICByZXR1cm4geyBwcmVmaXgsIGRhdGE6IGRhdGEuc2xpY2UoMCwgLTgpIH07XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIGEgS2FzcGEgYWRkcmVzcyAobWFpbm5ldCBvciB0ZXN0bmV0KVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZEthc3BhQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKCFhZGRyZXNzIHx8IHR5cGVvZiBhZGRyZXNzICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGNvbG9uSWR4ID0gYWRkcmVzcy5sYXN0SW5kZXhPZignOicpO1xuICBpZiAoY29sb25JZHggPCAxKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgcHJlZml4ID0gYWRkcmVzcy5zbGljZSgwLCBjb2xvbklkeCkudG9Mb3dlckNhc2UoKTtcbiAgaWYgKHByZWZpeCAhPT0gTUFJTk5FVF9QUkVGSVggJiYgcHJlZml4ICE9PSBURVNUTkVUX1BSRUZJWCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgZGVjb2RlZCA9IGthc3BhY0RlY29kZShhZGRyZXNzKTtcbiAgICByZXR1cm4gZGVjb2RlZC5kYXRhLmxlbmd0aCA+IDA7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBhIEthc3BhIG1haW5uZXQgYWRkcmVzc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZE1haW5uZXRBZGRyZXNzKGFkZHJlc3M6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNWYWxpZEthc3BhQWRkcmVzcyhhZGRyZXNzKSAmJiBhZGRyZXNzLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChNQUlOTkVUX1BSRUZJWCArICc6Jyk7XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIGEgS2FzcGEgdGVzdG5ldCBhZGRyZXNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkVGVzdG5ldEFkZHJlc3MoYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1ZhbGlkS2FzcGFBZGRyZXNzKGFkZHJlc3MpICYmIGFkZHJlc3MudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKFRFU1RORVRfUFJFRklYICsgJzonKTtcbn1cblxuLyoqXG4gKiBEZXJpdmUgYSBLYXNwYSBQMlBLIChTY2hub3JyKSBhZGRyZXNzIGZyb20gYSBjb21wcmVzc2VkIHNlY3AyNTZrMSBwdWJsaWMga2V5LlxuICpcbiAqIEBwYXJhbSBjb21wcmVzc2VkUHViS2V5IC0gMzMtYnl0ZSBjb21wcmVzc2VkIHNlY3AyNTZrMSBwdWJsaWMga2V5IChoZXggc3RyaW5nIG9yIEJ1ZmZlcilcbiAqIEBwYXJhbSBocnAgLSBodW1hbi1yZWFkYWJsZSBwYXJ0ICgna2FzcGEnIG9yICdrYXNwYXRlc3QnKVxuICovXG5leHBvcnQgZnVuY3Rpb24gcHViS2V5VG9LYXNwYUFkZHJlc3MoY29tcHJlc3NlZFB1YktleTogc3RyaW5nIHwgQnVmZmVyLCBocnA6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHB1YktleUJ5dGVzID0gQnVmZmVyLmlzQnVmZmVyKGNvbXByZXNzZWRQdWJLZXkpXG4gICAgPyBjb21wcmVzc2VkUHViS2V5XG4gICAgOiBCdWZmZXIuZnJvbShjb21wcmVzc2VkUHViS2V5IGFzIHN0cmluZywgJ2hleCcpO1xuXG4gIGlmIChwdWJLZXlCeXRlcy5sZW5ndGggIT09IDMzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAzMy1ieXRlIGNvbXByZXNzZWQgcHVibGljIGtleSwgZ290ICR7cHViS2V5Qnl0ZXMubGVuZ3RofWApO1xuICB9XG5cbiAgLy8gWC1vbmx5IHB1YmxpYyBrZXk6IGRyb3AgdGhlIHByZWZpeCBieXRlICgwMiBvciAwMyksIGtlZXAgMzItYnl0ZSB4LWNvb3JkaW5hdGVcbiAgY29uc3QgeE9ubHlQdWJLZXkgPSBwdWJLZXlCeXRlcy5zbGljZSgxKTtcblxuICAvLyBLYXNwYSBQMlBLIGFkZHJlc3M6XG4gIC8vIC0gdmVyc2lvbiBuaWJibGU6IDAgKFNjaG5vcnIgc2VjcDI1NmsxIFAyUEspXG4gIC8vIC0gcGF5bG9hZDogeC1vbmx5IHB1YmxpYyBrZXkgKDMyIGJ5dGVzKVxuICBjb25zdCB2ZXJzaW9uQnl0ZSA9IDA7XG4gIGNvbnN0IHBheWxvYWQgPSBCdWZmZXIuY29uY2F0KFtCdWZmZXIuZnJvbShbdmVyc2lvbkJ5dGVdKSwgeE9ubHlQdWJLZXldKTtcbiAgY29uc3Qgd29yZHMgPSBjb252ZXJ0Qml0cyhwYXlsb2FkLCA4LCA1LCB0cnVlKTtcblxuICByZXR1cm4ga2FzcGFFbmNvZGUoaHJwLCB3b3Jkcyk7XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIGEgc2VjcDI1NmsxIHB1YmxpYyBrZXkgKGNvbXByZXNzZWQgb3IgdW5jb21wcmVzc2VkKVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFB1YmxpY0tleShwdWI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoIXB1YiB8fCB0eXBlb2YgcHViICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGJ1ZiA9IEJ1ZmZlci5mcm9tKHB1YiwgJ2hleCcpO1xuICAgIGlmIChidWYubGVuZ3RoID09PSAzMykge1xuICAgICAgcmV0dXJuIGJ1ZlswXSA9PT0gMHgwMiB8fCBidWZbMF0gPT09IDB4MDM7XG4gICAgfVxuICAgIGlmIChidWYubGVuZ3RoID09PSA2NSkge1xuICAgICAgcmV0dXJuIGJ1ZlswXSA9PT0gMHgwNDtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgYSBzZWNwMjU2azEgcHJpdmF0ZSBrZXkgKDMyLWJ5dGUgaGV4KVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFByaXZhdGVLZXkocHJ2OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKCFwcnYgfHwgdHlwZW9mIHBydiAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGlzVmFsaWRYcHJ2KHBydikgfHwgaXNWYWxpZFhwdWIocHJ2KSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgYnVmID0gQnVmZmVyLmZyb20ocHJ2LnNsaWNlKDAsIDY0KSwgJ2hleCcpO1xuICAgIHJldHVybiBidWYubGVuZ3RoID09PSAzMjtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIGEgdHJhbnNhY3Rpb24gSUQgKDY0LWNoYXIgaGV4KVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFRyYW5zYWN0aW9uSWQodHhJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXlswLTlhLWZBLUZdezY0fSQvLnRlc3QodHhJZCk7XG59XG5cbmV4cG9ydCBjbGFzcyBVdGlscyBpbXBsZW1lbnRzIEJhc2VVdGlscyB7XG4gIGlzVmFsaWRBZGRyZXNzKGFkZHJlc3M6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc1ZhbGlkS2FzcGFBZGRyZXNzKGFkZHJlc3MpO1xuICB9XG5cbiAgaXNWYWxpZEJsb2NrSWQoaGFzaDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIC9eWzAtOWEtZkEtRl17NjR9JC8udGVzdChoYXNoKTtcbiAgfVxuXG4gIGlzVmFsaWRQcml2YXRlS2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzVmFsaWRQcml2YXRlS2V5KGtleSk7XG4gIH1cblxuICBpc1ZhbGlkUHVibGljS2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzVmFsaWRQdWJsaWNLZXkoa2V5KTtcbiAgfVxuXG4gIGlzVmFsaWRTaWduYXR1cmUoc2lnbmF0dXJlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gL15bMC05YS1mQS1GXXsxMjgsMTMwfSQvLnRlc3Qoc2lnbmF0dXJlKTtcbiAgfVxuXG4gIGlzVmFsaWRUcmFuc2FjdGlvbklkKHR4SWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc1ZhbGlkVHJhbnNhY3Rpb25JZCh0eElkKTtcbiAgfVxufVxuXG5jb25zdCB1dGlscyA9IG5ldyBVdGlscygpO1xuZXhwb3J0IGRlZmF1bHQgdXRpbHM7XG4iXX0=
270
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQXNIQSxrREFxQkM7QUFLRCxzREFFQztBQUtELHNEQUVDO0FBYUQsNERBdUJDO0FBU0Qsb0RBb0JDO0FBS0QsNENBZ0JDO0FBS0QsOENBYUM7QUFLRCxvREFFQztBQXhRRCxtREFBMkU7QUFDM0UsMkNBQStFO0FBRS9FLHlFQUF5RTtBQUN6RSxvRUFBb0U7QUFFcEUsTUFBTSxPQUFPLEdBQUcsa0NBQWtDLENBQUM7QUFDbkQsTUFBTSxlQUFlLEdBQTJCLEVBQUUsQ0FBQztBQUNuRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO0lBQ3hDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbEMsQ0FBQztBQUVELE1BQU0sU0FBUyxHQUFHO0lBQ2hCLE1BQU0sQ0FBQyxjQUFjLENBQUM7SUFDdEIsTUFBTSxDQUFDLGNBQWMsQ0FBQztJQUN0QixNQUFNLENBQUMsY0FBYyxDQUFDO0lBQ3RCLE1BQU0sQ0FBQyxjQUFjLENBQUM7SUFDdEIsTUFBTSxDQUFDLGNBQWMsQ0FBQztDQUN2QixDQUFDO0FBRUYsU0FBUyxPQUFPLENBQUMsTUFBZ0I7SUFDL0IsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ1gsS0FBSyxNQUFNLENBQUMsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUN2QixNQUFNLEVBQUUsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDO1FBQ3BCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyRCxLQUFLLElBQUksQ0FB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QUM7Q0FDRjtBQXhCRCxzQkF3QkM7QUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO0FBQzFCLGtCQUFlLEtBQUssQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VVdGlscywgaXNWYWxpZFhwcnYsIGlzVmFsaWRYcHViIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgTUFJTk5FVF9QUkVGSVgsIFRFU1RORVRfUFJFRklYLCBLYXNwYUFkZHJlc3NUeXBlIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG4vLyBLYXNwYSBhZGRyZXNzIGVuY29kaW5nIHVzZXMgYSBiZWNoMzItbGlrZSBzY2hlbWUgd2l0aCAnOicgYXMgc2VwYXJhdG9yXG4vLyBhbmQgYSBjdXN0b20gY2hlY2tzdW0gcG9seW5vbWlhbCAoc2FtZSBhcyBCaXRjb2luIENhc2ggY2FzaGFkZHIpLlxuXG5jb25zdCBDSEFSU0VUID0gJ3FwenJ5OXg4Z2YydHZkdzBzM2puNTRraGNlNm11YTdsJztcbmNvbnN0IENIQVJTRVRfUkVWRVJTRTogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuZm9yIChsZXQgaSA9IDA7IGkgPCBDSEFSU0VULmxlbmd0aDsgaSsrKSB7XG4gIENIQVJTRVRfUkVWRVJTRVtDSEFSU0VUW2ldXSA9IGk7XG59XG5cbmNvbnN0IEdFTkVSQVRPUiA9IFtcbiAgQmlnSW50KCcweDk4ZjJiYzhlNjEnKSxcbiAgQmlnSW50KCcweDc5Yjc2ZDk5ZTInKSxcbiAgQmlnSW50KCcweGYzM2U1ZmIzYzQnKSxcbiAgQmlnSW50KCcweGFlMmVhYmUyYTgnKSxcbiAgQmlnSW50KCcweDFlNGY0M2U0NzAnKSxcbl07XG5cbmZ1bmN0aW9uIHBvbHltb2QodmFsdWVzOiBudW1iZXJbXSk6IGJpZ2ludCB7XG4gIGxldCBjID0gMW47XG4gIGZvciAoY29uc3QgZCBvZiB2YWx1ZXMpIHtcbiAgICBjb25zdCBjMCA9IGMgPj4gMzVuO1xuICAgIGMgPSAoKGMgJiBCaWdJbnQoJzB4MDdmZmZmZmZmZicpKSA8PCA1bikgXiBCaWdJbnQoZCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA1OyBpKyspIHtcbiAgICAgIGlmICgoYzAgPj4gQmlnSW50KGkpKSAmIDFuKSB7XG4gICAgICAgIGMgXj0gR0VORVJBVE9SW2ldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gYyBeIDFuO1xufVxuXG5mdW5jdGlvbiBwcmVmaXhFeHBhbmQocHJlZml4OiBzdHJpbmcpOiBudW1iZXJbXSB7XG4gIHJldHVybiBbLi4ucHJlZml4XS5tYXAoKGMpID0+IGMuY2hhckNvZGVBdCgwKSAmIDB4MWYpLmNvbmNhdChbMF0pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDaGVja3N1bShwcmVmaXg6IHN0cmluZywgZGF0YTogbnVtYmVyW10pOiBudW1iZXJbXSB7XG4gIGNvbnN0IHZhbHVlcyA9IHByZWZpeEV4cGFuZChwcmVmaXgpLmNvbmNhdChkYXRhKS5jb25jYXQoWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDBdKTtcbiAgY29uc3QgbW9kID0gcG9seW1vZCh2YWx1ZXMpO1xuICBjb25zdCByZXQ6IG51bWJlcltdID0gW107XG4gIGZvciAobGV0IGkgPSA3OyBpID49IDA7IGktLSkge1xuICAgIHJldC5wdXNoKE51bWJlcigobW9kID4+IEJpZ0ludCg1ICogaSkpICYgMzFuKSk7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gdmVyaWZ5Q2hlY2tzdW0ocHJlZml4OiBzdHJpbmcsIGRhdGE6IG51bWJlcltdKTogYm9vbGVhbiB7XG4gIGNvbnN0IHZhbHVlcyA9IHByZWZpeEV4cGFuZChwcmVmaXgpLmNvbmNhdChkYXRhKTtcbiAgcmV0dXJuIHBvbHltb2QodmFsdWVzKSA9PT0gMG47XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRCaXRzKGRhdGE6IEJ1ZmZlciB8IFVpbnQ4QXJyYXksIGZyb206IG51bWJlciwgdG86IG51bWJlciwgcGFkOiBib29sZWFuKTogbnVtYmVyW10ge1xuICBsZXQgYWNjID0gMDtcbiAgbGV0IGJpdHMgPSAwO1xuICBjb25zdCByZXQ6IG51bWJlcltdID0gW107XG4gIGNvbnN0IG1heHYgPSAoMSA8PCB0bykgLSAxO1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIGRhdGEpIHtcbiAgICBhY2MgPSAoYWNjIDw8IGZyb20pIHwgdmFsdWU7XG4gICAgYml0cyArPSBmcm9tO1xuICAgIHdoaWxlIChiaXRzID49IHRvKSB7XG4gICAgICBiaXRzIC09IHRvO1xuICAgICAgcmV0LnB1c2goKGFjYyA+PiBiaXRzKSAmIG1heHYpO1xuICAgIH1cbiAgfVxuICBpZiAocGFkICYmIGJpdHMgPiAwKSB7XG4gICAgcmV0LnB1c2goKGFjYyA8PCAodG8gLSBiaXRzKSkgJiBtYXh2KTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG4vKipcbiAqIEVuY29kZSBkYXRhIGludG8gYSBLYXNwYSBiZWNoMzItbGlrZSBhZGRyZXNzLlxuICovXG5mdW5jdGlvbiBrYXNwYUVuY29kZShwcmVmaXg6IHN0cmluZywgZGF0YTogbnVtYmVyW10pOiBzdHJpbmcge1xuICBjb25zdCBjaGVja3N1bSA9IGNyZWF0ZUNoZWNrc3VtKHByZWZpeCwgZGF0YSk7XG4gIHJldHVybiAoXG4gICAgcHJlZml4ICtcbiAgICAnOicgK1xuICAgIGRhdGFcbiAgICAgIC5jb25jYXQoY2hlY2tzdW0pXG4gICAgICAubWFwKChkKSA9PiBDSEFSU0VUW2RdKVxuICAgICAgLmpvaW4oJycpXG4gICk7XG59XG5cbi8qKlxuICogRGVjb2RlIGEgS2FzcGEgYmVjaDMyLWxpa2UgYWRkcmVzcy5cbiAqIFJldHVybnMgeyBwcmVmaXgsIGRhdGEgfSBvciB0aHJvd3Mgb24gZXJyb3IuXG4gKi9cbmZ1bmN0aW9uIGthc3BhY0RlY29kZShhZGRyZXNzOiBzdHJpbmcpOiB7IHByZWZpeDogc3RyaW5nOyBkYXRhOiBudW1iZXJbXSB9IHtcbiAgY29uc3QgY29sb25JZHggPSBhZGRyZXNzLmxhc3RJbmRleE9mKCc6Jyk7XG4gIGlmIChjb2xvbklkeCA8IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgcHJlZml4IHNlcGFyYXRvcicpO1xuICB9XG4gIGNvbnN0IHByZWZpeCA9IGFkZHJlc3Muc2xpY2UoMCwgY29sb25JZHgpLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IGVuY29kZWQgPSBhZGRyZXNzLnNsaWNlKGNvbG9uSWR4ICsgMSkudG9Mb3dlckNhc2UoKTtcblxuICBjb25zdCBkYXRhOiBudW1iZXJbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGMgb2YgZW5jb2RlZCkge1xuICAgIGNvbnN0IHZhbCA9IENIQVJTRVRfUkVWRVJTRVtjXTtcbiAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjaGFyYWN0ZXI6ICR7Y31gKTtcbiAgICB9XG4gICAgZGF0YS5wdXNoKHZhbCk7XG4gIH1cblxuICBpZiAoIXZlcmlmeUNoZWNrc3VtKHByZWZpeCwgZGF0YSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY2hlY2tzdW0nKTtcbiAgfVxuXG4gIHJldHVybiB7IHByZWZpeCwgZGF0YTogZGF0YS5zbGljZSgwLCAtOCkgfTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgYSBLYXNwYSBhZGRyZXNzIChtYWlubmV0IG9yIHRlc3RuZXQpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkS2FzcGFBZGRyZXNzKGFkZHJlc3M6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoIWFkZHJlc3MgfHwgdHlwZW9mIGFkZHJlc3MgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgY29sb25JZHggPSBhZGRyZXNzLmxhc3RJbmRleE9mKCc6Jyk7XG4gIGlmIChjb2xvbklkeCA8IDEpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBwcmVmaXggPSBhZGRyZXNzLnNsaWNlKDAsIGNvbG9uSWR4KS50b0xvd2VyQ2FzZSgpO1xuICBpZiAocHJlZml4ICE9PSBNQUlOTkVUX1BSRUZJWCAmJiBwcmVmaXggIT09IFRFU1RORVRfUFJFRklYKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBkZWNvZGVkID0ga2FzcGFjRGVjb2RlKGFkZHJlc3MpO1xuICAgIHJldHVybiBkZWNvZGVkLmRhdGEubGVuZ3RoID4gMDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIGEgS2FzcGEgbWFpbm5ldCBhZGRyZXNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkTWFpbm5ldEFkZHJlc3MoYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1ZhbGlkS2FzcGFBZGRyZXNzKGFkZHJlc3MpICYmIGFkZHJlc3MudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKE1BSU5ORVRfUFJFRklYICsgJzonKTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgYSBLYXNwYSB0ZXN0bmV0IGFkZHJlc3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRUZXN0bmV0QWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzVmFsaWRLYXNwYUFkZHJlc3MoYWRkcmVzcykgJiYgYWRkcmVzcy50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoVEVTVE5FVF9QUkVGSVggKyAnOicpO1xufVxuXG4vKipcbiAqIERlY29kZSBhIEthc3BhIGFkZHJlc3MgdG8gaXRzIFAyUEsgc2NyaXB0UHVibGljS2V5IGhleCBzdHJpbmcuXG4gKlxuICogUmV2ZXJzZXMgcHViS2V5VG9LYXNwYUFkZHJlc3M6IGRlY29kZXMgdGhlIGJlY2gzMiBwYXlsb2FkLCByZWFkcyB0aGUgdmVyc2lvblxuICogYnl0ZSB0byBkZXRlcm1pbmUgdGhlIHNjcmlwdCB0eXBlLCBhbmQgYnVpbGRzIHRoZSBsb2NraW5nIHNjcmlwdC5cbiAqXG4gKiAgIHYwIChTY2hub3JyKTogMHgyMCB8fCB4T25seVB1YktleSgzMkIpICAgICAgfHwgMHhBQyAoT3BDaGVja1NpZylcbiAqICAgdjEgKEVDRFNBKTogICAweDIxIHx8IGNvbXByZXNzZWRQdWJLZXkoMzNCKSAgfHwgMHhBQiAoT3BDaGVja1NpZ0VDRFNBKVxuICpcbiAqIFVzZWQgYnkgVHJhbnNhY3Rpb25CdWlsZGVyIHRvIHBvcHVsYXRlIG91dHB1dCBzY3JpcHRQdWJsaWNLZXlzIGZyb20gYWRkcmVzc2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkcmVzc1RvU2NyaXB0UHVibGljS2V5KGFkZHJlc3M6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgZGF0YTogd29yZHMgfSA9IGthc3BhY0RlY29kZShhZGRyZXNzKTtcbiAgY29uc3QgcGF5bG9hZCA9IEJ1ZmZlci5mcm9tKGNvbnZlcnRCaXRzKEJ1ZmZlci5mcm9tKHdvcmRzKSwgNSwgOCwgZmFsc2UpKTtcblxuICAvLyBGaXJzdCBieXRlIGlzIHRoZSB2ZXJzaW9uIC8gYWRkcmVzcyB0eXBlLlxuICBjb25zdCB2ZXJzaW9uID0gcGF5bG9hZFswXTtcbiAgY29uc3Qga2V5Qnl0ZXMgPSBwYXlsb2FkLnNsaWNlKDEpO1xuXG4gIGlmICh2ZXJzaW9uID09PSBLYXNwYUFkZHJlc3NUeXBlLlNDSE5PUlIpIHtcbiAgICAvLyB2MDoga2V5Qnl0ZXMgaXMgMzItYnl0ZSB4LW9ubHkgcHVia2V5XG4gICAgaWYgKGtleUJ5dGVzLmxlbmd0aCAhPT0gMzIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBTY2hub3JyIGFkZHJlc3MgcGF5bG9hZCBsZW5ndGg6ICR7a2V5Qnl0ZXMubGVuZ3RofWApO1xuICAgIH1cbiAgICByZXR1cm4gQnVmZmVyLmNvbmNhdChbQnVmZmVyLmZyb20oWzB4MjBdKSwga2V5Qnl0ZXMsIEJ1ZmZlci5mcm9tKFsweGFjXSldKS50b1N0cmluZygnaGV4Jyk7XG4gIH0gZWxzZSBpZiAodmVyc2lvbiA9PT0gS2FzcGFBZGRyZXNzVHlwZS5FQ0RTQSkge1xuICAgIC8vIHYxOiBrZXlCeXRlcyBpcyAzMy1ieXRlIGNvbXByZXNzZWQgcHVia2V5XG4gICAgaWYgKGtleUJ5dGVzLmxlbmd0aCAhPT0gMzMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBFQ0RTQSBhZGRyZXNzIHBheWxvYWQgbGVuZ3RoOiAke2tleUJ5dGVzLmxlbmd0aH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoW0J1ZmZlci5mcm9tKFsweDIxXSksIGtleUJ5dGVzLCBCdWZmZXIuZnJvbShbMHhhYl0pXSkudG9TdHJpbmcoJ2hleCcpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBLYXNwYSBhZGRyZXNzIHZlcnNpb246ICR7dmVyc2lvbn1gKTtcbiAgfVxufVxuXG4vKipcbiAqIERlcml2ZSBhIEthc3BhIFAyUEsgYWRkcmVzcyBmcm9tIGEgY29tcHJlc3NlZCBzZWNwMjU2azEgcHVibGljIGtleS5cbiAqXG4gKiBAcGFyYW0gY29tcHJlc3NlZFB1YktleSAtIDMzLWJ5dGUgY29tcHJlc3NlZCBzZWNwMjU2azEgcHVibGljIGtleSAoaGV4IHN0cmluZyBvciBCdWZmZXIpXG4gKiBAcGFyYW0gaHJwICAgICAgICAgICAgICAtIGh1bWFuLXJlYWRhYmxlIHBhcnQgKCdrYXNwYScgb3IgJ2thc3BhdGVzdCcpXG4gKiBAcGFyYW0gdHlwZSAgICAgICAgICAgICAtIGFkZHJlc3MgdHlwZSAoZGVmYXVsdDogU0NITk9SUiAvIHYwKVxuICovXG5leHBvcnQgZnVuY3Rpb24gcHViS2V5VG9LYXNwYUFkZHJlc3MoXG4gIGNvbXByZXNzZWRQdWJLZXk6IHN0cmluZyB8IEJ1ZmZlcixcbiAgaHJwOiBzdHJpbmcsXG4gIHR5cGU6IEthc3BhQWRkcmVzc1R5cGUgPSBLYXNwYUFkZHJlc3NUeXBlLlNDSE5PUlJcbik6IHN0cmluZyB7XG4gIGNvbnN0IHB1YktleUJ5dGVzID0gQnVmZmVyLmlzQnVmZmVyKGNvbXByZXNzZWRQdWJLZXkpXG4gICAgPyBjb21wcmVzc2VkUHViS2V5XG4gICAgOiBCdWZmZXIuZnJvbShjb21wcmVzc2VkUHViS2V5IGFzIHN0cmluZywgJ2hleCcpO1xuXG4gIGlmIChwdWJLZXlCeXRlcy5sZW5ndGggIT09IDMzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAzMy1ieXRlIGNvbXByZXNzZWQgcHVibGljIGtleSwgZ290ICR7cHViS2V5Qnl0ZXMubGVuZ3RofWApO1xuICB9XG5cbiAgLy8gU2Nobm9yciAodjApOiBwYXlsb2FkIHVzZXMgdGhlIDMyLWJ5dGUgeC1vbmx5IGtleSAoZHJvcCB0aGUgMDIvMDMgcHJlZml4KS5cbiAgLy8gRUNEU0EgICh2MSk6IHBheWxvYWQgdXNlcyB0aGUgZnVsbCAzMy1ieXRlIGNvbXByZXNzZWQga2V5IChwcmVmaXggYnl0ZSBrZXB0KS5cbiAgY29uc3Qga2V5UGF5bG9hZCA9IHR5cGUgPT09IEthc3BhQWRkcmVzc1R5cGUuU0NITk9SUiA/IHB1YktleUJ5dGVzLnNsaWNlKDEpIDogcHViS2V5Qnl0ZXM7XG4gIGNvbnN0IHBheWxvYWQgPSBCdWZmZXIuY29uY2F0KFtCdWZmZXIuZnJvbShbdHlwZV0pLCBrZXlQYXlsb2FkXSk7XG4gIGNvbnN0IHdvcmRzID0gY29udmVydEJpdHMocGF5bG9hZCwgOCwgNSwgdHJ1ZSk7XG5cbiAgcmV0dXJuIGthc3BhRW5jb2RlKGhycCwgd29yZHMpO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBhIHNlY3AyNTZrMSBwdWJsaWMga2V5IChjb21wcmVzc2VkIG9yIHVuY29tcHJlc3NlZClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRQdWJsaWNLZXkocHViOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKCFwdWIgfHwgdHlwZW9mIHB1YiAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBidWYgPSBCdWZmZXIuZnJvbShwdWIsICdoZXgnKTtcbiAgICBpZiAoYnVmLmxlbmd0aCA9PT0gMzMpIHtcbiAgICAgIHJldHVybiBidWZbMF0gPT09IDB4MDIgfHwgYnVmWzBdID09PSAweDAzO1xuICAgIH1cbiAgICBpZiAoYnVmLmxlbmd0aCA9PT0gNjUpIHtcbiAgICAgIHJldHVybiBidWZbMF0gPT09IDB4MDQ7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIGEgc2VjcDI1NmsxIHByaXZhdGUga2V5ICgzMi1ieXRlIGhleClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRQcml2YXRlS2V5KHBydjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmICghcHJ2IHx8IHR5cGVvZiBwcnYgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChpc1ZhbGlkWHBydihwcnYpIHx8IGlzVmFsaWRYcHViKHBydikpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGJ1ZiA9IEJ1ZmZlci5mcm9tKHBydi5zbGljZSgwLCA2NCksICdoZXgnKTtcbiAgICByZXR1cm4gYnVmLmxlbmd0aCA9PT0gMzI7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBhIHRyYW5zYWN0aW9uIElEICg2NC1jaGFyIGhleClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRUcmFuc2FjdGlvbklkKHR4SWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL15bMC05YS1mQS1GXXs2NH0kLy50ZXN0KHR4SWQpO1xufVxuXG5leHBvcnQgY2xhc3MgVXRpbHMgaW1wbGVtZW50cyBCYXNlVXRpbHMge1xuICBpc1ZhbGlkQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNWYWxpZEthc3BhQWRkcmVzcyhhZGRyZXNzKTtcbiAgfVxuXG4gIGlzVmFsaWRCbG9ja0lkKGhhc2g6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAvXlswLTlhLWZBLUZdezY0fSQvLnRlc3QoaGFzaCk7XG4gIH1cblxuICBpc1ZhbGlkUHJpdmF0ZUtleShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc1ZhbGlkUHJpdmF0ZUtleShrZXkpO1xuICB9XG5cbiAgaXNWYWxpZFB1YmxpY0tleShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc1ZhbGlkUHVibGljS2V5KGtleSk7XG4gIH1cblxuICBpc1ZhbGlkU2lnbmF0dXJlKHNpZ25hdHVyZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIC9eWzAtOWEtZkEtRl17MTI4LDEzMH0kLy50ZXN0KHNpZ25hdHVyZSk7XG4gIH1cblxuICBpc1ZhbGlkVHJhbnNhY3Rpb25JZCh0eElkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNWYWxpZFRyYW5zYWN0aW9uSWQodHhJZCk7XG4gIH1cbn1cblxuY29uc3QgdXRpbHMgPSBuZXcgVXRpbHMoKTtcbmV4cG9ydCBkZWZhdWx0IHV0aWxzO1xuIl19
@@ -4,7 +4,7 @@ exports.register = void 0;
4
4
  const kaspa_1 = require("./kaspa");
5
5
  const register = (sdk) => {
6
6
  sdk.register('kaspa', kaspa_1.Kaspa.createInstance);
7
- sdk.register('tkaspa', kaspa_1.Kaspa.createInstance);
7
+ sdk.register('tkaspa', kaspa_1.Tkaspa.createInstance);
8
8
  };
9
9
  exports.register = register;
10
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVnaXN0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsbUNBQWdDO0FBRXpCLE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBYyxFQUFRLEVBQUU7SUFDL0MsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsYUFBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQzVDLEdBQUcsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLGFBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUMvQyxDQUFDLENBQUM7QUFIVyxRQUFBLFFBQVEsWUFHbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCaXRHb0Jhc2UgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBLYXNwYSB9IGZyb20gJy4va2FzcGEnO1xuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXIgPSAoc2RrOiBCaXRHb0Jhc2UpOiB2b2lkID0+IHtcbiAgc2RrLnJlZ2lzdGVyKCdrYXNwYScsIEthc3BhLmNyZWF0ZUluc3RhbmNlKTtcbiAgc2RrLnJlZ2lzdGVyKCd0a2FzcGEnLCBLYXNwYS5jcmVhdGVJbnN0YW5jZSk7XG59O1xuIl19
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVnaXN0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsbUNBQXdDO0FBRWpDLE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBYyxFQUFRLEVBQUU7SUFDL0MsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsYUFBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQzVDLEdBQUcsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLGNBQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUNoRCxDQUFDLENBQUM7QUFIVyxRQUFBLFFBQVEsWUFHbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCaXRHb0Jhc2UgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBLYXNwYSwgVGthc3BhIH0gZnJvbSAnLi9rYXNwYSc7XG5cbmV4cG9ydCBjb25zdCByZWdpc3RlciA9IChzZGs6IEJpdEdvQmFzZSk6IHZvaWQgPT4ge1xuICBzZGsucmVnaXN0ZXIoJ2thc3BhJywgS2FzcGEuY3JlYXRlSW5zdGFuY2UpO1xuICBzZGsucmVnaXN0ZXIoJ3RrYXNwYScsIFRrYXNwYS5jcmVhdGVJbnN0YW5jZSk7XG59O1xuIl19
@@ -13,17 +13,29 @@ export declare const KEYS: {
13
13
  export declare const ADDRESSES: {
14
14
  valid: string;
15
15
  testnet: string;
16
+ validEcdsa: string;
17
+ testnetEcdsa: string;
16
18
  invalid: string;
17
19
  sender: string;
18
20
  recipient: string;
19
21
  };
20
22
  export declare const SCRIPT_PUBLIC_KEY: string;
23
+ export declare const ECDSA_SCRIPT_PUBLIC_KEY: string;
21
24
  export declare const UTXOS: {
22
25
  readonly simple: KaspaUtxoInput;
23
26
  readonly second: KaspaUtxoInput;
27
+ /** ECDSA v1 input — scriptPublicKey ends with 0xAB */
28
+ readonly ecdsa: KaspaUtxoInput;
29
+ readonly ecdsaSecond: KaspaUtxoInput;
24
30
  };
25
31
  export declare const TRANSACTIONS: {
26
32
  readonly simple: KaspaTransactionData;
27
33
  readonly multiInput: KaspaTransactionData;
34
+ /** Single ECDSA (v1) input */
35
+ readonly simpleEcdsa: KaspaTransactionData;
36
+ /** Two ECDSA inputs */
37
+ readonly multiInputEcdsa: KaspaTransactionData;
38
+ /** Mixed: first input Schnorr, second input ECDSA */
39
+ readonly mixedSchnorrEcdsa: KaspaTransactionData;
28
40
  };
29
41
  //# sourceMappingURL=kaspa.fixtures.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"kaspa.fixtures.d.ts","sourceRoot":"","sources":["../../../test/fixtures/kaspa.fixtures.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAG3E,eAAO,MAAM,YAAY,qEAAqE,CAAC;AAO/F,eAAO,MAAM,IAAI;;;CAGhB,CAAC;AAEF,eAAO,MAAM,SAAS;;;;;;CAMrB,CAAC;AAEF,eAAO,MAAM,iBAAiB,QAAmB,CAAC;AAGlD,eAAO,MAAM,KAAK;qBACF,cAAc;qBAUd,cAAc;CAU7B,CAAC;AAGF,eAAO,MAAM,YAAY;qBACT,oBAAoB;yBAmBhB,oBAAoB;CAmBvC,CAAC"}
1
+ {"version":3,"file":"kaspa.fixtures.d.ts","sourceRoot":"","sources":["../../../test/fixtures/kaspa.fixtures.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAG3E,eAAO,MAAM,YAAY,qEAAqE,CAAC;AAa/F,eAAO,MAAM,IAAI;;;CAGhB,CAAC;AAEF,eAAO,MAAM,SAAS;;;;;;;;CAQrB,CAAC;AAEF,eAAO,MAAM,iBAAiB,QAAmB,CAAC;AAClD,eAAO,MAAM,uBAAuB,QAAwB,CAAC;AAG7D,eAAO,MAAM,KAAK;qBACF,cAAc;qBAUd,cAAc;IAU5B,sDAAsD;oBACzC,cAAc;0BAUR,cAAc;CAUlC,CAAC;AAGF,eAAO,MAAM,YAAY;qBACT,oBAAoB;yBAahB,oBAAoB;IAatC,8BAA8B;0BACX,oBAAoB;IAmBvC,uBAAuB;8BACA,oBAAoB;IAmB3C,qDAAqD;gCAC5B,oBAAoB;CAa9C,CAAC"}
@@ -6,15 +6,20 @@
6
6
  * Do NOT use these keys in production.
7
7
  */
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.TRANSACTIONS = exports.UTXOS = exports.SCRIPT_PUBLIC_KEY = exports.ADDRESSES = exports.KEYS = exports.TEST_PRV_KEY = void 0;
9
+ exports.TRANSACTIONS = exports.UTXOS = exports.ECDSA_SCRIPT_PUBLIC_KEY = exports.SCRIPT_PUBLIC_KEY = exports.ADDRESSES = exports.KEYS = exports.TEST_PRV_KEY = void 0;
10
10
  const keyPair_1 = require("../../src/lib/keyPair");
11
11
  const sighash_1 = require("../../src/lib/sighash");
12
+ const constants_1 = require("../../src/lib/constants");
12
13
  // Fixed 32-byte private key for deterministic tests only
13
14
  exports.TEST_PRV_KEY = 'b94f5374fce5edbc8e2a8697c15331677e6ebf0b000000000000000000000001';
14
15
  const _kp = new keyPair_1.KeyPair({ prv: exports.TEST_PRV_KEY });
15
16
  const _keys = _kp.getKeys();
16
- const _xOnlyPub = (0, sighash_1.compressedToXOnly)(Buffer.from(_keys.pub, 'hex'));
17
+ const _compressedPub = Buffer.from(_keys.pub, 'hex');
18
+ const _xOnlyPub = (0, sighash_1.compressedToXOnly)(_compressedPub);
19
+ // Schnorr (v0): OP_DATA_32 | xOnlyPubKey32 | OP_CHECKSIG_SCHNORR (0xAC)
17
20
  const _scriptPublicKey = (0, sighash_1.buildP2PKScriptPublicKey)(_xOnlyPub).toString('hex');
21
+ // ECDSA (v1): OP_DATA_33 | compressedPubKey33 | OP_CHECKSIG_ECDSA (0xAB)
22
+ const _ecdsaScriptPublicKey = (0, sighash_1.buildP2PKScriptPublicKey)(_compressedPub, constants_1.KaspaScriptType.ECDSA).toString('hex');
18
23
  exports.KEYS = {
19
24
  prv: exports.TEST_PRV_KEY,
20
25
  pub: _keys.pub,
@@ -22,11 +27,14 @@ exports.KEYS = {
22
27
  exports.ADDRESSES = {
23
28
  valid: _kp.getAddress('mainnet'),
24
29
  testnet: _kp.getAddress('testnet'),
30
+ validEcdsa: _kp.getAddress('mainnet', constants_1.KaspaAddressType.ECDSA),
31
+ testnetEcdsa: _kp.getAddress('testnet', constants_1.KaspaAddressType.ECDSA),
25
32
  invalid: 'notanaddress',
26
33
  sender: _kp.getAddress('mainnet'),
27
34
  recipient: _kp.getAddress('mainnet'),
28
35
  };
29
36
  exports.SCRIPT_PUBLIC_KEY = _scriptPublicKey;
37
+ exports.ECDSA_SCRIPT_PUBLIC_KEY = _ecdsaScriptPublicKey;
30
38
  // Getters return fresh objects to prevent mutation leakage between tests
31
39
  exports.UTXOS = {
32
40
  get simple() {
@@ -49,6 +57,27 @@ exports.UTXOS = {
49
57
  sigOpCount: 1,
50
58
  };
51
59
  },
60
+ /** ECDSA v1 input — scriptPublicKey ends with 0xAB */
61
+ get ecdsa() {
62
+ return {
63
+ transactionId: 'cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc',
64
+ transactionIndex: 0,
65
+ amount: '150000000',
66
+ scriptPublicKey: _ecdsaScriptPublicKey,
67
+ sequence: '0',
68
+ sigOpCount: 1,
69
+ };
70
+ },
71
+ get ecdsaSecond() {
72
+ return {
73
+ transactionId: 'dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd',
74
+ transactionIndex: 1,
75
+ amount: '250000000',
76
+ scriptPublicKey: _ecdsaScriptPublicKey,
77
+ sequence: '0',
78
+ sigOpCount: 1,
79
+ };
80
+ },
52
81
  };
53
82
  // Use getter functions to return fresh deep copies, preventing test mutation leakage
54
83
  exports.TRANSACTIONS = {
@@ -56,11 +85,34 @@ exports.TRANSACTIONS = {
56
85
  return JSON.parse(JSON.stringify({
57
86
  version: 0,
58
87
  inputs: [exports.UTXOS.simple],
88
+ outputs: [{ address: _kp.getAddress('mainnet'), amount: '99998000', scriptPublicKey: _scriptPublicKey }],
89
+ fee: '2000',
90
+ lockTime: '0',
91
+ subnetworkId: '0000000000000000000000000000000000000000',
92
+ payload: '',
93
+ }));
94
+ },
95
+ get multiInput() {
96
+ return JSON.parse(JSON.stringify({
97
+ version: 0,
98
+ inputs: [exports.UTXOS.simple, exports.UTXOS.second],
99
+ outputs: [{ address: _kp.getAddress('mainnet'), amount: '299998000', scriptPublicKey: _scriptPublicKey }],
100
+ fee: '2000',
101
+ lockTime: '0',
102
+ subnetworkId: '0000000000000000000000000000000000000000',
103
+ payload: '',
104
+ }));
105
+ },
106
+ /** Single ECDSA (v1) input */
107
+ get simpleEcdsa() {
108
+ return JSON.parse(JSON.stringify({
109
+ version: 0,
110
+ inputs: [exports.UTXOS.ecdsa],
59
111
  outputs: [
60
112
  {
61
- address: _kp.getAddress('mainnet'),
62
- amount: '99998000',
63
- scriptPublicKey: _scriptPublicKey,
113
+ address: _kp.getAddress('mainnet', constants_1.KaspaAddressType.ECDSA),
114
+ amount: '149998000',
115
+ scriptPublicKey: _ecdsaScriptPublicKey,
64
116
  },
65
117
  ],
66
118
  fee: '2000',
@@ -69,15 +121,16 @@ exports.TRANSACTIONS = {
69
121
  payload: '',
70
122
  }));
71
123
  },
72
- get multiInput() {
124
+ /** Two ECDSA inputs */
125
+ get multiInputEcdsa() {
73
126
  return JSON.parse(JSON.stringify({
74
127
  version: 0,
75
- inputs: [exports.UTXOS.simple, exports.UTXOS.second],
128
+ inputs: [exports.UTXOS.ecdsa, exports.UTXOS.ecdsaSecond],
76
129
  outputs: [
77
130
  {
78
- address: _kp.getAddress('mainnet'),
79
- amount: '299998000',
80
- scriptPublicKey: _scriptPublicKey,
131
+ address: _kp.getAddress('mainnet', constants_1.KaspaAddressType.ECDSA),
132
+ amount: '399998000',
133
+ scriptPublicKey: _ecdsaScriptPublicKey,
81
134
  },
82
135
  ],
83
136
  fee: '2000',
@@ -86,5 +139,17 @@ exports.TRANSACTIONS = {
86
139
  payload: '',
87
140
  }));
88
141
  },
142
+ /** Mixed: first input Schnorr, second input ECDSA */
143
+ get mixedSchnorrEcdsa() {
144
+ return JSON.parse(JSON.stringify({
145
+ version: 0,
146
+ inputs: [exports.UTXOS.simple, exports.UTXOS.ecdsa],
147
+ outputs: [{ address: _kp.getAddress('mainnet'), amount: '249998000', scriptPublicKey: _scriptPublicKey }],
148
+ fee: '2000',
149
+ lockTime: '0',
150
+ subnetworkId: '0000000000000000000000000000000000000000',
151
+ payload: '',
152
+ }));
153
+ },
89
154
  };
90
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2FzcGEuZml4dHVyZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L2ZpeHR1cmVzL2thc3BhLmZpeHR1cmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7R0FLRzs7O0FBRUgsbURBQWdEO0FBQ2hELG1EQUFvRjtBQUdwRix5REFBeUQ7QUFDNUMsUUFBQSxZQUFZLEdBQUcsa0VBQWtFLENBQUM7QUFFL0YsTUFBTSxHQUFHLEdBQUcsSUFBSSxpQkFBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLG9CQUFZLEVBQUUsQ0FBQyxDQUFDO0FBQy9DLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUM1QixNQUFNLFNBQVMsR0FBRyxJQUFBLDJCQUFpQixFQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ25FLE1BQU0sZ0JBQWdCLEdBQUcsSUFBQSxrQ0FBd0IsRUFBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7QUFFaEUsUUFBQSxJQUFJLEdBQUc7SUFDbEIsR0FBRyxFQUFFLG9CQUFZO0lBQ2pCLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRztDQUNmLENBQUM7QUFFVyxRQUFBLFNBQVMsR0FBRztJQUN2QixLQUFLLEVBQUUsR0FBRyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUM7SUFDaEMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDO0lBQ2xDLE9BQU8sRUFBRSxjQUFjO0lBQ3ZCLE1BQU0sRUFBRSxHQUFHLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQztJQUNqQyxTQUFTLEVBQUUsR0FBRyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUM7Q0FDckMsQ0FBQztBQUVXLFFBQUEsaUJBQWlCLEdBQUcsZ0JBQWdCLENBQUM7QUFFbEQseUVBQXlFO0FBQzVELFFBQUEsS0FBSyxHQUFHO0lBQ25CLElBQUksTUFBTTtRQUNSLE9BQU87WUFDTCxhQUFhLEVBQUUsa0VBQWtFO1lBQ2pGLGdCQUFnQixFQUFFLENBQUM7WUFDbkIsTUFBTSxFQUFFLFdBQVc7WUFDbkIsZUFBZSxFQUFFLGdCQUFnQjtZQUNqQyxRQUFRLEVBQUUsR0FBRztZQUNiLFVBQVUsRUFBRSxDQUFDO1NBQ2QsQ0FBQztJQUNKLENBQUM7SUFDRCxJQUFJLE1BQU07UUFDUixPQUFPO1lBQ0wsYUFBYSxFQUFFLGtFQUFrRTtZQUNqRixnQkFBZ0IsRUFBRSxDQUFDO1lBQ25CLE1BQU0sRUFBRSxXQUFXO1lBQ25CLGVBQWUsRUFBRSxnQkFBZ0I7WUFDakMsUUFBUSxFQUFFLEdBQUc7WUFDYixVQUFVLEVBQUUsQ0FBQztTQUNkLENBQUM7SUFDSixDQUFDO0NBQ0YsQ0FBQztBQUVGLHFGQUFxRjtBQUN4RSxRQUFBLFlBQVksR0FBRztJQUMxQixJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxLQUFLLENBQ2YsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUNiLE9BQU8sRUFBRSxDQUFDO1lBQ1YsTUFBTSxFQUFFLENBQUMsYUFBSyxDQUFDLE1BQU0sQ0FBQztZQUN0QixPQUFPLEVBQUU7Z0JBQ1A7b0JBQ0UsT0FBTyxFQUFFLEdBQUcsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDO29CQUNsQyxNQUFNLEVBQUUsVUFBVTtvQkFDbEIsZUFBZSxFQUFFLGdCQUFnQjtpQkFDbEM7YUFDRjtZQUNELEdBQUcsRUFBRSxNQUFNO1lBQ1gsUUFBUSxFQUFFLEdBQUc7WUFDYixZQUFZLEVBQUUsMENBQTBDO1lBQ3hELE9BQU8sRUFBRSxFQUFFO1NBQ1osQ0FBQyxDQUNxQixDQUFDO0lBQzVCLENBQUM7SUFDRCxJQUFJLFVBQVU7UUFDWixPQUFPLElBQUksQ0FBQyxLQUFLLENBQ2YsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUNiLE9BQU8sRUFBRSxDQUFDO1lBQ1YsTUFBTSxFQUFFLENBQUMsYUFBSyxDQUFDLE1BQU0sRUFBRSxhQUFLLENBQUMsTUFBTSxDQUFDO1lBQ3BDLE9BQU8sRUFBRTtnQkFDUDtvQkFDRSxPQUFPLEVBQUUsR0FBRyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUM7b0JBQ2xDLE1BQU0sRUFBRSxXQUFXO29CQUNuQixlQUFlLEVBQUUsZ0JBQWdCO2lCQUNsQzthQUNGO1lBQ0QsR0FBRyxFQUFFLE1BQU07WUFDWCxRQUFRLEVBQUUsR0FBRztZQUNiLFlBQVksRUFBRSwwQ0FBMEM7WUFDeEQsT0FBTyxFQUFFLEVBQUU7U0FDWixDQUFDLENBQ3FCLENBQUM7SUFDNUIsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEthc3BhIChLQVNQQSkgVGVzdCBGaXh0dXJlc1xuICpcbiAqIERldGVybWluaXN0aWMgdGVzdCBkYXRhIGRlcml2ZWQgZnJvbSBhIGZpeGVkIHByaXZhdGUga2V5LlxuICogRG8gTk9UIHVzZSB0aGVzZSBrZXlzIGluIHByb2R1Y3Rpb24uXG4gKi9cblxuaW1wb3J0IHsgS2V5UGFpciB9IGZyb20gJy4uLy4uL3NyYy9saWIva2V5UGFpcic7XG5pbXBvcnQgeyBjb21wcmVzc2VkVG9YT25seSwgYnVpbGRQMlBLU2NyaXB0UHVibGljS2V5IH0gZnJvbSAnLi4vLi4vc3JjL2xpYi9zaWdoYXNoJztcbmltcG9ydCB7IEthc3BhVHJhbnNhY3Rpb25EYXRhLCBLYXNwYVV0eG9JbnB1dCB9IGZyb20gJy4uLy4uL3NyYy9saWIvaWZhY2UnO1xuXG4vLyBGaXhlZCAzMi1ieXRlIHByaXZhdGUga2V5IGZvciBkZXRlcm1pbmlzdGljIHRlc3RzIG9ubHlcbmV4cG9ydCBjb25zdCBURVNUX1BSVl9LRVkgPSAnYjk0ZjUzNzRmY2U1ZWRiYzhlMmE4Njk3YzE1MzMxNjc3ZTZlYmYwYjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSc7XG5cbmNvbnN0IF9rcCA9IG5ldyBLZXlQYWlyKHsgcHJ2OiBURVNUX1BSVl9LRVkgfSk7XG5jb25zdCBfa2V5cyA9IF9rcC5nZXRLZXlzKCk7XG5jb25zdCBfeE9ubHlQdWIgPSBjb21wcmVzc2VkVG9YT25seShCdWZmZXIuZnJvbShfa2V5cy5wdWIsICdoZXgnKSk7XG5jb25zdCBfc2NyaXB0UHVibGljS2V5ID0gYnVpbGRQMlBLU2NyaXB0UHVibGljS2V5KF94T25seVB1YikudG9TdHJpbmcoJ2hleCcpO1xuXG5leHBvcnQgY29uc3QgS0VZUyA9IHtcbiAgcHJ2OiBURVNUX1BSVl9LRVksXG4gIHB1YjogX2tleXMucHViLFxufTtcblxuZXhwb3J0IGNvbnN0IEFERFJFU1NFUyA9IHtcbiAgdmFsaWQ6IF9rcC5nZXRBZGRyZXNzKCdtYWlubmV0JyksXG4gIHRlc3RuZXQ6IF9rcC5nZXRBZGRyZXNzKCd0ZXN0bmV0JyksXG4gIGludmFsaWQ6ICdub3RhbmFkZHJlc3MnLFxuICBzZW5kZXI6IF9rcC5nZXRBZGRyZXNzKCdtYWlubmV0JyksXG4gIHJlY2lwaWVudDogX2twLmdldEFkZHJlc3MoJ21haW5uZXQnKSxcbn07XG5cbmV4cG9ydCBjb25zdCBTQ1JJUFRfUFVCTElDX0tFWSA9IF9zY3JpcHRQdWJsaWNLZXk7XG5cbi8vIEdldHRlcnMgcmV0dXJuIGZyZXNoIG9iamVjdHMgdG8gcHJldmVudCBtdXRhdGlvbiBsZWFrYWdlIGJldHdlZW4gdGVzdHNcbmV4cG9ydCBjb25zdCBVVFhPUyA9IHtcbiAgZ2V0IHNpbXBsZSgpOiBLYXNwYVV0eG9JbnB1dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRyYW5zYWN0aW9uSWQ6ICdhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhJyxcbiAgICAgIHRyYW5zYWN0aW9uSW5kZXg6IDAsXG4gICAgICBhbW91bnQ6ICcxMDAwMDAwMDAnLFxuICAgICAgc2NyaXB0UHVibGljS2V5OiBfc2NyaXB0UHVibGljS2V5LFxuICAgICAgc2VxdWVuY2U6ICcwJyxcbiAgICAgIHNpZ09wQ291bnQ6IDEsXG4gICAgfTtcbiAgfSxcbiAgZ2V0IHNlY29uZCgpOiBLYXNwYVV0eG9JbnB1dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRyYW5zYWN0aW9uSWQ6ICdiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiJyxcbiAgICAgIHRyYW5zYWN0aW9uSW5kZXg6IDEsXG4gICAgICBhbW91bnQ6ICcyMDAwMDAwMDAnLFxuICAgICAgc2NyaXB0UHVibGljS2V5OiBfc2NyaXB0UHVibGljS2V5LFxuICAgICAgc2VxdWVuY2U6ICcwJyxcbiAgICAgIHNpZ09wQ291bnQ6IDEsXG4gICAgfTtcbiAgfSxcbn07XG5cbi8vIFVzZSBnZXR0ZXIgZnVuY3Rpb25zIHRvIHJldHVybiBmcmVzaCBkZWVwIGNvcGllcywgcHJldmVudGluZyB0ZXN0IG11dGF0aW9uIGxlYWthZ2VcbmV4cG9ydCBjb25zdCBUUkFOU0FDVElPTlMgPSB7XG4gIGdldCBzaW1wbGUoKTogS2FzcGFUcmFuc2FjdGlvbkRhdGEge1xuICAgIHJldHVybiBKU09OLnBhcnNlKFxuICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICB2ZXJzaW9uOiAwLFxuICAgICAgICBpbnB1dHM6IFtVVFhPUy5zaW1wbGVdLFxuICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogX2twLmdldEFkZHJlc3MoJ21haW5uZXQnKSxcbiAgICAgICAgICAgIGFtb3VudDogJzk5OTk4MDAwJyxcbiAgICAgICAgICAgIHNjcmlwdFB1YmxpY0tleTogX3NjcmlwdFB1YmxpY0tleSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBmZWU6ICcyMDAwJyxcbiAgICAgICAgbG9ja1RpbWU6ICcwJyxcbiAgICAgICAgc3VibmV0d29ya0lkOiAnMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgICAgIHBheWxvYWQ6ICcnLFxuICAgICAgfSlcbiAgICApIGFzIEthc3BhVHJhbnNhY3Rpb25EYXRhO1xuICB9LFxuICBnZXQgbXVsdGlJbnB1dCgpOiBLYXNwYVRyYW5zYWN0aW9uRGF0YSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoXG4gICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIHZlcnNpb246IDAsXG4gICAgICAgIGlucHV0czogW1VUWE9TLnNpbXBsZSwgVVRYT1Muc2Vjb25kXSxcbiAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IF9rcC5nZXRBZGRyZXNzKCdtYWlubmV0JyksXG4gICAgICAgICAgICBhbW91bnQ6ICcyOTk5OTgwMDAnLFxuICAgICAgICAgICAgc2NyaXB0UHVibGljS2V5OiBfc2NyaXB0UHVibGljS2V5LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGZlZTogJzIwMDAnLFxuICAgICAgICBsb2NrVGltZTogJzAnLFxuICAgICAgICBzdWJuZXR3b3JrSWQ6ICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAgICAgcGF5bG9hZDogJycsXG4gICAgICB9KVxuICAgICkgYXMgS2FzcGFUcmFuc2FjdGlvbkRhdGE7XG4gIH0sXG59O1xuIl19
155
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2FzcGEuZml4dHVyZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L2ZpeHR1cmVzL2thc3BhLmZpeHR1cmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7R0FLRzs7O0FBRUgsbURBQWdEO0FBQ2hELG1EQUFvRjtBQUNwRix1REFBNEU7QUFHNUUseURBQXlEO0FBQzVDLFFBQUEsWUFBWSxHQUFHLGtFQUFrRSxDQUFDO0FBRS9GLE1BQU0sR0FBRyxHQUFHLElBQUksaUJBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxvQkFBWSxFQUFFLENBQUMsQ0FBQztBQUMvQyxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7QUFDNUIsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3JELE1BQU0sU0FBUyxHQUFHLElBQUEsMkJBQWlCLEVBQUMsY0FBYyxDQUFDLENBQUM7QUFFcEQsd0VBQXdFO0FBQ3hFLE1BQU0sZ0JBQWdCLEdBQUcsSUFBQSxrQ0FBd0IsRUFBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7QUFFN0UseUVBQXlFO0FBQ3pFLE1BQU0scUJBQXFCLEdBQUcsSUFBQSxrQ0FBd0IsRUFBQyxjQUFjLEVBQUUsMkJBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7QUFFakcsUUFBQSxJQUFJLEdBQUc7SUFDbEIsR0FBRyxFQUFFLG9CQUFZO0lBQ2pCLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRztDQUNmLENBQUM7QUFFVyxRQUFBLFNBQVMsR0FBRztJQUN2QixLQUFLLEVBQUUsR0FBRyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUM7SUFDaEMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDO0lBQ2xDLFVBQVUsRUFB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Q25CLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FDZixJQUFJLENBQUMsU0FBUyxDQUFDO1lBQ2IsT0FBTyxFQUFFLENBQUM7WUFDVixNQUFNLEVBQUUsQ0FBQyxhQUFLLENBQUMsTUFBTSxFQUFFLGFBQUssQ0FBQyxLQUFLLENBQUM7WUFDbkMsT0FBTyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3pHLEdBQUcsRUFBRSxNQUFNO1lBQ1gsUUFBUSxFQUFFLEdBQUc7WUFDYixZQUFZLEVBQUUsMENBQTBDO1lBQ3hELE9BQU8sRUFBRSxFQUFFO1NBQ1osQ0FBQyxDQUNxQixDQUFDO0lBQzVCLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBLYXNwYSAoS0FTUEEpIFRlc3QgRml4dHVyZXNcbiAqXG4gKiBEZXRlcm1pbmlzdGljIHRlc3QgZGF0YSBkZXJpdmVkIGZyb20gYSBmaXhlZCBwcml2YXRlIGtleS5cbiAqIERvIE5PVCB1c2UgdGhlc2Uga2V5cyBpbiBwcm9kdWN0aW9uLlxuICovXG5cbmltcG9ydCB7IEtleVBhaXIgfSBmcm9tICcuLi8uLi9zcmMvbGliL2tleVBhaXInO1xuaW1wb3J0IHsgY29tcHJlc3NlZFRvWE9ubHksIGJ1aWxkUDJQS1NjcmlwdFB1YmxpY0tleSB9IGZyb20gJy4uLy4uL3NyYy9saWIvc2lnaGFzaCc7XG5pbXBvcnQgeyBLYXNwYVNjcmlwdFR5cGUsIEthc3BhQWRkcmVzc1R5cGUgfSBmcm9tICcuLi8uLi9zcmMvbGliL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBLYXNwYVRyYW5zYWN0aW9uRGF0YSwgS2FzcGFVdHhvSW5wdXQgfSBmcm9tICcuLi8uLi9zcmMvbGliL2lmYWNlJztcblxuLy8gRml4ZWQgMzItYnl0ZSBwcml2YXRlIGtleSBmb3IgZGV0ZXJtaW5pc3RpYyB0ZXN0cyBvbmx5XG5leHBvcnQgY29uc3QgVEVTVF9QUlZfS0VZID0gJ2I5NGY1Mzc0ZmNlNWVkYmM4ZTJhODY5N2MxNTMzMTY3N2U2ZWJmMGIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEnO1xuXG5jb25zdCBfa3AgPSBuZXcgS2V5UGFpcih7IHBydjogVEVTVF9QUlZfS0VZIH0pO1xuY29uc3QgX2tleXMgPSBfa3AuZ2V0S2V5cygpO1xuY29uc3QgX2NvbXByZXNzZWRQdWIgPSBCdWZmZXIuZnJvbShfa2V5cy5wdWIsICdoZXgnKTtcbmNvbnN0IF94T25seVB1YiA9IGNvbXByZXNzZWRUb1hPbmx5KF9jb21wcmVzc2VkUHViKTtcblxuLy8gU2Nobm9yciAodjApOiBPUF9EQVRBXzMyIHwgeE9ubHlQdWJLZXkzMiB8IE9QX0NIRUNLU0lHX1NDSE5PUlIgKDB4QUMpXG5jb25zdCBfc2NyaXB0UHVibGljS2V5ID0gYnVpbGRQMlBLU2NyaXB0UHVibGljS2V5KF94T25seVB1YikudG9TdHJpbmcoJ2hleCcpO1xuXG4vLyBFQ0RTQSAodjEpOiBPUF9EQVRBXzMzIHwgY29tcHJlc3NlZFB1YktleTMzIHwgT1BfQ0hFQ0tTSUdfRUNEU0EgKDB4QUIpXG5jb25zdCBfZWNkc2FTY3JpcHRQdWJsaWNLZXkgPSBidWlsZFAyUEtTY3JpcHRQdWJsaWNLZXkoX2NvbXByZXNzZWRQdWIsIEthc3BhU2NyaXB0VHlwZS5FQ0RTQSkudG9TdHJpbmcoJ2hleCcpO1xuXG5leHBvcnQgY29uc3QgS0VZUyA9IHtcbiAgcHJ2OiBURVNUX1BSVl9LRVksXG4gIHB1YjogX2tleXMucHViLFxufTtcblxuZXhwb3J0IGNvbnN0IEFERFJFU1NFUyA9IHtcbiAgdmFsaWQ6IF9rcC5nZXRBZGRyZXNzKCdtYWlubmV0JyksXG4gIHRlc3RuZXQ6IF9rcC5nZXRBZGRyZXNzKCd0ZXN0bmV0JyksXG4gIHZhbGlkRWNkc2E6IF9rcC5nZXRBZGRyZXNzKCdtYWlubmV0JywgS2FzcGFBZGRyZXNzVHlwZS5FQ0RTQSksXG4gIHRlc3RuZXRFY2RzYTogX2twLmdldEFkZHJlc3MoJ3Rlc3RuZXQnLCBLYXNwYUFkZHJlc3NUeXBlLkVDRFNBKSxcbiAgaW52YWxpZDogJ25vdGFuYWRkcmVzcycsXG4gIHNlbmRlcjogX2twLmdldEFkZHJlc3MoJ21haW5uZXQnKSxcbiAgcmVjaXBpZW50OiBfa3AuZ2V0QWRkcmVzcygnbWFpbm5ldCcpLFxufTtcblxuZXhwb3J0IGNvbnN0IFNDUklQVF9QVUJMSUNfS0VZID0gX3NjcmlwdFB1YmxpY0tleTtcbmV4cG9ydCBjb25zdCBFQ0RTQV9TQ1JJUFRfUFVCTElDX0tFWSA9IF9lY2RzYVNjcmlwdFB1YmxpY0tleTtcblxuLy8gR2V0dGVycyByZXR1cm4gZnJlc2ggb2JqZWN0cyB0byBwcmV2ZW50IG11dGF0aW9uIGxlYWthZ2UgYmV0d2VlbiB0ZXN0c1xuZXhwb3J0IGNvbnN0IFVUWE9TID0ge1xuICBnZXQgc2ltcGxlKCk6IEthc3BhVXR4b0lucHV0IHtcbiAgICByZXR1cm4ge1xuICAgICAgdHJhbnNhY3Rpb25JZDogJ2FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEnLFxuICAgICAgdHJhbnNhY3Rpb25JbmRleDogMCxcbiAgICAgIGFtb3VudDogJzEwMDAwMDAwMCcsXG4gICAgICBzY3JpcHRQdWJsaWNLZXk6IF9zY3JpcHRQdWJsaWNLZXksXG4gICAgICBzZXF1ZW5jZTogJzAnLFxuICAgICAgc2lnT3BDb3VudDogMSxcbiAgICB9O1xuICB9LFxuICBnZXQgc2Vjb25kKCk6IEthc3BhVXR4b0lucHV0IHtcbiAgICByZXR1cm4ge1xuICAgICAgdHJhbnNhY3Rpb25JZDogJ2JiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmInLFxuICAgICAgdHJhbnNhY3Rpb25JbmRleDogMSxcbiAgICAgIGFtb3VudDogJzIwMDAwMDAwMCcsXG4gICAgICBzY3JpcHRQdWJsaWNLZXk6IF9zY3JpcHRQdWJsaWNLZXksXG4gICAgICBzZXF1ZW5jZTogJzAnLFxuICAgICAgc2lnT3BDb3VudDogMSxcbiAgICB9O1xuICB9LFxuICAvKiogRUNEU0EgdjEgaW5wdXQg4oCUIHNjcmlwdFB1YmxpY0tleSBlbmRzIHdpdGggMHhBQiAqL1xuICBnZXQgZWNkc2EoKTogS2FzcGFVdHhvSW5wdXQge1xuICAgIHJldHVybiB7XG4gICAgICB0cmFuc2FjdGlvbklkOiAnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjYycsXG4gICAgICB0cmFuc2FjdGlvbkluZGV4OiAwLFxuICAgICAgYW1vdW50OiAnMTUwMDAwMDAwJyxcbiAgICAgIHNjcmlwdFB1YmxpY0tleTogX2VjZHNhU2NyaXB0UHVibGljS2V5LFxuICAgICAgc2VxdWVuY2U6ICcwJyxcbiAgICAgIHNpZ09wQ291bnQ6IDEsXG4gICAgfTtcbiAgfSxcbiAgZ2V0IGVjZHNhU2Vjb25kKCk6IEthc3BhVXR4b0lucHV0IHtcbiAgICByZXR1cm4ge1xuICAgICAgdHJhbnNhY3Rpb25JZDogJ2RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGQnLFxuICAgICAgdHJhbnNhY3Rpb25JbmRleDogMSxcbiAgICAgIGFtb3VudDogJzI1MDAwMDAwMCcsXG4gICAgICBzY3JpcHRQdWJsaWNLZXk6IF9lY2RzYVNjcmlwdFB1YmxpY0tleSxcbiAgICAgIHNlcXVlbmNlOiAnMCcsXG4gICAgICBzaWdPcENvdW50OiAxLFxuICAgIH07XG4gIH0sXG59O1xuXG4vLyBVc2UgZ2V0dGVyIGZ1bmN0aW9ucyB0byByZXR1cm4gZnJlc2ggZGVlcCBjb3BpZXMsIHByZXZlbnRpbmcgdGVzdCBtdXRhdGlvbiBsZWFrYWdlXG5leHBvcnQgY29uc3QgVFJBTlNBQ1RJT05TID0ge1xuICBnZXQgc2ltcGxlKCk6IEthc3BhVHJhbnNhY3Rpb25EYXRhIHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShcbiAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgdmVyc2lvbjogMCxcbiAgICAgICAgaW5wdXRzOiBbVVRYT1Muc2ltcGxlXSxcbiAgICAgICAgb3V0cHV0czogW3sgYWRkcmVzczogX2twLmdldEFkZHJlc3MoJ21haW5uZXQnKSwgYW1vdW50OiAnOTk5OTgwMDAnLCBzY3JpcHRQdWJsaWNLZXk6IF9zY3JpcHRQdWJsaWNLZXkgfV0sXG4gICAgICAgIGZlZTogJzIwMDAnLFxuICAgICAgICBsb2NrVGltZTogJzAnLFxuICAgICAgICBzdWJuZXR3b3JrSWQ6ICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAgICAgcGF5bG9hZDogJycsXG4gICAgICB9KVxuICAgICkgYXMgS2FzcGFUcmFuc2FjdGlvbkRhdGE7XG4gIH0sXG4gIGdldCBtdWx0aUlucHV0KCk6IEthc3BhVHJhbnNhY3Rpb25EYXRhIHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShcbiAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgdmVyc2lvbjogMCxcbiAgICAgICAgaW5wdXRzOiBbVVRYT1Muc2ltcGxlLCBVVFhPUy5zZWNvbmRdLFxuICAgICAgICBvdXRwdXRzOiBbeyBhZGRyZXNzOiBfa3AuZ2V0QWRkcmVzcygnbWFpbm5ldCcpLCBhbW91bnQ6ICcyOTk5OTgwMDAnLCBzY3JpcHRQdWJsaWNLZXk6IF9zY3JpcHRQdWJsaWNLZXkgfV0sXG4gICAgICAgIGZlZTogJzIwMDAnLFxuICAgICAgICBsb2NrVGltZTogJzAnLFxuICAgICAgICBzdWJuZXR3b3JrSWQ6ICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAgICAgcGF5bG9hZDogJycsXG4gICAgICB9KVxuICAgICkgYXMgS2FzcGFUcmFuc2FjdGlvbkRhdGE7XG4gIH0sXG4gIC8qKiBTaW5nbGUgRUNEU0EgKHYxKSBpbnB1dCAqL1xuICBnZXQgc2ltcGxlRWNkc2EoKTogS2FzcGFUcmFuc2FjdGlvbkRhdGEge1xuICAgIHJldHVybiBKU09OLnBhcnNlKFxuICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICB2ZXJzaW9uOiAwLFxuICAgICAgICBpbnB1dHM6IFtVVFhPUy5lY2RzYV0sXG4gICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiBfa3AuZ2V0QWRkcmVzcygnbWFpbm5ldCcsIEthc3BhQWRkcmVzc1R5cGUuRUNEU0EpLFxuICAgICAgICAgICAgYW1vdW50OiAnMTQ5OTk4MDAwJyxcbiAgICAgICAgICAgIHNjcmlwdFB1YmxpY0tleTogX2VjZHNhU2NyaXB0UHVibGljS2V5LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGZlZTogJzIwMDAnLFxuICAgICAgICBsb2NrVGltZTogJzAnLFxuICAgICAgICBzdWJuZXR3b3JrSWQ6ICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAgICAgcGF5bG9hZDogJycsXG4gICAgICB9KVxuICAgICkgYXMgS2FzcGFUcmFuc2FjdGlvbkRhdGE7XG4gIH0sXG4gIC8qKiBUd28gRUNEU0EgaW5wdXRzICovXG4gIGdldCBtdWx0aUlucHV0RWNkc2EoKTogS2FzcGFUcmFuc2FjdGlvbkRhdGEge1xuICAgIHJldHVybiBKU09OLnBhcnNlKFxuICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICB2ZXJzaW9uOiAwLFxuICAgICAgICBpbnB1dHM6IFtVVFhPUy5lY2RzYSwgVVRYT1MuZWNkc2FTZWNvbmRdLFxuICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogX2twLmdldEFkZHJlc3MoJ21haW5uZXQnLCBLYXNwYUFkZHJlc3NUeXBlLkVDRFNBKSxcbiAgICAgICAgICAgIGFtb3VudDogJzM5OTk5ODAwMCcsXG4gICAgICAgICAgICBzY3JpcHRQdWJsaWNLZXk6IF9lY2RzYVNjcmlwdFB1YmxpY0tleSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBmZWU6ICcyMDAwJyxcbiAgICAgICAgbG9ja1RpbWU6ICcwJyxcbiAgICAgICAgc3VibmV0d29ya0lkOiAnMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgICAgIHBheWxvYWQ6ICcnLFxuICAgICAgfSlcbiAgICApIGFzIEthc3BhVHJhbnNhY3Rpb25EYXRhO1xuICB9LFxuICAvKiogTWl4ZWQ6IGZpcnN0IGlucHV0IFNjaG5vcnIsIHNlY29uZCBpbnB1dCBFQ0RTQSAqL1xuICBnZXQgbWl4ZWRTY2hub3JyRWNkc2EoKTogS2FzcGFUcmFuc2FjdGlvbkRhdGEge1xuICAgIHJldHVybiBKU09OLnBhcnNlKFxuICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICB2ZXJzaW9uOiAwLFxuICAgICAgICBpbnB1dHM6IFtVVFhPUy5zaW1wbGUsIFVUWE9TLmVjZHNhXSxcbiAgICAgICAgb3V0cHV0czogW3sgYWRkcmVzczogX2twLmdldEFkZHJlc3MoJ21haW5uZXQnKSwgYW1vdW50OiAnMjQ5OTk4MDAwJywgc2NyaXB0UHVibGljS2V5OiBfc2NyaXB0UHVibGljS2V5IH1dLFxuICAgICAgICBmZWU6ICcyMDAwJyxcbiAgICAgICAgbG9ja1RpbWU6ICcwJyxcbiAgICAgICAgc3VibmV0d29ya0lkOiAnMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgICAgIHBheWxvYWQ6ICcnLFxuICAgICAgfSlcbiAgICApIGFzIEthc3BhVHJhbnNhY3Rpb25EYXRhO1xuICB9LFxufTtcbiJdfQ==