@bitgo/sdk-coin-algo 2.6.2 → 2.7.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.
@@ -41,6 +41,9 @@ const sdk_test_1 = require("@bitgo/sdk-test");
41
41
  const sdk_api_1 = require("@bitgo/sdk-api");
42
42
  const testData = __importStar(require("../fixtures/resources"));
43
43
  const assert_1 = __importDefault(require("assert"));
44
+ const nock = require("nock");
45
+ const sinon = __importStar(require("sinon"));
46
+ const sdk_core_1 = require("@bitgo/sdk-core");
44
47
  describe('Algorand Verify Transaction:', function () {
45
48
  let bitgo;
46
49
  let basecoin;
@@ -50,6 +53,10 @@ describe('Algorand Verify Transaction:', function () {
50
53
  bitgo.initializeTestVars();
51
54
  basecoin = bitgo.coin('talgo');
52
55
  });
56
+ afterEach(function () {
57
+ sinon.restore();
58
+ nock.cleanAll();
59
+ });
53
60
  describe('Parameter Validation', () => {
54
61
  it('should throw error when txParams is missing', async function () {
55
62
  const txPrebuild = {
@@ -290,5 +297,407 @@ describe('Algorand Verify Transaction:', function () {
290
297
  assert_1.default.strictEqual(result, true);
291
298
  });
292
299
  });
300
+ describe('Consolidation Verification', () => {
301
+ it('should verify consolidation through sendAccountConsolidations with nock - positive case', async function () {
302
+ // This test verifies that sendAccountConsolidations allows valid consolidation transactions
303
+ // It calls verifyTransaction, which should pass when the tx sends to the correct rootAddress
304
+ const walletData = {
305
+ id: '6434384f1deb5200070345111cba7405',
306
+ coin: 'talgo',
307
+ keys: [
308
+ '6434383c40af290007578fdb89c69028',
309
+ '6434383c9e52490007e6f69f5523c82e',
310
+ '6434383e4b5a440007289caeebf76225',
311
+ ],
312
+ coinSpecific: {
313
+ rootAddress: testData.consolidation.rootAddress, // Correct rootAddress
314
+ addressVersion: 1,
315
+ trustedTokens: [],
316
+ },
317
+ multisigType: 'onchain',
318
+ };
319
+ const consolidationTx = {
320
+ txHex: testData.consolidation.txHex, // Sends to rootAddress
321
+ txHash: testData.consolidation.txId,
322
+ feeInfo: {
323
+ size: 247,
324
+ fee: 1000,
325
+ feeRate: 4,
326
+ feeString: '1000',
327
+ },
328
+ keys: [
329
+ '42MIYL2KBISV6WJRALTTSXHBEGLNF7MMQ74FGSYUCT5YP3V2KENJGRFVVQ',
330
+ 'MAGXZTDFW5QEXUKOUDIGHTXOKDW7TNQEDLWPBEZEL3VFU3YAA2PGYRS65M',
331
+ 'IBHXE4L4HCGJSXJACQAM6ZU6JHTLDEQNVNDZ25TJVX5W43B3AQRMB4VEDU',
332
+ ],
333
+ addressVersion: 1,
334
+ consolidateId: '690572bd61f0a4695dd8710ae6c185cc',
335
+ coin: 'talgo',
336
+ };
337
+ const bgUrl = sdk_core_1.common.Environments['mock'].uri;
338
+ const walletObj = new sdk_core_1.Wallet(bitgo, basecoin, walletData);
339
+ // Mock the consolidateAccount/build API call
340
+ nock(bgUrl)
341
+ .post('/api/v2/talgo/wallet/6434384f1deb5200070345111cba7405/consolidateAccount/build')
342
+ .reply(200, [consolidationTx]);
343
+ // Mock getKeychainsAndValidatePassphrase
344
+ sinon.stub(walletObj, 'getKeychainsAndValidatePassphrase').resolves([]);
345
+ // The key test: should NOT throw the consolidation verification error
346
+ // because the transaction sends to the correct rootAddress
347
+ try {
348
+ await walletObj.sendAccountConsolidations({ walletPassphrase: 'test' });
349
+ // If we get here without throwing, the verification passed
350
+ assert_1.default.ok(true, 'Consolidation verification passed - no error thrown');
351
+ }
352
+ catch (error) {
353
+ // If an error is thrown, it should NOT be the consolidation mismatch error
354
+ // (other errors like signing errors are okay since we're not fully mocking everything)
355
+ if (error.message === 'Consolidation transaction recipient does not match wallet base address') {
356
+ assert_1.default.fail('Should not throw consolidation verification error for valid transaction');
357
+ }
358
+ // Other errors are acceptable in this test (e.g., incomplete mocking of signing)
359
+ }
360
+ });
361
+ it('should reject malicious consolidation through sendAccountConsolidations with nock', async function () {
362
+ // This test verifies that sendAccountConsolidations rejects malicious transactions
363
+ // We use a wallet configured with the WRONG rootAddress to simulate a mismatch
364
+ const walletData = {
365
+ id: '6434384f1deb5200070345111cba7405',
366
+ coin: 'talgo',
367
+ keys: [
368
+ '6434383c40af290007578fdb89c69028',
369
+ '6434383c9e52490007e6f69f5523c82e',
370
+ '6434383e4b5a440007289caeebf76225',
371
+ ],
372
+ coinSpecific: {
373
+ rootAddress: testData.consolidation.receiveAddress, // WRONG: not where the tx sends
374
+ addressVersion: 1,
375
+ trustedTokens: [],
376
+ },
377
+ multisigType: 'onchain',
378
+ };
379
+ // The txHex sends to testData.consolidation.rootAddress, but wallet expects receiveAddress
380
+ const consolidationTx = {
381
+ txHex: testData.consolidation.txHex, // Sends to rootAddress (not receiveAddress)
382
+ txHash: testData.consolidation.txId,
383
+ feeInfo: {
384
+ size: 247,
385
+ fee: 1000,
386
+ feeRate: 4,
387
+ feeString: '1000',
388
+ },
389
+ keys: [
390
+ '42MIYL2KBISV6WJRALTTSXHBEGLNF7MMQ74FGSYUCT5YP3V2KENJGRFVVQ',
391
+ 'MAGXZTDFW5QEXUKOUDIGHTXOKDW7TNQEDLWPBEZEL3VFU3YAA2PGYRS65M',
392
+ 'IBHXE4L4HCGJSXJACQAM6ZU6JHTLDEQNVNDZ25TJVX5W43B3AQRMB4VEDU',
393
+ ],
394
+ addressVersion: 1,
395
+ consolidateId: '690572bd61f0a4695dd8710ae6c185cc',
396
+ coin: 'talgo',
397
+ };
398
+ const bgUrl = sdk_core_1.common.Environments['mock'].uri;
399
+ const walletObj = new sdk_core_1.Wallet(bitgo, basecoin, walletData);
400
+ // Mock the consolidateAccount/build API call
401
+ nock(bgUrl)
402
+ .post('/api/v2/talgo/wallet/6434384f1deb5200070345111cba7405/consolidateAccount/build')
403
+ .reply(200, [consolidationTx]);
404
+ // Mock getKeychainsAndValidatePassphrase
405
+ sinon.stub(walletObj, 'getKeychainsAndValidatePassphrase').resolves([]);
406
+ // The verification should catch this and throw an error BEFORE signing/sending
407
+ await assert_1.default.rejects(walletObj.sendAccountConsolidations({ walletPassphrase: 'test' }), (error) => {
408
+ assert_1.default.strictEqual(error.message, 'Consolidation transaction recipient does not match wallet base address');
409
+ return true;
410
+ });
411
+ });
412
+ it('should verify consolidation flow as called from sendAccountConsolidations', async function () {
413
+ // This test simulates how sendAccountConsolidations calls verifyTransaction
414
+ // It uses the real consolidation data and mimics the wallet structure
415
+ const mockWallet = {
416
+ _wallet: {
417
+ coinSpecific: {
418
+ rootAddress: testData.consolidation.rootAddress,
419
+ addressVersion: 1,
420
+ trustedTokens: [],
421
+ },
422
+ multisigType: 'onchain',
423
+ },
424
+ coinSpecific: function () {
425
+ return this._wallet.coinSpecific;
426
+ },
427
+ };
428
+ // This is the build result from buildAccountConsolidations
429
+ const build = {
430
+ txHex: testData.consolidation.txHex,
431
+ consolidateId: '690572bd61f0a4695dd8710ae6c185cc',
432
+ coin: 'talgo',
433
+ };
434
+ // This is what sendAccountConsolidations does: verify with consolidationToBaseAddress
435
+ const result = await basecoin.verifyTransaction({
436
+ txPrebuild: build,
437
+ txParams: {}, // sendAccountConsolidations passes empty params from the build call
438
+ verification: {
439
+ consolidationToBaseAddress: true,
440
+ },
441
+ wallet: mockWallet,
442
+ walletType: mockWallet._wallet.multisigType,
443
+ });
444
+ assert_1.default.strictEqual(result, true);
445
+ });
446
+ it('should reject malicious consolidation with wrong recipient in sendAccountConsolidations flow', async function () {
447
+ // This test simulates a malicious transaction that tries to send to a different address
448
+ // The verification should catch this and throw an error
449
+ const mockWallet = {
450
+ _wallet: {
451
+ coinSpecific: {
452
+ rootAddress: testData.consolidation.receiveAddress, // WRONG: This is not where the tx is sending
453
+ addressVersion: 1,
454
+ trustedTokens: [],
455
+ },
456
+ multisigType: 'onchain',
457
+ },
458
+ coinSpecific: function () {
459
+ return this._wallet.coinSpecific;
460
+ },
461
+ };
462
+ const build = {
463
+ txHex: testData.consolidation.txHex, // This sends to rootAddress, not receiveAddress
464
+ consolidateId: '690572bd61f0a4695dd8710ae6c185cc',
465
+ coin: 'talgo',
466
+ };
467
+ // This should throw because the transaction recipient doesn't match the wallet's rootAddress
468
+ await assert_1.default.rejects(basecoin.verifyTransaction({
469
+ txPrebuild: build,
470
+ txParams: {},
471
+ verification: {
472
+ consolidationToBaseAddress: true,
473
+ },
474
+ wallet: mockWallet,
475
+ walletType: mockWallet._wallet.multisigType,
476
+ }), {
477
+ message: 'Consolidation transaction recipient does not match wallet base address',
478
+ });
479
+ });
480
+ it('should verify real consolidation transaction with valid rootAddress', async function () {
481
+ // Using real consolidation transaction data from actual wallet
482
+ const mockWallet = {
483
+ coinSpecific: () => ({
484
+ rootAddress: testData.consolidation.rootAddress,
485
+ }),
486
+ };
487
+ const txParams = {
488
+ recipients: [
489
+ {
490
+ address: testData.consolidation.rootAddress,
491
+ amount: testData.consolidation.amount,
492
+ },
493
+ ],
494
+ };
495
+ const txPrebuild = {
496
+ txHex: testData.consolidation.txHex,
497
+ };
498
+ const result = await basecoin.verifyTransaction({
499
+ txParams,
500
+ txPrebuild,
501
+ wallet: mockWallet,
502
+ verification: {
503
+ consolidationToBaseAddress: true,
504
+ },
505
+ });
506
+ assert_1.default.strictEqual(result, true);
507
+ });
508
+ it('should reject consolidation when recipient does not match rootAddress', async function () {
509
+ // Using different rootAddress than what's in the consolidation transaction
510
+ const mockWallet = {
511
+ coinSpecific: () => ({
512
+ rootAddress: testData.consolidation.receiveAddress, // Wrong: using receive address instead of root
513
+ }),
514
+ };
515
+ const txParams = {
516
+ recipients: [
517
+ {
518
+ address: testData.consolidation.rootAddress,
519
+ amount: testData.consolidation.amount,
520
+ },
521
+ ],
522
+ };
523
+ const txPrebuild = {
524
+ txHex: testData.consolidation.txHex,
525
+ };
526
+ await assert_1.default.rejects(basecoin.verifyTransaction({
527
+ txParams,
528
+ txPrebuild,
529
+ wallet: mockWallet,
530
+ verification: {
531
+ consolidationToBaseAddress: true,
532
+ },
533
+ }), {
534
+ message: 'Consolidation transaction recipient does not match wallet base address',
535
+ });
536
+ });
537
+ it('should handle missing rootAddress in wallet coinSpecific', async function () {
538
+ const mockWallet = {
539
+ coinSpecific: () => ({}),
540
+ };
541
+ const txParams = {
542
+ recipients: [
543
+ {
544
+ address: testData.consolidation.rootAddress,
545
+ amount: testData.consolidation.amount,
546
+ },
547
+ ],
548
+ };
549
+ const txPrebuild = {
550
+ txHex: testData.consolidation.txHex,
551
+ };
552
+ await assert_1.default.rejects(basecoin.verifyTransaction({
553
+ txParams,
554
+ txPrebuild,
555
+ wallet: mockWallet,
556
+ verification: {
557
+ consolidationToBaseAddress: true,
558
+ },
559
+ }), {
560
+ message: 'Unable to determine base address for consolidation',
561
+ });
562
+ });
563
+ it('should handle consolidation verification for token transfers (axfer)', async function () {
564
+ // Using asset transfer transaction to root address
565
+ const rootAddress = testData.accounts.account2.address;
566
+ const mockWallet = {
567
+ coinSpecific: () => ({
568
+ rootAddress: rootAddress,
569
+ }),
570
+ };
571
+ const txParams = {
572
+ recipients: [
573
+ {
574
+ address: rootAddress,
575
+ amount: '1000',
576
+ },
577
+ ],
578
+ };
579
+ const txPrebuild = {
580
+ txHex: testData.rawTx.assetTransfer.unsigned,
581
+ };
582
+ const result = await basecoin.verifyTransaction({
583
+ txParams,
584
+ txPrebuild,
585
+ wallet: mockWallet,
586
+ verification: {
587
+ consolidationToBaseAddress: true,
588
+ },
589
+ });
590
+ assert_1.default.strictEqual(result, true);
591
+ });
592
+ it('should reject consolidation for token transfer when recipient does not match rootAddress', async function () {
593
+ const rootAddress = testData.accounts.account1.address; // Different from transaction recipient
594
+ const mockWallet = {
595
+ coinSpecific: () => ({
596
+ rootAddress: rootAddress,
597
+ }),
598
+ };
599
+ const txParams = {
600
+ recipients: [
601
+ {
602
+ address: testData.accounts.account2.address,
603
+ amount: '1000',
604
+ },
605
+ ],
606
+ };
607
+ const txPrebuild = {
608
+ txHex: testData.rawTx.assetTransfer.unsigned,
609
+ };
610
+ await assert_1.default.rejects(basecoin.verifyTransaction({
611
+ txParams,
612
+ txPrebuild,
613
+ wallet: mockWallet,
614
+ verification: {
615
+ consolidationToBaseAddress: true,
616
+ },
617
+ }), {
618
+ message: 'Consolidation transaction recipient does not match wallet base address',
619
+ });
620
+ });
621
+ it('should pass verification when consolidationToBaseAddress is not set', async function () {
622
+ // Using real consolidation tx but with wrong rootAddress - should still pass because verification is disabled
623
+ const mockWallet = {
624
+ coinSpecific: () => ({
625
+ rootAddress: testData.consolidation.receiveAddress, // Different from transaction recipient
626
+ }),
627
+ };
628
+ const txParams = {
629
+ recipients: [
630
+ {
631
+ address: testData.consolidation.rootAddress,
632
+ amount: testData.consolidation.amount,
633
+ },
634
+ ],
635
+ };
636
+ const txPrebuild = {
637
+ txHex: testData.consolidation.txHex,
638
+ };
639
+ // Should not throw error even though recipient doesn't match rootAddress
640
+ // because consolidationToBaseAddress verification is not enabled
641
+ const result = await basecoin.verifyTransaction({
642
+ txParams,
643
+ txPrebuild,
644
+ wallet: mockWallet,
645
+ verification: {
646
+ consolidationToBaseAddress: false,
647
+ },
648
+ });
649
+ assert_1.default.strictEqual(result, true);
650
+ });
651
+ it('should pass verification when verification object is not provided', async function () {
652
+ // Using real consolidation tx but with wrong rootAddress - should still pass because no verification
653
+ const mockWallet = {
654
+ coinSpecific: () => ({
655
+ rootAddress: testData.consolidation.receiveAddress, // Different from transaction recipient
656
+ }),
657
+ };
658
+ const txParams = {
659
+ recipients: [
660
+ {
661
+ address: testData.consolidation.rootAddress,
662
+ amount: testData.consolidation.amount,
663
+ },
664
+ ],
665
+ };
666
+ const txPrebuild = {
667
+ txHex: testData.consolidation.txHex,
668
+ };
669
+ // Should not throw error even though recipient doesn't match rootAddress
670
+ // because no verification object is provided
671
+ const result = await basecoin.verifyTransaction({
672
+ txParams,
673
+ txPrebuild,
674
+ wallet: mockWallet,
675
+ });
676
+ assert_1.default.strictEqual(result, true);
677
+ });
678
+ it('should handle missing wallet when consolidation verification is enabled', async function () {
679
+ const txParams = {
680
+ recipients: [
681
+ {
682
+ address: testData.consolidation.rootAddress,
683
+ amount: testData.consolidation.amount,
684
+ },
685
+ ],
686
+ };
687
+ const txPrebuild = {
688
+ txHex: testData.consolidation.txHex,
689
+ };
690
+ await assert_1.default.rejects(basecoin.verifyTransaction({
691
+ txParams,
692
+ txPrebuild,
693
+ wallet: undefined,
694
+ verification: {
695
+ consolidationToBaseAddress: true,
696
+ },
697
+ }), {
698
+ message: 'Unable to determine base address for consolidation',
699
+ });
700
+ });
701
+ });
293
702
  });
294
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyaWZ5VHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdmVyaWZ5VHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxtQ0FBa0M7QUFDbEMsOENBQTBEO0FBQzFELDRDQUEwQztBQUMxQyxnRUFBa0Q7QUFDbEQsb0RBQTRCO0FBRTVCLFFBQVEsQ0FBQyw4QkFBOEIsRUFBRTtJQUN2QyxJQUFJLEtBQW1CLENBQUM7SUFDeEIsSUFBSSxRQUFlLENBQUM7SUFFcEIsTUFBTSxDQUFDO1FBQ0wsS0FBSyxHQUFHLG9CQUFTLENBQUMsUUFBUSxDQUFDLGtCQUFRLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN0RCxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxXQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDbEQsS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDM0IsUUFBUSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFVLENBQUM7SUFDMUMsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsc0JBQXNCLEVBQUUsR0FBRyxFQUFFO1FBQ3BDLEVBQUUsQ0FBQyw2Q0FBNkMsRUFBRSxLQUFLO1lBQ3JELE1BQU0sVUFBVSxHQUFHO2dCQUNqQixLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBUTthQUN4QyxDQUFDO1lBRUYsTUFBTSxnQkFBTSxDQUFDLE9BQU8sQ0FDbEIsUUFBUSxDQUFDLGlCQUFpQixDQUFDO2dCQUN6QixVQUFVO2dCQUNWLE1BQU0sRUFBRSxFQUFTO2dCQUNqQixRQUFRLEVBQUUsU0FBZ0I7YUFDM0IsQ0FBQyxFQUNGO2dCQUNFLE9BQU8sRUFBRSxrQkFBa0I7YUFDNUIsQ0FDRixDQUFDO1FBQ0osQ0FB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USxDQUFDLFFBQVE7YUFDeEMsQ0FBQztZQUVGLE1BQU0sTUFBTSxHQUFHLE1BQU0sUUFBUSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsRUFBUyxFQUFFLENBQUMsQ0FBQztZQUM3RixnQkFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGFsZ28gfSBmcm9tICcuLi8uLi9zcmMnO1xuaW1wb3J0IHsgVGVzdEJpdEdvLCBUZXN0Qml0R29BUEkgfSBmcm9tICdAYml0Z28vc2RrLXRlc3QnO1xuaW1wb3J0IHsgQml0R29BUEkgfSBmcm9tICdAYml0Z28vc2RrLWFwaSc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi9maXh0dXJlcy9yZXNvdXJjZXMnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5kZXNjcmliZSgnQWxnb3JhbmQgVmVyaWZ5IFRyYW5zYWN0aW9uOicsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IGJpdGdvOiBUZXN0Qml0R29BUEk7XG4gIGxldCBiYXNlY29pbjogVGFsZ287XG5cbiAgYmVmb3JlKGZ1bmN0aW9uICgpIHtcbiAgICBiaXRnbyA9IFRlc3RCaXRHby5kZWNvcmF0ZShCaXRHb0FQSSwgeyBlbnY6ICdtb2NrJyB9KTtcbiAgICBiaXRnby5zYWZlUmVnaXN0ZXIoJ3RhbGdvJywgVGFsZ28uY3JlYXRlSW5zdGFuY2UpO1xuICAgIGJpdGdvLmluaXRpYWxpemVUZXN0VmFycygpO1xuICAgIGJhc2Vjb2luID0gYml0Z28uY29pbigndGFsZ28nKSBhcyBUYWxnbztcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1BhcmFtZXRlciBWYWxpZGF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3Igd2hlbiB0eFBhcmFtcyBpcyBtaXNzaW5nJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgdHhIZXg6IHRlc3REYXRhLnJhd1R4LnRyYW5zZmVyLnVuc2lnbmVkLFxuICAgICAgfTtcblxuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAgIGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICB0eFByZWJ1aWxkLFxuICAgICAgICAgIHdhbGxldDoge30gYXMgYW55LFxuICAgICAgICAgIHR4UGFyYW1zOiB1bmRlZmluZWQgYXMgYW55LFxuICAgICAgICB9KSxcbiAgICAgICAge1xuICAgICAgICAgIG1lc3NhZ2U6ICdtaXNzaW5nIHR4UGFyYW1zJyxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3Igd2hlbiB0eFByZWJ1aWxkIGlzIG1pc3NpbmcnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eFBhcmFtcyA9IHtcbiAgICAgICAgcmVjaXBpZW50czogW3sgYWRkcmVzczogdGVzdERhdGEuYWNjb3VudHMuYWNjb3VudDIuYWRkcmVzcywgYW1vdW50OiAnMTAwMDAnIH1dLFxuICAgICAgfTtcblxuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAgIGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICB0eFBhcmFtcyxcbiAgICAgICAgICB3YWxsZXQ6IHt9IGFzIGFueSxcbiAgICAgICAgICB0eFByZWJ1aWxkOiB1bmRlZmluZWQgYXMgYW55LFxuICAgICAgICB9KSxcbiAgICAgICAge1xuICAgICAgICAgIG1lc3NhZ2U6ICdtaXNzaW5nIHR4UHJlYnVpbGQnLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciB3aGVuIHR4UHJlYnVpbGQudHhIZXggaXMgbWlzc2luZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4UGFyYW1zID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbeyBhZGRyZXNzOiB0ZXN0RGF0YS5hY2NvdW50cy5hY2NvdW50Mi5hZGRyZXNzLCBhbW91bnQ6ICcxMDAwMCcgfV0sXG4gICAgICB9O1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHt9O1xuXG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7IHR4UGFyYW1zLCB0eFByZWJ1aWxkLCB3YWxsZXQ6IHt9IGFzIGFueSB9KSwge1xuICAgICAgICBtZXNzYWdlOiAnbWlzc2luZyB0eEhleCBpbiB0eFByZWJ1aWxkJyxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUGF5bWVudCBUcmFuc2FjdGlvbiBWYWxpZGF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgdmFsaWQgcGF5bWVudCB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4UGFyYW1zID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuYWNjb3VudHMuYWNjb3VudDIuYWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogJzEwMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHR4UHJlYnVpbGQgPSB7XG4gICAgICAgIHR4SGV4OiB0ZXN0RGF0YS5yYXdUeC50cmFuc2Zlci51bnNpZ25lZCxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHsgdHhQYXJhbXMsIHR4UHJlYnVpbGQsIHdhbGxldDoge30gYXMgYW55IH0pO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgd2l0aCBhbW91bnQgbWlzbWF0Y2gnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eFBhcmFtcyA9IHtcbiAgICAgICAgcmVjaXBpZW50czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLmFjY291bnRzLmFjY291bnQyLmFkZHJlc3MsXG4gICAgICAgICAgICBhbW91bnQ6ICcyMDAwMCcsIC8vIERpZmZlcmVudCBhbW91bnQgdGhhbiBpbiB0aGUgdHJhbnNhY3Rpb25cbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHR4UHJlYnVpbGQgPSB7XG4gICAgICAgIHR4SGV4OiB0ZXN0RGF0YS5yYXdUeC50cmFuc2Zlci51bnNpZ25lZCxcbiAgICAgIH07XG5cbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHsgdHhQYXJhbXMsIHR4UHJlYnVpbGQsIHdhbGxldDoge30gYXMgYW55IH0pLCB7XG4gICAgICAgIG1lc3NhZ2U6ICd0cmFuc2FjdGlvbiBhbW91bnQgaW4gdHhQcmVidWlsZCBkb2VzIG5vdCBtYXRjaCB0aGUgdmFsdWUgZ2l2ZW4gYnkgY2xpZW50JyxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHdpdGggYWRkcmVzcyBtaXNtYXRjaCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4UGFyYW1zID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuYWNjb3VudHMuYWNjb3VudDMuYWRkcmVzcywgLy8gRGlmZmVyZW50IGFkZHJlc3MgdGhhbiBpbiB0cmFuc2FjdGlvblxuICAgICAgICAgICAgYW1vdW50OiAnMTAwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgdHhIZXg6IHRlc3REYXRhLnJhd1R4LnRyYW5zZmVyLnVuc2lnbmVkLFxuICAgICAgfTtcblxuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oeyB0eFBhcmFtcywgdHhQcmVidWlsZCwgd2FsbGV0OiB7fSBhcyBhbnkgfSksIHtcbiAgICAgICAgbWVzc2FnZTogJ2Rlc3RpbmF0aW9uIGFkZHJlc3MgZG9lcyBub3QgbWF0Y2ggd2l0aCB0aGUgcmVjaXBpZW50IGFkZHJlc3MnLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgd2l0aCBtdWx0aXBsZSByZWNpcGllbnRzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhQYXJhbXMgPSB7XG4gICAgICAgIHJlY2lwaWVudHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5hY2NvdW50cy5hY2NvdW50Mi5hZGRyZXNzLFxuICAgICAgICAgICAgYW1vdW50OiAnNTAwMCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5hY2NvdW50cy5hY2NvdW50My5hZGRyZXNzLFxuICAgICAgICAgICAgYW1vdW50OiAnNTAwMCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgICBjb25zdCB0eFByZWJ1aWxkID0ge1xuICAgICAgICB0eEhleDogdGVzdERhdGEucmF3VHgudHJhbnNmZXIudW5zaWduZWQsXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7IHR4UGFyYW1zLCB0eFByZWJ1aWxkLCB3YWxsZXQ6IHt9IGFzIGFueSB9KSwge1xuICAgICAgICBtZXNzYWdlOiAnQWxnb3JhbmQgdHJhbnNhY3Rpb25zIGNhbiBvbmx5IGhhdmUgb25lIHJlY2lwaWVudCcsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgdHJhbnNhY3Rpb24gd2l0aG91dCByZWNpcGllbnRzIGluIHR4UGFyYW1zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhQYXJhbXMgPSB7XG4gICAgICAgIC8vIE5vIHJlY2lwaWVudHMgc3BlY2lmaWVkXG4gICAgICB9O1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgdHhIZXg6IHRlc3REYXRhLnJhd1R4LnRyYW5zZmVyLnVuc2lnbmVkLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oeyB0eFBhcmFtcywgdHhQcmVidWlsZCwgd2FsbGV0OiB7fSBhcyBhbnkgfSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCB0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0Fzc2V0IFRyYW5zZmVyIFRyYW5zYWN0aW9uIFZhbGlkYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSB2YWxpZCBhc3NldCB0cmFuc2ZlciB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4UGFyYW1zID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuYWNjb3VudHMuYWNjb3VudDIuYWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogJzEwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgdHhIZXg6IHRlc3REYXRhLnJhd1R4LmFzc2V0VHJhbnNmZXIudW5zaWduZWQsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7IHR4UGFyYW1zLCB0eFByZWJ1aWxkLCB3YWxsZXQ6IHt9IGFzIGFueSB9KTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsIHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSB0b2tlbiBlbmFibGUgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eFBhcmFtcyA9IHtcbiAgICAgICAgdHlwZTogJ2VuYWJsZXRva2VuJyxcbiAgICAgICAgcmVjaXBpZW50czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLmFjY291bnRzLmFjY291bnQxLmFkZHJlc3MsXG4gICAgICAgICAgICBhbW91bnQ6ICcwJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHR4UHJlYnVpbGQgPSB7XG4gICAgICAgIC8vIFVzaW5nIGV4aXN0aW5nIGFzc2V0IHRyYW5zZmVyIGZvciB0ZXN0IC0gaW4gcmVhbCBzY2VuYXJpbyB0aGlzIHdvdWxkIGJlIGFuIG9wdC1pbiB0cmFuc2FjdGlvblxuICAgICAgICB0eEhleDogdGVzdERhdGEucmF3VHguYXNzZXRUcmFuc2Zlci51bnNpZ25lZCxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHsgdHhQYXJhbXMsIHR4UHJlYnVpbGQsIHdhbGxldDoge30gYXMgYW55IH0pO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgdHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdUcmFuc2FjdGlvbiBTdHJ1Y3R1cmUgVmFsaWRhdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBtYWxmb3JtZWQgdHJhbnNhY3Rpb24gaGV4IGdyYWNlZnVsbHknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eFBhcmFtcyA9IHtcbiAgICAgICAgcmVjaXBpZW50czogW3sgYWRkcmVzczogdGVzdERhdGEuYWNjb3VudHMuYWNjb3VudDIuYWRkcmVzcywgYW1vdW50OiAnMTAwMDAnIH1dLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHR4UHJlYnVpbGQgPSB7XG4gICAgICAgIHR4SGV4OiAnaW52YWxpZF9oZXhfZGF0YScsXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7IHR4UGFyYW1zLCB0eFByZWJ1aWxkLCB3YWxsZXQ6IHt9IGFzIGFueSB9KSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIHRyYW5zYWN0aW9uIHdpdGggbWVtbycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4UGFyYW1zID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuYWNjb3VudHMuYWNjb3VudDIuYWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogJzEwMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHR4UHJlYnVpbGQgPSB7XG4gICAgICAgIHR4SGV4OiB0ZXN0RGF0YS5yYXdUeC50cmFuc2Zlci51bnNpZ25lZCwgLy8gVGhpcyB0cmFuc2FjdGlvbiBpbmNsdWRlcyBhIG1lbW9cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHsgdHhQYXJhbXMsIHR4UHJlYnVpbGQsIHdhbGxldDoge30gYXMgYW55IH0pO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgdHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdFZGdlIENhc2VzJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgaGFuZGxlIHplcm8gYW1vdW50IHRyYW5zYWN0aW9ucycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4UGFyYW1zID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuYWNjb3VudHMuYWNjb3VudDEuYWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogJzAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgLy8gVGhpcyB3b3VsZCBuZWVkIHRvIGJlIGEgdmFsaWQgMC1hbW91bnQgdHJhbnNhY3Rpb24gaGV4XG4gICAgICAgIHR4SGV4OiB0ZXN0RGF0YS5yYXdUeC50cmFuc2Zlci51bnNpZ25lZCxcbiAgICAgIH07XG5cbiAgICAgIC8vIE5vdGU6IFRoaXMgbWlnaHQgZmFpbCBpZiB0aGUgdGVzdCBkYXRhIGRvZXNuJ3QgbWF0Y2ggdGhlIGV4cGVjdGVkIGFtb3VudFxuICAgICAgLy8gSW4gYSByZWFsIHNjZW5hcmlvLCB3ZSdkIG5lZWQgcHJvcGVyIHRlc3QgZGF0YSBmb3IgMC1hbW91bnQgdHJhbnNhY3Rpb25zXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7IHR4UGFyYW1zLCB0eFByZWJ1aWxkLCB3YWxsZXQ6IHt9IGFzIGFueSB9KTtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgdHJ1ZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBFeHBlY3RlZCBpZiBhbW91bnRzIGRvbid0IG1hdGNoXG4gICAgICAgIGFzc2VydC5vayhlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdhbW91bnQnKSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBjbG9zZSByZW1haW5kZXIgdHJhbnNhY3Rpb25zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhQYXJhbXMgPSB7XG4gICAgICAgIHJlY2lwaWVudHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5hY2NvdW50cy5hY2NvdW50My5hZGRyZXNzLFxuICAgICAgICAgICAgYW1vdW50OiAnMTAwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgdHhIZXg6IHRlc3REYXRhLnJhd1R4LnRyYW5zZmVyLnVuc2lnbmVkLFxuICAgICAgfTtcblxuICAgICAgLy8gVGhpcyB0ZXN0IHZhbGlkYXRlcyB0aGF0IHRyYW5zYWN0aW9ucyB3aXRoIGNsb3NlUmVtYWluZGVyVG8gZmllbGQgYXJlIGhhbmRsZWRcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHsgdHhQYXJhbXMsIHR4UHJlYnVpbGQsIHdhbGxldDoge30gYXMgYW55IH0pO1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCB0cnVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIEV4cGVjdGVkIGlmIGFkZHJlc3NlcyBkb24ndCBtYXRjaFxuICAgICAgICBhc3NlcnQub2soZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnYWRkcmVzcycpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ05ldHdvcmsgVmFsaWRhdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIHRyYW5zYWN0aW9ucyBmb3IgZGlmZmVyZW50IG5ldHdvcmtzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gVGVzdCB0aGF0IHRyYW5zYWN0aW9ucyB3b3JrIHJlZ2FyZGxlc3Mgb2YgZ2VuZXNpcyBoYXNoL0lEXG4gICAgICBjb25zdCB0eFBhcmFtcyA9IHtcbiAgICAgICAgcmVjaXBpZW50czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLmFjY291bnRzLmFjY291bnQyLmFkZHJlc3MsXG4gICAgICAgICAgICBhbW91bnQ6ICcxMDAwMCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgICBjb25zdCB0eFByZWJ1aWxkID0ge1xuICAgICAgICB0eEhleDogdGVzdERhdGEucmF3VHgudHJhbnNmZXIudW5zaWduZWQsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7IHR4UGFyYW1zLCB0eFByZWJ1aWxkLCB3YWxsZXQ6IHt9IGFzIGFueSB9KTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsIHRydWUpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
703
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyaWZ5VHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdmVyaWZ5VHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxtQ0FBa0M7QUFDbEMsOENBQTBEO0FBQzFELDRDQUEwQztBQUMxQyxnRUFBa0Q7QUFDbEQsb0RBQTRCO0FBQzVCLDZCQUE4QjtBQUM5Qiw2Q0FBK0I7QUFDL0IsOENBQWlEO0FBRWpELFFBQVEsQ0FBQyw4QkFBOEIsRUFBRTtJQUN2QyxJQUFJLEtBQW1CLENBQUM7SUFDeEIsSUFBSSxRQUFlLENBQUM7SUFFcEIsTUFBTSxDQUFDO1FBQ0wsS0FBSyxHQUFHLG9CQUFTLENBQUMsUUFBUSxDQUFDLGtCQUFRLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN0RCxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxXQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDbEQsS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDM0IsUUFBUSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFVLENBQUM7SUFDMUMsQ0FBQyxDQUFDLENBQUM7SUFFSCxTQUFTLENBQUM7UUFDUixLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDaEIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xCLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLHNCQUFzQixFQUFFLEdBQUcsRUFBRTtRQUNwQyxFQUFFLENBQUMsNkNBQTZDLEVBQUUsS0FBSztZQUNyRCxNQUFNLFVBQVUsR0FBRztnQkFDakIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQVE7YUFDeEMsQ0FBQztZQUVGLE1BQU0sZ0JBQU0sQ0FBQyxPQUFPLENBQ2xCLFFBQVEs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eUUsRUFBRSxLQUFLO1lBQ2pGLE1BQU0sUUFBUSxHQUFHO2dCQUNmLFVBQVUsRUFBRTtvQkFDVjt3QkFDRSxPQUFPLEVBQUUsUUFBUSxDQUFDLGFBQWEsQ0FBQyxXQUFXO3dCQUMzQyxNQUFNLEVBQUUsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNO3FCQUN0QztpQkFDRjthQUNGLENBQUM7WUFDRixNQUFNLFVBQVUsR0FBRztnQkFDakIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSzthQUNwQyxDQUFDO1lBRUYsTUFBTSxnQkFBTSxDQUFDLE9BQU8sQ0FDbEIsUUFBUSxDQUFDLGlCQUFpQixDQUFDO2dCQUN6QixRQUFRO2dCQUNSLFVBQVU7Z0JBQ1YsTUFBTSxFQUFFLFNBQWdCO2dCQUN4QixZQUFZLEVBQUU7b0JBQ1osMEJBQTBCLEVBQUUsSUFBSTtpQkFDakM7YUFDRixDQUFDLEVBQ0Y7Z0JBQ0UsT0FBTyxFQUFFLG9EQUFvRDthQUM5RCxDQUNGLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUYWxnbyB9IGZyb20gJy4uLy4uL3NyYyc7XG5pbXBvcnQgeyBUZXN0Qml0R28sIFRlc3RCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby9zZGstdGVzdCc7XG5pbXBvcnQgeyBCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby9zZGstYXBpJztcbmltcG9ydCAqIGFzIHRlc3REYXRhIGZyb20gJy4uL2ZpeHR1cmVzL3Jlc291cmNlcyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgbm9jayA9IHJlcXVpcmUoJ25vY2snKTtcbmltcG9ydCAqIGFzIHNpbm9uIGZyb20gJ3Npbm9uJztcbmltcG9ydCB7IGNvbW1vbiwgV2FsbGV0IH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcblxuZGVzY3JpYmUoJ0FsZ29yYW5kIFZlcmlmeSBUcmFuc2FjdGlvbjonLCBmdW5jdGlvbiAoKSB7XG4gIGxldCBiaXRnbzogVGVzdEJpdEdvQVBJO1xuICBsZXQgYmFzZWNvaW46IFRhbGdvO1xuXG4gIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgYml0Z28gPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R29BUEksIHsgZW52OiAnbW9jaycgfSk7XG4gICAgYml0Z28uc2FmZVJlZ2lzdGVyKCd0YWxnbycsIFRhbGdvLmNyZWF0ZUluc3RhbmNlKTtcbiAgICBiaXRnby5pbml0aWFsaXplVGVzdFZhcnMoKTtcbiAgICBiYXNlY29pbiA9IGJpdGdvLmNvaW4oJ3RhbGdvJykgYXMgVGFsZ287XG4gIH0pO1xuXG4gIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgc2lub24ucmVzdG9yZSgpO1xuICAgIG5vY2suY2xlYW5BbGwoKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1BhcmFtZXRlciBWYWxpZGF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3Igd2hlbiB0eFBhcmFtcyBpcyBtaXNzaW5nJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgdHhIZXg6IHRlc3REYXRhLnJhd1R4LnRyYW5zZmVyLnVuc2lnbmVkLFxuICAgICAgfTtcblxuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAgIGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICB0eFByZWJ1aWxkLFxuICAgICAgICAgIHdhbGxldDoge30gYXMgYW55LFxuICAgICAgICAgIHR4UGFyYW1zOiB1bmRlZmluZWQgYXMgYW55LFxuICAgICAgICB9KSxcbiAgICAgICAge1xuICAgICAgICAgIG1lc3NhZ2U6ICdtaXNzaW5nIHR4UGFyYW1zJyxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3Igd2hlbiB0eFByZWJ1aWxkIGlzIG1pc3NpbmcnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eFBhcmFtcyA9IHtcbiAgICAgICAgcmVjaXBpZW50czogW3sgYWRkcmVzczogdGVzdERhdGEuYWNjb3VudHMuYWNjb3VudDIuYWRkcmVzcywgYW1vdW50OiAnMTAwMDAnIH1dLFxuICAgICAgfTtcblxuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAgIGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICB0eFBhcmFtcyxcbiAgICAgICAgICB3YWxsZXQ6IHt9IGFzIGFueSxcbiAgICAgICAgICB0eFByZWJ1aWxkOiB1bmRlZmluZWQgYXMgYW55LFxuICAgICAgICB9KSxcbiAgICAgICAge1xuICAgICAgICAgIG1lc3NhZ2U6ICdtaXNzaW5nIHR4UHJlYnVpbGQnLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciB3aGVuIHR4UHJlYnVpbGQudHhIZXggaXMgbWlzc2luZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4UGFyYW1zID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbeyBhZGRyZXNzOiB0ZXN0RGF0YS5hY2NvdW50cy5hY2NvdW50Mi5hZGRyZXNzLCBhbW91bnQ6ICcxMDAwMCcgfV0sXG4gICAgICB9O1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHt9O1xuXG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7IHR4UGFyYW1zLCB0eFByZWJ1aWxkLCB3YWxsZXQ6IHt9IGFzIGFueSB9KSwge1xuICAgICAgICBtZXNzYWdlOiAnbWlzc2luZyB0eEhleCBpbiB0eFByZWJ1aWxkJyxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUGF5bWVudCBUcmFuc2FjdGlvbiBWYWxpZGF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgdmFsaWQgcGF5bWVudCB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4UGFyYW1zID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuYWNjb3VudHMuYWNjb3VudDIuYWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogJzEwMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHR4UHJlYnVpbGQgPSB7XG4gICAgICAgIHR4SGV4OiB0ZXN0RGF0YS5yYXdUeC50cmFuc2Zlci51bnNpZ25lZCxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHsgdHhQYXJhbXMsIHR4UHJlYnVpbGQsIHdhbGxldDoge30gYXMgYW55IH0pO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgd2l0aCBhbW91bnQgbWlzbWF0Y2gnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eFBhcmFtcyA9IHtcbiAgICAgICAgcmVjaXBpZW50czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLmFjY291bnRzLmFjY291bnQyLmFkZHJlc3MsXG4gICAgICAgICAgICBhbW91bnQ6ICcyMDAwMCcsIC8vIERpZmZlcmVudCBhbW91bnQgdGhhbiBpbiB0aGUgdHJhbnNhY3Rpb25cbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHR4UHJlYnVpbGQgPSB7XG4gICAgICAgIHR4SGV4OiB0ZXN0RGF0YS5yYXdUeC50cmFuc2Zlci51bnNpZ25lZCxcbiAgICAgIH07XG5cbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHsgdHhQYXJhbXMsIHR4UHJlYnVpbGQsIHdhbGxldDoge30gYXMgYW55IH0pLCB7XG4gICAgICAgIG1lc3NhZ2U6ICd0cmFuc2FjdGlvbiBhbW91bnQgaW4gdHhQcmVidWlsZCBkb2VzIG5vdCBtYXRjaCB0aGUgdmFsdWUgZ2l2ZW4gYnkgY2xpZW50JyxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHdpdGggYWRkcmVzcyBtaXNtYXRjaCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4UGFyYW1zID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuYWNjb3VudHMuYWNjb3VudDMuYWRkcmVzcywgLy8gRGlmZmVyZW50IGFkZHJlc3MgdGhhbiBpbiB0cmFuc2FjdGlvblxuICAgICAgICAgICAgYW1vdW50OiAnMTAwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgdHhIZXg6IHRlc3REYXRhLnJhd1R4LnRyYW5zZmVyLnVuc2lnbmVkLFxuICAgICAgfTtcblxuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oeyB0eFBhcmFtcywgdHhQcmVidWlsZCwgd2FsbGV0OiB7fSBhcyBhbnkgfSksIHtcbiAgICAgICAgbWVzc2FnZTogJ2Rlc3RpbmF0aW9uIGFkZHJlc3MgZG9lcyBub3QgbWF0Y2ggd2l0aCB0aGUgcmVjaXBpZW50IGFkZHJlc3MnLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgd2l0aCBtdWx0aXBsZSByZWNpcGllbnRzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhQYXJhbXMgPSB7XG4gICAgICAgIHJlY2lwaWVudHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5hY2NvdW50cy5hY2NvdW50Mi5hZGRyZXNzLFxuICAgICAgICAgICAgYW1vdW50OiAnNTAwMCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5hY2NvdW50cy5hY2NvdW50My5hZGRyZXNzLFxuICAgICAgICAgICAgYW1vdW50OiAnNTAwMCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgICBjb25zdCB0eFByZWJ1aWxkID0ge1xuICAgICAgICB0eEhleDogdGVzdERhdGEucmF3VHgudHJhbnNmZXIudW5zaWduZWQsXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7IHR4UGFyYW1zLCB0eFByZWJ1aWxkLCB3YWxsZXQ6IHt9IGFzIGFueSB9KSwge1xuICAgICAgICBtZXNzYWdlOiAnQWxnb3JhbmQgdHJhbnNhY3Rpb25zIGNhbiBvbmx5IGhhdmUgb25lIHJlY2lwaWVudCcsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgdHJhbnNhY3Rpb24gd2l0aG91dCByZWNpcGllbnRzIGluIHR4UGFyYW1zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhQYXJhbXMgPSB7XG4gICAgICAgIC8vIE5vIHJlY2lwaWVudHMgc3BlY2lmaWVkXG4gICAgICB9O1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgdHhIZXg6IHRlc3REYXRhLnJhd1R4LnRyYW5zZmVyLnVuc2lnbmVkLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oeyB0eFBhcmFtcywgdHhQcmVidWlsZCwgd2FsbGV0OiB7fSBhcyBhbnkgfSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCB0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0Fzc2V0IFRyYW5zZmVyIFRyYW5zYWN0aW9uIFZhbGlkYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSB2YWxpZCBhc3NldCB0cmFuc2ZlciB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4UGFyYW1zID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuYWNjb3VudHMuYWNjb3VudDIuYWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogJzEwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgdHhIZXg6IHRlc3REYXRhLnJhd1R4LmFzc2V0VHJhbnNmZXIudW5zaWduZWQsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7IHR4UGFyYW1zLCB0eFByZWJ1aWxkLCB3YWxsZXQ6IHt9IGFzIGFueSB9KTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsIHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSB0b2tlbiBlbmFibGUgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eFBhcmFtcyA9IHtcbiAgICAgICAgdHlwZTogJ2VuYWJsZXRva2VuJyxcbiAgICAgICAgcmVjaXBpZW50czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLmFjY291bnRzLmFjY291bnQxLmFkZHJlc3MsXG4gICAgICAgICAgICBhbW91bnQ6ICcwJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHR4UHJlYnVpbGQgPSB7XG4gICAgICAgIC8vIFVzaW5nIGV4aXN0aW5nIGFzc2V0IHRyYW5zZmVyIGZvciB0ZXN0IC0gaW4gcmVhbCBzY2VuYXJpbyB0aGlzIHdvdWxkIGJlIGFuIG9wdC1pbiB0cmFuc2FjdGlvblxuICAgICAgICB0eEhleDogdGVzdERhdGEucmF3VHguYXNzZXRUcmFuc2Zlci51bnNpZ25lZCxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHsgdHhQYXJhbXMsIHR4UHJlYnVpbGQsIHdhbGxldDoge30gYXMgYW55IH0pO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgdHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdUcmFuc2FjdGlvbiBTdHJ1Y3R1cmUgVmFsaWRhdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBtYWxmb3JtZWQgdHJhbnNhY3Rpb24gaGV4IGdyYWNlZnVsbHknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eFBhcmFtcyA9IHtcbiAgICAgICAgcmVjaXBpZW50czogW3sgYWRkcmVzczogdGVzdERhdGEuYWNjb3VudHMuYWNjb3VudDIuYWRkcmVzcywgYW1vdW50OiAnMTAwMDAnIH1dLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHR4UHJlYnVpbGQgPSB7XG4gICAgICAgIHR4SGV4OiAnaW52YWxpZF9oZXhfZGF0YScsXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7IHR4UGFyYW1zLCB0eFByZWJ1aWxkLCB3YWxsZXQ6IHt9IGFzIGFueSB9KSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIHRyYW5zYWN0aW9uIHdpdGggbWVtbycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4UGFyYW1zID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuYWNjb3VudHMuYWNjb3VudDIuYWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogJzEwMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHR4UHJlYnVpbGQgPSB7XG4gICAgICAgIHR4SGV4OiB0ZXN0RGF0YS5yYXdUeC50cmFuc2Zlci51bnNpZ25lZCwgLy8gVGhpcyB0cmFuc2FjdGlvbiBpbmNsdWRlcyBhIG1lbW9cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHsgdHhQYXJhbXMsIHR4UHJlYnVpbGQsIHdhbGxldDoge30gYXMgYW55IH0pO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgdHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdFZGdlIENhc2VzJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgaGFuZGxlIHplcm8gYW1vdW50IHRyYW5zYWN0aW9ucycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4UGFyYW1zID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuYWNjb3VudHMuYWNjb3VudDEuYWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogJzAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgLy8gVGhpcyB3b3VsZCBuZWVkIHRvIGJlIGEgdmFsaWQgMC1hbW91bnQgdHJhbnNhY3Rpb24gaGV4XG4gICAgICAgIHR4SGV4OiB0ZXN0RGF0YS5yYXdUeC50cmFuc2Zlci51bnNpZ25lZCxcbiAgICAgIH07XG5cbiAgICAgIC8vIE5vdGU6IFRoaXMgbWlnaHQgZmFpbCBpZiB0aGUgdGVzdCBkYXRhIGRvZXNuJ3QgbWF0Y2ggdGhlIGV4cGVjdGVkIGFtb3VudFxuICAgICAgLy8gSW4gYSByZWFsIHNjZW5hcmlvLCB3ZSdkIG5lZWQgcHJvcGVyIHRlc3QgZGF0YSBmb3IgMC1hbW91bnQgdHJhbnNhY3Rpb25zXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7IHR4UGFyYW1zLCB0eFByZWJ1aWxkLCB3YWxsZXQ6IHt9IGFzIGFueSB9KTtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgdHJ1ZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBFeHBlY3RlZCBpZiBhbW91bnRzIGRvbid0IG1hdGNoXG4gICAgICAgIGFzc2VydC5vayhlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdhbW91bnQnKSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBjbG9zZSByZW1haW5kZXIgdHJhbnNhY3Rpb25zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhQYXJhbXMgPSB7XG4gICAgICAgIHJlY2lwaWVudHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5hY2NvdW50cy5hY2NvdW50My5hZGRyZXNzLFxuICAgICAgICAgICAgYW1vdW50OiAnMTAwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgdHhIZXg6IHRlc3REYXRhLnJhd1R4LnRyYW5zZmVyLnVuc2lnbmVkLFxuICAgICAgfTtcblxuICAgICAgLy8gVGhpcyB0ZXN0IHZhbGlkYXRlcyB0aGF0IHRyYW5zYWN0aW9ucyB3aXRoIGNsb3NlUmVtYWluZGVyVG8gZmllbGQgYXJlIGhhbmRsZWRcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHsgdHhQYXJhbXMsIHR4UHJlYnVpbGQsIHdhbGxldDoge30gYXMgYW55IH0pO1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCB0cnVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIEV4cGVjdGVkIGlmIGFkZHJlc3NlcyBkb24ndCBtYXRjaFxuICAgICAgICBhc3NlcnQub2soZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnYWRkcmVzcycpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ05ldHdvcmsgVmFsaWRhdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIHRyYW5zYWN0aW9ucyBmb3IgZGlmZmVyZW50IG5ldHdvcmtzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gVGVzdCB0aGF0IHRyYW5zYWN0aW9ucyB3b3JrIHJlZ2FyZGxlc3Mgb2YgZ2VuZXNpcyBoYXNoL0lEXG4gICAgICBjb25zdCB0eFBhcmFtcyA9IHtcbiAgICAgICAgcmVjaXBpZW50czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLmFjY291bnRzLmFjY291bnQyLmFkZHJlc3MsXG4gICAgICAgICAgICBhbW91bnQ6ICcxMDAwMCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgICBjb25zdCB0eFByZWJ1aWxkID0ge1xuICAgICAgICB0eEhleDogdGVzdERhdGEucmF3VHgudHJhbnNmZXIudW5zaWduZWQsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7IHR4UGFyYW1zLCB0eFByZWJ1aWxkLCB3YWxsZXQ6IHt9IGFzIGFueSB9KTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsIHRydWUpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnQ29uc29saWRhdGlvbiBWZXJpZmljYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB2ZXJpZnkgY29uc29saWRhdGlvbiB0aHJvdWdoIHNlbmRBY2NvdW50Q29uc29saWRhdGlvbnMgd2l0aCBub2NrIC0gcG9zaXRpdmUgY2FzZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGF0IHNlbmRBY2NvdW50Q29uc29saWRhdGlvbnMgYWxsb3dzIHZhbGlkIGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb25zXG4gICAgICAvLyBJdCBjYWxscyB2ZXJpZnlUcmFuc2FjdGlvbiwgd2hpY2ggc2hvdWxkIHBhc3Mgd2hlbiB0aGUgdHggc2VuZHMgdG8gdGhlIGNvcnJlY3Qgcm9vdEFkZHJlc3NcbiAgICAgIGNvbnN0IHdhbGxldERhdGEgPSB7XG4gICAgICAgIGlkOiAnNjQzNDM4NGYxZGViNTIwMDA3MDM0NTExMWNiYTc0MDUnLFxuICAgICAgICBjb2luOiAndGFsZ28nLFxuICAgICAgICBrZXlzOiBbXG4gICAgICAgICAgJzY0MzQzODNjNDBhZjI5MDAwNzU3OGZkYjg5YzY5MDI4JyxcbiAgICAgICAgICAnNjQzNDM4M2M5ZTUyNDkwMDA3ZTZmNjlmNTUyM2M4MmUnLFxuICAgICAgICAgICc2NDM0MzgzZTRiNWE0NDAwMDcyODljYWVlYmY3NjIyNScsXG4gICAgICAgIF0sXG4gICAgICAgIGNvaW5TcGVjaWZpYzoge1xuICAgICAgICAgIHJvb3RBZGRyZXNzOiB0ZXN0RGF0YS5jb25zb2xpZGF0aW9uLnJvb3RBZGRyZXNzLCAvLyBDb3JyZWN0IHJvb3RBZGRyZXNzXG4gICAgICAgICAgYWRkcmVzc1ZlcnNpb246IDEsXG4gICAgICAgICAgdHJ1c3RlZFRva2VuczogW10sXG4gICAgICAgIH0sXG4gICAgICAgIG11bHRpc2lnVHlwZTogJ29uY2hhaW4nIGFzIGNvbnN0LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgY29uc29saWRhdGlvblR4ID0ge1xuICAgICAgICB0eEhleDogdGVzdERhdGEuY29uc29saWRhdGlvbi50eEhleCwgLy8gU2VuZHMgdG8gcm9vdEFkZHJlc3NcbiAgICAgICAgdHhIYXNoOiB0ZXN0RGF0YS5jb25zb2xpZGF0aW9uLnR4SWQsXG4gICAgICAgIGZlZUluZm86IHtcbiAgICAgICAgICBzaXplOiAyNDcsXG4gICAgICAgICAgZmVlOiAxMDAwLFxuICAgICAgICAgIGZlZVJhdGU6IDQsXG4gICAgICAgICAgZmVlU3RyaW5nOiAnMTAwMCcsXG4gICAgICAgIH0sXG4gICAgICAgIGtleXM6IFtcbiAgICAgICAgICAnNDJNSVlMMktCSVNWNldKUkFMVFRTWEhCRUdMTkY3TU1RNzRGR1NZVUNUNVlQM1YyS0VOSkdSRlZWUScsXG4gICAgICAgICAgJ01BR1haVERGVzVRRVhVS09VRElHSFRYT0tEVzdUTlFFRExXUEJFWkVMM1ZGVTNZQUEyUEdZUlM2NU0nLFxuICAgICAgICAgICdJQkhYRTRMNEhDR0pTWEpBQ1FBTTZaVTZKSFRMREVRTlZORFoyNVRKVlg1VzQzQjNBUVJNQjRWRURVJyxcbiAgICAgICAgXSxcbiAgICAgICAgYWRkcmVzc1ZlcnNpb246IDEsXG4gICAgICAgIGNvbnNvbGlkYXRlSWQ6ICc2OTA1NzJiZDYxZjBhNDY5NWRkODcxMGFlNmMxODVjYycsXG4gICAgICAgIGNvaW46ICd0YWxnbycsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBiZ1VybCA9IGNvbW1vbi5FbnZpcm9ubWVudHNbJ21vY2snXS51cmk7XG4gICAgICBjb25zdCB3YWxsZXRPYmogPSBuZXcgV2FsbGV0KGJpdGdvLCBiYXNlY29pbiwgd2FsbGV0RGF0YSk7XG5cbiAgICAgIC8vIE1vY2sgdGhlIGNvbnNvbGlkYXRlQWNjb3VudC9idWlsZCBBUEkgY2FsbFxuICAgICAgbm9jayhiZ1VybClcbiAgICAgICAgLnBvc3QoJy9hcGkvdjIvdGFsZ28vd2FsbGV0LzY0MzQzODRmMWRlYjUyMDAwNzAzNDUxMTFjYmE3NDA1L2NvbnNvbGlkYXRlQWNjb3VudC9idWlsZCcpXG4gICAgICAgIC5yZXBseSgyMDAsIFtjb25zb2xpZGF0aW9uVHhdKTtcblxuICAgICAgLy8gTW9jayBnZXRLZXljaGFpbnNBbmRWYWxpZGF0ZVBhc3NwaHJhc2VcbiAgICAgIHNpbm9uLnN0dWIod2FsbGV0T2JqLCAnZ2V0S2V5Y2hhaW5zQW5kVmFsaWRhdGVQYXNzcGhyYXNlJyBhcyBrZXlvZiBXYWxsZXQpLnJlc29sdmVzKFtdKTtcblxuICAgICAgLy8gVGhlIGtleSB0ZXN0OiBzaG91bGQgTk9UIHRocm93IHRoZSBjb25zb2xpZGF0aW9uIHZlcmlmaWNhdGlvbiBlcnJvclxuICAgICAgLy8gYmVjYXVzZSB0aGUgdHJhbnNhY3Rpb24gc2VuZHMgdG8gdGhlIGNvcnJlY3Qgcm9vdEFkZHJlc3NcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHdhbGxldE9iai5zZW5kQWNjb3VudENvbnNvbGlkYXRpb25zKHsgd2FsbGV0UGFzc3BocmFzZTogJ3Rlc3QnIH0pO1xuICAgICAgICAvLyBJZiB3ZSBnZXQgaGVyZSB3aXRob3V0IHRocm93aW5nLCB0aGUgdmVyaWZpY2F0aW9uIHBhc3NlZFxuICAgICAgICBhc3NlcnQub2sodHJ1ZSwgJ0NvbnNvbGlkYXRpb24gdmVyaWZpY2F0aW9uIHBhc3NlZCAtIG5vIGVycm9yIHRocm93bicpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gSWYgYW4gZXJyb3IgaXMgdGhyb3duLCBpdCBzaG91bGQgTk9UIGJlIHRoZSBjb25zb2xpZGF0aW9uIG1pc21hdGNoIGVycm9yXG4gICAgICAgIC8vIChvdGhlciBlcnJvcnMgbGlrZSBzaWduaW5nIGVycm9ycyBhcmUgb2theSBzaW5jZSB3ZSdyZSBub3QgZnVsbHkgbW9ja2luZyBldmVyeXRoaW5nKVxuICAgICAgICBpZiAoZXJyb3IubWVzc2FnZSA9PT0gJ0NvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb24gcmVjaXBpZW50IGRvZXMgbm90IG1hdGNoIHdhbGxldCBiYXNlIGFkZHJlc3MnKSB7XG4gICAgICAgICAgYXNzZXJ0LmZhaWwoJ1Nob3VsZCBub3QgdGhyb3cgY29uc29saWRhdGlvbiB2ZXJpZmljYXRpb24gZXJyb3IgZm9yIHZhbGlkIHRyYW5zYWN0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gT3RoZXIgZXJyb3JzIGFyZSBhY2NlcHRhYmxlIGluIHRoaXMgdGVzdCAoZS5nLiwgaW5jb21wbGV0ZSBtb2NraW5nIG9mIHNpZ25pbmcpXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBtYWxpY2lvdXMgY29uc29saWRhdGlvbiB0aHJvdWdoIHNlbmRBY2NvdW50Q29uc29saWRhdGlvbnMgd2l0aCBub2NrJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gVGhpcyB0ZXN0IHZlcmlmaWVzIHRoYXQgc2VuZEFjY291bnRDb25zb2xpZGF0aW9ucyByZWplY3RzIG1hbGljaW91cyB0cmFuc2FjdGlvbnNcbiAgICAgIC8vIFdlIHVzZSBhIHdhbGxldCBjb25maWd1cmVkIHdpdGggdGhlIFdST05HIHJvb3RBZGRyZXNzIHRvIHNpbXVsYXRlIGEgbWlzbWF0Y2hcbiAgICAgIGNvbnN0IHdhbGxldERhdGEgPSB7XG4gICAgICAgIGlkOiAnNjQzNDM4NGYxZGViNTIwMDA3MDM0NTExMWNiYTc0MDUnLFxuICAgICAgICBjb2luOiAndGFsZ28nLFxuICAgICAgICBrZXlzOiBbXG4gICAgICAgICAgJzY0MzQzODNjNDBhZjI5MDAwNzU3OGZkYjg5YzY5MDI4JyxcbiAgICAgICAgICAnNjQzNDM4M2M5ZTUyNDkwMDA3ZTZmNjlmNTUyM2M4MmUnLFxuICAgICAgICAgICc2NDM0MzgzZTRiNWE0NDAwMDcyODljYWVlYmY3NjIyNScsXG4gICAgICAgIF0sXG4gICAgICAgIGNvaW5TcGVjaWZpYzoge1xuICAgICAgICAgIHJvb3RBZGRyZXNzOiB0ZXN0RGF0YS5jb25zb2xpZGF0aW9uLnJlY2VpdmVBZGRyZXNzLCAvLyBXUk9ORzogbm90IHdoZXJlIHRoZSB0eCBzZW5kc1xuICAgICAgICAgIGFkZHJlc3NWZXJzaW9uOiAxLFxuICAgICAgICAgIHRydXN0ZWRUb2tlbnM6IFtdLFxuICAgICAgICB9LFxuICAgICAgICBtdWx0aXNpZ1R5cGU6ICdvbmNoYWluJyBhcyBjb25zdCxcbiAgICAgIH07XG5cbiAgICAgIC8vIFRoZSB0eEhleCBzZW5kcyB0byB0ZXN0RGF0YS5jb25zb2xpZGF0aW9uLnJvb3RBZGRyZXNzLCBidXQgd2FsbGV0IGV4cGVjdHMgcmVjZWl2ZUFkZHJlc3NcbiAgICAgIGNvbnN0IGNvbnNvbGlkYXRpb25UeCA9IHtcbiAgICAgICAgdHhIZXg6IHRlc3REYXRhLmNvbnNvbGlkYXRpb24udHhIZXgsIC8vIFNlbmRzIHRvIHJvb3RBZGRyZXNzIChub3QgcmVjZWl2ZUFkZHJlc3MpXG4gICAgICAgIHR4SGFzaDogdGVzdERhdGEuY29uc29saWRhdGlvbi50eElkLFxuICAgICAgICBmZWVJbmZvOiB7XG4gICAgICAgICAgc2l6ZTogMjQ3LFxuICAgICAgICAgIGZlZTogMTAwMCxcbiAgICAgICAgICBmZWVSYXRlOiA0LFxuICAgICAgICAgIGZlZVN0cmluZzogJzEwMDAnLFxuICAgICAgICB9LFxuICAgICAgICBrZXlzOiBbXG4gICAgICAgICAgJzQyTUlZTDJLQklTVjZXSlJBTFRUU1hIQkVHTE5GN01NUTc0RkdTWVVDVDVZUDNWMktFTkpHUkZWVlEnLFxuICAgICAgICAgICdNQUdYWlRERlc1UUVYVUtPVURJR0hUWE9LRFc3VE5RRURMV1BCRVpFTDNWRlUzWUFBMlBHWVJTNjVNJyxcbiAgICAgICAgICAnSUJIWEU0TDRIQ0dKU1hKQUNRQU02WlU2SkhUTERFUU5WTkRaMjVUSlZYNVc0M0IzQVFSTUI0VkVEVScsXG4gICAgICAgIF0sXG4gICAgICAgIGFkZHJlc3NWZXJzaW9uOiAxLFxuICAgICAgICBjb25zb2xpZGF0ZUlkOiAnNjkwNTcyYmQ2MWYwYTQ2OTVkZDg3MTBhZTZjMTg1Y2MnLFxuICAgICAgICBjb2luOiAndGFsZ28nLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgYmdVcmwgPSBjb21tb24uRW52aXJvbm1lbnRzWydtb2NrJ10udXJpO1xuICAgICAgY29uc3Qgd2FsbGV0T2JqID0gbmV3IFdhbGxldChiaXRnbywgYmFzZWNvaW4sIHdhbGxldERhdGEpO1xuXG4gICAgICAvLyBNb2NrIHRoZSBjb25zb2xpZGF0ZUFjY291bnQvYnVpbGQgQVBJIGNhbGxcbiAgICAgIG5vY2soYmdVcmwpXG4gICAgICAgIC5wb3N0KCcvYXBpL3YyL3RhbGdvL3dhbGxldC82NDM0Mzg0ZjFkZWI1MjAwMDcwMzQ1MTExY2JhNzQwNS9jb25zb2xpZGF0ZUFjY291bnQvYnVpbGQnKVxuICAgICAgICAucmVwbHkoMjAwLCBbY29uc29saWRhdGlvblR4XSk7XG5cbiAgICAgIC8vIE1vY2sgZ2V0S2V5Y2hhaW5zQW5kVmFsaWRhdGVQYXNzcGhyYXNlXG4gICAgICBzaW5vbi5zdHViKHdhbGxldE9iaiwgJ2dldEtleWNoYWluc0FuZFZhbGlkYXRlUGFzc3BocmFzZScgYXMgYW55KS5yZXNvbHZlcyhbXSk7XG5cbiAgICAgIC8vIFRoZSB2ZXJpZmljYXRpb24gc2hvdWxkIGNhdGNoIHRoaXMgYW5kIHRocm93IGFuIGVycm9yIEJFRk9SRSBzaWduaW5nL3NlbmRpbmdcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKHdhbGxldE9iai5zZW5kQWNjb3VudENvbnNvbGlkYXRpb25zKHsgd2FsbGV0UGFzc3BocmFzZTogJ3Rlc3QnIH0pLCAoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChlcnJvci5tZXNzYWdlLCAnQ29uc29saWRhdGlvbiB0cmFuc2FjdGlvbiByZWNpcGllbnQgZG9lcyBub3QgbWF0Y2ggd2FsbGV0IGJhc2UgYWRkcmVzcycpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2ZXJpZnkgY29uc29saWRhdGlvbiBmbG93IGFzIGNhbGxlZCBmcm9tIHNlbmRBY2NvdW50Q29uc29saWRhdGlvbnMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBUaGlzIHRlc3Qgc2ltdWxhdGVzIGhvdyBzZW5kQWNjb3VudENvbnNvbGlkYXRpb25zIGNhbGxzIHZlcmlmeVRyYW5zYWN0aW9uXG4gICAgICAvLyBJdCB1c2VzIHRoZSByZWFsIGNvbnNvbGlkYXRpb24gZGF0YSBhbmQgbWltaWNzIHRoZSB3YWxsZXQgc3RydWN0dXJlXG4gICAgICBjb25zdCBtb2NrV2FsbGV0ID0ge1xuICAgICAgICBfd2FsbGV0OiB7XG4gICAgICAgICAgY29pblNwZWNpZmljOiB7XG4gICAgICAgICAgICByb290QWRkcmVzczogdGVzdERhdGEuY29uc29saWRhdGlvbi5yb290QWRkcmVzcyxcbiAgICAgICAgICAgIGFkZHJlc3NWZXJzaW9uOiAxLFxuICAgICAgICAgICAgdHJ1c3RlZFRva2VuczogW10sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtdWx0aXNpZ1R5cGU6ICdvbmNoYWluJyxcbiAgICAgICAgfSxcbiAgICAgICAgY29pblNwZWNpZmljOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3dhbGxldC5jb2luU3BlY2lmaWM7XG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICAvLyBUaGlzIGlzIHRoZSBidWlsZCByZXN1bHQgZnJvbSBidWlsZEFjY291bnRDb25zb2xpZGF0aW9uc1xuICAgICAgY29uc3QgYnVpbGQgPSB7XG4gICAgICAgIHR4SGV4OiB0ZXN0RGF0YS5jb25zb2xpZGF0aW9uLnR4SGV4LFxuICAgICAgICBjb25zb2xpZGF0ZUlkOiAnNjkwNTcyYmQ2MWYwYTQ2OTVkZDg3MTBhZTZjMTg1Y2MnLFxuICAgICAgICBjb2luOiAndGFsZ28nLFxuICAgICAgfTtcblxuICAgICAgLy8gVGhpcyBpcyB3aGF0IHNlbmRBY2NvdW50Q29uc29saWRhdGlvbnMgZG9lczogdmVyaWZ5IHdpdGggY29uc29saWRhdGlvblRvQmFzZUFkZHJlc3NcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhQcmVidWlsZDogYnVpbGQsXG4gICAgICAgIHR4UGFyYW1zOiB7fSwgLy8gc2VuZEFjY291bnRDb25zb2xpZGF0aW9ucyBwYXNzZXMgZW1wdHkgcGFyYW1zIGZyb20gdGhlIGJ1aWxkIGNhbGxcbiAgICAgICAgdmVyaWZpY2F0aW9uOiB7XG4gICAgICAgICAgY29uc29saWRhdGlvblRvQmFzZUFkZHJlc3M6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIHdhbGxldDogbW9ja1dhbGxldCBhcyBhbnksXG4gICAgICAgIHdhbGxldFR5cGU6IG1vY2tXYWxsZXQuX3dhbGxldC5tdWx0aXNpZ1R5cGUgYXMgYW55LFxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsIHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgbWFsaWNpb3VzIGNvbnNvbGlkYXRpb24gd2l0aCB3cm9uZyByZWNpcGllbnQgaW4gc2VuZEFjY291bnRDb25zb2xpZGF0aW9ucyBmbG93JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gVGhpcyB0ZXN0IHNpbXVsYXRlcyBhIG1hbGljaW91cyB0cmFuc2FjdGlvbiB0aGF0IHRyaWVzIHRvIHNlbmQgdG8gYSBkaWZmZXJlbnQgYWRkcmVzc1xuICAgICAgLy8gVGhlIHZlcmlmaWNhdGlvbiBzaG91bGQgY2F0Y2ggdGhpcyBhbmQgdGhyb3cgYW4gZXJyb3JcbiAgICAgIGNvbnN0IG1vY2tXYWxsZXQgPSB7XG4gICAgICAgIF93YWxsZXQ6IHtcbiAgICAgICAgICBjb2luU3BlY2lmaWM6IHtcbiAgICAgICAgICAgIHJvb3RBZGRyZXNzOiB0ZXN0RGF0YS5jb25zb2xpZGF0aW9uLnJlY2VpdmVBZGRyZXNzLCAvLyBXUk9ORzogVGhpcyBpcyBub3Qgd2hlcmUgdGhlIHR4IGlzIHNlbmRpbmdcbiAgICAgICAgICAgIGFkZHJlc3NWZXJzaW9uOiAxLFxuICAgICAgICAgICAgdHJ1c3RlZFRva2VuczogW10sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtdWx0aXNpZ1R5cGU6ICdvbmNoYWluJyxcbiAgICAgICAgfSxcbiAgICAgICAgY29pblNwZWNpZmljOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3dhbGxldC5jb2luU3BlY2lmaWM7XG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBidWlsZCA9IHtcbiAgICAgICAgdHhIZXg6IHRlc3REYXRhLmNvbnNvbGlkYXRpb24udHhIZXgsIC8vIFRoaXMgc2VuZHMgdG8gcm9vdEFkZHJlc3MsIG5vdCByZWNlaXZlQWRkcmVzc1xuICAgICAgICBjb25zb2xpZGF0ZUlkOiAnNjkwNTcyYmQ2MWYwYTQ2OTVkZDg3MTBhZTZjMTg1Y2MnLFxuICAgICAgICBjb2luOiAndGFsZ28nLFxuICAgICAgfTtcblxuICAgICAgLy8gVGhpcyBzaG91bGQgdGhyb3cgYmVjYXVzZSB0aGUgdHJhbnNhY3Rpb24gcmVjaXBpZW50IGRvZXNuJ3QgbWF0Y2ggdGhlIHdhbGxldCdzIHJvb3RBZGRyZXNzXG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhcbiAgICAgICAgYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICAgIHR4UHJlYnVpbGQ6IGJ1aWxkLFxuICAgICAgICAgIHR4UGFyYW1zOiB7fSxcbiAgICAgICAgICB2ZXJpZmljYXRpb246IHtcbiAgICAgICAgICAgIGNvbnNvbGlkYXRpb25Ub0Jhc2VBZGRyZXNzOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgd2FsbGV0OiBtb2NrV2FsbGV0IGFzIGFueSxcbiAgICAgICAgICB3YWxsZXRUeXBlOiBtb2NrV2FsbGV0Ll93YWxsZXQubXVsdGlzaWdUeXBlIGFzIGFueSxcbiAgICAgICAgfSksXG4gICAgICAgIHtcbiAgICAgICAgICBtZXNzYWdlOiAnQ29uc29saWRhdGlvbiB0cmFuc2FjdGlvbiByZWNpcGllbnQgZG9lcyBub3QgbWF0Y2ggd2FsbGV0IGJhc2UgYWRkcmVzcycsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZlcmlmeSByZWFsIGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb24gd2l0aCB2YWxpZCByb290QWRkcmVzcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFVzaW5nIHJlYWwgY29uc29saWRhdGlvbiB0cmFuc2FjdGlvbiBkYXRhIGZyb20gYWN0dWFsIHdhbGxldFxuICAgICAgY29uc3QgbW9ja1dhbGxldCA9IHtcbiAgICAgICAgY29pblNwZWNpZmljOiAoKSA9PiAoe1xuICAgICAgICAgIHJvb3RBZGRyZXNzOiB0ZXN0RGF0YS5jb25zb2xpZGF0aW9uLnJvb3RBZGRyZXNzLFxuICAgICAgICB9KSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHR4UGFyYW1zID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuY29uc29saWRhdGlvbi5yb290QWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogdGVzdERhdGEuY29uc29saWRhdGlvbi5hbW91bnQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgICBjb25zdCB0eFByZWJ1aWxkID0ge1xuICAgICAgICB0eEhleDogdGVzdERhdGEuY29uc29saWRhdGlvbi50eEhleCxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhQYXJhbXMsXG4gICAgICAgIHR4UHJlYnVpbGQsXG4gICAgICAgIHdhbGxldDogbW9ja1dhbGxldCBhcyBhbnksXG4gICAgICAgIHZlcmlmaWNhdGlvbjoge1xuICAgICAgICAgIGNvbnNvbGlkYXRpb25Ub0Jhc2VBZGRyZXNzOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGNvbnNvbGlkYXRpb24gd2hlbiByZWNpcGllbnQgZG9lcyBub3QgbWF0Y2ggcm9vdEFkZHJlc3MnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBVc2luZyBkaWZmZXJlbnQgcm9vdEFkZHJlc3MgdGhhbiB3aGF0J3MgaW4gdGhlIGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb25cbiAgICAgIGNvbnN0IG1vY2tXYWxsZXQgPSB7XG4gICAgICAgIGNvaW5TcGVjaWZpYzogKCkgPT4gKHtcbiAgICAgICAgICByb290QWRkcmVzczogdGVzdERhdGEuY29uc29saWRhdGlvbi5yZWNlaXZlQWRkcmVzcywgLy8gV3Jvbmc6IHVzaW5nIHJlY2VpdmUgYWRkcmVzcyBpbnN0ZWFkIG9mIHJvb3RcbiAgICAgICAgfSksXG4gICAgICB9O1xuXG4gICAgICBjb25zdCB0eFBhcmFtcyA9IHtcbiAgICAgICAgcmVjaXBpZW50czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLmNvbnNvbGlkYXRpb24ucm9vdEFkZHJlc3MsXG4gICAgICAgICAgICBhbW91bnQ6IHRlc3REYXRhLmNvbnNvbGlkYXRpb24uYW1vdW50LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgdHhIZXg6IHRlc3REYXRhLmNvbnNvbGlkYXRpb24udHhIZXgsXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhcbiAgICAgICAgYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICAgIHR4UGFyYW1zLFxuICAgICAgICAgIHR4UHJlYnVpbGQsXG4gICAgICAgICAgd2FsbGV0OiBtb2NrV2FsbGV0IGFzIGFueSxcbiAgICAgICAgICB2ZXJpZmljYXRpb246IHtcbiAgICAgICAgICAgIGNvbnNvbGlkYXRpb25Ub0Jhc2VBZGRyZXNzOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgICB7XG4gICAgICAgICAgbWVzc2FnZTogJ0NvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb24gcmVjaXBpZW50IGRvZXMgbm90IG1hdGNoIHdhbGxldCBiYXNlIGFkZHJlc3MnLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgbWlzc2luZyByb290QWRkcmVzcyBpbiB3YWxsZXQgY29pblNwZWNpZmljJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbW9ja1dhbGxldCA9IHtcbiAgICAgICAgY29pblNwZWNpZmljOiAoKSA9PiAoe30pLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgdHhQYXJhbXMgPSB7XG4gICAgICAgIHJlY2lwaWVudHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5jb25zb2xpZGF0aW9uLnJvb3RBZGRyZXNzLFxuICAgICAgICAgICAgYW1vdW50OiB0ZXN0RGF0YS5jb25zb2xpZGF0aW9uLmFtb3VudCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHR4UHJlYnVpbGQgPSB7XG4gICAgICAgIHR4SGV4OiB0ZXN0RGF0YS5jb25zb2xpZGF0aW9uLnR4SGV4LFxuICAgICAgfTtcblxuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAgIGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICB0eFBhcmFtcyxcbiAgICAgICAgICB0eFByZWJ1aWxkLFxuICAgICAgICAgIHdhbGxldDogbW9ja1dhbGxldCBhcyBhbnksXG4gICAgICAgICAgdmVyaWZpY2F0aW9uOiB7XG4gICAgICAgICAgICBjb25zb2xpZGF0aW9uVG9CYXNlQWRkcmVzczogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgICAge1xuICAgICAgICAgIG1lc3NhZ2U6ICdVbmFibGUgdG8gZGV0ZXJtaW5lIGJhc2UgYWRkcmVzcyBmb3IgY29uc29saWRhdGlvbicsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBjb25zb2xpZGF0aW9uIHZlcmlmaWNhdGlvbiBmb3IgdG9rZW4gdHJhbnNmZXJzIChheGZlciknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBVc2luZyBhc3NldCB0cmFuc2ZlciB0cmFuc2FjdGlvbiB0byByb290IGFkZHJlc3NcbiAgICAgIGNvbnN0IHJvb3RBZGRyZXNzID0gdGVzdERhdGEuYWNjb3VudHMuYWNjb3VudDIuYWRkcmVzcztcbiAgICAgIGNvbnN0IG1vY2tXYWxsZXQgPSB7XG4gICAgICAgIGNvaW5TcGVjaWZpYzogKCkgPT4gKHtcbiAgICAgICAgICByb290QWRkcmVzczogcm9vdEFkZHJlc3MsXG4gICAgICAgIH0pLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgdHhQYXJhbXMgPSB7XG4gICAgICAgIHJlY2lwaWVudHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiByb290QWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogJzEwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgdHhIZXg6IHRlc3REYXRhLnJhd1R4LmFzc2V0VHJhbnNmZXIudW5zaWduZWQsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UGFyYW1zLFxuICAgICAgICB0eFByZWJ1aWxkLFxuICAgICAgICB3YWxsZXQ6IG1vY2tXYWxsZXQgYXMgYW55LFxuICAgICAgICB2ZXJpZmljYXRpb246IHtcbiAgICAgICAgICBjb25zb2xpZGF0aW9uVG9CYXNlQWRkcmVzczogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBjb25zb2xpZGF0aW9uIGZvciB0b2tlbiB0cmFuc2ZlciB3aGVuIHJlY2lwaWVudCBkb2VzIG5vdCBtYXRjaCByb290QWRkcmVzcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJvb3RBZGRyZXNzID0gdGVzdERhdGEuYWNjb3VudHMuYWNjb3VudDEuYWRkcmVzczsgLy8gRGlmZmVyZW50IGZyb20gdHJhbnNhY3Rpb24gcmVjaXBpZW50XG4gICAgICBjb25zdCBtb2NrV2FsbGV0ID0ge1xuICAgICAgICBjb2luU3BlY2lmaWM6ICgpID0+ICh7XG4gICAgICAgICAgcm9vdEFkZHJlc3M6IHJvb3RBZGRyZXNzLFxuICAgICAgICB9KSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHR4UGFyYW1zID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuYWNjb3VudHMuYWNjb3VudDIuYWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogJzEwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgdHhIZXg6IHRlc3REYXRhLnJhd1R4LmFzc2V0VHJhbnNmZXIudW5zaWduZWQsXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhcbiAgICAgICAgYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICAgIHR4UGFyYW1zLFxuICAgICAgICAgIHR4UHJlYnVpbGQsXG4gICAgICAgICAgd2FsbGV0OiBtb2NrV2FsbGV0IGFzIGFueSxcbiAgICAgICAgICB2ZXJpZmljYXRpb246IHtcbiAgICAgICAgICAgIGNvbnNvbGlkYXRpb25Ub0Jhc2VBZGRyZXNzOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgICB7XG4gICAgICAgICAgbWVzc2FnZTogJ0NvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb24gcmVjaXBpZW50IGRvZXMgbm90IG1hdGNoIHdhbGxldCBiYXNlIGFkZHJlc3MnLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwYXNzIHZlcmlmaWNhdGlvbiB3aGVuIGNvbnNvbGlkYXRpb25Ub0Jhc2VBZGRyZXNzIGlzIG5vdCBzZXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBVc2luZyByZWFsIGNvbnNvbGlkYXRpb24gdHggYnV0IHdpdGggd3Jvbmcgcm9vdEFkZHJlc3MgLSBzaG91bGQgc3RpbGwgcGFzcyBiZWNhdXNlIHZlcmlmaWNhdGlvbiBpcyBkaXNhYmxlZFxuICAgICAgY29uc3QgbW9ja1dhbGxldCA9IHtcbiAgICAgICAgY29pblNwZWNpZmljOiAoKSA9PiAoe1xuICAgICAgICAgIHJvb3RBZGRyZXNzOiB0ZXN0RGF0YS5jb25zb2xpZGF0aW9uLnJlY2VpdmVBZGRyZXNzLCAvLyBEaWZmZXJlbnQgZnJvbSB0cmFuc2FjdGlvbiByZWNpcGllbnRcbiAgICAgICAgfSksXG4gICAgICB9O1xuXG4gICAgICBjb25zdCB0eFBhcmFtcyA9IHtcbiAgICAgICAgcmVjaXBpZW50czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLmNvbnNvbGlkYXRpb24ucm9vdEFkZHJlc3MsXG4gICAgICAgICAgICBhbW91bnQ6IHRlc3REYXRhLmNvbnNvbGlkYXRpb24uYW1vdW50LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgdHhIZXg6IHRlc3REYXRhLmNvbnNvbGlkYXRpb24udHhIZXgsXG4gICAgICB9O1xuXG4gICAgICAvLyBTaG91bGQgbm90IHRocm93IGVycm9yIGV2ZW4gdGhvdWdoIHJlY2lwaWVudCBkb2Vzbid0IG1hdGNoIHJvb3RBZGRyZXNzXG4gICAgICAvLyBiZWNhdXNlIGNvbnNvbGlkYXRpb25Ub0Jhc2VBZGRyZXNzIHZlcmlmaWNhdGlvbiBpcyBub3QgZW5hYmxlZFxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFBhcmFtcyxcbiAgICAgICAgdHhQcmVidWlsZCxcbiAgICAgICAgd2FsbGV0OiBtb2NrV2FsbGV0IGFzIGFueSxcbiAgICAgICAgdmVyaWZpY2F0aW9uOiB7XG4gICAgICAgICAgY29uc29saWRhdGlvblRvQmFzZUFkZHJlc3M6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcGFzcyB2ZXJpZmljYXRpb24gd2hlbiB2ZXJpZmljYXRpb24gb2JqZWN0IGlzIG5vdCBwcm92aWRlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFVzaW5nIHJlYWwgY29uc29saWRhdGlvbiB0eCBidXQgd2l0aCB3cm9uZyByb290QWRkcmVzcyAtIHNob3VsZCBzdGlsbCBwYXNzIGJlY2F1c2Ugbm8gdmVyaWZpY2F0aW9uXG4gICAgICBjb25zdCBtb2NrV2FsbGV0ID0ge1xuICAgICAgICBjb2luU3BlY2lmaWM6ICgpID0+ICh7XG4gICAgICAgICAgcm9vdEFkZHJlc3M6IHRlc3REYXRhLmNvbnNvbGlkYXRpb24ucmVjZWl2ZUFkZHJlc3MsIC8vIERpZmZlcmVudCBmcm9tIHRyYW5zYWN0aW9uIHJlY2lwaWVudFxuICAgICAgICB9KSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHR4UGFyYW1zID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuY29uc29saWRhdGlvbi5yb290QWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogdGVzdERhdGEuY29uc29saWRhdGlvbi5hbW91bnQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgICBjb25zdCB0eFByZWJ1aWxkID0ge1xuICAgICAgICB0eEhleDogdGVzdERhdGEuY29uc29saWRhdGlvbi50eEhleCxcbiAgICAgIH07XG5cbiAgICAgIC8vIFNob3VsZCBub3QgdGhyb3cgZXJyb3IgZXZlbiB0aG91Z2ggcmVjaXBpZW50IGRvZXNuJ3QgbWF0Y2ggcm9vdEFkZHJlc3NcbiAgICAgIC8vIGJlY2F1c2Ugbm8gdmVyaWZpY2F0aW9uIG9iamVjdCBpcyBwcm92aWRlZFxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFBhcmFtcyxcbiAgICAgICAgdHhQcmVidWlsZCxcbiAgICAgICAgd2FsbGV0OiBtb2NrV2FsbGV0IGFzIGFueSxcbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBtaXNzaW5nIHdhbGxldCB3aGVuIGNvbnNvbGlkYXRpb24gdmVyaWZpY2F0aW9uIGlzIGVuYWJsZWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eFBhcmFtcyA9IHtcbiAgICAgICAgcmVjaXBpZW50czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLmNvbnNvbGlkYXRpb24ucm9vdEFkZHJlc3MsXG4gICAgICAgICAgICBhbW91bnQ6IHRlc3REYXRhLmNvbnNvbGlkYXRpb24uYW1vdW50LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgdHhIZXg6IHRlc3REYXRhLmNvbnNvbGlkYXRpb24udHhIZXgsXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhcbiAgICAgICAgYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICAgIHR4UGFyYW1zLFxuICAgICAgICAgIHR4UHJlYnVpbGQsXG4gICAgICAgICAgd2FsbGV0OiB1bmRlZmluZWQgYXMgYW55LFxuICAgICAgICAgIHZlcmlmaWNhdGlvbjoge1xuICAgICAgICAgICAgY29uc29saWRhdGlvblRvQmFzZUFkZHJlc3M6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICAgIHtcbiAgICAgICAgICBtZXNzYWdlOiAnVW5hYmxlIHRvIGRldGVybWluZSBiYXNlIGFkZHJlc3MgZm9yIGNvbnNvbGlkYXRpb24nLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19