@bitgo/sdk-core 37.10.0 → 37.11.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 (34) hide show
  1. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +1 -0
  2. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -1
  3. package/dist/src/bitgo/baseCoin/iBaseCoin.js +1 -1
  4. package/dist/src/bitgo/environments.js +2 -2
  5. package/dist/src/bitgo/internal/keycard.d.ts.map +1 -1
  6. package/dist/src/bitgo/internal/keycard.js +4 -5
  7. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +9 -0
  8. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -1
  9. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +59 -1
  10. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts +9 -0
  11. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts.map +1 -1
  12. package/dist/src/bitgo/utils/tss/eddsa/eddsa.js +53 -1
  13. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +1 -1
  14. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -1
  15. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.js +7 -7
  16. package/dist/src/bitgo/wallet/iWallets.d.ts +96 -2
  17. package/dist/src/bitgo/wallet/iWallets.d.ts.map +1 -1
  18. package/dist/src/bitgo/wallet/iWallets.js +1 -1
  19. package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
  20. package/dist/src/bitgo/wallet/wallet.js +4 -3
  21. package/dist/src/bitgo/wallet/wallets.d.ts +5 -0
  22. package/dist/src/bitgo/wallet/wallets.d.ts.map +1 -1
  23. package/dist/src/bitgo/wallet/wallets.js +100 -4
  24. package/dist/src/index.d.ts +1 -0
  25. package/dist/src/index.d.ts.map +1 -1
  26. package/dist/src/index.js +1 -1
  27. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +120 -1
  28. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaExternalSigner.d.ts +2 -0
  29. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaExternalSigner.d.ts.map +1 -0
  30. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaExternalSigner.js +158 -0
  31. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.js +22 -22
  32. package/dist/test/unit/bitgo/wallet/walletsExternalSigner.js +364 -14
  33. package/dist/tsconfig.tsbuildinfo +1 -1
  34. package/package.json +4 -4
@@ -37,6 +37,8 @@ const assert = __importStar(require("assert"));
37
37
  const sinon = __importStar(require("sinon"));
38
38
  require("should");
39
39
  const wallets_1 = require("../../../../src/bitgo/wallet/wallets");
40
+ const utils_1 = require("../../../../src/bitgo/utils");
41
+ const statics_1 = require("@bitgo/statics");
40
42
  const wallet_1 = require("../../../../src/bitgo/wallet/wallet");
