@bitgo/abstract-lightning 7.6.1 → 7.6.3

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.
@@ -39,87 +39,403 @@ Object.defineProperty(exports, "__esModule", { value: true });
39
39
  const src_1 = require("../../../src");
40
40
  const utxolib = __importStar(require("@bitgo/utxo-lib"));
41
41
  const assert_1 = __importDefault(require("assert"));
42
+ const createPsbt_1 = require("./createPsbt");
42
43
  describe('parseWithdrawPsbt', () => {
43
- const unsignedPsbtHex = '70736274ff01007d02000000015e50b8d96cebdc3273d9a100eb68392d980d5b934b8170c80a23488b595268ca0100000000ffffffff02a086010000000000225120379bc88cc15d3605ed9de1b61ff8d65021b650db1151e751a30885ccfcc7d15affa80a000000000016001480a06f2e6b77e817fd5de6e41ea512c563c26cb800000000000100ea02000000000101a158d806735bb7c54e4c701d4f5821cd5342d48d5e1fcbed1169e6e45aa444be0100000000ffffffff02a086010000000000225120379bc88cc15d3605ed9de1b61ff8d65021b650db1151e751a30885ccfcc7d15a6a310c000000000016001478a5d98c7160484b9b00f1782803c58edfc49b9a024730440220407d9162f52371df246dcfa2943d40fbdcb0d4b6768f7682c65193378b2845a60220101c7bc460c93d2976961ac23400f0f10c145efb989a3addb7f03ebaaa2200950121037e17444c85c8b7da07f12fd53cb2ca142c2b4932d0f898649c4b5be0021da0980000000001030401000000220602e57146e5b4762a7ff374adf4072047b67ef115ad46a34189bdeb6a4f88db9b0818000000005400008000000080000000800100000006000000000022020379abbe44004ff7e527bdee3dd8d95e5cd250053f35ee92258b97aa83dfa93c621800000000540000800000008000000080010000005000000000';
44
44
  const network = utxolib.networks.testnet;
45
- const recipients = [
46
- {
47
- amountSat: 100000n,
48
- address: 'tb1px7du3rxpt5mqtmvauxmpl7xk2qsmv5xmz9g7w5drpzzuelx869dqwape7k',
49
- },
50
- ];
51
- const accounts = [
52
- {
53
- xpub: 'tpubDCmiWMkTJrZ24t1Z6ECR3HyynCyZ9zGsWqhcLh6H4yFK2CDozSszD1pP2Li4Nx1YYtRcvmNbdb3nD1SzFejYtPFfTocTv2EaAgJCg4zpJpA',
54
- purpose: 49,
55
- coin_type: 0,
56
- account: 0,
57
- },
58
- {
59
- xpub: 'tpubDCFN7bsxR9UTKggdH2pmv5HeHGQNiDrJwa1EZFtP9sH5PF28i37FHpoYSYARQkKZ6Mi98pkp7oypDcxFmE4dQGq8jV8Gv3L6gmWBeRwPxkP',
60
- purpose: 84,
61
- coin_type: 0,
62
- account: 0,
63
- },
64
- ];
65
- it('should parse a valid withdraw PSBT', () => {
66
- (0, src_1.validatePsbtForWithdraw)(unsignedPsbtHex, network, recipients, accounts);
67
- });
68
- it('should throw for invalid PSBT', () => {
69
- assert_1.default.throws(() => {
70
- (0, src_1.validatePsbtForWithdraw)('asdasd', network, recipients, accounts);
71
- }, /ERR_BUFFER_OUT_OF_BOUNDS/);
72
- });
73
- it('should throw for invalid recipient address', () => {
74
- const differentRecipients = [
45
+ describe('regression tests with hardcoded PSBT', () => {
46
+ // Keeping one regression test with real PSBT data to ensure backward compatibility
47
+ const unsignedPsbtHex = '70736274ff01007d02000000015e50b8d96cebdc3273d9a100eb68392d980d5b934b8170c80a23488b595268ca0100000000ffffffff02a086010000000000225120379bc88cc15d3605ed9de1b61ff8d65021b650db1151e751a30885ccfcc7d15affa80a000000000016001480a06f2e6b77e817fd5de6e41ea512c563c26cb800000000000100ea02000000000101a158d806735bb7c54e4c701d4f5821cd5342d48d5e1fcbed1169e6e45aa444be0100000000ffffffff02a086010000000000225120379bc88cc15d3605ed9de1b61ff8d65021b650db1151e751a30885ccfcc7d15a6a310c000000000016001478a5d98c7160484b9b00f1782803c58edfc49b9a024730440220407d9162f52371df246dcfa2943d40fbdcb0d4b6768f7682c65193378b2845a60220101c7bc460c93d2976961ac23400f0f10c145efb989a3addb7f03ebaaa2200950121037e17444c85c8b7da07f12fd53cb2ca142c2b4932d0f898649c4b5be0021da0980000000001030401000000220602e57146e5b4762a7ff374adf4072047b67ef115ad46a34189bdeb6a4f88db9b0818000000005400008000000080000000800100000006000000000022020379abbe44004ff7e527bdee3dd8d95e5cd250053f35ee92258b97aa83dfa93c621800000000540000800000008000000080010000005000000000';
48
+ const recipients = [
75
49
  {
76
- ...recipients[0],
77
- address: 'tb1qxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyz',
50
+ amountSat: 100000n,
51
+ address: 'tb1px7du3rxpt5mqtmvauxmpl7xk2qsmv5xmz9g7w5drpzzuelx869dqwape7k',
78
52
  },
79
53
  ];
80
- assert_1.default.throws(() => {
81
- (0, src_1.validatePsbtForWithdraw)(unsignedPsbtHex, network, differentRecipients, accounts);
82
- }, /PSBT output tb1px7du3rxpt5mqtmvauxmpl7xk2qsmv5xmz9g7w5drpzzuelx869dqwape7k with value 100000 does not match any recipient/);
83
- });
84
- it('should throw for invalid recipient value', () => {
85
- const differentRecipients = [
54
+ const accounts = [
86
55
  {
87
- ...recipients[0],
88
- amountSat: 99999n,
89
- },
90
- ];
91
- assert_1.default.throws(() => {
92
- (0, src_1.validatePsbtForWithdraw)(unsignedPsbtHex, network, differentRecipients, accounts);
93
- }, /PSBT output tb1px7du3rxpt5mqtmvauxmpl7xk2qsmv5xmz9g7w5drpzzuelx869dqwape7k with value 100000 does not match any recipient/);
94
- });
95
- it('should throw for account not found', () => {
96
- const incompatibleAccounts = [];
97
- assert_1.default.throws(() => {
98
- (0, src_1.validatePsbtForWithdraw)(unsignedPsbtHex, network, recipients, incompatibleAccounts);
99
- }, /Account not found for purpose/);
100
- });
101
- it('should throw for invalid pubkey', () => {
102
- const incompatibleAccounts = [
103
- {
104
- ...accounts[1],
105
56
  xpub: 'tpubDCmiWMkTJrZ24t1Z6ECR3HyynCyZ9zGsWqhcLh6H4yFK2CDozSszD1pP2Li4Nx1YYtRcvmNbdb3nD1SzFejYtPFfTocTv2EaAgJCg4zpJpA',
57
+ purpose: 49,
58
+ coin_type: 0,
59
+ account: 0,
106
60
  },
107
- ];
108
- assert_1.default.throws(() => {
109
- (0, src_1.validatePsbtForWithdraw)(unsignedPsbtHex, network, recipients, incompatibleAccounts);
110
- }, /Derived pubkey does not match for address/);
111
- });
112
- it('should throw for invalid purpose', () => {
113
- const incompatibleAccounts = [
114
61
  {
115
- ...accounts[1],
116
- purpose: 1017,
62
+ xpub: 'tpubDCFN7bsxR9UTKggdH2pmv5HeHGQNiDrJwa1EZFtP9sH5PF28i37FHpoYSYARQkKZ6Mi98pkp7oypDcxFmE4dQGq8jV8Gv3L6gmWBeRwPxkP',
63
+ purpose: 84,
64
+ coin_type: 0,
65
+ account: 0,
117
66
  },
118
67
  ];
119
- const incompatiblePsbt = `70736274ff01007d02000000015e50b8d96cebdc3273d9a100eb68392d980d5b934b8170c80a23488b595268ca0100000000ffffffff02a086010000000000225120379bc88cc15d3605ed9de1b61ff8d65021b650db1151e751a30885ccfcc7d15affa80a000000000016001480a06f2e6b77e817fd5de6e41ea512c563c26cb800000000000100ea02000000000101a158d806735bb7c54e4c701d4f5821cd5342d48d5e1fcbed1169e6e45aa444be0100000000ffffffff02a086010000000000225120379bc88cc15d3605ed9de1b61ff8d65021b650db1151e751a30885ccfcc7d15a6a310c000000000016001478a5d98c7160484b9b00f1782803c58edfc49b9a024730440220407d9162f52371df246dcfa2943d40fbdcb0d4b6768f7682c65193378b2845a60220101c7bc460c93d2976961ac23400f0f10c145efb989a3addb7f03ebaaa2200950121037e17444c85c8b7da07f12fd53cb2ca142c2b4932d0f898649c4b5be0021da0980000000001030401000000220602e57146e5b4762a7ff374adf4072047b67ef115ad46a34189bdeb6a4f88db9b0818000000005400008000000080000000800100000006000000000022020379abbe44004ff7e527bdee3dd8d95e5cd250053f35ee92258b97aa83dfa93c621800000000f90300800000008000000080010000005000000000`;
120
- assert_1.default.throws(() => {
121
- (0, src_1.validatePsbtForWithdraw)(incompatiblePsbt, network, recipients, incompatibleAccounts);
122
- }, /Unsupported purpose/);
68
+ it('should parse a valid withdraw PSBT', () => {
69
+ (0, src_1.validatePsbtForWithdraw)(unsignedPsbtHex, network, recipients, accounts);
70
+ });
71
+ it('should throw for invalid PSBT hex', () => {
72
+ assert_1.default.throws(() => {
73
+ (0, src_1.validatePsbtForWithdraw)('asdasd', network, recipients, accounts);
74
+ }, /ERR_BUFFER_OUT_OF_BOUNDS/);
75
+ });
76
+ });
77
+ describe('test cases with creating psbt on the go', () => {
78
+ it('should validate PSBT with P2WPKH (purpose 84) change address', () => {
79
+ const { psbt, masterKey } = (0, createPsbt_1.createTestPsbt)({
80
+ network,
81
+ inputValue: 500000,
82
+ outputValue: 100000,
83
+ changeValue: 390000,
84
+ changePurpose: 84,
85
+ changeDerivationPath: "m/84'/0'/0'/1/6",
86
+ });
87
+ const recipientAddress = utxolib.address.fromOutputScript(psbt.txOutputs[0].script, network);
88
+ const recipients = [
89
+ {
90
+ amountSat: BigInt(100000),
91
+ address: recipientAddress,
92
+ },
93
+ ];
94
+ const accounts = [
95
+ {
96
+ xpub: masterKey.neutered().toBase58(),
97
+ purpose: 84,
98
+ coin_type: 0,
99
+ account: 0,
100
+ },
101
+ ];
102
+ (0, src_1.validatePsbtForWithdraw)(psbt.toHex(), network, recipients, accounts);
103
+ });
104
+ it('should validate PSBT with P2SH-P2WPKH (purpose 49) change address', () => {
105
+ const { psbt, masterKey } = (0, createPsbt_1.createTestPsbt)({
106
+ network,
107
+ inputValue: 500000,
108
+ outputValue: 100000,
109
+ changeValue: 390000,
110
+ changePurpose: 49,
111
+ changeDerivationPath: "m/49'/0'/0'/1/6",
112
+ });
113
+ const recipientAddress = utxolib.address.fromOutputScript(psbt.txOutputs[0].script, network);
114
+ const recipients = [
115
+ {
116
+ amountSat: BigInt(100000),
117
+ address: recipientAddress,
118
+ },
119
+ ];
120
+ const accounts = [
121
+ {
122
+ xpub: masterKey.neutered().toBase58(),
123
+ purpose: 49,
124
+ coin_type: 0,
125
+ account: 0,
126
+ },
127
+ ];
128
+ (0, src_1.validatePsbtForWithdraw)(psbt.toHex(), network, recipients, accounts);
129
+ });
130
+ it('should validate PSBT with P2TR (purpose 86) change address', () => {
131
+ const { psbt, masterKey } = (0, createPsbt_1.createTestPsbt)({
132
+ network,
133
+ inputValue: 500000,
134
+ outputValue: 100000,
135
+ changeValue: 390000,
136
+ changePurpose: 86,
137
+ changeDerivationPath: "m/86'/0'/0'/1/6",
138
+ });
139
+ const recipientAddress = utxolib.address.fromOutputScript(psbt.txOutputs[0].script, network);
140
+ const recipients = [
141
+ {
142
+ amountSat: BigInt(100000),
143
+ address: recipientAddress,
144
+ },
145
+ ];
146
+ const accounts = [
147
+ {
148
+ xpub: masterKey.neutered().toBase58(),
149
+ purpose: 86,
150
+ coin_type: 0,
151
+ account: 0,
152
+ },
153
+ ];
154
+ (0, src_1.validatePsbtForWithdraw)(psbt.toHex(), network, recipients, accounts);
155
+ });
156
+ it('should throw for missing bip32Derivation path on change output', () => {
157
+ const { psbt, masterKey } = (0, createPsbt_1.createTestPsbt)({
158
+ network,
159
+ inputValue: 500000,
160
+ outputValue: 100000,
161
+ changeValue: 390000,
162
+ changePurpose: 84,
163
+ });
164
+ // Remove the bip32Derivation from the change output
165
+ // This will cause the output to be treated as a regular recipient output, not a change output
166
+ delete psbt.data.outputs[1].bip32Derivation;
167
+ const recipientAddress = utxolib.address.fromOutputScript(psbt.txOutputs[0].script, network);
168
+ const recipients = [
169
+ {
170
+ amountSat: BigInt(100000),
171
+ address: recipientAddress,
172
+ },
173
+ ];
174
+ const accounts = [
175
+ {
176
+ xpub: masterKey.neutered().toBase58(),
177
+ purpose: 84,
178
+ coin_type: 0,
179
+ account: 0,
180
+ },
181
+ ];
182
+ // The output without bip32Derivation is treated as a recipient output,
183
+ // and since it's not in the recipients list, it should fail with "does not match any recipient"
184
+ assert_1.default.throws(() => {
185
+ (0, src_1.validatePsbtForWithdraw)(psbt.toHex(), network, recipients, accounts);
186
+ }, /does not match any recipient/);
187
+ });
188
+ it('should throw for invalid change address (derived address mismatch)', () => {
189
+ const { psbt } = (0, createPsbt_1.createTestPsbt)({
190
+ network,
191
+ inputValue: 500000,
192
+ outputValue: 100000,
193
+ changeValue: 390000,
194
+ changePurpose: 84,
195
+ changeDerivationPath: "m/84'/0'/0'/1/6",
196
+ });
197
+ const recipientAddress = utxolib.address.fromOutputScript(psbt.txOutputs[0].script, network);
198
+ const recipients = [
199
+ {
200
+ amountSat: BigInt(100000),
201
+ address: recipientAddress,
202
+ },
203
+ ];
204
+ // Use a different xpub that won't match the change address
205
+ const differentMasterKey = utxolib.bip32.fromSeed(Buffer.alloc(32, 2), network);
206
+ const accounts = [
207
+ {
208
+ xpub: differentMasterKey.neutered().toBase58(),
209
+ purpose: 84,
210
+ coin_type: 0,
211
+ account: 0,
212
+ },
213
+ ];
214
+ assert_1.default.throws(() => {
215
+ (0, src_1.validatePsbtForWithdraw)(psbt.toHex(), network, recipients, accounts);
216
+ }, /Derived pubkey does not match for address/);
217
+ });
218
+ it('should validate PSBT with upub prefix (P2SH-P2WPKH testnet)', () => {
219
+ const { psbt } = (0, createPsbt_1.createTestPsbt)({
220
+ network,
221
+ inputValue: 500000,
222
+ outputValue: 100000,
223
+ changeValue: 390000,
224
+ changePurpose: 49,
225
+ changeDerivationPath: "m/49'/0'/0'/1/6",
226
+ });
227
+ const recipientAddress = utxolib.address.fromOutputScript(psbt.txOutputs[0].script, network);
228
+ const recipients = [
229
+ {
230
+ amountSat: BigInt(100000),
231
+ address: recipientAddress,
232
+ },
233
+ ];
234
+ // Use upub prefix (testnet P2SH-P2WPKH) instead of standard tpub
235
+ // This tests that revertXpubPrefix correctly converts upub -> tpub
236
+ const accounts = [
237
+ {
238
+ xpub: 'upub5Eep7H5q39PzQZLVEYLBytDyBNeV74E8mQsyeL6UozFq9Y3MsZ52G7YGuqrJPgoyAqF7TBeJdnkrHrVrB5pkWkPJ9cJGAePMU6F1Gyw6aFH',
239
+ purpose: 49,
240
+ coin_type: 0,
241
+ account: 0,
242
+ },
243
+ ];
244
+ // This should work because revertXpubPrefix will convert upub back to tpub
245
+ // However, the master key we used is different, so it should fail with pubkey mismatch
246
+ assert_1.default.throws(() => {
247
+ (0, src_1.validatePsbtForWithdraw)(psbt.toHex(), network, recipients, accounts);
248
+ }, /Derived pubkey does not match for address/);
249
+ });
250
+ it('should validate PSBT with vpub prefix (P2WPKH testnet)', () => {
251
+ const { psbt } = (0, createPsbt_1.createTestPsbt)({
252
+ network,
253
+ inputValue: 500000,
254
+ outputValue: 100000,
255
+ changeValue: 390000,
256
+ changePurpose: 84,
257
+ changeDerivationPath: "m/84'/0'/0'/1/6",
258
+ });
259
+ const recipientAddress = utxolib.address.fromOutputScript(psbt.txOutputs[0].script, network);
260
+ const recipients = [
261
+ {
262
+ amountSat: BigInt(100000),
263
+ address: recipientAddress,
264
+ },
265
+ ];
266
+ // Use vpub prefix (testnet P2WPKH) instead of standard tpub
267
+ // This tests that revertXpubPrefix correctly converts vpub -> tpub
268
+ const accounts = [
269
+ {
270
+ xpub: 'vpub5ZU1PHGpQoDSHckYico4nsvwsD3mTh6UjqL5zyGWXZXzBjTYMNKot7t9eRPQY71hJcnNN9r1ss25g3xA9rmoJ5nWPg8jEWavrttnsVa1qw1',
271
+ purpose: 84,
272
+ coin_type: 0,
273
+ account: 0,
274
+ },
275
+ ];
276
+ // This should work because revertXpubPrefix will convert vpub back to tpub
277
+ // However, the master key we used is different, so it should fail with pubkey mismatch
278
+ assert_1.default.throws(() => {
279
+ (0, src_1.validatePsbtForWithdraw)(psbt.toHex(), network, recipients, accounts);
280
+ }, /Derived pubkey does not match for address/);
281
+ });
282
+ it('should validate PSBT with matching upub prefix and correct key', () => {
283
+ // Import the signer root key from the fixture which corresponds to the upub/vpub accounts
284
+ const signerRootKey = 'tprv8ZgxMBicQKsPe6jS4vDm2n7s42Q6MpvghUQqMmSKG7bTZvGKtjrcU3PGzMNG37yzxywrcdvgkwrr8eYXJmbwdvUNVT4Ucv7ris4jvA7BUmg';
285
+ const masterHDNode = utxolib.bip32.fromBase58(signerRootKey, network);
286
+ // Derive the account key for purpose 49
287
+ const accountKey = masterHDNode.derivePath("m/49'/0'/0'");
288
+ const { psbt } = (0, createPsbt_1.createTestPsbt)({
289
+ network,
290
+ inputValue: 500000,
291
+ outputValue: 100000,
292
+ changeValue: 390000,
293
+ changePurpose: 49,
294
+ changeDerivationPath: "m/49'/0'/0'/1/6",
295
+ masterKey: accountKey,
296
+ });
297
+ const recipientAddress = utxolib.address.fromOutputScript(psbt.txOutputs[0].script, network);
298
+ const recipients = [
299
+ {
300
+ amountSat: BigInt(100000),
301
+ address: recipientAddress,
302
+ },
303
+ ];
304
+ // Use the upub from the fixture - this should work because the keys match
305
+ const accounts = [
306
+ {
307
+ xpub: 'upub5Eep7H5q39PzQZLVEYLBytDyBNeV74E8mQsyeL6UozFq9Y3MsZ52G7YGuqrJPgoyAqF7TBeJdnkrHrVrB5pkWkPJ9cJGAePMU6F1Gyw6aFH',
308
+ purpose: 49,
309
+ coin_type: 0,
310
+ account: 0,
311
+ },
312
+ ];
313
+ // This should pass - revertXpubPrefix converts upub -> tpub, and the key matches
314
+ (0, src_1.validatePsbtForWithdraw)(psbt.toHex(), network, recipients, accounts);
315
+ });
316
+ it('should validate PSBT with matching vpub prefix and correct key', () => {
317
+ // Import the signer root key from the fixture which corresponds to the upub/vpub accounts
318
+ const signerRootKey = 'tprv8ZgxMBicQKsPe6jS4vDm2n7s42Q6MpvghUQqMmSKG7bTZvGKtjrcU3PGzMNG37yzxywrcdvgkwrr8eYXJmbwdvUNVT4Ucv7ris4jvA7BUmg';
319
+ const masterHDNode = utxolib.bip32.fromBase58(signerRootKey, network);
320
+ // Derive the account key for purpose 84
321
+ const accountKey = masterHDNode.derivePath("m/84'/0'/0'");
322
+ const { psbt } = (0, createPsbt_1.createTestPsbt)({
323
+ network,
324
+ inputValue: 500000,
325
+ outputValue: 100000,
326
+ changeValue: 390000,
327
+ changePurpose: 84,
328
+ changeDerivationPath: "m/84'/0'/0'/1/6",
329
+ masterKey: accountKey,
330
+ });
331
+ const recipientAddress = utxolib.address.fromOutputScript(psbt.txOutputs[0].script, network);
332
+ const recipients = [
333
+ {
334
+ amountSat: BigInt(100000),
335
+ address: recipientAddress,
336
+ },
337
+ ];
338
+ // Use the vpub from the fixture - this should work because the keys match
339
+ const accounts = [
340
+ {
341
+ xpub: 'vpub5ZU1PHGpQoDSHckYico4nsvwsD3mTh6UjqL5zyGWXZXzBjTYMNKot7t9eRPQY71hJcnNN9r1ss25g3xA9rmoJ5nWPg8jEWavrttnsVa1qw1',
342
+ purpose: 84,
343
+ coin_type: 0,
344
+ account: 0,
345
+ },
346
+ ];
347
+ // This should pass - revertXpubPrefix converts vpub -> tpub, and the key matches
348
+ (0, src_1.validatePsbtForWithdraw)(psbt.toHex(), network, recipients, accounts);
349
+ });
350
+ it('should validate PSBT with multiple recipients', () => {
351
+ // Create a PSBT manually with 2 recipient outputs and 1 change output
352
+ const masterKey = utxolib.bip32.fromSeed(Buffer.alloc(32, 1), network);
353
+ const inputKeyPair = utxolib.ECPair.makeRandom({ network });
354
+ const p2wpkhInput = utxolib.payments.p2wpkh({
355
+ pubkey: Buffer.from(inputKeyPair.publicKey),
356
+ network,
357
+ });
358
+ const psbt = new utxolib.Psbt({ network });
359
+ // Add input
360
+ psbt.addInput({
361
+ hash: 'ca6852598b48230ac870814b935b0d982d3968eb00a1d97332dceb6cd9b8505e',
362
+ index: 1,
363
+ witnessUtxo: {
364
+ script: p2wpkhInput.output,
365
+ value: BigInt(500000),
366
+ },
367
+ bip32Derivation: [
368
+ {
369
+ masterFingerprint: Buffer.alloc(4, 0),
370
+ path: "m/84'/0'/0'/0/0",
371
+ pubkey: Buffer.from(inputKeyPair.publicKey),
372
+ },
373
+ ],
374
+ });
375
+ // Create first recipient
376
+ const recipient1KeyPair = utxolib.ECPair.makeRandom({ network });
377
+ const recipient1Payment = utxolib.payments.p2wpkh({
378
+ pubkey: Buffer.from(recipient1KeyPair.publicKey),
379
+ network,
380
+ });
381
+ const recipient1Address = recipient1Payment.address;
382
+ // Create second recipient
383
+ const recipient2KeyPair = utxolib.ECPair.makeRandom({ network });
384
+ const recipient2Payment = utxolib.payments.p2wpkh({
385
+ pubkey: Buffer.from(recipient2KeyPair.publicKey),
386
+ network,
387
+ });
388
+ const recipient2Address = recipient2Payment.address;
389
+ // Derive change address from master key
390
+ const changeNode = masterKey.derive(1).derive(6); // m/1/6
391
+ const changePayment = utxolib.payments.p2wpkh({
392
+ pubkey: changeNode.publicKey,
393
+ network,
394
+ });
395
+ const changeAddress = changePayment.address;
396
+ // Add outputs: recipient1, recipient2, change
397
+ psbt.addOutput({
398
+ address: recipient1Address,
399
+ value: BigInt(100000),
400
+ });
401
+ psbt.addOutput({
402
+ address: recipient2Address,
403
+ value: BigInt(50000),
404
+ });
405
+ psbt.addOutput({
406
+ address: changeAddress,
407
+ value: BigInt(340000), // 500000 - 100000 - 50000 - 10000 (fee)
408
+ });
409
+ // Add bip32Derivation to the change output (index 2)
410
+ psbt.updateOutput(2, {
411
+ bip32Derivation: [
412
+ {
413
+ masterFingerprint: Buffer.alloc(4, 0),
414
+ path: "m/84'/0'/0'/1/6",
415
+ pubkey: changeNode.publicKey,
416
+ },
417
+ ],
418
+ });
419
+ const recipients = [
420
+ {
421
+ amountSat: BigInt(100000),
422
+ address: recipient1Address,
423
+ },
424
+ {
425
+ amountSat: BigInt(50000),
426
+ address: recipient2Address,
427
+ },
428
+ ];
429
+ const accounts = [
430
+ {
431
+ xpub: masterKey.neutered().toBase58(),
432
+ purpose: 84,
433
+ coin_type: 0,
434
+ account: 0,
435
+ },
436
+ ];
437
+ (0, src_1.validatePsbtForWithdraw)(psbt.toHex(), network, recipients, accounts);
438
+ });
123
439
  });
124
440
  });
125
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VXaXRoZHJhd1BzYnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvbGlnaHRuaW5nL3BhcnNlV2l0aGRyYXdQc2J0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsc0NBQXVEO0FBQ3ZELHlEQUEyQztBQUMzQyxvREFBNEI7QUFFNUIsUUFBUSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRTtJQUNqQyxNQUFNLGVBQWUsR0FDbkIsNCtCQUE0K0IsQ0FBQztJQUMvK0IsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7SUFDekMsTUFBTSxVQUFVLEdBQUc7UUFDakI7WUFDRSxTQUFTLEVBQUUsT0FBTztZQUNsQixPQUFPLEVBQUUsZ0VBQWdFO1NBQzFFO0tBQ0YsQ0FBQztJQUNGLE1BQU0sUUFBUSxHQUFHO1FBQ2Y7WUFDRSxJQUFJLEVBQUUsaUhBQWlIO1lBQ3ZILE9BQU8sRUFBRSxFQUFFO1lBQ1gsU0FBUyxFQUFFLENBQUM7WUFDWixPQUFPLEVBQUUsQ0FBQztTQUNYO1FBQ0Q7WUFDRSxJQUFJLEVBQUUsaUhBQWlIO1lBQ3ZILE9BQU8sRUFBRSxFQUFFO1lBQ1gsU0FBUyxFQUFFLENBQUM7WUFDWixPQUFPLEVBQUUsQ0FBQztTQUNYO0tBQ0YsQ0FBQztJQUNGLEVBQUUsQ0FBQyxvQ0FBb0MsRUFBRSxHQUFHLEVBQUU7UUFDNUMsSUFBQSw2QkFBdUIsRUFBQyxlQUFlLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUMxRSxDQUFDLENBQUMsQ0FBQztJQUNILEVBQUUsQ0FBQywrQkFBK0IsRUFBRSxHQUFHLEVBQUU7UUFDdkMsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ2pCLElBQUEsNkJBQXVCLEVBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDbkUsQ0FBQyxFQUFFLDBCQUEwQixDQUFDLENBQUM7SUFDakMsQ0FBQyxDQUFDLENBQUM7SUFDSCxFQUFFLENBQUMsNENBQTRDLEVBQUUsR0FBRyxFQUFFO1FBQ3BELE1BQU0sbUJBQW1CLEdBQUc7WUFDMUI7Z0JBQ0UsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDO2dCQUNoQixPQUFPLEVBQUUseURBQXlEO2FBQ25FO1NBQ0YsQ0FBQztRQUNGLGdCQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRTtZQUNqQixJQUFBLDZCQUF1QixFQUFDLGVBQWUsRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDbkYsQ0FBQyxFQUFFLDJIQUEySCxDQUFDLENBQUM7SUFDbEksQ0FBQyxDQUFDLENBQUM7SUFDSCxFQUFFLENBQUMsMENBQTBDLEVBQUUsR0FBRyxFQUFFO1FBQ2xELE1BQU0sbUJBQW1CLEdBQUc7WUFDMUI7Z0JBQ0UsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDO2dCQUNoQixTQUFTLEVBQUUsTUFBTTthQUNsQjtTQUNGLENBQUM7UUFDRixnQkFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDakIsSUFBQSw2QkFBdUIsRUFBQyxlQUFlLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ25GLENBQUMsRUFBRSwySEFBMkgsQ0FBQyxDQUFDO0lBQ2xJLENBQUMsQ0FBQyxDQUFDO0lBQ0gsRUFBRSxDQUFDLG9DQUFvQyxFQUFFLEdBQUcsRUFBRTtRQUM1QyxNQUFNLG9CQUFvQixHQUFHLEVBQUUsQ0FBQztRQUNoQyxnQkFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDakIsSUFBQSw2QkFBdUIsRUFBQyxlQUFlLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO1FBQ3RGLENBQUMsRUFBRSwrQkFBK0IsQ0FBQyxDQUFDO0lBQ3RDLENBQUMsQ0FBQyxDQUFDO0lBQ0gsRUFBRSxDQUFDLGlDQUFpQyxFQUFFLEdBQUcsRUFBRTtRQUN6QyxNQUFNLG9CQUFvQixHQUFHO1lBQzNCO2dCQUNFLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDZCxJQUFJLEVBQUUsaUhBQWlIO2FBQ3hIO1NBQ0YsQ0FBQztRQUNGLGdCQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRTtZQUNqQixJQUFBLDZCQUF1QixFQUFDLGVBQWUsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLG9CQUFvQixDQUFDLENBQUM7UUFDdEYsQ0FBQyxFQUFFLDJDQUEyQyxDQUFDLENBQUM7SUFDbEQsQ0FBQyxDQUFDLENBQUM7SUFDSCxFQUFFLENBQUMsa0NBQWtDLEVBQUUsR0FBRyxFQUFFO1FBQzFDLE1BQU0sb0JBQW9CLEdBQUc7WUFDM0I7Z0JBQ0UsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUNkLE9BQU8sRUFBRSxJQUFJO2FBQ2Q7U0FDRixDQUFDO1FBQ0YsTUFBTSxnQkFBZ0IsR0FBRyw0K0JBQTQrQixDQUFDO1FBQ3RnQyxnQkFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDakIsSUFBQSw2QkFBdUIsRUFBQyxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLG9CQUFvQixDQUFDLENBQUM7UUFDdkYsQ0FBQyxFQUFFLHFCQUFxQixDQUFDLENBQUM7SUFDNUIsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHZhbGlkYXRlUHNidEZvcldpdGhkcmF3IH0gZnJvbSAnLi4vLi4vLi4vc3JjJztcbmltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuZGVzY3JpYmUoJ3BhcnNlV2l0aGRyYXdQc2J0JywgKCkgPT4ge1xuICBjb25zdCB1bnNpZ25lZFBzYnRIZXggPVxuICAgICc3MDczNjI3NGZmMDEwMDdkMDIwMDAwMDAwMTVlNTBiOGQ5NmNlYmRjMzI3M2Q5YTEwMGViNjgzOTJkOTgwZDViOTM0YjgxNzBjODBhMjM0ODhiNTk1MjY4Y2EwMTAwMDAwMDAwZmZmZmZmZmYwMmEwODYwMTAwMDAwMDAwMDAyMjUxMjAzNzliYzg4Y2MxNWQzNjA1ZWQ5ZGUxYjYxZmY4ZDY1MDIxYjY1MGRiMTE1MWU3NTFhMzA4ODVjY2ZjYzdkMTVhZmZhODBhMDAwMDAwMDAwMDE2MDAxNDgwYTA2ZjJlNmI3N2U4MTdmZDVkZTZlNDFlYTUxMmM1NjNjMjZjYjgwMDAwMDAwMDAwMDEwMGVhMDIwMDAwMDAwMDAxMDFhMTU4ZDgwNjczNWJiN2M1NGU0YzcwMWQ0ZjU4MjFjZDUzNDJkNDhkNWUxZmNiZWQxMTY5ZTZlNDVhYTQ0NGJlMDEwMDAwMDAwMGZmZmZmZmZmMDJhMDg2MDEwMDAwMDAwMDAwMjI1MTIwMzc5YmM4OGNjMTVkMzYwNWVkOWRlMWI2MWZmOGQ2NTAyMWI2NTBkYjExNTFlNzUxYTMwODg1Y2NmY2M3ZDE1YTZhMzEwYzAwMDAwMDAwMDAxNjAwMTQ3OGE1ZDk4YzcxNjA0ODRiOWIwMGYxNzgyODAzYzU4ZWRmYzQ5YjlhMDI0NzMwNDQwMjIwNDA3ZDkxNjJmNTIzNzFkZjI0NmRjZmEyOTQzZDQwZmJkY2IwZDRiNjc2OGY3NjgyYzY1MTkzMzc4YjI4NDVhNjAyMjAxMDFjN2JjNDYwYzkzZDI5NzY5NjFhYzIzNDAwZjBmMTBjMTQ1ZWZiOTg5YTNhZGRiN2YwM2ViYWFhMjIwMDk1MDEyMTAzN2UxNzQ0NGM4NWM4YjdkYTA3ZjEyZmQ1M2NiMmNhMTQyYzJiNDkzMmQwZjg5ODY0OWM0YjViZTAwMjFkYTA5ODAwMDAwMDAwMDEwMzA0MDEwMDAwMDAyMjA2MDJlNTcxNDZlNWI0NzYyYTdmZjM3NGFkZjQwNzIwNDdiNjdlZjExNWFkNDZhMzQxODliZGViNmE0Zjg4ZGI5YjA4MTgwMDAwMDAwMDU0MDAwMDgwMDAwMDAwODAwMDAwMDA4MDAxMDAwMDAwMDYwMDAwMDAwMDAwMjIwMjAzNzlhYmJlNDQwMDRmZjdlNTI3YmRlZTNkZDhkOTVlNWNkMjUwMDUzZjM1ZWU5MjI1OGI5N2FhODNkZmE5M2M2MjE4MDAwMDAwMDA1NDAwMDA4MDAwMDAwMDgwMDAwMDAwODAwMTAwMDAwMDUwMDAwMDAwMDAnO1xuICBjb25zdCBuZXR3b3JrID0gdXR4b2xpYi5uZXR3b3Jrcy50ZXN0bmV0O1xuICBjb25zdCByZWNpcGllbnRzID0gW1xuICAgIHtcbiAgICAgIGFtb3VudFNhdDogMTAwMDAwbixcbiAgICAgIGFkZHJlc3M6ICd0YjFweDdkdTNyeHB0NW1xdG12YXV4bXBsN3hrMnFzbXY1eG16OWc3dzVkcnB6enVlbHg4NjlkcXdhcGU3aycsXG4gICAgfSxcbiAgXTtcbiAgY29uc3QgYWNjb3VudHMgPSBbXG4gICAge1xuICAgICAgeHB1YjogJ3RwdWJEQ21pV01rVEpyWjI0dDFaNkVDUjNIeXluQ3laOXpHc1dxaGNMaDZINHlGSzJDRG96U3N6RDFwUDJMaTROeDFZWXRSY3ZtTmJkYjNuRDFTekZlall0UEZmVG9jVHYyRWFBZ0pDZzR6cEpwQScsXG4gICAgICBwdXJwb3NlOiA0OSxcbiAgICAgIGNvaW5fdHlwZTogMCxcbiAgICAgIGFjY291bnQ6IDAsXG4gICAgfSxcbiAgICB7XG4gICAgICB4cHViOiAndHB1YkRDRk43YnN4UjlVVEtnZ2RIMnBtdjVIZUhHUU5pRHJKd2ExRVpGdFA5c0g1UEYyOGkzN0ZIcG9ZU1lBUlFrS1o2TWk5OHBrcDdveXBEY3hGbUU0ZFFHcThqVjhHdjNMNmdtV0JlUndQeGtQJyxcbiAgICAgIHB1cnBvc2U6IDg0LFxuICAgICAgY29pbl90eXBlOiAwLFxuICAgICAgYWNjb3VudDogMCxcbiAgICB9LFxuICBdO1xuICBpdCgnc2hvdWxkIHBhcnNlIGEgdmFsaWQgd2l0aGRyYXcgUFNCVCcsICgpID0+IHtcbiAgICB2YWxpZGF0ZVBzYnRGb3JXaXRoZHJhdyh1bnNpZ25lZFBzYnRIZXgsIG5ldHdvcmssIHJlY2lwaWVudHMsIGFjY291bnRzKTtcbiAgfSk7XG4gIGl0KCdzaG91bGQgdGhyb3cgZm9yIGludmFsaWQgUFNCVCcsICgpID0+IHtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgIHZhbGlkYXRlUHNidEZvcldpdGhkcmF3KCdhc2Rhc2QnLCBuZXR3b3JrLCByZWNpcGllbnRzLCBhY2NvdW50cyk7XG4gICAgfSwgL0VSUl9CVUZGRVJfT1VUX09GX0JPVU5EUy8pO1xuICB9KTtcbiAgaXQoJ3Nob3VsZCB0aHJvdyBmb3IgaW52YWxpZCByZWNpcGllbnQgYWRkcmVzcycsICgpID0+IHtcbiAgICBjb25zdCBkaWZmZXJlbnRSZWNpcGllbnRzID0gW1xuICAgICAge1xuICAgICAgICAuLi5yZWNpcGllbnRzWzBdLFxuICAgICAgICBhZGRyZXNzOiAndGIxcXh5enh5enh5enh5enh5enh5enh5enh5enh5enh5enh5enh5enh5enh5enh5enh5enh5eicsXG4gICAgICB9LFxuICAgIF07XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB7XG4gICAgICB2YWxpZGF0ZVBzYnRGb3JXaXRoZHJhdyh1bnNpZ25lZFBzYnRIZXgsIG5ldHdvcmssIGRpZmZlcmVudFJlY2lwaWVudHMsIGFjY291bnRzKTtcbiAgICB9LCAvUFNCVCBvdXRwdXQgdGIxcHg3ZHUzcnhwdDVtcXRtdmF1eG1wbDd4azJxc212NXhtejlnN3c1ZHJwenp1ZWx4ODY5ZHF3YXBlN2sgd2l0aCB2YWx1ZSAxMDAwMDAgZG9lcyBub3QgbWF0Y2ggYW55IHJlY2lwaWVudC8pO1xuICB9KTtcbiAgaXQoJ3Nob3VsZCB0aHJvdyBmb3IgaW52YWxpZCByZWNpcGllbnQgdmFsdWUnLCAoKSA9PiB7XG4gICAgY29uc3QgZGlmZmVyZW50UmVjaXBpZW50cyA9IFtcbiAgICAgIHtcbiAgICAgICAgLi4ucmVjaXBpZW50c1swXSxcbiAgICAgICAgYW1vdW50U2F0OiA5OTk5OW4sXG4gICAgICB9LFxuICAgIF07XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB7XG4gICAgICB2YWxpZGF0ZVBzYnRGb3JXaXRoZHJhdyh1bnNpZ25lZFBzYnRIZXgsIG5ldHdvcmssIGRpZmZlcmVudFJlY2lwaWVudHMsIGFjY291bnRzKTtcbiAgICB9LCAvUFNCVCBvdXRwdXQgdGIxcHg3ZHUzcnhwdDVtcXRtdmF1eG1wbDd4azJxc212NXhtejlnN3c1ZHJwenp1ZWx4ODY5ZHF3YXBlN2sgd2l0aCB2YWx1ZSAxMDAwMDAgZG9lcyBub3QgbWF0Y2ggYW55IHJlY2lwaWVudC8pO1xuICB9KTtcbiAgaXQoJ3Nob3VsZCB0aHJvdyBmb3IgYWNjb3VudCBub3QgZm91bmQnLCAoKSA9PiB7XG4gICAgY29uc3QgaW5jb21wYXRpYmxlQWNjb3VudHMgPSBbXTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgIHZhbGlkYXRlUHNidEZvcldpdGhkcmF3KHVuc2lnbmVkUHNidEhleCwgbmV0d29yaywgcmVjaXBpZW50cywgaW5jb21wYXRpYmxlQWNjb3VudHMpO1xuICAgIH0sIC9BY2NvdW50IG5vdCBmb3VuZCBmb3IgcHVycG9zZS8pO1xuICB9KTtcbiAgaXQoJ3Nob3VsZCB0aHJvdyBmb3IgaW52YWxpZCBwdWJrZXknLCAoKSA9PiB7XG4gICAgY29uc3QgaW5jb21wYXRpYmxlQWNjb3VudHMgPSBbXG4gICAgICB7XG4gICAgICAgIC4uLmFjY291bnRzWzFdLFxuICAgICAgICB4cHViOiAndHB1YkRDbWlXTWtUSnJaMjR0MVo2RUNSM0h5eW5DeVo5ekdzV3FoY0xoNkg0eUZLMkNEb3pTc3pEMXBQMkxpNE54MVlZdFJjdm1OYmRiM25EMVN6RmVqWXRQRmZUb2NUdjJFYUFnSkNnNHpwSnBBJyxcbiAgICAgIH0sXG4gICAgXTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgIHZhbGlkYXRlUHNidEZvcldpdGhkcmF3KHVuc2lnbmVkUHNidEhleCwgbmV0d29yaywgcmVjaXBpZW50cywgaW5jb21wYXRpYmxlQWNjb3VudHMpO1xuICAgIH0sIC9EZXJpdmVkIHB1YmtleSBkb2VzIG5vdCBtYXRjaCBmb3IgYWRkcmVzcy8pO1xuICB9KTtcbiAgaXQoJ3Nob3VsZCB0aHJvdyBmb3IgaW52YWxpZCBwdXJwb3NlJywgKCkgPT4ge1xuICAgIGNvbnN0IGluY29tcGF0aWJsZUFjY291bnRzID0gW1xuICAgICAge1xuICAgICAgICAuLi5hY2NvdW50c1sxXSxcbiAgICAgICAgcHVycG9zZTogMTAxNyxcbiAgICAgIH0sXG4gICAgXTtcbiAgICBjb25zdCBpbmNvbXBhdGlibGVQc2J0ID0gYDcwNzM2Mjc0ZmYwMTAwN2QwMjAwMDAwMDAxNWU1MGI4ZDk2Y2ViZGMzMjczZDlhMTAwZWI2ODM5MmQ5ODBkNWI5MzRiODE3MGM4MGEyMzQ4OGI1OTUyNjhjYTAxMDAwMDAwMDBmZmZmZmZmZjAyYTA4NjAxMDAwMDAwMDAwMDIyNTEyMDM3OWJjODhjYzE1ZDM2MDVlZDlkZTFiNjFmZjhkNjUwMjFiNjUwZGIxMTUxZTc1MWEzMDg4NWNjZmNjN2QxNWFmZmE4MGEwMDAwMDAwMDAwMTYwMDE0ODBhMDZmMmU2Yjc3ZTgxN2ZkNWRlNmU0MWVhNTEyYzU2M2MyNmNiODAwMDAwMDAwMDAwMTAwZWEwMjAwMDAwMDAwMDEwMWExNThkODA2NzM1YmI3YzU0ZTRjNzAxZDRmNTgyMWNkNTM0MmQ0OGQ1ZTFmY2JlZDExNjllNmU0NWFhNDQ0YmUwMTAwMDAwMDAwZmZmZmZmZmYwMmEwODYwMTAwMDAwMDAwMDAyMjUxMjAzNzliYzg4Y2MxNWQzNjA1ZWQ5ZGUxYjYxZmY4ZDY1MDIxYjY1MGRiMTE1MWU3NTFhMzA4ODVjY2ZjYzdkMTVhNmEzMTBjMDAwMDAwMDAwMDE2MDAxNDc4YTVkOThjNzE2MDQ4NGI5YjAwZjE3ODI4MDNjNThlZGZjNDliOWEwMjQ3MzA0NDAyMjA0MDdkOTE2MmY1MjM3MWRmMjQ2ZGNmYTI5NDNkNDBmYmRjYjBkNGI2NzY4Zjc2ODJjNjUxOTMzNzhiMjg0NWE2MDIyMDEwMWM3YmM0NjBjOTNkMjk3Njk2MWFjMjM0MDBmMGYxMGMxNDVlZmI5ODlhM2FkZGI3ZjAzZWJhYWEyMjAwOTUwMTIxMDM3ZTE3NDQ0Yzg1YzhiN2RhMDdmMTJmZDUzY2IyY2ExNDJjMmI0OTMyZDBmODk4NjQ5YzRiNWJlMDAyMWRhMDk4MDAwMDAwMDAwMTAzMDQwMTAwMDAwMDIyMDYwMmU1NzE0NmU1YjQ3NjJhN2ZmMzc0YWRmNDA3MjA0N2I2N2VmMTE1YWQ0NmEzNDE4OWJkZWI2YTRmODhkYjliMDgxODAwMDAwMDAwNTQwMDAwODAwMDAwMDA4MDAwMDAwMDgwMDEwMDAwMDAwNjAwMDAwMDAwMDAyMjAyMDM3OWFiYmU0NDAwNGZmN2U1MjdiZGVlM2RkOGQ5NWU1Y2QyNTAwNTNmMzVlZTkyMjU4Yjk3YWE4M2RmYTkzYzYyMTgwMDAwMDAwMGY5MDMwMDgwMDAwMDAwODAwMDAwMDA4MDAxMDAwMDAwNTAwMDAwMDAwMGA7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB7XG4gICAgICB2YWxpZGF0ZVBzYnRGb3JXaXRoZHJhdyhpbmNvbXBhdGlibGVQc2J0LCBuZXR3b3JrLCByZWNpcGllbnRzLCBpbmNvbXBhdGlibGVBY2NvdW50cyk7XG4gICAgfSwgL1Vuc3VwcG9ydGVkIHB1cnBvc2UvKTtcbiAgfSk7XG59KTtcbiJdfQ==
441
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VXaXRoZHJhd1BzYnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvbGlnaHRuaW5nL3BhcnNlV2l0aGRyYXdQc2J0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsc0NBQXVEO0FBQ3ZELHlEQUEyQztBQUMzQyxvREFBNEI7QUFDNUIsNkNBQThDO0FBRTlDLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRSxHQUFHLEVBQUU7SUFDakMsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7SUFFekMsUUFBUSxDQUFDLHNDQUFzQyxFQUFFLEdBQUcsRUFBRTtRQUNwRCxtRkFBbUY7UUFDbkYsTUFBTSxlQUFlLEdBQ25CLDQrQkFBNCtCLENBQUM7UUFDLytCLE1BQU0sVUFBVSxHQUFHO1lBQ2pCO2dCQUNFLFNBQVMsRUFBRSxPQUFPO2dCQUNsQixPQUFPLEVBQUUsZ0VBQWdFO2FBQzFFO1NBQ0YsQ0FBQztRQUNGLE1BQU0sUUFBUSxHQUFHO1lBQ2Y7Z0JBQ0UsSUFBSSxFQUFFLGlIQUFpSDtnQkFDdkgsT0FBTyxFQUFFLEVBQUU7Z0JBQ1gsU0FBUyxFQUFFLENBQUM7Z0JBQ1osT0FBTyxFQUFFLENBQUM7YUFDWDtZQUNEO2dCQUNFLElBQUksRUFBRSxpSEFBaUg7Z0JBQ3ZILE9BQU8sRUFBRSxFQUFFO2dCQUNYLFNBQVMsRUFBRSxDQUFDO2dCQUNaLE9BQU8sRUFBRSxDQUFDO2FBQ1g7U0FDRixDQUFDO1FBRUYsRUFBRSxDQUFDLG9DQUFvQyxFQUFFLEdBQUcsRUFBRTtZQUM1QyxJQUFBLDZCQUF1QixFQUFDLGVBQWUsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzFFLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG1DQUFtQyxFQUFFLEdBQUcsRUFBRTtZQUMzQyxnQkFB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O2dCQUNmO29CQUNFLElBQUksRUFBRSxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFO29CQUNyQyxPQUFPLEVBQUUsRUFBRTtvQkFDWCxTQUFTLEVBQUUsQ0FBQztvQkFDWixPQUFPLEVBQUUsQ0FBQztpQkFDWDthQUNGLENBQUM7WUFFRixJQUFBLDZCQUF1QixFQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHZhbGlkYXRlUHNidEZvcldpdGhkcmF3IH0gZnJvbSAnLi4vLi4vLi4vc3JjJztcbmltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IGNyZWF0ZVRlc3RQc2J0IH0gZnJvbSAnLi9jcmVhdGVQc2J0JztcblxuZGVzY3JpYmUoJ3BhcnNlV2l0aGRyYXdQc2J0JywgKCkgPT4ge1xuICBjb25zdCBuZXR3b3JrID0gdXR4b2xpYi5uZXR3b3Jrcy50ZXN0bmV0O1xuXG4gIGRlc2NyaWJlKCdyZWdyZXNzaW9uIHRlc3RzIHdpdGggaGFyZGNvZGVkIFBTQlQnLCAoKSA9PiB7XG4gICAgLy8gS2VlcGluZyBvbmUgcmVncmVzc2lvbiB0ZXN0IHdpdGggcmVhbCBQU0JUIGRhdGEgdG8gZW5zdXJlIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICBjb25zdCB1bnNpZ25lZFBzYnRIZXggPVxuICAgICAgJzcwNzM2Mjc0ZmYwMTAwN2QwMjAwMDAwMDAxNWU1MGI4ZDk2Y2ViZGMzMjczZDlhMTAwZWI2ODM5MmQ5ODBkNWI5MzRiODE3MGM4MGEyMzQ4OGI1OTUyNjhjYTAxMDAwMDAwMDBmZmZmZmZmZjAyYTA4NjAxMDAwMDAwMDAwMDIyNTEyMDM3OWJjODhjYzE1ZDM2MDVlZDlkZTFiNjFmZjhkNjUwMjFiNjUwZGIxMTUxZTc1MWEzMDg4NWNjZmNjN2QxNWFmZmE4MGEwMDAwMDAwMDAwMTYwMDE0ODBhMDZmMmU2Yjc3ZTgxN2ZkNWRlNmU0MWVhNTEyYzU2M2MyNmNiODAwMDAwMDAwMDAwMTAwZWEwMjAwMDAwMDAwMDEwMWExNThkODA2NzM1YmI3YzU0ZTRjNzAxZDRmNTgyMWNkNTM0MmQ0OGQ1ZTFmY2JlZDExNjllNmU0NWFhNDQ0YmUwMTAwMDAwMDAwZmZmZmZmZmYwMmEwODYwMTAwMDAwMDAwMDAyMjUxMjAzNzliYzg4Y2MxNWQzNjA1ZWQ5ZGUxYjYxZmY4ZDY1MDIxYjY1MGRiMTE1MWU3NTFhMzA4ODVjY2ZjYzdkMTVhNmEzMTBjMDAwMDAwMDAwMDE2MDAxNDc4YTVkOThjNzE2MDQ4NGI5YjAwZjE3ODI4MDNjNThlZGZjNDliOWEwMjQ3MzA0NDAyMjA0MDdkOTE2MmY1MjM3MWRmMjQ2ZGNmYTI5NDNkNDBmYmRjYjBkNGI2NzY4Zjc2ODJjNjUxOTMzNzhiMjg0NWE2MDIyMDEwMWM3YmM0NjBjOTNkMjk3Njk2MWFjMjM0MDBmMGYxMGMxNDVlZmI5ODlhM2FkZGI3ZjAzZWJhYWEyMjAwOTUwMTIxMDM3ZTE3NDQ0Yzg1YzhiN2RhMDdmMTJmZDUzY2IyY2ExNDJjMmI0OTMyZDBmODk4NjQ5YzRiNWJlMDAyMWRhMDk4MDAwMDAwMDAwMTAzMDQwMTAwMDAwMDIyMDYwMmU1NzE0NmU1YjQ3NjJhN2ZmMzc0YWRmNDA3MjA0N2I2N2VmMTE1YWQ0NmEzNDE4OWJkZWI2YTRmODhkYjliMDgxODAwMDAwMDAwNTQwMDAwODAwMDAwMDA4MDAwMDAwMDgwMDEwMDAwMDAwNjAwMDAwMDAwMDAyMjAyMDM3OWFiYmU0NDAwNGZmN2U1MjdiZGVlM2RkOGQ5NWU1Y2QyNTAwNTNmMzVlZTkyMjU4Yjk3YWE4M2RmYTkzYzYyMTgwMDAwMDAwMDU0MDAwMDgwMDAwMDAwODAwMDAwMDA4MDAxMDAwMDAwNTAwMDAwMDAwMCc7XG4gICAgY29uc3QgcmVjaXBpZW50cyA9IFtcbiAgICAgIHtcbiAgICAgICAgYW1vdW50U2F0OiAxMDAwMDBuLFxuICAgICAgICBhZGRyZXNzOiAndGIxcHg3ZHUzcnhwdDVtcXRtdmF1eG1wbDd4azJxc212NXhtejlnN3c1ZHJwenp1ZWx4ODY5ZHF3YXBlN2snLFxuICAgICAgfSxcbiAgICBdO1xuICAgIGNvbnN0IGFjY291bnRzID0gW1xuICAgICAge1xuICAgICAgICB4cHViOiAndHB1YkRDbWlXTWtUSnJaMjR0MVo2RUNSM0h5eW5DeVo5ekdzV3FoY0xoNkg0eUZLMkNEb3pTc3pEMXBQMkxpNE54MVlZdFJjdm1OYmRiM25EMVN6RmVqWXRQRmZUb2NUdjJFYUFnSkNnNHpwSnBBJyxcbiAgICAgICAgcHVycG9zZTogNDksXG4gICAgICAgIGNvaW5fdHlwZTogMCxcbiAgICAgICAgYWNjb3VudDogMCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHhwdWI6ICd0cHViRENGTjdic3hSOVVUS2dnZEgycG12NUhlSEdRTmlEckp3YTFFWkZ0UDlzSDVQRjI4aTM3Rkhwb1lTWUFSUWtLWjZNaTk4cGtwN295cERjeEZtRTRkUUdxOGpWOEd2M0w2Z21XQmVSd1B4a1AnLFxuICAgICAgICBwdXJwb3NlOiA4NCxcbiAgICAgICAgY29pbl90eXBlOiAwLFxuICAgICAgICBhY2NvdW50OiAwLFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgaXQoJ3Nob3VsZCBwYXJzZSBhIHZhbGlkIHdpdGhkcmF3IFBTQlQnLCAoKSA9PiB7XG4gICAgICB2YWxpZGF0ZVBzYnRGb3JXaXRoZHJhdyh1bnNpZ25lZFBzYnRIZXgsIG5ldHdvcmssIHJlY2lwaWVudHMsIGFjY291bnRzKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZm9yIGludmFsaWQgUFNCVCBoZXgnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgdmFsaWRhdGVQc2J0Rm9yV2l0aGRyYXcoJ2FzZGFzZCcsIG5ldHdvcmssIHJlY2lwaWVudHMsIGFjY291bnRzKTtcbiAgICAgIH0sIC9FUlJfQlVGRkVSX09VVF9PRl9CT1VORFMvKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3Rlc3QgY2FzZXMgd2l0aCBjcmVhdGluZyBwc2J0IG9uIHRoZSBnbycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIFBTQlQgd2l0aCBQMldQS0ggKHB1cnBvc2UgODQpIGNoYW5nZSBhZGRyZXNzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBwc2J0LCBtYXN0ZXJLZXkgfSA9IGNyZWF0ZVRlc3RQc2J0KHtcbiAgICAgICAgbmV0d29yayxcbiAgICAgICAgaW5wdXRWYWx1ZTogNTAwMDAwLFxuICAgICAgICBvdXRwdXRWYWx1ZTogMTAwMDAwLFxuICAgICAgICBjaGFuZ2VWYWx1ZTogMzkwMDAwLFxuICAgICAgICBjaGFuZ2VQdXJwb3NlOiA4NCxcbiAgICAgICAgY2hhbmdlRGVyaXZhdGlvblBhdGg6IFwibS84NCcvMCcvMCcvMS82XCIsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmVjaXBpZW50QWRkcmVzcyA9IHV0eG9saWIuYWRkcmVzcy5mcm9tT3V0cHV0U2NyaXB0KHBzYnQudHhPdXRwdXRzWzBdLnNjcmlwdCwgbmV0d29yayk7XG5cbiAgICAgIGNvbnN0IHJlY2lwaWVudHMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBhbW91bnRTYXQ6IEJpZ0ludCgxMDAwMDApLFxuICAgICAgICAgIGFkZHJlc3M6IHJlY2lwaWVudEFkZHJlc3MsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICBjb25zdCBhY2NvdW50cyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHhwdWI6IG1hc3RlcktleS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCksXG4gICAgICAgICAgcHVycG9zZTogODQsXG4gICAgICAgICAgY29pbl90eXBlOiAwLFxuICAgICAgICAgIGFjY291bnQ6IDAsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICB2YWxpZGF0ZVBzYnRGb3JXaXRoZHJhdyhwc2J0LnRvSGV4KCksIG5ldHdvcmssIHJlY2lwaWVudHMsIGFjY291bnRzKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgUFNCVCB3aXRoIFAyU0gtUDJXUEtIIChwdXJwb3NlIDQ5KSBjaGFuZ2UgYWRkcmVzcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgcHNidCwgbWFzdGVyS2V5IH0gPSBjcmVhdGVUZXN0UHNidCh7XG4gICAgICAgIG5ldHdvcmssXG4gICAgICAgIGlucHV0VmFsdWU6IDUwMDAwMCxcbiAgICAgICAgb3V0cHV0VmFsdWU6IDEwMDAwMCxcbiAgICAgICAgY2hhbmdlVmFsdWU6IDM5MDAwMCxcbiAgICAgICAgY2hhbmdlUHVycG9zZTogNDksXG4gICAgICAgIGNoYW5nZURlcml2YXRpb25QYXRoOiBcIm0vNDknLzAnLzAnLzEvNlwiLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlY2lwaWVudEFkZHJlc3MgPSB1dHhvbGliLmFkZHJlc3MuZnJvbU91dHB1dFNjcmlwdChwc2J0LnR4T3V0cHV0c1swXS5zY3JpcHQsIG5ldHdvcmspO1xuXG4gICAgICBjb25zdCByZWNpcGllbnRzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgYW1vdW50U2F0OiBCaWdJbnQoMTAwMDAwKSxcbiAgICAgICAgICBhZGRyZXNzOiByZWNpcGllbnRBZGRyZXNzLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgY29uc3QgYWNjb3VudHMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICB4cHViOiBtYXN0ZXJLZXkubmV1dGVyZWQoKS50b0Jhc2U1OCgpLFxuICAgICAgICAgIHB1cnBvc2U6IDQ5LFxuICAgICAgICAgIGNvaW5fdHlwZTogMCxcbiAgICAgICAgICBhY2NvdW50OiAwLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgdmFsaWRhdGVQc2J0Rm9yV2l0aGRyYXcocHNidC50b0hleCgpLCBuZXR3b3JrLCByZWNpcGllbnRzLCBhY2NvdW50cyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIFBTQlQgd2l0aCBQMlRSIChwdXJwb3NlIDg2KSBjaGFuZ2UgYWRkcmVzcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgcHNidCwgbWFzdGVyS2V5IH0gPSBjcmVhdGVUZXN0UHNidCh7XG4gICAgICAgIG5ldHdvcmssXG4gICAgICAgIGlucHV0VmFsdWU6IDUwMDAwMCxcbiAgICAgICAgb3V0cHV0VmFsdWU6IDEwMDAwMCxcbiAgICAgICAgY2hhbmdlVmFsdWU6IDM5MDAwMCxcbiAgICAgICAgY2hhbmdlUHVycG9zZTogODYsXG4gICAgICAgIGNoYW5nZURlcml2YXRpb25QYXRoOiBcIm0vODYnLzAnLzAnLzEvNlwiLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlY2lwaWVudEFkZHJlc3MgPSB1dHhvbGliLmFkZHJlc3MuZnJvbU91dHB1dFNjcmlwdChwc2J0LnR4T3V0cHV0c1swXS5zY3JpcHQsIG5ldHdvcmspO1xuXG4gICAgICBjb25zdCByZWNpcGllbnRzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgYW1vdW50U2F0OiBCaWdJbnQoMTAwMDAwKSxcbiAgICAgICAgICBhZGRyZXNzOiByZWNpcGllbnRBZGRyZXNzLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgY29uc3QgYWNjb3VudHMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICB4cHViOiBtYXN0ZXJLZXkubmV1dGVyZWQoKS50b0Jhc2U1OCgpLFxuICAgICAgICAgIHB1cnBvc2U6IDg2LFxuICAgICAgICAgIGNvaW5fdHlwZTogMCxcbiAgICAgICAgICBhY2NvdW50OiAwLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgdmFsaWRhdGVQc2J0Rm9yV2l0aGRyYXcocHNidC50b0hleCgpLCBuZXR3b3JrLCByZWNpcGllbnRzLCBhY2NvdW50cyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGZvciBtaXNzaW5nIGJpcDMyRGVyaXZhdGlvbiBwYXRoIG9uIGNoYW5nZSBvdXRwdXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IHBzYnQsIG1hc3RlcktleSB9ID0gY3JlYXRlVGVzdFBzYnQoe1xuICAgICAgICBuZXR3b3JrLFxuICAgICAgICBpbnB1dFZhbHVlOiA1MDAwMDAsXG4gICAgICAgIG91dHB1dFZhbHVlOiAxMDAwMDAsXG4gICAgICAgIGNoYW5nZVZhbHVlOiAzOTAwMDAsXG4gICAgICAgIGNoYW5nZVB1cnBvc2U6IDg0LFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFJlbW92ZSB0aGUgYmlwMzJEZXJpdmF0aW9uIGZyb20gdGhlIGNoYW5nZSBvdXRwdXRcbiAgICAgIC8vIFRoaXMgd2lsbCBjYXVzZSB0aGUgb3V0cHV0IHRvIGJlIHRyZWF0ZWQgYXMgYSByZWd1bGFyIHJlY2lwaWVudCBvdXRwdXQsIG5vdCBhIGNoYW5nZSBvdXRwdXRcbiAgICAgIGRlbGV0ZSBwc2J0LmRhdGEub3V0cHV0c1sxXS5iaXAzMkRlcml2YXRpb247XG5cbiAgICAgIGNvbnN0IHJlY2lwaWVudEFkZHJlc3MgPSB1dHhvbGliLmFkZHJlc3MuZnJvbU91dHB1dFNjcmlwdChwc2J0LnR4T3V0cHV0c1swXS5zY3JpcHQsIG5ldHdvcmspO1xuXG4gICAgICBjb25zdCByZWNpcGllbnRzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgYW1vdW50U2F0OiBCaWdJbnQoMTAwMDAwKSxcbiAgICAgICAgICBhZGRyZXNzOiByZWNpcGllbnRBZGRyZXNzLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgY29uc3QgYWNjb3VudHMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICB4cHViOiBtYXN0ZXJLZXkubmV1dGVyZWQoKS50b0Jhc2U1OCgpLFxuICAgICAgICAgIHB1cnBvc2U6IDg0LFxuICAgICAgICAgIGNvaW5fdHlwZTogMCxcbiAgICAgICAgICBhY2NvdW50OiAwLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgLy8gVGhlIG91dHB1dCB3aXRob3V0IGJpcDMyRGVyaXZhdGlvbiBpcyB0cmVhdGVkIGFzIGEgcmVjaXBpZW50IG91dHB1dCxcbiAgICAgIC8vIGFuZCBzaW5jZSBpdCdzIG5vdCBpbiB0aGUgcmVjaXBpZW50cyBsaXN0LCBpdCBzaG91bGQgZmFpbCB3aXRoIFwiZG9lcyBub3QgbWF0Y2ggYW55IHJlY2lwaWVudFwiXG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgdmFsaWRhdGVQc2J0Rm9yV2l0aGRyYXcocHNidC50b0hleCgpLCBuZXR3b3JrLCByZWNpcGllbnRzLCBhY2NvdW50cyk7XG4gICAgICB9LCAvZG9lcyBub3QgbWF0Y2ggYW55IHJlY2lwaWVudC8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBmb3IgaW52YWxpZCBjaGFuZ2UgYWRkcmVzcyAoZGVyaXZlZCBhZGRyZXNzIG1pc21hdGNoKScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgcHNidCB9ID0gY3JlYXRlVGVzdFBzYnQoe1xuICAgICAgICBuZXR3b3JrLFxuICAgICAgICBpbnB1dFZhbHVlOiA1MDAwMDAsXG4gICAgICAgIG91dHB1dFZhbHVlOiAxMDAwMDAsXG4gICAgICAgIGNoYW5nZVZhbHVlOiAzOTAwMDAsXG4gICAgICAgIGNoYW5nZVB1cnBvc2U6IDg0LFxuICAgICAgICBjaGFuZ2VEZXJpdmF0aW9uUGF0aDogXCJtLzg0Jy8wJy8wJy8xLzZcIixcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByZWNpcGllbnRBZGRyZXNzID0gdXR4b2xpYi5hZGRyZXNzLmZyb21PdXRwdXRTY3JpcHQocHNidC50eE91dHB1dHNbMF0uc2NyaXB0LCBuZXR3b3JrKTtcblxuICAgICAgY29uc3QgcmVjaXBpZW50cyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIGFtb3VudFNhdDogQmlnSW50KDEwMDAwMCksXG4gICAgICAgICAgYWRkcmVzczogcmVjaXBpZW50QWRkcmVzcyxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIC8vIFVzZSBhIGRpZmZlcmVudCB4cHViIHRoYXQgd29uJ3QgbWF0Y2ggdGhlIGNoYW5nZSBhZGRyZXNzXG4gICAgICBjb25zdCBkaWZmZXJlbnRNYXN0ZXJLZXkgPSB1dHhvbGliLmJpcDMyLmZyb21TZWVkKEJ1ZmZlci5hbGxvYygzMiwgMiksIG5ldHdvcmspO1xuICAgICAgY29uc3QgYWNjb3VudHMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICB4cHViOiBkaWZmZXJlbnRNYXN0ZXJLZXkubmV1dGVyZWQoKS50b0Jhc2U1OCgpLFxuICAgICAgICAgIHB1cnBvc2U6IDg0LFxuICAgICAgICAgIGNvaW5fdHlwZTogMCxcbiAgICAgICAgICBhY2NvdW50OiAwLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB7XG4gICAgICAgIHZhbGlkYXRlUHNidEZvcldpdGhkcmF3KHBzYnQudG9IZXgoKSwgbmV0d29yaywgcmVjaXBpZW50cywgYWNjb3VudHMpO1xuICAgICAgfSwgL0Rlcml2ZWQgcHVia2V5IGRvZXMgbm90IG1hdGNoIGZvciBhZGRyZXNzLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIFBTQlQgd2l0aCB1cHViIHByZWZpeCAoUDJTSC1QMldQS0ggdGVzdG5ldCknLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IHBzYnQgfSA9IGNyZWF0ZVRlc3RQc2J0KHtcbiAgICAgICAgbmV0d29yayxcbiAgICAgICAgaW5wdXRWYWx1ZTogNTAwMDAwLFxuICAgICAgICBvdXRwdXRWYWx1ZTogMTAwMDAwLFxuICAgICAgICBjaGFuZ2VWYWx1ZTogMzkwMDAwLFxuICAgICAgICBjaGFuZ2VQdXJwb3NlOiA0OSxcbiAgICAgICAgY2hhbmdlRGVyaXZhdGlvblBhdGg6IFwibS80OScvMCcvMCcvMS82XCIsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmVjaXBpZW50QWRkcmVzcyA9IHV0eG9saWIuYWRkcmVzcy5mcm9tT3V0cHV0U2NyaXB0KHBzYnQudHhPdXRwdXRzWzBdLnNjcmlwdCwgbmV0d29yayk7XG5cbiAgICAgIGNvbnN0IHJlY2lwaWVudHMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBhbW91bnRTYXQ6IEJpZ0ludCgxMDAwMDApLFxuICAgICAgICAgIGFkZHJlc3M6IHJlY2lwaWVudEFkZHJlc3MsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICAvLyBVc2UgdXB1YiBwcmVmaXggKHRlc3RuZXQgUDJTSC1QMldQS0gpIGluc3RlYWQgb2Ygc3RhbmRhcmQgdHB1YlxuICAgICAgLy8gVGhpcyB0ZXN0cyB0aGF0IHJldmVydFhwdWJQcmVmaXggY29ycmVjdGx5IGNvbnZlcnRzIHVwdWIgLT4gdHB1YlxuICAgICAgY29uc3QgYWNjb3VudHMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICB4cHViOiAndXB1YjVFZXA3SDVxMzlQelFaTFZFWUxCeXREeUJOZVY3NEU4bVFzeWVMNlVvekZxOVkzTXNaNTJHN1lHdXFySlBnb3lBcUY3VEJlSmRua3JIclZyQjVwa1drUEo5Y0pHQWVQTVU2RjFHeXc2YUZIJyxcbiAgICAgICAgICBwdXJwb3NlOiA0OSxcbiAgICAgICAgICBjb2luX3R5cGU6IDAsXG4gICAgICAgICAgYWNjb3VudDogMCxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIC8vIFRoaXMgc2hvdWxkIHdvcmsgYmVjYXVzZSByZXZlcnRYcHViUHJlZml4IHdpbGwgY29udmVydCB1cHViIGJhY2sgdG8gdHB1YlxuICAgICAgLy8gSG93ZXZlciwgdGhlIG1hc3RlciBrZXkgd2UgdXNlZCBpcyBkaWZmZXJlbnQsIHNvIGl0IHNob3VsZCBmYWlsIHdpdGggcHVia2V5IG1pc21hdGNoXG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgdmFsaWRhdGVQc2J0Rm9yV2l0aGRyYXcocHNidC50b0hleCgpLCBuZXR3b3JrLCByZWNpcGllbnRzLCBhY2NvdW50cyk7XG4gICAgICB9LCAvRGVyaXZlZCBwdWJrZXkgZG9lcyBub3QgbWF0Y2ggZm9yIGFkZHJlc3MvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgUFNCVCB3aXRoIHZwdWIgcHJlZml4IChQMldQS0ggdGVzdG5ldCknLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IHBzYnQgfSA9IGNyZWF0ZVRlc3RQc2J0KHtcbiAgICAgICAgbmV0d29yayxcbiAgICAgICAgaW5wdXRWYWx1ZTogNTAwMDAwLFxuICAgICAgICBvdXRwdXRWYWx1ZTogMTAwMDAwLFxuICAgICAgICBjaGFuZ2VWYWx1ZTogMzkwMDAwLFxuICAgICAgICBjaGFuZ2VQdXJwb3NlOiA4NCxcbiAgICAgICAgY2hhbmdlRGVyaXZhdGlvblBhdGg6IFwibS84NCcvMCcvMCcvMS82XCIsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmVjaXBpZW50QWRkcmVzcyA9IHV0eG9saWIuYWRkcmVzcy5mcm9tT3V0cHV0U2NyaXB0KHBzYnQudHhPdXRwdXRzWzBdLnNjcmlwdCwgbmV0d29yayk7XG5cbiAgICAgIGNvbnN0IHJlY2lwaWVudHMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBhbW91bnRTYXQ6IEJpZ0ludCgxMDAwMDApLFxuICAgICAgICAgIGFkZHJlc3M6IHJlY2lwaWVudEFkZHJlc3MsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICAvLyBVc2UgdnB1YiBwcmVmaXggKHRlc3RuZXQgUDJXUEtIKSBpbnN0ZWFkIG9mIHN0YW5kYXJkIHRwdWJcbiAgICAgIC8vIFRoaXMgdGVzdHMgdGhhdCByZXZlcnRYcHViUHJlZml4IGNvcnJlY3RseSBjb252ZXJ0cyB2cHViIC0+IHRwdWJcbiAgICAgIGNvbnN0IGFjY291bnRzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgeHB1YjogJ3ZwdWI1WlUxUEhHcFFvRFNIY2tZaWNvNG5zdndzRDNtVGg2VWpxTDV6eUdXWFpYekJqVFlNTktvdDd0OWVSUFFZNzFoSmNuTk45cjFzczI1ZzN4QTlybW9KNW5XUGc4akVXYXZydHRuc1ZhMXF3MScsXG4gICAgICAgICAgcHVycG9zZTogODQsXG4gICAgICAgICAgY29pbl90eXBlOiAwLFxuICAgICAgICAgIGFjY291bnQ6IDAsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICAvLyBUaGlzIHNob3VsZCB3b3JrIGJlY2F1c2UgcmV2ZXJ0WHB1YlByZWZpeCB3aWxsIGNvbnZlcnQgdnB1YiBiYWNrIHRvIHRwdWJcbiAgICAgIC8vIEhvd2V2ZXIsIHRoZSBtYXN0ZXIga2V5IHdlIHVzZWQgaXMgZGlmZmVyZW50LCBzbyBpdCBzaG91bGQgZmFpbCB3aXRoIHB1YmtleSBtaXNtYXRjaFxuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB7XG4gICAgICAgIHZhbGlkYXRlUHNidEZvcldpdGhkcmF3KHBzYnQudG9IZXgoKSwgbmV0d29yaywgcmVjaXBpZW50cywgYWNjb3VudHMpO1xuICAgICAgfSwgL0Rlcml2ZWQgcHVia2V5IGRvZXMgbm90IG1hdGNoIGZvciBhZGRyZXNzLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIFBTQlQgd2l0aCBtYXRjaGluZyB1cHViIHByZWZpeCBhbmQgY29ycmVjdCBrZXknLCAoKSA9PiB7XG4gICAgICAvLyBJbXBvcnQgdGhlIHNpZ25lciByb290IGtleSBmcm9tIHRoZSBmaXh0dXJlIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSB1cHViL3ZwdWIgYWNjb3VudHNcbiAgICAgIGNvbnN0IHNpZ25lclJvb3RLZXkgPVxuICAgICAgICAndHBydjhaZ3hNQmljUUtzUGU2alM0dkRtMm43czQyUTZNcHZnaFVRcU1tU0tHN2JUWnZHS3RqcmNVM1BHek1ORzM3eXp4eXdyY2R2Z2t3cnI4ZVlYSm1id2R2VU5WVDRVY3Y3cmlzNGp2QTdCVW1nJztcbiAgICAgIGNvbnN0IG1hc3RlckhETm9kZSA9IHV0eG9saWIuYmlwMzIuZnJvbUJhc2U1OChzaWduZXJSb290S2V5LCBuZXR3b3JrKTtcblxuICAgICAgLy8gRGVyaXZlIHRoZSBhY2NvdW50IGtleSBmb3IgcHVycG9zZSA0OVxuICAgICAgY29uc3QgYWNjb3VudEtleSA9IG1hc3RlckhETm9kZS5kZXJpdmVQYXRoKFwibS80OScvMCcvMCdcIik7XG5cbiAgICAgIGNvbnN0IHsgcHNidCB9ID0gY3JlYXRlVGVzdFBzYnQoe1xuICAgICAgICBuZXR3b3JrLFxuICAgICAgICBpbnB1dFZhbHVlOiA1MDAwMDAsXG4gICAgICAgIG91dHB1dFZhbHVlOiAxMDAwMDAsXG4gICAgICAgIGNoYW5nZVZhbHVlOiAzOTAwMDAsXG4gICAgICAgIGNoYW5nZVB1cnBvc2U6IDQ5LFxuICAgICAgICBjaGFuZ2VEZXJpdmF0aW9uUGF0aDogXCJtLzQ5Jy8wJy8wJy8xLzZcIixcbiAgICAgICAgbWFzdGVyS2V5OiBhY2NvdW50S2V5LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlY2lwaWVudEFkZHJlc3MgPSB1dHhvbGliLmFkZHJlc3MuZnJvbU91dHB1dFNjcmlwdChwc2J0LnR4T3V0cHV0c1swXS5zY3JpcHQsIG5ldHdvcmspO1xuXG4gICAgICBjb25zdCByZWNpcGllbnRzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgYW1vdW50U2F0OiBCaWdJbnQoMTAwMDAwKSxcbiAgICAgICAgICBhZGRyZXNzOiByZWNpcGllbnRBZGRyZXNzLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgLy8gVXNlIHRoZSB1cHViIGZyb20gdGhlIGZpeHR1cmUgLSB0aGlzIHNob3VsZCB3b3JrIGJlY2F1c2UgdGhlIGtleXMgbWF0Y2hcbiAgICAgIGNvbnN0IGFjY291bnRzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgeHB1YjogJ3VwdWI1RWVwN0g1cTM5UHpRWkxWRVlMQnl0RHlCTmVWNzRFOG1Rc3llTDZVb3pGcTlZM01zWjUyRzdZR3VxckpQZ295QXFGN1RCZUpkbmtySHJWckI1cGtXa1BKOWNKR0FlUE1VNkYxR3l3NmFGSCcsXG4gICAgICAgICAgcHVycG9zZTogNDksXG4gICAgICAgICAgY29pbl90eXBlOiAwLFxuICAgICAgICAgIGFjY291bnQ6IDAsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICAvLyBUaGlzIHNob3VsZCBwYXNzIC0gcmV2ZXJ0WHB1YlByZWZpeCBjb252ZXJ0cyB1cHViIC0+IHRwdWIsIGFuZCB0aGUga2V5IG1hdGNoZXNcbiAgICAgIHZhbGlkYXRlUHNidEZvcldpdGhkcmF3KHBzYnQudG9IZXgoKSwgbmV0d29yaywgcmVjaXBpZW50cywgYWNjb3VudHMpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBQU0JUIHdpdGggbWF0Y2hpbmcgdnB1YiBwcmVmaXggYW5kIGNvcnJlY3Qga2V5JywgKCkgPT4ge1xuICAgICAgLy8gSW1wb3J0IHRoZSBzaWduZXIgcm9vdCBrZXkgZnJvbSB0aGUgZml4dHVyZSB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgdXB1Yi92cHViIGFjY291bnRzXG4gICAgICBjb25zdCBzaWduZXJSb290S2V5ID1cbiAgICAgICAgJ3RwcnY4Wmd4TUJpY1FLc1BlNmpTNHZEbTJuN3M0MlE2TXB2Z2hVUXFNbVNLRzdiVFp2R0t0anJjVTNQR3pNTkczN3l6eHl3cmNkdmdrd3JyOGVZWEptYndkdlVOVlQ0VWN2N3JpczRqdkE3QlVtZyc7XG4gICAgICBjb25zdCBtYXN0ZXJIRE5vZGUgPSB1dHhvbGliLmJpcDMyLmZyb21CYXNlNTgoc2lnbmVyUm9vdEtleSwgbmV0d29yayk7XG5cbiAgICAgIC8vIERlcml2ZSB0aGUgYWNjb3VudCBrZXkgZm9yIHB1cnBvc2UgODRcbiAgICAgIGNvbnN0IGFjY291bnRLZXkgPSBtYXN0ZXJIRE5vZGUuZGVyaXZlUGF0aChcIm0vODQnLzAnLzAnXCIpO1xuXG4gICAgICBjb25zdCB7IHBzYnQgfSA9IGNyZWF0ZVRlc3RQc2J0KHtcbiAgICAgICAgbmV0d29yayxcbiAgICAgICAgaW5wdXRWYWx1ZTogNTAwMDAwLFxuICAgICAgICBvdXRwdXRWYWx1ZTogMTAwMDAwLFxuICAgICAgICBjaGFuZ2VWYWx1ZTogMzkwMDAwLFxuICAgICAgICBjaGFuZ2VQdXJwb3NlOiA4NCxcbiAgICAgICAgY2hhbmdlRGVyaXZhdGlvblBhdGg6IFwibS84NCcvMCcvMCcvMS82XCIsXG4gICAgICAgIG1hc3RlcktleTogYWNjb3VudEtleSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByZWNpcGllbnRBZGRyZXNzID0gdXR4b2xpYi5hZGRyZXNzLmZyb21PdXRwdXRTY3JpcHQocHNidC50eE91dHB1dHNbMF0uc2NyaXB0LCBuZXR3b3JrKTtcblxuICAgICAgY29uc3QgcmVjaXBpZW50cyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIGFtb3VudFNhdDogQmlnSW50KDEwMDAwMCksXG4gICAgICAgICAgYWRkcmVzczogcmVjaXBpZW50QWRkcmVzcyxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIC8vIFVzZSB0aGUgdnB1YiBmcm9tIHRoZSBmaXh0dXJlIC0gdGhpcyBzaG91bGQgd29yayBiZWNhdXNlIHRoZSBrZXlzIG1hdGNoXG4gICAgICBjb25zdCBhY2NvdW50cyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHhwdWI6ICd2cHViNVpVMVBIR3BRb0RTSGNrWWljbzRuc3Z3c0QzbVRoNlVqcUw1enlHV1haWHpCalRZTU5Lb3Q3dDllUlBRWTcxaEpjbk5OOXIxc3MyNWczeEE5cm1vSjVuV1BnOGpFV2F2cnR0bnNWYTFxdzEnLFxuICAgICAgICAgIHB1cnBvc2U6IDg0LFxuICAgICAgICAgIGNvaW5fdHlwZTogMCxcbiAgICAgICAgICBhY2NvdW50OiAwLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgLy8gVGhpcyBzaG91bGQgcGFzcyAtIHJldmVydFhwdWJQcmVmaXggY29udmVydHMgdnB1YiAtPiB0cHViLCBhbmQgdGhlIGtleSBtYXRjaGVzXG4gICAgICB2YWxpZGF0ZVBzYnRGb3JXaXRoZHJhdyhwc2J0LnRvSGV4KCksIG5ldHdvcmssIHJlY2lwaWVudHMsIGFjY291bnRzKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgUFNCVCB3aXRoIG11bHRpcGxlIHJlY2lwaWVudHMnLCAoKSA9PiB7XG4gICAgICAvLyBDcmVhdGUgYSBQU0JUIG1hbnVhbGx5IHdpdGggMiByZWNpcGllbnQgb3V0cHV0cyBhbmQgMSBjaGFuZ2Ugb3V0cHV0XG4gICAgICBjb25zdCBtYXN0ZXJLZXkgPSB1dHhvbGliLmJpcDMyLmZyb21TZWVkKEJ1ZmZlci5hbGxvYygzMiwgMSksIG5ldHdvcmspO1xuXG4gICAgICBjb25zdCBpbnB1dEtleVBhaXIgPSB1dHhvbGliLkVDUGFpci5tYWtlUmFuZG9tKHsgbmV0d29yayB9KTtcbiAgICAgIGNvbnN0IHAyd3BraElucHV0ID0gdXR4b2xpYi5wYXltZW50cy5wMndwa2goe1xuICAgICAgICBwdWJrZXk6IEJ1ZmZlci5mcm9tKGlucHV0S2V5UGFpci5wdWJsaWNLZXkpLFxuICAgICAgICBuZXR3b3JrLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHBzYnQgPSBuZXcgdXR4b2xpYi5Qc2J0KHsgbmV0d29yayB9KTtcblxuICAgICAgLy8gQWRkIGlucHV0XG4gICAgICBwc2J0LmFkZElucHV0KHtcbiAgICAgICAgaGFzaDogJ2NhNjg1MjU5OGI0ODIzMGFjODcwODE0YjkzNWIwZDk4MmQzOTY4ZWIwMGExZDk3MzMyZGNlYjZjZDliODUwNWUnLFxuICAgICAgICBpbmRleDogMSxcbiAgICAgICAgd2l0bmVzc1V0eG86IHtcbiAgICAgICAgICBzY3JpcHQ6IHAyd3BraElucHV0Lm91dHB1dCEsXG4gICAgICAgICAgdmFsdWU6IEJpZ0ludCg1MDAwMDApLFxuICAgICAgICB9LFxuICAgICAgICBiaXAzMkRlcml2YXRpb246IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtYXN0ZXJGaW5nZXJwcmludDogQnVmZmVyLmFsbG9jKDQsIDApLFxuICAgICAgICAgICAgcGF0aDogXCJtLzg0Jy8wJy8wJy8wLzBcIixcbiAgICAgICAgICAgIHB1YmtleTogQnVmZmVyLmZyb20oaW5wdXRLZXlQYWlyLnB1YmxpY0tleSksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBDcmVhdGUgZmlyc3QgcmVjaXBpZW50XG4gICAgICBjb25zdCByZWNpcGllbnQxS2V5UGFpciA9IHV0eG9saWIuRUNQYWlyLm1ha2VSYW5kb20oeyBuZXR3b3JrIH0pO1xuICAgICAgY29uc3QgcmVjaXBpZW50MVBheW1lbnQgPSB1dHhvbGliLnBheW1lbnRzLnAyd3BraCh7XG4gICAgICAgIHB1YmtleTogQnVmZmVyLmZyb20ocmVjaXBpZW50MUtleVBhaXIucHVibGljS2V5KSxcbiAgICAgICAgbmV0d29yayxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmVjaXBpZW50MUFkZHJlc3MgPSByZWNpcGllbnQxUGF5bWVudC5hZGRyZXNzITtcblxuICAgICAgLy8gQ3JlYXRlIHNlY29uZCByZWNpcGllbnRcbiAgICAgIGNvbnN0IHJlY2lwaWVudDJLZXlQYWlyID0gdXR4b2xpYi5FQ1BhaXIubWFrZVJhbmRvbSh7IG5ldHdvcmsgfSk7XG4gICAgICBjb25zdCByZWNpcGllbnQyUGF5bWVudCA9IHV0eG9saWIucGF5bWVudHMucDJ3cGtoKHtcbiAgICAgICAgcHVia2V5OiBCdWZmZXIuZnJvbShyZWNpcGllbnQyS2V5UGFpci5wdWJsaWNLZXkpLFxuICAgICAgICBuZXR3b3JrLFxuICAgICAgfSk7XG4gICAgICBjb25zdCByZWNpcGllbnQyQWRkcmVzcyA9IHJlY2lwaWVudDJQYXltZW50LmFkZHJlc3MhO1xuXG4gICAgICAvLyBEZXJpdmUgY2hhbmdlIGFkZHJlc3MgZnJvbSBtYXN0ZXIga2V5XG4gICAgICBjb25zdCBjaGFuZ2VOb2RlID0gbWFzdGVyS2V5LmRlcml2ZSgxKS5kZXJpdmUoNik7IC8vIG0vMS82XG4gICAgICBjb25zdCBjaGFuZ2VQYXltZW50ID0gdXR4b2xpYi5wYXltZW50cy5wMndwa2goe1xuICAgICAgICBwdWJrZXk6IGNoYW5nZU5vZGUucHVibGljS2V5LFxuICAgICAgICBuZXR3b3JrLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBjaGFuZ2VBZGRyZXNzID0gY2hhbmdlUGF5bWVudC5hZGRyZXNzITtcblxuICAgICAgLy8gQWRkIG91dHB1dHM6IHJlY2lwaWVudDEsIHJlY2lwaWVudDIsIGNoYW5nZVxuICAgICAgcHNidC5hZGRPdXRwdXQoe1xuICAgICAgICBhZGRyZXNzOiByZWNpcGllbnQxQWRkcmVzcyxcbiAgICAgICAgdmFsdWU6IEJpZ0ludCgxMDAwMDApLFxuICAgICAgfSk7XG5cbiAgICAgIHBzYnQuYWRkT3V0cHV0KHtcbiAgICAgICAgYWRkcmVzczogcmVjaXBpZW50MkFkZHJlc3MsXG4gICAgICAgIHZhbHVlOiBCaWdJbnQoNTAwMDApLFxuICAgICAgfSk7XG5cbiAgICAgIHBzYnQuYWRkT3V0cHV0KHtcbiAgICAgICAgYWRkcmVzczogY2hhbmdlQWRkcmVzcyxcbiAgICAgICAgdmFsdWU6IEJpZ0ludCgzNDAwMDApLCAvLyA1MDAwMDAgLSAxMDAwMDAgLSA1MDAwMCAtIDEwMDAwIChmZWUpXG4gICAgICB9KTtcblxuICAgICAgLy8gQWRkIGJpcDMyRGVyaXZhdGlvbiB0byB0aGUgY2hhbmdlIG91dHB1dCAoaW5kZXggMilcbiAgICAgIHBzYnQudXBkYXRlT3V0cHV0KDIsIHtcbiAgICAgICAgYmlwMzJEZXJpdmF0aW9uOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbWFzdGVyRmluZ2VycHJpbnQ6IEJ1ZmZlci5hbGxvYyg0LCAwKSxcbiAgICAgICAgICAgIHBhdGg6IFwibS84NCcvMCcvMCcvMS82XCIsXG4gICAgICAgICAgICBwdWJrZXk6IGNoYW5nZU5vZGUucHVibGljS2V5LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmVjaXBpZW50cyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIGFtb3VudFNhdDogQmlnSW50KDEwMDAwMCksXG4gICAgICAgICAgYWRkcmVzczogcmVjaXBpZW50MUFkZHJlc3MsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBhbW91bnRTYXQ6IEJpZ0ludCg1MDAwMCksXG4gICAgICAgICAgYWRkcmVzczogcmVjaXBpZW50MkFkZHJlc3MsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICBjb25zdCBhY2NvdW50cyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHhwdWI6IG1hc3RlcktleS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCksXG4gICAgICAgICAgcHVycG9zZTogODQsXG4gICAgICAgICAgY29pbl90eXBlOiAwLFxuICAgICAgICAgIGFjY291bnQ6IDAsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICB2YWxpZGF0ZVBzYnRGb3JXaXRoZHJhdyhwc2J0LnRvSGV4KCksIG5ldHdvcmssIHJlY2lwaWVudHMsIGFjY291bnRzKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==