@bitgo/sdk-core 37.8.0 → 37.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/src/account-lib/baseCoin/enum.d.ts +26 -23
  2. package/dist/src/account-lib/baseCoin/enum.d.ts.map +1 -1
  3. package/dist/src/account-lib/baseCoin/enum.js +31 -24
  4. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +1 -0
  5. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -1
  6. package/dist/src/bitgo/baseCoin/iBaseCoin.js +1 -1
  7. package/dist/src/bitgo/defi/defiVault.d.ts +9 -2
  8. package/dist/src/bitgo/defi/defiVault.d.ts.map +1 -1
  9. package/dist/src/bitgo/defi/defiVault.js +28 -4
  10. package/dist/src/bitgo/utils/mpcUtils.d.ts.map +1 -1
  11. package/dist/src/bitgo/utils/mpcUtils.js +26 -2
  12. package/dist/src/bitgo/utils/tss/baseTypes.d.ts +33 -0
  13. package/dist/src/bitgo/utils/tss/baseTypes.d.ts.map +1 -1
  14. package/dist/src/bitgo/utils/tss/baseTypes.js +1 -1
  15. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts.map +1 -1
  16. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.js +4 -3
  17. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -1
  18. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +4 -3
  19. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +19 -1
  20. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -1
  21. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.js +36 -14
  22. package/dist/src/bitgo/utils/tss/index.d.ts +1 -0
  23. package/dist/src/bitgo/utils/tss/index.d.ts.map +1 -1
  24. package/dist/src/bitgo/utils/tss/index.js +2 -1
  25. package/dist/src/bitgo/utils/tss/recipientUtils.d.ts +33 -0
  26. package/dist/src/bitgo/utils/tss/recipientUtils.d.ts.map +1 -0
  27. package/dist/src/bitgo/utils/tss/recipientUtils.js +117 -0
  28. package/dist/src/bitgo/wallet/iWallet.d.ts +17 -0
  29. package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
  30. package/dist/src/bitgo/wallet/iWallet.js +1 -1
  31. package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
  32. package/dist/src/bitgo/wallet/wallet.js +60 -2
  33. package/dist/test/unit/bitgo/defi/defiVault.js +61 -6
  34. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +3 -1
  35. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.js +18 -14
  36. package/dist/test/unit/bitgo/utils/tss/recipientUtils.d.ts +2 -0
  37. package/dist/test/unit/bitgo/utils/tss/recipientUtils.d.ts.map +1 -0
  38. package/dist/test/unit/bitgo/utils/tss/recipientUtils.js +171 -0
  39. package/dist/test/unit/bitgo/wallet/tokenApproval.js +67 -1
  40. package/dist/tsconfig.tsbuildinfo +1 -1
  41. package/package.json +3 -3
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=recipientUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recipientUtils.d.ts","sourceRoot":"","sources":["../../../../../../test/unit/bitgo/utils/tss/recipientUtils.ts"],"names":[],"mappings":""}
@@ -0,0 +1,171 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const assert_1 = __importDefault(require("assert"));
7
+ const recipientUtils_1 = require("../../../../../src/bitgo/utils/tss/recipientUtils");
8
+ const errors_1 = require("../../../../../src/bitgo/errors");
9
+ function makeTxRequest(overrides = {}) {
10
+ return {
11
+ txRequestId: 'test-tx-request-id',
12
+ walletId: 'test-wallet-id',
13
+ intent: undefined,
14
+ ...overrides,
15
+ };
16
+ }
17
+ describe('recipientUtils', function () {
18
+ describe('NO_RECIPIENT_TX_TYPES', function () {
19
+ it('contains all expected types', function () {
20
+ const expected = [
21
+ // ECDSA EVM
22
+ 'acceleration',
23
+ 'fillNonce',
24
+ 'transferToken',
25
+ 'tokenApproval',
26
+ 'consolidate',
27
+ 'bridgeFunds',
28
+ 'enableToken',
29
+ 'enabletoken',
30
+ 'disabletoken',
31
+ 'customTx',
32
+ 'defiApprove',
33
+ 'defiDeposit',
34
+ 'contractCall',
35
+ // Staking
36
+ 'delegate',
37
+ 'undelegate',
38
+ 'switchValidator',
39
+ 'stake',
40
+ 'unstake',
41
+ 'stakeWithCallData',
42
+ 'unstakeWithCallData',
43
+ 'transferStake',
44
+ 'increaseStake',
45
+ 'goUnstake',
46
+ 'claim',
47
+ 'stakeClaimRewards',
48
+ 'createAccount',
49
+ 'transferAccept',
50
+ 'transferReject',
51
+ 'transferOfferWithdrawn',
52
+ 'cantonCommand',
53
+ 'pledge',
54
+ // Avalanche / Flare cross-chain atomic imports
55
+ 'import',
56
+ 'importtoc',
57
+ ];
58
+ expected.forEach((t) => assert_1.default.ok(recipientUtils_1.NO_RECIPIENT_TX_TYPES.has(t), `${t} should be in NO_RECIPIENT_TX_TYPES`));
59
+ assert_1.default.strictEqual(recipientUtils_1.NO_RECIPIENT_TX_TYPES.size, expected.length);
60
+ });
61
+ it('does not contain value-transfer types', function () {
62
+ ['payment', 'fanout', 'vote', 'defi-deposit', 'defi-redeem'].forEach((t) => {
63
+ assert_1.default.ok(!recipientUtils_1.NO_RECIPIENT_TX_TYPES.has(t), `${t} must NOT be in NO_RECIPIENT_TX_TYPES`);
64
+ });
65
+ });
66
+ });
67
+ describe('resolveEffectiveTxParams', function () {
68
+ it('passes through txParams.recipients when present', function () {
69
+ const txRequest = makeTxRequest();
70
+ const txParams = { recipients: [{ address: '0xabc', amount: '100' }] };
71
+ const result = (0, recipientUtils_1.resolveEffectiveTxParams)(txRequest, txParams);
72
+ assert_1.default.deepStrictEqual(result.recipients, txParams.recipients);
73
+ });
74
+ it('falls back to intent.recipients when txParams has none', function () {
75
+ const txRequest = makeTxRequest({
76
+ intent: {
77
+ intentType: 'payment',
78
+ recipients: [
79
+ {
80
+ address: { address: '0xabc' },
81
+ amount: { value: '500', symbol: 'eth' },
82
+ },
83
+ ],
84
+ },
85
+ });
86
+ const result = (0, recipientUtils_1.resolveEffectiveTxParams)(txRequest, {});
87
+ assert_1.default.strictEqual(result.recipients?.length, 1);
88
+ assert_1.default.strictEqual(result.recipients?.[0].address, '0xabc');
89
+ assert_1.default.strictEqual(result.recipients?.[0].amount, '500');
90
+ });
91
+ it('resolves txType from intent.intentType when txParams.type is absent', function () {
92
+ const txRequest = makeTxRequest({
93
+ intent: { intentType: 'consolidate' },
94
+ });
95
+ const result = (0, recipientUtils_1.resolveEffectiveTxParams)(txRequest, {});
96
+ assert_1.default.strictEqual(result.type, 'consolidate');
97
+ });
98
+ it('does not throw for exempt types', function () {
99
+ for (const txType of [
100
+ 'acceleration',
101
+ 'consolidate',
102
+ 'contractCall',
103
+ 'delegate',
104
+ 'stake',
105
+ 'createAccount',
106
+ 'pledge',
107
+ 'import',
108
+ 'importtoc',
109
+ ]) {
110
+ const txRequest = makeTxRequest();
111
+ assert_1.default.doesNotThrow(() => (0, recipientUtils_1.resolveEffectiveTxParams)(txRequest, { type: txType }));
112
+ }
113
+ });
114
+ it('does not throw for Avalanche cross-chain imports resolved from intent.intentType', function () {
115
+ // P-chain and C-chain import intents legitimately carry no recipients —
116
+ // the wallet imports its own UTXOs and the destination address is the
117
+ // wallet itself. The intentType lives only on the intent (txParams.type
118
+ // is unset on the MPC signing call) so the guard must read it from there.
119
+ for (const intentType of ['import', 'importtoc']) {
120
+ const txRequest = makeTxRequest({ intent: { intentType } });
121
+ assert_1.default.doesNotThrow(() => (0, recipientUtils_1.resolveEffectiveTxParams)(txRequest, {}));
122
+ }
123
+ });
124
+ it('does not throw when buildParams.type is PascalCase but intent.intentType is lowercase', function () {
125
+ // signTransactionTss passes txPrebuild.buildParams as txParams. Prebuild uses
126
+ // type: 'Import' while WP stores intentType: 'import' on the txRequest.
127
+ const txRequest = makeTxRequest({ intent: { intentType: 'import', recipients: [] } });
128
+ assert_1.default.doesNotThrow(() => (0, recipientUtils_1.resolveEffectiveTxParams)(txRequest, { type: 'Import', recipients: [] }));
129
+ });
130
+ it('throws InvalidTransactionError for unknown types with no recipients', function () {
131
+ const txRequest = makeTxRequest();
132
+ assert_1.default.throws(() => (0, recipientUtils_1.resolveEffectiveTxParams)(txRequest, { type: 'payment' }), errors_1.InvalidTransactionError, 'should throw for payment type with no recipients');
133
+ });
134
+ it('throws when txParams is undefined and no intent', function () {
135
+ const txRequest = makeTxRequest();
136
+ assert_1.default.throws(() => (0, recipientUtils_1.resolveEffectiveTxParams)(txRequest, undefined), errors_1.InvalidTransactionError);
137
+ });
138
+ it('does not throw when intent has stakingRequestId (staking bypass)', function () {
139
+ const txRequest = makeTxRequest({
140
+ intent: { intentType: 'delegate', stakingRequestId: 'staking-req-123' },
141
+ });
142
+ assert_1.default.doesNotThrow(() => (0, recipientUtils_1.resolveEffectiveTxParams)(txRequest, {}));
143
+ });
144
+ it('propagates stakingRequestId from intent into effectiveTxParams', function () {
145
+ const txRequest = makeTxRequest({
146
+ intent: { intentType: 'delegate', stakingRequestId: 'staking-req-456' },
147
+ });
148
+ const result = (0, recipientUtils_1.resolveEffectiveTxParams)(txRequest, {});
149
+ assert_1.default.strictEqual(result.stakingRequestId, 'staking-req-456');
150
+ });
151
+ it('does not overwrite existing stakingRequestId in txParams', function () {
152
+ const txRequest = makeTxRequest({
153
+ intent: { intentType: 'delegate', stakingRequestId: 'from-intent' },
154
+ });
155
+ const result = (0, recipientUtils_1.resolveEffectiveTxParams)(txRequest, { stakingRequestId: 'from-caller' });
156
+ assert_1.default.strictEqual(result.stakingRequestId, 'from-caller');
157
+ });
158
+ it('prefers txParams.recipients over intent.recipients', function () {
159
+ const txRequest = makeTxRequest({
160
+ intent: {
161
+ intentType: 'payment',
162
+ recipients: [{ address: { address: '0xintent' }, amount: { value: '999', symbol: 'eth' } }],
163
+ },
164
+ });
165
+ const txParams = { recipients: [{ address: '0xcaller', amount: '100' }] };
166
+ const result = (0, recipientUtils_1.resolveEffectiveTxParams)(txRequest, txParams);
167
+ assert_1.default.strictEqual(result.recipients?.[0].address, '0xcaller');
168
+ });
169
+ });
170
+ });
171
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjaXBpZW50VXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZXN0L3VuaXQvYml0Z28vdXRpbHMvdHNzL3JlY2lwaWVudFV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLHNGQUFvSDtBQUNwSCw0REFBMEU7QUFHMUUsU0FBUyxhQUFhLENBQUMsWUFBZ0MsRUFBRTtJQUN2RCxPQUFPO1FBQ0wsV0FBVyxFQUFFLG9CQUFvQjtRQUNqQyxRQUFRLEVBQUUsZ0JBQWdCO1FBQzFCLE1BQU0sRUFBRSxTQUFTO1FBQ2pCLEdBQUcsU0FBUztLQUNXLENBQUM7QUFDNUIsQ0FBQztBQUVELFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRTtJQUN6QixRQUFRLENBQUMsdUJBQXVCLEVBQUU7UUFDaEMsRUFBRSxDQUFDLDZCQUE2QixFQUFFO1lBQ2hDLE1BQU0sUUFBUSxHQUFHO2dCQUNmLFlBQVk7Z0JBQ1osY0FBYztnQkFDZCxXQUFXO2dCQUNYLGVBQWU7Z0JBQ2YsZUFBZTtnQkFDZixhQUFhO2dCQUNiLGFBQWE7Z0JBQ2IsYUFBYTtnQkFDYixhQUFhO2dCQUNiLGNBQWM7Z0JBQ2QsVUFBVTtnQkFDVixhQUFhO2dCQUNiLGFBQWE7Z0JBQ2IsY0FBYztnQkFDZCxVQUFVO2dCQUNWLFVBQVU7Z0JBQ1YsWUFBWTtnQkFDWixpQkFBaUI7Z0JBQ2pCLE9BQU87Z0JBQ1AsU0FBUztnQkFDVCxtQkFBbUI7Z0JBQ25CLHFCQUFxQjtnQkFDckIsZUFBZTtnQkFDZixlQUFlO2dCQUNmLFdBQVc7Z0JBQ1gsT0FBTztnQkFDUCxtQkFBbUI7Z0JBQ25CLGVBQWU7Z0JBQ2YsZ0JBQWdCO2dCQUNoQixnQkFBZ0I7Z0JBQ2hCLHdCQUF3QjtnQkFDeEIsZUFBZTtnQkFDZixRQUFRO2dCQUNSLCtDQUErQztnQkFDL0MsUUFBUTtnQkFDUixXQUFXO2FBQ1osQ0FBQztZQUNGLFFBQVEsQ0FBQyxPQUFPLENB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Q0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IE5PX1JFQ0lQSUVOVF9UWF9UWVBFUywgcmVzb2x2ZUVmZmVjdGl2ZVR4UGFyYW1zIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vc3JjL2JpdGdvL3V0aWxzL3Rzcy9yZWNpcGllbnRVdGlscyc7XG5pbXBvcnQgeyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvciB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3NyYy9iaXRnby9lcnJvcnMnO1xuaW1wb3J0IHsgVHhSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vc3JjL2JpdGdvL3V0aWxzL3Rzcy9iYXNlVHlwZXMnO1xuXG5mdW5jdGlvbiBtYWtlVHhSZXF1ZXN0KG92ZXJyaWRlczogUGFydGlhbDxUeFJlcXVlc3Q+ID0ge30pOiBUeFJlcXVlc3Qge1xuICByZXR1cm4ge1xuICAgIHR4UmVxdWVzdElkOiAndGVzdC10eC1yZXF1ZXN0LWlkJyxcbiAgICB3YWxsZXRJZDogJ3Rlc3Qtd2FsbGV0LWlkJyxcbiAgICBpbnRlbnQ6IHVuZGVmaW5lZCxcbiAgICAuLi5vdmVycmlkZXMsXG4gIH0gYXMgdW5rbm93biBhcyBUeFJlcXVlc3Q7XG59XG5cbmRlc2NyaWJlKCdyZWNpcGllbnRVdGlscycsIGZ1bmN0aW9uICgpIHtcbiAgZGVzY3JpYmUoJ05PX1JFQ0lQSUVOVF9UWF9UWVBFUycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnY29udGFpbnMgYWxsIGV4cGVjdGVkIHR5cGVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSBbXG4gICAgICAgIC8vIEVDRFNBIEVWTVxuICAgICAgICAnYWNjZWxlcmF0aW9uJyxcbiAgICAgICAgJ2ZpbGxOb25jZScsXG4gICAgICAgICd0cmFuc2ZlclRva2VuJyxcbiAgICAgICAgJ3Rva2VuQXBwcm92YWwnLFxuICAgICAgICAnY29uc29saWRhdGUnLFxuICAgICAgICAnYnJpZGdlRnVuZHMnLFxuICAgICAgICAnZW5hYmxlVG9rZW4nLFxuICAgICAgICAnZW5hYmxldG9rZW4nLFxuICAgICAgICAnZGlzYWJsZXRva2VuJyxcbiAgICAgICAgJ2N1c3RvbVR4JyxcbiAgICAgICAgJ2RlZmlBcHByb3ZlJyxcbiAgICAgICAgJ2RlZmlEZXBvc2l0JyxcbiAgICAgICAgJ2NvbnRyYWN0Q2FsbCcsXG4gICAgICAgIC8vIFN0YWtpbmdcbiAgICAgICAgJ2RlbGVnYXRlJyxcbiAgICAgICAgJ3VuZGVsZWdhdGUnLFxuICAgICAgICAnc3dpdGNoVmFsaWRhdG9yJyxcbiAgICAgICAgJ3N0YWtlJyxcbiAgICAgICAgJ3Vuc3Rha2UnLFxuICAgICAgICAnc3Rha2VXaXRoQ2FsbERhdGEnLFxuICAgICAgICAndW5zdGFrZVdpdGhDYWxsRGF0YScsXG4gICAgICAgICd0cmFuc2ZlclN0YWtlJyxcbiAgICAgICAgJ2luY3JlYXNlU3Rha2UnLFxuICAgICAgICAnZ29VbnN0YWtlJyxcbiAgICAgICAgJ2NsYWltJyxcbiAgICAgICAgJ3N0YWtlQ2xhaW1SZXdhcmRzJyxcbiAgICAgICAgJ2NyZWF0ZUFjY291bnQnLFxuICAgICAgICAndHJhbnNmZXJBY2NlcHQnLFxuICAgICAgICAndHJhbnNmZXJSZWplY3QnLFxuICAgICAgICAndHJhbnNmZXJPZmZlcldpdGhkcmF3bicsXG4gICAgICAgICdjYW50b25Db21tYW5kJyxcbiAgICAgICAgJ3BsZWRnZScsXG4gICAgICAgIC8vIEF2YWxhbmNoZSAvIEZsYXJlIGNyb3NzLWNoYWluIGF0b21pYyBpbXBvcnRzXG4gICAgICAgICdpbXBvcnQnLFxuICAgICAgICAnaW1wb3J0dG9jJyxcbiAgICAgIF07XG4gICAgICBleHBlY3RlZC5mb3JFYWNoKCh0KSA9PiBhc3NlcnQub2soTk9fUkVDSVBJRU5UX1RYX1RZUEVTLmhhcyh0KSwgYCR7dH0gc2hvdWxkIGJlIGluIE5PX1JFQ0lQSUVOVF9UWF9UWVBFU2ApKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChOT19SRUNJUElFTlRfVFhfVFlQRVMuc2l6ZSwgZXhwZWN0ZWQubGVuZ3RoKTtcbiAgICB9KTtcblxuICAgIGl0KCdkb2VzIG5vdCBjb250YWluIHZhbHVlLXRyYW5zZmVyIHR5cGVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgWydwYXltZW50JywgJ2Zhbm91dCcsICd2b3RlJywgJ2RlZmktZGVwb3NpdCcsICdkZWZpLXJlZGVlbSddLmZvckVhY2goKHQpID0+IHtcbiAgICAgICAgYXNzZXJ0Lm9rKCFOT19SRUNJUElFTlRfVFhfVFlQRVMuaGFzKHQpLCBgJHt0fSBtdXN0IE5PVCBiZSBpbiBOT19SRUNJUElFTlRfVFhfVFlQRVNgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncmVzb2x2ZUVmZmVjdGl2ZVR4UGFyYW1zJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdwYXNzZXMgdGhyb3VnaCB0eFBhcmFtcy5yZWNpcGllbnRzIHdoZW4gcHJlc2VudCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4UmVxdWVzdCA9IG1ha2VUeFJlcXVlc3QoKTtcbiAgICAgIGNvbnN0IHR4UGFyYW1zID0geyByZWNpcGllbnRzOiBbeyBhZGRyZXNzOiAnMHhhYmMnLCBhbW91bnQ6ICcxMDAnIH1dIH07XG4gICAgICBjb25zdCByZXN1bHQgPSByZXNvbHZlRWZmZWN0aXZlVHhQYXJhbXModHhSZXF1ZXN0LCB0eFBhcmFtcyk7XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHJlc3VsdC5yZWNpcGllbnRzLCB0eFBhcmFtcy5yZWNpcGllbnRzKTtcbiAgICB9KTtcblxuICAgIGl0KCdmYWxscyBiYWNrIHRvIGludGVudC5yZWNpcGllbnRzIHdoZW4gdHhQYXJhbXMgaGFzIG5vbmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eFJlcXVlc3QgPSBtYWtlVHhSZXF1ZXN0KHtcbiAgICAgICAgaW50ZW50OiB7XG4gICAgICAgICAgaW50ZW50VHlwZTogJ3BheW1lbnQnLFxuICAgICAgICAgIHJlY2lwaWVudHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWRkcmVzczogeyBhZGRyZXNzOiAnMHhhYmMnIH0sXG4gICAgICAgICAgICAgIGFtb3VudDogeyB2YWx1ZTogJzUwMCcsIHN5bWJvbDogJ2V0aCcgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSBhcyBhbnksXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc29sdmVFZmZlY3RpdmVUeFBhcmFtcyh0eFJlcXVlc3QsIHt9KTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQucmVjaXBpZW50cz8ubGVuZ3RoLCAxKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQucmVjaXBpZW50cz8uWzBdLmFkZHJlc3MsICcweGFiYycpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdC5yZWNpcGllbnRzPy5bMF0uYW1vdW50LCAnNTAwJyk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVzb2x2ZXMgdHhUeXBlIGZyb20gaW50ZW50LmludGVudFR5cGUgd2hlbiB0eFBhcmFtcy50eXBlIGlzIGFic2VudCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4UmVxdWVzdCA9IG1ha2VUeFJlcXVlc3Qoe1xuICAgICAgICBpbnRlbnQ6IHsgaW50ZW50VHlwZTogJ2NvbnNvbGlkYXRlJyB9IGFzIGFueSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmVzdWx0ID0gcmVzb2x2ZUVmZmVjdGl2ZVR4UGFyYW1zKHR4UmVxdWVzdCwge30pO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdC50eXBlLCAnY29uc29saWRhdGUnKTtcbiAgICB9KTtcblxuICAgIGl0KCdkb2VzIG5vdCB0aHJvdyBmb3IgZXhlbXB0IHR5cGVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgZm9yIChjb25zdCB0eFR5cGUgb2YgW1xuICAgICAgICAnYWNjZWxlcmF0aW9uJyxcbiAgICAgICAgJ2NvbnNvbGlkYXRlJyxcbiAgICAgICAgJ2NvbnRyYWN0Q2FsbCcsXG4gICAgICAgICdkZWxlZ2F0ZScsXG4gICAgICAgICdzdGFrZScsXG4gICAgICAgICdjcmVhdGVBY2NvdW50JyxcbiAgICAgICAgJ3BsZWRnZScsXG4gICAgICAgICdpbXBvcnQnLFxuICAgICAgICAnaW1wb3J0dG9jJyxcbiAgICAgIF0pIHtcbiAgICAgICAgY29uc3QgdHhSZXF1ZXN0ID0gbWFrZVR4UmVxdWVzdCgpO1xuICAgICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHJlc29sdmVFZmZlY3RpdmVUeFBhcmFtcyh0eFJlcXVlc3QsIHsgdHlwZTogdHhUeXBlIH0pKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdkb2VzIG5vdCB0aHJvdyBmb3IgQXZhbGFuY2hlIGNyb3NzLWNoYWluIGltcG9ydHMgcmVzb2x2ZWQgZnJvbSBpbnRlbnQuaW50ZW50VHlwZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFAtY2hhaW4gYW5kIEMtY2hhaW4gaW1wb3J0IGludGVudHMgbGVnaXRpbWF0ZWx5IGNhcnJ5IG5vIHJlY2lwaWVudHMg4oCUXG4gICAgICAvLyB0aGUgd2FsbGV0IGltcG9ydHMgaXRzIG93biBVVFhPcyBhbmQgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MgaXMgdGhlXG4gICAgICAvLyB3YWxsZXQgaXRzZWxmLiBUaGUgaW50ZW50VHlwZSBsaXZlcyBvbmx5IG9uIHRoZSBpbnRlbnQgKHR4UGFyYW1zLnR5cGVcbiAgICAgIC8vIGlzIHVuc2V0IG9uIHRoZSBNUEMgc2lnbmluZyBjYWxsKSBzbyB0aGUgZ3VhcmQgbXVzdCByZWFkIGl0IGZyb20gdGhlcmUuXG4gICAgICBmb3IgKGNvbnN0IGludGVudFR5cGUgb2YgWydpbXBvcnQnLCAnaW1wb3J0dG9jJ10pIHtcbiAgICAgICAgY29uc3QgdHhSZXF1ZXN0ID0gbWFrZVR4UmVxdWVzdCh7IGludGVudDogeyBpbnRlbnRUeXBlIH0gYXMgYW55IH0pO1xuICAgICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHJlc29sdmVFZmZlY3RpdmVUeFBhcmFtcyh0eFJlcXVlc3QsIHt9KSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnZG9lcyBub3QgdGhyb3cgd2hlbiBidWlsZFBhcmFtcy50eXBlIGlzIFBhc2NhbENhc2UgYnV0IGludGVudC5pbnRlbnRUeXBlIGlzIGxvd2VyY2FzZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIHNpZ25UcmFuc2FjdGlvblRzcyBwYXNzZXMgdHhQcmVidWlsZC5idWlsZFBhcmFtcyBhcyB0eFBhcmFtcy4gUHJlYnVpbGQgdXNlc1xuICAgICAgLy8gdHlwZTogJ0ltcG9ydCcgd2hpbGUgV1Agc3RvcmVzIGludGVudFR5cGU6ICdpbXBvcnQnIG9uIHRoZSB0eFJlcXVlc3QuXG4gICAgICBjb25zdCB0eFJlcXVlc3QgPSBtYWtlVHhSZXF1ZXN0KHsgaW50ZW50OiB7IGludGVudFR5cGU6ICdpbXBvcnQnLCByZWNpcGllbnRzOiBbXSB9IGFzIGFueSB9KTtcbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4gcmVzb2x2ZUVmZmVjdGl2ZVR4UGFyYW1zKHR4UmVxdWVzdCwgeyB0eXBlOiAnSW1wb3J0JywgcmVjaXBpZW50czogW10gfSkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Rocm93cyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvciBmb3IgdW5rbm93biB0eXBlcyB3aXRoIG5vIHJlY2lwaWVudHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eFJlcXVlc3QgPSBtYWtlVHhSZXF1ZXN0KCk7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiByZXNvbHZlRWZmZWN0aXZlVHhQYXJhbXModHhSZXF1ZXN0LCB7IHR5cGU6ICdwYXltZW50JyB9KSxcbiAgICAgICAgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IsXG4gICAgICAgICdzaG91bGQgdGhyb3cgZm9yIHBheW1lbnQgdHlwZSB3aXRoIG5vIHJlY2lwaWVudHMnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Rocm93cyB3aGVuIHR4UGFyYW1zIGlzIHVuZGVmaW5lZCBhbmQgbm8gaW50ZW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhSZXF1ZXN0ID0gbWFrZVR4UmVxdWVzdCgpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiByZXNvbHZlRWZmZWN0aXZlVHhQYXJhbXModHhSZXF1ZXN0LCB1bmRlZmluZWQpLCBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcik7XG4gICAgfSk7XG5cbiAgICBpdCgnZG9lcyBub3QgdGhyb3cgd2hlbiBpbnRlbnQgaGFzIHN0YWtpbmdSZXF1ZXN0SWQgKHN0YWtpbmcgYnlwYXNzKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4UmVxdWVzdCA9IG1ha2VUeFJlcXVlc3Qoe1xuICAgICAgICBpbnRlbnQ6IHsgaW50ZW50VHlwZTogJ2RlbGVnYXRlJywgc3Rha2luZ1JlcXVlc3RJZDogJ3N0YWtpbmctcmVxLTEyMycgfSBhcyBhbnksXG4gICAgICB9KTtcbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4gcmVzb2x2ZUVmZmVjdGl2ZVR4UGFyYW1zKHR4UmVxdWVzdCwge30pKTtcbiAgICB9KTtcblxuICAgIGl0KCdwcm9wYWdhdGVzIHN0YWtpbmdSZXF1ZXN0SWQgZnJvbSBpbnRlbnQgaW50byBlZmZlY3RpdmVUeFBhcmFtcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4UmVxdWVzdCA9IG1ha2VUeFJlcXVlc3Qoe1xuICAgICAgICBpbnRlbnQ6IHsgaW50ZW50VHlwZTogJ2RlbGVnYXRlJywgc3Rha2luZ1JlcXVlc3RJZDogJ3N0YWtpbmctcmVxLTQ1NicgfSBhcyBhbnksXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc29sdmVFZmZlY3RpdmVUeFBhcmFtcyh0eFJlcXVlc3QsIHt9KTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQuc3Rha2luZ1JlcXVlc3RJZCwgJ3N0YWtpbmctcmVxLTQ1NicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IG92ZXJ3cml0ZSBleGlzdGluZyBzdGFraW5nUmVxdWVzdElkIGluIHR4UGFyYW1zJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhSZXF1ZXN0ID0gbWFrZVR4UmVxdWVzdCh7XG4gICAgICAgIGludGVudDogeyBpbnRlbnRUeXBlOiAnZGVsZWdhdGUnLCBzdGFraW5nUmVxdWVzdElkOiAnZnJvbS1pbnRlbnQnIH0gYXMgYW55LFxuICAgICAgfSk7XG4gICAgICBjb25zdCByZXN1bHQgPSByZXNvbHZlRWZmZWN0aXZlVHhQYXJhbXModHhSZXF1ZXN0LCB7IHN0YWtpbmdSZXF1ZXN0SWQ6ICdmcm9tLWNhbGxlcicgfSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LnN0YWtpbmdSZXF1ZXN0SWQsICdmcm9tLWNhbGxlcicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3ByZWZlcnMgdHhQYXJhbXMucmVjaXBpZW50cyBvdmVyIGludGVudC5yZWNpcGllbnRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhSZXF1ZXN0ID0gbWFrZVR4UmVxdWVzdCh7XG4gICAgICAgIGludGVudDoge1xuICAgICAgICAgIGludGVudFR5cGU6ICdwYXltZW50JyxcbiAgICAgICAgICByZWNpcGllbnRzOiBbeyBhZGRyZXNzOiB7IGFkZHJlc3M6ICcweGludGVudCcgfSwgYW1vdW50OiB7IHZhbHVlOiAnOTk5Jywgc3ltYm9sOiAnZXRoJyB9IH1dLFxuICAgICAgICB9IGFzIGFueSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgdHhQYXJhbXMgPSB7IHJlY2lwaWVudHM6IFt7IGFkZHJlc3M6ICcweGNhbGxlcicsIGFtb3VudDogJzEwMCcgfV0gfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc29sdmVFZmZlY3RpdmVUeFBhcmFtcyh0eFJlcXVlc3QsIHR4UGFyYW1zKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQucmVjaXBpZW50cz8uWzBdLmFkZHJlc3MsICcweGNhbGxlcicpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
@@ -131,5 +131,71 @@ describe('Wallet - Token Approval', function () {
131
131
  await wallet.buildErc20TokenApproval('USDC', 'passphrase123').should.be.rejectedWith('signing error');
132
132
  });