41
43
  describe('Wallets - external signer onchain wallet generation', function () {
42
44
  let wallets;
@@ -61,11 +63,9 @@ describe('Wallets - external signer onchain wallet generation', function () {
61
63
  source: 'backup',
62
64
  });
63
65
  mockKeychains = {
64
- add: sinon.stub().callsFake(async (params) => ({
65
- id: `${params.source}-key-id`,
66
- pub: params.pub,
67
- source: params.source,
68
- })),
66
+ add: sinon
67
+ .stub()
68
+ .callsFake((params) => Promise.resolve({ id: `${params?.source ?? ''}-key-id`, pub: params?.pub, source: params?.source })),
69
69
  createBitGo: sinon.stub().resolves({ id: 'bitgo-key-id', pub: bitgoPub }),
70
70
  };
71
71
  const mockWalletData = { id: 'wallet-id', keys: ['user-key-id', 'backup-key-id', 'bitgo-key-id'] };
@@ -79,13 +79,14 @@ describe('Wallets - external signer onchain wallet generation', function () {
79
79
  mockBaseCoin = {
80
80
  isEVM: sinon.stub().returns(false),
81
81
  supportsTss: sinon.stub().returns(true),
82
+ getMPCAlgorithm: sinon.stub().returns('ecdsa'),
82
83
  getFamily: sinon.stub().returns('btc'),
83
84
  getChain: sinon.stub().returns('tbtc'),
84
85
  getDefaultMultisigType: sinon.stub().returns('onchain'),
85
86
  keychains: sinon.stub().returns(mockKeychains),
86
87
  url: sinon.stub().returns('/api/v2/tbtc/wallet/add'),
87
88
  getConfig: sinon.stub().returns({ features: [] }),
88
- supplementGenerateWallet: sinon.stub().callsFake((walletParams) => Promise.resolve(walletParams)),
89
+ supplementGenerateWallet: sinon.stub().callsFake((params) => Promise.resolve(params)),
89
90
  isValidPub: sinon.stub().returns(true),
90
91
  };
91
92
  wallets = new wallets_1.Wallets(mockBitGo, mockBaseCoin);
@@ -159,14 +160,40 @@ describe('Wallets - external signer onchain wallet generation', function () {
159
160
  })
160
161
  .should.be.rejectedWith("Failed to create user keychain: createKeychainCallback returned invalid type tss, expected 'independent' for onchain multisig");
161
162
  });
162
- it('should reject TSS multisig type', async function () {
163
+ it('should reject TSS multisig type without TSS callbacks', async function () {
163
164
  await wallets
164
165
  .generateWalletWithExternalSigner({
165
166
  label: 'TSS Wallet',
166
167
  multisigType: 'tss',
168
+ enterprise: 'enterprise-id',
169
+ createKeychainCallback,
170
+ })
171
+ .should.be.rejectedWith('ecdsaMPCv2Callbacks is required for ECDSA TSS wallet generation with external signer');
172
+ });
173
+ it('should route to onchain when createKeychainCallback is provided on a TSS-default coin', async function () {
174
+ mockBaseCoin.getDefaultMultisigType.returns('tss');
175
+ await wallets.generateWalletWithExternalSigner({
176
+ label: 'Onchain on TSS coin',
177
+ enterprise: 'enterprise-id',
178
+ createKeychainCallback,
179
+ });
180
+ assert.strictEqual(createKeychainCallback.callCount, 2);
181
+ assert.strictEqual(mockKeychains.createBitGo.calledOnce, true);
182
+ });
183
+ it('should reject when both createKeychainCallback and MPC callbacks are provided', async function () {
184
+ await wallets
185
+ .generateWalletWithExternalSigner({
186
+ label: 'Ambiguous Wallet',
187
+ enterprise: 'enterprise-id',
167
188
  createKeychainCallback,
189
+ ecdsaMPCv2Callbacks: {
190
+ initializeCallback: sinon.stub(),
191
+ round2Callback: sinon.stub(),
192
+ round3Callback: sinon.stub(),
193
+ finalizeCallback: sinon.stub(),
194
+ },
168
195
  })
169
- .should.be.rejectedWith('external signer wallet generation is only supported for onchain multisig wallets');
196
+ .should.be.rejectedWith('createKeychainCallback cannot be used together with MPC TSS key generation callbacks');
170
197
  });
171
198
  it('should reject custodial wallet type', async function () {
172
199
  await wallets
@@ -217,7 +244,6 @@ describe('Wallets - external signer onchain wallet generation', function () {
217
244
  .should.be.rejectedWith('distributed custody wallets must be type: cold');
218
245
  });
219
246
  it('should reject when callback returns invalid pub for coin', async function () {
220
- // only invalidate user pub so the rejection source is deterministic
221
247
  mockBaseCoin.isValidPub.callsFake((pub) => pub !== userPub);
222
248
  await wallets
223
249
  .generateWalletWithExternalSigner({
@@ -257,10 +283,7 @@ describe('Wallets - external signer onchain wallet generation', function () {
257
283
  .should.be.rejectedWith('Failed to create user keychain: plain string rejection');
258
284
  });
259
285
  it('should forward keySignatures to wallet params when provided', async function () {
260
- const keySignatures = {
261
- backup: 'deadbeef01',
262
- bitgo: 'deadbeef02',
263
- };
286
+ const keySignatures = { backup: 'deadbeef01', bitgo: 'deadbeef02' };
264
287
  await wallets.generateWalletWithExternalSigner({
265
288
  label: 'External Signer Wallet',
266
289
  enterprise: 'enterprise-id',
@@ -281,6 +304,333 @@ describe('Wallets - external signer onchain wallet generation', function () {
281
304
  walletBody.should.not.have.property('keySignatures');
282
305
  });
283
306
  });
307
+ describe('generateWalletWithExternalSigner - ECDSA MPCv2 TSS', function () {
308
+ let ecdsaCallbacks;
309
+ let ecdsaMockBaseCoin;
310
+ let ecdsaWallets;
311
+ const commonKeychain = 'abc123commonkeychain';
312
+ beforeEach(function () {
313
+ const mpcState = { encryptedData: 'data', encryptedDataKey: 'data-key' };
314
+ ecdsaCallbacks = {
315
+ initializeCallback: sinon.stub().resolves({
316
+ userGpgPublicKey: 'user-gpg-pub',
317
+ backupGpgPublicKey: 'backup-gpg-pub',
318
+ round1Messages: { broadcastMessages: [], p2pMessages: [] },
319
+ userState: mpcState,
320
+ backupState: mpcState,
321
+ }),
322
+ round2Callback: sinon.stub().resolves({
323
+ round2Messages: { broadcastMessages: [], p2pMessages: [] },
324
+ userState: mpcState,
325
+ backupState: mpcState,
326
+ }),
327
+ round3Callback: sinon.stub().resolves({
328
+ round3Messages: { broadcastMessages: [], p2pMessages: [] },
329
+ userState: mpcState,
330
+ backupState: mpcState,
331
+ }),
332
+ finalizeCallback: sinon.stub().resolves({ commonKeychain }),
333
+ };
334
+ const mockEcdsaBitGo = {
335
+ post: sinon.stub().returns({
336
+ send: sinon.stub().returns({ result: sinon.stub().resolves({ id: 'tss-wallet-id' }) }),
337
+ }),
338
+ get: sinon.stub().returns({ result: sinon.stub().resolves({ coinSettings: {} }) }),
339
+ setRequestTracer: sinon.stub(),
340
+ microservicesUrl: sinon.stub().returns('/api/v2/tss/settings'),
341
+ };
342
+ ecdsaMockBaseCoin = {
343
+ isEVM: sinon.stub().returns(false),
344
+ supportsTss: sinon.stub().returns(true),
345
+ getMPCAlgorithm: sinon.stub().returns('ecdsa'),
346
+ getFamily: sinon.stub().returns('eth'),
347
+ getChain: sinon.stub().returns('teth'),
348
+ getDefaultMultisigType: sinon.stub().returns('tss'),
349
+ keychains: sinon.stub().returns({ add: sinon.stub() }),
350
+ url: sinon.stub().returns('/api/v2/teth/wallet/add'),
351
+ getConfig: sinon.stub().returns({ features: [] }),
352
+ supplementGenerateWallet: sinon.stub().callsFake((params) => Promise.resolve(params)),
353
+ };
354
+ ecdsaWallets = new wallets_1.Wallets(mockEcdsaBitGo, ecdsaMockBaseCoin);
355
+ sinon.stub(ecdsaWallets, 'generateMpcWalletWithExternalSigner').resolves({
356
+ responseType: 'WalletWithKeychains',
357
+ wallet: sinon.createStubInstance(wallet_1.Wallet),
358
+ userKeychain: { id: 'user-key-id', commonKeychain, type: 'tss' },
359
+ backupKeychain: { id: 'backup-key-id', commonKeychain, type: 'tss' },
360
+ bitgoKeychain: { id: 'bitgo-key-id', commonKeychain, type: 'tss' },
361
+ });
362
+ });
363
+ it('should route to generateMpcWalletWithExternalSigner for tss multisig type', async function () {
364
+ const result = await ecdsaWallets.generateWalletWithExternalSigner({
365
+ label: 'ECDSA TSS Wallet',
366
+ multisigType: 'tss',
367
+ enterprise: 'enterprise-id',
368
+ ecdsaMPCv2Callbacks: ecdsaCallbacks,
369
+ });
370
+ result.responseType.should.equal('WalletWithKeychains');
371
+ assert.strictEqual(ecdsaWallets.generateMpcWalletWithExternalSigner.calledOnce, true);
372
+ });
373
+ it('should reject without enterprise', async function () {
374
+ sinon.restore();
375
+ ecdsaMockBaseCoin.getMPCAlgorithm = sinon.stub().returns('ecdsa');
376
+ await ecdsaWallets
377
+ .generateWalletWithExternalSigner({
378
+ label: 'ECDSA TSS Wallet',
379
+ multisigType: 'tss',
380
+ ecdsaMPCv2Callbacks: ecdsaCallbacks,
381
+ })
382
+ .should.be.rejectedWith('enterprise is required for TSS wallet generation with external signer');
383
+ });
384
+ it('should reject without ecdsaMPCv2Callbacks for ecdsa coin', async function () {
385
+ sinon.restore();
386
+ ecdsaMockBaseCoin.getMPCAlgorithm = sinon.stub().returns('ecdsa');
387
+ await ecdsaWallets
388
+ .generateWalletWithExternalSigner({
389
+ label: 'ECDSA TSS Wallet',
390
+ multisigType: 'tss',
391
+ enterprise: 'enterprise-id',
392
+ })
393
+ .should.be.rejectedWith('ecdsaMPCv2Callbacks is required for ECDSA TSS wallet generation with external signer');
394
+ });
395
+ it('should reject when coin does not support TSS', async function () {
396
+ sinon.restore();
397
+ ecdsaMockBaseCoin.supportsTss = sinon.stub().returns(false);
398
+ ecdsaMockBaseCoin.getFamily = sinon.stub().returns('btc');
399
+ await ecdsaWallets
400
+ .generateWalletWithExternalSigner({
401
+ label: 'ECDSA TSS Wallet',
402
+ multisigType: 'tss',
403
+ enterprise: 'enterprise-id',
404
+ ecdsaMPCv2Callbacks: ecdsaCallbacks,
405
+ })
406
+ .should.be.rejectedWith('coin btc does not support TSS at this time');
407
+ });
408
+ it('should reject EVM coin with invalid walletVersion', async function () {
409
+ sinon.restore();
410
+ ecdsaMockBaseCoin.isEVM = sinon.stub().returns(true);
411
+ ecdsaMockBaseCoin.getMPCAlgorithm = sinon.stub().returns('ecdsa');
412
+ await ecdsaWallets
413
+ .generateWalletWithExternalSigner({
414
+ label: 'ECDSA TSS Wallet',
415
+ multisigType: 'tss',
416
+ enterprise: 'enterprise-id',
417
+ walletVersion: 4,
418
+ ecdsaMPCv2Callbacks: ecdsaCallbacks,
419
+ })
420
+ .should.be.rejectedWith('EVM TSS wallets are only supported for wallet version 5 and 6');
421
+ });
422
+ it('should reject custodial TSS wallet', async function () {
423
+ sinon.restore();
424
+ ecdsaMockBaseCoin.getMPCAlgorithm = sinon.stub().returns('ecdsa');
425
+ await ecdsaWallets
426
+ .generateWalletWithExternalSigner({
427
+ label: 'Custodial TSS Wallet',
428
+ multisigType: 'tss',
429
+ enterprise: 'enterprise-id',
430
+ type: 'custodial',
431
+ ecdsaMPCv2Callbacks: ecdsaCallbacks,
432
+ })
433
+ .should.be.rejectedWith('custodial TSS wallets are not supported for external signer wallet generation');
434
+ });
435
+ it('should reject passphrase on TSS path', async function () {
436
+ sinon.restore();
437
+ ecdsaMockBaseCoin.getMPCAlgorithm = sinon.stub().returns('ecdsa');
438
+ await ecdsaWallets
439
+ .generateWalletWithExternalSigner({
440
+ label: 'TSS Wallet',
441
+ multisigType: 'tss',
442
+ enterprise: 'enterprise-id',
443
+ ecdsaMPCv2Callbacks: ecdsaCallbacks,
444
+ passphrase: 'secret',
445
+ })
446
+ .should.be.rejectedWith('passphrase cannot be used with TSS external signer wallet generation');
447
+ });
448
+ it('should reject ECDSA MPCv1 wallet version 3', async function () {
449
+ sinon.restore();
450
+ ecdsaMockBaseCoin.getMPCAlgorithm = sinon.stub().returns('ecdsa');
451
+ await ecdsaWallets
452
+ .generateWalletWithExternalSigner({
453
+ label: 'MPCv1 Wallet',
454
+ multisigType: 'tss',
455
+ enterprise: 'enterprise-id',
456
+ walletVersion: 3,
457
+ ecdsaMPCv2Callbacks: ecdsaCallbacks,
458
+ })
459
+ .should.be.rejectedWith('ECDSA MPCv1 (wallet version 3) is not supported for external signer wallet generation');
460
+ });
461
+ describe('wallet/add integration (unstubbed generateMpcWalletWithExternalSigner)', function () {
462
+ let send;
463
+ let integrationCallbacks;
464
+ // Builds a fresh Wallets instance with only createKeychainsWithExternalSigner stubbed,
465
+ // so the routing/version/wallet-add logic in generateMpcWalletWithExternalSigner actually runs.
466
+ function createIntegrationWallets(coinOverrides = {}, bitgoOverrides = {}) {
467
+ sinon.restore();
468
+ const mpcState = { encryptedData: 'data', encryptedDataKey: 'data-key' };
469
+ integrationCallbacks = {
470
+ initializeCallback: sinon.stub().resolves({
471
+ userGpgPublicKey: 'user-gpg-pub',
472
+ backupGpgPublicKey: 'backup-gpg-pub',
473
+ round1Messages: { broadcastMessages: [], p2pMessages: [] },
474
+ userState: mpcState,
475
+ backupState: mpcState,
476
+ }),
477
+ round2Callback: sinon.stub().resolves({
478
+ round2Messages: { broadcastMessages: [], p2pMessages: [] },
479
+ userState: mpcState,
480
+ backupState: mpcState,
481
+ }),
482
+ round3Callback: sinon.stub().resolves({
483
+ round3Messages: { broadcastMessages: [], p2pMessages: [] },
484
+ userState: mpcState,
485
+ backupState: mpcState,
486
+ }),
487
+ finalizeCallback: sinon.stub().resolves({ commonKeychain }),
488
+ };
489
+ send = sinon.stub().returns({ result: sinon.stub().resolves({ id: 'tss-wallet-id' }) });
490
+ const integrationBitGo = {
491
+ post: sinon.stub().returns({ send }),
492
+ get: sinon.stub().returns({ result: sinon.stub().resolves({ coinSettings: {} }) }),
493
+ setRequestTracer: sinon.stub(),
494
+ microservicesUrl: sinon.stub().returns('/api/v2/tss/settings'),
495
+ ...bitgoOverrides,
496
+ };
497
+ const integrationCoin = {
498
+ isEVM: sinon.stub().returns(false),
499
+ supportsTss: sinon.stub().returns(true),
500
+ getMPCAlgorithm: sinon.stub().returns('ecdsa'),
501
+ getFamily: sinon.stub().returns('eth'),
502
+ getChain: sinon.stub().returns('teth'),
503
+ getDefaultMultisigType: sinon.stub().returns('tss'),
504
+ getConfig: sinon.stub().returns({ features: [statics_1.CoinFeature.MPCV2] }),
505
+ keychains: sinon.stub().returns({ add: sinon.stub() }),
506
+ url: sinon.stub().returns('/api/v2/teth/wallet/add'),
507
+ supplementGenerateWallet: sinon.stub().callsFake((params) => Promise.resolve(params)),
508
+ ...coinOverrides,
509
+ };
510
+ sinon.stub(utils_1.ECDSAUtils.EcdsaMPCv2Utils.prototype, 'createKeychainsWithExternalSigner').resolves({
511
+ userKeychain: { id: 'user-key-id', commonKeychain, type: 'tss' },
512
+ backupKeychain: { id: 'backup-key-id', commonKeychain, type: 'tss' },
513
+ bitgoKeychain: { id: 'bitgo-key-id', commonKeychain, type: 'tss' },
514
+ });
515
+ return new wallets_1.Wallets(integrationBitGo, integrationCoin);
516
+ }
517
+ it('should pass advanced wallet type through to wallet/add', async function () {
518
+ const integrationWallets = createIntegrationWallets();
519
+ await integrationWallets.generateWalletWithExternalSigner({
520
+ label: 'Advanced TSS Wallet',
521
+ type: 'advanced',
522
+ multisigType: 'tss',
523
+ enterprise: 'enterprise-id',
524
+ ecdsaMPCv2Callbacks: integrationCallbacks,
525
+ });
526
+ send.firstCall.args[0].type.should.equal('advanced');
527
+ });
528
+ it('should default EVM walletVersion to 5 when TSS settings specify MPCv2', async function () {
529
+ const integrationWallets = createIntegrationWallets({ isEVM: sinon.stub().returns(true) }, {
530
+ get: sinon.stub().returns({
531
+ result: sinon.stub().resolves({
532
+ coinSettings: { eth: { walletCreationSettings: { multiSigTypeVersion: 'MPCv2' } } },
533
+ }),
534
+ }),
535
+ });
536
+ await integrationWallets.generateWalletWithExternalSigner({
537
+ label: 'EVM TSS Wallet',
538
+ type: 'advanced',
539
+ multisigType: 'tss',
540
+ enterprise: 'enterprise-id',
541
+ ecdsaMPCv2Callbacks: integrationCallbacks,
542
+ });
543
+ send.firstCall.args[0].walletVersion.should.equal(5);
544
+ });
545
+ it('should forward explicit walletVersion to wallet/add', async function () {
546
+ const integrationWallets = createIntegrationWallets({ isEVM: sinon.stub().returns(true) });
547
+ await integrationWallets.generateWalletWithExternalSigner({
548
+ label: 'EVM TSS Wallet v6',
549
+ type: 'advanced',
550
+ multisigType: 'tss',
551
+ enterprise: 'enterprise-id',
552
+ walletVersion: 6,
553
+ ecdsaMPCv2Callbacks: integrationCallbacks,
554
+ });
555
+ send.firstCall.args[0].walletVersion.should.equal(6);
556
+ });
557
+ });
558
+ });
559
+ describe('generateWalletWithExternalSigner - EdDSA TSS', function () {
560
+ let eddsaCallbacks;
561
+ let eddsaMockBaseCoin;
562
+ let eddsaWallets;
563
+ const commonKeychain = 'eddsa-common-keychain';
564
+ beforeEach(function () {
565
+ const keyShare = (pub, prv, proof) => ({
566
+ publicShare: pub,
567
+ privateShare: prv,
568
+ privateShareProof: proof,
569
+ vssProof: `${proof}-vss`,
570
+ gpgKey: `${pub}-gpg`,
571
+ });
572
+ const mpcState = { encryptedData: 'data', encryptedDataKey: 'data-key' };
573
+ eddsaCallbacks = {
574
+ initializeCallback: sinon.stub().resolves({
575
+ userGpgPublicKey: 'user-gpg-pub',
576
+ backupGpgPublicKey: 'backup-gpg-pub',
577
+ userToBitgoKeyShare: keyShare('upub', 'uprv-enc', 'uproof'),
578
+ backupToBitgoKeyShare: keyShare('bpub', 'bprv-enc', 'bproof'),
579
+ userState: mpcState,
580
+ backupState: mpcState,
581
+ backupToUserCounterPartyKeyShare: keyShare('ucp', 'ucp-prv', 'ucp-proof'),
582
+ }),
583
+ finalizeCallback: sinon.stub().resolves({ commonKeychain }),
584
+ };
585
+ const mockEddsaBitGo = {
586
+ post: sinon.stub().returns({
587
+ send: sinon.stub().returns({ result: sinon.stub().resolves({ id: 'eddsa-wallet-id' }) }),
588
+ }),
589
+ setRequestTracer: sinon.stub(),
590
+ };
591
+ eddsaMockBaseCoin = {
592
+ isEVM: sinon.stub().returns(false),
593
+ supportsTss: sinon.stub().returns(true),
594
+ getMPCAlgorithm: sinon.stub().returns('eddsa'),
595
+ getFamily: sinon.stub().returns('sol'),
596
+ getChain: sinon.stub().returns('tsol'),
597
+ getDefaultMultisigType: sinon.stub().returns('tss'),
598
+ keychains: sinon.stub().returns({ add: sinon.stub() }),
599
+ url: sinon.stub().returns('/api/v2/tsol/wallet/add'),
600
+ getConfig: sinon.stub().returns({ features: [] }),
601
+ supplementGenerateWallet: sinon.stub().callsFake((params) => Promise.resolve(params)),
602
+ };
603
+ eddsaWallets = new wallets_1.Wallets(mockEddsaBitGo, eddsaMockBaseCoin);
604
+ sinon.stub(eddsaWallets, 'generateMpcWalletWithExternalSigner').resolves({
605
+ responseType: 'WalletWithKeychains',
606
+ wallet: sinon.createStubInstance(wallet_1.Wallet),
607
+ userKeychain: { id: 'user-key-id', commonKeychain, type: 'tss' },
608
+ backupKeychain: { id: 'backup-key-id', commonKeychain, type: 'tss' },
609
+ bitgoKeychain: { id: 'bitgo-key-id', commonKeychain, type: 'tss' },
610
+ });
611
+ });
612
+ it('should route to generateMpcWalletWithExternalSigner for tss EdDSA coin', async function () {
613
+ const result = await eddsaWallets.generateWalletWithExternalSigner({
614
+ label: 'EdDSA TSS Wallet',
615
+ multisigType: 'tss',
616
+ enterprise: 'enterprise-id',
617
+ eddsaCallbacks,
618
+ });
619
+ result.responseType.should.equal('WalletWithKeychains');
620
+ assert.strictEqual(eddsaWallets.generateMpcWalletWithExternalSigner.calledOnce, true);
621
+ });
622
+ it('should reject without eddsaCallbacks for eddsa coin', async function () {
623
+ sinon.restore();
624
+ eddsaMockBaseCoin.getMPCAlgorithm = sinon.stub().returns('eddsa');
625
+ await eddsaWallets
626
+ .generateWalletWithExternalSigner({
627
+ label: 'EdDSA TSS Wallet',
628
+ multisigType: 'tss',
629
+ enterprise: 'enterprise-id',
630
+ })
631
+ .should.be.rejectedWith('eddsaCallbacks is required for EdDSA TSS wallet generation with external signer');
632
+ });
633
+ });
284
634
  describe('generateWallet with createKeychainCallback', function () {
285
635
  it('should delegate to generateWalletWithExternalSigner', async function () {
286
636
  const generateWalletWithExternalSignerStub = sinon.stub(wallets, 'generateWalletWithExternalSigner').resolves({
@@ -317,4 +667,4 @@ describe('Wallets - external signer onchain wallet generation', function () {
317
667
  });
318
668
  });
319
669
  });
320
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0c0V4dGVybmFsU2lnbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L2JpdGdvL3dhbGxldC93YWxsZXRzRXh0ZXJuYWxTaWduZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQ0FBaUM7QUFDakMsNkNBQStCO0FBQy9CLGtCQUFnQjtBQUVoQixrRUFBK0Q7QUFFL0QsZ0VBQTZEO0FBRTdELFFBQVEsQ0FBQyxxREFBcUQsRUFBRTtJQUM5RCxJQUFJLE9BQWdCLENBQUM7SUFDckIsSUFBSSxTQUFjLENBQUM7SUFDbkIsSUFBSSxZQUFpQixDQUFDO0lBQ3RCLElBQUksYUFBa0IsQ0FBQztJQUN2QixJQUFJLHNCQUErRyxDQUFDO0lBQ3BILElBQUksUUFBeUIsQ0FBQztJQUU5QixNQUFNLE9BQU8sR0FDWCxpSEFBaUgsQ0FBQztJQUNwSCxNQUFNLFNBQVMsR0FDYixpSEFBaUgsQ0FBQztJQUNwSCxNQUFNLFFBQVEsR0FDWixpSEFBaUgsQ0FBQztJQUVwSCxVQUFVLENBQUM7UUFDVCxzQkFBc0IsR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdEMsc0JBQXNCLENBQUMsUUFBUSxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUM7WUFDekUsR0FBRyxFQUFFLE9BQU87WUFDWixJQUFJLEVBQUUsYUFBYTtZQUNuQixNQUFNLEVBQUUsTUFBTTtTQUNmLENBQUMsQ0FBQztRQUNILHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDO1lBQzNFLEdBQUcsRUFBRSxTQUFTO1lBQ2QsSUFBSSxFQUFFLGFBQWE7WUFDbkIsTUFBTSxFQUFFLFFB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QUFFO2FBQ25GLENBQUMsQ0FBQztZQUVILE1BQU0sT0FBTyxDQUFDLGNBQWMsQ0FBQztnQkFDM0IsS0FBSyxFQUFFLGtCQUFrQjtnQkFDekIsc0JBQXNCO2FBQ3ZCLENBQUMsQ0FBQztZQUVILE1BQU0sQ0FBQyxXQUFXLENBQUMsb0NBQW9DLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzFFLG9DQUFvQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUNoRyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx1RUFBdUUsRUFBRSxLQUFLO1lBQy9FLE1BQU0sT0FBTztpQkFDVixjQUFjLENBQUM7Z0JBQ2QsS0FBSyxFQUFFLGdCQUFnQjtnQkFDdkIsVUFBVSxFQUFFLFFBQVE7Z0JBQ3BCLHNCQUFzQjthQUN2QixDQUFDO2lCQUNELE1BQU0sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLHVEQUF1RCxDQUFDLENBQUM7UUFDckYsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsb0VBQW9FLEVBQUUsS0FBSztZQUM1RSxNQUFNLE9BQU87aUJBQ1YsY0FBYyxDQUFDO2dCQUNkLEtBQUssRUFBRSxnQkFBZ0I7Z0JBQ3ZCLE9BQU8sRUFBRSxTQUFTO2dCQUNsQixzQkFBc0I7YUFDdkIsQ0FBQztpQkFDRCxNQUFNLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO1FBQ2xGLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0ICogYXMgc2lub24gZnJvbSAnc2lub24nO1xuaW1wb3J0ICdzaG91bGQnO1xuXG5pbXBvcnQgeyBXYWxsZXRzIH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjL2JpdGdvL3dhbGxldC93YWxsZXRzJztcbmltcG9ydCB7IENyZWF0ZUtleWNoYWluQ2FsbGJhY2sgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvYml0Z28vd2FsbGV0L2lXYWxsZXRzJztcbmltcG9ydCB7IFdhbGxldCB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYy9iaXRnby93YWxsZXQvd2FsbGV0JztcblxuZGVzY3JpYmUoJ1dhbGxldHMgLSBleHRlcm5hbCBzaWduZXIgb25jaGFpbiB3YWxsZXQgZ2VuZXJhdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IHdhbGxldHM6IFdhbGxldHM7XG4gIGxldCBtb2NrQml0R286IGFueTtcbiAgbGV0IG1vY2tCYXNlQ29pbjogYW55O1xuICBsZXQgbW9ja0tleWNoYWluczogYW55O1xuICBsZXQgY3JlYXRlS2V5Y2hhaW5DYWxsYmFjazogc2lub24uU2lub25TdHViPFBhcmFtZXRlcnM8Q3JlYXRlS2V5Y2hhaW5DYWxsYmFjaz4sIFJldHVyblR5cGU8Q3JlYXRlS2V5Y2hhaW5DYWxsYmFjaz4+O1xuICBsZXQgc2VuZFN0dWI6IHNpbm9uLlNpbm9uU3R1YjtcblxuICBjb25zdCB1c2VyUHViID1cbiAgICAneHB1YjY2MU15TXdBcVJiY0Z0WGdTNXNZSkFCcXFHOVlMbUM0UTFSZGFwOWdTRThOcXR3eWJHaGVQWTJnWjI5RVNGanFKb0N1MVJ1cGplOFl0R3FzZWZEMjY1VE1nN3VzVURGZHA2VzFFR01jZXQ4JztcbiAgY29uc3QgYmFja3VwUHViID1cbiAgICAneHB1YjY2MU15TXdBcVJiY0djemp1TW9SbTZkWGFMREVoVzF1MzRnS2VuYmVZcUFpeDIxbWRVS0p5dXl1NUYxcnpZR1Z4eUw2dG1nQlVBRVByRXo5Mm1CWGpCeU1SaUpkYmE5d3BuTjM3UkxMQVhhJztcbiAgY29uc3QgYml0Z29QdWIgPVxuICAgICd4cHViNjYxTXlNd0FxUmJjRVlTOHc3WExTVmVFc0JYeTc5elN6SDFKOHZDZHhBWm5pbmdXTGROM3pndFU2TEJwQjg1YjNEMnljOHNmdlpVNTIxQUF3ZFphZkV6N21uekJCc3o0d0tZNWZUdFRRQm0nO1xuXG4gIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgIGNyZWF0ZUtleWNoYWluQ2FsbGJhY2sgPSBzaW5vbi5zdHViKCk7XG4gICAgY3JlYXRlS2V5Y2hhaW5DYWxsYmFjay53aXRoQXJncyh7IHNvdXJjZTogJ3VzZXInLCBjb2luOiAndGJ0YycgfSkucmVzb2x2ZXMoe1xuICAgICAgcHViOiB1c2VyUHViLFxuICAgICAgdHlwZTogJ2luZGVwZW5kZW50JyxcbiAgICAgIHNvdXJjZTogJ3VzZXInLFxuICAgIH0pO1xuICAgIGNyZWF0ZUtleWNoYWluQ2FsbGJhY2sud2l0aEFyZ3MoeyBzb3VyY2U6ICdiYWNrdXAnLCBjb2luOiAndGJ0YycgfSkucmVzb2x2ZXMoe1xuICAgICAgcHViOiBiYWNrdXBQdWIsXG4gICAgICB0eXBlOiAnaW5kZXBlbmRlbnQnLFxuICAgICAgc291cmNlOiAnYmFja3VwJyxcbiAgICB9KTtcblxuICAgIG1vY2tLZXljaGFpbnMgPSB7XG4gICAgICBhZGQ6IHNpbm9uLnN0dWIoKS5jYWxsc0Zha2UoYXN5bmMgKHBhcmFtczogeyBwdWI6IHN0cmluZzsgc291cmNlOiBzdHJpbmcgfSkgPT4gKHtcbiAgICAgICAgaWQ6IGAke3BhcmFtcy5zb3VyY2V9LWtleS1pZGAsXG4gICAgICAgIHB1YjogcGFyYW1zLnB1YixcbiAgICAgICAgc291cmNlOiBwYXJhbXMuc291cmNlLFxuICAgICAgfSkpLFxuICAgICAgY3JlYXRlQml0R286IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7IGlkOiAnYml0Z28ta2V5LWlkJywgcHViOiBiaXRnb1B1YiB9KSxcbiAgICB9O1xuXG4gICAgY29uc3QgbW9ja1dhbGxldERhdGEgPSB7IGlkOiAnd2FsbGV0LWlkJywga2V5czogWyd1c2VyLWtleS1pZCcsICdiYWNrdXAta2V5LWlkJywgJ2JpdGdvLWtleS1pZCddIH07XG5cbiAgICBzZW5kU3R1YiA9IHNpbm9uLnN0dWIoKS5yZXR1cm5zKHtcbiAgICAgIHJlc3VsdDogc2lub24uc3R1YigpLnJlc29sdmVzKG1vY2tXYWxsZXREYXRhKSxcbiAgICB9KTtcbiAgICBtb2NrQml0R28gPSB7XG4gICAgICBwb3N0OiBzaW5vbi5zdHViKCkucmV0dXJucyh7IHNlbmQ6IHNlbmRTdHViIH0pLFxuICAgICAgc2V0UmVxdWVzdFRyYWNlcjogc2lub24uc3R1YigpLFxuICAgIH07XG5cbiAgICBtb2NrQmFzZUNvaW4gPSB7XG4gICAgICBpc0VWTTogc2lub24uc3R1YigpLnJldHVybnMoZmFsc2UpLFxuICAgICAgc3VwcG9ydHNUc3M6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKHRydWUpLFxuICAgICAgZ2V0RmFtaWx5OiBzaW5vbi5zdHViKCkucmV0dXJucygnYnRjJyksXG4gICAgICBnZXRDaGFpbjogc2lub24uc3R1YigpLnJldHVybnMoJ3RidGMnKSxcbiAgICAgIGdldERlZmF1bHRNdWx0aXNpZ1R5cGU6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKCdvbmNoYWluJyksXG4gICAgICBrZXljaGFpbnM6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKG1vY2tLZXljaGFpbnMpLFxuICAgICAgdXJsOiBzaW5vbi5zdHViKCkucmV0dXJucygnL2FwaS92Mi90YnRjL3dhbGxldC9hZGQnKSxcbiAgICAgIGdldENvbmZpZzogc2lub24uc3R1YigpLnJldHVybnMoeyBmZWF0dXJlczogW10gfSksXG4gICAgICBzdXBwbGVtZW50R2VuZXJhdGVXYWxsZXQ6IHNpbm9uLnN0dWIoKS5jYWxsc0Zha2UoKHdhbGxldFBhcmFtczogdW5rbm93bikgPT4gUHJvbWlzZS5yZXNvbHZlKHdhbGxldFBhcmFtcykpLFxuICAgICAgaXNWYWxpZFB1Yjogc2lub24uc3R1YigpLnJldHVybnModHJ1ZSksXG4gICAgfTtcblxuICAgIHdhbGxldHMgPSBuZXcgV2FsbGV0cyhtb2NrQml0R28sIG1vY2tCYXNlQ29pbik7XG4gIH0pO1xuXG4gIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgc2lub24ucmVzdG9yZSgpO1xuICB9KTtcblxuICBkZXNjcmliZSgnZ2VuZXJhdGVXYWxsZXRXaXRoRXh0ZXJuYWxTaWduZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBjcmVhdGUgdXNlciBhbmQgYmFja3VwIGtleXMgdmlhIGNhbGxiYWNrIGFuZCBjcmVhdGUgd2FsbGV0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2FsbGV0cy5nZW5lcmF0ZVdhbGxldFdpdGhFeHRlcm5hbFNpZ25lcih7XG4gICAgICAgIGxhYmVsOiAnRXh0ZXJuYWwgU2lnbmVyIFdhbGxldCcsXG4gICAgICAgIGVudGVycHJpc2U6ICdlbnRlcnByaXNlLWlkJyxcbiAgICAgICAgY3JlYXRlS2V5Y2hhaW5DYWxsYmFjayxcbiAgICAgIH0pO1xuXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoY3JlYXRlS2V5Y2hhaW5DYWxsYmFjay5jYWxsQ291bnQsIDIpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKG1vY2tLZXljaGFpbnMuYWRkLmNhbGxDb3VudCwgMik7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwobW9ja0tleWNoYWlucy5jcmVhdGVCaXRHby5jYWxsZWRPbmNlLCB0cnVlKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChtb2NrQml0R28ucG9zdC5jYWxsZWRPbmNlLCB0cnVlKTtcblxuICAgICAgY29uc3QgYWRkVXNlclBhcmFtcyA9IG1vY2tLZXljaGFpbnMuYWRkLmdldENhbGwoMCkuYXJnc1swXTtcbiAgICAgIGFkZFVzZXJQYXJhbXMuc2hvdWxkLmhhdmUucHJvcGVydHkoJ3B1YicsIHVzZXJQdWIpO1xuICAgICAgYWRkVXNlclBhcmFtcy5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgna2V5VHlwZScsICdpbmRlcGVuZGVudCcpO1xuICAgICAgYWRkVXNlclBhcmFtcy5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnc291cmNlJywgJ3VzZXInKTtcblxuICAgICAgY29uc3Qgd2FsbGV0Qm9keSA9IHNlbmRTdHViLmZpcnN0Q2FsbC5hcmdzWzBdO1xuICAgICAgd2FsbGV0Qm9keS5rZXlzLnNob3VsZC5kZWVwRXF1YWwoWyd1c2VyLWtleS1pZCcsICdiYWNrdXAta2V5LWlkJywgJ2JpdGdvLWtleS1pZCddKTtcbiAgICAgIHdhbGxldEJvZHkubGFiZWwuc2hvdWxkLmVxdWFsKCdFeHRlcm5hbCBTaWduZXIgV2FsbGV0Jyk7XG4gICAgICB3YWxsZXRCb2R5LmVudGVycHJpc2Uuc2hvdWxkLmVxdWFsKCdlbnRlcnByaXNlLWlkJyk7XG5cbiAgICAgIHJlc3VsdC5yZXNwb25zZVR5cGUuc2hvdWxkLmVxdWFsKCdXYWxsZXRXaXRoS2V5Y2hhaW5zJyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LnVzZXJLZXljaGFpbi5wdWIsIHVzZXJQdWIpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdC5iYWNrdXBLZXljaGFpbi5wdWIsIGJhY2t1cFB1Yik7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LmJpdGdvS2V5Y2hhaW4ucHViLCBiaXRnb1B1Yik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHBhc3MgYWR2YW5jZWQgd2FsbGV0IHR5cGUgdGhyb3VnaCB0byB3YWxsZXQvYWRkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgd2FsbGV0cy5nZW5lcmF0ZVdhbGxldFdpdGhFeHRlcm5hbFNpZ25lcih7XG4gICAgICAgIGxhYmVsOiAnQWR2YW5jZWQgV2FsbGV0JyxcbiAgICAgICAgZW50ZXJwcmlzZTogJ2VudGVycHJpc2UtaWQnLFxuICAgICAgICB0eXBlOiAnYWR2YW5jZWQnLFxuICAgICAgICBjcmVhdGVLZXljaGFpbkNhbGxiYWNrLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHdhbGxldEJvZHkgPSBzZW5kU3R1Yi5maXJzdENhbGwuYXJnc1swXTtcbiAgICAgIHdhbGxldEJvZHkudHlwZS5zaG91bGQuZXF1YWwoJ2FkdmFuY2VkJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCB3aGVuIGNhbGxiYWNrIHNvdXJjZSBkb2VzIG5vdCBtYXRjaCByZXF1ZXN0ZWQgc291cmNlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY3JlYXRlS2V5Y2hhaW5DYWxsYmFjay53aXRoQXJncyh7IHNvdXJjZTogJ3VzZXInLCBjb2luOiAndGJ0YycgfSkucmVzb2x2ZXMoe1xuICAgICAgICBwdWI6IHVzZXJQdWIsXG4gICAgICAgIHR5cGU6ICdpbmRlcGVuZGVudCcsXG4gICAgICAgIHNvdXJjZTogJ2JhY2t1cCcsXG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgd2FsbGV0c1xuICAgICAgICAuZ2VuZXJhdGVXYWxsZXRXaXRoRXh0ZXJuYWxTaWduZXIoe1xuICAgICAgICAgIGxhYmVsOiAnRXh0ZXJuYWwgU2lnbmVyIFdhbGxldCcsXG4gICAgICAgICAgY3JlYXRlS2V5Y2hhaW5DYWxsYmFjayxcbiAgICAgICAgfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoXG4gICAgICAgICAgJ0ZhaWxlZCB0byBjcmVhdGUgdXNlciBrZXljaGFpbjogY3JlYXRlS2V5Y2hhaW5DYWxsYmFjayByZXR1cm5lZCBzb3VyY2UgYmFja3VwLCBleHBlY3RlZCB1c2VyJ1xuICAgICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgaW52YWxpZCB0eXBlIGZyb20gY2FsbGJhY2snLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBiYWRUeXBlQ2FsbGJhY2sgPSBzaW5vbi5zdHViKCk7XG4gICAgICBiYWRUeXBlQ2FsbGJhY2sud2l0aEFyZ3MoeyBzb3VyY2U6ICd1c2VyJywgY29pbjogJ3RidGMnIH0pLnJlc29sdmVzKHtcbiAgICAgICAgcHViOiB1c2VyUHViLFxuICAgICAgICB0eXBlOiAndHNzJyxcbiAgICAgICAgc291cmNlOiAndXNlcicsXG4gICAgICB9KTtcbiAgICAgIGJhZFR5cGVDYWxsYmFjay53aXRoQXJncyh7IHNvdXJjZTogJ2JhY2t1cCcsIGNvaW46ICd0YnRjJyB9KS5yZXNvbHZlcyh7XG4gICAgICAgIHB1YjogYmFja3VwUHViLFxuICAgICAgICB0eXBlOiAnaW5kZXBlbmRlbnQnLFxuICAgICAgICBzb3VyY2U6ICdiYWNrdXAnLFxuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IHdhbGxldHNcbiAgICAgICAgLmdlbmVyYXRlV2FsbGV0V2l0aEV4dGVybmFsU2lnbmVyKHtcbiAgICAgICAgICBsYWJlbDogJ0V4dGVybmFsIFNpZ25lciBXYWxsZXQnLFxuICAgICAgICAgIGNyZWF0ZUtleWNoYWluQ2FsbGJhY2s6IGJhZFR5cGVDYWxsYmFjayxcbiAgICAgICAgfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoXG4gICAgICAgICAgXCJGYWlsZWQgdG8gY3JlYXRlIHVzZXIga2V5Y2hhaW46IGNyZWF0ZUtleWNoYWluQ2FsbGJhY2sgcmV0dXJuZWQgaW52YWxpZCB0eXBlIHRzcywgZXhwZWN0ZWQgJ2luZGVwZW5kZW50JyBmb3Igb25jaGFpbiBtdWx0aXNpZ1wiXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBUU1MgbXVsdGlzaWcgdHlwZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IHdhbGxldHNcbiAgICAgICAgLmdlbmVyYXRlV2FsbGV0V2l0aEV4dGVybmFsU2lnbmVyKHtcbiAgICAgICAgICBsYWJlbDogJ1RTUyBXYWxsZXQnLFxuICAgICAgICAgIG11bHRpc2lnVHlwZTogJ3RzcycsXG4gICAgICAgICAgY3JlYXRlS2V5Y2hhaW5DYWxsYmFjayxcbiAgICAgICAgfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ2V4dGVybmFsIHNpZ25lciB3YWxsZXQgZ2VuZXJhdGlvbiBpcyBvbmx5IHN1cHBvcnRlZCBmb3Igb25jaGFpbiBtdWx0aXNpZyB3YWxsZXRzJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBjdXN0b2RpYWwgd2FsbGV0IHR5cGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCB3YWxsZXRzXG4gICAgICAgIC5nZW5lcmF0ZVdhbGxldFdpdGhFeHRlcm5hbFNpZ25lcih7XG4gICAgICAgICAgbGFiZWw6ICdDdXN0b2RpYWwgV2FsbGV0JyxcbiAgICAgICAgICB0eXBlOiAnY3VzdG9kaWFsJyxcbiAgICAgICAgICBjcmVhdGVLZXljaGFpbkNhbGxiYWNrLFxuICAgICAgICB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnZXh0ZXJuYWwgc2lnbmVyIHdhbGxldCBnZW5lcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGN1c3RvZGlhbCBvbmNoYWluIHdhbGxldHMnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IHBhc3Njb2RlRW5jcnlwdGlvbkNvZGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCB3YWxsZXRzXG4gICAgICAgIC5nZW5lcmF0ZVdhbGxldFdpdGhFeHRlcm5hbFNpZ25lcih7XG4gICAgICAgICAgbGFiZWw6ICdXYWxsZXQnLFxuICAgICAgICAgIHBhc3Njb2RlRW5jcnlwdGlvbkNvZGU6ICdzb21lLWNvZGUnLFxuICAgICAgICAgIGNyZWF0ZUtleWNoYWluQ2FsbGJhY2ssXG4gICAgICAgIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdwYXNzY29kZUVuY3J5cHRpb25Db2RlIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGV4dGVybmFsIHNpZ25lciB3YWxsZXQgZ2VuZXJhdGlvbicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3Qgd2ViYXV0aG5JbmZvJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgd2FsbGV0c1xuICAgICAgICAuZ2VuZXJhdGVXYWxsZXRXaXRoRXh0ZXJuYWxTaWduZXIoe1xuICAgICAgICAgIGxhYmVsOiAnV2FsbGV0JyxcbiAgICAgICAgICB3ZWJhdXRobkluZm86IHsgb3RwRGV2aWNlSWQ6ICdkZXYtaWQnLCBwcmZTYWx0OiAnc2FsdCcsIHBhc3NwaHJhc2U6ICdwYXNzJyB9LFxuICAgICAgICAgIGNyZWF0ZUtleWNoYWluQ2FsbGJhY2ssXG4gICAgICAgIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCd3ZWJhdXRobkluZm8gaXMgbm90IHN1cHBvcnRlZCBmb3IgZXh0ZXJuYWwgc2lnbmVyIHdhbGxldCBnZW5lcmF0aW9uJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBpc0Rpc3RyaWJ1dGVkQ3VzdG9keSB3aXRob3V0IGVudGVycHJpc2UnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCB3YWxsZXRzXG4gICAgICAgIC5nZW5lcmF0ZVdhbGxldFdpdGhFeHRlcm5hbFNpZ25lcih7XG4gICAgICAgICAgbGFiZWw6ICdEQyBXYWxsZXQnLFxuICAgICAgICAgIHR5cGU6ICdjb2xkJyxcbiAgICAgICAgICBpc0Rpc3RyaWJ1dGVkQ3VzdG9keTogdHJ1ZSxcbiAgICAgICAgICBjcmVhdGVLZXljaGFpbkNhbGxiYWNrLFxuICAgICAgICB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnbXVzdCBwcm92aWRlIGVudGVycHJpc2Ugd2hlbiBjcmVhdGluZyBkaXN0cmlidXRlZCBjdXN0b2R5IHdhbGxldCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgaXNEaXN0cmlidXRlZEN1c3RvZHkgd2l0aCBub24tY29sZCB0eXBlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgd2FsbGV0c1xuICAgICAgICAuZ2VuZXJhdGVXYWxsZXRXaXRoRXh0ZXJuYWxTaWduZXIoe1xuICAgICAgICAgIGxhYmVsOiAnREMgV2FsbGV0JyxcbiAgICAgICAgICB0eXBlOiAnaG90JyxcbiAgICAgICAgICBpc0Rpc3RyaWJ1dGVkQ3VzdG9keTogdHJ1ZSxcbiAgICAgICAgICBlbnRlcnByaXNlOiAnZW50ZXJwcmlzZS1pZCcsXG4gICAgICAgICAgY3JlYXRlS2V5Y2hhaW5DYWxsYmFjayxcbiAgICAgICAgfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ2Rpc3RyaWJ1dGVkIGN1c3RvZHkgd2FsbGV0cyBtdXN0IGJlIHR5cGU6IGNvbGQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IHdoZW4gY2FsbGJhY2sgcmV0dXJucyBpbnZhbGlkIHB1YiBmb3IgY29pbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIG9ubHkgaW52YWxpZGF0ZSB1c2VyIHB1YiBzbyB0aGUgcmVqZWN0aW9uIHNvdXJjZSBpcyBkZXRlcm1pbmlzdGljXG4gICAgICBtb2NrQmFzZUNvaW4uaXNWYWxpZFB1Yi5jYWxsc0Zha2UoKHB1Yjogc3RyaW5nKSA9PiBwdWIgIT09IHVzZXJQdWIpO1xuXG4gICAgICBhd2FpdCB3YWxsZXRzXG4gICAgICAgIC5nZW5lcmF0ZVdhbGxldFdpdGhFeHRlcm5hbFNpZ25lcih7XG4gICAgICAgICAgbGFiZWw6ICdFeHRlcm5hbCBTaWduZXIgV2FsbGV0JyxcbiAgICAgICAgICBjcmVhdGVLZXljaGFpbkNhbGxiYWNrLFxuICAgICAgICB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChcbiAgICAgICAgICAnRmFpbGVkIHRvIGNyZWF0ZSB1c2VyIGtleWNoYWluOiBjcmVhdGVLZXljaGFpbkNhbGxiYWNrIHJldHVybmVkIGludmFsaWQgcHViIGZvciB1c2VyIGtleSBvbiB0YnRjJ1xuICAgICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB3cmFwIGVycm9yIHdoZW4gY2FsbGJhY2sgdGhyb3dzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY3JlYXRlS2V5Y2hhaW5DYWxsYmFjay53aXRoQXJncyh7IHNvdXJjZTogJ3VzZXInLCBjb2luOiAndGJ0YycgfSkucmVqZWN0cyhuZXcgRXJyb3IoJ0hTTSB1bnJlYWNoYWJsZScpKTtcblxuICAgICAgYXdhaXQgd2FsbGV0c1xuICAgICAgICAuZ2VuZXJhdGVXYWxsZXRXaXRoRXh0ZXJuYWxTaWduZXIoe1xuICAgICAgICAgIGxhYmVsOiAnRXh0ZXJuYWwgU2lnbmVyIFdhbGxldCcsXG4gICAgICAgICAgY3JlYXRlS2V5Y2hhaW5DYWxsYmFjayxcbiAgICAgICAgfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ0ZhaWxlZCB0byBjcmVhdGUgdXNlciBrZXljaGFpbjogSFNNIHVucmVhY2hhYmxlJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCB3aXRoIGJhY2t1cCBrZXljaGFpbiBlcnJvciB3aGVuIGJhY2t1cCBjYWxsYmFjayB0aHJvd3MnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjcmVhdGVLZXljaGFpbkNhbGxiYWNrLndpdGhBcmdzKHsgc291cmNlOiAnYmFja3VwJywgY29pbjogJ3RidGMnIH0pLnJlamVjdHMobmV3IEVycm9yKCdIU00gdW5yZWFjaGFibGUnKSk7XG5cbiAgICAgIGF3YWl0IHdhbGxldHNcbiAgICAgICAgLmdlbmVyYXRlV2FsbGV0V2l0aEV4dGVybmFsU2lnbmVyKHtcbiAgICAgICAgICBsYWJlbDogJ0V4dGVybmFsIFNpZ25lciBXYWxsZXQnLFxuICAgICAgICAgIGNyZWF0ZUtleWNoYWluQ2FsbGJhY2ssXG4gICAgICAgIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdGYWlsZWQgdG8gY3JlYXRlIGJhY2t1cCBrZXljaGFpbjogSFNNIHVucmVhY2hhYmxlJyk7XG5cbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChtb2NrQml0R28ucG9zdC5jYWxsQ291bnQsIDApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB3cmFwIG5vbi1FcnJvciB0aHJvd24gYnkgY2FsbGJhY2snLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjcmVhdGVLZXljaGFpbkNhbGxiYWNrXG4gICAgICAgIC53aXRoQXJncyh7IHNvdXJjZTogJ3VzZXInLCBjb2luOiAndGJ0YycgfSlcbiAgICAgICAgLnJldHVybnMoUHJvbWlzZS5yZWplY3QoJ3BsYWluIHN0cmluZyByZWplY3Rpb24nKSk7XG5cbiAgICAgIGF3YWl0IHdhbGxldHNcbiAgICAgICAgLmdlbmVyYXRlV2FsbGV0V2l0aEV4dGVybmFsU2lnbmVyKHtcbiAgICAgICAgICBsYWJlbDogJ0V4dGVybmFsIFNpZ25lciBXYWxsZXQnLFxuICAgICAgICAgIGNyZWF0ZUtleWNoYWluQ2FsbGJhY2ssXG4gICAgICAgIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdGYWlsZWQgdG8gY3JlYXRlIHVzZXIga2V5Y2hhaW46IHBsYWluIHN0cmluZyByZWplY3Rpb24nKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZm9yd2FyZCBrZXlTaWduYXR1cmVzIHRvIHdhbGxldCBwYXJhbXMgd2hlbiBwcm92aWRlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGtleVNpZ25hdHVyZXMgPSB7XG4gICAgICAgIGJhY2t1cDogJ2RlYWRiZWVmMDEnLFxuICAgICAgICBiaXRnbzogJ2RlYWRiZWVmMDInLFxuICAgICAgfTtcblxuICAgICAgYXdhaXQgd2FsbGV0cy5nZW5lcmF0ZVdhbGxldFdpdGhFeHRlcm5hbFNpZ25lcih7XG4gICAgICAgIGxhYmVsOiAnRXh0ZXJuYWwgU2lnbmVyIFdhbGxldCcsXG4gICAgICAgIGVudGVycHJpc2U6ICdlbnRlcnByaXNlLWlkJyxcbiAgICAgICAgY3JlYXRlS2V5Y2hhaW5DYWxsYmFjayxcbiAgICAgICAga2V5U2lnbmF0dXJlcyxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB3YWxsZXRCb2R5ID0gc2VuZFN0dWIuZmlyc3RDYWxsLmFyZ3NbMF07XG4gICAgICB3YWxsZXRCb2R5LnNob3VsZC5oYXZlLnByb3BlcnR5KCdrZXlTaWduYXR1cmVzJyk7XG4gICAgICB3YWxsZXRCb2R5LmtleVNpZ25hdHVyZXMuc2hvdWxkLmRlZXBFcXVhbChrZXlTaWduYXR1cmVzKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IGluY2x1ZGUga2V5U2lnbmF0dXJlcyBpbiB3YWxsZXQgcGFyYW1zIHdoZW4gbm90IHByb3ZpZGVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgd2FsbGV0cy5nZW5lcmF0ZVdhbGxldFdpdGhFeHRlcm5hbFNpZ25lcih7XG4gICAgICAgIGxhYmVsOiAnRXh0ZXJuYWwgU2lnbmVyIFdhbGxldCcsXG4gICAgICAgIGVudGVycHJpc2U6ICdlbnRlcnByaXNlLWlkJyxcbiAgICAgICAgY3JlYXRlS2V5Y2hhaW5DYWxsYmFjayxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB3YWxsZXRCb2R5ID0gc2VuZFN0dWIuZmlyc3RDYWxsLmFyZ3NbMF07XG4gICAgICB3YWxsZXRCb2R5LnNob3VsZC5ub3QuaGF2ZS5wcm9wZXJ0eSgna2V5U2lnbmF0dXJlcycpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZ2VuZXJhdGVXYWxsZXQgd2l0aCBjcmVhdGVLZXljaGFpbkNhbGxiYWNrJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgZGVsZWdhdGUgdG8gZ2VuZXJhdGVXYWxsZXRXaXRoRXh0ZXJuYWxTaWduZXInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBnZW5lcmF0ZVdhbGxldFdpdGhFeHRlcm5hbFNpZ25lclN0dWIgPSBzaW5vbi5zdHViKHdhbGxldHMsICdnZW5lcmF0ZVdhbGxldFdpdGhFeHRlcm5hbFNpZ25lcicpLnJlc29sdmVzKHtcbiAgICAgICAgcmVzcG9uc2VUeXBlOiAnV2FsbGV0V2l0aEtleWNoYWlucycsXG4gICAgICAgIHdhbGxldDogc2lub24uY3JlYXRlU3R1Ykluc3RhbmNlKFdhbGxldCksXG4gICAgICAgIHVzZXJLZXljaGFpbjogeyBpZDogJ3VzZXIta2V5LWlkJywgcHViOiB1c2VyUHViLCB0eXBlOiAnaW5kZXBlbmRlbnQnIGFzIGNvbnN0IH0sXG4gICAgICAgIGJhY2t1cEtleWNoYWluOiB7IGlkOiAnYmFja3VwLWtleS1pZCcsIHB1YjogYmFja3VwUHViLCB0eXBlOiAnaW5kZXBlbmRlbnQnIGFzIGNvbnN0IH0sXG4gICAgICAgIGJpdGdvS2V5Y2hhaW46IHsgaWQ6ICdiaXRnby1rZXktaWQnLCBwdWI6IGJpdGdvUHViLCB0eXBlOiAnaW5kZXBlbmRlbnQnIGFzIGNvbnN0IH0sXG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgd2FsbGV0cy5nZW5lcmF0ZVdhbGxldCh7XG4gICAgICAgIGxhYmVsOiAnRGVsZWdhdGVkIFdhbGxldCcsXG4gICAgICAgIGNyZWF0ZUtleWNoYWluQ2FsbGJhY2ssXG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGdlbmVyYXRlV2FsbGV0V2l0aEV4dGVybmFsU2lnbmVyU3R1Yi5jYWxsZWRPbmNlLCB0cnVlKTtcbiAgICAgIGdlbmVyYXRlV2FsbGV0V2l0aEV4dGVybmFsU2lnbmVyU3R1Yi5maXJzdENhbGwuYXJnc1swXS5sYWJlbC5zaG91bGQuZXF1YWwoJ0RlbGVnYXRlZCBXYWxsZXQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IHdoZW4gY3JlYXRlS2V5Y2hhaW5DYWxsYmFjayBpcyBjb21iaW5lZCB3aXRoIHBhc3NwaHJhc2UnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCB3YWxsZXRzXG4gICAgICAgIC5nZW5lcmF0ZVdhbGxldCh7XG4gICAgICAgICAgbGFiZWw6ICdJbnZhbGlkIFdhbGxldCcsXG4gICAgICAgICAgcGFzc3BocmFzZTogJ3NlY3JldCcsXG4gICAgICAgICAgY3JlYXRlS2V5Y2hhaW5DYWxsYmFjayxcbiAgICAgICAgfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ2NyZWF0ZUtleWNoYWluQ2FsbGJhY2sgY2Fubm90IGJlIHVzZWQgd2l0aCBwYXNzcGhyYXNlJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCB3aGVuIGNyZWF0ZUtleWNoYWluQ2FsbGJhY2sgaXMgY29tYmluZWQgd2l0aCB1c2VyS2V5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgd2FsbGV0c1xuICAgICAgICAuZ2VuZXJhdGVXYWxsZXQoe1xuICAgICAgICAgIGxhYmVsOiAnSW52YWxpZCBXYWxsZXQnLFxuICAgICAgICAgIHVzZXJLZXk6ICd4cHViLi4uJyxcbiAgICAgICAgICBjcmVhdGVLZXljaGFpbkNhbGxiYWNrLFxuICAgICAgICB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnY3JlYXRlS2V5Y2hhaW5DYWxsYmFjayBjYW5ub3QgYmUgdXNlZCB3aXRoIHVzZXJLZXknKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
670
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0c0V4dGVybmFsU2lnbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L2JpdGdvL3dhbGxldC93YWxsZXRzRXh0ZXJuYWxTaWduZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQ0FBaUM7QUFDakMsNkNBQStCO0FBQy9CLGtCQUFnQjtBQUVoQixrRUFBK0Q7QUFDL0QsdURBQXlEO0FBQ3pELDRDQUE2QztBQU03QyxnRUFBNkQ7QUFFN0QsUUFBUSxDQUFDLHFEQUFxRCxFQUFFO0lBQzlELElBQUksT0FBZ0IsQ0FBQztJQUNyQixJQUFJLFNBQWMsQ0FBQztJQUNuQixJQUFJLFlBQWlCLENBQUM7SUFDdEIsSUFBSSxhQUFrQixDQUFDO0lBQ3ZCLElBQUksc0JBQStHLENBQUM7SUFDcEgsSUFBSSxRQUF5QixDQUFDO0lBRTlCLE1BQU0sT0FBTyxHQUNYLGlIQUFpSCxDQUFDO0lBQ3BILE1BQU0sU0FBUyxHQUNiLGlIQUFpSCxDQUFDO0lBQ3BILE1BQU0sUUFBUSxHQUNaLGlIQUFpSCxDQUFDO0lBRXBILFVBQVUsQ0FBQztRQUNULHNCQUFzQixHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN0QyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQztZQUN6RSxHQUFHLEVBQUUsT0FBTztZQUNaLElBQUksRUFBRSxhQUFhO1lBQ25CLE1BQU0sRUFBRSxNQUFNO1NBQ2YsQ0FBQyxDQUFDO1FBQ0gsc0JBQXNCLENBQUMsUUFBUSxDQUFDLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUM7WUFDM0UsR0FBRyxFQUFFLFNBQVM7WUFDZCxJQUFJLEVB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biBmcm9tICdzaW5vbic7XG5pbXBvcnQgJ3Nob3VsZCc7XG5cbmltcG9ydCB7IFdhbGxldHMgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvYml0Z28vd2FsbGV0L3dhbGxldHMnO1xuaW1wb3J0IHsgRUNEU0FVdGlscyB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYy9iaXRnby91dGlscyc7XG5pbXBvcnQgeyBDb2luRmVhdHVyZSB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB7XG4gIENyZWF0ZUtleWNoYWluQ2FsbGJhY2ssXG4gIEVjZHNhTVBDdjJLZXlHZW5DYWxsYmFja3MsXG4gIEVkZHNhS2V5R2VuQ2FsbGJhY2tzLFxufSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvYml0Z28vd2FsbGV0L2lXYWxsZXRzJztcbmltcG9ydCB7IFdhbGxldCB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYy9iaXRnby93YWxsZXQvd2FsbGV0JztcblxuZGVzY3JpYmUoJ1dhbGxldHMgLSBleHRlcm5hbCBzaWduZXIgb25jaGFpbiB3YWxsZXQgZ2VuZXJhdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IHdhbGxldHM6IFdhbGxldHM7XG4gIGxldCBtb2NrQml0R286IGFueTtcbiAgbGV0IG1vY2tCYXNlQ29pbjogYW55O1xuICBsZXQgbW9ja0tleWNoYWluczogYW55O1xuICBsZXQgY3JlYXRlS2V5Y2hhaW5DYWxsYmFjazogc2lub24uU2lub25TdHViPFBhcmFtZXRlcnM8Q3JlYXRlS2V5Y2hhaW5DYWxsYmFjaz4sIFJldHVyblR5cGU8Q3JlYXRlS2V5Y2hhaW5DYWxsYmFjaz4+O1xuICBsZXQgc2VuZFN0dWI6IHNpbm9uLlNpbm9uU3R1YjtcblxuICBjb25zdCB1c2VyUHViID1cbiAgICAneHB1YjY2MU15TXdBcVJiY0Z0WGdTNXNZSkFCcXFHOVlMbUM0UTFSZGFwOWdTRThOcXR3eWJHaGVQWTJnWjI5RVNGanFKb0N1MVJ1cGplOFl0R3FzZWZEMjY1VE1nN3VzVURGZHA2VzFFR01jZXQ4JztcbiAgY29uc3QgYmFja3VwUHViID1cbiAgICAneHB1YjY2MU15TXdBcVJiY0djemp1TW9SbTZkWGFMREVoVzF1MzRnS2VuYmVZcUFpeDIxbWRVS0p5dXl1NUYxcnpZR1Z4eUw2dG1nQlVBRVByRXo5Mm1CWGpCeU1SaUpkYmE5d3BuTjM3UkxMQVhhJztcbiAgY29uc3QgYml0Z29QdWIgPVxuICAgICd4cHViNjYxTXlNd0FxUmJjRVlTOHc3WExTVmVFc0JYeTc5elN6SDFKOHZDZHhBWm5pbmdXTGROM3pndFU2TEJwQjg1YjNEMnljOHNmdlpVNTIxQUF3ZFphZkV6N21uekJCc3o0d0tZNWZUdFRRQm0nO1xuXG4gIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgIGNyZWF0ZUtleWNoYWluQ2FsbGJhY2sgPSBzaW5vbi5zdHViKCk7XG4gICAgY3JlYXRlS2V5Y2hhaW5DYWxsYmFjay53aXRoQXJncyh7IHNvdXJjZTogJ3VzZXInLCBjb2luOiAndGJ0YycgfSkucmVzb2x2ZXMoe1xuICAgICAgcHViOiB1c2VyUHViLFxuICAgICAgdHlwZTogJ2luZGVwZW5kZW50JyxcbiAgICAgIHNvdXJjZTogJ3VzZXInLFxuICAgIH0pO1xuICAgIGNyZWF0ZUtleWNoYWluQ2FsbGJhY2sud2l0aEFyZ3MoeyBzb3VyY2U6ICdiYWNrdXAnLCBjb2luOiAndGJ0YycgfSkucmVzb2x2ZXMoe1xuICAgICAgcHViOiBiYWNrdXBQdWIsXG4gICAgICB0eXBlOiAnaW5kZXBlbmRlbnQnLFxuICAgICAgc291cmNlOiAnYmFja3VwJyxcbiAgICB9KTtcblxuICAgIG1vY2tLZXljaGFpbnMgPSB7XG4gICAgICBhZGQ6IHNpbm9uXG4gICAgICAgIC5zdHViKClcbiAgICAgICAgLmNhbGxzRmFrZSgocGFyYW1zOiBhbnkpID0+XG4gICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHsgaWQ6IGAke3BhcmFtcz8uc291cmNlID8/ICcnfS1rZXktaWRgLCBwdWI6IHBhcmFtcz8ucHViLCBzb3VyY2U6IHBhcmFtcz8uc291cmNlIH0pXG4gICAgICAgICksXG4gICAgICBjcmVhdGVCaXRHbzogc2lub24uc3R1YigpLnJlc29sdmVzKHsgaWQ6ICdiaXRnby1rZXktaWQnLCBwdWI6IGJpdGdvUHViIH0pLFxuICAgIH07XG5cbiAgICBjb25zdCBtb2NrV2FsbGV0RGF0YSA9IHsgaWQ6ICd3YWxsZXQtaWQnLCBrZXlzOiBbJ3VzZXIta2V5LWlkJywgJ2JhY2t1cC1rZXktaWQnLCAnYml0Z28ta2V5LWlkJ10gfTtcblxuICAgIHNlbmRTdHViID0gc2lub24uc3R1YigpLnJldHVybnMoe1xuICAgICAgcmVzdWx0OiBzaW5vbi5zdHViKCkucmVzb2x2ZXMobW9ja1dhbGxldERhdGEpLFxuICAgIH0pO1xuICAgIG1vY2tCaXRHbyA9IHtcbiAgICAgIHBvc3Q6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKHsgc2VuZDogc2VuZFN0dWIgfSksXG4gICAgICBzZXRSZXF1ZXN0VHJhY2VyOiBzaW5vbi5zdHViKCksXG4gICAgfTtcblxuICAgIG1vY2tCYXNlQ29pbiA9IHtcbiAgICAgIGlzRVZNOiBzaW5vbi5zdHViKCkucmV0dXJucyhmYWxzZSksXG4gICAgICBzdXBwb3J0c1Rzczogc2lub24uc3R1YigpLnJldHVybnModHJ1ZSksXG4gICAgICBnZXRNUENBbGdvcml0aG06IHNpbm9uLnN0dWIoKS5yZXR1cm5zKCdlY2RzYScpLFxuICAgICAgZ2V0RmFtaWx5OiBzaW5vbi5zdHViKCkucmV0dXJucygnYnRjJyksXG4gICAgICBnZXRDaGFpbjogc2lub24uc3R1YigpLnJldHVybnMoJ3RidGMnKSxcbiAgICAgIGdldERlZmF1bHRNdWx0aXNpZ1R5cGU6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKCdvbmNoYWluJyksXG4gICAgICBrZXljaGFpbnM6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKG1vY2tLZXljaGFpbnMpLFxuICAgICAgdXJsOiBzaW5vbi5zdHViKCkucmV0dXJucygnL2FwaS92Mi90YnRjL3dhbGxldC9hZGQnKSxcbiAgICAgIGdldENvbmZpZzogc2lub24uc3R1YigpLnJldHVybnMoeyBmZWF0dXJlczogW10gfSksXG4gICAgICBzdXBwbGVtZW50R2VuZXJhdGVXYWxsZXQ6IHNpbm9uLnN0dWIoKS5jYWxsc0Zha2UoKHBhcmFtczogYW55KSA9PiBQcm9taXNlLnJlc29sdmUocGFyYW1zKSksXG4gICAgICBpc1ZhbGlkUHViOiBzaW5vbi5zdHViKCkucmV0dXJucyh0cnVlKSxcbiAgICB9O1xuXG4gICAgd2FsbGV0cyA9IG5ldyBXYWxsZXRzKG1vY2tCaXRHbywgbW9ja0Jhc2VDb2luKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBzaW5vbi5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZW5lcmF0ZVdhbGxldFdpdGhFeHRlcm5hbFNpZ25lcicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGNyZWF0ZSB1c2VyIGFuZCBiYWNrdXAga2V5cyB2aWEgY2FsbGJhY2sgYW5kIGNyZWF0ZSB3YWxsZXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3YWxsZXRzLmdlbmVyYXRlV2FsbGV0V2l0aEV4dGVybmFsU2lnbmVyKHtcbiAgICAgICAgbGFiZWw6ICdFeHRlcm5hbCBTaWduZXIgV2FsbGV0JyxcbiAgICAgICAgZW50ZXJwcmlzZTogJ2VudGVycHJpc2UtaWQnLFxuICAgICAgICBjcmVhdGVLZXljaGFpbkNhbGxiYWNrLFxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChjcmVhdGVLZXljaGFpbkNhbGxiYWNrLmNhbGxDb3VudCwgMik7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwobW9ja0tleWNoYWlucy5hZGQuY2FsbENvdW50LCAyKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChtb2NrS2V5Y2hhaW5zLmNyZWF0ZUJpdEdvLmNhbGxlZE9uY2UsIHRydWUpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKG1vY2tCaXRHby5wb3N0LmNhbGxlZE9uY2UsIHRydWUpO1xuXG4gICAgICBjb25zdCBhZGRVc2VyUGFyYW1zID0gbW9ja0tleWNoYWlucy5hZGQuZ2V0Q2FsbCgwKS5hcmdzWzBdO1xuICAgICAgYWRkVXNlclBhcmFtcy5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgncHViJywgdXNlclB1Yik7XG4gICAgICBhZGRVc2VyUGFyYW1zLnNob3VsZC5oYXZlLnByb3BlcnR5KCdrZXlUeXBlJywgJ2luZGVwZW5kZW50Jyk7XG4gICAgICBhZGRVc2VyUGFyYW1zLnNob3VsZC5oYXZlLnByb3BlcnR5KCdzb3VyY2UnLCAndXNlcicpO1xuXG4gICAgICBjb25zdCB3YWxsZXRCb2R5ID0gc2VuZFN0dWIuZmlyc3RDYWxsLmFyZ3NbMF07XG4gICAgICB3YWxsZXRCb2R5LmtleXMuc2hvdWxkLmRlZXBFcXVhbChbJ3VzZXIta2V5LWlkJywgJ2JhY2t1cC1rZXktaWQnLCAnYml0Z28ta2V5LWlkJ10pO1xuICAgICAgd2FsbGV0Qm9keS5sYWJlbC5zaG91bGQuZXF1YWwoJ0V4dGVybmFsIFNpZ25lciBXYWxsZXQnKTtcbiAgICAgIHdhbGxldEJvZHkuZW50ZXJwcmlzZS5zaG91bGQuZXF1YWwoJ2VudGVycHJpc2UtaWQnKTtcblxuICAgICAgcmVzdWx0LnJlc3BvbnNlVHlwZS5zaG91bGQuZXF1YWwoJ1dhbGxldFdpdGhLZXljaGFpbnMnKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQudXNlcktleWNoYWluLnB1YiwgdXNlclB1Yik7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LmJhY2t1cEtleWNoYWluLnB1YiwgYmFja3VwUHViKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQuYml0Z29LZXljaGFpbi5wdWIsIGJpdGdvUHViKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcGFzcyBhZHZhbmNlZCB3YWxsZXQgdHlwZSB0aHJvdWdoIHRvIHdhbGxldC9hZGQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCB3YWxsZXRzLmdlbmVyYXRlV2FsbGV0V2l0aEV4dGVybmFsU2lnbmVyKHtcbiAgICAgICAgbGFiZWw6ICdBZHZhbmNlZCBXYWxsZXQnLFxuICAgICAgICBlbnRlcnByaXNlOiAnZW50ZXJwcmlzZS1pZCcsXG4gICAgICAgIHR5cGU6ICdhZHZhbmNlZCcsXG4gICAgICAgIGNyZWF0ZUtleWNoYWluQ2FsbGJhY2ssXG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgd2FsbGV0Qm9keSA9IHNlbmRTdHViLmZpcnN0Q2FsbC5hcmdzWzBdO1xuICAgICAgd2FsbGV0Qm9keS50eXBlLnNob3VsZC5lcXVhbCgnYWR2YW5jZWQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IHdoZW4gY2FsbGJhY2sgc291cmNlIGRvZXMgbm90IG1hdGNoIHJlcXVlc3RlZCBzb3VyY2UnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjcmVhdGVLZXljaGFpbkNhbGxiYWNrLndpdGhBcmdzKHsgc291cmNlOiAndXNlcicsIGNvaW46ICd0YnRjJyB9KS5yZXNvbHZlcyh7XG4gICAgICAgIHB1YjogdXNlclB1YixcbiAgICAgICAgdHlwZTogJ2luZGVwZW5kZW50JyxcbiAgICAgICAgc291cmNlOiAnYmFja3VwJyxcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCB3YWxsZXRzXG4gICAgICAgIC5nZW5lcmF0ZVdhbGxldFdpdGhFeHRlcm5hbFNpZ25lcih7XG4gICAgICAgICAgbGFiZWw6ICdFeHRlcm5hbCBTaWduZXIgV2FsbGV0JyxcbiAgICAgICAgICBjcmVhdGVLZXljaGFpbkNhbGxiYWNrLFxuICAgICAgICB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChcbiAgICAgICAgICAnRmFpbGVkIHRvIGNyZWF0ZSB1c2VyIGtleWNoYWluOiBjcmVhdGVLZXljaGFpbkNhbGxiYWNrIHJldHVybmVkIHNvdXJjZSBiYWNrdXAsIGV4cGVjdGVkIHVzZXInXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBpbnZhbGlkIHR5cGUgZnJvbSBjYWxsYmFjaycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJhZFR5cGVDYWxsYmFjayA9IHNpbm9uLnN0dWIoKTtcbiAgICAgIGJhZFR5cGVDYWxsYmFjay53aXRoQXJncyh7IHNvdXJjZTogJ3VzZXInLCBjb2luOiAndGJ0YycgfSkucmVzb2x2ZXMoe1xuICAgICAgICBwdWI6IHVzZXJQdWIsXG4gICAgICAgIHR5cGU6ICd0c3MnLFxuICAgICAgICBzb3VyY2U6ICd1c2VyJyxcbiAgICAgIH0pO1xuICAgICAgYmFkVHlwZUNhbGxiYWNrLndpdGhBcmdzKHsgc291cmNlOiAnYmFja3VwJywgY29pbjogJ3RidGMnIH0pLnJlc29sdmVzKHtcbiAgICAgICAgcHViOiBiYWNrdXBQdWIsXG4gICAgICAgIHR5cGU6ICdpbmRlcGVuZGVudCcsXG4gICAgICAgIHNvdXJjZTogJ2JhY2t1cCcsXG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgd2FsbGV0c1xuICAgICAgICAuZ2VuZXJhdGVXYWxsZXRXaXRoRXh0ZXJuYWxTaWduZXIoe1xuICAgICAgICAgIGxhYmVsOiAnRXh0ZXJuYWwgU2lnbmVyIFdhbGxldCcsXG4gICAgICAgICAgY3JlYXRlS2V5Y2hhaW5DYWxsYmFjazogYmFkVHlwZUNhbGxiYWNrLFxuICAgICAgICB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChcbiAgICAgICAgICBcIkZhaWxlZCB0byBjcmVhdGUgdXNlciBrZXljaGFpbjogY3JlYXRlS2V5Y2hhaW5DYWxsYmFjayByZXR1cm5lZCBpbnZhbGlkIHR5cGUgdHNzLCBleHBlY3RlZCAnaW5kZXBlbmRlbnQnIGZvciBvbmNoYWluIG11bHRpc2lnXCJcbiAgICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IFRTUyBtdWx0aXNpZyB0eXBlIHdpdGhvdXQgVFNTIGNhbGxiYWNrcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IHdhbGxldHNcbiAgICAgICAgLmdlbmVyYXRlV2FsbGV0V2l0aEV4dGVybmFsU2lnbmVyKHtcbiAgICAgICAgICBsYWJlbDogJ1RTUyBXYWxsZXQnLFxuICAgICAgICAgIG11bHRpc2lnVHlwZTogJ3RzcycsXG4gICAgICAgICAgZW50ZXJwcmlzZTogJ2VudGVycHJpc2UtaWQnLFxuICAgICAgICAgIGNyZWF0ZUtleWNoYWluQ2FsbGJhY2ssXG4gICAgICAgIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdlY2RzYU1QQ3YyQ2FsbGJhY2tzIGlzIHJlcXVpcmVkIGZvciBFQ0RTQSBUU1Mgd2FsbGV0IGdlbmVyYXRpb24gd2l0aCBleHRlcm5hbCBzaWduZXInKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcm91dGUgdG8gb25jaGFpbiB3aGVuIGNyZWF0ZUtleWNoYWluQ2FsbGJhY2sgaXMgcHJvdmlkZWQgb24gYSBUU1MtZGVmYXVsdCBjb2luJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbW9ja0Jhc2VDb2luLmdldERlZmF1bHRNdWx0aXNpZ1R5cGUucmV0dXJucygndHNzJyk7XG5cbiAgICAgIGF3YWl0IHdhbGxldHMuZ2VuZXJhdGVXYWxsZXRXaXRoRXh0ZXJuYWxTaWduZXIoe1xuICAgICAgICBsYWJlbDogJ09uY2hhaW4gb24gVFNTIGNvaW4nLFxuICAgICAgICBlbnRlcnByaXNlOiAnZW50ZXJwcmlzZS1pZCcsXG4gICAgICAgIGNyZWF0ZUtleWNoYWluQ2FsbGJhY2ssXG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGNyZWF0ZUtleWNoYWluQ2FsbGJhY2suY2FsbENvdW50LCAyKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChtb2NrS2V5Y2hhaW5zLmNyZWF0ZUJpdEdvLmNhbGxlZE9uY2UsIHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3Qgd2hlbiBib3RoIGNyZWF0ZUtleWNoYWluQ2FsbGJhY2sgYW5kIE1QQyBjYWxsYmFja3MgYXJlIHByb3ZpZGVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgd2FsbGV0c1xuICAgICAgICAuZ2VuZXJhdGVXYWxsZXRXaXRoRXh0ZXJuYWxTaWduZXIoe1xuICAgICAgICAgIGxhYmVsOiAnQW1iaWd1b3VzIFdhbGxldCcsXG4gICAgICAgICAgZW50ZXJwcmlzZTogJ2VudGVycHJpc2UtaWQnLFxuICAgICAgICAgIGNyZWF0ZUtleWNoYWluQ2FsbGJhY2ssXG4gICAgICAgICAgZWNkc2FNUEN2MkNhbGxiYWNrczoge1xuICAgICAgICAgICAgaW5pdGlhbGl6ZUNhbGxiYWNrOiBzaW5vbi5zdHViKCksXG4gICAgICAgICAgICByb3VuZDJDYWxsYmFjazogc2lub24uc3R1YigpLFxuICAgICAgICAgICAgcm91bmQzQ2FsbGJhY2s6IHNpbm9uLnN0dWIoKSxcbiAgICAgICAgICAgIGZpbmFsaXplQ2FsbGJhY2s6IHNpbm9uLnN0dWIoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnY3JlYXRlS2V5Y2hhaW5DYWxsYmFjayBjYW5ub3QgYmUgdXNlZCB0b2dldGhlciB3aXRoIE1QQyBUU1Mga2V5IGdlbmVyYXRpb24gY2FsbGJhY2tzJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBjdXN0b2RpYWwgd2FsbGV0IHR5cGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCB3YWxsZXRzXG4gICAgICAgIC5nZW5lcmF0ZVdhbGxldFdpdGhFeHRlcm5hbFNpZ25lcih7XG4gICAgICAgICAgbGFiZWw6ICdDdXN0b2RpYWwgV2FsbGV0JyxcbiAgICAgICAgICB0eXBlOiAnY3VzdG9kaWFsJyxcbiAgICAgICAgICBjcmVhdGVLZXljaGFpbkNhbGxiYWNrLFxuICAgICAgICB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnZXh0ZXJuYWwgc2lnbmVyIHdhbGxldCBnZW5lcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGN1c3RvZGlhbCBvbmNoYWluIHdhbGxldHMnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IHBhc3Njb2RlRW5jcnlwdGlvbkNvZGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCB3YWxsZXRzXG4gICAgICAgIC5nZW5lcmF0ZVdhbGxldFdpdGhFeHRlcm5hbFNpZ25lcih7XG4gICAgICAgICAgbGFiZWw6ICdXYWxsZXQnLFxuICAgICAgICAgIHBhc3Njb2RlRW5jcnlwdGlvbkNvZGU6ICdzb21lLWNvZGUnLFxuICAgICAgICAgIGNyZWF0ZUtleWNoYWluQ2FsbGJhY2ssXG4gICAgICAgIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdwYXNzY29kZUVuY3J5cHRpb25Db2RlIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGV4dGVybmFsIHNpZ25lciB3YWxsZXQgZ2VuZXJhdGlvbicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3Qgd2ViYXV0aG5JbmZvJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgd2FsbGV0c1xuICAgICAgICAuZ2VuZXJhdGVXYWxsZXRXaXRoRXh0ZXJuYWxTaWduZXIoe1xuICAgICAgICAgIGxhYmVsOiAnV2FsbGV0JyxcbiAgICAgICAgICB3ZWJhdXRobkluZm86IHsgb3RwRGV2aWNlSWQ6ICdkZXYtaWQnLCBwcmZTYWx0OiAnc2FsdCcsIHBhc3NwaHJhc2U6ICdwYXNzJyB9LFxuICAgICAgICAgIGNyZWF0ZUtleWNoYWluQ2FsbGJhY2ssXG4gICAgICAgIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCd3ZWJhdXRobkluZm8gaXMgbm90IHN1cHBvcnRlZCBmb3IgZXh0ZXJuYWwgc2lnbmVyIHdhbGxldCBnZW5lcmF0aW9uJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBpc0Rpc3RyaWJ1dGVkQ3VzdG9keSB3aXRob3V0IGVudGVycHJpc2UnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCB3YWxsZXRzXG4gICAgICAgIC5nZW5lcmF0ZVdhbGxldFdpdGhFeHRlcm5hbFNpZ25lcih7XG4gICAgICAgICAgbGFiZWw6ICdEQyBXYWxsZXQnLFxuICAgICAgICAgIHR5cGU6ICdjb2xkJyxcbiAgICAgICAgICBpc0Rpc3RyaWJ1dGVkQ3VzdG9keTogdHJ1ZSxcbiAgICAgICAgICBjcmVhdGVLZXljaGFpbkNhbGxiYWNrLFxuICAgICAgICB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnbXVzdCBwcm92aWRlIGVudGVycHJpc2Ugd2hlbiBjcmVhdGluZyBkaXN0cmlidXRlZCBjdXN0b2R5IHdhbGxldCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgaXNEaXN0cmlidXRlZEN1c3RvZHkgd2l0aCBub24tY29sZCB0eXBlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgd2FsbGV0c1xuICAgICAgICAuZ2VuZXJhdGVXYWxsZXRXaXRoRXh0ZXJuYWxTaWduZXIoe1xuICAgICAgICAgIGxhYmVsOiAnREMgV2FsbGV0JyxcbiAgICAgICAgICB0eXBlOiAnaG90JyxcbiAgICAgICAgICBpc0Rpc3RyaWJ1dGVkQ3VzdG9keTogdHJ1ZSxcbiAgICAgICAgICBlbnRlcnByaXNlOiAnZW50ZXJwcmlzZS1pZCcsXG4gICAgICAgICAgY3JlYXRlS2V5Y2hhaW5DYWxsYmFjayxcbiAgICAgICAgfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ2Rpc3RyaWJ1dGVkIGN1c3RvZHkgd2FsbGV0cyBtdXN0IGJlIHR5cGU6IGNvbGQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IHdoZW4gY2FsbGJhY2sgcmV0dXJucyBpbnZhbGlkIHB1YiBmb3IgY29pbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIG1vY2tCYXNlQ29pbi5pc1ZhbGlkUHViLmNhbGxzRmFrZSgocHViOiBzdHJpbmcpID0+IHB1YiAhPT0gdXNlclB1Yik7XG5cbiAgICAgIGF3YWl0IHdhbGxldHNcbiAgICAgICAgLmdlbmVyYXRlV2FsbGV0V2l0aEV4dGVybmFsU2lnbmVyKHtcbiAgICAgICAgICBsYWJlbDogJ0V4dGVybmFsIFNpZ25lciBXYWxsZXQnLFxuICAgICAgICAgIGNyZWF0ZUtleWNoYWluQ2FsbGJhY2ssXG4gICAgICAgIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKFxuICAgICAgICAgICdGYWlsZWQgdG8gY3JlYXRlIHVzZXIga2V5Y2hhaW46IGNyZWF0ZUtleWNoYWluQ2FsbGJhY2sgcmV0dXJuZWQgaW52YWxpZCBwdWIgZm9yIHVzZXIga2V5IG9uIHRidGMnXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHdyYXAgZXJyb3Igd2hlbiBjYWxsYmFjayB0aHJvd3MnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjcmVhdGVLZXljaGFpbkNhbGxiYWNrLndpdGhBcmdzKHsgc291cmNlOiAndXNlcicsIGNvaW46ICd0YnRjJyB9KS5yZWplY3RzKG5ldyBFcnJvcignSFNNIHVucmVhY2hhYmxlJykpO1xuXG4gICAgICBhd2FpdCB3YWxsZXRzXG4gICAgICAgIC5nZW5lcmF0ZVdhbGxldFdpdGhFeHRlcm5hbFNpZ25lcih7XG4gICAgICAgICAgbGFiZWw6ICdFeHRlcm5hbCBTaWduZXIgV2FsbGV0JyxcbiAgICAgICAgICBjcmVhdGVLZXljaGFpbkNhbGxiYWNrLFxuICAgICAgICB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnRmFpbGVkIHRvIGNyZWF0ZSB1c2VyIGtleWNoYWluOiBIU00gdW5yZWFjaGFibGUnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IHdpdGggYmFja3VwIGtleWNoYWluIGVycm9yIHdoZW4gYmFja3VwIGNhbGxiYWNrIHRocm93cycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNyZWF0ZUtleWNoYWluQ2FsbGJhY2sud2l0aEFyZ3MoeyBzb3VyY2U6ICdiYWNrdXAnLCBjb2luOiAndGJ0YycgfSkucmVqZWN0cyhuZXcgRXJyb3IoJ0hTTSB1bnJlYWNoYWJsZScpKTtcblxuICAgICAgYXdhaXQgd2FsbGV0c1xuICAgICAgICAuZ2VuZXJhdGVXYWxsZXRXaXRoRXh0ZXJuYWxTaWduZXIoe1xuICAgICAgICAgIGxhYmVsOiAnRXh0ZXJuYWwgU2lnbmVyIFdhbGxldCcsXG4gICAgICAgICAgY3JlYXRlS2V5Y2hhaW5DYWxsYmFjayxcbiAgICAgICAgfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ0ZhaWxlZCB0byBjcmVhdGUgYmFja3VwIGtleWNoYWluOiBIU00gdW5yZWFjaGFibGUnKTtcblxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKG1vY2tCaXRHby5wb3N0LmNhbGxDb3VudCwgMCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHdyYXAgbm9uLUVycm9yIHRocm93biBieSBjYWxsYmFjaycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNyZWF0ZUtleWNoYWluQ2FsbGJhY2tcbiAgICAgICAgLndpdGhBcmdzKHsgc291cmNlOiAndXNlcicsIGNvaW46ICd0YnRjJyB9KVxuICAgICAgICAucmV0dXJucyhQcm9taXNlLnJlamVjdCgncGxhaW4gc3RyaW5nIHJlamVjdGlvbicpKTtcblxuICAgICAgYXdhaXQgd2FsbGV0c1xuICAgICAgICAuZ2VuZXJhdGVXYWxsZXRXaXRoRXh0ZXJuYWxTaWduZXIoe1xuICAgICAgICAgIGxhYmVsOiAnRXh0ZXJuYWwgU2lnbmVyIFdhbGxldCcsXG4gICAgICAgICAgY3JlYXRlS2V5Y2hhaW5DYWxsYmFjayxcbiAgICAgICAgfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ0ZhaWxlZCB0byBjcmVhdGUgdXNlciBrZXljaGFpbjogcGxhaW4gc3RyaW5nIHJlamVjdGlvbicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmb3J3YXJkIGtleVNpZ25hdHVyZXMgdG8gd2FsbGV0IHBhcmFtcyB3aGVuIHByb3ZpZGVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qga2V5U2lnbmF0dXJlcyA9IHsgYmFja3VwOiAnZGVhZGJlZWYwMScsIGJpdGdvOiAnZGVhZGJlZWYwMicgfTtcblxuICAgICAgYXdhaXQgd2FsbGV0cy5nZW5lcmF0ZVdhbGxldFdpdGhFeHRlcm5hbFNpZ25lcih7XG4gICAgICAgIGxhYmVsOiAnRXh0ZXJuYWwgU2lnbmVyIFdhbGxldCcsXG4gICAgICAgIGVudGVycHJpc2U6ICdlbnRlcnByaXNlLWlkJyxcbiAgICAgICAgY3JlYXRlS2V5Y2hhaW5DYWxsYmFjayxcbiAgICAgICAga2V5U2lnbmF0dXJlcyxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB3YWxsZXRCb2R5ID0gc2VuZFN0dWIuZmlyc3RDYWxsLmFyZ3NbMF07XG4gICAgICB3YWxsZXRCb2R5LnNob3VsZC5oYXZlLnByb3BlcnR5KCdrZXlTaWduYXR1cmVzJyk7XG4gICAgICB3YWxsZXRCb2R5LmtleVNpZ25hdHVyZXMuc2hvdWxkLmRlZXBFcXVhbChrZXlTaWduYXR1cmVzKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IGluY2x1ZGUga2V5U2lnbmF0dXJlcyBpbiB3YWxsZXQgcGFyYW1zIHdoZW4gbm90IHByb3ZpZGVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgd2FsbGV0cy5nZW5lcmF0ZVdhbGxldFdpdGhFeHRlcm5hbFNpZ25lcih7XG4gICAgICAgIGxhYmVsOiAnRXh0ZXJuYWwgU2lnbmVyIFdhbGxldCcsXG4gICAgICAgIGVudGVycHJpc2U6ICdlbnRlcnByaXNlLWlkJyxcbiAgICAgICAgY3JlYXRlS2V5Y2hhaW5DYWxsYmFjayxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB3YWxsZXRCb2R5ID0gc2VuZFN0dWIuZmlyc3RDYWxsLmFyZ3NbMF07XG4gICAgICB3YWxsZXRCb2R5LnNob3VsZC5ub3QuaGF2ZS5wcm9wZXJ0eSgna2V5U2lnbmF0dXJlcycpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZ2VuZXJhdGVXYWxsZXRXaXRoRXh0ZXJuYWxTaWduZXIgLSBFQ0RTQSBNUEN2MiBUU1MnLCBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IGVjZHNhQ2FsbGJhY2tzOiBFY2RzYU1QQ3YyS2V5R2VuQ2FsbGJhY2tzO1xuICAgIGxldCBlY2RzYU1vY2tCYXNlQ29pbjogYW55O1xuICAgIGxldCBlY2RzYVdhbGxldHM6IFdhbGxldHM7XG5cbiAgICBjb25zdCBjb21tb25LZXljaGFpbiA9ICdhYmMxMjNjb21tb25rZXljaGFpbic7XG5cbiAgICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG1wY1N0YXRlID0geyBlbmNyeXB0ZWREYXRhOiAnZGF0YScsIGVuY3J5cHRlZERhdGFLZXk6ICdkYXRhLWtleScgfTtcbiAgICAgIGVjZHNhQ2FsbGJhY2tzID0ge1xuICAgICAgICBpbml0aWFsaXplQ2FsbGJhY2s6IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7XG4gICAgICAgICAgdXNlckdwZ1B1YmxpY0tleTogJ3VzZXItZ3BnLXB1YicsXG4gICAgICAgICAgYmFja3VwR3BnUHVibGljS2V5OiAnYmFja3VwLWdwZy1wdWInLFxuICAgICAgICAgIHJvdW5kMU1lc3NhZ2VzOiB7IGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSwgcDJwTWVzc2FnZXM6IFtdIH0sXG4gICAgICAgICAgdXNlclN0YXRlOiBtcGNTdGF0ZSxcbiAgICAgICAgICBiYWNrdXBTdGF0ZTogbXBjU3RhdGUsXG4gICAgICAgIH0pLFxuICAgICAgICByb3VuZDJDYWxsYmFjazogc2lub24uc3R1YigpLnJlc29sdmVzKHtcbiAgICAgICAgICByb3VuZDJNZXNzYWdlczogeyBicm9hZGNhc3RNZXNzYWdlczogW10sIHAycE1lc3NhZ2VzOiBbXSB9LFxuICAgICAgICAgIHVzZXJTdGF0ZTogbXBjU3RhdGUsXG4gICAgICAgICAgYmFja3VwU3RhdGU6IG1wY1N0YXRlLFxuICAgICAgICB9KSxcbiAgICAgICAgcm91bmQzQ2FsbGJhY2s6IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7XG4gICAgICAgICAgcm91bmQzTWVzc2FnZXM6IHsgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLCBwMnBNZXNzYWdlczogW10gfSxcbiAgICAgICAgICB1c2VyU3RhdGU6IG1wY1N0YXRlLFxuICAgICAgICAgIGJhY2t1cFN0YXRlOiBtcGNTdGF0ZSxcbiAgICAgICAgfSksXG4gICAgICAgIGZpbmFsaXplQ2FsbGJhY2s6IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7IGNvbW1vbktleWNoYWluIH0pLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgbW9ja0VjZHNhQml0R28gPSB7XG4gICAgICAgIHBvc3Q6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKHtcbiAgICAgICAgICBzZW5kOiBzaW5vbi5zdHViKCkucmV0dXJucyh7IHJlc3VsdDogc2lub24uc3R1YigpLnJlc29sdmVzKHsgaWQ6ICd0c3Mtd2FsbGV0LWlkJyB9KSB9KSxcbiAgICAgICAgfSksXG4gICAgICAgIGdldDogc2lub24uc3R1YigpLnJldHVybnMoeyByZXN1bHQ6IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7IGNvaW5TZXR0aW5nczoge30gfSkgfSksXG4gICAgICAgIHNldFJlcXVlc3RUcmFjZXI6IHNpbm9uLnN0dWIoKSxcbiAgICAgICAgbWljcm9zZXJ2aWNlc1VybDogc2lub24uc3R1YigpLnJldHVybnMoJy9hcGkvdjIvdHNzL3NldHRpbmdzJyksXG4gICAgICB9O1xuXG4gICAgICBlY2RzYU1vY2tCYXNlQ29pbiA9IHtcbiAgICAgICAgaXNFVk06IHNpbm9uLnN0dWIoKS5yZXR1cm5zKGZhbHNlKSxcbiAgICAgICAgc3VwcG9ydHNUc3M6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKHRydWUpLFxuICAgICAgICBnZXRNUENBbGdvcml0aG06IHNpbm9uLnN0dWIoKS5yZXR1cm5zKCdlY2RzYScpLFxuICAgICAgICBnZXRGYW1pbHk6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKCdldGgnKSxcbiAgICAgICAgZ2V0Q2hhaW46IHNpbm9uLnN0dWIoKS5yZXR1cm5zKCd0ZXRoJyksXG4gICAgICAgIGdldERlZmF1bHRNdWx0aXNpZ1R5cGU6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKCd0c3MnKSxcbiAgICAgICAga2V5Y2hhaW5zOiBzaW5vbi5zdHViKCkucmV0dXJucyh7IGFkZDogc2lub24uc3R1YigpIH0pLFxuICAgICAgICB1cmw6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKCcvYXBpL3YyL3RldGgvd2FsbGV0L2FkZCcpLFxuICAgICAgICBnZXRDb25maWc6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKHsgZmVhdHVyZXM6IFtdIH0pLFxuICAgICAgICBzdXBwbGVtZW50R2VuZXJhdGVXYWxsZXQ6IHNpbm9uLnN0dWIoKS5jYWxsc0Zha2UoKHBhcmFtczogYW55KSA9PiBQcm9taXNlLnJlc29sdmUocGFyYW1zKSksXG4gICAgICB9O1xuXG4gICAgICBlY2RzYVdhbGxldHMgPSBuZXcgV2FsbGV0cyhtb2NrRWNkc2FCaXRHbyBhcyBhbnksIGVjZHNhTW9ja0Jhc2VDb2luKTtcbiAgICAgIHNpbm9uLnN0dWIoZWNkc2FXYWxsZXRzIGFzIGFueSwgJ2dlbmVyYXRlTXBjV2FsbGV0V2l0aEV4dGVybmFsU2lnbmVyJykucmVzb2x2ZXMoe1xuICAgICAgICByZXNwb25zZVR5cGU6ICdXYWxsZXRXaXRoS2V5Y2hhaW5zJyBhcyBjb25zdCxcbiAgICAgICAgd2FsbGV0OiBzaW5vbi5jcmVhdGVTdHViSW5zdGFuY2UoV2FsbGV0KSxcbiAgICAgICAgdXNlcktleWNoYWluOiB7IGlkOiAndXNlci1rZXktaWQnLCBjb21tb25LZXljaGFpbiwgdHlwZTogJ3RzcycgfSxcbiAgICAgICAgYmFja3VwS2V5Y2hhaW46IHsgaWQ6ICdiYWNrdXAta2V5LWlkJywgY29tbW9uS2V5Y2hhaW4sIHR5cGU6ICd0c3MnIH0sXG4gICAgICAgIGJpdGdvS2V5Y2hhaW46IHsgaWQ6ICdiaXRnby1rZXktaWQnLCBjb21tb25LZXljaGFpbiwgdHlwZTogJ3RzcycgfSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByb3V0ZSB0byBnZW5lcmF0ZU1wY1dhbGxldFdpdGhFeHRlcm5hbFNpZ25lciBmb3IgdHNzIG11bHRpc2lnIHR5cGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlY2RzYVdhbGxldHMuZ2VuZXJhdGVXYWxsZXRXaXRoRXh0ZXJuYWxTaWduZXIoe1xuICAgICAgICBsYWJlbDogJ0VDRFNBIFRTUyBXYWxsZXQnLFxuICAgICAgICBtdWx0aXNpZ1R5cGU6ICd0c3MnLFxuICAgICAgICBlbnRlcnByaXNlOiAnZW50ZXJwcmlzZS1pZCcsXG4gICAgICAgIGVjZHNhTVBDdjJDYWxsYmFja3M6IGVjZHNhQ2FsbGJhY2tzLFxuICAgICAgfSk7XG5cbiAgICAgIHJlc3VsdC5yZXNwb25zZVR5cGUuc2hvdWxkLmVxdWFsKCdXYWxsZXRXaXRoS2V5Y2hhaW5zJyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoKGVjZHNhV2FsbGV0cyBhcyBhbnkpLmdlbmVyYXRlTXBjV2FsbGV0V2l0aEV4dGVybmFsU2lnbmVyLmNhbGxlZE9uY2UsIHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3Qgd2l0aG91dCBlbnRlcnByaXNlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgc2lub24ucmVzdG9yZSgpO1xuICAgICAgZWNkc2FNb2NrQmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtID0gc2lub24uc3R1YigpLnJldHVybnMoJ2VjZHNhJyk7XG5cbiAgICAgIGF3YWl0IGVjZHNhV2FsbGV0c1xuICAgICAgICAuZ2VuZXJhdGVXYWxsZXRXaXRoRXh0ZXJuYWxTaWduZXIoe1xuICAgICAgICAgIGxhYmVsOiAnRUNEU0EgVFNTIFdhbGxldCcsXG4gICAgICAgICAgbXVsdGlzaWdUeXBlOiAndHNzJyxcbiAgICAgICAgICBlY2RzYU1QQ3YyQ2FsbGJhY2tzOiBlY2RzYUNhbGxiYWNrcyxcbiAgICAgICAgfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ2VudGVycHJpc2UgaXMgcmVxdWlyZWQgZm9yIFRTUyB3YWxsZXQgZ2VuZXJhdGlvbiB3aXRoIGV4dGVybmFsIHNpZ25lcicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3Qgd2l0aG91dCBlY2RzYU1QQ3YyQ2FsbGJhY2tzIGZvciBlY2RzYSBjb2luJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgc2lub24ucmVzdG9yZSgpO1xuICAgICAgZWNkc2FNb2NrQmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtID0gc2lub24uc3R1YigpLnJldHVybnMoJ2VjZHNhJyk7XG5cbiAgICAgIGF3YWl0IGVjZHNhV2FsbGV0c1xuICAgICAgICAuZ2VuZXJhdGVXYWxsZXRXaXRoRXh0ZXJuYWxTaWduZXIoe1xuICAgICAgICAgIGxhYmVsOiAnRUNEU0EgVFNTIFdhbGxldCcsXG4gICAgICAgICAgbXVsdGlzaWdUeXBlOiAndHNzJyxcbiAgICAgICAgICBlbnRlcnByaXNlOiAnZW50ZXJwcmlzZS1pZCcsXG4gICAgICAgIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdlY2RzYU1QQ3YyQ2FsbGJhY2tzIGlzIHJlcXVpcmVkIGZvciBFQ0RTQSBUU1Mgd2FsbGV0IGdlbmVyYXRpb24gd2l0aCBleHRlcm5hbCBzaWduZXInKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IHdoZW4gY29pbiBkb2VzIG5vdCBzdXBwb3J0IFRTUycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNpbm9uLnJlc3RvcmUoKTtcbiAgICAgIGVjZHNhTW9ja0Jhc2VDb2luLnN1cHBvcnRzVHNzID0gc2lub24uc3R1YigpLnJldHVybnMoZmFsc2UpO1xuICAgICAgZWNkc2FNb2NrQmFzZUNvaW4uZ2V0RmFtaWx5ID0gc2lub24uc3R1YigpLnJldHVybnMoJ2J0YycpO1xuXG4gICAgICBhd2FpdCBlY2RzYVdhbGxldHNcbiAgICAgICAgLmdlbmVyYXRlV2FsbGV0V2l0aEV4dGVybmFsU2lnbmVyKHtcbiAgICAgICAgICBsYWJlbDogJ0VDRFNBIFRTUyBXYWxsZXQnLFxuICAgICAgICAgIG11bHRpc2lnVHlwZTogJ3RzcycsXG4gICAgICAgICAgZW50ZXJwcmlzZTogJ2VudGVycHJpc2UtaWQnLFxuICAgICAgICAgIGVjZHNhTVBDdjJDYWxsYmFja3M6IGVjZHNhQ2FsbGJhY2tzLFxuICAgICAgICB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnY29pbiBidGMgZG9lcyBub3Qgc3VwcG9ydCBUU1MgYXQgdGhpcyB0aW1lJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBFVk0gY29pbiB3aXRoIGludmFsaWQgd2FsbGV0VmVyc2lvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNpbm9uLnJlc3RvcmUoKTtcbiAgICAgIGVjZHNhTW9ja0Jhc2VDb2luLmlzRVZNID0gc2lub24uc3R1YigpLnJldHVybnModHJ1ZSk7XG4gICAgICBlY2RzYU1vY2tCYXNlQ29pbi5nZXRNUENBbGdvcml0aG0gPSBzaW5vbi5zdHViKCkucmV0dXJucygnZWNkc2EnKTtcblxuICAgICAgYXdhaXQgZWNkc2FXYWxsZXRzXG4gICAgICAgIC5nZW5lcmF0ZVdhbGxldFdpdGhFeHRlcm5hbFNpZ25lcih7XG4gICAgICAgICAgbGFiZWw6ICdFQ0RTQSBUU1MgV2FsbGV0JyxcbiAgICAgICAgICBtdWx0aXNpZ1R5cGU6ICd0c3MnLFxuICAgICAgICAgIGVudGVycHJpc2U6ICdlbnRlcnByaXNlLWlkJyxcbiAgICAgICAgICB3YWxsZXRWZXJzaW9uOiA0LFxuICAgICAgICAgIGVjZHNhTVBDdjJDYWxsYmFja3M6IGVjZHNhQ2FsbGJhY2tzLFxuICAgICAgICB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnRVZNIFRTUyB3YWxsZXRzIGFyZSBvbmx5IHN1cHBvcnRlZCBmb3Igd2FsbGV0IHZlcnNpb24gNSBhbmQgNicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgY3VzdG9kaWFsIFRTUyB3YWxsZXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBzaW5vbi5yZXN0b3JlKCk7XG4gICAgICBlY2RzYU1vY2tCYXNlQ29pbi5nZXRNUENBbGdvcml0aG0gPSBzaW5vbi5zdHViKCkucmV0dXJucygnZWNkc2EnKTtcblxuICAgICAgYXdhaXQgZWNkc2FXYWxsZXRzXG4gICAgICAgIC5nZW5lcmF0ZVdhbGxldFdpdGhFeHRlcm5hbFNpZ25lcih7XG4gICAgICAgICAgbGFiZWw6ICdDdXN0b2RpYWwgVFNTIFdhbGxldCcsXG4gICAgICAgICAgbXVsdGlzaWdUeXBlOiAndHNzJyxcbiAgICAgICAgICBlbnRlcnByaXNlOiAnZW50ZXJwcmlzZS1pZCcsXG4gICAgICAgICAgdHlwZTogJ2N1c3RvZGlhbCcsXG4gICAgICAgICAgZWNkc2FNUEN2MkNhbGxiYWNrczogZWNkc2FDYWxsYmFja3MsXG4gICAgICAgIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdjdXN0b2RpYWwgVFNTIHdhbGxldHMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIGV4dGVybmFsIHNpZ25lciB3YWxsZXQgZ2VuZXJhdGlvbicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgcGFzc3BocmFzZSBvbiBUU1MgcGF0aCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNpbm9uLnJlc3RvcmUoKTtcbiAgICAgIGVjZHNhTW9ja0Jhc2VDb2luLmdldE1QQ0FsZ29yaXRobSA9IHNpbm9uLnN0dWIoKS5yZXR1cm5zKCdlY2RzYScpO1xuXG4gICAgICBhd2FpdCBlY2RzYVdhbGxldHNcbiAgICAgICAgLmdlbmVyYXRlV2FsbGV0V2l0aEV4dGVybmFsU2lnbmVyKHtcbiAgICAgICAgICBsYWJlbDogJ1RTUyBXYWxsZXQnLFxuICAgICAgICAgIG11bHRpc2lnVHlwZTogJ3RzcycsXG4gICAgICAgICAgZW50ZXJwcmlzZTogJ2VudGVycHJpc2UtaWQnLFxuICAgICAgICAgIGVjZHNhTVBDdjJDYWxsYmFja3M6IGVjZHNhQ2FsbGJhY2tzLFxuICAgICAgICAgIHBhc3NwaHJhc2U6ICdzZWNyZXQnLFxuICAgICAgICB9IGFzIFBhcmFtZXRlcnM8V2FsbGV0c1snZ2VuZXJhdGVXYWxsZXRXaXRoRXh0ZXJuYWxTaWduZXInXT5bMF0gJiB7IHBhc3NwaHJhc2U6IHN0cmluZyB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgncGFzc3BocmFzZSBjYW5ub3QgYmUgdXNlZCB3aXRoIFRTUyBleHRlcm5hbCBzaWduZXIgd2FsbGV0IGdlbmVyYXRpb24nKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IEVDRFNBIE1QQ3YxIHdhbGxldCB2ZXJzaW9uIDMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBzaW5vbi5yZXN0b3JlKCk7XG4gICAgICBlY2RzYU1vY2tCYXNlQ29pbi5nZXRNUENBbGdvcml0aG0gPSBzaW5vbi5zdHViKCkucmV0dXJucygnZWNkc2EnKTtcblxuICAgICAgYXdhaXQgZWNkc2FXYWxsZXRzXG4gICAgICAgIC5nZW5lcmF0ZVdhbGxldFdpdGhFeHRlcm5hbFNpZ25lcih7XG4gICAgICAgICAgbGFiZWw6ICdNUEN2MSBXYWxsZXQnLFxuICAgICAgICAgIG11bHRpc2lnVHlwZTogJ3RzcycsXG4gICAgICAgICAgZW50ZXJwcmlzZTogJ2VudGVycHJpc2UtaWQnLFxuICAgICAgICAgIHdhbGxldFZlcnNpb246IDMsXG4gICAgICAgICAgZWNkc2FNUEN2MkNhbGxiYWNrczogZWNkc2FDYWxsYmFja3MsXG4gICAgICAgIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKFxuICAgICAgICAgICdFQ0RTQSBNUEN2MSAod2FsbGV0IHZlcnNpb24gMykgaXMgbm90IHN1cHBvcnRlZCBmb3IgZXh0ZXJuYWwgc2lnbmVyIHdhbGxldCBnZW5lcmF0aW9uJ1xuICAgICAgICApO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3dhbGxldC9hZGQgaW50ZWdyYXRpb24gKHVuc3R1YmJlZCBnZW5lcmF0ZU1wY1dhbGxldFdpdGhFeHRlcm5hbFNpZ25lciknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgc2VuZDogc2lub24uU2lub25TdHViO1xuICAgICAgbGV0IGludGVncmF0aW9uQ2FsbGJhY2tzOiBFY2RzYU1QQ3YyS2V5R2VuQ2FsbGJhY2tzO1xuXG4gICAgICAvLyBCdWlsZHMgYSBmcmVzaCBXYWxsZXRzIGluc3RhbmNlIHdpdGggb25seSBjcmVhdGVLZXljaGFpbnNXaXRoRXh0ZXJuYWxTaWduZXIgc3R1YmJlZCxcbiAgICAgIC8vIHNvIHRoZSByb3V0aW5nL3ZlcnNpb24vd2FsbGV0LWFkZCBsb2dpYyBpbiBnZW5lcmF0ZU1wY1dhbGxldFdpdGhFeHRlcm5hbFNpZ25lciBhY3R1YWxseSBydW5zLlxuICAgICAgZnVuY3Rpb24gY3JlYXRlSW50ZWdyYXRpb25XYWxsZXRzKFxuICAgICAgICBjb2luT3ZlcnJpZGVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9LFxuICAgICAgICBiaXRnb092ZXJyaWRlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fVxuICAgICAgKSB7XG4gICAgICAgIHNpbm9uLnJlc3RvcmUoKTtcblxuICAgICAgICBjb25zdCBtcGNTdGF0ZSA9IHsgZW5jcnlwdGVkRGF0YTogJ2RhdGEnLCBlbmNyeXB0ZWREYXRhS2V5OiAnZGF0YS1rZXknIH07XG4gICAgICAgIGludGVncmF0aW9uQ2FsbGJhY2tzID0ge1xuICAgICAgICAgIGluaXRpYWxpemVDYWxsYmFjazogc2lub24uc3R1YigpLnJlc29sdmVzKHtcbiAgICAgICAgICAgIHVzZXJHcGdQdWJsaWNLZXk6ICd1c2VyLWdwZy1wdWInLFxuICAgICAgICAgICAgYmFja3VwR3BnUHVibGljS2V5OiAnYmFja3VwLWdwZy1wdWInLFxuICAgICAgICAgICAgcm91bmQxTWVzc2FnZXM6IHsgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLCBwMnBNZXNzYWdlczogW10gfSxcbiAgICAgICAgICAgIHVzZXJTdGF0ZTogbXBjU3RhdGUsXG4gICAgICAgICAgICBiYWNrdXBTdGF0ZTogbXBjU3RhdGUsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgcm91bmQyQ2FsbGJhY2s6IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7XG4gICAgICAgICAgICByb3VuZDJNZXNzYWdlczogeyBicm9hZGNhc3RNZXNzYWdlczogW10sIHAycE1lc3NhZ2VzOiBbXSB9LFxuICAgICAgICAgICAgdXNlclN0YXRlOiBtcGNTdGF0ZSxcbiAgICAgICAgICAgIGJhY2t1cFN0YXRlOiBtcGNTdGF0ZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICByb3VuZDNDYWxsYmFjazogc2lub24uc3R1YigpLnJlc29sdmVzKHtcbiAgICAgICAgICAgIHJvdW5kM01lc3NhZ2VzOiB7IGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSwgcDJwTWVzc2FnZXM6IFtdIH0sXG4gICAgICAgICAgICB1c2VyU3RhdGU6IG1wY1N0YXRlLFxuICAgICAgICAgICAgYmFja3VwU3RhdGU6IG1wY1N0YXRlLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIGZpbmFsaXplQ2FsbGJhY2s6IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7IGNvbW1vbktleWNoYWluIH0pLFxuICAgICAgICB9O1xuXG4gICAgICAgIHNlbmQgPSBzaW5vbi5zdHViKCkucmV0dXJucyh7IHJlc3VsdDogc2lub24uc3R1YigpLnJlc29sdmVzKHsgaWQ6ICd0c3Mtd2FsbGV0LWlkJyB9KSB9KTtcbiAgICAgICAgY29uc3QgaW50ZWdyYXRpb25CaXRHbyA9IHtcbiAgICAgICAgICBwb3N0OiBzaW5vbi5zdHViKCkucmV0dXJucyh7IHNlbmQgfSksXG4gICAgICAgICAgZ2V0OiBzaW5vbi5zdHViKCkucmV0dXJucyh7IHJlc3VsdDogc2lub24uc3R1YigpLnJlc29sdmVzKHsgY29pblNldHRpbmdzOiB7fSB9KSB9KSxcbiAgICAgICAgICBzZXRSZXF1ZXN0VHJhY2VyOiBzaW5vbi5zdHViKCksXG4gICAgICAgICAgbWljcm9zZXJ2aWNlc1VybDogc2lub24uc3R1YigpLnJldHVybnMoJy9hcGkvdjIvdHNzL3NldHRpbmdzJyksXG4gICAgICAgICAgLi4uYml0Z29PdmVycmlkZXMsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGludGVncmF0aW9uQ29pbiA9IHtcbiAgICAgICAgICBpc0VWTTogc2lub24uc3R1YigpLnJldHVybnMoZmFsc2UpLFxuICAgICAgICAgIHN1cHBvcnRzVHNzOiBzaW5vbi5zdHViKCkucmV0dXJucyh0cnVlKSxcbiAgICAgICAgICBnZXRNUENBbGdvcml0aG06IHNpbm9uLnN0dWIoKS5yZXR1cm5zKCdlY2RzYScpLFxuICAgICAgICAgIGdldEZhbWlseTogc2lub24uc3R1YigpLnJldHVybnMoJ2V0aCcpLFxuICAgICAgICAgIGdldENoYWluOiBzaW5vbi5zdHViKCkucmV0dXJucygndGV0aCcpLFxuICAgICAgICAgIGdldERlZmF1bHRNdWx0aXNpZ1R5cGU6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKCd0c3MnKSxcbiAgICAgICAgICBnZXRDb25maWc6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKHsgZmVhdHVyZXM6IFtDb2luRmVhdHVyZS5NUENWMl0gfSksXG4gICAgICAgICAga2V5Y2hhaW5zOiBzaW5vbi5zdHViKCkucmV0dXJucyh7IGFkZDogc2lub24uc3R1YigpIH0pLFxuICAgICAgICAgIHVybDogc2lub24uc3R1YigpLnJldHVybnMoJy9hcGkvdjIvdGV0aC93YWxsZXQvYWRkJyksXG4gICAgICAgICAgc3VwcGxlbWVudEdlbmVyYXRlV2FsbGV0OiBzaW5vbi5zdHViKCkuY2FsbHNGYWtlKChwYXJhbXM6IGFueSkgPT4gUHJvbWlzZS5yZXNvbHZlKHBhcmFtcykpLFxuICAgICAgICAgIC4uLmNvaW5PdmVycmlkZXMsXG4gICAgICAgIH07XG5cbiAgICAgICAgc2lub24uc3R1YihFQ0RTQVV0aWxzLkVjZHNhTVBDdjJVdGlscy5wcm90b3R5cGUsICdjcmVhdGVLZXljaGFpbnNXaXRoRXh0ZXJuYWxTaWduZXInKS5yZXNvbHZlcyh7XG4gICAgICAgICAgdXNlcktleWNoYWluOiB7IGlkOiAndXNlci1rZXktaWQnLCBjb21tb25LZXljaGFpbiwgdHlwZTogJ3RzcycgfSxcbiAgICAgICAgICBiYWNrdXBLZXljaGFpbjogeyBpZDogJ2JhY2t1cC1rZXktaWQnLCBjb21tb25LZXljaGFpbiwgdHlwZTogJ3RzcycgfSxcbiAgICAgICAgICBiaXRnb0tleWNoYWluOiB7IGlkOiAnYml0Z28ta2V5LWlkJywgY29tbW9uS2V5Y2hhaW4sIHR5cGU6ICd0c3MnIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBuZXcgV2FsbGV0cyhpbnRlZ3JhdGlvbkJpdEdvIGFzIGFueSwgaW50ZWdyYXRpb25Db2luIGFzIGFueSk7XG4gICAgICB9XG5cbiAgICAgIGl0KCdzaG91bGQgcGFzcyBhZHZhbmNlZCB3YWxsZXQgdHlwZSB0aHJvdWdoIHRvIHdhbGxldC9hZGQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGludGVncmF0aW9uV2FsbGV0cyA9IGNyZWF0ZUludGVncmF0aW9uV2FsbGV0cygpO1xuXG4gICAgICAgIGF3YWl0IGludGVncmF0aW9uV2FsbGV0cy5nZW5lcmF0ZVdhbGxldFdpdGhFeHRlcm5hbFNpZ25lcih7XG4gICAgICAgICAgbGFiZWw6ICdBZHZhbmNlZCBUU1MgV2FsbGV0JyxcbiAgICAgICAgICB0eXBlOiAnYWR2YW5jZWQnLFxuICAgICAgICAgIG11bHRpc2lnVHlwZTogJ3RzcycsXG4gICAgICAgICAgZW50ZXJwcmlzZTogJ2VudGVycHJpc2UtaWQnLFxuICAgICAgICAgIGVjZHNhTVBDdjJDYWxsYmFja3M6IGludGVncmF0aW9uQ2FsbGJhY2tzLFxuICAgICAgICB9KTtcblxuICAgICAgICBzZW5kLmZpcnN0Q2FsbC5hcmdzWzBdLnR5cGUuc2hvdWxkLmVxdWFsKCdhZHZhbmNlZCcpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgZGVmYXVsdCBFVk0gd2FsbGV0VmVyc2lvbiB0byA1IHdoZW4gVFNTIHNldHRpbmdzIHNwZWNpZnkgTVBDdjInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGludGVncmF0aW9uV2FsbGV0cyA9IGNyZWF0ZUludGVncmF0aW9uV2FsbGV0cyhcbiAgICAgICAgICB7IGlzRVZNOiBzaW5vbi5zdHViKCkucmV0dXJucyh0cnVlKSB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGdldDogc2lub24uc3R1YigpLnJldHVybnMoe1xuICAgICAgICAgICAgICByZXN1bHQ6IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7XG4gICAgICAgICAgICAgICAgY29pblNldHRpbmdzOiB7IGV0aDogeyB3YWxsZXRDcmVhdGlvblNldHRpbmdzOiB7IG11bHRpU2lnVHlwZVZlcnNpb246ICdNUEN2MicgfSB9IH0sXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICAgIGF3YWl0IGludGVncmF0aW9uV2FsbGV0cy5nZW5lcmF0ZVdhbGxldFdpdGhFeHRlcm5hbFNpZ25lcih7XG4gICAgICAgICAgbGFiZWw6ICdFVk0gVFNTIFdhbGxldCcsXG4gICAgICAgICAgdHlwZTogJ2FkdmFuY2VkJyxcbiAgICAgICAgICBtdWx0aXNpZ1R5cGU6ICd0c3MnLFxuICAgICAgICAgIGVudGVycHJpc2U6ICdlbnRlcnByaXNlLWlkJyxcbiAgICAgICAgICBlY2RzYU1QQ3YyQ2FsbGJhY2tzOiBpbnRlZ3JhdGlvbkNhbGxiYWNrcyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgc2VuZC5maXJzdENhbGwuYXJnc1swXS53YWxsZXRWZXJzaW9uLnNob3VsZC5lcXVhbCg1KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGZvcndhcmQgZXhwbGljaXQgd2FsbGV0VmVyc2lvbiB0byB3YWxsZXQvYWRkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBpbnRlZ3JhdGlvbldhbGxldHMgPSBjcmVhdGVJbnRlZ3JhdGlvbldhbGxldHMoeyBpc0VWTTogc2lub24uc3R1YigpLnJldHVybnModHJ1ZSkgfSk7XG5cbiAgICAgICAgYXdhaXQgaW50ZWdyYXRpb25XYWxsZXRzLmdlbmVyYXRlV2FsbGV0V2l0aEV4dGVybmFsU2lnbmVyKHtcbiAgICAgICAgICBsYWJlbDogJ0VWTSBUU1MgV2FsbGV0IHY2JyxcbiAgICAgICAgICB0eXBlOiAnYWR2YW5jZWQnLFxuICAgICAgICAgIG11bHRpc2lnVHlwZTogJ3RzcycsXG4gICAgICAgICAgZW50ZXJwcmlzZTogJ2VudGVycHJpc2UtaWQnLFxuICAgICAgICAgIHdhbGxldFZlcnNpb246IDYsXG4gICAgICAgICAgZWNkc2FNUEN2MkNhbGxiYWNrczogaW50ZWdyYXRpb25DYWxsYmFja3MsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHNlbmQuZmlyc3RDYWxsLmFyZ3NbMF0ud2FsbGV0VmVyc2lvbi5zaG91bGQuZXF1YWwoNik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dlbmVyYXRlV2FsbGV0V2l0aEV4dGVybmFsU2lnbmVyIC0gRWREU0EgVFNTJywgZnVuY3Rpb24gKCkge1xuICAgIGxldCBlZGRzYUNhbGxiYWNrczogRWRkc2FLZXlHZW5DYWxsYmFja3M7XG4gICAgbGV0IGVkZHNhTW9ja0Jhc2VDb2luOiBhbnk7XG4gICAgbGV0IGVkZHNhV2FsbGV0czogV2FsbGV0cztcblxuICAgIGNvbnN0IGNvbW1vbktleWNoYWluID0gJ2VkZHNhLWNvbW1vbi1rZXljaGFpbic7XG5cbiAgICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGtleVNoYXJlID0gKHB1Yjogc3RyaW5nLCBwcnY6IHN0cmluZywgcHJvb2Y6IHN0cmluZykgPT4gKHtcbiAgICAgICAgcHVibGljU2hhcmU6IHB1YixcbiAgICAgICAgcHJpdmF0ZVNoYXJlOiBwcnYsXG4gICAgICAgIHByaXZhdGVTaGFyZVByb29mOiBwcm9vZixcbiAgICAgICAgdnNzUHJvb2Y6IGAke3Byb29mfS12c3NgLFxuICAgICAgICBncGdLZXk6IGAke3B1Yn0tZ3BnYCxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgbXBjU3RhdGUgPSB7IGVuY3J5cHRlZERhdGE6ICdkYXRhJywgZW5jcnlwdGVkRGF0YUtleTogJ2RhdGEta2V5JyB9O1xuICAgICAgZWRkc2FDYWxsYmFja3MgPSB7XG4gICAgICAgIGluaXRpYWxpemVDYWxsYmFjazogc2lub24uc3R1YigpLnJlc29sdmVzKHtcbiAgICAgICAgICB1c2VyR3BnUHVibGljS2V5OiAndXNlci1ncGctcHViJyxcbiAgICAgICAgICBiYWNrdXBHcGdQdWJsaWNLZXk6ICdiYWNrdXAtZ3BnLXB1YicsXG4gICAgICAgICAgdXNlclRvQml0Z29LZXlTaGFyZToga2V5U2hhcmUoJ3VwdWInLCAndXBydi1lbmMnLCAndXByb29mJyksXG4gICAgICAgICAgYmFja3VwVG9CaXRnb0tleVNoYXJlOiBrZXlTaGFyZSgnYnB1YicsICdicHJ2LWVuYycsICdicHJvb2YnKSxcbiAgICAgICAgICB1c2VyU3RhdGU6IG1wY1N0YXRlLFxuICAgICAgICAgIGJhY2t1cFN0YXRlOiBtcGNTdGF0ZSxcbiAgICAgICAgICBiYWNrdXBUb1VzZXJDb3VudGVyUGFydHlLZXlTaGFyZToga2V5U2hhcmUoJ3VjcCcsICd1Y3AtcHJ2JywgJ3VjcC1wcm9vZicpLFxuICAgICAgICB9KSxcbiAgICAgICAgZmluYWxpemVDYWxsYmFjazogc2lub24uc3R1YigpLnJlc29sdmVzKHsgY29tbW9uS2V5Y2hhaW4gfSksXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBtb2NrRWRkc2FCaXRHbyA9IHtcbiAgICAgICAgcG9zdDogc2lub24uc3R1YigpLnJldHVybnMoe1xuICAgICAgICAgIHNlbmQ6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKHsgcmVzdWx0OiBzaW5vbi5zdHViKCkucmVzb2x2ZXMoeyBpZDogJ2VkZHNhLXdhbGxldC1pZCcgfSkgfSksXG4gICAgICAgIH0pLFxuICAgICAgICBzZXRSZXF1ZXN0VHJhY2VyOiBzaW5vbi5zdHViKCksXG4gICAgICB9O1xuXG4gICAgICBlZGRzYU1vY2tCYXNlQ29pbiA9IHtcbiAgICAgICAgaXNFVk06IHNpbm9uLnN0dWIoKS5yZXR1cm5zKGZhbHNlKSxcbiAgICAgICAgc3VwcG9ydHNUc3M6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKHRydWUpLFxuICAgICAgICBnZXRNUENBbGdvcml0aG06IHNpbm9uLnN0dWIoKS5yZXR1cm5zKCdlZGRzYScpLFxuICAgICAgICBnZXRGYW1pbHk6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKCdzb2wnKSxcbiAgICAgICAgZ2V0Q2hhaW46IHNpbm9uLnN0dWIoKS5yZXR1cm5zKCd0c29sJyksXG4gICAgICAgIGdldERlZmF1bHRNdWx0aXNpZ1R5cGU6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKCd0c3MnKSxcbiAgICAgICAga2V5Y2hhaW5zOiBzaW5vbi5zdHViKCkucmV0dXJucyh7IGFkZDogc2lub24uc3R1YigpIH0pLFxuICAgICAgICB1cmw6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKCcvYXBpL3YyL3Rzb2wvd2FsbGV0L2FkZCcpLFxuICAgICAgICBnZXRDb25maWc6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKHsgZmVhdHVyZXM6IFtdIH0pLFxuICAgICAgICBzdXBwbGVtZW50R2VuZXJhdGVXYWxsZXQ6IHNpbm9uLnN0dWIoKS5jYWxsc0Zha2UoKHBhcmFtczogYW55KSA9PiBQcm9taXNlLnJlc29sdmUocGFyYW1zKSksXG4gICAgICB9O1xuXG4gICAgICBlZGRzYVdhbGxldHMgPSBuZXcgV2FsbGV0cyhtb2NrRWRkc2FCaXRHbyBhcyBhbnksIGVkZHNhTW9ja0Jhc2VDb2luKTtcbiAgICAgIHNpbm9uLnN0dWIoZWRkc2FXYWxsZXRzIGFzIGFueSwgJ2dlbmVyYXRlTXBjV2FsbGV0V2l0aEV4dGVybmFsU2lnbmVyJykucmVzb2x2ZXMoe1xuICAgICAgICByZXNwb25zZVR5cGU6ICdXYWxsZXRXaXRoS2V5Y2hhaW5zJyBhcyBjb25zdCxcbiAgICAgICAgd2FsbGV0OiBzaW5vbi5jcmVhdGVTdHViSW5zdGFuY2UoV2FsbGV0KSxcbiAgICAgICAgdXNlcktleWNoYWluOiB7IGlkOiAndXNlci1rZXktaWQnLCBjb21tb25LZXljaGFpbiwgdHlwZTogJ3RzcycgfSxcbiAgICAgICAgYmFja3VwS2V5Y2hhaW46IHsgaWQ6ICdiYWNrdXAta2V5LWlkJywgY29tbW9uS2V5Y2hhaW4sIHR5cGU6ICd0c3MnIH0sXG4gICAgICAgIGJpdGdvS2V5Y2hhaW46IHsgaWQ6ICdiaXRnby1rZXktaWQnLCBjb21tb25LZXljaGFpbiwgdHlwZTogJ3RzcycgfSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByb3V0ZSB0byBnZW5lcmF0ZU1wY1dhbGxldFdpdGhFeHRlcm5hbFNpZ25lciBmb3IgdHNzIEVkRFNBIGNvaW4nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlZGRzYVdhbGxldHMuZ2VuZXJhdGVXYWxsZXRXaXRoRXh0ZXJuYWxTaWduZXIoe1xuICAgICAgICBsYWJlbDogJ0VkRFNBIFRTUyBXYWxsZXQnLFxuICAgICAgICBtdWx0aXNpZ1R5cGU6ICd0c3MnLFxuICAgICAgICBlbnRlcnByaXNlOiAnZW50ZXJwcmlzZS1pZCcsXG4gICAgICAgIGVkZHNhQ2FsbGJhY2tzLFxuICAgICAgfSk7XG5cbiAgICAgIHJlc3VsdC5yZXNwb25zZVR5cGUuc2hvdWxkLmVxdWFsKCdXYWxsZXRXaXRoS2V5Y2hhaW5zJyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoKGVkZHNhV2FsbGV0cyBhcyBhbnkpLmdlbmVyYXRlTXBjV2FsbGV0V2l0aEV4dGVybmFsU2lnbmVyLmNhbGxlZE9uY2UsIHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3Qgd2l0aG91dCBlZGRzYUNhbGxiYWNrcyBmb3IgZWRkc2EgY29pbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNpbm9uLnJlc3RvcmUoKTtcbiAgICAgIGVkZHNhTW9ja0Jhc2VDb2luLmdldE1QQ0FsZ29yaXRobSA9IHNpbm9uLnN0dWIoKS5yZXR1cm5zKCdlZGRzYScpO1xuXG4gICAgICBhd2FpdCBlZGRzYVdhbGxldHNcbiAgICAgICAgLmdlbmVyYXRlV2FsbGV0V2l0aEV4dGVybmFsU2lnbmVyKHtcbiAgICAgICAgICBsYWJlbDogJ0VkRFNBIFRTUyBXYWxsZXQnLFxuICAgICAgICAgIG11bHRpc2lnVHlwZTogJ3RzcycsXG4gICAgICAgICAgZW50ZXJwcmlzZTogJ2VudGVycHJpc2UtaWQnLFxuICAgICAgICB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnZWRkc2FDYWxsYmFja3MgaXMgcmVxdWlyZWQgZm9yIEVkRFNBIFRTUyB3YWxsZXQgZ2VuZXJhdGlvbiB3aXRoIGV4dGVybmFsIHNpZ25lcicpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZ2VuZXJhdGVXYWxsZXQgd2l0aCBjcmVhdGVLZXljaGFpbkNhbGxiYWNrJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgZGVsZWdhdGUgdG8gZ2VuZXJhdGVXYWxsZXRXaXRoRXh0ZXJuYWxTaWduZXInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBnZW5lcmF0ZVdhbGxldFdpdGhFeHRlcm5hbFNpZ25lclN0dWIgPSBzaW5vbi5zdHViKHdhbGxldHMsICdnZW5lcmF0ZVdhbGxldFdpdGhFeHRlcm5hbFNpZ25lcicpLnJlc29sdmVzKHtcbiAgICAgICAgcmVzcG9uc2VUeXBlOiAnV2FsbGV0V2l0aEtleWNoYWlucycsXG4gICAgICAgIHdhbGxldDogc2lub24uY3JlYXRlU3R1Ykluc3RhbmNlKFdhbGxldCksXG4gICAgICAgIHVzZXJLZXljaGFpbjogeyBpZDogJ3VzZXIta2V5LWlkJywgcHViOiB1c2VyUHViLCB0eXBlOiAnaW5kZXBlbmRlbnQnIGFzIGNvbnN0IH0sXG4gICAgICAgIGJhY2t1cEtleWNoYWluOiB7IGlkOiAnYmFja3VwLWtleS1pZCcsIHB1YjogYmFja3VwUHViLCB0eXBlOiAnaW5kZXBlbmRlbnQnIGFzIGNvbnN0IH0sXG4gICAgICAgIGJpdGdvS2V5Y2hhaW46IHsgaWQ6ICdiaXRnby1rZXktaWQnLCBwdWI6IGJpdGdvUHViLCB0eXBlOiAnaW5kZXBlbmRlbnQnIGFzIGNvbnN0IH0sXG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgd2FsbGV0cy5nZW5lcmF0ZVdhbGxldCh7XG4gICAgICAgIGxhYmVsOiAnRGVsZWdhdGVkIFdhbGxldCcsXG4gICAgICAgIGNyZWF0ZUtleWNoYWluQ2FsbGJhY2ssXG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGdlbmVyYXRlV2FsbGV0V2l0aEV4dGVybmFsU2lnbmVyU3R1Yi5jYWxsZWRPbmNlLCB0cnVlKTtcbiAgICAgIGdlbmVyYXRlV2FsbGV0V2l0aEV4dGVybmFsU2lnbmVyU3R1Yi5maXJzdENhbGwuYXJnc1swXS5sYWJlbC5zaG91bGQuZXF1YWwoJ0RlbGVnYXRlZCBXYWxsZXQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IHdoZW4gY3JlYXRlS2V5Y2hhaW5DYWxsYmFjayBpcyBjb21iaW5lZCB3aXRoIHBhc3NwaHJhc2UnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCB3YWxsZXRzXG4gICAgICAgIC5nZW5lcmF0ZVdhbGxldCh7XG4gICAgICAgICAgbGFiZWw6ICdJbnZhbGlkIFdhbGxldCcsXG4gICAgICAgICAgcGFzc3BocmFzZTogJ3NlY3JldCcsXG4gICAgICAgICAgY3JlYXRlS2V5Y2hhaW5DYWxsYmFjayxcbiAgICAgICAgfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ2NyZWF0ZUtleWNoYWluQ2FsbGJhY2sgY2Fubm90IGJlIHVzZWQgd2l0aCBwYXNzcGhyYXNlJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCB3aGVuIGNyZWF0ZUtleWNoYWluQ2FsbGJhY2sgaXMgY29tYmluZWQgd2l0aCB1c2VyS2V5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgd2FsbGV0c1xuICAgICAgICAuZ2VuZXJhdGVXYWxsZXQoe1xuICAgICAgICAgIGxhYmVsOiAnSW52YWxpZCBXYWxsZXQnLFxuICAgICAgICAgIHVzZXJLZXk6ICd4cHViLi4uJyxcbiAgICAgICAgICBjcmVhdGVLZXljaGFpbkNhbGxiYWNrLFxuICAgICAgICB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnY3JlYXRlS2V5Y2hhaW5DYWxsYmFjayBjYW5ub3QgYmUgdXNlZCB3aXRoIHVzZXJLZXknKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==