133
133
  });
134
+ describe('sendTokenEnablement', function () {
135
+ let teWallet;
136
+ let teBaseCoin;
137
+ let teBitGo;
138
+ beforeEach(function () {
139
+ teBitGo = {
140
+ post: sinon_1.default.stub(),
141
+ get: sinon_1.default.stub(),
142
+ setRequestTracer: sinon_1.default.stub(),
143
+ };
144
+ teBaseCoin = {
145
+ getFamily: sinon_1.default.stub().returns('txrp'),
146
+ getFullName: sinon_1.default.stub().returns('Testnet XRP'),
147
+ url: sinon_1.default.stub(),
148
+ keychains: sinon_1.default.stub(),
149
+ supportsTss: sinon_1.default.stub().returns(false),
150
+ getMPCAlgorithm: sinon_1.default.stub(),
151
+ getTokenEnablementConfig: sinon_1.default.stub().returns({ requiresTokenEnablement: true }),
152
+ };
153
+ // custodial wallet so the path after validation calls initiateTransaction
154
+ const walletData = {
155
+ id: 'te-wallet-id',
156
+ coin: 'txrp',
157
+ type: 'custodial',
158
+ keys: ['user-key', 'backup-key', 'bitgo-key'],
159
+ };
160
+ teWallet = new src_1.Wallet(teBitGo, teBaseCoin, walletData);
161
+ });
162
+ it('should throw "Invalid build of token enablement." when prebuildTx is a string', async function () {
163
+ await teWallet
164
+ .sendTokenEnablement({ prebuildTx: 'raw-hex-string' })
165
+ .should.be.rejectedWith('Invalid build of token enablement.');
166
+ });
167
+ it('should throw "Invalid build of token enablement." when buildParams.type is undefined', async function () {
168
+ await teWallet
169
+ .sendTokenEnablement({ prebuildTx: { buildParams: {} } })
170
+ .should.be.rejectedWith('Invalid build of token enablement.');
171
+ });
172
+ it('should throw "Invalid build of token enablement." when buildParams.type is an unrecognised type', async function () {
173
+ await teWallet
174
+ .sendTokenEnablement({ prebuildTx: { buildParams: { type: 'transfer' } } })
175
+ .should.be.rejectedWith('Invalid build of token enablement.');
176
+ });
177
+ it('should pass validation and proceed when buildParams.type is "enabletoken"', async function () {
178
+ const initiateStub = sinon_1.default.stub(teWallet, 'initiateTransaction').resolves({ txid: 'abc123' });
179
+ const result = await teWallet.sendTokenEnablement({
180
+ prebuildTx: { buildParams: { type: 'enabletoken' } },
181
+ });
182
+ result.should.eql({ txid: 'abc123' });
183
+ sinon_1.default.assert.calledOnce(initiateStub);
184
+ });
185
+ it('should pass validation and proceed when buildParams.type is "enableMpt"', async function () {
186
+ const initiateStub = sinon_1.default.stub(teWallet, 'initiateTransaction').resolves({ txid: 'mpt456' });
187
+ const result = await teWallet.sendTokenEnablement({
188
+ prebuildTx: { buildParams: { type: 'enableMpt' } },
189
+ });
190
+ result.should.eql({ txid: 'mpt456' });
191
+ sinon_1.default.assert.calledOnce(initiateStub);
192
+ });
193
+ it('should throw when the coin does not require token enablement', async function () {
194
+ teBaseCoin.getTokenEnablementConfig.returns({ requiresTokenEnablement: false });
195
+ await teWallet
196
+ .sendTokenEnablement({ prebuildTx: { buildParams: { type: 'enableMpt' } } })
197
+ .should.be.rejectedWith(/does not require token enablement transactions/);
198
+ });
199
+ });
134
200
  });
135
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW5BcHByb3ZhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9iaXRnby93YWxsZXQvdG9rZW5BcHByb3ZhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLGtEQUEwQjtBQUMxQixrQkFBZ0I7QUFDaEIseUNBQXFFO0FBRXJFLFFBQVEsQ0FBQyx5QkFBeUIsRUFBRTtJQUNsQyxJQUFJLE1BQWMsQ0FBQztJQUNuQixJQUFJLFNBQWMsQ0FBQztJQUNuQixJQUFJLFlBQWlCLENBQUM7SUFDdEIsSUFBSSxjQUFtQixDQUFDO0lBRXhCLFVBQVUsQ0FBQztRQUNULFNBQVMsR0FBRztZQUNWLElBQUksRUFBRSxlQUFLLENBQUMsSUFBSSxFQUFFO1lBQ2xCLEdBQUcsRUFBRSxlQUFLLENBQUMsSUFBSSxFQUFFO1lBQ2pCLGdCQUFnQixFQUFFLGVBQUssQ0FBQyxJQUFJLEVBQUU7U0FDL0IsQ0FBQztRQUVGLFlBQVksR0FBRztZQUNiLFNBQVMsRUFBRSxlQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUN0QyxHQUFHLEVBQUUsZUFBSyxDQUFDLElBQUksRUFBRTtZQUNqQixTQUFTLEVBQUUsZUFBSyxDQUFDLElBQUksRUFBRTtZQUN2QixXQUFXLEVBQUUsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFDeEMsZUFBZSxFQUFFLGVBQUssQ0FBQyxJQUFJLEVBQUU7U0FDOUIsQ0FBQztRQUVGLGNBQWMsR0FBRztZQUNmLEVBQUUsRUFBRSxnQkFBZ0I7WUFDcEIsSUFBSSxFQUFFLE1BQU07WUFDWixJQUFJLEVBQUUsQ0FBQyxVQUFVLEVBQUUsWUFBWSxFQUFFLFdBQVcsQ0FBQztTQUM5QyxDQUFDO1FBRUYsTUFBTSxHQUFHLElBQUksWUFBTSxDQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDL0Qs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c2hvdWxkJztcbmltcG9ydCB7IEJ1aWxkVG9rZW5BcHByb3ZhbFJlc3BvbnNlLCBXYWxsZXQgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMnO1xuXG5kZXNjcmliZSgnV2FsbGV0IC0gVG9rZW4gQXBwcm92YWwnLCBmdW5jdGlvbiAoKSB7XG4gIGxldCB3YWxsZXQ6IFdhbGxldDtcbiAgbGV0IG1vY2tCaXRHbzogYW55O1xuICBsZXQgbW9ja0Jhc2VDb2luOiBhbnk7XG4gIGxldCBtb2NrV2FsbGV0RGF0YTogYW55O1xuXG4gIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgIG1vY2tCaXRHbyA9IHtcbiAgICAgIHBvc3Q6IHNpbm9uLnN0dWIoKSxcbiAgICAgIGdldDogc2lub24uc3R1YigpLFxuICAgICAgc2V0UmVxdWVzdFRyYWNlcjogc2lub24uc3R1YigpLFxuICAgIH07XG5cbiAgICBtb2NrQmFzZUNvaW4gPSB7XG4gICAgICBnZXRGYW1pbHk6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKCdldGgnKSxcbiAgICAgIHVybDogc2lub24uc3R1YigpLFxuICAgICAga2V5Y2hhaW5zOiBzaW5vbi5zdHViKCksXG4gICAgICBzdXBwb3J0c1Rzczogc2lub24uc3R1YigpLnJldHVybnMoZmFsc2UpLFxuICAgICAgZ2V0TVBDQWxnb3JpdGhtOiBzaW5vbi5zdHViKCksXG4gICAgfTtcblxuICAgIG1vY2tXYWxsZXREYXRhID0ge1xuICAgICAgaWQ6ICd0ZXN0LXdhbGxldC1pZCcsXG4gICAgICBjb2luOiAndGV0aCcsXG4gICAgICBrZXlzOiBbJ3VzZXIta2V5JywgJ2JhY2t1cC1rZXknLCAnYml0Z28ta2V5J10sXG4gICAgfTtcblxuICAgIHdhbGxldCA9IG5ldyBXYWxsZXQobW9ja0JpdEdvLCBtb2NrQmFzZUNvaW4sIG1vY2tXYWxsZXREYXRhKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBzaW5vbi5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdidWlsZEVyYzIwVG9rZW5BcHByb3ZhbCcsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBtb2NrVG9rZW5BcHByb3ZhbEJ1aWxkOiBCdWlsZFRva2VuQXBwcm92YWxSZXNwb25zZSA9IHtcbiAgICAgIHR4SGV4OiAnMHgxMjM0NTYnLFxuICAgICAgdHhJbmZvOiB7XG4gICAgICAgIGFtb3VudDogJzB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZicsXG4gICAgICAgIGNvbnRyYWN0QWRkcmVzczogJzB4MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCcsXG4gICAgICAgIHNwZW5kZXI6ICcweDA5ODc2NTQzMjEwOTg3NjU0MzIxMDk4NzY1NDMyMTA5ODc2NTQzMjEnLFxuICAgICAgfSxcbiAgICAgIHJlY2lwaWVudHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGFkZHJlc3M6ICcweDA5ODc2NTQzMjEwOTg3NjU0MzIxMDk4NzY1NDMyMTA5ODc2NTQzMjEnLFxuICAgICAgICAgIGFtb3VudDogJzAnLFxuICAgICAgICAgIGRhdGE6ICcweDA5NWVhN2IzMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDk4NzY1NDMyMTA5ODc2NTQzMjEwOTg3NjU0MzIxMDk4NzY1NDMyMWZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYnLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGVpcDE1NTk6IHtcbiAgICAgICAgbWF4RmVlUGVyR2FzOiAnMHgzYjlhY2EwMCcsXG4gICAgICAgIG1heFByaW9yaXR5RmVlUGVyR2FzOiAnMHgzYjlhY2EwMCcsXG4gICAgICB9LFxuICAgICAgbmV4dENvbnRyYWN0U2VxdWVuY2VJZDogMCxcbiAgICAgIGNvaW46ICd0ZXRoJyxcbiAgICAgIHdhbGxldElkOiAndGVzdC13YWxsZXQtaWQnLFxuICAgIH07XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIHRva2VuIGFwcHJvdmFsIHRyYW5zYWN0aW9uIHdpdGhvdXQgc2lnbmluZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIG1vY2tCYXNlQ29pbi51cmwucmV0dXJucygnL3Rlc3Qvd2FsbGV0L3Rva2VuL2FwcHJvdmFsL2J1aWxkJyk7XG4gICAgICBtb2NrQml0R28ucG9zdC5yZXR1cm5zKHtcbiAgICAgICAgc2VuZDogc2lub24uc3R1YigpLnJldHVybnMoe1xuICAgICAgICAgIHJlc3VsdDogc2lub24uc3R1YigpLnJlc29sdmVzKG1vY2tUb2tlbkFwcHJvdmFsQnVpbGQpLFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3YWxsZXQuYnVpbGRFcmMyMFRva2VuQXBwcm92YWwoJ1VTREMnKTtcblxuICAgICAgcmVzdWx0LnNob3VsZC5lcWwobW9ja1Rva2VuQXBwcm92YWxCdWlsZCk7XG4gICAgICBzaW5vbi5hc3NlcnQuY2FsbGVkV2l0aChtb2NrQmFzZUNvaW4udXJsLCAnL3dhbGxldC90ZXN0LXdhbGxldC1pZC90b2tlbi9hcHByb3ZhbC9idWlsZCcpO1xuICAgICAgc2lub24uYXNzZXJ0LmNhbGxlZE9uY2UobW9ja0JpdEdvLnBvc3QpO1xuICAgICAgc2lub24uYXNzZXJ0LmNhbGxlZE9uY2UobW9ja0JpdEdvLnNldFJlcXVlc3RUcmFjZXIpO1xuICAgICAgY29uc3QgcG9zdFJlcXVlc3QgPSBtb2NrQml0R28ucG9zdC5nZXRDYWxsKDApO1xuICAgICAgY29uc3Qgc2VuZENhbGwgPSBwb3N0UmVxdWVzdC5yZXR1cm5WYWx1ZS5zZW5kLmdldENhbGwoMCk7XG4gICAgICBzZW5kQ2FsbC5hcmdzWzBdLnNob3VsZC5lcWwoeyB0b2tlbk5hbWU6ICdVU0RDJyB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgaWYgdG9rZW4gYnVpbGQgcmVxdWVzdCBmYWlscycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIG1vY2tCYXNlQ29pbi51cmwucmV0dXJucygnL3Rlc3Qvd2FsbGV0L3Rva2VuL2FwcHJvdmFsL2J1aWxkJyk7XG4gICAgICBtb2NrQml0R28ucG9zdC5yZXR1cm5zKHtcbiAgICAgICAgc2VuZDogc2lub24uc3R1YigpLnJldHVybnMoe1xuICAgICAgICAgIHJlc3VsdDogc2lub24uc3R1YigpLnJlamVjdHMobmV3IEVycm9yKCd0b2tlbiBub3Qgc3VwcG9ydGVkJykpLFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCB3YWxsZXRcbiAgICAgICAgLmJ1aWxkRXJjMjBUb2tlbkFwcHJvdmFsKCdJTlZBTElEX1RPS0VOJylcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL2Vycm9yIGJ1aWxkaW5nIGVyYzIwIHRva2VuIGFwcHJvdmFsIHR4OiBFcnJvcjogdG9rZW4gbm90IHN1cHBvcnRlZC8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCwgc2lnbiwgYW5kIHNlbmQgdG9rZW4gYXBwcm92YWwgdHJhbnNhY3Rpb24gd2hlbiBwYXNzcGhyYXNlIGlzIHByb3ZpZGVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbW9ja0Jhc2VDb2luLnVybC5yZXR1cm5zKCcvdGVzdC93YWxsZXQvdG9rZW4vYXBwcm92YWwvYnVpbGQnKTtcbiAgICAgIG1vY2tCaXRHby5wb3N0LnJldHVybnMoe1xuICAgICAgICBzZW5kOiBzaW5vbi5zdHViKCkucmV0dXJucyh7XG4gICAgICAgICAgcmVzdWx0OiBzaW5vbi5zdHViKCkucmVzb2x2ZXMobW9ja1Rva2VuQXBwcm92YWxCdWlsZCksXG4gICAgICAgIH0pLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG1vY2tLZXljaGFpbiA9IHsgaWQ6ICd1c2VyLWtleScsIHB1YjogJ3B1Yi1rZXknLCBlbmNyeXB0ZWRQcnY6ICdlbmNyeXB0ZWQtcHJ2JyB9O1xuICAgICAgbW9ja0Jhc2VDb2luLmtleWNoYWlucy5yZXR1cm5zKHtcbiAgICAgICAgZ2V0OiBzaW5vbi5zdHViKCkucmVzb2x2ZXMobW9ja0tleWNoYWluKSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzaWduVHJhbnNhY3Rpb25TdHViID0gc2lub24uc3R1Yih3YWxsZXQsICdzaWduVHJhbnNhY3Rpb24nIGFzIGtleW9mIFdhbGxldCkucmVzb2x2ZXMoeyB0eEhleDogJzB4c2lnbmVkJyB9KTtcbiAgICAgIGNvbnN0IHNlbmRUcmFuc2FjdGlvblN0dWIgPSBzaW5vbi5zdHViKHdhbGxldCwgJ3NlbmRUcmFuc2FjdGlvbicgYXMga2V5b2YgV2FsbGV0KS5yZXNvbHZlcyh7IHR4aWQ6ICcweHR4aWQnIH0pO1xuICAgICAgY29uc3QgZ2V0S2V5Y2hhaW5zU3R1YiA9IHNpbm9uLnN0dWIod2FsbGV0IGFzIGFueSwgJ2dldEtleWNoYWluc0FuZFZhbGlkYXRlUGFzc3BocmFzZScpLnJlc29sdmVzKFttb2NrS2V5Y2hhaW5dKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2FsbGV0LmJ1aWxkRXJjMjBUb2tlbkFwcHJvdmFsKCdVU0RDJywgJ3Bhc3NwaHJhc2UxMjMnKTtcblxuICAgICAgcmVzdWx0LnNob3VsZC5oYXZlLnByb3BlcnR5KCd0eGlkJywgJzB4dHhpZCcpO1xuXG4gICAgICBzaW5vbi5hc3NlcnQuY2FsbGVkT25jZShnZXRLZXljaGFpbnNTdHViKTtcbiAgICAgIGdldEtleWNoYWluc1N0dWIuZ2V0Q2FsbCgwKS5hcmdzWzBdLnNob3VsZC5oYXZlLnByb3BlcnR5KCd3YWxsZXRQYXNzcGhyYXNlJywgJ3Bhc3NwaHJhc2UxMjMnKTtcblxuICAgICAgc2lub24uYXNzZXJ0LmNhbGxlZE9uY2Uoc2lnblRyYW5zYWN0aW9uU3R1Yik7XG4gICAgICBjb25zdCBzaWduQ2FsbCA9IHNpZ25UcmFuc2FjdGlvblN0dWIuZ2V0Q2FsbCgwKTtcbiAgICAgIGlmIChzaWduQ2FsbCAmJiBzaWduQ2FsbC5hcmdzWzBdKSB7XG4gICAgICAgIHNpZ25DYWxsLmFyZ3NbMF0uc2hvdWxkLmhhdmUucHJvcGVydHkoJ3R4UHJlYnVpbGQnLCBtb2NrVG9rZW5BcHByb3ZhbEJ1aWxkKTtcbiAgICAgICAgc2lnbkNhbGwuYXJnc1swXS5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgna2V5Y2hhaW4nLCBtb2NrS2V5Y2hhaW4pO1xuICAgICAgICBzaWduQ2FsbC5hcmdzWzBdLnNob3VsZC5oYXZlLnByb3BlcnR5KCd3YWxsZXRQYXNzcGhyYXNlJywgJ3Bhc3NwaHJhc2UxMjMnKTtcbiAgICAgIH1cblxuICAgICAgc2lub24uYXNzZXJ0LmNhbGxlZE9uY2Uoc2VuZFRyYW5zYWN0aW9uU3R1Yik7XG4gICAgICBjb25zdCBzZW5kQ2FsbCA9IHNlbmRUcmFuc2FjdGlvblN0dWIuZ2V0Q2FsbCgwKTtcbiAgICAgIGlmIChzZW5kQ2FsbCAmJiBzZW5kQ2FsbC5hcmdzWzBdKSB7XG4gICAgICAgIHNlbmRDYWxsLmFyZ3NbMF0uc2hvdWxkLmhhdmUucHJvcGVydHkoJ3R4SGV4JywgJzB4c2lnbmVkJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBzaWduaW5nIGVycm9ycycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIG1vY2tCYXNlQ29pbi51cmwucmV0dXJucygnL3Rlc3Qvd2FsbGV0L3Rva2VuL2FwcHJvdmFsL2J1aWxkJyk7XG4gICAgICBtb2NrQml0R28ucG9zdC5yZXR1cm5zKHtcbiAgICAgICAgc2VuZDogc2lub24uc3R1YigpLnJldHVybnMoe1xuICAgICAgICAgIHJlc3VsdDogc2lub24uc3R1YigpLnJlc29sdmVzKG1vY2tUb2tlbkFwcHJvdmFsQnVpbGQpLFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBtb2NrS2V5Y2hhaW4gPSB7IGlkOiAndXNlci1rZXknLCBwdWI6ICdwdWIta2V5JywgZW5jcnlwdGVkUHJ2OiAnZW5jcnlwdGVkLXBydicgfTtcbiAgICAgIG1vY2tCYXNlQ29pbi5rZXljaGFpbnMucmV0dXJucyh7XG4gICAgICAgIGdldDogc2lub24uc3R1YigpLnJlc29sdmVzKG1vY2tLZXljaGFpbiksXG4gICAgICB9KTtcblxuICAgICAgc2lub24uc3R1Yih3YWxsZXQgYXMgYW55LCAnZ2V0S2V5Y2hhaW5zQW5kVmFsaWRhdGVQYXNzcGhyYXNlJykucmVzb2x2ZXMoW21vY2tLZXljaGFpbl0pO1xuICAgICAgc2lub24uc3R1Yih3YWxsZXQsICdzaWduVHJhbnNhY3Rpb24nIGFzIGtleW9mIFdhbGxldCkucmVqZWN0cyhuZXcgRXJyb3IoJ3NpZ25pbmcgZXJyb3InKSk7XG5cbiAgICAgIGF3YWl0IHdhbGxldC5idWlsZEVyYzIwVG9rZW5BcHByb3ZhbCgnVVNEQycsICdwYXNzcGhyYXNlMTIzJykuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnc2lnbmluZyBlcnJvcicpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
201
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW5BcHByb3ZhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9iaXRnby93YWxsZXQvdG9rZW5BcHByb3ZhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLGtEQUEwQjtBQUMxQixrQkFBZ0I7QUFDaEIseUNBQXFFO0FBRXJFLFFBQVEsQ0FBQyx5QkFBeUIsRUFBRTtJQUNsQyxJQUFJLE1BQWMsQ0FBQztJQUNuQixJQUFJLFNBQWMsQ0FBQztJQUNuQixJQUFJLFlBQWlCLENBQUM7SUFDdEIsSUFBSSxjQUFtQixDQUFDO0lBRXhCLFVBQVUsQ0FBQztRQUNULFNBQVMsR0FBRztZQUNWLElBQUksRUFBRSxlQUFLLENBQUMsSUFBSSxFQUFFO1lBQ2xCLEdBQUcsRUFBRSxlQUFLLENBQUMsSUFBSSxFQUFFO1lBQ2pCLGdCQUFnQixFQUFFLGVBQUssQ0FBQyxJQUFJLEVBQUU7U0FDL0IsQ0FBQztRQUVGLFlBQVksR0FBRztZQUNiLFNBQVMsRUFBRSxlQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUN0QyxHQUFHLEVBQUUsZUFBSyxDQUFDLElBQUksRUFBRTtZQUNqQixTQUFTLEVBQUUsZUFBSyxDQUFDLElBQUksRUFBRTtZQUN2QixXQUFXLEVBQUUsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFDeEMsZUFBZSxFQUFFLGVBQUssQ0FBQyxJQUFJLEVBQUU7U0FDOUIsQ0FBQztRQUVGLGNBQWMsR0FBRztZQUNmLEVBQUUsRUFBRSxnQkFBZ0I7WUFDcEIsSUFBSSxFQUFFLE1BQU07WUFDWixJQUFJLEVBQUUsQ0FBQyxVQUFVLEVBQUUsWUFBWSxFQUFFLFdBQVcsQ0FBQztTQUM5QyxDQUFDO1FBRUYsTUFBTSxHQUFHLElBQUksWUFBTSxDQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDL0Qs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QyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMseUVBQXlFLEVBQUUsS0FBSztZQUNqRixNQUFNLFlBQVksR0FBRyxlQUFLLENBQUMsSUFBSSxDQUFDLFFBQWUsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBRXJHLE1BQU0sTUFBTSxHQUFHLE1BQU0sUUFBUSxDQUFDLG1CQUFtQixDQUFDO2dCQUNoRCxVQUFVLEVBQUUsRUFBRSxXQUFXLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLEVBQVM7YUFDMUQsQ0FBQyxDQUFDO1lBRUgsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUN0QyxlQUFLLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN4QyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw4REFBOEQsRUFBRSxLQUFLO1lBQ3RFLFVBQVUsQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsRUFBRSx1QkFBdUIsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBRWhGLE1BQU0sUUFBUTtpQkFDWCxtQkFBbUIsQ0FBQyxFQUFFLFVBQVUsRUFBRSxFQUFFLFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsRUFBUyxFQUFFLENBQUM7aUJBQ2xGLE1BQU0sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLGdEQUFnRCxDQUFDLENBQUM7UUFDOUUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHNpbm9uIGZyb20gJ3Npbm9uJztcbmltcG9ydCAnc2hvdWxkJztcbmltcG9ydCB7IEJ1aWxkVG9rZW5BcHByb3ZhbFJlc3BvbnNlLCBXYWxsZXQgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMnO1xuXG5kZXNjcmliZSgnV2FsbGV0IC0gVG9rZW4gQXBwcm92YWwnLCBmdW5jdGlvbiAoKSB7XG4gIGxldCB3YWxsZXQ6IFdhbGxldDtcbiAgbGV0IG1vY2tCaXRHbzogYW55O1xuICBsZXQgbW9ja0Jhc2VDb2luOiBhbnk7XG4gIGxldCBtb2NrV2FsbGV0RGF0YTogYW55O1xuXG4gIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgIG1vY2tCaXRHbyA9IHtcbiAgICAgIHBvc3Q6IHNpbm9uLnN0dWIoKSxcbiAgICAgIGdldDogc2lub24uc3R1YigpLFxuICAgICAgc2V0UmVxdWVzdFRyYWNlcjogc2lub24uc3R1YigpLFxuICAgIH07XG5cbiAgICBtb2NrQmFzZUNvaW4gPSB7XG4gICAgICBnZXRGYW1pbHk6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKCdldGgnKSxcbiAgICAgIHVybDogc2lub24uc3R1YigpLFxuICAgICAga2V5Y2hhaW5zOiBzaW5vbi5zdHViKCksXG4gICAgICBzdXBwb3J0c1Rzczogc2lub24uc3R1YigpLnJldHVybnMoZmFsc2UpLFxuICAgICAgZ2V0TVBDQWxnb3JpdGhtOiBzaW5vbi5zdHViKCksXG4gICAgfTtcblxuICAgIG1vY2tXYWxsZXREYXRhID0ge1xuICAgICAgaWQ6ICd0ZXN0LXdhbGxldC1pZCcsXG4gICAgICBjb2luOiAndGV0aCcsXG4gICAgICBrZXlzOiBbJ3VzZXIta2V5JywgJ2JhY2t1cC1rZXknLCAnYml0Z28ta2V5J10sXG4gICAgfTtcblxuICAgIHdhbGxldCA9IG5ldyBXYWxsZXQobW9ja0JpdEdvLCBtb2NrQmFzZUNvaW4sIG1vY2tXYWxsZXREYXRhKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBzaW5vbi5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdidWlsZEVyYzIwVG9rZW5BcHByb3ZhbCcsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBtb2NrVG9rZW5BcHByb3ZhbEJ1aWxkOiBCdWlsZFRva2VuQXBwcm92YWxSZXNwb25zZSA9IHtcbiAgICAgIHR4SGV4OiAnMHgxMjM0NTYnLFxuICAgICAgdHhJbmZvOiB7XG4gICAgICAgIGFtb3VudDogJzB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZicsXG4gICAgICAgIGNvbnRyYWN0QWRkcmVzczogJzB4MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCcsXG4gICAgICAgIHNwZW5kZXI6ICcweDA5ODc2NTQzMjEwOTg3NjU0MzIxMDk4NzY1NDMyMTA5ODc2NTQzMjEnLFxuICAgICAgfSxcbiAgICAgIHJlY2lwaWVudHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGFkZHJlc3M6ICcweDA5ODc2NTQzMjEwOTg3NjU0MzIxMDk4NzY1NDMyMTA5ODc2NTQzMjEnLFxuICAgICAgICAgIGFtb3VudDogJzAnLFxuICAgICAgICAgIGRhdGE6ICcweDA5NWVhN2IzMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDk4NzY1NDMyMTA5ODc2NTQzMjEwOTg3NjU0MzIxMDk4NzY1NDMyMWZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYnLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGVpcDE1NTk6IHtcbiAgICAgICAgbWF4RmVlUGVyR2FzOiAnMHgzYjlhY2EwMCcsXG4gICAgICAgIG1heFByaW9yaXR5RmVlUGVyR2FzOiAnMHgzYjlhY2EwMCcsXG4gICAgICB9LFxuICAgICAgbmV4dENvbnRyYWN0U2VxdWVuY2VJZDogMCxcbiAgICAgIGNvaW46ICd0ZXRoJyxcbiAgICAgIHdhbGxldElkOiAndGVzdC13YWxsZXQtaWQnLFxuICAgIH07XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIHRva2VuIGFwcHJvdmFsIHRyYW5zYWN0aW9uIHdpdGhvdXQgc2lnbmluZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIG1vY2tCYXNlQ29pbi51cmwucmV0dXJucygnL3Rlc3Qvd2FsbGV0L3Rva2VuL2FwcHJvdmFsL2J1aWxkJyk7XG4gICAgICBtb2NrQml0R28ucG9zdC5yZXR1cm5zKHtcbiAgICAgICAgc2VuZDogc2lub24uc3R1YigpLnJldHVybnMoe1xuICAgICAgICAgIHJlc3VsdDogc2lub24uc3R1YigpLnJlc29sdmVzKG1vY2tUb2tlbkFwcHJvdmFsQnVpbGQpLFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3YWxsZXQuYnVpbGRFcmMyMFRva2VuQXBwcm92YWwoJ1VTREMnKTtcblxuICAgICAgcmVzdWx0LnNob3VsZC5lcWwobW9ja1Rva2VuQXBwcm92YWxCdWlsZCk7XG4gICAgICBzaW5vbi5hc3NlcnQuY2FsbGVkV2l0aChtb2NrQmFzZUNvaW4udXJsLCAnL3dhbGxldC90ZXN0LXdhbGxldC1pZC90b2tlbi9hcHByb3ZhbC9idWlsZCcpO1xuICAgICAgc2lub24uYXNzZXJ0LmNhbGxlZE9uY2UobW9ja0JpdEdvLnBvc3QpO1xuICAgICAgc2lub24uYXNzZXJ0LmNhbGxlZE9uY2UobW9ja0JpdEdvLnNldFJlcXVlc3RUcmFjZXIpO1xuICAgICAgY29uc3QgcG9zdFJlcXVlc3QgPSBtb2NrQml0R28ucG9zdC5nZXRDYWxsKDApO1xuICAgICAgY29uc3Qgc2VuZENhbGwgPSBwb3N0UmVxdWVzdC5yZXR1cm5WYWx1ZS5zZW5kLmdldENhbGwoMCk7XG4gICAgICBzZW5kQ2FsbC5hcmdzWzBdLnNob3VsZC5lcWwoeyB0b2tlbk5hbWU6ICdVU0RDJyB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgaWYgdG9rZW4gYnVpbGQgcmVxdWVzdCBmYWlscycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIG1vY2tCYXNlQ29pbi51cmwucmV0dXJucygnL3Rlc3Qvd2FsbGV0L3Rva2VuL2FwcHJvdmFsL2J1aWxkJyk7XG4gICAgICBtb2NrQml0R28ucG9zdC5yZXR1cm5zKHtcbiAgICAgICAgc2VuZDogc2lub24uc3R1YigpLnJldHVybnMoe1xuICAgICAgICAgIHJlc3VsdDogc2lub24uc3R1YigpLnJlamVjdHMobmV3IEVycm9yKCd0b2tlbiBub3Qgc3VwcG9ydGVkJykpLFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCB3YWxsZXRcbiAgICAgICAgLmJ1aWxkRXJjMjBUb2tlbkFwcHJvdmFsKCdJTlZBTElEX1RPS0VOJylcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL2Vycm9yIGJ1aWxkaW5nIGVyYzIwIHRva2VuIGFwcHJvdmFsIHR4OiBFcnJvcjogdG9rZW4gbm90IHN1cHBvcnRlZC8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCwgc2lnbiwgYW5kIHNlbmQgdG9rZW4gYXBwcm92YWwgdHJhbnNhY3Rpb24gd2hlbiBwYXNzcGhyYXNlIGlzIHByb3ZpZGVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbW9ja0Jhc2VDb2luLnVybC5yZXR1cm5zKCcvdGVzdC93YWxsZXQvdG9rZW4vYXBwcm92YWwvYnVpbGQnKTtcbiAgICAgIG1vY2tCaXRHby5wb3N0LnJldHVybnMoe1xuICAgICAgICBzZW5kOiBzaW5vbi5zdHViKCkucmV0dXJucyh7XG4gICAgICAgICAgcmVzdWx0OiBzaW5vbi5zdHViKCkucmVzb2x2ZXMobW9ja1Rva2VuQXBwcm92YWxCdWlsZCksXG4gICAgICAgIH0pLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG1vY2tLZXljaGFpbiA9IHsgaWQ6ICd1c2VyLWtleScsIHB1YjogJ3B1Yi1rZXknLCBlbmNyeXB0ZWRQcnY6ICdlbmNyeXB0ZWQtcHJ2JyB9O1xuICAgICAgbW9ja0Jhc2VDb2luLmtleWNoYWlucy5yZXR1cm5zKHtcbiAgICAgICAgZ2V0OiBzaW5vbi5zdHViKCkucmVzb2x2ZXMobW9ja0tleWNoYWluKSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzaWduVHJhbnNhY3Rpb25TdHViID0gc2lub24uc3R1Yih3YWxsZXQsICdzaWduVHJhbnNhY3Rpb24nIGFzIGtleW9mIFdhbGxldCkucmVzb2x2ZXMoeyB0eEhleDogJzB4c2lnbmVkJyB9KTtcbiAgICAgIGNvbnN0IHNlbmRUcmFuc2FjdGlvblN0dWIgPSBzaW5vbi5zdHViKHdhbGxldCwgJ3NlbmRUcmFuc2FjdGlvbicgYXMga2V5b2YgV2FsbGV0KS5yZXNvbHZlcyh7IHR4aWQ6ICcweHR4aWQnIH0pO1xuICAgICAgY29uc3QgZ2V0S2V5Y2hhaW5zU3R1YiA9IHNpbm9uLnN0dWIod2FsbGV0IGFzIGFueSwgJ2dldEtleWNoYWluc0FuZFZhbGlkYXRlUGFzc3BocmFzZScpLnJlc29sdmVzKFttb2NrS2V5Y2hhaW5dKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2FsbGV0LmJ1aWxkRXJjMjBUb2tlbkFwcHJvdmFsKCdVU0RDJywgJ3Bhc3NwaHJhc2UxMjMnKTtcblxuICAgICAgcmVzdWx0LnNob3VsZC5oYXZlLnByb3BlcnR5KCd0eGlkJywgJzB4dHhpZCcpO1xuXG4gICAgICBzaW5vbi5hc3NlcnQuY2FsbGVkT25jZShnZXRLZXljaGFpbnNTdHViKTtcbiAgICAgIGdldEtleWNoYWluc1N0dWIuZ2V0Q2FsbCgwKS5hcmdzWzBdLnNob3VsZC5oYXZlLnByb3BlcnR5KCd3YWxsZXRQYXNzcGhyYXNlJywgJ3Bhc3NwaHJhc2UxMjMnKTtcblxuICAgICAgc2lub24uYXNzZXJ0LmNhbGxlZE9uY2Uoc2lnblRyYW5zYWN0aW9uU3R1Yik7XG4gICAgICBjb25zdCBzaWduQ2FsbCA9IHNpZ25UcmFuc2FjdGlvblN0dWIuZ2V0Q2FsbCgwKTtcbiAgICAgIGlmIChzaWduQ2FsbCAmJiBzaWduQ2FsbC5hcmdzWzBdKSB7XG4gICAgICAgIHNpZ25DYWxsLmFyZ3NbMF0uc2hvdWxkLmhhdmUucHJvcGVydHkoJ3R4UHJlYnVpbGQnLCBtb2NrVG9rZW5BcHByb3ZhbEJ1aWxkKTtcbiAgICAgICAgc2lnbkNhbGwuYXJnc1swXS5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgna2V5Y2hhaW4nLCBtb2NrS2V5Y2hhaW4pO1xuICAgICAgICBzaWduQ2FsbC5hcmdzWzBdLnNob3VsZC5oYXZlLnByb3BlcnR5KCd3YWxsZXRQYXNzcGhyYXNlJywgJ3Bhc3NwaHJhc2UxMjMnKTtcbiAgICAgIH1cblxuICAgICAgc2lub24uYXNzZXJ0LmNhbGxlZE9uY2Uoc2VuZFRyYW5zYWN0aW9uU3R1Yik7XG4gICAgICBjb25zdCBzZW5kQ2FsbCA9IHNlbmRUcmFuc2FjdGlvblN0dWIuZ2V0Q2FsbCgwKTtcbiAgICAgIGlmIChzZW5kQ2FsbCAmJiBzZW5kQ2FsbC5hcmdzWzBdKSB7XG4gICAgICAgIHNlbmRDYWxsLmFyZ3NbMF0uc2hvdWxkLmhhdmUucHJvcGVydHkoJ3R4SGV4JywgJzB4c2lnbmVkJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBzaWduaW5nIGVycm9ycycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIG1vY2tCYXNlQ29pbi51cmwucmV0dXJucygnL3Rlc3Qvd2FsbGV0L3Rva2VuL2FwcHJvdmFsL2J1aWxkJyk7XG4gICAgICBtb2NrQml0R28ucG9zdC5yZXR1cm5zKHtcbiAgICAgICAgc2VuZDogc2lub24uc3R1YigpLnJldHVybnMoe1xuICAgICAgICAgIHJlc3VsdDogc2lub24uc3R1YigpLnJlc29sdmVzKG1vY2tUb2tlbkFwcHJvdmFsQnVpbGQpLFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBtb2NrS2V5Y2hhaW4gPSB7IGlkOiAndXNlci1rZXknLCBwdWI6ICdwdWIta2V5JywgZW5jcnlwdGVkUHJ2OiAnZW5jcnlwdGVkLXBydicgfTtcbiAgICAgIG1vY2tCYXNlQ29pbi5rZXljaGFpbnMucmV0dXJucyh7XG4gICAgICAgIGdldDogc2lub24uc3R1YigpLnJlc29sdmVzKG1vY2tLZXljaGFpbiksXG4gICAgICB9KTtcblxuICAgICAgc2lub24uc3R1Yih3YWxsZXQgYXMgYW55LCAnZ2V0S2V5Y2hhaW5zQW5kVmFsaWRhdGVQYXNzcGhyYXNlJykucmVzb2x2ZXMoW21vY2tLZXljaGFpbl0pO1xuICAgICAgc2lub24uc3R1Yih3YWxsZXQsICdzaWduVHJhbnNhY3Rpb24nIGFzIGtleW9mIFdhbGxldCkucmVqZWN0cyhuZXcgRXJyb3IoJ3NpZ25pbmcgZXJyb3InKSk7XG5cbiAgICAgIGF3YWl0IHdhbGxldC5idWlsZEVyYzIwVG9rZW5BcHByb3ZhbCgnVVNEQycsICdwYXNzcGhyYXNlMTIzJykuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnc2lnbmluZyBlcnJvcicpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2VuZFRva2VuRW5hYmxlbWVudCcsIGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgdGVXYWxsZXQ6IFdhbGxldDtcbiAgICBsZXQgdGVCYXNlQ29pbjogYW55O1xuICAgIGxldCB0ZUJpdEdvOiBhbnk7XG5cbiAgICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIHRlQml0R28gPSB7XG4gICAgICAgIHBvc3Q6IHNpbm9uLnN0dWIoKSxcbiAgICAgICAgZ2V0OiBzaW5vbi5zdHViKCksXG4gICAgICAgIHNldFJlcXVlc3RUcmFjZXI6IHNpbm9uLnN0dWIoKSxcbiAgICAgIH07XG5cbiAgICAgIHRlQmFzZUNvaW4gPSB7XG4gICAgICAgIGdldEZhbWlseTogc2lub24uc3R1YigpLnJldHVybnMoJ3R4cnAnKSxcbiAgICAgICAgZ2V0RnVsbE5hbWU6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKCdUZXN0bmV0IFhSUCcpLFxuICAgICAgICB1cmw6IHNpbm9uLnN0dWIoKSxcbiAgICAgICAga2V5Y2hhaW5zOiBzaW5vbi5zdHViKCksXG4gICAgICAgIHN1cHBvcnRzVHNzOiBzaW5vbi5zdHViKCkucmV0dXJucyhmYWxzZSksXG4gICAgICAgIGdldE1QQ0FsZ29yaXRobTogc2lub24uc3R1YigpLFxuICAgICAgICBnZXRUb2tlbkVuYWJsZW1lbnRDb25maWc6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKHsgcmVxdWlyZXNUb2tlbkVuYWJsZW1lbnQ6IHRydWUgfSksXG4gICAgICB9O1xuXG4gICAgICAvLyBjdXN0b2RpYWwgd2FsbGV0IHNvIHRoZSBwYXRoIGFmdGVyIHZhbGlkYXRpb24gY2FsbHMgaW5pdGlhdGVUcmFuc2FjdGlvblxuICAgICAgY29uc3Qgd2FsbGV0RGF0YSA9IHtcbiAgICAgICAgaWQ6ICd0ZS13YWxsZXQtaWQnLFxuICAgICAgICBjb2luOiAndHhycCcsXG4gICAgICAgIHR5cGU6ICdjdXN0b2RpYWwnLFxuICAgICAgICBrZXlzOiBbJ3VzZXIta2V5JywgJ2JhY2t1cC1rZXknLCAnYml0Z28ta2V5J10sXG4gICAgICB9O1xuXG4gICAgICB0ZVdhbGxldCA9IG5ldyBXYWxsZXQodGVCaXRHbywgdGVCYXNlQ29pbiwgd2FsbGV0RGF0YSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IFwiSW52YWxpZCBidWlsZCBvZiB0b2tlbiBlbmFibGVtZW50LlwiIHdoZW4gcHJlYnVpbGRUeCBpcyBhIHN0cmluZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IHRlV2FsbGV0XG4gICAgICAgIC5zZW5kVG9rZW5FbmFibGVtZW50KHsgcHJlYnVpbGRUeDogJ3Jhdy1oZXgtc3RyaW5nJyBhcyBhbnkgfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ0ludmFsaWQgYnVpbGQgb2YgdG9rZW4gZW5hYmxlbWVudC4nKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgXCJJbnZhbGlkIGJ1aWxkIG9mIHRva2VuIGVuYWJsZW1lbnQuXCIgd2hlbiBidWlsZFBhcmFtcy50eXBlIGlzIHVuZGVmaW5lZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IHRlV2FsbGV0XG4gICAgICAgIC5zZW5kVG9rZW5FbmFibGVtZW50KHsgcHJlYnVpbGRUeDogeyBidWlsZFBhcmFtczoge30gfSBhcyBhbnkgfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ0ludmFsaWQgYnVpbGQgb2YgdG9rZW4gZW5hYmxlbWVudC4nKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgXCJJbnZhbGlkIGJ1aWxkIG9mIHRva2VuIGVuYWJsZW1lbnQuXCIgd2hlbiBidWlsZFBhcmFtcy50eXBlIGlzIGFuIHVucmVjb2duaXNlZCB0eXBlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgdGVXYWxsZXRcbiAgICAgICAgLnNlbmRUb2tlbkVuYWJsZW1lbnQoeyBwcmVidWlsZFR4OiB7IGJ1aWxkUGFyYW1zOiB7IHR5cGU6ICd0cmFuc2ZlcicgfSB9IGFzIGFueSB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnSW52YWxpZCBidWlsZCBvZiB0b2tlbiBlbmFibGVtZW50LicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwYXNzIHZhbGlkYXRpb24gYW5kIHByb2NlZWQgd2hlbiBidWlsZFBhcmFtcy50eXBlIGlzIFwiZW5hYmxldG9rZW5cIicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGluaXRpYXRlU3R1YiA9IHNpbm9uLnN0dWIodGVXYWxsZXQgYXMgYW55LCAnaW5pdGlhdGVUcmFuc2FjdGlvbicpLnJlc29sdmVzKHsgdHhpZDogJ2FiYzEyMycgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRlV2FsbGV0LnNlbmRUb2tlbkVuYWJsZW1lbnQoe1xuICAgICAgICBwcmVidWlsZFR4OiB7IGJ1aWxkUGFyYW1zOiB7IHR5cGU6ICdlbmFibGV0b2tlbicgfSB9IGFzIGFueSxcbiAgICAgIH0pO1xuXG4gICAgICByZXN1bHQuc2hvdWxkLmVxbCh7IHR4aWQ6ICdhYmMxMjMnIH0pO1xuICAgICAgc2lub24uYXNzZXJ0LmNhbGxlZE9uY2UoaW5pdGlhdGVTdHViKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcGFzcyB2YWxpZGF0aW9uIGFuZCBwcm9jZWVkIHdoZW4gYnVpbGRQYXJhbXMudHlwZSBpcyBcImVuYWJsZU1wdFwiJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgaW5pdGlhdGVTdHViID0gc2lub24uc3R1Yih0ZVdhbGxldCBhcyBhbnksICdpbml0aWF0ZVRyYW5zYWN0aW9uJykucmVzb2x2ZXMoeyB0eGlkOiAnbXB0NDU2JyB9KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGVXYWxsZXQuc2VuZFRva2VuRW5hYmxlbWVudCh7XG4gICAgICAgIHByZWJ1aWxkVHg6IHsgYnVpbGRQYXJhbXM6IHsgdHlwZTogJ2VuYWJsZU1wdCcgfSB9IGFzIGFueSxcbiAgICAgIH0pO1xuXG4gICAgICByZXN1bHQuc2hvdWxkLmVxbCh7IHR4aWQ6ICdtcHQ0NTYnIH0pO1xuICAgICAgc2lub24uYXNzZXJ0LmNhbGxlZE9uY2UoaW5pdGlhdGVTdHViKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgd2hlbiB0aGUgY29pbiBkb2VzIG5vdCByZXF1aXJlIHRva2VuIGVuYWJsZW1lbnQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICB0ZUJhc2VDb2luLmdldFRva2VuRW5hYmxlbWVudENvbmZpZy5yZXR1cm5zKHsgcmVxdWlyZXNUb2tlbkVuYWJsZW1lbnQ6IGZhbHNlIH0pO1xuXG4gICAgICBhd2FpdCB0ZVdhbGxldFxuICAgICAgICAuc2VuZFRva2VuRW5hYmxlbWVudCh7IHByZWJ1aWxkVHg6IHsgYnVpbGRQYXJhbXM6IHsgdHlwZTogJ2VuYWJsZU1wdCcgfSB9IGFzIGFueSB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvZG9lcyBub3QgcmVxdWlyZSB0b2tlbiBlbmFibGVtZW50IHRyYW5zYWN0aW9ucy8pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19